shishi-1.0.2/0000755000000000000000000000000012126773324007757 500000000000000shishi-1.0.2/GNUmakefile0000644000000000000000000001073512126660051011747 00000000000000# Having a separate GNUmakefile lets me 'include' the dynamically # generated rules created via cfg.mk (package-local configuration) # as well as maint.mk (generic maintainer rules). # This makefile is used only if you run GNU Make. # It is necessary if you want to build targets usually of interest # only to the maintainer. # Copyright (C) 2001, 2003, 2006-2013 Free Software Foundation, Inc. # 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 . # If the user runs GNU make but has not yet run ./configure, # give them a diagnostic. _gl-Makefile := $(wildcard [M]akefile) ifneq ($(_gl-Makefile),) # Make tar archive easier to reproduce. export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner # Allow the user to add to this in the Makefile. ALL_RECURSIVE_TARGETS = include Makefile # Some projects override e.g., _autoreconf here. -include $(srcdir)/cfg.mk # Allow cfg.mk to override these. _build-aux ?= build-aux _autoreconf ?= autoreconf -v include $(srcdir)/maint.mk # Ensure that $(VERSION) is up to date for dist-related targets, but not # for others: rerunning autoreconf and recompiling everything isn't cheap. _have-git-version-gen := \ $(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes) ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL)) _is-dist-target ?= $(filter-out %clean, \ $(filter maintainer-% dist% alpha beta stable,$(MAKECMDGOALS))) _is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS))) ifneq (,$(_is-dist-target)$(_is-install-target)) _curr-ver := $(shell cd $(srcdir) \ && $(_build-aux)/git-version-gen \ .tarball-version \ $(git-version-gen-tag-sed-script)) ifneq ($(_curr-ver),$(VERSION)) ifeq ($(_curr-ver),UNKNOWN) $(info WARNING: unable to verify if $(VERSION) is the correct version) else ifneq (,$(_is-install-target)) # GNU Coding Standards state that 'make install' should not cause # recompilation after 'make all'. But as long as changing the version # string alters config.h, the cost of having 'make all' always have an # up-to-date version is prohibitive. So, as a compromise, we merely # warn when installing a version string that is out of date; the user # should run 'autoreconf' (or something like 'make distcheck') to # fix the version, 'make all' to propagate it, then 'make install'. $(info WARNING: version string $(VERSION) is out of date;) $(info run '$(MAKE) _version' to fix it) else $(info INFO: running autoreconf for new version string: $(_curr-ver)) GNUmakefile: _version touch GNUmakefile endif endif endif endif endif .PHONY: _version _version: cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf) $(MAKE) $(AM_MAKEFLAGS) Makefile else .DEFAULT_GOAL := abort-due-to-no-makefile srcdir = . # The package can override .DEFAULT_GOAL to run actions like autoreconf. -include ./cfg.mk # Allow cfg.mk to override these. _build-aux ?= build-aux _autoreconf ?= autoreconf -v include ./maint.mk ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile) $(MAKECMDGOALS): abort-due-to-no-makefile endif abort-due-to-no-makefile: @echo There seems to be no Makefile in this directory. 1>&2 @echo "You must run ./configure before running 'make'." 1>&2 @exit 1 endif # Tell version 3.79 and up of GNU make to not build goals in this # directory in parallel, in case someone tries to build multiple # targets, and one of them can cause a recursive target to be invoked. # Only set this if Automake doesn't provide it. AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) \ dist distcheck tags ctags ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS) ifneq ($(word 2, $(MAKECMDGOALS)), ) ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), ) .NOTPARALLEL: endif endif shishi-1.0.2/README0000664000000000000000000000275312126766062010571 00000000000000Shishi README -- Important introductory notes. Copyright (C) 2002-2013 Simon Josefsson See the end for copying conditions. This directory holds Shishi, an implementation of the RFC 1510/4120 network authentication system. Shishi is part of the GNU system. See doc/shishi.{info,ps,pdf} for the manual. Installation instructions are found in the INSTALL file in this directory. The library, applications and self tests (lib/, db/, src/, tests/) are licensed under the GNU General Public License license version 3 or later (see COPYING), and the documentation (doc/) is licensed under the GNU Free Documentation License version 1.3 or later. Third party files (e.g., gl/) are distributed here for convenience, and they have their own respective licenses, typically the (L)GPL. For updates to the project, see . If you need help to use Shishi, or wish to help others, you are invited to join our mailing list help-shishi@gnu.org, see . Report bugs to bug-shishi@gnu.org, but please read the section "Bug reports" in the manual first. For any copyright year range specified as YYYY-ZZZZ in this package note that the range specifies every single year in that closed interval. ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/shishi.pc.in0000664000000000000000000000134012126660507012115 00000000000000# Process this file with autoconf to produce a pkg-config metadata file. # Copyright 2002-2013 Simon Josefsson # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This file is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Shishi Description: Implementation of RFC 1510(bis). Version: @VERSION@ Libs: -L${libdir} -lshishi Cflags: -I${includedir} shishi-1.0.2/build-aux/0000755000000000000000000000000012126773313011647 500000000000000shishi-1.0.2/build-aux/gendocs.sh0000755000000000000000000003745112126660051013554 00000000000000#!/bin/sh -e # gendocs.sh -- generate a GNU manual in many formats. This script is # mentioned in maintain.texi. See the help message below for usage details. scriptversion=2013-03-08.15 # Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 # Free Software Foundation, Inc. # # 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 . # # Original author: Mohit Agarwal. # Send bug reports and any other correspondence to bug-texinfo@gnu.org. # # The latest version of this script, and the companion template, is # available from Texinfo CVS: # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template # # An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib). # TODO: # - image importation was only implemented for HTML generated by # makeinfo. But it should be simple enough to adjust. # - images are not imported in the source tarball. All the needed # formats (PDF, PNG, etc.) should be included. prog=`basename "$0"` srcdir=`pwd` scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh" templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template" : ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="} : ${MAKEINFO="makeinfo"} : ${TEXI2DVI="texi2dvi -t @finalout"} : ${DOCBOOK2HTML="docbook2html"} : ${DOCBOOK2PDF="docbook2pdf"} : ${DOCBOOK2TXT="docbook2txt"} : ${GENDOCS_TEMPLATE_DIR="."} : ${PERL='perl'} : ${TEXI2HTML="texi2html"} unset CDPATH unset use_texi2html version="gendocs.sh $scriptversion Copyright 2013 Free Software Foundation, Inc. There is NO warranty. You may redistribute this software under the terms of the GNU General Public License. For more information about these matters, see the files named COPYING." usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE Generate output in various formats from PACKAGE.texinfo (or .texi or .txi) source. See the GNU Maintainers document for a more extensive discussion: http://www.gnu.org/prep/maintain_toc.html Options: --email ADR use ADR as contact in generated web pages; always give this. -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi} -o OUTDIR write files into OUTDIR, instead of manual/. -I DIR append DIR to the Texinfo search path. --common ARG pass ARG in all invocations. --html ARG pass ARG to makeinfo or texi2html for HTML targets. --info ARG pass ARG to makeinfo for Info, instead of --no-split. --no-ascii skip generating the plain text output. --source ARG include ARG in tar archive of sources. --split HOW make split HTML by node, section, chapter; default node. --texi2html use texi2html to make HTML target, with all split versions. --docbook convert through DocBook too (xml, txt, html, pdf). --help display this help and exit successfully. --version display version information and exit successfully. Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\" Typical sequence: cd PACKAGESOURCE/doc wget \"$scripturl\" wget \"$templateurl\" $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\" Output will be in a new subdirectory \"manual\" (by default; use -o OUTDIR to override). Move all the new files into your web CVS tree, as explained in the Web Pages node of maintain.texi. Please use the --email ADDRESS option so your own bug-reporting address will be used in the generated HTML pages. MANUAL-TITLE is included as part of the HTML of the overall manual/index.html file. It should include the name of the package being documented. manual/index.html is created by substitution from the file $GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the generic template for your own purposes.) If you have several manuals, you'll need to run this script several times with different MANUAL values, specifying a different output directory with -o each time. Then write (by hand) an overall index.html with links to them all. If a manual's Texinfo sources are spread across several directories, first copy or symlink all Texinfo sources into a single directory. (Part of the script's work is to make a tar.gz of the sources.) As implied above, by default monolithic Info files are generated. If you want split Info, or other Info options, use --info to override. You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML, and PERL to control the programs that get executed, and GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is looked for. With --docbook, the environment variables DOCBOOK2HTML, DOCBOOK2PDF, and DOCBOOK2TXT are also consulted. By default, makeinfo and texi2dvi are run in the default (English) locale, since that's the language of most Texinfo manuals. If you happen to have a non-English manual and non-English web site, see the SETLANG setting in the source. Email bug reports or enhancement requests to bug-texinfo@gnu.org. " MANUAL_TITLE= PACKAGE= EMAIL=webmasters@gnu.org # please override with --email commonarg= # passed to all makeinfo/texi2html invcations. dirargs= # passed to all tools (-I dir). dirs= # -I's directories. htmlarg= infoarg=--no-split generate_ascii=true outdir=manual source_extra= split=node srcfile= while test $# -gt 0; do case $1 in -s) shift; srcfile=$1;; -o) shift; outdir=$1;; -I) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";; --common) shift; commonarg=$1;; --docbook) docbook=yes;; --email) shift; EMAIL=$1;; --html) shift; htmlarg=$1;; --info) shift; infoarg=$1;; --no-ascii) generate_ascii=false;; --source) shift; source_extra=$1;; --split) shift; split=$1;; --texi2html) use_texi2html=1;; --help) echo "$usage"; exit 0;; --version) echo "$version"; exit 0;; -*) echo "$0: Unknown option \`$1'." >&2 echo "$0: Try \`--help' for more information." >&2 exit 1;; *) if test -z "$PACKAGE"; then PACKAGE=$1 elif test -z "$MANUAL_TITLE"; then MANUAL_TITLE=$1 else echo "$0: extra non-option argument \`$1'." >&2 exit 1 fi;; esac shift done # makeinfo uses the dirargs, but texi2dvi doesn't. commonarg=" $dirargs $commonarg" # For most of the following, the base name is just $PACKAGE base=$PACKAGE if test -n "$srcfile"; then # but here, we use the basename of $srcfile base=`basename "$srcfile"` case $base in *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;; esac PACKAGE=$base elif test -s "$srcdir/$PACKAGE.texinfo"; then srcfile=$srcdir/$PACKAGE.texinfo elif test -s "$srcdir/$PACKAGE.texi"; then srcfile=$srcdir/$PACKAGE.texi elif test -s "$srcdir/$PACKAGE.txi"; then srcfile=$srcdir/$PACKAGE.txi else echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2 exit 1 fi if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2 echo "$0: it is available from $templateurl." >&2 exit 1 fi # Function to return size of $1 in something resembling kilobytes. calcsize() { size=`ls -ksl $1 | awk '{print $1}'` echo $size } # copy_images OUTDIR HTML-FILE... # ------------------------------- # Copy all the images needed by the HTML-FILEs into OUTDIR. Look # for them in the -I directories. copy_images() { local odir odir=$1 shift $PERL -n -e " BEGIN { \$me = '$prog'; \$odir = '$odir'; @dirs = qw($dirs); } " -e ' /<img src="(.*?)"/g && ++$need{$1}; END { #print "$me: @{[keys %need]}\n"; # for debugging, show images found. FILE: for my $f (keys %need) { for my $d (@dirs) { if (-f "$d/$f") { use File::Basename; my $dest = dirname ("$odir/$f"); # use File::Path; -d $dest || mkpath ($dest) || die "$me: cannot mkdir $dest: $!\n"; # use File::Copy; copy ("$d/$f", $dest) || die "$me: cannot copy $d/$f to $dest: $!\n"; next FILE; } } die "$me: $ARGV: cannot find image $f\n"; } } ' -- "$@" || exit 1 } case $outdir in /*) abs_outdir=$outdir;; *) abs_outdir=$srcdir/$outdir;; esac echo "Making output for $srcfile" echo " in `pwd`" mkdir -p "$outdir/" cmd="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\"" echo "Generating info... ($cmd)" eval "$cmd" tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info* ls -l "$outdir/$PACKAGE.info.tar.gz" info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"` # do not mv the info files, there's no point in having them available # separately on the web. cmd="$SETLANG $TEXI2DVI $dirargs \"$srcfile\"" printf "\nGenerating dvi... ($cmd)\n" eval "$cmd" # compress/finish dvi: gzip -f -9 $PACKAGE.dvi dvi_gz_size=`calcsize $PACKAGE.dvi.gz` mv $PACKAGE.dvi.gz "$outdir/" ls -l "$outdir/$PACKAGE.dvi.gz" cmd="$SETLANG $TEXI2DVI --pdf $dirargs \"$srcfile\"" printf "\nGenerating pdf... ($cmd)\n" eval "$cmd" pdf_size=`calcsize $PACKAGE.pdf` mv $PACKAGE.pdf "$outdir/" ls -l "$outdir/$PACKAGE.pdf" if $generate_ascii; then opt="-o $PACKAGE.txt --no-split --no-headers $commonarg" cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" printf "\nGenerating ascii... ($cmd)\n" eval "$cmd" ascii_size=`calcsize $PACKAGE.txt` gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz" ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"` mv $PACKAGE.txt "$outdir/" ls -l "$outdir/$PACKAGE.txt" "$outdir/$PACKAGE.txt.gz" fi # Split HTML at level $1. Used for texi2html. html_split() { opt="--split=$1 --node-files $commonarg $htmlarg" cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\"" printf "\nGenerating html by $1... ($cmd)\n" eval "$cmd" split_html_dir=$PACKAGE.html ( cd ${split_html_dir} || exit 1 ln -sf ${PACKAGE}.html index.html tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html ) eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"` rm -f "$outdir"/html_$1/*.html mkdir -p "$outdir/html_$1/" mv ${split_html_dir}/*.html "$outdir/html_$1/" rmdir ${split_html_dir} } if test -z "$use_texi2html"; then opt="--no-split --html -o $PACKAGE.html $commonarg $htmlarg" cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" printf "\nGenerating monolithic html... ($cmd)\n" rm -rf $PACKAGE.html # in case a directory is left over eval "$cmd" html_mono_size=`calcsize $PACKAGE.html` gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` copy_images "$outdir/" $PACKAGE.html mv $PACKAGE.html "$outdir/" ls -l "$outdir/$PACKAGE.html" "$outdir/$PACKAGE.html.gz" # Before Texinfo 5.0, makeinfo did not accept a --split=HOW option, # it just always split by node. So if we're splitting by node anyway, # leave it out. if test "x$split" = xnode; then split_arg= else split_arg=--split=$split fi # opt="--html -o $PACKAGE.html $split_arg $commonarg $htmlarg" cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" printf "\nGenerating html by $split... ($cmd)\n" eval "$cmd" split_html_dir=$PACKAGE.html copy_images $split_html_dir/ $split_html_dir/*.html ( cd $split_html_dir || exit 1 tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- * ) eval \ html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"` rm -rf "$outdir/html_$split/" mv $split_html_dir "$outdir/html_$split/" du -s "$outdir/html_$split/" ls -l "$outdir/$PACKAGE.html_$split.tar.gz" else # use texi2html: opt="--output $PACKAGE.html $commonarg $htmlarg" cmd="$SETLANG $TEXI2HTML $opt \"$srcfile\"" printf "\nGenerating monolithic html with texi2html... ($cmd)\n" rm -rf $PACKAGE.html # in case a directory is left over eval "$cmd" html_mono_size=`calcsize $PACKAGE.html` gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` mv $PACKAGE.html "$outdir/" html_split node html_split chapter html_split section fi printf "\nMaking .tar.gz for sources...\n" d=`dirname $srcfile` ( cd "$d" srcfiles=`ls -d *.texinfo *.texi *.txi *.eps $source_extra 2>/dev/null` || true tar czfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles ls -l "$abs_outdir/$PACKAGE.texi.tar.gz" ) texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"` if test -n "$docbook"; then opt="-o - --docbook $commonarg" cmd="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml" printf "\nGenerating docbook XML... ($cmd)\n" eval "$cmd" docbook_xml_size=`calcsize $PACKAGE-db.xml` gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz" docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"` mv $PACKAGE-db.xml "$outdir/" split_html_db_dir=html_node_db opt="$commonarg -o $split_html_db_dir" cmd="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\"" printf "\nGenerating docbook HTML... ($cmd)\n" eval "$cmd" ( cd ${split_html_db_dir} || exit 1 tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html ) html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"` rm -f "$outdir"/html_node_db/*.html mkdir -p "$outdir/html_node_db" mv ${split_html_db_dir}/*.html "$outdir/html_node_db/" rmdir ${split_html_db_dir} cmd="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\"" printf "\nGenerating docbook ASCII... ($cmd)\n" eval "$cmd" docbook_ascii_size=`calcsize $PACKAGE-db.txt` mv $PACKAGE-db.txt "$outdir/" cmd="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\"" printf "\nGenerating docbook PDF... ($cmd)\n" eval "$cmd" docbook_pdf_size=`calcsize $PACKAGE-db.pdf` mv $PACKAGE-db.pdf "$outdir/" fi printf "\nMaking index file...\n" if test -z "$use_texi2html"; then CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\ /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d" else # should take account of --split here. CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d" fi curdate=`$SETLANG date '+%B %d, %Y'` sed \ -e "s!%%TITLE%%!$MANUAL_TITLE!g" \ -e "s!%%EMAIL%%!$EMAIL!g" \ -e "s!%%PACKAGE%%!$PACKAGE!g" \ -e "s!%%DATE%%!$curdate!g" \ -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \ -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \ -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \ -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \ -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \ -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \ -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \ -e "s!%%PDF_SIZE%%!$pdf_size!g" \ -e "s!%%ASCII_SIZE%%!$ascii_size!g" \ -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \ -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \ -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \ -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \ -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \ -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \ -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \ -e "s,%%SCRIPTURL%%,$scripturl,g" \ -e "s!%%SCRIPTNAME%%!$prog!g" \ -e "$CONDS" \ $GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html" echo "Done, see $outdir/ subdirectory for new files." # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������shishi-1.0.2/build-aux/ltmain.sh��������������������������������������������������������������������0000644�0000000�0000000�00001052026�12126772707�013423� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to <bug-libtool@gnu.org>. # GNU libtool home page: <http://www.gnu.org/software/libtool/>. # General help using GNU software: <http://www.gnu.org/gethelp/>. PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T <<EOF # $write_libobj - a libtool object file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # Name of the PIC object. pic_object=$write_lobj # Name of the non-PIC object non_pic_object=$write_oldobj EOF $MV "${write_libobj}T" "${write_libobj}" } } ################################################## # FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # ################################################## # func_convert_core_file_wine_to_w32 ARG # Helper function used by file name conversion functions when $build is *nix, # and $host is mingw, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. # # ARG is the $build file name to be converted to w32 format. # Result is available in $func_convert_core_file_wine_to_w32_result, and will # be empty on error (or when ARG is empty) func_convert_core_file_wine_to_w32 () { $opt_debug func_convert_core_file_wine_to_w32_result="$1" if test -n "$1"; then # Unfortunately, winepath does not exit with a non-zero error code, so we # are forced to check the contents of stdout. On the other hand, if the # command is not found, the shell will set an exit code of 127 and print # *an error message* to stdout. So we must check for both error code of # zero AND non-empty stdout, which explains the odd construction: func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen <import library>. $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 </dev/null >/dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat <<EOF /* $cwrappersource - temporary wrapper executable for $objdir/$outputname Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION The $output program cannot be directly executed until all the libtool libraries that it depends on are installed. This wrapper executable should never be moved out of the build directory. If it is, it will not operate correctly. */ EOF cat <<"EOF" #ifdef _MSC_VER # define _CRT_SECURE_NO_DEPRECATE 1 #endif #include <stdio.h> #include <stdlib.h> #ifdef _MSC_VER # include <direct.h> # include <process.h> # include <io.h> #else # include <unistd.h> # include <stdint.h> # ifdef __CYGWIN__ # include <io.h> # endif #endif #include <malloc.h> #include <stdarg.h> #include <assert.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <sys/stat.h> /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <<EOF volatile const char * MAGIC_EXE = "$magic_exe"; const char * LIB_PATH_VARNAME = "$shlibpath_var"; EOF if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then func_to_host_path "$temp_rpath" cat <<EOF const char * LIB_PATH_VALUE = "$func_to_host_path_result"; EOF else cat <<"EOF" const char * LIB_PATH_VALUE = ""; EOF fi if test -n "$dllsearchpath"; then func_to_host_path "$dllsearchpath:" cat <<EOF const char * EXE_PATH_VARNAME = "PATH"; const char * EXE_PATH_VALUE = "$func_to_host_path_result"; EOF else cat <<"EOF" const char * EXE_PATH_VARNAME = ""; const char * EXE_PATH_VALUE = ""; EOF fi if test "$fast_install" = yes; then cat <<EOF const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ EOF else cat <<EOF const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ EOF fi cat <<"EOF" #define LTWRAPPER_OPTION_PREFIX "--lt-" static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; int main (int argc, char *argv[]) { char **newargz; int newargc; char *tmp_pathspec; char *actual_cwrapper_path; char *actual_cwrapper_name; char *target_name; char *lt_argv_zero; intptr_t rval = 127; int i; program_name = (char *) xstrdup (base_name (argv[0])); newargz = XMALLOC (char *, argc + 1); /* very simple arg parsing; don't want to rely on getopt * also, copy all non cwrapper options to newargz, except * argz[0], which is handled differently */ newargc=0; for (i = 1; i < argc; i++) { if (strcmp (argv[i], dumpscript_opt) == 0) { EOF case "$host" in *mingw* | *cygwin* ) # make stdout use "unix" line endings echo " setmode(1,_O_BINARY);" ;; esac cat <<"EOF" lt_dump_script (stdout); return 0; } if (strcmp (argv[i], debug_opt) == 0) { lt_debug = 1; continue; } if (strcmp (argv[i], ltwrapper_option_prefix) == 0) { /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX namespace, but it is not one of the ones we know about and have already dealt with, above (inluding dump-script), then report an error. Otherwise, targets might begin to believe they are allowed to use options in the LTWRAPPER_OPTION_PREFIX namespace. The first time any user complains about this, we'll need to make LTWRAPPER_OPTION_PREFIX a configure-time option or a configure.ac-settable value. */ lt_fatal (__FILE__, __LINE__, "unrecognized %s option: '%s'", ltwrapper_option_prefix, argv[i]); } /* otherwise ... */ newargz[++newargc] = xstrdup (argv[i]); } newargz[++newargc] = NULL; EOF cat <<EOF /* The GNU banner must be the first non-error debug message */ lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n"); EOF cat <<"EOF" lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); tmp_pathspec = find_executable (argv[0]); if (tmp_pathspec == NULL) lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); lt_debugprintf (__FILE__, __LINE__, "(main) found exe (before symlink chase) at: %s\n", tmp_pathspec); actual_cwrapper_path = chase_symlinks (tmp_pathspec); lt_debugprintf (__FILE__, __LINE__, "(main) found exe (after symlink chase) at: %s\n", actual_cwrapper_path); XFREE (tmp_pathspec); actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); strendzap (actual_cwrapper_path, actual_cwrapper_name); /* wrapper name transforms */ strendzap (actual_cwrapper_name, ".exe"); tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); XFREE (actual_cwrapper_name); actual_cwrapper_name = tmp_pathspec; tmp_pathspec = 0; /* target_name transforms -- use actual target program name; might have lt- prefix */ target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); strendzap (target_name, ".exe"); tmp_pathspec = lt_extend_str (target_name, ".exe", 1); XFREE (target_name); target_name = tmp_pathspec; tmp_pathspec = 0; lt_debugprintf (__FILE__, __LINE__, "(main) libtool target name: %s\n", target_name); EOF cat <<EOF newargz[0] = XMALLOC (char, (strlen (actual_cwrapper_path) + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); strcpy (newargz[0], actual_cwrapper_path); strcat (newargz[0], "$objdir"); strcat (newargz[0], "/"); EOF cat <<"EOF" /* stop here, and copy so we don't have to do this twice */ tmp_pathspec = xstrdup (newargz[0]); /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ strcat (newargz[0], actual_cwrapper_name); /* DO want the lt- prefix here if it exists, so use target_name */ lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); XFREE (tmp_pathspec); tmp_pathspec = NULL; EOF case $host_os in mingw*) cat <<"EOF" { char* p; while ((p = strchr (newargz[0], '\\')) != NULL) { *p = '/'; } while ((p = strchr (lt_argv_zero, '\\')) != NULL) { *p = '/'; } } EOF ;; esac cat <<"EOF" XFREE (target_name); XFREE (actual_cwrapper_path); XFREE (actual_cwrapper_name); lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ lt_setenv ("DUALCASE", "1"); /* for MSK sh */ /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) because on Windows, both *_VARNAMEs are PATH but uninstalled libraries must come first. */ lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", nonnull (lt_argv_zero)); for (i = 0; i < newargc; i++) { lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", i, nonnull (newargz[i])); } EOF case $host_os in mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ newargz = prepare_spawn (newargz); rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ lt_debugprintf (__FILE__, __LINE__, "(main) failed to launch target \"%s\": %s\n", lt_argv_zero, nonnull (strerror (errno))); return 127; } return rval; EOF ;; *) cat <<"EOF" execv (lt_argv_zero, newargz); return rval; /* =127, but avoids unused variable warning */ EOF ;; esac cat <<"EOF" } void * xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) lt_fatal (__FILE__, __LINE__, "memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char) name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable (const char *path) { struct stat st; lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c <<EOF int main() { return 0; } EOF $opt_dry_run || $RM conftest if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then ldd_output=`ldd conftest` for i in $deplibs; do case $i in -l*) func_stripname -l '' "$i" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" i="" ;; esac fi if test -n "$i" ; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then func_append newdeplibs " $i" else droppeddeps=yes echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which I believe you do not have" echo "*** because a test_compile did reveal that the linker did not use it for" echo "*** its dynamic dependency list that programs get resolved with at runtime." fi fi ;; *) func_append newdeplibs " $i" ;; esac done else # Error occurred in the first compile. Let's try to salvage # the situation: Compile a separate program for each library. for i in $deplibs; do case $i in -l*) func_stripname -l '' "$i" name=$func_stripname_result $opt_dry_run || $RM conftest if $LTCC $LTCFLAGS -o conftest conftest.c $i; then ldd_output=`ldd conftest` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" i="" ;; esac fi if test -n "$i" ; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then func_append newdeplibs " $i" else droppeddeps=yes echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because a test_compile did reveal that the linker did not use this one" echo "*** as a dynamic dependency that programs can get resolved with at runtime." fi fi else droppeddeps=yes echo $ECHO "*** Warning! Library $i is needed by this library but I was not able to" echo "*** make it link in! You will probably need to install it or some" echo "*** library that it depends on before this library will be fully" echo "*** functional. Installing it before continuing would be even better." fi ;; *) func_append newdeplibs " $i" ;; esac done fi ;; file_magic*) set dummy $deplibs_check_method; shift file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` if test -n "$file_magic_glob"; then libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` else libnameglob=$libname fi test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do if test "$want_nocaseglob" = yes; then shopt -s nocaseglob potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������shishi-1.0.2/build-aux/pmccabe2html�����������������������������������������������������������������0000644�0000000�0000000�00000060413�12126660051�014051� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pmccabe2html - AWK script to convert pmccabe output to html -*- awk -*- # Copyright (C) 2007-2013 Free Software Foundation, Inc. # 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/>. # Written by Jose E. Marchesi <jemarch@gnu.org>. # Adapted for gnulib by Simon Josefsson <simon@josefsson.org>. # Added support for C++ by Giuseppe Scrivano <gscrivano@gnu.org>. # Typical Invocation is from a Makefile.am: # # CYCLO_SOURCES = ${top_srcdir}/src/*.[ch] # # cyclo-$(PACKAGE).html: $(CYCLO_SOURCES) # $(PMCCABE) $(CYCLO_SOURCES) \ # | sort -nr \ # | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \ # -v lang=html -v name="$(PACKAGE_NAME)" \ # -v vcurl="http://git.savannah.gnu.org/gitweb/?p=$(PACKAGE).git;a=blob;f=%FILENAME%;hb=HEAD" \ # -v url="http://www.gnu.org/software/$(PACKAGE)/" \ # -v css=${top_srcdir}/build-aux/pmccabe.css \ # -v cut_dir=${top_srcdir}/ \ # > $@-tmp # mv $@-tmp $@ # # The variables available are: # lang output language, either 'html' or 'wiki' # name project name # url link to project's home page # vcurl URL to version controlled source code browser, # a %FILENAME% in the string is replaced with the relative # source filename # css CSS stylesheet filename, included verbatim in HTML output # css_url link to CSS stylesheet, an URL # Prologue & configuration BEGIN { section_global_stats_p = 1 section_function_cyclo_p = 1 # "html" or "wiki" package_name = name output_lang = lang # General Options cyclo_simple_max = 10 cyclo_moderate_max = 20 cyclo_high_max = 50 source_file_link_tmpl = vcurl # HTML options if (url != "") { html_prolog = "<a href=\"" url "\">Back to " package_name " Homepage</a><br/><br/>" } html_epilog = "<hr color=\"black\" size=\"2\"/> \ Copyright (c) 2007, 2008 Free Software Foundation, Inc." html_doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \ \"http://www.w3.org/TR/html401/loose.dtd\">" html_comment = "<!-- Generated by gnulib's pmccabe2html at " systime() " -->" html_title = "Cyclomatic Complexity report for " package_name # Wiki options wiki_prolog = "{{Note|This page has been automatically generated}}" wiki_epilog = "" # Internal variables nfuncs = 0; } # Functions function build_stats() { # Maximum modified cyclo for (fcn in mcyclo) { num_of_functions++ if (mcyclo[fcn] > max_mcyclo) { max_mcyclo = mcyclo[fcn] } if (mcyclo[fcn] > cyclo_high_max) { num_of_untestable_functions++ } else if (mcyclo[fcn] > cyclo_moderate_max) { num_of_high_functions++ } else if (mcyclo[fcn] > cyclo_simple_max) { num_of_moderate_functions++ } else { num_of_simple_functions++ } } } function html_fnc_table_complete (caption) { html_fnc_table(caption, 1, 1, 0, 1, 1, 0, 1) } function html_fnc_table_abbrev (caption) { html_fnc_table(caption, 1, 1, 0, 0, 1, 0, 0) } function html_fnc_table (caption, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { print "<table width=\"90%\" class=\"function_table\" cellpadding=\"0\" cellspacing=\"0\">" if (caption != "") { print "<caption class=\"function_table_caption\">" caption "</caption>" } html_fnc_header(fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) for (nfnc = 1; nfnc <= nfuncs; nfnc++) { html_fnc(nfnc, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) } print "</table>" } function html_header () { print html_doctype print "<html>" print html_comment print "<head>" print "<title>" html_title "" print "" print "" print "" print "" print "" print "" print "" print "" if (css_url != "") { print "" } if (css != "") { print "" close(css) } print "" print "" } function html_footer () { print "" print "" } function html_fnc_header (fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { print "" if (fname_p) { # Function name print "" print "" print "" print "" print "Function Name" print "" } if (mcyclo_p) { # Modified cyclo print "" print "Modified Cyclo" print "" } if (cyclo_p) { # Cyclo print "" print "Cyclomatic" print "
" print "Complexity" print "" } if (num_statements_p) { print "" print "Number of" print "
" print "Statements" print "" } if (num_lines_p) { print "" print "Number of" print "
" print "Lines" print "" } if (first_line_p) { print "" print "First Line" print "" } if (file_p) { print "" print "Source File" print "" } print "" } function html_fnc (nfun, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { fname = fnames[nfun] # Function name trclass = "function_entry_simple" if (mcyclo[nfun] > cyclo_high_max) { trclass="function_entry_untestable" } else if (mcyclo[nfun] > cyclo_moderate_max) { trclass="function_entry_high" } else if (mcyclo[nfun] > cyclo_simple_max) { trclass="function_entry_moderate" } print "" if (fname_p) { print "" if (file_p && mcyclo[nfun] > cyclo_simple_max) { print "\ " } else { print " " } print "" print "" print fname print "" } if (mcyclo_p) { # Modified cyclo print "" print mcyclo[nfun] print "" } if (cyclo_p) { # Cyclo print "" print cyclo[nfun] print "" } if (num_statements_p) { # Number of statements print "" print num_statements[nfun] print "" } if (num_lines_p) { # Number of lines print "" print num_lines[nfun] print "" } if (first_line_p) { # First line print "" print first_line[nfun] print "" } if (file_p) { href = "" if (source_file_link_tmpl != "") { # Get href target href = source_file_link_tmpl sub(/%FILENAME%/, file[nfun], href) } # Source file print "" if (href != "") { print "" file[nfun] "" } else { print file[nfun] } print "" print "" if (mcyclo[nfun] > cyclo_simple_max) { print "" num_columns = 1; if (fname_p) { num_columns++ } if (mcyclo_p) { num_columns++ } if (cyclo_p) { num_columns++ } if (num_statements_p) { num_columns++ } if (num_lines_p) { num_columns++ } if (first_line_p) { num_columns++ } if (file_p) { num_columns++ } print "" print "
" print "
"

            while ((getline codeline < (fname nfun "_fn.txt")) > 0)
            {
                sub(/\\/, ">", codeline)
                sub(/&/, "&", codeline)

                print codeline
            }
            close(fname nfun "_fn.txt")
            system("rm " "'" fname "'" nfun "_fn.txt")
            print "
" print "
" print "" print "" } } } function html_global_stats () { print "
Summary
" print "" # Total number of functions print "" print "" print "" print "" # Number of simple functions print "" print "" print "" print "" # Number of moderate functions print "" print "" print "" print "" # Number of high functions print "" print "" print "" print "" # Number of untestable functions print "" print "" print "" print "" print "
" print "Total number of functions" print "" print num_of_functions print "
" print "Number of low risk functions" print "" print num_of_simple_functions print "
" print "Number of moderate risk functions" print "" print num_of_moderate_functions print "
" print "Number of high risk functions" print "" print num_of_high_functions print "
" print "Number of untestable functions" print "" print num_of_untestable_functions print "
" print "
" } function html_function_cyclo () { print "
Details for all functions
" print "" print "" print "" print "" print "" print "" # Simple print "" print "" print "" print "" print "" # Moderate print "" print "" print "" print "" print "" # High print "" print "" print "" print "" print "" # Untestable print "" print "" print "" print "" print "" print "
" print " " print "" print "Cyclomatic Complexity" print "" print "Risk Evaluation" print "
" print " " print "" print "0 - " cyclo_simple_max print "" print "Simple module, without much risk" print "
" print " " print "" print cyclo_simple_max + 1 " - " cyclo_moderate_max print "" print "More complex module, moderate risk" print "
" print " " print "" print cyclo_moderate_max + 1 " - " cyclo_high_max print "" print "Complex module, high risk" print "
" print " " print "" print "greater than " cyclo_high_max print "" print "Untestable module, very high risk" print "
" print "
" html_fnc_table_complete("") } function wiki_global_stats () { print "{| class=\"cyclo_summary_table\"" # Total number of functions print "|-" print "| class=\"cyclo_summary_header_entry\" | Total number of functions" print "| class=\"cyclo_summary_number_entry\" |" num_of_functions # Number of simple functions print "|-" print "| class=\"cyclo_summary_header_entry\" | Number of low risk functions" print "| class=\"cyclo_summary_number_entry\" |" num_of_simple_functions # Number of moderate functions print "|-" print "| class=\"cyclo_summary_header_entry\" | Number of moderate risk functions" print "| class=\"cyclo_summary_number_entry\" |" num_of_moderate_functions # Number of high functions print "|-" print "| class=\"cyclo_summary_header_entry\" | Number of high risk functions" print "| class=\"cyclo_summary_number_entry\" |" num_of_high_functions # Number of untestable functions print "|-" print "| class=\"cyclo_summary_header_entry\" | Number of untestable functions" print "| class=\"cyclo_summary_number_entry\" |" num_of_untestable_functions print "|}" } function wiki_function_cyclo () { print "==Details for all functions==" print "Used ranges:" print "{| class =\"cyclo_ranges_table\"" print "|-" print "| class=\"cyclo_ranges_header_entry\" | " print "| class=\"cyclo_ranges_header_entry\" | Cyclomatic Complexity" print "| class=\"cyclo_ranges_header_entry\" | Risk Evaluation" # Simple print "|-" print "| class=\"cyclo_ranges_entry_simple\" | " print "| class=\"cyclo_ranges_entry\" | 0 - " cyclo_simple_max print "| class=\"cyclo_ranges_entry\" | Simple module, without much risk" # Moderate print "|-" print "| class=\"cyclo_ranges_entry_moderate\" | " print "| class=\"cyclo_ranges_entry\" |" cyclo_simple_max + 1 " - " cyclo_moderate_max print "| class=\"cyclo_ranges_entry\" | More complex module, moderate risk" # High print "|-" print "| class=\"cyclo_ranges_entry_high\" | " print "| class=\"cyclo_ranges_entry\" |" cyclo_moderate_max + 1 " - " cyclo_high_max print "| class=\"cyclo_ranges_entry\" | Complex module, high risk" # Untestable print "|-" print "| class=\"cyclo_ranges_entry_untestable\" | " print "| class=\"cyclo_ranges_entry\" | greater than " cyclo_high_max print "| class=\"cyclo_ranges_entry\" | Untestable module, very high risk" print "|}" print "" print "" wiki_fnc_table_complete("") } function wiki_fnc_table_complete (caption) { wiki_fnc_table(caption, 1, 1, 0, 1, 1, 0, 1) } function wiki_fnc_table_abbrev (caption) { wiki_fnc_table(caption, 1, 0, 0, 0, 0, 0, 0) } function wiki_fnc_table (caption, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { print "{| width=\"90%\" class=\"cyclo_function_table\" cellpadding=\"0\" cellspacing=\"0\">" if (caption != "") { print "|+" caption } wiki_fnc_header(fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) for (nfnc = 1; nfnc <= nfuncs; nfnc++) { wiki_fnc(nfnc, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) } print "|}" } function wiki_fnc_header (fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { if (fname_p) { # Function name print "! class=\"cyclo_function_table_header_entry\" | Function Name" } if (mcyclo_p) { # Modified cyclo print "! class=\"cyclo_function_table_header_entry\" | Modified Cyclo" } if (cyclo_p) { # Cyclo print "! class=\"cyclo_function_table_header_entry\" | Cyclomatic Complexity" } if (num_statements_p) { print "! class=\"cyclo_function_table_header_entry\" | Number of Statements" } if (num_lines_p) { print "! class=\"cyclo_function_table_header_entry\" | Number of Lines" } if (first_line_p) { print "! class=\"cyclo_function_table_header_entry\" | First Line" } if (file_p) { print "! class=\"cyclo_function_table_header_entry\" | Source File" } } function wiki_fnc (nfnc, fname_p, mcyclo_p, cyclo_p, num_statements_p, num_lines_p, first_line_p, file_p) { fname = fnames[nfnc] # Function name trclass = "cyclo_function_entry_simple" if (mcyclo[nfnc] > cyclo_high_max) { trclass="cyclo_function_entry_untestable" } else if (mcyclo[nfnc] > cyclo_moderate_max) { trclass="cyclo_function_entry_high" } else if (mcyclo[nfnc] > cyclo_simple_max) { trclass="cyclo_function_entry_moderate" } print "|- class=\"" trclass "\"" if (fname_p) { print "| class=\"cyclo_function_entry_name\" |" fname } if (mcyclo_p) { # Modified cyclo print "| class=\"cyclo_function_entry_cyclo\" |" mcyclo[nfnc] } if (cyclo_p) { # Cyclo print "| class=\"cyclo_function_entry_cyclo\" |" cyclo[nfnc] } if (num_statements_p) { # Number of statements print "| class=\"cyclo_function_entry_number\" |" num_statements[nfnc] } if (num_lines_p) { # Number of lines print "| class=\"cyclo_function_entry_number\" |" num_lines[nfnc] } if (first_line_p) { # First line print "| class=\"cyclo_function_entry_number\" |" first_line[nfnc] } if (file_p) { href = "" if (source_file_link_tmpl != "") { # Get href target href = source_file_link_tmpl sub(/%FILENAME%/, file[nfnc], href) } # Source file print "| class=\"cyclo_function_entry_filename\" |" \ ((href != "") ? "[" href " " file[nfnc] "]" : "[" file[nfnc] "]") } } # Scan data from a line { function_name = $7 nfuncs++; fnames[nfuncs] = function_name mcyclo[nfuncs] = $1 cyclo[nfuncs] = $2 num_statements[nfuncs] = $3 first_line[nfuncs] = $4 num_lines[nfuncs] = $5 # Build the filename from the file_spec ($6) begin_util_path = index($6, cut_dir) tmpfilename = substr($6, begin_util_path + length(cut_dir)) sub(/\([0-9]+\):/, "", tmpfilename) file[nfuncs] = tmpfilename if (mcyclo[nfuncs] > cyclo_simple_max) { # Extract function contents to a fn_txt file filepath = $6 sub(/\([0-9]+\):/, "", filepath) num_line = 0 while ((getline codeline < filepath) > 0) { num_line++; if ((num_line >= first_line[nfuncs]) && (num_line < first_line[nfuncs] + num_lines[nfuncs])) { print codeline > (function_name nfuncs "_fn.txt") } } close (function_name nfuncs "_fn.txt") close(filepath) } # Initial values for statistics variables num_of_functions = 0 max_mcyclo = 0 max_function_length = 0 num_of_simple_functions = 0 num_of_moderate_functions = 0 num_of_high_functions = 0 num_of_untestable_functions = 0 } # Epilogue END { # Print header (only for html) if (output_lang == "html") { html_header() } # Print prolog if ((output_lang == "html") && (html_prolog != "")) { print html_prolog } if ((output_lang == "wiki") && (wiki_prolog != "")) { print wiki_prolog } if (output_lang == "html") { print "
" package_name " Cyclomatic Complexity Report
" print "

Report generated at: " strftime() "

" } if (output_lang == "wiki") { print "==" package_name " Cyclomatic Complexity Report==" print "Report generated at: '''" strftime() "'''" } if (section_global_stats_p) { build_stats() if (output_lang == "html") { html_global_stats() } if (output_lang == "wiki") { wiki_global_stats() } } if (section_function_cyclo_p) { if (output_lang == "html") { html_function_cyclo() } if (output_lang == "wiki") { wiki_function_cyclo() } } # Print epilog if ((output_lang == "html") && (html_epilog != "")) { print html_epilog } if ((output_lang == "wiki") && (wiki_epilog != "")) { print wiki_epilog } # Print footer (html only) if (output_lang == "html") { html_footer() } } # End of pmccabe2html shishi-1.0.2/build-aux/config.sub0000755000000000000000000010532712126772723013566 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: shishi-1.0.2/build-aux/missing0000755000000000000000000002415212126772723013176 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/install-sh0000755000000000000000000003325612126772723013610 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/texinfo.tex0000644000000000000000000116130512126772724014001 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2012-03-11.15} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. % % This texinfo.tex file 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 texinfo.tex file 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 . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\relax % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % emacs-page end of cmaps % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % like \smartslanted except unconditionally uses \ttsl, and no ic. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\indicateurl \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\}{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\topbox \newbox\printedrefnamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % \edef\pdfxrefdest{#1}% \txiescapepdf\pdfxrefdest % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % % Cross-manual reference. Only include the "Section ``foo'' in" if % the foo is neither missing or Top. Thus, @xref{,,,foo,The Foo Manual} % outputs simply "see The Foo Manual". \ifdim \wd\printedmanualbox > 0pt % What is the 7sp about? The idea is that we also want to omit % the Section part if we would be printing "Top", since they are % clearly trying to refer to the whole manual. But, this being % TeX, we can't easily compare strings while ignoring the possible % spaces before and after in the input. By adding the arbitrary % 7sp, we make it much less likely that a real node name would % happen to have the same width as "Top" (e.g., in a monospaced font). % I hope it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \setbox\topbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp \ifdim \wd2 = \wd\topbox \else \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi \cite{\printedmanual}% \else % Reference in this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore shishi-1.0.2/build-aux/config.guess0000755000000000000000000012743212126772723014124 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: shishi-1.0.2/build-aux/useless-if-before-free0000755000000000000000000001411412126660051015746 00000000000000eval '(exit $?0)' && eval 'exec perl -wST "$0" ${1+"$@"}' & eval 'exec perl -wST "$0" $argv:q' if 0; # Detect instances of "if (p) free (p);". # Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces. my $VERSION = '2012-01-06 07:23'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook # do its job. Otherwise, update this string manually. # Copyright (C) 2008-2013 Free Software Foundation, Inc. # 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 . # Written by Jim Meyering use strict; use warnings; use Getopt::Long; (my $ME = $0) =~ s|.*/||; # use File::Coda; # http://meyering.net/code/Coda/ END { defined fileno STDOUT or return; close STDOUT and return; warn "$ME: failed to close standard output: $!\n"; $? ||= 1; } sub usage ($) { my ($exit_code) = @_; my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); if ($exit_code != 0) { print $STREAM "Try '$ME --help' for more information.\n"; } else { print $STREAM < sub { usage 0 }, version => sub { print "$ME version $VERSION\n"; exit }, list => \$list, 'name=s@' => \@name, ) or usage 1; # Make sure we have the right number of non-option arguments. # Always tell the user why we fail. @ARGV < 1 and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR; my $or = join '|', @name; my $regexp = qr/(?:$or)/; # Set the input record separator. # Note: this makes it impractical to print line numbers. $/ = '"'; my $found_match = 0; FILE: foreach my $file (@ARGV) { open FH, '<', $file or (warn "$ME: can't open '$file' for reading: $!\n"), $err = EXIT_ERROR, next; while (defined (my $line = )) { while ($line =~ /\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\) # 1 2 3 (?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;| \s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg) { my $all = $1; my ($lhs, $rhs) = ($2, $3); my ($free_opnd, $braced_free_opnd) = ($4, $5); my $non_NULL; if (!defined $rhs) { $non_NULL = $lhs } elsif (is_NULL $rhs) { $non_NULL = $lhs } elsif (is_NULL $lhs) { $non_NULL = $rhs } else { next } # Compare the non-NULL part of the "if" expression and the # free'd expression, without regard to white space. $non_NULL =~ tr/ \t//d; my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd; $e2 =~ tr/ \t//d; if ($non_NULL eq $e2) { $found_match = 1; $list and (print "$file\0"), next FILE; print "$file: $all\n"; } } } } continue { close FH; } $found_match && $err == EXIT_NO_MATCH and $err = EXIT_MATCH; exit $err; } my $foo = <<'EOF'; # The above is to *find* them. # This adjusts them, removing the unnecessary "if (p)" part. # FIXME: do something like this as an option (doesn't do braces): free=xfree git grep -l -z "$free *(" \ | xargs -0 useless-if-before-free -l --name="$free" \ | xargs -0 perl -0x3b -pi -e \ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s' # Use the following to remove redundant uses of kfree inside braces. # Note that -0777 puts perl in slurp-whole-file mode; # but we have plenty of memory, these days... free=kfree git grep -l -z "$free *(" \ | xargs -0 useless-if-before-free -l --name="$free" \ | xargs -0 perl -0777 -pi -e \ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms' Be careful that the result of the above transformation is valid. If the matched string is followed by "else", then obviously, it won't be. When modifying files, refuse to process anything other than a regular file. EOF ## Local Variables: ## mode: perl ## indent-tabs-mode: nil ## eval: (add-hook 'write-file-hooks 'time-stamp) ## time-stamp-start: "my $VERSION = '" ## time-stamp-format: "%:y-%02m-%02d %02H:%02M" ## time-stamp-time-zone: "UTC" ## time-stamp-end: "'; # UTC" ## End: shishi-1.0.2/build-aux/snippet/0000755000000000000000000000000012126773313013331 500000000000000shishi-1.0.2/build-aux/snippet/_Noreturn.h0000664000000000000000000000046212015626624015400 00000000000000#if !defined _Noreturn && __STDC_VERSION__ < 201112 # if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ || 0x5110 <= __SUNPRO_C) # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif shishi-1.0.2/build-aux/snippet/c++defs.h0000644000000000000000000002675312126660051014643 00000000000000/* C++ compatible function declaration macros. Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ #ifndef _GL_CXXDEFS_H #define _GL_CXXDEFS_H /* The three most frequent use cases of these macros are: * For providing a substitute for a function that is missing on some platforms, but is declared and works fine on the platforms on which it exists: #if @GNULIB_FOO@ # if !@HAVE_FOO@ _GL_FUNCDECL_SYS (foo, ...); # endif _GL_CXXALIAS_SYS (foo, ...); _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif * For providing a replacement for a function that exists on all platforms, but is broken/insufficient and needs to be replaced on some platforms: #if @GNULIB_FOO@ # if @REPLACE_FOO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef foo # define foo rpl_foo # endif _GL_FUNCDECL_RPL (foo, ...); _GL_CXXALIAS_RPL (foo, ...); # else _GL_CXXALIAS_SYS (foo, ...); # endif _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif * For providing a replacement for a function that exists on some platforms but is broken/insufficient and needs to be replaced on some of them and is additionally either missing or undeclared on some other platforms: #if @GNULIB_FOO@ # if @REPLACE_FOO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef foo # define foo rpl_foo # endif _GL_FUNCDECL_RPL (foo, ...); _GL_CXXALIAS_RPL (foo, ...); # else # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ _GL_FUNCDECL_SYS (foo, ...); # endif _GL_CXXALIAS_SYS (foo, ...); # endif _GL_CXXALIASWARN (foo); #elif defined GNULIB_POSIXCHECK ... #endif */ /* _GL_EXTERN_C declaration; performs the declaration with C linkage. */ #if defined __cplusplus # define _GL_EXTERN_C extern "C" #else # define _GL_EXTERN_C extern #endif /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); declares a replacement function, named rpl_func, with the given prototype, consisting of return type, parameters, and attributes. Example: _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); */ #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ _GL_EXTERN_C rettype rpl_func parameters_and_attributes /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); declares the system function, named func, with the given prototype, consisting of return type, parameters, and attributes. Example: _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); */ #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ _GL_EXTERN_C rettype func parameters_and_attributes /* _GL_CXXALIAS_RPL (func, rettype, parameters); declares a C++ alias called GNULIB_NAMESPACE::func that redirects to rpl_func, if GNULIB_NAMESPACE is defined. Example: _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); */ #define _GL_CXXALIAS_RPL(func,rettype,parameters) \ _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ rettype (*const func) parameters = ::rpl_func; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); except that the C function rpl_func may have a slightly different declaration. A cast is used to silence the "invalid conversion" error that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ rettype (*const func) parameters = \ reinterpret_cast(::rpl_func); \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS (func, rettype, parameters); declares a C++ alias called GNULIB_NAMESPACE::func that redirects to the system provided function func, if GNULIB_NAMESPACE is defined. Example: _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); */ #if defined __cplusplus && defined GNULIB_NAMESPACE /* If we were to write rettype (*const func) parameters = ::func; like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls better (remove an indirection through a 'static' pointer variable), but then the _GL_CXXALIASWARN macro below would cause a warning not only for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */ # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static rettype (*func) parameters = ::func; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); is like _GL_CXXALIAS_SYS (func, rettype, parameters); except that the C function func may have a slightly different declaration. A cast is used to silence the "invalid conversion" error that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ namespace GNULIB_NAMESPACE \ { \ static rettype (*func) parameters = \ reinterpret_cast(::func); \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); is like _GL_CXXALIAS_SYS (func, rettype, parameters); except that the C function is picked among a set of overloaded functions, namely the one with rettype2 and parameters2. Two consecutive casts are used to silence the "cannot find a match" and "invalid conversion" errors that would otherwise occur. */ #if defined __cplusplus && defined GNULIB_NAMESPACE /* The outer cast must be a reinterpret_cast. The inner cast: When the function is defined as a set of overloaded functions, it works as a static_cast<>, choosing the designated variant. When the function is defined as a single variant, it works as a reinterpret_cast<>. The parenthesized cast syntax works both ways. */ # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ namespace GNULIB_NAMESPACE \ { \ static rettype (*func) parameters = \ reinterpret_cast( \ (rettype2(*)parameters2)(::func)); \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIASWARN (func); causes a warning to be emitted when ::func is used but not when GNULIB_NAMESPACE::func is used. func must be defined without overloaded variants. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIASWARN(func) \ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) # define _GL_CXXALIASWARN_1(func,namespace) \ _GL_CXXALIASWARN_2 (func, namespace) /* To work around GCC bug , we enable the warning only when not optimizing. */ # if !__OPTIMIZE__ # define _GL_CXXALIASWARN_2(func,namespace) \ _GL_WARN_ON_USE (func, \ "The symbol ::" #func " refers to the system function. " \ "Use " #namespace "::" #func " instead.") # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING # define _GL_CXXALIASWARN_2(func,namespace) \ extern __typeof__ (func) func # else # define _GL_CXXALIASWARN_2(func,namespace) \ _GL_EXTERN_C int _gl_cxxalias_dummy # endif #else # define _GL_CXXALIASWARN(func) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); causes a warning to be emitted when the given overloaded variant of ::func is used but not when GNULIB_NAMESPACE::func is used. */ #if defined __cplusplus && defined GNULIB_NAMESPACE # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ GNULIB_NAMESPACE) # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) /* To work around GCC bug , we enable the warning only when not optimizing. */ # if !__OPTIMIZE__ # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ "The symbol ::" #func " refers to the system function. " \ "Use " #namespace "::" #func " instead.") # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ extern __typeof__ (func) func # else # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ _GL_EXTERN_C int _gl_cxxalias_dummy # endif #else # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ _GL_EXTERN_C int _gl_cxxalias_dummy #endif #endif /* _GL_CXXDEFS_H */ shishi-1.0.2/build-aux/snippet/arg-nonnull.h0000644000000000000000000000230012126660051015643 00000000000000/* A C macro for declaring that specific arguments must not be NULL. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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 . */ /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools that the values passed as arguments n, ..., m must be non-NULL pointers. n = 1 stands for the first argument, n = 2 for the second argument etc. */ #ifndef _GL_ARG_NONNULL # if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3 # define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) # else # define _GL_ARG_NONNULL(params) # endif #endif shishi-1.0.2/build-aux/snippet/warn-on-use.h0000644000000000000000000001200712126660051015567 00000000000000/* A C macro for emitting warnings if a function is used. Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ /* _GL_WARN_ON_USE (function, "literal string") issues a declaration for FUNCTION which will then trigger a compiler warning containing the text of "literal string" anywhere that function is called, if supported by the compiler. If the compiler does not support this feature, the macro expands to an unused extern declaration. This macro is useful for marking a function as a potential portability trap, with the intent that "literal string" include instructions on the replacement function that should be used instead. However, one of the reasons that a function is a portability trap is if it has the wrong signature. Declaring FUNCTION with a different signature in C is a compilation error, so this macro must use the same type as any existing declaration so that programs that avoid the problematic FUNCTION do not fail to compile merely because they included a header that poisoned the function. But this implies that _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already have a declaration. Use of this macro implies that there must not be any other macro hiding the declaration of FUNCTION; but undefining FUNCTION first is part of the poisoning process anyway (although for symbols that are provided only via a macro, the result is a compilation error rather than a warning containing "literal string"). Also note that in C++, it is only safe to use if FUNCTION has no overloads. For an example, it is possible to poison 'getline' by: - adding a call to gl_WARN_ON_USE_PREPARE([[#include ]], [getline]) in configure.ac, which potentially defines HAVE_RAW_DECL_GETLINE - adding this code to a header that wraps the system : #undef getline #if HAVE_RAW_DECL_GETLINE _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but" "not universally present; use the gnulib module getline"); #endif It is not possible to directly poison global variables. But it is possible to write a wrapper accessor function, and poison that (less common usage, like &environ, will cause a compilation error rather than issue the nice warning, but the end result of informing the developer about their portability problem is still achieved): #if HAVE_RAW_DECL_ENVIRON static char ***rpl_environ (void) { return &environ; } _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared"); # undef environ # define environ (*rpl_environ ()) #endif */ #ifndef _GL_WARN_ON_USE # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) /* A compiler attribute is available in gcc versions 4.3.0 and later. */ # define _GL_WARN_ON_USE(function, message) \ extern __typeof__ (function) function __attribute__ ((__warning__ (message))) # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING /* Verify the existence of the function. */ # define _GL_WARN_ON_USE(function, message) \ extern __typeof__ (function) function # else /* Unsupported. */ # define _GL_WARN_ON_USE(function, message) \ _GL_WARN_EXTERN_C int _gl_warn_on_use # endif #endif /* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string") is like _GL_WARN_ON_USE (function, "string"), except that the function is declared with the given prototype, consisting of return type, parameters, and attributes. This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does not work in this case. */ #ifndef _GL_WARN_ON_USE_CXX # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ extern rettype function parameters_and_attributes \ __attribute__ ((__warning__ (msg))) # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING /* Verify the existence of the function. */ # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ extern rettype function parameters_and_attributes # else /* Unsupported. */ # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ _GL_WARN_EXTERN_C int _gl_warn_on_use # endif #endif /* _GL_WARN_EXTERN_C declaration; performs the declaration with C linkage. */ #ifndef _GL_WARN_EXTERN_C # if defined __cplusplus # define _GL_WARN_EXTERN_C extern "C" # else # define _GL_WARN_EXTERN_C extern # endif #endif shishi-1.0.2/build-aux/mdate-sh0000755000000000000000000001371712126772724013235 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2010-08-21.06; # UTC # Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009, 2010 # Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST fi case $1 in '') echo "$0: No file. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification day of FILE, in the format: 1 January 1970 Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac error () { echo "$0: $1" >&2 exit 1 } # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume `unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" fi # A `ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named `Jan', or `Feb', etc. However, it's unlikely that `/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`$ls_command /` # Find which argument is the month. month= command= until test $month do test $# -gt 0 || error "failed parsing \`$ls_command /' output" shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done test -n "$month" || error "failed parsing \`$ls_command /' output" # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\\\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/gnupload0000755000000000000000000002744712126660051013336 00000000000000#!/bin/sh # Sign files and upload them. scriptversion=2013-03-19.17; # UTC # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # 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, 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 . # Originally written by Alexandre Duret-Lutz . # The master copy of this file is maintained in the gnulib Git repository. # Please send bug reports and feature requests to bug-gnulib@gnu.org. set -e GPG='gpg --batch --no-tty' conffile=.gnuploadrc to= dry_run=false replace= symlink_files= delete_files= delete_symlinks= collect_var= dbg= nl=' ' usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...] Sign all FILES, and process them at the destinations specified with --to. If CMD is not given, it defaults to uploading. See examples below. Commands: --delete delete FILES from destination --symlink create symbolic links --rmsymlink remove symbolic links -- treat the remaining arguments as files to upload Options: --to DEST specify a destination DEST for FILES (multiple --to options are allowed) --user NAME sign with key NAME --replace allow replacements of existing files --symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names --dry-run do nothing, show what would have been done (including the constructed directive file) --version output version information and exit --help print this help text and exit If --symlink-regex is given without EXPR, then the link target name is created by replacing the version information with '-latest', e.g.: foo-1.3.4.tar.gz -> foo-latest.tar.gz Recognized destinations are: alpha.gnu.org:DIRECTORY savannah.gnu.org:DIRECTORY savannah.nongnu.org:DIRECTORY ftp.gnu.org:DIRECTORY build directive files and upload files by FTP download.gnu.org.ua:{alpha|ftp}/DIRECTORY build directive files and upload files by SFTP [user@]host:DIRECTORY upload files with scp Options and commands are applied in order. If the file $conffile exists in the current working directory, its contents are prepended to the actual command line options. Use this to keep your defaults. Comments (#) and empty lines in $conffile are allowed. gives some further background. Examples: 1. Upload foobar-1.0.tar.gz to ftp.gnu.org: gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz 2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org: gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz 3. Same as above, and also create symbolic links to foobar-latest.tar.*: gnupload --to ftp.gnu.org:foobar \\ --symlink-regex \\ foobar-1.0.tar.gz foobar-1.0.tar.xz 4. Upload foobar-0.9.90.tar.gz to two sites: gnupload --to alpha.gnu.org:foobar \\ --to sources.redhat.com:~ftp/pub/foobar \\ foobar-0.9.90.tar.gz 5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz (the -- terminates the list of files to delete): gnupload --to alpha.gnu.org:foobar \\ --to sources.redhat.com:~ftp/pub/foobar \\ --delete oopsbar-0.9.91.tar.gz \\ -- foobar-0.9.91.tar.gz gnupload executes a program ncftpput to do the transfers; if you don't happen to have an ncftp package installed, the ncftpput-ftp script in the build-aux/ directory of the gnulib package (http://savannah.gnu.org/projects/gnulib) may serve as a replacement. Send patches and bug reports to ." # Read local configuration file if test -r "$conffile"; then echo "$0: Reading configuration file $conffile" conf=`sed 's/#.*$//;/^$/d' "$conffile" | tr "\015$nl" ' '` eval set x "$conf \"\$@\"" shift fi while test -n "$1"; do case $1 in -*) collect_var= case $1 in --help) echo "$usage" exit $? ;; --to) if test -z "$2"; then echo "$0: Missing argument for --to" 1>&2 exit 1 elif echo "$2" | grep 'ftp-upload\.gnu\.org' >/dev/null; then echo "$0: Use ftp.gnu.org:PKGNAME or alpha.gnu.org:PKGNAME" >&2 echo "$0: for the destination, not ftp-upload.gnu.org (which" >&2 echo "$0: is used for direct ftp uploads, not with gnupload)." >&2 echo "$0: See --help and its examples if need be." >&2 exit 1 else to="$to $2" shift fi ;; --user) if test -z "$2"; then echo "$0: Missing argument for --user" 1>&2 exit 1 else GPG="$GPG --local-user $2" shift fi ;; --delete) collect_var=delete_files ;; --replace) replace="replace: true" ;; --rmsymlink) collect_var=delete_symlinks ;; --symlink-regex=*) symlink_expr=`expr "$1" : '[^=]*=\(.*\)'` ;; --symlink-regex) symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|' ;; --symlink) collect_var=symlink_files ;; --dry-run|-n) dry_run=: ;; --version) echo "gnupload $scriptversion" exit $? ;; --) shift break ;; -*) echo "$0: Unknown option '$1', try '$0 --help'" 1>&2 exit 1 ;; esac ;; *) if test -z "$collect_var"; then break else eval "$collect_var=\"\$$collect_var $1\"" fi ;; esac shift done dprint() { echo "Running $* ..." } if $dry_run; then dbg=dprint fi if test -z "$to"; then echo "$0: Missing destination sites" >&2 exit 1 fi if test -n "$symlink_files"; then x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'` if test -n "$x"; then echo "$0: Odd number of symlink arguments" >&2 exit 1 fi fi if test $# = 0; then if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then echo "$0: No file to upload" 1>&2 exit 1 fi else # Make sure all files exist. We don't want to ask # for the passphrase if the script will fail. for file do if test ! -f $file; then echo "$0: Cannot find '$file'" 1>&2 exit 1 elif test -n "$symlink_expr"; then linkname=`echo $file | sed "$symlink_expr"` if test -z "$linkname"; then echo "$0: symlink expression produces empty results" >&2 exit 1 elif test "$linkname" = $file; then echo "$0: symlink expression does not alter file name" >&2 exit 1 fi fi done fi # Make sure passphrase is not exported in the environment. unset passphrase unset passphrase_fd_0 GNUPGHOME=${GNUPGHOME:-$HOME/.gnupg} # Reset PATH to be sure that echo is a built-in. We will later use # 'echo $passphrase' to output the passphrase, so it is important that # it is a built-in (third-party programs tend to appear in 'ps' # listings with their arguments...). # Remember this script runs with 'set -e', so if echo is not built-in # it will exit now. if $dry_run || grep -q "^use-agent" $GNUPGHOME/gpg.conf; then :; else PATH=/empty echo -n "Enter GPG passphrase: " stty -echo read -r passphrase stty echo echo passphrase_fd_0="--passphrase-fd 0" fi if test $# -ne 0; then for file do echo "Signing $file ..." rm -f $file.sig echo "$passphrase" | $dbg $GPG $passphrase_fd_0 -ba -o $file.sig $file done fi # mkdirective DESTDIR BASE FILE STMT # Arguments: See upload, below mkdirective () { stmt="$4" if test -n "$3"; then stmt=" filename: $3$stmt" fi cat >${2}.directive<&2 fi $dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files ;; savannah.nongnu.org:*) if test -z "$files"; then echo "$0: warning: standalone directives not applicable for $dest" >&2 fi $dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files ;; download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*) destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'` destdir_topdir=`echo "$destdir" | sed 's,/.*,,'` mkdirective "$destdir_p1" "$base" "$file" "$stmt" echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive for f in $files $base.directive.asc do echo put $f done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir ;; /*) dest_host=`echo "$dest" | sed 's,:.*,,'` mkdirective "$destdir" "$base" "$file" "$stmt" echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive $dbg cp $files $base.directive.asc $dest_host ;; *) if test -z "$files"; then echo "$0: warning: standalone directives not applicable for $dest" >&2 fi $dbg scp $files $dest ;; esac rm -f $base.directive $base.directive.asc } ##### # Process any standalone directives stmt= if test -n "$symlink_files"; then stmt="$stmt `mksymlink $symlink_files`" fi for file in $delete_files do stmt="$stmt archive: $file" done for file in $delete_symlinks do stmt="$stmt rmsymlink: $file" done if test -n "$stmt"; then for dest in $to do destdir=`echo $dest | sed 's/[^:]*://'` upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt" done fi # Process actual uploads for dest in $to do for file do echo "Uploading $file to $dest ..." stmt= # # allowing file replacement is all or nothing. if test -n "$replace"; then stmt="$stmt $replace" fi # files="$file $file.sig" destdir=`echo $dest | sed 's/[^:]*://'` if test -n "$symlink_expr"; then linkname=`echo $file | sed "$symlink_expr"` stmt="$stmt symlink: $file $linkname symlink: $file.sig $linkname.sig" fi upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files" done done exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/update-copyright0000755000000000000000000002242112126660051015000 00000000000000eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" ${1+"$@"}' & eval 'exec perl -wS -0777 -pi "$0" $argv:q' if 0; # Update an FSF copyright year list to include the current year. my $VERSION = '2013-01-03.09:41'; # UTC # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # 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, 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 . # Written by Jim Meyering and Joel E. Denny # The arguments to this script should be names of files that contain # copyright statements to be updated. The copyright holder's name # defaults to "Free Software Foundation, Inc." but may be changed to # any other name by using the "UPDATE_COPYRIGHT_HOLDER" environment # variable. # # For example, you might wish to use the update-copyright target rule # in maint.mk from gnulib's maintainer-makefile module. # # Iff a copyright statement is recognized in a file and the final # year is not the current year, then the statement is updated for the # new year and it is reformatted to: # # 1. Fit within 72 columns. # 2. Convert 2-digit years to 4-digit years by prepending "19". # 3. Expand copyright year intervals. (See "Environment variables" # below.) # # A warning is printed for every file for which no copyright # statement is recognized. # # Each file's copyright statement must be formatted correctly in # order to be recognized. For example, each of these is fine: # # Copyright @copyright{} 1990-2005, 2007-2009 Free Software # Foundation, Inc. # # # Copyright (C) 1990-2005, 2007-2009 Free Software # # Foundation, Inc. # # /* # * Copyright © 90,2005,2007-2009 # * Free Software Foundation, Inc. # */ # # However, the following format is not recognized because the line # prefix changes after the first line: # # ## Copyright (C) 1990-2005, 2007-2009 Free Software # # Foundation, Inc. # # However, any correctly formatted copyright statement following # a non-matching copyright statements would be recognized. # # The exact conditions that a file's copyright statement must meet # to be recognized are: # # 1. It is the first copyright statement that meets all of the # following conditions. Subsequent copyright statements are # ignored. # 2. Its format is "Copyright (C)", then a list of copyright years, # and then the name of the copyright holder. # 3. The "(C)" takes one of the following forms or is omitted # entirely: # # A. (C) # B. (c) # C. @copyright{} # D. © # # 4. The "Copyright" appears at the beginning of a line, except that it # may be prefixed by any sequence (e.g., a comment) of no more than # 5 characters -- including white space. # 5. Iff such a prefix is present, the same prefix appears at the # beginning of each remaining line within the FSF copyright # statement. There is one exception in order to support C-style # comments: if the first line's prefix contains nothing but # whitespace surrounding a "/*", then the prefix for all subsequent # lines is the same as the first line's prefix except with each of # "/" and possibly "*" replaced by a " ". The replacement of "*" # by " " is consistent throughout all subsequent lines. # 6. Blank lines, even if preceded by the prefix, do not appear # within the FSF copyright statement. # 7. Each copyright year is 2 or 4 digits, and years are separated by # commas or dashes. Whitespace may appear after commas. # # Environment variables: # # 1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement # is reformatted even if it does not need updating for the new # year. If unset or set to 0, only updated FSF copyright # statements are reformatted. # 2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive # copyright years (such as 90, 1991, 1992-2007, 2008) in a # reformatted FSF copyright statement is collapsed to a single # interval (such as 1990-2008). If unset or set to 0, all existing # copyright year intervals in a reformatted FSF copyright statement # are expanded instead. # If UPDATE_COPYRIGHT_USE_INTERVALS=2, convert a sequence with gaps # to the minimal containing range. For example, convert # 2000, 2004-2007, 2009 to 2000-2009. # 3. For testing purposes, you can set the assumed current year in # UPDATE_COPYRIGHT_YEAR. # 4. The default maximum line length for a copyright line is 72. # Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length. # 5. Set UPDATE_COPYRIGHT_HOLDER if the copyright holder is other # than "Free Software Foundation, Inc.". use strict; use warnings; my $copyright_re = 'Copyright'; my $circle_c_re = '(?:\([cC]\)|@copyright{}|©)'; my $holder = $ENV{UPDATE_COPYRIGHT_HOLDER}; $holder ||= 'Free Software Foundation, Inc.'; my $prefix_max = 5; my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH}; !$margin || $margin !~ m/^\d+$/ and $margin = 72; my $tab_width = 8; my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR}; if (!$this_year || $this_year !~ m/^\d{4}$/) { my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ()); $this_year = $year + 1900; } # Unless the file consistently uses "\r\n" as the EOL, use "\n" instead. my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n"; my $leading; my $prefix; my $ws_re; my $stmt_re; while (/(^|\n)(.{0,$prefix_max})$copyright_re/g) { $leading = "$1$2"; $prefix = $2; if ($prefix =~ /^(\s*\/)\*(\s*)$/) { $prefix =~ s,/, ,; my $prefix_ws = $prefix; $prefix_ws =~ s/\*/ /; # Only whitespace. if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/) { $prefix = $prefix_ws; } } $ws_re = '[ \t\r\f]'; # \s without \n $ws_re = "(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)"; my $holder_re = $holder; $holder_re =~ s/\s/$ws_re/g; my $stmt_remainder_re = "(?:$ws_re$circle_c_re)?" . "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|-))*" . "((?:\\d\\d)?\\d\\d)$ws_re$holder_re"; if (/\G$stmt_remainder_re/) { $stmt_re = quotemeta($leading) . "($copyright_re$stmt_remainder_re)"; last; } } if (defined $stmt_re) { /$stmt_re/ or die; # Should never die. my $stmt = $1; my $final_year_orig = $2; # Handle two-digit year numbers like "98" and "99". my $final_year = $final_year_orig; $final_year <= 99 and $final_year += 1900; if ($final_year != $this_year) { # Update the year. $stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/; } if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'}) { # Normalize all whitespace including newline-prefix sequences. $stmt =~ s/$ws_re/ /g; # Put spaces after commas. $stmt =~ s/, ?/, /g; # Convert 2-digit to 4-digit years. $stmt =~ s/(\b\d\d\b)/19$1/g; # Make the use of intervals consistent. if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS}) { $stmt =~ s/(\d{4})-(\d{4})/join(', ', $1..$2)/eg; } else { $stmt =~ s/ (\d{4}) (?: (,\ |-) ((??{ if ($2 eq '-') { '\d{4}'; } elsif (!$3) { $1 + 1; } else { $3 + 1; } })) )+ /$1-$3/gx; # When it's 2, emit a single range encompassing all year numbers. $ENV{UPDATE_COPYRIGHT_USE_INTERVALS} == 2 and $stmt =~ s/\b(\d{4})\b.*\b(\d{4})\b/$1-$2/; } # Format within margin. my $stmt_wrapped; my $text_margin = $margin - length($prefix); if ($prefix =~ /^(\t+)/) { $text_margin -= length($1) * ($tab_width - 1); } while (length $stmt) { if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//) || ($stmt =~ s/^([\S]+)(?: |$)//)) { my $line = $1; $stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading; $stmt_wrapped .= $line; } else { # Should be unreachable, but we don't want an infinite # loop if it can be reached. die; } } # Replace the old copyright statement. s/$stmt_re/$stmt_wrapped/; } } else { print STDERR "$ARGV: warning: copyright statement not found\n"; } # Local variables: # mode: perl # indent-tabs-mode: nil # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "my $VERSION = '" # time-stamp-format: "%:y-%02m-%02d.%02H:%02M" # time-stamp-time-zone: "UTC" # time-stamp-end: "'; # UTC" # End: shishi-1.0.2/build-aux/pmccabe.css0000664000000000000000000000451512015626624013701 00000000000000body { font-family: Helvetica, sans-serif; } .page_title { font: 18pt Georgia, serif; color: darkred; } .section_title { font: 14pt Georgia, serif; color: darkred; } .report_timestamp { color: darkred; font-weight: bold; } .function_src { text-align: left; background: white; } .resume_table { } .resume_header_entry { color: black; } .resume_number_entry { color: darkred; font-weight: bold; text-align: right; } .ranges_table { border-spacing: 0px; border-bottom: solid 2px black; border-top: solid 2px black; border-left: solid 2px black; border-right: solid 2px black; } .ranges_header_entry { padding: 5px; border-bottom: solid 1px black; font-size: 1em; font-weight: bold; color: darkred; text-align: left; } .ranges_entry { } .ranges_entry_simple { background: #87ff75; } .ranges_entry_moderate { background: #fffc60; } .ranges_entry_high { background: #ff5a5d; } .ranges_entry_untestable { background: #993300 } .function_table { border-spacing: 0px; border-bottom: solid 2px black; border-top: solid 2px black; border-left: solid 2px black; border-right: solid 2px black; } .function_table_caption { font-size: 1.1em; font-weight: bold; color: black; padding: 5px; } .function_table_header { } .function_table_header_entry { padding: 5px; border-bottom: solid 1px black; font-size: 1em; font-weight: bold; color: darkred; text-align: left; } .function_entry { } .function_entry_simple { background: #87ff75; } .function_entry_moderate { background: #fffc60; } .function_entry_high { background: #ff5a5d; } .function_entry_untestable { background: #993300 } .function_entry_name { font-size: 1em; text-align: left; font-weight: bold; text-valign: top; border-top: solid 1px black; padding: 3px; } .function_entry_cyclo { font-size: 1em; text-align: right; text-valign: top; border-top: solid 1px black; padding: 3px; } .function_entry_number { font-size: 1em; text-align: right; text-valign: top; border-top: solid 1px black; padding: 3px; } .function_entry_filename { font-size: 1em; text-align: left; text-valign: top; border-top: solid 1px black; padding: 3px; } shishi-1.0.2/build-aux/depcomp0000755000000000000000000005064312126772723013160 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/ar-lib0000755000000000000000000001330312126772723012667 00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010, 2012 Free Software Foundation, Inc. # Written by Peter Rosin . # # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. # List the specified version-controlled files. # With no argument, list them all. With a single DIRECTORY argument, # list the version-controlled files in that directory. # If there's an argument, it must be a single, "."-relative directory name. # cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/ postprocess= case $1 in --help) cat <. EOF exit ;; --version) year=`echo "$scriptversion" | sed 's/[^0-9].*//'` cat < This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. EOF exit ;; -C) test "$2" = . || postprocess="| sed 's|^|$2/|'" cd "$2" || exit 1 shift; shift ;; esac test $# = 0 && set . for dir do if test -d .git; then test "x$dir" = x. \ && dir= sed_esc= \ || { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; } # Ignore git symlinks - either they point into the tree, in which case # we don't need to visit the target twice, or they point somewhere # else (often into a submodule), in which case the content does not # belong to this package. eval exec git ls-tree -r 'HEAD:"$dir"' \ \| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess elif test -d .hg; then eval exec hg locate '"$dir/*"' $postprocess elif test -d .bzr; then test "$postprocess" = '' && postprocess="| sed 's|^\./||'" eval exec bzr ls -R --versioned '"$dir"' $postprocess elif test -d CVS; then test "$postprocess" = '' && postprocess="| sed 's|^\./||'" if test -x build-aux/cvsu; then eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess elif (cvsu --help) >/dev/null 2>&1; then eval cvsu --find --types=AFGM '"$dir"' $postprocess else eval awk -F/ \''{ \ if (!$1 && $3 !~ /^-/) { \ f=FILENAME; \ if (f ~ /CVS\/Entries$/) \ f = substr(f, 1, length(f)-11); \ print f $2; \ }}'\'' \ `find "$dir" -name Entries -print` /dev/null' $postprocess fi elif test -d .svn; then eval exec svn list -R '"$dir"' $postprocess else echo "$0: Failed to determine type of version control used in `pwd`" 1>&2 exit 1 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/ylwrap0000755000000000000000000001435712126772725013053 00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2011-08-25.18; # UTC # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, # 2007, 2009, 2010, 2011 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case "$1" in '') echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input="$1" shift case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac pairlist= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi pairlist="$pairlist $1" shift done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then set X $pairlist shift first=yes # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot="no" if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot="yes" fi # The directory holding the input. input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` # Quote $INPUT_DIR so we can use it in a regexp. # FIXME: really we should care about more than `.' and `\'. input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` while test "$#" -ne 0; do from="$1" # Handle y_tab.c and y_tab.h output by DOS if test $y_tab_nodot = "yes"; then if test $from = "y.tab.c"; then from="y_tab.c" else if test $from = "y.tab.h"; then from="y_tab.h" fi fi fi if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend `../'. case "$2" in [\\/]* | ?:[\\/]*) target="$2";; *) target="../$2";; esac # We do not want to overwrite a header file if it hasn't # changed. This avoid useless recompilations. However the # parser itself (the first file) should always be updated, # because it is the destination of the .y.c rule in the # Makefile. Divert the output of all other files to a temporary # file so we can compare them to existing versions. if test $first = no; then realtarget="$target" target="tmp-`echo $target | sed s/.*[\\/]//g`" fi # Edit out `#line' or `#' directives. # # We don't want the resulting debug information to point at # an absolute srcdir; it is better for it to just mention the # .y file with no path. # # We want to use the real output file name, not yy.lex.c for # instance. # # We want the include guards to be adjusted too. FROM=`echo "$from" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` TARGET=`echo "$2" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? # Check whether header files must be updated. if test $first = no; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$2" is unchanged rm -f "$target" else echo updating "$2" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the first file. This # is a blatant hack to let us support using "yacc -d". If -d # is not specified, we don't want an error when the header # file is "missing". if test $first = yes; then ret=1 fi fi shift shift first=no done else ret=$? fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: shishi-1.0.2/build-aux/config.rpath0000755000000000000000000004443512126764575014123 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2013 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; nagfor*) wl='-Wl,-Wl,,' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; xl* | bgxl* | bgf* | mpixl*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) wl= ;; *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; newsos6) ;; *nto* | *qnx*) ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) wl='-Qoption ld ' ;; *) wl='-Wl,' ;; esac ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; haiku*) ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then : else ld_shlibs=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) case "$host_cpu" in powerpc*) library_names_spec='$libname$shrext' ;; m68k) library_names_spec='$libname.a' ;; esac ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; haiku*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; *nto* | *qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; tpf*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, of the rewrite of rsh/rlogin called rsh-redone, by Guus Sliepen . The fetchmail.* files contains a mail and associated patch for Eric Raymond's Fetchmail to add support for GNU GSS/Shishi. Apply the patch, and build Fetchmail with GSSAPI as normal with --with-gssapi. The inetutils.diff file has been removed, as up-stream GNU InetUtils now has incorporated support for GNU Shishi. Thank you! The file mailutils.diff has been removed, as up-stream GNU MailUtils now has incorporated support for GNU GSS/Shishi. Thank you! ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/extra/rsh-redone/0000755000000000000000000000000012126773323013147 500000000000000shishi-1.0.2/extra/rsh-redone/rsh.10000664000000000000000000000153412015626624013750 00000000000000.Dd Sun, 13 Apr 2003 00:24:32 +0200 .Dt RSH 1 .Sh NAME .Nm rsh .Nd remote shell .Sh SYNOPSIS .Nm .Op Fl 46 .Op Fl l Ar user .Op Fl p Ar port .Op Ar user Ns Li @ Ns .Ar host .Ar command .Sh DESCRIPTION .Nm makes a connection to the remote shell daemon running on .Ar host and starts .Ar command on the remote machine. All input is transmitted to the remote machine and all output on the remote machine is sent back to the .Nm client on the local machine. .Sh OPTIONS .Bl -tag -width flag .It Fl 4 Use only IPv4 to connect to the remote host. .It Fl 6 Use only IPv6 to connect to the remote host. .It Fl l Ar user Connect to the remote host as a different user than on the local machine. .It Fl p Ar port Connect to a different port than the default one for .Nm . .El .Sh SEE ALSO .Xr rshd 8 , .Xr rlogin 1 , .Xr rlogind 8 , .Xr rcp 1 , .Xr rhosts 5 , RFC 1282. shishi-1.0.2/extra/rsh-redone/Makefile.am0000644000000000000000000000211312126663322015115 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2003-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_builddir)/lib EXTRA_DIST = $(man_MANS) LDADD = ../../lib/libshishi.la DEFS = -DSHISHI @DEFS@ bin_PROGRAMS = rlogin rsh rlogin_SOURCES = rlogin.c rsh_SOURCES = rsh.c man_MANS = rlogin.1 rsh.1 shishi-1.0.2/extra/rsh-redone/rsh.c0000664000000000000000000005220612015626624014034 00000000000000/* rsh.c - remote shell client Copyright (C) 2003 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. 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 Street, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #ifdef SHISHI #include #include #define SERVICE "host" #define AUTH_OK 0 #endif #define BUFLEN 0x10000 char *argv0; #ifdef SHISHI void usage (void) { fprintf (stderr, "Usage: %s [-46vsx] [-l user] [-p port] [user@]host command...\n", argv0); } #else void usage (void) { fprintf (stderr, "Usage: %s [-46v] [-l user] [-p port] [user@]host command...\n", argv0); } #endif /* Make sure everything gets written */ ssize_t safewrite (int fd, const void *buf, size_t count) { int written = 0, result; while (count) { result = write (fd, buf, count); if (result == -1) { if (errno == EINTR) continue; else return result; } written += result; buf += result; count -= result; } return written; } /* Safe and fast string building */ void safecpy (char **dest, int *len, char *source, bool terminate) { while (*source && *len) { *(*dest)++ = *source++; (*len)--; } if (terminate && *len) { *(*dest)++ = 0; (*len)--; } } #ifdef SHISHI /* read encrypted data on socket */ int readenc (Shishi * h, int sock, char *buf, int *len, char *iv, int *ivlen, Shishi_key * enckey) { char *out; char *outbis; char *iv2; int rc; int val; int outlen; int dlen = 0, blocksize, enctype, hashsize; /* read size of message */ read (sock, &dlen, sizeof (int)); dlen = ntohl (dlen); /* if 0 put read size to 0 */ if (!dlen) { *len = dlen; return SHISHI_OK; } /* convert size to encryption size */ enctype = shishi_key_type (enckey); blocksize = shishi_cipher_blocksize (enctype); hashsize = shishi_checksum_cksumlen (shishi_cipher_defaultcksumtype (enctype)); dlen += blocksize - 1 + 4; if (shishi_key_type (enckey) != SHISHI_DES3_CBC_HMAC_SHA1_KD) dlen += hashsize; else dlen += blocksize; dlen /= blocksize; dlen *= blocksize; if (shishi_key_type (enckey) == SHISHI_DES3_CBC_HMAC_SHA1_KD) dlen += hashsize; /* read encrypted data */ outbis = malloc (dlen); if (outbis == NULL) { printf ("Malloc error!\n"); return 1; } rc = read (sock, outbis, dlen); if (rc != dlen) { printf ("Error during read socket\n"); return 1; } /* decrypt it */ rc = shishi_decrypt_ivupdate (h, enckey, 1026, iv, *ivlen, &iv2, ivlen, outbis, dlen, &out, &outlen); if (rc != SHISHI_OK) { printf ("decryption error\n"); return 1; } /* len = first 4 bytes of decrypted data */ *len = ntohl (*((int *) out)); /* update iv */ memcpy (iv, iv2, *ivlen); /* Temp patch to remove 5 unidentified bytes data from server */ memset (buf, 0, BUFLEN); if ((unsigned char) out[4] == 255) val = 5 + sizeof (int); else val = sizeof (int); /* copy decrypted data to output */ memcpy (buf, out + val, strlen (out + val)); free (out); free (outbis); return SHISHI_OK; } /* write encrypted data to socket */ int writeenc (Shishi * h, int sock, char *buf, int wlen, int *len, char *iv, int *ivlen, Shishi_key * enckey) { char *out; char *bufbis; char *iv2; int rc; int dlen, outlen; dlen = wlen; dlen = htonl (dlen); /* data to encrypt = size + data */ bufbis = malloc (wlen + sizeof (int)); memcpy (bufbis, (char *) &dlen, sizeof (int)); memcpy (bufbis + sizeof (int), buf, wlen); /* encrypt it */ rc = shishi_encrypt_ivupdate (h, enckey, 1026, iv, *ivlen, &iv2, ivlen, bufbis, wlen + sizeof (int), &out, &outlen); if (rc != SHISHI_OK) { printf ("decryption error\n"); return 1; } free (bufbis); /* data to send = original size + encrypted data */ bufbis = malloc (outlen + sizeof (int)); if (bufbis == NULL) { printf ("Malloc error!\n"); return 1; } memcpy (bufbis, (char *) &dlen, sizeof (int)); memcpy (bufbis + sizeof (int), out, outlen); /* send it */ write (sock, bufbis, outlen + sizeof (int)); *len = wlen; /* update iv */ memcpy (iv, iv2, *ivlen); free (bufbis); free (out); return SHISHI_OK; } /* shishi authentication */ int auth (Shishi * h, int verbose, const char *cname, const char *sname, int sock, char *cmd, char *port, Shishi_key ** enckey, Shishi_key * deckey) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; char *out; int outlen; int krb5len, msglen; char auth; /* KERBEROS 5 SENDAUTH MESSAGE */ char krb5sendauth[] = "KRB5_SENDAUTH_V1.0"; /* PROTOCOL VERSION */ char krb5sendclient[] = "KCMDV0.2"; /* to store error msg sent by server */ char errormsg[101]; char cksumdata[101]; /* size of KRB5 auth message */ krb5len = strlen (krb5sendauth) + 1; msglen = htonl (krb5len); safewrite (sock, &msglen, sizeof (int)); /* KRB5 authentication message */ safewrite (sock, krb5sendauth, krb5len); /* size of client message */ krb5len = strlen (krb5sendclient) + 1; msglen = htonl (krb5len); safewrite (sock, &msglen, sizeof (int)); /* KRB5 client message */ safewrite (sock, krb5sendclient, krb5len); /* get answer from server 0 = ok, 1 = error with message */ read (sock, &auth, 1); if (auth) { read (sock, errormsg, 100); errormsg[100] = '\0'; printf ("Error during server authentication : %s\n", errormsg); return 1; } if (verbose) { printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); } /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return 1; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return 1; } /* checksum = port: terminal name */ snprintf (cksumdata, 100, "%s:%s%s", port, cmd, cname); /* add checksum to authenticator */ shishi_ap_authenticator_cksumdata_set (ap, cksumdata, strlen (cksumdata)); /* To be compatible with MIT rlogind */ shishi_ap_authenticator_cksumtype_set (ap, SHISHI_RSA_MD5); /* create der encoded AP-REQ */ rc = shishi_ap_req_der (ap, &out, &outlen); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return 1; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* extract subkey if present from ap exchange for secure connection */ shishi_authenticator_get_subkey (h, shishi_ap_authenticator (ap), enckey); /* send size of AP-REQ to the server */ msglen = htonl (outlen); safewrite (sock, (char *) &msglen, sizeof (int)); /* send AP-REQ to the server */ safewrite (sock, out, outlen); /* read a respond from server - what ? */ read (sock, &auth, sizeof (int)); /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { if (verbose) printf ("Waiting for server to authenticate itself...\n"); /* read size of the AP-REP */ read (sock, (char *) &outlen, sizeof (int)); /* read AP-REP */ outlen = ntohl (outlen); outlen = read (sock, out, outlen); rc = shishi_ap_rep_verify_der (ap, out, outlen); if (rc == SHISHI_OK) { if (verbose) printf ("AP-REP verification OK...\n"); } else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return 1; } /* The server is authenticated. */ if (verbose) printf ("Server authenticated.\n"); } /* We are now authenticated. */ if (verbose) printf ("User authenticated.\n"); return AUTH_OK; } #endif int main (int argc, char **argv) { char *user = NULL; char *luser = NULL; char *host = NULL; char *port = "shell"; char *p; char lport[5]; struct passwd *pw; int af = AF_UNSPEC; struct addrinfo hint, *ai, *aip, *lai; struct sockaddr raddr; int raddrlen; int err, sock = -1, lsock = -1, esock = -1, i; int opt; bool verbose = false; char hostaddr[NI_MAXHOST]; char portnr[NI_MAXSERV]; char buf[3][BUFLEN], *bufp[3]; int len[3], wlen; fd_set infd, outfd, infdset, outfdset, errfd; int maxfd; int flags; #ifdef SHISHI Shishi *h; Shishi_key *enckey = NULL, *deckey = NULL; int rc; char *sname = NULL; int shishi = 0; int encryption = 0; int auth2 = 0; char *cmd, *tcmd; int hostlen, cmdlen; struct hostent *hostdata; char *iv = NULL; char *iv2 = NULL; char *iv3 = NULL; int ivlen; int ivlen2; int ivlen3; #endif argv0 = argv[0]; /* Lookup local username */ if (!(pw = getpwuid (getuid ()))) { fprintf (stderr, "%s: Could not lookup username: %s\n", argv0, strerror (errno)); return 1; } /* Process options */ #ifdef SHISHI while ((opt = getopt (argc, argv, "+l:p:46vsx")) != -1) #else while ((opt = getopt (argc, argv, "+l:p:46v")) != -1) #endif { switch (opt) { case 'l': user = optarg; break; case 'p': port = optarg; break; case '4': af = AF_INET; break; case '6': af = AF_INET6; break; case 'v': verbose = true; break; #ifdef SHISHI case 's': shishi = 1; port = "544"; break; case 'x': shishi = 1; encryption = 1; port = "544"; break; #endif default: fprintf (stderr, "%s: Unknown option!\n", argv0); usage (); return 1; } } if (optind == argc) { fprintf (stderr, "%s: No host specified!\n", argv0); usage (); return 1; } #ifdef SHISHI if (!shishi) { luser = pw->pw_name; if (!user) user = luser; } #endif host = argv[optind++]; if ((p = strchr (host, '@'))) { user = host; *p = '\0'; host = p + 1; } /* Resolve hostname and try to make a connection */ memset (&hint, '\0', sizeof (hint)); hint.ai_family = af; hint.ai_socktype = SOCK_STREAM; err = getaddrinfo (host, port, &hint, &ai); if (err) { fprintf (stderr, "%s: Error looking up host: %s\n", argv0, gai_strerror (err)); return 1; } hint.ai_flags = AI_PASSIVE; for (aip = ai; aip; aip = aip->ai_next) { if (getnameinfo (aip->ai_addr, aip->ai_addrlen, hostaddr, sizeof (hostaddr), portnr, sizeof (portnr), NI_NUMERICHOST | NI_NUMERICSERV)) { fprintf (stderr, "%s: Error resolving address: %s\n", argv0, strerror (errno)); return 1; } if (verbose) fprintf (stderr, "Trying %s port %s...", hostaddr, portnr); if ((sock = socket (aip->ai_family, aip->ai_socktype, aip->ai_protocol)) == -1) { if (verbose) fprintf (stderr, " Could not open socket: %s\n", strerror (errno)); continue; } hint.ai_family = aip->ai_family; /* Bind to a privileged port */ for (i = 1023; i >= 512; i--) { snprintf (lport, sizeof (lport), "%d", i); err = getaddrinfo (NULL, lport, &hint, &lai); if (err) { fprintf (stderr, " Error looking up localhost: %s\n", gai_strerror (err)); return 1; } err = bind (sock, lai->ai_addr, lai->ai_addrlen); freeaddrinfo (lai); if (err) continue; else break; } if (err) { if (verbose) fprintf (stderr, " Could not bind to privileged port: %s\n", strerror (errno)); continue; } if (connect (sock, aip->ai_addr, aip->ai_addrlen) == -1) { if (verbose) fprintf (stderr, " Connection failed: %s\n", strerror (errno)); continue; } if (verbose) fprintf (stderr, " Connected.\n"); break; } if (!aip) { fprintf (stderr, "%s: Could not make a connection.\n", argv0); return 1; } /* Create a socket for the incoming connection for stderr output */ if ((lsock = socket (aip->ai_family, aip->ai_socktype, aip->ai_protocol)) == -1) { fprintf (stderr, "%s: Could not open socket: %s\n", argv0, strerror (errno)); return 1; } hint.ai_family = aip->ai_family; freeaddrinfo (ai); for (i--; i >= 512; i--) { snprintf (lport, sizeof (lport), "%d", i); err = getaddrinfo (NULL, lport, &hint, &lai); if (err) { fprintf (stderr, "%s: Error looking up localhost: %s\n", argv0, gai_strerror (err)); return 1; } err = bind (lsock, lai->ai_addr, lai->ai_addrlen); freeaddrinfo (lai); if (err) continue; else break; } if (err) { fprintf (stderr, "%s: Could not bind to privileged port: %s\n", argv0, strerror (errno)); return 1; } if (listen (lsock, 1)) { fprintf (stderr, "%s: Could not listen: %s\n", argv0, strerror (errno)); return 1; } /* Drop privileges */ if (setuid (getuid ())) { fprintf (stderr, "%s: Unable to drop privileges: %s\n", argv0, strerror (errno)); return 1; } /* Send required information to the server */ bufp[0] = buf[0]; len[0] = sizeof (buf[0]); #ifdef SHISHI if (shishi) { if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } hostdata = gethostbyname (host); hostlen = strlen (hostdata->h_name) + strlen (SERVICE) + 2; sname = malloc (hostlen); snprintf (sname, hostlen, "%s/%s", SERVICE, hostdata->h_name); rc = optind; cmdlen = BUFLEN; cmd = malloc (cmdlen); tcmd = cmd; if (encryption) safecpy (&tcmd, &cmdlen, "-x ", 0); for (; optind < argc; optind++) { safecpy (&tcmd, &cmdlen, argv[optind], 0); if (optind < argc - 1) safecpy (&tcmd, &cmdlen, " ", 0); } safecpy (&tcmd, &cmdlen, "", 1); optind = rc; if (!user) user = (char *) shishi_principal_default (h); safewrite (sock, lport, strlen (lport) + 1); /* Wait for incoming connection from server */ if ((esock = accept (lsock, &raddr, &raddrlen)) == -1) { fprintf (stderr, "%s: Could not accept stderr connection: %s\n", argv0, strerror (errno)); return 1; } close (lsock); if (auth (h, 0, user, sname, sock, cmd, port, &enckey, deckey) != AUTH_OK) return 1; free (cmd); } else { safecpy (&bufp[0], &len[0], lport, 1); safecpy (&bufp[0], &len[0], luser, 1); } #else safecpy (&bufp[0], &len[0], lport, 1); safecpy (&bufp[0], &len[0], luser, 1); #endif safecpy (&bufp[0], &len[0], user, 1); #ifdef SHISHI if (encryption) safecpy (&bufp[0], &len[0], "-x ", 0); #endif for (; optind < argc; optind++) { safecpy (&bufp[0], &len[0], argv[optind], 0); if (optind < argc - 1) safecpy (&bufp[0], &len[0], " ", 0); } #ifdef SHISHI if (shishi) { safecpy (&bufp[0], &len[0], "", 1); safecpy (&bufp[0], &len[0], user, 1); } else #endif safecpy (&bufp[0], &len[0], "", 1); if (!len[0]) { fprintf (stderr, "%s: Arguments too long!\n", argv0); return 1; } if (safewrite (sock, buf[0], bufp[0] - buf[0]) == -1) { fprintf (stderr, "%s: Unable to send required information: %s\n", argv0, strerror (errno)); return 1; } #ifdef SHISHI if (shishi) { safewrite (sock, &auth2, sizeof (int)); } #endif /* Wait for acknowledgement from server */ errno = 0; if (read (sock, buf[0], 1) != 1 || *buf[0]) { fprintf (stderr, "%s: Didn't receive NULL byte from server: %s\n", argv0, strerror (errno)); return 1; } #ifdef SHISHI if (encryption) { ivlen = ivlen2 = ivlen3 = shishi_key_length (enckey); iv = malloc (ivlen); memset (iv, 1, ivlen); iv2 = malloc (ivlen2); memset (iv2, 3, ivlen2); iv3 = malloc (ivlen3); memset (iv3, 0, ivlen3); } if (!shishi) { /* Wait for incoming connection from server */ if ((esock = accept (lsock, &raddr, &raddrlen)) == -1) { fprintf (stderr, "%s: Could not accept stderr connection: %s\n", argv0, strerror (errno)); return 1; } close (lsock); } #else /* Wait for incoming connection from server */ if ((esock = accept (lsock, &raddr, &raddrlen)) == -1) { fprintf (stderr, "%s: Could not accept stderr connection: %s\n", argv0, strerror (errno)); return 1; } close (lsock); #endif /* Process input/output */ flags = fcntl (sock, F_GETFL); fcntl (sock, F_SETFL, flags | O_NONBLOCK); flags = fcntl (esock, F_GETFL); fcntl (esock, F_SETFL, flags | O_NONBLOCK); bufp[0] = buf[0]; bufp[1] = buf[1]; bufp[2] = buf[2]; FD_ZERO (&infdset); FD_ZERO (&outfdset); FD_SET (0, &infdset); FD_SET (sock, &infdset); FD_SET (esock, &infdset); maxfd = (sock > esock ? sock : esock) + 1; for (;;) { errno = 0; infd = infdset; outfd = outfdset; errfd = infdset; if (select (maxfd, &infd, &outfd, &errfd, NULL) <= 0) { if (errno == EINTR) continue; else break; } if (FD_ISSET (esock, &infd)) { #ifdef SHISHI if (encryption) { rc = readenc (h, esock, buf[2], &len[2], iv2, &ivlen2, enckey); if (rc != SHISHI_OK) break; } else #endif len[2] = read (esock, buf[2], BUFLEN); if (len[2] <= 0) { if (errno != EINTR) { if (FD_ISSET (sock, &infdset) || FD_ISSET (1, &outfdset)) FD_CLR (esock, &infdset); else break; } } else { FD_SET (2, &outfdset); FD_CLR (esock, &infdset); } } if (FD_ISSET (2, &outfd)) { wlen = write (2, bufp[2], len[2]); if (wlen <= 0) { if (errno != EINTR) { if (FD_ISSET (sock, &infdset) || FD_ISSET (1, &outfdset)) FD_CLR (esock, &infdset); else break; } } else { len[2] -= wlen; bufp[2] += wlen; if (!len[2]) { FD_CLR (2, &outfdset); FD_SET (esock, &infdset); bufp[2] = buf[2]; } } } if (FD_ISSET (sock, &infd)) { #ifdef SHISHI if (encryption) { rc = readenc (h, sock, buf[1], &len[1], iv, &ivlen, enckey); if (rc != SHISHI_OK) break; } else #endif len[1] = read (sock, buf[1], BUFLEN); if (len[1] <= 0) { if (errno != EINTR) { if (FD_ISSET (esock, &infdset) || FD_ISSET (2, &outfdset)) FD_CLR (sock, &infdset); else break; } } else { FD_SET (1, &outfdset); FD_CLR (sock, &infdset); } } if (FD_ISSET (1, &outfd)) { wlen = write (1, bufp[1], len[1]); if (wlen <= 0) { if (errno != EINTR) { if (FD_ISSET (esock, &infdset) || FD_ISSET (2, &outfdset)) FD_CLR (sock, &infdset); else break; } } else { len[1] -= wlen; bufp[1] += wlen; if (!len[1]) { FD_CLR (1, &outfdset); FD_SET (sock, &infdset); bufp[1] = buf[1]; } } } if (FD_ISSET (0, &infd)) { len[0] = read (0, buf[0], BUFLEN); if (len[0] <= 0) { if (errno != EINTR) { FD_CLR (0, &infdset); shutdown (sock, SHUT_WR); } } else { FD_SET (sock, &outfdset); FD_CLR (0, &infdset); } } if (FD_ISSET (sock, &outfd)) { #ifdef SHISHI if (encryption) { rc = writeenc (h, sock, bufp[0], len[0], &wlen, iv3, &ivlen3, enckey); if (rc != SHISHI_OK) break; } else #endif wlen = write (sock, bufp[0], len[0]); if (wlen <= 0) { if (errno != EINTR) break; } else { len[0] -= wlen; bufp[0] += wlen; if (!len[0]) { FD_CLR (sock, &outfdset); FD_SET (0, &infdset); bufp[0] = buf[0]; } } } } if (errno) { fprintf (stderr, "%s: %s\n", argv0, strerror (errno)); return 1; } close (sock); close (esock); #ifdef SHISHI if (shishi) { shishi_done (h); if (encryption) { free (iv); free (iv2); free (iv3); } } #endif return 0; } shishi-1.0.2/extra/rsh-redone/rlogin.10000664000000000000000000000232412015626624014444 00000000000000.Dd Sun, 13 Apr 2003 00:24:32 +0200 .Dt RLOGIN 1 .Sh NAME .Nm rlogin .Nd remote login .Sh SYNOPSIS .Nm .Op Fl 46 .Op Fl l Ar user .Op Fl p Ar port .Op Ar user Ns Li @ Ns .Ar host .Op Ar command .Sh DESCRIPTION .Nm makes a connection to the remote login daemon running on .Ar host . After the connection is made the user can log in. All input is transmitted to the remote machine and all output on the remote machine is sent back to the .Nm client on the local machine, the user has a full controlling terminal on the remote host. .Pp Without a .Ar command , the users login shell will be presented. If a .Ar command is present, it will be passed on to the .Nm rlogind on the remote host. It will be executed in the same way as with .Nm rsh . This is a non-standard extension that may not work with other versions of .Nm rlogind ! .Sh OPTIONS .Bl -tag -width flag .It Fl 4 Use only IPv4 to connect to the remote host. .It Fl 6 Use only IPv6 to connect to the remote host. .It Fl l Ar user Connect to the remote machine as a different user than on the local machine. .It Fl p Ar port Connect to a different port than the default one for .Nm . .El .Sh SEE ALSO .Xr rsh 1 , .Xr rshd 8 , .Xr rlogind 8 , .Xr rcp 1 , .Xr rhosts 5 , RFC 1282. shishi-1.0.2/extra/rsh-redone/Makefile.in0000644000000000000000000015601112126772725015145 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2003-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = rlogin$(EXEEXT) rsh$(EXEEXT) subdir = extra/rsh-redone DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_rlogin_OBJECTS = rlogin.$(OBJEXT) rlogin_OBJECTS = $(am_rlogin_OBJECTS) rlogin_LDADD = $(LDADD) rlogin_DEPENDENCIES = ../../lib/libshishi.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am_rsh_OBJECTS = rsh.$(OBJEXT) rsh_OBJECTS = $(am_rsh_OBJECTS) rsh_LDADD = $(LDADD) rsh_DEPENDENCIES = ../../lib/libshishi.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(rlogin_SOURCES) $(rsh_SOURCES) DIST_SOURCES = $(rlogin_SOURCES) $(rsh_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = -DSHISHI @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_builddir)/lib EXTRA_DIST = $(man_MANS) LDADD = ../../lib/libshishi.la rlogin_SOURCES = rlogin.c rsh_SOURCES = rsh.c man_MANS = rlogin.1 rsh.1 all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu extra/rsh-redone/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu extra/rsh-redone/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list rlogin$(EXEEXT): $(rlogin_OBJECTS) $(rlogin_DEPENDENCIES) $(EXTRA_rlogin_DEPENDENCIES) @rm -f rlogin$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rlogin_OBJECTS) $(rlogin_LDADD) $(LIBS) rsh$(EXEEXT): $(rsh_OBJECTS) $(rsh_DEPENDENCIES) $(EXTRA_rsh_DEPENDENCIES) @rm -f rsh$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rsh_OBJECTS) $(rsh_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rlogin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsh.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/extra/rsh-redone/rlogin.c0000664000000000000000000005174112015626624014535 00000000000000/* rlogin.c - remote login client Copyright (C) 2003 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. 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 Street, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef SHISHI #include #define SERVICE "host" #define AUTH_OK 0 #endif #define BUFLEN 0x10000 char *argv0; #ifdef SHISHI void usage (void) { fprintf (stderr, "Usage: rlogin [-46vsx] [-l user] [-p port] [user@]host\n"); } #else void usage (void) { fprintf (stderr, "Usage: rlogin [-46v] [-l user] [-p port] [user@]host\n"); } #endif /* Make sure everything gets written */ ssize_t safewrite (int fd, const void *buf, size_t count) { int written = 0, result; while (count) { result = write (fd, buf, count); if (result == -1) { if (errno == EINTR) continue; else return result; } written += result; buf += result; count -= result; } return written; } /* Safe and fast string building */ void safecpy (char **dest, int *len, char *source, bool terminate) { while (*source && *len) { *(*dest)++ = *source++; (*len)--; } if (terminate && *len) { *(*dest)++ = 0; (*len)--; } } /* Convert termios speed to a string */ char * termspeed (speed_t speed) { switch (speed) { case B0: return "0"; case B50: return "50"; case B75: return "75"; case B110: return "110"; case B134: return "134"; case B150: return "150"; case B200: return "200"; case B300: return "300"; case B600: return "600"; case B1200: return "1200"; case B1800: return "1800"; case B2400: return "2400"; case B4800: return "4800"; case B9600: return "9600"; case B19200: return "19200"; case B38400: return "38400"; case B57600: return "57600"; case B115200: return "115200"; case B230400: return "230400"; case B460800: return "460800"; case B500000: return "500000"; case B576000: return "576000"; case B921600: return "921600"; case B1000000: return "1000000"; case B1152000: return "1152000"; case B1500000: return "1500000"; case B2000000: return "2000000"; case B2500000: return "2500000"; case B3000000: return "3000000"; case B3500000: return "3500000"; case B4000000: return "4000000"; default: return "9600"; } } #ifdef SHISHI /* read encrypted data on socket */ int readenc (Shishi * h, int sock, char *buf, int *len, char *iv, int *ivlen, Shishi_key * enckey) { char *out; char *outbis; char *iv2; int rc; int val; int outlen; int dlen = 0, blocksize, enctype, hashsize; /* read size of message */ read (sock, &dlen, sizeof (int)); dlen = ntohl (dlen); /* if 0 put read size to 0 */ if (!dlen) { *len = dlen; return SHISHI_OK; } /* convert size to encryption size */ enctype = shishi_key_type (enckey); blocksize = shishi_cipher_blocksize (enctype); hashsize = shishi_checksum_cksumlen (shishi_cipher_defaultcksumtype (enctype)); dlen += blocksize - 1 + 4; if (shishi_key_type (enckey) != SHISHI_DES3_CBC_HMAC_SHA1_KD) dlen += hashsize; else dlen += blocksize; dlen /= blocksize; dlen *= blocksize; if (shishi_key_type (enckey) == SHISHI_DES3_CBC_HMAC_SHA1_KD) dlen += hashsize; /* read encrypted data */ outbis = malloc (dlen); if (outbis == NULL) { printf ("Malloc error!\n"); return 1; } rc = read (sock, outbis, dlen); if (rc != dlen) { printf ("Error during read socket\n"); return 1; } /* decrypt it */ rc = shishi_decrypt_ivupdate (h, enckey, 1026, iv, *ivlen, &iv2, ivlen, outbis, dlen, &out, &outlen); if (rc != SHISHI_OK) { printf ("decryption error\n"); return 1; } /* len = first 4 bytes of decrypted data */ *len = ntohl (*((int *) out)); /* update iv */ memcpy (iv, iv2, *ivlen); /* Temp patch to remove 5 unidentified bytes data from server */ memset (buf, 0, BUFLEN); if ((unsigned char) out[4] == 255) val = 5 + sizeof (int); else val = sizeof (int); /* copy decrypted data to output */ memcpy (buf, out + val, strlen (out + val)); free (out); free (outbis); return SHISHI_OK; } /* write encrypted data to socket */ int writeenc (Shishi * h, int sock, char *buf, int wlen, int *len, char *iv, int *ivlen, Shishi_key * enckey) { char *out; char *bufbis; char *iv2; int rc; int dlen, outlen; dlen = wlen; dlen = htonl (dlen); /* data to encrypt = size + data */ bufbis = malloc (wlen + sizeof (int)); memcpy (bufbis, (char *) &dlen, sizeof (int)); memcpy (bufbis + sizeof (int), buf, wlen); /* encrypt it */ rc = shishi_encrypt_ivupdate (h, enckey, 1026, iv, *ivlen, &iv2, ivlen, bufbis, wlen + sizeof (int), &out, &outlen); if (rc != SHISHI_OK) { printf ("decryption error\n"); return 1; } free (bufbis); /* data to send = original size + encrypted data */ bufbis = malloc (outlen + sizeof (int)); if (bufbis == NULL) { printf ("Malloc error!\n"); return 1; } memcpy (bufbis, (char *) &dlen, sizeof (int)); memcpy (bufbis + sizeof (int), out, outlen); /* send it */ write (sock, bufbis, outlen + sizeof (int)); *len = wlen; /* update iv */ memcpy (iv, iv2, *ivlen); free (bufbis); free (out); return SHISHI_OK; } /* shishi authentication */ int auth (Shishi * h, int verbose, const char *cname, const char *sname, int sock, char *cmd, char *port, Shishi_key ** enckey, Shishi_key * deckey) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; char *out; int outlen; int krb5len, msglen; char auth; /* KERBEROS 5 SENDAUTH MESSAGE */ char krb5sendauth[] = "KRB5_SENDAUTH_V1.0"; /* PROTOCOL VERSION */ char krb5sendclient[] = "KCMDV0.2"; /* to store error msg sent by server */ char errormsg[101]; char cksumdata[101]; /* size of KRB5 auth message */ krb5len = strlen (krb5sendauth) + 1; msglen = htonl (krb5len); safewrite (sock, &msglen, sizeof (int)); /* KRB5 authentication message */ safewrite (sock, krb5sendauth, krb5len); /* size of client message */ krb5len = strlen (krb5sendclient) + 1; msglen = htonl (krb5len); safewrite (sock, &msglen, sizeof (int)); /* KRB5 client message */ safewrite (sock, krb5sendclient, krb5len); /* get answer from server 0 = ok, 1 = error with message */ read (sock, &auth, 1); if (auth) { read (sock, errormsg, 100); errormsg[100] = '\0'; printf ("Error during server authentication : %s\n", errormsg); return 1; } if (verbose) { printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); } /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return 1; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return 1; } /* checksum = port: terminal name */ snprintf (cksumdata, 100, "%s:%s%s", port, cmd, cname); /* add checksum to authenticator */ shishi_ap_authenticator_cksumdata_set (ap, cksumdata, strlen (cksumdata)); /* To be compatible with MIT rlogind */ shishi_ap_authenticator_cksumtype_set (ap, SHISHI_RSA_MD5); /* create der encoded AP-REQ */ rc = shishi_ap_req_der (ap, &out, &outlen); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return 1; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* extract subkey if present from ap exchange for secure connection */ shishi_authenticator_get_subkey (h, shishi_ap_authenticator (ap), enckey); /* send size of AP-REQ to the server */ msglen = htonl (outlen); safewrite (sock, (char *) &msglen, sizeof (int)); /* send AP-REQ to the server */ safewrite (sock, out, outlen); /* read a respond from server - what ? */ read (sock, &auth, sizeof (int)); /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { if (verbose) printf ("Waiting for server to authenticate itself...\n"); /* read size of the AP-REP */ read (sock, (char *) &outlen, sizeof (int)); /* read AP-REP */ outlen = ntohl (outlen); outlen = read (sock, out, outlen); rc = shishi_ap_rep_verify_der (ap, out, outlen); if (rc == SHISHI_OK) { if (verbose) printf ("AP-REP verification OK...\n"); } else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return 1; } /* The server is authenticated. */ if (verbose) printf ("Server authenticated.\n"); } /* We are now authenticated. */ if (verbose) printf ("User authenticated.\n"); return AUTH_OK; } #endif int main (int argc, char **argv) { char *user = NULL; char *luser = NULL; char *host = NULL; char *port = "login"; char *p; char lport[5]; struct passwd *pw; int af = AF_UNSPEC; struct addrinfo hint, *ai, *aip, *lai; int err, i; int opt; bool verbose = false; int sock = -1; bool winchsupport = false; char hostaddr[NI_MAXHOST]; char portnr[NI_MAXSERV]; struct termios tios, oldtios; char *term, *speed; char buf[2][BUFLEN], *bufp[2]; int len[2], wlen; fd_set infd, outfd, infdset, outfdset, exfd, exfdset; int maxfd; int flags; int oldmask; #ifdef SHISHI Shishi *h; Shishi_key *enckey = NULL, *deckey = NULL; int rc; char *sname = NULL; int shishi = 0; int encryption = 0; int auth2 = 0; char cmd[BUFLEN]; int hostlen; struct hostent *hostdata; char *iv = NULL; char *iv2 = NULL; int ivlen; int ivlen2; #endif argv0 = argv[0]; /* Lookup local username */ if (!(pw = getpwuid (getuid ()))) { fprintf (stderr, "%s: Could not lookup username: %s\n", argv0, strerror (errno)); return 1; } /* Process options */ #ifdef SHISHI while ((opt = getopt (argc, argv, "+l:p:46vsx")) != -1) #else while ((opt = getopt (argc, argv, "+l:p:46v")) != -1) #endif { switch (opt) { case 'l': user = optarg; break; case 'p': port = optarg; break; case '4': af = AF_INET; break; case '6': af = AF_INET6; break; case 'v': verbose = true; break; #ifdef SHISHI case 's': shishi = 1; if (!encryption) port = "543"; break; case 'x': encryption = 1; port = "2105"; break; #endif default: fprintf (stderr, "%s: Unknown option!\n", argv0); usage (); return 1; } } if (optind == argc) { fprintf (stderr, "%s: No host specified!\n", argv0); usage (); return 1; } #ifdef SHISHI if (!shishi) { luser = pw->pw_name; if (!user) user = luser; } #endif host = argv[optind++]; if ((p = strchr (host, '@'))) { user = host; *p = '\0'; host = p + 1; } /* Resolve hostname and try to make a connection */ memset (&hint, '\0', sizeof (hint)); hint.ai_family = af; hint.ai_socktype = SOCK_STREAM; err = getaddrinfo (host, port, &hint, &ai); if (err) { fprintf (stderr, "%s: Error looking up host: %s\n", argv0, gai_strerror (err)); return 1; } hint.ai_flags = AI_PASSIVE; for (aip = ai; aip; aip = aip->ai_next) { if (getnameinfo (aip->ai_addr, aip->ai_addrlen, hostaddr, sizeof (hostaddr), portnr, sizeof (portnr), NI_NUMERICHOST | NI_NUMERICSERV)) { fprintf (stderr, "%s: Error resolving address: %s\n", argv0, strerror (errno)); return 1; } if (verbose) fprintf (stderr, "Trying %s port %s...", hostaddr, portnr); if ((sock = socket (aip->ai_family, aip->ai_socktype, aip->ai_protocol)) == -1) { if (verbose) fprintf (stderr, " Could not open socket: %s\n", strerror (errno)); continue; } hint.ai_family = aip->ai_family; /* Bind to a privileged port */ for (i = 1023; i >= 512; i--) { snprintf (lport, sizeof (lport), "%d", i); err = getaddrinfo (NULL, lport, &hint, &lai); if (err) { fprintf (stderr, " Error looking up localhost: %s\n", gai_strerror (err)); return 1; } err = bind (sock, lai->ai_addr, lai->ai_addrlen); freeaddrinfo (lai); if (err) continue; else break; } if (err) { if (verbose) fprintf (stderr, " Could not bind to privileged port: %s\n", strerror (errno)); continue; } if (connect (sock, aip->ai_addr, aip->ai_addrlen) == -1) { if (verbose) fprintf (stderr, " Connection failed: %s\n", strerror (errno)); continue; } if (verbose) fprintf (stderr, " Connected.\n"); break; } if (!aip) { fprintf (stderr, "%s: Could not make a connection.\n", argv0); return 1; } freeaddrinfo (ai); /* Drop privileges */ if (setuid (getuid ())) { fprintf (stderr, "%s: Unable to drop privileges: %s\n", argv0, strerror (errno)); return 1; } /* Send required information to the server */ term = getenv ("TERM") ? : "network"; if (tcgetattr (0, &tios)) { fprintf (stderr, "%s: Unable to get terminal attributes: %s\n", argv0, strerror (errno)); return 1; } speed = termspeed (cfgetispeed (&tios)); bufp[0] = buf[0]; len[0] = sizeof (buf[0]); #ifdef SHISHI if (shishi) { if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } hostdata = gethostbyname (host); hostlen = strlen (hostdata->h_name) + strlen (SERVICE) + 2; sname = malloc (hostlen); snprintf (sname, hostlen, "%s/%s", SERVICE, hostdata->h_name); snprintf (cmd, BUFLEN, "%s/%s", term, speed); if (!user) user = (char *) shishi_principal_default (h); safewrite (sock, "", 1); if (auth (h, 0, user, sname, sock, cmd, port, &enckey, deckey) != AUTH_OK) return 1; } else { safecpy (&bufp[0], &len[0], "", 1); safecpy (&bufp[0], &len[0], luser, 1); } #else safecpy (&bufp[0], &len[0], "", 1); safecpy (&bufp[0], &len[0], luser, 1); #endif safecpy (&bufp[0], &len[0], user, 1); safecpy (&bufp[0], &len[0], term, 0); safecpy (&bufp[0], &len[0], "/", 0); safecpy (&bufp[0], &len[0], speed, 0); for (; optind < argc; optind++) { safecpy (&bufp[0], &len[0], "/", 0); safecpy (&bufp[0], &len[0], argv[optind], 0); } #ifdef SHISHI if (shishi) { safecpy (&bufp[0], &len[0], "", 1); safecpy (&bufp[0], &len[0], user, 1); } else #endif safecpy (&bufp[0], &len[0], "", 1); if (!len[0]) { fprintf (stderr, "%s: Arguments too long!\n", argv0); return 1; } if (safewrite (sock, buf[0], bufp[0] - buf[0]) == -1) { fprintf (stderr, "%s: Unable to send required information: %s\n", argv0, strerror (errno)); return 1; } #ifdef SHISHI if (shishi) { safewrite (sock, &auth2, sizeof (int)); } #endif /* Wait for acknowledgement from server */ errno = 0; if (read (sock, buf[0], 1) != 1 || *buf[0]) { fprintf (stderr, "%s: Didn't receive NULL byte from server: %s\n", argv0, strerror (errno)); return 1; } #ifdef SHISHI if (!encryption) /* unidentified bytes */ read (sock, cmd, 5); else { ivlen = ivlen2 = shishi_key_length (enckey); iv = malloc (ivlen); memset (iv, 1, ivlen); iv2 = malloc (ivlen2); memset (iv2, 0, ivlen2); } #endif /* Set up terminal on the client */ oldtios = tios; tios.c_oflag &= ~(ONLCR | OCRNL); tios.c_lflag &= ~(ECHO | ICANON | ISIG); tios.c_iflag &= ~(ICRNL | ISTRIP | IXON); tios.c_cc[VTIME] = 1; tios.c_cc[VMIN] = 1; /* How much of the stuff below is really needed? tios.c_cc[VSUSP] = 255; tios.c_cc[VEOL] = 255; tios.c_cc[VREPRINT] = 255; tios.c_cc[VDISCARD] = 255; tios.c_cc[VWERASE] = 255; tios.c_cc[VLNEXT] = 255; tios.c_cc[VEOL2] = 255; */ tcsetattr (0, TCSADRAIN, &tios); /* Process input/output */ flags = fcntl (sock, F_GETFL); fcntl (sock, F_SETFL, flags | O_NONBLOCK); bufp[0] = buf[0]; bufp[1] = buf[1]; maxfd = sock + 1; FD_ZERO (&infdset); FD_ZERO (&outfdset); FD_ZERO (&exfdset); FD_SET (0, &infdset); FD_SET (sock, &infdset); FD_SET (sock, &exfdset); /* Handle SIGWINCH */ void sigwinch_h (int signal) { char wbuf[12]; struct winsize winsize; if (winchsupport) { wbuf[0] = wbuf[1] = (char) 0xFF; wbuf[2] = wbuf[3] = 's'; ioctl (0, TIOCGWINSZ, &winsize); *(uint16_t *) (wbuf + 4) = htons (winsize.ws_row); *(uint16_t *) (wbuf + 6) = htons (winsize.ws_col); *(uint16_t *) (wbuf + 8) = htons (winsize.ws_xpixel); *(uint16_t *) (wbuf + 10) = htons (winsize.ws_ypixel); if (bufp[0] == buf[0]) len[0] = 0; memcpy (bufp[0] + len[0], wbuf, 12); len[0] += 12; FD_SET (sock, &outfdset); FD_CLR (0, &infdset); FD_CLR (0, &infd); } } if (signal (SIGWINCH, sigwinch_h) == SIG_ERR) { fprintf (stderr, "%s: signal() failed: %s\n", argv0, strerror (errno)); return 1; } for (;;) { errno = 0; infd = infdset; outfd = outfdset; exfd = exfdset; if (select (maxfd, &infd, &outfd, &exfd, NULL) <= 0) { if (errno == EINTR) continue; else break; } oldmask = sigblock (sigmask (SIGWINCH)); if (FD_ISSET (sock, &exfd)) { len[1] = recv (sock, buf[1], 1, MSG_OOB); if (len[1] <= 0) { break; } else { if (*buf[1] == (char) 0x80) { winchsupport = true; sigwinch_h (SIGWINCH); } } } if (FD_ISSET (sock, &infd)) { #ifdef SHISHI if (encryption) { rc = readenc (h, sock, buf[1], &len[1], iv, &ivlen, enckey); if (rc != SHISHI_OK) break; } else #endif len[1] = read (sock, buf[1], BUFLEN); if (len[1] <= 0) { if (errno != EINTR) break; } else { FD_SET (1, &outfdset); FD_CLR (sock, &infdset); } } if (FD_ISSET (1, &outfd)) { wlen = write (1, bufp[1], len[1]); if (wlen <= 0) { if (errno != EINTR) break; } else { len[1] -= wlen; bufp[1] += wlen; if (!len[1]) { FD_CLR (1, &outfdset); FD_SET (sock, &infdset); bufp[1] = buf[1]; } } } if (FD_ISSET (0, &infd)) { len[0] = read (0, buf[0], BUFLEN); if (len[0] <= 0) { if (errno != EINTR) { FD_CLR (0, &infdset); shutdown (sock, SHUT_WR); } } else { FD_SET (sock, &outfdset); FD_CLR (0, &infdset); } } if (FD_ISSET (sock, &outfd)) { #ifdef SHISHI if (encryption) { rc = writeenc (h, sock, bufp[0], len[0], &wlen, iv2, &ivlen2, enckey); if (rc != SHISHI_OK) break; } else #endif wlen = write (sock, bufp[0], len[0]); if (wlen <= 0) { if (errno != EINTR) break; } else { len[0] -= wlen; bufp[0] += wlen; if (!len[0]) { FD_CLR (sock, &outfdset); FD_SET (0, &infdset); bufp[0] = buf[0]; } } } sigsetmask (oldmask); } /* Clean up */ if (errno) fprintf (stderr, "%s: %s\n", argv0, strerror (errno)); tcsetattr (0, TCSADRAIN, &oldtios); #ifdef SHISHI if (shishi) { shishi_done (h); if (encryption) { free (iv); free (iv2); } } #endif close (sock); return 0; } shishi-1.0.2/extra/Makefile.am0000664000000000000000000000170612126660507013062 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. EXTRA_DIST = fetchmail.diff fetchmail.mail DIST_SUBDIRS = pam_shishi rsh-redone SUBDIRS = @PAM_SHISHI@ shishi-1.0.2/extra/pam_shishi/0000755000000000000000000000000012126773323013225 500000000000000shishi-1.0.2/extra/pam_shishi/Makefile.am0000644000000000000000000000232012126764330015174 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/lib -I$(top_builddir)/gl -I$(top_builddir)/lib libdir = $(PAMDIR) lib_LTLIBRARIES = pam_shishi.la pam_shishi_la_SOURCES = pam_shishi.c pam_shishi_la_LIBADD = ../../lib/libshishi.la # XXX add -Wl,-x too? PAM documentation suggests it. pam_shishi_la_LDFLAGS = -module -shared -avoid-version # -DDEBUG_PAM DEFS = @DEFS@ shishi-1.0.2/extra/pam_shishi/Makefile.in0000644000000000000000000014761312126772724015232 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = extra/pam_shishi DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) pam_shishi_la_DEPENDENCIES = ../../lib/libshishi.la am_pam_shishi_la_OBJECTS = pam_shishi.lo pam_shishi_la_OBJECTS = $(am_pam_shishi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent pam_shishi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(pam_shishi_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(pam_shishi_la_SOURCES) DIST_SOURCES = $(pam_shishi_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ # -DDEBUG_PAM DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = $(PAMDIR) libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/lib -I$(top_builddir)/gl -I$(top_builddir)/lib lib_LTLIBRARIES = pam_shishi.la pam_shishi_la_SOURCES = pam_shishi.c pam_shishi_la_LIBADD = ../../lib/libshishi.la # XXX add -Wl,-x too? PAM documentation suggests it. pam_shishi_la_LDFLAGS = -module -shared -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu extra/pam_shishi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu extra/pam_shishi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done pam_shishi.la: $(pam_shishi_la_OBJECTS) $(pam_shishi_la_DEPENDENCIES) $(EXTRA_pam_shishi_la_DEPENDENCIES) $(AM_V_CCLD)$(pam_shishi_la_LINK) -rpath $(libdir) $(pam_shishi_la_OBJECTS) $(pam_shishi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_shishi.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/extra/pam_shishi/pam_shishi.c0000664000000000000000000001504412015626624015441 00000000000000/* pam_shishi.c PAM module using Shishi. * Copyright (C) 2002-2012 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H #include "config.h" #endif #ifdef STDC_HEADERS #include #include #include #include #endif #include /* Libtool defines PIC for shared objects */ #ifndef PIC #define PAM_STATIC #endif /* These #defines must be present according to PAM documentation. */ #define PAM_SM_AUTH #define PAM_SM_ACCOUNT #define PAM_SM_SESSION #define PAM_SM_PASSWORD #ifdef HAVE_SECURITY_PAM_APPL_H #include #endif #ifdef HAVE_SECURITY_PAM_MODULES_H #include #endif #if defined DEBUG_PAM && defined HAVE_SECURITY__PAM_MACROS_H #define DEBUG #include #else #define D(x) /* nothing */ #endif #ifndef PAM_EXTERN #ifdef PAM_STATIC #define PAM_EXTERN static #else #define PAM_EXTERN extern #endif #endif PAM_EXTERN int pam_sm_authenticate (pam_handle_t * pamh, int flags, int argc, const char **argv) { Shishi *h = NULL; Shishi_key *key = NULL; Shishi_tkt *tkt = NULL; int retval, rc; const char *user = NULL; const char *password = NULL; int i; struct pam_conv *conv; struct pam_message *pmsg[1], msg[1]; struct pam_response *resp; int nargs = 1; D (("called.")); D (("flags %d argc %d", flags, argc)); for (i = 0; i < argc; i++) D (("argv[%d]=%s", i, argv[i])); rc = shishi_init (&h); if (rc != SHISHI_OK) { h = NULL; D (("shishi_init() failed: %s", shishi_strerror (retval))); retval = PAM_AUTHINFO_UNAVAIL; goto done; } retval = pam_get_user (pamh, &user, NULL); if (retval != PAM_SUCCESS) { D (("get user returned error: %s", pam_strerror (pamh, retval))); goto done; } D (("get user returned: %s", user)); shishi_principal_default_set (h, user); retval = pam_get_item (pamh, PAM_AUTHTOK, (const void **) &password); if (retval != PAM_SUCCESS) { D (("get password returned error: %s", pam_strerror (pamh, retval))); goto done; } D (("get password returned: %s", password)); if (password == NULL) { retval = pam_get_item (pamh, PAM_CONV, (const void **) &conv); if (retval != PAM_SUCCESS) { D (("get conv returned error: %s", pam_strerror (pamh, retval))); goto done; } pmsg[0] = &msg[0]; asprintf ((char **) &msg[0].msg, "Password for `%s@%s': ", shishi_principal_default (h), shishi_realm_default (h)); msg[0].msg_style = PAM_PROMPT_ECHO_OFF; resp = NULL; retval = conv->conv (nargs, (const struct pam_message **) pmsg, &resp, conv->appdata_ptr); free ((char *) msg[0].msg); if (retval != PAM_SUCCESS) { D (("conv returned error: %s", pam_strerror (pamh, retval))); goto done; } D (("conv returned: %s", resp->resp)); password = resp->resp; retval = pam_set_item (pamh, PAM_AUTHTOK, password); if (retval != PAM_SUCCESS) { D (("set_item returned error: %s", pam_strerror (pamh, retval))); goto done; } } tkt = shishi_tkts_get_for_localservicepasswd (shishi_tkts_default (h), "host", password); if (tkt == NULL) { D (("TGS exchange failed: %s\n", shishi_error (h))); retval = PAM_AUTHINFO_UNAVAIL; goto done; } key = shishi_hostkeys_for_localservice (h, "host"); if (key == NULL) { D (("Key not found: %s\n", shishi_error (h))); retval = PAM_AUTHINFO_UNAVAIL; goto done; } rc = shishi_tkt_decrypt (tkt, key); if (rc != SHISHI_OK) { D (("Could not decrypt ticket: %s\n", shishi_strerror (rc))); retval = PAM_AUTHINFO_UNAVAIL; goto done; } retval = PAM_SUCCESS; done: if (h) shishi_done (h); pam_set_data (pamh, "shishi_setcred_return", (void *) retval, NULL); D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } PAM_EXTERN int pam_sm_setcred (pam_handle_t * pamh, int flags, int argc, const char **argv) { int retval; int auth_retval; D (("called.")); retval = pam_get_data (pamh, "shishi_setcred_return", (const void **) &auth_retval); if (retval != PAM_SUCCESS) return PAM_CRED_UNAVAIL; /* XXX save ticket in user's file here XXX support CRED_EXPIRED */ switch (auth_retval) { case PAM_SUCCESS: retval = PAM_SUCCESS; break; case PAM_USER_UNKNOWN: retval = PAM_USER_UNKNOWN; break; case PAM_AUTH_ERR: default: retval = PAM_CRED_ERR; break; } D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } PAM_EXTERN int pam_sm_acct_mgmt (pam_handle_t * pamh, int flags, int argc, const char **argv) { int retval; D (("called.")); /* TODO: check if password expired? */ retval = PAM_SUCCESS; D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } PAM_EXTERN int pam_sm_open_session (pam_handle_t * pamh, int flags, int argc, const char **argv) { int retval; D (("called.")); /* TODO: afslog()? */ retval = PAM_SUCCESS; D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } PAM_EXTERN int pam_sm_close_session (pam_handle_t * pamh, int flags, int argc, const char **argv) { int retval; D (("called.")); /* TODO: destroy tickets? destroy AFS tokens? */ retval = PAM_SUCCESS; D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } PAM_EXTERN int pam_sm_chauthtok (pam_handle_t * pamh, int flags, int argc, const char **argv) { int retval; D (("called.")); /* TODO: Change password */ retval = PAM_SUCCESS; D (("done. [%s]", pam_strerror (pamh, retval))); return retval; } #ifdef PAM_STATIC struct pam_module _pam_shishi_modstruct = { "pam_shishi", pam_sm_authenticate, pam_sm_setcred, pam_sm_acct_mgmt, pam_sm_open_session, pam_sm_close_session, pam_sm_chauthtok }; #endif shishi-1.0.2/extra/fetchmail.mail0000664000000000000000000000424412015626624013625 00000000000000From: Simon Josefsson -*- mail -*- Subject: [PATCH] Fetchmail support for a new GSS-API library To: Eric S. Raymond Hello, I'm implementing Kerberos 5 and GSS-API, and thought it might be a good idea to test how well it works by making fetchmail use my library instead of Heimdal/MIT. As it turned out, I didn't have to make many modifications. My ego credit my own projects for that, but I guess fetchmail deserve some credit for being nicely written... take your pick. :-) Anyway, here is a patch (against fetchmail 6.2.5) to detect and use GSS when it is installed. I perceived the intention with the current configure.in snippet with regards to selecting Heimdal vs MIT was to use the least common implementation, if it is installed. I think that is a wise policy, as it probably leads to least surprises for users: with the current fetchmail logic, if users have both Heimdal and MIT installed, Heimdal is used. So the logic, with this patch, is for users with all of GSS, Heimdal and MIT installed, is to use GSS. Of course, in all cases, if a user only have one implementation installed, that one is used. The patch is made with --ignore-all-space to simplify review. You might want to re-indent the if-case after applying it. I couldn't find any ChangeLog file (or equivalent), and I don't know if you prefer to have patches accompanied with NEWS entries, but here is a proposed NEWS entry in any case: * The GSSAPI support can now use the GNU Generic Security library as well. I hope you find the time to look at the patch, and to hopefully even add it to the standard distribution. If there is anything I can do to improve the patch, I'll be happy to. FWIW, before I applied the patch I used fetchmail linked to MIT Kerberos to talk with a Cyrus IMAP server at my University, which uses Heimdal. After the patch I use fetchmail, linked to Shishi/GSS instead of MIT, against Heimdal at the University. I have only tried 3DES Kerberos keys. Thanks, Simon [1] , [[see file fetchmail.diff for the attached patch]] shishi-1.0.2/extra/Makefile.in0000644000000000000000000014607712126772724013111 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = extra DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = fetchmail.diff fetchmail.mail DIST_SUBDIRS = pam_shishi rsh-redone SUBDIRS = @PAM_SHISHI@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu extra/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu extra/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/extra/fetchmail.diff0000664000000000000000000000344612015626624013616 00000000000000diff --exclude fetchmail.pot --exclude configure --exclude aclocal.m4 -urw t/fetchmail-6.2.5/configure.in fetchmail-6.2.5/configure.in --- t/fetchmail-6.2.5/configure.in 2003-10-10 10:36:57.000000000 +0200 +++ fetchmail-6.2.5/configure.in 2003-12-31 22:38:47.000000000 +0100 @@ -704,6 +704,9 @@ LDFLAGS="$LDFLAGS -L$with_gssapi/lib" fi + AC_CHECK_LIB(gss, gss_check_version, LIBS="$LIBS -lgss", nogss=t) + if test -n "$nogss" + then if test -f "$with_gssapi/include/roken.h" then LIBS="$LIBS -lkrb5 -lasn1 -ldes -lroken -ldb -ldl" @@ -714,10 +717,11 @@ AC_CHECK_LIB(gssapi_krb5, gss_init_sec_context,LIBS="$LIBS -lgssapi_krb5", AC_MSG_ERROR([could not find libgssapi_krb5 which is needed for GSSAPI support]), -lkrb5) fi + fi AC_DEFINE(GSSAPI) save_CPPFLAGS=$CPPFLAGS CPPFLAGS="-I$with_gssapi/include" - AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h) + AC_CHECK_HEADERS(gss.h gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h) if test "$ac_cv_header_gssapi_h" = "yes"; then AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi.h, AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE)) else diff --exclude fetchmail.pot --exclude configure --exclude aclocal.m4 -urw t/fetchmail-6.2.5/gssapi.c fetchmail-6.2.5/gssapi.c --- t/fetchmail-6.2.5/gssapi.c 2003-07-17 03:03:22.000000000 +0200 +++ fetchmail-6.2.5/gssapi.c 2003-12-31 22:38:39.000000000 +0100 @@ -21,6 +21,9 @@ #include /* for htonl/ntohl */ #ifdef GSSAPI +# ifdef HAVE_GSS_H +# include +# else # ifdef HAVE_GSSAPI_H # include # endif @@ -33,6 +36,7 @@ # ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE # define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name # endif +# endif #define GSSAUTH_P_NONE 1 #define GSSAUTH_P_INTEGRITY 2 shishi-1.0.2/ABOUT-NLS0000644000000000000000000026713312126772676011153 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. 1.1 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. Installers may use special options at configuration time for changing the default behaviour. The command: ./configure --disable-nls will _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl' library and will decide to use it. If not, you may have to to use the `--with-libintl-prefix' option to tell `configure' where to look for it. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.2 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.3 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.4 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of June 2010. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am an ar as ast az be be@latin bg bn_IN bs ca +--------------------------------------------------+ a2ps | [] [] | aegis | | ant-phone | | anubis | | aspell | [] [] | bash | | bfd | | bibshelf | [] | binutils | | bison | | bison-runtime | [] | bluez-pin | [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | | dfarc | | dialog | [] [] | dico | | diffutils | [] | dink | | doodle | | e2fsprogs | [] | enscript | [] | exif | | fetchmail | [] | findutils | [] | flex | [] | freedink | | gas | | gawk | [] [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] [] | gettext-tools | [] [] | gip | [] | gjay | | gliv | [] | glunarclock | [] [] | gnubiff | | gnucash | [] | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | | gold | | gpe-aerial | | gpe-beam | | gpe-bluetooth | | gpe-calendar | | gpe-clock | [] | gpe-conf | | gpe-contacts | | gpe-edit | | gpe-filemanager | | gpe-go | | gpe-login | | gpe-ownerinfo | [] | gpe-package | | gpe-sketchbook | | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | [] [] | gsasl | | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] [] [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] [] | gutenprint | | hello | [] | help2man | | hylafax | | idutils | | indent | [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | | iso_639 | [] [] [] [] | iso_639_3 | | jwhois | | kbd | | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | klavaro | [] | latrine | | ld | [] | leafpad | [] [] | libc | [] [] | libexif | () | libextractor | | libgnutls | | libgpewidget | | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | [] | libidn | | lifelines | | liferea | [] [] | lilypond | | linkdr | [] | lordsawar | | lprng | | lynx | [] | m4 | | mailfromd | | mailutils | | make | | man-db | | man-db-manpages | | minicom | | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | | psmisc | | pspp | [] | pwdutils | | radius | [] | recode | [] [] | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] [] | sed | [] [] | sharutils | [] [] | shishi | | skencil | | solfege | | solfege-manual | | soundtracker | | sp | | sysstat | | tar | [] | texinfo | | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] [] | wyslij-po | | xchat | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] | +--------------------------------------------------+ af am an ar as ast az be be@latin bg bn_IN bs ca 6 0 1 2 3 19 1 10 3 28 3 1 38 crh cs da de el en en_GB en_ZA eo es et eu fa +-------------------------------------------------+ a2ps | [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] () | anubis | [] [] | aspell | [] [] [] [] [] | bash | [] [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] | bison | [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] [] [] | cflow | [] [] | clisp | [] [] [] [] | coreutils | [] [] [] [] | cpio | | cppi | | cpplib | [] [] [] | cryptsetup | [] | dfarc | [] [] [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] | dink | [] [] [] | doodle | [] | e2fsprogs | [] [] [] | enscript | [] [] [] | exif | () [] [] | fetchmail | [] [] () [] [] [] | findutils | [] [] [] | flex | [] [] | freedink | [] [] [] | gas | [] | gawk | [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] [] | gip | [] [] [] [] | gjay | [] | gliv | [] [] [] | glunarclock | [] [] | gnubiff | () | gnucash | [] () () () () | gnuedu | [] [] | gnulib | [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] | gpe-aerial | [] [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] [] [] | gpe-edit | [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] () [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] | grub | [] [] | gsasl | [] | gss | | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] () [] | gtkam | [] [] () [] [] | gtkorphan | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] [] [] | hello | [] [] [] [] | help2man | [] | hylafax | [] [] | idutils | [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] [] [] [] () [] [] [] () | iso_3166_2 | () | iso_4217 | [] [] [] () [] [] | iso_639 | [] [] [] [] () [] [] | iso_639_3 | [] | jwhois | [] | kbd | [] [] [] [] [] | keytouch | [] [] | keytouch-editor | [] [] | keytouch-keyboa... | [] | klavaro | [] [] [] [] | latrine | [] () | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | [] [] | libgphoto2 | [] () | libgphoto2_port | [] () [] | libgsasl | | libiconv | [] [] [] [] [] | libidn | [] [] [] | lifelines | [] () | liferea | [] [] [] [] [] | lilypond | [] [] [] | linkdr | [] [] [] | lordsawar | [] | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] [] | man-db | | man-db-manpages | | minicom | [] [] [] [] | mkisofs | | myserver | | nano | [] [] [] | opcodes | [] [] | parted | [] [] | pies | | popt | [] [] [] [] [] | psmisc | [] [] [] | pspp | [] | pwdutils | [] | radius | [] | recode | [] [] [] [] [] [] | rosegarden | () () () | rpm | [] [] [] | rush | | sarg | | screem | | scrollkeeper | [] [] [] [] [] | sed | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | | skencil | [] () [] | solfege | [] [] [] | solfege-manual | [] [] | soundtracker | [] [] [] | sp | [] | sysstat | [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] | tin | [] [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] | vice | () () | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] | wyslij-po | | xchat | [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ crh cs da de el en en_GB en_ZA eo es et eu fa 5 64 105 117 18 1 8 0 28 89 18 19 0 fi fr ga gl gu he hi hr hu hy id is it ja ka kn +----------------------------------------------------+ a2ps | [] [] [] [] | aegis | [] [] | ant-phone | [] [] | anubis | [] [] [] [] | aspell | [] [] [] [] | bash | [] [] [] [] | bfd | [] [] [] | bibshelf | [] [] [] [] [] | binutils | [] [] [] | bison | [] [] [] [] | bison-runtime | [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] | cflow | [] [] [] | clisp | [] | coreutils | [] [] [] [] [] | cpio | [] [] [] [] | cppi | [] [] | cpplib | [] [] [] | cryptsetup | [] [] [] | dfarc | [] [] [] | dialog | [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] [] [] | dink | [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] | freedink | [] [] [] | gas | [] [] | gawk | [] [] [] [] () [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] [] [] | gjay | [] | gliv | [] () | glunarclock | [] [] [] [] | gnubiff | () [] () | gnucash | () () () () () [] | gnuedu | [] [] | gnulib | [] [] [] [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] [] | gpe-aerial | [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] [] [] | gpe-calendar | [] [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] [] | gpe-go | [] [] [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] [] | grub | [] [] [] [] | gsasl | [] [] [] [] [] | gss | [] [] [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] [] | gtkorphan | [] [] [] | gtkspell | [] [] [] [] [] [] [] [] [] | gutenprint | [] [] [] [] | hello | [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] () [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | () [] [] [] | iso_4217 | [] () [] [] [] [] | iso_639 | [] () [] [] [] [] [] [] [] | iso_639_3 | () [] [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] [] [] [] | keytouch-editor | [] [] [] [] [] | keytouch-keyboa... | [] [] [] [] [] | klavaro | [] [] | latrine | [] [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] [] () | libc | [] [] [] [] [] | libexif | [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] [] | libidn | [] [] [] [] | lifelines | () | liferea | [] [] [] [] | lilypond | [] [] | linkdr | [] [] [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] [] | man-db | [] [] | man-db-manpages | [] | minicom | [] [] [] [] [] | mkisofs | [] [] [] [] | myserver | | nano | [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pies | | popt | [] [] [] [] [] [] [] [] [] | psmisc | [] [] [] | pspp | | pwdutils | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () () () () | rpm | [] [] | rush | | sarg | [] | screem | [] [] | scrollkeeper | [] [] [] [] | sed | [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] | shishi | [] | skencil | [] | solfege | [] [] [] [] | solfege-manual | [] [] | soundtracker | [] [] | sp | [] () | sysstat | [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux-ng | [] [] [] [] [] [] | vice | () () () | vmm | [] | vorbis-tools | [] | wastesedge | () () | wdiff | [] | wget | [] [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] | +----------------------------------------------------+ fi fr ga gl gu he hi hr hu hy id is it ja ka kn 105 121 53 20 4 8 3 5 53 2 120 5 84 67 0 4 ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne +-----------------------------------------------+ a2ps | [] | aegis | | ant-phone | | anubis | [] [] | aspell | [] | bash | | bfd | | bibshelf | [] [] | binutils | | bison | [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] | cpio | | cppi | | cpplib | | cryptsetup | | dfarc | [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] | dink | | doodle | | e2fsprogs | | enscript | | exif | [] | fetchmail | | findutils | | flex | | freedink | [] | gas | | gawk | | gcal | | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] | gettext-tools | [] | gip | [] [] | gjay | | gliv | | glunarclock | [] | gnubiff | | gnucash | () () () () | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | [] | gold | | gpe-aerial | [] | gpe-beam | [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] | gpe-timesheet | [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | | gsasl | | gss | | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | | gtick | | gtkam | [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | | hello | [] [] [] | help2man | | hylafax | | idutils | | indent | | iso_15924 | [] [] | iso_3166 | [] [] () [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] | iso_639 | [] [] | iso_639_3 | [] | jwhois | [] | kbd | | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | klavaro | [] | latrine | [] | ld | | leafpad | [] [] [] | libc | [] | libexif | | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | | libidn | | lifelines | | liferea | | lilypond | | linkdr | | lordsawar | | lprng | | lynx | | m4 | | mailfromd | | mailutils | | make | [] | man-db | | man-db-manpages | | minicom | [] | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | [] [] [] | psmisc | | pspp | | pwdutils | | radius | | recode | | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] | sed | | sharutils | | shishi | | skencil | | solfege | [] | solfege-manual | | soundtracker | | sp | | sysstat | [] | tar | [] | texinfo | [] | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] | wyslij-po | | xchat | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +-----------------------------------------------+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne 20 5 10 1 13 48 4 2 2 4 24 10 20 3 1 nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +---------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] () | buzztard | [] [] | cflow | [] | clisp | [] [] | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] | cryptsetup | [] | dfarc | [] | dialog | [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] [] | dink | () | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | exif | [] [] [] () [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] | gas | | gawk | [] [] [] [] | gcal | | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | [] () | gnucash | [] () () () | gnuedu | [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gnutls | [] [] | gold | | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] [] | gphoto2 | [] [] [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | gutenprint | [] [] | hello | [] [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] [] [] [] | iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] [] | klavaro | [] [] | latrine | [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] | libgphoto2_port | [] [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] | lifelines | [] [] | liferea | [] [] [] [] [] () () [] | lilypond | [] | linkdr | [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | pies | [] | popt | [] [] [] [] | psmisc | [] [] [] | pspp | [] [] | pwdutils | [] | radius | [] [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () | rpm | [] [] [] | rush | [] [] | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] [] [] [] | solfege-manual | [] [] [] | soundtracker | [] | sp | | sysstat | [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | [] | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 135 10 4 7 105 1 29 62 47 91 3 54 46 9 37 sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW +---------------------------------------------------+ a2ps | [] [] [] [] [] | 27 aegis | [] | 9 ant-phone | [] [] [] [] | 9 anubis | [] [] [] [] | 15 aspell | [] [] [] | 20 bash | [] [] [] | 12 bfd | [] | 6 bibshelf | [] [] [] | 16 binutils | [] [] | 8 bison | [] [] | 12 bison-runtime | [] [] [] [] [] [] | 29 bluez-pin | [] [] [] [] [] [] [] [] | 37 bombono-dvd | [] | 4 buzztard | [] | 7 cflow | [] [] [] | 9 clisp | | 10 coreutils | [] [] [] [] | 22 cpio | [] [] [] [] [] [] | 13 cppi | [] [] | 5 cpplib | [] [] [] [] [] [] | 14 cryptsetup | [] [] | 7 dfarc | [] | 9 dialog | [] [] [] [] [] [] [] | 30 dico | [] | 2 diffutils | [] [] [] [] [] [] | 30 dink | | 4 doodle | [] [] | 7 e2fsprogs | [] [] [] | 11 enscript | [] [] [] [] | 17 exif | [] [] [] | 16 fetchmail | [] [] [] | 17 findutils | [] [] [] [] [] | 20 flex | [] [] [] [] | 15 freedink | [] | 10 gas | [] | 4 gawk | [] [] [] [] | 18 gcal | [] [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] [] | 34 gettext-runtime | [] [] [] [] [] [] [] | 29 gettext-tools | [] [] [] [] [] [] | 22 gip | [] [] [] [] | 22 gjay | [] | 3 gliv | [] [] [] | 14 glunarclock | [] [] [] [] [] | 19 gnubiff | [] [] | 4 gnucash | () [] () [] () | 10 gnuedu | [] [] | 7 gnulib | [] [] [] [] | 16 gnunet | [] | 1 gnunet-gtk | [] [] [] | 5 gnutls | [] [] [] | 10 gold | [] | 4 gpe-aerial | [] [] [] | 18 gpe-beam | [] [] [] | 19 gpe-bluetooth | [] [] [] | 13 gpe-calendar | [] [] [] [] | 12 gpe-clock | [] [] [] [] [] | 28 gpe-conf | [] [] [] [] | 20 gpe-contacts | [] [] [] | 17 gpe-edit | [] [] [] | 12 gpe-filemanager | [] [] [] [] | 16 gpe-go | [] [] [] [] [] | 25 gpe-login | [] [] [] | 11 gpe-ownerinfo | [] [] [] [] [] | 25 gpe-package | [] [] [] | 13 gpe-sketchbook | [] [] [] | 20 gpe-su | [] [] [] [] [] | 30 gpe-taskmanager | [] [] [] [] [] | 29 gpe-timesheet | [] [] [] [] [] | 25 gpe-today | [] [] [] [] [] [] | 30 gpe-todo | [] [] [] [] | 17 gphoto2 | [] [] [] [] [] | 24 gprof | [] [] [] | 15 gpsdrive | [] [] [] | 11 gramadoir | [] [] [] | 11 grep | [] [] [] | 10 grub | [] [] [] | 14 gsasl | [] [] [] [] | 14 gss | [] [] [] | 11 gst-plugins-bad | [] [] [] [] | 26 gst-plugins-base | [] [] [] [] [] | 24 gst-plugins-good | [] [] [] [] | 24 gst-plugins-ugly | [] [] [] [] [] | 29 gstreamer | [] [] [] [] | 22 gtick | [] [] [] | 13 gtkam | [] [] [] | 20 gtkorphan | [] [] [] | 14 gtkspell | [] [] [] [] [] [] [] [] [] | 45 gutenprint | [] | 10 hello | [] [] [] [] [] [] | 21 help2man | [] [] | 7 hylafax | [] | 5 idutils | [] [] [] [] | 17 indent | [] [] [] [] [] [] | 30 iso_15924 | () [] () [] [] | 16 iso_3166 | [] [] () [] [] () [] [] [] () | 53 iso_3166_2 | () [] () [] | 9 iso_4217 | [] () [] [] () [] [] | 26 iso_639 | [] [] [] () [] () [] [] [] [] | 38 iso_639_3 | [] () | 8 jwhois | [] [] [] [] [] | 16 kbd | [] [] [] [] [] | 15 keytouch | [] [] [] | 16 keytouch-editor | [] [] [] | 14 keytouch-keyboa... | [] [] [] | 14 klavaro | [] | 11 latrine | [] [] [] | 10 ld | [] [] [] [] | 11 leafpad | [] [] [] [] [] [] | 33 libc | [] [] [] [] [] | 21 libexif | [] () | 7 libextractor | [] | 1 libgnutls | [] [] [] | 9 libgpewidget | [] [] [] | 14 libgpg-error | [] [] [] | 9 libgphoto2 | [] [] | 8 libgphoto2_port | [] [] [] [] | 14 libgsasl | [] [] [] | 13 libiconv | [] [] [] [] | 21 libidn | () [] [] | 11 lifelines | [] | 4 liferea | [] [] [] | 21 lilypond | [] | 7 linkdr | [] [] [] [] [] | 17 lordsawar | | 1 lprng | [] | 3 lynx | [] [] [] [] | 17 m4 | [] [] [] [] | 19 mailfromd | [] [] | 3 mailutils | [] | 5 make | [] [] [] [] | 21 man-db | [] [] [] | 8 man-db-manpages | | 4 minicom | [] [] | 16 mkisofs | [] [] | 9 myserver | | 0 nano | [] [] [] [] | 21 opcodes | [] [] [] | 11 parted | [] [] [] [] [] | 15 pies | [] [] | 3 popt | [] [] [] [] [] [] | 27 psmisc | [] [] | 11 pspp | | 4 pwdutils | [] [] | 6 radius | [] [] | 9 recode | [] [] [] [] | 28 rosegarden | () | 0 rpm | [] [] [] | 11 rush | [] [] | 4 sarg | | 1 screem | [] | 3 scrollkeeper | [] [] [] [] [] | 27 sed | [] [] [] [] [] | 30 sharutils | [] [] [] [] [] | 22 shishi | [] | 3 skencil | [] [] | 7 solfege | [] [] [] [] | 16 solfege-manual | [] | 8 soundtracker | [] [] [] | 9 sp | [] | 3 sysstat | [] [] | 15 tar | [] [] [] [] [] [] | 23 texinfo | [] [] [] [] [] | 17 tin | | 4 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux-ng | [] [] [] [] | 20 vice | () () | 1 vmm | [] | 4 vorbis-tools | [] | 6 wastesedge | | 2 wdiff | [] [] | 7 wget | [] [] [] [] [] | 26 wyslij-po | [] [] | 8 xchat | [] [] [] [] [] [] | 36 xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | 63 xkeyboard-config | [] [] [] | 22 +---------------------------------------------------+ 85 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW 178 domains 119 1 3 3 0 10 65 51 155 17 98 7 41 2618 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If June 2010 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.5 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. shishi-1.0.2/THANKS0000664000000000000000000000172112126660507010613 00000000000000Shishi THANKS -- Acknowledgements. Copyright (C) 2002-2013 Simon Josefsson See the end for copying conditions. Shishi uses Libtasn1 by Fabio Fiorina, Libgcrypt and Libgpg-error by Werner Koch, Libidn by Simon Josefsson, and gdoc by Michael Zucchi. Several GNU packages simplified development considerably, those packages include Autoconf, Automake, Libtool, Gnulib, Gettext, Indent, Texinfo, Help2man and Emacs. Historically we have used CVS, but today Git is used. Bug reports, patches and/or suggestions were also received from: Nicolas Pouvesle Jakub Bogusz Adrian Bunk Mike Castle Dave Love Yvan Bassuel Elrond Russ Allbery Abhijit Mitra Alberto Fondi Jack Bates Graham Shaw Johan van Selst Mats Erik Andersson Eray Aslan ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/.clcopying0000664000000000000000000000144012126660507011666 00000000000000 Copyright (C) 2002-2013 Simon Josefsson This file is part of Shishi. Shishi 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. Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. shishi-1.0.2/cfg.mk0000664000000000000000000001166012126772437011001 00000000000000# Copyright (C) 2006-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. WFLAGS ?= --enable-gcc-warnings ADDFLAGS ?= CFGFLAGS ?= --enable-gtk-doc --enable-gtk-doc-pdf \ --with-libgcrypt $(ADDFLAGS) $(WFLAGS) INDENT_SOURCES = `find . -name \*.[ch] | grep -v -e ^./asn1/ -e ^./build-aux/ -e ^./db/gl/ -e ^./extra/rsh-redone/ -e ^./gl/ -e ^./lib/kerberos5.c -e ^./src/gl/` ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile) .DEFAULT_GOAL := bootstrap endif local-checks-to-skip = sc_copyright_check sc_error_message_uppercase \ sc_immutable_NEWS sc_makefile_at_at_check sc_po_check \ sc_prohibit_atoi_atof sc_prohibit_have_config_h \ sc_prohibit_strcmp sc_require_config_h \ sc_require_config_h_first sc_GPL_version VC_LIST_ALWAYS_EXCLUDE_REGEX = ^GNUmakefile|maint.mk|gtk-doc.make|asn1/.*\.[ch]|build-aux/|doc/keytab.txt|doc/fdl-1.3.texi|doc/gdoc|doc/parse-datetime.texi|doc/specifications/.*|extra/.*\.[1ch]|m4/pkg.m4|po/.*.po.in|((db/|src/)?gl)/.*$$ update-copyright-env = UPDATE_COPYRIGHT_HOLDER="Simon Josefsson" UPDATE_COPYRIGHT_USE_INTERVALS=2 # Explicit syntax-check exceptions. exclude_file_name_regexp--sc_bindtextdomain = ^examples/|extra/|lib/ccache.c|tests/utils.c exclude_file_name_regexp--sc_prohibit_doubled_word = ^doc/shishi.texi|lib/ exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = ^doc/components.dia|doc/components.png|tests/ccache1.bin|tests/keytab1.bin exclude_file_name_regexp--sc_cast_of_argument_to_free = ^lib/keys.c|lib/tkts.c|extra/pam_shishi/pam_shishi.c exclude_file_name_regexp--sc_program_name = ^examples/|extra/|lib/|tests/ exclude_file_name_regexp--sc_prohibit_cvs_keyword = ^extra/rsh-redone/ exclude_file_name_regexp--sc_prohibit_magic_number_exit = ^extra/rsh-redone/ exclude_file_name_regexp--sc_space_tab = ^doc/components.dia|extra/rsh-redone/ exclude_file_name_regexp--sc_trailing_blank = ^doc/components.png|doc/shishi.texi|extra/fetchmail.diff|extra/rsh-redone/ exclude_file_name_regexp--sc_two_space_separator_in_usage = ^doc/shishi.texi exclude_file_name_regexp--sc_unmarked_diagnostics = ^extra/rsh-redone/|src/shisa.c|src/shishi.c|src/shishid.c exclude_file_name_regexp--sc_useless_cpp_parens = ^extra/rsh-redone/ exclude_file_name_regexp--sc_prohibit_strncpy =^lib/error.c|src/shishid.c autoreconf: for f in po/*.po.in; do \ cp $$f `echo $$f | sed 's/.in//'`; \ done mv build-aux/config.rpath build-aux/config.rpath- test -f ./configure || autoreconf --install mv build-aux/config.rpath- build-aux/config.rpath update-po: refresh-po for f in `ls po/*.po | grep -v quot.po`; do \ cp $$f $$f.in; \ done git add po/*.po.in git commit -m "Sync with TP." po/LINGUAS po/*.po.in bootstrap: autoreconf ./configure $(CFGFLAGS) # Code Coverage web-coverage: rm -fv `find $(htmldir)/coverage -type f | grep -v CVS` cp -rv doc/coverage/* $(htmldir)/coverage/ upload-web-coverage: cd $(htmldir) && \ cvs commit -m "Update." coverage # Mingw32 W32ROOT ?= $(HOME)/gnutls4win/inst mingw32: autoreconf ./configure $(CFGFLAGS) --host=i586-mingw32msvc --build=`./config.guess` --prefix=$(W32ROOT) ChangeLog: git2cl > ChangeLog cat .clcopying >> ChangeLog htmldir = ../www-$(PACKAGE) tag = $(PACKAGE)-`echo $(VERSION) | sed 's/\./-/g'` release: prepare upload web upload-web prepare: ! git tag -l $(tag) | grep $(PACKAGE) > /dev/null rm -f ChangeLog $(MAKE) ChangeLog distcheck git commit -m Generated. ChangeLog git tag -u b565716f! -m $(VERSION) $(tag) upload: git push git push --tags build-aux/gnupload --to ftp.gnu.org:shishi $(distdir).tar.gz cp $(distdir).tar.gz $(distdir).tar.gz.sig ../releases/$(PACKAGE)/ web: cd doc && ../build-aux/gendocs.sh --html "--css-include=texinfo.css" \ -o ../$(htmldir)/manual/ $(PACKAGE) "$(PACKAGE_NAME)" cp -v doc/reference/$(PACKAGE).pdf doc/reference/html/*.html doc/reference/html/*.png doc/reference/html/*.devhelp2 doc/reference/html/*.css $(htmldir)/reference/ cp -v doc/cyclo/cyclo-$(PACKAGE).html $(htmldir)/cyclo/ upload-web: cd $(htmldir) && \ cvs commit -m "Update." manual/ reference/ cyclo/ review-diff: git diff `git describe --abbrev=0`.. \ | grep -v -e ^index -e '^diff --git' \ | filterdiff -p 1 -x 'build-aux/*' -x 'gl/*' -x 'db/gl/*' -x 'src/gl/*' -x 'po/*' -x 'maint.mk' -x '.gitignore' -x '.x-sc*' -x ChangeLog -x GNUmakefile \ | less shishi-1.0.2/doc/0000755000000000000000000000000012126773323010523 500000000000000shishi-1.0.2/doc/components.dia0000664000000000000000000001244112015626624013311 00000000000000‹í][o븵~ϯ02/= ·x'«î]ô P´ÅœLûl(¶b«q$¤$ã)Úß~HÉ÷K¢˜^²pcfgK‘¹¼l®ßâºðüõqÒ{NŠ2ͳ¯·…·½$äÃ4}½ýÇßÿüƒºýã·›? Óø÷æÿQ?öÌ+²Ò^}½WÕô÷_¾¼¼¼ É¬Œ«¼@“ô •É—ÿÄ“IüÅ<ôåöÛM¯·>À0®b{o~7®ª"½{ª’^?&_oïâÁèȟ²ámóÔü¹A>É‹Þs<ùzûÝ}ýçöË|˜/ã¼2ö4%wE?:4´>fèiRlû8ÍËÔ ®•%“xñ™¼_Ü]·â&ÝŠ+º—–ýi^TEœV»"ïò|’ÄY#õ>ž”Éñ‚ÊA<1sì5½Ô¸O«*?‘Íí¥¹½×tGE:|Ýr7ž80ÊK:¬Æý_>®fôÐèÏi™ÞM’}ï>ͪ“ ?;ÍðÛßN ß«—;Άf´ƒëÃP%<áï_FOé0)ߘf›Ïi<ìË[Ÿúösm?˜æÖÖj]‹˜Ä³¤˜ÿß«uº7ÿ‚ÍÂR<-V¯úùÝ?“A5WïÏ“üe0Ž‹ª÷Cïÿž²Á8ö~Œ ûú1ô#~½ýßpóƒÚVÍ k@p瓚æËéj[ñ]Ø84ôÝÝöÈ…Ñ"ÎF“¤ý‡…ÄÖ;jcÔÿøŸŸŒ=ÿɼì9­f{lš8Û´14HÚ_˜]¹$ßwP¥ ãçˆ\ðOï ²)Œ\>|ŠdŠ7å85ÿõ›ëþ÷‹ë¸4—‹‹jd¯^—6ˆ¬ŒÖ$™žþ;FäÿË\qäýwZ䃤,oBƒÁI±!>v+Uxî…ù hñ±nmi1£VˆŒ#L‹U¥ ŸŠ©¶ab÷jOLì„ãr…ÁqÙÿÞãmœŒy´ím…ó®°AAÈO=¾å¼”LÀ­ƒ.íà–2½þGx¸Ý€[CoWxk.<àv@p†à&ã!÷$ûvt]ºcnã”(è躘X1”FF&eÜ× tp}Ÿ‚>¸þI‚ëìÒbëo›´º“¶R0I ð‚ K¸É¥õbAbÞ¬½Y/ÌZœÇ¬µó^” ášÅŸw–} wq™áõl ¯ÒŸ‡IAš;> dÊ.›Æû€d'9 Ø9ñ™3d¾±‘—2"m^<†ÍvT©Uc.ÓïŒ*âÚòAÅlZå߯PyNÇI±„åÁ8<”OËfj§÷³åe’Õ#¬Áøæu#§_åý‡d¶¸Y–”?nÝÌú÷ùd¸§Xþëañ¯éÝÃðžôËqŒý½Fp…p€‰_!ºZ!œ“²©Ÿ€n¬é'_!–2"ú (Er…pT©]Æ ÜHÔÊg n’öéFÙb}é9:|!j£CÌ£o7è뜤mðPZ¨‚ŒX.eD,4ÔÙ ¯E_7•<úž}§›è;õè ¾–ýüõ­Ý:Â_÷„miC¯!lnçBFd9©[ÝàÛ•2n µB_¶[`»Ž´fá+c´ãx݉ô0 ÚuÒ9‹Þú%G{ýíPV!Áˆ´bÅ"2?Ca›N†Hh&ƒý;úšµG#³ô_j¤»¤ð sžç ú†ìRÐÐ’1j)š CâÈŠZ[+R”@—ÅìQÐ[õç±jq…VMÜS赃‹ÒΦ ‰à#H3Œ#+‘+mKÝ8tJÞ¶r¾Èí󨳼´*··C;çÎS‚T€(ñ^ʈ¨¶ýïlÏwÐýe7Ú¥äIî79679žª±ñ`ÓA}Úáj¿cý¶ßúèâü»<‘Ðo}t³õAœK_ÙѰØ…yhX”C¨ba~(†3~øæÇ> ÷ï‘”á‰ÕÅ%bGéLmA½³6R°`µY3Ììˆá¬6lÆø…v½QrtÄß›öÇ4í39MÎ9óÆ1+§FÒ®2"FÍ¿A Çh:ªä£ÂG¤ÈßÖÒãïGÞ9‚/PÂÖ”ðfs ï¥ßçäsœµ{9P»”1i+F ›ÅZGÚíO)߯ö5ðM²Aó8‹j…Âëw=Ãñ ôؽ*ÈíV9'¤/¾´£A²ý•H0IêZQŠid¥jZ§óB7ÑÚ«£wk?[˯ЭuOu638[§‘`#ú"°ÇÅ‚&:»¨Ó®È„kO²^; <$kôª¹öÄ >ÿY";£Uêu&ÔÛÁ/5î-&V ¥,²"…Áa…˜”àÍÎvõ;tޱòtêƒÑ)—Ì*r6¥ÝÙ"v—–OÍeØÂ1ÅÁ;ë8êÔnçJt×ììJw®µ³uµºí)<ÅRˆ7{WžduD²¨{îúüKð4K EqiE)‘‘•ª‰a? …ƒŸÕ²OÇC|ìhÿØ“­‹%[Ú…l©,…â«ðŸ$"D×;WÔü´¤”‹fSKq ”O¡ôT7)”oºP”¸ÿÆAÿfüÈž«0 {>­ƒ*m¼&î·¢_÷šÆyY=$³µCjw¼¯ç·YLøcj;J»¢Î¹ëÜ bÙÚŽ ã<×e¾ Ðë K»( öV¯A¯Ùêš ¸]4Ym:öÛÙæ”{'~›M¼5Å%â’5[SLÓˆ×ÕBu’‡Ðe€{4<3:tvôÈ•òÍrƒpz¿Æ"B¸wò»dœâŒ³¦ZôŒM35BŠë V*…¥œ˜Êú$]¦Á[ôíUñðôõb´Sî]޹§gê=AåuX¶^ÒÚ²QeRŸ‘ ßS¦¥e7{ÏÞ®½]¯ÙõyrJ©{“lë&ÕãG>ê ˆo5qD!ÎÃz΃Ïí óÎP—ξ–2ÚäQQ†˜j ¯Ã¢é0Äëˆ&Z6Ná—áy³ö.Pfý¦ Äœó¼±8dfR=~D(ÂNLrP¥] (ô9¡oxEå†[äEÔÍaò€ṳ̂Î\#æÞ œ9lµsŒBâ,k’†Eai]£+jðѰ(ð¼¤ýNÛГ¨F¢”‰bø<$Ê9½Û8'8 t¯c)#2FÌx@CФ7ÚÕØPßSóÕÄ›â.1½vøËâŽçUð56IÛ‰_ùCo;ª²aÎ߂Æóêñ#¡…ÏztÐ¥3ëÁ÷Uð-ãûd¼öʃ.8è Ùœé}.w À‚n=~$²ù„ ¶‡M5ˆ@žrH OQ9Ù%ÌN‹ôy£é–½Q·ÜZܳ7<ôÂC/FØ'œw»‘x- çFJÈš3“ˆV‘™*LZ Ì#T_FHv1}XÖ‡e×vÏ”qÎäõ˜6¦º)&Q:2œòP7Å$‚\ˆiϽoÚÞ´×L›'Xàœt.(l/˜züH($á{Á8èÒ.Dà…ßs,|^¤¿%›GÂ×·¼›ï&q¤|'˜Nw¨œ3Ñk ºx¶Ý… K¡p@…Ói„oã®›Jí°—„õEàÛ–,/‰‡iùæ+þ¾_åýût’¬nLÍ“ÕÚe\”k¿M³éÓÚoͧ1ôà ñ€Ä<|wßܽîÀ2L(|/eD\ 銬oÇÜTjàÕagmùó±™IÓ¤Ñ,ûUQßX\§Ù}¾ø÷K\d–ÁûÝÔñ½Í„3˸ì^9ÇÛ®rÄŽaa÷1(.9^—v_¿±…Ç™Á²5òü0ôË$š9ðìÑm1EÔZó»]{¹sÕÈâKã !+Å{˜:ØKŒ¿D0 CŒpÚ«ãžêÖD„˜}¬ˆÇ!qžX/§×cÙ8l,›re™W6͘"‚µ¼ Ë6o ›wäíÚÛõÒ®ÏsÜw.G0sÙ”UÐc ÕÖQâ6ðà¨ÓÅ•&\cÎlš¥kíÇìÕr#k˜g‰wŸÀ{‘ÙSÌ©×Oûôîän•{G|Š”ux5d‰îBFÄê1;O@‹tÝtjyÞ&+¿µ]À Òi®å¢ókû-YîIØ<&ƒae›Baî!¹+Hv.ÂÂpF¬‚ ú,dØ@®™ ÇŸ‡Ú2‘ÆM§6˜,‘ò­k^Ý’ˆËò%/†ë;FTÕ_ü£1xWÖq›Ï"ìá¸8v.’†$Çvøc;'$¯Æ¹OÂÇ~0ö³?W“ <ŠB£¨¶Æâ3;ÊPΕ:ÚÜZa¨BšŠPX1’ ç_ ³ÎR›ÂÄ¡Ï>ÝVïp’“Ï_úhùKÚ%鯣$轤ոg&­ý™?U½Ç|˜ÞC·Ï7±¦iR<¦U• {if†›õ“aj¦ÞâE>‹'Õ¬7-òçth«Æ‰Y æïð&Ë n$õû¨å.®íÈER&Ås2DŸ ã0xYú¦Õxƒt§¤{Æ@!1.DšT™¿#Q§3Pû7tVê†N{ü&}´Òë3h>¹ç<„BÏ'BVó‰Ð.æ¡oÌ'B?÷|:Dœ³mI@ #6ÊP0n=7rì§üå‡IòœLn.ÁQS’ÅlN;Ob@A‚¹ƒ… Zƒ„¨ûJ^Hü5«ŒódÜ¥¸Jetype field to 3, and set all other fields to 0. *Return value:* Returns `SHISA_OK' iff successful, or an error code. shisa_key_add ------------- -- Function: int shisa_key_add (Shisa * DBH, const char * REALM, const char * PRINCIPAL, const Shisa_key * KEY) DBH: Shisa library handle created by `shisa()'. REALM: Name of realm the principal belongs in. PRINCIPAL: Name of principal to add key for. KEY: Pointer to Shisa key structure with key to add. Add key to database for given PRINCIPAL`REALM'. *Return value:* Returns `SHISA_OK' iff successful, or an error code. shisa_key_update ---------------- -- Function: int shisa_key_update (Shisa * DBH, const char * REALM, const char * PRINCIPAL, const Shisa_key * OLDKEY, const Shisa_key * NEWKEY) DBH: Shisa library handle created by `shisa()'. REALM: Name of realm the principal belongs in. PRINCIPAL: Name of principal to remove key for. OLDKEY: Pointer to Shisa key structure with hints on matching the key to modify. NEWKEY: Pointer to Shisa key structure with new values for the key, note that all fields are used (and not just the ones specified by `oldkey'). Modify data about a key in the database, for the given PRINCIPAL`REALM'. First the `oldkey' is used to locate the key to update (similar to `shisa_keys_find()'), then that key is modified to contain whatever information is stored in `newkey'. Not all elements of `oldkey' need to be filled out, only enough as to identify the key uniquely. For example, if you want to modify the information stored for the only key with an etype of 3 (DES-CBC-MD5), set the `key'->etype field to 3, and set all other fields to 0. *Return value:* Returns `SHISA_OK' on success, `SHISA_NO_KEY' if no key could be identified, and `SHISA_MULTIPLE_KEY_MATCH' if more than one key matched the given criteria, or an error code. shisa_key_remove ---------------- -- Function: int shisa_key_remove (Shisa * DBH, const char * REALM, const char * PRINCIPAL, const Shisa_key * KEY) DBH: Shisa library handle created by `shisa()'. REALM: Name of realm the principal belongs in. PRINCIPAL: Name of principal to remove key for. KEY: Pointer to Shisa key structure with hints on matching the key to remove. Remove a key, matching the hints in `key', from the Shisa database for the user PRINCIPAL`REALM'. Not all elements of `key' need to be filled out, only those you are interested in. For example, if you want to remove the only key with an etype of 3 (DES-CBC-MD5), set the `key'->etype field to 3, and set all other fields to 0. *Return value:* Returns `SHISA_OK' on success, `SHISA_NO_KEY' if no key could be identified, and `SHISA_MULTIPLE_KEY_MATCH' if more than one key matched the given criteria, or an error code. shisa_key_free -------------- -- Function: void shisa_key_free (Shisa * DBH, Shisa_key * KEY) DBH: Shisa library handle created by `shisa()'. KEY: Pointer to Shisa key structure to deallocate. Deallocate the fields of a Shisa key structure, and the structure itself. shisa_keys_free --------------- -- Function: void shisa_keys_free (Shisa * DBH, Shisa_key ** KEYS, size_t NKEYS) DBH: Shisa library handle created by `shisa()'. KEYS: Pointer to array with `nkeys' elements of keys. NKEYS: Number of key elements in `keys' array. Deallocate each element of an array with Shisa database keys, using `shisa_key_free()'. Error handling is similar to that for Shishi in general (*note Error Handling::), i.e., you invoke `shisa_strerror' on the integer return value received by some function, if the return value is non-zero. Below is the complete interface. shisa_strerror -------------- -- Function: const char * shisa_strerror (int ERR) ERR: shisa error code *Return value:* Returns a pointer to a statically allocated string containing a description of the error with the error value `err'. This string can be used to output a diagnostic message to the user. shisa_info ---------- -- Function: void shisa_info (Shisa * DBH, const char * FORMAT, ...) DBH: Shisa library handle created by `shisa()'. FORMAT: printf style format string. ...: print style arguments. Print informational message to standard error.  File: shishi.info, Node: Generic Security Service, Prev: Kerberos Database Functions, Up: Programming Manual 5.20 Generic Security Service ============================= As an alternative to the native Shishi programming API, it is possible to program Shishi through the Generic Security Services (GSS) API. The advantage of using GSS-API in your security application, instead of the native Shishi API, is that it will be easier to port your application between different Kerberos 5 implementations, and even beyond Kerberos 5 to different security systems, that support GSS-API. In the free software world, however, almost the only widely used security system that supports GSS-API is Kerberos 5, so the last advantage is somewhat academic. But if you are porting applications using GSS-API for other Kerberos 5 implementations, or want a more mature and stable API than the native Shishi API, you may find using Shishi's GSS-API interface compelling. Note that GSS-API only offer basic services, for more advanced uses you must use the native API. Since the GSS-API is not specific to Shishi, it is distributed independently from Shishi. Further information on the GSS project can be found at `http://www.gnu.org/software/gss/'.  File: shishi.info, Node: Acknowledgements, Next: Criticism of Kerberos, Prev: Programming Manual, Up: Top 6 Acknowledgements ****************** Shishi uses Libtasn1 by Fabio Fiorina, Libgcrypt and Libgpg-error by Werner Koch, Libidn by Simon Josefsson, cvs2cl by Karl Fogel, and gdoc by Michael Zucchi. Several GNU packages simplified development considerably, those packages include Autoconf, Automake, Libtool, Gnulib, Gettext, Indent, CVS, Texinfo, Help2man and Emacs. Several people reported bugs, sent patches or suggested improvements, see the file THANKS. Nicolas Pouvesle wrote the section about the Kerberos rsh/rlogin protocol. This manual borrows text from the Kerberos 5 specification.  File: shishi.info, Node: Criticism of Kerberos, Next: Protocol Extensions, Prev: Acknowledgements, Up: Top Appendix A Criticism of Kerberos ******************************** The intention with this section is to discuss various problems with Kerberos 5, so you can form a conscious decision how to deploy and use Shishi correctly in your organization. Currently the issues below are condensed, and mostly serve as a reminder for the author to elaborate on them. No encryption scheme with security proof. No standardized API, and GSS mechanism lack important functionality. Lack of authorization system. (krb5_kuserok()) Host to realm mapping relies on insecure DNS or static configuration files. Informational model and user database administration. Non-formal specification. Unclear on the etype to use for session keys (etype in request or database?). Unclear on how to populate some "evident" fields (e.g., cname in tickets for AS-REQ, or crealm, cname, realm, sname, ctime and cusec in KRB-ERROR). Unclear error code semantics (e.g., logic for when to use S_PRINCIPAL_UNKNOWN absent). Some KRB-ERROR fields are required, but can't be usefully populated in some situations, and no guidance is given on what they should contain. RFC 1510/1510bis incompatibilities. NULL enctype removed without discussion, and it is still used by some 1964 GSSAPI implementations. KRB_SAFE text (3.4.1) says the checksum is generated using the session or sub-session key, which contradicts itself (compare section 3.2.6) and also RFC 1510, which both allow the application to define the key. Verification of KRB_SAFE now require the key to be compatible with the (sub-)session key, in 1510 the only requirement was that it was collision proof. Problems with RFC 1510bis. Uses bignum INTEGER for TYPED-DATA and AD-AND-OR. Problems with crypto specification. It uses the word "random" many times, but there is no discussion on the randomness requirements. Practical experience indicate it is impossible to use true randomness for all "random" fields, and no implementation does this. A post by Don Davis on the ietf-krb-wg list tried to provide insight, but the information was never added to the specification.  File: shishi.info, Node: Protocol Extensions, Next: Copying Information, Prev: Criticism of Kerberos, Up: Top Appendix B Protocol Extensions ****************************** This appendix specifies the non-standard protocol elements implemented by Shishi. By nature of being non-standard, everything described here is experimental. Comments and feedback is appreciated. * Menu: * STARTTLS protected KDC exchanges:: How Shishi talks to KDC protected by TLS. * Telnet encryption with AES-CCM:: Integrity and privacy protected telnet. * Kerberized rsh and rlogin:: Description of KCMD protocol. * Key as initialization vector:: Some cryptography discussion. * The Keytab Binary File Format:: Format of keytab files. * The Credential Cache Binary File Format:: Format of ccache files.  File: shishi.info, Node: STARTTLS protected KDC exchanges, Next: Telnet encryption with AES-CCM, Up: Protocol Extensions B.1 STARTTLS protected KDC exchanges ==================================== Shishi is able to "upgrade" TCP communications with the KDC to use the Transport Layer Security (TLS) protocol. The TLS protocol offers integrity and privacy protected exchanges. TLS also offers authentication using username and passwords, X.509 certificates, or OpenPGP certificates. Kerberos 5 claims to offer some of these features, although it is not as rich as the TLS protocol. An inconclusive list of the motivation for using TLS is given below. * Server authentication of the KDC to the client. In traditional Kerberos 5, KDC authentication is only proved as a side effect that the KDC knows your encryption key (i.e., your password). * Client authentication against KDC. Kerberos 5 assume the user knows a key (usually in the form of a password). Sometimes external factors make this hard to fulfill. In some situations, users are equipped with smart cards with a RSA authentication key. In others, users have a OpenPGP client on their desktop, with a public OpenPGP key known to the server. In some situations, the policy may be that password authentication may only be done through SRP. * Kerberos exchanges are privacy protected. Part of many Kerberos packets are transfered without privacy protection (i.e., encryption). That part contains information, such as the client principal name, the server principal name, the encryption types supported by the client, the lifetime of tickets, etc. Revealing such information is, in some threat models, considered a problem. Thus, this enables "anonymity". * Prevents downgrade attacks affecting encryption types. The encryption type of the ticket in KDC-REQ are sent in the clear in Kerberos 5. This allows an attacker to replace the encryption type with a compromised mechanisms, e.g. 56-bit DES. Since clients in general cannot know the encryption types other servers support, it is difficult for the client to detect if there was a man-in-the-middle or if the remote server simply did not support a stronger mechanism. Clients may chose to refuse 56-bit DES altogether, but in some environments this leads to operational difficulties. * TLS is well-proved and the protocol is studied by many parties. This is an advantage in network design, where TLS is often already assumed as part of the solution since it is used to protect HTTP, IMAP, SMTP etc. In some threat models, the designer prefer to reduce the number of protocols that can hurt the overall system security if they are compromised. Other reasons for using TLS exists. B.1.1 TCP/IP transport with TLS upgrade (STARTTLS) -------------------------------------------------- RFC 1510bis requires Kerberos servers (KDCs) to accept TCP requests. Each request and response is prefixed by a 4 octet integer in network byte order, indicating the length of the packet. The high bit of the length was reserved for future expansion, and servers that do not understand how to interpret a set high bit must return a `KRB-ERROR' with a `KRB_ERR_FIELD_TOOLONG' and close the TCP stream. The TCP/IP transport with TLS upgrade (STARTTLS) uses this reserved bit as follows. First we define a new extensible typed hole for Kerberos 5 messages, because we used the only reserved bit. It is thus prudent to offer future extensions on our proposal. Secondly we reserve two values in this new typed hole, and described how they are used to implement STARTTLS. B.1.2 Extensible typed hole based on reserved high bit ------------------------------------------------------ When the high bit is set, the remaining 31 bits of the 4 octets are treated as an extensible typed hole, and thus form a 31 bit integer enumerating various extensions. Each of the values indicate a specific extended operation mode, two of which are used and defined here, and the rest are left for others to use. If the KDC do not understand a requested extension, it MUST return a `KRB-ERROR' with a `KRB_ERR_FIELD_TOOLONG' value (prefixed by the 4 octet length integer, with the high bit clear, as usual) and close the TCP stream. Meaning of the 31 lower bits in the 4 octet field, when the high bit is set: 0 RESERVED. 1 STARTTLS requested by client. 2 STARTTLS request accepted by server. 3...2147483647 AVAILABLE for registration (via bug-shishi@josefsson.org). 2147483648 RESERVED. B.1.3 STARTTLS requested by client (extension mode 1) ----------------------------------------------------- When this is sent by the client, the client is requesting the server to start TLS negotiation on the TCP stream. The client MUST NOT start TLS negotiation immediately. Instead, the client wait for either a KRB-ERROR (sent normally, prefixed by a 4 octet length integer) indicating the server do not understand the set high bit, or 4 octet which is to interpreted as an integer in network byte order, where the high bit is set and the remaining 31 bit are interpreted as an integer specifying the "STARTTLS request accepted by server". In the first case, the client infer that the server do not understand (or wish to support) STARTTLS, and can re-try using normal TCP, if unprotected Kerberos 5 exchanges are acceptable to the client policy. In the latter case, it should invoke TLS negotiation on the stream. If any other data is received, the client MUST close the TCP stream. B.1.4 STARTTLS request accepted by server (extension mode 2) ------------------------------------------------------------ This 4 octet message should be sent by the server when it has received the previous 4 octet message. The message is an acknowledgment of the client's request to initiate STARTTLS on the channel. The server MUST then invoke a TLS negotiation. B.1.5 Proceeding after successful TLS negotiation ------------------------------------------------- If the TLS negotiation ended successfully, possibly also considering client or server policies, the exchange within the TLS protected stream is performed like normal UDP Kerberos 5 exchanges, i.e., there is no TCP 4 octet length field before each packet. Instead each Kerberos packet MUST be sent within one TLS record, so the application can use the TLS record length as the Kerberos 5 packet length. B.1.6 Proceeding after failed TLS negotiation --------------------------------------------- If the TLS negotiation fails, possibly due to client or server policy (e.g., inadequate support of encryption types in TLS, or lack of client or server authentication) the entity that detect the failure MUST disconnected the connection. It is expected that any error messages that explain the error condition is transfered by TLS. B.1.7 Interaction with KDC addresses in DNS ------------------------------------------- Administrators for a KDC may announce the KDC address by placing SRV records in DNS for the realm, as described in `draft-ietf-krb-wg-krb-dns-locate-03.txt'. That document mention TLS, but do not reference any work that describe how KDCs uses TLS. Until further clarified, consider the TLS field in that document to refer to implementation supporting this STARTTLS protocol. B.1.8 Using TLS authentication logic in Kerberos ------------------------------------------------ The server MAY consider the authentication performed by the TLS exchange as sufficient to issue Kerberos 5 tickets to the client, without requiring, e.g., pre-authentication. However, it is not an error to require or use pre-authentication as well. The client may also indicate that it wishes to use TLS both for authentication and data protection by using the `NULL' encryption type in its request. The server can decide from its local policy whether or not issuing tickets based solely on TLS authentication, and whether `NULL' encryption within TLS, is acceptable or not. This mode is currently under investigation. B.1.9 Security considerations ----------------------------- Because the initial token is not protected, it is possible for an active attacker to make it appear to the client that the server do not support this extension. It is up to client configuration to disallow non-TLS connections, if this vulnerability is deemed unacceptable. For interoperability, we suggest the default behaviour should be to allow automatic fallback to TCP or UDP. The security considerations of both TLS and Kerberos 5 are inherited. Using TLS for authentication and/or data protection together with Kerberos alter the authentication logic fundamentally. Thus, it may be that even if the TLS and Kerberos 5 protocols and implementations were secure, the combination of TLS and Kerberos 5 described here could be insecure. No channel bindings are provided in the Kerberos messages. It is an open question whether, and how, this should be fixed.  File: shishi.info, Node: Telnet encryption with AES-CCM, Next: Kerberized rsh and rlogin, Prev: STARTTLS protected KDC exchanges, Up: Protocol Extensions B.2 Telnet encryption with AES-CCM ================================== This appendix describe how Shishi use the Advanced Encryption Standard (AES) encryption algorithm in Counter with CBC-MAC mode (RFC 3610) with the telnet encryption option (RFC 2946). B.2.1 Command Names and Codes ----------------------------- Encryption Type AES_CCM 12 Suboption Commands AES_CCM_INFO 1 AES_CCM_INFO_OK 2 AES_CCM_INFO_BAD 3 B.2.2 Command Meanings ---------------------- IAC SB ENCRYPT IS AES_CCM AES_CCM_INFO IAC SE The sender of this command select desired M and L parameters, and nonce, as described in RFC 3610, and sends it to the other side of the connection. The parameters and the nonce are sent in clear text. Only the side of the connection that is WILL ENCRYPT may send the AES_CCM_INFO command. IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_BAD IAC SE The sender of this command reject the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST be sent if the nonce field length does not match the selected value for L. The command MAY be sent if the receiver do not accept the parameters for reason such as policy. No capability is provided to negotiate these parameters. IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_OK IAC SE The sender of this command accepts the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST NOT be sent if the nonce field length does not match the selected value for L. B.2.3 Implementation Rules -------------------------- Once a AES_CCM_INFO_OK command has been received, the WILL ENCRYPT side of the connection should do keyid negotiation using the ENC_KEYID command. Once the keyid negotiation has successfully identified a common keyid, then START and END commands may be sent by the side of the connection that is WILL ENCRYPT. Data will be encrypted using the AES-CCM algorithm, with the negotiated nonce and parameters M and L. After each successful encryption and decryption, the nonce is treated as an integer in network byte order, and incremented by one. If encryption (decryption) is turned off and back on again, and the same keyid is used when re-starting the encryption (decryption), the intervening clear text must not change the state of the encryption (decryption) machine. In particular, the AES-CCM nonce must not be re-set. If a START command is sent (received) with a different keyid, the encryption (decryption) machine must be re-initialized immediately following the end of the START command with the new key and the parameters sent (received) in the last AES_CCM_INFO command. If a new AES_CCM_INFO command is sent (received), and encryption (decryption) is enabled, the encryption (decryption) machine must be re-initialized immediately following the end of the AES_CCM_INFO command with the new nonce and parameters, and the keyid sent (received) in the last START command. If encryption (decryption) is not enabled when a AES_CCM_INFO command is sent (received), the encryption (decryption) machine must be re- initialized after the next START command, with the keyid sent (received) in that START command, and the nonce and parameters sent (received) in this AES_CCM_INFO command. At all times MUST each end make sure that a AES-CCM nonce is not used twice under the same encryption key. The rules above help accomplish this in an interoperable way. B.2.4 Integration with the AUTHENTICATION telnet option ------------------------------------------------------- <> As noted in the telnet ENCRYPTION option specifications, a keyid value of zero indicates the default encryption key, as might be derived from the telnet AUTHENTICATION option. If the default encryption key negotiated as a result of the telnet AUTHENTICATION option contains less than 32 bytes (corresponding to two 128 bit keys), then the AES_CCM option MUST NOT be offered or used as a valid telnet encryption option. Furthermore, depending on policy for key lengths, the AES_CCM option MAY be disabled if the default encryption key contain less than 48 bytes (for two 192 bit keys), or less than 64 bytes (for two 256 bit keys), as well. The available encrypt key data is divided on two halves, where the first half is used to encrypt data sent from the server (decrypt data received by the client), and the second half is used to encrypt data sent from the client (decrypt data received by the server). Note that the above algorithm assumes that the AUTHENTICATION mechanism generate keying material suitable for AES-CCM as used in this specification. This is not necessarily true in general, but we specify this behaviour as the default since it is true for most authentication systems in popular use today. New telnet AUTHENTICATION mechanisms may specify alternative methods for determining the keys to be used for this cipher suite in their specification, if the session key negotiated by that authentication mechanism is not a DES key and where this algorithm may not be safely used. Kerberos 5 authentication clarification: The key used to encrypt data from the client to the server is taken from the sub-session key in the AP-REQ. The key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REP. If mutual authentication is not negotiated, the key used to encrypt data from the client to the server is taken from the session key in the ticket, and the key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REQ. Leaving the AP-REQ sub-key field empty MUST disable the AES_CCM option. B.2.5 Security Considerations ----------------------------- The protocol must be properly and securely implemented. For example, an implementation should not be vulnerable to various implementation-specific attacks such as buffer overflows or side-channel analysis. We wish to repeat the suggestion from RFC 2946, to investigate in a STARTTLS approach for Telnet encryption (and also authentication), when the security level provided by this specification is not adequate. B.2.5.1 Telnet Encryption Protocol Security Considerations .......................................................... The security consideration of the Telnet encryption protocol are inherited. It should be noted that the it is up to the authentication protocol used, if any, to bind the authenticity of the peers to a specific session. The Telnet encryption protocol does not, in general, protect against possibly malicious downgrading to any mutually acceptable, but not preferred, encryption type. This places a requirement on each peer to only accept encryption types it trust fully. In other words, the Telnet encryption protocol do not guarantee that the strongest mutually acceptable encryption type is always selected. B.2.5.2 AES-CCM Security Considerations ....................................... The integrity and privacy claims are inherited from AES-CCM. In particular, the implementation must make sure a nonce is not used more than once together with the same key. Furthermore, the encryption key is assumed to be random, i.e., it should not be possible to guess it with probability of success higher than guessing any uniformly selected random key. RFC 1750 gives an overview of issues and recommendations related to randomness. B.2.6 Acknowledgments --------------------- This document is based on the various Telnet Encryption RFCs (RFC 2946, RFC 2947, RFC 2948, RFC 2952 and RFC 2953).  File: shishi.info, Node: Kerberized rsh and rlogin, Next: Key as initialization vector, Prev: Telnet encryption with AES-CCM, Up: Protocol Extensions B.3 Kerberized rsh and rlogin ============================= This appendix describe the KCMDV0.2 protocol used in shishi patched version of inetutils. The KCMD protocol was developped by the MIT Kerberos team for kerberized rsh an rlogin programs. Differences between rlogin an rsh will be explained, like those between v0.1 and v0.2 of the protocol for compatibility reasons. It is possible that some parts of this document are not in conformity with original KCMD protocol because there is no official specification about it. However, it seems that shishi implementation is compatible with MIT's one. *Warning:* If you are seriously considering using Kerberos rsh or rlogin, instead of more robust remote access protocols such as SSH, you may first want to explore `http://www.cs.berkeley.edu/~hildrum/kerberos/' and the full paper at `http://www.cs.berkeley.edu/~hildrum/043.pdf'. B.3.1 Establish connection -------------------------- First the client should establish a TCP connection with the server. Default ports are 543 (klogin), 544 (kshell), 2105 (eklogin). eklogin is the same as klogin but with encryption. Their is no longer ekshell port because encrypted and normal connection use the same port (kshell). Kshell need a second connection for stderr. The client should send a null terminated string that represent the port of this second connection. Klogin and eklogin does not use a second connection for stderr so the client must send a null byte to the server. Contrary to classic rsh/rlogin, server must not check if the client port is in the range 0-1023. B.3.2 Kerberos identification ----------------------------- When connections are established, first thing to do is to indicate kerberos authentication must be used. So the client will send a string to indicate it will used kerberos 5. It will call a length-string "strl" the couple (lenght of the string strl, null terminated string strl). Length of the string is an int32 (32bits int) in MSB order (for the network). So the client send this length-string strl : KRB5_SENDAUTH_V1.0 After that the client must indicate which version of the protocol it will used by sending this length-string strl : KCMDV0.2 It can be V0.1 for older versions. If indentification from client is good, server will send a null byte (0x00). Else if authentication message is wrong, server send byte 0x01, else if protocol version message is wrong server send byte 0x02. B.3.3 Kerberos authentication ----------------------------- When client is indentified, kerberos authentication can begin. The client must send an AP-REQ to the server. AP-REQ authenticator must have a subkey (only for KCMDV0.2) and a checksum. Authenticator checksum is created on following string : "serverport:""terminaltype""remoteusername" for example : 543:linux/38400user remoteusername corresponds to the identity of the client on remote machine. AP-REQ is sended in der encoded format. The length (int32) of der encoded AP-REQ is sended in network format (MSB), following by the der encoded AP-REQ. If all is correct, server send a null int32 (MSB format but like it is null it is not important). KCMD protocol use mutual authentication, so server must now send and AP-REP : (in32 lenght in MSB of der encoded AP-REP)(der encoded AP-REP). Now server and client are partially authenticated. B.3.4 Extended authentication ----------------------------- Client must now send 3 different null terminated strings (without lenght) : * remote user name (user identity on remote machine) * terminal type for rlogin or command for rsh * local user name (user identity on client machine) example for rsh : "rname\0" "cat /usr/local/etc/shishi.conf" "lname\0" Server must verify that checksum in AP-REQ authenticator is correct by computing a new hash like client has done. Server must verify that principal (in AP-REQ) has right to log in on the remote user account. For the moment shishi only check if remote user name is equal to principal. A more complex authorization code is planned. Look at the end to know how MIT/Heimdal do to check authorization. If all is correct server send a null byte, else an error message string (null terminated string) is sent. User read the first byte. If it is equal to zero, authentication is correct and is logged on the remote host. Else user can read the error messsage send by the server. B.3.5 Window size ----------------- For rlogin protocol, when authentication is complete, the server can optionnaly send a message to ask for window terminal size of user. Then the user can respond but it is not an obligation. In KCMDV0.1 server send an urgent TCP message (MSG_OOB) with one byte : TIOCPKT_WINDOW = 0x80 In KCMDV0.2 server does not send an urgent message but write on the socket 5 bytes : '\377', '\377', 'o', 'o', TIOCPKT_WINDOW If encryption is enabled (eklogin) server must send this 5 bytes encrypted. Client can answer in both protocol version with : '\377', '\377', 's', 's', "struct winsize" The winsize structure is filled with corresponding setting to client's terminal. If encryption is enabled this answer must be send encrypted. B.3.6 End of authentication --------------------------- The "classic" rsh/rlogin can be used now. B.3.7 Encryption ---------------- Encryption mode is used when a connection with eklogin is established. Encryption with krsh can be used too. Before, there was a specific port for that (ekshell), but now to indicate that encryption must be used with krsh, client must add "-x " before the command when it send it between remote user name and local user name. When the client compute the checksum for AP-REQ authenticator the "- x" must not be included. Encryption in KCMDV0.2 is not the same as in KCMDV0.1. KCMDV0.1 uses ticket session key as encryption key, and use standard Kerberos encryption functions. This protocol only supports des-cbc-crc, des-cbc-md4, des-cbc-md5 and does not use initialisation vectors. For example on each encryption/decryption calls, the following prototype kerberos function should be used : kerberos_encrypt (key, keyusage, in, out) (or decrypt) KCMDV0.2 can be used with all kerberos encryption modes (des, 3des, aes, arcfour) and use AP-REQ authenticator subkey. In opposite to KCMDV0.1 initialisation vectors are used. All encryptions/descryptions must be made using a cryptographic context (for example to use the updated iv, or sbox) : kerberos_init(ctx, iv, key, keyusage) kerberos_encrypt (ctx, in, out) For both protocols, keyusage id for des-cbc-md5, des-cbc-md4, des-cbc-crc and des3-cbc-sha1 (for KCMDV0.2) : keyusage = 1026 For other KCMDV0.2 modes keyusage is different for each encryption/decryption usage. To understand, eklogin use 1 socket. It encrypts data (output 1) to send and decrypts (input 1) received data. Kshell use 2 sockets (1 for transmit data, 1 for stderr). So there are four modes : transmit : input 1 output 1 stderr : input 2 output 2 There is a keyusage for each modes. The keyusage must correspond on client and server side. For example in klogin client input 1 keyusage will be server output 1 keyusage. I/O Client Server intput 1 1028 1030 output 1 1030 1028 intput 2 1032 1034 output 2 1034 1032 Those keyusages must be used with AES and ARCFOUR modes. KCMDV0.2 uses IV (initialisation vector). Like for keyusage, client IV must correspond to server IV. IV size is equal to key type, blocksize. All bytes of IV must be initialised to : I/O Client Server intput 1 0 1 output 1 1 0 intput 2 2 3 output 2 3 2 ARCFOUR mode does not use IV. However, like it is said before, a context must be used to keep the updated sbox. Normal message with klogin and kshell are sent like that : (int 32 lenght of message in MSB order) (message) In encrypted mode it is a bit different : (int 32 length of unencrypted message in MSB order) (encrypted message) In KCMDV0.2 encrypted message is create like that : encrypt ( (int 32 length of message in MSB order) (message) ) A check on message size can be made in second version of the protocol. B.3.8 KCMDV0.3 -------------- This part only gives possible ways to extend KCMD protocol. Does not take that as must have in KCMD implementation. Extensions of KCMV0.2 could be made. For example kshell supposes there are no files with name "-x *". I think the same thing can be supposed with terminal name for klogin. So client could add "-x " to terminal type it sends to server to indicate it will use encryption. Like that there will be only one port for klogin/eklogin : 543. In encrypted mode kshell send command in clear on the network, this could be considered as insecure as user have decided to use encryption. This is not really a problem for klogin because it just sends terminal type. In encrypted mode, klogin and kshell clients could only send "-x" as command or terminal type. After that encryption is activated, and the client could send terminal type or command encrypted. The server will send the null byte to say that all is correct, or error message in encrypted form. B.3.9 MIT/Heimdal authorization ------------------------------- This part describes how MIT/Heimdal version check authorization of the user to log in on the remote machine. Authorization check is made by looking if the file .k5login exists on the account of the remote user. If this file does not exist, remote user name must be the same as principal in AP-REQ to valid authorization. Else if this file exists, check first verify that remote user or root are the owner of .k5login. If it is not the case, the check fails. If it is good, check reads each line of that file and compare each readed name to principal. If principal is found in .k5login, authorization is valid, else user is not allowed to connect on remote host with the specified remote user name (that can be the same as principal). So someone (for example user "user1") can remote log into "user2" account if .k5login is present in user2 home dir and this file is owned by user2 or root and user1 name is present in this file.  File: shishi.info, Node: Key as initialization vector, Next: The Keytab Binary File Format, Prev: Kerberized rsh and rlogin, Up: Protocol Extensions B.4 Key as initialization vector ================================ The `des-cbc-crc' algorithm (*note Cryptographic Overview::) uses the DES key as the initialization vector. This is problematic in general (see below(1)), but may be mitigated in Kerberos by the CRC checksum that is also included. From daw@espresso.CS.Berkeley.EDU Fri Mar 1 13:32:34 PST 1996 Article: 50440 of sci.crypt Path: agate!daw From: daw@espresso.CS.Berkeley.EDU (David A Wagner) Newsgroups: sci.crypt Subject: Re: DES-CBC and Initialization Vectors Date: 29 Feb 1996 21:48:16 GMT Organization: University of California, Berkeley Lines: 31 Message-ID: <4h56v0$3no@agate.berkeley.edu> References: <4h39li$33o@gaia.ns.utk.edu> NNTP-Posting-Host: espresso.cs.berkeley.edu In article <4h39li$33o@gaia.ns.utk.edu>, Nair Venugopal wrote: > Is there anything wrong in using the key as the I.V. in DES-CBC mode? Yes, you're open to a chosen-ciphertext attack which recovers the key. Alice is sending stuff DES-CBC encrypted with key K to Bob. Mary is an active adversary in the middle. Suppose Alice encrypts some plaintext blocks P_1, P_2, P_3, ... in DES-CBC mode with K as the IV, and sends off the resulting ciphertext A->B: C_1, C_2, C_3, ... where each C_j is a 8-byte DES ciphertext block. Mary wants to discover the key K, but doesn't even know any of the P_j's. She replaces the above message by M->B: C_1, 0, C_1 where 0 is the 8-byte all-zeros block. Bob will decrypt under DES-CBC, recovering the blocks Q_1, Q_2, Q_3 where Q_1 = DES-decrypt(K, C_1) xor K = P_1 Q_2 = DES-decrypt(K, C_2) xor C_1 = (some unimportant junk) Q_3 = DES-decrypt(K, C_1) xor 0 = P_1 xor K Bob gets this garbage-looking message Q_1,Q_2,Q_3 which Mary recovers (under the chosen-ciphertext assumption: this is like a known-plaintext attack, which isn't too implausible). Notice that Mary can recover K by K = Q_1 xor Q_3; so after this one simple active attack, Mary gets the key back! So, if you must use a fixed IV, don't use the key-- use 0 or something like that. Even better, don't use a fixed IV-- use the DES encryption of a counter, or something like that. ---------- Footnotes ---------- (1) The post is copyrighted by David Wagner, included here with permission, the canonical location is `http://www.cs.berkeley.edu/~daw/my-posts/key-as-iv-broken'  File: shishi.info, Node: The Keytab Binary File Format, Next: The Credential Cache Binary File Format, Prev: Key as initialization vector, Up: Protocol Extensions B.5 The Keytab Binary File Format ================================= The keytab file format is described in the file `keytab.txt', included in verbatim below. The Kerberos Keytab Binary File Format Copyright (C) 2006 Michael B Allen http://www.ioplex.com/utilities/keytab.txt Last updated: Fri May 5 13:39:40 EDT 2006 The MIT keytab binary format is not a standard format, nor is it documented anywhere in detail. The format has evolved and may continue to. It is however understood by several Kerberos implementations including Heimdal and of course MIT and keytab files are created by the ktpass.exe utility from Windows. So it has established itself as the defacto format for storing Kerberos keys. The following C-like structure definitions illustrate the MIT keytab file format. All values are in network byte order. All text is ASCII. keytab { uint16_t file_format_version; /* 0x502 */ keytab_entry entries[*]; }; keytab_entry { int32_t size; uint16_t num_components; /* sub 1 if version 0x501 */ counted_octet_string realm; counted_octet_string components[num_components]; uint32_t name_type; /* not present if version 0x501 */ uint32_t timestamp; uint8_t vno8; keyblock key; uint32_t vno; /* only present if >= 4 bytes left in entry */ }; counted_octet_string { uint16_t length; uint8_t data[length]; }; keyblock { uint16_t type; counted_octet_string; }; The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502. The format of older keytabs is described at the end of this document. The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry. Note that the size should be evaluated as signed. This is because a negative value indicates that the entry is in fact empty (e.g. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry. Based on these size values alone the entire keytab file can be traversed. The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array. The num_components field is followed by a counted_octet_string representing the realm of the principal. A counted_octet_string is simply an array of bytes prefixed with a 16 bit length. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator. Following the realm is the components array that represents the name of the principal. The text of these components may be joined with slashs to construct the typical SPN representation. For example, the service principal HTTP/www.foo.net@FOO.NET would consist of name components "HTTP" followed by "www.foo.net". Following the components array is the 32 bit name_type (e.g. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL. The 32 bit timestamp indicates the time the key was established for that principal. The value represents the number of seconds since Jan 1, 1970. The 8 bit vno8 field is the version number of the key. This value is overridden by the 32 bit vno field if it is present. The keyblock structure consists of a 16 bit value indicating the keytype (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, 16 is des3-cbc-sha1, etc). This is followed by a counted_octet_string containing the key. The last field of the keytab_entry structure is optional. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present. This value supersedes the 8 bit vno8 value preceeding the keyblock. Older keytabs with a file_format_version of 0x501 are different in three ways: 1) All integers are in host byte order [1]. 2) The num_components field is 1 too large (i.e. after decoding, decrement by 1). 3) The 32 bit name_type field is not present. [1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively. Permission to copy, modify, and distribute this document, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include this copyright notice in ALL copies of the document or portions thereof, including modifications.  File: shishi.info, Node: The Credential Cache Binary File Format, Prev: The Keytab Binary File Format, Up: Protocol Extensions B.6 The Credential Cache Binary File Format =========================================== The credential cache file format is described in the file `keytab.txt', included in verbatim below. The Kerberos Credential Cache Binary File Format Copyright (C) 2006-2013 Simon Josefsson http://josefsson.org/shishi/ccache.txt Last updated: Sat Sep 23 12:04:11 CEST 2006 Like the MIT keytab binary format (see Michael B Allen's reverse engineered description in keytab.txt), the credential cache format is not standard nor documented anywhere. In C style notation, the MIT credential cache file format is as follows. All values are in network byte order. All text is ASCII. ccache { uint16_t file_format_version; /* 0x0504 */ uint16_t headerlen; /* only if version is 0x0504 */ header headers[]; /* only if version is 0x0504 */ principal primary_principal; credential credentials[*]; }; header { uint16_t tag; /* 1 = DeltaTime */ uint16_t taglen; uint8_t tagdata[taglen] }; The ccache.taglen and ccache.tags fields are only present in 0x0504 versions, not in earlier. Both MIT and Heimdal appear to correctly ignore unknown tags, so it appears safe to add them (although there is no central place to "register" tags). Currently only one tag is widely implemented, DeltaTime (0x0001). Its taglen is always 8, and tagdata will contain: DeltaTime { uint32_t time_offset; uint32_t usec_offset; }; After reading the file_format_version, header tags, and default principal, a list of credentials follow. You deduce from the file length when there are no more credentials. credential { principal client; principal server; keyblock key; times time; uint8_t is_skey; /* 1 if skey, 0 otherwise */ uint32_t tktflags; /* stored in reversed byte order */ uint32_t num_address; address addrs[num_address]; uint32_t num_authdata; authdata authdata[num_authdata]; countet_octet_string ticket; countet_octet_string second_ticket; }; keyblock { uint16_t keytype; uint16_t etype; /* only present if version 0x0503 */ uint16_t keylen; uint8_t keyvalue[keylen]; }; times { uint32_t authtime; uint32_t starttime; uint32_t endtime; uint32_t renew_till; }; address { uint16_t addrtype; counted_octet_string addrdata; }; authdata { uint16_t authtype; counted_octet_string authdata; }; principal { uint32_t name_type; /* not present if version 0x0501 */ uint32_t num_components; /* sub 1 if version 0x501 */ counted_octet_string realm; counted_octet_string components[num_components]; }; counted_octet_string { uint32_t length; uint8_t data[length]; }; Permission to copy, modify, and distribute this document, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include this copyright notice in ALL copies of the document or portions thereof, including modifications.  File: shishi.info, Node: Copying Information, Next: Function and Data Index, Prev: Protocol Extensions, Up: Top Appendix C Copying Information ****************************** * Menu: * GNU Free Documentation License:: License for copying this manual. shishi-1.0.2/doc/shishid.10000644000000000000000000000453212126773204012162 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH SHISHID "1" "April 2013" "shishid 1.0.2" "User Commands" .SH NAME shishid \- Shishi KDC server .SH SYNOPSIS .B shishid [\fIOPTIONS\fR]... .SH DESCRIPTION shishid 1.0.2 .PP Shishi Key Distribution Center server. .TP \fB\-h\fR, \fB\-\-help\fR Print help and exit .TP \fB\-V\fR, \fB\-\-version\fR Print version and exit .SS "Commands:" .TP \fB\-l\fR, \fB\-\-listen\fR=\fI[FAMILY\fR:]ADDR:PORT/TYPE Sockets to listen for queries on. Family is .IP `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'. .TP \fB\-u\fR, \fB\-\-setuid\fR=\fINAME\fR After binding socket, set user identity. .SS "TLS settings:" .TP \fB\-\-no\-tls\fR Disable TLS support (default=off) .TP \fB\-\-x509cafile\fR=\fIFILE\fR X.509 certificate authorities used to verify client certificates, in PEM format. .TP \fB\-\-x509certfile\fR=\fIFILE\fR X.509 server certificate, in PEM format. .TP \fB\-\-x509crlfile\fR=\fIFILE\fR X.509 certificate revocation list to check for revoked client certificates, in PEM format. .TP \fB\-\-x509keyfile\fR=\fIFILE\fR X.509 server certificate key, in PEM format. .TP \fB\-\-resume\-limit\fR=\fISHORT\fR Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). (default=`50') .SS "Other options:" .HP \fB\-c\fR, \fB\-\-configuration\-file\fR=\fIFILE\fR Use specified configuration file. .TP \fB\-v\fR, \fB\-\-verbose\fR Produce verbose output. Use multiple times to increase amount of information. .TP \fB\-q\fR, \fB\-\-quiet\fR Don't produce any diagnostic output. (default=off) .PP Mandatory arguments to long options are mandatory for short options too. .SH AUTHOR Written by Simon Josefsson. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2013 Simon Josefsson. License GPLv3+: GNU GPL version 3 or later . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B shishid is maintained as a Texinfo manual. If the .B info and .B shishid programs are properly installed at your site, the command .IP .B info shishid .PP should give you access to the complete manual. shishi-1.0.2/doc/man/0000755000000000000000000000000012126773323011276 500000000000000shishi-1.0.2/doc/man/shishi_aprep.30000644000000000000000000000177112126773112013762 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_aprep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new AP\-REP, populated with some default values. .SH "RETURN VALUE" Returns the authenticator or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_ctime.30000644000000000000000000000232112126773124016701 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_ctime(Shishi * " handle ", Shishi_asn1 " authenticator ", char ** " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator as allocated by \fBshishi_authenticator()\fP. .IP "char ** t" 12 newly allocated zero\-terminated character array with client time. .SH "DESCRIPTION" Extract client time from Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asreq.30000644000000000000000000000176312126773143013773 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new AS\-REQ, populated with some default values. .SH "RETURN VALUE" Returns the AS\-REQ or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_seqnumber_set.30000644000000000000000000000240212126773125020455 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_seqnumber_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_seqnumber_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_seqnumber_set(Shishi * " handle ", Shishi_asn1 " authenticator ", uint32_t " seqnumber ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "uint32_t seqnumber" 12 integer with sequence number field to store in Authenticator. .SH "DESCRIPTION" Store sequence number field in Authenticator. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_add_padata.30000644000000000000000000000307412126773146016253 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_add_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_add_padata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_add_padata(Shishi * " handle ", Shishi_asn1 " kdcreq ", int " padatatype ", const char * " data ", size_t " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to add PA\-DATA to. .IP "int padatatype" 12 type of PA\-DATA, see Shishi_padata_type. .IP "const char * data" 12 input array with PA\-DATA value. .IP "size_t datalen" 12 size of input array with PA\-DATA value. .SH "DESCRIPTION" Add new pre authentication data (PA\-DATA) to KDC\-REQ. This is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP\-REQ that authenticates the user to get the ticket. (But also see \fBshishi_kdcreq_add_padata_tgs()\fP which takes an AP\-REQ directly.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_new.30000644000000000000000000000263612126773176014524 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_new" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_new \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_new(Shishi_tkts * " tkts ", Shishi_asn1 " ticket ", Shishi_asn1 " enckdcreppart ", Shishi_asn1 " kdcrep ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_asn1 ticket" 12 input ticket variable. .IP "Shishi_asn1 enckdcreppart" 12 input ticket detail variable. .IP "Shishi_asn1 kdcrep" 12 input KDC\-REP variable. .SH "DESCRIPTION" Allocate a new ticket and add it to the ticket set. Note that \fIticket\fP, \fIenckdcreppart\fP and \fIkdcrep\fP are stored by reference, so you must not de\-allocate them before the ticket is removed from the ticket set and de\-allocated. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_random.30000644000000000000000000000236312126773150015003 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_random" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_random \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_random(Shishi * " handle ", int32_t " type ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "Shishi_key ** key" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure for the key type and some random data. KEY contains a newly allocated structure only if this function is successful. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_realm.30000644000000000000000000000227312126773154016542 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_realm(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * realm" 12 input array with (server) realm. .SH "DESCRIPTION" Set (server) realm field in krberror to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_key_update.30000644000000000000000000000414612126773201014623 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_key_update" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_key_update \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_key_update(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_key * " oldkey ", const Shisa_key * " newkey ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to remove key for. .IP "const Shisa_key * oldkey" 12 Pointer to Shisa key structure with hints on matching the key to modify. .IP "const Shisa_key * newkey" 12 Pointer to Shisa key structure with new values for the key, note that all fields are used (and not just the ones specified by \fIoldkey\fP). .SH "DESCRIPTION" Modify data about a key in the database, for the given PRINCIPAL\fIREALM\fP. First the \fIoldkey\fP is used to locate the key to update (similar to \fBshisa_keys_find()\fP), then that key is modified to contain whatever information is stored in \fInewkey\fP. Not all elements of \fIoldkey\fP need to be filled out, only enough as to identify the key uniquely. For example, if you want to modify the information stored for the only key with an etype of 3 (DES\-CBC\-MD5), set the \fIkey\fP\->etype field to 3, and set all other fields to 0. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP on success, \fBSHISA_NO_KEY\fP if no key could be identified, and \fBSHISA_MULTIPLE_KEY_MATCH\fP if more than one key matched the given criteria, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_init_with_paths.30000644000000000000000000000270712126773202015670 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_init_with_paths" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_init_with_paths \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_init_with_paths(Shisa ** " dbh ", const char * " file ");" .SH ARGUMENTS .IP "Shisa ** dbh" 12 pointer to library handle to be created. .IP "const char * file" 12 Filename of system configuration, or NULL. .SH "DESCRIPTION" Create a Shisa library handle, using \fBshisa()\fP, and read the system configuration file indicated location (or the default location, if \fBNULL\fP). The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf). The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_krbsafe.30000644000000000000000000000173212126773120015206 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_krbsafe" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_krbsafe \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_krbsafe(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for KRB\-SAFE. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_message.30000644000000000000000000000240212126773156016207 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_message" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_message \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_krberror_message(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .SH "DESCRIPTION" Extract error code (see \fBshishi_krberror_errorcode_fast()\fP) and return error message (see \fBshishi_krberror_errorcode_message()\fP). .SH "RETURN VALUE" Return a string describing error code. This function will always return a string even if the error code isn't known. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_forwardable_p.30000644000000000000000000000255212126773145017017 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_forwardable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_forwardable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_forwardable_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option forwardable flag is set. The FORWARDABLE option indicates that the ticket to be issued is to have its forwardable flag set. It may only be set on the initial request, or in a subsequent request if the ticket\-granting ticket on which it is based is also forwardable. .SH "RETURN VALUE" Returns non\-0 iff forwardable flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_set_user_data.30000644000000000000000000000240712126773165016500 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_set_user_data" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_set_user_data \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_set_user_data(Shishi * " handle ", Shishi_asn1 " safe ", const char * " userdata ", size_t " userdatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "const char * userdata" 12 input user application to store in SAFE. .IP "size_t userdatalen" 12 size of input user application to store in SAFE. .SH "DESCRIPTION" Set the application data in SAFE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_client_set.30000644000000000000000000000230312126773153016711 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_client_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_client_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_client_set(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " client ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror to set client name field in. .IP "const char * client" 12 zero\-terminated string with principal name on RFC 1964 form. .SH "DESCRIPTION" Set the client name field in the Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_read.30000644000000000000000000000221712126773114014754 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * apreq" 12 output variable with newly allocated AP\-REQ. .SH "DESCRIPTION" Read DER encoded AP\-REQ from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator.30000644000000000000000000000215312126773123015522 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_authenticator(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. .SH "RETURN VALUE" Returns the authenticator or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_build.30000644000000000000000000000224212126773153015661 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_build(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Finish KRB\-ERROR, called before e.g. shishi_krberror_der. This function removes empty but OPTIONAL fields (such as cname), and .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_encrypteddata.30000644000000000000000000000175712126773117016435 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_encrypteddata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_encrypteddata \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_encrypteddata(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for EncryptedData .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_read.30000644000000000000000000000222612126773143015117 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * kdcreq" 12 output variable with newly allocated KDC\-REQ. .SH "DESCRIPTION" Read DER encoded KDC\-REQ from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_add_authenticator.30000644000000000000000000000263512126773114017527 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_add_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_add_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_add_authenticator(Shishi * " handle ", Shishi_asn1 " apreq ", Shishi_key * " key ", int " keyusage ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ to add authenticator field to. .IP "Shishi_key * key" 12 key to to use for encryption. .IP "int keyusage" 12 cryptographic key usage value to use in encryption. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Encrypts DER encoded authenticator using key and store it in the AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv.30000644000000000000000000000205712126773161013635 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv(Shishi * " handle ", Shishi_priv ** " priv ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_priv ** priv" 12 pointer to new structure that holds information about PRIV exchange .SH "DESCRIPTION" Create a new PRIV exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_ticket.30000644000000000000000000000172412126773120015055 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_ticket(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for Ticket. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_etext.30000644000000000000000000000214712126773155017276 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_etext" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_etext \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_etext(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove error text (e\-text) field in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys.30000644000000000000000000000203612126773150013623 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys(Shishi * " handle ", Shishi_keys ** " keys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_keys ** keys" 12 output pointer to newly allocated keys handle. .SH "DESCRIPTION" Get a new key set handle. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_parse_name.30000644000000000000000000000304612126773160014765 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_parse_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_parse_name \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_parse_name(Shishi * " handle ", const char * " name ", char ** " principal ", char ** " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "const char * name" 12 input principal name string, e.g. imap/mail.gnu.org\\fIGNU\fP.ORG. .IP "char ** principal" 12 newly allocated output string with principal name. .IP "char ** realm" 12 newly allocated output string with realm name. .SH "DESCRIPTION" Split principal name (e.g., "simon\\fIJOSEFSSON\fP.ORG") into two newly allocated strings, the \fIprincipal\fP ("simon"), and the \fIrealm\fP ("JOSEFSSON.ORG"). If there is no realm part in \fIname\fP, \fIrealm\fP is set to NULL. .SH "RETURN VALUE" Returns SHISHI_INVALID_PRINCIPAL_NAME if \fIname\fP is NULL or ends with the escape character "\", and SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_get_key.30000644000000000000000000000224712126773133017050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_get_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_get_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_get_key(Shishi * " handle ", Shishi_asn1 " encapreppart ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 input EncAPRepPart variable. .IP "Shishi_key ** key" 12 newly allocated key. .SH "DESCRIPTION" Extract the subkey from the encrypted AP\-REP part. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_authtime_set.30000644000000000000000000000234412126773134020254 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_authtime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_authtime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_authtime_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", const char * " authtime ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "const char * authtime" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.authtime to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509cert_default_file.30000644000000000000000000000230212126773160016733 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509cert_default_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509cert_default_file \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_x509cert_default_file(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename for default X.509 certificate. .SH "RETURN VALUE" Returns the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_save.30000644000000000000000000000225512126773123016543 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Save DER encoding of authenticator to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_read.30000644000000000000000000000224412126773152015476 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * krberror" 12 output variable with newly allocated KRB\-ERROR. .SH "DESCRIPTION" Read DER encoded KRB\-ERROR from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_remove_subkey.30000644000000000000000000000220212126773126020457 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_remove_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_remove_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_remove_subkey(Shishi * " handle ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Remove subkey from the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_get_enc_part_etype.30000644000000000000000000000224312126773170020055 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_get_enc_part_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_get_enc_part_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_get_enc_part_etype(Shishi * " handle ", Shishi_asn1 " ticket ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 Ticket variable to get value from. .IP "int32_t * etype" 12 output variable that holds the value. .SH "DESCRIPTION" Extract Ticket.enc\-part.etype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_startctime.30000644000000000000000000000211312126773174015713 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_startctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_startctime \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_tkt_startctime(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past). .SH "RETURN VALUE" Returns C time interpretation of the endtime in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_tkt_set.30000644000000000000000000000173112126773116015013 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_tkt_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_tkt_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_as_tkt_set(Shishi_as * " as ", Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_tkt * tkt" 12 tkt to store in AS. .SH "DESCRIPTION" Set the Tkt in the AS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_clear_padata.30000644000000000000000000000210312126773146016601 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_clear_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_clear_padata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_clear_padata(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to remove PA\-DATA from. .SH "DESCRIPTION" Remove the padata field from KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_tgtkt_set.30000644000000000000000000000200312126773166015536 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_tgtkt_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_tgtkt_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tgs_tgtkt_set(Shishi_tgs * " tgs ", Shishi_tkt * " tgtkt ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "Shishi_tkt * tgtkt" 12 ticket granting ticket to store in TGS. .SH "DESCRIPTION" Set the Ticket in the TGS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_cusec_set.30000644000000000000000000000226112126773154016541 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_cusec_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_cusec_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_cusec_set(Shishi * " handle ", Shishi_asn1 " krberror ", uint32_t " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "uint32_t cusec" 12 client microseconds to set in krberror, 0\-999999. .SH "DESCRIPTION" Set the cusec field in the Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe.30000644000000000000000000000205712126773164013576 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe(Shishi * " handle ", Shishi_safe ** " safe ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_safe ** safe" 12 pointer to new structure that holds information about SAFE exchange .SH "DESCRIPTION" Create a new SAFE exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_tgsrep.30000644000000000000000000000172612126773120015100 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_tgsrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_tgsrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_tgsrep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for TGS\-REP. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_priv_der_set.30000644000000000000000000000230512126773162016377 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_priv_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_priv_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_priv_der_set(Shishi_priv * " priv ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "char * der" 12 input array with DER encoded KRB\-PRIV. .IP "size_t derlen" 12 length of input array with DER encoded KRB\-PRIV. .SH "DESCRIPTION" DER decode KRB\-PRIV and set it PRIV exchange. If decoding fails, the KRB\-PRIV in the PRIV exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_nth.30000644000000000000000000000231712126773176014520 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_nth" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_nth \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_nth(Shishi_tkts * " tkts ", int " ticketno ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "int ticketno" 12 integer indicating requested ticket in ticket set. .SH "GET THE N" th ticket in ticket set. .SH "RETURN VALUE" Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_supported_p.30000644000000000000000000000172012126773130016543 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_supported_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_supported_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cipher_supported_p(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Find out if cipher is supported. .SH "RETURN VALUE" Return 0 iff cipher is unsupported. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_cname_set.30000644000000000000000000000245512126773142016144 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_cname_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_cname_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_cname_set(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_name_type " name_type ", const char * [] " cname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 Kdcrep variable to set server name field in. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] cname" 12 input array with principal name. .SH "DESCRIPTION" Set the client name field in the KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_key.30000644000000000000000000000200712126773161014500 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_key \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_priv_key(Shishi_priv * " priv ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .SH "DESCRIPTION" Get key from PRIV exchange. .SH "RETURN VALUE" Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap.30000644000000000000000000000261412126773106013253 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap(Shishi * " handle ", Shishi_ap ** " ap ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .SH "DESCRIPTION" Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use \fBshishi_ap_etype()\fP or \fBshishi_ap_nosubkey()\fP instead. In the future, this function will likely behave as \fBshishi_ap_nosubkey()\fP and \fBshishi_ap_nosubkey()\fP will be removed. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_pre_authent_p.30000644000000000000000000000260012126773173016371 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_pre_authent_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_pre_authent_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_pre_authent_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket was pre\-authenticated. The PRE\-AUTHENT and HW\-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket\-granting ticket (in which case the INITIAL flag is clear, but the PRE\-AUTHENT and HW\-AUTHENT flags are carried forward from the ticket\-granting ticket). .SH "RETURN VALUE" Returns non\-0 iff pre\-authent flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_default_set.30000644000000000000000000000227712126773160017220 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_default_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_default_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_principal_default_set(Shishi * " handle ", const char * " principal ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "const char * principal" 12 string with new default principal name, or NULL to reset to default. .SH "DESCRIPTION" Set the default principal used by the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_authtime_set.30000644000000000000000000000234412126773136020271 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_authtime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_authtime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_authtime_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", const char * " authtime ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "const char * authtime" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.authtime to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_add_padata_preauth.30000644000000000000000000000226712126773146020006 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_add_padata_preauth" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_add_padata_preauth \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_add_padata_preauth(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to add pre\-authentication data to. .IP "Shishi_key * key" 12 Key used to encrypt pre\-auth data. .SH "DESCRIPTION" Add pre\-authentication data to KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_enckdcreppart.30000644000000000000000000000234112126773122017172 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_enckdcreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_enckdcreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_enckdcreppart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncKDCRepPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_server.30000644000000000000000000000317312126773170015526 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_server(Shishi * " handle ", Shishi_asn1 " ticket ", char ** " server ", size_t * " serverlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 ASN.1 Ticket variable to get server name from. .IP "char ** server" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIserverlen\fP). .IP "size_t * serverlen" 12 pointer to length of \fIserver\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIserver\fP). .SH "DESCRIPTION" Represent server principal name in Ticket as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIserverlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error_set.30000644000000000000000000000256612126773136014670 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_error_set(Shishi * " handle ", const char * " errstr ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * errstr" 12 Zero terminated character array containing error description, or NULL to clear the error description string. .SH "DESCRIPTION" Set the detailed error information string to specified string. The string is copied into the Shishi internal structure, so you can deallocate the string passed to this function after the call. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_info.30000644000000000000000000000201312126773201013413 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_info" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_info \- API function .SH SYNOPSIS .B #include .sp .BI "void shisa_info(Shisa * " dbh ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * format" 12 printf style format string. @...: print style arguments. .IP " ..." 12 .SH "DESCRIPTION" Print informational message to standard error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hmac_sha1.30000644000000000000000000000265212126773156014506 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hmac_sha1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hmac_sha1 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_hmac_sha1(Shishi * " handle ", const char * " key ", size_t " keylen ", const char * " in ", size_t " inlen ", char * " outhash[20] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * key" 12 input character array with key to use. .IP "size_t keylen" 12 length of input character array with key to use. .IP "const char * in" 12 input character array of data to hash. .IP "size_t inlen" 12 length of input character array of data to hash. .IP "char * outhash[20]" 12 .SH "DESCRIPTION" Compute keyed checksum of data using HMAC\-SHA1. The \fIouthash\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_get_enc_part_etype.30000644000000000000000000000224012126773113017673 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_get_enc_part_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_get_enc_part_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_get_enc_part_etype(Shishi * " handle ", Shishi_asn1 " aprep ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 aprep" 12 AP\-REP variable to get value from. .IP "int32_t * etype" 12 output variable that holds the value. .SH "DESCRIPTION" Extract AP\-REP.enc\-part.etype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_print.30000644000000000000000000000204412126773127014626 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg_print(Shishi * " handle ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "FILE * fh" 12 file descriptor opened for writing. .SH "DESCRIPTION" Print library configuration status, mostly for debugging purposes. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der_msgtype.30000644000000000000000000000225512126773121015173 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der_msgtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der_msgtype \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_msgtype shishi_der_msgtype(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Determine msg\-type of DER coded data of a packet. .SH "RETURN VALUE" Returns msg\-type of DER data, 0 on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_encticketpart_set.30000644000000000000000000000202112126773171017242 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_encticketpart_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_encticketpart_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_encticketpart_set(Shishi_tkt * " tkt ", Shishi_asn1 " encticketpart ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "Shishi_asn1 encticketpart" 12 encticketpart to store in ticket. .SH "DESCRIPTION" Set the EncTicketPart in the Ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_set_realmserver.30000644000000000000000000000226412126773170016734 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_set_realmserver" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_set_realmserver \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_set_realmserver(Shishi_tgs * " tgs ", const char * " realm ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "const char * realm" 12 indicates the realm to acquire ticket for. .IP "const char * server" 12 indicates the server to acquire ticket for. .SH "DESCRIPTION" Set the realm and server in the TGS\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_save.30000644000000000000000000000212412126773113014772 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " aprep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 aprep" 12 AP\-REP to save. .SH "DESCRIPTION" Save DER encoding of AP\-REP to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_rep_build.30000644000000000000000000000216112126773167015501 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_rep_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_rep_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_rep_build(Shishi_tgs * " tgs ", int " keyusage ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "int keyusage" 12 keyusage integer. .IP "Shishi_key * key" 12 user's key, used to encrypt the encrypted part of the TGS\-REP. .SH "DESCRIPTION" Build TGS\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_from_name.30000644000000000000000000000330212126773150015460 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_from_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_from_name \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_from_name(Shishi * " handle ", int32_t " type ", const char * " name ", const char * " password ", size_t " passwordlen ", const char * " parameter ", Shishi_key ** " outkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "const char * name" 12 principal name of user. .IP "const char * password" 12 input array containing password. .IP "size_t passwordlen" 12 length of input array containing password. .IP "const char * parameter" 12 input array with opaque encryption type specific information. .IP "Shishi_key ** outkey" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure, and derive the key from principal name and password using \fBshishi_key_from_name()\fP. The salt is derived from the principal name by concatenating the decoded realm and principal. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_keytype_fast.30000644000000000000000000000205212126773174016245 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_keytype_fast" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_keytype_fast \- API function .SH SYNOPSIS .B #include .sp .BI "int32_t shishi_tkt_keytype_fast(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Extract encryption type of key in ticket (really EncKDCRepPart). .SH "RETURN VALUE" Returns encryption type of session key in ticket (really EncKDCRepPart), or \-1 on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_to_file.30000644000000000000000000000242112126773151015323 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_to_file(Shishi * " handle ", const char * " filename ", Shishi_keys * " keys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 filename to append key to. .IP "Shishi_keys * keys" 12 set of keys to print. .SH "DESCRIPTION" Print an ASCII representation of a key structure to a file, for each key in the key set. The file is appended to if it exists. See \fBshishi_key_print()\fP for the format of the output. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_encticketpart.30000644000000000000000000000234112126773122017205 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_encticketpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_encticketpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_encticketpart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncTicketPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_verify_der.30000644000000000000000000000237612126773112016341 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_verify_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_verify_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_verify_der(Shishi_ap * " ap ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char * der" 12 input array with DER encoded AP\-REP. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REP. .SH "DESCRIPTION" DER decode AP\-REP and set it in AP exchange using \fBshishi_ap_rep_der_set()\fP and verify it using \fBshishi_ap_rep_verify()\fP. .SH "RETURN VALUE" Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_clientrealm.30000644000000000000000000000304012126773172016031 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_clientrealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_clientrealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_clientrealm(Shishi_tkt * " tkt ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name and realm. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Convert cname and realm fields from AS\-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_string2option.30000644000000000000000000000212512126773112016146 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_string2option" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_string2option \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_apoptions shishi_ap_string2option(const char * " str ");" .SH ARGUMENTS .IP "const char * str" 12 zero terminated character array with name of AP\-Option, e.g. "use\-session\-key". .SH "DESCRIPTION" Convert AP\-Option name to AP\-Option type. .SH "RETURN VALUE" Returns enumerated type member corresponding to AP\-Option, or 0 if string was not understood. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_tgsreq.30000644000000000000000000000172612126773117015107 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_tgsreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_tgsreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_tgsreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for TGS\-REQ. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_req_der_set.30000644000000000000000000000226112126773115015630 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_req_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_req_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_req_der_set(Shishi_as * " as ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "char * der" 12 input array with DER encoded AP\-REQ. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REQ. .SH "DESCRIPTION" DER decode AS\-REQ and set it AS exchange. If decoding fails, the AS\-REQ in the AS exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key.30000644000000000000000000000206412126773150013441 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key(Shishi * " handle ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_key ** key" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_pretty_print.30000644000000000000000000000227312126773156017334 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_pretty_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_pretty_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_pretty_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle opened for writing. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .SH "DESCRIPTION" Print KRB\-ERROR error condition and some explanatory text to file descriptor. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_renewable_p.30000644000000000000000000000234612126773173016026 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_renewable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_renewable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_renewable_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is renewable. The RENEWABLE flag in a ticket is normally only interpreted by the ticket\-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets. .SH "RETURN VALUE" Returns non\-0 iff renewable flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_seqnumber_get.30000644000000000000000000000235112126773134020256 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_seqnumber_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_seqnumber_get \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_seqnumber_get(Shishi * " handle ", Shishi_asn1 " encapreppart ", uint32_t * " seqnumber ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "uint32_t * seqnumber" 12 output integer with sequence number field. .SH "DESCRIPTION" Extract sequence number field from EncAPRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt.30000644000000000000000000000427712126773132014333 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_done.30000644000000000000000000000170212126773171014461 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_done(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Deallocate resources associated with ticket. The ticket must not be used again after this call. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_file_guess.30000644000000000000000000000220712126773175017555 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_file_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_file_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_tkts_default_file_guess(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets. .SH "RETURN VALUE" Returns default tkts filename as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tktoptionsdata.30000644000000000000000000000323712126773107016406 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tktoptionsdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tktoptionsdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_tktoptionsdata(Shishi * " handle ", Shishi_ap ** " ap ", Shishi_tkt * " tkt ", int " options ", const char * " data ", size_t " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in newly created AP. .IP "int options" 12 AP\-REQ options to set in newly created AP. .IP "const char * data" 12 input array with data to checksum in Authenticator. .IP "size_t len" 12 length of input array with data to checksum in Authenticator. .SH "DESCRIPTION" Create a new AP exchange using \fBshishi_ap()\fP, and set the ticket, AP\-REQ apoptions and the Authenticator checksum data using \fBshishi_ap_set_tktoptionsdata()\fP. A random session key is added to the authenticator, using the same keytype as the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_authenticator.30000644000000000000000000000234112126773122017217 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_authenticator(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of Authenticator and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_enctgsreppart.30000644000000000000000000000234112126773122017226 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_enctgsreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_enctgsreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_enctgsreppart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncTGSRepPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_ap.30000644000000000000000000000202412126773166014131 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_ap" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_ap \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_ap * shishi_tgs_ap(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get the AP from TGS exchange. .SH "RETURN VALUE" Returns the AP exchange (part of TGS\-REQ) from the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_cfg_default_systemfile.30000644000000000000000000000167212126773200017200 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_cfg_default_systemfile" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_cfg_default_systemfile \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shisa_cfg_default_systemfile(Shisa * " dbh ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .SH "RETURN VALUE" Return system configuration filename. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_der_set.30000644000000000000000000000226112126773112015621 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_der_set(Shishi_ap * " ap ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char * der" 12 input array with DER encoded AP\-REP. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REP. .SH "DESCRIPTION" DER decode AP\-REP and set it AP exchange. If decoding fails, the AP\-REP in the AP exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error_printf.30000644000000000000000000000235112126773136015367 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error_printf" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error_printf \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_error_printf(Shishi * " handle ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * format" 12 printf style format string. @...: print style arguments. .IP " ..." 12 .SH "DESCRIPTION" Set the detailed error information string to a printf formatted string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_check_version.30000644000000000000000000000226612126773200015473 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_check_version" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_check_version \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_check_version(const char * " req_version ");" .SH ARGUMENTS .IP "const char * req_version" 12 version string to compare with, or NULL .SH "DESCRIPTION" Check that the version of the library is at minimum the one given as a string in \fIreq_version\fP. .SH "RETURN VALUE" the actual version string of the library; NULL if the condition is not met. If \fBNULL\fP is passed to this function no check is done and only the version string is returned. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_seqnumber_remove.30000644000000000000000000000223212126773125021160 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_seqnumber_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_seqnumber_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_seqnumber_remove(Shishi * " handle ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Remove sequence number field in Authenticator. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_get_ticket.30000644000000000000000000000222312126773115016161 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_get_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_get_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_get_ticket(Shishi * " handle ", Shishi_asn1 " apreq ", Shishi_asn1 * " ticket ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ variable to get ticket from. .IP "Shishi_asn1 * ticket" 12 output variable to hold extracted ticket. .SH "DESCRIPTION" Extract ticket from AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_stime_set.30000644000000000000000000000226112126773155016561 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_stime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_stime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_stime_set(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * t" 12 string with generalized time value to store in Krberror. .SH "DESCRIPTION" Store server time in Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_done.30000644000000000000000000000201512126773151014626 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_keys_done(Shishi_keys ** " keys ");" .SH ARGUMENTS .IP "Shishi_keys ** keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .SH "DESCRIPTION" Deallocates all resources associated with key set. The key set handle must not be used in calls to other shishi_keys_*() functions after this. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tktoptionsraw.30000644000000000000000000000344012126773107016262 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tktoptionsraw" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tktoptionsraw \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_tktoptionsraw(Shishi * " handle ", Shishi_ap ** " ap ", Shishi_tkt * " tkt ", int " options ", int32_t " cksumtype ", const char * " data ", size_t " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in newly created AP. .IP "int options" 12 AP\-REQ options to set in newly created AP. .IP "int32_t cksumtype" 12 authenticator checksum type to set in AP. .IP "const char * data" 12 input array with data to store in checksum field in Authenticator. .IP "size_t len" 12 length of input array with data to store in checksum field in Authenticator. .SH "DESCRIPTION" Create a new AP exchange using \fBshishi_ap()\fP, and set the ticket, AP\-REQ apoptions and the raw Authenticator checksum data field using \fBshishi_ap_set_tktoptionsraw()\fP. A random session key is added to the authenticator, using the same keytype as the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_der_set.30000644000000000000000000000226112126773111015621 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_der_set(Shishi_ap * " ap ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char * der" 12 input array with DER encoded AP\-REQ. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REQ. .SH "DESCRIPTION" DER decode AP\-REQ and set it AP exchange. If decoding fails, the AP\-REQ in the AP exchange is lost. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_priv.30000644000000000000000000000172112126773121014550 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_priv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_priv \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_priv(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for KRB\-PRIV. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_to_file.30000644000000000000000000000246612126773152016212 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_to_file(Shishi * " handle ", Shishi_asn1 " krberror ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write KRB\-ERROR to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_default_set.30000644000000000000000000000224212126773163016332 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_default_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_default_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_realm_default_set(Shishi * " handle ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * realm" 12 string with new default realm name, or NULL to reset to default. .SH "DESCRIPTION" Set the default realm used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_flags_set.30000644000000000000000000000223412126773134017526 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_flags_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_flags_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_flags_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", int " flags ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "int flags" 12 flags to set in EncKDCRepPart. .SH "DESCRIPTION" Set the EncKDCRepPart.flags field. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_renewable_ok_p.30000644000000000000000000000304312126773145017160 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_renewable_ok_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_renewable_ok_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_renewable_ok_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option renewable\-ok flag is set. The RENEWABLE\-OK option indicates that a renewable ticket will be acceptable if a ticket with the requested life cannot otherwise be provided. If a ticket with the requested life cannot be provided, then a renewable ticket may be issued with a renew\-till equal to the requested endtime. The value of the renew\-till field may still be limited by local limits, or limits selected by the individual principal or server. .SH "RETURN VALUE" Returns non\-0 iff renewable\-ok flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_parse.30000644000000000000000000000234212126773124016715 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * authenticator" 12 output variable with newly allocated authenticator. .SH "DESCRIPTION" Read ASCII armored DER encoded authenticator from file and populate given authenticator variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_done.30000644000000000000000000000202612126773164014577 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_safe_done(Shishi_safe * " safe ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 structure that holds information about SAFE exchange .SH "DESCRIPTION" Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get_tgt.30000644000000000000000000000305312126773177015363 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get_tgt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get_tgt \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get_tgt(Shishi_tkts * " tkts ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_tkts_hint * hint" 12 structure with characteristics of ticket to begot. .SH "DESCRIPTION" Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint\->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange. Currently this function do not implement cross realm logic. This function is used by \fBshishi_tkts_get()\fP, which is probably what you really want to use unless you have special needs. .SH "RETURN VALUE" Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_options.30000644000000000000000000000223512126773114015534 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_options" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_options \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_options(Shishi * " handle ", Shishi_asn1 " apreq ", uint32_t * " flags ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ to get options from. .IP "uint32_t * flags" 12 Output integer containing options from AP\-REQ. .SH "DESCRIPTION" Extract the AP\-Options from AP\-REQ into output integer. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_populate_encticketpart.30000644000000000000000000000252012126773135022327 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_populate_encticketpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_populate_encticketpart \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_populate_encticketpart(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", Shishi_asn1 " encticketpart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .SH "DESCRIPTION" Set the flags, authtime, starttime, endtime, renew\-till and caddr fields of the EncKDCRepPart to the corresponding values in the EncTicketPart. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_padata.30000644000000000000000000000230712126773121015600 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_padata \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_padata(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of PA\-DATA and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_get_authenticator_etype.30000644000000000000000000000226312126773115020762 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_get_authenticator_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_get_authenticator_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_get_authenticator_etype(Shishi * " handle ", Shishi_asn1 " apreq ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ variable to get value from. .IP "int32_t * etype" 12 output variable that holds the value. .SH "DESCRIPTION" Extract AP\-REQ.authenticator.etype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_etype_tktoptionsdata.30000644000000000000000000000341512126773107017612 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_etype_tktoptionsdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_etype_tktoptionsdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_etype_tktoptionsdata(Shishi * " handle ", Shishi_ap ** " ap ", int32_t " etype ", Shishi_tkt * " tkt ", int " options ", const char * " data ", size_t " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "int32_t etype" 12 encryption type of newly generated random subkey. .IP "Shishi_tkt * tkt" 12 ticket to set in newly created AP. .IP "int options" 12 AP\-REQ options to set in newly created AP. .IP "const char * data" 12 input array with data to checksum in Authenticator. .IP "size_t len" 12 length of input array with data to checksum in Authenticator. .SH "DESCRIPTION" Create a new AP exchange using \fBshishi_ap()\fP, and set the ticket, AP\-REQ apoptions and the Authenticator checksum data using \fBshishi_ap_set_tktoptionsdata()\fP. A random session key is added to the authenticator, using the same keytype as the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_to_file.30000644000000000000000000000245012126773143015624 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_to_file(Shishi * " handle ", Shishi_asn1 " kdcreq ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write KDC\-REQ to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_done.30000644000000000000000000000162512126773202013416 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shisa_done(Shisa * " dbh ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 .SH "DESCRIPTION" Deallocates the shisa library handle. The handle must not be used in any calls to shisa functions after this. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_process.30000644000000000000000000000340312126773141015202 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_process(Shishi * " handle ", Shishi_asn1 " tgsreq ", Shishi_asn1 " tgsrep ", Shishi_asn1 " authenticator ", Shishi_asn1 " oldenckdcreppart ", Shishi_asn1 * " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 tgsreq" 12 input variable that holds the sent KDC\-REQ. .IP "Shishi_asn1 tgsrep" 12 input variable that holds the received KDC\-REP. .IP "Shishi_asn1 authenticator" 12 input variable with Authenticator from AP\-REQ in KDC\-REQ. .IP "Shishi_asn1 oldenckdcreppart" 12 input variable with EncKDCRepPart used in request. .IP "Shishi_asn1 * enckdcreppart" 12 output variable that holds new EncKDCRepPart. .SH "DESCRIPTION" Process a TGS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the ticket used to construct the TGS request and calls \fBshishi_kdc_process()\fP, which see. .SH "RETURN VALUE" Returns SHISHI_OK iff the TGS client exchange was successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_print.30000644000000000000000000000215612126773141015337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of KDC\-REP to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_build.30000644000000000000000000000226112126773163015013 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_build(Shishi_priv * " priv ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "Shishi_key * key" 12 key for session, used to encrypt data. .SH "DESCRIPTION" Build checksum and set it in KRB\-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_from_random.30000644000000000000000000000264712126773150016033 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_from_random" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_from_random \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_from_random(Shishi * " handle ", int32_t " type ", const char * " rnd ", size_t " rndlen ", Shishi_key ** " outkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "const char * rnd" 12 random data. .IP "size_t rndlen" 12 length of random data. .IP "Shishi_key ** outkey" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure, and set the key type and key value using \fBshishi_random_to_key()\fP. KEY contains a newly allocated structure only if this function is successful. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq.30000644000000000000000000000176312126773113013765 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_apreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new AP\-REQ, populated with some default values. .SH "RETURN VALUE" Returns the AP\-REQ or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_cusec_get.30000644000000000000000000000233512126773134017361 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_cusec_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_cusec_get \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_cusec_get(Shishi * " handle ", Shishi_asn1 " encapreppart ", uint32_t * " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "uint32_t * cusec" 12 output integer with client microseconds field. .SH "DESCRIPTION" Extract client microseconds field from EncAPRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_process.30000644000000000000000000000310612126773141015010 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_process(Shishi * " handle ", Shishi_asn1 " asreq ", Shishi_asn1 " asrep ", const char * " string ", Shishi_asn1 * " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 asreq" 12 input variable that holds the sent KDC\-REQ. .IP "Shishi_asn1 asrep" 12 input variable that holds the received KDC\-REP. .IP "const char * string" 12 input variable with zero terminated password. .IP "Shishi_asn1 * enckdcreppart" 12 output variable that holds new EncKDCRepPart. .SH "DESCRIPTION" Process an AS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the password and calls \fBshishi_kdc_process()\fP, which see. .SH "RETURN VALUE" Returns SHISHI_OK iff the AS client exchange was successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_invalid_p.30000644000000000000000000000276512126773173015515 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_invalid_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_invalid_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_invalid_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is invalid. The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot\-list mechanism). .SH "RETURN VALUE" Returns non\-0 iff invalid flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_from_keytab_file.30000644000000000000000000000320412126773152017204 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_from_keytab_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_from_keytab_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_from_keytab_file(Shishi * " handle ", const char * " filename ", Shishi_keys ** " outkeys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 name of file to read. .IP "Shishi_keys ** outkeys" 12 pointer to key set that will be allocated and populated, must be deallocated by caller on succes. .SH "DESCRIPTION" Create a new key set populated with keys from a MIT keytab data structure read from a file. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" Returns \fBSHISHI_IO_ERROR\fP if the file cannot be read, \fBSHISHI_KEYTAB_ERROR\fP if the data cannot be parsed as a valid keytab structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_tillc.30000644000000000000000000000214312126773144015312 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_tillc" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_tillc \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_kdcreq_tillc(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get till field from. .SH "DESCRIPTION" Extract C time corresponding to the "till" field. .SH "RETURN VALUE" Returns C time interpretation of the "till" field in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_cksum.30000644000000000000000000000276312126773125016735 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_cksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_cksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_cksum(Shishi * " handle ", Shishi_asn1 " authenticator ", int32_t * " cksumtype ", char ** " cksum ", size_t * " cksumlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int32_t * cksumtype" 12 output checksum type. .IP "char ** cksum" 12 newly allocated output checksum data from authenticator. .IP "size_t * cksumlen" 12 on output, actual size of allocated output checksum data buffer. .SH "DESCRIPTION" Read checksum value from authenticator. \fIcksum\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt.30000644000000000000000000000427112126773132014337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt_iv_etype.30000644000000000000000000000471712126773131016247 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt_iv_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt_iv_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt_iv_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " iv ", size_t " ivlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_asn1.30000644000000000000000000000207212126773112015036 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_asn1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_asn1 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_asn1(Shishi_ap * " ap ", Shishi_asn1 * " aprep ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 * aprep" 12 output AP\-REP variable. .SH "DESCRIPTION" Build AP\-REP using \fBshishi_ap_rep_build()\fP and return it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_sendrecv_hint.30000644000000000000000000000326712126773157016342 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_sendrecv_hint" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_sendrecv_hint \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_sendrecv_hint(Shishi * " handle ", const char * " realm ", const char * " indata ", size_t " inlen ", char ** " outdata ", size_t * " outlen ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * realm" 12 string with realm name. .IP "const char * indata" 12 Packet to send to KDC. .IP "size_t inlen" 12 Length of \fIindata\fP. .IP "char ** outdata" 12 Newly allocated string with data returned from KDC. .IP "size_t * outlen" 12 Length of \fIoutdata\fP. .IP "Shishi_tkts_hint * hint" 12 a \fBShishi_tkts_hint\fP structure with flags. .SH "DESCRIPTION" Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname. .SH "RETURNS" \fBSHISHI_OK\fP on success, \fBSHISHI_KDC_TIMEOUT\fP if a timeout was reached, or other errors. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep_build.30000644000000000000000000000205512126773115015302 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_rep_build(Shishi_as * " as ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_key * key" 12 user's key, used to encrypt the encrypted part of the AS\-REP. .SH "DESCRIPTION" Build AS\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_client.30000644000000000000000000000300612126773172015012 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_client" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_client \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_client(Shishi_tkt * " tkt ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Represent client principal name in Ticket KDC\-REP as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_for_server_in_file.30000644000000000000000000000242412126773151017546 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_for_server_in_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_for_server_in_file \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_keys_for_server_in_file(Shishi * " handle ", const char * " filename ", const char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * filename" 12 file to read keys from. .IP "const char * server" 12 server name to get key for. .SH "DESCRIPTION" Get key for specified \fIserver\fP from \fIfilename\fP. .SH "RETURN VALUE" Returns the key for specific server, read from the indicated file, or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_seqnumber_get.30000644000000000000000000000236712126773125020453 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_seqnumber_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_seqnumber_get \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_seqnumber_get(Shishi * " handle ", Shishi_asn1 " authenticator ", uint32_t * " seqnumber ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "uint32_t * seqnumber" 12 output integer with sequence number field. .SH "DESCRIPTION" Extract sequence number field from Authenticator. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_asn1.30000644000000000000000000000207212126773111015036 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_asn1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_asn1 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_asn1(Shishi_ap * " ap ", Shishi_asn1 * " apreq ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 * apreq" 12 output AP\-REQ variable. .SH "DESCRIPTION" Build AP\-REQ using \fBshishi_ap_req_build()\fP and return it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_sendrecv.30000644000000000000000000000206312126773116015146 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_sendrecv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_sendrecv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_sendrecv(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Send AS\-REQ and receive AS\-REP or KRB\-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_der.30000644000000000000000000000242312126773111014745 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_der(Shishi_ap * " ap ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char ** out" 12 output array with newly allocated DER encoding of AP\-REP. .IP "size_t * outlen" 12 length of output array with DER encoding of AP\-REP. .SH "DESCRIPTION" Build AP\-REP using \fBshishi_ap_rep_build()\fP and DER encode it. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_cksum_type.30000644000000000000000000000312412126773125020576 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_cksum_type" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_cksum_type \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_cksum_type(Shishi * " handle ", Shishi_asn1 " authenticator ", Shishi_key * " key ", int " keyusage ", int " cksumtype ", char * " data ", size_t " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "Shishi_key * key" 12 key to to use for encryption. .IP "int keyusage" 12 cryptographic key usage value to use in encryption. .IP "int cksumtype" 12 checksum to type to calculate checksum. .IP "char * data" 12 input array with data to calculate checksum on. .IP "size_t datalen" 12 size of input array with data to calculate checksum on. .SH "DESCRIPTION" Calculate checksum for data and store it in the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_options_add.30000644000000000000000000000227212126773146016513 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_options_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_options_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_options_add(Shishi * " handle ", Shishi_asn1 " kdcreq ", uint32_t " option ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set etype field in. .IP "uint32_t option" 12 integer with options to add in KDC\-REQ. .SH "DESCRIPTION" Add KDC\-Option to KDC\-REQ. This preserves all existing options. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_build.30000644000000000000000000000177312126773111015302 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_build(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Checksum data in authenticator and add ticket and authenticator to AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_from_file.30000644000000000000000000000244412126773143016150 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_from_file(Shishi * " handle ", Shishi_asn1 * " kdcreq ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * kdcreq" 12 output variable with newly allocated KDC\-REQ. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read KDC\-REQ from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_generalize_now.30000644000000000000000000000206312126773137015665 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_generalize_now" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_generalize_now \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_generalize_now(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Convert current time to KerberosTime. The string must not be deallocate by caller. .SH "RETURN VALUE" Return a KerberosTime time string corresponding to current time. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_forwarded_p.30000644000000000000000000000256612126773173016043 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_forwarded_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_forwarded_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_forwarded_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is forwarded. The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non\-FORWARDED tickets. .SH "RETURN VALUE" Returns non\-0 iff forwarded flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_proxy_p.30000644000000000000000000000260312126773145015705 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_proxy_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_proxy_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_proxy_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option proxy flag is set. The PROXY option indicates that this is a request for a proxy. This option will only be honored if the ticket\-granting ticket in the request has its PROXIABLE bit set. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request. .SH "RETURN VALUE" Returns non\-0 iff proxy flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_krberror_set.30000644000000000000000000000200612126773167016235 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_krberror_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_krberror_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tgs_krberror_set(Shishi_tgs * " tgs ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "Shishi_asn1 krberror" 12 krberror to store in TGS. .SH "DESCRIPTION" Set the KRB\-ERROR in the TGS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_forwarded_p.30000644000000000000000000000274112126773145016504 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_forwarded_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_forwarded_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_forwarded_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option forwarded flag is set. The FORWARDED option is only specified in a request to the ticket\-granting server and will only be honored if the ticket\-granting ticket in the request has its FORWARDABLE bit set. This option indicates that this is a request for forwarding. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request. .SH "RETURN VALUE" Returns non\-0 iff forwarded flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_crc.30000644000000000000000000000260612126773156013430 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_crc" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_crc \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_crc(Shishi * " handle ", const char * " in ", size_t " inlen ", char * " out[4] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * in" 12 input character array of data to checksum. .IP "size_t inlen" 12 length of input character array of data to checksum. .IP "char * out[4]" 12 .SH "DESCRIPTION" Compute checksum of data using CRC32 modified according to RFC 1510. The \fIout\fP buffer must be deallocated by the caller. The modifications compared to standard CRC32 is that no initial and final XOR is performed, and that the output is returned in LSB\-first order. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_to_file.30000644000000000000000000000233012126773133015137 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_to_file(Shishi * " handle ", const char * " filename ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 filename to append key to. .IP "Shishi_key * key" 12 key to print. .SH "DESCRIPTION" Print an ASCII representation of a key structure to a file. The file is appended to if it exists. See \fBshishi_key_print()\fP for format of output. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_match_p.30000644000000000000000000000210612126773177015154 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_match_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_match_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_match_p(Shishi_tkt * " tkt ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 ticket to test hints on. .IP "Shishi_tkts_hint * hint" 12 structure with characteristics of ticket to be found. .SH "DESCRIPTION" Test if a ticket matches specified hints. .SH "RETURN VALUE" Returns 0 iff ticket fails to match given criteria. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error_clear.30000644000000000000000000000234012126773136015151 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error_clear" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error_clear \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_error_clear(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Clear the detailed error information string. See \fBshishi_error()\fP for how to access the error string, and \fBshishi_error_set()\fP and \fBshishi_error_printf()\fP for how to set the error string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_set.30000644000000000000000000000250712126773161015511 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_principal_set(Shishi * " handle ", Shishi_asn1 " namenode ", const char * " namefield ", const char * " name ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 namenode" 12 ASN.1 structure with principal in \fInamefield\fP. .IP "const char * namefield" 12 name of field in \fInamenode\fP containing principal name. .IP "const char * name" 12 null\-terminated string with principal name in RFC 1964 form. .SH "DESCRIPTION" Set principal name field in an ASN.1 structure to the given name. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_to_file.30000644000000000000000000000251612126773133017041 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_to_file(Shishi * " handle ", Shishi_asn1 " encapreppart ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_derive_default_salt.30000644000000000000000000000234112126773161016656 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_derive_default_salt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_derive_default_salt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_derive_default_salt(Shishi * " handle ", const char * " name ", char ** " salt ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * name" 12 principal name of user. .IP "char ** salt" 12 output variable with newly allocated salt string. .SH "DESCRIPTION" Derive the default salt from a principal. The default salt is the concatenation of the decoded realm and the principal. .SH "RETURN VALUE" Return SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_key_remove.30000644000000000000000000000332012126773201014627 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_key_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_key_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_key_remove(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_key * " key ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to remove key for. .IP "const Shisa_key * key" 12 Pointer to Shisa key structure with hints on matching the key to remove. .SH "DESCRIPTION" Remove a key, matching the hints in \fIkey\fP, from the Shisa database for the user PRINCIPAL\fIREALM\fP. Not all elements of \fIkey\fP need to be filled out, only those you are interested in. For example, if you want to remove the only key with an etype of 3 (DES\-CBC\-MD5), set the \fIkey\fP\->etype field to 3, and set all other fields to 0. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP on success, \fBSHISA_NO_KEY\fP if no key could be identified, and \fBSHISA_MULTIPLE_KEY_MATCH\fP if more than one key matched the given criteria, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_krberror.30000644000000000000000000000203512126773167015364 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_krberror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_krberror \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tgs_krberror(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get KRB\-ERROR from TGS exchange. .SH "RETURN VALUE" Returns the received TGS\-REP from the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_des_cbc_mac.30000644000000000000000000000252612126773156015064 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_des_cbc_mac" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_des_cbc_mac \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_des_cbc_mac(Shishi * " handle ", const char " key[8] ", const char " iv[8] ", const char * " in ", size_t " inlen ", char * " out[8] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char key[8]" 12 .IP "const char iv[8]" 12 .IP "const char * in" 12 input character array of data to hash. .IP "size_t inlen" 12 length of input character array of data to hash. .IP "char * out[8]" 12 .SH "DESCRIPTION" Computed keyed checksum of data using DES\-CBC\-MAC. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_copy_crealm.30000644000000000000000000000223712126773140015770 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_copy_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_copy_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_copy_crealm(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_asn1 " encticketpart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to read crealm from. .IP "Shishi_asn1 encticketpart" 12 EncTicketPart to set crealm in. .SH "DESCRIPTION" Set crealm in KDC\-REP to value in EncTicketPart. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_n_fold.30000644000000000000000000000312612126773132014112 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_n_fold" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_n_fold \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_n_fold(Shishi * " handle ", const char * " in ", size_t " inlen ", char * " out ", size_t " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt ("M"). .IP "char * out" 12 output array with decrypted data. .IP "size_t outlen" 12 size of output array ("N"). .SH "DESCRIPTION" Fold data into a fixed length output array, with the intent to give each input bit approximately equal weight in determining the value of each output bit. The algorithm is from "A Better Key Schedule For DES\-like Ciphers" by Uri Blumenthal and Steven M. Bellovin, http://www.research.att.com/~smb/papers/ides.pdf, although the sample vectors provided by the paper are incorrect. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_etype_info2.30000644000000000000000000000233212126773121016567 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_etype_info2" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_etype_info2 \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_etype_info2(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of ETYPE\-INFO2 and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_get_subkey.30000644000000000000000000000242512126773126017750 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_get_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_get_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_get_subkey(Shishi * " handle ", Shishi_asn1 " authenticator ", Shishi_key ** " subkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "Shishi_key ** subkey" 12 output newly allocated subkey from authenticator. .SH "DESCRIPTION" Read subkey value from authenticator. .SH "RETURN VALUE" Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT if subkey is not present. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error_outputtype.30000644000000000000000000000204112126773136016323 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error_outputtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error_outputtype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_error_outputtype(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Get the current output type for logging messages. .SH "RETURN VALUE" Return output type (NULL, stderr or syslog) for informational and warning messages. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_add_keytab_file.30000644000000000000000000000307012126773152016772 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_add_keytab_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_add_keytab_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_add_keytab_file(Shishi * " handle ", const char * " filename ", Shishi_keys * " keys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 name of file to read. .IP "Shishi_keys * keys" 12 allocated key set to store keys in. .SH "DESCRIPTION" Read keys from a MIT keytab data structure from a file, and add the keys to the key set. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" Returns \fBSHISHI_IO_ERROR\fP if the file cannot be read, \fBSHISHI_KEYTAB_ERROR\fP if the data cannot be parsed as a valid keytab structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509ca_default_file_set.30000644000000000000000000000250212126773160017236 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509ca_default_file_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509ca_default_file_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_x509ca_default_file_set(Shishi * " handle ", const char * " x509cafile ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * x509cafile" 12 string with new default x509 client certificate file name, or NULL to reset to default. .SH "DESCRIPTION" Set the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_from_file.30000644000000000000000000000210412126773127015431 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg_from_file(Shishi * " handle ", const char * " cfg ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * cfg" 12 filename to read configuration from. .SH "DESCRIPTION" Configure shishi library using configuration file. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_nonce_set.30000644000000000000000000000224612126773134017537 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_nonce_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_nonce_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_nonce_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", uint32_t " nonce ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "uint32_t nonce" 12 nonce to set in EncKDCRepPart. .SH "DESCRIPTION" Set the EncKDCRepPart.nonce field. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_errorcode_fast.30000644000000000000000000000223312126773155017565 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_errorcode_fast" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_errorcode_fast \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_errorcode_fast(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .SH "DESCRIPTION" Get error code from KRB\-ERROR, without error checking. .SH "RETURN VALUE" Return error code (see \fBshishi_krberror_errorcode()\fP) directly, or \-1 on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt.30000644000000000000000000000202112126773171013447 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt(Shishi * " handle ", Shishi_tkt ** " tkt ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_tkt ** tkt" 12 output variable with newly allocated ticket. .SH "DESCRIPTION" Create a new ticket handle. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_nonce_set.30000644000000000000000000000223412126773143016160 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_nonce_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_nonce_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_nonce_set(Shishi * " handle ", Shishi_asn1 " kdcreq ", uint32_t " nonce ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set client name field in. .IP "uint32_t nonce" 12 integer nonce to store in KDC\-REQ. .SH "DESCRIPTION" Store nonce number field in KDC\-REQ. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_keytype.30000644000000000000000000000210712126773174015231 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_keytype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_keytype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_keytype(Shishi_tkt * " tkt ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "int32_t * etype" 12 pointer to encryption type that is set, see Shishi_etype. .SH "DESCRIPTION" Extract encryption type of key in ticket (really EncKDCRepPart). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_verify.30000644000000000000000000000176512126773112015510 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_verify" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_verify \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_verify(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Verify AP\-REP compared to Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_print.30000644000000000000000000000213412126773165015007 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " safe ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 safe" 12 SAFE to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of SAFE to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_flags_set.30000644000000000000000000000225012126773135017540 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_flags_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_flags_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_flags_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", int " flags ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "int flags" 12 flags to set in encticketpart. .SH "DESCRIPTION" Set the EncTicketPart.flags to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_check_nonce.30000644000000000000000000000277212126773141015737 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_check_nonce" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_check_nonce \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_check_nonce(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_asn1 " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to compare nonce field in. .IP "Shishi_asn1 enckdcreppart" 12 Encrypted KDC\-REP part to compare nonce field in. .SH "DESCRIPTION" Verify that KDC\-REQ.req\-body.nonce and EncKDCRepPart.nonce fields matches. This is one of the steps that has to be performed when processing a KDC\-REQ and KDC\-REP exchange. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_NONCE_LENGTH_MISMATCH if the nonces have different lengths (usually indicates that buggy server truncated nonce to 4 bytes), SHISHI_NONCE_MISMATCH if the values differ, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_proxiable_p.30000644000000000000000000000275412126773173016052 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_proxiable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_proxiable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_proxiable_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is proxiable. The PROXIABLE flag in a ticket is normally only interpreted by the ticket\-granting service. It can be ignored by application servers. When set, this flag tells the ticket\-granting server that it is OK to issue a new ticket (but not a ticket\-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket\-granting ticket, and reset when requesting any other ticket. .SH "RETURN VALUE" Returns non\-0 iff proxiable flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_errorcode.30000644000000000000000000000224112126773155016547 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_errorcode" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_errorcode \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_errorcode(Shishi * " handle ", Shishi_asn1 " krberror ", int32_t * " errorcode ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .IP "int32_t * errorcode" 12 output integer KRB\-ERROR error code. .SH "DESCRIPTION" Extract error code from KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_size.30000644000000000000000000000173012126773176014677 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_size" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_size \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_size(Shishi_tkts * " tkts ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .SH "DESCRIPTION" Get size of ticket set. .SH "RETURN VALUE" Returns number of tickets stored in ticket set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_asrep.30000644000000000000000000000172212126773117014710 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_asrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_asrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_asrep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for AS\-REP. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req.30000644000000000000000000000200712126773110014111 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_ap_req(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get ASN.1 AP\-REQ structure from AP exchange. .SH "RETURN VALUE" Returns the AP\-REQ from the AP exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_set_cksum.30000644000000000000000000000313412126773165015651 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_set_cksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_set_cksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_set_cksum(Shishi * " handle ", Shishi_asn1 " safe ", int32_t " cksumtype ", const char * " cksum ", size_t " cksumlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "int32_t cksumtype" 12 input checksum type to store in SAFE. .IP "const char * cksum" 12 input checksum data to store in SAFE. .IP "size_t cksumlen" 12 size of input checksum data to store in SAFE. .SH "DESCRIPTION" Store checksum value in SAFE. A checksum is usually created by calling \fBshishi_checksum()\fP on some application specific data using the key from the ticket that is being used. To save time, you may want to use \fBshishi_safe_build()\fP instead, which calculates the checksum and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_init_server.30000644000000000000000000000245412126773140015204 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_init_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_init_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_init_server(Shishi ** " handle ");" .SH ARGUMENTS .IP "Shishi ** handle" 12 pointer to handle to be created. .SH "DESCRIPTION" Create a Shishi library handle, using \fBshishi_server()\fP, and read the system configuration file. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req_process.30000644000000000000000000000207012126773166016057 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_req_process(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Process new TGS\-REQ and set ticket. The key to decrypt the TGS\-REQ is taken from the EncKDCReqPart of the TGS tgticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_aprep.30000644000000000000000000000172212126773120014677 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_aprep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_aprep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_aprep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for AP\-REP. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_apreq.30000644000000000000000000000230312126773123015454 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_apreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_apreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_apreq(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of AP\-REQ and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_authorizationdata.30000644000000000000000000000302612126773126021337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_authorizationdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_authorizationdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_authorizationdata(Shishi * " handle ", Shishi_asn1 " authenticator ", int32_t * " adtype ", char ** " addata ", size_t * " addatalen ", size_t " nth ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int32_t * adtype" 12 output authorization data type. .IP "char ** addata" 12 newly allocated output authorization data. .IP "size_t * addatalen" 12 on output, actual size of newly allocated authorization data. .IP "size_t nth" 12 element number of authorization\-data to extract. .SH "EXTRACT N" th authorization data from authenticator. The first field is 1. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_find_for_server.30000644000000000000000000000237112126773177017104 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_find_for_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_find_for_server \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_find_for_server(Shishi_tkts * " tkts ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * server" 12 server name to find ticket for. .SH "DESCRIPTION" Short\-hand function for searching the ticket set for a ticket for the given server using the default client principal. See \fBshishi_tkts_find_for_clientserver()\fP and \fBshishi_tkts_find()\fP. .SH "RETURN VALUE" Returns a ticket if found, or NULL. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt_ivupdate.30000644000000000000000000000507112126773131016236 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt_ivupdate" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt_ivupdate \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt_ivupdate(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", const char * " iv ", size_t " ivlen ", char ** " ivout ", size_t * " ivoutlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "char ** ivout" 12 output array with newly allocated updated initialization vector. .IP "size_t * ivoutlen" 12 size of output array with updated initialization vector. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_etype_info.30000644000000000000000000000232612126773121016510 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_etype_info" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_etype_info \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_etype_info(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of ETYPE\-INFO and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_add_keytab_mem.30000644000000000000000000000312612126773151016632 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_add_keytab_mem" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_add_keytab_mem \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_add_keytab_mem(Shishi * " handle ", const char * " data ", size_t " len ", Shishi_keys * " keys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * data" 12 constant memory buffer with keytab of \fIlen\fP size. .IP "size_t len" 12 size of memory buffer with keytab data. .IP "Shishi_keys * keys" 12 allocated key set to store keys in. .SH "DESCRIPTION" Read keys from a MIT keytab data structure, and add them to the key set. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" Returns \fBSHISHI_KEYTAB_ERROR\fP if the data does not represent a valid keytab structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_server_p.30000644000000000000000000000205412126773172015363 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_server_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_server_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_server_p(Shishi_tkt * " tkt ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "const char * server" 12 server name of ticket. .SH "DESCRIPTION" Determine if ticket is for specified server. .SH "RETURN VALUE" Returns non\-0 iff ticket is for specified server. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart.30000644000000000000000000000214612126773133015337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_encapreppart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. .SH "RETURN VALUE" Returns the encapreppart or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_principal_set.30000644000000000000000000000215512126773147016364 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_principal_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_principal_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_principal_set(Shishi_key * " key ", const char * " principal ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "const char * principal" 12 string with new principal name. .SH "DESCRIPTION" Set the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_req_set.30000644000000000000000000000174112126773115015000 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_req_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_req_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_as_req_set(Shishi_as * " as ", Shishi_asn1 " asreq ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_asn1 asreq" 12 asreq to store in AS. .SH "DESCRIPTION" Set the AS\-REQ in the AS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_principal_update.30000644000000000000000000000365212126773200016014 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_principal_update" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_principal_update \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_principal_update(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_principal * " ph ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to get information on. .IP "const Shisa_principal * ph" 12 Pointer to principal structure with information to store in database. .SH "DESCRIPTION" Modify information stored for given PRINCIPAL\fIREALM\fP. Note that it is usually a good idea to only set the fields in \fIph\fP that you actually want to update. Specifically, first calling \fBshisa_principal_find()\fP to get the current information, then modifying one field, and calling \fBshisa_principal_update()\fP is not recommended in general, as this will 1) overwrite any modifications made to other fields between the two calls (by other processes) and 2) will cause all values to be written again, which may generate more overhead. .SH "RETURN VALUE" Returns SHISA_OK if successful, \fBSHISA_NO_REALM\fP if the indicated realm does not exist, \fBSHISA_NO_PRINCIPAL\fP if the indicated principal does not exist, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_parse.30000644000000000000000000000222512126773162015025 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " priv ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * priv" 12 output variable with newly allocated PRIV. .SH "DESCRIPTION" Read ASCII armored DER encoded PRIV from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_print.30000644000000000000000000000205712126773177015065 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_print(Shishi_tkts * " tkts ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "FILE * fh" 12 file descriptor to print to. .SH "DESCRIPTION" Print description of all tickets to file descriptor. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_to_keytab_mem.30000644000000000000000000000277212126773152016533 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_to_keytab_mem" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_to_keytab_mem \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_to_keytab_mem(Shishi * " handle ", Shishi_keys * " keys ", char ** " out ", size_t * " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_keys * keys" 12 key set to convert to keytab format. .IP "char ** out" 12 constant memory buffer with keytab of \fIlen\fP size. .IP "size_t * len" 12 size of memory buffer with keytab data. .SH "DESCRIPTION" Write keys to a MIT keytab data structure. The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" On success \fBSHISHI_OK\fP is returned, otherwise an error code. .SH "SINCE" 0.0.42 .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_nth.30000644000000000000000000000230112126773151014470 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_nth" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_nth \- API function .SH SYNOPSIS .B #include .sp .BI "const Shishi_key * shishi_keys_nth(Shishi_keys * " keys ", int " keyno ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .IP "int keyno" 12 integer indicating requested key in key set. .SH "GET THE N" th ticket in key set. .SH "RETURN VALUE" Returns a key handle to the keyno:th key in the key set, or NULL if \fIkeys\fP is invalid or \fIkeyno\fP is out of bounds. The first key is \fIkeyno\fP 0, the second key \fIkeyno\fP 1, and so on. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_init_server_with_paths.30000644000000000000000000000272412126773140017436 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_init_server_with_paths" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_init_server_with_paths \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_init_server_with_paths(Shishi ** " handle ", const char * " systemcfgfile ");" .SH ARGUMENTS .IP "Shishi ** handle" 12 pointer to handle to be created. .IP "const char * systemcfgfile" 12 Filename of system configuration, or NULL. .SH "DESCRIPTION" Create a Shishi library handle, using \fBshishi_server()\fP, and read the system configuration file from specified location. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_generalize_time.30000644000000000000000000000213712126773137016022 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_generalize_time" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_generalize_time \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_generalize_time(Shishi * " handle ", time_t " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "time_t t" 12 C time to convert. .SH "DESCRIPTION" Convert C time to KerberosTime. The string must not be deallocate by caller. .SH "RETURN VALUE" Return a KerberosTime time string corresponding to C time t. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_options_remove.30000644000000000000000000000235312126773114017112 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_options_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_options_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_options_remove(Shishi * " handle ", Shishi_asn1 " apreq ", uint32_t " option ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ as allocated by \fBshishi_apreq()\fP. .IP "uint32_t option" 12 Options to remove from AP\-REQ. .SH "DESCRIPTION" Remove the AP\-Options from AP\-REQ. Options not set in input parameter \fIoption\fP are preserved in the AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_print_for_service.30000644000000000000000000000237112126773177017452 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_print_for_service" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_print_for_service \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_print_for_service(Shishi_tkts * " tkts ", FILE * " fh ", const char * " service ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "FILE * fh" 12 file descriptor to print to. .IP "const char * service" 12 service to limit tickets printed to, or NULL. .SH "DESCRIPTION" Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgsrep.30000644000000000000000000000177012126773141014160 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgsrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgsrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tgsrep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new TGS\-REP, populated with some default values. .SH "RETURN VALUE" Returns the TGS\-REP or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_get_key.30000644000000000000000000000224012126773135017217 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_get_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_get_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_get_key(Shishi * " handle ", Shishi_asn1 " encticketpart ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "Shishi_key ** key" 12 newly allocated key. .SH "DESCRIPTION" Extract the session key in the Ticket. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_allow_postdate_p.30000644000000000000000000000262112126773145017545 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_allow_postdate_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_allow_postdate_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_allow_postdate_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option allow\-postdate flag is set. The ALLOW\-POSTDATE option indicates that the ticket to be issued is to have its MAY\-POSTDATE flag set. It may only be set on the initial request, or in a subsequent request if the ticket\-granting ticket on which it is based also has its MAY\-POSTDATE flag set. .SH "RETURN VALUE" Returns non\-0 iff allow\-postdate flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_set_cname.30000644000000000000000000000246112126773144016144 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_set_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_set_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_set_cname(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_name_type " name_type ", const char * " principal ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set client name field in. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * principal" 12 input array with principal name. .SH "DESCRIPTION" Set the client name field in the KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_for_server_dns.30000644000000000000000000000400512126773164017053 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_for_server_dns" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_for_server_dns \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_realm_for_server_dns(Shishi * " handle ", char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "char * server" 12 hostname to find realm for. .SH "DESCRIPTION" Find realm for a host using DNS lookups, according to draft\-ietf\-krb\-wg\-krb\-dns\-locate\-03.txt. Since DNS lookups may be spoofed, relying on the realm information may result in a redirection attack. In a single\-realm scenario, this only achieves a denial of service, but with cross\-realm trust it may redirect you to a compromised realm. For this reason, Shishi prints a warning, suggesting that the user should add the proper 'server\-realm' configuration tokens instead. To illustrate the DNS information used, here is an extract from a zone file for the domain ASDF.COM: _kerberos.asdf.com. IN TXT "ASDF.COM" _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM" Let us suppose that in this case, a client wishes to use a service on the host foo.asdf.com. It would first query: _kerberos.foo.asdf.com. IN TXT Finding no match, it would then query: _kerberos.asdf.com. IN TXT .SH "RETURN VALUE" Returns realm for host, or NULL if not found. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_encticketpart.30000644000000000000000000000176012126773120016432 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_encticketpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_encticketpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_encticketpart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for EncTicketPart. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_to_der_field.30000644000000000000000000000276212126773121016215 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_to_der_field" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_to_der_field \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asn1_to_der_field(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", char ** " der ", size_t * " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 data that have field to extract. .IP "const char * field" 12 name of field in \fInode\fP to extract. .IP "char ** der" 12 output array that holds DER encoding of \fIfield\fP in \fInode\fP. .IP "size_t * len" 12 output variable with length of \fIder\fP output array. .SH "DESCRIPTION" Extract newly allocated DER representation of specified ASN.1 field. .SH "RETURN VALUE" Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_set_enc_part.30000644000000000000000000000321512126773170016663 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_set_enc_part" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_set_enc_part \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_set_enc_part(Shishi * " handle ", Shishi_asn1 " ticket ", int32_t " etype ", uint32_t " kvno ", const char * " buf ", size_t " buflen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 Ticket to add enc\-part field to. .IP "int32_t etype" 12 encryption type used to encrypt enc\-part. .IP "uint32_t kvno" 12 key version number. .IP "const char * buf" 12 input array with encrypted enc\-part. .IP "size_t buflen" 12 size of input array with encrypted enc\-part. .SH "DESCRIPTION" Set the encrypted enc\-part field in the Ticket. The encrypted data is usually created by calling \fBshishi_encrypt()\fP on the DER encoded enc\-part. To save time, you may want to use \fBshishi_ticket_add_enc_part()\fP instead, which calculates the encrypted data and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_postdated_p.30000644000000000000000000000271112126773173016045 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_postdated_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_postdated_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_postdated_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is postdated. The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use. .SH "RETURN VALUE" Returns non\-0 iff postdated flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_priv_der.30000644000000000000000000000247512126773162015534 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_priv_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_priv_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_priv_der(Shishi_priv * " priv ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "char ** out" 12 output array with newly allocated DER encoding of PRIV. .IP "size_t * outlen" 12 length of output array with DER encoding of PRIV. .SH "DESCRIPTION" DER encode PRIV structure. Typically \fBshishi_priv_build()\fP is used to build the PRIV structure first. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_name_set.30000644000000000000000000000271412126773161016511 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_name_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_name_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_principal_name_set(Shishi * " handle ", Shishi_asn1 " namenode ", const char * " namefield ", Shishi_name_type " name_type ", const char * [] " name ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 namenode" 12 ASN.1 structure with principal in \fInamefield\fP. .IP "const char * namefield" 12 name of field in \fInamenode\fP containing principal name. .IP "Shishi_name_type name_type" 12 type of principal, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] name" 12 null\-terminated input array with principal name. .SH "DESCRIPTION" Set the given principal name field to the given name. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encprivpart_user_data.30000644000000000000000000000262412126773163017243 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encprivpart_user_data" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encprivpart_user_data \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encprivpart_user_data(Shishi * " handle ", Shishi_asn1 " encprivpart ", char ** " userdata ", size_t * " userdatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encprivpart" 12 encprivpart as allocated by \fBshishi_priv()\fP. .IP "char ** userdata" 12 output array with newly allocated user data from KRB\-PRIV. .IP "size_t * userdatalen" 12 output size of output user data buffer. .SH "DESCRIPTION" Read user data value from KRB\-PRIV. \fIuserdata\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_set_enc_part.30000644000000000000000000000315312126773163016363 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_set_enc_part" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_set_enc_part \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_set_enc_part(Shishi * " handle ", Shishi_asn1 " priv ", int32_t " etype ", const char * " encpart ", size_t " encpartlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "int32_t etype" 12 input encryption type to store in PRIV. .IP "const char * encpart" 12 input encrypted data to store in PRIV. .IP "size_t encpartlen" 12 size of input encrypted data to store in PRIV. .SH "DESCRIPTION" Store encrypted data in PRIV. The encrypted data is usually created by calling \fBshishi_encrypt()\fP on some application specific data using the key from the ticket that is being used. To save time, you may want to use \fBshishi_priv_build()\fP instead, which encryptes the data and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_md4.30000644000000000000000000000231112126773156013336 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_md4" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_md4 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_md4(Shishi * " handle ", const char * " in ", size_t " inlen ", char * " out[16] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * in" 12 input character array of data to hash. .IP "size_t inlen" 12 length of input character array of data to hash. .IP "char * out[16]" 12 .SH "DESCRIPTION" Compute hash of data using MD4. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_sname.30000644000000000000000000000250512126773154016543 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_sname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_sname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_sname(Shishi * " handle ", Shishi_asn1 " krberror ", Shishi_name_type " name_type ", const char * [] " sname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] sname" 12 input array with principal name. .SH "DESCRIPTION" Set principal field in krberror to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_save.30000644000000000000000000000215112126773152015516 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR to save. .SH "DESCRIPTION" Save DER encoding of KRB\-ERROR to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_ctime.30000644000000000000000000000223412126773154015665 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_ctime(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror to set client name field in. .IP "char ** t" 12 newly allocated zero\-terminated output array with client time. .SH "DESCRIPTION" Extract client time from KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_clear_padata.30000644000000000000000000000210312126773143016575 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_clear_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_clear_padata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_clear_padata(Shishi * " handle ", Shishi_asn1 " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to remove PA\-DATA from. .SH "DESCRIPTION" Remove the padata field from KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_info.30000644000000000000000000000205012126773137013604 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_info" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_info \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_info(Shishi * " handle ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * format" 12 printf style format string. @...: print style arguments. .IP " ..." 12 .SH "DESCRIPTION" Print informational message to output as defined in handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror.30000644000000000000000000000200212126773152014473 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_krberror(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new KRB\-ERROR, populated with some default values. .SH "RETURN VALUE" Returns the KRB\-ERROR or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_ctime_set.30000644000000000000000000000232512126773133017372 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_ctime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_ctime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_ctime_set(Shishi * " handle ", Shishi_asn1 " encapreppart ", const char * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "const char * t" 12 string with generalized time value to store in EncAPRepPart. .SH "DESCRIPTION" Store client time in EncAPRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_from_file.30000644000000000000000000000212712126773176015670 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_from_file(Shishi_tkts * " tkts ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * filename" 12 filename to read tickets from. .SH "DESCRIPTION" Read tickets from file and add them to the ticket set. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_done.30000644000000000000000000000236312126773140013577 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_done(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Deallocates the shishi library handle. The handle must not be used in any calls to shishi functions after this. If there is a default tkts, it is written to the default tkts file (call \fBshishi_tkts_default_file_set()\fP to change the default tkts file). If you do not wish to write the default tkts file, close the default tkts with shishi_tkts_done(handle, NULL) before calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_nosubkey.30000644000000000000000000000213012126773107015164 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_nosubkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_nosubkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_nosubkey(Shishi * " handle ", Shishi_ap ** " ap ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .SH "DESCRIPTION" Create a new AP exchange without subkey in authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_hw_authent_p.30000644000000000000000000000261512126773173016227 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_hw_authent_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_hw_authent_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_hw_authent_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is authenticated using a hardware token. The PRE\-AUTHENT and HW\-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket\-granting ticket (in which case the INITIAL flag is clear, but the PRE\-AUTHENT and HW\-AUTHENT flags are carried forward from the ticket\-granting ticket). .SH "RETURN VALUE" Returns non\-0 iff hw\-authent flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_priv.30000644000000000000000000000230212126773123015323 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_priv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_priv \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_priv(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of KRB\-PRIV and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_key_set.30000644000000000000000000000234012126773135017234 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_key_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_key_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_key_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "Shishi_key * key" 12 key handle with information to store in encticketpart. .SH "DESCRIPTION" Set the EncTicketPart.key field to key type and value of supplied key. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_for_server.30000644000000000000000000000231712126773137016764 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_for_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_for_server \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_hostkeys_for_server(Shishi * " handle ", const char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * server" 12 server name to get key for .SH "DESCRIPTION" Get host key for \fIserver\fP. .SH "RETURN VALUE" Returns the key for specific server, read from the default host keys file (see \fBshishi_hostkeys_default_file()\fP), or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_checksum_name.30000644000000000000000000000176712126773131015463 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_checksum_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_checksum_name \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_checksum_name(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 checksum type, see Shishi_cksumtype. .SH "DESCRIPTION" Get name of checksum. .SH "RETURN VALUE" Return name of checksum type, e.g. "hmac\-sha1\-96\-aes256", as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_print.30000644000000000000000000000201612126773151015036 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_print(Shishi_keys * " keys ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set to print. .IP "FILE * fh" 12 file handle, open for writing, to print keys to. .SH "DESCRIPTION" Print all keys in set using shishi_key_print. .SH "RETURNS" Returns \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_from_file.30000644000000000000000000000246212126773153016530 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_from_file(Shishi * " handle ", Shishi_asn1 * " krberror ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * krberror" 12 output variable with newly allocated KRB\-ERROR. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read KRB\-ERROR from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep_process.30000644000000000000000000000242012126773115015655 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_rep_process(Shishi_as * " as ", Shishi_key * " key ", const char * " password ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_key * key" 12 user's key, used to encrypt the encrypted part of the AS\-REP. .IP "const char * password" 12 user's password, used if key is NULL. .SH "DESCRIPTION" Process new AS\-REP and set ticket. The key is used to decrypt the AP\-REP. If both key and password is NULL, the user is queried for it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt_etype.30000644000000000000000000000454612126773131015551 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_crealm_set.30000644000000000000000000000225612126773135017715 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_crealm_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_crealm_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_crealm_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "const char * realm" 12 input array with name of realm. .SH "DESCRIPTION" Set the realm field in the KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_subkey.30000644000000000000000000000223112126773123017101 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_authenticator_subkey(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. It adds a random subkey. .SH "RETURN VALUE" Returns the authenticator or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_krberror_der.30000644000000000000000000000237312126773116016023 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_krberror_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_krberror_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_krberror_der(Shishi_as * " as ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of KRB\-ERROR. .IP "size_t * outlen" 12 length of output array with DER encoding of KRB\-ERROR. .SH "DESCRIPTION" DER encode KRB\-ERROR. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_client.30000644000000000000000000000324612126773136017056 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_client" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_client \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_client(Shishi * " handle ", Shishi_asn1 " encticketpart ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 EncTicketPart variable to get client name from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Represent client principal name in EncTicketPart as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_dk.30000644000000000000000000000262112126773132013246 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_dk" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_dk \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_dk(Shishi * " handle ", Shishi_key * " key ", const char * " prfconstant ", size_t " prfconstantlen ", Shishi_key * " derivedkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 input cryptographic key to use. .IP "const char * prfconstant" 12 input array with the constant string. .IP "size_t prfconstantlen" 12 size of input array with the constant string. .IP "Shishi_key * derivedkey" 12 pointer to derived key (allocated by caller). .SH "DERIVE A KEY FROM A KEY AND A CONSTANT THUSLY" DK(KEY, PRFCONSTANT) = SHISHI_RANDOM\-TO\-KEY(SHISHI_DR(KEY, PRFCONSTANT)). .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_key_set.30000644000000000000000000000175512126773164015325 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_key_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_key_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_safe_key_set(Shishi_safe * " safe ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 structure that holds information about SAFE exchange .IP "Shishi_key * key" 12 key to store in SAFE. .SH "DESCRIPTION" Set the Key in the SAFE exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_susec.30000644000000000000000000000226112126773155015707 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_susec" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_susec \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_susec(Shishi * " handle ", Shishi_asn1 " krberror ", uint32_t * " susec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .IP "uint32_t * susec" 12 output integer with server microseconds field. .SH "DESCRIPTION" Extract server microseconds field from Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tkt_set.30000644000000000000000000000173712126773110015010 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tkt_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tkt_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_tkt_set(Shishi_ap * " ap ", Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to store in AP. .SH "DESCRIPTION" Set the Ticket in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_read.30000644000000000000000000000220412126773165014564 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " safe ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * safe" 12 output variable with newly allocated SAFE. .SH "DESCRIPTION" Read DER encoded SAFE from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_add.30000644000000000000000000000222712126773151014436 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_add(Shishi_keys * " keys ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .IP "Shishi_key * key" 12 key to be added to key set. .SH "DESCRIPTION" Add a key to the key set. A deep copy of the key is stored, so changing \fIkey\fP, or deallocating it, will not modify the value stored in the key set. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_default.30000644000000000000000000000203612126773163015460 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_default" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_default \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_realm_default(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get name of default realm. .SH "RETURN VALUE" Returns the default realm used in the library. (Not a copy of it, so don't modify or deallocate it.) .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_seqnumber_remove.30000644000000000000000000000222212126773134020771 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_seqnumber_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_seqnumber_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_seqnumber_remove(Shishi * " handle ", Shishi_asn1 " encapreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 encapreppart as allocated by \fBshishi_encapreppart()\fP. .SH "DESCRIPTION" Remove sequence number field in EncAPRepPart. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_options_set.30000644000000000000000000000223712126773114016411 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_options_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_options_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_options_set(Shishi * " handle ", Shishi_asn1 " apreq ", uint32_t " options ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ as allocated by \fBshishi_apreq()\fP. .IP "uint32_t options" 12 Options to set in AP\-REQ. .SH "DESCRIPTION" Set the AP\-Options in AP\-REQ to indicate integer. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_rep_process.30000644000000000000000000000207012126773167016057 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_rep_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_rep_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_rep_process(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Process new TGS\-REP and set ticket. The key to decrypt the TGS\-REP is taken from the EncKDCRepPart of the TGS tgticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_from_file.30000644000000000000000000000243512126773114016005 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_from_file(Shishi * " handle ", Shishi_asn1 * " apreq ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * apreq" 12 output variable with newly allocated AP\-REQ. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read AP\-REQ from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_print.30000644000000000000000000000222412126773133016550 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " encapreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of EncAPRepPart to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_random_subkey.30000644000000000000000000000232612126773126021261 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_random_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_random_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_random_subkey(Shishi * " handle ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Generate random subkey, of the default encryption type from configuration, and store it in the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509cert_default_file_guess.30000644000000000000000000000222412126773160020144 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509cert_default_file_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509cert_default_file_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_x509cert_default_file_guess(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Guesses the default X.509 client certificate filename; it is $HOME/.shishi/client.certs. .SH "RETURN VALUE" Returns default X.509 client certificate filename as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_clientkdcetype.30000644000000000000000000000217412126773127016505 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_clientkdcetype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_clientkdcetype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg_clientkdcetype(Shishi * " handle ", int32_t ** " etypes ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t ** etypes" 12 output array with encryption types. .SH "DESCRIPTION" Set the etypes variable to the array of preferred client etypes. .SH "RETURN VALUE" Return the number of encryption types in the array, 0 means none. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_print.30000644000000000000000000000215612126773143015342 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of KDC\-REQ to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_ticket_set.30000644000000000000000000000175412126773171015701 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_ticket_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_ticket_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_ticket_set(Shishi_tkt * " tkt ", Shishi_asn1 " ticket ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "Shishi_asn1 ticket" 12 ASN.1 Ticket to store in ticket. .SH "DESCRIPTION" Set the ASN.1 Ticket in the Ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aes_cts.30000644000000000000000000000343612126773157014305 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aes_cts" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aes_cts \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aes_cts(Shishi * " handle ", int " decryptp ", const char * " key ", size_t " keylen ", const char " iv[16] ", char * " ivout[16] ", const char * " in ", size_t " inlen ", char ** " out ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int decryptp" 12 0 to indicate encryption, non\-0 to indicate decryption. .IP "const char * key" 12 input character array with key to use. .IP "size_t keylen" 12 length of input character array with key to use. .IP "const char iv[16]" 12 .IP "char * ivout[16]" 12 .IP "const char * in" 12 input character array of data to encrypt/decrypt. .IP "size_t inlen" 12 length of input character array of data to encrypt/decrypt. .IP "char ** out" 12 newly allocated character array with encrypted/decrypted data. .SH "DESCRIPTION" Encrypt or decrypt data (depending on \fIdecryptp\fP) using AES in CBC\-CTS mode. The length of the key, \fIkeylen\fP, decide if AES 128 or AES 256 should be used. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req_der_set.30000644000000000000000000000227512126773166016035 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_req_der_set(Shishi_tgs * " tgs ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "char * der" 12 input array with DER encoded AP\-REQ. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REQ. .SH "DESCRIPTION" DER decode TGS\-REQ and set it TGS exchange. If decoding fails, the TGS\-REQ in the TGS exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_save.30000644000000000000000000000220112126773133016345 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " encapreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart to save. .SH "DESCRIPTION" Save DER encoding of EncAPRepPart to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_ccache.30000644000000000000000000000211612126773175016635 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_ccache" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_ccache \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_tkts_default_ccache(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename of default ccache filename. .SH "RETURN VALUE" Returns the default ccache filename used in the library. The string is not a copy, so don't modify or deallocate it. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_prompt_password.30000644000000000000000000000262512126773157016126 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_prompt_password" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_prompt_password \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_prompt_password(Shishi * " handle ", char ** " s ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "char ** s" 12 pointer to newly allocated output string with read password. .IP "const char * format" 12 printf(3) style format string. @...: printf(3) style arguments. .IP " ..." 12 .SH "DESCRIPTION" Format and print a prompt, and read a password from user. The password is possibly converted (e.g., converted from Latin\-1 to UTF\-8, or processed using Stringprep profile) following any "stringprocess" keywords in configuration files. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt2.30000644000000000000000000000237012126773171013540 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt2" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt2 \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkt2(Shishi * " handle ", Shishi_asn1 " ticket ", Shishi_asn1 " enckdcreppart ", Shishi_asn1 " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 input variable with ticket. .IP "Shishi_asn1 enckdcreppart" 12 input variable with auxiliary ticket information. .IP "Shishi_asn1 kdcrep" 12 input variable with KDC\-REP ticket information. .SH "DESCRIPTION" Create a new ticket handle. .SH "RETURN VALUE" Returns new ticket handle, or \fBNULL\fP on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_set_authenticator.30000644000000000000000000000331712126773114017570 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_set_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_set_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_set_authenticator(Shishi * " handle ", Shishi_asn1 " apreq ", int32_t " etype ", uint32_t " kvno ", const char * " buf ", size_t " buflen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ to add authenticator field to. .IP "int32_t etype" 12 encryption type used to encrypt authenticator. .IP "uint32_t kvno" 12 version of the key used to encrypt authenticator. .IP "const char * buf" 12 input array with encrypted authenticator. .IP "size_t buflen" 12 size of input array with encrypted authenticator. .SH "DESCRIPTION" Set the encrypted authenticator field in the AP\-REP. The encrypted data is usually created by calling \fBshishi_encrypt()\fP on the DER encoded authenticator. To save time, you may want to use \fBshishi_apreq_add_authenticator()\fP instead, which calculates the encrypted data and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_tkt_set.30000644000000000000000000000175112126773167015215 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_tkt_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_tkt_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tgs_tkt_set(Shishi_tgs * " tgs ", Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "Shishi_tkt * tkt" 12 ticket to store in TGS. .SH "DESCRIPTION" Set the Ticket in the TGS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_sendrecv_hint.30000644000000000000000000000244012126773167016367 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_sendrecv_hint" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_sendrecv_hint \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_sendrecv_hint(Shishi_tgs * " tgs ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "Shishi_tkts_hint * hint" 12 additional parameters that modify connection behaviour, or \fBNULL\fP. .SH "DESCRIPTION" Send TGS\-REQ and receive TGS\-REP or KRB\-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The \fIhint\fP structure can be used to set, e.g., parameters for TLS authentication. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_verify.30000644000000000000000000000245212126773166015163 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_verify" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_verify \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_verify(Shishi_safe * " safe ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "Shishi_key * key" 12 key for session, used to verify checksum. .SH "DESCRIPTION" Verify checksum in KRB\-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. .SH "RETURN VALUE" Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_asreq.30000644000000000000000000000172212126773117014711 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_asreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_asreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_asreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for AS\-REQ. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt_iv.30000644000000000000000000000452412126773132015024 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt_iv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt_iv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt_iv(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", const char * " iv ", size_t " ivlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_server_set.30000644000000000000000000000230312126773154016742 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_server_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_server_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_server_set(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror to set server name field in. .IP "const char * server" 12 zero\-terminated string with principal name on RFC 1964 form. .SH "DESCRIPTION" Set the server name field in the Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_for_server.30000644000000000000000000000232412126773164016211 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_for_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_for_server \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_realm_for_server(Shishi * " handle ", char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "char * server" 12 hostname to find realm for. .SH "DESCRIPTION" Find realm for a host, using various methods. Currently this includes static configuration files (see \fBshishi_realm_for_server_file()\fP) and DNS (see \fBshishi_realm_for_server_dns()\fP). .SH "RETURN VALUE" Returns realm for host, or NULL if not found. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_resolv_free.30000644000000000000000000000167212126773164015175 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_resolv_free" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_resolv_free \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_resolv_free(Shishi_dns " rrs ");" .SH ARGUMENTS .IP "Shishi_dns rrs" 12 list of DNS RR as returned by \fBshishi_resolv()\fP. .SH "DESCRIPTION" Deallocate list of DNS RR as returned by \fBshishi_resolv()\fP. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_till.30000644000000000000000000000325512126773144015154 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_till" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_till \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_till(Shishi * " handle ", Shishi_asn1 " kdcreq ", char ** " till ", size_t * " tilllen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get client name from. .IP "char ** till" 12 pointer to newly allocated zero terminated string containing "till" field with generalized time. May be \fBNULL\fP (to only populate \fIrealmlen\fP). .IP "size_t * tilllen" 12 pointer to length of \fItill\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fItilllen\fP). .SH "DESCRIPTION" Get "till" field (i.e. "endtime") in KDC\-REQ, as zero\-terminated string. The string is typically 15 characters long. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIrealmlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_key.30000644000000000000000000000210212126773171014317 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_key \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_tkt_key(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again. .SH "RETURN VALUE" Returns key extracted from EncKDCRepPart or EncTicketPart. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_req.30000644000000000000000000000203012126773115014115 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_req" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_req \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_as_req(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Get ASN.1 AS\-REQ structure from AS exchange. .SH "RETURN VALUE" Returns the generated AS\-REQ packet from the AS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_add_ccache_file.30000644000000000000000000000303012126773175016734 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_add_ccache_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_add_ccache_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_add_ccache_file(Shishi * " handle ", const char * " filename ", Shishi_tkts * " tkts ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 name of file to read. .IP "Shishi_tkts * tkts" 12 allocated ticket set to store tickets in. .SH "DESCRIPTION" Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. .SH "RETURNS" Returns \fBSHISHI_IO_ERROR\fP if the file cannot be read, \fBSHISHI_CCACHE_ERROR\fP if the data cannot be parsed as a valid ccache structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_authorizationdata.30000644000000000000000000000263712126773125022155 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_authorizationdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_authorizationdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_authorizationdata(Shishi * " handle ", Shishi_asn1 " authenticator ", int32_t " adtype ", const char * " addata ", size_t " addatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int32_t adtype" 12 input authorization data type to add. .IP "const char * addata" 12 input authorization data to add. .IP "size_t addatalen" 12 size of input authorization data to add. .SH "DESCRIPTION" Add authorization data to authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_set_tktoptionsasn1usage.30000644000000000000000000000325412126773107020236 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_set_tktoptionsasn1usage" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_set_tktoptionsasn1usage \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_set_tktoptionsasn1usage(Shishi_ap * " ap ", Shishi_tkt * " tkt ", int " options ", Shishi_asn1 " node ", const char * " field ", int " authenticatorcksumkeyusage ", int " authenticatorkeyusage ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in AP. .IP "int options" 12 AP\-REQ options to set in AP. .IP "Shishi_asn1 node" 12 input ASN.1 structure to store as authenticator checksum data. .IP "const char * field" 12 field in ASN.1 structure to use. .IP "int authenticatorcksumkeyusage" 12 key usage for checksum in authenticator. .IP "int authenticatorkeyusage" 12 key usage for authenticator. .SH "DESCRIPTION" Set ticket, options and authenticator checksum data using \fBshishi_ap_set_tktoptionsdata()\fP. The authenticator checksum data is the DER encoding of the ASN.1 field provided. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_crypto_close.30000644000000000000000000000170012126773130015350 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_crypto_close" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_crypto_close \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_crypto_close(Shishi_crypto * " ctx ");" .SH ARGUMENTS .IP "Shishi_crypto * ctx" 12 crypto context as returned by \fBshishi_crypto()\fP. .SH "DESCRIPTION" Deallocate resources associated with the crypto context. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_ccache_set.30000644000000000000000000000230512126773175017510 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_ccache_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_ccache_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkts_default_ccache_set(Shishi * " handle ", const char * " ccache ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * ccache" 12 string with new default ccache filename, or NULL to reset to default. .SH "DESCRIPTION" Set the default ccache filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_prompt_password_callback_get.30000644000000000000000000000221612126773157020575 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_prompt_password_callback_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_prompt_password_callback_get \- API function .SH SYNOPSIS .B #include .sp .BI "shishi_prompt_password_func shishi_prompt_password_callback_get(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Get the application password prompt function callback as set by \fBshishi_prompt_password_callback_set()\fP. .SH "RETURNS" Returns the callback, a \fBshishi_prompt_password_func\fP type, or \fBNULL\fP. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_set_tktoptions.30000644000000000000000000000227412126773107016427 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_set_tktoptions" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_set_tktoptions \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_set_tktoptions(Shishi_ap * " ap ", Shishi_tkt * " tkt ", int " options ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in AP. .IP "int options" 12 AP\-REQ options to set in AP. .SH "DESCRIPTION" Set the ticket (see \fBshishi_ap_tkt_set()\fP) and set the AP\-REQ apoptions (see \fBshishi_apreq_options_set()\fP). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_lastreq_pretty_print.30000644000000000000000000000207312126773175020040 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_lastreq_pretty_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_lastreq_pretty_print \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_lastreq_pretty_print(Shishi_tkt * " tkt ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "FILE * fh" 12 file handle open for writing. .SH "DESCRIPTION" Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_kdcreq.30000644000000000000000000000233412126773123015621 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_kdcreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_kdcreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_kdcreq(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of AS\-REQ, TGS\-REQ or KDC\-REQ and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_endctime.30000644000000000000000000000205212126773174015326 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_endctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_endctime \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_tkt_endctime(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid. .SH "RETURN VALUE" Returns C time interpretation of the endtime in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_clientkdcetype_set.30000644000000000000000000000237512126773127017363 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_clientkdcetype_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_clientkdcetype_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg_clientkdcetype_set(Shishi * " handle ", char * " value ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "char * value" 12 string with encryption types. .SH "DESCRIPTION" Set the "client\-kdc\-etypes" configuration option from given string. The string contains encryption types (integer or names) separated by comma or whitespace, e.g. "aes256\-cts\-hmac\-sha1\-96 des3\-cbc\-sha1\-kd des\-cbc\-md5". .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_save.30000644000000000000000000000213512126773142015137 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to save. .SH "DESCRIPTION" Print DER encoding of KDC\-REP to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_process.30000644000000000000000000000231012126773163015365 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_process(Shishi_priv * " priv ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "Shishi_key * key" 12 key to use to decrypt EncPrivPart. .SH "DESCRIPTION" Decrypt encrypted data in KRB\-PRIV and set the EncPrivPart in the PRIV exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_from_file.30000644000000000000000000000244412126773142016146 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_from_file(Shishi * " handle ", Shishi_asn1 * " kdcrep ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * kdcrep" 12 output variable with newly allocated KDC\-REP. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read KDC\-REP from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_from_ccache_mem.30000644000000000000000000000321412126773175017012 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_from_ccache_mem" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_from_ccache_mem \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_from_ccache_mem(Shishi * " handle ", const char * " data ", size_t " len ", Shishi_tkts ** " outtkts ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * data" 12 constant memory buffer with ccache of \fIlen\fP size. .IP "size_t len" 12 size of memory buffer with ccache data. .IP "Shishi_tkts ** outtkts" 12 pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. .SH "DESCRIPTION" Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. .SH "RETURNS" Returns \fBSHISHI_CCACHE_ERROR\fP if the data does not represent a valid ccache structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_verbose.30000644000000000000000000000206012126773137014317 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_verbose" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_verbose \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_verbose(Shishi * " handle ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * format" 12 printf style format string. @...: print style arguments. .IP " ..." 12 .SH "DESCRIPTION" Print a diagnostic message to output as defined in handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_set_tktoptionsdata.30000644000000000000000000000267012126773107017261 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_set_tktoptionsdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_set_tktoptionsdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_set_tktoptionsdata(Shishi_ap * " ap ", Shishi_tkt * " tkt ", int " options ", const char * " data ", size_t " len ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in AP. .IP "int options" 12 AP\-REQ options to set in AP. .IP "const char * data" 12 input array with data to checksum in Authenticator. .IP "size_t len" 12 length of input array with data to checksum in Authenticator. .SH "DESCRIPTION" Set the ticket (see \fBshishi_ap_tkt_set()\fP) and set the AP\-REQ apoptions (see \fBshishi_apreq_options_set()\fP) and set the Authenticator checksum data. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_version_set.30000644000000000000000000000202512126773147016064 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_version_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_version_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_version_set(Shishi_key * " key ", uint32_t " kvno ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "uint32_t kvno" 12 new version integer. .SH "DESCRIPTION" Set the version of key ("kvno") in key structure. Use UINT32_MAX for non\-ptermanent keys. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_errorcode_set.30000644000000000000000000000226012126773155017423 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_errorcode_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_errorcode_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_errorcode_set(Shishi * " handle ", Shishi_asn1 " krberror ", int " errorcode ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code to set. .IP "int errorcode" 12 new error code to set in krberror. .SH "DESCRIPTION" Set the error\-code field to a new error code. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asrep.30000644000000000000000000000176312126773141013770 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asrep(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new AS\-REP, populated with some default values. .SH "RETURN VALUE" Returns the AS\-REP or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_to_keytab_file.30000644000000000000000000000277412126773152016676 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_to_keytab_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_to_keytab_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_to_keytab_file(Shishi * " handle ", Shishi_keys * " keys ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_keys * keys" 12 keyset to write. .IP "const char * filename" 12 name of file to write. .SH "DESCRIPTION" Write keys to a MIT keytab data structure. The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" \fBSHISHI_FOPEN_ERROR\fP if there is a problem opening \fIfilename\fP for writing, \fBSHISHI_IO_ERROR\fP if there is problem writing the file, and \fBSHISHI_OK\fP on success. .SH "SINCE" 0.0.42 .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt_iv.30000644000000000000000000000451612126773132015037 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt_iv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt_iv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt_iv(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", const char * " iv ", size_t " ivlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get_tgs.30000644000000000000000000000257212126773177015367 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get_tgs" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get_tgs \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get_tgs(Shishi_tkts * " tkts ", Shishi_tkts_hint * " hint ", Shishi_tkt * " tgt ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_tkts_hint * hint" 12 structure with characteristics of ticket to begot. .IP "Shishi_tkt * tgt" 12 ticket granting ticket to use. .SH "DESCRIPTION" Get a ticket via TGS exchange using specified ticket granting ticket. This function is used by \fBshishi_tkts_get()\fP, which is probably what you really want to use unless you have special needs. .SH "RETURN VALUE" Returns a ticket if successful, or NULL if this function is unable to acquire on. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_version.30000644000000000000000000000202112126773147015205 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_version" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_version \- API function .SH SYNOPSIS .B #include .sp .BI "uint32_t shishi_key_version(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get the "kvno" (key version) of key. It will be UINT32_MAX if the key is not long\-lived. .SH "RETURN VALUE" Returns the version of key ("kvno"). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_etype_info.30000644000000000000000000000174512126773117015744 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_etype_info" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_etype_info \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_etype_info(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for ETYPE\-INFO. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_get_enc_part_etype.30000644000000000000000000000224712126773142020045 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_get_enc_part_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_get_enc_part_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_get_enc_part_etype(Shishi * " handle ", Shishi_asn1 " kdcrep ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP variable to get value from. .IP "int32_t * etype" 12 output variable that holds the value. .SH "DESCRIPTION" Extract KDC\-REP.enc\-part.etype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_set_ticket.30000644000000000000000000000221512126773114016175 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_set_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_set_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_set_ticket(Shishi * " handle ", Shishi_asn1 " apreq ", Shishi_asn1 " ticket ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ to add ticket field to. .IP "Shishi_asn1 ticket" 12 input ticket to copy into AP\-REQ ticket field. .SH "DESCRIPTION" Copy ticket into AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_add.30000644000000000000000000000222412126773176014454 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_add(Shishi_tkts * " tkts ", Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_tkt * tkt" 12 ticket to be added to ticket set. .SH "DESCRIPTION" Add a ticket to the ticket set. Only the pointer is stored, so if you modify \fItkt\fP, the ticket in the ticket set will also be modified. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_print.30000644000000000000000000000227712126773123016745 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Print ASCII armored DER encoding of authenticator to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tktoptions.30000644000000000000000000000264712126773107015560 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tktoptions" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tktoptions \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_tktoptions(Shishi * " handle ", Shishi_ap ** " ap ", Shishi_tkt * " tkt ", int " options ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in newly created AP. .IP "int options" 12 AP\-REQ options to set in newly created AP. .SH "DESCRIPTION" Create a new AP exchange using \fBshishi_ap()\fP, and set the ticket and AP\-REQ apoptions using \fBshishi_ap_set_tktoptions()\fP. A random session key is added to the authenticator, using the same keytype as the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep.30000644000000000000000000000200712126773111014111 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_ap_rep(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get ASN.1 AP\-REP structure from AP exchange. .SH "RETURN VALUE" Returns the AP\-REP from the AP exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_timestamp_set.30000644000000000000000000000207212126773147016404 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_timestamp_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_timestamp_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_timestamp_set(Shishi_key * " key ", time_t " timestamp ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "time_t timestamp" 12 new timestamp. .SH "DESCRIPTION" Set the time the key was established. Typically only relevant when exporting the key to keytab format. .SH "SINCE" 0.0.42 .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_rep_der.30000644000000000000000000000235612126773167015162 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_rep_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_rep_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_rep_der(Shishi_tgs * " tgs ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of TGS\-REP. .IP "size_t * outlen" 12 length of output array with DER encoding of TGS\-REP. .SH "DESCRIPTION" DER encode TGS\-REP. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_safe.30000644000000000000000000000203512126773164014570 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_safe" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_safe \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_safe_safe(Shishi_safe * " safe ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 structure that holds information about SAFE exchange .SH "DESCRIPTION" Get ASN.1 SAFE structured from SAFE exchange. .SH "RETURN VALUE" Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_parse.30000644000000000000000000000226512126773152015700 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * krberror" 12 output variable with newly allocated KRB\-ERROR. .SH "DESCRIPTION" Read ASCII armored DER encoded KRB\-ERROR from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req_build.30000644000000000000000000000200412126773166015475 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_req_build(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Checksum data in authenticator and add ticket and authenticator to TGS\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_set_server.30000644000000000000000000000207412126773170015712 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_set_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_set_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_set_server(Shishi_tgs * " tgs ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "const char * server" 12 indicates the server to acquire ticket for. .SH "DESCRIPTION" Set the server in the TGS\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_init_with_paths.30000644000000000000000000000361712126773140016052 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_init_with_paths" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_init_with_paths \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_init_with_paths(Shishi ** " handle ", const char * " tktsfile ", const char * " systemcfgfile ", const char * " usercfgfile ");" .SH ARGUMENTS .IP "Shishi ** handle" 12 pointer to handle to be created. .IP "const char * tktsfile" 12 Filename of ticket file, or NULL. .IP "const char * systemcfgfile" 12 Filename of system configuration, or NULL. .IP "const char * usercfgfile" 12 Filename of user configuration, or NULL. .SH "DESCRIPTION" Create a Shishi library handle, using \fBshishi()\fP, and read the system configuration file, user configuration file, and user tickets from the specified locations. If any of \fIusercfgfile\fP or \fIsystemcfgfile\fP is NULL, the file is read from its default location, which for the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration file is $HOME/.shishi/config. If the ticket file is NULL, a ticket file is not read at all. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_print.30000644000000000000000000000213412126773162015046 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " priv ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 priv" 12 PRIV to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of PRIV to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_ticket.30000644000000000000000000000170012126773171015015 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tkt_ticket(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Get ASN.1 Ticket structure from ticket. .SH "RETURN VALUE" Returns actual ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_to_der.30000644000000000000000000000255312126773121015050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_to_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_to_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asn1_to_der(Shishi * " handle ", Shishi_asn1 " node ", char ** " der ", size_t * " len ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 data to convert to DER. .IP "char ** der" 12 output array that holds DER encoding of \fInode\fP. .IP "size_t * len" 12 output variable with length of \fIder\fP output array. .SH "DESCRIPTION" Extract newly allocated DER representation of specified ASN.1 data. .SH "RETURN VALUE" Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_done.30000644000000000000000000000202612126773176014651 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkts_done(Shishi_tkts ** " tkts ");" .SH ARGUMENTS .IP "Shishi_tkts ** tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .SH "DESCRIPTION" Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_cname.30000644000000000000000000000250512126773153016522 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_cname(Shishi * " handle ", Shishi_asn1 " krberror ", Shishi_name_type " name_type ", const char * [] " cname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] cname" 12 input array with principal name. .SH "DESCRIPTION" Set principal field in krberror to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_build.30000644000000000000000000000226512126773165014757 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_build(Shishi_safe * " safe ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "Shishi_key * key" 12 key for session, used to compute checksum. .SH "DESCRIPTION" Build checksum and set it in KRB\-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_cksumtype.30000644000000000000000000000203312126773110020277 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_cksumtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_cksumtype \- API function .SH SYNOPSIS .B #include .sp .BI "int32_t shishi_ap_authenticator_cksumtype(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get the Authenticator Checksum Type in the AP exchange. .SH "RETURN VALUE" Return the authenticator checksum type. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_string_to_key.30000644000000000000000000000354612126773131015536 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_string_to_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_string_to_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_string_to_key(Shishi * " handle ", int32_t " keytype ", const char * " password ", size_t " passwordlen ", const char * " salt ", size_t " saltlen ", const char * " parameter ", Shishi_key * " outkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int32_t keytype" 12 cryptographic encryption type, see Shishi_etype. .IP "const char * password" 12 input array with password. .IP "size_t passwordlen" 12 length of input array with password. .IP "const char * salt" 12 input array with salt. .IP "size_t saltlen" 12 length of input array with salt. .IP "const char * parameter" 12 input array with opaque encryption type specific information. .IP "Shishi_key * outkey" 12 allocated key handle that will contain new key. .SH "DESCRIPTION" Derive key from a string (password) and salt (commonly concatenation of realm and principal) for specified key type, and set the type and value in the given key to the computed values. The parameter value is specific for each keytype, and can be set if the parameter information is not available. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_seqnumber_set.30000644000000000000000000000237112126773134020274 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_seqnumber_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_seqnumber_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_seqnumber_set(Shishi * " handle ", Shishi_asn1 " encapreppart ", uint32_t " seqnumber ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 encapreppart as allocated by \fBshishi_encapreppart()\fP. .IP "uint32_t seqnumber" 12 integer with sequence number field to store in encapreppart. .SH "DESCRIPTION" Store sequence number field in EncAPRepPart. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_key_set.30000644000000000000000000000201012126773171015170 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_key_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_key_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_key_set(Shishi_tkt * " tkt ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "Shishi_key * key" 12 key to store in ticket. .SH "DESCRIPTION" Set the key in the EncTicketPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_authenticator.30000644000000000000000000000176012126773120016444 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_authenticator(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for Authenticator. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_from_file.30000644000000000000000000000251212126773133017356 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_from_file(Shishi * " handle ", Shishi_asn1 * " encapreppart ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * encapreppart" 12 output variable with newly allocated EncAPRepPart. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read EncAPRepPart from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_encticketpart.30000644000000000000000000000175012126773171016377 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_encticketpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_encticketpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tkt_encticketpart(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Get ASN.1 EncTicketPart structure from ticket. .SH "RETURN VALUE" Returns EncTicketPart information. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req_der.30000644000000000000000000000235612126773166015162 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_req_der(Shishi_tgs * " tgs ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of TGS\-REQ. .IP "size_t * outlen" 12 length of output array with DER encoding of TGS\-REQ. .SH "DESCRIPTION" DER encode TGS\-REQ. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_encapreppart_set.30000644000000000000000000000202612126773112016664 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_encapreppart_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_encapreppart_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_encapreppart_set(Shishi_ap * " ap ", Shishi_asn1 " encapreppart ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart to store in AP. .SH "DESCRIPTION" Set the EncAPRepPart in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_realm_set.30000644000000000000000000000214312126773147015500 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_realm_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_realm_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_realm_set(Shishi_key * " key ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "const char * realm" 12 string with new realm name. .SH "DESCRIPTION" Set the realm for the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_enumerate_principals.30000644000000000000000000000262512126773200016701 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_enumerate_principals" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_enumerate_principals \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_enumerate_principals(Shisa * " dbh ", const char * " realm ", char *** " principals ", size_t * " nprincipals ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm, as zero\-terminated UTF\-8 string. .IP "char *** principals" 12 .IP "size_t * nprincipals" 12 Pointer to number indicating number of allocated realm strings. .SH "DESCRIPTION" Extract a list of all principal names in realm in backend, as zero\-terminated UTF\-8 strings. The caller must deallocate the strings. .SH "RETURN VALUE" Returns SHISA_OK on success, SHISA_NO_REALM if the specified realm does not exist, or error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_write.30000644000000000000000000000205312126773176015056 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_write" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_write \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_write(Shishi_tkts * " tkts ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "FILE * fh" 12 file descriptor to write tickets to. .SH "DESCRIPTION" Write tickets in set to file descriptor. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_build.30000644000000000000000000000177312126773112015302 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_build(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Checksum data in authenticator and add ticket and authenticator to AP\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_options.30000644000000000000000000000222712126773145015702 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_options" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_options \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_options(Shishi * " handle ", Shishi_asn1 " kdcreq ", uint32_t * " flags ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .IP "uint32_t * flags" 12 pointer to output integer with flags. .SH "DESCRIPTION" Extract KDC\-Options from KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_may_postdate_p.30000644000000000000000000000362612126773173016555 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_may_postdate_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_may_postdate_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_may_postdate_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket may be used to grant postdated tickets. The MAY\-POSTDATE flag in a ticket is normally only interpreted by the ticket\-granting service. It can be ignored by application servers. This flag MUST be set in a ticket\-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW\- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket\-granting ticket; postdated ticket\-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime\-starttime) of a postdated ticket will be the remaining life of the ticket\-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime\-starttime) of the ticket\-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated. .SH "RETURN VALUE" Returns non\-0 iff may\-postdate flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_to_file.30000644000000000000000000000242612126773165015300 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_to_file(Shishi * " handle ", Shishi_asn1 " safe ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 safe" 12 SAFE to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write SAFE to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_default_file.30000644000000000000000000000211712126773137017231 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_default_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_default_file \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_hostkeys_default_file(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get file name of default host key file. .SH "RETURN VALUE" Returns the default host key filename used in the library. (Not a copy of it, so don't modify or deallocate it.) .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_type.30000644000000000000000000000172512126773147014513 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_type" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_type \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_type(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get key type. .SH "RETURN VALUE" Returns the type of key as an integer as described in the standard. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_process.30000644000000000000000000000407012126773141015147 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_process(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_asn1 " kdcrep ", Shishi_key * " key ", int " keyusage ", Shishi_asn1 * " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 input variable that holds the sent KDC\-REQ. .IP "Shishi_asn1 kdcrep" 12 input variable that holds the received KDC\-REP. .IP "Shishi_key * key" 12 input array with key to decrypt encrypted part of KDC\-REP with. .IP "int keyusage" 12 kereros key usage value. .IP "Shishi_asn1 * enckdcreppart" 12 output variable that holds new EncKDCRepPart. .SH "DESCRIPTION" Process a KDC client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. Use \fBshishi_kdcrep_get_ticket()\fP to extract the ticket. This function verifies the various conditions that must hold if the response is to be considered valid, specifically it compares nonces (\fBshishi_kdc_check_nonce()\fP) and if the exchange was a AS exchange, it also compares cname and crealm (\fBshishi_as_check_cname()\fP and \fBshishi_as_check_crealm()\fP). Usually the \fBshishi_as_process()\fP and \fBshishi_tgs_process()\fP functions should be used instead, since they simplify the decryption key computation. .SH "RETURN VALUE" Returns SHISHI_OK iff the KDC client exchange was successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_set_cname.30000644000000000000000000000255512126773124017547 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_set_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_set_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_set_cname(Shishi * " handle ", Shishi_asn1 " authenticator ", Shishi_name_type " name_type ", const char * [] " cname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] cname" 12 input array with principal name. .SH "DESCRIPTION" Set principal field in authenticator to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_lastreqc.30000644000000000000000000000224012126773174015353 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_lastreqc" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_lastreqc \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_tkt_lastreqc(Shishi_tkt * " tkt ", Shishi_lrtype " lrtype ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "Shishi_lrtype lrtype" 12 lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST. .SH "DESCRIPTION" Extract C time corresponding to given lastreq type field in the ticket. .SH "RETURN VALUE" Returns C time interpretation of the specified lastreq field, or (time_t) \-1. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_enckdcreppart.30000644000000000000000000000176012126773120016417 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_enckdcreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_enckdcreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_enckdcreppart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for EncKDCRepPart. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_3des.30000644000000000000000000000307212126773157013516 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_3des" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_3des \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_3des(Shishi * " handle ", int " decryptp ", const char " key[8] ", const char " iv[8] ", char * " ivout[8] ", const char * " in ", size_t " inlen ", char ** " out ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int decryptp" 12 0 to indicate encryption, non\-0 to indicate decryption. .IP "const char key[8]" 12 .IP "const char iv[8]" 12 .IP "char * ivout[8]" 12 .IP "const char * in" 12 input character array of data to encrypt/decrypt. .IP "size_t inlen" 12 length of input character array of data to encrypt/decrypt. .IP "char ** out" 12 newly allocated character array with encrypted/decrypted data. .SH "DESCRIPTION" Encrypt or decrypt data (depending on \fIdecryptp\fP) using 3DES in CBC mode. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_crypto.30000644000000000000000000000353412126773127014200 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_crypto" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_crypto \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_crypto * shishi_crypto(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " iv ", size_t " ivlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key will encrypt/decrypt. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .SH "DESCRIPTION" Initialize a crypto context. This store a key, keyusage, encryption type and initialization vector in a "context", and the caller can then use this context to perform encryption via \fBshishi_crypto_encrypt()\fP and decryption via \fBshishi_crypto_encrypt()\fP without supplying all those details again. The functions also takes care of propagating the IV between calls. When the application no longer need to use the context, it should deallocate resources associated with it by calling \fBshishi_crypto_close()\fP. .SH "RETURN VALUE" Return a newly allocated crypto context. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_etext.30000644000000000000000000000230612126773155016571 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_etext" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_etext \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_etext(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " etext ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * etext" 12 input array with error text to set. .SH "DESCRIPTION" Set error text (e\-text) field in KRB\-ERROR to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_ctime_set.30000644000000000000000000000226112126773154016540 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_ctime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_ctime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_ctime_set(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * t" 12 string with generalized time value to store in Krberror. .SH "DESCRIPTION" Store client time in Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_print.30000644000000000000000000000261312126773133014656 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_print(Shishi * " handle ", FILE * " fh ", const Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle opened for writing. .IP "const Shishi_key * key" 12 key to print. .SH "DESCRIPTION" Print an ASCII representation of a key structure to file descriptor. Example output: \-\-\-\-\-BEGIN SHISHI KEY\-\-\-\-\- .SH "KEYTYPE" 18 (aes256\-cts\-hmac\-sha1\-96) .SH "PRINCIPAL" host/latte.josefsson.org .SH "REALM" JOSEFSSON.ORG Key\-Version\-Number: 1 P1QdeW/oSiag/bTyVEBAY2msiGSTmgLXlopuCKoppDs= \-\-\-\-\-END SHISHI KEY\-\-\-\-\- .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_checksum_cksumlen.30000644000000000000000000000177712126773131016365 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_checksum_cksumlen" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_checksum_cksumlen \- API function .SH SYNOPSIS .B #include .sp .BI "size_t shishi_checksum_cksumlen(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 checksum type, see Shishi_cksumtype. .SH "DESCRIPTION" Get length of checksum output. .SH "RETURN VALUE" Return length of checksum used for the checksum type, as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_parse.30000644000000000000000000000231512126773133016527 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " encapreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * encapreppart" 12 output variable with newly allocated EncAPRepPart. .SH "DESCRIPTION" Read ASCII armored DER encoded EncAPRepPart from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_get_padata.30000644000000000000000000000303712126773146016301 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_get_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_get_padata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_get_padata(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_padata_type " padatatype ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to get PA\-DATA from. .IP "Shishi_padata_type padatatype" 12 type of PA\-DATA, see Shishi_padata_type. .IP "char ** out" 12 output array with newly allocated PA\-DATA value. .IP "size_t * outlen" 12 size of output array with PA\-DATA value. .SH "DESCRIPTION" Get pre authentication data (PA\-DATA) from KDC\-REQ. Pre authentication data is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP\-REQ that authenticates the user to get the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts.30000644000000000000000000000204112126773176013641 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts(Shishi * " handle ", Shishi_tkts ** " tkts ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_tkts ** tkts" 12 output pointer to newly allocated tkts handle. .SH "DESCRIPTION" Get a new ticket set handle. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_rep.30000644000000000000000000000201412126773167014317 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_rep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_rep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tgs_rep(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get TGS\-REP from TGS exchange. .SH "RETURN VALUE" Returns the received TGS\-REP from the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_options_add.30000644000000000000000000000233012126773114016340 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_options_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_options_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_options_add(Shishi * " handle ", Shishi_asn1 " apreq ", uint32_t " option ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ as allocated by \fBshishi_apreq()\fP. .IP "uint32_t option" 12 Options to add in AP\-REQ. .SH "DESCRIPTION" Add the AP\-Options in AP\-REQ. Options not set in input parameter \fIoption\fP are preserved in the AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_flags_add.30000644000000000000000000000211112126773172015434 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_flags_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_flags_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_flags_add(Shishi_tkt * " tkt ", uint32_t " flag ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "uint32_t flag" 12 integer with flags to store in ticket. .SH "DESCRIPTION" Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_key_free.30000644000000000000000000000200712126773201014254 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_key_free" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_key_free \- API function .SH SYNOPSIS .B #include .sp .BI "void shisa_key_free(Shisa * " dbh ", Shisa_key * " key ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "Shisa_key * key" 12 Pointer to Shisa key structure to deallocate. .SH "DESCRIPTION" Deallocate the fields of a Shisa key structure, and the structure itself. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_encapreppart.30000644000000000000000000000205412126773112016012 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_encapreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_encapreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_ap_encapreppart(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get ASN.1 EncAPRepPart structure from AP exchange. .SH "RETURN VALUE" Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_verify_asn1.30000644000000000000000000000222012126773112016415 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_verify_asn1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_verify_asn1 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_rep_verify_asn1(Shishi_ap * " ap ", Shishi_asn1 " aprep ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 aprep" 12 input AP\-REP. .SH "DESCRIPTION" Set the AP\-REP in the AP exchange using \fBshishi_ap_rep_set()\fP and verify it using \fBshishi_ap_rep_verify()\fP. .SH "RETURN VALUE" Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_timestamp.30000644000000000000000000000214112126773147015526 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_timestamp" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_timestamp \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_key_timestamp(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get the time the key was established. Typically only present when the key was imported from a keytab format. .SH "RETURN VALUE" Returns the time the key was established, or (time_t)\-1 if not available. .SH "SINCE" 0.0.42 .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tktoptionsasn1usage.30000644000000000000000000000363312126773110017356 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tktoptionsasn1usage" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tktoptionsasn1usage \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_tktoptionsasn1usage(Shishi * " handle ", Shishi_ap ** " ap ", Shishi_tkt * " tkt ", int " options ", Shishi_asn1 " node ", const char * " field ", int " authenticatorcksumkeyusage ", int " authenticatorkeyusage ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in newly created AP. .IP "int options" 12 AP\-REQ options to set in newly created AP. .IP "Shishi_asn1 node" 12 input ASN.1 structure to store as authenticator checksum data. .IP "const char * field" 12 field in ASN.1 structure to use. .IP "int authenticatorcksumkeyusage" 12 key usage for checksum in authenticator. .IP "int authenticatorkeyusage" 12 key usage for authenticator. .SH "DESCRIPTION" Create a new AP exchange using \fBshishi_ap()\fP, and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using \fBshishi_ap_set_tktoptionsasn1usage()\fP. A random session key is added to the authenticator, using the same keytype as the ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_set_etype.30000644000000000000000000000247312126773144016212 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_set_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_set_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_set_etype(Shishi * " handle ", Shishi_asn1 " kdcreq ", int32_t * " etype ", int " netype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set etype field in. .IP "int32_t * etype" 12 input array with encryption types. .IP "int netype" 12 number of elements in input array with encryption types. .SH "DESCRIPTION" Set the list of supported or wanted encryption types in the request. The list should be sorted in priority order. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_expire.30000644000000000000000000000174612126773177015231 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_expire" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_expire \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_expire(Shishi_tkts * " tkts ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .SH "DESCRIPTION" Remove expired tickets from ticket set. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_tkt.30000644000000000000000000000176612126773110014137 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_tkt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_tkt \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_ap_tkt(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get Ticket from AP exchange. .SH "RETURN VALUE" Returns the ticket from the AP exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_valid_at_time_p.30000644000000000000000000000213512126773174016660 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_valid_at_time_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_valid_at_time_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_valid_at_time_p(Shishi_tkt * " tkt ", time_t " now ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "time_t now" 12 time to check for. .SH "DESCRIPTION" Determine if ticket is valid at a specific point in time. .SH "RETURN VALUE" Returns non\-0 iff ticket is valid (not expired and after starttime) at specified time. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error_set_outputtype.30000644000000000000000000000202312126773136017176 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error_set_outputtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error_set_outputtype \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_error_set_outputtype(Shishi * " handle ", int " type ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int type" 12 output type. .SH "DESCRIPTION" Set output type (NULL, stderr or syslog) for informational and warning messages. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_srealm_set.30000644000000000000000000000231412126773135017715 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_srealm_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_srealm_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_srealm_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", const char * " srealm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 EncKDCRepPart variable to set realm field in. .IP "const char * srealm" 12 input array with name of realm. .SH "DESCRIPTION" Set the server realm field in the EncKDCRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_check_cname.30000644000000000000000000000256312126773141015560 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_check_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_check_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_check_cname(Shishi * " handle ", Shishi_asn1 " asreq ", Shishi_asn1 " asrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 asreq" 12 AS\-REQ to compare client name field in. .IP "Shishi_asn1 asrep" 12 AS\-REP to compare client name field in. .SH "DESCRIPTION" Verify that AS\-REQ.req\-body.realm and AS\-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS\-REQ and AS\-REP exchange, see \fBshishi_kdc_process()\fP. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_CNAME_MISMATCH if the values differ, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_read.30000644000000000000000000000220412126773162014623 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " priv ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * priv" 12 output variable with newly allocated PRIV. .SH "DESCRIPTION" Read DER encoded PRIV from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_der.30000644000000000000000000000245012126773153015335 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_der(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "char ** out" 12 output array with newly allocated DER encoding of KRB\-ERROR. .IP "size_t * outlen" 12 length of output array with DER encoding of KRB\-ERROR. .SH "DESCRIPTION" DER encode KRB\-ERROR. The caller must deallocate the OUT buffer. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_random_to_key.30000644000000000000000000000262712126773131015507 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_random_to_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_random_to_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_random_to_key(Shishi * " handle ", int32_t " keytype ", const char * " rnd ", size_t " rndlen ", Shishi_key * " outkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int32_t keytype" 12 cryptographic encryption type, see Shishi_etype. .IP "const char * rnd" 12 input array with random data. .IP "size_t rndlen" 12 length of input array with random data. .IP "Shishi_key * outkey" 12 allocated key handle that will contain new key. .SH "DESCRIPTION" Derive key from random data for specified key type, and set the type and value in the given key to the computed values. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_crealm.30000644000000000000000000000237312126773153016032 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_crealm(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " realm ", size_t * " realmlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "char ** realm" 12 output array with newly allocated name of realm in KRB\-ERROR. .IP "size_t * realmlen" 12 size of output array. .SH "DESCRIPTION" Extract client realm from KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_from_keytab_mem.30000644000000000000000000000327212126773152017050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_from_keytab_mem" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_from_keytab_mem \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_from_keytab_mem(Shishi * " handle ", const char * " data ", size_t " len ", Shishi_keys ** " outkeys ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * data" 12 constant memory buffer with keytab of \fIlen\fP size. .IP "size_t len" 12 size of memory buffer with keytab data. .IP "Shishi_keys ** outkeys" 12 pointer to key set that will be allocated and populated, must be deallocated by caller on succes. .SH "DESCRIPTION" Create a new key set populated with keys from a MIT keytab data structure read from a memory block. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse\-engineered format. .SH "RETURNS" Returns \fBSHISHI_KEYTAB_ERROR\fP if the data does not represent a valid keytab structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_add_enc_part.30000644000000000000000000000241512126773170016621 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_add_enc_part" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_add_enc_part \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_add_enc_part(Shishi * " handle ", Shishi_asn1 " ticket ", Shishi_key * " key ", Shishi_asn1 " encticketpart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 Ticket to add enc\-part field to. .IP "Shishi_key * key" 12 key used to encrypt enc\-part. .IP "Shishi_asn1 encticketpart" 12 EncTicketPart to add. .SH "DESCRIPTION" Encrypts DER encoded EncTicketPart using key and stores it in the Ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_cksum.30000644000000000000000000000276312126773125017545 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_cksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_cksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_cksum(Shishi * " handle ", Shishi_asn1 " authenticator ", Shishi_key * " key ", int " keyusage ", char * " data ", size_t " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "Shishi_key * key" 12 key to to use for encryption. .IP "int keyusage" 12 cryptographic key usage value to use in encryption. .IP "char * data" 12 input array with data to calculate checksum on. .IP "size_t datalen" 12 size of input array with data to calculate checksum on. .SH "DESCRIPTION" Calculate checksum for data and store it in the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_proxy_p.30000644000000000000000000000231612126773173015240 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_proxy_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_proxy_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_proxy_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is proxy ticket. The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail. .SH "RETURN VALUE" Returns non\-0 iff proxy flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_cksumraw_set.30000644000000000000000000000312312126773110020763 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_cksumraw_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_cksumraw_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_authenticator_cksumraw_set(Shishi_ap * " ap ", int32_t " authenticatorcksumtype ", const char * " authenticatorcksumraw ", size_t " authenticatorcksumrawlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "int32_t authenticatorcksumtype" 12 authenticator checksum type to set in AP. .IP "const char * authenticatorcksumraw" 12 input array with authenticator checksum field value to set in Authenticator in AP\-REQ. .IP "size_t authenticatorcksumrawlen" 12 length of input array with authenticator checksum field value to set in Authenticator in AP\-REQ. .SH "DESCRIPTION" Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authorization_parse.30000644000000000000000000000201612126773126016743 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authorization_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authorization_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authorization_parse(const char * " authorization ");" .SH ARGUMENTS .IP "const char * authorization" 12 name of authorization type, "basic" or "k5login". .SH "DESCRIPTION" Parse authorization type name. .SH "RETURN VALUE" Returns authorization type corresponding to a string. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_find.30000644000000000000000000000366412126773177014656 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_find" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_find \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_find(Shishi_tkts * " tkts ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_tkts_hint * hint" 12 structure with characteristics of ticket to be found. .SH "DESCRIPTION" Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint\->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint\->startpos field must be updated appropriately. .SH "HERE IS HOW YOU WOULD TYPICALLY USE THIS FUNCTION" Shishi_tkts_hint hint; Shishi_tkt tkt; memset(&hint, 0, sizeof(hint)); hint.server = "imap/mail.example.org"; tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint); if (!tkt) printf("No ticket found...\n"); else do_something_with_ticket (tkt); .SH "RETURN VALUE" Returns a ticket if found, or NULL if no further matching tickets could be found. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_der.30000644000000000000000000000243112126773111014745 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_der(Shishi_ap * " ap ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char ** out" 12 pointer to output array with der encoding of AP\-REQ. .IP "size_t * outlen" 12 pointer to length of output array with der encoding of AP\-REQ. .SH "DESCRIPTION" Build AP\-REQ using \fBshishi_ap_req_build()\fP and DER encode it. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_options_set.30000644000000000000000000000230412126773146016552 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_options_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_options_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_options_set(Shishi * " handle ", Shishi_asn1 " kdcreq ", uint32_t " options ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set etype field in. .IP "uint32_t options" 12 integer with flags to store in KDC\-REQ. .SH "DESCRIPTION" Set options in KDC\-REQ. Note that this reset any already existing flags. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_default_userdirectory.30000644000000000000000000000237112126773127020104 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_default_userdirectory" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_default_userdirectory \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_cfg_default_userdirectory(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" The default user directory (used for, e.g. Shishi ticket cache) is normally computed by appending BASE_DIR ("/.shishi") to the content of the environment variable $HOME, but can be overridden by specifying the complete path in the environment variable SHISHI_HOME. .SH "RETURN VALUE" Return directory with configuration files etc. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_renew_p.30000644000000000000000000000304012126773146015641 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_renew_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_renew_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_renew_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option renew flag is set. This option is used only by the ticket\-granting service. The RENEW option indicates that the present request is for a renewal. The ticket provided is encrypted in the secret key for the server on which it is valid. This option will only be honored if the ticket to be renewed has its RENEWABLE flag set and if the time in its renew\-till field has not passed. The ticket to be renewed is passed in the padata field as part of the authentication header. .SH "RETURN VALUE" Returns non\-0 iff renew flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_renew_till_set.30000644000000000000000000000245512126773135020604 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_renew_till_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_renew_till_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_renew_till_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", const char * " renew_till ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "const char * renew_till" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.renew\-till to supplied value. Use a NULL value for \fIrenew_till\fP to remove the field. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_set_sname.30000644000000000000000000000245712126773144016171 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_set_sname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_set_sname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_set_sname(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_name_type " name_type ", const char * [] " sname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set server name field in. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * [] sname" 12 input array with principal name. .SH "DESCRIPTION" Set the server name field in the KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get.30000644000000000000000000000264112126773177014507 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get(Shishi_tkts * " tkts ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "Shishi_tkts_hint * hint" 12 structure with characteristics of ticket to be found. .SH "DESCRIPTION" Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using \fBshishi_tkts_get_tgt()\fP, and then uses that TGT in a TGS exchange to get the ticket. Currently this function does not implement cross realm logic. .SH "RETURN VALUE" Returns a ticket if found, or NULL if this function is unable to get the ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_encapreppart.30000644000000000000000000000233512126773123017035 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_encapreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_encapreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_encapreppart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncAPRepPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_from_file.30000644000000000000000000000242212126773163015655 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_from_file(Shishi * " handle ", Shishi_asn1 * " priv ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * priv" 12 output variable with newly allocated PRIV. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read PRIV from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_for_localservice.30000644000000000000000000000250212126773140020117 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_for_localservice" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_for_localservice \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_hostkeys_for_localservice(Shishi * " handle ", const char * " service ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * service" 12 service to get key for. .SH "DESCRIPTION" Get host key for \fIservice\fP on current host in default realm. .SH "RETURN VALUE" Returns the key for the server "SERVICE/HOSTNAME" (where HOSTNAME is the current system's hostname), read from the default host keys file (see \fBshishi_hostkeys_default_file()\fP), or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_ctime.30000644000000000000000000000231112126773133016512 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_ctime(Shishi * " handle ", Shishi_asn1 " encapreppart ", char ** " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "char ** t" 12 newly allocated zero\-terminated character array with client time. .SH "DESCRIPTION" Extract client time from EncAPRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_checksum.30000644000000000000000000000330512126773131014451 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_checksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_checksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_checksum(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int " cksumtype ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to compute checksum with. .IP "int keyusage" 12 integer specifying what this key is used for. .IP "int cksumtype" 12 the checksum algorithm to use. .IP "const char * in" 12 input array with data to integrity protect. .IP "size_t inlen" 12 size of input array with data to integrity protect. .IP "char ** out" 12 output array with newly allocated integrity protected data. .IP "size_t * outlen" 12 output variable with length of output array with checksum. .SH "DESCRIPTION" Integrity protect data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_get_ticket.30000644000000000000000000000223212126773142016321 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_get_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_get_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_get_ticket(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_asn1 * " ticket ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP variable to get ticket from. .IP "Shishi_asn1 * ticket" 12 output variable to hold extracted ticket. .SH "DESCRIPTION" Extract ticket from KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_remove.30000644000000000000000000000224012126773176015217 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_remove(Shishi_tkts * " tkts ", int " ticketno ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "int ticketno" 12 ticket number of ticket in the set to remove. The first ticket is ticket number 0. .SH "DESCRIPTION" Remove a ticket, indexed by \fIticketno\fP, in ticket set. .SH "RETURN VALUE" \fBSHISHI_OK\fP if successful or if \fIticketno\fP larger than size of ticket set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_tgsreq.30000644000000000000000000000230712126773122015654 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_tgsreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_tgsreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_tgsreq(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of TGS\-REQ and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa.30000644000000000000000000000167212126773201012412 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa \- API function .SH SYNOPSIS .B #include .sp .BI "Shisa * shisa( " void ");" .SH ARGUMENTS .IP " void" 12 .SH "DESCRIPTION" Initializes the Shisa library. If this function fails, it may print diagnostic errors to stderr. .SH "RETURN VALUE" Returns Shisa library handle, or \fBNULL\fP on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_req_build.30000644000000000000000000000173312126773115015305 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_req_build" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_req_build \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_req_build(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Possibly remove unset fields (e.g., rtime). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_cusec.30000644000000000000000000000226112126773154015666 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_cusec" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_cusec \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_cusec(Shishi * " handle ", Shishi_asn1 " krberror ", uint32_t * " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .IP "uint32_t * cusec" 12 output integer with client microseconds field. .SH "DESCRIPTION" Extract client microseconds field from Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_client_set.30000644000000000000000000000230012126773142016324 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_client_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_client_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_client_set(Shishi * " handle ", Shishi_asn1 " kdcrep ", const char * " client ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 Kdcrep variable to set server name field in. .IP "const char * client" 12 zero\-terminated string with principal name on RFC 1964 form. .SH "DESCRIPTION" Set the client name field in the KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_clientrealm.30000644000000000000000000000332212126773136020072 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_clientrealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_clientrealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_clientrealm(Shishi * " handle ", Shishi_asn1 " encticketpart ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 EncTicketPart variable to get client name and realm from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name and realm. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Convert cname and realm fields from EncTicketPart to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_copy.30000644000000000000000000000202412126773150014467 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_copy" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_copy \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_copy(Shishi_key * " dstkey ", Shishi_key * " srckey ");" .SH ARGUMENTS .IP "Shishi_key * dstkey" 12 structure that holds destination key information .IP "Shishi_key * srckey" 12 structure that holds source key information .SH "DESCRIPTION" Copies source key into existing allocated destination key. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_principal_find.30000644000000000000000000000271712126773200015453 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_principal_find" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_principal_find \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_principal_find(Shisa * " dbh ", const char * " realm ", const char * " principal ", Shisa_principal * " ph ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to get information on. .IP "Shisa_principal * ph" 12 Pointer to previously allocated principal structure to fill out with information about principal. .SH "DESCRIPTION" Extract information about given PRINCIPAL\fIREALM\fP. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful, \fBSHISA_NO_REALM\fP if the indicated realm does not exist, \fBSHISA_NO_PRINCIPAL\fP if the indicated principal does not exist, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509key_default_file_guess.30000644000000000000000000000217712126773160020006 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509key_default_file_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509key_default_file_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_x509key_default_file_guess(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Guesses the default X.509 client key filename; it is $HOME/.shishi/client.key. .SH "RETURN VALUE" Returns default X.509 client key filename as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs.30000644000000000000000000000204412126773166013453 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs(Shishi * " handle ", Shishi_tgs ** " tgs ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_tgs ** tgs" 12 holds pointer to newly allocate Shishi_tgs structure. .SH "DESCRIPTION" Allocate a new TGS exchange variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_cusec_set.30000644000000000000000000000233612126773124017563 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_cusec_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_cusec_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_cusec_set(Shishi * " handle ", Shishi_asn1 " authenticator ", uint32_t " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "uint32_t cusec" 12 client microseconds to set in authenticator, 0\-999999. .SH "DESCRIPTION" Set the cusec field in the Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_parse.30000644000000000000000000000224012126773113015146 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * apreq" 12 output variable with newly allocated AP\-REQ. .SH "DESCRIPTION" Read ASCII armored DER encoded AP\-REQ from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_postdated_p.30000644000000000000000000000273512126773145016521 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_postdated_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_postdated_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_postdated_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option postdated flag is set. The POSTDATED option indicates that this is a request for a postdated ticket. This option will only be honored if the ticket\-granting ticket on which it is based has its MAY\-POSTDATE flag set. The resulting ticket will also have its INVALID flag set, and that flag may be reset by a subsequent request to the KDC after the starttime in the ticket has been reached. .SH "RETURN VALUE" Returns non\-0 iff postdated flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_print.30000644000000000000000000000214712126773113015176 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 apreq" 12 AP\-REQ to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of AP\-REQ to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_set_crealm.30000644000000000000000000000232612126773124017723 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_set_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_set_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_set_crealm(Shishi * " handle ", Shishi_asn1 " authenticator ", const char * " crealm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "const char * crealm" 12 input array with realm. .SH "DESCRIPTION" Set realm field in authenticator to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_arcfour.30000644000000000000000000000363412126773157014325 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_arcfour" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_arcfour \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_arcfour(Shishi * " handle ", int " decryptp ", const char * " key ", size_t " keylen ", const char " iv[258] ", char * " ivout[258] ", const char * " in ", size_t " inlen ", char ** " out ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int decryptp" 12 0 to indicate encryption, non\-0 to indicate decryption. .IP "const char * key" 12 input character array with key to use. .IP "size_t keylen" 12 length of input key array. .IP "const char iv[258]" 12 .IP "char * ivout[258]" 12 .IP "const char * in" 12 input character array of data to encrypt/decrypt. .IP "size_t inlen" 12 length of input character array of data to encrypt/decrypt. .IP "char ** out" 12 newly allocated character array with encrypted/decrypted data. .SH "DESCRIPTION" Encrypt or decrypt data (depending on \fIdecryptp\fP) using ARCFOUR. The \fIout\fP buffer must be deallocated by the caller. The "initialization vector" used here is the concatenation of the sbox and i and j, and is thus always of size 256 + 1 + 1. This is a slight abuse of terminology, and assumes you know what you are doing. Don't use it if you can avoid to. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_stime.30000644000000000000000000000223412126773154015705 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_stime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_stime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_stime(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror to set client name field in. .IP "char ** t" 12 newly allocated zero\-terminated output array with server time. .SH "DESCRIPTION" Extract server time from KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_default_guess.30000644000000000000000000000216612126773160017550 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_default_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_default_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_principal_default_guess( " void ");" .SH ARGUMENTS .IP " void" 12 .SH "DESCRIPTION" Guesses the principal name for the user, looking at environment variables SHISHI_USER, USER and LOGNAME, or if that fails, returns the string "user". .SH "RETURN VALUE" Returns guessed default principal for user as a string that has to be deallocated by the caller with \fBfree()\fP. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_strerror.30000644000000000000000000000200112126773201014337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_strerror" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_strerror \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shisa_strerror(int " err ");" .SH ARGUMENTS .IP "int err" 12 shisa error code .SH "RETURN VALUE" Returns a pointer to a statically allocated string containing a description of the error with the error value \fIerr\fP. This string can be used to output a diagnostic message to the user. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_for_serverrealm.30000644000000000000000000000251312126773140017775 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_for_serverrealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_for_serverrealm \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_hostkeys_for_serverrealm(Shishi * " handle ", const char * " server ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * server" 12 server name to get key for .IP "const char * realm" 12 realm of server to get key for. .SH "DESCRIPTION" Get host key for \fIserver\fP in \fIrealm\fP. .SH "RETURN VALUE" Returns the key for specific server and realm, read from the default host keys file (see \fBshishi_hostkeys_default_file()\fP), or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_to_file.30000644000000000000000000000245012126773142015622 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_to_file(Shishi * " handle ", Shishi_asn1 " kdcrep ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write KDC\-REP to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_read.30000644000000000000000000000222612126773142015115 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * kdcrep" 12 output variable with newly allocated KDC\-REP. .SH "DESCRIPTION" Read DER encoded KDC\-REP from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_pa_enc_ts_enc.30000644000000000000000000000176312126773117016363 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_pa_enc_ts_enc" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_pa_enc_ts_enc \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_pa_enc_ts_enc(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for PA\-ENC\-TS\-ENC. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_edata.30000644000000000000000000000237012126773155015644 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_edata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_edata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_edata(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " edata ", size_t * " edatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .IP "char ** edata" 12 output array with newly allocated error data. .IP "size_t * edatalen" 12 output length of error data. .SH "DESCRIPTION" Extract additional error data from server (possibly empty). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_req_der.30000644000000000000000000000234412126773115014757 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_req_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_req_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_req_der(Shishi_as * " as ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of AS\-REQ. .IP "size_t * outlen" 12 length of output array with DER encoding of AS\-REQ. .SH "DESCRIPTION" DER encode AS\-REQ. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_ticket.30000644000000000000000000000230512126773121015627 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_ticket(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of Ticket and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_error.30000644000000000000000000000214112126773136014002 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_error" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_error \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_error(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Extract detailed error information string. Note that the memory is managed by the Shishi library, so you must not deallocate the string. .SH "RETURN VALUE" Returns pointer to error information string, that must not be deallocate by caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_copy_nonce.30000644000000000000000000000223112126773141015622 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_copy_nonce" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_copy_nonce \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_copy_nonce(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_asn1 " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to read nonce from. .IP "Shishi_asn1 enckdcreppart" 12 EncKDCRepPart to set nonce in. .SH "DESCRIPTION" Set nonce in EncKDCRepPart to value in KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_key_set.30000644000000000000000000000234012126773134017220 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_key_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_key_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_key_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "Shishi_key * key" 12 key handle with information to store in enckdcreppart. .SH "DESCRIPTION" Set the EncKDCRepPart.key field to key type and value of supplied key. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_to_file.30000644000000000000000000000252512126773124017227 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_to_file(Shishi * " handle ", Shishi_asn1 " authenticator ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write Authenticator to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_find_for_clientserver.30000644000000000000000000000243312126773177020302 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_find_for_clientserver" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_find_for_clientserver \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_find_for_clientserver(Shishi_tkts * " tkts ", const char * " client ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * client" 12 client name to find ticket for. .IP "const char * server" 12 server name to find ticket for. .SH "DESCRIPTION" Short\-hand function for searching the ticket set for a ticket for the given client and server. See \fBshishi_tkts_find()\fP. .SH "RETURN VALUE" Returns a ticket if found, or NULL. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_check_crealm.30000644000000000000000000000255212126773141015736 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_check_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_check_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_check_crealm(Shishi * " handle ", Shishi_asn1 " asreq ", Shishi_asn1 " asrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 asreq" 12 AS\-REQ to compare realm field in. .IP "Shishi_asn1 asrep" 12 AS\-REP to compare realm field in. .SH "DESCRIPTION" Verify that AS\-REQ.req\-body.realm and AS\-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS\-REQ and AS\-REP exchange, see \fBshishi_kdc_process()\fP. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_REALM_MISMATCH if the values differ, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_methoddata.30000644000000000000000000000232712126773121016462 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_methoddata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_methoddata \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_methoddata(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of METHOD\-DATA and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_principal.30000644000000000000000000000211012126773146015477 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_principal" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_principal \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_key_principal(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get the principal part of the key owner principal name, i.e., except the realm. .SH "RETURN VALUE" Returns the principal owning the key. (Not a copy of it, so don't modify or deallocate it.) .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_starttime_set.30000644000000000000000000000244512126773135020453 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_starttime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_starttime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_starttime_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", const char * " starttime ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "const char * starttime" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.starttime to supplied value. Use a NULL value for \fIstarttime\fP to remove the field. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_encapreppart.30000644000000000000000000000174712126773120016263 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_encapreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_encapreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_encapreppart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for AP\-REP. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_keylen.30000644000000000000000000000175212126773130015473 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_keylen" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_keylen \- API function .SH SYNOPSIS .B #include .sp .BI "size_t shishi_cipher_keylen(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Get key length for cipher. .SH "RETURN VALUE" Return length of key used for the encryption type, as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_client.30000644000000000000000000000266112126773153016045 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_client" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_client \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_client(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Return client principal name in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509key_default_file_set.30000644000000000000000000000246712126773160017455 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509key_default_file_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509key_default_file_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_x509key_default_file_set(Shishi * " handle ", const char * " x509keyfile ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * x509keyfile" 12 string with new default x509 client key file name, or NULL to reset to default. .SH "DESCRIPTION" Set the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_crealm_set.30000644000000000000000000000223512126773142016320 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_crealm_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_crealm_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_crealm_set(Shishi * " handle ", Shishi_asn1 " kdcrep ", const char * " crealm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 Kdcrep variable to set realm field in. .IP "const char * crealm" 12 input array with name of realm. .SH "DESCRIPTION" Set the client realm field in the KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_realm_set.30000644000000000000000000000221112126773170016163 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_realm_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_realm_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_realm_set(Shishi * " handle ", Shishi_asn1 " ticket ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 input variable with ticket info. .IP "const char * realm" 12 input array with name of realm. .SH "DESCRIPTION" Set the realm field in the Ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_parse.30000644000000000000000000000224712126773142015317 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " kdcrep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * kdcrep" 12 output variable with newly allocated KDC\-REP. .SH "DESCRIPTION" Read ASCII armored DER encoded KDC\-REP from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_read_optional.30000644000000000000000000000325012126773117016414 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_read_optional" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_read_optional \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asn1_read_optional(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", char ** " data ", size_t * " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 variable to read field from. .IP "const char * field" 12 name of field in \fInode\fP to read. .IP "char ** data" 12 newly allocated output buffer that will hold ASN.1 field data. .IP "size_t * datalen" 12 actual size of output buffer. .SH "DESCRIPTION" Extract data stored in a ASN.1 field into a newly allocated buffer. If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this function set datalen to 0 and succeeds. Can be useful to read ASN.1 fields which are marked OPTIONAL in the grammar, if you want to avoid special error handling in your code. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_copy_cname.30000644000000000000000000000223112126773141015603 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_copy_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_copy_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_copy_cname(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_asn1 " encticketpart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REQ to read cname from. .IP "Shishi_asn1 encticketpart" 12 EncTicketPart to set cname in. .SH "DESCRIPTION" Set cname in KDC\-REP to value in EncTicketPart. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_option2string.30000644000000000000000000000233712126773112016153 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_option2string" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_option2string \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_ap_option2string(Shishi_apoptions " option ");" .SH ARGUMENTS .IP "Shishi_apoptions option" 12 enumerated AP\-Option type, see Shishi_apoptions. .SH "DESCRIPTION" Convert AP\-Option type to AP\-Option name string. Note that \fIoption\fP must be just one of the AP\-Option types, it cannot be an binary ORed indicating several AP\-Options. .SH "RETURN VALUE" Returns static string with name of AP\-Option that must not be deallocated, or "unknown" if AP\-Option was not understood. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_from_base64.30000644000000000000000000000267012126773150015633 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_from_base64" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_from_base64 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_from_base64(Shishi * " handle ", int32_t " type ", const char * " value ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "const char * value" 12 input string with base64 encoded key value, or NULL. .IP "Shishi_key ** key" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful. .SH "RETURN VALUE" Returns SHISHI_INVALID_KEY if the base64 encoded key length doesn't match the key type, and SHISHI_OK on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_crypto_encrypt.30000644000000000000000000000311012126773130015724 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_crypto_encrypt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_crypto_encrypt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_crypto_encrypt(Shishi_crypto * " ctx ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_crypto * ctx" 12 crypto context as returned by \fBshishi_crypto()\fP. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call. When the application no longer need to use the context, it should deallocate resources associated with it by calling \fBshishi_crypto_close()\fP. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_randomlen.30000644000000000000000000000207612126773130016163 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_randomlen" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_randomlen \- API function .SH SYNOPSIS .B #include .sp .BI "size_t shishi_cipher_randomlen(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Get length of random data for cipher. .SH "RETURN VALUE" Return length of random used for the encryption type, as defined in the standards, or (size_t)\-1 on error (e.g., unsupported encryption type). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_use_session_key_p.30000644000000000000000000000217012126773114017565 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_use_session_key_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_use_session_key_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_use_session_key_p(Shishi * " handle ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ as allocated by \fBshishi_apreq()\fP. .SH "DESCRIPTION" Return non\-0 iff the "Use session key" option is set in the AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_kdcrep.30000644000000000000000000000230712126773122015617 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_kdcrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_kdcrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_kdcrep(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of KDC\-REP and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_default_file_set.30000644000000000000000000000233412126773137020105 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_default_file_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_default_file_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_hostkeys_default_file_set(Shishi * " handle ", const char * " hostkeysfile ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * hostkeysfile" 12 string with new default hostkeys file name, or NULL to reset to default. .SH "DESCRIPTION" Set the default host key filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_read.30000644000000000000000000000221712126773113014752 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " aprep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * aprep" 12 output variable with newly allocated AP\-REP. .SH "DESCRIPTION" Read DER encoded AP\-REP from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_set_enc_part.30000644000000000000000000000322112126773142016644 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_set_enc_part" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_set_enc_part \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_set_enc_part(Shishi * " handle ", Shishi_asn1 " kdcrep ", int32_t " etype ", uint32_t " kvno ", const char * " buf ", size_t " buflen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to add enc\-part field to. .IP "int32_t etype" 12 encryption type used to encrypt enc\-part. .IP "uint32_t kvno" 12 key version number. .IP "const char * buf" 12 input array with encrypted enc\-part. .IP "size_t buflen" 12 size of input array with encrypted enc\-part. .SH "DESCRIPTION" Set the encrypted enc\-part field in the KDC\-REP. The encrypted data is usually created by calling \fBshishi_encrypt()\fP on the DER encoded enc\-part. To save time, you may want to use \fBshishi_kdcrep_add_enc_part()\fP instead, which calculates the encrypted data and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_set_subkey.30000644000000000000000000000331112126773126017757 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_set_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_set_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_set_subkey(Shishi * " handle ", Shishi_asn1 " authenticator ", int32_t " subkeytype ", const char * " subkey ", size_t " subkeylen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int32_t subkeytype" 12 input subkey type to store in authenticator. .IP "const char * subkey" 12 input subkey data to store in authenticator. .IP "size_t subkeylen" 12 size of input subkey data to store in authenticator. .SH "DESCRIPTION" Store subkey value in authenticator. A subkey is usually created by calling \fBshishi_key_random()\fP using the default encryption type of the key from the ticket that is being used. To save time, you may want to use \fBshishi_authenticator_add_subkey()\fP instead, which calculates the subkey and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_authorizationtype_set.30000644000000000000000000000233512126773127020152 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_authorizationtype_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_authorizationtype_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg_authorizationtype_set(Shishi * " handle ", char * " value ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "char * value" 12 string with authorization types. .SH "DESCRIPTION" Set the "authorization\-types" configuration option from given string. The string contains authorization types (integer or names) separated by comma or whitespace, e.g. "basic k5login". .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_strerror.30000644000000000000000000000210712126773136014535 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_strerror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_strerror \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_strerror(int " err ");" .SH ARGUMENTS .IP "int err" 12 shishi error code. .SH "DESCRIPTION" Convert return code to human readable string. .SH "RETURN VALUE" Returns a pointer to a statically allocated string containing a description of the error with the error value \fIerr\fP. This string can be used to output a diagnostic message to the user. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_realm.30000644000000000000000000000221612126773172014636 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_realm(Shishi_tkt * " tkt ", char ** " realm ", size_t * " realmlen ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "char ** realm" 12 pointer to newly allocated character array with realm name. .IP "size_t * realmlen" 12 length of newly allocated character array with realm name. .SH "DESCRIPTION" Extract realm of server in ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_sname_set.30000644000000000000000000000252012126773135017534 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_sname_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_sname_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_sname_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", Shishi_name_type " name_type ", char * [] " sname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 EncKDCRepPart variable to set server name field in. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "char * [] sname" 12 input array with principal name. .SH "DESCRIPTION" Set the server name field in the EncKDCRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_save.30000644000000000000000000000211112126773162014643 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " priv ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 priv" 12 PRIV to save. .SH "DESCRIPTION" Save DER encoding of PRIV to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_client.30000644000000000000000000000317112126773144015463 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_client" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_client \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_client(Shishi * " handle ", Shishi_asn1 " kdcreq ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get client name from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Represent client principal name in KDC\-REQ as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_clientrealm.30000644000000000000000000000332212126773125020102 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_clientrealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_clientrealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_clientrealm(Shishi * " handle ", Shishi_asn1 " authenticator ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator variable to get client name and realm from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name and realm. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Convert cname and realm fields from Authenticator to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_blocksize.30000644000000000000000000000174412126773130016172 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_blocksize" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_blocksize \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cipher_blocksize(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Get block size for cipher. .SH "RETURN VALUE" Return block size for encryption type, as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_add_padata_tgs.30000644000000000000000000000252012126773146017123 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_add_padata_tgs" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_add_padata_tgs \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_add_padata_tgs(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to add PA\-DATA to. .IP "Shishi_asn1 apreq" 12 AP\-REQ to add as PA\-DATA. .SH "DESCRIPTION" Add TGS pre\-authentication data to KDC\-REQ. The data is an AP\-REQ that authenticates the request. This functions simply DER encodes the AP\-REQ and calls \fBshishi_kdcreq_add_padata()\fP with a SHISHI_PA_TGS_REQ padatatype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_padata.30000644000000000000000000000172612126773117015034 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_padata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_padata \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_padata(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for PA\-DATA. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_safe_der_set.30000644000000000000000000000230512126773164016275 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_safe_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_safe_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_safe_der_set(Shishi_safe * " safe ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "char * der" 12 input array with DER encoded KRB\-SAFE. .IP "size_t derlen" 12 length of input array with DER encoded KRB\-SAFE. .SH "DESCRIPTION" DER decode KRB\-SAFE and set it SAFE exchange. If decoding fails, the KRB\-SAFE in the SAFE exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_disable_transited_check_p.30000644000000000000000000000343312126773145021343 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_disable_transited_check_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_disable_transited_check_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_disable_transited_check_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option disable\-transited\-check flag is set. By default the KDC will check the transited field of a ticket\-granting\-ticket against the policy of the local realm before it will issue derivative tickets based on the ticket\-granting ticket. If this flag is set in the request, checking of the transited field is disabled. Tickets issued without the performance of this check will be noted by the reset (0) value of the TRANSITED\-POLICY\-CHECKED flag, indicating to the application server that the tranisted field must be checked locally. KDCs are encouraged but not required to honor the DISABLE\-TRANSITED\-CHECK option. This flag is new since RFC 1510 .SH "RETURN VALUE" Returns non\-0 iff disable\-transited\-check flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_remove.30000644000000000000000000000204312126773151015177 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_remove \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_keys_remove(Shishi_keys * " keys ", int " keyno ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .IP "int keyno" 12 key number of key in the set to remove. The first key is key number 0. .SH "DESCRIPTION" Remove a key, indexed by \fIkeyno\fP, in given key set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_print.30000644000000000000000000000215212126773123014725 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_print \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_asn1_print(Shishi * " handle ", Shishi_asn1 " node ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 data that have field to extract. .IP "FILE * fh" 12 file descriptor to print to, e.g. stdout. .SH "DESCRIPTION" Print ASN.1 structure in human readable form, typically for debugging purposes. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_get_key.30000644000000000000000000000237112126773134017210 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_get_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_get_key \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_get_key(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "Shishi_key ** key" 12 newly allocated encryption key handle. .SH "DESCRIPTION" Extract the key to use with the ticket sent in the KDC\-REP associated with the EncKDCRepPart input variable. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_transited_policy_checked_p.30000644000000000000000000000466012126773173021105 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_transited_policy_checked_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_transited_policy_checked_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_transited_policy_checked_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket has been policy checked for transit. The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm\-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list. While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross\-realm authentication. When the KDC applies such checks and accepts such cross\-realm authentication it will set the TRANSITED\-POLICY\-CHECKED flag in the service tickets it issues based on the cross\-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE\-TRANSITED\-CHECK flag. KDCs are encouraged but not required to honor this flag. Application servers MUST either do the transited\-realm checks themselves, or reject cross\-realm tickets without TRANSITED\-POLICY\- CHECKED set. .SH "RETURN VALUE" Returns non\-0 iff transited\-policy\-checked flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_from_string.30000644000000000000000000000337712126773150016062 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_from_string" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_from_string \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_from_string(Shishi * " handle ", int32_t " type ", const char * " password ", size_t " passwordlen ", const char * " salt ", size_t " saltlen ", const char * " parameter ", Shishi_key ** " outkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "const char * password" 12 input array containing password. .IP "size_t passwordlen" 12 length of input array containing password. .IP "const char * salt" 12 input array containing salt. .IP "size_t saltlen" 12 length of input array containing salt. .IP "const char * parameter" 12 input array with opaque encryption type specific information. .IP "Shishi_key ** outkey" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure, and set the key type and key value using \fBshishi_string_to_key()\fP. KEY contains a newly allocated structure only if this function is successful. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get_for_server.30000644000000000000000000000226212126773200016725 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get_for_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get_for_server \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get_for_server(Shishi_tkts * " tkts ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * server" 12 server name to get ticket for. .SH "DESCRIPTION" Short\-hand function for getting a ticket to the given server and for the default principal client. See \fBshishi_tkts_get()\fP. .SH "RETURN VALUE" Returns a ticket if found, or NULL. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_parse.30000644000000000000000000000222512126773165014766 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " safe ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * safe" 12 output variable with newly allocated SAFE. .SH "DESCRIPTION" Read ASCII armored DER encoded SAFE from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_sname_set.30000644000000000000000000000243712126773170016200 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_sname_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_sname_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_sname_set(Shishi * " handle ", Shishi_asn1 " ticket ", Shishi_name_type " name_type ", char * [] " sname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 Ticket variable to set server name field in. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "char * [] sname" 12 input array with principal name. .SH "DESCRIPTION" Set the server name field in the Ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_save.30000644000000000000000000000211112126773165014604 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " safe ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 safe" 12 SAFE to save. .SH "DESCRIPTION" Save DER encoding of SAFE to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_userdirectory_file.30000644000000000000000000000243612126773127017401 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_userdirectory_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_userdirectory_file \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_cfg_userdirectory_file(Shishi * " handle ", const char * " file ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * file" 12 basename of file to find in user directory. .SH "DESCRIPTION" Get the full path to specified \fIfile\fP in the users' configuration directory. .SH "RETURN VALUE" Return full path to given relative filename, relative to the user specific Shishi configuration directory as returned by \fBshishi_cfg_default_userdirectory()\fP (typically $HOME/.shishi). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_read.30000644000000000000000000000207212126773176014640 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_read(Shishi_tkts * " tkts ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "FILE * fh" 12 file descriptor to read from. .SH "DESCRIPTION" Read tickets from file descriptor and add them to the ticket set. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_realm.30000644000000000000000000000237212126773153015666 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_realm(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " realm ", size_t * " realmlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "char ** realm" 12 output array with newly allocated name of realm in KRB\-ERROR. .IP "size_t * realmlen" 12 size of output array. .SH "DESCRIPTION" Extract (server) realm from KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_user_data.30000644000000000000000000000255212126773165015626 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_user_data" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_user_data \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_user_data(Shishi * " handle ", Shishi_asn1 " safe ", char ** " userdata ", size_t * " userdatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "char ** userdata" 12 output array with newly allocated user data from KRB\-SAFE. .IP "size_t * userdatalen" 12 output size of output user data buffer. .SH "DESCRIPTION" Read user data value from KRB\-SAFE. \fIuserdata\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_name.30000644000000000000000000000335212126773161015635 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_name \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_principal_name(Shishi * " handle ", Shishi_asn1 " namenode ", const char * " namefield ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "Shishi_asn1 namenode" 12 ASN.1 structure with principal in \fInamefield\fP. .IP "const char * namefield" 12 name of field in \fInamenode\fP containing principal name. .IP "char ** out" 12 pointer to newly allocated, null terminated, string containing principal name. May be \fBNULL\fP (to only populate \fIoutlen\fP). .IP "size_t * outlen" 12 pointer to length of \fIout\fP on output, excluding terminating null. May be \fBNULL\fP (to only populate \fIout\fP). .SH "DESCRIPTION" Represent principal name in ASN.1 structure as null\-terminated string. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIoutlen\fP does not include the terminating null. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_safe_der.30000644000000000000000000000247512126773164015432 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_safe_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_safe_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_safe_der(Shishi_safe * " safe ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "char ** out" 12 output array with newly allocated DER encoding of SAFE. .IP "size_t * outlen" 12 length of output array with DER encoding of SAFE. .SH "DESCRIPTION" DER encode SAFE structure. Typically \fBshishi_safe_build()\fP is used to build the SAFE structure first. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_priv_set.30000644000000000000000000000201512126773162015543 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_priv_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_priv_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_priv_priv_set(Shishi_priv * " priv ", Shishi_asn1 " asn1priv ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .IP "Shishi_asn1 asn1priv" 12 KRB\-PRIV to store in PRIV exchange. .SH "DESCRIPTION" Set the KRB\-PRIV in the PRIV exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt_ivupdate_etype.30000644000000000000000000000526412126773132017437 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt_ivupdate_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt_ivupdate_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt_ivupdate_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " iv ", size_t " ivlen ", char ** " ivout ", size_t * " ivoutlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "char ** ivout" 12 output array with newly allocated updated initialization vector. .IP "size_t * ivoutlen" 12 size of output array with updated initialization vector. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_renewable_p.30000644000000000000000000000271412126773145016473 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_renewable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_renewable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_renewable_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option renewable flag is set. The RENEWABLE option indicates that the ticket to be issued is to have its RENEWABLE flag set. It may only be set on the initial request, or when the ticket\-granting ticket on which the request is based is also renewable. If this option is requested, then the rtime field in the request contains the desired absolute expiration time for the ticket. .SH "RETURN VALUE" Returns non\-0 iff renewable flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_done.30000644000000000000000000000163012126773150014444 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_done(Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 pointer to structure that holds key information. .SH "DESCRIPTION" Deallocates key information structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_etext.30000644000000000000000000000237012126773155015717 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_etext" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_etext \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_etext(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " etext ", size_t * " etextlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .IP "char ** etext" 12 output array with newly allocated error text. .IP "size_t * etextlen" 12 output length of error text. .SH "DESCRIPTION" Extract additional error text from server (possibly empty). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_expired_p.30000644000000000000000000000174412126773174015524 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_expired_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_expired_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_expired_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket has expired (i.e., endtime is in the past). .SH "RETURN VALUE" Returns 0 iff ticket has expired. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_ccache_guess.30000644000000000000000000000235012126773175020043 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_ccache_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_ccache_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_tkts_default_ccache_guess(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Guesses the default ccache ticket filename; it is the contents of the environment variable KRB5CCNAME or /tmp/krb5cc_UID where UID is the user's identity in decimal, as returned by \fBgetuid()\fP. .SH "RETURN VALUE" Returns default ccache filename as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_cname_set.30000644000000000000000000000251012126773135017526 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_cname_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_cname_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_cname_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", Shishi_name_type " name_type ", const char * " principal ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "Shishi_name_type name_type" 12 type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. .IP "const char * principal" 12 input array with principal name. .SH "DESCRIPTION" Set the client name field in the EncTicketPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_done.30000644000000000000000000000202612126773161014636 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_priv_done(Shishi_priv * " priv ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .SH "DESCRIPTION" Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_ctime.30000644000000000000000000000213412126773154017241 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_ctime(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove client time field in Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_enc_part_etype.30000644000000000000000000000221112126773163016710 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_enc_part_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_enc_part_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_enc_part_etype(Shishi * " handle ", Shishi_asn1 " priv ", int32_t * " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 priv" 12 PRIV variable to get value from. .IP "int32_t * etype" 12 output variable that holds the value. .SH "DESCRIPTION" Extract PRIV.enc\-part.etype. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_value_set.30000644000000000000000000000222312126773147015513 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_value_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_value_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_value_set(Shishi_key * " key ", const char * " value ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "const char * value" 12 input array with key data. .SH "DESCRIPTION" Set the key value and length in key structure. The value is copied into the key (in other words, you can deallocate \fIvalue\fP right after calling this function without modifying the value inside the key). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_process_keyusage.30000644000000000000000000000275712126773111017561 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_process_keyusage" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_process_keyusage \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_process_keyusage(Shishi_ap * " ap ", Shishi_key * " key ", int32_t " keyusage ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_key * key" 12 cryptographic key used to decrypt ticket in AP\-REQ. .IP "int32_t keyusage" 12 key usage to use during decryption, for normal AP\-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP\-REQ's part of TGS\-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR. .SH "DESCRIPTION" Decrypt ticket in AP\-REQ using supplied key and decrypt Authenticator in AP\-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_principal_remove.30000644000000000000000000000247112126773201016026 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_principal_remove" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_principal_remove \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_principal_remove(Shisa * " dbh ", const char * " realm ", const char * " principal ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to remove, may be \fBNULL\fP to indicate that the \fIrealm\fP itself should be removed (requires that the realm to be empty). .SH "DESCRIPTION" Remove all information stored in the database for given PRINCIPAL\fIREALM\fP. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP if successful, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ctime.30000644000000000000000000000246012126773137013757 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ctime(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", time_t * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 variable to read field from. .IP "const char * field" 12 name of field in \fInode\fP to read. .IP "time_t * t" 12 pointer to time field to set. .SH "DESCRIPTION" Extract time from ASN.1 structure. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_cfg_db.30000644000000000000000000000252412126773200013672 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_cfg_db" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_cfg_db \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_cfg_db(Shisa * " dbh ", const char * " value ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * value" 12 string with database definition. .SH "DESCRIPTION" Setup and open a new database. The syntax of the \fIvalue\fP parameter is "TYPE[ LOCATION[ PARAMETER]]", where TYPE is one of the supported database types (e.g., "file") and LOCATION and PARAMETER are optional strings passed to the database during initialization. Neither TYPE nor LOCATION can contain " " (SPC), but PARAMETER may. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP if database was parsed and open successfully. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_server_for_local_service.30000644000000000000000000000250312126773161017717 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_server_for_local_service" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_server_for_local_service \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_server_for_local_service(Shishi * " handle ", const char * " service ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * service" 12 null terminated string with name of service, e.g., "host". .SH "DESCRIPTION" Construct a service principal (e.g., "imap/yxa.extuno.com") based on supplied service name (i.e., "imap") and the system's hostname as returned by \fBhostname()\fP (i.e., "yxa.extundo.com"). The string must be deallocated by the caller. .SH "RETURN VALUE" Return newly allocated service name string. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_to_file.30000644000000000000000000000244112126773113015457 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_to_file(Shishi * " handle ", Shishi_asn1 " aprep ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 aprep" 12 AP\-REP to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write AP\-REP to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_enc_tkt_in_skey_p.30000644000000000000000000000256312126773145017701 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_enc_tkt_in_skey_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_enc_tkt_in_skey_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_enc_tkt_in_skey_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option enc\-tkt\-in\-skey flag is set. This option is used only by the ticket\-granting service. The ENC\-TKT\-IN\-SKEY option indicates that the ticket for the end server is to be encrypted in the session key from the additional ticket\-granting ticket provided. .SH "RETURN VALUE" Returns non\-0 iff enc\-tkt\-in\-skey flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_crealm.30000644000000000000000000000225612126773153016705 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_crealm(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " crealm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * crealm" 12 input array with realm. .SH "DESCRIPTION" Set realm field in krberror to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req.30000644000000000000000000000202112126773166014315 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tgs_req(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get the TGS\-REQ from TGS exchange. .SH "RETURN VALUE" Returns the generated TGS\-REQ from the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_set.30000644000000000000000000000203512126773110017050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_authenticator_set(Shishi_ap * " ap ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 authenticator" 12 authenticator to store in AP. .SH "DESCRIPTION" Set the Authenticator in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_confoundersize.30000644000000000000000000000213112126773130017231 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_confoundersize" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_confoundersize \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cipher_confoundersize(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Get length of confounder for cipher. .SH "RETURN VALUE" Returns the size of the confounder (random data) for encryption type, as defined in the standards, or (size_t)\-1 on error (e.g., unsupported encryption type). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_verify.30000644000000000000000000000322112126773131014150 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_verify" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_verify \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_verify(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int " cksumtype ", const char * " in ", size_t " inlen ", const char * " cksum ", size_t " cksumlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to verify checksum with. .IP "int keyusage" 12 integer specifying what this key is used for. .IP "int cksumtype" 12 the checksum algorithm to use. .IP "const char * in" 12 input array with data that was integrity protected. .IP "size_t inlen" 12 size of input array with data that was integrity protected. .IP "const char * cksum" 12 input array with alleged checksum of data. .IP "size_t cksumlen" 12 size of input array with alleged checksum of data. .SH "DESCRIPTION" Verify checksum of data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_pretty_print.30000644000000000000000000000177312126773175016313 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_pretty_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_pretty_print \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_pretty_print(Shishi_tkt * " tkt ", FILE * " fh ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "FILE * fh" 12 file handle open for writing. .SH "DESCRIPTION" Print a human readable representation of a ticket to file handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_authctime.30000644000000000000000000000213312126773174015521 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_authctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_authctime \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_tkt_authctime(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket. .SH "RETURN VALUE" Returns C time interpretation of the endtime in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_set_ticket.30000644000000000000000000000222512126773142016337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_set_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_set_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_set_ticket(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_asn1 " ticket ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to add ticket field to. .IP "Shishi_asn1 ticket" 12 input ticket to copy into KDC\-REP ticket field. .SH "DESCRIPTION" Copy ticket into KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_msgtype.30000644000000000000000000000226712126773121015266 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_msgtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_msgtype \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_msgtype shishi_asn1_msgtype(Shishi * " handle ", Shishi_asn1 " node ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 type to get msg type for. .SH "DESCRIPTION" Determine msg\-type of ASN.1 type of a packet. Currently this uses the msg\-type field instead of the APPLICATION tag, but this may be changed in the future. .SH "RETURN VALUE" Returns msg\-type of ASN.1 type, 0 on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_set_realm.30000644000000000000000000000222312126773144016155 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_set_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_set_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_set_realm(Shishi * " handle ", Shishi_asn1 " kdcreq ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to set realm field in. .IP "const char * realm" 12 input array with name of realm. .SH "DESCRIPTION" Set the realm field in the KDC\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_warn.30000644000000000000000000000203412126773137013622 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_warn" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_warn \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_warn(Shishi * " handle ", const char * " format ", " ... ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * format" 12 printf style format string. @...: print style arguments. .IP " ..." 12 .SH "DESCRIPTION" Print a warning to output as defined in handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_keytype_p.30000644000000000000000000000216612126773174015555 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_keytype_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_keytype_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_keytype_p(Shishi_tkt * " tkt ", int32_t " etype ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "int32_t etype" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type). .SH "RETURN VALUE" Returns non\-0 iff key in ticket is of specified encryption type. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_cksum.30000644000000000000000000000263512126773165015003 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_cksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_cksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_cksum(Shishi * " handle ", Shishi_asn1 " safe ", int32_t * " cksumtype ", char ** " cksum ", size_t * " cksumlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 safe" 12 safe as allocated by \fBshishi_safe()\fP. .IP "int32_t * cksumtype" 12 output checksum type. .IP "char ** cksum" 12 output array with newly allocated checksum data from SAFE. .IP "size_t * cksumlen" 12 output size of output checksum data buffer. .SH "DESCRIPTION" Read checksum value from KRB\-SAFE. \fIcksum\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hostkeys_for_localservicerealm.30000644000000000000000000000271112126773140021142 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hostkeys_for_localservicerealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hostkeys_for_localservicerealm \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_hostkeys_for_localservicerealm(Shishi * " handle ", const char * " service ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * service" 12 service to get key for. .IP "const char * realm" 12 realm of server to get key for, or NULL for default realm. .SH "DESCRIPTION" Get host key for \fIservice\fP on current host in \fIrealm\fP. .SH "RETURN VALUE" Returns the key for the server "SERVICE/HOSTNAME\fIREALM\fP" (where HOSTNAME is the current system's hostname), read from the default host keys file (see \fBshishi_hostkeys_default_file()\fP), or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_clear_authorizationdata.30000644000000000000000000000226312126773125022506 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_clear_authorizationdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_clear_authorizationdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_clear_authorizationdata(Shishi * " handle ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator as allocated by \fBshishi_authenticator()\fP. .SH "DESCRIPTION" Remove the authorization\-data field from Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_file.30000644000000000000000000000210712126773175016346 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_file \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_tkts_default_file(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename of default ticket set. .SH "RETURN VALUE" Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_realm.30000644000000000000000000000205512126773147014627 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_realm \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_key_realm(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get the realm part of the key owner principal name. .SH "RETURN VALUE" Returns the realm for the principal owning the key. (Not a copy of it, so don't modify or deallocate it.) .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_init.30000644000000000000000000000267712126773140013625 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_init" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_init \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_init(Shishi ** " handle ");" .SH ARGUMENTS .IP "Shishi ** handle" 12 pointer to handle to be created. .SH "DESCRIPTION" Create a Shishi library handle, using \fBshishi()\fP, and read the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_checksum_parse.30000644000000000000000000000202412126773131015640 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_checksum_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_checksum_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_checksum_parse(const char * " checksum ");" .SH ARGUMENTS .IP "const char * checksum" 12 name of checksum type, e.g. "hmac\-sha1\-96\-aes256". .SH "DESCRIPTION" Get checksum number by parsing a string. .SH "RETURN VALUE" Return checksum type, see Shishi_cksumtype, corresponding to a string. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_sendrecv.30000644000000000000000000000206612126773167015351 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_sendrecv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_sendrecv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_sendrecv(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Send TGS\-REQ and receive TGS\-REP or KRB\-ERROR. This is the subsequent authentication, usually used to acquire server tickets. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_encprivpart_der_set.30000644000000000000000000000234212126773162017755 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_encprivpart_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_encprivpart_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_encprivpart_der_set(Shishi_priv * " priv ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "char * der" 12 input array with DER encoded ENCPRIVPART. .IP "size_t derlen" 12 length of input array with DER encoded ENCPRIVPART. .SH "DESCRIPTION" DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_asrep.30000644000000000000000000000230312126773122015455 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_asrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_asrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_asrep(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of AS\-REP and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_krberror_set.30000644000000000000000000000177412126773116016050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_krberror_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_krberror_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_as_krberror_set(Shishi_as * " as ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_asn1 krberror" 12 krberror to store in AS. .SH "DESCRIPTION" Set the KRB\-ERROR in the AS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_sendrecv_hint.30000644000000000000000000000243512126773116016173 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_sendrecv_hint" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_sendrecv_hint \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_sendrecv_hint(Shishi_as * " as ", Shishi_tkts_hint * " hint ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_tkts_hint * hint" 12 additional parameters that modify connection behaviour, or \fBNULL\fP. .SH "DESCRIPTION" Send AS\-REQ and receive AS\-REP or KRB\-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The \fIhint\fP structure can be used to set, e.g., parameters for TLS authentication. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_krbsafe.30000644000000000000000000000231312126773123015762 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_krbsafe" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_krbsafe \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_krbsafe(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of KRB\-SAFE and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_asreq.30000644000000000000000000000230312126773122015456 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_asreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_asreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_asreq(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of AS\-REQ and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_default.30000644000000000000000000000231412126773160016335 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_default" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_default \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_principal_default(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .SH "DESCRIPTION" The default principal name is the name in the environment variable USER, or LOGNAME for some systems, but it can be overridden by specifying the environment variable SHISHI_USER. .SH "RETURN VALUE" Returns the default principal name used by the library. (Not a copy of it, so don't modify or deallocate it.) .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_forwardable_p.30000644000000000000000000000271312126773172016347 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_forwardable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_forwardable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_forwardable_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is forwardable. The FORWARDABLE flag in a ticket is normally only interpreted by the ticket\-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket\-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket\-granting ticket. .SH "RETURN VALUE" Returns non\-0 iff forwardable flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_set_cksum.30000644000000000000000000000330012126773125017574 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_set_cksum" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_set_cksum \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_set_cksum(Shishi * " handle ", Shishi_asn1 " authenticator ", int32_t " cksumtype ", char * " cksum ", size_t " cksumlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int32_t cksumtype" 12 input checksum type to store in authenticator. .IP "char * cksum" 12 input checksum data to store in authenticator. .IP "size_t cksumlen" 12 size of input checksum data to store in authenticator. .SH "DESCRIPTION" Store checksum value in authenticator. A checksum is usually created by calling \fBshishi_checksum()\fP on some application specific data using the key from the ticket that is being used. To save time, you may want to use \fBshishi_authenticator_add_cksum()\fP instead, which calculates the checksum and calls this function in one step. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_etype_info2.30000644000000000000000000000175112126773117016023 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_etype_info2" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_etype_info2 \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_etype_info2(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for ETYPE\-INFO2. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket.30000644000000000000000000000177212126773170014143 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_ticket(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new ASN.1 Ticket, populated with some default values. .SH "RETURN VALUE" Returns the ticket or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_cksumdata_set.30000644000000000000000000000276112126773110021112 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_cksumdata_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_cksumdata_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_authenticator_cksumdata_set(Shishi_ap * " ap ", const char * " authenticatorcksumdata ", size_t " authenticatorcksumdatalen ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "const char * authenticatorcksumdata" 12 input array with data to compute checksum on and store in Authenticator in AP\-REQ. .IP "size_t authenticatorcksumdatalen" 12 length of input array with data to compute checksum on and store in Authenticator in AP\-REQ. .SH "DESCRIPTION" Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_errorcode_message.30000644000000000000000000000226712126773156020264 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_errorcode_message" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_errorcode_message \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_krberror_errorcode_message(Shishi * " handle ", int " errorcode ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int errorcode" 12 integer KRB\-ERROR error code. .SH "DESCRIPTION" Get human readable string describing KRB\-ERROR code. .SH "RETURN VALUE" Return a string describing error code. This function will always return a string even if the error code isn't known. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_tgtkt.30000644000000000000000000000205512126773166014672 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_tgtkt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_tgtkt \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tgs_tgtkt(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get Ticket\-granting\-ticket from TGS exchange. .SH "RETURN VALUE" Returns the ticket\-granting\-ticket used in the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_time_copy.30000644000000000000000000000235212126773134017407 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_time_copy" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_time_copy \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_time_copy(Shishi * " handle ", Shishi_asn1 " encapreppart ", Shishi_asn1 " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator to copy time fields from. .SH "DESCRIPTION" Copy time fields from Authenticator into EncAPRepPart. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_sname.30000644000000000000000000000235612126773154017251 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_sname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_sname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_sname(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror to set server name field in. .SH "DESCRIPTION" Remove server name field in KRB\-ERROR. (Since it is not marked OPTIONAL in the ASN.1 profile, what is done is to set the name\-type to UNKNOWN and make sure the name\-string sequence is empty.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_for_serverrealm_in_file.30000644000000000000000000000265212126773151020572 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_for_serverrealm_in_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_for_serverrealm_in_file \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_keys_for_serverrealm_in_file(Shishi * " handle ", const char * " filename ", const char * " server ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * filename" 12 file to read keys from. .IP "const char * server" 12 server name to get key for. .IP "const char * realm" 12 realm of server to get key for. .SH "DESCRIPTION" Get keys that match specified \fIserver\fP and \fIrealm\fP from the key set file \fIfilename\fP. .SH "RETURN VALUE" Returns the key for specific server and realm, read from the indicated file, or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_aprep.30000644000000000000000000000230312126773123015453 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_aprep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_aprep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_aprep(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of AP\-REP and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_cusec_get.30000644000000000000000000000234512126773124017547 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_cusec_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_cusec_get \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_cusec_get(Shishi * " handle ", Shishi_asn1 " authenticator ", uint32_t * " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator as allocated by \fBshishi_authenticator()\fP. .IP "uint32_t * cusec" 12 output integer with client microseconds field. .SH "DESCRIPTION" Extract client microseconds field from Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_etype.30000644000000000000000000000226512126773107014464 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_etype(Shishi * " handle ", Shishi_ap ** " ap ", int " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_ap ** ap" 12 pointer to new structure that holds information about AP exchange .IP "int etype" 12 encryption type of newly generated random subkey. .SH "DESCRIPTION" Create a new AP exchange with a random subkey of indicated encryption type. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_client.30000644000000000000000000000324612126773125017066 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_client" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_client \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_client(Shishi * " handle ", Shishi_asn1 " authenticator ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator variable to get client name from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Represent client principal name in Authenticator as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_methoddata.30000644000000000000000000000174612126773117015716 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_methoddata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_methoddata \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_methoddata(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for METHOD\-DATA. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep_set.30000644000000000000000000000174112126773116015000 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_as_rep_set(Shishi_as * " as ", Shishi_asn1 " asrep ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "Shishi_asn1 asrep" 12 asrep to store in AS. .SH "DESCRIPTION" Set the AS\-REP in the AS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg.30000644000000000000000000000204212126773126013407 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cfg(Shishi * " handle ", const char * " option ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * option" 12 string with shishi library option. .SH "DESCRIPTION" Configure shishi library with given option. .SH "RETURN VALUE" Returns SHISHI_OK if option was valid. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_realm.30000644000000000000000000000313012126773144015300 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_realm(Shishi * " handle ", Shishi_asn1 " kdcreq ", char ** " realm ", size_t * " realmlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get client name from. .IP "char ** realm" 12 pointer to newly allocated zero terminated string containing realm. May be \fBNULL\fP (to only populate \fIrealmlen\fP). .IP "size_t * realmlen" 12 pointer to length of \fIrealm\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIrealmlen\fP). .SH "DESCRIPTION" Get realm field in KDC\-REQ as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIrealmlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_save.30000644000000000000000000000212412126773113014773 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 apreq" 12 AP\-REQ to save. .SH "DESCRIPTION" Save DER encoding of AP\-REQ to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_size.30000644000000000000000000000171412126773151014660 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_size" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_size \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_size(Shishi_keys * " keys ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .SH "DESCRIPTION" Get size of key set. .SH "RETURN VALUE" Returns number of keys stored in key set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_kdcrep.30000644000000000000000000000170712126773171015011 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_kdcrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_kdcrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tkt_kdcrep(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Get ASN.1 KDCRep structure from ticket. .SH "RETURN VALUE" Returns KDC\-REP information. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_resolv.30000644000000000000000000000222712126773164014171 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_resolv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_resolv \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_dns shishi_resolv(const char * " zone ", uint16_t " querytype ");" .SH ARGUMENTS .IP "const char * zone" 12 owner name of data, e.g. "EXAMPLE.ORG" .IP "uint16_t querytype" 12 type of data to query for, e.g., SHISHI_DNS_TXT. .SH "DESCRIPTION" Query DNS resolver for data of type \fIquerytype\fP at owner name \fIzone\fP. Currently TXT and SRV types are supported. .SH "RETURN VALUE" Returns linked list of DNS records, or NULL if query failed. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_cfg_from_file.30000644000000000000000000000206012126773200015242 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_cfg_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_cfg_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_cfg_from_file(Shisa * " dbh ", const char * " cfg ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * cfg" 12 filename to read configuration from. .SH "DESCRIPTION" Configure shisa library using configuration file. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_server.30000644000000000000000000000317112126773144015513 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_server(Shishi * " handle ", Shishi_asn1 " kdcreq ", char ** " server ", size_t * " serverlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get server name from. .IP "char ** server" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIserverlen\fP). .IP "size_t * serverlen" 12 pointer to length of \fIserver\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIserver\fP). .SH "DESCRIPTION" Represent server principal name in KDC\-REQ as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIserverlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_initial_p.30000644000000000000000000000260312126773173015507 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_initial_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_initial_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_initial_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket was issued using AS exchange. The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket\-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password\-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client. .SH "RETURN VALUE" Returns non\-0 iff initial flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_to_file.30000644000000000000000000000206712126773177015353 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_to_file(Shishi_tkts * " tkts ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * filename" 12 filename to write tickets to. .SH "DESCRIPTION" Write tickets in set to file. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_server.30000644000000000000000000000215312126773140014155 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_server \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi * shishi_server( " void ");" .SH ARGUMENTS .IP " void" 12 .SH "DESCRIPTION" Initializes the Shishi library, and set up, using \fBshishi_error_set_outputtype()\fP, the library so that future warnings and informational messages are printed to the syslog. If this function fails, it may print diagnostic errors to the syslog. .SH "RETURN VALUE" Returns Shishi library handle, or \fBNULL\fP on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi.30000644000000000000000000000211612126773140012566 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi * shishi( " void ");" .SH ARGUMENTS .IP " void" 12 .SH "DESCRIPTION" Initializes the Shishi library, and set up, using \fBshishi_error_set_outputtype()\fP, the library so that future warnings and informational messages are printed to stderr. If this function fails, it may print diagnostic errors to stderr. .SH "RETURN VALUE" Returns Shishi library handle, or \fBNULL\fP on error. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_derive_salt.30000644000000000000000000000302612126773140015633 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_derive_salt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_derive_salt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_derive_salt(Shishi * " handle ", Shishi_asn1 " asreq ", Shishi_asn1 " asrep ", char ** " salt ", size_t * " saltlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 asreq" 12 input AS\-REQ variable. .IP "Shishi_asn1 asrep" 12 input AS\-REP variable. .IP "char ** salt" 12 newly allocated output array with salt. .IP "size_t * saltlen" 12 holds actual size of output array with salt. .SH "DESCRIPTION" Derive the salt that should be used when deriving a key via \fBshishi_string_to_key()\fP for an AS exchange. Currently this searches for PA\-DATA of type SHISHI_PA_PW_SALT in the AS\-REP and returns it if found, otherwise the salt is derived from the client name and realm in AS\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default.30000644000000000000000000000175712126773176015362 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkts * shishi_tkts_default(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get the default ticket set for library handle. .SH "RETURN VALUE" Return the handle global ticket set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_from_file.30000644000000000000000000000242212126773165015615 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_safe_from_file(Shishi * " handle ", Shishi_asn1 * " safe ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * safe" 12 output variable with newly allocated SAFE. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read SAFE from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_clientrealm_p.30000644000000000000000000000215212126773172016353 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_clientrealm_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_clientrealm_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_clientrealm_p(Shishi_tkt * " tkt ", const char * " client ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "const char * client" 12 principal name (client name and realm) of ticket. .SH "DESCRIPTION" Determine if ticket is for specified client principal. .SH "RETURN VALUE" Returns non\-0 iff ticket is for specified client principal. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_keys_find.30000644000000000000000000000352112126773201014440 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_keys_find" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_keys_find \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_keys_find(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_key * " hint ", Shisa_key *** " keys ", size_t * " nkeys ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to add key for. .IP "const Shisa_key * hint" 12 Pointer to Shisa key structure with hints on matching the key to modify, may be \fBNULL\fP to match all keys. .IP "Shisa_key *** keys" 12 pointer to newly allocated array with Shisa key structures. .IP "size_t * nkeys" 12 pointer to number of newly allocated Shisa key structures in \fIkeys\fP. .SH "DESCRIPTION" Iterate through keys for given PRINCIPAL\fIREALM\fP and extract any keys that match \fIhint\fP. Not all elements of \fIhint\fP need to be filled out, only use the fields you are interested in. For example, if you want to extract all keys with an etype of 3 (DES\-CBC\-MD5), set the \fIkey\fP\->etype field to 3, and set all other fields to 0. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_set_realm.30000644000000000000000000000206612126773170015505 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_set_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_set_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_set_realm(Shishi_tgs * " tgs ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "const char * realm" 12 indicates the realm to acquire ticket for. .SH "DESCRIPTION" Set the server in the TGS\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_parse.30000644000000000000000000000224712126773143015321 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * kdcreq" 12 output variable with newly allocated KDC\-REQ. .SH "DESCRIPTION" Read ASCII armored DER encoded KDC\-REQ from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_generalize_ctime.30000644000000000000000000000206312126773137016163 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_generalize_ctime" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_generalize_ctime \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_generalize_ctime(Shishi * " handle ", const char * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * t" 12 KerberosTime to convert. .SH "DESCRIPTION" Convert KerberosTime to C time. .SH "RETURN VALUE" Returns C time corresponding to KerberosTime t. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ticket_realm_get.30000644000000000000000000000233212126773170016153 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ticket_realm_get" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ticket_realm_get \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ticket_realm_get(Shishi * " handle ", Shishi_asn1 " ticket ", char ** " realm ", size_t * " realmlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 ticket" 12 input variable with ticket info. .IP "char ** realm" 12 output array with newly allocated name of realm in ticket. .IP "size_t * realmlen" 12 size of output array. .SH "DESCRIPTION" Extract realm from ticket. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_prompt_password_callback_set.30000644000000000000000000000313512126773157020612 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_prompt_password_callback_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_prompt_password_callback_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_prompt_password_callback_set(Shishi * " handle ", shishi_prompt_password_func " cb ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "shishi_prompt_password_func cb" 12 function pointer to application password callback, a \fBshishi_prompt_password_func\fP type. .SH "DESCRIPTION" Set a callback function that will be used by \fBshishi_prompt_password()\fP to query the user for a password. The function pointer can be retrieved using \fBshishi_prompt_password_callback_get()\fP. The \fIcb\fP function should follow the \fBshishi_prompt_password_func\fP prototype: int prompt_password (Shishi * \fIhandle\fP, char **\fIs\fP, const char *\fIformat\fP, va_list \fIap\fP); If the function returns 0, the \fIs\fP variable should contain a newly allocated string with the password read from the user. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_safe_set.30000644000000000000000000000201512126773164015441 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_safe_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_safe_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_safe_safe_set(Shishi_safe * " safe ", Shishi_asn1 " asn1safe ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 structure that holds information about SAFE exchange .IP "Shishi_asn1 asn1safe" 12 KRB\-SAFE to store in SAFE exchange. .SH "DESCRIPTION" Set the KRB\-SAFE in the SAFE exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_subkey.30000644000000000000000000000231412126773126017716 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_subkey" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_subkey \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_subkey(Shishi * " handle ", Shishi_asn1 " authenticator ", Shishi_key * " subkey ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "Shishi_key * subkey" 12 subkey to add to authenticator. .SH "DESCRIPTION" Store subkey in the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt_ivupdate.30000644000000000000000000000507112126773132016225 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt_ivupdate" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt_ivupdate \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt_ivupdate(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", const char * " iv ", size_t " ivlen ", char ** " ivout ", size_t * " ivoutlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "char ** ivout" 12 output array with newly allocated updated initialization vector. .IP "size_t * ivoutlen" 12 size of output array with updated initialization vector. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_encasreppart.30000644000000000000000000000233512126773122017037 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_encasreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_encasreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_encasreppart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncASRepPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_ok_as_delegate_p.30000644000000000000000000000327212126773173017007 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_ok_as_delegate_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_ok_as_delegate_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_ok_as_delegate_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is ok as delegated ticket. The copy of the ticket flags in the encrypted part of the KDC reply may have the OK\-AS\-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket\- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials. .SH "RETURN VALUE" Returns non\-0 iff ok\-as\-delegate flag is set in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_enckdcreppart_set.30000644000000000000000000000204712126773171017237 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_enckdcreppart_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_enckdcreppart_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkt_enckdcreppart_set(Shishi_tkt * " tkt ", Shishi_asn1 " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 structure that holds information about Ticket exchange .IP "Shishi_asn1 enckdcreppart" 12 EncKDCRepPart to store in Ticket. .SH "DESCRIPTION" Set the EncKDCRepPart in the Ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_read.30000644000000000000000000000227412126773133016334 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " encapreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * encapreppart" 12 output variable with newly allocated EncAPRepPart. .SH "DESCRIPTION" Read DER encoded EncAPRepPart from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_init.30000644000000000000000000000245212126773202013433 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_init" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_init \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_init(Shisa ** " dbh ");" .SH ARGUMENTS .IP "Shisa ** dbh" 12 pointer to library handle to be created. .SH "DESCRIPTION" Create a Shisa library handle, using \fBshisa()\fP, and read the system configuration file from their default locations. The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf). The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_add_random_subkey_etype.30000644000000000000000000000243712126773126022472 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_add_random_subkey_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_add_random_subkey_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_add_random_subkey_etype(Shishi * " handle ", Shishi_asn1 " authenticator ", int " etype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 authenticator as allocated by \fBshishi_authenticator()\fP. .IP "int etype" 12 encryption type of random key to generate. .SH "DESCRIPTION" Generate random subkey of indicated encryption type, and store it in the authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_add_ccache_mem.30000644000000000000000000000310312126773175016574 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_add_ccache_mem" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_add_ccache_mem \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_add_ccache_mem(Shishi * " handle ", const char * " data ", size_t " len ", Shishi_tkts * " tkts ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * data" 12 constant memory buffer with ccache of \fIlen\fP size. .IP "size_t len" 12 size of memory buffer with ccache data. .IP "Shishi_tkts * tkts" 12 allocated key set to store tickets in. .SH "DESCRIPTION" Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. .SH "RETURNS" Returns \fBSHISHI_CCACHE_ERROR\fP if the data does not represent a valid ccache structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_type_set.30000644000000000000000000000172312126773147015364 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_type_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_type_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_key_type_set(Shishi_key * " key ", int32_t " type ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .IP "int32_t type" 12 type to set in key. .SH "DESCRIPTION" Set the type of key in key structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgsreq.30000644000000000000000000000177012126773143014163 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgsreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgsreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tgsreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" This function creates a new TGS\-REQ, populated with some default values. .SH "RETURN VALUE" Returns the TGS\-REQ or NULL on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_krberror.30000644000000000000000000000173612126773120015425 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_krberror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_krberror \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_krberror(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for KRB\-ERROR. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509ca_default_file_guess.30000644000000000000000000000220712126773157017601 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509ca_default_file_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509ca_default_file_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_x509ca_default_file_guess(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Guesses the default X.509 CA certificate filename; it is $HOME/.shishi/client.ca. .SH "RETURN VALUE" Returns default X.509 client certificate filename as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_susec_set.30000644000000000000000000000226112126773155016562 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_susec_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_susec_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_susec_set(Shishi * " handle ", Shishi_asn1 " krberror ", uint32_t " susec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "uint32_t susec" 12 server microseconds to set in krberror, 0\-999999. .SH "DESCRIPTION" Set the susec field in the Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as.30000644000000000000000000000203312126773115013251 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as(Shishi * " handle ", Shishi_as ** " as ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_as ** as" 12 holds pointer to newly allocate Shishi_as structure. .SH "DESCRIPTION" Allocate a new AS exchange variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_etype.30000644000000000000000000000234412126773144015334 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_etype(Shishi * " handle ", Shishi_asn1 " kdcreq ", int32_t * " etype ", int " netype ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get etype field from. .IP "int32_t * etype" 12 output encryption type. .IP "int netype" 12 element number to return. .SH "RETURN THE NETYPE" th encryption type from KDC\-REQ. The first etype is number 1. .SH "RETURN VALUE" Returns SHISHI_OK iff etype successful set. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_randomize.30000644000000000000000000000236512126773156014653 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_randomize" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_randomize \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_randomize(Shishi * " handle ", int " strong ", void * " data ", size_t " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int strong" 12 0 iff operation should not block, non\-0 for very strong randomness. .IP "void * data" 12 output array to be filled with random data. .IP "size_t datalen" 12 size of output array. .SH "DESCRIPTION" Store cryptographically random data of given size in the provided buffer. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authorize_strcmp.30000644000000000000000000000247012126773126016257 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authorize_strcmp" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authorize_strcmp \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authorize_strcmp(Shishi * " handle ", const char * " principal ", const char * " authzname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle allocated by \fBshishi_init()\fP. .IP "const char * principal" 12 string with desired principal name. .IP "const char * authzname" 12 authorization name. .SH "DESCRIPTION" Authorization of \fIauthzname\fP against desired \fIprincipal\fP according to "basic" authentication, i.e., testing for identical strings. .SH "RETURN VALUE" Returns 1 if \fIauthzname\fP is authorized for services by the encrypted principal, and 0 otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep_der_set.30000644000000000000000000000226112126773116015630 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep_der_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep_der_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_rep_der_set(Shishi_as * " as ", char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "char * der" 12 input array with DER encoded AP\-REP. .IP "size_t derlen" 12 length of input array with DER encoded AP\-REP. .SH "DESCRIPTION" DER decode AS\-REP and set it AS exchange. If decoding fails, the AS\-REP in the AS exchange remains. .SH "RETURN VALUE" Returns SHISHI_OK. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_done.30000644000000000000000000000200212126773115014252 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_as_done(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_valid_now_p.30000644000000000000000000000174612126773174016050 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_valid_now_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_valid_now_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_valid_now_p(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Determine if ticket is valid now. .SH "RETURN VALUE" Returns 0 iff ticket is invalid (expired or not yet valid). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_to_file.30000644000000000000000000000242612126773162015337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_to_file(Shishi * " handle ", Shishi_asn1 " priv ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 priv" 12 PRIV to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write PRIV to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_encprivpart.30000644000000000000000000000207712126773162016255 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_encprivpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_encprivpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_priv_encprivpart(Shishi_priv * " priv ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .SH "DESCRIPTION" Get ASN.1 EncPrivPart structure from PRIV exchange. .SH "RETURN VALUE" Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_rep_set.30000644000000000000000000000174112126773111014770 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_rep_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_rep_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_rep_set(Shishi_ap * " ap ", Shishi_asn1 " aprep ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 aprep" 12 aprep to store in AP. .SH "DESCRIPTION" Set the AP\-REP in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_client_p.30000644000000000000000000000205412126773172015333 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_client_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_client_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_client_p(Shishi_tkt * " tkt ", const char * " client ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "const char * client" 12 client name of ticket. .SH "DESCRIPTION" Determine if ticket is for specified client. .SH "RETURN VALUE" Returns non\-0 iff ticket is for specified client. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_encasreppart.30000644000000000000000000000175412126773120016264 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_encasreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_encasreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_encasreppart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for EncASRepPart. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_encprivpart.30000644000000000000000000000233412126773123016705 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_encprivpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_encprivpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_encprivpart(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_encprivpart_der.30000644000000000000000000000242712126773162017106 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_encprivpart_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_encprivpart_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_priv_encprivpart_der(Shishi_priv * " priv ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 priv as allocated by \fBshishi_priv()\fP. .IP "char ** out" 12 output array with newly allocated DER encoding of ENCPRIVPART. .IP "size_t * outlen" 12 length of output array with DER encoding of ENCPRIVPART. .SH "DESCRIPTION" DER encode ENCPRIVPART structure. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_krberror.30000644000000000000000000000231712126773122016200 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_krberror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_krberror \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_krberror(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of KRB\-ERROR and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_decode.30000644000000000000000000000177112126773111015424 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_decode" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_decode \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_decode(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Decode ticket in AP\-REQ and set the Ticket fields in the AP exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_process.30000644000000000000000000000232612126773111015654 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_process" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_process \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_req_process(Shishi_ap * " ap ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_key * key" 12 cryptographic key used to decrypt ticket in AP\-REQ. .SH "DESCRIPTION" Decrypt ticket in AP\-REQ using supplied key and decrypt Authenticator in AP\-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_req_set.30000644000000000000000000000174112126773110014770 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_req_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_req_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_req_set(Shishi_ap * " ap ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_asn1 apreq" 12 apreq to store in AP. .SH "DESCRIPTION" Set the AP\-REQ in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authorized_p.30000644000000000000000000000272312126773126015353 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authorized_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authorized_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authorized_p(Shishi * " handle ", Shishi_tkt * " tkt ", const char * " authzname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle allocated by \fBshishi_init()\fP. .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "const char * authzname" 12 authorization name. .SH "DESCRIPTION" Simplistic authorization of \fIauthzname\fP against encrypted client principal name inside ticket. For "basic" authentication type, the principal name must coincide with \fIauthzname\fP. The "k5login" authentication type attempts the MIT/Heimdal method of parsing the file "~/.k5login" for additional equivalence names. .SH "RETURN VALUE" Returns 1 if \fIauthzname\fP is authorized for services by the encrypted principal, and 0 otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509ca_default_file.30000644000000000000000000000227012126773160016365 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509ca_default_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509ca_default_file \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_x509ca_default_file(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename for default X.509 CA certificate. .SH "RETURN VALUE" Returns the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is not a copy, so don't modify or deallocate it. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_for_localservicerealm_in_file.30000644000000000000000000000306112126773151021732 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_for_localservicerealm_in_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_for_localservicerealm_in_file \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_keys_for_localservicerealm_in_file(Shishi * " handle ", const char * " filename ", const char * " service ", const char * " realm ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * filename" 12 file to read keys from. .IP "const char * service" 12 service to get key for. .IP "const char * realm" 12 realm of server to get key for, or NULL for default realm. .SH "DESCRIPTION" Get key for specified \fIservice\fP and \fIrealm\fP from \fIfilename\fP. .SH "RETURN VALUE" Returns the key for the server "SERVICE/HOSTNAME\fIREALM\fP" (where HOSTNAME is the current system's hostname), read from the default host keys file (see \fBshishi_hostkeys_default_file()\fP), or NULL if no key could be found or an error encountered. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_default_file_set.30000644000000000000000000000230612126773175017222 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_default_file_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_default_file_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tkts_default_file_set(Shishi * " handle ", const char * " tktsfile ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * tktsfile" 12 string with new default tkts file name, or NULL to reset to default. .SH "DESCRIPTION" Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_dr.30000644000000000000000000000303212126773132013252 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_dr" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_dr \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_dr(Shishi * " handle ", Shishi_key * " key ", const char * " prfconstant ", size_t " prfconstantlen ", char * " derivedrandom ", size_t " derivedrandomlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 input array with cryptographic key to use. .IP "const char * prfconstant" 12 input array with the constant string. .IP "size_t prfconstantlen" 12 size of input array with the constant string. .IP "char * derivedrandom" 12 output array with derived random data. .IP "size_t derivedrandomlen" 12 size of output array with derived random data. .SH "DESCRIPTION" Derive "random" data from a key and a constant thusly: DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, SHISHI_ENCRYPT(KEY, PRFCONSTANT)). .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_flags_set.30000644000000000000000000000215112126773172015503 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_flags_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_flags_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_flags_set(Shishi_tkt * " tkt ", uint32_t " flags ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "uint32_t flags" 12 integer with flags to store in ticket. .SH "DESCRIPTION" Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_encprivpart.30000644000000000000000000000175312126773121016132 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_encprivpart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_encprivpart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_encprivpart(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for EncKrbPrivPart. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_server.30000644000000000000000000000277512126773172015056 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_server(Shishi_tkt * " tkt ", char ** " server ", size_t * " serverlen ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "char ** server" 12 pointer to newly allocated zero terminated string containing principal name. May be \fBNULL\fP (to only populate \fIserverlen\fP). .IP "size_t * serverlen" 12 pointer to length of \fIserver\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIserver\fP). .SH "DESCRIPTION" Represent server principal name in Ticket as zero\-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIserverlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_to_file.30000644000000000000000000000244112126773113015460 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_to_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_to_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_to_file(Shishi * " handle ", Shishi_asn1 " apreq ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ to save. .IP "int filetype" 12 input variable specifying type of file to be written, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to write to. .SH "DESCRIPTION" Write AP\-REQ to file in specified TYPE. The file will be truncated if it exists. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_get_padata_tgs.30000644000000000000000000000256012126773146017156 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_get_padata_tgs" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_get_padata_tgs \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_get_padata_tgs(Shishi * " handle ", Shishi_asn1 " kdcreq ", Shishi_asn1 * " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to get PA\-TGS\-REQ from. .IP "Shishi_asn1 * apreq" 12 Output variable with newly allocated AP\-REQ. .SH "DESCRIPTION" Extract TGS pre\-authentication data from KDC\-REQ. The data is an AP\-REQ that authenticates the request. This function call \fBshishi_kdcreq_get_padata()\fP with a SHISHI_PA_TGS_REQ padatatype and DER decode the result (if any). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_tkt.30000644000000000000000000000200012126773116014126 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_tkt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_tkt \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_as_tkt(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Get Ticket in AS exchange. .SH "RETURN VALUE" Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_validate_p.30000644000000000000000000000313612126773146016320 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_validate_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_validate_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_validate_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option validate flag is set. This option is used only by the ticket\-granting service. The VALIDATE option indicates that the request is to validate a postdated ticket. It will only be honored if the ticket presented is postdated, presently has its INVALID flag set, and would be otherwise usable at this time. A ticket cannot be validated before its starttime. The ticket presented for validation is encrypted in the key of the server for which it is valid and is passed in the padata field as part of the authentication header. .SH "RETURN VALUE" Returns non\-0 iff validate flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_save.30000644000000000000000000000213412126773143015140 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_save" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_save \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_save(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ to save. .SH "DESCRIPTION" Print DER encoding of KDC\-REQ to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_methoddata.30000644000000000000000000000246212126773155016702 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_methoddata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_methoddata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_methoddata(Shishi * " handle ", Shishi_asn1 " krberror ", Shishi_asn1 * " methoddata ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR structure with error code. .IP "Shishi_asn1 * methoddata" 12 output ASN.1 METHOD\-DATA. .SH "DESCRIPTION" Extract METHOD\-DATA ASN.1 object from the e\-data field. The e\-data field will only contain a METHOD\-DATA if the krberror error code is \fBSHISHI_KDC_ERR_PREAUTH_REQUIRED\fP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_cname.30000644000000000000000000000213712126773153017225 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_cname" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_cname \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_cname(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove client realm field in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_print.30000644000000000000000000000217412126773152015721 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 krberror" 12 KRB\-ERROR to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of KRB\-ERROR to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_enckdcreppart.30000644000000000000000000000175312126773171016367 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_enckdcreppart" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_enckdcreppart \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_tkt_enckdcreppart(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Get ASN.1 EncKDCRepPart structure from ticket. .SH "RETURN VALUE" Returns auxiliary ticket information. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_read.30000644000000000000000000000232112126773124016513 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_read(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " authenticator ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * authenticator" 12 output variable with newly allocated authenticator. .SH "DESCRIPTION" Read DER encoded authenticator from file and populate given authenticator variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_server.30000644000000000000000000000265612126773154016102 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_server" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_server \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_server(Shishi * " handle ", Shishi_asn1 " krberror ", char ** " server ", size_t * " serverlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "char ** server" 12 pointer to newly allocated zero terminated string containing server name. May be \fBNULL\fP (to only populate \fIserverlen\fP). .IP "size_t * serverlen" 12 pointer to length of \fIserver\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIserver\fP). .SH "DESCRIPTION" Return server principal name in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_from_ccache_file.30000644000000000000000000000313612126773175017156 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_from_ccache_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_from_ccache_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkts_from_ccache_file(Shishi * " handle ", const char * " filename ", Shishi_tkts ** " outtkts ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * filename" 12 name of file to read. .IP "Shishi_tkts ** outtkts" 12 pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. .SH "DESCRIPTION" Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. .SH "RETURNS" Returns \fBSHISHI_IO_ERROR\fP if the file cannot be read, \fBSHISHI_CCACHE_ERROR\fP if the data cannot be parsed as a valid ccache structure, and \fBSHISHI_OK\fP on success. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep.30000644000000000000000000000202712126773115014122 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_as_rep(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Get ASN.1 AS\-REP structure from AS exchange. .SH "RETURN VALUE" Returns the received AS\-REP packet from the AS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_default_systemfile.30000644000000000000000000000214012126773127017357 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_default_systemfile" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_default_systemfile \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_cfg_default_systemfile(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" The system configuration file name is decided at compile\-time, but may be overridden by the environment variable SHISHI_CONFIG. .SH "RETURN VALUE" Return system configuration file name. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_endtime_set.30000644000000000000000000000233612126773136020077 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_endtime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_endtime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_endtime_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", const char * " endtime ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "const char * endtime" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.endtime to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_length.30000644000000000000000000000173212126773150015003 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_length" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_length \- API function .SH SYNOPSIS .B #include .sp .BI "size_t shishi_key_length(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Calls shishi_cipher_keylen for key type. .SH "RETURN VALUE" Returns the length of the key value. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encticketpart_transited_set.30000644000000000000000000000262012126773136020443 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encticketpart_transited_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encticketpart_transited_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encticketpart_transited_set(Shishi * " handle ", Shishi_asn1 " encticketpart ", int32_t " trtype ", const char * " trdata ", size_t " trdatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encticketpart" 12 input EncTicketPart variable. .IP "int32_t trtype" 12 transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS. .IP "const char * trdata" 12 actual transited realm data. .IP "size_t trdatalen" 12 length of actual transited realm data. .SH "DESCRIPTION" Set the EncTicketPart.transited field to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_crealm.30000644000000000000000000000214212126773153017401 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_crealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_crealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_crealm(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove client realm field in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_cksumdata.30000644000000000000000000000263212126773110020234 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_cksumdata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_cksumdata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_authenticator_cksumdata(Shishi_ap * " ap ", char * " out ", size_t * " len ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "char * out" 12 output array that holds authenticator checksum data. .IP "size_t * len" 12 on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data. .SH "DESCRIPTION" Get checksum data from Authenticator. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP if successful, or \fBSHISHI_TOO_SMALL_BUFFER\fP if buffer provided was too small (then \fIlen\fP will hold necessary buffer size). .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_keys_from_file.30000644000000000000000000000230212126773151015642 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_keys_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_keys_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_keys_from_file(Shishi_keys * " keys ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi_keys * keys" 12 key set handle as allocated by \fBshishi_keys()\fP. .IP "const char * filename" 12 filename to read keys from. .SH "DESCRIPTION" Read zero or more keys from file \fIfilename\fP and append them to the keyset \fIkeys\fP. See \fBshishi_key_print()\fP for the format of the input. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "SINCE" 0.0.42 .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_priv.30000644000000000000000000000203212126773161014666 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_priv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_priv \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_priv_priv(Shishi_priv * " priv ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .SH "DESCRIPTION" Get ASN.1 PRIV structure in PRIV exchange. .SH "RETURN VALUE" Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_key_set.30000644000000000000000000000175512126773161015364 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_key_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_key_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_priv_key_set(Shishi_priv * " priv ", Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .IP "Shishi_key * key" 12 key to store in PRIV. .SH "DESCRIPTION" Set the Key in the PRIV exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509cert_default_file_set.30000644000000000000000000000252412126773160017614 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509cert_default_file_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509cert_default_file_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_x509cert_default_file_set(Shishi * " handle ", const char * " x509certfile ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * x509certfile" 12 string with new default x509 client certificate file name, or NULL to reset to default. .SH "DESCRIPTION" Set the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_key.30000644000000000000000000000204612126773111014116 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_key \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_ap_key(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used. .SH "RETURN VALUE" Return application key from AP. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_tkt.30000644000000000000000000000201712126773167014336 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_tkt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_tkt \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tgs_tkt(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .SH "DESCRIPTION" Get Ticket from TGS exchange. .SH "RETURN VALUE" Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_safe_key.30000644000000000000000000000202212126773164014436 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_safe_key" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_safe_key \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_key * shishi_safe_key(Shishi_safe * " safe ");" .SH ARGUMENTS .IP "Shishi_safe * safe" 12 structure that holds information about SAFE exchange .SH "DESCRIPTION" Get key structured from SAFE exchange. .SH "RETURN VALUE" Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_defaultcksumtype.30000644000000000000000000000204612126773130017572 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_defaultcksumtype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_defaultcksumtype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cipher_defaultcksumtype(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Get the default checksum associated with cipher. .SH "RETURN VALUE" Return associated checksum mechanism for the encryption type, as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_parse.30000644000000000000000000000224012126773113015145 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_parse(Shishi * " handle ", FILE * " fh ", Shishi_asn1 * " aprep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for reading. .IP "Shishi_asn1 * aprep" 12 output variable with newly allocated AP\-REP. .SH "DESCRIPTION" Read ASCII armored DER encoded AP\-REP from file and populate given variable. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_read_inline.30000644000000000000000000000324612126773116016051 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_read_inline" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_read_inline \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asn1_read_inline(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", char * " data ", size_t * " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 variable to read field from. .IP "const char * field" 12 name of field in \fInode\fP to read. .IP "char * data" 12 pre\-allocated output buffer that will hold ASN.1 field data. .IP "size_t * datalen" 12 on input, maximum size of output buffer, on output, actual size of output buffer. .SH "DESCRIPTION" Extract data stored in a ASN.1 field into a fixed size buffer allocated by caller. Note that since it is difficult to predict the length of the field, it is often better to use \fBshishi_asn1_read()\fP instead. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_name.30000644000000000000000000000200112126773130015110 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_name \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_cipher_name(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 encryption type, see Shishi_etype. .SH "DESCRIPTION" Read humanly readable string for cipher. .SH "RETURN VALUE" Return name of encryption type, e.g. "des3\-cbc\-sha1\-kd", as defined in the standards. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get_for_clientserver.30000644000000000000000000000240012126773200020116 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get_for_clientserver" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get_for_clientserver \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get_for_clientserver(Shishi_tkts * " tkts ", const char * " client ", const char * " server ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * client" 12 client name to get ticket for. .IP "const char * server" 12 server name to get ticket for. .SH "DESCRIPTION" Short\-hand function for getting a ticket for the given client and server. See \fBshishi_tkts_get()\fP. .SH "RETURN VALUE" Returns a ticket if found, or NULL. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkts_get_for_localservicepasswd.30000644000000000000000000000256712126773200021324 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkts_get_for_localservicepasswd" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkts_get_for_localservicepasswd \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_tkt * shishi_tkts_get_for_localservicepasswd(Shishi_tkts * " tkts ", const char * " service ", const char * " passwd ");" .SH ARGUMENTS .IP "Shishi_tkts * tkts" 12 ticket set handle as allocated by \fBshishi_tkts()\fP. .IP "const char * service" 12 service name to get ticket for. .IP "const char * passwd" 12 password for the default client principal. .SH "DESCRIPTION" Short\-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See \fBshishi_tkts_get()\fP. .SH "RETURN VALUE" Returns a ticket if found, or NULL otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_name.30000644000000000000000000000167312126773147014454 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_name" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_name \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_key_name(Shishi_key * " key ");" .SH ARGUMENTS .IP "Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Calls shishi_cipher_name for key type. .SH "RETURN VALUE" Return name of key. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encrypt_ivupdate_etype.30000644000000000000000000000526412126773131017450 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encrypt_ivupdate_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encrypt_ivupdate_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encrypt_ivupdate_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " iv ", size_t " ivlen ", char ** " ivout ", size_t * " ivoutlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to encrypt with. .IP "int keyusage" 12 integer specifying what this key is encrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "char ** ivout" 12 output array with newly allocated updated initialization vector. .IP "size_t * ivoutlen" 12 size of output array with updated initialization vector. .IP "const char * in" 12 input array with data to encrypt. .IP "size_t inlen" 12 size of input array with data to encrypt. .IP "char ** out" 12 output array with newly allocated encrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_read.30000644000000000000000000000306612126773117014514 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_read" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_read \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asn1_read(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", char ** " data ", size_t * " datalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 variable to read field from. .IP "const char * field" 12 name of field in \fInode\fP to read. .IP "char ** data" 12 newly allocated output buffer that will hold ASN.1 field data. .IP "size_t * datalen" 12 actual size of output buffer. .SH "DESCRIPTION" Extract data stored in a ASN.1 field into a newly allocated buffer. The buffer will always be zero terminated, even though \fIdatalen\fP will not include the added zero. .SH "RETURN VALUE" Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_crypto_decrypt.30000644000000000000000000000311012126773130015712 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_crypto_decrypt" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_crypto_decrypt \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_crypto_decrypt(Shishi_crypto * " ctx ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_crypto * ctx" 12 crypto context as returned by \fBshishi_crypto()\fP. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call. When the application no longer need to use the context, it should deallocate resources associated with it by calling \fBshishi_crypto_close()\fP. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_renew_tillc.30000644000000000000000000000210712126773174016046 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_renew_tillc" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_renew_tillc \- API function .SH SYNOPSIS .B #include .sp .BI "time_t shishi_tkt_renew_tillc(Shishi_tkt * " tkt ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .SH "DESCRIPTION" Extract C time corresponding to the renew\-till field. The field holds the time where the ticket stop being valid for renewal. .SH "RETURN VALUE" Returns C time interpretation of the renew\-till in ticket. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_enumerate_realms.30000644000000000000000000000247612126773200016024 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_enumerate_realms" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_enumerate_realms \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_enumerate_realms(Shisa * " dbh ", char *** " realms ", size_t * " nrealms ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "char *** realms" 12 Pointer to newly allocated array of newly allocated zero\-terminated UTF\-8 strings indicating name of realm. .IP "size_t * nrealms" 12 Pointer to number indicating number of allocated realm strings. .SH "DESCRIPTION" Extract a list of all realm names in backend, as zero\-terminated UTF\-8 strings. The caller must deallocate the strings. .SH "RETURN VALUE" Returns SHISA_OK on success, or error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_pbkdf2_sha1.30000644000000000000000000000360712126773157014750 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_pbkdf2_sha1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_pbkdf2_sha1 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_pbkdf2_sha1(Shishi * " handle ", const char * " P ", size_t " Plen ", const char * " S ", size_t " Slen ", unsigned int " c ", unsigned int " dkLen ", char * " DK ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * P" 12 input password, an octet string .IP "size_t Plen" 12 length of password, an octet string .IP "const char * S" 12 input salt, an octet string .IP "size_t Slen" 12 length of salt, an octet string .IP "unsigned int c" 12 iteration count, a positive integer .IP "unsigned int dkLen" 12 intended length in octets of the derived key, a positive integer, at most (2^32 \- 1) * hLen. The DK array must have room for this many characters. .IP "char * DK" 12 output derived key, a dkLen\-octet string .SH "DESCRIPTION" Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a pseudorandom function to derive keys. The length of the derived key is essentially unbounded. (However, the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function, which is this function is always SHA1.) .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encprivpart_set_user_data.30000644000000000000000000000246112126773163020115 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encprivpart_set_user_data" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encprivpart_set_user_data \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encprivpart_set_user_data(Shishi * " handle ", Shishi_asn1 " encprivpart ", const char * " userdata ", size_t " userdatalen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encprivpart" 12 encprivpart as allocated by \fBshishi_priv()\fP. .IP "const char * userdata" 12 input user application to store in PRIV. .IP "size_t userdatalen" 12 size of input user application to store in PRIV. .SH "DESCRIPTION" Set the application data in PRIV. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcreq_proxiable_p.30000644000000000000000000000253212126773145016512 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcreq_proxiable_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcreq_proxiable_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcreq_proxiable_p(Shishi * " handle ", Shishi_asn1 " kdcreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcreq" 12 KDC\-REQ variable to get kdc\-options field from. .SH "DESCRIPTION" Determine if KDC\-Option proxiable flag is set. The PROXIABLE option indicates that the ticket to be issued is to have its proxiable flag set. It may only be set on the initial request, or in a subsequent request if the ticket\-granting ticket on which it is based is also proxiable. .SH "RETURN VALUE" Returns non\-0 iff proxiable flag is set in KDC\-REQ. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdcrep_add_enc_part.30000644000000000000000000000272012126773143016605 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdcrep_add_enc_part" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdcrep_add_enc_part \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdcrep_add_enc_part(Shishi * " handle ", Shishi_asn1 " kdcrep ", Shishi_key * " key ", int " keyusage ", Shishi_asn1 " enckdcreppart ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 kdcrep" 12 KDC\-REP to add enc\-part field to. .IP "Shishi_key * key" 12 key used to encrypt enc\-part. .IP "int keyusage" 12 key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY. .IP "Shishi_asn1 enckdcreppart" 12 EncKDCRepPart to add. .SH "DESCRIPTION" Encrypts DER encoded EncKDCRepPart using key and stores it in the KDC\-REP. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_checksum_supported_p.30000644000000000000000000000174112126773131017077 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_checksum_supported_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_checksum_supported_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_checksum_supported_p(int32_t " type ");" .SH ARGUMENTS .IP "int32_t type" 12 checksum type, see Shishi_cksumtype. .SH "DESCRIPTION" Find out whether checksum is supported. .SH "RETURN VALUE" Return 0 iff checksum is unsupported. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_key_add.30000644000000000000000000000240112126773201014061 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_key_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_key_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_key_add(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_key * " key ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to add key for. .IP "const Shisa_key * key" 12 Pointer to Shisa key structure with key to add. .SH "DESCRIPTION" Add key to database for given PRINCIPAL\fIREALM\fP. .SH "RETURN VALUE" Returns \fBSHISA_OK\fP iff successful, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_x509key_default_file.30000644000000000000000000000224712126773160016576 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_x509key_default_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_x509key_default_file \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_x509key_default_file(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename for default X.509 key. .SH "RETURN VALUE" Returns the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_krberror_der.30000644000000000000000000000240412126773167016216 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_krberror_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_krberror_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tgs_krberror_der(Shishi_tgs * " tgs ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of KRB\-ERROR. .IP "size_t * outlen" 12 length of output array with DER encoding of KRB\-ERROR. .SH "DESCRIPTION" DER encode KRB\-ERROR. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_set_tktoptionsraw.30000644000000000000000000000306312126773107017136 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_set_tktoptionsraw" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_set_tktoptionsraw \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_ap_set_tktoptionsraw(Shishi_ap * " ap ", Shishi_tkt * " tkt ", int " options ", int32_t " cksumtype ", const char * " data ", size_t " len ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "Shishi_tkt * tkt" 12 ticket to set in AP. .IP "int options" 12 AP\-REQ options to set in AP. .IP "int32_t cksumtype" 12 authenticator checksum type to set in AP. .IP "const char * data" 12 input array with data to store in checksum field in Authenticator. .IP "size_t len" 12 length of input array with data to store in checksum field in Authenticator. .SH "DESCRIPTION" Set the ticket (see \fBshishi_ap_tkt_set()\fP) and set the AP\-REQ apoptions (see \fBshishi_apreq_options_set()\fP) and set the raw Authenticator checksum data. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_default_userfile.30000644000000000000000000000204412126773127017014 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_default_userfile" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_default_userfile \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_cfg_default_userfile(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Get filename of default user configuration file, typically $HOME/shishi.conf. .SH "RETURN VALUE" Return user configuration filename. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_apreq_mutual_required_p.30000644000000000000000000000217012126773114017565 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_apreq_mutual_required_p" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_apreq_mutual_required_p \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_apreq_mutual_required_p(Shishi * " handle ", Shishi_asn1 " apreq ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 apreq" 12 AP\-REQ as allocated by \fBshishi_apreq()\fP. .SH "DESCRIPTION" Return non\-0 iff the "Mutual required" option is set in the AP\-REQ. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tkt_flags.30000644000000000000000000000203512126773172014631 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tkt_flags" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tkt_flags \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_tkt_flags(Shishi_tkt * " tkt ", uint32_t * " flags ");" .SH ARGUMENTS .IP "Shishi_tkt * tkt" 12 input variable with ticket info. .IP "uint32_t * flags" 12 pointer to output integer with flags. .SH "DESCRIPTION" Extract flags in ticket (i.e., EncKDCRepPart). .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_default_guess.30000644000000000000000000000247112126773163016671 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_default_guess" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_default_guess \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_realm_default_guess( " void ");" .SH ARGUMENTS .IP " void" 12 .SH "DESCRIPTION" Guesses a realm based on \fBgetdomainname()\fP (which really is NIS/YP domain, but if it is set it might be a good guess), or if it fails, based on \fBgethostname()\fP, or if it fails, the string "could\-not\-guess\-default\-realm". Note that the hostname is not trimmed off of the data returned by \fBgethostname()\fP to get the domain name and use that as the realm. .SH "RETURN VALUE" Returns guessed realm for host as a string that has to be deallocated with \fBfree()\fP by the caller. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_principal_name_realm.30000644000000000000000000000377612126773161017027 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_principal_name_realm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_principal_name_realm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_principal_name_realm(Shishi * " handle ", Shishi_asn1 " namenode ", const char * " namefield ", Shishi_asn1 " realmnode ", const char * " realmfield ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle created by \fBshishi_init()\fP. .IP "Shishi_asn1 namenode" 12 ASN.1 structure with principal name in \fInamefield\fP. .IP "const char * namefield" 12 name of field in \fInamenode\fP containing principal name. .IP "Shishi_asn1 realmnode" 12 ASN.1 structure with principal realm in \fIrealmfield\fP. .IP "const char * realmfield" 12 name of field in \fIrealmnode\fP containing principal realm. .IP "char ** out" 12 pointer to newly allocated null terminated string containing principal name. May be \fBNULL\fP (to only populate \fIoutlen\fP). .IP "size_t * outlen" 12 pointer to length of \fIout\fP on output, excluding terminating null. May be \fBNULL\fP (to only populate \fIout\fP). .SH "DESCRIPTION" Represent principal name and realm in ASN.1 structure as null\-terminated string. The string is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length \fIoutlen\fP does not include the terminating null character. .SH "RETURN VALUE" Returns SHISHI_OK if successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cfg_clientkdcetype_fast.30000644000000000000000000000203712126773127017520 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cfg_clientkdcetype_fast" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cfg_clientkdcetype_fast \- API function .SH SYNOPSIS .B #include .sp .BI "int32_t shishi_cfg_clientkdcetype_fast(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .SH "DESCRIPTION" Extract the default etype from the list of preferred client etypes. .SH "RETURN VALUE" Return the default encryption types. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_enckdcreppart_endtime_set.30000644000000000000000000000233612126773135020063 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_enckdcreppart_endtime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_enckdcreppart_endtime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_enckdcreppart_endtime_set(Shishi * " handle ", Shishi_asn1 " enckdcreppart ", const char * " endtime ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 enckdcreppart" 12 input EncKDCRepPart variable. .IP "const char * endtime" 12 character buffer containing a generalized time string. .SH "DESCRIPTION" Set the EncTicketPart.endtime to supplied value. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_done.30000644000000000000000000000200212126773107014250 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_done(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_done.30000644000000000000000000000201312126773166014454 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tgs_done(Shishi_tgs * " tgs ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_from_file.30000644000000000000000000000243512126773113016003 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_from_file(Shishi * " handle ", Shishi_asn1 * " aprep ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * aprep" 12 output variable with newly allocated AP\-REP. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read AP\-REP from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_done.30000644000000000000000000000205112126773117014517 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_done" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_done \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_asn1_done(Shishi * " handle ", Shishi_asn1 " node ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 node to dellocate. .SH "DESCRIPTION" Deallocate resources associated with ASN.1 structure. Note that the node must not be used after this call. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_encapreppart_cusec_set.30000644000000000000000000000232712126773134017376 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_encapreppart_cusec_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_encapreppart_cusec_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_encapreppart_cusec_set(Shishi * " handle ", Shishi_asn1 " encapreppart ", uint32_t " cusec ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 encapreppart" 12 EncAPRepPart as allocated by \fBshishi_encapreppart()\fP. .IP "uint32_t cusec" 12 client microseconds to set in authenticator, 0\-999999. .SH "DESCRIPTION" Set the cusec field in the Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1.30000644000000000000000000000231312126773121014263 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1 \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Convert arbitrary DER data of a packet to a ASN.1 type. .SH "RETURN VALUE" Returns newly allocate ASN.1 corresponding to DER data, or \fBNULL\fP on failure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_cusec.30000644000000000000000000000213412126773154017242 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_cusec" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_cusec \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_cusec(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 Krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove client usec field in Krberror. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_krberror.30000644000000000000000000000205412126773116015165 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_krberror" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_krberror \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_as_krberror(Shishi_as * " as ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .SH "DESCRIPTION" Get ASN.1 KRB\-ERROR structure from AS exchange. .SH "RETURN VALUE" Returns the received KRB\-ERROR packet from the AS exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_aprep_print.30000644000000000000000000000214712126773112015174 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_aprep_print" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_aprep_print \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_aprep_print(Shishi * " handle ", FILE * " fh ", Shishi_asn1 " aprep ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "FILE * fh" 12 file handle open for writing. .IP "Shishi_asn1 aprep" 12 AP\-REP to print. .SH "DESCRIPTION" Print ASCII armored DER encoding of AP\-REP to file. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_from_value.30000644000000000000000000000252512126773150015662 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_from_value" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_from_value \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_key_from_value(Shishi * " handle ", int32_t " type ", const char * " value ", Shishi_key ** " key ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "int32_t type" 12 type of key. .IP "const char * value" 12 input array with key value, or NULL. .IP "Shishi_key ** key" 12 pointer to structure that will hold newly created key information .SH "DESCRIPTION" Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_hmac_md5.30000644000000000000000000000264612126773156014342 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_hmac_md5" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_hmac_md5 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_hmac_md5(Shishi * " handle ", const char * " key ", size_t " keylen ", const char * " in ", size_t " inlen ", char * " outhash[16] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * key" 12 input character array with key to use. .IP "size_t keylen" 12 length of input character array with key to use. .IP "const char * in" 12 input character array of data to hash. .IP "size_t inlen" 12 length of input character array of data to hash. .IP "char * outhash[16]" 12 .SH "DESCRIPTION" Compute keyed checksum of data using HMAC\-MD5. The \fIouthash\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_ctime_set.30000644000000000000000000000233612126773124017562 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_ctime_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_ctime_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_ctime_set(Shishi * " handle ", Shishi_asn1 " authenticator ", const char * " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator as allocated by \fBshishi_authenticator()\fP. .IP "const char * t" 12 string with generalized time value to store in Authenticator. .SH "DESCRIPTION" Store client time in Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_cipher_parse.30000644000000000000000000000176012126773130015315 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_cipher_parse" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_cipher_parse \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_cipher_parse(const char * " cipher ");" .SH ARGUMENTS .IP "const char * cipher" 12 name of encryption type, e.g. "des3\-cbc\-sha1\-kd". .SH "DESCRIPTION" Get cipher number by parsing string. .SH "RETURN VALUE" Return encryption type corresponding to a string. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_kdc_sendrecv.30000644000000000000000000000307312126773157015313 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_kdc_sendrecv" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_kdc_sendrecv \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_kdc_sendrecv(Shishi * " handle ", const char * " realm ", const char * " indata ", size_t " inlen ", char ** " outdata ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "const char * realm" 12 string with realm name. .IP "const char * indata" 12 Packet to send to KDC. .IP "size_t inlen" 12 Length of \fIindata\fP. .IP "char ** outdata" 12 Newly allocated string with data returned from KDC. .IP "size_t * outlen" 12 Length of \fIoutdata\fP. .SH "DESCRIPTION" Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname. .SH "RETURNS" \fBSHISHI_OK\fP on success, \fBSHISHI_KDC_TIMEOUT\fP if a timeout was reached, or other errors. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_as_rep_der.30000644000000000000000000000234312126773116014756 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_as_rep_der" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_as_rep_der \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_as_rep_der(Shishi_as * " as ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi_as * as" 12 structure that holds information about AS exchange .IP "char ** out" 12 output array with newly allocated DER encoding of AS\-REP. .IP "size_t * outlen" 12 length of output array with DER encoding of AS\-REP. .SH "DESCRIPTION" DER encode AS\-REP. \fIout\fP is allocated by this function, and it is the responsibility of caller to deallocate it. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_client_set.30000644000000000000000000000234612126773124017740 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_client_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_client_set \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_client_set(Shishi * " handle ", Shishi_asn1 " authenticator ", const char * " client ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 authenticator" 12 Authenticator to set client name field in. .IP "const char * client" 12 zero\-terminated string with principal name on RFC 1964 form. .SH "DESCRIPTION" Set the client name field in the Authenticator. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authenticator_from_file.30000644000000000000000000000252112126773124017544 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authenticator_from_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authenticator_from_file \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authenticator_from_file(Shishi * " handle ", Shishi_asn1 * " authenticator ", int " filetype ", const char * " filename ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 * authenticator" 12 output variable with newly allocated Authenticator. .IP "int filetype" 12 input variable specifying type of file to be read, see Shishi_filetype. .IP "const char * filename" 12 input variable with filename to read from. .SH "DESCRIPTION" Read Authenticator from file in specified TYPE. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_remove_edata.30000644000000000000000000000214712126773156017224 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_remove_edata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_remove_edata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_remove_edata(Shishi * " handle ", Shishi_asn1 " krberror ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .SH "DESCRIPTION" Remove error text (e\-data) field in KRB\-ERROR. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_key_value.30000644000000000000000000000200612126773147014637 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_key_value" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_key_value \- API function .SH SYNOPSIS .B #include .sp .BI "const char * shishi_key_value(const Shishi_key * " key ");" .SH ARGUMENTS .IP "const Shishi_key * key" 12 structure that holds key information .SH "DESCRIPTION" Get the raw key bytes. .SH "RETURN VALUE" Returns the key value as a pointer which is valid throughout the lifetime of the key structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_md5.30000644000000000000000000000231112126773156013337 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_md5" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_md5 \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_md5(Shishi * " handle ", const char * " in ", size_t " inlen ", char * " out[16] ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * in" 12 input character array of data to hash. .IP "size_t inlen" 12 length of input character array of data to hash. .IP "char * out[16]" 12 .SH "DESCRIPTION" Compute hash of data using MD5. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_priv_encprivpart_set.30000644000000000000000000000206412126773162017124 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_priv_encprivpart_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_priv_encprivpart_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_priv_encprivpart_set(Shishi_priv * " priv ", Shishi_asn1 " asn1encprivpart ");" .SH ARGUMENTS .IP "Shishi_priv * priv" 12 structure that holds information about PRIV exchange .IP "Shishi_asn1 asn1encprivpart" 12 ENCPRIVPART to store in PRIV exchange. .SH "DESCRIPTION" Set the ENCPRIVPART in the PRIV exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_krberror_set_edata.30000644000000000000000000000230612126773156016517 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_krberror_set_edata" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_krberror_set_edata \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_krberror_set_edata(Shishi * " handle ", Shishi_asn1 " krberror ", const char * " edata ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 krberror" 12 krberror as allocated by \fBshishi_krberror()\fP. .IP "const char * edata" 12 input array with error text to set. .SH "DESCRIPTION" Set error text (e\-data) field in KRB\-ERROR to specified value. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_authorize_k5login.30000644000000000000000000000246412126773126016322 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_authorize_k5login" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_authorize_k5login \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_authorize_k5login(Shishi * " handle ", const char * " principal ", const char * " authzname ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle allocated by \fBshishi_init()\fP. .IP "const char * principal" 12 string with desired principal name and realm. .IP "const char * authzname" 12 authorization name. .SH "DESCRIPTION" Authorization of \fIauthzname\fP against desired \fIprincipal\fP in accordance with the MIT/Heimdal authorization method. .SH "RETURN VALUE" Returns 1 if \fIauthzname\fP is authorized for services by \fIprincipal\fP, and returns 0 otherwise. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt_etype.30000644000000000000000000000451612126773132015535 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data as per encryption method using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_time.30000644000000000000000000000231412126773137013612 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_time" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_time \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_time(Shishi * " handle ", Shishi_asn1 " node ", const char * " field ", char ** " t ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_asn1 node" 12 ASN.1 node to get time from. .IP "const char * field" 12 Name of field in ASN.1 node to get time from. .IP "char ** t" 12 newly allocated output array with zero terminated time string. .SH "DESCRIPTION" Extract time from ASN.1 structure. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_realm_for_server_file.30000644000000000000000000000212312126773163017204 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_realm_for_server_file" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_realm_for_server_file \- API function .SH SYNOPSIS .B #include .sp .BI "char * shishi_realm_for_server_file(Shishi * " handle ", char * " server ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "char * server" 12 hostname to find realm for. .SH "DESCRIPTION" Find realm for a host using configuration file. .SH "RETURN VALUE" Returns realm for host, or NULL if not found. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_cfg.30000644000000000000000000000201512126773200013220 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_cfg" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_cfg \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_cfg(Shisa * " dbh ", const char * " option ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * option" 12 string with shisa library option. .SH "DESCRIPTION" Configure shisa library with given option. .SH "RETURN VALUE" Returns SHISA_OK if option was valid. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_tgs_req_set.30000644000000000000000000000175712126773166015207 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_tgs_req_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_tgs_req_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_tgs_req_set(Shishi_tgs * " tgs ", Shishi_asn1 " tgsreq ");" .SH ARGUMENTS .IP "Shishi_tgs * tgs" 12 structure that holds information about TGS exchange .IP "Shishi_asn1 tgsreq" 12 tgsreq to store in TGS. .SH "DESCRIPTION" Set the TGS\-REQ in the TGS exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator.30000644000000000000000000000206112126773110016174 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_ap_authenticator(Shishi_ap * " ap ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .SH "DESCRIPTION" Get ASN.1 Authenticator structure from AP exchange. .SH "RETURN VALUE" Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asreq_clientrealm.30000644000000000000000000000323612126773144016350 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asreq_clientrealm" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asreq_clientrealm \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_asreq_clientrealm(Shishi * " handle ", Shishi_asn1 " asreq ", char ** " client ", size_t * " clientlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 Shishi library handle create by \fBshishi_init()\fP. .IP "Shishi_asn1 asreq" 12 AS\-REQ variable to get client name and realm from. .IP "char ** client" 12 pointer to newly allocated zero terminated string containing principal name and realm. May be \fBNULL\fP (to only populate \fIclientlen\fP). .IP "size_t * clientlen" 12 pointer to length of \fIclient\fP on output, excluding terminating zero. May be \fBNULL\fP (to only populate \fIclient\fP). .SH "DESCRIPTION" Convert cname and realm fields from AS\-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length \fIclientlen\fP does not include the terminating zero. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_asn1_apreq.30000644000000000000000000000172212126773120014700 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_asn1_apreq" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_asn1_apreq \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_asn1_apreq(Shishi * " handle ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .SH "DESCRIPTION" Create new ASN.1 structure for AP\-REQ. .SH "RETURN VALUE" Returns ASN.1 structure. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_decrypt_iv_etype.30000644000000000000000000000471712126773132016236 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_decrypt_iv_etype" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_decrypt_iv_etype \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_decrypt_iv_etype(Shishi * " handle ", Shishi_key * " key ", int " keyusage ", int32_t " etype ", const char * " iv ", size_t " ivlen ", const char * " in ", size_t " inlen ", char ** " out ", size_t * " outlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "Shishi_key * key" 12 key to decrypt with. .IP "int keyusage" 12 integer specifying what this key is decrypting. .IP "int32_t etype" 12 integer specifying what cipher to use. .IP "const char * iv" 12 input array with initialization vector .IP "size_t ivlen" 12 size of input array with initialization vector. .IP "const char * in" 12 input array with data to decrypt. .IP "size_t inlen" 12 size of input array with data to decrypt. .IP "char ** out" 12 output array with newly allocated decrypted data. .IP "size_t * outlen" 12 output variable with size of newly allocated output array. .SH "DESCRIPTION" Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. .SH "RETURN VALUE" Returns \fBSHISHI_OK\fP iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_ap_authenticator_cksumtype_set.30000644000000000000000000000210512126773110021152 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_ap_authenticator_cksumtype_set" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_ap_authenticator_cksumtype_set \- API function .SH SYNOPSIS .B #include .sp .BI "void shishi_ap_authenticator_cksumtype_set(Shishi_ap * " ap ", int32_t " cksumtype ");" .SH ARGUMENTS .IP "Shishi_ap * ap" 12 structure that holds information about AP exchange .IP "int32_t cksumtype" 12 authenticator checksum type to set in AP. .SH "DESCRIPTION" Set the Authenticator Checksum Type in the AP exchange. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_des.30000644000000000000000000000306612126773157013436 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_des" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_des \- API function .SH SYNOPSIS .B #include .sp .BI "int shishi_des(Shishi * " handle ", int " decryptp ", const char " key[8] ", const char " iv[8] ", char * " ivout[8] ", const char * " in ", size_t " inlen ", char ** " out ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "int decryptp" 12 0 to indicate encryption, non\-0 to indicate decryption. .IP "const char key[8]" 12 .IP "const char iv[8]" 12 .IP "char * ivout[8]" 12 .IP "const char * in" 12 input character array of data to encrypt/decrypt. .IP "size_t inlen" 12 length of input character array of data to encrypt/decrypt. .IP "char ** out" 12 newly allocated character array with encrypted/decrypted data. .SH "DESCRIPTION" Encrypt or decrypt data (depending on \fIdecryptp\fP) using DES in CBC mode. The \fIout\fP buffer must be deallocated by the caller. .SH "RETURN VALUE" Returns SHISHI_OK iff successful. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shishi_der2asn1_tgsrep.30000644000000000000000000000230712126773122015653 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shishi_der2asn1_tgsrep" 3 "1.0.2" "shishi" "shishi" .SH NAME shishi_der2asn1_tgsrep \- API function .SH SYNOPSIS .B #include .sp .BI "Shishi_asn1 shishi_der2asn1_tgsrep(Shishi * " handle ", const char * " der ", size_t " derlen ");" .SH ARGUMENTS .IP "Shishi * handle" 12 shishi handle as allocated by \fBshishi_init()\fP. .IP "const char * der" 12 input character array with DER encoding. .IP "size_t derlen" 12 length of input character array with DER encoding. .SH "DESCRIPTION" Decode DER encoding of TGS\-REP and create a ASN.1 structure. .SH "RETURN VALUE" Returns ASN.1 structure corresponding to DER data. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_keys_free.30000644000000000000000000000217212126773201014442 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_keys_free" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_keys_free \- API function .SH SYNOPSIS .B #include .sp .BI "void shisa_keys_free(Shisa * " dbh ", Shisa_key ** " keys ", size_t " nkeys ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "Shisa_key ** keys" 12 Pointer to array with \fInkeys\fP elements of keys. .IP "size_t nkeys" 12 Number of key elements in \fIkeys\fP array. .SH "DESCRIPTION" Deallocate each element of an array with Shisa database keys, using \fBshisa_key_free()\fP. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/man/shisa_principal_add.30000644000000000000000000000304712126773201015261 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by gdoc. .TH "shisa_principal_add" 3 "1.0.2" "shishi" "shishi" .SH NAME shisa_principal_add \- API function .SH SYNOPSIS .B #include .sp .BI "int shisa_principal_add(Shisa * " dbh ", const char * " realm ", const char * " principal ", const Shisa_principal * " ph ", const Shisa_key * " key ");" .SH ARGUMENTS .IP "Shisa * dbh" 12 Shisa library handle created by \fBshisa()\fP. .IP "const char * realm" 12 Name of realm the principal belongs in. .IP "const char * principal" 12 Name of principal to add, may be \fBNULL\fP to indicate that the \fIrealm\fP should be created, in which case \fIph\fP and \fIkey\fP are not used. .IP "const Shisa_principal * ph" 12 Pointer to principal structure with information to store in database. .IP "const Shisa_key * key" 12 Pointer to key structure with information to store in database. .SH "DESCRIPTION" Add given information to database as PRINCIPAL\fIREALM\fP. .SH "RETURN VALUE" Returns SHISA_OK iff successfully added, or an error code. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2002-2010 Simon Josefsson. .br Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/ccache.txt0000664000000000000000000000604112126660507012414 00000000000000The Kerberos Credential Cache Binary File Format Copyright (C) 2006-2013 Simon Josefsson http://josefsson.org/shishi/ccache.txt Last updated: Sat Sep 23 12:04:11 CEST 2006 Like the MIT keytab binary format (see Michael B Allen's reverse engineered description in keytab.txt), the credential cache format is not standard nor documented anywhere. In C style notation, the MIT credential cache file format is as follows. All values are in network byte order. All text is ASCII. ccache { uint16_t file_format_version; /* 0x0504 */ uint16_t headerlen; /* only if version is 0x0504 */ header headers[]; /* only if version is 0x0504 */ principal primary_principal; credential credentials[*]; }; header { uint16_t tag; /* 1 = DeltaTime */ uint16_t taglen; uint8_t tagdata[taglen] }; The ccache.taglen and ccache.tags fields are only present in 0x0504 versions, not in earlier. Both MIT and Heimdal appear to correctly ignore unknown tags, so it appears safe to add them (although there is no central place to "register" tags). Currently only one tag is widely implemented, DeltaTime (0x0001). Its taglen is always 8, and tagdata will contain: DeltaTime { uint32_t time_offset; uint32_t usec_offset; }; After reading the file_format_version, header tags, and default principal, a list of credentials follow. You deduce from the file length when there are no more credentials. credential { principal client; principal server; keyblock key; times time; uint8_t is_skey; /* 1 if skey, 0 otherwise */ uint32_t tktflags; /* stored in reversed byte order */ uint32_t num_address; address addrs[num_address]; uint32_t num_authdata; authdata authdata[num_authdata]; countet_octet_string ticket; countet_octet_string second_ticket; }; keyblock { uint16_t keytype; uint16_t etype; /* only present if version 0x0503 */ uint16_t keylen; uint8_t keyvalue[keylen]; }; times { uint32_t authtime; uint32_t starttime; uint32_t endtime; uint32_t renew_till; }; address { uint16_t addrtype; counted_octet_string addrdata; }; authdata { uint16_t authtype; counted_octet_string authdata; }; principal { uint32_t name_type; /* not present if version 0x0501 */ uint32_t num_components; /* sub 1 if version 0x501 */ counted_octet_string realm; counted_octet_string components[num_components]; }; counted_octet_string { uint32_t length; uint8_t data[length]; }; Permission to copy, modify, and distribute this document, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include this copyright notice in ALL copies of the document or portions thereof, including modifications. shishi-1.0.2/doc/keytab2shishi.10000644000000000000000000000244312126773204013277 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH KEYTAB2SHISHI "1" "April 2013" "keytab2shishi 1.0.2" "User Commands" .SH NAME keytab2shishi \- Shishi host key conversion tool .SH SYNOPSIS .B keytab2shishi [\fIOPTIONS\fR]... [\fIINFILE \fR[\fIOUTFILE\fR]]... .SH DESCRIPTION keytab2shishi 1.0.2 .PP Read keytab data from INFILE (usually /etc/krb5.keytab) and write Shishi hostkeys to OUTFILE. If INFILE and OUTFILE are not specified, use the defaults. .TP \fB\-h\fR, \fB\-\-help\fR Print help and exit .TP \fB\-V\fR, \fB\-\-version\fR Print version and exit .TP \fB\-R\fR, \fB\-\-reverse\fR Reverse action, read Shishi hostkeys from INFILE and write .TP keytab data to OUTFILE. (default=off) .TP \fB\-v\fR, \fB\-\-verbose\fR Produce verbose output. .IP Use multiple times to increase amount of information. .TP \fB\-q\fR, \fB\-\-quiet\fR Don't produce any diagnostic output. (default=off) .PP Mandatory arguments to long options are mandatory for short options too. .SH "REPORTING BUGS" Report bugs to . .SH "SEE ALSO" The full documentation for .B keytab2shishi is maintained as a Texinfo manual. If the .B info and .B keytab2shishi programs are properly installed at your site, the command .IP .B info keytab2shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/reference/0000755000000000000000000000000012126773323012461 500000000000000shishi-1.0.2/doc/reference/shishi-docs.sgml0000664000000000000000000000545412015626624015512 00000000000000 ]> Shishi API Reference Manual for Shishi &version;. The latest version of this documentation can be found on-line at https://www.gnu.org/software/shishi/reference/. Shishi API Reference Manual Shishi is an implementation of the Kerberos 5 network authentication system, as specified in RFC 4120. Shishi can be used to authenticate users in distributed systems. Shishi contains a library ('libshishi') that can be used by application developers to add support for Kerberos 5. Shishi contains a command line utility ('shishi') that is used by users to acquire and manage tickets (and more). The server side, a Key Distribution Center, is implemented by 'shishid'. Of course, a manual documenting usage aspects as well as the programming API is included. Shishi currently supports AS/TGS exchanges for acquiring tickets, pre-authentication, the AP exchange for performing client and server authentication, and SAFE/PRIV for integrity/privacy protected application data exchanges. Shishi is internationalized; error and status messages can be translated into the users' language; user name and passwords can be converted into any available character set (normally including ISO-8859-1 and UTF-8) and also be processed using an experimental Stringprep profile. Most, if not all, of the widely used encryption and checksum types are supported, such as 3DES, AES, ARCFOUR and HMAC-SHA1. Shishi is developed for the GNU/Linux system, but runs on over 20 platforms including most major Unix platforms and Windows, and many kind of devices including iPAQ handhelds and S/390 mainframes. Shishi is free software licensed under the GNU General Public License version 3.0 (or later).
Source code layout of Shishi
API Index Index of new symbols in 0.0.42
shishi-1.0.2/doc/reference/shishi-overrides.txt0000644000000000000000000000000012126773204016415 00000000000000shishi-1.0.2/doc/reference/shishi.types0000644000000000000000000000000012126773323014744 00000000000000shishi-1.0.2/doc/reference/shishi-sections.txt0000644000000000000000000004246512126773323016271 00000000000000
low-crypto
shishi SHISHI_DNS_IN SHISHI_DNS_SRV SHISHI_DNS_TXT SHISHI_GENERALIZEDTIMEZ_LENGTH SHISHI_GENERALIZEDTIME_LENGTH SHISHI_VERSION Shishi Shishi_KDCOptions Shishi_ap Shishi_apoptions Shishi_as Shishi_asn1 Shishi_authorization Shishi_cksumtype Shishi_crypto Shishi_dns Shishi_dns_srv Shishi_etype Shishi_filetype Shishi_key Shishi_keys Shishi_keyusage Shishi_krb_error Shishi_lrtype Shishi_msgtype Shishi_name_type Shishi_outputtype Shishi_padata_type Shishi_priv Shishi_rc Shishi_safe Shishi_tgs Shishi_ticketflags Shishi_tkt Shishi_tkts Shishi_tkts_hint Shishi_tkts_hintflags Shishi_tr_type shishi shishi_3des shishi_aes_cts shishi_alloc_fail_function shishi_ap shishi_ap_authenticator shishi_ap_authenticator_cksumdata shishi_ap_authenticator_cksumdata_set shishi_ap_authenticator_cksumraw_set shishi_ap_authenticator_cksumtype shishi_ap_authenticator_cksumtype_set shishi_ap_authenticator_set shishi_ap_done shishi_ap_encapreppart shishi_ap_encapreppart_set shishi_ap_etype shishi_ap_etype_tktoptionsdata shishi_ap_key shishi_ap_nosubkey shishi_ap_option2string shishi_ap_rep shishi_ap_rep_asn1 shishi_ap_rep_build shishi_ap_rep_der shishi_ap_rep_der_set shishi_ap_rep_set shishi_ap_rep_verify shishi_ap_rep_verify_asn1 shishi_ap_rep_verify_der shishi_ap_req shishi_ap_req_asn1 shishi_ap_req_build shishi_ap_req_decode shishi_ap_req_der shishi_ap_req_der_set shishi_ap_req_process shishi_ap_req_process_keyusage shishi_ap_req_set shishi_ap_set_tktoptions shishi_ap_set_tktoptionsasn1usage shishi_ap_set_tktoptionsdata shishi_ap_set_tktoptionsraw shishi_ap_string2option shishi_ap_tkt shishi_ap_tkt_set shishi_ap_tktoptions shishi_ap_tktoptionsasn1usage shishi_ap_tktoptionsdata shishi_ap_tktoptionsraw shishi_aprep shishi_aprep_decrypt shishi_aprep_enc_part_add shishi_aprep_enc_part_make shishi_aprep_enc_part_set shishi_aprep_from_file shishi_aprep_get_enc_part_etype shishi_aprep_parse shishi_aprep_print shishi_aprep_read shishi_aprep_save shishi_aprep_to_file shishi_aprep_verify shishi_apreq shishi_apreq_add_authenticator shishi_apreq_decrypt shishi_apreq_from_file shishi_apreq_get_authenticator_etype shishi_apreq_get_ticket shishi_apreq_mutual_required_p shishi_apreq_options shishi_apreq_options_add shishi_apreq_options_remove shishi_apreq_options_set shishi_apreq_parse shishi_apreq_print shishi_apreq_read shishi_apreq_save shishi_apreq_set_authenticator shishi_apreq_set_ticket shishi_apreq_to_file shishi_apreq_use_session_key_p shishi_arcfour shishi_as shishi_as_check_cname shishi_as_check_crealm shishi_as_derive_salt shishi_as_done shishi_as_krberror shishi_as_krberror_der shishi_as_krberror_set shishi_as_process shishi_as_rep shishi_as_rep_build shishi_as_rep_der shishi_as_rep_der_set shishi_as_rep_process shishi_as_rep_set shishi_as_req shishi_as_req_build shishi_as_req_der shishi_as_req_der_set shishi_as_req_set shishi_as_sendrecv shishi_as_sendrecv_hint shishi_as_tkt shishi_as_tkt_set shishi_asn1_aprep shishi_asn1_apreq shishi_asn1_asrep shishi_asn1_asreq shishi_asn1_authenticator shishi_asn1_done shishi_asn1_empty_p shishi_asn1_encapreppart shishi_asn1_encasreppart shishi_asn1_enckdcreppart shishi_asn1_encprivpart shishi_asn1_encrypteddata shishi_asn1_encticketpart shishi_asn1_etype_info shishi_asn1_etype_info2 shishi_asn1_krberror shishi_asn1_krbsafe shishi_asn1_methoddata shishi_asn1_msgtype shishi_asn1_number_of_elements shishi_asn1_pa_enc_ts_enc shishi_asn1_padata shishi_asn1_print shishi_asn1_priv shishi_asn1_read shishi_asn1_read_bitstring shishi_asn1_read_inline shishi_asn1_read_int32 shishi_asn1_read_integer shishi_asn1_read_optional shishi_asn1_read_uint32 shishi_asn1_tgsrep shishi_asn1_tgsreq shishi_asn1_ticket shishi_asn1_to_der shishi_asn1_to_der_field shishi_asn1_write shishi_asn1_write_bitstring shishi_asn1_write_int32 shishi_asn1_write_integer shishi_asn1_write_uint32 shishi_asrep shishi_asreq shishi_asreq_clientrealm shishi_asreq_rsc shishi_authenticator shishi_authenticator_add_authorizationdata shishi_authenticator_add_cksum shishi_authenticator_add_cksum_type shishi_authenticator_add_random_subkey shishi_authenticator_add_random_subkey_etype shishi_authenticator_add_subkey shishi_authenticator_authorizationdata shishi_authenticator_cksum shishi_authenticator_clear_authorizationdata shishi_authenticator_client shishi_authenticator_client_set shishi_authenticator_clientrealm shishi_authenticator_ctime shishi_authenticator_ctime_set shishi_authenticator_cusec_get shishi_authenticator_cusec_set shishi_authenticator_from_file shishi_authenticator_get_subkey shishi_authenticator_parse shishi_authenticator_print shishi_authenticator_read shishi_authenticator_remove_cksum shishi_authenticator_remove_subkey shishi_authenticator_save shishi_authenticator_seqnumber_get shishi_authenticator_seqnumber_remove shishi_authenticator_seqnumber_set shishi_authenticator_set_cksum shishi_authenticator_set_cname shishi_authenticator_set_crealm shishi_authenticator_set_subkey shishi_authenticator_subkey shishi_authenticator_to_file shishi_authorization_parse shishi_authorize_k5login shishi_authorize_strcmp shishi_authorized_p shishi_cfg shishi_cfg_authorizationtype_set shishi_cfg_clientkdcetype shishi_cfg_clientkdcetype_fast shishi_cfg_clientkdcetype_set shishi_cfg_default_systemfile shishi_cfg_default_userdirectory shishi_cfg_default_userfile shishi_cfg_from_file shishi_cfg_print shishi_cfg_userdirectory_file shishi_check_version shishi_checksum shishi_checksum_cksumlen shishi_checksum_name shishi_checksum_parse shishi_checksum_supported_p shishi_cipher_blocksize shishi_cipher_confoundersize shishi_cipher_defaultcksumtype shishi_cipher_keylen shishi_cipher_name shishi_cipher_parse shishi_cipher_randomlen shishi_cipher_supported_p shishi_crc shishi_crypto shishi_crypto_close shishi_crypto_decrypt shishi_crypto_encrypt shishi_ctime shishi_decrypt shishi_decrypt_etype shishi_decrypt_iv shishi_decrypt_iv_etype shishi_decrypt_ivupdate shishi_decrypt_ivupdate_etype shishi_der2asn1 shishi_der2asn1_aprep shishi_der2asn1_apreq shishi_der2asn1_asrep shishi_der2asn1_asreq shishi_der2asn1_authenticator shishi_der2asn1_encapreppart shishi_der2asn1_encasreppart shishi_der2asn1_enckdcreppart shishi_der2asn1_encprivpart shishi_der2asn1_enctgsreppart shishi_der2asn1_encticketpart shishi_der2asn1_etype_info shishi_der2asn1_etype_info2 shishi_der2asn1_kdcrep shishi_der2asn1_kdcreq shishi_der2asn1_krberror shishi_der2asn1_krbsafe shishi_der2asn1_methoddata shishi_der2asn1_padata shishi_der2asn1_priv shishi_der2asn1_tgsrep shishi_der2asn1_tgsreq shishi_der2asn1_ticket shishi_der_msgtype shishi_derive_default_salt shishi_des shishi_des_cbc_mac shishi_dk shishi_done shishi_dr shishi_encapreppart shishi_encapreppart_ctime shishi_encapreppart_ctime_set shishi_encapreppart_cusec_get shishi_encapreppart_cusec_set shishi_encapreppart_from_file shishi_encapreppart_get_key shishi_encapreppart_parse shishi_encapreppart_print shishi_encapreppart_read shishi_encapreppart_save shishi_encapreppart_seqnumber_get shishi_encapreppart_seqnumber_remove shishi_encapreppart_seqnumber_set shishi_encapreppart_time_copy shishi_encapreppart_to_file shishi_encasreppart shishi_enckdcreppart shishi_enckdcreppart_authtime_set shishi_enckdcreppart_endtime_set shishi_enckdcreppart_flags_set shishi_enckdcreppart_get_key shishi_enckdcreppart_key_set shishi_enckdcreppart_nonce_set shishi_enckdcreppart_parse shishi_enckdcreppart_populate_encticketpart shishi_enckdcreppart_print shishi_enckdcreppart_read shishi_enckdcreppart_renew_till_set shishi_enckdcreppart_save shishi_enckdcreppart_server_set shishi_enckdcreppart_sname_set shishi_enckdcreppart_srealm_set shishi_enckdcreppart_srealmserver_set shishi_enckdcreppart_starttime_set shishi_encprivpart_set_user_data shishi_encprivpart_user_data shishi_encrypt shishi_encrypt_etype shishi_encrypt_iv shishi_encrypt_iv_etype shishi_encrypt_ivupdate shishi_encrypt_ivupdate_etype shishi_encticketpart shishi_encticketpart_authctime shishi_encticketpart_authtime shishi_encticketpart_authtime_set shishi_encticketpart_client shishi_encticketpart_clientrealm shishi_encticketpart_cname_set shishi_encticketpart_crealm shishi_encticketpart_crealm_set shishi_encticketpart_endtime_set shishi_encticketpart_flags_set shishi_encticketpart_get_key shishi_encticketpart_key_set shishi_encticketpart_print shishi_encticketpart_transited_set shishi_error shishi_error_clear shishi_error_outputtype shishi_error_printf shishi_error_set shishi_error_set_outputtype shishi_etype_info2_print shishi_etype_info_print shishi_generalize_ctime shishi_generalize_now shishi_generalize_time shishi_get_date shishi_hmac_md5 shishi_hmac_sha1 shishi_hostkeys_default_file shishi_hostkeys_default_file_set shishi_hostkeys_for_localservice shishi_hostkeys_for_localservicerealm shishi_hostkeys_for_server shishi_hostkeys_for_serverrealm shishi_info shishi_init shishi_init_server shishi_init_server_with_paths shishi_init_with_paths shishi_kdc_check_nonce shishi_kdc_copy_cname shishi_kdc_copy_crealm shishi_kdc_copy_nonce shishi_kdc_print shishi_kdc_process shishi_kdc_sendrecv shishi_kdc_sendrecv_hint shishi_kdcrep_add_enc_part shishi_kdcrep_clear_padata shishi_kdcrep_client_set shishi_kdcrep_cname_set shishi_kdcrep_crealm_set shishi_kdcrep_crealmserver_set shishi_kdcrep_decrypt shishi_kdcrep_from_file shishi_kdcrep_get_enc_part_etype shishi_kdcrep_get_ticket shishi_kdcrep_parse shishi_kdcrep_print shishi_kdcrep_read shishi_kdcrep_save shishi_kdcrep_set_enc_part shishi_kdcrep_set_ticket shishi_kdcrep_to_file shishi_kdcreq shishi_kdcreq_add_padata shishi_kdcreq_add_padata_preauth shishi_kdcreq_add_padata_tgs shishi_kdcreq_allow_postdate_p shishi_kdcreq_build shishi_kdcreq_clear_padata shishi_kdcreq_client shishi_kdcreq_disable_transited_check_p shishi_kdcreq_enc_tkt_in_skey_p shishi_kdcreq_etype shishi_kdcreq_forwardable_p shishi_kdcreq_forwarded_p shishi_kdcreq_from_file shishi_kdcreq_get_padata shishi_kdcreq_get_padata_tgs shishi_kdcreq_nonce shishi_kdcreq_nonce_set shishi_kdcreq_options shishi_kdcreq_options_add shishi_kdcreq_options_set shishi_kdcreq_parse shishi_kdcreq_postdated_p shishi_kdcreq_print shishi_kdcreq_proxiable_p shishi_kdcreq_proxy_p shishi_kdcreq_read shishi_kdcreq_realm shishi_kdcreq_realm_get shishi_kdcreq_renew_p shishi_kdcreq_renewable_ok_p shishi_kdcreq_renewable_p shishi_kdcreq_save shishi_kdcreq_sendrecv shishi_kdcreq_sendrecv_hint shishi_kdcreq_server shishi_kdcreq_set_cname shishi_kdcreq_set_etype shishi_kdcreq_set_realm shishi_kdcreq_set_realmserver shishi_kdcreq_set_server shishi_kdcreq_set_sname shishi_kdcreq_till shishi_kdcreq_tillc shishi_kdcreq_to_file shishi_kdcreq_validate_p shishi_key shishi_key_copy shishi_key_done shishi_key_from_base64 shishi_key_from_name shishi_key_from_random shishi_key_from_string shishi_key_from_value shishi_key_length shishi_key_name shishi_key_parse shishi_key_principal shishi_key_principal_set shishi_key_print shishi_key_random shishi_key_realm shishi_key_realm_set shishi_key_timestamp shishi_key_timestamp_set shishi_key_to_file shishi_key_type shishi_key_type_set shishi_key_value shishi_key_value_set shishi_key_version shishi_key_version_set shishi_keys shishi_keys_add shishi_keys_add_keytab_file shishi_keys_add_keytab_mem shishi_keys_done shishi_keys_for_localservicerealm_in_file shishi_keys_for_server_in_file shishi_keys_for_serverrealm_in_file shishi_keys_from_file shishi_keys_from_keytab_file shishi_keys_from_keytab_mem shishi_keys_nth shishi_keys_print shishi_keys_remove shishi_keys_size shishi_keys_to_file shishi_keys_to_keytab_file shishi_keys_to_keytab_mem shishi_krberror shishi_krberror_build shishi_krberror_client shishi_krberror_client_set shishi_krberror_crealm shishi_krberror_ctime shishi_krberror_ctime_set shishi_krberror_cusec shishi_krberror_cusec_set shishi_krberror_der shishi_krberror_edata shishi_krberror_errorcode shishi_krberror_errorcode_fast shishi_krberror_errorcode_message shishi_krberror_errorcode_set shishi_krberror_etext shishi_krberror_from_file shishi_krberror_message shishi_krberror_methoddata shishi_krberror_parse shishi_krberror_pretty_print shishi_krberror_print shishi_krberror_read shishi_krberror_realm shishi_krberror_remove_cname shishi_krberror_remove_crealm shishi_krberror_remove_ctime shishi_krberror_remove_cusec shishi_krberror_remove_edata shishi_krberror_remove_etext shishi_krberror_remove_sname shishi_krberror_save shishi_krberror_server shishi_krberror_server_set shishi_krberror_set_cname shishi_krberror_set_crealm shishi_krberror_set_edata shishi_krberror_set_etext shishi_krberror_set_realm shishi_krberror_set_sname shishi_krberror_stime shishi_krberror_stime_set shishi_krberror_susec shishi_krberror_susec_set shishi_krberror_to_file shishi_md4 shishi_md5 shishi_methoddata_print shishi_n_fold shishi_padata_print shishi_parse_name shishi_pbkdf2_sha1 shishi_principal_default shishi_principal_default_guess shishi_principal_default_set shishi_principal_name shishi_principal_name_realm shishi_principal_name_set shishi_principal_set shishi_priv shishi_priv_build shishi_priv_done shishi_priv_enc_part_etype shishi_priv_encprivpart shishi_priv_encprivpart_der shishi_priv_encprivpart_der_set shishi_priv_encprivpart_set shishi_priv_from_file shishi_priv_key shishi_priv_key_set shishi_priv_parse shishi_priv_print shishi_priv_priv shishi_priv_priv_der shishi_priv_priv_der_set shishi_priv_priv_set shishi_priv_process shishi_priv_read shishi_priv_save shishi_priv_set_enc_part shishi_priv_to_file shishi_prompt_password shishi_prompt_password_callback_get shishi_prompt_password_callback_set shishi_prompt_password_func shishi_random_to_key shishi_randomize shishi_realm_default shishi_realm_default_guess shishi_realm_default_set shishi_realm_for_server shishi_realm_for_server_dns shishi_realm_for_server_file shishi_resolv shishi_resolv_free shishi_safe shishi_safe_build shishi_safe_cksum shishi_safe_done shishi_safe_from_file shishi_safe_key shishi_safe_key_set shishi_safe_parse shishi_safe_print shishi_safe_read shishi_safe_safe shishi_safe_safe_der shishi_safe_safe_der_set shishi_safe_safe_set shishi_safe_save shishi_safe_set_cksum shishi_safe_set_user_data shishi_safe_to_file shishi_safe_user_data shishi_safe_verify shishi_server shishi_server_for_local_service shishi_strerror shishi_string_to_key shishi_tgs shishi_tgs_ap shishi_tgs_done shishi_tgs_krberror shishi_tgs_krberror_der shishi_tgs_krberror_set shishi_tgs_process shishi_tgs_rep shishi_tgs_rep_build shishi_tgs_rep_der shishi_tgs_rep_process shishi_tgs_req shishi_tgs_req_build shishi_tgs_req_der shishi_tgs_req_der_set shishi_tgs_req_process shishi_tgs_req_set shishi_tgs_sendrecv shishi_tgs_sendrecv_hint shishi_tgs_set_realm shishi_tgs_set_realmserver shishi_tgs_set_server shishi_tgs_tgtkt shishi_tgs_tgtkt_set shishi_tgs_tkt shishi_tgs_tkt_set shishi_tgsrep shishi_tgsreq shishi_tgsreq_rst shishi_ticket shishi_ticket_add_enc_part shishi_ticket_decrypt shishi_ticket_get_enc_part_etype shishi_ticket_parse shishi_ticket_print shishi_ticket_read shishi_ticket_realm_get shishi_ticket_realm_set shishi_ticket_save shishi_ticket_server shishi_ticket_set_enc_part shishi_ticket_set_server shishi_ticket_sname_set shishi_ticket_srealmserver_set shishi_time shishi_tkt shishi_tkt2 shishi_tkt_authctime shishi_tkt_authtime shishi_tkt_build shishi_tkt_client shishi_tkt_client_p shishi_tkt_clientrealm shishi_tkt_clientrealm_p shishi_tkt_clientrealm_set shishi_tkt_decrypt shishi_tkt_done shishi_tkt_enckdcreppart shishi_tkt_enckdcreppart_set shishi_tkt_encticketpart shishi_tkt_encticketpart_set shishi_tkt_endctime shishi_tkt_endtime shishi_tkt_expired_p shishi_tkt_flags shishi_tkt_flags_add shishi_tkt_flags_set shishi_tkt_forwardable_p shishi_tkt_forwarded_p shishi_tkt_hw_authent_p shishi_tkt_initial_p shishi_tkt_invalid_p shishi_tkt_kdcrep shishi_tkt_key shishi_tkt_key_set shishi_tkt_keytype shishi_tkt_keytype_fast shishi_tkt_keytype_p shishi_tkt_lastreq shishi_tkt_lastreq_pretty_print shishi_tkt_lastreqc shishi_tkt_match_p shishi_tkt_may_postdate_p shishi_tkt_ok_as_delegate_p shishi_tkt_postdated_p shishi_tkt_pre_authent_p shishi_tkt_pretty_print shishi_tkt_proxiable_p shishi_tkt_proxy_p shishi_tkt_realm shishi_tkt_renew_till shishi_tkt_renew_tillc shishi_tkt_renewable_p shishi_tkt_server shishi_tkt_server_p shishi_tkt_serverrealm_set shishi_tkt_startctime shishi_tkt_starttime shishi_tkt_ticket shishi_tkt_ticket_set shishi_tkt_transited_policy_checked_p shishi_tkt_valid_at_time_p shishi_tkt_valid_now_p shishi_tkts shishi_tkts_add shishi_tkts_add_ccache_file shishi_tkts_add_ccache_mem shishi_tkts_default shishi_tkts_default_ccache shishi_tkts_default_ccache_guess shishi_tkts_default_ccache_set shishi_tkts_default_file shishi_tkts_default_file_guess shishi_tkts_default_file_set shishi_tkts_default_to_file shishi_tkts_done shishi_tkts_expire shishi_tkts_find shishi_tkts_find_for_clientserver shishi_tkts_find_for_server shishi_tkts_from_ccache_file shishi_tkts_from_ccache_mem shishi_tkts_from_file shishi_tkts_get shishi_tkts_get_for_clientserver shishi_tkts_get_for_localservicepasswd shishi_tkts_get_for_server shishi_tkts_get_tgs shishi_tkts_get_tgt shishi_tkts_new shishi_tkts_nth shishi_tkts_print shishi_tkts_print_for_service shishi_tkts_read shishi_tkts_remove shishi_tkts_size shishi_tkts_to_file shishi_tkts_write shishi_verbose shishi_verify shishi_warn shishi_x509ca_default_file shishi_x509ca_default_file_guess shishi_x509ca_default_file_set shishi_x509cert_default_file shishi_x509cert_default_file_guess shishi_x509cert_default_file_set shishi_x509key_default_file shishi_x509key_default_file_guess shishi_x509key_default_file_set shishi_xalloc_die
shishi-1.0.2/doc/reference/version.xml.in0000664000000000000000000000001212015626624015206 00000000000000@VERSION@ shishi-1.0.2/doc/reference/Makefile.am0000664000000000000000000000707312015626624014444 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=$(PACKAGE) # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR=$(top_srcdir)/lib # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS= # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=$(top_srcdir)/lib/*.h CFILE_GLOB=$(top_srcdir)/lib/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES=asn1.h cfg.h crypto.h diskio.h internal.h shishi-int.h \ starttls.h utils.h ccache.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES=../components.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS= GTKDOC_LIBS= # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt #DISTCLEANFILES += # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) #TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk shishi-1.0.2/doc/reference/html/0000755000000000000000000000000012126773323013425 500000000000000shishi-1.0.2/doc/reference/html/right.png0000644000000000000000000000073012126773323015170 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’òŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚shishi-1.0.2/doc/reference/html/intro.html0000644000000000000000000000670112126773323015372 00000000000000 Shishi API Reference Manual

Shishi API Reference Manual

Shishi is an implementation of the Kerberos 5 network authentication system, as specified in RFC 4120. Shishi can be used to authenticate users in distributed systems.

Shishi contains a library ('libshishi') that can be used by application developers to add support for Kerberos 5. Shishi contains a command line utility ('shishi') that is used by users to acquire and manage tickets (and more). The server side, a Key Distribution Center, is implemented by 'shishid'. Of course, a manual documenting usage aspects as well as the programming API is included.

Shishi currently supports AS/TGS exchanges for acquiring tickets, pre-authentication, the AP exchange for performing client and server authentication, and SAFE/PRIV for integrity/privacy protected application data exchanges.

Shishi is internationalized; error and status messages can be translated into the users' language; user name and passwords can be converted into any available character set (normally including ISO-8859-1 and UTF-8) and also be processed using an experimental Stringprep profile.

Most, if not all, of the widely used encryption and checksum types are supported, such as 3DES, AES, ARCFOUR and HMAC-SHA1.

Shishi is developed for the GNU/Linux system, but runs on over 20 platforms including most major Unix platforms and Windows, and many kind of devices including iPAQ handhelds and S/390 mainframes.

Shishi is free software licensed under the GNU General Public License version 3.0 (or later).

Figure 1. Source code layout of Shishi

Source code layout of Shishi

shishi-1.0.2/doc/reference/html/api-index-full.html0000644000000000000000000053451312126773323017064 00000000000000 API Index

API Index

shishi, function in shishi
Shishi, typedef in shishi

3

shishi_3des, function in shishi

A

shishi_aes_cts, function in shishi
shishi_alloc_fail_function, user_function in shishi
Shishi_ap, typedef in shishi
shishi_ap, function in shishi
Shishi_apoptions, enum in shishi
shishi_aprep, function in shishi
shishi_aprep_decrypt, function in shishi
shishi_aprep_enc_part_add, function in shishi
shishi_aprep_enc_part_make, function in shishi
shishi_aprep_enc_part_set, function in shishi
shishi_aprep_from_file, function in shishi
shishi_aprep_get_enc_part_etype, function in shishi
shishi_aprep_parse, function in shishi
shishi_aprep_print, function in shishi
shishi_aprep_read, function in shishi
shishi_aprep_save, function in shishi
shishi_aprep_to_file, function in shishi
shishi_aprep_verify, function in shishi
shishi_apreq, function in shishi
shishi_apreq_add_authenticator, function in shishi
shishi_apreq_decrypt, function in shishi
shishi_apreq_from_file, function in shishi
shishi_apreq_get_authenticator_etype, function in shishi
shishi_apreq_get_ticket, function in shishi
shishi_apreq_mutual_required_p, function in shishi
shishi_apreq_options, function in shishi
shishi_apreq_options_add, function in shishi
shishi_apreq_options_remove, function in shishi
shishi_apreq_options_set, function in shishi
shishi_apreq_parse, function in shishi
shishi_apreq_print, function in shishi
shishi_apreq_read, function in shishi
shishi_apreq_save, function in shishi
shishi_apreq_set_authenticator, function in shishi
shishi_apreq_set_ticket, function in shishi
shishi_apreq_to_file, function in shishi
shishi_apreq_use_session_key_p, function in shishi
shishi_ap_authenticator, function in shishi
shishi_ap_authenticator_cksumdata, function in shishi
shishi_ap_authenticator_cksumdata_set, function in shishi
shishi_ap_authenticator_cksumraw_set, function in shishi
shishi_ap_authenticator_cksumtype, function in shishi
shishi_ap_authenticator_cksumtype_set, function in shishi
shishi_ap_authenticator_set, function in shishi
shishi_ap_done, function in shishi
shishi_ap_encapreppart, function in shishi
shishi_ap_encapreppart_set, function in shishi
shishi_ap_etype, function in shishi
shishi_ap_etype_tktoptionsdata, function in shishi
shishi_ap_key, function in shishi
shishi_ap_nosubkey, function in shishi
shishi_ap_option2string, function in shishi
shishi_ap_rep, function in shishi
shishi_ap_rep_asn1, function in shishi
shishi_ap_rep_build, function in shishi
shishi_ap_rep_der, function in shishi
shishi_ap_rep_der_set, function in shishi
shishi_ap_rep_set, function in shishi
shishi_ap_rep_verify, function in shishi
shishi_ap_rep_verify_asn1, function in shishi
shishi_ap_rep_verify_der, function in shishi
shishi_ap_req, function in shishi
shishi_ap_req_asn1, function in shishi
shishi_ap_req_build, function in shishi
shishi_ap_req_decode, function in shishi
shishi_ap_req_der, function in shishi
shishi_ap_req_der_set, function in shishi
shishi_ap_req_process, function in shishi
shishi_ap_req_process_keyusage, function in shishi
shishi_ap_req_set, function in shishi
shishi_ap_set_tktoptions, function in shishi
shishi_ap_set_tktoptionsasn1usage, function in shishi
shishi_ap_set_tktoptionsdata, function in shishi
shishi_ap_set_tktoptionsraw, function in shishi
shishi_ap_string2option, function in shishi
shishi_ap_tkt, function in shishi
shishi_ap_tktoptions, function in shishi
shishi_ap_tktoptionsasn1usage, function in shishi
shishi_ap_tktoptionsdata, function in shishi
shishi_ap_tktoptionsraw, function in shishi
shishi_ap_tkt_set, function in shishi
shishi_arcfour, function in shishi
shishi_as, function in shishi
Shishi_as, typedef in shishi
Shishi_asn1, typedef in shishi
shishi_asn1_aprep, function in shishi
shishi_asn1_apreq, function in shishi
shishi_asn1_asrep, function in shishi
shishi_asn1_asreq, function in shishi
shishi_asn1_authenticator, function in shishi
shishi_asn1_done, function in shishi
shishi_asn1_empty_p, function in shishi
shishi_asn1_encapreppart, function in shishi
shishi_asn1_encasreppart, function in shishi
shishi_asn1_enckdcreppart, function in shishi
shishi_asn1_encprivpart, function in shishi
shishi_asn1_encrypteddata, function in shishi
shishi_asn1_encticketpart, function in shishi
shishi_asn1_etype_info, function in shishi
shishi_asn1_etype_info2, function in shishi
shishi_asn1_krberror, function in shishi
shishi_asn1_krbsafe, function in shishi
shishi_asn1_methoddata, function in shishi
shishi_asn1_msgtype, function in shishi
shishi_asn1_number_of_elements, function in shishi
shishi_asn1_padata, function in shishi
shishi_asn1_pa_enc_ts_enc, function in shishi
shishi_asn1_print, function in shishi
shishi_asn1_priv, function in shishi
shishi_asn1_read, function in shishi
shishi_asn1_read_bitstring, function in shishi
shishi_asn1_read_inline, function in shishi
shishi_asn1_read_int32, function in shishi
shishi_asn1_read_integer, function in shishi
shishi_asn1_read_optional, function in shishi
shishi_asn1_read_uint32, function in shishi
shishi_asn1_tgsrep, function in shishi
shishi_asn1_tgsreq, function in shishi
shishi_asn1_ticket, function in shishi
shishi_asn1_to_der, function in shishi
shishi_asn1_to_der_field, function in shishi
shishi_asn1_write, function in shishi
shishi_asn1_write_bitstring, function in shishi
shishi_asn1_write_int32, function in shishi
shishi_asn1_write_integer, function in shishi
shishi_asn1_write_uint32, function in shishi
shishi_asrep, function in shishi
shishi_asreq, function in shishi
shishi_asreq_clientrealm, function in shishi
shishi_asreq_rsc, function in shishi
shishi_as_check_cname, function in shishi
shishi_as_check_crealm, function in shishi
shishi_as_derive_salt, function in shishi
shishi_as_done, function in shishi
shishi_as_krberror, function in shishi
shishi_as_krberror_der, function in shishi
shishi_as_krberror_set, function in shishi
shishi_as_process, function in shishi
shishi_as_rep, function in shishi
shishi_as_rep_build, function in shishi
shishi_as_rep_der, function in shishi
shishi_as_rep_der_set, function in shishi
shishi_as_rep_process, function in shishi
shishi_as_rep_set, function in shishi
shishi_as_req, function in shishi
shishi_as_req_build, function in shishi
shishi_as_req_der, function in shishi
shishi_as_req_der_set, function in shishi
shishi_as_req_set, function in shishi
shishi_as_sendrecv, function in shishi
shishi_as_sendrecv_hint, function in shishi
shishi_as_tkt, function in shishi
shishi_as_tkt_set, function in shishi
shishi_authenticator, function in shishi
shishi_authenticator_add_authorizationdata, function in shishi
shishi_authenticator_add_cksum, function in shishi
shishi_authenticator_add_cksum_type, function in shishi
shishi_authenticator_add_random_subkey, function in shishi
shishi_authenticator_add_random_subkey_etype, function in shishi
shishi_authenticator_add_subkey, function in shishi
shishi_authenticator_authorizationdata, function in shishi
shishi_authenticator_cksum, function in shishi
shishi_authenticator_clear_authorizationdata, function in shishi
shishi_authenticator_client, function in shishi
shishi_authenticator_clientrealm, function in shishi
shishi_authenticator_client_set, function in shishi
shishi_authenticator_ctime, function in shishi
shishi_authenticator_ctime_set, function in shishi
shishi_authenticator_cusec_get, function in shishi
shishi_authenticator_cusec_set, function in shishi
shishi_authenticator_from_file, function in shishi
shishi_authenticator_get_subkey, function in shishi
shishi_authenticator_parse, function in shishi
shishi_authenticator_print, function in shishi
shishi_authenticator_read, function in shishi
shishi_authenticator_remove_cksum, function in shishi
shishi_authenticator_remove_subkey, function in shishi
shishi_authenticator_save, function in shishi
shishi_authenticator_seqnumber_get, function in shishi
shishi_authenticator_seqnumber_remove, function in shishi
shishi_authenticator_seqnumber_set, function in shishi
shishi_authenticator_set_cksum, function in shishi
shishi_authenticator_set_cname, function in shishi
shishi_authenticator_set_crealm, function in shishi
shishi_authenticator_set_subkey, function in shishi
shishi_authenticator_subkey, function in shishi
shishi_authenticator_to_file, function in shishi
Shishi_authorization, enum in shishi
shishi_authorization_parse, function in shishi
shishi_authorized_p, function in shishi
shishi_authorize_k5login, function in shishi
shishi_authorize_strcmp, function in shishi

C

shishi_cfg, function in shishi
shishi_cfg_authorizationtype_set, function in shishi
shishi_cfg_clientkdcetype, function in shishi
shishi_cfg_clientkdcetype_fast, function in shishi
shishi_cfg_clientkdcetype_set, function in shishi
shishi_cfg_default_systemfile, function in shishi
shishi_cfg_default_userdirectory, function in shishi
shishi_cfg_default_userfile, function in shishi
shishi_cfg_from_file, function in shishi
shishi_cfg_print, function in shishi
shishi_cfg_userdirectory_file, function in shishi
shishi_checksum, function in shishi
shishi_checksum_cksumlen, function in shishi
shishi_checksum_name, function in shishi
shishi_checksum_parse, function in shishi
shishi_checksum_supported_p, function in shishi
shishi_check_version, function in shishi
shishi_cipher_blocksize, function in shishi
shishi_cipher_confoundersize, function in shishi
shishi_cipher_defaultcksumtype, function in shishi
shishi_cipher_keylen, function in shishi
shishi_cipher_name, function in shishi
shishi_cipher_parse, function in shishi
shishi_cipher_randomlen, function in shishi
shishi_cipher_supported_p, function in shishi
Shishi_cksumtype, enum in shishi
shishi_crc, function in shishi
Shishi_crypto, typedef in shishi
shishi_crypto, function in shishi
shishi_crypto_close, function in shishi
shishi_crypto_decrypt, function in shishi
shishi_crypto_encrypt, function in shishi
shishi_ctime, function in shishi

D

shishi_decrypt, function in shishi
shishi_decrypt_etype, function in shishi
shishi_decrypt_iv, function in shishi
shishi_decrypt_ivupdate, function in shishi
shishi_decrypt_ivupdate_etype, function in shishi
shishi_decrypt_iv_etype, function in shishi
shishi_der2asn1, function in shishi
shishi_der2asn1_aprep, function in shishi
shishi_der2asn1_apreq, function in shishi
shishi_der2asn1_asrep, function in shishi
shishi_der2asn1_asreq, function in shishi
shishi_der2asn1_authenticator, function in shishi
shishi_der2asn1_encapreppart, function in shishi
shishi_der2asn1_encasreppart, function in shishi
shishi_der2asn1_enckdcreppart, function in shishi
shishi_der2asn1_encprivpart, function in shishi
shishi_der2asn1_enctgsreppart, function in shishi
shishi_der2asn1_encticketpart, function in shishi
shishi_der2asn1_etype_info, function in shishi
shishi_der2asn1_etype_info2, function in shishi
shishi_der2asn1_kdcrep, function in shishi
shishi_der2asn1_kdcreq, function in shishi
shishi_der2asn1_krberror, function in shishi
shishi_der2asn1_krbsafe, function in shishi
shishi_der2asn1_methoddata, function in shishi
shishi_der2asn1_padata, function in shishi
shishi_der2asn1_priv, function in shishi
shishi_der2asn1_tgsrep, function in shishi
shishi_der2asn1_tgsreq, function in shishi
shishi_der2asn1_ticket, function in shishi
shishi_derive_default_salt, function in shishi
shishi_der_msgtype, function in shishi
shishi_des, function in shishi
shishi_des_cbc_mac, function in shishi
shishi_dk, function in shishi
Shishi_dns, typedef in shishi
SHISHI_DNS_IN, macro in shishi
Shishi_dns_srv, typedef in shishi
SHISHI_DNS_SRV, macro in shishi
SHISHI_DNS_TXT, macro in shishi
shishi_done, function in shishi
shishi_dr, function in shishi

E

shishi_encapreppart, function in shishi
shishi_encapreppart_ctime, function in shishi
shishi_encapreppart_ctime_set, function in shishi
shishi_encapreppart_cusec_get, function in shishi
shishi_encapreppart_cusec_set, function in shishi
shishi_encapreppart_from_file, function in shishi
shishi_encapreppart_get_key, function in shishi
shishi_encapreppart_parse, function in shishi
shishi_encapreppart_print, function in shishi
shishi_encapreppart_read, function in shishi
shishi_encapreppart_save, function in shishi
shishi_encapreppart_seqnumber_get, function in shishi
shishi_encapreppart_seqnumber_remove, function in shishi
shishi_encapreppart_seqnumber_set, function in shishi
shishi_encapreppart_time_copy, function in shishi
shishi_encapreppart_to_file, function in shishi
shishi_encasreppart, function in shishi
shishi_enckdcreppart, function in shishi
shishi_enckdcreppart_authtime_set, function in shishi
shishi_enckdcreppart_endtime_set, function in shishi
shishi_enckdcreppart_flags_set, function in shishi
shishi_enckdcreppart_get_key, function in shishi
shishi_enckdcreppart_key_set, function in shishi
shishi_enckdcreppart_nonce_set, function in shishi
shishi_enckdcreppart_parse, function in shishi
shishi_enckdcreppart_populate_encticketpart, function in shishi
shishi_enckdcreppart_print, function in shishi
shishi_enckdcreppart_read, function in shishi
shishi_enckdcreppart_renew_till_set, function in shishi
shishi_enckdcreppart_save, function in shishi
shishi_enckdcreppart_server_set, function in shishi
shishi_enckdcreppart_sname_set, function in shishi
shishi_enckdcreppart_srealmserver_set, function in shishi
shishi_enckdcreppart_srealm_set, function in shishi
shishi_enckdcreppart_starttime_set, function in shishi
shishi_encprivpart_set_user_data, function in shishi
shishi_encprivpart_user_data, function in shishi
shishi_encrypt, function in shishi
shishi_encrypt_etype, function in shishi
shishi_encrypt_iv, function in shishi
shishi_encrypt_ivupdate, function in shishi
shishi_encrypt_ivupdate_etype, function in shishi
shishi_encrypt_iv_etype, function in shishi
shishi_encticketpart, function in shishi
shishi_encticketpart_authctime, function in shishi
shishi_encticketpart_authtime, function in shishi
shishi_encticketpart_authtime_set, function in shishi
shishi_encticketpart_client, function in shishi
shishi_encticketpart_clientrealm, function in shishi
shishi_encticketpart_cname_set, function in shishi
shishi_encticketpart_crealm, function in shishi
shishi_encticketpart_crealm_set, function in shishi
shishi_encticketpart_endtime_set, function in shishi
shishi_encticketpart_flags_set, function in shishi
shishi_encticketpart_get_key, function in shishi
shishi_encticketpart_key_set, function in shishi
shishi_encticketpart_print, function in shishi
shishi_encticketpart_transited_set, function in shishi
shishi_error, function in shishi
shishi_error_clear, function in shishi
shishi_error_outputtype, function in shishi
shishi_error_printf, function in shishi
shishi_error_set, function in shishi
shishi_error_set_outputtype, function in shishi
Shishi_etype, enum in shishi
shishi_etype_info2_print, function in shishi
shishi_etype_info_print, function in shishi

F

Shishi_filetype, enum in shishi

G

SHISHI_GENERALIZEDTIMEZ_LENGTH, macro in shishi
SHISHI_GENERALIZEDTIME_LENGTH, macro in shishi
shishi_generalize_ctime, function in shishi
shishi_generalize_now, function in shishi
shishi_generalize_time, function in shishi
shishi_get_date, function in shishi

H

shishi_hmac_md5, function in shishi
shishi_hmac_sha1, function in shishi
shishi_hostkeys_default_file, function in shishi
shishi_hostkeys_default_file_set, function in shishi
shishi_hostkeys_for_localservice, function in shishi
shishi_hostkeys_for_localservicerealm, function in shishi
shishi_hostkeys_for_server, function in shishi
shishi_hostkeys_for_serverrealm, function in shishi

I

shishi_info, function in shishi
shishi_init, function in shishi
shishi_init_server, function in shishi
shishi_init_server_with_paths, function in shishi
shishi_init_with_paths, function in shishi

K

Shishi_KDCOptions, enum in shishi
shishi_kdcrep_add_enc_part, function in shishi
shishi_kdcrep_clear_padata, function in shishi
shishi_kdcrep_client_set, function in shishi
shishi_kdcrep_cname_set, function in shishi
shishi_kdcrep_crealmserver_set, function in shishi
shishi_kdcrep_crealm_set, function in shishi
shishi_kdcrep_decrypt, function in shishi
shishi_kdcrep_from_file, function in shishi
shishi_kdcrep_get_enc_part_etype, function in shishi
shishi_kdcrep_get_ticket, function in shishi
shishi_kdcrep_parse, function in shishi
shishi_kdcrep_print, function in shishi
shishi_kdcrep_read, function in shishi
shishi_kdcrep_save, function in shishi
shishi_kdcrep_set_enc_part, function in shishi
shishi_kdcrep_set_ticket, function in shishi
shishi_kdcrep_to_file, function in shishi
shishi_kdcreq, function in shishi
shishi_kdcreq_add_padata, function in shishi
shishi_kdcreq_add_padata_preauth, function in shishi
shishi_kdcreq_add_padata_tgs, function in shishi
shishi_kdcreq_allow_postdate_p, function in shishi
shishi_kdcreq_build, function in shishi
shishi_kdcreq_clear_padata, function in shishi
shishi_kdcreq_client, function in shishi
shishi_kdcreq_disable_transited_check_p, function in shishi
shishi_kdcreq_enc_tkt_in_skey_p, function in shishi
shishi_kdcreq_etype, function in shishi
shishi_kdcreq_forwardable_p, function in shishi
shishi_kdcreq_forwarded_p, function in shishi
shishi_kdcreq_from_file, function in shishi
shishi_kdcreq_get_padata, function in shishi
shishi_kdcreq_get_padata_tgs, function in shishi
shishi_kdcreq_nonce, function in shishi
shishi_kdcreq_nonce_set, function in shishi
shishi_kdcreq_options, function in shishi
shishi_kdcreq_options_add, function in shishi
shishi_kdcreq_options_set, function in shishi
shishi_kdcreq_parse, function in shishi
shishi_kdcreq_postdated_p, function in shishi
shishi_kdcreq_print, function in shishi
shishi_kdcreq_proxiable_p, function in shishi
shishi_kdcreq_proxy_p, function in shishi
shishi_kdcreq_read, function in shishi
shishi_kdcreq_realm, function in shishi
shishi_kdcreq_realm_get, function in shishi
shishi_kdcreq_renewable_ok_p, function in shishi
shishi_kdcreq_renewable_p, function in shishi
shishi_kdcreq_renew_p, function in shishi
shishi_kdcreq_save, function in shishi
shishi_kdcreq_sendrecv, function in shishi
shishi_kdcreq_sendrecv_hint, function in shishi
shishi_kdcreq_server, function in shishi
shishi_kdcreq_set_cname, function in shishi
shishi_kdcreq_set_etype, function in shishi
shishi_kdcreq_set_realm, function in shishi
shishi_kdcreq_set_realmserver, function in shishi
shishi_kdcreq_set_server, function in shishi
shishi_kdcreq_set_sname, function in shishi
shishi_kdcreq_till, function in shishi
shishi_kdcreq_tillc, function in shishi
shishi_kdcreq_to_file, function in shishi
shishi_kdcreq_validate_p, function in shishi
shishi_kdc_check_nonce, function in shishi
shishi_kdc_copy_cname, function in shishi
shishi_kdc_copy_crealm, function in shishi
shishi_kdc_copy_nonce, function in shishi
shishi_kdc_print, function in shishi
shishi_kdc_process, function in shishi
shishi_kdc_sendrecv, function in shishi
shishi_kdc_sendrecv_hint, function in shishi
Shishi_key, typedef in shishi
shishi_key, function in shishi
shishi_keys, function in shishi
Shishi_keys, typedef in shishi
shishi_keys_add, function in shishi
shishi_keys_add_keytab_file, function in shishi
shishi_keys_add_keytab_mem, function in shishi
shishi_keys_done, function in shishi
shishi_keys_for_localservicerealm_in_file, function in shishi
shishi_keys_for_serverrealm_in_file, function in shishi
shishi_keys_for_server_in_file, function in shishi
shishi_keys_from_file, function in shishi
shishi_keys_from_keytab_file, function in shishi
shishi_keys_from_keytab_mem, function in shishi
shishi_keys_nth, function in shishi
shishi_keys_print, function in shishi
shishi_keys_remove, function in shishi
shishi_keys_size, function in shishi
shishi_keys_to_file, function in shishi
shishi_keys_to_keytab_file, function in shishi
shishi_keys_to_keytab_mem, function in shishi
Shishi_keyusage, enum in shishi
shishi_key_copy, function in shishi
shishi_key_done, function in shishi
shishi_key_from_base64, function in shishi
shishi_key_from_name, function in shishi
shishi_key_from_random, function in shishi
shishi_key_from_string, function in shishi
shishi_key_from_value, function in shishi
shishi_key_length, function in shishi
shishi_key_name, function in shishi
shishi_key_parse, function in shishi
shishi_key_principal, function in shishi
shishi_key_principal_set, function in shishi
shishi_key_print, function in shishi
shishi_key_random, function in shishi
shishi_key_realm, function in shishi
shishi_key_realm_set, function in shishi
shishi_key_timestamp, function in shishi
shishi_key_timestamp_set, function in shishi
shishi_key_to_file, function in shishi
shishi_key_type, function in shishi
shishi_key_type_set, function in shishi
shishi_key_value, function in shishi
shishi_key_value_set, function in shishi
shishi_key_version, function in shishi
shishi_key_version_set, function in shishi
shishi_krberror, function in shishi
shishi_krberror_build, function in shishi
shishi_krberror_client, function in shishi
shishi_krberror_client_set, function in shishi
shishi_krberror_crealm, function in shishi
shishi_krberror_ctime, function in shishi
shishi_krberror_ctime_set, function in shishi
shishi_krberror_cusec, function in shishi
shishi_krberror_cusec_set, function in shishi
shishi_krberror_der, function in shishi
shishi_krberror_edata, function in shishi
shishi_krberror_errorcode, function in shishi
shishi_krberror_errorcode_fast, function in shishi
shishi_krberror_errorcode_message, function in shishi
shishi_krberror_errorcode_set, function in shishi
shishi_krberror_etext, function in shishi
shishi_krberror_from_file, function in shishi
shishi_krberror_message, function in shishi
shishi_krberror_methoddata, function in shishi
shishi_krberror_parse, function in shishi
shishi_krberror_pretty_print, function in shishi
shishi_krberror_print, function in shishi
shishi_krberror_read, function in shishi
shishi_krberror_realm, function in shishi
shishi_krberror_remove_cname, function in shishi
shishi_krberror_remove_crealm, function in shishi
shishi_krberror_remove_ctime, function in shishi
shishi_krberror_remove_cusec, function in shishi
shishi_krberror_remove_edata, function in shishi
shishi_krberror_remove_etext, function in shishi
shishi_krberror_remove_sname, function in shishi
shishi_krberror_save, function in shishi
shishi_krberror_server, function in shishi
shishi_krberror_server_set, function in shishi
shishi_krberror_set_cname, function in shishi
shishi_krberror_set_crealm, function in shishi
shishi_krberror_set_edata, function in shishi
shishi_krberror_set_etext, function in shishi
shishi_krberror_set_realm, function in shishi
shishi_krberror_set_sname, function in shishi
shishi_krberror_stime, function in shishi
shishi_krberror_stime_set, function in shishi
shishi_krberror_susec, function in shishi
shishi_krberror_susec_set, function in shishi
shishi_krberror_to_file, function in shishi
Shishi_krb_error, enum in shishi

L

Shishi_lrtype, enum in shishi

M

shishi_md4, function in shishi
shishi_md5, function in shishi
shishi_methoddata_print, function in shishi
Shishi_msgtype, enum in shishi

N

Shishi_name_type, enum in shishi
shishi_n_fold, function in shishi

O

Shishi_outputtype, enum in shishi

P

shishi_padata_print, function in shishi
Shishi_padata_type, enum in shishi
shishi_parse_name, function in shishi
shishi_pbkdf2_sha1, function in shishi
shishi_principal_default, function in shishi
shishi_principal_default_guess, function in shishi
shishi_principal_default_set, function in shishi
shishi_principal_name, function in shishi
shishi_principal_name_realm, function in shishi
shishi_principal_name_set, function in shishi
shishi_principal_set, function in shishi
shishi_priv, function in shishi
Shishi_priv, typedef in shishi
shishi_priv_build, function in shishi
shishi_priv_done, function in shishi
shishi_priv_encprivpart, function in shishi
shishi_priv_encprivpart_der, function in shishi
shishi_priv_encprivpart_der_set, function in shishi
shishi_priv_encprivpart_set, function in shishi
shishi_priv_enc_part_etype, function in shishi
shishi_priv_from_file, function in shishi
shishi_priv_key, function in shishi
shishi_priv_key_set, function in shishi
shishi_priv_parse, function in shishi
shishi_priv_print, function in shishi
shishi_priv_priv, function in shishi
shishi_priv_priv_der, function in shishi
shishi_priv_priv_der_set, function in shishi
shishi_priv_priv_set, function in shishi
shishi_priv_process, function in shishi
shishi_priv_read, function in shishi
shishi_priv_save, function in shishi
shishi_priv_set_enc_part, function in shishi
shishi_priv_to_file, function in shishi
shishi_prompt_password, function in shishi
shishi_prompt_password_callback_get, function in shishi
shishi_prompt_password_callback_set, function in shishi
shishi_prompt_password_func, user_function in shishi

R

shishi_randomize, function in shishi
shishi_random_to_key, function in shishi
Shishi_rc, enum in shishi
shishi_realm_default, function in shishi
shishi_realm_default_guess, function in shishi
shishi_realm_default_set, function in shishi
shishi_realm_for_server, function in shishi
shishi_realm_for_server_dns, function in shishi
shishi_realm_for_server_file, function in shishi
shishi_resolv, function in shishi
shishi_resolv_free, function in shishi

S

shishi_safe, function in shishi
Shishi_safe, typedef in shishi
shishi_safe_build, function in shishi
shishi_safe_cksum, function in shishi
shishi_safe_done, function in shishi
shishi_safe_from_file, function in shishi
shishi_safe_key, function in shishi
shishi_safe_key_set, function in shishi
shishi_safe_parse, function in shishi
shishi_safe_print, function in shishi
shishi_safe_read, function in shishi
shishi_safe_safe, function in shishi
shishi_safe_safe_der, function in shishi
shishi_safe_safe_der_set, function in shishi
shishi_safe_safe_set, function in shishi
shishi_safe_save, function in shishi
shishi_safe_set_cksum, function in shishi
shishi_safe_set_user_data, function in shishi
shishi_safe_to_file, function in shishi
shishi_safe_user_data, function in shishi
shishi_safe_verify, function in shishi
shishi_server, function in shishi
shishi_server_for_local_service, function in shishi
shishi_strerror, function in shishi
shishi_string_to_key, function in shishi

T

shishi_tgs, function in shishi
Shishi_tgs, typedef in shishi
shishi_tgsrep, function in shishi
shishi_tgsreq, function in shishi
shishi_tgsreq_rst, function in shishi
shishi_tgs_ap, function in shishi
shishi_tgs_done, function in shishi
shishi_tgs_krberror, function in shishi
shishi_tgs_krberror_der, function in shishi
shishi_tgs_krberror_set, function in shishi
shishi_tgs_process, function in shishi
shishi_tgs_rep, function in shishi
shishi_tgs_rep_build, function in shishi
shishi_tgs_rep_der, function in shishi
shishi_tgs_rep_process, function in shishi
shishi_tgs_req, function in shishi
shishi_tgs_req_build, function in shishi
shishi_tgs_req_der, function in shishi
shishi_tgs_req_der_set, function in shishi
shishi_tgs_req_process, function in shishi
shishi_tgs_req_set, function in shishi
shishi_tgs_sendrecv, function in shishi
shishi_tgs_sendrecv_hint, function in shishi
shishi_tgs_set_realm, function in shishi
shishi_tgs_set_realmserver, function in shishi
shishi_tgs_set_server, function in shishi
shishi_tgs_tgtkt, function in shishi
shishi_tgs_tgtkt_set, function in shishi
shishi_tgs_tkt, function in shishi
shishi_tgs_tkt_set, function in shishi
shishi_ticket, function in shishi
Shishi_ticketflags, enum in shishi
shishi_ticket_add_enc_part, function in shishi
shishi_ticket_decrypt, function in shishi
shishi_ticket_get_enc_part_etype, function in shishi
shishi_ticket_parse, function in shishi
shishi_ticket_print, function in shishi
shishi_ticket_read, function in shishi
shishi_ticket_realm_get, function in shishi
shishi_ticket_realm_set, function in shishi
shishi_ticket_save, function in shishi
shishi_ticket_server, function in shishi
shishi_ticket_set_enc_part, function in shishi
shishi_ticket_set_server, function in shishi
shishi_ticket_sname_set, function in shishi
shishi_ticket_srealmserver_set, function in shishi
shishi_time, function in shishi
Shishi_tkt, typedef in shishi
shishi_tkt, function in shishi
shishi_tkt2, function in shishi
Shishi_tkts, typedef in shishi
shishi_tkts, function in shishi
shishi_tkts_add, function in shishi
shishi_tkts_add_ccache_file, function in shishi
shishi_tkts_add_ccache_mem, function in shishi
shishi_tkts_default, function in shishi
shishi_tkts_default_ccache, function in shishi
shishi_tkts_default_ccache_guess, function in shishi
shishi_tkts_default_ccache_set, function in shishi
shishi_tkts_default_file, function in shishi
shishi_tkts_default_file_guess, function in shishi
shishi_tkts_default_file_set, function in shishi
shishi_tkts_default_to_file, function in shishi
shishi_tkts_done, function in shishi
shishi_tkts_expire, function in shishi
shishi_tkts_find, function in shishi
shishi_tkts_find_for_clientserver, function in shishi
shishi_tkts_find_for_server, function in shishi
shishi_tkts_from_ccache_file, function in shishi
shishi_tkts_from_ccache_mem, function in shishi
shishi_tkts_from_file, function in shishi
shishi_tkts_get, function in shishi
shishi_tkts_get_for_clientserver, function in shishi
shishi_tkts_get_for_localservicepasswd, function in shishi
shishi_tkts_get_for_server, function in shishi
shishi_tkts_get_tgs, function in shishi
shishi_tkts_get_tgt, function in shishi
Shishi_tkts_hint, typedef in shishi
Shishi_tkts_hintflags, enum in shishi
shishi_tkts_new, function in shishi
shishi_tkts_nth, function in shishi
shishi_tkts_print, function in shishi
shishi_tkts_print_for_service, function in shishi
shishi_tkts_read, function in shishi
shishi_tkts_remove, function in shishi
shishi_tkts_size, function in shishi
shishi_tkts_to_file, function in shishi
shishi_tkts_write, function in shishi
shishi_tkt_authctime, function in shishi
shishi_tkt_authtime, function in shishi
shishi_tkt_build, function in shishi
shishi_tkt_client, function in shishi
shishi_tkt_clientrealm, function in shishi
shishi_tkt_clientrealm_p, function in shishi
shishi_tkt_clientrealm_set, function in shishi
shishi_tkt_client_p, function in shishi
shishi_tkt_decrypt, function in shishi
shishi_tkt_done, function in shishi
shishi_tkt_enckdcreppart, function in shishi
shishi_tkt_enckdcreppart_set, function in shishi
shishi_tkt_encticketpart, function in shishi
shishi_tkt_encticketpart_set, function in shishi
shishi_tkt_endctime, function in shishi
shishi_tkt_endtime, function in shishi
shishi_tkt_expired_p, function in shishi
shishi_tkt_flags, function in shishi
shishi_tkt_flags_add, function in shishi
shishi_tkt_flags_set, function in shishi
shishi_tkt_forwardable_p, function in shishi
shishi_tkt_forwarded_p, function in shishi
shishi_tkt_hw_authent_p, function in shishi
shishi_tkt_initial_p, function in shishi
shishi_tkt_invalid_p, function in shishi
shishi_tkt_kdcrep, function in shishi
shishi_tkt_key, function in shishi
shishi_tkt_keytype, function in shishi
shishi_tkt_keytype_fast, function in shishi
shishi_tkt_keytype_p, function in shishi
shishi_tkt_key_set, function in shishi
shishi_tkt_lastreq, function in shishi
shishi_tkt_lastreqc, function in shishi
shishi_tkt_lastreq_pretty_print, function in shishi
shishi_tkt_match_p, function in shishi
shishi_tkt_may_postdate_p, function in shishi
shishi_tkt_ok_as_delegate_p, function in shishi
shishi_tkt_postdated_p, function in shishi
shishi_tkt_pretty_print, function in shishi
shishi_tkt_pre_authent_p, function in shishi
shishi_tkt_proxiable_p, function in shishi
shishi_tkt_proxy_p, function in shishi
shishi_tkt_realm, function in shishi
shishi_tkt_renewable_p, function in shishi
shishi_tkt_renew_till, function in shishi
shishi_tkt_renew_tillc, function in shishi
shishi_tkt_server, function in shishi
shishi_tkt_serverrealm_set, function in shishi
shishi_tkt_server_p, function in shishi
shishi_tkt_startctime, function in shishi
shishi_tkt_starttime, function in shishi
shishi_tkt_ticket, function in shishi
shishi_tkt_ticket_set, function in shishi
shishi_tkt_transited_policy_checked_p, function in shishi
shishi_tkt_valid_at_time_p, function in shishi
shishi_tkt_valid_now_p, function in shishi
Shishi_tr_type, enum in shishi

V

shishi_verbose, function in shishi
shishi_verify, function in shishi
SHISHI_VERSION, macro in shishi

W

shishi_warn, function in shishi

X

shishi_x509ca_default_file, function in shishi
shishi_x509ca_default_file_guess, function in shishi
shishi_x509ca_default_file_set, function in shishi
shishi_x509cert_default_file, function in shishi
shishi_x509cert_default_file_guess, function in shishi
shishi_x509cert_default_file_set, function in shishi
shishi_x509key_default_file, function in shishi
shishi_x509key_default_file_guess, function in shishi
shishi_x509key_default_file_set, function in shishi
shishi_xalloc_die, function in shishi
shishi-1.0.2/doc/reference/html/shishi.devhelp20000644000000000000000000025164012126773323016277 00000000000000 shishi-1.0.2/doc/reference/html/index.html0000644000000000000000000000321212126773323015340 00000000000000 Shishi API Reference Manual

for Shishi 1.0.2 . The latest version of this documentation can be found on-line at https://www.gnu.org/software/shishi/reference/.


shishi-1.0.2/doc/reference/html/style.css0000644000000000000000000001210012126773323015211 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } shishi-1.0.2/doc/reference/html/api-index-0-0-42.html0000644000000000000000000000415012126773323016626 00000000000000 Index of new symbols in 0.0.42

Index of new symbols in 0.0.42

S

shishi_keys_from_file, shishi_keys_from_file ()
shishi_keys_to_keytab_file, shishi_keys_to_keytab_file ()
shishi_keys_to_keytab_mem, shishi_keys_to_keytab_mem ()
shishi_key_timestamp, shishi_key_timestamp ()
shishi_key_timestamp_set, shishi_key_timestamp_set ()
shishi-1.0.2/doc/reference/html/up.png0000644000000000000000000000062612126773323014503 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚shishi-1.0.2/doc/reference/html/components.png0000644000000000000000000031474712126773323016260 00000000000000‰PNG  IHDRy†6ã sBITÛáOà IDATxœìÝy|Õþ7ð Mw–¶tƒî,Vi(eÑ«EÄbAZ–/* ‚RZŠÊ* -n¸²*R(Ø^,‹H¡@¤€ÝB÷–î{š<ÌsÏon–É$™$“ôóþƒ×épæÌwΜIfNΜÉår O$QE,¤‘Fi¤‘Fi¤‘Fi¤‘rºÀ‘H$¢»@˜p€À¼ˆD"Œk:z €YËåèk"fÿÆ5€yA_ƒà £Ìž¡"ô/€YÃÔƒBÁ|;€ù¸AGXŒk0%Œe ƒùL ½ `y0®Á0œ,Æ5Ÿ0®Áx0œ,ækž¡¯Áàèá 4 jË&—Ëñ …a‘ŽÔ3tèk0‘u ]æk0æs] ~{>‰M€åÀÔ ÞCÁ#º‹ Еa¾ˆD"Œh Ð× /ô/r¹sCêˆË€ÚP€q ÀÌ× 5æÔ Ô  } Z#Ý  ó5p%¡¢8Á¸Íè Π‘H$›:3€ ÜáѵðVKà EÌg%ÐÑ -ŒkøÌWZš6s$‰0®áÐ] èhÐÆ5P¦fàÞC–ï)gŸÖÀhºô¸ g0kèYЮ„ÀD"Æ5€ùQ×Ë€›gÊ•†ßÞÀ@ºâ¸‘¨+î5€eÀÊy„ÊérwÝx«%€™Â± b€w]¥¯ÃÃÌ~124Ô0ðE$u3u à6ØHÝbÆMП…kÀÔ æ Æ„Ú^Xþ¸ô˘/ÜúF7/,³¯ÓÛXt4˜º@O–9_:, ®èŒuz²À¾|2X¼GÌ´èšÇÐÐ\.›:Þ0¿ðÄE[[Û/¿ürîܹ«W¯ÕÖÖ6559::öêÕ+ àÑG>|ø³Ï>;`Àör 1ÄhƒSÌ:xa²œ×4 ç›»ÖÖÖ¤¤¤O>ùäáÇ3ûûûO›6-**jðàÁ*3˜õíºY`Á,ìÒÎ|'ž°°Æ!2÷WBâ³OýõפI“îß¿¯íŠêêÙ¬o×Í:x f‘—yæxím‘ Íìç†ÄSdÚÊÍÍ}æ™gHGƒX,ž>>ééé<òˆ!÷@‚= Xfö ΀± º9xð I¯[·ŽcGEQ£GV×Ñ`Ù.]ºÖ½{w‘HäèèXUUE/?|øpzzúðáÃ}}}=JòÓ E988H¥Rî*--íׯ‘˜9k@—ªžú÷—G§KJJúôéÃK±f=4À¬ƒ°T‚ºêóññÙ¼yó‹/¾Ø«W¯†††^½z)vòäÉÙ³g—––RJ#ØÿTÞÆ5€Å0ƒq ¸äKyy9I»ººt[ÅÅÅñññO=õ”«««µµµ‹‹KPPÐ?ÿùÏóçÏó»¡ßÿ}ùòåÏ<󌗗W÷îÝ­¬¬\]]ƒ‚‚^xá…ØØØ¯¾úª  @˜Á€ðµ´´ØØØØÛÛÌŸ?Ÿ,ŒŒ¼}ûv{{»L&ëììÔ­pæ…nttôâÅ‹}úÅ_$öèÑcåÊ•óæÍsww×§XåÏ‹¸¸¸µk×*/ÿç?ÿ¹{÷n:moo_ZZªî]ìMkÖ¬IHH Ó!!!éééNNNê»páš5k222<°3ë_Ñ-’Ù\Œ M—" ûyf¿£i#±`'NLMMe.±²²=zô3Ï<3räÈÁƒûùùuë¦Ýh…Ûò%K–ìØ±Ceζ¶¶ÀÀÀÂÂBúÏ””æKêÊTnÆ »~ý:þí·ß´ X݆(£ìÌîÎÖâ™×Á=…ðáuÂz†BþßÙqLˆ%Û·oߨQ£˜K:;;/\¸˜˜øÊ+¯ôëׯ{÷î¡¡¡±±±?ýôSSS“¶å»»»oÚ´IÝÿÚÚÚÆÄÄ?Ï;§mù´üü|’æ>=¤FÆ  7±fùH…i#ƒ2}_ƒÂ“T¦ ÆâõìÙ333óßÿþ7óL---W¯^ýøã'Ožìéé9{öl­¦u˜={¶½½=K†gŸ}–¤ÉØm1§„¬®®Ö­eÆ  ÷fÝ O.—›¾¯ŸFfcc“˜˜˜———Ä’³±±ñ«¯¾4hÐêÕ«e2—Ÿ{î9ö $]QQÁ¥Ležžž$½aÃÝ QfœàÀät»½ÁM‘¡£Áì »Áâ™l¾ózîË‚ž;wîÒ¥K7oÞ¼uëVUU•ÊláááGޱ²²Rþ/æ§Cii)³#@Ykk+;`kkÛÚÚª2û”o¾ùæwß}Gþ {ûí·'L˜`ggDzi2NðÀÎW‰êæ gŸ›\·µô§í]4ïñÿº æ ÇÎR‰Lø®áfuMÅÅÅ.\øå—_~þùçúúzæ-_¾|óæÍÊ«0o­[[[mmmÙ7ÁåVœ=Ï•+WF¥0ÔÂÁÁá©§ž 9r¤Æ0L<°3a_ƒ!Öâ —­ÇÄÄlذÁ××·¨¨hÍš5{÷îåkÓ”°¯j„!°Àá³H&˜Rá%·FÞ:häåå5uêÔo¾ù¦¨¨hõêÕÌ ;vìÈËËc_㾞BCC?úè#……ÍÍͧOŸ~ÿý÷ÜÇÿõ×_3gvÐÈ8Á€1ûÌ´QË–-;vìXÿþýUþoKKKZZZLLÌ€öíÛgäØ@8fΜ×ÐЙ™™••E–§§§Ÿ?¾¶¶6""bîܹ¼¬¥,<<<66¶¢¢¢¢¢bРAË–-ã·|eô•6®· J$<¦®Œ4LôßA_"“Ž=üë_ÿúôÓOéôÈ‘#ÿøã… "-à’Ÿc™R©455uÿþýééé,“5nذáý÷ß×gCZå×¶L`ñú3µŸŸß²eË^}õU___æ&ªªªz÷îMQTsss¯^½:::(Æ•ªnk±knnö÷÷§¯X´*Ÿü/÷g( ×®]Ûž¡rl|ÑêÊ|ï¶„|(…y'¯‘i+Sdœg(DŒîUa¶`MÒùùù&ŒD™X,ž4iÒ?üP^^~ûöí”””éÓ§»»»+d[»v­r t‡NOO>|¸¯¯ïÑ£GÉrú–ž¢(©TÊËZÊ.]ºÖ½{w‘HäèèH&áæ«|{÷îõññ¡(Ê××—¯Ž0111‰„¢(‰Dcêp,„º!ráá¼ñ˜ºN@è˜3DZ[[+gж9qɯOíììÌÈÈxñÅ™…DEEñ²!CúMMMõôô$›PØ¢Êå:¯Ex{{ïß¿¿¦¦F&“ÕÕÕéV¾Æ­š`¯jX{{û²eË\]]œœ¶lÙB/¤(jÛ¶mtg««kee%ÉìææFxÙ´i“»»»ƒƒÃ¬Y³Z[[åª.,[ZZæÎÛ³gÏž={Λ7¯¥¥…^.‘H¦L™BQÔäÉ“% —„FP”ú_¦GkBˆß€ãLß|èÖíÿ‰³³³ #á¨[·ncÇŽ=uêÔœ9sÈÂóçÏ›0$0•ÈÈÈÛ·o···Ëd²ÎÎNƒ®¥¬¥¥ÅÆÆÆÞÞ¾  `þüù¼—ÂwóæÍììì¼¼¼¢¢"²üòåËÙÙÙr¹<22299™^˜‘‘1jÔ(777Š¢233srròóóKKK×®]KýwT8óîqõêÕ%%%÷îÝ»{÷nAAóIa‘úÙ:Ô…*‘:Twë.| a›æÆÜpÝ-Œ&;;›´–¡C‡*gж9qÉÏKe¾5ÃÖÖ–— -x€.‹ßïÐ}ûöŠÅâààà´´4² …-*$t[K=•µX,صk—Îå›öêB°W5‚ ÌÛÛ;77Wa!EQ%%%t://ÏÇǧ½½].—/X°àÀt†{÷îÑrss½¼¼ÈŠÌrúöí{÷î]:}çξ}ûÒéèèhº¡°°0::šKHB#jyWò&Ù#Š÷¹!™=@< ¼xõÕW?ùä///­Öz÷ÝwÉ &—.]ºuëV… ‚^±­­ÍÎÎŽN;99ÕÔÔè¿!Ì `h˜äKh{D˜X,nmm%os£)ÌÚøÆo„‡‡GEE 4èúõëvvv"‘H*•Ò¯œ—J¥ööö*'‹ÅmmmÊÙTn…=$¡ÂµÔûYãïÿsCÊÿÛñÆo±À‹£G>öØcüq{{;ÇU²²²vìØAþ¤Ÿ37nÜ iuoÇàWŸ>}˜lUZ±bÅŽ;.^¼øÔSO‘ŸÇÈDìyyyžžž*Wôðð`fóðð`þ¯º1.!éì°¼ûÙÿk`¬‡)ä|Í×ÀœšÁòŒ%ihhˆí×¯ßæÍ›Ø3ÿðÃÏ=÷é˜xýõןxâ ÃǨو#¾úꫦ¦&–<µµµ‹/&¾þúë† º.#¿îÞÈ›­DGG/^¼øÁƒµµµ±±±*󄆆:::®\¹òÍ7ß$ ß~ûíŠŠŠŠŠŠØØØéÓ§Ó œœrssIžÈÈÈeË–UVVÒÙ"##Õ…Ál\BêâºÎId´=5Æ;/AhŠ‹‹W¬XѧOŸ)S¦¤¤¤\½zõáÇ---eeegÏžMJJzüñǧOŸNú#?ùäÓ†M\¹reöìÙ½{÷~饗¶lÙò믿J$’ÆÆÆÎÎκºº«W¯&%%]¾|™Îð¯ýË´1€eSù¸²ÅlN€„0Þ^uëÖ=öØcC† éׯ_@@€ºlï¼óNqqqXXY6xðà€€OOϸ¸8’-44”Ü&$$xxx 0`àÀÞÞÞ6là1¤.«‹üpNöÎÝ "uÏóp_Ÿ²ôãaItnRO>ùä‘#GÜÝÝ5kœ)´Úooï´´´AƒéŒ¶ù1_€>p…)4Â<"ÂŒJ+»ví*..NLL¤ÿÔóÖ̘ð˜Z@sâÎ8;Ëÿ| dýõׯGŒÁ|%»Aƒ}ýõ×çÏŸW×Ñ d"‘hæÌ™YYYê:L¢®®nç΋-2u е:CmËåºtž¡ËÍÜÕÕÕýþûï—.]ºsçν{÷JJJZ[[zôèáææüøã?þñÇ×Xšñ‡”––^½zõƹ¹¹yyy¥¥¥ÕÕÕÍÍÍ2™ŒÄÿä“ON›6ÍÛÛ[hÁ;¯ûu»FÕÿÊÖ⯅y'&̨8‰DVVV;wî|ë­·˜ Ítwøbªcʾ]åãbGÊHC´Ý€@e±€ Êxïk`¿nÔm-ÝrÒNŸ>½yóæsçÎ988L˜0aëÖ­< ÕöZKð¼«fT “S§ 9G”&ÁËÖpS¯Ý3ÌW€à¬³ Û…«á.w·lÙ²téÒªªª¿þú«W¯^,ïÐ÷ õ˜˜‰DBQ”D"‰‰‰á1³Ã嬱¤[`ãì ×¾A½„FP!€ÑœøàGGÇÙ³g·µµÑ [ZZ¢££É'ÉßÑѱ|ùr777ggç­[·’Òè‘HäææVUUE2»»»WVVŠD"å­a•P*7d*r¹œk_Æ2€@Ìœ93..®¡¡!333++‹,OOO?þ|mmmDDÄܹsyYKÙš5k*++ nܸ‘‘‘A–oܸñÊ•+ÙÙÙååå¶¶¶+W®$ÿuùòåììl©TªPÔ™3gžxâ :QQQQ1hРeË–ñ¶2ü€§'ݪÎhŽ#k8™™™999ùùù¥¥¥k×®¥®Y³¦¦¦¦   '''33“dŽ‹‹»yófvvv^^^QQYN,ÈåòÈÈÈäädzaFFƨQ£ÜÜÜTn…¾%Wwo®nC&£ün^å÷ô²ç12­âóÂåÏ××wûöí……… +VUUÑ馦&±XL–ë³–2//¯{÷îÑéÜÜ\’ÓÏÏïæÍ›tº¬¬ÌÃÃURR¢\Ε+Wú÷ïOŠbjjjrssÓ!lÁÑÑÑôÝHaaatt4KNa^u !*u°¦ÛZ:äç¥~ŒYÉ&9¦7J1îíI‚ù àååE§½¼¼îß¿O§ïÝ»Gò{{{çææ*K>òòò|||ÚÛÛårù‚ 8À²–hUnˆe¿ ZÛ”º¹!2ï…J ýsB ô¤qЏ¬¬¬ 6üþûïöööüqDD¥táª|A«ÛZÊÄbq[[›••EQR©ÔÚÚšÎIr¹\&“‰D"™L¦®¨ÿüç?³fÍúñLJN/¹téһロM?|AV×*l•²ÀÜzÆ CF»ÃÒsC1116lðõõ-**Z³fÍÞ½{ù M5ΠɲQ•sCJ¥Rò `ooßÑÑA©ÿd‹Å­­­ô#TÊÅÒÞxãðð𨨨Aƒ]¿~ÝÎÎNÝVØ?š”7¤óŽëI$©èÉ ÿÿž >¨Ü S|â~—ššêééIÖR(Dår×"¼½½UŽkðññ‘H$Êù•‹Ú¿¿——×Õ«WŠÝ¿MML&«««Ó-lÁë@˜—ÜFŽ*555((ÈÚÚÚÏÏ/%%…İ{÷n???kkëaÆݸqƒ,×g-eíííË–-suuurrÚ²e‹B~Š¢6mÚDO2kÖ¬ÖÖVö I¥ÒU«V¹¹¹ÙÛÛGFF666’üÛ¶móññ±²²’Ëå‰dÊ”)EMž‡¯rúuâ>±ˆÅÏè!ÿï8mW|ûí·é©Ubcc§OŸN/œ6mýŠ™ÊÊJ2ß EQÑÑÑ‹/~ðàAmm-óƒ)44ÔÑÑqåÊ•o¾ù&ûVœœœè.N3x.2*cvlè‰Ë^€¹Óx·oß¾ÀÀ@±Xœ––FÖR(D!¡ÛZÊZZZbbbìííÝÝÝ?üðC’³³³sãÆôÏÈC‡=tèºM(hhhËåÇŽëß¿¿X,صk—Îaó~‘,Ìëm#GeÚ)BاÔ?دrC'á>£_LÒÒ4nTù3¢¨>ø€HÓÒÒB/ojjš1cýÉ””D?C!—ËÛÛÛccc]\\œ·mÛ¦Pqüøq???™Lƾ•„„„îÝ»«ü¤R¹!w\Os¾!<òÄŽ¥ÃIÈa€V„]Ú¥óp9*“OÂòÀ?ÇûÉŸZM,bÌùû„9_ƒnîܹóÒK/åååq_e×®]ÅÅʼn‰‰$0ƒV…ækèF^ÎÉìÞ ö‘-<°LkĈÇŽ«¬¬LIIyë­· º–²>}ú°ßµæççÓ‰¼¼,++[±bݵÄQ]]ÝÎ;-Zd¸ØŒL®r¾"¿Öš:J¤ÄÔéBŸ½æ ã3í!ŸÃWù`¿:'>öØcìÙ³g||<ǵD"QïÞ½—,YÒ·o_ƒ†gdb³øà`~ *LþK€¯ç³f——–±¦õÊ+¯¼öÚkÿý÷£>úÝwßt-eëÖ­[±bÅ!Cär9sêG",,lðàÁS§N‹‹c/mÕªU"‘hܸq%%%AAA«W¯Ö90‹Á×½ä¢E‹t› rÓFx€Â DærÎå­§ìÀ¼àÏä„|„›‘™Ë=F¦:¦]°-a—E"‘Ø,jVåXæBÇ`rÆy ó5€@ gÖ†®É,~’´<–1Eˆyéš5F8µÍc¾æ3èÆb†ˆ›‘®vß%:4uœ|é 5F;µE"Æ5€@‘ë~Üú©m‹¿ï u‘#ŸÚÝÌqdŽ9Æ :è"÷ÂŽ蚺Nƒ7Ξb¾:t7 :Ý_M”—rp¾h‹LÜ`yUGvʘ§v7¹\nv%æ3è Ý F€Ž.LÛ!L–´wùQc’Só5€y`ÞXÒm€0« ìt«K­Õ˜˜‰DBQ”D"‰‰‰1u8ü°¤îÓžÚ˜¯Ìsp+.y¡p+b©·ÄìNž<lccãïï¿gϲ<99Ùßß߯Æ&$$$''‡^HªK·µ”utt,_¾ÜÍÍÍÙÙyëÖ­ìåtvv¾÷Þ{îîîQQQMMMì…в²²¼½½?þøcua+„Gþ‰DIII...žžžGMJJêÝ»·§§çéÓ§é Ë—/§(jéÒ¥ ìõlF>gÌñ£F!lãŸÚ˜¯ÌŒrèL¹J» ™3gÆÅÅ544dfffee‘åéééçÏŸ¯­­ˆˆ˜;w./k)‹‹‹»yófvvv^^^QQ{97n¼råJvvvyy¹­­íÊ•+Ù ¡(ê§Ÿ~š8qbrrò’%KXÂV§¼¼\"‘$&&Θ1£¼¼¼¨¨(11‘î_ Ñ­Hd†wãìï_L IDATN SŸ©ZS·#ÆdùoK%²¸;#3ß{Ýùùù-[¶ìÕW_õõõe–_UUÕ»woŠ¢š››{õêÕÑÑA/§7ªÛZÊ|||ÒÓÓyä…½SYŽ¿¿ÿ‰'‚‚‚(Š*//2dHYYK!~øáŽ;Ž;¾³ ÷Õd–Äêêj—¶¶6;;;’vtt”J¥EÅÄÄlذÁ××·°°píÚµ{÷îÕ²îÿÇ”_fú9cÚš±4zaâñ¾4++kÆ ¿ÿþ»½½ýÇA±Þ~Ó ÝÖR&‹[[[Åb±ÂÞ©,ÇÚÚšNÈår™L&‰d2K!ýúõ‹ŒŒd>Ý sØêÒì{§Áö5ð®+ìéÿ ®0¯ýì ÇÔ1ÄÁÉ“'gÏž]ZZJiÓk ÛZ„º! *Ëñõõ½xñ¢··7ÇB$ÉØ±cçÏŸ¿bÅ –µ¶¶®¯¯···§(ªººÚÕÕU«¾¾t…»<‘IçP02Ì×EQ---?ÿüóòåËŸ}öÙ€€€=zˆÅâž={úùù…††Î›7ï³Ï>ËËË3u˜‚¦òù(å#ûóÏ?W¬XÖ§Oåc„#kÁ wà4¶+Е¼ˆŒŒ¼}ûv{{»L&ëìì4èZÊ¢££/^üàÁƒÚÚÚØØXöÌ .œ7oÞýû÷¥Ré­[·¢¢¢Ø ñööþí·ß¾øâ‹¤¤$–°‡ òÑG577/\¸Pç} ßVßÑ@Qÿ+º¬‚‚‚E‹uïÞ]cS‰DcÆŒùæ›o¤R©©£".§_yÀhšššØ_àDgѵ`†8pÛh„JèÊx<÷÷íÛ(‹ƒƒƒÓÒÒHù ›SHè¶–²öööØØXggçmÛ¶±—ÓÙÙ¹qãF???kkë¡C‡:tˆK!¥¥¥=öX||¼º°³³³‡ &‹}||>ùä•a«KóÈR?Ï»æw=…¹!»²ÎÎΤ¤¤ÄÄÄÖÖV­V Ú¼yóøñã ˜™âÒOÉW0š)S¦>|˜%ƒü¿# –(Ñ5S†8pÛUW£CUã´èʺÂxû®ÆòŽ)˰;KÚM•0_C×U__ÿꫯfdd%ÎÎÎãÇñŇ æêêêêêÚÑÑQZZš“““––vðàÁÚÚZf ¨èk°<Ï=÷¶±±Y³fÍÔ©SýüülmmrâÈZ0Þ÷vÕÕ ¯´‚;ËcIÇTãÃ}–±›ìÐ×Ð566Ž;öÊ•+ôŸo¿ýöÊ•+{öì©n•æææ”””„„„‡ÒKPÿ Ð×`ybbb¾þúk:””´jÕ*u9qd-ïŽ{»êjÐ×Z1Ç;åûOóŠßÐÌñ˜*ã8…¹ï&x†¢Ë‘Ëå“&Múå—_è?=<¥áÈš)Þ¿íÊ’à­XÆ})0YÒ1eïq°Œ}d'‰ðŠ.'%%…t4¸¹¹]¼x‘cGEQÇ÷Ýw €€Ðo¢ùøø˜0°$hW9Eb—%6ÇÞ#sŒY êêêV¯^MþLIIÑö'5‘HôÁ8::ò€à444´µµµ #K‚vÐuÈår‘HDÿkêXŒJ.—‹MÕ'Ÿ|B&\xõÕW_}õUÝÊY»v-{†œœœcÇŽ9s¦¨¨¨¢¢‚¢(www??¿çŸ~Ò¤IƒÖm»E:tèĉ‰¤¬¬¬±±ÑÆÆ¦­­M9gSSÓ©S§RSS¯\¹RQQñðáÞ={zzzŽ=:<<|âĉVVV:‡ad‰äÀ¿üò‹D")--µµµíӧϨQ£¦L™2~üønÝt ¤±&KJJ._¾|ýúõ;wîäçç—––ÖÔÔ´´´ØÙÙõîÝÛÏÏo̘1¯¼òJhh¨>»Æý€v5<6àßÿýðáÃW¯^½wï^]]]KK‹­­­ƒƒƒ‡‡‡——×c=6tèбcÇúûûë³qÚLqqñ_|qúôé;wîÔÕÕõèÑ£OŸ>cÆŒ‰ŠŠzê©§¸—#“ÉNž}úøøø¼üòËo¼ñ†···>Aš¾ª”¢(©Tú믿¦§§Ÿ?¾¬¬¬²²²­­ÍÞÞÞÕÕÕÇÇ'((høðáÏ>ûl@@€ö…á¾›x©C£ªÀ;úfÒ8kéiÿþý±±±øáÖèCÜu«Zçf‚Ù‘Éd~~~äÐÿç?ÿ1ÄVîß¿?yòdöV7eÊ”¼¼ýôS–‚‚‚222xÜq.§•yZ[[/^ÌÒ›0räÈk×®iÇšd©=¦‰'r9šÚ†B–ÄÅÅq)_.—¿ÿþûd­Žké°×d/Tî—ÝgÁc¾víÚÈ‘#µÝqÜÎmF*•®[·ÎÆÆF]É“'OnhhàRòµk×FŒ¡®++«ØØØÖÖVå Z3 [ÑvÓ\ò®J;;;¿úê+Žcåô¯m«ÈpßM¼Ô¡‘OUË ¨3B]$ìê¶–nH™>>>.\à˜ÙÈuLõ§ü¹Ý¥>É»Ê~¼x‚¢¨GyÄ›øí·ßzõêÅåRÉÙÙ™ËÇÑØØøÄO¨,ª[·n̵êêêÈûäØuëÖí³Ï>ãkß™%ó•§©©éé§ŸÖ¸#vvviiicã^“\êæîîž••¥Ui #%%…,ñññ‘J¥Ë—J¥^^^d­ääd«°©‘ʵ¸”Ì øÌ™3ööö:ìŽÎ¸oK‡6ÓÖÖ6iÒ$%=šî#`qòäI./˜ knn楊¸× eľ«´®®nâĉ:ì£Î•£U—:4þ©ÚEp¯Ò.ÅÔ‡…O‚Ú#Ý"1Iü"‘H&“©ûßèè袢"Š¢ŠŠŠ¢££—\.°cÊ JÍWž©â1&sýÜ1ǘ…àƒ> G|áÂ…¼—ñâE;;;²‰^½z­]»öúõëuuuõõõ×®][³f óµšöööüñK̯ÆÈÈH:1xðà={öüý÷ßÍÍÍ ¯¼ò Y¥¾¾þñÇ'kYYYEGGŸ8q¢´´´­­­¬¬ìÇ3f ³äï¿ÿž—ÝçòE®mžéÓ§Ó —õë×߸qƒ®Ì7nÄÇÇ»¸¸œvvv,×Ç:Ô$YË××÷í·ß>xðàÝ»wkjj:::*++322–,Yâàà@Šõòòª©©á^EÃhhhèÞ½;ÉüøqöÂårù±cÇH~GGÇúúz«°©‘ʵ¸”¬. ¸¢¢‚ÙBúöí›ðÇTWWwtt466¥¦¦®]»öÑGeŠ;ºµ™9sæÐ‰ÐÐн{÷æçç·´´<|ø0--í…^`æü÷¿ÿÍRæ… ˜ ½{÷Þ°aCNNN}}}]]Ýõë×ãââœéÿ1c—DZf8R¹–¶[á’‡¯*­««Sxú ,,,%%åÎ;µµµmmm%%%éééñññAAAÊáéV9ÜwÙ ßMúסINU‹¤UC&S:Ý™*þÔÔÔ   kkk??¿””ÌîÝ»ýüü¬­­‡ vãÆ ²\Ÿµ˜®_¿Þ¿ÒM “ÉúõëwãÆ ©TºjÕ*777{{ûÈÈÈÆÆFRȶmÛ|||¬¬¬H™ÌCïêêZYYIgnoowss«¨¨H$S¦L¡(jòäɉ„ïÊÓÀÜÛ$¿ƒLfù)cŽ1 ÁÔ©Sɇ˗_~ÉoáõõõÌ¡³!!!>~ܸq‰¤¾¾>&&fÑ¢E¤ÈÈHÒ›@Ê$‰Å‹oذNŸ:uо֒H$ô-˜Þµ¥óm ,fGô„*èB˜ï¶Tw£3æÕ’¯¯/=ߌJ¥¥¥}ûö%™×­[§.§Â·ào¼ÁÑ#GHæž={Þ»w%ó¼yóHæÙ³gkÚ?͸|ak›‡¢¨°\zVWW3§X‹çR¦ÆšäîîÝ»ä—j–»¸zõ*ÉleeUTTÄ’ùÁƒ̹/]º¤Ëþ¨XÿœóðÛ€™çûo¿ýÆ¿1éÓf–,Y¢.gkk+s>ò“‘‚õëדþøãÚî…Æ€õÏ©1¿ ˜ùtzKK {iF¦[›qwwW7r‡¶nÝ:’yÆŒÊè7MèvrqiñÛ®´ÍÏo•Êåræp€?üKœúįÕ*FønÒ¿…|ª ï'&˜c•š*ÚË—/‡‡‡Ó¯×9rä F!6…„nk)xøða¯^½ª«««ªªœœœès±XleeeeeEÏ·Í|ñÆÂ§Núí·ßvvv2?‚LÕ Ì«;óûL¡™cÌBÀ|D™ý·DmýôÓO¤äjÌ/“ɘ?=zTe6æ×žÆßÀ™3_zzzª»FdZ¼x1YEÿ‡J¸|Ik›'((ˆË¦ÉC¼EýòË/ìeò8¨vöìYRøüùóYrêÆž={È*ÞÞÞêfˆìììdþx¸sçN]ö„5`ýs²çá½3gÅW9hÜ„tk3«V­b/ö·ß~#™ƒƒƒ•30ût8¹46ŽømWÚæç·JÏ;G2¸¹¹qi·zƯÕ*FønÒ¿…|ª ¿§$0™WÝš<ÔÔÔTOOO ó¿(õ½º­EL:uûöíÛ¶m‹ŠŠ¢—øøø¨|ØKáYYY¡¡¡çÎãåáSý™ü˜êÏÜãç—Úéåioo'iæ¬{ú»páIO›6Mc~‘HD¦TX]3œ§§§“ô¤I“X^?FŒ7ޤÿýwù9Å f3/ýUÒj®x.ÈdoEeggs\‹c‘‘‘=zô Ó<8qâ„ÊlgΜ),,¤Óööö óù™Þ°§§'I3çwÝÚŒÆ×s’tEE…ræÙ¡ÃÉeyô¯ÒŒŒ ’ž1c—vkLFønÒ¿…|ª “H$¢rõS€ÎH­’ze‘‘‘·oßnoo—Éd]KÙìÙ³?ÿüó/¾øböìÙô’… Λ7ïþýûR©ôÖ­[̹Ÿ4 utt\¹rå›o¾©sHêüÿWÜ™: í˜cÌBÀ¼ lllä±ä?þøƒ¤™ãÀY0³]ºtIc~æ­*1ï"¸Ä0dÈ’fþª,Ì©Y0'±c •4Ö¤¶˜3¨—••q\‹cÝ»wg~e2_„ÉôÙgŸ‘ô”)SÈÃf„÷Ì,$%%e̘1GŽimmÕ/L~èÖf‚ƒƒÙ30Ç¢×ÕÕ)g`ž:œ\–Gÿ*ÍÌÌ$i./è52#|7é_‡B>U F€î^yå•×^{ÍÑÑqÕªUß}÷A×RöüóÏ×ÕÕ566>ûì³ô’U«V………7ÎÁÁaÆŒ¯½öšV¾óÎ;ÅÅů=@#|:"úyS‡FâææVUUE§ }}}ù*9    €N0G³«“ŸŸOæïׯßßÿ­œ‡ù%WUUÕ»wo–ïÞ½K§ÿøã.wÍÍÍŽŽŽtÚÛÛ["‘h\…3Zu§•¶yŠŠŠ|||4nº°°ÐßߟN«¬L­jRASSÓñãÇÏž={ëÖ­‚‚‚†††††™L¦2s=êëëÕ¥[×®] ¡ÓݺuËÏÏWhºååå>>>ôŸçÏŸÿÇ?þÁ¥d¸/î9ÙóðÞ€¯\¹2jÔ(…#åààðÔSO………………9’ù\ ÔfZ[[5Ì^ÉýúõËÏϧÓ:œ\*ËÔ¿íJÛüüVéÀïß¿O§ÿþûoæt íþj\ÅßMúס OU³ƒŽc2‹Ú¦ƒr„fa×®]ÅÅʼn‰‰¦„¢Ìù˜šoä†ó_VƒWæ³0IÎÎÎæ±d…ßm¸¬R[[KVqvvV™‡ÙXé9rY¸ºº’Ì666¶¶¶666666ÖÖÖÖÖÖb±˜ž8§[·nݺu‰D ½õŽŽŽZï¶úhùÊS__ÏeÓÌßÊTV¦V5I466®^½š¼2€ 2‘Æ]ã†\. %+®Y³Fá7mÚDþwРA܋ՈËñâž“=!ð–-[X–½½ý‹/¾¸wï^ö™í´bÐ6Ã%öüÌ/:œ\cÐ3HÝrrÏÏo™ÎÎÎäõŸH‡ªf_ÅßMú)7Å©jŽ´m ?á×¹ÀÃ3 µµµ>úhqq±©ùÿÌ÷˜šoä%ô•Ì1f!˜2e ùÚøê«¯x,™ù®Au³÷) ¿BSE^ð£@«ë9±XÌr­Æ…vû¬S´ÚæáX™R©”½2uØÍÒÒRæôò¼T£ÎµÍ|DBá]2™lÀ€ä·mÛ¦UÉ츬í‘Uþ_5àcÇŽõïߟ}ž}ûþðÃZÕŒJBh3ìùuø¤bž\cÐ3HÝrrÏÏo™Ìv˱JuÞ–«ỉc~cžªfJ«†|xµ <<ý)ð^¾••Õ®]»ø-VL»Ì×Ð…0_xùòeKfÎ4ÙÔÔÄef62ùŸ>´ú)Õ\477sÉÆœ}ƒ—Ê”Ëå“'OÎÉÉ!KÆŽ»uëÖß~û-//¯¾¾^a¶yý·ÈŽ9CdIIÉ/¿üBþëìÙ³d·­­­ùÎld ~çΟþ922ÒÝÝ]ež’’’¨¨¨„„}6$´6£óìÐáäe={ö$iÖ•¾›82Ú©j¦08ÙTè:ÇÄ ¦¢|çÆ{ùR©ô­·Þâ·Ø®'ˆ:"‘Hß_ÒÀŒ0§ËfN®?ggg2Ò¸¦¦†yõ©ÎÇ™«ëƒ««+yêûáǼ”ir555\.výê¿Ýýû÷_¼x‘N;88üôÓO/¾ø¢ºÌF¸Ápttœ>}zrr2ýçž={"""è4sÈÃk¯½¦ÕT‚b¸,‹'Mš4iÒ$Š¢þúë¯sçÎeffž9sFaJüµk×>ÿüógLT&´6£’³³39Yt8¹NŸYÍuæââB>Ì«««™Ï,¾›¸3Ω <¢;0¢:*žû>sŒY†NfÆÊÍÍe¾ô[OÞÞÞ$}ûöm.«ÜºuKåê¼Ä r6/s¤Ceò2åçHzÍš5,7E‘ G jÁ‚$––F¿á²ººú§Ÿ~"ËçÏŸo„H Ä8 ø±Ç›?þwß}WZZš‘‘Á<²r¹üã?Ö¹d¶e̳C‡“Ëø˜ßt Os(«©©1p8*0'μqã†ñ`'„ï&ÝîT5GÔ pEjy¨ÚÀ‚>AûeZr¹¼›©cã‰DóæÍ#îܹ“¯’™/ ãøt†¯"cÇ|Uó5lfMã ,iÌ:çåÇ®«W¯’ôo¼ÁžÙ8¯ :tèˆ#è´L&£‡3|óÍ7mmmôÂ>óÌ3FˆÄ@ŒÜ€»uë6vìØS§NÍ™3‡,<þ¼Î °Í(cž:œ\ÆgooOÒ ì™MÒÇÊl·Ì÷¶ „¾›ôÄû© ††[‹§[· :k,’À{B…ó5t-‹-"ƒBüñÇcÇŽéVÎúõë™>õÔS$½ÿ~.%ìÛ·¤yyCá¸qãHúàÁƒú(w„Y缼⾲²’¤5þ²wâÄ ý·Èsh×_~)•J?ÿüs²„ÙfŽLÕ€W¯^MÒååå:—#Ì6£€yc¬ÃÉe|žžž$Mæ%Q‡Ç¡jÜ1ÍûþûïÛÛÛõ)9•£º—¤jEßM|áëT5;&¼”oii‰ŽŽvttôôôüè£ÈHiÔÿŽ·e&’’’\\\<===š””Ô»woOOÏÓ§OÓ:;;ß{ï=www‡¨¨(•SŠttt,_¾ÜÍÍÍÙÙyëÖ­ÆØmU0´ ëƒP˜`£5 rú›:á‰D˜ç³ËÙµkiùùùZ­.“ÉV¬XAýït5mmm¤ØãdzrèÐ!’ÙÓÓSÝ뙕K`ƒ&ùOœ8Á}§xÁ%ZmóP•ššÊ¾]f‡‘Â;´Ú.ó¡ë²²2–œ<°³³ãX¾¶a(hlld>n½lÙ2’¶¶¶.//סLvÜÖÿ蛪·¶¶’:99é\Ž@Ú {þŽŽŽ¾}û’ Z\:·[mƒdš8q"ɹyóf–œR©Tá-úoc~æÛ”ÙƒÔˆÙŠõOßM:äW‰¯SÕìðxêikùòåáááååå/¿ü²BŸþyLLŒü¿Ã§ Šñ“XlllccãçŸîèèHÒÁÁÁt†øøøqãÆI$’úúú˜˜˜E‹)Çðïÿû…^(**zøðall¬Aö“&‰J·- °öØ)]TTDQTQQQtt´A·kFueF¡š_~&aŽ1 ‡L&£¿2i}úôÉÉÉá¸nYYÙ„ TÖÿÚµkI™ýúõ«®®VWHEE…ɼ~ýzu9µ½>cþPéááQXXÈq¿xÁ%ZmóP5`À€ššu™«««Hæøøx·Ëļyسgºl/¼ð‚BÀ,Åj†2uS%O™2E·Ùq˜—£o’Ì1>|øpËH›Ñ˜?>>ždÐêäÒ§Ýj$ñÑG‘œƒ byk#s¿ôl‡ÚægNÕaggwùòe.Ū4pà@RÔíÛ·y OßM¼4!¾NU³Ãã©§-//¯û÷ïÓé{÷î1øxñâÓO?ÝÚÚ*gík ÛÝODÒVVVt??¿›7oÒé²²2å¼½½sssùÝ/ݘð@°0tT©©©AAAÖÖÖ~~~)))d£»wïöóó³¶¶6lØ7Èr}ÖR&•JW­ZåææfooIz`ÕÕÞÞ¾lÙ2WWW''§-[¶ÌÛ¶m£?Ü\]]+++If777zêÙM›6ÑãkfÍšEZµÂ§–D"™2e EQ“'O–H$©ò‡â²²2æóçlnnÖy»Lï½÷Éïîî~ïÞ=å­[ì¸Ì×Ñ籇††~ùå—ì?×ÔÔŒ9’l1))‰}s,Òf4æonnf~RýãÿP9"¦´´”Y3ZÅ DQQ‘Xü¯‹Zµj•Êl»wïîÖMqö%ý·Î=?ó°öèÑãÈ‘#,ž;wnìØ±*ÿëõ×_'ålß¾—ð„ðÝÄžßȧªÙáñÔÓ–••éàëèè a6ìÁƒ$BæZäOær•i±XleeeeeEŸ¿ô<öÊ1¨®h|&<, •««ë¡C‡Z[[ çÎK6úúë¯K$’¦¦¦õëד¯`‰nk)S7òE]Q*GÁPIw1,^¼xÆ ôòS§N½üòËt†—^z©¬¬¬¼¼|üøñï¾û®ÊÀ$ÉÔ©Sɦu­QÍ„ÙÒ˜Ejê¢êêêÆŽ˼rvvž>}ú7ß|“““SZZÚÞÞÞÔÔtÿþýüqþüùʯþR.óÒ¥K̙̜ׯ_Ÿ““S__ßÐГ“çääD2888\¹r…%Hm¯çärySS™Aöì³Ï~öÙg·nݪ©©‘J¥uuu………gΜٲeËĉIÀºT¢öÑj›gÆŒt¢wïÞñññ¤2ÿüóÏ 6¸¸¸œvvv.\Ðg»L%%%d•?Lªò IDAT^½zmܸñöíÛ­­­·oßÞ²e y&æÌ™Ë×á€*S¾ìׯŸL&Ó¹@ÜæëèóØ€éå¶¶¶&Lؼyó™3gŠŠŠ¤Rimmí•+W6nÜÈ|   ¡¡{å(H›á’ÿÂ… ¶¶¶$›««kBBŸþÙÐÐP__Ÿ““³~ýzò‰GÎAî1ð$¡ðv•W^y%##£¶¶V*•û,77·¾¾¾­­~™B||ü AƒXŠÚ»w/)¡W¯^ÉÉÉ………êdàžÉ¿›ØóÓËvªšîõÌ»¾}û*khmm}úé§ÏŸ?ÏŒ¹ù“¹\eÚÇÇGã=Æ5°3tT¾¾¾Û·oWfHQTUUnjj‹Åd¹>k)S7òE]Q*[ EQ%%%t://ÏÇLJþP]°`Áè äçÜÜ\///•‘g( ñ …Y)¨¦.M*•®_¿^áÁi.|êÔ)•ež;wŽyÅÆÂÅÅåâÅ‹ì2ós߯¦¦&Óà+Ó¢âôˆVÛ<ÍÍÍÌÙìÔ±³³SwD¸oWÁ¾}û¸ÌvóÜsϵ´´p,Ÿ— ÿâ‹/bHLLÔ¹4vÜæ’“ci|5`­V÷öö¾uëÇjQGm†cþ“'O2»Ôyæ™gš››µ¯ iõõõ ·ñ*…‡‡+ÌËÈËֹ篭­U~:†…ÊBš››fи"ÇðLûÝÄžŸ[…ý¼œªæ…{=ónÙ²eááá•••ááát111ÉÉÉÌlNNNwîÜ!’h™a«L'&&Ž?þÞ½{7oÞŒŒŒTμzõê^xA"‘ÔÔÔ,Y²„ç=Ô†  CGuùòåððpWWW2bKa‹ÊG\·µ”©ù¢®(•£`2O:õÛo¿íìì lii¡30Çï°w‚¡ ³¥n´û²sŒY°òòòÞzë-GGG—8"‘hìØ±ßÿ}gg'Kÿý÷äɓًš:u*—9)™«h»_ärÎã)À¥4ò´¶¶.^¼Xy€41bĈk׮雲#GŽ0‡N(‹Åï¼óÝ;α|^*¼©©‰9C¤X,V9"šÜæëèú7`Ž+ŠD¢™3gòU‡&o3Üóggg3%S`eeÛÖÖ¦C <I«¨¨`¹·¶¶~ÿý÷é+E.%®J¥Rirr²———ºP¹uóæÍGy„ûŠÜÃ3áw{~.ÕEñ}ªš î•lMMM3f̰··wwwOJJ²¶¶–+/¹\žÐ½{w§rB]º³³sãÆôS÷C‡=tèræöööØØXggçmÛ¶po51í±PÇhQ¥¦¦zzz’*Ä r¹ÎkêF¾¨+JݸæŸYYY¡¡¡çΛ3gÉÀ×àíí­10ƒfK£ 96Á‘Zãøm'x—)ïZZZN:•™™yíÚµ‚‚‚ªªªÖÖV{{{gggww÷Q£F=ÿüó¾¾¾ üóÏ?=ú믿Ò/Ãsssóóó{þùç#""8ÞD1#ÕápËåòÌÌÌ_ýõ·ß~{ðàAUUUSS“½½=ýÞ©€€€GyäñÇ eŽPÕ —huÎSTTtàÀ'N•••ÙØØôéÓgÔ¨QS§N?~9mÚ4¯¨ÔŠiÛŒVùe2ÙÉ“'úè£ãÆ›;w.ùd6D;Ô6kkkZZZZZÚ¥K—****++e2™ƒƒýß AƒBCCÇŽ«<ï&ÑÖÖväÈ‘ãÇçää766ÒÊ«ŒAÛðLòÝÄžßT§ªYÎõÞ;w^z饼¼øàú=111ôƒr¥;F#Ì–º¡( }3`NvìØñöÛoÓi__ßüü|Ã:À™üÎO?ý4>>¾¹¹yÒ¤I)))ô­W×dòc¡’0£¸]»v'&&Ò í‡zaSaF%|"2®Ï¼êÇ kª©©8p`uu5ýç† Þÿ}Ó†‚ë=áæ±fTBVWW7zôèôôtæ#‚ª@aSaFeÄš³ÃÊ•+IGƒÝ‚ L€ž”ßâdˆÛZ‘HdeeµsçNý')ëjÐË 3±9Ö9Æ z:vìØgŸ}Fþœ5k–››› ãПqnmTnwUì„6îüˆP} |õõõßÿý;ï¼ÓÜÜL/qtt¼ÿ¾§§§iÃÑyܲn×·æ{Ul„È…9†\˜Q>uLÍt¶á‰DbAQŽÌ1fÐò¨BÚæÍ›ÑÑZ±ø>‹ßAc’Ëå8;ô!—Ë1;˜™+V,\¸ÐÔQ€™ÑížÁŒî4´ 5&&F"‘P%‘Hbbb “ÅQ÷+ˆ!Öâ·Ð ~ÛæE7òöK3bŽ1€>lll|||¦NzöìÙ?üÐÔဠœúˆäììì|ï½÷ÜÝÝ¢¢¢šššHQ*7Á’ûöí¾¾¾b±˜¢¨üüüˆˆˆ=zØÙÙM˜0¡¢¢B!:Ñÿb)?!!aùòåE-]º4!!A«š¦êƒ0• 6ZÞu=5(‘H„q \òÿjkk+**:pàÀ˜1cLÅÌ™3ãââ233³²²ÈòôôôóçÏ×ÖÖFDDÌ;——µ”­Y³¦¦¦¦   '''33“,߸qã•+W²³³ËËËmmmW®\ɾ –ü—/_ÎÎΖJ¥E…‡‡ÇÆÆVTTTTT 4hÙ²e*£"_Ÿþ9=Z¥|Ò=¡qgešéjC`Ì帘 ¹Y1ǘ€;.×{¾¾¾Û·o/,,TX±ªªŠN755‰Åb²\Ÿµ”yyyÝ¿ŸNß»wäôóó»yó&.++óðð`ßKþ’’•›njjrssSˆêÅ‹Ÿ~úéÖÖV–ò£££‹ŠŠ(Š*,,ŒŽŽV·›r¡^{:ªÔÔÔ   kkk??¿””²ÑÝ»wûùùY[[6ìÆd¹>k)kmm‰‰qppððð GtÒË¥RéªU«ÜÜÜìíí###éåíííË–-suuurrÚ²e )Û¶m>>>E¹ººVVV’ÌnnnôИM›6Ñc^fÍšE7å›D‰D2eÊŠ¢&Ož,‘Hx¨\5LÞÒØÎÍÆ5€Y:|øpzzúðáÃ}}}=J–÷îÝ›N888Ѓô_KYYY™¿¿?& ТЋ‹‡ "‹­¬¬<==™;¨ÜKþ>}úô¥K—ºwï.‰«ªªÔVRR²hÑ¢}ûöÙÚÚ²”¿wï^ú.Ô××wïÞ½÷·«1ù¨™ÊÊÊ‚‚‚7ndddåêF©ÄÅÅݼy3;;;//îB¢ÑCcärydddrr2½0##cÔ¨Qô»Ã333srròóóKKK×®]Ký÷W}ú^‘”Óu†Àt…}4Svt¨¢Õ•jjjª§§'YQ¡•Ëu^‹èÛ·¯Êq >>>*ûU· Žù½½½÷ïß_SS#“Éêêê”#¤­­­O?ýôùóçÉŠêÊçN˜w †ŽÊä£fîÝ»G§sss)M£f¼½½sss ¡Ccòòò|||ÚÛÛårù‚ 8@g`nÅËËKe`܇ÀèÉä-M€íÜ|Q…q `–"##oß¾ÝÞÞ.“É:;; º–²iÓ¦-]º´ªªª²²’9{ÂÂ… çÍ›wÿþ}©TzëÖ­¨¨(ör8æoii±±±±··/((˜?>KiÓ§OÿÇ?þ¡s<@3ù¨™€€:ݯ_?²\Ý(•ÒÒRf6‚ xâ‰'8 “ÉΞ=;iÒ$²œl¥¼¼\e0]gŒ35‚©{=´cŽ1w\®÷öíÛ(‹ƒƒƒÓÒÒÈŠ å($t[KYSSÓŒ3ìííÝÝÝ“’’¬­­éå7n¤Î:tè¡C‡Ø7Á1ÿ±cÇú÷ï/‹víÚ¥!¥êN‰¥|î„yím´¨L2jÆÛÛ[å¸u£TÔk`þ™••zîܹ9sæ Ì­x{{k Ì LÕÒ„ÙÂ-€ˆÔ,=Æ‚÷X6óºÞ»sçÎK/½”——gê@ B˜ÇÂÐQEFF®Y³fÀ€gΜ™5k=‚@$1·Hþ$ ÝÖR¶råÊ[·n}õÕWr¹<::úÔ©StÎ7ž;wnçÎþþþ¹¹¹‰‰‰?üðEQï¿ÿ~VVÖ_|ѽ{÷uëÖíØ±CeùÏ<óLGGÇÆé{‰D¢‰'~ùå—EEGG2dÓ¦ME9;;_ºt)00Ï åÀ„-åX€ÎºÑ]¦C;æ3X˜%K–<|ø°¬¬lÅŠ¦øôÊ+¯¼öÚkŽŽŽ«V­úî»ï º–²õë×»¹¹ùùù <øÙgŸ%ËW­Z6nÜ8‡3f¼öÚkôòuëÖ=öØcC† éׯy,BÙ;ï¼S\\F–„…… <8 ÀÓÓ3..Žd íR³$âî’w"ô߀ ê·tå›.:°O?ý4>>¾¹¹yÒ¤I)))Ý»w7Et'¨cA3*ÛµkWqqqbb"ý§ÐnLÑŠ GD>7Í«~Ñ&,®÷„C˜ÇB˜Q Y]]ÝèÑ£ÓÓÓûöíK/A_Z‘A‰M@¥nÔ ï[±²²Ú¹s'éh ½ &6Çú5ǘçÖFåVºò]•ÐÆtX‘HÔÍÔ1…nóáu©YôÌ}Ââ´5´n"‘ÈìjÙcóÅ{„Âáâ,žpnâè ×`Pr¹ã4Ðí¶„ûZ¸í1! faÇïžš¶ÞHÎ8#è&—ËÍ®¢Í1f”“'OÛØØøûûïÙ³‡,ONNö÷÷·±± ÉÉÉ¡’$ÝÖR@†p“ ÌDRR’‹‹‹§§çÑ£G“’’z÷îíééyúôi:Cggç{ï½çîîîààÕÔÔÄW…€ãôA°ççñÎÜä#äÎä‘€`¾è¢fΜ×ÐЙ™™••E–§§§Ÿ?¾¶¶6""bîܹ¼¬¥€ áVùûYyy¹D"ILLœ1cFyyyQQQbbâòåËéÿݸqã•+W²³³ËËËmmmW®\©ÛîƒF†ÌbüÒLÎäÝ øÑÚäfÅcîŒp½çëë»}ûöÂÂB…íVUUÑ馦&±XL–ë³–2…ÿ¢wAÕÕÕr¹¼µµ•™¶²²¢3øùùݼy“N—••yxxh³Óºæµ·nQ¥¦¦Y[[ûùù¥¤¤¢vïÞíççgmm=lذ7nåú¬ÅeëÊwdEmÛ¶ÍÇLJ>âÌå*7×ÜÜ22²±±ñáÇ®®®•••tæööv777ö`T.W†ž؆-Æ5€àÈårÊÀ?~>|8==}øðá¾¾¾G%Ë{÷îM'¤R)/kiÅÅÅ…¢([[[fº³³“þßâââ!C†ˆÅb+++OOÏŠŠ }¶ÕÕ˜p0‹ÊräªF¸\¾|9;;[¹©ÜÜš5kjjj rrr233ÕmZyC«W¯.))¹wïÞÝ»w Þÿ}öàú駉'&''/Y²„R5¾ÆÙÙ922299™ÎŸ‘‘1jÔ(–`(#ŽnÀ‹'LÃ4]¬Œv±šššêééI6ªƒÊå:¯¥œ‡e•i‰D²;¼æ]ƒnQ™v0‹ºrþ,))Qþ_u›óòòºÿ>¾wï÷&×·oß»wïÒé;wîôíÛ—eÅ?üÐËËëêÕ«d¡Êñ5yyy>>>ííír¹|Á‚PW&)™y ÚÒ؆-EQ×]QddäíÛ·ÛÛÛe25` µ”999åææê°âÂ… çÍ›wÿþ}©TzëÖ­¨¨(cè‚L;˜E]9 úôé£r¹ÊÍ•••ùûûÓi’ࢼ¼¼_¿~tºÿþìd’““cbbBBBÈ•ãkžxâ‰Èd²³gÏNš4‰=¹8È]ðÿØ»ÿ¸*ªÄügà¢"—"êšö ÔÚmße».¹¦ëCdÛê’%¹àÃ}÷P Tp1à ,|gj»ÅºÛ»ÝwöÈÖÍíÑVTïÅÔukWŒ-ßh…\0Å5ð"æûÇ|v¾³÷ÞæÎ_gîëù‡Þ;Ì9sæœ3¿Î9s®®Œnõði¿h}Ë÷Úk¯Íš5Ëf³Í;÷ý÷ßç7ê‘ÊBy«¬¬?~¼÷šd¬q ###UUUÜ{û7ÝtÓÁƒåï²2æ¼÷0U† fñ+éhù¯‰‰‰ŠÇ5´´´pŸ›šš’’’$vttdddTWWó ÅÆ×Ô××/X°à/ùËOúS±½ã×îÉÔœµ7H`\£ûï¿ÿ‹/¾þ¿ÿû¿Å‹s Y¯Yô<>( å­¬¬ìÊ•+Þk ƒøü²eË–¶¶¶k×®ýãÿ¸çž{äï2;˜Åg<ŠG¸pî¿ÿþÇ{ìÂ… }}}EEEkzlÈápõõõõöö:‰°v»ýèÑ£/½ôÒŽ;¸%bãk,X]RRòàƒÊ܉Ã$pšFÒB¸&£“áÓ ÆZ±bENNNtttiiéþýû5 %3ž7.X°@ñK111)))sçÎýîw¿&¶¦Ç†*++ããã322f̘a·Û+**¤7”˜˜xäÈ‘W^y…[³´´táÂ…YYYQQQ«V­ÊÉÉnèüùó .”¿hn°†ad=˜÷\Dûýª÷c$E{dÚ"0m ôÅ_,]º´µµÕØd¼ð çÏŸê©§ü È)ª+jˆ±† a†ºÿ 1Íœ¼_c6:E`)6l¸xñbOOϦM›²³³MÌåË—ŸþùGy$Hð¬g˜¯Ì‹{,ǃ‡QÐ3¬ãE»mÍš5köìÙ3f̸þúëŸ|òÉ@¶`²†™4iÒ† ýÞ ¯¨Œíz†Ã;`^xÜ5™3ßÌieø2 ðe L` Ã`\˜†6ó`¾Ö)8ðq®0Ì×ÀퟞÛ`,þ «"ZÇLó5€ÙÒÉ ¨ûsf£¬^÷ O€n‰á›äl‘_Í’õ–F!4ΙAcš@147èÆÚ (mƒ‰Ç±O)Ì×tÀ#‡‚¶¡(Ýå Ì(ýÉ<öÑ!m6˜¯è€æMY¯¡¡¶¶vîܹáááiiiûöíã—×ÔÔ¤¥¥…‡‡Ï›7ïÔ©SÜB~÷•…òÆ0ÌîÝ»SRRl6!äìÙ³ÙÙÙ×]wݸqãî¾ûîÞÞ^~5Ÿ1 =üðÃÑÑÑS§Nݹs'­Ëå*((ˆ‰‰‰‰‰Y»v­ËåâãÙ±cÇĉ§Núæ›oîØ±cÒ¤IS§NýàƒÄ’GþýÁJ,f õõõv»}ïÞ½„‘‘‘-[¶L™2%***77w``àÒ¥Kqqq.\àVž2eʘqú$}ìã„`B˜¯h"|äÀ†Z„™i™†BÈC=T^^~åÊ•cÇŽÕ××óËëêêŽ?ÞßߟŸŸ¯J(ŸNœ8ÑÐÐàv» !Ë—//,,ìííííí½á†ŠŠŠ¤c~üñÇûúúÚÚÚ>ûì³Ã‡ó+—••uuuµ´´477·µµmݺ•ÿ“Óéìèèxê©§V­Zåt:ÛÛÛŸzê©ââbŸiã Z8@"fŸ:´lÙ²ššš 6BªªªNž<ÙÐÐàt:#""JJJbccGMM ·þáÇ¿ýíoËÉ7‰¯–¾ÑDqÌ üô(ÐGøhZÅèÍF9³¦¦¦­\¹2%%EðÂ… “&M"„ ÆÄÄ s˹ؔ…ò™Â®®®„„ï? ¦¥¥qCÄb¶ÛíGŽÉÈÈ „477Ïš5‹ÛPRRÒ‘#Gf̘AijjZ´hÑùóç¹x¾þúë‰' 7ŽÿÍ5vøL¡0ñb1û X]]½gÏž·ÞzkÞ¼yÜ´´´wÞygΜ9„§Ó™™™ÙÓÓsöìÙ;ï¼ó«¯¾ [·nÝ¢E‹î½÷^Ÿqyeê³QL¢À( Jè…ÎLUÐøD ç¹´¾¾¾¢¢âã?ŽŒŒÜ»wovv6ñz.å¿ò”…ò™BáŸþö·¿mÞ¼¹¡¡a``€ûëèè¨DÌ6›mhh(44”âv»ÃÂÂ|.ŒŒônõû,B±˜}LOOw8•••üB>…,ËŽŽŽò;xß}÷-_¾<77÷†nøôÓOÇç3N"¯L‰Hs˜ Ã0˜¯h…Ùàdí ¼å–[Þzë­¾¾¾_ýêW?ûÙÏ4 5¦Ÿüä'<òHggçèèèåË—ÇÌö„„„³gÏrŸ[[[ùåñññÂåñññj¥Ð¯˜=úúë¯ '’HHHhkks»Ý###\s·|Ó¦M{öìùè£n¿ýv‰†ùð"0_P¥Œ.:m9Ž3gÎ\»vmtttddDÓPcºzõjxxxddd[[ÛÚµkÇ\?77÷ÑGíëëëíí-,,&¯¨¨ˆ_îp8'i„ MMMÊb¶ÛíG}饗vìØÁ-Y·n]AAÁ—_~év»OŸ>››Ë-_°`AtttIIɃ>¨8©,_u­!„Ƴ i=­X±"'''::º´´tÿþýš†ÓË/¿¼iÓ¦ñãÇÿà?¸óÎ;Ç\ûöíqqq©©©7Þxã¢E‹øå•••ñññ3f̰Û튓´qãÆ ðCü911ñÈ‘#¯¼ò ·fiiéÂ… ³²²¢¢¢V­Z•““#ÜÐùóç.\¨8©ÞXÁ裵`¾ ÌwûÁ ^xá…óçÏ?õÔSÒ«)+SÔs¢õ·mPŸ‚žhqùòåï|ç;uuu‰‰‰Òk*.SJŸj-Ïft(æ=Œßl½ŠSà®1 úüóÏÙЖe¹tbؾ© 0€2×`=–)F7˜ Ã0×t3jtƒI&§4a •m?hÅfx"°UÊTëÑ &iYÃð£#ÄØÍPMÙó§¦O­ˆ—Þ„Ø_)zœö¦Ýoa2 ã3NÖä'X7˜¯(cªq bƒö¥ó+ %SJJʾûÝïJ¬£iP±LÕÝàñÄn’Z'Íð43˜¨¨CE[ƒ¡d s\ƒUÛˆzÍ TO9)¬:§Ÿa˜ÃGV(@cš€vµµµsçÎ OKKÛ·o¿¼¦¦&---<<|Þ¼y§NâòÏ,ÊBycÆgïÕX– á¢r¹\111111k×®u¹\ë =üðÃÑÑÑS§Nݹs§ß™bJìX/SÈy¢¤º¡üëýî³ÎOÐ,Ëb¾Yzè¡òòò+W®;v¬¾¾ž_^WWwüøñþþþìììüü|UBù$'÷xÉ?g–••uuuµ´´477·µµmݺÕcýǼ¯¯¯­­í³Ï>;|ø°œdP!ÀÇlÚxF57à  ŒQïP¤¦¦­\¹2%%E˜˜ .Lš4‰2883<ʯ sòtãstƒX'¿%ˆ¾û"œš’4¦h·bÅŠœœœèèèÒÒÒýû÷kJ-•••ñññ3f̰Ûí+lß¾=...55õÆo\´h‘ÎÉÓÓ˜O‘†—ÑÖoR0Fýt*€bÁóL<ô)SŸÏØCŒªWº=žë°› Ä0 CÝÔ4¦ Áü‹ô::$Cç-JÐtë,ËÚ´‹ð~”þuF9k'Ÿ¨ƒ!÷„³cjó5˜ ë%ð5ƒ“œ}útnn.·|„ MMMüj_Ç .LÞêիׯ_ßÙÙÙßß_XX¨J²ÕBã•’Æ4èĺAV€·ÚÚÚ¹s熇‡§¥¥íÛ·_îó øó†²PÞ†††~øáèèè©S§îܹ“_Î0ÌîÝ»SRRºùJKK.\˜••µjÕªœœnùÆ,XÀŸÇ×1ƒ =ñijgÏÎÌÌLOOŸ6mš¦»£Ë²˜¯¤à¾Ùlô?õ¡¨NÛy˜DÊ M ÃŒbæ'‚¸¸¸_|qùòåN§³¢¢â׿þ5!„a˜{î¹ç¹çž›8qâý×½ýöÛ'Nœ ‚Wô•…ò¶yóæ3gμüòË£££yyyï½÷ßcïp8öîÝ;yòdݲÂ/†—©á Г;KÍL! ÌüX˜ššZTT´råÊ””~!#òƒ|«²PÞìvû‘#G222!ÍÍͳfÍâÛººº´Ûñ^¦†'@OZï,#QG ¨ kŽÚ•ê€nTÏj<Üš…‚–Aà ¢…™ ëëë+**>þøãÈÈȽ{÷fggñ_à?( åÍf³ …††BÜn7ÿ‹æô3¼L O€žôhkà>Ñ•¡AU ´†§Ú^‚¨† ¤(½” K- ÂÁeNT<ÔÖÖ®Y³¦»»›øÓj ,/99ùÃ?ô9®ÁäÙex™Ï%UŸ=ÅïPX™÷„U†@˜Ò„ÉÃOÉÒKXvþV9Ô“P\ˆLÐÜQJX¬Š#«,hC~ˆq8gΜ¹víÚèèèÈȈ¦¡¼åææ>úè£}}}½½½æüyÓòy°0­÷7Dì¬jf4¦Y¦}ÄÕ-aÈ¿à Ób„å(³Ž¡˜¿…ˆ†*ø{` y·J?ƒ*IJÚoÞ¼S§Nq GFF¶lÙ2eÊ”¨¨¨ÜÜÜ>ïõ½£å? ÇÅÅÅÆÆîÚµK"ÍÞ‘¸\®‚‚‚˜˜˜˜˜˜µk׺\.>òÝ»w§¤¤Øl6á>úÜ–º¼‡6˜ùðiúŒLk³ä.+Þ¥S4¾Þ#©†üòÆ5ÐǪ÷"ò÷ 9`m8ô·|ùòÂÂÂÞÞÞÞÞÞn¸¡¨¨Hbe®€<ÚýëêêŽ?ÞßߟŸŸÏ-¬ªª:yòdCCƒÓ錈ˆ())‘Xßg´œòòòÆÆÆ†††ÖÖÖööv‰4{GRVVÖÕÕÕÒÒÒÜÜÜÖÖ¶uëV>Ú'N444¸Ýî1· eW=\+õäqmbh –x°T¡1Í †½–®È£U7NµBž~úi®Ûóá‡v¹\ÜòÖÖÖ+VŒ?>""bÉ’%N§“[þî»ïΙ3',,,55õW¿ú•ØÂŒŒŒÏ?ÿœeÙsçÎ1 sþüy–e?ÿüóŒŒ –e¯^½šŸŸýõ×_ýõW¯^åóÜsÏ%''‡††²,ër¹òòò¢¢¢âãã«««}æáµk×ŠŠŠ&Ožcö«¾ «„ôES‡š Û%{`` ..Žß¨GÄ–_¸pn³Ù¸Ï©©©ÜçžžžøøxéõÅ6g·Û›šš”¥911±¹¹™ûüÅ_$&&ò«uuuyG5æ¶TáQ-M{Ц‹ÙˆB4„™³ÝçíŠØ•‘ß e¡¼‰ÝÀø¼€šŠ™Ë”GèatVa¾P„Ñfìù^vœgþбcÇN:uöìÙîîîmÛ¶q ÅzYzè¡òòò+W®;v¬¾¾^láÝwß}äÈBÈÛo¿ñöÛoB>üðÃ¥K—Ùýœ?þx___[[ÛgŸ}vøðaŸ‰G¨_×ÄWޱ~öfs:´lÙ²ššš 6ˆ%ÃgÌ~Õ7"¨é”N*þö·¿-\¸püøñ ÃDGG_¸pÁß&MšÄ}ˆŠŠâG œ?>33Óf³…††N:•5Cl}1ÝÝÝéééÊÒìt:ù°Ó§O¦!!!Aæ¶üâóv…ˆ\ åMúÆã þÒý]9£³ŠªÌ f”—*¡¤¿ªHlOMRcuH€{j†¬Ciiiá>755%%%y¯#ì±LIIÙ½{÷¹sç„+x/|÷Ýwï»ï>–e—.]ºyóæýèG,ËÞ{ï½µµµ¬ì~Τ¤$aÚ|æ¡>] Ó®øÛqí3ÇÄÎ0b+WWW'%%}òÉ'r’áÖ¯úæQ%$òP‡š éiÐn·8pàÒ¥K£££—/_æ·b³Ù¹ÏÜÃ<Ÿ´ùüšœœÜÑÑá½9±õýª biöˆ$11Ñg¡‹å¤Îã´+ÓÀDZ’C~|"ÿ>:L" bÁiy¤EÌ ÆÌyîóvEìÊÈï…²PÞÄn`|^@MÅÌe þBYR#®¶VdgMrêÑ' ÁÖÖÀõ³,;<<Ì_A?þøã;î¸#::šK<Ã0Üò'N,_¾|òäÉÉÉÉüãÅN›6m`` 66öÒ¥K'NHKKã^— õ¹Q\òXÍg†††«—ZÑ®p]Ö¡¡¡!!!Â’;iøÌ1WNOO/++S– ¿ê›üSŸ5AÓ¶†I“&:tÈårµ¶¶Þwß}üVæÏŸ¿}ûöÎÎÎ{_>a„/¾øB˜6¤ržzê©%K–´´´ 766:éõÅ¢-++[¼xqGGÇ¥K—6lØ fHŠ‹‹—/_ÞÛÛët:—,Y²qãFï4?ûÜ–êthkxòÉ'³²²:::þùÏæåå=òÈ#ü¦ï¹çžŽŽŽíÛ·ßrË-ÜòŸÿüç‹/noo¿xñbaa!·pΜ9‡¼|ùrQQÑ<ÀG²téÒžž.W7oÞÌ/w8}}}c¦A,¸ÏåÉnN"'}îºÌ|©µ*3ç¹ÏÛ±SÿAY(ob70>/ ¦bæ2ñ÷-”•(iÌ]ö~Ë‹ÏRVÐ9à ÿÁç{eB z|B'òzW|î‚ÄûüŸ~úéôéÓGGG¹%£££ééé|¿â½pguŽPEäßû™ív;÷Y¬Ç’÷î»ïN:Ubá’%Kª««³²²X–½ë®»ž~úé»ï¾›û“Ì~N»ÝŽq cò·ãZ•q ÕÕÕ ’áW}K˜7ÝÆ5hù[o½5}út›Í6mÚ´^xßPCCÃÍ7ßl³Ù’““ñ‹_ðË+++Ç?fFŒŒTUUq]è7ÝtÓÁƒ¥×‹öÚµk………'NŒ}î¹ç¤Óì‰ð|žŸŸ/<Ÿ{'@l[ªó¸Âj± UÆ y ù;‹ ‡I¤A,8í#4Ýx "Ï…w&b§>é›ù¡xb70>/ ¦BE™‚|„Æ¥1Í’¹Ë“'O>xð Ëå:wî\~~>V¸Ž²Î±¯>·(¤ 'AŶ9½+>w¡¨¨héÒ¥N§³§§ç®»î*..îøÍ7ß\WWÇ-ùóŸÿ<þüÀ÷:ÀÕ9BB–-[æt:¹^¬’’n¹Xåý÷ßúôé¡¡¡·ß~›¿Ýô¹pÏž=±±±Ï<ó ˲;w‰Ù»w/÷'9ýœ,ËnÞ¼yÙ²eüj>¯îútN»:àoǵÏó«7›ûëùóçgÍšUUU% ï˜ýªo{!Ñ™¯CM0ó þÒ¡­A•1GC~䌓HƒXpÚGiº ð`æ<÷yg2f«²PÞ¤o`<. ¦bæ2P–tyà‰½å%¶¾üα¯>·(¤ 'AŶ9½+>wAâ}~–eŸþyþIæþûïÿå/é±éûOÔ=Ïšü¬Myæ™g¸·sóòòø.G±Ë×^{mÖ¬Y6›mîܹï¿ÿ¾ÄÂææfB÷Fâ§Ÿ~JÝerú9¹Õòòò"##§L™âsgV¯.ÐÀiW üí¸ö™c~õfóíîîž={ö“O>)‘ ï˜ýªo{!Ñ™¯CM0ù± ~Ñ¡­A•1GC~|òˆ\" bÁ1òä3sžû¼3³Õ@Y(ocÞÀ/ ¦bæ2¡,©!óÀ“󖗲α¯>·(¤ 'AŶáW±ÞŸ» ý>ÿÅ‹cbb¾þúë .L˜0áÒ¥K›°ÿ$ØÚŒNBP0y5Ð Õ™€B´ÚTs$1äÇç!È%Ò #@>ä¹õ L­„ðŒN‰hLs ì¯Ä[^Ê:Æì:ðùò<«Ò¸e%îD¬w…'Ü…1ßç¿÷Þ{wïÞýÜsÏåææzG…q ò™9mVbòj ª3…h%D@£M¨2æHbÈÏ!B‘K¤A,8F|ÈsëA™Z Úè s—}¾ååÑ̯¬s@¬¯`Ì÷Êô$øÜY….³wÅç.Œù>ÿ{ï½7wîܹsçþùÏVe¯ÜYÝbS™Óf%&¯º¡:PˆV¢C[ƒ¦L¶XpJsƒCoiÒ yÎþûÉÄb]¡î?ïjjf4¦Y+V¬ÈÉÉ‰ŽŽ.--Ý¿?·pãÆ ,`†ûúòË/oÚ´iüøñ?øÁî¼óN±¨Ú'N444¸Ýnî«°%E;t=üPŠK¯³³ó¶Ûnã>?ûì³=öØ… >ÿü󘘇áé¦Ñ ¢üùé 0F0””t…D§ô:ï¾ûîœ9sÂÂÂRSSõ«_ñ_|ñEîwÑo¾ùæÏ>ûŒ_H(Ÿ)|úé§¹Nˇ~ØårñËŸ{î¹äääÐÐP–e¯^½šŸŸýõ×_ýõÂßc¯ªªŠÿãÿXUU5qâÄøøø÷ß_"~9'@±„µ¶¶®X±büøñK–,q:â½0##ãóÏ?gYöܹs Ü?žeÙÏ?ÿ<##Cz7…¹ár¹òòò¢¢¢âãã«««Ç,â1«±uÀív—––ÆÅÅEFF:Žo¾ùF:ªk×®Mžû,ë«@ùÞ+ ÿzâĉ¤¤¤={öˆ%ÃgÌ~U aÙyÇÖÑÑñ“Ÿü„òãÿ¸££C¢ŒäË)))»wï>wîœGÀ .pŸl6›G&( %m``Àç! ¿z/÷¹ÅÔÔÔÆÆFîsOOO||¼_)ä¿Úíö¦¦&eiNLLlnnæ>ñʼn‰‰üj]]]üj«W¯æZ1Î;·zõj‰mx&q¡T=T°ñ™r²(îRÌFqž›ö¶Gl9÷AxÁòy qbˆˆˆP%CÄ.vcî¸8Ž,FùuôgùÂs‘Å9yò䃺\®sçÎåççóï¹çžŽŽŽíÛ·ßrË-üò@BùLáÒ¥K{zzœNç’%K6oÞÌ/w8}}}Ü×¢¢¢¥K—:Ξžž»îº«¸¸˜_­°°ð›o¾ùÍo~Íž;wî˜ñ™u>Ι3çðá×/_.**zà$2Ä{áúõë_|ñE–eùË_Ž7Ž»¨¿ð 6lÞManlÚ´iÙ²e½½½===K–,‘³/Òë[ž|òɬ¬¬ŽŽŽþóŸyyy<òˆtT?ÿùÏ/^ÜÞÞ~ñâÅÂÂBŸñó_%V~ã7âââþô§?™ ˜ýªeç[GGǽ÷ÞËï©X±òÚ"Oœ8±|ùòÉ“''''sÃh%rFxÿª ”·?þøŽ;îˆŽŽæÒÉý¦€ü¨Ä¾Úl¶ÐÐÐÐÐÐ@¢ V–æÐÐP·ÛÍ}–ny‘ÿ\ªøœ¯g¨`ã‘K|ûQ{{»œö#mÿNqž›ö¶GâvÅã‚%v ¶Ý7ß|ó{ßûž*"v±sÇåÀqd1(Kšr_b~rö9 8ZéuŒí %„´´´pŸ›šš’’’øåÂC‰~ů¿þšeYî jþ3×ÿ/¿t¶ˆv„úÌï…ï¾ûî}÷ÝDzìÒ¥K7oÞü£ýˆeÙ{ï½·¶¶Vz7…¹‘””$L[àޱuÀߎkŸÔbO˜b+WWW'%%}òÉ'r’áÖ¯ŠáQvbO2ò{Â%Öá½ûî»S§NK¿ÏåŠCñìvû.]º4::zùòeacÁàà ÷ùÂ… c6 x|MNNöÙ #3…Ò5A,Í‘$&&*;ˆ‘ßÖ@û˜#VrÈœAmið«sØ #@]ŠóÜ´·=b˽/Xb·>·{òäÉéÓ§óë{ókׄ„;‰ȇãÈJŒ/K£ê“ÛÕh~ÝkRDþ~!G.±‚±}¡„9†rú}~–¿ü„‰u„úÌï…ƒƒƒÓ¦Mˆ½téÒĉÒÒÒ¸×%dvŸz¬&g_Ì\üí¸öÙAíïÊéééeeeÊ’áWÅKؘ ½×³ï¿ÿþÓ§O ½ýöÛò_aPÊÛ¤I“:är¹Z[[ï»ï>~Íùóçoß¾}`` ³³óž{îá—O˜0á‹/¾ðÞ„Ç×§žzjÉ’%---ÃÃÇCz}±hËÊÊ/^ÜÑÑqéÒ%n‘Dš=")..^¾|yoo/×߸qãÆ1sC^ÓcŽ$†üÈÔ&‘¿:‡õy$±hAY¶›ö¶Gl¹÷Kì6À{»‡NMM=yò¤XzüÝ5±‹Ý˜;.Ž#+‘{Ó:–Ü®v›°äAè×N!´‹Ü¾Pòï ùv»Ýg9ýŠ>?ËŒ_~ÂÄ:By ñ¹pÉ’%ÕÕÕYYY,ËÞu×]O?ýôÝwß-7¹4È×Àš¾øÛq­Ê¸†ŽŽŽŒŒŒêêjÉð«bˆ%Ì_r.Ù¯½öÚ¬Y³l6Ûܹs…S–øLÿAY(oo½õÖôéÓm6Û´iÓ^xá~͆††›o¾Ùf³%''ÿâ¿à—WVVŽ?~ÌŒ©ªªâºÐoºé¦ƒJ¯/íµk× 'NœûÜsÏI§Ù#áD*ùùù‰TÄrC^ÓcŽ„<†üÈÔ&‘¿:‡%’¡âÈ#‰@ f»Ùn{Ä–{_°Än<¶{àÀÒäìšô]P€GŽ#‹‘uÓzó–Ü®¦›yƒBeû‚P° ‰Œí %„,[¶Ìétr}P%%%>ƒÈéWôùY,~~Kù ëõ™!>îÙ³'66ö™gžaYvçÎ111{÷î•¿›,ËnÞ¼™{Q“[mÌúcò:àoǵÏj¿z³¹¿ž?~Ö¬YUUUÒÉðŽÙ¯Šá±cV<1V:ï_”c–©ÆI ù‘3ŒK" ~uë3òhÌÕ@]ʲݴ·=·C,±ÛávŸ}öÙ”””3gΨ›!b»1w\GcpYŽYŸ>øàƒÛo¿=22222ò?þã?øþ–eÓÓÓ ! Ü×;î¸cáÂ…ÜçO>ù„2}út™Û=vìXVVÖu×]1þüßÿþ÷Üò›o¾™Âw¡°,{ðàABÈÍ7ß,PήÈ7ìrÀß­H¬`l_(!ä™gžáÞ­ÍËËë0”Ó¯èó³Xüý–ò&Öê3C|.lnn&„pý Ÿ~ú)teÈì>½zõj^^^ddä”)STù c뀿×>;¨ýêÍæÿÚÝÝ={öì'Ÿ|R"Þ1ûU1<öbÌŠ'Æ'=àðE)¿Lés$1äGΠ3‰4øÕ9¬ÏÈ#eaA1eÙnÚÛéÛ!áKì6ÀãFÈÕ+Wω‹ØîKÃqd%Æ—¥t}zÿý÷CBB¾÷½ïuuuõôô|ÿûß á€uëÖBžþy–e/^¼j³Ù.^¼È²ìîÝ» !?ûÙÏäl÷Ã?´ÙlwÞyg{{ûç@Ü< IDAT?ÿùÏŸþô§„ßýîw,ËrC=—-[Æ\ºt)!ä—¿ü¥tÀ1wMTßw~2b‘~nKë­(¦Ã‘¢s@2y ‹Q9©çIïĘ$IæØ˜¹g1GC~ä j“Hƒ_ÃúŒ»zø¯(MZð%åý$Œ“vè5"Úá ²*‹Ì|ªóžPÓ¨”Ëbç>‰›]°ŸÅ:@éòBiÒbÌ’²Øµ&Ø øÌçCz¡ì¬Êìó5€ºÐ<Įܨóö ¥I9·Ñè•¥LçCJ¡¡ÁÚL=_Å»J ’X.ÆÁ@úÊ:@™·_(M“ó÷6åH”—©à|H44X›Yæk=áblmò;Q ê€Yùuû%,M¨y‹ÃßrÔ0Y <&™Ž#Šà ˜¯àQÄ_9„„»L/–…¡p-Ããej8HÔ‚¶°ŒÞ\ÀK Ãøü,ö×7Þxã»ßýnddäøñãøÃ¶´´ð+766:Ž„„„ðððÌÌ̃ÊßÖÿþïÿÞqÇQQQQQQ·ß~û|à‘±í¶µµÝwß}ñññ6›mêÔ©¹¹¹ùË_TÊ$€ †î\ëÁ ´Å ¡@-ÂK.@5†aBŒMYòhòóЪ®®þïÿþïþþþmÛ¶}ðÁ«V­â–×××ßzë­ÿûßßxão¾ùæÀü㥷Åûàƒ–,Yb³Ù¾úꫳgφ‡‡ß}÷ÝÂæ‰íÞ{ソÿýïýë_ üãÿøÑ~´uëV¿³Ãô<^¦0TKËÃcŒà‰ x?DÇç ¡¡¡n·Ûç:ÜçO?ý433“2000~üx~ý¬¬¬ººº÷Þ{ï‡?ü¡ÌmñKn¿ýö¿þõ¯õõõ , „œù„‹dæÌ™wÞyç¦M›’’’ÔÉ#ã ­!Øö—^()«BÉZ Ú¬­*B[XŒÁó5È122â½à׎ÏlÛî믿~ÿý÷O™2eppðÓO?ݳgOvv¶Æ 4^£ÝàTc%h\°0+@àÄ.y¸¥ŒŸ¯Á§ÐÐБ‘—ËÅ}mll”ö;ßù!DÙ¼ŒóæÍ#„œ:uŠûÊ}˜?¾œ°Ó§Oíµ×œNçåË—_}õUa<<ÆXZ®-íG !ÄûG Ç=óÿâ¿jjjZ»v­ü°UUUãÆûÏÿüÏ¿ýíoÃÃÃÍÍÍ«W¯æÿ:yòdBÈçŸî3ì¶mÛBBB6mÚÔÝÝít:KJJBBBüq9Û]¼xñŸþô§¯¿þ:22266–rë­·ÊO6÷»–„b03³Ý=PMú€Âá4bYÖŒã^}õÕÅ‹?ñÄ111>øà¦M›ä‡ýö·¿ý÷¿ÿ}þüùÙÙÙQQQ999Ë–-ãÿZ^^{à 7øüðÃ<ðÀä'›.茿 åȪP¦ †ÁE$ˆÝÏ]cðì)ÕPLÖƒ2µŸŠR¦¦„P‘°eYïitù?éŸ6ņ± ž|Täó€Âhb šçkóÉ´ƒîn‹+P\J(…#@]cþ, ù7À›Içkw½ºAÛÈ‚v2î9@]h<0?¡ aŒk…pŸcBã‘• ƒäÃ| `x.0?¡0&Ì×Á´^\G(‚¦@ð‹ ×  î}­¥i=(SË@{øó5€,h6ù0_Ã_@è0-\åÀ_˜¯4T‹AS ø%„eY\<À@Ô`ac+ÆÇ™OPó5€ p›FÁ0€¦pqÅ0_ mF–„[ +Áá þÂ|  &ÜY€žQ©†v@æk  €2x˜°Ì×ü?&„v@æk5¡.npl(D«BÉÒWs ó5›*ðÙzŸ…¤×çï) O3>Ïg‚ú†ÏølÊÏB2Ãú»>>ëð™à‹ÏølÄgò/&I>ùç@`¾0 .@æ„cÁ0‚îho\ƒ–üJâïúæg½=²  E¼¯5|c9JÐz”›8¢MÇ&€áp>k`ó5€æ|^hp#áº>azHCàxÕa¾Ð n\@#îK;4p[L¡M4…ù@'x0• –emF§,‹eY®% ÷1ÔѨ Z·¦mœv¤a( hÍ†Ë @³Þè6ï=ÂÅN;Ö«?–‡"­1 ƒq @ Ü«N,Ki2÷Þ/ôâjM­¼Å˜8Ý ‡@S6Ü~vpËZ@uR…ðiÜzYê½GÜþâ’€F[Ðæk:Öne#ü1E´8¨®”Bý­a¾€ Â?çÉߣÅ!83A ÈIZ ¡ ôÁ0LˆÑi‹ÞÙ€±‚¼¡Çï>NMTPá@O!ÜëôF'` 8S BhnP…F¹‡FjMá :`Yã@'¸kUà.Y44xCsƒZP©¨€·'@g!,ËâšB0Ä ¹@ ˜¯ X ¡Á'd  jýa¾Ðj€þðŒ1&Ì  ª-P·@˜¯t‚›Qžjè…çP •GE8€Î0_€eiÔFãñ¨â¡QÏ–Ú`6¸3Q jÀ˜¯ôƒ[y«ÂcLÂ,pÍa¾kÒtPƒðÚÁ...Ž‹‹‹Ýµk—GÀúúz»Ý¾wï^BÈÈÈÈ–-[¦L™•››;00à3f!éȇöP°*4 €þ0_ø‡{nñùþ]yyycccCCCkkk{{»ðO‡Z¶lYMM͆ !UUU'Ožlhhp:%%%Ò1KGÞÐpÆbÐÚ Tï¥nØ-u ¶$”‚2ÚåÃüÛµƒÿšœœ\WW7sæL•«««÷ìÙóÖ[oÍ›7[˜––öÎ;ïÌ™3‡ât:333{zz¼cò¹ºPÓdÒ'£øGe”ˆ2¨Ï”ÂÁ ÖÀHÜÕ´5P˜`KB)(£[ƒÍfs¹\6›Ícåôôt‡ÃQYYÉ/ ãG1ŒŽŽ2 3::ê³ÏÈÕ…š&“n…Q Y@/¿` Ã`¾PGBBBkk«÷ò£G¾þúë;wî®ÙÖÖæv»GFF¸æÅ‘€Ü×€á0_è ³¯XÀ„ ššš¼—¯^½zýúõýýý………ür»Ý~ôèÑ—^ziÇŽÜ’uëÖ|ùå—n·ûôéÓ¹¹¹>cž+Ä"¡Ã(#0VˆØ,\@/M7nܸ`ÁïFÃ'žxböìÙ™™™éééÓ¦Mþ)11ñÈ‘#¯¼òJEE!¤´´táÂ…YYYQQQ«V­ÊÉÉ‘ŽY:rà¡5Ìó5À´x\¡kº/ôàE  òMdšzæJDdípƒ5`¾0N”Òù¯Ýù (`˜¯À Ð(¦Bë| ¸ Z @]4ÞÔ€õ0 ƒq `Ü PãóÍ Í÷`6TÎ×À%˜ºd€¿ðl Ζ`˜¯ ƒ¿ÌIÙQ©õ±ŒsEÐÂÅB4Ë€ Ñ7_ƒð†7úP½ ÂãO*žÏ}F…ëE€¦…¢Â| ‹²Viù¡´kõÎËËëèè „tttäååi´• AWçDPAÑ€ÙP6_ƒwR)J_â+//olllhhhmmmooþéСCË–-«©©Ù°a!¤ªªêäÉ“ N§3""¢¤¤D,fÌ( dø‹¡è>^â^‡¢½ ‹Ö{æ˜4 - ™9¹—ššZTT´råÊ””aÀ .Lš4‰2883<<Ì-çbSÊg =š¸¯ÉÉÉuuu3gÎôX¹ººzÏž=o½õÖ¼yó¸…iiiï¼óΜ9s!N§333³§§Ç;æ¼¼¼ŠŠŠ”””sçÎmÛ¶í·¿ým ™œ ÏÃ`NÈK¡ ÖÀHÜšÚô§ÃÉÎäçS“'ÏÚù3ëëë+**>þøãÈÈȽ{÷fggñ&þƒ²P>“ç3ˆÍfs¹\6›Ícåôôt‡Ã!| ",,ŒÅ0::Ê0Ìèè¨ØFå\ïPåÄž3†'À„ø›"d €ÅàŒÖÀPt¡s§ùwFhk0yò¬ ™ ùX[[»fÍšîînâO«²PÞëx|×ÐÑÑñýïíÚµ›6m⦤¤|ôÑGv»]:fùPå|2íŠÆòÀªptƒe`¾0¼  ?‡ÃqæÌ™k×®ŽŽŽŒŒhÊÛ„ ššš¼—¯^½zýúõýýý………ür»Ý~ôèÑ—^ziÇŽÜ’uëÖ|ùå—n·ûôéÓ¹¹¹Ò1C p×k*xó³Qq¡>ˆz$X8‡9ûX–ECxôV¬X‘““óÕW_}ë[ßÚ¿¿¦¡¼mܸqÁ‚ß|óG)?ñÄ›6mÊÌÌdYvÛ¶mÂ?%&&9rdÑ¢En·ûñÇ/--e&++«««kΜ9eeeÒ1€>¨™¯a̧<–hDŸŒ5sñ™9mÖ†œòÐ_È1ŸL’-&I† +¬ Ç8XÃ06*j³Ï± Â…&O?ÈAKË@ð â&!¨`$ PeYÛØkh ¯Qh;²ÌЊç}€ž$ox¨Š ¢€ùÑ1_ƒÓ ´pÒPZÄ€ Ãàw(ÀøŸÇ3:!` ¸ŸV Ž,™På|B¶˜ d K7ÂÖèdø‡Æ4€bh8ã é¨À²,Æ5XžÐÆ„Þ{0?Â@–e©»Á¢1Í0&<h —OÈ1h‚1!Ђaü€Åñ?õb†ß¤0¾¡Ùf†v ‘%[rqøÅFãŒÆ4€L8Àµ€æohh*Xò ¬'H**?á `,Ëb\˜÷8„g!- ¹A ÒÌÙäÌ׈ Üe …X+ƒ%+­÷Κól `6 Ó `847pÐд’¾b ”°~ÉéÔ{7ù«ªÏ¿3Ì×&äBÚ67à»1 Â;c°ÔU0œKy©̓ó ó5€¹ðB ‘à¼1±|ÁS+Læ„¡aÞ<.¬È‚ùÀlpo­ï‡`€ª´ž£肆 xQÀC˲Ô 4¦ü…Û,Ïé4xöÔÚ„mdÁ•L câs&xNSb0_˜^£Ð™w>bÜžšN¿f€RBCƒLÝÀ á~>Êèdø‡Æ4 á)Úc4NÝ´Àý± À<ÐÐàŒn „°,bt|¶Q²ÀA‰Sùî«°•Á£¹ ÓÖ€i¡Zʇ¼ ˜¯ÌG7u<š$NÑèê19”‹áP`BhÿR=gä†Á¸PH~+ƒp>¬†)ƒ˜ü‰"nßM^r`¾0©`¸› —÷ëÒOGÂ#Í >¡÷LÕ2¸›…`Ʋ,~‡äò¸aR|÷‰iºMwà"Ìצ€ç“Sðº„4> U3\^‚Þc0!ݪåÈÈÈ–-[¦L™•››;00À'`÷îÝ)))6›Íû«Ëå*((ˆ‰‰‰‰‰Y»v­ËåòŠ7<<\\\»k×.­wŠƒ¡ ´0_˜ÎÎA÷Ù&¤V+ƒÏ#ïSÔzUUU'Ožlhhp:%%%üŸNœ8ÑÐÐàv»½¿–••uuuµ´´477·µµmݺU,§¼¼¼±±±¡¡¡µµµ½½]—=jTþX.ÚþucxV#ÁYmBM jEè~¹Ý è:éJí˜,¶;`ºÕÌ´´´wÞygΜ9„§Ó™™™ÙÓÓÃ% ««+!!OðkRRÒ‘#Gf̘AijjZ´hÑùóç½Wã%''×ÕÕÍœ9SëÝñào6â„–AåíŽ@ÝžÕ†?žÁYmjMÊ 3š̆ººK°Ò¾€ÅèV9ø­°,;::Ê0Ìèè(ñšÓÇã«Íf %„¸ÝîÈÈÈááaïÕ„ë»\.+t€¶Z˜¯L   'Õ'eð ›ðe Œ'* mmmn·{dd„kn*>>þìÙ³ÜçÖÖÖøøø1·ÒÚÚhZ@Ìצ€&|ÃiÝÊ ‡p£hn€ ³!dݺu_~ù¥Ûí>}útnn®œP‡£¨¨¨¯¯¯···°°Ðápx¯#¼š¬^½zýúõýýý………ª¥D„ÐØƒDcš!@(qϨì¿è°Q±?¡¹AxÜ5 *9˜™žg†ÒÒÒ… feeEEE­Zµ*''GN¨ÊÊÊøøøŒŒŒ3fØíöŠŠ éõŸxâ‰Ù³ggff¦§§O›6M„€(–e©|?wEº1IV˜ “ä€å!Ÿõ§Ý¤ 27-½ELß 'J@J“-d] CýT æk€ e£±Ó˜f“0°•A>–e¹tŠMñ@;fáפ¤¤#GŽÌ˜1ƒÒÔÔ´hÑ¢óçÏ{¯–——WQQ‘’’rîܹmÛ¶ýö·¿•Ÿ-þæ$N`TžÄqêÆ„Y¶‹A‹‘î9±LŽ^,Öø¢ËzTìž™@¦©"lTppÕ××WTT|üñÇ‘‘‘{÷îÍÎÎ&^­üWþƒ²PÞ¸?±,;::Ê0Ìèè¨DT›Í644Jq»Ý‘‘‘Šç³$hk€ „ÉTAŠ Ov:ß|˜0¬Ù+!x~×M•j€ÇYæè£bG¨H¤©àˆV‘âÌ ¤ÞÖÖÖ®Y³¦»»›øÓj ,/%%å£>²ÛíÞ;"ÑÖ””tôèÑŒŒ BHssó¢E‹:;;¥7ä/´5@pÂ| @œy!àuP™Œ˜/ IDATaú¿ —ô„ÜV W|U虇ãÌ™3×®]Ñ4”·uëÖ|ùå—n·ûôéÓ¹¹¹2·^TTÔ×××ÛÛ[XXèp8'<Øhl9£1Í2I?™¨ØÓb1,Ëòw!‹ä@.é ¹-nóTÇu87®X±"''端¾úÖ·¾µÿ~MCy+--e&++«««kΜ9eeerBUVV®_¿ž×pï½÷VTT(N±,Kå5\„tcÚ¬Ö-aúl(xz½T¬ z-E‡žfÞ3§Í´´È49ÙÖn¦T«¨½jÁ;´l4ÖcÓ À ž§Vo´ì;-éÔ‚÷¾ÓuÊŽn ´%^Á\½u†¬VG®FtÚÀaÆft‚HðÌö'Æg˜êÖ‡Š2Ò´ëÞ;¨»õþ8¨©j—© [tƒ¬PíÍâA"„kã4:þ¡1Í .᳄•–õblÚô$¶ïf8¨)*#MSeHiqDc¶H0utf C¦Õ××Ûíö½{÷r›Û½{wJJŠÍöÿúÞžyæ™øøøèèè5kÖ q GFF¶lÙ2eÊ”¨¨¨ÜÜÜ>µÂà_].WAAALLLLLÌÚµk].—ÏP¼áááââ⸸¸ØØØ]»vi±ïÔÝ;I0ùe!,Ëâw(´åýklzÌÆ -(#if(#eÐÜà YÁìСCË–-«©©Ù°a·äĉ n·›ûzìØ±S§N={¶»»{Û¶mܪªª“'O6448Έˆˆ’’>Bà¯eee]]]---ÍÍÍmmm[·n Å)//olllhhhmmmoo×,ôƒÁ¥ ÅÌÝ2zÎÚ¨x+˜¦Î/†dÊÈ/Úe1ÓÈÌgõ@˜m¿Ì–Zh—o ÃTWWïٳ筷ޚ7o¿°««+!!ÿÚÒÒÂýAssó¢E‹:;; !iiiï¼óΜ9s!N§333³§§Çgpáפ¤¤#GŽÌ˜1ƒÒÔÔ´hÑ¢óçÏ{¯ÆKNN®««›9s¦êûî‘Dv£«sCBp 10“ŸìtH^ ›ÀŽ:gÊH­4* ”5ÇäguÅLµ_¨lŠiÚÖžžîp8*++… …ÛbÆív‡††BÜnwddäðð0!$,,Œ[eÙÑÑQ†aFGG}~µÙlCCCÞ±‰Ý{Ûl6—Ëåñb…êôikPö|aá§´5@pbó5h÷šÊè9èe¤ ¥/&Pšl N,fsôèÑ×_}çÎëœ={–ûÐÚÚ:uêTîsBBB[[›Ûíášäl.>>^[||¼ôú ­­­rb¦—²Ó¯¿¡p’0 Ì×V`‹ b¡Ï3!Ê(•‘Öó–¡¹}e:@&›–Ýn?zôèK/½´cDZu}ôÑÞÞÞÞÞÞÂÂÂx€[¸nݺ‚‚‚/¿üÒívŸ>}:77WÎæGQQQ__›Ãáð^Gx.Z½zõúõë;;;ûûû ýÜ9:(;.p4Ð+„ƉÐhL3hÁœÕ±Óú™e8JŸÛ)M6Ðõ*:4Ó$&&9rä•W^©¨¨ð¹ÂÂ… o¼ñÆiÓ¦M:µ¼¼œ[XZZºpᬬ¬¨¨¨U«VåääÈÙVeee|||FFÆŒ3ìv»ØyO<ñÄìÙ³333ÓÓÓ§M›æÏn©¶¶vîܹáááiiiûöíã—×ÔÔ¤¥¥…‡‡Ï›7ïÔ©SÜBþQJÎÖ™ýÚ1Êã‡?ôùU Üñèý›1<®¢ )Z§PAüæÏ4Zh—“(#µ¨ž“ú ÔzCfcí½6ÃÞ™! ôBîéÀ¯L–³òäÉ“<èr¹Î;—ŸŸÏ¼çž{:::¶oß~Ë-·ðË %ë{áp8úúú¸¯O>ùdVVVGGÇ?ÿùϼ¼¼GyÄçj_‹ŠŠ–.]êt:{zzîºë®ââbŸ«‰ñ·nãXk „PÙ¹‡Šº1VkÝAé|Œ¥E~¢ŒÔ¥z~êV@Á6¼Åò5ßð ¶¥:ÃK0¨>7djjjQQÑÊ•+SRR„/\¸0iÒ$BÈàà`LLŒÇ¼˜ÊBÉߺp}þÐçWEäd ë˜ækºÕ‰XÎè\Œà5 ˆ.üÙ…* ª«Àþð‡ºººùó秤¤¼ùæ›ür®É€åv»U %ë„mçÏŸÏÌÌ´Ùl¡¡¡S§Níííõ¹šÇW§Ó™žžÎ}ž>}ºD(²ì¯Ë€*¨hXÕáwòTì01cFn½ŸŒR7Wµ®-AX@„ª2Ûœž[4 çó@»ƒ–Ï^ u Ý]Mmmíš5kº»»‰ø¯z_•…R¶uNJJÊG}d·Û½wV"TRRÒÑ£G322!ÍÍÍ‹-êìì”™6‚q ¬†Á¸ )2:! è Ý€;WMY»òHp8gΜ¹víÚèèèÈȈ¦¡dÆ3a„¦¦&± Úýªx ÎÔJ Ó –§ç­|}}½Ýnß»w/!dhhèá‡ŽŽŽž:uªðgLJ‡‹‹‹ãââbccwíÚÅ'RÎlÌqú<Ü|ƯŸ>>::zÍš5CCCÞiЭ€ýí}AÒÜ`y†×C4å@Z±bENNNtttiiéþýû5 %3ž7.X°@ìT Ï¯Š^™aR4¦™R´dµv锳yÅÅÿÆoÄÅÅýéOânÚ´iÙ²e½½½===K–,áÓðóŸÿ|ñâÅííí/^,,,äc3³XœB>ã×nÇUÉ[­ËH·"„,]º´§§Çét.Y²dóæÍމѳ€XµóVx•Ò“QÛÕU÷˪ Õg£n¡ä1yMð+“Q±ÕâoN"çÁ2PA E';’j¶¶†êêꤤ¤O>ù„_˜””ÔÒÒÂ}æ rŸív{SS“w ]]]ü×ÔÔÔÆÆFîsOOO||¼tœB>ã×Em ú!DgRR’wbô, Vƒ¼5êäcÉçFëí‘ÛtÞ¨%©ÞÖ ›‚P&ok™<´5èm œæ†i½â«QRåG«C^1 “žžîp8*++ù…6›mhh(44”âv»Ã¸4Øl6—ËÅ ÅÆ L!¿2˲£££ ÃŒŽŽJÄ)ä3~¨•·:LÞ©O1 ãv»ù8###¹Ò³€Í¿|)¶i£¶®ŠÎäÒOƒ'ou 83•͹« ”i'ÎËË«¨¨HIIiooüñÇûÛߊ­iª¯ýâýN„I&憄àÄ0 æk ÉÑ£G_ýuákÿ gÏžå>·¶¶ — ¿ú”ÐÖÖæv»GFF¸§Yé8=ÂŽÒ§€!Â8§Nê3¬ ÈS={‡ HC Ñ_mmíܹsÃÃÃÓÒÒöíÛÇ/¯©©IKK Ÿ7oÞ©S§¸…|) %A8)Ç<;„ŸóéHÌ¿# îñÕårÄÄÄÄÄĬ]»Öårù UYYY\\Lyì±Ç„ÝVâ³ËÌŒeYüXkô¬`ú°ÛíG}饗vìØÁ-ÉÍÍ}ôÑGù¹‘ù5W¯^½~ýúÎÎÎþþ~ár!±Ù˜Åâf¯œøƒ>DyôÑG{{{¹8xàn¡• ÈØûH+57Uÿ˜!‚ É[“x衇ÊË˯\¹rìØ±úúz~y]]ÝñãÇûûû³³³óóóU %æÐ¡CË–-«©©Ù°a·äĉ n·›ûzìØ±S§N={¶»»{Û¶mܪªª“'O6448Έˆˆ’’>Bà¯eee]]]---ÍÍÍmmm[·n ÅU{ œ²ÀRÔz,‰®J¢EjeÆ©OFñ›èîîž={ö“O>ɲìÕ«Wóòò"##§L™R]]ͯsíڵ‰'ÆÆÆ>÷Üs1pFFFªªªRSSÃÂÂnºé¦ƒrËÅâ÷¿FTÉ^ÊH·"„<óÌ3\ÿX^^ÞÕ«W½ƒëY@¬¡GŸ¦,p­¤=ýþÒm-P7ÌFN~¦¤¤ìÞ½ûܹs/\¸À}°Ùlüò@BùL¡÷¤<äßçÙ!"óéHÌ¿ã\ø511±¹¹™ûüÅ_$&&ú\mõêÕííí„sçέ^½Z,ý,æk0ˆ¿9‰œk ˜¯¤ÑÕ!¦Å[Ö2s€®Œò—!oŸz$€œ½V*#ÃKÄ›á¦h‡öé̇zÒmƒ-cõ1f®Ö××WTT|üñÇ‘‘‘{÷îÍþÿØ»ûð(ª<_à§’NBÒÑ€Òä=äQ`ã ÌîìÕà2¼ Kdu4%M6ð0׫‰ÉaD AÐÑèÎu×ÁydF]uVgƒ˜aÅM0;d€!Àæ…I:ÉhóÞIß?j§nÙÕ]]]]/§ª¾Ÿ?x*Eªs~§^O:—G§DîOnB^*¿ÙÊ#\ßñtDÆßñ› –ψ?ÜÚüfRâp„Žñ4e#¨·Þz«¤¤¤»»[½Ãã5€5a¼0œ”@q܉ň×ܰªÕËüùó=ÚÓÓóÊ+¯üà?P5•_ÂAy„üާ#2þŽˆ¤¤$þÚ’’’D6Ç)ïL+’*è ·lÙòÞ{ï™#zTñb¼q†nnÅa7ÐQ~~þ… FFFÆÇÇÇÆÆTMå—pP!¿ã鈌¿#žó²²2nÄŸüüüp2oòžùER]a{{ûw¾ó€ "¸¯) Ĉy-áFPY8Ühcáº4ë‘o47ÐD³}Æ:‡!UV­Zµzõj»Ý^QQqøðaUS’œœ|òäÉ7Þxc÷îÝ~ÈÍÍ;wnVV–Ãᨬ¬dgVTTäææ.^¼8..níÚµ«W¯–²­ªªª¤¤¤3fÌœ93555Ð)§ï¯‡pÿÅ0Œ0-ûQFDD»X þ ?úª±›¨²yÆx 4Àx ôS/¼´Uœ†o0PV•¥öGæì„Õ¢ª ÚŽwóÑe¼†ÄÄÄŸþô§+W®t»Ý»wï~õÕWÙ•?ðÀ/¼ðÂ-·ÜòÜsÏ}ðÁuuu„7"ƒ¼T~KÁ5AM[^^~ñâÅC‡y½ÞüÇü«¿ú«çž{.ÌâŒ×VÅô’‰#P3F 5ÚÌm ô³N[1ÎÓ&…¡Ó†m Œª6^µéÒÖ‘‘QVVvÿý÷§§§óWÞÛÛ;yòdBÈÀÀ@BB‚ϰ—òRù-×Ö4mJJÊÉ“'gΜIijjZ¸páµk×Â,>A[XÆk³¡§ÓµŠN£Mc¨#}QxDcøË€Úè9Þ½s¤½vàwÞy§¦¦æÎ;ïLOOÿý÷¹ùìc?!$..Îãñ(’J\дn·;;;›ž>}zwwwHëø†Äô¾JÁl«Ý¯!PK¼ø÷M2RIü),íëZbƈ~ýPGšÕ‘.+—òÞ ”gOU*í0V©–è<ÞÍA÷·ëÇ/**êìì$ìSxÅ‘—*è2~秤¤|òÉ'3fÌ „\ºtiáÂ…íííá\÷Èè‚aôk ‘âã0SÈétº\.BˆËår:zg'd¨#Ñö^Ñ£EkSŠªïÆ­R-ÑÓµÁdt||Õý×C¤³à¨*‚曤@Œ˜gÐw*úŽÃÌ©¯¯OMM}饗!ÃÃÃëׯ·Û퇃ÿkᣣ£åå剉‰“&Mzþù繕WWW§§§Ûl6BÈØØØ¶mÛ¦NWPPÐßßÏ.æ³N‘,UUU•——Büñªªª 9×€Eêˆa˜}ûö%%%Ùíö¢¢¢ááá@9¡¤Ž¨}ºãÿ(m'P^3ÈFï‡HdŽþ „×ëE¿¬[·®²²òƵµµõõõÜüšššS§Nõõõååå+’*wß}wÅŠxì±Ç!O>ùdOOOkkëÙ³gOœ8Á-VYYyîܹ†††æææ«W¯róëêêØO÷ìÙsæÌ™††·Û³uëVv™@ëô‹½}§ç!Í"uD©­­mllliiéììܱc‡H~h«# ¡¹@Yt¾004}Ë~øá‹/ŽŽŽþñ\²d ;Ó'3ÜŸÜ„¼TB–ñ;„ ¯¾úêõëׯ_¿þꫯN˜0!„r€ 0ãî$Jå\âz¤,–žž^]]ÝÖÖæ“°··—îïï·ÙlÜüpRùÍáþýûSRR>ÿüsnfJJÊåË—Ù馦&.yjjjSS“p ÜŸçÎc§»ºº’’’Ä×)TXXÈ>$·µµZÌ«Pm¢Ž¸:"„ð×™’’(Kב8ÊOGT]Uéɉ^”â©=ª(£“LTRB$"æ@06$ˆ3t¯Q-”²X}}ýîÝ»OŸ>ûÒK/ååå #ÉKå7‡ÙÙÙùùùüžð6›mxx822’âñx¢¢¢Øä6›mhhˆí‡/Ü ‹[ØëõŽ3 3>>.²N‘Ð)Þ PG\1 ãñx¸uÆÆÆ²¿û%:mêH÷M„‰ž±é•Ú!X©µtˆ¼" £áÎ$¾0”dcC‚51 ƒñ42þü£Göôô¼òÊ+?øÁTMå×'Ÿ|òöÛoó¿ùŸ6mZKK ;ÝÜÜÌŸÏÿÓ¯iÓ¦µ¶¶z<ž±±1öQV|Pu)µHBøët8â롪ŽhÆ )ÝqM{Ê®´Ä? ô͉qY­½ÆïkUЋã5€éÑs¢û8Ì©©©Ÿ|òÉk¯½¶wï^vNAAAii)7Þ2·daaá£>ÚÞÞÞ××ÇŸÏ·iÓ¦ 6\¹rÅãñœ?¾  @|†`‘:"„”––vww³ë\³fM8yÖŒâOjàßÝê•U¼S‚©/Ý&C³ZCP(ˆÍ~FÌ3h¶„†q˜“““Ož<ùÆo°C+ïܹ3111##cîܹ .ä{ê©§n»í¶œœœìì쬬,¿«ª¨¨ÈÍÍ]¼xq\\ÜÚµkW¯^ÍδNC°HBrssçΛ••åp8*++ÃÌ3øÀ’9 úh€£I44€î)_á‚•ý•NøùWp¼kRä$£åÐV Æ™_›ð«õº×7V”Ô£Ùù4Àoh@ˆS0Vjò.@F`Áx `M¯,{ €9â3 Ž.ïcq‡ª£ìfáóujÇ/~d ×X^bO ™×ëµ_ À°¼^¯¯CŽÃLa–ôEa@(Ì’ p§ 4h ~˜¯CQeTá·6Zðâ.‘AwZyÙ6ha¬ã5˜ Uã0{ÿò›‹ôd‰úÄïæŒUGzÌðy«of@"´ ÑŒþ”^h‹ÌñãÇçÌ™™™yðàAnþ233£££çÍ›×ØØÈÎäNòRù˜9sæÅ‹ !W¯^ˆˆèèè „\¼xqæÌ™„–––¼¼¼›nºi„ Ë–-ëîîæÖV]]žžÎþž4Ã0~7 1 ƒß¡“3V§kGÕ´tÚ47à Y¸^‚°yô®_ëÖ­«¬¬¼qãFmmm}}=7¿¦¦æÔ©S}}}yyyÅÅÅŠ¤ò±lÙ²“'OB>øàƒ˜˜˜>ø€òñÇ/_¾œ²råÊ’’öǘn¿ýö²²2.a]]]CCƒÇ㑱QÂ(µ Æw®á”cCÒcCÒOËð·*Õ-Ò¸‘Q‰¼€ Œ¬0…ŒŒŒ²²²ûï¿?==¿ÎÞÞÞÉ“'BFGG oôGy©|?~üç?ÿù[o½µbÅŠ9sæ\¸pá7¿ùÍC=´~ýú¥K—ò—ÈÌÌd»60 ÓÑÑ1mÚ4ñÊ€±!Á²Ð¯€^*‰~¨#íy ÛYÉ‹)¨‡ªà„y²}çwjjjî¼óÎôôô÷ߟ›Ï>½Bâââ¸a¦òqï½÷ÖÕÕ œ>}zÛ¶mŸ~úéÀÀ@]]ݽ÷ÞKùì³ÏrssããㆱÛí½½½\B®¡AÆF@ÈØ?!j3Mêì‚èÛ¯!Pƒ½øhgòRÑŒæ~ ¨#–Æç CŸšTúõ>CÇD=xEŽˆãÇuvvÁeŽûSxù“—гlÙ²… ~ôÑG¿ûÝï–,Y²hÑ¢O>ù䨱c„´´´çž{î»ßýnBBÂ7ü®MüÏàDÖ„ñ IÞå--¡Ž þ—Õx‹NÜß((??ÿÂ… ###ãããcccª¦Z¶lÙÞ½{ï»ï>BÈ’%KöîÝ»lÙ2ö¿£££ccc[[[7nÜ({T~¦€:×LÉìwý>5mÛ¶mêÔ©qqqýýýìbÃÃÃëׯ·Ûí‡ãÙgŸ5ÁyÆ|uÄ0̾}û’’’ìv{QQÑðð°"Ò€q?£à ¹6¨e­ZµjõêÕv»½¢¢âðáê¦Z¶lÙ—_~¹xñbBÈ}÷Ýwýúu®­áСC›7oŽ_´hÑ‚ doÄýÿ¶û0G¾³2Óî!¯,S…¨)S¦9rdhh¨­­­¸¸˜[í<àr¹úûûwîÜ9þ|n~8©„fÏž}âĉëׯ—••­Y³F|ýùùù===쟻víZ¼x±ËåúꫯœNç#<ÂÎß¼yóŠ+º»»»ººØ¡˜dG‘ýu$¬#BÈòåË»ººÜn÷Ò¥K·lÙ";8ÚŸ+Ìqvâ_CJåw=ÊåË<¤G1Âq¡ˆPȰƒiõÛ`І™:”ª: yøÒq¸fü1™­Ÿ?PsffæoûÛÙ³gBÜnwNNNWW!$55õäÉ“3fÌ „\ºtiÖ¬Y²ãCÉx æ«#†a._¾ÌÕÑÂ… ÛÛÛåGûs…iÎNœ‚¿oËnšh(.¤s¸”%,çE`¼°&*Ækõ#C|ôÁÏdH6Dé Úðê8\3 <&s õój¾víZNNŽÍf‹ŒŒt8\ßþ®®®¬¬,v:;;[Z¨f¾:"„ðëÈívK-¼ÆÿŒ‚Å6üYWCÕ2e6c…;{†8Ó2zçèÐpV¦C¾)›úø™ )ô•޶ü„IFq4ë×ÀÑe¸æ@c2KYzzú§Ÿ~ššš*\çÇl¦~ ÓÔ‘O¿†E‹¹\.!:+Ly‚"þJ$ü/þ¼“糟 &¢à0©wó @?ýû5˜÷Î @„¾Ã5“YÊú7mÚ´aÆ+W®x<žóçϰó JKK{zzº»»KJJdçæ«#BHiiiww7[GkÖ¬‘=Ñö K6áð~è|¹GaL%q†èÚ@-´€Õ…>ăÂ|²ÁþùÎ;ï|ç;ß™0a‚Ýn_²dÉ¥K—øÿ+Ì|mmíâÅ‹oºé¦˜˜˜;ï¼ó_ÿõ_}V888XRR’˜˜ÁŸðàÁ¬¬¬èèè9sæüú׿~â‰'’““£¢¢îºë®ÿú¯ÿâçSd^¯÷ðáÃÓ§OŠŠºýöÛþóŸó³ç“Õ7ß|“së­·nß¾}hhHvéÔFÉN¢»½ÄåÃÔ›o¾9kÖ,›Í6gΜ?ü[­ÏV|&ä¥:zôèôéÓm6[VVÖË/¿ÒúÇÆÆöìÙ“‘‘uÇw9r„?88èt:ccc§Nºÿþpâ£È~ˆ:Ö!dß¾}ìïS8ÎÁÁÁÐ"òÍ"èr®0Ù9Êà4%œI$Ð<ïT+ï7ƒ&ü_‡‰lòB‡€ƒ9P±û½êûÛßþÓŸþ444´oß>öÏ@Ë{½Þ?þØf³-X°àêÕ«_}õÕ?ýÓ?B~þóŸó—¯®®þÓŸþ4>>üüüëׯ9r„ýóá‡æþÌÉÉ‘¸‰ßüæ7„¿û»¿ëêêêìì¼÷Þ{ù™ôÉðöíÛ;öõ×_ýõ×Ï?ÿÏÃä›üÎÒ/ûú .Dˆ€D8Xd4DÌP8^ûçþð‡œœBH|||dd$7vš°3Ò‚ jkkçÎKùâ‹/&Ož|ë­·655qËÿñœ3gŽp»ÿýßÿ=88Ga?]·ÙlÜFÅ7q÷ÝwÿÇüG}}ý]wÝE9sæÌüùó¹LŠôžŒŒœ:u*7$[¨¥S›ùº~©4>ˆù¥8‰¿°(-¡i¼Ó§R„«"z„×ÄCê±Ì¿²b¾h„JJoï_†º@¸‚2ñÉV%áD §&0 ýO~Û<Odd¤Èü ÛíöŸÕrÍìòcccßœÂg¾ß?¹­ˆo"..nppphh(&&†2<<>â> cò IDATæZLÊ&¤x衇^ýõâââžžn Râþ¦X~;8i³]m6dšÕ*ňУA"Ù¡ ó¾@wA:…FÃ0føŠoûÛ„ÚÚZ½61oÞ¯×k¼~ •••“&Mºýö۹㙚qöìÙ‹-Šýë¿þëãÇ?ýôÓ nT|ßûÞ÷>|õêÕ´´´{ï½·°°0ÐzÞ~ûíûï¿ÿ©§žš4iRaaáöíÛi(ÐFÞõW}-¡Ž@ wõuň¤D­ !á77àºÆâ‡çŽbƒ)™upéåÒelÈ@#ö‰ä'#•‚CªŠÂ±!QG>t?Wèž•ˆ ‰ûZéD‡=ÙøG–e%5‚`Ö+X Ã06½ó ö6Ý(Oqy¹5Vu~)þê¿BÍÞ+šlG5Yq´Çÿ(Õâp>јY÷7óíHƯÀLŽ?>gΜèèèÌÌ̃ró8™™=oÞ¼ÆÆFv&w¨ÊK僻9à,,,´Ûí‡ãÙgŸßÃ0ÕÕÕééé6›266¶mÛ¶©S§ÆÅÅô÷÷³‹ ¯_¿^¸N1}1 ³oß¾¤¤$»Ý^TT4<<¬@Ô¬Ð;GÊ0n¹|îÞðÑ€‚,~@Y¼øÚ0îÕ'T&+©!ÇkPîÇðºuë*++oܸQ[[[__Ïͯ©©9uêT___^^^qq±"©|°—Fþ5òÉ'ŸüòË/[[[ù?}hsuuu ì/°îÙ³çÌ™3 n·;&&fëÖ­Ü:{zzZ[[Ïž={âÄ !ÒéëˆR[[ÛØØØÒÒÒÙÙ¹cÇŽPCDJÆ| tg üS#’^^¥"© UW.e£æ¦÷ùI7zÞäKõ®vµH€aèR š¹w)¥“ÙJOO¯®®nkkóY[oo/;Ýßßo³Ù¸ùá¤ò›mþŸ)))W®\a§/_¾tsÜŸçÎc§»ºº’’’¸u^¾|™njj’%EöCÔQ :"„ðë(%%%PfDÐp®Ð7Ö¼°*UêðndŒD©È€‰átáµêUUÈÐq „ _€¼rß©¾óÎ;555wÞygzzúûï¿ÏÍŸOE(ø†‚6JÕ‘¼J®„Ð[mr‚w/"D‚ƒ¸ù@@@ˆžKªfp2 ‰QÂÅ0L„î]ø{ì1—ËõÇ?þ‘ò`XÁc=öÅ_tuumÞ¼9//Oï쀨#Ýå¯.,>wˆ›P XX®¡2ʵÃëõê?^CWW!döìÙºl]ƒÎ`^¹?s  ‰?ü>kÖ¬Ûn»mæÌ™7ß|ó®]»4Τ_ ¶î£ŽTBÕÍj™’òÒ =¤3Ê-#€ªpu‰Q¡ïÃ6weåßX o²…ÿû«_ýêoÿöocccããã¿ûÝﲿ3Ï:wî\~~þ´iÓ¢££srrŽ9"}[¿ûÝïî¹çž¸¸¸¸¸¸»ï¾û£>òÉC í¶¶¶>ôÐCIII6›Íápüþ÷¿W(H .ÊŸ?•â÷*¡GyÄív߸qã¿ø;L€âÙP|¦¡W¡RBBUÃ Íø§V44ˆCsX®ª²ÑÿÃ0ŒÎý¸ËçÆ:hÔöïßÿ³Ÿý¬¯¯oÇŽ}ôÑÚµkÙùõõõßþö·ÿó?ÿóW¿úÕ×_ýÖ[o½÷Þ{âÛâ|ôÑGK—.µÙlÿýßÿÝÒÒ½lÙ2~sƒÈv¿ÿýïÿë¿þ뫯¾Úßßÿ_ÿõ_ßûÞ÷¶oßr8Ààè?æ Gñ+êHq¸K‰°“ˆ@pÔ&ñöw‰ ÒÿUƒßñ###=ßeØé?üá999„þþþøøxnùÅ‹×ÔÔüÛ¿ýÛw¿û]‰ÛâæÜ}÷ÝÿñÿQ__×]wBΜ93þü»ï¾›í¡ ¾Ý¨¨(Çsâĉ{ï½×L;¨Ež"DŠj,1ͨOÔ‘²èŒ§J¹¢³°4C†`b¥SÆ%åÃÛïÿŠ'Ñå{‹þ7òÚ<Odd¤ðívûÀÀÀÀÀ@ll¬Ämqsââ⇆†bbb!ÃÃÃ&LˆºÝ»îºëóÏ?gWrë­·.X°`óæÍ)))ÊÄH?”ï¾ TR°NÐÔ¦^$QGJ¡6’hk ÚB‚ ˆ•Nzµ5(²%(ß[t¯Aб±1áLî_=~Ãh»o¿ýöÃ?ýÍ7ßt»Ýׯ_ÿÅ/~Á_ˆ"*Fù ŸÚïBQGá£ü}5¹òkåÊ•%%%ÝÝÝÝÝÝ·ß~{YY÷_µµµ---;vìàæ×ÕÕ544°½ÿöìÙsæÌ™††·Û³uëVv™'Ÿ|²§§§µµõìÙ³'Nœð»éÊÊÊsçÎ544477_½zUÍRh-è¥pݺu•••7nܨ­­­¯¯çÿ׻ᄏbÅŠ<öØcüùO<ñDGGÇåË—/]ºÔÚÚêw„>\^} Ç?׌0óçÏ'„<ûì³CCC/^üö·¿Í_F¸<ÎgŸ}6a„éÓ§Ÿ>}zdd¤©©iݺuÜ’S¦L!„\¸pÁoÚ?ü0""bÁ‚]]]÷Þ{oDDć~(e»÷ÝwßÑ£G{{{GFFŽ;F¹ûî»ÃŽîtß=´ä·°²#@ÃÁePš…u$›!B§x5(rbb"·¹Ë—/³ÓMMM)))ÜüŽŽ.IFFƹsçØé®®®¤¤$v:%%…ŸÜoÎSSS›ššT(‡—˪Jknn^µjU|||LLÌÒ¥KÝn7·Ågžy†íå±~ýú¡¡!nþ /¼––éõz=OEEEbbblll~~þ×_-žœodd¤¬¬lÊ”)'Nüñ¬Féè?¸@U9 hPÌ@—Bn"==½ººº­­Í'cû÷ïOIIùüóÏù3Ù‰äääK—.±Ó/^LNNnWíË«šwýï…¸téÒ’%KâââbbbæÏŸÏýhe å}æœ={öûßÿ>ûó“³gÏ~ûí·¹ÿúÉO~2iÒ$‘µ}øá‡wß}wlllllìÿú_ÿ‹khºÝ“'O>øàƒ‰‰‰‘‘‘IIIkÖ¬ioo',”Ð}÷Ð’²m ^ƒ<ÑFã ¡Žd0JÐϧJ¥>}úô=÷Üc·ÛÙõ³Ÿ‰²›óx<ìôèè¨Ífãæó“Ûl¶ÈÈÈÈÈȈˆ~rvØ#.¹ßœGFFŽŽŽ*^"ŽzûÉìÙ³Oœ8100pýúõ²²²5kÖp[\¾|yWW—Ûí^ºté–-[¸ùùùù===쟻víZ¼x±ËåúꫯœNç#<"žœïG?úÑ’%K®^½úÅ_”””¨Q:C_ ‹œ4(f K!7QWW·råÊ)S¦¤¥¥½÷Þ{Üÿfgg?ñÄ>¹õ»Nîêì³]U/¯>hÞa(ÍP‚æ}W A[²ä­ÐR1 ‡.áB…ÄXá2D[Cjjê[o½õå—_Ž_¿~'Ä“ššÊÍç'OKKs¹\~Wkâ~ | v ”œOƒ·U:Ä@ 9 hPÌ@—Báv;æp8¸ÿu¹\3fÌØ¿??·ìDrr2 W >jwBã5˜†—7.†Á—÷@«Ô‘D:Ö‘¹ FGGÇÆÆ¶¶¶nܸ‘ÿ_¥¥¥ì8%%%kÖ¬ñ›|Ó¦M6l¸råŠÇã9þ|AA;¿   ´´´§§‡MÎ-ÏßÉ }ôÑööö¾¾>þ2ôûì³ÏrssããㆱÛí½½½Üeee±ÙÙÙn·››?mÚ4núÚµk999l—‡ÃÁÇ)’œÓÙÙ™­lq@ .…œüüü .ŒŒŒŒóŽ 55õ“O>yíµ×öîÝ+LRVVÆ­3??ŸoŽË«â"p{  *®aàiÖŸ'X]bQGâh¨#y¼Ê άÞpÙ‡Ú¼ys||ü¢E‹,XÀÿ¯ÜÜܹsçfee9ŽÊÊJ¿É+**rss/^·víÚÕ«W³ówîÜ™˜˜˜‘‘1wîÜ… úMûÔSOÝvÛm999ÙÙÙÜ3¶!<øàƒ<òH{{;Û„_/---ìDss³Ãáð›|Ú´i­­­gllÌëõŽKO>mÚ´ææfÅJ`IÚüRcÐKáªU«V¯^m·Û+**>Ìÿ¯äää“'O¾ñÆ»wïæÏ¯ªªJJJš1cÆÌ™3SSS}þ—eÜË«²¼^/^RʲU >EV6xˆ „ž} u=u¥aíO†Êþ¾·.¿®^ЦL™òꫯ._¾¼££cÛ¶mìÀLìW¬Xñ³ŸýŒRXX˜““óÌ3ÏAñ÷ìÙóûßÿþŸÿùŸ333›ššž~úé_þò—“oß¾½¾¾þµ×^‹ê©§^|ñEÅKgÁ+/ðYá$`…2j†æ`Fë%€¡áp¢-&´å‡ˆ È ê­JA¤$ÇÛ*)]^t€ÐÜN¦’@ýLp°ø¼±W¶8ÜU‡ªD‘À¢_ƒŒ-Í÷ç0‹IÉy§‹³ÂIÀ eÔ µÁdã5|ƒß¼ÍqŒø¼Æ±OÔøPö¦Â[01¯×‹ß¡ø† |FDG‹Íð@¨ìçZÂx þ ¿80Óc9Z¨‚à« ×8ë³®±«(…aôkøŸ'máÇNü'@þ´iîG•jq ö;1cAM)œc øÌqU}ë­·’’’LùɶŒ×ð‘ -x8 ƒ¾mÍPjsÜ-Ñ–°&•®ªâ ȾnÙ²å½÷Þó;Hœ™`¼€ÿ!ý•²Y_>£ÅA_fݯ(Aaxåe‰ž‚8N—ËEq¹\N§SÁ5›£´¤øUU½Ë!¤½½ý;ßùNÐ<˜Ækø8Z4‡ðšÉñãÇçÌ™™™yðàAnþ233£££çÍ›×ØØÈÎäª^^*¡–––¼¼¼›nºi„ Ë–-ëîîæ’ìÛ·/))Én· só«««ÓÓÓm6!dlllÛ¶mS§N‹‹+((èïïg^¿~½Ýnw8Ï>û,—ªªªòòrBÈã?^UUnì$0Gmù –¾WÕ —96-ÿVyhhhÆ 7nò»fö÷•#""¸5ø,èŠl8¯à‚67X¤=-³È~¥/ z*®[·®²²òƵµµõõõÜüšššS§Nõõõååå+’JhåÊ•%%%ÝÝÝÝÝÝ·ß~{YY÷_µµµ---;vìàæ×ÕÕ544x<BÈž={Μ9ÓÐÐàv»cbb¶nÝÊ.óä“Oöôô´¶¶ž={öĉü-ºIR z‚XоWUì2Ç^_ø÷ÌO<ñDGGÇåË—/]ºÔÚÚº}ûv‰ }º"˜Àkî8Rø‚FÀ²‘ Ÿ•÷+]„m)iÓÓÓ«««ÛÚÚ|ööö²Óýýý6››N*qýýý‰‰‰\’Ë—/³ÓMMM)))ÜüŽŽ.IFFƹsçØé®®®¤¤$v:%%…ŸœË@aaáÕ«W !mmm………Âø !äþá\.—HXpZ°8+œ迪½Ì “'''_ºt‰¾xñbrrr •ó^»;èŠ,²6jwÜé‚Ëîhhð! G6„NcaÛ’—JhöìÙ'Nœ¸~ýzYYÙš5k¸$Ë—/ïêêr»ÝK—.ݲe 7???¿§§‡ýs×®]‹/v¹\_}õ•Óé|ä‘GÄ“»\®ïÿû\>E‚3€ÅYá$ ¥Œú^U¥,àó¿>WLî‚+žP˜™@Wd‘µQ»ÃPš- Íû®ÚÐÖ ä7Ž<ˆ›. »ô´ÇŽs8\*Ÿ•ø/;'55õ­·ÞúòË/ÇÇǯ_¿ÎOÂšêwUiii~€SSSýökŠ —HÜLÙ$Pr)¯È¸5àä`eV8 „TF]®ªRø$ONNö{þO(ÌL +²ÈÚèÜa!¯À?¯àÑZ¯œÐƒ;q â ŸŸáÂ…‘‘‘ñññ±±1US FGGÇÆÆ¶¶¶nܸ‘ÿ_¥¥¥ì8%%%kÖ¬ñ›|Ó¦M6l¸råŠÇã9þ|AA;¿   ´´´§§‡M.=?Þ¿ Á?oøxçwjjjî¼óÎôôô÷ߟ›?yòdv"..ŽN"üTBŸ}öYnnn||<Ã0v»½··—û¯¬¬,v";;Ûívsó§M›ÆM_»v-''‡}ûäp8¸Á8%ýõ×ÓÒÒ!éé鯿þzÐìXœ¾WU)&NœÈ¶Âs›.++㮘ùùùòVèŠl`:5ví°{à çp hz 'òAÓ¾ù曳fͲÙlsæÌùðùT>+ñ™—JèèÑ£Ó§O·ÙlYYY/¿ü2?ɾ}ûØáœNçàà ßUíÙ³‡ïàŽ;î8rä;ppÐétÆÆÆN:uÿþý!EOz´ÍÔ$Prép~°8+œ¤”Qß«ªUUUñññÜJ‹‹‹o¾ùæ›o¾¹¸¸˜»à ñ·+ÌL +²ÈÚ¨Ýa.sR›%ÀJØ×Úïxa>mj_S8H§×‘$Œà´ÖØžº¬-hÄòóóŸ|òÉ3füîw¿[¿~=Û5ÀgÜŸÜ„¼TBS¦LyõÕW—/_ÞÑѱmÛ¶·ß~›K²bÅŠŸýìg„œœœgžyF¸ª={öüþ÷¿ÿçþçÌÌ̦¦¦§Ÿ~ú—¿ü¥Hré º§€R¬p°B5Cs0#Ø&½³tÞ6F@ï™öQEÝIDó%@K«V­Z½zµÝn¯¨¨8|ø°ª©„:´yóæøøøE‹-X°€ÿ_¹¹¹sçÎÍÊÊr8•••~“WTTäææ.^¼8..níÚµ«W¯)9€¹1ʾîÐ îÔ5£v¨Å±¡Mlù{ú8H„3˜¾¸Õ¸]„G·H–hî×@§0#~À 7PŠNT•QÊU5¤+¯" ¥£*˜| ÃØ¨ÍœcåüÂs©Ú%Õ;äù-F<±h‘Ñ×ë5zœöew6ìº`2R.m²/V¾nz½^›ÞyËA+ƒ^´i @‹˜ÛNaÐ.z¡!\¼VR N›`6#^Ïp%6®pz/ƒ"|ÚÂì*LT%ZüB((&«Ñ²'v*BÃ0zç, ôàª@ÕÎäü¡g1r$˜ƒptð+Ð`. Í‘ÒÉ»¸à’¤¥#>ñ·3 ´Ñ¦¹ Åá/ða2–Ý“¥@p@/*µA(riÓf+”ðz½è×Z@C4kn hqÊ„ó¾]ËLj|NøèÚ š#!ïD*’Êétº\.BˆËår:²3&¾SŠ0b<¨ h¦ñS“e[ða2hnDä„X‰@pD?~|Μ9ÑÑÑ™™™äæ8p 333::zÞ¼yìLîŒ*/•PUUUyy9!äñǯªªò» Ã0ûöíKJJ²ÛíEEEÃÃÃÜüêêêôôt›ÍÆß Ã0Âlp#™ã¢€ñ@;xÊ¢–¼ª çáÙ²-`&hn ÔЀX‰C‹<€¸uëÖUVVÞ¸q£¶¶¶¾¾ž›_SSsêÔ©¾¾¾¼¼¼ââbERùÅï<ÚÚÚÆÆÆ–––ÎÎÎ;vpóëêê<ÏòÂlpýMs9Àå Ä„ÿ2¯s"ÔšRªf­ð¨8 ¨¥Ô).Ì•˜CÐP V~!,àà · ¡–1##£¬¬ìþûïOOO篤··wòäÉ„„„„ÑÑQÂû5y©„œNçîÝ»ÓÓÓÛÚÚvìØñúë¯û-ÑåË—g̘A¹téÒÂ… ÛÛÛÙùÓ¦Mãã>- 5мÃà bÐÖ`zµ5ðׯ2ßÞ‚£€ZŠT¹÷^)¤GÏÕ>²ÂmC¨e¬¯¯ß½{÷éÓ§ccc_z饼¼<"x,ç?ƳòR‰äYd†a<Odd$!ÄãñÄÆÆúm;´9éÙð»iBëcÈ_§9 &f¨ÍTSÎfR}©Q¹¦|f3ÓQ`> >é™rï JF©ñtÍA(À/+Ü9È.ãñãÇ‹ŠŠ:;;I(ëòR…ħ_âE‹Øá$­ÜÖ€ñd¢ðx6ŒãSð@î½V ,»ô˜ó×`5>ÑÓ73ôËÏÏ¿páÂÈÈÈøøøØØ˜ª©d+--íîîîîî.))Y³f¼•Lœ8±©©IÙŒé(ˆ{3 ˜ab ­ml,Æß评±±±mÛ¶M:5..®   ¿¿Ÿø–›Ú°aCBBBBBÂÆ‡††„Û-//OLLœ4iÒóÏ?¯EñdáÚSƒ.©jåš©Åò£gµË“¼òšé•ì6+[µjÕêÕ«ív{EEÅáÇUM%[nnîܹs³²²Gee¥¼•üð‡?¼ë®»Ìqeôz½hV1á<)Qþ”Å0Ì<ð /ÜrË-Ï=÷Ü|PWWGÙ½{wmmí¡C‡{ì1»Ýþ“Ÿü„îéT^^~ñâÅC‡y½ÞüÇü«¿ú«çž{Îg[O<ñÄ™3gþå_þ%>>~çÎÕÕÕ44kM³Êe Þ/ò£ˆaû±›f×2ÇíT¨LPq ÓœáE˜¯ŒŒ~ŸWÓLC~sNs@MÆÜm ~GÍÌÌüío;{ölBˆÛíÎÉÉéêê"ÛRRRNž<9sæLBHSSÓÂ… ¯]»æ³­´´´ššš[o½U«ÂÉG[[s,j÷(!Ê஦ —á ¬Óâ`¦Z•˜ï$/d¾2¢­AˆÑ1(á 6 .êGñ IDATæcî¶¿mQQQì„×ëgf||\dy›Í6<<,u–Ïf³ Ùl6õ‹.:ÛøeQ»_ñQ~Çp5e¸ ëËp§°8+œä©-£°í[˜I¿Ë ­AˆaŒ×ð Ó¦MkmmõxÆÆŽAѶc a×’C£ÿz¾p14KeÔî0¯ Î>8GJ°k‰CC€É»ý šŠ’»JƒÂx `”´8àš*¡ö­=ðÝ€eÉ;틤r:.—‹âr¹œN§ìŒYÆk€PþÀCI‹µñÆú5 ðß›0™ãÇÏ™3':::33óàÁƒÜüdffFGGÏ›7¯±±‘É]䥪ªª*//'„<þøãUUU~—afß¾}IIIv»½¨¨hxx˜ßÒÒ’——wÓM7M˜0aÙ²eÝÝÝÜòÕÕÕééé6›-PVÇÆÆ¶mÛ6uêÔ¸¸¸‚‚‚þþþG †aЯ̆ÿ¤¡^‹ƒpµxL•PÞÆ§;tg0ŸuëÖUVVÞ¸q£¶¶¶¾¾ž›_SSsêÔ©¾¾¾¼¼¼ââbERùÅ^\ÄïîjkkZ:;;wìØÁÎ\¹reIIIwwwww÷í·ß^VVÆ-_WW×ÐÐàñxeuÏž=gΜihhp»Ý111[·n•’Ujáò b06¤Õ­8cÕ¬ÏåAÙl Ca¬à€¬t抴 >+ÜNH)cFFFYYÙý÷ߟžžÎOØÛÛ;yòdBÈÀÀ@BBÂèè(áþ(/•Óéܽ{wzzz[[ÛŽ;^ýu¿¥¸|ùòŒ3!—.]Z¸pa{{»Ï2™™™l׆a:::¦M›&RÀÌÌÌßþö·³gÏ&„¸Ýœ®®.‘(ºwÜÁ€íÛ4]VJ­Õ8&kk`©ÔâàóˆBs p§0K”ÀA¦d…Ó¾”2Ö××ïÞ½ûôéÓ±±±/½ôR^^ÜsròR‰äSü®ØãñDFFB<Oll,Û„ñÙgŸmÙ²¥¡¡ý‚a˜ññqáÚüf5**Š]ÆëõŽsiÅ3IhÝaô”’怚 =m AõPS¡­!ÐæHàŠ3ô½Œ‡ {U8/™mõhèƒN=èÎ&FÛ•H !•ñøñãEEE$”Vy©B-¿_âE‹Øá$ÓÒÒž{î¹ï~÷» 7nÜHHHß?«éééŸ~úijjjHÙ Tî0¯ CñÑeA6ƒFÕgÄ8‰ã8H\#5˜#Dô S †°‚üüü .ŒŒŒŒ©šJ¶ÒÒRv\†’’’5kÖ°3£££ccc[[[7nÜRV7mÚ´aÆ+W®x<žóçϨ]UEñ.·æ ï貜úúúÔÔÔ—^z‰2<<¼~ýz»Ýîp8ž}öYn™ÑÑÑòòòÄÄÄI“&=ÿüó!•(Ðp² ÃøÍs <ø ]hµ>Y={öìŒ3¸ãÅëõNŸ>=hLLLF‹CHgHF@fF(~S¡#tô°ˆU«V­^½Ún·WTT>|XÕT²åææÎ;7++ËápTVV²3:´yóæøøøE‹-X° ¤¬VTTäææ.^¼8..níÚµ«W¯V»êùÿWj/€?²w) §L™räÈ‘¡¡¡¶¶¶ââb.á<àr¹úûûwîÜ9þ|n~8©üæÐëõþêW¿JLLüÍo~ÃÎܼyóŠ+º»»»ºº–.]Ê%ÿÑ~´dÉ’«W¯~ñÅ%%%!•h×®]‹/v¹\_}õ•Óé|ä‘GÄó(„üüüžžñÕ ³ú­o}«¦¦†ýßÿ÷¿óÎ;E*E¼âLvºžEš<ÐI ‡’ºÃ^äGX„Ntæ(#%E 9˜úŽ.^õhFÕñô]–a˜ýû÷¿øâ‹G7o;355õäÉ“ÜgW³fÍb“§¥¥ÕÔÔÜzë­â¥i8Ù@y”Ÿ¡k­V˜ÕŸüä'Ÿ~úé/ùKBH~~þ=÷Üó¿ÿ÷ÿT)ã5˜ìÐÇAü›ð }L(K¡aW§!ô@w°+œÿÍQFFv#“¡$@¡¢6 æN¨ƒ¦ÕwtY†a²³³óó󫪪¸™6›mxx˜N– Öf³ ±/ˆi8Ù@y”Ÿå­V˜Õ/¿ü2++«¹¹ÙëõΘ1£¥¥eâĉРRkæ¾×÷Ûâ >œ¤x[ƒ)£dº_eÌ}¸… ÑKÑý¤ªÊ(¼£“ò†ÉëõRò(MU0ù\¿Aœªm ]F—eÆårýÝßýÝÆ7oÞÌÎLKKûøãe÷kð›·@ÃÉÊs <ø,hµ~³úÐCýíßþ­×ë­¯¯ÿÅ/~!’ó m æ>W„ÔU!ÐÂæ‘Eè¾·ëžJà÷&À‚¬p °B5Cs0ñ; ÝG—MMMýä“O^{íµ½{÷²s JKK{zzØád¹% }ôÑööö¾¾>þ|)y u8Ù@yðhµ~³ZTTô/ÿò/¯½öZQQ‘„ÀXûi™ÈønÂ"üvlÑ Í7 ZÂïMZ„/áÝÝh]699ùäÉ“o¼ñÆîÝ» !;wîLLLÌÈȘ;wîÂ… ¹Åžzê©Ûn»-''';;;+++¤¼…:œl <ø´Z¿Y½ï¾û®_¿þõ×_‹¬8²ÏІ;—P ý. ã5@Ú|Cô°ø7)c1 w·¹éõ¬k©Í/½Ž,£¿Ã0â>cô˜ËcÄšYáBfå=ÃôÉ7(jw†alÔfN„±r `FgΜèèèÌÌ̃ró8™™=oÞ¼ÆÆFv&wÉK%TUUU^^NyüñÇ«ªªü.Ã%g&Ðú÷íÛ—””d·Û‹ŠŠ†‡‡ýn—ý“û×'†að; "ïÔ!j¼W t¢Þi™Hß@ÈoÍMƒï&„O¼*mˆ*ü’j Z3æòè[S”[·n]eeå7jkkëëë¹ù555§NêëëËËË+..V$•_ü&€ ­¿¶¶¶±±±¥¥¥³³sÇŽ"k`Ϧ9mbœgþó'z…xM…Zšu‡C0îþ ñ‡EÆ Nø´Ù14hË ŸÆA@ÌeCè€X㊠½Œeee÷ßzz:?yooïäÉ“ ! £££„7Ò¼TBì7ééémmm;vìðû —\dý—/_ž1c!äÒ¥K .loon—¿žjŸæg4£È¾Kó,ŒûT j3辡ÍÌ‚çImž©ðäÆÑ,ˆy˜@°ÂAzëëëwïÞ}úôéØØØ—^z)//HxJ——J$·" Z¾Ç㉌Œ$„x<žØØX¿mælk 3[âh¨É(ØÖþz@%A+Hún€º†  ·“hpűàE ºÐæsµ7a£ÅYᢠ£ŒÇ/**êìì$¡<¥ËKjY‚¶5ðû5,Z´ÈårB¢¢¢¾úê«ØØXBÈŸÿüç)S¦˜¬­ã5€ø_!ê›Rð†÷F N>¬ŸÏøUÝ[1µ>Ä\)8Opòóó/\¸0222>>>66¦j*õ”––vwwwww—””¬Y³†™““óì³Ï \»vmÓ¦MÜÂ'NljjÒ)§ ‹0â 4¦-Ã:pÕ¤@Æ:!p/4ØŠéi6X ÎH¨wô!æÊ2Öy@=«V­Z½zµÝn¯¨¨8|ø°ª©Ô“››;wîܬ¬,‡ÃQYYÉÎ|õÕWßÿý„„„ï|ç;÷Þ{/·ðøÃ»îºËǾ×ëÅ…Ä(Û'7"T‘^AwÔ,È` ÝF½Þ‰ B˜4­ƒÚ¥”P#>ˆ¹Uk²B½[¡Œœ0¿Ñ²~Bk0#ŒØGÀˆ}1€ ‘ž&hhÝî„ ^>Mì ¡6Š÷ÖAÌU¢M¿*50 cÓ;`-^¯—áýJ-îK´§ÒM?ªdàN”S)Ÿ9 ¢9’¨ÿR ´z01á…^x¼KYølF¼×1VnÁ¿‘Þˆ»Ÿq©ÑÊ€„0±ñ¼ƒ7D#K˜4îÎÀߨÕv'<ôtŒ¹¼üë„cÙ“$€Æ¤bòC˼^¯ý@ÂІeÏw ’rχûBSR¼ZM¼“ ;h÷ý4Ãx  '#î~Æ¥x´ñþaˆ’Õ8vLL¯†UGñ¬®®NOO·Ùl„±±±mÛ¶M:5..®   ¿¿Ÿ]¬¥¥%//鍊nš0a²e˺»»…ëÙ»wï-·Üâp8Þÿý½{÷Nž<Ùáp|ôÑGÂŽŽŽ–——'&&Nš4éùçŸW¼PŠz*Åœa˜}ûö%%%Ùíö¢¢¢ááan>¿"¸Ì3 sàÀÌÌÌèèèyóæ566²óýÆŸÊïV‚Ö#ŸÚÕD r’ðÁ0L„ÞyøŸg`š(«"dT ZÔcÊ#‹ÿ2Àd¬««khhðx<„={öœ9s¦¡¡ÁívÇÄÄlݺ•]fåÊ•%%%ì¨ß~ûíeeeÂõ¸Ýn—ËõôÓO¯]»Öív_½zõé§Ÿ.//.YYYyîܹ†††æææ«W¯ªZ: ÕÖÖ666¶´´tvvîØ±ƒ›Ï¯¾šššS§Nõõõååå³3ƒÆÐïV¤Ô#ÇâÕ #y p†h¶3D&C ó3Ð »˲NjHy­ >®àuuu)))/¾ø¢×ër:qqqIIIû÷ïç–)++›2eÊĉüã ×t‹0Ä¥H& QRyt?Iª·uBHGG÷gFFƹsçØé®®®¤¤$a’þþþÄÄD.97ñç?ÿÙëõ ñ§###…kHMMmjjR´¾Â˜J1'„\¾|™njjJIIáæó+‚ØÞÞ^vº¿¿ßf³±Ó~cÈOåw+|~ë‘Oƒjòšú¼BV¨n¥®§!Í'•”Ò¶hÞaЯ 8ï7›ÌÖÖ²¼ûî»+V¬8pàÀc=FyòÉ'{zzZ[[Ïž={âÄ n± ¯¼ðN ÌÁ¬Ý8Ó¦M㦯]»–““c³Ù"##×Çþ³Ï>ËÍÍgÆn·÷öö ×sË-·BbbbøÓcccÂ%;;;³³³Õ(‹!dee±ÙÙÙn·››Ï¯¾É“'³qqq\¯‡ 1ô»)õȱx5PHÞeH$•Óét¹\„—Ëåt:egÌŠômêǸ97„šÃ…ÂÐÇN¨DJj Böïߟ’’òùçŸs3SRRøïǸà}å¥Í;1úb ?“†(f¨è¹©P/>«MKKs¹\ÂÅRSSßzë­/¿ür||üúõë„÷þ\¸ž@Óüµ¡_ƒ×ëmjjJMMåæû,&>?¤~ ÜV‚Ö#ú5€â¬PÝ¡–ñرc³gÏŽŠŠÊÈÈxå•W¸•üô§?ÍÈÈˆŠŠúÖ·¾uöìYn~8©„\.׃>Hù‡ø¿'6ù /¼––ÆöSóx<‰‰‰±±±ùùù_ý5»XssóªU«âããcbb–.]êv»ÙùºÇJAíCA¿€ÐxÿrHcŒR+;pà€Óéœ7o7§««‹ÿ~Œ›ô•Þ‰ˆ7¼ÚLyÆàwgð~³ÝÁÄ6mÚ´aÆ+W®x<žóçϰ󣣣ccc[[[7nÜ(cÍü¤°°ðÑGmooïëë+))Q&ëÆQZZÊŽ˜PRR²fÍy+ C¿[ Z¨&­[·®²²òƵµµõõõÜ|¿µ„™Ê/)¿ΰ>ºÇš„ž-@1ì|>Ñ0ýá#^:s—]!Äår͘1cÿþýÜÌÔÔTôk‡Qö¨pòi”2JDÛ]„ª9ñYóØØØž={Ø×bwÜqÇ‘#GØùG>}ºÍfËÊÊzùå—‰à}¸ÏED8ÍŸ922RRRrË-·Lš4é…^P¡XáM½˜BöíÛÇþÒ‡Óéäæû,&>ßo ù©ün%¤zÔ š¼¦;{€8+Tw¨eLOO¯®®nkkóY‰ßZ¸5ËK%TXXÈ~åÚÖÖVXX¨Dá ë¨{¬4ï0&ÿº„Ÿ!àFÃÜß'‹×¾•÷ †a¼^oGGÇÂ… ·mÛFÙºuëùóç:äõz ÿíßþ ÎöíÛëëë_{íµøøø§žzêÅ_äÖÀ®Íïd”=Jv>Mvº °8FÙ…¨fÐTý‘Q ªR›­(»·¥X¤ºC*f}}ýîÝ»OŸ>ûÒK/åååÁ!ÌýÉMÈK%’a‘|þ7**Êû—ö‹ññq†aÆÇÇ !Ÿ}öÙ–-[ØKææÛl¶áááÈÈHBˆÇãá’KAóÁ69èРï:舿ïqÇŽÕvHšOjšINN>yòäo¼±{÷nBÈÎ;322æÎ»páBn±§žzê¶ÛnËÉÉÉÎÎæ>²à ºP…»# '¹ÑQØÐ&6þü£Göôô¼òÊ+?øÁTMHH—¼iÓ¦µ¶¶z<ž±±1¶¹ÿàƒ>òÈ#íííìp0Ü:§M›ÖÒÒÂN777‡™UJ0 ƒñ¤ò{Šá77X­ÅÁ²¸Jw8.\xòÉ' !&L8tèÐÀÀ€ÛíÞ¼y3·LTTTuuõŸÿüç/¾ø¢´´Ôg “1MóÿDg‚â€!äçç_¸paddd||Üï÷(˜J¡ëSPPPZZÚÓÓãeVUaÄ$#öÅãï†;š@ ìÖt¡Í†ÝÀ(V­Zµzõj»Ý^QQqøðaUS)¢¢¢"77wñâÅqqqk×®]½z5;ÿСC›7oŽ_´hÑ‚ ¸åu54Œ×A˜æ]œRÄ_è™éukk§ )·Æ*Z ôŸßÌgQ;^ø@¨-Å"Õm‘bj€æHb¼€ˆ,øž|˜àT€ï& T¯@aøžÀ B!Ò¸èVønBÞ¹Zû3¼™®)F‰¹JLS€p„9Ö²JyËh†æN ã5„JÊ™Í @Œ°xw£?Ó“éôй¾umÄš0+¯€¼e€âõzѯ@hnðK÷{w)«B•²Œx‚ï&ˆÜ‚Ó.§Óér¹!.—Ëétêès½¶kÜšP] „òN ã5¨Ç¸Ã7hæR¯ ¢ººÚápDDÐÕ®Îþáp8^|ñEó2½C¢ÿ 7qüøñ9sæDGGgffb¨ªª*//'„<þøãUUUaLºÇ|ß¾}IIIv»½¨¨hxx˜›Ï¯ n ÃøÝÄèèhyyybbâ¤I“žþyŸíÚJЪ¤ª¦”…ñäÞ ‹á$RïÒ®]»~ýë_kü£Êª{ï½÷vîÜ©wF@ŒAwÓwgX·n]eeå7jkkëëë¹ù555§NêëëËËË+..V$•_uuu ‡²gÏž3gÎ444¸Ý˜­[·²Ë¬\¹²¤¤¤»»»»»ûöÛo/++®Çív»\®§Ÿ~zíÚµn·ûêÕ«O?ý4ûÔÊb둆ýP÷˜×ÖÖ666¶´´tvvîØ±ƒ›Ï¯ >¿›¨¬¬ûÃÀÀÀºuë„YIJ?óÌ3ì[Óõë× qó_xá…´´´ÈÈH¯×;88X\\|óÍ7ß|óÍ6l)¾Ç㩨¨HLLŒÍÏÏÿúë¯E²*¿a Z(ªˆäÙ¸Å1\¶9R2Ÿžž^]]ÝÖÖæ“°··—îïï·ÙlÜüpRùÍaGG÷gFFƹsçØé®®®¤¤$a’þþþÄÄDŸ5Bþüç?{½Þ¡¡!þ4{D{½ÞÂÂBöy¸­­­°°0p<ÂÝQ óË—/³ÓMMM)))Ü|~]ðcëw©©©MMM•‹o…ÏoUjVS`,V«n£_}ta” #— ìÈ8Â…O˜Ô šI)¥˜2eÊ‘#G†††ÚÚÚŠ‹‹¹„<ð€Ëåêïïß¹sçüùó¹ùᤠd||ÜgöÏ_ýêW‰‰‰¿ùÍoØ™›7o^±bEwwwWW×Ò¥K¹$?úÑ–,YrõêÕ/¾ø¢¤¤D¸þÙ³gŸ8qb``àúõëeeekÖ¬)…0œòòò•+Wvww»Ýîï}ï{âÑàÖ0>>.^|BÈòåË»ººÜn÷Ò¥K·lÙÂÍÏÏÏïééaÿ,++[¾|¹Ûíîêêºï¾ûÊËËEŠ¿k׮ŋ»\®¯¾úÊét>òÈ#"Y ŸÜÒhùͶQŽt>#æY(hêêêV®\9eÊ”´´´÷Þ{K峟 y©üfÿ§Íf‹ŒŒŒŒŒd?òb†úôé{î¹Çn·³ÅáæûÝD iñœð— ³Òé¹Çãa§GGG5OZ÷gddäèè¨påâ[ Z•AóÏ_Æè‡'HgÁê6Ç5H3 —²(d”àšB-B^p qvšC)EÐ÷]–×ëûõ¯œœì³ªýû÷§¤¤|þùçÜÌ””þ+)nµ~_dÂgå·>Ùàÿ™’’råÊvúòåËâÑ`9Ž£Gމd‰H{¡—œœ|éÒ%vúâÅ‹\Äü?ЛX¿Y ŸÜR~\øå7ÛÆ* áÑ;/á’^ŠcÇŽ9.•ÏJüΗJ¸ +--Íår KMM}ë­·¾üòËñññëׯ ×,±­A Ú8zÅœLMM iUâ—~*¿[ Z•ҙ㉬Yݦ¹©Í@"„`¼MyÿrŽ öË4¥¾þzçwjjjî¼óÎôôô÷ߟ›?yòdv"..Nø¡¬¼T~EFFæåå GÛ:pà€Óéœ7o7§««+++‹ÎÎÎææwvvòÿúì³ÏrssããㆱÛí½½½â¥¤««+33“æ&Ä×SUUµjÕªÈÈHñ5óËåv»¹ùÓ¦Mã¦Ýn7WÌéÓ§s£—ù-þµk×rrrØ÷±‡ƒ[ØoVCƒqñg#}?iêa ýÊÏÏ¿páÂÈÈÈøø¸ôa\ä¥ jÓ¦M6l¸råŠÇã9þ|AA;pp0:::66¶µµuãÆJmN/ºÇ¼´´”1¡¤¤dÍš5òVRXXøè£¶··÷õõ•””H܊ɪ@Uôß!ÓÀ¨c*éÖÜtÃî!Nv|h>ô¤d,¤Ìëò.Ëëõz<žwÞy‡{¿Ä%q¹\3fÌØ¿?7355U^¿†@ï¬ü–ÂoXÉÉÉ~û5ˆ¬'99ùÝwßåzíúE¤½ÐKNNöÛýÁoñ½‰Éj ™ÂÜÒyDå“s„æ‘Ýf³eee½üòËÂ5ûìoÖ/Eø;ý1ß·o;lÓé䯣‘¸*îÏ‘‘‘’’’[n¹eÒ¤I/¼ð‚0•ß­­JéLv¨‚8+W·ù.L 2bpŒ—cÐvqáćð(›«0)ÕÖððß?~xxøƒ>ˆåó'7!/U ìÛ0aÚk׮͚5kÏž=ìÌ-[¶°ã5°ãpIžxâ‰%K–¸\®/¿üò±ö–Þí IDATÇntòäÉï¾ûîÐÐPssóC=$½'N¼xñ"÷gYYÙÊ•+{zzº»»W®\)¾nmRÆkX±b…Ûíf˵uëV¿qã±téÒþð‡"Åúé§—.]zùòåÑÑÑsçÎåçç‹dU$ÿ~sKÛ± ?çF)µçŸ0™¯DjÓ ­A_ÚäMƒ­PgP–ū۬W¨p7&Ë.ˈ6(„ZœRwiTY©¶}ße öù³³³ó¶ÛnÛµk—×ët:±±±S§Nõù ‘YÞÀfl–¢ªª*>>ž›Óßß¿víZ6{÷YOHe—òBÿ;ÅÅÅüß¡?ЛX¿YÉ¿ßÜRu „„|“ÞÙ Â(ù”Á¬åRÚŒ²Êã ÊBu{üt­,CÇÂxõ±!Äh_ÃBTø!¢íË+)%2ÐŽ1iÒ¤>úè®»îRêó?v qõ^¼xqùòåÍÍÍðz½uuuË–-ûâ‹/Ù"% ´S ñ÷.Ê‹@Û Gq”ìHÂŽîYR*V4Ç\›Ó Ú[¡$ Ô8c7° º30 Á0Œáj‘k)0ng¦á`4ßåmûöíßûÞ÷‚Ž¡(ìàˆ'|ì±Ç¾øâ‹®®®Í›7çåå‰,ù÷ÿ÷Û·o—— °,þÆLÇ8ü¾ÞUù¹6‘Gý¨çOCGÀëõâ¶ĘïÉSq †ˆ†Ç‰Å¡jÇ0Äûàþïÿý¿»víøû¿ÿûW^y…ýÂB:_è)…ªJÊóOÃéE3”×%”b®ÄÖ‚Pé`FºåàÔ B-…™šŒØÖæ`èJ÷#W„¾ïPŠ¡÷%Í ­Á([ B¥ƒ90 ¡wàÿãO¡oNÀø Ö¹mýŸñ¨p Lñ'Ä\%xæCÃx ÊPê8Òqøà hÀ ê ¢¹·…6¨ªz¨Ä\A&š×ëE¿€p)~ÏoMÓþVò%2Ðù0€a ÑG,õv Ä\Y?„À"ŒØGÀˆ}1B…û6£à_Fu?`­ùÝ„N¡Bj?¾"æJAC˜ÆkP†Jݧqß@3Ÿ“†§<¢ðáʧ;˜‡G1˜Æk ··ñP°J®GønÂ/<ú²´Ü7ópà(Ó0Ìx AŸ²ðæ¦Á­Ž €ˆŒ¯ýÑ„ï&Dè8à. ti„²xÌåAs!˜Í@§3îÆŽÚA¿ÁÊØ=“aõ¾ƒe÷võ6Ap M Kwœê’¿ðo¬ó#‚ü]QûòZ3æòè[S*aƦw$áß½ '¸e´Î€¶øÍ D×}^í†CÐ}ÿÇ#JH„O¿V ïŽa͘˃CÌÇã5ÐLÕJߟÃìÐӬϾ›Ç:ᢧ¤ôä„Nˆ˜’×ë5F¿¬c*ÎÑ@ͺOkó=ÈÆ¯—@Ó`t:V%º3„O›¸éÞ*ÚÇ`ôÆT#R¶wnˆ$Òý`AwÁÀRzñé´‹ƒ@{ Ããw(X®¸~m4ëÝ€ŸÃ¤ÿ¤hLL½'L iP8Ek­ ôÀx JÒk¬o‚{Yõ騩¿‡gP8Ek­ Tñz½Fê×@üÝ`áB Ë½,úƒ‚tÿ0A ÷v|7ah¨2µ¡•€N¯@aº<„ó›ðü ‰WLÏèÎ`hœU Z¨e°ñXøøÀ/Ù?‡)û•2îžAèÔ ²Q44˜ N˜JA+ý0^€©àÛ`õÈx˜‘}$â» “ÁÉY)he0ã×Àb/*¸´µô}á¯å-º6@˜ Ô©!ÔL†S(tg0%Ôf˜ÐÊ`,¯À„´ÿ9L47€ Øm„ðÝ„¹¡}V6´2‹!Çk`á† ï ¥6Ð1ä1Êu8=/B}°ÄwÖ¦t> p84Œã5¨‚’›¡  Šô`Gs„ÊX ÚlÈ(10á„)ZŒË¨ã5€tÚü&îžA:Ã=T«Oj|%‹·¸”éw ´2XPÎøÚ í¹”ÿL…æ~˜§MÈç˜Â!¢œ he°&†aЯ@u†¸µBsƒ_¸E¶e;5ü?öÎ=¾Šâlü³9'‹!$„ÜÔ‰FkKß¾¢VR£UJ@IÞêá¦Ec^à*D T„­P(öƒD„HÅL%M,L ä H9—ýý±?·ëÙsöìÙ³—™ÙçûG>{&;³Ï<Ï3³3ÏÎΠP504“û5ðÿ† [@ò6hEQƒº¦„) jb¾e`¿Ð RÇ …øK«nß›pFÏT¢ŠY=9)ý` ¤w,ex¬pÀÝ>‡‰'ð½ ¢Öü¶ü‡ë‰ë~Áù!°_˜¯ï¥›ö} Ÿ ð˜š2üœ Áã\@]Hé[`-àدt‚¸y©ÙÞ§óÞ@%ªl )ÓyˆëC ¥ï…(à –e­~!¢Á1}Ç`kZõ)_—“ סÖ:ñÕFøØŽýl›Ì÷KÖýô¯å€ÏÀ1}‹äc8¦é˜yàØÌÇþÀ²¬ÿ¥ ñ( ÀÅ!Ø”\ü´ŸÝ×›)ø Ü\E( O0 i;:£VL àÁD¥ Ä r|©J¥0±) a¤@q^ÙÁg™øã¢ªCå]0î0 co³¡¬Õ —TѦÄjˆ?p@SX<¾ QÀWX–…ïP€à¶&V>ü(“Ü*p¨8W¿` b“©å<à3€ŒÛ3 £øE!ÀäÀ~  +47a¸ÄÉ’ËÐÙXaÃñõM"Uœ𠉀¦v0D`Ö5à3Âq'Yá:þlYÎ…KË¿^¡úUॠÀ}2 äBÍ’{â Ú-g Æ¦&A¥TwðÀ'ôéoÅQ4Ê€ýÀt¨»,)áxo#ÓÀyLpq?ù½®œ3!ÊâõÑ/<Å ÷üA¸M:Âr2E@ˆOÃ5p+¸þÖ§oRxux—ÀÕÀ(ÜŽ£ Ä‹ñû5xŠÒ ÓåGò|ùé#„0$àÊ–Oã¼}ƒnsEÊlJ=rüAkçŸ#\$ý_XË8 lzžf@Ð<±bû(²Àä;ðïSÀÒw@1à<VÈÜmAì®r¾‘ N˜À <ýWOa@-ð_2粂èÝwß5jTPPИ1cþøÇ?Š_RøË_þ2a„àààÐÐЇ~øÜ¹s2/ôÅ_<ôÐCaaa?~ü¾}û¸ôqãÆ1 ³ÿ~þÌýû÷3 3nÜ8éŒ !íN‡ïS5W„%ñ˜ãÕÿõß|ðвqšØ©à @OŒß¯ÁW>üðÃgžy&..îÂ… Ÿ}öÙ¶mÛÄç¬[·îí·ßîîî.,,üôÓOŸyæ9%=ztòäÉ6›­¶¶¶££ãî»ïž6mÚÿøG„ÐsÏ=‡ÚµkòÎ;ByyyÒÀ´n€Ož¿CÌÁ ñÉ-Ý”€nxj˜Ð`r1xP.=ø>ðáŽï¿ÿþ¿ÿýïÿøÇ?~ò“Ÿ „Nœ81a—3¿ùæ›ôôt„POOOhh¨Åb±ÛíâkñK•¸¼<ð@EEEuuõwÞ‰ºzõjTTÔí·ß~öìÙîîîaÆÙíö¦¦¦ØØØÖÖÖøøø   –––ððp‰Œƒ•ä~Bºüø£³† ¹œnWÄ!ÊMÄKÊ¥Mc óàà·Y¸;¹Ý[Nâ0Äkë²Àb]+ÂÓ™UUU!.”€;v¬øœ´´4î`РA!‡Ã!G†S§N!„îºë.î¹hTTBè»ï¾CEDDüêW¿²Ûíï¼óBh÷î݇㩧ž —Î&G¸ºA‡o¾¸\Ô`I<7 ¦x:ÙXçA$à+Ò#%è€\ÄMîѰ_ƒéû¨Åbq{šœpFww·ðnAúþu‰?üáü_.ÅkFÀC :lß`ø\ ±{À{¹¸8­8Ä&¾Ã èyû5pÛ1ÖÖÖr?¿ùæµJæ^ʨ¨¨pûßx`Ô¨Q555o¾ùfmmíí·ß>iÒ$9@ýƒûäVõšÂ\@zö…Oˆ –ÃŒï¸dW÷*ÚÔ)„·$ÃoOà'dÝN^|ñEîo{{{KKËÒ¥KÕ*¹¸¸8((hñâŧOŸ¶ÛíÍÍÍï¼óÎĉ¹ÿ2 “››‹Z´hú~·H9àÐâ} |æŠB`Þˆ?°ÀüçöøK` ˲Xì éi]«xoH„лï¾ûꫯ^¼x1%%eÙ²eÏ=÷œËîâ%…Ò›ñÿ=uêÔªU«¾øâ‹k×® :ô¿þ뿞þy~ýÂåË—G```SSSLL _ŽDFið‡tù‰@7%cbMUæxÂ!¯á5ƒ‰ªM‹ÌVŸ1ž\7 EN£€à‹ŠPæTxúeJöˆv»ºººÔÔÔÔÔÔ3gÎ- ÀðWôÑ3>Öô3Ü€ÿi|TmNä 0´¸ÀLèü èû *¨ `@蘥 œš':ë;t@¬d"Œ,ß TÉ~B–tF—°çd3gΜ;wnuuuppð¸qãÞÿýÌÌL£…ÐajŠOK†<Áè©ÆžARù¸D訔[ྣžÞ§ÆvžB¢o§d?!ÑF:£µK¿_€9´ö>¢µª±5¥Ì!8q#uln¼®âÁÖ.à6TB\÷%3T ÑX;‚ÀЊä'P#ÀŠÀ@ä|“Äá,|g`G}@7Hì¾ä£Ý÷ŒEh5* GBààfTúnJö*m¤3j¹Ã0*‰€_˜yj*ñ9La Ü0uÁ¶¹a+à+fè¾hš¢p˜Ájĉ›Ñí˜(ÙO趑Ψâðx¨ÿ…Ùn¨™ ÿކ¡Sa( ó y阢p˜ÇjÄa¸›™Á7 W²Ÿ˜ÁF:ã§KÀ~ €ðŸ£Ò„vÚ&Ȏ⾌±=A汓QŽ!†Ÿ¡³™’‚úÂDŒ²‘©|ƒÐÊ*6ø£[šwü‡‚¡Yh¤p²ìHÓŽ>diÞ(0‰,ÈASÂh‰ÌÙö‰®54=RÐßR&ô âªLœÀÄ¡LÃXì×°oß¾ÄÄÄ€€†›Òoƒ`8âj”$€xêYC:ºY011qÏž=&LÐúBò!Ô{ ÛÌèf23û)u'EN P jã‡òzúø¢¯€ÆôGuaDOS8  Dè_O2Ñ¡ à6D£›ùVëu]BÅ63DdžŒwØIiÊIЉ}Eª<­Õá†ón=ý÷/ùË„ ‚ƒƒCCC~øásçÎñ'×ÔÔdee 6,(((==}ß¾}ò¯õÙgŸMœ8qРAƒ ºÿþû?ýôS<]·±±ñ׿þuLLŒÕj1cÆ_|¡’’€r„—îˆÿIúëND ¯"¶&¡ð`YÀF½6›mñâÅÑÑÑ‘‘‘6l@ßeùWPûúú²³³CBBbccׯ_ïÖ3Å…¨ŽËª4"Àp¢¢dÂ'ôñ4Š}CD4gLl¤®–°Õ¹¯.aü~ ¼g¸Œ;½Öaݺuo¿ývwwwaaá§Ÿ~úÌ3Ïpé•••?ùÉOþñüå/¹qãÆž={Þÿ}ékñ|úé§<òˆÕjýî»ï‚‚‚}ôQa¸AâºÓ¦MûóŸÿüûßÿ¾§§çŸÿüçÔ©S_~ùeŸÕ߃m/£:^W.>¯3üþ‡¬RB´[ÄQTTTSSSUUU__ñâEô½ò=ä+¯¼ÒÕÕÕØØX]]]QQ!³€nèèlÀlPØr¥÷ÇÒ±!‹Åâéîø›o¾á~Þ¸qCxþƒ>ˆúä“Oä_‹OùùÏŽª¬¬ä~VVV"„î¿ÿ~9×µZ­¡#GŽ8NŸU€1†»‡9QWíØÑ×.‡þJ„Š­.äšOíêE¥ºÌ€F†‹?{ö¬øZüñðáÃÏŸ?Ïs‹.e¢:d¹.VÒŽ9’F:Δ””Ó§OÛíö_|1:::888++ëÆÜ ¡7&$$pcÑ?þx̘1IIIÛ¶mãÏáúúúòòòÂÂÂÂÂÂfÏžÝ××ÇŸðæ›o&%%Ž;öôéÓb©úûû † ñÚk¯iª_ÑÔ|ÚÎ{òäÉáÇ¿þúë,ËŠ }õêÕ!C†tttp'÷÷÷GGG···óåèc¬Úˆ ÚÉV__ÿøã‡††0à‘Gikkã¯è"ën@ë©eI´DasË¥xê „èà>©ÝøïP(#--; A9îç‰'B“&MRPfUUBèÎ;ïä~r_ýµœë¦§§#„&Ož:vìØ… ^ºtI `¬¥çO#ô12¡b«e+„î–)´´´¤¤¤HœÐÚÚšœœÌó¾KXXØçŸÎ9r$22ò®»îZ½zõ©S§ªªªÚÚÚ °|ùrþü“'OVUUÙív„ЬY³ŠŠŠ®_¿^QQÁ=-²bÅŠË—/Ÿ;w®®®®±±Q¸ö¶¼¼üøñãÝÝÝ™™™yyyb©`9ŒF8pà±Ç+++[°`BHlèÈÈȬ¬¬²²2îü#GŽÜwß}ÑÑÑ| `íÈÈÈÈÏÏoooooo¿ãŽ; $Nf¸ÊŒÃmË’h‰ÂæÌËñÖ[oåää wN";¯P/Æ¡±è‡ëx¥KœÏ§ 4!ÔÛÛ+ÿZ|Jpp0BèæÍ›ÜϾ¾>„Ppp°œ¼çÏŸŸ>}úСCyÅŽ?^® 0'1!jiO úÓÿ`Õ}ɇ8U„D{ùŠu¤^i´¢‘á¼®kˆ‹‹ƒu ÀJÚÍ›7geeqÇÓ§Oß²e ˲III555\bkkkLL wŒº|ù2Ÿ711±´´ôÂ… ÂùªÅÅÅÕÕÕqÇgΜ‰‹‹ãOèììäŽ{zz¬V«X*}ÜFššO»ÂBëÖ­>|ø×_Í'º5t}}}BBB?˲Ï?ÿüÞ½{…å@‹ÖG¶žžžèèhþŠ.xJwÛ²$Z¢°9 KûòË/'NœÈÍO=õBtð ùjÇÂuÄâZ,„¿ªä›o¾ž#=çŸí 犽téRjjêêÕ«¹DO†fYö˜0aÂÑ£GY#Lƒ[¢lQQQ¸yóf}}ý¯ýkþ*÷ÜsÏÿþïÿöôô477?õÔS|zDDÄ™3g„‚¹ÈÉøÔsrrÊÊÊ„érz¼Â'µcê:&àÜ¿P5±­#¤ÌLjR] Êhбöš?þ•+WZZZ¦NºhÑ"£Ä Èi1Õáp$$$$''ó¤p8«W¯æ6´¿ûî»÷íÛÇ¥»HþÞ{復¦Z­Ö´´4þQŽp÷û¼¼<áî÷ÂBÜÆúûûóóóo»í¶ÈÈÈ7ª\aÿÐzh¡Eɬ@½---£G^¹r%ëÙÐ,Ë~ðÁIIIœKèo › ‡¦‚î×ÛÛ›œœÌ-m`æÜ¹s£FBÕÕÕMž<¹¹¹Ùåü„„„òòòÛo¿];‘à5 3ÆBD) Q·˜ä cÁVØ F=¾½C¡½<˜çÓ8¿OwDUøê«¯&MšÊ0LHHHgg'ÿ/þ3~)))mmmâ¼---))): ªð…Pf_µ¼bÏž=111àc€ºÀ~ @'ú‡{õoÂ8‡ÿñôÕk„ð³Õ±±±â¼X}w¼¢O bÙ²eï¿ÿ¾Ì‡T äLì׸CÊ#Ma”‡§÷ÿùÖ–áT E"ˆ¾¾¾   àààÆÆÆ9sæÿµpáBn‡üüü™3gr‰BmgggÏŸ?¿¹¹¹»»;??_W¹Àw”u§¾æjnnþÙÏ~&}NNNNSSB „vR IDAT¨©©)''GT4aì:UÊÛFèæ`AÅÛ~q¾¢`21€\0YΠø©H#4]V³sçÎ¥K—†††>øàƒ<ð€ð_“&MºóÎ;GŒT$ÎûꫯŽ=:===%%…áH‰9r8tèPZZZPPPrròöíÛùô²²²äää   qãÆUWWs‰¼Ñ•å#þ Ã0,Ëp¹úúú²³³CBBbccׯ_ÏURR²xñb„ТE‹JJJTTM2‡1 óÔT ž¾af‹ˆ1ÜFêšÃðê Ø¯?Áç½ O`nü$##ãüùó6›­¾¾~Þ¼yBÇ[¶lY[[[OOÏÎ;È% O ,--½råÊÕ«W.\¨·è€Ð¬Y³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\bÄŸbáÿäé•W^éêêjll¬®®®¨¨æåzQèK%Ðg ¹˜§¦bpó X©$7ù‰¯‚ië,¸ÜBÛÔàÖÝá#‰FRALTªQݱr`Àrl”˜˜XZZzá—ŒÜqOOÕjåÓýÉ%&>>þìÙ³b±ùãáÇŸ?ž;>wîÿ¯ììl.6qáÂ…ììl‰ ä¨rDýøãÇŒ˜””´mÛ6>ã›o¾™””8vìØÓ§OóéþäÓßß_PP0dȈˆˆ×^{Mº»Ýþâ‹/FGGgeeݸqCºîàäɓÇýõ×].ýÍ7ߌ9Òétr?NgJJÊéÓ§=]!´qãÆ„„‹Å"¡î ¯¯////,,,,,löìÙ}}}ÒUó„vΆ¿o¸µ Ø:W¯^2dHGGwrttt{{{SSÓÓO?úÕ¯~ÕÔÔä§* Õ××?þøã¡¡¡ xä‘GÚÚÚÜfA¢¸€ô%š° Š‹åR<5a\Ö5…è°1$æË\vŽðP "ÀÊxÛeÿþýååå÷ÜsObbâ_ÿúW>=**Š;4hÝnW%—¯ŸbimmMNNæŽù„Ю]»B‰‰‰»víòz!jÀmŠD9«W¯>uêTUUU[[Û€–/_.]BèÀ=öXYYÙ‚ \.žžöùçŸs?9y×]wyº BèäÉ“UUUœzÒÇŠ+._¾|îܹºººÆÆÆ—_~Y±Š ÄXßàp± Ø:‘‘‘YYYeeeÜùG޹ï¾û¢££‘9V*k£ŒŒŒüü|n©;  @âda BúŠÍGØùb9Þzë-nµ‚DÖÄ%dÆ$sN‚ ¾6XM Gt‚‰ä8È )ÔWPíênf­„|3}üñDZ±±|.—Bܦ+ÎÅãu]C\\œÛu ò!ÈQ刊ç:·å$%%ÕÔÔpÇ­­­111Ò…¬[·nøðá_ýµ§«oÞ¼9++‹;ž>}ú–-[$®‚º|ù2Ÿ×“¸ƒ¸¸¸ºº:îøÌ™3qqqÒUó„±ý­±¾áÖ‚n­S__ŸÐßßϲìóÏ?¿wï^–Š•JøÛHHOOOtt´Û,žºnOW”h>Â6(,íË/¿œ8qâÍ›7YÏMX —ÀÔu|À¶1!˜Ä0™«û&UÀAí »vÒhZw3+–¼Úhúôéµµµ·nÝúðÃå=•å³bÅŠ)S¦455uuu-X°@|~AAAFFFGGG{{{FFݱV†´'OžÌÈÈ2dHBB÷ePV†æ•åc±Xl6›Xf·?­V«Åb±X,èû]?% IIIY±b…§K³,{õêÕððð+W®tvvFDDtuuI\ÅE*i X,»ÝÎÛl6OÓ6¯Ždlk¬o¸µ 'ëL›6m÷î݇#55•_r/]¾ðl[4æ6:qâÄĉCBB89=5‰XƒÛŸ¾6ŸK—.;¶¹¹™ûéÉI¼VGxޱœ0p|ðÉަÃðºP£I·Ð];iŒû†ãÕFï½÷^jjªÕjMKK;|ø0ŸË¥—e¹Äô÷÷çççßvÛm‘‘‘7nŸßÓÓóÌ3Ï:tÍš5Þjì Y^*_Z<ס&$$¸}ËÚS!MMM£FZ·n§«³,;mÚ´ÒÒÒ7Θ1Cú*žjáVqqqçÎãŽÏž=;|øpéªy“þÖßpkAOÖ©¬¬?~ü_|ñÜsÏÉ©‘Ë…°mјÛ(>>~Ïž=]]]N§óÚµkü™V«µ··—;îììô5ÖàSó¹yóæÄ‰?Χ{rùøä°_×¶z­ÿïMø _ ºßT$>Ñš2}úô3gÎØl¶ýë_S¦Lá]úUá`Ο\bÜ~ŠExþ AƒvïÞÝÛÛÛÖÖ–™™¯¸¦t••õí·ßö÷÷;N‡Ã¡i.1ÙÙÙóçÏonnîîîÎÏÏ—>yîܹ³gÏ>þ¼Ýn¯­­1c†t!ñññÇŽÛ±cÇš5k<•™››ûÖ[oíØ±#77Wú*.Hk ++«  €[>“ŸŸŸ••åUb¬o wôdñãLJ„„,_¾üÙgŸõçŠÄa¬úúú‚‚‚‚ƒƒç̙ç§§§¯_¿¾··÷Ò¥KsçÎåÓ#""Ξ=+G<ùÍgîܹ3gÎüùÏ.L‘Ó„Uߨ@=à$X!Óª[âîÂØªÑªUÖªyÊ%]š²\ 0¤ê\>à'hþüùW®\iii™:uê¢E‹|ÍN–¼J‹ù:áO‡Ã±zõjn×ú»ï¾{ß¾}r iii=zôÊ•+Ý àp8’““ùRxºŠ‹TÒn¤Ÿ——'ÜHßmÕ<¡©³aîn-èÉ:,Ë~ðÁIII¼åƒs‹ÆÜF9r¤Õj1bÄÖ­[ù3«ªªÆŽkµZÞxã >½¤¤$44ÔSÉÊšxâ/á$2‘ï!F,ðèð9@>2Í¡®Õ([Î FøH\ç:RܾW{oPŸ\>‘““S\\œ˜˜xñâÅW^yEb~­ÍJ±ÛP&6¯÷‘)Ò–-[V®\ÙÛÛûË_þrÛ¶mܨק‹^wù'0 DSóQæ[·n½téÒªU«|͈³p–bä«a˜áÒhp†Õ÷5 úÞ›p‹0F ¡ž:t(---(((99yûöí|zYYYrrrPPиq㪫«¹DÞ4Êr‰ihhÈÌÌËÚµkcbbBBBrssoݺť—””,^¼!´hÑ¢’’Õ´šáéa”W^xá…¶¶¶ëׯ¿ûî»>À“k×®mÞ¼ù…^0ZÀ\°°_‰0:¢ÿåc¬¨‡D(4ðnÐ9x„Ø~õº¢¢¢ººº¡¡¡¥¥¥°°Ogðø¹É݆Lk#†ÀgŒøËðqŽáøŠÖþFo0 µ`Á‚¸¸8—F7jjlD¾º‘ïP`î÷êB±³ªŽ\‚‘±ÐÀÿ"ç*T¢ÅiíÍäÔ+))©  à‰'žHLLfìì쌊ŠBõöö†‡‡Ûl6$xKBY.iz{{“““¹¥ Ü;wnÔ¨Q¡ºººÉ“'777#Á;.\(,,4ð }.ø‰9mDh­ €ÎVð×þR†O gdŽÃpÃ$^å)Ê@}ÅebZýHû¿Ÿ­C¨Uê5é =#÷f^«VYYY\\|âĉàààM›6eff"Qt€ÿÉ(Ë%櫯¾Z¶lYUUUOOw¦Óéäìv»ÅbAÙíöàà`.láR²?÷ÓFÉ‚âÖí¢ëK´ðæD7“™Ù7H©;)rR€Ï‹`¼‚'0ßS†Iô¦]¬:7øüz:t(77·¥¥ù5P–‹'!!áw¿ûÝÃ?~ýúõððp>‹p]Ã>ØÔÔ¤QÅýV·¡ Sõ¨¤Wq@¬AH©;)rR€UÃ~ x!|ÃÇ$ïÉ«ˆË&t¿~¢zíH)ª ì©x~õ!´páBn‡üüü™3g*¾`rÌÓPpûÀç­o@zÎ-MëMàMk#Qæ$NhiFB”A\"Æ £Ò+àáR(u˜'ne?þø“O>òâ‹/¾óÎ;šæ³sçÎ¥K—†††>øàƒ<ð€ð_“&MºóÎ;GŒT¤ø:ž‰9tߌ8(»}Pl)j0ÊF¦ò B+K¨ØD L·°_FPv·ÆŠUê¶ ({…„b-©…*¢¸O#®Rþßae/àÅÝ,eU£¬:Tb”Lå„V–P±‰@±n† ñ‘}ý¡yhÅ”øÕb|û…@ƒvPìHè­}}wZ-E ºœy|ƒÜvméŒ?.Á²,©þDä¶j" U½=©°·•óÂešÑM‰ÖÔ˜ÔKÜX$Dòs]ƒÎUÆDÀhêuiª‹Z‡ ¤ƒƒ]pAS(¨ UÀ ÿõ ïP 4  RÉ|+ÖÎ¥ixª8• ÑM‡×4ukK']~™À]7ð±>’¨5U£¦"†£B ök0šê‚3¤ëÙmk—¹H  ꢑIwQOÐZ/·è_YS©—&H_âk—3IT04†"ù ÔpA-ÂæóÃD=!]ۊǦn_`#W8 EÏIºz‚Öz¹ÅÊšJÔAbÄÁlž÷MÁ\ù˜‹':já ºk§ª+ b FBÊ‘Ðõ/.¢m ” Lù$…??ÑâF‹º…Öz¹`T5M¢^@pM!1*D ˜{5¾¹’ý„錊.@â7Hüv†ÒGÄ™ÀeÊM"þ¼.åg € ž“h§Ò ºµDwíÌ!}8?$•)€µ!¤¤Ë/3ÔQEÔUÃ0VµÊÌ´[Cn)4ho:ÖþhõZ2¶‰qê¥U·€W Î¥ÐÄOxò -š'ø¡2@oF@â Tx>…`fíÚµ111!!!¹¹¹·nÝr9¡²²2>>~Ó¦MÈCj³Ù/^¹aÃ=„ö –6 ¥Ÿ·ÅÍÙ¨AÅÕ tø§[(^±<À@ÀýÀXIÈ ðzEÿdÍaY6Àh¼¨¨¨¨®®nhhhii),,þëÀ=öXYYÙ‚ ÆâÏ›ìq[²×\â[›KFé]¼"}ßô$?¼d ì׸²páÂööööööüüü™3gòéñññÇŽÛ±cÇš5k\²û¯ìììùóç777wwwçççë$4ùHß#ý¹ƒús--jj\Æ ƒ-ž†e˜#ô‡e,€ùÓ9{Âm\€ïÉåå)¬àVB·•ÖÛµ(þZÒ§AÜÀ„ÇL¤·œG “&MºóÎ;GŒT$üW\\ÜÑ£GwïÞ]\\ì)û«¯¾:zôèôôô”””#Fh..™øz4 RäÄÅáÖL¨‰»'0@&é¢Q4AØiË,VNdA\¦Ûd×^.>.¼ÆT„0 ì×`ØÊO¨?ø„±Ê—¸«é,‰È’OÁ“p_sž%!™Vuà9f¬ ‹?“[_}^æµ”5%·…ëÙ*•.\òº½  :Œ?ž (ÛÄ´¾.¹J¦£:£@iØvÁ9€çP˜À=£ ®ëgÛ1<Äà‚ÿó8ˆ;Z±Àv¬±í®ÈA‡zé«‘ø: À¶—Ð .(܆nàù€FE|@Åf‚[ˆAˆŠÝÄ- rnIúpŠtù‰FgåS<4¤¸já“ÆLØK@pALè9&º\@7 &Ñ?² qi<[Ÿêµ`Æj´ @-t Y–å*h†å0ª Ô’qïçD¶!¸¾íP¬¢ <†¤eÀ¼Ý)]x-?*–µ  y.„-ðÜÉ@tS>Ý“TS]d*M쫤w\Ðh’TBzÛôÏh‚" <$†ÄhÝÿÃz@0(1Ńe4izê?úŒØL5Ü7UeÕ«ÒÄ'¨g.ÌK)ƒÄ¶èþѬ Bè1Ñ­» Ou€Fˆ¿¹Š?ðIX”iC±™§³,»lÙ²ÈÈÈÛn»í¥—^âýª««kÚ´i!!!ÑÑÑEEEÊ.*–Af¢þ˜m\(ž ^‘¯4áÂH„½Syê8Øbˆ„@(ÐdL#‰t^VÅ–)¡¦R¹Ï­0úˆ¡º ÉܪK¾&a˜£eT@YÏèOê¶SÞ¾}ûñãÇ¿ýöÛššš£GîØ±ƒKŸ7o^HHHssó™3gêëëwîÜ©øºžÈÉÉijjB555åää¨^¾H¿]ù„©*«ÂPp{“Æùž ÁlÁÙmù0°J…j&Á<² –Ó­T: £)âÑ…Ö—ƒ¸ A‰N@_¿ æÐ¡CiiiAAAÉÉÉÛ·oçÓËÊÊ’““ƒ‚‚ÆW]]Í%òT–K‚)S¦=z”;þÛßþ6uêT‰“ÿð‡?””” 6,..nÕªU»víâÒ?úè£ 6DFFFEE•––¾ýöÛ\ºÍf[¼xqtttddä† ¸D‡ÃñÒK/ :tРA3fÌèééá¥---MLL´Z­Â‰÷ß’’’Å‹#„-ZTRRâµ^ÚaÚq!Weâ:cve !ï:Ap@óÔ=*PMà‘YL¤å0OˆAˆËèBçëBÜàaYÖ5`ʬY³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\¬]»6??ßn·Ûl¶%K–lܸ‘KŠŠ JMM]³fÃáàkkkÇÏßsÏ=µµµÜ±KSSSÃÕÔÔTUUÕ××_¼x‘K\½zõ©S§ªªªÚÚÚ °|ùr>ãÉ“'«ªªìv;W K_Æ ä×p@ÅpƒþÁ0¾¹AËš¢ BdÖ7±9Ä2ã&¡n^]:î ¿H€!ñ$͆ðGÇräOJJ*((xâ‰'…;;;£¢¢B½½½ááá6› ¦(ÊrIóÌ3ÏŒ?Þét¶¶¶®[·ŽOw8µµµ .LOOçb‹Åf³ „œNgPPÝnG=õÔSáá᯽öšÓé\²dÉîÝ»9ÊËËo¿ýváå’““?úè£1cÆ „ÚÚÚÒÓÓ[[[9i/_¾ùä“°°°ùóç¿ñÆ---!«ÕzóæM«Õ*,000_¶àt:†q:µpQ¬×A¬AS@~"ç!˜tFʇà•@c$¬¦f€úh‚:" <bðŠËú%q3À0 ì×€)÷Þ{ïÁƒ;::¶mÛ6oÞ€3fÌ©S§¸ã¯¿þš[›€2dÈz{{[[[ããã'OžÌ¥6¬¾¾Þ¥ÀaÆ566Úív‡ÃÁ…ä‹j¬Wè0²ohhÈÌÌŒ¥Ý%1¾NK¤—Åb¸LTGê%Ã`Oï8àßIʬ,qõBf݈ABà3Bóälò&€?,ì×€-YYYß~ûm¿Óéä7DÐ(—åååW®\ÉÉÉ™7oÞ?ÿùÏýë_ÜUjjjìvûwß}—››ûôÓOs'Ïš5ëå—_nii¹|ùòŠ+øïAäåå577÷õõ—8wîÜÙ³gŸ?Þn·×ÖÖΘ1í`gÏžõ¿‚d‘‘‘‘ŸŸßÞÞÞÞÞ~Çwpéžöéàq»5€þÜVåä‚à‚ Àé@cô B ˆäh‚™§£‚|"‰1 à <^ãF ¨€t÷Š'äJÎ!Gþ÷Þ{/55Õjµ¦¥¥>|˜ÏèRŽË²\Lš4iÿþýÜñçŸþðó,»wïÞ´´4«Õ:|øð‚‚‚ÞÞ^în;†ˆˆˆˆˆˆåË—;N.}Û¶m±±±ƒ z衇ªªªøÂûûûóóóo»í¶ÈÈÈ7r‰‡cõêÕIIIwß}÷¾}ûÜJ[RRªÀ ´sݲ§§'::š;NLL,--½pá‚§“ãããÏž=«`¤7Oñ³Çöô_úº}@`n«yÂ×Þ’ú~Ï<§µ^†@)vió€`oHC ]~¢ÑNù:˜õ«¯¾Z¶lYUU÷)PæûXÜîÓ!ÄíÖî­ù1{VÑs 0‡9a`)>i˜Üd~>½¤Xi25C™<½î¡¿$”á²*Ä@Iä#±HGgIŸ`L~W3 ˜Œѱ†„„„ßýîw?üpxxøõë×ÃÃÃ].wèСÜÜ\nëM—ŒâO~h¸·ŸH)YÙ ãÁ‚öHÔÛËŸhÅjqÁœ‘·/ú" Ý;„¸YÀ~ fGÁk€Qôõõ766Ι3‡Ow»O‡Ð”n·ÆtCúEbŸ üFêÓE¡á€áÐhð§Ÿñº—>dj‰z…¸­>•5ÅeË$qÀS+€ñ žØŒÁ“T„î»—nè3FܹsçÒ¥KCCC|ðÁx€OüñÇŸ|òÉ_|ñwÞg|õÕWGžžž’’2bÄM…Æ*6 °&þd#ˆ&(F¦ºÌ£·z ¾Öø@n¸G:è@n½¨aدÁH—Ÿh4R>Ø”Ç̪8êp?/§ð€þ˜¹I’ßú01“?tLª`82uhNu¹UŽ9U.kI ”D-`<ƒ n·7“#?XƒÖ˜SÞªµ´Ñ7þ0'æl’d¡¿ š .Yð Ä0‡Ö)!Ä G}é-P¶&«•,X Ê0|B.^:¨nÉ\0_%–e¹¥¤`><Ñ4® pi ² 1w§@Ô Î…uz#­± ýhC™f|ÊåémC–e—-[yÛm·½ôÒK¼_uuuM›6-$$$::º¨¨HxjIê"¼WaÒ‘ª.‰°@hn .þ´)·Û%È|KÙäû&ÈG¦nA.¸Õhs¨¿×ÃæúÃ0 |‡‚6”uâ¾ær{7ݾ}ûñãÇ¿ýöÛššš£GîØ±ƒKŸ7o^HHHssó™3gêëëwîÜ©@B1999MMM¡¦¦¦œœUÊù˜*(NýÄœ€51ÁSÑ‘©dЧ'Ü>…-o)ºçÞžÜâZ@¢BÍÖg:t(---(((99yûöí|zYYYrrrPPиq㪫«¹DÞšÊr¹0eÊ”£GrÇûÛߦN*!çþð‡’’’aÆÅÅÅ­Zµj×®]\úG}´aÆÈÈȨ¨¨ÒÒÒ·ß~Û%ceee||ü¦M›B‡ã¥—^:tè Aƒf̘ÑÓÓÓÕÕÝÙÙÉl³Ù†ÚÑÑQRR²xñb„ТE‹JJJ¼(TÅT7 ?v&‚ ‡7DôG¦ÂA·^q«@ÐјêvqMaYÖ5À¬Y³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\.¬]»6??ßn·Ûl¶%K–lܸ‘KŠŠ JMM]³fÃáàkkkÇÏßsÏ=µµµÜ±Kë­©©þxð`¬¬««+..îŽ;î9rä!CøBÊÊÊrrrø@BèÒ¥KéééV«Õb±ÄÆÆ¶··#„FŒñ³ŸýlïÞ½N§óèÑ£¿üå/B»víJHH@%&&Ê 4„².L»ŽvÇpÁÌ÷3×Ü.iæÓ“‹T$Ö&xÕ§Ä’hJþ tÀ­zA™f@h_—ÆÅ¿²X&ž\]þ]ÀäÀ~ pï½÷>~òäÉ|öcÇŽíÝ»wýúõ|ʰaÃív»Ãá`Y–/|éÒ¥¯¿þú—_~yÿý÷8?Ÿ O0pß „PCCCffæàÁƒøè£rA‰ò]€Ý18¨_µ!_¦€ÎG‡0’ƒêщiØB2M#Ó ¦B™Ë¹U2¨Ô„x 7˜¯qµ.DªYد²²²¾ýöÛþþ~§ÓÉoŽ Q.ÊË˯\¹’““3oÞ¼þóŸÿú׿¸’kjjìvûwß}—››ûôÓOs'Ïš5ëå—_nii¹|ùòŠ+ø§ßyyyÍÍÍ}}},***,,äË?vìØŽ;Ö¬YÃ¥Ì;wöìÙçÏŸ·Ûíµµµ3fÌàÒDz|ùògŸ}VY] ÇÀ}7BùùùííííííwÜqGAAtùbÌà €É€ zF¤ÅàËTXƒÐ¹ó—i#+xÅWÃAˆ#n0í°P:èà¿ZèQ¬ôOÈ•œÇ§*¼÷Þ{©©©V«5--íðáÃ| .º(Ëå¤I“öïßÏþùç?ü0˲{÷îMKK³Z­Ã‡/((èííåNà¶cˆˆˆˆˆˆX¾|¹ÓéäÒ·mÛ;hР‡z¨ªªJ|õ–––Ñ£G¯\¹’eY‡Ã±zõꤤ¤ÀÀÀ»ï¾{ß¾}üù|ðARR_¬24r9Å&&&–––^¸pÁ%cgg'wÜÓÓcµZùtrIÓÓÓ-Q¾˜ììì‹/"„.\¸-q&ÍÓZW8½Qlkj o c!B5¯C™¨A¾ê@Û€W azE-Q£[{CUП­[·^ºtiÕªUþ¢æ½–\YYY\\|âĉàààM›6eff"ÑÎ:üOþ@Y.1_}õÕ²e˪ªªzzzàå·åKÔÑ«ê(öm­«&G½XA±­iBâ°œŒXÙןç<8TC•ÊAݵ2Hœ–0Ä«á<½„¢¡Lù€ÛÈDñÍ×%;ѺeökÈàÚµk›7o~á…ŒD9Æî»ñôÓO¿ð ÍÍÍN§óÚµk| ò©|3·; è‡[÷õõõegg‡„„ÄÆÆ®_¿žO÷ºÅ†Íf[¼xqtttddä† 4Á® „ Ìi2+&o:h¡-ÅÏñ.¼ aþoI€xêÐ|}É‚Ð{ û5žct_vºÁ0LTTÔ‚ âââü,7a6pß „P___PPPpppccãœ9sT/ðö‡ï4!„^yå•®®®ÆÆÆêêꊊ þL¯[lÕÔÔTUUÕ××so¾&ǧNOØùk´ŒÖh‚H‘ùþÕ™%×váVóbüAº—ÆgÊ€'ÒA¯Ú#Z½VûcgŒƒ­J±Ì'üñ'Ÿ|ò»ï¾ûñüÎ;ïhšKÌÎ;-Z4mÚ´„„„¥K—îÝ»WÝòÕÙ³gϱcÇ¢££B7nüðùôAƒ]ºt©­­-11ñ÷¿ÿ½8ãÿøÇòòrî‹°¥¥¥zÊ ` ˲ºfü)‡ŽÞ^ qãµ¼… *Ó§(ƒð'ð ¢'º¸!l}BŠݶPân" CÚëÁ„ª[ 5!­µ Öä U:ÔË¥C¶Z­·nݲX,!»ÝÈzÞÂCˆÕj½yó¦ÕjÕNT¡ÌˆFsÓŠÄhF<šôdV?Ç&ôM׉h2“R;Š‘6ð9Ýø˜bä÷ºd)™ýð$&&¦±±‘;æŒ-6† V__¯‹ŒaxzZ"½âÚ§×o:¨YùcB°,n@ Ðhìš"_½dMÛYدÁXX,wm ž¾âcMsµ²ÃSnˆˆˆ8{ö,ÿsúôé‹-êìììèè(((àÓÝn±!4Svvöüùó›››»»»óóóu“ÐO±iÄÙý—æœ^Q eöõ|ÄóU]Ä¡³Æ´+À µÜI™KèsuµÐÓ.>iÉÿTA­ú82PW8@YupÃlêõóq<­ÃèCY²dÉøñãyw-..OLLLKK›0aB`` —Îm±òâ‹/ºÝbãÕW_=ztzzzJJʈ#4•Ð íÆþƒ³lÆ"¿ëº@™Bˆ®ÑÂÓ ˜Æôѹ6REr†ý0€755 ÕK™súÅu7¼jgΜùÅ/~ᛆkÆ xºÁû¯v¯C™—ÐNB¢‘y÷ÁG{jùƒ*à£?1°"n/­l‰ÛtâlA`ÿÑZ‡ÊÊÇDzªHÂÀ~ 8À×…8CàÄq¢Y°`ÁÕ«W[[[—.]*Þ á Z‹GjåI6ª#¡^­íë+^¯®§5)p*ÃíëI~–C¢-hÂp¿¢í[±\®k¬eUÑ û5`‚?÷À†XlvmÐx¾­©©©£GþÑ~¶råJ£ÅôCÇ@3Z€CƒŽ!ü‡êèŒt•ÉU>ígâ,›˜­¾FzÖ 7•dV–aX×€$V—˜¢þ˜m•Š©úVÐL”ŠU K”ÿ_ÌÁçQ¶NE´}•­-h„~e8¾:¶Ùl$_?æÒ )¨ø@ÉT`¥7“t:¦ª&ÝuThF](nPW͉Fa%ènúÄM=1sݵtk òŸÞË9>äTܤª!ˆ+g¦¾ë¡¾‚<ŠgÔŒ¢oý(ËekPêõD’u4Cõõ­â#‰Q€´´j8^M`ry­~>+âäc’W H4±à¦1ºš¼oõe.!‘K £Òo±Å Šî.A Á0q*°/ÂÆ4~…ÒŽ 6òªدwX@6FÛÊ ¬ Rs÷5|G P¦7Ý´““ÓÔÔ„jjjÊÉÉÑç¢2Aƒ¢¾‚H²Žf¨¾þà£U|$1 Ѐ€V Ç« Ln#éê8Âvb b„îJbsâÏ·|¨çСCiiiAAAÉÉÉÛ·oçÓËÊÊ’““ƒ‚‚ÆW]]Í%òjT–Ë.]h¾¾¾ìììØØØõë×{½œ %%%‹/F-Z´¨¤¤D‘>0Õ«(,¥öºMƒIìkÆ:ØW­ \À¯°Â­cƒx<5|–ea]è8â@"âº<³fÍ***º~ýzEEEee%Ÿ^^^~üøñîîîÌÌ̼¼>~Ó¦Mç „l6ÛâÅ‹£££###7lØ ¢l<Ô¼Ô-]M£nwu¹yóæìÙ³ÃÃÃÃÃÃçÌ™sóæM.]¼W‹?A9Ž—^zièСƒ š1cFOOOWWWtttgg'w²Íf:thGG‡×í`´ö+ýJëÉ¡†@5pC0|ë†aÖ®]’››{ëÖ->½´´411Ñjµr?OŸ>=jÔ(¾.,ËŽ9’ï¯8tpHµà[#¹m¼ ™™™ƒ8pà£>ÚÞÞŽ¾Hp’ˆûqá†4|دè ƒ••õí·ßö÷÷;N‡Ã¡i.1gÏžåNŸ>}Ñ¢Eª_Àñþxì±ÇÊÊÊ,Xà鎢¢¢šššªªªúúú‹/ê#6‰» Ìí®.+V¬¸|ùò¹sçêêê_~ùe.]¼W‹?A­^½úÔ©SUUUmmm X¾|ydddVVVYYwþ‘#Gî»ï¾èèh¯ÛÁ€_ùÀ™ŠŠŠêêꆆ†–––ÂÂB>ýäÉ“UUUv»û™žžöùçŸs?9y×]w ‹‡äqÛx322òóóÛÛÛÛÛÛï¸ãnPçÒ‹ûqá†é™%r%­!ºiãŒW­¾÷Þ{©©©V«5--íðáÃ|.—B\”åSRRÊŸÐÓÓóÌ3Ï:tÍš5Ü;ž.çàl~¢‘Å.´nݺáÇýõמÎöìYÕ¥rçñZíêˆêììäŽ{zz¬V+wWWWÇŸ9s&..Ž;NLL,--½pá‚K!.?Å~’””TSS÷¶¶ÆÄİ,[__ŸÐßßϲìóÏ?¿wï^O—¢ƒ_éìTÚµ_Ò ÁRÑÀÕ!„Î;ÇŸ={vøðá|úåË—…§±,»y󿬬,.eúôé[¶lq)M‡T M'Ñ^oOOOtt4/ Ÿî¶pÁ†»+{ÿFÆÕ!WŸÿþ÷¿GŒ¡Qáäªt‹5¤¤¤¬X±Bâ!‹Åf³©.• ¤;ù55¸ýi±Xìv;wl³ÙøÄÉ“'322† ’ðþûï{*Dì'V«Õb±X,–€€ôýÂ]–e§M›¶{÷n‡Ã‘ššÚ××çéBtð+jb ¤‚%¿þªC¹ígÜöKW¯^ ¿råJgggDDDWW—Kiú8¤ZhkpÛxOœ81qâÄî¢|Û à©bHÃ×PY ´nu!N™óçÏ¿råJKKËÔ©S-Z¤ÑUˆS nèkhjj5jÔºuë<#{zEf«¬!..ÎíóFž?þ866ÖS!b?IHHhjj PYY9~üø/¾øâ¹çž“¸„X× ¿XÒ ÁÞÀÕ¡®kˆçÓ]Nã¦M›VZZºqãÆ3fˆKƒu b„7>>~Ïž=]]]N§óÚµküu…xê„Õða¿ ¾ÁÃö ªÀb³Ó#Âíi©©©£GþÑ~¶råJ?Kó”ὕiqÙ¿}ÿÔ;v¬Y³Æí9BÓgggÏŸ?¿¹¹¹»»;??_™ICçÏÊÊ*((èèèhooÏÏÏÏÊÊâÓÅ{µÈñ“¹sçΞ=ûüùóv»½¶¶vÆŒ\úøñãCBB–/_þì³ÏJ\üJ`s.\Èí ŸŸ?sæLé“sssßzë­;väæær)ànqÛxûúú‚‚‚‚ƒƒçÌ™ã6£§þ =kÞÐr%!º¥ãhÒPˆŸh§@—ý;øƒ–––Ñ£G¯\¹Râ–eûûûóóóo»í¶ÈÈÈ7j!!K²ÿÈ”\Ó "ÏûúúòòòÂÂÂÂÂÂòòò¸Eõ¬‡½Zäø‰ÃáX½zuRRR``àÝwß½oß>þ¢|ðARR’Ó锸„Î~¥§Siw- Á’ÜÀ…½!„Ö®]Ë}õ ''‡ïg<õK‡#!!!99™÷RýR-4W»m¼9r¤Õj1bÄÖ­[ÝÞµ=õ†7|„‘Ÿð…‡i cwJ§ è|x@þcrZ}ù=*¡”ÏÖ­[/]º´jÕ*£ùzêûbh„“~È‚½qÛ-…1À Zf@_` ¥«ƒ}UøÉuHbõ}êKI¬ |®]»öÓŸþ´¼¼<..ÎhYþƒ c xa£â Bok@ØÛÈ(Äl5Nt‚eY®ñ›ùö  œ&AD †@#Àó†±X,›7oÆm~k6À`Ž•Ä[& sÀW Ü .fV#d€þ€çó˜¶÷à 0`àx€L†ïP€YøÏ6->~n"| ÍXI Væ<|%€ÄY‡p£K|ÂäSeU0­aº˜ð| ˲°®L‡i§Ê*bBB ”yÿ¾jowAç77u³¯5­“ȇhûØbÔ}ž6Ú³gOLLŒvW q‰k1+L8UVSé D ú8FNnÏ¡©QàS<Ç©ºéChžöÅ碀2ò+1Ú‰ÕËX-[¶ìý÷ß—ÿq%Ÿ€ýÀ¼˜jª¬?ø€0¥jV  ˜£Ì@êš5''§©© !ÔÔÔ”““£bÉÆ‚ƒóã`_C Õ©\ ¾&±MáWžÐM cÛX577ÿìg?“>Gý°˜èTÊî”ÊJa…Ý~üñÇcÆŒ LJJÚ¶mŸñÍ7ßLJJ ;vìéÓ§ùtr¹O($pòäÉáÇ¿þúëâsšššž~úi„Я~õ«¦¦&?«o8þ‰¹}%²ôõõååå………………Íž=»¯¯ÏÓuå8 ˲v»ýÅ_ŒŽŽÎÊʺqãÆÕ«W‡ ÒÑÑÁÜßßÝÞÞî¶jx:ö娷MàïWb’.ª¿¿¿  `È!¯½öòÿýßÿ :tРAÿó?ÿsóæM>}ãÆ ‹…ûùÍ7ߌ9Òétr'8Δ””Ó§O{*¡¾¾þñÇ 0`À#<ÒÖÖ&.Ùÿ;æ6r[Ž[͸¨Â“qýiø°®L ß/ÐúX^„=,C âªú3kÖ¬¢¢¢ëׯWTTTVVòéåååÇïîîÎÌÌÌËËS%— ¡Œ0ýÀ=öXYYÙ‚ ÜžÃ|ÿy]…uƪ` }%²¬X±âòåËçΫ««kll|ùå—=]WŽ“ „V¯^}êÔ©ªªª¶¶¶,_¾<222++«¬¬Œ;ÿÈ‘#÷Ýw_tt´§ªêT†Û-hÄX¿»tQEEE555UUUõõõ/^äO®¨¨¨®®nhhhii),,äÓOžü믿ötNvv67š¼páBvv¶DÕ0w3ÿöu›%..®®®Ž;>sæL\\œôu]~Š$))©¦¦†;nmm‰‰aY¶¾¾>!!¡¿¿ŸeÙçŸ~ïÞ½ž.§Sa_“Ø‚&ð÷+·.$QT||üÙ³gÅÕ‡ÿÙÔÔ4jÔ¨uëÖy:G>8{µZ²g_î ..Nú¡ôuÅN’àößÊÊÊñãÇñÅÏ=÷œÄ%䣳Sáo_óØ‚|Ò›!~åÉ…<%g]C||¼t!Ó¦M+--ݸqãŒ3¤Kˆß³gOWW—Óé¼víš§ùyç¼í»-GŽf<W>bÍÀ~ ü¾›€W11o@˜›¬¬¬o¿ý¶¿¿ßét:Ms‰‰ˆˆ8{ö¬0%>>þرc;vìX³f§sHGÏÞÏXûJ”_PPÐÑÑÑÞÞžŸŸŸ••%q]9N2wîÜÙ³gŸ?Þn·×ÖÖΘ1ƒK?~|HHÈòåËŸ}öY}ª¦3†ÛlA%Æú•'òDvvöüùó›››»»»óóóùô… r{äççÏœ9SºÜÜÜ·ÞzkÇŽ¹¹¹Ò%ôõõ766Ι3ÇSZß¹Œµ‘ÛrähÆWãÊŸЅQ+9ÑýM€!¨Ç«}ß{ï½ÔÔT«Õš––vøða>—K!.Êr‰))) ŸÙÒÒ2zôè•+WŠÏ‘¶¾­¢`˜Û×Sáw(òòòøïP¸½®'q8«W¯æöQ¿ûî»÷íÛÇ_ôƒ>HJJâ7™w{ ùèìT¤Ø× ¶ 9z3Ö¯<¹§¢úûûóóóo»í¶ÈÈÈ7òÿ]»v-÷‰œœ¾“ñTˆÃáHHHHNNæýÓS 9r¤Õj1bÄÖ­[=ÕÈÏ;æmßm9r4#Ñ?ÈÄE3!†ý¡Öˆ€{æ@¢ä@ ð8 ¯£3›Ϻ«+žuÄŠ­[·^ºtiÕªUª”¦³Â)³/Ѷ “èÛÀØ_—?¦ÞL pq`¦xúc1É€Ãä˜ÙÊÖ]õNÃ:bŵk×~úÓŸ–——ÇÅÅ©R ÄCº-¨Á$zƒX­ˆØjœ0` ˲ü×t¡?Õ“Œ6®•áÐÄÄ›h*†®EtÕ´ö•Ã0‹eóæÍäNn©±/¶´Ã~¨iûêâ¶á[ ב  }€pƒ!ÀÆœ€þ@ç UÖ C‘ÈÅOe‚-·hçþ— N˹†ïP Å6wa˜뼺b6øöe´ úáíôoBû‚QNöƒaÕ¶ï‚§†@âüA¸Ñ%: ÜåÅXIè  ?Ðî@uX–…u È ZÓbªÇ#Ø>óÔzµ°IìkÆ:ØW¶ 2g6a€¶Ï#ÑðH\#@âZ  7hd‚–…aõœaX} ÀG«øHb º1*áµÃÏpŒE¢ú°_¾á-€@`†–…¡Ÿë¦m3Ø×0q*°/ÂÆ€v(³¬¦Û@æää455!„šššrrrü¼ í{mø°_¾«ºÀø à »eáìçúˆD·} +§2¹}±² ŸC‡¥¥¥%''oß¾O/++KNN 7n\uu5—È[YY.1 ì]»6&&&$$$77÷Ö­[|ziiibb¢Õjå~ž>}zÔ¨Q¼w±,;räÈêêê’’’Å‹#„-ZTRR¢–Z|ÂÌmßkÇýP‚™;Vuñ „Ö–…§Ÿëÿb9­ö5 Ê´öÅЀLfÍšUTTtýúõŠŠŠÊÊJ>½¼¼üøñãÝÝÝ™™™yyyªärKEEEuuuCCCKKKaa!Ÿ~òäɪª*»Ýήãß> IDATýLOO ûüóϹŸGމŒŒ¼ë®»Ð÷îgl£3gÛ—ÙðûØxp†~ ÜB™càY¥ÂS!d³q–M ÌV_­ÑyŽ“””TPPðÄO$&& eèì쌊ŠBõöö†‡‡Ûl6.LY.1 Ü;wnÔ¨Q¡ºººÉ“'777sé—/_6l˲o¼ñÆ—_~ù§?ý !”••5qâÄßüæ7999ÅÅʼn‰‰.\(,,ܵk—Zr‘y0©Ú‚Ü@ƒ„ùqb €¦ê[Õº2ÀÂg#äz¶µ0¼×ÂV3øC„êˆÒLRMýÑslPYYY\\|âĉàààM›6eff"Qt€ÿÉ(Ë%†a»Ýn±XBv»=88Ømx‚ûÙÕÕ5bĈúúz–eGÕÐÐár-¶Ž…Oud ¿Ý@Г( €Wȵ`.9&­s-áqê"N`ùP\50¤ƒ:tèPnnnKK ò%j ,—ðẆ|ÛèÑSQ¿þõ¯'L˜À²leeå»ï¾«Zå}AŽuhm ÊêeÕFL˲üûr4õªÚÉTÀá·»I| Oǧõ‘n_CÀÁp2¡Þ¾ÙðDVVÖ+¯¼2jÔ(§Óép84Íå–… ¾ýöÛ¡üüü™3gJŸœ››»dÉ„Pii©?ÕºÛ¾¯ ßJbOÏ@7Èz0À'„£RÀÖ½1T#‰ö5lJ*íK¨-1?þø“O>ùÝwßýøÇ?~çw4Íå–I“&Ýyç7nܘ6mZQQ‘ôÉ=ôеk×,ËäÉ“ý¹¨>Ð×ö4|د5—)¼*ôÁëøÆœã0Ç<݉óPóXG†±’¨2²¤ó«¤@ Y‰ –eaà €ÊÀŒÚ- @E ¸à+Ð ú£â{÷tЬ:Òg€ýPXÝ æ9€?@dÁ'$zP€þ¸í{¡C¦د­€Ù5¨ð.(Æmsƒad½n€Eû5 ü¼$v2*@\К¶R€ýÐ3O¶Í\w@ˆ,h‡P·üû\T i˜üQ V€-û5 -¦Ý¾&9ŒÔ ¡˜mì„!°8N1 ÃX–ú1m¸Á$Ç”@dàÉäbæ±>Às#?õ ¦ê¯a’c* ¸€` hÂTc'Üåûhý0I¯ ºÙ,ÎÈ\ì 6€L2v P»*¹&Æñ@.Ô÷ÝÐAÑŒ}P?v P¸*À~ è ÝïÂBtóU*«@(±‚ÞLK\>fd $t1Œ¾˜1}52 Y  ·Ö @0ÖЭÀÈàirNS]¨‚ ãb\0%ô‹(µîêBäfX>Ô@ÇŽZÐ DÌ<•À<@ÄA]஡: Ã-¦†ïÙɽeB 7˜">ý!úK¸À¨„eº-Ü >|xêÔ©ÑÑѱ±±O>ùägŸ}¦Ãuå¨Úslܸñ±Ç“>ç¿øEii©Ä _|ñÅÌ™3‡:`À€´´´7ÞxÃ¥?©««ËÈÈ}J>–––.\¸½üÂ… KJJÄÌ¥(J£Ñ|üñÇ™™™|k'† Fž˜à"2M=yòdoooŸY³f]¼x±¢¢bÆŒ¾¾¾¾¾¾‰‰‰L32¶²ÑÆÆWÚµk×âããýýý===ÕjuAA™uìØ±èèhOOO…B±oß>v4M»¹¹1Uã+A dëV øH$‡|Ô‡‰ÞÖQ€õ‘Ó­1ÍQât8&¿ºl ˜Çé·óU0 àáÇ|ssssÃÂÂΞ=«ÓéjkkÃÂÂòòò˜YE…‡‡×ÕÕétººº:¥RyäÈš¦KKKãââØ…¤¥¥-_¾œÉ2~üøšš½^O a&¾ùæ•JU__¯ÓéêëëÃÃÃ)ÖS´‘‘‘gΜÑét---K—.MHH0È.`Ò¤Iß}÷ùXTT\QQ¡Õjoܸ±páB2ëܹs111& düéOJNN&ýüü~ùåöOž<4h˜¹4M/Y²äóÏ?S©¢¢¢€€€¸¸¸ 6äææþøãì¹ìF›8qbuuµV«mmm]±bÅСC£¢¢Ø)‰‰‰ÌÂÂ[™¯ñ U ”6vìØŒŒŒ'Ož0[yÞ¼yLú‰'† rôèQ­V{þüy•JUXXÈ-Y ¾t«T Äp¶oGpöh²ó𠜘ëlDgª©T*íîîæ›«V«KJJÈÇâââÉ“'3ÓE•••‘Y¥¥¥Ó¦M#¹¾ÿþ{fº»»;88ø‡~`²444°Ë'm8uêÔòòr’^VVƾl¾zõ*™¥Ñh||| ² ö2===îîîbæ–——Ož<¹§§‡ùh²R………ùË_þõ_ÿuĈ³gÏ~ðàA^Š¢._¾L²<~ü˜¢¨+W®°SH3 oe¾Æ7@V-Pš\.onnææ‹‹c.444DFFrK(/Ý*U‘p0Ø#{~BA‚»Ûbî6GÛ:{Þ‹ûƒÓÔwøðá×®] 0:×ËËK£Ñ',ººº† Æ<; ‘HºººØ³ººº(Šúûßÿ~ôèÑPuðàÁŒŒŒÓ§O3Y˜klR>yÈŸ»"æÂY¦··—}0!¹Ä¼#@*•jµZ©TÊ|ôöönmmõööæ.ÙÛÛëééÙÝÝ-\`AAÁG}TUU¥T*Iâ AƒîÞ½ëççGR~ùå—'Ož˜œ;f̘C‡EFFÔNŒîîî>øàÇ,**¢þ¹e¸Æ×ŒÂ[™/—1¥­]»6//oîܹS¦L™5kVhh(³ŒÓsft†»F¾øÒ­R5 ïk{DŽKö¶³c Á\æ¾mmëœæÂ[<»=j™kêÔ©ÕÕÕÖ-3))éÒ¥K÷îÝ£(j×®]«V­"³Ø âõ¥‘™çÄ,ÙÑÑ1hÐ áeöïßÿᇖ——³(ŠR©T×®]c§\¿~]¥R‰™{óæÍ¨¨(öaSü©¯‡‡Gjjjee%w·˚ъ=|ÇŽ¥¥¥ …¢´´tÒ¤IiiiLzooo{{;û{ 4ˆ,/]˜£ï¼vE"‘¸Ù:ãìðÄÝ~"±gx•#¸à@ÃZøãÿ¸eË­Vkþé§ŸR5aÂöHDuuõ¯ýkò‘¹[ÌŠŠŠb¦%ɺuë222¾ûî»;wѨÈÈHö+^È&æ‡h…Bqûömò1::šïRüøã …B ¨ôôô¿þõ¯UUU¿úÕ¯ f½òÊ+ùùùì”üüüW^yEÌ\îARàh¹jÕ*ƒÌÙÒÒ2tèP°MÞÊÖ--&&æƒ>8xðà÷ß¿uëV&‘yèFdùFKàK·nÕ@³ž»0ös˜²ŸHì ¾_À6½´ÀúõëÕjuqqq[[ÛÓ§Oëëëß|óM¦F¹¹¹J¥²¶¶V¯××ÕÕ) ö«õ˜·9êõúúúz¥RyøðaRfww·Z­ž;wîæÍ›I"·•HJAAADDDcc£^¯ollŒˆˆ X—Ü|¹BBBªªªz{{j÷‡?üá‹/¾ ‹‹‹CCC+++u:]SSÓ¢E‹È¬;wþÛ¿ý_9[·nU©T?ýô“ѹ> ܹsg[[[[[Û®]»FE^º)<—¯v|s'MštüøñŽŽŽ§OŸž>}Z­V§¥¥äh4nŠðVž˜Òâã㫪ª:;;ÛÛÛ÷ìÙ3aÂ&ýäÉ“±±±555Z­¶££ãäÉ“ñññF×ÈW_ºUª"9ü×!8={8q·‡ì@ºíPRRòÊ+¯ 6L*•>÷Üs‰‰‰̬ݻw‡‡‡{xx¨Tª={ö,E1³¤R©B¡Ø»w¯A™_~ù¥L&#¯-¤M]ÝeffŽ=Z*•ªTªŒŒ ™Lf2W~~~pp0yدj3fÌ`§FGGËd²Ñ£G³Ã~þùçÙï§ä®”‹ýzÈëׯ¿úê«Ì”Œ¿ví;»ð\£µ3ª¦¦fÙ²eaaaR©ÔÏÏoÚ´iÙÙÙܼf5Ђ[YLx½½½nnn&Kc¶…§§§ŸŸ_||üõë×ɬS§NÍœ9ÓÇÇÇËË+..ŽýþNöùJ(¹Uñò•'x^ÀÕØö–l—½!œq+¸ ¶ À4á‚Maòù…´´´7näææZPøùóçßzë­«W¯ZÝ?ôôô(Š¢¢"òˆ‡QçÎKLL¼}û¶eo”pq=7n\kk«­›ÁûÀ1ó× ÚÕð¶è§OŸNOOOMMŸeñâÅMMM===.\X±bÅòåË­‰T*]»víúõë…Û¸qãÚµk1Ð`žžž¬¬¬éÓ§Û:°1×:‡G7ÀWþ®0Ѐ;ÀZúû—|“?››õ€«ÝÚ Ðì‰$00𫯾Š_àRSSoݺ”œœ¼~ýz77üHæÜÝÝ£¢¢òóóÇŽkëXÀ–œÿ4œÌ€]ÿ;å@F ÿØÏ¥5ÆlÎÍo‚ÿO†Àù ÌóN3Ѐg"`` Àu5éÀ‰„yk L&‹‰‰¹xñ"{ò×h‡ïîî~ÿý÷‡>dÈ;vô_´ÔÿµÎXÀá} àú{¸Áq$ p_l“8ú¨²²òÌ™3mmm ÉÉÉìYô?¿{ßÀ'Ÿ|rùòåsçÎݾ}û矠p\£žO˜ÿt·Ñ’âÀˆg"ÀN Ì} äNÖÖÖaÆQÕÕÕåïïßÝÝm°_$!!!•••¿úÕ¯ú/Nƒ˜)ì†à’0ÖLx¸Á²±;¿6Ààاk`¯ˆ›.°ïK¥R­V+•Jû/N6;?žô¼¯˜ÀÃì'·2º€½]à™ë5jÔíÛ·m€“ÃûÀáYñÝ ö0ˆ‰W9ôÝàÁƒoܸA>²w¥%K–¬ZµêþçÚÚÚÖ¬Yc‹èCYYÙk¯½6|øp‘#G&%%UTTX}-öpÔåû}¥V\¯µše ›·  `äÈ‘"4ù3€xöÙ…,cÅféWŽgÝÙýܺ•u¦¦cssÄ{p† lä˜Ð—šMÞ‰ÛÀ9ØÛ AëÖ­‹5z4øË_þ2nܸ¨¨(¥R©P(>6‡ðç?ÿyÆ +W®¼yófWWWQQ‘»»ûìÙ³m—€“mÛžÏðÁ‡6ú=åp6ç(-æô½šK Ÿ›ÅÞêÕOhšÆûÀy°Ç ØÇq@`2öß!o[§doc öÃ[¦¼¼üÃ?¬­­õòòb§oÛ¶í£>²UTIü·@,iîÂ}Ìe-nnnÏž=3úÇ Ì¶¡Ú?Gi±ˆÓ†7ºj~Þ÷ÂÞ×ÎCüó VŒ·-€ÃIOOß´i“Á@EQd !++K¥RÉd²ˆˆˆììl²€D"ÉÊÊŠˆˆÉdááá999Lú /¼PXXÈ.ªµµuèС†}—r~~~LLŒ\.÷÷÷Ÿ7oÞ£GÈòÙÙÙJ¥’YcVV–Àº¥¥%%%ÅÛÛ{Ĉï¾ûngg§˜òsrrÂÃÃIù÷$ éÚµkñññþþþžžžjµº  €Ì5ø"H$yyyS¦Lñõõuww§þù‹ÉhKRƾ¼HáFWÁ.o« ´ŒBhšvssÏàKo¥Â-ÉeО“'Oööööññ™5kÖÅ‹+**f̘áëëëë뛘˜È®_W¡ûÛ±cÇ¢££=== ž}ûøŠmûöísæÌ!;::BBB:::HJttt}}=%¸)ZŒK`3t¹ŽS 0ƒ`„Wa°¤YÛ/JÄÞmÐÏ :Fll¬\.W(û÷ï'éF»ÙÀì­ö@"‘9ÓµLô¶Žì÷`'fáå-^µµJ°gèÞ|±e>|È77777,,ììÙ³:®¶¶6,,,//™EQTxxx]]N§«««S*•GŽ¡iº´´4..Ž]HZZÚòåË™,$oddä™3gt:]KKËÒ¥K˜Yß|óJ¥ª¯¯×étõõõáááMœ““óôéÓ»wï.Y²$%%ÅdùGŽ!å×ÖÖ2OÖ-\`I21vìØŒŒŒ'Ož0ÑΛ7Ï`‚¢¨ñãÇ×ÔÔèõzƒeøZ’¯“³„·_Ë(ÄèÚf ¬ÔdK TâĉÕÕÕZ­¶µµuÅŠC‡ŠŠb§$&&’Œ|]E ¿8qbÈ!GÕjµçÏŸW©T………|µ&nß¾-—ËùåæcFF†——WFFóñÎ;½½½´©MÙ÷ÍÄír§p`Ürøfq—¿Ýb³wóMWTThµÚ7n,\¸,#pD⫲UöV;Ó_pBb.òM ˆ<0Z¥G‡ÞÎÇ[F*•vwwóÍU«Õ%%%äcqqñäÉ“™iŠ¢ÊÊÊȬÒÒÒiÓ¦‘\ßÿ=3ÝÝÝüÃ?Ðÿ|EqõêU’W£Ñøøø0ÓS§N-//'³ÊÊÊD6i{{ûÈ‘#M–?mÚ4ƒ°ùÊX’LÈåòææfn^£_C F—hI³®ÊHŠðVãk…]»À,•šlI¾Â)Šº|ù2Iüø1EQW®\a§ðUÝUú[\\{p¡¡¡!22Òd„4MÇÆÆ2—‹½½½ãÆ;xðàØ±c™ëöôôô•+Wrë­fß7·Ë dœÂqËá›Å]RüvˆAÌÞÍ7=}úôãÇ ÇIsŽHÜŠ˜ R|7°8'!þšßâ‹387ô>ŽØ2=â›+—Ë»ººÈÇÎÎN¹\ÎLSe0ËËË‹™>|øð[o½ÅLüö·¿%YÈsICP¬kNƒbùš´¥¥eÙ²eAAAäþp7·<,ÌW¾———Èò–$ï½÷Þˆ#V®\¹ÿþ;wîpWÇNééé1’@K \¢ÌÞj|-c@ \|ñ­ÔdKòn´L¾µtþæíímð¥Or ûôÓO™ßŸËËËgΜIÓô‹/¾È\Ù¾ôÒKäWxSö}3q»Ü@Æ)·áj ¯Ñ‚ÄìÝ|Ó^^^ÜØ„HÜŠ˜ R|7°x_8<ë؇Dá·-PÝ.`ϦNZ]]mÝ2“’’.]ºtïÞ=Š¢víÚµjÕ*î2}?Œ/X°À××÷Ô©S4MëõúÞÞ^+–/ÆŽ;JKK Eiié¤I“ÒÒÒæ>3o.«|ïØä¤ÚäJÍjI¾2ùÖ"ÜUøôöö¶··³¿ôŸ={f2EQóçÏ/++ëèèHOOOII¡(*%%%==ýÉ“'.\˜9s¦˜B¬²™„»œÄin¯¿Ý˜eÝL˜TM$¼¯œ‡ÉCžø%M–lVÙA,+ÁÎwLG5Hß¶mMÓjµúĉì…Å>Þ‚’8ššzëÖ­   äääõë×»¹á×2è/èoÖ‚±°6¿,7w°b 6¯@¿2÷Šº±±qË–-µµµ^^^»víJHH 8WªÜ ~ËrÖè2Üt£…”lt]özpIf|_Ú|s8r5n»v?d쪎Vdñ.SZZºlÙ²û÷ïSæŒX–Ëä2"ÇÌ‚3pM‰·xIDATw€íÙÛE¸È×:XP,3‡½ÁÅýþ÷¿¿zõª^¯ïíí}öìY¿æê‹Áƒ߸qcVà|¤Ž8âîXÑ€0{hèW4M“w˹B}Œzã7’’’nݺ5vìØôk®¾X·n]lllGGöV³Ð4í§ø&DqÄ(h \³ÖàÄð-Ì-.Ë­Ÿnîä_DZÿ‡þŸ€ãrÙKngÎò±££#$$¤££ƒ¤DGG×××SüÛš!°-²²²T*S¯ììlnð)|«0X’»§]‘ð¦äëñHÌê|û£Èà5ͰaÃZ[[ÙÅj4šáÇk4vËì;}Üã,ØÜ"WÌ’±±±r¹\¡Pìß¿Ÿ¤ t£M*°QŒßÈbÙÙÙJ¥’´€É Šé™L"‘¹½Ðž­†­ƒ³õÓÎkP¦ÑUØÛAÇ1pwãÌeÝįÈwðàààœœœ§OŸÞ½{wÉ’%)))L:EQãǯ©©ÑëõLʉ'† rôèQ­V{þüy•JUXXh´LŠ¢ÂÃÃëêêt:]]]R©<<\̱ÅÞ¾nïrc N ÿ  d¢¡¡!((è‹/¾à.SRR2a°°°¬¬,n±z½~íÚµƒþüóÏ­6Ýo 0`¬>Ö \še¹,[²œ`ïnoo9r$3MQTCC{n\\ûd½¡¡!22Òh9E•••‘¥¥¥Ó¦M3YwE]¾|™||üø1EQW®\a§øøø… &Øå¤„1mÚ4ƒàÅŒ5\½z•¤k4•0ƒç+D­Vÿý÷Ìtwwwppð?ü`4ñÍeY ˆk†ØØXær®··wܸq;v,3¾žž¾råJ1a4cII ™U\\ýøñãÜtáÃפ|Åèñ™˜:ujyy9I/++sl±Ã¯Ç»\Ç@€£ë¿× Xæãßÿþ÷áÇ“ï ƒe:¤Õjïܹ“œœÌ-sýúõ³gÏþùçŸ5Íš5kú)lÍÀ¡Y}¬¡?rY·ñ+r¸½»¥¥eÙ²eAAAäöi7·qâÄk¯½ftooï»wï¶´´„††~õÕWÜrssÓÓÓCBB† ²sçÎ~ŽÀi•––Nœ8Q&“=zÏž=$=33sôèÑ2™,&&æâÅ‹L"yÖÔ²\\:néÒ¥>>>#GŽÜ¾};I×jµï¼óŽ¿¿¿¿¿ÿþð­VKŠ2ºŠgÏž}üñÇ#FŒðöö^¸p¡ÁãÓÎaÁ‚¾¾¾§Nêèè iZ¯×÷öö’¹ä²‡ÑÛÛÛÞÞÎ>³|ö왹k.Ä`T¿ýS «ÔÅ‚¨„œ¯¤¤¤K—.Ý»w¢¨]»v­ZµJ||eZ· ®/,ÞjóçÏ/++ëèèHOOOII¡(*%%%==ýÉ“'.\˜9s¦˜BúÞC̽\âö[>|›R¸c˜[Z?¿zõjrÓèÎ;׬Y#~-Vßãˆéáâ lñMÍf'¯c0I"‘8Ìÿ¡ Ø»:FI@XffæÛo¿÷ÀáÇ+++Õjuhh¨ÁË{÷ïßW*•ý#€KX¼xñ'Ÿ|ÒÞÞ^]]ÝØØHÒ+++Ïœ9ÓÖÖ–œœl•\\›6mzôèÑO?ýtáÂ…ªª*’¾aÆ{÷î555ݼyó§Ÿ~Ú¸q£ð*¶nÝúÝwß;w®¥¥ÅÓÓóOú“e­aÏΜ9óé§ŸFDDÈårŠ¢¾ýö[…™{ƒE–|úôi2]]]eA!–‘H$ÜK_ƒ0¢¢¢ ‚·blf58!‘HÖ­[—‘‘ñÝwßݹs'))©ï‘ô±¼½½ÛÚÚÈÇk×®õ=$Š¢ ÅøñãÓÓÓ/\¸ðÆoP•páÂ…ŒŒŒ—_~ÙÃÃÃ`yî–0aÂv]ª««ýë_3ÓÕ1k&WÄ·)Åt £[dÇàÛÍ ~Μ9>¬©©©©©immåþ®#Ðs¬²Ç™µ-Äj¢££O:ÅMh Š¿I-Ø[###Ïž=K>²§XÐ3ˆ%·DØŽƒ† ŒþÛ Š¥(ª¹¹Y¥R}öÙg|Ë%%%äIH¶ààà7nX7N8 £Ó‡CCCwîÜyç΃Œ­­­Ìtgg§T*%é}ÉÅÔÔÔÄL߸qƒ,xóæMfúúõë« #?xðà¹çž®µ#îÝjµzÓ¦M¦««ëرc£F¢øoÐ=yòdlllMMV«íèè8yòd||¼Ñb)Šb^u¦×ëëëë•JåáÇMÂ]£Y)d"$$¤ªªŠ}ã17E ŒC‡‘àëêêD¾Òdœ ³œÒÝÝ­V«çλyóf£%‹ ƒ¤XÖdbΜ9ÉÉÉ=ÒëõgÏže.´,ƒkÛ¶mR©tË–-$eóæÍR©ôСCÜìÜ-+°®ÜÜ\¥RY[[KêE^õ'Pî*LÖE`E4ϦÓ1ŒF"²cðíæÿÙgŸÍŸ?þüù;vìà¶€@ϱÊgÖæ¼*.. ­¬¬ÔétMMM‹-2ÙMJólP """õz}cccDD„˜½ÉdÏxŽzÑîˆ1£ÿ;ƒ¾~ý:{E4Mß½{w̘1[·n5ºÌ‚ ®\¹¢ÓéŠŠŠ†ÎÎÈØ°aÃìÙ³›››?~¼zõêþÛAÃl&»qCCÃ믿rôèQ’Ë ƒ Ërq¹»»“Çb»»»É’é|Ãä£T*uwwwwwwss£þïG$ޏw755½üòËr¹\.—GEE}ýõ×Â-|êÔ©™3gúøøxyyÅÅÅ}¡“w÷îÝáááR©T¡PìÝ»WL!ÖkÈÏÏ&ÿnÙhŠp]²³³ …T*U©T™™™Vk0«Á R¾üòK™LöàÁ£%‹ £-@&|M!|ˆ£máP™çø˜ÈÈÈÉd&s™ì™Ï^â0—ý´ ˜¥_ϼSSS}}}¹ß7÷ïß7n3–l°Ìý×3F*•Nœ8‘ûŠ)š¦õzýš5k†:dÈÿøÿè°ñjÀ€øn̾‡Hü¨e¹ˆàà`¾ûØéAAA« inn¬ß?ÁÞM úCjj*ùÅšu7¥ÉÒ°?ZÉ&íË&>wîܸqã,ËkCøþ€†3o.´ 8“ÝØä=D´±QËrq}øá‡¯¾úêÇ[ZZ~÷»ß‘%ßÿý×_¤¯[·Nxiii¿ûÝïšššº»»/_¾üûßÿ^ Ê4ön´ƒÕUWW?÷ÜsO#²î¦SöG«nR 6ñ¢E‹nÞ¼ÙÝÝýÃ?Lž<ùoû[ŸchEIÉ]@ÿxã7’’’nݺ5vìØôk.®¿þõ¯+W® óóó[·n݉'˜ôÔÔÔU«V©T*Š¢Þ|óÍ-[¶—óÑGI$’—^zéÞ½{&LذaƒÅ!ô…D" Ü·o_hh¨­c>±î¦DǰC–m”Ù³g¿þúë·nÝ JNN~ï½÷ú/Â~BÓ´„LÙ6pßäB›€@76 Í.KŠï?°‰D"µu àðhš–H$öðϽ™[ ØlnjW†÷5€óÀ) €ÍÑ4ífëDáþVÙ¹¬[€‹`.ò±Ë0ð[¸87ò)‘ÕÇ Ä(~¥¸îW#‘Hp_86ËFK`Œõí·ßnnn¦(ª¹¹ùí·ßîïÕØÜÚÀÀM ”]v« Ûª^vØžNmÐGnÌ›œlÀ?”––Nœ8Q&“=zÏž=$=33sôèÑ2™,&&æâÅ‹L"9‚Y–Ë“nôÀØØØ¼k×.î2FWššúþûïSõÞ{復¦ö©E+ŸZ¸fݺÖv¼†`¼¯ìÑâÅ‹?ùä“öööêêêÆÆF’^YYyæÌ™¶¶¶„„„ääd«ä2ÀüÉ}¸ìÈ‘#¯¾újffæêÕ«¹Ë𭚌JXЊì®ÙóI­]ü¦Êy[ÀVõrÖö'†÷5€Ýñöö¾{÷nKKKhhèW_}EÒ333ƒƒƒ½½½×­[wþüy«äcûöí«W¯>qâÄk¯½&>à7þío£(êóÏ?߸q£ëpP.;Üà ‰$???&&F.—ûûûÏ›7ïÑ£GdnVV–J¥’ÉdÙÙÙ$ õw{‘F`oýcÇŽÅÆÆÊår…B±ÿ~vztt´§§§B¡Ø·oŸ@T---)))ÞÞÞ#FŒx÷Ýw;;;ÅD›““ÎD›••ÅW_nðEñK–¹víZ||¼¿¿¿§§§Z­.((pŽöÌËË›2eН¯¯»»»YÅJ$’¬¬¬ˆˆ™Lž““Þ%¾X†åËÂ._"‘ 6¬µµ•›F£>|¸F£®Ž˜"I$’ÿÿÓÀ€a@ 444¼þúë!!!G%¹ 1˜°,—Ñð >*•Ê 6,ctÕ&WÄ^FÌbŽ…œmØ:â4õ¥(*22òÌ™3:®¥¥eéÒ¥ ̬ÜÜܰ°°³gÏêtºÚÚÚ°°°¼¼<’‹[3QTT\QQ¡Õjoܸ±páB&ýĉC† 9zô¨V«=þ¼J¥*,,ä‹*888''çéÓ§wïÞ]²dIJJŠÉh9¢R©êëë™h ßÖ1<_±dá±cÇfddûì3¾eŒ®Z<‡ÁY¹Îi†3Õ”¢¨«W¯’ÆÇLJ™V«Õ%%%dVqqñäÉ“I.n9ÌÄôéÓ?Î]Q\\ûªµ¡¡!22RL„íííìƒ<_´Ó¦M+++#³JKKÍkà+–,,—Ë›››MFëpíÙÐÐ`Y±E4ø´iÓ,(–¯a²”ñâÅÀÀ@2®ÑÝÝ|éÒ%áBÄwÉy¾ÀQ˜<ì,X°àÊ•+:®¨¨høðá$—A!–åâ:pà@¿æâZ·n]ll¬Ásæß~ûíþçnÙ²…»ŒµV à|اNö¯¯ØÕq²³©ÙL½½½íííì³ÒgÏž]rÁ‚¾¾¾§Nêèè iZ¯×÷öööw´&‹Ý±cGii©B¡(--4iRZZšÅEY…µÚ“ @˜[¬0ñÅò5¬p$å¯^½ú‹/¾`¦wîܹfÍëVLÂûÀ˜­£°#hp¶;áéG¶nTëãVФ¨Õê'NôÒÒRrÏ¿D"áûõþùçŸ/**â®è7¿ùÍ·ß~+&$§OŸ’åååÿMj$Eü-ñÁsSŒrûömooo£…;z{Š/–|†Â²bÙ +…[~OOó.Œ³gÏ*•ÊgÏž™,ÏPX—3S€ÝÂaÇ\J?_û[7dáV¤äææ*•ÊÚÚZ½^_WW§P(È» CBBªªªØ—Ç$Wqqqhhhee¥N§kjjZ´h“~òäÉØØØšš­VÛÑÑqòäÉøøx£!©ÕêM›6i4š®®®cÇŽ5Š1ÖpèÐ!æU$Z¾­&<7…LÄÇÇWUUuvv¶··ïÙ³g„ F wôö_,EQ¤Áëëë•JåáÇ-(–¯a²ݲŸ}öÙüùóçÏŸ¿cÇ1ëî0N¼Ëô'ÿ¾ûd'G{¸x°“¦`\Ó4½{÷îððp•JµgÏ’žŸŸÌ<,ÀÍUXX-“ÉF½wï^’~êÔ©™3gúøøxyyÅÅÅ}å!MÓMMM/¿ü²\.—ËåQQQ_ýµ˜±𦳳³ …T*U©T™™™|[áà RÈDIIÉŒ3<==ýüüâããÙ/ñ዇›bÿí)¾XŠ¢˜êH¥R…BÁ̬b–/‹Ñò5Í AƒÜÖÖ&²:ßÔÐNô 8 rþdë@lMN@"ÁeüƒD"q³u àŠ˜ÓgzKœe0ÐNÉÍÉ^ 6DÓô?þW“mCäâ¿ê»xõÀ‰¹1¯m°uàº\óÖ*׬5¸¼¯l‰ tºÚ…7©/†zÀ)á|lÌÕ.¼]­¾à‚p_ؘKÝÝ€pøG¸`\á"Üê ‘H0Öö‚}_ƒ“šœ¸j$ø‘ ì“]–;YuÄÀXØ#'{wޱàRð Ø/'qÀ1\D"‘Ú:^¸PpDx†¬ÉÍÖ€SÁûÀj$ îkkÂû ±š¦1iLcÓ˜Æ4¦1iLcÓ˜Æ4¦-ž–’)€¾ûë1“hOðIEND®B`‚shishi-1.0.2/doc/reference/html/home.png0000644000000000000000000000121612126773323015003 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚shishi-1.0.2/doc/reference/html/index.sgml0000644000000000000000000021364012126773323015346 00000000000000 shishi-1.0.2/doc/reference/html/shishi-shishi.html0000644000000000000000000630102312126773323017014 00000000000000 shishi

shishi

shishi

Synopsis

#define             SHISHI_DNS_IN
#define             SHISHI_DNS_SRV
#define             SHISHI_DNS_TXT
#define             SHISHI_GENERALIZEDTIMEZ_LENGTH
#define             SHISHI_GENERALIZEDTIME_LENGTH
#define             SHISHI_VERSION
typedef             Shishi;
enum                Shishi_KDCOptions;
typedef             Shishi_ap;
enum                Shishi_apoptions;
typedef             Shishi_as;
typedef             Shishi_asn1;
enum                Shishi_authorization;
enum                Shishi_cksumtype;
typedef             Shishi_crypto;
typedef             Shishi_dns;
typedef             Shishi_dns_srv;
enum                Shishi_etype;
enum                Shishi_filetype;
typedef             Shishi_key;
typedef             Shishi_keys;
enum                Shishi_keyusage;
enum                Shishi_krb_error;
enum                Shishi_lrtype;
enum                Shishi_msgtype;
enum                Shishi_name_type;
enum                Shishi_outputtype;
enum                Shishi_padata_type;
typedef             Shishi_priv;
enum                Shishi_rc;
typedef             Shishi_safe;
typedef             Shishi_tgs;
enum                Shishi_ticketflags;
typedef             Shishi_tkt;
typedef             Shishi_tkts;
typedef             Shishi_tkts_hint;
enum                Shishi_tkts_hintflags;
enum                Shishi_tr_type;
Shishi *            shishi                              (void);
int                 shishi_3des                         (Shishi *handle,
                                                         int decryptp,
                                                         const char key[24],
                                                         const char iv[8],
                                                         char *ivout[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);
int                 shishi_aes_cts                      (Shishi *handle,
                                                         int decryptp,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char iv[16],
                                                         char *ivout[16],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);
void                (*shishi_alloc_fail_function)       (void);
int                 shishi_ap                           (Shishi *handle,
                                                         Shishi_ap **ap);
Shishi_asn1         shishi_ap_authenticator             (Shishi_ap *ap);
int                 shishi_ap_authenticator_cksumdata   (Shishi_ap *ap,
                                                         char *out,
                                                         size_t *len);
void                shishi_ap_authenticator_cksumdata_set
                                                        (Shishi_ap *ap,
                                                         const char *authenticatorcksumdata,
                                                         size_t authenticatorcksumdatalen);
void                shishi_ap_authenticator_cksumraw_set
                                                        (Shishi_ap *ap,
                                                         int32_t authenticatorcksumtype,
                                                         const char *authenticatorcksumraw,
                                                         size_t authenticatorcksumrawlen);
int32_t             shishi_ap_authenticator_cksumtype   (Shishi_ap *ap);
void                shishi_ap_authenticator_cksumtype_set
                                                        (Shishi_ap *ap,
                                                         int32_t cksumtype);
void                shishi_ap_authenticator_set         (Shishi_ap *ap,
                                                         Shishi_asn1 authenticator);
void                shishi_ap_done                      (Shishi_ap *ap);
Shishi_asn1         shishi_ap_encapreppart              (Shishi_ap *ap);
void                shishi_ap_encapreppart_set          (Shishi_ap *ap,
                                                         Shishi_asn1 encapreppart);
int                 shishi_ap_etype                     (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         int etype);
int                 shishi_ap_etype_tktoptionsdata      (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         int32_t etype,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);
Shishi_key *        shishi_ap_key                       (Shishi_ap *ap);
int                 shishi_ap_nosubkey                  (Shishi *handle,
                                                         Shishi_ap **ap);
const char *        shishi_ap_option2string             (Shishi_apoptions option);
Shishi_asn1         shishi_ap_rep                       (Shishi_ap *ap);
int                 shishi_ap_rep_asn1                  (Shishi_ap *ap,
                                                         Shishi_asn1 *aprep);
int                 shishi_ap_rep_build                 (Shishi_ap *ap);
int                 shishi_ap_rep_der                   (Shishi_ap *ap,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_ap_rep_der_set               (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);
void                shishi_ap_rep_set                   (Shishi_ap *ap,
                                                         Shishi_asn1 aprep);
int                 shishi_ap_rep_verify                (Shishi_ap *ap);
int                 shishi_ap_rep_verify_asn1           (Shishi_ap *ap,
                                                         Shishi_asn1 aprep);
int                 shishi_ap_rep_verify_der            (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_ap_req                       (Shishi_ap *ap);
int                 shishi_ap_req_asn1                  (Shishi_ap *ap,
                                                         Shishi_asn1 *apreq);
int                 shishi_ap_req_build                 (Shishi_ap *ap);
int                 shishi_ap_req_decode                (Shishi_ap *ap);
int                 shishi_ap_req_der                   (Shishi_ap *ap,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_ap_req_der_set               (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);
int                 shishi_ap_req_process               (Shishi_ap *ap,
                                                         Shishi_key *key);
int                 shishi_ap_req_process_keyusage      (Shishi_ap *ap,
                                                         Shishi_key *key,
                                                         int32_t keyusage);
void                shishi_ap_req_set                   (Shishi_ap *ap,
                                                         Shishi_asn1 apreq);
int                 shishi_ap_set_tktoptions            (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options);
int                 shishi_ap_set_tktoptionsasn1usage   (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int authenticatorcksumkeyusage,
                                                         int authenticatorkeyusage);
int                 shishi_ap_set_tktoptionsdata        (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);
int                 shishi_ap_set_tktoptionsraw         (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         int32_t cksumtype,
                                                         const char *data,
                                                         size_t len);
Shishi_apoptions    shishi_ap_string2option             (const char *str);
Shishi_tkt *        shishi_ap_tkt                       (Shishi_ap *ap);
void                shishi_ap_tkt_set                   (Shishi_ap *ap,
                                                         Shishi_tkt *tkt);
int                 shishi_ap_tktoptions                (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options);
int                 shishi_ap_tktoptionsasn1usage       (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int authenticatorcksumkeyusage,
                                                         int authenticatorkeyusage);
int                 shishi_ap_tktoptionsdata            (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);
int                 shishi_ap_tktoptionsraw             (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         int32_t cksumtype,
                                                         const char *data,
                                                         size_t len);
Shishi_asn1         shishi_aprep                        (Shishi *handle);
int                 shishi_aprep_decrypt                (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *encapreppart);
int                 shishi_aprep_enc_part_add           (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_asn1 encapreppart);
int                 shishi_aprep_enc_part_make          (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 encticketpart);
int                 shishi_aprep_enc_part_set           (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int etype,
                                                         const char *buf,
                                                         size_t buflen);
int                 shishi_aprep_from_file              (Shishi *handle,
                                                         Shishi_asn1 *aprep,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_aprep_get_enc_part_etype     (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int32_t *etype);
int                 shishi_aprep_parse                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *aprep);
int                 shishi_aprep_print                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 aprep);
int                 shishi_aprep_read                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *aprep);
int                 shishi_aprep_save                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 aprep);
int                 shishi_aprep_to_file                (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_aprep_verify                 (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 encapreppart);
Shishi_asn1         shishi_apreq                        (Shishi *handle);
int                 shishi_apreq_add_authenticator      (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 authenticator);
int                 shishi_apreq_decrypt                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *authenticator);
int                 shishi_apreq_from_file              (Shishi *handle,
                                                         Shishi_asn1 *apreq,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_apreq_get_authenticator_etype
                                                        (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int32_t *etype);
int                 shishi_apreq_get_ticket             (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_asn1 *ticket);
int                 shishi_apreq_mutual_required_p      (Shishi *handle,
                                                         Shishi_asn1 apreq);
int                 shishi_apreq_options                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t *flags);
int                 shishi_apreq_options_add            (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t option);
int                 shishi_apreq_options_remove         (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t option);
int                 shishi_apreq_options_set            (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t options);
int                 shishi_apreq_parse                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *apreq);
int                 shishi_apreq_print                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 apreq);
int                 shishi_apreq_read                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *apreq);
int                 shishi_apreq_save                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 apreq);
int                 shishi_apreq_set_authenticator      (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);
int                 shishi_apreq_set_ticket             (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_asn1 ticket);
int                 shishi_apreq_to_file                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_apreq_use_session_key_p      (Shishi *handle,
                                                         Shishi_asn1 apreq);
int                 shishi_arcfour                      (Shishi *handle,
                                                         int decryptp,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char iv[258],
                                                         char *ivout[258],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);
int                 shishi_as                           (Shishi *handle,
                                                         Shishi_as **as);
int                 shishi_as_check_cname               (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep);
int                 shishi_as_check_crealm              (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep);
int                 shishi_as_derive_salt               (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         char **salt,
                                                         size_t *saltlen);
void                shishi_as_done                      (Shishi_as *as);
Shishi_asn1         shishi_as_krberror                  (Shishi_as *as);
int                 shishi_as_krberror_der              (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);
void                shishi_as_krberror_set              (Shishi_as *as,
                                                         Shishi_asn1 krberror);
int                 shishi_as_process                   (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         const char *string,
                                                         Shishi_asn1 *enckdcreppart);
Shishi_asn1         shishi_as_rep                       (Shishi_as *as);
int                 shishi_as_rep_build                 (Shishi_as *as,
                                                         Shishi_key *key);
int                 shishi_as_rep_der                   (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_as_rep_der_set               (Shishi_as *as,
                                                         char *der,
                                                         size_t derlen);
int                 shishi_as_rep_process               (Shishi_as *as,
                                                         Shishi_key *key,
                                                         const char *password);
void                shishi_as_rep_set                   (Shishi_as *as,
                                                         Shishi_asn1 asrep);
Shishi_asn1         shishi_as_req                       (Shishi_as *as);
int                 shishi_as_req_build                 (Shishi_as *as);
int                 shishi_as_req_der                   (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_as_req_der_set               (Shishi_as *as,
                                                         char *der,
                                                         size_t derlen);
void                shishi_as_req_set                   (Shishi_as *as,
                                                         Shishi_asn1 asreq);
int                 shishi_as_sendrecv                  (Shishi_as *as);
int                 shishi_as_sendrecv_hint             (Shishi_as *as,
                                                         Shishi_tkts_hint *hint);
Shishi_tkt *        shishi_as_tkt                       (Shishi_as *as);
void                shishi_as_tkt_set                   (Shishi_as *as,
                                                         Shishi_tkt *tkt);
Shishi_asn1         shishi_asn1_aprep                   (Shishi *handle);
Shishi_asn1         shishi_asn1_apreq                   (Shishi *handle);
Shishi_asn1         shishi_asn1_asrep                   (Shishi *handle);
Shishi_asn1         shishi_asn1_asreq                   (Shishi *handle);
Shishi_asn1         shishi_asn1_authenticator           (Shishi *handle);
void                shishi_asn1_done                    (Shishi *handle,
                                                         Shishi_asn1 node);
int                 shishi_asn1_empty_p                 (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field);
Shishi_asn1         shishi_asn1_encapreppart            (Shishi *handle);
Shishi_asn1         shishi_asn1_encasreppart            (Shishi *handle);
Shishi_asn1         shishi_asn1_enckdcreppart           (Shishi *handle);
Shishi_asn1         shishi_asn1_encprivpart             (Shishi *handle);
Shishi_asn1         shishi_asn1_encrypteddata           (Shishi *handle);
Shishi_asn1         shishi_asn1_encticketpart           (Shishi *handle);
Shishi_asn1         shishi_asn1_etype_info              (Shishi *handle);
Shishi_asn1         shishi_asn1_etype_info2             (Shishi *handle);
Shishi_asn1         shishi_asn1_krberror                (Shishi *handle);
Shishi_asn1         shishi_asn1_krbsafe                 (Shishi *handle);
Shishi_asn1         shishi_asn1_methoddata              (Shishi *handle);
Shishi_msgtype      shishi_asn1_msgtype                 (Shishi *handle,
                                                         Shishi_asn1 node);
int                 shishi_asn1_number_of_elements      (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         size_t *n);
Shishi_asn1         shishi_asn1_pa_enc_ts_enc           (Shishi *handle);
Shishi_asn1         shishi_asn1_padata                  (Shishi *handle);
void                shishi_asn1_print                   (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         FILE *fh);
Shishi_asn1         shishi_asn1_priv                    (Shishi *handle);
int                 shishi_asn1_read                    (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **data,
                                                         size_t *datalen);
int                 shishi_asn1_read_bitstring          (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t *flags);
int                 shishi_asn1_read_inline             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char *data,
                                                         size_t *datalen);
int                 shishi_asn1_read_int32              (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int32_t *i);
int                 shishi_asn1_read_integer            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int *i);
int                 shishi_asn1_read_optional           (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **data,
                                                         size_t *datalen);
int                 shishi_asn1_read_uint32             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t *i);
Shishi_asn1         shishi_asn1_tgsrep                  (Shishi *handle);
Shishi_asn1         shishi_asn1_tgsreq                  (Shishi *handle);
Shishi_asn1         shishi_asn1_ticket                  (Shishi *handle);
int                 shishi_asn1_to_der                  (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         char **der,
                                                         size_t *len);
int                 shishi_asn1_to_der_field            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **der,
                                                         size_t *len);
int                 shishi_asn1_write                   (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         const char *data,
                                                         size_t datalen);
int                 shishi_asn1_write_bitstring         (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t flags);
int                 shishi_asn1_write_int32             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int32_t n);
int                 shishi_asn1_write_integer           (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int n);
int                 shishi_asn1_write_uint32            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t n);
Shishi_asn1         shishi_asrep                        (Shishi *handle);
Shishi_asn1         shishi_asreq                        (Shishi *handle);
int                 shishi_asreq_clientrealm            (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         char **client,
                                                         size_t *clientlen);
Shishi_asn1         shishi_asreq_rsc                    (Shishi *handle,
                                                         char *realm,
                                                         char *server,
                                                         char *client);
Shishi_asn1         shishi_authenticator                (Shishi *handle);
int                 shishi_authenticator_add_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t adtype,
                                                         const char *addata,
                                                         size_t addatalen);
int                 shishi_authenticator_add_cksum      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         char *data,
                                                         size_t datalen);
int                 shishi_authenticator_add_cksum_type (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int cksumtype,
                                                         char *data,
                                                         size_t datalen);
int                 shishi_authenticator_add_random_subkey
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_add_random_subkey_etype
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int etype);
int                 shishi_authenticator_add_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *subkey);
int                 shishi_authenticator_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t *adtype,
                                                         char **addata,
                                                         size_t *addatalen,
                                                         size_t nth);
int                 shishi_authenticator_cksum          (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t *cksumtype,
                                                         char **cksum,
                                                         size_t *cksumlen);
int                 shishi_authenticator_clear_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_client         (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_authenticator_client_set     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *client);
int                 shishi_authenticator_clientrealm    (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_authenticator_ctime          (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **t);
int                 shishi_authenticator_ctime_set      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *t);
int                 shishi_authenticator_cusec_get      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t *cusec);
int                 shishi_authenticator_cusec_set      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t cusec);
int                 shishi_authenticator_from_file      (Shishi *handle,
                                                         Shishi_asn1 *authenticator,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_authenticator_get_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key **subkey);
int                 shishi_authenticator_parse          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *authenticator);
int                 shishi_authenticator_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_read           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *authenticator);
int                 shishi_authenticator_remove_cksum   (Shishi *handle,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_remove_subkey  (Shishi *handle,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_save           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_seqnumber_get  (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t *seqnumber);
int                 shishi_authenticator_seqnumber_remove
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);
int                 shishi_authenticator_seqnumber_set  (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t seqnumber);
int                 shishi_authenticator_set_cksum      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int cksumtype,
                                                         char *cksum,
                                                         size_t cksumlen);
int                 shishi_authenticator_set_cname      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);
int                 shishi_authenticator_set_crealm     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *crealm);
int                 shishi_authenticator_set_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t subkeytype,
                                                         const char *subkey,
                                                         size_t subkeylen);
Shishi_asn1         shishi_authenticator_subkey         (Shishi *handle);
int                 shishi_authenticator_to_file        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_authorization_parse          (const char *authorization);
int                 shishi_authorize_k5login            (Shishi *handle,
                                                         const char *principal,
                                                         const char *authzname);
int                 shishi_authorize_strcmp             (Shishi *handle,
                                                         const char *principal,
                                                         const char *authzname);
int                 shishi_authorized_p                 (Shishi *handle,
                                                         Shishi_tkt *tkt,
                                                         const char *authzname);
int                 shishi_cfg                          (Shishi *handle,
                                                         const char *option);
int                 shishi_cfg_authorizationtype_set    (Shishi *handle,
                                                         char *value);
int                 shishi_cfg_clientkdcetype           (Shishi *handle,
                                                         int32_t **etypes);
int32_t             shishi_cfg_clientkdcetype_fast      (Shishi *handle);
int                 shishi_cfg_clientkdcetype_set       (Shishi *handle,
                                                         char *value);
const char *        shishi_cfg_default_systemfile       (Shishi *handle);
const char *        shishi_cfg_default_userdirectory    (Shishi *handle);
const char *        shishi_cfg_default_userfile         (Shishi *handle);
int                 shishi_cfg_from_file                (Shishi *handle,
                                                         const char *cfg);
int                 shishi_cfg_print                    (Shishi *handle,
                                                         FILE *fh);
char *              shishi_cfg_userdirectory_file       (Shishi *handle,
                                                         const char *file);
const char *        shishi_check_version                (const char *req_version);
int                 shishi_checksum                     (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t cksumtype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
size_t              shishi_checksum_cksumlen            (int32_t type);
const char *        shishi_checksum_name                (int32_t type);
int                 shishi_checksum_parse               (const char *checksum);
int                 shishi_checksum_supported_p         (int32_t type);
int                 shishi_cipher_blocksize             (int type);
int                 shishi_cipher_confoundersize        (int type);
int                 shishi_cipher_defaultcksumtype      (int32_t type);
size_t              shishi_cipher_keylen                (int type);
const char *        shishi_cipher_name                  (int type);
int                 shishi_cipher_parse                 (const char *cipher);
size_t              shishi_cipher_randomlen             (int type);
int                 shishi_cipher_supported_p           (int type);
int                 shishi_crc                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[4]);
Shishi_crypto *     shishi_crypto                       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen);
void                shishi_crypto_close                 (Shishi_crypto *ctx);
int                 shishi_crypto_decrypt               (Shishi_crypto *ctx,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_crypto_encrypt               (Shishi_crypto *ctx,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_ctime                        (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         time_t *t);
int                 shishi_decrypt                      (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_decrypt_etype                (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_decrypt_iv                   (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_decrypt_iv_etype             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_decrypt_ivupdate             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_decrypt_ivupdate_etype       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
Shishi_asn1         shishi_der2asn1                     (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_aprep               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_apreq               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_asrep               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_asreq               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_authenticator       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_encapreppart        (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_encasreppart        (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_enckdcreppart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_encprivpart         (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_enctgsreppart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_encticketpart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_etype_info          (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_etype_info2         (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_kdcrep              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_kdcreq              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_krberror            (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_krbsafe             (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_methoddata          (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_padata              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_priv                (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_tgsrep              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_tgsreq              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_asn1         shishi_der2asn1_ticket              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
Shishi_msgtype      shishi_der_msgtype                  (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);
int                 shishi_derive_default_salt          (Shishi *handle,
                                                         const char *name,
                                                         char **salt);
int                 shishi_des                          (Shishi *handle,
                                                         int decryptp,
                                                         const char key[8],
                                                         const char iv[8],
                                                         char *ivout[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);
int                 shishi_des_cbc_mac                  (Shishi *handle,
                                                         const char key[8],
                                                         const char iv[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[8]);
int                 shishi_dk                           (Shishi *handle,
                                                         Shishi_key *key,
                                                         const char *prfconstant,
                                                         size_t prfconstantlen,
                                                         Shishi_key *derivedkey);
void                shishi_done                         (Shishi *handle);
int                 shishi_dr                           (Shishi *handle,
                                                         Shishi_key *key,
                                                         const char *prfconstant,
                                                         size_t prfconstantlen,
                                                         char *derivedrandom,
                                                         size_t derivedrandomlen);
Shishi_asn1         shishi_encapreppart                 (Shishi *handle);
int                 shishi_encapreppart_ctime           (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         char **t);
int                 shishi_encapreppart_ctime_set       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         const char *t);
int                 shishi_encapreppart_cusec_get       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t *cusec);
int                 shishi_encapreppart_cusec_set       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t cusec);
int                 shishi_encapreppart_from_file       (Shishi *handle,
                                                         Shishi_asn1 *encapreppart,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_encapreppart_get_key         (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_key **key);
int                 shishi_encapreppart_parse           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *encapreppart);
int                 shishi_encapreppart_print           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encapreppart);
int                 shishi_encapreppart_read            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *encapreppart);
int                 shishi_encapreppart_save            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encapreppart);
int                 shishi_encapreppart_seqnumber_get   (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t *seqnumber);
int                 shishi_encapreppart_seqnumber_remove
                                                        (Shishi *handle,
                                                         Shishi_asn1 encapreppart);
int                 shishi_encapreppart_seqnumber_set   (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t seqnumber);
int                 shishi_encapreppart_time_copy       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_asn1 authenticator);
int                 shishi_encapreppart_to_file         (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         int filetype,
                                                         const char *filename);
Shishi_asn1         shishi_encasreppart                 (Shishi *handle);
Shishi_asn1         shishi_enckdcreppart                (Shishi *handle);
int                 shishi_enckdcreppart_authtime_set   (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *authtime);
int                 shishi_enckdcreppart_endtime_set    (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *endtime);
int                 shishi_enckdcreppart_flags_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         int flags);
int                 shishi_enckdcreppart_get_key        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_key **key);
int                 shishi_enckdcreppart_key_set        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_key *key);
int                 shishi_enckdcreppart_nonce_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         uint32_t nonce);
int                 shishi_enckdcreppart_parse          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *enckdcreppart);
int                 shishi_enckdcreppart_populate_encticketpart
                                                        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 encticketpart);
int                 shishi_enckdcreppart_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 enckdcreppart);
int                 shishi_enckdcreppart_read           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *enckdcreppart);
int                 shishi_enckdcreppart_renew_till_set (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *renew_till);
int                 shishi_enckdcreppart_save           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 enckdcreppart);
int                 shishi_enckdcreppart_server_set     (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *server);
int                 shishi_enckdcreppart_sname_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_name_type name_type,
                                                         char *sname[]);
int                 shishi_enckdcreppart_srealm_set     (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *srealm);
int                 shishi_enckdcreppart_srealmserver_set
                                                        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *srealm,
                                                         const char *server);
int                 shishi_enckdcreppart_starttime_set  (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *starttime);
int                 shishi_encprivpart_set_user_data    (Shishi *handle,
                                                         Shishi_asn1 encprivpart,
                                                         const char *userdata,
                                                         size_t userdatalen);
int                 shishi_encprivpart_user_data        (Shishi *handle,
                                                         Shishi_asn1 encprivpart,
                                                         char **userdata,
                                                         size_t *userdatalen);
int                 shishi_encrypt                      (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_encrypt_etype                (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_encrypt_iv                   (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_encrypt_iv_etype             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_encrypt_ivupdate             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_encrypt_ivupdate_etype       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);
Shishi_asn1         shishi_encticketpart                (Shishi *handle);
time_t              shishi_encticketpart_authctime      (Shishi *handle,
                                                         Shishi_asn1 encticketpart);
int                 shishi_encticketpart_authtime       (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char *authtime,
                                                         size_t *authtimelen);
int                 shishi_encticketpart_authtime_set   (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *authtime);
int                 shishi_encticketpart_client         (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_encticketpart_clientrealm    (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_encticketpart_cname_set      (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_name_type name_type,
                                                         const char *principal);
int                 shishi_encticketpart_crealm         (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **crealm,
                                                         size_t *crealmlen);
int                 shishi_encticketpart_crealm_set     (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *realm);
int                 shishi_encticketpart_endtime_set    (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *endtime);
int                 shishi_encticketpart_flags_set      (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         int flags);
int                 shishi_encticketpart_get_key        (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_key **key);
int                 shishi_encticketpart_key_set        (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_key *key);
int                 shishi_encticketpart_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encticketpart);
int                 shishi_encticketpart_transited_set  (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         int32_t trtype,
                                                         const char *trdata,
                                                         size_t trdatalen);
const char *        shishi_error                        (Shishi *handle);
void                shishi_error_clear                  (Shishi *handle);
int                 shishi_error_outputtype             (Shishi *handle);
void                shishi_error_printf                 (Shishi *handle,
                                                         const char *format,
                                                         ...);
void                shishi_error_set                    (Shishi *handle,
                                                         const char *errstr);
void                shishi_error_set_outputtype         (Shishi *handle,
                                                         int type);
int                 shishi_etype_info2_print            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 etypeinfo2);
int                 shishi_etype_info_print             (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 etypeinfo);
time_t              shishi_generalize_ctime             (Shishi *handle,
                                                         const char *t);
const char *        shishi_generalize_now               (Shishi *handle);
const char *        shishi_generalize_time              (Shishi *handle,
                                                         time_t t);
time_t              shishi_get_date                     (const char *p,
                                                         const time_t *now);
int                 shishi_hmac_md5                     (Shishi *handle,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *outhash[16]);
int                 shishi_hmac_sha1                    (Shishi *handle,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *outhash[20]);
const char *        shishi_hostkeys_default_file        (Shishi *handle);
void                shishi_hostkeys_default_file_set    (Shishi *handle,
                                                         const char *hostkeysfile);
Shishi_key *        shishi_hostkeys_for_localservice    (Shishi *handle,
                                                         const char *service);
Shishi_key *        shishi_hostkeys_for_localservicerealm
                                                        (Shishi *handle,
                                                         const char *service,
                                                         const char *realm);
Shishi_key *        shishi_hostkeys_for_server          (Shishi *handle,
                                                         const char *server);
Shishi_key *        shishi_hostkeys_for_serverrealm     (Shishi *handle,
                                                         const char *server,
                                                         const char *realm);
void                shishi_info                         (Shishi *handle,
                                                         const char *format,
                                                         ...);
int                 shishi_init                         (Shishi **handle);
int                 shishi_init_server                  (Shishi **handle);
int                 shishi_init_server_with_paths       (Shishi **handle,
                                                         const char *systemcfgfile);
int                 shishi_init_with_paths              (Shishi **handle,
                                                         const char *tktsfile,
                                                         const char *systemcfgfile,
                                                         const char *usercfgfile);
int                 shishi_kdc_check_nonce              (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 enckdcreppart);
int                 shishi_kdc_copy_cname               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 encticketpart);
int                 shishi_kdc_copy_crealm              (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 encticketpart);
int                 shishi_kdc_copy_nonce               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 enckdcreppart);
int                 shishi_kdc_print                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         Shishi_asn1 encasreppart);
int                 shishi_kdc_process                  (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *enckdcreppart);
int                 shishi_kdc_sendrecv                 (Shishi *handle,
                                                         const char *realm,
                                                         const char *indata,
                                                         size_t inlen,
                                                         char **outdata,
                                                         size_t *outlen);
int                 shishi_kdc_sendrecv_hint            (Shishi *handle,
                                                         const char *realm,
                                                         const char *indata,
                                                         size_t inlen,
                                                         char **outdata,
                                                         size_t *outlen,
                                                         Shishi_tkts_hint *hint);
int                 shishi_kdcrep_add_enc_part          (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 enckdcreppart);
int                 shishi_kdcrep_clear_padata          (Shishi *handle,
                                                         Shishi_asn1 kdcrep);
int                 shishi_kdcrep_client_set            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *client);
int                 shishi_kdcrep_cname_set             (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);
int                 shishi_kdcrep_crealm_set            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *crealm);
int                 shishi_kdcrep_crealmserver_set      (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *crealm,
                                                         const char *client);
int                 shishi_kdcrep_decrypt               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *enckdcreppart);
int                 shishi_kdcrep_from_file             (Shishi *handle,
                                                         Shishi_asn1 *kdcrep,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_kdcrep_get_enc_part_etype    (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int32_t *etype);
int                 shishi_kdcrep_get_ticket            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 *ticket);
int                 shishi_kdcrep_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcrep);
int                 shishi_kdcrep_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcrep);
int                 shishi_kdcrep_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcrep);
int                 shishi_kdcrep_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcrep);
int                 shishi_kdcrep_set_enc_part          (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);
int                 shishi_kdcrep_set_ticket            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 ticket);
int                 shishi_kdcrep_to_file               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_kdcreq                       (Shishi *handle,
                                                         char *realm,
                                                         char *service,
                                                         Shishi_asn1 *req);
int                 shishi_kdcreq_add_padata            (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int padatatype,
                                                         const char *data,
                                                         size_t datalen);
int                 shishi_kdcreq_add_padata_preauth    (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_key *key);
int                 shishi_kdcreq_add_padata_tgs        (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 apreq);
int                 shishi_kdcreq_allow_postdate_p      (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_build                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_clear_padata          (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_client                (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_kdcreq_disable_transited_check_p
                                                        (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_enc_tkt_in_skey_p     (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_etype                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int32_t *etype,
                                                         int netype);
int                 shishi_kdcreq_forwardable_p         (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_forwarded_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_from_file             (Shishi *handle,
                                                         Shishi_asn1 *kdcreq,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_kdcreq_get_padata            (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_padata_type padatatype,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_kdcreq_get_padata_tgs        (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *apreq);
int                 shishi_kdcreq_nonce                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t *nonce);
int                 shishi_kdcreq_nonce_set             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t nonce);
int                 shishi_kdcreq_options               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t *flags);
int                 shishi_kdcreq_options_add           (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t option);
int                 shishi_kdcreq_options_set           (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t options);
int                 shishi_kdcreq_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcreq);
int                 shishi_kdcreq_postdated_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_proxiable_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_proxy_p               (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcreq);
int                 shishi_kdcreq_realm                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_kdcreq_realm_get             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_kdcreq_renew_p               (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_renewable_ok_p        (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_renewable_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_sendrecv              (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *kdcrep);
int                 shishi_kdcreq_sendrecv_hint         (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *kdcrep,
                                                         Shishi_tkts_hint *hint);
int                 shishi_kdcreq_server                (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **server,
                                                         size_t *serverlen);
int                 shishi_kdcreq_set_cname             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_name_type name_type,
                                                         const char *principal);
int                 shishi_kdcreq_set_etype             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int32_t *etype,
                                                         int netype);
int                 shishi_kdcreq_set_realm             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         const char *realm);
int                 shishi_kdcreq_set_realmserver       (Shishi *handle,
                                                         Shishi_asn1 req,
                                                         char *realm,
                                                         char *service);
int                 shishi_kdcreq_set_server            (Shishi *handle,
                                                         Shishi_asn1 req,
                                                         const char *service);
int                 shishi_kdcreq_set_sname             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_name_type name_type,
                                                         const char *sname[]);
int                 shishi_kdcreq_till                  (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **till,
                                                         size_t *tilllen);
time_t              shishi_kdcreq_tillc                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_kdcreq_to_file               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_kdcreq_validate_p            (Shishi *handle,
                                                         Shishi_asn1 kdcreq);
int                 shishi_key                          (Shishi *handle,
                                                         Shishi_key **key);
void                shishi_key_copy                     (Shishi_key *dstkey,
                                                         Shishi_key *srckey);
void                shishi_key_done                     (Shishi_key *key);
int                 shishi_key_from_base64              (Shishi *handle,
                                                         int32_t type,
                                                         const char *value,
                                                         Shishi_key **key);
int                 shishi_key_from_name                (Shishi *handle,
                                                         int32_t type,
                                                         const char *name,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *parameter,
                                                         Shishi_key **outkey);
int                 shishi_key_from_random              (Shishi *handle,
                                                         int32_t type,
                                                         const char *rnd,
                                                         size_t rndlen,
                                                         Shishi_key **outkey);
int                 shishi_key_from_string              (Shishi *handle,
                                                         int32_t type,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *salt,
                                                         size_t saltlen,
                                                         const char *parameter,
                                                         Shishi_key **outkey);
int                 shishi_key_from_value               (Shishi *handle,
                                                         int32_t type,
                                                         const char *value,
                                                         Shishi_key **key);
size_t              shishi_key_length                   (const Shishi_key *key);
const char *        shishi_key_name                     (Shishi_key *key);
int                 shishi_key_parse                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_key **key);
const char *        shishi_key_principal                (const Shishi_key *key);
void                shishi_key_principal_set            (Shishi_key *key,
                                                         const char *principal);
int                 shishi_key_print                    (Shishi *handle,
                                                         FILE *fh,
                                                         const Shishi_key *key);
int                 shishi_key_random                   (Shishi *handle,
                                                         int32_t type,
                                                         Shishi_key **key);
const char *        shishi_key_realm                    (const Shishi_key *key);
void                shishi_key_realm_set                (Shishi_key *key,
                                                         const char *realm);
time_t              shishi_key_timestamp                (const Shishi_key *key);
void                shishi_key_timestamp_set            (Shishi_key *key,
                                                         time_t timestamp);
int                 shishi_key_to_file                  (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_key *key);
int                 shishi_key_type                     (const Shishi_key *key);
void                shishi_key_type_set                 (Shishi_key *key,
                                                         int32_t type);
const char *        shishi_key_value                    (const Shishi_key *key);
void                shishi_key_value_set                (Shishi_key *key,
                                                         const char *value);
uint32_t            shishi_key_version                  (const Shishi_key *key);
void                shishi_key_version_set              (Shishi_key *key,
                                                         uint32_t kvno);
int                 shishi_keys                         (Shishi *handle,
                                                         Shishi_keys **keys);
int                 shishi_keys_add                     (Shishi_keys *keys,
                                                         Shishi_key *key);
int                 shishi_keys_add_keytab_file         (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys *keys);
int                 shishi_keys_add_keytab_mem          (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_keys *keys);
void                shishi_keys_done                    (Shishi_keys **keys);
Shishi_key *        shishi_keys_for_localservicerealm_in_file
                                                        (Shishi *handle,
                                                         const char *filename,
                                                         const char *service,
                                                         const char *realm);
Shishi_key *        shishi_keys_for_server_in_file      (Shishi *handle,
                                                         const char *filename,
                                                         const char *server);
Shishi_key *        shishi_keys_for_serverrealm_in_file (Shishi *handle,
                                                         const char *filename,
                                                         const char *server,
                                                         const char *realm);
int                 shishi_keys_from_file               (Shishi_keys *keys,
                                                         const char *filename);
int                 shishi_keys_from_keytab_file        (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys **outkeys);
int                 shishi_keys_from_keytab_mem         (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_keys **outkeys);
const Shishi_key *  shishi_keys_nth                     (Shishi_keys *keys,
                                                         int keyno);
int                 shishi_keys_print                   (Shishi_keys *keys,
                                                         FILE *fh);
void                shishi_keys_remove                  (Shishi_keys *keys,
                                                         int keyno);
int                 shishi_keys_size                    (Shishi_keys *keys);
int                 shishi_keys_to_file                 (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys *keys);
int                 shishi_keys_to_keytab_file          (Shishi *handle,
                                                         Shishi_keys *keys,
                                                         const char *filename);
int                 shishi_keys_to_keytab_mem           (Shishi *handle,
                                                         Shishi_keys *keys,
                                                         char **out,
                                                         size_t *len);
Shishi_asn1         shishi_krberror                     (Shishi *handle);
int                 shishi_krberror_build               (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_client              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_krberror_client_set          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *client);
int                 shishi_krberror_crealm              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_krberror_ctime               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **t);
int                 shishi_krberror_ctime_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *t);
int                 shishi_krberror_cusec               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t *cusec);
int                 shishi_krberror_cusec_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t cusec);
int                 shishi_krberror_der                 (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_krberror_edata               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **edata,
                                                         size_t *edatalen);
int                 shishi_krberror_errorcode           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int *errorcode);
int                 shishi_krberror_errorcode_fast      (Shishi *handle,
                                                         Shishi_asn1 krberror);
const char *        shishi_krberror_errorcode_message   (Shishi *handle,
                                                         int errorcode);
int                 shishi_krberror_errorcode_set       (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int errorcode);
int                 shishi_krberror_etext               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **etext,
                                                         size_t *etextlen);
int                 shishi_krberror_from_file           (Shishi *handle,
                                                         Shishi_asn1 *krberror,
                                                         int filetype,
                                                         const char *filename);
const char *        shishi_krberror_message             (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_methoddata          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_asn1 *methoddata);
int                 shishi_krberror_parse               (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *krberror);
int                 shishi_krberror_pretty_print        (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_print               (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_read                (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *krberror);
int                 shishi_krberror_realm               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_krberror_remove_cname        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_crealm       (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_ctime        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_cusec        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_edata        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_etext        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_remove_sname        (Shishi *handle,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_save                (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);
int                 shishi_krberror_server              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **server,
                                                         size_t *serverlen);
int                 shishi_krberror_server_set          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *server);
int                 shishi_krberror_set_cname           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);
int                 shishi_krberror_set_crealm          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *crealm);
int                 shishi_krberror_set_edata           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *edata);
int                 shishi_krberror_set_etext           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *etext);
int                 shishi_krberror_set_realm           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *realm);
int                 shishi_krberror_set_sname           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_name_type name_type,
                                                         const char *sname[]);
int                 shishi_krberror_stime               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **t);
int                 shishi_krberror_stime_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *t);
int                 shishi_krberror_susec               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t *susec);
int                 shishi_krberror_susec_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t susec);
int                 shishi_krberror_to_file             (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_md4                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[16]);
int                 shishi_md5                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[16]);
int                 shishi_methoddata_print             (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 methoddata);
int                 shishi_n_fold                       (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out,
                                                         size_t outlen);
int                 shishi_padata_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 padata);
int                 shishi_parse_name                   (Shishi *handle,
                                                         const char *name,
                                                         char **principal,
                                                         char **realm);
int                 shishi_pbkdf2_sha1                  (Shishi *handle,
                                                         const char *P,
                                                         size_t Plen,
                                                         const char *S,
                                                         size_t Slen,
                                                         unsigned int c,
                                                         unsigned int dkLen,
                                                         char *DK);
const char *        shishi_principal_default            (Shishi *handle);
char *              shishi_principal_default_guess      (void);
void                shishi_principal_default_set        (Shishi *handle,
                                                         const char *principal);
int                 shishi_principal_name               (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_principal_name_realm         (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         Shishi_asn1 realmnode,
                                                         const char *realmfield,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_principal_name_set           (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         Shishi_name_type name_type,
                                                         const char *name[]);
int                 shishi_principal_set                (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         const char *name);
int                 shishi_priv                         (Shishi *handle,
                                                         Shishi_priv **priv);
int                 shishi_priv_build                   (Shishi_priv *priv,
                                                         Shishi_key *key);
void                shishi_priv_done                    (Shishi_priv *priv);
int                 shishi_priv_enc_part_etype          (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int32_t *etype);
Shishi_asn1         shishi_priv_encprivpart             (Shishi_priv *priv);
int                 shishi_priv_encprivpart_der         (Shishi_priv *priv,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_priv_encprivpart_der_set     (Shishi_priv *priv,
                                                         char *der,
                                                         size_t derlen);
void                shishi_priv_encprivpart_set         (Shishi_priv *priv,
                                                         Shishi_asn1 asn1encprivpart);
int                 shishi_priv_from_file               (Shishi *handle,
                                                         Shishi_asn1 *priv,
                                                         int filetype,
                                                         const char *filename);
Shishi_key *        shishi_priv_key                     (Shishi_priv *priv);
void                shishi_priv_key_set                 (Shishi_priv *priv,
                                                         Shishi_key *key);
int                 shishi_priv_parse                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *priv);
int                 shishi_priv_print                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 priv);
Shishi_asn1         shishi_priv_priv                    (Shishi_priv *priv);
int                 shishi_priv_priv_der                (Shishi_priv *priv,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_priv_priv_der_set            (Shishi_priv *priv,
                                                         char *der,
                                                         size_t derlen);
void                shishi_priv_priv_set                (Shishi_priv *priv,
                                                         Shishi_asn1 asn1priv);
int                 shishi_priv_process                 (Shishi_priv *priv,
                                                         Shishi_key *key);
int                 shishi_priv_read                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *priv);
int                 shishi_priv_save                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 priv);
int                 shishi_priv_set_enc_part            (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int32_t etype,
                                                         const char *encpart,
                                                         size_t encpartlen);
int                 shishi_priv_to_file                 (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_prompt_password              (Shishi *handle,
                                                         char **s,
                                                         const char *format,
                                                         ...);
shishi_prompt_password_func shishi_prompt_password_callback_get
                                                        (Shishi *handle);
void                shishi_prompt_password_callback_set (Shishi *handle,
                                                         shishi_prompt_password_func cb);
int                 (*shishi_prompt_password_func)      (Shishi *handle,
                                                         char **s,
                                                         const char *format,
                                                         va_list ap);
int                 shishi_random_to_key                (Shishi *handle,
                                                         int32_t keytype,
                                                         const char *rnd,
                                                         size_t rndlen,
                                                         Shishi_key *outkey);
int                 shishi_randomize                    (Shishi *handle,
                                                         int strong,
                                                         void *data,
                                                         size_t datalen);
const char *        shishi_realm_default                (Shishi *handle);
char *              shishi_realm_default_guess          (void);
void                shishi_realm_default_set            (Shishi *handle,
                                                         const char *realm);
char *              shishi_realm_for_server             (Shishi *handle,
                                                         char *server);
char *              shishi_realm_for_server_dns         (Shishi *handle,
                                                         char *server);
char *              shishi_realm_for_server_file        (Shishi *handle,
                                                         char *server);
Shishi_dns          shishi_resolv                       (const char *zone,
                                                         uint16_t querytype);
void                shishi_resolv_free                  (Shishi_dns rrs);
int                 shishi_safe                         (Shishi *handle,
                                                         Shishi_safe **safe);
int                 shishi_safe_build                   (Shishi_safe *safe,
                                                         Shishi_key *key);
int                 shishi_safe_cksum                   (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int32_t *cksumtype,
                                                         char **cksum,
                                                         size_t *cksumlen);
void                shishi_safe_done                    (Shishi_safe *safe);
int                 shishi_safe_from_file               (Shishi *handle,
                                                         Shishi_asn1 *safe,
                                                         int filetype,
                                                         const char *filename);
Shishi_key *        shishi_safe_key                     (Shishi_safe *safe);
void                shishi_safe_key_set                 (Shishi_safe *safe,
                                                         Shishi_key *key);
int                 shishi_safe_parse                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *safe);
int                 shishi_safe_print                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 safe);
int                 shishi_safe_read                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *safe);
Shishi_asn1         shishi_safe_safe                    (Shishi_safe *safe);
int                 shishi_safe_safe_der                (Shishi_safe *safe,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_safe_safe_der_set            (Shishi_safe *safe,
                                                         char *der,
                                                         size_t derlen);
void                shishi_safe_safe_set                (Shishi_safe *safe,
                                                         Shishi_asn1 asn1safe);
int                 shishi_safe_save                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 safe);
int                 shishi_safe_set_cksum               (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int32_t cksumtype,
                                                         const char *cksum,
                                                         size_t cksumlen);
int                 shishi_safe_set_user_data           (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         const char *userdata,
                                                         size_t userdatalen);
int                 shishi_safe_to_file                 (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int filetype,
                                                         const char *filename);
int                 shishi_safe_user_data               (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         char **userdata,
                                                         size_t *userdatalen);
int                 shishi_safe_verify                  (Shishi_safe *safe,
                                                         Shishi_key *key);
Shishi *            shishi_server                       (void);
char *              shishi_server_for_local_service     (Shishi *handle,
                                                         const char *service);
const char *        shishi_strerror                     (int err);
int                 shishi_string_to_key                (Shishi *handle,
                                                         int32_t keytype,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *salt,
                                                         size_t saltlen,
                                                         const char *parameter,
                                                         Shishi_key *outkey);
int                 shishi_tgs                          (Shishi *handle,
                                                         Shishi_tgs **tgs);
Shishi_ap *         shishi_tgs_ap                       (Shishi_tgs *tgs);
void                shishi_tgs_done                     (Shishi_tgs *tgs);
Shishi_asn1         shishi_tgs_krberror                 (Shishi_tgs *tgs);
int                 shishi_tgs_krberror_der             (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);
void                shishi_tgs_krberror_set             (Shishi_tgs *tgs,
                                                         Shishi_asn1 krberror);
int                 shishi_tgs_process                  (Shishi *handle,
                                                         Shishi_asn1 tgsreq,
                                                         Shishi_asn1 tgsrep,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 oldenckdcreppart,
                                                         Shishi_asn1 *enckdcreppart);
Shishi_asn1         shishi_tgs_rep                      (Shishi_tgs *tgs);
int                 shishi_tgs_rep_build                (Shishi_tgs *tgs,
                                                         int keyusage,
                                                         Shishi_key *key);
int                 shishi_tgs_rep_der                  (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_tgs_rep_process              (Shishi_tgs *tgs);
Shishi_asn1         shishi_tgs_req                      (Shishi_tgs *tgs);
int                 shishi_tgs_req_build                (Shishi_tgs *tgs);
int                 shishi_tgs_req_der                  (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);
int                 shishi_tgs_req_der_set              (Shishi_tgs *tgs,
                                                         char *der,
                                                         size_t derlen);
int                 shishi_tgs_req_process              (Shishi_tgs *tgs);
void                shishi_tgs_req_set                  (Shishi_tgs *tgs,
                                                         Shishi_asn1 tgsreq);
int                 shishi_tgs_sendrecv                 (Shishi_tgs *tgs);
int                 shishi_tgs_sendrecv_hint            (Shishi_tgs *tgs,
                                                         Shishi_tkts_hint *hint);
int                 shishi_tgs_set_realm                (Shishi_tgs *tgs,
                                                         const char *realm);
int                 shishi_tgs_set_realmserver          (Shishi_tgs *tgs,
                                                         const char *realm,
                                                         const char *server);
int                 shishi_tgs_set_server               (Shishi_tgs *tgs,
                                                         const char *server);
Shishi_tkt *        shishi_tgs_tgtkt                    (Shishi_tgs *tgs);
void                shishi_tgs_tgtkt_set                (Shishi_tgs *tgs,
                                                         Shishi_tkt *tgtkt);
Shishi_tkt *        shishi_tgs_tkt                      (Shishi_tgs *tgs);
void                shishi_tgs_tkt_set                  (Shishi_tgs *tgs,
                                                         Shishi_tkt *tkt);
Shishi_asn1         shishi_tgsrep                       (Shishi *handle);
Shishi_asn1         shishi_tgsreq                       (Shishi *handle);
Shishi_asn1         shishi_tgsreq_rst                   (Shishi *handle,
                                                         char *realm,
                                                         char *server,
                                                         Shishi_tkt *tkt);
Shishi_asn1         shishi_ticket                       (Shishi *handle);
int                 shishi_ticket_add_enc_part          (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_key *key,
                                                         Shishi_asn1 encticketpart);
int                 shishi_ticket_decrypt               (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_key *key,
                                                         Shishi_asn1 *encticketpart);
int                 shishi_ticket_get_enc_part_etype    (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         int32_t *etype);
int                 shishi_ticket_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *ticket);
int                 shishi_ticket_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 ticket);
int                 shishi_ticket_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *ticket);
int                 shishi_ticket_realm_get             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_ticket_realm_set             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *realm);
int                 shishi_ticket_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 ticket);
int                 shishi_ticket_server                (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         char **server,
                                                         size_t *serverlen);
int                 shishi_ticket_set_enc_part          (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);
int                 shishi_ticket_set_server            (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *server);
int                 shishi_ticket_sname_set             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_name_type name_type,
                                                         char *sname[]);
int                 shishi_ticket_srealmserver_set      (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *realm,
                                                         const char *server);
int                 shishi_time                         (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **t);
int                 shishi_tkt                          (Shishi *handle,
                                                         Shishi_tkt **tkt);
Shishi_tkt *        shishi_tkt2                         (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 kdcrep);
time_t              shishi_tkt_authctime                (Shishi_tkt *tkt);
int                 shishi_tkt_authtime                 (Shishi_tkt *tkt,
                                                         char **authtime,
                                                         size_t *authtimelen);
int                 shishi_tkt_build                    (Shishi_tkt *tkt,
                                                         Shishi_key *key);
int                 shishi_tkt_client                   (Shishi_tkt *tkt,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_tkt_client_p                 (Shishi_tkt *tkt,
                                                         const char *client);
int                 shishi_tkt_clientrealm              (Shishi_tkt *tkt,
                                                         char **client,
                                                         size_t *clientlen);
int                 shishi_tkt_clientrealm_p            (Shishi_tkt *tkt,
                                                         const char *client);
int                 shishi_tkt_clientrealm_set          (Shishi_tkt *tkt,
                                                         const char *realm,
                                                         const char *client);
int                 shishi_tkt_decrypt                  (Shishi_tkt *tkt,
                                                         Shishi_key *key);
void                shishi_tkt_done                     (Shishi_tkt *tkt);
Shishi_asn1         shishi_tkt_enckdcreppart            (Shishi_tkt *tkt);
void                shishi_tkt_enckdcreppart_set        (Shishi_tkt *tkt,
                                                         Shishi_asn1 enckdcreppart);
Shishi_asn1         shishi_tkt_encticketpart            (Shishi_tkt *tkt);
void                shishi_tkt_encticketpart_set        (Shishi_tkt *tkt,
                                                         Shishi_asn1 encticketpart);
time_t              shishi_tkt_endctime                 (Shishi_tkt *tkt);
int                 shishi_tkt_endtime                  (Shishi_tkt *tkt,
                                                         char **endtime,
                                                         size_t *endtimelen);
int                 shishi_tkt_expired_p                (Shishi_tkt *tkt);
int                 shishi_tkt_flags                    (Shishi_tkt *tkt,
                                                         uint32_t *flags);
int                 shishi_tkt_flags_add                (Shishi_tkt *tkt,
                                                         uint32_t flag);
int                 shishi_tkt_flags_set                (Shishi_tkt *tkt,
                                                         uint32_t flags);
int                 shishi_tkt_forwardable_p            (Shishi_tkt *tkt);
int                 shishi_tkt_forwarded_p              (Shishi_tkt *tkt);
int                 shishi_tkt_hw_authent_p             (Shishi_tkt *tkt);
int                 shishi_tkt_initial_p                (Shishi_tkt *tkt);
int                 shishi_tkt_invalid_p                (Shishi_tkt *tkt);
Shishi_asn1         shishi_tkt_kdcrep                   (Shishi_tkt *tkt);
Shishi_key *        shishi_tkt_key                      (Shishi_tkt *tkt);
int                 shishi_tkt_key_set                  (Shishi_tkt *tkt,
                                                         Shishi_key *key);
int                 shishi_tkt_keytype                  (Shishi_tkt *tkt,
                                                         int32_t *etype);
int32_t             shishi_tkt_keytype_fast             (Shishi_tkt *tkt);
int                 shishi_tkt_keytype_p                (Shishi_tkt *tkt,
                                                         int32_t etype);
int                 shishi_tkt_lastreq                  (Shishi_tkt *tkt,
                                                         char **lrtime,
                                                         size_t *lrtimelen,
                                                         int32_t lrtype);
void                shishi_tkt_lastreq_pretty_print     (Shishi_tkt *tkt,
                                                         FILE *fh);
time_t              shishi_tkt_lastreqc                 (Shishi_tkt *tkt,
                                                         Shishi_lrtype lrtype);
int                 shishi_tkt_match_p                  (Shishi_tkt *tkt,
                                                         Shishi_tkts_hint *hint);
int                 shishi_tkt_may_postdate_p           (Shishi_tkt *tkt);
int                 shishi_tkt_ok_as_delegate_p         (Shishi_tkt *tkt);
int                 shishi_tkt_postdated_p              (Shishi_tkt *tkt);
int                 shishi_tkt_pre_authent_p            (Shishi_tkt *tkt);
void                shishi_tkt_pretty_print             (Shishi_tkt *tkt,
                                                         FILE *fh);
int                 shishi_tkt_proxiable_p              (Shishi_tkt *tkt);
int                 shishi_tkt_proxy_p                  (Shishi_tkt *tkt);
int                 shishi_tkt_realm                    (Shishi_tkt *tkt,
                                                         char **realm,
                                                         size_t *realmlen);
int                 shishi_tkt_renew_till               (Shishi_tkt *tkt,
                                                         char **renewtilltime,
                                                         size_t *renewtilllen);
time_t              shishi_tkt_renew_tillc              (Shishi_tkt *tkt);
int                 shishi_tkt_renewable_p              (Shishi_tkt *tkt);
int                 shishi_tkt_server                   (Shishi_tkt *tkt,
                                                         char **server,
                                                         size_t *serverlen);
int                 shishi_tkt_server_p                 (Shishi_tkt *tkt,
                                                         const char *server);
int                 shishi_tkt_serverrealm_set          (Shishi_tkt *tkt,
                                                         const char *realm,
                                                         const char *server);
time_t              shishi_tkt_startctime               (Shishi_tkt *tkt);
int                 shishi_tkt_starttime                (Shishi_tkt *tkt,
                                                         char **starttime,
                                                         size_t *starttimelen);
Shishi_asn1         shishi_tkt_ticket                   (Shishi_tkt *tkt);
void                shishi_tkt_ticket_set               (Shishi_tkt *tkt,
                                                         Shishi_asn1 ticket);
int                 shishi_tkt_transited_policy_checked_p
                                                        (Shishi_tkt *tkt);
int                 shishi_tkt_valid_at_time_p          (Shishi_tkt *tkt,
                                                         time_t now);
int                 shishi_tkt_valid_now_p              (Shishi_tkt *tkt);
int                 shishi_tkts                         (Shishi *handle,
                                                         Shishi_tkts **tkts);
int                 shishi_tkts_add                     (Shishi_tkts *tkts,
                                                         Shishi_tkt *tkt);
int                 shishi_tkts_add_ccache_file         (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_tkts *tkts);
int                 shishi_tkts_add_ccache_mem          (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_tkts *tkts);
Shishi_tkts *       shishi_tkts_default                 (Shishi *handle);
const char *        shishi_tkts_default_ccache          (Shishi *handle);
char *              shishi_tkts_default_ccache_guess    (Shishi *handle);
void                shishi_tkts_default_ccache_set      (Shishi *handle,
                                                         const char *ccache);
const char *        shishi_tkts_default_file            (Shishi *handle);
char *              shishi_tkts_default_file_guess      (Shishi *handle);
void                shishi_tkts_default_file_set        (Shishi *handle,
                                                         const char *tktsfile);
int                 shishi_tkts_default_to_file         (Shishi_tkts *tkts);
void                shishi_tkts_done                    (Shishi_tkts **tkts);
int                 shishi_tkts_expire                  (Shishi_tkts *tkts);
Shishi_tkt *        shishi_tkts_find                    (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);
Shishi_tkt *        shishi_tkts_find_for_clientserver   (Shishi_tkts *tkts,
                                                         const char *client,
                                                         const char *server);
Shishi_tkt *        shishi_tkts_find_for_server         (Shishi_tkts *tkts,
                                                         const char *server);
int                 shishi_tkts_from_ccache_file        (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_tkts **outtkts);
int                 shishi_tkts_from_ccache_mem         (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_tkts **outtkts);
int                 shishi_tkts_from_file               (Shishi_tkts *tkts,
                                                         const char *filename);
Shishi_tkt *        shishi_tkts_get                     (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);
Shishi_tkt *        shishi_tkts_get_for_clientserver    (Shishi_tkts *tkts,
                                                         const char *client,
                                                         const char *server);
Shishi_tkt *        shishi_tkts_get_for_localservicepasswd
                                                        (Shishi_tkts *tkts,
                                                         const char *service,
                                                         const char *passwd);
Shishi_tkt *        shishi_tkts_get_for_server          (Shishi_tkts *tkts,
                                                         const char *server);
Shishi_tkt *        shishi_tkts_get_tgs                 (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint,
                                                         Shishi_tkt *tgt);
Shishi_tkt *        shishi_tkts_get_tgt                 (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);
int                 shishi_tkts_new                     (Shishi_tkts *tkts,
                                                         Shishi_asn1 ticket,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 kdcrep);
Shishi_tkt *        shishi_tkts_nth                     (Shishi_tkts *tkts,
                                                         int ticketno);
int                 shishi_tkts_print                   (Shishi_tkts *tkts,
                                                         FILE *fh);
int                 shishi_tkts_print_for_service       (Shishi_tkts *tkts,
                                                         FILE *fh,
                                                         const char *service);
int                 shishi_tkts_read                    (Shishi_tkts *tkts,
                                                         FILE *fh);
int                 shishi_tkts_remove                  (Shishi_tkts *tkts,
                                                         int ticketno);
int                 shishi_tkts_size                    (Shishi_tkts *tkts);
int                 shishi_tkts_to_file                 (Shishi_tkts *tkts,
                                                         const char *filename);
int                 shishi_tkts_write                   (Shishi_tkts *tkts,
                                                         FILE *fh);
void                shishi_verbose                      (Shishi *handle,
                                                         const char *format,
                                                         ...);
int                 shishi_verify                       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int cksumtype,
                                                         const char *in,
                                                         size_t inlen,
                                                         const char *cksum,
                                                         size_t cksumlen);
void                shishi_warn                         (Shishi *handle,
                                                         const char *format,
                                                         ...);
const char *        shishi_x509ca_default_file          (Shishi *handle);
char *              shishi_x509ca_default_file_guess    (Shishi *handle);
void                shishi_x509ca_default_file_set      (Shishi *handle,
                                                         const char *x509cafile);
const char *        shishi_x509cert_default_file        (Shishi *handle);
char *              shishi_x509cert_default_file_guess  (Shishi *handle);
void                shishi_x509cert_default_file_set    (Shishi *handle,
                                                         const char *x509certfile);
const char *        shishi_x509key_default_file         (Shishi *handle);
char *              shishi_x509key_default_file_guess   (Shishi *handle);
void                shishi_x509key_default_file_set     (Shishi *handle,
                                                         const char *x509keyfile);
void                shishi_xalloc_die                   (void);

Description

Details

SHISHI_DNS_IN

#define SHISHI_DNS_IN 1


SHISHI_DNS_SRV

#define SHISHI_DNS_SRV 33


SHISHI_DNS_TXT

#define SHISHI_DNS_TXT 16


SHISHI_GENERALIZEDTIMEZ_LENGTH

#define SHISHI_GENERALIZEDTIMEZ_LENGTH (SHISHI_GENERALIZEDTIME_LENGTH + 1)


SHISHI_GENERALIZEDTIME_LENGTH

#define SHISHI_GENERALIZEDTIME_LENGTH 15


SHISHI_VERSION

#define SHISHI_VERSION "1.0.2"


Shishi

  typedef struct Shishi Shishi;


enum Shishi_KDCOptions

typedef enum {
    SHISHI_KDCOPTIONS_RESERVED = 0x1, /* bit 0 */
    SHISHI_KDCOPTIONS_FORWARDABLE = 0x2, /* bit 1 */
    SHISHI_KDCOPTIONS_FORWARDED = 0x4, /* bit 2 */
    SHISHI_KDCOPTIONS_PROXIABLE = 0x8, /* bit 3 */
    SHISHI_KDCOPTIONS_PROXY = 0x10, /* bit 4 */
    SHISHI_KDCOPTIONS_ALLOW_POSTDATE = 0x20, /* bit 5 */
    SHISHI_KDCOPTIONS_POSTDATED = 0x40, /* bit 6 */
    SHISHI_KDCOPTIONS_UNUSED7 = 0x80, /* bit 7 */
    SHISHI_KDCOPTIONS_RENEWABLE = 0x100, /* bit 8 */
    SHISHI_KDCOPTIONS_UNUSED9 = 0x200, /* bit 9 */
    SHISHI_KDCOPTIONS_UNUSED10 = 0x400, /* bit 10 */
    SHISHI_KDCOPTIONS_UNUSED11 = 0x800 /* bit 11 */
#define SHISHI_KDCOPTIONS_DISABLE_TRANSITED_CHECK 0x4000000 /* bit 26 */
#define SHISHI_KDCOPTIONS_RENEWABLE_OK		  0x8000000 /* bit 27 */
#define SHISHI_KDCOPTIONS_ENC_TKT_IN_SKEY	  0x10000000 /* bit 28 */
#define SHISHI_KDCOPTIONS_RENEW			  0x40000000 /* bit 30 */
#define SHISHI_KDCOPTIONS_VALIDATE		  0x80000000 /* bit 31 */
} Shishi_KDCOptions;


Shishi_ap

  typedef struct Shishi_ap Shishi_ap;


enum Shishi_apoptions

typedef enum {
    SHISHI_APOPTIONS_RESERVED = 0x1, /* bit 0 */
    SHISHI_APOPTIONS_USE_SESSION_KEY = 0x2, /* bit 1 */
    SHISHI_APOPTIONS_MUTUAL_REQUIRED = 0x4 /* bit 2 */
} Shishi_apoptions;


Shishi_as

  typedef struct Shishi_as Shishi_as;


Shishi_asn1

  typedef ASN1_TYPE Shishi_asn1;


enum Shishi_authorization

typedef enum {
    SHISHI_AUTHORIZATION_BASIC = 0,
    SHISHI_AUTHORIZATION_K5LOGIN
} Shishi_authorization;


enum Shishi_cksumtype

typedef enum {
    SHISHI_CRC32 = 1,
    SHISHI_RSA_MD4 = 2,
    SHISHI_RSA_MD4_DES = 3,
    SHISHI_DES_MAC = 4,
    SHISHI_DES_MAC_K = 5,
    SHISHI_RSA_MD4_DES_K = 6,
    SHISHI_RSA_MD5 = 7,
    SHISHI_RSA_MD5_DES = 8,
    SHISHI_RSA_MD5_DES_GSS = 9, /* XXX */
    SHISHI_HMAC_SHA1_DES3_KD = 12,
    SHISHI_HMAC_SHA1_96_AES128 = 15,
    SHISHI_HMAC_SHA1_96_AES256 = 16,
    SHISHI_ARCFOUR_HMAC_MD5 = -138,
    SHISHI_KRB5_GSSAPI_CKSUM = 8003,
    SHISHI_NO_CKSUMTYPE = -1
} Shishi_cksumtype;


Shishi_crypto

  typedef struct Shishi_crypto Shishi_crypto;


Shishi_dns

  typedef struct Shishi_dns_st *Shishi_dns;


Shishi_dns_srv

  typedef struct Shishi_dns_srv_st *Shishi_dns_srv;


enum Shishi_etype

typedef enum {
    SHISHI_NULL = 0,
    SHISHI_DES_CBC_CRC = 1,
    SHISHI_DES_CBC_MD4 = 2,
    SHISHI_DES_CBC_MD5 = 3,
    SHISHI_DES_CBC_NONE = 4,
    SHISHI_DES3_CBC_NONE = 6,
    SHISHI_DES3_CBC_HMAC_SHA1_KD = 16,
    SHISHI_AES128_CTS_HMAC_SHA1_96 = 17,
    SHISHI_AES256_CTS_HMAC_SHA1_96 = 18,
    SHISHI_ARCFOUR_HMAC = 23,
    SHISHI_ARCFOUR_HMAC_EXP = 24
} Shishi_etype;


enum Shishi_filetype

typedef enum {
    SHISHI_FILETYPE_TEXT = 0,
    SHISHI_FILETYPE_DER,
    SHISHI_FILETYPE_HEX,
    SHISHI_FILETYPE_BASE64,
    SHISHI_FILETYPE_BINARY
} Shishi_filetype;


Shishi_key

  typedef struct Shishi_key Shishi_key;


Shishi_keys

  typedef struct Shishi_keys Shishi_keys;


enum Shishi_keyusage

typedef enum {
    /* 1. AS-REQ PA-ENC-TIMESTAMP padata timestamp, encrypted with the
       client key */
    SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP = 1,
    /* 2. AS-REP Ticket and TGS-REP Ticket (includes TGS session key or
       application session key), encrypted with the service key  */
    SHISHI_KEYUSAGE_ENCTICKETPART = 2,
    /* 3. AS-REP encrypted part (includes TGS session key or application
       session key), encrypted with the client key */
    SHISHI_KEYUSAGE_ENCASREPPART = 3,
    /* 4. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the TGS
       session key  */
    SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_SESSION_KEY = 4,
    /* 5. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the TGS
       authenticator subkey (section 5.4.1) */
    SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_AUTHENTICATOR_KEY = 5,
    /* 6. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator cksum, keyed with the
       TGS session key  */
    SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR_CKSUM = 6,
    /* 7. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator (includes TGS
       authenticator subkey), encrypted with the TGS session key */
    SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR = 7,
    /* 8. TGS-REP encrypted part (includes application session key), encrypted
       with the TGS session key */
    SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY = 8,
    /* 9. TGS-REP encrypted part (includes application session key), encrypted
       with the TGS authenticator subkey */
    SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY = 9,
    /* 10. AP-REQ Authenticator cksum, keyed with the application
       session key */
    SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR_CKSUM = 10,
    /* 11. AP-REQ Authenticator (includes application authenticator subkey),
       encrypted with the application session key */
    SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR = 11,
    /* 12. AP-REP encrypted part (includes application session subkey),
       encrypted with the application session key */
    SHISHI_KEYUSAGE_ENCAPREPPART = 12,
    /* 13. KRB-PRIV encrypted part, encrypted with a key chosen by the
       application */
    SHISHI_KEYUSAGE_KRB_PRIV = 13,
    /* 14. KRB-CRED encrypted part, encrypted with a key chosen by the
       application */
    SHISHI_KEYUSAGE_KRB_CRED = 14,
    /* 15. KRB-SAFE cksum, keyed with a key chosen by the application */
    SHISHI_KEYUSAGE_KRB_SAFE = 15,
    /* 18. KRB-ERROR checksum (e-cksum) */
    SHISHI_KEYUSAGE_KRB_ERROR = 18,
    /* 19. AD-KDCIssued checksum (ad-checksum) */
    SHISHI_KEYUSAGE_AD_KDCISSUED = 19,
    /* 20. Checksum for Mandatory Ticket Extensions */
    SHISHI_KEYUSAGE_TICKET_EXTENSION = 20,
    /* 21. Checksum in Authorization Data in Ticket Extensions */
    SHISHI_KEYUSAGE_TICKET_EXTENSION_AUTHORIZATION = 21,
    /* 22-24. Reserved for use in GSSAPI mechanisms derived from RFC 1964.
       (raeburn/MIT) */
    SHISHI_KEYUSAGE_GSS_R1 = 22,
    SHISHI_KEYUSAGE_GSS_R2 = 23,
    SHISHI_KEYUSAGE_GSS_R3 = 24,
    /* draft-ietf-krb-wg-gssapi-cfx */
    SHISHI_KEYUSAGE_ACCEPTOR_SEAL = 22,
    SHISHI_KEYUSAGE_ACCEPTOR_SIGN = 23,
    SHISHI_KEYUSAGE_INITIATOR_SEAL = 24,
    SHISHI_KEYUSAGE_INITIATOR_SIGN = 25,
    /* 16-18,20-21,25-511. Reserved for future use. */
    /* 512-1023.  Reserved for uses internal implementations. */
    /* 1024.         Encryption for application use in protocols that
       do not specify key usage values */
    /* 1025.         Checksums for application use in protocols that
       do not specify key usage values */
    /* 1026-2047.      Reserved for application use.
       1026,1028,1030,1032,1034 used in KCMD protocol */
    SHISHI_KEYUSAGE_KCMD_DES = 1026,
    SHISHI_KEYUSAGE_KCMD_INPUT = 1028,
    SHISHI_KEYUSAGE_KCMD_OUTPUT = 1030,
    SHISHI_KEYUSAGE_KCMD_STDERR_INPUT = 1032,
    SHISHI_KEYUSAGE_KCMD_STDERR_OUTPUT = 1034
} Shishi_keyusage;


enum Shishi_krb_error

typedef enum {
    /* No error */
    SHISHI_KDC_ERR_NONE = 0,
    /* Client's entry in database has expired */
    SHISHI_KDC_ERR_NAME_EXP = 1,
    /* Server's entry in database has expired */
    SHISHI_KDC_ERR_SERVICE_EXP = 2,
    /* Requested protocol version number  - not supported */
    SHISHI_KDC_ERR_BAD_PVNO = 3,
    /* Client's key encrypted in old master key */
    SHISHI_KDC_ERR_C_OLD_MAST_KVNO = 4,
    /* Server's key encrypted in old master key */
    SHISHI_KDC_ERR_S_OLD_MAST_KVNO = 5,
    /* Client not found in database */
    SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN = 6,
    /* Server not found in database */
    SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN = 7,
    /* Multiple principal entries in database */
    SHISHI_KDC_ERR_PRINCIPAL_NOT_UNIQUE = 8,
    /* The client or server has a null key */
    SHISHI_KDC_ERR_NULL_KEY = 9,
    /* Ticket not eligible for postdating */
    SHISHI_KDC_ERR_CANNOT_POSTDATE = 10,
    /* Requested start time is later than end time */
    SHISHI_KDC_ERR_NEVER_VALID = 11,
    /* KDC policy rejects request */
    SHISHI_KDC_ERR_POLICY = 12,
    /* KDC cannot accommodate requested option */
    SHISHI_KDC_ERR_BADOPTION = 13,
    /* KDC has no support for encryption type */
    SHISHI_KDC_ERR_ETYPE_NOSUPP = 14,
    /* KDC has no support for checksum type */
    SHISHI_KDC_ERR_SUMTYPE_NOSUPP = 15,
    /* KDC has no support for padata type */
    SHISHI_KDC_ERR_PADATA_TYPE_NOSUPP = 16,
    /* KDC has no support for transited type */
    SHISHI_KDC_ERR_TRTYPE_NOSUPP = 17,
    /* Clients credentials have been revoked */
    SHISHI_KDC_ERR_CLIENT_REVOKED = 18,
    /* Credentials for server have been revoked */
    SHISHI_KDC_ERR_SERVICE_REVOKED = 19,
    /* TGT has been revoked */
    SHISHI_KDC_ERR_TGT_REVOKED = 20,
    /* Client not yet valid - try again later */
    SHISHI_KDC_ERR_CLIENT_NOTYET = 21,
    /* Server not yet valid - try again later */
    SHISHI_KDC_ERR_SERVICE_NOTYET = 22,
    /* Password has expired - change password to reset */
    SHISHI_KDC_ERR_KEY_EXPIRED = 23,
    /* Pre-authentication information was invalid */
    SHISHI_KDC_ERR_PREAUTH_FAILED = 24,
    /* Additional pre-authenticationrequired */
    SHISHI_KDC_ERR_PREAUTH_REQUIRED = 25,
    /* Requested server and ticket don't match */
    SHISHI_KDC_ERR_SERVER_NOMATCH = 26,
    /* Server principal valid for user = 2,user only */
    SHISHI_KDC_ERR_MUST_USE_USER2USER = 27,
    /* KDC Policy rejects transited path */
    SHISHI_KDC_ERR_PATH_NOT_ACCPETED = 28,
    /* A service is not available */
    SHISHI_KDC_ERR_SVC_UNAVAILABLE = 29,
    /* Integrity check on decrypted field failed */
    SHISHI_KRB_AP_ERR_BAD_INTEGRITY = 31,
    /* Ticket expired */
    SHISHI_KRB_AP_ERR_TKT_EXPIRED = 32,
    /* Ticket not yet valid */
    SHISHI_KRB_AP_ERR_TKT_NYV = 33,
    /* Request is a replay */
    SHISHI_KRB_AP_ERR_REPEAT = 34,
    /* The ticket isn't for us */
    SHISHI_KRB_AP_ERR_NOT_US = 35,
    /* Ticket and authenticator don't match */
    SHISHI_KRB_AP_ERR_BADMATCH = 36,
    /* Clock skew too great */
    SHISHI_KRB_AP_ERR_SKEW = 37,
    /* Incorrect net address */
    SHISHI_KRB_AP_ERR_BADADDR = 38,
    /* Protocol version mismatch */
    SHISHI_KRB_AP_ERR_BADVERSION = 39,
    /* Invalid msg type */
    SHISHI_KRB_AP_ERR_MSG_TYPE = 40,
    /* Message stream modified */
    SHISHI_KRB_AP_ERR_MODIFIED = 41,
    /* Message out of order */
    SHISHI_KRB_AP_ERR_BADORDER = 42,
    /* Specified version of key is not available */
    SHISHI_KRB_AP_ERR_BADKEYVER = 44,
    /* Service key not available */
    SHISHI_KRB_AP_ERR_NOKEY = 45,
    /* Mutual authentication failed */
    SHISHI_KRB_AP_ERR_MUT_FAIL = 46,
    /* Incorrect message direction */
    SHISHI_KRB_AP_ERR_BADDIRECTION = 47,
    /* Alternative authentication method required */
    SHISHI_KRB_AP_ERR_METHOD = 48,
    /* Incorrect sequence number in message */
    SHISHI_KRB_AP_ERR_BADSEQ = 49,
    /* Inappropriate type of checksum in message */
    SHISHI_KRB_AP_ERR_INAPP_CKSUM = 50,
    /* Policy rejects transited path */
    SHISHI_KRB_AP_PATH_NOT_ACCEPTED = 51,
    /* Response too big for UDP, retry with TCP */
    SHISHI_KRB_ERR_RESPONSE_TOO_BIG = 52,
    /* Generic error (description in e-text) */
    SHISHI_KRB_ERR_GENERIC = 60,
    /* Field is too long for this implementation */
    SHISHI_KRB_ERR_FIELD_TOOLONG = 61,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERROR_CLIENT_NOT_TRUSTED = 62,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERROR_KDC_NOT_TRUSTED = 63,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERROR_INVALID_SIG = 64,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_KEY_TOO_WEAK = 65,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_CERTIFICATE_MISMATCH = 66,
    /* No TGT available to validate USER-TO-USER */
    SHISHI_KRB_AP_ERR_NO_TGT = 67,
    /* USER-TO-USER TGT issued different KDC */
    SHISHI_KDC_ERR_WRONG_REALM = 68,
    /* Ticket must be for USER-TO-USER */
    SHISHI_KRB_AP_ERR_USER_TO_USER_REQUIRED = 69,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_CANT_VERIFY_CERTIFICATE = 70,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_INVALID_CERTIFICATE = 71,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_REVOKED_CERTIFICATE = 72,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_REVOCATION_STATUS_UNKNOWN = 73,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_REVOCATION_STATUS_UNAVAILABLE = 74,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_CLIENT_NAME_MISMATCH = 75,
    /* Reserved for PKINIT */
    SHISHI_KDC_ERR_KDC_NAME_MISMATCH = 76,
    SHISHI_LAST_ERROR_CODE = 76
} Shishi_krb_error;


enum Shishi_lrtype

typedef enum {
    SHISHI_LRTYPE_LAST_INITIAL_TGT_REQUEST = 1,
    SHISHI_LRTYPE_LAST_INITIAL_REQUEST = 2,
    SHISHI_LRTYPE_NEWEST_TGT_ISSUE = 3,
    SHISHI_LRTYPE_LAST_RENEWAL = 4,
    SHISHI_LRTYPE_LAST_REQUEST = 5
} Shishi_lrtype;


enum Shishi_msgtype

typedef enum {
    /* 0                             unused */
    /* 1              Ticket         PDU */
    /* 2              Authenticator  non-PDU */
    /* 3              EncTicketPart  non-PDU */
    /* 4-9                           unused */
    /* Request for initial authentication */
    SHISHI_MSGTYPE_AS_REQ = 10,
    /* Response to SHISHI_MSGTYPE_AS_REQ request */
    SHISHI_MSGTYPE_AS_REP = 11,
    /* Request for authentication based on TGT */
    SHISHI_MSGTYPE_TGS_REQ = 12,
    /* Response to SHISHI_MSGTYPE_TGS_REQ request */
    SHISHI_MSGTYPE_TGS_REP = 13,
    /* application request to server */
    SHISHI_MSGTYPE_AP_REQ = 14,
    /* Response to SHISHI_MSGTYPE_AP_REQ_MUTUAL */
    SHISHI_MSGTYPE_AP_REP = 15,
    /* Reserved for user-to-user krb_tgt_request */
    SHISHI_MSGTYPE_RESERVED16 = 16,
    /* Reserved for user-to-user krb_tgt_reply */
    SHISHI_MSGTYPE_RESERVED17 = 17,
    /* 18-19                         unused */
    /* Safe (checksummed) application message */
    SHISHI_MSGTYPE_SAFE = 20,
    /* Private (encrypted) application message */
    SHISHI_MSGTYPE_PRIV = 21,
    /* Private (encrypted) message to forward credentials */
    SHISHI_MSGTYPE_CRED = 22,
    /* 23-24                         unused */
    /* 25             EncASRepPart   non-PDU */
    /* 26             EncTGSRepPart  non-PDU */
    /* 27             EncApRepPart   non-PDU */
    /* 28             EncKrbPrivPart non-PDU */
    /* 29             EncKrbCredPart non-PDU */
    /* Error response */
    SHISHI_MSGTYPE_ERROR = 30
} Shishi_msgtype;


enum Shishi_name_type

typedef enum {
    /* Name type not known */
    SHISHI_NT_UNKNOWN = 0,
    /* Just the name of the principal as in DCE, or for users */
    SHISHI_NT_PRINCIPAL = 1,
    /* Service and other unique instance (krbtgt) */
    SHISHI_NT_SRV_INST = 2,
    /* Service with host name as instance (telnet, rcommands) */
    SHISHI_NT_SRV_HST = 3,
    /* Service with host as remaining components */
    SHISHI_NT_SRV_XHST = 4,
    /* Unique ID */
    SHISHI_NT_UID = 5,
    /* Encoded X.509 Distingished name [RFC 2253] */
    SHISHI_NT_X500_PRINCIPAL = 6,
    /* Name in form of SMTP email name (e.g. user@foo.com) */
    SHISHI_NT_SMTP_NAME = 7,
    /*  Enterprise name - may be mapped to principal name */
    SHISHI_NT_ENTERPRISE = 10
} Shishi_name_type;


enum Shishi_outputtype

typedef enum {
    SHISHI_OUTPUTTYPE_NULL = 0,
    SHISHI_OUTPUTTYPE_STDERR,
    SHISHI_OUTPUTTYPE_SYSLOG
} Shishi_outputtype;


enum Shishi_padata_type

typedef enum {
    SHISHI_PA_TGS_REQ = 1,
    SHISHI_PA_ENC_TIMESTAMP = 2,
    SHISHI_PA_PW_SALT = 3,
    SHISHI_PA_RESERVED = 4,
    SHISHI_PA_ENC_UNIX_TIME = 5, /* (deprecated) */
    SHISHI_PA_SANDIA_SECUREID = 6,
    SHISHI_PA_SESAME = 7,
    SHISHI_PA_OSF_DCE = 8,
    SHISHI_PA_CYBERSAFE_SECUREID = 9,
    SHISHI_PA_AFS3_SALT = 10,
    SHISHI_PA_ETYPE_INFO = 11,
    SHISHI_PA_SAM_CHALLENGE = 12, /* (sam/otp) */
    SHISHI_PA_SAM_RESPONSE = 13, /* (sam/otp) */
    SHISHI_PA_PK_AS_REQ = 14, /* (pkinit) */
    SHISHI_PA_PK_AS_REP = 15, /* (pkinit) */
    SHISHI_PA_ETYPE_INFO2 = 19, /* (replaces pa_etype_info) */
    SHISHI_PA_USE_SPECIFIED_KVNO = 20,
    SHISHI_PA_SAM_REDIRECT = 21, /* (sam/otp) */
    SHISHI_PA_GET_FROM_TYPED_DATA = 22, /* (embedded in typed data) */
    SHISHI_TD_PADATA = 22, /* (embeds padata) */
    SHISHI_PA_SAM_ETYPE_INFO = 23, /* (sam/otp) */
    SHISHI_PA_ALT_PRINC = 24, /* (crawdad@fnal.gov) */
    SHISHI_PA_SAM_CHALLENGE2 = 30, /* (kenh@pobox.com) */
    SHISHI_PA_SAM_RESPONSE2 = 31, /* (kenh@pobox.com) */
    SHISHI_PA_EXTRA_TGT = 41, /* Reserved extra TGT */
    SHISHI_TD_PKINIT_CMS_CERTIFICATES = 101, /* CertificateSet from CMS */
    SHISHI_TD_KRB_PRINCIPAL = 102, /* PrincipalName */
    SHISHI_TD_KRB_REALM = 103, /* Realm */
    SHISHI_TD_TRUSTED_CERTIFIERS = 104, /* from PKINIT */
    SHISHI_TD_CERTIFICATE_INDEX = 105, /* from PKINIT */
    SHISHI_TD_APP_DEFINED_ERROR = 106, /* application specific */
    SHISHI_TD_REQ_NONCE = 107, /* INTEGER */
    SHISHI_TD_REQ_SEQ = 108, /* INTEGER */
    SHISHI_PA_PAC_REQUEST = 128 /* (jbrezak@exchange.microsoft.com) */
} Shishi_padata_type;


Shishi_priv

  typedef struct Shishi_priv Shishi_priv;


enum Shishi_rc

typedef enum {
    SHISHI_OK = 0,
    SHISHI_ASN1_ERROR = 1,
    SHISHI_FOPEN_ERROR = 2,
    SHISHI_IO_ERROR = 3,
    SHISHI_MALLOC_ERROR = 4,
    SHISHI_BASE64_ERROR = 5,
    SHISHI_REALM_MISMATCH = 6,
    SHISHI_CNAME_MISMATCH = 7,
    SHISHI_NONCE_MISMATCH = 8,
    SHISHI_TGSREP_BAD_KEYTYPE = 9,
    SHISHI_KDCREP_BAD_KEYTYPE = 10,
    SHISHI_APREP_BAD_KEYTYPE = 11,
    SHISHI_APREP_VERIFY_FAILED = 12,
    SHISHI_APREQ_BAD_KEYTYPE = 13,
    SHISHI_TOO_SMALL_BUFFER = 14,
    SHISHI_DERIVEDKEY_TOO_SMALL = 15,
    SHISHI_KEY_TOO_LARGE = 16,
    SHISHI_CRYPTO_ERROR = 17,
    SHISHI_CRYPTO_INTERNAL_ERROR = 18,
    SHISHI_SOCKET_ERROR = 19,
    SHISHI_BIND_ERROR = 20,
    SHISHI_SENDTO_ERROR = 21,
    SHISHI_RECVFROM_ERROR = 22,
    SHISHI_CLOSE_ERROR = 23,
    SHISHI_KDC_TIMEOUT = 24,
    SHISHI_KDC_NOT_KNOWN_FOR_REALM = 25,
    SHISHI_TTY_ERROR = 26,
    SHISHI_GOT_KRBERROR = 27,
    SHISHI_HANDLE_ERROR = 28,
    SHISHI_INVALID_TKTS = 29,
    SHISHI_TICKET_BAD_KEYTYPE = 30,
    SHISHI_INVALID_KEY = 31,
    SHISHI_APREQ_DECRYPT_FAILED = 32,
    SHISHI_TICKET_DECRYPT_FAILED = 33,
    SHISHI_INVALID_TICKET = 34,
    SHISHI_OUT_OF_RANGE = 35,
    SHISHI_ASN1_NO_ELEMENT = 36,
    SHISHI_SAFE_BAD_KEYTYPE = 37,
    SHISHI_SAFE_VERIFY_FAILED = 38,
    SHISHI_PKCS5_INVALID_PRF = 39,
    SHISHI_PKCS5_INVALID_ITERATION_COUNT = 40,
    SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH = 41,
    SHISHI_PKCS5_DERIVED_KEY_TOO_LONG = 42,
    SHISHI_INVALID_PRINCIPAL_NAME = 43,
    SHISHI_INVALID_ARGUMENT = 44,
    SHISHI_ASN1_NO_VALUE = 45,
    SHISHI_CONNECT_ERROR = 46,
    SHISHI_VERIFY_FAILED = 47,
    SHISHI_PRIV_BAD_KEYTYPE = 48,
    SHISHI_FILE_ERROR = 49,
    SHISHI_ENCAPREPPART_BAD_KEYTYPE = 50,
    SHISHI_GETTIMEOFDAY_ERROR = 51,
    SHISHI_KEYTAB_ERROR = 52,
    SHISHI_CCACHE_ERROR = 53,
    SHISHI_LAST_ERROR = 53
} Shishi_rc;


Shishi_safe

  typedef struct Shishi_safe Shishi_safe;


Shishi_tgs

  typedef struct Shishi_tgs Shishi_tgs;


enum Shishi_ticketflags

typedef enum {
    SHISHI_TICKETFLAGS_RESERVED = 0x1, /* bit 0 */
    SHISHI_TICKETFLAGS_FORWARDABLE = 0x2, /* bit 1 */
    SHISHI_TICKETFLAGS_FORWARDED = 0x4, /* bit 2 */
    SHISHI_TICKETFLAGS_PROXIABLE = 0x8, /* bit 3 */
    SHISHI_TICKETFLAGS_PROXY = 0x10, /* bit 4 */
    SHISHI_TICKETFLAGS_MAY_POSTDATE = 0x20, /* bit 5 */
    SHISHI_TICKETFLAGS_POSTDATED = 0x40, /* bit 6 */
    SHISHI_TICKETFLAGS_INVALID = 0x80, /* bit 7 */
    SHISHI_TICKETFLAGS_RENEWABLE = 0x100, /* bit 8 */
    SHISHI_TICKETFLAGS_INITIAL = 0x200, /* bit 9 */
    SHISHI_TICKETFLAGS_PRE_AUTHENT = 0x400, /* bit 10 */
    SHISHI_TICKETFLAGS_HW_AUTHENT = 0x800, /* bit 11 */
    SHISHI_TICKETFLAGS_TRANSITED_POLICY_CHECKED = 0x1000, /* bit 12 */
    SHISHI_TICKETFLAGS_OK_AS_DELEGATE = 0x2000 /* bit 13 */
} Shishi_ticketflags;


Shishi_tkt

  typedef struct Shishi_tkt Shishi_tkt;


Shishi_tkts

  typedef struct Shishi_tkts Shishi_tkts;


Shishi_tkts_hint

  typedef struct Shishi_tkts_hint Shishi_tkts_hint;


enum Shishi_tkts_hintflags

typedef enum {
    SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED = 1,
    SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE = 2
} Shishi_tkts_hintflags;


enum Shishi_tr_type

typedef enum {
    SHISHI_TR_DOMAIN_X500_COMPRESS = 1
} Shishi_tr_type;


shishi ()

Shishi *            shishi                              (void);

Initializes the Shishi library, and set up, using shishi_error_set_outputtype(), the library so that future warnings and informational messages are printed to stderr. If this function fails, it may print diagnostic errors to stderr.

Returns :

Returns Shishi library handle, or NULL on error.

shishi_3des ()

int                 shishi_3des                         (Shishi *handle,
                                                         int decryptp,
                                                         const char key[24],
                                                         const char iv[8],
                                                         char *ivout[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);

Encrypt or decrypt data (depending on decryptp) using 3DES in CBC mode. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

decryptp :

0 to indicate encryption, non-0 to indicate decryption.

key :

input character array with key to use.

iv :

input character array with initialization vector to use, or NULL.

ivout :

output character array with updated initialization vector, or NULL.

in :

input character array of data to encrypt/decrypt.

inlen :

length of input character array of data to encrypt/decrypt.

out :

newly allocated character array with encrypted/decrypted data.

Returns :

Returns SHISHI_OK iff successful.

shishi_aes_cts ()

int                 shishi_aes_cts                      (Shishi *handle,
                                                         int decryptp,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char iv[16],
                                                         char *ivout[16],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);

Encrypt or decrypt data (depending on decryptp) using AES in CBC-CTS mode. The length of the key, keylen, decide if AES 128 or AES 256 should be used. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

decryptp :

0 to indicate encryption, non-0 to indicate decryption.

key :

input character array with key to use.

keylen :

length of input character array with key to use.

iv :

input character array with initialization vector to use, or NULL.

ivout :

output character array with updated initialization vector, or NULL.

in :

input character array of data to encrypt/decrypt.

inlen :

length of input character array of data to encrypt/decrypt.

out :

newly allocated character array with encrypted/decrypted data.

Returns :

Returns SHISHI_OK iff successful.

shishi_alloc_fail_function ()

void                (*shishi_alloc_fail_function)       (void);


shishi_ap ()

int                 shishi_ap                           (Shishi *handle,
                                                         Shishi_ap **ap);

Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use shishi_ap_etype() or shishi_ap_nosubkey() instead. In the future, this function will likely behave as shishi_ap_nosubkey() and shishi_ap_nosubkey() will be removed.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_authenticator ()

Shishi_asn1         shishi_ap_authenticator             (Shishi_ap *ap);

Get ASN.1 Authenticator structure from AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured.

shishi_ap_authenticator_cksumdata ()

int                 shishi_ap_authenticator_cksumdata   (Shishi_ap *ap,
                                                         char *out,
                                                         size_t *len);

Get checksum data from Authenticator.

ap :

structure that holds information about AP exchange

out :

output array that holds authenticator checksum data.

len :

on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data.

Returns :

Returns SHISHI_OK if successful, or SHISHI_TOO_SMALL_BUFFER if buffer provided was too small (then len will hold necessary buffer size).

shishi_ap_authenticator_cksumdata_set ()

void                shishi_ap_authenticator_cksumdata_set
                                                        (Shishi_ap *ap,
                                                         const char *authenticatorcksumdata,
                                                         size_t authenticatorcksumdatalen);

Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set.

ap :

structure that holds information about AP exchange

authenticatorcksumdata :

input array with data to compute checksum on and store in Authenticator in AP-REQ.

authenticatorcksumdatalen :

length of input array with data to compute checksum on and store in Authenticator in AP-REQ.

shishi_ap_authenticator_cksumraw_set ()

void                shishi_ap_authenticator_cksumraw_set
                                                        (Shishi_ap *ap,
                                                         int32_t authenticatorcksumtype,
                                                         const char *authenticatorcksumraw,
                                                         size_t authenticatorcksumrawlen);

Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set.

ap :

structure that holds information about AP exchange

authenticatorcksumtype :

authenticator checksum type to set in AP.

authenticatorcksumraw :

input array with authenticator checksum field value to set in Authenticator in AP-REQ.

authenticatorcksumrawlen :

length of input array with authenticator checksum field value to set in Authenticator in AP-REQ.

shishi_ap_authenticator_cksumtype ()

int32_t             shishi_ap_authenticator_cksumtype   (Shishi_ap *ap);

Get the Authenticator Checksum Type in the AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Return the authenticator checksum type.

shishi_ap_authenticator_cksumtype_set ()

void                shishi_ap_authenticator_cksumtype_set
                                                        (Shishi_ap *ap,
                                                         int32_t cksumtype);

Set the Authenticator Checksum Type in the AP exchange.

ap :

structure that holds information about AP exchange

cksumtype :

authenticator checksum type to set in AP.

shishi_ap_authenticator_set ()

void                shishi_ap_authenticator_set         (Shishi_ap *ap,
                                                         Shishi_asn1 authenticator);

Set the Authenticator in the AP exchange.

ap :

structure that holds information about AP exchange

authenticator :

authenticator to store in AP.

shishi_ap_done ()

void                shishi_ap_done                      (Shishi_ap *ap);

Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle.

ap :

structure that holds information about AP exchange

shishi_ap_encapreppart ()

Shishi_asn1         shishi_ap_encapreppart              (Shishi_ap *ap);

Get ASN.1 EncAPRepPart structure from AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured.

shishi_ap_encapreppart_set ()

void                shishi_ap_encapreppart_set          (Shishi_ap *ap,
                                                         Shishi_asn1 encapreppart);

Set the EncAPRepPart in the AP exchange.

ap :

structure that holds information about AP exchange

encapreppart :

EncAPRepPart to store in AP.

shishi_ap_etype ()

int                 shishi_ap_etype                     (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         int etype);

Create a new AP exchange with a random subkey of indicated encryption type.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

etype :

encryption type of newly generated random subkey.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_etype_tktoptionsdata ()

int                 shishi_ap_etype_tktoptionsdata      (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         int32_t etype,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);

Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the Authenticator checksum data using shishi_ap_set_tktoptionsdata(). A random session key is added to the authenticator, using the same keytype as the ticket.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

etype :

encryption type of newly generated random subkey.

tkt :

ticket to set in newly created AP.

options :

AP-REQ options to set in newly created AP.

data :

input array with data to checksum in Authenticator.

len :

length of input array with data to checksum in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_key ()

Shishi_key *        shishi_ap_key                       (Shishi_ap *ap);

Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used.

ap :

structure that holds information about AP exchange

Returns :

Return application key from AP.

shishi_ap_nosubkey ()

int                 shishi_ap_nosubkey                  (Shishi *handle,
                                                         Shishi_ap **ap);

Create a new AP exchange without subkey in authenticator.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_option2string ()

const char *        shishi_ap_option2string             (Shishi_apoptions option);

Convert AP-Option type to AP-Option name string. Note that option must be just one of the AP-Option types, it cannot be an binary ORed indicating several AP-Options.

option :

enumerated AP-Option type, see Shishi_apoptions.

Returns :

Returns static string with name of AP-Option that must not be deallocated, or "unknown" if AP-Option was not understood.

shishi_ap_rep ()

Shishi_asn1         shishi_ap_rep                       (Shishi_ap *ap);

Get ASN.1 AP-REP structure from AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns the AP-REP from the AP exchange, or NULL if not yet set or an error occured.

shishi_ap_rep_asn1 ()

int                 shishi_ap_rep_asn1                  (Shishi_ap *ap,
                                                         Shishi_asn1 *aprep);

Build AP-REP using shishi_ap_rep_build() and return it.

ap :

structure that holds information about AP exchange

aprep :

output AP-REP variable.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_rep_build ()

int                 shishi_ap_rep_build                 (Shishi_ap *ap);

Checksum data in authenticator and add ticket and authenticator to AP-REP.

ap :

structure that holds information about AP exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_rep_der ()

int                 shishi_ap_rep_der                   (Shishi_ap *ap,
                                                         char **out,
                                                         size_t *outlen);

Build AP-REP using shishi_ap_rep_build() and DER encode it. out is allocated by this function, and it is the responsibility of caller to deallocate it.

ap :

structure that holds information about AP exchange

out :

output array with newly allocated DER encoding of AP-REP.

outlen :

length of output array with DER encoding of AP-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_rep_der_set ()

int                 shishi_ap_rep_der_set               (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);

DER decode AP-REP and set it AP exchange. If decoding fails, the AP-REP in the AP exchange remains.

ap :

structure that holds information about AP exchange

der :

input array with DER encoded AP-REP.

derlen :

length of input array with DER encoded AP-REP.

Returns :

Returns SHISHI_OK.

shishi_ap_rep_set ()

void                shishi_ap_rep_set                   (Shishi_ap *ap,
                                                         Shishi_asn1 aprep);

Set the AP-REP in the AP exchange.

ap :

structure that holds information about AP exchange

aprep :

aprep to store in AP.

shishi_ap_rep_verify ()

int                 shishi_ap_rep_verify                (Shishi_ap *ap);

Verify AP-REP compared to Authenticator.

ap :

structure that holds information about AP exchange

Returns :

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

shishi_ap_rep_verify_asn1 ()

int                 shishi_ap_rep_verify_asn1           (Shishi_ap *ap,
                                                         Shishi_asn1 aprep);

Set the AP-REP in the AP exchange using shishi_ap_rep_set() and verify it using shishi_ap_rep_verify().

ap :

structure that holds information about AP exchange

aprep :

input AP-REP.

Returns :

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

shishi_ap_rep_verify_der ()

int                 shishi_ap_rep_verify_der            (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);

DER decode AP-REP and set it in AP exchange using shishi_ap_rep_der_set() and verify it using shishi_ap_rep_verify().

ap :

structure that holds information about AP exchange

der :

input array with DER encoded AP-REP.

derlen :

length of input array with DER encoded AP-REP.

Returns :

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

shishi_ap_req ()

Shishi_asn1         shishi_ap_req                       (Shishi_ap *ap);

Get ASN.1 AP-REQ structure from AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns the AP-REQ from the AP exchange, or NULL if not yet set or an error occured.

shishi_ap_req_asn1 ()

int                 shishi_ap_req_asn1                  (Shishi_ap *ap,
                                                         Shishi_asn1 *apreq);

Build AP-REQ using shishi_ap_req_build() and return it.

ap :

structure that holds information about AP exchange

apreq :

output AP-REQ variable.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_build ()

int                 shishi_ap_req_build                 (Shishi_ap *ap);

Checksum data in authenticator and add ticket and authenticator to AP-REQ.

ap :

structure that holds information about AP exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_decode ()

int                 shishi_ap_req_decode                (Shishi_ap *ap);

Decode ticket in AP-REQ and set the Ticket fields in the AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_der ()

int                 shishi_ap_req_der                   (Shishi_ap *ap,
                                                         char **out,
                                                         size_t *outlen);

Build AP-REQ using shishi_ap_req_build() and DER encode it. out is allocated by this function, and it is the responsibility of caller to deallocate it.

ap :

structure that holds information about AP exchange

out :

pointer to output array with der encoding of AP-REQ.

outlen :

pointer to length of output array with der encoding of AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_der_set ()

int                 shishi_ap_req_der_set               (Shishi_ap *ap,
                                                         char *der,
                                                         size_t derlen);

DER decode AP-REQ and set it AP exchange. If decoding fails, the AP-REQ in the AP exchange is lost.

ap :

structure that holds information about AP exchange

der :

input array with DER encoded AP-REQ.

derlen :

length of input array with DER encoded AP-REQ.

Returns :

Returns SHISHI_OK.

shishi_ap_req_process ()

int                 shishi_ap_req_process               (Shishi_ap *ap,
                                                         Shishi_key *key);

Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

ap :

structure that holds information about AP exchange

key :

cryptographic key used to decrypt ticket in AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_process_keyusage ()

int                 shishi_ap_req_process_keyusage      (Shishi_ap *ap,
                                                         Shishi_key *key,
                                                         int32_t keyusage);

Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

ap :

structure that holds information about AP exchange

key :

cryptographic key used to decrypt ticket in AP-REQ.

keyusage :

key usage to use during decryption, for normal AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP-REQ's part of TGS-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_req_set ()

void                shishi_ap_req_set                   (Shishi_ap *ap,
                                                         Shishi_asn1 apreq);

Set the AP-REQ in the AP exchange.

ap :

structure that holds information about AP exchange

apreq :

apreq to store in AP.

shishi_ap_set_tktoptions ()

int                 shishi_ap_set_tktoptions            (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options);

Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()).

ap :

structure that holds information about AP exchange

tkt :

ticket to set in AP.

options :

AP-REQ options to set in AP.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_set_tktoptionsasn1usage ()

int                 shishi_ap_set_tktoptionsasn1usage   (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int authenticatorcksumkeyusage,
                                                         int authenticatorkeyusage);

Set ticket, options and authenticator checksum data using shishi_ap_set_tktoptionsdata(). The authenticator checksum data is the DER encoding of the ASN.1 field provided.

ap :

structure that holds information about AP exchange

tkt :

ticket to set in AP.

options :

AP-REQ options to set in AP.

node :

input ASN.1 structure to store as authenticator checksum data.

field :

field in ASN.1 structure to use.

authenticatorcksumkeyusage :

key usage for checksum in authenticator.

authenticatorkeyusage :

key usage for authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_set_tktoptionsdata ()

int                 shishi_ap_set_tktoptionsdata        (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);

Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()) and set the Authenticator checksum data.

ap :

structure that holds information about AP exchange

tkt :

ticket to set in AP.

options :

AP-REQ options to set in AP.

data :

input array with data to checksum in Authenticator.

len :

length of input array with data to checksum in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_set_tktoptionsraw ()

int                 shishi_ap_set_tktoptionsraw         (Shishi_ap *ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         int32_t cksumtype,
                                                         const char *data,
                                                         size_t len);

Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()) and set the raw Authenticator checksum data.

ap :

structure that holds information about AP exchange

tkt :

ticket to set in AP.

options :

AP-REQ options to set in AP.

cksumtype :

authenticator checksum type to set in AP.

data :

input array with data to store in checksum field in Authenticator.

len :

length of input array with data to store in checksum field in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_string2option ()

Shishi_apoptions    shishi_ap_string2option             (const char *str);

Convert AP-Option name to AP-Option type.

str :

zero terminated character array with name of AP-Option, e.g. "use-session-key".

Returns :

Returns enumerated type member corresponding to AP-Option, or 0 if string was not understood.

shishi_ap_tkt ()

Shishi_tkt *        shishi_ap_tkt                       (Shishi_ap *ap);

Get Ticket from AP exchange.

ap :

structure that holds information about AP exchange

Returns :

Returns the ticket from the AP exchange, or NULL if not yet set or an error occured.

shishi_ap_tkt_set ()

void                shishi_ap_tkt_set                   (Shishi_ap *ap,
                                                         Shishi_tkt *tkt);

Set the Ticket in the AP exchange.

ap :

structure that holds information about AP exchange

tkt :

ticket to store in AP.

shishi_ap_tktoptions ()

int                 shishi_ap_tktoptions                (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options);

Create a new AP exchange using shishi_ap(), and set the ticket and AP-REQ apoptions using shishi_ap_set_tktoptions(). A random session key is added to the authenticator, using the same keytype as the ticket.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

tkt :

ticket to set in newly created AP.

options :

AP-REQ options to set in newly created AP.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_tktoptionsasn1usage ()

int                 shishi_ap_tktoptionsasn1usage       (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int authenticatorcksumkeyusage,
                                                         int authenticatorkeyusage);

Create a new AP exchange using shishi_ap(), and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using shishi_ap_set_tktoptionsasn1usage(). A random session key is added to the authenticator, using the same keytype as the ticket.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

tkt :

ticket to set in newly created AP.

options :

AP-REQ options to set in newly created AP.

node :

input ASN.1 structure to store as authenticator checksum data.

field :

field in ASN.1 structure to use.

authenticatorcksumkeyusage :

key usage for checksum in authenticator.

authenticatorkeyusage :

key usage for authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_tktoptionsdata ()

int                 shishi_ap_tktoptionsdata            (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         const char *data,
                                                         size_t len);

Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the Authenticator checksum data using shishi_ap_set_tktoptionsdata(). A random session key is added to the authenticator, using the same keytype as the ticket.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

tkt :

ticket to set in newly created AP.

options :

AP-REQ options to set in newly created AP.

data :

input array with data to checksum in Authenticator.

len :

length of input array with data to checksum in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_ap_tktoptionsraw ()

int                 shishi_ap_tktoptionsraw             (Shishi *handle,
                                                         Shishi_ap **ap,
                                                         Shishi_tkt *tkt,
                                                         int options,
                                                         int32_t cksumtype,
                                                         const char *data,
                                                         size_t len);

Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the raw Authenticator checksum data field using shishi_ap_set_tktoptionsraw(). A random session key is added to the authenticator, using the same keytype as the ticket.

handle :

shishi handle as allocated by shishi_init().

ap :

pointer to new structure that holds information about AP exchange

tkt :

ticket to set in newly created AP.

options :

AP-REQ options to set in newly created AP.

cksumtype :

authenticator checksum type to set in AP.

data :

input array with data to store in checksum field in Authenticator.

len :

length of input array with data to store in checksum field in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep ()

Shishi_asn1         shishi_aprep                        (Shishi *handle);

This function creates a new AP-REP, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the authenticator or NULL on failure.

shishi_aprep_decrypt ()

int                 shishi_aprep_decrypt                (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *encapreppart);


shishi_aprep_enc_part_add ()

int                 shishi_aprep_enc_part_add           (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_asn1 encapreppart);


shishi_aprep_enc_part_make ()

int                 shishi_aprep_enc_part_make          (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 encticketpart);


shishi_aprep_enc_part_set ()

int                 shishi_aprep_enc_part_set           (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int etype,
                                                         const char *buf,
                                                         size_t buflen);


shishi_aprep_from_file ()

int                 shishi_aprep_from_file              (Shishi *handle,
                                                         Shishi_asn1 *aprep,
                                                         int filetype,
                                                         const char *filename);

Read AP-REP from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

aprep :

output variable with newly allocated AP-REP.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_get_enc_part_etype ()

int                 shishi_aprep_get_enc_part_etype     (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int32_t *etype);

Extract AP-REP.enc-part.etype.

handle :

shishi handle as allocated by shishi_init().

aprep :

AP-REP variable to get value from.

etype :

output variable that holds the value.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_parse ()

int                 shishi_aprep_parse                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *aprep);

Read ASCII armored DER encoded AP-REP from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

aprep :

output variable with newly allocated AP-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_print ()

int                 shishi_aprep_print                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 aprep);

Print ASCII armored DER encoding of AP-REP to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

aprep :

AP-REP to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_read ()

int                 shishi_aprep_read                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *aprep);

Read DER encoded AP-REP from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

aprep :

output variable with newly allocated AP-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_save ()

int                 shishi_aprep_save                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 aprep);

Save DER encoding of AP-REP to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

aprep :

AP-REP to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_to_file ()

int                 shishi_aprep_to_file                (Shishi *handle,
                                                         Shishi_asn1 aprep,
                                                         int filetype,
                                                         const char *filename);

Write AP-REP to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

aprep :

AP-REP to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_aprep_verify ()

int                 shishi_aprep_verify                 (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 encapreppart);


shishi_apreq ()

Shishi_asn1         shishi_apreq                        (Shishi *handle);

This function creates a new AP-REQ, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the AP-REQ or NULL on failure.

shishi_apreq_add_authenticator ()

int                 shishi_apreq_add_authenticator      (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 authenticator);

Encrypts DER encoded authenticator using key and store it in the AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ to add authenticator field to.

key :

key to to use for encryption.

keyusage :

cryptographic key usage value to use in encryption.

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_decrypt ()

int                 shishi_apreq_decrypt                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *authenticator);


shishi_apreq_from_file ()

int                 shishi_apreq_from_file              (Shishi *handle,
                                                         Shishi_asn1 *apreq,
                                                         int filetype,
                                                         const char *filename);

Read AP-REQ from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

apreq :

output variable with newly allocated AP-REQ.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_get_authenticator_etype ()

int                 shishi_apreq_get_authenticator_etype
                                                        (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int32_t *etype);

Extract AP-REQ.authenticator.etype.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ variable to get value from.

etype :

output variable that holds the value.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_get_ticket ()

int                 shishi_apreq_get_ticket             (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_asn1 *ticket);

Extract ticket from AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ variable to get ticket from.

ticket :

output variable to hold extracted ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_mutual_required_p ()

int                 shishi_apreq_mutual_required_p      (Shishi *handle,
                                                         Shishi_asn1 apreq);

Return non-0 iff the "Mutual required" option is set in the AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ as allocated by shishi_apreq().

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_options ()

int                 shishi_apreq_options                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t *flags);

Extract the AP-Options from AP-REQ into output integer.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ to get options from.

flags :

Output integer containing options from AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_options_add ()

int                 shishi_apreq_options_add            (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t option);

Add the AP-Options in AP-REQ. Options not set in input parameter option are preserved in the AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ as allocated by shishi_apreq().

option :

Options to add in AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_options_remove ()

int                 shishi_apreq_options_remove         (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t option);

Remove the AP-Options from AP-REQ. Options not set in input parameter option are preserved in the AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ as allocated by shishi_apreq().

option :

Options to remove from AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_options_set ()

int                 shishi_apreq_options_set            (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         uint32_t options);

Set the AP-Options in AP-REQ to indicate integer.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ as allocated by shishi_apreq().

options :

Options to set in AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_parse ()

int                 shishi_apreq_parse                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *apreq);

Read ASCII armored DER encoded AP-REQ from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

apreq :

output variable with newly allocated AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_print ()

int                 shishi_apreq_print                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 apreq);

Print ASCII armored DER encoding of AP-REQ to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

apreq :

AP-REQ to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_read ()

int                 shishi_apreq_read                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *apreq);

Read DER encoded AP-REQ from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

apreq :

output variable with newly allocated AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_save ()

int                 shishi_apreq_save                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 apreq);

Save DER encoding of AP-REQ to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

apreq :

AP-REQ to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_set_authenticator ()

int                 shishi_apreq_set_authenticator      (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);

Set the encrypted authenticator field in the AP-REP. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded authenticator. To save time, you may want to use shishi_apreq_add_authenticator() instead, which calculates the encrypted data and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ to add authenticator field to.

etype :

encryption type used to encrypt authenticator.

kvno :

version of the key used to encrypt authenticator.

buf :

input array with encrypted authenticator.

buflen :

size of input array with encrypted authenticator.

Returns :

Returns SHISHI_OK on success.

shishi_apreq_set_ticket ()

int                 shishi_apreq_set_ticket             (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         Shishi_asn1 ticket);

Copy ticket into AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ to add ticket field to.

ticket :

input ticket to copy into AP-REQ ticket field.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_to_file ()

int                 shishi_apreq_to_file                (Shishi *handle,
                                                         Shishi_asn1 apreq,
                                                         int filetype,
                                                         const char *filename);

Write AP-REQ to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_apreq_use_session_key_p ()

int                 shishi_apreq_use_session_key_p      (Shishi *handle,
                                                         Shishi_asn1 apreq);

Return non-0 iff the "Use session key" option is set in the AP-REQ.

handle :

shishi handle as allocated by shishi_init().

apreq :

AP-REQ as allocated by shishi_apreq().

Returns :

Returns SHISHI_OK iff successful.

shishi_arcfour ()

int                 shishi_arcfour                      (Shishi *handle,
                                                         int decryptp,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char iv[258],
                                                         char *ivout[258],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);

Encrypt or decrypt data (depending on decryptp) using ARCFOUR. The out buffer must be deallocated by the caller.

The "initialization vector" used here is the concatenation of the sbox and i and j, and is thus always of size 256 + 1 + 1. This is a slight abuse of terminology, and assumes you know what you are doing. Don't use it if you can avoid to.

handle :

shishi handle as allocated by shishi_init().

decryptp :

0 to indicate encryption, non-0 to indicate decryption.

key :

input character array with key to use.

keylen :

length of input key array.

iv :

input character array with initialization vector to use, or NULL.

ivout :

output character array with updated initialization vector, or NULL.

in :

input character array of data to encrypt/decrypt.

inlen :

length of input character array of data to encrypt/decrypt.

out :

newly allocated character array with encrypted/decrypted data.

Returns :

Returns SHISHI_OK iff successful.

shishi_as ()

int                 shishi_as                           (Shishi *handle,
                                                         Shishi_as **as);

Allocate a new AS exchange variable.

handle :

shishi handle as allocated by shishi_init().

as :

holds pointer to newly allocate Shishi_as structure.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_check_cname ()

int                 shishi_as_check_cname               (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep);

Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see shishi_kdc_process().

handle :

shishi handle as allocated by shishi_init().

asreq :

AS-REQ to compare client name field in.

asrep :

AS-REP to compare client name field in.

Returns :

Returns SHISHI_OK if successful, SHISHI_CNAME_MISMATCH if the values differ, or an error code.

shishi_as_check_crealm ()

int                 shishi_as_check_crealm              (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep);

Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see shishi_kdc_process().

handle :

shishi handle as allocated by shishi_init().

asreq :

AS-REQ to compare realm field in.

asrep :

AS-REP to compare realm field in.

Returns :

Returns SHISHI_OK if successful, SHISHI_REALM_MISMATCH if the values differ, or an error code.

shishi_as_derive_salt ()

int                 shishi_as_derive_salt               (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         char **salt,
                                                         size_t *saltlen);

Derive the salt that should be used when deriving a key via shishi_string_to_key() for an AS exchange. Currently this searches for PA-DATA of type SHISHI_PA_PW_SALT in the AS-REP and returns it if found, otherwise the salt is derived from the client name and realm in AS-REQ.

handle :

shishi handle as allocated by shishi_init().

asreq :

input AS-REQ variable.

asrep :

input AS-REP variable.

salt :

newly allocated output array with salt.

saltlen :

holds actual size of output array with salt.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_done ()

void                shishi_as_done                      (Shishi_as *as);

Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle.

as :

structure that holds information about AS exchange

shishi_as_krberror ()

Shishi_asn1         shishi_as_krberror                  (Shishi_as *as);

Get ASN.1 KRB-ERROR structure from AS exchange.

as :

structure that holds information about AS exchange

Returns :

Returns the received KRB-ERROR packet from the AS exchange, or NULL if not yet set or an error occured.

shishi_as_krberror_der ()

int                 shishi_as_krberror_der              (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);

DER encode KRB-ERROR. out is allocated by this function, and it is the responsibility of caller to deallocate it.

as :

structure that holds information about AS exchange

out :

output array with newly allocated DER encoding of KRB-ERROR.

outlen :

length of output array with DER encoding of KRB-ERROR.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_krberror_set ()

void                shishi_as_krberror_set              (Shishi_as *as,
                                                         Shishi_asn1 krberror);

Set the KRB-ERROR in the AS exchange.

as :

structure that holds information about AS exchange

krberror :

krberror to store in AS.

shishi_as_process ()

int                 shishi_as_process                   (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         const char *string,
                                                         Shishi_asn1 *enckdcreppart);

Process an AS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the password and calls shishi_kdc_process(), which see.

handle :

shishi handle as allocated by shishi_init().

asreq :

input variable that holds the sent KDC-REQ.

asrep :

input variable that holds the received KDC-REP.

string :

input variable with zero terminated password.

enckdcreppart :

output variable that holds new EncKDCRepPart.

Returns :

Returns SHISHI_OK iff the AS client exchange was successful.

shishi_as_rep ()

Shishi_asn1         shishi_as_rep                       (Shishi_as *as);

Get ASN.1 AS-REP structure from AS exchange.

as :

structure that holds information about AS exchange

Returns :

Returns the received AS-REP packet from the AS exchange, or NULL if not yet set or an error occured.

shishi_as_rep_build ()

int                 shishi_as_rep_build                 (Shishi_as *as,
                                                         Shishi_key *key);

Build AS-REP.

as :

structure that holds information about AS exchange

key :

user's key, used to encrypt the encrypted part of the AS-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_rep_der ()

int                 shishi_as_rep_der                   (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);

DER encode AS-REP. out is allocated by this function, and it is the responsibility of caller to deallocate it.

as :

structure that holds information about AS exchange

out :

output array with newly allocated DER encoding of AS-REP.

outlen :

length of output array with DER encoding of AS-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_rep_der_set ()

int                 shishi_as_rep_der_set               (Shishi_as *as,
                                                         char *der,
                                                         size_t derlen);

DER decode AS-REP and set it AS exchange. If decoding fails, the AS-REP in the AS exchange remains.

as :

structure that holds information about AS exchange

der :

input array with DER encoded AP-REP.

derlen :

length of input array with DER encoded AP-REP.

Returns :

Returns SHISHI_OK.

shishi_as_rep_process ()

int                 shishi_as_rep_process               (Shishi_as *as,
                                                         Shishi_key *key,
                                                         const char *password);

Process new AS-REP and set ticket. The key is used to decrypt the AP-REP. If both key and password is NULL, the user is queried for it.

as :

structure that holds information about AS exchange

key :

user's key, used to encrypt the encrypted part of the AS-REP.

password :

user's password, used if key is NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_rep_set ()

void                shishi_as_rep_set                   (Shishi_as *as,
                                                         Shishi_asn1 asrep);

Set the AS-REP in the AS exchange.

as :

structure that holds information about AS exchange

asrep :

asrep to store in AS.

shishi_as_req ()

Shishi_asn1         shishi_as_req                       (Shishi_as *as);

Get ASN.1 AS-REQ structure from AS exchange.

as :

structure that holds information about AS exchange

Returns :

Returns the generated AS-REQ packet from the AS exchange, or NULL if not yet set or an error occured.

shishi_as_req_build ()

int                 shishi_as_req_build                 (Shishi_as *as);

Possibly remove unset fields (e.g., rtime).

as :

structure that holds information about AS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_as_req_der ()

int                 shishi_as_req_der                   (Shishi_as *as,
                                                         char **out,
                                                         size_t *outlen);

DER encode AS-REQ. out is allocated by this function, and it is the responsibility of caller to deallocate it.

as :

structure that holds information about AS exchange

out :

output array with newly allocated DER encoding of AS-REQ.

outlen :

length of output array with DER encoding of AS-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_req_der_set ()

int                 shishi_as_req_der_set               (Shishi_as *as,
                                                         char *der,
                                                         size_t derlen);

DER decode AS-REQ and set it AS exchange. If decoding fails, the AS-REQ in the AS exchange remains.

as :

structure that holds information about AS exchange

der :

input array with DER encoded AP-REQ.

derlen :

length of input array with DER encoded AP-REQ.

Returns :

Returns SHISHI_OK.

shishi_as_req_set ()

void                shishi_as_req_set                   (Shishi_as *as,
                                                         Shishi_asn1 asreq);

Set the AS-REQ in the AS exchange.

as :

structure that holds information about AS exchange

asreq :

asreq to store in AS.

shishi_as_sendrecv ()

int                 shishi_as_sendrecv                  (Shishi_as *as);

Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket.

as :

structure that holds information about AS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_as_sendrecv_hint ()

int                 shishi_as_sendrecv_hint             (Shishi_as *as,
                                                         Shishi_tkts_hint *hint);

Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The hint structure can be used to set, e.g., parameters for TLS authentication.

as :

structure that holds information about AS exchange

hint :

additional parameters that modify connection behaviour, or NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_as_tkt ()

Shishi_tkt *        shishi_as_tkt                       (Shishi_as *as);

Get Ticket in AS exchange.

as :

structure that holds information about AS exchange

Returns :

Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured.

shishi_as_tkt_set ()

void                shishi_as_tkt_set                   (Shishi_as *as,
                                                         Shishi_tkt *tkt);

Set the Tkt in the AS exchange.

as :

structure that holds information about AS exchange

tkt :

tkt to store in AS.

shishi_asn1_aprep ()

Shishi_asn1         shishi_asn1_aprep                   (Shishi *handle);

Create new ASN.1 structure for AP-REP.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_apreq ()

Shishi_asn1         shishi_asn1_apreq                   (Shishi *handle);

Create new ASN.1 structure for AP-REQ.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_asrep ()

Shishi_asn1         shishi_asn1_asrep                   (Shishi *handle);

Create new ASN.1 structure for AS-REP.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_asreq ()

Shishi_asn1         shishi_asn1_asreq                   (Shishi *handle);

Create new ASN.1 structure for AS-REQ.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_authenticator ()

Shishi_asn1         shishi_asn1_authenticator           (Shishi *handle);

Create new ASN.1 structure for Authenticator.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_done ()

void                shishi_asn1_done                    (Shishi *handle,
                                                         Shishi_asn1 node);

Deallocate resources associated with ASN.1 structure. Note that the node must not be used after this call.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 node to dellocate.

shishi_asn1_empty_p ()

int                 shishi_asn1_empty_p                 (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field);


shishi_asn1_encapreppart ()

Shishi_asn1         shishi_asn1_encapreppart            (Shishi *handle);

Create new ASN.1 structure for AP-REP.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_encasreppart ()

Shishi_asn1         shishi_asn1_encasreppart            (Shishi *handle);

Create new ASN.1 structure for EncASRepPart.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_enckdcreppart ()

Shishi_asn1         shishi_asn1_enckdcreppart           (Shishi *handle);

Create new ASN.1 structure for EncKDCRepPart.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_encprivpart ()

Shishi_asn1         shishi_asn1_encprivpart             (Shishi *handle);

Create new ASN.1 structure for EncKrbPrivPart.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_encrypteddata ()

Shishi_asn1         shishi_asn1_encrypteddata           (Shishi *handle);

Create new ASN.1 structure for EncryptedData

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_encticketpart ()

Shishi_asn1         shishi_asn1_encticketpart           (Shishi *handle);

Create new ASN.1 structure for EncTicketPart.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_etype_info ()

Shishi_asn1         shishi_asn1_etype_info              (Shishi *handle);

Create new ASN.1 structure for ETYPE-INFO.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_etype_info2 ()

Shishi_asn1         shishi_asn1_etype_info2             (Shishi *handle);

Create new ASN.1 structure for ETYPE-INFO2.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_krberror ()

Shishi_asn1         shishi_asn1_krberror                (Shishi *handle);

Create new ASN.1 structure for KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_krbsafe ()

Shishi_asn1         shishi_asn1_krbsafe                 (Shishi *handle);

Create new ASN.1 structure for KRB-SAFE.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_methoddata ()

Shishi_asn1         shishi_asn1_methoddata              (Shishi *handle);

Create new ASN.1 structure for METHOD-DATA.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_msgtype ()

Shishi_msgtype      shishi_asn1_msgtype                 (Shishi *handle,
                                                         Shishi_asn1 node);

Determine msg-type of ASN.1 type of a packet. Currently this uses the msg-type field instead of the APPLICATION tag, but this may be changed in the future.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 type to get msg type for.

Returns :

Returns msg-type of ASN.1 type, 0 on failure.

shishi_asn1_number_of_elements ()

int                 shishi_asn1_number_of_elements      (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         size_t *n);


shishi_asn1_pa_enc_ts_enc ()

Shishi_asn1         shishi_asn1_pa_enc_ts_enc           (Shishi *handle);

Create new ASN.1 structure for PA-ENC-TS-ENC.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_padata ()

Shishi_asn1         shishi_asn1_padata                  (Shishi *handle);

Create new ASN.1 structure for PA-DATA.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_print ()

void                shishi_asn1_print                   (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         FILE *fh);

Print ASN.1 structure in human readable form, typically for debugging purposes.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 data that have field to extract.

fh :

file descriptor to print to, e.g. stdout.

shishi_asn1_priv ()

Shishi_asn1         shishi_asn1_priv                    (Shishi *handle);

Create new ASN.1 structure for KRB-PRIV.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_read ()

int                 shishi_asn1_read                    (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **data,
                                                         size_t *datalen);

Extract data stored in a ASN.1 field into a newly allocated buffer. The buffer will always be zero terminated, even though datalen will not include the added zero.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 variable to read field from.

field :

name of field in node to read.

data :

newly allocated output buffer that will hold ASN.1 field data.

datalen :

actual size of output buffer.

Returns :

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

shishi_asn1_read_bitstring ()

int                 shishi_asn1_read_bitstring          (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t *flags);


shishi_asn1_read_inline ()

int                 shishi_asn1_read_inline             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char *data,
                                                         size_t *datalen);

Extract data stored in a ASN.1 field into a fixed size buffer allocated by caller.

Note that since it is difficult to predict the length of the field, it is often better to use shishi_asn1_read() instead.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 variable to read field from.

field :

name of field in node to read.

data :

pre-allocated output buffer that will hold ASN.1 field data.

datalen :

on input, maximum size of output buffer, on output, actual size of output buffer.

Returns :

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

shishi_asn1_read_int32 ()

int                 shishi_asn1_read_int32              (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int32_t *i);


shishi_asn1_read_integer ()

int                 shishi_asn1_read_integer            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int *i);


shishi_asn1_read_optional ()

int                 shishi_asn1_read_optional           (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **data,
                                                         size_t *datalen);

Extract data stored in a ASN.1 field into a newly allocated buffer. If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this function set datalen to 0 and succeeds. Can be useful to read ASN.1 fields which are marked OPTIONAL in the grammar, if you want to avoid special error handling in your code.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 variable to read field from.

field :

name of field in node to read.

data :

newly allocated output buffer that will hold ASN.1 field data.

datalen :

actual size of output buffer.

Returns :

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

shishi_asn1_read_uint32 ()

int                 shishi_asn1_read_uint32             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t *i);


shishi_asn1_tgsrep ()

Shishi_asn1         shishi_asn1_tgsrep                  (Shishi *handle);

Create new ASN.1 structure for TGS-REP.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_tgsreq ()

Shishi_asn1         shishi_asn1_tgsreq                  (Shishi *handle);

Create new ASN.1 structure for TGS-REQ.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_ticket ()

Shishi_asn1         shishi_asn1_ticket                  (Shishi *handle);

Create new ASN.1 structure for Ticket.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns ASN.1 structure.

shishi_asn1_to_der ()

int                 shishi_asn1_to_der                  (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         char **der,
                                                         size_t *len);

Extract newly allocated DER representation of specified ASN.1 data.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 data to convert to DER.

der :

output array that holds DER encoding of node.

len :

output variable with length of der output array.

Returns :

Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

shishi_asn1_to_der_field ()

int                 shishi_asn1_to_der_field            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **der,
                                                         size_t *len);

Extract newly allocated DER representation of specified ASN.1 field.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 data that have field to extract.

field :

name of field in node to extract.

der :

output array that holds DER encoding of field in node.

len :

output variable with length of der output array.

Returns :

Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

shishi_asn1_write ()

int                 shishi_asn1_write                   (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         const char *data,
                                                         size_t datalen);


shishi_asn1_write_bitstring ()

int                 shishi_asn1_write_bitstring         (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t flags);


shishi_asn1_write_int32 ()

int                 shishi_asn1_write_int32             (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int32_t n);


shishi_asn1_write_integer ()

int                 shishi_asn1_write_integer           (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         int n);


shishi_asn1_write_uint32 ()

int                 shishi_asn1_write_uint32            (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         uint32_t n);


shishi_asrep ()

Shishi_asn1         shishi_asrep                        (Shishi *handle);

This function creates a new AS-REP, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the AS-REP or NULL on failure.

shishi_asreq ()

Shishi_asn1         shishi_asreq                        (Shishi *handle);

This function creates a new AS-REQ, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the AS-REQ or NULL on failure.

shishi_asreq_clientrealm ()

int                 shishi_asreq_clientrealm            (Shishi *handle,
                                                         Shishi_asn1 asreq,
                                                         char **client,
                                                         size_t *clientlen);

Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

asreq :

AS-REQ variable to get client name and realm from.

client :

pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_asreq_rsc ()

Shishi_asn1         shishi_asreq_rsc                    (Shishi *handle,
                                                         char *realm,
                                                         char *server,
                                                         char *client);


shishi_authenticator ()

Shishi_asn1         shishi_authenticator                (Shishi *handle);

This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the authenticator or NULL on failure.

shishi_authenticator_add_authorizationdata ()

int                 shishi_authenticator_add_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t adtype,
                                                         const char *addata,
                                                         size_t addatalen);

Add authorization data to authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

adtype :

input authorization data type to add.

addata :

input authorization data to add.

addatalen :

size of input authorization data to add.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_add_cksum ()

int                 shishi_authenticator_add_cksum      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         char *data,
                                                         size_t datalen);

Calculate checksum for data and store it in the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

key :

key to to use for encryption.

keyusage :

cryptographic key usage value to use in encryption.

data :

input array with data to calculate checksum on.

datalen :

size of input array with data to calculate checksum on.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_add_cksum_type ()

int                 shishi_authenticator_add_cksum_type (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int cksumtype,
                                                         char *data,
                                                         size_t datalen);

Calculate checksum for data and store it in the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

key :

key to to use for encryption.

keyusage :

cryptographic key usage value to use in encryption.

cksumtype :

checksum to type to calculate checksum.

data :

input array with data to calculate checksum on.

datalen :

size of input array with data to calculate checksum on.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_add_random_subkey ()

int                 shishi_authenticator_add_random_subkey
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);

Generate random subkey, of the default encryption type from configuration, and store it in the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_add_random_subkey_etype ()

int                 shishi_authenticator_add_random_subkey_etype
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int etype);

Generate random subkey of indicated encryption type, and store it in the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

etype :

encryption type of random key to generate.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_add_subkey ()

int                 shishi_authenticator_add_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key *subkey);

Store subkey in the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

subkey :

subkey to add to authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_authorizationdata ()

int                 shishi_authenticator_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t *adtype,
                                                         char **addata,
                                                         size_t *addatalen,
                                                         size_t nth);

Extract n:th authorization data from authenticator. The first field is 1.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

adtype :

output authorization data type.

addata :

newly allocated output authorization data.

addatalen :

on output, actual size of newly allocated authorization data.

nth :

element number of authorization-data to extract.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_cksum ()

int                 shishi_authenticator_cksum          (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t *cksumtype,
                                                         char **cksum,
                                                         size_t *cksumlen);

Read checksum value from authenticator. cksum is allocated by this function, and it is the responsibility of caller to deallocate it.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

cksumtype :

output checksum type.

cksum :

newly allocated output checksum data from authenticator.

cksumlen :

on output, actual size of allocated output checksum data buffer.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_clear_authorizationdata ()

int                 shishi_authenticator_clear_authorizationdata
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);

Remove the authorization-data field from Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_client ()

int                 shishi_authenticator_client         (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **client,
                                                         size_t *clientlen);

Represent client principal name in Authenticator as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

authenticator :

Authenticator variable to get client name from.

client :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_client_set ()

int                 shishi_authenticator_client_set     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *client);

Set the client name field in the Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator to set client name field in.

client :

zero-terminated string with principal name on RFC 1964 form.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_clientrealm ()

int                 shishi_authenticator_clientrealm    (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **client,
                                                         size_t *clientlen);

Convert cname and realm fields from Authenticator to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

authenticator :

Authenticator variable to get client name and realm from.

client :

pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_ctime ()

int                 shishi_authenticator_ctime          (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         char **t);

Extract client time from Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator as allocated by shishi_authenticator().

t :

newly allocated zero-terminated character array with client time.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_ctime_set ()

int                 shishi_authenticator_ctime_set      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *t);

Store client time in Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator as allocated by shishi_authenticator().

t :

string with generalized time value to store in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_cusec_get ()

int                 shishi_authenticator_cusec_get      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t *cusec);

Extract client microseconds field from Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator as allocated by shishi_authenticator().

cusec :

output integer with client microseconds field.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_cusec_set ()

int                 shishi_authenticator_cusec_set      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t cusec);

Set the cusec field in the Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

cusec :

client microseconds to set in authenticator, 0-999999.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_from_file ()

int                 shishi_authenticator_from_file      (Shishi *handle,
                                                         Shishi_asn1 *authenticator,
                                                         int filetype,
                                                         const char *filename);

Read Authenticator from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

authenticator :

output variable with newly allocated Authenticator.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_get_subkey ()

int                 shishi_authenticator_get_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_key **subkey);

Read subkey value from authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

subkey :

output newly allocated subkey from authenticator.

Returns :

Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT if subkey is not present.

shishi_authenticator_parse ()

int                 shishi_authenticator_parse          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *authenticator);

Read ASCII armored DER encoded authenticator from file and populate given authenticator variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

authenticator :

output variable with newly allocated authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_print ()

int                 shishi_authenticator_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 authenticator);

Print ASCII armored DER encoding of authenticator to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_read ()

int                 shishi_authenticator_read           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *authenticator);

Read DER encoded authenticator from file and populate given authenticator variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

authenticator :

output variable with newly allocated authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_remove_cksum ()

int                 shishi_authenticator_remove_cksum   (Shishi *handle,
                                                         Shishi_asn1 authenticator);


shishi_authenticator_remove_subkey ()

int                 shishi_authenticator_remove_subkey  (Shishi *handle,
                                                         Shishi_asn1 authenticator);

Remove subkey from the authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_save ()

int                 shishi_authenticator_save           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 authenticator);

Save DER encoding of authenticator to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_seqnumber_get ()

int                 shishi_authenticator_seqnumber_get  (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t *seqnumber);

Extract sequence number field from Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

seqnumber :

output integer with sequence number field.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_seqnumber_remove ()

int                 shishi_authenticator_seqnumber_remove
                                                        (Shishi *handle,
                                                         Shishi_asn1 authenticator);

Remove sequence number field in Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_seqnumber_set ()

int                 shishi_authenticator_seqnumber_set  (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         uint32_t seqnumber);

Store sequence number field in Authenticator.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

seqnumber :

integer with sequence number field to store in Authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_set_cksum ()

int                 shishi_authenticator_set_cksum      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int cksumtype,
                                                         char *cksum,
                                                         size_t cksumlen);

Store checksum value in authenticator. A checksum is usually created by calling shishi_checksum() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_authenticator_add_cksum() instead, which calculates the checksum and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

cksumtype :

input checksum type to store in authenticator.

cksum :

input checksum data to store in authenticator.

cksumlen :

size of input checksum data to store in authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_set_cname ()

int                 shishi_authenticator_set_cname      (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);

Set principal field in authenticator to specified value.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

cname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_set_crealm ()

int                 shishi_authenticator_set_crealm     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         const char *crealm);

Set realm field in authenticator to specified value.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

crealm :

input array with realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_set_subkey ()

int                 shishi_authenticator_set_subkey     (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int32_t subkeytype,
                                                         const char *subkey,
                                                         size_t subkeylen);

Store subkey value in authenticator. A subkey is usually created by calling shishi_key_random() using the default encryption type of the key from the ticket that is being used. To save time, you may want to use shishi_authenticator_add_subkey() instead, which calculates the subkey and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

authenticator :

authenticator as allocated by shishi_authenticator().

subkeytype :

input subkey type to store in authenticator.

subkey :

input subkey data to store in authenticator.

subkeylen :

size of input subkey data to store in authenticator.

Returns :

Returns SHISHI_OK iff successful.

shishi_authenticator_subkey ()

Shishi_asn1         shishi_authenticator_subkey         (Shishi *handle);

This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. It adds a random subkey.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the authenticator or NULL on failure.

shishi_authenticator_to_file ()

int                 shishi_authenticator_to_file        (Shishi *handle,
                                                         Shishi_asn1 authenticator,
                                                         int filetype,
                                                         const char *filename);

Write Authenticator to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

authenticator :

Authenticator to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_authorization_parse ()

int                 shishi_authorization_parse          (const char *authorization);

Parse authorization type name.

authorization :

name of authorization type, "basic" or "k5login".

Returns :

Returns authorization type corresponding to a string.

shishi_authorize_k5login ()

int                 shishi_authorize_k5login            (Shishi *handle,
                                                         const char *principal,
                                                         const char *authzname);

Authorization of authzname against desired principal in accordance with the MIT/Heimdal authorization method.

handle :

shishi handle allocated by shishi_init().

principal :

string with desired principal name and realm.

authzname :

authorization name.

Returns :

Returns 1 if authzname is authorized for services by principal, and returns 0 otherwise.

shishi_authorize_strcmp ()

int                 shishi_authorize_strcmp             (Shishi *handle,
                                                         const char *principal,
                                                         const char *authzname);

Authorization of authzname against desired principal according to "basic" authentication, i.e., testing for identical strings.

handle :

shishi handle allocated by shishi_init().

principal :

string with desired principal name.

authzname :

authorization name.

Returns :

Returns 1 if authzname is authorized for services by the encrypted principal, and 0 otherwise.

shishi_authorized_p ()

int                 shishi_authorized_p                 (Shishi *handle,
                                                         Shishi_tkt *tkt,
                                                         const char *authzname);

Simplistic authorization of authzname against encrypted client principal name inside ticket. For "basic" authentication type, the principal name must coincide with authzname. The "k5login" authentication type attempts the MIT/Heimdal method of parsing the file "~/.k5login" for additional equivalence names.

handle :

shishi handle allocated by shishi_init().

tkt :

input variable with ticket info.

authzname :

authorization name.

Returns :

Returns 1 if authzname is authorized for services by the encrypted principal, and 0 otherwise.

shishi_cfg ()

int                 shishi_cfg                          (Shishi *handle,
                                                         const char *option);

Configure shishi library with given option.

handle :

Shishi library handle create by shishi_init().

option :

string with shishi library option.

Returns :

Returns SHISHI_OK if option was valid.

shishi_cfg_authorizationtype_set ()

int                 shishi_cfg_authorizationtype_set    (Shishi *handle,
                                                         char *value);

Set the "authorization-types" configuration option from given string. The string contains authorization types (integer or names) separated by comma or whitespace, e.g. "basic k5login".

handle :

Shishi library handle created by shishi_init().

value :

string with authorization types.

Returns :

Returns SHISHI_OK if successful.

shishi_cfg_clientkdcetype ()

int                 shishi_cfg_clientkdcetype           (Shishi *handle,
                                                         int32_t **etypes);

Set the etypes variable to the array of preferred client etypes.

handle :

Shishi library handle create by shishi_init().

etypes :

output array with encryption types.

Returns :

Return the number of encryption types in the array, 0 means none.

shishi_cfg_clientkdcetype_fast ()

int32_t             shishi_cfg_clientkdcetype_fast      (Shishi *handle);

Extract the default etype from the list of preferred client etypes.

handle :

Shishi library handle create by shishi_init().

Returns :

Return the default encryption types.

shishi_cfg_clientkdcetype_set ()

int                 shishi_cfg_clientkdcetype_set       (Shishi *handle,
                                                         char *value);

Set the "client-kdc-etypes" configuration option from given string. The string contains encryption types (integer or names) separated by comma or whitespace, e.g. "aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5".

handle :

Shishi library handle created by shishi_init().

value :

string with encryption types.

Returns :

Returns SHISHI_OK if successful.

shishi_cfg_default_systemfile ()

const char *        shishi_cfg_default_systemfile       (Shishi *handle);

The system configuration file name is decided at compile-time, but may be overridden by the environment variable SHISHI_CONFIG.

handle :

Shishi library handle create by shishi_init().

Returns :

Return system configuration file name.

shishi_cfg_default_userdirectory ()

const char *        shishi_cfg_default_userdirectory    (Shishi *handle);

The default user directory (used for, e.g. Shishi ticket cache) is normally computed by appending BASE_DIR ("/.shishi") to the content of the environment variable $HOME, but can be overridden by specifying the complete path in the environment variable SHISHI_HOME.

handle :

Shishi library handle create by shishi_init().

Returns :

Return directory with configuration files etc.

shishi_cfg_default_userfile ()

const char *        shishi_cfg_default_userfile         (Shishi *handle);

Get filename of default user configuration file, typically $HOME/shishi.conf.

handle :

Shishi library handle create by shishi_init().

Returns :

Return user configuration filename.

shishi_cfg_from_file ()

int                 shishi_cfg_from_file                (Shishi *handle,
                                                         const char *cfg);

Configure shishi library using configuration file.

handle :

Shishi library handle create by shishi_init().

cfg :

filename to read configuration from.

Returns :

Returns SHISHI_OK iff successful.

shishi_cfg_print ()

int                 shishi_cfg_print                    (Shishi *handle,
                                                         FILE *fh);

Print library configuration status, mostly for debugging purposes.

handle :

Shishi library handle create by shishi_init().

fh :

file descriptor opened for writing.

Returns :

Returns SHISHI_OK.

shishi_cfg_userdirectory_file ()

char *              shishi_cfg_userdirectory_file       (Shishi *handle,
                                                         const char *file);

Get the full path to specified file in the users' configuration directory.

handle :

Shishi library handle create by shishi_init().

file :

basename of file to find in user directory.

Returns :

Return full path to given relative filename, relative to the user specific Shishi configuration directory as returned by shishi_cfg_default_userdirectory() (typically $HOME/.shishi).

shishi_check_version ()

const char *        shishi_check_version                (const char *req_version);

Check that the version of the library is at minimum the one given as a string in req_version.

req_version :

version string to compare with, or NULL

Returns :

the actual version string of the library; NULL if the condition is not met. If NULL is passed to this function no check is done and only the version string is returned.

shishi_checksum ()

int                 shishi_checksum                     (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t cksumtype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Integrity protect data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

key :

key to compute checksum with.

keyusage :

integer specifying what this key is used for.

cksumtype :

the checksum algorithm to use.

in :

input array with data to integrity protect.

inlen :

size of input array with data to integrity protect.

out :

output array with newly allocated integrity protected data.

outlen :

output variable with length of output array with checksum.

Returns :

Returns SHISHI_OK iff successful.

shishi_checksum_cksumlen ()

size_t              shishi_checksum_cksumlen            (int32_t type);

Get length of checksum output.

type :

checksum type, see Shishi_cksumtype.

Returns :

Return length of checksum used for the checksum type, as defined in the standards.

shishi_checksum_name ()

const char *        shishi_checksum_name                (int32_t type);

Get name of checksum.

type :

checksum type, see Shishi_cksumtype.

Returns :

Return name of checksum type, e.g. "hmac-sha1-96-aes256", as defined in the standards.

shishi_checksum_parse ()

int                 shishi_checksum_parse               (const char *checksum);

Get checksum number by parsing a string.

checksum :

name of checksum type, e.g. "hmac-sha1-96-aes256".

Returns :

Return checksum type, see Shishi_cksumtype, corresponding to a string.

shishi_checksum_supported_p ()

int                 shishi_checksum_supported_p         (int32_t type);

Find out whether checksum is supported.

type :

checksum type, see Shishi_cksumtype.

Returns :

Return 0 iff checksum is unsupported.

shishi_cipher_blocksize ()

int                 shishi_cipher_blocksize             (int type);

Get block size for cipher.

type :

encryption type, see Shishi_etype.

Returns :

Return block size for encryption type, as defined in the standards.

shishi_cipher_confoundersize ()

int                 shishi_cipher_confoundersize        (int type);

Get length of confounder for cipher.

type :

encryption type, see Shishi_etype.

Returns :

Returns the size of the confounder (random data) for encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

shishi_cipher_defaultcksumtype ()

int                 shishi_cipher_defaultcksumtype      (int32_t type);

Get the default checksum associated with cipher.

type :

encryption type, see Shishi_etype.

Returns :

Return associated checksum mechanism for the encryption type, as defined in the standards.

shishi_cipher_keylen ()

size_t              shishi_cipher_keylen                (int type);

Get key length for cipher.

type :

encryption type, see Shishi_etype.

Returns :

Return length of key used for the encryption type, as defined in the standards.

shishi_cipher_name ()

const char *        shishi_cipher_name                  (int type);

Read humanly readable string for cipher.

type :

encryption type, see Shishi_etype.

Returns :

Return name of encryption type, e.g. "des3-cbc-sha1-kd", as defined in the standards.

shishi_cipher_parse ()

int                 shishi_cipher_parse                 (const char *cipher);

Get cipher number by parsing string.

cipher :

name of encryption type, e.g. "des3-cbc-sha1-kd".

Returns :

Return encryption type corresponding to a string.

shishi_cipher_randomlen ()

size_t              shishi_cipher_randomlen             (int type);

Get length of random data for cipher.

type :

encryption type, see Shishi_etype.

Returns :

Return length of random used for the encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

shishi_cipher_supported_p ()

int                 shishi_cipher_supported_p           (int type);

Find out if cipher is supported.

type :

encryption type, see Shishi_etype.

Returns :

Return 0 iff cipher is unsupported.

shishi_crc ()

int                 shishi_crc                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[4]);

Compute checksum of data using CRC32 modified according to RFC 1510. The out buffer must be deallocated by the caller.

The modifications compared to standard CRC32 is that no initial and final XOR is performed, and that the output is returned in LSB-first order.

handle :

shishi handle as allocated by shishi_init().

in :

input character array of data to checksum.

inlen :

length of input character array of data to checksum.

out :

newly allocated character array with checksum of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_crypto ()

Shishi_crypto *     shishi_crypto                       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen);

Initialize a crypto context. This store a key, keyusage, encryption type and initialization vector in a "context", and the caller can then use this context to perform encryption via shishi_crypto_encrypt() and decryption via shishi_crypto_encrypt() without supplying all those details again. The functions also takes care of propagating the IV between calls.

When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key will encrypt/decrypt.

etype :

integer specifying what cipher to use.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

Returns :

Return a newly allocated crypto context.

shishi_crypto_close ()

void                shishi_crypto_close                 (Shishi_crypto *ctx);

Deallocate resources associated with the crypto context.

ctx :

crypto context as returned by shishi_crypto().

shishi_crypto_decrypt ()

int                 shishi_crypto_decrypt               (Shishi_crypto *ctx,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

ctx :

crypto context as returned by shishi_crypto().

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_crypto_encrypt ()

int                 shishi_crypto_encrypt               (Shishi_crypto *ctx,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

ctx :

crypto context as returned by shishi_crypto().

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_ctime ()

int                 shishi_ctime                        (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         time_t *t);

Extract time from ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 variable to read field from.

field :

name of field in node to read.

t :

pointer to time field to set.

Returns :

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

shishi_decrypt ()

int                 shishi_decrypt                      (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_decrypt_etype ()

int                 shishi_decrypt_etype                (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data as per encryption method using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

etype :

integer specifying what cipher to use.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_decrypt_iv ()

int                 shishi_decrypt_iv                   (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_decrypt_iv_etype ()

int                 shishi_decrypt_iv_etype             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

etype :

integer specifying what cipher to use.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_decrypt_ivupdate ()

int                 shishi_decrypt_ivupdate             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

ivout :

output array with newly allocated updated initialization vector.

ivoutlen :

size of output array with updated initialization vector.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_decrypt_ivupdate_etype ()

int                 shishi_decrypt_ivupdate_etype       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to decrypt with.

keyusage :

integer specifying what this key is decrypting.

etype :

integer specifying what cipher to use.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

ivout :

output array with newly allocated updated initialization vector.

ivoutlen :

size of output array with updated initialization vector.

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt.

out :

output array with newly allocated decrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_der2asn1 ()

Shishi_asn1         shishi_der2asn1                     (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Convert arbitrary DER data of a packet to a ASN.1 type.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns newly allocate ASN.1 corresponding to DER data, or NULL on failure.

shishi_der2asn1_aprep ()

Shishi_asn1         shishi_der2asn1_aprep               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of AP-REP and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_apreq ()

Shishi_asn1         shishi_der2asn1_apreq               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of AP-REQ and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_asrep ()

Shishi_asn1         shishi_der2asn1_asrep               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of AS-REP and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_asreq ()

Shishi_asn1         shishi_der2asn1_asreq               (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of AS-REQ and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_authenticator ()

Shishi_asn1         shishi_der2asn1_authenticator       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of Authenticator and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_encapreppart ()

Shishi_asn1         shishi_der2asn1_encapreppart        (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncAPRepPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_encasreppart ()

Shishi_asn1         shishi_der2asn1_encasreppart        (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncASRepPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_enckdcreppart ()

Shishi_asn1         shishi_der2asn1_enckdcreppart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncKDCRepPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_encprivpart ()

Shishi_asn1         shishi_der2asn1_encprivpart         (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_enctgsreppart ()

Shishi_asn1         shishi_der2asn1_enctgsreppart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncTGSRepPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_encticketpart ()

Shishi_asn1         shishi_der2asn1_encticketpart       (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of EncTicketPart and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_etype_info ()

Shishi_asn1         shishi_der2asn1_etype_info          (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of ETYPE-INFO and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_etype_info2 ()

Shishi_asn1         shishi_der2asn1_etype_info2         (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of ETYPE-INFO2 and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_kdcrep ()

Shishi_asn1         shishi_der2asn1_kdcrep              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of KDC-REP and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_kdcreq ()

Shishi_asn1         shishi_der2asn1_kdcreq              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of AS-REQ, TGS-REQ or KDC-REQ and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_krberror ()

Shishi_asn1         shishi_der2asn1_krberror            (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of KRB-ERROR and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_krbsafe ()

Shishi_asn1         shishi_der2asn1_krbsafe             (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of KRB-SAFE and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_methoddata ()

Shishi_asn1         shishi_der2asn1_methoddata          (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of METHOD-DATA and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_padata ()

Shishi_asn1         shishi_der2asn1_padata              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of PA-DATA and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_priv ()

Shishi_asn1         shishi_der2asn1_priv                (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of KRB-PRIV and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_tgsrep ()

Shishi_asn1         shishi_der2asn1_tgsrep              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of TGS-REP and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_tgsreq ()

Shishi_asn1         shishi_der2asn1_tgsreq              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of TGS-REQ and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der2asn1_ticket ()

Shishi_asn1         shishi_der2asn1_ticket              (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Decode DER encoding of Ticket and create a ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns ASN.1 structure corresponding to DER data.

shishi_der_msgtype ()

Shishi_msgtype      shishi_der_msgtype                  (Shishi *handle,
                                                         const char *der,
                                                         size_t derlen);

Determine msg-type of DER coded data of a packet.

handle :

shishi handle as allocated by shishi_init().

der :

input character array with DER encoding.

derlen :

length of input character array with DER encoding.

Returns :

Returns msg-type of DER data, 0 on failure.

shishi_derive_default_salt ()

int                 shishi_derive_default_salt          (Shishi *handle,
                                                         const char *name,
                                                         char **salt);

Derive the default salt from a principal. The default salt is the concatenation of the decoded realm and the principal.

handle :

shishi handle as allocated by shishi_init().

name :

principal name of user.

salt :

output variable with newly allocated salt string.

Returns :

Return SHISHI_OK if successful.

shishi_des ()

int                 shishi_des                          (Shishi *handle,
                                                         int decryptp,
                                                         const char key[8],
                                                         const char iv[8],
                                                         char *ivout[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out);

Encrypt or decrypt data (depending on decryptp) using DES in CBC mode. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

decryptp :

0 to indicate encryption, non-0 to indicate decryption.

key :

input character array with key to use.

iv :

input character array with initialization vector to use, or NULL.

ivout :

output character array with updated initialization vector, or NULL.

in :

input character array of data to encrypt/decrypt.

inlen :

length of input character array of data to encrypt/decrypt.

out :

newly allocated character array with encrypted/decrypted data.

Returns :

Returns SHISHI_OK iff successful.

shishi_des_cbc_mac ()

int                 shishi_des_cbc_mac                  (Shishi *handle,
                                                         const char key[8],
                                                         const char iv[8],
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[8]);

Computed keyed checksum of data using DES-CBC-MAC. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

key :

input character array with key to use.

iv :

input character array with initialization vector to use, can be NULL.

in :

input character array of data to hash.

inlen :

length of input character array of data to hash.

out :

newly allocated character array with keyed hash of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_dk ()

int                 shishi_dk                           (Shishi *handle,
                                                         Shishi_key *key,
                                                         const char *prfconstant,
                                                         size_t prfconstantlen,
                                                         Shishi_key *derivedkey);

Derive a key from a key and a constant thusly: DK(KEY, PRFCONSTANT) = SHISHI_RANDOM-TO-KEY(SHISHI_DR(KEY, PRFCONSTANT)).

handle :

shishi handle as allocated by shishi_init().

key :

input cryptographic key to use.

prfconstant :

input array with the constant string.

prfconstantlen :

size of input array with the constant string.

derivedkey :

pointer to derived key (allocated by caller).

Returns :

Returns SHISHI_OK iff successful.

shishi_done ()

void                shishi_done                         (Shishi *handle);

Deallocates the shishi library handle. The handle must not be used in any calls to shishi functions after this.

If there is a default tkts, it is written to the default tkts file (call shishi_tkts_default_file_set() to change the default tkts file). If you do not wish to write the default tkts file, close the default tkts with shishi_tkts_done(handle, NULL) before calling this function.

handle :

shishi handle as allocated by shishi_init().

shishi_dr ()

int                 shishi_dr                           (Shishi *handle,
                                                         Shishi_key *key,
                                                         const char *prfconstant,
                                                         size_t prfconstantlen,
                                                         char *derivedrandom,
                                                         size_t derivedrandomlen);

Derive "random" data from a key and a constant thusly: DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, SHISHI_ENCRYPT(KEY, PRFCONSTANT)).

handle :

shishi handle as allocated by shishi_init().

key :

input array with cryptographic key to use.

prfconstant :

input array with the constant string.

prfconstantlen :

size of input array with the constant string.

derivedrandom :

output array with derived random data.

derivedrandomlen :

size of output array with derived random data.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart ()

Shishi_asn1         shishi_encapreppart                 (Shishi *handle);

This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the encapreppart or NULL on failure.

shishi_encapreppart_ctime ()

int                 shishi_encapreppart_ctime           (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         char **t);

Extract client time from EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

t :

newly allocated zero-terminated character array with client time.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_ctime_set ()

int                 shishi_encapreppart_ctime_set       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         const char *t);

Store client time in EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

t :

string with generalized time value to store in EncAPRepPart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_cusec_get ()

int                 shishi_encapreppart_cusec_get       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t *cusec);

Extract client microseconds field from EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

cusec :

output integer with client microseconds field.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_cusec_set ()

int                 shishi_encapreppart_cusec_set       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t cusec);

Set the cusec field in the Authenticator.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

cusec :

client microseconds to set in authenticator, 0-999999.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_from_file ()

int                 shishi_encapreppart_from_file       (Shishi *handle,
                                                         Shishi_asn1 *encapreppart,
                                                         int filetype,
                                                         const char *filename);

Read EncAPRepPart from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

output variable with newly allocated EncAPRepPart.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_get_key ()

int                 shishi_encapreppart_get_key         (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_key **key);

Extract the subkey from the encrypted AP-REP part.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

input EncAPRepPart variable.

key :

newly allocated key.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_parse ()

int                 shishi_encapreppart_parse           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *encapreppart);

Read ASCII armored DER encoded EncAPRepPart from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

encapreppart :

output variable with newly allocated EncAPRepPart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_print ()

int                 shishi_encapreppart_print           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encapreppart);

Print ASCII armored DER encoding of EncAPRepPart to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

encapreppart :

EncAPRepPart to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_read ()

int                 shishi_encapreppart_read            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *encapreppart);

Read DER encoded EncAPRepPart from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

encapreppart :

output variable with newly allocated EncAPRepPart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_save ()

int                 shishi_encapreppart_save            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encapreppart);

Save DER encoding of EncAPRepPart to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

encapreppart :

EncAPRepPart to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_seqnumber_get ()

int                 shishi_encapreppart_seqnumber_get   (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t *seqnumber);

Extract sequence number field from EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

seqnumber :

output integer with sequence number field.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_seqnumber_remove ()

int                 shishi_encapreppart_seqnumber_remove
                                                        (Shishi *handle,
                                                         Shishi_asn1 encapreppart);

Remove sequence number field in EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

encapreppart as allocated by shishi_encapreppart().

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_seqnumber_set ()

int                 shishi_encapreppart_seqnumber_set   (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         uint32_t seqnumber);

Store sequence number field in EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

encapreppart as allocated by shishi_encapreppart().

seqnumber :

integer with sequence number field to store in encapreppart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_time_copy ()

int                 shishi_encapreppart_time_copy       (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         Shishi_asn1 authenticator);

Copy time fields from Authenticator into EncAPRepPart.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart as allocated by shishi_encapreppart().

authenticator :

Authenticator to copy time fields from.

Returns :

Returns SHISHI_OK iff successful.

shishi_encapreppart_to_file ()

int                 shishi_encapreppart_to_file         (Shishi *handle,
                                                         Shishi_asn1 encapreppart,
                                                         int filetype,
                                                         const char *filename);

Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

encapreppart :

EncAPRepPart to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_encasreppart ()

Shishi_asn1         shishi_encasreppart                 (Shishi *handle);


shishi_enckdcreppart ()

Shishi_asn1         shishi_enckdcreppart                (Shishi *handle);


shishi_enckdcreppart_authtime_set ()

int                 shishi_enckdcreppart_authtime_set   (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *authtime);

Set the EncTicketPart.authtime to supplied value.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

authtime :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_endtime_set ()

int                 shishi_enckdcreppart_endtime_set    (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *endtime);

Set the EncTicketPart.endtime to supplied value.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

endtime :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_flags_set ()

int                 shishi_enckdcreppart_flags_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         int flags);

Set the EncKDCRepPart.flags field.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

flags :

flags to set in EncKDCRepPart.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_get_key ()

int                 shishi_enckdcreppart_get_key        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_key **key);

Extract the key to use with the ticket sent in the KDC-REP associated with the EncKDCRepPart input variable.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

key :

newly allocated encryption key handle.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_key_set ()

int                 shishi_enckdcreppart_key_set        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_key *key);

Set the EncKDCRepPart.key field to key type and value of supplied key.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

key :

key handle with information to store in enckdcreppart.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_nonce_set ()

int                 shishi_enckdcreppart_nonce_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         uint32_t nonce);

Set the EncKDCRepPart.nonce field.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

nonce :

nonce to set in EncKDCRepPart.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_parse ()

int                 shishi_enckdcreppart_parse          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *enckdcreppart);


shishi_enckdcreppart_populate_encticketpart ()

int                 shishi_enckdcreppart_populate_encticketpart
                                                        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 encticketpart);

Set the flags, authtime, starttime, endtime, renew-till and caddr fields of the EncKDCRepPart to the corresponding values in the EncTicketPart.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

encticketpart :

input EncTicketPart variable.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_print ()

int                 shishi_enckdcreppart_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 enckdcreppart);


shishi_enckdcreppart_read ()

int                 shishi_enckdcreppart_read           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *enckdcreppart);


shishi_enckdcreppart_renew_till_set ()

int                 shishi_enckdcreppart_renew_till_set (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *renew_till);

Set the EncTicketPart.renew-till to supplied value. Use a NULL value for renew_till to remove the field.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

renew_till :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_save ()

int                 shishi_enckdcreppart_save           (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 enckdcreppart);


shishi_enckdcreppart_server_set ()

int                 shishi_enckdcreppart_server_set     (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *server);


shishi_enckdcreppart_sname_set ()

int                 shishi_enckdcreppart_sname_set      (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_name_type name_type,
                                                         char *sname[]);

Set the server name field in the EncKDCRepPart.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

EncKDCRepPart variable to set server name field in.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

sname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_srealm_set ()

int                 shishi_enckdcreppart_srealm_set     (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *srealm);

Set the server realm field in the EncKDCRepPart.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

EncKDCRepPart variable to set realm field in.

srealm :

input array with name of realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_enckdcreppart_srealmserver_set ()

int                 shishi_enckdcreppart_srealmserver_set
                                                        (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *srealm,
                                                         const char *server);


shishi_enckdcreppart_starttime_set ()

int                 shishi_enckdcreppart_starttime_set  (Shishi *handle,
                                                         Shishi_asn1 enckdcreppart,
                                                         const char *starttime);

Set the EncTicketPart.starttime to supplied value. Use a NULL value for starttime to remove the field.

handle :

shishi handle as allocated by shishi_init().

enckdcreppart :

input EncKDCRepPart variable.

starttime :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_encprivpart_set_user_data ()

int                 shishi_encprivpart_set_user_data    (Shishi *handle,
                                                         Shishi_asn1 encprivpart,
                                                         const char *userdata,
                                                         size_t userdatalen);

Set the application data in PRIV.

handle :

shishi handle as allocated by shishi_init().

encprivpart :

encprivpart as allocated by shishi_priv().

userdata :

input user application to store in PRIV.

userdatalen :

size of input user application to store in PRIV.

Returns :

Returns SHISHI_OK iff successful.

shishi_encprivpart_user_data ()

int                 shishi_encprivpart_user_data        (Shishi *handle,
                                                         Shishi_asn1 encprivpart,
                                                         char **userdata,
                                                         size_t *userdatalen);

Read user data value from KRB-PRIV. userdata is allocated by this function, and it is the responsibility of caller to deallocate it.

handle :

shishi handle as allocated by shishi_init().

encprivpart :

encprivpart as allocated by shishi_priv().

userdata :

output array with newly allocated user data from KRB-PRIV.

userdatalen :

output size of output user data buffer.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt ()

int                 shishi_encrypt                      (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt_etype ()

int                 shishi_encrypt_etype                (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

etype :

integer specifying what cipher to use.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt_iv ()

int                 shishi_encrypt_iv                   (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt_iv_etype ()

int                 shishi_encrypt_iv_etype             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

etype :

integer specifying what cipher to use.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt_ivupdate ()

int                 shishi_encrypt_ivupdate             (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

ivout :

output array with newly allocated updated initialization vector.

ivoutlen :

size of output array with updated initialization vector.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encrypt_ivupdate_etype ()

int                 shishi_encrypt_ivupdate_etype       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int32_t etype,
                                                         const char *iv,
                                                         size_t ivlen,
                                                         char **ivout,
                                                         size_t *ivoutlen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char **out,
                                                         size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

handle :

shishi handle as allocated by shishi_init().

key :

key to encrypt with.

keyusage :

integer specifying what this key is encrypting.

etype :

integer specifying what cipher to use.

iv :

input array with initialization vector

ivlen :

size of input array with initialization vector.

ivout :

output array with newly allocated updated initialization vector.

ivoutlen :

size of output array with updated initialization vector.

in :

input array with data to encrypt.

inlen :

size of input array with data to encrypt.

out :

output array with newly allocated encrypted data.

outlen :

output variable with size of newly allocated output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart ()

Shishi_asn1         shishi_encticketpart                (Shishi *handle);


shishi_encticketpart_authctime ()

time_t              shishi_encticketpart_authctime      (Shishi *handle,
                                                         Shishi_asn1 encticketpart);


shishi_encticketpart_authtime ()

int                 shishi_encticketpart_authtime       (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char *authtime,
                                                         size_t *authtimelen);


shishi_encticketpart_authtime_set ()

int                 shishi_encticketpart_authtime_set   (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *authtime);

Set the EncTicketPart.authtime to supplied value.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

authtime :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_client ()

int                 shishi_encticketpart_client         (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **client,
                                                         size_t *clientlen);

Represent client principal name in EncTicketPart as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

encticketpart :

EncTicketPart variable to get client name from.

client :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_clientrealm ()

int                 shishi_encticketpart_clientrealm    (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **client,
                                                         size_t *clientlen);

Convert cname and realm fields from EncTicketPart to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

encticketpart :

EncTicketPart variable to get client name and realm from.

client :

pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_cname_set ()

int                 shishi_encticketpart_cname_set      (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_name_type name_type,
                                                         const char *principal);

Set the client name field in the EncTicketPart.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

principal :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_crealm ()

int                 shishi_encticketpart_crealm         (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         char **crealm,
                                                         size_t *crealmlen);


shishi_encticketpart_crealm_set ()

int                 shishi_encticketpart_crealm_set     (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *realm);

Set the realm field in the KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

realm :

input array with name of realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_endtime_set ()

int                 shishi_encticketpart_endtime_set    (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         const char *endtime);

Set the EncTicketPart.endtime to supplied value.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

endtime :

character buffer containing a generalized time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_flags_set ()

int                 shishi_encticketpart_flags_set      (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         int flags);

Set the EncTicketPart.flags to supplied value.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

flags :

flags to set in encticketpart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_get_key ()

int                 shishi_encticketpart_get_key        (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_key **key);

Extract the session key in the Ticket.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

key :

newly allocated key.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_key_set ()

int                 shishi_encticketpart_key_set        (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         Shishi_key *key);

Set the EncTicketPart.key field to key type and value of supplied key.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

key :

key handle with information to store in encticketpart.

Returns :

Returns SHISHI_OK iff successful.

shishi_encticketpart_print ()

int                 shishi_encticketpart_print          (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 encticketpart);


shishi_encticketpart_transited_set ()

int                 shishi_encticketpart_transited_set  (Shishi *handle,
                                                         Shishi_asn1 encticketpart,
                                                         int32_t trtype,
                                                         const char *trdata,
                                                         size_t trdatalen);

Set the EncTicketPart.transited field to supplied value.

handle :

shishi handle as allocated by shishi_init().

encticketpart :

input EncTicketPart variable.

trtype :

transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS.

trdata :

actual transited realm data.

trdatalen :

length of actual transited realm data.

Returns :

Returns SHISHI_OK iff successful.

shishi_error ()

const char *        shishi_error                        (Shishi *handle);

Extract detailed error information string. Note that the memory is managed by the Shishi library, so you must not deallocate the string.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns pointer to error information string, that must not be deallocate by caller.

shishi_error_clear ()

void                shishi_error_clear                  (Shishi *handle);

Clear the detailed error information string. See shishi_error() for how to access the error string, and shishi_error_set() and shishi_error_printf() for how to set the error string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

handle :

shishi handle as allocated by shishi_init().

shishi_error_outputtype ()

int                 shishi_error_outputtype             (Shishi *handle);

Get the current output type for logging messages.

handle :

shishi handle as allocated by shishi_init().

Returns :

Return output type (NULL, stderr or syslog) for informational and warning messages.

shishi_error_printf ()

void                shishi_error_printf                 (Shishi *handle,
                                                         const char *format,
                                                         ...);

Set the detailed error information string to a printf formatted string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

handle :

shishi handle as allocated by shishi_init().

format :

printf style format string.

... :

print style arguments.

shishi_error_set ()

void                shishi_error_set                    (Shishi *handle,
                                                         const char *errstr);

Set the detailed error information string to specified string. The string is copied into the Shishi internal structure, so you can deallocate the string passed to this function after the call. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

handle :

shishi handle as allocated by shishi_init().

errstr :

Zero terminated character array containing error description, or NULL to clear the error description string.

shishi_error_set_outputtype ()

void                shishi_error_set_outputtype         (Shishi *handle,
                                                         int type);

Set output type (NULL, stderr or syslog) for informational and warning messages.

handle :

shishi handle as allocated by shishi_init().

type :

output type.

shishi_etype_info2_print ()

int                 shishi_etype_info2_print            (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 etypeinfo2);


shishi_etype_info_print ()

int                 shishi_etype_info_print             (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 etypeinfo);


shishi_generalize_ctime ()

time_t              shishi_generalize_ctime             (Shishi *handle,
                                                         const char *t);

Convert KerberosTime to C time.

handle :

shishi handle as allocated by shishi_init().

t :

KerberosTime to convert.

Returns :

Returns C time corresponding to KerberosTime t.

shishi_generalize_now ()

const char *        shishi_generalize_now               (Shishi *handle);

Convert current time to KerberosTime. The string must not be deallocate by caller.

handle :

shishi handle as allocated by shishi_init().

Returns :

Return a KerberosTime time string corresponding to current time.

shishi_generalize_time ()

const char *        shishi_generalize_time              (Shishi *handle,
                                                         time_t t);

Convert C time to KerberosTime. The string must not be deallocate by caller.

handle :

shishi handle as allocated by shishi_init().

t :

C time to convert.

Returns :

Return a KerberosTime time string corresponding to C time t.

shishi_get_date ()

time_t              shishi_get_date                     (const char *p,
                                                         const time_t *now);


shishi_hmac_md5 ()

int                 shishi_hmac_md5                     (Shishi *handle,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *outhash[16]);

Compute keyed checksum of data using HMAC-MD5. The outhash buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

key :

input character array with key to use.

keylen :

length of input character array with key to use.

in :

input character array of data to hash.

inlen :

length of input character array of data to hash.

outhash :

newly allocated character array with keyed hash of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_hmac_sha1 ()

int                 shishi_hmac_sha1                    (Shishi *handle,
                                                         const char *key,
                                                         size_t keylen,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *outhash[20]);

Compute keyed checksum of data using HMAC-SHA1. The outhash buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

key :

input character array with key to use.

keylen :

length of input character array with key to use.

in :

input character array of data to hash.

inlen :

length of input character array of data to hash.

outhash :

newly allocated character array with keyed hash of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_hostkeys_default_file ()

const char *        shishi_hostkeys_default_file        (Shishi *handle);

Get file name of default host key file.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default host key filename used in the library. (Not a copy of it, so don't modify or deallocate it.)

shishi_hostkeys_default_file_set ()

void                shishi_hostkeys_default_file_set    (Shishi *handle,
                                                         const char *hostkeysfile);

Set the default host key filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

hostkeysfile :

string with new default hostkeys file name, or NULL to reset to default.

shishi_hostkeys_for_localservice ()

Shishi_key *        shishi_hostkeys_for_localservice    (Shishi *handle,
                                                         const char *service);

Get host key for service on current host in default realm.

handle :

Shishi library handle create by shishi_init().

service :

service to get key for.

Returns :

Returns the key for the server "SERVICE/HOSTNAME" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

shishi_hostkeys_for_localservicerealm ()

Shishi_key *        shishi_hostkeys_for_localservicerealm
                                                        (Shishi *handle,
                                                         const char *service,
                                                         const char *realm);

Get host key for service on current host in realm.

handle :

Shishi library handle create by shishi_init().

service :

service to get key for.

realm :

realm of server to get key for, or NULL for default realm.

Returns :

Returns the key for the server "SERVICE/HOSTNAMEREALM" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

shishi_hostkeys_for_server ()

Shishi_key *        shishi_hostkeys_for_server          (Shishi *handle,
                                                         const char *server);

Get host key for server.

handle :

Shishi library handle create by shishi_init().

server :

server name to get key for

Returns :

Returns the key for specific server, read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

shishi_hostkeys_for_serverrealm ()

Shishi_key *        shishi_hostkeys_for_serverrealm     (Shishi *handle,
                                                         const char *server,
                                                         const char *realm);

Get host key for server in realm.

handle :

Shishi library handle create by shishi_init().

server :

server name to get key for

realm :

realm of server to get key for.

Returns :

Returns the key for specific server and realm, read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

shishi_info ()

void                shishi_info                         (Shishi *handle,
                                                         const char *format,
                                                         ...);

Print informational message to output as defined in handle.

handle :

shishi handle as allocated by shishi_init().

format :

printf style format string.

... :

print style arguments.

shishi_init ()

int                 shishi_init                         (Shishi **handle);

Create a Shishi library handle, using shishi(), and read the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket.

The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

handle :

pointer to handle to be created.

Returns :

Returns SHISHI_OK iff successful.

shishi_init_server ()

int                 shishi_init_server                  (Shishi **handle);

Create a Shishi library handle, using shishi_server(), and read the system configuration file. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf.

The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.)

handle :

pointer to handle to be created.

Returns :

Returns SHISHI_OK iff successful.

shishi_init_server_with_paths ()

int                 shishi_init_server_with_paths       (Shishi **handle,
                                                         const char *systemcfgfile);

Create a Shishi library handle, using shishi_server(), and read the system configuration file from specified location. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.)

handle :

pointer to handle to be created.

systemcfgfile :

Filename of system configuration, or NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_init_with_paths ()

int                 shishi_init_with_paths              (Shishi **handle,
                                                         const char *tktsfile,
                                                         const char *systemcfgfile,
                                                         const char *usercfgfile);

Create a Shishi library handle, using shishi(), and read the system configuration file, user configuration file, and user tickets from the specified locations. If any of usercfgfile or systemcfgfile is NULL, the file is read from its default location, which for the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration file is $HOME/.shishi/config. If the ticket file is NULL, a ticket file is not read at all.

The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

handle :

pointer to handle to be created.

tktsfile :

Filename of ticket file, or NULL.

systemcfgfile :

Filename of system configuration, or NULL.

usercfgfile :

Filename of user configuration, or NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdc_check_nonce ()

int                 shishi_kdc_check_nonce              (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 enckdcreppart);

Verify that KDC-REQ.req-body.nonce and EncKDCRepPart.nonce fields matches. This is one of the steps that has to be performed when processing a KDC-REQ and KDC-REP exchange.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to compare nonce field in.

enckdcreppart :

Encrypted KDC-REP part to compare nonce field in.

Returns :

Returns SHISHI_OK if successful, SHISHI_NONCE_LENGTH_MISMATCH if the nonces have different lengths (usually indicates that buggy server truncated nonce to 4 bytes), SHISHI_NONCE_MISMATCH if the values differ, or an error code.

shishi_kdc_copy_cname ()

int                 shishi_kdc_copy_cname               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 encticketpart);

Set cname in KDC-REP to value in EncTicketPart.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REQ to read cname from.

encticketpart :

EncTicketPart to set cname in.

Returns :

Returns SHISHI_OK if successful.

shishi_kdc_copy_crealm ()

int                 shishi_kdc_copy_crealm              (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 encticketpart);

Set crealm in KDC-REP to value in EncTicketPart.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to read crealm from.

encticketpart :

EncTicketPart to set crealm in.

Returns :

Returns SHISHI_OK if successful.

shishi_kdc_copy_nonce ()

int                 shishi_kdc_copy_nonce               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 enckdcreppart);

Set nonce in EncKDCRepPart to value in KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to read nonce from.

enckdcreppart :

EncKDCRepPart to set nonce in.

Returns :

Returns SHISHI_OK if successful.

shishi_kdc_print ()

int                 shishi_kdc_print                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 asreq,
                                                         Shishi_asn1 asrep,
                                                         Shishi_asn1 encasreppart);


shishi_kdc_process ()

int                 shishi_kdc_process                  (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *enckdcreppart);

Process a KDC client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. Use shishi_kdcrep_get_ticket() to extract the ticket. This function verifies the various conditions that must hold if the response is to be considered valid, specifically it compares nonces (shishi_kdc_check_nonce()) and if the exchange was a AS exchange, it also compares cname and crealm (shishi_as_check_cname() and shishi_as_check_crealm()).

Usually the shishi_as_process() and shishi_tgs_process() functions should be used instead, since they simplify the decryption key computation.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

input variable that holds the sent KDC-REQ.

kdcrep :

input variable that holds the received KDC-REP.

key :

input array with key to decrypt encrypted part of KDC-REP with.

keyusage :

kereros key usage value.

enckdcreppart :

output variable that holds new EncKDCRepPart.

Returns :

Returns SHISHI_OK iff the KDC client exchange was successful.

shishi_kdc_sendrecv ()

int                 shishi_kdc_sendrecv                 (Shishi *handle,
                                                         const char *realm,
                                                         const char *indata,
                                                         size_t inlen,
                                                         char **outdata,
                                                         size_t *outlen);

Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname.

handle :

Shishi library handle create by shishi_init().

realm :

string with realm name.

indata :

Packet to send to KDC.

inlen :

Length of indata.

outdata :

Newly allocated string with data returned from KDC.

outlen :

Length of outdata.

Returns :

SHISHI_OK on success, SHISHI_KDC_TIMEOUT if a timeout was reached, or other errors.

shishi_kdc_sendrecv_hint ()

int                 shishi_kdc_sendrecv_hint            (Shishi *handle,
                                                         const char *realm,
                                                         const char *indata,
                                                         size_t inlen,
                                                         char **outdata,
                                                         size_t *outlen,
                                                         Shishi_tkts_hint *hint);

Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname.

handle :

Shishi library handle create by shishi_init().

realm :

string with realm name.

indata :

Packet to send to KDC.

inlen :

Length of indata.

outdata :

Newly allocated string with data returned from KDC.

outlen :

Length of outdata.

hint :

a Shishi_tkts_hint structure with flags.

Returns :

SHISHI_OK on success, SHISHI_KDC_TIMEOUT if a timeout was reached, or other errors.

shishi_kdcrep_add_enc_part ()

int                 shishi_kdcrep_add_enc_part          (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 enckdcreppart);

Encrypts DER encoded EncKDCRepPart using key and stores it in the KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to add enc-part field to.

key :

key used to encrypt enc-part.

keyusage :

key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY.

enckdcreppart :

EncKDCRepPart to add.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_clear_padata ()

int                 shishi_kdcrep_clear_padata          (Shishi *handle,
                                                         Shishi_asn1 kdcrep);

Remove the padata field from KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to remove PA-DATA from.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_client_set ()

int                 shishi_kdcrep_client_set            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *client);

Set the client name field in the KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

Kdcrep variable to set server name field in.

client :

zero-terminated string with principal name on RFC 1964 form.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_cname_set ()

int                 shishi_kdcrep_cname_set             (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);

Set the client name field in the KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

Kdcrep variable to set server name field in.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

cname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_crealm_set ()

int                 shishi_kdcrep_crealm_set            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *crealm);

Set the client realm field in the KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

Kdcrep variable to set realm field in.

crealm :

input array with name of realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_crealmserver_set ()

int                 shishi_kdcrep_crealmserver_set      (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         const char *crealm,
                                                         const char *client);


shishi_kdcrep_decrypt ()

int                 shishi_kdcrep_decrypt               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         Shishi_asn1 *enckdcreppart);


shishi_kdcrep_from_file ()

int                 shishi_kdcrep_from_file             (Shishi *handle,
                                                         Shishi_asn1 *kdcrep,
                                                         int filetype,
                                                         const char *filename);

Read KDC-REP from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

output variable with newly allocated KDC-REP.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_get_enc_part_etype ()

int                 shishi_kdcrep_get_enc_part_etype    (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int32_t *etype);

Extract KDC-REP.enc-part.etype.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP variable to get value from.

etype :

output variable that holds the value.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_get_ticket ()

int                 shishi_kdcrep_get_ticket            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 *ticket);

Extract ticket from KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP variable to get ticket from.

ticket :

output variable to hold extracted ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_parse ()

int                 shishi_kdcrep_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcrep);

Read ASCII armored DER encoded KDC-REP from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

kdcrep :

output variable with newly allocated KDC-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_print ()

int                 shishi_kdcrep_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcrep);

Print ASCII armored DER encoding of KDC-REP to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

kdcrep :

KDC-REP to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_read ()

int                 shishi_kdcrep_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcrep);

Read DER encoded KDC-REP from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

kdcrep :

output variable with newly allocated KDC-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_save ()

int                 shishi_kdcrep_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcrep);

Print DER encoding of KDC-REP to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

kdcrep :

KDC-REP to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_set_enc_part ()

int                 shishi_kdcrep_set_enc_part          (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);

Set the encrypted enc-part field in the KDC-REP. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded enc-part. To save time, you may want to use shishi_kdcrep_add_enc_part() instead, which calculates the encrypted data and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to add enc-part field to.

etype :

encryption type used to encrypt enc-part.

kvno :

key version number.

buf :

input array with encrypted enc-part.

buflen :

size of input array with encrypted enc-part.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_set_ticket ()

int                 shishi_kdcrep_set_ticket            (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         Shishi_asn1 ticket);

Copy ticket into KDC-REP.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to add ticket field to.

ticket :

input ticket to copy into KDC-REP ticket field.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcrep_to_file ()

int                 shishi_kdcrep_to_file               (Shishi *handle,
                                                         Shishi_asn1 kdcrep,
                                                         int filetype,
                                                         const char *filename);

Write KDC-REP to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

kdcrep :

KDC-REP to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq ()

int                 shishi_kdcreq                       (Shishi *handle,
                                                         char *realm,
                                                         char *service,
                                                         Shishi_asn1 *req);


shishi_kdcreq_add_padata ()

int                 shishi_kdcreq_add_padata            (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int padatatype,
                                                         const char *data,
                                                         size_t datalen);

Add new pre authentication data (PA-DATA) to KDC-REQ. This is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket. (But also see shishi_kdcreq_add_padata_tgs() which takes an AP-REQ directly.)

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to add PA-DATA to.

padatatype :

type of PA-DATA, see Shishi_padata_type.

data :

input array with PA-DATA value.

datalen :

size of input array with PA-DATA value.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_add_padata_preauth ()

int                 shishi_kdcreq_add_padata_preauth    (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_key *key);

Add pre-authentication data to KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to add pre-authentication data to.

key :

Key used to encrypt pre-auth data.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_add_padata_tgs ()

int                 shishi_kdcreq_add_padata_tgs        (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 apreq);

Add TGS pre-authentication data to KDC-REQ. The data is an AP-REQ that authenticates the request. This functions simply DER encodes the AP-REQ and calls shishi_kdcreq_add_padata() with a SHISHI_PA_TGS_REQ padatatype.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to add PA-DATA to.

apreq :

AP-REQ to add as PA-DATA.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_allow_postdate_p ()

int                 shishi_kdcreq_allow_postdate_p      (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option allow-postdate flag is set.

The ALLOW-POSTDATE option indicates that the ticket to be issued is to have its MAY-POSTDATE flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based also has its MAY-POSTDATE flag set.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff allow-postdate flag is set in KDC-REQ.

shishi_kdcreq_build ()

int                 shishi_kdcreq_build                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq);


shishi_kdcreq_clear_padata ()

int                 shishi_kdcreq_clear_padata          (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Remove the padata field from KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to remove PA-DATA from.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_client ()

int                 shishi_kdcreq_client                (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **client,
                                                         size_t *clientlen);

Represent client principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

kdcreq :

KDC-REQ variable to get client name from.

client :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_disable_transited_check_p ()

int                 shishi_kdcreq_disable_transited_check_p
                                                        (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option disable-transited-check flag is set.

By default the KDC will check the transited field of a ticket-granting-ticket against the policy of the local realm before it will issue derivative tickets based on the ticket-granting ticket. If this flag is set in the request, checking of the transited field is disabled. Tickets issued without the performance of this check will be noted by the reset (0) value of the TRANSITED-POLICY-CHECKED flag, indicating to the application server that the tranisted field must be checked locally. KDCs are encouraged but not required to honor the DISABLE-TRANSITED-CHECK option.

This flag is new since RFC 1510

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff disable-transited-check flag is set in KDC-REQ.

shishi_kdcreq_enc_tkt_in_skey_p ()

int                 shishi_kdcreq_enc_tkt_in_skey_p     (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option enc-tkt-in-skey flag is set.

This option is used only by the ticket-granting service. The ENC-TKT-IN-SKEY option indicates that the ticket for the end server is to be encrypted in the session key from the additional ticket-granting ticket provided.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff enc-tkt-in-skey flag is set in KDC-REQ.

shishi_kdcreq_etype ()

int                 shishi_kdcreq_etype                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int32_t *etype,
                                                         int netype);

Return the netype:th encryption type from KDC-REQ. The first etype is number 1.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get etype field from.

etype :

output encryption type.

netype :

element number to return.

Returns :

Returns SHISHI_OK iff etype successful set.

shishi_kdcreq_forwardable_p ()

int                 shishi_kdcreq_forwardable_p         (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option forwardable flag is set.

The FORWARDABLE option indicates that the ticket to be issued is to have its forwardable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also forwardable.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff forwardable flag is set in KDC-REQ.

shishi_kdcreq_forwarded_p ()

int                 shishi_kdcreq_forwarded_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option forwarded flag is set.

The FORWARDED option is only specified in a request to the ticket-granting server and will only be honored if the ticket-granting ticket in the request has its FORWARDABLE bit set. This option indicates that this is a request for forwarding. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff forwarded flag is set in KDC-REQ.

shishi_kdcreq_from_file ()

int                 shishi_kdcreq_from_file             (Shishi *handle,
                                                         Shishi_asn1 *kdcreq,
                                                         int filetype,
                                                         const char *filename);

Read KDC-REQ from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

output variable with newly allocated KDC-REQ.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_get_padata ()

int                 shishi_kdcreq_get_padata            (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_padata_type padatatype,
                                                         char **out,
                                                         size_t *outlen);

Get pre authentication data (PA-DATA) from KDC-REQ. Pre authentication data is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to get PA-DATA from.

padatatype :

type of PA-DATA, see Shishi_padata_type.

out :

output array with newly allocated PA-DATA value.

outlen :

size of output array with PA-DATA value.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_get_padata_tgs ()

int                 shishi_kdcreq_get_padata_tgs        (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *apreq);

Extract TGS pre-authentication data from KDC-REQ. The data is an AP-REQ that authenticates the request. This function call shishi_kdcreq_get_padata() with a SHISHI_PA_TGS_REQ padatatype and DER decode the result (if any).

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to get PA-TGS-REQ from.

apreq :

Output variable with newly allocated AP-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_nonce ()

int                 shishi_kdcreq_nonce                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t *nonce);


shishi_kdcreq_nonce_set ()

int                 shishi_kdcreq_nonce_set             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t nonce);

Store nonce number field in KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set client name field in.

nonce :

integer nonce to store in KDC-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_options ()

int                 shishi_kdcreq_options               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t *flags);

Extract KDC-Options from KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

flags :

pointer to output integer with flags.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_options_add ()

int                 shishi_kdcreq_options_add           (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t option);

Add KDC-Option to KDC-REQ. This preserves all existing options.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set etype field in.

option :

integer with options to add in KDC-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_options_set ()

int                 shishi_kdcreq_options_set           (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         uint32_t options);

Set options in KDC-REQ. Note that this reset any already existing flags.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set etype field in.

options :

integer with flags to store in KDC-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_parse ()

int                 shishi_kdcreq_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcreq);

Read ASCII armored DER encoded KDC-REQ from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

kdcreq :

output variable with newly allocated KDC-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_postdated_p ()

int                 shishi_kdcreq_postdated_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option postdated flag is set.

The POSTDATED option indicates that this is a request for a postdated ticket. This option will only be honored if the ticket-granting ticket on which it is based has its MAY-POSTDATE flag set. The resulting ticket will also have its INVALID flag set, and that flag may be reset by a subsequent request to the KDC after the starttime in the ticket has been reached.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff postdated flag is set in KDC-REQ.

shishi_kdcreq_print ()

int                 shishi_kdcreq_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcreq);

Print ASCII armored DER encoding of KDC-REQ to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

kdcreq :

KDC-REQ to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_proxiable_p ()

int                 shishi_kdcreq_proxiable_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option proxiable flag is set.

The PROXIABLE option indicates that the ticket to be issued is to have its proxiable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also proxiable.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff proxiable flag is set in KDC-REQ.

shishi_kdcreq_proxy_p ()

int                 shishi_kdcreq_proxy_p               (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option proxy flag is set.

The PROXY option indicates that this is a request for a proxy. This option will only be honored if the ticket-granting ticket in the request has its PROXIABLE bit set. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff proxy flag is set in KDC-REQ.

shishi_kdcreq_read ()

int                 shishi_kdcreq_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *kdcreq);

Read DER encoded KDC-REQ from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

kdcreq :

output variable with newly allocated KDC-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_realm ()

int                 shishi_kdcreq_realm                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **realm,
                                                         size_t *realmlen);

Get realm field in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length realmlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

kdcreq :

KDC-REQ variable to get client name from.

realm :

pointer to newly allocated zero terminated string containing realm. May be NULL (to only populate realmlen).

realmlen :

pointer to length of realm on output, excluding terminating zero. May be NULL (to only populate realmlen).

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_realm_get ()

int                 shishi_kdcreq_realm_get             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **realm,
                                                         size_t *realmlen);


shishi_kdcreq_renew_p ()

int                 shishi_kdcreq_renew_p               (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option renew flag is set.

This option is used only by the ticket-granting service. The RENEW option indicates that the present request is for a renewal. The ticket provided is encrypted in the secret key for the server on which it is valid. This option will only be honored if the ticket to be renewed has its RENEWABLE flag set and if the time in its renew-till field has not passed. The ticket to be renewed is passed in the padata field as part of the authentication header.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff renew flag is set in KDC-REQ.

shishi_kdcreq_renewable_ok_p ()

int                 shishi_kdcreq_renewable_ok_p        (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option renewable-ok flag is set.

The RENEWABLE-OK option indicates that a renewable ticket will be acceptable if a ticket with the requested life cannot otherwise be provided. If a ticket with the requested life cannot be provided, then a renewable ticket may be issued with a renew-till equal to the requested endtime. The value of the renew-till field may still be limited by local limits, or limits selected by the individual principal or server.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff renewable-ok flag is set in KDC-REQ.

shishi_kdcreq_renewable_p ()

int                 shishi_kdcreq_renewable_p           (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option renewable flag is set.

The RENEWABLE option indicates that the ticket to be issued is to have its RENEWABLE flag set. It may only be set on the initial request, or when the ticket-granting ticket on which the request is based is also renewable. If this option is requested, then the rtime field in the request contains the desired absolute expiration time for the ticket.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff renewable flag is set in KDC-REQ.

shishi_kdcreq_save ()

int                 shishi_kdcreq_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 kdcreq);

Print DER encoding of KDC-REQ to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

kdcreq :

KDC-REQ to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_sendrecv ()

int                 shishi_kdcreq_sendrecv              (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *kdcrep);


shishi_kdcreq_sendrecv_hint ()

int                 shishi_kdcreq_sendrecv_hint         (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_asn1 *kdcrep,
                                                         Shishi_tkts_hint *hint);


shishi_kdcreq_server ()

int                 shishi_kdcreq_server                (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **server,
                                                         size_t *serverlen);

Represent server principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

kdcreq :

KDC-REQ variable to get server name from.

server :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

serverlen :

pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_set_cname ()

int                 shishi_kdcreq_set_cname             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_name_type name_type,
                                                         const char *principal);

Set the client name field in the KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set client name field in.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

principal :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_set_etype ()

int                 shishi_kdcreq_set_etype             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int32_t *etype,
                                                         int netype);

Set the list of supported or wanted encryption types in the request. The list should be sorted in priority order.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set etype field in.

etype :

input array with encryption types.

netype :

number of elements in input array with encryption types.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_set_realm ()

int                 shishi_kdcreq_set_realm             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         const char *realm);

Set the realm field in the KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set realm field in.

realm :

input array with name of realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_set_realmserver ()

int                 shishi_kdcreq_set_realmserver       (Shishi *handle,
                                                         Shishi_asn1 req,
                                                         char *realm,
                                                         char *service);


shishi_kdcreq_set_server ()

int                 shishi_kdcreq_set_server            (Shishi *handle,
                                                         Shishi_asn1 req,
                                                         const char *service);


shishi_kdcreq_set_sname ()

int                 shishi_kdcreq_set_sname             (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         Shishi_name_type name_type,
                                                         const char *sname[]);

Set the server name field in the KDC-REQ.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to set server name field in.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

sname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_till ()

int                 shishi_kdcreq_till                  (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         char **till,
                                                         size_t *tilllen);

Get "till" field (i.e. "endtime") in KDC-REQ, as zero-terminated string. The string is typically 15 characters long. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length realmlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

kdcreq :

KDC-REQ variable to get client name from.

till :

pointer to newly allocated zero terminated string containing "till" field with generalized time. May be NULL (to only populate realmlen).

tilllen :

pointer to length of till on output, excluding terminating zero. May be NULL (to only populate tilllen).

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_tillc ()

time_t              shishi_kdcreq_tillc                 (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Extract C time corresponding to the "till" field.

handle :

Shishi library handle create by shishi_init().

kdcreq :

KDC-REQ variable to get till field from.

Returns :

Returns C time interpretation of the "till" field in KDC-REQ.

shishi_kdcreq_to_file ()

int                 shishi_kdcreq_to_file               (Shishi *handle,
                                                         Shishi_asn1 kdcreq,
                                                         int filetype,
                                                         const char *filename);

Write KDC-REQ to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_kdcreq_validate_p ()

int                 shishi_kdcreq_validate_p            (Shishi *handle,
                                                         Shishi_asn1 kdcreq);

Determine if KDC-Option validate flag is set.

This option is used only by the ticket-granting service. The VALIDATE option indicates that the request is to validate a postdated ticket. It will only be honored if the ticket presented is postdated, presently has its INVALID flag set, and would be otherwise usable at this time. A ticket cannot be validated before its starttime. The ticket presented for validation is encrypted in the key of the server for which it is valid and is passed in the padata field as part of the authentication header.

handle :

shishi handle as allocated by shishi_init().

kdcreq :

KDC-REQ variable to get kdc-options field from.

Returns :

Returns non-0 iff validate flag is set in KDC-REQ.

shishi_key ()

int                 shishi_key                          (Shishi *handle,
                                                         Shishi_key **key);

Create a new Key information structure.

handle :

Shishi library handle create by shishi_init().

key :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_copy ()

void                shishi_key_copy                     (Shishi_key *dstkey,
                                                         Shishi_key *srckey);

Copies source key into existing allocated destination key.

dstkey :

structure that holds destination key information

srckey :

structure that holds source key information

shishi_key_done ()

void                shishi_key_done                     (Shishi_key *key);

Deallocates key information structure.

key :

pointer to structure that holds key information.

shishi_key_from_base64 ()

int                 shishi_key_from_base64              (Shishi *handle,
                                                         int32_t type,
                                                         const char *value,
                                                         Shishi_key **key);

Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

value :

input string with base64 encoded key value, or NULL.

key :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_INVALID_KEY if the base64 encoded key length doesn't match the key type, and SHISHI_OK on success.

shishi_key_from_name ()

int                 shishi_key_from_name                (Shishi *handle,
                                                         int32_t type,
                                                         const char *name,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *parameter,
                                                         Shishi_key **outkey);

Create a new Key information structure, and derive the key from principal name and password using shishi_key_from_name(). The salt is derived from the principal name by concatenating the decoded realm and principal.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

name :

principal name of user.

password :

input array containing password.

passwordlen :

length of input array containing password.

parameter :

input array with opaque encryption type specific information.

outkey :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_from_random ()

int                 shishi_key_from_random              (Shishi *handle,
                                                         int32_t type,
                                                         const char *rnd,
                                                         size_t rndlen,
                                                         Shishi_key **outkey);

Create a new Key information structure, and set the key type and key value using shishi_random_to_key(). KEY contains a newly allocated structure only if this function is successful.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

rnd :

random data.

rndlen :

length of random data.

outkey :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_from_string ()

int                 shishi_key_from_string              (Shishi *handle,
                                                         int32_t type,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *salt,
                                                         size_t saltlen,
                                                         const char *parameter,
                                                         Shishi_key **outkey);

Create a new Key information structure, and set the key type and key value using shishi_string_to_key(). KEY contains a newly allocated structure only if this function is successful.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

password :

input array containing password.

passwordlen :

length of input array containing password.

salt :

input array containing salt.

saltlen :

length of input array containing salt.

parameter :

input array with opaque encryption type specific information.

outkey :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_from_value ()

int                 shishi_key_from_value               (Shishi *handle,
                                                         int32_t type,
                                                         const char *value,
                                                         Shishi_key **key);

Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

value :

input array with key value, or NULL.

key :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_length ()

size_t              shishi_key_length                   (const Shishi_key *key);

Calls shishi_cipher_keylen for key type.

key :

structure that holds key information

Returns :

Returns the length of the key value.

shishi_key_name ()

const char *        shishi_key_name                     (Shishi_key *key);

Calls shishi_cipher_name for key type.

key :

structure that holds key information

Returns :

Return name of key.

shishi_key_parse ()

int                 shishi_key_parse                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_key **key);


shishi_key_principal ()

const char *        shishi_key_principal                (const Shishi_key *key);

Get the principal part of the key owner principal name, i.e., except the realm.

key :

structure that holds key information

Returns :

Returns the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

shishi_key_principal_set ()

void                shishi_key_principal_set            (Shishi_key *key,
                                                         const char *principal);

Set the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

key :

structure that holds key information

principal :

string with new principal name.

shishi_key_print ()

int                 shishi_key_print                    (Shishi *handle,
                                                         FILE *fh,
                                                         const Shishi_key *key);

Print an ASCII representation of a key structure to file descriptor. Example output:

-----BEGIN SHISHI KEY----- Keytype: 18 (aes256-cts-hmac-sha1-96) Principal: host/latte.josefsson.org Realm: JOSEFSSON.ORG Key-Version-Number: 1

P1QdeW/oSiag/bTyVEBAY2msiGSTmgLXlopuCKoppDs= -----END SHISHI KEY-----

handle :

shishi handle as allocated by shishi_init().

fh :

file handle opened for writing.

key :

key to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_key_random ()

int                 shishi_key_random                   (Shishi *handle,
                                                         int32_t type,
                                                         Shishi_key **key);

Create a new Key information structure for the key type and some random data. KEY contains a newly allocated structure only if this function is successful.

handle :

Shishi library handle create by shishi_init().

type :

type of key.

key :

pointer to structure that will hold newly created key information

Returns :

Returns SHISHI_OK iff successful.

shishi_key_realm ()

const char *        shishi_key_realm                    (const Shishi_key *key);

Get the realm part of the key owner principal name.

key :

structure that holds key information

Returns :

Returns the realm for the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

shishi_key_realm_set ()

void                shishi_key_realm_set                (Shishi_key *key,
                                                         const char *realm);

Set the realm for the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

key :

structure that holds key information

realm :

string with new realm name.

shishi_key_timestamp ()

time_t              shishi_key_timestamp                (const Shishi_key *key);

Get the time the key was established. Typically only present when the key was imported from a keytab format.

key :

structure that holds key information

Returns :

Returns the time the key was established, or (time_t)-1 if not available.

Since 0.0.42


shishi_key_timestamp_set ()

void                shishi_key_timestamp_set            (Shishi_key *key,
                                                         time_t timestamp);

Set the time the key was established. Typically only relevant when exporting the key to keytab format.

key :

structure that holds key information

timestamp :

new timestamp.

Since 0.0.42


shishi_key_to_file ()

int                 shishi_key_to_file                  (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_key *key);

Print an ASCII representation of a key structure to a file. The file is appended to if it exists. See shishi_key_print() for format of output.

handle :

shishi handle as allocated by shishi_init().

filename :

filename to append key to.

key :

key to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_key_type ()

int                 shishi_key_type                     (const Shishi_key *key);

Get key type.

key :

structure that holds key information

Returns :

Returns the type of key as an integer as described in the standard.

shishi_key_type_set ()

void                shishi_key_type_set                 (Shishi_key *key,
                                                         int32_t type);

Set the type of key in key structure.

key :

structure that holds key information

type :

type to set in key.

shishi_key_value ()

const char *        shishi_key_value                    (const Shishi_key *key);

Get the raw key bytes.

key :

structure that holds key information

Returns :

Returns the key value as a pointer which is valid throughout the lifetime of the key structure.

shishi_key_value_set ()

void                shishi_key_value_set                (Shishi_key *key,
                                                         const char *value);

Set the key value and length in key structure. The value is copied into the key (in other words, you can deallocate value right after calling this function without modifying the value inside the key).

key :

structure that holds key information

value :

input array with key data.

shishi_key_version ()

uint32_t            shishi_key_version                  (const Shishi_key *key);

Get the "kvno" (key version) of key. It will be UINT32_MAX if the key is not long-lived.

key :

structure that holds key information

Returns :

Returns the version of key ("kvno").

shishi_key_version_set ()

void                shishi_key_version_set              (Shishi_key *key,
                                                         uint32_t kvno);

Set the version of key ("kvno") in key structure. Use UINT32_MAX for non-ptermanent keys.

key :

structure that holds key information

kvno :

new version integer.

shishi_keys ()

int                 shishi_keys                         (Shishi *handle,
                                                         Shishi_keys **keys);

Get a new key set handle.

handle :

shishi handle as allocated by shishi_init().

keys :

output pointer to newly allocated keys handle.

Returns :

Returns SHISHI_OK iff successful.

shishi_keys_add ()

int                 shishi_keys_add                     (Shishi_keys *keys,
                                                         Shishi_key *key);

Add a key to the key set. A deep copy of the key is stored, so changing key, or deallocating it, will not modify the value stored in the key set.

keys :

key set handle as allocated by shishi_keys().

key :

key to be added to key set.

Returns :

Returns SHISHI_OK iff successful.

shishi_keys_add_keytab_file ()

int                 shishi_keys_add_keytab_file         (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys *keys);

Read keys from a MIT keytab data structure from a file, and add the keys to the key set.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

filename :

name of file to read.

keys :

allocated key set to store keys in.

Returns :

Returns SHISHI_IO_ERROR if the file cannot be read, SHISHI_KEYTAB_ERROR if the data cannot be parsed as a valid keytab structure, and SHISHI_OK on success.

shishi_keys_add_keytab_mem ()

int                 shishi_keys_add_keytab_mem          (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_keys *keys);

Read keys from a MIT keytab data structure, and add them to the key set.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

data :

constant memory buffer with keytab of len size.

len :

size of memory buffer with keytab data.

keys :

allocated key set to store keys in.

Returns :

Returns SHISHI_KEYTAB_ERROR if the data does not represent a valid keytab structure, and SHISHI_OK on success.

shishi_keys_done ()

void                shishi_keys_done                    (Shishi_keys **keys);

Deallocates all resources associated with key set. The key set handle must not be used in calls to other shishi_keys_*() functions after this.

keys :

key set handle as allocated by shishi_keys().

shishi_keys_for_localservicerealm_in_file ()

Shishi_key *        shishi_keys_for_localservicerealm_in_file
                                                        (Shishi *handle,
                                                         const char *filename,
                                                         const char *service,
                                                         const char *realm);

Get key for specified service and realm from filename.

handle :

Shishi library handle create by shishi_init().

filename :

file to read keys from.

service :

service to get key for.

realm :

realm of server to get key for, or NULL for default realm.

Returns :

Returns the key for the server "SERVICE/HOSTNAMEREALM" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

shishi_keys_for_server_in_file ()

Shishi_key *        shishi_keys_for_server_in_file      (Shishi *handle,
                                                         const char *filename,
                                                         const char *server);

Get key for specified server from filename.

handle :

Shishi library handle create by shishi_init().

filename :

file to read keys from.

server :

server name to get key for.

Returns :

Returns the key for specific server, read from the indicated file, or NULL if no key could be found or an error encountered.

shishi_keys_for_serverrealm_in_file ()

Shishi_key *        shishi_keys_for_serverrealm_in_file (Shishi *handle,
                                                         const char *filename,
                                                         const char *server,
                                                         const char *realm);

Get keys that match specified server and realm from the key set file filename.

handle :

Shishi library handle create by shishi_init().

filename :

file to read keys from.

server :

server name to get key for.

realm :

realm of server to get key for.

Returns :

Returns the key for specific server and realm, read from the indicated file, or NULL if no key could be found or an error encountered.

shishi_keys_from_file ()

int                 shishi_keys_from_file               (Shishi_keys *keys,
                                                         const char *filename);

Read zero or more keys from file filename and append them to the keyset keys. See shishi_key_print() for the format of the input.

keys :

key set handle as allocated by shishi_keys().

filename :

filename to read keys from.

Returns :

Returns SHISHI_OK iff successful.

Since 0.0.42


shishi_keys_from_keytab_file ()

int                 shishi_keys_from_keytab_file        (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys **outkeys);

Create a new key set populated with keys from a MIT keytab data structure read from a file.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

filename :

name of file to read.

outkeys :

pointer to key set that will be allocated and populated, must be deallocated by caller on succes.

Returns :

Returns SHISHI_IO_ERROR if the file cannot be read, SHISHI_KEYTAB_ERROR if the data cannot be parsed as a valid keytab structure, and SHISHI_OK on success.

shishi_keys_from_keytab_mem ()

int                 shishi_keys_from_keytab_mem         (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_keys **outkeys);

Create a new key set populated with keys from a MIT keytab data structure read from a memory block.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

data :

constant memory buffer with keytab of len size.

len :

size of memory buffer with keytab data.

outkeys :

pointer to key set that will be allocated and populated, must be deallocated by caller on succes.

Returns :

Returns SHISHI_KEYTAB_ERROR if the data does not represent a valid keytab structure, and SHISHI_OK on success.

shishi_keys_nth ()

const Shishi_key *  shishi_keys_nth                     (Shishi_keys *keys,
                                                         int keyno);

Get the n:th ticket in key set.

keys :

key set handle as allocated by shishi_keys().

keyno :

integer indicating requested key in key set.

Returns :

Returns a key handle to the keyno:th key in the key set, or NULL if keys is invalid or keyno is out of bounds. The first key is keyno 0, the second key keyno 1, and so on.

shishi_keys_print ()

int                 shishi_keys_print                   (Shishi_keys *keys,
                                                         FILE *fh);

Print all keys in set using shishi_key_print.

keys :

key set to print.

fh :

file handle, open for writing, to print keys to.

Returns :

Returns SHISHI_OK on success.

shishi_keys_remove ()

void                shishi_keys_remove                  (Shishi_keys *keys,
                                                         int keyno);

Remove a key, indexed by keyno, in given key set.

keys :

key set handle as allocated by shishi_keys().

keyno :

key number of key in the set to remove. The first key is key number 0.

shishi_keys_size ()

int                 shishi_keys_size                    (Shishi_keys *keys);

Get size of key set.

keys :

key set handle as allocated by shishi_keys().

Returns :

Returns number of keys stored in key set.

shishi_keys_to_file ()

int                 shishi_keys_to_file                 (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_keys *keys);

Print an ASCII representation of a key structure to a file, for each key in the key set. The file is appended to if it exists. See shishi_key_print() for the format of the output.

handle :

shishi handle as allocated by shishi_init().

filename :

filename to append key to.

keys :

set of keys to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_keys_to_keytab_file ()

int                 shishi_keys_to_keytab_file          (Shishi *handle,
                                                         Shishi_keys *keys,
                                                         const char *filename);

Write keys to a MIT keytab data structure.

The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

keys :

keyset to write.

filename :

name of file to write.

Returns :

SHISHI_FOPEN_ERROR if there is a problem opening filename for writing, SHISHI_IO_ERROR if there is problem writing the file, and SHISHI_OK on success.

Since 0.0.42


shishi_keys_to_keytab_mem ()

int                 shishi_keys_to_keytab_mem           (Shishi *handle,
                                                         Shishi_keys *keys,
                                                         char **out,
                                                         size_t *len);

Write keys to a MIT keytab data structure.

The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

handle :

shishi handle as allocated by shishi_init().

keys :

key set to convert to keytab format.

out :

constant memory buffer with keytab of len size.

len :

size of memory buffer with keytab data.

Returns :

On success SHISHI_OK is returned, otherwise an error code.

Since 0.0.42


shishi_krberror ()

Shishi_asn1         shishi_krberror                     (Shishi *handle);

This function creates a new KRB-ERROR, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the KRB-ERROR or NULL on failure.

shishi_krberror_build ()

int                 shishi_krberror_build               (Shishi *handle,
                                                         Shishi_asn1 krberror);

Finish KRB-ERROR, called before e.g. shishi_krberror_der. This function removes empty but OPTIONAL fields (such as cname), and

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_client ()

int                 shishi_krberror_client              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **client,
                                                         size_t *clientlen);

Return client principal name in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

client :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_client_set ()

int                 shishi_krberror_client_set          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *client);

Set the client name field in the Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror to set client name field in.

client :

zero-terminated string with principal name on RFC 1964 form.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_crealm ()

int                 shishi_krberror_crealm              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **realm,
                                                         size_t *realmlen);

Extract client realm from KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

realm :

output array with newly allocated name of realm in KRB-ERROR.

realmlen :

size of output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_ctime ()

int                 shishi_krberror_ctime               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **t);

Extract client time from KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror to set client name field in.

t :

newly allocated zero-terminated output array with client time.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_ctime_set ()

int                 shishi_krberror_ctime_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *t);

Store client time in Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

t :

string with generalized time value to store in Krberror.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_cusec ()

int                 shishi_krberror_cusec               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t *cusec);

Extract client microseconds field from Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

cusec :

output integer with client microseconds field.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_cusec_set ()

int                 shishi_krberror_cusec_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t cusec);

Set the cusec field in the Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

cusec :

client microseconds to set in krberror, 0-999999.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_der ()

int                 shishi_krberror_der                 (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **out,
                                                         size_t *outlen);

DER encode KRB-ERROR. The caller must deallocate the OUT buffer.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

out :

output array with newly allocated DER encoding of KRB-ERROR.

outlen :

length of output array with DER encoding of KRB-ERROR.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_edata ()

int                 shishi_krberror_edata               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **edata,
                                                         size_t *edatalen);

Extract additional error data from server (possibly empty).

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

edata :

output array with newly allocated error data.

edatalen :

output length of error data.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_errorcode ()

int                 shishi_krberror_errorcode           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int *errorcode);

Extract error code from KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

errorcode :

output integer KRB-ERROR error code.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_errorcode_fast ()

int                 shishi_krberror_errorcode_fast      (Shishi *handle,
                                                         Shishi_asn1 krberror);

Get error code from KRB-ERROR, without error checking.

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

Returns :

Return error code (see shishi_krberror_errorcode()) directly, or -1 on error.

shishi_krberror_errorcode_message ()

const char *        shishi_krberror_errorcode_message   (Shishi *handle,
                                                         int errorcode);

Get human readable string describing KRB-ERROR code.

handle :

shishi handle as allocated by shishi_init().

errorcode :

integer KRB-ERROR error code.

Returns :

Return a string describing error code. This function will always return a string even if the error code isn't known.

shishi_krberror_errorcode_set ()

int                 shishi_krberror_errorcode_set       (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int errorcode);

Set the error-code field to a new error code.

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code to set.

errorcode :

new error code to set in krberror.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_etext ()

int                 shishi_krberror_etext               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **etext,
                                                         size_t *etextlen);

Extract additional error text from server (possibly empty).

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

etext :

output array with newly allocated error text.

etextlen :

output length of error text.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_from_file ()

int                 shishi_krberror_from_file           (Shishi *handle,
                                                         Shishi_asn1 *krberror,
                                                         int filetype,
                                                         const char *filename);

Read KRB-ERROR from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

krberror :

output variable with newly allocated KRB-ERROR.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_message ()

const char *        shishi_krberror_message             (Shishi *handle,
                                                         Shishi_asn1 krberror);

Extract error code (see shishi_krberror_errorcode_fast()) and return error message (see shishi_krberror_errorcode_message()).

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

Returns :

Return a string describing error code. This function will always return a string even if the error code isn't known.

shishi_krberror_methoddata ()

int                 shishi_krberror_methoddata          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_asn1 *methoddata);

Extract METHOD-DATA ASN.1 object from the e-data field. The e-data field will only contain a METHOD-DATA if the krberror error code is SHISHI_KDC_ERR_PREAUTH_REQUIRED.

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR structure with error code.

methoddata :

output ASN.1 METHOD-DATA.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_parse ()

int                 shishi_krberror_parse               (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *krberror);

Read ASCII armored DER encoded KRB-ERROR from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

krberror :

output variable with newly allocated KRB-ERROR.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_pretty_print ()

int                 shishi_krberror_pretty_print        (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);

Print KRB-ERROR error condition and some explanatory text to file descriptor.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle opened for writing.

krberror :

KRB-ERROR structure with error code.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_print ()

int                 shishi_krberror_print               (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);

Print ASCII armored DER encoding of KRB-ERROR to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

krberror :

KRB-ERROR to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_read ()

int                 shishi_krberror_read                (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *krberror);

Read DER encoded KRB-ERROR from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

krberror :

output variable with newly allocated KRB-ERROR.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_realm ()

int                 shishi_krberror_realm               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **realm,
                                                         size_t *realmlen);

Extract (server) realm from KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

realm :

output array with newly allocated name of realm in KRB-ERROR.

realmlen :

size of output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_cname ()

int                 shishi_krberror_remove_cname        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove client realm field in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_crealm ()

int                 shishi_krberror_remove_crealm       (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove client realm field in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_ctime ()

int                 shishi_krberror_remove_ctime        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove client time field in Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_cusec ()

int                 shishi_krberror_remove_cusec        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove client usec field in Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_edata ()

int                 shishi_krberror_remove_edata        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove error text (e-data) field in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_etext ()

int                 shishi_krberror_remove_etext        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove error text (e-text) field in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_remove_sname ()

int                 shishi_krberror_remove_sname        (Shishi *handle,
                                                         Shishi_asn1 krberror);

Remove server name field in KRB-ERROR. (Since it is not marked OPTIONAL in the ASN.1 profile, what is done is to set the name-type to UNKNOWN and make sure the name-string sequence is empty.)

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror to set server name field in.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_save ()

int                 shishi_krberror_save                (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 krberror);

Save DER encoding of KRB-ERROR to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

krberror :

KRB-ERROR to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_server ()

int                 shishi_krberror_server              (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **server,
                                                         size_t *serverlen);

Return server principal name in KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

server :

pointer to newly allocated zero terminated string containing server name. May be NULL (to only populate serverlen).

serverlen :

pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_server_set ()

int                 shishi_krberror_server_set          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *server);

Set the server name field in the Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror to set server name field in.

server :

zero-terminated string with principal name on RFC 1964 form.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_cname ()

int                 shishi_krberror_set_cname           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_name_type name_type,
                                                         const char *cname[]);

Set principal field in krberror to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

cname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_crealm ()

int                 shishi_krberror_set_crealm          (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *crealm);

Set realm field in krberror to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

crealm :

input array with realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_edata ()

int                 shishi_krberror_set_edata           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *edata);

Set error text (e-data) field in KRB-ERROR to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

edata :

input array with error text to set.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_etext ()

int                 shishi_krberror_set_etext           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *etext);

Set error text (e-text) field in KRB-ERROR to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

etext :

input array with error text to set.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_realm ()

int                 shishi_krberror_set_realm           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *realm);

Set (server) realm field in krberror to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

realm :

input array with (server) realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_set_sname ()

int                 shishi_krberror_set_sname           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         Shishi_name_type name_type,
                                                         const char *sname[]);

Set principal field in krberror to specified value.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

sname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_stime ()

int                 shishi_krberror_stime               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         char **t);

Extract server time from KRB-ERROR.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror to set client name field in.

t :

newly allocated zero-terminated output array with server time.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_stime_set ()

int                 shishi_krberror_stime_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         const char *t);

Store server time in Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

t :

string with generalized time value to store in Krberror.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_susec ()

int                 shishi_krberror_susec               (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t *susec);

Extract server microseconds field from Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

Krberror as allocated by shishi_krberror().

susec :

output integer with server microseconds field.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_susec_set ()

int                 shishi_krberror_susec_set           (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         uint32_t susec);

Set the susec field in the Krberror.

handle :

shishi handle as allocated by shishi_init().

krberror :

krberror as allocated by shishi_krberror().

susec :

server microseconds to set in krberror, 0-999999.

Returns :

Returns SHISHI_OK iff successful.

shishi_krberror_to_file ()

int                 shishi_krberror_to_file             (Shishi *handle,
                                                         Shishi_asn1 krberror,
                                                         int filetype,
                                                         const char *filename);

Write KRB-ERROR to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

krberror :

KRB-ERROR to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_md4 ()

int                 shishi_md4                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[16]);

Compute hash of data using MD4. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

in :

input character array of data to hash.

inlen :

length of input character array of data to hash.

out :

newly allocated character array with hash of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_md5 ()

int                 shishi_md5                          (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out[16]);

Compute hash of data using MD5. The out buffer must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

in :

input character array of data to hash.

inlen :

length of input character array of data to hash.

out :

newly allocated character array with hash of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_methoddata_print ()

int                 shishi_methoddata_print             (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 methoddata);


shishi_n_fold ()

int                 shishi_n_fold                       (Shishi *handle,
                                                         const char *in,
                                                         size_t inlen,
                                                         char *out,
                                                         size_t outlen);

Fold data into a fixed length output array, with the intent to give each input bit approximately equal weight in determining the value of each output bit.

The algorithm is from "A Better Key Schedule For DES-like Ciphers" by Uri Blumenthal and Steven M. Bellovin, http://www.research.att.com/~smb/papers/ides.pdf, although the sample vectors provided by the paper are incorrect.

handle :

shishi handle as allocated by shishi_init().

in :

input array with data to decrypt.

inlen :

size of input array with data to decrypt ("M").

out :

output array with decrypted data.

outlen :

size of output array ("N").

Returns :

Returns SHISHI_OK iff successful.

shishi_padata_print ()

int                 shishi_padata_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 padata);


shishi_parse_name ()

int                 shishi_parse_name                   (Shishi *handle,
                                                         const char *name,
                                                         char **principal,
                                                         char **realm);

Split principal name (e.g., "simon@JOSEFSSON.ORG") into two newly allocated strings, the principal ("simon"), and the realm ("JOSEFSSON.ORG"). If there is no realm part in name, realm is set to NULL.

handle :

Shishi library handle created by shishi_init().

name :

input principal name string, e.g. imap/mail.gnu.org@GNU.ORG.

principal :

newly allocated output string with principal name.

realm :

newly allocated output string with realm name.

Returns :

Returns SHISHI_INVALID_PRINCIPAL_NAME if name is NULL or ends with the escape character "\", and SHISHI_OK if successful.

shishi_pbkdf2_sha1 ()

int                 shishi_pbkdf2_sha1                  (Shishi *handle,
                                                         const char *P,
                                                         size_t Plen,
                                                         const char *S,
                                                         size_t Slen,
                                                         unsigned int c,
                                                         unsigned int dkLen,
                                                         char *DK);

Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a pseudorandom function to derive keys. The length of the derived key is essentially unbounded. (However, the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function, which is this function is always SHA1.)

handle :

shishi handle as allocated by shishi_init().

P :

input password, an octet string

Plen :

length of password, an octet string

S :

input salt, an octet string

Slen :

length of salt, an octet string

c :

iteration count, a positive integer

dkLen :

intended length in octets of the derived key, a positive integer, at most (2^32 - 1) * hLen. The DK array must have room for this many characters.

DK :

output derived key, a dkLen-octet string

Returns :

Returns SHISHI_OK iff successful.

shishi_principal_default ()

const char *        shishi_principal_default            (Shishi *handle);

The default principal name is the name in the environment variable USER, or LOGNAME for some systems, but it can be overridden by specifying the environment variable SHISHI_USER.

handle :

Shishi library handle created by shishi_init().

Returns :

Returns the default principal name used by the library. (Not a copy of it, so don't modify or deallocate it.)

shishi_principal_default_guess ()

char *              shishi_principal_default_guess      (void);

Guesses the principal name for the user, looking at environment variables SHISHI_USER, USER and LOGNAME, or if that fails, returns the string "user".

Returns :

Returns guessed default principal for user as a string that has to be deallocated by the caller with free().

shishi_principal_default_set ()

void                shishi_principal_default_set        (Shishi *handle,
                                                         const char *principal);

Set the default principal used by the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle created by shishi_init().

principal :

string with new default principal name, or NULL to reset to default.

shishi_principal_name ()

int                 shishi_principal_name               (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         char **out,
                                                         size_t *outlen);

Represent principal name in ASN.1 structure as null-terminated string. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length outlen does not include the terminating null.

handle :

Shishi library handle created by shishi_init().

namenode :

ASN.1 structure with principal in namefield.

namefield :

name of field in namenode containing principal name.

out :

pointer to newly allocated, null terminated, string containing principal name. May be NULL (to only populate outlen).

outlen :

pointer to length of out on output, excluding terminating null. May be NULL (to only populate out).

Returns :

Returns SHISHI_OK if successful.

shishi_principal_name_realm ()

int                 shishi_principal_name_realm         (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         Shishi_asn1 realmnode,
                                                         const char *realmfield,
                                                         char **out,
                                                         size_t *outlen);

Represent principal name and realm in ASN.1 structure as null-terminated string. The string is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length outlen does not include the terminating null character.

handle :

Shishi library handle created by shishi_init().

namenode :

ASN.1 structure with principal name in namefield.

namefield :

name of field in namenode containing principal name.

realmnode :

ASN.1 structure with principal realm in realmfield.

realmfield :

name of field in realmnode containing principal realm.

out :

pointer to newly allocated null terminated string containing principal name. May be NULL (to only populate outlen).

outlen :

pointer to length of out on output, excluding terminating null. May be NULL (to only populate out).

Returns :

Returns SHISHI_OK if successful.

shishi_principal_name_set ()

int                 shishi_principal_name_set           (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         Shishi_name_type name_type,
                                                         const char *name[]);

Set the given principal name field to the given name.

handle :

shishi handle as allocated by shishi_init().

namenode :

ASN.1 structure with principal in namefield.

namefield :

name of field in namenode containing principal name.

name_type :

type of principal, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

name :

null-terminated input array with principal name.

Returns :

Returns SHISHI_OK if successful.

shishi_principal_set ()

int                 shishi_principal_set                (Shishi *handle,
                                                         Shishi_asn1 namenode,
                                                         const char *namefield,
                                                         const char *name);

Set principal name field in an ASN.1 structure to the given name.

handle :

shishi handle as allocated by shishi_init().

namenode :

ASN.1 structure with principal in namefield.

namefield :

name of field in namenode containing principal name.

name :

null-terminated string with principal name in RFC 1964 form.

Returns :

Returns SHISHI_OK if successful.

shishi_priv ()

int                 shishi_priv                         (Shishi *handle,
                                                         Shishi_priv **priv);

Create a new PRIV exchange.

handle :

shishi handle as allocated by shishi_init().

priv :

pointer to new structure that holds information about PRIV exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_build ()

int                 shishi_priv_build                   (Shishi_priv *priv,
                                                         Shishi_key *key);

Build checksum and set it in KRB-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

priv :

priv as allocated by shishi_priv().

key :

key for session, used to encrypt data.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_done ()

void                shishi_priv_done                    (Shishi_priv *priv);

Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle.

priv :

structure that holds information about PRIV exchange

shishi_priv_enc_part_etype ()

int                 shishi_priv_enc_part_etype          (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int32_t *etype);

Extract PRIV.enc-part.etype.

handle :

shishi handle as allocated by shishi_init().

priv :

PRIV variable to get value from.

etype :

output variable that holds the value.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_encprivpart ()

Shishi_asn1         shishi_priv_encprivpart             (Shishi_priv *priv);

Get ASN.1 EncPrivPart structure from PRIV exchange.

priv :

structure that holds information about PRIV exchange

Returns :

Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured.

shishi_priv_encprivpart_der ()

int                 shishi_priv_encprivpart_der         (Shishi_priv *priv,
                                                         char **out,
                                                         size_t *outlen);

DER encode ENCPRIVPART structure. out is allocated by this function, and it is the responsibility of caller to deallocate it.

priv :

priv as allocated by shishi_priv().

out :

output array with newly allocated DER encoding of ENCPRIVPART.

outlen :

length of output array with DER encoding of ENCPRIVPART.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_encprivpart_der_set ()

int                 shishi_priv_encprivpart_der_set     (Shishi_priv *priv,
                                                         char *der,
                                                         size_t derlen);

DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains.

priv :

priv as allocated by shishi_priv().

der :

input array with DER encoded ENCPRIVPART.

derlen :

length of input array with DER encoded ENCPRIVPART.

Returns :

Returns SHISHI_OK.

shishi_priv_encprivpart_set ()

void                shishi_priv_encprivpart_set         (Shishi_priv *priv,
                                                         Shishi_asn1 asn1encprivpart);

Set the ENCPRIVPART in the PRIV exchange.

priv :

structure that holds information about PRIV exchange

asn1encprivpart :

ENCPRIVPART to store in PRIV exchange.

shishi_priv_from_file ()

int                 shishi_priv_from_file               (Shishi *handle,
                                                         Shishi_asn1 *priv,
                                                         int filetype,
                                                         const char *filename);

Read PRIV from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

priv :

output variable with newly allocated PRIV.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_key ()

Shishi_key *        shishi_priv_key                     (Shishi_priv *priv);

Get key from PRIV exchange.

priv :

structure that holds information about PRIV exchange

Returns :

Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured.

shishi_priv_key_set ()

void                shishi_priv_key_set                 (Shishi_priv *priv,
                                                         Shishi_key *key);

Set the Key in the PRIV exchange.

priv :

structure that holds information about PRIV exchange

key :

key to store in PRIV.

shishi_priv_parse ()

int                 shishi_priv_parse                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *priv);

Read ASCII armored DER encoded PRIV from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

priv :

output variable with newly allocated PRIV.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_print ()

int                 shishi_priv_print                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 priv);

Print ASCII armored DER encoding of PRIV to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

priv :

PRIV to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_priv ()

Shishi_asn1         shishi_priv_priv                    (Shishi_priv *priv);

Get ASN.1 PRIV structure in PRIV exchange.

priv :

structure that holds information about PRIV exchange

Returns :

Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured.

shishi_priv_priv_der ()

int                 shishi_priv_priv_der                (Shishi_priv *priv,
                                                         char **out,
                                                         size_t *outlen);

DER encode PRIV structure. Typically shishi_priv_build() is used to build the PRIV structure first. out is allocated by this function, and it is the responsibility of caller to deallocate it.

priv :

priv as allocated by shishi_priv().

out :

output array with newly allocated DER encoding of PRIV.

outlen :

length of output array with DER encoding of PRIV.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_priv_der_set ()

int                 shishi_priv_priv_der_set            (Shishi_priv *priv,
                                                         char *der,
                                                         size_t derlen);

DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the KRB-PRIV in the PRIV exchange remains.

priv :

priv as allocated by shishi_priv().

der :

input array with DER encoded KRB-PRIV.

derlen :

length of input array with DER encoded KRB-PRIV.

Returns :

Returns SHISHI_OK.

shishi_priv_priv_set ()

void                shishi_priv_priv_set                (Shishi_priv *priv,
                                                         Shishi_asn1 asn1priv);

Set the KRB-PRIV in the PRIV exchange.

priv :

structure that holds information about PRIV exchange

asn1priv :

KRB-PRIV to store in PRIV exchange.

shishi_priv_process ()

int                 shishi_priv_process                 (Shishi_priv *priv,
                                                         Shishi_key *key);

Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the PRIV exchange.

priv :

priv as allocated by shishi_priv().

key :

key to use to decrypt EncPrivPart.

Returns :

Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed.

shishi_priv_read ()

int                 shishi_priv_read                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *priv);

Read DER encoded PRIV from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

priv :

output variable with newly allocated PRIV.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_save ()

int                 shishi_priv_save                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 priv);

Save DER encoding of PRIV to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

priv :

PRIV to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_set_enc_part ()

int                 shishi_priv_set_enc_part            (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int32_t etype,
                                                         const char *encpart,
                                                         size_t encpartlen);

Store encrypted data in PRIV. The encrypted data is usually created by calling shishi_encrypt() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_priv_build() instead, which encryptes the data and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

priv :

priv as allocated by shishi_priv().

etype :

input encryption type to store in PRIV.

encpart :

input encrypted data to store in PRIV.

encpartlen :

size of input encrypted data to store in PRIV.

Returns :

Returns SHISHI_OK iff successful.

shishi_priv_to_file ()

int                 shishi_priv_to_file                 (Shishi *handle,
                                                         Shishi_asn1 priv,
                                                         int filetype,
                                                         const char *filename);

Write PRIV to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

priv :

PRIV to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_prompt_password ()

int                 shishi_prompt_password              (Shishi *handle,
                                                         char **s,
                                                         const char *format,
                                                         ...);

Format and print a prompt, and read a password from user. The password is possibly converted (e.g., converted from Latin-1 to UTF-8, or processed using Stringprep profile) following any "stringprocess" keywords in configuration files.

handle :

shishi handle as allocated by shishi_init().

s :

pointer to newly allocated output string with read password.

format :

printf(3) style format string.

... :

printf(3) style arguments.

Returns :

Returns SHISHI_OK iff successful.

shishi_prompt_password_callback_get ()

shishi_prompt_password_func shishi_prompt_password_callback_get
                                                        (Shishi *handle);

Get the application password prompt function callback as set by shishi_prompt_password_callback_set().

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the callback, a shishi_prompt_password_func type, or NULL.

shishi_prompt_password_callback_set ()

void                shishi_prompt_password_callback_set (Shishi *handle,
                                                         shishi_prompt_password_func cb);

Set a callback function that will be used by shishi_prompt_password() to query the user for a password. The function pointer can be retrieved using shishi_prompt_password_callback_get().

The cb function should follow the shishi_prompt_password_func prototype:

int prompt_password (Shishi * handle, char **s, const char *format, va_list ap);

If the function returns 0, the s variable should contain a newly allocated string with the password read from the user.

handle :

shishi handle as allocated by shishi_init().

cb :

function pointer to application password callback, a shishi_prompt_password_func type.

shishi_prompt_password_func ()

int                 (*shishi_prompt_password_func)      (Shishi *handle,
                                                         char **s,
                                                         const char *format,
                                                         va_list ap);


shishi_random_to_key ()

int                 shishi_random_to_key                (Shishi *handle,
                                                         int32_t keytype,
                                                         const char *rnd,
                                                         size_t rndlen,
                                                         Shishi_key *outkey);

Derive key from random data for specified key type, and set the type and value in the given key to the computed values.

handle :

shishi handle as allocated by shishi_init().

keytype :

cryptographic encryption type, see Shishi_etype.

rnd :

input array with random data.

rndlen :

length of input array with random data.

outkey :

allocated key handle that will contain new key.

Returns :

Returns SHISHI_OK iff successful.

shishi_randomize ()

int                 shishi_randomize                    (Shishi *handle,
                                                         int strong,
                                                         void *data,
                                                         size_t datalen);

Store cryptographically random data of given size in the provided buffer.

handle :

shishi handle as allocated by shishi_init().

strong :

0 iff operation should not block, non-0 for very strong randomness.

data :

output array to be filled with random data.

datalen :

size of output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_realm_default ()

const char *        shishi_realm_default                (Shishi *handle);

Get name of default realm.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default realm used in the library. (Not a copy of it, so don't modify or deallocate it.)

shishi_realm_default_guess ()

char *              shishi_realm_default_guess          (void);

Guesses a realm based on getdomainname() (which really is NIS/YP domain, but if it is set it might be a good guess), or if it fails, based on gethostname(), or if it fails, the string "could-not-guess-default-realm". Note that the hostname is not trimmed off of the data returned by gethostname() to get the domain name and use that as the realm.

Returns :

Returns guessed realm for host as a string that has to be deallocated with free() by the caller.

shishi_realm_default_set ()

void                shishi_realm_default_set            (Shishi *handle,
                                                         const char *realm);

Set the default realm used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

realm :

string with new default realm name, or NULL to reset to default.

shishi_realm_for_server ()

char *              shishi_realm_for_server             (Shishi *handle,
                                                         char *server);

Find realm for a host, using various methods. Currently this includes static configuration files (see shishi_realm_for_server_file()) and DNS (see shishi_realm_for_server_dns()).

handle :

Shishi library handle create by shishi_init().

server :

hostname to find realm for.

Returns :

Returns realm for host, or NULL if not found.

shishi_realm_for_server_dns ()

char *              shishi_realm_for_server_dns         (Shishi *handle,
                                                         char *server);

Find realm for a host using DNS lookups, according to draft-ietf-krb-wg-krb-dns-locate-03.txt. Since DNS lookups may be spoofed, relying on the realm information may result in a redirection attack. In a single-realm scenario, this only achieves a denial of service, but with cross-realm trust it may redirect you to a compromised realm. For this reason, Shishi prints a warning, suggesting that the user should add the proper 'server-realm' configuration tokens instead.

To illustrate the DNS information used, here is an extract from a zone file for the domain ASDF.COM:

_kerberos.asdf.com. IN TXT "ASDF.COM" _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM"

Let us suppose that in this case, a client wishes to use a service on the host foo.asdf.com. It would first query:

_kerberos.foo.asdf.com. IN TXT

Finding no match, it would then query:

_kerberos.asdf.com. IN TXT

handle :

Shishi library handle create by shishi_init().

server :

hostname to find realm for.

Returns :

Returns realm for host, or NULL if not found.

shishi_realm_for_server_file ()

char *              shishi_realm_for_server_file        (Shishi *handle,
                                                         char *server);

Find realm for a host using configuration file.

handle :

Shishi library handle create by shishi_init().

server :

hostname to find realm for.

Returns :

Returns realm for host, or NULL if not found.

shishi_resolv ()

Shishi_dns          shishi_resolv                       (const char *zone,
                                                         uint16_t querytype);

Query DNS resolver for data of type querytype at owner name zone. Currently TXT and SRV types are supported.

zone :

owner name of data, e.g. "EXAMPLE.ORG"

querytype :

type of data to query for, e.g., SHISHI_DNS_TXT.

Returns :

Returns linked list of DNS records, or NULL if query failed.

shishi_resolv_free ()

void                shishi_resolv_free                  (Shishi_dns rrs);

Deallocate list of DNS RR as returned by shishi_resolv().

rrs :

list of DNS RR as returned by shishi_resolv().

shishi_safe ()

int                 shishi_safe                         (Shishi *handle,
                                                         Shishi_safe **safe);

Create a new SAFE exchange.

handle :

shishi handle as allocated by shishi_init().

safe :

pointer to new structure that holds information about SAFE exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_build ()

int                 shishi_safe_build                   (Shishi_safe *safe,
                                                         Shishi_key *key);

Build checksum and set it in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

safe :

safe as allocated by shishi_safe().

key :

key for session, used to compute checksum.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_cksum ()

int                 shishi_safe_cksum                   (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int32_t *cksumtype,
                                                         char **cksum,
                                                         size_t *cksumlen);

Read checksum value from KRB-SAFE. cksum is allocated by this function, and it is the responsibility of caller to deallocate it.

handle :

shishi handle as allocated by shishi_init().

safe :

safe as allocated by shishi_safe().

cksumtype :

output checksum type.

cksum :

output array with newly allocated checksum data from SAFE.

cksumlen :

output size of output checksum data buffer.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_done ()

void                shishi_safe_done                    (Shishi_safe *safe);

Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle.

safe :

structure that holds information about SAFE exchange

shishi_safe_from_file ()

int                 shishi_safe_from_file               (Shishi *handle,
                                                         Shishi_asn1 *safe,
                                                         int filetype,
                                                         const char *filename);

Read SAFE from file in specified TYPE.

handle :

shishi handle as allocated by shishi_init().

safe :

output variable with newly allocated SAFE.

filetype :

input variable specifying type of file to be read, see Shishi_filetype.

filename :

input variable with filename to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_key ()

Shishi_key *        shishi_safe_key                     (Shishi_safe *safe);

Get key structured from SAFE exchange.

safe :

structure that holds information about SAFE exchange

Returns :

Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured.

shishi_safe_key_set ()

void                shishi_safe_key_set                 (Shishi_safe *safe,
                                                         Shishi_key *key);

Set the Key in the SAFE exchange.

safe :

structure that holds information about SAFE exchange

key :

key to store in SAFE.

shishi_safe_parse ()

int                 shishi_safe_parse                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *safe);

Read ASCII armored DER encoded SAFE from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

safe :

output variable with newly allocated SAFE.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_print ()

int                 shishi_safe_print                   (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 safe);

Print ASCII armored DER encoding of SAFE to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

safe :

SAFE to print.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_read ()

int                 shishi_safe_read                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *safe);

Read DER encoded SAFE from file and populate given variable.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for reading.

safe :

output variable with newly allocated SAFE.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_safe ()

Shishi_asn1         shishi_safe_safe                    (Shishi_safe *safe);

Get ASN.1 SAFE structured from SAFE exchange.

safe :

structure that holds information about SAFE exchange

Returns :

Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured.

shishi_safe_safe_der ()

int                 shishi_safe_safe_der                (Shishi_safe *safe,
                                                         char **out,
                                                         size_t *outlen);

DER encode SAFE structure. Typically shishi_safe_build() is used to build the SAFE structure first. out is allocated by this function, and it is the responsibility of caller to deallocate it.

safe :

safe as allocated by shishi_safe().

out :

output array with newly allocated DER encoding of SAFE.

outlen :

length of output array with DER encoding of SAFE.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_safe_der_set ()

int                 shishi_safe_safe_der_set            (Shishi_safe *safe,
                                                         char *der,
                                                         size_t derlen);

DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the KRB-SAFE in the SAFE exchange remains.

safe :

safe as allocated by shishi_safe().

der :

input array with DER encoded KRB-SAFE.

derlen :

length of input array with DER encoded KRB-SAFE.

Returns :

Returns SHISHI_OK.

shishi_safe_safe_set ()

void                shishi_safe_safe_set                (Shishi_safe *safe,
                                                         Shishi_asn1 asn1safe);

Set the KRB-SAFE in the SAFE exchange.

safe :

structure that holds information about SAFE exchange

asn1safe :

KRB-SAFE to store in SAFE exchange.

shishi_safe_save ()

int                 shishi_safe_save                    (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 safe);

Save DER encoding of SAFE to file.

handle :

shishi handle as allocated by shishi_init().

fh :

file handle open for writing.

safe :

SAFE to save.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_set_cksum ()

int                 shishi_safe_set_cksum               (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int32_t cksumtype,
                                                         const char *cksum,
                                                         size_t cksumlen);

Store checksum value in SAFE. A checksum is usually created by calling shishi_checksum() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_safe_build() instead, which calculates the checksum and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

safe :

safe as allocated by shishi_safe().

cksumtype :

input checksum type to store in SAFE.

cksum :

input checksum data to store in SAFE.

cksumlen :

size of input checksum data to store in SAFE.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_set_user_data ()

int                 shishi_safe_set_user_data           (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         const char *userdata,
                                                         size_t userdatalen);

Set the application data in SAFE.

handle :

shishi handle as allocated by shishi_init().

safe :

safe as allocated by shishi_safe().

userdata :

input user application to store in SAFE.

userdatalen :

size of input user application to store in SAFE.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_to_file ()

int                 shishi_safe_to_file                 (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         int filetype,
                                                         const char *filename);

Write SAFE to file in specified TYPE. The file will be truncated if it exists.

handle :

shishi handle as allocated by shishi_init().

safe :

SAFE to save.

filetype :

input variable specifying type of file to be written, see Shishi_filetype.

filename :

input variable with filename to write to.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_user_data ()

int                 shishi_safe_user_data               (Shishi *handle,
                                                         Shishi_asn1 safe,
                                                         char **userdata,
                                                         size_t *userdatalen);

Read user data value from KRB-SAFE. userdata is allocated by this function, and it is the responsibility of caller to deallocate it.

handle :

shishi handle as allocated by shishi_init().

safe :

safe as allocated by shishi_safe().

userdata :

output array with newly allocated user data from KRB-SAFE.

userdatalen :

output size of output user data buffer.

Returns :

Returns SHISHI_OK iff successful.

shishi_safe_verify ()

int                 shishi_safe_verify                  (Shishi_safe *safe,
                                                         Shishi_key *key);

Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

safe :

safe as allocated by shishi_safe().

key :

key for session, used to verify checksum.

Returns :

Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed.

shishi_server ()

Shishi *            shishi_server                       (void);

Initializes the Shishi library, and set up, using shishi_error_set_outputtype(), the library so that future warnings and informational messages are printed to the syslog. If this function fails, it may print diagnostic errors to the syslog.

Returns :

Returns Shishi library handle, or NULL on error.

shishi_server_for_local_service ()

char *              shishi_server_for_local_service     (Shishi *handle,
                                                         const char *service);

Construct a service principal (e.g., "imap/yxa.extuno.com") based on supplied service name (i.e., "imap") and the system's hostname as returned by hostname() (i.e., "yxa.extundo.com"). The string must be deallocated by the caller.

handle :

shishi handle as allocated by shishi_init().

service :

null terminated string with name of service, e.g., "host".

Returns :

Return newly allocated service name string.

shishi_strerror ()

const char *        shishi_strerror                     (int err);

Convert return code to human readable string.

err :

shishi error code.

Returns :

Returns a pointer to a statically allocated string containing a description of the error with the error value err. This string can be used to output a diagnostic message to the user.

shishi_string_to_key ()

int                 shishi_string_to_key                (Shishi *handle,
                                                         int32_t keytype,
                                                         const char *password,
                                                         size_t passwordlen,
                                                         const char *salt,
                                                         size_t saltlen,
                                                         const char *parameter,
                                                         Shishi_key *outkey);

Derive key from a string (password) and salt (commonly concatenation of realm and principal) for specified key type, and set the type and value in the given key to the computed values. The parameter value is specific for each keytype, and can be set if the parameter information is not available.

handle :

shishi handle as allocated by shishi_init().

keytype :

cryptographic encryption type, see Shishi_etype.

password :

input array with password.

passwordlen :

length of input array with password.

salt :

input array with salt.

saltlen :

length of input array with salt.

parameter :

input array with opaque encryption type specific information.

outkey :

allocated key handle that will contain new key.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs ()

int                 shishi_tgs                          (Shishi *handle,
                                                         Shishi_tgs **tgs);

Allocate a new TGS exchange variable.

handle :

shishi handle as allocated by shishi_init().

tgs :

holds pointer to newly allocate Shishi_tgs structure.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_ap ()

Shishi_ap *         shishi_tgs_ap                       (Shishi_tgs *tgs);

Get the AP from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the AP exchange (part of TGS-REQ) from the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_done ()

void                shishi_tgs_done                     (Shishi_tgs *tgs);

Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle.

tgs :

structure that holds information about AS exchange

shishi_tgs_krberror ()

Shishi_asn1         shishi_tgs_krberror                 (Shishi_tgs *tgs);

Get KRB-ERROR from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_krberror_der ()

int                 shishi_tgs_krberror_der             (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);

DER encode KRB-ERROR. out is allocated by this function, and it is the responsibility of caller to deallocate it.

tgs :

structure that holds information about TGS exchange

out :

output array with newly allocated DER encoding of KRB-ERROR.

outlen :

length of output array with DER encoding of KRB-ERROR.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_krberror_set ()

void                shishi_tgs_krberror_set             (Shishi_tgs *tgs,
                                                         Shishi_asn1 krberror);

Set the KRB-ERROR in the TGS exchange.

tgs :

structure that holds information about TGS exchange

krberror :

krberror to store in TGS.

shishi_tgs_process ()

int                 shishi_tgs_process                  (Shishi *handle,
                                                         Shishi_asn1 tgsreq,
                                                         Shishi_asn1 tgsrep,
                                                         Shishi_asn1 authenticator,
                                                         Shishi_asn1 oldenckdcreppart,
                                                         Shishi_asn1 *enckdcreppart);

Process a TGS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the ticket used to construct the TGS request and calls shishi_kdc_process(), which see.

handle :

shishi handle as allocated by shishi_init().

tgsreq :

input variable that holds the sent KDC-REQ.

tgsrep :

input variable that holds the received KDC-REP.

authenticator :

input variable with Authenticator from AP-REQ in KDC-REQ.

oldenckdcreppart :

input variable with EncKDCRepPart used in request.

enckdcreppart :

output variable that holds new EncKDCRepPart.

Returns :

Returns SHISHI_OK iff the TGS client exchange was successful.

shishi_tgs_rep ()

Shishi_asn1         shishi_tgs_rep                      (Shishi_tgs *tgs);

Get TGS-REP from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_rep_build ()

int                 shishi_tgs_rep_build                (Shishi_tgs *tgs,
                                                         int keyusage,
                                                         Shishi_key *key);

Build TGS-REP.

tgs :

structure that holds information about TGS exchange

keyusage :

keyusage integer.

key :

user's key, used to encrypt the encrypted part of the TGS-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_rep_der ()

int                 shishi_tgs_rep_der                  (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);

DER encode TGS-REP. out is allocated by this function, and it is the responsibility of caller to deallocate it.

tgs :

structure that holds information about TGS exchange

out :

output array with newly allocated DER encoding of TGS-REP.

outlen :

length of output array with DER encoding of TGS-REP.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_rep_process ()

int                 shishi_tgs_rep_process              (Shishi_tgs *tgs);

Process new TGS-REP and set ticket. The key to decrypt the TGS-REP is taken from the EncKDCRepPart of the TGS tgticket.

tgs :

structure that holds information about TGS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_req ()

Shishi_asn1         shishi_tgs_req                      (Shishi_tgs *tgs);

Get the TGS-REQ from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the generated TGS-REQ from the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_req_build ()

int                 shishi_tgs_req_build                (Shishi_tgs *tgs);

Checksum data in authenticator and add ticket and authenticator to TGS-REQ.

tgs :

structure that holds information about TGS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_req_der ()

int                 shishi_tgs_req_der                  (Shishi_tgs *tgs,
                                                         char **out,
                                                         size_t *outlen);

DER encode TGS-REQ. out is allocated by this function, and it is the responsibility of caller to deallocate it.

tgs :

structure that holds information about TGS exchange

out :

output array with newly allocated DER encoding of TGS-REQ.

outlen :

length of output array with DER encoding of TGS-REQ.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_req_der_set ()

int                 shishi_tgs_req_der_set              (Shishi_tgs *tgs,
                                                         char *der,
                                                         size_t derlen);

DER decode TGS-REQ and set it TGS exchange. If decoding fails, the TGS-REQ in the TGS exchange remains.

tgs :

structure that holds information about TGS exchange

der :

input array with DER encoded AP-REQ.

derlen :

length of input array with DER encoded AP-REQ.

Returns :

Returns SHISHI_OK.

shishi_tgs_req_process ()

int                 shishi_tgs_req_process              (Shishi_tgs *tgs);

Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ is taken from the EncKDCReqPart of the TGS tgticket.

tgs :

structure that holds information about TGS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_req_set ()

void                shishi_tgs_req_set                  (Shishi_tgs *tgs,
                                                         Shishi_asn1 tgsreq);

Set the TGS-REQ in the TGS exchange.

tgs :

structure that holds information about TGS exchange

tgsreq :

tgsreq to store in TGS.

shishi_tgs_sendrecv ()

int                 shishi_tgs_sendrecv                 (Shishi_tgs *tgs);

Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets.

tgs :

structure that holds information about TGS exchange

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_sendrecv_hint ()

int                 shishi_tgs_sendrecv_hint            (Shishi_tgs *tgs,
                                                         Shishi_tkts_hint *hint);

Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The hint structure can be used to set, e.g., parameters for TLS authentication.

tgs :

structure that holds information about TGS exchange

hint :

additional parameters that modify connection behaviour, or NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_set_realm ()

int                 shishi_tgs_set_realm                (Shishi_tgs *tgs,
                                                         const char *realm);

Set the server in the TGS-REQ.

tgs :

structure that holds information about TGS exchange

realm :

indicates the realm to acquire ticket for.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_set_realmserver ()

int                 shishi_tgs_set_realmserver          (Shishi_tgs *tgs,
                                                         const char *realm,
                                                         const char *server);

Set the realm and server in the TGS-REQ.

tgs :

structure that holds information about TGS exchange

realm :

indicates the realm to acquire ticket for.

server :

indicates the server to acquire ticket for.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_set_server ()

int                 shishi_tgs_set_server               (Shishi_tgs *tgs,
                                                         const char *server);

Set the server in the TGS-REQ.

tgs :

structure that holds information about TGS exchange

server :

indicates the server to acquire ticket for.

Returns :

Returns SHISHI_OK iff successful.

shishi_tgs_tgtkt ()

Shishi_tkt *        shishi_tgs_tgtkt                    (Shishi_tgs *tgs);

Get Ticket-granting-ticket from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the ticket-granting-ticket used in the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_tgtkt_set ()

void                shishi_tgs_tgtkt_set                (Shishi_tgs *tgs,
                                                         Shishi_tkt *tgtkt);

Set the Ticket in the TGS exchange.

tgs :

structure that holds information about TGS exchange

tgtkt :

ticket granting ticket to store in TGS.

shishi_tgs_tkt ()

Shishi_tkt *        shishi_tgs_tkt                      (Shishi_tgs *tgs);

Get Ticket from TGS exchange.

tgs :

structure that holds information about TGS exchange

Returns :

Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured.

shishi_tgs_tkt_set ()

void                shishi_tgs_tkt_set                  (Shishi_tgs *tgs,
                                                         Shishi_tkt *tkt);

Set the Ticket in the TGS exchange.

tgs :

structure that holds information about TGS exchange

tkt :

ticket to store in TGS.

shishi_tgsrep ()

Shishi_asn1         shishi_tgsrep                       (Shishi *handle);

This function creates a new TGS-REP, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the TGS-REP or NULL on failure.

shishi_tgsreq ()

Shishi_asn1         shishi_tgsreq                       (Shishi *handle);

This function creates a new TGS-REQ, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the TGS-REQ or NULL on failure.

shishi_tgsreq_rst ()

Shishi_asn1         shishi_tgsreq_rst                   (Shishi *handle,
                                                         char *realm,
                                                         char *server,
                                                         Shishi_tkt *tkt);


shishi_ticket ()

Shishi_asn1         shishi_ticket                       (Shishi *handle);

This function creates a new ASN.1 Ticket, populated with some default values.

handle :

shishi handle as allocated by shishi_init().

Returns :

Returns the ticket or NULL on failure.

shishi_ticket_add_enc_part ()

int                 shishi_ticket_add_enc_part          (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_key *key,
                                                         Shishi_asn1 encticketpart);

Encrypts DER encoded EncTicketPart using key and stores it in the Ticket.

handle :

shishi handle as allocated by shishi_init().

ticket :

Ticket to add enc-part field to.

key :

key used to encrypt enc-part.

encticketpart :

EncTicketPart to add.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_decrypt ()

int                 shishi_ticket_decrypt               (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_key *key,
                                                         Shishi_asn1 *encticketpart);


shishi_ticket_get_enc_part_etype ()

int                 shishi_ticket_get_enc_part_etype    (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         int32_t *etype);

Extract Ticket.enc-part.etype.

handle :

shishi handle as allocated by shishi_init().

ticket :

Ticket variable to get value from.

etype :

output variable that holds the value.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_parse ()

int                 shishi_ticket_parse                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *ticket);


shishi_ticket_print ()

int                 shishi_ticket_print                 (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 ticket);


shishi_ticket_read ()

int                 shishi_ticket_read                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 *ticket);


shishi_ticket_realm_get ()

int                 shishi_ticket_realm_get             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         char **realm,
                                                         size_t *realmlen);

Extract realm from ticket.

handle :

shishi handle as allocated by shishi_init().

ticket :

input variable with ticket info.

realm :

output array with newly allocated name of realm in ticket.

realmlen :

size of output array.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_realm_set ()

int                 shishi_ticket_realm_set             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *realm);

Set the realm field in the Ticket.

handle :

shishi handle as allocated by shishi_init().

ticket :

input variable with ticket info.

realm :

input array with name of realm.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_save ()

int                 shishi_ticket_save                  (Shishi *handle,
                                                         FILE *fh,
                                                         Shishi_asn1 ticket);


shishi_ticket_server ()

int                 shishi_ticket_server                (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         char **server,
                                                         size_t *serverlen);

Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

handle :

Shishi library handle create by shishi_init().

ticket :

ASN.1 Ticket variable to get server name from.

server :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

serverlen :

pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_set_enc_part ()

int                 shishi_ticket_set_enc_part          (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         int32_t etype,
                                                         uint32_t kvno,
                                                         const char *buf,
                                                         size_t buflen);

Set the encrypted enc-part field in the Ticket. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded enc-part. To save time, you may want to use shishi_ticket_add_enc_part() instead, which calculates the encrypted data and calls this function in one step.

handle :

shishi handle as allocated by shishi_init().

ticket :

Ticket to add enc-part field to.

etype :

encryption type used to encrypt enc-part.

kvno :

key version number.

buf :

input array with encrypted enc-part.

buflen :

size of input array with encrypted enc-part.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_set_server ()

int                 shishi_ticket_set_server            (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *server);


shishi_ticket_sname_set ()

int                 shishi_ticket_sname_set             (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_name_type name_type,
                                                         char *sname[]);

Set the server name field in the Ticket.

handle :

shishi handle as allocated by shishi_init().

ticket :

Ticket variable to set server name field in.

name_type :

type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

sname :

input array with principal name.

Returns :

Returns SHISHI_OK iff successful.

shishi_ticket_srealmserver_set ()

int                 shishi_ticket_srealmserver_set      (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         const char *realm,
                                                         const char *server);


shishi_time ()

int                 shishi_time                         (Shishi *handle,
                                                         Shishi_asn1 node,
                                                         const char *field,
                                                         char **t);

Extract time from ASN.1 structure.

handle :

shishi handle as allocated by shishi_init().

node :

ASN.1 node to get time from.

field :

Name of field in ASN.1 node to get time from.

t :

newly allocated output array with zero terminated time string.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt ()

int                 shishi_tkt                          (Shishi *handle,
                                                         Shishi_tkt **tkt);

Create a new ticket handle.

handle :

shishi handle as allocated by shishi_init().

tkt :

output variable with newly allocated ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt2 ()

Shishi_tkt *        shishi_tkt2                         (Shishi *handle,
                                                         Shishi_asn1 ticket,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 kdcrep);

Create a new ticket handle.

handle :

shishi handle as allocated by shishi_init().

ticket :

input variable with ticket.

enckdcreppart :

input variable with auxiliary ticket information.

kdcrep :

input variable with KDC-REP ticket information.

Returns :

Returns new ticket handle, or NULL on error.

shishi_tkt_authctime ()

time_t              shishi_tkt_authctime                (Shishi_tkt *tkt);

Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket.

tkt :

input variable with ticket info.

Returns :

Returns C time interpretation of the endtime in ticket.

shishi_tkt_authtime ()

int                 shishi_tkt_authtime                 (Shishi_tkt *tkt,
                                                         char **authtime,
                                                         size_t *authtimelen);


shishi_tkt_build ()

int                 shishi_tkt_build                    (Shishi_tkt *tkt,
                                                         Shishi_key *key);


shishi_tkt_client ()

int                 shishi_tkt_client                   (Shishi_tkt *tkt,
                                                         char **client,
                                                         size_t *clientlen);

Represent client principal name in Ticket KDC-REP as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

tkt :

input variable with ticket info.

client :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_client_p ()

int                 shishi_tkt_client_p                 (Shishi_tkt *tkt,
                                                         const char *client);

Determine if ticket is for specified client.

tkt :

input variable with ticket info.

client :

client name of ticket.

Returns :

Returns non-0 iff ticket is for specified client.

shishi_tkt_clientrealm ()

int                 shishi_tkt_clientrealm              (Shishi_tkt *tkt,
                                                         char **client,
                                                         size_t *clientlen);

Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

tkt :

input variable with ticket info.

client :

pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

clientlen :

pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_clientrealm_p ()

int                 shishi_tkt_clientrealm_p            (Shishi_tkt *tkt,
                                                         const char *client);

Determine if ticket is for specified client principal.

tkt :

input variable with ticket info.

client :

principal name (client name and realm) of ticket.

Returns :

Returns non-0 iff ticket is for specified client principal.

shishi_tkt_clientrealm_set ()

int                 shishi_tkt_clientrealm_set          (Shishi_tkt *tkt,
                                                         const char *realm,
                                                         const char *client);


shishi_tkt_decrypt ()

int                 shishi_tkt_decrypt                  (Shishi_tkt *tkt,
                                                         Shishi_key *key);


shishi_tkt_done ()

void                shishi_tkt_done                     (Shishi_tkt *tkt);

Deallocate resources associated with ticket. The ticket must not be used again after this call.

tkt :

input variable with ticket info.

shishi_tkt_enckdcreppart ()

Shishi_asn1         shishi_tkt_enckdcreppart            (Shishi_tkt *tkt);

Get ASN.1 EncKDCRepPart structure from ticket.

tkt :

input variable with ticket info.

Returns :

Returns auxiliary ticket information.

shishi_tkt_enckdcreppart_set ()

void                shishi_tkt_enckdcreppart_set        (Shishi_tkt *tkt,
                                                         Shishi_asn1 enckdcreppart);

Set the EncKDCRepPart in the Ticket.

tkt :

structure that holds information about Ticket exchange

enckdcreppart :

EncKDCRepPart to store in Ticket.

shishi_tkt_encticketpart ()

Shishi_asn1         shishi_tkt_encticketpart            (Shishi_tkt *tkt);

Get ASN.1 EncTicketPart structure from ticket.

tkt :

input variable with ticket info.

Returns :

Returns EncTicketPart information.

shishi_tkt_encticketpart_set ()

void                shishi_tkt_encticketpart_set        (Shishi_tkt *tkt,
                                                         Shishi_asn1 encticketpart);

Set the EncTicketPart in the Ticket.

tkt :

input variable with ticket info.

encticketpart :

encticketpart to store in ticket.

shishi_tkt_endctime ()

time_t              shishi_tkt_endctime                 (Shishi_tkt *tkt);

Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid.

tkt :

input variable with ticket info.

Returns :

Returns C time interpretation of the endtime in ticket.

shishi_tkt_endtime ()

int                 shishi_tkt_endtime                  (Shishi_tkt *tkt,
                                                         char **endtime,
                                                         size_t *endtimelen);


shishi_tkt_expired_p ()

int                 shishi_tkt_expired_p                (Shishi_tkt *tkt);

Determine if ticket has expired (i.e., endtime is in the past).

tkt :

input variable with ticket info.

Returns :

Returns 0 iff ticket has expired.

shishi_tkt_flags ()

int                 shishi_tkt_flags                    (Shishi_tkt *tkt,
                                                         uint32_t *flags);

Extract flags in ticket (i.e., EncKDCRepPart).

tkt :

input variable with ticket info.

flags :

pointer to output integer with flags.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_flags_add ()

int                 shishi_tkt_flags_add                (Shishi_tkt *tkt,
                                                         uint32_t flag);

Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options.

tkt :

input variable with ticket info.

flag :

integer with flags to store in ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_flags_set ()

int                 shishi_tkt_flags_set                (Shishi_tkt *tkt,
                                                         uint32_t flags);

Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags.

tkt :

input variable with ticket info.

flags :

integer with flags to store in ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_forwardable_p ()

int                 shishi_tkt_forwardable_p            (Shishi_tkt *tkt);

Determine if ticket is forwardable.

The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff forwardable flag is set in ticket.

shishi_tkt_forwarded_p ()

int                 shishi_tkt_forwarded_p              (Shishi_tkt *tkt);

Determine if ticket is forwarded.

The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff forwarded flag is set in ticket.

shishi_tkt_hw_authent_p ()

int                 shishi_tkt_hw_authent_p             (Shishi_tkt *tkt);

Determine if ticket is authenticated using a hardware token.

The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff hw-authent flag is set in ticket.

shishi_tkt_initial_p ()

int                 shishi_tkt_initial_p                (Shishi_tkt *tkt);

Determine if ticket was issued using AS exchange.

The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff initial flag is set in ticket.

shishi_tkt_invalid_p ()

int                 shishi_tkt_invalid_p                (Shishi_tkt *tkt);

Determine if ticket is invalid.

The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot-list mechanism).

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff invalid flag is set in ticket.

shishi_tkt_kdcrep ()

Shishi_asn1         shishi_tkt_kdcrep                   (Shishi_tkt *tkt);

Get ASN.1 KDCRep structure from ticket.

tkt :

input variable with ticket info.

Returns :

Returns KDC-REP information.

shishi_tkt_key ()

Shishi_key *        shishi_tkt_key                      (Shishi_tkt *tkt);

Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again.

tkt :

input variable with ticket info.

Returns :

Returns key extracted from EncKDCRepPart or EncTicketPart.

shishi_tkt_key_set ()

int                 shishi_tkt_key_set                  (Shishi_tkt *tkt,
                                                         Shishi_key *key);

Set the key in the EncTicketPart.

tkt :

input variable with ticket info.

key :

key to store in ticket.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_keytype ()

int                 shishi_tkt_keytype                  (Shishi_tkt *tkt,
                                                         int32_t *etype);

Extract encryption type of key in ticket (really EncKDCRepPart).

tkt :

input variable with ticket info.

etype :

pointer to encryption type that is set, see Shishi_etype.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_keytype_fast ()

int32_t             shishi_tkt_keytype_fast             (Shishi_tkt *tkt);

Extract encryption type of key in ticket (really EncKDCRepPart).

tkt :

input variable with ticket info.

Returns :

Returns encryption type of session key in ticket (really EncKDCRepPart), or -1 on error.

shishi_tkt_keytype_p ()

int                 shishi_tkt_keytype_p                (Shishi_tkt *tkt,
                                                         int32_t etype);

Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type).

tkt :

input variable with ticket info.

etype :

encryption type, see Shishi_etype.

Returns :

Returns non-0 iff key in ticket is of specified encryption type.

shishi_tkt_lastreq ()

int                 shishi_tkt_lastreq                  (Shishi_tkt *tkt,
                                                         char **lrtime,
                                                         size_t *lrtimelen,
                                                         int32_t lrtype);


shishi_tkt_lastreq_pretty_print ()

void                shishi_tkt_lastreq_pretty_print     (Shishi_tkt *tkt,
                                                         FILE *fh);

Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart).

tkt :

input variable with ticket info.

fh :

file handle open for writing.

shishi_tkt_lastreqc ()

time_t              shishi_tkt_lastreqc                 (Shishi_tkt *tkt,
                                                         Shishi_lrtype lrtype);

Extract C time corresponding to given lastreq type field in the ticket.

tkt :

input variable with ticket info.

lrtype :

lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST.

Returns :

Returns C time interpretation of the specified lastreq field, or (time_t) -1.

shishi_tkt_match_p ()

int                 shishi_tkt_match_p                  (Shishi_tkt *tkt,
                                                         Shishi_tkts_hint *hint);

Test if a ticket matches specified hints.

tkt :

ticket to test hints on.

hint :

structure with characteristics of ticket to be found.

Returns :

Returns 0 iff ticket fails to match given criteria.

shishi_tkt_may_postdate_p ()

int                 shishi_tkt_may_postdate_p           (Shishi_tkt *tkt);

Determine if ticket may be used to grant postdated tickets.

The MAY-POSTDATE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. This flag MUST be set in a ticket-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket-granting ticket; postdated ticket-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime-starttime) of a postdated ticket will be the remaining life of the ticket-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime-starttime) of the ticket-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff may-postdate flag is set in ticket.

shishi_tkt_ok_as_delegate_p ()

int                 shishi_tkt_ok_as_delegate_p         (Shishi_tkt *tkt);

Determine if ticket is ok as delegated ticket.

The copy of the ticket flags in the encrypted part of the KDC reply may have the OK-AS-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff ok-as-delegate flag is set in ticket.

shishi_tkt_postdated_p ()

int                 shishi_tkt_postdated_p              (Shishi_tkt *tkt);

Determine if ticket is postdated.

The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff postdated flag is set in ticket.

shishi_tkt_pre_authent_p ()

int                 shishi_tkt_pre_authent_p            (Shishi_tkt *tkt);

Determine if ticket was pre-authenticated.

The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff pre-authent flag is set in ticket.

shishi_tkt_pretty_print ()

void                shishi_tkt_pretty_print             (Shishi_tkt *tkt,
                                                         FILE *fh);

Print a human readable representation of a ticket to file handle.

tkt :

input variable with ticket info.

fh :

file handle open for writing.

shishi_tkt_proxiable_p ()

int                 shishi_tkt_proxiable_p              (Shishi_tkt *tkt);

Determine if ticket is proxiable.

The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff proxiable flag is set in ticket.

shishi_tkt_proxy_p ()

int                 shishi_tkt_proxy_p                  (Shishi_tkt *tkt);

Determine if ticket is proxy ticket.

The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff proxy flag is set in ticket.

shishi_tkt_realm ()

int                 shishi_tkt_realm                    (Shishi_tkt *tkt,
                                                         char **realm,
                                                         size_t *realmlen);

Extract realm of server in ticket.

tkt :

input variable with ticket info.

realm :

pointer to newly allocated character array with realm name.

realmlen :

length of newly allocated character array with realm name.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_renew_till ()

int                 shishi_tkt_renew_till               (Shishi_tkt *tkt,
                                                         char **renewtilltime,
                                                         size_t *renewtilllen);


shishi_tkt_renew_tillc ()

time_t              shishi_tkt_renew_tillc              (Shishi_tkt *tkt);

Extract C time corresponding to the renew-till field. The field holds the time where the ticket stop being valid for renewal.

tkt :

input variable with ticket info.

Returns :

Returns C time interpretation of the renew-till in ticket.

shishi_tkt_renewable_p ()

int                 shishi_tkt_renewable_p              (Shishi_tkt *tkt);

Determine if ticket is renewable.

The RENEWABLE flag in a ticket is normally only interpreted by the ticket-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff renewable flag is set in ticket.

shishi_tkt_server ()

int                 shishi_tkt_server                   (Shishi_tkt *tkt,
                                                         char **server,
                                                         size_t *serverlen);

Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

tkt :

input variable with ticket info.

server :

pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

serverlen :

pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

Returns :

Returns SHISHI_OK iff successful.

shishi_tkt_server_p ()

int                 shishi_tkt_server_p                 (Shishi_tkt *tkt,
                                                         const char *server);

Determine if ticket is for specified server.

tkt :

input variable with ticket info.

server :

server name of ticket.

Returns :

Returns non-0 iff ticket is for specified server.

shishi_tkt_serverrealm_set ()

int                 shishi_tkt_serverrealm_set          (Shishi_tkt *tkt,
                                                         const char *realm,
                                                         const char *server);


shishi_tkt_startctime ()

time_t              shishi_tkt_startctime               (Shishi_tkt *tkt);

Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past).

tkt :

input variable with ticket info.

Returns :

Returns C time interpretation of the endtime in ticket.

shishi_tkt_starttime ()

int                 shishi_tkt_starttime                (Shishi_tkt *tkt,
                                                         char **starttime,
                                                         size_t *starttimelen);


shishi_tkt_ticket ()

Shishi_asn1         shishi_tkt_ticket                   (Shishi_tkt *tkt);

Get ASN.1 Ticket structure from ticket.

tkt :

input variable with ticket info.

Returns :

Returns actual ticket.

shishi_tkt_ticket_set ()

void                shishi_tkt_ticket_set               (Shishi_tkt *tkt,
                                                         Shishi_asn1 ticket);

Set the ASN.1 Ticket in the Ticket.

tkt :

input variable with ticket info.

ticket :

ASN.1 Ticket to store in ticket.

shishi_tkt_transited_policy_checked_p ()

int                 shishi_tkt_transited_policy_checked_p
                                                        (Shishi_tkt *tkt);

Determine if ticket has been policy checked for transit.

The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list.

While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross-realm authentication. When the KDC applies such checks and accepts such cross-realm authentication it will set the TRANSITED-POLICY-CHECKED flag in the service tickets it issues based on the cross-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required to honor this flag.

Application servers MUST either do the transited-realm checks themselves, or reject cross-realm tickets without TRANSITED-POLICY- CHECKED set.

tkt :

input variable with ticket info.

Returns :

Returns non-0 iff transited-policy-checked flag is set in ticket.

shishi_tkt_valid_at_time_p ()

int                 shishi_tkt_valid_at_time_p          (Shishi_tkt *tkt,
                                                         time_t now);

Determine if ticket is valid at a specific point in time.

tkt :

input variable with ticket info.

now :

time to check for.

Returns :

Returns non-0 iff ticket is valid (not expired and after starttime) at specified time.

shishi_tkt_valid_now_p ()

int                 shishi_tkt_valid_now_p              (Shishi_tkt *tkt);

Determine if ticket is valid now.

tkt :

input variable with ticket info.

Returns :

Returns 0 iff ticket is invalid (expired or not yet valid).

shishi_tkts ()

int                 shishi_tkts                         (Shishi *handle,
                                                         Shishi_tkts **tkts);

Get a new ticket set handle.

handle :

shishi handle as allocated by shishi_init().

tkts :

output pointer to newly allocated tkts handle.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_add ()

int                 shishi_tkts_add                     (Shishi_tkts *tkts,
                                                         Shishi_tkt *tkt);

Add a ticket to the ticket set. Only the pointer is stored, so if you modify tkt, the ticket in the ticket set will also be modified.

tkts :

ticket set handle as allocated by shishi_tkts().

tkt :

ticket to be added to ticket set.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_add_ccache_file ()

int                 shishi_tkts_add_ccache_file         (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_tkts *tkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

handle :

shishi handle as allocated by shishi_init().

filename :

name of file to read.

tkts :

allocated ticket set to store tickets in.

Returns :

Returns SHISHI_IO_ERROR if the file cannot be read, SHISHI_CCACHE_ERROR if the data cannot be parsed as a valid ccache structure, and SHISHI_OK on success.

shishi_tkts_add_ccache_mem ()

int                 shishi_tkts_add_ccache_mem          (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_tkts *tkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

handle :

shishi handle as allocated by shishi_init().

data :

constant memory buffer with ccache of len size.

len :

size of memory buffer with ccache data.

tkts :

allocated key set to store tickets in.

Returns :

Returns SHISHI_CCACHE_ERROR if the data does not represent a valid ccache structure, and SHISHI_OK on success.

shishi_tkts_default ()

Shishi_tkts *       shishi_tkts_default                 (Shishi *handle);

Get the default ticket set for library handle.

handle :

Shishi library handle create by shishi_init().

Returns :

Return the handle global ticket set.

shishi_tkts_default_ccache ()

const char *        shishi_tkts_default_ccache          (Shishi *handle);

Get filename of default ccache filename.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default ccache filename used in the library. The string is not a copy, so don't modify or deallocate it.

shishi_tkts_default_ccache_guess ()

char *              shishi_tkts_default_ccache_guess    (Shishi *handle);

Guesses the default ccache ticket filename; it is the contents of the environment variable KRB5CCNAME or /tmp/krb5cc_UID where UID is the user's identity in decimal, as returned by getuid().

handle :

Shishi library handle create by shishi_init().

Returns :

Returns default ccache filename as a string that has to be deallocated with free() by the caller.

shishi_tkts_default_ccache_set ()

void                shishi_tkts_default_ccache_set      (Shishi *handle,
                                                         const char *ccache);

Set the default ccache filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

ccache :

string with new default ccache filename, or NULL to reset to default.

shishi_tkts_default_file ()

const char *        shishi_tkts_default_file            (Shishi *handle);

Get filename of default ticket set.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it.

shishi_tkts_default_file_guess ()

char *              shishi_tkts_default_file_guess      (Shishi *handle);

Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns default tkts filename as a string that has to be deallocated with free() by the caller.

shishi_tkts_default_file_set ()

void                shishi_tkts_default_file_set        (Shishi *handle,
                                                         const char *tktsfile);

Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

tktsfile :

string with new default tkts file name, or NULL to reset to default.

shishi_tkts_default_to_file ()

int                 shishi_tkts_default_to_file         (Shishi_tkts *tkts);


shishi_tkts_done ()

void                shishi_tkts_done                    (Shishi_tkts **tkts);

Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this.

tkts :

ticket set handle as allocated by shishi_tkts().

shishi_tkts_expire ()

int                 shishi_tkts_expire                  (Shishi_tkts *tkts);

Remove expired tickets from ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_find ()

Shishi_tkt *        shishi_tkts_find                    (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);

Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint->startpos field must be updated appropriately.

Here is how you would typically use this function:

Shishi_tkts_hint hint;

Shishi_tkt tkt;

memset(&hint, 0, sizeof(hint));

hint.server = "imap/mail.example.org";

tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint);

if (!tkt)

printf("No ticket found...\n");

else

do_something_with_ticket (tkt);

tkts :

ticket set handle as allocated by shishi_tkts().

hint :

structure with characteristics of ticket to be found.

Returns :

Returns a ticket if found, or NULL if no further matching tickets could be found.

shishi_tkts_find_for_clientserver ()

Shishi_tkt *        shishi_tkts_find_for_clientserver   (Shishi_tkts *tkts,
                                                         const char *client,
                                                         const char *server);

Short-hand function for searching the ticket set for a ticket for the given client and server. See shishi_tkts_find().

tkts :

ticket set handle as allocated by shishi_tkts().

client :

client name to find ticket for.

server :

server name to find ticket for.

Returns :

Returns a ticket if found, or NULL.

shishi_tkts_find_for_server ()

Shishi_tkt *        shishi_tkts_find_for_server         (Shishi_tkts *tkts,
                                                         const char *server);

Short-hand function for searching the ticket set for a ticket for the given server using the default client principal. See shishi_tkts_find_for_clientserver() and shishi_tkts_find().

tkts :

ticket set handle as allocated by shishi_tkts().

server :

server name to find ticket for.

Returns :

Returns a ticket if found, or NULL.

shishi_tkts_from_ccache_file ()

int                 shishi_tkts_from_ccache_file        (Shishi *handle,
                                                         const char *filename,
                                                         Shishi_tkts **outtkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

handle :

shishi handle as allocated by shishi_init().

filename :

name of file to read.

outtkts :

pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes.

Returns :

Returns SHISHI_IO_ERROR if the file cannot be read, SHISHI_CCACHE_ERROR if the data cannot be parsed as a valid ccache structure, and SHISHI_OK on success.

shishi_tkts_from_ccache_mem ()

int                 shishi_tkts_from_ccache_mem         (Shishi *handle,
                                                         const char *data,
                                                         size_t len,
                                                         Shishi_tkts **outtkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

handle :

shishi handle as allocated by shishi_init().

data :

constant memory buffer with ccache of len size.

len :

size of memory buffer with ccache data.

outtkts :

pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes.

Returns :

Returns SHISHI_CCACHE_ERROR if the data does not represent a valid ccache structure, and SHISHI_OK on success.

shishi_tkts_from_file ()

int                 shishi_tkts_from_file               (Shishi_tkts *tkts,
                                                         const char *filename);

Read tickets from file and add them to the ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

filename :

filename to read tickets from.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_get ()

Shishi_tkt *        shishi_tkts_get                     (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);

Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using shishi_tkts_get_tgt(), and then uses that TGT in a TGS exchange to get the ticket.

Currently this function does not implement cross realm logic.

tkts :

ticket set handle as allocated by shishi_tkts().

hint :

structure with characteristics of ticket to be found.

Returns :

Returns a ticket if found, or NULL if this function is unable to get the ticket.

shishi_tkts_get_for_clientserver ()

Shishi_tkt *        shishi_tkts_get_for_clientserver    (Shishi_tkts *tkts,
                                                         const char *client,
                                                         const char *server);

Short-hand function for getting a ticket for the given client and server. See shishi_tkts_get().

tkts :

ticket set handle as allocated by shishi_tkts().

client :

client name to get ticket for.

server :

server name to get ticket for.

Returns :

Returns a ticket if found, or NULL.

shishi_tkts_get_for_localservicepasswd ()

Shishi_tkt *        shishi_tkts_get_for_localservicepasswd
                                                        (Shishi_tkts *tkts,
                                                         const char *service,
                                                         const char *passwd);

Short-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See shishi_tkts_get().

tkts :

ticket set handle as allocated by shishi_tkts().

service :

service name to get ticket for.

passwd :

password for the default client principal.

Returns :

Returns a ticket if found, or NULL otherwise.

shishi_tkts_get_for_server ()

Shishi_tkt *        shishi_tkts_get_for_server          (Shishi_tkts *tkts,
                                                         const char *server);

Short-hand function for getting a ticket to the given server and for the default principal client. See shishi_tkts_get().

tkts :

ticket set handle as allocated by shishi_tkts().

server :

server name to get ticket for.

Returns :

Returns a ticket if found, or NULL.

shishi_tkts_get_tgs ()

Shishi_tkt *        shishi_tkts_get_tgs                 (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint,
                                                         Shishi_tkt *tgt);

Get a ticket via TGS exchange using specified ticket granting ticket.

This function is used by shishi_tkts_get(), which is probably what you really want to use unless you have special needs.

tkts :

ticket set handle as allocated by shishi_tkts().

hint :

structure with characteristics of ticket to begot.

tgt :

ticket granting ticket to use.

Returns :

Returns a ticket if successful, or NULL if this function is unable to acquire on.

shishi_tkts_get_tgt ()

Shishi_tkt *        shishi_tkts_get_tgt                 (Shishi_tkts *tkts,
                                                         Shishi_tkts_hint *hint);

Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange.

Currently this function do not implement cross realm logic.

This function is used by shishi_tkts_get(), which is probably what you really want to use unless you have special needs.

tkts :

ticket set handle as allocated by shishi_tkts().

hint :

structure with characteristics of ticket to begot.

Returns :

Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on.

shishi_tkts_new ()

int                 shishi_tkts_new                     (Shishi_tkts *tkts,
                                                         Shishi_asn1 ticket,
                                                         Shishi_asn1 enckdcreppart,
                                                         Shishi_asn1 kdcrep);

Allocate a new ticket and add it to the ticket set.

Note that ticket, enckdcreppart and kdcrep are stored by reference, so you must not de-allocate them before the ticket is removed from the ticket set and de-allocated.

tkts :

ticket set handle as allocated by shishi_tkts().

ticket :

input ticket variable.

enckdcreppart :

input ticket detail variable.

kdcrep :

input KDC-REP variable.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_nth ()

Shishi_tkt *        shishi_tkts_nth                     (Shishi_tkts *tkts,
                                                         int ticketno);

Get the n:th ticket in ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

ticketno :

integer indicating requested ticket in ticket set.

Returns :

Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on.

shishi_tkts_print ()

int                 shishi_tkts_print                   (Shishi_tkts *tkts,
                                                         FILE *fh);

Print description of all tickets to file descriptor.

tkts :

ticket set handle as allocated by shishi_tkts().

fh :

file descriptor to print to.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_print_for_service ()

int                 shishi_tkts_print_for_service       (Shishi_tkts *tkts,
                                                         FILE *fh,
                                                         const char *service);

Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed.

tkts :

ticket set handle as allocated by shishi_tkts().

fh :

file descriptor to print to.

service :

service to limit tickets printed to, or NULL.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_read ()

int                 shishi_tkts_read                    (Shishi_tkts *tkts,
                                                         FILE *fh);

Read tickets from file descriptor and add them to the ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

fh :

file descriptor to read from.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_remove ()

int                 shishi_tkts_remove                  (Shishi_tkts *tkts,
                                                         int ticketno);

Remove a ticket, indexed by ticketno, in ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

ticketno :

ticket number of ticket in the set to remove. The first ticket is ticket number 0.

Returns :

SHISHI_OK if successful or if ticketno larger than size of ticket set.

shishi_tkts_size ()

int                 shishi_tkts_size                    (Shishi_tkts *tkts);

Get size of ticket set.

tkts :

ticket set handle as allocated by shishi_tkts().

Returns :

Returns number of tickets stored in ticket set.

shishi_tkts_to_file ()

int                 shishi_tkts_to_file                 (Shishi_tkts *tkts,
                                                         const char *filename);

Write tickets in set to file.

tkts :

ticket set handle as allocated by shishi_tkts().

filename :

filename to write tickets to.

Returns :

Returns SHISHI_OK iff successful.

shishi_tkts_write ()

int                 shishi_tkts_write                   (Shishi_tkts *tkts,
                                                         FILE *fh);

Write tickets in set to file descriptor.

tkts :

ticket set handle as allocated by shishi_tkts().

fh :

file descriptor to write tickets to.

Returns :

Returns SHISHI_OK iff successful.

shishi_verbose ()

void                shishi_verbose                      (Shishi *handle,
                                                         const char *format,
                                                         ...);

Print a diagnostic message to output as defined in handle.

handle :

shishi handle as allocated by shishi_init().

format :

printf style format string.

... :

print style arguments.

shishi_verify ()

int                 shishi_verify                       (Shishi *handle,
                                                         Shishi_key *key,
                                                         int keyusage,
                                                         int cksumtype,
                                                         const char *in,
                                                         size_t inlen,
                                                         const char *cksum,
                                                         size_t cksumlen);

Verify checksum of data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used.

handle :

shishi handle as allocated by shishi_init().

key :

key to verify checksum with.

keyusage :

integer specifying what this key is used for.

cksumtype :

the checksum algorithm to use.

in :

input array with data that was integrity protected.

inlen :

size of input array with data that was integrity protected.

cksum :

input array with alleged checksum of data.

cksumlen :

size of input array with alleged checksum of data.

Returns :

Returns SHISHI_OK iff successful.

shishi_warn ()

void                shishi_warn                         (Shishi *handle,
                                                         const char *format,
                                                         ...);

Print a warning to output as defined in handle.

handle :

shishi handle as allocated by shishi_init().

format :

printf style format string.

... :

print style arguments.

shishi_x509ca_default_file ()

const char *        shishi_x509ca_default_file          (Shishi *handle);

Get filename for default X.509 CA certificate.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is not a copy, so don't modify or deallocate it.

shishi_x509ca_default_file_guess ()

char *              shishi_x509ca_default_file_guess    (Shishi *handle);

Guesses the default X.509 CA certificate filename; it is $HOME/.shishi/client.ca.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns default X.509 client certificate filename as a string that has to be deallocated with free() by the caller.

shishi_x509ca_default_file_set ()

void                shishi_x509ca_default_file_set      (Shishi *handle,
                                                         const char *x509cafile);

Set the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

x509cafile :

string with new default x509 client certificate file name, or NULL to reset to default.

shishi_x509cert_default_file ()

const char *        shishi_x509cert_default_file        (Shishi *handle);

Get filename for default X.509 certificate.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

shishi_x509cert_default_file_guess ()

char *              shishi_x509cert_default_file_guess  (Shishi *handle);

Guesses the default X.509 client certificate filename; it is $HOME/.shishi/client.certs.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns default X.509 client certificate filename as a string that has to be deallocated with free() by the caller.

shishi_x509cert_default_file_set ()

void                shishi_x509cert_default_file_set    (Shishi *handle,
                                                         const char *x509certfile);

Set the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

x509certfile :

string with new default x509 client certificate file name, or NULL to reset to default.

shishi_x509key_default_file ()

const char *        shishi_x509key_default_file         (Shishi *handle);

Get filename for default X.509 key.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

shishi_x509key_default_file_guess ()

char *              shishi_x509key_default_file_guess   (Shishi *handle);

Guesses the default X.509 client key filename; it is $HOME/.shishi/client.key.

handle :

Shishi library handle create by shishi_init().

Returns :

Returns default X.509 client key filename as a string that has to be deallocated with free() by the caller.

shishi_x509key_default_file_set ()

void                shishi_x509key_default_file_set     (Shishi *handle,
                                                         const char *x509keyfile);

Set the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

handle :

Shishi library handle create by shishi_init().

x509keyfile :

string with new default x509 client key file name, or NULL to reset to default.

shishi_xalloc_die ()

void                shishi_xalloc_die                   (void);

shishi-1.0.2/doc/reference/shishi.pdf0000644000000000000000000275734712126773323014414 00000000000000%PDF-1.5 %ÐÔÅØ 17 0 obj << /Length 224 /Filter /FlateDecode >> stream xÚAKA …ïó+Þq÷`šÌìÌdŽ V,jçVz(íÖ.´…VÄ¿ïìvQ{ñ”ä%¼—ñƃ¹Ëf2 ‰R°y ($‡˜J‚¼Á¢šïº÷]WßXÏÕíóã¥ym·í¹=®ÛËø´:~¬öõ2Ï&Seh1 n0d%Û„7xuý‰¹Ïæd¤h ù‰´¤Îc}0‹%cSv305Iñ9\à…ɺÞk¹y1> stream xÚÅ™ÛN1†ïó¾ÌJÅxÆçÞºÐEÐdi…ˆC‰¨¥ªúú=ȆS&U¯v“¬¾±ÿ<g•ø.”Øl•ƒÍE”ѡ啰Nº¨…tõ Ê q2œ]Ï]ϳ ´j8:,š›éåÕåýåÝùeóñàìî÷ÙMvZîmî%®ÊI´–ÂÕ¬ù¼zf—ƒŸ /•€‡˜(ƒ¶âüvprªÄý¶'”41ˆ?õ“·Â‚’¨Ý߈ÙàË@µóX¼>°H4(<]½2‹lý˜­@‚‰ý„a o¢´&¾Ä §AFšmƒ¨å ðH ô µ"–ÕÌ5šlOö÷G[“é(‹jXfF 'ÓÙ2™PBXe}9ÑWúÍjÔídŒŽ§(ˆµÊLÀʳ£qÅ>rœ• ªñi04®”E¹Ÿ/IhôÒ?äóǾOÚÑU>3f—¼f0:‘–Uð<‘Œ$ƒ‘ä`0:9”’QOŽw3šœSËrNi!,TZÚJK7Ti3­†©ÚÒWTm3Pöâ>“~Œ‰&½Œ®NÂkdÕƒÔXµÆGSâ-i—Cô,Fg-‡ÑYËat’zC»1¯ôÒžiÎ{ºU0ªÒ}»,&ã~v'+Ö¢‘@¿? >äý°É½5„Õ´"´Y˜ó§jÛe€ÔäÏ/êuÄ7šîãÏŠÝqþhš?ß|¼ý´!zÇ[‰ Fò’ÁH~0IR£+„PÞó $õ„5Ï#ÙÂ`$[Œd ƒÑIª=­ºÀêÒ ˆÒZÓ¬ÕoÓ¢,óqÓ l¿P$߉k˜Ò^ã½}:‹Ñûlìp~ÓLDh®¨@¿PSJÎ2³è¨{ã\8Œäƒ‘$e0’¤ FWÃÐÒv¤W®aD¶ÔSC/#”´ˆÿ A'kaép¯´æýQà¢tàˆå¤ÃfÅLó¯Å¬êŠêuò¹˜µÿdV —mÙ ƒ×+ §'ŠÅ:c9º®a”4á?jo‘Ž"èXå0‚THþhzŒ¾i;¶òé²R%ÐêXG\¨þÔ{ö•¶³*3V»µD×)Âç³íiq¸¼Õ7ÎTn­#ve+¢Y|i§ŸVÍ»Ãö²€ž•°LD±`eô«nUmö1)‡Œ.ˆä+ƒÑ)ª mvž§(ƒ‘e0:Eˆ¤(ƒÑ*j"_/G9ŒNQ£U”ƒèå0šÂah NsjÏ ˆ×_Ç´¯z ÊØó–7=Ù÷~“ endstream endobj 35 0 obj << /Length 337 /Filter /FlateDecode >> stream xÚåSMOÂ@½ï¯˜c{Øqvö£»G5B 1Qèp P  Ôýù®m0Õƒ'O;Û¾÷ÞÎ[‚ôÅM.®zY€€Á±ƒ| Ö¡ ²×LA¾€I2^—ûu™J¶”\? šbT,‹]QÍ‹f{?«^f›tš¯zžÀdžN× É ;éê^eY~€Ä].ž…Š_ Ô‰”Ñk ó­˜L ñßMððZ#·`!kë ŒÅ£ s#^3jò|æÄ9ù['·OÕ¡¨ûVç¹q™1:•5H•JED?xO•Oºü·®v+hŠQ_ÄK°ÈöóT;jÿ2i¡V ¤Ê0hÝÁZQdÚ·Š¼s ¦ÒF‘ÿu1!ü-çíÀD*çŸS.’¡ŒÉú`›ùs›ÇAµ(Þ¾‹™ 1f1c£;ùºÞža d~óôÞS>㎠endstream endobj 42 0 obj << /Length 296 /Filter /FlateDecode >> stream xÚÕR±nÂ0Ýý7&C޳ãœí±• *j¥²!IˆD ¤Uÿ¾&*¦.U§{¶ŸïݳA#qŸ‹ÁÐ8pèX1ä%dŒìR0ÎW#!_Á,š®ëýºŽ•Qt÷òÀ¤(‹¶Ø-‹°|^ìºÅ&žçãÁÐXßÓ¾!¥hXy¹¾Wý~䈇\¼ é7 ä·¦B›f°ÜŠÙœ`åÏÆ@¨…ž¹…Lª”=ÞÀT¼ ºôa%(…)Yua„™QñÉÈS½?øqš2Ôa]um±s_=„Ôè´†Ä(ÌȆûeœHòv§Mמ­/›Õ mŸMw¸W82OgHF'Ñ?,Ú¹¿S?æåüÑ!2mLFf‰ÔÌ‘ºâý¬·ò¦:Ò¿‰Ûdi­… endstream endobj 49 0 obj << /Length 1456 /Filter /FlateDecode >> stream xÚWMsÛ6½ëWðfj¦¢R”ÈéIuâ|4nKnI0 Y¨IÈ8î¯ï.¤eEãÎôÄÅ.°Ø}Ø}Yp°àÍä·íd~±Êƒ<Ê—ñ2Øî‚t-ó$Xåð]ñ`[ŸÃÍ^Ù½šÎâ”…ë«w$\Ë4R’†—B÷¢š~ݾŸ_d,ÈÀá2A‡‹,Ž2žÁv·é«,œÓ'^ä¸dòz;ù6á0‡ü)X˜¤AQO>eA ¶÷‹y<¸™urÅÉä*ØL>MØaZx¥ù’ä9Eñ"¡XÎ÷¢í¤¡P¸q%,‹q fi­òc `>1å,Á€ªgƒÏe¥‹å‘Ï,•ÅoÂr×m%k©;Ñ©F“­Ù‘­ÛK~ŸÆ)ì~+Mã—§dв{À0sO ÑÃ"Ý©)‹ÑcÚGÛÉúä°µõÊVê c±,},~ÿë‹sR,xÌ¢él/rÈÀ³w{ëãë-¹È®A8ΣºW‡u…'u¯s¨Np¹`!:ãKjS¶zjO—3(\ÎðÌÒê¨<‹°±ÒðãŽlEÓ+½'AºšÈÓÉeSôèSé;Rô–`Q`WvvÐ÷AVÕs Q­iëÑ‘†>¤ ‹ª/eùb%q½‚ë*È0IØP¢–ŒëÍ|ûfC‡îb/ôôfWÂh£ƒwÑ þà”:º5rvÀX›ö6—•ÛíêçŽ6‚æ¹w**.O²Èä°x`|Åà”ÃìÍúâõüêúÝŸ4ôMŠ|Õ¹°î ôѼ5ŠZ+°ÊÎåÙtp’‘QÐèIÏà|ù”r:V÷ÅŠÕΡ¨Ô?²üˆzÅ!9ã ‚).•ßÂíÒûuµ´Xm~äH$9œÚ¡m%\Ü~›†$:œ|Eí~FÓ+ºwns¢u2hQËgQ@© kýmUÚ“¬å‚áĸø¦Ãžô‡F1ñdˆ &à%ìwlq:U‰Ûjp²Fî€C+;o4T¨\Å;¿Ø)TQ0áÝæã,ËÒ|ƇÍJn¶³ŒXò™^T¶!OCPà-ý„ÞŽÎÅI¢R€ÒVîIPùJì°¡ qÚ±´ðÚ®äÉb¹llçj:kG tÓ‘rõeîÞ !"Å0iõHÊᦃÚÔ…yl‡ªåOÝQìeqoûÚ{yl¥¿Î…c}Ðyþ¥ßÑöÅÞ;ñS“W¯7>Òµ—àõy}~ññæúh»·—k¬„óÙ)Ô6o×üå\!D‡ü§+º$3µ7Í›?næ”îÐðé Åyèo²˜ÞÝÅ 9”ÀGƒÞŸ¨,1#K ­…´åTk8:šW‹¿¿ôF+³Å8 ÿ ¡Qºl0³ Ú—H°{G÷jÐ7¾V<>ªãûì)F^Mó8\ãõ÷‰4@\å^V¥=&Ðy’³aS¥wpMÉÿzÉùsB¾5ÒW¦mvôÊõ¥…O¸Bê±F{]Œ>V3ž¤–fh¤«þ–’ü|ÐÀŸ•Ù9‰|äÈó#-z•àÍð+rêÏfG9[üŸ› ¯ endstream endobj 54 0 obj << /Length 557 /Filter /FlateDecode >> stream xÚT[oÚ0~ϯ8Ò^à!Ævœ‹ÇS7M×Ò•DÕTVE„ ’4!دßÉ…JºÁ$$ðw9þŽ1…' 0R>yJohJDÜoºA ©)q5xs˜vÜe”/£®ÊuÚ¹øêÔÅ$\„YÏÂúëMÁªûè]õ†  ­'³Ð®Òâ7­N¯^¸%E±=åYaˆ¡Àþ´€DM‡ÙZ™>R˜ãÞP"¤?+ätF × ¬Wà*w mŽõÞºç`RBÓˆ`¼txVˆfˆªM {eµÅ­™Iͯ=gÍ` éÝ‘¼Úè«{ÇIsÆ 8ѵ&êaôTdM¤¸ý±«jŒvܤÈvAÏ’yS­‚mRlê:YÔk3ª2Ó÷BÀù0`œHÆô²•™‚l@ŒPÓ¨A󘪌RÚÉ_ Þ‡‚Êqê&¯ùùÞùιÙÜ t¦ÄÔ厂Yå=©®Ù6NÒ<Ê[»ï ¥xã&pNzMý0QŒ¹˜öè^:øñc×wÆ¥Z gŒHý_pwrÞûæà¿àGöØž\\;öÀsnìÿڼ˓ýÞðÏ¥ßÛ×¹mc³MC¤ìðÕäúmÀ0.Ö]U¯(ÿËàómº‰’8ìi¿-´cñ MÎÖ> ³›e’E¿‚²9³y±.Oïh–mÓMÒšN+~~N4öóì¥ð÷j{x¾ TüÏ»ûm'˜ÿ endstream endobj 46 0 obj << /Type /XObject /Subtype /Image /Width 1401 /Height 902 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 82165 /Filter /FlateDecode >> stream xÚì½{\×ýÿ_ÜEåbäV`!¨)&V¢$©)1I•…Ú>DµJ*ÆúñT¼Ää"‰$òi„Ú4­Ÿ–ªD!(kjÌ QBBˆ"ˆr¿ù{?œÇwóÛÝÝ}=ÿàqv8çÌ™÷¹Ìy¿æÌ™›7 ð£[ Œ0Â#Œ0Â#Œ0Â#Œ°òÃRÂ#Œ0Â#Œ0Â#Œ0ˆà |…FOÈXA¨#˜wý ¬SÀJ6íÕ¨.­]Öªr&‚• ìÏÕ…Pü\[7;,¹€ÔÓÂÀœ_Á’Ö†Áؽó #XÌȰ6LäGÿ˜¦yÜa £aa[Žéà Û2@^ 3€k #˜nC˜`Ýdf€ÕÁbȤ€×_†`1޳-£ÀD /@.~ôÿ€)ƒN4Œ¹€Ô lØ&ÂÊ Ð`"Ø–0ѳ†`nµìv€) ìi^xAó( ÂÄ€-θ7¡ØÈËÀh%Œ6¸j`£þ2¬c€¢†S˜~1€aÀÄñv°uw¦€…ÊOjäDÀ °3À܃ .Àÿ°65TÂð|l&ZŸÀòKºäö70¢r0¯0>À*® ÀÕ¨ÀHh:ƒƒƒÿüç?ÓÒÒ~ñ‹_ßvÛm*•Šþj4š|ð‰'ž(..nhhiyyío±;ÛtáÌîª0*„gžyÆËËëG"¸ýöÛwîÜyîÜ9H LíLœ "2†ãäh|ýõ×3gÎü‘ñ@j€Ô`šçhsoLi(5`ô3– .øúú²Ž°Z­^ºtéþóŸÿtwwŒŒ\½zõüùó%%%6l ‚Ô©pð ^ccã’%KÜÝÝ'MšÛÞÞί¬¬ wvv )..fK^TTDGèxdddMMø¹÷ððpzzº···‡‡ÇÞ½{Q€áÎ&¿ÿþûY/øg?ûÙùóç⎎–——/Z´R¤Àa'{ááá'OžìïïïééIOO_µjsÜÛÛ»´´tpp°©©)%%…-yBBBKKK___VVVTT”x©!###&&¦¹¹¹««+-- Õîl‚Çsw`¸víšÈ„gΜyä‘GìÒ³†,`²'ž¾¾>&\PPÐÔÔ¤UòÎÎN6²Z­/5Õ××£:ö1Œã¦ã8¬X±‚u«ÿò—¿À[‡Ô`Ög3gÎDGG»¹¹1¥rrrbŽWWWÇÇÇ{{{k4š²²2ÞÙµðO-T*ÕÈȪ©£œm1}útÖ­¾té¼uH f} zë­·º»»ÇÇÇ{zzt VYYéïïoºÔ€U `áÁMÌà ªñÄðð°Y½õ‹/fee=ðÀÓ¦MS«ÕžžžwÝuׯOŸ>-ïE}üñÇéééóçÏ  œ0a‚‹‹ ”N·páÂÍ›7¿ñÆßÿ½2 åû¶48|øðàà`ccãòåËÙ‚­X±¢®®nhh¨¢¢‚}«ÂX©{$333&&¦¥¥¥»»›æ0¨ \0Ä€ 0…鸺ºZ`UÃèèè³Ï>;qâD}#ÏÒ¥Koܸ!A¾ÐâË/¿¼÷Þ{åýR§Å [ql=:cÆ µZZXXÈ–­¤¤$,,ŒŽGDDTUU k úf&ÜðððpZZš———§§g~~>jÂÄ`ÓNùeCË” î ¯¿þº9†î¡¡¡_ýêW‡šûï¿ppÐoýĉ...¦nV)<ìÛ±E(_d@µÂìÀ1¥4Es°zõj¶›ûùù544È>’¬[·Ž Ì;÷Í7ßüþûﺺºªªªbbb¸1322${ë^^^l„€€€œœœO?ýôêÕ«###½½½ÍÍÍ•••Ï<ó̬Y³ÄK –)<0DXØÛE%¢:P¾ b»ËÌíãS¦L!½½½]Æqƒá¹çž×¹qãF6Ž‹‹‹À×6…Ç¢§žzŠýï=÷ÜÓÝÝ-P¼?üðá‡VNá©5¯‚¬,ßð` ó±hÑ"-ÏZ¥R=ðÀ™™™GŽill3QjØÅhpp0$$„Y\\,mš={6ûß>ø@FÄ…¤Ô| ´(Ô‘Ý×2ÊãPôôôÜwß}¸¸¸Ì™3‡<îC‡õööë­ûúúö÷÷ D~öÙgÙÈ«W¯–æ­O:•ýïÀÀ€\Rƒe H ¨ø°hT¨)H »ìŒ¡¡¡ŒŒ î×(ôáîîþøãÜÒ›dçΑ?øà6rDD„4oû…ˆ‹/Ê%5X¦ðÀä5ï ¾€ešŒ`aÚÚÚrrrÂÃà ÎÎÎ/Vp#Ÿ8qÂày¹«¤yëÁÁÁì7lØ —Ô`™ÂÀꎭ´üöÎn³̾ 6`CC–#ðÃ?8p`Ó¦MóçÏ÷ööÖ'8ÄÇÇŽŽô¬/_¾,|º6ò¤I“¤yëÜOi>øàáÇ¥½IaùÂ@±Rƒðy¥¥²¼;&{y”?«ÁÔ jP`ÍBj\.^¼xðàÁßþö··Ýv›–Ú°uëVƒžõàà QÞ½´8gÏž0a‚Vñ\]]cbbrrrþýï‹)†µ ÅJ Š9‹<ûÚµk›››)&ý¥°£I è;èòÀ‘¥´"[áÚµk™™™*•ŠõšÕjõwß}gºg-‹·¾wï^áÍ-}ôÑ7ß|Sx›Gkó;*++ÃÃÃCBBØHQþEEEt„ŽGFFÖÔÔhÍT¥¥Ò¥±±qÉ’%îîî“&MŠe?2nTþâgÑ---Ë–-£˜K—.¥°ƒx‚˜t¡×€VdsTTT¨Õjá­å­=ztÆŒÂMüãÿ€Ô8ìtÑÛÛ»´´tpp°©©)%%…=EBB9ã}}}YYYQQQZî¼´Tº„‡‡Ÿ22räÈ‘¤¤$___~·k×.H €c:ÁÁÁäÑk¢³³“ “_¯V«µfªÒR CI|||$ä/þ,ì ”³ƒ¼@á3.£.Ðv­¡üffsØP»5½jpë´Eª««Ùdï ôÖ¿þúëâââU«VéÊNNNŸ|ò ¤À=šÉÄÇÇ{{{k4š²²2Þ9°îC1i©t9sæLtt´››;'‘¿±óv‡ÚR‹™vêp𪴡%J+*\!`ëׯs?|©|o}llìäÉ“>ú(7“•+WBjÙ㨬¬ô÷÷7V4–Š%((è­·Þêîîïéé‘–¿Õçí ÷­X°áááôôtooo½{÷²¥ÍÏÏ×h4 ]¹r…ìããÓÑÑAÇ_xá___WW×ǜٱ\wb900’’rÛ-Ö¯_Ï~…Mx§Þ"¡BÅ{î6:Ú«WWË>èííe›( }6ä­¯[·ŽÍ$88Rà€sÈ+VÔÕÕ UTT°ë3 ŠÒRé2mڴÇ“ÏØØØ¸|ùriùCj°¹‚eddÄÄÄ477wuu¥¥¥±¥MJJb†ÔÔTö ßãÇÇÅÅ1-ZÔÖÖÖÞÞ»cÇÞªOOO§h‡b.\¸ýHœðN¼EB…œÏÛÇpjŽ ü,ûà‹/¾`ÛçìÙ³mÈ[§{:›É¤I“ 5(5”””„……©Õꈈˆªª*‘¢´Tº0»XS>¡¡¡………’ó·îìRƒ±Õ××ë–öÒ¥Kì4U£Ñ SxÆ d"4440(y`` oÃøæ›o˜ð… è'Þ©ƒ·H¨PûÖ¬{Efz“ –2ùõ¯}ñâEcSmß¾­Ö-[¶Ø·>88Èfâáá©p@©@j°<*•jddDØóJLL½nÝ:6wUe›0 €wñƒ„"¡Bmð±Å ÄÁ†ª‰ éÅ_¼~ýºpü¿ÿýïS¦LaS%$$(Ä[§aù7Þèíí8Kww÷½÷ÞËfòüóÏCj0±´ÀDË2ÓKžRƒ±dffÆÄÄ´´´ÐŒtóæÍ¼Š1þüyóæ:uаxñâö[ÄÆÆ>ùä“Ìq .°©¶nÝßÑÑÁDÛ¶m›€}„‹„ åíSŽàâŽÌzKrssKHHxíµ×>û쳫W¯ŽŽŽö÷÷_¾|ù_ÿúWnnîÝwßÍÖÖÖ¦oÝ~á±Ç{饗Nœ8ÑÜÜ|ãÆ º„k×®ÑåPùØBCCé¿L,ÝÔˆ’ÛÉððpZZš———§§g~~¾>©¡¼¼<$$d||œ°gÏæ ÉÉÉì§%rrrÜÝÝy¿@A6š°ÔÀ[$Ô©Cé ¾ROMK â™7o^{{»\žµ\RƒH‚‚‚êêê”Sx`†‰A;!öíÛ—‘‘!—k†–†aGQ ©Á¡8þ|nnnTTÔ„ DúéwÝu×_ÿúWVkµ-©ÁÉÉiÍš5—/_VTá€&jíäÚµk³fÍjmm…Ô`õ:u´1GÉ® z­C#Û±cÇž}öÙåË—ßsÏ=þþþnnn*•jÊ”)?ûÙÏV­ZµgÏžšš¹¼oy½õK—.•——çääüö·¿}à¦OŸ>uêTgggº;î¸ã7¿ùÍ‹/¾¨ûAaH €»–LåPscH æ(‘J ‹-¢îßÞÞN#ÀŽ;˜ã[·n§‘ŽÇÅűñ322bbbš››»ººÒÒÒt‡…ÔÔÔ]»v1Ç?NiÎ"PZÞ)¶)p`ÑúÊnÇŽ&5ë­•°³³“ “®V«µfæÒRéØÐÐÀ„ëëëÙ˜!!!µµµL˜???6«K—.éæóÙgŸÍ˜1ƒÍŠ •ÄÇÇGB±Åû˜ì ”3^ ×—7÷ö "ãËõR?¤Ýw ¾ýö[&LØøAAAM7[vXhllÔh4ÃÃÃÞ°aÃÁƒÎ"PZÞYËÚÛ¹’÷¥„Ôà˜jCuuu||¼··7ÍÏËÊÊx'®ºZi©tQ©T£££Lxdd„Iþ¾ê̇Ŝœ²:yòdHHÈgŸ}Æ9sæLtt´››ûÙn Å6vm!-ï†Ûʪñ»y8 ÔÀX¡OßÈ@Çé§pí$&&8p`ll,,,l``@à,ÂC“î‰%5(Ù…ÿ¸8”ÔÀRYYéïïo¬h -KPPïªFÃû&‚nVo½õV``à矮•-ïîîïéé‘Vls8³nZ{{}/û³Þ­ôHä¦"âwó°Ý–&æŒW5PÏeÂF­jàþ<{öìܹsOŸ>½nÝ:á³ØÊª£$H @ óÿ+VÔÕÕ UTT°/ ¤¥ÒeÇŽÌ^ Ì;ÔlÌÝ»wÓOòFFFjkkɉãÍŠ\Åàà௿þZ+ÛiÓ¦>|˜üÄÆÆÆåË—K+6¤3aÝíAô½ìÏô½ÔÏ{"‘›ŠˆßÍæ[š´U 4´ß‚ þä“O2ÇÓÓÓãããÉ€48P€Ÿ™™IÕG6ìîîÞ¼y³¾êž?þ¼yóN:%| .ðvvÞ)ÁÚÊwܑۤGj()) S«ÕUUU"Ei©t ÍÅÅÅ××—»ÏüØØXnn.óyöìÙäcê;…7nÜ ãG1c/44´°°Pr±eŸ$Cj¸iííA„‹ ¼ÔÏ{"‘›ŠˆßÍÃ¥†={ö0ËHh(`Þw`Œ¼zõjfdxþùçi`ާ¥¥yyyyzzæççë«îòòrªšññqá³ää主»óŽT¼'²–µ¹™CjèEH ±úö /û‹|©_Ú¦"ØRçÏŸ 5*ɾ}û222,fy H ¶2’ÿȸ À·Ìе¶¿ªAßKý6q„:•÷¤©©©W¯^½|ùr\\Ü–-[Ä'¼víÚ¬Y³Z[[íFj°¡‘RÜ[«OAmטҮB±Wmá‚Yw{á—ýõ½Ô¯ïD"7Ô W_}Õ×××ÝÝ}åʕ̋Q"Ë R© yëËÁuKâÿ 5»¬ ̺ۃ¿ì¯ï¥~}'¹©ˆCI Ž6ÚXàªmŤb6ëÀÍN.p*@ó°9ŸN±uê°RƒNas†ÅÀ€É0pä*@óàší mI"¤€Y°-ãÛkÛ°±¤4'\,Ü.˜–‡»C ])º'ÀÄØœÍÑ*ìµá¡ÙÛÇ5b¯€é1°9k£IØkÛC£²› „ÔàÿÛ²³2?Õ'W‘dÉ^† ¡`ª +Ç-Õ—¹ðI¥¥2“J`±ª”Q`QB󳿡Æ*W„±ØÜ„“X«”àë­]»¶¹¹™ND)lRÃM;R¬Øµ±WÀäÆtd ²²2<<ÜÙÙ9$$¤¸¸˜Í¿¨¨ˆŽÐñÈÈÈšš-ÿ]Z*]†‡‡ÓÓÓ½½½=<<öîÝ+œÏèèèÎ;}||\\\’’’z{{…3aÕÕÕ¯¼òŠ@±y5 äææzzzúùù•••QØËË‹ÂUUUL„–––eË–Q´¥K—RØž¼÷õõeeeEEEi¹áÒRé’‘‘ÓÜÜÜÕÕ•––&œOvvö‚ èøõëד““7mÚ$œ ý=tèOyy¹p±õI ”[ooïþýûÝÜÜØpDD+5$&&²¥µ?/½ÀqÜË\PP@®·VþL˜ü}µZ­å†KK¥KPPP}}½îÕñæR[[Ë„ÛÚÚüüü„3ÉËË üüóÏ ^¬>©áêÕ«ä†U*}‚2´§(ìcœ±ºÑp‡8¬ÔP]]ïíí­ÑhÊÊÊ zߦ¤Ò…Üö‘‘a7ý©V«U·˜0atrrÎdúôé™™™¦_¬@ø¦Ým i[­Wá׈(îTVVúûû+HKÅ¢oAïOFÃûž‚¾L(òÌ™3óòò„/V­V÷÷÷3áÎÎNc¥xypGðg!5‚Æ–wÞy'==ýᇾýöÛÝÝÝU*Õ”)S‚ƒƒçÌ™“’’òúë¯÷Ýw0”‰ã†\q€…9wîܶmÛ¢££éŽìââ¢[G¨YL ÌÑ®&lËx+V¬¨««ª¨¨ðññ)HK¥KfffLLLKKKww÷æÍ›…óÙ½{wlllCCÃÈÈHmmmRR’ÁLZ[[ÃÂÂrssŠMþ¬¬¬¾¾¾‹/&$$@j0÷= ·-àüðÛ6mrww7ø²““Óüùóÿö·¿ŽŽÂnºç&''| 5 gÖí @jXÆ--))!g\­VGDD°ßV0(HK¥ËððpZZš———§§g~~¾p>ccc¹¹¹Ì—)fÏž]ZZ*&“Ë—/ßyçÙÙÙúŠýÅ_DFFÒAFóꫯBj0«Èà8K0L9,£££»v횤tmy+Nd»‚©!5Ð-EÚ½ÈàPoOà ¤§§ç‘Gá¶vOOϤ¤¤7ß|³¦¦¦µµuhh¨···¡¡áСCO<ñ„‡‡fÂ÷ߟ­‹‰'îÚµ«¾¾~pp5‹®m™vSCjÀ#@ÚŸÈ€Ý/Qf;æÆsçÎeÛ¹««kFFFOO@’¾¾¾—_~ÙËË “:H ŽÃÚµkÙºxþùç-PûÀ¤ñí ¦†Ô°K/c—}{yvÿYô1>>Ç6r??¿/¿üRdÚ¶¶¶Å‹£w˜uÆ‹!H9üä'?aëÂômQQ³ÌÑ®`jÜR€:µ9ÁÁAjMÚÑ(**b¹±Ýñññ;v å@jp¦L™ÂÖÅðð0Ü(tm¶+˜· NmNsp¨Û:¡ƒpíÚ5îK‡––OVVŒ ©uŠšE3@K€Ô€GP§¯Ë1osŠœœ¶…ÿæ7¿1߉jjjvíÚõàƒÞ~ûí®· Àüùó©çÎ3%禦¦—^zéᇞ9s&óΉ'òÆìííýç?ÿù»ßýî§?ý©¿¿?EóööŽˆˆHII9räˆìŸì4«ÔÐÜÜüâ‹/’§OŸîâââááqçw&''¿ûî»cccf²dkkkYYÙ³Ï>»|ùò{ï½W£ÑP4•JåææýÔSO={ÖD»‰¯PG“dlÀüqzz:µŸ€€ª¾ &P+š6mÚ]wݵpáÂÍ›7¿ñÆßÿ½é×h™6sñâŬ¬¬x€.A­V{zzÒ…lܸñôéÓFåC}§¢¢bÍš5Ô›¦NJÃÔŒ3zè!j---%5ÈeRbdd䨱cÛ¶m»ÿþûiاª§ §L™JwÊsÿþýÖ²ŒùîM²ØÐb]x1fò%-“ÊDJJJ|}}•éLÙå(”<@.ÆÇÇCBBØþ¯ýËgùöÛo—.]*üvÒ²eËôM5¦ýýý¿ÿýïi꥕MêtçºûöíóóóþdçÉ“'-ì–Jˆ388˜ššª{Õ,äÐÜmCš%Eîi³xñb1µil1î¹çöÈsÏ='²È“eSQ&Ö£øý|äÝRÆLmƒZˆÅ¶'2w›}öÙg'Nœ¨/g|nܸ!&g²LTT”¾|T*UZZóUYLd¾veâ#£IÇÆÆþò—¿LŸ>ÝØÆ&Í8ÆšÈ|÷&Ylhá® ¤‹I Â%”–ÊÄj4š>úHˆýI wv顦‡Ï>ûŒmÞ?ùÉOÌqŠ>ø`êÔ©bfJžžžbF9–ÞÞÞŸÿüç¼Y‘¯ÊMÕÓÓóË_þRL(áŸþô'%K }}}ÑÑÑ/dòäÉUUU²[Rüäß××WÌ£j£ŠQ\\Ì¡{¢˜‡ø'00MõÚk¯Ù¢Ô c>qâ„‹‹‹d'ά֓Ðf†††~õ«_Ìùþûï7øáÈcÇŽMš4É`V>ø`¿K 2š”Ú-»i°¥óÝ›d±¡å»ªCù¡ÀŽÛV5HÃÉÉi||\ß×®]ÛÜÜL£¿†Ô oÃÀ^ Xì•={ö°5þûßÿ^öü?þøcòyÙSмî™gžùꫯh zýúõ/¿üòé§Ÿ¾í¶ÛØ4³úôÓOEN’’’˜ÀÝwßýúë¯÷ÝwäܸqãäÉ“K–,a“Љ~úÓŸrMÒ ùî»ï^¾|™&„mmm‡š?>7ç¿ÿýV­Zż¼¼²²²jjjcR ;;›»íY^`z,Á’lªààà?üáo¿ýö7ß|ÓÝÝ=22råÊмyófWWW6[òñé¿âMd°fÞ§`(//7XGe㻹¹‘¡lNj±wttp[H@@@NNõ¸«W¯R%öööÒ¢²²’:é¬Y³ä•ÌÔfÖ­[ÇæÎûæ›o~ÿý÷]]]UUU111ܘyROáê Ó¦MÛµk×¹sçÈøÔ¿hÈzî¹çÈßdþ»zõj;–ä2)Ù:²–JS\\|áÂ…k×®QÓ½téÒûï¿O£Vxx¸å¥³Þ›L·¡Uº*„`⃵ÊO]’F3ggçëØÂÑ:IS5-OSZ*.4p͘1ƒU (0}útJ2::ºsçN¾h~Eã›I~~¾F£¡éÄM¾í¼½½éÍD¦hDjiiY¶l³"‹û:!¼<ëªRè¤(³ÂILLdÇ–7ÞxCÞÌiÂÆ]7{Ï=÷\¼xQ7M™¸žÔwÜÁއb¦ [¶l¡©—@1V®\Éud>ÿüsÞhäY°Ñ<<+òn¸|ùrá2”••±‘o»í¶††Èëׯg#ÿîw¿S¬Ô@n‘ÀÌóêÕ«¡¡¡ldº×ÈbIñ|óÍ7ìsj 8#ŠA­”û|Ÿ|Èä>P6þ'Ÿ|bsRƒ¼ ˜Ûß?øàå D¦´™Í›7ë‹I“7î^4ì#-h"'­sÙ«Ô`ºIKJJØ8“&M:sæŒ,#>‰îM&ÚP±]Õæ¼fXÃÍh­2Ó`RPPÐÔÔ¤U˜ÎÎN&Ü××ÇîÅ–PZ*-þøÇ?&%%1á+VìÛ·4ÎÔÖÖ2ÛÚÚüüüØL.]ºÄ=—V ±±Q£Ñ0Ÿ]Þ°aÃÁƒor^  ¢â \ˆ‰FÀë8øøø°·’~øAÆœi6ÅÍüСCÂñ¹SS‡†† Þû\\\h(œíý÷ßÏÆ/**ŽÜÓÓãááÁfNn…2¥†cÇŽ Ÿ·¼¼œ»ò–w‘€±–4Š´´4‘«e$cΜ9bfþ7oIúlÌŸþô§ t Æ‘·sßLPÔX$­Íøúúê[·Ã@-„¼zõjÝÔ;~üãKë\v)5˜nR‚» //ÏÂþŽp Ü›L·¡’»*¼c˜Þ/ÕÕÕñññÞÞÞä§—••ñzUº~½´TZtuuÑ A7ýÎÎNš0‚¹Z­VÝ‚ÙjÛÉÉI|扉‰ ãAØÈ8ª@&r¸¯' ?I4–Çs׌?>>Î}\øÎ;ï¼ë|ÎÝôÒßß_ß‘KjjªŒo”˜Cjsjö^¢¢¢ÂDKË©S§ØÌŸxâ ‘&YŒ×_M¤osHºErþñ´9©AöÌÝŸwŸ‘ÖfvîÜ)œí|ÀFŽˆˆ–$t.û“L7ééÓ§ÙäÔ‹i·–”,po2݆J¾Â¶ð„©¬¬¤[¶±¢´T\q    ??åÊ•ÌFÃû¦ƒ˜ÌÏž=;wî\Ìeyó^ÞM<Ê·ý ÅýENNNìDÌ~þâÙºu+›óÓO?-&IFF›dûöí§sûÛß„3änz)ì¼°9r„M²~ýzJ YYYbNýÜsϱIž|òI-i,W®\a3§»•H‰,Æ7¦L™Â¦¢*ãvüøqîz ƒ› *Pj½‹ßÁÂHk3'Nœζ­­û¬Y7ÂŽ;Lé\ö'5˜nRî )[¶l±˜eD&±À½Ét*¹«Â†…áð²bÅŠººº¡¡¡ŠŠ ‘~½´T¼sžˆ[¼÷Þ{̑ݻwÇÆÆ644ŒŒŒÔÖÖ²oXˆÌ|þüùóæÍ;uê¼}ºÁé»gŽ>¸ÛÚ §Œ¥¯¯O¤¿c-©Ax#D^—“טFYR‹ÞÞ^º9’¿O“v²ÒÔ©S™7y™2eŠH‰/Æ_|Á¦¢Së6ݶ¶6º·²q>üðC[”doÀgÏžÕ­)WWט˜˜œœœÿû߃ƒƒfjÌÔfÄXØÈܵñ:—ýI ¦›”û9ï¾ûNiRƒîM¦ÛЊ]þ/°uk£=Ⱦ}û„¿hŒ:Ekt¨AU) î6×ä¾É˜3wW«žž1I®]»Æ&ñôô48=cvÇ)¤Lœ8qÒ¤Ioá| õ-˜ s§[pówssS Ôpýúu1§&› Ó(KrÆÌÌLöcb`w"2½B¹Ì;W`ô /¼Àþ÷®»î2Çi©Á xïÞ½•åââò裾ùæ›Â›Ú+2˜¯Í˜^eìFšÒ:—ýI ¦çIŽŒ‹åd—,po’åº,ßU1eöas4 Ó¡AoÖ¬Y­­­¨S´F˜Ui Ë–-cïùË_dÌ™û‘A‘»@ŒŒŒ°IØ/û˜2£L~d ”D“¢ SÂe^¾|™»±¼,f”lí?ýéOú¾²1>>Î}®šŸŸo£Rƒ™ðÑ£Gg̘!œLúüÃts)¡ÍÇ—0Rq;¤ávkú@²K J¸7‰ŒoÉ®Šù*°³Û}«}²ª›?“………¨S€‰pþnܸQÆœ•ðäè¶Ûn³?©AäƒWƒÆ4ö2ÉŸ7o7ÕÃ?üòË/ðÁT*­}æÍ-5ôöör7‡d?Eœ‘œ³BÚŒø½$t.…K "`ÈkRìÕ`¦ë2_W…÷ 5´7sÌQwvcT¨4ÆÇÇCBBØJ—ñ£6Ü]¾+++Å$á~àþÁ4}zF™°‘Ïž=kRñcÇÄœúÝwßÿ 1.Y²„ÿüóÏ Gþþûï- 5|ùå—ÜÍ!¯¡³³“û]•ýë_¶+5X¸Ë&yòÉ'MŸè±ñ…#—––Z@j ¢¢¢Øä™™™täå—_fÜqÇV©S¹jßZ xݺuìyƒƒƒ%ç£6#Ÿ†S:—å¥î›׺|òÉ'–—²³³ÙÿnÙ²EiRƒîM¦}òvUÌTáe@j°JÃs±K/Õ —îînî†áGŽ‘–ÖœíwÞaóœ5k–˜¸û_é+†QÓ³S§N±‘ï»ï>ûD~O!,,ŒMRQQaúD—»TÀà§"’““-#5ìß¿ŸMþãÿxdd„ìÃÉË˳i©ÁZ ˜»\œê]r> i3Âñ©w˜Ò¹,/5p_«©®®޼gÏËK }ôû____­9Œ…»‹ãØØ˜éÅS½I.©A®® ¿C<ýýýkÖ¬quuõóó£[ S ƒæp¹¹¹4é¢äeeeöòò¢pUUatttçÎ>>>...III½½½ºe á4==ÝÛÛÛÃÃÃ*Qî*Jj0x;³-_•·`(­ I xuR Ð¥°°ítËûþûïJ>>>¾}ûv­–CÓKʊͶ¼¼\8î3M}މQÓ3*ØÝwßÍÆ÷Ýwí@j³è÷èÑ£ú¾Î y¢ËÝK­­­M æÅ‹'Ožl©¦aܽiöņÛÛÛmZj°VdOJSYÉù(¤ÍǧÞA}DZ粊԰xñb6æK/½$“|­ïXƤ7ÿÿŸQ.¤Q­ˆ×í2¶xJ¸7É%5ÈÕU!5ˆgëÖ­ñññt‰‹‹Ó*Æþýû“““oê‚iiiÔ’)¦››Žˆˆ`"dgg/X° ¥¥åúõë”Õ¦M›tË‘‘ÓÜÜÜÕÕE9@jP²Ô`g>—V×®]KíÒ_ Cj€+mÇj $S †¹c²O‡Ï;'2-y=ö¯ýŸyæîVZW¯^Õ— ݵ5 9++K®éÙÛo¿ÍUQDnû¦p©aæÌ™ÝÝÝú"“¹;ÝѼEKr}‡×_]_´±±1šYàc—,7nä}–´lÙ2kÕ©Œµo•üé§Ÿ²'3gŽä|Òf Æç.ø7ªsYEjxñŹË0>×Ƚ. K d#Lž<Ùàê î¸ã6«¯¿þZ–â)áÞ$K’««BjO``à·ß~Ë„¸Åøøã£££…¥¦½12V©TL„ÚÚZv~Eþn‚‚‚êëë1÷¶V©*++ÃÃ鲊‹‹Ù“Ñ:YSS£UõÒRé¢oÝ‹¾¬x×À0ßg7úו+WØÈ”3{tü…^ðõõuuu}üñÇÙV­5jµ´´Ð\‹yÿšÂðò€W(¡‰Ü¸qcîܹìâææöôÓO ú­¯¯ïå—_æ¾|¡›'w+òûî»ïòå˺ù\¼xñž{îá~ƒr–qz¶|ùr6 M n}Ùßßÿ׿þ5**J±R1oÞ<ÞÇÄtìÌݬ€.GKþ÷ÿ7wQ4M±x›sÓ±¤ÔðÕW_ñJ ÿ÷ÿgRƒ¼ ˜úøo¼!üh˜í{ï½WüvŽÊo3㓟#Õ<À»††/®e¬%5477«Õj62Í9y£Ñœs„ Ö’nµN™2…û9Z]NŸ>ýðÃóþ+!!ͧ  @–â)áÞ$ßÂ]ÓTñ¨T*Vßa‹ÑÚÚJþµ^WQ÷M }aêݪ[0ý×Éɉ· ·„…Ô`¾üÉ7/--%ﻩ©)%%…=) VänÓ(‘••ÅÞ‚Ù’HK¥‹¾u/ú²â]Ã|Ÿ‹QRSSÙ¯å?~<..މ°hÑ"šRÒÝ066–Ý£F«`tºÄÄDöÔîåÁ@˜žžšìqç?žžž«V­úÛßþvîÜ9š‰ Óöí·ß:tè‰'žàŠ úú×'Ÿ|âââÂÍ@ÊFHšìQà¹çžã~×ÞÕÕõ³Ï>“×3¥2s7$yä‘?ýéOuuu4U£9]8ü'NœØ»wïâÅ‹Ù+SjX½z5˜6mÝqXcþç?ÿ¡›÷‹ö“'Oþè£ä²ä¥K—¸ûÑM:577÷믿¦û&͇)@Öc·\³fŤBל>}úøø¸}H 26`öîÇ{쥗^¢$4ý ÆC™\»vºÕ)÷m‚ÐÐPú¯d[)¤Íˆ‰O=…»³Í srr¨OÑåSÿ¢^F;â±}Ð*RAÃ/7þ’%KNžµÛúúz2éÐÐÝS¨Ø4ˆ±û«ðæóæ›or›Ðk¯½F­]xë1ųú½I8¾…»*¤ñÙuW5Иýá‡òÊFI ƠˆU Ö-UpppAAÖ"C:cgg'{×V«ÕZ5+-•.úÖ½èËŠ·µPdºA3áÆÆFjuÌ ºaƃ2ا”<00·`ì t]xRƒxCÁ Mchº¥õÒ´î¾ûîãÇóæyúôiî„Mr“?þøc'ä\gûhX$Ê”úûû¹ß@ÔU¢¾‘lÉ’’î‡öôñË_þr``À’Rßÿüg­2ìÞ½Û¬·KJ 26`£’Óü¤®®ÎDs)¡ÍˆŒìØ1®Ú ‡zˆú u¥r‡µ¼x^âããiöh-© §X÷Õc‡\²¶ÖŽŠ,žuïMJëªD’žžN=ëÊ•+`Š‘œœüÚk¯q£QÓºpá‚©n^±±±ä匌G™””¤933“zVKKKww÷æÍ›á[Y¸TÕÕÕTõÞÞÞä¡³ëµ ŠKÒRé¢oÝ‹¾¬x×ÀhENLLü‡?üaþüùt×sss£™6Ý:i”›3gÎúõë÷ïßoÔ&uçÎËÎÎ~ðÁ)7×[P€~îÚµë?ÿù™&äZŒŸ:uŠ&áÑÑÑ¡¡¡S¦L!‡}òäÉt¿ž9sæ/~ñ‹ßþö·Tž#GŽ´¶¶*Vj` ãçååQíЅдgêÔ©³fÍZ»ví»ï¾+æ“p’-yýúõ‚‚‚G}ôÇ?þñĉɆwÜqÇ‚ ^yå®Ñ,)5ÌÓ%†_ÿú×c-/5˜Þ€/]ºT^^Ns`ŠöÀLŸ>š Mh©k{xxP=þæ7¿yñÅeãÒºmƨøÔw***È}£ÞtÛm·Ñ0EV¢^Ffinn–½Ýš˜á‰'¨¨ä†S J¤fðóŸÿüé§ŸæŽÌÖ•Þyç7FFFRP«Õd^ƶtüÏþscc£@ƒƒƒ%%%+W®Œˆˆ Ë¤F+‹Ô`Å{“p|kuUÌ÷Œâüùó4Ã_p´R­X±¢®®nhhˆn>>>"Ei©t³î…û“w Œnþ4Ï›7Ý Š",^¼¸ýtº'Ÿ|’9®µ\^žu §§‡»Çà÷ À½•FjjêÕ«W/_¾·eËÔ…£•ª¤¤$,,L­VGDDTUU‰ ¤¥ÒE̺îOÞ50ºù———Sžì&WaÏž=Ì(’““™·*nê,×Ô¤Õ&Œ°! X!88XÌ¢po%ðꫯ’ F×Ê•+j7NH v̾}û222ë ¢¥Ù߸(6AWW×´iÓØ‹ýf¸· æÚµk³fÍÒzŸuŠ–Ó¡ºëׯç~w£££6ÌQ@;0¯ì[éžE¥RjDppŽ9½ oܸ6¸·Àaë--ÍåA¥Àz;¦§§§°°ÐÕÕ•ÕÜÜÜí£o§Ã¬ó[Û[ ä€Ö©n5 ´ÚÄ …QZÁ8§Ã(×Ûà×u­åÈË%5˜OcÔ³NÑÀ°“b`À‘¥†íÛ·Ã2€9ª¼Þ®jX»vmss3%§¿†Ô äÖå ¾rZœMp©aâĉ&11ñÔ©S0 Àé`¨¬¬ wvv )..fÑ:YSS£å;HK¥Kÿš5k\]]ýüüòòòؘ£££;wîôññqqqIJJêíí>…@üüü|ºý©T*úÙØØ¸dÉww÷I“&ÅÆÆ¶··k• èn0¨/ÿ–––eË–Qœ¥K—RRƒ)¨¹×ÌXøJyOç8¯ê๶Y; Ÿí{{{—––655¥¤¤° ÈwîëëËÊÊŠŠŠÒš÷JK¥ËÖ­[ããã;::Èë‹‹ccfgg/X°€²º~ýzrrò¦M›„O!?))éÊ•+ÌÏððð“'Oö÷÷÷ôô¤§§¯ZµŠWj`Ù¿?å&?ILLdK©Á|Þ“Í­jÐ:ø0vããÃM–«6ñ°¹ù^pppAAASS“VÂÎÎN&LN½Z­Öò¤¥Ò%00ðÛo¿e lÌÚÚZ&ÜÖÖæçç'| ø—.]â=5%÷ññ>þøãèèèÁÁAüYÿ‘L(t±îšª»äädñkf†‡‡ÓÓÓ½½½=<<öîÝËæÏ,Œ¡ý‹•­(2åÐÑÑAÇ_xá___:Ñã?Î4ÝÏnŠ_cë^|L¸í0G­®®Ž'Šœ©²²2^gA×—–J•JE~acªÕjÕ-&L˜@œœ„O!2þ™3g¢££ÝÜÜËèFc­­­äÏ^¼xQ8ñ¾•cJ Ö]3³}ûöÅ‹wtt´µµÅÆÆ\3“‘‘ÓÜÜÜÕÕ•––ÆæÏ.ŒIMMݵksüøñãqqqL„E‹Ñ)ÚÛÛé,;vìà-˜ø0v 5ÀÍÀÁ¥–ÊÊJcEi©XxW5h4^wLß)DÆ zë­·º»»ÇÇÇ{zztKÈÈÉŽŽþðÃÙ„úò·uÿËÜ¥²úšjTL¸¾¾ÞàšjM×DìÂ˜ÆÆFj ÃÃÃÞ°aÃÁƒ™ܳÐIy &~ŒH {aLààRÊ+êêꆆ†***t_(Ð'HK¥Kzzz||ü•+W:::(ÀÆÜ½{wll,yp###ä&%% ŸBdüiÓ¦>|xpp|ÆåË—ë“’““_{í5nB}ùCjƶÖÌЊ&ìë%&&8p`ll,,,l``€‰À=‹°â8ÛBk/P››ï•””ÓDþQDDDUU•H·NZ*]úúúV¯^íâââëëûüóÏ;;;3ÇÉ•ËÍÍe^ÌŸ={vii©ð)DÆ?zôèŒ3¨Ø¡¡¡………ú¤Ý/PèËRƒH¬²f&((ˆwUƒ¾5*úV5pž={vîܹ§OŸ^·n{ÊÄbª‚¢Z¼KsTrþüùÐÐPÔ…=•ʺkfvìØÁìÕÀì¢`p LfffLLLKKKww÷æÍ›õå?þüyóæ±Ÿ§t–ö[P¶O>ù$sÜÃÃãÂ… ÕÒà]©A!¤¦¦^½zõòåËqqq[¶lA]ØS©¬»ff`` 99™Y3Ãý…¾5*ÃÃÃiii^^^žžžùùùúò///§´ãããl„={ö0_  Ó1oU999îîîVù–(\~{7`÷Ö`at?øê«¯’›FNÙÊ•+oܸº@©ξ}û222ë Z¾NÑŠ,0lb¸˜ï[© ´c¹víÚ¬Y³Z[[¹6tð:E+‚yÑ$0G¨ ûk!úÖÌÈ~•JUXX¨uu €{ Ph!hi²œ ‡…œ%Oí{R ©ØYÚè6¶X›x`¾' FB*}_%@]À#pØNU ÆQf`—ó=‹­j°¡Ù¬ÝK XÊb™+5ø˜Û- Ž$ŽŒ<‚ÊÊÊððpggçââbö¼EEEt„ŽGFFÖÔÔhy[ÒRéó¹ØÜ@nn®§§§ŸŸ_YY…½¼¼(\UUÅDݹs§‹‹KRRRoo/¤3¹Ò²/e‘ñ,–T ä-ƒ@ÅAj°³1F(5x{{—––655¥¤¤°çMHHhiiéëëËÊÊŠŠŠÒš6KKepΕÒÒÒz{{÷ïßïææÆ†#""˜ÙÙÙ , s]¿~=99yÓ¦M¬âY÷ì6*5« Ðìo Ç ÀÑæ{ÁÁÁMMMZçíììdÂ}}}jµZËÛ’–Ê(©áêÕ«ä†U*!$$¤¶¶– ·µµùùùAj—²ðæÃ»¾%??_£Ñ05Î=Î{ºþþþ5kÖ¸ººRKÈËË¿f`` %%å¶[¬_¿ž~l«ÕÕÕ¯¼òÊM¾Õ5]]]ÞÞÞW®\a"ÓrBÍÚÒà?Âm‡Ô,0å#¿)>>žœ#rëÊÊÊ *¦¤2JjàÆÕjµê&L ƒNNNÄcÝ¥,úòѺ.òÜY‡Û0xO·uëVjíííqqqâ›\zzú¢E‹(U[[ÛÂ… )ᄇòññ)//gò®®IMMݵkáøñãTáêÓ½v3µ4|r`a·²²ÒßßßXÑ@Z*Ó¥FCþ]V„JeÝ¥,úòÑúyéÒ%Þ†Á{ºÀÀÀo¿ý– 744ˆorß|ó ¾páýH˜——G'úüóÏÙƒ¼«k©}SxÆ 4JÀª;Àaà€RÊ+êêꆆ†***Ø•Þi©tñðð ÿN‚Ô°{÷îØØXr*GFFÈ×KJJ‚Ô ë.e1*álÙŸ*•jtt” S“/5h%dµ Þ„Ó§OÏÌÌäÔ·º&11ñÀcccaaa/eðª Xx`8^ Ž6å+))!oˆ<¦ˆˆöû=i©tÉÉÉqwwçý…°Ô@N\nn.óÎþìÙ³KKK!5HÀ*KYŒÊG¤Ô yUÅgÂõõõ [ZZfΜ™——ÇÔ·ºæìÙ³sçÎ=}úôºuëŒõIÍÑÒà9ÂmGƒ˜ò¡"ÌZ*ë.eáÍGßú‘RCzzz||ü•+W:::( ~! w“‡ØØØmÛ¶ k­­­aaa¹¹¹ÌAÕ5óçÏŸ7oÞ©S§Œ­M3µ4 #H ¨ó•ʺKYxóÑ·¾E¤ÔÐ××·zõj__ßçŸÞÙÙYßÙµNÄýÄ|âòåËwÞygvvöMÁÕ5åååt|||\B…¢ËÛÓ¸#8¹æ¾ ³>·uÀ*€[ªËùóçCCC­^Œ}ûöedd˜ÒSÐBìfôÆ ³>`CU€¶Á’ššzõêÕË—/ÇÅÅmٲź…¹víÚ¬Y³Z[[MqNe©Y´tR4€‰ŒoO Ã’KY^}õU___ww÷•+WÞ¸qÔ³›XlНR© e1: RŒ²YêÔDµ C!µ #8¼À¶ÌŽVaßMN²Ú€†¡¨ÚÄ SV`C6G“°×Vgz-£a “b`öáùÂÚ¶âX2•¼×«(ã[¬NÅ·F »ôag —SF7Y87i©îÝ+m3}u*²Mb|PZ…¼``[ƪ+æia©}ƒ‰ò€é+°ÛŠ)jeeexx¸³³sHHHqq1›°¨¨ˆŽÐñÈÈÈšš-÷YZ*Þæççk4•JE?—,Yâîî>iÒ¤ØØØöövᜓ““]]]ýüüòòòØ ¤¤¤Üv‹õë×ÓO6ŸÜÜ\OOOŠ_VVFa/// WUU W·Áœ¤†êêêÀÀÀW^y…£££;wîôññqqqIJJêíííêêòöö¾rå yxx˜þ+¹NÚ'¸í€\1&„ŽlR1¥%?·´´”|ö¦¦&r¢Ù„ ---}}}YYYQQQZT¼%$›u´ÃÃÃOž<ÙßßßÓÓ“žž¾jÕ*᜷oß¾xñâŽŽŽ¶¶¶ØØXöD”vÑ¢Eííít|áÂ…[·neóIKK#ÿþýnnnl8"" b œ³¾„‡òññ)//gfgg/X°€.äúõëÉÉÉ›6m¢ƒ©©©»víb"?~<..Δ:åm¥ `F‹I ÁÁÁMMMZ ;;;™0y÷jµZËï––Š·„—.]âýåÀ>ß×—s```CC®¯¯gOðÍ7ß0á .ÐO6Ÿ«W¯Þ¼µ‚fÖTˆ‘ôåÌ›0//Jøù石CBBjkk™p[[›ŸŸßÍ[k94Íðð0…7lØpðàAëTŸÚ€¾¬À #;ð”dl·ê…ãTWWÇÇÇ{{{“·[VVÆë±?¹/HHeÐÕ:sæLtt´››Sr'''áœU*Õèè(ÑwœWôÐ.¡¾œyNŸ>=33“{â«n1aÂî&&&8p`ll,,,Lौ›¢×®Cc´­ÁÙþÁØŸÈ Á#¨¬¬ô÷÷7V4–JŸ#ôÖ[ouww÷ôôèËýIñõ­jà ”KjЗ3o–––™3gæåå±5 Ô|öìÙ¹sçž>}zݺurÕ)5ÁmG™VñV¬XQWW744TQQÁ}aAX4–Ê #?mڴÇ666._¾Ü Ô°cÇf¯†öövî^ [·ngoÛ¶M²ÔàááqáÂö§¾œõ]ZkkkXXXnn.sp÷îÝ”ª¡¡add¤¶¶6))‰?þüyóæ:uJF/RËK %%%ä «ÕꈈöC Ei© J G1ceZXXhPjHNNvqqñõõÕ÷ p¿@a¬Ô““ãîîn0gK»|ùòwÞ™Má±±±ÜÜ\æS³gÏ.--eã———Óñññq¥¨ Êï¡0Àþ¤ öíÛ—‘‘a¦:EKPrÅ x@v®]»6kÖ¬ÖÖVóÕ)–7 “b`Ø™G üý6%—ÐÄK£ø*•ª°°ÐÜu µ€,¾3ì€:ÕJŽV¡œÚ„å–»¬S«¨ øp­rê ½NÍíáþÈv@'ÅÀ°]@òf†æ+RII‰¯¯¯ð)ôý×Z†•«NÍäk+|9­¬vH ¦ˆVôô5ÍG}dŽbÛDÊëhÛ¢ónõ2CåØXÕ Œ““Óøø¸´ØÔpS>µÁ¦—XQmÀ^ õ¡,ÞÊÊÊððpggçââb¶0EEEt„ŽGFFÖÔÔhùìÒRñ^5oas`` %%å¶[¬_¿ž~jhpp099ÙÕÕÕÏÏ///Ï>¤ƒÞ®˜sÙÇkÖU0°àãíí]ZZJ¾ySSùïlaZZZúúú²²²¢¢¢´œYi©x¯š7‰°žž¾hÑ¢ööö¶¶¶… nݺU+ÎöíÛ/^ÜÑÑAbccíFjö² žËž¶;ÀÖ  X©!88¸   ©©I«0L¸¯¯O­Vk9³ÒRñ^5oa?: à›o¾aÂ.\ ŸZq˜p}}½=I úmƒ®·]:æ–¼(È8M"©®®Ž÷ööÖh4eee¼^û“ HKeÐ}S¥RŽŽ2á‘‘]MC+‚ýI ºÚ‚Áw+ìXj°Ìua¯¤c©¬¬ô÷÷7V4–ÊD©! €»h!00P+NPP}¯jÐu~…_¬°cÓòj<aV¬XQWW744TQQáãã#R4–J.©aëÖ­ñññííí±±±Û¶mÓŠ³cÇf¯&‚½J 7u>É{F»w6áM€¢Ü¥’’’°°0µZQUU%R4–J.©û è~‚Ž$''»¸¸øúúÚÓ(Dª Žæ†[faÔ ¤à u*¼°ÁºíÊ’{6Zl !°Ë:ý‘ óŽ…×¥XXj°ŒÚ€F€G ¨ ØR@BLǬÓ‰ÀbJ!R|j€£„:•%saµAB(~QQQHHˆ³³sdddMM s|tttçÎ>>>...III½½½ZeÐýÉ•x“k1<<œžžîíííáá±wï^¥õ tOÜRà8u*¯ÔÐÒÒÒ××—••ÅÏÎÎ^°`¿~ýzrrò¦M›xp}?õ%ç’‘‘ÓÜÜÜÕÕ•––¦@©/PàG«S1ß¾4˜Cgg'îëëS«ÕL8$$¤¶¶– ·µµùùù%5èKÎ%((¨¾¾^ÉÖ†Ô€G`î[,•¼98Bš"5ðþT«Õª[L˜0:99%5èKÎ…þ;22Ÿ 5%HK©Ábg×§h4š––ññE&ç¢ðU Ð1Ç™“ÙAÓRƒY=/¬jPxôi»wïŽmhh©­­MJJbŽ{xx\¸p¯õÓ`rîé233cbbZZZº»»7oÞ¬@©/PÄàÈEeeexx¸³³sHHHqq1[`ÞO°W!-•.ƒƒƒÉÉÉ®®®~~~yyyܯäççk4•J…:5·Ô066–››ËTÜìÙ³KKK™ã999îîîl4­Ÿ“sO7<<œ––æåååééI5«@kCjÀaƒ6`7•ÿW!–À‘=oooò ÉåojjJIIa Ìû©ö*¤¥Òeûöí‹/îèèhkk‹åº±IIIW®\AÂÍ„O €S ,ì·Âž¶[‰ðs8Â8¦£\PPÐÔÔ¤U`ÞO°W!-•. L¸¾¾ž+5\ºt u ïÛ2‹› @ØÁ„e§¦Ðl·Q_Ž)8@£Ã+0èeŠ­¯êêêøøxoooFSVVÆëyé®™—–J•J5::Ê„GFFÄ$ABj0ßM fóat+‡­A´›®DÔMÔ,„ˆÀ1=‚ÊÊJcEi©X‚‚‚ô­j@â–jÉ+…Ôà sWǼAÃp0á«¢ Øw%¢úa:ÿW!“XxV¬XQWW744TQQáãã#R4–J—;v0{5´··kíÕ€:…§ ‡Ø®[mE×°ðìغSƒ6`땈´{µ~®§X°|%1”””„……©Õꈈˆªª*‘¢´Tº $''»¸¸øúúj}u ü¦—4`˜²c‘ÁqŠ @gÆV.Ú€­W"jоçuðm!8¸„¨S4-›¾@ìÕ`g"ƒ–€Î$T1Ú€­W"jоÕÔ¯}Ô#€GlZj°×ÖeÉ«ƒÔ€vbuw@³–¬h´»©D˜È.gÑ衘€xÒæ“v`¼hŒëh'J¸ Xà PÝhvS‰0Ž]N¤ÑCqûP§(Œ}\º'np6z-°ÆL ­ÆÑP‰˜N(všï·o€Y êTQu íçà 6X-H«w´T¢™´¹Š$K¶6ºÅ:üVLÝ&6@™Z:ÖQ;T'uäï Áè8 ñ­à¥¢" 5˜[j°×" 5`¤…gìØøÖ’Oñ±KGö¿ðéàà:ƒø«ƒ0‚‡k—w£üV£®BöïêÚk%666.Y²ÄÝÝ}Ò¤I±±±íííU£[ …„„8;;GFFÖÔÔ0ÇGGGwîÜéãããââ’””ÔÛÛ+Ÿ7[&0<<œžžîíííáá±wï^2ëf200’’rÛ-Ö¯_O?ÙÌóóó5J¥â^#ï¹Ì=&cˆ†Ã Yjv×3j=0¤ïÂøæÝÏœ1¢:æÂh<Aj°VdG–ÂÃÃOž<ÙßßßÓÓCŽöªU«¤Þã ---}}}YYYQQQÌñììì Ðñëׯ'''oÚ´I8¾¾ÓeddÄÄÄ477wuu¥¥¥Ufú×¢E‹ÚÛÛÛÚÚ.\¸uëV6ZRRÒ•+W´LÁ{.H wXXÞZ7¬jP¬ón+XÝ\XpÕŠê¿°€ã4*Ø /¼àëëëêêúøã2Çõ=c­¬¬$ÿÂÙÙ9$$¤¸¸XßÁ™3gž?žMMMNNN­­­¦#tü¦è§œTrލ`~~~yyy¼6´ÌP%·£[óZÌØgÙì«««_yå}ÅàÍÙ¨öÆmÂwm ´‹Ý²Éý'K+5tvv²ÉÕj5¦P[[Ë„ÉÓ§®$_ßé‚‚‚êë륕9 à›o¾aÂ.\ Ÿl´K—.éfeð\²wI8ªv#¢ `vÞ銾;#{ÒRé¢oÃ{EÚ±à€ Åxn‹Wm¾’(\j°@PjX´hù äÜ‘‹·cÇ渾ç•äÊ•––Ò=´©©)%%EßÁÔÔTº/S`ß¾}“'Ofî×………›7o¾)ú)çöíÛ/^ÜÑÑAѨl¼6´ÌP%·c[óZ̨gÙÌ:D®eyy¹Áb˜ÒÞ´š„€ -ÐÌ:s8sæLtt´››s '''c¥ÞŸjµZu‹ &˜’-å022"­Ì”vtt” S&úd n|ÝsAj€Ô€©)æÆFÁ;]1¸ KZ*]ôM`xo ¨S0–Jîz²¤2Ó`â¯T!êœÅ¤ÙW}+Yjhhh`Âõõõºq¸Ï+ƒƒƒ èÌ {°²²rùòå ¿’Üɸ¸8 '&&;vì¦è§œTnÙxmh™ JnÆ>¶æµ˜Qϲé¿yyyT;Ÿþ¹˜b˜ÒÞ´š„€ -ÐÌ: Rùßzë­îîîñññžž®VÐßßÏ„©B•4 MÅßbŒj úʬ»ª·ÒõYÒ«”¼âè¦à‚ÞBZkÃÊ /¹­¯;”n©ÀtÅà‚.i©tÑ7á½¢NíúMÀêý椆›ÊÞšÛ2ep4©÷£¾ç•ÕÕÕñññ4]¤¹eYY™¾ƒä…††ÒÙÓÓ“</// ß~ûíÌ»"ŸrjE㵡e€*¹ ûØš×bÆFž>}zff¦´bÕÞÄ}h f•¦M›vøðaòìȧ[¾|9{–9sædeeQ÷¹xñbBB{œüµ .¬ÁÝ»w“cH3^2Nmm-9›ÂñõeKÕÓÒÒBÝ™Y›$Pf­L¶nÝJãCGG³”eÛ¶mºeà†yÏe‹Rƒ,+Žüð.ÒZ$P}Ém}ݦ¬pK¦+UVi©xoI¼Þ(êØâ¼Ðò—¬û†—®È/áÑ€À›Ô¼ï”q‘ðA.©Aä³ÞKx—ÿ«¯¾š1cÆøø8s„4h³O…$_µ#K \á=((ˆ ë{^Émíþþþ©yçååÑ,— .|á…{ì1æ_"ŸrR°ªÁ Æ>¶–eUqæÌ™T¿ŠaT{/5XlUƒ™2?zô(ljµ:44´°°=Ñ_|IÇɯ¾ú*{<''‡î# 566–››Ë<@Ÿ={vii©p|}ÙÒ Jî¡———§§' ìÂeÖÊ„;žS€;žóÖ,ï¹lQjeÅ­?úFQîB 2èKnëëŽà\À#˜™ˆ ¤¥28á½¢N*Rƒ˜KÖ÷†7Ž´Gú~òž‘‹„ç2J bž­ð^‚À»üô—&Þï¿ÿ>sä½÷Þ›3gŽéWíÈRÃâÅ‹Ûoûä“O2Çõ=¯\±bE]]ÝÐÐPEE;Ûä=øÊ+¯§°gÏ ¿øâ‹S§NýŸÿùæ_bžr;vì`^ud¢ñÞÜ-óTÉmÀØÇÖ¼3êY6óßÖÖÖ°°0rc…‹¡›³QíMë*å[ %`f—·u…¯8Xð#fm˜@ô%·õuGhÛðf&Ei©tžÀhÝ@Q§`,Óïô½á¥/¾øGú~òž‘‹„ç2J bž­ð^‚À»üô÷ü#ëÈÐMaß¾}¦_µù†Yå6hÏž=Ì›¹ÉÉÉìG}Ï+KJJèþHÇ#""ªªªR R*æmį¾úŠû°LÌSN&ÉÅÅ…ŠÇ»óMK=Ur30ö±5¯ÅŒz–Íþ÷òåËwÞygvv¶@1ts6ª½i]…À£| ´LÀ 5…,+Žüð.ÒÊ\  ú’cݰ›óÎL ŠÒRébpý¢NùjF°§±TÌ^Ò èûÉ{F.ž#È(5pê{¶Â{ ÂïòwuuM:õêÕ«4ù1ýªYj@ǽí •©AvdYq$°à‡wVæeЗëŽlŽ:…ì©6ñ…ý]¯À^Ò |pÀûâüM™V5H«q‘ÏVx/Áà»ü‰‰‰ùùù+W®”åª!5 ›ho¨Dœ€™¯NeYq$°à‡wVæeЗëŽlŽ:…P¡(³/™÷ /-‘_Ú£}O ¾S&á9‚™V5è{¶Â{ ßå?~üxÄ-Þ{ï=Y®RÀ°‰ö†J„Ôà ]I_rôP››2˜ØAP§(¶ßñ¾á¥%òK{4 ïIÁwÊ$ëׯçnà“ŸŸ¯ÑhT*ýliiY¶l\ºt©ð7 5Àí¶"5Xì–'‹Ô@ÃÑG}Ä„«ªª.\8yòd//¯U«V±c²™î}²ŒièGvÖCaÜÂlå2a…H v3ª@j°³6`>õÀ¬Rƒ±ÏÁ…3'?º´´tpp°©©‰\c6aÂÿÇÞÛU‘Ýùÿ\FA²¼<,p%>$” •…š0UÙqž²Hj²¥"wf7bE«vãFjAÑ’üYe•)¿`2£åVþØTvŠÉ‡D-RY“LjbÂĬ&8’5wTPF"Eôwʮ꺿{»/Mß{ûöÃëõÕÝôé‡Ïçs>çœw÷=½y³ùNOO}Z -Ïž=»èe„¾ 8šŽçà!öÑêêjáÇÓÝÝ­q¤¯¯T0.\xöÙgE5”®3..n©RƒâªËåJxL|||8‡G˜››ÓwÍ¢ìüü¼´,Zx1`ZHÞj0Ljˆì{G`’^“i»=!º+ –Z7@í¼?øÁ^xá…ˆD­±Cj°AFµkÔrwX JI;¶OBÅ¿†††¤åÁÁÁÜÜ\y»ÿãÂO?þøãG~ÿeééèã/j:Å‚þø?U4HðÆžžž­[·ŠÑ£‰—^zI,‹Áæ~ô£GšžŠ‹ñ¿¶ð+Nlc`©­O/éY¶øo[[›0ãÅ‹µ\F8à;µŒöçàZ*¾³ìì쥊úJÉS¿õÖ[>]P­@tJ¥eáÐ¥J GQ„YªÔ  j×üVƒ¾4¾Ô`õ7Ž…|áGË+m!®aI†ÍðÞ˜Dj0m·Gm{pƒ¥Ö P<ïoûÛµk×Êû‡iµÆ©B7ÓJæ?o”Na×±¶öûÂÑˆÆØ> ÿÒò¸PËSEÅeÇ×~ajA ¼QŒ¹V¯^-Zç´´41ÀIOOËŸúÔ§¤ßJh|x°[øo5Ä6–úØZññôRw^³fMss³¾ËXR`h™¯2RÙ¯¶¶öÊ•+<8wîœöß/è+ÌÊ•+ßyç1²cº­[·Ê{>õÔSqþÑGmÞ¼YÞ.F£‹zððáÃb`(:ÉÂÚýýýb°zµÃ w———‹Ñ¢¨wÒKD!®9à "Ôoݺ%=mܳgaRƒ Þ8 ñ–WÚB\Ã’ óÞƒ KtéMÛíQÛÜ`©u‚Ï+Â>??ÿ·¿ým¤ ¢ÖØ!5€ÙFmH ÔA7…¢wð˜< ñóòò‹hyª¨&5h9¾ö S{ ªhÅ¢÷ÛÖÖ&:ÏbyãÆGŽù⿨ý6¥kÐþVƒùc`©­#òVƒ8ãºuë„#t\Æ’#RŸtÔÒdwvvˆjQQ‘ÿt%¡=¢¯T0gΜY»v­8ÎêÕ«Oœ8!ïù»ßý®¤¤Dl~ýõ×åí‡JIIYÔP ­­­Òôââb1‚½¿ÚagggÅà7===--­½½=ô5ıà?‰J´¥¼qäOÀ ?Z^i q Kz4â2"øÞƒ kuŸÌÖíQÛÜ`©uÎ+Z¥€×!Â7Hè^R˜Ç¡H Õˆb~/X ²ÑÛ'¡â_UUUccð}ûö)ÑòTQMjP<~ÀSKí¦öTÑ Š?.;G˯½öÚ'?ùÉo~ó›ÚoSÐÔÔ$ýHSÚ-|©!¶1°ÔÇÖŠ§—ô,[úïõë×Å[ cC_Fð‘—w±hà9!ïìJ'¼qâ…-/q…¸†%=6æ½#bÛ]zÓv{Bt‡,µn€ÿy;¶jÕª>ø ²QkìÀrùá'?ùɆ ’óÌ3ÏÈO[kÖ¬e÷»ßI«¢ùxî¹ç¤å‹/Š­]»Vãyß}÷ݲ²²O|âË–-{ê©§Þ~ûmi{II‰ØM~€"Ëb‹Øº 5Å}Î0'År¸"XÑbû$TüK º¥ßÕÖÕÕ©=.ÔòTQMjP<~ÀSKí¦öTÑ Š¯^½*JIO.]ºäÿ CãÃS±]\’HŒâò"òŠØÆÀR[+>ž^Ò³lù¿7oÞ\¿~}KKKˆË>ò’#à. <¤¤E¬ûÆQˆ~´¼râ–ôhؘ÷ŽˆmKH ¦íö„îù7XjÝ€€ŽPùË_Â7HˆÆ.Ì o©Gö«žfÎ"Ôããã_xá…7nŒŽŽ¾øâ‹bUŽÿþçe¿õ­o‰å;wî$$$ˆ˜ bµ££Cüë_þå_´œ÷g?û™(øüóÏŒŒLNN~å+_ÿúÎw¾#þ%½çYUU%¬¬¬[ÞxãÐøâ„Eëcø¹ Ø&oPS,š!4fKKº¢+œúè„7ŽB¼ð£å•¶×°¤GÃÆ¼wDxÓº9ªwCÁÌ#µÐgæ™gÄßÿ}iU,ˆÕ 6H«¢½«¢1Ëo¾ù¦t¨ÎÎN±*Í:õƒü@±GpÞçž{N,ÿþ÷¿—V?þøc±ú™Ï|F,‹†rùòå.—ëæÍ›k‰ IIIþóŸC4¬¦X±§ÙkÆH H ´ÝH `c©Áo…xªå•¶×°¤GÃÆ¼wDxÓº!5Ð]“84ôÙÅ ^üWþJ‘ô%;±QZã}iŽ)±ìõzEó±fÍi>á¿þë¿ÿšœœÔ"5ˆ–(øéŒü™aM°€S·¢Ì 5Ääœ9DµÁÓð˜O1DOÌNý.'{3üßt›jGÅdpj‰Þ…™[a*ÄPj¸ÿ¾¿Ô ø»¿û;±åÚµkéééMMM+W®”~ýì³Ïj<¯¤H/*ó³ŸýLü·¨¨èÑãÏ$‰å_üâZ Æj,éä!6 {ƒù¥@jÀ•H H €åW’äcQÒ(úúú¤Õßüæ7þ? |ãßædÅß{ï=±°sçNñ÷ßÿýß5ž÷…^ËgΜQÜóáÇëÖ­;HïÚÉ¿X´ =* UÞNÀ›Ä01`›Ê‹+픇ûÆ‘¤ª$=À‰ Ö¬˜3¨¤i!ŸþyiZH1´÷ŸRð«_ýJOLLôx<#ýtÂ_ Xô¼¿üå/Ÿ|òÉOúÓ—.]š››óù|ßýîwýÖÖV±ó²eˤ_ÿÉÛCäãä=î ªRÞ´G«Š+iaûNÄ­ÑkvÕ„ôÞÞ^µ] æççSSSÅþò,Ç_ýêWÅêÊ•+´ßõûï¿ÿ¥/}I”r¹\999¯¼òŠü+‰G¿c› i£££þÇ QÐNRƒ“+¾ÍnŸ4N¶©¶äg{è TLÚVÀ €ûœÙ)Bj°ŸÔ@2wòІ°ßøoÚ ÷âGº @ßa ûy#Rƒ£úø”†›°SmÅ›¶Éºø‘~ÐÃÁk€sÁi:ƒÃçǶ߽SñÉíÄ€ê)ÞÄ@{ x#)@j ‚ÛÁ Î%ìTCÉÕ&oIÉÌÔSÀ/€§à uÈð`'·6«›Ö¨•´¡€wðØÏËœ)500Á›Ä€-«ä`è3Jz8€kð5Ží}T¤r>ØÏƒÄ€ýª!#}+Š tÏè<=ÜŒ¤© â4׃sF7`]'2R£O8hÝhéÀüm¨¼ìØá´[¦¤ÕÆžt½ÛŽ ‡´t~¥‹ù5¼ýöÛ'..΀‹ Žs"_»}gþ†l ‘(8aŒ©Æ+†×-. ¿¿?æCim1¤ÀYàäÖ hò,Ô97ò¨¶aZ ©pà\ˆàxƒPI@-Ob €ˆw9´¼ÆÿýïÿóŸÿüòåËW¬XQ^^~õêUyç?üáµµµÙÙÙ‰‰‰Ÿýìgß~ûmíçúÉO~²aƤÇ<óÌ3½½½× vÞ?ýéO555™™™ YYY^¯÷ÝwßEj ï8 ètb=ŧ¤_Ð88°h0›°y«qqq¡¥†§Ÿ~úÃ?œ™™9zô¨´*ý·¯¯/))iõêÕï½÷Þƒ>øà1ê}.yKooo||ü /¼pãÆÑÑÑ_|Q¬ÊjCèó–––ŠÕþð‡â_¢ø›o¾ùÜsÏÙ²óàÌiÉŒFj‘u%n¥’RÐ97~0›ºsréÒ%iujjÊÿ¿ÿû¿«?þñu œŸyæ±üþûïK«bA¬nذAËy].—X=þüÇíÝy@j<Nk§©H¿Æë T. ˆ‰Ô0??¯øßääd±|ïÞ=礤$±<33#­Š±*6j9ïSO=%­Š (..®¯¯ÿ裨 €§ÏRƒFF˜©ÀƒY©AŒîµÏäA©áþýûÁRƒZÙ?þñµµµ™™™rZøÜç>g×N¾£òIO£ˆF%ųä^XTg Š¥CÚ„TBB‚Ø"FúÒê¥K—´K _øÂIJÿtŽÚ¥é}}}Òêo~ó›àP,Ú¼Þ½{÷Í7ßÛŸ|òI¤:Q€§·Â’šQ † 5 5€BÚTí”4Åâk¯½633300ðôÓOk—~ýë_/_¾|íÚµ.\˜üò—¿,ïév»Åž|ðbYiZÈçŸ^šò…^žRí¼7n>ÅõTO Æ¹Îiùlƒ?B´ÝJP=€Jö‹dŒáç:§D²=Þ\ Ñv+`r'âÚDZˆI®Cj¼øtw0ˆª'Pï€`Â#Ì.%ðàGÜJ P7€ªä:ÇfE²=ÞœÑö,a@õªØ/’1D$×!5Þœº=K$P7€Úö‹d‚ÂÏuv%*®œx–` äC ˜Õгìð倞‰=–ýÁ×ÄËÔ/–£غÉ2Ë,“Y6Õ²I” –úÑÝb™xc™®Ëľ`™e–©ƒ,;\jàåˆìK/ö{ã‹wØp DÄYŠîÃÔMj´9݇/èáР€©rRàÐâ,ÜGݤR“Z€j3Ž '*~HùKñíP zR¯M[U€N€yrÍÒ#Ù¿@ÄÇ/¸ºI½&µ5lÉ"›ë¿€¢¿çYê&õš¼ TF°q÷S@¤rRàPkkBƒ¡:„@e‚'¿€1RV¢bRµIª@}rC2$Ù§@¤\†Î@ݤv›¼†b ú9ŒdŒQ’ì]d{œÑ–°u“ÚMRª$صû‡) ²¹©p ,*5`*&µ›Œ ÔJ ˜ðp`\QAp DÊeè TLj·ië&¦ Ÿ`‰\g›Þ Ù§@‡3Œk¨˜TpÒ)P1Á!‘Œ J¹©ðø{ ßQ1©ã欘˜€®­ X(×!5Ú*&uœt ÔM ˜"6ˆ.*q¸8`Qð R`gª'RÙðÂâƒÕã‡:îL—]ÅHÆ€Ô@¶§{ŒIm60Gp°tžÄY4mÔPìôÛ\gïlIÁN¸_0UÅÄMôý¨¤Øf <ì`TÜÁ ›{ƒÇ­8ˆD @%Å@®³w¶$Ûㆠ®•x‡, @=Å`ƒHÆí\gé„I¶Ç ±1\+q a@UÅ@£ä:{'L*ù b0Þ†¸† €ª @0áaãþ<_0$Ä,`|­Ä/˜€Ú @®³qÎ$Ûã ÔŒ¯•8“P[¬É ÈuH €/0öÁt8… *,8*’ fˆv®³n¤QAðvÃJ`¼Ñð=²+Á „‡# ‚#0]ø€•-FÇ„7Pg¢‘ëGØÆnÇ }Š%]@ ½LŒ™Íbx3Pm,É ËuVÌœd{ÝŒT¨’x$â6ÄŒ$XÚ @j ÛŽ0¿ÎÐvÈ ³³³ n·;55õرcÿíëëËÍÍ=~ü¸XžŸŸß¿FFFRR’×ëššR<²?Š'ÌPsf@j@ja£©ý€âÀååå###wîÜ©¯¯÷ÿïéÓ§322Ξ=+mlii)++óù|“““uuu»víR<²?Š'Ì ´±! À ¹ÎrÉ“l°›v©!//opp0xç¶¶¶ÜÜÜ‹/Êóóóûûû¥åÑÑѬ¬¬E¥Ńi6®’Œ”‰g*/€¥##RÙ/`·ˆH sssÁ;¯Y³¦¹¹Ù£ËåJxL||¼Ø!..nÑVIñàDš½«$ÁtÔ_KG2Á H d{¼€Ý—ÔÞjðù|ëÖ­kkk“7z<±qÑ#ûÃ[ H @ï€ @0áa£‚àìLjjêÀÀ@°>ÐÜÜ\^^îóù&&&vïÞíÿßëׯ´¶¶J>\QQ144477×ßßïõzCYíàDš½ë#ÁnTarRà‡íСC)))Š_ ¨¯¯OOOOKKkooøïÍ›7ׯ_ßÒÒ"–Z[[óóó‹‹‹»ººBYíàDR( »fbÉb"5X%öÈö¸»a4ˆ••ðF X:’ f08×!5.Àn áÌTd ˜ðpfÔQApvÃhCá”¥Ú si Ì:ˆ¬›ë,Ô"Ûãì†Ñ †&Â)Ø €º À€+'×Ù/‹’íqvÃhCûà”% [lh˜hOžëûc:Œ†}p †ª3Ìf»fê ÕÃÃN$Ò°¿ÓLgd)óŸx3³}ð & F€‘:Õ©lO‚aRCè£é(ð/}Ç×¾³–#oZ_ò®’€î.%R 5í±?RCTK…¯hÜyÛ¶m###b£ø+–‰7ËUFü‚}¨ÔÖ¶[Tg &Z=י߃Äö·±ézzz óóóO:%22rçÎúúzÿÿž>}:##ãìÙ³ÒÆ–––²²2qÒÉÉɺºº]»v)YìPSS#_!!NãK* OõÀÆ]Ô¤²=áá[oÕªUÃÃÃÇÇÇ¥åééi—Ë0~×WJ»Ô——788¼s[[[nnîÅ‹åùùùýýýÒòèèhVV–â‘åPˆkæ­Œ¸³Pµ,ÉH Û\gr`߯ìëë«®®v»Ý§»»;´àÿ¥´K sssÁ;¯Y³¦¹¹Ù£ËåJxL||¼Ø!...ÄI™©Á–NÁ,¤\Ú©èé ÔG¤²=áá°§§';;{©¢¾R‹J jo5ø|¾uëÖµµµÉ=â"t‡ !gÚ®®Á&Ôn‚©ð°\'–lñiÀÚÚÚ+W®\QQ144477×ßßïõzLÈÙ &â @€hë ÚÿVÉuH €åcbÃÎÎN1rw¹\EEE½½½E}¥‚9tèPJJŠâ(êëëÓÓÓÓÒÒÚÛÛþ{óæÍõë×·´´ˆå………ÖÖVé³ÅÅÅ]]]ŠG&êp PÁŒd{Ô8ª$RÙžØlˆÅll¼ƒ)¨ã–‹dË3Ðf¦6slXb1l•ÐsÒ€‚™ h?S#5–·±-1»!‡Ô€G€j`³\Çè°På¾×Lx8Á¹6gÌ‚)¨†\· °T‘›¥Ö 5íéW3ÄÆ€Ô@¬èwc„Z¶©L(5ð%w¢;Ð9äÞ©†äbÈ¥4†›Õ Z^0©‘ˆ:lNG‘û¥’W`øàLË`^ !ãš ¤Ààv€3 50š 2cn, t8Њ‘í18‚"ÕËã6Ð ³FÛÔŒ&ÌuH „ØR¾À, %È 耰ÄVd9 "Ðͤ‚ ƒC8"ƒÚ ’%È„À‹‘€æŒk&<ëe‚ž èP‚Èë ¤}Ò27„%FÃÚH d{¬ œ‹Ú` W’(p­s¬L‡ÁÁ6ñ©lO¼AôD†`ç2˜¢’+Hƒ@Xb: é%’ñÀ„¦6ƒ£ 6¬ ‹Š :ü‹Ú@$W°Ä€Øˆ®™ð@j¬ ›r! jƒiK®à¾K¤¤ZX†9`r‘!DmÂï$|23Í –óóóû÷ïÏÈÈHJJòz½SSSò´··{<ž„„„àÕû÷ïïØ±ã¯³sçN±ªXJfvv¶¡¡Áív§¦¦;vÌ´f$€mF3ç:.€`ˆ ¨ ÔAÒ…ÆZF‚3ëZKKKYY™Ï盜œ¬««Ûµk—|^¯÷öíÛŠ« •••ccc£££7nlllTÜMæÀååå###wîÜ©¯¯Gj i£2Ò'Ø6ˆ¹ÈU/3΢:5 5p/æ NÇãóù/ ÄjNNÎÐд<88˜››Zjà­ƒ##RÙžHD¾Fm :*ií@| >\QQ144477×ßßïõzµH ÕÕÕ·nÝÅ÷ìÙ¼›ÿrsssyy¹Ï盘˜Ø½{7R€1}Kò˜\jˆÕelØÙQ"ƒIj4jÐ!IƒPj™ÄÂÂBkkk~~~bbbqqqWW—©Áÿ bÁÿ ŠEfggëëëÓÓÓÓÒÒÚÛÛ‘h¬©€˜©Hƒ¨* _Ë‚Q7r >±$–r#R`gD#ÝÚ@´wÞ ¼Å’Xìù,‘ëL>&ìŒÈUµð öÙ,oØ@Ã’XÒí$õRÁF˜9Dd°œÓ”Qí*5~@”bI,?×Lx 5F¶´Â`*#ëëw'T@;]9ñÕtg{¨bH tA-}1d{ŒŒÈ€Ú@ícÀŽÙ(>¨H aF>F¤²=af§tm~‘A·ßQ¨}6¸~b8J"vˆ¸"u@}±“O‘Àáéšf6ÂÌê&²V¯[ߥ2Q$µÏÒ×OôFjp5 °O´¥†Ð×WÊ##5Ø;˜©€Ž5µñ×C°aaóM¬ûhO÷3Ü öYZj ö,a+ÞjðgÛ¶m###âªÄ_±ŒÔ€Ô@·³±Ô`õ÷‡Ã¹lÆÔ>ËÝA‹Ý¬e4Gèéé),,LLLÌÏÏ?uê”|œ“'OŠ-b{IIÉåË—Ä}¥‚™ŸŸß¿FFFRR’×ëšš’‹´··{<ž„„„àÕû÷ïïØ±ã¯³sçN±ªXÊçómÙ²ElÜ´i“XFjÐÉ,'5yId{,l’˜°’=~¤æõ3¡öY+Wª¹µL§£¸Ûíîêêš™™ãwù8›7oÃóéé郖–– Cô• ¦¥¥¥¬¬L™œœ¬««Ûµk—\ÄëõÞ¾}[qµ¡¡¡²²rllltttãÆŠ»‰ÃÖÔÔÈW…Ô`×Nt²©‘ˆ1gê ²•lö"qDz„“«žµ&'!ð¨à2 Ž²«V­êèè8Îøø¸´<==ír¹D}¥‚ÉÏÏïïï—–GGG³²²ä"7nÜð?²ÿjNNÎÕ«W¥å±ª¸›ü qü€ÀÆÁLDj ؈1§é vk=R¯øHH ™&Cdͨ£`___uuµÛíöx<ÝÝ݊‿rN©`\.WÂcâããÅnqqq¡%!öŸŸŸ—–çææBkL `{©Á°«"Ûc^³I „£jŸE¥¢Žm-c†ã‚žžžìì쥊úJÉx<ÅŸ6„–rrr†††¤åÁÁÁÜÜÜpT¤µº`‰\‡Ô@€9Vg@j`lÂ8Îri„Ȥu°¨=u”ª­­½råʃÎ;—‘‘¡Q4ÐW*˜Ã‡WTT ÍÍÍõ÷÷{½^-RCcccuuõ­[·ÆÆÆDñ={ö 58¹ù£"5 5`ÎÔli±ˆž rTÕ³ŠÔ@Ôa1ËYUG‘ÎÎ΂‚—ËUTTÔÛÛ«Q4ÐW*˜………ÖÖVé£ÅÅÅ]]]Z¤ÿ/Pˆÿ/P 580ŸS1µaf̉žp Ö­ËŽõj¹ÛÁÔ60š–ÚÛSÆH €Ô€ÔÛ˜ü=N1ØA‘=E:M1&!êbîM¤¼XÀøÈÇ€Ô“3GCæ·€%|իЉ¢ªé‘Ém߉¥©Â›H NðZ«+…ÔNÎçü€¬ÛÊXå,33#™ŸŸß¿FFFRR’×ëšš’PÜÕ€;wúÏà¿›ÌììlCCƒÛíNMM=vì˜,L #58°)¤bj I `Ío%|d+EïQ&žµ½Ap¥F©áôéÓgÏž•7z½ÞÛ·oË«•••£££Ò—ššš¤í---eee>Ÿorr²®®n×®]jÅýWÄÑÄ¡Ä7nÜØØØ¨¸›ÌÊËËGFFîܹS__ԀԀ݀܈ÔÀ0ÇÒƒ |dsYñÈduî‹‘‚…¤†¶¶¶ÜÜÜ‹/úo¼qã†ÿêÐд<88(v––óóóûûû¥åÑÑѬ¬,µâþ«999W¯^•–Īân2yyy⤦²0aŒÔfäc°n®3ùOÈà˜ßhøÈ„š¾flõû"ØÌ)5¬Y³¦¹¹9D7X¬ÎÏÏKËsss.—KZ ‰ûÄÅÅ©÷_û+MíÅþb7{H F–Bj WOO‰FßiR]Móç%|d6Ó3„Ã=ŽÔ€‘+5ø|¾uëÖµµµ…üßjÈËË“–=(»èÐ8`5''Gñ µ´Ó[ j¥BM_)KHH @VçšÁ¢Rƒ §ªcDcÏâ#ÔR:·†‘"5ˆ¿×¯_/((hmmUÓ ªªªÆSQQ±oß>iûáÇÅêÐÐÐÜÜ\¿×ëÕ"5466VWWߺuK:Úž={‚wó_nnn.//÷ù|»wï¶¥Ô`ŒD€Ô@çÍBÆ26Sð‘iÍhØ«JÎô>Rƒ¥ñ‘áçÍ›7ׯ_ßÒÒ¢¨=zTúE]]ü͈………ÖÖÖüüüÄÄÄâââ®®.-Rƒÿ(Ä‚ÿ(‹ÌÎÎÖ××§§§§¥¥µ··[Ejèéé),,–ö9uê”\ðäÉ“’ÅJJJ._¾p¿úJi9{ð ÆŸü0æ{"H ˜«¢&52­%ùí Rƒ¥ïŽÜ‚õìdd-;»Ýî®®®™™™ááa1— nÞ¼ÙçóMOO}ZŒ=Ïž=+mÜ»woUUÕ­[·FGG+**äk8pà@yyùÈÈÈ;wêëëå#h™‡Yí˜þ(©Á‰Ý*++Å¥Ç+MMM±uP”¤ã“¤ÂÆÆî3¬” ^]3Õ»šÄ6–r£“/ÕlRC[[[nnîÅ‹åbÕÿ÷ƒò5äåå‰Õà#h™‡Yí˜þ(©Á‰Ý4+=²þo(ì=ldêKÌëL©!ôÑt”2¹Ô ñòÌ“”€ÜˆÔ`©aÍš5ÍÍÍþfE–¯Al«¡«¼Ú<ÌjÇ 8oðñ‘ŒqXVœ ;V²“Ô`Kµ©Û:Sjˆx)ÓJ Û¶m§Ų-¥†'‚@j°Däó @j°ŠÔàóùÖ­[×ÖÖ&oÌËË[ÒCsÿUµy˜Õްo5ÄÊAo5ˆCÅÖAÑ“Ph4Í|§ütÂx÷õôô&&&æççŸ:uJ.xòäIé×÷%%%—/_ȨúJ…ü'ä ˜cGm.sï÷_õŸ"`çÎþSøï&ZŠ-[¶ˆ›6mRl5l 58*5ay ]æš '\­ çj¸~ýzAAAkk«´±©©Iš @úÙ¾| ÍÍÍååå¢Ë111±{÷nÅ”Ú<ÌjÇô/®x|¤c$vÇ{ŒØaß¾}±uPÌk£HZ̘Ü/½ãíév»»ººÄø}xxXŒÁå‚›7oénzzúàÁƒ¥¥¥)Q_)µ$0!OÀ;js鄘{' ¸ÿjCCƒ8š8”8àÆw‡­©©‘ï©©€>›m;ÆJ>ÅÍ›7ׯ_/ú-?ò–¤¤¤ÌÌÌ€Ô××§§§§¥¥µ··+ö ÔæaV;¦qÅã›Ù³F~"$Ú»=zTzj&®8¶‘²¥Ô`Á©Ø°“ïV­ZÕÑÑ1<<Pp||\Zžžž–S&M_)Å+ ž'`޵¹tB̽PÜ5''çêÕ«ÒòÀÀ€XUÜMþ…¸G»þ€©ÀŠ‘ÀfRCL~0nûÏäÙ mö>¼CrjRƒÉ¥ú [µ¯¯¯ººÚív{<žîînÅ”,ë+¥xyÁòGq.sï„8ZÀl?¡õkM i伡éììÌÌÌŒöKH àØ”Î(À6¦Fj@j@j@j ­trsiØ;fôCbkØžžžìì쥊úJùï|ˆÔ@7Õà RƒmâY4W˜Pmpø 6Ü5É$†¶íììÃ|—ËUTTÔÛÛ«Q4ÐW*Ä8×Bžàã(Î¥bîCiÿ/PˆÅ™yÌ/5˜ä»!Še»Ú'?ôE>F›å:¤â!5 8XÅ)H XßAl¥3|7DcYµO~ 58§Å¤bj¤â¼Ô@ÓIÌÇJj Êc^¤íÄü»!Ú˪}ò©€±$`êˆ_v´¥ÃJi¼ ¤|ÄàÎ6jR&Å}á×q;½Ç«oÌ¿¢½¬Ú'?èVÙFj0~æX c {i™ßGÖJD&€8ù=ÿ¨NRJÿŸŽRƒnbõÝíeÕ>ùÔ¥$Ð*!5?Œx)c·mÛ622"N*þŠeËI øÈ`©ÁÌjƒs¾ â䯋Î?Ñë4«FÊfønˆÆ²jŸü@j°Sÿ ˆ©Mrå”L2s___nnîñãÇÅòÌÌL]]]rrrVVV[[›¼ÏììlCCƒÛíNMM=vì˜|„öövÇ“ Vççç÷ïß/Zÿ¤¤$¯×;55%í¦vÌ`|>ß–-[Ä›6mRüÚ¸ñRƒC|$v;räˆ4AúöíÛÅ)Lâ#‹æ"s¶¤H 1ùð1`m¤†`LòÝ-eÕ>ùÔàœ|NÄÔV”Ì0óéÓ§ÅÀóìÙ³ÒÆ½{÷VUUݺuktt´¢¢B.~àÀòòò‘‘‘;wîÔ××ËGÃÕÛ·oK«---eeeâ&''ÅXx×®]¡©8Œ­©©‘ïÅ RƒC|$v«¬¬”žÚ455™ÄGÖÍE&Tð „iO¼+ûcy 7"5,i·˜ÏÀÜÖÖ–››{ñâEy£XõÿM¢\»iü-ªÁ>Bm u›ÓØÓáʱÆÄH aF>F»æ:#à¯e·˜ÏÀ¼fÍšææfÿ3-ËÅÅv±:]ˆ±sÂcâããÅ¿âââB3œ,d˜+â#±¼¤¶Mò½W«|ñÁ<“çÓx1æEm€pÌh9û›ö»!H @þaü H Q•db5³Ïç[·n][[›¼1//oIOÌýWŰZñzµcZÅ•NðQÀ[ âP–È–HG&éâÒJ>2üÝ6 ›j?b|¤¶¡T@LmX%‚Rƒf`¾~ýzAAAkk«´±©©Iš@ú;\¼¹¹¹¼¼\ŒR'&&vïÞ­xðÇ‹"bÄ:77×ßßïõzCÓRƒC|$vÇ{ŒØaß¾}VÉVÉH±ÑDœ7µÁ®¦ÃòH tY£wý”L2óÍ›7ׯ_ßÒÒòèñLËuuuIII™™™_7¨¯¯OOOOKKkooW<øÂ‚K_X(..îêê’¶«ÓC‡øHìvôèQé âà™a©Á<ã#ú¨‘ÍÿµÁ±FÃìH aF>F¤c¤’Œù¥œ‚Ô`ƒñ¡npþ#k1ÒVÑ0¸îY#¬›Žÿ‚¥Þ$&‘Œ1/jqnŒ)Ø"8`#¥†Ð'ÒW ©€±$])LmþÞ¦µ eª˜¥³‡yIö“bë#ÅÓ™ÁG¶LJ{™ö1RÖÀ’–¨SÕÖ„·èµ"5‡øÈ!¹ÂÒ/ãñ«„%fDpp¸È‘ŠÐÓÓSXX˜˜˜˜ŸŸêÔ)ù˜'Ož”&*))¹|ùr€˜ ¯TëÖ­ûðÃÅÂððp\\Üõë×ŲØ"¶‹…k×®½üòË)))Ë–-«¨¨“ÖÞÞîñxBœ©@{$c°}®3àÁR>2̼u¥jAƒðŠ>@DRŠÛíîêêš™™ãý;vÈÇܼy³Ï盞ž>xð`iiiÀD_©¾öµ¯%}ÜùÂ… Ï>ûìŠ+¤»‹‹‹ }–ðn¤çºhÿb×àa¬½'j¶‡Ô€HM‹fÍ?›“?fˆxèééÉÎÎ^ªh ¯”LEEE[[[YY™XÞ¸qã‘#G¾øÅ/JÿÊËË{ë­·&&&>|x÷î]µ£!5D©“ €Ô`f©Áiõš·ÈöKMW蚆olÁJQ[[{åÊ•œ;wÎÿG ¡E}¥‚9~üxZZÚÑ£GÅòk¯½öÉO~ò›ßü¦ô¯•+W¾óÎ;333×®]Ûºu+R€Uº:@ƒÔ NÔüH}6fµãûOÑ»UVV  555!5XBmÞŸ¦.Cj0­Úà¿CðþôK#’ñ!c^¤€F>µ/Ú7eéŠÚOjÐ7¹†ŠáDÍÔgcÖr|1LNxL||¼Y±e~~^Zž››³Ô`?‰eù%/ÔRT°ÔZ|€¥*9À¢µã‰ ¬n@28yð…Ô€ÔàœæÒøi!c2Q³ÚlÌZŽ/F¸>ŸOñ˜6{«Á~> x«Aœ©Áœ-²š¶ má‰ü’â¡€a/R€Cˆí¥Kç¤䆨NÔ¬6³–ã>|¸¢¢BŒXçææúûû½^¯´½©©Iš«AšÀRƒý|$v>{ŒØaß¾}V”œ 6„‹ >¨g°Å°#_³™ƒD©J«ßÿþ÷?ÿùÏ/_¾|ÅŠåååW¯^Uì\É¥Þ}÷ݲ²²O|âË–-{ê©§Þ~ûí€Þ¿¿¾¾^ôÃãããý·ÿçþçêÕ«Ÿ|òÉ¢¢¢þð‡ÍÍÍ999‰‰‰ŸûÜçþ÷ÿ×ÿ:CœBðßÿýßk×®ÿæoþæ;ßùNˆ·:;;¥-â8ŸùÌg¾þõ¯Ë³¾ë¸;—hL “b;Q³ÚlÌZŽ¿°°ÐÚÚ*}L¡¸¸¸««KÚ.*]]]]RRRff¦=¾@a?‰ÝŽ=*}B8K¸Ìr¹Â~ý1ÒÁpr§Bñ¥EãÐ¥`ä‹Ô¥ø7§ÔðôÓOøá‡b .ºÁÒjˆÚ÷³ŸýLt³Ÿþù‘‘‘ÉÉɯ|å+b1Þ÷ß¿££CðáÇÇñz½wïÞoiµ¶¶V^ýÛ¿ý[§8{ö¬X}ñÅGGGoÞ¼ù /„¾þõ¯÷ôôL=æÿý¿ÿ'þõ¯ÿú¯ºïŽÆ%Úwdü(È6¦•p RCLËŠ:ƒ.j"l@jB£am°eÆ…öP<ùä“Ò•Òê¯~õ«0ïŽ>X¨±’Ün·Xýàƒä-¿üå/ÅþÓŸþô¥K—æææ|>ßw¿ûÝ 6DPj}Š€i!Å‚šÔ ‰ÇŽ»wïÞå˗ׯ_æÝÑö}!5 5RƒÙ†ÆŠ;„aª Ø µÁ$–Á¼@ÿ0VRÃ믿ž––°ñý÷ßÿÒ—¾´råJ—Ë•““óÊ+¯ü⿈ Ôúü>vYPPð_ÿõ_jRÃG}ôÿð)))Ë–-+..~óÍ7ü;:ð¶”tO"DšÂGH ?Rùt#è°'&§ZaˆÃ€s2'RƒI†±¡O¡£”µ¦I´„Ô€HVÆ “ñ`1BjÆ@p0›ÈN`›ÚÀ™¹.²‚EŸ˜#5à#¤†˜u-„ͤšxò›9Ó#9ʱQgW7±€Ô©¡§§§°°0111??ÿÔ©SòÑNž<)¶ˆí%%%—/_uê+"KK[îÝ»÷å/9999++«­­mÑÓµ··{<éÓ«óóóû÷ïÏÈÈHJJòz½SSSÒn333uuuÁÇ´Ô`{‰ÝŽ9’™™)»}ûvùc:H tìÔ)Bd ïY% ’©ˆ.Û4X38YjXôî¢-5¸Ýî®®.1¸Þ±c‡|´Í›7û|¾éé郖–– Hõ•R¼lÿÕÆÆÆêêê[·n½ôÒK‹žN Woß¾-­¶´´”••‰³ONNÖÕÕíÚµKÚ¾wïÞªª*qÌÑÑÑŠŠ +J ¶÷‘Ø­²²R8HSø¨©©É¢¹Â<×`×çÆ÷´é"ÝoLáœìJkä:GÝ]´¥†U«VuttˆáaÀÑÆÇÇ¥e1&u¹\£N}¥Ææææþñ”–‡††=Ý7äÕüüüþþ~iY Z³²²äcŠCI˃ƒƒV”lï#±›¿Ä)Âì8³ˆ°€øt¿iU±ƒZ'©A·ôÙª¯¯¯ººÚív{<žîînÅŠéÿ5“pJ-šæçç¥å¹¹¹%NŒš/þú˜1‰C|¤è#±ìLY±¨Ô`üeРǼ€Ô@«jK›àGpx®[ô£-5Èôôôdgg/u@ª¯”Ú06''Gñ‰¹–Ó‰®Ïç >E^^žIÞjÀGj> x«A¸Ìº¹ÂøË Õm Þ!f©VÕÞÆÁ›€ÔC©¡¶¶öÊ•+<8wî\FF†Æ©¾RÁ¤¦¦ È« ÕÕÕ·oß¾uë–XXÒé>\QQ!F¬sssýýý^¯WÚÞÔÔ$ÍÕ Í`E©Áö>» =Fì°oß>¤zDQ5Ãm,ŒÎhU1ÏH Q•:;; \.WQQQoo¯Æ©¾RÁ:t(%%EÞazzúÿñ“’’233ÿã?þ#11QûéZ[[¥o+wuuIÛïß¿_WW'3¶_ ÀGj>»=zTú…p–p™¥s…aWBs¯Ï,Ø SR)Ñ †2ÃE¾ýöÛ'..΀‹ ö !M®ÓÒ+v ­>üðÃÕ«W›$ç˜ävõ‘ÍlkÌ•Ð#Ògì†A€î7ÉÐ!æ2Ãufgg‹ çEGj ×!5į}íküñÍ›7_zé¥û·Cjp‚èc"ìF8ÝoÒ Õ‡\aŒÅ¢'5˜Ü\§@ýõ×333SRR^yå•¿üå/f"kU| ©ÁlVöõДè°=IºÙ@+Ãýb·v­ÕìüßïÿûŸÿüç—/_¾bÅŠòòò«W¯Ê;ÿᨭ­ÍÎÎNLLüìg?ûöÛok?×O~ò“ 6$=æ™gž‘ò¼èyÿô§?ÕÔÔˆþBBBVV–×ë}÷Ýw‰aܦm¤‚9'QDõz!¶b(Ú44ܬӬgÎ Ãý?ø®&5<ýôÓ~øáÌÌÌÑ£G¥Ué¿}}}III«W¯~ï½÷|HõGj •DjÀG¶¼*‚ÇŠÝ j ¸ÓGÚ¾ü¥ö_“ÿüGVj˜ŸŸWüorr²X¾wïž©!))I,ÏÌÌH«bA¬ŠZÎûÔSOI«âŠ‹‹ëëë?úè#2€ îT‡è+š?üð‘í-‰Ô€Ô@…RwªC.°–ñi8”Äè^ûL”îß¿,5¨•ýãÿX[[›™™)w«>÷¹Ï‘œ,5PëÍI°Á IŸÉš ‹lo@«H ¢“sþüù{÷î‰æCôL^}õUùt•••£££cccMMMòv¯×{ûömiµ¥¥¥¬¬ÌçóMNNŠÕ®]»¤í{÷î­ªªºuë–8‚(®xå(//¹sçN}}=Í.ìt›jM¡¼àv»»ººfff†‡‡wìØáÿßÓ§Ogddœ={6 ˆh©Eë,šfqÌ7666ƤyµŠÔ`ÂPHS,¾öÚkÂïO?ý´v©á׿þõòåË×®]{áÂ…ÙÙÙÁÁÁ/ùËòž"œÄž|ðbYiZÈçŸ^šò…^žRí¼"ÒΜ93>>.NÚÓÓã¯Q,}³º-ÀHÖüy ÙÛtV‘ü™žžùtCCCÒ²hËrssåí¢‘’‹äçç÷÷÷KË¢åÊÊÊ’–Åþþů»bÅ éøò˜ügš››-Z@oGBlOxL||¼q±Å¿¸â•‹}Ä¿¬Ø‚DéUµâþð*Ðý¶Êmª5…þ?‘¨®®v»Ý§»»[þïš5kš››®Vñ˜rëldóJ«${Üo˜`$k~sá#›ËRC^^Þ[o½511ñðáC1pöïù?‹»)J ¢w$†ÌЇµñ[ þDðUµâFN# 5D°… ýVƒLOOOvv¶ü_Ѱ®[·®­­-XjÈÉÉ1CKa‰€¡-r]T¥ÿ¡ÕÍ´VÂGvµ’%¤†•+W¾óÎ;333×®]Ûºu«G¨ªªjì1ûöíSl¸>,þ+º=sssbøìõz¥íMMMÒT¥âŠý«æææòòrÑ¡š˜˜Ø½{·…Z(½ ¢VÜžU‘‹hp‘"¢Mammí•+W===--­½½ÝB-H”^Q+pjÞj’€%îqѦ°³³³  @4ÁEEEþôI 7oÞ\¿~}KKË#•/PˆÅÖ9ÚÍ«…† ·§¢Œ9‡Õ`ùÅüRCˆ3šöh17Z”^ÑRÜ€gUtÌè~#5ÆB©Á¬-°øÅ6ïx 5ÄJjˆªÅ¢ô*ˆ–â<«¢Ó@÷©l`L\ äRƒ ìÕñ#M6´·a‘,ÏáO­C*’÷ˆ1#;ôÀG@P¼kûý~?J‚™„lŒÔH ¤S pGá¡eÄ<*·‡M".8I0 U*5Bj@jò'÷ˆ1ÝŽÁ)¼á@¨˜y, QO„Å0¸GŒ¹¤ Ã;@ñ&ƒýfÉ‹†à@{AECjˆl;k›W§ˆ=L$ZÕ:;;333®J÷E2Wë¬5Üv”Ô¾à@!ÛÞÈï…>š¾R11,i–HvmUõvQ<Ï{ï½pûI ´h@x,Ump”ˆjvŽR§(¥ŒdÛ¶m###â:Å_±ŒÅÈ @°S«ºh3NÓ÷ðáÃHVÈu¶QhâÄSc H ===………‰‰‰ùùù§N’ žŸoË–-buÓ¦MbÙ€n¤íß!£RƒyZUÍœÿܿǎõ˜;wŠÕE»Ù”ÞjPk‘-0´e@®[’ÚàdS'T1'[[KY·ÛÝÕÕ%ÆæÃÃâ³!ܼy³è¥LOO>.-‹ŽËå èQè+Q$##C.244$-æææÊÛoܸ!ÉÏÏïïï—–E)++KZûû—/@8‹+×ý [¾¢V|Ñd$U@j0O«ºh3\<''çêÕ«ÒòÀÀ€XÕ'5¨µÈV Z4 <4ª D‚¢)0õË!_´x___uuµÛí£ÑîînÅ~HpB_©`.\¸ðì³Ï®X±BºÎ¸¸8¹ˆKËsssjý+±=á1ñññþÅÅÿâÚ§Ëvì{ jŵ< #3RƒIZU-;ü7 Å”Ü¥J j-2­ël¬6ŠÖÀ8T.‡˜]{Ùžžžììì¥voô•’ÉËË{ë­·&&&>|(ÆÎþEü_K»)JtÉÇ¿bÅ·´›+„ÝlùˆZq-ÈH€Ô`’VUã]ø¯æää(æÿ¥J j-²å†¶ ÈuKYCðl6Ø‡Ê…Ô ¨­­½råʃÎ;ç?n ݽÑW*˜•+W¾óÎ;333×®]Ûºu«‘ªªª±ÇTTTìÛ·OñP‡ÿ}¤¹¹91‚öz½Òö¦¦&i®©ø’¬çÌ÷@ÔŠkïw‘hªbÞªj!55u``@^mllÍ“ÜbîÙ³GŸÔ Ö"[Qj E:<Ô‘0ìCÍBjtvvˆ¡eQQQoo¯Æî¾RÁœ9sfíÚµâ8«W¯>qâ„‘£GJSÔÕÕÉbjaa¡µµUšë ¸¸¸««KÚ.ö¥’’’Äü¿@YkÛé=µâä ,écÛªjáСC)))Š_  j_ XTjPk‘­0´h`ÂðxÂÆxOQ_H¼ö6¾E½ÙkެÔ`Ë÷@ÔŠ“€$@¢Ã˜Ø 65²€uÅf´ ƒ!5 5趘-ßQ+NŠ’‰ÎQÆ´¨‹ NÛ˜šoJZݶþÇăd0kU ëúnIõÚÌRƒi#$¶=+RíRƒÙZUÝ=j†9ÌÕäõ;ŸH£!x–þƒ½€ûœ`.¤ yrGƒá¨-Ú/6'åÚÉ xPG¶1UÞ‹ö{ á'ÀHžH €1±'¦¶nÏφï-=vß–-[Ä›6mËjwtäÈ‘ÌÌÌäääíÛ·ÏÌÌÈÛÛÛÛ=OBB‚ÿY/C_™¹¨€H ÓfŽŽÔ¬’ j-ÂðP»A°ôtߣÛíîêêã÷ááá;vÈÙ¼y³ûOOO22rçÎúúz¤çtËI°úZ1z#Ñ 5X÷Ž0&Á H òå)ÎûšŸŸßßß/-ŽŽfee…–rrr®^½*- ˆÕàsååå ÚÉã;×¢]t2žâ‚€$ÔàLcò œ,5(®º\®„ÇÄÇÇ‹qqq¡÷{*Î7ëØGü ©Ái‚™Š6… 6›Ž5€$Ï=jl2Ô.Rq¤††¢RRƒ´àñx|>Ÿöýsrr¿¢ëo58pÔ@j¥ÏÃ¥ÒÏ ÏÓ–9Ù˜8üW>\QQ144477×ßßïõz¥íóÁÊû766VWWߺuKšovÏž=ÁÇonn.//÷ù|»wﶺÇÍàYó ¤VšiΘ €.Ý$Œ‰=!²¦¶ÄCgÅÕ………ÖÖVéËÅÅÅ]]]Òö€ù`¿@!ç›­¯¯OOOOKKkooGj°½à@Ž¢Y!´H¤zš3'“¹À±RØ@j0瘂-5¡…¡éDiˆáœ1¯ ¤šc@jKK f~ZjB‹Ž ÙÞH©!ôÑô•zd‚R 58Ap`˜C׎ÆÚ±Õ€„+©!⥶mÛ622" Š¿b™€¡RDÛã–ðl GD> ¡ÛZ)€ÆÈ÷ØÓÓSXX˜˜˜˜ŸŸêÔ)¹àÉ“'¥IÕJJJ._¾ &è+ŒÏçÛ²e‹ØaÓ¦MЧ“Š9r$33399yûöí333Òök×®½üòË)))Ë–-«¨¨“÷ooo÷x< j—:??¿ÿþŒŒŒ¤¤$¯×;55eÝ€a®@jûI ‚>ylLþd°CïŽV€œ‘{t»Ý]]]bü><<¼cǹàæÍ›ÅØzzúàÁƒ¥¥¥½2}¥¥†šš¹ Ú]TVVŽŽŽJß¡kjj’¶ž?þÞ½{wïÞmhhxõÕWåý½^ïíÛ·C\jKKKYY™8ãääd]]Ý®]»¬Þ{¡u¤°™Ô`€à|Lž+-u ë8Ö¤;ÝãªU«:::Ä0< àøø¸´<==ír¹D}¥‚‘@!¥ö ñß¡¡!iypp0777xqºŒŒ yÿ7n„¾Áüüüþþ~iytt4++ËÒC ¦’ +¥¥ˆª†Á×`3©!ª‚CÀïÐÁ£™ŽUÕÆ@Kd¿{ìëë«®®v»Ý§»»[±cüz}¥ôõÃÅççç¥å¹¹9YÁ¸pá³Ï>»bÅ é6ãââ¦x©â ‰÷/K? ˆ©£'5D|^Y¤޳tÇ^‡à Eu H´/Œ¦ ®ÎXh‰ì}===ÙÙÙK ô•Zê]ø¿Õ——'-‹…·ÞzkbbâáÇwïÞ]ôtþ—êñxÔ~¯a¹€a®°ŠÔñRH º¥ÛŒPÂüÖÆJ4èãÑÞV‹1Ð Ùøkkk¯\¹òàÁƒsçÎùÿ!´h ¯”ªª{LEEž}û¤í+W®|çwfff®]»¶uëVµÓ)^êáÇš†††æææúûû½^¯¥¥Úkˆ•ÔÛyeýß³ÊÍÍ=~ü¸X9¡®®.999++«­­MÞgvv¶¡¡Áív§¦¦;vlIw¤6‘¬Ú5«]CÀ¤µj‡ ¸ÔK—.­]»öáÇÒÅš5kœ,5,Ip½ÃÚ ÐÇ£·I¿€ä¿Ô{ììì,((p¹\EEE½½½E}¥tßÅÑ£G¥/PˆÞûýû÷¥ígΜÝoq «W¯>qâ„Úé/uaa¡µµU wuuY:`h²!VRClç••þuúôi1Z?{ö¬´qïÞ½UUU·nÝ­¨¨‹8p ¼¼|ddäÎ;õõõKº#µ‰dÕ®Yí&­U;l𥖔”üÏÿüôߟþô§O=õRƒFÁAûÑÈ{Œ©¬°Xh†¸G3ÜÆ$8ÁœRClç•ÿjkkËÍͽxñ¢¼Q¬úÿäJ.ž——'V½ë%M$«vÍj×0i­Úaƒ/õ[ßú–üòUmmío¼Ô QpSj ÐÊÐÒ!¼ÿ‘œiLæj€è™zѲ±WVükÍš5ÍÍÍþü'’•‹‹íbuÑ[^ÒD²j׬v û«6øRïܹóÉO~òã?OMM˜˜Ðç5{wõU‚ÐÒ:©‘5Ö`¤cõ{ÔÒ‹SÜ©æL+5ÈÄd^Yñ/ŸÏ·nݺ¶¶6yc^^^8o5(^›ÚD²j׬v û«VñRkjj:::ÚÛÛ_yåÝ^sNçQ@@d õÑÏ4²Jb   âÁZÆÄÑ+©!¶óÊJÿº~ýzAAAkk«´±©©Iš'AšHV.ÞÜÜ\^^.†ö»wï^Ò©M$«vÍj×°¿Úa/õÇ?þqÑc~úÓŸ"5„)8„Þ¤Aö£]ŽxMÄ@Ä=ÆÄž˜Z{ÙØÎ++ÿëæÍ›ëׯoiiË÷ï߯««KJJÊÌÌ øE}}}zzzZZZ{{û’îHm"YµkV»†€ýÕ«x©bgÇó©O}JþRƒnÁ!Äd ²m:­÷ˆ11WÄTjkyÜQÕòb"C]¸h×>óÔzóc¿LkWÈ®@Cþ=êžµc:¡+H `-óë Ź€r ²E-ÀaO­ý¤†ÐÇÔWJ÷a R˜«›Lõyú6ë¶ì*öJKºÍtöh‘C¤…˜ xíd@³ÝCl¬´ÆH /µmÛ¶‘‘QPüˆ‡€¡bj<åw‡ÿ~ >ÐÜh¬)N|ÙCÍpšzƒÍ±0Ò‰Þ=öôô&&&æççŸ:uJ.~òäIiʲ’’’Ë—/ Òõ• ÆçómÙ²Eì°iÓ&ÅO¿=úÿϧvü#GŽdff&''oß¾}ffFñ¼/Íjæj :6×á,{øZŸyvC·Ù¿%§i³ºÎàäüc†¹/ÈŠX htߣÛíîêêÃóááá;vÈÅ7oÞ,ÆþÓÓÓ,-- Ûê+¥(5ÔÔÔȕԎ_YY9::*}]®©©)„ÔðÈFo5Ó©¢!5Ðe{ăa×Ì(˜®Žú{ØÓ-B¤îqÕªUÃÃÃÅÇÇÇ¥e1®w¹\ƒt}¥‚‘@!¥ö ‰@íøCCCÒòàà`nn®C¤F‚`@xcŽÒÀf±aä,… ©¸ÙÀØ-Bﱯ¯¯ººÚív{<žîînƒt}¥B\­–ÿ†8þüü¼´<77§&qØRj ‚1R.³n¯F»ûð5Ø/H › ÌŽÍ1#Ð(Dé{zz²³³—:H×Wj©÷²èñýßjÈËË“–].×½{÷¤åññq[þ€‚ ˜šFÓÒý¾ÃË`Ë„ÀÐ,J÷‹Î`¿Ú‡Í1&0Ò‰ø=ÖÖÖ^¹råÁƒçÎËÈÈÐ(è+=©¡ªªjì1ûöí“¶?õÔSœžžþè£6oÞ,š:00`©<Æ„.ÁfÝ  }ü ¨ t)Íàw2’ñÆÁæ„1Ð.Dã;;; \.WQQQoo¯FÑ@_©èI G•¾@QWWwÿþ}iûï~÷»’’q‘çõ×_—÷?tèPJJŠ ¾@ñˆ7ÀÀð Ñ´hFãkxìšx Á;ešM»†46'’¿s¡µŒIpBTM͘ÀrÁ½ëDg “`ö›Ï€Ó¹G¤ƒoœà$Ä¼Ï aÚ?R39X:~x ~ÎqrP™ÐÑH Vñ#,-#÷h|Yíò´ìƒÔì"2h‰<éSñŠ—Uò¼9­jæN ¥m®ï¼º¯6†·ISK³È=‚‰£!†áñNdcÀ™ DãOH ö“x l~-©ÁQRƒCüH_f‘{Œ‰=15‚ƒD†EcÀ±5©ÁÉjƒ¥‡áè á¹½½Ýãñ$$$ˆÕùùùýû÷gdd$%%y½Þ©©)i·k×®½üòË)))Ë–-«¨¨ Hb¡µµ5---++«»»[,§§§‹ey‚tfggÜnwjjê±cÇÌi±èMcräÈiÂöíÛ·ÏÌÌ(:Âß°'OžÌÏÏOLL,))¹|ùrú—R<Ë¢~4ØMt}i¹G°¢1™«05ãÝ€Ô€Ô€Ô@jUË–6ûU»8¬×ë½}û¶´ÚÒÒRVVæóù&''ëêêvíÚ%m/,,<þü½{÷îÞ½+†Ÿ¯¾újðØ¶¾¾~jjêÛßþöŠ+ä墢¢à“8p ¼¼|ddäÎ;bO§I •••£££Òg蛚šáoØÍ›7 LOOS{dÔ1²M̯Ófé„·Cƒe3©Á°dN†ÜmþÛìëë«®®v»Ý§»»[± ‹úJéËaNé£ör,CÄÔŽ²†sÔ~=±hkróæÍõë×·´´ˆåû÷ï×ÕÕ%%%eff|"Ä3µGF=#ÛÄüRÑ!¤¤Âpw˜·ÙÓÓ“½TÑ@_©pòÉR§ôQ{9ÖÒÃ\ €©Ã7ˆ]§n@j²M¤.Õ6UÆÌ鎼„Ô€ÔTL»Þfmmí•+W[¬¤«ØÜ<®¤Ù¥AäN nõB4Zö!Z1WëP€lC°ÅõG|Ø»¤ïš0Ö1©å¤†XÙÜ`éCí§âôÇ©lfC\ „G”ÌbéQF”¤†˜?ÉÒè8‚œlA©ÁÒ"ƒ¦è·ß[ Û¶mû‹¿bÙBRƒC’³|#†y h¹Y¬XSÛÌ,ºaÑ ¶Ð“¬ööö¬¬¬¸¸8SI áœBÜ‹¸£ŽŽ²É¯Ù:ƒýB¨§§§°°0111??ÿÔ©SrÁ“'OJó„—””\¾|9 žê+¥x…"#y<ž„„±:??¿ÿþŒŒŒ¤¤$¯×;55%ívíÚµ—_~9%%eÙ²ecccG ­­­iii"tww‹åôôt±,ϯîóù¶lÙ"vÛ´i“â‡Ý”bnó#GŽdff&''oß¾}ffFÑþ¶U<ÅììlCCƒÛíNMM=vìX°Gϲ¨+ óÐ r³X/&—‡USGÛ2ö{8h¡'Y¢7þë_ÿì{tå¹ÿ$sÈ…’„@0,%¬rÕs EHŽåᦠWËTP±pºº@@HKå&­µµ¶ .0ôˆŠB¡Ð‚„Ks¤ÜC€@Èß»2kÍÚ¿½gOfßçòùþ‘õîÙ3ï¼ïs{Ÿç›Ùï|ÙÞÞnªAÌå‹/¾ó"Úèy̆®Ö ùµ [”Š………¢¼|ùò¼yóä §L™" ½ÆÆÆåË—6ÌÎOÝ»Jq„3f̨®®–>®X±bìØ±¢‡7näääÌŸ?_:.JìÇß¾}»¡¡A”·³fÍr,lsssoݺõæ›o†‡‡ËíAƒÉlvv¶<ÂÀR —ù„ ***¤WÕ¿òÊ+Šº°•­â-–.]š‘‘qåÊ•ºº:!pÇ«ïÒ©*ý¦)À‚È|‘[“ ”ð}ŸJÆd?yÖÿ²œõòÇcÇŽÅÇÇoذA´E6+òü°°°¸¸8Ûw+þËÎþc¥8 •jN$¢Ï=÷œãTúÑ8w-ÿλsçŽÈä»wàùçŸU¦ïìÿ°ŠCU—ƒ¨ƒò &Ë}úôY¿~½¨^í.¬©©‘Ú¢À ¶ó2÷®RáÕ«WåÂ/Μ9#µE•*Üßñѳp7Ƕ¶¶VŠ]¶mÉ£ïÙ<–/ÆðP\æ/^”ÚçÏŸa_Q¶²U¼EBB‚¸ÜÙúâì.ªÒoš¤ß¬> c˜‡‰Ü@ÿ.ô ÕØÿdIhooW¤víÚ%R¾}ûöI_~ùå‰'VUU‰lüøñò%ŠÿƲ…³ÿX)ÎB…(X¼xqVV–@eeeff¦º4ääG5TÔ¤åßybäâ4qŽ8sܸqb0*ÓwöXÅ¡v*DÅa÷gSæ~K¯Ä1 _–™˜˜¸gÏE´­=¹ªSÇelPºví*¾’çuôèÑQ£F…‡‡KÓqüý—m?ÎÚ÷üµÙ þeÞÚÚ*µ[ZZœ±κ’? 5‰ËU¨Å»tªJj ~³!.€"js ǯ§×ÿ²ÚÚÚÞ{ï½Þ½{Ûu•——âÄ ù øhû)¹[Åc9ƒí¬g¡’XŠ\ºtIj‹‘¨KCB¯^½öîÝ+樮&-ÿÎ"ºpá‚Ô.))‘%¦8}gÿ‡Uj§r07Õ`¸ŒÅÑ^û,ŠŠŠ„¹ZÀºw•3ÇE´â3óÂõ¶oß^__ßÞÞÞÐÐàØ³FªÁ?~§™Û†A![÷¨—žjïÒ©*ÉÇê¦|6± Ø« jÿ Gç!Â[ûêö?YÒ·]ºty뭷즤¤,[¶Ìö`PPí?¤Ôÿe gÿ±Rœ…Jìu6•~Þ|óMq»N% åßyvw—OSœ¾³ÿÃ*µS9˜†j°+÷ŒÈ3X$,OŸ>ýìÙ³wïÞÝ¿¿ãÓìÎ"Œ{Wuêø«V­?~¼(Q…£9sfÆŒÒñž={îÞ½»©©©´´tÚ´iF§.ó‰'Vv@H{É’%îQ bÕÈÈÈ(++«¯¯_¸p¡ãUŠwéT•äcuÃ6˜XD(ë`|D5ÈȲîuì*°sçNù¿Kò%"Wìß¿^^ž|PœãÞS Îþc¥8 •Š£wïÞŠO5¨ô#.¬L8S“–牮~Pœ¾³ÿêOÙ™ÌmŒK5˜/èt:©©©ÁÁÁƒ ’ß×Ði„qïªN¿­­mõêÕÒ.4ƒ.,,”ŽïÝ»·_¿~âvÉÉÉ[¶l1:Õp™¯]»VÚ²&''GÞ‹ÆUª¡¹¹977·GQQQùùùŽW)Þ¥SU’ÔMqjná M€yD>º}hÙ[TC`ÿ“%gòŠ×–——‹$V$ùÒÁW^yEÚ«Aú‡”ÆcÝsþ«NgYRR"\´hQVVVuuµƒh¨÷#÷¦e¯-ÿγÝ)BœöÒK/©LßÙÿa‡ª2~³R z¦Ñ”ék–©†€OÐwÁ¶qL ÔØ<2Á5òñJè0ÕØÿd9Ëå×®]8pàŠ+îu¼‚!'''44466Öî *ÿƺçü?VÎbåÊ•ò‘ÆÆÆgžyFÀ믿¢ÒKs×òï<Û7Pˆ†í(§ïìÿ°ŠCU¿É¢Í¿üÿ0Êh‰ÉªªÊ(®‘ƒ¡#0H¬CDJû½þŠÀ"22òرc>à‡°©ñÂsçÎ%''«œ æòå—_ŠòßdÞ4T<†tÏ}2îÏåŒ.ssP $cä–Ú‡ÑÕ‡%b]E¤Ÿ`¢q 2ŒŸÿüç±±±òł jkk¯]»–™™ùâ‹/ªœ)æ"f´nÝ:¨¨³ò!,[P £qäá`©7Cbð©ˆôUŒH5˜#,oÚ´)666""bæÌ™7oÞôŠ ¿®Â º0±”9ö P:8 @Ô° &£~D!¯elÖñYTš(=X2µ¶@‰ªmÌD5Xög’Ä(ÿË™cɽ@ˆu:÷£@ýRûM1 @´q¹>ß&cMW%½ñ¿p9f XÀ˜æaAù?ÇÐ~; mýT?Sàa”i 2G˜€ô jCÊÏ™T Úx2l]½GE2GŒ€ôÙ’q@€¨a ÑÆ+î©“—Èàž$€¢@æ~@4Ä:£ÈÊ?® Õˆ6Ž9à{ºâ›¤:z2Gt€ô£s§ƒÄ%‰u¦—•¯Ó—úÇ0ÑFqÀ*(O4ÊDz/ãà>Ø%¤ß(ü*þ6—$ÖÁ6ømð°x´QqF=¿;³”¬ô0_’4¤H¿•-ÙˆqXh“XgqùÎæ]íÛP Ÿ‹ /Ò “™£)À‚@`ƒ?T ÖÈ¡|q#¨@´ñ–²ù„¥+„$ ýÀˆÙQó@b^7~¨ïj§Ó60úbÀ¹°üaÕÀ¼BªX‡ÄüÌ6¸Ñ¶Õ`Íh£eœ&x `…d€¸€·òaã² è‘X§C5Ö¡ÑÆ»ãôÑtXøX$`A€ªX‡ÐŒâÈP €hãÝAúh7üŽ\ @2D0f–Ì¡%•uïZÌXgÕÀ’‡…2C@İ ë@`Ù¿‘˜° ÕàÿI±Þa䀜.0¢%zeAƒÄ:äæ¹wøÿq Ê3ø™j †2eQŒ(  ¹,|  g#ÊÍUjÄ_ Ò+?k¿Hº$`Ycöó°Ñæè¼’ÐúKILÏ3xåB< ƒ €@€j Ö½‰Nc>æª;&6R TR¬×X;v(ر輆Ò2 /þ¢½xO.Ç•°|ÉÖXï±BzênÎ&ù€ÕǧãÔx9Åöð H¿Æ 0`,é©dk^$ !0Ÿ©xë™|°¼B2@|b)¨˜¶yw„d†À|<ƒçCUï¯a €)-!bu蘿y}„d‰À4¶áÝŸá, Ó€Œ@ ¤ß€eë€Ahçõ>!#0º=xý·E¬¿€4Œ%Òo€1€yXmðõØþcV^³âÓDDWÀ: Éa@¬&“¡ß²;Jl€ÛÊRX–ZHˆ À"–Œ±Î²2$Íó6A æÖ2–Å :Àêˆuˆ‘òÇo‰á°ÔV€| G€ôŒ`ˆQe`ä~®H o¥¼,¸xD Öé§JÕ§rI]ÍAÏUûÁf€×\ŒB°¬%#@¬³¦$ÕÎh\£L~êj……Í·$,F°¨b0(Õ@fèR„DP,ˆ®ö†Á‹$f,%~€1Ìò¤ˆö&€5°„@¬3«H=ƒ™‚†w_:€m[Ê=4l+êB2@ú Æ 0’F_«Õ §wg§Xʼõ$ 6ôa  ýbRõÛ |úbðxŠE<ыƃͯŒï¬’Òo<´d„ˆuP &¢FäðÜÐmž›:‰]> hð ~`µJë¬~în¬âÓÑâ,æ^û|a<Ø ðÐn}ô€É!¤ß`Ìó@°¿µ!’R?$Ï8‹YÐwƃÍOlF»ej13Hô³*9{„ A¨ˆ¥¨†{ºÿI¯Ɔ³Ëû4*‹'a€n—Wã èaa²õnC¤X¨¶> .GóEÚFõA&lAÙúºnÒ›ÁøsTø‹É\ÏƃÍOJ’NMTýHtîÚx(0‡UC5F’C5˜Œmðÿ¿˜Æïüf<Ø ðJâjL¦„ªÓçÆZ¨ßÍ…4’4XkŠÉtª“e1 cÀ_ÌÓx«QO¥œí$‰í` gG8øˆj°;çøC¿~ýBBBzè¡·ß~ÛñÌ;w>þøã÷ßxxxFFÆ… 4ÞýÓO?;vì<Э[·!C†¼ûî»ÒñôôtqZaa¡|¦h‹#â¸ú…P @oâõsØý(Ì÷Ððµv’×a3À+„ƒúù @5à“6Õ°oß>Ñ5jÔÕ«WËˡîxæ£>zîܹ¦¦¦µk×JµÜýã?3fÌ•+Wnܸ1wî\ñÕÛo¿-¾Ú´i“hOœ8Q¾p„ âÈæÍ›Õ/„j–¥îô¹“íº ücf}ÐX°á1lÌä㈘5õ ࢩH5Œ1B´¿úê+éã_|áxæ©S§¤·n݃‚‚ïe×óèÑ£Eûoû›ô±¶¶V|üÖ·¾%Úõõõ÷ßppðµk×ÄGñWôzýúuõ ¡€Þ$Û™›ÜÀetëY.©&àOÂ`6À‹Å$P PKºúTƒ(ðE»©©IúxçÎÇ3[[[¥íííÎ^ãH5„……9º¶LSÌš5K|üÙÏ~&Úyyy¢ýì³Ïj¹ªX™j¸ç÷íõô`®x~R5-桇t›ž—$ò ؆vm€¨†»wïªP Úó7GªAzPÁü±øvРA¢––&Úÿó?ÿ£åB¨  ›õÿ¶z[‘ñÝR ºr lø"º·$ª_³±¨é'Ož”>=zÔ[TÃO¢Ó ¡€~„¬“_KˆÄÀkLV|éÙx0pOóË&ü4€™R&¬fÉîm ™‘‘QYYyõêÕ‘#Gz‹j8räÈ}÷Ý÷Ío~óÔ©S---eeeï¼óŽè_>yõêÕâänݺ‰¿k×®•«_Õ œ€&^‹qS :,¦°ˆC­Õ€QÒO^v™ššú›ßüF}cíTƒÀñãÇ¿÷½ïõìÙ388¸wïÞ3gΔ%!P^^.n$箨¨°íGåB¨Õà‹Tç©/Žcˆ ›z3QÆiÊP,Èb!dt„ß™çÏŸRJMMEd¿ÈÙ@Úô0Äé?Bâ8úÏ0pãdü&ÀEBFGø3±ÎT&MštüøñæææÒÒÒï~÷»b o¿ý6Ù ©/r6VyîöxŒ²>â;zÎ(°@‘Î\<)X5B6â*c5KÆ(#J{çÎC† éÞ½ûO<±gÏì„Ô×4žn)UºÓŒµ@à;ú¤°`Ö Ï¤ô°Nëß¶an Çõ 4ä0+ˆZÿ‹µÉrZ|GŸT?½”äL"E`Ì @@Þ‹¨­ ÊN£™AÃî£[ªíÅ8´²Öжaâ©á¿ú‘$Z佑¶!þ™ëì%2µCÜGçTƒž7üG‰äiL“é½éæ)àw¨P+!mƒêÑ."=@á>ð ˜ ¦hµ™0«v`<~GVHz‘¶¡õh²-‚ñ _Óæ{ 6CHg¾Ô)@o:‚9dØø²dÜz4ß+á0lC :!XÐ æÌš\èJS´ ƒîÅÿêMÂzÐȻロ˜˜Ø¥K? ÆÙ/Á±’%¨ÝV(Ô‚$ƒÅ‡‡ÙÌ5¢   66Vo.ƒÊ€É”sÈh{BÖC^׫W/1€3gÎDDX&ž«ÏÊËšz4Ù^ 8‘Æ*žac3,î!11ñóÏ?'âátx¶aå¹ã¿úg,b˜"³ Ì ¡ÄNß@B!,5̆0®]ºtioo'âáqx™±nd¬M§‰UlúP©øTªú³R{çÎ?þøý÷ßž‘‘qáÂùä¿ÿýïÓ§OïÕ«WHHÈÃ?üî»ïj¿×‡~8räÈÐŒ1âÀvcpvßÿýßÿÍÎÎŽ Š‹‹›1cƧŸ~ŠE¨—â€)+S~?hViøt.Ø 1ÜÍÍÍ‹-ŠŽŽŽŒŒ\·ncl¼}ûösÏ=&’¼¼<Å18v‚õšÛÝÌFü 8ßý¬!›l„Ž¥«Y-Ä%ëD5ŽÚéÒ¥‹:Õð裞;w®©©iíÚµÒGéÛcÇŽ…††&''þùçwïÞýúë¯EÕ¯~/ùȺvíúÄO\½zµ¢¢âÉ'Ÿe¶Aý¾Ã† ß{ï=ñ•¸üüãèÑ£ ã@õ‹Î•¨q¾&`°mó±.¾›6úi‡¥K—fdd\¹r¥®®.77×1‹[¼xqVVVUUUeeeff¦â;Ázq7| ªªAWTƒi®‡ÄO±ü R§N:%}¼uë–íùÿöoÿ&>k¿—|dĈ¢}üøqé£hˆ#GŽÔrßàà`ññðáÃz{”‘õ±ëV‰®>®`ÜB?ºgÞ§;`€—pþüy•ä6>>þÒ¥KRûâÅ‹ŠcPìÄ⦫«Ñöë×ON#E#%%åôéÓ­­­¯¾újLLLhhèŒ3Dþ)6¯èY*žhëÎŽÝJGœE?;¬lƒá¨!jÅoÃÂÂDûöíÛnP Bk¢ÝÔÔ$} ñQÔrß!C†HÅœ››ûÏþ“” @5x·@ã]ÏÔãÖ™á—n ‘µ´´¨P â9Eg*ŽA±¨ýŒV”$‡’Ú¹¥h¬X±bìØ±eee7nÜÈÉÉ™?¾aÊ”)¢óÆÆÆåË—6ÌqTþyÆ‚Tî]»D͸oß>é ¢¢,XðÚk¯I'gffú_5Ö¤ÒÒÒ>,*ʆ†á>³fÍR¡+z–Š'Úº³]oo¾ù¦0 •hàg«0z·£ÄÒ©}'/R wîÜq¤œ]{éÒ¥éÓ§K0tèPR&pÉ›‰g°»–táÌ=GÂ/ë¦-:}ª¡wïÞ<Õ`ôÑnܸQþÙ¯È*7oÞ,IIIòkÚDy'üêÕ«òµ}úôY¿~ýåË—-D˜‡¼½XII‰ø(ŸPSS#µEM(³±Õ——âÄ ù ¢¢KKK›››Eû…^رcíÿ± ׈‰‰q•jPô,O´ugÛÞ¾øâ‹Q£FIõ©³hàg«pédIPP8"?RrêÔ)íTÿþ뿊¶ívŽÚ©éÇŽ“>~õÕWŽ? èTÎ üãÅñûî»” @5øˆ(0\õ ÕÀ4ï –-[–‘‘QVVV__¿páBÇ,nÑ¢EYYYÕÕÕUUU¢¡˜+vÕ ŸÑÖÕÕ=øàƒµµµ¢H‰ŒŒjº×ñÝ tíÚÕv73»a‹ôUè=::ZT¦{öì±;ÇðÑòsÿ< c5ª!%%Eø£íAgŠÎÎÎ~çwÚÚÚRSSåâÈŸª±&ÕpôèQQà‡‡‡K·pæw*TƒâGW=±¼¼<==]~TÞ™‘øÙ*ŒõÛgÇH[,þìg?kjj*))yôÑGµS _~ùåý÷ß߯_?a!ÍÍÍçÏŸî¹çä3Eg~ýõ׊×JÛBŽ3FÚò‰'žpÜÒÙ}Ç·wï^±4ˆ›Ùr¤LªÁÇXlƒeCa©Yó`ðÊDv‘››Û£G¨¨¨üü|Çì´±±ñ™gž }ýõ×CBBÏQìªAW£uåúõë…vfΜ)ILL,++S¹b" íÕ«—Ý9½{÷¾xñ¢Ô¹q||¼vª§|ѳÐiÿþýóòòäƒÎ}üøñ¡C‡9rdîܹQ5©!ÛíÛ·×××···744Èwžüð¼¨û\¥\òDQ5ê³Ï>ëÔHülFß«áÂ… aaaݺu6lXaa¡vªAàôéÓ"PÇÅÅ cHKK³}ÖhÓ¦MbyUéíÀê/»tvßO>ùdêÔ©111ÒË.gÍšÅ^ @Â×}÷„9ï}fÖæ¦Â¼«8wî\rr2^oÄÑêÀÁƒ¥#«V­?~¼(OZZZΜ9#ÿÂÂnØÓ§O?{öìÝ»w÷ïßïø°·í JDo/½ô’zAäÿ‡a¬F5Üëø‡ujjêêÕ«Õ-0f̘áÇ‹ZãÏ)ùkl={öܽ{·(öKKK§M›f»;ßòåËE¡7eÊùxdddIII§TƒKž˜““óÆoØ× ü`d&[BøúÑ ¯ £”cô&¦Œ ‰ÛþÄ‚ jkk¯]»–™™ùâ‹/âøFj[[[bbbß¾}åWQˆ#¢•¶²‘+5l÷½ Û}ï;¥üó0ŒÙŸ’RCxëÀW¬X¡¢h}ûö‰ã’I𜒶wïÞ~ýú ‡JNNÞ²e‹|£“'O¦§§‹ãÂO7mÚ$_¹reDDD§9¸ä‰Žo Ð ü`ÆÚ«° UкâLp‹P"¨`P}‰¼766V¤»3gμyó&Žáqæ°Í›7/]º7Á 'yÎx±‰å¯“ŸGùg b°^¡ò¶ë5kÖˆR+,,lΜ9òë„l¡·÷Mc6˜=B`¨ªAׯ_0`@yy9n‚ÿQò¨ `P ¾+üý9ýoÝÕ਼íz„ ÒO _yåÇkø¾iâ0f*°&Õ Æ´eËÜÿEò[ºRA ÔØz_Ïlƒ¥$ ÈÛ®7v¶…Þvf&cö¡¨Ü™Ò$PÀ‹¡ÌWMëŸmÀt=ÊÛ®_Wm ]½o³Áì=ÌǼe±±±Þ}1I€j@Èø/Tjx±YW?ëNW¿_ÐmpƒjðÎÞvm÷Tƒ8MñZÃ=Õ@(¶2Õ Þ›{W9"11ñóÏ?÷¹Õ 2þ‹I &€y˜X Ú'A‡¢ÓÕ¨¬Cðúÿm×¢1qâÄÊŒ?~É’%ŽÅ‘Aß7M(¶,Õà‹«Ñ¥KùÕŠÎ0{öì+W®ˆ;Š¿¢mqª!°úòJ?æ):¤üv•ß4h>ª!°þk'%'ØZð§îØ·òç½íZ4Ö®]+½"''GñuÕºzß4fcMË/**JKK IJJÚ¶m›|áÖ­[¥·¥§§§Ÿ>}ÚÎzݻʎ/a±{ íöíÛÏ=÷œp¢¸¸¸¼¼<¹«²²²©S§Š“'Om¨7Jo=…b\ªÁ@4¬þmÃof`ªÁ?þ«ýöì;F…½É-ZðîôÿÒ² P FIb¡€/Ô$Êü¦¦¦Ë—/Ï›7O¾pÊ”)¢„oll\¾|ù°aÃì¬Ú½«¡øÛó/^œ••UUUUYY™™™iK5dggËw„j`Œâ©#R ^¿ÊÉ›à9%ó=Õà]ªA&Á^ €äÖ¬Šðƒî @ôF‰˜Þ³ ¬ìnÄjõsúôé³~ýúË—/Û]XSS#µåMMåÞܻʊە؞éÒ%©}ñâEù+9 c°Ô(ôöŠJ?­­­¯¾újLLLhhèŒ3nݺ¥Þ‰Ô8vì˜Pú† ìn}êÔ©~ýúÉ¿¬””q/gwæçç'&&©H@jܹsgÞ¼yÝ;ðüóÏÛ>„¦85}R µ E :j§®®N¨¾ººZ6ñmUU• žSÒ¿ŽJKKŸ~ú鈈ˆnݺ?¾²²R…RpÌTÝQÅ}l}б[éˆ3ö‘IºÌÃ|Š€gÐù˜¡ 0Ë¿¨ ²²²Dò/Â={ö¨džvÕ„W9Bñ%,¶ç‹lßäâÆÙLF5èó)Å~V¬X1vìXqüÆ999óçÏWïDüݵk—¨8öíÛ§xwQÝ:tHjUœ!~4¡s¶ª¹#U  ¨¨¨W¯^®’î]%£Ó§z÷î­øTƒ) Õ¸O¡(ö“””tæÌ©-j¸¸8õNòòòâããOœ8áìî7n•‹Ôž>}úæÍ›Uî":¼zõj§r“ÍìÂ… R»¤¤D|TŸš>ãm`mCQƒŠÚ)--MLLlnní^xaÇŽ÷Lñœ’þud qILLŒ«TƒâUÜÇÖm{ûâ‹/FÕÔÔ¤â¾0 ’@fkJ]øzñ5´UÀ60;ãΘl%ÛÙ³gïÞ½»ÿ~í™§{W9Bñ%,¶ç/Z´(++«ºººªªJ4ÌM5Ü3þS(¶E%Ô®]»Šƒ]ºtQï$%%E؃ÊÜëêê|ðÁÚÚZQïDFF ›Q¹‹Ý¨Ô%`÷ðŒ³ª­SC l¼ ¬m(jЙv²³³ßyç¶¶¶ÔÔTùyû{ÆNIç::zô¨(ðÃÃÃ¥q:sªAñ£«îS^^žžžþÏþSÝH|aüöÖB5XŠgÐÏ\ ˜;‚µ¦ˆl_${ƒ :pà€ÆÌÓ½«¡øÛóŸyæ™ÐÐÐØØØ×_=$$ÄâTƒ }>…bûQ”EŠ=;ëDœÜ¿ÿ¼¼<•Y‹uýúõÂTfΜ©~g³P”@ïÞ½/^¼(µÅØâããH5Ö65èL;Ç:tè‘#GæÎk&Ö¿ÿnß¾½¾¾¾½½½¡¡Á–¼}û¶Ô®©©q•jpÉ}šššFõÙgŸuj$Æ*I93 :¼®8CÿhBŸlTƒ³ ývT@Gê8wî\rr²Å©?…bûqÕªUãÇ5HKKË™3gäß>¨tR^^žššºzõjg(..ÔƒªßÅnTê°}щèí¥—^2"ÕXÛPÔ 3íŒ3føðáŸ|ò‰¥¨†Àê¨gÏž»wïÅ~iié´iÓä3‡ ²|ùòÆÆÆþóŸS¦L‘GFF–””tJ5¸ä>999o¼ñ†íq#!¤L¨#€<ƒYE Û ª!ào»ÖÞ¡¯ÕJXfÝô5,XP[[{íÚµÌÌÌ_|ÑâTƒÎŸB±ýØÖÖ&JNi¿úÁƒjéD(zàÀ+V¬P€è311±oß¾ò«(œÝÅnTê°ÝB_4l·Ð7ÕXÛPÔ 3íìÛ·O—õhª!°:Ú»wo¿~ýD?ÉÉÉ[¶l‘Ï‚S˜‰jpcÊžDdâ˜fÄaeâx.1„©1¼ Û`²ø¯ne‹Rðkô©Ù>ÌÏ`PC‚j€jÀlˆ!LŠI=k‡ßC1xüŽ\¿¯–—~vº{$†§CbgH?;‹ï¨~A ¬uͽ‚°8¢ËÚ† &ˆÿ"O’+4ˆ½èŽÏ6t:q¬N‡Ù560e$Laü¤ @çdc"øK=Ë1òƒ:û¿hØK60YÄkMÂÁˆ°šŽ°XanÛ`FÀGD $áHÛô©)×lT“E ,À(Â7‡mXäÇPøo…†üIµŒi7/õ]uŒózW¤° LñÌÀ4‹/°»…ñ_üŽ%•Yø‚j0èÞòdàü ìÓoRbŽÔ˜ `¡ØÁ6¨(ñ_ý›{50 Û‰¹-‡Å|5¦‰Õdn# øìppB€EÊ[¤ X¡€A3C1¤5kÖÄÆÆ†……Í™3§©©ÉŽj8vìX||ü† œñÍÍÍ‹-ŠŽŽŽŒŒ\·n’×Éâ…ÇÁ6°Ü˜x^¸9ÁQ`2Á¥Î‘? æÆ¢&L˜PQQQYY9~üøW^yÅ–jصkWLL̾}ûìø[,]º4##ãÊ•+uuu¹¹¹H^W«~çu`ŸÖ)‹t2#|œ\`2ÁÕ ÍÙÖ[äx°¶Žj¸xñ¢Ô>þ|||¼|ö4`.X@阆LP¿‹‡Ë iпs±¼2ÛQµ¶¶Jí–––àà`ùxJJʲeË:5ž   q!’‡m cÁDµ-S ²@… Üx—«ù•·r0õËÉ÷K0Õ`ûTCBB‚|¼¬¬¬ÿþyyyêTO5èÅût^‡ZêÕ†ÞfœàP7¦!\íÊÕÁøm"ý¬V@·™êĉ+;0~üø%K–ز ååå©©©«W¯¶£l'²lÙ²ŒŒŒ²²²úúú… "y?,‘¼Içi1Ùp–oP×ÀmI!`½ð -à^Ø÷Ïzáùˆ˜{‘ÕíøÅ¨Ö®]+½"''çÎ;vdµk׸bÅ gTCsssnnn=¢¢¢òóó¾™Ê+Ö&Ø<‚•7°`M2ÁGÄ‚ŸσyˆSSª3~£Ûƒ„oÄ’²0*@zn§‹ æ–°,™àSVA?e»ç¿Ódé:7TÕ€ðÝ ìæHpdß Ã-P„T tB,è‡aðzǪ X¶9Tƒ¡…o¾ÐÍbä‡|ñÂ-° ¯——Lð3« g†ÁGasdSx®u„oâ@ÍäS‰YP¶p ¬/€ N,¨ÜÚ"Á…xÑ–H¥?y8™!ôþæžlÍ$m¸Ö€fd‚Xõ1˜)»€vT $ À·ˆsC|'4ÇsÌ´×y . H€ÕȽ FgüÿY¾ë—¹eîÏ«>Ù>“  ÐO0¢œáXÖ1X–LÐ'«`>†! á‚eGY‡jPïͽ«´‡ùx{{ûË/¿õꫯŠÒñººº©S§†……EGGÿô§?õ– Ý›‘nßwÌÒFùàÌË $a¸–H€BÉC ©‘uòt þ î±WƒY¨?kÙY‡o¼ñÆã?~õêÕòòòÇ{ì׿þµt|Ú´i999uuu555Ï>ûì[o½åõ1Ìž=ûÊ•+â ø+Úz H†K ´Æô nè-Ï„V`52Á@Ä‚u•ì"àÆ€§â…Þ2‡¢¢¢´´´¤¤¤mÛ¶ÉnݺUÇÓÓÓOŸ>mWw»w• Æ÷ñÇKí>úhâĉ*>þøã‡’Ú¢1bÄ©QWW'µkkkGŽ)µ›››-Z¹nÝ:é`kk뫯¾:cÆŒ[·nÉ£ÍÏÏOLL r _eeeS§N'Ož,ÚLÛ¬ìPÏã°A³5–œ¤³’ †c,Ë0è*€'=Ë\à………MMM—/_ž7ož|á”)SD)ÝØØ¸|ùòaÆّî]¥‚“'O>üðÃ---ÍÍÍ<òÈ… ¤ {ôèò­o}kõêÕ­­­ÒÉÝ»wohhÚׯ_ŒŒ”Úááá¶Tƒ||éÒ¥W®\ßæææJW¬X1vìX1Ú7näääÌŸ?_íŒ3ª««/ÎÏÎΖg Õ@01+ÛÐi?p g¤L Ö$TOðÀ"I”–ñ÷éÓgýúõ—/_¶»°¦¦Fj766ÛÕî]¥ŽY³fåçç¯[·îå—_¶=ÞÚÚzúôé'Ÿ|òG?ú‘t¤k×®mmmR[4‚‚‚¤öäÉ“¿ÿýï××××ÖÖΙ3G@BBÂùóçín—””tæÌ©]QQ'öêÕ«ÎJ*ùbîüÁ 0©ó–ðápF€Ès° Ô³†`Ô- 5™ØüXõ9þcÇŽeeeEGG'&&îÙ³GQ_òG¹áÞUê(,,|衇’’’Î;çøíµk×ä§œ=ÕP]]=iÒ¤ÐÐи¸¸•+WöêÕK:ÔÒÒb×apppPºví*FØ¥KõY¸jÏP ø¦¡ó=_äp 8# :@àæ&ÌG,À0¸'"ýÛ!úb-þÌ‹ŠŠäÚ\;iàÞUŠ1bÄ›o¾¹qãÆ9sæ8~[QQѽ{w©íl¯[üîw¿›9s¦ÔV|ª!11QñZ¨†À¦ß~p¥ÒÒÒ§Ÿ~:""¢[·nãǯ¬¬”Õí¸G‡-·Å À1 Õàj$‡[`¡äf„V“ fe`ÌXHHÈF€Ÿe>}úô³gÏÞ½{wÿþý111I÷®RÁÁƒ ÐÚÁƒÿío“îò÷¿ÿ½¥¥åÒ¥K&L˜;w®tòÖ­[ß@!N(++»}ûö{ï½×·oß’’éø²eË222ÄWõõõ .”®ZµJÑ/^ýŸ9sfÆŒŠ£%³Üu¨†´´´Ã‡ I644,Z´hÖ¬YÒqÅ=:l¡¸-!ňi°úµp gDqDQK‘ ! LÏ6 eÀ*ìÏñ¤¦¦4èÀI÷®RÁèÑ£wîÜ)µ?þøãï~÷»¢±cÇÑ¿¸K||¼(xEå+ÐÞÞþÒK/Ev`É’%â£t|Û¶m½zõ 7nÜÉ“'åΛ››EÙÛ£G¨¨¨üü|é`[[ÛêÕ«¥÷e ÞÞÞþòË/GFFFEE½úê«â£t¼®®nêÔ©aaaÑÑÑ?ýéO½K5¸Ú TîɺÌLñJ`Ï‚L€U ¦¬õ^ôk À¢&k2Õà;ëä7Þxüñǯ^½Z^^þØcýú׿–ŽO›6-''§®®®¦¦æÙgŸ}ë­·¼2˜Ù³g_¹rEt"þŠ6TîÉŠÌ|K^‰6u0! Œ.@dÂrí€-!O×bEEEiii!!!IIIÛ¶m“;Ùºu«8"ާ§§Ÿ>}Ú.utï*;Œ7îã?–Ú}ôÑĉUN~üñÇ:$µEcĈR;""¢®®Nj×ÖÖŽ9Òî¦Çދ߰aƒh·¶¶¾úê«111¡¡¡3f̸uë–¸6::ºººZ:¹¹¹Y|[UUUVV6uêTÑÉäÉ“EªªàɬvÇD•F)lÉ„a 'IÄÂríH6Œ"sQh655]¾|yÞ¼yr'S¦L%vccãòåˇ fW¿»w•Nž<ùð÷´´ˆÿ‘G¹pá‚tr=BBB¾õ­o­^½ºµµU:¹{÷î Rûúõë‘‘‘R;<<Ü–jK7ݵkWLL̾}û¤ƒ+V¬;v¬á7rrræÏŸ/.X°àµ×^“N(..ÎÌÌ qNvv¶<#ƒR &ØsÂ!…·À³j}ÝA†àÄ Ðíroµ]°pJu³Ž¿OŸ>ëׯ¿|ù²]'555R»±±188ØÎñݻʳfÍÊÏÏ_·nÝË/¿l{¼µµõôéÓO>ùä~ô#éH×®]ÛÚÚ¤¶hIíÉ“'ÿû߯¯¯¯­­3gŽíMóòòâããOœ8!w›””tæÌ©]QQ'¥¥¥‰‰‰ÍÍÍ¢ý /ìØ±ãžÍ(ÄûŠî¹á#ŠÃôј }ÝAƒ ¨AÁ0—Ôm)ªÚÁŸ…TCÀ§pìØ±¬¬¬èèhQnïÙ³GQw¶9¤'W9¢°°ð¡‡JJJ:wîœã·×®]“ŸRpöTCuuõ¤I“BCCãââV®\Ù«W/ù¦)))Ë–-³í0888¨]»v'téÒE:žýÎ;ï´µµ¥¦¦Þ¹sÇmæ©÷ }g ‹P ¬Á©‘z¾„ E& ˆè`Ž_À\5 ÛD½¨¨È¶N×H¸w•Œ#F¼ùæ›7nœ3gŽã·Ý»w—ÚÎöj°Åï~÷»™3gÊ7-++ëß¿^^ž|Bbb¢â¯!Ž?>tèÐ#GŽÌ;W‡%’–n¸çƽŽ'Cž~ú鈈ˆnݺ?¾²²R¥Ghßà oJ"‚! s”`HÉwd©¬‚®Dü[0b>u3 –С±OŸ>ýìÙ³wïÞÝ¿LLŒFÒÀ½«ìpðàÁ´v`ðàÁûÛߤžÿþ÷¿·´´\ºti„ rí/Š_Å7PˆDqzûöí÷Þ{¯oß¾%%%¶7'§¦¦®^½Z:¸jÕ*Q_¼xQôæÌ™3fȃ3fÌðáÃ?ùäƒR ÜsC --íðáÃB ‹-š5k–JÿŠTƒÆ1 bÀ(¥Òðõj\áûyÌ ŠÕÈh‰]˜G§ÁŠ‹×(S(((Åxppð Aƒ8 ‘4pï*;Œ=zçÎRûã?þîw¿+;vì}ŠžãããEÑ*ªWé„ööö—^z)²K–,¥ãÛ¶mëÕ«WXXظqãNž<éx÷k×® 8pÅŠ÷:6yX½zµôÿúÁƒ‹*X>ß¾}â¸Ü­á¨†Àî¹a q‰Ì>)öïí;c˜8<úzj†“K¡ÑëkÈÿ‹Â¸<ƒ¯£Ä‚ÊC—T€ô€jjDä¡çê_ $üLÁ(ؼyóÒ¥Ku+ùN{ìžG5jTxx¸4Ny Åþ=‰P P À™õkô  Í3xkä° úQ’ÞraÄâuÚÁ²ÅBÈ7Œ‚ëׯ0 ¼¼Ü¸TƒŒ€ì¹‘°}ûöúúúööö††õþ±í€ð vùöíÛÏ=÷\XXX\\\^^žúö¶hnn^´hQtttddäºuëeÀl'Pé‰ßæ`ÐŒËÃaC,èÁë)TƒqWaþ½L#y݆1’   -[¶èYævÀ=7zöì¹{÷¦ÒÒÒiÓ¦©÷OH ȼìú_¼xqVVVUUUeeeff¦úö¶XºtiFFÆ•+WêêêrssYA€KáÝ×K€e_ i¸)¸÷ ¬‚nu‡:€OC7"òDŒžG`@rKŠnn™wÚy÷ÜØ»wo¿~ýD?ÉÉÉ[¶lQïÃÖÕéÒ%©}ñâEõí;l‘pþüyâp5oñVêhY2ÁÄ<ƒÆÿŒS}è¿D)ÀG!Ay—v0‡Ù«‰À3 Mä Oª!((¨µµUj·´´¨oßaw¡8uõÄÆmžá_<ƒ•Ån²ÊÍKqÈø:, %?D]–?@–Õ€œ™—çTCïÞ½Ÿjál{ žj.­ûÿâm dã&Zhž· Éø'“?äoM9ëD›%O.çõž 22²¤¤Dþ¸hÑ¢¬¬¬êêꪪ*Ñо}DzeË222ÊÊÊêëë.\H³l6â7  _øÈ¿Xø/ºÄ S6ò!爽M dTÉ# ž`åÊ•òŸyæ™ÐÐÐØØØ×_=$$D:ÞéöÍÍ͹¹¹=zôˆŠŠÊÏÏGã$¤(ú¤ýVØ]ìÊj†mqù°Wl<ÆÉÜõ?µsçÎ%''#’Iï&EÞÊ+¨GÅ_Ñ&³®1S§†§˜Û¨Ð/¢@˜ÖÔ:Ò"Då9$ƒ‡Ë}QQQZZZHHHRRÒ¶mÛä ·nÝ*Žˆãééé§OŸ¶cÜ»ªS½Ü¾}û¹çž ‹‹‹ËËËS¿#ÊÊʦN*®šlØ0;ÒÀ½«GhûqñâÅYYYUUU•••™™™ê·S¤²³³åa =¥Ôç.ý¦Œí~›o ~3E]æ‡[Ý;X#TƒPPP«·}qñ>  |súôé³~ýzQÂÛ]XSS#µƒƒƒí2I÷®ê45¿té’Ô¾xñ¢úí!ÿ€BœÉ(Œ¸¢9¦Cz+gLf9þ¤Á[/!¥ÂÕ¿ÿ¢ ÖãÎÂÄz ¸Ž?ÿüsý³18 f¢/E ÂαcDz²²¢££Eðß³gz&/7Ü»ªÓ=((¨µµUj·´´¨ßΓ$«ƒj`ײ99TTT@€P ^D—.]ÚÛÛõO5`ÌÀ6/®ûEEE½zõr•4pï*g©iïÞ½ŸjP¼éùx»h`Ë5ÅÇÇoذAýi¥æææE‹EGGGFF®[·Ž\ÚíÀë»9:ÛÑåÎ;óæÍëÞçŸ^|”]ÞnŸ-v"Ú­­­¯¾újLLLhhèŒ3nݺUWW'l£ººZ¶ñmUUU§[ÁøÁ®ülT¾æ‘Œ«Vs‹N oÍš5±±±aaasæÌijj’ççç'&&IO:Õ¯_?¹"””9^ùÓ }·ÂzŠÎ[ZZúôÓOGDDtëÖmüøñ•••ŽÃpŒúq|B° Àó¥úôégÏž½{÷îþýûE´×H¸w•#ÄÂQRR"«IVV–HAEÚ)ê·#™4_J©hB»víJß·o_§æ´téÒŒŒŒ+W®ˆZ&77—JÄíëSªAqGáû&L¹hEEŸqã/^,w¶-L§v²bÅŠ±cÇŠݸq#''gþüùâà‚ ^{í5é„âââÌÌÌ{¶‚ñƒ]™‰j0´"XLO5ˆ8#‚Œ5¢ø}å•Wäã¢Î•é/iéé釒Ž~õêU»³qãÆ3fHG¦OŸ¾y󿀤!¨†NWD{ÅK)Æ=8>{5áÌvÎ;—œœŒX,N5¤¤¤,[¶Lå[µ´´àSžß§TƒâG»}Zd Bã¶0Žv"zê@×®]Å ]ºt‘Žggg¿óÎ;mmm©©©ÒÏ4:Ý ÆveªÁèŠ`u0=Õ gãR]]݃>X[[[SSY__ƒ4Õ è¼G5jTxx¸tSÙ÷mà,>Üñ©G€m¦Ìš,X Vök×®eff¾øâ‹ˆÅâTCYYYÿþýóòò´P üÓÓ[ÖÿTCïÞ½ÿÛ(C}[G;¯âo?>tèÐ#GŽÌ;Wå~¶+ÓP FW«ƒé©Û8#,J=.egg¯_¿>??æÌ™2HCP ŠÎ+ä³}ûöúúúööö††Å']Å=8>¡Ø` Õ_ãKH7mÚ!Vö›7ozØ™¤±ŒÊnïéååå©©©«W¯V9G²eË222DÞ"r›… R‰¸=xÿS ‹/ÎÊʪªª’~CýÒK/IÇ÷iÑb'«V­ýˆ²¢¥¥åÌ™3òƒÐcÆŒ>|ø'Ÿ|¢r ?Û•™öj0´"X LO5Lœ8±²Â,—,Y¢—Š‹‹uààÁƒ2HCP ŠÎÛ³gÏÝ»w755•––N›6M‘jpp|° D‚½ »½;䯵k׸bÅ •sîuìS››Û£G¨¨¨üü|ìGo<ƒJJoû Ñß@¡¸O‹;ikkÕ®ôª‹ÁƒÊ7Ý·oŸ8.ï-ßéÎ3~°+•x$ã*‚ÂÜr#\»v­ôŠœœ9Î8‹KÂzûöí+[©ÿ Òyµ¢óîÝ»·_¿~â`rrò–-[Wmgñ!àŽÏ^ À6‚¢@†LßëÕôúݼyóÒ¥K-kTúѯA|3=Õ@R­j¤F@î„(!Ó÷n,5·~¯_¿>`À€òòr¨A|ƒj £Î q@l¤O12}ïŽÙÄúó Ú²e‹•JúÕ­"ˆoP ¤Ó0³€ð#`-cú¾°|ܪ] äF def¯’2wÖ2¦ïuËÇS Ðr@ndA§ÄI€ ™5)%Ó÷îhq¨t‰Å q@¨Èù(¥ôçUÞíÁ é‡{CÕ¿~}!ÿÀêÔTƒ¡õKÉŒ]¡ “騠  66Ö[wa¯•#2d¦¦L)Õ{sã*g/Iwï A—r·ßpúõ ·à;êͨ,¢_Cè‚uÁŸvågiø³gí†m&%&&~þùç>r|öj€ oòŠ M¼ÕÕ`>g]°¬œ=1l3é¨K—.ííí>r|HXÔÔã ºM)‹ŠŠÒÒÒBBB’’’¶mÛ&_¸uëVqDOOO?}ú´]BâÞU€Ü8vìX||ü† Ï)++›:uªø8yòdÑ6z%âÉ u®_•Kîܹ3oÞ¼îxþùçÅGg÷Õb$¢ÝÚÚúꫯÆÄÄ„††Î˜1ãÖ­[uuuÑÑÑÕÕÕÒÉÍÍÍâÛªª*Å©éÓ¨ ¡_‹è‚uÁŸvåhBê] ‹Z´h‘°±ÈÈÈuëÖÉ'¯Y³&666,,lΜ9MMMòñüüüÄÄÄ   éã©S§úõë'×¢‘’’":wÖCiiéÓO?Ñ­[·ñãÇWVV:öìùÊ¥s)ö£(;Q8S®'ŽO(€u8àõÚÜ4@­M)EzVXX(’¨Ë—/‹êO¾pÊ”)b¹oll\¾|ù°aÃì÷®R)Ul?îÚµKä!ûöíStètäàÁƒC† QéA”؇¾}ûvCCƒe³fÍRéÙí•Kç:RìGE2*×jŽOø¶Â’Á kYŸ>}Ö¯_/²» kjj¤¶È=‚ƒƒí÷®ÒB5äååÅÇÇŸ8qÂÙ9òc–âî†~¾ÚsG0„~/éÝ»÷… ¤vII‰ø¨~ßN$))éÌ™3R[”qqq÷:þÅ–˜˜ØÜÜ,Ú/¼ðÂŽ;œÝBŸFeýZD¬ þ´+ERé*!!áüùóŽÓ¼xñ¢Ôß +•_½zÕ.¼lܸqƌґéÓ§oÞ¼Y¥[ˆaÄÄĨôì¶aë\GŠý¨H¦SåºíøìÕ€p@5@·ËÙ±cDz²²¢££E!°gÏgÅ]ý«´P )))Ë–-S9G{vaªÁjú•AAA­­­R»¥¥EÎl5Þ×ÑHDAèÚµ«8¡K—.ÒñìììwÞy§­­-55Uú™†â-tkTúׯuta)ª!°våÌ„Tâ‰#ŽÓT 2ŠÔÕÕ=øàƒµµµ¢âŽŒŒ¬¯¯WéáèÑ££F —$ÙéðÜ3lû¾b?Z$ãL¹n;>é+€’¥ý׳EEE½zõr5ñpï*•R´¬¬¬ÿþyyy.冫D¼56ÃéWjôîÝ[ýß…ê÷u4‘î*>s{üøñ¡C‡9rdîܹ*·Ð­Qé_¿ÖÑ……@Ù•3rÖ•–§Ä9êdgg¯_¿>??æÌ™ê=ˆÆöíÛëëëÛÛÛœÍÈÕK羯ØÉ8S®'L(PØ¢ Ï¬rúôégÏž½{÷îþýûwTL<ܻʑ‘‘%%%v—”——§¦¦®^½ZñT"^t:ë×Ù%‹/ÎÊʪªª’~ýÒK/©ÜW‹‘¬ZµJô#ê‚–––3gÎÈÏB Œ3føðáŸ|ò‰Ê-ŒK5èA¿Ñ…¥¨†ÀÚ•3rÖÕ²eË222D+ŠÜ… ÊßNœ8±²¢·%K–¨wR\\<¨Tï¡gÏž»wïnjj*--6mš³y¸réÜ÷ûÑ"•ø`)Ç'|@y‹"€²Ê‚‚Q&‹ëÀ÷®rÄÊ•+#""ϼvíÚÀW¬XáxŽi¨+è×Ù%¶o  ù Š÷Õb$mmm¢Ô•vPžŸŸŸ˜˜$}X[[[SSY__zV];Vp —æHˆÀ6À32yK\o  L).ëÓ5_€***êÕ«—«¤{WÙžcûTCBB‚zWÙÙÙëׯÏÏÏŸ9s¦žµcVqo^ l<0Äân,à}æÖ/FeqýœM£¦OŸ~öìÙ»wïîß¿?&&F#iàÞUŠ38qbeÆ¿dÉõ®Š‹‹uààÁƒú׎`ˆ`€‚Å:©ˆnG‡`îü]}& ©©©ÁÁÁ¢~?pà€FÒÀ½«gºvíZé 999wîÜQ節­-11±oß¾ò«(ô¯‹;>{5`° 5A„©ÀÎíôQáˆx Ryq¦h{ jÄàp@ :óÊšeDªEÕ#±`qq‘9¨tzÑárŒ¢׈À-˜ÆÝ€b `A ¸¸oy2PØ4‚ÜÔÚÌ@, "¯ÈP£tP7TÜÌÀ-/Šš„@PDEÕ P©Ä‚Y…LäN =žÀ-tkŸ|ÚÄUŠYrChÈb¤ñº Pn ,‘†À 'F2yœ©ÊUÓëáÌÜr&+KÅ"*ÄЧ6 €B Û@I9¨Í™ ÜJ4™rÀ‚«pXÀ€m`b¨èi $C`Mª@Ï·H˜1[Oœ81:::888..nÒ¤I~ø¡NRSÏÕñ‹_üb„ êç<õÔSùùù*'|úé§3gÎŒ‰‰¹ï¾ûÒÒÒ6nÜØÞÞn{Âùóç333#: „)>jÿVBYYYrr²ú|ÛÚÚ6mÚôï|çÊJJJš={ögŸ}ðTßw·.((6I<€ L‹ˆ¢p À”Ä‚ÅɇŸüä'C† Ù¿]]]ssóñãǧL™âŸ){H5h¹¼¥¥%>>þôéÓê§rP³Ã3@,€€èŽÁë xä‘GDÝjwüõ×_×.<)oßÿý'žxBËFŽY\\ììÛÿøÇ¶1üóŸÿŒ•?.[¶,77×ö|ññ¿ÿû¿µ|+aûöíN*,,ìæÍ›útõÜ¥K»HÀ»Ë=r¶ÑÂ- Ã)‘Ié™™™;wîT9á7Þèׯ_HHHÿþýýë_Û D|%НRRR~ûÛßÊûž={l{¨®®ŽŠŠª­­—üá6lXxxx×®]íêSÑyrr²t#ѳü•hüñLOOïÖ­[÷îÝ'Ož\UUuOó¦ Ï?ÿü/ùKÛ#ï½÷Þ!CDo}ûö}ë­·äã6løÁ~ Qnb <ð€üñÛßþöW_}e{‚ø(jùV@G̽´´´Óš=11Q…±šõСCCCCÞ|òÉÓ§Oøá‡£GïÀ÷¾÷=IŒjYQøêTƒ³Þ¾þúë§žzJôsß}÷‰éØ*eðàÁâ¸PÊo~óg~笕ž=Ÿ@ã* Õ ~'A,êq&(!::Z¥Âúý”ôùçŸß½{÷èÑ£¢-ª3Y¢‚ûòË/ÅWâoJJÊîÝ»Åñ>ø@Ô³¶¬ZµjîܹÒ%=ôÐ_|ÑÜÜl—š¾û¸èMü=ÛVÍ?üðgŸ}&¾ª¬¬œ3gŽ(“µg¶¢€ýË_þ"Ü¿BBÂG}ÔÔÔtþüù™3gÊ_xì±Çä«Nœ8!µE碴?uê”tɱcÇëÓï|ç;¶QŠžm«æ¯¿þZþª®®.<<\;ÕY[[+|üñÇ÷íÛ§x¦(TE=®Eh¢\MMM­¯¯—tíÚµ­­ÍöœÖÖÖ   -ߊ‰ ©Š#'ÕØØ(*ñŸþô§Ó¦M‹ÍÈȨ¨¨p¤Μ9#_"†*Žœ={Ööˆ,Fu-;¾3ªA¥·ûï¿¿¬¬ÌñÚÑ£GÛr ÂH~øaEªÁYÎŽ{ejfy;aÓpIJŋ™o`]]]íì[QÁÙnã Š\qD–€ÝW¡¡¡R{çγfÍ’ÚÛ·o9r¤|‰\PÛU‘Ž7²­ší~ªoûU§½-—"):W<³­­-88¸Ó ’’’þñØô䩆o}ë[¶»VºdTÍÍ͹¹¹'Nt”Œ£Ðœ‰Q]ËήrF5¨ôöâ‹/ÆÆÆþà?øío{ùòeùœ°°0»uAú}ãõàì¸W¦€·ôÏ- "ü—Yë ¢Jݵk—w©QÁ=üðÃååå¢=|øð;v8+å4R ήr㩪AËS o½õVbb¢ã«*ÓÓÓUvcPÿÖÃhyóæM[¥t*4W©†NûÑÞ›À‰'òòò²³³£¢¢V®\)_¢²×¥Ý{PéÙó©4®‰P òvª'¸€§0w |ðÁàÁƒïܹcw|Íš5÷:ž?·Ý„Pœ¬å÷:~#ÿãÿøøñãñññòC*ÅÝ£>úÑGÉÇ?üðC-U³–wˆ2_ Cþ8|øðýû÷+ž)jU1_•®~ùË_&%%]¼xÑñ«¥K—:¾cbÙ²eZ¾u)]ÿ¯ÿú/»¼\ºt©wïÞžP êZv•jPéÍ¥¥¥aaaR{ĈŸ|ò‰«õ‹mÎŽ{ej’aŠ€ ±ð$à*D!,*²÷ßÿúõëwîÜùꫯ²³³¥ýþ÷¿OII9zôhssó—_~™œœl»«ž´‘£øJü§Ù¾ÉB”âÏÉ“'¯X±BKµ»}ûöo~ó›Ç½‰¿¢­¥jNLL<|ø°:ÛðŸÿùŸ6l?ŠiöéÓçСCwïÞ½xñâ³Ï>+µ~ýúþð‡ÎúY½zµ˜ïÿýßÿ)~[UU%ê}ÑÃõüò—¿üÆ7¾!ï·©þ­K¯øvðàÁûöí»uë–PÖ‘#G„œW­Zå Õ ®eW©•Þ&L˜ ôÕØØxóæÍ_ýêWiiiÒñƒ:ô‹/¾hjjóÅ™ŠwtÖƒ³ã^™À¥9ÈÛ©žàyBPTTôÔSOõìÙ3888..nÒ¤Iò3[·n•ß(Š8ÛYK_‰KDgû‚B [¶l¹ï¾ûä ;-îÞxã¾}ûŠÞÄ6mÚ$®íôª?ýéO ]ºtQ‘¿˜Ú˜1clüùÏNOOw|¯âðáÃm·¦Ô mw†,))™8qbDDå{îÜ9ÛËÕ¿Õ^ðŠzüûßÿ~RR’Ô<ðØc½ù曎׺D5¨kYËðÚÛÛmwWpÖ›¤‹nݺ‰‘ !™È_}üñÇO>ùdxxxhhèèÑ£m·î´½£³TzöpjVpl<Ä`Fþœ²ú +W®´}fÀ%œ}úØíZ 4¢ªªªgϞȋ¯ƒ,ߨx¸À(|šU~úé§qqq¶ïèÏ>ûì… ZZZN:5lذŸÿüçÞê/~ñ ÛòñÔSO­_¿KvBe¯½öZff&¢€u¬@Ô²l„[F)®;íÜ¥×À6øSAâ«Þ½{¿ÿþû.uøÎ;臘¦'%%‰Òµ­­ /3ºvíšžž®ò“‰X™m0e­ ±¬Q@5€µ CÀ4¥7Ü0ÍÒlûÐÂÖ­[“’’BBBÒÓÓOŸ>m{‚ºy777/Z´(:::22rݺud,€OWmòlƒ xˆ`ªaÊ”)eeeË—/6l˜ã Î:YºtiFFÆ•+WêêêrssÉXÒip)‚iÿe·q«¸`Mª¡¦¦Fj766k§Ο?o&±–Í lƒ{TƒÎ£"Ü€j°»‘ãq•‘µ´´e€…àÛ å™Çô^ K³w©žjü³’ÏLÉ6¸A5è¡~‡[P žS ‘‘‘%%%ŠÙβeË222ÊÊÊêëë.\HÆâ ÅÅÅ'NŒŽŽŽ‹‹›4iÒ‡~h‘DTû¨¼û~U¯¿­ÕŸâ-((v¢Ñà=ùå£9j_‹…qúÈmíÜ»“5e‚Gî 0k@s•jH<„Xð ¾ V®\¡x~sssnnn=¢¢¢òóó¡ñ“ŸüdÈ!û÷ﯫ«;~üø”)S|1ëP .àî‰Eñé>¿ -!!áÈ‘#ž ª!àªÔÕ88qÅiÚÚ¹'cÓ¹ŠY@=è´`wVÚûçšp €\Éèxä‘Gnß¾mwüõ×_·ŽÖx¦©¢K—.ííí¯ª|gF!åLI5h´sy+ ¥x±–w‰gðbxX¬ËHÆp’ÉÌÌܹs§Ê o¼ñF¿~ýBBBú÷ïÿë_ÿÚv²â+qP|•’’òÛßþV:>räÈ={öØöP]]U[[kûÃ?þñéééݺuëÞ½ûäÉ“«ªªäóÅ]’““¥;Š[¨ˆ´¢¢â‡?üahhhLLÌ /¼pëÖ--ý‹¡ŠkéßÙ™rã믿~ê©§Ä-î»ï¾oûÛŽk|Éþð‡aÆ…‡‡wíÚõÞÿÿ_TEIªwÎn¡Ek*’Ñ®úN÷M²˜³›ªKR¥d“ä9tèP¡ý°°°'Ÿ|òôéÓ~øáèÑ£Ã;ð½ï}ÏvjÎLEÝÞÞ{ï½Áƒ‹!õíÛ÷7¿ù‡ÊËËËÊÊ’?Þ¼y3!!Aü•ˆ¿üòËNUé5Ù™œŸÇ©20íVíx¦Kzw6-Þ­òŸ)aC† ³†ñÖ[o©›™¼UŸd 7À|lƒ«$ܬ˖•Ltt´Júúûßÿ>))éóÏ?¿{÷îÑ£GE[¤¾òdEz,Šñ•ø+’öÝ»w‹ã|ðHûm;YµjÕܹsírø‡~ø³Ï>×VVVΙ3GÒWï¾û®È·¿úê+ñ•ø+n¡¾íçï~÷»;wî”——Ïž={þüùö/)÷/f$jLgý«œ)7 °iÓ¦††i´S¦LQ)¦zè¡/¾ø¢¹¹Ù±¢Q”ä=Õÿ#«|¥®5g’Ñ®ú{.þ&Bå¦JReúƒ úôÓO›ššjjjDY×£GGyÄöȤI“:5{+..ŽŠŠÚ³gèð¯ý«8íÏþs§UZZzÿý÷߸qCú(&% OñWúxùòåÞ½{Kÿ(WW¥çjr49ŽS}`Ú­ÚñLízWƒïvÖÞ¿¿0§>úHÜñüùó3gÎÔ‘|ê­zKÈI&¦:ý?‹Û´ÜP &“Lpp°Êû@‡ RTT$|ÿý÷‡ &OöÀòW|ðÁc=&_uâÄ ©-:é÷©S§ì Н¿þZ¾¶®®.<<\jç;߱ݑRÜB£HoÞ¼Ù«W¯Nûƒ´¶³þUΔ¢X+++ÓXn;vÌYyåL’îQ êZs&íªwƒjpvÓN%©2ý3gÎÈÇëëëÅ‘³gÏÚq65[SQ±·Ñ£GÛr B}¢îÓbŠC‡•ªEQª8pÇŽ Êö7þà?ТJÏÕährþ§úÀ<¡´ë]e Z¼ÛYûñÇß·oŸ«ɧÞÊ"~`Ô_Ná*?±¹„é%]]]íì[QÚnãÐØØ(ŽÈ“µû*44TjïܹsÖ¬YR{ûöí#GŽt,(ì~m[rÚuëL¤•••ßÿþ÷ããヂ‚$ÉËO‰«ô/©±•3寋/¾+вßþö·—/_V/·[[[•WÎ$éÕ ®5g’Ñ®z7¨g7íT’*ÓwìÓÙ]TLEÅÞÂÂÂì}ÇŸ!(bíÚµÒŸ?üðÃ'Ÿ|R4žxâ ©°;v¬\᪫Òs59šœ?Ç©>0O¨ízWƒïvÖ׊ó]H>õV@JðÉà*շ법%3qâÄ]»vy—jéñÃ?\^^.ÚÇß±c‡'e²3‘ŠâháÂ….\¸sçÎ½Ž·héß»TƒÀ‰'òòò²³³£¢¢V®\Ùé<¡„`=§:˜/¨-¥¥¢$Ý`Z¨˜ŠŠ½‰¯l÷.ÐŽÒÒR¡AqmVV–´Jaaaffæõë×cbbAㆠÝе?Ç©}`êVí‰uù™jp/"yÅ[õ³²p,B8¸DM@,àçuÙˆ»î›2cùàƒ,寶X³fÍ½Ž‡{‹‹‹mOÖòŠ{?@þñ|üøñøøxùZïG}ô£>’øá‡ÎDb;lÛ3Uú÷î(ì ·°°0©í¸q½z¹íL’¢Ãúúzù«³gÏÊW©ÜB]k}J¥uOtuîê’ô Õ b**ö6bĈO>ùÄ=·Ò[½zuŸ>}$ãW®\iû»~-ªôDMZb‘ïÆ©20—¬ÚªAe žü€bøðáû÷ïw)"ùÚ[õ–™“&LO;¸Á3 IN5¨÷ìÆUÚÿMælSYsS K—.éîûï¿ýúu‘*õÕWÙÙÙÒD~ÿûß§¤¤=z´¹¹ùË/¿LNN¶Ý²LÚWM|%þŠÓlßd!jÑçäÉ“W¬XáR¸}ûöo~ó›ÇÝŠ¿¢­Rdýä'?©««»}ûöÞ½{¿ñohé¿°°P¶4#gý«œ)7&L˜pøðáÆÆÆ›7oþêW¿JKK“Ž‹zM·-.ÔËmg’ü÷ÿ÷yóæUWW‹¯>ÿüóGyD¾JåêZÓhá*¨û…«sW—¤W¨SQ±·ƒ:ô‹/¾hjjºuë–ø(©12¬Y³&88øµ×^“GG„Q9öà’Ä´«IK,òÝ8Uæ’U{B5¨ŒA‹w;k‹PÙ§OŸC‡ݽ{÷âÅ‹Ï>ûl§fæ oÕíQI§†æô ¼N5øâ*÷:Ÿ={ö•+WÄAñW´Íe=õÔS={öUF\\ܤI“äõnݺU~›¨m'+}%.é±ã«·lÙrß}÷UTT¸Z'¾ñÆ}ûöÝŠ;nÚ´It¢8f‘ä7îþˆjåí·ßÖØÿ›o¾),õ¯þ²KggÊ !·1cÆtëÖíuhII‰tüOúSBBB—.]´ IE’Bzÿñÿ!:Bå¬õ«\»º$½B5¨˜Šº½}üñÇO>ùdxxxhhèèÑ£åÍE9¥âPÿøÇ?ìŒÿÚµkÝ»w·ýE†FUº­&-±È§ãt60—¬ÚªA݆;õn•öŸÿüçôôt»· ª˜™×½µS Ð#c ¸·.‹""--MäQIIIÛ¶m³-¯Äq\äl§OŸv,=þ_{gUõ=ð´J¡)¤eé†,Y­¥(`1ŠÖ¨h‰q Æ5*ñ 6Ú B$‚ ¢È¦eÕ¶l*„°Y‚Z"%’Ô¦¡,h)ÝX¾'¼ü^&óÞ»sçuZf†ÏçÉ;ïÞ{î¹Ë;çÌ[\”Rû&вօ\YY9eÊùš““£ólü[ÍbñÙÓ¼¼<óÿ>×=ztÈ!,:h4çÛÇüÒK/¡.¸Yç äY ZA†ö‰`§Øas^Ž/,,lll¬¨¨ÈÍÍ5+™>>%%eË–-¶ŽªÕßwWJjPçß²…À¤€0‹3„ñ&C´8/{QRRÒ§OƒîJ*ԀŠs$ÔÄè)@{ž—§NZVVÖÔÔTTT” éø»+ÕšPC\\œÓsï±X0z€ˆþO¨aýúõÆ­ÐÇß¹s§¦ãï®TkB yyyݺuký£b™!€y¢Br*Àï¦×Øh\˜åž¯º¶ý ð¸é;5š¸¹gÀ3Ëym=F8Ý`2»3Ð †n›Ö| ¾Û4xžçþNØxpýR!=Ü:‡¢ÿN¨°ÀQ3ÍÜ"îp+Ç…PCІ>ÖA8ÊÁ¦ü›jh‡á¡PCö=„N‚İÀCËÀ –3šA3ÁiÀ·Q¨áVVi¸Ž5¡†`ÐÞ-jh¥Ù—5@Û™ßNÏ“æ}˜M XÑh&ب®®~á…¢££ž{î¹K—.™ÝY³fMfffLLLÇŽÌmÛ¶¥¥¥uêÔé¶Ûn[¹r¥BË—/4hPTTÔ€V­Zåù«S%ÖœQ£F‰x]»vÍÊÊ:~üø®]»ÆsƒÇ{ììÙ³ž¾Õht2#}El^º ñéøHbíÚµééé;wŽÍÉÉ1¥òKá¶•ÜsÏ=[¶lñ¬áܹs=zôøçŸ¬òè«Ët.'ðW “‚‚‚ììlók]]]rr²|š9"íáÇcís,¤/4úõùçŸûôau|Û•bÛz(ÃV¿&†ÓzÔ^êìÙ³§ÔïY­dÆÇÇ˧§fk§•+ÎÅpkîWÆ‘R‰ùÅ_èL[•*Åv3“Êû÷ïo»âl;„ÞqÈþˆ3`~j›Ýž¥nÊ>¢ \¼¹/¿ü²¡¡¡ªªjÆŒ/¾ø¢Ù¡C‡k+¾ºÜi@3Ô /†'§OŸîÒ¥Ëÿýg|]ºt©øÝòi|­¨¨HLL¼víšO1œÆbõêÕýúõ;pà€Ñ/I‹§ÓŸ ßkÞ:5¤JÅİ•į‰á´õ…ÏÍÍÍËËó¬6??öìÙž‚)fN`WœÎpëïWEEE¢üÝ»wË‘'Ož|ê©§t&Œ­Jƒb»¿‰o¿ýÖÔ€|JÍ:{Kpš¸¡þpHl<â ×íÞGc&JKK“’’–,Yb=¦¤¤dذaQQQr¾øôÓO­ÕÊþÿꫯÆÇÇÇÅÅ}øá‡8#íjðù†ëV5èSWW×§O³;²zþ*&´§­.¿Š 줊;wzúDwß}·ÏJ¬-JÎüa~½pá‚䔕•yæÄÄĸ5(ÄQ½„× 5œ8qÂ̯­­5¥òKáN•ddd9rÄH·´´ˆ[tìØ1[yôÕåNš¡}1¼5j”áÍ]»vmÈ!ß|óÍwÜa„>þøãçŸ^G …Å 0*..ÎÌÌ H¨ÁkÞ*ÒJ¯‰á$‰þÄpZúÂÿöÛo‰‰‰¦›l4÷ûï¿{ ¦˜9]q:í¿_3æûï¿·æ«'Œ“JÅv3wÝu×®]»Ì|©YgoáY 6`àjp:ã_7mÚ”`ž2¼Ž‰/,,lll¬¨¨ÈÍ͵ÖùÎ;ï<ðÀÿý·læ/¿ü2û0@;„Ú:P@¨AAMMÍ3Ï<“””aÈo^D-é+W®xܵkW/ÃÌ<تŠË—/›_ëë룣£}VbmQr 7Sã"Ô CDõ^'Ôà$•_ wªdãÆO?ý´‘Þ°aÃ=÷Üã$¾ºÜi@3Ô /†|ðñ§­x^YYY’˜0a‚áÓÝÿý¦s§é­.]ºxõKrjðš·Š†œ†R=1œ$ÑŸNëÑ/áe,Ö¬Yc¤×­[wß}÷y ¦˜9]q­œá^ˆÒ¨5_=aœTê4(¶û›SC:{ Æ$¡hÏPCAAœ¦Í`²õ˜ÔÔÔÅ‹WTT8Õ™œœ|òäIœ€VÎaÛ+ˆ¤Ô²eË$GòÓÓÓ?îµNÝ•²ÒØØ8sæL±3{÷î-Û‚ydCCCnnnì fÏž-_ÕMˆYøÖ[o%$$ˆ 9mÚ4óÖépZÝâÍÍ™3§¼¼ÜÐFss³ÂŽ{ØóÆyµ*œìpE%:!—P§”B w¡Í—_ 7sÄ×1bDUU•¤ÇŽûÍ7ß´^î4à$­Hè—6œôsúôii]ËÎΗMr yä‘‹/ÊJ´^yîo—5C êîèÌ.§†œ†RgbXÒŸŠPƒ¾ð›7o6ÿÖ=zô¶mÛôC ]q­œámjp¿f¦fL/ØlƒŽ6`ÝjP‡ 0wî\Å1¥¥¥b½ÄÇǧ¤¤x=·Ç ""¢¥¥…P@+ç°íDRjòäÉ•••bGÍ›7Ïzé²»RVÞxã‡~øìÙ³ÕÕÕ>ø y䫯¾:iÒ¤ššÉŸ8qâk¯½¦nbþüù÷ß¿äÿ÷ß3gÎ4o§Õe†\®ßø+YaÇŽ7nïÞ½š“ÄéêbE% 5tèÐÁë@kŽB w7PhZÝ~)Ü3gõêÕo¿ýö/¿ü’””ätžòK]î4àù—ñ… ÌcÊÊÊj¸~ãúóüüüÔÔT£›ò)§ì¼¼<ózõX+Ú’šwìØáÙ/s±+ºcmÂg_ 9 ¥Îİ•Dsb(n ÐþÊ•+Ƴ ±¸®^½êU‰bædÅù5ÜúûÕØ±c‹ŠŠl§¢“**u…¨£GÞ½{·¿Û‚Ï™‰ÏN¨¯$€¡ñ TPPàÓ˜)))1ï‚ô„«2‡m¯ ’RçÏŸ7ÒâÔGFFz­Sw¥¬ˆuwêÔ)#-+Ú<211±¼¼ÜHÿùçŸòUÝ„Õæ-çÕÕÕ½{÷¿Õ-¶ô»ï¾[[[{ùòåï¾û®oß¾ ÷‡~5jÔÁƒ/]º$_'Mšä¤ ã)gÍÍÍò)^‰ñµº’@…Ä3ýé§ŸRÓ•öKáž9â°HÙœœœùóçëû¼Šw0>úhnnî¹sçäq}ºOU(Tê4( Q7lØpûí·ÿòË/R›|JZg5ùœ™ád󷵨˜v„¼ˆ‹‹gÁk£¨ªªKùœ™@¨€8ƒkòòòºuëf=݈M2dÈ#’ìuÌúõë,;ùðáíO—º~ãîÈ—_~¹gÏž=zôøè£5´r{^A¤4pWÊD¬/§«<ó“’’ÔM¤¤¤TVV²º±Ü‚9£™ÿ·C©_ë±ý·¸Ö ñÑ£GÅŽeÛÀðF'À4¶âó "Û »RVÞ|óMãY 555žÏjxíµ×²³³Íü×_]ÝÄ{ï½'‡:uª¥¥å?þ˜6m«›óf±oß¾Þ½{+k ·æPêÔÆzlç-ÎÅOŸ>½¼¼\Î5ÇŽËÌÌ\¸paˆL6À­F'm:}^Ad4pWÊJCCÃÌ™3£££{õêåô Ix¾Â¶‰«W¯æçço¦HKKó¼UœÕM¨¡õ™˜˜X\\Œ*Jµ±Ûs‹s7Ä_ýµqú“3΂ ÌGnbâ°ç `jÀðF'LcÔÐú3 J ot63ùÿ,°´nÖéU¶7:`&£΃pëì9íY*°5° U@šßN¥Ôµ¹(åôäyýFý=—XਠÌ΃(BÂün·R 5̘1ãï¿ÿ–#åSÒ¸$ÀG ™¡"’~8£9 ŠS!ë‚Ê/))6lXTTT¿~ý>ýôS³à²eËŒ×Ù§§§?~ÜËpWÊiW40¥¥¥IIIK–,±cÛteeå”)S䘜œI㕦¸¥œ² 5ø%|ûô+$ôI¨Zoö´çž_XXØØØXQQ‘››kœ+ÑŸ0¢¡†õë׋_9|øpó/ŸAw¥¬äååuëÖÍzä™3g† 2þ|ë1¶Mjï€C¸FQNn`]c)[WW§#RVVÖœ9sÊËËäkss³b3T¨Á)Çó§#GŽ<ùä“=zôðºb?lô©_­:ÔàWµ¶ŠU±Ö¿yófó‘Ñ£GoÛ¶Íg%„ÚúlpÓC ( ìaí`š9;vì0ó·oßnzs:tpúï~ìØ±EEEֆƷwï^‘¢¢¢ §Ø`×®]:¡ýëá«C &§OŸîÚµkXêS¿Zõ îªõT¬¢ˆµþ+W®ÏÁ põêUŸ•p@ôQàY£·rÁ§k¼zõjñÚ:ÔÜÜ|øðáþýû›1LIIùé§Ÿ<½c³Tqqqjjê?þØÔÔtêÔ©éÓ§ù?üðèQ£<ØØØxéÒ%ù:iÒ$[‘Ä%÷Ýwkkk/_¾üÝwßõíÛW'ÔPXXh<åÏ”ÖiÔÂ+B "­”ª¯¯¯««ûì³Ï† –úÔ¯VÊš —OéÚÆ]Të¤XEÛ‘-((˜rƒE‹é´«ž0œ¦0q€§5.›0°?+r–-[f¾œQÜ@3ݺuÉÉÉ:t°uZ·nÝšžžn}½àž={²²²bbb¢££Çoû´CAê‰'v¹ÁÈ‘#¿úê+Pƒ°bÅ q###Õï.T ïj())¹÷Þ{;wîܽ{wqW=àNúÔ¯VÊÝ…‹Ú½^F©_­B±NEl믭­‹‹»xñ¢fw†35¡TÐþ§3”ì €‹p+ í¬\vÀËF ­9£¡ÀÐöº–¾ö­énsQ„±­‹›^`îýf£=Þ7=À§Áf÷¢6O<ü¶¦0õ‹*¯œîÐ F´zÀ€p ÈàÎŒG (øß  ¡B¸žÏj€Àb†> stream xÚµXMo›@½ûWì1®êͲߨ§Vj«FªÔ6¾¥Úⵌ± 8Qúë; ØÈÇ ²ûfæÍÛ™Yb‚ˆ ¯£OÓÑåå#û’J4#!±ôR><•‡¦3tsq½Œ²e4žPA.>þøV¾ü²s›Ú$´åŸßM²3ñøvzuùE¤Á¡dÎ!×kOC¸Â¸Ò—åƒrß™Œ>OGG`ò)€!(\nn šÁÞ"˜ûÝÈ5Á”IxÑõèçˆÔÓòyKZÂð^0±Én=žø’*ÁÀæ[ûÁ/ BtaçQÜ w3;O”~´XÙ‡Aଉ–]LºËÌ¢/ñUú'°iºI{âãt€*ël1˜µ à7»|»ËO :¥Ùš™ÉM0윶itדPöw›™ùù"ëÉ!•Íç±Y´L»ûU>€Ë*φ¡ƒe”ä}ùïñ-)t¥AgTÓÊípkÎ`+x»ïŠ ¥°">ª­gÕŒó rñ›r·‰fðôÊ ÂÇBÐ&3  &„‚Ié `3›Á’Ø{©±a0 …-tö•®³YšdÛ÷ed®°¦^K`'È̆éÃ6ß¾o.Ü$Y… —&-ß`^ÜP~Ûß º»Ñp‡qëÔÇZë23ÞžYµÝAüM˜ÀZÊæ“p@)°¼C:U—.J*× Ù‘lYô&N•VÛ¤Zû¨eØ ^Û€´jÕòxÖg«ÅØ,sW0Œ>Q0çe}£‚9–ž·K_-Ceµi/Oµd§ø%èÉÛá‡ÕÞ]e 6‹ðU”xIÊ·-B7ÖªaêÊ­tDÔï£Ý¾pãxsÅÁ|—„y´I\àñ„ÓŽñÉ<,ˆz²!¶° éÛÏëC¬ÂÞÇJÉæ©žè[m˜m-%îQÌk÷% †àõ̳˗6 Ûä›´º5ÓÜó›â#·G×7鉹’O+Üä„«l·vßIåå÷RF•î‡^é[Òíg }¦I«N:{ÕŸ¸„†kôˆÆ‚³ÎyRµ ³%Æ89ê¶S1 aØóµ|•ùÔÈåJÏ™Õn|$+'XQÚ<ÿ¾²¦æþ%ªž?þ³ªB»0Ú§ûæ|ƒ{ó4(ðìÃÛsgqœi1…·ËúufCç´X ŽÑ¾Bÿô·ý†À)ö ÎOÿ74”q endstream endobj 67 0 obj << /Length 934 /Filter /FlateDecode >> stream xÚÕXKoÛF¾ëWìÑ ªõ¾è©’¢ ´nI 0âÚ",“I¥p}‡»dLYEËbÜœDqvf¿ùfvf¸Ý"‚~›ü:Ÿ\¿ÓYlSh~ƒ¤ÂÊr¤-üjŠæ1úxõa•«d:c’\ýòçïááowãr—.]øûG”î¢õôóüýõ;CƒŠW…aØPÛy[–ksu~˜°•Êäí|²PXC}„Š\¢åýäãg‚b½G kÐ?~å=’”`Æ<¯Ñ‡É_ÒvËŠ–[ÜR,¸AZR å‘$¸¶ˆ6 ¤$Ö’£ÅZð°èHlµA­×Ñæ'/˜y*`WÊ LÒ’³E9)B®–wÅî¾|Ø8ØŽþ”¸ X3¶¯õ5KâéÌV:EƒjíÊ•KËd•Y¾(•Vb‡·ž^tƒÀ7V‹”ö uBõ8g)d åì4ðS¬·öDa¡UzÏÔ# HÖh“»Í&ÊF#ÆGÓÉFFˆ(È_ å9m#8••Ë:Âö]¨ò^3µÜ›ápÞ¥’Còp¥ñÚÕȅƆÑnäi±ö · ˵NWŠkxÉé~’zŸ<CÎåqå]™mÊ$K‹8*£éŒŸâ£?Š/àƒãƒ÷ñÑU¯¼ga1éÜœ~,–âHœu; Ñ¿{ع¦rï:dK4uåx7€úuEò¯kÜ_»ôTBÔ<ܹ‡Mƒcm÷ü˜?•2TDÓyð™!ФôejPgú¦Y±û0óÿ=Ãmß(ÃÂÓ<$+žŽz¬(ó$½ÎôA\êÜl'j ¥KI‡·"(¾ÇÃÑÔ~ؾÆõ4ücöžjÑ·ã7`H”{ ``‚£½û²KÖq#zá°t6űËA@Gš×š3Ð$>³Ø3¬d»¦" ŠàõУlÄ'ÓL>©Æ`ùÔtWa²ãCtõÓÐjƒ\b£Ôñæ+ôΩ°âÀû?v¾Î÷OÚð!¨ÂüÕåÉÍCíÎkÕ²¢ñI}ßiúü…R¡Ù¨_v—K}unê÷÷ÄíëöÄíÑ·göÄí÷é‰êˆØ-³Ø½j½Ø>£1_ºÓŒÒ˜ûƒõ¢Æ¼}^cþ±«ÓQ6y¶tE1úpÒõe9è4Ž~+ t®ÚuWD·îàc¤Æ./ûï@cè-FãÌY÷•+Ãg±Añþv5ÝuÓ-¶DœsÑýÉî d endstream endobj 71 0 obj << /Length 764 /Filter /FlateDecode >> stream xÚíX]oÓ0}ϯðcƒˆçoÇâ $†˜„¬ocª¬Ä[£ui–¤ ñëq>Ú&•×fm7ØÄSÒøÞãsϽ¶oÀ5@à“÷aìœJT‚0¾\@¡(Ê>%ã\ŒÎ§I1Mü€p4zÿõsóòÝ\™Ü¤‘i~~ÑéBÏüËñÙÉiˆ@h­YH`ˆC;]Å­¹ G'̓0U¹xÇÞ‡­ xMÁ:R¢[ïâØŽ™ Á¯ÚòpŒ ¡Â¾ÏÀ¹÷ÍCݰë„E•„ s 9†v ÖD)öÐHg¹¹û8~W‘eJB@€­çW’–~€±öE M SNÊ›rž•É<-ü@Và -çÈjD†þ†’µ,ÞÔ#*‚Îg½mH%g}-ª±¶Y™¸PeÕz´°Ò~¥ØZ%DǃRˆÁRTâ. }m«‡»5¡nMèašP·&tMSäœ{]Ié<6NËÈB´€ÑTçLßUbfñ²zQNMZ&‘.çytS,noÌ}‡>+±Íoér„ëRû{½pX^+y¶0(’ßfÒ¢ÏLz„e™ë_~ÀÙ«M‡5¢d)Y]ÿå}fž1sâq™ÛØG²ÕABX?‹ež¤×¤¶ÇÌrA¹‚`H@&ÅÅ-l‡Ã2Nwg“º°)”JõÀWì+çS÷.@BdOf1¬ìºlWavØþœ'±(ÑÏN_-K³öxÞ•çâî¶uÐëØj(j{0.øÀ¦:gíJ ˜„!Ù(é¾d\A¹Yc rKÚµ[¸–õ3í{eÎv†‘'Ò™ïÒ™=¤3;Lç½ZGñWÚ¤í%qô6‰?Y›´Ù"Iòõ¾¶Ök£í’áŽo?üØ8^lŠ_x;Wïw¼×Éå&³…ÂØJ¡Ë" !g:;ý$6Q~Ÿ•:†#dïž%ÛvBØ-õ‘‰³CŠlë¿à.Ïjx…´S“FuL™Î× Üê6Êu¹ÅTˆís·õçÑ( endstream endobj 75 0 obj << /Length 765 /Filter /FlateDecode >> stream xÚíXKoÚ@¾ûWìªz³¶÷eõÔJI•¨•Ú†[Y[X+`ðƒTô×w¼¸` „$­zòc;óÍçYt‡úè|è9g"D!¹ÏQ/FŒcH„pê ÐMçz˜äëúŒtÞ¹\Ü|Ó±ÎuÚ׋ÇÏ*©Q÷¶wuv! ’à•C*},= Ë_Ô…ìœ-.> +ç¼çdŽ:y«À0`¨?vnn €ì LC‰~Í1bÁ~Àá~„®¯i¦Ò–´˜‡á½‰$IË®ëŸNaŒÔ4×ÓrЦ*/#5t]ÎAþ0RƒÑ¢Rbœ!× ooŒ„áPHÔx=Té`¤ß¡K–¾fcMl#U¤,k™ d‡*DZ&ý{]VáZ›˜* ÈÊ{·ˆ,  ߯¹%@cu¯Û׌Ð2]; 5+‡:XU9É(ÃVP™%¨….-XGÛ1¥»0å{cj6i–ó©nUéOÒ¢VêUnT8ÂÑ-Mü˜Åu¤ÞÕ/’_:ªƒæH§‡"ç“q'# ¬¤'‚·…"•Ò2±®up…À‚„-ßd…E•ȉ R¹NÕX7€¦ž) 쀾ÓåŠÎ&È®¼žMÂ| T%Zºj+ŒhÆäѤ^H1³Ü0ˆBWyZ..?©b)¥ÏxXû –œÛÓøq·&ï5þHL7?í­påµDžö+m…ëqŸÖp­8xh—͵‚ñÃóèÎXp¦PÚ­š2å¤îo!M»í1 +°‚øÈ†õ ó$žÿ=Ó\°kÚäÇLðmë1ºžw Ó§Ø]šQH‰µ‚=«ÎWÑ0&¼q³ÇÆü{=ß“`Ñ6Ïnp 6+Ô>àXrØœEÝÏçÓò…ö‡ç™YÁÌnV[ê±GÓÊö:‘> stream xÚíXÛNÛ@}÷Wì#©êe×{µúÔJPZ©-y£Èr“ ±HlãK*úõ_b’ UŸ²ñÌŽÏÌŸ› KDÐGçÃÐ9ò±/=‰†$$–>Cʇ_EÑpŒÎΦQ>®'ÈÁû/'Íâ›™˜ÌÄ#ÓüýÆe8\ O5AJVäÚÚj¸]K»Ò‡ÍÇýj‹s4t® >Ñ[°‘ 4š;çÁvŠæ¾F?kÏ9”`IXÏЙóÕ!Ý´|ÞI‹ù s*ƒ¡“Væ1¸’ƒ0ÍÌõÛ Dq)x ѸFqÁ¼ ¨M\aíQ°cÅÛHojƒÀ¾R¨sÙ7©ùN}WÛ]æs,¼È—nŸ·x*Á¥)‚"]0+ VˆCZ"ª` Ê*¤¸†î˜†ñxfš¼Üú›BÈM×ʬà>¬-ëGÑ^n’éTƒS9£v嘗´WË2ÊÌ8H.“;ª²Ï#«Ò¥“¬“´ˆ’8¸¾|y2[ײÛÖ‚a–„É,¼Ì»D’æ©\k”uÂñÛ{ ·×¢ökP>‘kèÖy²}üõQn“¦%•y­Q¯›Êü±\¦a–›Ê²g >>ùtT[=km÷NÛxL`-åŸê»2÷ N³Ö¢÷Û½åÚ³¿\{ûÌ„ n”òÿ=cQ­<¬Drwµþé– ²˜š¥°H2‹çùƾ5E­ÇZ å½ZÄI¯Ûô¸õMìv‘+ÁlHùQNÚ¤VýÙ‰G¿ÌxÎLüFö>ËŸn®ƒõƒ²,’`ÍŒÅ\ú|xµr©ÝÛl»ºh‡Bè8œ›5Ñò0¯w[ ?en Còf‹àÊÜüU/$Ùh’” 0”íyh[96£ì&-Ò= Å·”ðÎ{õí.„z-Î=¡/ú1/Ú&Ñ")‹NÄÞCåiÒÅ–¥ˆâJlKlÉ@sÛÖ½c€Äºm¸ê ím/ÃTzÏ$¬Í~+%×+¹‘Ór¤¹}eX}WêûLÅ=ìþ˜¯T¿…Ž endstream endobj 83 0 obj << /Length 906 /Filter /FlateDecode >> stream xÚÕX[o›0~ϯðc2-® ¶1ÚÓ&­Ó*MÚÖ¼uUDÁm¢$$`Úiûõ;\B!!†¦¤]ŸB8>ç|çöÙ˜ ;DЗÁ§ÉàìÜq‘‹]a 4¹E\`áÚÈqáסh «áål®góÑØâdøñû×ü᧺U± }•ÿýæ…÷Þrt=¹8;—I0(ìÔ “–T‚»Ì–„厞å?sS•ÁçÉ PXC}„Š6GþjpuMP² D0s%ú­\!N ¶lÏKt9ø1 Õ°\Ö§ÞgHæa2Sb2ÔY€SOOý™òS?ôV—K@ö‹pR$"Âá‚£1ųsKï2 Ç®#QåõÌ ƒ¥zŸ ÇÌÁÒ¢ 8¯æ܆t4àËÓ±ŠrÒaé°Ñ¹}›ìXV]Ëb¬¼åj4–¬%FÖ#k‹Q¼fŒŠçjª½eòÊØ¸ÔŸyqöÞr±”²^Œj±¼"HÞ"¥XBµbèù_5M2y)n?µ¹TaµRb^Ú.ð>¬çäZÔë°aލmÕ*’ÉǹOWü3"0s„!µœÕ`,âÇë8myz(-¹ÅöæÞØ5Â0Ož§‹B ŽÎzhžõ}cïpcï˜A‚ISëCë”ùÒ*é–¯¶²òµ7—[ïG±Ï&^ûJkPö¦¨§¨‡¿u’/*©ÌZh§ÆI<ï ÐlètQ¹¦5pÜX°sm6^œT§JÌLnv L¤´ôZ\î§7÷óe°Ž « õg¯Œ¬¹ŒÅkШeØÂŒÛcË(n·ù{‹L8Î>Äqö38ÎÜ-×!W9ÅíSú¦8ã–М~€V´9–B4&+£ X¹“ƒÎd™æ $Ì.9xFˆÁÌi a ´çñåÆÓú÷:Ú¦­q—L³—uO§iës‡ìt87spÔ‘ƒÛ*~$G½rðA¢Dw²ì{úßYFO#ËSŸŸD–âX²<0îÑ+Ž{tÁk±ò:~|dØ·¦³LìÈ—8s%‹Dç³ñ" êvºTj˜Lb;ÓÜßÊÀÇãvÓ86v\·v>/³’*d`Kì2ÑÏ)¸±™Áý‹6s-W¶fÐhÛ• ;\H§Þ&ÿÒ }ܲµ±f;”è?¢_"+¢+”¨¯õJyÝt¯Í,ìv̵ö?›‚© endstream endobj 87 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚåX[oÚ0~çWø¦ÅµÛ±µ§Mj§V›´­¼uUäQC’%¡S÷ëç\ ñÊeH{ øŸ|þÎ5F`øØû0ì]\yH(9á`8ŒC.]àIóô0à®; ói8pCý÷_®ëßôXg:éúïgÏU4¸Þ\\ „1ÈÝÒ  ,Ìë*[Ò¨{¢Q?•å–Þå°÷£‡ø‚Ùè20šõîîŒì H¥?+Í`Aâró;·½¯=Ô>–¤ŽÅ04ë­Sù*ñÀa¡~þ²â«y1ÕqŽT‘d‡s#ÿŽj¸0 kNÆ8†uk£o* ƒÒ µ‡kË[ôM—ò”@‰èkîä=]Z endstream endobj 92 0 obj << /Length 805 /Filter /FlateDecode >> stream xÚåX]o›0}çWø1™×øíi“Öi•&mkÞº 1pTJZ «º_¿ ¦ d”Цi3í) ¾>>>çúú‚fˆ O·©st¬<äaOR‰¦HH,=†”ŸÊEÓNçq>Ç*Èèý×ÏöËwsa2“†Æþü¤Ë ŸOOŽŽ5A%+¹RX3 ËUX.x¥GGöƒr¯œã|œ:7Ž A¹kf ^9gçE0v‚æžF·Uä.Á”Iøž Sç›Cšûòxc_ÌS˜»)ábhìËòÔO$!£t™·%™¸(„ i^ؘpdUˆX qXñðM5 °§j<¾ˆMY܉‚çÌm£/ã´`Ô/ìl†ì°V7aãD¸ï,,'V˜nkBFùú‰_ÌòÌ\'.Ñ0X¤ö¹dšb!Åó Óà´Ƃ³š‹ÌåfÖÍ… â2L—8¼4ÅKqëË¥è&‰…™ì¹HÔ¹Çá$R·G‹þ3pŸøÔÃZod¨]¾o À&îw±ÞÜ|ÿ6uÚ¯†·æ[bÒmÉÖ+ª_ÇñDуQvKuaÝÕ… «.ÿ‚oý‡á6‹ ¸f\—?C¡êrL˜c;¡GAô€×ÞUèeè†-œ`Eép[üŸq‘YœÎêRúø³º¯«.’`–ï$aIïI¾ç+Hƒúƒò­«óZ½tWå̬¼'¥<øb¾›vM5v×myŸrôàO,âßãNìVízDÛ2s¾Ï–y‹›—bÑ•G°¼&±I‹ÌÉÕ+äQÅax›Êjwê»™Çw<ýYiQô=ýNûY‚ ñ^¯‡Þ>±³r¿†dk)Û¶õzÑ­Yn²_«Þ³…)žŒi}hš $zð¿åe1‡ùq ¸j<ù: ›,ü Šª'‹,þñ"-[9K…ñÊ ÜÝ•ý{h*Z<Û'´ëþ¢âîzW(4¼¶ÁOk…ÿò%¼Ì—P™|áv®Gùö”Ks÷ȶfô7t–„-ó`fY¯^Æu½Ûã{„?åÕÞ~S  endstream endobj 96 0 obj << /Length 760 /Filter /FlateDecode >> stream xÚÝXßo›0~ç¯ðc;-®ÛhO›´N«4i[óÖUÈ·A%d DS÷×ÏØBJZÒ¬Ûß}Ü}÷ÝÙk€À‡àÝ489•!a(ˆÓ+À!2´W‰Á4Gç³´˜¥ÇÂÑÑÛÏýÍWse–&ÿùIç+_NÏNNÊ Z2)¡¢Ä¾Îaalí¥::ñÂÂÊ'x? ~Ø!€ïb Ö“ƒx\\"ص3€ øå,ç€c ö>çÁ—µó Y+/JÈ0’ch\,ñL/«·B¥˜`(õk¯Ü‡¡T õ8Ñ¥~í–&”C%„u²€œûå"ým¢òx"r¦™É¿!ŽßÔ AIH×%Í­=FÄzŽçH¯Ê™ÉË4Öåbé$‰â›b5ÊÛÆC[LT¥¦Š@.¸ŸõÇ_?žé<ÉL³•!¸ÎyC‘cÿ®N4ÞÕ.¢ãrcnݪàPrö™²M¦õ¨#‘ö)Å=ÄTX³U¡¯M÷å›VޣТ^³ÞRo§êï”zi ´˜GÅê{Ã'¥ÌÅ»œo(ÀUrˆ~GÖïFÆ©ú~ž|WžÔù¦Ô\ÌR!†SQWyBÑŽ¦~Ö¢ö&ûä¦ö9µØa˜@Æé#…b-–éo]¦‹¼j¯CJDŒ‘%v*¬ÁC(ÓÉÝÜšp e¨L¯ÓƒÖæÔÖc*F{'˜‹µYÞÉšGµÃn‹ÜÚ£1/gc‡†›ìíyv¾C—{c§Ú_Åð¾ î@767¥ gìè83z{_³Ý}PéÑrÍRS™pöâ†úÖSÐ=U5pùì]Vu/ºª€¢Â”öÑÈx‘Í µaßm¦tˆ|rc7S²4:³c”ü÷²[e9„ð}ȲLçfÀ¦õ°]vøhâ,u—¾¼¿°ãºt|ƒ® G׃È9¼`VícÎú°²{ÂWIµ™AþÛ͘y©²Y3ã•ÓIxý-ªïÓ#0Dì)_¶þo=6 endstream endobj 100 0 obj << /Length 815 /Filter /FlateDecode >> stream xÚíX]o›0}çWø1™×ß6ÚÓ&µS«MÚÖ¼u¢‰Ó HtjýŒ!´$!dYSiO|øúúœãëkû"p øì|:'gÒ.t`8\@áR ]ó” Çàªw9 ÒiÐŽz¿/?ôD':éâó«-üYÿzxqr¦PÆ¡ ¹C&%T”˜á¬/LŒ½T½“âA˜›÷qN‡Î½ƒøbzr0 «kƦí È\~YËpŒ ¡Â¼ÏÀ¥óÝAU^.kàÅ14ÿ-” ÊúŒB½Ô2ôüE6ÕQŒü,N¼I‡Þ$˜†T£Ÿˆ£R PE  0”Œ.ßÙ]©@å÷ÔÆ3ýÞ6˜Ñƒ`ÓÍ á¼ª°ç§¶FÒt¦¸pÍš]—¿kËŒâ¹õ,ÙœEN({œ—hPÝjGii7šú‰5JÎÖ`‘U,¹ëȵ (Éb§å(¢ð·:óÒÅÍ~4Ê£§¼åÝ (jì’Ã{®ÏL¦ìTi(XÕôQQÜ0Wô™ûIª-ÚÍÒlŽœ­Òœ9µ­Ä…J©6>'ÓÒåP q _«^Ëèš'˵pÐÀjTo³ÏÖê½ ÔŠ(”!( Ù-¤í[ñ?¢:DT¢ÃøA{£»tCõškÿ@°\–é“·L&õô£Z¼Å•žêûhÞh»Í¾ö7î¯ C/+F¤Pº­2ÅŠXu9£â¼ØQ¡b1šPf‡ªÍü3ÝVü~]¬¦ÇÖ¾ij;Ï–iš8+t ½:£[ˆëéË“yû|cnH9ið¤½êàæ ÿW´Î¯ÔºC€Õ§'ÇçåJýVŸ»ÝŽh«9È_]¯½í"«9®Í£¼mÓhóLÄö½?¦Ç}¬§6‹³sÈmÙ­óeU`y8^³î ã ¿F™³µ³P΀µØwñW1)9Û1$²¸¬ä0uŒñ°Oi¦U$l-ÍlÌ>q<ùYG/JM¨IÞö¶rÞ›öîø,¾ ¢þ@’ÃnëûíyíaÌý™aU®lª~2]ĺ?)Úܱ endstream endobj 104 0 obj << /Length 1075 /Filter /FlateDecode >> stream xÚÕY[s£6~÷¯ÐcÒ©¡bö©Ùtv§i¿¥†ÅrÌËÅ­÷×ï'ÄàÄ´éKì éÓw޾s&èôËìçÅìêÚõ‡=I%Z¬Xz ¹|ºZ,ÑíÅÍ:*ÖÑåœ rñÓïŸì—?õJç: µý÷· ©‚øònñùêZ¤P2È]+Fa»Ëa0ßUWöƒrϬ™}\̾ΘDóÈÂJÂÍìöŽ %Œ}FsO¡¿ë™$‚)“ð=F7³?f¤k—Ç;v1ÏÅÜȆšK˜&Ey9—„\„ë 7DØÍìrf§ýPì¹.ê<ªrý- 6ú/"œõœ9w(æ‚ÁrØE;1J`‡Pئ¨=雥i}Ó~Qæá&»œ» Fˆ4¾6hLQ,¤°\øS. u¯ƒdëàpêr2•÷›Ú<Îò( £,ˆ›\cgÝaØ™rЙK?k‡Žy’õ{’ô¤…õˇòD½ÀŠ7¸o2-†«{x"ä{Ö_š•Qš¼Ê¶½<Qî2ˆ9 ó(ŸÈàF§{+©‡•Rc¤· âª{€Ì•XÔK ãH'åÃ2ÔÆBð³œ6€£¾€ýxÖâ6+:5½¢{Ä&ô^t›_4Ó_FSìÒíº]),8;ÝíVXœNI}Â:Žy\Xr BYŸbv=¯{²¯,õ*¨âÒ/vE©7«(Öý^¡’aâ°ñ‚:¤ó›P:_F¹Ë4ßõ'ÿ‰öÄ¿a@¬¬òtã[Þ».6@öô&ÄXhº$óOš|¯?ýúñÄÒ²ZÕ•áz¥<,%AjâŸ1æ';fÃq¨£ EþB(òCÿ¬uøàou^@ÒQ:U{t”¹þÚ‚¾¢32œŠjcä*§í„š†ùAïNljaÅ‘†¹¶ÉP‡iUÜ7È ­Díec±©Ô½Sß&§(9µ0W½;Jbô8VÙŸuTmk\µ· î`ÅŸ$ªfãºMk‡ âP–omRü¹ªüú/€@ ×&ƒ“0‡ð¸™¤¶\̵¨uGx  AÇŸya°É‘ˆæDbîÊQ•§Á}}8ûE•ei^Ú»ð¾Ú÷}t”­uî‰SØμó®b‚ýr¼µJ«dir˜Áå#q‡¨6mÏ>Ú;W„ñŽè•·Å‡„SK»+©3Èzd1±¬¨2à²Ñж¨žß¡¼UÐ5ìP7uÄÕ9—´I$gRÇA„HùVÐ<óöä?ít¦.Mý}T‘[~7të¼iݸËÊÔ¶™ K%{ÜÆVRöez»xî05mÃù~:=U³+•í“ìRzx¸Û4Z6iòà¨ü0NóÌspÊ1'£.7aùÏžÉþ€¾8Åá¯ù=á;W“O endstream endobj 108 0 obj << /Length 668 /Filter /FlateDecode >> stream xÚíXMÚ0½çWøU1þŽ­žZ©[u¥Jmá¶]¡ˆ„%*J-ýõœ„ („°Ùl9ì)Á3~óñžÇ(= ‚>9†NÿÆ5È`£˜Bà ’ +ÑkàéR4ôÑ]g0 ãiØí1I:ï¿~N_¾“`Dã ýùÅ‹ÖÞ¬{?¼íßh‚4*¾®‹5gÎbQþ®îôÓf·Çù8t~9œ¢90Ø)ÑxîÜÝäƒí,ŒF¿­çIJ0ã Þghà|sH±.#Jê’úM%Œ’nFH'¶ŽÆ«í2YŒüÀ¾t{†€í‘dP´ïF‚ ,ˆF=Š]ÁSÀ7Ö"±q5*,“?o­¥§ VJÀHBÊ̺ˆb¥ Òxê­¬£’Ø•"ÅÇØ.*,‡QíÂ"§‡Ðqø7eØa4 2_r”@•¬µ>Œš†ÍÜ †Å:É Š5TšBªƒÀ¶O¹ùl›R„nÓw)2×Ë=´£—‚m2ÃM б û4K©jx¼£º×Öþtí¿Ç”}Þ "žòuçA=®‹ endstream endobj 112 0 obj << /Length 669 /Filter /FlateDecode >> stream xÚíXMOÛ@½ûWì1Aõ²ßê©•JU¤JmÉ e9 ±ޱTô×w²v‚  "‚–œìì¼};ûæÍÚ1A爠¯ÁçQ° -²Ø*¦Ðè I…•åH[¸jŠFct<8š¤å$†L’Á§ßê›_îÌ.K\ýó{œÍãéðtt¸`2@¨ø’Ph g°œç¢ðÚ öë v9'ø2 ® ‚èM fJ”\ǧ!vˆÖ ßy‰$%˜q÷Stü H{_V´öÅ­Æ‚J¤%Åð¹$“¸X®Ž˜ÅÆR¬¯c{{>B-%jfóꃅ‚b£aƒñÑ2ýã¢ÊÇ×a˜Û,XsJlµA­a œºì„Hú±fæÆ`¹IfÕ0¤„2(}A¢±KŠë¼ŠÒÅ<Ç•‹\uC=Ät¤)Ü’“†¥’}Ò™ÄÙxêV›„ê1z;“š6ºp×£$ÖRÜìÛÌ0£¡Õ0ÊW´ªµA©l^ÆçM äŽ œE Òo¸–̲²­ËÜN”w'Ú §‹®> stream xÚíX[oÓ0~ϯðcƒˆçøñC !ëÛ˜ª,qרmÚ9YÑøõœÄ¡KGÖf£Õ˜èSÜsó9ßù죚 +DÐïÝÐ;9UŠp$©DÃ1ˈ!ÁW…h˜¢óÁÙ$+&™PAo¿|t‹ofl¬Éã~~Žó›xæ_ ?œj‚4”¬ ȕšQØ®ŽJ°Wzpâ>”G•÷~è]{!Þå@ÁS dî_”‚î"˜Gý¨-çH„S&a=CgÞW´ëŠx«.)ÌC”1(ê\’E^”~ $“ØV‰ )°!Vœ9³WµBàH)ԧƾ®5) ÁB á´EöÓŒšà`93ùw"Â7Îq‚¥›åQ\ä¡~…“€;­¤£išXsíºRB8Ò4¦ŠÉ4ÅB —8¿Ÿ¸F-ñ$ÎÓ™irçÐz/÷]¸ðn\øV\äq±—ÆÚ…õEw ú‘a{BæŸcŒ½,â1Q¥”i37åd‘¦q×q¤ia³Œ.Çkæ.6[ùA$li£R^Ö,Èù‚qé3¬ÅÖögÀ%K¦¦|F¾°>°—yqUÞ.a3¹Í"$úâK–—UÍtleà3Žof娈geý¬dÉã¹Ù‚Ê:"°Öz3¢ Ù˜·UÝmðÖÅ8ðˆª÷u=Nìí²\:[²hõjjnÏõEûlõ‡¹ìjwaÙjqS®ãL`-åãNÇŽ òž‡#Ëált£ÐUˆ,ÊzWFÉe2šÇIŸkgÏ'l_lx}ëÆÌ‘±Ý8%±¨}·7n IÛ¯f`A‡‰%xl» ÿªOK;®ÄyÙ³a-‡:·¥Ò³&U Ž­òb^û·¶X-²´ùç𻇋¼öbsmãèk,8ÛÉ û´~ÍëzäG„?åmðÁÎZ endstream endobj 121 0 obj << /Length 826 /Filter /FlateDecode >> stream xÚíXMoÚ@½ûW쪲Y¯÷Ëê©•’*Q+µ ·4²\³+ØÛ¤J}Ç16°¡HíƒwföÍÛ·³Ãtúl|gÒF6¶h8F\`a[HÚð”&ŽÐmïfâÇ¿? œô>~»Ì¿\뱎tèéüçW7\¸ÓþÝðêìB¤  °Ò€LJ¬, Óe±L öRõÎòevêcœGÃ#‚Ì% žyq{GÐÆ®ÁÌVèWf nL-ß§èÆønj^6«äeÙ3“#ÉM oÆI éy7J Á±ä L,™•›½Ë8¶¥D•×óhœpÃä}f10j™à Spž[Åþoí“T<¦:ÌHݼÄAm¬”Êq°U U^tä?éQ䆣YP ±8VBlFRó,?7?®Œ`Iiá+ª pÜ84ûÎ Bœ¿¸óHÏçn¡MBa‚‘B2iDKQÌß@©ªR:Éó\7¢ÛŽ5o»âu:t½q÷‰V´Ã¾sôsqœœÔÞ+î¶þñ‰­cwØ´¬¯I;û åÍæÏ§øGaÍÃ]$&¾ç&³½3ŸñÎ&íèK½g«kµ*´»Z]Þâz$>òõÈ60#¯Dc¢Ã|Õ]Í…“ŠuyCñ7 ÊL·+ŠVzI¯¤©¼¡lºðdÛ„½æ¾óu(ÌÀ endstream endobj 125 0 obj << /Length 769 /Filter /FlateDecode >> stream xÚݘßo›0Çßù+ü˜L‹ëßíi“Ú©Õ&mkÞº ¡à4¨„f@Zmý é’„¦Kû‚¹;î>úžmLÐ "è³ói蜜¹ò°§˜BÃ1’ +#׃«KÑ0DW½ËI”M¢þ€IÒûøí¼üóÃŒMj’‘)o¿É<ˆû×Ë“3M†€Š…ëbÍ¼ÎÆ¢ì]Ý;)/Lx…s:t~9Œ¢‹xJ4š:W×…ðì,<¬åIJ0ã þÇèÒùîf]žXQ—¤Æm*Q’÷”0Bz™­Ð‡rnÃQjf³ Íá.Ì£©ñ3vL€ÙO"I’F\3,•DŠ]ÁË ïì‰=W£Æð$HÂØ¼·ˆ0 n‹”MÆ~%´?Pð®¥\JG²ì2ºK²¼4M‚Ôš(‰])ÊŒÄÓŒ\Ô®ªƒ’è‡*-ʰ|ù%mÆqp“•ˆ¸jA$V#mˆÔÞˆlö…©M³Q+»ŒíVëÉý[ó»?úèÄP¹é­ÓA™MåÔx>K*ÐXpºQj •ÌËk`¾ºCøj.{tGrä–Ýñòš™CúœùU‹Ø\»¶üdÆÆ;¨ ÎοœÚ§ÌÃZëmŽ'U<.±Vj=¼ÂÈGÛ­a—ÊïÚF³»Ù<rS çÑèÖäÅpI x©\Ž÷„°%ÕïbÚЙ‹:ë*­§òƒ6Ñ!uõ/Ç®PR„öPËî&&›c®f¢Žª×`ïjü<Šãr~Vol·¨¯ë"–÷æuËìù[/3é½I«•¼éðm¸–Åu–MLÍ¿ :/W6Çü÷ÌT{ úv5Õåö«ƒ…puÝ”›«°´Î»°„©>ž¾U¹ÙâÖÊM킨ї‹]“hß5Ñ׌®Êèq!=¶‰ ‡ßÅI eG÷‰ØF©¥Çëúö;ÛûjIÉý9÷à þÏSË”ZTV¶A«YôÇÔ£µyl’µKµÚ†jƒèóÚ<ž3®:¶ {DìsjùC¦Å‘ endstream endobj 129 0 obj << /Length 635 /Filter /FlateDecode >> stream xÚí˜Ko›@Çï|Š=ÚQ½Þ÷C=µRS5R¥¶á–F²IŒê0•ûé;<ì5¤¢œ€ÙÿÎ0¿Vt‹zï¼ué¹¶Èb«˜Bî ’ +Ë‘¶pÕ¹ t5º\ñ2O˜$£7Ÿ>7_ü?òù_<~ô·_»ÓsCAÅ3A¡56œÁr¹µà¯ÍhZ\˜°Ùçë|w(8DÇÀ`¦Dó;çêš Ø.ÁÂô#÷¼C’̸‚ûºt>;¤š—•¼¸ÕXP‰´¤ •¼f^ÒñD2‚tÖQ®½(y•…Z þRæK/ÊÇ™ÅÆ0b-J±³³ÜRºW ›Ø^âŠA±ü¡nüôgInß›+ʹAb«MîÊ¿I_òÜ,õƒ0O(ab\ä ™FÛu6ʳQ e•3n–Jv‰bé…‹•¿Ë JÍh¹¶zð’¿ùÛÜGI¬¥(”ù¡²F•a˜QÊjå´&¥¬fඉ½[¿{Áx}B|'\®Ê%6JÕ*_8á͇Éý&šl‚CµÀ1ó“í¶·U-„4¿Ðã„È'@xq¶+ižp}IïøtÚW·¨¨T0Ug SªÉ0Å{0Õ\ͦÚÎ,HÁ@Å#ª¹P½ˆRÝPif:H»¢’m?ýèÁê3ëAºkÚü{`;mǧÐ;Õ¢ת[¿ësý(=¸×zðf 'Ç.\ŸzøkçºYù×ê¯ýx ŸÒƒôˆÉE÷aÖžÓ_v×À»k÷íìï±¾/[qð­¸ÿR÷kE0l‰8åÏÊ/‚Äæ endstream endobj 133 0 obj << /Length 852 /Filter /FlateDecode >> stream xÚÕX]o›0}çWø1©×øíi“Ú©Õ&mkÞº*BÄiP É€lê~ýŒ )É€ÀÒ´éS>îõáÜëãcccçüRxÀƒÇŒg€qÈ=„§?… ÆSp;¸™‡é<Ž0Cƒ_¯ì—ïj¦ÊþüâÇk?Þ¯Ï/%Rr’R! $X?Î`a¤ó…œÛL½|Œs1v~:®NBÀ}â€õH‚…s{‡ÀTÇ®‚Ô“à·É\æ"ˆ ×ß#pã|sPµ.Vê"ž€Ôe@0ê€á’†Ô$Ž8Bƒ0ŽTü.ç¢F®NbÌfs?1ÿcJ)u Z œ™H‘^ ,×™QJJ¶!‹çñM¸j zBî@jŠ?sß[d"%d»Ðv®&~»Ã£º²Ôþ£§* ƒ•­üD×ìåEk0TLnŽH$†Œ³.dæ~O54ÏÝ­ÿ^e“õ¨ÝòT?§×¤ƒŠQñ*=fKRâöS†°ØÛ™—?øµt¦Ìn_ª«££bòÍÑ*ð¨z¹¼ú|Ѹ?ÕcÎæ-o[Ç}}Í?NÃLM‹—)|r’Ñ\ÞÖdÉ¿''þœ%S?ó æBvW]õÎÈ&ïìûuÝïlj@ám‘*g,I–‰žZ³íaN riwåî;ªüZ†Óâ–¨úxýz£üœ’Ǽ?jV­!±\g«ufÏÒâ%ˆ4uÃxɬäxÄ£Èaªž-“…o—ÕæŠ´îÆ•bè!ú?®…žë“ endstream endobj 137 0 obj << /Length 959 /Filter /FlateDecode >> stream xÚíXKoÓ@¾çWì±Ed»ï‡8D$¹•ʲœMmÕ±ƒ½¡*¿žõÚiâØVIœ’xÇ3ß|óíÎd¸¼›¼™M..¥jA˜-Ph ¤vŸƒÙ\}‹“2NΧ„£³×Ÿß×_¾š…)L™úç§0[‡éùõìÃÅ¥B@9‡‚V™”PQâÂy_;{©Î.êÂtõÎäílòc‚øqor-'W×ÌÝÚ€ Ó ÜyË%àAB…ûž‚o“/ÔÎK³V^TKÈ0’cè<áwÄñ« ˜R† $L±³à¼6ù™'óó©•ž…ÀE^¥±çSL{î\ †¡ÊUrÁ(Yè…_áPKZã0›§æež9šÞŽåYéâTÑ£8,¼¡àPr¶Ç½l»wHK[´2d˜@Æéè ƒ|mWkkïW®Èœ)WQ$Y“in¨,Þ#Ò]½$Ù"'Áªðë’ ¦ÝˆéÈê\¾ÿøÖ¯ •Rc|.âÆåP ±í¯†„e†k&|N>¥¿áãu\±vÒÑï³›1DÇ6YšÀe¬Ø#7&3E˜&¿LUë#øøKy m^Ú½y›ÇvhßîuO»˜§Pê-êwiÉò;wtœhDPˆ0/’v}”‚œz]PÅ€½§ YùCj¯EŸm0­©:‡h°vqÁ€LŽRáªÁ+Ý3º_€ šÊÔµc‰ô :A´EHdH ;ñ2Œ‚圷s|î FÇ”ûÖÜ÷pWzYÕÎej²ÚmWyB†I6A’íØp°‰:¾¹¦‡e|…Åu[ÄR@®Æ•·ŒC|Êéç}ÇÔ— Áúæ ŽóÒ:Ë`ná:µÁ"IÝÇÔ3´’ÝéµM=¯ö/ v¼Â»·ùoÏFÎ|@’5£Ý5[¸Q?Í£0-Mñ3ñÿæ†Úè‘í~÷ Ì¡éèx&L—5)˜C¬ÿüqœZ] úqãÂü{ZžW¶UJ¦ðˆÿqÁšâyõZǬ•:¥'¦gX—¦8­,w›Hõ/ÓM8v‚¸LÈ‹eh{¨q¿µ;á%YbǤ¾á½×øìíßšA>*üÃÎÆHEp—Ø8X…6.ÝLC‚§©Y³™8q–÷¥5ËhqÓ;Dô§ÝÎW±‘`'_:”ïA¶€½µ~^:Úù±EèÑ¢¬Ôž\´ÛyD±‰nƒ,÷×ñêÈ7µ;sAa~ø7nà».ô±§Üçÿ[kVÀ endstream endobj 142 0 obj << /Length 773 /Filter /FlateDecode >> stream xÚÝX[OÛ0~ϯðc;­Æw;ÚÓ&ÁÚ¤ úÆP%†FmÓ¦î×ϱC´R‡^ñ”Ëñù|Îw>;Aà ð5ø2ŽNdB "ÀøpEH ÍUb0NÁåàb’U“l8" >ÿ8u7çúZ—:O´{üçwñlx5>;:Q((hȤ„Š3Å"ÄŒ—jpä.„…Op<nl!€ÿÅ@Œ'É<¸¼B 5¶3€ ømGÎÇ*Ìý \?ÔÍ+d¼h(!ÃHŽ¡1tòŠâ*ÇÑ@h`Ò™¦I©‹".ë_ˆãOMp`D‚’0ÂÆ™sçåõp„1~•2¾Q²(–Q’ÇsÃKˆŒÍÀ –À‹*¹à JÖÆñÁZ8 ¥ד8Ogú£  ~Áñ»àòŒ5¹ÖY2ÕõÆ\…?×Rdzùp¤˜'Yº>Yúv’õ6_XÁ¿Nao{çÚCÄ [”î=A‡­éÉé·ck%!TJõÁ¼ž´x”C%„‡‹¸êM[3´¿šìèíÅT”‹DWUcQ’’؃”üKlª—Ö*8”œ=Q@Ù- ñhÕæ-Åkè²Sëå]ßho y…äåë©ÅÁ°‚Œâ>‹£ÒyZêäþÁtÀõ‘,òªå#™Äå3™¶y×»¡gy×ñø*û££?Ëg:_[ÊÕÌÝðPC7u;¼cXÜÕɆÊDµnòƾ2{Åa`M˜Ý­ä+è^ªˆ&Ö._K´üÖÊè…þn•áo³õ´®œlxCÃ^7>ÝvĤÖÓ·•˜VÅi™Æ5=ͲúÖbv‰^„ï{—ØÓɨa;™é¸4\7:{5¶·:v¸è3צ]½@“zŽR|-g³\\Vös§}KÚ|¯µœ¨7·zlpõ²ÐÎaõxðË«'‰ôªËî,=Õõ_¿bšËjGR*]ÞëÒQCÅ»Yx»%vZ×>æS”Ë¢>à»ð¾ú)µî#0Dl›_\ŠU(ˆ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 802 /Length 1267 /Filter /FlateDecode >> stream xÚÍXMOG½Ï¯¨£9d¦««»º[B–01R¬ ààqÀËØlBv­ÝE"ÿ>¯ Cœ‘VêÞ™úz¯ªkJÍä(’8RRG…Š'vø1±à‡%`)Ä‘8á]&Ÿ˜<“p¬¼'‰™X)@ÁcI…|¦˜ Ií} ÄÞä D"C -QbJ% ks‰‡ÁÜÂ\çjÏ5;ÂAà?"Lš(Àw‘"þ3%ç*"W!aM¢ àè)Fò/ƒ­jJ^$Ä$3¢&`ˆ|€uh@ÚUjÐp`&xò ê6ò¶fK)”à¦D K&©öމø’+<)xÀPaJ"@Q UQõ”¡Ÿ‚G’AB”œ…²ƒ rêªA˜ T€Œ¡"ƒ‡pa‚4iNÀ<;¼1(!Ô ÀkÉFkÁ¤¹b‡ vP- ‘¡JWàÅ%«B‘Q ìL!™È(60Ψœˆ±AmBËuÄŠ/ª·'F¿Zþ!“,±(–Ø91 [. ØcoÅi¾¼š1F‘)›/«\_´bŸ ó…âÒl©Šæ ¥ Ñ|¡´TÍ’®É|YZ“ù‚¦fó…ZÓb¾À|r¬Õö65GÔü­ÚEÍ[ôòeõâèbº¼˜ÒÎÁ>¶ÚE;›´ôölvuv¹ÕÓ]¶“Õt>«ù‹ö²ÓÞú®#¶?;o¯{R' ÑÑ!5{ÓÕ›SÜÞ®šã¿?µÔœ}l«fw>[µ³ÕÇÅ$«æ°]ί“vi‡¶{ò¶=Ÿž½š_Ó‰³VPbíQ 9pËi;@´Âè¤?»¸åúÝo¿ÓO¬5*žrʵC¡Î®./O¿#µVhR® Êì©¢{FFÇÚ ’}CNw_ö8µÒí¡Ò,æ“£vE'`æõ5ÇíõоZ»“2ߣÌÇA”y½Mוz'e‡½µ!@%®yÐfg6›Ã܉5{ Ç®[|·¬ÅÐ WÍÑÕûU÷ÿ—éìϪy5_œ·‹Î›;mÞ4ûÍî w,¼ `Euu±^^|­èLQS]ì[㸎.@n‡î?±ÏF uêzÙM1K¦zgë‡ÿy‰$£c­¿±c¬5é½løÛA <%l~¢oË>×1ÅÊ<¤’ƒ_¯äà†Urù¯j7ÅÍj÷ÃôãÕ¢]¯¤ ð†ÝdMöôR”uÕ7/ÛÛ²|ˆîÅQÛø£)‹a²èQeóÒ¹-û™‡àÑãÂF¢RJ-)n$šC-º™hPL›ˆúœj7¬+›B¿æïݯïÿ°ÃlêûapÖûS !ds÷k¯q飗®§XyÃSñ0ÿÆÿ„úÕÞ ¥q¸ç¤ƒKÜWKn<™K½É0É0paD™ë}‰R.'sYÖÁe.ûñd.÷J~TCÉeœŽ's¥÷)(n¸ÂãÉ\Ѹ0 \OæØ¹º< ]Oêì†qý ÉùAðìžqDÙË}|:_Qþ¸×Xì~öø˜{—€<¢1“ï¸ãä8àˆFMöÜXô#7Ù÷æMö2`SK` pDc'KoîdáeD£'K¿ÉÈ㚌ô>2¢ñ“ûw¨ü¸KÔ;†?‚þì'S– endstream endobj 146 0 obj << /Length 802 /Filter /FlateDecode >> stream xÚÝXßoÚ0~Ï_áÇ2 ×ñ8Öž6©ZmÒ¶òÖU‘K D„IhÕýõ»$À’5„–±í‰à;¾ûî|g› 1"è£õa`_J…VuÐ`„„ƒÅTð+m4ðÑíÙÍ$H&A¯O9{ÿåªøøfF&6ÑÐ?ëh¥ÃÞÝàúüÒ%È@‡e€\Jì2 ËåX”¾tÏ΋ÊU6ǺXKË%‚ì_6P˜)ÐpfÝÞäƒìÌ•‹sÍ6Á”9ð¢ë«EÊ~)^ò‹)‰¹-6AÉ/ojž2#°õm,9+4Þä•”¨4 3Þæ’¾„QfÃ@¢QÚë;„dj«DM¡KªZëÅuÙ¹x‹ËðßWwQiHŸúÃØ,:N¿a¿+lá¶‹y­16¡`N²v7ŸëâùÌ!ÄOº  ²t†Æ\Š…#ÚØ3Ñ‘®ìsˆ6ÝØàìw•ÕCoˆÎmÝp-±$j×™'éÓ¢žëáDóÃZ?k’ûը᠗?ÌÆÐ„S‹ÂѺþÁ`<Ó}Öæó3¯ÏœŠü=Mÿ…‡HÖªî;D6÷»% ²#—¬­WíK4ŸpÖPµ:@&&~†æ(Gà±cßXzÚ÷¡Xú:Õ§Ú¡Ë]å²Ð)Œëœ¾ÍQÉ [VÂLµ{), g<£WéäT·¥eÓ¡òjЪÀŒ®»¿LJ:Nz}|.÷Þ™r]½¨n´ã†óGo1ORp×x‹^Ÿ9'‰~gîWAèó.ç´³{ûV÷ºÆ)V„wy\û EŒ9ƒ endstream endobj 151 0 obj << /Length 819 /Filter /FlateDecode >> stream xÚÕXßo›0~ç¯ðc2-®1þ…ö´IíÔj“¶5o]… õz&Ó(QïpD4ØÕË4 JÛì²L]³ÙÀ¢Ð;ºì* È1Þ\öô±ªe>Ûƒ›tã&Çá¶+P£Ë¬n8“…y}(„ØäÍhL·Ö‘% -Ø@PÆUPùJ¼7Öj¢Ò6ÁB@ºm}'ÁQ\Ê_‰Þ¹iW* ™ çAn)öˆÞŒnÚÚ ƒ¡ó9ƒppòèTó*ˆÓ œ«?Ú§‘‡ž)Ø3¹PýÉÕRtús»™ÿk°^¦êÒVu¼Mñ¤A@=È}ÑAA½sj4fl’²ˆLRë€Sò¶ÞÀ×çPƒgìmUëI‘-‚IœèŒåât»Vâz±çö1ÝÎì‘îçù›!]ebíÉ:k·NA˜¥e£·jŒBN{îÚt*í4'.†„ö­ÛSU­š:EšѵÐ[½ê%öÅn6»z*ÙÕSAvßÙPÙ U›<¦›®£TÓr8"âÕEæ€#óÍ¢@\‰çöä$ÍÌ\½¿…p„»o÷°U7ÚãJ›d'øG”ªêQO˜+.l÷Ýrñq Ë«X×E=¯£7ìI"§åÁÁn˜d½Xïn óØxÛ¤fìEF­Þ^–»™Ë¢<Å~qùå|gìfm2kìy ÆžvH:¸æçYYé.ØsŠ}e#x^´D§ŽöžšÔ7ÚOÃCö;^~G±—¹€Ù žõo¾øý'»ñZ]ÈuÝï }D¹ÞûÂ> stream xÚÕXÉnÛ0½ë+x´‹Šá¾ §HŠ-Ð6¾¥ ÊL,DVIMÑ~})Qr¤Æ‹â-îIËÌ<=>9#"p øè}y'gR µ ŒnPh ¤¶W‰Áh ®—“8ŸÄCŸp4xÿåÜÝ|37&3idÜãç0ý&ÃëÑÅÉ™B@Y@AK@&%T”ØÏUX„[©'îB˜.c¼Ó‘÷àaë„~â@l$ÑÔ»ºF`lmA¦øUyNÇ*ì}.½¯jK³Ö¸¨–a$ÇÐZã Â<ÅC_ 4¸G™yøŽ8~W²>eJB€mç.,N‹¡±¹CpqAfÂqiQÖbAP­[‰D\p %«?ÿ¦²p¨¥­×“0'æ­#À¬xw¿vþé´² •R}0o&5åP ÑÅkËP:IHqØgz1¬ £ _±^¯dÚ˜V F³ =[2Ï.u}£I˜=·ù¾#P»· Õ@*û¾šÇLPTö¹y­¸hbÒv:*ù¿à«å n5Ë=§d/…Åá^8;P85¿‚ÙÐ×èU2x‹Ê$&¸¿+ù³×É¥üEoþ–¼ÿ—øyøhú”‰-iï³Lìbs“Ž3=}ÅŽgÿ_U WÓ¨@gK‹!ï)G0©\8;‚{7 ¬¦aA‰t7;jèâ®ÈÝÀ«ía(°î5÷6¦-9SbÝ[òìÑdv÷GÞ°eÕ±6¸ìºq¨ÛÔÇÜA”†S³ÇDlœÏ%± ø=3.`þ¸x^îÓ¼pŽó)JÞ«Ó˜eqų0él2þ)#{ÍÜ_JšÌj°Qm æIfŸS(µZP3ª9©<7¯´V´ú'Cª#Zãkr©ÇÁVyT!4›#^˜ýy­hàW´,@–²ÄQ'夀\©èÛH+Éê~î¹$Ý”}$éYßéí´ ¬²¿ºÞxíq’à|iï?óå8*´ùyÝ¢ã?F Fl“Ó¿¿³chÑ endstream endobj 159 0 obj << /Length 884 /Filter /FlateDecode >> stream xÚÝXKoÓ@¾çWì±Ad»ï‡8Ô¢"xäÈ2ö¦±pìÔvAðë?RœÔ1VœÊɉwvæ›™ofgMÐ5"èåäÅ|r~©-²Ø*¦Ð|¤ÂÊr¤-<5Eó}<û°Œòe41IΞ¿½ª¼w —¹$põß7~rëÇÓÏóWç—†  / ­±á ÌUº˜ymÎÎë¶Ü3¹˜On&„¢¿10Ø)Q°š|üLPk¯ÁÂô½’\!I f\Áï}˜¼›¶_V´üâVcA%Ò’bX¨°äÑOç¥}$(6‚£ÅÕê“jAb« j½.¢8Ž]ò‰Hú¬’˜qc°¬6ƒj)7b«R÷ÌBÎò*€Þ×0ÈÜWj¦3J,ÒÄ·TÆ ÃRɈèÒ¼^úI»§5AftB­Öóó„Ng lÕöÛÈÁš±ímQRlÀíàN½EC¾-9pÕ ¼ÞA:Ж2%´âÇÚuJi’7rÁÒÏ*%±–bOÊu;å¥êÄ_¹VäeXH>0rßü8 ýÂyëéL?š¬»ðFªÉuil_RjÕ ØÖìÙʈÁ‚ïã[…ÀWµå•¤ëÒ5¶íÚAZ aF˜°«qOÃïÎFŸ{Ýšó,Øõ¯ƒqÝþ…iâ†ú'ºQˆî#=@XdéÊûâçN‰¦žò3¯©ïû=@£@ ߺq‰Áãž —©¡@_ˆûµ±!ØfûÉVzÒá£äoíçù÷4 {RØŒ•…84þ(k?_ —F(±PÍBz[ŒãTtHWÿGáfÉМgÉÞt¨îÑÉÈ‹,J®ÿz2ŽRâ}U¨º s?.R£=ÄŸ"òo·‚êÜ;ýÈòýËGø†N[Bˆ2ÐêºXBøé¦¾[^îNn‚a.èˆï sjF“wàX[Û¶Ðò¡žAöœÌ(l™;pª>²BårÚAèòêõEí”ÅÆ˜!:ËF—Ø(õ¤;^Š×pÑÚ[³æ~¢rư6öHDí¾åÜ!òrWÜ»WxÛéi#ûüíôÎê÷Þû)B ÅŠÚ!P¤;j›9öwoý«³Óˆs¼¯ÖÕ°Zç{jß«õÌùñªM¶…><‹wj»¾ûÂ!g‰8ä³ï/×´ endstream endobj 163 0 obj << /Length 962 /Filter /FlateDecode >> stream xÚÝYËŽÛ6Ýû+¸œ jßdÕ™"A ´ïÒ@Pl:bISÉv1ýúR¤ªPŠ$kÆv3ÉÊ2Ÿçž{„À'€À/³W‹ÙÍ­Ô@C-ˆ‹5à MÔöWb°X÷Ww›¤Ü$×sÂÑÕÏ¿¿ñïÌÚ&[ÿ÷·8ÛÇÛë‹·7· e´ZI %v;·‘v¼TW7þ‡0]Í™½^Ìþša;ü±39X¦³÷XÙ¾·A¦øÛLÇ*ìóÜÍþ˜¡Ð.ÍzìâÚvå'«ë¹]•ÎÂè³yˆ oÓ¨4»ºëOÄÑ]Ó] Ȥs %£~±®‡C-%ší”Ÿ\Ï\ÚVŠí €s߻̳ÒîSm³ÜÄ…(8”œùµYÿÚu³Cjáá—~† dœ¶·Ø%©‰ìŠµÍ¬ÚË]œÞfpº3)èTˆÊN 11)ÖmLýÄ7ˆ<ù’L œ òE›™ F³w2%!mèIfg`D:ÐóhlMÕ£Z¨ÝJTÈ‹ 岉³ÕÖÔ ™ òHÅŒ«±™Å©‘d‡íéjìø½O‹ä=ÜWÌ‘g¢B‹Æ н¤-”4´Sß ÷iŸ÷)”Z‡îÌ<ÄÛ½ce¥ÒSäûdÖœï"é:¤Ç„¾o<+;b?˜¢Lò,ÌßVï5 Ͻ+—Tü¾%ùχ,RÂ-mG—Í´wÁnÕ Æœ`i¿v=«-À2ta!5Ű(^­ÂdØEñEnS$Qþç %ÒÿC¢Çl«vñǺ\röÃTËa‘ ¦Ê–D°‚¬»úqS“:óÆY×ÉÉ,ŽËeïâËäŸæféö#Q[N—e¹7/–Ñ*ÏZr4Ï‘úò±u½ŒÖymóe¼-MqH–Æ_g’ÌG\5Ÿ`±îT¬Ž|œ žx&„àiÔ,”¬ÓrȤ;Úù<_™cŠÆÝs*¾N DPˆ0ý>ìéÞ5Å ô³úÙýí›sÁ³ °³€§äŸ!¾êèºÈÓÚGúQY~¸ÖŒœ·Îã§SLm½˜ºÐ¡A<££×P9Î÷»Žè!™îö­±—;€Màš qͦqýµ^:ù# î{ÿ€%Ô”ÕÃl·»IM Fø ‘ídâî³æá©Úè¾ð˜]<ݾùõuMTJM ÷õ&4K È•štŠ.Lšz^Œ^âF;ÑãwÔ*}ìŸpùh>Mô}é`•ÙS>tü ¿ª® endstream endobj 168 0 obj << /Length 806 /Filter /FlateDecode >> stream xÚÕX]o›0}çWø1™×øÛÚÓ&­Ó*MÚÖ¼uUDƒÓ …D¢}üú(É€†lÙKI¹öõ9ç_ <Þyo¦ÞÕµP@AÅ1Ó`rE€Pæ*|0 ÁÝèv¥Ëh<Á ^|ï~|Ö èõ\»?ëm°ßOo®®%Ò$ä$OH…€’`³œÍ…¥/äèÊ]0UùïíÔûæùfþlf20½»{B»R%Áw;2ÌGn~¯À­÷ÉCu^Š6ðb>4÷-”h'>ÂRËpöUÿLgÙf¶ˆVº }A  €H g`âCA‰KôÂFTB‚Úíe°Wú¥ N¨QûfšYŸ17`¾Y§7«Ì—Abr£.=ÝO/@ívrÄå„ÈÞ·O´ì jLSrYOžO1ÌýWz_BºŸ½]?sÍ‚‡BFC¯[Ån$í*òÃ$» ”O)ÕP u\yHsyÈnyvTÄ2r¤Š±Ž ~^+žæ”.Kå°‚RÊÝŒ.e1¼Øl³«%ÝS,~éYfãUø LSŒZ%ˆ”Uyw¤kÿíQéá²Gó؇}¨“>/P—ß ZŽ¢§<çMÊÓ­ƒ,ø‡‡ÀáÔµL†>êÛ¤=Îû] çç›P_Ú.Í1[‘ T½Þq+&u5‚Üïo·2ÅläOÂÿÑ®>ÔŽ;bº–_»ßÎ;Öi<柄äŸÔ1'ùtÓ£­BŽ¿±lGöà'üöqCñ¥y8¦™þ‘]̃Ÿp¶·Llºê[fÓ§QŠ¡Bô9_F·& endstream endobj 172 0 obj << /Length 786 /Filter /FlateDecode >> stream xÚÕXMs›0½ó+t´;µ" }NOíLÒI¦ißÒ Cm9öÔàHÚô×WHØÁ)¶å8$ä$@«ÇîÛ‡´,WÁ‡apt"PPqÂÁp‡\…@(3 †cpÑ;ŸÎòé¬? õÞ9ußôDg:iwû9Noâyÿrxvt"‡% ʘ×Y,¢Œ½½#7ªÊ5Áñ0ø`c„¾÷˜• Œ’àâ±™;R%Áok™†$!7×sp| P=.Ekq…J@Š C3a}ÉguT”ïCIC0ÀP˜Áξ± *!Aí±.ôŸb®ÓïˆáwÖdJ ™]m°sv³´è0"õrË_ô3û¡³l‘E“l‘D“ÙÜPǹ™7P¨â¸Ä %Œ3ç mv¦z<Óñ\¿unPC4Áë^8Ø(ÎSl„Yb襷¸É¢@ª!Ä2€2–âîºrUVÜYi^Ù¦qfM8ƒ‚Ñ t‹:Ý%t'ºF7ÅRö€îoiLj…Rõ×/9*^³Šžj§Ét<6LðW" ÞïÉP6OÚWÏ~ûòêÈlbعP™×&l$K–õS tCyµ=qô°ò*ÓÉâVG£²lhqÇâm~V.‚J+”¼Vž „bÖjž!‚›\^µŒ´«wFÐ]Ù®.ªˆûF{nFÌAßj3¾jçY ?&tv«³þ@ÒÚ üÏîpÓÙ½üßµ¡ìxoϲC=ìôvf(ºöóº«Å°Ýׯ6÷ ¦XÖ4œw©x¬¬K×¢² ä–¬n[àÒÒpq¹«'´‹Ìª¼êˆÊøcYSëbZ³jˆ6õW) ÑÇ´WÿWìÖ3 endstream endobj 176 0 obj << /Length 761 /Filter /FlateDecode >> stream xÚíXÛŽÚ0}ÏWøªâõÝŽúÔJ»Õ®Zi[x£«(KL-šõòõuìÀ ,ŠJ«><ã™3gŽ'¾Þ{ïFÞÕô}AMPøHßüJ F÷†q’ÇI@8ê½½¿uŸõTg:h÷÷c˜®ÂYÿatwu£P&  e@&%T”˜t6EÆ_ªÞ•û!Ì/÷x×#ø1;9˜Ì½ñ‘±Ý™¯Àwë9#H¨0×30ô>y¨^—Ïêâšu %I‹þ#‚P/·O٣βEäºta „±AU,´€*¹à`€¡dÔE{e-úRÚr¦ÑL¿¶Æ3Tl¶œ×É Â<Å&™Éµáö mïÉ"Í ç7‰Ã̺%g Û#AmÙ–djÁo*<˜@ÆévŠc´úGÑ‚ÖL ;F‹è‚ÚLKµlK:“–L‡³ù¿¥[Ò™´äi8×—¦–Ê»„?—ÚmÙüí@a–†ñÃ9dII¤:"òeúZ3A|¨”ÚFà Tî5Cý¤=C¯5ó ¥°þ¶“vXg ŸU®'#Œª…+˜’ pÉ(”¾jÓ[K än÷'qq‰òØða]wˤ AIHë2‹E0MffHuIM·ˆK¯\Gƒ´ ]ÎÒÓÌ’›e°Xc,ê7'*äJËóˆ_¥‡s™”îW©.âET>¦ËÌš»>ã7·®O¬nWñ(‡Jˆ#bÏ%>òÒ`º˜Ef‘ªÿ"kÙ>ÔÓO“÷tú—a]‰ÎÔa¥x8f³÷ݾ\=/á!Ëuà^e0fÝȽR¤m— ›Ä(ÈŒî{b¯ eÿ'É2œ­Qc¨m¡ßcwß0·_ö·ãñ)š’ C\ZþÔhhÕû–“á~ï`8+ýð€êé‡ëô›OhM_ä>b/ù ÷?ª;œ endstream endobj 180 0 obj << /Length 964 /Filter /FlateDecode >> stream xÚåX[“Ú6~çWèqé­î—éS2Ív’¦3mÃÛvÇã`±xbÌÃv’__I6 À7$™äÉIŸ¾ós¤#!ðømðr<¸½“h¨`<\@¡)Ú>%ãÜß¼›¥Å,ŽG7/þ|]¾üm¦fiò‰)?ÿˆóuœ ÆonïÊ ê™”PQb§óXÛþRÝÜ–´3x5ü;À¶xÇØ‘LæƒûÛö È´ÿùžsÀ1‚„ ûžwƒ¿(´K³À.ª%d˜É1´ žË:/ÒÇÜ$Ñ@è&ÍWåËägGÉ⌰íËykçäÃ[“טÌâ¥ÿO4TJÙF(Y5óO¾C-~ÿúû?ˆã_|ãˆJ¹‚.òbCsƒ/8”œÖáS(µ'(¼'£§ešOÒ§8‹3×™E”ÄBÚÙQålO\Pˆ0íÃ|çIfBöJAÎhÅ^´HBC`¥¡ ÿ›(GkSÃñçEš0Ös²/Ÿë3i7¤·0V¦Žå Š@.x ë4”£ ‹³ @pO?²xÂoIö2L ãt¦‘:{óxnsW£Cûø½ÅÐ6Š‹—æºióEbês¦CV/KõÛAOS“%iÛ(>!KÜŠPаX¯6&b¨ØÈEúÉD+ß¾mîŒ ™™¼1azú/Zš8›Gœ]7\¿/6ññ:—È6ÝÅè;‹+¿ ñM¬ qâ QåX}|2;Rþó¬Xïfuÿð9«¸w”?Ø"þÙ¢Ÿ%ù³ýÅÑYiýl®ÓÖüˉFdHõ1,z¿N3[a¼¿‘ìxìTê '7fã< %Òµ~0OŒ ;¢ËmµõÝs”,r›Ì˜ Ë·ÇBAvž ÛÃRô/W‘Ù.._vÓÞ9%›­fƒÔ™GÞŒp§Ñ Ü{|•r ˆ{:Qì D]Ù;¼Ë;.ö(°<ª©®‘ ­GÄ£,g­Eƒø:EÑpåŽD{¥Z;«sÄkG´ô*@Ê¡¢¶Þ*õfy CPÒk¹ ñj\3”DC²»·€H—) Î.óhšf}NŠ\®šv¾³e{Wãì8½ëåݧ®¨Ûü¯nTýÕͳn·3ÑUD¨¹ÔvÖå–DÝeÔ\7Ù[tkÇíQ44„¾ÍšÂ—Dû»×o_xO8µ,cmytµÝÓHV}Ä:÷$"ZÄjw@%Öön¸îª™¹„açÜ4ÿ›|I endstream endobj 184 0 obj << /Length 1011 /Filter /FlateDecode >> stream xÚÅXÛnÛ8}÷Wð1^Ô Å;ѧ] )Zì»ßÚBPe:6*K®$»è~ýŽnŽdë–DξĊf8:<<3’ DÐûÙËÙí2È`#©DË5KÃ2ð«´\¡Ï7÷›m²ÙÎT›ßÿþP<|²kÛзſyáÁ æ_—oï4AJ–äJaÍ(|.Å(ø+}s[üPn²1³wËÙ™N9(ŒÈßÍ>%h¶ˆ`n4ú™{îp¦LÂs€îgÿÌH}^†×æÅŒÂÜH ƒ¡6/×KBg¾„Üìãíñ ÎÛ Z0N°¢-#DË ÁaTR¼Éçæ ‡x‘Èý£-Éй`+^Âø-·l”Fµ×g`¸£1gNÌ6Lák„¶ pW6ž/ŒœÈ›¬¥"¦‰Áßxqn¥k­›‹¥{ÍÒ7Õ¼°æ¬ ) k²ý׺i‰³4ÃXÖ“B6¬/ŸÖXœBcÌM,ØÃZ?œç°Öà•™ÀZÊfÀ’³\ÇàyFE›’ÑvU*䂊œ†WÏE fO½i(Ö1òm’T¦ë®aù»ý•ûH•àqU=.ŒhdvhX§±õV—õ%Ã4ÅBŠ1óÚxá*°UB}¦guåîßï:sº}¡×›qÖ—9sR00¯e׬‚‰w´c¸êÐÍ•ì᪟ÿÑ\Þ•º(°© {´»÷â˲6¹jZ‘þä.£Uµ²é¯½mº•ÔúQ˜”N§z™g٨셉g󮸒\GÍ,½GÔÍ®ÓÈ]o{Yzþ_ž Ù%Íb͉¡Cog;+ZOÅŽvûÄ™$?£êšæ×%®wÓ½hUJCÒÖ¨ˆ)ºŽâ×§OŒñÛ©tׇÐ/pu8ø^|óüïîƒ--Æx¾¦ègkqâtdÕìlÆdwÒ3oHäuå1È¥ÿí µ!ZHŠ ,¨±Aöåù‚µP@áHC„¾^† 5ó/ÉÚ2”!GÏ ¶Õ¼ýӻƉvYñÎÚ¸ó–wr‰56>øâ³kr?Ž8\Üöâ pØ ¡­½µjpëëpÖÀ½B‡{Ú“4ŽÂ‡VòòôÄ3š—zcià:¢ÛxZ1¬Lc-*j­ìà€»öAÚ.s*&Ÿ º©%¹AœÝ Àuù‘NV’ÈÖ¥öqÇ1XghkiÆl;çOßo¼,‰3ÀCçÄá{„ɬ…d(±@F|Ìn‹”Å5w—v©ÐêRS‹|ì”R{dÁ]…Iy±÷ÒyU&ääz(3|2Qœ®gÛn{9ņðç\öþîã/ endstream endobj 188 0 obj << /Length 948 /Filter /FlateDecode >> stream xÚåXÝoÚ0Ï_áG˜†k;þŠö´IíÔj“¶•·®B1B›S÷×Ïq0!n­¦=lßåîw¿;ߟއ¡wv!À€†À8äD ÃÜô®§³t:ëC½÷_.ó‡oj¢Uþ÷s¯Ãyÿvxuv!Z!÷3…T(}¢_gtù¾>/dï,ÿ!4Èd¼ó¡÷àa}¼³hIÆ ïæHï]i Á/srFø\?ÏÁµ÷ÕC¶_µüò)f@0 õ†±e< “ìí€PJ  êç{õÀZNU²QÉwÄð;s`à ™‘Õz³EqÚp„P/Í•.ç›þûR/j-h¼ŒÓ•9´³†"©à¹9´jŽÖòïe¬Þ憽ìã};Ö³x…ù¨xÁÃZ%«Ç{e›O„ì‹m–³¨?xÕðÑ$Q:Ü•ÖWüì%IºÓ ¥ZÂönkP·wã»t½8ôî0x´Þ1ú´à…iŒsŠí 8ä—O4Õ ´¥¦:d…¬ñ#ˉÂæCTÜZ&š˜c—Ža(i×tö[•Ö–Û<0Jç*¶XJȪÊØ-ÒÕBÇŒ F¶®šXBZ­> Ô™$ËÅh2›kSôr쩦~·ug³ ÞÌ}P…85ÅÝNÎvjfªãp¡º2´.ûkÙ”SÛ.+VT2qM Þ@ ¢ïâ×bÕE‚j#F©Ú²æ/pô¥«fëe7º“T¹TÍ#¯¼‹ËOçOll&ÓBŸÏ äÜ=Ž'CXI¾qê+¦¬vÎ`m¯¬Æ–«0‰ £ÃŠýŸóe`F+]å+_rù}«’¢È¶’Õ6(´©A)6–ëU]{ÂhO´J‡æ¤±üää]ó3¦?m^ ë ÌLÎë“(Ü­† ÏA¹ÊžŽ(Yi¸QÿxÉê®ÚTV«r@zÉ×m>ÊÛÑý±ÇµouRZ>JØiR7Ð<èuªkF®B­‘¿:ØŽ¶’¹”yT"?±<þ|WËb «öݧúãá‘#–Ю#VlõN–ç¼ ·í7ϺO¨4›Úès¾ þ¢©ä endstream endobj 193 0 obj << /Length 1072 /Filter /FlateDecode >> stream xÚÕXÛnã6}÷Wð1YÔ )ñŠ>µ@·èÚÆoÛ… µèXˆ"9’œEúõQK¶në Š>ÙÖ3‡3gÇ"è ôëâçÕâá£ÔHc-VÄÚERç¤h ÏwÛ0Û†÷K‡“»Ÿþø­üò—Ù˜ÔÄkSþüÝ÷~tÿeõéá£"HCá™”X¹„³¾\륺{(?¦‹=‹_V‹×…EÑvr´~Y|þBP¶Oˆ`¦úfW¾ N v\ß#ô¸øsAÚçÒ¬u.WKÌ(G’S ‹e½õÓ":r4VJ¡%Å’¹¥íÃk¡°šsÔ2ì3“~îÿ`íKF±Ó²Zh—dá?ÆË­½1ƒƒ*jé˜c-j=®ýF&þ›púcéÞU ócÿaœß/)q¹Ëli¼ÌßïÍ¤áæ½°(°€òx°VhÌø,8ÅžêˆP@ItBåùÙ¼Û5‚cÉÙ€_Ùö ;ZÇ;*|‹ÝŽÓç¶ýV˜ZÏëL˜òIpë$¼%aÐ I©Æœ;ÝãŒ2Á”ÆB°Á€Þ&I½(Yû‘}má’NJÿÂÅ„öèPêñÖƒ¨®ƒ&rèè$΀¢4øÛ…pû QÃ/ac*H/‹\,µîШJRžš4MŠº8¢ÊŠeqñ,Sõéa|ž†ñ“—'–ƒK-Nsí*sÁç°}2×Àu¼ 0DÌßwÕrÒ%ïeEÙùYö-IƒºóÀäÒ^q±êå ]0×aˆå3KÏ1®;?õ_LnÒ$g‹Q²ÏgèÑ)ùò§ žð)Î]Øß‡`C…º¤`OçT ³¤ù»ÆRŠ>Ø¥áT÷ D±¹%´Gx%°vf1ín*^µy @Ħ­)G˜Õǧ uƲ˜Þ/9ë"yN¿Ö g™r;4c¬l`xAq J5ÉdiF:ï¬ ºîû‡§ñ^—3æ¦~5)ËL>3e“Å›«’Eö6©â·Ñ3‚¥3yèwi²6Yv:õ]ï À!|j^{5¿ínÞZŸoMœ‡k?OÒy[’(€¿"ÏÁ‚À‘Oî²3d]ÉÜt|ÏÖ^™…dþ‡ ¼¯û0 N†¦ëËC3âÁ-»Ïü'3V—¾ë{<øØÝͧr`òä¯ÒÕÛ½W!ÙB² rœÂ 9I™Fg»i.ºkAuæ6ÑÅ@†2òzÝ&:ÆÿÇâæ7ýhºÊ‹þ:<>w6ê?\ÐüÍq9VB ÿá‚•Gi˜?2iø¾v¾xt ¶7¤ïøðr^3©Y¿ÍõoÔý5 okíÒ¹1¡k¿ÏyV†´MO(TÏš0aOû¤La—êy'Í,~ô2Sn/º‹^WX”ç fÍ!ëW˜‚\­ Í‹ñ¾÷ìÌÁš°s^³ÿ ºGN7 endstream endobj 197 0 obj << /Length 879 /Filter /FlateDecode >> stream xÚíXYoÓ@~÷¯ØÇ‘íÞ‡x©EE Í[©,oåhj»Aå׳öæ°_M$¢$ޙٙ5#€ÀGïCß;»h¨ ?\@¡)Ú~K ú!¸î\'ñxÒíŽ:ï¿^ºßÍÐDf10îï—`q̺7ýOg e šdRBE‰Ý.³E¹•—ªsæ¾Ó©ŽwÞ÷î§ØjY㜷³ÎÊ­¯Ç&Z™èâøÛ‚a§Å=& »FÄîg$ùÉ(öc“øN¿ÛÓÈ®Y3èj»žÙcH@&EW¬Êk…)ò è'Ódgž–qD¡Ô:OR•d”ê÷0©@„(5iE½Uibfu; -ú¢ÈLæCÊÏz©‰˜F7jˆ)­etV§)¾JX%lŸ’ŒJZÒ˜¢²¡#uäB©á£Ál Å âîö8+Ä™e r1¼ÌUrÁ+rBåsb,™ɹA•‚œ•'E…w'↥ cö®¬ùföŒ#㦠•RL«<Óù#…r¨„x¶I×`kl¾NZNÓ¬êþJ>”œ’Ùþ~†¾aüe¹#ì¨ Q@#íCÎ §Je§æá‰¬Xæ´sÁFï¼H!ÈãÈ”„é¬Ä14ƒèa™ìM§ aýù×ÂTh+ÓXŠUX3¬ {¼M%Ö#ûÙä¬o’‡e:€7µ²zÇ^ö]’Pâ»f²µÕˆyH>ÿ4ƒœ´„ÄB›ÍÒ³ïâòóù^û­·97·ÞRÉ~p-£ÜÒó¦°z›å€‰Ú<¬ì[M8Øó6ÜýþçM ^³yÚº=©Ž”:âé¾t,ÚàëX‹W\߆êñÐO~›MÛ,7Ò–™ÅÁ‰C8>*œ¥•—|Úz¬mš+!‰ƒ•ùÇ‹ô%zÕö…Ž8¡´¨»ì^Ù¤Pyâ•ç¬>§ôâÜ`uZ—ÍHå&ötR*»/ÈMW‹Û#ÔòÏûaÙp\¤.3n%ótlßÍ–½êejÄyÓûÐbÙÿ endstream endobj 201 0 obj << /Length 906 /Filter /FlateDecode >> stream xÚÝX]oÚ0}ϯð#LÃuüíi“Öi•&m+o]…²Ä”ˆX€nݯŸcšÐ§ª= À¾÷úÜãs#ðøä}è{W×" 8æ ?ŒC ý-|ÐÁ]çv”ÌGI·‡ê¼ÿúÙþø®†*WY¤ìß/a¶ Óî}ÿæêZ" u@NŠ€T( ÖË™X„k{!;Wö Ó ðñ>ö½_ž¯ðŸ1`íÉ@4ñîîˆõÜ @ü6–À|1áúw n½o*çК¼˜õ¸’d‹nÏG¡ÎÜd8X$ÑX-sóÉUÞí‰búbÈ‘ Á"1dœž%6Ø3Ã` $( Â,NÕ[3Ù£š ìk7±2·ƒpžùÝ×kY ÖUm£i6_X«hæÆ„3(µPè&JÃ6#ŠÿÎÁñ1¤ŒT×h&% 'ª Fs"wpBë9¡»8áûsâl ¸ÅÓLY‡õßzWäáJ)Ûì£Éþî¾Ä2ãÜŠ½\…éÄn%‘ð3‘xqa™Ô¡ÇÉÆvîŠN꣓ce;ÑbðºpýfÓXäa¢Ò¸Žämš^…´1yibQÖóš”í´Ž‹Æ/r‹5©åENnBûTÄ"!%õ{V‰NêÔ@ ‚Šמ¸A[˜ˆ|rñgà [ýhÇQ®f³0oébíËš  Œ«{SÖ@‹@ÒŠ*ár1ŠlÕUy¬™¦ˆC*x›²ßÜÆv5ï`¸ÚGø0ö-º]]\m¼%ÝÈlžü-(6XWÓ;‹j7UY¥¬%d´s?—IëqŒZжý´ÚN›‹;VO{‚Ú£Q|[jQš(3áÓ×( oAl?_lÔƒå`ݳ¶…tŒ"Ž{6Z¤‡Ö×´0îH;KžüÿT‡á­ˆ8ûQûb;wŽÎ­’£æÆvœ"ú1LÆ*ÊŸffFžY.gyĸØÓ$v=N9¹iVô˜ŸB» TZ7¶ÑˆU:¿–¥y8"¾” [=ôB[ßÐ 7v·-™µ-øÌÝæ62û efOзU˜}±‹Ù¦÷•ÅÑ> ûÑR­?œ4Œ ù{D‡ïÔm€ {p þÌ’\ÅE\ä談1LÇù%Þ]–z}‚Íî‚ ÍõM¯œ²Ù-„i\aŸê½Úd·¾*¯»y§ˆrñþŸJT endstream endobj 205 0 obj << /Length 990 /Filter /FlateDecode >> stream xÚÍY]s›8}÷¯Ðc¼S+’К>íÎ4;ílgÚßÚCAŽcœ‚’4ýõ+$ppŒ uÀÞ'l¤{9:÷Þ£+@à ð÷ä¯ùäòJH ¡ä„ƒù0¹ô€æ*0˜ÇàËÅõ2)–ÉtFºøóÓ{÷ã_µP¹Ê"åþ~ ³»0~›¸¼òðCî•©Ð÷ˆyœõå 3_ø—îB¨,m&ïæ“l&!€Ÿ0cÉ@´ž|ù†@lÆ>©ôÁƒ¹ #Há^ªL[Jüó!I²D'aZÂè•R£Á¸Ó$î ãøaM© Â"ÃÓ£»hVq”+czB,+õh'q…²çÛƒBʦó&fc=ÃÞê">‡’ÐQ«Ë pÚ„Ñ Ý!NmŒÑ>nÅq j õã­:ÅâjáµNÍžFð°ùͰ©^S¡%…Œpí$gyÁ",tOAzuÚw=œ´1ÍŸÑQ>hÀþ[\jXËÕS$G´ sWÑú¾¿ëÐy¬¦7Ò\'kõ¦Žôé³PÉ/Ug\=übÆ9¯©ÊjÇu®¶%\ɰ1袸 Êý&‰«ØïSÜæJëGs±‘ðÐÈt_½ÿçÝAºŸÑRÝ^,›+2k×pZÒVrâÓÖ5Fu†@A]Hz…§³Ö¡Ž–eÍö«€×4¦O~‹`Y¢±90äXöIÛÒ¦)MÔ‡žµ|qƒ[‡&ñ6…ŽCmõ‰Ÿ±aÚ¬LïĦün*4ìŒýlÍÊÙk#;59ÅFÖ®X»J%Æ.‹V¥ê®„¥âÝ$o~&õyî¼ÑÞü|ì¯:#¡ÈU˜®Í}‚α÷ÓC{5`Ñ ½õ[§fçoæïCF{–©‡@'ijªÜãÕ0Y„%Àãú¦îa뼇Z…' £ó– ò[Z0Ò¹¡Pù½Ê;³QÞЩä¼]ˆÎÜ èØ g´ÉŠê°%°ynCúšÌ°’åÞOp4ò^üºµ6»5ÿ^ðÞ¥~LÒB‡¹ŽÊÑžÒ=’ìX þÜv·‡Þz·Ž{T}çKND+û¶nä—œÇz¢ú¤1\ÿ´ý>Óö¹‡(=ækÏŸ,³ endstream endobj 209 0 obj << /Length 1006 /Filter /FlateDecode >> stream xÚÕY[£6~ϯðãLÕx|¿¨O]©[u¥Jm'o»+„À™ %0 ÌLÛ__ƒ“,I¸¸¤Ù§°¿óïœcOŸgﳇ÷R µ ,–€ (4RÛ_‰Á"ïWI±Jîç„£»ûÅ]üa–fc²È¸¿¿†ÙK˜Þ^|xx¯PÖ  •A&%T”Øåj[TÙñRÝ=¸Ât5göÓböç ÛAைÉA´ž}üŒ@lŸ}2­À[=r 8FPa¯Sð8û}†š~iÖð‹j æ@r 탆_AXdø~.º+“è‹)?!ލP9eJBÀÛYœ»iIVÞÏ1"vBá,”_Ê Ü„Y‘”&žó4‰þ¢•±ÖìßÚ¥ JÆ-Ù•ÐãÞD=Nb()¶Ãìè-Ìïêj)Aã¶Ñ@Ê0ŒS¤¯ašÄAh!'kcáU®£6, Ȥðó½²w Â!¶O«…JÇq–¿G°ƒm§Wó€LÛ!Óqüö?dÌEXÈïXZ5—^…Yœš-aÌæÁ‡ ?6VëR…³½uŠ¢éa!åãXƱ½MÄ ·ÅWŽÚô ŽAì!¡DºË¿zŒàPr6VôbÈ· ŠB›•Á2ImÕâì²1Œò¬Øj>Z…›GûÕYa̵iË*‘ôc?–V[¦qmÖ'µã”Å~Œf±_.qX†= É?ûºdév#Ñ¡œ.˲·õ-7ûͨÄf¾¤û€Ń ¦þªnh¥ gÔ3(­kP(µ@¾ÕT»ž¦Ç¿M4TJµ(Ii(kJ©tðôb Û€î“ CÐ_óÄÖh-ŽÒòQalx¨¸PjŠ) œC:Ô/ 4Wý%ù¿tF;t6y§²¶¨N|@e5žZcLÝrù¯@WXÏÛçíÝ-óö-ÃÙ;£Î® úéÏ3SíÏ ÚµM¤£·‰æ¯çdS!Aê¿ ™¢KŽ)Ë$‹ûè#ö¼©‘wk÷ÚÞÁª"±ÂP`í•vN“¦ ÅÚ›ÖÁ kç$Xæ› J“•…Ù¼š%Iùp4ê0.³Üž#ç¸æäx*ÓɲÁŽüÎ*3@¯ÁNGñXnòõáAì¶{ÈȃØÐi=){+±ð&³>ŽÝö¡vÌqì \{×)V£Ë½!S¾=¸N{ªv‚ݯ®ÙWä}µ¾j)ii«„}³muóCL,Ê:i…iµp™ç°(ÞbÇ8ækÚ÷>~[`*’ÕMô\ëÁÅBã¨Q/ÎHŽ]ZtãiqmÝ–OÅ髼quÿi¬íK«ì±s>´ý 8âc& endstream endobj 213 0 obj << /Length 948 /Filter /FlateDecode >> stream xÚÕX]oâF}çWÌcR5“ùþPŸv¥Mµ«Vj»¼mW–k°“Ú&iúë{Ç6`À_I!Ù}ÂxîŸsï™;c4CýTYÀƘ!ˆÓy]–VXóŽóÐ"+˜®Ó séCì;°`o£°»ÌÓy…Ç%6JâEë$«ÊÍÃô™²RÞ×%[2˜ºpâ­L†díeVV¯ï‹Ô­ÖΘ‹»aøíæœÅÿº3VâÀ N±È×Á4^º®mð|–è3>o6þÖÀ3 W/uþcçî;n‰ëV®U{Y.ýkyMü°v 7 K%/Âd²t• ‡VFÏÙ± _¯ÂíqQÃÀ±71ÆÏßç@}<}òâMøž£lŸøÊ' ÷tr„èF†¢w}Â6Y8sÇž]T´È6«üé¾9¬µ@ƒ–mœtðô}*¨°ã–à!5Œ@w¦ q9±@£¯íž®—Ç0MÀ/’\Ö/ÿ¯çX,Ï+†?ù(¬Òõ$6 ƒ‰›†›e^mª!yLqL¨ž¼:c°G|Gºµ‹ýKö ÒÁlã² ^ºÅ+P?u]£ÌAy¸ú–}XÒölûöÛç=gï6qZ8—æG~¦§hCv¶ùM´ømí­ã(»$yÕé¸N…çšÖÀkz®~Kü®Þã`ÿ=2oÕ䆛î˜õÎs¯±`š=wB©lsäΦƒÛðît\ûB —ËuLâƒ÷ ·ÃÚ}—múÌ+üg#ñ’¯¼ÿŽ Þ endstream endobj 218 0 obj << /Length 1496 /Filter /FlateDecode >> stream xÚ½›]OG†ïý+Fé ´å0g¾GU/œxNˆ¡öÒ¤‘E‰I,MùP[UêoïY¯ïÚëŒ=ŒÒvüÎ;3ÏÌžs œ}fœíµžç­Ý—Ö3ÞÃòs¦ /™õtµÈòOìÃÖàËøæËx{Gh¾Õ>ê–/ú£óÑõèêlTþøæôêîôbûcþj÷¥ãÌ‘ ‘… ²œÔÝDKqjoÝÖnyÊïieyëÏR#Îðу wjvvÙúð‘³Otïã ¼cMZ^2„4ôú‚ Z¿´øì¸2ºmµ¯ L#xUzéŒnήÇ_oÇ\&è;ÂZsûöt|q3ÎŒ©h¨ÁZ7Ÿý.};½Á°Û› ‡ƒ×…•â²WœË3Ž®Vƒ+~¯Ñ€@ÅxçÙõˆÏŒ¦ª¶ø·óXš=RœvP cÑ:V¿œÈšþýJ„ô0«eÀ ov²à´®“5R3ëm,­(åB}W.ΤóëϬ|ÑßkÑ­O£óñÕhzÚÓ‚v;†óEë=}Ë´†B`<8¡c ¨]ïÁdõ~¤Åçô·i÷‡FèuBj¹›`”ŒÚª~$µ±f›©E-d*jýãEØJŠ× ”Ý·ÚrzÌa›¿Ë½j­À I‡¬VŒ¶É­éÇ!m¶Y­¨¥S!û°àµ“Ö„b 8Ðq»d9ik¬0»—õ²~û û>ëäÝ7ÙûáAÖÛË÷Í+ÏK—Žae=pë“1\Óc8Úl#ÃÊ Æ¦`x)U¦ãš7÷½Xo‰ÜÛåN!ÙиDQÐÄ7²W”BÊ3ä²½²âV¡À\%<í*ÐÓ픪~äN‰5Û¼SЂun;e Ù¨C¡(Â)›ZRºË½®}œõÝÃÐÌPŠx¦CX*J÷…H†pM?áh³Kš)®¬wÙg4ÏBQ(b*©6Â- Ú"¶Rð 3)¼ÉV2„Ó UºJFM?Ž×x³spÍl,(]w`ä´¶qûÏ×±êÍíõÝÙm Ô30¬Ñ–¬ýJR~é”C({¥5}~®¶‘oÝ]–%Ér Ãׇ“ÒàM¨{‰`EÂÚˆ¬IW©éGîƒh³ûàÁ¸®Õû`tE«¾à˜þ7t͹ÇÓåþ5ýÈ%‰6°$Öõ‚ ”saP±£Žrz0†ýlõ³Î¢¹ÿ¹ÌW–¤@cý„ùñ¿ÝIéD¤çÛ¡x’ýIïß7 Ð\>¶ü}|»ÈÐÄ “%sÊŒÎ{7«²ÈzN¹dìÔôãØ‰7»;\JÓÄÎËÃþI»ßi??ÈÖÄG4á#¸%ŸL„³”&¤+ÙÔô#ñ‰6Žz´öø¬}ö¨Æ³ÇK0ö‰á‰à±Eb‘ŽŠ|$:±VW Ç‘QtMäõßu#Ž·Qrd"rŒoÓÕ¿jú‘ìD›]ãAh¿ ž_× wx#9Ö‚~ê–z Ç-‡€Z‡­cº²SM?’œh³+£È&nÚ‡'ãÃAÞiçk< A;„Rî'H':zT™æ%¨ª P´ÙR¤ÂÆ£g ÏÚOóñã= ò‰“ˆYf¤Éè©êGÒmvz¤¡)Mô¼í½d»nÌÃ7šªÛDìˆ2#MÆNU?’h³+°S|Ú*ds™§—DDÌÈùFSu—,3ÒdøTõ#ñ‰6»>H‹hôò£Ç¯ôð„ˆ²c—¢ãëèØEäØÁáeBš œª~$8ÑfW‡KÐÜ,g.m x6ñà´ÂlÁè§> stream xÚÅ\kO9ýž_1Ò~U1öõ[«ý …4¼š Ýv«jÄÒТ-iËCûÒîo_;“2OnLÒä1sæøÜ3ö½¶f2šív¶FÍçÚf–X*gRey¦­;j–Þgo×ò×/Ö7@Òµîq¿|1Ÿ¯Æ“³qùöàtr{úiýÝèÅæsC3ã÷€Bkb8¸ÛM±sçk³¶Y@XM§7ê|í0wÍØ=pWÊìì²óöÍÞ»ï^d”k²?¦g^f’Q\¹×Ÿ²¼ó²Cgí¢ÄJÿÒv"s¢©È´0DIðÈþs ÖØŒù³mv5ÎÎk‘âϘ‡øßXÆÜá!–",žì4ÈV”1ƒ,qŸOãòÃ4 tzï«Yùb¸Ûq_½Ÿ_LƳïg7šsÞ†¢t-ßë»ßb°³}t<êæÅ°wØû¥»µß+ކ»‚ûKhýÿ4túS¹ní¿MÿIVãÚ±ÁˆT¶lÇuhN1íBpæo7U>žè)6×Ntû:“„›‡0›%H |èæ™ç<¢S;™çB|¤ç°dë='Ü™†%6]ïp» FEÿ°È½7Õ83³ÀwŒ6SF@¯Úx&‘ñ@]v£iŒâ#‡%[o,IŠÓ/‘<•”„áÙ\R(!@ºQ¶‚3!žì#c=¶¥ÒDHO\ÉfáÍ__ƮNjëî®o®nÏn"»ÆÐËÞÂ÷J°©þOá{j‰3Ç“uF×n/Ëêù®Ÿ>Å ÉK+ˆ´îa†Åy²‡¡‚{ðd#†;âþžl‰‡aÎåx²ñ³ÜÕTœÚï0kÁ…ž®¢$ Iˆ šl|ÝÀ]r7>+NF{GÃþ¯]_;[ݼ¿ÝT0<‹ Kÿü²B²„øÈ É¶Ëò¹e 1Èý£Ýþaø¨,\Y&Ò¥™|¤àX²õ"¾!‘¥ÎãA¥ý0É“O2³®b‘ªifÿlèÚï×·—¾×lhI$K˜ ‚DÊtrgP<Ùøq\VhÄ÷˜Ýw” 7—Uð‘!A“ï¤Á5À˜pv{¸Í¡ahd±C# *áΪ >Ru4Ùª éîNŒónq°#t‡hÝ9#*ᣠ>Rw4Ùºsá>ót/vzyƒö> stream xÚÍXMkG½Ï¯è?Þªê®ê*>8F·€Q|H"|0Î F ’ οϫqÌN -&9¬ÔÛóºª_½×³ÜµPá> “àÿÒV*"ŠÿRšà{Òžk/ÏX­¨æ÷V4ïņ.lTÆÈà¹I Þ—21™ÁðáLaQX2‡™dÓ2ËhȬ²ðÈ)fž‘sÊ?c ‘=ˆ<2Õ@Ï\Žá‘¹†£‘¹¼¡ÌåZ„3— ‘}$ÑEZRrC#s0=sE/¢™+¸ˆe®fd®ð"ž¹‘¹½¢ –F™+P;/¡^ÚZY2TU³§¡9ÊKk#gG¥õ‘=£`:9MıŒÊ>HaF#s10.9 )B’ †Gæ.ÓDˆN–r¶ÒQz4 !w_î+K±Ò¥Ù’2tðA—Þ$Á†ܨô޹HCä®Y$I/ÜYáiéO0"[K0"Û@ä†ÈCŒÈÌȖÒÙ¥íˆìYÈŽÈçÒ9R=D×,¦À®J#Áp 3êŒB(k‚½hVT`VÍîÔU%ECtm˜T]œ"iÜ.ù‘»å#DVÊGémm 4G#Õ»Õ0;AAÕ“GAáˆl  TÃr%d@pÓÈ€ø@7TÆ6J¹áy£°åêj9½ùã÷s9½~÷Ûy9}÷t¾{z„É «ñf9Ýœï?=¼??®Kríúáüë‡w/ï?—[B‡†VA^ï\=Þ.ˆô€X8±Â_¼X³¼*·¼®ð›rúéç_Êwlf,>¼ wŸ>~|û|i”««rºÎµ_F]§è¯v$·µ!§×÷ï.Á_\¤˜Ä*×èsÐN5œç°*‰Ìaq†’}c¥?¨þRg endstream endobj 312 0 obj << /Length 1350 /Filter /FlateDecode >> stream xÚÅZ]OÛH}ϯ˜Çdµ sç{TíC¦Ð¥I*Q±•UiQí&ÐZíß;¡±I²c.“•œ„ñññ9÷Žï\#_#¯;;ãÎöžqÄQ§¹&ãK¢4ÕNãüÑ_³îèëÕôëUo‹+ÖíŸT†Åe1)nÏ‹êëÑçÛûÏ×½Oã7Û{–ëµ€Òj÷—+±$÷ãínW.]8§“;vÀb~ràþLEÎo:gŸ¹ðÿ{C•Î’¿Ê‘7D£\hÿùšŒ:ï;lñ¾,,Иc* N.ÞV~>émë>|¿û£¤Â¨S&^7ˆ j˜$F(ªdI,ü®@S’pê¬#“‚\.0©£-ÿõ鸤Êêù*`£±ø3êøsc®°ˆ¥©ãîÈ–€“/¤ú0œÙçm*í“Á>m¨T¸&3óïîá{qQ\V¦­Ä"g[š±îônr~7ö10~ÆÄóOñD_ÅÆªœÁÄUã¸2´ÕÔ[K„‹Ûi$QmR¤K­V&K€>.ðdã@kîçe¾™ð‘Oë§ð 2Ðdˇªv_fCž )¯ YØ ´ö)¢ýå…SI‘>(Ìóiõ¼ø˘) ÒåŠr’‚åÉr¥Ë<Ùø\ñS)•fƒ©2ùñ4]|õ‚™.û¹)£Ppb)£BvŠÙ㹸íù4¹¿© ½Ù½ÁˆXâ—¥Â%ÌîïÀ¦Kœ<2o°T#ÒfN[pʵ}FÞ·Þíz”–¿ÿk8XÊ8¤3¤ŽtM6Âc}Èsï>PÁæ³ÂþÿË?.û·^y`¿ÆŠÎ e:á㣎M¶…èׯ>5ßÍFù`g†ƒ5ÒC¬ôÒ/²¥«rø8éñd㥗ÎWÔ–j´+×hÏ£µ·¡,Sé´¯ã#µG“m¡½µT ¾B{µF{­½ E`ºöF©=šl íM¨XÅRíßgkÄ—ÑâkA97éįã#ÅG“m!¾¿¦‚'¾ˆQ_G«¯ªâ*™úu|¤úh²-ÔWŠúåÃrõ÷úƒ|´ß‡üíîºo¼ ²*¨’ÙPÇGÚ€&ÛÂ)Ëä¢ ýlÜæƒñhÁ§×a¢e‘•̇<Ò,Õ.AõcwöÑ®t+l´ PÕ[Él¨ã#}@“maíÖú«?ì½û0,]XW‰Æ—C¬ª¸’©_ÇGª&ÛB}jøJñóìôd2R᪪+•þ |œþh²+û>’1jôlÑõϪe­ë¹ÐÍkß—NR¿°ÙD_R(GË÷Û+û’¿3ƯÛ4'…ô•iÂ7`"táLºI¡ J4Ùøö¤/ß•ûÚ“"tá á.þñdãã„£’ñÅÿwB› ‚×/˜óãÓN£­¶´Ý°ÿ/+ S endstream endobj 355 0 obj << /Length 2886 /Filter /FlateDecode >> stream xÚí]]s9}÷¯èG{k,ë³%=ìÁÄãx0@¶v6›¢nÇTlâ¼ïþùU#ØX€@êÛr쫦Æ4§uî½§¯¤npö9ÃÙÉÞ«ÞÞÑk©3tNó¬w™‰åšeR›Ÿ’d½‹ìÃ~÷j4½R÷íSûK§¸,&ÅxXØžÆwƒëƒ½7G¯ΔÌY È¥DŠQsº9gæx©öìÊuù™½VoïŸ{Ä„3ò5ŸÙðfïÃGœ]˜÷Þdq­²oó#o2A0¢,7¿_gݽßöðÿK‘4–˜‚ Í-•b|@ðþÝebÿÈþ— ýû»é |óóÁ¡ù1§ˆ‘%|ùãd…0CóL2aó’pùº 9¢„gi¥³I‘]>`è¢m~uý”#%Åò˜”GCñ£ãâ/G7ä ±r¤©®ìpò9³¿t²ùæ²ò‡²R…H)t©ëìþ¶¸(.­h^¬ìÃa޶c\¼þŸPÍ CšÈt’¸ø@I d×ÊÄ85ÈQ¼H¬£rì2˜Ê ¹¶/ÿiþ²94ü¿¿LÐbü= 5º+úìz?°ßiý¦{»ÚzÛŒ8ºwzÞêöçí0&·ƒ‹ÁlvìltSLgƒ›ÛU:¿lCS§'÷·³â"ì4ßF³«@BW…{àî„Á&ì„J—0.>0aÀdj˜æˆ “BØØ6)†×£b< ÓàKqЈS_ϽyJ>xõ(°ÈåÚ¸¦ÖÉ4[Á‡i' Ù¢ìåZ ªòÅeÒ¯§æ¿þYë÷÷ÝÆI«ßèšjÔo7ú¦|ô7……‚>˜ÿ ¿„ê¡Â<

P(Yÿ˜eÝJó°|‡—Æ6›±gÇMìö£_½;þ=ŒEãnvõu2ú÷ÜšŽWçcŸÒkðÀî”Áå Jº¥‹|`Ê€ÉFX*–Ȥh–šk¤™g*Vê*v#´í¶S©¶‚S N6ÜnD¹d-0Àd#Ü-7¤*˜[ùjëmï´Ùè½ëì°8lqܶvÉdrñ2AÉúE)Ziæ2ÿ1.µí%‡˜ /v øZ:ü2]Û(¶ËŒMñ} ;n³sÉ’ÕÅ&+˜l„¿r‚T¾˜:}œôL——ªNǤ¶YM¦®‹TL6Â1™ù,fÛ-³½4ÎïÙ<ë¾?ßb’y°IÛ&SÆÅ*%ë×h¤y¥)Iùb’OÑ$cýrwva;Ã,»\|`vÉF¸6/)Qo×ø,˜ádÃMœk…0ÍcM|‹}ËPûæjÞq'“Ä*¤ê~%Î+M㪚½ûùîÍyF["w'…´3ɲÂŦ˜l¸ër™#‚tÏ×Ú㈛ •­-·Mv²ˆqñ&am¹@„kÿ^Ó“åþ˜ÀJìlÂvÆÉ$qñ’@ÉúMâï Ñ/ÖöÿhmÌÎS$Ë ˜`²ÖÆ™aJ¼µÕÔÌe†‹Ô¹jÉ©m¹“…Ž‹ 0ÙcQÉB<.fR;±íc2a\| 0P²~(AŒT»;ïºÅâe…®já«~7Ƕ/O×.>0®Ád#¼Êà2QÏÖMŽ„¨ó.z¦m‹˜J´|˜hp²á.Á´Fæ|ž»è+,ÑjLÙ&,™&.>P(Y¿J!Î*ÍóòÄ â)´9)–]vDz´ýl²Xvñ± &n LJÄ—›ç~ü*Õ#7Í”™‹?Vço,· a²@sñ&ad朂è`#Ûfaái/l•L ¨”¬ì…@Ë»?"ŒÖë`/ÓyÉŽÛ>6Y¨»øÀP“p8ÎQŽÉ‹ÃÕåp̶‘ÉÍŘl„Ã1†r¾åžîöî{ºIðR±a2\|  P²þA§åªÚôÝ®'¤œu^E˜[»sú×Çr·v«Û æ‡£ ¯¾N‹ÀÚöé>Õ] Û?Y.¹øÀ\“ðNB¤bûãËêŸ ¤Ú6¥©ôXÁ‡é'a1¸,bžÙ@S®úkEhÅ^‚ŸB•m×’Iàâ%€’õ8U)\mò×j/ÍNëøÅ^ž¥½P9o¿“¥’Ì$(Õpo¡&ÅWî-¹m“©áâå“ ÷šK¤”ö{ËZZñ–à‡€Pa¥d¸ø@  dýnèjVÉZD­ÖÒm¼n=³}ÏÒ(b§„2ÆLÐøn¦©öˆ$Êm¿œ,÷\|`îÉF”?.–Ä_þÖ²d¥ü? ¢œ’+›ªd¸ø@  dý΄VªªÖú×êtVÖ›¶Ô‰bS Xm("m,³ßŸ,#%¬Î=š”Ú¶2YDºøÀˆ“( ”#,¸¿(¬‡ÎJU¾ñ€bÛi&ÓÀÅj%ëqÂÖ¢RUØuïAã8"ÏŽ›§Óé]è¥KõÂ0¸ˆ© ›Oó½8PsmHtë=DÛ>-U`®àÃN6¢8`ŠómÍ;î—Ôí¾ßÞ4o×&ʶgÉdpñ2@Ézh‚ŒV©t×víæ¦äò}º{í|0¾(÷ºÝ×ÿm8­?fŸ\ž®¬úš g\oóf5Yô9ðÀàƒR /D¢Ä÷è¹ùbô[ëµÞ–·(nûZŒàM¹$·mJ2!\| P²þÏ5¢BW*¤Ö20WxziØGŽƒŸrJ¢ŽÚÂ0™oS«±¶Û &‹iÓ`²åE(ÄŠ‹û„Ëm¥&xGá¶ùI&‹‹”JÖ/—ˆñJ²¤ôîZìå`…¶ÁwÓ¢ÞÒqÒí–ßotìM1¼ŒGÓ›À½•Åd>“¯¥¹óº¹)ˆÎ—¢ìÎfÛÑd9àâsJÖ»VgÚò‹¹ºííìdP|º›¬> yé›>q~Úó¶³Ò¤©ó‘„Ú¦-™ .>PP0Ù¯¡qêq“üýÙæ*Áû ± \2\| `²Žx.¶@· ¼³‡`Û³$ÀÅ &!fHà|‹l›ÁËßʶ.©Æß…‡ ?”ªw¬5E‚ÌâlrŒµË¬‹Éàr1‰:*f—‡™|Š8úÛ爃?O§ƒÛQÌüïå+ì0ªc"ë\"–eÓ‘ì+耿F3¼.(3†Ê3ÇÓh6[íò¶ën«ñ—\¼ëŽûòI&HÛ/Füðgæ­7Yù% *û6?ðæ†³ë¬ûàOü/j$I’ endstream endobj 309 0 obj << /Type /ObjStm /N 100 /First 873 /Length 1208 /Filter /FlateDecode >> stream xÚ¥WMo]5Ýß_á?À<ϧm)ꪷCªJ@ÔETžR• $•Ê¿çÌU•zíuüŽçãØ3–˜­7‰ÕÌšŒÞæÄ‡«à+Gà«Mxá Hä¼7í9M«Çhºl“1›i®ÛnöæÜäæ Ìƒcj nZñõ6Ìñ6&ö™£MÕM`Ë·`n Ö¯ÞV`ý‚}½ƒ`ÁÀî`XŠÁŲƬàÀÌØHV4Ë ÞdM¸Ç ^ø‚3½±uÅÌfp§ƒÙ°b–] 0;<ÔæÙCÀˆAóà¾)lâá°¤<°2çÌxÐ @WD0-è•2BÄ‚ÝVr`w†o‚¥šQ÷MÓý´WÞª D1ÅJ1³€Ù#0;84ƒïȘ¦ÿÑ æð¯Ìºnª™@Ŧ æTi¦~‚CU3'ØT÷ cSͨy‚Óížà –%8C“žjº¤²©¥·©ã4Yš‚ îdüªÓÔî+ÊÙ$Ë4¤Œðd&9 fiÛ¤’¹×”~o:4eü4’iЙf:þ­$L»$¡X`!ÉÜ[ÉÑ›1#ÎÁ¤$5“”D(i ì¶”6„Ì3ƒÈ½if93KIà4™¥$ò@ùn ˜Ým»ºÚN/Û5²€óöº¾ÿáÇæAHA‹è„¼·Ûïß¿Ý^¼ø[¬;9‚RÃN2xWÁúZP k)Ö ƒ ‰t-)Z;œVÔ¢àáÔ‘ÈÖºÕ¢`ˉW±<´ˆU2¯ùfj¸JXY´Šj0š5×pبsÍ5œ ÊóRã’˜E^&íE^蘆ˆá>"]µˆ¡Ö‘•#©Þ"í˜4ŠgMgÍŠ¼øÎâ5"s¥–a”&Ê] ”S¯°â`Ö)]¨£…¨`y1±ÔTÆH1G-ÀQñ.cÜÒ¨Ö5¬ Ê^§„Õ ,Ü%¬8f-ÌFV¬VÜó.ûS*Îw·íêªÎ¸ Ðàì‹ÎèåÁm€?Íg¿³±üôêþîÝw—ÇvÝN¯^žÛéÍåãc{b~óÛ¯üpóóe;}ƒ].·è$—o§×—‡»÷ï.{“°O}{ùé—›¯ï>¶ëœpÜèÙÓâÑ\o±ÛÍ=( >ßáŸ}ͶîÉׯ˜IÐ3MœÕ®_êãàOØâ¨ØbçÏ´ˆ„Ö¹„4x±†q«ZÄ"vΣ†íh}¬Eç#5×ÜpNØ‹XE¬R¾;JX=.v‡X9.v‡X>,vGP[ÇÅî;^•v 4¡5E¢s†Šöf#ìQÚ:ÑVS½µT å§µTàyA£2¼s(k5,Ì-*O+Êga «Þ"/ yÑZ”ñ(^#x‚SÌšpð,CpkwCvj#j"žÎElŠ¡hûá{àËŽjµLd`E•q6ÂÁÿ¶6®ÇÏëô­Íî_Ôf×ÿY›Q#žÕf\î}üum~þ§Ú|„E“%Gõö»ÐkJ +½f‘—Ñv«a;ì5/a#C~ð <ÄN#=裱è4j¹ˆ²Z*pNÑk±¨ã¶j©ÀíJ^Lqà¾ðçwÀïíTªJ endstream endobj 422 0 obj << /Length 2843 /Filter /FlateDecode >> stream xÚí]moÛÈþî_ÁouŠx³¯\.ý ³u©.¶¤“ä´‡à 02«‘%$çýï]råKV&顇›^Q¥ÐÔh8Ï3wfwi}ˆhôúèûÉÑ«´‰ 11£Éu¤bic_5‹&WÑ»ãñÍ|{3qÂ=î {îÍ(»Î6Ùr–¹ÿ^¤Ë»tñâ—ɯ~Hh”Xƒ±È J­I"¸ýºÂ–”ö|¿r/\šü3GÝÉѯGÌžD#öÅn?©¢ÙíÑ»_hte÷cD‰4Iô[qæm¤%\Äöý"ýtD÷×E‰QùÛüåõ×–ÑTFZ&$V<·œçÄ$&bùÙ&ÚdÑu¥¥Gíï=÷íß{ ù†¯mÅÄpÓ‚³…Á͇Ƚía7Ò¡$s”tB8ã‘VŒØãõ¿öì¿é›îÏ—ãÎëî´szÚN£é¸÷º_€vÿÑ»“˜Ò㿼(^¸xé~ë9㼇Ah.ß>´³ `ö³ +Ç¡×ïMzˆnç¼ ‚ÇD»L „o ÚÙ@J(çñHF(0L­ãp@øö‘@`­;3„æ·<ì¯òØEŠˆ$:aDÅÆþsqØ~õà«Ã,>aÉKNO8{ÉÕ‰bŒì‘9}Ñ(Ûf›OÙ•‡_åÙ׫ ðÄ»ÝÝ&ƒ{·ÍØs\8qÉ µ!{xÝE8¾:ú J0*IÂt8‚ùö‘Ã:[M0šFåS¦?a”‹Z1ŽW–+[Ø™óå.Û,ݘ pöíz‘ÝfË]º›¯–Û >EÏR>ÚaäiIC•#ä}!ÑÎV26š0—R—òqÔRQÖPQI‹mw9Û|^縶LÆt½^Ìg)Üò¡ÒÕvÞz³Ú­f«0'v7éÎ?óq‚&¶ 1&A}ûH‚¢ŒŒ$ÂÖ#q–ìixµ‚°\í`'n×Ùl~ývòÇì3”é ?¥‹»©˜æ„©¸Åû±­±IÀ È7äÒÕjíÓŠpž‹ßÅO¹ê:»|ûHva­Ö?Áž(ñ §R×h Xä¢%ð¾²€E¸ž@0²øö‘dÁ:[-<’ÛWöÿ—öGbšÿàùYßñ° \µ{#zszqÖì–å³€+;lU²Miá®ÀÆß>’-hgáÍX0"LEG3ÇqzÖ×ô2 ÊAA`®¨ ‚o ÚÙ pJ¤5 ôúÃËI= ê µ`0øö‘0 m5DjYÃàròVw8(ãêœP8ØÇá€wŽƒ2 QLÕà0žœuG#@VØ Äàƒ¡áÛG¢v¶‰&ê¾½X‡$9$ ]Œƒá™Gbtõaàw2&6\àÿ]?†sK2¦¶ö{XÕÙO;%‚˜ØR@î/ H,ÿµ¸:[„YruBïÙò³Ñ[·äþb6ï§Ùfó‚Óãûäñ (f 5æê—Ѝb¦( hûö‘ÔD; ‰{ÇY>ÜÏXì>¯³«ìVdK |‰jü ˆ¹,æJÂ)÷}$hg«ušæƒHýxß  ‰­„>°‡eô ;É„HfZ,Þd>³_Ï<^¬«ðû²LòÑjâß—ÏN§ù­¸?èwknÄà!ªÌ[ñïÃö‘±Ç:[jHMK©uº˜gËÝá-úO•7øã-TGw›Ïí6r®Ò]ú>…ÎSܤPOÿ¹žošN·ÕWÂÚ\Ü"ó¦¼×O>°d/ÚÙÒÛ!}\®‹î´û÷aÝ0¬E#;\ÓíÀ>2þXg«£»KYKê1Î÷›gõ¯Eg=Ü"ØûHö¢m R‘XòRùwGo{§)¸)#…+*‚aàÛGb€u¶:âB’8-)È(ûõ.Ûî “>¥S4Õ3ÅÙf žþ³…ßûZæ–KžÔ÷;àSçwëõj³{ Z¡Ûœa’Ü•_Á¨êÛGRíl¹à6@\•ÊÅ÷³éðmP£àÝ#’ºz(¾}$Xg«Ã͸Í÷ø^«€©dn­jÛ3Ô«Ðàmj•ró´‹Š¸M3¥Û”ã*ÑP$?°#9ÞÙ*CI¨.U™ÓéàülzÑO¦oêżCJ$E Ï<¤«•!†’D&ðºæYiž¨4ÚU­Á(îÛGrí,\i„¶•fbÊ˰Ҁ·ŠØU[Ápðí#qÀ:[õØáF5øJãzu·¼ú ”ˆYä(ÓmîºÊ˜ÁHæÛG’ ílƒdWšÍ*†ÃQ¯ÚvΧ—ý7ýÁßê6ý‚WÉ ™×KẦö‘X`­Ž¼Ô–å<Üèâÿ<ã…+ƒ±Ì·dÚÙ/l¬•¨¸½7Éx Îxîj—`Xøö‘X`­Ž’nhg¤>“„‰òNå—Äï&6ù{?]Ö­°/ÆæÆU¡À8°íluè© LëG÷»×¦þþÄÉ 0ég Êè¨mƒxÆ3…N§,Oì0#H¬ã‡Ï¸ÝLcxR”kÁXí™G’ë*\`¸áöµbÉÖåùy¾®ºFT XT´«Z‚…ß·Œ?ÖÙêp'ŒpÕÖ²­É|ö1k»i-ææï¡£ðFÌõj»³Ã‰ùòÃAš[®sÓæž]»2-Õ|ûHª¡mëùRúò¾A§Ÿ!†ƒñä¬3éÖn˜g¼rUK0|ûH°ÎV]"$ûï,”ØîÒ 0íwó[è³€C„E ž<ØÝ¤Kh™sõÄë‰,;ˆnµláÒ•‡Á(îÛGRíl¥‘‰ iùz¬~÷mw4}Û9ïÕé xI'®D ‚o ÖÙê M$ok:‚½­/æ3àtæ&ûG6Ûm¡'Jw0X°æJ·™ÂÜUyÁØãÛG²ílƒæ1‘±,ï< Î{§ue/§´_UÔÁâïÛGÆëlu´™"Šªo½³t ® ÒÙlu{»²cø¬QCÇ*«‡ÿ+ÂÂZ}º(§® Æ7ß>’ohgä;•DɸjMä`8é ê¦xU$3y Ï:.üHG+Cw¶T’´ÒY§:¸³·\5ZÆÜr› kø Ð|[oõìD}C¦]Œ°¾}$eÑ΃%œÄ¼|ÕQwòó°;íÆ—ÃÚ}[àÕ,vE0|ûH°ÎVÇ\3ëo=LøÑŽÙþ1šOUf ¡­>>)W”c­oÉZ´³ ´#¶dd勘Ɨ@õ¯XdÒ3Ápðí#qÀ:[uiˆVüY>Ê[i¾ÜáÉâÑú<®& FZß>’´hgˆ‡Hˆ6å3ÃÎYgÒ™¼’qW÷Äëluäyþ—²ä³€”‹Â&]nçà†GYé"‰q›‹*sµf0âúö‘ÄE;Û@DXL]¾²j2êx=%£®V ƒo ÖÙê SE kw'(Pf›ìÊž=O¡Ï¢¿I?ï³l m‰~Z}|øœˆÖ³ÞUb(²yÖqTÃ: Ïw#íG+6cž÷ºýÉtÔ};xÓ­”¯¡L\y ß<¬«•O1¦­½˜§MÓ÷:ÌòÈo¥ M7Oî?XöGJ¥ÅÔ=º»éß(ýˆD endstream endobj 419 0 obj << /Type /ObjStm /N 100 /First 873 /Length 1208 /Filter /FlateDecode >> stream xژ͎7…÷ý~Ô­_ÿH# š]$DX@F,FpEB3Ñ0Häísê’XQ-=Ýß-ÛuÊöilHãfC›;ks¢ñ&¦h£Éèh{SYhGÓnhÁð@‹g!Í&"¬8lJsó‰hþ…‚›Þb$­K í­Gr£ Nn¶áÉ­6¸Åmâ¡?sŒ¥m)¸emup ócIäÀÄWGgaZk4ÇÜñ‡²µš¨qsft†΂åÉÄE§c²˜„8wtÙ}¡ƒÈŽñò©„ t9r…ŒÈ]Dî° ò;s’€‘'ÆqAäéˆ#ˆÈ¼¦2@iIK¬¥×*±â”î Ä²QpM‰¥þ/!®ïïÛÕU;]Ã¿àŒ¹üæ¾[ùï>Œ}éÃǃŸŸ^<Ü¿ûåüØnÚéÅóëvzuþüؾF~õçg¼¸ýí|œ~Â(ç»ÇioòçÇéåùãý§‡wç|ÄO~>¿ÿýöÇûÏí&Ä þ½Í¼¼×[Œvû€(Ó¸àß–š^öëRÀ’÷ËĦfûouüþ’—Ñá%V‘ Á_CVbJ…í`Õ Û‘f¾ÄÂv׿ G‡+¿×Ø +1GPRgíNøz¨±a¸òk¨+åe‰58‰U“¢+S~ç”X^”Q6àccÜ·,`DMŠÈSÈkóMw»;…öquë¨öqe먶,óÖQíXŸk먶ì˜[GµeqåGmºž-×Ê Ÿ¬pTµ2Ã4UM6\2[GµeE·Žj˲lÕŽµÅ[GµeÇÚ:ª-ÛçÎQmÑ[GµeqçïÕ–ÅÏQœv/ |»ÀQÕd3Üù;Gµc—þÎQmÙ)[GµeS- ˆ¸uT[ÖçÖQmYµeµSþÇK‰|AqM e‡¥únýž{ endstream endobj 486 0 obj << /Length 2977 /Filter /FlateDecode >> stream xÚí]ßsÓH~Ï_¡·ƒ+4¿¥‡{0‰oHbl%wµå¶’èpl¯ìÀæ¿¿‘'Ôf¥g`® ppäÏíþº{º[=ã8ºŠâèíÁëüàÕ™F)JQ~qDJ#™ªG‰£|}z6¹®6×Õó—„ÇÏ£¡þa\^–u¹œ•ú¿'Åò¶X<ÿ=ÿíÕ›$Ž(hȤD %êívXŒ«ëeòì•~ ,m^så`uQá¿d ê•<šÝ|ú=Žæêw¿E1bi}Û]yq#B…úyM>Ä÷Ÿ+F)o~lÞ>D¦HÆ,’,A‚“¹yž 4I#Ü\Fu]Z‘~ˆ/¹‰ÿ]J—wxˆ%PJRÂîë«Hÿ0¾§=eš%Ö°$D0‰$ÇH=¯Y7T¦ÇG‡Ól<žN²ñÅð0›Ž³‹³ãìhÇÚ÷wˆ>½qüì_Ïw8}¡kHc2|Ï•J_,&>¨°v­3uerïl¯ÝEÑ$z‰©~úŸ÷ oSÙH ÕGúëÊümn³ç5š®ëbãváç²\º]Y—_W_ʹi+]É=§ù”*øãxiûú×ÛúÎí Š«¢rŒ%‹b[Ö¦,$NQ‚ùþH’<)ÄL!Êp6lâm,l@'ÇûSÃ÷Ãì4Ÿžžå³¼+”`×P¢T…ž£¡…£,¬Ué"•3±7”H×Hr᤬¿¶üçÿd_ ‘ûâˆìFD¢J•4 g¿&>Ð~Áº‡‘„ÙYQü8Žç8"wõK0 x @Qí*—’xÊGFÅfómUÏ=—åŸëª.Ÿ!f×Åòªt{—u/á·+×"gÓ ƒáJ÷”yLL„Ð5a0S6ñ¶ ¶GD ‘ïÚlE”ãìã4ûÏh8î®p¨s8ẚ F‚‰$*¬]åJÔW{bT—-n:<þYq»½VõP5+¶ÕÊq½¯–—«ú¦Ç ¾¹F­j¹'¯!#J}%‚êŠ2˜Ù™ø@³ ÛÃ÷A”ã½¾?gƒóüÝôÍ`ø¾Ûý™³û]ãÁÄòÖ®õÆÀSâÉÿóyÕ¸¦¾Yà°†âE]þqû8Í ªŒfJÏû‘ëÂ-˜¥˜ø@K ÛÃcI¬tM;=vœ}8ÿÑ’Í}6ÖG0&L| PaízW.“̓ώ••›mé˜Hoz´Š¥kv^;¸væ­•_}„Øc†#¨Ê(f×­H‚9©ϥŸ§ºx e¾-|˜ùÂ…u$ɧ瓬ù;&Í?]v CŠÐÅK0&L| Paíš©šÑSf¢8só´ÑjQÍî\|ÿ-g[ÇžÀ¶.–›Ê97ZÛV¥],|&\lÁ,ÍÄZXØ^Ïû~4P•ÈéY>޲¼»Iœ}žéò'&> ¨°v½3¥⫃8p¯Bª™ã‚jãùNiñµ¨ÅçE«y™J™ÕîÑÙ‰®ô‚™˜‰41°°=œe8ûG¡&‡ÓóÓÁÅ`ø~ðú}ÖåëÎÃŒë %&>¨°vµŒ’Ø×8Ôp¹-¯êjë¸rÏ®ËÙ×ÔÛ±—PÎ껵óú~Y• ×KU„xÔ›$\éÙkG!Ö%\0³4ñf ¶G|P¸ kM8_O£]ˆx=8šOóìíx˜ìÔyȉ¥ºæÅD ÆXX«ÞYš¢$ᾦ{´÷$±R^âÑáX¢ œ`4›ø@šÁº;KÔSDØ.?ÎnÞSçY •g4É~0 x @Qí*—R=•xéßõñ´Ÿ2Pøp_—VºL f2&>ÐfÀÂöð\!Q§]ž{úñ¢ËkGn×Y{0L| PaíWâÆÜïí;¿•páÚK[/ŠV7Yžß5—é¢#˜Õ˜ø@« ÛÃsGqŠmž;ÎFÙ kô–:Ë0ªÓé`˜ø@  ÂÚNÂÔ×°L~]ú¿;^mÜïq_­ HŠ0öÙcXÁ,ÑÄZ"XØÁ€P„%µƒ¦û}>é ÎS8,Ö©~0 L| Paí W*Á씺Îc5æ\=øgM×à4U9Ïc4mÊ¡p½°>Ì,áÂöˆ 1F„óŽ^ØFk¨óh Mt1ŒHTX«ÊiªäJ…·mÃ+ׯ÷æKùÍuCŒãŽ˜«º,¶Á7ýS¹«‰‚Ù4¨¨î®«”‰(•6×gÿîr[çñ*t%Lý&>PÿPaíꉲßÄÛí­Ùª®Ë™k[ÍyùŸÏërÓδ±Ýë½gÊu±Ì&L| M€…íá”\"F:–ÓÁÑQ×Tuž0¡LçôÁ(0ñ@…µ+œ Ä„¿=j«íj¶r>-ëó^³›j³/Õ¥ª ”^]“êÒ#˜]˜ø@» ÛÃ5)G<îòÍ‹l<žv¹§óP%:±Fƒ‰¤*¬]é„!Îü …ôø¾Ù\9f»wëÖ°VŠã>ÛÔëœ?˜5˜ø@k ÛÃ)1E<±ÎbœLÞNó£®9-æ|lIuŠ„>Œ°°v•Ç âëÓ‰Ê6 ×c6[U/Þ8ºïj^]VŽ”óÞ4&‰ÎëƒY…‰´ °°î®ITÂ:µqrv4|3ìÙ`ÎRDîÒæ`ð@ €¢Úõ(ߊå¯ðËÕ­cy¹ºt¼®ž·7Qè ¡sÿ`fcâí,l×)’,éHuÏÆG»›˜ó´•Êwiu0L| Paí*ç ’‰¯ÝM“u9{¼úù)D]}øKy÷÷ÚBáDš0]³]h»`a{ÖœÝ;Èqöñ¢;‚8ªk€`,˜ø@ ÂÚuNJ¤¯’IŸMPήÞå½ÝEˆ®f‚‰4°°=\¸‰–¸cæCyp—û:|¬ë„` ˜ø@ ÂÚõ™ºÒ×ÈÇÉíöÖõ„§•¶o nFOmµõ3ôX×4ÁlÃÄÚXØÞS”¦Ö¹‹“ó|wžY—ƒ:Ï]àDW¡HháÃH kU9N)Š©ø57poú”ãóªnû²òÏ êsñÄR-Á,ÃÄZXXw÷lŽfˆ¥ìȆãì0ï¾[Äœg,°hòíp<ð@€¢Úu.1ÂØ×€Å`±-ë¥Z¿–áVÑ›r{½š»î‡Ø{$¡÷3D›U¼)#‚Ù’‰4&°°=|ZÄsë^¦“,wÖÙÍvÍhÎzhRï`˜ø@  ÂÚÎRD~Ír»i6>-]ËßåíÍg׃»ªåÓüƒÍ˜êª#˜©™ø@S ÛÃÛ©zd]¬Iö¡ËÛ'=0Ñ©|0 L| Paí '‘„zÙq<\ëu½Z×U±-Ÿ8ÄîïŽÙÜÞü„¸ð°³íã[I0Ö¥N0“4ñ& ¶GTÀQb7žF£éáñäü¤#4pç‰ë2"&>¨°v­ÇÊŽ…¯‰“¿ñ~¢9ÑÎk-Õ5Q(2áaöÕÝS†X¼w2åái~Ù¨û4?î<ž’èÊ! &<Œ¨¨V'1&½L°Y¯–›Òóv¤ÏÕ•çMËçG£ö–ÇÝ_ST—Î_eö­jEë•ùá¨1Ä*+èÑ7¸ᾯ[fÊJô÷Gôý¶åÿ.¤s, endstream endobj 553 0 obj << /Length 2423 /Filter /FlateDecode >> stream xÚí]]oÛÈ}÷¯à£SÔã™á|E›ör-K^ŠN¤ B±éDXYÉÊrÚ¢èï GÞx(‘új\5@²LÝsïÕ™Ë!ƒ£ÏŽN÷Þ{‡'2‰”*¢â&â‰$Žd¢%‰ŠëèãþäËìîËìÍåxp‘Ù'yuS-«ÅUe<Ÿ.î§ó7¿?ž() (bȤD*¦úíj,&ôñRíÚÊó7{i±÷ûÑáˆüà@õ_òèêvïã¯8ºÖ¿û9ˆ%*ú{}ämÄ F4úù<šìý²‡×Ÿ £„›§æáô1rŒ$f‘d N ²y¢D%1G'ѲŠnZ‘žÄ_3wñXú¼Ãc,šì€l ¸üÙ'ùZö„Y•˜QI*D $'H¿nUÿ)Óÿʳüm™æy™§“‹ñh’–Åx\¾ÍNkÙÞ"úx 0Þÿë›úÓ?Ûß:t\‰×BÄRŒ…ÂÅ %Ûv¦Tëj;4±‹8ŠUt@‰}ùOë€7µ4 ¤þH?Ž<­Õrvå´åï¬dÕrùu¹MË¿aŽÛÞòãþuuwµœ}[;.üÞgæy\Õà²ÐNbUýcÕ<\Ó&u)fˆi­7bhB«[Þ£—}³• $mC “­.>0[Ád{´#LéÖ¾qšŽÒ<;êh{· ‘ÔÉL(”l{¸I‚°ùvÝI»8™UókÏ"¾ó;nõõ«ßó¯‹Ï~GÞ4ºTû{ñe9»ý6¯n«ÅjºÑÆ"J¹ƒoïêYÍC÷#Ed¸Üuñ¹ &Û£y`…Þn:N²txlÇp<êr‚ø¶*¤¸ &C&˜lkÐE"abk ‘¾d}`^ÝUËïÕõŽ ùâ,e…+:Áñd“æU)û¥Pz‰‘$á²ÁÅf˜¬Q %QÒ-Êã#S”ã¼<fé¨(Gã¢,òËI‘wÕ¦÷j@/8QÀÅ€ ÔHµ=ð’#JÕŽ¾ÛÿK¥¹›oL!ìª(X>¸øÀ„“íQœ‚!úÍâ4Ï<+3ö®Ln ~0)\| P²í×áˆÉkmꄈí$XB¸øÀ„“íQ›Œ¢˜“–ÚÌFïÃ츜tÎÏó®Kj½s0\|  P²íA ŠúZ˜:#ˆ5öÁ2ÂÅf˜l¤±8ÞV˜åYú¡k¿Og]uɽë[ûL¨”l{Ìq‚˜d¯uÉ"žX_*#ø°Œ€“õ¯KfÄ ßZ—Gi^d'ÙÑ HËólr>(Ž~êªOá[Ÿ\YL ¨”l{ì•Nsgfòü)ÐÈsä[œ~N¿Ogóé§yå;sö;îût>»ž®0!Àd{T'ã'¤µ:uIfãQ9)Å夼ÆïG]5꽓ŒÅÖR“ÄÅJ%Û.@̉_w¬˜Œ Öå˘`²=Š”ÆˆÈØ»HïÙpðvØùeê½µŒak¬ƒÉââe’mPýøº…EgDœËnLÔÀ‡eœlBÅQÞ²…e}©ÄàÜk ‹ôÞb+k°ƒ©áâÕ€’m}œh^‰x­O²öýÁÂæ”ªqÆ2Aq,·ïû4—JøV¦÷æ²XXsL¨˜l)„B±tÏ™“â᪲ñq§u¾ñçÖ[‹¿‹Œ?”ìf´ÿ )[¯0þÝz¸­½ÁKùÛòS¹í~ûñŽž~¾üa€ûzJ1"J½„¡'Š£˜&†þöîs3O„1°,œ™'Üø±pm¡ËI8Y?O„6;[_ÔÏf,Y¸s | $P²­}™pí}¶¶n@Ûoùx@$ÓRÜ/îïóшèu3Þé®qG®ß7ðBBɶ ³ÉŸÜdµ±£Š´Ë¨ŒŠ¾?psðÅñeCo¥?#;ÛDE¨ñá6Ô5ðjCɶ«M¥Ï)[ú„ÞƒûÕ—j±š]MW>ç,Õ³hÞ±óZ’$ p-!ÆÛ†;åÕÀæ ”l{žc»åsò$~"OÒÅ•m Óåê7O°6àÛ‰Ì Õö$Áf© ž“$ì ép‚¾˜ 0sá€{k]x˜ŽPª­:&qœììôöï÷•樓Þg·g‹ÙjfïýïqW‡ßD7ÝÕ+Íú\þî2HÙ•H¨ ráa¦ê?·Q 5v«œONë±Í`b†6]£ü‡k˜Ö¿Ýöÿ60MÞÞæ«ïÛð_Ìh, endstream endobj 483 0 obj << /Type /ObjStm /N 100 /First 875 /Length 1198 /Filter /FlateDecode >> stream xÚ¥—ÍŠ7…÷÷)ô©+ÕŸJ0x‘˜ÙŒãEãÅà\BÀx‚=çísêbÌdP'…6]·çëR©Ž¤>­SZo:µ)þMk¸x2pmà–Îh<®«±KÓèMúÄu41pÁM–”‘Ið|X3Îël.¸‡œžybµ™yVoÓ×Ñ¢;®ÜÂÀ-i±Pþ/‰“.k+’C=DA}&mŒ‘èB`³YïmpE`Hë‚éˆ Psž¬[Ê #³zÂÈl=ad6ã–?†adÈìÚ ³‡"@æ‰ Ú@æ9£”ÃO69Ü¿ýéòÐ^·ó‹ç·íüêòù¡}Íüê¯?/øÃÝï—ÓùŒryÿð;ÁóñÓùååãý§o/¯›ãzëÇËoÜ}ÿ¹½Î¡m1ÖWè Xo0ÚݤÀf¸öxª8“¿Nõ;ô.ð˜A]6Ké1ü¥/8°1D‘µAKk¨vZ1j¬têÌ5v,ê.5¶^«×פ<Jl8˜5vBIŽëJ8¹k¬ I­½®Lù:/±2GjåN*5)¼/ÊX…µ”ïÛ“ÌjRàÀ&ä®±näÅ„×y1­ M®I7;¥›*±Œs¢×¤€ï¡Ðš°aQ“n×v(­bÏÔ'õ^“BqíÅrÕ¨¯š*JCjRÀQИ5)t0ñ(JÑÁ/–XYxÕ¤€·"‘Ú’Y“ ´Ö2Q'õš°””_%–•Ò¼–Ø‘N­&…ôtj5)`®É½&¬Z¯I÷M­IÁ«µ„Ï Xµš,iÕjZà[V­¦¶¼ZM |pÑZ5-Òw©i‘n¼ÏšéÆÇ¨i‘vŸŸ5v¼ÖÝ4ã¬5ÕÒŒsÔ”H3Ž]TcaÆÅkJÀŒk÷o7ãßhÀÍä©7ÿÏ€çWí#ŽC/Š#þø? ø–Ýð-z`À·ìß²|Ëð{dÀ·ìß²|Ëð-»7à[ôÀ€oÙ¾e ø–=0à;öÈ€oÙ¾e ø–=0à[voÀ·èß²O øß¥®¬( endstream endobj 614 0 obj << /Length 2653 /Filter /FlateDecode >> stream xÚí]koÛ8ýž_¡ébÂ’ŸX,°ÙÖͤӤÛév‘- ×Q£±ìÊv‹b°ÿ})ÑÓ–²©P¹b‹ 8U¨ë£{Ï=äåCÁÉM‚““ƒŒ?“:ÑH *’ÑuÂ:M¤6Ÿ’$£«äòpx;[ÝÎQŽû§ö‡AvY>ÍìÏ&ùfr÷èÍèùãg 'ÊiiI‰TJÍ×U¶˜4í¥:|l?(Óå=½ÑÁûbá„|Á@Í<™Î.ßàäÊüîy‚Ó*ùXµœ'œ`DSa~¾K†¿àísa¤yùcùqòµåIÌÉœ––Ëëi¥R¶ÖI‘%×^K÷Úß"wíÿ‰2ä¾¶%¦¶ ²f6&¬Œ‰TˆšHN¹^Ååq†„£T%Gq¡íå¿TÑÁ¤â&±? NJÒ<Ñ—–ƒlµ\ä«l{ÃÐî—GãÃõ"¬Ýð×Sóo|6<ý«ßǃÞïa·ÙûM¶Z;J¹qß}Fûè_]}lot<ê²tË¥Tš˜³x\rí¹»ãm?»˜¹Wý)!{âØwCc£ö·GÕ!¿„úŸ $­JÄñ¿kè(X¿·SŒ0¥%ónîxízQ„5œlÖ·Y¾žM'ëÙ"»çíd•]…5 59:ÕDpDt§¢`,JãÒh¤tíI ÛBˆF¸ì…ÑÉ®º×T«fH/®}` `ýîÆ üSuñûXвO JÓ.ÓÙD)®¢±©fÆ&8ØðtZ"ÂDC:7vòih: eJ­ãÀµ ¬ßÝJ ¢dGéãÜ–$ÑæÚ ¶Ezs†ÄþìîN_5ewðžÎluÍù®} ó¡`ý®fÆ”üÄÙ½/YÁS¼¦~ü8)‹Íi‘]•{6&w«šdH†RSPt(Ô–(ÑXëÚ² ¶…d¤ÔpqÿôΓAïi“fï˜àÄ–+ѼïÚz ÖïkJÂéCª6šQöƒTmØ–+Ñ‚éÚ ÖLcE1ö `r$¥2ìåÓãá [ö'EÀŠ8)oÉkc´æ¶þÓ‹zùÅLG)º\gÚÖ±xR³ã ¬—'Ì$ Ršª¡â~žŒNZ…þ˜DQ¶PŠF×>(P°~¢(s‰ŠEÊò§YU7Ñh☲ÕO)Í%uï\áÎÄ U÷Sä·âmYˆ„‘Dt˹—"-'ý˜°EY4Џö‚õ“DH„±~’è š<1•Ûw¡IWRÂmÕ(®} Q `ýD1p1ïh£W¡‹Çžíe‰ÂÆwªÃJ…1[oE‹²ke0Øð¢Ÿ1Ž°Þ¿é«7¼4Tý)õ~j ¤hÞwí½»ëëÏ0"év‚å?ÍSrö0ìx¾ºYZÖgÿêx*‘â_͆t¶}¦@*¹ŸÕÃ)òÕÉÛíÃ¥ÚXÕÛ1k–?"øp3·§o·Ï’OæÙøËÓÜ >•Æ2&ðÍçsÓrY†Å“þš}-á`Dá3psi;9Uì*»Só,71ß#„†¼Zµˆ'Ó5ûÀˆ@ÁzE9åfh/»ZQ87y8µ_—š†q\à€ï]¾øXò‘r"®ÓÞ=­V`âõ/5û@Ú€Á†÷î)3ÃâNéŸÆç¿¿üçyC׼ŸV‹ñ6jÖì]ëwtZŸ»Ú¨ù||üé64aƒE`qÝñW/‹Y>-ík;Žo¯ÂÚÍw"<}RßËrøKóØ+´viµC¶¾®©9RšuYɦ՚R¼Õ˜š}`*‚Á¶PAZÖ8¬®‚ýÁéù“Ó~ýÀ‘»5X«5 xS’5û@çCÁú]Mʧ«y„aV|˜Mef’‡¾ÀÁ(Whâæ³÷›,TVëI>}ÀÎwÅÛõÍÚ·m#ÂAsZ-DÅ[f©Ù‡‘¶…Rà)ëJ1¼ŸžGM; B…‚ªª¶ŠæzÇ<Ðó@¨^7SMͧú*ñq¶¾ ky»„…­ÂÇ6Õ’uv—gë–žbº˜Ï~®üÔýp…J[äFË×>0À`ÃEˆ*‚(×ûDè×F ~϶,Œæz×>ÐõP°~GKŒÒÿ •–"›Ofù,¿ ܘ¹˜/y–¯W±ÝRnKèh¤tíI ÛB¸F)#ûôàu³ ¿9ƒ2[!Eó½kè{(X¿§™2äíêív-ЇÓÚîÚ2.Zw™]©-Ì¢EصŒ0l‹ìJ%b4Ý™"=mÚïü² JmAÍí®} Û¡`ýN¦1ÑÕ âzùtqzŒýu}L‹8ÖÍÃá§³ÕÚt³Õmè—ìTÛë—þúàÙ“}w˜~5}«ì'¶ìŠFF×>Œ`°-4€pà ^×€×ã YÂà×ZPl‡öÑ"àÚF ÖïoÌg⛯o†.\/Šy·‹%óQ?p Ý Ïï`ªsÏ9±Aô·½ oûy¡ãï׋E‹¯0†ÖAj$y—‡¿ˆ.K¾XéçX‡%h¸ø"®ÔNya;>?>k:ü®"m Íñ®} ë¡`ý®V úÐsàæƒÖY±,f« &G÷| |‡v Žùd¹ X…6m¹Æ¼ë ZnyÒJ°Åd4λöœƒm!8’ ±³ÆÒ;õf°5lºã”p[ÕEs¾kè|(XïF>"Ì`‰6;Nk»4Ûï9%¼Ü£Ï¾ÅžSBtõnPÿžÓÅf½Ü¬[l:%å  Š·ç´\ùŠx,Å5£%jø†S]Ö_ú;l8-—Z"þpÍÆ®ÐÊ”gn5üòbÔ¿U§Î/^¼Ø9¸ý徿¸Ä xûÊʶp鿇4• endstream endobj 674 0 obj << /Length 2546 /Filter /FlateDecode >> stream xÚåœkoÛȆ¿ûWð£]$ã¹ÏE(åÕÆ–’Þ&H„"Ó‰[Ve%›¶Øýíо %QCN€¶@92uüò=gΙ¡ˆƒON^§Ç}! %•Az‰dÈšWE‚ô"øp˜|žÝ~ž½¤vƃò‡8¿Ì—ù|š—ÿ=›Ì¿N®Ž~M>îkhP²" W iFÍŸ[ÇâÚ¯ôáqùByX|æ Jþq@ÌA8 ¨ù¤¦×~ÅÁ…ùÝÏF<ÔÁoë#¯A0¢LšŸ¯‚äàí¾;/ŒBQüX¼œ<̶9îEù†õ§ítޙΔ1‡û3ÝŽ4,¶éÜ|V“®¿ONG'–ëfS‰Tyíø1ÛŽ4*vÓÚ&0”–Öþ~ça51Á‡—ã»Q.»ùºZ|]­þ¹È« ÿÙtj^¹|ôFš4ó»Ór„Ç~]ŸŸ!äqT½;?©5ÒZ•ç—Ï>üz]ެw§³˜\LV“ìñ|öÊ—Šš1–Bä×¾R$óÆf%>ŒM¸X‡àA8GúÖ"aù¥}ÙïB7Ÿ›¬Û´®ßÿ·kÊFBùš+ñ‹uš¥1HKj ÍãN–ž$Y½Ýfù_ŽÖ/ÄuV”,D’ø¨+ñÖƒÅ6°ž›ð˜U­†Ý,œEIÚ9×$€:'€å•ô—;>0`± ÀŠZW0þk–tNÓ뙳õ¤(²”?ëíø@ëÁbXO‹ŠPT­£$Љz5ÞsgïqQsiÞÛñÞƒÅ6ðž%£Ü6îœïÖƒOMÄ‹?Ž‹_ÄÌðòÒÔ2,Ãý©ü FÊ8ñøöß°À;kÓË|±Ì§“U~Q-HÍçÈ:¢4ý»±góO dÞ~òî±#"H©Ð•ø0:àbÝéaˆ°TU:’ΰ70/Q÷<Žu¨t½@…^ƒÞ2`…&*µÿ¦á!Xoø%ÚËR9Û®ŠŠøóÝŽ4,¶óJ!Âê󣤟õºuÖkgëeYñy³ÞŽ´,¶õæo’ ç»ï_GqÒéG.ÃNèœQV}Þ’`Ç&,¶A„0JI5 ~ÂöÄ;»ÏËÂÏ›ûv| û`± ÜçQµÑˆGëÒÁ°?ª³ß¹¬¬ý¼ÙoÇÚÛÀ~Æ#|³ì9˺?uNO£áIÝ@ècUl*yUVÅjkQ¬\jâÛIu½ë¾´ÝvôÍj±³t.2êM=÷•³jX8“²>ôFHXl‚(ELˆm™¶v<&µ±ÖÛ*/µÔ}á²Èõ‘XlˆH‘üÞ|ü&ëì]åq3‘‹Z|™Íg«Xp¸©ÚÚ‡eî ‹J|p± °Àq¦vaQ·LLÄ?zÝx£Â „*Õ ®CÄ•Þ]0Ò:*Â*Œ ˜´@Å2_\M¦ù­Û†Þb’åÅ`6›_ÞìD‰0ŽøÖ¹ðÙ,©²Éñ“HXlœÌ«ØìÁÏÓ}£î ?ˆzÙ›_†u}un¹,»oi°ãÓÛ R¨·‘½AuëÚpJþŸŠH.Ê–ÍCv| C`± *No,äœDiÖGgY1Cô²^'íÔ±ôØÑ;†I0KùõÇü⢲˳s†˜ÍÝŽ[ßGâvhq£ÐœkxÙzÔŽ,¶ ¦•Ü^ëJ{†Qw&iˆÑ;˜4’›Aé\´Ôdj?¬ZáXÙ zÈŽ,¶@æZ•šm›&Léãj‹¢ˆìlŠš€ÔòLÙjEËöÑGv| G`± 8*nd¥kvÓ4ǃa·¡­Ë-€ßéròÛÅäâÕå¼ü–ÁS4Ðî}ºù¶{JÃÔœf{k¿—-§7Žìø@ŽÀbpD¨Iµ¬Ý=¨kÇn<ú’Ï?¿ZÜ|¼ùÞ€¦éÍõNšB‚¸hszcaÙrú©†\lœ0A«º­„ZšÈ¶Í(Péî¦6‹m¦×³7–¬ð@” RÝIb!Fšo.¾Kãâ&ïºÅNö.oKûXq~›/¿¹¶hù÷Õrâvè†ü§Ó]KP©²“öF•ˆXl®Tˆ´7:¸7ƒá ͺgIÖâtÐt;i”ÔÞ9ò€¥ÂèÏĬ›/W³ËYqi’¯Üº\VF¨Gš3ª°¶n@[ÀdÙ{cÍŽd ,¶kҼŪ¨½‰_—5ú`Ü9­Œî­­vf—[ãål>-&WÃÉuå«sÊ$½Õ-/&Ê× v| `± ` …Šl£!Ž:§gµ$> stream xÚ͘ÁŠG †ïýõÑ”¤’T‹‰Ù[À8>$Y|Xœ!ÌnØ]ƒóöù5 ‹w™\rêšž¯Uª_ª®Æ"Zo³Ëjs6›½± ®Ü8Wi" ¦6q`s4í«55ÆÕ›.ÛlFºðÑÀÚÄXÀ­œÜâæl¸JsÃwK[tpk´ÉY‹•œ·©ˆ·¢ÍHn¶%yµåÖ¼#¿ÞH°›b à1G8æÑ1 QïÖXdbà„lŽÔY9á‰'¼̈<$À²x\òEÀ"gǪOrd@Fœ¬…g²mΈ3±2‡Z¼‹#m^X› 2\P bW¬B‘°5aIØ1ð„‚#Ç4"66—…tpíMt`Re  ¼£R2pÛ‘G`ŠÈÆ #²yˆœJ¸F–“*"ûÒÍQ0 Üv¨&‘+ˆ<‘”c™x ò‚Ž&‘e £ôuðÚwÜv,R;*ïOYæ–Ó(§>Ö› ôs¨ª’ú˜4ÕÔÅSM} =¥©!òH} ‘GêƒùÔRCdóزy4‹æ(žf wDvô‹cµX;":Ôѱ:%aDž‘pö+'ŒÈËFÇö±Z4VƒlT4î@— Ê‚AæƒCR–0ô;¾wl’1²£°›ÆÈŽÊ e¹@<0lÄvuµ^¶ÃÊ{{ÝN?þôs3'”{„i‚½ûðþýÛíÅ‹e¹Ó„Üv¬E ”Ø9i¡ÿJl-(Vb=(·j‰ÅµÓFÝRbuP¾ÎJ¬(qÔJ1XH¸XŠÎ$V[›®N²j¥ÐX¤Ø¼%Ö'aGÔØî$^Ì·#ßYÌ¡§¾5VVê[ËWfê[k3‰Nµ #"é¨u™ ¨;k]&„N+±FZK=›AŠa!®TãB\/Æ5ˆ[|—±¦¼µ&ÃByÚ•XNykMÆhôQ|—-#ûç«ìúþî©]]µÓ5^ô8þ/Ï\Ã@Áü5†¹±çûyf_ÆxüôêáþÝç§vÓN¯^^·Ó›óǧöùÍ¿ŸñÅí¯çíôf9ß==âùøvz}~¼ÿððîüx9—.·¾?ÿòÛí·÷ÛMN 3E‚si.ë-f»}@8›KbŸ,5-ÎóR¿a§ôv3&uýrC}ÿ­K¸`Š"kLkÔÐÑiM®±Ú©‹ÔX^Ô]klŸÄ½–/ìñð;xç¹Ëâ ¶Äú ´&%ÖtïͲ‹¡tú%V™tÕJŸLCk¥€ß£t·¿ÈØjì 2«•ÂÂ)”X7òâ2äŰC)¤V S¡ðZ)ŽLè.{`B÷Ø#ºË˜Ð]öÀ„î²&t—Ý7¡»è Ýca hE­Ë´Ì¥´µe¥ù[µêªAÙ(.k@Y®u˜j*[ÌARÚZ‡)§¿¯•ìÈî±Gþs—=ðŸ»ì®ÿÜ%üç.{à?wÙÿ¹ËJ¤Z%ð©V 郬xZòRÊ?•J,6Zþ[RbƒÉkÍÀ8}ÌŠé¢Éò¯´»ï?÷ØÿƒÿŒ/ýgüWÿŸùOl$ü†9ôŸñþ3êþ3¾ÂÆžG›4?-ãŸ> stream xÚ½œÝoÛFÅßýWðѶ“ùþÀbh‰rTˤJÑYAA‰h‹Ý$E±û¿ïˆc'¾²JÝÙ›)`€²,ýÎH¼G¤Ä«¯.Ï.†³—+ªÀ‚•¶î+c™ ªr!n¨†÷Õ›óÝO?úéçßIÃÏëí:]èïîï>Þýöî.ýzýö·ßßþòâÇáû—+Ï+­Ú jç˜W2þ»IK‡x{çÏ_¦Œ¿Çûœ5ÃÙ¿ÏD¼¯ÄW2ÞÓTï~={ó#¯ÞÇ¿}_q¦ƒ¯þ˜nùkegRÙxù—jwöÃx\œ³¿¸ß\>UVÌq]9í™5r¯¼¿^²àC%ö·ÕÇ»êþO•Nê?8‡ú.1ÿá©–eA†o`vüø¡Jú‡ØƒN)é}JÎ3)dåŒ`ñú”ú«uüû¦Þ\×ëÝu=,^Ma= Wo¾³œŸÿãÅ´±K`®ô•‹”t9úPŸHŸl6ƒ¾Ž÷õà_´õuƒÁïÐø¥e.=­Êà‡úDüd³øg\J€¿íÚ ¿Gã†9gËá‡úDüd³øE`|¿Ïx‚¸ÜõÍv¼¨—ãUs;Ün›™:®™®\PŸÙlFÜ3ÁáëÿÕr@pl‘óÆËà@Ÿ–Ý,>Ú‚ êmFóUå"€úÄÈf3"ð– ïŽDðºé׫ÛqU¯7Ír.‰ÁMW± €<1ªÕŒœaRúg ü€}(4›f®b@}bd³Xͤ pwÜucœ„6›ñâfµjú¹4:“Æ®b @}bd³ D@ ¶e|ýyÝ,ãàks!t* _ÅB€úÄÈf3BÐ’)SxÄ¿©ûËÙW!t%¶2 ^ÅðC}"~²Ù üJ0`'[ô·Û¡›¾ïf_ÐØŠ4r£õ‰ôÉf3èKδRÇè¯Û¡éÛzs:t3¶<]Åb€úÄÈf3bàikÙ®[\5ÃiúèRlB¹JÑ?Чѧ›ÅÓ7Á3#  ±n—'ÙKt6>ÍZÅØC}"{²Ù öÞ1c`Û5íñò/Ñ=ظiÎ*ÈÙS­f w–Å¥p,`ñzÕw×§á£û¯±i¾*Fêñ“Ífð·†ÅAî{7Ý®9 ]~IÓU1øPŸŸl6¾ÑÌúÃ÷AÇa}Ýt7Ã{tí5:ÍVÅØC}"{²Ù ö:’âü¶Æ«¶ûg;®º>–œ ]}LÓU±  >1²ÙŒ ”dÎÂî5 ·§_е׈4ZCõ‰èÉf3ÐKÁ<‡Åër¿þû‹“ôѵ×ð4\£õ‰ôÉf3èG]¯aßzU·Ë bß‹n»:¤ùªý}}ºY<}óö­uûºÞ¬—ãp5ìæè£Û®öiº*Fêé“ÍfÐ÷ñ* ?ëé½Ü¡…n½q?¶²ŠEä‰ P­fà\¼Ê]þ‘þytãÕ6XÅÐC}"{²Ù øÖ1ÎÑãŽËfzãóô¡_…®¾Ú¤ùªX PŸ˜ÙlF ñpsì%ŸºkF­b)@}b d³)hÃxÇ÷ÃSsüÑ=X«4lãõ‰üÉf3ø+Í„‚õ«»Æn5öu;{àQ¡Ë¯iØ*Fêé“ÍfÐ—Š X½kÅØvc³i®›vvù£+°æiÞ*Ô'@6›€q{pЫ^5Ø1]ƒUØ\åjð>-ºÙŒ¸`Ò˜ç `Ï‚Sè2¬|š»Šeõ‰Íâ3P!: °Žm¯;óeW¼íWs ±rÓÐU, O €j5ƒ¿ L)7Ã=4}=¬»v\t7³;nÆÊ¦Ñ«XPŸ˜ÙlFÖ3åüLgÈMçhmšör˜ûІF7feÒ0V,¨OL„l6#㘖GyÄt²\×^ÎE®ÍJ§É¬XPŸÙlFÚ2m¶m¿nëm½÷Ÿ'›Ë]œ•JZ± >1²ÙŒ”a†Ë£9Ôýå͉î ÑÕYÉ4 Kê ›ÍH@jfôñòs¸™} »³i6+†êñ“ÍfàŠ«Û¢kÛfqú„EnÎ2¤Ñ¬þ}~ºÙ ü\2+aoÃV6®ÍÒ§Q¬~¨OÄO6‹Ç/ƒ`ÖT¶8 !߸ÐèÒ,Ý4z ÈùS­fà÷<ÒmµFº×èª,m´Š‘‡úDôd³ìm`NÃzÖ´‹é³“ÛºÇB6袊iÔ*–Ô'&A6›‘„ñÌyx ó²¦WËúôI\]¥NÃV±  >1²ÙŒ ôþ›ož}tl¨/NÓG·a©Ò¬UŒ>Ô'Ò'›Í ¯,óîà“c‹zñêôžÀ ;°”iÔ*Fêé“ÍfЗ†Ø¦Þ öXô"YÅÐC}"zªÙç ¿ØÔñ–]ë¿`cz@œ¾Çküøî€ÿù̹߱gÖ=©DvzS%=ä‚Ûéqyñäû—pû-ø²ñÓÛû‚Ÿß!Ý +˜~Ú òÝΘ0œQî¨Õ>m ÒÍ"žý6Žùfo\1ÿ8ƒþÏ¿îÞß݃5÷§KôÓç¿¿ûŒ»í×UqG»CÆ3@Ä}ºQÉ@ÄiñËIÈÉù矰>9gêé§Î¾õÚ÷!êrƒ7”§­|²UüÂqkÿšeÿe-üŸ·ÏXôÞ2å¿å¢Ü>?[%ЦoÈýÆÇÿG9îÇ endstream endobj 729 0 obj << /Type /ObjStm /N 100 /First 873 /Length 1190 /Filter /FlateDecode >> stream xڗݪÕ7Åï÷Säš“ÌG&ƒ­œ»‚X/ÚŠb7¥ ž¢G°oßߨØ/)s•°÷ÊÊdÖL²þk6ÚÚ³™2HÛÁ mjþjm†1z“¹W“%ŒÑt,ÆÝÔwš»¬3`w`ƒji.ΨÍ×a„k²Íá7gŸ³ZŒÉ-,q»ÅNÜi[õcN|ÄŒÒÎ2Fâð ÀáÂÄ™|¤[mNKl0Ù ÞmŠ$ø0 ¹Äoz‹9™øa"EÊf3¶œ0çpÓ5Á0{$æ% †y­à Ù%r†˜ƒc„À¼Im°`nóQ˜ÉÌ<‘`Ò:f‚ƒÉJð&áœ`…0±s ˆ(Õ&j,Wc‚"ApbÈ Ë'Ì@ ñ•àƒr$)H,ƒ A˜K[äŠ J ! æ-þQÙ‹Ô̇$©‘ãljH?Ð'àÒÁŠ tPá³éTòŒ0:°kSIݘäÉ‘* ¸TYÔƒ*…³åIFRŒ³“›à$êAž)B]© \ºX”…f}Ä‚9ãsP‘BºÉVpÝ‘à¬W”‰€ùŒ bÇ— á6ˆ7È£,LÀf&©lÒ Á‘L„©M“L8¤¦™pêÃ4N[™e³³ oo/7Ûó|´§íæÇŸ~¦)zö*wÊþÍûׯ_\=ú¨÷ܤ„]ÖéÂÔµïUÄšôC¯”°:û¡8JXýÞvŽ>h› ÖÏéƒ(a÷î“ £„è´f »VŸE¨{º½„5ëÜh5¬j×Y“ÂEºzM Ÿ³ÓC5ìÝ´&…íÓ-jR€ë^̯­è^ ×r5)̼Ó5¬ZÏ7¶„íùR”°Sz^{%ì˜}šzFßV“‚+·ïâe¦k÷SK×~?Q“B-ú˜5)TWÏ뾄ïãÔ:ˆNëX‹vhŸQ“BŽô´b%¬.³Z¼"Ä+Å$ó[+³ÉtFM‹é”C±Ôç¢|‹·ÙtÊ·x›M¥|‹·Ù”,ßZÎæÌú­é†ñë£x›Ê÷_ÑÞÝ¿yh··íæŸÍÇ%wøŸçÔ°ùø‰–å7OÞÞ¿úáúО·›'ïÚͳ뇇ö…ùÙ¿_ùãå¯×ËÍwìr}óðk)¹üróôúîþýÛW×üi|úéûë/¿½üöþC{ž?øáeÃ;mC»ó‚Ý^¾…‚ïü¯“¦ÛýrÒoæêiqn}èÓòðç´`Ù¢ˆõô(5¨¥E™5¬¦E‘v¦EÑvì¯võ×°|XaQV »±(;jX\h~R•°Ü|hÔ°ž¥µ´(E¬¦E©I‘.Ô´&ÅiQjRøI‹â5ìÆ¢xM Õá®a¥ØAîéQjPK‹R“Â5-JM —´(5)|¦E©Ia'-JM Ûù&Õ:Èø 8Åœ¥ £&EÚÐQ ×Ò¢Ô¤HÊgz +iQjR¤ •Y”*^;[ºP95)Ò…ªÖ:(]¨FM¶´¡VK™Úê¶jR¨z÷QäÅ©Ñq5ìÔî»&…éKjRÈ™}­š²GQ“‚w¢‡Õ¤ÜbìZ _ûïËŸx “ endstream endobj 795 0 obj << /Length 2008 /Filter /FlateDecode >> stream xÚÅœ[sÚFÇßý)ôˆ;ñzï—vú@l’8Ør›$£!¶°™Ø‚hšvÚÏÞ#­ˆ%‰eéŒ=Bhuö¿:¿=»GZƒëOŽŸ(d$•Áp‰¤a2°U$^ï[ƒ›ÉâfrxDnµ/ºöC?GóhzÙÝ—£ért{øqøüø‰Æƒ’%¹RH3 Õ¥¶†òJ·Ží†r“œsÐü~@ Ƚ gŠàòîàýG\Á±çFÜèàkZò.#Ê$|¾ ¿à|»4ÉÉXÙn¥DÓC‚[Ë;«Ä62Œ'—‡·>GñŒÙ()q½H%bdDb>Ù<- fHa(&‘¢,œ|/ˆD”ð€"£M0‚qNaÑÚúoV@R’¯*°†IRÚÕ~vuŠöWW·N y[jv 658¿ì‡~æVp_êVžw+5 jýû]Ecë´J[Áû#‰1@äKfßÿ]×ç„#…?—í;ºÄYl —( ÔS¨K# °äYþÂa÷äEgøä¬ýtö;ƒNÿuçtÝÅÿõ0ÝàìØC×µþ$¥óZþ=N¾ ˆa¹dpDÆVÿS•!h;Í•ü4‰× J•Œ" Áòå@ ¦óVŽëƒÒ\úƒ§hßg± àÁ Æ+áyrÞÓŸu¶ä‡VñC±Ašì˜â‡™ŒZyã§dßw±õù‘0}!JüˆŸ­£¯Ž>É@´cz¨'z4Ì…¨öGOѾ#=ÎbУle%=ýó·]‡Ø£÷JóD‚ƒp’7zŠöéqÛ€Åj#=ï¶õàJt44j×Ã÷„ŽÄâ¢}GtœÅ6@G2D!½­Bçeû]xq>ž¶‡[Ï{* ¢#Ñdâ àljïéõ)³BÜ&|Þ*ÚwDÈYl„EŒ™êè“á³õ̧šÌg;Ž@ÒSb69õ†OѾ#>ÎbàÃIrI«èéö^·ÏºÛ²£ñ^“vå‰jsSoìí;²ã,¶; #Né†;>½Î‡i3Á¸NÒ®êâ£6Ò£Ëô¨uð¨†ì›—zc§hß‘g± Ø!qÉ6žî°Û>ÛzÒƒ÷šrO‘Û¼Ô=EûŽô8‹m@ÖH`¾!åê„íWÃgÞpëiÏžçÍ$»å¬»dH›úb¨dß!w±õF!Á«o>{ãˆÞ€ˆ˜#D¾#$w™{ m³Toí;"ä,¶BZ"ø¯DhØo÷]Ƚ ;ëž¼ Ožuàèéöó¡j¢Œ@4îö)õ“”ÍY½U´ï”³Ø@)`_ Ôù‹°=O;g§.w„b´¢(YÐ@ÄŽ)bž(’iêê ¢‚yG†¥V®ƒ’C°Ïò÷*žúá~ÁËç(ߎVË\î)ø¥î•1C]Ö½”¶•ëw•P•̯K ãÏq]¡„@Fcü-аðwW²hÞ‘AW©5˜Tˆ‹D6ƒé¹ÞbuÎ"ž//ãzeË4lY¾÷¦Œ”‘}pÏ%dSL”¹¯»2‹ä!†ö>gIío/ÙwCß]l}ö9‡éW{cávBúar€Õ~èǪzHx3™ÖýLk¤…Ç.À’…®Æ_(Ùwëîbëw¦aÔ]¥Eûè9,œÎjИâÈì¥/0ž<è߸„yÕ˜æ+˜…Y¹Q; XTgé%ûŽÄYlýÌŒÂMåÿ°‚™a”ò·Šö]â,¶~öÍ0Ld)û~1„M/Ë¿Û''‹aØy{Ñío¼CÕt5i DѼ›+œ¥Ö÷5¬7x¢wÞ a§ÓoŸ »¯7Ý ¡u=¡ÒÒ£+Šö}á*¶2.Q­á¦Ñ…ÕøãtSjŒ´bûR)‡©¡R›†Ôy˜ÄäºÒKn¹{D)¥°õ·~®dßMg±õQJEj~ÿƒ(%)î1Zí;ºÄYlƒÐMÂ¥çúýðôüe»Û ß ŒÃ“ó—ýÎ`°iø¬ëŒ‘Òþ–u•ì;zÁUlu7HÓeÒ(fç\ó`MŒBÊð}k"ah²>¾X½™ ¡úþë²BFBQš0ƒ$õcɾŒîbëGi’f°…W‹ ØU=Z±4ȰÂSìÅ‹ïˆÆ{‚Hõ“°?f“«rH€ªÝ ´í¼¬{=›$/W®žót§“x2ºü- 'ÖŠo"ûáû‹Û„·n'Ÿæ£ù·C)ZàŠ[£é•=´ˆb[~ù%=DZËÅdz6›¬®Éޤ¬½Îa4ŸÏæ!XgËøË2N¢H±'æNÛz3y÷’¬½ÙJü(S3^ÆËyVôk2)ͧ +kd¦žµ&Óñl~7Š'³©}ª;‚Έì†á]´XŒ®Ó‹##Ùë_æ0E®ìN<³ÛE|-:¢…ÔÙg ¹öÓx9½L*ËöRa“ÛÅ#»?‰íönô-Wýx5]Og‹äót?½v‹jùË]Iå8€&Â¼Š­èGp©¦‹ìõû<0L "ÔêíûŸK6 lÁ€ q-¦¢ò?pï4ع/ÜFYÓgó ÄÀñÞ«³ øÒó¦¹Ëñ°åë~ ‰ ˜oóËÿ89¾¹ endstream endobj 845 0 obj << /Length 1778 /Filter /FlateDecode >> stream xÚí[[“Ú6~çWø:A«û¥}J¶Iš6½eéÓ6³CÀ,ž³“Ìæ×÷È’Á6l±QÌäÒ™dddùè;þŽ¥sôÍâè6ÂÑóÞ“Qïâ™2‘AFRf‘H)­"Ñh]÷¯æÉzž †Tàþã?^¸‹Wñ,^Åé$v?§›ñbðzôóÅ3# %³¹RH3 Óå¶ñJ÷/\C¹±ÏôžŽzÿô ÂÙa ð¤ˆ&ïzׯq4…{?Gq££ùÈw‘ Q&áz]õþìá²_š”`6A†;(ëÜ­6×ÌßX`øOrDa­Ùæy C óH1°iÑÙ^A$¢„Gm¢UÍJpª¶÷î›§INŠ œabG‡Ú÷¯¢j¿x•Mf(Û’ÈPó ÀæW·‘»xå9®ry™Cªó9s“4st=h'ºL1®ð]~ÄXþý}#ÅWPy’qŽ¡Ñ ¡ ï² ÓÑnÜ|œNq HÿQÓØ#IM» ŽªýÀàÛ 8˜dˆq “)dT‹àÀü4ž¬îï²»“éÀÐRÖUûtƒmCV¿‘L–éº!#“ùxÕläÛø¾NÛ5寛R'a—Q€¹+êjöè Û‚: 9´Cê’÷{ÌéæÄi‚4ÝWµH\0Ø6Äi0xàˆ«³Q€”ïXÒß² 9,LÞ/7Yg #ÍewœUír ¶ gŠ#ÂxøÇ ƒˆjN°®ð›žºJ˜VkÕ³Uû̃mÃ,´D _s$㛆Ô&é">î’äÎø¨Úä#l>…JM6_üz¡•õñÀêh Ê“&luPRÖÚë{I"T;ÔOÓ<û…"˜³þre[^¤Ä®s:ÎÆ®ÛÖHÓø.N§IzëŸH]ÙO0+½n" "¼¨ûËv gkV Ì ðÜîfí§à}öãÓ+× +TÞsùäÒu¼[Nc42¬û£y| ³KëvÏQ ÑÀ¢(ƼPÜßÌTôgñÊO´Ygnî7±+ñx±XNÆY<õ7îÝl»Ž €ç…è£J\XˆåØ2Ag"RH𘮗ˆÏt,8d“ öûšéŠ_QcŠ‘ëÒAŽ7ž_×¾-¹?߸Ě‘OJ ”½ï ê$M²êÑÉ.ú¸ ÔÛž!¼}­JÅmø:•íÝÆÎléÚb×zé~Å.ø“eúÈu¤ËtøŸOx„ðÄïG˜ ï/|µRóŒÄkïY’Þm2‡Ê®dãI–G«¥rµß»ËI6wWoÑ¿¯:¸YÇG|õB)ZaÊeïuOxžzv퉹d¼H>Ž-®ï½u,ždËÕžsžÚâÎo½|yÌ_Š˜¡Uî¶ÙoÍgj`l{—ÁX+Ÿ7wÓÝ·yäpÜoï3SHjSå8=Ä1l¤JvÄñræ¿2·å”xô_ê…ÿþŽHT¢æŒO¨öùä„å¬Ýä°Ïê#¦ ¯éá…ò„¯2íøaqph´Þ¡xZ¸T‚Á¶!DØ$ÄœW"²±ÈÀ8AFu§×ì2 ¶ s\ *Ϧ µáŒ„IwzÍ~ gÁ`ÛpÆ óÃ䋆 áÍóèΘ­Úd6lf©mé™…!†]ÒÚUû|ƒmáõìs†–ˆ`ueˆj…hQÔì”!*ÝI"´;eÈþpGXpUW†ì(CIÂNU†Àn¡ Áåã\‚‹\‚öòÉåðrä;·âÍÅ¡¼o{jgÎ\›7ßLq@.…û¦êði¾FlvYf <£ˆªíIš=eÄ:›Lý\Élç< ¹ËŒAAN <„êêA®ó.¨þhj¾Ü, Í&ÞzO­ç?(‹qƒ×Ge±Ý¹áž*óxU¬4sUs2’;ãœûU1"5dú›VÅÈ×-‹}uªXy=Ø OsN•á“xhcÑðºö­ß îGþþ¾0áï«ÖýÈç&ümú“%9æ§üÅÒ¿­Ýô{ endstream endobj 881 0 obj << /Length 1715 /Filter /FlateDecode >> stream xÚÕZ[s›F~ׯàu¢õÞÚ§¤§I¤µ§$£AYL¸\⨿¾gÙÅ$;’°ÒvÆ`Ù={®ß~;7v^^\ÎΕïøÈ—T:× GH$}æ(®Š8×sç£{µŒ‹e<žPÝç¼67—Ñ"Ê£4ŒÌãÛ ­‚düùúÍÙ¹‡J¦r¥Ç(lWËæ+Ï=3Ê}½fôòzô׈À$ìV '\>~ÆÎÞ½q0â¾çÜÕ3WŽ Q&á>q®FŽpÛ.´Ôhd ‚|nT)j³¦A’dátÄÉtQ¥ag©Ñí~I­ F¾ÐÂõåUO]†æŽb ^««Ç‘ˆîPä{¾“G΢¥_WÚîÑí (G“ÍF0ѳ‡Ê·¾éÊo|»ÏmYùÔekùcn.mP!xuPy;¨RLÙ¨~Í⹉˜ä|œøã:œú…Ch£”3!HH߬úÉ.éïéÄ<§5ñ‘¤énêÖ©3á´µõ® vj\/þeßÄ£ Ÿ¯†$^ïú`ùHO"é¸âö¨r‘ #ÆÙéÊE bÇOV.=ùÃÊe¸²û—‹”°š ÆiÙɽ]:!Xgñ&Þ½ò"òûInÏÎJÆ9b„WˆË 'Q¿nží›}ÜCœŠÓ%GWþÀä¬ìÉÁ$ƒz”‰)ÂÚ'ÿVȵ}¿·Š*ÙŽÜV„v’ Ä™|j´ÛE‚¤>È0ZÿšGA d‡yÄ Ì%ÆT¸wúA#3‰p¿…ž7vö]\.;ërHÝleî‹jöeL°Y¶6¢²…yW.­„y´Ðs‚*)í&i˜¯o U©g®oíÔEn$c7ÌÒOÓ›*ôD4ž(ÌÜwYcD¹ ÊÍ> • k]VŸ– œIX7ÜT¨_Fz2¥Ú( CyF±vÌWmR”›×wq’˜÷U:ò¢4 êvAYÏà–cwUf¬XfU27 nólÌ’µ\8 M’„™¥6›§‘–Ü=°6p¦eeù¾¢Ò¬ÂÝR/Êu‹2 æ _§†C×.Ô7‹ª¬rm¹Õ1Ã÷ôžŒGõ]›ýµ#ôó,ZcŠmÌXP6WM,æÖ†õ^>ŠÓ¸|À)îãöN8CzdB@a*Û(Û³˜0Ĺ:ÜâÛ x‚.å:!3s½‡¿Úˆ2¯BµMÒꢮ”%së—8]dù*ؤp0˪²ù®4×|vÕŠ»Qo¤WÁqel¶àti±+Ôq„áÄZ·«ß^ÃÏôýïÖœ…¶aí¯Â0*ŠE• »}›>ëq(~(wøRéÑçiPAå§e 9“åG‘i¼¼óéöÔdš+$U'ãK=ùÃøÒpe÷'Ó\Áá]ºT¤äû¤Zð6§î%A•·'ÁÞ¢jLbȼ#9ö0¦Æ|g€ÀÀÔxMZ-ò½ŠL¹z‡ˆ½í•Ø6bâôtà<)ôþ»À*°ÞŸaÚÄe3k‡I–,5«Þ}¸¸¸GisZeÖ!ë&=Šæ¦YXïEyÞ ea®ŸÄôi¨éØ—¢Z̓28 á™P€i'l—À·Òé|*„ïɆðÕÝá‡Ú%ý\¸Ïƒ~å¿òû6Q¿Â§k¢ôäL™ÁÊÐDa Æ|ÛD€êèTÚ;X€¡­™× å5²Ÿ,\]ùÃ5XÙCÂE=„Yóg¡øïhÚs2ðþqõ•DéÅôy,Ô`Q cä±>‹ —Q YæÉ`]ÂÔ9µ…p÷cKìÿÉ–zßÞ»¾Cm‘ömò€n»mÔ ò> stream xÚÅX]oSG}÷¯ØÇöÁ{wwfvg«)@SPCA$Hm#Xm²‘ãHðï{æÆ„ÜÂP,*YÚ±}îÜÙùÚ3Û´„šR`ÆÂA‹„Lk ¹U¬-”b( ¥¬J-4J$‡ÖOçYë9H³ïx¶×kP®·Ð~ë:C_ï¡÷4¥á)Ch ¡„œK@jiâK60Œ*b`XUºÌd+«©‡Ì¥Å™A€fÉ 4KÍ ¹&™i†æÊ†æÚ lû%CsSC³ÍZ†r‡-Ðܱ;…¹%aZC3ö^’XBÉdà ¡Ø\Y _– Í0· Wx³L|¦ˆAc!@3+4ÃYElƒÍÒ°w‚æ ÃvC_‡wnðŸ"¢Åv PQ:›P8DW*ægnj›)þ&‚·!`Ñ%„Jbb†BÁãl~†•°AAh>~ÿv?NÿZ̆{xËb¹9G½‰=>ž.ÎWë—‹ó±ÇŸ-^Þ]½ 'öjé œ‹zŒÚŸãm§k¨°”»„ï/—+h< ÖIÍ$뤶~bÁˆ› G/6ã÷óåëÙpwµ~µXoJχÃÃáÞI¿˜m/±©B-fdlÎŒìA¥ÁÝ܈lB‡ntÜQ~Y¯ÜþÃùßgøÌëõj=?_læ«‹ÍÛ‹½øGsÙŽ Ë‘­üS´b+ÒcGQöQF“fýöìðð§{ûOŽ®aY‚Ø~È’yαŒmAc¢~;¥®ƒ·)ÕœŽíÂŽþtb9Å”ØÒc’âÃfì­“›`/޶ösV‘عú°#N.¶R´“Þ…•É㊓S-%d¦/èD‘«/5i”ä …ô…}¡­¨_(¤I¬Å É5RóbQ·n,Ãg>,‹?ÍÀ"g¯^Š”|z©3JÓ‰ÕŽT÷ê-1;c ¦ƒóÉ-Öœ6 ×»zõ¢§Þ„væŒ1Ê=æä«ÍBU¼X‹›‹c‘X#bêk;% Ž!4#Õ[ëN¬…Í ¥hôù+ùÒGŽt“;3Š^À÷õ[ˆ”ò-"e ÿ+ˆ”¶O‰”>f’M>»$Rˆd»¸ŒqðŠŒq«f«âü9"u¶<Ûì8m )Œ£Ì•!¥¦HR¾Æ¤ŒMŒ×È:>Fì#O7À_ O“X«²‰¼Æöhó– ‹Ž×‹ÓÞÜ@4}Pp§)þ6…5î4Åß&±àNSüm î4Åß&±àNSüm Ë™bbŸÄÅfŸÞ Ÿ‘S/ñ鵃5ußÞé›É·7ªàÇÍ—’6;•ìK3bTiõAqNQò¥ð.»êæÙîŒÀ̯¾Ù­Îíæ~£ëÿ×N¯ùV§oý;}»ìðvós¹òv•íZ·kÛ®ºË:FÄ­‚ë0º&W´pë žDŸ=Nßλ¦)Ý_™"Èê^ÄgÊru~ñâõâý(ê)S ÛUbí±ÅÛD"ßÝR4òþÑnuL±ÿËž«#\¦¦kG¸h}åûq‰Œ±¢Ûݳubï»#ÁQź8Orôà!>óǿ޺‹ùF§€¨²]vomÇ®&[Ž?ž=Ú?<œß}vpðóÓ©["»0vß݉èLa #“‹‘†|ØŠÄm¹;± -!;±+9±µLÞ-Oa#n¯N,r¯+;± ‡×/Œÿ,Ú"› endstream endobj 905 0 obj << /Length 1722 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯Ð£=Ô,ï—í©ëÚ¢´‰ßÒ"Pm%6æÈ™­4kýEJ‘d;–ĨX·=¤(ñðÜy¾ãàè:Âћѯ³Ñó×ÊDIe4»Š„DÒ°H‰f‹èb|¾\í–«É” <~ñþ­›œ%WÉ6Iç‰{ü=NïâõäÓìÝó×GJf r¥fŽËi ß+=~îÊÝ3z5ý9"ðŽÈvŠh~3ºø„£¼{aÄŽîó/o"A0¢LÂ|>ŒpU.M*l4A†;Vv¹X—ñíe|—-“4[Íãl³½œO(ÿ±»»YÄY|¹K2ÇêG,0ü‘œ_ŒŒ°gÙáMƒ{†æ‘bqP-poבˆQd´‰¶ItUa·NíðêþT A úŽ.±‡’÷šª‘/Ýæ€*)‰ 5á¬æô¶×‘›œyƒ!sóª©Fkgá/›Õ™ë(¡èbj$ÆÇ¡æ5Z§]€p$$ÎDuú6 evß$L(;Ò¸q6±aäõ¸o ŸjÀ 5UG ±4%À¢§óÓ1"1U>lÒº?k˜!‰ ±:ý@û3Û"Șdˆq°(–H{ýÎ7é.;e6ÈæËxû„†­j§î "XTØ& ÊTq}ÄŸ™Êg vyQM[:‰„[Jrö¸Þ›²4-ðøû=ÇiœyÌqÚSu.4Œ(ÇÓƒfˆB!@†ùZ£mlJMÔb°ØlЋÍpf;ĦÔðcW㬾%—-£óp<­“´™?môK[;) ú”!ePc£KõÁªWŸ)cf¹ú`|PŸ}xPPÈÕgЇI¡¾ü 76ÕW¾ÒV}y´O­3ÌêA_h¶|!M ƒUÉ ÆZBßJˆöB¿`˜r8ô+SH£»ÿôÃîÿpfÛ`¾a4Z¼ï{à_(AAÍ>˜êômÊìqükÃTüpø—Ca®ZXOn¿ý0û…3Û¡ÆæÆ ,UqÃfŒö/²³¯·Io A­¯‡kPÔÉÚ'”Õ.æÑªFý´ý Õ2îÔ±Š’ho;+†ô€Äý@K3ÛÅÔ Š½¢·†vÁ>`—+(Òý`— ‚41U°«˜‡n0iV‘°T»ðäÁ.Ìòêòa/uÈš`W•`×îÚ5N,Á"Ìçµ£U÷ŠWp:TÕ§·ý‰Ú{w€Î0Üœ Щq?TÉÒ V²„3Û Sá¦ì”>ÑÀˆNŒûN&1â‚>âìRDQ­6ì{QTjT´JÞ$Íö÷$ù²–zgÇåõ³WnºbÿÅå‚Q•ÃV g pîˆÅ OŠb9ŠÍŸ-Ú” S0í Ù#÷î“B„"%øpi˜Hƒ”îwÒý°4Îlû4L¥bÍž¶OZúB·F)‡˜ÎHuúF eöx£”Hš×K?Z£”p¸²Ôpîý@û3Û¡=CADŠÒ£½Ñ.µáê:ó=j BE•†ÌÿÅĽ‡ÇÚ ¬ÈÅ?¨Ûpèÿ›9¸!æ}þ½ùoq Œi endstream endobj 933 0 obj << /Length 1524 /Filter /FlateDecode >> stream xÚÝZ[sÚF~çWì#î„õÞ/íSÚ&i.M]Û}r3„ÑKTMÝ_ß³ÚU&€Œ'ÉŒ=«Õ·ç¶ß9{€ [DЫÁ—ƒÓ—Ú"‹­b ]N‘TXYŽ´…«¦èr‚®†³¤˜%'#&ÉðùÙksOãV3ï¤3®à~Ž.¿HS/CbÔ˜’b+¼(E¥Öu´¸Ž–å,NËd•Y~]Ä¥îO" üÓJB‚­tèîòª#/Çš¤¹Â„2'¯—TaFbØ‹òM¶Ñ6®/À$&’× x`êf÷ÅÆiãׯÝe…&––ÙG¶Ìo‘¿9^ïU^M¯2ƒ¹ÑúO–L¼ÇBW#«ÙM˜/Ìw¬C†mhíw¹‚˜• (–Êz¿{EbnPcbìjøl×h¤0ÖÑ‚¥ß3Xz »C°pÅ!J,¦ÁʬÉm×Q‘ÒÏ‹™V¤tãØâ‡D1%²]t®²¹²°5AãŠÞ€²AÀé-•ª¡$íÎ9ó×ø„Êá¿ãY”ÞÆ¸¥þéKJšæ&hÄ–„5#X¹)åX]ç†ï;x-U fÖÖ3‹2_ŽËe×RFA§Y6Ÿµ Ó,¿‹Ê$ ºD7Ù²|X›­ÊŒÅbgD-læ`ɵPèh§Á—”í¯]´î2ó×Fâ¶‹@JéšIod(ÄE#×Ú+Ò›di|P¦ƒ}€ 3ÇËtÒXL€E^ü~äÕ_ØÝ3„šˆKÝ#ÓUNï$7ÊÙ’Ýö!Pi Þ2OÁŸÎÓ®•Ð?ÇÑ|žÁÞt{GÐaÙ2ÇŽv°LQdãžNüãI9óO*Ò‘6…Ž8ÑÃK0®ŸT̲å<¼zVÂŽ oîý˜'f·Þb1wLáiÎ-Üáï’ÒOI3ÿyžÁŠy‹kËðtY&óä¿€êàÁ ŽÄ!MY)½îyÓo”Næß`Fè2j63*œ‡¢E/‘33ˆq½ ÃÀJêxô*4lB°ò±èµƒß^û »;½ -ª#çþ¥au>ØkG #¾B²Ê`)Ÿ„m…€¥êÞëºZ}~ñSû"??;gn¯:‡Ò¨ÅÓ<»ë[ºÒ¯³tµº±x»r ±pƒi±A-.1•¨U#¶O ÞS/ÎÚžZ¹fëñ♪Kà÷¼{Ì3õ×4 €÷uõMýR çy=”Ç`ýÉÆzY€Såîì~p«J8,`é£1<œs±dìh ßÁïÇðý…Ýá¹°Øôé5™}S£f]"[^ªãu;ø=C¥·°{4Š87ØHz`£hK °WæåªAý$}"Na)£êmλØ*¢ß^«(lÏn0t”SaöWn³Glià°°O~t-ù•÷‹ÃºE "¬>^²c@’›£1X¿ƒõv÷dÇ`Ó6ΕIZ~ž¸(aílWy½Û.bjÇ×IpB` ˜Ãœo0šä¨µX/BÚðý¤·¨{d8(r±Qºá:•„³ 0NËiz Õêqêj VŒÏgmüžNë-ì^£–bKÌÛºªG6lå½ j$Vœ=E!B,%Â÷ô?å±o¶ºÄN~ñ “Ã[2t5z¯«÷r ‘úìY,oþ:¡áµûp6œÖérâzªU‹TV¥\~¿X•Î’{U4+òê·6DPÕ4~’À½ž¡¢©[ÔA›û ™Ö±A±QÙÂoý$MÊvr_EÊv}ÝÉÙ´¿{Ì:n‘A¤Ç¯ÃZqðe|)øi›uôf0‡àéM±×Ö`„yˆáÛ8ó•ë·„¼’k^m·Ž¸Æš‰'m]üòþ®{û©ÕºMkñÇã¸(¦Ëy[ìM?@KDòÛ¡ÿ ÍeÞ endstream endobj 959 0 obj << /Length 1951 /Filter /FlateDecode >> stream xÚíZÝoÛ6Ï_!ôɆŸ"¹=eEÛuÃÖ6Í[WŠ-ÇZlÉ“ä¥Ù_¿£HÙm'’UgÀ0 …$†<Þïww4n¼=ùñêäüÔF:¤ap5 DˆBÍ©á)Ip5 >>Í’b–œžQGÞÙ—Ëxçq:Žíç¯QºŠæ§_®~>£p €`È A.%RŒÂv-!`¾T£sû \›5'¯¯NþÁÁþös€×*¸¯f.A0¢,„÷yðéäã nÊ¥Hƒš¦ HsËJQ‰u-¯ãòa_—we¶,“,-&QYþ~ÇÃR1‰‘fóxë±ÌÄ%bô<8½u³WE’ÞVÒ‘Z'¤¡3e­·‹²¦¿Â¼p)³Ý­ˆKK¼œ¹]Êd|wJL>àæ^|8»|ýÑ1¼¬c\µÚ‘i¬¾XÁk 4¢2ËíÐxïŠÕÂ.©ëÆ'ÄÁpD¡ ¯Ca¯Ù'*:=c Ç…-¾sà5[Ø÷". Xm?¬°FÙv )ì3šLâ‰}-3÷œ¹R>j‰Éq¥W·2µçÑ"ÞÚªJ¶,©Â›¿1j‰tþ†àæQŒ”ò« ¨ê›>È8RXÔ½…ï=’-wUˆB2›*·,9â-~£ù<ñkÝ<<â™b]G&iRî7Øcâžq†ÌÈ”%TfáILâ\ö—x™ÒÇyÛ䛳i„(óÕ¸\åµ¥fQé”Í'N/I:ÍòET®,ºÉVeݲÏÖÙ~ThJ„ Ùz©{rC…o¤ÞrÇé8XnÞøf6m)aîNÈmœÆùÆô­£µºi¨P5®8­ƒÅx P<]͑۾َ6Ÿ ˆ}&®É­DànÙý{м-<^šÃ) úxé¾GXº?œÙîmh.È•hµCîâ‡Ã‹4ˆLœèf™Öt‘¿AM˜êØ¡Þêu> stream xÚíYmSã6þž_¡Iç"ôn©ýÔkáz/½^~¢7Œã(ÄsÁ¦¶SJ}בLlJ7Ì]Û {µzV»zv×t…z5xy>8:‰ 2Ø(¦Ðù I…•á(20FOÑÅðlž–ót4f’ ¿ýðÚMNíÌ6K¬ûóÇ8[Æ‹ÑÇó7G'š ¯Š(š3Øn¥K*ôðÈ L˜zÍàø|ðÛ€‚AtÁJ‰’ëÁÅG‚¦ðî "XnW’×HR‚W0_ ³ÁÏÒ¶KÓŒF§¤Ø¥\™uß\öÆÁù•H¿t…‰`#k}õð*@ÈqDЏÄR¬ÖÏ%U˜Q6ڠ¢Y RWÛÃO77`K­š œbZK÷Õ¿9ÎmvhëRØ0ó€]),®›œz?‚¿V~m?2ˆªH´ãó2.3ï¸Gõ¡‹±„®o¯ Ê5ˆÔ¡àßlj¹ß2XÌħdhL±TÆ¡ûê1-sZ‚¡²‹ýfÛXd ÊD}b1'B€”CýÊVžÎÞcÚÄøôøƒ›—U±LªeáybVä×íˆÊáÉ<ή,îœÀÑ %mß °!¼}^pÏÛ)ÇBD Û|èëX£13¦‘ `VóØ›5ÏÓÒMÓl–×q•æ™{Oòeõ¸5ÁæàœõæcpW$D brižú ¼þ4¢@–U(±¹ºÊ;ôE)þW{9ù,½Ü!éwj‹½ˆ—Ó¨æ€m‡¾MÓõUþ~ÄÛìöÄËA/%}ÛªÚï!íRñ…uU ºY-×UúûÅH°;tU@%˜ ßU«Îf©ë¬G½Eë†Ä´ýUs羃ÎR›ÃUSþžë v‡i©ö²Lÿ´—Á!CÙ¯öí€Ác ›õ)n´À†> stream xÚåYmoâFþίØP…;¯·ýDupÍõª¦T¥'ä‚K`¨\¯¿¾c¯7± $C®×“ym¯Ÿ™Ù™yf!hŠzÛøqиîiƒ 6Š)4˜ ©°2iWMÑ`Œî›w³p= [m&I³s{cý`ÄA4 ìí/~´õç­ƒw×= O…ÖØã Ä¥XRÃ|í5¯í… “|Óè5(L"ˆ>éÀàK‰F‹ÆýG‚Æðî"X}Jg.¤3®`VYžÿ †v¶‚Ý Þ˜QÙ!I*ÿ¡¢S”1PùL\^º,²J{XKÏZù¦Û·•tŒ–ãÀUÛv¿{kÇ~4¶[¥`nÜ,{ ZT6ÿ†èަnµ9%Í›I4Œ¦önÒ‚W~8__ÙûÍl¼0Úy¹+Æ>‰ƒ…Fk\X÷ë%yßs±!<Ÿå JçR‚Úq…ïKx…5ô03ÆÍ\oâíh³§²Ÿ-Íl9¯=“e¼ð7á23Ìÿs¹}fŸ5¦Í(Ö¨m 1YHe› ¦@GÛF+§žÇþg;ünfvô0@ `ÆRJ›ø 4”g¨G ²íS2‚ ìAm MÂˉsÄ™ 3:'¾-8¦T žéÑzŸaSØ‚U {œéSÝî~º¿á¯?ãLBžy& Èe°ªì£ž§ÒN)À+Z£’sìIy±U¯W ê+[vJ®1Ì:óaŽ_®NFíÐÎ=”2ÅWÆ9%ƒ.Í\®5)á׌‘ÚÊAb$°Jê‰|=ô×­Ædü„H"#“HôkhÉ5«!wŽžœÎ*¾Y"¡œI™ïKV1õ VYŸTÆIÈ»\ã†cÃùÅRT ¿^Šª¯lõ2ÆÆŒÑš§'™ëˇ'ê?RÈŽÉ™ÜÀK!^#grM0aYûî<·…J)s´\¬üØñ`·;[H¡Ñ&ù°“[R6ÿ×I³Hñ÷5_/PüÌÚOñ¯ ÷[pÓðC·Óû}ØkiÑìܼï¾ÉžØuî™}qœsÕ³m=œc-‡8%Ñ2-Ós±DË”ÀærÇEøzi¶¶ªÕ³,SVf–Ý% ]T_YÏÀ¤À„ÒËJ¿f¤ÔVöˆžI¦ /Ô30IÓ¢ô õq‚)¡gëì“í:9äLŒ¥n‘hn‘Ræ[îÁ‹Yôi[]Q¹íÎ^øt@nó[?F=w÷“;o¬|ˆèú/qˆx6†ñ¨Ã¾_×lj"Nùqý_v4 endstream endobj 902 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1516 /Filter /FlateDecode >> stream xÚÕXËn\7 ÝÏWhÙ.¬IQ#@p[ ‚$‹¶Fn:À×\®ûHY¹ê»¯1? ¤ñ u݇«ÇÍè°>=aÎå˳ͻ׫m:LË—/ÒòÍêã6ݨóæïÓ^ý¹Z,ŸCµÕz{Pÿ|±|µ:ß\œ½[O¼0 ý²:>9z¶ù˜]_5ÍìüW){‹ÙŽÎ |8Y³ã gÆíQ˞ƣ#JòyDo¯¼Ù1…ÍDt+-Cvk¹cņ°<ò(A¹Ô³³eÛàF§ªV¥æb1}±þrÏÅä¿U‚r±bFP.¬D a«Aß`,Ꙃ±@®eÄræ`NJÑLÃÒh™ÀŽ1,eR b‘•cØ.¹ý@a[}<öBM@1º~Ba ¹³=”ËD>ã2¬´pÙòéz½ÄÃiKä*}2óô~±|}ñÇvzþùdý~±|¶9;^M3”·Ë—?-ŸÒôà:½ƒ1ØevKG½ÀÆEsÅŽˆ*ÈÆ*`O'—¿NË6o6 ûîü¯üí¬O¶ß»gvB)¼Ë³„\æÿæÙ]ð]<;‡ÏÖ(Ô²Ä Y JÅÞ,ûæ3†-¹r+Y¨…°ND•4ˆåìÕ5†ÕÜ­†°¾5 ÆWui¥”Æ XlŒF,hÌ=×Ò‚X_ŒQlÍ}ÄœË$ypP.*Âø´*ýÏû¸‡²Ýå,·Øîr/øl§—Vøé²Õ«¶=& ’ayâ´‡óÒç7oQ"ZíˆBû î’àש¡ŠÙ riø©¶[®8g5Áb¬ôe-öÎWÛ½íûíæt{²YŸmO±ë*áÔ䮿. i»O•x=XqÒ=¸UxÎî[®®BèX° ¾«\ÍaQ` Ü’µôÛl¿ˆaidAÛ°mm‚b…äÖcnh^XˆcØNÕ˜%Þ‰-†Õ¬s'“Yì˜2,‚Ö\(Eu›+C³XÉjA,1¢Ë8HiL_êhƒYæ´¥Ò¿Á«‡Q?+`ƒ¿²€]ÝÍø=Øc,LÌ8Ø*6T­¸çPÀ"€^ôŽJq¶:ÝûãâäÃñã3ÕËûO¼€RõóÄÈØ¨?D!Ï®!÷8Oì‚ï"è9,Xaöb‹ã‘İ KÒæ˜i[Z¶AA,¯‡ jcö’q[QZ)ŠÅöÈïmcrý*&æ2ÁˆjÌe‚šF‚r)Ï‘î¬Ø’©ÄIJÔåoð¨”þ)ãaLïCyä÷k·9üšßÕB‡ÿe½º¸› endstream endobj 1030 0 obj << /Length 1414 /Filter /FlateDecode >> stream xÚíZmSÛFþî_qí>îýtí'R^JBSbÜÎtHÆ#lkbddÒô×w%lI6 [˜†´30Öé¹Ý}VÏîÊt:i½é·öµAÅê‘TXŽ´£¦¨?B—틉MüN—IÒ>8?ÍNzÞØ ½`èeþêswÚùÔ»ìä â  Ð;œÁv)–t`½vÚûÙ “ÜÓ:ê·îZD—60¸S¢áMëòA#¸ö,Œƒ¾¤+o¤3®à|Š.ZZ¤è—C f䘒b#2S¢Ô­{;½ÛÁ½ú㯃‘f–}$’À/MÍ#ØÈ:9œTŒåX4W˜k'16ù\R…ˆaãzh\°®Œ¶þÓÕ ˜Ä‚š|ƒ ˜&«›âÛÈ”ñóÈÖÙ¡ˆ¥°aæŒMÃk”ô,¥@]J©(RÊÎ8õƒ8#ìAtÙ¥„ò0ýÅûaµN'Ù`/¬Ú Ê÷rÙ*êR,•É üá!‰¹ƒ «`—í½º©Hjw‰R‚o˜'MM­‘&\qÌaM5ÖÂÉ¢;œ¸¢XT›)ÌÂÊÕ¤©ÏáXº;²Êø Ùjlì&t…µc#ù{ƒO¶‚GؘzA•DʪM Á’²&Z^9>Xg•C1“V¼zY1yÃÙÈË n·wtž»Á(;‰¼8;ñóc¯ÎŽ^‡Êö_åÁµÅ™G~p€æ‘£…È¥¨%E„8`Ÿr\ÊbÉžûd»TAËfm¼éè}Û¸ôÁþ1%Åì!¨Ë8„EZbè),:oH~¬à•Xr03&_Åá|ÏCÐxâZ/'³é(ÊyÏÂ7ög–÷j6áæ1gºŒ‚b)P%ƒ‰á%±©úd0…ÝØ'?¸ÍÍsÃеô}ñãIv¶HIèô %G¥œ¤”>AtRÐpë[x`Њ\`£´ëÜàÙ8'â™3º°}WpLA¶J~õ]G¥¨4ÈwUù§ÜùFÚâM*;øxæ%*»ñ¦ÜŠöI^¯.ÞcZК¶ž—KË8œÝ<\3¾ë X–ÙR¬'³[¸U’Ùxâ­ò³$¤pyÕ—½²ê¾ÿýìÌÅV¥`f#ñ5OˆE'·^ª³KÃ!Ä|ô´f›5š=ñÛ·à s£w'ÜèÜÙ™pWð› wscë ·`ë$Q¼Ò¸[•útóÊÞfˆ±Ð»{ïUÁo˜$Ý`B†Æk¥/ïH ,¥Ù–µÕÊ¿Q½úÿ)·ÜIç¶×y3÷§£Ußp½\uÜXµ†à0-#ù\¯J‹ïoNe•Ü©i‚©à›{æÝ.-\’zßaF<ß½šzÏlÜx²gf[´`¬í¢ùpèEÑx>Ýn[fçVÕ9 Ud‡Õ)ñÞ]u¯à7îæÆÖ¯îL3¬s©Úºº_¥Ì¯”wö §2$ù"e‚ Y>ý<ñ†Ÿ£¹íìGnì–_¦ºsèöƒØºñ²;·bïŽì \þÜ¡ –quÅêÝñ¬¨_ÿÏq»œãžKz×ÎT‹ô›ë.,Ôu—BŠK²;Ý­à7ÓÝæÆÖ×]* Ö¦éTe©¯¯Q¯Pw©€Ù€¾ˆîR&1S¶Û=,|½U•ÏåYËoõk¯Å[˜~‡Ëvâ#!Ì+èX7ÿU)æßš/À×ýC€Ìb¶ø ”ÅWz endstream endobj 1053 0 obj << /Length 1598 /Filter /FlateDecode >> stream xÚíš[oÛ6Çßý)øh Ë«(nO-zY; [Ó¼eE Ør,Ô•\]°eŸ~‡"iKŠÝÈV,[T$êðOžÃs~bBÐ "èíäåÅäù¥‘Æ:`ºX"à@s¤4´Š¢‹ºœ~\%Å*™1I¦/~g/ÎãeœÇé<¶?þ¥U´ž}ºxÿüMHPn ¥pÈ WÛ’ú«púÜ6LhóÎäõÅäë„B'‚èNƒ7%š™\~"hÏÞ#‚…ÑŸuÏ/HR‚àz>N>LHs^!mÈð6%ÅZX)E=­«hs•Ç_¯qn%ýA$ÿ´ÖE°–ƦiÞvTr¬ˆ@ŠKhC£ÒÜ—4ÀŒ İ5Êc´lÈj[Û÷îL`%´À¦¦÷PûnIÚöý’ö¡i+Àšé[Ìo½8w¾ŸÕ¾M_²PZ;3IKë°ƒvÐå%Œ=~o¾hºQÝL¸'wM¹=FÚ/óT2tF± ´•öÃ!+ó5:v]NŸõ B íˆ!Ò2?0B†Jí <à˜‹ÆR˜¨Ð®î|u<Í@Qí)åuÐS PÀ]׬*Oö1iŽç¬¶ýÞ,öw‘Sê6C‘ü_u™+H}Úæ­ã´ë4“èêé¸@k 6$ÓwÚƒå7P3áRÛË*Y/LmbP}ÏÎ_0×|Z3 iï¦VOýÐFº3½ÚÉîzÆÈÔ˜k¹]ê3ƒD©íÕës;”ùlÛ›I‰m•§„7|È ñ1髼ÛÉчrKIa Fëu6ÊØ z}kÇ,W¾Ã²Jçe’¥Ïl}ÞÊKJ×þ '1‹M–Éu²NÊ[{/[A®5†21 ¥K  ¡.ÿ2efÛEì…ٟݼ·‹e ÄlK,¨lær€Öp,„ò ðcÇ^k­BÌ´ö=‹2¯æe•;)å**íÕ*[/ §/]fù—È,”½]/8h³m<£rú$Âô&þædÎ…2À*i¬ÖqjØq*ÖÑSÚdP±»k#l¼æ(Ï£[{ùgR®¼SÜuDšà·ï-ý<ÍöÀ÷LÍf6;5ÞMÙqC-hz0ÄŸ‰—<Δµj;SH¸-gžÇOi±oÊSöžò¶§·XËúøó;øwõÛ/.8—3&§NrQÍçqQ,«µË$-P7j…„ÐãK@õ«".OÂu UT‡ë’AŒVÝÛæ‡÷ÁRû³ºd@b"Îêµã;EK“'†ë’U‘ñ°c`” {šýHB}/±÷q–ÒMoÝýÎëï.BüøxîjÛè®ÁbqbÁûÞº¨ „q¡ LŠÇ€q¡ ÎI—»,×uÙ1ñ¶»"^ã©)sqéÉñ0…áÔ92}·lÝÖøå Eɺxæ¹oÏxIzçáس]]q^gÅÿf]:èÎ > ŠŽžS’~â¶Qc¿¤Çàª?ð6®î¶Ïáê>2}È9ý{xô~ä ÷!ç&7_ΙáÖ“°“ ‰ƒ0;¹áZ¦F«QûÃjÔp±ýÉ“óŸÈN&ÏMn}ÿÔÉ“×ÈŽ&mûÃd°Ø#P†›/4ãuõ9¾m/´„ú N<€¼cì8àáŒ`¥ôc'ÓÐÕšWñ<¿Ý˜B@ø´LæŸ ”ÔhC„…¸¿¸W`àvQm6ë¤. ðÀ¾iªö­}lQ ž,šc¼¨eR)*³¼×0ûþήÐTo€Š6d©<÷ÛÜ0PóŒp‹s[к˜q9m.H“þº³&O7§·õ£4ñߣ4ÞÚ3w)M¨Îë`Ènòh³JæV^;tàFUx’Ùûà47;þö^ìƒ=`”bOòî>&‚LY¯aUDfu`_ÖËz )QeBzÄ:,Æ; k›VKíI4€è|@ç0ÉN…ÎŽ‡wxðÄx‰B+G<©ëØ.ƒÅÁKf üIÝ#ñRo¯ †åî7µïµ¶ý^,ö¯Áw¨';Øåœõ=±;°£BXÊ5–’?ÂR s÷¬ña¿#ì»ïa3k"Nù›ÅÁ¡c endstream endobj 1079 0 obj << /Length 1742 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×Wð­RÇBp'Ñ>¹­ã\¦¹ØÊCÇÍhX‰²4¶I…”Òæï» @‰€e‹­LÓvÆB ¸ÜÅYì,ƒë罟F½gÏC(¤$•Áh‰¤bA¨à’`4 ®ú—óE1_ †Tàþé»—¦q‘Ì’ÕR>Œ^œ½½üùt@é$꿽8ÑæÂ”Áô‰¦ |Bc_©ÕvÒ+MtÏ2Î-0ÙÌ\Gç—ÛA'ÄRß>{Ýê«íÒä” ïQÛ÷ÖPRŽ]¸HVë<-vàÏ""jŒÿfd%±nËÛ×ÖàÙ€Š¾›b=™$E1[ß"ûzR CÎ22XÉ22²‹2àŒãå8O>‹r@°ø ÿÄèPi5õåÜ‹ …°&$,õˆ*?t¿ QŠL@ž³zÀp¤íî½ÿX;QXÉ7r‰ÜU¼ Q®ø*Ô5yA]”D æ ³ª¥¼ü:0 ZÕŽÈ*¹*=ªDòs¶˜:.u_Pp5Tã ×ŸƒQ„p¦ÀÞ¹/ɦ*â>Ì$ä ¡ƒ";eTûþ!)±(¨ ô…]õOšz ƒ¥HÈñ<Ä•ßÑE:+ÛÀG˜dˆq /‹QªÎ/Æq‘’ý¾¢]%^‚‹ø èÈðcc` ÒSÚ%4ìb»˜”$ QK4.«„¾š'õäâfùÚMs-³ì_“yœ^'' ÑŸ"ÁyÝs}^—‡í~±Ê׈ùI¥el™g·Ó*Ó¥3ãtr7ñÙzõ°5{˜ A!øŠ“È6Ðûi #Â`kFžCÅŠUV¹%^eúÝ™ÀÀ“9§6)?A¯nVYIxŠƒò˜ ²\3GËc‚èw¼DæÉ了+Û<• ð<ÚÅ´HWû£ÁÔIeü^F é7–ÐæˆÓèxžâÊïè)•m‘ІmNBà݉ÀŒ Ú=aÍQã B¾TGCÍ“ß µîʶ@+‰BØù5_àš~ì^Í­W°~£¯Á?xYTE¿Ô £Q‘˜ÄLª µ (3ä&¾Wêçf4wJ,HmÁ£x”ÅËm¦l­Þ7ØÇ÷)ÕŒF‰N4ñm‚tw‡ò}hC¤îׯ¶4ê}M ph_mÉùõ+6„¶WºîuŽÏµÕÞ-¾ð ØDµ)¾àDG)¾ìá®z{¶.b ´®äi<„Í2‚%ôxl–1 ËŒ-Ûyò»e»îÊ6g³Œ)$é“‘Yë^ôÑEß«edÍ?šÇ¸ò;zLge[ð#F!#T>Ó€Õ† 1 ;sZF€Üq<Ì\ù1ë¬lÌìD0{NÛl2ÉÑàpåw„£³²màÀ°Å¨ r­+i6MŲ,âêxeO~7Lº+Ûª #K…'àö  °íüévô³Er;=Ü$±ãUb<ùÁí¬lp#Ž"*[Æ¿x ûÑv2ñ*Ë'7Åú®þÍü „B ‰îxUO~G„:+Û¡¡H†]zœ65*C$ÔרÁPØ*ìÔ``‹¶Ý6묾 …»¦`¢u»M×dž”.j~MãUlZëBŸ²x¸XCbóZÈC4€ "éÊ‚M;Ö]ìÑG-°{Èâ—³ [ÍH'Ù´<"R?V±-]¾A¤* aªã¦9‰‘gº òy1M¦ÿõ/cÿ—tž¬¤ãi¿«¦S3OuÊæ²ýišEºÜxÃÖ×}Ǻÿ2¶úKRàú’ÔçË`Iî1“QˆÎÜ­n8Šo§ÅÛCä¬Þ {-^É>å#„#æ}+~4§û …Å´ãA8£lyN7g»Á¨ wQbŸ#!s‘G¬|Ì@"À¬½o62p¯)n™”P ˜üS©m„ï:— Ž¢0?äXêßÒJ endstream endobj 1107 0 obj << /Length 1583 /Filter /FlateDecode >> stream xÚíZQoÛ6~÷¯údãHJÜžº¡íÚah›ä--Õ¦c£±ìJr³ö×ï$Q–¨8‰dYA3 h!ŦNßÝw<Þ}0u®ê¼ý~>:yå+G%™tÎçŽD*Ïñ^}pÎgÎÅøl±LˉË¿xÿ¦¸9Õsëhª‹?ÿ£mx=ùtþöäU@ J/3È}ŸÃ×å¶$àz?ŸÆUöÌèåùèëpu ÂÀðIáLW£‹OÔ™áwoJ¸ œ›|åÊ@ ó$Þ_;g£#Z÷+€ŒÒ¦¢x%Éݺ 7—‰N/Ó/éz“.×Q2 Ó°@÷‘ Šÿ!‡H‰™ùìòºØ#>åŽï "x8û\€$ ¸Ãˆ ”kg^Ch[Ûÿéí0ND ˆ![Ý×¾‰Žm¿Œn›7ÔmI¢˜:ØÜ`|å7§†V¤/§•×ie˜d¾áu¥awÚq.\ ŒÒûS nŸà>e„ùâ¶Q³QМý¬'1ks\ Bªä/wYÄ œÚ¦±‹ñó¶é‘Ì.[lû=³¥7ØÙâIx\âËð¥ êÕ-#ß´P°4DÚ-cX£ŒH Çšm¿'k½Áva |XvØäw¬ÙчÒ!àU FGÃ~?:úƒí@‡Tœ(åtL1Ä- ™.Âøx;mO¥nÏm@‰/†£Ö2ߓپP»pB1ÊE“´ü¡/[2{­£&Y÷ô[[:°Sô%ëÓ>5®w¶·¯iÎtŠÝãt¡ÍÍrúet\~‘ú‰Ö¹P:5ç³EU+Å?k'ìæÑIa7ŒfÅMR¼IV^¼wO_~0Ë6e ;M¬¿^šÇU‹Ë‹-ÞF0]ç[ŸvjaŽÒéBO¿$ÛU1d[“X/:y´žqø8ÚN½z«ƒ{1ì 8÷Ëñá׆=‹Ü€0¥Ê•Io§é66óIºÓân±¾ž%Åí2š¯ãU˜E§ø ü¼Þ¦å S\õÄø,ZÑ•¾×—añÅíã"bÂjš>§’Î.Yy™ù´.®IùÁ2Úa€1yoQZ ¼æX­– Ì˰î w™,ª³øèy@€íò0h@ÇA„BwäËhS&CÇá÷âöf™.ªü¶]±óçµm„xÈ3*Û3SZoç‘{¯³ghíªôb=/Ñ>’·Ø2T°pÌ&TpÛÙSûvo†"híðnei1Gxöçüwùî/|>abl¢l§S$óí51¯¯‹.Çb„¨ëŽ›p¿Œ‡Yå¸9HIà>zSxl!ãD  Öú4ì÷ë}úƒm/$pì8¨£ qxÓÔb:çYΆKÛ~Ïdé ¶C§Œd.J{XÁŽ4Û~OÒzƒíBÇSx\ã9ÇÄp³fÃ~O:zƒíB‡G‰àlG‡ÇÚŽ›yó‘~ßèƒIÉÎU5œœÞ°ß“”Þ`»‚혼'¬ípŠÖ¼áÄï†ýžÜöÛ…[ŠÓ'ã.ïpŠs CÞñ ¼i¾¥Ž }Ú(*¬©ïL`ü°šÂJ5J5¥†¢’xÀ–xÚBª<÷âªæ– ¤™æÜ½rO>âí™ÿW~žò#ž´òc6¹Õ 4ð ,#ü•$´”Œ=iž¿ïá!É8ÿ¹´¬Ö¶3¶÷)eúzö¨Z—ì.ýGë(ÿ-ì––ÆËèŠÛþ |„ÃpHN|5œ¬Ñ°ß¯Cì¶½2 4°Tª?y°SdܖìDhHaþÃ?©é5|xRä¿=;hú@ä}Ú]¸/ðúí.à f„þÃÌéø[Ö¼èx×Ò¸ï6U³…«ÆÁÕXl8¬fÍÆá}î|ZýбÁ•êxµŒÂTÏÊ¢Æá?½§zWÞ•õ~çÝsÓÙ‘+2ÁÂEÇ϶‰v¬rø¥[´XYà¾?{°Rsð:UêY«Rëh»Òq‰ªùXéÕç2 Óuëd³Žf¸ëî Ø¡ìiè®ô›“.Þ=z“$4¢µI¦m4Ó1ˆë™¤}¿áä˜ïÅ&èúμ¦ã endstream endobj 1026 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1594 /Filter /FlateDecode >> stream xÚÕY[O›G}÷¯ØÇöývggö"¡H¹ˆ¶R+¡$i$¸-J„)˜*ù÷=3ÆS†à¦ª„ðx|¼;×3»ŸsJ9¤S¢¹¨Ðõ¡Â¥„œBéŠÉ90™†7Ó” Ù4¤šFBM<ƒPCe]'·P«ÐC+¦¡uÕP º 9ôF*Pø„F5“ª’n$„µ «äžU“‹Ù”€ã¦:¸Ú"o›­Rð¯'ݪà]ÔÓ‚oôa:,0ÌûR!õŽ=J dàT‘Ô 7eR'HUuœA©AÝKQI¦cHl:4LWqiØwÓa¡ªö•ÐÕ\Íé@Í}ìÛíSáPÒêSd^J %[¬`FÉ+é†éPbÅ!S˨”‘äb:‚ÔLWBa2öàj:ì!æeÅb^âƒR“î@”j^VìQÍKÔGiEu0·4ó).L‡=V|ºJ9BÌÉŠ¨1 MššFü°G«Ùü@-rJ€ëJ§i¾õÉ|C‰q7ß:Véæ[Ç*Ã|„‡ùÖ{”4ö@ÝK2ßFBa[G†d¾Á-ÉC÷({ÒRI(l!kŽ!AV•8*$k˜&lý2®Iý€N´”,ôŒ!:"ˆÙ¬[Ê(I¥‚Fê&q¨¤6ÃÀP ¢6Ú@s¡Ÿ R ËC•Ôg»»³éõ§³y˜žžž.–³éÕåÛ¥½ÿñäôýlz¶8?žŸ$´}:œ¾Ÿ~˜žd{3›^Îß-ÃQ‚Üëë@e¢º¢t­é»pOÃîn˜^…é»ÅëE˜^„o.~?ÁßÎÑÙÎùülçb¾ü6?½üðáðN´ÔXQsà.¸HT’q‚{ìÅ &=ãÃÑštE2BïIJD%B'¸G-{‰Îì\™sŽBòl^,Lv®K(Ù’œA¦†Ò#ïÊm ÊÍ ®=’ÜXyoqº´~Ù‹ ¹ö¥=0 ¥µ¬½u%+Á­1ÊDË]¡@õkDׯÞ`—iÿ|ñîÕ­¦ý{az=ÿ¸ ‡gƒý£ßæ³é9Œ™Ÿ./t¸ÚöÚô‹Ëówó‹Õ4ÝOóã“£g‹ÁxB²†yÐÑ~} ÿ÷αˆâe…7ª¹ÀþvBP³ì€°0€T8Ü;Q+Q@ïµiEc`¶Œl†ÚGÄYÊANX»|ÉŒÇtZ[$eD ©˜t›/gš¥õ"QG50:ÎŽ‰½ÞkÑ;o/O>ß"p× }ÀßMà×Ñ÷ø&p©±¡ìœàkõ‚©Ç–šœ[lÜ}`‘a‘w‚1X‹xÁ-VbÇ]Ì>/–0ÞÅ –X»Lðœ9¡®ãzxÁ)ö$^p‰Õ\9&gfÁ¡Á[s¸"Å&òÿ˜ RnÏÉž ’¶9 pŽ8wkÔ+‚²\Ó“zöÅ,‡Ûߎ©×Ñ÷²Ü&0XN¯&Np‡kâ“Úì],§7BX8aâ‘ ÊÈÙ»2L™yçðÄÞ•‘I½pºÀ¸{£š½`Ö•Ù F›¬ÑÈÎtçžcõ&%7‰=7/ø®q¹ \ï—›Àxm7“òR, ÅöU(²ÛÙÚ£)²­OÍMÖBÝ*i‚*îv\õ•ÓdÜspI¼‡4—ï—[~Ö ˜Í`¿µ9\)ŽÊ>s”ÂgË“ÅéÅv­¢Žƒ Ž„+¶Îl½ŠjHËVÆ=A‚)¨+ËŽ–G·FLë9H_G_5NEœôᚌ£#Qó®œ@×^0˜¥ûÀR@P‰œ`30{Á8üo|z³ œQjÍ»r›mdà à"¤Eë3ÎóûpŠÒ¼`½ 9£\” Ü`½%g”õ¦;†lÝemÎ~óVqÿÌpMƒ»FË—N ýqàæ”À |ì”Èö#ÒËÕóë+¡¬Þö¸`n ðto6.ü\qM’‘ÿ‹q¡¿y¬ÍÑqÁú¨Åcο6.4H¸ñ8µb1ÒÄ—rlíëLj@†í³9Œ‹çÕgÎ?ÄHû1?è~~È#üüGøÙóÿ/oØÅJ endstream endobj 1135 0 obj << /Length 1783 /Filter /FlateDecode >> stream xÚíZÛrÛ6}÷WðQêD0îÚ'·MÒ¤iÚØî““ñ0ek"“®H5õßwq¡LÒ’C ¢'½Ì$ »8‹½ GWŽ^}~tü"Ö‘FZRÏ#!‘Ô,Š5Œ1‰ÎgÑÅèìzQ\/Æ*ðèä·Wîá4§«4›¦îã/I¶N–ãç¯_()(™Èã)Fa;+KRX«Ñ±(׿£ççGX„#r¯…7E4½9ºø€£|÷:ˆk}¶+o"A0¢LÂó2:;zw„ëv)RS£’)ÒÜ©RX³.“ÛËòSéÔy†ÿÄê„‘Fž^¶4d(Æ<Š™ ™ÑÐÌ "%<¢H+­Òh^S©)mûìà (G*æÕN01«CåûãhÊ¯Ž³ËuYiª ¬¸ºŠÜéÇð²8ò:ŽT!"iÝ?-Š7/.pî ABj·ô¿¢½QÄâÔ½_Út†à‹ a cë.»nÔJn›/Sn-x7µbª®T[Ø…Ñ|×Õ_)AJÉm»­¹ /ÓÒE‰ó1£ÅôÓ˜àQ57_å7Ulqc:&bô×ô:É®RÔ°÷øÁuoÀ¼€0‹ë§7¿®aˆó¸Š?ß¶ä5tWˆj]­,ÊÕzZ®W>À•׉Wø:_Î ÷¸Èæùê&)yæ&’ùºÜmMks×6Ÿ81—àÉÊ¢Ó4ÈŠ-fAè!b³*‰Þ¨Êº l–l³ç™›ÊWn|ûû›7þ`ænÌr/ð®’\TÕK‰?ºtµª¦òéÎ}†¼Ùõ8>á§€SbFµåª^ºúGs‰5bxÀh.´BŒÍ[òây¸²Ý£¹„`!™æ‹YÛ·׉–âÞӄ蓮„RCÐC…égP¨d‰á|¤)?ÐG‚•íà#L2pD ‰¡$eS~Ü3¿îa’ï•Z…âˆé'I­Bršùƒ¨Âé&No˱‹¬C0ÿW§Ú¦1[s­÷€¶M Vô7©PËܧ¿2¯Ì¬@í !£­ÙŽº‹æ²]¼%Ûå·æDн¡$&<1Ô”ºC³–ü°`®l÷„Çá îÛ—EV~9ßLÛ ¯‚¾•ólfì’òZùŽC#{æ;¸q³eºoÎã\#¥‡Ëy-ùn¬lœÇᄈjæ¼vmaQ·ºÜÀ¢±¨AŽ¥RôˆÉ&Ðn½JGN¹5ì JGŽ9’Ü{æ«4)¡aBŽ7d阊Ñg÷ÁTULˆfUe¿Y‹ìÊZGªs!µs1K6™ªY“Ôvƒîæv±]»yÓÖ¨ö¡VBYÝR£Øäôù;?y»©€újfÆËrLF›TºKW4žHªF'fÞ„Àù{OYZWR¤E±©Oîæìî|½ç+Ùd6KgͪpS—'kxÌÀòêÄ1Ç#ϰ8»šk‹ä&}°Uyw[‰ÚÍñôªôïs{›âHa±Gµ_ûs‚ÞP8Y.s°¿:£w»ñ´Çàð\d‹r7~6’,æÍfà ýÍmñ$]51ßÜ5×üw: vSêbé¯ÉÔ†¥ÙÃÞè[|—T·¥˜[öpHI„ö7¨ ;–¡Ü´]¶¬I s…!OJ Ÿýô þ]þúó†È<›[¬§SqóõòËÔì#ÍjRdd]$Æ9 ¦ÙеOûJ¹ùÃpÝ+e °p¨R©%?¬T W¶{÷JCªªE»Wï WíæqÂé?­¥æ–R:œ¿4åúK°²=JkJA>ù*»XŠ!»I6hMù +Û4[å’¯²‹%:†q8ƨ%? µpeû †áeMÓÅv†CI[LGS~ ÁÊö€ƒh T‹Àƒ”× –,ŸíH,P¬†#zZò1 V¶&±F8ö$Èܾã%®ju¸è7_¤ËÙÞàJ轩ܦü@pƒ•í®Tˆ¾,^ƒv™~*Ö7ŸÒ»meiw„„«‘C¨)?¡`eû $bÛ¦ ´ œ>¬+)õ¤+1­`Ó ])†t¥¼Fºš9Käð6éj–}Ú4/u!](ˤšÇXÀ›÷d_rOpܯ-zÒNM¯S{aܧYRz«ü/ÈŒìkoïÏOÝwi6ÍgŽÐ„é|ÞàUýA¹·d<:9{‹ˆ{|15QÓ~€ó“Ñ£G«ZlïþóΗI2:q›mX^)k,/|Ñdya²¼0V,/> stream xÚíšßoÛ6ÇßýWèÑf†¿)nOÙÐví°­MòÖj˱Gö,Yö×ï(ж(+±eUA3h!‰¡ŽwüžÈãÆÁM€ƒ7ƒ_®g¯•4Ò’Êàj‰¤fÒpU$¸š‡—ó$›'£1xxþþ­½¹ˆgñ:N'±}ü#J7ÑbôùêÝÙë!”ÌäJ¡Q®°%ôWáðÌ^(׿Á««Áßp@v>PxS“»ÁÇÏ8˜ÂßÞq÷EÏ»@Œ(“p¿.¸Œ Wã#˜[x5@AæÖ§hUú]ÂçʹýSá¥3[›³Q­]ÏÕ2Ióxmg%_Úk¨ÞÛ‡,_o&ùf]Î\>r{7_.¦™½MÒÙr}åÉ2µ Ñ—å&wØk<"bøÏd¥7qÍ=?ä1%HqŒ‰F!-ƒÎoó¦¨C²µ:O&·#.å~Ü™kHRo"öq²Ž£<žnã"„ ÑX$ÒTû±,Wf¢²†x8ä¡í:?¾xõÁúå¬÷‘ ¤ŒLX?Òå4n‹r„¹<:¬ÐõLÒÕ6‹.ÿD¤9!]ˆùÒ5EeôÑ&ŸÇ)¨ÁßÊ@çñä6ÛÜÙ§i”GÂd1Î}gI¼˜6Å©‘ y{ù>aLEO¡Ão²øó!Â!ó÷&¥˜‹Ûøa“E7MÊNÇ'd¤ý¾Ì'ÿàœ5#·³f1\à¾jBJD"0R¸–‰ž‘§$ ÌÚçæQ E«Šý1¡ …ÛHJ½.bP¾qµ`¶wÝY,\¼üí-ü»þë÷R„™YfeÞm&“8Ëf›*‡'•­rÌaϰN3X¯Í0ÆvVl¾×ÑêVìr)2_™Ý??aá?±®"-Œ·æò¦¶¥2P”Ãæg"4;ªiDÂêÈŠ4LÃ:fÕ-Ô3Öܺo_pD4qXÃÄôîjßîÚ5ûnû?f„ª-»…tw¶0¸¾ ìÍEYoè†rC…8$P¹ ç^jíÛ >Ž ¦?®~õ}è­Lg“ åö º*Î{bÄ`$déÝ™ˆ…A¥#ÓE\ódøã±©ÉN¡.ì-U|ûS¥³³G¤ “ vF ƒI$hµô¾¶ênšÍjíËö¨nà§’UáêÖZˆ›7U¬?Ñ|ûEëìlÑ`ïÒ;0]—%vE6ˆÒ§}m{ÆZ¨õ?ƒu¾7Õ|ûUëìlÕ –˜¶X–%ÆÕãÆIr@4 ¶ùÞäðíw”£³³mä€C·äÌÊ1)>R8¯¿Þ—Ö°¿­-×1¨AûÒ¶f¿›¶Ým£-¦H†e ž%ÿÆ×GŠ»ˆÓº¦âýùhE$¸Â.5oTj‚f\ 1´!þZS¥“ad/; ¤JŠÅ)Z6Y’ÞÑ7'¤2'¦Ë¶,ôëÿj¾B?9„ ÍŽfq¼ ǧòf‹lʾ[äa^í ¼]š©¼}^ÐT9{* ŽÃ'J`ºEý°×JÞÇBE#8/Á|ÚÖ|]Þ9F“e[€¶w¼LÓ˜N§qÀ†¹wÜ丘×âhjbòûfÑ]¼7Tþ°ª!”mÿOÇaŠ(äU½æ®]9tE{¬UØniÜ'>‹År²#Y_žHL±=¯$i’?®×ÓŒ!Óâ–ï€ö…Zñ¿´Ü/-iU…ÏFëuTºzŸäó^õÃl&~ç-‰Ÿa²¸ÕË}w?ÿ”8ak7.ŠåÌyûLÑúP*„÷ô©% Ê®|RËphH-Ãj‡ƒL›Á9æê“ZÓí©5/Cj¥±/nan PhFñH­éëØGáðŽÔÖŒro‡Ãí¹°ÅǶ¦ãîHm:¸/j feíUŒÊƒaC—Ç@néÍ,ª\ÃrÇr ƒ†åŽÈÐà6óìá\Ó`p®¹–8×ÜjP\‹¹A›p.ãÂáÜJ_YâÜÚP禲]ÿê|‰:oûw¿ÃÝ w›~–ÍaAÆü”_eÿù^‡l endstream endobj 1190 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚÕ[]sÓF}÷¯ÐcÒÁË~´Ot(”¶Ò'`¸ˆ³”´Òê6^ôa.8Æmå›_„».ªOnƒÔ·õMÆ9bДæ i<³î‚ˆé¨1p§Ë­íPq$ÈO}sVÃþ ÈÅcMú˜ Ú WKæç°~®Š4q-µÙ)«âV3­{ ôbßožøwö»}±½i¯7.Û]UÕliW§ðŠmUÿvˆñ¶°Ù×K7†z%Á¬»ÞÝ2Å‘Æ#ºoÖðb¸¼^ív—ÜÄöùºD&ufF†–ûݤ›¼]“n’ãëÅÊ[€!ÅY ºUœ¡yT±Þv"õñ÷?ß¼©Þ©òÄë¹Ù;¦n/–6lÀ¸Þ磊87Ê™®ˆs &HÐÉŠx?¬ˆ‡“í_ĹVˆñÚñå÷×n‚i§x—ò;å;EÜÈo¥†?集 º',ÊdYÒÆÌ’`²=²„Ié!a2èõšŒèõ. Žõøþ¢HŠãÓ‰ÒÆ%˜ìQ¤@œ¶ Ø¥½n/4\(eÆí¦[`TæÎ5wðU &;D5Á—l@Éu[¤(²øb|i+®‘ÓéÑÆÔ#˜ì=À݈ÚIßUÚ"É‘#·‘M“²îãCryÁ™B”ª‡¾¼hy½ZNL«ù·š=³€@ÀæÛ\ÄKg—£LÓp1 Øt¦)ç*§ëü°œ'Ûßô1¥o®ÜǺ¾*\,»ÖO~wÖIç¹§ëWüÀ\ &; >2鮨cX?&œÅUÓ‰ÒÆ%˜ìQ„óã|¤(ÖýH”\ÚüXGê-wVWO'N?Pœ`²CÄáΗ‹ñâ<ˆ[` œ?7ÿ‡[`˜#z¿Y¸Š/í(§@µBڈ霅Ë[æsÇü°\'Ûß)P L){ §P&@×*àïÍ*Pé|ët]©ƒ˜,Ád>* ‚ Ã*Páìótݨƒ(J0Ù!¢göåݨ·6ÜÙU36mü@m‚Éц;o­Æn˜Ö=ž±â0†ÈtÒ4Ñ… $:DæÜµžÂ]qp”aDÂîŠõupÄD½×Âù§•†;8¢4ÒBMçàˆtqºúßÁKåp²ýQ-ÈÁ9ý¿ûßzˆpzº~ÔÁÌ•`² ‘¸ü…ù ‹æ)÷o >P’PªCáÎRëw‹lý\ë(%¸S:ݳü@-‚ɃéòÙSÿüð.ÍzÊ‘¬ãÃÃÝ•ý\¬FKëž–Ó=àÐÁ”6˜ìi)8ñêÊ5Ûüc=¥1ª‡Çº> stream xÚÍY[k\G ~ß_1íƒgg$fL ÜZMÚš<¸ÉÒš„ÝàÝÐôß÷“ìMBìm»„BØèè|GÒÑ}Žk­5•„_JÒìNÓ¯%Uv~†s49§'êΉ«sfb5•$E j™ÆÜ)FpjìIm8§%¥¢€è ‚%Bv«§éœëûjž¥¦ÍÐÄÓñ5ÕæÆS:ºQ2!ŒË¡~?³ú2.Ëœ‰J1žPbÏJ5 :„¹¨* jT£ ç5PÝyp WçÁ+¬Î‰Äm†HšñtÈ4.©I…Žm8:”Úͧ ::™SttutŒê<èÍxŒgg1žjâbnª ñÀËA¢Âìq„i,î!%D‹ìÍ•÷æ8[”Ú;t@¥t*RGº::F5žåï1 oºO!ªU¿;kjäÉ8 Ô4oLËFOG$gãa9‹0Åy ª[ŽÂÈÖªó(uÞLM ¼ƒBð@A‡NçAGçAGγ”g^€‚ŽÑ“S7’–ê¼ Êò”­–§„JUK.Pj:QCì<±jâÅéébù${Õ”ôsZþòëo°-+ðzx¯õ»7o^,<¸\5O”w \ZžHÔX§ä φÀÒ{Õ(¸fAÁ’±ˆ•³Ô¨äF°9ˆ•šÒ'æ’­\bà:3Ò.F­ek»1p×Í ”x.ü™ãÎ6ë]:=M˳n ùú¡³axO£Mò m%ºÇTÔÒ@aÜ Ðèö4jÜ\@ËòéÕæå³Õ.§åÓ'giù|õ~—>ðüï·+ܸøcµX>†1«õnkÍ´Ùó‹åÏ«íæÝÕËÕöºÁ:ï§Õ«Ë‹G›÷éÜll³etå4¾1_@ßÅ„`°ÐŒ‡ëõBϯǙ™åã솘7—=Q÷9ñ™©.m±|öî÷_ÿx¹~½X>Ú\½Z]¹AåÅòûåËÇçÕ/ì^âíÑÕrÃ\•‚Ê@'$³©A™gꡇáYZ~·y¾Iˆâ7Û?/ñïäâí·æÇ£!"yà÷F ¥æ9‚fœlW»“ÝëÝæíîr³ÞÏ*ª!2”U`ª¶ Km$f)tŸU—ëËÝñ ©cä‰AždÆÌ#nÙÛ;LC¿V”°ÖdUØ2:Ö Îl“›43׃¢t±]×w[”×ñÃÕGÔé>Zc¸yH°¼S¡$>tª“Z3¡ì0˜o·ª[èýÄC!MªA0«k‚g®QÉ ¯DMÖ2s/aÁ”[XpͶ¿†À6Ðg ƒ)Ûº£nÂ’QõU¢’çzç(½ ,°™$&éÙNAA0r.m²¦–Ìœ‡F%a3 bQ[³EÁ¥`1 Ƥ΂j ÆÄ·Œ Î@¹~¾ßü_Wí·Wm­,8%ßZYÚ~AÑý‚¢ûEiOðžã®,½{í7ëôhžXÁïoõLJ­!`…båž@v”¿>aÈAÃðÕÅîâøsP§¨[ ŽÖyÜoØ‘·–IYÖí‚0ÙG Û¦¾ÚÒr³RV j‰È’ľ©”ŠÓÕÅ_Ǫ+—Áâ„3ÂÖ^XT?]XÔ7³//,zû Ö,s©Á°¶IT²ÚJ6‚à†ó|JD‘‚XlÍMkL’µD%WÎ*“}¯Š‚qø¿óãÆ`œSZ0€dß+fTr³NÛƒ`û`уÑ&.Yk0ÚTgÖh© ,³tè ã/Íò=¤g¹=¤ÇøÏCzôcÎÝ}Çj˜xE>N–Ö±•5:¸cyÈëSôþXäáÄ’}Ì£(¸gº3Ñî7L=–ißfŒóýŒ‚GÏ,AlÇ|Á÷ 3=' =H9fl,Á÷ã¡ñ2Nýá2rŽKT²š›£/ØÌÏÁ Ð”l4ŠÇðZ J®ÙþV”\p:JVós°©™Ÿ5óó'Uõ<†Î endstream endobj 1229 0 obj << /Length 1368 /Filter /FlateDecode >> stream xÚíZÛnã6}÷WðÑ)Ö ï"Û§^œm¶-š:~)² Ck˱Gr%yÓü}G¢ëâ$’µ ´@Ñu8Ã3ž¡MÐ-"èýè‡ùèüÂ1È`£˜Bó5’ +ÑcàêP4_¡›ñõÆ7þÙ„I2þþêÒ6fÞÚ‹¼`éÙ¿¹ÁÞÝž}š8¿ÐiT<Žƒ5g0\†¥$ôwôøÜ^˜0é;£é|ô׈B'‚èÁoJ´¼Ý|"hÏ> ‚…Ñè>ëy‡$%˜qí-ºý1"e¿4-™Q`Jа¦Ä™[ wy»Å::cdÞ->¶žµî#‘þif"ÁF¦ðéå}Í`Ž"Ã%–"38½/©ÂŒ İÑEZ—,¬¢¿Û€ ,µ*°À4íÝ?Ÿ*~1»mF(c)l˜ù Æf€Ñ-²YN+ЗÑ*Ê´22'çÕKØ“8èfB #¤@ÿÚòËoC_- k ùƒ&\±D*/r!0§ M(–ÊXÛ¾y Bb®Q©ãÆ V KÆïÚF"åX1g¸@©â÷ ”ÞÆ¶®8æBÁ`0(•åĶpã€VgZAèÂè'1—ÓÉĆ•ÒÃWÅïI\oc»G$¼¬:,q«6]ÎÉÃîä…¤ …«Œ~?>úÛe6Ʊ|,à nÉÈrãFU6¤ÁÔ9q±¥üî]ƒßt×þ®-ÇZc‡õÙµk×'U•RvLnúÌsW…¦šÌ¦W¶nB¶õ(D íöï¼¥Ÿ>ðòWç^MqÅùó JÊ|±!¼¾¯€@*›ÈÖD2íÛfÅ8AÊ*ÊZ“ƒgm7ίÛm¸t“ÂàÏ2-¨¥¥ðÈ<´)Ùü¤ª¾Ü>ïïDpœÞ™P0˜ÉZN®9Í H§»Óá>ÙíëÑ—3&Çn仟 ×ïýdc[—>¼ß>‹œwJéK>q7 ¥¬OêúEj«¹%@‡ª¸ôƒg¼Êboýà·ös6vÖ ×͈MœïüsÑþ.òò{ùök_Ká^˜X¯ZÕ˜-'€×˜…·ÖìlìŠÇÑãºN×rÝ%Ș‡az4ó’}ÄÇ–¨ÄTêÖ=ö,í¤ÿ| ‹ßÉ3Ë:u1'0Þ/—^¯÷[œ_.¡Ò•%`žp bûH AÉØKP.væ'PRÁ§‚ûÁ‰€BÄ)¿7ù‹ñØŽ endstream endobj 1252 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚíZÛnã6|÷WðÑ)j†‡W±}ê%ÙfÛ¢©c (²‹@ëȱGv%9iþ¾¤Dm$ÙÙȦ•¦ÝèF†œÃsF” ºA½|?Ÿ*4Ö’J4™!!±Ô )m¶ Ðä]/æq6FTáwçgåÎ8šEi”L£òð×0Y‡‹£÷“·Ç§A”Ìr¥pÀ¨y\%¥i¯‚áq¹¡\Û{'“Á_0‚GÔÜ)Ðôvpùž ksí-"˜ëÝ-o‘‚)“f.¿H½_ÔhT˜°æ%•¬èÖU¸J£ÕÕ*“¼äôŽbþ¡ F°ÔnÞ´h2¬GŠ HniÚó$¦ÀÅ:Ð(Ьƫ‰¶ýìæ(Çšˆê%0ØÖ¾ønLšøÕ˜vyBKbMõÈ€é *wÆNL#Z!&¯‹I š–jZù ÁžÄA—# ”mÂ×ï,Ú¦ we«š;ç˜E#ÀBê’ØWOAÌTk8“ëEÔ¢2üºk3‘-û‹’&¾g”x“í%L2ÌÌC(C••ƒ|zöËIsˆ©¡ÔY0“+k-gó½Õ"¶Ïª?µšøžjy“ÝE-bò§õÊsf EmlsÓª1bÆÝ²9˜ã(_§I¶-†±¹ ±`uñÓ™ù»úíçò0žQ1t“ [O§Q–ÍÖ ì_7Vz. [˜ƒØbÓ(¼ÞË hÕŸ f¤ùcb:xÅháûU ²Ý] à«@ú¹ÀB÷¶ îmUG¨a…±2‚éþB¤‰ï"Þdw0ÂdÅ€ªWe“©û«ï©•/Õ]¤‚À¼NŸöHr,„Þï=ËÛ#  Xhx È5Ŭ*ùã²8mXÁÊ:ÕKø,]ÞÖ= óZ‰kºZ®Ö cºÊ£›Ø–л#ÃÊ¡ÜÙ3a‡¾øÇWìmÝzþq¹ÎWë|3xœÏóy¹—Döâýâa«z.„`øYùÎ,´“ï.ÚË{2 ¸¾~whëÉÁä1ß¼Tµðýj•?ÙîÖ“ Vø/ë™…wQÖó…×Óí/HšøžAâMvGÃ8Åœ¾*ïÉìʹbý‰ÕÄ÷Ë›ì.bÙ-áßZ~dÔTª€¿„µdĸ6×Ïðˆçÿ^d­Q~–^Q}Yk|z­1«ÅàÿÖúmûòœ/¯>Џ»÷3‰KÎú3 )–éॢ…ïW*üÉv7 ÖÊóë³o˜®‘–ÿ5û°¢ýýH¡…ï&Þdwp &Àé(:‹b—Æe¿ há{ŠâMvQÌL!‚ï0y­vªæ«ý'‰]†&ý}õoá{êáMv=3oínedºL²ŽŠLçaÚTC˜7;µçʰÕ7 o#æ….ýˆý„âíãî¢çܹ³/Îf«hÛ •žüy~‚Ýî<Ú¼ñ>^,œsvgòtÔ uì> stream xÚåZÛrÛ6}×WðQîÄî Û§tê¤I“6qÜ''ãa(ÈæD¡d^âñßw!€6IѶH˜iÒÎÄCŠvqv±{„àà<ÀÁ‹Ù¯'³§ÏUD(’T'Ë@H$#¨®Š'‹àtþþ"-.ÒƒC*ðüÙÛ—öæX/u®³DÛo⬊WO^=}â @É W …ŒÂt[,©`¼ çOí…òȼ3;:™]Π¹µÂ›"H¾ÌN?â`ß½ 0âQ\mG~ Áˆ2 ÷«àýìÝ ;¿pÓ?‚¹µ‡7EÜÚor½q¦7ׂFH„ª¶üç­¡5rgÙBD£¨ùìíáñÑ[».åÚ^‹ø€âù×"æuÚ2X°P‡à©°Ët¥Ëëî±’ $¤nešmªÒ÷õ€Šyœ§ñ§•£³Øè$]^§Ù¹sÃ̽½[/íõÆ´];ùÉ}¾ÊÓ²ÔÙ‡¥ÝcGgöMƒøÀB†B¸ÝYˆ,þòÍâ*-/šoçn9mœ½yÔõ(RYÛI;û±.«<+züaîíÏÍÈÑ®ùï/áßÙ_ØéÒxè(,ª$ÑE±¬VÈMO‰{ÈââY°….,ƒÛ„9ûªs›Ç°ÀðG¬‘(ÆNsyÑIm†,; µÍsA$¢„E°¹–Í\n¡õ?Ý€Q“Þßâ3ØÞîmøzÚg‚&”„(ˆüMÝâåç½9v»^Ô³éIëLÃ:ìËVHí⧇SŒ{io¾z3Єûf¬®#­7çˆ 9ÉYË~º B q¶XéŽ)ó'û!…!?Y´ñ=£ÄÛØ=„I†—0™@´^d·kÇEFŽ AWå…ÎÊ4‰Ëu>šB¦t:rÚøžäx;„b2f$7аm³xçe—³ÿ²/=8D˜1Ÿ ¼¯Uk Ç”P Åw Ðå¨Ê#U© +€6$œ.nÛð~aëmêþ•GðŽˆZÁÛèr§òpþ½Tž!$¸Q7ä±3¨OÌ S;ÜŽq+a»¿e•%eºÎì§$×q©ÝW±½dÚ4‹WµðQóεô›õ¦ZÁøE·I.Öu{¼ÐËbŠÁªÕ[¯*]Üßöㆣ³îJwÛcŽB<¢Ý/jÖ[§kçW«urëÛ'Ûê:&H#6·ÛÐL³´loE·aq¿(€VØ,@Kå< FhÒ–(€úÜ$Õ »Ü^ÿüûõk÷Äņ%2]U¹!.Ïâ…Xœµƒ1»7§ ‰œn÷æ€ÂúNµ}wðýöoc÷ßÀ9ňpá#L tƒ ³—3ù£‰ŽESÉ>~À´ñ=ÆÛØ}*ÇPòC9VDô”ú½IaŸRý·áý(ñ6u#,‚’@U‹‘Ϻ#å°edT*í€  ,d“Šñ¾'iÞÆa-T Ƈühcò¨¨Šø|ô¾Æ@uM©¿;øž|x;„%Çëï{"˜ÂSð>ùÀŒvƒêºõø(KòëMéÉߎŽíÎ’õ¢n™»}<ªŠ›£„ϦÔæ äÚ ÏÜ{ wiêDCšõv¬ÿwÑ9(iIy{¨uÙç´éãØÈC­wí£èçîdÜ—èÕ⮃‘î™Wˆ8§mäªIÇ~ÁÕûw®v¢¾V…£qY» m¬ƒF~ÀzP%JíZ³?ÒAÕÖšõyo.ÒäŽd²s¶÷~Ö¹µ·›}çq;ZÇW;¡Ã}í‰(¿ôjŽSê!=–ü7Žï.Ï:……ðîG‰q¢ ÿ#j:1N$È:X©z¾_âoìþbœH…$—~bÜðo¨ïHð臓à®lB ÞÁ÷ oc´ªÄxªC‚N¡¢OÇI Þ“_S‡0µ_Ñð»”à*ŸP‚wð=Ió6vk T½ÂßL‚Š‘˜P‚wð=ùð6v:Ñ$xõXˆ‘Yôh2…ã(Óëëî/ÅŠù˜ÿ-ùilD« endstream endobj 1312 0 obj << /Length 1526 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯úd3ÃïíiÒ®еi^†¶0TGŽ…9r*Éëòïw)J±$+‰dFéŠH Z¦ïå¹—9y®L`‘Tç«@H$ ”«"ÁùEð~úngëx6§OyóÒ5΢U”FÉ2r_‡É.ÜÌ>ž¿:y®q P2 È•BšQ®À’ú+==qÊ}frz>ù`áŸ&bd„…·—-ƒR˜Š)ijÛû‚HD (2Úi¬j6Ѻï@%b`~9€&¶·/~9;MüjvûŒPÇ’ÈPóÆ€éeàg%­YÐÊë´Rƒ¤¦Ž×8ÉawâïçSŒÛ!ô¯b ¿þ4ôÕºÚX(¿8„«R¤ñ ã1Bƒ9AB9Ó~¸ A ¦ƒ}¿u˜\Ø1ý±o¸Kœq¤‰ï&ÞÆö&b\Â`)ÊêËÚ"ÌÒœiÉ‘€Ñ-oÒô$®êX„ÒÑÄaޏ’ã×Ä÷$ÎÛØ!Äa…”ä\BÎÚdÎo®N$˜3$ˆ¾þÆàC‚>ÐX8>–Û$ëÉÈr¦M6„AD™l–ß$¼:à×îÙ?÷æ#AµÏ¦ÝºÞ)ª¤bˆV«ÏY^T’j~vúÖµíäZ·:Úqâ®Ùu´ŒíQùèùŸoNQÃû“ç× ÃÁœ‚fÒí}äQÝBÆ :K‘öS ²áŒFÔ˜ªgV“†%xѳòºÙl—a^Ùûé¦@&µ¤…ƒnIŽ“8oj¯=·÷»;ç Ù;sXè Q­5¹í4F„³áNowùõ.wý=£b¦qø©rýKœ¯]+‰ì—_67sáhÀ¦ç´tGZÕZqÉqqrCEÔ­nâäÒ}.Æ.ZÛÕa¬æÛ’êòs qþc •÷Ê×=fá˜HU-[¤Ösÿ)faO«3»»áqz›Ñ6‹Û.U¶Ó£³(ߥIÖ¨¡{;tÛ³Bt“þÛKø[üñ{¹¦¬¬‹%Ùn¹Œ²lµÛ røzíd“Š +‰ATwUOO£|îòu”ä1Äù6]De¨ /¥“ˆc:^)%(ÈNÎFÛÚ[ø~[»¿±ýK)Ø ‘bį”º¼#X…©Ç+w[øžùÛ!¶„²m€ñ«Êêvx ًّ ˯$)¯má{èmìý,0ègò@!z§Šö*2¹¡ÀïxEM ßcÂ@Zì‹LFùã¥Rg%:¤RáÚ ¡ž¤RáŠ"Z­8§ÿäi¸Ìªµ±¸Ï„˜¢:®¬E”ù_#zœb¤^=ªÖJ›Â†\ï²ÙEw+ÕûJÕŠå– 9]Qåë°ün½Ý\dÕͨåÑýŠ›ÁJ‡)n5Ü‘Q·¸OqCÚ“‹¿ ‚‡ mW»D&´§H’Ñv›&¼ßfãmj•Í FÕFû«l ßRß:±PÚûÄ≥"cI1bœ4ñ=ÅÛØª„Ávh˜ùR‘Áv- ”&¾')ÞÆ!…2T¥ï(çHy=H.2[5bþr‘aŒX5 ¹hݘUûývŸ×Ÿßã׌] ¡÷ñ|ÈRÃ_m> ·{½èZÑŒˆ©‹ÌŠÎ½g÷+G[ôIÝ$åQŽ]ïj¯¬\Üå»p³€»8.×GiG¢a4b<íHFŠwÞÂ÷Ûüí/‰âSî'¯‚ ¥"™üÖT$V“ñÞmµð=ÆÛØ‚…H»Š‰ÇT‘CÄ TúIÞ]f¯~ æVÕò8v›ÌqÇ‚zû&áÙë"#ªÓ<—ÏÊ£Îë<Þ–@qVgæÍóù[¤ïâæ+Í×ÅŸ£…e}=m½jê8´ÿï†[ð®ßÜrÈHW3 ýÉí¿õ]ß endstream endobj 1222 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1545 /Filter /FlateDecode >> stream xÚÕYßo7 ~÷_¡Çí¡:I$%  ô² Ø€¢íö Yj¬Á »K ûï÷‘¶“¦¹¶êº&(`Ø<Þw$ER¤xÎ%KH!—\‹ý¶ÐýZC&gôÕ8%…RŒSr( œ¬(;G3AAT 8´-X‚Ö ‚Rè]ÀUr4PÚ"ˆ#çá+7çùãΫøªÎk°*3Ûç<|q2Ã(fã1tpwt9:D‡¯Zœµ9:š­µèhÕt¤h'ãÕP’A ·ß5`樄$3W(qÿ ‡RÝpÜ(UÍ)­8RZ˦R4;R¶®ªðtO¾h¸º‹ó ¨î< ”Øy J'ˆ9¯‚jÎk+計“Ýp'e³$[GË <2­bvt°::ÄÂSOHs¤´ÔŒ‚^Ó•âw[àìqâÙ3¥h L¾J¸ŽÉW‰P0û*U@ù*±Ðy"¾JeÑ H®¾J¸˜«¯²CG+ÎƒŽæ«DÈX³ó CÅyÐÑ“ó £{,;tôî< ’ÈtôÊ¢E)É-Âc‚ä0ª±­ ™^|p‰­ƒ RØÒ–’‘nÉŠÒ̇a}JCMþDê¡fKQD/Teé*™ÿlo!…ºQ5TÎÎk Äq£‚aã!«tZ,¦Çá[´cw? Ó¯¿ý¤ÆjÙ¬mí.^¿~±¸ÿãàÖ£åíXKÌØRƒ’sÌ:*¹¦hs ̰9?&†kàÃõjÂth•h÷Ð!ª ü»¥QÁ‚" »;Ø{Q×Ë $JâîÙŠ‚–éÉÙúäÙrŽÂôäña˜ž/ßnÂ¥Ïÿy³Äã?—‹éŒY®6çV†üùÅôty¾¾8;YžoË•ó~Y¾<=~¸~ŽÌFé26ˆrŽÚ_@ßñ„XÑ®[üƒÕj ¡GÛªmfyµÝâÄ{öø#‹éÙÅ¿þùtõ×bz¸>{¹³mø>n*=ʨŸ©P´^6®‘uÐuhpQʨäÄQÞ¯êŸ.Ôóx°€ÿçB-åf¡–ôå…ºîê3·=¡{¢•Š-9â€rU±k‰’õ*våXPÕ.+v“˜s¾ƒ’ÝjÔ«‚­-¶Ä·oŠ»4÷vh8ÃvßünßÈÑ&²÷wÑŸìs`B=Ã3î1˨dôóÜG%[ žíH3`T̃`´o•œq–œb›-«s`Tw-«3`ª-æ4 ÎH7£1Ò(X(RÌ:ây0Ú6À´Q(Ç4.§ÌÏŒmÚÛ¨d‘˜ò`~f†ÍÂßFWÔt³+6ýâ®Ød×Û¾=¶ö5š!÷‚í}Õ 1|Ç&wÐ 1æ#èWã QŠ½Þ¢جh¾WpN†CȺ€S(iåã9¾Ø¼B OOŽ7ë³ý¨õÏ™cÚÍi¾JŠ–c`ì2{°£Nê(Ø:ÝìL0.ˆj\ T¸^(››ŽJFRÕÁ2ñîݹd•œ£U¡AÉiþ…Ó,8õùNs`ê:ÿÂiŒSàì §9pÖì¿c`sÛ¨ëêXÓ(}¿ò 7²ýŽ&?Ûhòg$R«ßÆë7Ê7§:{™þ…ýË^{Û²W;¢í Ý_g¼ãío‡Ëé.Eîw0ÍàL‰d¼îf1ßÍpת\ïj½ƒƒ¿zeG.°KnÑ!¹ãìžJèoÉþÓ¢hÿ—%„‰>ú¾öøÍÙòï÷ûºý12>g^CjΜ¬–Q0Î0•±¬ª–ApV”A'˜> stream xÚíš[OãFÇßó)æ1©šaî—öi+Áv·ªèBÞè*rc'D ë8´ýö=ãK°MvCÑ"|Ÿ93ÿ3çü옠"èãà—ÉàäL[d±UL¡ÉI…•åH[ØjŠ&!º^^/7×ËјI2üðǧ|ç"šGIÏ¢üð÷ Þ«Ñ×Éç“3CƒŠ;ƒBkl8ƒî2[ÊB{m†'ù† ëîœNßDï}`p§D³›ÁÕW‚B¸ö,¬Ag-o¤3®`…._¤:.C+n”6%ÅVä®l²aMƒÛ$ú6]ߦËu¼É½ú“Hÿ4s`+Y·ùØp”cMÒ\c½£î¼¤ 3*ÃÖX”Dh^ñ¬nmÿÙ‡0…)ce¹aêZûÚ/f¥n¿œÕ6=Tm)l™}g3ƒÉå;…œ [&§¨ÊÉ,E”.ã4×ë t5¦„²_ùê½ÐÒ*h衸ðÐX¹.j7r!0§ )–:wì‡C$æÝ·»âp5üþØ6©Äb½·©Û÷Œog[ÄWs¡ 3ƒ…¬å²i°‰éÓÑâB ’£E!3Øö&Jݾ§(ÞÎv…hÈä,e k—³i}ý"²Q›­$e[.¥²á|,šKÚ­fúskå($qé“ÓÛƒµV˜%sÇOÿI“`–æE5½ŽÊª;>ß(8ž'ë›Ý•‹Ó/ù>Ìâ:ß[oÓÛmº;¨.¢d$å×få䌒ª< ÜÊfJ‚rZu lˆ,‹úO ›µQ0gË–› JƳý X°Z­gA…ùá_ÿf–i)8­,Nw½HäËx™Ökö½èw,8vgÆ#¸)‚g·ä›ƒ&˜ Þ}ÐUJ…Q!Ϻ©ësX‚å7ƒ½á¯+Ž’u÷÷ü@ôd'fë8 `ÂãÅÿ«qÙ‹Õ•>Ç€MÀcõ¹¿ˆÒmï ‡’¥²óhJ‹™[—¿~‚¿éùoÅèæ#&‡óü`³Í¢Íf¾]á¢û*@ºHRÁú°@Æü0BNƒpDÉ0< %¥b˜ëþHRÿ J{+H û~ÉßÙö$)¥€­y”„›8©™7Nv.‚~@)ÉÒGo¡R·ï*ÞÎv` ©@—É÷eRºœnû£ü†}OQ¼í" gXúPT$_¶>´(á™WV9¼?Z”Ä`%‹WÂð R\ÆõzœÔZÄë¢Ôo¢´~Ï2ÞaÀm7Q UFJxE¦9ì—õö~6fÔ»ú$…ð6Qr磤¾²ÿê öÀDŒ`b .¿ók¯üê7Ð̳#Gº|«¡ö@^{„¼µ…Q¢z†û×Òclët±¢ÛšÖþšWcÛ$ºYÞEGá-7’—éo¹vYÒöVöýꣿ³íù–k!£Ÿ‡o]Ü5Ár öÆ—+‰uoçêæ=cÅ×Õ(ŕń™×à[aÚô÷ÐѰ爫·³]D‘“2ì_šo9<‰ëêcA|Ë9À¤àe}ƒrd˜ãaÇ—¢ýÀ.'s¦_v¹Âã;ÆÝï†vÍ‹ân²gÍu{¯û†Ù÷‘O¦yÊ轌Bž=¾Ôe’¬1½͆}¿¢éïl{èeDb¦Õó@¯“ÿͿԥ–Úõ÷|Ô°ï*þÎvà+ÈX Š~ 襆`¢ûÓ¤fÞS_W»(â~—æxâõú€j÷Q{ ä¥Ò‚$Å·—QÚé•n½x/ãpé@åý§ÿw–lÁ’ûxL@~ ì™`òÁcV+~4XRZæÿóYÀÎø¾OV¤‡üg ®_¬þÄ«»Ã endstream endobj 1373 0 obj << /Length 1267 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£3Ì ¿?¶§nKº´–:yK‹@MäD€c»’ ÿ~—¢´PŠÓJaÕº]€¢(êð^žKÞCÊ]!‚^Ž~;íj‹,¶Š)t:CRae9Ò®š¢ÓKt6>¹ÎŠëloÂ$¿8>ò…i:Kótq‘úÛ¿“Å&™ï½;}µh2¨¸ZcÃtWbiíµïû Ö½3:8}QhD½·Á›]ÜŒÎÞt Ï^!‚…5è®lyƒ$%˜qå9:½‘Ð/C3jLI±Þ”¢të> stream xÚíZ]oÛ6}÷¯Ð£<Ô ?Eq{ê¶´k‡aib`ÚÂPm¹êÈ®%Çó~ý.EÊ‘d;±Ì*] DIäå=<—ä¹”±÷ÑÃÞËÞÏÃÞÅ ©<…T@o8õD€Å<©à*‰7œxoý›Y’Í’þ€ ì?¿ze ×ñ4^Åé86·Dé:š÷ß__¼±‚Á€iƒ\J2 ݶ$ú2ô/Ì…r¥Ûô.‡½Ï=•°Gî} ÐRxãÛÞÛ÷Ø›À»×F\…Þ¦¨yë ‚e”çÞMïMWq…¤âFiS¤¸q%+`¢å*þ<Êâ|­óYœæÉ8Ê+ãß;,0ü“ÂIŒ”ÐèËË†Ë IÌ=É„Á>¸¬Ÿ  J¸G‘ •·Š½iÅǺµÃO÷; 3&ú¹1LtmWûv|êöËñ=¥‡ª­)ª¾€³…ÁÕGÏ®-±0À±¼J, §Ì0›¤¹!ì¨ïí€`ŠñcAPµmXMtLØûfËÉRkÈ8GŒPo@”ññ‡c&b¡W©8‹ÒÉ$B8Uèû!ö¦Nõ)öïúDø:5ƒyÒ'þmüLßI»X›Š·ÑÖ6}z$³©mí¬³ø8Ö¢£ªrŽ&“ºr>†]·L`銣‰uh3KÆ3Ó'Œñx=‡±ÏÌý‘Á©°©SOæ.R6MVfŠù,±¥é:ç‰x}—Øë"µ,ø´D5w/^\­àå°õMa¹f5ÜG!h›ñþذY›!¢J•5³JžmX€ZŒ£nˆÌã‰]j“¤É±HôÆ;à é'¢“õNø6AcD8kº˜µo,W tb!63rï×Óà ²BNëvJ±€*È Ï Í†ã.² óE æÐ¤ŽÌÖ=„®˜Îƒ‘HÒ¥Èjb8Ų=³n¬²˜Å´œFÓ'½Zĺڶ€ ÒjŽF]ƒ¶‡˜¤ËuéÛjY›$ŸÕ¼'çùO% ˆÚóßîÒV uÎJ¡ÎÏ—F¥d¥ïb!PÈ»Žóõ*Í¡ˆ@~r*ª]ÍÒbááÍo¯àoôçïå2mWéõxg²ÝVø´—ç#‡Çù³Þ ?iùqÆ ghgÙÝ ,A`±»T´aßM$»;{ú §a±28ŸðAhöÂD†ßÚÑ'ZŒ¨î"¥nß1Rœm‘Nq‰—_ãhcÖáÁEͺ#!ŽŽ¶¡Cê…á™tœ®­R\Ž!•'ä)R\bÄK¨¿,–Z,Ù½Xã(´S^îØ¥^2ø´ÜC|Ï=ž(÷hòåžxÜGò>iR¶×KÍ×t¶D3®…`3äú¨"ÄAØJž‘Ž<¤“iŸ Z“…ÓõüŸ7ʳçjx– ËàÜÀ”Èãô™µÛÇv 6-µÅGæuðý(ЧˆûÃtãvÑw ôæ~þï'ˆõüé §=Q(Ú?ô»\ë(æçü,÷?°¬ýÜ endstream endobj 1430 0 obj << /Length 1914 /Filter /FlateDecode >> stream xÚíZKsÛ6¾ëWp|©ÔZ0$ОÜ6i“¦Mb;'7ã¡%Êb#“ vœ_ßÈ$%Ǥ¦ÍLf €Å.¾Å¾@ì\9ØùmôóÙèè©/‰¤G=çlápyÒu| OŸ8gsç||ºŒ²e4™RŽÇǯžéÆI¸Ó0ž…ºûgÁjòöìùÑS=Wd¾„Ka¹’–Oa¼/ÆGúA™TsFOÎFïGa‡Üó@a&wf×£ó·Ø™ÃoÏŒ˜Îm9òÚá#êzÐ^9§£×#\•K –&'H2ÍJVŠu¬ÓðýE‘…Y˜eQ_¼ '„ï.֚ǿ1Ç🔌b$¹ZD=~k°í"3Çw=DK®ÕkN G˜C‘ÒICgQa³Nl÷Ûmú”#*‰]@&jt_úf‹êôí·Y¡JËC’ÊÏÀlI0½rtãÄ` –ز*¶T Ê\‚ŹÆëA:Îù”`Šñ§ô@é@• Ìq=˜¢TÂü°MÖž—ÚD—1äêL âžáñû‡Hpä §2pÄóUØàd|ØV! , 'p0…©Óï©0½™m¡0®ç"—y°˜^à~ég÷ ÒÙBaÞˆK¿¶ø€{×NAêô{*Hof;ÄÜcˆYKÜJET`0géÝ:_ïÛî³áð¨Óï‰Gof»à;Ĭ ž%qÖ‘Ù2hT.k¹ßiƒ´`oh]ðxÄÚ:ýžÐöf¶ ´Œ"Ž]ã^£áEKlUï 䌢‹Á©Óï Hof»â‚Ê3Öÿ¬=82ºi¢vN¹xÛ:HÞ¨ÃAW§ßºÞÌvŽbÄ7ÐmÙ> ,µ¶|`$+#£›¤Èû¡†=Èïåp¨Õé÷D­7³]PÕyÌêÜ¢½M)“%­¡€­“ï‡koV;Àʤ@ž'º;¶(îáטБë`hÔé÷„£7³]ð>ìlo<:À¡Ïkæq‡qìRd‚ V-¤WdFI›Ù<‰Ë„ÅÔñRý4YŒéy [*³‡ë0žGñ•™ë² ðí~¿ ¬„!~0Õ˜jRÔ`‰¹‹M)«,”t‹l³ÄñÉ/O_¾9Aºw¶ w­(ä}Ð`ÑX‹ÀaÜ,u©ê6….…Fìë"32_†v#¶ëcõbæ À|ÎuÙË™ºª®ì©d¼>5gÿ¬Îüñ*FÁ*ú˜’)¼¼QµÔp–'é~QdåzÐZ†©™YÖUá™[Rà&cq…P²hŒÉ.“ºĆbÔèÿs¨ž¢2`³PaZÁJU|oÕŸà.«/¥¬šnQîéÆúAê=ÀÏÅvÂÒ·Ï Ü7 jÉMä’­¢«¥#ÐXÙZtbËÔazÅÉ*¹º›x||hÇs[àÌŠëДï’ÂÔ®ãDA~«{·Ë o R }¨˜©Mâï&DŒs«œfL”oJŠu*³À½ÅúMY#Œ cyò­ôýhé»n2jr3Ž|êu—Ûí·×óH‰©{¡6ƒp’·.GvÏ0ÂŒGÄã aÊkoSEh˜¿GY?Š×…QDåÓ‚Yn Z¦1X·Q¾Üº¾©Ëjýˆ(ܧO›¢˜Pe‡zÊ=Ô¨]YVíQ¯H¸Å½–Ñãm´L²ï: m¢pÉáQØòWüÀ0‡uý×›/Ê"WÒú©Ú¤p ™©„±ÝEbd.Öó{»òÈ0<î.³ ®WÈ:Æ»t“@8è{al•ö>n²8#sdLÇcäù¼!Ìî³øqòùÏÚð2`‚4Lÿn­oí%ŒÃÒݯîvú¶6Jk çV$;YÉþé«NªSœW¢µ„âK^uf{Ýn ø5ñEÉóP‰nƒ~¿D·?³ío7 $“¾­ßîq½™mÝlz_ÝÍ&ñ|ÄäpÕýýžÊÑ›ÙUâcH/xãÓ§F6Qv)†xU䶨S)„x q,¾D)„€~JØwýyŒq6sÓy@XÉOOPqÊðñUh#¤Qp¹ ¿¥w§wUýØ”‘=\ü2YÍlkÈÙ7ÞÜF$„ÆaV<œ’6O‹øÓðÇ¡iÄÖÿŸ˜6Äw}XÍàa¶ÏwÕÿ'` endstream endobj 1335 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1523 /Filter /FlateDecode >> stream xÚíY]k\7}ß_¡ÇöÁZ}ÌŒ$0|à¶ÐBhòÐÖäÁµ—Æ4ì¦ë5$ÿ¾gÆ{¤Ñ•ÚØ Ivvtîht4𣻉9E\Ì)9býÌ®6ý$ü£¼Å<â’ySqIÌS]Žæi.³zrph#:"ó nSLÎŽ³yÈqUO N’zˆ\áªCâZ6£¸Šæ£_SŒj´ 8!a²„I:J iZkc»ØÈF1Ъ¨Õ\ Y}`õqt)&e,aÌÁ« :%,ÖÙ˜a5ó MÈÈÆ&Od”ŠDÆ™`6Òs°²|•$Álb¼ f+Áp˜­s‚ÙŠQG­¶ü‚'ZM:ZÀ}ÖU v!óa((%`CH×QÈ¡£ ÏÛ¨À*Y-D©Ñ|ˆRÅ|ˆÒ¨ËQë³5ÂjÊBa‡•¿šaUÁØ ŠÆieXÆ)Ȧd;S ,1_u”m/A)‰3¡P‚úš– ™/iñ˜spÖ9@qU_NPŒQ£ÂʶhÎH’ÃUäâÛªVEéi ` Ž­r( ­r°X‚º¢ÀŽ‹>AQ ¶¢Ô`¾ªuk>D©M}(anZ¬„e±í !€„d¾ «˜œÄ¨sD†%æ”0\Åæ«z$ÌלXQ S”DXÑ eóa*– F9™OÇÅáábùÌGe:¸ŸÝò—_à ½4=â+h[_¾yójñèÑ à†ÏAlª¾äÑÀ±ø^ÆÀ)ƒÉ!0¡G…Œ‚³o8=ƒ`¤Á£‘‰}m£‘3ù–yŽU|’< N>´a0Ò¨£àB> ¯}>Ú¬wîðÐ-´÷µ«‡Žª¶ÙÉFÌ{š'LĬèŸ{Ðdã,Ôý̲|¾Ýœ¾Xíܱ[>vä–/Wïvî:—ïß®0pòÇj±|ŠdVëÝ…¶OÖçËŸW›Ëíéê⪥šï§ÕÙùÉ“Í;w¬9rcŸÐ¾*Eìß+Ìw²Em­r…¼^oôøJ¬4-«½Q'£í “'#™ñœ-ìbùâò÷}ÿñ|ýçbùd³=[m-³ðjùýò‡åÓãh_t1§ !E$ŒýÔ½ö?ȉGE#h¾¦ÜcÛ‘nùÝæåÆaC¿¹x}Ž?çëóÝ·Jê&‚æêºç”Ñxy@ï}F»&Ì_•œq4F*âKúR'o·«¿îžš×|ä> stream xÚíZÛrÛ6}×Wð‘êD0®$Ñ>©‰swëXšö!Éhh ²8‘H…¤ìº_ßÚ$-×’ÅñLf’.g±ËÅYÐØ¹p°óª÷û¸wôÒ—ŽDÒ£ž3ž9ÂCždŽ/¡õ‰3ž:ÝÑ<Îçq@v‡§oLçLÍT¦’H™Ÿ'a²ýÏã·G/ì ÐcZ!÷}0 Ë•º|ò~à™†r©çôŽÇ½¯=BØ!·(ÌN´ì}üŒ)<{ë`Äeà\•’KGŒ(ó ¿pF½=\·+ 5•NAäJ^š5 óIÔ'Ø«¨O±ûe%áRxŸ°ÀðŸ”1’Bë×Í«b†|ÌŸ $x‰X â!J¸C‘ ¤“)gVƒØÔ¶yôî”#xÕF1ÑÒ]õÛíi꯶w›êº<$©ü`K…Ù…c:gÖ¯à¿Ò¯¼îW Qæ[ÇÆIav¯çã€`Šq=Àÿ•ïë“ATbÔ¡`ÜÕV½"‰ŒsÄu Oh¿Ü§B 85Áy˜Lm$î³m‘0äQÿpqÒÔß1N:ƒÝ"N˜Çã,‹QOlàý„<0A˜gêëÞNÁy^p8§4õwtJg°»8 ˜ìupʪíµÛÒ1ž”pØÉ.i»ÕÞ{®z~€|KÿêB\•ųk}ÜP·˜‡…î1w8œ@mƒótzÝ÷„ ?ÂÅÒBr¨É–zPTø„1U‹in¤–aé-GýƒCm l¤bûíÂòÛ[4?àOæk¿IN$Mýä3Ø¥ Q<ÍçÀ&e@æ”–þnNév§`†¨ÿX,ŸK0öï;°|î{W·g?YþO–ÿ4X¾x$–_EôÓ¤öÛ£j|þìxøþäâò¤Mæ§U/Õ$Å^žéöéá8<çRÂÆZú»qî`·gòŒR$0éÀäë¾ò÷õ ÃK+øá⤩¿cœt»gd@)äøG òTúIÅÁœÒÒßÍ)ÝÁîâŒá0eß’Éoí”ÀCŒîËVKG§t»ƒSh ‘Gí'P ÏYs‹)@j¦¶{s ôaMvC–ÝÞc>äJÿpŸ½Zú;z¬3Ø]<æÈó,õËãÕ¤µÉ@=!÷;´Ë¦2Û·b†ê”~—ïbTÄ={7ðŽvM/u%X~U«úî-Ù«JU›§ë’vCÿÜÊ­seGʵœ1­›¢ž…¦ù¢o…ËÂóÚ \Æáÿ”^å’eÖË‹ tMŠtRSqO-VB˜•”W¯œ˜v82m½ìÕ%¼¤îóu–©¤X\W[`*yX\…™.õ7•Ýf&ÜÓ>¨^hnù{_2èÂSnî@ª¸^)Ó³¤ßL›œþ= ßëþØ<Ž3Ñ8BßóW…ôM!O³›rCO)l;3gé:™êb€n z²«8·Ên´Z÷‚tlµLÑ05ƒ³,]¶ðØO,¶äöƒËÍ…C­h‹“úÅÄÏûï~?'«uq÷rÈÔ”Yž/ÔpÐFyº;ÊzÁï5Ö6HŽ0Ùc¢4š«2aÜ–t]ܘfYh¥®âbnïÌC6À‰€es§k'MË G±¿Çk0OÍ¥¦úï >8"­)³&5¯ax€„ÏùFß•´ïbš°7ý$‡“ó}þ>ò?ºÍ„e endstream endobj 1485 0 obj << /Length 1810 /Filter /FlateDecode >> stream xÚÝZÛrÛ6}×WðQêD0î$Û§¤qÒ4i’Êî“›ñÐ$dq"“ IÅu¿¾ ”IZJ(!ò4™±‡7ð`g±{ {×ö^ŽžN^ø¡¢PRéÏ=!‘ ™ç‡pô‰wžxã³EZ.ÒÉ” <~úþ•9™©¹*T+sùG”­£åäÃùï'/ì(™ä¾F¡»ËçÐÞÆ'æ@y¨ßž>4¹·Â›Â‹oF°—À³ß=Œxx·uËOŒ(“p¾ôÎFŽpÛ¯€´Ìh0A!7¦”µ[—Qy™ä™2öü†R…Q(4 >¼ì™È¹ç3‰°$ÚD}_‰(áEaz…òæ-›ºhÛï>ì€ D0m:0ÀD·vÅ·ãÑÅoÆsHm,‰B~ckÀâÚ3'3K$VÉÛDÒ±Ðù9OCØNïbJŒûœ·_‚&„Qh£cÀ>yc' t_f"SPoJÖ®Ÿv¡Ä¯Õ°v¡m ¿ BJ!Ì%{ÇÝiSD©?ÏU´\æqTé¹ÃɸPe¾.bUêK N•yœÂÓÄ<¾M«…yòôÌÜQ"ÆÿÄ‹(»Vh2eØŸÃèšFå"_/í«W¶‡:4px|ugîU eû[­–)X“æ™íp¡ìYZ™&Yn®—9ôXØ{ª1°²O×UºLÿµ¨h€a™HBßk íµ]0wà4Y‚;mBO^ÜŽa£±ÌÐ «=â„!¤Ú´ùs¯CN€h6-˪XÇÕº°æT‹¨²†åˤ4§i6Ï‹›f¨àFt•¯m³­žóÚùtJ ’âÓ¦ŸQ?Wª(&óâ Ì* ô…Ùñ2«Ä>T~´ÌÚÃwˬîÆϬâœ6Œn²]F¾žaïdXÀ?Ëâà;̲ózú?B–U!Õ/Õfb¾EÄœ¾ž=›žÎfÈOïfæVoÚÏ‹üf÷|þñ²S«óÐou¾IS$DÛ@˜)° Ûæ#‚ÁnmZ6ˆÖ)ë]¡b•N¨ÖÖÖef;y«(þ8!àUÕgoƒµÍñ'æVaáøö¯7oìÎÍ1Ë-à]ƒ\6'ÍK‘c3SÍ£8‚´-ësóOÉú—‰:,óóÃÐQSó‚—OS÷ðÝ2¿»±Ã3?àhIM³êë ÄþÖŒ_sßËúÿŸ$ý'CãЧˆùìxaÒÅw gc„ “‹\BgIi7 õ¸¦`R—¬l…>XØj«3ý¡„I‚8Ç#¬‹ïH˜³±û&9ŒP“®amsÙdæ#)ÂÃf0¶„…–ƒ´â"@ªê#H+Î$˜•VÏOmýUYœ'jKy¶5ÀBä~T Ñ$Ic#¶×,_äF¥V4ëe«ê%l]ä›óukÝó¤)ζej«vúPb”«<+Ó+X²V.·Õ¿^-Ûš^¯mᘴ×ì5ð—µà”0B¡•„üû”„=Ÿ¶i ‹ÁN‡»`«Æ¼¨("KŒÝÑÂLiYx»¼ÛݸL³ë.¯#ô ®šlS»Júóµ/~9 `Víí- ]7Ž56~u\|ì*|¤²Þc*ü³ß^Áßå»×¹ lZËËu«²œ¯—®Úhõý4ÃÐ?âÖ }À:ÞÖI߭к;\@3Lõ©Ã®ôFAkò¿wMazL ׿ ‘Ç#¥‹ïHг±û ?`¤¬&…†HÜKŒoOJß‘gc÷!…QPû}-γ²FÇýV"â›;`ô7"F¯ºå–€Û.¾#·ÎÆîÃ-hµ ùx»kÂy ‰Å¡®*‹?&1LÌUTT.kB0°A@ëß[%0eBÔ_õQ+bÐêãx™*õ½îOkLëÄœ4»Kú> stream xÚÕYÛrÛ6}×Wð­R'Bp%Èö)i7—¦‰í>¹ MA6'2©T\åë» ‰¤¤H#=c!\ìâ,ÎYØ»ö°wÚ{yÑ{þZ†^ˆBŸúÞÅÄ>òCæÉ®’xcï²~“7É`Hî¿øøÆ4ÎÔDå*•ùùW”ΣéàóÅÛç¯ì`ÐgÚ —ŒÂp•-) ¿ úÏÍ…òP¿Ó;¹è}íè„=²ò›‹o{—Ÿ±7†go=ŒxxwUÏ[OŒ(ó¡=õÎ{ŸzØÆ…ëñÌ?¼  (䯧›(O•õ½>Œ£ çúo•§ÎtkÞDÃÐõ,jfWí¨°×é4‹£RÍÏ«EeÙ„Ÿ_{¦qvÚó.«çÆÜ(I“ò_,0ü“†+0"jùÖŒyÈÒw†¦Â8¹úº)hŒg÷:IgóÒôm@E?Ê“èÊE^ÞDöÙM6î¦}Z¨Ô>}÷êáÙɧá°qN×Ùm‡†HòAÃÉU¬ýη}‡² í〲 .K&ðm|¾Í©2OÒëMx Ä)ÿÉÞ%åi}WyfãSùm’®ÒvÅÝ€à~–w矤¬ pÇ—q  Í¢¼Ü—¤Wpÿ¸²yy_äR¥ûÝ™'i P©ÙGøÖŽ-”µ¡‡†Ðd3´3UÎó´Ø ûµìé,VžÿùþF¿3?“‰ö~ÒJÂçæO“åêR:¢ÿb ¤k‡³ÆÏÑR1cU“ùY×IÈ5ˆ\@V2‚`AÕˆn#½ø*Fo2 …ŽN_N[$)IâcŽ04Éëû‚øˆîQ¼åÊ›ÔY½amóݵDÈ[vc˜èÞ]í!iÙwŠ´Ïu[>dOøœu‚†TnP@Ϥ¬K<™6¥eÝh’à· oÊѰºèT°OÖ­¬†l¾Ì|x¡É ?4ÞýºÍŠ@,ðjÛÆ.µä÷=sQ„ }˜tÉÅMõǦú _-Ž" 1r@Ðrs#Ó&é$Ëo£2ÉR[ ]eór{4?¤^JOèƒRﯣ6‹â/š]¸+ØÖ8ºñ3s+ËÍõÃ?ïß/iÞˆUf .œåÂ5ÜK‘\•çîVÇ€Ìø b] (îÏ“éø ŠçR©ùÇ£xîsD@ƒEñ-ûÝ(¾»³ûS<÷%â„»z¯ÜMíÓ6·®*äÛ _u| ÿlß4„+ñƒãeIÓ~Ç,éììYÂ|`zîÃ`>"•ÀµhN´0‚uhkÆî§Ë\àjìÐeÛE*, ¾´”·"öÝ{7'°ôi lkßÖPX¿f;¦qy@LóBå¿ „è[ÿdj_ô­B/ Di7£°{̳²%¨öîj‡š;e\ßm´UdH$%}4û»Ž{´ÑXå‰8#è,<žˆ3ØÒã±sÓ|7rîìêþ ΰ•\ƒÞÖoŸ˜~SØ3JŽ–!-ûÝR¤»³÷Ðoª?ÖãÀL0Ðz l .5ÁÚŠx(ÁÃZ_-‡PÄ|z<Àšö;ÖÙÙûä[-)’ïjÔšc&á±ÁL䮩J»[T†ˆ’?@±EEPIåù«“³¥†gã-*­ V›Ð@%%k_~M§Æ`$@þ²0I¶žÀØòÀu˜ÌÓXQÏÜŽÚöLlA‘¬(fYZ$WÉ4)ͪ#†áTÞ,`ÆÊùà ïø†N0ÄÄåÓþ€³G}¹D1ØŠâa‡QžG‹öñ†ýô?]lÌ‹fRêó—®{ï †Ô°L£Š\­Õ ÇŽáÇŽ`íÚÅå\Ü9‡‡Ø¬“õcÈk¼4¾é ™¹\œ3ÿvP%< endstream endobj 1528 0 obj << /Length 1507 /Filter /FlateDecode >> stream xÚåZMsÛ6½ëWðV©ÁøÑžÒi’¦MÓÄvOnFÃH͉MÊ$U×ýõ]€JR²C‰QÚ´3É"Á‡]¼Åî[&8ºŒpôbôÝùèä¹Ò‘FZR/#!‘Ô,R®ŠDç‹èb|v•–WédJ?}óÒ NÍÒ&›÷óç$['דwç?žO§šY“-á´×&ëbSù·=I‘ZCåÓCryçú`‘•*FJÄÎËJº0ó|á«êÓ³éé³7nœd 7pU if¹«™1þ¢;»4h2e_. ivé~-'ð(I¯Ë'îwuµc½4Ûz¸½Œ»S˜›$ÍJÔÚ÷“ç7¹ÅÌE³f–ƒ*ÝÜH Œ° ¾éàµö0FTë0³¬Šõ¼Z&˜œø­¹Ê¯eðg™7I•æÞ±ä}¾~dufJ ’Ä&x°ˆŠV*èú¤ÚÛ§4[ó’¢HîÝð.­®Üh0  `AŸÕ BÆè#(Äa¯rã?>'G1ùÞNÚe08_">±cZ5–Ÿr†$•3§‚#Ûq ÜÁ¾ŽmfÄÚ¶³^ŸÙ/?!¿BSyZƒ8ä28 UvIÏU1¡°=sS–ÉOÁ±£ÉOÁŠ…8Z¡êà+TÃí/?Sˆp:P~® Çý—.?…†M¯Kéà “ÁÆî¡gLóf;=û`îÛ- P('CUOÎü¼-¨=8#г㵠üœ 6vΈ@4yž•=%èvwÑ vïÓ¸JÊò./C$­Àà?‡¤åqŒ0õaùÆçµ)£zœ™ ã;÷#èL;®u­Ôº–1oéüƒU¨¦+¸Ÿ[ j§¸ÛV¤Ý»©G_—Æ£T¹Å[ܯ*3´TD}Ç*d{}Ÿ[ý±sg!`Ödا–Öú¯}õêIg-°©ØÌ¦¬¶úšÛµ)Ò o@›QßOFÓÿžŒ–­l¶-£¹:À'ËÂW!ÆÞþ&»RŒ}äâ§v:߈O?­Èß “WIQµÅm·•ê'Ä•ê´ÍcßÙìS¾¿bínD3˜·v!]nï–{àß¶ÿ¸Ò'ýgtøÆ H9Þ“r=·Éh¹¾>L¤úm˜qŠHó›Ù§ç L&GüŠÔÁVÁ‡Û_œ3hZyH¶¿çéâãõ[Ë-q¾ã»0´ó_˜2gH#Ç ‘üÀjêQ8õZµdyRf¤ŸÐKJˆ!ºŒ)’|]Fµ¬‹¢óÔTC¿ûýß?õm¸ïxE5P?ööÊáµHYåÁÉ@ÉÓ³µ‹)Ç×®ÛƒêÅQ,W·ˆ&ˆòãužüaYi¸±ýëÑ ÆÈJ‚wÊ×íVébñ¿¤tí“( t•T|––H…ó¢á…Ù$׈4RåÛpD[¹hYä7CSæÚÖµ¥ÿ®®îÈÒS­.MfŠdÓ¡5éZ%á»B—¯GkoŽBƒn;Ÿv“”åð> oþ‰.¼”ø]5Enåó9P²h‡Å®ÿ „Æüÿó‚^ endstream endobj 1451 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1545 /Filter /FlateDecode >> stream xÚÕY]o[7 }÷¯Ðãö]Q%  ôÙl@Ðö¡[‘‡,5º …Ý%.Ðþû²vÛ4vJ·Y†AÌËœKJ?Žª¹†¨fTº -ä^Tè¡’þ©PàÚTÈGV¡„fàRCÓpèÙ4-ôžgz2i¤Â#©šÂ`µ\)ŒÁ*ÀFª¦‚ë$¦«¨˜ÔM‡×sN0_a:7Ó Vn ­«Î¬'Û—¬ TÆ_Yô‘á­ëcexI7À5äTLÇ!“ø`„¢ézÈÕ¼a'¹Ù-CRçµHCcÖªÏt°ÒÅt°"¶Œ+b±mò 6 5ÕõJJŠë‰M—! Ó•P¨š®B²} $%]KoºF¿JɦH­ë> URà]®z­é‚w%é.ïŠÅæË°øÉ€dñXߪj*¦ËDÏÛ‡ ÓUHÝpj¦ªRƒdȪ’tØòG÷1$ÃeÕ„ULœ+Æk8 ÓÁG#ÃÁGÃQ@‚žºJðÑÙtðчí#UàÛv‰|&"ÕAÊU}P„-@ª‹fCÓ5”B6]‡ÔM'™L7 5Õå¸iL9£x›>Úð‘á£WÓÁGÅÌRLËCÏë-iy1Ê ‘æ£Y pð-[ ´s3ê±$™Φ§ïßÌÃt±X®fÓ“·®ìù×óÅ«Ùô`yñb~ñ<¡ôÓÉôóôËôð9ÙÃlz¸ûáð0LOÂôÓòé2L—ãçà|q¾ú1Ü»7ÃÏ÷/„F9Ð*G- .QãÂ-"†7-ãôÍÅüïÛ[Ç& 5iúÇ€Tj±'º»€lB$1i‹Z/ùGÛg]Íæ‡éÙï„¢¨ E:L#õo_¿>Ù‰Æh×ë•â@šûÀŸ(z'xDžŒísw®s v¤\": ÛbñFŽQKÞí¡¯Äê2£Ht>ùÀ5Gm­>p¡ÈH68§Èâ\]ÌF­9CGƒc§e’…ª×rFí¯eŠýËÐ-++×#¤.­_:’2²‘Ñ{ËZÆ\â |)&û…1½‘Ñœäãayú¢Oð9_,ÏžÌÑFÂtüè(LOçïVáäjg:>}9ŸM±´ùbu©tÅ£ èrùöâl®º®gÓoóç§–ï‚õ,F¬3؈ )È@3:>½€ð2Ð Ã[Û»„ãaº,£ak¡nÞm#|ØÃÉ-5Qî¤ã­DPµRñ¡Ã³×ˆâ¹©‰¾zqvðAœ_^Þ~O«FŽ|.h•XÞ]—u\päQié&0à¤QZÿσ FLŸf=–Wï0.£ÅŽ’ÁÃQl=VðBÚvÓB.Wç‹—«åÁ«ùû *[Þ„&£‚£ìÍø À‹ÞÍx° ŒóµxÁ¥xÁ¹GéÕ ÆF±Ì #¹¸Áà©èYNp‹è²NpæHâµL5æ,>0®‹în0†{'/X ‰›³%´LÊG²œ”8ó(‹ò‘»×ß< …¯h)ß= …nsæMýHp úÅvðêA±Þ|¡Ü1Yìä¤îs}ùýÕ¶µ Œ Ñdq‚G,Õ FªÅÞŠLÃîÄNË9ÒpnQ"ÄNpÅÕ¼ /¶ï¸žmã՜۫¸Dµæ\1Fw”äŒrIz~Ùk9#÷¼ËHHÔî´L}XV;Á%öN^0>› zÑ“×0#™½‘#PÌ.Î3¡’£dþ^¢˜èZÖoýöéÑý×{t¾Õ{ÑšUvðÜ.Ÿ."<· Ú—Uê—­~Vyý±Õ¥Xsu‚SúŸ'¸G0£pû7*[ÁhIš¼N0n½8ÁM¯NË%SlÛÈíV0^ÿ§ãctggèpä‘›Ó²Þ³Z’}ëÛYÇ»ÛÀ-Ôw–ëõÛ7Õ÷çAÊ}‚sý5‚³¼ë^¶¼ã^¶¼ë^¶üå½ìd§‰Q endstream endobj 1550 0 obj << /Length 1360 /Filter /FlateDecode >> stream xÚåZ]oÛ6}÷¯à£=Ä IñCÜž2,éÒaXç-- ŦcŽÔJv»î×ïJ"‰±SÙŠ‚µ’H–©Ãsy.ï=BÐ="èÍà×›Áé…ÒHc-™D7 $$–:@JÃQQt3G·ÃÉ2ΗñhÌž]]V'×fa2“ÌLõñÏ(ÙD«Ñ‡›·§!A!Ê äJá0`0]‰¥ŒWáð´:0®‹{ç7ƒO ƒ¢Ü)Ðìapû 9|÷Ìuˆ¾”# ³@Âù Mï¤WHk4¦ XóŠJ^†5òif>MïFŒ 7ñj^{O_Z²#X‹¹8¼ñ¸XŽT °à%×⺠3ÊÃ:Ô(3hQ#×DÛ}õéŒcJ7AL‹Ñ]ñíÂ4ñݶ™¡Ž%±fúÈ–€Ù=ªN®­¢ \©(¯+Ê ¿”•4NÖ•`{qÐí˜Fˆ¯~©|ýÖíÀ"ì7OÁìÞ˜æÍ„D )RWä~Ú‡"p¢Ú@ì¶à@i›Š  ´ê’ŠÞq• ª„¬X_¥yß­¾Võ 3鈊áçâ­›$7ëêô=!̬æ¹û$ˆÁ÷øÄÞ»ŽL2n¬Ãé%õ FcM‚úªÁ¶¯¥hàŠÏÏ^#¦3­ÝÈ|mfëMf™¯—‘%¾L·¬ãd‘fÑ:N“êBt—nì°³Iu4EøÏ–Qro¼ÉA¢ÇÉÇ š¤E¾À5fWôÚƒdWXPm¨[‡µéKn“ß/ágú×6œÅˆ‰á¢úof3“ç‹Í ÛéëÅtÌÈn‰Æ…½·«šÎMvT•DBå`ýÕQ¡–,è­ŽzøÝêhw²íë¨Ðp‰ÒŽu´Ðݯ¢”ÿGªèIË$!ÇÅâô–#MüŽ9Ò™l‹ $ÔQ.a27³j¡ªyb3 Ôk¯ZÀPÃÚØ¢v+˜*Ž¢?ÁšøëLöÁLªm‡ÌãÌÔ[ä@a)ôq; [™¤‹W Ò€¾ŠW\c·–Ì;¿¶ý9™¥sãzöøúüíwlÅãrjމR®‹ÚLõæ¡!–[§Û­Vé,Z›yõñî«ónÀb“Ì a­O”Ø‘±5nÜziœ±Ê?¦ 8­x¯-\j»ö ¦+oqCZçÆqpÀÏ»*¨× ´Qß·¹òbj¸+á©îU±}HöÑÑ‹²,²Â|‰×Ëê,1…»úâì±—Í|Œ“û¦®µÌ|&ƪ¼ø1ÚêHŽCØ Ç h÷.$Çî›±]Óƒá¤Pà~ {<­ž…·Èœ  ÚŸEæ¤HÖ[7õð»uÓîdÛ[dNBLÃî¹”ÞsÉš|g&9ÐÖAR~·,éNöÏh…£íMò3b©†E~útÕ^®‚Vý=ÓxøåêLö¹B( ’íµÈ;w¶$…³Ê:Ú_B¯a¡1‘ܳ¿sãÛ_φn_ØÅÏx/<‚NG†—‹è¶Ë/FðU¯òÏÈÖç‹“'_î°xîÅb'ùýj°…{µ¥ÀIc tpLqrˆƒs®õìª-U˜Ã27œÛãÎéÑ–¾dLϘQñºfô8¿y¬×d°‹hoc SI{ëJ~·®Ôl{«É(lnÛþç4ž»%iùÄkîð™/ô6Vµô™ª«Íd$ÀŒô÷0âáwÌÎdð-ŒHì2d«XBÛy—(‡üèb]àÁjAðÖ…‚KbÚ´‰3$Çûˆÿ­u.$«½ß¨¦üˆ¨*¼ÆKÇ|º $g“æºïúéCø1ÿðñ/êíÄ endstream endobj 1573 0 obj << /Length 1480 /Filter /FlateDecode >> stream xÚíZ[sÚ8~çWèvŠ"É’%í>¥;m¶m¶Â>e;ŒcDð„Ø­1éæßï±%ƒí@jpÉn;IÆBHGç¦ï;ÇA׈ ³Þóqïä¥ÔHcí3gHøØ×’ž’¢ñ]ö/æÑr †LþéûWv023“š84öãŸA¼ ƒã×'/A ú^.K‰•Çà¸B–T°^ªþ‰}0®ó=½ãÞç…EÑ v Þö.?4…ï^#‚¹VèK±ò J0ó|/ÐEïCTíR´¢F)SP¬¹UeY˜5 –“¥‰§© ï¬NAàŸŠ¬E.4œ5Ôô°$IO`ÉU®f>/¨åˆa­4J šUôªKÛ>ûðƱYî+˜æ«»Êw>©Ë/}Úæ„ª,k¦¿²…ÀôÙÁÈ‚V“WƒÉ&RÚhFqf¶SºRÂÙøêÎb‚uy"¸oÊr·¤Ô7{>¤¨`hH±ðµÕí—]Röª,l »Ìu ¿µÍDFq§|1 8é¿a;7ÛQùÌæNDGYˆcO[Á|œEaEIü,ŸTýÕiqoW¬–Æ)”%nOøy¥NZàÎä’Û%}“Ù¹³4ÉñupË‚g{}=®ïä%%Õ¤…­L`î«„Pªê_êaz%VþÚW …Qº\¹ÌÒU˜­RÆÙ<Èìhž,¦K;ŒâY’Þ²ÁU²rËN/ìÓä1ú'œñµi®eåð!dšOó$×X2f•Ð Þf $ªµYë•¥ÄB·‹?^ÁßäÝgÎ,Oª™ý°\…¡Y.g«vÇW±È=¸’>zpÕ¤Þ…þ“yŽ!‡P€¶Ü;%0üò»Q@weÛS€P +ɾØè7x@þ_hàYÛL”ç7éh‰R—ß1Q:+Û"Q<0•ûp˜ÄšzÕŠv’ÝdË-q×B§ Ý–,Ú‹Ã…dõäS°¸€Z˜–àý“Å7,Æ×Ø ?ipk2“::œ‡ÁøÜ‘wÝ}#CÉ€ ¥+Iø÷Y’4LÚV“l¤v¨½MÁtåÊ »%&#o“i4»wOâØ„#¯Ì<0Ò¿‹’Uš_ah®-A†VX+ÿþí_ççMhÁViÃÑ?F•X}PmÆ 8b{Ω8=^{Þßr»+Û¾6㦔l2n=……ÆTêv\ ØË©®²m==šM¼wpõÆÃJðÿ¢‰ç”aIŸ‚ÿ=Í0ÕŽÏŒC®äYàônLþÙôNm¡ƒØä@úeá8Å•=eápãLš¥Émcã6+7„³!–®íi‰x_¦À²”›Ê2Ƥi9•„!Dcz¸Oì û¥æÓA¤F}ŠÙñ( €~<ÄjÈï†XÝ•mÏj$˜®Vʯ“›àUr[ÿ`rk0çp_d6¸dÓ…é‚“”K ö8IáN­ëŠßSdõ ¸¼o1-ok ‘ÖïÅNßo')¥ý½àrã­fAϱ"âȬü| ·¨èà2X,’ÌtÅüÕýã¯\ŽåoNë Òö­”â¹öicäþV×Ú˜máª+¹í ò =à÷ÿ=çìa endstream endobj 1599 0 obj << /Length 1003 /Filter /FlateDecode >> stream xÚí™]oÛ6†ïý+xé3ÃÃonWm×+°¢M|—…jÓµGj%yÁþýŽ>Kª½¹–¬Y. Ñõò=YøúëïQ²6æo.¯,#µ(¥1Ô ŽÃUZÆac§—õKWÞ3y5Ÿ|vbv8Þ©Èânrû‘%^{C•Î’ûªçQÀ(Ûr3y?aí¸,´lMÔÉÚJ^…õ1Êø}Éü×ÚÒL1ü@å‹Q§JÍòðºçRPÃ$1BQ%+—åyšr„SgÉémoBRËTàÍÏ=ÍN–rçBϼE¹F¼jGysÜlÒF¸¬¿~ú«R†RhÕWj]^q]¢ì²Ú“¶ó6“‚–0<Ç›9¾ö8yI¾/jEA™ï:(Ìmkôô&•&3øî¡ižù/'ÑT3üàãÑT9E5£Ñ´§?Œ¦ÃÍOSåðÀYhZ¥ÿqÐTá&D ù4U¨qšÞ Mß]Àô ©‘ª~8¤ž¶A-7àÜxH•H+=Þþ´+? ¨ƒ­ÏS©±<¤=OËîTj[Fþ<•’S£Î„Ó§Íé£!é¶Xû¤ˆqºª ?Q…´T+=Q…@d;;R{úØ:ÜìñPïµê,Pí”A®ZÿˆlHÃÜC°Už®Apí¤A©§ëcáì2MüIxå¬vr<¼rf©j4¼öô‡áu¸ÙãñÊSÆyË?Óxùï\uºÇÕ*íý½*gÿžþtd‚3Ô˜ñ~Õôô‡ÕÈp³GÔˆÀ» (Ó§¼v/K%I—ƒÖ8p²Zx`#¨ÕÍ›×_}@ÆÌçé6[ø°.äyºˆw Ã}\¬ÿ §M6}›µb¡Òr¢ªÖÝ6/¹¦ñ©¹´ÍÀѪðYˆW ôü_O»ñî}«j²3—”I}tÌ6ôle|—Ä"­KßDÜõ¹ïÿOüùê˜<åïÏ¿À„¸Y endstream endobj 1624 0 obj << /Length 1062 /Filter /FlateDecode >> stream xÚíšMoÛ8†ïþ<Ú‹5Ãá7wOÝ6)Ú¢EÖñ-[ª,7Æ:ŠWRZäßwô•HŠƒUL+hÉ6õrÈwøÌ80#_ #oGÍGG'ÆGæšÌ—Diª ÆáÕ™/Èùøìr•^®&S®ØøÕé»òf-£$ŠÃ¨|ù1ˆo‚õäóüýщeÄ¢ ¹ 4†ZÁqºBË2oìø¨¼péògFÇóÑ#ÀAŒÀ} ŸT$¼fdŸ½'ŒJgÉ÷bäQÀ(ï×älô÷ˆ5×e¡F­©€:Y†’˺Ò.¢«Mv{±)ƒú‡)†PDƨS¹j~yÛ‰SPÃ$1BSÎ!3_¾I8uÖ‘$"ËF`mµíï>œ€+Ê5¯'(…!í«_mJ[¿ÞÔ>34µ4uÜí!ØB0ùJÊ›Yå&ºV¸)›nrK•*Ý\ÅYé×£2ä| Œ3¶Õøæ£wóD¨>y(V‹Ö“BJ*€“)P¥]ÙoI(*,i ¼ âÅ:ê„2þ½oNÍÄpYÒÖ÷Ìï`{d‰Ð‚ ©q2C•kÁ¬0ÿÿóEcÄ׋Ý=ayr8OÚúžžxûO®ËBáIx§Y?7ÂË i»¡,a;¸å*Z/ºææèÿ³·ÁŒ ¥|Øß¹>Zº´6„ÛR»â0Ø$Ñfƒ;3ålœíTÅ4VFɇ+bZbéÖ0ØQèèûÿ`û1-qƒ¤ÛNJv‹Ù}&dÝŠf~š‚ö”ó¥…¡Òð}Ÿ¯m-¯Æ*á°$‘¿N¢ «ZÛ8šp5þ^õ¿gŸ(”·i–Ü„ÙMR [^'u‹<ŸN`L[k?:ÖLF¦\PkTw·Í…¤–©ºƒþ££ÙZ‹¥Ü¹zdÚèÛ+ñâ>H«ëz}â2åË/·…2Ô¾B#ÕŠõ–™¶ŠWY›-÷Öv×ëL#¶)&z¾Sp”WkžE¸qºmÑŠ‚2O_t­ø¨[´š¬‰Ø<4©4™ vŸÝ“•z3Va¿ 8Í`U˜Ã€›>d;ú~õ¶?dG [µ/ȦY…Í8gö9 +ĶÏùCö8_Í¢ rVщÒi'Ø¡7n%C;Ý€=­p‚:1ÜWnýƒí[áLñ/±ýàö.ðVë_‘·Âá‡ÍoíÃñV ¢Æž'o?¼yý܃î&Y}óC-·@5·Ã¡–F5Á¡PÛÑ÷C­°ýQË b³i?¨­2áackEÐrm¨~–¾–Küf°Î&_N“UþØ·ØlÑh`ãÛM¾_x³²`'䂲Th9rA*™ ¹}?äúÛ¹ XqÝr“"Š48ˆîpz ú9¨ ‰&Í^¨[Úð¦kà kÖÞImû±ˆÄübr—ߊü`ÿÔ¿ endstream endobj 1547 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1497 /Filter /FlateDecode >> stream xÚÕY[oTG ~ß_1ísf<ãO!qQÚJ´ŠHm#(¬Ú¨h·J‚Dÿ}?{waINŠS )J||¾c{<_&™ ‡2—jÕ¿=Èпr1žºrj DÊ©9P3…’SBaãÔPS]€`ˆ3äÅP &‹Án Ò™sè½(AA²¾â¤)˜kÉ8§…1$s9™© !IL ¹¨¨†µä®¼–C&22 %ŠŠâÆ!×DJ5PµCGË:Œ'ŸÀl¥Dy¿:±¾…^Q•Üñk åõJ”bP]¿í ®#û¶ƒjªFRÉÆ Ì‹7¶| [6*ic‹”@[:6¶t42t´n<èèYuÀ9Ô›ñ C’ât+o@‡ ³ԨƓP’è: ²Y0°»EÔkØÈ¤ëÅRKcÕ1Z(]w¸¥Ê(I© ‹EÊJPÍx’œ‡(•B˜P2^…ð% FZ€¡–¢¼œ@‰ê€€ZÉxÐQ»ñ ƒ³ñ Ã¢ᱪJPÐÑ,(±èÚÌfH*БÁbßJ଻Õ”L&‹Fôê[,qªo¡œ-’›ÆvÏ&¯ƒÚ|)bz R¤"vœƒ€'~Õo! ^Wy`ø«+UAuãqÀJ×@5ãõ{Œ' Øx8T4Úâà`1= '8nÇúq˜~ùõ7X´âÀE¬hõúÕ«g‹»wÿ[9ëKÌØ<¸ô˜«W2µ˜í.pŒ0s‚)jNr‚9"PàRce§dJ°YÈ ¦¨¡ìÃæqɇëÕE88Ó¡¦ô±ùèPÓNÚÑHeKã„ðƒœw‹¡ìh&Ù>@Ëtt¶~q¼¼'a:zx¦'Ë7á­Oþù{‰ÏÿX.¦0f¹º8×nêÓãåùúõÙ‹åù&áï§åËÓç÷×o‰‚y"rZš£ŒgÐ÷ü B´À°á÷ÝRÇ;·ÜÉ-œéS™;ûè­;´ ÊNpá8jñ‚%Jq‚‘ââ€ó}àÔâìˆzáÂ"MÅ‘‚Q…`2ùÀ•(9ͨØHTD/xÄìÝíŠÃ˜^F}ƒÉNg Ðã,6'˜8²× "‰59=‡n$ÖËžûÌ)Aaèê¸\‚èåj‚@×òÄtoµZCèɦS³¬Sâ’†\Lǯ¿°çG§«¿ÓýõÙËå™)KϦ¦§'ÙÔ¾XYAÙBƒ†"Å¡-sLè(8!$îž¹ü8L߯Ÿ¬v웟Ÿ>zô݃{GÇߪ—>‰”á ì;Î-i³×P´sƙσg­8ÿó?wNW§ûvXD¡!Ù˦9Z—ë³é>úƒÙt\Púk÷‚Ìh>0𬨳Œþ6ŽÙveŒlZœ DwŽÔë”\ ù%Wê1qó‚è4,N3H½‘ºW2z›Ñ¼’sìÅ)9·K/^pŽØE/žÈטOǸšOGÿè|:h›OGÙuGðŽhŸ2Õîr\ë9b:Úå¸&ÚÞ×›ä¸Occ®À`üÖÌŠ‘[¾}Cj.QgÜ!ªÙrû†TÖwå‡P˜koß\k”½2ˆ¢Œ¡ýÆepÈM†Š}ôËàøÚ¡b|ÝP1¾~¨˜_;TÌ‚¯*f°UJÔ‹3XÝœÅ+ÍWršaš×s¥¢Û`öJÆn×êG¯ÉD)¦A^0ù÷Ú®~ Wê•JÖˆ>¶’éu •+½ ÜÛY¡mlWŸ¡’1†Ñ»ã])ÃÐÐûø“^³¾­ 8}œ¿@â.HÜ¥¾«©zXé Øy?&½…ßU2ŒõCÚí2: ™ì t;ÑM+YÛV×@÷úC•lŒ®e¯d tœ¼`B`²›{Ôÿ|¸ÀhäâÜ%ø<6Û¦8Á艒Ì¥D™çfÁæ‹ê•œ-€\àšSäáôFM©^ìû×nÿZN~á endstream endobj 1655 0 obj << /Length 913 /Filter /FlateDecode >> stream xÚí™MoÚ@†ïüŠ=šJÞìÌ~·§¦‚*©Ú¦„K•FÓ RH£(ÿ¾ã¯Æ¸ Q HT9D»˜ÙwßÙ?rŒ`ß™`ï[§ýÖI×zæ¹7hXÌ´áÆKf=XÄ®‚Ë»ÉânÒQ‹àíÅY>éEã(ŽfÃ(ÿøq0{LÛ×ýó“®Ì‘ ‘© ²–;‰´]¦å€â­ Nò•O×´:ýÖ¯P`ðìi¥fß­«kÁFôÝ9\ydzȟLƒà( ͧì²õ¥%ªy9¨Ø(55p¯r+‹,­›Áb7”H2¶Q?¢ä~“;$¹ÇoB úƒÌ¨à^§›¤ÃûšmÉ­PÌJ͵Êl§×5Ž rï<‹#6®ø\V[}õï PqíL¹A. itSý⌖õË3Þd‡ª–áýÌf‚ñw–OzEq©ˆYqUµ¸H­fUµi³êæ…[«Ç®B­„XÑy/$Kë)ÚŠN»¢øâoÁò–YZ(•â…Àµñ¹ËWë$4—ŽUï³Ñ4ª9IMÀ›MûIÎÛ&}Y×ÓC¢‡É¿‹£ARPbµQJ.?qȧ‹$~&q6žÇù¤3öÛRTŠ6ˆ J.Ú * _:‰“.ˆj?F«¹²~v…ª]©¸ºDÓëšæRfŽ£÷eä¢ÄB<›Å8·”ô(ÿxû”)CYe¨t^–}Þx“Ù$YfÍs¡ëùRŸ½…JòôB kX{/¢óœ-Ve­9hûïY—Šk‹Ç‹ÍªÜM½)mX(îÍàMžî#J}œ²w¾p0„Üpµ×Ü ÜpkúÍ€ÛÜìæÀÕž.ì¸eÌë´uêi«éáÅHuÚj Ü‚Ümû_/:áÙ§î缮ū>b¼âV|MŸà øýñUºÌþžg—å›Ñµ±ÕÍ᪠5Šr»…+ÖéjÝ1ÒUI˜xº*…Üê]Â_èúŸÐõG|Åq†Öx+´Jå¸Ñfh•’ØíÝÞØZÓo׿f7§«T´Öé]Ð5ïê€ZýQ¾&Ä+ü!Ð*¶,ï«&lýÐ; ;½^[‰àsï…®ÿ]ƒqöÞg+¸"ål¼Ú\Q8n¥Þ\kúÍàÚÜìæpE@.wWj‚:ÑBxŒpE¡¹UæpGCµ¸^¾ív6ã*¾¼r=8WÿH­úþ}ñBmó#ÚoxV[± endstream endobj 1679 0 obj << /Length 1312 /Filter /FlateDecode >> stream xÚíZÝSã6Ï_¡G§C„¾mµO”+7-G!oÜMÆ$Jð4q¨íÌ ý뻲d°MBœ0ezŒdiµZiW¿ýI "èSï×aïð,ÔHc­˜BÃ)’ +ÍQ¨¡ )NÐMp}—äwIÀ$ Ž.Ï]åÊLMfÒ±qŸÄé*ž÷¿ ?žEE Pq«P„!Ž8ƒéJ]ù0 ]Á„¶cz§ÃÞß= BÑ'Œ”h¼èÝ|#h}ŸÁBGè{)¹@’̸‚ú]÷þì‘úº"Z3£Ò))Ö™’—ËÅyJG SÜ-'}J‚I\Äζ¯Dø£¥ki•ÛâSË\ŽC"PÈ%–¢4×¶Kª0£1¬#2ƒ¦5ûšÚÖ·>Ÿ€ ,#UMàS+ÝU¿ß›¦þjo7™¡®KaÍôŒ-f3ä*WÞ©à¼Ò©¢îT!Šz°–^uŽ{QºHAÈš8(c >D#+jCÂw<×V“Æ@.攡ÅRigâO/©˜G¨&x§“¹iYb ¿l” Ôé°KP¶Ê—!ƒ€ å,?ÎL\xhHMŸÉà»Çë L]5/²Õ¸Xe^lºÌ<”œûr28é ïSJƒa_óà76âðŒ’z,ƒ±&¼½uuk¹À‘ýÜÒÙXX„™Ö•d^A¯¼¬Ç¹/çóåÖq]Iš&ž4çôÁ²ËËßÏ}ê=ÿrá»ãÙÔ8 nûŒ«¢•” Ç&` äZJ· ‹øÁgBŸ(ÇpÌfUzLRWº9mö_=f“ÿqŠo®·™ãý¾VÇ¢µf ÛD¨×U’µœîcÅÖ–®œ™ÂU ”Ú2–®Iù Iá €à}IJ-êᫌí&u±®J¼Æ©=jq2ß’Ö¤vøjqk²Ñr:2s³€“šoÅr„píäÆqÄèÞrVK·œÕÝØÍIŽ€«$%ž$iñzªrŒ¥Ïc ÅrJ6ô¡HŽ  GŠí/`šú;Lgcß@rN*wÈq6v ¡e.Ü›Kšú;º¤³±oq D¢ýMe¼®³™7€¡dMoH)ä­Ü4±tkKçr b—Š–þnÎínìœËµSý¥"Oþ1£¢…’!VrKŸ¥].¼¼î¨]_8Ö=cs˜’è5ä>™t<*r[lE=8WPÒýq>ûK%-ýC»³±›sÎ4®î6Ý^±›QÐ"J}ćlÎXyÅ~‡Û<‡\UÓå!û²¯Yp48½8 ¯mñãûÅlù¡^°ïã­&d$Ä!×ûÃWªUíî¸sxmªï†®MÝ\á’†‰ wƒ®ë~¤$úˆ¸J5”š¾®ÒÐ^ËôÎpõÇ„^U­û?ÁFÄ6ÿæñ/ϸ} endstream endobj 1704 0 obj << /Length 1763 /Filter /FlateDecode >> stream xÚíZ[s›8~ϯàÑÞ©Ý…vŸÚ¤›Þ×Éö¥ídˆmf0d'›þú=B"ì4¶)½ÌîL[ ‡£óËçboîaïùѳ‹£ãS¥=´¤Ò»˜yB"©™§4ŒŠxSïÃà|å‹h8¢ž¾;³“q8 ³0™„öòu¬‚xøéâÅñ©=Jfr¥Ï(|®”å3X¯üÁ±(׿£“‹£¿,ÂYë@áMáM–G>ao Ï^xqí{·åÊ¥'F”I˜ÇÞùÑŸG¸¾/ŸÔÔ¨d ‚4·ªäå¶.ƒR·Z¿sÙÇä×ó7ˆØi^d«I±Ê\†;.VËÀM³0˜W±[0K³å;-IÇw÷Oìd^ )¬æó(™Û[׫ì:ÍÃ5 w|Jp9ìÁb¤1k+H³õÝ1Ž|,ªdÿkKfÃ>¢ZW+óZ‰á„—ó wc§“ §öòê®”L* µc[šÎžó(‰Šf:_ûÅ—÷;â ™;# S=ª`ÐÚ3¤<ÌåÎ{ö«•5¨§A8äAQ™Á@u3$bàŒñcÆÎEjÇÐ,ø§È‚IñÈ–…ÃWmIÖÏKkCž™:`CF¿ ¸i˜O²èº¨<¯R÷zíêEê¼5Ds41b\~š®ì>ZõÛˆ8š =#ô·p7ÕoBr¤˜î¯~fì/ 4ÅwKUݽxB!,ýÒ²à›5ÜÍF GñRÂí“€„ÀHiò- úþ ý‰¤p7 ‡T nËF÷)ååøÙèÝøìýP=ø¯'­jºmÍ!ãl˜äÛv-jÿ]Wlk8Ý8T`6œ’ÍxjJ‹ƒâ)‡}(%û‹§ò­OúkuZò»EÔîÊîR9õÁßœŸµÛÚ­¡”`ÚŠ¥%ì?n,ݵõâPÂø¢¿¤Û’ßÑG:+»GëʼnB„ËïÐsè0}­ûä)¿#&•Ý,©rñ$Mòb74&‹ k¢!4"Jvâf‘é-—ië’ÞÀmÉïnwe÷—i(u…î&b›\ǃ€†J4ØŽ²m<1ú´?Äšò;"ÖYÙ}ó9¢•‰óèsxÙbˆ™BRxÊ dq˜ti˜RHƒ…¿A“ÀL—V•‡'–e€N]ÇX0E¡ÎL3SR›»†£2÷{éªQ3½ç.Ìc(NR{ÛÉpM‡á«Ê»ëBÝ\ZÎjf–ÌÂl(ÔÝ#©Äàbn]QÞ»âØi †–þ îr÷FhŸ}3§JfË(1_}2Aü”:Yþ%qKéjîmL£µ!T„Ø@¹eXŽ!ýÞ×îVDzíJ‹Šæ›Ä«iX±AU 3Vm‹Ñø1òÊ~äÊ®GÊîÆxGEkþµ¢¸\ëÔ&ìfYºÜ‡¡­´ÜÞ‚FÊçûÖK§o:Û¢e”lso a ßlmTÕ6*©ÖÔñÈ® UˆAçÜ &«Ô¶8rÀ¦×ñe‹k¦«âzåŽ_;’49Ùõy]¤•Åj>Ѱ¤ÙÁxcÝÄ»:üVè ê€ƒ 1Ûü4oO¤³&ú_Ø|h¿HpøH¨oGpçœÁŸË·/íe4³c¾šLÂ<Ÿ­bÃ)CðvërùæíåÉ«“×'o.š/•ÑÕLÂ8\††–6ÓÔŽeD.Ÿ– {”ÛE¿&O_ýUþŠÆ£˜à[ÏѬÏž²¨Bf’ÖcK¼ A^å†ú—OÆã!ǃ·ãjÉ"Ìn£|;ÛÇFcõ ynéåUTäEfÚŸö!Ðz0Ù#íCÀÙ8îöiÉïV¯vWvwÚ‡cwÚ§æ-Hþtüóþ¸†–üŽÎÒYÙ=šYD±ïÁÿhuû„¤!¾#"]UÝSÈ©Ÿšü!D Áú#Zò;bÛYÙ}À…bÀ'ŽüYApf´M&˜LAE-æy* Å ýŠTB5nùYJ~Èæü’¤g. endstream endobj 1732 0 obj << /Length 1953 /Filter /FlateDecode >> stream xÚí[ÛrÛ6}÷WðQîDî$Ú§´ã¤i»uܾ¤-A§™’Tœôë» ›¤¥D̦žÉŒm€Är±‹³.ÆÑu„£Gß_=}«H!%©Œ.‘H*Å Ò˜DóèíäÍ2«–Ùñ” d$A^ÌÇS$e2&]ý˜;,àci1™yUï‡Æl™–]4„B¦²ƒzÜ"Ó«ù¡àJE U£ÛÓn¸±À•Š#¥bî=Ä(˜´7^mKržÖéÁx%Åb<¸:êÑ 5uX Gº…åFÙ?ú²îÍi1’âÀfðZé¼™aXßí ÉXÒŠÕKw²_ iâ(ÅɇºLgµe¹MØ5¹ª.J=·ù,·©+zöæ›ýcjF'VASúᘈ‰WdZÝæ®Ž)žlÇTL€f»¯V«b–Ö^øê£MgðD„˜ Ó’àÙ”ÄH1fí?-j§³^¦µ¯ç–·gîUV9³¦RcÚl³r…ÞîwàræÛ¢^:€ëu½´ùbÑ+t-ðd{mÅ¢Ö®ñ®t]{O}}›ÊθÄiÍ#=×eíw,Î6Uƒê”=}Np»3@ãQ˜0ë31XN´…q”`á5ßötvb*AT)/Yµ–RN¹Å¶Ú…ñ>þgyVïp}òi§œ!ófJÀ`ꨑg:=ŸÔc.÷ö9ñ’­þðÞÄVZfé•wÜCmÐÛÒge±þŒŒÂðÕóàv>ï» P {0lyºÖÝïõl[¸¹³L ˆo+»kԸߨÄË´ã3^Xö0˜Z;nûYq pd¸ÓÐÛ§½x,6õ»M½{ˆºbn²ÕÊ…yá›i×ÀhÌÞd¬œ·òÞœÒs˜ÃœÐ;‹Üã ^º!k~ÈÖ›u€öqð‰áxâtx½Vؽ„IÅì˜ ×ëGú–Kw.My‚DÜëçºÞ”yµm(ˆˆxxcyP ž¼ùñ%ü\žýlaiÒj3›éªZlVÆiL½D¹<=»y°k7À¥Owƒµ§?±`c‡ † ùgÿÛ›7D)`Vñqó†ÄæŒQô®Þ4çÍÕ›æPÑ]½iÎ s›º"wÂl²·GyV¬.:‚¹6gy7«îíÝ1·yÜvà:¥Pð²DÙ©e^èj×!¥8C}ò4Ô@óäö*O븲^6÷f8XµÉg†9™'>©tm_{¬›‡æ2¤Ø »±ÏÍ™¬žWà¬&?¤NþJÛtSéÅfe?ò:Üí Èù3|(t¾;“n–Ùli³iéT­Óò¯c³“8·_œýrñòìô¸9—µ™7¶9‘ë2]ÃgþðœKsH»¥->wÑÀTæ½›J©Að½ùSdþrÕ;=Ëü».Ë¢l]ÃÉòëî].ÐïÊg@A¾^úzièñ]ÚöO5FmÌùŸš”âm/ endstream endobj 1646 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1516 /Filter /FlateDecode >> stream xÚÝX[k\7~ß_¡Çö!:š›.`¹à¶ÐBHòÖäÁM–Ö4ìÛôß÷í®íÄgk'q(˜õœ9ßf4óI¢¬)¤@Y)¨ù­?K é T»Æ³k˜טiÍ_•`™\¨!·²€ÐBuL ­ø+Ã¥êRÄ}0+Z‹"Ù%”꺌1”]ç¶µ[ÉÈ(c„ Í!9û8ÉíeÛŒÉ?k]‡1ŠvÆ(µë0F×ù Fó(˜K¤4˜mÅnl›àr †`=§2fœòâ¨]iHõàì˜4Òèô8ÕHRF-Óõãà7J^%é5òò£ü]É ¸NU~ ²¾ÌA {÷÷‚´2¸"å{ ­”У/0†EPèÈBPµé’³[´–õ¶\áWZãdžÐ7qÅ,xW̃÷pÅ,Ï//ÇÀ˜h›ë s`Ãv‰†ÁHÇl™#Î<VáÉx,héÅFÁmþòiÌèiÔ2¡§kƒÀ©FC¼IÍÝÛͱǎ~W86tšl£–ý^EG-cßÝF-kŠ~7:føü)Ñ~a&r˜VîÆKÂ×yIÒ]yÉo¤7tÄu'´ÏÉKÒ@~‰†V°ÔK¹âY‘ûO:8>[уÓåñÛÏÏ }[k——Zgñb÷q©Å¿8É ±È­ÙIè'™Ð7²Óx/;Í‚÷±Óx/;Í÷²Óò6wà˜禱µ2V4B ú…ò¨Šÿªƒ0jµ,í*£þ 4ÌÖ¡ endstream endobj 1767 0 obj << /Length 1405 /Filter /FlateDecode >> stream xÚíZMsÛ6½ëWàHu"‹‚hOnë¸IÛ8‘Ô^œŒ†‘(‹S…²Iªnúë» ¨š¤äZM7ãÉŒ=¤H`±Ø·û° ‚‘+ÂÈyïûqïä¥6ÄPãsŸŒçDùÔ7‚hƒW d<#—Þhg‹¸?àŠy§o_¹›a4Ò(™Fîç¯a²—ýã×'/Fè +PjMÁq¸BV °½¼wáÒØ>½³qï¦؈¸ÓcOE¦Ÿz—™á»×„Qir[´üD0Ê…÷K2ê½ë±r^¬:?`Òé#«T@t:ÍÂ<,5¯š‚KÊ`£÷·…š¹ £”³i™D}®¼Ûågg˜p¹\MÃ<š¹Ÿ«u~½ÎÝýÇ>gÞzn›£-ݳ|–ooãåÒÝ-V˲÷éè wûž1mžÛІ†õi§‚2C5Ów_FÉŽ¹K´«V‡O>œæÖ ¥²øïÒ9Vó'¯”ל€Ñ•Q2 J˺þÃ(_§I¶C¡(¨`oýÿm¹‘8àÀ½ÑO¯ðorñ³ûÏÝ5냷žN£,›¯—/ðN¤lŠøÀäÍÅä÷>åþòÛY½k¾°¨ ‡Oa9`²r×?­UÂå:²ÒÁx«¼¦P1ÊÙp̻ؗڹ¡YÐ<Ò‹n­”›Ì ‡Koã,¢¥… —toƒ† J•ÍŠHŸ„Y“4 g“uœä‚»X}ÏÃpÆÄa¬=íå¼¾’ÄW6|µ _û\O9H©A¤ÒˆÌ«ñZ“¶ûéöh ƒÍN0ØÖmå;ŠhÈßpÍ>#TeùÔpóÊÓ+ân†%¹™ÜæKô~ßw"€5ïß–C.À8c÷¢_íŽuÀXá å‹my›£ÖQHIptQª|ã”ûæ>ŠŠ€T.Âd¶Œšx/öuE/Átç)uù-=¥µ²{xŠðÒÇÁ$å:Ýáÿ°ËøèÉjv<&`)¸;Hjâ["ÒVÕCá‚r8@¦«$Ë÷ƒbºÓ:ÊPÐæ¸p›Çvq:Yf(ÃÌ©3hëò[bÛZÙCÀNyPÚØ‘뤎/Á4G‘¨ÅMÄìjýÝÞ¨ù˜îò6Ëõ®ä»–s”* ÔävÊ‘_eit}T¶¡”¢ŠÝe —/›auåÕ ùí¼º½²ûgJÚÏ?b Q²‘t”ø7ò `_LÂqH@)iÅ=v<í*ÖÊt™ôÿ€™[^Ö]e)ºU;fyºÆB--›ÍWeñ9> †goû€Ê—“ ë… •nZ«Y‡I°#êȬ²åP wÕt¶³ªþø¹ \¡âeÅ„“ÅIœ×yåÚªOA­©>õá³¾«>ïÁkg!‡ºIt4WÈ÷°êÍQ¬*y€qÑa 'AS¤3VmÈoǪí•ÝŸU%gTƒz4V½y&¬*AR)ÌSЪ0{ÊÇ¢Õw_õÙ0j<µ»—DùQ¬*Pî«îX•FÓ±jC~;Vm¯ìþ¬Ê1¤ÕfÛ¿%«ÆS‹ÿó`Uh>x Vå{ Ä#°j_(Aèó¢ü+¹>r]MfÅװÉ´¤ ewÄ >6PkC~;bm¯ìþÄ 8¦Ô¢Õ'‡ø/—Q÷ÝÅ)çÝ-¿ ù-½¤µ²l€‚Ý¥ù?|nis®î ͆ü–˜´VöLì^áæ“ñögŽ*ÕƒèÞ(B 5jXi»Ïû&Xq`¡3Àêò[ÖZÙC6‰-7\í!‹æ7¡©¯Žü†P96‘މ$Š<˜_œ*´>û+OÃi^K$ï9€óãÙÐݤÑueQ’‡y¼JêU²ëhg4¶Þ<|Öæ¹g›»kIĘÉcÎjý³»{ endstream endobj 1793 0 obj << /Length 1688 /Filter /FlateDecode >> stream xÚí[ßoÛ6~÷_¡GghXŠÛS‡¥];lÝ’¼µ…¡Úr,À±[I^Öýõ;Š’-Éö"™Q³H¶©ãÇûŽÇïÎ n¼ýx=zþR›À£˜ ®çTDhƒW Áõ,x7¾Z$Ù"9;g’Ž_üþÚÝ\Æó8WÓØ½ü5Zm¢åÙ‡ë7Ï_†4Ñ â֠К„œát…­PáxŽŸ» Æ>3º¸}¢ì00|RÓÛÑ»4˜ágoJ„ ƒ»bäm ÆÞ/ƒ«Ñ#Z®‹Ö×T8<¢¾@ ćiµžÅ%òº+˜ T¨ ø÷ÎÊpËk!aˆªùâê7Î+³(Ü]¾v×ézu&èøÏ3ã8Í›þtqIZÓ4ÁŸsF¸Á9àÜLºùfqz=ŽÑ›jäz“Ú”¸¢4¾”Qùæb½œe[¼îã`=KV7îÕzîðå5ì QªyvNo`a@ä6XîqN¤nyc¯y#$ZJ?oüyÆ$º$‰>.Ë ¿Kò…»ÃYoªû#Ëgw”® oIÓ-˜f·ü}*”Üó‰ÑµçÏAax‡¼t‰rv.ã|“®²ná’€ û‡xeñœs_ýüÿ&oq/“¹½²q¶™Nã,›o–Ïð ãuÚÛ&——v;¼½tϸgÁ–½Ù–}5?ôD²,'~O%®ooqKO§q”­+Tójº³W‰¬pú&$R¼b eØìâ;_”ìÖöqRüm’eÛ0OãÏ›$gõèXnâ a) µLxŽ ÅP›H¨Ý´Y‘Z'Q¶‚I¾ž`TLÞSÊâåÌåG»DkÏ1ƒp-9öòª•29Ѹ9·YMØ”iß— Ã$ÀˆAÚÓ8˜×sdÃÚáw÷'À(6¡¬&p†ÁŽöµïÒrË~•ß»ÌP·¥0øÍ€- ¦7»¹,sàëP‰z¨—8#ã%ê‹¿ò4š– u[­y·,K³h¹\O£¼¢Û¢,?¥q¯ò(O¬D.k“âš}ЧI¡4g{b· ÿ^|Q”³å,o‹…v…!HHO(¼²ZÏ¡4î›\ôÇ/…e¨ø‡Z¢.ÖëÎÙd•äMI½‹‚{ŠMÁ‰}§Qk~•ÆÁ®ðŽÎXÕ9h0Õl"Äv€ —>ÍÕ:ƒÚk2D‡'´VÑmÜ ½èdu¨VV¸i©¸¯S€^Þvú/˜ÆSA ­”gºÍ™Ø¢9ìj{*tjÊ€éÚ•Á¼%ÿ¿+s¬+#;uet·|C]õŸéÊÜ¥IŸÔŒáJšáš1•‚äƒ È¦y?ýè µ{'†c BèÕ‰q¤·Z0xx÷`zËU¿. ’H Ã…HÓ¾gŒxƒíQcp’PšGèÂp”Ä Ãa0Nšö=9ñÛ‡¬ëÌSîÁpƱ00#7í{Rë ¶µ¶Ë"à‘É-ªªS¹†ˆá¸mÚ÷äÖlnA¢}v´]s”\K‡g;†S¬qèƒ÷c ±$ˆiABqL!N>&y–§N†ö׊L†DH6œVdŨ.5µìû…¯?Øîr«¢@-Ö ¥å““Ȫõár]˾g°xƒí‘ëÇâ‚Á#ÈFƬ:î›÷–}ON¼Áöá„¡”Wì) GÌõ(³‡û¶¼eß“\o°}Ȭ hùmù4g]åÅ|Ýd>â‚Åô× Ñ*<&.ŠuŸ$,@QÂ5NX€0DÀpgE˾_èúƒí.,@2t{eáØoÿ (|jª¸Õ¸Ã`-ûž‘â ¶G’D þªÂ~ &ÌpO˾''Þ`ûpÂiñçVV÷{¯–}Or½Áö!¬Œ—ÛÜÜ]Txu+Àþ`]„((ªë7‚²é„ÿø­Yàå endstream endobj 1828 0 obj << /Length 1819 /Filter /FlateDecode >> stream xÚíZÛrÛ6}÷WðQêÔ0î—ö©í$iÒ$Ml÷)Éxh ²8C“ EÕu¾¾ €´HZŠ%Ñt›Ng’! ‚‹]œÅÁYX8ºŠpôâèçó£“çÊDIet>‹„DÒ°H¸*O££³y²œ'ãc*ðè§w/ÃÍ©ÙÂfßÄÙ*NÇŸÎ_<×8Ò`P2g+…4£0œ·¥ôWzt.”÷Íѳó£ÏG:ሬ} ð¥ˆ&×G>áh ï^Eq££ßó:#Ê$ܧÑÙÑû#ÜŒK“†µMAáÁ•¥ë"^fäâ¦HJ{‘d¥½<²Eðï#þï$FF¸ÜåEÇe†æ‘b î]ví‚HD (2ÚD…f ÛÖ6·Þ€r$´¬†‰ëÝ×~5?mûõüî2BÓ–D†šGpÖ,®¢psZ z`yX i¦*dÇØV;Ñ@™b¼- ÿ¦è.%ôvéP½¸o±^'­çˆ$¤ î}·Í„@LGŽó8›¦¶ãÉèû]“‘0$©.WÚö{æJogwÈ&b\Â`0(MvóðpÒ¸$Èòéá˜`ФÔÃaÒ¶ß“ÞÎîƒ ð± ˜LòlYî†ÆdwÖª0ˆÀžvЊ›%6 ®4®f0p;öûÛßÙ=À•†#cÔììZ·ÿ¸+Z#EûìÄëVM!aD-é6Q±‚x=HNH¦—r89¢ <Üѱß3c{;»»œÔ eÄ#ȉ þŽšPô[S’8i;ÜÎÕ±ß3Uz;»¹ uŠüÔ„Ä °ÜoZæ{"Ò×Õ}Á®Pß²”ä0#ƒAÛ±ßÛþÎî®0N»ë0Ç\/žBOƒ‘äO"(„HiÖ…]$"3™z8!¨FœGCû=sµ·³»‹Á@b“C6Á›ZÂ!ßÑ„ó‹€ØkQ8ì5´éS¸ý¦¦‰s˜‰pL9[e“2ɳð4)l\ÚêU.™S1º©N;ÏŽOŸ½B€¹}Ë"_¬Røho’rî–ùuu:µ³1{«´ :‹qº²KÔš¼“ç7ÓGÐL»Ó 4Ñ ‘q¤±¨OTèØl͆FÔ˜ºç²qŽ[‘×3¦ùdÛå­·LêÄ õ‡üL²¤lSÒ:7ºñB ¸öí˜3ä&à˜@­–É©-WE¶Üµ@D¨ý£®-zŸË¹m!ëïó"\ßþñúuÕR%H2IW…E•KM¾vp!£cXèZÝãëÏñ56âtÀ3dfL³ª|t¾îØïÇ×ýݯ9¦H þ|ýù?Â× ÄWê)›)(Ùêó¿~„ýþ ¹šýÏÕOÃÕïæê‹É˜âQ𨬄$K¯ânª °Ž»©ÂH@Ò ÅÝûý¸»¿³»s7U0A†~`çS ÿ7`G…Ab-¶?UÚö{¦Jog÷8B ’úŸ$v`·iß®‘Ðb8PÚö{‚ÒÛÙ}@Ž—«íôþI—Ú«hë2xØèÖõÁ˜1…Üf5fmû=1ëíì>˜qø˜Ô?§I¾ØÎI\䜞ŸÐRÛëÔŽ‚þ’L?…€¥„­O{~Uš$bd §-¥M²ØëNÉGÀì¡­ÖpûcjÓé2<ÍŠü:ô½“?ÐZæáº(`‹/ÓÊœ{œ$‹8 oëqÀJ^\Ç%3ÁAUW­Ëú_…O“j¼ZP†'Гþm9¯ß×BÜik©×$r§‡ ™«ÿdÖÕp…].òl™\&iRÞVÊmÖé4'l%ð|¤^¡7<ƒçÄGRïm^7•ó¸ìXÊWåbU5B ]ò÷’€iä1æ SïÔy+㺠CZà;:Íë"$Ë«Q€t5µ?J[\'Y\†é††/¶È¿^YTa¸¶Àhþ¨/M.‹¸¸½_m„zk°£x«Æ¨én·í†álÿ°›µD¨õФZG¤»²ªÕΠŽëª1$¿Ïê°z]ùëõ!`5✶ã[oM÷qUÒìà"w?`ƒEÄŒöñ0cê9½ ÍâÑ=ºœ ýêt­ßÔDáî'90 žM“sÜë0;Þz6 =üìÀjUBŒÞÄÕØ—v{¹|a×ßî;—S! %_ꓦR#"IÅ=²žPöo\ñV ÙeÁƒöáänV]6?€.]–Pµ Þ»ZƒEÌx„›[‘\Í«BW¦¹bšy§¶ç]]\>­ÎU¬ÛÕþrtwGk[xε‡Þ3ˆý:ƒl‚Þµ×Їj?½mŸîlŠ•j… ×KU_¹s b⪳„>9ûõ%ü»øý·jŸ™¹¥\íœËÕdb—ËÙ*mû½éçÔDæ‡üšúoÆB3 endstream endobj 1760 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1495 /Filter /FlateDecode >> stream xÚÅYÙn\E}Ÿ¯èGxHOw-½ +RŠâ VB2‹ÈƒlG‚¿çTÙc;á:*ƒc$Ë®[÷ÜÚº–îvíÒRIµKO¢öw¤éÏ3U6†âiGk"r%êÎáÄUŒÄ:Ð$EV ZqäNÇŒ¤<Œ˜Iƒà’§µÔ{5¢¦In”jiβNGá³Bx㸠*´6Pö¨þ…IjÅyÒÔyÒ¦óL¼8Ï|ÎïÁÎë zƒŽ“œ³a R7‹¢ÎC0jqƒç ¨éxÿË™??;:þ}µ~¼=y»9qõåÕú›õ·ë'‡ÕÌâ7ð•*¬²Jž”F5ä°5‹‚Êîfæ#_„ƒ´þzûr›°†_œþv„ŸGÇGg_ZäîÔ†èh—† Hãþ ±læKC¼T¸Ý¿!Ýì¸Z™afÜja¼ìZ»*»¨7Lñ4 ºðRõ_G_iC“(³ ˜3±FÁ-WŠ‚Es]ìõK`–ls<Æ0#10ö†¹µ ÍŠa6K‹‚G¶íX,pÐÆ L<Â’á`JF2eì¢` ]X2Ô dl‘×w ]Tr‡ƒ•ÜвzT2rCk0U,zÛAyó@¼6oš§ÿz4Nþçhœõ?ÆY>ÇüS’\ÇU·WÖ\F¿u›t½ÍV4AúD›½Ž¾lYØdQK™% †§\ƒ`„ƒSx \±—]Lá%pÍ‹§€°ÎŠo‹¹s-(™[Ïcô¨ä’{‚uf;hÆÀ2²¼b`î9 ¥–§›šäAA‹q¨ÏC£‚kîÑÄ'E£F0bLQ÷0öF V‰õî.3 ¶¼¨Q0cìEÁJ¹—¨Íh›]‚ÅZÙÂ,w7Bn> stream xÚíZÛrÛ6}×Wð‘êT0î—ö)í4iÒô–¸OIÆÃRTÄ M9¼$ã|}"h“”œ‚™´ÓÌØŠÏâ,°»€pð:ÀÁ£Å狳‡ÊIep¾ „DÒ°@h Î×Á‹ðù6-·érEüñ¸¹x–l’"Éã¤ùøk”×Q¶|uþäì¡Æ@É, W iFáu{,­¡¿ÒáYÓPnì3‹ŸÎo:á€Ür ð¤âËÅ‹W8XÃwOŒ¸ÑÁû}ÏË@Œ(“pÏ.p×.M:4ZLAá •roÖETÉÛ‹bIDXÆ «—X`ø'{jaamóh@”!…y ˜@RJKÔÞD"Jx@‘Ñ&(’`ÓaÖG;~÷ð”C«Ú4ÀÄööÅw£ÒÇoGu̺Xjîì°x4Ïœœ Û^NÞ•“*dà᎛‚ž¹îN¼àÅJpŒêwƒN„bèe½Á}sÔNŽÞ“ŒsÄ V ivßÜ!ÓA§ã6Ê×Y2 ~;Ö ´\Ïç*}|OWñ&;ÂU˜dˆq /SÕý ÇÛ¨è1J£ƒ%³Ó³H¢ìòdÁ0E ÌžM°>¾§`Þd§†%ÂJÍ X™ï’âTŤ!—f¬ï§—7Õ rI#!z¹â,Mòj(— Ðß•Lk¤9õ‰ÐƒöÎ C Žhëµm€©«-XÆQµ+NJ1$Óc6_Š!!’b.æóê>¾§[{“ŸbH†ƒüÕ3ÅèyÀ Í0òß’eLšSça!ï{N«F$†%¦Sç00‡˜7uWé.·ŸTC®÷UÔ4y²¤"|ßtxÐÓ€cXðW”“ðjwUgQµ$a²n{ŸVÛæªÜ]&ÍÕ:Ù, £:«¸w:Êê¤DËÃ2|\5=ë²a¡Bx_s+®‹Â.aûUÚ`ª0rl‹¤ª‹¼}ûß×®ßÖu+¯Ë*Ù'0L+ŒpiÌf¿œ@ùÕô…‹Ø¡Ã%(ì¹|‰1M²5Pî*öà®ëÃ[¨@‚ø ,y]yG‹¶´ûn€ÙSR#jL۳씼a\º6Ëv RâøÃ€XdÒz5éL2û½›cižVýeõÖ±‡öÕá¶â ÙXö¸êðÙ^“ò˜Õ焚nu‹ØlàVÛþö×Ó§îNÞ´ ¦Y]$È1ë† kßX1óFÞƒ.¢µEZïïîŠôCdçÑ:ª¢“¢”ä0€z¾èĵB„Ï—$ðý¢“?ÙñщŒx[Ô¤ƒ$éhT"˜Þ–À)Ž9DñÓ® $"3 Õƒ÷ÔÉ“ê‘TX({ Èñ6^Mì0‹13_b÷€KJ擯著7Ù Õ — bNHmr÷±ôo¼8ûÊ‚Î'NßSo²SÄy'nAF/ª‘º¬«ë«Óg LTFæÛ à{ âMvŠ ,Àîø ÞååH=· „AD¸B<°)ê2Š˜àó©ÛÇ÷T×›ìuíyw%q™~HÆO7+H–ä>u'§1)>GÝɱFR»…åÁz}›±ß¤HÍ-—9Û¼~w,­"ü¿W\}{–\Qr`¼ nü‘ËÏîà‰  ¸- ÀM8º'ÙÓüª®Æx­}mß×ëS¼Yq PÒÌhÀÚXêc´Ýº4`.$ãü„ë¢+Þ7M{¶ô·- 62Æ>ë¶ÅóŸÃßÅï¿8“6vÌÙWÖqœ”å¦Î>½7¡FìMÄKŠÃ7e}yÒžÄR°wÆCy 61óÊðýò²ã÷$(Õˆkq{ñÞ ›æLþ׎æÁý@ÁùŽæøžãMvBBI ÔoT~Éâšb†èŒÚôà=¥ñ¥:E,ÁýUO™7ÉõýÕh`ã%#j:ßfÕßO4²T# 4¬'¬Àvu½>y}#Ò29ßþÔßSo²SôÐ f3ÃO#|68ˆÂˆãù¶¯øžzy“¢—b`™¾ÁqÛD*Ä ÿÛ„K¤˜KÔ~Œ²Øƒ·çÈÛ$v¹·=wlëæÛ*åæt¹„¨ëJ«¶Òùè!ç×ݯ»!#vC\j00›Ø£56Ýì7¶¨L쯼¯ûevÛÖe2pö$‹ë+[¢÷Ùû±:50?å·êÿrK| endstream endobj 1897 0 obj << /Length 1468 /Filter /FlateDecode >> stream xÚíZßoÛ6~÷_¡G{hˆâö´ k×ö$oia(²qäÌ–VdýN"刲R[fÕnX€’êø¿ãñ»shpÐàÍ臫Ñùk¥MtÈÂàjÈ„šJãUAp5 ®Ç—‹åv±œœ1IÇßÿþÖÜ\¤ót“fIj>þgE¼š|¸zwþ:¢A„C^J‘ˆ3œ®²i¯¢ñ¹¹0¡ËwF?]þ¢äëÛMü°X&f…î&@ÇéäøÑ<0sV·M˜Ç«Â~Ì×õû`™™+®wix¹ÎH Šëä™ä$ÂÛ3@|LL³8;\d‚Pèïá2{(rƒ*ÞlbëÓÇe¾0wÕlŽ7I¼JŠUœ[Ÿ’EšÜm‹{óé GœNõ¾G«4ëâ ãBÀÛvù·…·ž×K?°ŸZ5Àœ‰ˆHUPi^l²m‡›\ÑÑnîFÖ+H—?¿ÅŸéo¿X‡çe0Zï·E’¤Ûí¼X;=4öö™àDÈÉ)»‚U²˜ÆE¾H³|™Äùz3geðϦɄáFÀŘæ©I賓ø <ѲÄ_^Þ´²' C"Ä9#$ ³Bù\BHˆ€+³Iƒy3 8ÖºŸîO€‘†™ÁÚ7v¡ìkÞ$×|ÀŽ™ i*ÄèÐþP+{›ÛÀÜ\Ø„©;òeÈqYTïýÜ µ};ÁõPFésအðMSøbˆ¯•AaŸï›®$ç=.áÀpç`ÆÖç7Ï™„GAcà"Îf«6ñ«cC’áY‚c°qí{ÆŒ7Ø#‚†‡œpâd’°z‘/m(l38=e8As29„269®}Or¼Áö!ÊãpƒJÈ]g© (}Ú¦Ú3Öƒ4J Å3f0Ò\ûž¤yƒíCÅ«„y¸ÜIM…{ 2Â8 ÃŠ-û~|øƒíÁ‡Ä"…kÖ“êðë8ûŽ'DE„Ž×¾'!Þ`ûœÛ2l·†ŽNg˜ù#ëúé$¾BE%ò`|¹ö=ùòÛ‡/…%½Oå×ôÈ=Ô(þšŒ”¥ÄwG³"`UäQKt5º*˦lA÷ã§*Ä9jVe‰êÔ–c(„ê–@î¶P*ÙÁŽj’rüéšøÑ”·•p»Ô$¢§TÔæ‘5n`Úê3^­Ö5µÞÍ5ëÐ`½Z#T–Ù2w ǧ8ÐH@"Ê'N#aOi¶œWÀú;ïÚý ~;O\L À]«ÕZnã¡x·÷Z]ukd¯±µ ö£;[L¥˜Û ùŸ4ðÕÐòSbb§øéäžO¦;s¸©uÈ M˜xiC¾´!ÿ]mÈ žCëû鶸¹ÛíçþHÎ4 9 ׉ä‘P ׺hÙ÷þ`oFò²‡~¾^d3ÜžÅQ@ñ@‚áZ-ûž$ù‚íÐñR•÷È?Jmc¢û·0åúkto™‰’Ãõ6ZöýôÛ£4ãecK°!º·}ª4¦ñÊ/Q¥1ú‘°Åè›4K7»óÓäˆú8ºiŠÁPb°9§õ®›¥ór`\¬ò¶l+­ù¦6Ÿ¬³÷”²Ûgǯ^ŠÀ—"лtõ]W x@ß©þž¢ïà7MOþ•-‰˜NæPXë…ƒ@-û~?ØãeHÀ¸é<ýÔp\:\·eß“+_°Ï«=ÀÊ´üï©=(Ï9 G kß“@o°=Ô`9[BýŠßÕˆÊÅÁÈqí{’ã ¶9X]3¥z~͘v}ÅØGz°ª¨ûÒ[cù¨tOåÝj‘Í– 1Õ¥´Ò]ÿ¹*pÌÐ}ÿqõ«bØâ endstream endobj 1927 0 obj << /Length 1619 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯Ð£3Ô,¿)vOÐví0lkòÖbÓµPGÎ$y­ûëw)JŽ(+eF-ÖH S—çòÜK^ Gï"=Ÿüz1yüLéH#-©Œ.–‘Hj) GE¢‹Eôzz¾J‹Uz6£Oùë…;ye–&7ÙܸË?’l›¬ÏÞ^¼|ü,ÆQ %³¹R(fº«li íU<}ì”kûÌäéÅäŸ F8"·(<)¢ùõäõ[-à·—F\Çчªåu$F”I8_Gç“¿'¸ö ·ý#˜;<¼í  Hs‡i•d‹µ©±·ƒqcÑ@R!mLwÆ-FTë¦eѰÚxužõq½ÞÌ“Ò,ÜåÕ®²ìÜÏßEîäÕóIôºúÝ™»L³´|ƒ†âAQ›ïóŒ3dï̈†ácd²-W&+S²É{œWiB‡;ïÛ}¿=ƒ'@L%ÄSînúX§Ð†žÀ:$C¾»)ÓMæÜ«ÌWg›¥;æ ›kwþþŒà©9#bº«›oÜñÉLƒÔõH«VÇ3¦¢F_™r›gE_ D„îRc±vþÛ ø»üóww™.Ϩ˜ÖžÛùÜÅr»Fu÷¤5ØøãBj AÐv’øì^& ;,‹Ëb{õ~?80Oø´#-,x{xÞ™:RÀ¼äQ.íÔaï —„GÑ0,¹‰–í¹Â³Ö÷°Q«¦g˜ØÖ¡öÝôÔ±ßÌsÇôж%‘¦úÀ6Š› ­&VÝ3¯J#¡ê‰5ÍJ/Ôí@¦L1¾+êHØuÒ}Æ0š:lMÌô}š±O =Ñz­=‡h3ÍÚwu°˜§X5ÒÏ S!î,8šA J¬~(ÔïX¡ÞfÇ¡ž“§xÞªî„Ŷsã¾õ)0¨»| Š®6yú)±Â~‘”ÉI‚”KŒ0¥ã RÎ5ÂàÛX+XÇ~Ø öxAÊEL¤ÁàY»? @Û¼%ß~ K¡`{T…Pö€ ¦ë´.ã!y1Ó_CÅsЪ„‹ñôí v€Pä #ÎØ×TñfUËñÈñí’ v9vQníʽ,.¥’ESI;‰5,¥ã•R:öY ;„5#ÑlŒç«¤“ ù„ÝÉ T€Ðãì`ùÀÓQ9^1£c?Œ³p°8cZ!ÂÒ Êô“é&S°Ÿ>9Ñ,ik“Ì[ (Éx´yæY …:„´X"¡Õ¤Ý¹leå*¤vÁb[Q _¢xÁ`Be½> stream xÚíZm“›6þî_ÁG»+zE¨ý”vš4m’¶—ë§$sÃa|fjƒ 8éݯï a|~áœ\ÓÎä‚°ìî³Z=»{7ö^ ¾¿<}.•§ò©ï]N=á#_1O*8Jâ]N¼w÷³¤˜%£1xøì·—fpOã!H2òõ´ >,[îA&÷ä±7mæxGX÷ì¶|Œ‘„};À&úî¾òͶҒ_ïO‡¼¡)ËGŠªP¶Î¬¸Î¬Õ†¨:öCs„Anu’–NÈmË M0ÅxGTìˆGæÞXä8ØÎ…UK~?¬z+» R=¡`÷6ÀèÕd½¸HÍÓœV2f:é"á[t¿Ù%A x7¼¨¹Ó>9p) ©N°óÁçÊï _oeXjÌgˆq4 ˆp‡\_…EJö¯9ÈÛ¼­ ŽNµß @hÖ#ÙvÑí®rB@(ãõ®·ÈFD ?êÿìF m8Å:gŒ7Ûí{Œi<Ÿ´)ȳã(öÆjŠZ“ÿï§çåýÏïwY—Cû¿6Ö•ÀÄI$‹Cu㟓eq¦$ül©¿%¿_êï¯ìá,‹ëíÓ‡bYU¸ b,8Æ'ðÆ9b°ì¿Qà4@RˆóE‹+¿g´ôVö¢ÀE˜³s…ƒÁ!IåŸW~Opz+{ 8” Øb4 [.¦ ’»šv.'ÐP‚†{;—öá˜aLž3W~OÌz+{ f ˜Pa·Öä.¾j9™Iä‹Ë%šmfJÊ9f(àêsrp¤”¨9Ì2 Ã(”¨Æþp™'i”,«öœ¦ábD*â'IjŽmò"*ò—îâ<—q¾HRKábQ‚Ð4s.‡—û_ÏZÉ…c¹£™½¾5³å,±â§«4ÒÅ“ð&9„ÈÜ‘”®]bº <æ»Áèe–Éu2OÊ[·-¸®J"P"¶œ¶Ìl+0nh¦‰^ Ö0‚‡o²r]Õ„eKR³µ‘rSÎ $˜5•À7½O'°ÚXúxÍD'YlihšÙ·vóÕ¤]gÕxwÄFi_ÿ–›†ñyk¨æÇ¦yr‡ùívAåñÚñ_}õQWaž„×µùu ÞÄu—º^®ùpoêäc¾‹öæ³ ©ôÕñ6-3 ºÕúñ¹ÑÝgΗ˜n–ˆpªÃÑÞßÌðÜ:GÀµ(KË€­Ï›™ Nµ'ô¢dø:´ï¹Žï‰ÿæW¯Ú”Z?§C§´*e©ÑšeËÕ\GbÇ"æ¶Å»*¯VhÌE€8³yÈæßË8† k:v÷Ū8<ê~dqó‡û¡ H ã}0mÄ£ÍhuípŠTˆ€éx;ÒäîHëü¢ëöÑß:·­sØŽ¤Vee:]Ä÷§‹ÎxZ‘´þ€v_Ð@"ŃýÆRDå½»M ®â’~Å]«">­³A.©~-Íû;Ø*Æç«U[òûQëþÊÞÙ XAð°‡ìlTQÐZ‰ ÿÛºD ¨áÏW@·ä÷‹˜þÊQŒ Æø—ìn(pp¾J¹%¿'8½•=ؼ˜´äxVQËv#DÀ–/{•Ô}êi «àsÔÓħÕïwL<ÇíÒ¯›£;¶’´õÌÿß·ueVóÁâþ:¬…ñc(ɶ›2ÚŒº´‚ñ§¤&òÍ¢Ê1«¦åÏ0ÔËVžY¾ØCbÂ~à"÷x8ìZx×ïR9æ§ü,õÖ¹ò endstream endobj 1855 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1604 /Filter /FlateDecode >> stream xÚÝY]o[7 }÷¯ÐãöPY¤HI‚ý@¶P´}Øô!K5Xa‰tÿ~‡º¹nÒz–¶0 ±iú\’")’’©i )PS "þΡ™¿ç@Ù\Uç™Ù¿*AZÇÖP˜œh¡â„Ky0d&qÁH|á^8;¾@&×âT…š.£àù\:Ú„œW!@ Žr‚M‡•ƨuŒ-ÙŸ­À•ÖyÐV¹ó|µó ­Qç¹µ¥ó Í’󴙺Í.ÀL¡£qài-ƒêëÀÚ9¥ jç•ÀÌWA•ÎkËM“"Îê<nr¼Ì%Wè°¸úÃFîlƒ³“¯¼YƒÛ“ûÝ ”477²ì…œsçá‰Ü:/‡,Üyª"–4d¥:-5+b ª†\RçAGÑ΃Žb΃ṊóŠ\[çAGóAGw¬tttXéi«õöÒ7t7`±|¾ºÜ\]œ­.§MÞy?­^ŸŸ>Þ¼ 'n±šF/uM°X{}§âµR&ü£õz¡'Seu³h¶æõôÊ:eòÃv!‹å‹«ß¶ýóçë?ËÇ›‹×«‹nGzµü~ùÃòÉ õnúÍó T„è{ •+b#"Ås,9÷¨GãEX~·y¹ æ7—oÎñ÷à|}¾ýÖ]øE ÉÕ¢!¬³!ÙüÖhˆæH^òJŠÈ¿Œ¸ª{®“ɧì8½Ú¾AhÏÏN·›‹/ïtј$ïwâhóXai&h&ø« „êÄïç ÖH,‡obb°œ»˜&bvýƒ¶Ÿ¯]Êô4>¼k˜sô wv gœJ½{ƒ·r³Á—˜qèüç=7M‘÷Xö½ÿY×HmŒò‰B7Ffs] vE¦AlÊgù10£è•<n„^™ÇÀÙç¨TGÁ)&¶Q0G£Q0#IË ÃeJƒž#lC«!3dT2cŸåQÉIG%‹ŸY÷ 1lþp2ú÷ö7xÌÞß%ïÚþŒ?n~7ò¹íÏòÜìd"ìzÍýÎéš ™ø* ±J‹~»6—ýŠT*F‡/ûÕóÁdWökO¦vÑ/%´ä[—RîáÄ«hÍ~[:Ï `[½Ï»/‘8`½¿%’îã–„àŸ¯I0;ég¿¿ ¸…ÞÍ ¨®mìG­}gœý`‹º¯=îã`­uT2×è7ºC`AÌýš}Œã/bóÞ!d/^Þ;„ì íBö‚sÚ?„ì“Ø½Œ ‚û —³áŒªƒ^¦Záå: Fcj< Æì]ýL`£QɈ ÿÊ7îÍtÐÏ„úÏ)‡,¾Ì½¾MêoÓ¥üçŒvmpÿÁf"tž.tž.”gbë¬ÿûÁÃÔ›ƒG½×£¸f÷Ýàá–•CzFQ"‚ZYñîî?×aî@sMå¿Od^nd endstream endobj 1988 0 obj << /Length 1687 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WðQîDî Ú§´“¤iӴݧ$ã¡)Èâ Mº$ÕÄùú..´HZ–%ÓŠ›Nfì!‚‹]ìÙÅYP8:pôròãÉäé ¥#´¤2:YDB"©Y¤4\‰NæÑ»éñ2«—ÙÑŒ <}öÇ+ßxk¦2EjüíoI±Jò£'¿<}ã(’Y\)3 Ó9YšÂxOŸú åÚ¾3y~2ù{B`ŽÈZ oŠ(½˜¼û€£9<û%ˆë8úèF^D‚`D™„vOþœà®]1é¨ÑÊiîU©Y§ÉªYš¢ÉÒ¤)«ÓôˆâižAGe’üÂkù ÿĩБv{y9Pœ!…y¤˜@‚;Åm¿ QÂ#Št¬£ÊD‹Ž¦}i›{oN@9±l'ð‚‰=V~X¥¾üv•w™¡+K"Mõ(ëVç‘o¼ î7:÷ò®{)€MÿfEãv«œèÝŒ`Šñ-PèÀ +Þ¢^²¨n nƒ¦÷"ã1B£ABj¯åw·‰ˆÅQgà2)æ¹h2}²+& C’ªÃA¦/$dF+»d˜dˆq “Á¤DtSÝiRänìHA2÷v¦HÊøpÎéËéœÑÊîã,àeé“.“ÁSP©M·†h¨@ÃÎXß÷õ™Ô®ú`>Èç³ñÊîá3©9ÒZ…M6ûlN‹Ì’Bß/ z§å¦úÍîÏ?ìê»8FŠŽÙŸ×[y”” )tÿ©,Ž8žþsDÄÔT p ­¦i‘\ß„ï-õ€æ{Œ©É絿[TeèÖË;®«)ýõ²‚/9ËÍú6Í.œ¹Ûõt‹²ºHt4ãÀßN–¡·n`ü¹ogaÚ$ÏK˜(Œ8» ó-Ûç‹U‘6YY¸Ø™`Y"¤To•ˆ§Y®µ¿6nJ¡ÁÜú²,êì,Ëa ™^ùîrÑOSÐÃT¡³ô×¹é(ç&ƒÓ7eÛÕ,“f ©\5—«Ð X:o–ž¹̺€f Ê[êÚƒÞÐÝÝœ—&˜X”­ÍEš¯æf`xcª‹¬H»àvåf,¨{ øÙT%êÁÝ*ÚÂÃ]ĆèÚs7˜®4"œõMß`ww°Ùy‘.×>ñ7Æî}Ÿl.ô›ŒU£“]‡Ïw3F°w½K(f{BÙäzÛߺÞ)b]ïZÛÜLc…4ï6–"ª¶:(ÐzøŒk†¸¢ýŒõÖ4«ª¨7Ű@D¨ý=ÜJtvÿü þNÿÕßf Ê S¯ÒÔÔõb•£0}÷¸ÄæW¼¼õ¶ó’&s©mÿS®b„aÍvJÂ{,ÆÐòÇ1ôñÊî~JÂFL³:%q„TÆ_Ùù€rÜáŽÔòG‚e´²{”s\hÄÌóÎ!Ƈ;¼ÈéœÑÊîãË5”8ÈùH3¦Äæœ"¢ã/Qcs äX…Mêù§¦JÒ <ìSn‡=pÕ|Ü2«î”YÝÊ* Ûy‡{?B‘%¾x‘5Î÷\€MeצŠË~uØßäNiµÁLKƒgݪÊ!BàÝRø¤ªZ†ü1k9üõÛy)&‘úIKOkW‹ïOMm À;5¥J"¦øÁ6´üqÚxew§¦PR!)éRS‚á¡€üÚè)•qr¸Zf $`F+»¢2†bIO©à.+Ì9}ù#3ZÙ}œ#R<ÔiYÔÍnn¹Éd¡!êžßŒFY*‚âüKYj¿7ð° Í6›ßHì7»/‰•Mb¯¿ö8è¹)L•äÙçÖÞ5ný§“|5ønR¯ñ¾3²·0Yñ_c²×Â7ýÔ Šeù}~éö/p½)” endstream endobj 2013 0 obj << /Length 1299 /Filter /FlateDecode >> stream xÚíZ]o£F}÷¯˜G»ZOæ›™ö©•’ínUu›ø¥Ê®,‚!F²q ¸»ù÷½CØqŒ éÇn” Ù{çÜ;÷\b‚nAoG?ÍFgžAÅšEH*¬ Gž£GÑl®ÇWË8[Æ“)“düã‡wåÉe…i˜aùñW?Ùú«É§Ùû³ M@Å- ð<¬9ƒé ,Ãa¼§Çgå cŸÏFŽ( "ˆ>ÚÀàI‰‚õèúA ¸÷,ŒFŸ‹‘k$)ÁŒ+8_¡«Ñï#R÷KÓš¦¤ØˆÒ”¬pkîoóe˜äqàç›tl³0˜ßN¦”ŒÃ¼4ò#‘þha)ÁFÚYìámËnŽ="Ç%–¢°Û^—TaFbØhƒÒE5C›hû¯îNÀ–ZU”ÀÔŽî‹ï©‰_-ò13Ô±6̼€±`z‹Ê“KÇ.°X°+êì2ˆ5ÏÑ'yIØ“8èXf„Œ„°‰Ïpؘp7va«Œi<È…Àœ24¥X*SÚøÝSsj—~²X…-KÆoŽHʱbÞpÓÄï0½="`¸â˜ “Á¤TÖ÷¹¹Ÿ%ôùȱAИ“É! +¥‡#§‰ß“œÞÆv!‡HxX•äl!Ÿ9›·²Qh,¨9-§Šo³f÷ùŽdNEÒôÙè[Ç'ë±ò4ö¤. ?ÿ’§~—…7XÅ‚åù:Ò 8µIYyå#!,\-ÊQºY»*Þ\)Ǹ±g”Ô !žÂ†ðöfE¶n,XY•úï[˜ ¿4fÆT#³šÀpàŹï¼ðW« ˜:?nî dZQLkiiï»íìïTpl¯L)ÌÜî°“ì-ç=à²îÎ7¹x¿†ž¸šB(S·ª•/-Ç™)¶„c¹Ùæw[¹Üá„Êñmè–àsœ/;xÛãÕfrÏzÖ¤ó2Ì·i’í‹b‰©ôºY!v]ýü~ç¿ýâü‹&LŽ£òC¶ ‚0Ë¢í »éëJÕŸ€]oÊ)ˆ™g¥jv¢J• G4ìVƒ©TÉ9ÖRV×ZøýêZcW©‘ ö’*5û?¨TÉ ß3õ5-üžÓÛØBH2…©ÿ¤J•g>\ ÑÂïINoc»C%fUUÙ«RŸd¦·•ìú5¨ÐæêÑUè 2D–«Ò…+»š3NZ¿IÏôô¿VéyXSæ§Ó¼ÄÍõvÏâ:™šâçkT¡Q:ad¼YÏmÚÙÓ]‹r)0Ñ|8-ÊmV11Xõjá÷«^ý=^‹BÂҗѢöýÂ<ŠwàP‹rÎ0UÃ5/-üžÓÛØr‡ÃÆ$$;¬E‘XÊß˽ˆ^å Ê®™há÷$°·±]d ÓåŸ$6{mZç÷w§'”] 1\ÿÐÂïÉGoc»ðA9–ÜéP!Ù±ÍÃÒoe‡4˜z'&å7ñ×aŸn„3ù*ÝÓ sîU’Ç_ìk.Z/½JMÑewa ‹C˜ýñáü[GòtG¢†íHêï„ÿ²bÕOcÿ¦Z‚Ç—ÂIho~^Ýï]“Ž=f³å Qmx-ç„„¼9Ù89à[‰Ñ}œÜº&ÄÎ]œm¢Ýø­Z”÷9…xSu-îš+Îåcî™U€,ÖJì®Bµ-¼Æ*<2\š]ÌÝð8}Hv›Ù‡;®}=ÓqÐLžÚq=€ïûò‹€"â”ï¾ü #@? endstream endobj 2038 0 obj << /Length 1401 /Filter /FlateDecode >> stream xÚíZ[sâ6~çWè:EÑýÒ>¥m²Í^²Û„·ìCˆI<%†ØLþ}ØŒp7»ÍL2¾ }:Gß‘Îw]#‚Þ´~ëµ޵E[ÅêTXYŽ´…«¦¨w….Úç7ñì&ît™$íÃO'þæ,Ei” #ÿøa,ãΗÞÛƒcC@Å ÐÎ`¸%–Ð^›ö¿0a]ŸÖQ¯õO‹B#‚è£ zJ4¼m]|!è >{‹Ö »eË[$)ÁŒ+¸£óÖ_-RôËЂ9¦¤Ø oÊléV°˜ßDÉ<æ“´ÝéRÒŽæýÙâòï¨CeûÞ[ú™Hÿti.ÁVº¡ÜåMÅxŽ5Hs XÆ»÷’*̨@ [cQ¡QÁÚ2Úú·«0…)cù˜ºÖ¡øÙL•ñó™Þf„"––Ù=»L¯‘¿9Ë(*—‹"ÅÌb‘EnœÌ=_aÐðÍÙ y Ü—` 'ÐÇÅDöÁ*n¾lJ¹˜S†ºKímüi‚ÄÜ Çv7ƒäjUìhÿ¼m8 B /;“CfpmŒœ2~ 9ÁÆÖ!‡hØðY‰œ•Õ(-¦ÄÜšR6[TWXª*4]»¾ÝÒ¦¿nM…Í]†ìõ•ëÆ¼¬ Ì‹’Þò³hp峯ó¡ãòVž°àÝדíÁx‘%èQ:¹õw啲KÎSR¤‚ .ÿ¬¬nCa‹r ‘yžÿ¥‚YrÆœÍ[Î ê"÷fβëx<S£ÌÕKOÍ™¥…¹œ $qÏË)û‘Û§ýí ŽÝ›.ì ÜdA²²Ì+Îk ›²úΗq÷àw pÇ 0.œ©Ÿ€•ERe]bµ‹ã“Å|º˜{×’È…êÝø~­ãëb»F0[]0Áqks×rnÏ¢ù"Mfë£~k;—#.-<ÿóþúßùÇx”»5F³Ùh1öÏ9ýYóÃóSÚ?ýØ?zôáè´Wí»:%q6\2ÉfušF3˜œùUÃn„T°°-¨|þ„žR7Æ,ÚIKÅ0×Íi` j^PÚXÞ¬à‡åÍpc·×ÀR ¸šýˆ`ˆYUw:íªrõs8o¦€¥€ÚQ6W0Uðƒ%ØØ"KÂv óþøäýQyŠ¡v³[›b¡åèfg¶\g›«W*øl[‡-ΰ6ÏÔ+H ,¥Ý¥Î|²¢©#‹%Ž,VÍÉbI VRTeñáùï'ÙqÕ ½¤¹¤øãèÌßDÉpr•¿]£ÅuÆgB؃2M²ÓÉt1¥âŸ®c'c¾º|%!½,OãÁå8zÞÏ o¿ƒT<¦°´ÚÚc“·,’Xôx2Í å4¥DqrýŒÅÀÒ¢¤”›ªŠ‚¹CþÍ]<¿ÙFL×”ËÅJà›ÉepgE3ªÚÔi¢]-76Óœ¤…¸†Í6–÷*øay/ÜØí%-( €×{’´iá»”´\I¬›;6,ÆJ¨©5Wf^”žåP‘iÓ\õQÁ$+ØØ:lIƒI>Áû=¯£V9”çºX4§V9çØŠ,A}ÊrÑÖrTI¦ZFEæ|RT­¯2s£ÌüÆ*ó.çõTæÿã@ú‡Q¡OýÔ õuj}Ê(+> stream xÚÅY[k[G~ׯØÇö!{vn{)& n i1qm\G4¦Á*¶ é¿ï7kI‰¹Y'ŽFßÎÌ™oöˆšqHšI ).hàB.XД]hÁ”!ä¬V(d8äÒ5 w†’ë ‚…Jn'çPÍíäZêššvM ­¹¦ „$®rשv\w S©h ¦ óÅ å' Ò­ˆ_µ9Ræ.!º’»ÿØý×øÚ1¹ùV9°P×I`5†Ú[ó¤4¬Èê8„˹'¡aEéYhXQz’W{šAÊ]—7êºɺ½$%÷Ñ$Å)%Hn4!HñÍ€Äj×Iæ®SH¥ë,ˆÛ«Rva…á è€Ë¹øsW± +€kZ]*Ø]|©Å£ûZ *Ù¿%ì½’¯@JTQ°Âº ӮkšÎ8q šÅuL<‰‰9ha·‡”h)]•º>jî:øh©ëàÃK|ô„%l#Ü2|ê/Uס°ŒÄŸi2¯<‡—i×p–=|´Bþ”Ø(«æ8Ñ`­º7±IÜÏ\|hBiã¡!y‘wË(þìG’@êVT!ù&'…S/)Ôt¶ê†f¯?HRé:ø(ÔàÃà£d×ÁT®Éq8†¹Z×ÁGm]M»>z9&T{ñG€T •®«¡w]ƒ”Ûloo6½ø÷Ÿy˜Ÿ/–³éðêÏeÿüììüïÙôxqñj~q”pôÓñôÓôóôäˆú‡Ùô|~º GÌÝh‰½NŠDòB² pÂÞ^˜ÃôãâÅ"LOÃw—¯Ïð÷àìülù}xøp†¿/D¥Fì9ŽFÍ%¢\qRä”·ÆñëËgÏ~xòèàð£ Ù·±Ô¨ÞÕbõãX–µ]…Ád‘›·ê½¼²EE6‰šÞeSž†#ò^”Âó0ýöûáe$¸„Š'ôóp~õæÍñ­hË1#ŽŒ´$ô¢A0G¹[ô–3N½ö‡ÀÖPÉcPÅï…ƒ`B.†-Kt+ÎbÌ2Z`ô>5fÄŒŽ5fæèD;Fe8# ZÆa¶Q0:Ÿ!0È/Š|ð€û‹óe?'û}&¸^´ß§‚•L๊¶ºú½–AIuóÁÇYá´²Y.X~ |N‹ÓÃ9Îo˜žî‡éÅüí2ßl 'ÍgÓ„6?_^zàÝ‹ŸüËÅÕÅéüòšç»î—ù«³“Ç‹·¡7 kè c–Rì­ùàäF9¡t|ï7—ðßG#«OF+¡­„šÖ­^ ×y|OmlE.™4V'à¹d¶X¤ìŽ\,qÌhçV4úÚX¥ú¨kÝ9»`~‰ä$·b3ôµÝ‘Üš]¤qd¦ ½hBXl»Û6O‚80>‹j,|¤Jäÿ‹âäjù…vz²\\Ü^0YF}Ǻ >“»±î½¤…*EÃõjÂvaâþ¬Äô¾YoŒ8›oêÇ]¶ ñ4¦A°Xl[ j+¸ö1æ‚QQÁ˜wÚVnßNˆÙòX«¢>±>On¥É­† Ãæ(¸$Tç`æp‰‹*ƒ1ã(Ä’KƒkAK§QË)æÑ:âÒbMîìˆYî:Œüà´ð™szŽ|8ôûïæÜoé£9 êšÚ­ ýåÀJ(k¡Þ+ë¯Ú(îÍØ ÞôÑœ±ë·°Ü×죸 Ç‚qhÝGqÇŸÙFï'1j5ú ° ïæ†~¶SÞÑ£¶TZô÷â}½ú †–ݾ%õ&¤ú.5~ž11ÞñÆÛ_ ßxo¢?AuÛÁ·PÝ-àíT·| ÕmßBu[Á†k, &Ã0§b cËÒ`æLJ$µÌÅ0˜ A·Q|@ÁÖãÊ[±š£Ò¨a”‘Ú`2„rÓûcº¯ÉmR?æ6É_ÈmýUð5QZ ÂkAÖ‚®û*$罜Ê{$‡^δû^î¬f\7½<ã|«|Ëk”ÏÇì¯Ó×4‡­¥]ff}ÍMzýþ*¥,­í~‹÷\ôèÍ1î¹ù[î &"ÿ gó~Ù0•;³­ÜábyýI¶Ýgh¶ŒÍÎuŒIQG£ ÿ…`lcÍ0U2±a粕A0X.·QËŠÛßèþù›$µ,•1³àªè?"qUô[á:ñ`Ìþš»ŒZf’(£13†6§kvSÓ(ïÿ´ò©+t¶ endstream endobj 2073 0 obj << /Length 1237 /Filter /FlateDecode >> stream xÚíZ]Sã6}ϯÐcÒi„¾?Ú§í¶lÛi ¼±;™8$³‰³Ä6tÿ}¯,lÀ‰âݡà ۑ®ÎÕ=÷êX„ kDÐûÞ/½£m‘ÅV1….fH*¬,GÚB«)º˜¢Ëþù|‘̃!“¤ÿîïSqÍ¢MO"ûç8ÎÆËÁ§‹G'† w…ÖØpÓ嶬„þÚô|Äuczǽ›…NÑ FJ4Yõ.?4…Ï> ‚…5è.ï¹B’̸‚ë%:ïýÓ#U¿ ­À(mJŠ­ðP’Ü­Ñ8KçQœ.&ãt½m¢ÕzÀHÿ6M\û9ÉVêG" üÒ/ÁVº¹\ó¾žcMÒ\b)rô 3*ÃÖX´‰Ð¬·nmûÓÇ0¥QåÞ0u½CíKU·_.u›ª¶¶ÌlnpsüÅYcˆecQ1Æé"È‹8õ{ÒºRÂyšŽ 9ª†Ü0£-Š[.S§6 9ehH±TÖÃüá)sƒ*çãxºŒHú?¶%%åX1Ýgêö9 ¶g¸â˜ “Á¤TV ÞhœÄôeò( A3Íยñsë¬ âU£Ñ>Y •–XkÛ®&ÙÕçh@eÿë^ÅPI <ÝC% LvFì†ý0b‡ƒm_ lxH-†9¾>ª†ìµUCÅ5ª»´a?4Á`w¨†J¬¥øÞÕPqA?ºn¼ 6)•÷øÌ>(v·îO!pé”ôï« <›mÖ+û‹ºïRöqmŽN(©.8A0 [›|†š]E aˆ,EôO ›5‡ fÖ–=“Št/Œ{˜IÑ.—k€Mýí•ÏjZF–V"›/‚§Â"^¤õà!¾Ïû;»'C €Y±Ý>âKÃy §lwçëvàwÍ`Û°º‚oh(P˜þßÓ-Í6q²-ìS©w÷¼´˜ƒ?ÿí~Fýîo³“ýYÉêÉ$J’Y¶ÄÅôU¥à¢% )†œ‚¢~F)$ã<]¢½Ä°K®»Â,µé¬Î7ì‡Õùp°íŰW¥#’ñms'*õÚ4;®PÔvÇ•ºý@®ƒÝAƒIQNNÿ8®/1H­•«Òs6ß;Z° ¸ºùÀX…BÝ%T öa¾·|Giö-ä› káð8i­h·_ÏüEOÖÓE|íïÖ³mšÍë¹µo?–ћ†{QÃùnx šškÕÚcSöô«þØãõ—(.”w¨»Í"…€¾€˜Q â›êü¿©Îè&v¯dÙê*ÚŒ ©ÝëYº—åÄ@rªî4(³ÑÝÉkÃ~Ø^¶½å„bÊå4(0¢`C”¾þ*f6¦»—†ý@ÒƒÝAá0K0Õª …Ó:8Zæ~wœºýÀàƒÝ%8ÚBõ,*w9ÍÙ¨‘îœÚýrê>ÉC´)sÛ»øÒ”I† -°ÿ›nÆ“´Ø£›ìá?è…O÷²3ZN›§ŒïÞߟ[€m:¯–. ç%Å(º³óë,ý’,†üÎÏįKòÞ-ÒyK‚?¯Z¥…bõpv§ZŸÑƒšmˆŠ—´í}ßmßp—VKÄ>_pùóÕ Ü endstream endobj 2103 0 obj << /Length 1517 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯à£<Ô ï·§X»v¶¥yk C‘éD¨-§–Ô"ûõ;©DRìFЬC $#Q‡çð;—ïÐ&è ôröëÅììE¨‘ÆZ1….ÖH*¬4G¡†kHÑÅ ½ Þ\§ùu:_0I‚ç¿rƒs³6{“%Æýûgœ•ñfþþâõÙ‹ˆ *nŠ0Äg°\%K+˜FÁ™»0¡í;³ß.fg&Dïu`ð¦DÉvöö=A+xö,t„>W3·HR‚W0Þ 7³f¤iWDjÔ2%ÅZ8Uòʬe\×&+Ò$.vûen>fsJ‚r{iö˽ÙîæŒŸŒS÷‘~i¥3ÁZÚõìåeÇŽC"PÈ%–¢²ÀÞ—TaFbXGí Z7TnK;|÷áL`©z'˜ÚÙcåûíj˯·»Ï MY k¦O l%p…ÜàÜã xV8‹&Î ¼.ô@§Yá;*½]PÂ9î÷þ¾Ðö¸PŽ §©-$Hc•} —¡ƒhX‚J‡‰$¿Á¨3NsŸ‘à˜pK¥ŸŽI˜G¨1ñ:ÎV›6np÷Yß0& +M`[þHG+Û#ʸ☠€”HxY5ËÄ2Î3úx¸)¶V”uÁ±iö—ž)­¡Zé1y¶s=ZUáPFÎâs[¨ >Ù?¾B²(ïË¢ËnüŽf6+÷OšùzÚÚ)ÜÚˆ³”47ž x k»~ 宩-8"².º?wd¶ ‹0Óºž™7J½^ãÜ_7›¨j¼—·•dZ#LW›á\"ÍÒ¢]:ïqþ²½ ˆz{gAAaæsÇ¿éð” 7¾-÷v·öÝ6ô[D\™zûUívE¹ÏòC°KLe8Üò†ÄãF½ùýü,ÿú£cóçõœÉ`íc L“çërƒ½’M*f14œBîÍÅrS<‰„I%pÈõt$LÚëtÕ¡-~\q­j&¡êšY/踵¯ ç\Ì!M|B!t6ŒNç2mù#}f´²… ò½ž‚PôǦ%Ŧ§-$8£•NU^6%„4gË¢0wñ;†åIA½à_ƒåI-‹dÞ Á™~»äî䮳‡Ø]+V:ÆKŠ9¸ç`ã!XíQ®jwýœ׃\ºØùé÷ÁÐÛËÛŒVB¯¦Yôï‡ÑËÄ(~ÈËí“Ø,&$šŽÍÚdO„ž¬üuä+ã•íOh9¬Éyx*B ŽP9AÇó¸ú¿‘Y.&úKKüHw«ê²Ä%ls}K&ËÅ”O×ftäÄf´²CÀpTˆe J°ÅíÍÓC…LÃéZ‹Žü‘€ŒVv *¨'@ÉuÜqyõNmÀ 3%ÙþxGa”O‡W[þH¼F+;/ư$þóá<ý×,‡ÄÐÆdcAnI_£d<ªnÈêFSðQ“xÇYðÉ2ÅxSú‡1†ÛñCb¼àDÏÊ€—r÷R™—ÐÜú){ãûxrYß„çivõj “-ë˜ÓŠN½Ì‘¥š½Ëœè|·5^÷››U<½{tc’Ô¶‰`{UJaS=_ÅE Æenuƒ¡ Àzwïƒ=Å­[wc½ßmÝÈÏÉiâ¦õƒØìÎØ—&‹jáenV°ŸWp1H°s“ó¸ú¼Þ S J·æ #ÜîJwo{E>Û%ã¬ð:ìjÌñÝ­V9ÄéâÕjù…îìXšå…‰WÏ|?v&¾!x“r°ûî´Ú¡êÁ½¿Ø¦5[ÝÍßÜMMýh]f‰Ç®Ñ©í²ú£07?Î"ŽŸE¨ïý,B6ªgÍxºgS…|ÊYÄMYòèjÇâaGjö´ qÀª1#vBƒ\R<±A<”êù¢Ú±IH¬d”¢»ø„šî“ƺVxR3;‡D2%ÿZ{vƒ=þ¹~èkk’OùÖÚ¡b± endstream endobj 2132 0 obj << /Length 1602 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯Ð£=Ô ¿%nO°vm±tK<ì!- E–ka²œYÒï×ï’”I‘ÛŒ›u-ÐB²DÞËsyy.ì}ò°÷zðãdpöÊWžBJRéMæžH*æù ®>ñ&3ïjx¹HòE2S‡/}co.ây¼Ž³(¶? ³2LG'oÏ^Ø P2 È}ŒÂpKùÐÞ†göB¹Ò}?M 4¹³BOáEËÁÕGìÍàÝ[#®ïÖ´\z‚`D™„ûÔ»ü6ÀM¿Ò0£Æ)nMÉ[Ó°,qV$QX¬ÖÓ<.¦Q.ckß,0ü'ÆHŒ”ÐèËëŽÉ ù˜{>Hpc²~.ˆD”p"(o{ó†m´þ§÷ ‰@ÖX`¢[»âWóÓÆ¯çwŸšX)ªžÀX¸þäÙ›‹ŠX ÐË›ÄR3¿b6É KØNïjL0Åø± h¢@&¡‹Ž‰êÅ}Øz±´:2Î#Ô$¤²6~· B x†‹0›¥]K†/öH¤þé¦ï0ÎÆî0L2ĸ„Á`P"š)næyòUeùe\XÕt³N²(¹ád~~À˜ÆéÌþH2{mgó¨XÙk~G‰éTõù{DÅ0L˵æåìÁM±­‘¬»Ã€hjÚÎ8 °¨¥Û÷Ì–›¢àn*+kRn]É«kš®ÀÚêëA&5å¤6ÆM»þ“,)ÚzìŽö‡ýs†ô“1ƒi•òïeðŽó>„¡‡;ß×›ß-À#' Ù¤š€*­¶dÇyqÎ`ÞÀãWóVˆ'aú¢ Ú¸jÑMëÕû2‡B"ÝTm~~ÿ¦ç“éïçïÎߘþqþˆ¯S(ï½Í?©Bœág’Ý”Õ×ë°²ö6)½ [Þµòçø˜Az £/â¢\gy߈ÿp³kĿܾW囹NkyEqžÏËUÃ7‹)½ž8ìÎcF@t?VM­ã0]UN Ѓzs;Y9%@Ó((sOµÅwðݶxwc÷/§†©Á–S6 ºõþÒê)®(„ž,b:ønãnì¢+aRÍ3ÖS¶9,ØéÈiã;’ãlì!ä°bøs ö¾0lÅ¥qæRßQ)'âsÔwvc®ª/ —¾¡ìÄfü<¬ ~¶­ÔôOfŠ=ý¸ý…]?T_îB‚®¹}·=äÖ?´¶7u†þq]?„÷IöiwÑa†°Vc˜é„Âj¹£ò06”¹Æ5ýÁ~{3‹ç#,ÓÂ>ˆ³h½¹)’•áS¡„ÀL‹Ö1?Wö˜®Iëð–ËúÍ|½Z6Ûè›$²Íª¤X„…}£çG_¯cc£¾-óxË ýdàáÊ>ÎÃÕ54 ´E]Öß6«Ò>[†•·Æ½¬hÔäûªNÒ§ ÃÙlÚ&w×t— CÆáìEß<Þ.’¨ª¸€ï¨L!òzN⺰i‡‘©Ù²Ù¶WºíTwó2‹ s­£‰UVñÍ·ïƒß¾>väÐÖPÝ„dàþÔ=}}÷ýp{lfSóîC6“wtNr$)k(Ýé‡û’¸¨ô96 ‹ðɃ°Uý¬Uûp—4‚0ãG¬WÐí¯ºŸÅÛöy¨EÆØõ¼i Þ÷—¬R…p‡þ!ë¿óÆù¼ endstream endobj 2158 0 obj << /Length 1749 /Filter /FlateDecode >> stream xÚÝZmoÛ6þî_!ä“<Ä _%jûÔ}I×v]ëaÚ"Pd:!*Kž$7KýN"e½ØIl«N‹-ÄÐÔñŽw÷Üs´±så`çùè×éèì™8 <ê9Ó¹#<äÌñxúęΜîûk_ëñ„ ì>y{nïÔ\e*‰”ùóu˜¬Âxüiúòì™ÄŽ+rßG’QØ®’HXïK÷Ì<(ÊwFO§£Fa‡4:PxS8ÑbôávfðÙK#Hç¦Z¹pÁˆ2Ʊó~ôÇ·í’¤¥F-Sp£J^™u®Šk•: ‹4»ÈW—ŸÕ˜÷Ö(ø ÿI¥%F(w(Ï{:3äcîøL Á+ËyA»¹åHH¯ÞÀ&åê¡òíuå×¼ËmY hð ”­fW޼³žVžåmÏRˆ3Ÿ·#ö"Ìë¸;å9&‚c|O0Üv$Ôë˸°lЬ3¦ó"ã1B A Œž?Ý%B &ÖÂë0™Åª§I©ùe×Ȥ .ð‡Dfïy7x` àáͧpJLºóU:MÊ¿|7ÊTX(ûQh‰SáÞ˜OÚ®sìžÂ<'î2]®â°WÍÌk7º¸6£<](3š©ù˜`7\Å…÷¥Æ+•£ñ„aÏ=/ÌÊUn´ð]ØÏLE«  Í~^h#ÓwC«m¦ŠU–Ô»_ÞÚu×vY~›jQºŽiBp„=‹9R¡¥Y ƒÈJ‡!xØÎF‘~ĘªxV© ÖT*—Kg³ÜŽÌ#ƒ—Ó…—A[šnQÌ.êÄÍÙ3‚Ûù:RLû‘Úv.ãHbQãøÏ=™8ˆA½2oU+ܨ^›Ç)øXYë/M¾‘:'H+S+óL¢êD]lnÒ¢o/D}£Û„3TÀ„ÀµŽyWy4ßfµ@Døû[]K캻/fª~¾ùóÕ+;“˜§ `¯2…¬fíŠVÂ!² 2øî)iEzQÆQuîûW4päQÿxMH†_Å´Zi¦¿†åÍÆÅê„u~X«Å|†0¡Çkµ˜GìhŒ '#®ìî­‚ÆøN«ùFŸìá¡>k) (oÙ""ý‡°tÃÁ>aL"ÂíÕÛ2éªc_ß²4öô@»D­½xÁÆélVHà“ûcmŸu¹Co[;N.Ã\G'Ý[£“Ï"N¯trr?ÚJŒ$¤Òc¢í½NˆÒ,Sù2MfMYM;7šy‘ÁG‚ñxRÞ^س9‹)‡ÇÃbÊìwÑ? ‰«º;ƒ’ˆùr(7¾ïá°Oßwù;¢«ÿ-n»(¥ˆ°ãõð=ùãd°²{ôð0š“ïÝÃ/¥"½4ß|ä`B`wz<wåtð`e÷q0áˆ{ßÙ¿% |zIC1pɃé#êѦï•` UE%Ànš#÷$òèºÉïØÜßÃk ^wéÒ7•ô™Êu¦f[· AëïÑ:isïõµQg˜…ëß›4Íèú˵×çÓ³J/fa|'Y(˜š=ÐlSFóüïu=ô#\ õ$ïvÐW”®ï¾:fª?šm×\½÷åx¦ÂxñÐeI€ 店%½ Þ0ˆàÁ-ñµ­»è]|€rüq/>ÈúÂcKbò Æ÷Ï}Ýãùµ ׿qÈUöEG*o‡qs/‰Ü¸¬Ê½]yº-{±Å:@†ìFç=‡lû©,Æü_šý L, endstream endobj 2060 0 obj << /Type /ObjStm /N 100 /First 991 /Length 1768 /Filter /FlateDecode >> stream xÚÕY[o”7}ß_áÇö!^Ûs±]!$.¢ ¶*"<´EyɪDÐl•‹Dÿ}ÏLö vƒ)![¤(š=ßÌ|Ç—9ö–DR(©–K‡¡9Pr£f6ƒ‚tÃ(‡ZªZ%34ä”ý»rµHl‘tKB&.掚=Zcr_ƒUÝ×C–b¾–`©Ei9dÍÙ,T¦¹QÈ5¹9*[ކµ»999Zsrôâ>äèÕ|þ*Ù|þ˜ºÉsòêñ1‹ýKð•–C[(ìÕ+ˆÑb¤TD©ö1uѱΠÎ)ë({¢®ˆÜªØß­·@êïÛ{ *}†lx¶'±¼x¶_T€g;Àª»¯Ájîë3™À¹š„q)îÃèu¦œ‘#3,qŸ`l“ãÔFÙ}ÈÁÝ}È!ä>äc2äPc2#<«Ó„\³ÕŒ2¸1Û{¤ ‰Èp˜6ÙhÊ L(û³„ÅÈF(«©ì¸¤¦b3Q±E¦ ¹Ù·øÒ0æ™–W€"õ"2UXê¾”“û…I„Wv&A¢Š3‰‰©âL2r¨3‰ÁS­–ƒ‘£:“ .Ç!GËîCŽæL2rtgR£;“H©Ý™ÄÀ×DÆÔP³Ú …J©!‡`=1û·ª4ãEz¨5/Šg«?תÍfXÆš¬M܇(­»Q:»QzsŸ†þfwîÌæ–ÇgáÎ0dë¬cµ?ƒm”¦ÉF©´²1‡eÂØ¤lÒ&æêdcÚêÃÝ»³ùÓ“åÁîâ,¼ó§…ùóÅÛ³°7ÃWVÀóþ^à‹ý?³ù³8>;µä)góg‹ÓåùÉÁâôbõ¹ï—ÅáÑþýåÛðÂj”.‹-4αõ=äÛ?Aài…¿w|¼DÐëÙÊòýkeÐdðdÈdèdT7>¨ÙÃÎæ»ç/ÏüóÏGǯgóûË“ÃʼnW–öæçOæ^dÿ`/s0Œ±`_Æëm'µ×À*êžÇn˜ÿ¸|¾ ó‡á»ÓWGøÛ9:>:ûÞ(½™2„¢m ¢(›1¿Ž;ríײ~ö ìŸ-On°¢1ظ"Ë%5\Pao·O UŠØ¸.©!ŒXåºEjJ)±cÊNÔB…ZoŸ¬®˜°È'j°›ÅÎe Ôd*Q±Ác«‹¶ñå¦Ñ+$@Ì-¯­h÷ñüíüúÓî=Ý}¿–‡xE“;¾“ýöûa'k$tØV^¸‡ãó7oö6¢E1s±ù+èc`PG£à‚K Šk¬˜RØFǰÒcm4ÿ`äkŒ, Ì‚¹÷ØIG#—Ø G#£óè`dn)v̧!0aÙç6H„y,‰G#—h’t0rަ«†À»18‘þ§2#§e† ×/–mR}eÔ´2ú¤7ú¤7ú¤7ú¤7zŒ)Nï_C@õÆj'™U7QMQ“Þ~7Ñ‚Bj½ì&èQÛ›‰æ„õß.›‰|fùÌfrCr§Ùñd’C­Ç-ˆ!õ¢‘§1bEU¶8HŒAñN¿$&ì<™ou¨* '²^¢›ÅvKH#¹VɼZ¼>=ÿëæêàÒ°bpºC{ÉØQD+ŽèMØ=†Gigÿðpç†k»¯\"aÜ.Å+fVá¼ñ ÍùÝT6VûŸ¦²µA» zO0æX¨lŒWПŒkÁ›ãzðÁ¸¼I0®C÷,c`©Ã`L»³ƒç2 –­;Y£]¤ çÃA0Î&v 5®X>£`U_cc`‘Hu bÔœGÙÀŠâoDRùXRúR hw®Ýòê•ü¦seÈdèdÔÉh“ñuvƒÊïîL*oáþ@3¶¥üîþÀ`)Û¼uBõ»óIfªëçWÒY©E»Ô½ÔY¹cËÚ†Î"åXíæ•ÁÑÜn¹‹´íkõÍëÅ?;'ûLJËTÔ)Šý…™B ‡P]±_R,í3ÎéùKÔxó“(CnIyOâ$( Ú‚ÄÉè·ŠyšE¹•(×í®—8;ÜàØô'%Î:ðF‰³¼Iâ¬o”8ëÀ%Î:°ÝF‰ŽgJ£àÌ‘JC.ä:N8¾È`d¶öׇ›°Le”g*XÛ½Ž‚5r¤ÎnФŒFNEÙÀrÇ d£`ù©|zè"ðU=$úÅzH&$“ ù*G iôݯGZ“ ê-nÁ“ èÕï/áCc¯å6…M焦$-ûÍ[“CÖŽñ9uø´–ú9‡Ü÷ÑŸìëÀ;ÀZ𦰬)Ç”Á6ÅÓºÖƒë†v±Üôj»øOËb endstream endobj 2184 0 obj << /Length 1794 /Filter /FlateDecode >> stream xÚíZÛnÛF}×W~’Šj½Wr·}J‹æVmc¿%AS”´ˆD)$Ãyè·wöB‰¤¤X2­8n ÄI-gÏìÌΜ³&^ô~¹ì?T  i\Ž¢P± Rð‘àr¼ë_Lu1Õƒ!¸ÿìÏWîâm:Nó4KRwû&ÎVñlðáòõùs‰ Cf ò(B’Q˜ÎÚR ÆG²î>(WæÞo—½O=ƒp@6(¼)‚dÞ{÷#øîu€W2¸±#ç QÂõ,¸èýÕÃu¿$©Á¨l ‚wP ëÖU¼*§‹\ î§WE™(î'ó¥Cø ÄÂÄH 3…ùxÑÍP„y±qÉ hó\QŠ”TAžãʦµÝO·'  ˆ•ŸÀ&ftWû~…šö«>d†º­)ª¬5˜OwñÖ‡BhCËë¡¥IÂ\luVº€íµ¼ƒxSŒÛi`3ÀD¿þ: Ž$Œ5Éà¿Ø¶Wí“Æ‹ŒsÄ †‰P9p?ì3!“Amà4ÎF³´…¤ÿã¡©H8˜ŠN—)Mû3¥3Ø2…… 1ÂdP“„/É"+H–ŸLã¼ ¡úy¯è.s%zéªæ½Œ ±<]€›ö;¸3ØcŒC$áíÇ °))_²x¾µƒM?ùùà cÕ¥¡´>÷6ýPø(ràŸùz—z‘¹¿»þN0«­y(QH×ý½ás{†Õzäd ú±6±±ÖGi¡ót´s hÚ4ª^l웯O‘$‹|¤³‰›¡\¸Ï³ë¸ÐÉ™»1€Ó¬Ô‰uôG÷P£ùË2-ʵ…ñ"÷Fî™»…–c Ô´ñ¢žœCÊ(bPãàaÉÛ5KÝƑĢrå§–é†×Qµvº¨±5oÜ9:›-ÀIXa{{}k-’*Im+X—\[Ô™.›h“Æw¸Ë2O†žÉpgìäþØá°]|çÕ.§Ít²7›ií­ÉÏ;Àþ§P­à[¹½žß#Zñö6Û…NE5¯VÖW¹·i¹Ê³bW" D„<ÚzdeÑ‚">ïw–®`üø ‹Í´ÜkÔÚfEšÖIZ¬SÖmÉ©Oiùí²ÜŠ²ßºüîûú/æ7ºp«ÛCù*!0C†-gݯFW÷ÓB'ÔȦPâd„ e¿!èöpm 8>Ù]˜È·tø¤„`@ÅØé$dË~Ç4é öÞ(˜™”×=®ÊåÃQÂ-cGDRF§“s-û£Öì1Q£žý+ؾ …ò›°}a„÷}îBÏ—3 L7ÎFÕ-aûØ?Á~hï7.î¢ÿ0c½—ÃlÉLÃv_ÕÙÜZóv¼ DÜ=è¦;—h-œõŸˆè["Áê”ß;·¡üþõÛejhã–^zÈ!‘䆂þ¢Í`[`æ«Ê•da†ŒüsKIw­ªCVŽKÄÉš—yÿ.§~‚³b¶˜èìïÜà¸,Óù²,üóÊÆ›W—ç/S=U~ÍSH€Ñ:ò.q^¦íGF©QsqÖÌì=Æ´gŸ£Ä:¿‹G#mPVÄ<ý´Ò*úŸÍñls¼læy…ÿ˺Ê÷•–«0ÈíÑžêl¹ò¢Ü"×ñuåîFamvœ×Ùxq—vÝ¡!\¾OUþ¯ªN®ª’ñä^:Š™NBØétƒÒ‰Ó騖ýnT«;ØÃuƒhbNï«£LÀÛòI„OM>1*Q¤N'ŸZö;fGg°GqÆ(4`öÈD|±´U¿ g ($޾ g8DQ¥]~]d†8MV¹/ÅuÎ1Ó×yœß¶»ðÄ& »iuNoàqÙÒÅ>äuê”ä)§ÇäM›\Ùá·u½7Ž»CÕä%·:Ž—DÇoð’‹—¯àßÕ¿¯ùI ­wÎP¿¸¨ÓÄ™íäàá> pÕ kF©\–RO ˆ‚VHå鈑PMCu²Ò߲߭ôw{81 *¿;ƒ=iТ ”?5¶@ÌïŸÈé2¦a¾cÂt…zU ’ ªÈQ…­þo„¢Vtw° ¦m~Žg«N'p$‚ÊOÉ·èýDE>Ë.\Í‹¼ƒ‹³ÆŽ–Ò‡]Qœ¹o“5W¨D.<\h¸狹»jS„(ômÊœ$)âO’`àºyÁ°_šã9÷M[PœŒ»46}jf˜¤¹3`Õ&|inª"nxGýÀ¨H—qÞ8> stream xÚíZ_oÛ6ϧ‚=ØCÅð¿Äí©ÝÒ.ºnIÞÚ"%:jÉž$§ó·ßQ¤Iv2'ªÓv(€Ô‘<ÞñŽ÷»“Œ½k{¯Ž^\¼ ”§’Tz—SOH$óm@¼ËÄ{7º˜¥å,ûTàÑó?Ïlç\Ou¡óXÛÇ7Q¾Šæã—¯O^†Ø ¡d†!( yÛÕ¼ư G'¶¡\™EG§—G˜…=r+,e‹³£w°—ÀØk#®BïS=3óÁˆ2 ý¹wqô×n+’– OAâV–²Öë*ž^_ÅcŠGóTçÕÇ$ÖÕz©­xï±ÀðOj1RÂð7Í«žÄ ˜{“H°ÀHlè‚HD ÷(R¡ò íM["v¹í¦no@AØl`3{(w<]þÍñî³C›—DŠªÏ lͰ¸ölçÜÙìWÛ•·íJCJi ›æ•5Ø|¼w>ÁãŽtíßfÓ¥„ÙÆÜÀ6Çæžt2Î#Ôó RYñ~¼‹…@,ôZgQžÌû’Œží댄#IÔá|¥Ë ¯ v_a’!Æ%l …ƒ³0zÕu3„™êZíN³˜lÛ­v ²o7G~ÞÛvAÜGzí‘^B5­ôº²á¼š¹¸îT©û7c*FQ‘F“¹­½éQQDkÛ]Lm», R:±ö–µ™£ÎA¼$¸m3ìùô¦AÿJ@|o«Ã8 ±h`æ§ÏŽæ!¢J53Ûà6O'ET8ùÝNVèBG•ëOÖ5oÒøiÅ3î"Jš§U=n=á~}p>Cñ Ðë»Ô½}¸Þ‹Uµ\U[Vû”V3gœ<.ÖË*]äÎÆ»l¥‚ÿZpFº‚ŸëjUä;%ˆˆàá’[Ž=ÇËWÙD]ÏÛ©í¦ùNÇ•¢kýŒm“é(wKòE®‘S£X­¹žÏ 5dÔâj•Õ£ò J„¹8\~!p(†=þÃ0c¸°ûçÇ ð»!cgŽ„÷¥ÖzyûjòŒ‡à•€,«ð)KÀ–Ä%z§ÿTE÷1+ÑÓ1+½š·qÆv§Å"ëMŸ§euÈ’ÿcÈÚüÄâOø·}'n Ü¥~\ÜæR Îåáâ6ñ08XÜîñ·‡ »Üæ"@A >_]Xû@/fsú­Õ†|_ÐýGèñè/ƒ…}@m×… ¾Ä³¨è1‘ö6„²ÖÌ›h¾²œc$˜z åêOL[U! … º,ä£c{'|¸¾EÄc;#^äï1¦×«"²Ø˦ÏþêujÊÉ›1²-©¬Š4¿Fc? |tÙlf©þU”š”Ü<µC½™é|3dn#\wmØ_›Â ¤°óò(Óe¾ \Cµ­„ ¥^F }þ‡­ñ"Ë"—&¸:ãÓ,­t¹Œb튌ð àè8Ò%Ò«ÒŸeQì—³ˆøJ6˜U2?ž8êÇdC­‰Y"Ž¿™š8ù’EñæFõô¦ qú½O\3ÊŸ¦våéÅogðwõöwWàºT¶\ű.Ëéjþ˜’+“X]•ë²Ò™¹ÙóǽgüU©Ã%@TA†g]öÃàl°¨ûg?T rZ0[äåù©?·qO(D‚=‘‡ˆ“ôÝéRÓt+‡yl6A€_ª¦¡BXЧg`Dˆ+³j˜$ nz} ¶¿ÆØ\_Ó7h{iiÛDÇib¹yˆª†O¶ ùUšÕ‡éhbª¢•ÏÌkCÓ™8n ƒ·Ó‹"Míöž¸yU#- p<ºI‹EžÕŵ!v_0Š‹j¿¼ýãåÙ«ïU÷—®º³ QÏÇ qÂúØÐY•·³%i¡ãÊ$]X­?$¤ˆ|H@ ¼'CŸÿað3\Øýñ‡!õ5âñ®Æ³Ö}¢ü[„ "Añ§ ÂD´ ˆJÞ{'Ù¨¾ÂvhsÔõ€9[Lìà.7 A4U”Éi› sª4þh˜kÇ:Žâ™®C@=l`ÌóE‘EóùÚR ~­l‘cG–K'6Ó‡Çc&FÏ/N¯~=;¿•îøY¯9¾Ý¤þÜ ãÅvTަ8µ/й´ï’¡µ/*y°xf´÷I(?üööÍé3Ûß`­YG¹£º™»°¶_Ûå }º¶zÞJ"ëS™ëÊ=-£ºÐ^ýQ n&þ·È;NÁA¶Qãû—Ý{ûI¾¶¯]§¨½½ËæKGÜÕf×O´8ÐÖ2ý…Ö¿?û¢ endstream endobj 2240 0 obj << /Length 1782 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯ÐÀ9CÃð›âú´M?Ö®]›=¥E È’-Ì–=In‘¿KQ´%YNä¨öúP $мºä=¼ç4ö¦ö^Œ~¿]\*íi¤%•ÞUì ‰¤fžÒpUÄ»šx×ã³$Ÿ%gçTàñoï_Ù›QeQFöñm®ƒùÙç«×—>ö|0(™1ÈE>Wð¹ÒÁ(|a/”kÓhôüjôïˆ@-ì‘­Д /\Œ®?coï^{qí{_Ëš OŒ(“p?÷>ŽþázÇ|RóÃÙin}ÉË~Ý„ñôfÅÁz^ܬó(û„1GÖ½OX`ø'¥iaì›Ë‹–Ç )Ì=Å$XWÆcS.ˆD”p"ík/‹¼¸æbÓZwéî¨[¾û€5LLí¡ö«áiÚwÃÛç u[0 TgKƒÙÔ³7ª¸Büʸòz\©FTIØp™æ… Ù^KÞõ¹Äx΂¬QÓ˜ç ©­½_ª;6¸8>m«îÁTœ¢Ÿ¹>¾o¶Ïúfæ5B<PõrP æ×Ý›édÇãyÚââ¨õˆ·®û“æÈ÷™õüETØLc§g,ªÌ³Œí†ûŒà±r[`ÆÝÞL«é: Šd™Öí<±ÅÝ* ƒùüÎ>þôòÝÛç6–ZǨ1d—×1ˆ½sJÀeÙdÈAõ~1è.þÚ²ÙQd¼›€çÉmd•ŸÕ—l'³((ªûÛ»Ò6q€ 5Ô›÷J“4)šn‹‰vµªywÎ2CpN|$h¡Q±ÎÒ¼«ß¡ï·µx@4 *På@=ù¹&|)v¦jœQ@Òâf@î—lcy¼Ü/±_2é±rËþ°Ü?ÜÙþ¹_Š«¢š¤=2?Áã& ø]IZËG%iÆ9b„~Ë$ý¤'…V5õÑ`Ò²? &Ãí&b\& Pû©5B;º·!ü+4G'a_¡@g8ö}¶É¹Ãäû(i'éôÁDýƒO›=î$Ô )­NÍP¿§}W³­›Š¥½B7'÷ÄËdÆûµUHNN¢òûãðñå+ø»y÷G;›—I|FŸR‹ù: £<×ó‡õÂîrq•šyŒJà íóã©.)¢T-ý·ìKÿÃí¯¸H6D%ذ· E ÒP‰ zrˆú ‚¨”ÇCHÓþ@„ vöÀGBTÓýò՛筕7¸Ô›óUc[ ž á|Î!*u Öç #Rñîû*˵Y²“'ò"(Öyµœ^,ó­¥ãeæè·f•µžN7 aµÎVË<ÊÈrÀb¨­¹J>V ¸Àäa–¬ ¨å*J£I+z_³¤€¸=  LŠŸJ 4)ÿ1<^n*&'I…eÿ ß Ù`$„$ÇãwF’˜-{·ìËÞÃíÏï @ç»5ÖΊ ÂâëžÙÛÇ`pß®®ŒƒË]ç–§ß˾n_EÀ0G’³ãaªi ¦;{€"`X!ÍÈÿ¼eвƒô×…8…~ >C¼oîÙ³Šj`½5¯¨?(fÍ…h¾ŠÂĤ^àž2•Ìj!!&—È ½»1i¹A9ÂÄÕIÒÖçÍä;GÅlfö™q4aØNü'ÍpøípðGÈ“Û ï8â©‹‡S–Vb%Ù9+¸7žMíÂ(Ìø“i0ì&LÎj2˜2Ó-s&f³âËã(µ•²hHÝÛŠÛmÐÞŒ°=Õ¬]b§‚)°cdî6ó.´UâÌ»Ib ·ƒZÖr[œ•]3ÂÑ<í‡a9ÂܤBIFt›ºƒ¼&Ûîk;ñµlÚu*D@¨Æªûdȸ1‹B£ÿ¹ùãã™Û\q¸2$¨ÄgÇS†€G„)?‹·ìcñáÎöW†Dâr§å{ùm@ª„S ¥ÃÏ›õ€ HGì‘*3‹þÝã÷Ar„`&O!GäiM*÷Ÿ™wŠ hK›-³|£ëlj4è7©ÖŸÎÎu±^´š,ÓꦕÏ˖΂Û@É6û"IÚ¥€ÌjŠl·þ[Ñh€ê†O`t¦8ÉÛ”2;ö( R0Ù&Àa®÷Û‘z¸\¬wÔô5)fÕ¾’ÛŒøóï7oî%s…Ö‡Iø‡«f0¿~ƒ{Õê ¼ÜtîKLÁµj©¦žš'mûUVHbû~ó ˜õ“¤Ø-áïÓea Q óêñ«ø5w¯*·&}#y^nÿ˜Ï/¿îm¼NíéÒÖ+sš1ÚÍîn²L6ó!pšm™:¾Þ?S#wÇVVm4‘Ýõ3B‰óÇüŠð?ÔŠk endstream endobj 2264 0 obj << /Length 1740 /Filter /FlateDecode >> stream xÚíZÝ›F÷_ò„«xo¿?Ú§Vê¥×ªJ›\Ÿ’èÄÙØF±± ¸‘û×w–`ûlàHûP)ÖË2Ììoæ·;³`oáaïÍè‡ûÑÍ­2žAFRéÝÏ=!‘4ÌS®Šx÷3ïƒÿ~¥Ëh<¡ûßÿvçïÂy˜„ñ4t? â]°ºÿùæVcOƒ@ɬ@®(Ò\ÁërYSx@iÿÆ](7ö¡Ñ÷£?GFa<)2áM×£Ÿ°7ƒ{?{q£½/ùȵ'F”Ih¯¼÷£ßG¸j˜&=J™‚ Ã.in×ÃtL°¿ §cŠýÏéníûˆ†?’k‡‘V²½¼ièÊÂÜS äÛ@WÛ/ˆD”p"£—„Þ¼¢\]ÚéÞãP‘_‹8ÁÄŽî+¿˜˜ºürb¯yCU–D†šP6˜,<×xW Èåˆò*¢º uFqæ;+Çû0Äø€> Ÿ£^}Ì¢Y/(î *£ö$ã1B½ AB§Õ7çDÄ´W¸ âÙ*l¨â¿¾Ö GŠ‹á\¤.¿§‹ôVö a’!Æ%¼L#ÌX•Î>‡ûúD ƒpa'àŽ„µ@ ÃUËáP«Ëï‰ZoeÛ †Š·ˆl²Å. £HÚU‡ªÁðhÈï‡Ge[à!aS@ˆ8àÁèÕ˜ä ›í·ÝAÑi©‡¥.¿'(½•mŠˆé@™nâôZH–AòrüÅ‘Up›á­Ëï‰loeÛ «8"F{ÕèïðÚh‹âUØp#ÈpxÔå÷Ä£·²mð€+·w‘v>TªÏÙè hX»Ùeãnÿ;`uù=ë­lÀET™³ä1…Àƒº1 v"ÊlÆøÝÕÀI„q¯”±q=›ÎKª ))¨ä.ÎÂ1þ"‰²=$»ZûÛd“…ÓÌþPþ,È×½K£x᚟m’œ?¶KÎ9¡FùÛMšF«BJ°ÊÂ$œ9)EgºÛnW‘뭋ɇå[54žpÊý»¹ëk ÒnkF©ƒs ´oÎ<3 “hL…ÿ—ý/È¢M\°KÃYþ^æß/ áoÿ¸·ØÁ\N©.¶:¶2°›[Aó0qõŽõ.Í\뱨€ÌÂ`µÚLƒ,·ÕÞØ»k¶,FLaØiÓi>\ÖÝß/iè¯ìõ§ LDXˤ[óãó„‡ié ÇSôâ¹B«ÚÚ©²Z›4„iŠªåáá²&9"ªØT¿ ³ó> stream xÚÕY[oT7~ß_áÇö!^Ûs±]EH\”‚J[D¨Ô6â!Me«\$úïûÍd É‹*EÚ9s¾ãÇ󒵆JÖXì·‡nÏ5…L¦¨9äÚM(¡6BQ×p ì $®ÑÀ‰g% 6M£ ½Ø«ª[À`­e{)7“`#‹½lréþVáU“*¤fc´2—Šñ[‡dex›%ŸÁ®ëJÈš\GÄu ©»6*»6jsl42»6ZUØè°Ñ t%ÁFW5 )»$qâ‘“ûlƒ²é'ñÓbñ/ðB0H0Y âT›ú[€{··™Vb“,À$D¸1I!U×Õ@”]× ©ëz 6“’$ØÀˆ»ë ։̫ÒÌ–”´¸6´º6jvlTul´ä:Øhb:‚Ö;ldH]ב–"áä".•ÀdiUˆfVuI·äß"k:[4°ð’<x X2|j_0’ á0‰!ù(È-áì:…ä+ÃEle 7H¾2ÈJ˰")ˆ’é°<¢Íl U¤×ÁF­Žƒ–]ÍãŒá¥{œ6º¥:ÖR·y`/hò8SƒäqV Z,w €Yó ¯ì³T ªd{ÓR½øBƒV_LP«¯ ¶)ul4_$ƒv_¸«]x¶½=›? {ÈÛÜÏÃü×ß~Ç £v›”ÄŽt?>óæåìÞ½ƒUb‚[C`ª=RSÄÒb5boŒ±¬i7fŽÌu\#¶Ù ˜4R 2Á¸6ÁåñYØÞój…è⣫i’‘´’‘w2a26SC6®P¶]'T íÝCFáj+o`sþìdy°»8 {aþìÑN˜¿X¼= ïÜyñÏß ¼Ø½˜ÍµÅñÙ©•<¶ïgóç‹ÓåùÉÁâô¢ ºîÇÅáÑþƒåÛ°gK—X@slý%ìíŸ`+}«1î/1èÞ[˜[ÎBK“]¸æ˜;›ïžÿqæÏOŽÿšÍ,O'n>½œ?ž?™?ÜËþ``®0P‘h5W8*6¼*Rްû¾»aþýòÅ2` ¿9ýó[GÇGgßZàîÔ¶ôE®OްæÈ‰6èH!lyD¢¥((úÕh¬™ò&i1Þr®QŒ¤k‹51CÏý6~ø¶kt¹í¶26'H¸aH«Ó77éUôj“Vä­µc`lÿý ¸ÇŠff Œé·<:2bgT=M`†Á öKÃgœ  Ì‡äEœ á7Ë(6ÇœË(˜cJƒ‘#Æ ÚG$=‚SÌEGÁäÛkŒ>8Z³{guÉ<ƒtõ©…†êAY·ú™em½Ó‘uõ+¡NB›„~§Lµ*ÌFMŠ0ft† Í3šñ˜. B¨ÆÞxóA¢è%Aà ¹æ¯@™è&ýw¢L”…NmóŽôê–w~äl-ñ­)Ó±W(3G;Çý'e¾‡þe®[)'÷ØÊ(Ø(Su ,Öç”Á â4ˆó‚q>"sM±bqJk,£à+ ºÌRÑ™ ŽL©áüG£`ŠÔÛ(Ýx«càÜàsãQp‰µ÷Q°D½~ÀýÂÇ´Oæ=N7yïbÌÏâ=Ê+r£2 4 < 7ÒÄT¿−è v4°ô5˜Íb¿RøE 6ï ¦ÕîÌ2*ÚÅŒº”º‚¢ñÜÖSáîã'øÛúù‡ïÞ¶{÷Aa´®d÷ « 0]%ËW eœ>Ôîb'ZVÐc/›siªvIœ:ü°»Ê„ýæ7½ðïƒ9xõzëpñjÿüÍÙÖùéâäðè#.Oþ¹;燅¡ÃÇÉ+°q¥Ý†£>Ëúfî§_ž>½‘3^3©ßâŒýú£ Ã:0NbA_Û]¬ká¸îîn=§á‘’Á¹Ä<ê2[ó+mŒÅme¬ÖN‚ъȺۉu`¢et‚TÐê(Ý!æeËø1l®%v©ƒ`µ~¨ŒŽŒþúz”ÿWÀEo^ýì+`û7ÉEó w{á Š,«nÜþ¥‡„µ^QEyó”Í(LvË=Q¶]ç®·¤lO+¥Ûœ×ôWœkÁ(¿I‡Ág ê½ ‚só&p œàså1°vùê Ù¿U÷-Y endstream endobj 2287 0 obj << /Length 1156 /Filter /FlateDecode >> stream xÚí™Koã6€ïþ<ÚÀšá›â  hß² CµèXH,»’Œ ýõŠ”#ÉNÖµbo9Ôƒg†ß -‚îAWƒ_'ƒ‹KmÁF1…&s$V†#m ÕMt;¼Y¤Å"™$Ã_þüÝ_\Û¹Ím6³þö8Ûģ—ATÜ šáHh˜®’E ‡:^ø† ã ~› þPèE}V†r‰fËÁíw‚x÷,L„«žK$)ÁŒ+¸~@7ƒ¿¤¹°ˆ6ô¨eJŠðºÕº¦³%Ã…Þ›å´Ø¬×«ô#ÃÒ&Óµ×ô‘~´R—`#ÝT®¹ê(ϱ&i.±•ò 3*Ã&2(·hÞж-mÿÓÝ ˜À2Rõ^0u½ûÊ–j˯-}È MY fÞ@ÙJ`~‡üÅup1¸²r±hº˜iéàã4+½Ã^”ƒnÇ”0B¶á¡ÐM0@ èï"¼Ø•é&ælzÀä D•Okۙɧ_ 6F±4ºO°uÚ—É@Ayë^¦Yâ÷ÿjSú‹Ç…-6÷7µ-ý]ZøvkXÜZóÅ%%Mw½±!ÜÏUÛöuS-,"T—ω­D˜:B϶jNø§  H» ñàz¹÷]mÁÞϲǜa.SxÆ‚y®m¹É³bÖ*õÁZ›º§—èõ#Áªó“Ãùkßdm“wÐ8 ©` 6N›éœ9ýÛ!òa™þ;‚-3´GqQ$`§ã¢4+ÆOÆÅŽü~\ì¯ìá\”Qz4C(@¸èòj¬£C˜xJ¨çà¡Ôkue++ž8[UWóUÅÊ”#)‡?“€P¼åOë2]e?d ýŸü“çàßë6~euqÀbb¿Â2RXZ÷\YEgIœ'ÅqМ­²¹æj“%àm*‡ýÈ)´ÆŠšÓ‘S”Ôé ʶø~Üì­êáØ bQD=±é‚ÁÂ>vŠwÄN¡8xìì‚a-;è|°Ù]¹Ue]Öl­÷AÒ7%©#!Õy4ªA *Ó7_µ|/\¸æÈÕÒß'qW4«z{Áã–mœ¼`&<‡ÝȇahšµfÖÏã¼hÏO§ð´tóŽiP< ·yÁ`ÉŽâZ8ûË`Q7Øâ;üi§D~9¸iöæCô+¹ ±óxóPnÿc¨ð˜$À¹‚–ž. pØ'Z°“eŽü~i ¿²‡çÎ ®ùqt¨ã`DÀÕûúc3Gè³ÒœÀæá¬“ ¶ÅXÎBõöuã¢XÍÒx»}Ó:‡|¤ˆ·(¶»öm[ig‹8K‹e'=o½÷ó«ñ{ë*ð'¨.Žâ.#k~Ââ›{t2ì¶Å÷£noU‡.U;´Êõ?_$v¸{o+ÏwhkÔû)»©ÖÐs–ºO2ÊtH{?ªN¦n“ìâ÷›ÒtßgÇþ›¢fáxº]¾qpL3Dóî?“·“È endstream endobj 2307 0 obj << /Length 1726 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯úä 3Ã;Åíi –®Ý†nI¤E Èr,Ô–<ÉB‘ýúФ-ÉN*[uЇ DËÔá¹~üe<8x3z}3:¿T:ÐHK*ƒ›Y $’šJÃU‘àfÜŽ¯çi9OÏ&Tàñ/½µƒ«d–I'öãŸQVE‹³7ïÎ/C„ P2#+ŠB®`¹ZÁPáøÜ^(׿¡Ñ¯7£Gfá€l•€G™âåèö#¦ðÝ»#®Ãàs=s‚eÆ‹àzô÷7 IC/S¤¹Õ¥¬íº‹ÓÕ<)î²h™X>`áŸÔŠa¤…j.o:j2¤0SˆêZMs_‰(áE:ÔA‘³†^miûïî.@%b`¤[À &föPùÎ'mùÞ§}VhÊ’HSý”­\¹`BÐê`òf0©F’ºhÆyV®mÈž”ÜN$Æãx­™Ðˆ@LR[y?¸;2xˆ8›¶S÷$RKúí„àÖ5‰õ”ÔÛqšõTý¸ê.`D“Ÿû&,eˆAIHØÎõiÁ²BZ7]%ÑԢżZFÙâÑ~(àvt¿p@R®‹4{°ãY^Øõì™cÔ2üüð¤‘8˜PŒ¤`vAï(€‚¦n”#Ì¥G¤Ÿ:[f„PÙ¡Ÿ hW<®ÖižY­ŒøÖ‰Sßbå]b¾ëêªUCò„Q‡” !õ„÷к*²rÎL "ToµŸi%ZÝÂÁ(ŸÙë3%èMÁãWÓ¤d“ø>ž”óˆL>M_¹)Qi¯ÓäÆ4K\pS/l¾ i”M£bZ"gX—'œ!.$N#&Õ¾‚ZAµ>> ž%d;åéàYŠU'ƒçŽüað<\Ùþð,‰¤t©Ý ݦ€o;Ñ/÷à)ý"žÚ˜À=h¿A 6÷W Zbؘ~ ˆš E\á½IÖ-ĵ¸Q-ïýøÞ¶‰Ê§-f÷ƒfÚuÑ.ÐQÁç¯nÏ£6 •ô%Q{Ÿ.FyQ$å*Ϧ›H¬sÍ;9v @í|¹H²£`Wà…*<ìr­&úd°Û‘? v‡+Ûv&ˆbǹÊô¿ä® †|x·ñú†¸,×Í/€“\)$°îà$¸ça=ouœãFÑ:úNf¿6,Êpëx©­ãáÞÆñ0®ÊšÂ·ÖñpËR´l‡ÞvÅ,§…)MN S?Ó‹ØpZ÷œ_Ô…­9“ÅâtJ'EÑœh¶!÷|••Õjb> stream xÚíZm›Fþ~¿åŽê½}ÚO­ÚK“ªj›œÚit"ŸQ8pßÅýõ}Áü†!NªªÒX`wvfŸÙÙ™cçÞÁ΋«ïn¯®o¼À P ©tnçŽHÌñ¸zĹ9oÝ7‹¤\$“)Øýö×—¦ñ:žÇEœE±¹ý9ÌVa:ywûêúÆÇŽ%S¹G‘Ï=˜NË"XÀÏw¯Í…ò@ ºúáöê¯+½°C¶JÀP&œèáêí;ìÌàÝ+#øÎ“îùà‚eÚ©óæê·+Ü4Ì' =j™‚ €]Jm×]TL¦»ëe•þÄÃ?ÑŠa%T]^tÔdÈÃÜñ˜DK¥¦z.ˆD”p‡¢Àœ"væ ½ÚÒö?Ý€ „a íF0Q½ÇÊ·kÒ–_¯iŸš²$ hð ”Õ‹{Ç4^[04 &o‚I}ÄÀA^ hj 5tV"€Žñ)AB¦÷sÛ£;—Ã(¢¾ÓèY–ûvJ˜±v˜Cò6Û§5Öyà$½Tí[-Âl–ÆUܯúº+áûþ弩-¤7V¶‡71Éã&óódË>ÄëöB‹ˆ˜ƒ€Ûvj˜! r1ÔÚòG¢6ZÙsPÃqâ™N²ªµÂû6äT–(Vex?xI8›ÈåBr[ü84F«z2ˆ £w=‰«õr8>3—\޶ü‘xŒVö@| “?Qž•=áˆañé_ò8Y–ZÐË!Û–?ÙÑÊžƒ¬Ç¨3Ùäï¸ïFKÓ8ë¡ÒÝoúB"=DA—ùnçz° ‘ÜL¥|™%U¦`êdʘtCs±‰™içYOˆp?Vh2Òwoá7ïÊ*/ôHQü0´_w_O¤—œ2á7ŸêB?ö\(uÔDIž™Á:\=²™i$µ‚á¶Û£G0wݧ¥ü³†ÆÏìLyÕÂÎ…iëíË5%PÁ›ôFa¦j¢úÚÖªŒëGÊtÕjLb_åæºŒ‹y^<˜›¦…êþ1 µGÚ“HÓT“Oˆk“ã;+¡]?m“e5F§³xÐlgLõ”T‹|Uí[¶rµ\¦ë$»7Å+,¯iÀ€Ò´³¸ “´´î'à5INÅÀ;n¶Ó|•EÊ„º[ZæVPhÜȾˆÂÂŽÈçæº,ò¥‘ZmÔ¨j±/7×÷qõk\µŒ4-ÑÆAem¬ùCcO+A5B°/‰¬ªYn®ižÝÇ…}Ç3;ξվÓÔppOŠ©›TæM ‹›Úñ³”Ëa>;ªˆË|UDÊ|­MYæQomw…ŒiÕÂÞ¯ít G­ÇAO037=!J³~à¢Öƒë‚›¡Ö‘r$h·¬º¾ñ›ÁˆqäcQ3_wD¶â–(¶¸Y9ô¬pã&w1k6³h¯l±1[E™aæN9¤åXâuTµ5IÇdÕÃcç›Ü ©Æ§í†°ûÕÜ(üO¨J=äwUÝäì}¹€dcD‰õn½'ô"/ã(™oCÃÓ"¬êÝ™XÜvŒ|Jêbͼ¶Ñí„‘p ú²ÆÃ†¦MܱBzY £d¹¨{Õ¸AD8a¤hÇ©L¾×õ)(å6Ä‚åÊjE¸Þúiu]õ¬qìw3ŠX@»ÊÛiA†„±4ƒÿH‹„ØÙèט]AⓎ_½Ž«UÕžð&’­¯]›žF¢5Ã\²xB…û”®÷¸:SÓíf¦ftj²µ*Tq!ÁU+¢kï¢ UGšÉxÎ&n¹:D¹qË5aôRÅKGþ¸âe¼²ý‰[ŽTmy2;]¹ªtÙsðﲘö$d÷2º jóÀ#êܨú8¦®â|Þÿ,uóÍTZíïɛښäÍd+Ûä­¦6ùê±Ý3ù²k·›†Ð!¡é€Bíô«ÐñëÌìËH>šuC¤2ât(SC}7(š1(p|\.š1Œ!]¹ÉÖ‘?.šW¶4c˜#Âý3h¥Úá̦ŒÝ€àS<ëKÛQv&¾mב?ÎWÆ+{mG(Âü/NÈfƒ‘õÀ&~¹œ¦#$²£•=YŸ‚ªÙl!ÛéQürp´å„c´²çÀáÁy[Sd»»‡‚JzïØ/‡ÏîPз]-©8.á!LÅåàjË ×heÏKbÄÈáíã@Q+E²SÑn‹×ÈOTp„™ü©9ej*¯NÍkÖLwV¡â`%sW¥¡oài’)¿& àÊbttWÞ!«dÍÀË=,¼Ü² :óÔÏæEþ`ZíÏ+ŒSË„Ã+MY+uJs]-g¶dÐ:–ÉÌv¬êÑ„¸Švv!a"FÃê¶2Ú…óJsQÒ~Èh²ø²þø‘¦mBœüOˆBBü?T“%šuuÖb÷Ñ„ém÷)²Omë6çÚ<¦I¯CòmR‰/F]µ¦EYòÖ9ÛÅÁGr‹ ÂŽk~œ»´VlnÁÌSø˜C´kÑ~€Ô'¦@Œ³êQéIø¾þд5nÈãæî®– +ž+Ãí*”«‚r9_¥mãöý™Ãqù_#ÿ?>je endstream endobj 2366 0 obj << /Length 2560 /Filter /FlateDecode >> stream xÚÕ[msÛ6þî_Áé'ê&F ˆÞ§^£ôÒkÖv{s“v<´IœP¤Ê—:ί¿Å›LÒr,‰Qî:“ !¼,ûì‚»Ë5–¾;ûÇõÙË×BɘÆÁõ"à1Še OA‚ëyð.¼Zeõ*›œSŽÃo~zc—j¡*UÌ”ýùcZ´i>ùýúû—¯$@0Ž4A&(J˜€í -‚cX ’ð¥}P&õ¢³éõÙgfá€<0K#ÌÖgï~ÇÁƾ0b2 îÌÌuÀ F4Š¡Wg?ŸáîÁÒáÃÓäIfy©Í¹nfÕäœàð~Ó”7p í/Ëào˜cøO —I®wÐïý‘º2šÙ=t%Š#£$‚$ fá$\õêƒ ÌViÕGƒKDà= Ú¬8YÌ\+'¶G~$®cY=V,£‰»Þ³êfO\³"WGƒC^6§Bc@ã™=ܶ½ÈÙ¼–ó¤é‡8ìÌ-ÛæhÀŠ(NXŸþHÀF3{` Gœ¥Y4ëÜh[«¡ŸZª˜†YcGêUÙæný\k%ìçVUª.Ûj¦jÇM]—³ÌJDÿ¾Ëš•myb·÷n; £ñÕºI¼z“®ÿ(‡Þã,/kÕ4õ:^¾&¸k FJKâž×ALW9 è?¸Ó.–úz@°§Ç ¢r;Ó9¥&Rë£ÍµDì³RM[FS¸‘“×㽃wdˆ¯…:gŒñ¨ë Ï ·“ˆ?wVlZʪJïmÓB®[Ú–mËKÇùÿÏ1N :fŽqæ÷r·Û€wK8á{ó.ýL}ýZžÊ…}žê4p©'„õapo×! ‚húࣱOs^¨ åá]î¼Ï{§ð?õ1ŸÃǾ:‡'Ú PÄP"ù¸Sý©ùO«,½ÍÕðpüôqK+æ,IŠ[ç |:9@ðÒ˜s½ëÀ‘cn‘ŧ¾7oÿ5 ¡/ôÁêv·r½hí‹d¯Ñgbúrûñ cÓdkuTz† †¦§KÏ0p¤;k9 ?εÏìþé{Šˆž1TŠ0¶gZfàÅ2†"BscWà¹åêØÐƒq /ùÓEîú#õc4³„Œs$í¦œoÒº ûðE9?ðR~:LúôGb2šÙC0CIHô?N“-2Îý±àF(ŧ·O$¸£™=Ü(B‰÷^õõú9ƒýfLœÏt` Ä—ˆó–È…\ÓM•Μãå< h¹ [ûºº@Äù.MÕÎÀRu¯Ž.(>&Fè|™sÄ{!ÝÀ³Ü3¦Ó‰##:íˆâ#ê¯æa\ÄfGÄt{Ý>ð©TêÎüÆT_[,Ÿ †(ÇàÛ èqh'àõx0lEºD=.}LpÔá,ÃÛÍ„*†B%~NWÏœš€ÅESô޽+„PQ~àM ŸI)u0z0±Þéýp­šO=p+XôÁº§h²=ÁÍ-\úiɸ¼”›ªJn.ÞÞL˜þ8½¸î/Ú¦µT®Öªpɧyésd®Ã¦j²ºÙMú× ‰xøÍ¿LM2N ƒs—ªãÎÙv:fó}Cq¯ü]Q”]£Ê[õ©¨»»O//' ‡o/ý”•ªî²Zí ä@'%öïrs5òs;åöu²xŽ2[Næ<ô¨sÆ2º$G˜J’ÉiÌw|a'ý«ÅrîÁN÷Ýo@¤~Œfö×’Fa*{±Ü{uÿùB‚GÄ@ î#‘œ.C3 ?µÑÌ‚Mصõ‰¶N—Ç(„ž.!2 ?ŽÑ̈ò—­Qo%ñéÒ*ú#‘Íì!Èbp]9ýÂe*D㈠ýqxŒgö<ˆäæûÉse*bÿ*1ºH…$0ÈNç{è„k4³‡À•0`•ÿ¿V©!`0ùÙ+µ+î^¯¬c­Ã¹$ñƒÖ5ËLÌ7·CÝZóiñœQê HÆ@:kÚ47_+a¸­-a+LôVªÊtÐhKVæ~š­yÍ“”ç`öÂ7 Û7˜”ØI¶™MHè6Å:<•†­»h?p¥ãYWX£iÔ~o5G½Ò§QVœ‡o¹Ö8¼P¶öÛ¥ÍbðpÝÖmݺé…'s·ìÞ4ž ®(õÜÈ<¢±ß*†µ‹ !aÚæí0U<0Ñp OÍ­ ÈOåÈõªwZ³ÜÆü ‹²µ [_c¸)í”4oüY²¦Ïžî*DvÈDz†kºŒÇ&'LÎÆ¥v²f+‘&þK°y:ñ–Al¸é9õ¾(ÍÚH‚áwš/Ë*kVkc„"|ÝV:—³.+“þ‘¥–}½ymŸV„ÐX¶i•PïæxËËò½ç×mWl TÚ{)Íí;- [êà6ý\•írµKÛ¤˜»c@…×—F#ÖØkÛ_.Uئ;󥉷Lèú¨ªÒvÝÞ7æF" ¬Á•…k•z‚Nù Óª.t­MA ô¬R}QØkÐÍvT¿ZTéZ}e§ù B…µÏ÷ô°[ÖufÛ[B¦ÎPU»D²ÍîžË¬0rÕÆ©Š¥/Dñe}º†Fy=Ъ ¢ÿ¶\oÒJ=úÐñjêr|w«l¶z¨ K³¢Þ–q¬|Þz[ÙÏÜîúãïCÌŽùÛžÿ^Gè¤ endstream endobj 2284 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1574 /Filter /FlateDecode >> stream xÚÕYMo7 ½ï¯Ð±=X#Š%F€|ÀMÐ âÚ9¤Î¢5춤ÿ¾ÜÝØI&1]16—û†¤(ê‘çÜrH!çÆ¡Tý[°Ï5›BuÓ4ü2M¹™f&Õà{Õt %Õ„ s¦Ý¡É¡ÓH*ôÐàÂ=ëWðÜEÁƒÂ Óä0ªi8PJ ¦Gd±Â.¥®¦‚$V[£Aj¦ër6Ý€¤.9%¬Š²J¤ëk*å@%™>Ji>,—a:X–L*Áo+ö,w, ,¬–- ] À‰LIL0%Óá#ղȖ9¦Y ×6逄$3›N?jÎYsT²úÕ€Š˜>*™¿j5“Äð¡û%Åtð!Ãb†®±™‡®w][n“î)ç`½ª„ݵ]eÆöV}Œ™°ÑEóÂ9 (‚æÀ#×M¸e³^˜/ÙrÊ’E€Í/Ù"(¨¶`ª°e² NJ6¬”fºŠ"¢E ‰éZ(’ RM2tgPr¥Y|>Z7|t6|ôf:øÙtð1{ÎUBMºyŒºÇr‘F1"][¡nbFJj±˜…B³¢ÅÝDŸ•jŠÃVÔa»**õ(BlŒêlIͶ–‚P6]†duŠå£èLW UÓÕ Z„p‚Ø*‹´)),‹ýýÅô(á¼1Îõ³0ýöûˆ2êÞK¯‘°®ÕÛׯ_,îÝû2¸•ˆŠv‚…cFv\`¶˜Äqˆ¼–SL`+ŠÜn-*k9-§¨'ѻĪñkÄ^°PL`ŠÀëÕyØßÓASîÚYý³˜¬O_-OÍGz1=žžLÈ>hXÇXšhdÍѦ-©± 5“¶­ Ø}Kía˜~\?_ìÌwgŸàgïdurþ½fçÒžéLx‰T/žT>@_E*³`°þuZFëéN°äe/˜céÕ Õbtq1¾Æš¼`ЕV‘ÓrŽ$Θ¹·ÈÅ‹eþìKLÉ Æh¦p–F–Ö,^Ë›·Žp@sòZ.ÚBœiƘ}]vSÖnÆu<Ãu|=®ãÚ>Ẽ Ëî^[alN;vBÞ ¼n—*1Žâª…kE¶».>³¥hË•/1åñé¿oÎ×{Ë• —9óf¥¿tPå7—; ¨âúRqQümØ©:R´— 1av„tüz}¶¼½€vÝ­¢e}ɰín¸‡‚¤ø:íí†$e˜Žš©±ëMZtDŠ ÏÔ«3sû›¤!œ¹Ý&et–;Ø£mj¨a4ìRCh: ‰¯™ÜQ§ GL ¸w’v§! ÂU`6ÃÇOð³÷ëO?<¼ÿôð“qˆ¯sÇú}å84f‰e¶çÍ‚1- /8÷¨|Ù9dŒ Y¡æ zG™»êÍ‚{‰e8ó\0Âé{# œ$g 'pg Ëœc¦î×Hɹ>\1"§eÐk¤î\ ¾XÊÎÌéP¦¯à¿‰»žÈ§ó”Ï?u7íÈnÚ‘Ý´#ù6g›÷;c¦éý¢s£Â»ë ’´s_4L!tîTï¢+Tø ‹¶P³6¬k¶…Û™gÜ6ô¥úvžaU—zíëºÔë\×/£¯ìOs`Ì«…Äk9E}]â£lõ?!>0¡™Í½×›'Äœ»,ÍLœ©+ 1'ñ‚Kì^¨¾qbuüdçöÌ®í2!ÿã—ª endstream endobj 2395 0 obj << /Length 1850 /Filter /FlateDecode >> stream xÚíZÛŽã6}÷Wy²Ó^%q÷)É\v²È$ÛÝ»Àb4Ø6m #K^IÎÄùúo¶d«§m+$@7DQdñT*^ŠÆÑ"ÂÑÛÑW÷£—oI$cG÷óHÄ(–,J$<ÝÏ¢ã»eV/³É xüå÷ï\áVÏu¥‹©v¯ßªb£òÉ÷ß¼|“â(13yBQÊÎÊ"8I:~é”KÓiôú~ôÿV8"{Е‰hº}øG3øöM„—iôɶ\E‚`DY å<ºý{„½b¸­ ÁÜâm A’;PKUÌríÁ·­Á8J±Øÿn‘цK•2´¬[óÂmYÕþ™çåT5zæ^·V²S¿ZD®pûv}°ß¸‡¬Èš°ÀðO:P`Dt€­«ó gÈÔÜL…ùQo{T†ìT"A. ›ì(åÜÛ÷JÚ°¥ä J©‡‡Å„û<òBO¨Ê·½3‚×b÷ j>ÇO šÈ®cˆ~‚̼&Å0­~2øU•©Ç0»í•;&òóê[+GSšLZ°ìŒ&¼Õͦ*ê>…""=Yá]˖ħ§ç»¾ƒ¿‡ïþu0);žŽêÍtªëz¾É‘IZK¥Ñ‰‹¼“ 4i¯$Æ&70ù€S<èf»Önùì.8…ÁÍãíÁŠÊPþ"bVKÍŠjꉅ0 H‚µ*ÍÛKhGZíñð¤L†œ`bZ•ïVíùaù?e„¶,+ÃÁÀÁ#ì~Cöl7<MvkOÇUŽå€óL1nó¿§þÀÍd 'øÇ®ӑqŽ1+-Øßž’ K£}»ý†©½yqªrŠhz=éˆè"C¡žà!,†¥žÇ0–Ùʤí=÷ƒß£í­,$"‰´œÅòDÒBÃ#agPS£äzœuå$m0ØsXƒµ4ÆòŒÀ6ÑÚÞÐ^ÄňÅôz|tåäc0Øsø  Å»ýiÃèÉ”ôM­§óáØ„ÙõøèÊÈÇ`°çðA(hà3 Ó²¨O¤cºTÕo7õ¹#Ö%Ìr™"ÎùÕ˜=?ŒÙá`Ïa”0º?ºi»cãE|¤ ⩸]ùù ö >¸Ä(I˜´£ð1Änð<=€0„­¶þl|a‰Ûù^°®ü„ {a‰´Yˆ§(b ,eÎxû³›4sVüÇÉÄ1$Ø Ãb_6¶/ÝÌ,Äg-^¹³ŽÉ¬12<Œºä)Ô¬mÆ ºpI·²pï+Ý,Ë™k¼©]"ªmbÍ6@E;‹gó 7 óñýR¶jÚlTnSVr“ˆºÊÌ!ÿ'Ó'|ÜÔ2Þahžn·»yo#êíúÀœ7„€µýN¿€¯˜Ž‹rrCäA¢ÒTì1𬳙©7:˜§Ñ PP(ZC˜ºïþsï  -\"ÃßÔ­6°’»¯: ÑÊêØ~ì&œBè/¬Í;CÍôÜ V›Ü }÷ßc|^ÇZûNgc§ßþˆ|h£Ì'a¶å&ä¤Bþ)$UÞ„tpÖRˆÇèSX`ÏŸ}šÊlg€ó²n^ø,ö=znÖàÒz—Äq)¢§€e.‘iUId~v_6Ö$ØÖf©9¿zýõ­qçÿ}or¯ßw^M™à·É"ÛsVêÚõ,ÊÆUÚd§T•9_—ãm¦ó™kâP:·ú‚"߇O2¾+WR',¡§Q´vŸÔlæ kåÅZËCÅJy—uµK/ËŽÚÃ¥ g:•f“_º’ë…Gpîè3‘P²™Èv«NxWù¢¬²f¹8MÆo6´­Ve¥ ±²ÕÕÁ7ƒ×îéL…ÅFUªhf4-/˯®n`š9Jåîå“ k\?0øå²Ü,–}¦ptduã&›TŒ³Õ:×+ gQâB½võå¼Ñ…+zxÈÙB•WŽÑU骷™š81³£S•Ã,«‚@ï|Pé\ªV6Ó 5Ke& 7%úÖ^êóJ­ô®™!Ø* ó´ÿž5þ ðý@ë²®3—gÞ â`I3õ˜¤ ! |.²ÂÚÕ„¨.!C­æ»Hw7eá#þërµV•ñåÝ{D\ñÕëÛp5”M½8Ñ4*+ê]~w..æeµRNêç÷ $1ûS^EÆ]Eþ>®"ÃdÏã=N¯«Ú4[/C«@¬úÏ_ä%”^KþÑîSã¿îS×÷©âOvŸÿ1ïSwmû~MÄáàŠù%?&ú¬µ± endstream endobj 2412 0 obj << /Length 2305 /Filter /FlateDecode >> stream xÚí[m“Û¶þ~¿‚“OT'‡@€ÛOil§N§NzwíLÇÉÜð$JâX"’òUþõ]`ÁIé΢`:ÎÔ3¶âeñì>X¼®©·ð¨÷ÃÅ_o/®^E±“8ä¡w;÷dHÂ8ð¢~#æÝμ·þÍ2«–Ùä’Kê÷ókL\§ó´LóiŠŸÿHòm²šüzûãÕ+E=Ã@ 'JDБŨ‚‘ò¯ð‡‹X7ºxy{ñÛƒZÔc{Ð4Þt}ñöWêÍ ìG+ïÁÔ\{’QƒÒ+ïæâŸ´­˜b-LÉH,Keôº›¥Órrɨ¿ÛÔwÙ{Äõ •þ2Ž’XjÁúç‡Ô€DTxQ&c UçK΄ÇI¬b¯L½y [WÚñÜø$¼b™®ë*ÝZ¥-½±é)òÛ’BóبW.¢Àhð;{ÚùÌB·ôÙ®|GfÁa6ä$ Äž–»xšÀMòh|tå;òá vpŒ"i=íÀ}8@ê:Ï“Þ#@ت[lë³ p¿:a]ùŽ„9ƒB˜ D±ðIò xôy30vÄËô À_N&N)\nz¿O^΄p~RÂâc«É%g¡?KêSÛ*˘¬6é4û…RžÎ0#˳:KVÙ‡¤ÎŠóÞO˜ôÓi]”ø ÇQL¼›0ꧺt7 ¥O 7Vþí2=,ƆÓz›¬V»Æc§ Ä´Ì&\Úghë'%›Í½íÿõü¹JÝ©ñ=°)œìÁäÖpy1¹d1íJÐ{€ðµÎ×âô¯VÉ  h÷Ó¿n1q?áPc®›ÎÓóÖ[Xű4mº Ó¤Öú›ÛwÝœBh/­Á[]åë­Ä×ÿî‚[Uý-´ Ü¯RÛ¢áa”Ûn`¬¤wi½Û¤óØ1›ãÅÞ®Øb"O YÊjòØ""³.ô¦¨µáƒ´HÔñòûk=jþóó­¾Oyù¦ó©G«v1sÑfZΊ´Â–yQcVžNÓªJÊÌ )ÈØeéj†•ìp‡L4 Œ½U3Jù7ÅÚBJs£<wh©Õ®°(™Í0±I¬ØºÀŒubæ.­,Óë“iÓ U¬Ï¬¦°$îðw˜Ô“¦Šy¯V'|'«EQfõr  ù¯¶%Ô-×E™jšãVS„¯;¯ðM‰Å6)“¼FuoÛª(Þ5xmwyãJ¦ž7’~Àç"Ë]á V…ÑÒ Ø¢Ä¤uV°“Ê`úï‹õ&)­ˆïnÞ†É/¯1ñ°Ì¦Vœê$3¯jÛä¶¢\'(µ½Ô]½b´½ät. yÿnòê•j/H°ä)8Ù»ý?÷dvÖ.E`Ì45«Ö‹‚ް[³£þ¼Ç6Ö,㬵C6â§—µî½ý~%^ßKÓ¥¹Ám_ìõT†" †«Ü]¨¤döL[aä*`ÛÊ-Töõñ櫇WHØäœAÌ`í¢‘f6˜ïСÍxK,èÝPÒC%›‚f8ç‹h›)öˆÀ{Ÿ>0>ãà½6[‹;)Ëd··{ã#½½‘¤í½ÑóÔpÄ=jïIzøyL$;ÇupíÐóȼA중Ùb<«ì«ësrL'õ(üôœØeþÐi>æ*Œ„pÂëò‘ÿÞ|œ«Í1ìA³Ïƒ"ᮞG[OØ:>¬vGgi«Åã'¨ù1~ðÙág;²ÖÄÒM+ÜÒ—Yr߬8{å‰|^ÝCk…‡žG-Xf•‰{ ^§õ¶„¥úˆÂ’0©NVø±fKâÓKæÍß^ß»ŸþÞü4#Ï/Û½ŸoWÄ‚l?«k©`»Mâ˜?÷°nÏç<¯ÃNŒ0ÆÆ{^犃±Ç{‰ëÉw»uq{ú#;lm‰îoìûƒf{°EêöÐÎ#f|x´Ò•ï8PœÁ¸žã‘ B±/ò¡‡ÚŒã½7õä;²æ vkð+9ÿÌ/í\Ä„Gã½õä;òá v’Èùø©ÏDÇ&ØÓ ̨ã=õä;â v!T~ÚÙèÄ©/r |à<"ï5©'ß‘Wg°Cx… k(ÂÏøÀaçÄñx|tå;òá vp( ›hÎ?`à§f£<±ñ޼ºBB+U$jÂ/?[ÔlzÍ^t,6zòÝèp;€G$jFû—õÀnCG#¬+ß‘0g°CS!iNU_^ÐS”Èà³D=08© >ˆzˆXs£ ©ÄælÌ«EÄ»ï©P°Nëe1ÃttÉnˆd\šC^'DBwfB$ “É lˆÔ뾊è†û hmC$t§>!]´ú)ñÈ c·µ˜,€ >Q “™}Ù¤æñSš‰£mŽ…H˜×Ѫ‘iB$kE Ì„HèÂ~ˆ„Îà Sj«wB$LíÛ> ‡Ý ­âmS²‘Ð_:D¢ C$ŽØÏL´ÞŸ ˜h®I¿†H| ‘ø"ñÿ"qì?( Xç¨8çÿ'þõ§ < endstream endobj 2442 0 obj << /Length 1980 /Filter /FlateDecode >> stream xÚíZmsÛ6þ®_Áé'ê&F ‰Þ§´qriS·µÝ›¹Ée<°IœP¤JRv•_ßÅ e’¢cIŒÚ»ÏØCÏâÙX`oîaïíè»ëÑË7‘ðaz×3‡(Ô‹<#â]O½þÕ")Éø,àØõË;[¸T3U¨l¢ìëO2[Ëtüñú‡—obìÅ 0¤Z ‹³†3²Ð!Šý—ö0¡;ίG¿´Ây])÷&Ëч؛·<Œ˜ˆ½{Óréq‚Q@C(§ÞÕè×vŠá¦‚3 ˆ55ä fA-d6M•ßœ ÊPŒyý[ƒ´Ý™¸BÔ-ËÆŒ9á¦,K÷LÓ|"+5µ¯·#Ùª_Ì=[¸|;ò>˜ïVÜM’%Õ1ÇðOZP`DÔÁÖÖùŒQ¤kÎHŒhZŸÔ¦Ge"‹èá*ì«1áþÆ*Uåö9U“b³ªìË}R-ž€D(Š‚¨ëRÎû(bñðŠ’¬2h窰ÐÊ•š$³M’ÍÔ…t +˜~[ÚQ²þà”„ÎOhÇ)ŠÃªÚ¬úT €Šà´ªM’Õ¢nU¶.ÕJP (è(‘ÜõCXÐc4X­BYró`ŽÕ¦†Fêá!FᮾŒ(·Kä—ÕÝ­pדDÔ€e–JÑaðRUë"+ûæˆðxo…·-_÷¯þõþn~þ±³Ú[ žiÅÝ,”ëÉD•ål"’4b0­ã!p)PÈY3F¹Ñ1>ƒe ¬â&¹[¯À$”ÍÚ±^€~¼í„kE`3< àÉB‡kºž“à 0c…òfÍø¬%­¿vwÀºCê¬`¢[•oCÂŽü:¶Üg„¦,ë/ÃÁÖVk«0Á¬è‰eõTcoWÿ–¹ìÊ"8À¸i-ö;ÖÅÐVƒû°+¯Þ"´:RÆ%z¥…MXpÿxLG4ö Bòf”ûb_SÄEap:KiËh)ƒÁîa)4„eŸ…0G˜‰æÆîÆm&š D"qq;Âög Û-z2Ö:ò‡±6ì¬1¡éü;mnšŽ¢#°sg§££- ƒÁBG 1 ,“<+÷dd²Å£žíéhQs¿u¯aŒâ˜ŸŽ×¶ü¼{¯QtЇ=ÃÍžÄn÷GñÁ#P5<mùù ö>BbBHëg;Σw&íEêQç„ l´Mîܶì(Ê F§£¬- eƒÁB¨œ?êBlC~dla8âiÔÆÉ'£­- mƒÁB°; ¿îŠv8¿Ç3ذöd̶ådv0ØC˜ bDitÄš– ñ4sò{::Zâ²1ê!dÑ(>É‚6d9Ã:ž=ÝÁJGþ@¾ƒ=„0"FÄi–³þÅLŸ¸ýsoâ0"Œ9rëK˜öe„i zËóÚéÜWÔGåPZ—6ÅE“rÐæ0êvrP×Èq˜w™¹ÆÍT›9³=£Œû× µûÙvœTk™¦›ÉvÐ¥*}`jœv¿zT²ÙD›ñCÿÝ̶îo´؃Ù<#&Û-ªø…>©%~–Ûg'•ب¿aêêDÓúh­4BÝD@ÝÏ¿]ÛÂí8ÀþÚ Û”ñ—ë²r_]ó©j{6Ϫ8Êeœ`(fu†ïþ=føa¼¼èT¿?¿°55Ü‹ßÞ¿Ñ‘nO§­rÑ"jåT³ÜÜ—R«ö@œ>ËÏÌÌÝ/Ta“•FXævo¹9Ŧ†6ÉNÀøúüûKmKÿùåZŸfž_´^µkß3'Þ¦ç4W¥íi¡@U¦ô1»,chP±IT:µœ@¥¡õ°Ètk»8ò¯ò¥ƒ¤2›-6üBOÿ-í'9ÚÂJ:±&ÿKéLÆÖ.œ,3jÏljÇÓ c¡OŒr[²½ p 6ðÉ]JJ&¥ÒlÕ ï2çER-–  "ÿͺ€¶Å2/”æY4ºZøzðÒ>íBa¾–…Ì*¥\ƒ[šçŸj¼n¸¬v Sÿ ÈÔ¾Üë™°É7°L«E¾ž/ú\ÏÒ‘”•uö˜ûÉr•ª¥Ê*p3ócTÚú|V©Ì¬N>A•SŽùŸU‘ÛªÛM¥ †´ª2©d-ÐTnòµ­Zš”Ô,fíZ;©ßÌ ¹Tߨfš`£$õK÷=©Üà»VyY&6a¶Ä`&õOAu8ÄàÅÉ<É̼Â,Gó:Õ&a.Šöí†<3? Øÿ>_®dáD¼ºº@Ä_Ÿ_Ö7 ’‰“»‰J&Y¹MTm3Þ³¼XJ+õKHlrÄÛMåóeçË:ãeç{.ÿƒ÷\îú¯X€ZTüåW,êç«éÆ¢Gß~&ÁÃBο°Ë䓳ðuõ_œ>ß_z¾¿tÊûKÑóý¥ÿ‡ûKÛ¶}×ÂY€fÇÜ ÿxîãÄ endstream endobj 2463 0 obj << /Length 2288 /Filter /FlateDecode >> stream xÚå[msã¶þî_ÁÉ'*s†àKû)½³ÓK¯Nj;é\2X‚$ÎI¤JRvu¿¾ .(“m‰¢•›Ngr‹gñì‹M™CÏþrwvqDND"ŸûÎÝÔ‘>ñ#Ï "ø ˜s7q>»·ó8ŸÇ£s.©ûÃ/±p£§:ÓÉXããßU²V‹Ñïw?]\…Ô A ï"à$ WÊbŒB‡ t/ð‡‹Èt:»¼;û÷ƒVÔaÏ  «'ñòìóïÔ™À»ŸJD:OeË¥#%Üó¡¼pnÏþqF늅¬†£’)‰bÉK½î'zœÎu7«â>~\¯&ªÐ÷ºØ¬4büJ ÿX ”’HšAÌÏ-Ø ¨pÏ'!ülS/™O8'Q9™v¦5œMiݵ»p S*«P03­‡Ê·sÔ”_Íñ!#Ôeù$âÑ€-f3 7–\ ±$WÔÉåaž‡ìÆI„½(Çù ¬sJë†Ðau!ÐE˜Æ$ì‹]©•Ã4:zBqçœéGñû—DHâ…N­á\%“E‰ûîPƒd‚„¡:{iÊh/ƒÁ`/žïOø0XHX êËÜý½iN´£‚5ò(âv„õ`z0!ÁéXkÊÈÚ`°}X£¬¨²‡›ûà²@Å:W³£½È‡Ý(^OÅGKþ0>†ƒíÁ‡Á—þ–ßÈI×{8!!'”ކøt …Ú‡PÈÆ8Mò¹ÏUöv _üx4­#lŽ×¦üÄÛ‡ÙB˜f ^ã¯úP7‹:9šŸñÓñÑ”?Á`ûða~-»ÞÃQé;Ö¿Ñw_øž›Æéº8š/AðÉøjÊÈ×`°}ø’œÎ^ôÇ ˆ/^ð€³!næa(z2ÚšòÒ6lÚ#ÂçßzC;žYŽáêɘmÊÈì`°}˜õ(‘Ô;bCK†xÃpõd|4åäc0Ø>|°ˆH!öîh[ç9`K«ÚÙÑ(F´'#¬) aƒÁö!Œ†D†ò4;Z÷~f¡>˜8N< É„¶~_LXËÐ#µgИÈËGç0IîD Kª¬‘îJgX¡“²aœ&ø¼ÔÅ<`yÇÉ ‹ùJãß(åz‚â$.bµˆ¿ªç¾#&]=.R+[%VЗƒ“®y»ùÒ%£sîÝ\ï¾ÆŽãb­‹MC[9±E?ÑY<âÒØ@ ´À43³h­¢(ÇæÍq¸pËlˆAã ÷ãôµFø®ªè;3¤p“Ÿ[}êáÕ AC K•ì¸8 ðîç_ïðåÈSw=5]§%Mðr¹†=ßêj˜¡t¬ŠRhò`Ç.*chý%NxMÅÿ Z'Ü4kÌšµ m£O—×xÁaÀ›ßë_?}z‡År,SÀtñ k£C’XÈ•QmËš©RI9mOssõb7Åë´0cx ¦Œ@õáòý1¤ýrgÒЗ×GcíÆGË ‹²ç$Õ9öD(P•è±Îs•ÅÆÊLÅ&Ö‹ 6Bw1•%§ÿs\T†ëÑÀ½M—RÝ{LO“ÌÉñ•šL°°RVl‘bÅRY{ÁÚ¹•UŽÚa¾Æë è02™¥KØ `_°hV?,¥ÓV«NxV‹YšÅÅ|  ¸Wë ÚfË4Ó†Ù¨Öá›ÁsüÅ)„Âl­2•ZÛ¶Eš~©ðÚáë%L³”¨><™™PåäÚÕ õlÞ5HGœåºÄCðÈåj¡—:)F ý,ÇútZè‹Vá>ÂXe•îW¥Xõ°)ÌJ ˜ñHT¼N«J 5>¨Ü¤k¬Zª ÖÌkfm[[©ßM3µÔßa3Cp©¤çæö}\Ø_€oZ¥y?,‚`áHÌRÐá¦[>gqRÎ+<Á¶5+µ5.s‘aÑÞïÀ<S†©Ÿ.W*³"~¸½& ‹.o°ð4ÇV< 'Ö©óuUØÒl©Pj}¯¼¸b´¾gtÎ ã¢}¥sqÖ74OÊê¾ôO-™½/„H#ªZæµ[Z+'ÀB®-˜æñ/&X°Zˆ]jˆ·!f§kÞ>‡¯ë{.> stream xÚÝYïoœ5 þ~E>‡åÇvTMÚ•M ˜Ö!Õ>ŒíS‹ÚN‚ÿžÇ¾»Ò¸ÝÖ!¤êÎñû¼¶c;¶s¥Ög*‰Ú(‰Å¾kš¾¦T›3ZªÃ9œˆœƒîM­²=5™FŒÄ…Ô”³q&'™B[ê®âÇ0ά©r ʪ ˜š*M§: X¿0@¹QxP¹É‚¸PfH³‹ ¤HwlÖê<e’¹HªKPÐÑׯ×§ñ*¤Ljö´'*2LÇHT×Oñ 5§xí+P&ÞõVŇë­xWüAÅ»¢Îƒ"-ÆRM/S5á'¶í÷æ<èèæc&| šñ£;:futL5Ki¤VÌH¸(n\ªZp:Îk©QsƒêΓÔ9álj¼ )\Ç"ø€7 CÝ ÑÍx Ì^LÇLxËÞå–°Û/#`´Q’ ÛÜÄ j8¯#CÈyHî΃qwŠ¥£ûOjbø:°AVqtè4}8:F3ðèÆSJR<úÒBd–ÊHB¾#$ˆÀ%Е"n 2XÖù¢Êõª‚r½p“ ׫2\¯BÊt½H™®¢´ó”Ú>zKZ«ó”8N@YÞsפ°Ü¨j8o$]çN«Ú‘%K~õTa¸SM9(èÊ‹½½Åò~:Ä¡î'iùý?&ѬHx„%$ôñëW¯ž-nßþG0)eÑ(XFÆÉ‰J.y"b`žyލä6sÁ‰ˆ 6G­¨=WЏhF]Šë”l•æ ðþÉñyÚÛKË}Ä»ÎõKûV{Ê–Fž¶ íuvCW¤í@ 6(Ü-Ê0.erà$Ø :—OO^¬ÎÓaZ>¾¿Ÿ–OW¿Ÿ§ sžþñÛ žÿ¼Z,ïÁ´Õñù™ùÚw³X>Y¼>}±:[—Uç}½zyôüîÉïéÐ,l’݃kóô=?…à×6,–wŽO ôpÝ-Ì,ï¢n râ-ÃüÝÅòàõOç¾~ttüëby÷äôåêÔÕ—gˡË{‡Õfñ ì•*¬šÖ›FîV$U²U®.¡©ÀÝñ ¤å—'OObøÙÙ/Gø»ut|tþ¹yîƒRem”’ µÍeZ1(¹ÞiÈÁƒ‡ø»õíW_Ü»óøàÃÙ²u úoÖW6NiÈ×.zóNAûÊÖ,¶N©knWtŠ?”‹ãw«*|‹3ÑQÚ®’q½9¬è Y:ÁÊY`pŒ]¡•ÄÀøêA0):‚àÆYKÔÔ²FM®dg*.5÷F10Ï’{oW- ÁB¹»Î^·dÚ`õvÉ´‰ë=K¦ ®^ mnýRP—Äf¸M-ªø¾ùRÐZÏ[Ü–‚ÆX“^£ØÐ©Ôl£ñ;KÁèMÚuÄeR ‚¬ô(xf–c` 1˜sƒ`L1B#Æ5yÖt†Ô˜]ãÑNpoþcdíƒ`A‘éÓytŽ‚[–Å¢ Í`ÎѰóÄvÎv=ˆS0$$ï¸ìã˜Ø8n%k4óq?ÏÍ|*ñ¢™oF×y£#ùµ; ïè(ü:ÊÜt”¶m-Cý¾ÿÂEÑ\ìW¤M“‘Žoú$38 ”¨K38M˜ø)fðþo?Ôm\‚‰ CâuÚ.×+Lào /fΑ¥h̸á(XóÔWK’¨ä"¹ppƒ> stream xÚíZMoÛF½ëWìÑ)ªñÎ~o{j;h€‰¬›¬D[Ê&eé¯ïðË&©‘´¢]»:\QËÇ7|³3 qvÃ8{7øu<8=·žyðF6¾fÚ€ñ’YOG‹l¢t¶¿tiã¦K0Ù-ÒE ’rÒ¢euù'Ë$[}?S É?™Ei[ í©tî¥.åÛÞÒrB¸þ¤mãJLvi¹ª¼UmŸÿ_m©-©±ˆ“® yùÿykQž’©ÿãÆÎlœ¤‚çÊ(߯“å´êÀoÏF倚òr:OnÊoËëºqGgÊ1Õ–r0IãhU]Uó.þ,‡Ù*½Ÿ¬îÓZÏæôyóùs6¾ÝÊE¸€Tà¨GVFà§f+VÂûzfÖ°xI8«Ž‹ÅrBaT1ýõµ@ÆZml¨]DU–üy2_µ»ü£ôÿïPIÈÏ ©”HcZ+º2R <Ø9äyr{¿ª$¢ÂMV_›¦Ñ×røe¾šmþ; e€~ Zkdó{ÈFh75Á: —·»ºxÕkS'Ùº¸¨ëh·u\3kÄ«¥Šo™¦qv»L—âjÙ k­"¨¨5½j‰Ò†„ò`굾ΪÜíåVµ`šfïÐnU“É6®¿ÕÁëQád·w«Z+ðµû8Œ[½{ùn•bòñý¥K?0]‚Éî`i4‰ÂkKóݪ¦ fû{ià Ju]¥®ísXUM/ç–ºÍXUÍ)ò=êÇ>ªü_:U}tªG§Ú«Sõœj¶ï¾ªt°iôíT¥µTú³ü°Nv{§*ö`N5{ûªôº¢?;Ó†L–Pª;Øi> stream xÚíšMSãF†ïþs„TÜLÏ÷$§M€­l*)ÜȥȻâ•YÔÖî¯OË’@8Ø BâƒKcYzÕ=okú‘ÊœÝ2ÎÞ~¸ZÏŠ)$õ­@V¦É»YMn\m«£ֶƒ]dµVàk ÙF9ä8Ö½5Ž¥H¿¿ªiëVMp°ÀŽ&Sx ;o‘c5-j¶¿'”¶| ±¡¡nâ«”Àµ} ˆÕôøn©½ÄjN™oΰ'iüîì<™Ÿ¢>(¸1Vþ/1Vï1v±½b¬_±‹`Œ•Î6)p×+­¥µ¡? éè‡õ­ð`×ÇXé8h´»ÄØÅc%"úc¶|`Í„†ºëHãAk÷vVjCìÏØ¶~ ³ÁÁnb­v ½ Œ•Z€â%0VMh[qìÅ qìþuìžc÷û’¯c _ÿÅÁ0+P¶_Níf`mí«£־ƒ]f7Àk0Ù ÌÞ×Cþöÿ\€Á¡è­l:úaeìÔƒ^¯©ç--ÒSœÓ²?kÛúÖ»‰µNª×àY¤§xGÁ¼Ï¢áÀ܆g>þqÿbvÿbv´ÿf ½¿ðSÿ¾U´¢pµÍŸoÿ6’üÍ endstream endobj 2548 0 obj << /Length 1226 /Filter /FlateDecode >> stream xÚíš]SÛV†ïý+Υݩ—óýÑ^µ`’NS ¾É £È4udWÉÐ_ßÕH'¶%õ#Ù>zµ«wµûH%W„’ãÁ¯“ÁÁ‘qÄÓ\“É%Q´Ä8ÜF&Sr><»Ž—×ñhÌþròºÜ9.£4J¨üø{ܳчɛƒ#K‰EA-rAi8Xiðt…c0vxPn¸tùAƒÃÉàïÃU”°û ðP¡Høipþ’)þö†PÎ’/ÅÊOD1 \hÜŸ‘³ÁŸÚL̲Fµ¦bàd˲Èëb¥þ'ºXÓ[tc%]Cò!ðóÚ¦0¼JÎg t¶+Gµ¶Ûž-³|…ói5’_ž–;ØÉæÓ8¹*?Í/Ëíaþ–~–N!e×Îëne­¸òn©ò›§i´\Ì“û[3›wÒšYUhM˜Í3‘J£Qt}ï?0ÙÕ2~@«4ÝäÁ]­B$×¶¿ÖÑ÷`þÁ®´JIp5šìhïêáÒJþÒsDþþʦ­ïY6ÞÁnÀ= M¡5÷¼D¤UØÖL+myOc}CÝÄW!€*ó<«ð9ÞàzžU3ß g'Çg§Ñâ)HVü/IVíIvO²½’¬[M²q8B„ý+ÊühVX ¬ ƒ»¦Ya 6ˆþ°¤£ï7½üƒ]Ÿf…¥ ˜Ù%ÍÆaYßÍ t„÷‡ÄY%ú³¶­ïi­w°›Xk%0ù4Ëð!Þb0O@³LS ZlN³“w'‡ã×oþØ¿•Ý¿•Ýãë_ïNüØÿáJl%Tnóo¸ÿÄü· endstream endobj 2576 0 obj << /Length 1220 /Filter /FlateDecode >> stream xÚíš[SÛVÇßý)ΣéÄ˹_Ú§¤&é4ã—Í0Š-ÀSG&²˜ ýô]Ý@RpbùXP·~`táè¯]ý÷œýIcJ® %'½7ãÞá±qÄÓ\“ñQ´Ä8ÜFÆSrÑ?¿™-of®hÿõéÛ|g^…qMÂüð÷ º æÇï-%µH¥á`¥ÁÛeZŒI¼ÀØþa¾áÒ¥õ†ãÞ—ÃQ”°Ç ðR¡Èäsïâ#%Süß;BA:K¾f#?Å(p¡qNÎ{g=ZM̲J¥¦bàdË2ËërÆÝgʬ´œU,ϲÊWÿY4Kê ÿÑÿïç;Ò3\O„ÖµiÝH™áBÅÐ:åYt{—áêL”Ï“ãà>ßý:KnVøÿƒ¸ÉD‘€zH ˜ OØæ6° Õ®ËËJÜv^ÎTîžùâd=­Qˆ-ŸÊ [²kçõ0²T\9[Šüq.oÑã|L´¦A@Z`ÓL¤Òh”]Nø&µü5ÅÙ{»¹*ÍAWÁoÛ䪽µí®S5ôý:•°ë“«R\É þäZÔ@ZíÎA+&õÝÕK]ß³^¼ƒmA6 M¡%Ùì"´*\ÃLw¯#uyOc}Cmã«@•y bUø¦n°ß<±*Š™·Öߎ~Œ†§]ªø_ªÚÃêV;…U÷Xý²¬ kUYoÛ°*ŒÁ¡;øhèûõ(ÿ`ׇUa)(f¶ «_vVñxwDS—÷¬ßP[Д²»KªB¡cÝ[×÷tÖ;Ø6Ö* ʹ—€U¡8ΟVƒâ¬5­¾>GX={•ŒO²£bD\åÙ³ýÇ×ýÇ×=Ïþ7>¾ÆŸÂ8Î~<oDµœ‰ú©mS-§Œé®›5ôýº™°ëS-§hÉ)[ Ú¬Mê¾k\ËËxgÓÐ÷«ÿ`[ðs hÉ?»ˆ¶ ßä¬ÝY[×÷´Ö;Ø6ÖZ L¾Ù2|“·Ì3-Ó¨í¿ÃŽÞ †£Ñ¤ý£ýרýר=½þëèõáÆOý¬VâjBå&¿ªý°oç» endstream endobj 2484 0 obj << /Type /ObjStm /N 100 /First 987 /Length 1286 /Filter /FlateDecode >> stream xÚíWMk#G½ëWô19lOTWwƒYØœXÖ>$1>8^‘˜,R°eØüû¼*IIWãñ:,F~z󦪦ººß(QË.¸DüïÁÅJ­¸œªvÄÊTÇ! h®æ&âäZÕ»²ëI.uryP\ Q)*,¨º5Bo@¤\êàJ@æ”YPjÊ%sR.UåÈEŠÈQrHá@È!@ÈQŠrÈQºrÈÁ$\Dn¡´X³rÈQ«ÔÒ kI9 ^rD^¯6îèÈMÇUÆ{Ó1ÊKa1ßy‡Q{Ùk"ödC‹w*ŒÕc~Úî ²Lï®×—'Ë;sÓ»·Çn:]~Ú¸¿ 8ýó%.\üº\LoPÌrµ¹‘#"Êý‹éýòf}{}¹¼ÙnUå~X~¸ºx½þäΤÆÒ‹OØÊ¢oýù.®D†9oõ¯V«5‚žm8)K¸¨{°­ø?…齋éäö—~ÿþjõûbz½¾þ°¼Öôá|úvúnzsõ‹T|‰gMU¡é\º2ö\„™eäÖ¼â3#Gôy®¸/¯'óÄ8‰ÄYg‰–»Ì]”Éã]n®¸¢Ï3kN}˜[3^æ|èýYø]Ù¦¿ãwòÞôD¿“×Tu7y‘ÝÞƒzð»ƒß=ÞïÊ~×lý.ú”ÓØïî¨ò;S<ò;;òÀïLñÈïLñÈï,ñÐïlñÀïlñÀïLñÈïLñÈï,ñÐïLñÈïìÈ¿³#üÎüÎýÎüÎüÎüÎ?+¿£vßìw”vîFyöHåàw¿û ¿£úˆßwwÔú%úyäw–xèw–xèw†xìw¦xäw¦xäw–xèw–xèw†xìw–xèwfä‘ß™‘G~g‰‡~gˆÇ~gŠG~gŠG~g‰‡~gˆŸ•ßU¾ïw•žìw5ìÜ­Æ=Ø;`Í¿;øÝgø]-ù}÷oõƒ~g‰‡~gFù%ú%ú!û)ù)ù%ú%ú!¾çwRÁð_ endstream endobj 2605 0 obj << /Length 1217 /Filter /FlateDecode >> stream xÚíšßsÚFÇßù+î:e}{¿¯}rÆvštÒ:˜É‹›ñ( ¦\“Iÿú®dKŠi€Cv™òÀ觯võ]Ý~¤³ÆÙëÖ«~ëèÌzæÁaXÿšiÆKf=m-²þ]¶/FãùhÜé ÍÛÇço²A/¾Ž“x:ˆ³ÝwÑô>št>öß9Î ™ *+À)K§[j!j:ÀºöQ¶ʧµNû­¿ZH³8ÃÇ èP©Ùà¶uù‘³!ýö–qPÞ±/Ë™·L#! 'ì¢õ¾Åˉ9,ÅQhj¯²XæË¼®†q"¢ù¯þL>Í£ëòvœ÷ל>¸Œƒ×©zºy]‹W‚åŠYiù2Þô{*&À;Ï’˜]—¬ª=ýí·'P™â™0¦³Cõó‹SÕ/.î:g(kðÂï Ø¥`ròA/w•Ü[ºªÊ® Jªr¹^¥–fÆ­Ôc—]­8_QqåhškÍMk"ÿá[¹âV©(•‰‚u´ñYŒ?¬’Ð +MEÓá¤IûÇu+5 ³ÍLU?°`‚ƒ]£`¤‘ ©*-:PVgy0›Î߯CöFQRuC{@ZB·r—*nkk¹!\sÖVõ­ vk¹Z{ó5~üw|µ¦·äÆ$žÖ IÀÏk›‚t•|H¨mWvhã$-y.Ëò$̆y'>9íejγáxz“íÍ®³í¯½WÝ‹ã³ÓlV—l0Hâh‘+Dy«¿ø 0ÎÉý`qŸÄP¹:GgÈËpÖt„¨¯]Ô‹Ë)HŽúdŽ?Õ4+Ù:Þ3ç%Éų€çùv2™ (<§O_—ÊXø%¿—YeËþx:^T;ý£ùÿžoWIH¿éÒb"©ÜÓµ”‘V ª„SOïî¹E´ôDƒÉgÉ&Iô5~/F+ÌÿN‚B™' Èoƒ'ló[ØFj7E€Eî:/oKg_úâU5­^LÞµÞµ`õ?«'~êo´Š®¶ùí?×µá( endstream endobj 2633 0 obj << /Length 1237 /Filter /FlateDecode >> stream xÚíš]OãF†ïó+æ2T›Ã|l¯Z- ®ÔjrGWÈ›˜`58à­è¯ß㌠¶IJ’‰AQs< ã×çø=3ç±J&„’³ÞïÃÞñ©qÄÓ\“á5Q´Ä8<F†crÙ¿¸Iæ7ÉÑ€+ÚÿíË~p_ÇYœŽbÿñÏ(}ˆ¦G߆ŸO-%µ(¥á`¥ÁË-´Óx‚±ýcàÒ'õN†½ûÃY”°ç ðT¡Èè¶wù’1þï3¡ %?3o‰b¸Ð8ž’‹Þ×­'fY-ŽJS1pÒÇ2_äu5Ž3ÍSv•OæY|çãú›*Šl§ áâpÖ U€¡’a€ÑE¨Å÷ŠiàLÎ:’Åäº[Smù·//À50©« xaVÌÕ/ïKS¿º¯ë\¡®¥Áq·ƒ`‚Ù„øÁyi(·0TÖ å¤õJ½*ÜôÆ­Ô#—%)]Uõ“qª-¦%Qþã¥ZµH' )A0N ”v>Ä_VI(–Ô&ÞDéx·"éX· ™fMwõÒÔ¬—à`ר¡,JÃ,H£üMÍÒyþz©h´teM7”†›çVîbÁmm-•À¹íÎÚ¦~ µÁÁnb-5€[o¹»'ÿÆWkz‹nLã´mH±ÿÿº¶) ï’ i­ãÊÞ¬­ÀÏú,?Å£Ù¸ìÁŸNÎýÛòlœ¤ÿivíó‹ÁùÉÿ7?eq”—QÙã/þæ‡ó<{åY ›s|ÊhÝJóç¼½ua®g $Xì’% |li6’µÀ«fÎkRŠû€çåq:02§ï eVÙÍjv/²ò›~’&y³Ï?{ÿßù¤€â›î%BëÆ’n¥Ìp“ÀBØ8å$½{ÈK‹pç‰F9Êûd³,zôÃI~³ÂûWà$eê)r,±ÍmaªMª«*Üu^ÎÔ®¾ðÅÉfZç1p:_–¶e×Îëif¥¸rµ”ùͲ,žßÍÒ絘ÏZi£<‚2´:®™H¥Ñ(ºZìKaå~+`Ušƒ®óÞ®U!hkÛ]—jé‡u©ð`×V¥$¸Š?v¬÷û¬˜ ËwW/MýÀz vªQh ­¨fUáfº{iÊê&¾ T™÷ U…èûÍЪ¢˜ù¶°úµKXÿKXUX=Àj§°êVÀj2:â´ÿOœo¬ÂZ`uÞÛ5° cpSè@Zúa}*<ØõUX Š™k2*j`ïŸûwG5MùÀj uªÚRviU(c¬;c›úλ‰µÊ‚rî=€U(‚ó·V¡8ÛœX„êãÞvÄpF~xËzxËz×=Ëzu;ŸäwñVÀÊ™h¾pÚ5°rÊÁ˜îUK?¬Q…»>°rªVRkåä«ýJè³.=§1j÷ X™c`ï¬^Zúaõì`ÜZÍ>2+ÃG4«DwÖ6õ­ vk­&ßY>¢[ æ •i T‹ Y±×ß&iÙqÿ”=¬ÆO±ÀÛñs“lÎ*?ÞEÕ^¬^¬øtŸ¾²ÌеõÁi9%õÇëbeEÉôÅÓß²_ÄJÜ=¨Üæ±?ÀpÔ~ endstream endobj 2660 0 obj << /Length 1785 /Filter /FlateDecode >> stream xÚí[ÛrÛ6}×WðQêD0î—ö)q.Mšô»OiÆCK”͉D¹"åŒóõ]ˆ EÂ’M ¡›t:“ ) XžÅY»2Ž."½<;½T&2ÈH*£ÓY$$’†EÊÀU‘èt}ž\¦ùe:S‡O]Þ¼OfÉ*É&Iùñ]œ­ãùèã難—G Jf rE‘æ ^·±Eˆ‚JÊ åÆv¼8ü= Ð Gd º2Mƒq4…ïÞDq££Ï›–‹HŒ(“p?N pÝ1Mj8*›‚ ÃK,ùƯ³i²J¯¸Ìâõ¼8ËãyQbû ÿÉ FFXãöòʃËÂŒ ¦ßu Ð^bhnãÁ}q×d5Kçˆ Ò”ø~ØgB ¦£ZÃË8›ÎÉðIÛh$ Iªú –¦ýÀ` Û"X˜dˆq /ƒ—Qòd™å-âøN.ãU“ aÕó v³xq8·˜")uÜ6ír ¶ ·X@g鸽CHMºöò ¬µÝ±.Ø%üÔ’5i ì©&dð®{·o©4 ×%îç°¼¨^ˆºíº¸t7°èÚ…¯|à¶?¸›­–‹ò../W«4›¤WñÆ :¶0’æÞ aÂMâ"Éâ"]få£åì¨ÉršLË«$žW8²©×²©ÎÌÑK‚ëá#h fþÊ IB}øG‹*WùѳÙi¨1U˼–!9ã%`ç}<Ÿ/­×þùÍÆ2©¢ŽÔVšÍð•ûRš¥E3ÙÞýþŽ9Cöɘ`*š+Žç3ìÓ˜ËÖ>ëªåíЗ>m¬7è\çÉj$ÄCP…™[A•Í©¶*éÎÎr]\­]<^Û™¯Òø¼âèsZ\:ûåçùÍNÒ¶1àú…ï–Qµ÷o¼Â¦IÀû¤X¯²|WÜ D„êîYi±DuòókøwöÛ/nâ9òõd’äùl]N/+¶Âa½„ù ”—ç¥Ár ëZoi°` i!zÛý<ûa»_8Øöi°` NOƒs?í%B~oy¯ P4šþŠ$Ï~`tƒí È~ˆîR%Yòa/^Ý\WóA àfýÕ!žý@>‚ÁváƒDéW¨Cö¶ü”Üø´}Ð[3‡áKÕ_•áÙd.læ0GTÊ™K¯ˆãCždz#γF\8ØÄqW¬Ú—‡÷ìYªQ¦×e†p¦ ÂýíZMóŒ…BíB˜¶Õþ—µš4;t÷ãRC!Fúãµi?Ø`°]˜UF¹’VÒ/ÉYKjÓlž·(SäÞøhÚä#l>$Fœõ"œíX»èf\p¨Žùcèfª5Ê\õ"Ûd¾NÔXÝJSÛ‡Ó¸pÒ˜-‘¦ÉU’MÓìÂõÈÊz›`Vn¨¨æ¼*àëÙµ *s¬YÕpS€;YåöÏ_œ¸bßiÇÏŽË›ÅršÔTº]@¨†XM#Ùh´mr>¢ðö™ÕHf‰ŽÅ:wcq~«ÝÝ»<´S†¸B@ÆÿÒ& ¿¹@ŠÊî~cÇÊ²Š ijÝ,?%eè§Ëì‰“Æ–ÙøÞ!ôxÀ=˜ÌÜj¸çêÏ3hÁëîYšÝª}v!‹'E­ñjßøªß'+]'V¿i:¸Î“|¡ )E›Òe™¹û®€Ó¦WlÔ¥ñ<ýR×KÕRT XÍ»'Í¥í×?ß¾}ÈaÈÆ m’w›ùúb­¶abmŸ×WÓíì|`8v÷™)$µ§ä¦Ù.’a#U²'’+Q}»åTDº¹zäfàC $•ð½qÕ]9`Ik=îGu(³ tc^îÒÆ×ÞÃûO Ú„­s(™V.U­ï÷-Ð2;ìr´ »ïT÷œ-Ø$ ü€álr>9[Ä“ƒˆ=O•´¿ƒ¢5\YoÅ‚g?¬XÛþ ‚Œ 8g¸åÝ?oÀú{;o ’Îû ’¦ýÀ Û¡¢$š \Sß ¾M`P”îïѳÈ\0Ø.Ì)Œ°bߪ¾M„@šö'–zö‰ Û…8«rþÝÊ¥Äþv@öwXèÙd6lf¹†ìo-Œìá$i÷9RÁ”0ø’<Ê †GÆÏ/PäU…LMWÙFÉäS¾^ì«öšÒæøøÙñøÝS[µ£òé-“£ø·¬eR%´²ÞZÌÜõWâóCþˆã¥º+à endstream endobj 2693 0 obj << /Length 1874 /Filter /FlateDecode >> stream xÚíZmoÛ6þž_!ì“<4,)¾‰ö!kÒ.}I:ÇP´E Ør,Ä‘2INþúE*‘d¥±¬ª+¶ $KäÃ;>ÇãÝQØ9w°órç·ÉÎÓR9 )á g2w¸@BQG*¸JâLfÎG÷de‹h´ëqìî½;47ãp¦a< ÍÏ·A¼ –£Ï“WO_øØñPP Ȥ‡|&a¸‹:Hß}j.SºÓÎÁd篭°Cî…€®”;ÓËŸ±3ƒw¯Œ˜ò›¢å¥Ã Fp¿tNvþØÁV1\U`fbU 9AŠ¡.Â[+yu*ˆBLÒRðg…˜%ncÖ|ä)U¶Œâ«UnfeºÒ`š‡©ù¤ipkno¢|aî.F»áˆp×¾Ês]e!j Z×&Ié9» ©€«ýºM†°^•(Žò(XF_‚auͳ…‰-Ì2Gwo–VØ`¹L¦AζZte7­ØºòMU•¬µë ¤Œˆ§Ü'¦ÿ»ñ‹çÇG'“‘¢îÞѤW‹®¿š‹Ç{GûÇow'#â»Ç»€¡¡ì»ýq¦¦c—˜-k-£èÿ¯§>€áAϼfxÓÌòñù\V©ÄXp“ãd­™Ð™±6Rš'©8•"_0v®Óözàož¤zRè'µh¸jJz{•'çipµˆ¦ƒO{_C»PÝó·Š ­Éh¾°4VV‚f'O£øü-„S>¨E{9AJÈÚ¶àBoX¾¹j>x7Ú ¨îGjq û…ן«¨°QŸšÕ|ÞìsÓËf}ÑÙ²Ör¦m>£^C€ˆb¾.%Ù¹ âÃîྴÐÈ ¿e¡!‰Ã­J :Ït¸J¥´ `¨Ð¨ß/4ê/ìæ•JaLnY¼N¢Ùã«•Jƒ&¼YkàøG©5t ¿(ÅHøÞ÷¿¨6!Ëð«t1YëVãet–ém58@#X‚ؔͫ!Ãå*³Î8NòzýöÎYéÞ­o+>O;¶¬î,«rÌWñT—ÿËd~ïZ¡º‹µ$X°¥æP»Bµ^i^zn”™Gù9 çÚõ«en›^䙎=Ò>2]<÷&ò<Œm»Ä^GÄ-¦î[ÁLßO{KÛLÛ§Öõ+NZe¸°trZÁ>5`§YøPtU“²øøÜjŸ? ªw'*µ¢šý‚eß΢çÞ&«Z@kƒø™‡ù–n¸¹‰Š‚7Üåö•ž¹Ð>ZØ›ºL–0ßJ Y`Ê.“¬C_"À]V=pz®Œ¡Zd}dƒ|€8 çIjñ5;G”£F»´Àÿd¬Þ²zÛ^œnµ{X"Ÿ Xô'J ß®èßÀï·÷vó­ØÃ¹}Ñ?¢èß±Ò¯äO|³Î†3:~OÓè-l‡ñ,óäO$y‡;¨ià÷d­·°]X“°gðAÉŸ†0îT§ß“âÞÂv¡XH þ±’?+fÃÅ4ð{Ó[Ø.Ä€´,q¯/(ýmÇÆË V^¥¥­R¥°Õ%—[Ç<„ýáÎjø=‰ë-lâ/>êê¼¢j¼´¬©.ÅBÁá~RÑIùžÄ÷'£ÏOæôÃ~±Ï'1bý¬¦~#j'1¢q3î|#ÜÉxİûþèùÞˆâN4ÆþÁøðσ}s<óæàèI[²jK‘GÏÇ#ÁÝï&Íá!%úÿˆ¦åˆ¦íCZXœ ³m¾£ý§ö9 endstream endobj 2598 0 obj << /Type /ObjStm /N 100 /First 982 /Length 1484 /Filter /FlateDecode >> stream xÚíYMo7 ½ï¯Ð±=X#J¢DF'› -Ä9´5rp“MkÄØ-ì5þû>qw§–åÃXØÎ’¢H¾Ñ®g)ÆÏÅ™Èõ?™¢×ÞPPE0$ª‰Æ{ÕàOVM2T“MHU“£‰Ž>¹h8Äz«˜$Ù@ãŒøXxHT¸pEª” ùê-¹ Iô® ŸªT åª#g(R‚}"Hj…`…]Å"eV]„TTdžRT|$Q|ä :øÈYuð!¾ê<|Hª>pI…T…+ÎãSÖâ¢ê¸+ªÃ%8Òuo|@ซ4Τ‹vÕGA.CÍODrMòœúEJ‚c½[S„AB®)ªN Õ¼Z‰’T‚Ïð=¤¬º`B$ÅÁGLªƒvªƒfÕÁGÝTHðQ @‚íN2|京„d‡œ«<Ä«>$)> i|À]ˆî³‰¾.:!±1lŸÈ(šº„­u<$‰ðÔÅ\–Ê,k®¬©V$©VŠS@bµ¿Ek •Ë.VJЍΦà#HYu¨`ïǒꪚT—!±êÄpÔ˜s¤;ƒ~á¨;ƒ`ÖŠÀ¦0 Á‡À‡– –I+¦8SÕá1®Ñ#Mè‘ziG%Wo5£+ên¡_SmcHÑ`-q±¿¿˜î›cô#£¹›é·ßÿ€'›Jݱ ӫ˳³§‹;wÞ .dc‹³HÞ 8‹|ŒÑJ–Q¨ƒàh1CFÁٺј½KÖÆŒa¦ß[àÃõjcö÷Ítˆb¡²}è°ŽW7ËØï°“±»˜Ž.ÿÜèõϧ«—‹éîúüùò\Ý»§Óƒéátï˜ô¢Fü kõ„¨tÌëtIJ˜qè{[Rî@Ó~d¦×OÖ»öÝÅß§øì®N7ß×Ì}Ö@¢D[IpcÈbØÜ~ ` KJSÛ@‚'ëb¹ý@ð6awü¡ (‹· ¤¶ZMêëVÛ£d¸K²XÊõÆ| ½kÌŒÊ-«càme¤AËΆ2 öÅFPý0fƒRlåöAp@= [f[Fcf޶ Ç#æp#ÇÖ¹Á0º|×¶Üá»¶åß5Á=¾k»|×wø® îð]Üã»ø«â»®ó] Oå»ú†¿e7/³03`pßøîß}ß•ïÈz(ú|wý^¾k»|×´Ü㻸Ëw-p—ïà>ß5Á=¾k‚{|×wù®îò]Ü绸ËwMË=¾kZîñ] Ü廸ÏwMpïšàßµÀ]¾k€¿*¾Kî:ßm ó]¾ÆwÌ;vã4 ùFh.›õÛ¯™æØæKМCíå7ì¡ÿ,‡N,ñM>ÐÅÓSË\|cG©«è÷RK B,1Œ‚ÅJûlëW§c`,´™ÉÒ`20À¬'? Kn0s R¦8jÙ'K2˜ ®õäG“âÇ(GpV­§1°x¢ ‚3Ù ƒ›¢#=È(ØámzëQ̓Q´Œb/¬ap³)#â<Ø&„ÃÑ`eP-Pæ[¥· ÃlÛqÈG“]iî }2ÙÉÌq2Ÿòd>åÉ|Ê+7rÊ‹‚\¹z¸tÀ-Òoõ‡§‚ÃUýÙNÐU%qMíÃÕу‡øìýúÓ÷}¾X‚«³,õ<Á `yqˆ%„wô6/7{Ï—/N.Ï6{/NÏ–{Ë gψP»Ún^­þöß@åQUÝÆ„½'AÍ·„2rý>SöB endstream endobj 2725 0 obj << /Length 1431 /Filter /FlateDecode >> stream xÚíZ]“Ó6}ϯðcÒ!BŸ–Õ>Ñ PÚÒeûÌŽq”¯“Ê64üú^Y2±½&$1Yè”ÉWçÞ{tï±²8¸pðxòóåäþ#©…THÃàrˆ…ŠRÁQ’àr¼œ¾X¥Å*Í©ÀÓÏŸ¸“ ½ÔFç‰v—¿Åyg³×—Oï?ŠpÁYƒ\Rq ÓÕ¶Qð‚Œ¦÷Ýre_š<¼œü=!0 d^e"Hn&/_ã`Ïžqïë‘7 QÂy¼˜ü9ÁÞ1Üv`îñ¶‡‚ Ũ·zë‘·CAâ’5À¬a6v{Q‹Uª™æ›ªtQ‰‰·îô}Z®ÜYb¶›r}mâÍ*MÜ­·3‚§zFÄÔ.×îXõ&îzADRÒ`hÁÆ,“u^”q^ø†ê`¿¢Cý*Wž 箯ŠÒ¤ùõg¼íœò“^d:pDJ¤?Þ‘"ýà‘®—îxN×¢Ú$(tÚ¤ïôÂÄùb}3ä_œ¢uUîwÄN<£búÎrM/ÜMà ˆËøsDD/W‡†³Eõº;z9ÝÎÖy¼T²…`õO©Þ²ºÐeeòbÀ7& $ÑñùjYôÅÏ\îäâñ$xYƒ}ñËøwõǯ³þaº´ŽúÀU’è¢XVò I«Ï9C\„ÁœIܺ´_A7Fo6±KÀwWœ_aá?q#%ìÜöð¸W¯’À‘s„ydëµ½/0Ÿð€"Á2:X¶ tÇÚðÝ[Å[~g˜ØÑcí»žÐ³ß4—CfhÛêPõÀ6„À !ên¦š™º2)Ûíú*.rÒaÌm{À!Á1`AÙçÁZBø'·m5:¡ó&ã1bÐtj€?|Ê„@, ZW°d3݃bAŸ¤¤PLÆPrHQ I&@ˆôÈ/!³9|º¬ò¤L×¹»JŒŽKíÅîk»„ß»‹‡yòàù…Þ<·¥ òpnGxºYoª Þ\¸Q®ÔÙ³b}£ÝÙB/­Šˆ«¬´7lõ³qVéÍæ!¥Ó'¥ ¢Â#¨ûZ«2 æüó2mlÆ~œ©ëT3û›íîmH„eN@L _&‹mQj_h—kÓï Îz]»s_š@ä•Ð+Œ©ÎÅþ3Rf}žôë2G'ôœ–âõÆâ³l¸tØË7Ûýܯ¯4OËnIÝ‘z7‚ÊmpL7’Ç{ÝXì&¬S\ÿõ9ýý¯gÏüܧ»f`šUFí@W QŽïC<„p±óµ!.(¬tr¶6Ô³?® {xâB@~Uó¹P~¾ý¸¶2Ð|ú{]( ¿•&tïP.rìcçãJ×þH®Œ{W¬NÆC˜Œ#q‚b±Ø£TÏ ƒP ~¾ÌtíÌÌh°Çd†1$¸ßüIVP‘;!¦©»”>¹–¡„­±å5Ç©D4w¡æ8Eͽ¾xøOiâÄw¿$Ku³°Ó2KÓ|[öÜÿ]Éôv†¤L9÷7¬dýYy´ïýL| ÏÛPOŒ€„Ã{û'CnK«‘ŽvÚMdÛA/?h³ž—Úܤùî¦]â@omömZöX¿_¯ÂÂ$¡ºS½ºÛ%·/B‘¥W…>m‹„JŠ˜RçÓ¦4$ˆŸ¯©uÍëi£¡.LiÈ‘¤Ñ—¦5zâ”Óÿš8…µxt¾™žý‘t ö Dm„š yJ™B‚Òóå¦kdnFƒ=&7œ¢¨Q§ö÷˜Ã’r[È ·awÒÂ¥c!ÐH0~:–B¨.ŽÈåÚè}*6Í¿kØïö«kX÷»j_‚^ë\›8K?4îîxûq«»ûëy±ãû¡ÌÞ£cÃoMÇ~4>ôÇP$æ§üíÄ¿u.ß5 endstream endobj 2747 0 obj << /Length 1325 /Filter /FlateDecode >> stream xÚíZ]OãF}ϯ˜Ç¤Ú óí™î•`»[U¥—Š]EÆ™K‰“ÚN)ÿ¾wü¶ Ž1«¶ ÛsæÞ9÷Î=× [DЧÁO“ÁɹgÁF1…&s$V†#ÏÀÑ£h2C×ëE˜,ÂјI2<½øœŸ\Ú¹mØüã¯~´õ—£o“/'çš €Š;@á1¬…ÓeX”àéáI~`¸Aƒ³ÉàÏ…§¢FÀP.Q°\#h÷¾ ‚…Ñè.{r…$%˜qçKt5ø}@ªŽiZ±£Ä”‘Û’d~MÁ ÛÍÆÁ&2L§Á6±Áôv4¦dhÓÜЯDø£™µéfr‡O Û9öˆ@—XŠÌvw]R…ˆa£ Š-šWŒ­£í¿º;XjUNS÷tWüb¡êøåB2CKaÃÌ+›Æ·(?¹,&3†E•aæaí‡Qšö$º–!{¢á!l†7Â…DqcµÌšÚ@.攡1ÅR™ÜÄž‚˜kTypáG³¥mX2üph@RŽóú‹—:~ÇxélìñÂÇ\(˜ &¥²º×Mý$¢/Ž‚ ¨ÆËÑ܆•ÒýqSÇïÈMgcÛpC$ V97[ÈfΦe jŽK©,¿›¬¹]þãÌ)c Nš.Û|ãødIVžÆžÔ¹ág§±¤yí –¡ŠóUÄkpjÍ’üÊWB˜]Îòóx½ÊÏ΢àôâÒn.FT!vqmNÎ)©òA †ðæVU¶j+XYû˜5·4fÆ”O&‰Q€gç~á„¿\®?µ…7÷2-¦•¤t÷‹½<ŒÂ´^·Y~Þß±àØ]S0˜{C3Õ¾+¡ÛûÞdâ5<¯šzä x, ÛòP|i¸ÎL¶%êúÓëmºÙCr[··6Î/Ü…é¢E€7Ý1^eÖ1÷œgu>/mº£d_KL¥×žÊ1³ëêçÏð;ýí—¿ùˆÉá<ÿlƒÀ&É|»ÄÅôU­ê¢OÀ®7æ¤ÌAb59R§JP$v¬Þtªäk){«m ünµ­»±‡ëT !I{EšütªdÐô™þúš~Çxéll -$™ÂT‹ï¨S%…æ™÷×C4ð;rÓÙØ6ÜP‰YYWöêÔ'‰é¬A%{„~ *´Æ„éÊ%9]j-weWu†QãÁÓ-œFiÂf¤¾«ÏwõùæêóyY™® ©fÓzûµà¶Ïì:›ìçÿ*DçñŽëÕÔå~–Bíå(—Íû“£Ü¥½•°~·ÖÝØÃå(T1,(}9êÞ2LçáŽüÊQΦª¿ö¥ß1^:ÛBòpØ›„dÏËQ¤–òÈ·s¯!Y9£˜‘þÚ‰~Gþ:Û†?&°0m¾'qjÕeuz¿9>ŸÜ‰þZˆ~G>:Û†ʱä…"’Ú?, רSïÈœsüFþÊviH8ñ0“oÒ0­0ç^)züÙþ—ÛÍ—ß ¥"ë’ Â¬m)@&\œ½÷%O÷%ª×¾¤újø/'Xý8ôoÊx|7Ywóny¿wIÚ}ËQï:äcF”;^Ã7!!qŽà5Œžq-‹Ãù}Ý}ˆ›;;[Ïw£·ìRnŠÏ1äÀ‡²q)®Å9æà^XHc­Äî*”ûÂ[¬Â#Á¹ÙÙÜ5ã‡lwyý|ӵϣš®#úÉc›®ð}ÿ#`Û$â˜ÿù€ ì endstream endobj 2770 0 obj << /Length 1401 /Filter /FlateDecode >> stream xÚíš[sâ6Çßùz„NQt¿´OÛ–l³m§)É[v'ã˜%†³i¾}|!¶ÃÍn³;™Ù¬ÿås¤ó“€ ;DÐûÎO—“Sm‘ÅV1….ÇH*¬,GÚÂQSty‹®º“ér2íõ™$ÝwçgÙÉ0‡qÂìåA´ f½O—NN Aw‚B3l„†Û¥Z”Qø€6Ý“ìÀ„uê .;w(´"ˆ>™€r‰F÷«OÝÂ{ÁÂô¶¼G’̸‚óºèüÕ!åŽZòQhJŠ­È¼,Ó~]C'‚E.A žH7¹¾ëõ)é†Éõç°Ge÷1³ú‘H4õK°•î^îð¾æžcMÒ\cÀ½».©ÂŒ İ5Å!—ìVÕ6_}~¦0e¬¸A&L]k_ýüQUõ‹G}ÈÊZ [f`6ŒïPv2Ìc ±Lc,Ê1f‹È…Àœ2Ô§XêÌßwÛ$æ=µ›Ñí,¬ùè~h.R‰)ŒƒÖR¥ªï™*ÞfH®8æBÁÍ ²2Ñ]ˈîO)PΕdžÌàØZlªúž±ñ6Û$6DÃdÏ*±y6¥Å*˜RÊæcjë §Z¡RÓçcÛ kúãÁ±£0©KŸ9¾vÜZ‘•‡¢df{ðO£$+½É$¯ÁËÕÍçž+\EÑ‚kãx~_kI?.’ð¶¨èýáà<;wyŒ+ää”’rlê3賕õi ÊmÙ5ØYTýjš•³EËe‰5rñô Öæo²ðÑ"Ô´4@ÓG’eÍ4š&ÕòýïÝýí ŽÝ•>ÌÜäYSöµ¾+(üÂ4ïû4Z¬ò˜¢Ñ»óa¸8w¡twI¯~é1÷jÜÌÂ=¶5Ô ®Ôv5×kf)ÔJÍ››Bgæaö¸1.å> stream xÚíZ[Sã6~ϯÐcÒi„î—öi;…-ÛvJ7v'ã d&8YÛY¶ÿ¾G¾Û„`G1ô ŒdG>ú¤ïÏ'!èô~ðÓåàèD[d±UL¡Ë’ +Ë‘¶ÐjŠ.¯ÑÕðâvžÜÎGc&ÉðÝÙiÞ9gaFÓ0¿ü=ˆÖÁbôéòÃщ!È€AÅA¡6BÃt™-Ê< Íð(o˜°î¡ÁñåàË€Â(‚è<Ê%šÞ ®>t Ÿ}@ kÐ}6òIJ0ã ú t1øs@ª 3´‚£´))¶"Ç’dëšÀ"‚U®VA ˜È0$ÁˆÊá×0‡ø‘Hÿ4ÃI°•n×¼o æX4‡™(w¨Ý}IfT †­±(Ѭ³nmûÝÇ0‰•å¹aêFûÚ/¶¨n¿Üâ63Tm)l™=ØÌ`|ƒòÎyÁ-p˜q+ªÜ2¸% §GiNØ“vÐÕ˜FÈ?p.ôWŸ‡ÑÚ vÞP|ðØ`*µ¹˜S†ÆKestß=eBbnPeàm]/šH†ß·õE*`gd®R·ïé*Þ`[¸ Ws¡`2 öy¾É'§¿×·˜¤Œ0ý<_p~nÎn÷æŠ@ ›×Wuûž\yƒíÂј0QMF“ ‰èóñ­ `«aÝäÆë?¶æ‡` ‰Ìã\o´Of_e I©2û#HJ_]F*ríÏÇçy–¶¼žG7ùÕr–·ÇÑôÝÙy¸:s¸EgwÓeÞ~$„-B\Û‰£JªOИ1@òè ‚œZ…Ë6D–©ý‡†ÍÚÊ f`ŽToާ0žõƒ¤h‹å4HÃëüòó_™eZ2L+ »Ï‹ó{ÍÓz®Þ½{½cÁ±»3¦›z$7VLÁ#µj½bSŽÌwýñŠ—«0Ê{³eœwîãy œ>ƒ˜QÐg%b“OÒôôvQ$Lw¶vûSRqÏ&f«+6ÇÎJˆŸÚ&Ÿ‡é:Ž’m¾%1•º;ÚÒbîâ—Sø›üñk~9Ÿ˜a’¬§Ó0Ifë.¦¯ÊEçB*4æPóçcø%Q2\ß}ã Ä#ôÃt/ù(¥;ìúSR(Làlé+Í4ìû¥°íÕ£˜¶‡Qà…/„ͤþï-#uK©!"¥ ÅKÞcêö==Æla"¹ÁÜö KZSæ‚÷GMݾ'5Þ`»PÃ4¼PkgÎ&m j÷{-{pE)!‰Óê‹vŠR†¹*tÂñ·4¦E‡•¬7eœbQJ1\l/ï¶ËË7)ù¬”|Qaæ·ò*Ô=w ¦óÌ–xi,_R8Dy÷å/×éj],%ÀÆWÚ›@(=¼ºê…ÿR5û0vÛ¯2œCDìó£Ì¿jäq endstream endobj 2714 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1669 /Filter /FlateDecode >> stream xÚÕY[o[7 ~÷¯ÐãöPY”HJ‚½ k± +š>l ú¥Æ¬°7¶¿Œ“¥^«ôâl@àÐ<E‘?ò8k—BÖ®Åþ×Ðý{ T؈¨ök;³dl#r(䜊8‡'žÀìèí.Sƒ”fD ÒŠ=h6¥ Õ8D¡’sr¨Zl -;÷R¡™$9‹4Pf§*ŒmbÌ–œ‚ݪՖ¦@-™þŒÝWd¬èn—YŠ™šñ‘šY_pT²¯µà¬TM®@i&çAUVçá£$çaó"¶oQPÝö-ø`vöàæ<KÉØ#C‹Tã±^ú <ìÖÔíƒkS²q2'ÛL¡à±QxÊfZÅaŠø ˆõhV¨tì!Xa1…ÕµbUýä¡4?¹(‰h(݃"”GE‚êaAŒ9Y\ª¦ÀˆöP%ÎË üäáì'‡›8ûÉ‘]\Šó …Õ­‡œš#*CΔâ)äzrJƒ¤¢¶r‡Ü–JÈ"²§5ƒó[RVJØÝYTw´ˆ…§ÂÙ"Í×"Õs™-ªæ+<êþkØ£z:7ìÑÜpŽ4÷_ÃÍý‡„“îþCP¤7çÕ É3§5Pž9 yNd{àf)yæÀ4Íž9žf„"7\'-…JšYß ®†û[j_+·ÒÖâÒV²„«p;29ÍfóÇá'ãZ?óŸ~þ'ŒjŠ(Ç„P/ß¾~ýrvÿþû…“Æ‚î;$ GŬƒŠ¥ÕXÒ¨æ “‘RcÂ*± dCÂER´+4&̮РpåkH8S‰]mF)‹yT–(Z½Tœ"ÕÁRCfРç¨Âd i¹IJùFê®–áà ÌQPÙ}Ñ¡ˆ´¡ w¿¡ümž ÂN4î[Û~±›Z¦(—ª°ËüÙzuz´¸Çaþìña˜¿Xüy¶¼øë|'¿-fóG0f±¼xcµßùùlþ|ñfõv}ºp^¹äý°xuvòpõg86¥KD )¶þû¬¡¸Ù6:,—+(=œf–ãæ†¨Ñ&¢oˆ n˜êÚfó£·¿^ø÷ïÏ–ÌæWëW‹µ”^Ο̟Γ±3œâôTrTÀ¡âþSÓ˜P¼Tñ]r<GaþíêÅ* Ž_=yŠ¿{?~÷ͣώ¾6w~[2ÁgVr‹dȉBÀ€)=¦šwÚòæ÷3üÝ;[ž]|~CJE"Dn Gê´GC£ÿ(‚b«ÞZDC¢V©õ}†,–§'çëÅùùÉú xÆÒD â7žAsY÷ïô‘H_Ú:†1´ã+PÖËn Ô=BeBoÜPû¬ }§œýCz‹ä)ò®â¾S81¼WG…‘è(†„Y{”4,\¢ä>*¬‘© [˜dT3s”1QtnÑÉAáko£Âµ †£F¬yT³ Eµÿ?€Žë»@ÇòÉ@—i±¼!8MÄôˆóçÄ·©`)÷hSñT° ßÐHï¿bi†!˜w¦Š¥ CÚÝUr–{¥­c¬r´*ûw Ê#Ç&Ç0"Ö¹ßg²ú_y©ÝÊ3^ X¯c ÅŒQûß1åºô¦rànÄžiP¸ÜVF…[leT8Wd <;ɘ°†œAgf¸cËna„, zNJÄ£š³"QPlvÃà.aASÐhTMA”eCîQÅÅ{Ð%Ãä›߇¡m7f BÞGC[MïB›¶O†6.~ñ†ÐiªÓiªÓúE Í*8ÕkІ ž÷8¥lgÈdí\Í„ï\îd†äÆ1§«…K¢;!SÇÕ«2§Xzß¿!T {…9Mlìî­ÑLûm&¤ëÒD³]¨É\‡5÷Ú…чñ¨ÔP …ÅÞ~ Ëb4µØÞ‹ªÔAa ˆöQÍÖrƯôŒŒÔloLҨͥ'´.:(\ѶQÍ(‰;_üîÎTcÕl/~˨Í÷%N—è3$Lc¹ù²ú?ŠÀöƒßMn‰>û4Sö ŠûÅ}‚â>AqŸ^°öékß¼`m)}”FÃh?+mQºÆDeÿ@ÀU£Ð5dl(±ùæ=´®ŠŒÛÎ{¯DËÎ{#K¾BH ú¨ºGÏ AWÿAEMcd[‰ËÍFôý;fêë²ý€YgêërMè­ò-úº¿[§À endstream endobj 2833 0 obj << /Length 1566 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_¡ÎP3|¹}꺶k‹bYj`ÚÂP:êÈž%7Ë~ýŽeK²ÓȦ•­@’eéxÇç^ž;×^~Î_„:ÐHK*ƒñ4IÍ‚PÃ1$Áø*x?|7K²Yr6¢Ÿ^¼*O.ÍÔ¬L›òãÛ(]Gó³ã×ç/”Ì ä!EЇ°\!‹P„jx^(×ö¡Áóñ௻p@¶JÀ£LñÍàýG\Áw¯Œ¸VÁmqçM F”I8Ÿï¿pÝ0EjzT2Aš—ºd…]0"Z®Ìr­@'<Ì'yrc&ñbyFÄð®ÔóþI¡,FZØ…ìáeKu†B̃IÄq¡º½.ˆD”ð€"­t°2Á´¦kSÚþ«» P8—Õ¥`bïö•ïö©)¿Úç.+ÔeI¤©>²…ÀÕuPž\:€È`^˜*2‡p’æ%`÷Ê Þ¦ïq†­Ü5„À#Ü>a]Â}±+µ šÆƒŒsÄ F‰°Ôð‡û$ÄT°½o¥WsÓÒcø¤«;ޏ ûó–¦|OoñV¶ƒ·0É— IˆÂPÔÝ$ÊRò°ÛHpº· fHPÕ6MùžØx+{6X"E䑨Dë|fÒ<‰£|±jƒcSùOÂH0í“Ë[Ç{Ë®T1ˆûÂâg¶á¢Aµ¹¨<û€15ó«¬ü4]-n\in\\‚ü·(Ïž§ñÓ‹K³¼°5 ¼5väüÁup0¢€eíäEµ®6ãHA•sµýǖ̆… Q­«;³£p‹óÈÍç 0Ã\•?• ˜TP“Ôö{—»“4É›uz ø×íq†ì•ÑKçqíànÙ.C„¹:Üö6§°¼®ê‘;BÁšVî€Ë‡;!ÔÚ vÊÙÁ[°ÇS+?;;}ÛÖ–A QBšæ\š|½J³}~,áá†T ¥Þýú þ&¿½q±7=£b8-?dë86Y6]Ï‘[¾ÎM­ûq!ƒÃH>HN»EÈNL…à°ï˜ °E*Ñ[9kÉ÷+gþÊv'¦‚Ú!= 1]L¦É îMK¥îÈK«ýˆ©`…´¿6¦%ßÓ[¼•=€üè 1aÿ!1” Pö×4´ä{bã­ì!Ø@?‹Å!=¦ÅÄFl~·<>VÀ…ûkZò=ñðVö< cÄÚѶx‘f‰gQ«3(÷G4èÝ4º1>†À!4<Òip¥$N÷?VInö÷ Mv¶!Eoá¨ÍÒÄIAÏgÿyñ¹Ó™Ù}ð6™Ï»uWòÕ:­‘ÞÄ‘¦Ä­n¬.'YžuëZè÷®å‘º–Ê/²è ¸éû9¢Ï¨gÆ–¾\Õ8«$]®’_,VIô©¬pÙé]’^;3ìÚÅÙbºë¯•‘•·ÞB´ä&}âdwÙÕèòI+ñ€˜W’ïnD•Dc#n“|V7¸X»aôí65䋯·\ ƒd§–«»#ªÇm¹²zËuT£Å8EJ¨þ-ÆRZ÷FZòý耿²Ý-f]K…G0ç¢Úõ‚6ƒvÙÿ¢Ñ:„^0 {ENÍ.ö½e£Z"ÂI;¬l‘ø|{ÇU´Xö[TjÈ ýµ>-ù~±å¯l÷Ø¢väÇ„lmÜ`'¸´üc‹Ò/Ýw.…Vwˆ­‰ßï03sd …˜èqZH¡ãaº¿iaK¾g y+{@ \©˜Ç´paM?h×2õ­Í ÎúKÎ-ù~>ã¯ìs¢5 )?~fxoV‡ý ©Zò=ÁñVöp”BaÕèjHupèU©À§ÖEW2¦"°ytÃåM5v˜m§Uã3&†IüÙ¾54ùæõöÆÎæœb½\Γj@SöÃóµùþ2üþ±’ØŒ•šÉa÷U0§Êk<`¾ùåÙÎŒ©>µx@qh Bºçvåð'©ØˆŒâܸWן,õZ—£‡êÄwÕ„)*×&5«hžüS¹uÑ,_ÁÝ'Ÿ°x¼Ôþª—m'/->ñÐfsï¾_|rÈ!˜óƒÏçU—¿ endstream endobj 2868 0 obj << /Length 1469 /Filter /FlateDecode >> stream xÚíš]oÛ6†ïý+xi3ÃO‘Ü®ö‘vm1,Kr—jËŽEö$yYöëwôåH´Ja´ m€²eêè¥ÞCž‡ŒZ"‚ÞŽ~>½Ql<æ¡ó’ö GÊÀQQt>G㳫0½ 'S&Éø§“wå‡Ó`$A< ʯ¿ûñÆ&ŸÎß½Ñièñ< P k¡àvE,Ê\ ôø¨<0aò‹FÇ磿FZDïEÀ¥\¢ÙÍèâAsøí="Xn‹–7HR‚÷às„ÎFŽH³cš6tÔ1%ÅF”ZÒ¢_—Љ #ãëù, Ök?adœÁéyÞ—i•R?Ià?-ôld~¯üðÖRϱ")®0  >?/©‡ˆa£ J´hÈmGÛv÷ÌÔ±úe`š·v_=ªvüúQw¹C3–‡ 3O ¶˜,Qùá´ò¼,<M™Á¢ÊÝ0ÎJ¿†ASJ!tئB; šqà*&à¢<)ªv×#§u!sÊДb©J‘ߊ 1×è¾Ý•Ï£ÀÒ1þ¾kBR‰) †Áò¥ß1_œÅvÈîqÌ…7ÓXÈÖlwé§1ýræx­„y´9D`ÇÁÌiÇw4ÇYlsˆ‚)Ÿ•æÌVqšu³evSyË i0…b—<ÏtyuÃj°íÍëÁ-¦P¤KA°ŽË·§áÙy²J袀Aήªb}ÏÎ'\ŽÃÙõ„Bg'*ǽ¸îfÙ~UÓÍz…Á¼üö÷„AÛhàÖÃ8zCIÓ>‚¦ úk¤=uA]n*æk"k<øÁŠÙ꜆p¦n™6 ¤ ^|öÓêE«™ŸÕª?ß‘ií4mdKÑÇrÔ‡q˜µëü½×÷w*8ÎÏLa.áz›5ÖÔ`uØH0Ý¿óa¼Þd[/?üúËi°®=lº”„þçè FM5ÁŠ©Røn¶[ŠÁT?®|4ú³,H*;râÚ,r‘‹úŒíÌâeå`yXqøQøomå}‚¦Y­íîÕ10µkË–Ó Û$qº/¡êHÕ¿{ˆ‡sìì·wðïò;$?†åèGÜl¤ébáJdeóTÒƒfÒy˜ýH÷ó±¾L ´Òc˜«áxVš J+V|·è.¶;ÏJ)ਟh‘_倕„ÜsÆÙÞUÕ h%LFB·²â;&Œ³ØÌ$a†Põdþ<@+óE˜nµaÅw4ÇYls8ÃJ÷YŸæ¦ãÖ?%¬Àes0~J¢±'ÅøÙF\”§eEnð…Ñü/¿Z¼Üæ²¥7…0EöÖÛJŸíª¥Î»0>”v‚#WXIú­ƒ#°x±B¼¼ò§v÷(räZÁ| ‡CG®ò‰Ç Vl¬ønÅÆ]lwtä òN«§AÇe‘wv ýÒÀ‘{«áöÚÚá“ÅUj0ážÁ„éç¤FK¥‡Cz+¾£7Îbû˜#5&^éwã¾΃c ”*¯9¨vÇv/Àä°$VM"09çØˆª€ÿ“å[Kd–;›uÍjpÁ&­Z܆ٕuQ¶Ý­"¶ bÛPbzz|RSaºš…÷8¸'ôj Vw¦ú¦á÷¥²¯n2K.ô"ë-7r5·ÑÝ^gà!%wë,\ÅEéîà ̄ûŠA¸Óëÿ>z÷”Q˜Å€Û§ŒPˆ¥+V|·Òé.¶;3"1ƒJ÷$ £wßæéËc`j(ÀÞpK&+¾[º¸‹íAZÔ䦨çÄ` …ƒ¨á¼i…w´ÆUjgò?kKÝŸ»)G¦*å‹ýL¡›Œ³î[¬;¥¿ÚfmÃñ.5ß­kø‹íʯ«Å¾·š<9~åÙWží$÷¡Ú˪0^¬’ÿžl·»¾Ù* ÚK¶Ö“펺/”t·m÷½Q+`**ÿÔ÷…Úÿs¢ï° endstream endobj 2896 0 obj << /Length 1464 /Filter /FlateDecode >> stream xÚíZÙrÛ6}×WàQêD0ö¥}êb§IÚijûÍÎx‰²5U(—¤’éß÷‚ l–"R“ºíLnàÁÏÎźE½üp989ÓYlSèrޤÂÊr¤-5E—3t5¼¸[äw‹Ñ˜I2üþí+ržÌ“,I§‰¿üu’®'ËÑ»Ë×'g† €Š;@¡6BCw%e^ÐfxâLX÷Òàôrðç€B+‚è# x•K4ý0¸zGÐ ž½F kЧ²å$)ÁŒ+8_¢‹ÁïR˜¡5LI±žK^Žë1bdøÇlš%÷÷“ ˆ‘aq“®`p7yRx¢×DøKK¶[ézr‡—wŽ5Hs‰¥(¹»û’*̨@ [cQ– ylmûݧ0¥Q›<0u­cñ«ÕÄß|è6=Ô±¶Ìl ˜Ý"r^) J– ‹ºÂLc£+‰iáÛ‰ƒ®Æ”0BjÑð õ ¨£À;\Á+.&ªOa7Ó¦ñ"sÊИb©¬çøÍ.‰¹Aµ†w“t¶L&Ãm#’r¬˜î/`šø‘M¶EÀpÅ1 :ƒN©¬/v7“<¥û#ÇA#`‡0¬”éOœ&~¤8Ñd»ˆC$¼¬¼8k˜ÏœÝí”)'o¨ˆ[ÿk©Š²\ÐÆ,âÁq§á*m°–¦ŠÁÒtÀU‹»Ê^OÓ雟~_/qE²ž3º°öŒ9…”¢MÒèÎàcåÉAI£„ìÀÀÓ[Ò(9ÇFÊÞl&À³™x²í“F ÑK;NÒÿä¡ï8Czf £d°ý²ýí0üÈ`‰&Û!'‘Lajª-ÆÙ«_N›ŸžÚR0½_/XéÎï֊¶–÷—Üø‘ZE“í¢•˜±=É=R°?•ö°YöÙ @—tS /̱ÓÍme¡&ƶ²´Õýz ‰›{^,|“¤xx~Ñ ©FF'„š÷gt~Ü|ˆ'ÛÞè„$˜0~$£k††‹r,@*¨u6àGJKvËBsÎÚb¢*Séž(@ªJ¸ýy‚`.kíÏ{üH£ÉvðØKÂô«–uIt…¥?Rœh²]Ä¡.åW‡‹³cÅëhúÆgô—(1qcËô¢VbR¬*1ÁÉ5!|r›¿pW°Ý_wÅâCR^ªa^Œ¨+Ôn%éìáJ³$MܾúÓ¸X,—V2ÌfÙC/®V•û«Õ< ±­z¢¸¯QÔÛMWY–ä÷«t¶Hoý-_aY®“ »,cTæòNYMGèérÄåDQгØUåø¿Œöï)£=™µ½ßWûЬ§5øÿgëi™ËQÙb0;aûÛb0—íÍX›ðq¾MµýþHb®Í‘öYˆpœBšn™ëc¤ÇŒ1L9í/Pšø‘‘M¶CÆÀIµ{Ëhmö3¾Ž¶iyx!AŽ@5ëO­&~¤ZÑd»¨EŽI—S#c¶T†‰Õ0pÖê·BY2™äRTz%{s)* [íooÞ„‹æhªí]Š ‹™<’K•â‡&õì~D!ƒ$´?› ð#C%šl‡…rŸ1ÿ“lŠ2Ène6àGªM¶‹ZLÃñ9üwe´,øÏÊ6Ç-%Tl‰8䇴 à¤õ endstream endobj 2825 0 obj << /Type /ObjStm /N 100 /First 982 /Length 1569 /Filter /FlateDecode >> stream xÚÕY]o[7 }ϯÐãöP]Qü4ú¬Å6,hú°­ÈC–[°Â’èþýeßÖ]ÝUYÓ ‡—>W¤Ž(’Rri5¤Kk¸„\ž*¹ A¨¹ AL]° ä?§T»¦ÅZ0a3«u…Â]“C)Ž!5w„j]£¡ágšºu*Rêª Iº®¥æºœÁKŒž Ríº(gs‰!w= &CÝAàØÜgNªÏ`2í8X+Õ=ɰָëIæ3`¼–“Â2÷é1¹Â0)þCuÚ¤t†ÒÜuxTs`#× †7ukÇKbØðA‹tø*¸ ÑÍPU|Zµë`£å®ÃW+]×'r&Hæ:L‹)u]†¤nCRs&Ug7^±zœk×Y`f×aúÌÅuVkrãp—­¹C kµã@'·Ò%Bˆ$çÊrÜç7„«¿a 5ædÎ.(5ØNAÖSÅ’aa|0¨4î:ŒÒj×IД6ŠBêœDòùÂ]¥Î)BLs꺩û‚4wNÑÊSrç_*Ó Rœ+8®Ú9­°¡SФÖ9E¨¨i×Á†õÈ7àJ Фµó‚ÉXÊ>FÁȺ.ÃrÁÂ^ñw±(¦}o`(³ÎÈ1óY6ìD+9 QlE»£øÎ„„Q< $ŸeC°Z㺷¿¿7=ÿû|¦Ëåêjo:zýûUþñlù×Þôpuñrqñ"aç§ãéÉôtzô‚úÃÞôlqz^dÒèÌaóDòb!JRbj܃°¿¦£0}¿z¾ ÓãðÍåŸgøÜ;[ž]}îßßÃ狆%*é„YbÂP®[ò¿üX,OOÎ/çç'7èqކ_ST,)UÈ^)Zj;Ý9zòŸ{?ÿðÝ£‡GÛž<Æô*V4…gaúå×ßÂ="Ì*sLH!Ëׯ^­`KT„bC>3Ö†Á-Ž:õh2:.Ö²a÷ ÕrDªk‰B£`K‘QÊÆÀÒ"Ë H0qtù¸æXóÆÀ¥ÄšGÁˆÑB£`k± ŒµÆÒ™ËñÙÙÈäùe‹ð,£àÔ"ÔCXjØ~ö¯`>X-¯úÞ>ðlÔÖ/x‰J³ŒÇ¹¡¢Ì´1Á éåutF!l`e:¼X-dÂtøø LÏo®ÂñûyëðäÅÞôÎ,–W—^µ»IOO—«×§‹Ëu%ﺟ/ÏN®Þ„žÑ´!§£t¢‰ÕsÕáÉñÚ^Öøž/a¿7IîVï‘6B…¶x=óãÊô›’c*Ñû‰¹äþ³[,9 Ãè~Œa¹_ô:l(Eåö+ÎÌ‹ Òº‡ì¼ a‰IôyÙê ¼½ßî gnÏ‘¯Áü^ ¶^>^ƒù:5xØùK< nýïU¸àL2Fª-EÇÀ^+ɱØ?Iò(½2§Ø~òƒæDƒÌi†Ï:È Ê{sÌj£`´Û2ÆÙ#âè; ¦˜’Ž‚bp‚9\±„U˜¢ÆQ&ìþ:8254;Y¾ŽoõÃoöÙ^çr®s9·4 4 yxdôËÔ~#¨lÕþ†~—n¿´XDˆ¾­-Fx¾fq¹¡Â_%f¿™ ?–™î€á„„*o9Á3ÓpÂhçÅï¥6œpÆY®µÛ'Å›EF1ŸIq‡8ß 'ĈQ¿ÙzÛ—)RbùŠû2+×¹ÙF²/Ûæ¥ Œ€³:ΈÖQ/P"EÁj%æalÆ9ªŽ‚;ZÁ8±ùeèØOS£ëÇ-c›ŽÌ‘1ê3#*ÛÎNk¸´~ë86¿iôÙï;ÊèÈ™8ò¨Ï瘼ó^i8­;‡!05‰Låëèžš}Ø=5ùìî©Í½R›{¥6÷J¿Hg$hYÓö­ˆgU»ý䮾qÒ»ìn ÏwSðüÖø]·ÈŠnQî 3ÊàÄÿ{:sÂà„TÿOÉkz«ˆmô'KÞ.0+² ‚kôëÆ1p.±î<#ïc¢mçMõ°*E$CÑeÊ£à)m1÷cR0D endstream endobj 2931 0 obj << /Length 1618 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WðQêDîÚ§^’4±ã¤Ž2}p2F¦,NhZ%)gү„ìˆL{<Ó™8”H`y–g¹{€ö.<ì½ý6=ékO#-©ôfKOH$5ó| GŸx³sïlüae«h2¥}ÿºüp.Ã4Laùõml‚xòyöæùK…=%3¹O‘â>Ü®°E¨„ ¾?/”k3iôb6úgD`öÈLeÂ[\ŽÎ>c﮽ñ0âZyߊ‘—ž Q&ásì}ý5ÂMÇià¨m ‚4/±d…_spbBñøëù" ×ë `xœÏÁ¹pBÄøÛ<âxž…y‰øþH#-Ì-Íá•åC>æžÏ¼pœD"J¸G‘VÚKCoÙ@ݶvûÙÝPŽ„’õ JÃÄŒvµ_=±¶ýú‰w¹CÓ–Dšê{[L/¼òÃiE5PZPÍ›TS)¿â:Jò’°;íxgS‚)ư¸ ‰2‘Ð4%L3qQß5]¿C­yŒsÄõ¦ ©Kœ?ÝeB ¦¼ÆÀUœÇ¡dü¬kT†$õ‡ š¶}Ç qÛ!h˜dˆq 7ƒ›ÑÌ|ó KÈþè1AÐ šƒÉÁI©†#§mß‘g°}ÈÁ&Ë’œÅU’åÝhY¬ ­·Ø(|½zÛ\`3lêÂ/Y–ZC‰Õ.…Á:ÞYÍ¥¯/TÓE!ƒ’¯ªÚý"YÌ&LŒ£Å× Îß›ºŒŠH¡N oËiWå1Û¬×qž—߮Ͱ Þ„h2e`äcVÊÃÉÇãckdùuy•–ª`Ö`œj0#µlh?ò]/©RõÐ_^^?®Í¡åò'ŒiŸ£C3ê¦ Ä#%ÂàY‰FãHaQÃøÙ2ÝB¬Õº™5äUe¼|rYuŒã«E×OúË÷Â2©ã”4b½à¥ÌYQåm©² Ó=ns†Ì™)À´Ê„;‰ÍrT§ª¿óQ²Þä7axôÇï§áº¿f¼¤Qð%÷WAѯ€ËÛ#GíDŽîÚä“`‘‡iE‰Ñ›¥º¬ÏAvÊ !¹h½' âèßšÎ<º¬øÎòFÛ.j¿b*|RmjNÃ|“&Ùm)ÝI¹Ù°xwœ}øó5ü›¿;²Å¹•£Î‹E˜eËMŒ*ManÂCN‡´r­‹2Ï‚â½ÒãD—‚<;˜Œ!%Ä`ÕÛ²ïV½ÝÁv×ã‚ùˆpz?z< ®Ãþäd¸ °ÂÕíÝ,ûŽ±â ¶‡ÒT"¢ªÅÛË×Ç/Ú®–âÍßÏä¹íÀåê`®Aš ·d²ì;rå ¶WD JY2õÔ4®î[Pß¶‹Ä}Ž°ÒŠ• ˆ¯Ãôà=$.|¸í€5‹s‰|6\Ͳì»Å¶;Øî5‹ Œ0e÷T³Â´Ž«r1üÔ*méûÃU.˾cÄ8ƒí‘ 9ÓKþ˜Hœ;\©²ì;’ã ¶9TÁÚV<òR™\j§°X¢R똞º­Ë’à2<¸È1ƒJ°È1 L’ኜeßí­pÛ½È1I·Û[ÎEî&ì÷äVgŒ+$Åp5βï0Î`{¤QVtQµÆ1f4ñpM˾#9Î`ûÃa²j/ÇŠ—2ÿ¾»1tûð>ìP£Ñõpì´í;²ã ¶;̬(ävùŽ.¹®ÜÙ¸Q†5›°³Ï}d£pÑ’b˜掖”QHEߦÚM/\kvnÊ/Q²ÛÊj÷~Ü1Àÿ·v†kítèçXÅ: :³ß§TyÛJmv;¢™@sa®€tUµ<Öi”,¢uÄÏj—ªvB®®o² Ã÷I³µr2›<9:ygz³Ÿìñô"å³7Áò“j`T85ë‚4 *´ß¢|Õò:ˆ·´ý¸eѧ¼Ý°ÛÓÎòûî-Zm«hT¥a_¼"" éL lEDØpú©aÛ­:»ì¾ "œ?#¸ŸUЖù'¿ÕG¨0'ÃEJÛ¾c´8ƒí¡åh9Fõc.ƒ$¬èpä´í;’ã ¶9PT˜ÿØ;}EpÙé#„! D<€&×¥]%yé™»&¿í—ßÜlHñC~øýEëS endstream endobj 2967 0 obj << /Length 1483 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WðÑêT0®$Ñ>õâ¸NÒÖµ•¾8 #A6'2¥’”3é×wA )‘(˜u;“Û)ò`gw±»nœ~N_D2H†4 Æó@„(”,ˆ$Œ Ƴàæäú.-îÒሠ|òÃå…™\©¹ÊU6Uæò×$['‹á»ñËÓ1b ™äE1`¹ ‹Ð^ˆâ“S3P.õKƒ³ñ௧p@6BÀ«LÓûÁÍ;Ìà³—F\ÆÁÇêÉû@Œ( a¾® p­n*H07ñ¦†‚ ÉPwI6[¨Zøæn0Žb,¬ìßU’ZhgãbD¥´O«Á«yRÔãb±œ&¥š™Ë÷Ÿ*d£~~˜ÉÕù ¸©>7p“4KË·X`ø%-Q`EäÈÖÖyÄÒwF¦Â ä}˜MsµZ%y¹Cy ŽÓ¸»ògÙôÕÏ?]©Õåˆ])ñ0¤ú*MÞÛÝ(—f,TýH®’Ž™¾Å˜ªE½?i¶G½£ˆFmõ ƒ¶ƒThw­Òlµ®ÅLò<ùd¦ÓòÎ̲ä¾Vk9ohã .£ÆšK¹C³Ð•*×yV윈¨»è±’êú— ø™üþªÞÚ¹¦¥–¸XO§ª(æëª—' O®¤a0bÅQÓÐ'`JCŠOÍ à€Þ‰¡ PpMÀT>1Tƒß·íI¡õÐù Š€ëÖŽA#ú¾ !¢„IØ¡\ó¦ï·ÐvßÝ^€Qj|ƒKôþð&Ú´ámÔ:d&TV"ýEµaÛ0SEI¹#H† öb@íeËä¶q \L1n˜Å&Âl¬ÁB l¿ PØ`½QÔÆ÷äÈWØmJ˜ˆô !~…Òp¢Ý¨ÞÇm2ìÁÝ:*À‘0Ó! òÍçbqÐxpsN6žoõaB¦´?Ûøžz {€—±!ÆRÂk%[“¤ÈÈ~o Á×¶Žñ£¸Áaó½qÓÆ÷äÆ[Ø.Ü`EMÎt™åa´Lïàl±!$"Ñ‘ž·IfŽaWIJJÿúb×Á÷c×_Øì (1˜¤ÏÍnu&ºìêôèûƒ!¡O~´«rjå–l(œ¨8,ÿ+í´LïÕÑÉŸÐeXHúKþeHâþN&ßÓ?¼…=<ÿ4BD>Qúư±ƒ¶­ˆ~­{2ø>8ésd3‚è,¼Ç˜ÚÆ÷´oa»ÄTíŸÏ›Î¬ÓoÑ9m|Or¼…íB†ê!zöÏÆŸ3KPO>ù™·«Ê£á¨î^ÛvUyWw|βéxÈÄI:ý0$`Â¥í|¡¢íŽ×zµZ¤¶ýg:c‹µBÃ÷ß¶]h†ßÞ¼~í4rqUNÖPhLfI™•†ëd‹°þ²pÆÀy¢þ|¾ß¡í/ìáY8c!ð쓆צàZk~üÿ–„3JÁû+Ü|O“ñ¶CžÇàÜǧàÖ`Ž&†è&AýDß“oa»C8ü¹û‰:ì‡ó‹aÃe–ƒïɯ·°]øÅ ‰¸.° ÈV&l)Y¨Ì§*¢2B ÿ+UB0«ÏVE‰®q ûN—™¹QgÕ?ôÍxyuñçP¹'­Æ_ˈ7*;ª‡…¡ìž°Trä'ÐÛâ©{¨%u*‘f¸rçpÎQéU=­ [zl™ìcÁ^.su”íŽÀ/c(ïvêSûú6—‘äG˜1D›öWPúS²]\EaÿÑï±<‚ïú’‡ÈhþÛÔõ;fÿ˜ÒÆ endstream endobj 2992 0 obj << /Length 2167 /Filter /FlateDecode >> stream xÚíZ[oã6~ϯú¤,&’")±}ê%ÓM‹Ng“´@1-ŦmadÉÕ¥S÷×ïáÍ–d;‰­ñ ,0Ò¼~çFsÌ|ñÍýÅë7± $’‚Šà~p„Œ‚XB“à~¼ïY½È.¯(Çá×ïnlçVÍT¥Š‰²?J‹6Í/ÿ¸ÿáõ› ‘&ÈbŠÃq†¡ lˆ“ðµm(“zÓÅõýÅŸVá€lAÀÖˆ“åÅû?p0…¹Œ˜L‚få2à# èçÁÝÅ.p—±„tpxšœ É,–ÚðõL¬ªì¯UZ$6m­ª‡iÚ¤âï˜cøO NŒ$×gèæûêŘqÄgµçD JX@‘LdP©`ÖÙ§¶t÷ÊO„?À&zõXúND}ú^Ä/9¡KK Iå'kVóÀvnnA‡F·¬«[£$vÊÍŠÆ*ì àýÁã];èš@—ì` lÐá&v‰zwémŒC¡ÁA\H‹ð_‡Hp%Agá"-¦¹ _½ÔI„Ïg.}ú#Íe4ؘK$"1‡Á¡„w/¹‡´.Èóv#À:ær²j0EB$çSMŸþHÕŒ{Œj0‡Íªf²€«¹'b ú¾tЙa ;kµoïqíkMH­<›ÖôÇim<Ø#´&$CRÆîëšý£®ÅHpyÚ-èÕ–«b¨9ýuþê¥ÚKÓ1_çA{0†"F±tèoU:Õ‘7|èž]ˆc]R¦y«ìĬ*—vâÇÛo®ÞÝÞüzI¨ ‘ ¯Ž:²'±.›IåÂ[Hº¨ mȺ†ûu0Í ˆ0wRˆDøó/÷¶3È¿ÍØ²­7ë–oËmS7±¶mã º"ÉßûGMÕLãOÛܽùÕ¶†ÝH|šãH†µr›ú¹ÒƒãÖn›Ùv]¶¶S(ÊT¡MóÆó¢‹€<]Ḱ¢0rýÛU( 4ã»Ô?/ëæ•Ëô•«lì…Ö®¦ºé ¦µMÍÇ×w\IÒ€ˆ‘Œœ™¿-Í^@³H5†Ã﮿½ÕöûÛ»{^¿íýÔ® Ø ÌÎi©j»³(;T(]›H«Ì7 ¬3•Oí"çK0h^{‰pÞ•KÉ1j v6ë•9 ¦ÒéÔvV©#k5 ÃeêŒÖŽ.-_mjAû¯Hw—¶çK†`zlט g LÝU=œð;Íçe•5‹¥ö@‡oÚ ÖV˲RÆ¿:[-|}xm[+BèÌÛ´J‹Æ*PŸæ°åeùÁãuÇ•öRJsûã£1#\w0Øç¢lç‹}ÞjÕ‘Õ»`x˜-W¹Z*ÈGˆuöÚŽ—³F¶ë`¾Ð˜pÏ ÿQUi‡×½Žxƒe•…K•z‚Îø`К. -MF©¾(ìèV;ª_̪t©¾°Ë´‚ “QX»ySó×-Àw­ÊºÎó!’Ô7Б¸W‚>çYaäªSs_VMgͦ¶¨¼hSÑ[.WiåH|}÷ÛýîúÖUgÙÄÑ™”E“f¾òW·~°•Õ2µTÿÿ¨ðÌ£‚«N X† bˆ£Yîþ¸»d8ö¿-±?•Æ(ŽéÔMö¾ç @œ "¸Á Ú¹·HsÌÖÖ¡½¥´1ûLú ­óTüë¿pdû ý"ÎXœÂ×ÓOÛ¢þ@AÏ©… ó¾Z6iá;…´†œâ6;çâõ„ üÁeLC=$HDŸý‰Éqáj6ŸÓM‡z†µM)öÜk’ãʆµU–>úÛmËÜ®"ŸfwWZâ¹'&}£Iö¹ž˜ž¼ž·OOƒ×‚ç¢6k÷ý$ƒ¼ ³SþDò¿%X«´ endstream endobj 3013 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚí[QÛ6~ß_!ôI>d¹"ERbûÔkw{éáÒvwï€"-Z[¶…Ø’O’³çüú9¤-Éö®mÕi‚ D4E¿áÇ‘üÀ›x÷ÃÅßï/®n"å)¢$“ÞýØ’Hz‘‚gD½û‘÷Ö¿›fÕ4\2øßþü ·é8-Ó|˜âÏ%ù2™ ~¿ÿñê&¼ ÊPä#1`8c‹2¢Ø¿ÂãJwº¸¾¿øï…VG7  k(¼áüâíï7‚w?zá*öžL˹'h@X(¡<óî.~¹šŽÅ´ÃÙ”(ŽX*ã×8Q.ià¯õCZ¯)Bû-ü¥_@”жõã‡ÚD÷¢PÁ Z]/¨$Œr+¯L½q^ÛÚîÚí'"–n4Luë¾öí㮝ȩ=d„¦-ISXc°œxX¸µœw†SÞä”E$Ž,©Y^#a{íxolMþ7Ô7ûBK%¡¡^ öŶ1­Ž!ç$¤Ì»¤DH…Èþ¶Ï„ aì5N“|4ë"ñ_ºiH$‹Î·LÚö{.“Þ`X&¡ IÈ% ƒRÑLjïÒU{¢…"2âIÄm;‚µ€)ãó±Ö¶ß“µÞ`a-ÐYÝ:dŠe•LNŽ"©(<ÕÙøèØïÇG°Gð!'JEk>Böp '»ìá„ĉÄùøh™ïIG_¨Ç°s@2l ‹¼:‹á4)ÿ¼Ä—å'Ó*‰=¯mû=‰í öf£‘à*ûfY>KOçCİçÏÇGÛ~O>zƒ=†Éìè0ж¢‡¢vìì ª³ƒj†O±¬Oæ‹ãÞ÷l|µí÷ä«7Øcø‚“•toüxaD¤81ác;‚LŸ¿9˜8Nâ¸×q±óÜ{˜—,„ª‘_ãi§Òg\î’:ÁRbjB‘–XaEY‘ãïyZO‹–—U–O°}µH‡ÙoAÀRû.˳:KfÙ‡dÓ÷ý€ ?Ö…µ ìýnçîT¿] ¤ðÉà2Œ™?M±]óµiŸ ëe2›­Œõ ÎŸ´ÌLØí k´Ü¯§fóuI)L§= ´Ç ¥oöŽM ü×c]'ö4Âwf|¨ ^égìçþîô €ð›!hˆ„qÉŒ+í,@ÝOÿ¾ÇFøË±î:64ÁËù>ùø6uCÀ ä6þëvì J  ¿À ïÝ›Q:Öˆ“嬯>¯ÿ³ïÕ®)¬R{Ô9U£·ë{hñ¹*–XÈSƒJuÏdVÿtëZcLˆÑ4×óù¿€º]…ÏYQÕ¯,’g!-°øÓiÎ鈨ÐÓ›¢6§`n ˆþ÷×ßÝêµüëÏ÷úÞàúMë§8&ÌÅ’é9*Ò {æEUy:L«*)3³Ð¡b•¥³6² •8 ³uì‘WÌ-¤VCOíh…¯’Ñ ‹Äš53óÄ.Y¬Z[fÔ¬ëÀ× c¥–°a¾Ã¢NÀX*ÆV-œð;™MŠ2«§sðˆ³È¿Y–жœeª‰U®_^á§ “eR&yêÑ,¶YQ¼sxíp¹ O Sg³d†?žL(˜ÉµúœËÉt×T YUc²‰!)̳tžÂ‘•b¨WX_Œë4Ç¢u€ûOà0VYç¸ÿ!- ¬z\Õ:qÊ! ÐUgÐ.>¨Ä¥ Uód…5ÓD' ̇¶µµúÕ¸LæéWØLlœ„Œnßgµ}|;Т¨ªìqÖ2¤3¾ÎF;¦¤v! |N²ÜÌ«Ñ4Ÿou¤×‘>JÝ:°ÿ]1_$¥5ñíÝB±øýõ-ž¦ÙÐÚ£Od¹MÕÒÕ¶¢œ'hµù¹¾º¡AsÛЙ *»wpW7qó›Âg;î:ûëŽÍÖç7&°f\˪q‰nãT.åmr6ü|Ä›$ê¶"´±Éo¤4ý±mßSov#Ïû{ÉC¢k.)f¢uÕqZð(<Þåöǯ‘ÞmÄ[aå¿•E$Š˜…*×P×<¼\ÀFíŠ ƒ´·"M6¯0 ÍzK,èzê¾7[Nº.­å“¼ƒ a,;D¬¯J:®1 ‚×µa¶˜ºVŽ0øê¿àl¦#Öqoº‹ vç‘<ŃÅÒ"LÊ2YmÍø]Ü^e/­-Jd$Úkk}‚Þž}AO‰}üøéD8vié<Þ 1íÐ`O—]b"Oˆi0öy¾c¿ß"éöˆ›8¦8 ÿ$uW)ØÏŸO-ïØïÉZo°Ç°‡$Pâ#ë®LÆ$æçÓ];ö{òÑì1|DŒÐPþÕJßû“™°7=#±-ó=yí õZ%6¢d¾÷=d>ÆÁÓð|²kÇ~O:zƒ=†Péç+¨38¨ˆÙ¶ýžÌö{ ³¡"î„ÿÑôtÆp‡|6:Úö{ÒÑì1t°˜ÀYåSÔáäh6«g#¬m¿'a½ÁCàÉ>UAQJùQu §'Êù– .ׂºÜhäPlkär‡F.;¹t¹ä»4rá4rÙÕÈ¡ÕÈÔUX™\Z™\î’ÉÛ€ë=ÆùFFßÛh=âaÈÈäB¢L.ºÒºØ#“ «³‹LθӅL…-™\¬erý6uC´.ë8Êä pPhËäLl†jJÐV#| n-AK'A‹ç$èÖ¹èÃ¥höÿ.EË/Rô)ú‹ýùHÑ»þ¯‡ïtÀOù¯^}+†Ý endstream endobj 2924 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1535 /Filter /FlateDecode >> stream xÚÕYÛnF }߯˜ÇöÙñenU„ÄE)¨­Šm#(¬Ú¨(A!Tíß÷ØÙ v©SBP¥(ñ:g<ÇÇNx––JâYzÒj?Gšþy&…@%QŸ&Pbv 'n®‘$äMR]S“]@hIÕ5°;3R×ÌT‡i¸¤Æ¦aJ­»†S'×Hê š¥£˜FJš2`™k¢2Ø@-ŸÃ;œ­Ã`œH§D$QU2I!fÖ6qÖ¶î:¬í캩5ì?i…AqúQÍLÑ,®ÃÓƒ¥Øcz¸Î—ý¢xÀæÉ#¦’‡Lá$“EÈ¢Ãîs…)bÜu(Óuø¦â:˜Òá:ìQÙuØ£v×aF®Ã·ÖÄb…=z1]n˜ù‰eRÈWL\Ÿm>[I£›DI”]bÜ©ÝÁlXÑ‹­Å¤ÛafÇŠ>{t¬â:¬~3pH¦[ÁµŠý’¥YÄv-Íìu$× Hî B§ä78JR{ ‚ä9ó*ž4„Šg ~¡êy0°‡ºÏ¸n­ÅÏ]µpÎ +Í-7¬g€Ëlä'±á”=qÈY—4Uõ;‡ª~ç³¥ZÅuÒp¬4v¬4„‰p†T;Õ…¤Oíö‚pbšÄö\œ%<$ìfI »Ù!µÔ »®Cò“ÃFd:¼ÉÆ{{‹åýtˆ‡Sñ¬§åO?ÿ?ró£ô oÒñ›—/Ÿ.nßþ8˜[&l#æ^Űuä29j¸d»ó å’ ‚ËÌ¥EÏÇ#®"f¸¡«fÕ÷,¨\1°´,xV10×lO(F ÍUøÌ#j¹d¦`4Pç³ÐXFÆ{y¼r|–ööÒrE§÷EûöŽËF¶‚¼–­l0„:°÷…¸‘Q ÆúvY>:=y~°:K‡iùèþ~Z>Yýu–.xò÷«~ñì·ÕbyάŽÏ^‘­_,¯^Ÿ¼9}¾2ÏsÝ«GÏîžü•ÍÇ:kfÔÓ¡”Ç|ŠýžÂˆÕú~Ž¿s||£‡É™ÓÜrâ\ zß_²X¼ùõÌ?tüÇby÷äôÅêÔw-O—–—÷É?˜£ÏqD&8ƒX7\L/Ö$ ©@Œ ·ÚJîŽGû -¿=yr’pY_½þý_·ŽŽÎ¾¶€]‹#$œ(©NT8B£¡äXýÄgÞêÇÁƒ‡øºõãwßÜ»óèàú\ÙÄ„»äÞ߯l–Ñ\%&–ÚÖ]¤ö-¢ÌhxFGE•-÷ôú!tdŠ5\1°ÔlMN<ò(˜{]ƒ`jÙZ˸VÊ FUÜql$ŒÜN®Ý ÞŵÛÀ»¸v+v×n7¼ƒk·[ÞÁµ[Á»¸vX:.»F±p¹K,y´àù¤1JGÔ2RÎ&€X-ÌÁR­`ü(uWjZæÌ£hðA°”l-úµQ­¤5›}vâmýCâmõÓ‰w¬ùv}(¸ÖmþTÜQ³º vkÚÁð;¢›£â#ŠÜ,6®Q8‚qÿæ{™Öb΋ž@Ñ Uþ2Mž÷ÆMÊ5ýoGÔë'ƒÕþ1:‚„éT.¥Ì‘W§G~дv¹;ifã#ÝÉeôºv4Ð ÷cvâÙ£`òˆ‚1;ñ¶¡e+³“ý=,&ÍBAlÁœUƒàj%Z‚ç«b.G±h{4x¼ŠD¢( ÂÑX£– Ë‚Ĩ<£`ä>ïÓwFé ‚‘ÁT¤…ý±òŠœbõþgΜü!gÎòÉœÙdCŒºƆEÇü,S+šð>Þc®æ cŒÊÞ§nŠq£ž{kW)Æ×DOIy©y‚Ÿ7Ù> stream xÚíZßoÛ6~÷_!ôI–’HIÜžº6íÚam—x†¶›¶…È’'ÉÉÜ¿~GåH¶šØVö!@ÑüqüŽßHÞ‰:S‡:¯¿Ï^EÂD„~è 'I('ðŒº³¤œ%'§>§îóo°p®&ªPÙHáÏ?d¶”éÉçáÛg¯bêÄ 0 ´@ù$fLgdy…Qì>Çτ48þxЋ:Þpg4|üL1´½u(a"vnMϹÃ=Jü „rê\ þP«m*èQ†€XSCîÁÔµZYäÍ¥ðaQPÿÙÀ¬ån¬ZL|!êž×'uÕ‰ÇÝ®M•ãV«X-*üq›T3²!³ Ö‡D‘ïœáó5Ôe)§ª/ㄇ|¼IV´SU ´r¡FÉd•dS u&-è ,K[JÖ VIü€v< 1[Ú%7]<0BEpˆ^‹¥Å-‹B®îÖÝ"Î’*‘iòEVIžaÝÖHª¼x€Ÿ¢¦&¬Á§*ëÀï ½x)“/Ö¹òI¸—Fœ»pD$ö69éÒÉ H…ßž“±¬d§Ó<ä*¼®ø&ðïÍǡڴh°Ö•ÃL<Ä$<À5@ØýÈ3uâs÷6µ 2Mó‘¬Ô¸¥EýS«ù?!h"Úüˆn‚FbÁûiu£ñË"‘W©ÚTn›ÈûÕÝ^­pÛ“DÔ€uÊ≠G:WÕ²ÈÊ.…9ñx¼³Âëž ‰vï,¦Î_œñÅooàïòýï-±¶1™hÅí*”ËÑH•åd™ ÒkläZ'ÆC°NÄ‘u s2¸Ôöpr Åers©ªÕBáþþ‰r ÿNN€V˜_?^olù‰Àd8cć=¶|]Ͻøà >°`…r&Í=¾%­»v{‚Þ\ ÑN€‚=Ý»¯|f¶`§7Z8Û÷Ó×DpÄN£ãLfãt‰ûtWSÔ{<çdz”¶üž–Òì–„`Ž,„É8 ™ß¼\Ú#ôÝBsA¼HFÜ–°=Xó<8™…Çc­-¿'k½ÁîÜ£Ã8ØÃÁCpÙæ}ã >(\Ø‚èx|´å÷ä£7Ø}ø °BwgÕ*ð/wä¤ë»3!,Ö×Úøh„lÈïGH°{„O¢Ð·GyVîHÇh&‹o÷îÃ+ðAÌF1\lÄñ˜mËïÉlo°û0Ñ•Fw׸]=m}¥?ˆ0ZGGK|O6úB݇Œˆ’˜ÅßÛͧ•ãAùh¼¶å÷$¶7Ø}˜BâXàfY7cx=mù=ùè v>ÔÙß¶÷èLÛw¾ê<0€¾6u_žCÆW[~O¾zƒÝ‡¯ "¢Nºtøí!?ð…wmk’¦C3¿ìLœ ÌûÄfº²3]é'¦-.²¦{†¡_ˆXS…’45»0y ¨¨S&ô ¿çªšåc,/KLg@“ÞøD©¯lÛVØêasœ,ãèfâÄOƒØw‡3…ýÚyè/GÕR¦&²h`¬'­õQE¢cp8¡d–¹ÕÌõa½Ná¶(8ïJ2Å¡kni€†y‘ûf‚uݰhæ¹KŸÂSp7Ë¿2æ Ž¨Ú‚( 4*™yc» Ðöþ¯!6^øÔ]bÑÐuóeYÙVÛ}¬šWÝ`ç®fí:(›Á0*ë–Ì`ýÏJ|ów\š—ÕÓ®õ+• oƯŒªË˜™ZÇ11Pjž«|Y‡Œëðp‚á|38p`Íö]^é±-LþŒQ÷åÙ‹sm5ÿ|êXØÙ»ÖOmÚÚ!M¼ÔŒçªÄ‘Y^aU¦tŒV‰1)¨X%*c'ëP‰‹¶—®­”FîE>·Z®#µ¢%6Éñ iÅšäTÌ¥5¬YYfÖŽ%Ö.fhúz›cÉ2*Ü+ ü‹6%oöjá„ß2æERÍæÚ üÈ}µ, o1Ï eì¸1áëÉK|âBaº”…Ì*$PÏf±¥y~]ãµÓekGøÞ)þ¸Õ+™;±Lám³œÎº–éHÊ ÝZè|‘ª¹Êªʺc>©”u0««3Pe•cîUäXuµªÐíøªªß|²h*Ñt¡jnò=P3“Ú=ñÍc{[©O&…œ«'ØMl”„w§mO*ûøv¢E^– f[Ö‚ô»Uû}sIìUÑÙ•"™&™YWø{Ô´ÎÓHX ›’«Ú´)ÃÒ¿Èç YXÏ/Þ‹/ÏÎë¤u2²rà’QÉ$+×YŽuºt’s‰RïK_tŸAý͸rG⊒Yl|`a…ã”ù¨«ÕýûJÓÛZ;ýr·ï?®Óé+º‘€|üHâùHbþÛÎk3ÿ¸ª’ŬîUûÿÃéìÈüÒãñKÇ/=¿ôxüÒãÇûÒcÝ·ë+L|ÊùóWßÚ< endstream endobj 3061 0 obj << /Length 2261 /Filter /FlateDecode >> stream xÚÕ[ÑrÛ6}÷WpúDubØ}ê¶v›6u»¶º3;iÇK”ĉDª$¯òõ{A€Iɶ(˜i3“„œ‹ƒ \€öæö¾?û×øìâ*”žDRPágHÈÀ %J>ÅwGêš|\ÆéÉb‰BI†S£ï(‡3Ù>z„¡íû¾CRÛsžt¢‘l;O¶)O–ŒG›ÃIÖÆw”Ì™lÉEó=åA^"ÁOžï@2Gc&LLµ6¾£jÎdû¨ûB"È_½ž®l`¢ÚÁ”mã;*ëL¶² ¨bzÂ’–ºx5ñê`z´ñõp&ÛG*eìÅ%-<~E³E]–3bÂÙÁäjã;ÊåL¶\$B4âG­gá‘ÓÝN¯¦ÏÛþy´la¹¸užOžˆrØ]áÈ2¿4çEÅèœ æOU©LjS$éÜ$‹u˜¤žÔL*›uJµxÂoµœgyR.V`£¡µÉ¡l¾ÊòXë,U }Ýxaž¦ !1ߨ\¥eÛ5·e–}¨ùÚæÒÚ=4M=¡¨¥ùñ {BUkVËr‘mæ‹C]aäHŠÒ8{Äýdµ^Æ«8-Áͪù¨0ùÙ¬ŒS“´0ÿ 6YÖ8æŠóÌdÝoK=50p“ñ˜ÊüU¬j@;ø s›mLÖJmM΢1¬mi‹úÕ,W«ø+SL \ø…}Ÿ”ö ômCë¬(’ûe HOºz*8Ð%Ö1xq2OÒª_á¬GóÊZíbйINãzTSö¿ÍVk•[ˆon¯1Éï.oLâa‘L,ì&J•¤Ö©‹Mܲ|¥ js¼¸"¸¹u á ûaàâ*j®TCæõ—¶t0[‹¬éRÖ%‹Æ÷= n:ÀRnM˜XO˜™Ôë;iÄÍ•…æL]¯wíïg»5þy{ÏY€tÎ9”·NÕ;&C ýMî,>v’§õx+"Œü¨Ò…!µTÅ#ÕÇSç_Æa³w‚D0ƒUlçõˆ¬fƒÙÖ8t5Þ”%].êõcÏÈúE=­¥ó¬ƒ0+!Ì™kW†° N±k½±¼Už«í®ßkéM7ƒ¦ç¥¡(´KÞFœþ°'áä×1k‡žGf5c'‹ª¨ãY³ ÞŽÈž&vï³oV û[`Ï‘Æ:ÊzXnNuˆójöŠH¶=¬y¶ïa‚¯dô´’/öÂëÚ ¾&yÐÑõ…6f¡x}_³áÛþdøÒHy—ø_íg§ZsȽ;lŒEðÙËZQÿÔf¾¤95h9Гî£cÉݬ2¸Fuð5s&ÛC3"1b,øÌטH(`IîcTßQg²}ô%bÑîÞh@ý:xhz=^Á¡‡†ûÜÔÁwÄ™lAD„xµ}÷Êg¢®á”mã;*ëL¶²<„ŸùjÈ9 ÃÝàìà;êáL¶ ,Àáßïj ª8x0ÅZðŽ‚¹Rí£ìT‹þžËÕ±èp78;øŽª9“í#eÕùå—z±Œ±¦lßQYg²}”%ÐCÁg¾W&M¼:”mx71œ©öÑSÖÿ_ñ•3‡¥,2ÁìPjµáÝÔr¦ÚC-IP4Ôi÷KeG¼ 8ß)ÛÓf§ü¿Öÿh…*1 endstream endobj 3095 0 obj << /Length 1913 /Filter /FlateDecode >> stream xÚÕZYsÛ6~ׯàô‰êÄ@<Ú§Nš4u[ÛíL'íx` ’8–H•¤â*¿¾»`“mŒzÌØ&ŽÅØÝ Œ©7õ¨÷zðõõàå«(ñ’„Aè]O<’0á^”À7bÞõØ{ï_ÍÒr–ÏIý¯~zc—z¢ ´éþ ²•šÿ¸~ûòUL½†Š( ±ˆ@\Í‹ñD±ÿÒ|‘à¢ÁùõàÏ*ê±G%`)—Þh1xÿõÆ0÷Ö£D$±w_S.<É( xí¹w5øy@­at§’‘DγQ±^VåðŒ‹Ä«Ja+ö•Yê hC˜æ™™Xèj–ÍܪL³©.—z”þNi í\š¥UªæéGõ¸öÃI_ª¼0}•Yâ»!£¾ÆÙõ0”>ž…4ô¯gz{Ú,U°ósÛ[•C湉Ÿ:“t‘ie¶†½‡:c°Rší¨jQ@ÞX¢¦’\øo&Ï™¹Z> Ñ(RøYnúkdCAøã6   <õØÊ5s?þrm&o‡õW\:©=“‹UYÙYíDÀ&å#UÕöÉ­•]9†# €õ²Þó¦‰o~ êä <Ö±kDïÎ/LJ òø½øåÝ»¦YËÂÆj96š`–¶dye¥BÓ¼†C*«·í~ÉGôˆH¹Ñã"¯PO@˜B> Õ·çß\b,ýöÓõïTÒó‹V¾ ÍÊq®K³Ò¨C™é²TEІëTÏdžÈd Ö>ý "rîb—ÓÈ¿ÊV¥fáÊj½¬%Á”Mc©,Û*7 eãÅŒÎ,¯Zj‡#0ñPéâ?«yĉ][ˆ;Ó,Óv0ŸlPµô„¾šOó"­f °H‘ÿjUm±È žMKú±I>üš-„Æt¥ •UZ[§Û<ÏV\fs£VÑ µîÜãN¨zs­`5 ZMg][aÜ‘–U MA ¹XÎõBg Dg¥Ï'•ÎLÓ ü{0Ø Yã„ÿQ¹º]Wˆ‚aFS!ë´r mðÁà:_™¡…Z›‘Y#¬-µåúÙ¤P ý™!C×Fr¿´óie¿ ¾´ÌË2½·pdO&øsšfõ¾Bo®³im-¦ìEašcíâC¶þ›|±T…eñÕÕa¦ùíù¥iÜÏÒ‘å3ʳJ¥™MêråÆA·¼X(ÃÏ>wX½|Ũ0G§À£ T$I¨Íì`§9b›G$¦Ò°_lðl~1˜q”eã\·ÌÍX•€‰]Lälébê™Æåë÷ÞXX³»ÁÃa¥†“¦* ñy{Ï'8rÆ@aÔ•¼Óë“BDüp“['OȹùÚŒ·N„Èß¡j‘( ¬ªòAUsømë+$‘á.«µºˆ¬Ñ`²6 ]Ç›ªÜÙâÎ-#Ý„ƒµlºÃ:ÉIжuÁºÃ´\œÖ´Qºœ9*ç0( vÁÁEÁ†釮`„&ü –+«¡* µ~ —èí²ÇeßóñžíTH?Lu{@²cò߀†§q/‹êÒi—Ob¶å“„všÅ“ífÏ‘i,ïçëN”kUfŸÂތڶ·Û“¡Üß“ñӞܹ ŸÖNŒDòpí²q£ðÓçš­A·}Ž3¸çÊ eÿvžkMWzu'‹IÈÿñä²V¸.š¹Ë?!X’lYÔí ,„ÙÏ*s-RuëÊ¡Gã¶ù¼¹Û»ngR5ÔªK d£ºÔÕª€:²Ã`I˜ŒÇ‹ǧ빫ïÞÀÏÍßoTq&‚Í}û¡¶ÅÛád5'VIÖxB›„ !:‰£féyñP¥#¼ Üé k`!o^†Ú5$À *€Ÿ×EœD3<„ÉߊpX² I`à íMšC-fÝ£Ûü%%”2'À0fHÝ—¿yÚàï¶ö‘ÐäeÒ¥¿².(¨ Šú%-iææƒâœÀÕ´ùTx£Ê¬]ûoóƒ8’‚Òv$˜(¨6. ãÁNlóro”­…\ÂQP|[?Š…$<ö„·­æòË}#RD„‚ø!ÙõšÙÊ-çð=rëF­ªLÔ/2‡gYHâœ,ÍàòN"@æS¥Ùÿ~iÖ_ÙýÓ,ˆcB|¢ÿnªÝ?•a0ØÈ5þŸÉµûÆd·Uqºˆi±ï0}UÝ#^x%¶AVDXËÏáñA(D”Ä’ý(@9”À¥yO<¡8“P¶)VçñéBºÍ¿gL÷VöħÜÇûåÈhðv! þoÈ’n±§;47ø÷‹—þÊ‚oÑ)@poçÄ!‰‚Óù¦Å¾§kúªz€gX‚W{‘×û;,‚7<¡ÇÚü{º¬·²‡ø,JÉã«ÖF êás§LŽƒ@ç6û´sl½Á¢€Dÿ„õ†ûn9RS*Žù÷”¿ÊmU| endstream endobj 3119 0 obj << /Length 1962 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WðQêD0îÚ§¶“¤I“4Mܧ4ã¡%Ê┦T‰jê|}@ƒ”,Kbè$mg’á X,p‹³ÇÂÑU„£§ƒÎgObi¤%•Ñù,IÍ¢XÃ5&Ñù4z7|;ÏÖól4¦¿ýÌÞ¼Igé*-&©}|™›$½?~öDáHAÉŒAS¤x ÃU¶cÐ!VÃ3{¡\›NƒÇçƒ?ZáˆÜ:]™ˆ&׃wïq4…oÏ#Œ¸Vчªåu$F”I¸Ï£·ƒ_8œ˜"Þ¦ Hsë˺š×L¢Ì&#Ї¤å2YcxX^$›r^f×éÅ:-­¯¿cá?©ÆH 3˜¹l[ö›§Ñ‘qŽ¡Ñ˜ !µuó›»LÄT4œ'Å4O[ž ”„!Iãþb¦i¿cÌtvö€˜a’!Æ% ƒ¦¼‹d]ûƒGB4bædp0ERªþÀiÚïNgg è,-8“E±.ƒe2‡|Þ@ChDàÄ;iëùTÐÆ× ßˆ±ÔNVÝåTh]ï<Äe¬P,”‹èꃓºœ»#ûq1911„°ˆàòõˆˆ!„/ªçi;,ìu½Y.ó,Ú§¿Fç›5Vãì Á!€8‚ÖHcÖN^p<‡.3Žž%|Û²Ù˜BTkßrpg¼ºOÖîšç‹IRz¯/o*ËÄcM‚x©æh÷}Vdeó´¿{ÿ|Çœ!ófLÀaê²ÉVrhM(§êøÉgÅrSÞfˆÖ*K.ó{+ŒàütÛßòÉ‘'gvf2)Ó•Æð¯Í̸9óï`Ÿ— @Q\9,íå*-ÒU’g=¨·¡º.Wк=ANŒa*ÙèMZnVÅzW\ DD|üô‹wGÛÛŸžÁ¿‹_~nó ó1³‹á÷Þd’®×³MŽœ“!·5AÇ!;ŽÞs¹­ÞÀf.N£¶Œ‚¬Õµ P¢·“°e¿ÛIØÝÙé­`1"œ~j;±Ð >Á¿6R+(Šº¿B¨e¿c´tvöÞ$¨DDñÏIjŠ›õWq´ìw§³³Ç€C¢þÚfª]‹§Þ¹ÀÃ< ÚîÜÚ‡c†ácÜ_!Ҳ߳Î΃æˆJG‹ÖÀA.Z‹ ùYŠë Zž] ®ãj ÀàqŒ°Tžñ,WéÚ2 ¥|V÷K`e“l™äö±H*¾wYa®ñ^ö Í*2×éj1ÊxŽÒÃKÏùÆœòáù< ߺQÖv_ Ø·P T×rž9ó³Éw‹âì …SJ„SJ„ò"nj##2¼±¯­> stream xÚÕY[o5~?¿ÂðP¯g<Û(ªÔ‹B+ DM‘€(¥=‚ˆ*%©Tþ=ßÌÉ Ù#œKSŽ’ÙÙo=ÛߌwsJ-¤Sêr…@)pU$‘ %Hñ[Jbj(âšJwMês ÚxBe×p¨Õ0œC#×Hhêšz2[¬¡sOô^Lh’¸ ž¥fºœQN<¤ê:Äl¸œ!©ë±ë ¤"æ žÈ½C3Å$ &!h)>ûvk¶80€4 0u[×d6:vòµŽ` yÆñX![í”$[î”(ήcHÍu9”Ì®HÕu…\¢Ø”`£$×ÁF)ŽƒÒÝ.FQ1í­ºö6:–tØ]æd¶4)[ä„e‹­—MÊAKÒÅÎÎbzõçË0=:>^-¦ý÷¿œùõ‹£ãßÓãÕÉÛåÉAÂÆO‡Ó³éùôä€üb1½\¾9 L%²¹B5€}¡F Ü£°³¦ý0}½zµ ÓÓðÅéoGø=8:>:û2<|¸ÀïöŽPæèÄRZ¬’šF›¯¬¸î³~ì?{Žßƒï¿ùêÉ£½ý»se““–#ÖúEJºDn×ÊÈÓp>b þ2L?þôsx@±7B«-¿÷îp+ºhT¸Q…bÇç;vå ¸Å–GÁ\cŒhG9'ø +¦¡ccŒ›D#ÿ1pÍÑxk ¬¡Âfê1é(N´< Fâê¨Èr¢Á‘Y¶š5ÆFI}p²¹"qy0¬©N6—Q³Á¹Gõ\ˆ—Á»«ã3ç],NhÅŽÓFFQÏç2ÊRÙ`¬j´Ò6(ÔªŒeÝÎ/`eÚ;Y½Ù_‚´÷t7L¯–ÎÂáeŽÛ{ýër1=3Ëã³Sk%ܤQÙéêýÉ›å麽pÝ·Ë·G¯¯>g¿ÒAs¨â üÒŒa÷^Ÿ`k’tw=…}ï Ì-o Ö‚¬ã<¼[ú/=E4"ô¯ ×µ}þGŒÑÚåM@ÇRãû¯‰è.bµþ÷<)«\·(úò–KÕˆ"cØíÕH®nt4Qe,µÒ(¸ÆÙ*0‡ÍøŸFæ­Óc’u–€çÀ)ÇÊe ,cÕÁ¥aS¦:®)6iƒàÒckƒ(ÒbÏ×e¾!†ÛF7f>¥«Ì·óV̇CšðÎ:¼[’Á‘,fœœ7$#æëý“ «ZG³áäuºÝ„c4]§ãýý¯ïxkÇ; ÞÖñηv¼sà­ïxkÇ;ÞÞñηv¼sà­ïx[Ç;‡-èÛtpUз¥Ñ‘}› Î öQ”ÔFÁ)Ž.#f i0qLóà\s"x<˜ B¯$£.SíÑ^ÿŒqè.<¸˜©XÝ Ä ÷àb¦l…{pþˆ­pÎ á˜UG3—P·ëÿ¤ýÇ1ìJìùÖE°§ó"ØéSA•‚sž^AEêÓ–·>Ÿ´JªÑÞónª ®UoR1ç×è´?FoìZcž%ŽY0Å\Ú(X@¢£àdvsG×PtÜ£½h7¤®ÕA0Û‹‘<¦Žú:ê3ºç2:²õ1£#ã¤Ûu0@£þôÏÊöm̉úN"ª·ç¤õqÅß•Ÿ ´.nå ¡lý4LÖcM·óª8.§ÏÐÎÛ‹”žøÒ‹”Î÷û]’}¢ÖýsÚM²;èºÒýåD¬ë¯!ƒœ8ÔA¬‚ndOón|÷Ëwœ +%lÒÔ|ð5¯ÙW¤Š•“Ǽø KéÅ¢ endstream endobj 3145 0 obj << /Length 1486 /Filter /FlateDecode >> stream xÚíZ]s›F}ׯØG©­÷û£}êGœ&ž:‰£N’Œ‡`l3ÅX¨™ä×÷‚ X¶@+âq'3ö€Ðîá,çÞݳtz1ùe198ÔYlShqޤÂÊr¤-5E‹3ô~úî2Î.ãÙœI2ýùÍKwrG«( #÷ñ ]ÉìãâÕÁ¡!È â Ð ¡áv%å:h3=p&lÑiò|1ùgB¡Aô–tå…W“÷ :ƒï^!‚…5èsÙò IJ0ã ÎônòvBš3´Á£Æ”[á¸då¸NayΙþåË`ÄÈ4? Óà*:Í¢Üý@$Z²%ØÊâNÅáE‡;Çš¤¹ÄR˜‚{q]R…ˆak,ZEè¼A¶¶ùêÝ0%`U7pÀ´hí‹_=¨6~ý ûÜ¡‰¥°evdKÀÕr''• d©°h*Ì46Z;‰ã4w‚Ý‹ƒÞÏ)a„´£ÁEB3š(Ї+èRÄDõÅ]Ø:mZ¹˜S†æKeÇÔhx¤gIÔa2}Ö7")Ç £ÅK Þ3\|©öˆ®8æBÁ½àžÔ4gºÓ Kéö°)" -;+CX9ÙŽ&MßSo²CÄ!²nŠSfdþeõShsóê(K1ähêtðýÔñ';@=KeÂë4ËûÉ^ÂÛRBZLÁ‚ì4#.WqÆKg<šâ+õO}6Ãå³TwŽ÷Ú*¥`m"u<—Ö¼S~Y™¨0‰£´ºXÄ­;û@‹’3÷!N;}ž§ábÆåf¡… )3£r ³n=“ƒCJš½±N¥lS“8@XÖîíÇfkŒ3kë–YÃ3VàåyUÇ$¹ƒ<ª†õéK‰LkÉi#lŠï«Å9Nã¼mÄn%x¼sÁqqeN0cŽäÙ»3x°®‚™áƒÓå:ß"ûúß+>ÅÁ§$Ú2C Ju{­É­C^BŠ”+áJr×çîXeY$ÏÜ…,ªZt§äêûu{äKÕæ÷—ðwz¼8ýóøèøuñ0þ:Þ2V˜˜èˆÕÊõ c%ÖK¨`µ *ÆŸãü²5r¸çMNv™[Ý/‰Ó&~åëUšmJ.‰©ì_7-kÄæó}}TMçEHUÊeë0Œ²ì|àêöÍ-Q‘B*4ç%{mŠVQ\í´#’`êlÓ…ì{G$ ǼõX ußo¡ö'ÛG$‰Â|Oû!§g3$ÅSÛ Ë0‘㙺¾_¬ø“`ê„…'-èc¡˜X1ž8m|Oq¼ÉÇ@Ƙj]¹k¥PjgÓ½é 50l´Ý˜Úý5ÓSW«G³6¾§fÞd‡h¦a•eÕü›Å_Á)u¦A•ÜqäDK¢Ôg$`WB…Þ÷hSùUpFFõ·;`•à ÅxvCQìÑ"¾ïñÞdûÛ AÀ¬ò½ŽXâm:tÏlÓû°Ü‚ÿ5j´xéàûÅ‹?Ù3$·3-ÓrpvœéñÄiã{ŠãMvˆ86ô± }½É5Ž‚ 7ߢÈÇ‹Ö þÝ"_½ƒÞZÙ;úí×ùÉó·ýêxì{ï ×ñn»CœY nïe­ÛÚr]â+ <\ÚâSj•¶ôp꣔¶zùÍ(=Ëc7þ ò=žá4ÌÄxoü;ø~k”?Ùþ†“Q%Wû1œÍ0è8NöäÊ\ŒpH®ñ"¦ï0¾TxF˜zý˜†“Z†9ïßO²Ä¡VbUÿ ãÑ g5 øXNj, ˆ} ËI•‡£ï³œ÷¿#®‡éÚ_×Kër™Äµ¥sÖ&YGß_(ÿÿh#ì;ÔÁÔì [‘–A˜G«J—Âw­‘«¯A’ç(‘^TRºÃE”F« ‰¿ÖšÞFj–¯ õÃ~U@Jñ­üêƒÁvëc»Žb‹«½i»é籂ÕΡ¿ŽýáUÄœ endstream endobj 3177 0 obj << /Length 1325 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£=Ì ¿?¶§ HºvÖ%~K CuäX¨"{¶¼4ÿ~W_)E;eF-²H ɦ.yÎå=$LÐ "èÕà×ÉàäL[d±UL¡ÉI…•åH[¸jŠ&×èrx±H6‹d4f’ yûºº9çñ:Îfqõøg”m£tônòæäÌd  âE@¡6BCwe,Ê%¼ Íð¤º0a‹—§“Á? ­¢Ÿ@À«\¢ÙíàòA×ðÝD°°Ý•-o‘¤3®à>Eƒ¿Ä˜¡Ž&¦¤ØŠ ˦ב'³#Ãq¾ŠÖŒ óé!<Q2¼ÙL7q^Á½"’À?-1leÑ_qyå€cMÒ\b)ÊŸKª0£1lEëÍÈíhû?Ýí€ ,j:¨Ó¢uhüzºÚñ›é>¤7––Ùg[\ß êæ¼æø,y.ÏLc£k¢“,¯{4ºSÂik¢ÒC>§Q-7 ¼Ã¼Rh¢þb7l“<­¹˜S†ÆKe+Œ?<BbnÓpe×iì!þx¨")ÇŠéþÓŽ(˜`°†+޹PÐtJ¥»äM£MFŸVN!‚–`Ž&‡0¬”éœvü@r‚Áv!‡HxYuHç‚”2o}2Šåûç QÖB´!ë·w}´â*m°–¦–_Yo ¬æ‹º¾žf³ÉˆË!h¬¨IqþvDå´†Ë:ìÚ/«ëf»Z¥I|]=ý;bÐ6ÝÆ¸5'g”¸“M´Æ–p¡Rê"æ"›Šþ“³58ƒ™µMËã#êàå}TƒÒt9‹òõûû22mØ¥»å«M²$o—åO\~¼cÁqñɘ`VgþN"{ƒ;#˜é>ø$[mó'¸tÙZ'Ñûô ÂÆ†`(tõêìx½œY,$ë|¿¾&Yu­§­O1u>r«Æ\ƒØi{æÏã|»ÎöAE¥î݉ø¸Œ.~{ Ó¿~÷‹{9¼yAƼIªÙ,ÞlæÛ× ]ƒY¨IÀ5æœÇ!óf4.§kú!.p”Å”à% ¬I½YLÉ96RöV”¼øaE)ìáS‚ˆ©`Ïc1oJÜûæ¥LÉ`ÓfûÛ‘xñå ¶ƒ‡‘LajÄ×4˜’Âî—÷çþ½øäƒíB•˜±¶ûßÉGi1…jÓʪGÓ jåæÕnzwò¢’ja¾„Æ`Âêvú1_G3ßn &˺øWe¿©aŽ+xhÞö;ßmèÿ߆Öj÷`C ¡ywØY\ ¹Kï÷RäêOÉáç­'ë©Ù7n=kÇyôÁ&—Ãûs¼H &z«T^ü°Jöp× Å JŸÇuB’î;Ö|y®“s†©êo“âÅ”K0ØƆà Vìû¿¢ëäŒbFúÛxñÉ Û…&°°â`שL*ý,Ž“S(iT Çɬ†ê)»Ÿ~îXÏ+BXœ^·«vZå÷«Æõeþ!iõ¸œï;I}Âiì7²ì›4²ê¥YÙ‡‘ÝQ¢KÜ]’/š Ô|¹¾ò‡-ÖÃÁk¾\ÇAG¯ßý/øßÕº°NÇ8_Z,Ý’öç|©d˜[Ö[µôâ‡UËp°‡;_*%VæyŒoÅ¿§:0> stream xÚíZmoÛ6þî_¡ò3|%nŸº.íÚõm‰ h C±e[˜,y•Öûõ;’’#)o¶g: iJ<Þñ9ÞsG; ;/?ާ/|éH$Îxîx É_Bëgº˸XÆÃõ°ûìÃ+Û9æQ¥ÓÈ~|¦e˜ ?_Ÿ¾°€@Á´@îSp–3²0ÁÜSÛP.õ¤ÁÙxðç€À[Ø!×JÀTæ9ÓÕàãgìÌàÙk#.ç‹ysåx#Êôçbðë7 HCZ¦GäV—ÂØ5#T<Rìþ©u˜ƒbØU•‡i«h6)"e•ý„= ÿÄhŒ‘ôôjºyÙÑŸ!sÇgò¸Ñ_{D J¸C‘ ¤“Gμ¡p[Úí£7 y¨°‚‰~»¯üj³ÚòëÍÞe…¦,$• ¬˜/Û9¯P4 ʼ‰2õQàW0Ç©²€Ý)Çù8"˜bÜöë ]GhJÒóô4íÕƒ›¢ëãÓšÈ8GŒPgD'¤Õó»»DxˆNãÅe˜Î’¨£‰{²«W†õç4mù=¦·²;8  1.`1X”xÍ 7 ‹”<ì=œ å4ƒƒ)"88mù=Áé­ì>à`&‹í‘ft¢vFåj³>ø¸I •GC¤#¿"ý•Ý!9’Ò·ˆL³´Øé8¶…†',ä `¨òY¨ÂƒÑ 0ò½ãÛßÛ¾ªîmÀ†}¶iRüW´ûYÓh$QÚD§M?ì Šï#_Ð>yS§½3ÏÐUžpaÒ<ÈeÕ²JjÏÒéxÈ<Âú@„W†Äs!¼£mN`_ü„1’êƒÊl[”ëuׯ\ )LMʵ¶æôÁM°o#‰Y—ê!mêÏ8 °WgÕßwd¶L •²~³häò•pÓ‹ªM’ln »Üɤƛ4ð66Z–ŒÓXµ“ãkäï·wÄÒ## ÓŠ{oPiÇx()8 ö7>N×¥zÚ&Zy^&6ÒÇ2”–×”óH°mý ¶&›Åé¢r5XåÄv#´@Ã[.~~“ñùä§÷oŸ½z7ùÝÃxòüýÛçgûÀ!º!ö¦5¾û[N•.­ í“”Ga²²]½èÃÚbH@:{ßA…¡øÃŒï¯0H[¨¥U+›W'å`#€3¯×ù1ÆÚ6œGªÌÓâ¶-÷ñüý-hH¼û4Wžóþ—n•£Æs}&æul›N£¢˜— ª”lÖÚ¹¸#”aíb;Ïu¥åUÔ<ÀYQëÛ |ÄŠº#¿_FÐ_ÙÝ+jîCâUWÔO–ìñq"›éÞµeùZœóƒŠq@ù„?f1¾OºÃ…DXO‘îpØPâWaýì+„­©!¼ÀE*ŒÀ|×n¯y§ó,_…*ÎR;P¨øGs cî»L ‰Ù'jªºYA«h•å›JRaÛU˜†‹z¥ËMkFиlôÝ$¾ÌC˜.± †aeÏs%±‰¹6N¢ð0:cœ"Ò¼*{l:c ;9âuRG~?:ë¯ìîtÆàÄòú6é*‹g³™ bퟓ©¾KB8ø·ÜïCBŒ3< 1ì#ÓVñçöì0߆iÓ¹¦"æ‹:è­P ¶T$$ò=º;:jIMìîFê¼^o™éŒ÷K¥^fÛÐ$¾V·­Ê %·á‰cé,»ë¤¿^¸O¯{„u©­)u ú¨ù]‚)¡Ö`ÝÙ¬?˜XLˆk¿ýÒ†¢¡SGgèn ÒwÇKCñZb©+x±áS=ºÊ •l†í5·|K&HMQOÊÂÔ¶`/u”-+5â¹mm ³f‘ÖúJ×ïQ’­íÓ°Z;ÒÃ_UåY–Þ–ÔåœÕ£¢•¸&•pӦРjž6YÁXçÞ¨WÑ "3gt[¹ƒ/ç!ì^ UdþmÞ Ý·&ù¸o³R­Ke.W!\ŠeÏ(w?ß KÉÑø¶#¿ßöWvw¾¥Ø !k"YüNóÿ“œK¤ð=É=7ñµ¥Vñ—7î¹§ežGi5jwùú~ÑöæuK²ÅbÅV@…PËÿWQÿTufZûw¿½ysRN3H턪-6jLlÃÜȵêKN˜Î}cæénpÛOz à‘°5ü¢çoãzx endstream endobj 3138 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1650 /Filter /FlateDecode >> stream xÚÍYÛn7 }߯Ðcû`.$%F€\à&hÚq ´5ü&ÛÖh°¬7@ú÷9¤=¶“ÌÔrâØ0‡>#R¼K“c$\Ž‘]Ì¢„¸T"ˆå¤èˆ“ÉQ+JdÇdr\ÃN²qÄI) Å•dëTWÄÖi®Fåäà*+'Gׂq’kdœìZ3¹L¡ ÍB5ž¸X<P¦e•¢âodnŠk.rTm(¸(¤<Š.–j¸äbÃ@a«At*.Å ¡ Šdàµm»\J¶_Ž lÃ0HʶcΠŠñÈf<%ƃŒS]2ÿd@Ý$¤< iê (”J6d”j<ȨÉxQ‹ñ £Á{  £ÙÎUdÆ« ¨é>°ÕДW°ýd;€ó)KqV¨9ÅV.P·š5 ÀŒ"DCÕwKuؤî¨4PR!JìE…h¡`¼ ŠŒ‡U¨TYW†Sˆ«®Ã’$ãA†ãAF‰P0Q„NõkQYµÇ¢T›úÛ¢FƃŒf>Ç?8dÝÊ¡¨%[u£Z Ã.2bÀqRýREªUB€²(.…丰QH“–`l VPHS#k$Ÿ¾QÜ«<„€pË*#;‘¬ÿ…óDª¾‹ìÃvgùc<¼[m•XA‰ñšC(Ù)•‡$“ÖŒ—\ D‹ÝÝÅðüß7K7Ü_­ÖÛÅpðö­=?=^ý³¬7¯–›Ã€ÄGÃãáÉðð0ÚÃbx¶|¹u‡ˆ¯»‚³=­Ù«ËàO°ûnw× nø~ý|í†G¿ñÛ9^o¿u÷î-ðûr=8$/¬¥©ú‚øG¤úªCrzImR‘Ÿ~yúô»‡÷÷nN ŠÅ§¢I|Eº±¯Éj/t 5¹C”¬ŠÅŸ¹á×ß~w;Q|F”T: (Vo_¿>šE³xAtоÁí}à̾¡t‚«¯¹œŠ¯°Jmó.0sô±Ó _hvu‚«¡Ór(O^»E8‰×òÖŽÐ9u#ö"+§†Ä@Éë\9Yvw®=ê['¸ämí tn¹{o½ÚZNí¡Ë ì¥=ô™F}2ŸÑ¨ù¬û/þZ.†‡Pm¹Úžè´Àú¾–‰“õÛÍË¥ñò)ïÇå«ãÖïœUnp9l]‘»U+Æþ‹ 0ÕÞŠÓ äÛ£jÙürFÄ‘HFÝLaKˆph}Õ!CØ£U£iÁ%Rn¯ÐŠä|À05*’)øVãí+ø¬!v¦†@Ÿ*ßž"˜‰½`@B&1ÆŒI>`âhH¬0Ýq?Áoçç¦ÛÑ嶃>Šéu¾í\F_Ùv¦ÀÖvJ/XÛŽt‚­íô®lm§v‚QiuŽîs >u‚#ù,½+ë´Ñ­F’Ü%” Lþ£ kê§„âÖ鲑§w娼Nù}àPÕÖÈít¦ë'ÌÜEhìHQéW¿t‚Ü›&8… ¹—[íªŸÝGKù´¾V­}ÒGeì£eì£eì£%D ú*´ ÚÏ;«h—Ûï#ŒÎÑÂE#‘€çtÍFr36Áqß·rÑ[ `-wÐ[ 6ÐmBϵމQ’ xѹMRAá£|û6IG|:7IB&.Ÿ3p¹Î9÷2úÊc <{ÎÏs§À³çÜ)ðì9w<{ÎÂΞs'ÁsçÜ)ðì9w <{Îg;âÎ f&O5ö‚‹Ï¥Kâ)ö.Œ0ÒÛî.0ŒGtô‚³/Ü‹ÅßÞ4‰Œ£vb‰|ù8¥þ§SAŠñ“©ÕéK§½ÚµŽ¯7»gD‰<4<2å«Ì (2¥^Ô=‘K­w0'$4ž|ÑáÈñn…€Ê¤ß9ÆA!¢{H»ÅÛ¤M¶*„zª_ Îö LJðŸŠ,7›õ毠 fÿx¡ ë\y MvN–7y/Šƒ O-yûpØÐÔõ>1ûÀtµ.o6Ç«íŸ_a†B NCþÆ&wp{¤ÍšéÒíº&_+›µ‚ë÷¨þ;›ÐWP“à¹j<3BM‚çF¨IðÜ5 ¶;éK#ßZé“~ëê5ÕlŽî£ª\6Ý{ öG endstream endobj 3237 0 obj << /Length 1690 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯Ð£=Ä ¿%nOÐ-ºak³—µE Úr,À–^¿¾¼Jp” dÇ%<†å a1Lˆ“ñ¥½P®ô¤Ñ‹ëÑß#£pD$`*Ñl=zÿGs¸÷:ˆ«$úbF®#A0¢LB{½ý1Âí%¤ÅÃc ‚·\j³¯›¬ª&ËêfSåE³°Ä>`áv)¡‘õåe+C1æQÌÜpÕý‚HD (R‰Šª,Z´ÈuÑîî=^€r$é°ÀDÅwÓÅ÷{Ê m,‰UO@ÖV·‘m¼u…È™ˆòvDiŒ’Ø…ôs™ÏmÄîŠÞO•ĸýCäÛ3aÁêLpwޱüÃÑ™É8GŒÐhJÊ2ûá>Xµ.Ób¾ÊzTƧæ!aHÒx¸4éâ¦I0ÙÒ„I†—°,J„=äYYÔÍÉ¢ód¶L«n4„BŠæ£¢»(«uÚ<:º˜")“á¢ÛÅŒn(ÙoÄ *í‘"„t¡þéÄ3”J´©Jݻޫ¢2NP,§¢Y3™2ÌÇÍ2³yÖ¤ù*›ëObl ‘½‘6Mò²°uõéÖM/íøÔ~ôš¥ÛvVcý,4™ò˜¯¡N¹QÛbæ¡ÅØ÷®ËºYíö8¶á•ß ,š¬*@ãÍm]@‹$ãOZ<·no¹c²+·:pœXS1˜ õðÃd(œìé^Þ!,Ì‹ê°÷(øÐP#ŸèTâ§°¡‚a”ÈáÞVzøLö * $Áÿc ™õ³Ýsl”0¯]ñ¿a£–·gm¸k£hÇFу¢}÷ö6Š:¥û6Ù,ÿ€1õú\ÈØ'§ìx¶qMÐ7+7¹ŸBP:l?eïŸ ›½²`Ö]hÅÙ¸vt´q2Ãg`‹ÚJzå¤!‰­Iäžîܤum ô#djκçàÿtºZnèÒÎ` m‰r¶Qwv§y0o͈Òí¿0Ò÷ÛÖw¬m¤Jl£îÖ¶Q6»×c££z'âäü»m|~¶Qô«P×Q¨‘§î:ñ#ÿÊ*@Hºu^6¨Ëg:³©n ZåÓj0ÔbÅVxçY=«òÎz—DþÎo¾yÓ͘Ù*K«^ÎÜ ud_ûÞŽ ,܃Þð¦Ü6›mÓì6Ù£l"K`MXg0›Èâ)¨ßC™€~˜ '{ºMd A4!Á6±=Ç(øó2ŒLÆ3>\®tñs%˜ì†‘Å1Jí!ë—Í“ìâ9q–½c’#ö{Æ©öŽii ¼eïL¥5©í ª-qÂf´®½¾ˆÎuIì”æzW¯Ê[Sýw{yöv0]ù¯žœ<|™- XguÞfõwðËŸj½=S@ò| ïþN‰dž ~§Dê9°Å…Jzã¿ 9_)Wð”'”%Çd°’×Ã+yádO—GÊ bBQñìuý ØG¿§ñ³ûUÂË6!t¸Téâ¦J0Ù3Ô‘2Œœt\½zó¢{ÀúK֓éý;Ýòѱ‚BAÄp®·‡«`²çÄ TƒóÎ?•ܤuANs4æ±6Ouˆ¯¡L>¹¯¹ë_MHœ †å7Ô)@œˆ$H‘áĉ}g8qêá‡eq8ÙÓʼnLŸ@œîѦä¹iajзü~`¦“=£ÞpË4ù_‰¡jÐ×ì~`°‚Éž,ýJAƒÅ)D›¤ÄÓ¾sûëQœ8€bþ˜ÿ¬üL’vV endstream endobj 3264 0 obj << /Length 1480 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WàQêT0î—ö)uë´Éx¦Môæf<´D[KTJRõ¸_ßåM&!Ù& ÓI'}ÐÁÅÎb÷`I‚nAoG?ÍF'gÚ"‹­b Í®‘TXYŽ´…£¦h¶@ãËU²\M¦L’ñ›ß+N>„×aFó°¸<¢]°ž|š½;930¨xfPh†ÐÐ]n‹rh3>)LØì¡Ñ/³Ñ_# ­¢ àQ.Ñ|3ºøDÐî½C kÐ]Þrƒ$%˜qçkôqôLjÔfh GeSRlE%ÉÇuy3™R2£0Ö«Š‹ËyºÚ„Ä?‰$ð£9N‚­ÌúÈoÔk"ækÊ3ÔÙÿ’*̨@ [cQ¢ë̦µãÿvÀÖRT†iÖÚ×~9EMûÕ·é¡nKaËì €Í Æ7¨8ùPr æÜŠ:·Ì`"XAnÆßeZpö¨)t15‚½'TNPñ_Újm3w(oš«ÖJãA.攡)ÅRÙÞw™˜Tk¸ ¢ÅÚE2þ¾­3R8Z9œ¯4í{úŠ7ؾÂÇ\(èLcbx1Éóm”´ðôÏ—AÜdCZL!†öb7u‰ÍÍ­É%Øíiœã£ù@Y –•KëtMÿ=¡rÆi‘ÞOXvuÆÛd6ár\ÄO¸“n‹ãiy 7pcØ'g”Ô)"baÞYÒëØ¸€áË*³üàØl Ã`fmÕ2©å³Òx~$åq½Þ΃4\—W÷¹eZ±Ik‘Ý/ƒÇ*Z¥ÍTñÀêÓã Ž³¦ÔB¬Ô5Ïp¬±Ñ݇û<3ó&¡.Z«k¦§àeTÙ&Øaº‹£äGSÙteÑõœ p‡Éçm´XE7ͱ<1Z\â«Ë‚lî…ThÊ)VÌ>/ ¢m6Kw½¤Ô:ÃIƒ,’Šýcß/Üûƒm/ àbýêÑ^,¨­ÇûC¡mï\™aI/™L€ð/)3ºd# ‰U¾N6’¬>™æ;QêÆ§‚ž@ ãÙ²l›¤ñ>¸lvIi+Ú–'We³EX¥‹}¶(Àßa<‘rü­'»fú8–ë†JåŸM û³:çOä˜ïz‘ÌÒ{Ç)̥åÁaX’ –Vû~iÅlû´" 1ñf•c»×|§ûU¤•¶»WÁ4¶–çwMûž~ç ¶ÃîU@Pa†v+ud®çµá©‘¯‘âX<•áOÿÏíßÚFöQÊûï_ÕS€Îij „ éå¢pîY0ZÏÙ/-:˜!y$*ø;öý‚¿?Øö¢ƒæ©O™»äÝ”©g‚—ÊáJbÃ{Â?÷U,ÛûóáŠ"Ž}OGòÛAE0Í1©öј=âtp[Þ¾ ®ö°ÒI—0˜< ãya]rìý!ã ø­jÓå&˜_n²_°æa¸8J …ÑἿaÞÓù}¡v¢Ä<³UÔÂñ)a!tOyú•½"¤V€ÄÎAû~â¶Cx¤VcÁí~ExÞ÷¦”PB9ö=©õÛ…Z£°(W’LÚQ d¬Ã¨7’îË Ç¾'Þ`»ð¡%–Œ~᥶êϬ¢˜éá4¦cß“Yo°]˜U&˜u_j«Èg¥IùT ÇGÓ¾'Þ`»ð3¤HU³>X> å‹G·ÕðeÃí.]ÉÒ%삪O]¤<sö*oA«Á®a_cÜ|ÞUu¾ÛIVɪI÷Uíl¾ ç·ÉnS\m¯Ëa–Å]²/Òüzþ&«FNÏ–µÂc^Ÿ¡„×8aÜ^ÕŒjSè S±¯-]Mtx•“®ÃØ­b/ÍêeZUAÛ–1³m 6–•ÕLý-W3K5æ ZÍ»yÓUÄÁ<­ø â8(ùº[¥Ë¿lÖw‰óIÕ±Ïi³—æDôùšö_oUµ~ endstream endobj 3295 0 obj << /Length 1609 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_¡o³‡†á»ÄíSW¬ïí¶&û”†"˱[ê$¹EöëwI[’•D¶âÅ ´m‘Ç;>Ç»çÎÁÞ•‡½£ßÎG§Ï}å)¤$•ÞùÜIÅ<_ÁÓ'ÞùÌ»Ÿ-’b‘LN¨Àã§¾2ƒñ<Îã4ŠÍÇwaº—“Oç¯OŸØ @ dZ ÷) ¸ÛU²S°ÀƧæA¹Ò‹F¿Ÿþ˜…=²U–2áE«ÑÅ'ìÍàÝk#®ïk5så ‚eÆKïlô×[ÃpÝ@‚¹Qˆ×-)n”ºŽo–qj•¯Ÿã(PÂéþK¥©Ý:¸Q¥ÜLvU.ÌÉdsóLÒÏëÒ £E˜‡Qçæc˜çá~Mܲë ÁãxBÄØ¾*3ó\1j)Ò4ð„3DÀ´ÚQa4JºÌ# 1_îo^/SœÝ³° ›,Âbq ”€û‰¶ Ý Q…yLYÆ|Ž4šdëR¯ì°ƒ{ûØ–Æ*Æ_—Vãp¹Ì¢°ŒgùŸ[Vé¸sm{•_Sê„Hø-_ü—ë<-ºî›@D½ÍÝÌt+¥Î^¾‚Ó?ÞXHçú(¬ÂÅ:Šâ¢˜¯—ÈnOj±Jß.$€DPàÑEü¦‹UM‹EHLØúˆ†ÿÄhˆ F€’úñ¢ÉòIRp Éô÷‚HDÁ (R`~{ózèjHëþvw¸Ê˜·Lôì¡òM´lÉwa·ÏuYœ@=€²•ÀüÊ3ƒ6ΫŽ0/ᨦ.‚” —Ú•ã]œL1Þ…½¾NÏ‚I¸rûfW’Ë›•ŒsÄ… „TF­Ÿo! ¼ÚÄE˜Î–qK•ñ“¾Nˆ)ÂàÝGó‘¦ü>2XÙ>Â$$@.a38iÎÌ!GYZôp‰Mm¢!"¦BXȡРE†À{,h[ò‡A;\Ù=  î[`O‘üO{b»å„`DÞ£Ò”?ÁÊîH9ÖŸovגÑ•fÛ£!Û”?ÙÁÊîƒ,Tz\úû_µ ±?Lކøh Uu0$x;ì5Û¹;4ê}sÀj3kÅJ¯ Š?iFükoÜ%B‰»jý®f†`šsíŸe+¨ðâ[kœhG×Åzu[¥·.’ôÊ _¾{:áxüìäìåS‚&P4àñù"6uÁ¬† åI²)Wõžßª÷¶¥ì儆¦|qµÚj]ØúôÒ1‹[ÕÝ¥k,ìŒ&Àz!Æ÷UÝE¾ ` ¬M:;š#ø€Ú´¨µ“¬pS†Åê¥aEĹ&©Eª¤3L=I“²Y•m}³G¿·jTKÆÚ …¸ÏŽÔ0yÞõ‘ïÓf{áG{ëG{ë›´·Äÿ«½%¿ãöVV”׿8Šé,ž‡ëe9ýˆ1­‚óþ /È u¼~ƒ[!·ìáÁi_Kþ0Þ7\Ùþý.Æ@tÞ2Çwr¯‘twdÇGf…õ—Éeæ7»1ÊãБ÷#ðÂVlï …÷Äv»±}CÙ÷GoëÀ f.ݷĺƒ•º¨ }4ï3+Ú¦û(û¬÷hѤ|b“Œe³,ýiB‚±]¼ÊfÉÜ­ÉÛµ‰“wæ&Ò79M‹ê6쟠( Fýãe(Š1’òxÀ–üaj¸²ý3Å ÖZ®ô%Kf÷'(%k¿Ète”Ê ZY…òïí(x¯µØ’?Ìe†+»G7‹(¯üoÜ4v®×Áaöb$âò(ÄH ʪ¦C%c̤=hdƸÍ2úU#Ëè/êYF6YFt–Ñ‹7b›YFHÓ«^e^õϪu…yBºI¶²t­y›4H@Lð*é77ÙÚJ­ ³¤øœv¡N\ s¿èJ)Ì“ðÒà§9 ¤%\¾Zų’Õ¦®œoŠHÝCÛtþÊEbö|Fe’¥?¸SžZûþ´¬—>Â? Ÿh}ªYàÛÁtªæâE7£~Òd3ïÿ~û¶ÙÉã±q÷Um«æuý…‡Kù!àöqŠ endstream endobj 3321 0 obj << /Length 1740 /Filter /FlateDecode >> stream xÚíZËrÛ6Ýë+8ÙTêT0Þv•vœ4'mm·›$ã‘e*ÒD–ZJn&ß ”ŠŠISTœNÂx\à^àžC 'ïœ<ïý|Ù;y¦Lb‘T&—“DH$ K”§"ÉåMò¦1­¦³Á Üúû W8O'i–.Æ©û÷Õhq7šÞ]¾yˆBX .A¼ÁõcÉt´¨Ù,4ÌÂóÙu6Êü6ù™ÜòïÚ—¯ÝmGŠ8"A,ÚvͳuœÖ¶‘tÏÂ9C¶fH ’\TøC—ý¡°ðÂbz½tÏ÷éç¢FˆèFö‡ö6×%äçéú.[¬ª\& ’Tsä…Å!“´¿ž¦®!¶qÜÅ.ÙvH}Ó‹ÓóÆý¿^ürzòëo—¯LôŸ¾:}âÚ­ÿ>N¹Ã®fV±9ùtŸVëôö;»m¾Ÿ=‹Ñmjƒ"ϰU n/* PÂoDÛ `¬?É–·®ä¦€Bt–l…;n¶lÁÊռŘÎÓ¢,ð*M÷G¯ífßÀÚU0ë•3º/¸ÝÚ†L°~î0úúϳ3WšMÜs±ÜAì*ÆË»¹_ûµÇ=YÞ-|Uap´pÏ4ËÜe“»”nAè5¸îùÈ Y+†<© A¼’xÜÇ[ó ìAäUătG^ÜJÐÎèEÉ~;zÑl}ò*¸Bø‹rW5¥¹?^E –Ó™;cû-ÝÙl7Ê–Á´DX{íÜœïCœaf¾Ý”z»Æö[:°5Øt_³#”>Nº_Û½°;Zu÷® d¿¥{[ƒmâ^± ÷‹ºw÷Îm¨åVHku -ǵB‚ÊǪå*fRq³áð›½.ÍC!ñ2^ôºGþPÐ}ì›ì{Ô²¯ ½B÷±§iÚwA¸Órâž¡œ«¿Žájwvü8'OŠö/,bñË4"ÄOü²Bw2º«£œø »Dâ—}FüVs 'Xê-ˆÓ§g¯ªÏ9Üb¾Ó7O(¢ÙŽˆ¶š°¼˜­ˆf;"š9=tâ™*›at¬ž·{È0ñbšìÅ45ÄMe«b?C‹¿ï ‹iÛ¹Ó¶õ^1mNLÃ:òÐ4›h VLÛ§Ó¶%whðbÚ¶]{Ü^LÛbap´ˆ´ßE'­óØ?´˜Þèèüà6WÐN:üüÀã)]É~;J×l}ÍÀÕL֗Ъ¶‚Vû´½¸Ò¬üÙˆbÛÏ>ª&“T‡P \BHw}Jö[ÆTk° d# qü>úìDY#À@'ª¡¨†(–ªfiî[‰iMún b„|£ïå-³?*xíuëÐE!åµ\§ ùýìdž„ Gã¯T(ÏÄ.ƒU×ýÕßéxfIÒØ5;à™¼Ädzãǃ޶*sy½9'ªÌñ„Þráy_î|ÇûÙ3òzÿ8LïáLˆ¤ñ °CÓ=b¼Ôaj.Ùo—šÛƒ­O÷ˆ€kªÈÌÇûbânͪ÷v „¾¶ûnuwÁÛo\­Á6à}„sD¹|”¼¯¶w)¤9cºónl¿¥w[ƒmâ]ÆÕêkùOì«ëv_ëë’zû{')ŽÆéžoßÕU¿Ü·ÑÆÉA_îfVê/ª~xÍ!j0Èï®ÿ¼|£ endstream endobj 3231 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1613 /Filter /FlateDecode >> stream xÚÍY[O\7~ß_áÇö¯=7ÛŠ”‹h+µR”ä¡-ÊM6 b+X¤äß÷ï.8 ¦R ±sf¿33çâe")0‘QÿÔÐú³…ÌQB®SƒË”Z â¶À­9§v«i‚CÍÅ954'RÈ)õר®Lœ×ÕIy­OÔZ!pkÉ\“ÌÊ €Z¨.N’«Ø,Òa0Zš[$5d… €Óê<…Z#ç)ÔZé<¨-¹ó ¬Cì†%æ<(«ƒ‚ŽÚ::štt´ê<¬€»ñƲtžÀoÝM°Kqž¥€÷]‡e83÷7ðnío˜jäT ÔØýhð~«Q‰œç›Šó ÌÈÝßþˆÅ9åËJ:Ьʽ٭/øÇÝú‚׸úËrK þIÍwB»_*Àj.ÔͰÔyx4õuT€­uD• î’R;:*»þXK_9¯!ö’¹µñø/áî–ƒHu0\ŒÜW­€²þm ²ö\,ÅŒ(“ê¡Æ ïVé<Õ:B£ó ·ÕÎÓ ‰tÊ@•Î+Asî8„w¶ÎkA)9*Õ TÕºc9(‹ó`¤J5l£š{3(X¸~(ÉÁJƒQ·4[0v36Îõ‚›Ì|“N„oN¬w"öÖO]çáݪ4ÛÝÍŸ…}&˜™Â‹0ÿý?aG4?R£Â ÇgGG¯gݦ¨:Ö(XȘ²FÕAɈ‰¨ÏAÉ'ç3ðÞòxvwÃ|±Ûú¥=l>¥-“È©[ rU¨8â‚sK# ëæZæÏO–o^.Va?ÌŸ?Û óW‹«pnÀ«Oÿ,ðÅÁß‹Ùü)ŒY¯N=;6±8]ž¼Yœ®³Hçý¶x{xðdù1ì»™èǶJ޵½†¾ƒÁqom||¼„ÐýuFv³zFÞëµ]±§¿2›¿<ûkÕŸ=<þ0›?Yž¼]œt­éõüçù/ó§û¹?¸¡o°Dß=wã ²-²W$gCp™fàwo¿ óŸ–¯–›õÃéûCüí®~t‡Ý«!¢6gkˆ˜ÀKüð†àLÇäÙzcÎil…ncHlœûóÀÞÉ=ÕRcB½»~ .£7Ç  NåA0kl£à+‚©ÄŠR2ÆBÛd™«¶˜mË1#©‚-z]#é¡u3Î0ªÜ ¸¶È:*˜"F×½œÑûDTçA°´èÄ dŠœë¨ä½ÝsŠƒ—­FoTÁ°8µQ0£ ./«Œï_ŽWƒèþëÛ.i&×KšÑK˦’m,ï]ô†Èߤ¶YŽÞt×¶‚^¨è×EIáK† ñ„Û¾ƒ!\4V»(²\-–òŠl«8Ztn†È˜šÝºÆ_®±HŠè–¾\c/£o¬±S`6T cIiT2Áf”Œ8š‚ ª·ò¨ä„fpP²¨{£‚JÅ(¥¾ Æ|C2†ÅÔ'+Å$–bÒ< F‹8jDõ>wT0au¥ ‚Ñ{‰ÕQ°÷&£’SÜ%gxYFÏ_F’QÁH^:zV3ƽzH¾ñ é0¬Ü­ü6½^~ß¹üÖmÕmÛªÛ¾IÕÕ„O•‹b‡°ÌZ°Æ£À€‚PðK¹â£ƒ_΄D{xC2&H¿FÛ’1«Y»ýDÙä6åeôæPÚêÉd KÞ³Ð(¸DoâÆÀÝôQɈ&žœk'ÀŠ<ì7¡c`$b™¼›—‰+©/Y0›‚êA3fñA0e„FâQ0êݨ7ýìô”?N(xWï oÎă÷Ë û)_ËÄœÛ3qÛ\éùò†à-![B·„m‰r¯Ùz“›Ì'bœ¯mn2|’”L’8,¥d…Œ Æ<¯ÔRÈûç¯ò~yºú°øtºóvñîàìhµóîðhqÿé[­RÎç.’’"ŠÝºŠ‹ÿÈP+2Vî—PÊ~gÃHÿ."Ŧ)]”ZkóÁùH*›ÿ؆¶Öï*Ñ“ýwNT<úº!ä"Ôiá‹fį¹Ý¶`J·x?Cß4ðN‚1ðÒÔt5 nÓ÷¨“` ¼Y/Iþ!žW endstream endobj 3349 0 obj << /Length 1710 /Filter /FlateDecode >> stream xÚíYMsÛ6½ëWðÕ±`H¢=¥­“4ÍW÷”f<4EIœJ¢JRNýï»ÀIѲlÒvÚ{‚Àî[ìb÷¢ÞÔ£ÞËÁ÷Wƒó‘òQ!½«‰'CªÀ‹<#æ]½OþÇY^ÍòáˆKê?ÿð6.³IVfË4Ã×·ÉṙŸ¯^Ÿ¿ˆ©ƒÀ0ÐEÄI,"Pgd1Á`BûçøàBéIƒ‹«Á£¨Ç¶ `j ½t1øô™zcøöÚ£D¨ØûbF.<É(áAí¹÷qðË€ZÃhÓ@FM %#J ¨*+o³Ò‚o®F —ÂaÿÖ u¢; ¸èVàI„šÕY& »NuÏiVcã÷!£~¦ßaǤ(;zÚøG" RroÄ@9—¨°Ì’ù¢Ç®HÌƯÜHgà|vM:Ì)}ÒѪ¢†ÖQÆTۘˬ^—˪ßLF·ÇIqÁüz–a£XpƒØ|©VYšÿF)Oí{ÓxxO–cœaêL·ÝãçIY,:ºÆÙDkKÖó;fEU£Œ ‹Pkžg®-i•eÆTÜåÔÃÆåË÷ ñ™z­e6¥]7´^£P-þYké`…tß™îWÄD íØ 2Ä,¬×ßýúæ ¶rËâ÷§Åz>ÆæMæ"b½´]N`²ÄgV–® ’ Œ«!»Œ‰ÖH(`0Q4‚Ða$Žì~CûóådÈA6¦–¶©`‹¶V?^v²M@"Øa!$„8T:Ûè~ÉB™ð8Q‚eæMšé¥%­¿wW€/ÌÉG¹L>V<&´¶x—QÐÂ6TÇCuJ] šD¬zòp(a9o‹|ÜŠÌ]Añ*¤´áò¢Ë#&) Ðî·_ve¸šÖš”€éÌJ$‚AôÍ}"$ b¯1p9ažu·ÕÙ¡Á‰ZÉG[þ‘Ñq4ØÂ#ˆÐ ƒ ÚEN‹%dÍDÇG:KÚuÔ“Š°H=Í»PIýdïBJUŠŸÎ»mùGz÷X°{|É9áv«Btrþîà% ¥Á1Ù¹öq_©$¡Àš Ìe¾´G§y±¦kºYU%Óµ+Öõjmç$>Ç™.¿ËlìDá“ÙË÷(T< /èæ™.7$¦òñܨj°{+¼=™Ï‹4©ô›»=TD6òr^ßÇ5ȃüV÷´(ávÿíZ…êñV¯´_µ­ïæ†bôØn3}, ã6Xí¤°­€À< èNÈm,ö§ëE¶¬«~–„»YëФ¼~E1kƒÓQ$QãûS%ÊŽüãåñ`gI"‚ ªlNÒñ` d”ÓÖn<)Kº·ÂzDáÃ<é1¥@„œå×(B„@Ní-ÁpÀ«Í©,òýˆ·7#Ð5Ïoʤ¼Ãh徬+È#ûp‘õÓ} Óʱ§ÎxsÒŒÜù2ö«»ªÎØ ,IW›éº4Å ;ñø·A„'Ùxߨ–Ò¨1§ÎS<íÕ~2ç]}v¤öÔh! ËÍ¡NvοÐaŠ h„ì5 ¸ô¯Œ%Rø«¤žU8+ª´VBcc%´w‘Cç9´óÊ©Nó1–/é'µ›½XåndÔr½82²oÿ¨m“q^ž££ˆ~mï±Ý.—9ï¥  Ôê¡þ³Wïß^œTqƒ²-Àv1hCÃÖ!‡ ßÎ ðQ%èŒ ÞhIj‚@£>ôO‡°¶%Œ­*ì6÷Fæ³¾zÁöíÖ+™¯³ê /7ÌÔ?ÓlUã¼€ÆÇW?Áßõ«çï~|sq}qy9Ô‰¿Ìòt†Xòå8×X¬Ò«²¸™›8Ñ}×nÁžmS1(˜˜¯Ü—Æ”;·àžqnؽ/2Û´×?ÐÒU+n;ÝS‘­þµ©ßªÈõ=K›¾69 ës8©IãýWz-þžþJpÙpyÿóæn ͱ»ušBTNÖó^žh… ûo“òúÚì1ˆˆ[³L§L\Å$ üt”‰Çœ­‚“Q¦Žüã(Óñ`§L\Q ÜìÊt½ýa ÅœhüïdN<R| æÄáÈ/\9Ù0'˜ sb¼ÁœàÖ9qú s‚ñÖ]Ûú}$Š»:Ê6×õÐÂĬe9zíݪ ˜¹¡HpÙ" ½Ž±hQEK$ß+²§õU;œ6ø‹®ÿ–¼4h¦îßG^þ/ûKÙÿOT}ùO«úá}¿3 H€xŽìÏÌHÆe© endstream endobj 3367 0 obj << /Length 2298 /Filter /FlateDecode >> stream xÚåZOsÛ¶¿ûSðЃԱ`H°ï”—:qÚÄI÷]ÒŽ†–(‰™THª©¿}wñ‡"))–B+™Î›±‡Ðb±Xì.€ý-I½¹G½—gÿ½=»xF^D¢€ÞíÌ“ "ß #x†Ì»zïi¹H‡#.éàÙ»W¦q“Ì’"É&‰ùù&ÎÖñrøçí//õ |(BN”a:-‹ B5¸0."tvy{öéŒõØF êKoröáOêM¡ï)ï³æ¼÷$£„û´—Þû³ßÎhsaŠ5ôp2%#‘0º”z]ã4K«q™Ã£ƒ¿’bü9­ãU\-J£ãTRøgZQJ"‰“àãeGmŸ„Tx¡/ Ø´F²dáLxœD*òŠÄ›5Ôl ÛMݖϘ…¹ Œ`†Ü}å[µå;2CSV@"=²Z`1÷LãÆú|¨}+š¾åŠ0¦ŒsÓ¬2þÚ+Çûç”vã M!0DàŒÛ±-Õí—Ö@_â3î‘AdTüñÇ}2À@!X|úˆ³é2éè28?4"™OTÈO1mù=#¦·²DŒøÄLOò¬< fðÿdmgȈ0ØôèÞÐzwŸs%ñ•·á+Ê*¹ŸÌæ³tÛÃxìüç`/S¢”ßçàé<÷^Aǰ´×Ãó"‰+¸|ʱy¸çl°Lx0&ŽÏᓃu™fs½8æ¬Ä†F~»5qWaDR´ÏâæV‘bâÍD “mU «›1´iƒ¯ÿ ”Ï×E\¥yfˆHY&FëY‘[Ör•LRìJ¬Àe>уÈp$9¸uòëãt1¸f¤4ªr`ð&>ÛhâïÒjM€!- m jLµ@Œ+Cœä÷«ÔqVé½6­äÖÀ`FóÁ0'L5›¦Å…1*ÁŸ°)…]ƒïüÓ/õŠ+±HÐó¡Äð–;—œÏ€Y¡ªu‘™ö_Cc–ë¤%8K ú{’¬*Ã0Ë Óxõ þÆWÏ®~}9¾¼¹ :x{c:?/ÒÉ› a6MQ³ÒôÄæ±*ò»¥6¯ª•Ç@ÓCŒ”[)¬?¤>Ï €%«HRy±k}`»iŠþ*Mú~HlÓD¶0õÄøCOŒ ã[²Ä/mQ0#—p8mÝØ4·¤,•.¿ú©#³µ{áQä8W9\‘¸P­]nžÎÿMÚý=Ñû|J¾¨õHø)#‘@í9á:+€ QÀè£WðÄeñ½UCŸns·´6׹崋¾þýõëîj¢°1ÛHá=ìÛÅØãîF‡t¹Ëà.¿'Q+ecÿí¯æg:Ã]ã–¶žL`ÃÍÖKb§of¸hz!B"ùvŠÛ3­•‚ÃÅœ.¯• ·àáɲ”Žü~YJeÏk%lñÉ^yíþ„V‰_B+9äp¼œ,TÚò{†JoeHh% É'Îhkÿ>–Ò:ÆêcUîJgö/üŸÎ¿mù=ýÛ[ÙcüË8 £ð;û÷‹˜åP'‹H)Oæã¶ø~.î­ê1¦Œ(_}g¯r=&‘™ì[`RBúÅ£6&å¾@XÀ}SÅRIñGI¹>†IQ¹V¿DQŽ`(ÝQl€\† Ä-ø‡Djt’ãç­guƒ`Öt0ñãÑAR•†¦!Ê. ª5ŒÂ6æE‚ü%‚^À—¯f†gˆáÌÈÀuVʨ߈kÙ‹ô¹Kv;ÕñeÀ óëÄØ`¯-ŒðÀ±ìÀa[¨H9n„´¨)fþç¦i׬jÌDÇg-‹ê°O[L“Z5^/«¶‘ƒÓÈU4óˆPÝÙŽü~X¦¿²‡W® WD_[¹Ò1þw¾?aåêP\Ô¯n^#LœîElG~Ï@é­ì¨R"üæ÷&ã¸ÌØaÐâ¤H>}µS0ƒØ¼7}z§´å÷tJoeq WD´¿:Â+I6ÑŽY­â¢êSDàPa$¿ES¦Ó½âÿ ƒ ¼Hgøöš)ÈOõ{WhýúóóÑÍåoÂnt—O†{Aa¿yÿ Ël¼7Éê&ò`ˆ&—FØËii~ÝÇvˆ°%ÃW²©¥»gžéa¡y¹ªÕ±r Z•]±#åæyg¹WiÀ…:ڕ켸O,ú¼H2Ó´€—x§[he`iÙ´I}gá€/pjÎò]3ù²ñ[3ËèÕ˜ óù‡/dëÝʾJÐñ`sŽm§i’ûǧi-9¨‚…¸Hô­?á³Ñh“¸ìqõgíôkÇïHÿ¹:Þw°‰Š‡Uí›V„驞b}Ûo~yxLÝçůï‡Í,¦3óÜ$ÐúÓŽÈñ]¿½~~9~}yýòöjüæÕû7Ïôiuûüª=Þ~tKع1žæ“C™Ú¬¿é¬ `ÊÜ}Ñ2bŠHÑ)`aà¯Ë5ì,аUkî,ÂŽ;œn=Ÿ[¾Íç<–±Xgnö™0g’„•óÂq¯›î–-:FÀ~4Ž3…hlê+†a³l,ŸX©k ]Ül‘ö¥Z«Â1íœj»>cpQÁÞùНXÿ@dH‹ endstream endobj 3389 0 obj << /Length 1256 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£=Ì7¼ü¹=í#éÚnXšø-+Í–£Ž’ØN‡þû]Y"Ñv*‰Q‹,Päá!Ïï!aÎ>0Î^ ~ž ŽN"Ç8# ›Ì™6`œd‘£2B6™±‹áùÕb}µ…æÃŸN_çgÉx7àÕY¬ð(15‚S9—õv\—gÓËéÍíõðóå4¯“œÚ_\súÇ-?NgØYñÊc+!âŠERƒV[¶Ùs*&ÀYÇV ›WèÕÑö?Ýí@(ÐÖ”äÀ˜ÕÅ/¦¦Ž_Nm“ªXœpO@v ¸úÀò‹³BSÒn«©ªj*"°Q!ê"Ýä‚Äacä‚sOÿRûjcªê8ÕÌB¡x±‹V~µ†R)(ØA—Sûî„iY¥âUœÎ–>“á÷M%õ'uüÀ8 &Û N¤‘ •¡Î¨SÔÕUí2^§øå€1'«ä¶³*\€1¶?Uêøª“m£ ×ÔØtT…RÐf1ý˜lnãÕÆ'[¾l(qŽRž Y¿½ò`v5‘…HÛbÄÉ&O¡eê¡ËEš—oýe|v|šßlnòòÓHèa¼¼÷ê§ÓÉHê!MÆi^6§YF£IÚ¬ ¯ªÀµÇ¥¿ôPþ¬R— ,×eÿÁì҂p®¬¹®˜‡|{¯‹r¹¼™Æ›d–ßþýy‹Œ¥ÜX‘;{_¬Ù‹t±©ççÑïXIÈžŒ‘‹b-xø´wGíLÔ~Ô¹pïê­’x¶#õ|usýeÆÂ˜‚qñ섽Gœ\—¶=ñƒQTÊzoÐúãpQ¥›±å@™º>ñgÉæ~•®÷ͼÔf¾DÜR:ÿí5ý]þù¶`8/ØßO§Éz=¿_BÑsÕ)fó­h=K$[ñˆU$=—×¼¢&w`iqéÍ+j)ÁjÝ[¶ñðòM8Ùæ^QËP‰p¯˜‹ï™E«ž›YÔ‚öX®¿M…‡(Ád[Ø-  UßÄ,j¤]ªìÏÂ{øª“m£ jBk³¨9QSök˜Ee-pùf±L>ÿ»ÅÿŠ[<=è+Z?w»X Û—åÓ›ü´´½]”Z·²?»(³0ª·|ãá‡å›p²Íí"¥PˆÁv1×þÙ-J)MÛ ?0N‚ɶð%’Ö¥Eˆ[¼ë¬Š@¼?ïáªL¶*Brª»[ÌS}¨[”H)£¯á…‹(»iÏ-–©§nÉvœ%·û3öÛXœk53‰âEšDS1‰wûвñ¨mÃ#ÅŠÄÍ<¢X÷V;áþtñ±H[ï Òa oW™¥èâ1[à4öçQ Nô–S<ü°œN¶¹#D­ÁØC˜«îyAÏÎ ¢BP²¿Mƒ‡"Ád[Ø$Q"QìN^ÿ~\ŸbA” FËS¥æüª³Z’ƒŠú³î~ ZÁdÛ¨%i†LW믜;R£µ»?Qêø¢“m#JvÔ_3v¥óá;r Z÷wøîáŠL¶(H6F¾ou ÝM!'mžòì½,w¤RÊU— þ ;L / endstream endobj 3425 0 obj << /Length 2167 /Filter /FlateDecode >> stream xÚÅZ[wÛ6~÷¯à£ÔcÃÄØ>µÝ¤›^¶©­ìKÚãCSÅ™TH*^ï¯ßÁ…II¶$Fí9É!ƒ|3ÀÌgÅÑCG?^|?¹¸~+u¤‘DD“YÄšFRÃSâh2>ŽnçY5ÏÆW„Ç£ïÞ¿ó33¥ÉSã_MòU²ÿ9ùéú­Š#µ™$H1 Ë9Y˜1˜ ÕèÚ?ÓvÒÅ›ÉÅç £âo”€©”GéãÅÇ?ãh ß~ŠbÄ´ŠžÜÈLjã* ½ˆn/~¿ˆÛ†)ÜÒ£‘É1ÒÌëR9»î>MÓ»e9&ñ¨HMUy½þˆy ÿ±S.Fš[ÁöñcOUŠdÌ"I9âÌ©jû9ˆ`¤•ŽJÍZºu¥íîÝ^€0Ä•hð‚±=T~Ø—®üf_Y¡-K MôWPÖ ,"߸ €pPÖ”H¤d@4ËkØ^9ÑÇ+“8î‚ïoÏtãŒ³Ž¾lËjB£3“2†(&ÑF\h¯Ø7ûDpDUÔ8OòéÂôT]ꆘ"Aäù¼¤+ — Vö/¡‚"Ê,‹bÞ>Ðî’*ǯ»‹'/)Íç“Q‰ B•®ü¨ VöTb“ÅT–§¢"4†§>*=ùÃP®ì¨ÍÖ²ƒÊ'óÜÝh®†Ìá¤CnKب©I~>Ð:âb6TÕc S Űɇ߂.€ÌóªJN¾n„ÐHj|>4ºòÂ1XÙcðÅR¿|°EÒ$~b AêíÏ¿eRÖ}mæúíÁ ¤b:$uí=÷V‚q¤T¨*Þ‡¬ëŠ2=Jüãçþàé"3àÅ®mƘþ›BfžêGçSß(Võr†MMZ>/k>½ÉSvc–ïít»G®ûiž¥sßœ‹iÕÌ­“l^fEéõ<¬—›1ᣧЛ¥ŸÆ8™ ±4©Éì÷/v!3Ecˆ-9úPù°Â ”x e ˆCÂy¿ 4ïL}·Y¢[†lrS"Ù¨.Æîé÷§.“´¶ÜëíF¬å€RT‘Ñ–òcf«<­³"÷½êeöGS…É”/Ö¸¤ÌŠUø’ù4³“«f½¤ö_WUhÙÍõ­lÖÓª4Õ憷¬Y®°6ö÷æÞŽbÂ.YeS(8§þÝë´È¦—þ½ZšÔiŸ&‹Å³ïËêfî#Ĉ3 ÞòjÖÐ^çö;@ꔇéܤŸîÜÔ=ˆ¸óRwƽåÐá-‡FדmÏ“…' ê$þñÝíöèË®IÉ¢Ú¹]-S¡&Oóä1”ç^'ÛWšdñèÛ™ŸTÁz'm¯?†5öIs¶$:]^ÚP´6R"M©7òCµò S"ÝÞî]ÔØ,ʼ}&ØÁ/šÐ’V?$® 2{°pÒy±²Qa?YǶÏUeBO–WµI¬CSëЙ£VÁ‚ÁUö¸\d³–ù®N?Ñ;üŸAŠsp”UØñ¨£ùõ[·/4D Gi¿<½~«Ú'0"D0_`ô¬ƒLÒAÖ%e™„zÊê¹omE—»™á‚Ò¿@ÂÖä'öÕ¥m®U̺6¯¥¿b8‘HJ²eø:£ïY¹'D¨·®4eQí1ׯØB±2¯è¹§¬ë•[mÏI#êxš$ñï\'|öe+“ìÛ¥òfé+[õÙ…åÆÔ«2¯vŸ ˜«ãOF¢Óðö_ïàßÝo?ûWÈ;@ûY/Ð\níÎþ[;§ìf$ÖñÖ‰=lV©½ãf« º·)uzŒCèQŒ”ÜâÔᤚBt9‰P§J «óêTrÄØù蟞üaµëpe'Ô©THR9„P_#¿Å¨“ÁŒº<°N–_ƒO§P¡ŸÓG:âºÈPU`7¨°WjjH\ã›àœ)÷²ˆGëë˜Sq…'§ç#®zò";XÙc  Ö_ڣɭ,Ÿ&ur2ºŒ€›ó¡Û•?ÝÁʃ®%àBºUeÿ3w¢›å “Ÿ ¤ÓóÁÑ•?ŽÁʇ­·âÀ‡nG•ºñ³7€°ýSƒn‡d½ƒbˆÄHpv>кò‚6XÙc@#iFö$P Ì‰ ¶#ÒŽ¡ó)†åÿ+è|¢’,üôâÖ8ŠQ+¨l7¹}wÕ0<} G°ÛFÃEB3if÷ø€¦ÓSÆh|Å8Mæ¡?-¦¡e¹ßÜ•oí•’)ä¡UeBÿ¬,›‰¹ñ°*“À‚ KµRìê¦Ð}ÿ쟟W¦|Îò‡]›7É–b7cþ³æ6в©)×CZÔ˜Ù#h!Äö„W¨±íÊ;懂uÃô6ÄYSÔVµýø÷²|í_-²û2)Ÿ·)?K׿ïäùÖ9eÏl¢‘"'p›u¹mÃõP{EMªƺK”l²£mx¤ÐÇ+ê‰VÔ¶8¬Ê4žÙô@t½¾·±Pݽ]§Û{Ëñ .õ‹Éš--f^0Þ¨Áà\½âíMëH¥¹ûŠe‚žë»Óºjûœ[Œ0;{þ©9z$øn¿r*³ÜP3:z‡§cj˺ÝÈÙÃ@ÿÈu¶· ¿i÷@×¥å0!ˆrÙ¤Wx¹=Løö©ôâÙ·&çvüÍÌ]=¢íòåS/ˆï&ï~}óÛ‡É.™Ù¬sÔÙ£)þ³ÃîÁI”ÎÍ4Ü@ÍõTÀýš¦,‹²êîë®êB £cvÊïtÿtã)º endstream endobj 3342 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1785 /Filter /FlateDecode >> stream xÚ½YÑn\·}×Wð±}X.g83$ #€cב1"h+øA•olAÊ®¡]Éß÷ wWVâ•LÙ[4wî¹äápx8äæÌ%¤3× êÿ[¨ ÿs ”Å Tª˜³9°uÞS÷àKí ’òŒDºí¶ŽiA³{$­î Æî¡¬tO •Ì=54s’³[ˆµ¢mð¤Üœ´‚¤ö&,µ8_å@Fþ­â[³î÷%u¾-x¬Å‡ÕºËUé°«6tÁPëÃ׫8ÎRàÄî“«GÀ,0^»–>„GªÓCßlÔ}5pÇaT\š‡¨ ½Ú#.\{H bÜú€n=(>ªD݇0'ë>‰R÷¡QÒîÃ#µî]ïÃi iø*mfoÁÙ»”>¥†–ÅœŸƒœ}E¿*Xx[›7P}~;?Ä_È}à…pÿ¢1,õ,ÂŒKNÝ'°zf5…Õ§­¡ÉÝçiÒ£Û<ÿzt1)¢>ù‚Ä}HB¦Ý‡>J·ÐG‘îCÅ“Lúè1•„>zL%¡SIž‹1,$c"ŒW@\“úÀD)á3X Kûx ¬æ>PÓÌ&d¼Ât >ó )rº÷ôÕV:®#®`òŒM½dºÓ@{)˜z\»`æ“"Èsä–ó@œ’¨ã ,óÞÐQ¡Ô}xKê>¬×BMž<9š?§X­ ëú§0ÿç¿þ –ѵ+±øpuõúè›oî«F„d[bü¥DÌØ6[Lu”ƒ1b8ÆÜFÊ4 æ(X<ƒ`y˜Kt“Õèù;Α‘ˆƒ`‹4L™Ái´e‘ÈÇß_,ëðäI˜¿(.¯›^TØ IÌ[¢; aÕW-7OPrhõöhÁΆ°Ôíúœ¿º^žOëp毞¿ó“é×u¸¡sòÛû /ÎÞNGóg 6-Ö+—ôÞéÑü§iµüp}>­6Òß}?Lo.ξ]þN±6Dš\…bm¯ÑßÙ5qa¥ þéb±D£§›½Íiõ½mkÈÎÐnüXÿöh~üá?ëþü÷‹ÅåÑüÛåõ›éºwŸ^Ï¿›¿œ?;¥þàŒÏ1V‘}Ï( iƒY±¢‹ëž{Úçà8Ìÿ¶YÓ¯Yì8IµÈšR[QÿG¯" ¹„¹ÁºEN!†yÂ)áaëök©` B½’ÑJ?†  ÂsåXëãˆØVÐqðŠR? :޹=DÐ{J›Ý–0ÂÊæ{$ì6z» R¤1 ‚QcâØ7 n1•2fÔ˜4زJJe̱T+„fŒìÁ‘bÌ9µA0s ›«ÿà 2v,Ñ6Ú2EÍÁ–QBÕÑ–‘’WéÉñí‚ø‹E¸î©të×WºuW×VÝvPÞÊŽIÃæÈ7²c¨¥,Ù#’["¢~@£"b-Ö¢O„Ík¸\Z$Éâú Z²Öñ>0ÎMò(¸ÆšGÁ\02Æ@Û^ÜVE> ×a&cïHƒ‘Ó\0¿£-³ïwƒÁÈXJû¥uXÛ?‚ N§ƒXAµE£ #DƒAX¡ÈŽQ°ow£Xü]&~£bu‹sQ]R„sQ±ÑX0 Æô¸Ø—nYÂúÉ–%_³eùånß©ünwkèΰQvFÝmklƒÒ/u·rÇó> stream xÚíZmoÛ6þž_¡òP³|ÅíSÖº]Ö­élwÀÐ †*Ó±QGÎ$yEöëw%E¢Ø²ê´-“Ç;>Ç{ybìÝxØ{}ñýôâù+©<…T@oºðD€Å<©à)‰7{üÉr•-Wƒ!Ø¿|wec½Ð©Nbm?þ%Ûh=øcúãóW!öB0#KŠB.a»BáÈÐn”+³èb4½øó‚À,ì‘%`)^|{ñáìÍá»=Œ¸ ½ÏÅÌ[OŒ( `¼ö&¿\à¦a!ièQÉ)nuÉ »fŸæñ,ÓÉ<Õñ_³å*É­f¿cá?)ÔÃH #Ú<^;Ê2$1÷$ `/n”5ï %Ü£H…ÊKµ·hh×–¶ÿíî4@‹j+˜˜Ù}å—'Ó–_ì1;4eÁ)Põ”-¦7žŒKHºRÞ„”*DáY`jà+{TŽ÷aH0Åøqø›ëa¶4“7”_ì ¬nHk!ã1B½!A"PV»o! ½ÆÄe”Ì×ÚÑÄv¬/0Îç*mù=]¥·²G¸ b°‰$!b¬¼ÿñ&ÉŽð–à—QÚFC(D rž„nª£õíÉàbŽpžܶüžàöV¶ ¸X"&ÅWw•Ì£<:]@8¸s¡ëÈï‡ne; @IÂIP¦îÕßzv$¼«d­““ñ)¸Âùàh‰ï‰F_U»€ Ä…,¯ÚÎýìïÜžG¯h(AÃÆÜÍ6ïuƒ$Ê‹œ²¶üž˜õV¶ h’Cñ¬½A“(8ydÔ“5f}.Yg(èù kËï Yoe»@OÁ›mØ,ÿ”g{êTEàB†'V›»U¯)xÉwÇâ'$¢Ðfõè}œç£iÀ 5‡å@Õ½š ý»(þ4 Ø×¹ýœoìóÍËv°Ø¤v`K¯bU«¡ò׫þ_"|]½Ìî „Ðh0ä‚ûÓeù>ÞÌËÑïÓdž9;Esè$²L—ïéæ¶Z˜˜7Û4ÊW›äAÆZ? hŸ/uùúã½}þ¹Õéý*¹18À¹ 4¯¢,p¬IÐzOƃû¿Ú`Ë&-”‚õ”|©«¯ÁügvlíØ­×÷öãÇò¹ÍÌÎ{ÖÛaÝ–/£r»È>–›,7_¢–K=EpÓÃÁJPÀ¹Ûð@ßÞÄqB#YÒß:2[.B¨ª™MÒb½ú˜FiiV¹S1ŽÁž\×fÙ¤º.¤QF˜ïËvq•¬ò65ðpgž¶xÈ¡Z‚7CèAœVÀ1zÚv·:ËÓ´Ï«|¹µj²¢Új>µ»ðÈ@uWô¹jÍ[k¼lcŸ™®<³z·ëðÙâ t•.sÒîÙ r‚Ký¤“›êH7 +˜`ÖPƒCP½ð¤2Ѝ¬Å°ŒÀ¥J¶MkÔHŽq#ÂOä­6ðs lb¸%ûýªP¡ô°|›&Õì2è\ˆ8¯€n5±'¨¹Öñ¶¡³%Ò‘ÐQŠ˜p «’­ë”Ð(“î–EO­§k†¶ÛàÓ.¼Xt“¹F‚/>(3_f؉ã²} D JÙkæ®{ ¯×N~¸‚³ë7ûL*Ò«1mÇŒŸ8$+ |u6½úytý~ºOæjÑÊrùêVƒ›”gfÂX•!ÚÆK=/³l•‚7CË¡NÓMjÕ!©Mã"€ÔᇥNõÝ,š›­æ3ij»ÈUN"¬9ƒÖƒž‘°æ åà|„µ#¿_Uß_Ùã kN¡¨}kë µì\ëÿ×(kŽÄ‘ó-ŽüžÎÒ[Ù- 'ò»Œ²„G~Yg9¦BÐá|\³#¿*ý•í‚ †æ…‰*Ÿôý—£‘w„u@-” ì|²#¿'j½•í€S2èy‹;¤ï·Ytsrlc2@œŽ–øžhôUµ R!Ys9]¤>Ûöä¿Nä“PsqòoWLÀ-¥Å£$Nïïò²h|9—Åab¦²‘‚9P•Žõm—Ó|‡™± ´ùöÞau²|“êRúª\¸J>¤Ç#Nˆÿuùš¬Á×4)šš\j7¤_‡­yȦ»V«@v·º:ÿÛ•]í ûuCÓéuÍŒVŸ£¾Í)ŽîD!.YwÝw\o›i‡·ÑÖÇÛÖPœJ$%ÝQ¼ŽÀ.ß! gŠžÚe´7C£¾}e¨YŠ©ŸlÒ[Ëš÷UÃ8úíýärÀ±ÿz4½}q9(ß õ/ǃûÓä$žZ2}í®™MF“ÉÕõ[3µ }‡§ äoÍý-ör „ÿ~úÃèíôêÅeqá§ú×ãb'BÕ¡ AÁDZCfìDaI§awt |ò4+b$©ü¬ÄSD%± Åõ›AEPá/Z<Äb»>Øõ3µ¯íÐç¯u”B»W²nÝ;~rÄÉ;~bR©8_ÇïÈïWêôWöøŽŸ@Y%yߎ?n:À¾ã'Äu¾©9ò{:Koe;Æ$H†_¶ãïRè[E“+9_EL8!ªpz»1á¾þ3l³R­ãž[ µþØÐ±˜ÿ³ç.fÓ= ÚÂdøÒ,U)¢ k@ŸÎîûjÛÙýsNÍîµð}¿içp‹0?å'íÿÀQŒ endstream endobj 3481 0 obj << /Length 1376 /Filter /FlateDecode >> stream xÚíZ]SÜ6}ß_¡ÇÝNVèê[íS›†4aJR ÓÂ0Îâ ž.†ÚÞdè¯ïõWÖ6ì%“imùø^+Ýsm3ò0òròËÑdg×8â¨Ó\“£%Qšj'ˆqØ Ggäxzx¥çÑlΛþüöUÙ9—aÆ‹°üù{¯ƒÕìäèõήeÄ" 9 4œZiðvH;Ý).]~ÑäÅÑäŸ à(F`c^*Y\LŽO9Ãs¯ £ÒYò©yA0Ê…ÆþŠNþ˜°¦cvÔ˜ ¨“¥-iá×éßg‹$¼:]Ì8›®¢0ÎNÓ0+­{ÇÃ(LdÔ©>o^v Ô0IŒPT3È Î+Дƒ$œ:ëH’eÃÂ6ÚíGoÞ€Kª%¯oPC>Ú¿š6~=»}îÐÄÒÔq÷Æ€ÉRv*Z‘¾‚VÙ¤•ŠMAkg%_wÂã90ÎX76ì7¯ÇÑ&œCuâ&`½HZ )©Næ@•v¥u?Ü¡¨°¤1ð<ˆÏVaÇ’é³¾¡‚j+Æ‹”6¾g¤xÛ#R„TH7Û¶·¶Ó áþ˜Ñe¨lÍ ã—Åx¬´ñ=Yñ6v+LS†K¥`eq§Y?>çAÒfC9 ˜Ò¶ZsåÐe7Ï?õdX;GM™³¶Möέ Nc~¤ä"ea"ÎΫŒ\ùRôãà¢:úŽ1®ÎÊQܹfï×çóƒog0¥­iØÙÖä¼ ð´³YaÚmÚ*$µLÕÙÿÇfË-K¹sõÈ´¡9*ð¢¤U»Z].‚,¬-[+U%â«ñ”ªÂ0‘N–é:ø~™ÎߨþJU Cõ–ªŸÙï*UûÔ”ªâ‚⤌)m|ÏHñ6v€&R\SËå£(Uœ*cÇc¥ïÉŠ·±CX… D·X)Vcv}ö£æöáCØa@5¸ñØiã{²ãmìvJ/f»Ž(4K‡Üã“!…„t–jñ5êi n3ð½Žø^GŒPG´öºŽ{ CVnAjWVËVÉ«gµKÕˆî]_§k¤þº¥Ó÷NÿÜßÛ3jú×þ=¾âöÀeÅ£é¬úŽ›ÜQÉ·p3НÖCA’×=ê¤/—@¹ôärP d‡Wz_¯JÂ`u±u $8ª~;^ $µ"‡Ñ’tß/IûÛ¿8Õ–9ßhÃþ“Z/ X=Þ{¾g¨x;@Ï †j[=J ÄêV6Þ+”¾)þÆ …;Tc[d€ÏÃznQcÃWyXϵ)l‘]ºõ]ek*ûn^·y<ÿ9øoª6þðR³ñ ~ÙðæÞ'îÒ¹oLn¦y‘Hx˜l­<#N9žô޵Q£¥®¾_êò7¶¿ôŽ­"=óª¹ ‚ŽÚ[€šžÉÐ<„üàTÂx/k:øžáâm쥠Šz ý pGïÅHß“oc‡°Â$5Rý/õg_v]ù!ãXä¶áý¸õ6uµgÇê'ÿ5T1÷€…EÝÞ Z"(“Û|#û­²š endstream endobj 3510 0 obj << /Length 1513 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WàQêD0î—ö©;M2ºŽ_:IFÃH”űL¹$U×ß/IÉ)˜¹L;c!<ØÅYì@"è ôrôÓåèäL[d±UL¡Ë%’ +Ë‘¶pÕ].лñÛU”®¢É”I2þñüUѸ—aÆó°øø[oƒõäÃåë“3C@Å Ð ¡a¸‹ /h3>).LX÷Òèôrô׈B/‚èÎx•K4¿½û@О½F kÐ]ÞóIJ0ã ÚkôvôLjÔ3´fG…))¶¢°%Íýš]/æIx;[„ód2¥d|›¶½'’À?Í $ØJî./[ær¬‰@šKl”qæºû’*̨@ [cQ¢e;&Úá»û0-±Õ0u½}ñ˹iâWsÛe„:––Ùg06L®PѸ(IòrRETf0µº`5г‚°GqÐ; ™r ÷õ—¡«%ÐÓ…Bù`­Z ¹˜S†¦ËÒ²ïC˜´ë· âÅ:lÙ1~Ñ5 )w ’¼gŒøšÚ!D¸â˜ ci°ÔÔ3Ú,HcúéXQÀ"GSBÀ7K‡ã¤‰ïIŠ·±}X!$¡ÕY¹ï›--¦ÐÇ­$e;.¥ªãXwÖ”ÂÙ`¬µðýXó7¶kÊÂ4³é6_Báý6 ®ŽÎkÊPL4ŽŽ&¾'ÞÆö¡Ã@©QôéÔ†”ÀR¹Š@çð6HÚÒÕFúCWµÁÄÔº>ªô`B)½e2ad¼¹™½'„­Ã£Äžb[> ØS€hõpb¯…ïîÞÆv{Š¥ÊWì-àíɬ©6Þr¯÷òò| j(°L5à=ãÄ×Ô>Y‘X̉0+ú‰B E”¨áDa ß8c{0'­«í©/ÜbÎîo^Fª(pµð=ùð6¶Fc^Ò1ßÄiGBæ« y>!ï胛ÐG}HPe”>»ú8t€&Á¦Ún^„Á¢8&{óËÏÓ‹Óó⃫AEëAˆ@;Š‹kzÎ#÷ ,ß½üóü7Ü?9£¤NASwêÂE»¬€BªÛÈ6DVGrß·0î̬­z¦µƒÀÓt¹]ãrøú.ÊE¡…œbQɨ¦†¾ÊËÃlÛÃì &f–±ÒS% ‚¿üüô¦Š[‹‰îp´…ïWãýí¾©„A©çž›ª«],TaÐÚ]1ñm¦sc0±j¸€iâ{Œ·±=D!·&Z|‘ót®5¦\ÇJß“ocû°bL>¬cÎf­ó:Hë„{ xhÕG€s Ûa>‡ç®Úê2£þ“%Á<; Ä ]M]ºÂ$I%¯åR^³äucK´/Á*¡µ¥Þe½ —]ôôcbšÙ|ý<ó&![å³Õf½H«›aË£§å#×X³~òñ:¾€|Ì¢¹;¿ûÝc +I‡SŒRH)à µðýÊ¿±ÝU#L3À?ƒh„pì·âÙ·%Á\¬ùpßP¶ð=ãÄÛØ²„ £_D,Rc±Öb0VZø~¬øÛƒjA *6à7$×u/ÅHÂÚÈÏ¡)p éÁ輘䥪}nÛýPïíø5hÇCL!wa½ï‡Öýì>!7;éX´Â •ã"B+Bwž=-"ÝöO™¯UD>€ú9°€EOÄ1¿þ•Ü× endstream endobj 3541 0 obj << /Length 1264 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£3Ì ¿?¶§­Mº´š:yK‹@µåD˜c{’ ÿ~—¢ÔH²ÓJaÕº]€¤(òð’ç’÷2AWˆ ƒ?χÇÚ"‹­b ÏTXYŽ´…TSt>Eóë$»NFL’á§'>3Žgq/&±ü;Zl¢ùÁûó—‡Ç† €Š;@¡6BCw9h3<ô Ö5þP¨E½7šr‰&7ƒ‹÷MáÝKD°°Ýå5o¤3® ?Ggƒ·R˜¡;JLI±Þ–,×å?ÓI¯.WQz@å0‹½aïˆ$ðOsë¶Ò!»äEÃVŽ5Hs t¶ºrIfT †­±(Ѭb\mwévLaÊXÙ¦®v(~11uürbÛôPÅRØ2ûŒÍÓ+ä3ã‚Q`.gTTe‹ÂS“ÅÚóõ ºQÂÙ&ˆ¯6ýTÑ9Bñf¬\µ–\Ì)C#Š¥ö†ýò‚ÄÜ ûz×Ñb:o2üµ­R‰)¸{o>RÇô‘`c[øWs¡ 3ƒ…,¼äøäõQ}ŠÁ]mN—²_æ öËJÍÙõ£Ù"3H{c«ŽÈV°±]Ø"vyV>—Q¶ õ™VKÙž6SeÍ/û&sn¿ÿ½5{vx²á7Òƒ±20-JzËÇq4-BñÙ³“"GéÍ2‹òçGcŸè¼œ–¥¯ž?NýÃ,]ÞøÜ;Bؼˆá°÷øÌj¹ÚÌ£uQ|•09¼uÁ1^ø¢[W¥IôaãÚ,SR¥” ƒ‰²²¹¿Ax®• lˆ,UÂo ÌÚ¬€³eͬ¢M p?–¬Hçóå†RŒìÃÇ™–B+qÁ½/¢B²HÖupï$ŸïHpìJF°ápSÛ##¦@ªV­GlÊšUƪ#^®JvfËÔgRð•dqõ‹¥ ‹·–Ç6MVéî4-7ëÕf½í<¾ä.Y_ûÜ"v/ïæw²Wú0¥t‹«+};˜RuÆñz“.²]£‚H$1ª17îì¯ø»|óÊ?&37’™È6“Iœe³ÍÝW¥©³VH°”ŒÒ|§8M´yŒ0•ŠŸõ§K%jAioQ¬ÅÂm¯K¥šPaš6›~%aÚ9d†IS)àà&û;¾4ðÝ$ØØbGÂê×寻'ÒTº3•íï ÑÀd+ØØ.lq†µ¡Ÿ—¦;W·‚%.;%øƒ¬Šúþd§$+YÜ•œ¨µîÝQè’Ùº^Våç“„Ü[ y—&ëý;ý'ÿ/)˜ú`w%Ȇõlú“‚à‹°qØÞ¢F?,j„Û^ B\x(sâ·” ùÑ” Wëþn½êð>jjaÁ•Å„™½’Ž0Úô'ÚødÛ…-i0)'xOo(9vuUd÷'9çØ Þ¼¡|º‰ÜùÃ]Dš§›Èï.?w~&Ï"·ün÷•œQØ}D·‘ŒPÀ2½E¬~XÄ 7¶½eDb«Ý8þ|R±û…£ù¦7Ž )Î í•ßÞ ¿Oà»~x)`ûo ]wùs¹T0 endstream endobj 3445 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1571 /Filter /FlateDecode >> stream xÚÕX[oTG ~ß_1íCfgìñ\ª BSP‹@$•ÚF]¼=}±2myV/Ÿß;yŽÔb5»ö’cÏ ïù)„`ó5oñw×ë=Ú5Ë Ê9Ñ'bœ’&ÂÖhªI[,Þþ¹±ç_Ž×¯Ë{'§/W§fPz¶|°|¸Ü;Êö {xÝ£ æ ®"Å‚‹5»ÔÌ‘™€»kÇr–?žœêwg¯Žñ·s¼>Þ|¯¾¼Cô¢âÜ‘Ä##Hrͱ"Ý#ÍFmÖŽƒ­›×›³WÇë›4fÄŒr+Â+ ÅŠ…Š{Ÿ·åÁCüí<þù‡½»OnΔwœ ]˜Â9á\–ü|oçðá£ÿzxÓ&e„¶ÝãÑLUbÑ‚PG÷q{!3’3 ÊÓdH¦Q|®cˆå*á÷¹j2Ź#¿&žË‚—ÑSi‚e'˜[d4pNÉ)2LÃüâçµ ólnâ×QcÉÕ î8;iNp+Q›m?2Zö‚‘vˆ½àµYó‘hE¼’3E´NNp‚Íì<)Öæ<”ŒN„›[Ð.ŒF$yÁ­ÆVøÛ÷ —[„+ÝÃ÷ =Ü/´ñÕýB›ú…6õ ­ßhSpžX«$kˆ§ÄZkŠ£ÐígxôCq ìM†`ŒŠÛíB CòûRC†ÐõKMO—KMŽ˜¿?Qj.£?[jæÀŒ‘ix%c‹½{Á(µ³•f‹’:šÓd‘ŒQEœ`>„½`LL…œ`iý|à&&*NpÖ‰©úÀÚju'”‡Ûð‚±½ê•œuˆõJNz$>lFsSÅé·Œ¢Û˜¼à†rî ¹Œã«ÕyÖÇג׿›‹ÜêÄû¥5Krú¨fé·šëÔ,áòaÍÒ_VªôÛ×9ѾEͦØäýT"ƒ“üS "WàbÏ '8[\æÁ“×u„¤4¼áL¹ÄáÅ¢Ä%ÊÿW>Ë„ÇW—8žJO%ŽÛD|£ùìê4R뵦‘¬”¨µ endstream endobj 3571 0 obj << /Length 1731 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯Ð£<Ô ¿)mO[›vmQ¬K C[ŠM×BÙ³äfޯߥH9’l7–Y§-P (Šº<—ç’<—2>8xÑûíªwö\ÅAŒbIep5 „D2fŠáªHp5Þ…—Ó4Ÿ¦ý8üõíK[¸Ð½ÔÙHÛÛ7I¶JfýW¯ÎžG8ˆÀ dÆ WE\Aw¥-ÂcxAEᙽP¸‡—zçW½zZá€Üƒ€W™F·½wp0†g¯ŒxweËÛ@Œ(“Pž—½?{¸îXDj8*›‚ ˜[,yé×ðf¡¶5Ez«Ÿ@‘ãp=_ÙºÛdm w}‚Ã$+\Sgd•ëÏøgzi(åd<Þ(å½¾Â[)¬T:;0wÓt4µýÁ˜ŽV3ëÜá˜ê£¾à¶äkÇà€2¶¹§!'·ÅbšºÒd•Š´h¸KÝuž¹|0-PîÙs‚ë“z£vZÙâXÖ£›qdqùíÏ-›‰!ÇU˼–U;ãe9q€Só‘‹D¸…HÜOŽØ¤1i–îc#ü¼¿Ω1å¼¾ºÛ^ÇRu÷ºš§–­¹su윬MzËIog|ÙöaøTÊ&ü*l¡§1¤ŠGpæ"sV¥ù²“gÜtʵm:ö€L!EÛ8ÕvbAÀ™ûÚ¬k Í®Ë|ãT¶º½Ö˾ £ Ö[#îôA ¬iA»cM³ÅÊ `²\&ð]ZLC¬Ç™*$I¼Ûm¤;fw|Ìì†]Ü-9“j ú"ÎĪÖe9gãVÀ\èbµÌò]ÎD s8Ô™MËÊb ìò÷—ð7üãµskÒ§"t>æ«ÑHçùd5C®ûúœAËa=0‚p´÷®HGf7»ÑÇÀq&AÞªÓÀÁÊO—-¶ìûéX°‡ŸÀq• ‚ÿ „€¡¿¥&ýÞÎß81 ">]¨4í{†Š7Ø)' põUÎß8f'<]hX÷dÄh>ÌÉ[ÉÇÎùÚ)åòmB#eF¼rõé|a‘Û¥>*ª=»RsÍüò¼AüÈ-ohóæŸ9ÜGô¶Ju—P5õ×[y3j„âvè}ÎÓU"–Q'•xE§‹ùÐø]F~wH(N')‡EŸœî«[˾ßãöpHZ¹§@ö'é–&ÄßÝ×YJcØ'N÷°eß3N¼ÁvP#Ô-pñUÔ!dKåÂ}2Všö=YñÛ… ¡uÉï f®ú|œ¥X!ÆN—Cµì{òá ¶ `XÒ¯ýEÐð›%·ÚGýS ‹°x ñOÌWÔjÌþZ¦…Þ%²æ÷⪒×Õ„|¡Gi©ºœ¼¼úûí9rÅ©Þ~ñ.Íœw5År•ÕzZVgÅæ@öß4/ò‰Æ7’hÔ¿¯‘LÔ—ÀL.`& ¯£ñOFZ'Ë4¹®*ct²6,[Ÿ)ªÃèz€VNVáy³¢ÐÙgK»j· Û7Ŧv$ùö@TkÅc Äý麅]öÝpúî~ ØÎ›YÔ.‡¾³öñ]¿¤å°”b~Ìiÿ´ìás endstream endobj 3599 0 obj << /Length 1817 /Filter /FlateDecode >> stream xÚíZßoÛ6~÷_¡G{¨þ¦¸=¥k›uŰ6ñ[Vš-ÇB9•äÞ_¿£(9’l'’µëP )Š<Ýñ;?½{ƒ—“ÁÙ¥=´¤Ò›,”ÌäŠ"Ÿ+ø\.‹ ”?<³åÚ ¼ž >ôÂyP†2áÍn×±7‡w¿{qí{÷yÏ[OŒ(“P_yWƒ\5Ì'=J™‚ Í­.in×ôÓ|–„Ÿ­:aáŸä:a¤…‘gŠ‹†† )Ì=ÅâL M» QÂ=Š´¯½$ô•êÒ·î€JÄÁŽâV01½]åÓQ—_Ng›/TeI¤©~esÉg+—Ž€WŽ#¯âH5RÒ·@Fqf;*Ç»L1n`^dº0º(Þì‹)Cm$ã1B½1ABj«ÓOÇDÄ|¯ÒqÄóUØPeø¢­¥ý9H]¾£ƒ8+ÛÂA˜dˆq ó‘‹Iž-ƒ¤>Åૺ5`"+=“0XÝž æ ‰õX]¾#`ÎÊv +ä‹ðJÃäK4;y‰Á¬" e_ˆ5ä»!æ®lÄ$°_Ó*K˜iLê3-Á‡„ÅNµŒª\hÍm‚3ù¥5pI"\vçFy”VH‰“䯘óÁÃùô.˜YpÍ\ _öÇ2$ãHãþXFC¾£‡;+ÛžeHæ#âk7–°C¿A8ýÞø†¤ øs|£!ßÑUœ•í ©U…]F‚ä£íA!Æ´w¨º|GPœ•íЉ•å9¶Õ6hØÅšmïN_&˜"LEˆÔå;"â¬lD°Èc—¥yë8m‰É>#¥O ‚‚qkl…&KÙ¶ ùnغ+Û[¡a_E L£ÂiKp «0v!{Â÷Vê¹ÉÞ¡ä˜P0’'•óù8ÃÃ8Q1¼‡ª‡wIh[ƒM¶ ã,šY´Žm[Á¡›Ùúß4ž_8ž!ÃÉH³áyÎóþÙÚ–ï^ý:¾|ýÙ§ ì1VJ^BË& ç•F -Þ}1ÊI´Þ Q¼X'·¥Vзò•¶–nfKû.Ø ²å,HCûf½(ì40Á´ Y-ææê··ð7µN'WSP4&ºbóg˜%[9?ÞuÊ–Afk•i ÓÆ0;)šÖ¶¼ ³FùÉÐð03³§-éz¹)¥¯ÒbdÚOJO%Un§3»iv“ÖY}éÆåœH;'÷Ë(ŸUJV§Ô>q™bµ3`êó( gÙj;’bˆödŸ½!¸ºáS‚Ùczph©ú10h‹2%ûsCfÍå}Dµ.{¦•Dp!Üj^Z°Z­ Bsûø÷öø\š÷Å\Fq”žºë!zÔÞ1gÈ´Œ ¬ý"ì<0©¦Ñ&÷ÄZí—=‹UW@¶.,6[½e÷§ ð)) (hJ}4¬€Ĩèn…]iF§|Å>¢ù ûÚ¬„¼RpÙÒÍAÎ6Áyˆwݦr¿mXC9¤»FñYº9Ilmõ>Ê–m@±¡pµyÊFúæ\•}ªa ‡u§NYR°KÖqéÉ8­**Œ¹„âuŒ.Ãl“Äéá¥C„ßÝéJ‰Öìfðç»ÂÌ…Ñ´°všY˜¦‹Í Ÿ¯æXÌ*á?!p#"ŸÎ±La÷5ÆI¹¦˜ö—la>°mÞ_¸!ß>º+Û>ÙÂ|`éìÙr-;/hä\(ÿÞr.L‡ïñxßïè1ÎÊv8p0 Ô¯©¿ZÒ…IŒHGü†|GTœ•í‚ ”œÔSaŸÂíÑÓ{Ç[=QÝŠL(D˜üE¬c^=(Âfqi¼w,»ca…eî|?Hÿ1ÒO¾ ëoaæ_sì†D#®XwÜÞ~Žˆ²HTì ãY²½Ëê6=Xò8…¤ )E;QHÕÝŠoE!á8}¤ë‘>Rû«ê>6ä»m;îʶ§0ÍW°ÏÁ 4¸#ÿî~"Bú㎠ùŽîâ¬l–B1„L¿ w$>„!ÑßBC¾*îÊv@…hŠ8?õ5¸süÉñ%ì_åH ;E•2Ø€&WPÁú Å0,Å05³‹›ž×¹“ò6ÍÍý€)M‚Ù¼)̹<Åž¿­§ØMÇ<}nÞÁ¬nÂÔäι¯‹›Ó¾ØÄ3£ZÑ?nïVÛC7¯^_î(Çz^f¼sùÍ”7„;[™³L[‘ɽØ}„Y62iAU4o)rN´KÅþààÿÿÄû.z4 €]‰ŸÀÀ«^½§ Ý1;'ß̇(ùŸ%ß;á‡~ÕÏ!˜Ú(výQÿ¿ñ5Ê– endstream endobj 3631 0 obj << /Length 1932 /Filter /FlateDecode >> stream xÚíZmsÛ6þî_ÁT'DðâîSzIzi“æÍÎMÚñPeq*“*I5u~ý-^H‘4mKfäNonÆ °ØÅ.ýŠƒ%¼û>Àˆë8øl{^‚`D™„ò&øxöþ w ‹IGF¦ Hs§Keíºøm¹(Óß/’ͦ˜~¾ØU½Lêôbëtü ÿÄ*Š‘fóøn 6C ó@1·j›vA$¢„éXe¬:zö¥·Þœ€r$bÙLàÓ{ª|¿F}ùÍ2CW–Dšê¯ ¬X^®ðÁ;œh˻Υ ÅÊ{7Ëkç°[åŸ"‚)Æ#Ð ‚®Ã$ 11á_ÜÛì˜Þ@Æ9b„ABj§ã7·‰ˆÅA§ã:É—›t IøäЈ$ IªN0}ùf²² “ 1.a2˜”ˆ.Î]$UNî.`†^1Pñσ=ƒ‘WOÀŠÁóVH—±FŠ(gêó´NË«,÷è­Üó‡çÿŠÞnë¬È]Ýb"LŒšíàÚÁ˜%—~låžUZ#c5h…4cnªóµÄàèxýú팉ðç™aôîíÇóç3Í3BHxþÂt"aÑ̲|™-`ÎÊUëuR»Nu#²Î¿ÍÓÚ× ×aîßgUµK—MÙ.\}Ì(ÿ0ßô®}—7 á¬fãšvÖ€yÛ#†yøÊkr•\»B‘o®ûJAçvà0>ú¬Õ1÷ÆA!˳:ƒ3*,„8Û¥Uýjš…EéZ3?&qj7¯L¿¼vu?È‹[¹1­üýâE—e’×Y~9|áêfŸ×Ùbí'n„Vî9O*»ÎF—MU¸Ò:©šÞ¾Û} ;²,ÝPkB¬ ö§/ înkKÒ˜ QÈ@wK0Žb,NòÌÞî‰ÕºéYu˜îöIµß/&b—®:¿¶’Iƒ¤ƒÖ8ÆÑ}ޱ“»í8C¦%" °Ñ×(¹G¥¡ÕÀK(;Øê¸éiPáË÷Φ? $e–Ìã톂ç¥aa1rû¸jႦ¿(«²¸Z¥UgncTL‰7ʇÁ‡´Þ• oÔ*"Ôñ¾l$Z¥ò"p‹…`áêAèò=šÂº!¯t—¹AÄ0–1::7è´ËìªÏAƒ5'ä ‚7×§ã ùÓ(Åteç ‚JDâ©tn=? ž®ã4æ©$žêkðNa€œŽwäO ’ÉÊÁ;ˆÒ¿Žw :ñ¯Î;Ç2n®8±ø…Á¸Mš”Û°5yÔq¡`~:¨ã\"ÅÄÉ¢x ZOWöp¨ã#LÙD¨[t`€xì³T›Qêtçâ@þÄ`™¬ìÇ™FXò¿ ò8£HÅê1RmGI,eÃ3¯ìwÅ6Ó4”yí -î±ä›,òÿ‰Ïhâ##ñiÒœrÄŸïfš†Ï¢n2;ƒ4ýÙƒ2ù(ÏÇ¿‚¿‹·?Œd=Õn±H«jµÛ<,wqçzæ¾C¢S­ì•ÁÉNtKÇñÉ@z HOWöðjŒˆ’“OtëúÁY®ÿvŸÍ©Ö' “¾ü‰a2YÙ#Îrª4lIõUÏòƒ½"9Ò§Ë)ûâ'údªªÇ¸D֋عd±NÊþúRШ¿‡nÝD ¡ ;}G7ôár:õåOtÙdeñ¤®æ|vGhö%½,2ƒÔVè‡aŸsÚ&ͧf*ˆMñ4Sg& UÙ–ie 㢠@[Þ–Y¾È¶æbÄTóä*5%i?»š––µ™Š!¨æù%-‹ÈÝy9šj«d]¢Y$´t÷TûVWÎüð†ßºÐ[;c½nÞ¯vùÂ|ð~U©C8vüøº/Çÿ‘K°u[äU6Ï6Y}íHX±ä P"-ûdt™î5³4ÎÞCþXÔm®‘ÔIÅ®Þî|#Èe½v4@þ°RcÄD›,ôâièBp:nyæ²HÛÏêí'ñÅf·f??ÜÍ4/ÝCü°NÀÕç;ÝŸ¼l²y™”×7“8ÅÚ…ÿ_Ìx¸êi6¦u¶Ý‰·%<7­¹‘ñì™›^TRïÅmÖnÉî’…yj/tì­¬ä½Ìª&}ÿX˜q ,˜w‹"¯ðeSï`’©š•0ûPðMâç™§wˆÿñ§×¯‡”ÙŒ3ÑR{•ü]2ôÞÛÝÆßȾåÀýrÙUµ q#ÎúÐsËŽ¦p’V† ×û*‡¡½ð@Fϧæ`a|ŠO;ñèA¬ÁÍ‘EÂJ8ëcÙˆÙýHk~áðò‰«¤&ïÿÓÀY [·à˜b!Ò»b4Þ€hL`>Ý4Vöãþ½ÆRDþ.¾RhHü}Ô‹Ù#>S´ÂÇ~KȲ`þŸþµa« endstream endobj 3563 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1637 /Filter /FlateDecode >> stream xÚÕY[o[7 ~÷¯ÐãöY")Jн Û€nšØäÁKŒ.hagŽ ´ÿ~å¸éÅm4M6 @hú;$ER¼sa )pá2H-PeBA²}%¤ØW"¡¤lD EGCéƒSƒr1¢mi¢‡JNI¡j7"‡–‡B+ƒÃ¡§Á‘ÐepJè}p4äăËR¼r¦áx:çjJMÆÃa¤JŽ Õ¨0¡£ £ÕÁƒŽNƒaU-_ɨÊrX‘*%›7”(ó†Â ’{†¢PÈòX‰Aµá Ha2ã ±lR(*#ªŠ/æ‘0[à:xdHÁmÈ–êÊ”º@3®ŠØÙpå6$— Âƒ§ êàAJ¡Áƒ”¯ÏºñèÆWp»n|…«UdrïÞdúìÍù[†éãðÝÅßgøÛ;[œ­¿÷ïOðwsvà6Gè~k:rï·oHf‰Õnè¥!YJÔV¯cÈãp„’dºž†éïüörŽ„ühµE+y‹W/_]4* ©’cGâúÀ\£T·døÅÏ&ÆkEnQŠŒBÉ¥X½ã"EEOñ‹à¿W²p¬Þøq'd´S27d†×fî)vÔ5¸öØ›W²ö˜Èi3力R½`Žìµ™²F+Ò>pÂÅ­NɹKäüÍûËÅzÜí}Ü ´ñоõð´¥ÑÅù’Fï,[LF lZ.Qh[=¥]~€–éÁjyr8G™ ÓƒÇûaúlþzŽß¯\³çóÉôŒ™/Ö6OX…zjêbùju2¿ØtøÁûe~z6{¸|FMC>ÀT›̓٠B¬ñË?ÊâôñÈÌÓÑ%¡[¢n‰éÇ7S[¥¤Ø VÞ‡™™csÚ[¤ö¹Ò:_œ¬Þœßd™×†â€v˸6§t”f shÎ3Àçlyqz²šŸïÍNOͬ½óÙê´ŒaV·ÝSÚ±ÜA?.S»jÇʨ"w`G.æ€~ÕŽ¿D|ív\ßkÇãé§Ûq½N;ÞfEíg/¸GLãN0¡Å’W2î™àÞùÀI#FhXQpÊÎr¾ Œ³ìl;À"SrÚŒý,Úzæc’Q/~.Éy@ŸmAv±6â€äçh;©,8 Œ‚W¼~Æðí€L°¹éÿ£Çöþqíõ«{,–îM#í¼%¶]·o»n×í±•bÃFYÐS›í˜ ³*²Í=Vùb_ûgôµóÙél=Û[?¿ø8ªÒÛJ·Ew­ åß¶õ«U·—oÓ„ÆÖ¤ŒÛím’ Ò•ì¥Bw­P}‹ýyƒæxµÿbAºÞQz»Îþû.ú‹ wû¯Õ§ä+U'ûïîÕs pKÞb¶kŇULÐ,ä fÈÒ½à³8ϧÜbn^ɸW;'•]XÛøª3ØŠ³ÓÜ15ö‚q3½PXìu7X쵡ڒät ,^0vvK†ÉNS†ÉêlÕïÃùç?:(¼‚+}õ no—Ç `/—/ ÝuKÜè ¾-ïj*_-vjåèºpürµèÚÍ«·ºèbI ÊYDŦʨl¹×cï·h‡ ¤b7Ê(ÃÄöóHû]Ö„²¼{øõ·'O~xôààð­ÀBUì7·ˆ[‹- S$R1c "½†vëígÿ²ýúK½'˜KìÂ^0ÜÍ^0:X«âLÄN›mø¥Â^pE.ŒŽ›ÓfÁÄ™ª[ÀþŽÿ>Þw endstream endobj 3657 0 obj << /Length 1907 /Filter /FlateDecode >> stream xÚíZÝsÛDÏ_¡G™A×ûÔGyj“B …Ä/Âxûk*ËF’éä¿gïödKŠCœ(. ÃL©¤»½ý¾ÝßšRïÖ£Þ÷'oÇ'¯ÞE‰—$ä¡7ž{*$a"¼(gļñÌûä_/²j‘®¨ÿæ— |¹Òs]êbªñóç´Ø¤ùè÷ñ¯ÞÅÔ‹a( CqËÄY^Lq8Åþ+|p™˜C'çã“?NPQ픀£ByÓåɧߩ7ƒ½=Jd{_,åÒSŒ.BxϽë“_OhÛ°˜µôhx*F‰ºTÖ®ÉçÙ´ÔLfY•ÞŒõs=©Ë´¨²ZÏ&S³²ÐÓ§þçÉ•þ* ÿ1«9%‰2RÍãûž‚DTz‘PDIk‡YW,$œI“$N¼R{ó–â]nûWï à’¨8l cf¨‡òwNëòoœ~ˆ„6¯$ÍZeýeú’ ÿ7ºª¿…¯X`ͬÃTã0Õ žjö@Ô¹œãGîGBùmGp¢gæ=G×‹Õ¦Æ +׬®u 1Y¦ˆú8j†6qù6×Ì"& Y¼qäŪFàõ;Ür¼Mä­sÌši ˆ¯ìF2ßtd¶NŽ¯Þ¼¿¾ŸŸ¿|øéâôãˆ1æû¼púÃùéåù‹•‹8œ'à‹b–MSŒ¯Ù¬Wîi…Äàëun)앆J—˜V%Ô‹´î1aÊ*4b˜ÌÇrSÕHe+è9nØk‘ßBåCØ$ ÍÝ®8- @à«M™Þ6Bn PÝÔë]Yïcq1¹–•ö|YSá¹X«Ò--\=;»¸~óö§ó`çbëBÜ\Ù×-SEM!ÛWÜ ZBD¿¸J—mgˆ«w§øÂ óuºÁ«wŒ¶ÛˆãÐp¨èwuýí’-$‰©jf×=žêž$ eÕšxsûž: .œºq!$³áÌšþÆZýÍÚˆ 1+²º;:ìšù[{ÀæåjÙ·*‰Z²Q1gÎ(wE¯t½)‹j¿ULEOeÃSoUtÛ«ÁÂùó´[(v-œGœæíÑÓ*á‚Á4²oö„[<©?×!“ê³¶½ò™³¦Œ¡JoÖ”%0à±0pÿ0 <\ÙÃgMŽùÀY³› w½ Jé3†&!%ŒÛ©):phŠ^bf’*!L¨ãåK—ÿÀ|¬ìf&r"¹øÇf&(I„ÉðkÌLŠ7oJü3Ü„nBA…¸ÈÍO™Œ€Çb1ïÊoÖ6ˆþaeUäw¸v㞸akÿ C‹³©|¦’$9úó÷§Áør%hŠ’è)µÖÜ bo0ž2!q(¨2_cBâ\ÀÀÍÛ˜¥‡«Ñœ×õ¢ƒÛ·ÐÜAˆ&ß‚û5n8œVVÀèÝÁíï³›åM36°ÿ‘ø¿‰·bø(¿oϽß`·÷¦g‡ÖÉŸÄÕ¦^oê‡ÓöE»÷ÛwñŽÏM4ë¥.êû qviïä£ͽä8òDsýÃü™|¸Ü7ÕìÒ¢ÚL§0ÈÏ7y÷·’­À}ÿþJB¡£ò9ÿüê/HÉë! endstream endobj 3680 0 obj << /Length 1621 /Filter /FlateDecode >> stream xÚíZ[oÚH~çWøVe2W_vŸÚMÒm»«´iµj+dÀ«ÆNmÓ(ÿ~ÏÜŒm \RUª”h†™3ç~Î|#Àέƒ—½ãÞŵ8 \ê:ã…#\äÌñ=âŒç·þûe\,ãÁ Üþö•žŒ¢E”Gé,Òÿ Óu˜ >__\ûØñ¡Ë$CîQäsÄ)^D08àùý =PÈC½«qïKvÈF 8Ê„3[õ>|ÂÎö^;ñÀwîåÊ#Ê\˜'ÎûÞ»®據–§ (àZ—BÙ5ù<ŸåÑ—Éb@q?ËïÃ\Næát@p?‰&wZÑX`ø'J[Œ!%ÉáeKw†<Ì $¸Ò]® â"J¸CQàN9‹š²Mn»W·PŽ„ïZš1‘Ô]ùG5ù[G"¡ÎËE ¾ƒ²Ša~ëèÉÈD"©"Ìë¦ò=â8-uÀöòq> ¦·³AedÊ€: 8 8ÐË„0Û1ß©.ÃtžD-MúÏMGÂK½óeK“Çlé¬ìÙÂ\†wA%¢Þé&a‘’ÇÓÆ…$ÐÙÒŽŠìŒ\u‡FÑ÷6u×G¬Üâß1S:+{VfpWÙLÙ‡•—#ÂO Ün<}pàiPÎθ&ÿŽë¬ì1#Fލqùº‘å\>Ü^Häóóţɿc<:+{L<0CÂ3O±ÀŽ#2[†y3"@Ä;±Úd|Ópuy¿ÒÀŒ"žâýJ=1û5à( ç äÒ~-TP¤rïI¹0þïíÕ/€þô=[—wër>¿KóÎK#¹y¯¾‡ÙvF³~Ó  8›Ì·­e“ܧ߰H%ÞâaóN•²ÏÆzº¶_«9äú3‹ÛÍš¹~õ1Éî/@¹ú.o>Qêõÿ^ØÄU«­d7,Ϋª~üÑÕ°HôèòÏÔÆ£ëý_¯àorófÇëXÏfQQ,ÖISí]?ƒáÐ1?åW0ÿ JGª endstream endobj 3703 0 obj << /Length 1774 /Filter /FlateDecode >> stream xÚíZÝoÛ6÷_¡G{¨’âçöÔ­iÖCÛ$oma¨¶œuäT’—eýŽ"eKŠíXfÔ®@¢Åã鎿;Þ‡„ƒ«gƒß/'/¥4Ò‚Šàrp„©á*Ip9 > /®“ü:)ÇÃçï^ÙÁy<³8Æöç_QºŠ£O—¯O^*(`(BÃIŠ“ð¸’á H5<±Ê´Y48½| ÂÙKCLo>á`s¯Œ˜VÁ]Iyp‚ ŒÁÅàý×S¤&GÅ“¤™•%/õš|™M³øëäj4&x“Ûh‘ï#æþI)#FšþærÖ’8D³@†Áv‚Àæ6'QŠ´ÒAóš„MfÛï>äO9ì©`CíËßíN“µ»‡<¡ÎK Mõ[2Ì®;8w°|%¬¬+ÕˆmqMÒÂⵓOð°¦·M`ƒ~}=PKClŒÁM/3Ã’Ç<[ÞXú7/þŸŸ¾Göþ;û¾÷!b˜äöÎ*gvT,íÌm”»¹¿GØdÉrån$é|™Ý¬ù ·¦¡tØ•1!åa`5½¶Ùz”Ûk’Úë4Ê]¿œ; {¹øóüMìL.Ï.& ›ª¶åoЯ*Æk¢â:*ÃÍÄyk¨¹[K{½Š‹ ¬ü2*tÔ0»“—×Ít¦â»l'QPÔm#„Œóª,ùµÅ³aF Q­+ʼV 9æ-‹¥Ñqf~¾/9“Ê¥H-d™y—€&iR4kWí×wÌBdîŒ!«ÊʸIRÚJsÄix°Òª¢tF½£]îagk<®‚¢¤¡B3”·Ô¿)ï®ÆÆX+3ß%ú3;ÇŽþaFòˆJ‚!;]WÉE¹–.† ìn†ÀìvU¹V–E÷vx—ÎÅÓØœw‹û­f¹2{Ô,V)ImXk)éÃÓÇøD®&fª~¤rZÖd(ÝJ7Ýê<.VYšo÷+ÂUwƒ¬8ÖÏÚ·oÜÙ<7‚:áèžÆy>_-{|½·a„e\ã#¬ÔÝIq•Õá`J"ED-&R\ö–еøû%tþÂÞâ` #Âø“µ8Jhµ9à¾my`&)Ÿ¢ÉÁ‡SEõg,MþžÆâ-l‡ìŸ ˆú>]ÆÒ¡î•&OT¼…í‚ ‡ãŸÊý¨;ðc ³èv p]ê2fäü[”e, ¯z¶§ÿY45Q]ò!ÔfÀL6nWN† jÐsWxÚMáU²(ë†i’[ÂÈ1Y×)0vuŠ™mÕ)å¤ã[»ŠóÂÔvŠÁ#*ŽóU:Ý7…\kWÒß®ÈvœÍ;JVžÓ½FƒÃÖ^œžÛÁ,ž.gí .‹óÕÂeXF”¤* Ó”—÷F²ŸEØÿ³ø7DÇ•^ë#¤-·É?Ž(UÞÖòõª‰}® ;´b±Þº?gbŒZe¤>(i—Ýõé%i×Û„ti߯vOÓÁlÊ÷a½¥éêÒ_ÛµÉÞ/Â{‹zxŽN5 Tž9º…½uô[Âê$…êȼÓéÍHšü=­Ä[Øy •±Êç¿qvN¡ 1/rzC¥Éßoa» "âî…É ¼7¤íW&  923ßæÕ2s*(¢<|êÔ|ÛW2b£dgLšäeÚqD\"€§$=Æ%l»Þ¬»ÉßÓº½…íš°Dâ)S‰}ûóõ£Å&¢Áç9ëÍNZüýìÄ_ا 1Ÿþ1ò]bQ…º¿Ï/Zü=Qñ¶ *ŠCF÷§xb²,¾EOˆX)]wä¢Xf®J¬*!3\Ý|®^ĘƋYóeöºô³Cñ=;Kýªg‘W=‹é"‰S7N£›x+¨Ýkƒo©EÁŒéX‚·Å¦ñuU™]Í×:mlõ;lµ,$’´ÓkFŽÅ^Ût2¶4÷õ5Ö´Û¾áfpJ`vÌ'ÜÿtùcÍ endstream endobj 3733 0 obj << /Length 1491 /Filter /FlateDecode >> stream xÚíšÛrÛ6†ïõ¸´;ŒAíU𨩓´ilß%#R¶¦2©T¿}(‘´d‹‚™&™ÌØÃ¸Üå¿À~EÐ"èùè‹ÑщÔHc²]L‘q¨9’¶’¢‹½=8¿ž׳Ã1äàÉ?§vç,™&y’N{øW”.£ùáû‹G'Š Cn ’aHx\e‹ 7Hupd7,Ðæ¦ÑñÅèãˆB+‚èÚ ¸• 4¹½}OP ×^ ‚­Ðçªå ”`ÆCØŸ£óÑ›i¦hÃÚ¦ XÖ—¢Šëòßx’'/³E9ËÒºõŽÿ´ò`-Œ]³yÞñ”cI$¹Äžšó‚†˜Ñ1¬•Fy‚¦ ×ÚÖ6Ÿ½ûbÊXýk˜šÖ¾öÝkiÛ¯_ë.OhÚ ±fúœ­ æWÈîœ9=A·JÏ ©'Ó8py:KK«×V3èí˜FÈé›7CSM ¥Éw᮵ºk´näA€9ehL±Ö³_¶Y˜+´nw¥ñ<éøqðë®YH¦íƒ%IÛ¾g’x;»C’ðc„ð0…ÑÎ.£"¥§K)`³doUH€lS¥mßSogû¨B$ æÌª²„ÞËÙe»£t£ºêJ¡Þ±/Õ §óèªÛ§Mw¦¿ï¬…a\øŒêíÖz*x%¡°Ž)óhRÚÂúòÙÓñëUi‚Ó<»Y_:;~ƒ[1PÒ|Ù„¡Ew„úØt„XQ—éß:6[>+0§ë–Eœñj?rîFóy6‰Ê$¶‡n+Ë´–6úš¹îæY:+Û5x-áýñŽŽÍ™1ty®\*¬{p7jã;G­ê–îÕÛ˜>2qå³èC|™ÙíUâTÆYSÅw„°d¯%}8*Ũª›ß˜LE¬¿’‹ º`’·#È–åbé‚0—©€¨\£Ï³òzoºAhÙxØ ð«­ÌYR.ó´Ø, ²µÅʯó?OáïòõKÁÔH5µÅr2IŠbºœc÷ø&/š7ˆzæ÷ãeRrïEŽ"d˜ËáÀQï”V}:öýª¿³»ƒ£lÕã#¤@Ü¥Ç0ô¦ÇÞ%ÏE@ª‘c°\iÛ÷Ìog{Š€Á@ÖãîWæGaÆs=Õwì{ªâílU8ÃRÑ{øq«$¶ßúÀ¡€I®hb÷pp(ˆÂ¡p‹O⸠†íн¢Âêè’Õî-ò¤HòO¦€'k6³;UYÿ2+ÊYzåê¾Ø~²å7Ë–EÍ–Iy»H6På,íÏ”ë~±AB½‡„÷0c‹‡ë¨¢xåý½“œ6Y]tðã‘¥Õ¸?Ur%aÄPÃa%—fhÒƒ¥Ž}¿¢äïìîXÉ%$’„•Fÿï+y(°ný«mÞ3S|]íA/<Ô˜0õ¿0%‡ÉTÑ~Ǿ§(ÞÎöQE(Lê¼ß‡)½V9L€e“ŇƒJÎ9Ö«>ç5K´jò\ý•5‰\Ge½WS¦Lw2JMá¿­Q-O¢øvnnY?ú‰›+Üü¡hSµps£ÁìžQö¨¼ér¬W™åÉ>Ä©° ßçZæÆ¯ß‹(7¯­HöâM “—1¡`K V°:öý –¿³»ó&#3zò&¨_tùÎ5ü®P“j L5Ü´¤cß/MüíÁ50=QܼääôÕqû3pigÁ`¼j~f½Þ[-E0‘ÉÕ2ï©•¯«}¤2ß‚ÅXˆ=¿Œož<ôU*ÍžØ×U*4Çê‚9ÞxrþôÔý-Êo ˆ»óώϨ¤“,NâVMï~A7³¢¼Ôµ]d‹å<ª!÷jfʬ]6MïRÒOb}ˆXíøÐ ˜BŠË°?­6kœ-jq¦Y^ÏD¢æ8 ò"vE·ùý.b¯ 5MÌÅÏóÛêíºÚ]Óýv°te|Ó¯=<ì÷”¾?öü kˆ| endstream endobj 3651 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1552 /Filter /FlateDecode >> stream xÚÕXßOÜ7 ¿¿"Û¹ÄNâdB•úC¬Õ6­*}؆úÀàÔ¡VÐÁUêþû}ì»Z¾´f Jèðù>±ÄùØ ·Â!n¥„Rõ þ·Ùr7MD¦D5Y54ðašjâ :é¬B ƒ ÓCNB!çD08g÷ i˜ŽB&6Cê¦+ˆŠZ…$¦C¤%¡€5©µª!ç:T'ðÑŠéà£uÓÁ‡°ê*,‹4øŒI'(%P*:K©òjD ĤSë9P±ù#HZùÅœiå·cìÊoÇØ•_ |ÀG,¦ùíX_øU ÜIuØ êMu>F6| [¿ç)™®@*¦C¸ÉvP:v‡ëŒE—ŽU‡e*d8Hµiô8ɺ’ì:KI00t–’™ŠJ’î»`‚…tã% ¤–ÔG…“é$M É ’†&¼@\9*¥›Ž‘qd:Í=1|´l:øÐí†0 >  >ÄGJÁœê°`¥wÓÁÇ`ÓÁÇÓd&~€T!!U ![‘€s†Tu­˜B%‹$Ô†롮âC¸Ul§P»f¬0,óÒÛ¯ ’èjÀ@Ëdº©™%eIªŽEZài¤G‡mFøhl3ÂéÄA5]Õƒe:ø¨d:ø¨ÍtðÑ2϶·gó'a¢IáE˜ÿöû¡¶¨)ƒL‰züþíÛW³>®)&8q‘‚‘¼`L6fã´œ£Ò‘ÓrŠÉ– )æ7Ä þú¼sr¼ ÛÛa¾c|±´ʤ´‘qvy-Í–µœq¸:Ì­Qzú6( ýüKN ˜Ø7øœ??=9Ø],Ã^˜?²æ/–á<œ—ÿ¼[à‡ý׋Ùü1B[/Ï”Õlülþbqvòþô`q¶b:Óý²8<Útò!ìiÄuÔHX¾^rìãüíŸÂè™nø‡ÇÇ'0ºŒç5,ãùµ` Oã±!³ùîû?—öýç£ã7³ù£“ÓÃÅ©yM¯æOçÏæ÷²}Ñ@0EÐL$¬|m-¦¬¬YcÁi¨Òâ ÀÚÒï†ù'/Ov¿Žð·ut|´ü^×ëƒá—t?×qp—˜{½û@ò(±^ZJø£±$G9Oò­œ#*ZèÒcG]=—Ñë#âÂFd'˜k…½à;{Á$±ƒ¢}àŒäÉÕ.ØáBà αÔì—È΋päIÒžÓ¨-œ£V['¸Ä–¼àÎQ›@X(j ä7ÄüéžÜ2ÿgæíé*óJ¿ó¶Ñ®0¯”5áJÝí6˜u0Šð9Ñ è#ïžñpcê ŸDsP‘ÈèEÏ©·¢+ ›s¯ŒËÜÛ"£›¾ž{/£¿È½Sàk¹w|÷N¯åÞ p­õþäTÛÔ½`äÇð‚1Áì]gÜfbΘ¹haî^0Š‹w‚Ì ù晜^lFÈœ¿ :•ÄWèT¯o_M§²fÑq.ô°š˜ÝŠoƒ` ¥=]´”¸ü!éï°¥¬5ê¬Kî±d}ÁqÖË>ø–ógãxsxpºø{ëõb¹õnÿp¹ ÷(ÉnX?¡á.ýnð§Þ˜6dpS­ãîÉŒ‰q‚R¬ƒHt×.»-M‡±ûôþ¶~ýé‡ÇŸï~ZôYÈßû„þRý™³Þ”Ü–SLÒ`$jÎ^ËÈò©nw‹\£äœ_³D%¸ B1v†Q:ú‹\¼–sÔ§å„ÃTà6¦+÷˜GrÖ— :õ3m7¬$^Ë(ÜÅ™FúT¼ JËɹÛJ!Í2ò´â#A’‘žúöüMÔxž¨ñüÕ5^_tW…œúFØ”v¾ÒŽ›Á@fŸ—v¡NùîN]{Ћע‚eË÷'œ±qQDLjǸj^¢\ºL‚c»ÙeÒNÓ îp¡¿XCyº†q[ÆÚ¶î£†oÚ(V'¸¢›$7–¢x#®Mû1q‚k‰mx-ŽâÝ?F%/^ËŒJž¼13Š×t0{ ¹ÿ ¬}Ù× endstream endobj 3762 0 obj << /Length 1842 /Filter /FlateDecode >> stream xÚíZmsÓ8þž_áÎ QõbÉÖÝ' -—®¥ÍÜLÇIœÆƒcÛ¡ôßßÊ’Û Ä¤wÌP¬—ÕjwµZ=Z;×vžõžŒzG§¾t$’‚ g4s¸@B2Ç—ðõ‰3š:oÜËy\Ìãþ€rì>>êÂE4‹ò(Dºú2L—aÒ7úãè4ÀN S =Ÿ¢ÀóaºŠáø{¤?Ô“jPïdÔûÐ#@…²†2îL½7ï°3…¾?Œ<8·åÂá#Ê”ç²÷ª‡ëФ&‡åÉ ’ž–¥¨ôºz?äч«›¬(§aM¯n´ho1ÇðG*ù0’\ñVŸg-iò±çøL Ì…’Vµs"%žC‘ ¤“Gά&^“ÛæÖûPްôíš1QÔ]ùÓ4ù[Ón3C—@’Êo lÅ0¿vtá¬)¬]µ¦^}Mi€X`5NK½`Ÿåã¼L1þÂú×¹@­ÜÁtÜçh÷Hc ó<Äuq!µx¿|ŽœáÁ®’tçÈf¹­… îmœ$¦5Mîtié¾y–f¹å§¬¥Å4½ë +SÀÁ¹6Åu¦eœ*ÃubUW“éöÛy<™ëblº*C}Õ@(¨IÜ”†æ%˜s÷ueäÁ=£kêÕ€B›ûz©TSËÄJÊZ’Z©R˜™¦™‡}ŠÝ}ÂÝÈ o$þùWŸ0î>~1<Þ8ý£MÆ‚@§K;AÛíá.Œë‚Ì‘¡›®Ðxær\(/IKKi\¦âžÙY¢•ë›Ñ3ح΢ ó²Œv»¤­þ†¥ > +e”ÚÙÃÉ<š¢F´8:%¸–ÀN µÖQàK}K3˜[õk‹gc÷ˆJi)‹v3̵ÎFÜ0I²Éz¿ƒAgbã©Å¿Ê,:`Æi\6áÑ:~YßÇj‰ån˜ÇáØ*o]áÚ®0СX9 c”Yž-ÚZ´YÏ­” (1J·¾ˆÊeü6jE¸¿ûZZŽ•Pi–ð*–ƒ†³]xÓ«¹‘µ›•j ZˆzpFËÀ9« ·;dæLÂAå2s@†¾¾AµøwƒAÝ…Ý2sF¶÷þ9o]þPh™Œñ}q87iòïè&…Ý-sJV‘@ùtøâ¤ib "m½`Øj”³ùÞ«… ÈáîÁ-þW«³°»¬0HøÝî6«s0xˆ»0°o U=7'ÊO]>š U˜/4‚W•ã“ ]ˆÒI6Õ€jÙ¬q6áI´~û_Â7^ßÊ- ¸¤/v‡nÚè÷5În,®®î~ªp›Çêêò‰!‚ ÿA§õŸêxü×ÇË߇ðïêìùðX,'“¨(fËdo,¨.‡YŸa÷nuCJ¢=ªŒ{ ÄáÀ!u#;GZü»#Ý…ÝÂQ‚‘Áaö©ºsýò© ð2óÙá|¥É¿£¯tvÌÁ (‰ï—NeTV¹ÿ€ C¶Ï Û¦Sí&Ø3J¥pÏ/TZïLý÷÷ðñ“'ºÙ&2U¹–MUU“H“¾ÉW©¦z¾JÕ3ý›þ¸(–ЍÊMšVÆØêŒtÕõƒêJ?(›l£¸C3§ÎäÁpm­O_X¹¬F+ÁV‰õËb;qhÒ{ @È›Imr‚vÙ6¤õµî†|Ÿ]`›ÃUÌÊæÂÚn­ÉdQëŽñ3=ø3=øéÁ­Ò·M®!áÝžP‰‚€ :ÑÃ% [ü»ïÝ…Ý AÁÔô`Á»û8Pâ ÏW:œŸ4ùwô“ÎÂî€ 'ˆröÝ€ §¾ÿ@¨ß¶øþÎ@ðnoH ðµjb5H›­ }N¯HL_¨«k$Ísºj u]K+¸«óÍó¹"XOÊìë°j5€Ž@W{>W•Q*aLïf˜%[Е^›€Ÿk~Ì ûkÑ)ߌœ¡¬‘šo *\!Œ¡)œNó¨(TPŠŠê„ªšužP¬gžg…a2뀮¬à …Þ0¦þÆ®ÚH¤5Oûª+3š‘š$ñÔÈ–›Éãt’,§”‰/Û[¢MÐ%kã_cÐ&œÙôÛ<6ööùiÞ?‰vTK endstream endobj 3788 0 obj << /Length 1608 /Filter /FlateDecode >> stream xÚåZßsÓ8~Ï_áÇö†ý´¬»§»£ô€Â¥÷LÆMœÆs®(=+KJlÇiº†c˜¡#Ù–×»úvWßnÀÞ•‡½ÓÑ£ÇO¥òR>õ½‹¹'|ä+æI£$ÞÅÌ{{ôf¯ññ˜ |ôû?ÏÌä<šGy”N#sù2L×arüþâùã§öè3-KŠ.ás¥,"$¼ ƒ£Çf \é—F'£#«°G¶JÀ«LxÓëÑÛ÷Ø›Á³çF\Þ§råµ'F”ù0O¼7£×#l ÃU æF!^µP¤¸Qj¦³$²ÊWwƒq`átÿµÔÔ‰nl\€¨Rn媲cVx9WvL’lÑÌ\^Þ”’ùù•g&ç§#ïmù܈›Äi\¼Ãé©_D Ýê69CúΘ€ÂT%ÿ›MóèC›Õ Ê:[¸•/žü9>?ymlúxLÅQ˜Çá¥3¾ÈÌxf Œ³eg©Ý–wÓ(±›2ϳë¦UJV¾­ (©uëäµZÎw8–Nb©Tš¥cl¦ñ\[87Ë<û|³1‚…Wv}måLŽS3Ú­BVOR m¾7f.­È&yÎLøÔÝ)¡ ÒÃi#¢’€?|¶ŒëˆÒ÷ñ%Ü£HÁVå‘7¯†PMZûÝÝY_¸ÁD¯î+ßDmC¾ ÿ._¨ÊòÁaÔ(뻀-ójI7>ŒD0ƒfœ5÷Û•O0Ÿ øzäúãÒì“]Y.ƒ×Þdœ#F(„¾2Šý²O„@,ð* ·³š„uuC¹ûÃyI]~O/é­l/a˜Œûð1ÈRîXzúì줾ÅTê ¤´ÊÊùâÞh1x'ø`hÕå÷D«·²‡ ü€2QeI“p•6gŸ#!Ôýâl{FW‘Óÿ·®èQYß#å·qª6Òèc‰0“îØ íAþääÜL€-f3ÇyjdAŸõ[ °aK©]»Ì–ëè’å±>x?wÉÆíL{ðÄ3û™™ŸÉ ‹ ø´ôg}UĪgK‡Î<ËÍD_qzu‡Æ”@é14WÍÖÅr]죪Ÿâba _¤~JnZá«Ò¸n4Õÿ&4õÍ_Ïàßäï-TuµžN£Õj¾NîfŸ{Ègr}/öÉ%CòÄ`ì“ûÆ;©òûTý•íÎ>¹/§´?ûäwè'ýÑè'‡ÒŸÈኔ†üžnÒ[Ù qŸÝNhZýÅÇxYéŒ ‡m"à ù=Qé­ì!¨@NØÓE˜ßUì#ÐPŠZYÐÓÝ!£ Q1\eÐß²ÞÊ£HpK^Vñ—hR4ÒŸDþ}‹‚³ØU²€ƒ×Pÿ›”ƒÜr‰Ó²&ñцFTÛ~ÒvÈdµ>–=Ãø%ʳqå×qjIÜ\yI*Ç ..Qõ®•i_wìÍ\]Þ˜±X¸çóu:ÕíÈGúRØúC¿_Ôåî#y´Zfé*¾Œ“¸°â²ùv`¡+B`ë¬3LA‰(¯wDgQE3Í× m ÁG¯2w«X„…›9‚]¡°à W…eõŠ›­G S¼ë; ¸¸¦Ò>9Ë¢MÏsÓ¼œ&ëYÔPÃÁav[î¢øÑ´k [‹U·HâË<ÌovË8²6ûþ“öá§I¥vž†×Ñþþû®5;•Íæ@iÙ7 ‡c¸Ì€®6ãåö¢Lû_Ý5Ý“MNÐFgi’îºÔÛ†ÝËÐJ¾ŒnwˆWÿž5 ±ébì”ÍR§ç¦Ñ¦i°K˜BÅÔ¶ú~xJ~ÝçêòƒFð…8ÜëZ‘²yÉlļÍp©á¬fw‹Ñà=‚n’X–V3à#Û]Ò ¡Ï:Cm0Ý“š¾Æ4HñàA0n´äS,¿éOaƒ÷&eÃÁÍÊ´ËÐáš ”@Ɇk64ä÷#¿ý•íÞl VA¢Ù0ÑgT#öä÷s%@öñpý††üžžÒ[ÙÊ$J1 ý.ýŠa÷øpý††üž¨ôVöT0äÆþý¢€›ÃõòûAÖ_Ù ÓUž’Ýú ²cò“×m ŠÂØmpcKÏ*J~Ÿÿ3ö]Á endstream endobj 3812 0 obj << /Length 1837 /Filter /FlateDecode >> stream xÚíZKsã6¾ûWð(o0ð±9mO*Éîfã¸j“” ’(‹54©ôxçßo7AJNdk”©Tæà«Ñýu£|„Ì£»ˆGß\|ysñúMšG9Ë™D7ëH',Éã(Í¡LEt³ŠÞÎ~ڔݦ¼œKÍgÿøÏ·T¹.ÖE[ÔË‚šÿ2õƒ©.¹ùîõ›ŒG(LbT¨RÉ2•‚9«Kè &¤Ùì5Rå8éâêæâ× R<˜ëhyñö­`컈3•gÑ£•¼´àLÆ Ô«è§‹/xèX&^§,W„¥³~ݾ[-Ûâ×[p¦¸zöx»%h?sÍáOX|œåucñÍmÌR®¢4ÖL+‹ûµH˜*’,Ïò¨-¢uo¬ípᄅ˜Îo€ ”>U¿ ÍX¿í1B] ËeþÀZ…í]D•k·¦°vvMU¸¦2eY구{Z°'õDoç‚Kά?®}8Ds’˜ n`_›ß£‰±R,2𠦓œ ýí)šÅYnL½ªŠ ’Ù«cQÄ,‘éùòd¬ÿÄ<9ìy'1‹UÆÀ¨Ðá©vkºZü~Â$”'ÓUÁâ‹£W†³–ú„#bR>y€'YÎR‘’«_}ÑÞ—µ;«Ë5•ßýÕü‡m_65µí (á¤æÏœÇæÎMé¨ìŠž¡³`|.R–Ç1Y¸ÙX‰\ϯêÔ§f]±r£uõj Wö›ÂUÊK1[¾»|Vôó»ÖÔ}YßÑXW´ïËeÁ.çJi0VÞë«_ý÷€ÙzU.M_tÞ‚éI~gkÛ]Q÷Ô€E}(º>„¬g릥9Æ ùØ>S A€ëDkTÇàŠ÷Û Ì5x³¼/W6 aÍ@ hûaÛS·äNiRà8ä\O¤} Â{¿ ã„EKmxܔ˳܇Ôì=zeªrÁ¹ò+ #»‚ôcYU^¥]A_8£›¦nÚcë ¤ BÖ7`U®XaF}8°1Uʾ#Zt!‹|ùÏ+ô©Šõã…8Dib‹ÉVÊ{ghW€yo]F!Ð.‹j ¨nzÞšò§yL9@6†°í†¤ÅÄ÷Â(¡‘r· Ý>¥ØBekV¦7»ÝJ ±a:/ÐöTkÖ“¹æª°Å`£ì€MaV:ZÏØè˜{ýFðð<ŒR³œËéuœ+<‹bÅ2®=õûûDçèØÊ˜Ìs/Ù„Ó)¹eªªÁ î¼…£5 p‹àඇôe]öcN7œâ¿íï\Å {æK·2Ãu0õx Œö:ó’x__ýH>ѶlK³ðÎcayW¸%sÚ£ÝX·ÍýÔ«< l£S™Î)·¯‹þ¡­»Ã^ >-½F ªnê9ß]Bàáú97Ïx¸p1‡5äúèš‚û ˆáo’}³ÀMZ·Í»ò~-a»žõ#½Ê•8››è?ÍöxÖ¯…bRfƒõã&£˜•ýÙÈ¿Êafòlé2ÑZºœöäng&ÓOÆýU>Cÿî¯Ò„qÿxólîüöüy÷ŒÏ0à8’6ÿá{êö”ëKÇ&±t¬*ö9¹WA›˜)ÖNÂ,—ŶfXú7èÝWÐo<„›¶_–™A³*×n`ij¤}ˆl“ÛDzCÁ„(Cæ 1Q|ö횆 #8Ðvpp¾‡6NOˆšÔ¢'¾‚®,C×ê‘ÙCÑÕùš{óa¬»ìºb€jQ×)•–I27Œ«Z>ƒ¥e¤P |´¢õ y:~–èÌ}[A·û^y°Í”xíX˾ÕAú„•nX¸ÉUy_î,œrÍ*ï^!OJ݆NgQKÔp E¬¾‚ã@¨°PdìmY/Ë­oZvÃí>ìŽfçñ_’ëÏìü|ìüÈ»á¬Dýe,=æà·Vçãé2O!°úlÄk¢ÿ4âu:ØãyzÌ9ÓYüÑxúIO’?I—YÂâø|/ôý'æÊÉ`ŸAÒe–³DªOÆÒe†8þz™H¦ücÒKYúK^êí8ß{Gžá_ÑùîÝó—|L]m»¡ráÆ=W¤úXfc.%Þ£ÈiœDß=,ËsçÜ@¥a¢tˆßý¼0`è<8ï¢?@Î~”–u)å™(ò<¥‰ƒAùh94ŽSTøÈþ`¡Æ¯¿Ø¶Ö­zˆ• ¿?(Eq‚raèÙWé]—©ºÆÏ˜¤}»Ïì§©ösv èÙñlçŸý68ô6ïyjKïå{$fï=zð˦îMé¹ÅNfUte빡YtMõл!{Ñÿo[¶Á“ô`zí¹ðNÕäÏ„ø3!þ”„ø…lx‡èп(¸t¸zÉ?¿ü­V‡‰ endstream endobj 3832 0 obj << /Length 1762 /Filter /FlateDecode >> stream xÚÕZÛrÛ6}×WðQîD0î—ö©mì4×&Žû”d<´DYœÐ¤BRN¯ï‚ e’’mÉ0“fÆ °8ÀYì.¸ÂÁE€ƒg£?NG‡ÇÊIep:„DÒ°@x*œÎ‚ã÷‹¸XÄ*ðø÷·Ï]á$šGy”N#W}¦«09øtúâðXã@ƒ@ɬ@®(Ò\Át•," Pz|è”;htt:ú2"Ð ä e"˜^Ž>|ÂÁ Þ½0âF_«ž— Q&¡œïGïF¸½0MZ8™‚ Ö¢Z×ÙçÙ4¾œáã«Èáúˆ†RÃÈ+Ø>žõ 2¤0Hð ªmD"Jx@‘Ñ&È£`ÞÂÖ•¶½usʑв™À &¶·¯üz_ºò›}Ýe†¶,‰ 5¶˜_®pR ÄU„ò6¡T!­jFã´t„Ý*'ø0!˜b¼A>ßYõÓÐÏ*BýfSVs4:#çˆLÒ8`¿Ü&B ¦ƒVÇE˜Î’>”ñ“]Õ0$©NKºò=µÄìZÂ$CŒK˜ &%ÂmòñóWGÝ-¦ðvgÂÀ`¶zÎf S$¥Ž­®|O¶¼ÁîÃ0X¶ÝÏYX¤äþÃ-áȺ3ÝgÅZóßvdFîÏø˜óÞóVO+•FJh·Ô·¹µ`•C}ztâ àc³Yœ^¸Z6wÏ—Oÿœœ½s•2sÏÓ$B•ÜÞb@Wd0ëÛð—mxŒ#Eã¶íÉì¬D#jLÓ³h µðªõ3I²iXF3W=¿®$“†KÒâÒ¾¯ÍtœÆe×%ß{÷z'œ!Û2!˜Šö™í­ÌSrç릧ÛõÍgË(u¥y–»Â×<.Ê{SÊ× ®ÁN÷y‚Àƒ²ýQoU ˆ(_Ù@hCŒj‰²»ª)éîêIT®ò´Ø’µ¿25+pïÿzg¿tÕx~@Ÿ>Åj:Šb¾JP=};ö³h9˜“ #+l þ¢t–GÓ«¾ó0Xð'춃9Šž|?Gáv÷àO0…§¾Á_C~/Ôüg‹ÿ…“î–Гï©(Þ`÷ˆ(DxDóG(vf…À“ •÷ä{²â vVˆ@´q·±H¸M ó°óT1·ô‰Ü\?v,¸íãWamîrPg !î兩P0É€^Šs‰ÎKõäû©¹?ØÝ½aÊÉK9 è¹*ñÓ¹*1¡Rùªž|Omñ»‡QäÌ ,Œ«âÔ†²Ã¹ªž|OV¼Áîà Õpüþ®jgæˆ »‡û˜Ô“ïÉœ7Ø}˜#ö’Ðý˜T~.‹-†Ô¸'êšÃM³¼WœÁaýZ}0ƒ)‰0!ÛÃŒü¼ÏøÊ>d0a$æA×HŠáÜFO¾ŸšûƒÝ=È`UbË;å–ú^taäÏ]0fƒÝá¬aO¾§šxƒÝÃ2ƒµø!Ñ£6è6ñҕïÉŠ7Ø}XaöŠPû¨é"ÌïKOÝzŽ¡ÕÖ3½;gpEW¤ŽxOÆ|¡îC±Azó-9þõœ¿=ÓcI”úÄ`y‘2ä{ä°(ÄMº-ó.«åÁ„1Q­¥Ê'ä¶.ÇË]DíV7,.j1d\ç\ÃùµëP.š.óU:-ã,}U¡Æà}je ¯hFTNÉæÑì—2Q[RXò2K‹øŸáÕ¬²–yvyÿŠ6²€7îfsETðýW´Ì œ­àIâðÃ3ìÒ¾&×®ÚÎ*CÕjaÝ¿e3l½±¶<ÍÒ2>›zË4USÀNسÈÙøuXÏsÝ¡$ðþÍ?¯^õ£gÛn5ÆA§ã,mP/³å*± ¸åìÚ¯@JwÏnex&pCEœõÌÏöSMÁ©s“¨†;Â=„JÄah'õÜ3NA f|ÿÓyÃiK'kCÖØÎ-›¢ ÜäYמmY6h6´é–¥m›ù¤þU…Õù­I[›®[lYeŒX+Ým%¶*€À7 `8€Ò] @µªò÷.–"‰é]÷2÷†#Bôÿ5u¿¾í¡¢ÌòƒÐÿr9K endstream endobj 3755 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1563 /Filter /FlateDecode >> stream xÚÕYÝjœG ½ß§˜Ëö"³#ÍhFSL ?¸-¤%Ä)´5¹H“¥5 Þb;¾}´»±/‰L—€ÙÕê;#i4ý|®£ÍTRRRû¦4ý7'ªÎ¨‰Ô9-1§RâaœN©Îiz’V©kY€Ð¤4 SÓÄJ-Q)¾L@¹²ÞA¹º>môuå ûL´Ñm´Q9f‘@Ã0»ó`a+ŽƒŽ&΃Ž6Òœ¢ÎƒŽ^}*i°ë5ª›Å f½ÌÄÛ»§i›UN\]ŠÖÄ­ûS8©2 +†ïd[ k•MÞÄZí: Š'9k§˜?ÍðRœ¡¥9Þ,nËÔT©:•UͱÌÓ((âáM\×FíÆƒ÷©Ö*q‰#7sËLB¾K<¶XSIði”& N­5I“R¨9 G&£ŠdøŽ*Öªï¨b­úŽp2}G.™vúÚ(áðMt…;;ç5P­C êdq¯­§Î%Š­vVçiê•7AYÜ+‚º72Ìí­;:¤8:Dœ2eqp°X>LǸ¬Œëý$-ýíwì0w‹Ü>sN_¿zõlq÷îÁL#›‚àš+¶÷l[‹dAÉ4[®ôžÍ‡ëÓ‹tp–‡vççfÑ!ŽàÛÒ¸uKã¢Éc‘®Hh[”]²j$Ýþ€–åã³õ‹£ÕE:NËÇÓòéêÍEzkÀÓÿYáÁó?W‹å³:½8·lãö/–OVçë×g/Vç› ä¼ŸV/Ožß_¿IÇÆÀ¹ºfYç3è{~!vž}ƒ¿wzº†ÐãMJ6³<%o‰¡ïÙãKË£×\øïG'§/–÷×g/Wg®µ<[þ°üqùà˜ü‡ú[d‚1ðugÎÕ¨Knᵂ?€»çÞ>JËï×O× ‡õÍù_'ø»srzrñ­9ì³ÒpøVv† Çd$ÌÛ7„…³è¥G¸×ÜôFñÀîtØwˆpW8éÐ\y®_ƒ«èí5ˆ“‰„W¸Ù#ž¸ç5fÍHe1°4É"3 .¹ ’Áœ§½!•‘"£’™réAo eÉ$=––»Î(xdÔ« ¸á›‚’iH¶>1.MN\3à¡PçÌÄ_GZW½žÖµzZŸÛl®´#xGÔѾD¢M½Ø¥5˜‚S¡Ûϯ2†_ä!¢šUå áŠ$Œî·£Í@“ÈÄ>WÀÀv{vT 땹¡À !†]Ãúß*H¸û+ßÏ¿Ÿ­àzÚˆRZkø·Vá¸ÐÀÇ­ðk¯ãjÑë¨àãEï*z›$º¥Ÿ 燳Œ‚G&ŠJÆ7IT2J:Ö¸ ¯Î(Ǥ(ÞÖ(Øî½¶6½ÑZÍR‚ÞÀd‡”ô£iÙßí•Ì9ê ®HÜsÉAÏqɵ޴â…*Û‡ cÅòñIõOéúXc£ú§Ö?¤9/rö2bK|™±IM1š½kl îýö«f+4=—e·!Ëÿe—&eáKCãs«tÓ±ÆÞ,ÅÇšwÐkö‚Qæ¾Ie?D‚yd-Ì@{__ì£Ï£zì{?³LVñ‚’+À=èŒZ4w‰‚qê˜Æ¢’‹OÓ_CÓ¯uOÒ«7Kz*×’ž½ÎÜä:î;b—ýøËd¿6ó(W²†VdÄÛo±YP-q\»›;! óíÒ&†jFÌ{í6Pì ˜ù'ñ­õØ(?‚%´Äö.ÝL„~›èf=¶½'÷Øï ?šëM2p½I®7ÉÀûÀØè$‰E(SÐöÆŠ÷ ûÁšíŸ1pÅÈÑ¢’¡Ag`.Ëe±¢û_²í\0›GÁ¸Ü…ƒ‡Ýн—Ý››ƒ‡]‘俤(6S‹‚9ÏÜ`EÌÍ•ÜÌÏW6ø‰3Ï– endstream endobj 3862 0 obj << /Length 1513 /Filter /FlateDecode >> stream xÚíZ]s›F}ׯØG©­÷›Ýö©Išdê4Ž:}H3ŒqÄ#P2þ÷½Ë‡ XŠA+œ¸“™da9{/çîÝs„ú€z>ùe19yæd°QL¡Å%’ +ÑgàèQ´¸@ï¦oWQ¶Šfs&Éôç?_”ÎÂË0 “ ,ÿüÃO¶~<{¿xyòL¤Pq (<†µð`º‹*7xzzR˜0ö¦ÉÓÅäã„Â(‚èmp+—(¸š¼{OÐ\{‰F£ÏÅÈ+$)ÁŒ+ø£·“7ÒLLÓF5¦¤Øˆ2–¬ÈkùïE†—Y˜/ƒÄ¿ ËÀþ!’ÀZDG°‘ÙžwbåØ#y\aá «=/©ÂŒ İÑ¥!ºl×FÛ}öîLb@­'(©íŠ_=˜6~ý`ûÌÐÄRØ0s„` Àô*?œUŒs£¢É(ÓX^R%yIØ^ônN #d/ûÍÛa°§a¬-†êÂ]¼z}´näB`NšS,•)ƒûa„Ä\£ÆÀ•Ÿ\ÄÝH¦Oú–"XJo¼Jiã;VŠs°=*…+޹P0™½H4»ÚÒÏzÉ((‚²Rf…p,¡sÆJß‘ç`‡°BÖZ¶X±+q™_oÂ~Ôì>€[âf4v:ønì¸;€e$Lê•ìë$ËûQ¬ü´Í†4˜‚Ö°ÑëÙ«q›4J‚hSê‹&½vƒþ©/ÅÚ`%]6èÎq¯xRÁR몠üTHùª’JA…Iu²ÒÒn1„…ñEùG”tîyõÛ¯ó³§opëœ<£¤IAsÆ1¥¢»‹€j†Él˜²Vd?v0[iÌŒ©Gf XŸý¬:Æñ:ðó°Jâüº@¦5½´Q!özµGI”·ÅÖ-¿_Îw. [83§pΨ2ÈÛ.ÝÍ$ ã½³ÖõÈêÑ—9}š19õÓÈ?¯“Ï×å1«yîEïý‰iFÛ‰µz\'7 ¥*`´€+BZ_–Çj©E~ü¤Î«ÑíÌÕõmº?¾®Æüþþ-OË¿N_¾žq9ýûôž\¡-0Q“(w,ø¹3<×(Ùl+Zü4õ«ˆ?Gùª•9ÌyC]7rã5À‹À‰n“tæÛ4Év—•zxùÕˆÍçûúUUG—¶+æ²m„Yv¹q5}ÓþØ’R¡9‡Þ´×ÿ„UA ÷?¿Ðr<ÿ#­PdãùŸ¾Ûílÿ#­¨­{¾“ÿ w(¨G褯j<ÿÓÁw¬ç`h9i•¶”_Åÿ+ZÉxþ§ƒïÆŠ{°X °u½ÀælÙ^Äz7áæ°µºØ"¡)Vb<[ÔÁw$Í9Ø!¤i ÷tݧîdcˆ‹žÆJ=„‹ oìw{\Ley[:fÛÍfÞÈÿuZ)¬ŕܜ“ ½ÞäѺö8ðD²=¶úÍ6Ìr<›sYÜ;[­·µª>¯®f jDwë4ʯëÐ.Ât&åô»ŸúöýTxkRL”ìtÃN2Ì`ÁäñMÅÎb¿'nîauXHö~hí%Û«ó0m/à0¯ÀºvãQRl;§]uvsò†§ø Î) ýøê çÄÁ+€Ï9q+1ùxΩƒï¶‰»Ûß9q+‡Ù1œSÉþ£wN d¯ôÆsN|·Jqv€ÜcV£«¯ãœ˜Õµt<ÞÁwdÅ9Ø!¬XNÔqßM ^s»ÿ MϬ¦ç¡é™ÕôÊÛ§éëMìûëwù,¿ù¼ŸÓÞAÜ”ú]ù¬ÙñÕóíë“Z¢|Y\r 5gþâ2³r\ð§B¶×™”ÃTj<™IìÇ„Ž¶Muðݶ)÷`ûËLÊ$ö´9–Ì„:°%Л‚=6±I)@ 6^½´ñëÅ9ز¶L¬ùZÓAhRb·ÀÇc¤ïȈs°CWªëŸÃÞU B꽄`O¹O<ö%Ìþ¢…ÉÑøjûÑåê¶ÀèiÇ'˶Þ(púþ^ãåÇüþ¾>Þ}· DòãéÿÅ®0 endstream endobj 3894 0 obj << /Length 1953 /Filter /FlateDecode >> stream xÚíZ[oœF~÷¯@yÂUv2÷Ú§^’´M붉£>$‘…Yl£bØÛÄùõ=sa ˜uv—(j%[Ãp8‡ï\¾3,.<=úîôèÑŠ$•ÁéE $’ T£"Áé2x¾¸Êê«ìxA¿ýý'wð<½H«´HRwúk\¬ãüøÍéÏžhh(™ÈEš+xœ•E$”¹òÈÜtôøôèï#«p@n•€[™’ë£Wop°„k?ñHoíÊë@Œ(“pœ/Žþ8Â]Ã4éèÑÊEÜéR[»ÎþZ&Uú÷Y6ð_/ÿ1£Qï5þ‰Õ£Hùfx:И!…y ˜D 3£±™D"Jx@Q¤£ Jƒ‹ŽŠ}iã³w@bœ·p‚‰Y=U¾=}ùíëÝå ]YE4úÊZÕeàž{\?‹+ïâJ5’Œ:`³¢q€m•¼˜)Æã>`àïÞ«•Yl¼Á_¸+° “Þ`>b„ ‚„Œœv_moK…Wq±ÌÓ&áÃ]}‘À£µ˜ÏUúò'ºÊdewp&ø£„‡)Hn¬›ÜÎ⺠ö N~r0$˜!yv6Húò'B2YÙ} Á8H’²¨›ÝÀH®âA¨Š¨hœ ý,¹q¦|³3ÄP ˜šRãÖR&¥€ÈÖZVÄ×éAULBTšÏWÅ$ÇHÓùRÓ@þ´8˜®ìîULB¹ „}Œ*fÑ1ý¥1I#¤å|s ¢§LVvŒ)CDð‹˜ó”ƒQ! Vó¡Ò—?•ÉÊîƒ ¥ˆÀÝ]TL$ž57«t7hÆ—ïƒVÐâèùÐéËŸˆÎde÷A‡«êgf#©9|õf–!1ã>6ÉÛZ ±I3iãºýæÊ·ý†1Ú~Y8çuG¯1¦i¾t'Y1¸ïÙß/ž?þõ^ã'waÃÁ‚2$©VàC]UG‹v‡áëÌžUÑ(jWÖ} /Üǵó¼Lâ&õFœßXɤE˜t¼Ä¾ îY‘5}Âu‹òýö.8¤t˜Yð.©œ’·™zh5CÙÎVëv¥õΦŽ©ã*‹Ï[㛲E¶Ùâ§­öŒëåº}\–€ªgU*/ܸª²"ÉVYœ?lMò+†Ú__×kÀþƯùñ'ø;;9={yòìä·c&Â?O>`+¤Ê[ õ ìviàô;³bµöÅU{mßfÍUÏê8¿…m¨u¤:ÂL!EÞ÷¨`Sõ|*¾K™)¨Ô£­q*а³v$¤wFŒE@–¡Í…Ø@þ4Ħ+»b,‚Ò¬}?Tgï ²ŸBRØæÈò´˜²™Ê"Š0ùmSIì}÷©¥¾2 ˜cÝ!»pÁÔ‘ ŸZ0)Âi±l²ëôåvmx`ôdû¡“a ˜}ŸVå¢I«ë¬ðí\¬ l—V¤ Om£KëcÚ ^®—d5K/G$nÄi#0tÆ‘ðöwûFMßcÇæÊ>‘ðb]$MVÆ,&C¨rnEÖøÑ¯síLTi½‚v;;Ïò¬ñâ,;·bý"cm2ÌdéÆeà ðú´1až”íTs7aåºqôŽÁ /[I0ë‚áBó–›Viœ_{Ÿø 7Ÿ27$vY¦µ“]”6d€*`Æü›”-…Iòõ24¿-ò˜0þðy[áî'þ<;¯âêæn_ eÓ¡ðŸk†/Ûf8ɳ´h†ðEU^Ðý¶EmØr“ôö†pUa6ñð´Š3¬Â"56½5yÂLw"Ûœ¿sëºÉÈ\i“„¹–”Eî\n²¢9ÞdE³Ðõžfú2-Ò*Ρ¢xy&=BØrm~)â•9O·»¹~òò—_†4Þ<Æø“³O†e‘߸øSˆcÚ¾U¹ZçÆcG"ŸI²Kà3„Ùæ%?þÒpŠWw¡ÞÈï¡Í-(1úL×î~ŒØ­@)N7{%T[=°ô{w.£ú’Ôì½3Ém“Ķdµ#s›6ÒûÓÆæn«Éan)Ú­™û¦Úm,ãzÆzŽsÀým®b6Ñï¾O¢÷ÏL³ì“Èmû$ÉA%$Âà(Ñ|%ÜÏ÷õ¯/~qŸ¬êî»$DS #ºuìë!mí|5Ý'Iîn”|q¿t"RU ó¹I_þD?™¬ì QÞtôQ7Jöiàˆö÷ Ÿ ƒ#ÀÐöéøñ»ÆôA.A~ïëSÖÒµ¤¬\CÒ)^倣oZ¿Ûïÿ3ô/¡û]ÿáç©1Š>¨ë# }æÏw<ÓRºU•6±i¯û_±îsÍþWÖÑ«c?°æˆ˜òûêQg¯ endstream endobj 3922 0 obj << /Length 1936 /Filter /FlateDecode >> stream xÚåZmoÛ6þž_¡öP³$ERÒö©ëË–½µë‚ CWŠLÇÄÉ“èdþ÷;Ф,ÉN#GsŠa@Ò$u¼ãs¼{N6®|söõÅÙó7Q$(T‹€ $’0ˆh#\̃“_–ªZªéŒr|ÄÁæ¾ 0bIÜÕ+oN0¢¡€þ*øåìç3Ü6,&-=¼LNP¬.Um×åŸó¬”]êâòŒéJZÅþÀÃ?©µÃ(áF²i¾é颳 b<6ºšqN¢„%q”2X´”ëJ;<º¿å`yâ7°‚‰Y=V¾;˜®|°CvhË(¡É¿ l-°¼lç½C«emDiŒ¢8²ª\[Àî•|˜L1ÞG¡ûöð4Á°Ò¸‚›Ø—æoGçÁ1Ìâ"±ª}qŸŽÂ8h-\¦ù|O“ɳ¡ŽHâìtnÒ?ÒKƪ:ÀIB¢ Ø+B1Ûí2­rò°·ðë$†‡ˆC0:&]ù#A­ì1¨`bï÷ƒî®AÃ\T½]?úŠÈ+‚Ò“áÑ“?ñʇH8J\ÖÏŠ¼H¶LË.ºØªüÚ™aö®{ÅbßA½‘Þ=ïàVh™?s²¤viØ>i$>pp·cÁö‹§8ˆ;¥—mƒë½;FßíB€.ú%Qk׃½—zSæÕaÿ#<>Þÿ¼D{æßžÃßåÛï›H:«M–ɪZlVÈmß. Œ2.‚YñN,¡nO§+5‡;|¹~TÅ¡r ',£8pÎžŽ‹õäËýã•^Fq ÈÇ#˨Ûú½J*¢ÿµJŠÅéhbOþHW­ì4‘m‡ÈúoÖRÇ;Ž1 £ð)È‹ ‚(fM}%µ,oT.»,Ëä÷·k­Š¼4ì=hRE˜ºÌ©*Ÿue é‚«‡]ø¿XÖ (^$ôí™lªš™Ù|µµ½+×êš*Â"­²?§XŸž]—i®mÒ†•,oUYB8qÔ†’O^üpþjÊðäÅ”˜|meu”Èçʰ³Êï—êÞ΀ëFVº­3µyÚÞ±ÀòÔN¬‹JÏkÖçƒZνvÆ€ÚŒ±É¹ŸpO‚æÆj¾í²È‹²>)˜®a‚A«¥é¨)™x©vh]ÊJæ–xÂÇZux´Ñì™92á—ùí–5o5ë5HtýóŸZçY4èƒD@ÝÉ‚Ðä 1ЛռmXú–wª’‡NeS9FÂàµmµõ€P« rhÚ9Õ²>giž®_oȺn;÷S 8GÛWº²J§¥n¶ÎlÒ>Tø¢l§µ‘A¢v/³“/ó¬Ü®›ÇTîÍszÚ= qÞÚ` ‡ÇWNÆëkš]ÚÏVCÔ–*[v %9]]’Ï»óë´ªšbË]ûfÃu –¥;’(Wón™³†ì’çæÙt]¸²pÏšx²”é”ç|2¬zcÿËê>Eõ¶_xÖ-¤ ÀÌFÍê€ ,ÊâæÓ5Á¡jïš :ËNMù ¨'²îEp'vt ÑÜéã« Éumt²²!4äìdL°#}«èð‚!$€åˆï]ä¶_".þk5\)9èdžÑ“?Î7Æ+{Db ·û…Ëæ‡^ß‹h‰6tû.tTAˆœ>EA£â“°j¿,ePM€’‚&hã§é7Á°¬ÀYnZŒ Òå&ƒ.?ïëÜöïVêªLËí>;ÈZÖ~&J`ݤg4¬`Qx¼Ñëbç’ÍÛ\ˆ§s©î¿ª_ž8°WÛö¹¹.¹íaÿ)Ú@#EôIiÉ^%Zë/³býx>@@ééø °&> stream xÚíZmoÛ6þî_¡o“‡šá»ÈíS·¾,m×mm6`H‹@µåX¨"¹’œ ûõ;Š”õ'±­8A‡ DSäñ9>ÇãÝÙØ;÷°÷rôÓÉèèE =´¤Ò;™{B"©™hxÄ;™y§þûE\,âñ„ ì?ýýØ6ÞEó(Òid?þ¦«0ó|L±Ÿ]œ} ‹Hò½üèˆç‡$1ŽNÌõäóCÃÁnï‡$QpèÝi£ºÛ L»~hž7ä÷Ü‘â[z£ž'â1²§'Z„é,é;Fÿɶ–ˆáЇ³“Žøf2êVÂ$CŒKXË\WÁÚL=ÛÂTÌ]T~]îM†Ð IFÆFOþ0:†ƒÝQ®&Êò1ÍÒbK6¦‹0ï²!4"pÑìuÔ.Ãdµ?¹ŠÂ=LGnWþ@rƒÝ…\%*Á­æz´¶‰·‰¤ñÜ_¸&¤b® ¡»Ëç~Î#ÕÆ†‰šõ!¦Â¿²}¯M»oLG'z3ë é |&܇ËÂÊ)¢ÒŽ(nN¬d†T®Ì®mg]CüKƒÀ 4žpÉý×Ïÿ¶“á–aœ-𤟸Éu,ZCj:ó6KëqñÜðdBL9¡vsJ°ÔÍWé´ XëÞb5FE1_%;E®Í}Ú ^G ‹Ýƒ×vRžÄŸò0w±¨[©jOÓ¦ýÉÚ*©íš´œZ¥˜="q—ݸ³1îÛ5žp†LÏâqMëítWOkÈ1—[k­ê‘Öx Ül~=—â.ˆŒ‚oèA\ûß>FH+èÌÄérU®“‰8=·í«¸\8&êÚQ:ÍfÆT7æësðÄ)í’•·¾ys—¦rÐZSùøéÓUœ$M"e[­ƒÛXël‹² 2Þâ:×jSü.Hà56?ˆvW¾–8¡`tï9†¿³ã· þÓ7ÇÏÎ*—e^Æsû¬<"•²¡:úáCWeèH¢ô¼2hϲ¨H¿å—¶¶bº°è Ìy1¶#µõ¶-´¿½¶ívÂ~)H—t×:g·9§åàÝ‚­rÚ4¼Ø¯²Æ¼Tôp- 0”,|êÉ> »}Fˈ¢Èà„¶b¾—Îjù­¥³ ÂD Ûs0+éÊh%ƒÁîd3 ª œÑ2® Ò‡ã£+ ƒÁî‡ ˆiöÈí†S¿=·¸~¸ï:zòr;ì.ÜrŒ8ãÌí2,Š«,ŸíÍ/•ˆ¨àpüvåäw0Ø]ø5 GPG^ñ?Ѷ®´¦ÂŽY!Qz¸Ê~Oþ@VƒÝ…ùè§.Ÿj²­} ÆAp8‚»ò<ì.ã ²N˜­Ê¥B† ¢Š×å¥õäYÔª(}‰“n·§-ýÿæ7^À”Ýpûž Þh}5âU÷Ø«ÖÚŽ{p9å»Ãm•[Ã<›b¾(X¶O¸·€Ë‡Ò͸]ˆÕƒ. 4ßý¬ë{­Í½wuLÑÜzOV8ÑSÆeCÊÞ-àMÕ;[†_VѺê]6_®4§¢XFÓøÆtºù—5·Ð¦áú¢Ý“Ñ\¼×˾’ÐÿLÍ—&äájÞ­]E6HçF­ùíß‘mú‘'‡ó}~ãù/¥l¡ž endstream endobj 3857 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1539 /Filter /FlateDecode >> stream xÚÕY[oT7~ß_áÇö!>öØã±«‰‹ÒV¢UD¨Ô6â!…m»Uüû~3» Á¤ÀVH°™ýòÏÅö\NJg)”^R¨ŒŸ-‡Ü;¡‚À=Ô6T¡¥¦œ¤fj.*pèFn-t‘ ƒ éa4ãŒSVH$VL -'ÃR5¬@†Õ©ƺa-äBªA’ÖC®ÙxÐQ›b:8)Ö¡ƒÙ0èàat´jt4ó¡C‡˜:DšzU:©«O ÖHLÙü@œˆª†¦@`+/âÍ9Pcéà@2 kºy3AÇÀ*ƒ Ã*C= Š’z4KÍ0|ädXĆUHÃ0(¢jÌ n>°‡ HØÑ"†Áܪ32tTÝ™‘¡ƒ³aø`6 :Z2 :Z5 :Ú0 :d㾊ú1ÔéA¬¿•P“™‘qvH y„ZÌ>*¡Vl¤Š3‡{¬²=A §-†U†U$UÕUD#>ô¼ÊP^É¡öbAê†A‡’!AÇÃ8pʆ5HÍ0 œ“a«,Åy(VS€yÊÃigêf30U1¬bgmÀ-¶›1j ,æ%ãn»P;®yYõI‚¤–5œƒ3$3H%à $6¬B†qh¥Ö uÃ$´Z ƒŽ*†ASZ.¦{á;ã~?Ó¯¿ý+cÃA.%Å„@¯^>{öhqë–‘Ö«Ëpx¦#½DcóЮ<ÞÊ8Ðe+#ò¼ãdœBÍ[–Þ‡Kú­€&ö :§ã‹õã“åe8 Óñ½£0=\¾º Wæ<|ýÏ¿8ûk¹˜î´åêò…&ÒçÓƒå‹õË‹ÇKÃÒûiùäüìÎúU8U€GB¶è5Ç>AßÙÑ<Ö6üÛ«Õ‹žn’šUvnX²Sáš=öÈb:yùÇ¥}¿¾zº˜î¬/ž,/Lkz4ý0ý8Ý=ÍöE } )ÃD¾Õ YbˆGù!"…€wÛb¦ï××[÷Í‹¿Ïñïà|u~ù­ì³RK‰¥¼1ÿ#Þ¿!¤†\™AjFºQ<ì··ùAÎp…P‡zL¸Ìïœò÷ØÛ+z5ƒùÈ¥E-SNòˆ‚cë#S=yWÎ;‚æ#'ØŒ¬á"3„æU™8jAu’{oèXÌNYd§ƒÉA‹±‹Œ 5Ç;É+W/Y¢xCWÔAr®Lê`sF#—µYp’KÔìè$·((€>2’tïÊggäPy¢¶šû¬wÿ¹ÂAÓ{nÐ'W¸.ÛÂÖw®ïjÞH;!‰šÇ¼¹ò»>/6‘=–*(hÀ9}-I‰Y¨BH/{4„SµÛ0I«P4§YC~þåþýïîÞ>>ù|f IŒ‚L‰9%¢ëF‡Ž¦5”â¶/+v»’3’šÑÝ®d¸Ø7îFy»hpH>мÍþh0GÖ¼–ÜäyxÉ(­“ŒúÑf«é ¹±ÄšÈK&솛Ì1‰—Œ/g¯Í¸!˜Êœd‚̓}dmx1|:ÉØA4ªÞ•a¹WÎ17ïÊ”´;v’l®Îh l8uâ%§Xs÷’‹ÝE¹S,×Û…¯b0Õw]×Ëö OLõUŠÕf}“²¾Ø`J×SôcÿÃ`𹤽L3ÅÑ÷ß,' WWU‰ZF#{ãÁT Š0}‡ý±²4KÖÁ”›—ŒÁ´zÉ:·uq’un£î$ëXÓœÑÐÁTjq’1O4é^rÜœê`Ú’såBøéÝAíQõ¬“ŒæÝÁ’ šLçÊY8–¹·óäd/µœäÝÜF‘øë˜ÛF•÷ @åO.•¶y¿–P?kØæ;=ÒÂWùN¯Cã=¾˜¬> HÔ¿°æÿÂúG´‹²ãéòõÁŸë竳çË/P&µ'¹ª( ˜œn\ j»Á€òû£•`Ž\8ŽÙD9Kä¦Ss÷’‘ûôRN2 Ò\ÿ>KÎj³wå„‚$â#ó€Ísíí¹t‰…Ý䌬ú†û/èA¿{ endstream endobj 3975 0 obj << /Length 1588 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯Ð£=Ô ¿)nOÛÐtm1lkó2¤…¡Êr,T‘\Y^ýú]Š’-ÉN-™qÒaZH¢¨Ësyî%/ƒ½{¯F?]..•ö4Ò’Jïjá ‰¤fžÒpUÄ»š{×ã÷Ëx½Œ'S*ðøÇß_Û›wÑ"Ê£4Œìã¯Aº ’ÉÇ«7—>ö|0(™1ÈE>W0\i‹H(|a/”kóÑèåÕèˈ@/ì‘ø” /¼]ÄÞÞ½ñ0âÚ÷îÊž·ž Q&á>ñÞþá¦c>ià¨m ‚4·XÖ¥_³ÏÑ„ˆñýl‘O(g·³>Zæép…:„ Ÿ# Qß(ê̾w<‡L"@ªd3‹²M±gñÚlœä‡¾Ü)6©KÕ¹>XäJ¸úUÅðsÔ²0OãÀ^ÒhBÅøÎ<ˆñ[so Eû6NY~q–Ú†u‘oÂb“G/àYá1ìÞÕ‹¨°6Še5Àç Á-cåÆbÇ®¿Úëó—A$›ÈÛ¬ãô¦œSRóBITl)¶ͬÈf ›íºvGšL…öÇo_þi‡õ¸ât]Ï t‡®SU´¨¶Ðjž’{{’$ a.çöq;-ö1Kë~ñÂ^ @iï›4´óY¾¯Z×›0ŒÖëÅ&A-°—7£PQØH0ëVOph’Ï8ò±¨Ï#ßwl¶âÄGTëºgó”ÄŸò ¯©F*ïÃ*ŒÌý§û‡é)³ôÄi\<ÌÆ×<žr†LË”dZ±Q×(¯¡Ç\ööÚ¯{ÚÈ,™«øj¦Ç 2 KO Q¶¶ÚBè)ÎËö´ØæAÇFY{Îv»ÍXÑ'Ä X»)–íyˆÓp«;ÜîV×.N$3ã\ePÿFy•ˆÙÁŒ-–Aaïîâ$©B>Kªôî$¿ÿù~¤Ø”n¬™mˆP#ì ß5!mßßE Ö¡ƒÎ¡†;_[,¡½ÿå5ü›ýöv»8[‹ƒ+PGX0h9”¯SFàJ¾.-ÀÜšeûi+‚šEàc+ \bD9[ÕÔ±ïV6¹ƒí¯,p(Ÿ8ÑÎÊBÅý¿^YàÜ”ˆô|Ò¶ï(Î`Ø\PÄå œÁªFØùèhÛw¤Ãì:8Ä<&Ï,,¬‚õú.ËOV8T,Tœï4Û±ïȯ3Ø!ü2Œ§ÃÕ…š‰›ýWŸO‡ïØwdÅìV j>{æ¬[Iq2·¬±óIçûŽÜ:ƒÂ-ö‘¤|xÆ:²i¨vÔùÄóŽ}7FÜÁ`„i…¤|dñ\õL6Uïpyp™sä©ôú¶Â>½mûŽô:ƒB¯/a†Ô·-Ù2#ΞB±eàªÀº-ÙRAdKÛI¶¦­%Ùš†–dkš’­ù¼_ËQa[JÉÖ´t´ ºÆhýÛïÓlÍãÉÖ˜¨ÎŒö¨Ø_²eDZÉÖØØI¶Û™¡ ¦©àVëÆsK¶ô?*ÙÊo_²û‡˜L Ðm·0ãtµ©„ŠσZ@´ÁkE2Q•ê> ~·àˆRz÷ayW¤4y÷ÑÝQaÍÚ‘RWµ"… w£d3fˆÁº=óН0°û*ñ”³ÞÃîC9³ôº¦ã„ ˆ;4çwñÖ±UðeS¥o”†ùýj·¼î{½ŠÂøÆ4ÜÖ%‰†”þÿ³BQG~Vð‡¯k§þ¬°5~èO!9TS@ä  ù"Kc• endstream endobj 3997 0 obj << /Length 1585 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×Wð­R'‚q'Ð>µ™8͵mì>tÜŒ‡‘(‹ŠTI*©ûõ] ER’M‰–’Îd&^,pvÏ.cïÆÃÞóÁÏ—ƒ³s_{iI¥w9ó„DR3Ï×põ‰w9õ®†ó(ŸG£1xøÓo/ìÍ»pfa2 íã› Yñèýå˳s…=%3¹O‘â>|®´E¤€¾žÙ åÚt<»ü= Ð {d º2áMƒ«÷Ø›Âo/=Œ¸VÞç²åÂ#Ê$ÜÇÞÅà÷®L‘ŽÊ¦ Hs‹%/Çuý11¼½že#Їéâú“¹ñ*´ÿÂÃRâÄH ó syÞB͹ç3|¦ jó^‰(áEZi/ ½Y fÓÚö·› ùª²oíÓ¸¯y7C óÕwù@Ý”DšêþPK{ÙgoÞ9bÀ’X^'–*„¥²ÌFIaÙÚiÇ»L1^;qC~I|½34ÕZ?p?lZ«‚¤Ñ‘qŽ¡Þ˜ !µ…öý.1åÕ΃d·‘ ŸtõB¢äx^Ò´ßÓMzƒíà'L2ĸ„ùˆ`}ç(Œ^wp PÜ.烖Iz<>šö{òÑì>|`‰ˆ°tLÒ$ïHÆddM2„FrÙAÁ¶-ê;s+5äÌŽÆmË~?nûƒÝƒ[©"ºQF¥}˜·ÄR_Ö™Û0we„šüØ•;¨!=÷ÈÖ­ëΚJJ^ç&ãi “a`.t˜„#*†Ÿí»WæÞ&öE”ÌÒlQšØy‘­&Å* ŸÀ3áCHÖN¶E1wø8"¸fŒZ%³ß¶½6Úá'ƒÀ„¹äÃWÏþ´!H‹ JòxR]ç ŽÓ °‚Taµ¿¦IÕ.šž`ÞÆÜR8(ÀSlY9[%;dóT½ÍW“I˜ç³UŒÜŸ\wC0K!Ò)igT¨ ë1ŽU‰úCËfƒK…¨ÖUËzaG² »µîKåýÄ1mî?X_%•_“š¨•³!%QѬ:×Î}ÿˆÇœ!ófL4¡nÜUÞjj3ÌeçQ«ª¥u7ÙkÝw¤x"£  DÚÒß6F8=€™(Y® .ȲÀÑò9*曈ËwÞþÄ -³×·¼~ýÐx|unsÊ*µF-¸ÏöÍ2…:%tˆŠÔÁ:¦Ê×ó ¨FÇÎ Óxjïjá¹öÉ鎹¨KM¢ökaq„|Ÿ6þ.H  [‚ Rð÷|e±„vñË øwýë+‡tf†5Ûª ­õŸ‰ .$ÐÉÔxÛ 0“›ÒCö_õ ¥¾’Ç[õq ø©´"£e¿_‘Ñl÷…×ùU™Gÿ†]ÊyÅ›K?Ç|kÙGpÝ·Gɺ«bZ!BÈa•kÏú‡kŒ8S§¨¸„WØõ*„*›Ûi™DËy˜]×ÔHqU@¥ÆRerÑ^5Àã óN 6Ê›Ÿ^^ÕþÙ¼!¯eÅXV3•Ö²üÝ»“ç¡Â›‹Ã6Û˜ï#,Ž¸ÙÆ@ÑŽ·‹Ò°ÞOrûí.¸ â˜)uâ;Wˆ]W¾š|—þÓo*;nÚm*2#ŒE6kg“ N ÈŒS$|õ€"»àü¦Ã'ÐaW­ßÍø}+¬tv 7ùabK¹]±Ml)S0ÕÇÛHkÙï'¸ýÁv—\ Š%és¸Ôç[4òw°A!ÕzÃîñ}¤i¿§ô»Çf+…ÀÚí$Ÿ¿xý¬•ÓRgÂüF¦Íf 4B q<¶šö{²Õì>lQŒg_ñÖ85§rR>v!²íT ‰_oÏYY”@%Äå,ÓM}u¼œE)ÔGóð–ý~Þl÷œE„@û_Ó2aíJíó}yŠ}ª1„}‘UÚ±S,*…ºH;ÞŸ‡Ekó Îæ1ÈŠ®Û i¹‡Tá-K¦hv›÷ ‘»-ûÿ3 —mYÄ‹oK–Çß:jÑâH‹’›{è-—4°p±Aø6­ŽnÜiEº4mo›~Žâ܈LÓä»QC×y‘N£Ùmó4gV“• ´qƶí/Ñ üÖ˜ò‡hÿòìà endstream endobj 4024 0 obj << /Length 1921 /Filter /FlateDecode >> stream xÚÝZms›Fþî_Á·¢N8swÜîôC^d×Ij;–&mÆÉx0 ‹ (®þ}÷¸C$Ù’°Òi<ö÷²Û cP«òÔ!¢š“)g`ÄD30bÜ•Þ$†!êhµ+ÒnôÛÚ"¶1Éál¥)¿£­t»…­PNµ8¼Ì"7ØO“¼xÚX„­øc/k*ƒ¹ƒóšµ·T¬·0¶¶v…³ùek cð/´‹»i]7†îb8_U8¨¼c1Îß¶kË)ÛÓaúC%÷²[sô¯=lêÒÛö8ÓQÏ .Õ‡•˜¼ÈÔGryõÓi²?JŠ´õæ–ÄÐê0=Oeï<))^"o‚(Ÿ¦¹šœŽZÒ¾ à^yw±BM&ayEÏeƒ7*ÂLŽö½8xA[°{hÃeLnQ1.ñC\Í¿ˆÒ54}|ŠÍºiÂtb19c¬® ì"˦U =i l¨ÍAÄu«‘°­3¿˜e*Rc¯wã4Ìú>– Q2J³‰' ?ŠvÙ¶po.¢ ¯1ïÖ*Ø éîµ iî!*Æò. K[“u3}Þ$D A pn‰éhÅÈ´ì\`?À™°âƒ‘f;hyêŸÝ¯7Åwsë¡nϘ «ó#t÷¤OÇ&Ye+‘àíB+ì[¢xϰ?ö’<О‘Ÿq\ÉáXbK~Gé v‡ÈÏlȘÚäÓó÷ý怴µÂÀSÕFŽÆ{k‹ q8žÖ’ßQ[Áî¢-ðÓlg𶉇 Üg£á»5WB¬ïAÔ¥°L"a_© ±°ä?"}¼>W |N³0“Bù²­dDbøVЦ©¼~6M«¶ Ìý,šiÖc’âŒþ?ÞdZHgÅtVœ,x“ ÄA9nCü¼êŸ_ô ðæúà·sø•÷ïúŸzc9F5‰à/ñóixÒ3¸eëØ‘½Âi{aN7ü"7ÆÏ7ò±‡!õ+ãy9èªâ jò8Í‹ãØ+ŠýDq”ç= „ÖÀz‚`I0ã^N¼½xRNâúÛËAÿt`¬c‚ƒË ty}&W^Ãk|,f9l¾q1›Ü…Ù‰Ü,¼ng®ð‡ üã8DÞýñݰç˜úücÿU2ý%h‰éŸÈ$ÎÃÉýû?ãt:{ýNô¥Óé›üWùörãúoäSµµ%®ÆÖî@T—ªÅò¨…“íÁòj¥&%\¤â©@¹Sèx ïä¹ÄÕÆ5gPÚ«tQM·<ÈsâH´4è­tömvNËæ[¯Ø©FÖÏN}Åé4LªeWÄ7‹ `ÁO`&q»Â|ˆŒbÅ/TŽ ¤Pmt®]“³6_¸Á§$ù:;b3{w„•Äš©ß^¾S©ÍHCåéò™ï‡y>šÅkSK¸SþhªÒÒÉ^¹e6â=\®aÙËÈóìä¢%¿¹èvûtBjbÒ%]Pzoç Øú¿å ™ÍÙጤ)¿£‘t»¥ryFVBÉí–,TБ½õADðä‡ÓGS~G}t»‹>ˆƒÌêëÍ&¢_«Ê.ÒÆ“H!h?Õ§{ì|ªOM1‰Kد³X!î–ä.ËÒ<Ô˜§l¨×÷ʆ:µ·+Êí²8 7Í /z„Ë7&’NTÓ"*Â}àžH¸$ñedt…•zr¬^P'{-„ð˜&ñ|ãŽFU³]ƒUá?_ùŸ¤¼î(oýëjÝe^6_eƒ~¥ßïOzUE[9´Ö¢ag„ îÌz•íÔRΕo"¤Â!)î4fMz»±’þÅñ²¦Þ(MÇóºƒËí? {vÖ³g‘FïEž1‡N÷€ä ŽHGž[ò»Åáî`·'Ï6ˆò¼_PŸ$½–ƒ,Ü(ºÖÉxiF{Ô²H\1Lÿ“Ò"¶l8Zì{𠾇؊ Ÿ…Eåêœ(²¨xYÑtî‹Q+ŽO}+®<í¦Ox?Ä—ÓG\ùVžÜÙ=Î6<ù:]-JK‹Î– ó7©’/*½â´]¤E£Œì§S1vÞ´‰¨x¡‚ˆŠ®Ašü$ ¬jò$ ¢Q5'«ŠË'¬d z³î?É,8¦µÏ?’ý ^¤âY endstream endobj 4046 0 obj << /Length 1575 /Filter /FlateDecode >> stream xÚåZm“Ú6þίðGÓ :½ÚRû)í4é¥ÓišãÛ%Ã8`‚&`SÛärÿ¾«ƒmŽ àãú6s7Bz´Ò®öÙ]ƒƒO^~®^Å*PHE4 Æó@D(R,ˆÙcVhbEHQõÂZÀâSàï¼JAuV¥¼©R#{~ÉõÌiì Pp;RÆ;õ7UßœZ4–à¿ØÇò·ÃÀ´'³H€õÒ`Dˆ”“î»C014î¡Ý†/Ž5DÂPDãËÙI¿§ôö;aCŒG°,J„;áiž•Õ·-ÅèºHж6„BÜæYªµ¶ÖU®q4?­`Œ"Àìái:σ4I…b{°ž1¢aµH]Ãmš,œçEçËu¡³©^)ØùŠð.ÓÙ§Ö8~:<ŒDˆ†#ÐU8®aʪðsX¨K×7Í×:¹¶Îª¼³rÈâ Ó+ÂÒ»Ï7%É\c¦Ëu^zqòyí‹<)tòqé{ôj•ÎtR¥K{IáGXExËJæUZ8Vœ&Ë¥“>T +?´æ›lZéYj[ýBŠé¿.Så8BRŠËÙJ¿§­ôö„L•0'zRìb¬åP¼rósÌTÑsP?“€Z×nnžú‹tiçÀ÷c»ÎWCð,î 6ýŸPþcùžØ™íÖ;»à qtú.ZéÝvO¹Ž‹§¦Ü|òcjSÿÓé–FƼ/˜ýQA&—Ëþ:øý\ha§[*€¨°×©ÎŽpŸÓÝæ“¹Åwˆ–`y$ÓvX–sĈcÙøH’õãI6Ûähš¥œ |¹÷møžÒWÔ8–}pù7Wƒ…™âÔÙÊe)`r9í¶ñ{ª··°§è—ÁSªæ+ÌýзêzÖW(&!ÏR`¡»ås·…v mž/o~º¾vÍ"õåÇú¶Ï–ÄÍp÷è„ ¤[m‡;ú´Ñ÷eým¯k»²8LX¯ÓlæJ);íW×^h“é²*-&ƒ°ÑÝR«Œ4n¬•Ï+'÷ļœ¨Úd¾óðfŽ{Ÿá«¤ÚÄõþ|S­7§Åv;‡Þ-‡pHÏÅá]ã½wå ÚAð›O“m™êãýc'¶eAéC‡>¾_Sÿ0=­7M_×Ù7p¯ÎØ·3# ÚŠÁ) Ô¿!<ÜPñv8û´áøÁäÁ&ú§Øn~¹†¿Éï¿n«`†ûRX¹™NÓ²œo–m±úEïG}Æ:þqRØö endstream endobj 4066 0 obj << /Length 1450 /Filter /FlateDecode >> stream xÚíZÛnÛF}×W,ò$Ñzï—ö)š R¤¶ pƒ)‰ˆLº$eÃß!w)‘””Pf¤¢MRËÙ™ÙÙsf(´@½ý<]¾ÖYlSh:GRae9Ò®š¢iˆnÆ×Ë8_Æ&ÉøÕ‡·îæ*šGY”Ì"÷õ}¬ƒÕÅÇé»Ë׆  / ͰÌUº¨20A›ñ¥»0aËI£_¦£¿F¤¢['`*—hv7ºùHPÏÞ!‚…5è±’¼C’̸‚ûºý6"Í…Úð£Ö))¶Âù’Wëºý]P9~º-žî#çÔŸDøÐÊ3‚­,µ–—7?9ÖD Í%–¢ò³—TaFbØ‹²Í޵µíÝ5À–FÕœbZJÕï7¥­¿ÞÔ>šº¶Ì~g+…Ù¹›+MˆZMÑŒ&ÓØhÎ8)\ÀêA7J!ÛÈû¨7§•BLP™þÉ®¢ñ,MòöJE×kmCÜL)EŠ¥²n?²(17¨!¸£í¦t˜þÔ7gè²zHÎv®‡±„ÀåÜ~0>_P2v'Ï ”À­%]¾¦¤t‚@[Â[;ç¼i”Z,4¯áæÇŽÂ–3kkɼÈÖ³by<+–wt™®Âü€Ïq2O³» ˆÓ¤c¶vk@kÍ Ð0ÆüN\E`-É÷,à„JÓ{ ÉZ£_@´ÝWw—Î,#ðs‚¤^VQ=^DY[ ŒòYŠÂZ®c+/‚$ ²ûU5x"8R¡ §pf"ðm^eÈñ(¬ˆÜa§Cai%VŒŸ …;ú‡¡ðpgû£°³Ô i~­ÚEá*ò]$®àúËH|^•„ò}3x}Ù3¥¸Ü “åI[ÿÀ<ìl<áŠc.Ó0™mèš³Ûžº‡¥¢;i(p<ÝIE°–¾&¹®éî8®auçÁ†£þ;<Ùö¼M”ÒY¬cßY”™D¨ã° @‘úm­ƒ´oã•ïe3Î ¥å—Øìá‚s®ÖÏk*P¥NÇfBJ¸Ò“¡TGÿ0”îl6ÒTê«QåÏ–AÖ†(i1…<ìÅ?Â`Am“ìøPeÑN“BÎѤ0K°¤üiR„dXS~Ôp޵¥&eƒÚYPžéÇðö驈òï¢w‘çí]vœL•5¦6w¹OËÎÅ÷,Ëx¶ôKÍ[³ã°6“¥ëÅ2]w£½ŠçQßuxú°Wm^>¾ïÙ0ų›Î5¤±9]p¦°æödtÑÑ?Œ.†;ÛŸ.8'˜Ô=ý󚟇Mè;oÕ¿®ùá˜Úœ.MZêfÉPWè|8 'QúÌEE7®ûꈣ™SV±ä™Y€ËÚq×Fá1ØðÓ&3Àó Ýø*JÅÒÝWõý¾É ŸJÇÓÚLK«pDóô>ŽÂZiÕGÀ¨wNìê/Ïpm<±Ì ?–riæ/á»eã§tíõWoâ@"Œ‚Õ*…ï€(Ûì ºZËjÝ„·³£Ìb Ìí¥²x±¬²˜ öXP ÉD!JžÛƒù†Bg`> stream xÚÕX]k\G }ß_1íƒç·¤™Èn -„8mMÜdIMÒݰÞ@òï{¤]»I|íÈ[0¯V{®¤ÑHg4·I!…:$bý,¡ý¬!WRBn¦áPŠi$Q>UÓ(Uý©²€0B£¢?¥Ðíñ–CNE]4 9‹ýØB.©«Ô!±š8—¡ºž4Õu<[»éJÈT+$›>„M-™>5H#éê4–½š>z/ð1àcÕ5•šá°úœ²ê b¿"ÜRE31F(”S ”$f•r(œL‡'˜LW!´€DÈf5,X>$øhÈ5¤IL=›>:«ŽÊHªËð1Ètð1†é°ÔT;|è&%¤’nb†$šé°„‚¯¦"º¶\MªÓÄ’ÅWP'Üt¶û¸N> ìõ®XJªFPúnC!Ù?ÕU5`+ª(¹Œ !!ŒŒ=‚„¯%™àBX4öÒPF­†ƒóÚ ‡ÅP1þQ3ÌsVÁ‹êÞ$©®Àž°é`¯Y^P«4rƒ'Ë. „óЕ# .j !Å\º®œSàªKHœ!5Ó•ÀTL+$¦£ÀœMÇXàƒ%°$ÓÁ‡áàC†&ιYÆÑ›Üº% >z1|tÛ,‹G¶øHÛÎt°È±8<\LO zTÐÞÏÂôëo¿Ã~”46,j¯Þ¿}ûbñàÁÍàV#VéÃJ‰9ð9G”‰L)*Â.#Rc'8÷È(þÏÀGëÕ6†éHÙhì:ÂF”t!£ßê^šý½œÑ[¹Gø.äÑBß—ééfýòx¹ 'azúä(LÏ—¶á2€çß-ñÃéëåbzŒ`–«í¹¶ëó‹éÙò|ý~óry¾c&Óý²|uvúhý!œhŒ<8‚8B§ûx§A8,;üÃÕj £';ÖÖ°ŒµwBKB6á‹ÀìÙÅtüþ­}ÿùlõf1=Zo^-7æ>½˜~œ~šŸdû¢¿Üêp¬(Vt_3 Šh» B¥ ÜCKûq˜~X?_ìÚwçžáï`sºzµþë`»>x³üø½¦ðN"*¥F¥É;Hª Ü3Ž)[­7Et¶:ÛÞ] µç˜ÑhuYõØh%²GÒ"NŠ›9ßnÎV¯ÿ³Ôh‡Ðh—©±öJù6©±æÃpÙ|9ÇÖï­Geë«­ú)zߪ µ> stream xÚåZmoÛ6þž_!ôËä!fø.qû”M—]·Ä6¤…¡Xt"Ô‘cáŸTFb¤„™ÀÞvLf(ÀÜ ˜@Rpc²D"J¸G‘ •—koÚ°±­mýèꔃ¢žÀ*&Fº¯~·>mýõún3CS—DŠª0¶R˜ßxöäÂX–7KPÏldï³$¶ۨȻ*‰ñcT ° ~óa 9ˆš\p7Vµ¹·Ä(j?̤€,¦Þ !•µïÇMjb¡×\Ñvåo›ŠŽºƒeJ[ÏLémì™Â$CŒK˜,@˜º"°HÒ’Ñqù|º˜lùzŸfÝ€˜òðóÖAÁ(àaŸúÐ9n,áRa„¹p%¼ªgP§Ë[W°ïM­³ o²©=~ìÛ’hLÚ¿2Ž¿ª a5–¤„‹2_LÊE®Ñ`ÈàÞ§ÂÍ÷éü׬ó‡Ó?ìõ4ËíIš¥Ãy©ó»(Õi¹¢¶@­õ>9#¸SìÁH¢õ¾@ío®Qˆ¬† Ÿ: [‹"ªT-¹t¦^»ÈÙw›Íâbà $)¸v•faŸ²à© …D:û]~u€:Jq°»©PáÛqÈüÊð>!|ä&n¢æQ$°„#AðŽ®ÃÍb/ †`q8 ! ±:\ùëèïWþú»=PІBWý ž/|ÓP]t$o hä1b¡1ØÜm”Æ3½/6Ѐ܇K޶þžÉÑÛØ°Q!`£hÿ5!— ˜½Ei6FÎ@·YMÑEE@¾Š è–(ú¶FÑÈAW³¼®Ba-msu;ãÝôî ã(Äb(kôpN¹õÄÁX4›e“¨Ô±½¼¶´“ÔÑ$rPùf3#I“²]øú´¿CÎi£ŸË‹UôÃ;ÀwXKf‹r¾p1˜gíå(³Vüfk× IBž ¤ ÀdÐ8·üºÐ@"Òu®A»HÄÀÞи9H—¿œÃßøãûn½®Àj|wœ¯XL&º(¦‹ÙZ±â¢&k›çbÅf¹â½Èg´Hêpd€S‰BðéPõ¾£¿_½ïoìöd€3Œˆ ûˆ|¼B¨Ü¡_î`¼>þýæb_VÀ‰€ÐÃeI[Ï,ém쬀C5£XuYA{¡…B$P/¶Ï± !àügì{¦(DÍZ}›z'iÅ$ëP¯€Æ«®{Ó)óÀ?µ±Ös+;ÉæFÚ Víù“ª’©,³\ÇÇæBú…³`Øu“¤7¶¼ÌQ¦aáX’ŠeÝrŸ˜¢Äk™J»ð«l‰µÃN3ƒ5¦t"ß’ÙÌ ¥YiïÝeq2}è¸soà(š-tÓ cÀ†öWšÌ"4Q«Î†Æ:þµëÞÁK²çøàKð¯&EÙ“‡­ã+/»‹²²5ýº®× Žk¿ë[۳ͻÖí¦<ûÂ݃ú/ò.ö$ïªÊèzücZå×îLŒÊay@&F¡Œ’ñ¶ú~ÛÛÔíiìdª7 3'&¦ÉÊÖÈPðÞ[4;£z¿MÊÍKzÀ\iëï™,½ÝŽQ"ÎÜ"O²´Øòë€üå8›É²4ºÛ?¾Œ#¢G·;ú{Æ··±»Äúaî±×§KÚ…oS@$Š¿ ߦ°È“~£›3Ó<»kíÎ}8­ÈBu´cqTF/VÔX4=vci¼ä,›ùgÑ&3ÏSTCEI€Âú£äÈ<ÁéÛOIæ\T€k»óƒùtSX‰¤°ó<›ç‰.£üalç8°¶±ò¶œ.ÒIõ¡ª/óy–—öVY›€ÿÐ V©pƒÔZ hcdø—Z׳8…^Î!kÏDÚó­oؑίuž¹U´#íè½NRã[u~–Ô\ú̹k~¤\®ó‡,wö+ío‘.ä±.&y2/W¾.5åÕÎaýEMµi®´Îkk×d§öã¶å+VA¤ã7 ª{ø]©k…mIˆ/e¥ä{¡Ø…ò°[Ô›·œ;=cmvÕo*8Iú_Û›>ÿ8~sq1àØÿx±Ú-Ó-µ_¼ÇP¥vO¡ÑKš°?55©§~ÿæÏÑ@1ÿôõS&à® ¤«A=ˆ;ošÝÇ !¼³á¶=’x3T-ªAû÷ŸuIs­g;aÖý ªc¾ÏðþýFe endstream endobj 4126 0 obj << /Length 2118 /Filter /FlateDecode >> stream xÚÅZ[sÛ¸~÷¯àìK©ÆDû”´v6›dÓÚjg:Ù-Ag%Ò%©¤é¯ïR$,YZë™dàÁ¹ŸÆÁ—o/ÞL..¯#(¤$•Ád‰¤bA¤à‘`2 >‡·‹´\¤£18|ý÷wvp£çºÐÙTÛŸ“l,G¿M~¾¼ŽqAÉ AQó¶«i‘ÃQ^ÚåÊ|tq5¹øÏU8 &àS&‚éêâóo8˜Á»ŸŒ¸ŠƒoõÊU F”I/ƒÛ‹\à®`1éðÑÐ)ny)k¹î~×#"Âïå]2Κ‰*¹¿[é•åóW,0ü'5³)a62·ë E˜Hðšu3/ˆD”ð€"« ÐÁ¼ÃkŸÚöÙÇPŽD,› ,abV¥ïôÔ§ßèùº´$RT=³5ÁâK`7ÎÀ`ÈÚÀ¼k`¡8rN³Êl'àó˜`ŠñÆjG0NÐ:@—¬—–p/“l"¦÷!ã1Bƒ1AB*Ëß»HÄâ ³p‘d³¥ö8 _ê„!I£ó9KŸþ@gÌìÎÂ$CŒKØ 6%Â*yšgåþö§‹¤è[C(D “ždÝYR%'ÛS$e|>Ûöé´í`f±-ð±t¹>ýŸ¾;иKj ©<ÕÙ¬áÑfáÌa ©8R*ê"Š:Ùö5-¡Pˆ£è1µÏ&M“¿j»8FR²½çNt%e„"åØ¾Ñ€;j õ»ŒØ™y‘¯ì(q0ëÝäÑZ(Sv®N#õ¨¬Šõ´Zú•û:s[@e³ƒj¡å*og‘vÔt…ŒA¨1‰bÌr>1_°H†ó¼X%•‹0ŸÛ¹>ƒ –vEZÚEþP¤ºJŠï#) ÄÆG–U³¬Z4 çëlZ¥yfçËõÃC^TöUÕ°€ÿ ™ØŽ„›¤vÒòX¢ÑXÆQx«u³‹#PêvÙH&j}7’p®R¼Qêâ^¹³”éÛãMšÙêñuºtê½6‹œÂÌï4óôß…Û+ «­3äEÏfºœéƒåÚLÕ÷(ÚpõÕl¨‹Ruö%Í4ÀöYKØ@½ ¹¼&¸¿ 9…<Š™D_w]›qcÑÀü?{4{Q# λ Üòãˆ[!b“å2Ÿ&UÃòý÷š2iÒéäîÚWmfI³´êCöMNxZÞ1gÈÌŒ 0LE¿@{2¬Åäx‘kœ‘dÎþ€0óÆKîG‡ë¹±œ®ìÜ·´ZìŽy°yÍm„ "‚¼Øº\Aóx"1’¬eßÈ=š¡8FG}Õ´´cv$Nñà¢ïÌÃÔc ·OªaÑØ[öKÉ{Gì`©âf¥çÃÛl?—U^è]E!Í|‰ ¬nv3ŠÝ{VºÑP ²m2ÁA¼åxKu(nF¦DxûÓ;øw÷þêß“‘báë7wW77#ŽÃO7þ©Ê,OMíPMV‡ [ÑêQ®Kû2Ë+;Uè‡B—:s?ûú«ñŽd™Îì¬ïf®[9£u½8DŒOï·1×þê†ààª_'ÊõtªË9½wûcp&e‚‰8¯noHÌòLŸÔ~0MÜ=½?wûK‚=ߩã? çgöðöË›å×<í?r(éµj³{žFè¡]‡-¨ÒØßk=ìÄÕ ™4óŒÈš‹¦þhÍY´]<ýM7™×¤NNL"6ƒŒÊ|]LÛù²Ì§©ËÐðÛõs5w`xÌ©Ö qËâò9 Z@®Ö¥›­3˜Ü;ëÒnìÀ ÌLSÇ[]à™CV,ÎÐÒp÷c›"êÕ f.·Á×d^5åÓ ì£à3—ÆÝµðùÀ`WOO‚B?E7•ô‰=7$/î _ËÒhöúšNd'Ëàл_1¦ËÓÒ8aÈ2gKãŒcLq¶4îÑ–Ƈ3{xgp à”ùÝŠ-¿hO¯‚ÇPêœêû‘ñ¡Žÿô\gžz=ß\†¦Îw/àÑhÑ¡Ìni7ÁÉÆƒØåÒ]߬óc¦^¢WÏGšv6öé4à`fè 2 JÆ/Ý«71™%«Óí‹ ˆó!gþ@ûföûaÁå Û×åàSÍK•¬OÉç2¯G˜y‡3{„ya#$õbæ­kë³ U ù#Ž2ñ,v|¿m`ñ#Àܶ…Ë=M ÚÔ³m=ÁX A6¶›{»”ÅÛu®7ò¨Á(·]£V©)(ï‚òfU}™±…¤õX´‚n~õ93E¹]¸¯­ÇÀÇ¥8s÷ºÛ«_¦÷EÛïïž^¦ ŸJ¿dÿº¯ÔžäÜBž y{¬é´-‹=WY{8‡‹¥×‰íùiìûi|J‹ÙQìqþåÉðb¯ÒßÇžÒ;Q{QÓãù¶äz½q#нÜ9FŽCw-ØdŽ_þùთLfzn¾MÖ˪µírµ§ñ#BÔQçøøŽACq ßuŠaГ”1f%é-éjËüþáöêfãð_ïþzuùÓ§ÛÉ/#&Âׯ¶&)!oºßW¯?|Ü–ñÌõh³è»‰ão ]86z;Õ¬¦¾0ÓuQؾ¶aû{YéU{ 3‹¼¬Æ¶éL#ŽˆŒûíé&q¼2}*ÒD¥j¯“qW„Ê·3¼1ÄíÈ‹a…71oT¥ÖOd3Õf3C³×¬êìêú#»’]GŽÚ5Uë­Àƒ¹/0Ï,·oúî/¦ùzéd¿w|Ïóu}®6“l[“LE :BYe.Nû°í¯9`ÌOù£ÅÿÉr% endstream endobj 4151 0 obj << /Length 1640 /Filter /FlateDecode >> stream xÚåZÛŽÛ6}÷WèÑ.j†÷KûÔMš4½e·OI`xm:bË[Ùn‘~}‡"%‹’½‘WëMˆKQ3‡3CòK8ùàäÅàûëÁ³çÊ$Ier½H„DÒ°D¸*’\Ï“·Ã«eº]¦£1xøÝo/}ã]ØÜf3ëÿüyší§«ÑûëWÏžkœh0(™3ÈEš+pWØ"ŠÀJŸù åÆ=4øázðç€À(œx”‰d¶¼}“9Ü{•`ÄNþ.F®A0¢LB{•\ ~àúÄ4©á(m ‚ ÷X¶Å¼&툈á§íd1¢x¸É'[›Æÿ²ù$Í&ï0¦+ëá¾ÃÃR`ÆÈçÏ]^4fÀÂoÁ\" "Pýc‚„4~èWaDÓQÂ5âà†VåãJÇ—M¨˜E õyz;fã¢|N9¨ÖYô D)(™NbºŽp9Íæ-$ï»/aHRu¹ÚŠí÷¬­Þ`;Ô“ 1.Á8%Ây¶É¶»(ÆÇ’;véŸ-§ùý+°™]WeÙt}ÿübŠ¤Ô—Ëol¿g~{ƒ='¿XÀÃò ç×ï'ÍìºÓçÛŽ–ÆÀ)nú?ëI •FJhü…ÝyVðqǨ?^}쓾±½µ³Ô¬vîIÁ¬– ç&춸‰†s8^±¡å°E¾Y3F Ò ·—MÃg³j ŠBïŒÖkeLF¬˜2௱ãýˆr¤±(MÓ0¡ÐˆšjêuîµJoòi"<íYn§»Ð¾ñg)ë‹Ôj´¼?µÒ,ÝÅdæPbŸ™8DÉõŒ @¦âXP£™s“¼ÇÌ+Ú w…yÎ[•µ ¥Ùÿ rXZ–Èe»¶t£¶¨àqëz±:\6Tz–hî\B´`TÍ™‹¿4Žÿ»ÛçÙöø4È¡ø»O£´8fF wKëb×Q,hfôaAÏüZ8†3 `ó¿â9·VcÛi6OgPÇa„ÏxÐ{QÃ_þxý:Œ^øk¶9ŠLþ½_S7¶»ÏBWipšù«ÍóMQnagw{6(â BžÝ♣亸³5n/`°Õ¨Îê±Z÷”‚HærCÀöi.F"ëý(B_ ÝÅ…€-Ÿ”y~LqQÌ1…ñä†K·áärµÛïY]½ÁžA@áˆRýÄúi4½X~öûå·?Øsò‹¢êaÓ«:fWÝ¥.:§V„)»\jcû=SÛì©å†"FÈÍmqLôŽ\KPBü1„#—p–vZ8z¿[Nýõt7[vR‘(²ÝT$+‡Á‘vÔ–fWÙª"Ü0EÁ!å‘ èí Ê¿-§8à11 ¼†Ñ®úÕtÔ¯ŒBŽëÿ[¿Ê'«_ÅÓѯí´lmA鯂Òôüà{s¦Í¢\hñ¼H3 Û—9K«óçS©qè › HÜ1Üñ?¯A£®ÆÝÈhòpßmrE£ˆl8²Êê„áaã:ø2uuîFTêÜ=XzõêÜÝvêÜõ8uî® ¤•:w÷nl ~_¢òµSçmI–¬WìE¢Bç…<_÷‘â€Q­/'ÅÁ8bôrb¼a¿ëê¶» §† IBjÓ¬å"˜b«l¨ù£ºÚàŽÂº°?Í ÷Ó_msÝ :U ±Ë½»‹Í÷,”¾PÏ`çTc$ÅUXŸCÑ©â`•<E§à’Ëò *Î͆ÿØ|ã[Å6 ×õ&·¾Õ`7ÐNh湄Éð1Çg‰®¨¿Ññ‡˜žÞÞÚ² Wp¸ÛT=mtvw‰ûVÊ…Ø$û¤þ’ ƛᕵwXð^î9“Ûö¬lÖG¯ q5èY‚ÈÅq¸Y—Œj¤8‰ÂN³Ûýînf†c1p˜vLÉ8ŠO,OKŸº˜:<]­6%ßè. ꩽ§<` ßy¤×[mr}®DˆÙè±7\—{7tgF®~| ÿ&¿þÔ*h¸ üŠaÉÌ÷³™Ýnûòõ Í‹Šñ*­¾5Ã#N#³Ç>ã°b~Ÿ¯Çþ4Îá endstream endobj 4178 0 obj << /Length 1953 /Filter /FlateDecode >> stream xÚíZKsÛ6¾ûWðVªc!xƒhOM'NÓ´M븇N’ñÈds"“*I5M})‘åHbÔgf’!µûÂî·›àè6ÂÑÓ³ÇWg.”Ž4Ò’Êèj ‰¤f‘ÒðT$ºšE¯â—wiy—ŽÆTàø«Ÿù—K37…ɦÆÿü~’­&‹Ñ›«o]$8J€¡d–!W%\ÁqŽQ6¨$~ä”k»éìÉÕÙ¯gVáˆl„€­LDÓû³Wop4ƒoßFqDïÜÊûHŒ(“ð¾ˆ^žýt†ÛŠ%¤%GÃS¤¹—¥tz]¿5#"â÷åõ¼Qç÷ ¥šÜ\¿Æ˜.Œ—õ5þ'0FZØÃìãi >C óH1wâ[º QÂ#Št¢£ÂDó–¼]nýÔí(G"‘Íž1±«‡ò¯mÕåߨzŸÚ¼$ÒTaÃâ6ò/—µ“Á™ÎɼídªP¢j/§Yå¶“OôjL0Åx.\ ¸ ˜§m°ƒ'°ÁFDýa›iso:çˆ R{ ?ßÅB –D­…w“l¶%I|¾o<†$U§ —.ÿá2XØ=Â…I†—pJ„7ò4ÏÊ="F‚û§w“¢ë ¡|z”wm”e“ûãý‹)’29»üúw°°‡ø Ø,ÛÕÌ]ò®¥%$(øn§ó@T‹[kóUµÍó•MäË==(µ†ª«‡TŒà¹³ÀK•€‰ýëÂLªºOü#3#*âwþÇÛÁ±¯‰žPšÊ¿,óåj{gþç»´ºÛÚRzŠM¨#¾vµµ²­§Í&U½¬¬ŠÕ´Zµ| êlC_«‘56(?& iƼ†Ww°)Ïóâ~RÙwçsOëžÿÙHˆ¸ô+ÒÒ¯Xù²HM5)Þ¤€9æXÅý²ê®Y8_eÓ*Í3O/WËe^TþSÕˆ€‡ªAüŠšEM¤žèe,Ñh,¿4¦9¥fPšõ²ÑL8s6šÆu:{nýhŠSäµ#<¥kîÇifusï颶õ…]TÌþN3ÿt’Ø—62¼÷л&/:ž™™rZ¤K/µ%XÓw8.Þ~³š¢4c“ݦ™„9[s1Pçv=º ¸}ÝAs ³°Zl_ÆQ‚EƒH¿xvnK‚¨ÖÍʲ¥mÍÜ+Yv²XäÓÍe¸yï8“&yVõpíQš¥UYn’ÇÃúŽ9C–2& 0ÛU$Л•GèíØuܶFÅÖ…ùæb~@^Hs‰lä•[i3ê ¥ƒÅ]æùLÑ•nw «îšð~—.êø½1½u·µ“öÎëØ_•UwçÌlGƒ{NÞ×܆r5š24žV- o"AH××—òbÖg;h=ˆP‡Û®Åqwà¾üæü¹~öâúÉååˆãøÅeˆŽ© qÞñMÔ0C–åÍl?t4iŽ~þä—«‘fñW‡"VYÙ€ÄË ¤žYp©]R0?×ÝÔú›MY“E:Û]ÆÖÅë|AûØöÅó>uºñâ&hsÇÐfi¬¢1#ÐíßçÞ›û£š\(ZH+rº&—kŠ0¤S¡Ú€ÿ0T;\Øý›\®…»¹«ÉµÄœàÿ¶—'aÁN-]þ£e°°ô@<§ð¿¹Åué÷X×*Œ0¨v2×vùtí`aq­‚gBëdŸþa®÷t. Å£½aÀ‰Óy£Ë 7 {ˆ7$Eœ²ü°ƒ¥ —Ű¥ hý  \æMÇ|Hÿí§¹Ã§¹ÃÿxîДö@ghG09\e‡P&YÕs×lﲚ[¯Í›>º7¬c |îä"à ÐC:]·Èu) d‚®O²µø¶´~À2CŸhÛ¯öˆcÍ; x+qL4€Ý`fë¸i¥§þþ4·ùWÍm˜‡ Oìr;> stream xÚÕY[O\9 ~Ÿ_‘ÇÝ2±;É U¢¶U·jp_±Kàâí>›>Ú§ö`«z 0Ár;hÌ>¢€±ŠO–ÎcôÌ ÜVÛ¨]7ý}±·pØç_N>âoãp~¸üÕ¼{'† ²yµZU¢Wäp 2ÛTñœëJCvŸ>Ã߯Ëç¿=Úzµ{w¶02T@E!/¨^¬ u^Ù£æ^申/'wd\êN‰Ø­Öì”!RN©8c¤ à¶²æHI«í [šƒkBÄóuyörãÉÎÎË;ö‹í…5Ѓ= =!íÞlÏó'¯÷¶Þ‹MTŠgd•¼TëšÉ£KÁ€á1Ü2jZb¯ºõ肯éjêmºšUàˆ0—Ø F‹€–µÌÙ[SßF'Ýo³ÔÜo³ÔÚo³`3kI}`œHoP®ãXz%“·¥Srð¤’}[Œ63ú6ôn½’ƒÒ –êmäì'óËÁÿ¿hkˆ¿mkl¼ûÁ¶ÆæàÖ Ø<C7CÃòÛ <|MŒ 8"ç¥I©ú,u¥ ­?ta4½bWÅ ØŒÇ ù“ªf`/82£U"©MVÝ_kU1C´‹š³Ö*…ìi³ÍŠØ¡d¹ç,ÙÃ7óúBÆg»)C[¥ÖcâÌÙÕ–µUR®õȇÅÉÒ¼²ñnöþàôh¹ñþðhv¹tÛMUÿ…ÄôM¥{%øª ‰Õà+.$V‚QºËª±z%=J%éØ,ÚNp]Rîc`(Ò {ˆªæSîÅZßǽàäcéÜíˆÓ“¸s#úö¤½ëcŒ^¡Ós‘à’Þ1þºþ^(Íß]Œ…¾-Ʃު[Ÿu¹ëj7³!#¡#‘ï´ Uj®ÝÔ U5x ºÆ„:’Ú‘Ï I )Ai}†$t#l¿@  °yÉn6B+yHÂ7ÖºOLJóåÝ^&œBDØXxÍ]Qâúï4û"HwãÁ=V¿c:µŸ$ú§Ó èKÜ*ð•%n%øª· |e‰[¾²Ä­K¬(üÝàèyÕÔ´¬ž’v‚Yp{%Z1.à›;GÔ{ÕN73Fu-Ú+M[Ö^Éèø(ß]Õúº6u ”ß]µrù¶jeý᪕ÆÉQÇÉ1“c'ÇÌ#1–¸<–¸,÷2Tbˆ´_pχÊ|¦õßw iÀÆž’ ÏüoË·¨+ÿ3ŸÈ endstream endobj 4205 0 obj << /Length 1494 /Filter /FlateDecode >> stream xÚåZÛrÛ6}×WàQêX0î—ö)íÄ©ÓtšÚ~s2E¢,NdÒ%©¤é×wA€I‰±$FI:I  ìòœ³`ºG½ü|38¿ÐYlSèfޤÂÊr¤-´š¢›º^/â|ÆL’á³×—þâ*šGY”L#ÿó÷I²š,Goo^ž_‚ TÜša#4LWÚ¢šÃÚ Ï}Äu žß þPEÝ8r‰¦ƒÛ·ÍàÞKD°°},G> I f\Áõ]þú ­ùQÙ”[á}ÉËuݽFT?åwYœÞ­7DøKKß¶ÒÙuÍ‹–§k"æKQzêú%U˜Q¶Æ¢,BóškMk»{·'`K£ª ¼aêF÷µ¶¥i¿ÚÖ}f¨ÛRØ2ûœ- f÷È_\…xBÜÊxŠz<™ÆF‡€ºð•ë´ƒnÇ”0B6±_ǽþ F syîl› /Fi¤ù8×€¡1ÅRYïÜ]v$æÕn›»ží›ˆ”cÅôéò¤i¿gžôvv<áŠc.L“Ré·øâòÕóæ3¸»w¸1k#ç‹v´rü´wÄV= £Õv‚º2kª½×¯ØvO–Kñ~DÉ0 ¡ï‰ßæQ»Êãä>ô…ìß<äß$ÜØŽó Jêñ Æ–ðf²Z×=!šW¤ñcËbcq3 „0²æLËñ"õí.Ž9ƒSH˜…Éz”[nBs­wó !l˜s1IfËèÌÿH£°ãó4󳸀=?Û±Œ®¨i{V×\3 ä.Âú”wé**VY²+ÀmTê½i«‘5‹!éá=¢5$v®^ÿz îþø­¿ånTÙ·šN£<ÇÁ¹:­ÇB*ˆØÍëYôŽ~ˆŽ"w©%¼>ætä.•ÀšÛ“vË~?Ðîïìþä.•Á„…¨~HãÙÓìnU‹Ü]ð!ðmv'æ?ÈîÒµætyÒ0ß3MúºzµK©1Qæ è’‘¤}˜[J‚µ¥_ƒ¹%³kt»rhÀöÁý8d²Å#%‡g‡Ïʾ¿Ëf¾óÝ'¦ˆx³£”@ôÔÁ×[Ôò Ä’ÙàüYS*ÜÇ#Vy—lûU±òL9ÇbúmÄ‚çä°·ùZ%¥ÓIÑÜÀnbÛVGy“w6Iw„©E¦¹*¯#¸zk+’Õû((tÞÆ*äÅ"êP[Y#Yñhš oªáNeyÑe=ï¸Q÷ìŠBS‰º[äñ?£qiùQ @i­N' dµ¡§«äZöû¡}g÷‚L‰ìUñCì·% ú~$Á!D$@ÏöUJHAàI˜èEõ¶—Ûùy¨xñÉÿê›uÙ.¤?]]¶·Qy‘fÕnÄO‘úZ‘Þ­Kâñ˜ƒj1”Ÿ‹™•ØHq2,nÙï‡ÅýÝ‹!«0¬CìçñrG…Æö„ã ù±HÀàÈòŒ`A{ºCú–ýžiÒÛÙ*4f€³M€öišä{ÖhÓÅ$kFCBÂi{\t]š%“‡ãã«9¶üt’¬e¿g|{;{H|µÆŒ‰úçÂ"I ,¥ý6‰i¸)¾ŠF.Ĥ:V Ç윚á$ñí³ë_./ýe=fQ%ŤˆÓpÛ±0§ÚÕôîgƒf]G^d«)0xäºJ«´îO£P’s.ý²ë&ÓE‡¹8L[ÖpnÞí ¯%¾pÛÌ äÁÇÇ(™9•Pw+ž‡¶ðÖýIDœy°yE]ê $!¥Ù íï Z«yо.Q¡çaR4Ïúfº*W‡ Õ e´åà+”)˳¼öµýˉÓ8‰‹#Ï@¿¹žæ×”¶Ö-$¼µG¬ÛçTi´q„àóªCsnéh9/Ý1’Ø:<ù’µÅº”èÖÏŸýøô™à;þ6/6„i| ™¯–ÍÅíú_0—ˆcþSÇ¿œð¶ endstream endobj 4232 0 obj << /Length 1651 /Filter /FlateDecode >> stream xÚíZÛnÛF}×Wð­T­÷¾dûÔqêÜœÊ.ú-­,"2é’TÜôë;Ë]Ê\J¶%Ñ ‚"@JÔröÌœ™Ù9LppààåàùùàèXÅAŒbIep> „D2fŠáªHp> >„g󴜧Ã8üíý‰ý0Ö3]èl¢í×·I¶LÃO篎Ž#D`P2c+Š"®`»ÚQPQxd/”Çæ¡Á‹óÁß«p@î@À£L“ëÁ‡O8˜Âo¯Œx·õÊë@Œ(“ðyœ þà¶ciáhl ‚bn±”µ_ŸõˆðkyQåÍç*¹¼øˆ1]h‹ò#þ’*F±0Û˜ËËp†æb ^7÷‘ˆPGqPè`ÖBê[Û|w}Ê‘ˆd³5LÌê¾ö]”|ûM”·Ù¡mK¢˜ÆO¶6X\öÃØÑ 4Öôò6½T¡H9~Ó¬²„Ýk'ø0"˜b|— MÔ)0K!Ú`½Ä°ÜäƒûaÝdS/ÞƒŒsÄ F [|?ßgB ­…ó$›®! Ÿm›„!IÕá’Å·ß3YzƒÝ"Y˜dˆq ›Á¦D´»\~¤%¤/ì¾sëÖvà S$et8Þ|û=yë vÞ°€‡¥ ñ$ÏÊ-êê6œÌ“ÂgCĈ¨=¹5Ý!K®×êÒ¿nɱŒc8gã>'Eçzï‘.U„”ˆ,ö¿Š´r'÷ç!Á¡;í*·×Äí'çk+¡;Ú{Ó¤rËʪXNªe¡‘ñ°ŒˆB1cvÃó9lÇ(gyqTös>³WßðOC!ÂÒü´´+nŠü¦Hu•_‡R@ g!´E»¬š7 gËlR¥yf¿Ý7Ý/UƒÿÝ›¶Ñ áH0žiÝYZê–±• u@̶¯‡T„º¸ÔEî6±wV!j3‡pmæyš'ê§ G±yÄEÆ|O3GÅÜ-hÏ`×vÖª?ƒYS]NŠôÆ¢67LŒ=K…6¿˜ uQê‘ήÒLÃ,7]Y¬CÒÎê£c‚Û…>Q(A̺ç ]íÔcEX4³ß/›^–FˆÆq³²lyëŒ[']†&‹E>Iªòå×Ú2ij–´ê¾NMÛÚÓ,­üIî®höwÄ2wFSá÷öŽÏ0í`Ŷö9jV¶ëPW~%ÖyüDFƒ‰ÝB”ë-ª“È*÷ ¦6çeÖjP~ p¬ZF¡âP$;!kh Ù¦¨ÂDM„Ú w÷‡8ûýþ\Ÿ¾ñîâÅx<ä8<wÇ<Êh˜™é.PC{«´×Ä^ -].ôµ]–ßè,Í®,xµqG…jÁ@ÞD‹êÐÂÄ*{luÃF&ž`ûÙyÎdãÚÉéÞ~‡FuÛÑðcéw/ë¬#Ø8ë÷› Ï\‘Bw~°,ÜÓ×k Mv¹þU.']–Èâ€IùÝç,]©PŒ@R—>mõ ‹PÛ¿ëÚÇÝUW áö<õԪìEp|°°c¿ß@ØìöªË±X=‘ê3üwEŸì-úÔ–Ó¥z ÉÇ…i—‡KÏ|Ï<é uÝÀE„8‹¾S½Ç![HLÇšo¿'m½ÁîÂWˆ+âuG’O×½|B[kóeµ7aŒAéáóí÷$¬7Ø]c êÛô_}щ1SHî[b0:õQÜœA9ûŠ›c8–(ý¡¸(îŠûûVÜ® ºº{œ‚ŒrÔu~ÜTœÛP¹Q©»c¨ã‰d»“Y¿M2‡æÙ¼ÉÿË!Åárfòq¦]ߦÕü~ ›7ZÐâБW‘t=¹ƒÉCoŽGâB1pN•ÏùÊt70Jì“æ€Â¯Ò~Ñ1Íøá×D¡x’×ùuê«åº;-›¦e0ê©ó¹yYp›–M[pûé¢hÚá$ŸºƒÈÔ.ò©Tºéö…a¦Þiw]NÌ;vI§ËIÙˆÙÁæÀŽý~s`°Ûër(Ž=¹•”y\ž ÞRç5ÿyÑMVBå÷ò/±»ÌŸ$HAú}ƒù“€’U1mÆÁ¦²ï¶ºl Ô[k¤ÉêåÖ~y=~>Z½NtÝà&¿Y.YæÍÛᩞ™~™,îúbl&‹¥.·›tèÿvÒñoБ‡: ‹þdêqë½kçïþ|óf轉µ|¦‹Fp¬öÝôw8$4æûü×ÿOˆZË endstream endobj 4259 0 obj << /Length 1530 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×Wð‘ê„0î Ú§¤§©“8UÔ§$ã‘)Èæ”"]’jš|}i“´dS¦•6ÌÄ/ÀbwÏ8‡6ö.<콘<›OŽŽ•ö4Ò’Jo¾ò„DR3OihñæKï½ÿî2..ãi@öŸ¾}é.ffer“FÆÝ¾^¤›E2ý8ÿõè8Ä^%³¹¢(ä ¦«l%`€ ý#×P®í ÉóùäÏ ^Ø#7NÀP&¼h=yÿ{Kx÷«‡ס÷©ê¹öÁˆ2 ׉÷nòÛ· IËÆ¦ HsçKQÅuöG~nò|J±Ÿågç¶ÝÄÉÒ¹÷ ?¤ò#-¬}Û¼èyÌÂÜSL Á+ísA$¢„{éP{¹ñV-»Ö¶?½=åH„²™À&¶÷Xûuzºö›ô™¡mK"Mõ#8[Ì/›M9öOgOܳh‘$ö=¦´nVYnÜsƒ.Ð4P[ËÒäS!|x+µöçðÖXmÒ¨Œ³ÔÝåfM‰ðÿ²ÿ™ÂM`ÖWåg÷Þm¹¥»9};yúfÊ„ÿô•{òcj’e=ήÂbÕa, ›sÈA@`[5ªQºX‹Èw6ÁJêàutLp»4`8HcÖ_yp„´“Ê8 ±hN²{6;ùÕºéY´ÎÏÚ¸ó«¨Û$É¢EisooÏ?W–ISƒ¤Uƒö} Yv§›rDwÆp†ì“€€ÃÖ_ëd»²{qs‰0aûÇ}mò¢ml X«–Wh6bp]%3Snò´Ø†³@D¨ýãm,V~¿ûå%ü;;=q·ñjJ…¿r7PÀ‘)ŠÕ&Aõôm¦bááBz#p¤í¦*‘m“ØÀa÷®"`CTœŽ«A‘ ùÁΠžýqgÐxg‡s-Vt4W‰ø=²òÑdE ä*ê1¨ŠàPæT®LºöG–Éhg÷ * $!ì‘©Ê`\F¡<œÔèÙ‰Ëhg÷ÁˆµÖˆ.½Sp©Ëùw.$ðP‡­¾[×ôpÌì‡Gû{öGb6ÚÙ}0£Àyt}ôñsÖK2SH ý0­æ@KL:FˆJ˜|YÀ5Ð]­Ú¬Å“¨¡p}•Çi_-wk9uMeêÎ ¾3ì [ü/v/âÅ–ýÍì6ÎJêýã½Ê€.®ä~™Ù–ù©±ÔúSòÙ=nG·_LžÕýM¾ŽÓæ ó‹*ü½‹²´\ÞÍ}»øáÖ?¨\&ˆÿzQÏsnîH+˜óû«W}nfÇÙü–µKYê¼fÙÕ&ß\²¬”›ÜrÛìMºª¬Vº7à"D@á;ê·Ù‡zy¤°_‘kàûJX"C;%ÜÙèz˜‚AÌøL¡«Ä@ S\”—î:[mKŠÒˆpÖÉI¹%ìn¥eõÖ•mÊ«MY0ö»ÄßQ²Y:ø­u©\?°Ud €àºìº2w¯«­ ðMXG\ØíöŽ ¡Bš‡÷KUwbÜ•Å\ƒÒTߦ.&C„ñYa&ŽðI™9˜8frJØÁ˜ZÏþ8¦6ÞÙáâ˜QŠ&$Ž«è­AùÍ}ÍgÖ“8Ü—”žý‘Å2ÚÙ=h=ƒ“Opú/Idªìs‡ûtѳ?—ñÎîƒ ÆH„5ÝrU”ù­¦œój”.#ʨ†Eß¼‡eTAêÂæS¦Va她-Ín´XýË‘®0»sÒÔwõKšïíë ´“Ž@kX_Ñ ;Ô}„—8ð²ü7è(F# àúSÜÐõß ò=;þÙ]-¹»ZeùúªÊ–aW^þw˜êµñmÆÂa·Àü!ÅòIëæ endstream endobj 4283 0 obj << /Length 1248 /Filter /FlateDecode >> stream xÚíZ]Sã6}ϯÐcè4BßíSw¶»LgÛÀ»“ñ<5Në8Ý…_ßë/b+b„—ÒvÆŠc«suu$ èôvôæltx¬-²Ø*¦ÐÙI…•åH[¸jŠÎ.Ðùøô*^]Å&Éø§_ßU©[¸Ì¥sW}ü%J×Qrðéìýá±!È â Ð ¡¡»‹j/h3>¬.LØâ¥ÑÑÙèÏ…§¢ð*—h~=:ÿDÐ|÷,¬A_Ê'¯‘¤3®  ÓÑo#ÒÌÐSRlEÅeUÆ5û=ûì²ì€‘ñ2›Í3%×·Dø¥%A‚­,À‹Ë[.Çš¤¹ÄR”t‹û’*̨@ [cQæÐ¢Å¯‹¶ûîvL`iTÓAL‹§Cñë±éâ7c»Om,…-³Ï@¶Ì.QÕ˜Ö¢‚x¥¨¢-*ÓØèZÕ8Í+ÁîÅAçJ!Ý؈ß~ž5-r¡þb®™!¹˜S†&Ke+nßÝ!17¨õàU”^$Îc2þ~ßL¤+¦‡K”.~`¢“Ý#Q¸â˜ A§T¶ëÚ,Z¥ôñŒQM¢éxæ|Y·CÁcüHsÉEãûxaÙÊm/„â读Ü[—-'¹Ë®ãtsóQçìçíÃf¦Uößh&gUô7”œAöZ3œ¡„„‚b¸Ó?lA '»¿¡äTbÉôóÊRÏT*õÚL%'33ÜæÃÃÌ•`²=Ì 'Ù¼©d–`Ά3û~˜.ád{èÂ,ÇŠÔÉ?_¦«|?E¶ ¨´˜ê'ÝùOf4æœ ÿÉ@"A›?qçËÌ=ä>šì•rüÿqíKמüCkŸÝ¢®ò,N/}“yéR—EI|Û„ºÉÑ¿ ;%kç¹òMnï“ůɥÞïú÷Uƒˆ§ü÷È߬ñÓa endstream endobj 4195 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1801 /Filter /FlateDecode >> stream xÚÕZ[oTG ~ß_1íCfçf{¦Š¸¥ (‰*•Fyà²j#Pm‚Dÿ}?ûìÙØ%ƒØ!EÔëýÎŒÇcû³Ï¶DI.¸%»˜E…âReÈ•D*4Gœ Ôà8T¢cÊ*$ÇÍ4ÙI1MqR빚MîŠaĵdšê›¦¹¢ªZ€Dº‹.Æ Ûµ©˜ÆéGHÅÅ” ë C‚E%èŠ-Ü #@ ‰Ã‘Lª;G•šKAíÇ¿.ÅÒTŠ.ÙqS`—J2I Iš@ª.QÕáYsBŠx–ƒê"že2]‚ÔL—]’b:øQªéͦÃUL‡=ZÒ="öhlºærˆŠK’z#¥è²y#¥©˜-’z#e|›³Þ ™¢JpD¬JÅåöÀ5æVôlzÀ`çM2€ñ\’ílz_Eï3©ë¨•°(UõUÆcœM‡gYL°¤‚=2> «®àRjT\Û+™Ë·`:ìÑÌ÷º|k¦#G!›Ž!UÓ‰£˜Ì–I2ö ê(G³1YšJE£Ó¼KÀ‰˜µ ëÁH£ñʦŠãl·ÊhS%hóÁTÔ“Œ'°ŒJx‚ÍÏL,ê˜K2@ÓUÇÃÉáNŽ/x89‚qrì!š6vr¤ 'GÞI0ûx2œ! š™%!Ñd89áÛ"ö-;a»sä‚é·.©-Mvw'Óçÿ½Ÿ¹éݳ³ùÅdzôáÕ…}~zzöv2½7_¼™-Žr?œLMOïGû0™Î^_¸c„­OH¼,ìSµP÷¥hH‰Grw×íîºé‘›þ>>wÓî—óOñ·szvzñ«»sg‚¿ï7$æâª ²Ä“&dððDp&ßP:ÁÕ+©ô“À¥Ù7äR˜àñŒúÔ Î>së#ÙO]àÒ4C;W.µÀæN¬ÀdTœ.0Š·¯µÓd°Ü{WN¾{ÝèkùlݽùÙ…Eþ¨ äjí¡x§0Ê(ky)£Óˆ‰¨××°D—G$_W"²®Ò` öœ,æ¯fHI7=x°ç¦Ïg/ÜɧY~ðòŸÙdz¦ÍÎ.Ε¹IŸ×d>ŸX¼ž oº?foN_Þ›t–ÿ¤÷RƒúÚ×/X ×o%äû[+¤fY'´ê( Ç´6h)DN¶U°“g´œ¢ôè}€=¬—Ê)ŽZ¯•™ÇâH(lë·Çí’N ¸2yæ…èö !òÚª¢ÃC&¢7ΠÓFC§ëØbçýâôl‹Ü>6æí“—MzaX×n³Éb6¢»Ð6}ŒÙÈøœ¿•еLéXr…GÙ£7ØÌ£Ÿ ¯ãѵàM<º¼Gׂ7ñè:0!œC7X'w‚«oµÌðs’>pÏDJàÌ^GãN0š;½‘cö:÷ÑhêØÙ¹rð˜³ûÀè(<ÆéNp­^‡ªŸwsú’wsø^ÞÕA|àÔåm _ 4 < 2 u›¹ÿ|^ó—|^ãwó97·¬„qô–›½‘¥ú?D¬Ø»èø"?€¾#ÊE¼Âß©y¹æ=ïÍñwÒ ÷²§Qk·ø–wEàHV4^ =e¯!ÿ*<‚ endstream endobj 4309 0 obj << /Length 1277 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£]Ì ¿EnO+–tm1ds¼§´0T™Ž…:ò&ÉH³_?J¤‰uÛŒi@¦ïå¹—÷\Å\Þ ^O'g‘ *A˜.P( "eŽÓ9¸^,Ób™ŽÆ„£á¯¾µ'½Ð¹Îm/ÿˆ³M¼}œ¾;9“H(hÈ"%‹Ìt5Ž"ó@$‡'ö@˜ªœNÿ°…¾3ÂçŸtž®óY²)tbMû€82¸¶AÅ+ìêðÆ³–Â1Q9«­­îs, Á ¨¤¹‹–y]´Ýw¿ž€0È¥h&°À¸Šï–¦‹ß,í>3´±TD=±5`~ìÉÄqj¸«9emNIeäHM³Òv/¸cDêò¿å¾ý°ªY…‚ûàk´&?:RÆ ÅŒ1äBYÓ^ÝÁ!• 5pgó•ö,þ´o b ‰ú‹“.~`œ»GœPA!eÂLf&ż½«Íâ"ÃŒ0AÐÄÉѼ …ýñÒÅä%ØØCxAÜ<,,/“Á”̺Y ˜„ «ãÒiW^W)Ù“9¡”©†*dk÷Ž÷^Iqi ?ýRæqRÚ ›¬R¹óë4Éׯ©u6/콚ۋE¾¾¶gå|;Kpr†Q› ÌP!êoA¦Ž¶í¤ JÄ›rþ³‡ÙqIB¢T3²h‰^ŸÇÎxµZ'q© Ÿnkdܰ‹[ÉX}îöî4KËn¾cøaÇŒÂê΃‰ÛÚ)îùÍD˜î÷–'ð¶1ïHyS’*…—ž»DÕ鿯»Û‘ëMùÏÆE©Id=Â|x¥÷7i¹< ˜}wTÔšuL£Ê³.]nò¬Ø¶bN_ƒXÛuñû[ó;;ïü[Œ.ìE±I]‹Í ºéÛ곊6fv¸1ÅFª<"?g….’ Üˆi6¦Þ$(§JÎ{+a~X 7v ÊM4bFžF‚Öü{2TˆïM†rbº7Õ_»âáÆJ°±ÈNÄ’=“ åØtÀ´¿öÀÃä%ØØCxÁ’¦”씡÷’,192ö0ù-$&“"âŠÐ…vU¸\:AÖ¼ñEešyhËçÖ–Ÿ_–¶|X4–k'ÄtÙ Øí*1d6Éú«úç*Ìy-Æ×–Ô0Œ$íO[Ò*ië­.yøau)ÜØýµ¥)Ma¬-+æ=Ui~W²’R±è¯ñðÃ$ØØä 5;ãä™d%%ÔŸÜ÷ðy 6ö^ƒ¬ùŸS²Œ½%6Í€}¯é6íW÷&’102Þ ]oÊ£éªÖõ×xøt{]˜BN]¹/Òÿ´ÿ*ÚÈÁ|m[é,¤Q (‚„“FH)u±öÛéÄÊ%ëyÓL^O'“JYO ½7Ý6Fˆ6oþ®7…SesÝèS¯8ÿ{êk¥T6VùèÝÅ#Ý…xqÝïl~ž³XBq„¯í×ÖqžÇ·þ ëLWñx³ºÝ¹ ÝäH³+{µ^ìL“]%vËó]u»ÆŽVG„´A»j> stream xÚíZÛrÛ6}×Wà­R§‚±¸£}jf’4ÉtÒ*~K3Z¢,Nd*%©ºî×wysHH²)ÑLÆmfl‘”ÀåYœ]ì@F®#/GÏÎGg/Œ#Ž:Í59_¥©v‚‡Gä|AÞß­¢tM¦\±ñÏ¿½*Ofá2LÂx–—¿ñ6XO>œ¿>{a±hP‹Ü 4œZiðq…-0o0v|V¸tùM£çç£?G€­Ï ðV¡Èüzôþ# üí5aT:KnŠ–×D£\h<_“w£ßG¬é˜…ŽÚ¦êd‰%-üºø˜\†I2ál¼I.ÂE%´?˜bø>FÊm燗ZA “ÄM…r9Úü{šr„SgIB²lÀk[Ûÿí²6_š…¼m_ëUÇ4­×ÝÚÅ~Ó’¦Ž»Þ@ sÉ)Of›ÈZÁ¦l²É-ÕÖ”tFqVRuÐy?Æk3Çzóflê¶Ìƒ úa×Z­…”T'S J»Ú÷‡L(*,i4\ñbzHÆ?t ATJ.FÚö{FIo°âDhA…Ôø0C wÍñì"Hcx8`4A''ó•–ÇKÛ~O^zƒ=†¦©©òw¾ ¼戨G Øh»/§;3¦±ô(.c̳߱þ``L;E-TÊ þ /2oü3T+wÚðWp¶cŸ¶¼ ÿÔ•:먲OöŽU’6H[%&žÿ%Á<+ÕP°XDY´‰Q×åèQœVúÏ–Éæº×ºª'[{Ü{À O=:œÊÿ¼z¼Xiv’„0áøpR 3V·XãÙïW~úƒí.!u àñ$džŽONG ÌUk‡ÛKñì÷ ˜Þ`Ð++(þÈ:òM"px°N Q¡šUξ O$?|®›ížûWáüc_}Ó-O\·xlªâß“yï§a؉­Ý¡üwÅwåÂY”„ól};Ñj\z bZ5Ù´ð)5~dÍqJ&˜_M°4O[Âë¨ÃÉ0¶xWb¨jâÙïWMúƒí.?ÀÞk«Ý½MœfÝÊÈîF jl0÷”¤¥Z;‡åL_W;+c`OR4È 5 ¿†¢mðÑÃí0{ö{Æ`o°G(0Çèß<üei´¤†‹/!c@**ëwîdÌj{T£s‹à².ûXQ’TC|˜Î“èòîzOÉ|xÿmÓq e‹'½TQqópÌíx0XêÏ‘¥Jzoãy¾—^K¶õº¦=7ùGp›Ö‘~}Îr§=¾[:)ŽÙ*¼GiEiüÝì¸J­ñ¦Ø0Û½½ïF‰ Ïä)o0þ û"aQ endstream endobj 4363 0 obj << /Length 1441 /Filter /FlateDecode >> stream xÚíZÛnÛF}×Wì£\Dë½_Ú§pÒ$(’*~)’@ %Ê&*S.IÅq¾¾³äR&)ÙµeŠ´l“wggöÌìœ#™ KDÐËÑóóÑé m‘ÅV1…ΗH*¬,GÚÂUSt¾@Æï¯’ü*9™0IÆ?¿{UÝLãeœÅé<®^þ¥›huòéüõé CƒŠ;ƒB3l„†åJ[T[˜ Íø´º0aݤÑÙùèÏ…QÑ{'`*—h~=úð‰ <{Ö Ûrä5’”`ÆܯÐûÑo#Ò ÌІµMI±•/y×ìì"βFÆël¶½sçëE<Ëã¢rõ#‘~ié/ÁVºµÜåeÇ{Ž5Hs‰¥(½wïKª0£1lEYŒ– wÛÖö¿»»XU/P¦nt¨}¿UmûõV²BӖ–ٿÁÙÒ`v‰ª›©Ç°,1MŒ™ÆF{“´¨{Ðú0¡„Ò·*ÖÙ6šF`Šp3\Jø»VëºiMäB`NšP,•­\üá!sƒ¯¢t±Š;žŒŸš”cÅôpùÒ¶˜/ÁÎ/\qÌ…‚Å`Q*›§Ý,ÊSútâ(H‚:_ŽÆ…0¬”—¶ý@\‚íƒ ‘0Yõ(d‡Ç¶l»€¸Ãû§AQÖB´!§wçú`¯UÚ`-Ͼ²Û@C-®|g­r ºÑ¤Œ©|ï#!,^-üÈuuªKŸ09¾mN.oÝlÜÚ’Ó”4· ˆ-áÝÓZiÓo.°!²îè?vl¶B4˜Y[Ì<¯ÏýuµZÏ£"öq]Ü•–i3màìžûã:I“¢Ýšï<Þ‰àØ½3¡à0óå߬æNÜBaByÿ¸ßLŸOΦÓAÆo§Uly‘mæÅ&ó;p›W{k# m艈dÝ]\D¾pZõÐ IBÒŠ# |,Év|®n’´ºn7XÊ|¬n,8‘3Ñgî¥ù¾¬”˜JÝ?”ÚbéÜû_^ÁÏìíïóÒ…¹ô‘læó8Ï—›öË7ù¥K&gÕ„S Ì">¡rüå8R)>8‡#•’sl¤¬uì‡5£pg'•’kL '•Eüe‡LZò½‘IÉ@›ÙáÄGÇ~`ž;Ûƒ´H¦05â"“’‚¾åÑüŽý@\‚íƒ •˜Õmd~u¶P³íBz°’ÀC 6Æî+êÃ!#ðPÇÿ;ö! v¶dD`¦<É“¯ñ¬³Ép&+i;ÿJÌVq¢„Õå|• ´ÆDy•pö¥È¢¹'VÑb‘É:V;t¬Á5àÕ2[_פ,ûìžÄY­'$¹Yçyr±ºóF®oŠ;·ÿK†ïL2£êã«ã=³˜Ûƒ7õÈõ¦¸ÙÔÉ™eÑ]×c¯ê\뀸'ŸˆÉÆ´Ai–w §† ‹ ,_Öᬗ;Þ8þ/8Ëêæzæ>¤(뵿Ìá ÊÌšád”4A;XÏíØë¹áÎ.s8°$Ét°Ìq½f¶LvÆD©ïMêpB1ƒR,WÚös%ØÙüŒ?“5'yHê ƒŽ%i¡rˆY‚9cƒa×±†]¸³=°c–cElÏÏÖ]Ew7G×Ó@) Ÿ †GÛ~ ÁÎöÁÃ0`%^®Óü@@v…¬´˜ê#ËÍÁ›F×Aßœ0­0×â[h"&%PVÓœÈÈ=äù^úlYIã#éü&ž'åw*ÞÂùïïÎ>ì?)|Ô`§ɱ?;neIt±ŠûIˆVôDò¾êcnW> stream xÚíšÝsÓ8ÀßóWøíœ›‹ªëëî©Ð…ã€4<&ã&Nã#µ{¶Cé+˶“§nz0Ç ÔŠ#¯vµ+íOë`çÒÁÎóÞ“qïè™ÔŽFZPáŒçHhæH WIœñÌ9wÏaºûʱ{üöÔ6FÁ%A’ô)vãdr¤©ß'ؽìào`µü€9†ÿ$W#ÍÍ0æò¼¡8C{Žd0SFqsŸ(ñŠ´ÒN8óЦuiÛïn@9¸G—XÁÄôî*¿˜¥ºür–ÛŒP•%¦ú”Í&—ŽmŒ ÷‚s÷zU÷RsKZÿNã(ͬËî”äœÆîtá'µž׈€Ò‚¸ÐVÞ¯E žB›¾v­…VV—A}ˆóT0¶ ®»$¯_íAð’P­”ã"±ÒqáG³eS÷·¶¡M<$éá¯&¾cÜuUµEØ1ÁóŒ¥ƪº_Nü4"í¢¯ “¦SÌ–óGkÇ$é²ç4®w&û²ÖÂ;ü’%þ4³YÀZ‘7§ñ¬H &¾ÓÀF)§€T¦Àtj.˜ü¯‘1™›ÝØO³ú\Ÿ$;¶m$A¶J¢ •ÊEøZ²v)…j7ž\ì (E‚²æª„¼Usæ!…y™>oȬ¹G!ªuÙ3­$íB¸¤´¸.—ñÔÏ‚bÊ.n[ÍD…w:b·½!sg+E1j•¬~ÃnO LØþv¿= G£¾‡Ý7#k[š%«)DD17a¶Ø®M´¬ 2àb„Öõå–nsG„ËýÕUB×_«F—¶= Òi^¬?oX0`°ZÆà,{s¾Š¦YG¥åËeé}³ªnò¥u›n®š-C}ÊÝÏ}ÂÝ èÎí5[;–˜F¿ô‰r‹-âSA7*f­ i&H<.œÈa± Ó²E<3êÏüÌ¿¤q%! Éá Kˆw¸\Ùß-YvW¶=¤q©‘G  £ˆF0Åx T™ È ÁUTïÃUÌ+×ø£s°a(v¸`©Ëï,•Ý­¸º–LV­Ý»>¥ÞáÜR—ßÑ-•ÝÇ-\"Nèn¿8ÂCœÛS”l¹žŠ~w.˜†Q[B84sFo01SÜ}=¿xs281DrÜ'„¸ã¾fÐÌ¿=>û Ón|ñwP>4Oâ+ÛÊ“«i›êLûÆ4XÎ ÝK" Ýoteû…Mü¦GË[Û‚Óq懑íí·ÑÕäûR%˜~ƒ°pèМ7`n ì¦Ì³§ðoòêäénòv4<îs˜Œ†ïLº:žìGžÿoÒf?i7 ؆Úõý a,Aªôþ&Ä«ìzU€i±óbæË`÷ÁìuJ=Ρ­b½¼yµr@ë‚ÊÓÕt ‡ÔùjÙ‰´¯ýÄ0z¿J(Ó)"ÙLÁªåê` º!¿[‚î®l{ÈfJЋΠþO7ê–ú‡ãk&Rúpó†üŽqÒYÙ=@ŽI8«‚ºžþ9lÔšA¥Ö“µ"ø|qoo jÞÒÌY5ñ}ÕUÕ}\cRªÚ3÷Þ‹ì!*ÑŒCêâR‰fà=efôge*zZ¼¦ô“«8)ÑëdXpJ )îná‹ß¶LŒéèÊúòu|½ZÑÙO—áFeì³¹ã'¡± ~Âé7ËÀv£hXL æ¥hm±*{V=Vµ8¾.½3/Q4ˆ £ËohL òð…ë*‹V㧉ÒQ^ˆ½1Ǹ-¬ó÷SÐ~D^M‚,»…‹ažû +ì'ÈS|yO1Güp•¾ºønÉ­³ªíy•b•Ÿ:ójÕÿ lõÔ†­DC2—ä`ÁÒß-Zº+» -ó³Ô÷„­D1$ÈáÞø4äwôVge÷ñ–ù‰æ¿û}Q8ǬG R"RªÍ·E"ÚšµºX4 ¿¾«]Ãf_•¯W b~¹^ú‘ŸÅI‘ÿ3{·"‹7±Õ¾3¾†GL-õ'Ž~?8Zš¹Ò›"`? e?Iñ°à¹¾í'©ìØ»Ï/RÿEhÑ  endstream endobj 4301 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1648 /Filter /FlateDecode >> stream xÚÝY]o[7 }÷¯Ðãö`]}‘’† @šµØdN l ú¦Þ´³Ûº¿CÚ·K×{W¹MSt€aÐÌ‘(Q©¤‹q&…’ŒO*ñ…E`¢!›USL ª©&²h*FxÑT|‘j‚!ç'¢¡¤šd¨*† GհᢚlrPM19«¦šâ¡‰Î™ÂjË›êTSŒw‘0u®Æ§+rÆÇå¯ë/*Eã98‘°§,“D'›‚‘½3ÁÅ*’‡„ÝB &ø(#|„”a#údBÐY²–cs‰˜°03ÝO?ÿb¦ÞÛGÌ+Wqñêå˧£hbËÈ%9y[;màH¶båàbKl‡l N½ ìÙV¤6°ÃšÇM` ÎJ2hûd%_4‚³Å¹7‚Û@3§JVò{YÍR«Ÿ‘-ÕÜ f›J£ëü-…Ö™]²ÈoƒO—‹Þ–Sa­ºtZ„…zw²råNÆ]6…JB~îelµì~ÀJw¶Z^ŸÏqoMwv|jº‹ùëy³€m*8»úm>鎰˜ùb³&Q3rã×ËW«ëùzË8ªûaþüæêáòµÑ$ArnHj7°TÜþ³«&æÙá5Ϭa_©Y–¥Ì¬‚óNˆ½zTø×R?8ky‰¯(ÉÒfXg[ácfgÙñ¥­›ÅÍævʺ›ôɈa¡‰>rÂBʾéónœ’¨Ø .ë.E£ût #Ë »‹s¤Üa+…MÂiÕT?WP‘Y)0{¯.Ö—ÏàT,VÊ™Þ+(‘Xë‡P­ÔÉ·¨óáZRí[è÷Qí xŒj‡Á#T;£ÚAðÕ‰¼õÎÀņV0âÇ5zÅ©õ©uf°–/Î@yh5n56øÐ·‚§¹›@´¾ub„Q¢Fg q²©¦/ƒhcz—hcøX¢•âoK¢¡ôÂŽz¥ Ü þÓðk´,mjϯ Š÷˜3{JKîºEi­¿WJëY$;[呤g‘"ççïo!¾â¾Ãn 6£ëE¥e¼Þà 25Sý¾^>Ÿß½{¼GÒ—G”{¼”E¾ìãM1îÑB¾…~/¯ #Ãy¹\-'n£–…60Ú±Z7ˆj"7NL8v¥œôèÁYk˜6°(¹uf´ÈiäÀ1aÜ F.q¾LÖ5 Ò¿õ±qbð5´‚u¡´‚Ê£ÆÐðÈ_•¾>–ã»ôÊþ£é•hÇ¡Ôó,åÿg³ú†M‘I}¸Å¦hýgXH@¥ë?å…¶F{“‡}š Þã½q<ÚñïƒàÑ&ˆ÷xo6ACØÑ&h<Ö G› !ðh4–x Î}n<7ƒGžÁcσà¡çÆ10nòJý2rz)ïæôŸÓûN‰úN‰ûN©ô”¥¤,ý#e¹ÓGJËÁè ¹T[ä+ÅYÜD”nÎæ”÷«Õ§¿^­ï0'”—wËÝÚˆ¶Ñøakûc¾^ã`ïž ˜³ ·Y݇tÝÚ*ÊYþS’Q`¢„Ò¬D¨ëCfÌóGñ™~w|4=™Í¦g³“Ã'¦³“Ÿ<žstxvþ 8½&¬°¼q•ÔÏœC««þÅY{æ endstream endobj 4419 0 obj << /Length 1432 /Filter /FlateDecode >> stream xÚíZÛRãF}÷WÌ£Š‡¹_’§lv“ÚáÝr [Ud‰È6,ùú´nF6X‹ÍVA$ŽzæôtŸ‰ +DÐÛÞ›óÞщ¶Èb«˜Bç3$V–#m¡ÕOÑEÿì:X\ƒ!“¤ÿÓÇÓü`äÏüÄ&~~ú»­¼pðùüÝщ!È â) Ð ¡áq5nЦ”7LØô¦Þñy﯅^Ñ#àV.ÑdÞ»øLÐ~{‡Ö »¬çIJ0ã ŽCtÖû£Gª3´bG‰))¶"·e‘kügré'É€‘~œŒo’ Zæ¦}"’À?Íì#ØÊ;mÞ6¬åX4טÀ#ÁÚôº¤ 3*ÃÖX”øhV1¯Ž¶ùêã0…)cår`šövÅ/¦¦Ž_Ní.O¨b)l™=€±`r…òƒQÁ)p—q*ªœ2‹Eá«){_[aÐÅFHþ5õÕ›¡«%Ð3õ„â‡Çhåò¨ÝÈ…Àœ24¤Xêܲï¶!HÌ zèwíEÓÐoØÑÿ~W/¤SðøÎœ¤Žïè$ÎÆîà$\qÌ…‚‡,dá&'§¿×§üÕft)û<_2+=g×{³EfÐvÆVß‘-gcÛ°E4zVM@coÑç·‚[®é&/i8ÿqgn(péÏíÖl« ZÉ|°‹ ”&Û³ŸO‹të%ó8ñ§ùÉ/Ç£üòo< ¢«ü,žåíûÑ›áñh4¤ÿ¡è¸Œóö!,ôqm^ŽN(©R@ÐÁЭlÆ#ȨUã¹À†È2±ÿÐÀ¬Óœ-{.*r¢Ï‡¸(Ú0Œ'Þ²ìå}†LK®i…ëô÷"ŒQ°¬gìÚŸïPpœ^B€à¦¶¦#¦@“V;Ø”=óY<âøÆò£øjvp—K ô‹¥ ‹ ƒ«.ß0[(L(oOÔ~”åʦ‘VW†²Ì€•YùËU-69d©ÛÛX"fVýz ãïóÓ`6`²_,ŠÅj2ñ‹Ù*ÄÅã«ê0õ!̬…™åÛõaâ{Ó½ä¡T œ§;u(AØ J;K% |·TânìîêP‚#*X‹®ò0c¾©•³:ÜEn˜ªÚpÓ‡R@%»+"øŽnâll Å!!è2š¾}(ÓÊÆv§æøŽl9Û†-ΰ6ôi}ˆ”ÀRÚ}ª°C(H >#«ê»;)‰ÁJŠ2'z…b©¨6äõYÏ« ±PbQqÇM|³ A’ågWAšWoTöKýr›^ñ’À»ü¦._±ºLsØkQ—ñjy³Z>vŸBËëü(òÓïÂûüÕ|ù*HÃù^Š” 1Ãt'IÁ›!8ÙβWß-{¹»»$}ðú’¸?üŽå kR®$ÖÝm‚Õá½ÄÕÔ‡+‹ 3ÞÛ™—ÚtW(4ðiq6¶ /Ò`RzþäÚKž+¶.#°PËZ©°iEïNä ú«øŽ”9Û†2¡1-Š…Eð·?n¼çái&´ûžŒ²¤–C¥À¡Ð5üE*ÎRÔ¢R8þ²L¼É²Tþ’,ü$×õI&$JÑΛe“ºë›â_+þîôóòƒ-±öð&e½Žd႞…@íT-xIâÝ·+"oî×_’T¼:ˆZûô(vËHÐ$YB€‘ík»4XÕí~<JöŸ)|8Ä ^óǯ¡î™Çéá­?žì¶/¨áXV+ˆC—@T3¬º“¶ux·„ìlêîõÕyˆ-ùy¼æ¿Q óßúpƒ*Š•éîýMßÑWœm!Þ¨pÍþ‹ŸPPüʲ—g4U‚‚•1b-·Zóð9 ¿ü> ’ÃÒM@?œîоmË~}*mûöç«SkðMß Xhùk”¶Ÿþ9‰1 endstream endobj 4453 0 obj << /Length 1020 /Filter /FlateDecode >> stream xÚíZ]oÚH}çWÌ#TËÍ;íS+5Ý6Zu—ð–­…¡A¢µ¡»ûïwƉqÃÖÄ(*0c{æÌ½¾gŽd}aÈÞuÞ ;gçÆ1N ͆3F´“̸ÐΆSvÕ½¼ž§×ó^_v_ÿþ>ï üÌ'~5ñùáoãÕf¼è}~8;·ÈlÔ2*#À*–˰¸a‚±Ý³¼ÊÅI·ÃÎ_F!ãwA„©’ØdÙ¹ú„l®}`ÊYöw6rɈ#©CÁ.;t°š˜å•8JLâàTKšå5úš|öIÒؽIF‰_ÞÄî7?š$~¼Xæaþ‰„á˳XÅub󮹃ŠI@*‹<ž'®ApÅ8ëXâÙ¬ê6Úýg¿_@( «Ër`G·Å/nÓ6~y››¬PÅÒà„;@°`ò…åAQßPǬ¾ªZ_aÀš¢ÀóÕ:/ØNvÕç(·¹PðàŽU0EőŅïQË=³5Q*’ Öç@Úå!¾ØA -« ¼¯¦ _‹¤ûKSBr Z˜ãñe¿%_ZÛ€/RKJ‡Å¢œªJ7§+þcâè@‚’/õºD­xÕ¸6:»…XÔÚ²®­ÃMžì J§î·øSÈød1÷aÓdýRþ(r…_Lóƒù*o/oúoƒžÂîÇlݳsŽÕ›,̇²Îå ÒÕ0¥‹T>+^Ö0·2² œ+G¦•'TžõÇiÑ.7“ñÚ|þ7CæeUy¥ªñz!óÕ|½-üwþÿ|ûJB<Óç!`Q«Ê•ZÞJr¹Þ·ȶÄjš±3•¨úTJ[LX—[o’Uz_ 8™ýó-³¸/}>£-g=AÝY~n&Ÿ¦³ÍŠå«^ –G‘f}ÉÃâ™XÏ—þA^€ …½gçH+0ÒMÛkøí´½}°Í½i (ÌÁ¼@Fº°ÏÍ Plíñزß’,mCÝÃ@mŸÐ!ÇÃp·Â÷#PßNPfNÔ=™€§0'ðX&`“úɃL€â–øñL€Â°kœ8š¬×ðÛézû`››…¸=˜Èðì=€tœ”GcK ¿[Ú»‡ ΀ü m€tá¢Ra¤Á`e3PhßÉœ|ÀÏîüt¼?Ȉ°óÕñ|€Px÷æáàÊ^Ão§ìíƒm ¥<”È)ðì€"‹G|TÃoI—ÖÁîa„4 ËIObD$tæ1Œ€w‘½ÛT,kÏÿ³.½¡ïÇÍ©àémÁémÁ³7·à÷ý)A…ý—?À÷ýOÂL1[ endstream endobj 4479 0 obj << /Length 1693 /Filter /FlateDecode >> stream xÚíZßSÛ8~Ï_áÇä¦ú-ë…B/й‡^‡qƒB2MìÔvJé_+K&¶ Á¤½N;C°,K«]í§ÝO²qpààeçÅygï@é@#-© ÎGHj( WE‚óËà]÷l<ÉÆ“^Ÿ Ü}þæÐfdR»}Å‹hÚ{þjï ÄA%³¹¢(ä †+d‘Av÷Ü…rm;uöÏ;Ÿ:Zá€,•€®LÃYçÝ{\³WF\‡ÁuÑr‚eÊÓà¬ówW IER¦ Hs§KVØuñ1ý`Ò´Gq7I/R3Klñ³¹0¹éÑý’;MÿÅÃêb¤…Ê^^6”gHa(&a j•·õ‚HD (Ò¡RŒ*ÚÖ¥­¯]€ ÅÊœ`b[·•ïgª.¿œéMF¨Ê‚Y ú ”-¦W+ ¼‹Á•…‹yÕÅT#ZbwçÎawÊ Þõ ¦×áà¡à`ð¥.zð:XDø«BËUSëÈ8GŒÐ OÚiøÛ]"baPi8ŽâË©ihÒ}¶)‰@˜ŠÝÁ¥.¿%\Z+»\˜dˆq ƒ……S*±î"Êbò0n$€ „KÓ/6Tü±±o(Â0Y-bEãzg`‡ÒØ#j`ƒ„¸ÏöŸäΘ¢X‰¡Ýô˺"úzLÍôÒÝLbw=¼èï=Ž»§T››½‚«nÀAŸT®×%È!~Wõg…X”iä÷†Èš©!¢Z—-³Jòò‹r”ùëtš £Üx>Ü’IénRq·}îƒÄ$žäõ„°ôüýæö9C¶¦¨4tJVAÔ°›K„ ÛÞî[‘O`m)kS‹µªhÕeÌ«<0ù"³u~ˆµ½½¥ÄBﳿáïâôÈ£rÔ£¢;r7Ùb84Y6ZL‘¾J¬{¸€I”…,ŽfæQ$Ahˆ’ŠïŽ$¥aòwõòÛEýöÊnNDH‘Äì©H‚ƒÀO„„T(äîàR—ß.­•Ý‚$Eäü;’!Á×2ü$Ap…('w©º™IÝmêî}„Ò’ ÀMÁàÚ`P'‹uq6qûGÛ4÷×ÌKL|Å,J?öð/óôÍùáéI‰îóãú(ùØËz~v‚ˆ+ÎÓÄj45Ïl|&ÝëqÔè2‰Ó¨¬É“ÒÈ|)|d™ Ý£nb¬Ñýüfî EÑ ®oOŽNN­~ÿœøœûl;‹œ%eJËžc_($fy:‰¯|ói±ÜcO|v3³y~Ó“¢‹V’ñ]äêçdWjgìê¨Æ®J×;Ä…ÊúðŽ]Ë–Fæ”EE8ycâ â° »cLœbˆtg)°!¿] l¯ì按SØ9†­ S}^!JZþhD‰cÛÝá[C~K”´Vv ¢Ä C˜úåpx¼_Ÿb *mì0ˆY•–£ñc½ÅtˆÔr›õäÞjÈoç­öÊnã-L–ßóì‹iT(¾­eJAîðh:‹ŠÝ{åäëÏýçWñ0¹¼å`ÉhÍ‘V=ï;Љ~1±‡˜˜[ ‹!`0%7¶8,[ºY_µ8™ 9* Úu:ÉÁ¡h þ‘j÷'s÷)«€ò§¤†–0{¨–>ŠR!×rwìåLí,“4ä·Ë$í•ÝœR®PHE{z;'ÓL(ýÿh‘2†„ w”ºü–@i­ì”ÔD¡”OL96ö ¥H½;¿Ôå·ôKke·ñ‹}E}¢Ž£ô!â~çJ •¨Q÷µ«zsŸHÌ’ìÎguù-}ÖZÙm|F8ÒܧÿlòÕ\4¾T`Žñ>*:§MLµ ÷‡@ªè· ÷Dc$¸¨2—õ§qót'óhÚ<œûõöú×Ûë‹×1íe<[%ÚTðí÷2ó8SOÍÝn@³nl,þžÞ¸êªõpûÕ¤¾tœMâå“Û7ðl˜Äyþv÷¼¾àÞ‚õúœ“îëèÆõù`î™Wèsòöø¸ÉÐl½àR÷$.Õž'óÅ”s³E0«L.‡uÁ—ëb9­4 à¬ú+Œ3 1…ðå®P‡0L†à¹Æ£·òkN˜ñíA¼tje‹C\åãÛ£…5“¢4˜ÃVç¤1@ kZ6K|èJù|‘?óÅ·:ÃébyšQbå¶ÂÂÀö° ËÜ¿°ÖÀ"TÚé`Ãí= ¡*؃ÆÚ·õô>×·Ç\sDHøÝß _÷Ù+‡äˆùc¾zýýâØ endstream endobj 4410 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1622 /Filter /FlateDecode >> stream xÚÕY]o[7 }÷¯ÐãöP]‰Ej ôÙtCÐtÀ¶ ý0¶ E<8)Ðýû2¾uÚ¦­‚µ6 MŸKQ”HéÖ¢5¤P‹rÈ¥™ÐIÐS(¹›CiÕ 5¹¿³kðÑ]ëkZ`í Zq†&ŽéAOÖ”‚´fBš³ ”]SBO®©¡W×pèÝ5-äTÚ’@R×iÈ™ÜmüšÅtº‚! å땎BnC*!‹yZs YÕq(‘K-PfÁøJ„9@ÊJ5¿‰ ©YÁ4¨×UHâ:Xa@ Á 7V5Ÿ!)$Ÿ"Y€SÆcˆO²` ñYŒ¡ÅuC}–#urÆè>#@JÊ®HÍuŠK®ëØÆ¨¾Š¦ËÀQ5S(El¾øZ˜»IÐ5ÇaªE‹y0a-V•¢É&‚iš$¾l LŸÉ¬Ø¦hn™÷Ï&-îã uÿO(»©ÛðXwÿ ÜÕu8›G+Äu5p&ÇaÓeßHø`ò8#ìL6xm É6gm=pñ5‡kl;ãflØâ:à¸ù<€Ÿ§¾ÒvK>7¡Ð®FCz´’lõœf!†Ä¡±¯œlâ±ÂæjjÁ©ø¡i¯Ca¥³§°ÒÕ<À‡$rC²ì«˜¾äì:Ô\§H ßÅj©Ä¦C–ÊÕ>Åö‘Riqp°˜žüûÏ2L÷ÎÏW—‹éøõ³Kÿþèìüåbº¿Z¿X®OÒ>N?M?ON²YL—Ï/à R r[("lØ·Ñ÷µˆ0v/„é8L?®ž¬Âô0|wñ÷þ]~îÞ]àïËùÂ3VwvISæÛ8ò0œ =æ‡é÷?þ wrŽ„dSј°ç¯_½:ý(š[Ī©9vl½1p—È£Ap–âc`ÒØÛ eî‘σ`•h}ÐrŠVÇÀÒ£•¾1pÓXç‡&WÍ)bO‚{Ìi¬s\¾"³N(G‘Á RnQ‡-ç˃>£ìD̓–s—¨üÞÆ8\_z¶‚ €WøC‡(‘”fÙíF±à“ÁÌÜ…Ö6˨{ºù‚Q¦£õêùñ…#LGÃôdùæ2œ¾[‹Žžþµ\LàÌòüòÂÚ¢c%çbõzý|yqÕ*]÷ËòÅÙÓû«7Á«w”#LQ´£ú=]ú mð^è.0¾ssË©ÇF(³Pgg¡¹púeË&úQìYÞ–ÍÖzTÊ»¯ßhp‘Ð÷gG*™÷àu\¶~”„š´Ë~–žFá4yµÀfŠÅh^Ï1}²½\?[®×«õWè­(FãßöVèu÷AÁÚ$”Û9& ø±§~Û XI²Àµ>{80|´Ï¿ƒþ\Ÿ¿Œ>_eØ2zfÓA0aŽz‘Ñ2yŒÃI¤a,Eõ˜±‹Ë ˜+þZ®%Êèúᤠ3hÙzwõ§âØojô7‚ÁyºŽZFu¶CÀ¥=µÁhà”k—Ø»Œ‚o F# #©¾VÀåCVÀù³‚:³‚:³‚:³‚:³‚:³‚ÚfAfA¿ Oh)¶¶=^áô‘È»o ÅQʶ4α•¾ŸÆÈ)ñn#ãÀˆ"»Ë¨  Øu Ø‚ÝE:ÛE Ø‚tÚOT –ÈŽžo)–H%ï>*碄,š£R Zv݉RœAiË¡Ð~íXæ?ú5%päÓdî£$Šé—%ï ?K¢n4‡ZFÁ8Œ–Q0­J³"`Ã`D9õ6 ŸÕQpCœIÆÀ•(Ò0t˜j÷˜G—»‚°gÃR³;©A,þÛûApGBŽ‚«z–|„Dn¸¦Û]S £}HHú†ZpÚ2S™)ŠÌEfŠ"3E‘¯sqÑ®jü–€GïƒpŠœuËGP^‘m{â#9E5ó4ÀBm÷·(…q ´&3S€VN}¯ì°©×Ú.–‰µí¡íV‰™ë¶íÚéŒu·ûçh¯»2ilö²¬^QõPÀ#—}ùõ·G~xpïèø z‘%2ê]·ûp{?Õ™´É¸^²åV×8r›k¹ù§ÔQ0h0•A,¡'É a/Þ\FÁ8¸É0¸àTGƒ`ð –-ׂÿÃX¬ÚGÁ5öë‹ý°¢¤³ endstream endobj 4511 0 obj << /Length 1258 /Filter /FlateDecode >> stream xÚíZÛnÛF}×Wì#UDë½_Ú§¶¨ÓčӨ úà#S‰RI*ûõÞlr#Û¢(ÚMaÀWäîÙ™=³;g(tz=øe<8:ÖYlSh‚ÅUñ!Œœq'UŒKéáÆRSRçŽ €-áî‘i¸n/ØY©̆k3k«žIMƒ”àyÛOÊëb±šúiPzòé&G¦Í´*ù‚»=ŒÂ´™Üï˜~Øß‘à8»3¢`0+Ïú‘àø-&”·÷û–‚˜UÅgÚ’ØG¼‘UzʼQîp9”˜I±³/¦êùO¯Fi/Ã莩$Ãèºh ÓyÑZÃÍi¸E鸵*Côìø×¢A­Ek¶Š—®›V׌É8“’59; ÒM%ÛݤR·§¬BÌ:ÿý üMÞ”D̆Lz³ÒõÍt$Él³ÀåôuÁšY+àq šæ!ÅšN¦åµ×ª„‰C©7­*9ÇFÊÞÒœƒß-Íu7vw­*¹ÆT°hÕŠWªªïMªJŸí¯®qð;ÆJgc[H"ɆÒù™¤ª¤P4óþJ¿#/mà …\Èš%D¶'éÍ:ØœíÝÛ°Cà¡î¯pð;²ÓÙØ6ì™zîBbÛáì]\¶©$„ÕùB=A%!´ÆD¹•„£Ç¶V Ÿ·KÕu0 óþe÷/™ò›à¥ xŽ‚¢ÉR7o+¬==ÞVt4NCÇe 1-ö :‡+ª‡Y#œCñªª£Êî^>ß$X¢›†¦?O>œžœ¾réýuú˜¯3á°{{08~2‹ÛÃÏ0ZoÊýêDZ³CQõp½ U3ñ¬—âÀ_,÷*˜8ƒ}jMl ȯ¶·tîàwKçÝݽ`â µ$Ó‡)˜Šøî_îsB1ƒmÐ[°4ñ;Kgc[h?ÚOÞ꘧®˜˜%˜3Ö/~7^ºÛ‚f9VÄ>·&ß¶ÿ[½ÜgFcÎùSHr(a° Ô‘äU {‘ã/rüðr\ºûdËw‡W¨ùl¾ÃÖþW5é-ø¶ß³8ˆØçç,ÿ1ÿf endstream endobj 4537 0 obj << /Length 1294 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯à£=Ì ïÜžV íÚbèæä- Õ¡cŽ’IrÛüû‘º$’âÔRhÅÈ e™úx¿sù$‹ Ïˆ ·£W'££7Ê ƒ¤,‘X†”q£trŽNÇÇ«ôb5™RAÆ¿ýù®8˜Ù¥Ml¼°ÅÇ?¢x­'g'ïÞh‚´”ÌrE±æÊ-—cî¥ÇGÅ@¹ñ^ŸŒþ›EÜá.e-.G§g»ïÞ#‚¹Ñèk>ó ˜2éŽ×èxô׈ÔÓP³£Â€ /lIs¿æÿ$Ÿl’L(_%óÔfs{eQaÞßD÷¹áñýð¶e1Êp¤˜ÀZro±?/@b Ql´A‰EËš‰M´ígï/@96DT Ààg‡â—ÛÓį¶·Ë u,‰ 5{06L>£â`VòêøËyåu^©Æ`hAì*Î ÂÄA§S ”f 4ø¯¸éRºÙ>Ê/î#VyÒ¸qŽP4,¤)Ìûé!™Fµ‰Q|¾¶-KÆ?w F`.Ôåp±ÒÄŒ•`c;Ä “ 3·ˆåLeõê6Òv‚*VÍ ñÞ©áxiâòll^ˆ«—J¼,®â4ëÆÈâ"j±! ××|Ö©ŽIWÎÛ–ü>ïá׎ôJ㺩kQ= 5>Ø¥¥2XAÙÍŽmV´â"8óÃÌN@Œ¿•_øêe§Þ¿¼¥•çµëóâÃ*.ƳWÓ׳ل“ñÇY‰tUŒéµ]¬ò‹Êk¾L¨GëÅM;z¤N1ASß ¸jW6צëž1޵k¥Zø¥…ÙØ©1ÕÌ´¦QJðü8JËq½¾ZDYeõ§›ªp€ZDånEa¯²¦¸‹‰ïû;å û3S0XYY¯-¿¹ÄX¿o!÷àm…õHEÕé¼Çílj¹K f¦³·ºš¹Š¯7e0GI݇_WÙŎп _›µ½0ª¶Ú”),µnÒ6³Ù&‰ÓmÑ*0ÕŸµ 1·éø÷wîoþñC™„KŸQËÒÞÍbaÓt¹Yãrùº¦õAÆ…tVæ v¨ÚÚŽôW¶‚k·”NÙ ·óü®lî½+¶ðúb¸±Ý•­à+-÷£l3û-@Ùöì±aºVP‰…«ƒEJ?0R‚í¡Ÿ„+«šªéZ‹¸ÈJ¨©}HµÔûµ½o%·e~/Y+€baà)d-7³JAt•µÕ¹iû"mŸFÚVõ"m-m­/%k™\ܹoUËÁä®jî½)¶ðúb¸±ÝU-sĔًª-èöÏksýÑáb¥‰+ÁÆöPŒSÌéd-ó¿,(6-Mü@Z‚íC‹¯Í¬l·e/e˨kuš?…²eÄ Å–®õ5*µÉßÓmr'_«¦ö’mÊ£}‰XùCŠXõ£ŠØÛä¹/b5íïí.ûÝXß¡^]aó,ÕëŽ× Ò8º´R¯®ÒcÉÙpò$u÷ |°Þ×Âë}áÆv—¯ 6j?¯ü?{ù °¢Ã½šÒÂŒ•`c{è$"o‡Ñ¯à?ýÒÂä%ØØ>¼¸d!‚7xñ¹8Ïn®m7r¶OïÃŽï´d¸—AZøìÛ‡Æ01âÀwÛŠóøô¬ÏýP‰5˜§¸¿âm­;Œëd/V×ÑúÉï&þ¯Ä·½­Ê¡„?æeÕÿÔ§¬Ø endstream endobj 4568 0 obj << /Length 1326 /Filter /FlateDecode >> stream xÚíZ]s›F}ׯØG©­÷{Ùö©™qÜÄS»U”Ƀ“Ѽ²™"äŠëüú^`±É6Vœ6™±‡–»çî=÷îaAˆ £ÁËéàà•6È`£˜BÓ9’ +Ñ6pÔMÏÑÙðíe˜^†£1“døë¯ËÆÄÎmbãÀ–§¿ûñÊF§o^yy`PñÜ Ð {BÃp…-ê)x@{ÃòÀ„ÉN(ô"ˆÞ€G¹DÁbpö‘ s¸÷,Œ‡®‹ž $)ÁŒ+hGèíàÏqŽ‘ºƒ”ˆ¨{()6¢õWòÉ&É2qðëó!&”Wè.°VÆ[SçafLÕóÖd1;~êŽQ´ üÌž—§Ÿn {¥ÛÉ*“£:+î§ÅÄÏ*[ˆ$ðO `,ÜBÕôw,攡1¨L–ðbagÙÍ•Ýà²$01r{— sîå¼<^%a„W¡½(/¤Öõ()5»…áî¯R Qtãúüöþf'ÓÙ»“ã“Ó—Ã÷'ùj0¢ékš²ÁOf°`;øÆW«ÌÅ3I|‡ö:Ì.^C6§ùèmÔF׌¹ÆšU U9ÈÄf«$N7ÀæS©·‡]Y¬ÏíéqyÎGL]ÔÒUØ4¯"솧µ| Ž…T€šbO»®ótÄ€É,ÍÂ…-s¼É[ldŽ6?µÒžc áT0‚¸!íóë’*̨@ ˜‡Ä¢y=ÏÖ6_]€³<õýÒ.Í;÷5_V–¦ùªBu nJL¨Ui!Ui)*¢ÙP‡yf^Åñ¬A¬u;P¢(ad­H¹À7KÔØè™óÀÝX·V­2¹¨j–Ê”Ð~ºÏ„ÄÜCµŽ—~|µ‘ _te!ƒõ˜¿7–4í÷¤Io°xÂÇ\(LbVM²+ä~ÓÇ £€õµv§¸PŠ cû‹KÓ~ϸô»M\hž,eX‚K¿5à 5óèÞD€Öúfíhååü—®#&œ÷©ç›TÝ&Ù*=)Ô‹ôá?YâY¥<’Ï#*‡Ö)2·:Akž,eëxòr|8™ŒžNÁØÞ.5íÅZ`ì 1ÒšävÆŸ@H†q˜í("aMί4„ÕdóqC6gË*x.ŠAÚ8»ÓUeë!ÌFn*Âx9¬jün¹ sy³µ±Í•Ôu¥a[qúb“å8³É"Œï..WÙÂrwV”bT™f´þŠrVra{U)àH•·?U)ÃŒ˜½-L-ûý¦þ`» K!$¼³ë§–Eü[âR©ÞâRwÔ–ú)¤¥¢3¹?¢4Ì÷äI_¨[è‹¥äÞ3éJÁ`žÌþô~Ë~ϰô»M\â;%,ã4ë‘u * ¦Úìö6×K‚ ª1'ìkHPn ¯vN³eb aìägÅ`)‡?Ôçó«ÏogÓöÉUjš%a|ÑÖ™6¶‰…_*Wï8ú9Ws~´²-a~Çï.,þDê*µÁN•)†×û¨LR,´··®e¿ß ×lwÊ Ù´’ýjûÿüÎ'Kº¿™–ýž<é v %Äò/D=“BeÌ@ˆ÷–†ùžQé u› ðü³{mXAúr6k‰EáaAÍ./z›Rz+åɘcôk(OF$®ªØƒ{Ÿ‹0H–à×2>O7ì Õ6D(ÒNŠT}wŠT¶ÒcýÓºR^gwo{Ö·B!“mÎÚ‹Š¶÷oˆÞKèG¿»ƒwߪ½5¾é§1 »ü2æ_“¶"Y endstream endobj 4591 0 obj << /Length 1522 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_ÁÎP3|§¸}Z·¶k‹¢`ÒÂPl9æÈ$7Ë~ýŽéHrœÈRծ؂RdêáŸ;Þs’ ºB½==>×lSè|‰¤ÂÊp¤ 5Eç t1>[ÅÙ*>™0IÆ?¾{YžL£e”FÉ<*ÿ}&Ûp}òáüÕéó€ ·€B3 ÓX4ÐpƒƧå co=;ý9¢0Š zgÜÊ%š_.>´€Ï^!‚… ÐM1òIJ0ã Î×èlôëˆT hÅ))6¢´%+üšý‘^FizÂÈx“βmÍgY”—æ½'’À-l$ØH‹o/s¬‰@šK,Ea±½.©ÂŒ İ J#´¬˜XG»ÿêþL`(?A Líè¾ønyêø~yÛÌPÅRØ0óŒ-Ó+TžL¯À_Á«¨òÊ4´#6Nò’°ƒ8èbB #¤5þ«0\)mÃÁ}°èó¤v#sÊЄb©LiÞw‡ $æª \…Éb5,?iŒ”cÅôp±RÇï+½m+\qÌ…‚É`R*«»Û,ÌúxÐØ ð±Ò™°RÁp¼Ôñ{òÒÛØcx!nV%/[ÈbÎfy;Rмm2bwîZ²¢ŒŠgúlÝãÁâªt€µ \ø¥*h¾r¥´t¥8}O‹Ö‹òŸ8i |íQÊ1®ù~úœ’ê7`Cxs_"Y5 ékõ÷ Ìš/fÆø‘YE!8ðâ<ÌÜq½ÞÌÞHXvöËKø½}í\Xž09^úäœÏ£,[nרM_™6îl`NAV™ùffS»H“ãU¦MÀÞ4˜Ê”œã@ÊÁ*T¿_…êol{•)!©`½U&ð¿Œ÷”ÝDߚƔ Z43\?ÒÀï)½=BËH¦0 ÄWÒ˜’B›Ë‡Óþ üž¼ô6ö^¨ÄÌ’V)lù°Ùšß~ìž'>ÔÃiþ~O>z{ D`¦œ`%‘µdd¾ Ù! ¦Pá;í‚–ß$¼ŽútÂèb¥¾@!´ÆD¹â·4Î}G0}:y6Z‘õvZWd;½QeÙÇh=†“ªç¿¿{†Ý©ï2ª7ÞÄëµµîJžn“ŠÖLŠü‹¬\ü+Îòìÿåk4(DZ1Zêù½EuGl+!±:'·.n>Yɦqxé™*buy'WÎ ;wq¶YîªwÒ‡é äH%O|wâ.»º\Þi[šªÁZuëø q竪ÃÅÜ5§oî6„|ópwuŸCtWúÆá»«ë…èÔJqyh‚áZ)ȨÄf°ÂßÀïWøûÛ¾•â Ã$Ó][)Kx£{¢ò›{DÏ Å b|°è¨ã÷ŒŽÞÆ! 9ÈBéÎW“… ”:2Ë Áœ±Á˜mà÷c¶¿±G0Ë ÇŠ¸Îâ¿£¶øãŠ]g>´Á`Áp|Ôñ{òÑÛØcøV®ôïg‹Zç¤YeäfÛ|‰:¾ êÃ1-Ó PÅ—h©˜” .Ü£½Ÿ6× À"ß/d«ºÒ\„yXžm³ }ó³€Ö‰Ó²u*Ô …~ænÁA:A–íä [ž†54Àj§ó/­Bß–i÷Ì}›åum»ˆö»—ú‹¢9 ˆZ¼&šPXo#¥kÆØ²SÕ­¿á1…”Ñêx\ô6ÅÂyîé Ó4¼=]^ÐÛ|ÄF±Ò !¿Û0÷_ÿHÚ7@»Ê©0¼g\/;jžír'8˜;íÝJ"›`7ëÛ{£ï°WwØý;ÄÃ+·úZÌý{ÞkíÀïû^–€ý—ˆ._ËúIÐõ endstream endobj 4501 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1599 /Filter /FlateDecode >> stream xÚÝXËn\7 ÝÏWhÙ.¢‘H‘’#@p[ ‚&‹¶Fy Z#ÁL1v€ôï{HÏ;Ím¢ÉÃ0l^úH¤(ЇR)B ¥tÆ/û[BëöWBfWhÈÕ55¹¦R×ôÀÙ4µh$§ ‰¿‚*þ%‰CKÙ„:70sª.ajÊbãÖÄ%¹øÌœKQ“0¢t×a„°Â@®šëZÈJŽë*V#”à´ÏL’º6Zrl4ql´î:ØèÅu°Ñ›Àaʼn]‡%§j¸Ôe2«ÅÃV€+äp¢æ >©âÀ¥@Íb+œaf“‘£ÌIms·±Œ¸–Bà—f³”Œ³ë0Vªë0VÉu’ºN×ì:…$6 ¶§%×ÁF+ŽƒÖM‡@pgÓ lôæ:üJä:äEª®Ãr6ÿl£²ï·à“R ø*‚­¥në5–d+†äNb“¡Ã§^éÎF D÷h(!“ºe‰rÀŽuØ@B Wóé'–E°ÝbH9`&wEÅu«>KÅØZ\'šë4Hc×UHµÁS:¹6º®¥ É}FÂi×!ÁsrC*®+ì Y (y¶wŒe_´JPñ=G ¨ZÀ¤W»K5h·Àz¨ÉΗ`ªš=‹Κ=‹‘¬•<‹‘*•<‹1A%Ïb,µrI‹““Åòa8ÃÉl8Ý?‡å/¿þ†HD5ïˆ#pë7¯_?]ܽûalæ˜p„†À¤)Dw ,íä ‚[¬ˆî¸ÔhÙ4f »5&‰gúðéf}NNÂò ƒ äƒN‘2(;Çžw26R&LFIlÒ&”È UCÛX–5d‹}ÁæòÑvóâñê2œ…壇§aùdõö2ìÝyòן+üãÙï«Åò\[­//ìÄe¿Xþ¼ºØ¼Ù¾X]\•2×ý´zyþìþæm83‘a‘p2ZÉØ §°÷l‹I Ÿ®ð÷Öë &= ^æÍ-/ó;¡L‚L‚ºð}’Åòñ›ç—þýãùúÕby³}¹ÚºééòûåËgÙ?ÌõX4ø"öBKæI%”?EòiRàîùn<Ëï6O6›ùÍÅçø¹s¾>¿üÖBøE)¥Å”¯ÁQŽ=ߦ# )l–à 6/²U5†#ýC~¼Ú>_m·›í— qÆçSPA"é·Ê5¢êO1!Ĉ¹+ÖÛì œ#Á1áÞ+ï wå£âDõ¹b: fÔx>nшl L¨µ ‚³"›e JŽy0hT"©Qp‹9 F-BÌetfÒ˜Û`0IJ›ƒÁÔ£Œ†™ÁÉFãƒ`¥é >[#;N%ж[%¸O¦4®ïSËçSZx«íê;Ó$äI˜øù«zË$G÷Û/£Ê“]nvuT ¡,äãKÑÉî\ãV‰ùÃÎ|%Æ-=G¾f\ô´è{ŽD¹p¢]n«hÊWP}QöŒ«`ÈÞŽ°sáë.¤u¸tPâ…’õ&ñcYȽ'þ›èÿ7R÷˜etf4?¹ÎŒÆ‰f[аx#—A0ȼ‰ŒÎœc-Ã3'\u ~n³Ä8Æ  È08#ÝÚ(¸ )GÁ‘ë`Ö1jtÜí\q›…–˜ÆçEûȃù™qL{µÖÞdÆÀ(ÔIÊ£¯Ñö~_£úÙ} OsºººnñZ¾h;³ã†Zì§î¹¡JÇö©‹ÜÓ“èž÷Øð~`¥…隤ÌBt«W厭¨p¤Û³u‹þŒŒqâãìŽ{õœ¢’ÑÏ”^o?*ÙJˆ¶}T2¶K*}Ò ‚ÖC^n¢wuL%áÀË Ef`\[‹BmLØQ\`AEYºŸãÒ<÷v;Æ¥YCWŠX¶ ‚ÍFÃÚá6K[³`òº9–Xi0t„†­êèÌ…cKz({>oÏ“ì'³gŸyènŸÿЭÓkvÛ : õÿù¾=]ýÑ'×Zo\ýáÈ‘îsÇkŸ.Û„`ôëæÁß»¾XötÈŲò¢ÜyQ(÷C^”û!/Êýã/Êöñ¢% endstream endobj 4615 0 obj << /Length 1807 /Filter /FlateDecode >> stream xÚíZ]s›8}÷¯`òäìÔ²$Hݧ~¥Ûv»Mö)íd– ³»€›fö·ï1{k¬Ðmgv& WçêèJWcgá`çåèéÅhzG áSß¹˜;ÌG¾p@@çbæ\ŽÏ㤈“Ó exüä·WºòNÎe.³HêË·a¶ ÓÓ¯§g; ú®2èq/€î*[„sx!àã©.¨'ÔK££#­°C¶ àU—9Ñrtù;3xöÚÁÈܹ©Z.F0¢®õÔ9ý>ÂMÇ8ià¨m2‚„§±•_WËÓXÞc†áŸT€0LSÅË<Øs—!æUðÔ}F|D‰çP$¸préÌxÚÖvß½ßõã~Ý6LTk[ûf,Úöë±<¤‡¦- *le0_8ºòÎdU$zMi€x`XL²R¶×Žs9!˜bÜ$¼ù†zÎ|x®&€yrßF­7]ÏC.¡Î„ æ è‡}&r¹Óh‡Ù,•(ãG‡N?â"ŸÃÍŽ¶}ËÙa ö€Ùáú.r=:ƒN Óƒ­²â€ ¢èâ0o³Á"°<Ån’Í,¦È÷ùp̶í[2k ¶³˜Á˾Y¾“¿äÕÔ&Y*æÃJ1ûv|؃íÁ‡/<$D`"í^øP€tpð@œ5Z®6e—®KâPÛó‡ÒÆ9 ¨ÍöÜ)÷fK¾ @äÏVËõ¦4iQ±®­æºœ…e¨k›"É&{zÎÐéÄ%x|KDì6œ0Ž\Êê,ÊŒN árÓäú”BóSÊÆ¨én–X «ÚµÁ7“a𮢰”3óàV—elZDÐÞglŒZ„(„Í)1!°Í˜o!à;[¤cM¬®‡8¾óçqÇtË-Ž(Œ-nælõàVÆ«zX˜òž;Ê2©gi¬ ê¹É’,)ÛÙßvÚ}ÁmÏEê΄`ÊšKÇcØÝÀ?Øc^·L2˜N† ˆ°0*k:Ã<o÷Í®rµ_pÈõküºW³`v¼ 1ro`mQvBaxÏ\ÈI‡œ»Øá{cçp·2©ì&½Ý9ûö{u“Ôƒ±{…èúkìÁ„꥾åÖ;Ynò¬Øj ô÷­¶X:ÿéü]ýúÆP§}Ql¢HÅ|“"Ó}óà¥"ă=–7HÚÛ'/YÆ«Ù)Ñ>_­s•Ësc\jD;Š1Èrœ‡‡J:öíR{°‡Å†¡füè£X5ìwÎeÿÞŽež :ØL騷›)ö`{$‹ž`ÕòR òÙ«Ÿ_„á„%܇Úö-§‡5Ø>+æˆðïVtäºîp[VǾ±ö`{ëŠQJ¾²:èr•m{ÃñѶoɇ5Ø>|pØó|úuÔÁƒé Tʈ£«mß’.k°}è `œká®Oø;â§O¦çúaê ­Öõ`õ¯3½³SÂL‚'x-1A ²†•®™ï1¦ŸUciÚÞéYPÿµ¥ÚWÏ`>Vz®zà‰VTµq™™æu7‹Dé)ŸªôFqÝþÎúuRw³^ç«ÏÉ2,e¥=©>ªðUõF&‹¸¬ß6ÎÉRæË$Óš³ÁìÀhM©”ÛjH>) aº‘mQÊÀaxë­’W“Ý ª•¾2¢Tì J[¬r‚¥¾L ]Îó•¹sòD—OeYédªþFAj,nõó(–³MjljÒLÛç/Î'iò§ÒÌãgÉ:–yq¢¯®‰?òÄt”n–0ü±« a63”rËA¦ï½E5º4]©Ÿ’ ˆ¥˜Žã²\?žNonnÛ(—… ó(FaY¢hµœþ],¯§ëp P¦ÉLh=›?Ú5àa g¥Í"îèîE¸\×â¶Æ•«Ü¨q@¾F3Û«ÛW]׺£¬×h•ç`èßeSü¿†?œ†¿S¾/nÏd”ß®Ëo@¹W;Á^ݾŸ7úB‘tòöDñô_Ë÷͵l·+x=wIó]JvhóÛ rG‰ád'ÕXÿ²s¬ÛŸT¯×'Þ?÷ÇóöSCç nõá´´uhùŸy~0œ¼C ¶îG ûvyª=ØÃåB=ÿXy§Å|Wä©~WŸŒ2ó†ûmJǾå4±Ûã8C`³ænðM}n°ÇU˺S¶@ûð„),ÏüÈ/ :œmΞê—Îø!&T—÷%S0нc~Îüê ° endstream endobj 4645 0 obj << /Length 2122 /Filter /FlateDecode >> stream xÚÕZYsÛ8~÷¯`åIšŠÜ$v_&3¹œdåÙ—dÊES”Ä EjIj½Þ_? ”šŽ%q”ÔVÙ…ƒ`£»?ôÁ†°·ð°÷öì—ë³o|å)¤$•ÞõÜIÅ<_Aëïzæ}M—I¹LÆ*ðèåå¹é\Å󸈳(6ÃßÂl¦ã?¯ß¿x`/‚’i‚ܧ(à>lWÓ"‚ü`ôÂ4”+ýÒÙë볟X…=²c^e‹VgŸÿÄÞ ž½÷0â*ðîê•+OŒ(“ÐO½éÙïg¸-X@Z|44AŠ^ÊZ®›uXŒ‰•ñM®bÃÖ,0ü“š7Œ”Ðtuó¶Ã)C>æžÏ¼æTÏ "%Ü£HÊ+boÞbÍ¥Ö?ûpÊ‘d³!Lôê¡ô­Z\úZ÷Ù¡MK"EÕßÀlM°Xx¦señÜjŒK.\âúÀakíºH²(Y›Àv lRhÕÉ`ëÐÛpf€M*Ž”òO[‡éª ™çÿܶ @>Î;í£‰–”>ò•å{ºN“j7,l\Ød6)M›å¦5ÛÔ]H*»(ëã“bŽp°¶qù]þ´F¶º{ÞG¬# ÍŠýälØ.cËbeù¿øããGäØƒÞ­m•($xS`¤“Ž@2ÝÞ—q`Ñìûi‡ÅQµ•´ý%‘&·EXܛݩîG m}õàö¾&N³'­]Ëjò¸$K*7gßþ’s†ôÌ„ÏTtasüs¹·ØÁ˜l½±´ìº>aæ‹C RÝs3Ðn x®_¬Â$E‹lƒrøR F‹Ÿß^ü¡ñ’1 ž¶‘LöÚ©#ž'¶³èýQmyÍ|Ë›èa¾©¶Ò!Mÿ.©–êä É £8p1kÙHб‘€~¡Z>£O ˆ|»',@„(Wž«¸ÚYÙg}~ а MßÃßÍùſƄ‰ÑËç¯n.¯Î/~=¿+ 㛋±žÿíµYŸÌûÝ‚ïñ'ÝCœÐ¶›ÒµW2=8Öug3ûÌèQ÷t<0Ë(\۾ΨŠí{ϾÆŸiÛÁÔD’–„Ÿ>hŽ´c#ˆ îÄ:ÿrEqYÎ7)² o×&`ø û€MâVn¿Îæô¦\†ä¨ÒWa¢NW:à¾Bøt•—ü°t0«û× x cptÝ …z·p€ƒÿ·Â—à09Ýqé<$ƒ™=à+…û4­~páàòh`…§§Ö¥?ØÁ̬ĈÛ4·Lþßì ìegG£Á%"?.ýh fö48¤M`ýaf6=XÈÈ(§Ö¥?ØÁÌ,d¶‚ÚÁv6bg®Qy”ǥ?ŽÁÌõ‘Öím²2YdðE³ {åHµM &ñé®/:ôÂ6˜ÙC`ƒ¡ÄIa›}ý8Àâ°É¦OK tƒ™=:,dÜN|#XùN‘ûÕ‡!n¦bB}7óHµì§Ö«¸Htaå?úʽ¾lg£¯º2ë‰{3±)MAÅçæó_Ï]þòáÕjú³ø Æ4«‹10L2³öòïS¡ëf¾r–‡ëušÄ¥Yš¹uofyŸMùÊÌÌ7YT%yfFué–ϾÍoi·»6lò„­E]‚uùÜÒ2%mÐ’©=ØÓà’Ö²HÑÑ…”¦¨ Ⲍ³* ÓÔ>Ød·ù&›Å3Í‚õ综.ZÅ;²Å˜ã‘®ŒHeu ´Vá“ÕfeèÄs½zƒðŽ Rÿ$",¢¥YV®ÃÈNÏu½Fw,A¹§(«ðÞ<¹µ„Òd•˜’<½½ßmk˺½²*6QµiJôù®jo:ZEz¿­Äu†™`[c½[&ÑÒ­÷W˦×: ­çaªEª/RÂ{;7}÷’ eçnÅŸ¸°^¶ ëíZzXö–/LUý²G`b÷ã ýåmWÔò4w[ÅÌBZÜò¨ŠÝ"í7yÖQ\¶Ë³ÍCÞvN[÷Ð:ŸŒ‚£í(}Ú«tð÷ƒ”^†i5XÙîåÄôôÊÎxŸ’£^%¡ä*.Âë‰ÀÇo¶ç%/“ޝ®¯#«Ú×.ââIÅs09‡ÿmò÷ðîDqÌI©bš€5Æv80«¡­•^ÚþÜ´Æ—3ÖN˜›%@˜Ð:a~­xØ£“z³NldrVæé*/mOû8ú…̨™˜˜†˜‹tÝýÉ4KÐ“Ž·˜ÛsˆA ™E1&£¢Žq0ZmêËpL±ÃW‘ç+s)A¨¹XhG:^p´‚³jã¨hÝ~”O]êÚk‹¶™´±ƒ3áË#> stream xÚíZ[sÛ¸~÷¯àìËJ Á•Û§t&Iw7ñvcïSvÇCK”Í)Eª¼$u}€"aZ’Å(;ít&)<87|@Ü8xwñ×›‹WoeD( iܬ¢0bŒà*Ip³ >Í®Òê!/¨À³×ÿÁÜ|LÖI™äËÄüüçMœÍ¿ùñÕ[…C¦rI‘â†ke‘à RÍ^™ å‘~éâÍÍÅ?/ôÂÙ)¯2,7Ÿ~ÇÁ žý`Ä#|i{nA0¢,„û,¸¾øå÷ S¤§‡“)Š¸Ñ¥jíºÝ–i¾L·qv»JÖq“ÕF³ß°ÀðGZõ0Š„­/ïÄå g "D`6,adäýÉöx"ƒ+Ä Ø´ëúl: Æø´×ÙõœènÆ ^„` u”v1Õ×í!ÎWYâi¢• 96¿)ˆ‹ä”üö®ÏƒÆ>¡Ñüæ†I:oÎ ž™ Ê$™uŽ6Ïóxc{¦•éP»WÝ#2KsÓÒ=Jò9dzÏiYä›$·’?Ï©˜Åeße¶Û¯×o>^šÛ¢4ÞÿüîjÎÄìõ‡7æÁÚ<¡³ªpÃUUl*x“c:»›Sð_R–éjú¶x{÷h®Õ6Y¦ëÇ4¿7¿[ÃôÍÃtãÐ0Ýrý·àß­¶ ÒãÕ[‚û“ ô¢E˜ú 8Û!ãHaáàþÏžÌA¸¢QäzöI&Kïʸ´Ú‘Úûe™Äu²ê\ …—ý¤7¿[טù˜æi=ÄòÝðM†üÞ©·à i,´QIÝ”y5f¸@DÈ—î$Ã7ÈvÝÐËvýÓ¤´¾kªžC†BœC–.1°sUX‘±uj±ÕCÙ—‹µ¹¦õ¥Í°ÂjTäßωšÙ—7Å òξS:¥ã,+–"'9¯{l¬}Ë!ÇA)Àîýøy{ß$Uu)‹ˆ£Êó‘²P …¡:){ò§‘òte'e ÿˆ=eZ"É´ Ø :Šim¦x|˃|û¹HWSÈQhaŠr°H‘BG¼Óö&šî˜ã4¸é#ëØ1ËPý®¥æ Ím‚Ͳ¢øGK%úY\›ëSŠ„Æ>“Øñ{TriZô­0Ü4õXÓvr:¥k§[\1¡ÁÃ4«,.•£¸YÕeÇ…ßië¾Û‹ñ«ÝÛôth}á×UÛÀ®ÀÝ·µõšåKç Üw‰ÎÏñÅ:¸±¾¤õÃ~~]—I²—X÷b>90•«ä´:ŒK9ÆÏù<¤0×ÅÙ ß“? ò§+{<äóf’õj QG˰HCóÞ𰜫“j'Æ9b„~ÍÚéòØ|ʶó•ížü‰é2YÙ#Ò…… 1Â`aü­ëv?º;ÔÀÿœ+$©úüÏõn¶œxÝ‚¤àÂ…Ï*|È*¼«¸Eá^å~µ@™©½õ£Óˆ¶ºÖmP6¤NVš²é)Ò“viZ*Ûå±hLC[úê–UZm‹ÊŽe ž^~Ñ Ãm6É*"Ë+a¼¯kÇbšÑz™Zj\7ù²N‹ü¸’—ý/—¼C“‡5¯™"žíòG/·½¿vi—¦ªMt¬¿__ Ы_ß¿.~ÊÄ,$zM=¹£Ë@ŠÕþÒÔ–ß/_ž0 +ÎX‘B•dt¾ŠÔ“?o¦+{üò„ް²À €u˜l¦cË“6öÞº$Âÿm똋Hñ³¥ÉPü´,™¬ê % RÙèÛ¸ÊÉqKy±:=(J!ht¶¨ åO Ëde_QDBõ/u|×i’­N°”à;z¾åO ðde_`E€v£=†^Ìž šæ1Ø/,šúä€i_ÀÂàlÊŸ°Éʾ$`Tn'ýwrë9™I 4yä<“]¼²$ŸRQP2’ü[d–ÌXtˆ[½âlwIy4؉…Ÿv'îÚsH¸¾¾¾BÄÜŠ¸YÖMi{è]¼ö&ËPÏlÒÜÔ¶/¬ž¡J ±´'¤]«À¾ÞÛòÓ?uѧ¯¦Òw®jO7¹Ý¨Õê¡ ]ŽÔZ`íÐ8½K³´öŽF÷w«ð'gEæˆêªpM»=ÍNdƶ±"÷fRW1¬—¢TaÄDW‘íÒÉ‹ n²ÛÓ]‰­sw@ÁËšUâéà‚ÑÕ/:DÊ*F,+Äÿ ÊŽFÝ2É3 €íL·Én‹»‰4¬.½ú1ÍÇr‡èïx:±Â÷Æ×{>»ô9àÊ@]Fžú¡'}XXkÑ—;bw0ì¦áoS=Æ£Cà] Ã#ýðÐn,X‡Õ1䆛#ú· |7p‹¥kÏ!D¡ðl ¨õ|ð±û ™H^î&ôp®wúûG™ßbÚ‡ø±;‹Ù;ßÚ ¯¶41Ø)_äNïm±m2 #!åœ ÂÉa ¤ˆÊÎ[z‚™À®<~ÑÿÊ"ñ•Âfße÷ˆÕ÷œöŒ±xHEÞ'äDoó/ý»½ÃqÐÿ£¢KU3–04g심÷¹‹>ŸóêÀ¨::°jô@Ôÿü“'‹XU³\&Uµn> stream xÚí[YsÛ6~ׯà£Ü‰`ÜGû”Î4i.§µéƒ“ñÐmq†¦T‘ªëþú.xÈ$¬‹‚7mgìá|XàÛŰqpààõàÇóÁñ+eƒŒ¤28¿„DÒ°@¸*œO‚‹áÙ4Φñш <|ùË›òæ4ºŽQ:ŽÊÇaº “£/ço_ih”ÌrE‘æ †+°ˆ!ÐAéáqy¡ÜØNƒŸÎ¿´Âyº2Œo_p0ooŒ¸ÑÁ]Ñò6#Ê$Ü'ÁÙà×nNL“†5¦ ÈðR–¬˜×å|§ãx&—ix].¢0¹-…ûŒ†_RHˆ‘Ý^^;ò2¤0HðB^û^‰(áEF›`× Ûhëß>€r$´¬(‰mí‹_-N¿^Ü}FhbId¨ya ÀÅMPÞœV¬{«¼É*UH«ŠÖ8ÍKÂ6â#‚)Æ[5  ‡öV!ª1k;iudœ#Fh0"HHS øÝ&˜ §a:I"G’á‹}Õ‘0$©êO[ÚøžÚâ-ìÚÂ$CŒK %¢¹»]†YJv«%°:’Î&‡ó‚)’R÷ÇKß“oa»ð‚t–%/ãYšåû12ž†‹6 ~í «³ü^ÇQ29”`i\Mo;ø~û Û`i82FhxžìcyRc¤D¼´à=iñµ +š# 6ð¼fW°ëgwÒ eHü¶ñ= ö¶ Ê!¬ª…~L‘Ú¤mdXµ4MÞfËü`„†ŸõGXß“0oa»&)‚¨±LSâ¿¢Kg™BRhh@X¥.g6ÏùaoÞätÜ'Ñq®QÉÀcÐj%N£ù"Ê"ˆïG”’á*l/­ß¶wtasùªÎåà6NËë˳DÊÛ,_,ÇùrQ÷Ê*œe’Œòhq§aMVmãôl|çÓ¨ù¶ìWÝÃ$™:^Ý—×|Z7¸^¦ã<ž¥¾©fSΧ…ƒeÈU…¨·Çl[s|'q~_&ݳëòšO«,| ƒG‹ê嬼N¢Z¢ò9ÎíÀOfõ«|æ(É|Y½m¹É§enO0k¨+/Å@Bìj–C&¨V%€É,ÊJàtV<&ËIäÈPsP.±mÌT…=,Cƒ#!†¨¥ËVƦIÁ\Ø’ #2 ¾“Z¿Òލ¯fô½Ýš•FÔ˜ºe³H’ÄW‹pQ‘TTŠ Yj<€fXpR[,i¸Wû½JNã4ÎÛ…ˆ£Ý1sÎ}3" 3ÑmC9Sç6‰¦^›”•¹aRðxƒÞwM[¸¶Õ‚úuŠE ’°^’;¢p ºµR®+Ba_e¤ÝZA¹:¯ÈÃôjýŒ1µcl™³„úAóÚ<)—'º ¶<%©dÍJïX¢0âàËe‘plƒ¢ØÍù×Q”z߬)"’­mG‘®Oለ½UEAk)ÛÊâÂk×eéçч-å²…÷U—h—¾h‚ˆqV¦ %!ÉVd>‹ÓÜuditDÅð.©öÕ¦Ÿmù†–ë.Um5Û½Œ¥ðŽÂjœ«hû6}òéý{·XXr(p-ú,­¥žÏæËÄúâ5”‚ ‚Æív¦QµZ*ëv¹º"uÛ¾›ð OÄY:ÔʽfÒ RFN“^3ã–ÍÒf„ò¢|ˆŽˆþiƒˆµk£‡ç#—j ËwL€ocÖ¨FëÏIÛO#ØUÓl± ½7±«–5b1ųŸßÀÏåÇwÕÞTmXÙr<޲ìz™ jäæÙ‹ D¸6CZm;|É¢ü £Ž b&ôvôÂŒê/UuðýRUa÷?zá˜@¤FžèèÅò”Þ/jÏ Y=ű Ó qÌûÓ”6¾§¦x Û¡¨Á †Ðg:vaJ"Îû«þ:øž¼x Û…ðÁбoýØ…AHÌ{<wð= ö¶ ÁÒæÈ¼exÅv›ßÏ£ý­ïqó.ì@ò%zGŒÜâåMl3Å?lN¥;êO­T»é·!í.¨àžKY£Ôج.†ÙÚÌø¿\gÜP3²¨ÕCq‘¸Œ´óìÿË‹íòbC=Vþä‰Ê‹\kYVÂVe‚,ª¸N°ú¾Ì–`<÷­T÷äüòÓÉ»“GL ;Ù1WØ)_c kfI9Â\@þ£ã©‚òÕiM¸XÔÕ­å÷í¥FÁ7‰IiáЪw£û¬*°5ÝcUÁÁ÷ Šü…Ý¿ª@8„2OQUXSP0ò[ûKNbÁ{,)8øžjâ-l‡Ø™€Ë%ÏVR ”§ê/ãtð=yñ¶ /T¨ß|I»Lý%­¾'ÁÞÂv!Øúº¤ðJZ»¤¬C`b¾Jʪ ÂJ:ë~Yi\ežauÝœ–¿®ûßNëM¼ë¿Þü c0Åû endstream endobj 4610 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1583 /Filter /FlateDecode >> stream xÚÕY[oTG ~ß_1í³c=—*Bâ¢TÚ"B¥¶¶mT”­Bè¿ç³÷$gÅl +!E‰ÏwlÏø6žˆöR’ðKí/…îÏ(;#jΑÀì \SB&çÔ‹sZ¤3âLdÑ CJnÆi¡66TQ7º’:¨¢¼b!£¨VŒê°)ÄsUÇHØp )Rœ“•œ' ÔyÈ :Š8:JwtÔì<è¨Ítdèhl¼ ­.CG'çAG÷5gìKJf3ö‹“:¯€òuä˜Äy Ts^ÇNæ”AUã ¤– *VÍFQàâÞ€¹Ü`.(ÈkÕßB^_}y½Ês2'%Pš¡CTw^†¿Äqª9OCæìv¾Uq¾Õî< A8;:šÍï‡S1n OÂü×ß~‡Ñâ›Èðãù›W¯žÍnßþ¸E‚ö1p®©8æ {<&ØŒýgîQ«Œ‚sT8i\¢ ÆÀ°YyTr’¨“!0÷­¾~>^ž_†££0?F¨S_}tŒhä´¡QLòšF¸éCˆŸ†p\£æûÒ¶„€kÈz{‚Îùã‹å‹“Åe8 óÇ÷ÃüéâíeØšóô¿xñü¯Ål~¦-Î/_[Wû~6²x½|sñbá¼¼âý¸xyöüîòm85‹‘!‘‘ÓM(¶þ úž_@ˆ5•´Âß9?_Bè骣˜YÞQÖ;qÅÿd6?yóÇ¥??:;ÿg6¿»¼x¹¸p­éÙüÁüáüÞ)ùƒúKd‹?KÖÜbEõ⢅ IÙ# 2pw|ïOÂüûåÓe€ë¾yý÷~nŸ]~kv£†p­‘Q7†pCžÒáì ÌÑ::e´öJ­ÄÔí/žkž4ääÁCüÜúù‡ïîÝy|ò¡-èv<Øú-¢Èhµ âSî×Óâ#ô:-*"¥3 ‚³ÆO‚[lyÌ5¶©ò3 ¦;é 8Áf-c`ås“ÄÌmŒØ£:N%²JËù>ènÉ dp–/£fäí¼4¦i4D%!Mç“GÃ9#ÿ¸ð˜,œGcß2½•2 ÖXu0œqºµJ¦Œ¬7×óÞ7³Áø¿{žLô<Ù¯çáPwµçÙ”°juB7Úê% SR¬è«"Áÿ¨öp¾ÕeF‹«´muGb®º!TòQ ̬»û‹ìÓ_dŸþ"ûôÙ§¿È>ýEöé/2U«±…]GÁ)Êdá›gwθqÌ2*¹RÌmÐÝR`ó Oç@‹Ñ10¼­SØ$Þ¶»€10¼­W}òuÉJ׋déŸ_$y]$‹lÝeCÔ Ñ¾H!UÌP¿-¤5Ù¨w¸B*M£9NɆ—Š#YkUÌÉU&íøób±¸ÁJ¾Þ ;¤Ô®Û°Néý€-em'ŽÉîÖÖ†01еÐ%8úúÅ%Žm,G»Æ!Å™¶LïÈO¿> stream xÚíZ[oÛ6~÷¯Ð£3Ô,¯¢´=µ]۵ź. öÒ†,Ó±PYòtIêýúŠ”#)J|Qœ Ø€¢)úÜxx¾ï0ÆÎ•ƒ·£——£ço¤ïøÈw©ë\.á"×gŽôá)‰s9w>/–Q¾ŒÎ&Tàñ‹OïÌà\-T¦’P™¿IÄg_/ß?ãaÇ.Ó¹¤ÈãÔU²ˆOá Ò?7Ê}ý¥ÑëËÑŸ#«°Cn€¯2á„«Ñç¯Ø™Ã»÷FÜ÷œ›jåÊ#Ê\ÇÎÅè÷¶Žá¦ƒscoz(ò¹1j$óXYã›Ñ`yXÔ¶ÿXYZ‹îÎCÔ÷ë•y#bVx5rûŒã4 57g›J²q?»rÌàüíÈù\½7â¦Q_°ÀðŸ´L¨c[Ûç gHÏLˆ‡\l·5 V*Iç}~s„{„ß/.>"b|Ê‹¬ ‹2³žßDÅÒŒÖY”„Ñ’¥ú%F?Á¬a0a`ÁV¬¶t©xn–¶ôsI¹M¯a  ÌeÄÆöJo’„aBË4þ¥ óü‚1Õ:pÚ L4EÜnìnÝê Ó¤ 7’«Þk9;ÂB$œ*8EwÂÒÊæî)ãxR¨l%·‰I²5ûÞ ¹%„ÍÔž7¯Ì€ø.7£Eš­º^ú²aÌ„Qĸhsšä}'_ "¼½ÝÜ®¬%VF]üòþMû`Í·©—a¨ò|QÆÈj&‚©Ï*°T@f7 Ê"smêf» _hÛôãm§”2$a³]ðž{U)Õ󂸈îPäƒ×™rÍÚÙ’Ö?{W%“n­À&zõPù¦\wä×u MY.òáà 7¶®Ô¸®ÔÐø=8ãÂñˆš()Z™tWT|‚)Æ­o×ú ã*ì›»BjÌn}“qŽ¡p ºûÆ¢îµÈs o1² ;ÏöÍ?ˆ®p½Ó¥G[þÀôlìéÁ\õÈe yB4™VϦ» ÐÞÚ¹{·L•°¸±¶'‹tþŸöÝ>,‘€¢7 |ô³>æ)<¿BÁÊîW™°°œÉ¢:£b|c>|:÷‡©3"ÆßCÈÒ«h‡¡²õcô?Éýh;!î‚»'Øá¨·N¡²©ÌxT¤=;Õ¡ƒÅ2(lˆÒxž×ð®Q<(¢Ôâ|0KËâ¡~ðÁoA|yøvï|ˆÀ£ þtvFñ¸Œ*y8þö#BÉéðŸKŽˆKOVà;ò‡øáÆîÿ\JØØ!ð?UÛÞ%„ïIzà„Iû$è“}yÔ£Ðôœ,MÚò¦É`cà”r¿uã2ý¦6í@ é·mw„F¸ ¡$â)(ç·W3/MÉc܇K~ËË•þäYÍt® 3fBw‰úùáü夂 B}ÀÈjÍÇTÓ ýÖ ž+ Øfn‘6W e'ªFS¯ Á³z™U óZc˜®Ö\³ØJ7ͬ^cEx•ˆg0” (@±LË«¥½æ#ü­)à:Sàc0‹7¶±m¢h´ZÇj¥ ß× iA§Ì· ª¶ý±ÖVó«4sVÑ¢Ç&Y¤Ý¸~ *TË:’õÑ{6:ÎqyÄåÏ·3biÊf{9a9ظgÛ›·)“JÂl³¶”gÁÃWT")i›Ù=ù•Æ£1œyš¨£È £¨:=¹aÒžŸµ:ò‡¡Öpc÷'7 20{ˆ®Óh¾›Þøn‡ÝTÛÞ%7ÿ‹ÈÍ!0É –{‚?LRŸ!8Ï•Ù?«º– rù@$-38æcçiÙJë²ú®Þؾ FízÂ_BKÆVFUu0žY5!hUõÜÆ< ’`½Ž£°nçàÍÍRÙ‘†jýLRóŒSPšÙ9U[YØ·eÅÑ_ª-·wOØèÂÿIø;]÷Û-²5ºÝWda¦ë@‡̘ªb³>®æBR#—ŸðBˆ7r½Ó](w䫹ÃÝ¿æR :å  å: êèT_wøõ²Ü³ìÊǸ\&>E’Ê“¥JGþ°TnìM%ñ]„Iûr9Ȳ;g4Jiô‰G<á…GþÀ=lì!{â „×ç—Ñiû ;@”1;²Ëï;Ð"õԟ䪟¸‰úªÿõ÷" Â&ÞUm;Tª‰®T¨rìÿ›ý¿êxdærË<®u§dQ0«ý®»Ö+U4—Ä¥}¿ÈÒÕ!Í8í¤p×hÇéÛ,j]÷:ÑÇŶ´rëÑŽß@#NùAøþ©a+¼ïGVN6æÇüÆêoD¼ endstream endobj 4750 0 obj << /Length 1473 /Filter /FlateDecode >> stream xÚÝš_sã4Àßó)ô˜0­ªÿ²àé€ÞQ8ŽÒ^ÊMÆ—8­gR»ØÎǧgmKi¬&©]Çå`¦9¶´ÚÕ®vrBÐ "èÍèÛ«ÑÉkmÁF1…®H*¬ GÚ@«)ºš£ëñåmœßÆ“c&ÉøÕùY}q-¢,JfQýñç0Y…ËÉû«O^ PñR Ð BÃt•,j8 ÐÁø¤n˜0å ÑéÕèÏ…^Ñ%`(—hv7º~OОýˆ&@ŸªžwHR‚Wp½D—£_GdÓ°€nèádJЍuÉ+»¦÷Yüq –”í}˜^d\ÔÚýA$Z©H°‘¥ø²yã)̱&i.±•Âå}IfT †M`P¡Å††MiÛï>ž€ ,å&¨Ó²w_ùvušòÝê¶™aS–†™([ ÌnP}qaÝ î«Ü*6ÝÊ4´ØŒ×i˜'Öq;å¡ëc)Ù Ec4ôÕô-cÂ>x,ÎÍ]JhŽæšB00tL±T¦Vô«]r$æÚèøXÜu©ý¦m`2ftŸÀôÚÝ™ƒÈªÖûMTØ´qùÓúò4™gñ„ÉñÇó •ãr«y‘­fÅ*³e‘¥wõÕùÅÙïõUTøkv&7n,ÈÉkJ6ã‚ € áÍ„¤°©3Dh ¹ËM_{æ˜AÞ±==U‹ÛÐÚp›.çy}'‹4» ‹8Mêá‡tUì³È›üõ0ý1ç˜J á÷˜]Þ‹tHò-†A"¢R·6̸žN¢5+zä½zwTÞ»_{.N¼Ûí;ªo¥Yݾûíí[;~Q·Ij~vq“» 7(´SEYæn¥³xbŽí2l&ýcÁ± VBzx:ëOçQö¬Ì¯ˆ‚\džËüÒH¬,ó{òûeþþʶÏüÒÀ-jI%NЧ3>%lwʯ"ÀKûU‰øRÒþQˈ”ÀåJ 0Mù=¦·²-†+޹P0™†Á¬^bÈLž¿¨Ôt×N†4Üè[føç:L—­ÎaMù=Ö[Ù.Ó0©±•<ÿަ…¿É°’æy{ <¶Œ’>p%5„}¸’Â` C+Í¿?½X×ätn+ïé»ïÊâ{>1lüêb¢ÈøÊ£+[') ÑÃRSŰ¢k °aì)A¬Ö°[H—ËtѼþøá³C×a±Jf%¹n{Æ|ÚÈ¢ü>MòøC¼Œ +.µ„0ƒé"[÷‹´nç‘ÓÁ Þ†Ç4€œ,Ì „è ɽs±JyÔE)ݨR•ÏÖU¥’Õd’‡`}ÂÜ9JÏÁÁN·‡FvïÈ6̲ÐúìS\ÜZ®‹Jý?-?o]…fÇÉMÓåÛ"Z‹§Œfužò¶[ݧep2ìªÎ†ƒ´g£S÷ÉÅ8Œ¹ÍÃ`.…ÔÙåptéÆáàò‡3ø›þòÓáÁÅÖ†|5›Ey¾X-åÓú ÐÌ•°ép`.H¦ñüéâgÔÆÝ·‡z÷¬[â­îO·ŒpÌÈp'"O~Ïpé­l\bDa.¾¤.ƒ¦ì¹û»éNìç, þìDÓ˜±„xé è`äò¿ÿx•Ø:¾%0< Ý úNï¸W¯y‘:óÃÚøiÛ}DÏù­Ï?·SR/ endstream endobj 4772 0 obj << /Length 1530 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_¡ÎÐ0|§¸}ê¶$KÛm]’ ÚÂPl9êH®$§ó¿ßQ¤lIvÉŠt@´Lïøïž#½[{烯'gJ{iI¥w=õ„DR3Oix*â]O¼ëY”Í¢£c*ððõû Û¸ §aÆãÐ~ü5ˆ—ÁüèÓõ›“3{>”ÌäŠ"Ÿ+˜®E4‡ÊžØåÚ œ^¾ ôÂÙ(C™ðÆwƒŸ°7ïÞxqí{_‹žwž Q&¡=÷® pÕ0ŸTô(e ‚4·ºd…]£EݦéÅÃänôc:­r±ÀðO 1ÒÂH7ó†¾ )Ì=żÐ×¼D"J¸G‘öµ—†Þ´¢`]Úî·ÛPŽ„/Ë ¬`bz÷•ï§.¿\Ü63TeI¤©~e é­g—U@¯@•WQ¥ ùÊÁŹìA9Þ‡c‚)Æ ô§`_ ]5†žÆÜÛÒÊRÈ8GŒPï˜ !µUí»‡DÄ|¯ÒqÄ“-M†¯Ú:"aHRu8?©Ëïé'½•má'L2ĸ„É`R"ªqmd1©¯´Ï…Ù÷BÎøÒÞ¸aФô‡[]~OÜz+Û7,`°ì°Á%lZ³›óÕbï}$5§> ùýðè¯l<¤æHkeñ'qÖ‘ñ,HëhˆÚs¯|ãàn _“³h‹±ï#EûäìÆóAN%¥BJ;Õ/Ã`b™ÓûË‹¿lËd ÛZ“hG±}f‹p™/B7ðúï÷§¨fúÉÁU´°‘Ƭ™T€UdùX”íû†Ìš->¢`®(«^´ƒÌ=çódä¥Â7«B2)%ç(,´ñ8Š£¼Î¼6È>nï1gȼ9& 0õ€Ü°؉/Xk›ý²g²ÌËÜtDÅ0H£à¦´ük”Ïl+Í—_ç«KQ€N¨~Ê  â ’¯/£ZÃ(Tîd?bSáxÓUßÚÏÅÜE+™n»kž8°Ýçý•ºw.ñÚaFÜ«[Õ— X«{ÿ%Vaƒ¬U»˜»fqºÞÒf#7M‚`¹™v§E—a¾Lãl×þà~w_-%ÚEÿåþF¿¿uaejLtfËñ8̲érŽÜôÕÒÉl+É÷˜`ÙÛµÓçðˆˆáj¯šIû3Ùë`5“𢡒=ToÈï—Ãû+Û¾f–¼ªJ…?‡«ý³3÷'ºšŸëN²jV„Ê–•Õh›US`"’ðç#é]H×°ãüa \i„]ä?]xú|Dðp½ëjÔaC'ŠïÿÆ߆xÂ3gÌ,O—cDe¸œΊY2Ÿd%É™&é]G‰c;ÁMRÆâÝ=^ki³]xUÝóE-¼æ³ðl–Y™õK*·î»Û4—.“Ô>ûóÝ»u̶Ü"qK³*"+å ÀM¦iù*„I?²Ótò̇rAªÃEy¦8Âøp•sC~¿(ß_ÙöQž).ëâÇ}Mž®Ó´lœŒAè.o†ïâmÏðͰ§cªeôVýOXLýŠùá*ú†üž~Ò[Ù=ƒISÏGš9w›tJ¹Lb“_ ã2V2§õUX×1û­áÍÕøÞ2ªÿçSp‹ÒÕù@Ã*èÁëž·2mY‰ey’6NOêw3ýQ…”¢¦¿EšY²ý®…(Ô£ø×B”A>9àµPC~¿ Ö_ÙöÉ2…XÏk!À>Ûº"„kwB”Â~<àPC~O'é­l‡ÌG©„ÂÕU gïN›…&jŸñT­þÎöF‹PDxÔß­ÞÊvA‹ˆ¢TyÙ¼.L…bàþK0âû›#œÍÂ뫟.ܯ4‚ôR¡{ÿóé¥Kâñ8™„-ï êØÆ"Y,çAî^ßF†Ý›¼ÆÛ‡¦ÿ_L> stream xÚíZÛrÛ6}×WðQêX0®Ñ>5mœ:IÓÔvû’d4´DYœ‘)—¤ì¸_ßÈ$%Ù¤hºéLgâð"`qØ= {WöÞ ^] ŽO¤òR>õ½‹¹'|ä+æIWI¼‹™÷ix¾ˆ³E<S‡?~<57gјPaUÀn‘× ‘`í!o¯œ"%Öq)Y20f0‚T`Eù:M²]«G@cÙ~õ8‹¨ó_Náßä·wæ1ž¨ÚÅŸ­§Ó(Ëæë%²Ã—uŸ& @ĉکün~‚`Qö§ü“=è-OÔìwËÝÁ6W~‚c$¹8 M¾-o·ô¨ÄfúoGw& ,ƒE`× & Ts0öLŽˆ î7Ñ&}@¤ž“²<]Oa3Ûh'õшˆá×)„Ì«v)뙃a h¾­[‹Õr–9ôïÃ<^Y7ÂËÕ:Ì£æ¡ôebi¾ˆ¶È‚‰Ôõ¶ÊЦånÇŽlv³)íÃïßoÂsqMVvbîÝúÈÜëÚ¡¢4u¯VÓ)P0;8˜OfQzP@ç”"BHüõW¥Õìw èÝÁ6è‚ ç]+yÃ|-˜+ÿŠåM+DÈRˆ¨þ*ÄšýŽ ¥3Ø"Ç(! ¥OÕó{ù„RT*zÇ$Œ f÷FXÍ~7ºƒmAS Jm¨ŽÿŽ&y}“!_¨Ãö0¶„Òªƒbbyî¿„bb¾€ž6Ê=c¾)è#}/mšÕo7JÆàíðb@½‰§P3?R&k#:(ŽÈд"©O.G×ñr¶§n.úA¯bèu¦ rýFW„úͦ»y,TÁ¸æQ×Ái–Û N0+­ ŵ¤qf÷\mÆ@ qE\‡¬t^ ‡¿¼wxâB+iuÀ öƺ”°õÁ|LµZ;r‚Ã7ÄV‰ÄuY”FÙÍ*ÉâËxç÷Õƒ=ÿQZ-˜g‘æ ÿ›¶ªäºµ8[·ì8&ØÐ]=o ÏÚ«Z0vã¤w˜¦¡åê.ÎVFþÝò~ç$49S#T=å%5Aµæ¥ K;NÒÔ'i`íÊ9åð=éý¡þU }f¦x›³ž ý¢}ɳ-'¦i_"P($¡ý•B—ý ‰šýnB¢;Øæ%%aNž¥F(该@Iÿƒu`Fòá‹ç_-UûWKg°-d'Åá€6¯ï·]c6¦‹€ð˜ß]5ûÝèê¶]P?"⾦ÝQ%ìýÎØèX¨ôT^  0µòÓC`ô£©ôý»³Wã‡Ã¶VÝ›Åùãg§ùððt^2¼Éûó|ÆË쨦w«c6<ûsRù:Œ“ì½»OïÚ`Q×» Xb­e`œ´Q|Îù ¿MĬáĪÇÑ[¬G5ÛƒkßŒŽ­ÛõK7ÑóC~èö³ëO endstream endobj 4722 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1550 /Filter /FlateDecode >> stream xÚ½YÉnG ½ÏWÔ19¸ºŠK-€`À ”HÃö!‰àƒ—A2ˆ1ch œ¿ÏcÍŒ,Ë-›cÙ ›ýšÅf‘ì’ÔTB RS ¢öÛB×=d6EN!7ÓäˆÄ Tº 8Ö¡ÁIJØíÓ‚òÐô !P …š 9” Mé%šZɦÑÓXƒ8䬶áD¦VM‡»BdÜUm:nä’ì †çe8ÁÒð‚)ä:Ü`Ø«mè`¯ÑÐÁ^«Œ5¸„܇+ {½Ø óÉâd(©E¤aYž<, Ⓡea„lXTÇ{”@œ;Ö€k$Ã2"OÚͲà®9$Ua¯Õlìu‹cUØÛú¢ˆøÖUH:tÒ°¢Õ6†°B¹ÓõÀXRIªébf:‚T†›*yè°†¨å@Ášì}a‰RªíyÂk”‘+bÒH8Îl—¸®IË™Ô g›Ml>[H¨ÚÝŠ<ž0×`Æ$¼ŒdۃȰRaE“ál!Ó5¸«}è`´ðÐYB<[1­í¯’6öש[£á²§¡Ã] gµÐ»ézšdø— µ¡«AiìL'dwµ7‡ªcgZF–ॠaŽäïVE áÄ–'“þÉ*§%‚T†ŽCÉiè’Bêãقʱ\kX54t-¦¾8:ZLà J§¢°Ÿ†é÷?þ„±À1Ô@ìЯ/Þ¾}±¸ÿóà&1!”>p嘰5.°důÓ2R&Vò¦X’׋”cA•¹ÀÜ~np…ËิheàçÂ1{#—µF¢ìµœböb¥Çì\æ—‘Ë—¯Gîx³>GGa:F‚¡{Œ‡Ž›1ï^WòN¶ªÛc2ʨi½¼\µý3àý OÚîkNON7¯Ÿ-ÏÃI˜ž<>ÓóåûópéÎóÿÞ-qãå_ËÅô®-×çg[‚Áó‹ééòlsqúzy¶åú¡ûmùfõòáæ}81µk4þm’cë/°ÞËS]Þâ¬×=Ù6@skô¿ {a{ëšcãÙÅôìâÕù¸þuµþg1=Üœ¾YžŽåÓ‹éçé—éÑIæñk¼+¡( [FŠT4 Ú¶&÷`l³0ý´y¾ ØÃÎþ^áïÞj½:ÿÑ"÷MÑ"HßK?´jÌ$wçGFa6t 4šrD'ÜNþœïNWÿ~ûp`‹ò!YJäÃÂaEg“ÕeÑÝË9Znµéghó#ôžé¹Fk ó`Š­‰¬Ñº³L[vZF[¹zÁM£’Û¢$gä09DŒN.,sŠM3•H^h^)[åW/X£GNp.S*±{7£z´YêÀrskø¸…\i7u¯n š>m ÒnÛ@ìÛbÛ.¤|Ëv±gG¥Ç÷ÐŽ•1U ß?I‚÷ް¤Ø3âÈH*éW $‹ûf‚¼ŠÞ¥ ¾cŸ»fÁà¼>[6³`{U'¸`¶ï.Øj¬e/¸ÇV}Xí »à4¬ ´0K½3`|÷ckñ­árò‚³à+¡yÁ §\}`î9²7ÎŒ‘š‹zÁ-’:ã̘©©;£A Jõ&‰¥={Á-²7‘_PìM$Âl/‡´·â߯fÜ>sÒ;±CÙëŒÛiǸ}Ò÷g ý»œ$Š'_rp!ôâ»ä`+r,ÌXØÎ‡ cÙ™zå¶øÒP{ïÕÅêí›ï0ccÌhíðÏ\"6åî‡};Tû_ÉÎ;‘déû½2ìÏXÞÜ›æÀ©×2c •æ“M¡^ËÆóìêJ/9Á`Á6Ûôf-g¤²øÀbïwõ¿ÿ¢Ž1 endstream endobj 4825 0 obj << /Length 1554 /Filter /FlateDecode >> stream xÚíšmoÛ6ÇßûSð¥=Ô Ÿ)n¯ÚÕéÒnh抴T[Ž…:’'ÉÉòíw”(G’Ô²â¢$Ñuºãîÿ£‚®Aoz¯&½“SmÁF1…&s$V†#m`«)šÌÐeÿb¦‹p0d’ô_žŸ;ã`$A4 ŠÃ?ühí/Ÿ&oON=‚<0¨¸5(4ÞÐð¸Ü5 nÐ^ÿ¤Ø0aìM½Ñ¤÷wÂ(‚èƒp+—hzÓ»üDÐ ®½E ã¡»|ä ’”`Æì/ÑEïÏ©æÑŠ¥MI±…/i×Õ* o‹?i^}$’À/Í]#ØHkÖnÞ4åX4—XŠÜQ{^R…ˆaã”h^ñ¬nm÷Ùí0¥§Ê†©ÝÕ¾›•ºýrV÷yBՖ†™gp67˜\£bgìÒ iËÓ)ªéd{Úåó6gEÆ5„.‡F²;õÕ[˶Ü…m[îÍÈ-ÔïæšB 04¤X*S¸÷Ócv$æª Ü6wÙ±o)RŽÓÇ«”ºýŽ•ÒÙÙ=*…+޹Pð0x(•Õ–vå§ýzÅØ:°#wåÅv‰_öÎ Á RÝ¡M4¶öo嬩vÁæm št¶pÝúÝøÕð||öWqFË—‚•ý¦ ?ºp-ö“SJªÓLÜ€ áõ†.\uZƒ'y)?7,Ö"ñ0ƒFïF¦Y²žfë$(=õ]H‹x9KË0æqrãgaìâñ?Çë쩈ž hÈ9¦’Â+ >1W7Õ2h„&æšíš)GÖs‘ÅÅ6Íâ2Ø2=Od¥¡uC)rõr Ý‘îR»#ýx¤éA‚'„—Oð¤@ŽÕÆö»µ±îÎî/xÒÓp/+RFÙ×»%lKðŠÌ7ô®ø£ žÔv+W)uû+¥³³-Ojx¨á5ÁûÜ×'ZL¡7”¶-cíäPj’kÔ7C)@ëᯃir¿rÂ+{̊ÙŸùõ®[oÏ~ä¦[š:ЦçI8`²{nû³Ÿd?Œ¼®œã.H'¨þrOýÍÜ|.²MË •&“Oɦ7ä¶ê’òP"¸½êºBk #„æí÷Ë€º™¿¯kî: ê'fÕJÙ‘ßf(FWž ºŠµfõHÆ@L”TzíSWZ„ÇþÅogðsõþ]qέ»óâ ]Omן¯—/ ÂÊÁ¶¯^ ¸ì¿|}õnôaòá|´¹=ßú‘;ަñÍ ëó2(ÎÔ¦ÒžÈîWîRè\‚I¹ÆIÍË_Ç%ûÎ'êõß_Æã ý÷c:ÌšKjÛ˜`½.•Ó»yãMò ýe-Yú›[ßüpÌv"¼*†h‡HÛ„”þì 4ŒcÑã¡‘  {ŠMðö» ^wg÷G#S]®ï$£<ëM,‚AûaQƒˆ„ÀüP"E˜-ƒC™HšKÅÑJ¤n¿c‰tv¶ mÖ¸ÑéÙï£ú3piï„AO®Œœ/Í7pQo­Ó°ß-[Ým‘-n¸ÊžþÈ)¥4Ï·òhð<_Ž©oÁ°\iL¸(UßwTöz4Þl<+Yí1çI|Sì}$„-ƒÇ®âÕz ŒW]; AœŒÞÚ3~ú ú­õ¡…5I Ö@­¹-­| áŒ?®†Q˜ˆªPÎÔ¯hMR…rÖª=ÛU3V8^•Ù™[¦²;V¹Âèú+3Š•nxüÌK‰x­ÊOݪµSœ¹ ³E±öâÝò~gòòú¥ÌôŸFìÚbAí…Øº}ámÛzVAì|qW"v^RÄÞ‰œP/zÅcÈ™úö½» ÂNSAÌñ¨“1†)§G©†ýn"ÕÝÙý©“AÏÔtÂÎÔ¿ þØÉ`­FõñV& ûk¤³³-@ÞE,ÔwEP^Ð"Ž·FhØï˜¬ÎζIáXzà…]‰’ß‚(©V˜—¸váÛ¯„ ôÛE–>æMÄ,?.+påHün!ñ. ³–¨Ž‰;¾ï¬”_ æ“ßómŒïú‡&o1‡ü?Ó¿Ü=]– endstream endobj 4853 0 obj << /Length 2001 /Filter /FlateDecode >> stream xÚíZ]Û6}Ÿ_!ôÉ^Ä ¿EnŸº@§›~ i2m±H CcËcamÉ•ä¸î¯ï¥HÊ’ì™±­Q³ H Y¢.ïå¹ä=‡<8øêæ_w7¯oCh¤%•ÁÝ"IÍ‚PÃ5$ÁÝ<ø0z¿LŠe2žPG_¼}coÞÅ‹8ÓYl~¥Ûh5þõîë×·  Jf ò"ÅC讲Et„jôÚ^(׿£›/ïn~»!Ð äà|ÊD0[ß|øsx÷u€×*ØU-× Q&á~¼¿ùá7S¤á‡·)ÒÜúRTqM7yòqZÄ墙n¢ãҺ÷ þ“ÊGŒ´0öÍå«ŽÇ …˜!“ˆC°à±y.ˆD”ð€"­tÇÁ¢ábÛÚé§ÇP¸R¾k˜˜Ö}í»áiÛ÷Ã{NM[iª_ÀÙÊ`þØ›wWÀ¯Â•7q¥ …¡´À&ii{ÔNðaB0Åø±h­CÓØdƒ{qlÐO“Ö‡ŒsÄ & ©­wÿxÌ„@L†Ë(¯âŽ'£Wçæ"áH ƒ¥JÛ~ÏTéíì©Â$CŒKè,DŠ„ÍÅm)y>g$$I•«1Á ‰p8HZæ{"Ò×ÕKÁ)¡êÉËè´<Œ¸Üo®ž!ê‹„É9ûýðèïì€H-Ònšeiq&³%”ÏB#ãªõÖâKñùð*‚¤`ÃÁÛ¶ßÞÞÎ^¯â”üŸ=Û, «8íbb8Òççâ*dêA’:×Gi¬„ôܯôe–¶Ê¸ $ßoÊxnΣ2²wIj¯oß½ùiL¨!ó[Œî–Ï~YØë¶¼ÚÛ³<Žê¶÷{kkïǺz¨ŒøÑ&Ñ6í5q=¶™è˜Ë™óºÈÖÎÍh³Y%³¨LêW›x–ü‚15S`fB€ ai[¿€Ò«QYÅ,ôè¿c؉íí›Ež­í+×'3Û¬ô/¢Ò¾©®÷±³¬¡“xËÌÀŽeöqy4ÕV×ñ+¸•d´Ï¶öÙ:ÚÛæ;Ó_”ºnÊÌ^ÁöÃjz©ߘŠÑÇé½ét›¬æŽ° –À8š;_vËd¶´Ýù|(N ¦ìÓDçöÆdAaoËeâîÛtæ0ƒ_‰»f©3>lP˽׷7g88@"Zv$¨¡æü`),¼(ûgÇfk*)D¡à¦d²Þ8ã6,•Í\ÊÃOHù'°¨Ùw’&å÷èéx'¢…'¢¦Ì:éZ'f 1à {nÌÊ·ô™ò‘z[WFË ZAÚÑÖ¨®Fœ^q’n¶¥ Ê%wUOö.ói×ÔF¶6–Χc QH;È5*~'Žáú%¢ñˆæä Ãè~u2W-;ñ@âPô.Ÿ€P®Ýª°ð®¡>L$G!aíßÅå6O‹SË‹€< /Î[¬<{ÿï7ðoúý7Îá…™9.èb;›ÅE±Ø®ë¾¹×cV.$ä £w{Êljjaµz]¾ËÃC‚¨àÃíòp TR‹Á˜kÇ~?æÚßÙówy8X¡X¯]À~‘m«¸†ývxÂ3Nøû;œkĵÁ’¤m¿g’ôvöyÃHeÊ?Áþg ±p¸ žŽýž˜ôvöL8è[).˜¹ 3QûìðpB™n»¼c¿'½½(!–Ÿx‡Çà›Fë¸Ïv^Ï›ûÐÃm'p,ªµ¾òýç<)ã‡j­š]4˜V-Á=?»ûÏÛ/‘»õJ±ùá.Y­œºð´;x‰§€žÿéü{R”Åy*Qü­_L%ç@s;ã ]×\ûºbHÀê'í>2åItïÁ©Òs±w›4M±ç•F37}>3w0Ê8}ålÅ¾öKcñ™€9­$?¿Hü±KÊe3àªïVлÃÔ/³§uÓ©€žÑMêòäB7©Žl2Éœ­7åt…Iê]õ¤z>¿JGQ(ZÐátY®5¬üwì÷+ÿý=_GQ`ÈT‘ëuT»,Ÿw¥”âÿogå¨0fà îŽýž‰ÒÛÙ x"ÞΨ£<Çä‚KmÀE < ÁÃFÛâj¸€)ãp8é۱߮ÞÎ^¬ÜL²OMë³|]}nK¡2œˆîØï‰n_gŸÀ8(;¤¡KD%À(©ú+DÑaâjÉ­!ý •¡;î’ʰíÔ?óOL1„1$‡vyÍÛÍL‘1'}¦ÐT/Ü飬Îúò±æ–IêD´è~ã!Í›¬(’ûêxžÂsOÑs«G ‘)]1z@•oô±V7¾Ê$û8≓Àïn'Ê‘ã,·WÃż ªO^Á•0Z›<ÞÔ--­È•=)Ì@Cb·«¿ŠÒúˆ>+œªÏìÃÆA®ž¢­Q!VÓÓÃ6Ç>¶ïâï“Çg5å)N"ÍØåñn2˜0qÞi\A¾ÚŸŒ9Û–µ¬±ðw›]&¥Sä™@ÍÚÁhG“Õ+ü1¼¡¼âœ®Z vHò¢Ü{˜~Q©c{,;'r°ˆžp™($ÙË{ •¨ÑÃv§Çû1m‘Hm-ù=\«Ÿúm%ókþDûO퀊 endstream endobj 4887 0 obj << /Length 1943 /Filter /FlateDecode >> stream xÚåZ[s›F~÷¯àÑÊDë½Û>µÓ&M›Þb÷)Éh°„$&2(€ìQ}Ï^¸ÙB`’i;“ /ßžÛžó]°³r°óúâû›‹«Wžt$’.u›¥#\äJæx®qnÎûËëu”­£É” |ùÝoÌÍ»p¦a<ÍÏ_ƒxl&o~¾zåcÇ@—)@îQäs¦ÓXDúð‚ç_^™ åR½tñãÍÅç £°CŽBÀ«L8ó»‹÷±³€¿ýì`Ä¥ï<è‘wŽ QæÂýƹ¾øó—óIIŽS$¹‘%ÓzͶé„âËän›Ï¶A–Mˆ¸|ÐOôóÅll6·Á\ýø4[M¦_†¹‘þþ­FR¨éÕåuM!†<Ì $¸VH=ÄE”p‡"éK' eIƒ*ZûÓæ”#á»Å˜¨ÑCñ­õªø…õ»ÌPÆr‘¤ò„Õ€éÊ17ï¬ÛÁ½Úí¼ìvê!ß«ûýàó‡$]Ì–»xnù(¾ó~êbü€ ˆ ÐéÈ ¹ÔÏqUüŽ*lÓMLxê a "ŒŸÔê²vl:¢ÈJe;;œ!̤3%H¸Ò€¼x A æ;¥ë ^lÂ*ž–|Ûuyƒ \°¼k×Gó³ëKäÏHþZ§#HÂùÚfã`»ÝDó ’Ø<Ð1:!*©-ì¼æ^EþqlÆ*3׬˜äv¯ÍA ‹’ÒâЛ‹ÃN|\ VMGƒ£Êƒ«W—ã;0’˜Õ}Ù¾l&Æ‘EQt¾©aV,ê#*e12+•: ^±(€]ÃÅY¶ˆâ¨³¾Ò+É6…€V˜xFí²xæ»4ÎÚ´ˆï|­ ÄjÞziUïíöFbµ¯äûmhÁ¡Ö>‰þÛ_oß¶Z®Vå•Á¸p)#ïIÿ:Ÿõ,ñB Èl¼/|ŽÔb«RÔð‡UŠáÂv/ñ‡"¨qù}-N×rÙ¥˜gµbn9ÀùʼnqŽ¡ÏY^vJO]ÅxASÅ4ƒ…í4Ìeˆq&ƒI%{&b8¿Â„‡uQÿüApàÒ”k먄?¥¬Bàa‰À¯|äfÔC´Ù˜g·¡¹î2]Ù‰º#/”I3wbæù¼ Ó½™È+3wjåMRó·Àü.££É”avy£ßb¸¦Û6‰â¼€™±’A1-£°¶ºµÅ1 ó4 'T\Þ«BR‚]Å«áühu‚i© Ý1¸J!] 0£c«!>-ª¼ ÎZ<•çÞ(U‰`¶Nv«Ø2æ£Ô}8²„çæ06O)ÐÌE×pt¦¢)x¨Ì_gMb« WÞ±xÑjè=ü§L#+ÖaQï0Ìr•ù:H-t+6SmíP¶ êÜ^ÃLâ,oÀ·¡C® —B¬ßyWÁï•ÿ‚Ù&ÊòV¹! Aj°ïÛ¶hÁ@«y1äÛÀUÐ_S ¨ÆW¶¿YÖe5¼Ò2ëÄ/+qÕðá ÐSFõ4ß³Œ¦iܾË`ì<ˆâ‚ÖêK¬×òÃfßÊó3Xì°®õýC”¯kz5ƒ0 ƒbá@œÖ†ë\%ĉVgJ(E„“ÿ|ÇSS»Òò¸ÕÔå×RP…ó5®Fá1é+%ûç/Òµ¶8Tµ6Ô¶8gu8zª>] óÁ–ܯ«až¯±Æ"¨5üau¸°Ý»æ«Lî‹_-R¦¥fò$HãyýzŒ®ôצ~àRý!ªš_£b®0/Ì*ð£l¨¨gtAÌ#Кú6Ù*RuHTõÖ£î =°U½}%<„¡¦æ¬*þ@o öw¹1aík¨c·ö´áY!ñzn˜Ég/ïrA¶Ï»UüÞ,ì9Þ…ÞÜžTÝÙúiïÆÞwó)ÞEùso>´Á2 |Ì•¢“BZOîfy2û*Þ²ïÅS¨NäÊñx õá/d¼œTõÅíÎS¨Ï‘~;Oi YÃ\ZÜ¿¯sù¯Ûo¥®Ô{Ñ£…I`˜ öŒäF=¢ÊCœ0:ë˜Þ 0TKÔÛ%Â×½£¹¤Š?Ð%ƒ…=Ç%.´þW&i¼èíY®ˆòx'b5üž,ì9ž@ë©ÝË¢¿Ã®k-UÉ/îí¦¸ðx§M5ü,ì9á@Ü]Vþ¬®Yð†,£d—7 èY<2Žpù¯ñ¡(ÊYðÀÂ4:§˜MµOjì@+›©†0˜ûEÅ)…ÝÈ˶á<ú€1-ö-P¥ªöËa«VWœê ³·¼ÙÙçÅ>òá•UIø±É“ú·ÉÝvwØd=L‘ýß¿†é°7\â5µa±¿‡Úót¿Í“Ul×ÑܨÆúáa?¸=Yh­b×sxظ}Bq¿öY­€õMn‰0åçëÅOÖKiìëgõõsB`êA!a m‘h 7ÙÃ*äK–ÅòzV=TÉšá9³ù9•{> stream xÚíZYoÛF~ׯ òRªˆÖ{ñØö©7GÓ4vŠ$0h‰’ˆR¤KR6Ü_ßÙK"W’u0rQ @ÒËÝá\;ß7KaoæaïrðãõàâU$¦Ó´J‹qªÿü%)–I>ürýæâUŒ½†L äE1àuJD±¡/” ¹hðÓõà¯YØ#k%`) ¼ñbðé ö&ð쇱÷ f.¼€`DY÷¹w5øm€Û†Å¤¥‡•$¸Ö¥VvÝTI1)ÙßÃÁ~ªÕúŒ ÿ‰Ò #H¹òréhÊP„¹±\i*Ç"J¸G‘ˆ…W¥Þ´¥ZWÚöÑÍPŽ‚8´/Ђ‰œÝW¾qKW¾uë!ohË ‘ â+(«V3Oß|4ñ„¸©xòv8ãÏ—v°9Ó²Ò7:/*“IFíVVi]ï·?¢ÌØv«Ÿc=1LŽ7¾\6wKcPRU‰Ñ¶)&>cLóÜþ!kæÛ÷Ç{E ‹n<[åÃ1‰CíŒNIãÕ´uÓÊps¯Aí[ ñ‘“zÓfYõöÜ#A|°ª«™-‰»÷ÑÕϯáßͯo]öº‘¶õr<†¬š.sd”l÷F28 òˆ ÓÝæ(MòÅÍ$&˼9©7 €éIÌ:[oyЫž ¹ùý»¿²‡÷FWCò©xŽË¢>·Çó¤êfT ‰de°?8éв­©äd¬Oj· ("ük¶[ÇÐ.`ûÆÏÂOx$6•þ25%«HNA÷ Ô2½[e!–^ÿwÙCûü(Ïn«ÄB_›JŒAÑ&=pjøú°§†GÇÛm%vÙÞöéÛem‘tƒ$ZÇ)|‚B­wË{Ë9 —wRøc7)²Æ°‘Ú ÷¤,¾’Ø7‹å$›Ú5•UÓ’:+Y?Ÿˆ7³%@ÐIÂbhAÂè|Â"`Iø|ݺ#¿†ôWöp aQ)mêÎ&0@³ Ñžêc¨paŽ8àî?‹ÛXd³¹’}ƒ5.³²œè9*ðReõ¦@Õ!%cHüõ{À W„€ïMÝÖÕ4ËkYã8³.£üi—QN¤ËæeÝ<á0ßUU‘k“åJi™¼º/×åš«®.S]Lz1–MâúѲrÔ‚€‘ ö YÒqäC9Oõšfž4Z’I|«ªÑ ÖWÝuÊyU¶Xhˉ¬üŠüoñ—…5 ­Ž/*X‡vñû½×ég–´¬_¬2Ëe2À V`h$M÷¼a%b+»é`½CnÎŒò*¾Ö-`_õþÒcÎÙÉê ³Çkƒç+‹¾{ ÏíÖûÉxM«ôÉ@Ý>:ΕÇ]­Ó§Sa_•ƒ@Ÿ´oI~ôa£HJ}.ÌïŠïù½U=ñ©ü‚ÅãÇó[›Fռ팽“jý¯}X£ C»p¾G~ÏLé­ìŸ(ƒk,žù„Á®®³=È¥"äYÚxŠCD„ýa…ªŒ46%— §9„'Cà™iaPf{™Óbæ_ëGñW¨&hr ºÄl-KA > stream xÚÕY]o[7 }÷¯Ðãö`Y¢DJ‚ý@ÖbÝV4°-èCšz]ÐÌò±µÿ~‡´¯›®v¢´^‚Cëž+RÉCɹ†æ‚Ë5â#ëÿèjÓÿäbJ*$KU!;"aGb#âR0pq‰ñviim”+eÇ™ðˆ‚“**`b{È5Q•$.†VT*.Æl+¤ª“Ss‘Ì‚ ™ )Â(J˜?©yf 1GÃeHlcì"ƒÎ6Ül :$ÙtHU33tR[2t”BÐû£. tT1t´`6c¬q„Ää(T]Q†gÈÆ²8Jͤ∓ºfkŽj¨ÐÁÁQÃk2œi¶0»Iíc¸3µ™áaŠ6V!‰5—ð $¸3%Ö1‰š‘K9«¯NÙ|*ÐÁæS6Ÿ tˆmŒ@‡˜Oñ‘ŠùT £˜O tTó)–tY £6õŒL-é–tºí1êz –ŸÌ»K]ØRðTHW^ð ˜-úÑ¢¾[šã`QÇ2Q€Ž'ó¦g¶È«É±ˆê¨ˆ¸b+ÇôØh9D2/liÃ``S$#'Ñöa!Qt-;!Û߯ØpÉâ’,¬¡!dcÍ Ãtd]L УU‚VÇ6Y"t48Q„ ‡± m%Û´•fcЦa ÚtùXp ‰“ò©lž6WˆÍuÁ•Ôx´³3š–Np€Í\ûÀ‚âW[§ër¯— `ô¬kÙ~-8{Λ’%y®©Ìä…r'±#mØ"™¤|âØ N¾×díQòz'Æúuî ¡K’¾º¯åSº¯üÅt_ò’ÊËÀûeàý2ð~x¿ ¼_‡cbމ•! BÞjoÑ ½gÏ¢7˜Hk¤wAÇV¯æù_'ç㓃³³ g|xp|üêàðíølú?Ѐ ôžkÅШ,|‹ Ýݺ¦¬X'pëGÔ¶vOýq1;ÜbKÅÁ‡KvÓ¸¤+íúé—§O¿{xÿÙÞ÷IÏ•zݘQ2¹ Y¯) ´ÜÀ=[Ü2jäÇ){Ažv=0Ldì\ü¬Ø~3ÝjHe¯×üŒP*zýÑ'ø ¾®wRCÒeξUY%]^”¾ÛêQ•‚XؽLGs¬÷ÐØÀ&ùîýk¶Uo Š1ÝbQJi*ôƒ"£ùKÌ@˵֌½ÇOð7þù‡Oòßè¼ÊM®¹.£¯í’×7^s­oºæZÞx͵¼ùšk xó5×Zð¦k®uà×\kÀ f$ʽ`td¹ô‚ÑD&éWt‘¥wfpvеloç¦üL™{Á°Yj/˜}äÎ’ÖƒÖ;sQ?÷.P´[ïÄòšfý«øù¥-~ù¨o ¿¤oaÙ`ëïƒK! B„<<²Í–{ÕÑ¢ž•üá†ErCçTnŸ<™âöà‚ï‰o@ÿˆ°Î endstream endobj 4947 0 obj << /Length 1750 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯úRyˆŠE©{ÊÚ¦H—f[âÚ"P$:"K©.M³_¿sDÒ¶'QêºX>¤¨ÃÃï\H~Ç6µ.-j½ý6íŠÐ Iè3ßšÎ,î?t-B+kšXïí³yZÍÓñ„qjüy¤:§r&K™ÇR=¾‹ò&ÊÆ§o÷j ÐwQ¡' <˵º¥0Aö¾j˜â¤ÑëéèÓÈ)j9+0ÕåV¼½ÿH­Þ½µ(ñÂÀºi%w(a®ýÌ:ý5¢ë†Î£“;$ô–ªµë¼”Q¶8Ÿµ‹ò¼’åxâPû3¶ˆðå>N “’ãؼév‰ ž%\N¸×‚Æqîø„9žÅH„V)­ÙÊ®¶Í£w`áoPŠ”ÞV¿öPW¿ñðÖuù$dá7Û*,/-Õ9Õ¡…¶¡õÖCË „Žm ÂК8„û¡úEKô—° èJ´›+*O0E:K¼Ÿˆ€Ò6cîÓ¼ÜM]l®OdÉ pœ¸Á:´y”'™ì!±÷†æ«ãŸ‰Ý¥SWÿ–é´5Øéäú.q=ƒEþ@>…ƒ&ºÉ´)w0mœ_G 2Ò`‹S¦×Þ{øA¹)òÃ4Oàx ¹Ýîìú6l5©çyQÕ{pxRßnª4¿T/?H”iÑTJl!ëy‘T$Cf¿lJ¸NêlìØ·ê} EMMó8k©çUuT§±zùJÙeSÂX‘«AÉŒ4nÆJªíá˜Ø8«ýØÎظ»Ç·ey®´uonÐp ž'\-\çK„~‹ñÕÉ™ê< …’äÕC(HgpÿСëI ð'!uûg\“ëAw=Pnnë=üƒ3’ÞåYzQFå­zÐ+µýìªuÿâv'Ò<­ï³úa‹'žKp g‡ßßy}»9aÜlw`$1×óh¡ª kÊLè‚]Ü(œßÁŠ5í›s¦aël:•uSæÕfÜO—Ѹ ¢Š›ÞÄY‘jOþ>>V½t¦Ú¼¨Í´&OˆÆ·N»ÐûÖÄuàrÆ»0Ó¿Š{q8¹…çîŽ{A`ˆ¼]–=ýÛ]–Ûƒν8´T°ÜK ¦^âAæÕ&I}qokö%’/ñ-¸÷`S0¾»têêß2¶ûîq÷Qî%†R/ñ­˜w(JýïÁ¼¸#VT1/—‡æ´Æn{Z»>Eæ…Ïxh«ž&^Øm eEqÕ\Wpª»oGq\”ÉR ¯.JÊhVORYÏ&WåÅäæ²m`³M²"†Û{B]R©µù®°ÏÒöœ¨–Mzõ°ˆnUçBvh’¹¯‹b&“=cYv«jdsØÖs©:Ænè¦9X¾Ð”Ô2­PÕdµ‘Rmd^%i)ãÕ¤¨®£ø ,ᱺÂè¾LNÖÖ¬b™#}ÕX;U@3½xÏS‰4WQ¶ÊhÜÀ™§Q·œëØÅLµ˜œi,ñÖu¹}cS«W7i=W½¸,ªÊàºl*-•¶-SÞÀc²zº-=¥Pm¤U‹ë²X¤•LÌ4Ð~q©g¢)-À‰­ÑZ¤*r uIþàÅu™æuÕÑ3†{=*spéÞ&_TÍ奬ê6ò-‹šGµéibÕ´ô@ñ¢É4µŠ’¤'v\ÉçȵVüÝ©üö\³Ñ~í Ü¢•†¥yUËHQ›7lIWŸKÓqÔEËe„¡\ÒÛ%¢%ÿï䬶)Ñ k.K-žêu#-$üP¦‘Ò"ªù·ÈåŠuª½äqK I±ˆR­õàìÕ!‚'/ÿx÷¢cš¾ÂÏ•Ê éF¢*™È’¶T£öÑ –VÔžþ3Ugëúž©±®†Eyµ äÀê|wpúûëéÑÉò¨ö*‚rï^ýŽ\ ýЮ†ggǯÏz+mð˱¬Mðt:6××E%û‰k­7 f[TɽNàâ,…‚Wõo`ɪ[D4F­–×ǃæäy/¼êèW¡/ֽ낣ŽÌ2èµÕþÁ„)Í´O,o_lÊó®³7©_sç†ùxu-7w®­ƒϵCÒÍðÀ¶üiØÆõ³8¾§8æ?‹ã§8^žòO¯™ÌÞY}Ì\A <»ªgºê·+g¶†:¼8f…sC|×&Îgéºtâýp¿N0p÷ÝeTWÿ–)µ5Ø'TÈŒ…$ð‚ÿ富Á1-Ø÷¨‘eÄï”È÷ÙQŸ'éùÞR@´Ã¾Vg?¿VÿÉvÉ–«oú£„;‹z_ó?‰ÿSv Í endstream endobj 4969 0 obj << /Length 1598 /Filter /FlateDecode >> stream xÚÍYmoÛ6þî_!ì“<Ä I‘µ}êKÒõ½u¼¡@WŠ-ÇBmÉÕK»ì×ï(’¶$;‰mÅÅ€<ËÔñŽw¼ç9;7v^ôžŽzç—~à(T8£™ÃçøŒ>qFSç³{5óyÜPŽÝ'^jaÍ¢,J&‘þø6LÊpÑÿ2zu~)±#A¡ð”BæS$™ËUº(&ð‚/Ýs=P¨—z£Þ·YØ!#àU;“eïóìLá»WF,ÎjæÒá#ê ÎUïcד¤f‡ÕÉ ˜¶%¯ügQž.¾ksþÆÃ?©lÂ(àJŸ^´,ô™ã{qVY¨žs"%Ì¡(“EάfRSÛî§Û P†¸v­˜¨Ù]õ›íhê·Û¹Ï u]4xc+…Ù£…¡‰#Ä«Š#«Ç‘úHú¬ž ãi’ë¸Ý©Îù<ãVäëïÀ âI˜¢2Á|³­Å¤I^쵘;™‡Ys OpÈkê â"Ð.üz×ZyÒ©Mü7M¢–ÅîÙ¾éJ<$¨ºljêï˜MÝ#›<á! X %\oq'ã=ãû­Œ²ÛâvµUG~ß;2 t‡BÒï,íBÈ'¾võ£2^Wðçï®´`Nán”é'³ÔÓ°µ”Îôh?¿$Ø«m,ap>A4e¿±Im»ÀØ™aaèSîþH¬ I¸Ü¹ŽÀHľlGk ç‡Ú9¨?ðvŸ•ÀW±0Þ>´&S-\ û»mÜÌÍ„Ì@^^®ViVDSÔˆ¼²°žb* "’ÀÁQ¯m©lXÊfšú[KqÃ)‰(¡™¹k·qR‘;Ób„nÌürñéÉÛo.Ðûá‹_îw£pNÀP¾3¨²TÆ}Y‡¿R·e¹ BªÇo›¤U™É°[ó̈W¼„¿1$õX…Ögn;J_³aÀD×þ mË0*ÊLcJË;€}Âýý³+qòµQˆ¦ös^4]¯ÉIšMsã›=ïþ|óFKñl{g”ê0^˜ôl±¡óãâJFwСñ,‹¢£8÷9Ôy:NÄC¾œ ÅZú»¡Xwc÷çD\H„©‰æ÷4ž> `h³!ø6%ÂS¢I˜›eyÄä‚ Ÿÿ Àä 0†úõ< ‹tу‡v84€‘ÛC¬¿=í×·•£Än©mO….õ 4àfÃîGÜ„³á­RFdåäÁ¥ìàx»¦Q8rÝUÓò°*‡Ç4GYˆÓÕ3Æ9Œädõ¬¥¿[=ënìþõŒqY©¯" œüáºB0ÝÔ3úv!ãxÏBÖjÙC9²e›§\Ý´1XÚgÞéÒ£©¿czt6ö€¦1À;¯q°sÀ_‹7wgäÀR&׿îH¢ƒ`Š1SìgࣸºV¨ì~–EkŒ2ôÕ$~üäòÂfÕéý3$½‰“MZ·Ù1CÁýóÚ=£QÞÀ‹¼‡IœÄÅqø©H²zÒhzlBÓ,º¶ÓÖ«Úq2I—+®ë…Ñþ#.æ;TœÈP€bž–7sµíŠØVn|]AËX.Ãk{¥;«£h¼\-¢e”HÐ)ó5¨ÖT«Y¾q“f`Îò ZôÈ¡R÷4Hé9’í¢æ<´/Äü#.ô=¨¢'·­_r~ØÙ:`Ó&URéSZ¢kSüþ«^ê#ß§±yxÜŽe7kå»~gP00;æñÿ:’1Å endstream endobj 4990 0 obj << /Length 1823 /Filter /FlateDecode >> stream xÚåZß“Ó6~Ï_áÇ\‡ý–Ü>Á(”¶ô¸>t€Éøçâ!g_mþú®,)±ä.±1ig`¬ØòjWßîêÛõáà&ÀÁ‹ÑÓ«Ñãç* BJ*ƒ«E $’! TWE‚«yðnüv™ËäbB?yóÒ.ãEœÇé,¶?‰Òu´ºøpõêñs %3¹¢HsËU²(¦ð‚ÒãÇöByh^=»ý5"0 d§¼ÊD0»½û€ƒ9<{`ÄC|®fÞ‚`D™„ñ*x;ú}„ë†iRÓÃË…ÜêRTvM‹hqAð8žÎ.(,Ö·Vµ÷X`øO*ý0 …‘m./ZÚ2¤0“ˆ(j´5÷‘ˆPê0Èã`QS¯)íðÝý¨‰Ì/`3»¯|·5Mù~kOY¡.K¢†_AÙJ`~ØÁ¥Ã°«0åuL©F;gMÒÒvTNðnB0Ÿ†?`_á^ÑL#¦?pOöEùàh¼É8GŒÐ`BPV­ïŽIˆé`7o¥óUÜRdüèT$QÁ‡s‘¦üž.Ò[Ù\„I†—°˜B‚ÓzB›FEJöi<\¤3&˜!Šá0iÊï‰IoeÏÁK$4ÛÆ-£Ófìœ!ÌÂ*Ždxb ù‰UD—›»ÎÀI8~ìäPÀµä÷®¿²g'C$u§èlåÍ-¦ R³£ † 4lÃÖ2MSj8Èšò{BÖ[Ùs ÓI)ñI¾ÄíPc IÑ'ÔVqچͰ§N…NiªûЧÖõ(¹•B#E_¸Œ£9ð=®À‘ã™c\?]P1ŽVëØ>\äÙ­ý|ùtòöÉógÈ’]‚Ym» lw¨©g»[gn)BÊźYIa%G«U6‹Êxn5¸ÞØÛåÒOX¬ÓY™dé#;¨‚$¥}îç•ËØ>Èãâ.K‹ä:Y%¥—-œ¹°\œÛyefïÍc¯ƒŒ˜sëÞ5!!C\0aJÛ(xÝjÆ‘ÆÂ[ý}Krcƒ4œB¡ŸYÔê'¼G…»Öö ~¾ÉÄû-©ææ¹£}Iš”MŠ¿sܬ†cÉÜë+5­’Ž"´l6ÃåÉ6o}¢÷¬4r:ZÉàDáÞJ}àPm™* yx³uy·.­Uµ„_f¡” oAQ‹:ÝŠº]hvÓ/Êóhc‡Ÿ“riGilrÅçÕæ PM“æQÙ‘Ë(0Úf“{°Ðˆð.ë¶,åp> q¾×ÕM5‡„UÃ\µ³êÚÔÐë…Ùd!ö¼,TµÕ'ýCÁš†]Æå:O‹CD "Ôùz‰v»z ÿ¦¿ýl&VYgôz6‹‹b±^¹ôÞè!˜ÀçBàêêHaž¥q§ âR ×@àC<¡mÉïÇŽú+{zkØ ßú”%ó‡«ÂP¶ìíþÅ'ö¦û&Sð§ÝÙ¡‚õ6Æ”ËD} 6Æ…Bš;½¬! ÉÖ9„¤ýE6K|n•Û,ªjïÅDŒÿ†ª$½ÃN1=¾² Ël½r/_»5€]ñÊˬh\-‰2‹ÞÝ­P ˆ—[u»QE¼àšföºÊ`ÑÜj”Æ^béž®K a_*\`K&„ÀŽ9FîÃ[;pÃŽ:÷¹ÿ¤ÀM.öµYI™¯gJBå2rÇÁ2[Í]zMÒE–ßn· ÎÃëÌŸG¬;i=ù¨2-;œi¹9l²Ûé{Œéª[Òe Ž6\Îe’#¢È`9·%¿_Îí¯ìé9—IgiØ«ik(Ôt‘ìõK'!îÝ·=;åöëÜ2¸šl?˜Ÿ4å÷ô“Þʞѹ``¸¿o€ßŠ®Í‹>½]Æé ýö–üž¨õVöÔ üœo2†P™XîÓ²eŒ ÚkoÉï‰GoeÏÁƒAˆhÇ fYZœˆÈ~w*n¢:ÆšÁ7n{QS tˆÕ«Œá¨)ÃI¦Â‹ÙÕð[ R1 WLÞųÄ<𭀫?ß<;‹¾ýÏZizÒZo[Ø®nžD×ÞòSÛ8§4iê ³šÇé—™ );`˜¤÷˜SùÜb“¤7»Z³‹S÷T[™`W a(·¢ù#'(ö‰ÅؾvJGŽ!-[ˆÖãþ[ìÂT«vµvÃâ|Í&†ìQí, OêQéóÝtÕ‘ÊécU~m:ULDb$5®d"> stream xÚíZ]Sã6}ϯÐcè¡oYíÓ¶…-»ít ¼±;ŒIâÙSÛYºÿ¾W–¼ØN'Â;0eÆB–ŽîÕ½¾çHAWˆ ·£_ÎFGÚ ƒb ÍTXŽ´§¦èlŠÎǧ󴘧{ûL’ñ›Ç®q’Ì’½;8ŠŠPq (4Ñа\…Ň :¸ÆNžþQE½3¦r‰&×£óOMáÝ;D°0º­F^#I f\A{NGHÓ±ˆ6ì¨1%ÅF8[ŠÊ¯‹"žíQ2N.>'{TŽ¿^IéŒûH$_ZYH°‘Ý>ÞvìåX4—`¯°öÚ~IfT †MdPž YÃÀ6ÚæÞõ˜À‘–õ˜ÚÑ¡ø~sÚøõæöY¡‰¥°aæ Œ­ó+ä'>ª½*ª¢UajãlÃú%K§.b÷¡ó}£id€¾‹|s&Œ£„Á@› þÍ:–ÿ@*˜öt®)¤CûKeœy?܇#1Pcà:ÜùøÇ¾©H96T —)müÀL 6¶G¦pÅ1 Ó˜Ѭl6ôí–S(‹;…m ìÜfý¹wäà%Ó!E¤ó¼·È+C°Œê­¨ŠTòrîKúû=&Ç®$ºŽtÙqúæèеªaÿNæñò*Á-÷Ž(iÆ ˜€ ”õV’CµnZµƒU“ÆOÄ–3f@~dQæ«I¹Ê“ÚÒØ{5ÏÓ¢vc–å×q™fÞŸø2[•yô CûœAb Hƒ|Í$èx#„æ½½2õÈÏ?5"QfîY”Yíjëök7ù k ¥ˆS,¤ÞÌ€7qnW)’øOšs9ýÉHcnè`E­ƒVÔÂíO>d¥}ýI—åãìçX­Iú"Y#?*z’_‡÷„À|WÞƒOnºØ™ù¤VXp6\’´ñ“$ØØ-˜Ojƒ¡T{|tüÇa{‡XÔ;^k‘³ùÎÁR*¢.XmüÀ`»M°T„µjÀ.âbIÛ;­–Ò<¼ÜF¨HŰˆä÷*R0L…OÝ“$žú³èé¯Çþ4ç×À„¾ÿ·ÃÏáËI6­{ï¨}–g×®õ‘¶ð UÇ5n²›Õ".}÷UjeÐK‹‰§Ø/¶'ÎÓørÑSì¨neëG%"·EãdîÁ/^êÄ‹E6W¼g—N™Ò:9hƒ*9áò,]¦e›úï2äa÷Ƕ§¥…\yèJ!Hs½ƒÀkF¬éqvSGÄkä(éòê‹êìXüÄ¢ÔåM-0›¹ãznÓrîZËľ¼]|ݼo®±¦Ñ57 Ñ“Ôð²Ø”sS©·Ï¹Ñõû1ü\üõދЙõ`æÅéj2IŠb¶ZlÔ£*B*¯GÕ=z4·jf-* 0«!Å(7°ËZF]ü0ê 7¶¿à•£ywâË£<§ÑpIÒÆL’`c·Ð7Ü0Lˆ|Vj”k8"ƒ³ƒE«­`c·‰VD+ê{Pnü¶«[Ö@¥ÉµÀú»Üˆq)°`þräƒ'ŸÞJĆ#³®ä¬/lœ|yÏV4Þæiù,DãzîT¤øS€¹;ím/ƒÁèpQj·g0¶èà‡±E¸±ý £3vY…½«ÿ`Ð ÓŒo>\Ž´ñs$ØØ-#J }Tÿé¾òO‡ª?jTêáî";øa± 7v‹XQOΞñ]$4&ò»ÜERˆ€¦kw‘ÏïÎQ¾ÊÇqç¨_ïSœßÀ7ý{™€ò@Ä.ÿ]ö…¤¡` endstream endobj 4940 0 obj << /Type /ObjStm /N 100 /First 987 /Length 1693 /Filter /FlateDecode >> stream xÚÕYQ¯S7 ~ï¯ÈãöpÓÄŽDB“ˆmÒ&¡ÁÃ6Äøڥڂؿßg·½»@ ©èªMºWõñùNâ8¶?çœÒs)”ž)d®&p ª&”PpA‚ˆc4h38´l*¡)™ ¡'{œ4t¡ „zwM 9uHÍtœBÎl:Ϊë`‘ë’º®Àªì:$®ÓK²)`o.Åu˜㛄9ÄB˜Cšé ž¨X'V€'ZõEµ@‰|Á=Pöe,}]¥*˜£'Ýï§lwá ÒfãI†³Èu©º£l¼#¥©ë$PO®SHîM,†zÌ!-p*®ëš@Ò8³Ï+ªë€Ф¸¸7à}–n#+®ì¸¸¹-¤T1‡]&±•W¸$õf.sqíus v¥ê:LÄä:\²º®‡² s]‘†9Ì%’\‡9¤®áRºë0‡²ë0‡Ún›\Éuoc³"ÜRöuh,¶ƒ¡fsô¤ÝÅvKñ'0¼ˆ{¼Hj^ëE“ã0ŠºÇŽ¢Ýu-Hu÷©Ù”)iœ&0G«®ÃH0ÇÆ4l€¦ì:$®Cfääº >…Ô Á§zPBx‹=¦óî2Ñf©Z6‹ÎA`H´"l!1r®ÙxˆÝšÜÄnMêw{@`Ã\»Q³˜Žr¨”òäÎÉôñ_ÎÂôÛù|±žL½ù}í×?^Íÿ˜Lï.–ÏgË' 韞N¿Ÿþ0½÷$ûÅdúóìÙ: Óïaz?|µzu…¿‹«ùÕúëðÍ7ü}¹!Y9 ÒŒ‹FÏM–X±×(±•ý†¼œ­Ÿ/^_^Íç—¯g'4%KÌØxæ-hs-1!‘ޱu>dÊ«Åj}bCJ‹Œ|äí&Qª‘ÌQÏg÷Ù6¥×ˆbB"µÓ YÌ${ y±œÐ‚]œfÅÞ´›0ÍUcjå˜0½ž€8lôŸÃô—_ Y##§[m˜¢‡ù›ëë§Ñ¢Q µähú10bÙ˜gÜbãQ0!;PÙÇÀX¨1ý8Áf›!°P‚ GÁ¹D! ‚k$”Å!ð&L]ÇML2 n‘dÐÏ$HÛ.£`Šet$â¡:.ðsùÀÏóµgʰ;¨Åz~§´“ÑïðV6®ÝaÐà…†6f‹B³“Á¹m{Y¦—‹gfÈÙ0}xÿA˜>ž½[‡§ï—‡—/g“é=3›¯WÖU{Þ²}µx³|6[mº"×ý4{~uywñ.x.Ѻ׆ l™ÿðr‰AÐZä¶Á{Ya~oÍ,ï·Bß …wBqáéi :¦(ð¡6‚. ÿQ­O@éDGô©Jµœ]^¿¾x±X^¬fË·³åÅ‹«ë“ÒËG×­{#®QÅzžŽ²ìù|uúÚ® ;4=7Å]¥GÍçkAvv½boì`O$9¿!Hÿ§)Ë­D´•G³ºÌ[l—£5ª‡Ùî6ú³l·|íö‚±Ý>ðA¶Û–šb΃ ´,Í%‚+\7ˆÅoÂql †‰MdŒliµŽŽœcU9Åö!ËüW‰CûÇÄ¡õ(âèM?"Í[vÀá{+ìøBOÊ–ë «Äª1~ 9.0Gë(µº*¯×oOXv’9h”ˆZª±ø±œ`Z=«)8`ж£«æ´ýD]L9ë©}ŸÚÛ£í QŽè)ˆ‘!õ“v¬._Ì>*ÄÚŽ9vÜF¶ï,Ä{Á‡ ñ>ðÁB¼,PGÁv ë: nÑ’w\ª‘ê(ØJ¼ôQ0‚£´A°4©0ælÄ? NvT¢Ñ‘ÁŽi0¨w°#Ž„PÏB=}L­}9=ÈŽ t+´zRVØÖ?eœ&pÚÕ?-8-–~þ¨™"á¶-€ ÖÊ’)€§qµŒcß8„:á_n‰[?¦%¾þl%Þfë(¶Ç"£Vº„4jE®&'˜Üx ¬È¥2.ÝêÔ0Ù¨< .±Ê ˜›qø Ÿ¹âŒLÃàKnƒ`0Íðv3~eZ`qŒŒlb3輂9£üï˜I¥2tå ™Ã?™Yþýg+ð¿Á‚ÖÁ¿Sn ¥-ë_bìZxRT×vcã ƒfâü†dt¸ðÂ!¹ ÐÒ±oSücÞpÿ>ú3Ô±Ìêä4F£F£`pG¾]ZÿÃ’Œ endstream endobj 5044 0 obj << /Length 1531 /Filter /FlateDecode >> stream xÚÕZÛrÛ6}×WàQêX0®Ñ>%Ó8Í¥ik»OIÆCK”Å™LI*©ûõ]€DÒ’L‰–ãÌØCg/XœEÐ "èõàååàôLi¤±X€.gH8Ð) OEÑå}^Ì“bžŒÆL’á‹?ߨÆy<‹ó8ÄöãïQºŒ£Ï—oOÏB‚Bp#P(†C¡`¹J#&¨pxjLh3iðêrðÏ€Â(‚èLåMn?4…ïÞ"‚…Ñ·jä-’”`Æh/ÐÅ௩+Ò/SR¬…ÅRTz]ÑlDÉ0^5,²ODø§<‚µ4¢Íãu ,ÇŠ¤¸ÄRT`M¿¤fT †u¨Q£Y ]SÚæÞû 0eø¬`jF÷•ï,Ó”ï-Ûe…º¬k¦l%0¿A¶qî\ ®«\*ê.e ‡JÔcõ**R縭òÐDZ„Ô¢ Š€¸1 QF`”‰÷Í}A~ÕûÓ¹¢ )–¶Ú&Gb¢ÚÀ h úK×d L«>!ÙznÏ„@¾,î×qé’ÅÅLmóâÅÙ+Û*Ê|9)—y<µŸgyvÛ¨þ;™GéMŒ&8=£¤Á¬ oš 6%D#ÏA?·$6 1ƒüâF®°ZXåæ z†´Ø $*UgÅ´é%:µâ{þª éôkÚ¬Ô‰íÊrûüð÷û÷nþÌ>ÓÌå·Gá~Rä–ŠóÜwe“‰ ìt¯gô±àXÈLFaÿïNéWÓ8?(­$€DÆŽ—Ö¥–8`ühi½%¿_Zï¶{Z—º¨£ IZ>œÎ)aòyåúVN×Á3Jé'CQ†-Ršò{FJo°"…’e‹)˜Ì¬‰!µüÍRÓ][ý ¬5¹üP‡)ó”ÇsXS~O‡õ»Ã,ªý™ü_•íM†©Ûcà±Eœö!NRAÐ'!NRh¬`j…ü×Wç# p^¥“lÛ¶=nMkÅFðh,^ŽB8M¿$“h±¸«T£Þ:´–«©µ¤x=‚Že²˜6Âuv4’®¹, O3­2³ÏÕt×=ߎÓ~üDË‹Òá¨Ú: ˜+æi‰Ûl-SâlE]<2P:›D¥‡w}çñ$Q2ôÀx“BAÉ'‰gËtb¨Ú‰gŽ…&ŽŠ$mN”ÇÅ—,-’ëd‘”wŽ”8Jc ;¢bÌcžÓØó‚¿]kMã"§XÍlæãõŽÀ©8Ú:p¶„Ëp·~–ÐJGheËÏ %iˆÙí­#ûâ w”ç‘sÒ·¤œ;æ˜~[Üm´@µé*Öi6]’Þ4}lÂú ™Í  ʾNBmÆ.pû}o-AÚWÈc{PótkV#@±©Mç=P„û—Yjäâ·7ðwõÇ»UùÎs€‹ådÅl¹xŒ‚àÊ û‚ppbp¼¢€kÅÕјCK~?æÐl÷¢€k0µÄžEAåþÖѧØãª#gQýËÂñ¦ÂãÅJS~ÏXé v–ÉC‰Yt/ vxK5Š‚û%ewwA”ªç®¦üžîê vw)à‚Dm- 6noSȃ7z~„˜ð§àû\(L‰®ñ}K-ß7íwç/Çë+¶A]]–%åîÛR8ýÈðͬ&xuîWG_”,Š“Ém®ÙñÆÏóãÛ(I‹ïzKûLHn‹'¹$Ñ&¹Sˆ­½ù_’îCõ¼æÞ±1X…åM»ÞUGd°«Õóᮽéé¡Ô”QÐ:8âkHFfäx¯![òû_ýÁv§¦ŒH,üÖ×,™>|xU×Ð÷¨éZúCÞWS ‹ã1-ùý"¥?Ø=˜¤%,ù!o¬M˜‘}_ Ó’˜ Ÿ‚ñÐ@aÎÝ¡ráYL?êÑm°÷ð.záLYƒ–jBÂ>à„núÂßhe–·Þwñʦ_ô0"ùAÏÿ©A= endstream endobj 5071 0 obj << /Length 1602 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×Wð‘êD0îÚ§tj§éeÚÚ~K2Z¢"N$JÉxܯï‚’–J“¦íŒ=Ip±‹³ØÝ o¼};º¸Št ‘–T·‹@H$5 " mD‚Ûyð*¼Y¦ù2O¨Àáóß_ÚÎu²HvI6Kìå¯qVÆ«ñ›ÛŸ.®”ÌäEŠG0]%‹b/D*¼° åÚ¼4º¼ý9"0 ä£ð*Ál=zõsxöS€×*¸¯F®A0¢LBÜŒþá¦aŠ4ô¨e ‚4·ºä•]Ó<^Œ 茉ß'V³×X`ø'•ziaD›æEGY†"̃ˆ $x¥¬¹/ˆD”ð€"­t°K‚EC»¶´ýwO@9JÖXÁÄŒö•ïV¦-¿^Ù>34eI¤©>ƒ²•ÀÝÛÀv®¤])oBJ#¤"‡iš°ƒr‚W‚)Æ ø ô{ó=3 áÊ Ü“Ç’ê­Ñz“qŽ¡Á„ !µUë›C"b*h \ÆÙ|ÕU%|Ö× C’FÃùH[¾§x+ÛÃG˜dˆq “Á¤DØE¾zùËe{‰)<í ÌÆÈÅòd´0ERªáÐjË÷DË[ÙcÐÂ^–Íô3óŒ|zkK³±aGw11‘ü»ž¸H­!ùiŸPÞiæY) å LJïMrYõ‡ËkÛD»™§Ù[{µYØöæùÕ¥í۾Ƙ®Ô²þâŠàæ"ã†"Y7â@ÆlªÈ8RXÔ‰ûÛŽÌ–5 Q­ë‘y£\p«~œ»vµÚÌâ"™ÛË»‡J2©Ñ$ 4Ís¦Ó,-Ú)ù#¸OÛ;á ™; SÑܵ‹! ±Hö¶XÕ#íª?¶x³M2Û[lv¶s¿K ÀñSXkì¶AíÕ!Ñb~‚Î}'o¸_W?5äL…]ÚYÐë¤(wY¾Ï"":Þj‰ÖÕ| Óß~¶—ébLEè¶A^ÎfIž/ÊrÓ7 ??‡X2aÊ„•_RLgÆúwy¹>©üô‰ÁÊ?ÁRB –,:òý’…¿²ýË?Á"D8õ+ÿ þöPu%  @šôp4¡#ßÓO¼•=¢¨PäÅÏXTôÆ„édÕåùž˜x+{ &D Z§ؼŒN‹~xTÛµxØž †‡ÑpÕwG¾'(ÞÊ æˆJWvÌ6YÞ’e¼k£!4"‘>- î‹Ç½Áå#Lô`àväûë¯ìàr -®ë ô¯ä¨ ·‚‚ÖƒYq!àŸXqX[‚+Ý›)ÉMf®Èƒ«÷¦ŠŒW¥{˜šj]‰ª6FöÖó}¯¥¹m˼2óà†ìGjà⮾ Ï m;Ìp`:W‰Ôs`9•¼Mfåæ›µÓ9ÞnW)Щôãm2K #™Ùëy\ÄF”á}&´ mËÜñIËŠ°Ðð]Uð`Ÿ,v›ugL‘Îì°¢~»^µ,ÐÞ%阄µð2Oæ°˜Œ¨ðv¬€ÙÛy‡ì‚ t<³Ý‡Mi;ëøÁÎzo¦Œ³zÎÍÙO‘GVsQNÇæÐ1åÞ™ºLWóƒKm¬¸—ÄóJ#Þ/ÓÙÒª˜ÎÊ`·–ÕÅK·N¸é2†ôfŽîpœ¦X¦®·(³™CÐ×n2' Ùöãôô?Éé‡aÈ•¸3Xiäœhå>¢Ý*|:¦ —üxÓl[ûܶš§}JàbiÃOm¸|Ò(è^Cöᥑ¢g´¡ €g°)DˆÞcƒKŠ3¸@RˆÜrrû˜ïü–µs 9kÁÚ{é«?ÎÔ°›º:þ8‡J…8ð8‡Šq>ÜqNG¾_ê¯lÿã*1Šó>Îùˆ'·KùµéP.ðËoG¾§¯x+{™¡\£(úG:Ô|îðKkG¾'&Þʃ äIUiýb§fûïÙýýñ5?`ðÛlG¾'¾Þʃ¯ù¹EÍvŽ9@¨!ñ> stream xÚåZ[oÛ6~÷¯Ð£=Ô Iñ"nOéwivéÒ Cцl˱P[Ê$¹™÷ëwx‘-ÉNb[u€¡@ Ê$uxÈïòû¨`ïÖÃÞëÎË›ÎÙ@*O!%¨ðn¦H(ß“ JI¼›‰÷±ûn糸קwÏß^Ú‡ëheQ2ŽìÏßÂdÎ{ŸoÞœ ì`PøÚ “LÂpÆÅ^A÷Ì”)ýRçâ¦ów‡@/ì‘ðªÏ½ñ¢óñ3ö&ÐöÆÃˆ©À»7='Q_ÀóÜ{×ù³ƒ« HÅÒ&'H1ëKnæ5ÌÃiàn4,Òá'Œé<²®}ÂÃbüÃHqm[¯ÞúHbæIŸ#ÎŒ·ºž(aE*P^yÓŠ{uk»k·  ñ@”XÃD÷nkß-MÝ~¹´ûŒPµ%¢ê8k f·ž}¸v˜vSVÅ”JHjœ°íxûSŒ+øì§1 _}uÝQG‚kÙ6V¦GíMŸ1äêõ âBYÏ~xÈG~àU:ÎÂd²åJ÷žqH|$¨<]˜Ôí· “ÖÎî&¾ð‘Ï ƒ^ÝÔ†až§ãEèh09L‘Áé0©Ûo‰IkgÁsxY» ªÅêîh<„"Pª“áѰßö΀‡P )%-ã4É÷Dd< ³:\!Ôâ¨P㛄‹-|õqüÓ¾’´ÍqÜ($KBH$•sý¯,.'zw>¸°OEjË5½€ç8±e~cÝMlÅ͇·È=΢íïãùÜ>\M‘-“qX”â©+ [F=»ÿÄy‘£Ú‚ž ®Æö ;RØoC@¥ªÓö 0/Ý ›µ ……ÁU¾e}rÆÍs˜»r>O+Ó­ŒeR† ©„œY8»ƒÇI\Ô©Ú&^ŸoŸùH×ô 8LݹPnó9ÁLì=ç ì¹yØ£¸ûUc=áŸO!'KÿÄ&5Ê­¯á#*ŽÀ%Nî–.T¾ö(ï†YŽJpLxNWqr릡Ç6Oét;6ËI–‘yÙPDÉ g+*3ÃBgßÔŸXHé@4€ªîϱ÷q1«NØŒ]›ôý&õ‹´9#ØS7£îœÐuT,³$ß•p|¥E»æ¿\¿áWëMfè Ì—ãq”çÓå¹á«ÒIç ƒ3ºïàÙ»µÓ2²á$,£´¨º“i'œFž=Õß°ßîÀoïìþÚ‰cXjˆ­6Úiƒ}C=)üOLQ„ =Yœ4ì·‹“öÎ@ ™âf«|~ñÄ‚0÷O‡IÝ~KLZ;{&$Š»÷Ø&à<ªçЃIJp°ÒWçôŽ”Þ4‰§OZÝ~KÐZ;{hÊ€ºc4þ7íO"Á-rrÏÍOÖArÒF91Ð3óçNŒ DVÒ•PSFÌDôî:Ju–‘Í—‘m˜féÂ6\]¿ìkší¨ ý²Yu2Ôß0¼jX7<ÒÈü5Ãsk¼ªI˜Ñ$¦º˜ÙàH¯"N Åe~NÛÈ/h/ 3çxåw «ãQ< gÎPi(Ç0\9sÃ*¡n•>h§A¢afnÅû„TnNŠý¤ý.¥8‰´3æ¾Á,µ#gYˆ|Wˆoé"ªG7]kafY¸j*¢$ÒÉy?_í\—Í|Í|¾ðTKßÇ% vOÕíwÙ ‚$ìÀ­f«÷çºÚ­¶îšØH«û¥WÐÊy÷q%hŽ¿¨O(AyøœžQ ~²xº:JÒ#ŸŸPR¡Ðé8IÍz;FÒÖÑý •‰ to}; ö”ÃmyàKةۨ ȱÓÝ4ì· “ÖÎ@\©ÞPi]~‰VßîÖËØa´•r`püYnü)ð$î»?xß#„tË]OpbÑøK¾Ôç›öžj7眩þ=5w…ÐPÌÂÂÖ9V uÓŽPs¦æ¶ézð³m!1£ØÕZ¶ µeEœŒÓÅ]XÄöÚZÜ!Ý4¡éªÔ'u1K—·3ÛpÜt¹Gsƒƒ&†c–®öw‡Æân-¢¤5ùÍ×ç¡»þ,¿[À˜z´’ܦ¸³8è3Ä÷ÁÚ\ì7& =@.~Ü1G±þÄàÙ4ÍÊ+ø =ɺ痿^¼²zŽˆ3UOµò Þ:Âq¡ÿ¼ª‘þ 16éç0Ö†ñ<šÔÁÚõ§U vEÌŽù˪ÿSX : endstream endobj 5122 0 obj << /Length 2171 /Filter /FlateDecode >> stream xÚåZÉ’ã6½×W0úbiÂBcå2sò,v´Ãv̴˧¶CÁ’ ‰aŠÔpé²üõÎ@q‘T%‰V÷Á‰E‰Dfï!Aê­=ê}óðÏLJ·_‘‘Èç¾÷¸ò”OüHxAÏ€yKïÃäÇMRn’éŒ+:ùê¿ïìË{½Ò…ÎÚ¿³:N§¿<~ûöëz!ô ”'¡ `8#‹Óþ„“·öÁe„zøÏãÃÿô¢k•€¿ å-¶~¡ÞÚ¾õ(‘Qè=›ž[O1J¸ðá=õ~|øßíN,d=™Š‘HZ]J3¯y©‹éŒÑÉG|¢N?SEáÇŒb”D …â㛚‚TzPDÕÄzÅ|™ô8‰ÂÈ+´·êèÕ—vºöx.‰ÏD3€̰÷XùÎ&}ùM/¡+Ë'þeÀbíÙ—÷Ιà4ãLÙu&HDûQj|æDy" >Œ;cDù‘íö7×c8ˆçÃ" jÛµ žà3&BJM¨œøaò1O–ƒÿá?Ø?.,ΈÏå˜È<Ï/xJI ;ñwYR%qšü®KXLLª¶/‡­€ÉIš<q±Ÿújò%Ôp:‰³¥m*ueû×;ÓÄ&u™dk3mÖXе–2}¹uQ佚çuµ««j¿ÓýÙÓëÔkU²òòFùØi³ª«ºp]Ÿ§°äã"µÜ$öb’d«¼ØÆU’gvKƒáf ö å[ûluYÆkc…Bܸ+’¬ÒK[¨r÷ܸÖr_¦ùšLg~·jZ'eUg Ñ•ŒvIZ~iËIeŸÛxß˾.“xåe•,lÙ°|E‹®!aqˆ€ÉrEBîÖÕ{ FËJ·µwCö=¦;ûß2{QEMÏF¢Q¨ .­û °¤ÚÍ?/^ˆhÿá§ï¾®Pó¿¬c“©RâæÑ…†™D‚oÁ3€7ü8ÌWSŽšÌÓ|§mKb0ðzÜð™$Ax?Øð©0^¼l äƒñÊ^> £n“_lâÁÞÎ}F‚FHAâyИ¯ºáb"e¤‚¾Š"§€ Mˆ–‹”TD„]íÊ:ÞK/ […¬Ìçw «üqa5^Ù ÂJø‚éÃ`>lˆ.¬ò¬¬z&>åÛ™Þ?Ž@D·9÷tœ]E;T‘0Ÿ‚v€Ú„R«ÿB›õpMDlÛG3!(p{‹d°lÚpáh²&€’û“7É6Þ½Ýÿ=ejò[Ug9YäÛ7fW6žâÿŒØ`¨w»4ij{ÃeñV·#%D÷Fêˆ5Üû 5röe¥·_ æ”=ádˆmÅáа0ÐØpˆ§ý˨×È8CLŸŽâX|ӳβ5#&¢PÈØ,ë¨KÇ5ž\ëRÇ)îkUGÕ>Ñ€=/Õ-ävˆ£ÝÅÓ° >Ü›†dC’ªëÉFÙáNxÏâÇóxÑän{O€!Ÿ#¥/ÏÉÖÌ,28Éí`Ú’Þ0í¬NSç]l“¬a×±ÏIµ±om(掚:\ܸUfBÃîÍ‹r&C"Ãf’Ñ}‰¤›€žr5yN÷'ÝzXÕý¹Z[¼Î YÛ«ø¤%ƒ71? ¹÷£~RpÂy7ŒÈ‡Ñ㕽œúIÌÕøìc4®v’%šHÊ“ Ü•âùï"Ý1VG°É#ÂCõ)Ø€¤h¨àÀ¦ŽWˆUº¨ºøè&_êþ)wSoã¬é/ã§ôx_ DÎjƒ ö3“…BÖã‡)¼¼‘ò,"úhqǹ –wAØìrÌf¶-Œ•±-–U\%ˆð{WÝî¶¶ÙB 6Á"«â$seÖHXêrQ$;›ñÀ~;f$C èÁLXga +]+ë¶~Ä?NkŸŒŠŽW%øTµ;xµg i ‡×˜”€ %–¸A‰ÅUŸ¿uatÑD]Cêr˜²¹,‡M§ó6.«t&qS—ú|ƒKÑàXžó*Ÿÿjhßþ&Ä”%ï˜ãæìŽáýrÜùãk¼²—#€ø671íùŒrJO¹?„™È¿)ù ¤$‚ñÏ‘|à˜pá÷#6ù#Ãd´²W$x(HÄø!NŸ_È 00Ç~³Kàïûþý\Ò—?Ò%£•½Æ%ÈWâ3'„vqY>çÅòfÿªžÁýüÛ—?Ò¿£•½Æ¿>ðÃerò»¾tÅ5.Iuv³Wd@ÞÏ+}ù#½2ZÙk¼¢¡â³§aã´ºÙ·˜Ü ÝÍ·}ù#};ZÙk|+)¡ApýŠCwŒYmx2¼#9í‰鱪^ãŽÇáð³\ouuô‰ÆåÞe–bßͽ}ù#ý;ZÙkÌBÂTÔýÀæø1Æwp,>>—\•žâp(Cþ)ÒS Ž}´¹àû·.L<Øüª…œüŠ_mNÙP±*ò-¾)s懊CÖÞñàe˜þ Ø€½MÂû% vG1ÿÇ΋|»Í³ÔɆõ†)—,v_@•IÝóÐqºí‰RíÍY;Ìʤ¡p˜^$?SÊõòÌDð€€év”3ù`ãFŸºá2‡Š›¿ÀK›ª1Å$³O›ä€—uǤ®­¯ vγìj›éïQb‡Kw£-í>qR—Ò>¶Xز5¼èx±9R©±KÔ™¤ÍÁË“m …c¬ZÕO|VÔU¿ùi?CrîÊ*ˉ$NÝ<’³—e8Ù_òªÍí8ÓîŸtÕ¶(ö»*_ñnsø+3•Ï5abn¢t÷ç¹Æ¶×æÑ½M uÉ(@ŠË“ÔaÓ3ÉÚeQ4_šµw„ÝÍê•$œóÓ;6PÎRAtCf¤­›«ËÛ'rê3d XBå-_!ÿEN^ endstream endobj 5037 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1682 /Filter /FlateDecode >> stream xÚÕY]o[7 }÷¯ÐãöY¤(J‚ý@¶Ý4°-èCšzkÐÖ.ütÿ~‡²oš6N¢ ®»†ÍKŸ+Q$ÅCÝ›³ .ŽN’ýŠ«í:9ŠM¡ŽJÓdÇøBq¬Õ„ê"™&“i"9 2‚ÀN¤i0nm|ŦÁ¨¥iÔ)›ch6DWB´¿Š«’M¨ŽB3H‚#fÅØb¦)›¶I(&eHÉn•©6îMbº„{S1]"G›Ž!e›·Qf/ $͘#aŽBMgëO ‡9jh:̱¶«¦ZM§Áqˆ¦S‚TšŽ›NLʦËÀEJ¶च5£±Ý!Žs&“’ãÚ¼«ê¢)Ãá¥ÍQ\Œ-4Šš‡rD‚š$aŽœ,2M‡QTl,:ji:Œ’cÓ!”9›-ˆu,lイM‡9*5権é¡s”dAo:…T,¤0RÈBàv¡ÜtÕÉ:ƒPY§¾dC™H‹VE­m†c%Lj9*Ò¨d³ %“­’.ÉVDÁ¾Ì/dáaó$Yqn:Ë~räÆÏ'–îÒ€çÿ¼Ÿà³¿'£ñc3™.V§ÅîŸM³Õü|²X×î¦ûeòêâìÑìƒ;5S…PT‹/õæ;›c°ª`Ã?œNgôtÍgfVã³µ ëu~fO»e4>Y½\¶ë§Ó7£ñ£ÙüÕdÞf /Æ??>¥va†žc‰ÌÁÔÿ$ð¹qMEžÛ¦ì¡îaóö‰ÿ8{>sÖw‹×ø,Îþš¼\]¼}õ½¹m'æ¿®ï(! fòd¥³z-å.kvoHÓÍoìˆ\|Mù>v´ä–ø1¹P=ŒhJ.ÍÓ×·ÂUôf+däJeêÇä«Ä^pñ%v‚•PŸRéõµP/¸"û°Æ/•:N%Ãdî lÍ^p+OÒ ÎžJ§›cEIåÔ .('èôºÀŒ„ö¥=:—^°zéõ3‡ä¥Æ½Vvƒá”€^ü‹ê|¦ëu^ë×y¡My×82itò ”r‘³íEAã„v–Q¯©¢ë ·rÁÅôb¹»ê“x4à¢VmÔú|/ð;:z_n5ãüõäüÍbõn‡¦ |[$¡çÃiAT}`ûEAißü8„ȺJ’x"añAö¢K‚¬Ñã|:¤ÕDUöGÔƒC(ãq%g©°Oá8„(öt`ãBãTwïŽ!‡«ƒúˆÓæÍÃUôÃ6ðÃVðMÃ60cÿdéc¡•R8ÁÑÔé œÓ‘¥Ü .Þ ô#x]zGÆQ‰J§3’e6÷:Ãz‘­MÀ0g”×Ò‰EZ—À½#÷k/¬’{Óˆ’zÓˆ-A?O£ÿê¹±ÖëýDÍ_ÜOÔ¡Ÿ¨<CcQå«4 Ñú|d$k"Tòþ ð%5¢·´¦—Ôˆ¢ò· FkÌå’ ¬©9ìÿ K h4æ3ì¡ º…{R-÷9Â^EßIHÛÀ7ÒVðM„´ |#!mßHHÛÀH> stream xÚÝY[s›F~ׯàQêD›½Ã¶OÉ4qsi“ÈêS’É`´²˜`P%U}Ïjwe@Ä–%Ëm:c ,gÏåãûÎ"\88<?U ’TÓy $’Š¡‚cH‚é,x?<_¤Õ"©ÀÃ'o_ØÁDÏu©óDÛÓßã|g£Ó—ŸG8ˆÀ dÆ )ŠxËmlQÁa4|l”+óÐàÙtðe@`ȵð(Ar5xÿ3¸÷2Àˆ«(ø¶™y‚eÆYp>x7À.0Ü `nâÍAŠ[§ª8«ëÍ\PŽ0ñŽÿ¼qÓÛíd-BT)?3Í—«Úf%.Ëxm‡ßÒzaGf5Ô±ÖvqÌ(bXcKPqíd¦ó?9ä ww¬]z§Š¹=Þƒó½yÕ2ën¦s¡ÃrµJ]UóU†œ“¤AL&&.$¼lE¡{Ç6L÷©¾¬,;}ÀÃ?±K!%ÌjæpÖ!,†B‡¤&€>–¹.ˆD”ð€"é)u0o2TËZÿÕÝJ~k˜˜ÙÇÚ·¤Ø±ïÙuŸš¶$€D݃³ØC`C窇Í%¤šaꉡnac× …`Šq³à4!á¾€»³kà cëIÆ9bÄÐRY‡~úž X4&º·¹íÊðѾðÃa@ôÉÐѶ$:Žvvt0ÉãƒLsÖlgvk|NBÕ.Üw+ž†²Yº]ð_ö¬P aC}­O_o'ÂîHü‰Ó§£=:1=;wj´â¯0zé¦5Óâ2/2}³Xâ@Ê¿¡×8ï*G> •©-jSãÊÛ2z±¾Yc-¤yZ·%ຸ·5A ™+­æÀA¤2‰6U¹sÈ‹"›¹è–PôV¶ (ZEÌÖí Ø³ó¦Ð™€ër•€øê›Û ïî¶åÙ¯ ï™·Ø‘ûûøOñò ç’#BÃÓi<‡#‘ÑÉX¼cÿ8?ÞÙý5j õ-‡"¶9r¨Ôžâkç6¦¶ÑÑmX´gC°+-TÀ?¬)8RY¸À]{eáT!*Ü«v¦k¿-ÑþÛ=ÎËâêm¹“’Ü/§ni°»¡jmcƒè˜õ¢ðûÐ~­Ü›Qå©7VýõØvƒrز×íoÝxòì݆,;…ÜÚìÍÀ#gÇ)Ô¾~½es«U…[jíASù(vÙÖeé/I¥šÀý³"×±?3'Üá1ÊŧÛáuìÇþÇ;»?û3"®\ ÿµHg·oñ”líðlÕ»¬NåÁ¬Î¤@£ÿ «3Jyò!XaÀˆrºû«n4’–º*V%taæ”A¿]Iêm¸í¾ÆÁÈLiSý˜ãp8…ÛYÕ¢XeîÙ mH`Eoïbm–oÌ‚Ëe–&žÍŠ íFim§ä…=Ï X±t×´·X»»«:ÍÒ¿7ø0CdË÷í7’[sÓñKדï(W—X½`mˆ•ì0ëçòzDqßaÅЮÓ1,Å ,Ò“1lÇþq {¼³û3,Åuºë*'·Ó¬àmšµ(ʪÝ|qûñ¨–þ£ì!¨úôëϘÛúÕäéøÙd2âxøfr-4û¶Ðâa[èR':5_$¾oýç%Û(¿ýÏ5ÉÛ@û~måhÌù±õæ¯ø endstream endobj 5168 0 obj << /Length 1765 /Filter /FlateDecode >> stream xÚÝZKsÛ6¾ëWð(u"oí)'M2$²onÆCS”ʼnL)$×ýõ] LB’-‘Q:íŒ=I`±»ßb_n¼¼¼<ê@#-© .fHj„®! .¦Áåð|žót4¦_|zg“d–äI'öö([G‹Ñ—‹÷Ïß(( (™!ÈCŠa»ŠÅ„jøÜ^(×fÑàìbðm@`Ȱ”‰ ¾\~ÁÁÞ½0âZwÕÌÛ@Œ(“0^çƒÏÜL‘5MAæ–—¢’몼)®¾æ×Iž(.ó«i’[æþÄÃ?©8ÄH CÝ\Þzü2b„L Á+~ÍsA$¢„i¥ƒ< f ÛÔv?ÝÞ€r$”¬7°„‰™Ý—¾SN›~­ÜCvhÒ’HSý˜­æ7Lª€^…*o¢JC¤Bkš•°½t‚Ë1Áãm pè7—ÃäPÁ\c îÅ6=wF ¥öb&Ø0 Æ ©-ƒ¿ì##SAcâµËá³Cm‘0$ix:SiÓïi*½™=ÀT˜dˆq ›Á¦DX ÇóÈC›ÂÛ6Z{áCà°1w¹.;†)’R°6ýž€õföÀ°€ÅÒùìôïäÊS2 ‘ºÛÄIæƒfœþo'µ†P©ûx}ïº7*ËPÅ)Ëù볉 ½„—S†?L^ŽÏ&“ÇÃdÃ1Á¬¡UB8 ‰®ã±³Xo?¢DM7%-,íh±XÆQ™Lííõ½½–ózÂlÅeºÌž¹ù™›™–îZÔ+·yR¬–Y‘^§‹´tä–3{a»*›K{&55aÔBÎÈÚ´ 1aÆ„À4(˜¨¡éU!?ðEÖ™õè¶´£Õe¾ŽËužÔ²ENÚùr1u§Ùl™ßFF7N5×FïÕðâí¹ƒqDÄð/pHÙMò¸TÆEiR€%*<Õ^— ˆ­jþ¢<4wi9·£,Q1¼[Üï´Œ¶e¦ÙMÙm}\Tª¨Ò?²ž´Œ#ëhqÚM-YÍä“*è#¤¬Œ9C_ ÎI&•í²SÈ1 ¸€C…Ü̬)VÜÿþþ®>~pö93p:΋u'E1[/œÿh¥Ñ†[ÎxÌd\çÑERvÊ£ Á…ž,à”'‹µý~±¶?³‡çÑB)áÔÂú}™NŸN¤µÜ“Gôÿûy´ PƒêÓ•\ýž¦Ò›Ù#Ò2¾™(Þl\EEFž6c1µ™ôɼ„ñ˜8ü™× åÐyRz‰LËÛ×1ß›³3Ð?þðÿ9qqÊl‚'—“’mH¶’Ç¢\Ö²ÖØ€;cœàˆº/Æ­l|3A²SxãØä)ôtái†4c'óYý~>«?³‡‡7¦CD)éÓ&Zåx/²|hhóÂw¦Ö%¬Á‰›.’®‘)ÐuÈOg%mú=­¤7³GD6¦àDJÚ1²•äɷΨ„œÞéRS~OTz3{ *!Ø »¡²êŒŠ$‹Óeýž¨ôföT$80Þ5 ŒÖeeGåv*x08#¬O×êöè÷§7³Ç€bJtÒÀ$‹¿Nc88«(ïÜÙfL#ÂôéðiÓï‰OofÁ‡SÄëDx>œ0ѵ½ý(€ÇÔZŒAµ'~F©Åˆ€$Í5¹?¹tk̸FöRf/RpvÜ*BìlÓ~6ƒº•gÆÓ$ÎïWU§ÒÜžeñ‡×¯&Éê“YnTT=¾›§ñÜ]1d×–#2ŒÒ…»Ÿ™ à ªÏ \[Ô=Mã¯#å‘#š'q’š÷ßÍ^Éà”…Ã Ó> L±GèÌ׺™‹™éíÊt[7]ð¼A§°,0Ä„v%̶<˜©÷vÂ,_ÞÚW›5-Vá~]XÙâÉ<‰—™­›»qWš'ò¬“½vª·M|›+“ÚVIÃËT’Y³+­sëv9åù_MªªÀKŽ+§Òç}dÜ¡\4~'áˆÛ¢yš©ä±šI³´Ü§’'ºç¦³Œ½ÎòCzºÝX”ßXN³M£ü»1Ë(O£ëÅc]…MK¤¨ŽoÕ@yýj<9ûü´< Ê·Vÿà!±ÛFQËðx{Èãñ¦làa90*e°­É“rp ä•óá;Ç‹Ööö;_åAì¯ jí¦ÊaP*„xß°v$ž°JAlS'vG<0­?l éÜÝBj‰˜`Kȧ$ MJ ú}³;Ðn7áj§è´R…4lÅñ£Õv—µN¶:”rîj¿ì}ñÚp¶ë7i±iÌ»ü$퓤ô endstream endobj 5188 0 obj << /Length 1415 /Filter /FlateDecode >> stream xÚíZ[Sã6~ϯÐ[“ÎFè.«}êvî¥-úDw2Æq‚gƒÚÎRúë{ËÆvHbÂì¶Ù!}úÎÅç|–!hŠ:í½¾ìhƒ 6Š)t9ARae8Ò®š¢Ë1ºê_ÜDÙM42Iú?œ½-nÎÃI˜†q?þìÇ 6øxùîèÄ#È@Å- Ð {BÃvK,F ,Ð^ÿ¨¸0aì¢ÞñeïÏ…YѰ”KÜö®>4†ß½C ã¡»åÌ[$)ÁŒ+¸Ÿ¡‹Þo=R7Ì£5%¦¤Øˆ‚K¶´k”O³QÎ >Ià?]’"ØH h/§-Šk"æK±¤hÇ%U˜Q6žAiˆ&5NM´õ£«0¥§Ê `jgwÅwþhâ—þÜf‡:–†™g »L§¨¸9w„€-)êd{ZÔ3täg± ÜFé66U3èPjZo_³jž§ö 5± {©g*=à* aªèÁºl ¿[—íNv{ñÌ(4aºªçyZľ¥ =ñ,ZoÙÜõ³|c”bªÙK4vj O¤Ó¤giùü<ÔÚ5ŸZª[}É£ 8€ÆÏ(Ì/[mý¸ ÕS×4ö©ú¶_ Ä¿ôÇÁû7?ž‡ó3»Ó£‡ ndZ§üÿW¼/¤ìWàëþ˜B@þ±ÏßRüDµ endstream endobj 5208 0 obj << /Length 1356 /Filter /FlateDecode >> stream xÚåZ]s£6}÷¯Ð£Ó‰IHBjŸ¶m’f»mw÷)Ýñ,ÛÌ:° xÒô×÷Âü±Ø„̦I‚¥£su¯Žrš#‚.?Žg®FkÉ$ÏXj¹®.Eã)ºÞ,‚dœŒ˜ Ã7﯊›k33± }Süù›®¼åÉÇñÛ³ E@éd€ÜeXq†Ë±¥ÐÁUóâ¸Î: Îǃ/ ­¢O$ «#?¸ýHÐ>{‹æZ¡‡¼å=”`æH¸_¢›Á‡©¦h…G‰)(Ö¼à’äqMÒy2‰Í—‚Ï_Dø¥9)‚µÈ³Ëeƒ¢ƒ]‘ë,xN1{.¨ÄŒrİVÅÍ*œêhÛŸnÀ8J–À4kÝßÎG¿œÏ6#T±$ÖL?Ù0ž£âæÚ&–'’WÉ\¬\^­Ð‰—„6q;ñÐíHpBš¹¯v‚&ÔaÐ&«ûÉ&L9& Ô{;R@Õ24¢XH]ðûnŒÀŽB•†h· úCÛrd€¥Ý.娏îVB@!dAûÒ¤… ¤ «ãË›Ñõù‡âYݯ7愊áßþ ç×B>» ¤šo‚ Öĩͬî*)ªrRVd¾oÖø+Ì´.[&i¼òÓUlJúž d-§Iq„³(¾÷Ò ‹Þ]´J÷ÄÓòñ4úˆÁRÑYuÀ3f§ïÚ…p[\ /T¨Öq­[–ˆõ¤ÌMhb/5Ó½9ªæp3¸ÓâQ×ßÿ|÷ÎNÓ¬¸†‘›Ç²(’ò¦ìäÙ‰4q\>Š|²0ÅvªÊ=âæB¢‘CaÅo“îÉÝ #ÃU°œ%â’H-ÖŸˆ -°dNo"ÞÀï&âÝɶq¡áµ6#Ó¯‹7%lC½'wyê®å«”p¦G:ü%$\¸»ÔêêO ãJVV¦^ê•êg×ì t!LßKŸ–±ojoàãO'vÚl±Ù;j*ôÿÝÄ‹l7¿\ÁÏä_×jÍÄÐJv²ò}“$³ÕòHýšø(å宋%Õý)/Q“ý¹ç:|7ÝíLµ½ìr ÃUWÙͲÞ4ÎD}3ª{Ú¶…€+í¯Hêø«¤3ÙeâH;\Â`*ÇÏgd­‘îLÅêÙÚ™.`èÃJÛL=MçØåýÙ©~Ç„u&{H¸Âå™ÿ˜IcŽ[¡[a°¥ »XÎÁoˆ±6œ‘\Kræ?Ÿ_Ûý9ô£©Ù´™Ûp*ÓIáÝ–Â-©•jc¤Ìm¬ÍF`wYo¹Œü§7¬»ÇÒR” f«ÐÏLÄià ÖKÍw¶Ø$Ÿ£0 î‚eZ¸ÈîÛ> gvjjJ%ð~g5¢ˆ ÕôÊ V#ªmkGµ3íc°Ï%?/Ž=›š‡ ]Ø÷`“9¬‡åãÖʨ×dÎë™meŠó ™ÞÒ.Ó¦‹äXÁb:8P@›—1•ô¾üqáÕM2ØNšÕå ž”ôm’'ÅQÈáF™)‰•Rýe押–úÚSøÝöÔîdÛ{eæj˜j÷¼ržü†_VüÕÙe&9~:b~þB©Áw¬“®T°^L‚¬ÕÞ+ïI•[sÊ›¯Yís%8&´¿W›~Çlu&{Hº„›or»¬òÖ•(B6:Ú`&(&ÕÓÚþl0sÀÈÚ°ÁS³aƒnt}b¤{¿·ÝŽ ¯fØõV?Ëν`™œîûf¨<]ÜÿCé„ï½ Lþã…-|¬„fPSÊ*±r¥}ó¾?u1§ÎùþýésÆôí˜Ò:³mÿ1ÁAD?æ&þgijª endstream endobj 5229 0 obj << /Length 1517 /Filter /FlateDecode >> stream xÚåZYsÛ6~ׯÀ£Ô‰`ÄÕ>5­“¦IGvŸÜŒ†¦ ‹‰Œy8õ¿/@€2II‰dZž3öıØÅ.¾o k€ÀËÁó‹ÁÉ ¡€‚Š.æ€qÈB™§Ààb.‡ç‹8_Ä£1ahøëÙ+W˜è¹Îti÷úW˜”árôþâÏ“irj‚@3]%‹`b9ÍôÍôc6"h˜F:Ïnÿ"†Ì?®DP1+Ü>^vÔ¥P Ênتkëæà¨¤™ó†~miÛk7' 2Jê œ`l{÷•ïצ-¿^Û}fhÊâPõÊV³kà ïTã¼Ê©AÓ©DBIœSã¤pþÚ)\Ž1"múßù¾9Úô•éjCÁ7lŠóÄ j¦œ™&`Œ!N½ŸvIaJpßoCÖ¥Õÿ²o,Y@ûÄbç¹*… S§öYVïŸ@ ="løÉ½\¼<ONß¹—0™¹B® W(âèã¡.àhL‘é¿Ð®ÅU0Þù®©{Ît”Ý}¬Ç×Ý[óÄ^“"tR÷:ÏÒUk˜ž&Ñëß›è›3;S˜y±é|S¼¯¹nªÜtÕÉ ŒšAŠÀ˜Pˆ8kyÖÀSs1±¬Ó£äÏ­u—(U÷Ì‹¬ŒŠ2ó0\,•ér–»bœÌÓlqš¸Šð*-}7gó+ü_´“kÝ™]‰Æìcbö·²1m,4zUZL´Q!Ùfe3¹·]ëžµÄJ·ó?^™¿éÛ×Þž¹«¹{ÉËÈFܼ\B?}õÇ…ãÀ„” R±÷] Ž÷„CäxxÏQÐÜÄŽ÷ùý𾿲ûã=GÂàªÏNnÓxöeÄW|ð­ã;`‘|´çjO¸¯;nÁûg{Æ!S€ep´0éÈï&ý•Ý#L(§ÜLÆ¡¤™ÅNÃ<Á_-Æ%&Jú°0Su fÂ÷¦ê¢¦½†yÏŠl¶n’ÀwNjmsZ¬&×6yÿor#0Ë t6¥ž¾Š´6³v‹Ñ~•IBvRY®“Y¦£ÛqY Ͷdìx\f­ðè Ցߤú+»?—°†¤}/kÏoùjÈìØ ¸‚†âŸ6f6“5lÚc Å ¸¤»ÃŠ­5k¬c›zÞZXÑ®Õu=s=ÒÌU¾ž<ŸN&£ ßN —¹°§ÛðÐ+¶­yy•ë›R›p“–¦)1GŒ áž™J3o™—áryçz”¹özY,©ÆD7eœÕuæÔÌìª[¼ÆØ,R×ë³KþÃ^ä7~v©·ýtaaã!¨OMôs|Ä+JÍNfÇ»±êÈï‡úý•Ýõi@Ö×ý@ßy¿ƒü‚|s§Jˆ-TÚò{†Joe8ÅPj€[¶îâ§Å‡"ßây… bȇùnKÄÚ† ªç°6EöëDðc³¶WO;æÀˆ6B'P00ëƒÚží,& Â;¨8 =Û^ù §wë䢋gž}á5ôÅa®t¡3Ï~s»¶U¿ñTÝ^¢Ï'caPßñQS¨®‹äNíoT8›ÅVÛp¹Ý+÷V®ÒY<¿ó>O“DG÷V^éEh¿ˆÝÆi™ÙMá}œV±é·¿Ü )Ûþ÷?oÞt~6+£R¤¾—¬¬˜f:\®”‘a) 0s´Œ …8˶Å÷#Ùުa‰ b²_>Vû½“‹U7Ï_Ã÷Ã}31lg½?<~Œ´å÷ ’Þʉa® R² \æÅ~7Ɇ²¶7˜‚X¨‡%jÛ¢ì L sRÝ$>A¦† Z Ev]K7Ò7Ó6¥ûqï¢E×éÝ AÙ_>lUœÌl¦óÎz×ÌÕÈóÖùiU¹Î@ïó;ƾDïbüµÒûZø¶_ ÙSº;Òú¤ÿ+ó‡£ endstream endobj 5144 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1470 /Filter /FlateDecode >> stream xÚÕY]o[7 }÷¯Ðãö]‰¢$j ôY‹u[ÑtÀ¶ ]jlA »HR û÷;¤“ÖYn:ºõË€ÀáeŽIŠ"¨›š©…j¦¸êo ÞGÈE%…,ª)9™†uhê’Y5%”:TàÀ‰U¿Ê,ªiGQ¡‡ZLƒ1ÍTÃ)´®ΡgÕP ½™FÃi*Ôg˜æò&¢Š Jî*eHö…J,™®@Â#$†4L+•M+UL×CnÅt©wøÀbr§ ]ƒÞ4‚’MRM#i, +Ã2Øz Ô5-‘±¤yi5P±XÚÄ2à)¤j)îÈlµu¤¶Y’‘jÝt°Ò³é`¥7Óµ@’ÔG‡7aõÑÒàP˜ñÝQ̼ QœîU²lK†Ô5!ìŸåûQtY`€,R!mbn,HÌk2°å\áå‚Í×¼à› y°ÜÄt°ÜÉt°Ü»é`Y²é`YlE0_FÒUTMcÀ!Ũ+è(eH Ö2…T iÆ )aʦCR³•£K2jÜ*B7…+6¾R†å– |`k¹iÍR†å¦EK–{1,w1, ™–E3IH"löR3\&Í$jR%øÐ’JÃtšX­D¢²I,$]B1.°«N‹¿éà’›þAÓi'4gµìº³öN‹ÃÃÅô(œ …2úúy˜~ýí÷P[Ôõ4ÊQ3¶zÿöíËŽ{Ÿçµ¦œ`‰©yÁ©Çœœa0XQ¨Np‰ ™p‚[¬NÃ%I”‘½`ŠƒÝàQV., ŽÒ†IJÙ¹>ê¹zÃh9t³\sL`9˜SL({˜FÄAp|´^]†ÃÃ0úÐö¥#zðJÙ–+‹¨×t¥ Ó¯@`žkÇNúé©à©Û|NÏÎ×§ÇËËp¦gŽÂôbùá2| çÅßï–øÃ«?—‹é!B[®./´ïÍébz¾¼X¿??]^lÓý¸|}öêÁúC8ш먜„3 ð%ü½:‡‘ wþþjµ†Ñ“Í©a٩¿Â0äb:~ÿÇ¥=?=[½YLÖ篗çæ,½œOO¦‡'Ù4¾S¬ >ºªãŒÆîØÙ×bs7Á³vß2~¦ï×/ÖöÍñã'ø9øù‡ïÞvü­fj/¡€|#)3ƒ6‰Z̬tˆ’,³±\üu†Ÿƒ³ÕÙåv VV,ŸÊê ç¨ì+\Væèi}Íe%ÅÙêžÃGœ…^ph4'8·ÖñÛXSq‚ƒ$«Ü#gö *ºz±¥ÆÚÈ –ÈÕ ÆÙŒ(ºœ‘ 7¹¨cWvºI6Û4t“ŸfIì‹ù¨Ém>jí«ùã׆ZÝ'qó(ŽÎ„q  1ÊÆDü9xóúôà´¼¸Ø?'apGÇÒGN¢^"²¸3'µ¾ÍIÚØý3œ´¾*½Ž½”`´Öàâc *^0L:;ÁXèÈÕ®˜)²3¸£DšƒfÁ‚ÉÔ™¹Z0ƲÓ2ëá2; Ï“V”‹vËÀ™â- Üˬœ}à^Q§ÎÂ(8Sp‹t‚k‰E꾦¼íñÍɶ_̪2êòe¬º$é»Ì,² ?È.ü »ðà ¸e½sˆœÀ’½àæñaëÓp•ŽÉfÂy@Î0üG<¼`Ü|¼»}'AÈ.1¦’#ãà&8oD˜àRß_Ï»fª}Üì(Ýîy}…ó•=¯o®ü3Á ôõü,ø®žŸßÑósà;{~|WÏσç{~ËújdT'XÓœÅk9Å‘¼a4\ZÙk¹‚§Ä¹ÛG£¾üôAjäM Ìܽ9ÁÔõÕ¨Ü$R•ÿcÓÓí×9Jü_y}"Úë[œB-²ý÷aàFO¬*®Kz]I‘iþšòÓ/OŸÞzƒcH»¼8¹¾‹þì( endstream endobj 5252 0 obj << /Length 1296 /Filter /FlateDecode >> stream xÚíZÛnÛF}×Wì£TDë½_Ú§ˆÝ¤IÛØê“,EÉDd!©¤ùûo2II¥¸0`cWÔrö ÏpÎÌB-A£_f£³sm‘ÅV1…f $V–#maÔÍæèz|u¦·ádÊ$ÿüç«rr,‚$ˆü üøÖ‹ÖÞjò~öúìÜdÀ â¹A¡6BÃv…-F9Ü Íø¬˜°ùM£—³ÑÇ…UÑ{p+—È¿]¿'hß½F kÐçbå’”`ÆÌWèjônDšŽÚÀQÛ”[QbI ¿n²ez“ÙMx«»4H&SJÆŸò1ø7‘þi’`+óòᢃ™cMÒö‘4Çœ_—TaFbØ‹’- ÛÖv_ÝÞ€Ip„Õ”†i¾ÚÕ~õ€ÚöëÜg‡¦-…-³'[L–¨œ\Ṽ³¢É,ƒK¦d6Œ²’¯½fÐ5°ÌÙ9ÿM °^Xž‡CõŶÉêMɵoæJB$34¥X*[büaŸ‰¹A…[Ö®Ç/úF#Xs>\°´í;‹3ØÁÂÇ\(ØÌ`ªçÇQÚ#` Æþ­× i1…zµE´M.Q‹áÈmÛw$×ì!ä‰bߘÜY$O ô§Þ ¬t“θWð•a˜hU ~•ªžÝVò^j1õ¢y9Éý›P9.”>‡Qç¦ÙÅÕôòå;Üzgç”49#hÊ–àe3Ùx7AÂËšƒ¬jˆ;[þ̬­W¦Y²ö³uÔȼʱÛx5OkØ‹8¹ó²0®ð{ÿÄëlãA9 rGÿ…øˆ–ÁƒîLÄ»Í3½Á†v_óŽ[ÌbÃ÷*Œæ¡ïeAºŸ¤,®|ñ?®Ãû¡ÿaµMÍ.ø=‘rü0?Sn0¥¶íÐ}hw<â3)z»d¾æR7Æ\ü²º±ûTp,e‡§Ëb%JwûE¥9ܯÚbëê×WðwóÇoUà-&LŽ•£kßÒt±^ájûfñš£RƒÙY¾ºV®RjØCW¹J¡ŠÚ}(½êØwÓ+w°ý+W)l‘æK×ÝU«}zU«„·Mr;\ ´í;Š3Ø  ÉØ0}ÚÂF÷dVŸª¬‘ÿQªI96‚î«jž+˜¾̳à_‚Ÿ-³ÙQ2/4¾bÀ*n¡ù2ÃPuì»eow°ýe^@7Çky¬5÷Cv|Ã) ÉÍ–³!b€²ã«&!й8Y5pˆbp+0±ü1$ƒë;/a_Ôf6ár¼É:ÓeâEY-§[™(‰ïH¼ý„D°2?ZnÊMW°ˆaÃ)ÓÐQŠá(;öÝ”Àl%`†`Í«²ôSο^Å[Õnøî©ïö{êÉõ{ (÷Çœ§“¶}Ç8q{@¿Ç”ÅZ³Ó• Û¬mW )3¤ÂªÇPf&Öfïu[¢IìÿsUîÑÞmÂ`û€šÛýê*m-Á»»·ºÅK³¸~5oàÞN]ä+ºWì¨ÔØ5œ"R¡ŠC •é:öÝ2;ØþŠH%Á”‹ÇêvtFœ=ÉΈB‰h¤yŒüK”èÂ<Ø=wAßSùÓçÕ—ÖÚ|Ï!Ú†´oÞm\Þõ«0±MÄ1? û܆ȥ endstream endobj 5280 0 obj << /Length 1220 /Filter /FlateDecode >> stream xÚíZ[oÛ6~÷¯à£=Ì ï—í©š`EW4‰÷”*˱ÅJ$9éþýŽn$;­"ZAôÁ .äÇsø~‡MÐ"èdòÇbrt¬-²Ø*¦Ðb…¤ÂÊr¤-”š¢Å]LÏ×aºgs&ÉôÍÇ?Ë‹³`$ÁÆÊÛ¿¼ÍÖ‹fŸ AÏ…fØ ÝXŒ h Íô¨,˜°y£ÉÛÅänB¡AôÑhÊ%òo&ŸZ»wˆ`a z(jÞ I f\Áu„Î'§ÒtÌІ5¦¤ØŠÒ–´ðë2»J/³ëì2 ²Ò¦ˆ$ð£…a[™ƒæÅIÇLŽ5Hs‰¥(ÌÌŸKª0x‰¶Æ¢$@«†]m´ýOw;`K£êJ`š×vůƤ_iŸšX [f`l˜\¡òâ¬"H+ÈM2™ÆFWlÞÇá²dìI t1·Š}Ä7B5J ÔË¡z³ UM‹¥Ýš+ aËМb©liÜ/OÁHÌ jTÜA»˜þÚ7)ÇŠéñ¤ï&ÎÆö®8æBAgÐ)•M5ˉo´´˜‚c­ v‘Çý½7s+@tPNù¤°+c±¦ºŠBñ@½³u%ã‹—ÓпžQ2­_†›n¥“óò"˜Q9ý⯽ÍU€[ptLI“ ‚ ¶„·¢$ºi"5…‰U¦ø­ØòÆ`fm]3Í’­Ÿm“ ¶Ó«,_ÇÑ2­XÅÉ—…qå÷9Þfßðç›îÌ”ͧ8˜Äd+ö85À§¬CB—ešÅµŸ5/`>®:n&¼ÂF˜isNA$i7å%Áí l'­„‰ËÇËvÒœóX2ÖÁw“1wcûg;i4´e-óÒ ý~Ò“¢•ôrê»ùŽ÷Íw\'æt`®ƒy¶ŒᔆÂ2U¾„pJE°–ÕZcCQN¾Õvã?ŠŠŸ^T¯¼²Ø3&§_çêüìíÇ¥òzñè6¾ÝFÐjYÞ>„ÙºšêñM5Ó—Á*×oUjpŸCzÑ6HŸ%»Þ).°!r€ò6vxéz=Qû¾}þ·@¦uhÐFŒ—!n¬­JÑÑõ×ê†msÁq>-Y> 5löåX·S©Ÿïu¸“ j‹›8)Ë¿_=©B¤d2Œ ]íUmpAHU©ö®hß mr¥Ôxš-¤„’ަÙ|7Ív7¶¿f i øhöÝ+Ñl!¬@ùKh¶€I¤-=ˆfŸþ”ëW(×§cËõe’ï)Òa_–8×Çf<Ýæ°GÐÜŽ¦Û|7Ýv7¶¿nsN0Écéº}™¤»ß—¨øQ´»ïç%N!mšñB¥ï)®¦>ãÛñ"ªšúþÚKÚã›oÂ{³Ö¨ y)ºÌÁÆ[‘uðùr6ö9„YÇ~—0Ý—¯Zöƒä>H†òÅ,ÇF±Ñøêà»ñånì3øbVãøÛ-³2ÿÁ—³ûή”„v¯BÆÈôzàÙã+jÇ[a0f;ÏÇu Þ1ª]Mí¿¼`r6 endstream endobj 5304 0 obj << /Length 1504 /Filter /FlateDecode >> stream xÚíZ]sÚV}çWÜGè”õýþhŸÚ©&m§©Í[’a† ‰¶þ÷]éJX#®å$Î$#]­ÎÞ³w÷ìN(¹%”¼èý8ê]\G8Í5͈Ҡ ÆáÕ02ŠÈ›þÍ|‘̃!W´ÿÃë—þæ:žÅ›x5ý?›¬¶“åàÝèÕÅ•¥Ä¢A-2ƒÒp°Òàçr[œ)|ÁØþ…¿pé²—z—£ÞŸ=†«(a ðU¡ÈôcïÍ;J"|öŠPÎ’¿ó•‰b¸Ðx¿$7½?z´ê˜e¥MÅÀI%Éý§‹é€Óþ‡8O¢£ýhŒ~ï&„Hû©ú–*ŠYŽ–‚SÙ—²Ë‹v†Jb„%sìÙïŠiàLÎ:²‰É¬¶níð¯ûà”Õå¼a–­µ_lTÝ~¹Ñ§|¡jKƒãî Àæ7·Äß\ #“9òÊ07`MAñb•zÂŽÚ!o†ŒrJ+Ñà#au ¸^S\žÅCñ`ßdydj/ )A0N† ”vß7ÇL(–TÎ'«h7ô¿=5™ÍMwÁR·,Á`O¡©ñcøQ¦ª‰n3†×·ïð7\À&BrÛÞ…G\…&hÌc6‡–bJ1uÌ×qºÝ¬’C1£€)Ómi1ÇtóóKü3þý—âˆÏ\õgEØN§q’̶K(>_mu²ÐX=‡‚¡>ÖëDñÜÏ_ûG¡NËjLg-ŽBÉá° íªÒ6ì‡UÚp°§·8ŠâV+ØâdqßènÜW×ÝHÇ2ÞYœ4ì‡ÅI8ØŠL:•ç—ÏÑÝHË€*Ñ+uû¬ƒmÊţ"¿ÈæF AwFZÝ~ iÁ`Ûfðjù§Ñ”ò´™Y3GйíĦ„QõÔýÏ¡aª¸ÔÇÆm./ð¦6NÇéý]|–âLU¬;Å!)ö8®ÃJR·þÁ`OW’Z`¡‚ãö!Ê(hh.¿6í!Š`Ñ]•kØ‹˜p°-¦p8gŸE{`¢F1Þ]kØd%lV,æLÍw'Yðqc—³¹‚8Sy:Ô­Š—0Ø[õÃ;‹êB†]þ“n&Óôàðl7ÖȽû–öeÌÒþÊÆ!“Íbò¾Üƒr˜s[_²ÜÏg›õÇ3fj»˜n8ÃH~…ëmz·=îÄ|R<›¯—QÒëî<úô´J0\þ§¦U™|dªŸœ'9JÆ»Óh ˜înRÕ°VoÂÁž®93 ¥ ŽH~²§ýÂ0±Ø²G “Šœ à´»æ¢a?0H‚Á¶%œj(ƒäê寗õæˆèd9‚骲r6?—,æ²Ö¶;]ß°FV8Ød1§@ vú ¤µŠ<¬ýÛÈHfp%Ÿc¦§ŽÖ­M–õΩYLØî ã¨ì®`5ì†w0ØÓ .X›æ«OT°žyºÁ0ð¨í®d5ì†I0Ø6Yµµ0_VÉ¢™Èí°dÕí’ ¶ YÔ‚dO;ŠjUŽ(&žrªQ^÷'Ìh”ÊsþËô¿üÝóg endstream endobj 5339 0 obj << /Length 1667 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×WðQêD07íS;“¤Iï‰ß’Œ‡–(‹S™rIÊ©óõ]¤MR²C fÒd2coàòg=» .<Ÿüt:9yšÀ£˜ NWTD„!§ËàÍôõ:É×ÉlÎ$þøç wò*^ÅYœ.bwù[”î¢ÍìÝéË“gš *n Š-Bü\i‹ÂB==q&Œ}iòôtòϰ à¾Êe°¸œ¼yGƒ%>{P"ŒÞ—-/ ”0®ð|¼žü5¡ÍŽihà¨mJ F8,yÙ¯³"YÌþgY-®·TRü‡%FZÃöð¼•“Š äŠPÊ,T{_‚" DÀˆÑ&Èâ`ÕÀÖ¶vøîþ˜$TðúÎ0ØÖ¾ö«qiۯǵÏš¶1Ì<ØÒ`v¸“W¡H\I¨hÊ4áÜš¤…ãë^3Á›9PFiƒû[Þ›o–í4¶³~P=Ù·Uό֛\Âs Rì»ûLHÂuÐh¸ŽÒå&î@™>éë… Õb<'iÛ÷to°=œ„+N¸Pø±ðz={öâ×§í!f©7a¸^6Z®ÖG³E9&Çc«mß“-o°CØ¢ŠàÍèså)´GZ "¥£-ì9ͪvnÖwy³Ëý½¹£p0=ÖûÎñÞˆ¥®ÃBÖæòìb†ëÕûtLðRƒªÐã/Å FíѽmÞÏϽ¡ö\J0†¡è²üï¹ó<üâ—ÂP.9Œç'mûžŽâ vÀ‚¨8 úáñ Ë(t‚ÃË]oV0tÊÇJÛ¾'+Þ`‡°Â(ѲrýÅ:Ê>&*îGˆ0”-YQNë£)Ãø©`¼d¡cß“2o°C(£˜êÒJæÉ‡ø¬3/xHÔq¢¢dl§>²B¡ÊRL<¶¬8”áKŸå°?ý·È¢EáRyçzåé*ÛVgv ™•ƒ´:xò hs i0g¨ËêŒì.  ¸i¢à‚h*ëªÀ÷›-Àš0cê–y£Q/Ï£¼:n6ÛETÄKwy~SZ†š=h,öyK“4)ڢ鎿‡û;¨‹ñÎP7Ô“÷nÁÝïu¨Ìð^'éÕ®bçzÆä4Ê’è¼îúû¤XwIr×IºÚ~>Uº‚¯;kO=3D³áà·»â}”eÑMvÛ>½ßܤ0.«ŽnW{š¤ÃÜsÎ50mºš3·Óe!q9èï¦úÖMqiiƒÞ%÷|Ë„ ƒs\Œämn^ÅÅ.KóC¾% Èp8=µÅÙëŸ_àßÙ¿Tû²ÌT=Èw‹Eœç«Ý†TŸof+Ö“„T8€kÖGÒ•üÈLE࢒—©†óÁŒWAéØ÷‹œþ`û'+‚Ù,”=J²’ ÉŠF€W½éØ÷ôo°4–IÐ5?K²"(Õx¬´í{²â v+T`©v>Û4/úñ±Ÿ×Hƒ¨Íqsî`Z3D!sƒ\ëO¡yh?U¹q-©Šu¼'BÞRÊâͲ£Hꆧ3.§ßÔó7õ|œzn€?,žË㇕å!ü¥+Ë<šœ^ÇG K&4¡ZŽ', °p´ÀÔ±ï˜üÁö–LP"@x Ë<ºŽ¿‚ \†*”ÏKÚö=½ÄìùÂpù˜‰ÿŸ6p ]FÇÛ×êØ÷dËì¶@aÔ£¦CT"Ã|‡±O±; (EýÂA)ÎÊÙk{<".b(Gü]H[Áo« cßχýÁöK Qc+ðKqf©ïD&£¾´À¥ŒWíèØ÷to°–:@uj(û,ÕÀ ¨äxÕŽŽ}OV¼Áa…£}ÁGÙš=8§ûs†¡Q™ñŽ}OμÁáŒÚ½öf/Ž4ÏíY@ ÒOR|2ø¥:‹¾Êâ> stream xÚÕX]oTG }ß_1ísÇ㙑"$>”¶R+!à6ÊC «6*Ú­’ ÑßãÙ$Ø… )Úøž=×öØ{f+ §’*‹$­þ_Ó˜Ï5‘LÀõ‰´Ä¬.ôÄ6\IÈ-Iª#JI‹® pRôŽÉÁ‡LZ»¸`ɸ»Ð’µ‰ôÔÈn©™#•àŽ¹ ‰ TW…T›cð‘ »'I'Ö ‰õDî=¤©$+X;f©MŒ)M 6Ô܆ÁF-¾|ƒZ}ýuL 6L'Ö'}} 6Zó%C=ušlts ªh”m$.â«™©»Ï­&–Ý–)÷ Žc P࣋øÁ¶ëÃïì ÞÙíxva£#g;»Iƒ]—`wTÇhñAIŠNŒ!õ‰ ²+SHmb5É®†A2·1Z’]ŒiÖ” /(]%4|;KA 4ûŠÞmH0xÐ=º‚°kAUB2H­¯ µ¤äoÀ7H6ßI™£ij!ÔŸ«‡„*PÆÄE)ƒ íƒ Ä66j›l«§BÍ܆VcØhub°ÑH°ÑQü`£÷‰ÁƉÁÆh¨ëZxbp£˜¯×“‡2†$ø@±¹ä…Y&Æ—[Ff¡{fÄ— ¾O»¶Öê>{¢¬ÕÁÁjy˜Ž°…:öõã´<ûõ7|“ hb¹CÃæÕË—Ç«»w?@¹!g!²qÉ®ÆÈTó@¾ƒäž[Ðe+-w *F–òÀž ’%Ä9HF˜5 Áÿ¢%S.eDÉ’ûˆ’•3öfˆKC2:aŒ0Ê>¨ëÃŽ j.¹Ôw ôp»¹Hi9DÑ`÷Η1¿°/e´S¹”½]qíª×~ÅB»’Ñàúõ¡»t ‚ÍåÑÙöù“õE:JË£‡‡iyº~}‘®ÝyúÏßk|qòÇzµ<€këÍŹŸ¹WËãõùöÕÙóõùn0Lì—õ‹Ó“ûÛ×éÈ œì³ÍÉ<†½“3(ñÖ9ñV0,¯ƒt‡,{Ûì­ç"û’u“}µçae0ÉÒP¹QÍè&#ìûÖ rÑJÔåjœÛÞbÜG®è&µF5—ÜTƒdEkíAÍJ’%¸>-=k4ÊJ”} …È8 dk$cÏ÷BQÍ„ÿQňr4d’K³ ¹öÌE£šÑ¦†|ÕÎóɽ¦—÷{MëŸÔk–{›ÍJvgVwkY/›Â;þÌWVË“W¿_ÌçŸO7­–ûÛ³ë³iµ/?.?-Žh>¸£Ï±DÆ!w§6ÄÜo5«ŸP1¨¬0x÷f´Ÿ¤å‡íÓmB²¾;ÿówN7§ß{ÀþSG´ wàFtåˆïKÆ¿¾#Ô*"¢×Žàb‘ëèãÈ,ì6nN Ê~¼}ZÜdpZì# }*Q2ˆDÉŒ>Ý4F¶ŸGpuàlÆ%chQ0ÚЛĂdà­#JÆ Õ#ãf† ®èzÕ\n9]ïÕŒ“G5ÓÈÅZŒH%:\³P5J†ÏÔ¢dœ®Kû&†}o`øÝó³ÆîÌ> stream xÚíZÛrÛ6}×WðQêØîÚ§tš¤IS§µ•éC’ÑÐeq"S*IÙU¾¾ ¤IZ7ŠQÒd:coàbwÏ.°{DìÝxØ{ÑûyØ{òÜמFZRé §žHjæùŽ>ñ†ï]ÿj¥³hpNî?ýã¥=¹ §aÆãÐ^þÄ«`>ø0|õä¹Âž’ܧHq¦ËeQâà ¾ê?±ʵy©÷lØû»G`öȃð*Þø¶÷îö&ð앇×Ê»ÏGÞz‚`D™„ó¹wÕû³‡a¸j ÁÜ*Ä« ‚4·JÍ‚x2òUo0Ž…î?暢ŽSˆj]Œ¬zl]'A²¶n¦ü|œ„AæÎ¯×¹lë€äƳ'—/zÞ»üyš Eq”½ÇÃ?©)s¢†vu«Ï9CæÎ9QÈgÔª™Eãa¶Ùn_êöv?½º@ÄZ40Ñù‚û0G~ïn@E?H¢àºðA¶°Ç›bH&w"úab¯ãàÖ &‹Ûý6b©œÌªd‚° 6 D?ØFUŒ\.¢8ËÕ“ÄêÇ84¦ÝÏ×ö2˜Ïcwb/?…‰/ÞFñÓ4K¢øÆžqÂÅõ£%d•<çŒ3H67Ïu¸#làùÅÛׯq’ß71dU§ýE\h½\,Ws’¹³fßr¦‘¯ÊTȽjÆÓ…BœÓ!Ÿ„°“y[)5?R‚)ƒÅñ>@%âðê@Ë j˜‚@Ìxû¸}À´“0ÅM6³ç‹é&§ø0?Ž4¿iXÓbØ"v"WÙr•Ù‹ÐÄü?ãùjbá7j¸P)o˜(2@° ³n„»×÷Ë0ŠØ€³]@•ë¥Úo,EÓ]k¿2üœkŽQõ…é2ÌVIœnÎZ"üös;¯~} £7¿ÙËhj’wê Õx¦ét5GnzRÙÍÌÃD$ÈH·}¸ÅVÓÅ}XQG)üÃÞ8Z&¦K»ÙÕ—nH£¸9¼hì ù’h$•2ûŸ¹/ˆD”p" .IBoZÝðjÒ6ß}<ŸS]L`3º«|»Ç6ä›õ!3TeI¤AHwe‹$ÁE’äÕÞPHB&¾…–†Z˜=–IE0Ÿ (ÈšI(1¶Yè<Yµçˆ Ù‚lй~?l!S^eàC™S­ÎŒF¡}äû'‹•ºøn¡ÒYÕ"…I†—–°çU­ûFA“ý!!P©ÀŽ‚DI¤9&uùAé¬l T„ưçê2e‡!fëåñ9â ¤= uùé¬l@òZÉâ±jÈÇ»xq48ðÛÉð¨ËïˆGgeÛà!"Ê5øÐy¤¢1žI ÀBÝuÔŽt½š -µ%Nm]~Gh;+ÛZá#J]%FŸÂC3 ÐpmUS°þt0(ðTèP±n"p61T ^T†=`¦gš…öÊ®d½ÌÛlwyžWaùÕ{Œi8w¢ØôÔúáÕ:q —„“áÁ“ œœÔWé ºÿµ½°{]܄禩ÛÚ¸u\%é¦ÛÂùäâL?Y³ý—g—ygŽ]O.­“@ÔbbyU:Äô“’Í ÙGi`ºKÂØ;Ytš>Õ§ýõbeïÝZ BõØt8Òw|ˆ/ìd&TµR¶Ž“IY-o³×¼ÁZ§Ðý,Ïìœà×qÞ¾¦NíYh•ª`fîç˜UäH ¨Ž1¹N1›EîlºŠÇYT4ïQÑÄÇŽ–»É ˜RĨ8ç˜V8Ç*Í8ªœÔ÷Ã8n¢ b"ʱ+eúÓjúÛ±GpŠeØ0‚jÄéй-£+ŸŸAMêF¹±uÃöØÀ ¢ $вªiGÁ¯XÌ¢±.¸ÞœÅMK£âÕíu˜ „Ø7°° Ü ý\¡ÐP–hȧöºFñrå$IA¥ÝGÙW]/w2õ‘$ú‘Ú›‰J“äú˜$‡í¼d$ÝJôYŒirºšœ\j8^Ô»œëmÏÈ1ª è §cäñÁ–Ó5, ùݪÚîÊÎÈ1Š‘_Ô{¹æºZYøô[ãã–ˆëÓ5@ ùC¥³²- †ÍoUô«PrT $˜<* ùÝPé®l T¨VHQö•‡Ùߪǥêîî·¶¥`KŒ„ò·îhæ'a³¦µ—Qn|ÃO·—Q(rL9|²T¨Ëï˜ •=|/£¦'¬ë^V¢ßÜÊÔ·¶•Q œ<á¢Y—ß1R:+ÛfѤù‚­Œ˜Fìt¿ø5äwD¥³²mP!ùZÔPɳñÑoG[¡Ù<¼ :Ò«Ó¡S—ßÎʶACsÍëù¸z€Œ:¼v€2£Z<ä_£5{÷¡Mõ@  _„ ' #Ly…!§K¼ûC»?Vå{MzüÊsåɾ å¹ýËÊtÿ—• ÀÛ¢®Éª­fÍoòÌOBG€û@‚T—û 2 æg…InDs >+ØS÷[L…`ºŽÞ^üvñÆ8ñ¯‹=¶B§AyÏrøLäï>¯ú¨ƒm7yWc{Ù¼+…oúâ›ÃBˆù1|ÿ Ö9“Z endstream endobj 5403 0 obj << /Length 1494 /Filter /FlateDecode >> stream xÚíZ]s›F}ׯØG¹­÷û£}jÓ$ÍgSÛ}J2‚ÍXB) 8é¯ï…… l ÖÄÓNfìIpö\ÎÝ{Ï®DÐ"èÙä—³ÉñSm‘ÅV1…ÎH*¬,GÚÂQSt6G獵—qv͘$ÓŸß>w''Ñ"J£$ŒÜË×A² –GÎ^?5T¼ša#4 Wb1jàm¦ÇîÀ„-nš<9›ü5¡pAtKnå…«É»Í᳈`a º.¯\!I f\ÁùNþ˜f`†6xÔ˜’b+—¬Œë<Ã#F¦WQ~ž¥Q°\eQz4£dú9Jϳ(wDßIàŸ–l ¶²©8<ëpçX4—XJUp/Þ—TaFbØ‹Ò-dÛhûßÝ€ ,­®pÀ´¸Ú¿zPmüúA2BKaËì=-Ó äNN*…AÉRaÑT˜ilŒtÇI©!lheBM¸‡+¸¥È‰êƒ]ØzÚ´näB`NšQ,µ£øÃMsƒ¶×]É|uxLš”cx£¥Kß3]¼É.\qÌ…‚ÁŠAU³ÔYBïΛ"\º V…0(³v÷Ÿøm|ÏÌ÷&{¸3QÌ‚æÃɪÛþgToÒ{îø9E卯µƒï™ÞdûTFjÀ¹ŠN$YχkBĨ爫7Ù>š ƒÊîV‹8Z·Š+-ÕdvðýÄõ'ÛC\iUÃdî(­Á¶Vj7ê5Ü^šû8 i <Øû6û¶y Á°®rìÉ—< ÂÜmçTîÎézUmýœ¾ÁÔfyº óMáVœÇO)i>g‚àjlv°àršd¸À†Èz‡èÇd‹·Á |i:!Ǩ/σ¬:.—ë0È£¹{ùñk‰LkùhcÊ–A¹Š'qÞ¶T[ow&8.Þ™Q L«:^—åNÌL`"ÔÁ1›úʆ%²SkíŽÑ^ùî`ÍL†šµìœ.mÈèP½¥zÔ„Ö w|O+Æ(_ÄÉNŠÝ[tÃÛšä{"ÓEžöŽ+‰Ž˜œ^/¿î͸õ&ÿ´©HiTW]Çù¥;û;J«àò(]ÅÉöÖmŒ0×âä¢%x’-¥”ªl[“&h’í›oS9 ر¤uúÛsø;ÿýe¥à¢x•¶Ù& £,[l–¸¾¹¨)¦‰Ë=ãÙÙ‹½¶Ý*à 6â¢FXµ*9Zíàû5Q²‡/j1˜K6xQs•ï®iÔmMí€Ê?Þ’·ƒï—þd{X,n5æ–·Ö4;šï³Æ·z-Õ”n7…z¹-n)¦T »Å5èF+;ô8 ÜWÍ¡êy®›Ô ¼:¢dZw=—¡ß ×]†«J‡NȰ´†îÓ;âfÿ\ˆ¤qð±Ž{ÛÈo÷[)ooãÌMÐÿEgƒú8ƒ™Â´¯3•¼Mù6¼_ö¦zxg¦G½'ß§JßT¤OPÛÚpodÆ=mbÂ£ÅšŠ‡hø J(Wt¼> stream xÚíZms£6þî_ÁG»sVô.Ô~jï­÷Úk.ý”»ÉŒc&\Œ›Ëýú®°Ä6Gæ®Ó™dÀBz´hŸÝÕ.ÂÞ…‡½—£ßNFG/”ö4Ò’Jïdî ‰¤fžÒpUÄ;™y§ã‹xµˆ'S*ðø×¯ìÍq4ò( #ûó]®ƒdòùäõÑ {>Jf¹¢Èç ¦+±(Ñ0@ùã#{¡\›A£ç'£¿Gzal…€¡LxáÕèô3öfð쵇×¾w]ö¼òÁˆ2 ÷‰÷qôç×_Ì'59*LAæV–Uù^gÅeq¬‹EXÄW‘•êþI)FZXsyÙ”!…¹§˜@‚—‚švA$¢„{i_{yäÍk’5Ѻ[oO@9¾¬&°ÀÄôî‹ïV¥‰_­ê.3Ô±$ÒTaKÀü³7ÇN ¶R¼®Nª¯œ>þÎ «³;¡¼Ó©Ï1îV~}(tÔ:.¸·±œm˜æ`&p—zS‚„ÔV¾Ÿî‚ˆù^­ã-´S#ùeW:RÀÒª[×»ýÆà'¤ûù—"ÂLˆ©ñSs‘cgSÐfy­–Y:‹Ó ÛTdlo£‰íˆOÓ(™¡É”a9>©:¹fÛg‘%³U e‹p½ˆÒÆC5Îòø"NÁUm&ŒÒ"ƒ"Ϊ®Yviï–IV˜‹À½XQn4+3%àM„{}x»uRD3ëãÔ^ ˆ»‹ÃË Áã¨@ í½ ¸Nm€¥iLdwV_â#ðkΩþÜÂkhÊGTëªgœ.×…çŸ ã ƒóÄùðë¸X´E­^fžµ…‚m'™RkûSmÔ-ÈqT¬ótÕ!=øK"ÔþâWˆ¥PO+Y¯¢JJÐÌ2ŠJ™Ð–Í+5¸NQ:«èTM+tL9C´Ma=Ošø=yÒ[ØxÂ$CŒK˜ ¼±vv.‚¼¹ÄÆó5µu§º@BÖúÞÁ Ýµ& @§´|Oõu•a0 ëªã¯ím¡Ç’Bfd•ÎØ[ôØ¥ á#%É·Þ¥u%=‚²í~¢æ¿Î'×q¹—: ta…à¸ÐÅ! |¸ÐÕÂïGïþÂÖ#z…®óRíí¸~´¸Å}ȽýáâV ¿'Iz »‡ä¾ÛUU¯áœ]F7Í…u #¼¶Ÿä>E?Šä\!Åo;ÀÐ8À$† ð È!!0+=œ¤Ö\ Gî&~Or÷vMÂn¢‡ ­ÞÛ.ðÏb8Ð6ñ{²¤·°û¸@y‘ƒlÝ;ù³³Î˜öΰ›ðý4Ö[Ô}†M’ †Ù¸[õܶ3-÷ÉcW™âH]•¾–y´²‘JÓŠ}pÏÆËRt±•sˆR7èZÚÜ” ðò¬eyÝD6Ÿ—ÈÃ8ÏTÊ%„|Ù¥ÒÍ ­ f|RnÕZ3~gº•·èX9gMîxmõíÒm>0”^â‰û¸0!büÅXñÆZï0ßÒýX@Û½€çxK#ˆ%ÜÝGê+¤¹ÿðËRDÕ½:n~ÿášÁ&îõÈßßp€>þþ þÎþxã|ËÜØ¯‹«uF«Õ|ðEg›ž-J )ì ð@ÅÚá´ðûm û »{bH!½0¾£wbšÿ|Õ!œÖ€„~?žôvLƒ@Vƒ« ÄìÕT1ÇAng‘}JhÝIä>ùÑ1iÿ1ò¢ð¶ ø,²‘-Ú8ßî ŸóÕóÌ…åÕ2 ãò‡;(a—`·#ÿïdÛq“šD"¨Î5d󇎜´¢7CXúzz#ÍÒ)îÜ߆@]Ç 9Ø(è€Ó„ÿÕ*D+ endstream endobj 5368 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1600 /Filter /FlateDecode >> stream xÚÅY]k\G }ß_1íƒç·f¤)&ÜÒâÚš<¸öÒš„ݰÞ@òï{¤õ¦Ž{“È©q!dµÚ3]I#¹n•RH¡Uʺ~–0²~Ö+©@!óP¡…Rª =”.*p¨Ù4j3Í”ê¢Õ–‘jìÅ´‚ÿLƒob ½˜¦…Φé³i8p7I¦AšZî)ÈPMÏab:\ÓÀçTM§›®…œ‹îÝ;¤Î*qÈ%«®ªÔTÇÀQJØ Bj¢1©XÁÙVŒÅž€SÈC4RœŒ4• "Ãf¥†BYƯ¥5µ7J¶b p”±Ì#„ªXáªXa6¬H1Aê¦CôGV{XVFÓ}ñOÉtH@"Ó H"Øc$ÍŽF ­Ù¢1J¨»$"'u—ÅA¡îÒ8$Ë#ÜEa¨Žñ«e’Ö6«}™H÷À¾"¦ÓÌgÃ!õYý£DŠ˜®ªZN”:$­'JŒ)¦HÝt°Ò4~„G¥ÖÆ’Vf2]d¾À],¨*a®¦Ã,¦ÃRL‡=„M‡=†ù—±ÇÐ⢂Х„X‘;5Ó!ÉIë‹4L™L‡Í³=‡¦»TÓ!)…íÙôñuU؃ûú+Š¡i~IÝà‚º¢ ˆX\ÔÀÐe¤!zîUׯ0]=UÓ1$1„ž‹é$Vn/Yu8»½ô¼8<\LO Wp¦Ÿ‡é×ß~9Ç‚½…%&¬^½}ýúåâÁƒytëQãÊ”ã@P|àÚ#y¡#ñ:Q$"T>læ¨'Òîø¬¨}'8EA§s‚kD8œ`*‘Ùk¹æ(ÙësÏÍf”T\½`Š„Fè#)äL NTÔèçõ€ºÀ¥QLè@>0I$!¯å«7t…RÔvå—8;}Î]üIɽÄQ³Ü¢7'a–î5L5Žäµ\á2ÝóÑzµ ‡‡a:Â4AO·EG:XÓ^Æh­WòÐF{%g i²Ga`îe 6ùðT0¶oØsz¶YŸ/·á$LÏž…éÅòÝ6|pçÅû7Küpúçr1=†kËÕöRÇg×õ‹éùòrývs¶¼ÜTÓý´<¿8}´~NŒ‚ à‚Ö+ã%ö;ÝÀˆN™ºÃ?\­Ö0zŒ£¨[FQvBW§½÷BÙ »hÜðÙÌ.¦ã·líûÓ‹Õ«Åôh½9_n̳ôrúaúqz|’í‹>ÌÂB˜T~F¤Àm k¸‡–Ÿã0}¿~±Hï7—]àßÁÅêbû­õNÁtD̜ƢcC…s)±”>ëÈÏ¿<}úÝã‡ÏŽïÐ Œ † ê’bG\@i"8 BoäÞ¼@6º2F4>Ý´S&cc1÷Ï%e¹:Û¼s‡y)¬$B]ÀÝ7„âo˜ë%µÏù²½8{µÜœžŸ«[oN7wéBRtˆ $§ É®9¸§Àßv…»wD;g³[ÕÎíºt+?¬sr»Îú0MÁ°?Íú®£?ÐtðY5 N1I÷‚ÑÁÙ Î%¦ÌNpÊ15ñÁºcÎh4qv\Ïa1³8#Wkz!ôqX$»-çÈ^»)2yí¦_|àÂܺÓB-ê¥Í Foc¯ Ÿœ½–A>¹9“­Ç–G»-ù4í¸Î4nyóµtD¯ô7éˆÞ_ÿ+|Å0†ì…+:¢oî’s\uLfŒÛwÌ"Þ9ßëÆõ&f$fïHmè]Cþ2@3Ê?3„qÛ¨ý>ÑÛz `?mÀ° è¸ÒoÁ~ôÐé«&ÿû‹Ð_z1 ®-޹Ã?F?¦êFšŒ‘­tÉNðy®ÉÎ;.["N,ÚæÈÕkÙ»ÅÍ‚ÁHÝ‘ë¨&gNzb%n>0ŠTqÖ!'úJÐ ±fgÑQÂqiNËwöNÎhýdñ‚Çü°žëüM^Ë(¤NÎ8ëüíã^/ø_=Ckþ÷ -ãV3”Ýœ¡úÊx71‹ÜåÄÔ˱Øßib/ÕîÆú⬂êc”ßçݸ°þ1•pE'}¯„ù=´°û-ÇCM·¸è|„þâx˜ëx˜í[³`„»:ÁvwIN°Sšmr³`íâ^°`ð´î3¢1Ø Î:x®=àßX?vf endstream endobj 5460 0 obj << /Length 1734 /Filter /FlateDecode >> stream xÚÝZYsÛ6~ׯà£Ô‰ÜGû”6Gs4ml÷ÉÉxhв8‘H•¤’:¿¾ ”IZ¶)ÓJëÎØC |{|K^~>=}©L`‘T'ó@H$ ”«"ÁÉ,8/’b‘L¦Tàñ³?^»›£xçqÅîñ·0Ý„Ëɧ“7O_jh(™ÈEš+˜®’E)†JŸº 寽8ý5"Ð äJ ÊD­F§Ÿp0ƒwoŒ¸ÑÁתç*#Ê$Ü/ƒãчn.L“†µLAáN—¢Z×Yù¹<‹&—Iœ–y.WN·X`ø'•‚a…ÛË«Žº )ÌżR×¶ "%< Èhäq0oè×–¶»õú”#¡e=Llï¡òýÞ´å×{Ûg†¦,‰ 5 l%0¿ÜÍ‘À«@åMP©BZyT“´t€Ý('8L1n@üæhè«9tµ¶à_\ç=Ä jfR€Ó`JÆé÷ÃMbb:ht¼&ítü¤¯)†$U‡³”¶ü–2XÙ–Â$CŒK˜ &%Âíp´óöSxÛFëF¸@C6ú:º7f˜")õá0kˈÙ`e÷Á ,}ÐN¾Åg]7SH s?/s -ã´‹›ü?õÄNéÒ ýë™Y* v§ò¿dé„ãñ— ã8/!mI1ŽÒpe³²äã0¹¶:«ÁíGŒi¼œîižg+×÷ÙñôèÅ×ZfîºÎ!š†çK/Î>FÉò|õ¶ž¤dù*,ÑdÊŸ,|kQBÿ 74ñó…Ëe…¥ïq~éÞ–‹úý|“Fe’¥O죾Z@RA[3%À…wàj°ráiHë,-’ód™”—®-›w:E DœûÆÌ]gqC3xNªÕ<~ŸÕMå",;’²M¹ÞøF0¡‹ráÁ¬iǘ#*ã×Ì›ºç,‹ýÓÌÏ,7³¸£Gç«$ K·ÝÐð-Î3Ô²h«TÓ¹*0ÜC˜“µrp§¦VD# Q^©;b[úkDÍVý$ÝnΗ ìóÄÛ´|M`³œòIôy;o—8¿Kwê¢Ð”ÀÌTv£oG{Æ‘’fõ׿µfte'̘qÛ•|]^ºæÚhfîÑn»ëW#R¿©}ÁÞG8U’úgÓt+ûÚ¹U%=¹•û‚A*!€iû¹Ïãj)¤Žq¤Áoì ÷¾{×å2vœ¥2n9zœ¥°ëXSÀ˜HÒv¯u¶Þ,­Kì2j‰4&}lškÄÉvWmX½]‰„!pðŠ3´‰˜ñ7#÷ã:tìXº2ˆpÖ^úŽu·í"u#då†!( ÛÅå&O‹]>, ‚ªý®%Vë<þõ5üýþÖÇ™¹ueŸŠMÅE1ß,‘Ÿ¾YhCiá#ô:Ž’ªx™yï¶À¥°šBÝN-ðãg»¢ÛíŸ(·‰½YÚÙzÕvž24wúê«Íª¢ ¢^•èÚõÖv¥wPuˆþ®L ÍÒ)ÞÁÒ‡Qˆ¢RaÁ$pa!G"”¨ØîÓbGþ°Ä0\Ùþ$‚Á1-ŠDXèÐÈ"F09Ž™ÃYK[þ@k¬ì4‚qŠøöÛÅ¿E#vxô—jD÷Áº-~ ´CUÝYˆð\ªGOP%bÈCÄ]§²Ô`Äê¬gq‰òåú~éˆ:2L.R ²Ôᜠ#˜ W¶:¤0'•ƒÒ¡EßßIƒëG—© “ÃåÁŽüf2XÙ=¢%°ÍX5irö9¾¼1ªž ù~×Dí)7hØ'¹Þ!pX#¹³ªRÞ?ô£ <`%@´Dš®èÈfÓÕíúd3‚}èû’%³»cŸ‘ÐgQïÆ=*ÿ3qo"š!Mõ÷øÐDl‚«ƒÉóΑnÙ&ê#Õ°(²(q't7}¢ñç.'ÛsÖÎ÷Õ¦(;´ç¾ë¦¨‡1þίNœõ÷{"ý?ørµëG|Ü"Âïó¾0 V endstream endobj 5485 0 obj << /Length 1185 /Filter /FlateDecode >> stream xÚíYËrâFÝó½„Th÷û‘¬’‰íʤ’šØìÅRÙŒè»`$æ•:n Ý%,èχæ%,«›äeíº[=õPíkçÒqû¦Ùíe0úã·7nñ©Ge7Ùã´yGO£ø)Ê5e…óì.öG=Jº.Æ•-¸¸¢¤œAwl ¯ì(A™$5$!×£Ÿjx•å̬-zúÁâ)çùµÇÖ¾w?Ë©>ûñ´N5ûî“°N¢°ž¤Ï²“Ò§ÐÆòM»q° Ár {P*õñô Ä””÷ôâÏ|/úw7çhîÅ~àœBYJû‚c!ês çí@-.Ýizªˆaíé©´+Æ[ÓÓ~3=mNöp=•šhþð5ôǯ ©U{„4Mš˜ ónÄôÇR“j-_ªø ó¥1Ùò…+޹P0™†ÁìNÒfŸéåtÒP°ùN'ÁZ…~ÆS·×çü ÖoÐã²û<®fÀñÔËOÃÙx¹a¹™Ü‡…1Vבµ¹dé/£©<¸½ «¡Ìm$Em¡P]fŽ_éŽÈÄañ$›PkKŒê¾h ˜Þã‹`´©5º¸Y!àt+Õž% )áJ[“¸~3‰kNöpKÒ¤ðg)1’Ç®4¾•CH†5åo!¼Θ¶to‰Q=±ßKí Ûr©ñJ—[$õäRƒs ÉeÚÓUÐܶ¦«5üfºÚœìáºÊ9Á¤(~O.5Ö‚ú”œ‚µ™öÒ¥ß0[šR=¢Îà _DéÓëŒÎ{”ÝqÊRz»cô¯H¨­uÆ~‘=C½ÁÞ·Ñí«%Ôª–¨þLµDŽ›1\RKÄÍêˆ1Ì7w'YµkÝbé@†êÖ4«†ßL´š“=Üâ¨%˜’ü¡+‰ß0~]¯ÌFÕǾæm”ü?+j86̼…„R¨$?N—/qäòƒú¡8”óü˜ŽÂ(rËEŒýà¡z˜W ‘XøLs³1îÁ‘uV›7^¡¬@ÖÏS·~ëâ¶ËÉ"»»w+b™nÎüñ÷rååÊF.øAì¢EäâÒ¯p²/vˆüŠË¶¿ºE’›â”ºÿ*€9¦ endstream endobj 5506 0 obj << /Length 1319 /Filter /FlateDecode >> stream xÚíZ[“Ú6~çWè:A«»¬ö)m6i’I›îò¶É0ð„5Ô6¹ô×÷ÈbH Zv6igvÇÆ–>}Ò9:ß94G=ëý:ê]<ÕlSh4CRae8Ò®š¢ÑÝô¯QºˆC&IÿñëçÅÍ•ÙÄÆ[ü|Æ›p9x;zqñ4 (@Å Ð BÃp9c :è Q\˜0®SïrÔû»G¡Aô èÊ%šÜönÞ4…w/ÁÂècÞòIJ0ã î—èº÷WÔ'Ð SRlDÁ%Íç5ÎÞgcO³èÖœÞIàŸæÄ6Һ˳MŽ5Hs‰¥Èiºç’*̨@ ›À Ä¢YWmÿÓݘÀ2PÕ0u­}ñË5iâWkÚe„:–†™; ›&sTÜ\•Æ£åÆuc2]Z3гÂ`qÐÍFÈ>Ã×{æíhç¡|³‹Un ‡ÒìÍ•·ehH±T¦ ÷Ó!‰y€j wÐnúºú!åX1}>7iâ{º‰7ÙnÂÇ\( ¥²XáÉ"LšKÌàmÓZÍ 50¬µÝï@ÝFV*8ŸÑšøžFó&{ŒÑˆ„Ϊ ÕÑ?vÜÞg+iNÛf¥Õ–6nÎþ_:O*i|"ëzP·`qpÀvuk@eÿÓ:Jìt¼>I½”°`gT/vê|êÕÂ÷óp²ÝÕK LüÔkkú–~õ`äë¨ ÅZßõ†Ú—á* Y…—'6³Ém—Él4+®Y4y? ¤o³â÷"L‹›Ú¶+¸¥Ž°ÅÊ÷ÛtÒ¡•¢¸D]”/Öaš¹ÕÁ%»xJIÝ[‚ÆØÞXaˆõIÑC¸(sìŸ[xé˜SµŒâõ¦œÛ‡“ý0‰ÂwË’ÞÇ([ì_‡(ž­Ú¤® 2dÅvRxÆJá½²Ù&‰Ó=ì!¦RO¿BÌI‘­í`"G—„êAw(8àCN!Á܉ºoá¡Ã§'Å\ Ë";_Ì•$À<æ\1·…ïsýÉv¹’R¬ õ‰¹³e8Owêhô½Õ ÂèzÝzçNÒÂ÷s²G¤ž’Ü"ù oÀM8k'Ÿ.k¢'&Ÿû<è(™FäÚu2)4Ôi¼LR.?eI8É*Ƀ 8ok[+à¶tñ2ž¼|òÛ•]¿vñ7L~ùk’Þ«[³·È3ÉŽg¿^gÚ¤ä¸*®«M¶“{íÖy^5ú2¥Òx_qÈ…µ¤÷*â׿?‡¿ñŸ/÷ˆyº™LlšÎ6K?ɇSw3=Iº¹„’ž±\âY”<_¹ÔÂ÷‹Êþd»K7ÏOn…·tƒù§¸\êªÞܘóµð=ýÄ›ìêÍ¡®6üŠzïõçÎA|„™Cýª‰¹aæP¿ê*Ð=žNéoM¤+ ¸ì·†ñô€Dã„Tè´¨êØubS›|p¯mù(\.ëuU”fQØõ:ü·$¼iÚ4[%öPJö µ/…õýáÔ>Í-z¼ÒSc°®ŸœßµÒÓ À0©sð&¼_üö¦Ú]æ©a˜í/óÎîß¿ÌS­q Ïè%M|O7ñ&{„ÌÓ€b ë|¢Ì{àT øàuÕy CV,\ÛnµwYm× ïw«J6@ß›ú_é|Ç<àUf«sì0«îªÜÀ¥[$×ñs• $6œ~>”$(Gÿ? xxYƒ>Ø‚ïûœHÀöÛœð5ѿ̞< endstream endobj 5530 0 obj << /Length 2145 /Filter /FlateDecode >> stream xÚíZmsÛ¸þî_Áo¥:_®Ÿ|“óõ^RG7×Nî&CK”ĉDêH*nþ}w±ËWӮϪÝIç>$À³‹År÷hélé¼9ûzqöòu;±ˆ/pkÇ"ˆµÆÐ†ÊY¬œ÷î»mVm³ÙÜ3Ò={I«t–i¾Léñû$?&»Ù¯‹o_¾Ž¤` Ð=ù!¨³Xž§aA¹/©ñü],Î~;S0K:ª3–jã,÷gï•Πƾu¤ðãȹ±3÷ŽQRx:€þÎywö÷3ÙßX¤zv4˜F‰Ø'[*»¯õÇúÃzæI·(o’;«äz¦¤»K?ÈÊ_¤‘ðOYS¥ˆ ªÁæÍÈp-Bé;¡„+Áp”OùŽ'â(vÊÔY÷,¢MKo+ðŒðýŸpN>ž4€o|ü}¨@Ä^|º©¯Ü8Թⳅ3´gë÷ÏÖ‹Dè…t¸Y^Ói݉㼟+éI9ˆpþöìûëavˆ“1xà6 ¿*5\¬¡ì9s%L“…¾ Æ9½‰·ÐÞ£ê/FϾQ§D㨽;mHmCÅšý*­ÓrŸåœ!²5µu¶üˆoWZ³¼¢]rv¿Àݶ¹ … Ù‹-‚yÚ}ýãÕÌ÷療×õüêÕ̇æëï.hô)u²Á¾q@²„švx¶Ú¡Í‹rŸìvŸé©È©‡Ëa‡¶²¢¡kžR7¦tˆóM™äu–oh JËOÙ62×R¹—¬p™ä„|Íë³ è£'‡Ã.[&uVä­ qÙ  gʸiY!|¬Ù3ªîñŒMdì™0t·IEBk´í^I¯•UÙ>ÛAV´+ê‚„õ6©©W¬IJSÞ^¡Âñ¿\Žõ¾€‡¬FÓÿµL RÏ”;éDkª)Gìt˜Qn²« êY¿B›UÕѺú7Y½¥Þ ÂÐ3®­]5‰ò´¶W”kµ*ÓªJ­oú–bTuî³øÔÂÔ”‘ìéÏ]¥kÉÇ]ý‚G°¬yÚŽûÏê·cZñ,v2jª‡;é³ë± ÑÁÀëuO\Àhqà#Ç’Ûvéù;j{æI÷f›öæÁ~ž˜CYÙ fu a”úÇ=ƒ”÷òµ’ýŒ»ô´Ð¾7ÈPòûIIEj?¯Fxƒô /Ž›™Y~8²ýŸ0V’2ÄÄÛæHšÈcùº‡=%s*â\ÅÑØò«´>–y5a½6B™ð÷›ß Z£ò"ŸË6ÿbàO&[vÑÝeåªÛÞä XÖÜ×PkRžüø?ñ¬tõH†e%‚(|:†eŒ.=ÅáŸÆ±N7öá$Ë_HüH–=üÅŠü/’b?¡ÿ ËÇ5ž9•a¥«»ùdÕ[ÕââÊ»ˆs[›"°ƒå'Õ ÊâÍ;êP±À±„Ë]fë/öXAóšÑÆèíÁ"ؼ‹½ú.»Š6¶´µ0ÉW4ÊUªÕ9Q9ÞÞбmØ €éÒe¶þLU,`±3åF”ÿíÕ_ie[w6;ÕØ_‡–°”´jâ\(oh =‚½íÀiSÌø7cÛ‘Õø!Ò€ŽÑƒbM±À‡z¸Ã*îûnfGZʃ×IE]ã¼°ç>à,$ãzŠ£ÖlX9é4˜Ð–'˜SÑ6dìž÷˜2µÜ˜ÖG„‘å¶(ª”µÔÊb N¼Só¥lÞ«§Ü}n¨O’w5xrOƒWµúƒð<á¡ÏBw¶7’#v^?’çè\OÇst@9ŸŒçŒðOã9§ûpž£ÃXhiNá9ƒÓß%E_$ÑѡҋžƒéhP)ÿQL‡ÝŽu¡yÛUû#3¡f ¹€sÃÖ¡å÷#˜ööêb~Žéü§Å7?,°œÆL-`ô›ŸgqGÚtSÑl(;3廟2¨„+†…zžaÃÉšók¹çÊf'\ÇšÖ×-íÏj=Ü6,zÂЪƒÕp3ü¾ÚÙZ‡sELÔ6 jDÂšŠºËcÉ×%(íûÉ… v „²X¦Kª‡0‚±N –l³å–Äˤb%—?\..Ï¿#ñMF$#lh Èìõ´£mµÃEy[11žýÀE26Ð’'„o¦»ˆ¸·ä#CRÝfÙnļ™@5Lõvô*NÀ×G¸f—Âa ®/ˆ´u7EÌDÈá(F5rd&‡BP”[+Ë2Kyi¯.Ò´uYì;å}_c_ÜywƒÇóÿNgÔÿ”Îloæü²?—áLóH"ã)Oxy:"ãIõ:x2"3Â?ÈœnìÉŒ'}ašOž#2ÝÑXL|‘,FÅ‘Ð*|£€F*©‹é*ª}››ÏÓÜÉó·ø±¹¹ï“Y¬{•(î}!‹}9H¾²\©" zˆé«Y<újÏ…±î,„•`!¢mÖm­…hO],‹R Ô$a²*è÷ò*7à5OE~‡UýJ4SÕ|xe õèÊ@ëÆºÙiÎOöÖ@ûöú(³õT7_¡³J÷E^Õ%“N|Ì {³KWžd ˆ¦=@CaÂÊ]5Æ,Ë”õÑ.š¯+ ßµTlù1IUñ¬Õ܆yB[‡ƒköM¢{Â~ŒÔK0¤šú´yêÙ;>ÙÕì#ÖnÕ$ÕüÄ `d©]Û¿%!°´7œ,ñûÆj®åìœcÕW˜ öëèØ26bè?” |†‚6Xñ()_Òà_=¶øE‡>Á|’AܘFùLç)™Îà»áchNkÊÔŸùó¥ÿ˜¿0ú7žX  endstream endobj 5546 0 obj << /Length 1616 /Filter /FlateDecode >> stream xÚíYÛrÛ6}×Wð‘êD0®$Ñ>¹“ºiÒÔVûâf< Y¬%R!¨¤þû..”IŠnd+v›™Î$h±X`g4®¼}?½ˆe ‘ŒhLçˆP$YKhcLgÁEx¾Èõ"O¨ÀáñÛS×9SsU©"Sîçë´Ø¤Ëñ»éOG/$`0bÆ )Jx ËY[”r˜'á‘k(—fÒèd:ú0" …r ¦2d«ÑÅ;Ì`ì§#.“à“Õ\‚`DYýep>úu„ÛKH GcS$¹Ã¢í¾.ëëú2/ƇLJé2Ÿ]®º?°ÀðŸXˆIaÌ›æe0C1æAÌÜ6rA"D (’‰ *Ì[»Ö†¥» PŽD5 8ÃÄhjߟN×~sºû¬Ð¶!Iåk VWëœy·‚û¬[yÛ­4FIìýšµsØv‚‹ Áãn|ô®oÏM¢‰?°kÌßc¦;™E"˜‚D$ºoî2#K‚–⎵ ƒ‚|·o0R°%ãC‚±×ÞÍ[DösU«j•žò¹kë<»ªÚ˵o››'ìÍCfw°Ú„ÄH2æLNƉÂÓ7¿ áñϧÏ$†Á,½r£y1˳´VÚý¬ií”R/hCq®›y=*ex¼^/¹¼,œšVÕÇ1¡ªü¼×¿O¥Jý©²º¿ŠvƒŸy¶pc‹Ô0Œ³Ò€ÌõîN´ªN°.u=ƒ­Í¶Ç4&„”ö¾b~Ê—KÓÃá{å$¹Ö˜keyád~eÌËj˱˜†§Ý£ðšÁ¿qr ´fXŒnèÆ Õ âÕóšI°¢Ÿ¸Ñê™éE[ýu¥´*꼸jpª•·Tn%‹vOçng8 §/Ï]§R6J׿‡€CªNlÍ™N+¶àŽÇ„pzâÆÊµ Ó×k•åà.ªL¬ð8vj†,"Óq>°3‹åëµÉ/=ß´×ÈÒ9ÜŸ-²ÜwuVu¯üÄEêµ×©Öísð7²µ® f.\ìsw&ye}R]ºÖ_èÝžU7Á Ý^pƒö{¥ürº.—Më~»Ý¡QníÐŒdéV½AZÌÔé8&- NÌáÚ õ"w  ‡×‹ªÜ\-÷¤®Y”õd™kOL+•-Ò"×+C¶¨ÃÀG/n'°O’˜u 6G’AâËŸo{ö:lš ¸ñf^¬7‘ÛT•§ï—žT]ðÒj1/û ! Ü.2¡.;OȨ?™3UoªB ‡Š†ˆøþð‹TQ¼M°™ù ÷;á–[IBßn¯¿mäA·k½ gˆCôOª`§Ø»že•zX…'8F œÞ£Ux‚Jù± ¼®ùÃ껃¡î_Þ Æl¶ž#—©.ÈçËt‰xüì;n?3ÛGlÙ<`ïøìtwbQÓ{%ödoäÉ`b?ÿñþ]þòjà;›Þd™Òz¾YvaýÑ•Cȃ ð7׿Ñ×¼ endstream endobj 5455 0 obj << /Type /ObjStm /N 100 /First 980 /Length 1351 /Filter /FlateDecode >> stream xÚÕXËŽTG Ý÷WÔ2Y¤n•õˆFH<4I$!†HIF,´"4ÍC"ŸcÏ pÌ# X îÓçÚ.Ûuªn«¥’T„“¨ý/iúgM•h©Gz"rd$êŽÌÄÕ-‰›!Z“ÝÀ d( øÆ¡‰?ŽÌÔ›ÑҨÌž¦ÒjªeÔ(ÕÊbÃêöp“T‰Þ’£æ²ãê¼n ;6R•âØ„%†!ß*Ó°ŽÊŽ!†Ç£y‚1Z·1zu 1zs^·Z8†CCŒ1 C•êÃbÌá%*¾EÕŠ¯! ÿc´DLÝ0—»ÕË'ñ²ÀÙòUÐÒbج°¼Vžu:ƉÚ¨¶@jÃü¡äÔÙbLÄèÝ1Ää<ÄÍ1Ę˜Ę謚¸Ç–8ư¦=‹ÖqeÇ41µ¶Õ3 «–$Kõo1ÖFÕŠé0 ,xVu žu:ž½¢ìÙ+† Åp¬Áê1à”={EqسW´‡gµ¸„ËF°8†,↰LÇ$IeÇÖp¬%!²u B—ë«ófÛ ¨:<« µ²M÷´ož›Øh2&Ï1xîì<÷îÏÂó ‚<`5ÇàyVó‡}Žf®Jq K-[Õ4ŒÐnß•j_ͤZ{ØöZƒöTÝl–{éÏlí‡iùí÷?’¶Ü¦9êy––N.^¼x¼¹uëýäZrÇ$…È¥<8èY¸çŽþÉ5w‰¦Á’z#çÖ£ž+å^ƒ $x.˜®¹ö\±Ã‚ä™çŒ’ËÌåíjîNÎÓÁAZM»æåC‡P/*×6T†¯lÍkNŶ²+vßµ­<^}°µ H‰}BÌåÁéîéÑö<§åÁ½Ã´<ھݞ]j¨c?oŸ=rg÷2I§f‚H©yÌLj÷äNŒ/—üÛ'';8=¾Y[!7\H&Š#ÈÚ¨Q2îr=ÆÅ;H¶;xˆŒ{1ÊÜ‚dUÑ%ãZ$Áb@¤rYÝ@kdô¤Ìõ\Pfz.¹PÐó~…X!ïWˆUÏ_X!þGMÐÒÞÑ{YûLM°wÙøUç ö‡4a•¼OÖÉ{4a•¼ïª³JÞwÕY#7•z”L¹5Ž’5Û/Ä_Å–‘•Ó\>ÿ4—:Í%pšÿ^V endstream endobj 5564 0 obj << /Length 1388 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£3Ô Iñs{ÚÖ¤K»aYš·´4›Ž…8²+ËM³_¿+‘J$ʼn?hËP …d‹º<ä¹:÷9]!‚Þõ~9ï+ƒ 6’It>FBbi"¤ Eç#tÑÿ8I“ä`Àéÿ|zâNÎìØf6Z÷ñ8]ÆÓƒÏçï5AʨÈÚ+˜®ŒÅ˜€”îº㦸©wtÞûÒ£0Š únÞô.>4‚kïÁÜht[޼A‚Ì" çSô±÷WÔ¦i GSPl¸Ã²(×u™_ç—×ö€Šþ]~7·×'"ü§%8‚(‡w-¨V„# ,x µø^P‰åˆa£ Ê,×°5£­þöñŒc¡e5 L‹Ñ¡ñý¾4ãWûºÉ õXfö¶ ˜]!wræ âJByP¦°VžÑ$ÍaOÆAJ!Mòñõ;ËqƉà¯<Žå"JóîH H]† i¸ž #p¤Qmà£hý7›æ!°dª»4iÆL“`°¤I$#q “Á¤TÜçIÄ.[»Ì#L"³evE©CÚ˜8‚%Ä ÖñIm—Ú`E•~ô-ÏâaîDä<»›çÉ,uŸ½ÂÙlìŽ×†•Zé¾Hª¡ÉÐ]ó¡ŠÇ&³ñtêÇ¥Ão=³óÓâæ8Ë‹ÍÁ;<¦¤ÎAp'6$j< ëõ5Q ÛV—[ñ«×˜SLÒùÒ#ýzÀ @Iü÷Ô/ö6É'«W•¤ãÙó Ìåö€ÂÌL´²£žÌaÌÖèç3H`›yŒ³uä哸¿pÇ…ÍßTg~W²j{‰FÕ "…Aàý ¥Ctfóe–.V¬ #jû5V¸ßNàßåŸü2Æg>%ËáÐ.ãåûéëeO5PS(ÏÕýËq¼Èw*þB x°twÅ_HŽHSWªÞЦêá`7/þBjL˜zZÔW6J¯¬ÿ.ZM€úïôÛ”!)Vâ%ª‰àkf¾W“ýT“¦Ô6ŠÉËHízÖ ¶÷—÷K¡/J3_ÚÔö1m–Á%!úJ?ßIæ9— lz<*ÕÇkÅ“ùp°›Ë< &r¨o ¼‘¯Îäq°×švgòZñó$ì&3)[öE8Î@vØ‹8NàNâ%î­'p“¤ö¾5î@—›îá¾Ìí0ùD³£'&}(íiV•™ï–pwK¸j?÷dñÄ‹ôé,önãD^›«¶h}#AuS° ™ý²SÁ´ÄZwhxÑ"Ùºª ­øaµ!ìæ=S¶Z…ôñÿƒ÷Ä Lºé®ƒh†L’P¨[ôL‚@ í¶w8‰³æþBÞ¤êI®¡„µ±Ó,Onì΄ Ž ¥Ý1ÖŒHY0Øm8ª,*N¦“lû½>3)v|¯ïH›ÚtgÞŠ_뎷fü@Þ‚ÁnÃØéˆïЪ'½:ã¤ô“{îÕWýÞ̈À¬r$kÉå<³y~‡¢$íÒQP­Á_u×PP¥°Ý O+~X‡ƒÝ¼¡ šbùZñu–ŒÖgoù®a]´º‹ˆ¼ºæ‚Út§y­ø) v Í£Š`ªüŸü~´®¿x†-Õè.Æ“A¤€¯pÕ/ðò‚ò"ªwU§^öÀÅî0YÞÄÞŸe6=8ðÌÂS²°i?8¸ÊêåÛ4î³¥7ƒ^­|fp:Z´|dus‡?:°×û¾BÖó«²ZÉí¡DTH'q:ªÎgsëIW?ÜfIž¤WMÄ«þX¬H+Âwù[±4(¶ endstream endobj 5590 0 obj << /Length 2441 /Filter /FlateDecode >> stream xÚíZmsÛ6þî_ÁT§bðÊ—ë'ç¢äÒ8Mj»“é¤ MAÇ©’T\ÿû[`A‰¤¨T¶ªöîæfì!^‹Åîb÷YØÄY8ÄysñòöâÅë r"/ò™ïÜÎé{~Ä ‚o@Û™óÙ½Y¦Õ2™$îåǷظVsUªU\¦ñ]f|Hëe_Ôæ,óâëBúòX Ú ¼ó•žôžÈ§‹@凜¶šù[©”%éxº7s8ÝÄ[x–îæ_oágzu=ò‰{ûóÇÉôêòævz=ùQ«á§ÉÍí(n_QÐt,¸§uÒÑÀµª7e^ ©@Â5 ž®‚†ã°§y­Êu©ê¸N ë€Å¼çˆÕZ%©ñÕÙ€;['¶Š)ÊfTL+˜1éö`mx¡õ ¤ïŒ9ñè¼XÅu¢Uºœ®Ÿ…0dÚ¥ç2<_Ò³%ŽÿÓÇéÂ0dkyÔ„‘#Т†žíµÝ÷ÐEø§  ?:^øÑÉøB[ÀØùܤËÿD79YØ'à Ð.ðïÀ Ðs5]ö}Ɖ(ĉðy¦Ûçö4 "}ýå‘BzLZ@4U5iÕFæx8ëšû¢ªA[« úûD_Ø&×ÛÓmÉŸ‚®{ò2áúty!ÃmH{X'YÆ0¨2­àLU/g8åe3/6ùìë°€3“èI° <úxá , [÷ˆwà$s݉ӬêÌøÜAÜ›”©VTüGyŸDÑ@æ1â>N×EUÏâZ=AÒçC*i„g í=þ§…öÓ…=ðäÀ÷OCû÷€€ïÿÇà€§äÁKDE*$ôˆ°ov¯\ÅUš«n.ÙO"ݵ©š ²-pË8·Ôqf}f˜itF¡ZiÓ™))sß_™tQJÝñÇ7·¯F‚¸—¦;ÑD\W<^àSÃXŒÝŽÔzºÂé¼(Wq–=âh‘c‹ïê#)LÝÙ‰º‘hÇql·e=LTªü’&¦$Ô}[ãº$Î-#»>]ÀÞÈ[îÌ×ë,M°¶jÔAÁ˜Všµ —e¥Ù‡PJ.ÍI‚Öᡎ|ÿÔ“fÔìßÊ<ਠ‰±;|ŠÎÒã:õÚL•–¤°SUµ±ÛX®m+𺋫fª°lQ­0:¯T>°ÔømsŽjHAz1Ð(0*¥QèÎf¢MVK)È[ãÌÖ§^áêÔ @ -@›MŒÝ$KUÞÛ¶D½éAsݸ¼ºú0âÒý4ò¥;Ʊ¿Õ Š5Óš$Í;|B÷ÝõËéåy)0+UUñB»‹Ú@[o 1^Þ^ã¸üˆº…οv?p>˜P¹¥Ã ÞÕ±žÈ;ÄÖÌzÁÌҺ켛ÐFðY7‡¶9Ú3àEÒ2áe•hˆ­”yÃFÛŠñ1æEþ¼y´àÛÈd¯q„ß&hB÷w†à„ÛHÃY:·-iT>Ó¯㪎ËZ·ìël` Gpλ‘‘÷Â,×xLfZ@¢`¥ZÁ±µàŽ`Å ÷ƒ/®ô€ÎE/XB?®÷V®†™²F¿úuGpw“g ¥Éõä‡É§°vùòjbùØ+ ¹§vAœU¶à†Y†Æ*0ò°L Œ„fÑ[iÝŒXNwj·õ€næ£S¹5šüºÑ†Þº8.éE.J¬‡ÀÌ»WöYm€P†UÚT6»›ÙéòÀ£ï|³«9â#3ôÖÕþ'Þ‰»ÕÐÐ3ñ™Ió"UD ÷q£êíӧʽܼ ×=ÓvŸñŸôúYÜOãj:S™Z<¿b¶åù* @:ždþÙ* ÿÓ* Ó…=¾búºTœRíy@¯’⿲b4òäiUù±E#Ô#{RÔ\æâÞFbÛ×vЀ}1‚7Põ|¥èÂMе&{ĦZÑäQÑKÓÂF— ;˜([Ô*OÊÇ5ÊÝ5¤¶|1?A£TëÌnŽ9KóÊ‚UHo݇wãË›ñ«ÉÕäM«.Û †íª‘Ö@K#èLW<ªêHÙ þf"ÇÛ–ÂÆ®@²ýΣ¦…×%BiLgêeigXnÂw]@­¦w³}£È6ïRÅÙÊŽ WüÆV¾MZÛ¼gè“t½;_ïëD©}ëìkæP†[™¶ÆAº±ÑI7Œh\J[f%vXï„ÓÚ‘u«1™-ð»TÙ[i\V1êGcüÌà•sº÷°T°iÙåÔ»VZ¨†Aô4Î*än Xº[mŸZ[­Ëâ÷G{„rík:¡_QËDQ3mD=ÔÂmz€"wSã,p`GðϬ*ì%HÛã@d€z2Ä¢_O6Dq’¨µ5t› ¾Øí–vñP¶±]c›Î–h»Õ§¥vS”Ä–¡CÔŸ¹õùà³B<ïN«ºŒkýçX.$d”b“Uù†ò*5U¿ž±rú°_²)Óú{q>Ãùu'j…>ã(~gÙîŠê ã(0nýmjœF±ÒÃå&7ç‰Lœ5‹ÎÉÝÈÖï,ÃÏ)ióouºpIËæ¯![|m®Nù‡ô–óþTŸT÷ã¸ïç¢ë­`Cÿ)^ñœŠü7w³ endstream endobj 5608 0 obj << /Length 2052 /Filter /FlateDecode >> stream xÚíZ[wÛ6~÷¯à#µ'Bp§¸ûäÔN«6M¼¶ºíž´'‡!‹ŠTAÊiÿ}ŠI­bÅÙ=9ûƒƒÁÌÀ8¸pðõÅ‹ÙÅó—QÄ(–T³e $’1 ¢¾ fið6¼[eÕ*©ÀáåÍÔnÕRiU,”ûù}Rl“|ôËìÛç/'8˜€BÉŒBQ4á guQA‡h>wÊcÓéâzvñë)te"X¬/Þþ‚ƒÚ¾ 0âñ$ø`%× Q&¡œwÿ¼À݉MHG£Ss‡¥²ózW¿¯ßmʪN“Z¥ï6×ÏX`øG,8Œba›Ïר E˜Hp ÕÔ "%< (žÄVÁ²ƒ­¯ípíþ”#1‘ÍN11Òçê÷véëoìzÊ]]Å4þ`­B}¸Â­_PX8» ¼» 4B“ȯhVÔnÁŽê ÞŽ ¦[ünop5¾àöÕùÝaõ;3)À{i0&HÈØáûÛ15±IÐÜÓöÖ  ÿ8Õ)芣sÜqð=)0†H!ì+U+½Î ²¥ûÖÙâýˆàPÕ¾¾rßá‘™Œ3&ŠsÊf+£†ÊðæÍÝìjÄ!øŒ!áìúÊÔG`Ì’{'“i¶U•kªWIí_Ñ…Õ«¤r…¹R…é 3LÛñ“Í&7ʳÒKVJ?Œˆ•v‹Ä7,V †±uµë…ɶ^Õ#fkµƒMUž6¸À~°ÐÆ&±„ð~Q‚#€@¹Â‡•…%§ ¥Î±ýe†WEÝâ7‹ÅVk?QÞ•kÕ¨ÕÙÂ~}öÆ"ü·ûµX•eååZýG-jWޙϋìæQ=35pµ@Áx¿»_ëÄÊ"÷¥d±P›ÃÓ_©µ1Ì;«WÎvÄ-1TºNšºÒY™úöeíVª1í‰dÍ‚Ãi»½¾»úʲªÚ:_Û ØK»†xæ—¼n¦7ÃçUéJs?Ð:Ñ®SÚ3ƒßf‰ß?Ó×ÿ°ìå«éÕ3We™-ç6€-ùÝØwc¨XäLÚçïîf~SjUíªw‡[¸.Î4–¹oxQ3Ìß°MËRûæm¥P/Ô=Ip7ÎÃÜ©@1f½ÈÙ½ŒÈAš÷ãï}½°5A4ŽɬØlë.L%óÜ#3.v$~Ër¢m;ȘºD8&PG½óÞªz«‹êz DD¿ÑhAe1Æ»¸ “Y‚¬û¹ š8\µNy¸]*5æ qðÅ1#z÷¹”Vïü†z$›‚¢hŸŽM È©x265Л:ìél 8,"„ŦzË?àSý$|*:‘NEŸ„M 6‘åç`S ">ŠM}0?š”Öw²ÙŸQ+â7·×ãË‘á³o®_C`<“"u­ßü8’"ìbHå¤7º>dÀqR¯6IÓÌä“_™˜zíS˜—&ðšþuƒ%+ OÓ£Ÿ‘!¹±ˆÝ0Äá~duš«ªr²åòWf*LÞç ãÀÐ ñ±Ù˾%¡±µ$4ÚŸº†4ÓÀs,?ã¿6Rš.«l±rÕ‹¤òƒL_OgÓËW®Ú§y¨öižK—á ׆EÛ\êýmªîâŸ'Uæ–K¯v8™ñ½NÀtÅý!îЛ³$íd$ÞMªýddC~ ÐÎJvÒˆ$.˜>¹J´a@†‹HÎGò{ÝSsÀåL«u9S8är¦w9£"ѪA©u¦|Wp1·€:ubK]®ÛÁÑÉ&l1³<ÿç'OÊOÚˆõJ]ÿŸÌŽùñ…EaÊžŽ 0#,ù“”þóÊù`O'(LRÄuKúPfé_3”Xî”võ‡üdò?ÂOžê‰|‚àþtŽÒצ£œ öGa’!Æ%x%A,öQùåôÕußÄ&ž|7!®#¹\Ã&™¥ØŸ…M2ʉ}x¿ñÑÎ+÷Ym׉§Z%i›Y´ò—Ë‚rÙë{ì>À\n5jVÕó/ãtßÝOŸ²ëCäà‹‘üxèûfô«°Q~=––.š‰èÌ—ƒi$#q< ‚VŽËäê‘GvÊ0lmòt‘‚­ §OèúÏ tçƒ==#RJ?óÄ^þfwÆóþAÁýˆ`Ÿ#ÆB|G¡{ÿh ÿ'‡t8ðÞÜšCÕóßOÓËÉ Zîx²1´ØÔ%îgw@Û\¹æÂœÂssŽ5µîÆÝu܆™³”œûw8'‡O—VÂ? ÑX`Nk'n_DLóÜÏ!»‡±‡Ú»7ÒŽgí3Ke¯äEs%Ï"{ ö ÉÌ‚µ(ë< 1€¬ò¼òE÷6rd¦¡÷¤c{Øûsæ¯ëAµ¹ßð£¼ùÎ •^ÄœØ]1qðH8†ƒ6 nÏÆFº¬{½¢ìŸK]Md¬—¸W—Ô¶”¿ö`ÀÕö \ê÷N&ISmoSLëNþ©±)\Uc_Ñ;vÙ™ù&Þ1½ó7óuÇ6h´;*´úu«*ÿHÄ­#Xµn}xû$±]´÷BFàÀK_x5©ZÚ €mnßZXtìàß}ùð÷3–öXpÔ¬î?hì΢þí­í¹»?Ø#IGïü³»ÿ°šNQ_4h†ø[®ýCñ|e!ÿËW>n?þÂbæÐ¾pHT˜?æï^þ t›¢ endstream endobj 5625 0 obj << /Length 1760 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_¡ò03|Eiû”néëºv‰mH‹@‘i[¨,¹’Ü´ûõ;Ф-ÉNk[uÐ’è|øïÈ»ã;3;Oƃ³Ç"tBúÔwÆS‡ûÈ™#B¸ âŒ'ε{5OÊy2QŽÝó×ÏôÍ¥œÊBf±Ô/£l¥Ã·ãçgìè3è ŠOÀp5¥t{¦/Ô U§ÁÅxð~@ vȆte܉ƒë·Ø™À·çF^8wuË…Ã F”ùpŸ:Wƒ?¸)X@<,&'(ô4—²–ë¦zWÝ,‹!Ån>dØýøéf©¹½ÁÃ/© br®.O:tØsó‘çEW½çÄG”xEa:…t¦ ~m´Ýo· qL혨Ö}ñÍÜ´ñíÜî3BËG! ¿Ù°˜9úæÒ(”W+Õk*•¬¸Vj’UZ_÷Â8×#‚)ÆmýçµÞ›=ëv´Sv`¾lc™Õ¡PÚ½™ÏÁz©3"ˆû†Ü÷ÁpħÑp íZ± ?ïkŠ”"¶×Ã;×ûw ÌG¹¦ý«¬d±H2³)$S}­’øÝ`WVæ}©¯õ¬w› %#Œ9"aâkàñ\AzÌ}}9ô°ûJýùëoýê Æ,š©{ª‘á]Y7I¦¯‘¾´˜Àóí'ݯ²øã'Wúæn.M×ÄB•åJ–º½³´ÑpÄpàž/—iGU’gºO)‹CÂ]Y’/Ï¡wñ\‚Æš[96²ÙÄ ^Ùf2)Ö³û7jÈ—fT5±  j¦¹1$<òý*)Œ²¢É$QÝ`×Ï+èšUàÝ´ÈXÝl¬:e©zd³N›†žƒ”Y˜fùº•bú!™XèÌ2™$fˆªˆ’µ–ÆÙc‚›{Ìeˆp¯µ’À4—Ü‚ñI?uðZf †¶e’-W†É‡!ånT$ÑmjèÞ%Õü{Ϧy—t(ƒŒ¨Þ4G$D›=àRV«"+w°gä‡Ó·ˆ5©,ÏFx½NA˜é–²ÖÖ×X³åF¨+·ãvGlÜw`I ÎÃ-Ç[È(]åny›÷Nçn¹à0yüdßÏÝö'»¿»å"@< }ü­V{×ÛB£oÅÛþ¸¯úb µ“I¿§‘ô&»‡‘0Ÿ!æù0˜@>ez†ãyT´§XíxmmÝ«.`(€a£í.óÙ_epeBœNemüž*ëMö•) |D”É?ò¦»Ê@¥\«Mì¹ÆDCc)„T=¢ZÎ1€ÕrFjÇYs¿øaG\Ù˜I;,ÃL­K´Ýg=ã#ömG,mÒ;C–õºì§!q0ùeÞ¥&BrrÜ¥&F‰Ò4‡UNô£Úh@W¶STѧ®° fÑB~AN BvÉi¬¹#ªÇa‰ð½e lK@›Y‚Ö°N.j;…e‚jIƒ B¯ž>ƒŸ›W/v¢å*ŽeYNWéqeV'>w7U’¦GE˜æôt& =DÀEžÊuðûy¢þd÷0Y(GH¿3“F÷03ü:Qæ°GŒÉð¾w:3iã÷4“ÞdX䀧'Š1Á€”ýTÉB­:AŧË!;ø=U×›ì!ªƒ„Õ Ù^±æÁ ÝZw=#N懰åû_;âÜU˜€¼ ’jþ?åÈ%ˆ`ÿ„Ž ¬„x§K©:ø=ͼ7Ù(…­ªäf_x÷¹²¸ëËê¦ß_}‚aÁãƒdr4;¹_læ³0ÙPœ…,—y6Ùœ`ç“ìz5ª˜|d¢J}JJe:QÇþAmSóZ?ÌótRv°6#ßÍ¥=…o|mgde•/õÝ­\óÓ)]š˜Q¦yÑ¡©¢ÿüùÃä*[S'§ËBV ‰MÝ>k1Gû÷;†èVa¤òȲ5 !9§ó `HÈÉ|C¿ŸoèOvß@BŠHôNrÔ‚Ú.]§žAÂ3ÐyÀØQ•ëö ø\Õš»—¿_ü9$»ç~»Ðï6¥]nªÔ\—•ýN•š›ª6w³¼XDi}OyfïÖQ}4/n͇ÊØ ŽfEdk´ðA]&±´”8ž$e¼*Ë5’Ls-hÍÌ-el ÛÜ…€^©ØÔ½ŸU»JÒq]ÌÔ]•+#‚`€®_&3­jòpZtÁšt5–îSÍ­V…=‚õ0dgÐ^¸e^ïÔÐs0«4*RG…œ®Ò#uKõ¢Uª‡Ï0Gê,ÎÎ ¼Ù²‡]s°QBù¿G>e {[G—³×¤výƒšÛöŽùÿ´´õþ endstream endobj 5650 0 obj << /Length 1799 /Filter /FlateDecode >> stream xÚÕZËrÛ6Ýë+¸”:Œ7ˆvÕ¦Iš4I[Ç]9-A'2©ŠTçë{A€2IK¶d˜i=cH¸8ĹOB8ºˆpôjðËÉàè¥Ò‘FZRÌ"!‘Ô,RZE¢“it:ü0O‹y:S‡?ÿùÚ]›™Y™lbÜí»$['‹Ñ§“7G/cÅ P2++Šb®`¹J¥&¨xxäʵ4xq2øg@`ŽÈ ˜ÊD4¹œ~ÂÑž½‰0â:Ž®ª‘—‘ Q&áz}ü5ÀÍ‹IG-S¤¹ÃRTïuV~.Ï ³ ~±­Åõ ÿ¤‡‘V°m^u 2¤0Hð ªíD"JxD‘Žu´2Ѭ­-m{ïí(G"–õN0±£Cåû}i˯÷uŸš²$ÒT?ØJàê"rÇžP ®"”7 ¥ ÅÊ3šf¥#l§œèh¦wÈ·¼7'Úa„Ã0«þÉmQÞ2¬öl&h.Æ ©¶v‰ˆÅQcà-i§Ãgûª!aHRÕŸ–´åjI0Ø=´„I†—°,J„ÛáÉ<éÐMái›­tBc·êÏþœaФŒûã¬-?³`°‡p†L–~“Óoæ¬kf I¡feŽ´…ɺ¼Y¯ÿÓžÜI­!Lê·ßiwFd©bлØ?6Ë•) x»1å¤z—Ã*xq:\®Òl’.!W³äÒ¸«4sNFL ÓÉç„<ã…$…k¿™U>.Íê2Í’ÒLÝ„¢‘h4fX Oæ^œëõ¢ 72Y,ò Lt½ç×®-çõóÙ:›”iž=³·l˜dS?¿tÏÓ¢žáEÀ‹.ó¬HÇ–Ø#p̰…Þ’ÏÓEZ^»$Ÿ¹ÖÍ„‹ `©¶Äv殚@¸OKûR° ï󺫜'eGR¾.—kß *sQÎ]¦C0kè-å ‹Á[¬Ë)hÖõÈin ';Ëý"Àßb=55+nÓ¡Ãr…Z l15miLuŒ°5 Æp›!R¤&*#È•<¨;b[øcDõ~šmöæËˆŠa²J“ó…‡|•Â^9ðM}«^qv/vçtÆV¦²ël;è!£‚ï ?®G.sÈ*5‘Ä© ´™±orµ¸v·µÎLÝ­Ýv?¾i'²ap=ɳ2I³Í}Ó*¥³J«{`ï¿Î¹©`“Ú}‘FÚbŸ¿ÿûíÛnžbûm–â ÓažÕ¨—ùr½°š¾EW9ÓHÅme­ lÌEŒ8k›Ù5¦àOÉF¬ã¼‡P.‡©ŽP±ÕNZœ‚@Ìøá*yÃiÃô½áÖ¾b˦(gmÞòÚ iXÓzXž5}Ä3wc¬;þjmxc«;Œ·r>N ïN€ç[@à°@œÀÕ] @c…P|ÿËBÀÇô.޵j sÍ!q›ãcS®WY±Ýj‰ˆ·ÚZbõž~{ güî=Ë̯Åz21E1[/_¾YŽ9CR `ªˆ»ÊÂ³åƒ CAqåv{+ †â¼·ô±#?,} »a( ¼ Pƒ†À|·4¬>­ÒC {ü€Ð‘¦'á`(3Ô4TùÌ‚v±‡ªHàÿv) ~¨ z$¤á2<­¾G1„@åû¯Æ…6³ñ¾Ûó=ï¬g¹ËÅÒLÒÓ*y²7eŒûS üôZÑSBÛªmQáÊ¿f…´A~O,gHzP(W‡ow+”gy6Æ[Âø£hÓƒƒÿ ªÆKè(”0 i¬ýå êI¬ûûìבæÛÃÁîŸ0Ø ‹ðàF:©‚§– 0(ýÓýiK[~ ¶ƒ= `œVõé› Tºö`riŒH“Ûâ© …z³àâ¹TO>ÇcôM;ÇÛvRJ5F¬®Ÿš±LlÈ…<)Ó*³8<"Bº4SýED*A–êÏ:òà !ìþ‘šTúˆhù;ÛÃbÞ‰‰ žýN8ÔÿŸpxˆYQ°j»éß¡t¢Ðpí‰^|-WɤtŸ»Æ•½šä+wøá>"2â¾OWƒæ~LEÅÍ”*^LÑhÌ5q5nw3ÏÓ¢#¦–@†Ws³2·žÞ$ß›Eý#èÜOwÓ"Ö \^/S{síºìT-}ˉÎ2)Êû¿$?‘ò¯]Nm«þz.§ž×Xë°ú.¾\™2±‡p;ÎL6mÎØZ4XKm‚ƃca a¢û‹„R°ÌÞBF[|XĆºÀ `gŒÇA%ÔÆGu£…|”h¡ö *¸t"à©&ýéH[~ ’ƒ= Á&„Ã.ë~~_³Cö§ cD8í¶¶ü@Ú‚ÁBfö°·Ÿ_ØÔ´þÈFÛ_U°GÌÍêööÅü!¿7ý3Cµ endstream endobj 5561 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1341 /Filter /FlateDecode >> stream xÚÕXMo7 ½ï¯Ð±=T#‰”DF€|Àm´âhkä&‹"hà-Hÿ}¹Nêij0Ýôâ‹Íå¼!ŸžDJ£ÞYSI½÷’¸ÛÿšÔ·TÉ”ª¸‡Skîé©M÷ŒDÕ=3Ñp$.}CÎä`å ,äèä>ä0â°c4‹'ˆ7¦ûC†…ÈZôoÚíiEdg?jKTØ}K9@ˆ*Ù»–êôw±2Zs–Fî“D𥰰f UIÄ  «Âb÷!›.£ J'h5 ay|ÓÔ ‘Åær4D›K©«é!u5‘UÝ×°:] Ðåâj'®ÍÆ àêjÐHܪã&¬aœ +›\`Ђ…eÁ¤æãš˜Ù}ÈÁâ>äè® c,8äÀ²åáºà×$yªœ‘WÉÔ0!Ê0ê±7L-,Þ]¤££´[ßÓýKÇè|(ÅKÕN—¶•Í šn4øK*íƒÅ+—?eyr¾{y²½H§iyòè8-϶ï/ÒGÏþþk‹/þØn–‡ ³=»xk]“íýÍòtûv÷îüåöí¾“ºïÇí«×/ìÞ§Sãˆ&‰aaËÀ2}Ž|/ÎÄúÙtüUYý+Ë7udB§“)ÙÚÀu¯¢?”²(šS |°ÀVÁ‡ l Üf–É106­\Âà9rÑKV ‚ÑýPºAéÐûs%ŽF.¹´ thѹŒ`ä¦t )¬]Of4rÉ8ÁS3Að@×CaÆÀœ5¸ø+J­F§GìŒ%ª3¹bmÈÝhdZ®72‘/nd¢W6Pœ7²«èÙ˜P3ªq±MÑZ Œ#rž,A0–_)l’‡#—¬Q™™{¶O ¸` Q0ÔhÁÈ ›ËXí«`Ê"<'݉bE®£}U|a1ÚçRüTñ ú¦b\:U¬ƒœ*ÖÀèVyíl½ŽÅn.- Æ¡bÁøžË¤—ÌQåhR¦(v´L=HÙŠ€çŒ‚KîQ(‹Þâjýzqíi|Qq5¾ÅN÷ úÆâZc&×N8ëXÅ~da[̬ þ¯.¾U°f|CÁP®K4ò˜ë»Æ˜k‰ÓàÒóÚN¾Ž•L#(3éÌ\ƒ,2sTfj#ÛÕd\s_»Y3ÇÀ ÊQÓ(¸d»m ‚ÑÑûݸýú±zð;V/÷ÏÎvzº¿r3Z~ãfÆg4¹YNÞý~á¿¿>ûs³<ؿڞ{²ò|ù~ùayxZý‡ñ{‰‘1va’FÅg;Z£°:v¢ÑÄÎpÀÝw‘OÒòÝîÙ.a޾úéçÇ¿}xÿÉÉצÒÿCéíþ¸‹ ìŽrd»1Uô<¾ _A¬·9ôð-¾@VÁ=«àC‡ž5ðçW)ÿ¼Ë‰© endstream endobj 5677 0 obj << /Length 2151 /Filter /FlateDecode >> stream xÚíZÛrã6}÷Wðm¥­@&OÎØ3q2“ËX©Tj’rÑdq#‘ Ùñß§Ф8±lÅ“dw\¸°Ñ8ènœ Óà& Áë“ϧ'/^É4HI*BLD¤Q S(% ¦óàýèr™×Ë|< 9~{a+ïÔBUª˜)Û|›Ûl5þyúå‹W P("TË$±„錮0¢0@&£¶ãœOO~=a E¶C#ÌÖ'ï¦Á¾}P§Ipg$×g”„‘€ú*¸<ùî„¶–°¯“3’ÆKmÖu¥ÑW:ŸC:úEi ë'Ê)ü1ƒ’”£^,^÷FDÒ8‘ qb/g‚„,B’&iP©`ÑÖÕ5Ü»¯>äDÆ¡ŸÀ*f(}¬~g”®~oÔCfhë$ Ó?¬QXݶòÎy¼f¼·½¦„œ­0½Êê¹íƒú‚÷SÚ t~{H1†b î˾&?-(鎎‡è ƒ #\8ˆÿþN¢$h îi{(Øg‡ÆcÉ£c"²W~˜)hL¸ÛÀ~möÒÄåׄÙêtñXwÌèÈ®uµémåÈcQ•k[Ó é¬ÿÅ+FÛþ§Á–C¶Í[¾%ö¾#žO{ú:kIH˜¦^2/6[‡óvòQVåÙõÊA½Ëõ²Õ¶óbQöA§²5É$´d¸¤´s½S`…¢q¸|_Êëé?ŽÉŽ{xÊ‹eJ„¿ä…~˜Á {)¯ 6:ÊŽ¹ëùÒMOÿ‘N:ì@ráë 8Íí¾§DL8Oÿ’U,B¥%5Å@W2q©éLiU­óÂÞb˜À—™;ñ_+å8ÑqÝÛ¶ _3fîn]eå”ÙH7Ô‰Ù Ö&=ÇOM†I6Зé¼,lG­ª[T¯*ÛÎk[nW:_gZ­p^*UoJÐoÓØyQål¦6:/nlÓwWê?j¶ëζe Ý™;+æ¶rùÅ7ß¿9³u»@3§^fÚ)-,À»Í5äÂûf• üãÎ:p­µ±K,F_½¬m-3y*•ZåþóvcP@Í$$Û!tò™-6U^ÌòM¶"cÈ=‰3&ŽôÜb›?Qª•kä^{#Üö5 Ìq23Æá¼[æ³¥Gš­ÖµWË©µ”Q·íHXnr›S~õ€(6ç :*WÖçF)ßǺç,c…r¦joR'+¬Šn\Á‡N\!\{¹õæ)Êj­ŒS¡å}Šô2¯;æ4FOG‹fB· Q.ü U«³ÛFqdzm± ŽÈù<Úóyäm¡¹æ¦Û˜AèèºHîÂ~Bu®MXšž¹ßînðµëÏla¼;¹Îjÿ}·ÉÑqŸ`gºC²ç ìÓZ­7zÈÿo¿¿œ‚Í8±¥ÝŠ M eãû7°©íÛ/¶Ð˜»]„va ƒKë ¬­òZÛ!óR¹¾¢Ô^w‰ º…0·ãpÀÍ6ƒ½£•úl<‰©4a„ý-7¹ÙmeÝÛÊ2Ãøµ‘5´ø†Yv]5®kïð =þ°ÌíéZza1R&Ä¡§ÉÐî0#.^Í`‘µýx·T ÁIî9¤s'hÏõ«|ŽÞ扟WÚ5cÅ»Ø}€ô¯1¥¶r&¬¬ÀÛS°ýèpÀæ¼wÕ¶è€ýê ¬wÞÌÊwÓð Zø3Çñ;ÛÉ1ò61"¿ˆvÞ€æ¬R†³UÝ›jV•u=i­®kW$ˆˆ‚mÊl¹°1¥a'UC½EÎBGBµ­¦b@ºÞ–l’‘ë¹ûrmË»|µr ”ë2±2}wúõåÅôülòí7o.^þ8fŒ&/¿8ùÕù™ëEÙSYôÆc$ä³Á­°K8hЄ<¦¬ë­r}ž„ j"4ñÛ*]»CÇôõt,ã±­S'å‰ê­°ƒV¥~…y´×šéž~—¡¡fXÃ(s‰ -Ö¦„¶‚ áßÛ ë"ɰÇÙÅåéçoÎ';“3[j°FÆPb 0|yõWT Ér[e7žS®‘†üÝÂçvÅyÕðŽ»é.Ë¢9£ÙìÖšp€N»g´¨µÝÍá,tŸTîèêóÒ–Ör ÖX®q"|õaî$×µr‡™Hw€ ]Öpƒ:¡€#;ÁÒø*QnøÎÄCŽhGº5Fïæaàÿ¿ü)¿e1¡Í}Ö²èÜ *vä>Ù»VxÖ1ÃëÆ3}°ù£#ÌQSÈU†OÓkõÄ×–H¸*?ã·L‚F™<ÛÕ¿§ÿ¸«ÿñ`Ÿa2…«¹8æ}æ¶½ß%Ä?ïw †o/,}¾héê?2ZŽûˆß%>ÑæÙü­ûM¢(ïŽyõaøê±ñêÃðÕ'|Ô£g׿DíŽîs渷s0Çw¡¼ØcãµúùÍÂD9¾óÇCGÃulþêÞ×àŽõ@v—1¶=…üUéý°ðBNmέ ¿mvGWwIƒÊB«Êÿ`“UMå—Z1ÚgsôÝ Å¡ÿ ‹a‚«Ÿða¿özT endstream endobj 5704 0 obj << /Length 1705 /Filter /FlateDecode >> stream xÚíZmoÛ6þî_¡ö3$ERâö©Íš¾ C¶$ßÒÂPe¹jKž$/Í¿ßñÍ–d;~QÜ¢À€¢dòxÇ;>÷%ì}ñ°÷¶÷ú¾wyHO")¨ðî'HHß $\âݽ‡þÝ4-§é`H9î¿úë½iÜ&“¤H²81·FÙ2š >ݸ¼±‚@á+, (dL§eQŸÀ€ ì_š eR ê½¹ïýÓ#Ð {d­ õ¹Ï{Ÿ°7†ß>x1zºçÜã#ê hϼ»Þß=\7,$5=œLNdF—RÛ5ª¾V£÷£Y:eù€ðþãhaôûˆ9†¢•ÄHr5º¼m©ì£3/ð9âL«¬žs"%Ì£H†Ò+oRÓ±)mûÓÍ (C<n#˜¨Þ]åÛõiÊwë{È uYI*_@Y-°øâ™Æ­u,8P;–ÕKÖ³iV‡í”ã= ¦7‚À€r~}4ô tU±`Øgw‰Ôì QL½!A\H£ß/»Äpä‡^­ã†´¥ùíÐp¤ K]±uÝb£öïI•ó4³àN̵J㯂ûIeŸ—æ »ëÝgna Âýã@ð>jXyMpÝõ؃þHb¿±X°ñëú‘Xøùµ%¯aIˆ¨”®gš-–U]½">ϬAi5ÝaR6ÉÛJƒÖ“ ©ÙCϨ]¯Û¤ZY¹E{ÀƒãÕwµRxå0d/ÒlÀ6<¢"?Q¸øm‘‰}˜Î]VÄSRµü©bY«ê`b\xCŸÀ¦m£qyô ,lèù —KŽõϽ-ùÝ ·»²‡C/—ðˆÐ[¶ñ–p| à¶À–1ä“ÁvecØá-¼½80þxÈZ—³…GS~Çðè¬ìáá ùLÀd ¦u2¹Å鸗MÏít¨@çf¦,»¤JÈ_ü{¤J.”ö–ª¼u Y4MLòÛ Ò¥k˜P=*;®£»b 1?>Å”µ²À 7†ØLÍfyU.]|~Ò’‰s&©á¶ÍFš¥Uù×þ|Þ^•TÔ“Yy3,Z61ÅÁᬠt=óeµ¢‹°.±I°Êî›=m]›Üv:°É|Š|¨Á¾SxÖ9wïÞÃßèæ6PoðŠrÇIYN–³ÿ(«pŸD(ðÏX{1Xâ 8_íÕ’ß á»+{8`¾DXt©½”çÇ$€Š#ª®úÃÎ÷Ÿ^v•§òØ’à|QÒ”ß1J:+{`4€æmÐ\h. ä©–TË! ¿`P-KlðÕxÜ í¬ïrK5MvÒ4HÅý›ÌežUçFšrU^YåPÇ]Ø›¼Y¦?åKÓ˜çãtòd`œX»”J ;ž¸²ª¼¶ÂúÁòÙ.{l€ºs¯‘®øžÍ\vuªNÖĘ&ã=\ÁÇ1Ù8@xI²°‡½½[RŸÈ–삟áeW;_â¯xQþL`|˜Â¢HáñŽü‰ìäH£8ŽbÕš&#ò: ŽgM4( Ãó±&pí£såÖünù°»²‡³&HXê +kÒq10I7Î.†œýl§(T0$ÏGžšâ;ÆJWU NT téŽó¬< ZyާQñrüJ…XÍOw.‡LJÈù¼Û”ßѽ•=Æ¿<Щóø#².%Í1ä˜r‚pýtú|ä˜úêâro4n“K™&E>ogƒ„¦=ŽªÈqÝbCO,|ZçœCµaÅÔé ô-u¼×$YëíI^̣ʴ5ó†ë¢ÈEšTQñ¤^pN>&V'ø¹šºŽ“eWi®h±Tœa±È +K!º“;K¢²ÒùÞŽ·sãoЉÕõ€ù~ÿ.IZ]Ëé'«¹ÈÚ–+¨’¬J£™½×¦9ë ¸×R®×i¦ìÑ+t:j{­Þ¹%ØFñëÌÍƱîÕ’õà8)ã"]X Õ«§IKÒŠ™ÑÚÚÿÏF÷œÖá¼e7ã€'Ø­Å5\T÷ŒÛ]ìé=úê„â¼g¹í³Ù]ÕšÓZ×Ì; (Í~Ž£\¸:åýÍèÍí­z×{s»Q±@7}W³Å ±r$´ã(3o}™0å> stream xÚíZÛrÛ6}×Wð-T'‚q'Ù<%®Û¤ie÷ÉÉhh ²8‘H•¤’º_ßH$%Dzd9Óig’!H‹ÅîâœÝM°wãaïuïÕeïä<ˆ¼E’Jïrâ ‰dļ ‚g@¼Ë±wå_LÓršöT`ÿåooÍ`¨&ªPY¢Ìë‡8[ƳþçËw'ç!öB(™ÈŠBÀvµ,Ê(,BÿÄ<(ô¢ÞÙeïÏYØ#k%`)^2ï]}ÆÞ~{çaÄ£ÐûVÏœ{‚`D™„ñÌ»èýÞÃ̓…¤¡‡“)Š¸Ñ¥¬Ï5ª¾Tå(÷ öÇ£$‰=šªÑ\ÍŽŸ°Àð—ÔŠb ½‰~¼î¨ÍP€¹0¯ÕÖß‘ˆîQ…‘W(oÒг-mû×Í (G"”n#˜èهʷ6jËw6Þe‡¦,‰"=‚²µÀâÆ3ƒ¡u.8±v.o:—( ¬wÓ¬2»SŽw5 ˜bÜ 6š`¾Ä0]ǃýaS¤»-­…ŒsÄõ ý~ºK„@,ô§q6ž©Ž&þó]£‘0$ip¼`iË?0XVv‡`a’!Æ%l›aŒœäY¹C¼€ÿýdmoˆ@ѽ¼;Ž«xoßbФ çÛ¶ü}{°²ñ-°XZœOÿV£;SÙ¾Þgt4otäæÃ•}€7dÄQÍl¢Û¶¥%…ØómJ»Ò0M^ìê»0D=„²;Ï;3+)DVí¡‚¼£ÎŸª4ù¢óç¨?LŠ|nF±yR2ã4êQYˤZ깜YÀcVòTYAU¾úÒÝÔ SÒƒ H€"ÆŒš—õ‚ˆ¬u€ñ$/æqeÆiiž‹"_©ªââ¶/ÜœÃÄê?WS7q²Ì’*Í3ýû.‹¼°²4»:¹3—UzÙõvoüLâM=PÀó/”êL-ûÄW«½Èú,§…«¬J!k5ïõÑÜé!K–^¥™>Om¡ótfmwÞ'Âw&€÷4ë·™5ÏMvl›-¿ŽU™éÂjòIGÒ'Œ©ÛÖ¶ë'ç7¯èOþ0ëæ7#’qbá2óŸ;2[Á" 1‹›y³ÑÇ 7²¡ÏfyWÊàõm-™¸[L[G„4K«v¦½¾Êß?/xé/ SÑæÕΙ!ÅäáG®Óƒ8³¾†Ä0wqݧØ_NúTøP™oßÒjºyiÁ¯µ>³Vžˆ1ÁÝF–:ºAƒ×tvA(Ž@{Ö¶ÈJt؈}‚´hÇë~VÑ~ºï4¹W¶‹{¶óiB7³²õ ¿]!cCË*/ÔÐfÝ÷­70ŠÔÖ-ç €x¶íHPM<ÜA ‰Ûï ¥ñæ-üž¾ìs쟾9 ‡zøqØ-}ôô\­Ÿ54é!¢z”«ÒŒ²¼2ƒB- UªÌ¾Ú‰_uPijtl^],è±ÆêŸqjøl—||¿Mß¼Žx°tyÔ†õr™$ª,‘5y³W0€0Špž"POn6 Æj/gÕ^ÝÝÁÍâú±»\DèñŠ‚ŽüÃÒÐÕݽ;À!Áä®Þ{”,x³¨™‡n‹’N\š–ÃÃ{`dþ˜=„‡dÈxаè)RdÎmïÝëò®CM4ÜÚ¸=í¤Z³ôºXåpÆ?6…j&‡[”³4Y( ¤£%QmRÚ–C‹”:mžùf–_»Lù®ò¤‹Ö :‡Zÿ´n´v÷n¦-Dùñ€›A^@¤8pwä܇+»;p3ˆ6.è7êxlq¸ÛVñ#µ‰0Ä3ªÍ#ŸâX¼ñ¦ÐÍây§²Ø@üf±^´¤Óÿ&¤Ëc×÷ôv—™÷eé ¯.г¤pX@xl8¦õ•f7vÝ¿®=šM³|¡Õpݨz™­àÆyö¬OBßÕôù8X¹´a¬\]hwy$þÝ,¡òØ‹…àBî’ã±Å QLÆBù‡±ÐáÊîÎBKÄ-Ön2 •(Œvd–ƒÀ™Å†J‡_(ÿ7ò Ô=¬ì)øX0ÊBýkmBÝ ¡k àPa£¹vRÏ4ë…îfbÚ ùI¥²Ê~®¬ù³ÊtwåkZäÙ¼îŒè¦%R¤ñõÌN{?|%NûÄ?ýµÏ„ÿòÙW˜çI5_œ|)®E’ŒþxûK«kmþÛT¹•žÑBɺðÏúBø®sUwÄ«Û6U’ÎãÙóv—·¨q×&ï ÌNÇûõwÿgî'`îöªÓ¿ÉÄÕÔý‹ÈÔÍr=ÓkÕ¥Õq£3ü]‹N ¥î0¥óH;²ØB:´Û–ÞöÿŒ8 æûü7£º›ƒ endstream endobj 5760 0 obj << /Length 1714 /Filter /FlateDecode >> stream xÚíZIsÚH¾ó+tHÕà”i÷*uON³$Ž3É,1sJR.„QKI$å?¯7$sI•]´zyzÝoù¾~€ƒ»—ƒ_ǃ‹‘ R! ƒñ,!  "Ÿ ÆÓàÝðzž–óôlDþò÷•m¼MfI‘d“Ä>¾‰³e¼8û0~uñBâ@‚Ài<¢Hò^gdQÆ`A$‡öƒr¥ žÿ ÌÂY+K™&÷ƒwp0…±WF\Éà‹™y‚e!´ÁõàŸ®oL’š^¦ Hq«KiöuS}¬Ê›i2‹—‹êf2‰'gçÉM™TVÇ÷X`ø'FQŒ”Ð/Ñ—-µŠ0"¯L«­û %< HII0«éÙ”¶½wóTÀ^¸Lôì¾òÝ5åû3îò†º¬)ªŽ ¬XܶñÖDãòºq)tIj­û9O§Öb;ïF*Äx§#8'¨ %L/Ñ>á6¥úˆi,dœ#Fh0"HDVŧ»$Äd°ž7³é"ié1<ïꄣȆÑiÜ¥)¿§»ôV¶ƒ»°!ÆCx™D˜2{È“<+«o;Œ6þdMk…äQmÛPu4®Ÿh=­m]pžu¶0Aì§GÆi}îøGØåÏk YH‡¨o<:yê²no¦ýcºH²øÞ=/Ëdj[iÖ’³Ho‹¸x8 ÅB Ç~¨¬Š4»sëJ÷–üSº–U廥C‚€wSò¥“;¦iù)/ÝÂ|Ö’ôùŒŠa\¤ñ­ G8«œ½žHzŸLÓ¸JãY•¶9‰ £¹~¨æZwÝš-³I•æj8ÀÅ ‚ë ï¡òj'@¹º•G ¶?·d6 *UÊϬC¼?.óàÞdwP$°5Û¾}0²‰woR =îRjš¥U>×þõ8Cºg1*IÔ•#íÛ{“VùKZÍm+K´¿Ø‡†O›cp>­ÛkŸ>·¹³öŸÿ¾~íLÛÏ"±„¢ÖUܦê”eu 2ª w“«ÅAdE(Ž OGV„„M }Zòû¡Oe»“!CĹxdðáq¢êð³Í¡féÝEô ÚÆ@ê‡Aãvâ³4 ‰ åc@£ â¡cŸ—>Öë¨gÄlGZ©ÒÉGÝãB¶ø *ªi·Þ&Õ²ÈÊmû&–÷Þ·—è€:én¯í·> stream xÚÅY[oT7~ϯðcû¯çæK…B€‚Ú ”ðÐ6Ê…-@I•,ý÷ýÆ»‡„°§l¶R”Ì™3gf<žËgDzå‚e+AÍÿÖÐús $ÎÈ)PuN¦ÀÜ9¸tŽ¡ÎÑ ¹s,h²ê:z[—©Á´sZ°êèÈâœB!—ÎáP¸s$”ì­¡RçäÐL ¹Ô@ ^‚‚‹”ü#ÒæjÇX:O@á”bQ\œ2P¥ór ¥Î+ 2ÁF… KÙy°aF ²æ¼Y;6\(Ø(â<,„ ¼µ’ÀkÉW‡8u¯ fqPÅRº–Ø’{Ðjà¬jˆ1Ü…–¸y˜J¢ ©vÊ‚05§2(Têo+(Ã.”Ô‚hr^ˆú‚mÇALÜa#­¸>òä΃¾W…`Ã_€‚b5)lÀ ©{ß9©¾Ê°Ѥû­¯†”<öêUÈ#„t‚Sâò%§N!aвS5h- 6ªRÿÂAH ëÁæ¥f¼ÐîŸ@½z"ˆyì‹»ažŠÅ³Ï<Kß<í¼ž+••ú¢®ªt9üªÜy°Q{œ}{ZrÜÖ½÷å·æ<Ê©«BÒäT»§2 r×C—¹ç†pÈêª  èܤ)Ê [3 pª¿ÍYá_à;æšQˆˆœ¿E%ÂåÎCÁˆÖ{÷vfÃV×PÖaöëo¿c…Ѷõôý»wÇ;÷ïQظDFJ Slõ °FB “D–AÍ’KÔqaŠj6*¬õ3(l¥ŽjVŽŠì暢 XÇ„ |ÆvóàIZ”f£Â½¿ g$Ò`4ˆ ›R… Ѩ×òùñÙé"Ü»f}–¬>zŒ‹*\Ñz²¢½µM2„ªó žOuúÆ;âôM uõ›³ççg¯ç‹pfÏ>³ó‹ðÑÿü=Ç‹—oæ;³}¸6?]\øDéfvfó‹³÷ç¯æË)Óy¿Ì_Ÿ¼|pö!¹ÇhGÑûKUеÃÞËs(AÛ«KWƒTòev‰z™ÕRc’uUUzê'°Ò˜…¥ÄÔF5#ÁZ­c™9–AQ*KÕ›bÉ£šS‹5 jÖÆÑxP¶–è¸`PqŠ67--fÜ‚ËjƒšÉ}–<ª>³ Ãg ÈÍUñÖmòëuëxè6u[x%¿wzz¥GK0énu,¹"òD”‰¨±\j‡‘+‚:qÍù®gvøþEþùäôíÎìÁÙùëùyw1Ϟ̞Îö¨?øª^!LðÜç´P\ÂW‹ê c-'†Ü^ßšÃ0ûñìÅYÀÎ~wñ× ~vONOß{t7âp=r®ôÚªdT3ú €S³ÒZGŸ<ÅÏ~Øß{~¸9_ØPs¬Àœkt]Ѩ̾“ÅÛÅÅæc"øÛ0E¦˜8æhM·“e¢bBœS¢‚’2m9Q1#O¼1ÐrÖÆ7_ ÊÓg»žl848ÊÅJ—©Ôè¥<àÑþþÞþ“GwâÕ“fSŠ„ #i pGnÀÊ[æŽ÷s?_ôÊÍ€ãé¯޵Âb±©Œ ×XeP8ÊgÝ,\+œÐ * E”1Yk§¹AÅ8dGÖItTsЉ#§Àu)jF·ˆ<, ÈÁ£¡c@*yPƒiT3:=_O;Æ'ŸFþ3Zû­ˆ|+ZñËž%î`›ˆ<e"êDLhE&´"w‚VrB¹ãì? ¡ŒP¬ms &0ã†i¨~ÿ‡Â¿!E³­ÿSË7´z€ëÉ)3EÓh#Nm.°`.hÐäÐ åQÐÀª%ï ¶½šñ6@pWŽô²M€ë«_jgìJ¸dꨡXLµ¬uäÍ|ñþäõæƒA—| RĦêöb!è@Ò¯ÿk[f…v ×¢èú:þó|>ÿ ’ˆÞâäé¯B’uÂ7B’µÂ7A’uÂì:(|Ó=ðZáŸ- +B§™G…›f£Â¾ãƒ D D•hÌ£Â%7¸ÙÌ x¹ “F³6*\0µÚ݃ŒO/97q%’Óç ciú›@†ð .˜LÄ;l‚6ÁŽÕ‚Ž7Û³!AM>öÄœ3`Ùþ Â-–K? 9›E·ïfäåP´¨D[<èûu‹ß!JÃÑ IäXjoV×gĦ zL¹Ä0°µlìî£*:@çê:ªQÔv«Û¨Þ¬Ýæoí#s°ÿÛÀ®ÿ r¥‘z endstream endobj 5791 0 obj << /Length 1776 /Filter /FlateDecode >> stream xÚíZmoœFþ~¿‚úCt®rëÝ…å%Q+µR“8MÓ6v?9Ñ ÃâC9à²@R÷×w†]î€ÃͽĮ"Er ,»Ï<ó²³3ÄÔº±¨õ|òóåäì™X \îZ—‰%\â¶åpõ˜u[WÓ‹EZ.ÒÓtúÓçúæL¤’y$õãoa^‡ËÓw—/ÏžùÔòеÐñ8ñÄ5XÜv`çOÏô…;.šür9ù0a0‹ZlC–ÚŠ²ÉÕ;jÅðî¥E‰øÖ§fff F ·]¸_Z“?'´«˜Ï:ƒ£Q<Ä),\J¥:Ùii:lZ†™ÔC ­ Œ…ê”7êLê®éµPq:0©Q†Ö§9.lBá{¡YXE àÆÌÓƒ‘TU¨¡Ù4R)º¹ÎÈé̦þôuQŠ&jFbF†ð¡2J„q,ã– Ôq¦…a¬zemÜ3©¼p×<6EìBnºmá×Jë‚£¾ÀT·úÖX¹‹a¬Œ5§¶2.ìXy(s+,í„%> stream xÚíZ]s›F}÷¯àQêDëýd¡}JòCæÉ®’x73ïvt½HËE:žPGÏcWÉ<)’,NÌí¯Q¶‰–ã7?Ÿ_Ø À Ï”A.) ¸„á´-ʼ ƒÑ¹¹Pª—Î^ÞœýuF öÈÎ x• /^Ý~ÀÞ >ûÙȇ÷E÷\y‚`D™í¥w}öÇ®O, 5?œMAPÈ/¥ž×´úT•Ó÷Ól6)åÅ´LŠñ„àÑguU~¾ÇÃ?ÑÎb 5º¼j¹ÎÄÜ“L Áµëê¹ >¢„{…Aè‰7¯ùÚ´ÖýtÊ‘|7€1LTï¡öí:5í»u>d„º-…4|gµÁâÎ3+ 0©æu€©Däuæ*„ nÖœ'BD€ö‚„š®?Øí< NÀÝ]×:oæ©baŒ"Kc˜Û‰àkîÜg½îcÙ|›ú ù@šƒ¼ˆu÷ÍÝŽžJ^Sy:n5íäÖ`gà(÷a0”³Äqž•M^uá;ññ"*Žg`ÛNª)–‘ŸF#ŒO­ë½™ÄB$‰tû1/ªÉ"Êf]C<šo²¸JóÌÞå…i”ITÄ‹4»3·Õ"±4þ4†¨œT®_Õz3êî¸ý|kê.S1ú<&b”dÎZaîmßM¹ïÁ,™+»Ñfi-ÇË4Él{]¤Yœ®£%‚œ÷×I¢ñ RR£…±#A(16wî4sCy — ËFµ¦÷¦2ôþ`ÝvoG¨ñàü’àú^€q©@!fÍ@é¶Ž>D|,™Ëú?¶,6ˆ Ýö¬#§½v Eš¥Qi¯ËeGU23·¿¼ÇM}Â(b Š<ˆ=~{7¶–$¼ÿÔy¨Ü΢•w•›«Ï>k-˜¢º{ em¸ gHjça t•T›"+»'B„@4Ë*ªL;-Íu]ä §“**¾Ž}hÂ0±>ÁÇÕÂuÜÕJs—›õj ó‘ ëÎî2‰ÊJg}û¾ÿ xÝPïœ1­Þ›]Ë1%Û±Èn.E2ÅžFK{¯§æf_é/ÒLÍG¯Ðeêäì¥R{n ”&ÊZ‹[?€[™ƒ¶­Ö«ã:KʸH×ÖC¥¤æ-K[dÞÖ³í!öw©«-9 °è/ËÚÌOá§YZ©ðAZª' e\ê­yCÊþóÞizQ·» ØÓø Q'ðy³"©E±¶»îA´ôvwƒúrõÈvïßWªU Çä/éÒRõcÒ è6Ƭóõf©žÛà³Ú”UóÍY²OÍà¹óÍ¿ÜÄqR>PHò½Š ûyËåèúõø›¾y7}yu5æxôSU7],ÁÕlghlIí8ʲ\­÷ÍšÁ3E gß:pC_\> stream xÚíZ]s›F}ׯà­RÇZï7lûÔv7iúe«ONFƒHL0rÅÍ¿ï]v‘IŽ–ÜÌdÆ`YÎÞÝ{öÞsØ™;عü8\¾r•£’T:“ÈIÅWÁÑ%ÎdæÜoq¾ˆGc*ðð‡?_›“ë0 ³0 Bsù›Ÿ®üdô~òæò•‡%ӀܥÈã. WbQ&á×^šåJ?4øy2øg@ vÈÆx” '¸ܾÇÎ î½q0âÊsËž÷Ž $œ'ÎÍ௮OÌ#5;*LAâÆ–¼œ×´øPäÓ(Q<\ÞOßaL“Ð÷ ÿ¤´#%4º>\µìeÈÅÜq™DöêvA$¢„;)O9YèD5›h»[· )¦ª 0ѽûâÛÅiâW‹{Èu,‰UÏ`l ˜Ísrm½ Þ+½Êë^¥ Qê·Æia¶ǹL1n1¼ÅàûúÃÐUaè©©`ol£ÙRâ4Ÿf.PgLÊØ÷í>˜çÔ:nÃÝ/å"áhCÅçgJ¾'QúšzO˜dˆq cyˆJϬo°Ló¨"ÁýÁÂÏš® ˆœG9V³,õïÛLÓ$#ßì`dŠö 6­ãÞdÿÈuíîºý™ ùE|< ¥eƒÞAælDáÜOmV=¸m¿b¹nicšë<,Pc•._\w,vÆ”@‚aÍ-Á¿>ÊvY•ƒ¾k!6æ ü2Úž;Ì1' ˜Õz‚vú~’,¿í,ï>•ʤF©k3šyfǧ§>fA| zH¸t›Z­Eà(^Uõ4Î,ANËžfBÛxåÖ‹=˜FÃöë°Xeé.ÿ1ˆðºû¯†¸ß7¿¼†¿é¿¶¿¾G#*†‘uÿ*ÂIøù%ˆ.Èay:B5ñ{ª·±TˆUH<ÞfT>]´µ«£Äï8çm£u“B‚0Ãî9$†àæXÚ}U†H¦†¾>xÍ, Í÷~ÀÜææjëýqDÄ0LÍZ­ùAfqÏæh4fØN †%ÃÜ<­Ò ˆ—©¹Ò).Ë-|½–ãÈðCnðbÛÍÈ}Ұȳº@Ã.³=¦_@'¢ËâÐâ—ÕšQª¥ @Aʉ  ºKìГ«ÉÈåfjõ£e $rá–yß%ŸL¶úû•³µû9†z­þ…EJçá…iZåz=Õ+:FM‹y±O·\´”Ÿt9N˜Wm¾ÕRzF&×ÚN~Õ¾ÃÞ¦™Wzl‡€Dë’ 1ì–øi•eaZTKTÀœ¬bÙð®fËÊÌtiGˆï’ðž5—Ak½ÖA‰Õ³Ér_kÁZ© @ºkÕ¼ÈVh>;ÓǸXX5C‚i\F»«ŽŠ^w&Z®ÒÙÓzVO «NzÖí>½ ±¾MÚÆÇQÍh»˨Çßÿ~û¶ÙkߨZW©—tÝuÇ ãiT¾„˦>&1ì¶<ÌÊ›õñÙÌ GD‰ÓÉfŽY);N¥rZøýTNc—ÍCÜ¥üŒ²yiêT´ÑŒitü ”ÑLQD]÷dká÷#Xc;Èh¦Ì—}™gw´w=‚9Ý+ý~Oïö6¶‹w=Ž$–/ìݤSÅ\1vŽ"ŠIŒUÄ]fÅx±ÖàÍôUŠÂfaJ©ýŠbÝyïÛ5—Xf4…¿^½²S6b¨ë0€½ ÃN•Æqbó«ÎnŠÑM˜jkQŽ\©ºkѺ÷_o4â2•\xr ±ôš3ØlÅm5MïîÄ;ŸiÍš&!ýj‚çQíšåÉZ°ÇAøàC ü8;J»Sæ"qŸÓ)…¸IÉÉro ¿_îíoìáÒj—cuné^ñ§¢Ц‘ñ?O"”ôtmâ÷th_cwH'áês€ötWûëÝQåŽTåÇg¯v(æåñd.lâ÷taoc;èaŠÁ¹Šüô0lÏcÝKô§üt?2¶ðû¹·¿±ÜK”‹0£/ìÞa·c¹CF®ç¨wˆK‘àd»ÞaXÔꆥ)atóºÞÑ­¾i««%ݬÕ_Ù®Ëò¡f¹£û”¹Êܵ[d£¶ö) ¨†´0r8 #=Œ¿J sç!‹Ó ~0@Ò*j¨’¸+‡“jðÄ/Š0ûFËÍÜô+¤‘–™+Î?Ùп£J[—$ÙˆxÃùêÞ øµ,{©²¬OÛŸë@1ïñ¹N…x¢Â ”œ×úng4v”4’wŸB“à»_A46SûÄzc}¶@ãPìœé#¤þ?Ú,aöÙcœ‡ÍiíúvšCÀ5ʤë§Óÿ³€Õ endstream endobj 5873 0 obj << /Length 1848 /Filter /FlateDecode >> stream xÚíZßoÛ6~Ï_¡Gg¨þ¥ ÐkÐb+¶Æ{J‹@‘i[¨-¥’Ü,ÿýŽ"eK´œÊVnC Qâéx¼;ò¾öæö.Ï~™œ]¼–¡¢Ð§¾7™yÂG~È<ÂUo2õ®GW‹¤X$çc*ðèåoL㽚©\¥±2·¿Gé:Zžœ¼½x`/…>Ó ¹¤(à†«tQ&áŒ.Ì…òP¿töëäìó)ì‘­ð*^¼:»þˆ½)ô½õ0âaàÝW’+OŒ(ó¡½ô®Îþ<Ã͉¤aG­SrcKQÍë¦üT7óó1Á#UÞÌÎ)eùM¡òêÑ}Õ–~ÀÃTæb =”¾\:Æ3$1÷$ó+ãõsA|D ÷( ƒÐË•7kXÛÖÖýtw*©ÛŒb¢¥‡ê·žjë¯=Ýg„¦.…4üÆV ó¹gïmˆ!”Uˆy3Ä4@œ²fî꛸YužÄ$üЈþ`%Ü<ú˜»meŽN“0:WZ£\}Œq•:û”7M,ÚoSŸ!r¦—‘± i⮺ëÑ‹¾¹K8xGž.µÚú¦Ö`c{¤ƒP0îÃ`q_ÇYZ´Óª+¾:Fñ"Ê÷& ìZ+×™h:ÇÈO½ãK ‚!{“sÝ[Hü æûõbÌòr¼ˆÒ©)³u—I–Ú»,7 XQe’ÎÍMd.e:¯vh{ŸÙë yrNÅèË9#ejGU÷VïvÜz¤ÍÛS5ÓÚ£õÒê¿Ë“4Nî ¤U·ñ2Qi‰ÎÇ ¤®”ªMêP‘F´«ÛÛC»rlC†Z.^ÜL9ì)GT°öz†²Öt3ˆ`Éêêú££±‘Q¨œVÒõgQ7tt–Ö+Qa¯ËeG¥²î»}è=ýã¦>f1@cÂU¸i︀ ð?Ünz¤ÑJµ“k¾É6Ç[:„Ø™E(c9CBP; »Þ«r§E÷,ˆ½gÖ’µÆÇK2«Í^§Ó¦]/wýö²ö4ñ’6Ÿ bAØ#ˆ©œG!$Ä;BÀ¢ä'+cŽþael¸±ý’à Ÿ>%BÒIâ@#‚é ð‹ âtIÕÖ?0©{6>Ð5¼ƒ»‹›E’:¹ €‹à¸àíj; x¨BœŽ39úo°±‡xqÀù·ÛvÖܼY ëI «®*¹-Ø—u ÝSZ¿$¶cryeJcŠ¿ð§s 'ÖÅÍw*N>`Lk,åê›çQº¿ÛÞªDkL„ÕåxqêBÒõÓuqd{ ±Zìp¿HâE{¨»<»n—µ@dçó­M#W€"ëî k§”km#]ª¢pÞ_Dú`ƶ†/k€ž*5-žu/@í·7ÒÃqhQæë ¨é}RÚ ÑÔ7ŠK•'øÈ: ›=Nën«U4ÏÊóÂa›(ØÆ™ ÏŸVßõ¹“Êsj¶øC¸ApxN Šuê›­—¡-Z~mÛIa'p¨T^'urdéPÆQÅ8˜ ütŒƒùAóÐ÷›ã Gÿ0|1ÜØþŒ6ŸmÙz*ÆQþ?ò¤ýŽþI5ØØ@+ó3Sþ=Ç!Ø• ŽìÊGŒ¶°«Ï«­.­­ßgÍZ¶ÓË«e2¹œTÛkõ X'¥ÝØáes†ª•W;û^5«¨ŒÛÞ…}]ûT§ :zƒÒ5Ç—öÀmk1ŒïŒfðöéÜk|¹2Í$5/mdëVø™€kE'fÑ3֢㟷Ê+µÚNUÜr\Ò*˜Ê=‘nHUt`9m×Ps,W5_Ei­¹ØŒ’Øg/;XG'Wxµ†1Ó²†àûjøÔÖë4«ZÝ-ÕJÕ`=γš7¦°ÌæIüLQž)Ê3Eq‘~Cù>ÿ[þ3Ñ}® endstream endobj 5781 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1811 /Filter /FlateDecode >> stream xÚÕYÑoÓ7~Ï_áÇí!ŽÏgŸí©B*…´M –‡m¬V’) ûï÷Ý5¿è¯Ôˆ ©R.×Ïçóù|÷ÙÉE’ .É.%ýW›~GlŠê¨˜¦¹US‚‹¢šBŽ)¹XˆgÓD—Bš@`˜3Mr©Ù¨ì2›F\®¦)N¢iª“bšæ ©¦§Žå’««¡BhÁ5.°\££Ð ÄŽ¢ùsÄf¡fG™tAUIŽ:#J5#Qm\¢jËjÑl] #š4ÌÑŠ‹LW!ÙÒ0e¤Àð=`ý”ªJ©™."8l:†'!!4‹ú‚±\TGÙÅH×9Š- ®ÅŠxcDv‚Y ­Y.Ž#â‘5œbV©!ÞºÞŠ¥r!“°5“Jº :G¥â%KRÕÈ#¾)²âb€d»É%ަÃXÓé’é°…)›I’ƒÚ‹)e̦ÜL‡9„Õ?ìjó™1G1Ÿ1eÒÔ„94𖫨.a¢`ÑE.elˆâ aé˜C· U‡aBö_8TlXC§I[±.fkN°ýj™°ùŒüN–}RÓµá«`Á˜#!á–ê`%GÃÁJ.ªËÁ ªDÄtiL‡9ŠÅ>cM$H˜Ã–U:©UçȘ£Yì‘×Ò,öH®,öÌ©æ Yì%Bʶü7Ú:H…õàT‘r±X* Möö&³î§áX¹Ùïü‰ˆyL‹AÍ#ïïÞ¾}>¹wïóØX}Cwskžkê'Ÿ©\< J8•æ B× N¾¶Ø .¾ÔNË,Áò¯œ³×bÚ ®ž9}àT<µNË‘ŠÇÉéGìg/±3t„OÞ^0yænpòñ——‹µÛÛs³C4ÚŒ9DÙBaÜȨ1µ‰ BJêÞ P£n¾`–ÙÓÕòôx¾v'nöôÁ¡›=›¿_»Kžý÷Ïÿxñz>™À™ùb}®†tüdv4?_¾[ÎÏ/:ˆé~›¿<{qùÞ¨¹!{PEPgÌÏ1ß‹Œµ~±XÂ艳ƩnYßÜiò ˆ ŸxhF&³ãw­íû¯g‹7“Ùýåêå|e~„ç³G³Ç³ƒ²/êú)I| Z 9Ò€ôÕZ}Ž ¨}‹þ±›ý¼|¶tØ»Îÿ>Ãßtýf}þ£p+nG/h(ê® ñ‹¨Ñ"ø^ë¨#Çãoúä—ŸöŸoÏ—!$ŒÏŒv¿‰ hê\Û]L#cX‰ÙÁÏ=²±Áæ¹Í‘髳ÅËíG…Š…­‹¨h9À_;ÿ-\ÿ)‘ sµTF«ò‡è¡ûá<µÑ¢5挶ʽàê•ØtAt|­÷cà€Vê7Ú…Í T€: ƒæ\{Ásê¶Œ†Ý8Pq,¯×°F™¾ÞPI®õeÑ_ÝÊÐ.ü³«ÈFA(ƒp‰i РÄm6Üè¼FÕé•<ƒ'ˆÒC©]Õjúj¹šž¾=Ó@ÎWÿÎWÛ+_5³h›KÆ™)%ϸÆHÍ`ºñŽj).3^o'C×ÍÍ í®Á(ï‹JáF mþÙ'ÜÀRÖjòÙs¶8[o¹ûëuºV4Ñ ;v Wi\Z"®ù?~2}xtôähËm¯çxp(¡% ‘;:8Ø?xôð›8EµùP²ã‚ìÑG„œÆe›+n5ï˜#]¤N ÉãNw™:ªçÊ»LF0p còúHQv*:¡ã—Bw´U¸ð{‘K§2n6„ÕáÔÈNiSÔ·˜ø’ ´–›ùÒGèÛøÒ(ø&¾4¾/‚Á¢kI}à\‚Å­,r¢^pAè:±ø %v‚A‰:-3˜ô‚ µô‚q.ÑûÀ b©õZ&­:µàsi;åm c§ïx_ÅâR¼ÎâRøZ§O§ì‹/…4ãÎñ@çx sܾÉåüCßÎRÀCnh(ßöö¯ŸÄW·ÿ¤zÚig#´ø¢/ßzÜ*:Zeø€s}ª·ÓØ×óõtýz½}®˜co._h2oÙÝqÖN¯œð~¤}­ H¨¤õvG40ßà‰†³5ˆá‰&!o"ï0qÁ6 ʸã0o úbwPÛï&&J2òÕû B’ZúÒ÷ýU¤ÿ}æ#ô­|c ŒFG;Шe°‚*àÆ;-ëïZt;ÁÁGн`œÞÐ ®ÑÓ(û'ä\{Í'äFê#«k¯AôŸÌè˜YrX¯9:ݰ·­Òz-ã® ¡‹H¤z-nнë p¹Ñ÷ñ¶Uø:+*ôE¬¨6¾ÆŠdà@2p 8 H$[å@)û‘Qôªo?lëå*9 º£.‚[íÕ»þ*Ý5üÔÝ endstream endobj 5905 0 obj << /Length 1395 /Filter /FlateDecode >> stream xÚíZ]Sã6}ϯðcè¡oYÛ§~e—¶è»“1‰M<;k;Ûé¿ïµ%[8‹ƒ7Lwvg`lËÒÕѽG÷ °wçaïtôóõèèDiO#-©ô®#OH$5󔆫"ÞõÜ»_-â|L¨ÀãŸ.ÎÌÍe…Y˜ÌBóø{¬ƒåÁ‡ë·G'>ö|0(Yi+Š|®`ºÊe> PþøÈ\(×å Ññõèãˆ@/ì‘ Ê„7{Ý|ÀÞÞ½õ0âÚ÷þ©z>x‚`D™„û¥w5úk„íÂpssˆ7W(ÒÜ€*î‹ÜBoú‚r„«‘¿©pÖ†·ùˆ*Û³ˆg÷ÃÂø&¯oA2_Z‡¹½.—é,(¹y¼ý·šÆx"»óÌÍåéÈ»1¶ªXLKÄï±ÀðKZ¸`zäm/Â(bÙ ôTlȧ.`)©{»à±gœ¬ÖvÑ®7>P1²8¸]†Ï@å aé·¡åîç³,\­‚¬ 1ÐSÿ‹"ž‡E/wFïc¤¨²è¥™Å@ïv´–jìw¿þ2¹<¾x§V k¥“©”m'_†Å:KºöˆˆàlXÜNî«ßÎàgúç;‡ÒÕË8*—Ù-µžÍÂ<ÖKdA’FÎ)×Ĭ‰ä+ ±q¦I±0Ù§½…å”ååÔIH )®¤ iÅË„T¶ "%Ü£Hƒ²Ð‹š¨e­»õéOD=1LÊÞCí›¤çØ¯³gŸš¶$0E°5p̓*]ëŽl-ÁÕ Óf=*CÙæ‰Ðˆ' ÈYU×lw"ûˆ€»éêÄ¡ ¡ãŠ0ÛL6åíáT2$)½  Äü&°§ænƇ}‹)°öF¨¶ý„ ¶¡„‚q “Ÿ9«³h›J]Ñ”ñ7…2IÝx”IäÇž1ZCYSC²H—Êé’qBùˆp›ÔOëzV,¬IÞT‰°£äÅIw;H™ÏW=ìA?¤ë­úí*+ÙTV†0ޏ} _Rò‹ð€ˆñ]˜ÕÁšÇ°Ð8¹3ÏYøqæ Û¶R5P¯¤&TÓq`.-¨šmÂ]¾Kíuº“Ô¼ÃBå„îQæ¼qx0a˜ÓÌ´üñ÷ù¹¹‹#c¤cŒí`áÃ,¼ÖbËxn=ÖÂÙ–®­4*Ý÷‘àeeƒoa=›®“yŽ#ظ®·ô{Œi–o²qî¶W3C >tRCÎÒd¾­;±ÝƒºKn_¤I§ƒý®±ÚªÇVY™€_¢È¸ PóÉþç,²½PÇþ°:lEÆ9Gb‡êI0Ÿ#ê®Ì"üå2 ²/¬Ÿ¾¾Ìâ Â&øþXÒ¶?%ƒÁî ³8cºìAÒÉÙù±+Œ‘î.ÕÒëÑbˆãTÁg¯x ƱÜ(Í ›êªc…|–Å«"NmAN£Gáâ&Þ:q§›,_ËÚ ”!ÆýÔû~îÕà³|ø¬eJî¾ü-Ainµ ‘~^mQ‚¤âßÔ¹Lå)؃½MóRß>ÅÕ!óîâbtÇ5Ô'ˆÉý}];ö‡¥ýá`û‹ês$.¦‘!BŇ|œ~…J*Œ8Vû£LÛþ@Ê »ƒR ŠÁ ø«(…ÞÑqîï/Zmû£5ì.Ñ’)fË|*æ=Ðf‹ {ù©­»»3ÃNBB(8xè„ …"-˜ê/Ÿè¿¨Öù*œÅ¥à¨õSí‰Þ2±:68‹:F×§åyÇásŠ4Ȇ² çßOw9üéOp—ml8÷4#â‹Ýh'q—ñC\laœ%Z=À2´^hIÚgþÞé#îåºú±o׿MpÈ]˜¿ä¿&þdãÁr endstream endobj 5929 0 obj << /Length 1393 /Filter /FlateDecode >> stream xÚíZ]oÛ6}÷¯à£=Ô ¿?¶§ h²t+¶%ök˱QÛÚ$¥Ýöëw%Q¶$ËŽNA‚h*Y&.ï=¼÷4Awˆ ‹Á“ÁÙ¹¶Èb«˜B“’ +Ë‘¶pÕMæèfx½\ÅËÕhÌ$~ÿëe~s,‚(ØÎ‚üãûéö~º}œ¼;;7T<ša#4¼.ÃbÜBm†gù… ›v¼ þPhEÝ]¹D³Íàæ#Asøî"XXƒ¾f-7HR‚Wp¿F׃ߤ<0CKv˜’b+r[âl\·Éç$¾‚é<·è‘þhfÁV¦éå¢f$Çš¤¹Æ$³1},©ÂŒ İ5EZ”Œª‚5?=Äg K‹äÀ4mí‹ïRÅ/Úæ e,…-³ÿ±`t‡ò›+IˆXIQŽ$³˜w³P®¶I¯£8èfL #ä0êå~i+hD2¸o‘ÜŒÈ0ªÝ¹¦†ÆKålûæŽÄÜ RÃC¸›á›¶4¤SÎú£Iß“&ÞÆ¶  Ws¡àe –{øüòç·UamëhÛJ-Ëz°Ò´ñ]ë€1L÷IµëÑd®¬€`9\å‰Rv²š}Q2 €uÙƒEnò»„°µËìó žE«?’0Ê?O·®ÿt^-×/ wOêïÈ?ÇA‚+^;;§¤5‚ƌ¼0Õ)ɼ<0&0Ѽ¨)ßÖ+>0˜A½p-ÌÉo–0ªbÀSçŽézΦIàFùéïì5´`-e– kŸª%dÏÓCs£ÀÆ=asŽÕFOØZuý©¨‘‹vôHÙP7Øêv(¥EÅÞ« ¹¶M!ã0å¥nm´-Z–ûþúÇKøwûËOõdž~¹ZŒ˜.\Äïg³ Ž÷kìŒ,‹„±àXHC³XSÝ$6ሑá—àQbAZà¶Uý©i@qÝ[¨áû•cÛ«iÀALzª…M¯ëb^ ^,´é(U|O¢xÛA/HX°h¥:0E‘¼ÐÉ6ô‘ép…} E …ÁR›"ÃBN£rø%ý¯¨õòý&°Ú΃´Ù_YÛJeLË/ù“‚ȃ1”Koá šQt ß%üÝ›© ÆTÂà¤tBBÿß…mòÅ BBjTÝKsÝ ÛûͧÀé‰pѾ]X …¸óÜ^”éˆGcÝ'EóTÃDqrµ•€ì)j+3puÛE¿G«$8’˜‹d|°ŒÉSêkí²Ù]¢ÈáUB8:WÚ< h%:_O„4 X"‚êR¶½M÷à=¯mïÂ]Ýå5à-Úãù8M_ UoY¿†ï—öým/¨VÙ£<Èã^T¼@q@ÅÆöw2RÃ÷䉷±ôU£Šeä3:!O÷q-1OQíÑØRڣܜ­J9|•Ïù¼ÛGTοéË<ßµmúž€¹FÄc~÷/1@ endstream endobj 5957 0 obj << /Length 1546 /Filter /FlateDecode >> stream xÚíZMÛ6½ûWðh5—¤øÙžZ I“¢hš,zI‚…b˶[r%yî¯ïH”¼’lÇ–¸ê"h€l(Ëäð ßp83&AKDÐËÑÏ·£›Ê ƒdÝ.X)­¢èvŽÞß­ÂtN¦LñOo^Ù‡·Á"H‚hØ¿ûÑÎ_O>Þ¾¾y¡ Ò Pz¹@®Ö\Át…,Æ Pz|cÆM>hôËíèï…^ÑG0Ôh¶½ÿHо{æF£‡¢ç J0ó$<¯Ñ»ÑŸ#RWLÓŽJ¦ Øp‹%-ôº»’OqX<ˆ ðG P‘ Ì›—-ˆV„#å ,x1/¨ÄŒrİÑ%ZÔ05¥~{<ãXhYM`Ó¼·«ür=šò«õ¼f†º,‰ 3O¶˜,‘}x[ „Dò:‘La­J&ïãpn;+½ŸIH›ôú èB=}r#(¿9Sm‡ÆHsìQ†¦ i,¨ïΉØÓ¨ÖqåGóuÊøûkMzX25œ…4å;Zˆ3Ø+,Ä“ö¸„É`R*ì"Ïâ(Í.ÛHn"³•Ÿ4ÙSp“½Ø]ÄÉÆÏz³K–RÇnS¾#»®`¿À%ÐUÚ%Åç>úÇ+×P‡™qqÒ­öì¹)•ÆJh óMF™=}ÛÌCÅiÎìçM¦þ²¸¡ÔñgÞi…+íM®²Aò`ä6å;’ë ¶ ¹š`Oˆî›­àãÄ~ëR¼áŠcòßo8LIE™ìþ5¡”Ž«TWä¦Xû²Eš2÷ŸûYYÛÙ¥íÛÇÏJÆÁ„Šñ~"X`ñv§iøi½¯Ê"YÔŠ"6Cßm·ë°z[SNqž@NNƯ_êT–‰Ê )Dñ™1sÐsÂÄø>ÿÏÏÂ8j Ø¥Áüº*û_V™d#Éin æªGåæˆ¥ª@xŸ¿;k™a¶º€)¬kVÈêiAK.ÀÅöà Bàþ2HJóÞ3@}Ø'«ªV–­*S;Òºnƒ‡"ÛDˆKÁfÖ²UlÄÚ--¸ ÞCËlœ¢Á_/ã¨Ø4¹-.á6˜ñ–aÙ²mWà•ìCËcy9Iüý£Ù´]Zvàç!g¥Úk^A¿rô6‰³`–]òSF±T¢IÊ!$kéÇ ´«€ªé¤ŸScOaMO™ái5{zBÁ7–ûp~é(»¤ŒÆ”šÊœf‡×3¨û3è ¢Q5¹×0Âkî¾·A¶K¢ôÔi–×_twkÏŸQï~}ÿîþø­]y-d‘ÕÕ»Ù,HÓÅn}²”GòT)ÿÁO¢^…|ë#´®ÏˆÆ’ ·ä»Eãî`¯¯å3J±¡²ï½‡‚ñv%_¯­’OÂRšÁÌ£%ßÍ<ÜÁvHÖÉ«¯úÒÕ«á~¦iŠwäÖêy"©†ÃÃè^7¨†¶þCÔpI3• Ÿ½ï`ƒ¨$:Düßî8|»ãð|wÂNÝ6å°;ïsÙô_,±ˆD endstream endobj 5894 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1651 /Filter /FlateDecode >> stream xÚÕYMo7 ½ï¯Ð±=X#~ˆ’ #@>à&h‹qm Òd‘ ìÂÞí¿ï£vg4N#'Î ïîÅ!9$5›«YH!W+¤9¨‹:hAÉ_eç”r3LÉA V»¤†"]ÒB)¶Èµ¦PÙ%•‚oÀ¡Q—HhÙ%&Rê"Òì(5ßЉ¤Ë`Õ.«˜³ëo@æƒLÒ-m”}Eã@šºÑ©kn {`˰¢˜£†Ýü œT•ÀTöhð…P××kV×’g·¯%¬(ÒVà®aEå.Êj¾/a…ÿË~÷Ür—q”ÒH€Ô5ã$á¶€rvd@ð2P ÂÜeȺ¬rY‚É.c|«µÛBA¬*öHØmmþI³Ž(hòh6(Uv?7– ‡iМº¾Ô´# Zªï†›ÖÖõ!æÚ ñnnnòð6“Ç· n‹R—A=i—áµ.ƒR–.C(¸vn7¤P¿¶Å3MÉ÷Pì¡Ýz6qäÙ™» —¹u˜vö°ÚeØc-Å¥ç2ãÛµ_º¹&تŒÈ/3ã,Ž8˜ô˜ãÒr×’k0ëQÈ-X!çÁ4+økkê2¬­ÚeX[›ïa¬ßtC‚X«g¡$î²Tº Oß+2—!w ÷ÈÀ9…³Ç£0Pë2Ás¨¼Øß_LÏþþs¦ûggç«Åtôö÷U¿þñôìõbzp~ñryqœðì§“éñôdzxLýb1=]¾X…cÊ{ˆRŽÈ¤^ìA´H¤`Ýûûa: Ó÷çÏÎÃô(|sùÇ)þöV¯W—{¯–«oý{ ü}¹)ŒM=õ¦è‘b«ÒF±Ú§L¹=3fpÕ¨ðûÆ%x¢ñawã¶ÉËÔÚ%\(Râ›øäQ8FAdh¦_~ý-ìAµ ÁPÓcÂóxööÍ›“²³E¤r(JÑKÊY,*>É-¢x ’¹FÔ²12„¥|”Œd%k,£Þ@UŠÅF5G¯+CdèwcÜÒÔÊ‘ùÊ£š ÔLUƒ6“ghUìµ£*NƒÄÜbu)Ìý·#ÎÏVýQ=Àä„~Þ`Öá4c_ÙàæsÂc^ ÍfÃÂ(0ct‚º½ dKÅdàWØs:¼8q´D Óᣃ0=[þµ 'ïW¥Ã篖‹é!L[ž­.}”ȾދÏåùÛ‹ËËõÈÑe?-_ž>pþWèõ í02F¡Š‚P Ñáó (ñjÃï%ïû÷9ÌÍêcØØ Ê ê Ö7Þ'0'·[I ¢S0hn*iAd­Ñ»‹p4t+)&”ª}>ì¹ÖŽ£ÇOð·÷óß=¼xtûÍ%+²‰µq †«ØšìÎ%³RP¨¯B#wt’mh0gG•; '´P¯ ›¾O56ïÞ%¤%Z½ÊVʸní†>ñŠé§°wfŠŒnûÑä=ö¦¾š$ŸÇƸ¬Q ’‘Fƒä>> jÖ\cÖ:Jæ˜Ë(7£:NUã ß¸¡J&%3Æ %çh4è7Á-jÆ€eèœ7컃ýõúöüÙ–Û‡–Ë—vZ°iž¼›ûì/6`û•Ì@gg`_£÷šõf;W3oy¸»;è½"±ÂÛÛÞ«¸V½›æ‹ •dÛô²hlºÃ¦×ZÄgî‚f — øøã‰áü£Í÷k»D*Ž‚*ÛóJ‘µì~aÂ(µ«C·ÄD²ûte68 oÓ•q®f»›„ð©Wïf-Sl÷.é•ãji)Zú¬i„ë Þˆ¼ÇþÔ‘kÉR¢^;\«sŽŒ’ÏL´97O 2J¦XZ%£aW$WÁÜ0¨Y3bLƒšU-’Ò(Çã ʳŒ¦† &uÔÍ‚Ì.x°5{L5ÎQþëÍ Y#“Œ’‹¿†$ÉÿòµH.k9ñ°–çÑ,Ï£YžG³,·;Á*?³ Ó âņSƒ*æ1¯›ÿY¾OÏNoõuöÚÅÐã?͆¨ä˜RÞ!ÛÖ ¬¼ÓZKödÝqk];…0•8cv á¸fZoâ”þìe»Éû]ö'[Úud„®©Œ’k¬2JÆlá?J‘}>¡> stream xÚíZmoÛ6þî_Áf5Ãw‘ë§®k»uí^ZÐb˱GÚ$¹mþýŽ/Š%ÅNå(ÎV ÒùðxwäswA爠£f£“ç‘AÅš-‘TXŽ"mDÑlÞß®Òr•N¦L’ñ“ßö7É2)’lžøŸ¯ãl¯'f/Ožk‚4*nEİlç°˜ ° Òãß0aì¢Ñ³Ù蟅YÑ­°”K4¿½û@о½D £Ñ'7óIJ0ã úkôvôLj4¦iCŽSRl„—¥tç:ý,‰™Ç§‹doÖÕé{BØ:ñÒ½'’Àu"l¤…·Í‹ŽÀGD ˆK¬8µÛqIfT †6¨Hв!am÷èõ ˜³ðzLíì¡øA;müZ»}vhb)l˜¹a`qŽ|çM0+˜Ï™U4ÍÊ"òfçYYy‹íB力ñ|­™HLáBL)–Êx¼ïÂŒkBcAáHÛ©»=j™‚?µvq»ç^ûÀ¯®]k!XGàR½ä“˜ë¦t«8[\“Ä A÷upF±ÒbˆƒwÚý/•<˜ôERùgÆ_Î,¾ÏÎ2/|t=¡dlõíþÂ`ß}úÄ·ó¤¨R‹0«·ôpòœ’¦[+°¼«9xUšÂr5‘õãö}³u.™1õÌæ“ºNÏŠ¸¸ô?ÂN^Þ"A}ÿìÒaÓÚÊ´áÉö{ð¼4K«ö£µ5t÷Ä&jH7[L©778Ì›¤ÚY¹ëÜS~îqÊ”W+{8e:ƃ/µñ ëŒmËx~YË`ʦL¾—fj+ j˜rhf«d0,/Û€ á¦H³s?:{õ6¬Ì³,™WiîUºÓX ûxÇHéOü)­VÞ„^èüòãÓ0’û6ÞÀ·¬JçWænΞ7«‡Ê*È}')´YÜ>®“ÿm5êü(, ›-òìÛ ÝøŸù"]çÛ^¦x½Î·Ò¤>ÐdÔ)¼ï†DhÊ)Ž„ú2§žžo’²¼³J#±âxÌ*µÀBË£1k³¶?³Já( ïàu¾d kÓ“/5Äž||¥ÃšL|¬)5… UÝkJEà.êÀšV…IÙyQfÊ.ó>®…öôÍO¿½~v‚½IOæë^4<xö¿åÙ/XÜÛ©‡Õ½”-šiRQµŠ«Z·e›ßÎ’.¯,ü€#Çõ½,’d¢k{µÝ{[$ÅDÊñNÎõ ©à¬Ò…ž‡3–PÜò#æ‚p ÌäñrÁþ0Æ.lÆÃÉâÌÓÅ—SAcsÁ¸Èú@Ç÷¸ºq!0§ì.™èQ_‡^q<iãô—ÁÂöð®8æðHä£ï¹zе®w¼µ‚ƒb !æDÞG¬!Hää‰Ö=“š†‡:mÖšu ëâ h»ŒC-Æß!ƒžKêš;´“:AxÈ‘jà‰GÛb»P¥…y•×Aßçuvq#¯s!‡kîms8›ó‘í*qŒgd7£3"¬„O!£3u +…yNFƒ .uRB?Í¿ƒ/—ù& Ä™_´HË¿ó2,Ì—¾ HbüqÂ@Þ"ÏÖaJzq‘,R|}N³¬’Â϶ôdµiÙÒBÈy—›Ì©ï!ökŸ¸üé]÷¾sv¸jœõ?»®g6³m"K¬­?í‰ ?H¸¨ÚÕƒ_ÿ|õªÿIYðê¡Æî;ã4%°b<ÄiÑõ8Íù#ÀÝEÙž©1f—ôhÌÛÁƼÅí©1£°¨“ »"Þ¨wÕ~§[U7–í…\€ˆzÆÑ]•˜!˜*v!S”+î¢hÿP¬ÿX`³n\ǶFc â`׉ƒub;˜â0è¹Ø®¹K§`Oêú÷.àPƒj6;õ]yûPø™é×X³ßëJ÷²,ÃØñè•JÀRÇ+„tð‡ÑëpaûÓ+uEzüÒ}—5wï)û‹÷TÀëÝKBM™ÁŒ©Ûï{—r*àPù@¿7Я~¨á¹†5×?‰ ¸‰DÜæÄþðQ"d endstream endobj 6013 0 obj << /Length 1703 /Filter /FlateDecode >> stream xÚíZÛrÛ6}×Wð¡3¥:Œ+I4O½$nÓ¤—DéL’ñÐes*“)I%ñßwq¡ @r"‰–›Ló!´vÀbÏÁÆ8ºˆpt:ú~::yœÊH"™Ð$š."‘ D²(•ðMI4G/ã—e{YŽ'Tàø»ß6çÅ¢hŠjV˜ŸÏòj•/ǯ§ONg8Ê@a”BžR”ñÌi]”S˜fñ‰ùP.դѣéèŸQ8"7NÀT&¢ÙÕèåkÍ¡ïI„—YôN¼ŠÁˆ²ÚËèÅèv–Ç^§ HrãK«×uö^`9+ðÇÝÙ¼Xä«ewö cº,ÎÚ¢3޾ÂÃ?¢½ÅH eI}NßJ1R&àÚw%$A”ðˆ"™É¨)¢…㬯m»tÓåHdIoÀ(&jôPýv£|ýýFïbÁÕ• Iå8«6‘i<·' '©O˜»'LS”¥öˆßÖåÜœØ­Š¢—™`DÃM ,J®˜D9LRQa;6õöÇ›È8GŒÐhBH¤ñò›ÛTIJÈx™Wóex?Ø5& C M2¾þ!3ØÙB†% 1ž€10J„ÙäY]µÝǃFÅÌì2oüÓH¨nz*âÂ3V©çáÎçŒQªäžà{+N$™D)I-Nè\ÉiÜ]¦whLp¬î‘ü…`ªÉâÙ²,*+V«.UÆåjòo•_Ùß«¶˜›VYV–åy“7×ãDÄh7¸¹´^ñ„3¤$.S±=«OR„3¾ÿê×1ŽÛ@†VU¨Ó~g~øwïÍUUÛÒ_UÕn”ÀöªZ•pa˜fݘï¯>}jZ:náÛ†V9"Ç:²ëvÙÛ$UÉ’EFÜ7èÛßŘˆø: o7‘ÈhìxÄM$¥‚ …ýÃPx¸³»7‘p„9½gæâDº0ìÅÕµÇC(ã€pcü.9à>ü@ˆ¥‰¸~ `¥·dü´¿ô¶ÃïEŸ*6rPÏ ù·ê1÷Ü ýÿMdêx烉EÞçE·jªvÛº""ÝݽF`YĆƒcS=öØT_J졸 N¦zÉSkƒ$'Ô&5fCmÙ†êzŠ§Úšâi×\Чz 2öf•™ žñÒçwŠöyàe‰^y‰†O­¡SÑRðqÚK]8ÖO!gmc>·3ë7j]kR§¦õ`YW_IÛ Wõ¼\\û ;/€šÕ7•ÛaÞå§ûÁêÙŪhÛƒÀ•3€yΤr”±ãUEýÃÀu¸³»ƒ+§¨MÄ›ˆI!MË3ƒ×¥Ü1m°¸I²Ï79It)óp“Iq“ÆOÕmY>„•.a÷²£¾ûÜàg¢¯~úíÙ£dNõÄf°/ðû)Á֜ºË¼ëw¶õA1fî¼/?¸Û‹¦(nÙæþ´E36îBƒÍç"ÙÅ­ìQ€¬M‡aTbX;†ú‡aØpgwÇ0*9" RÙ߀§-…}àŸYaŸ¦/ÈñJ þ3ØÙ= û4cˆbú ö!ò†ÖõišèBá=ð _Œ¹S×'’™|¬ô(…Õ졇HîCêt¡Gý6/4ÕR>φÿà£ÒVÈU׆ZÅ\\u|ýàSRýàÓ®¹>%0>Ϭ~ÜiIm¾Þãn[µÿ§Þºš¯dU¨kEA5ßyø™j¾Äʢﺚ¯‹@SPÍWæ¼j¾}[Í·(ë ïí—úýžõ{窇å{¢/òX¾¿… ¹x!™l/Þkîx6/+Ö.õE<# –!WOôCÖáÎîÎŧˆf‡ÿ•Å͹‡¥òñšú†½=”0…nwùäýw³`J1?äO˜þ˶l endstream endobj 6120 0 obj << /Length 950 /Filter /FlateDecode >> stream xÚµ™]o›0†ïù¾L¤•Ú \nÓZµÒ¤­Í]W!œ•Åf]ÿýL m¾Ž)¹‚(ø9¯Ï—mÀh0º´¾Í¬ó ?D¡2ÊÐlŽA³ÝMn—©\¦Ó3êáÉ×_Wí͘‹Jä±hþäyͳéýìúü"À(Ð@æ4@×§vàúÚÜšE]GðƒÉy{¡nØ ²~̬'‹è§0"ï"ôPÇCñʺ»Ç(Ñÿ]#l»a€ž×O®G°M¦ï3tký¶p71¼9Á€ Ø^ÈÈÆ YèÚÌóZUß—¼T¢ê$u³ ˆRÛÁmFatæ†v@œvÀUžˆ)ñ&ÿÖâ_­éA›¾Ôc¼ÀöƒÎ‹-Ößy‚;|•Ñ:úËšÙú¢Z öææÒBwkO»xËæ.CB„9‰} rĶ@\È(VCYÛ¢x–q4Ÿ<áiÍë±õRŠãO7ئPRäb kO¤^GxY‰²ä•:óóÞçBÀ©GU”M“"ô€ìǦG®W©—)ó&±{qÏ Y?ŒÃÞ“ÜzJU¥ùb,¨Î>ƒ£".s2&ïaJñ¤N³dLh"@ËƼCBÊÈ7P92îo“¢Jç œF… ´´§¨BŸ@7áóÞšˆ¸HĸDPPB3$$õCxœ£²*b!å˜*;äæ2RK¾cÚè÷Ã@œFm¬£§¡6%ñÁ~÷Ѝ>{žƒ°Dëà O’S`W¼måÙìPS’çU±Šþ`L³^±œºÐÍïM0äg×P9*O÷Ñ^—28¯<ˆ;xÉ›Ý[»wQ¥*€a7` ˜?Gj ÞøUßG|v€ìUŠ *4€S› Ý~_*SC šÝ6B5"xU«šgͦ¶N+‘Dåˆlà#„'DG„¬4¡±Ní„UѬ= 0Xm ¨Öíc u›ð­û#ܡشn•r·v=Ì'f|p嚀¡kŽ ³–Í;|)u¶nžŸ{»‚ÛËWñ¼¨A¦¢‡>¶ºÔ±;ä[ë¬i endstream endobj 5979 0 obj << /Type /ObjStm /N 100 /First 989 /Length 2343 /Filter /FlateDecode >> stream xÚÍZ]\· }Ÿ_¡ÇæÁQ¤D 0 Ø Üh öCÛ…gÚ.jìë5þûj†ëìNo››†—s‡st.EñCR*©¤6´%iþ·§1?k"ž,‘ù“ÖR­þÄ4q‚ÿØ|ß•\ dÅvjlþ„J’¨ÒÔjÀui$uP J­ú·ƒ õîRMÔÉÇ@émêEKÁ(:9i²`m“öpÚ:\£Jê¥`ŒÑÍ%Jµ»T!µùŒS¥2Ÿ $±$¼3ap0íx{V|Køƒ¾Å³Vço5ÕÞç–ªÒHuQ—>%I\‹ëQƒÔ Æ  / †e).$›ÏFbaVâ¶‚D˜€:ŸUH}>ãÄn+HÃm c¸­ a ·$Œá¶‚„1ŒKÅn«^0mÅct†)'Þ \„Ä-Ä55‡‡ã`º0†{B5·‹O€ÐÄÃ4¶V]Âtw›Èp £ù[Ÿq»Ì—v/*ÓÕ93‚Ÿ±8ž):0† “ãù˨,®b:Q4©›’%%‡*2’Vu½V’Jq¼FI»¨©{.$Nj…1¼ZO½ožóÖz²Zœ_ÓdÌó–Lº3m#Yþ‹^’iu䎕`ÝõzMæ ‰Ó ê¶‚«Œ:½“7xL=¬¼V§ž¦qœA8+ 3ÀT`=8…ç K¾â#+Ö &͇V_rÒh÷øñnÿMºÀBíXãߥýßþþÌBî`ƒ¥œ]}xûöÕîÉ“óÊ4²¯ÚeʵfÓ¥ÊDy`,S.%LÀgÊϯ¯nÓãÇiÿ\}¡ô¾cd,v>ÉÃ#ÑI†‘0oZ¾BË'ùø£ì¿½¹~óâp›.ÒþÛož§ýË÷éŽÀËÿ¾;à‹×ÿ:ìö_ƒÌáêö½ŒùûÝþ»Ãûë7oïAd>ûëá‡Ë×Ï®Leß–+â® e¯0Þë€`• >ê?½ººèÅ1æ:­sO…PCàî”Û¾às{÷Îá‹Ü>Ëä_–Ûg?á´f;q,„q¨ü*™ë]?f TÛ¹ÿY£ÁÕ>fFçø ²<±Ÿ¤QðÒ-³K&”çh€ò@›#ÍàGÞíiFc½aAN8{ûr—ÈÑ8ØÐŸc ,ùÙ6’À(WÄê‡ØçÚÿ'ݯÌho„—*£fâ¥ÊUá²L¹ù ÚXªìÅ#-Un¹”…ÊšI+Sö=…Ê‚\¨Œ2(×{ÒÒÊ>BK•[¾'+Ý«[‡/­…À„¿Ì‹•‘£›,Uæ\¿ôÐßi£ãðŸ%<"û9 õ' ë)«1‡ !´")r$EŽ¤È‘¥„@!²²²²²²²r äÈ-[ ·@nܹr äÈ={ ÷@îܹräÈ={ k k k k k k k k k k [ [ [ [ [ [ [ [ [ [ @<yòäÈ#G @'d´!P5ABh!ô4 !))))))©¯YÀYCW‰0 ”}s(Šáû«ÁàÞýk;KY¯P@Cëù½Œ’oafÄ·>ò(ü0ƒ¶"LÒ8 lU,'¢l`à„bIô Z‘¡fÆ*h¨< îCuäî{Ý‚Jäv}è¸z=î;ùf‡öܰD›gi>gˆº‡á{ŨÜQEøÙ‘oðú@­(ΘAV4ðÌðE4âe,8 iõó)ü¥º‘¨¡nž[èk¤É; Äh9Òº ‰Š" Ë0 ªEöƒ+ó^%ˆu4Û}#hâ|wV:£F†Ÿe (+M f$³h<m០R†9gY‘BRGe%˜dL?“Fðô#Î,lÍ®ÏQÂ1y ×>£DGí…a6â %+Š?+ð"‚¬‚:ˆQ2ÚÌ­&‘ ¥'wu1Â%úFÝëFÙæ[;ÖÃfÞðÍ 8ÊmÍ:¢g?òeáSa˜ ßù§ÐF3o~fÑàŒâ›QõÁäõ9 OFLJŒpe~×£{| voÛM’…o‘ûÅ„L¿(ÃHh&çìÐW¤€\Q»o[´yOH`Õï‡,‘@7_}óϼ<í]Ì”Á›Ù)¢ú5 IL¡®®~ÙŽnf49h4jG!IÃo'euHg¥ž ׺¦!`’UPHvx¥`NÜ0èÀJ·H :ù ¬Š0]ÑB¦D†æw#H6w¤QG6¿†H¯DFm+;ÀƬäj®~ÓLyܾ{^Ïö¿¶z”òë1,Ô߭“lÄá¦È¦‘:"L‘÷`gÛ_[?Lyß+|§-Ÿmmݺ~~Š7ÀÝaPBf[Ùá+gâöø+ ˜œíÇú±rÖÝîb¥;†œí×$ÆÊo6zÕÉ™kö;î­¶²Ä@Ÿa5ù2íÞÿôÞô`¶³ýïX?kW‹È„¬ŸëûšuHQµhÞ`øšÀÒèóâ" CÛpð(‰¸à÷qÔÛ_¿±UÌïãô±È ÿ#W©0 endstream endobj 6240 0 obj << /Length 1094 /Filter /FlateDecode >> stream xÚµšKoÛ8€ïþ<Ú@«PJâqh‹-°Ànã[ZŒDÛ‚õ2I·Èþú¥$çíFC†¾„rl}3œgDa´E}Yü¹^\}Î(¢M£­7ˆ¤AJc”Q3f!Z—èfy½«Ô®Z}Œ^þñÏ_ÓÅ7±R´…˜>þÍÛ#¯W?Ö_¯>çå˜Æ0É¢ O2#ndEIbnÈòåÕ4D nZ|Z/‹Ðü £ðQ skLPÑ,n~`Tšï¾"$4G¿Æ_6ˆ„8ˆâÔ\×èzñïÏNŒ„MžÎ‹qõaTa’.·hºøöenƹ%áøý=Ûüù !F1Yðb'Š=+ZÞˆ9dl‡”‚×#3}É,…¬VYþ\…d)˜âµö¥nÙµ³SO€¬½¼Rvr•à¥oæ`ƒ‹p•о˜½ì ¡”#î•×¥èçP¨™A±ÛU„—Ǫ.}B^±DBœ’Z ޱAºkxÆÏšà~Î, @?["!V´Aºã^9E‰¶”¢ø¹JÉì¬s Š÷L¶«Zí ª÷>Q¾{ØêÛÐÓf߆Œ÷€d˜Ã\{ÂÍ®9 ×N´³ÃùÔî¨w¢ÕUÁ5lk†£!Åœ&š^ß±9CæìfS3Ós©©ä±ï°é9žœ¯6òØ7µ¢ó…QƒoÚåÒŸŽÝVZi3÷­gnÕÖÕì¶—'¶PGþ™bx`°Õî¶ô®×U×òÚû›`G%ž÷“/GeQ@HŒÒ” }-Io[NÀyGÞK> stream xÚ½[M‹]¹Ý÷¯Ð2YDOUR©$03cœ0c/’/O† ݆݃ɿÏ9z¯zðbîê"hxêF}T·¾n½^¼¥’zqKR+=iï\xªsr1’Uå¿õ†Å(É'÷ IS¹gh’Ò¹iÔ$2í«HüÀ[®z›»KMD¹ê©i[û<µê o¤fR¸š©õ†§üÚ*ÅJR›…(°Òˆ"5™8t%8Òj¡,bÉZ£,Ò“™E%™C á§ñMÜ¡‘d ÆßƒHà뢥óß°ßäcwœ¦p>.qš¶¾öâ4µÉgCÜñ\âvœ¦£¯½8Mç\{qZ¥)¡ïÂèb؈ c—qƒˆÂÒ8ÏAŒ;#Ñ—¡WœOÄ΋w—·ÿûå>]¾}xx|º»¼ùòï§õûß~zøïÝå»ÇO?ÞzWÊûË_.½|ÿNÖ/w—î?>¥wˆ\¡šçrù’+]zÖ «aß·éÅ‹ty“.~|û˜./Ó~ùðŸûÜåé›oîðs†–âñ‘é¶Í<XáŒÏ±Iy"Q™ñšhŽj}B3›4QGÏÈ]Èž ½N˜GW0~ „ž¨‰¢‘lÕ2ó:B21££›dËÔƒÖÌ|ÕÔsGdYm¹Ô]z°ž;’‡‰dAm}ÀØPŒ*³KU3‹J›3«B­eí¬9%#ÏQÏŒ™2uŽÃ!LC`¢¸6¸'ÒÕ&! EBlnHQ ¿DŠBõkˆ•þûB´S´fC–@Ú_y³Nˆ,Ñœf‘M´3ƒcdS4*±ŠÖ¥d–·Öé*}“ M³¢ò·:s£kXË‚®­ ˆíRD›¹¢‰azh¨èO³¢D¶Š´9wi‡MF&R[ j`0]h‡fviB ¹ Bøç Y0Ë5y£Ã;ÂN¢wŽÞ| r ƒb 8`«›d(3“œTŸ¹£‚4È@™JFß½KÏìåjwT1(Bà§ôoPÌ ýLXAA™ ŸèA›À#>+ŒÔ»íb‚«Ô†\M¾!ØeE¶pÙ$ƒ¬žŒÝdb¤ŸV$0·¶Kx!ú— G“B LÁ+R·Ïy „Ÿ_»ja3ù\ºÀ©QÜÛš!<äV 5ŠÊÔá›q«Ÿ:èÏåSg˳îÒÃ-_ƒ)fÞÛD¾Vò0?ÒÃ8Q( ¢P>°^´sè¤@6F)Z7 ÚíàÏ &JJ͆ ¬8—>6ÉСP­PY°ƒ†~)h˜È.E 7Nôµªh%É‚Ùtw‡P–åÏ3›tøƒ÷vY ë¨0ò•’à3e0ðOT*-h%Ù>À:m …î®mSDÍ“÷>c,×àÅçÝ&4£›„¸53l‹_›«G4ØËù͌РìkoÍŒ‡Ñàs…¸v3ß°Õl_»kêû„`7# ½$ið­›1ߥ CŽª¼NämD]·BAÞ49ÒÄ©—e¼áµ)?}®.¼uhF6 qk줠™$¾uv"Öxð©B *:xïD7IìT/§+>¡g6vsÝ„ dV¯"Ùá–daG$øk^¦wM@I?¤Ë?þù¯ô'Ø­b—…šgzøòóÏïw7ïÊ&ï;Zûzó«Ç‡§%Â+çË¡ë?½>Ö‚2kµ±Öø÷ËëOßÜã!ÓåõËWéòöþ×§ôþk½½ÆÓÜ]¾Ç)÷OŸS×¶p©žÏ_>}¼çß®˜w—¿ßÿøÓ‡ïMK£†>T½§Á-¶]¯?|ߦèuÿ2Êgœ¿^ÎP¬õnæ¶°XôX<ﱘ·E-±Xh,j,¹r äÈ5k ·@nܹr äÈ-[ ·@nllllllllllܹräÈ={ ÷@îܹ²²²²²²²²²²òäÈ#G @<yòäÈ3g Ï@ž<yò äÈ3ç MT,$‹‹ ‹E…ÇbÄ"%%%%%%%#šTYYYYY9bP#5bP#5bP#5bP#5bP#5bP#õƒïÏI×|þçè­m½.ÈÞ39OŸ²ç{¢Í—äèöW?‰>“¡… –½ö=U Y¼{$GÙ6ø6"9W„¾ƒïø8*õL! á«vÔkäSd‘ÜI\ùrÁ6 nÁÂí(Ü }„âM2ZðMô ý|½ÓÁw¦)âÄ[l”?ðIÝá‡ìîZ¤Ï¾sØÉœ)Ëpï–<µttv¥ìRÄz‡€C nÈ‘ƒ®y,¡ Ì6ch.œ@kIJ„­d€‚Êl›„@?é†z½ˆ@£…P¨+Ü“¹Ÿ8lM«¬Ë‘gC¹ß$¬±ÆwÀA«Ú²»ô=åm—"@óÐyq:„Ä«—Ü9p¦~¤ˆ~¦ så‡4tèWÂ20°*s“µ !Õ5Òȃ›fŽ«Ù(¬a›„¸Å‡CV#q‹ C!EaÝeŽklp:dµ·à0V÷£—~î燱h±•¸‡á³Í±IˆTÒk+qƒpÖ¶iâæ˜èèV+Ž©%ÛØ¥‰Úó4Yã!³~ÐÌ£° Õ£{²qf œÒYã!åË˺-âKô›„ÍÎYoÙVùjËGøæÅu—&P§¼ëšáÔ#"Ö…WU­ïRL?nÃåKùâS×¼áÝCzØ^êm8bÚµ½$·ãä°]š!Öm¥ÿ&ƒ¦Ñžy¦5óêc]¡6Md ¼K†{ÎÖ7ËP8NçÏ2 dæÜ¥‡^󚑇²x9¨§ÚºA-u›À¼T×pÈXÅ«fŽ>óV·Œ]ŠàÀ©^§CxÙÂì9}@(Ïè+~_ˆQεF_sü¦ë˨ bGo6ΕAQ.l‡TaÙhœ¨ bzDƒÏ•a Qëš©œ^GWÉɲ &¶Íh*ÑÉé„ú¡€‡Õ²Q½$‡CVá3O¾«¶Ï'9 Âéka¹q’‡> stream xÚµšmoÛ6ÇßûSð¥¬I=¿ì°µK[l Ò‚P$Ú¢'“R ÷Ó’âÆYëHI@`Ɉü»ÿ‘GòŽF;„ÑÇů›ÅÍ?Dá*ô¨‡6[äz+/´‘ª«OÐ&A÷Ëõ>•ûÔzG]¼|ÿ×msÇ·\ð"æý×?£¢‰2ëëæÓ͇£@=»:>]ޝÌu,ê¸ê~°¼é/Ô Û-~ß, ¢žÂˆ<‹P?µ]ç‹û¯%êŸ^9a€¾wOæÈ%xEmOÝgh½ø{sÉ*tz-²ó‹ÅÛ‹³”õcóúXq&yýK'«W$v¨¿¹û¸@÷¿ãî“AõñŽ(´ë¾b'|k¼Œš¬fò(kžÁ˜f| ä"IëR-Ï]Îgè¹Ì÷^ñ·¢ÌÙ8èkÑ•H‹z:Ü‹æVìžÇì›EÜ%2-‹ ±²ÉiT‡ÆºÏŒ¦Xï2¶ˆr>±Ò*rj¦lªª5OX5H¶Aä´ÚsÁ²RHðI©qYl˦HÚ°š}6%t-ÓΞ¦¼K[8A¢ÍPÅž‰Üü»±|g¤¾S–Ù£'l±2Zy ¨€9'ŠXS.ääÁ„ÝH³Ý0›bC¶4g¿Ý{:'ÊU{œï/BÖSJ´­€vM¸ƒ ®àQ2VFÅO ß žjGŠä‡¢ÉUÞ Šrª/ÿ'_ð¼l½ç È”œÅ•nž‰Ëª|XÐÛú6Jè°³¡•&µÁ/»Á"Ÿ‘ÝntF7áó"ã}¼ê=;Úɹð&S¯™3c<¹:¬(‹Ö ®¾~ØÚa.«&ë¶au7ZŒ¬–*0h­rõ;Uð‚·uÚw5Yf¨w=}õZK¢ Ÿ‹§× fó =C ®z7Ëç¥k6‘¯J²VŸà™Ú:r¾­Û‚»÷Rd³ÉÌñÓ;-ìD‰†:HøFÛ[\ï ¦ØÆúŠa§w61%•“‹û„—^õsè*ÄŽÉ›~ÿÚ:n‘ endstream endobj 6242 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2852 /Filter /FlateDecode >> stream xÚ½[ϯµÝ¿¿ÂËvQ_güc¤ ˆÒVj¥X´² á©BEy(‰þ÷=Ç÷΃vq?æ“ 8/ÎñùÆ3ã3öÐeôTR—1’hå`¦ÚžÔ³¤V'’zjnhòºæX’Ò 4[ñú€Q'äšpk£™¤MçÈ“ŒJ4/ ‹ó\’øä<¯©ŠÙ5ÕÚˆŒ«Nrô–jÃÞÁÖÖ¼‘ê˜k¾ÀE9Â'^-%)¿#Iª"Õ¤fÊ‘&mcͳ¤£¬y-é4yÀ¨ÓÆŸdøLŽf²ªkž'ÓA<)ÉZá<À[×ÁQM6:ç9–ÄÈR+ºæµÔ¤¬!6ö5o¤fºæÍÔZ_ó<µî\·b/få<˜®9w£VL.Îï¨ë—5MÛš‡½4îÇúƒÎßVnÙh“#ü2}¡x…PUKÒ8O%:9„†q·ªj»Uñ £O~¥¶4¦L¬¡žÑ8Ï$Í2IHgšBÎÚ8ò…<’«à6¸®Yò^ø§Ö’e]lžÏAl²”R:18Q+ü)¼¨Ô5>"Å ù€€”¶&´JǼNP çuÝÕ¯è¯em/#ë7—/ß}Lo¤Yü}õ”./Óï¾ÿú_yÚïÓ'Ÿ<àŸ ºduúfÆ¥ ÍÊ ËØÎ³Hôìðg—¼ül̳•y‰Ù²#_7à Ž:Ãyù5Y¶vϾs;JnÐùMuɈ&HØ•%"âÔçI$*„vƒ| ŒhŠc”މÀE­z ÑŪ´AÓ,c*¢UhÞ1„—.1`xÜrF›¤m§õ$Üyx„M¸!*w£;Â#Ì{†´8‡DCzt”ª(‹s£'@Pz…e&êÁzÏ²ÓØzÇ6t¸!¸àènÉ¢BôŽ“8Àú®Ð ¬xv!CõÂëŸu–!.+Ä‹)+[ò"ÆP„Í{ŧ×ß`3*¯ÚÏ»"Ì‹œD"vCx-ñófTËný,H–†Gé_Xw–¾Të=CèfC(ï-á†<»`‰ÆdQ(kúY$xp&½Ý…XHXà4©´Î2r¯Ð´÷›’@ñéй<=ê=CØNëÐØ’´ALv& ÉÆÝá‘6Îâp-ºÔ(&åVtawP„Õ{%ð^¨ºx±®páת«Ã0¨ÂNÛŒ÷ƒº†¢†~˜¼”ÏŽêCQ„é½òÓwÞ‰PM…Ú¾* ì _!P…éY”w-UoëÞ”›Á¯¬Âü,Ø ÞT”<ÔÆûÓÙÁI!~ (§p¬ƒRòªæœœ¥÷j`ßy'2XéðYk^u¼Rø…y¯ÞÊš¥!GV8‚òä‚â“BʼnֆHB@ÞÉg°E¢¦¢ ë÷Š`ßy#ÑQè…¬¥l úB¾ª¨Âz·óHL Á^l‘|å%î½"x+ kë"_Pò,!±Ô ,Á›å{E°Ï½7§^- Ë/ž]g™ "÷Šà­$–HmÝyy‹’˜ÿ• *÷J`Û\ðÔßBQÃ:ÂùÊϘó,; œïœX¼Tx<Ä+|†s=Ë#x­|èô›` Ë@ÕøÝ"Ø÷^×Ý°Ž«’¨LY$5a™z … ]ýpOéP³g±zü»ÕV{~‚µ¢ïøv+êÛîñk”Ú¥?ÀJ){Ë®†” US}®Œ_`ÿÃËô¦³·¤¤/ÒåoÿGúƒà£pNˆÆÿû¿ûîmÌ~õôþã‚}µ2âõo½š)z1íòúÃÓ»/A0]^¿|•._=þô1½ýßo~ &—Ïöøþã×îü}~ÚO?~x÷¸~6®?ûëã7ß~ýÙÓOiY£QA¢Þžñ“Gôë¯?$ušXó—AÀú«óƒ´VãÇm`1h1è1xžUðmÿ¨ádó† I 5±ãd²1“— ì88è8zܹ(êslj̹ڢ;Nö’`Ó‘ÔÕrâ«Q±fjªÃž“Í, ûaÑtBËôÕ„|Ðu²—Ĭëâ7ÚN„ÑÉö裶T9;Mѳ±ÓûÚwÍ«‡}'{Iàë8ï<Ù:Ês ‡êaçÉ^“—ÊV÷lPã•—ãý¸ód/ ¤äžÔxé õÉ»–‚9l=ÙÌ‚ß<Ÿ{OPÂòqâ¸÷DÊΆbu$íçÞº*”ÍqïÉ^·öîh>ak5eïaóÉfÐTfÏÝ'HSH¿¢ýdó†èº}e+ûX×9æó¸eç-¤ð ™¯ë·ÊÍzÜ€²×ÈÒû¼bYº¢BÔ ®=l@±'ˆ¢”}r• W-¿¢EJÛ¥u=è.]Á(mã¸e/ >'óÝJÇUWôž¹Ç=(¿ p61>³8jB‘ÒwºÄft¡<»æQÊf¬‹ý¹ EX Ö~܆²—Ôjl.«£•‡)/ÛP¤ŒríÍb#Êúÿ£ëà¨EÊÜ)ôFžús'Š z‡w¢ü6,n­(Ï,ZQ¤øN¡‡¼éúÜ‹Rá¼;ìEÙyaq».‰fáíµèa3Ê/Hüà¯K“ endstream endobj 6478 0 obj << /Length 1174 /Filter /FlateDecode >> stream xÚ½šYsÛ6€ßõ+ð(Í42€ÇcÚ(ŽÓ­­§¸ BB"GI“Põ×$åZI5Á.uÆcŠ6õíÅbw%‡¬‰C®'¿.'W¯Ã˜Äó8ð²\̃Ø'a¬¯¡K–)¹ŸÞey›å³s¦/ÿ¸^ÜÊ•ld™Èáö½(w¢˜}^¾½z9$ÒÀÀï€4ôæ µ¸žåÑ@¿!Œ¦WÃÅ£q÷¦Éb9y˜¸ú)‡¸ÏJè·úŒ$ÛÉýg‡¤úo‰3§qDû'·„¹ÎÜóýº w“?'ŽÑ0æÎc:èÒövqm„Ê“ÍÌu¦RÕ¢Q¿ô Ê4k2¼¸½žûÞT×÷úždé_/\MeìçX.v*ÓÛÊK ø?ø¼•f'ù§eI‘Ër4èÅöb"Jô)¦þYôKê/ËDt\ýå8¾X· lœk©øp?sÙt? ØôR¢ŽÄ\Ò¢ºÉË‹ÁU#Ê6W2Y€„4MǪ̃3‹ þ‹Ó Bг 'täÕNÕ;¥öµ´Ií×ke$†p"dip8ŒéáOWéî@ (ìxëH-^-oÞ/ø»Å‡ë哇èOVØÿúBñT(K«–mE·)³Hk3áq1dÙ³ªUGÇ_ËS¹ênÅ®P‡M1Và ¥ÇqÂV:[U"ŠV6_óÄh,NŒb@…ä²:1Ý­¨VeÒ÷±×åp#Ʌ蜗¹²Gºu ˜?æ*ãµPYkä{`þùÐïWh“&<Éd²ÑçM Ø5 M{hUw!¶š9#×ÇsaqŠÃæ‚J ®Jdk^} ]ýV7“L¾B J¡j>Qy±žA ¸ß_ýö±VyU¶VJ­e#k.Ò´ëµ8djEÜ·A«Ë aÜ ` G) €AÐc¡C—¨?^‰zsÆ|ñœÆ'E$4À8¦Çe`Û.JeÒìk33D(½jª-° Cq» ÷)®A-ÿ<Ÿ°ŠÖ·fe# ”‚#D$èHK­ªØŠ™çL‡Àµ >Š#8F‚€A« º#àÔ‹9àõèO XjgðÃè«cVvŸ\ ¯Ö­]tQ ó ^ëî¢k­ymà"|éöÇ./Ò±Ô“ëˆ9¤QêÂ>ƒA!Ó¼_tý< w³Ÿ=„”.W¨ÒÝo§æ–¥@$Q÷°ý´¡I{/™õõqrD×~Í>­9¼@q»#Ùt”D0hPç…'Bê@FÑPÚ—1„¦f—£/Â…øÃUi8âáà€ì¯Ã…T,@¬¿îÁ¿åÀ,ƒÓ´ú¶·Ì„Tª,ÄÍc<±Ë+c©Áij)‰‘¡´=pûó  ‚jsqvù˜fƒÅ0b–4 '±&¸I0Ri›~’ *ŸÐTÐÎGÅy-‰wQñ¡ñ EÄÔò*/ ëÀI|ºžúâ õæ±CÇ|oðS+R endstream endobj 6361 0 obj << /Type /ObjStm /N 100 /First 1015 /Length 2848 /Filter /FlateDecode >> stream xÚ½[ËŠ%ÇÝ÷WäÒ^8oÆ#_0ô`lƒ ƒ¤…ía²Ôa1-F#°ÿÞçdu´ÑæÖ,’‚a:ï­ª“çFFDFdD5í#•Ô´Ï$挒´u$y4U«Xjmpàiå ¦y\jIJ›õ$Zô£HküàÞ9Í,IZá+ø“ÈúVxÕÀÖ”ÏZ±dFdÃÍæÝ8ªÉZéµdý¸Ú“n ·`4“ËB–’\»p1ùšW4y=®ZòÅÊÄ“5¯Ôäs!KKµôõDOUËÀ2 c_OÌT½ó -©6á*©v'SÅZŒN¦ŠEÈ@%N~Ê¥8®À«øX½bµ†uÆÿ !ž~:Ÿ0I½ >ašº ñÌR7ç/‚jtä‡åîí¸ÚRïÇÕžúsàç"üm6Óu?zèBvIÃ׳ø©£W-¶Z5Ž«5édê-Ír\íiª4ÌÇ t” n™>8>Î&Ä«’f¯|ÿÍ1(ÉjÐ΢|¤:†R×3CêkÃâcèÂkç°A`Þ9¬Fæú-m-ZƒºÊ(œ«WæZ¶æTûµn ¸ªkáS[+×h¾6$z¬,LF ÝŽŸû=ÖŠ%v,.´HìX]¨ªíC§µ 'î˜ ¿jÝ€Ù0Ϻ³Ù8h†ó¸vXúxxõêáöí~L·Ïß¿úøpûæ×~\Ÿÿòãû?ܾxúðÃㇷ®¡¼»ýéöçÛ—oe}x¸}ýøýÇôVªä ó‡æfº i#c}`e3ÞpßçéÕ«tû&ÝþøôíSº}•~÷ówÿzÌ"òûôÙgø·‘EiÙ¡+/,¤g»ŽDÉ¢…ÓÊN·Öz¦C Ùæå,†fºë`W˜ÝæU,†d‡vÂ7f:g™P)|=ü ÝK‚Þ]ëÈ >‘$”,ÚÌUçe,JîOÞ2ö C©žáÌ/#Ñ27g8¡Ü© ŲbQ¯¹Ée¢èž'üfÎtRVK2f¹µ»¢°¢0¬>D!0jG)ÙáÌáª3v¾ËXÀ0°AR'ö/þ…›™{µ«XtÅo‡yB=°ÓâïÌ b¨¤}^&‹Þáµ!ª‡Qž Þ\F…lîÊÂw:Ζ'7ê¦ØKœQižˆùwŒq5 ìhEçÿY4ØŠ]& È LÆÐÆ¡Ï\ŠOp¿L3 Ãņ(SzãŒh ½Ç¢îÔΖº43•Á>ª+pË¥õ«8TÌÍÔ s#â¤Ùv.8ôU$°W0…×Öú¬‘ÎÐXá¹®“„g&pPÈW ¾,Î,øö® Ú>޵ïu2Êyƒ;ö/ä§øå23!ÿn$à=Ýí ægðÝÖ®b!ð–ÌÁ†I‹#î¬*ds™, f³]°ØAœZ‚ü«+|·Þ ½û>HÇ2r8äÏ’VÂ&ÿB6"ÍE$W#¾D¦‰­¼ÃQ¹Á•óDfN[—‰>°µw$¬6FfnÜFÇövÄØIâØK[ƒ÷”±H0+lø¾ÜËM}cÌëÈþ¸­B›%GJJå@À›ïr({´òœ.bò‹®ƒ'x•Û¼_C˜€xybÿ `œ'PŽüè^bºu5à Ï›° sÒ]A5^5Eø=®’2ÂašZºÂOÀH¸‚$í~^ºÓ:óŒª"Ú.ƒ§œˆsxÐ[à;ï'¦cóþ ¢òd€g£Ü?°«Õ©Ùî'¦s# è £í ™xåþAÏÙ`¥¬ÙU,0kA¼[y4€,ÌûȤ6ž­ËXtDݘáÞŠ+:ƒL¬ØùÝÌTËfY`Ûª†l}>Ë¢ׯe,x`a©ªqE§%+8T¿Lˆ3«Á&Ê\[‡c?£'­Zr½›™ªìŒ±°{²¢AoÅÀ‚9 ¤ ˆF/#Л¥–QW\…Ì þÜ'×úe, ÙXJÉÀÂyüÜYâA¨z! …«t$b+²Àn.Tf‡wSSݹ£v$AœGŒ-&Vœ°ÅÝÍL·rÀêKc¬ÛWhX' œ gÔë$È®ŽS¬Øër]ÐÙYä*HBµ`vñ\8M”0æ›~/ôVÛé²,³XæEWpA}`Ywm÷wSä­,˜x±¨;bBˆòº¯z6ì÷2Y Öa,E˜"Re† ­ŒËd_ÕÉ¢µuòï ݸAkE/“Eç±&X¬úÁ|QÈæ ßátÆÝÎSV„¸a3Ñ»)ò^ˆl³Z9L¥ÄWPV$i÷×c3 ö:,ƒƒ—›{ F æó —H ¹räÈ={ ÷@î<yòäÈ#G @<yò äÈ3g Ï@ž<yò äùŒì¥Ä@b 1°x j Z z F YYYYYYYYYYYYYYYYYYYYÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ¹r äÈ5k ×@³Bôƒ@®Ü¹rØ ‡ zØ ‡ zØ ‡ zØ ‡ zØ ‡ zØ ‡ ú³ ¾ÛÕ®§ "Ñ¥''û)]*¶µñÔsÅÂwk«æ©…ÁãºTlw.Ì*ºT#hÆy—ÊVÏÇÔ‡ l¾]ÇÔþ ]*¶³Û²a㇠X!¾ErÚ¥²•vüÂ÷fx*l{Å‚ðÍ›Ó.•­,F?JÞêÐÀ³òͳ.ó½=¸ fØ¥"|ƒb06òó.•½,OûjS§(jæ›8gm*{ILËܱ٧"Øø™åóE£Ó>•Í¢8œU”oP<;‹ÓF±­m§uH²S…™ìÔuyÚ¨²7ûFmXoP@WùªÜi§ÊVÔAöP=༇¬V€óF•­$&Û^úT”-U°“ó>Ûxæ#p“ØÊk/«’$ÜÎ`´çm*[I˜"ÀrÔ±*I> stream xÚµšM›0†ïü ©e ÇVj«VªÔvsÛVÈ'A嫨ôë×BºÛ­6ñŒ —@xæõx<(ÙJÞ8/7ÎÍë(!‰›pŸ“ÍŽ„ÜåI@¢d8FÙäänu{(Ô¡X?÷CºzñáítòIîd'ëLN_ß‹ºåúËæÝÍ똒xò`²Èwc æŽ,ŸEà Q¼º™>KÆ›œWç›ã WQâ=ˆn B’UÎÝJòá¿w„º,‰Éã• =êúÎKrë|t¨±a¡ç&lÒ¢ŽíJ¿æY'¿¥ºI?Sê—òÙQФ¥Û“éäÓ‡Ü[êqÿxÁ_SÃÇso€†áSÔïk?\‰²È…–i;}{B¯=º’k/\ýZópe€2˜\ó¬P~šfM;~›E?+9Í›ÚÜo–ºëš*Ý %9[^‹j)ݨó¦2™\鮨÷¶p~~3½Ù3!V|)ë½>\Ÿ êG4µZ;ô]V´¢\*©xŽ o=¯8Tð\)Ê¥° GX´.*©´¨Z[47£Rž¾ñè_­™ÛPA®@“áùÓ=G9¿€²SES/¡ýRŸ k1uíBLÍ”ø1y¾ õß´ØBc‚ ‘'mUÒ˜e#Šn¤¦´Àîš.-›L”Jvß‹LNÙ¼¨³´8›âaÊ›i Û4 {c½8Î t«¸Ž|»¦X6ÞRm®€-¨ Ú, ÐÜNVÍx:Å”­ ½¬ŠßrÝà‚ÄŽm–ì ¦ AÉsg¯ÄÞ¤ž h·M‡ÌÓtkF[#°õi·…¡>ÓíÚ§«¾(sr¢¸YYHÀ`´BJ',´NŠ8:®7l™üä€ÇÜÿÄ|7 Âyâ²äŒ±^ÉÌh(Â9ed‚¡“KØèÀ©•¹ÐÂÈŒqÌñ3kr¹7ÝYM(½˜a È–ö|Hx$¨ðú˜åZsÏhÆT82ÐÇ1ERõ¡É!Qƒ6 ±ÌNj Ür;‡æçЦ‡’;Ì!ùõ‘æi Íü·šM3ÈÆñL°fø¨üßd²ýYÍ€L‡óL€æ›™& ™0æ˜Q °Â™Pb,Va«°8@EÓÃŽ¤ŠÀê~ØùÌl1CÂ5p [pa†Åyˆç‚ƒ;D†‡æb¼fØHArAÙã™ FrAiÕ‚ ÒŠ[e€wTâ²SPv€; Ôô*g35݃B#T×?”šÀjëò³š“Ë*µ¿šÏêtט7> ­=é1ä1FÓë¶×óq§†¶b~7<x"B‚Á— wbÐ2ªÝ~Íw~ª»ðþµ‚\Nëë¾4ú2¡Öètß À% ²#é¿´P{̄ͽ‰‡W ò’‹Gþ=>õ "óÝ„2›7ÿ»¤a€ endstream endobj 6480 0 obj << /Type /ObjStm /N 100 /First 1015 /Length 2836 /Filter /FlateDecode >> stream xÚ½[ËŠ%ÇÝ÷WäÒ^8oFdD>`èÁØI ÛÃ,d©1ÂbZŒF ÿ½ÏÉê¡…oÍ"]0LgwÝ:y*2ÞQ·ÕQRI­IR MÚ:5YY—,y­\xjÇ¥–Æq©§yÜ5’”6¸šI´èC«³r]·uçÔ$­W5I¯Î•%ëÞéIËqµ%•ãjOªÇÕ‘ÔŠr5“zõ‡F‚ÚÚLXIÒQ*Wx‚Y;W5ÕÒ W–ªW=Õz\m©Úqµ§ÚŽ«#Õ~\ 'ØC .&’L*wM¦wÄD¬,™ñÄw]mÉÆqµ'›ÇÕ‘¼tåj&×Ò°‡ÊOi*Ém]UMÞ@«š¼¯}g1²‚P9®â¿ƒ•b#=îÇb… `…=jáññj…ˆÇºZñë\÷â„ûÁ GÖõ¸ê©×ʶÔmí áô¶žt{7áj¦>ºa|šÁÍqaˆÿ íijšʼn•¥áF<ó4Z'žA«†ÏzÓ(qi–N~6Ó„J`/T:⹤ ñr¥i6án^ÓìÇUKs¬{Ý¡å¸Ü°”…íK=>@õåQb ý-n<”V¨Ôë \ÆBhPá2× :,¥óq”Xôøvƒ-q‹†ÝÄŽ`79(B›EŽP]‘1x<ÐD”Kì¦b¼ '"ªƒ·Aü¢Ô(,±›º‘Y§½µA±AÆ‚ã‡,}®åäuеñ69tµ<¼xñpûú??>¦Û§oß>½¸}õó?߯ßÿòýÛ?Ü>{z÷Ýã»×t åÍíO·?ß>-ë—‡Û—ß¾O¯Á$Wj²j®ªIVÈÙ«f,>÷izñ"ݾJ·?>}ý”n_¤ßýøÍ¿³ÔþûôÉ'ø·E— —âeæ6èFF £Ê>ÆU$D³@ÙlöÜax 4¬FnUÿ7 Ó$ZÉ.̆çNMé=+9µ ëºJî¹ÂmAUó€rHW(Å)ƒdô*8}š&Œ6š(T’N¶”{뇷<á à·ò,EÅOˆç?rOc' ɱ^;OxFi#ª…ÑPúe,è1=OÄsi3Óo!ª@&r Ån™â4Ô©DA«…µÂ›ßÑŠ²‘ƒÁU {BŽ’røðÌ ‰|’‘kH žäÕD‚ +£CfN†*—Ú®RŠZ! °èPE¦€6ðH ¡²r!‹ŽÔ§6¨"Ò²@¤®ðžˆª÷HÌQ $Æ*´A™2à`:ò¶Ú Š*Z‘…!D  ¯Yůb1¡›(j-+­PFvÄÔÊôâÞylµRAƒ‹@~“W]Q)ˆF'b¬_Ä‚¾ÞLËÌa,y ç®Ò!š«HL$XȬtZ¶I­)%)ˆh^Æ¢ÀG7xÐE†1Edg98kFñq…ìdl†ê€¤S'søIgV’‘á\Å–1‘à©Ca¯(/21Õõ2QŒ’Y–©1½„Ãê¹ èUïÙû]IlM±ÊJ­´" cwi ,Ìs“y $tJ Qè"êØ•x+HUÙëD12ìB¥¬´Bºgœ ;éå^du' øêÊð…ˆŽÚTzƒ6èòáÝëe,œõdKéÈ+z]…)u´ÏËd¡°úˆnG^a†ÜÊ'n—É¢T¦L¸uyqÖgåh¼åq·>6ÛÈÂ*ž²@1®õd²+úlÖz‹†T›íd» Ixm)`Áín…l¾WÂnôCX!ãDDX£²0Ó‹ (åjGaoÖLjñì3"áÍ¥]& DÑ¿ ì“òY;£*Îén¼•tQØÅ–#±€ËÔÇ õr·>¶¶S5a ؽÏ#¯ÀÏ9fB E/âÀZ¼#íï(‹;bHû›ÔéÔïU¦{Y ˜ÎÔÁeT¶‘ÐÙoFŠÓï¦[90c÷®–ºJ‘IT‡dîJ¢ï<¢ìij3À–š1µÂù€ÝP¿ŠŒtíZp.³ ä'"HÀûe¢Ð7;Á»½5µ ;‘ËD¿äˆZ JYP™Z…h8­È¿ïêæØI•(Ç0ì °eÊà¶ÊýÂt+ ¨æäX©Òò8[yÒÝ|)‰YÖ(.#€-Lþ›+R»Š…±«k©á´úÑÝ]#1¶Öî– s§ €ƒ„ ò«·ë¨)’¿ûeéNB㩱1 ¼åDÚݤ¡ºJ•þ öá³ÂN’ŒSIŠ!·¸' /;ƒ=`_€£`äx£»Hó*ì)NgæLÓØSä¼y0šÕ«XàÑÊÙ€pÃÂÔ;kã*ȯ 7A]j+H R´»u©ËN©«}ç•d øÞ ¬ØYW±€ÃbUì —ºt9,ÐéØv¯,äÃØ–¾ñ@NǶ[I }P†¯ç±­ÃS ÒŠÓ±­¸îÔͱš$1·åOº¬óÁíV,ký0¸å‰”6?bp»•…#¥â‰<n)z>¸¯;MÄrõúarK6:?bp»•ÄsúƒÛHÿÏ·{Y°(üupEáùàÖm§ZÔÕÑc^8,í(Œ™ŸMn÷²àØ &G·…rEN1ä|t»—¢_˜‹Ù­9Âyý˜ÙíVª+Špv+,‘ëDùˆÑ­ûN;Õ¬MÖèVY!³•3?fv»•“=«f·+Ùç£Û­žKÓÝFiz>ºÝ{6Ô£[ó±RŒÓÑ­·ýrŒnŸ äóÉíV¬Iá*brKIıÓÉíV ߬7&·ÌüÚl1¹Ý{G¯@òKÈϽ‚óÉ­oíÝÀEpRÛ™`&:Q½œn·’xvÝJ»`…¼\÷G n·’ üK‹Á-s¾™u>¸õ]xêb¿n­ûñ’Áéàv+ ãkšÜ2»\i;Ûúÿ¡‹ƒÛèbn}gïFœdý0¸5œƒúGÌm·’@ºÍ×Âcnk랎m·’xNòblIÞùØv+‹êÇ@îylkÏïOžm[ÙÛUD­õ) ”ÂÁúéØv/ dyüv RÌÒªL9¡;Ûneám½ïc[ÖÉ|áåtl»YG‰Ám$ÿçƒÛ&{µ³¬/Lƒ[Vís±:ÜneQŒ]šÜ¦ó{§ƒÛ½$ ”î1¸=Êd=Üþ–Ãéuã›C%}™nûû?Ò…g(¯ ¼ÐÛŸøáM|úåÓÛ÷ ö%õqw½îz­ñ±Û«wOß~õ‚éöê‹—éöõã/ïÓ›ß>ó+0y¸}´Ç·ïâWF>ÚOO?¿ûöqýÍ¿ýõñ»ï¿ùìé—´¤?g~¡g_ÃÃs¾úæ@Rãû»ëóK ?aÿõõÒZ_>y^h,j,,>ÜbÑc1b1Ÿ³Ä"g Ï@ž<yò äÈóÙK‰…ÄBcQca±ðX´XôXŒX²²²²²²²²²²²²²²²²²²²²r äÈ5k ×@®\¹r äÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ-[ ·@nܹr äÈ-[ ÷@îܹrä0+ïܹräÈaƒ6èaƒ6èaƒ6èaƒ6èaƒ6èaƒ6èÏ6øf׋S¨¥!Îx?…ïÌð›žçï§´­/{êj=Æ*|UGðÄço¨üÊâ¿LˆU¹ endstream endobj 6599 0 obj << /Type /ObjStm /N 100 /First 1015 /Length 2489 /Filter /FlateDecode >> stream xÚ½[M«$¹¼¿_¡£}Q+?¤LÁ°°¶Á6øäÝÛàÃÚŒ1Ì,ËøàïU¿ñÉU}£¦ºKQ©üŠŒzÃSK+ÃÓŠ˜ráEÇ࢛ÉÅ(ý¸eŒÎE–˜“‹Yæº4[‘¶®M)"s¾a¥¸åq7÷uÓéEúúéìEÂŒ«Q$GpE[®²¨Øºß,ª¿è­õf\IÑnã +%ÚuÕŠæqO0-¸Â#´®F1Ŭ¢˜Yr•Åü¸:‹uUZ±X¿)–!ØC´xí°²âbÜM¼¸®ßJ/îÇÕQ¼¿â㸚Åó¸ó,°÷ÕV€B¹’‚O{¨ÂÆëÎj¥ûqÕKŽU/=Ž«8‹<®b£v\ÅMÅWøŠm`<ÓuÕÃöàQŒ š=±>NçW`ìhÁç°QBŸ*>Æ [F¬}qƒÈ0ìáZò°•[ÉÃVî%[y/yØÊGɾ¬áQpøë.Yò°•Ï’‡­z+ó8Á.eâ±GW8ÝqÕÊÊÌõ¼=àm=RO,kõ‰¥®/ º¯/‹ øoÃs`£¡têe“n‡É\¸6ƒÃ‹Fƒw‹èñì&v|»‰[`7ë xZ‘pâFK]Ï4Z G(*ǰ›jðɰ Ö°›öã ØMÇñì¦)|¶Àn:®ØÍ) ò6ß>|x{üøŸŸ?•Ç÷Ÿ?ùúöøáßýº>ÿ韟ÿõöøÍ—_þþé— ©¡ýåñ‡Ç¿ý(ëÃÛãÏŸþöµ|„¹*>ÔkƒŒŠ` ë5RðµïˇåñCyüþË_ÊãwåW?ÿôOÕõ×å»ïÞðo­Ž\¢u"‚w*#Ôjjÿÿ dìD¡£Ò­ÕI/p«Q€æ6 Q Ùsä¬ ™KÜa Æö¬SN-aQŒVb|DÔ†è“uÂçFLsˆnuöU©*" ZM”„HEfºÍZSV®­(}@1k …°9á;MÑkc9p©ÂºZY];þ›~«Á´§³ªõuƒNâ­¢>œ¡èQR Û¨¨—âÁ ËhVI¿ L0˜¿[¯†šǨ¬‰¹SuÞˆ¢Áû´Š/Þ¤l&¼¢ÞYÒQúQ’ª£…bê0ô }j5¹Í}V¶Ÿ(ÎÕÙ G8š#ÔÌjÃÎPŒ½$Ñò M©l^i›`Ó=å-ïBaØ õ YÙ€1y8*:Ú(Øæ6[X«@‹Z;É‚Š+œ ¤à.Ì@Ÿ‡½ô°( ÈaBÛœÚ"v¢˜•Í3èI exÄŠŒ FÞe™Ü%j0s&L€i Ëè] à ¤Žà¤5Ø÷†8€Bëq EG¸ô@{),"ZÑ›•Ã4§¶È^!«Žú@IZÒQÂÀÀƒà³q ”S‡‹Î–«’)©#§Üg ¦(ðjC §dÓeNTY³ßf ì"ïðމ\º£ã €BóÛä.è²O.h/A Ùd Ïìlúië=wò±df*(µ%yicº*4_ó6R»«›ì/É©­ õ еÙm¦P„ Fg¬š®HŸF‚–rŠè@ÅLØÝ•‚Þ…% …!08YpRW‚B:= Òh;ƒY•Üý% rVåØqsJw¢Pr °BC—c ÈŠ´‰fǘÒÇ]–H0Rƒ'J®á‰6ö&fôSj²Ñ @ 4D«#eÃ;Áqàgv:ÁDA×ÉæNœ øÙ¼ ȆF]¨Ðd=éœa£É9£B±3mfTÃ5Ø]Â+œÜ ÀÏN òV(W¾©èiÆ"ÈR9Uð³®·™‚»3:9Ë%T‚`Î@ØÞ6oi1拱Ís´Šžgœä­(žsÅžã9V4€2˜ä6S Á2`ô–¤Ç¨#HÀ$,Ýd|P˜¹Èº$yÑD p°wF Ã÷ôìzÙj² u6²³Sz¼ÅÓ+pÓ:I ¥£ë²IžÑcßìšAéðÉÍ ‚V!;;£Ç¾Õ‚ŽM;|‘c^Ë£ó9›v›W QqؼL°ê˜¦ ;;¥ÇÑ÷VÓÁ|‰ƒI«šŽf‡MNéñVƒù’b|‘ã ©ƒÔýx·™]%ë˜4CCq̼—|z&§ô8Æþ™ðÅøßq€œÉ)9ÞŠáyèq«Øó8ÀÍ´Ýe”Môà8 õÃá”dÐnÖqÆJÁÛ6‚à” nàŽWc¤¯@w§´t+ AWÑ¢ ½YãU׬†~)ÛîE¡ æ8‰[ãUÚ†/eÛÈÝRP:Öpu¸À¥l»C•/‹P¶åp•“EyA¶ÝŠ"¨ù7ÙÖ'åôkÕv¯%ÀÃù^²g«ŽŒ©Ôë.UÛ˜;Ãá°R[³UGX(ßè¹Rm·‚°Av©¶œ­Ò4¯ˆ¶{1èªáï¢-ç¼Ám.EÛÜ8ªpJQ#—hËѪ0d¾>t©ÚnEñÌVïªí3[]‹¶{M18±{m^ƒƒ^‹¶[Að( >E[7MäïkÑ6e'ŠeøÒ9ãÚªð ¢íVdŸðÍ^ÎÑ*»Šhþ‚h»{§h;ÖlÕ‘.{¾"ÚnE1ÚâþÀ᪣ 4ß×¢mêN[°‡)]uÍV—&ãÍv;ˆ(]Ú®.è·®5Û½ œãò\ÃUô8”¯/EÛ½(ô^r¬éª²Ó|A´MÛ!»†¯é*#¤™¿ ÚnE!|±$ –+eYø šíVˆ ¾ë½­éªÛD¯õ‚f»gEÏ| nÊXi‘KÉ6}g5•Ê·Ë]Ç®:’8ß2¾Öl÷¢Ðª.K´ ¾;>zv©ÙnÁn”ƒš-§«ì6)©_I¶’}'޾$Û\Ü„=ãÉv/ˆ@Ä’l9[e XæZ²ÝŠÂÛz}˜’-g«NÕAíÉv+ Ô«~Ÿš-©!mÃw×/5Û{]3TŠ9\RçrÍ\q­ÙnEAS ˜Âd½LKSô™×¢ívSð/R9BN8<_msëÜ5ÔƒS÷¥‹?5ªKÑv'C;a*Ÿ¢­¡É10£KÑÖ7ž‡s5åQ¸bGt¢§ñ4Û­¦xGþNé’ï(.EÛÜ:Hêß4[Vòv­ÙîÁGÏ)ïš-*ɸÖl·:Å’ÐñäÖáü£1x¨Ø ’íÖãh|›Øß%[Ž´ø·z—’­sÌÿ’½q endstream endobj 6717 0 obj << /Length 1056 /Filter /FlateDecode >> stream xÚµš]›:†ïù¾$Ò)k›¯pÙJ§Õ©t¤sÚÜm+ĂâÈÚ¤Õö×ׄÝ6û‘ò!7 Ù„g^{Æ3c'œ•Œ³λ•sõ>NXâ%‘ŒØjÍÂÈ‹ŸÅ‰½Æ‚­ ví~¾­Ìmµx#Cî¾ýïŸáæ“Z+­š\ /ÿÍš}V/¾®>^½_r¶´ÀÈïA,½e[s– –öxé^ $ýCÎß+çÎöSœ‰ß"ì£~Èò­sý•³Â¾÷‘q/H–ìûá“[ îI?²÷5ûìüïðÑ…ÂK‚ãq¥;]-dè~[D¡û×AÌ C—l¸ùôÁaׇQZñýûVìŸ7ÂòÂp2P$’BLo’»ûª.fæm£¦"£×‘66Ò]¦»Tu÷;5³^ ¼ïmŒÒýsèi¡ô"àîå­¤F]z,ó[Xëv›~á\Öã^H!´YÝ{h-$ÝGthVht;ÙFÍÍÔU3®3¤2ñd5 ¯ŸÇxÈÕ#興nseÌÌT­²bf¤Éúzó­_#j*ú„÷ì¬þ*£è˜¤ºkÑtrÛí®³BùÞ§ŒV§yV×7Y¾IK ê–g[1—´²Þ7ùTúÓ¨ÑYSØ"cK- ø_ý˜ä¸‡†Rç³´‘v=×[›ÜÖý³}Ý©î6-÷H2šG",bà€^·}®×CJBªŠäþ”ž¹ ÊQ°ÓÖH —\à<ÛÚ)u&ðaM˜l=F  0@à{¼¡¢0óÙoGyæ›3 ï×OR_º„˜˜)zi}ºä>LFztèÏ)< ££à ¥ÀbLÂI%ØÒ“±s#áîXòÇÚÎK!4æÞô%-벩ÜWbmµ%º;x~e2–^ú,Š/H^ÂÅGð¤<âje,hCìM }ÂQÏзukÛ÷Ã?«\Íd¡ÓJëvNÍÍ…%½cÃ?´]i&vOeŽs$‡v(”f»©¬¢°šÓ6ú÷/™ „LF6LÅŽ]N_:\«Q Žª³0¼¥aAÿРàlR w£0»æŽ0›‚ žM* vu‘¤@•0Ш¦Ð*‡v®B¢Î¤¦·@?NÛ ;ù i}ƒð).ÅîÊnÓÍŒƒÂËGa^} º"ÕgÝÍÉJµ™kœU>4€“yÑ ^šú ‚!M¬Íǹ¾ßÍÏ-¾ö€¾§›€N5èTälC„D"'""JN[K 䦑ÍÈ”³:œVèø_ˆ11B&°˜ª¿É¶ÐÙü¬¶CF–Ðø—‘/œûÙè66ÄÚðj«fÒ7ZyO)z ›s'ì7HÎFJ³}w›C³•¼zîõÚÏÝé%<˜òk·ŸÍwâÉ endstream endobj 6600 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2873 /Filter /FlateDecode >> stream xÚ½[ËŠ%ÇÝ÷WäÒ^8;ã‘/z0¶Á†ÁÒÂö0 YjŒ°˜£Èïs²:®ð·¼HÌPÙ÷V<¼­M%µ:,‰ž´ujò²¾j©šs€Ûà`¤Q”ƒ™¦5 fIR:ïž’D‹?`¤„äýàÞ…£‘¤Î3+F>SëÒ’t©ü sŠ'Z‘¤Pi2ÑÊ‘%Ó:9òd6í£š¬jãg-Y;¾íÉ:&Çh$›Ç·/SÉ_JrYÈ"ÉM#Mî•÷‰%çË`äÉ»rPóq<Û’¬¤§z°’‘ª.Î2!§5¯–TV*©bvŽ4Õ>9›Z‚lø'/M0¡dÙñ-¦ô¶ðÆ!0Œ(°…l=de t°2Mý`…¥ì+¬\·É9¬¦^×ûbÉz[od=õ~<;„fM¬n%Š—4dP¦.iØúÖ5 _Ϻ¥Qo=®Š9¼¦1Žg[óø¶§)Ê÷ð‘¦.9;gɹ–4VUÒl‹sÕ4¬–求աa¥NL|)2É`Rl½28I9˜DJ]¯€b®ut,iPÒ2,"kŠ5ň¬f“Cl ³I=0›a""G˜„ÈA²M*ÿšÆ zì4 [7ț¾¦è˜MëÒˆŽÙ´ëÀl³éX«Þ1Œ`=†ÙLl=†Ù€µ›4°I:³Y5>60›‘5†´À>IgÙ÷¤…7X¸xiýáÕ«‡Ç¯þýÃSzüôýûç_þôëï?}÷þ_Ÿ=øöéÃÛQÞ=þáñŸ¿•õÇÃã_ž¾ù˜Þ¦rǪª”<`•.=wØ©ªà:pß§éÕ«ôøezüýóWÏéñ‹ô›¾þçSöþÛôÉ'ø·„H¦Ë’9ò€b¹Ž ”´ÌÜ«ýo2ƯÀb´<°ª®–Z/"™÷D±“^6êö5OjÁ¨Í]QÌ¢PÌ5l¸ŠbæA+é–ÇW±À¬øŸ¤J.¸º·l4æ&`wO³ldQ[®NóÅÊÀä2p£Ï<{¿Š…W˜Ü —É‚ ÛJvìkb²Ñ«XÀ$; Üi8[÷’m±jþ貑Œ-ûÜe8ý½C6we!Y@;Ԅר :”•¤4KíW‘x1Ô>³b9ì»u`þA|‘Þb›m@þKzüëßþž~'°4HxtH^èýOßÿ.î~ýüþã‚}ÍíkO½Æþ¥eqÛã›Ïß|ù‚éñͯÓãWO?Lïþû߀ÉÃãç@{zÿñG†‘ÏóÕ~|þéÃ7Oë³z|öç§o¿ûú³çŸÓ’B©¬Ø]‡ \5ÞóÍׂLõ¸ ôGÌ¿bRÒZ!éË@c`1¸ÝScÐbÐc0b0_RbÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ5k ×@®\¹r äÈ5k ·@nܹr äÈ-[ ·@nܹräÈ={ ÷@îܹòäÈ#G @<yòäÈ3g Ï@ž|³¦È3g Ï@ž/Ƚ”H 4AA‹AÁˆA ‡ ö°Á6Ø_lðÝW+Œ”aFˆ–s+yÈ”s¯3C`ׄ‡È°Ñ" 4ĨÆT¡dÚ1ªµ{_7²Ðú Aõ<˜Ù 0›Â4"r! äÞL˜ódœŽiN²Bªõ*½ä ŸÏ“éåè+,€>B6W‘¨X,L9‚tdo•E¬Ë]IØNI ò–7z.LëI†•Hd¶«HŒ‘k[%Ĉ‚˜¤æÊrUG„Z®²éÆ"™eÇR &ù0ÞË(À&;6ìÆ ÷4Y¦ÄÖ™Ëô{,|§BØ•dE4!HàŸ/6¯"H›â­ŒxH¨„^ˆ@í2AXøY-¬™Õ.Ãf8ƒh0«^& ¼sV/ yÛò˜Î .víwEQw’€³B´W‡),4´URÍ&ó*®™…µÚƱƈm;(X!¥mv ̪”EípSHaᦠ”`5²ß+¿m–…äŠÐ¼BªS˜}€RÚ»å·ÙöZiE°\Í2s6ÚiE¼bØPÇU,”ÔSq¸ÍÎþ‰B4—ÉB±…rÊÌGµ×òD(_ÁƸL­¬ºŠ³JÏ åœH:°*ÍÝòBß©ØÉ‘¹ù@pÉ’û±UËí~ý­ï•KÒ¬þ ¡,zfƒi8Ds•(T`ŸðQÞd… ¥t¤•øŸûýòÛØÉÉÚ‚KاšÀa’bžûÕ·‰ÐPìé3¹!¸¬Ð „ºúÁjäQ¯…TÿG‘™‡4ÄþH ÙÙ,r cæÁÖ t±­È‚}ÏÓïFÝ+õs`ç† ]M$ \ùªN^–cŸÀÿd³¬&»,\ì*A0ñÒ¦É:‚KfÆHG°ØÉ˜ ÝÏŒç^gÅÆ%Ìr5‘–³ÂŸ¼èe¢Àþ̈́؛²‡ÄÞÑäYffw TKÙ¹Gˆ9O¥ì%¡³éíX ‹6ìÝœKÙÌ¢¯=Œ{Ù:³…h«°xsv.e3 ¸Š~[I,âÌ2ÏÏ¥ uÛ©œpÚ î*”‘Õ]æ†ØÏOÏ¥ìeÁ‚+‰†+ ¼uÖY¸³s)›e¡<²Î¥ 8L–Ž&OïKÙËBYÚíë\ MÊ©êçÇR´l­åaùi ^› ÓÆqˆêìXÊ^ÍW¹d‚ ó„œ<¨{v*e/c(ÕÓ(‡À†nf§§R´´G•Ê2‡s`e•…^>m×îeQxlkÞúµØXWÍû´_»•…ÁI+{”pŸ,­2OGrÞ¯Õ²ó”'t±‹­ÒªÃauž]:ë×neÁò€–°}¬Òª#1ÕÓ~í^QÀO¿ôkì­ü´a»WÝYø­a ±džñ?é×î̃ w9Žy¯v-W§ðØüY»‰ÛNûè°Ò~k×:²3;mØî%x©ß­aËržõvÞ°ÝÊÂpÛÄ/ [çÎêý¼c»—b^VH^Z¶îG¶|Ú²Ed¾“Ì¿xiÙ:Â>žz:mÙîeÿ4‘{¼´lY×p_§-Û­$h–üéK´lIŠ®û´e‹üm§nÂ)Ô_Z¶ôšüuÅiËv/‹Ýdãø¥eËâaãø¬e»—…2³[ËÖ‡ó§<§=Û­,nzñÒ³½éÅYÏVE~½xéÙÞôâ¬g»—EèÅKÏö¦g=Û½,àøk…èÙº¯RÞyÏv3‹C;£gÚyÚ³UÑ+‚ ÛéÙò× }œ÷l÷’Eä/·ž-è÷6Î{¶{YÀ@gÓ[ÓÖkɃ?8kÚn–¤´[Ó–¬ºëyÓv/ „2uö[×ÖéÈÍλ¶*·RÖàX† endstream endobj 6829 0 obj << /Length 1095 /Filter /FlateDecode >> stream xÚµšÛŽâ8†ïy _‚´C;GÈå®43Û#í©A{Ó;ŠÜ‰«sÇ Í<ý: ³KÓùŒÔ"AM¾ú].—« ”¬ %G¿,Gwf‰¦Qè†d¹"A8 #Ì"}9d™’Çñb#꘼s:þùÏûîæ¯¸äE»·¿±b˲Éçå§»sJæz П¹Ó¹?ÓæZ–ëGúÙ||×]š÷ú¡ÑûåèËÈÑŸ¢Ä9‰ÐzIòÑãgJRý¿O„NýhNví's8têz¡¾ÏÈbô׈ö,p¦‘ßi©ÛqÅêYÅl«6Jäü§VL§C®IwóðqDÛQºN§öhF¿¼s40ΈO—Ž·"Kí!“LðBÙæÅÕPbx(9Ëò>¨KÍd¶Ð~­Ã°5WöÀ)Oä¾² , n¦×ìsšH^ULö‹tЩÿr¨c X‰äyâÐ1Wרж•§ ’VŒˆÐ…'¿TBòX].ÿPê±umOç³4µE&†®J¹kŠÉ”=eðª7 M—‡N×f×nÐv€Ë…P‚ev‘ŸŽ¿NÜ`Ì2øÀGÑ]ú²Èk³J³¼ö“0ß E®FÁ`µ¯ú“L0@qŽWm×êv*{èL •ü‹u`\I®Ô^_D¡¬Ó“^bˆ†EÎT²<¢s¦G]Ö*eŠÛä–Ï1«uý•µ°žèa×ÀQ4’wf0Trƒäk‚Å£k†ÆB%ËnkRË—=œ£@¬1À¼Ùqv±Yv+n2^·y›-XuÍå×f}qÙlŽÜÈœ ¨@Å[=®tË€UøfÌkçápjqú˜ÜFž˜ˆK ¸’µhSl™‰¤«r’ ?X2/nëTF²f@9¿ ¼(»EÞ» \|‡÷õUC£6”ôÿ+qgî4<†ÑÔÎðH»æ¡ÍoK‹“„éphZ77ãCÙá›ìœ÷nž ‹NyWîn3uêAöMáñzËëú¶&<â 2‹Ë9tÐ5úoè U^é£×øÀ±¥îtPÕ õah3è" /›ƒšÃ³Yµd,½µdh#€m¬d™&Üap$ã’A½!<µk`õ…°FM%æf²2aYcE$¼bu½Ko`Äp3#ªÿ4Ù˜¨†óŠ,Þô÷ÙEë»–†¡ô±)N# \Y¨M/mÓ ó SÞ÷èÔÑ?”ýJFÐeÿ2Š`©’çe³|º5d\‹o6qx±€3wR÷|WòŽëGÆÀé5Ö"ÒÙSY÷Šó¡uxŠô@sñë½þ‹ÿ~ÿ°¸ÿã÷¦ïðõRag´/6 ÷¡¾í"+Æ}çª1 å¸ .•EGÁ¬»ê‚ÄY.jäÇoÀøÌEƒëm; ë,Ê¢Y¦ËÁ8¦ž:^_û±–ïN#êù­Ö¿Ðýº endstream endobj 6719 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2844 /Filter /FlateDecode >> stream xÚ½[ËŠ%ÇÝ÷WäÒ^8oFdD>`èÁØI ÛÃ,d©1ÂbZŒF ÿ½Ïɺђ7÷68)Ш£»ªNFEFÆ»ZžJjm´$ÕHô¤­“ÉŠ˜É«ƒ˜¼qòŸ¤Q”„¦Y‰š¤×,‰–úÊy\¸W{’V*©‘¤°3ÉàÕ^JÒ« «ÔNJ“jR5©'eI½ŽPNn×Õ–tWñ³.¼‘jé o¦ª¸÷–T«R’ªu%¥©¶ãjMµ×A ÏŽ^°†xªSpu(þ6ÇzÂ’—µ®–äºÖUœÖºªÉd­ÉdÅý¸êÉÇâJq¡ÇŠW•ã*×ãYüjëÙ v}ñ\¹!ëjÅÿÆqPó¸j oo¤<3¾6W¬qv;®ŽÔÛqu¦Þxè£ϸ»B<\b|ÂjÚù~&ë OÃm=ÑÒhûa=q\iL£\l¦Y:ßÍKšº®º@qÖ³²ÁÕ¼¦ !²4 ÊÓÇUèP)bXÄ¡D ÖuhQÑÁp¨Q1ክ€t#»M¨˜kÏš‚ÜÈÞ¨®Ó‰Û ¯ü3I(¬¨ð}VÃyà+á0ˆØ€Õ¤XMúBèXMÆ ãÐ(ÿâ›D,¾6öZTx:l!t¬¦¾Þb¨ñÄj«á}Ö½XMç¤'õ!„!U× `lÝöÈ.ÙÁ:R9¬VAÆC’<êFI¾zõpùú??>¦Ë§ïß?}|¸|õó??®ßÿòýû?\>{úðÝㇷ¢¼»üéòçËçoeýòpùòñÛé­IÏjb¹@[¬ZxgSËà÷}š^½J—¯ÒåO_?¥Ëéw?~ó¯ÇŒø}úä“ü÷ÿsQgËjEsý2©ÇZšç”“˜àjf°Î’±AÁÌG’Î¥ž&Š1²Ã*×>²@—`/³ƒ‹:&Dsš,Šåf4ª-«R’ê\{ÏPô[\ØNYxæIªnYq ©4Fµ9ds6õ€Çyf¡£â'qa¥dZÐZK®øÉsKŸ]Mò‰ûQ³Ã±W™3‘)ƒ+ª<)å4Q`#î§–– ¶Ó|.£Q!’z“ ßi,F†c†uφ`ʪgEh)À†œÆN§!øÒ¡™žalqÅŸó,.Ê„V  ë%Û›r[À“dvØ{š>rCxF÷¥ÐLm“Öó4.«cU7tcŠ}AL¢Þa=oÊ¢mäB¡š[®œ¡¯t±•âg“y€äºH?f†SK®jní4Y`GÂfø¯åÇ`¼Â)ü’‹³¸@d¡Œ!'´±õY ×PÄÌg1QDQ™©eÄõ0›ž«Îžû¼)‰¾_7xçF7vÕM¡“µz3OÑ­f&ªð"y.®jã4Y`˜øÀ—e&`È7±R†&yÖ›²;OH…,˜fÀ‹BG‘eæÞH|òì7‚,/‹Ž€beK:Š(ùR6&<¹¨ž$ŠŠíoÆ´ÊÈât´0Ýk¹´Ó$ÍgªÇm#c:€Œ› ,$rž$p pO0ƒ áÄ,L¸xõ³Sz ž%37ø ™žœi¹)‡ù[¾Ho[G¶^Ò—éò·¿ÿ#ýž@‘Ý äWzþþç~xw¿~zÿqÁ¾f¾>§^µÛ.o><}ûÕ#L—7_¼N—¯ù˜Þýï;¿'—ÏöøþãO¬;-,¾ÚOO?øöqý­ûëãwßóÙÓ/iIÃ'¬Bo,ÑÀLã=ß|ó ¸¿ÊqÿèOX±ÈÖªa] Bƒ¨A<ßìA´ z#ˆy%j ×@®\¹r äÈ5k ×@¶@¶@¶@¶@¶@¶@¶@¶@¶@¶@ö@ö@ö@ö@ö@ö@ö@ö@ö@ö@nܹr äÈ-[ ·@nܹräÈ={ ÷@îܹräÈ#G @<yòäÈ#g Ï@ž<yò äÈ3g Ï+ò(% Bƒ¨AXD ¢1‚d d d d ä8VCYYYY9Îàˆ38â Ž8ƒ#Îàˆ38®gðÝ£I/Žl0á,¬œL¼­˜œÛíJÚÜgºÙ8ýÙéPaËKÛÈ‹úíJÚV.ZvVÑ=;{†Dd°–ޏwœ&Š & a¥LèR dÇ\!ÔT?‹ ¨ƒ®Þ6‚Á^C|CÓá Ç-‡®C"Û€Î#ÒÄé«c…¬hÞ,¤må¢1êf‡ºÈœl êf'¦#â9‹dæ:Ùò,åÈ” $H¤”Ó$¤OhPÉÁ~Е܅CËç1Ñ ?0!“JÁm`Js™·Ê*¹è̉Ás12y:;»wPÑyGFÞ¤³ù!HÙmH™eœ' X¸´ÆB&œ” ÿ`dÔëi’€ÜÙ–†Ý^¥]d°S8¥§Ÿ&‹«ív˜6„Âvûd'à¦,t§,ùÁ•{›ÙX*i’ NŒ#1ª­žÅŒ…"àw–2Xðd xõ6²Ý,¤í•…fh…ùVÀ¡8µAŽùi’¸†XŽ„tÅ+Ä‚$Œ­€Ó$Ñ4s”•¡dÑg®F®²¹)‹º×b±“íeql;æ®lŒ³¸ ABf,e.˹Jšàj@6zvYü·áG`á¶Šÿ6[n½ŸÅü¨á|K™,&ú€^@6à ››²°²`¹«ÂV¡¬{Côi­ŸÅg.K™Èv œ£¾Èy²@2” Ú1½®P6Ë ‘á§I‚9b C.49Á…読iÉÜÊ…ÔwZ Ës•˜YÆìÞ5ÙÊ»`m<šÐ"ØyÁ¬ÉV.jY¢ˆY±¾DqwÔd+ƒ¯<žGMØžšHÈîšì[æýyÔ„ºYk}Á¨‰¶\ ÎU{5¡gkð)wGM¶2o-^GMتkn/5ÙÊEgÁä×Q™œ.Ðû£&[™p¶Î±¨0¾„(ýÎù‚Qí;7„Þt>šH§7m÷GM¶2—aþ묉 ä^sjwgMör{É)ë¬ ¹˜,îÏšlå‚A‚íë¬ÉбÜ_0l¢cg.ÔsÝT?bnfhvóþ°ÉV.ÌÖ ‰a“¥«º;l²—‹±ú• +ntd°—¬sÞ6ÙÊ# Ä™ÊñŽv/˜4Ù«#+ÏÇuÒ„q†¼dÐDç^/ÆœCæXS¼ôbᨻ“&[¹hÐHĸ2xXéÆì:þroÔd+Æá5a–Ș÷þ¨ÉÞ9ª1j ™û£&º¹bþ´?÷m™J³ômwrÁi> stream xÚwTÓ}Û?RÂP i¦7ÍF‰twH£ä6ŒØÆ6¤Ké.%U¤[JIARiPQ:Þ÷ó<÷óÿŸó¾gçl¿«¯Ï÷ú\ßóϵÛ&ÂÊ((\…Ä ƒE@2@U}}m0‰‹€@bSÎ þ·ÀcÇ`(¤Ìx¨bàQ§ÁõQH Î=7 X–’ß”€b Э¿Q ÄáÔê p,€G…ÆcNÎ8b¿|0~ øÖ­›B¿ÂÊîp Aõ!8g¸;±" â4AÁpþ)øäœq8´Œ¨¨———Ä+‚Â8)ð ½8g 1 Çx€?! îð?ÐD<@Sgö·Áåˆó‚`à@¢Â ƒ#±Ä{H8H¬4ÑÖ¢áÈßÎz¿„€ÿ+ݟ蟉È_Á 历 ñ¤Ðájè‰à¼qB@Òá§#Ä ‹"ÆCЏ"Èÿvµ€ÿÞh}¸âžû[µqâ’(#ˆDKˆ€$~ëX „7Üá6sþM¦¿§A¬á†@Âo£°ˆŸ1 ú/q÷`®ÄËKœÙoK\Dܯñþ”áÄUûgêHÊáçNŠIJ!  R‚(I}ÀÄåu€{ÿâN[OòØ"Y…S¦ÓIr›#Š®ZÑÁ©Ó„‡Ö÷¯Êö ^¼ŒÅ7uBš ZÚÊ‹3õ˜Øo™þhŒk€ö˜.Kî0ÿ•óÑýQÐb´uDŠAúu]¹–C@¼WÝ|woÏ4}Ç«¨@ÏË߸Cqôê²=ìjçȨ̈Ÿ\ú‘S乑ÎàÕ¼¬´áÐù|Ž?ù Ò`ËyikÃæ_bÛMgûDÇhðgÂ!=zšQ%“›·é0•ÆEV×­°5oOCh½ž}ñ‘ÃU',D?9Ú>4ÿãžnжÕ`W0Ÿ~¼üiÉÒg¿žæOÇPÒÆ¿Ê“é—Ô™2ù×ýƒžtq»eMïñ…ŒZˆYI§:7™*Nß n °¤¿è‰H-5»$Zó©û|Á=‚Äé“í–ÞI²(d C4a¾jÚ7=ÿñÑ&XôM5,­"Z•àå¾°ç[æ½`£×íŽ*ð{Ahr—ü2ÿžþa4JÈ•ýt½528†Y¤1âú‹©ÅŽð]ÎÒX’bƒÜçG;Lo»PM$âÏâÀè£ ÂÉi:Ѐ®&P<»}EÖ|¸ÕIªûI' ©Â„ÐÙw…ÆÃ wePÿ‰±xíxƒcO‹à¦Æ%†[ô !ˆ{˃ú‰K†J´Î~—§ø^|ÀhÔ´ÿ(ºIy~§!'Ф‚môË…¦bù@*‘[O?enìˆ;±±ngÊ_â²j±ã:ƒž¡ì®|Sa7ÏŸ;êzÐw¾vËâ:×Ò¥Ú¬Œ×ó­5Ô] ¬apb>ϦƒØVƒW´ÁË#Z »j~»ß¨¦²â:ï$]júR]v¹[äT|‰² miÈÔyñµoqŽ)‚Þçåu'hfÅ rIüViIrผêÌbRò„—â¾úTxxÝqÜ9·t²¹IÌ×¶W‘ÆÛó­v1p¥²*R‚or\’B¤îV?ÿÃî´ •P“‡sXñÁG\s…l£¡ñéß} Tš¾ ;ÊÅõË ÓÇ]GàMÁ¡Iú‘s´Ÿ-j*ÅzѨLµãÌçd-Þ ½ŽïµªŽ¬¸lLÕ÷^¹¤÷Dú‹ Ó,-1­ÓSéfܤ—–ÓñèÊœŒ,­kæûÓµ×jd$žä™ÐNHÊ-y2Þ€é>˜—$ ^9o]Æ@¸è ¼šo42çÕ©ñè‚J-ƒc´téxCáïÆöãäÃ×jå¾¹èþx8ÂíZï¶7Ëc·ãÎmC—vkQ¸#(wùª+D¯ï>ëôaªéàm°Ï»ÀˬŒÈ܈‡cÙ“>PÓæþ&GÊÐ_r_øDè oð†·µz-³n-öÎí­™SP ¼<¹Tmšû¡õÕØ+}dAÆ™o؈nQG4®r°¿bf©¿äœ†[™´|ÔxýfÀ–.xÞñȯae(‘¿j݉)ï"÷ödh¾ì°¤!Ìq=Êx¯†àªfd ÅÉVu_ZsɯïÈr¥Y2`Ù“x1B)q˜¶3W5}æ¢,aï4fô¬¢’š¯ð“l_`¹ÑE3®`U4tõ­’ìA»*É-ø¯†_àÉÃØÃBÅæ Iä—Ô¦F»ÒóôÃŽ†T³ïH‹sŠï‚föãb\EãKyË$w/¼.>¬û@X!<§wÇüî3èg Ël«~н~&õQ×Ê€Êk–mz±-µ»ãÌRÊ÷2úanG¦Zì=ÈáS|Fܬ«ëì6D™|:3"Î5àkÃ,³I[Za#4Δò&±&jŽ™•jBEDo‘ÊviŸ[Ô $r¶˜}Õ%%s{ï(åí1ŸËATzùU<ÐÒ­à9š‚&¹&”ý¸SGy¿«u)ýšâWiÒœJf¯áG^UlÌ6_} SËÂyH)ÈÕÃæ ɵb"L÷;¦V0¤¼wÔ˜±rd‘'Õg`áçiúþ´”.ÁãYi­!E«µðÝkÑ,œÙ:í-~vŒÑ^l ‡‘ä^Þ}Sf¨žŸ¨Â€¤+Ãgæ}y#¯'†§7™$„ß`“Iz/ôÄÌŽIï¶b\MwïUÕÒý½1ÄæØÅI…¤Kô]ƒûáË–¿‹ ¼w¹aÑž¥¶.½Ž5⻕}­N#r®·?²þ”umR/AÖî>ÀÁ(YG›»¶1¹ýNßf&wcÕËûy:VÌñþŽãtd·„’ŸKU}¼j>Êñ÷Ò¼ÜxÊn"D¡~¤DE³=®<Ú9‡wã{°¨w®a÷2—‹lÓ,–áëçUê6–çîJÃLDZ¦Œ·b§ÔH , „'“Ç_EÓ–k­¡W˜/A´(9¯SYòO^Ó‰p«»˜Sød#¶ÁýA¦Iæz'Ã’x ]_BÀðöbÊ7ßÉZÜù|‡µsùR„ød›é¸ŽÓŠUeKÍ阸ý‰gî)‰ 2» onñ,cOäÓå;¸մԵò•b„¬±ïqÁ$a9)¸Æ­cÆþ%4}%’$§‘D{ƒiˆÃŽ?ënÚö¨œNý’ îbLòó[Õ¥¨¨NIºno=µ·­Ê©‘µ÷O: 9ÞSõ¢¾d:vy¯ˆ©ñ%?èGæVNŽgN!¦cž =Æ^lŸhŠ úx$‚™¥*'ãÜV·z*LVrR÷y÷ÒjPq ¡9yù¦”‚v}~˜»@å©hdì'™z¦]àøì{ÞM¶ìáð=) Ö>¿“ä›Þ˜ÀWÁ$‘3WÄ·öM¥òD˜ÞµéeCvW²kÁÂÎñK]ÎR÷¨¥Y»|å¿VÞ·Ýmic â6†S»ªY‘½ˆi‹Aû÷}+ýACi9 |"í®L˜Øý”IîÐb {})ÍŸ™r(¾¸=×´—r¥žEU³ðR@‚Á»œò‡s¾²@Ýó_¥èÚ”çöG»íí—Z\dDiH¯’Ü­zpvjVÈ#p$Åfýa»Vee!a2N®w}ùv47šÌåE@[ךW;.DQ<‹(Í×y6š]÷cØlVÐÙ÷ »z§1Ë%Äï Àú5NKuýüfï!gš(@maø²—ÚïX¼FV"÷¸Œ­e}ðÄ÷µˆO ¬<Ìíô0/œ¯ˆiò¾*Uªà×·ìõìwëOÑÜ@Þït"ÚjnõgñZ1î$üsWgóÅ)JpsÆËˆ 7n·ëµÕ4™€[kŸì„_ú¹úë )}úRòúbŸ¦|‡ísçëü®e jièHÜÖöê·æ™H\(í³á~húݨ¯.e‹Œ¦ÓMï. qC6ƒX§Ê°Ž‰Õyù¬Ý`®`T…àÊ}ª°þ•9ò€WêëaÐÍ(!ÕRívÞÐËËÚy]£©ä˜fë©Ú×Þœ}<6†£ì=ã1WÑŠŸGKË2ÇT®PV<o° ØC‡Žn»R> èQÎå¢ã›°Ñ_byOOKMǸ7købhÌ0©Âmfð^ž}§Ø– ©ÈBà>}Ðû2 ês5‰D?jVþFê\„ÁÒ„4‡ÛSè¼M8ujjè×Twå]U¼Ì»<_ÊfŸ”µ¨t+êZ*ÊZI/bšbcŒ£ùLKh-û‹UàÕ¾™l¨°úërHê¥)ôãL«äRY]ëf±Ä…çŸu½=ÄÛ æßØáŠ8^d¬Å¾ó²xÏÊë—_QS*kLÙ³ÇTÈäðqh)”ÀW'o÷ÏTÊ–íè~ÿ8ØÏÝ"sMø{þ‚òk…úÅfGOœ´cë•í°M¢¤)Ù‹á­Á´†ñꯟ§¸}šu¶Ö´‡žÛƒpJç§×qóÍnõØš‰_.óH¯ÝÝ\ÜV¥¸þü̳5ª~×唞$F15çhºO™c¤nER¤+ÓbÓÍ&«%VÒ\©èÖZ] cdX:%¹]°¿s N•7µ.Œ?ü Ê*Ú• MJ˜>q=]ö™£\JDe ä^~ô¶‹lñs´&}z éÍFWþw™‘¤#äÉkn˜IÀ›äµgñÙ ¤È“J!×’ký—Ô¨GnHË^¸ÿx«úlKΑc»^.ï¤úíI\uàŒâáêÆ{ÂyÙ;›„&Œ?ñŸVBY„(îMûöª”êÓ›šNRß°ÉЪÈßâÞ=ÿ½{ƒ™;C N*n÷¨ÇC»{-ˆš ^"»Úw)`Ø¢S¤ØÁ_󤞺0@M’?«^ª-ˆñF”Gš?ó¸×__ö<ñÝ8ú“S¾Á9/¼Íܸuæ4VÌÃýë©b¶È‡ÝÚ£=YŸÝ]Ó‰t¡m9¯<Ù¥›§lqݘïp˜÷~¥í¬.ßT^`oƒšÆ·ù]lüªýàøK†Ø Ké‹aäi§ëVÔå)€±xؽ|ƒ™q ëZÔ{-ÞB²ññŽÙã ŠRû\ ðé¾2Í‹3é®îNT¬{ýð¢zÁž›kT i$¸Ý/k̎Æ–1OÔúq¾\Õ]û kntã¹4ëBtvZ]¦Å«7+{ˆIÆ@“Ó^Ò.¯½»Q¤ÓmÿíM¢%¿±÷ælüZ,Y‡7µäȤsñ ªF5-–õœ P)¬ÆÿU“NÁ…ÅÐúÍÀr¦®g¼îLõ©†¬Ü³œw!?üÛ}·ž×ÍQÒ_Þ1Å´žr•m*w@×›ºóª—ÜJxÜ; tˆ?öS‚ÚmU ]ëÚ™­Eõß‘ÃûI××\oÌäìÄ+™äùêÐðŸíhY“³Q2ú %{š)ªÉñô%oÚägœäMzù-¾äãìšæ»núW $ué¦Ü«Úú{ ø(’ti& Q}ßòºÖ9òöR¬]¤q¸‹—¤]{9OV)å ‡I™9 ç‹9Ìႜ²ò3È5§îß'HÓÝ4Á yC+¹#\w—Þ*-RÕ¦FAôÂ_'_e¼Ñ[ ÷=NÝ–}äL£¹€Ó “ª¥ô†ûެ·ròÏy¼[¦ÓHÂQ'ææÉ{W4vRDM^üPh·Ò)–@w"˜R6lxk9TÙ¯Ÿù±5ÍÞ–VHÞÛ.úÕs3Š—ÚæKR…¹¨L.J+†(ZV£xCÇnõp¯–8ÑzÞÝ¢ÐîF<4 r–ìëÅO¯m?Oû¢øBº°ÍÂ":Y¦èëâ=ÊJ¼+x¥æ/LGˆRR†¶%£D÷á†Xi¼i’¶wû™nÖnj ÚÉí0ƒ=±† A¦çª¦\Ç$S,±GÉZ+‚\-Ð7—=ðÆÃrÝœ Þ4ò;™žáä?4ýÊï4|%ÀÒFwÊ…ù¤ßÝÍÇçøJôÒ“-œ¢žž;Å È‹Vжò‚5LýÔm¾7‰?ž+2áaçÕ¯ÇÇäÝQÍO¤†.ÖÆR+{]ÑÍì7Ù_ÄeRç©K-q¸Y`Âä(%Nô{íXmLÃÓüÿJõ,ã8V4Â\æCÞeç/$ÞE“ê+\Ó£#Þ©6%§ÏùJðï¡§'Í© 1«›ý{¥„ÜR烠‰«@ÞÂNÞ°¶³•Ñ"¥Q½­3ï ®v lt»%š{‹ïšf=»°Ç£%°RBM#Õr(™Ø1“f¤ðU„—ïmý±ã¨+ª¬¼o5ï‡+Ã<ÏøølðL [E/f § æ40ˆ ”Ø'Óõ– ø«…³ ¿àø•s’·Îß«­ÉÉV"•Aí²•t¯3ö-<¡¡ÉV^é”ñ6’¬·:žkpëŽk:mbBhê2âÓy³Ì‘‘¨ÁWa–/#¹×·®¿£˜oîÑ¥k~;Ë“µ±eÛÆ–1P›ãwhïjLzÕÀ :c-xØ®25¨ÑçÛUÐs9.üÄÕF€³Ë¢LÀRðéàÂÐIž$ˆx Zº B꜒f95*qÊíÙXƒF‘ÏêK±kò÷þ¢cŸå §3ô9ex¶W“Æ3ze´KÒÝW¡Ox[ð?Ûfg endstream endobj 6847 0 obj << /Length1 1406 /Length2 5979 /Length3 0 /Length 6938 /Filter /FlateDecode >> stream xÚxTSëÒ6Ò¤Wé¤×Ò{é½I B‚$t^¥7éÒA)ÒQª€tAŠ‚4i‚ˆ _ôxî½çþÿZß·²ÖÎ~gž™yŸwžÙÉÚœl†&‚ÊÎH'ˆɪz&V" D‰89Mah8äo;§9Ä C"dþ¡êqDcljŽh P‰îxÃ1@DBFDRDA é¿H/@ÍÑæ è wŠˆSééïsqEcêü} ð€yiiIßဲÄ vDzŽhWˆ¦"ؘ Á0Úÿ)xä\ÑhOaa___!G”ÒËEWð…¡]c âåq~Qô= ¨ q¦®0Ô_$íëè08 A 0!Þgˆ€©˜hëžÄ_`Ý¿ÀŸÃD„Dþ•îOô¯D0Äï`G0éáéˆð‡!\(  4t…Ð~hÀáü èG!1ñŽ>Ž0¸£ð{뎀†²àˆaø‡ ìóD£„P0ø/ŽÂ¿Ò`ŽYᬊôð€ Ð(¢_ûSƒyAÀ˜s÷þÓ\wÒø÷ C8CÑpöö6CÀîyC´Õþ`0&¢Û\ h@$-!!.@î?°«ð¯¦þžßÎßf ‡à@O¤'ÅЀàÌQ ÊÑ ½¼!ÁÿéøçŠHDp†Ñ€Ä† úwvŒýké¿Ì°aä'€~}þug‹Q˜3÷ÿ7üw‹…5ŒULM øÿPþ—SEé ŠJ‚Ò @DDD”‚ÿ™ç_'ð7ûßVCGØŸÝýGFm HÿEszñù£ ž?cà ü³‚>£gÀóoù߉ƒÀ˜‹Èÿy~‡üÿ´ÿ+Ëÿ*ÿÿÞ‘†7þÛÏóàÿñ;zÀàþ={£1³¡‡ÄLâ¿¡¿Zâ óöøo¯6Ú3#ÊŒÎEn nÿe‡¡4`~gCìú—–þn¦†€"Q°_ÏLô_>ÌèÝ1Ϧe¿]Ìdý³®:Œtþ5‚¢â€£——£?F˜•8(‚™Ugˆßo‰ÂB$`8P¤ѯƊ‰˜(¤/Eÿrý#=ØÛË 3¿u€©ý÷ú÷¸C ~0ÑÂ,éö,²ó¼^™ÑWps oeµ;.Åj VÍõöQ «.~®æô=ç'7GÎWEOÍ1òœûÝ}™¶œ¥U„ÆRXW9,þvüÒÂâŒdp™|·Nñ9Õˆ™ÌÁ׆;Ýbî2J²WlëéÇÒ«nÔ–µôà”Ÿ’³e1¢• »÷°X±q¬¢G¬î’'QzÙd{›j›M\a?€%©t&Ðó_·IÊyÿþUþàÀC±£¾:‰'ÑTôÔwØ GÓ†èiRóï›Ûª÷è-¡¯`5–¬éˆ“íÖW#½1‡HŽfšé°ˮܽþÝÔçÚâ§o(ÌùÔ%Ð :o‘=ö¼É…É3!ÆE…¸†Ýš²ÖJÒó“ìÉæbdŦoMu·°²õ ­d¢”CgÈI©Üª˜Ÿ.ÖJ¼~$Þ*Ÿ) º¿4yxMÍèS2yÃú £Þo×íRœ¼…E ìtŠº­]*ô¹ï o§ÀZöR.·U¬¦Ã%ç–‹T~˜…ØSUÞ¿[Müžôuë¤ùs‘¥rc¬5<.£g:dÝþñkæ.ëÁ$¦ì“Ÿúº¸3·ü´š/Nq©œF4e†Ø#Ëà5-ÉâíªïiâÌlu;OZ ¼z_C[N¾‹ØœÉÞÞó´ÛnÖÿìù½úžŠ@IÆ=%-¶þD/”K:—8Ö¨Ir~za¡ÏÊlœ«žqT¾ŸÓ–<ƒ}ò+c=Ϊñ“önˆ.¶±«ÈSB§/åO&‚ùcà$ªç¶@yÙR/A$“tÁ¸™¯··ÏÚ|Wdó-Dz<± 1®ýh[í½AþV©Sm0<Ħ}#áÙ̳ï[7¿Sü°GÏXÈæô¼þ’=ä­Äs«Í÷º‚jæ†Ù£üÀ õ¯_‚Å65*á8™ÝÇR~¸µŒø¥Óè4- åÊÞ'k²l‹æË“?HTÛG¨#Ì‘—|Ú ?¥)ö6f°Êfä7ȾSˆ\¯¨é¾Ë^ó­%3—nÊxÿº±jæ|n¾‘š+=錒½@áíh>Y—;%m¢¾¥¬}nh‡]ݘã»KUî¬=¬àÎ>‹ðûžÂ?öÉdÄÌP»¨3^5†bˆ">³ªë,Þþäó2y¦¸íû©³ƒMì®fzŠ'{Š«éž|s‘’>¤oéä— EPÁëšdéJ¥úiâv‡b™q¦›RÐöh€Áߨ<&¢Í€7²‰¤$9óqš“4Š0R“¸ô"Í8à1Õñ1t'0fÒŽBÍõ݉ÜFI`NΚJæèî\ðÅ‹Á…B”(”[õØy­Þ~èéÌS%[0‹Tz‚AòwýÇk:±—·Ý äéöÔ(Í™i•ïàï ‘ê–é>ºc¿Éá#•$¸‡c³È†÷éìâùøüöÌ]dG¸Ý[Žç\ ›ÇG¶RðÌäç¨6®ÈÈ—Â)kkv¼¹l¦›ý¡Ž$ÇØ«µ “«´a]&ìŲÉÛ™—ÞvX&qDÊâG9*òK%>ˆ¥Óu‚'9É ìQSgUT¶Âxc‚!Á±SƒÃJE3Yü˜ra¤×®ªÀŽãžˆá¥õ¦™³Õ$úUáXŸ]9Qߪw ¬¶·«ú¥´á›µæ‹ãC=ŽU¹¶'ÛŠ³ÄØûGNèbxz¶+¹DêOƒXŸ^û <ã×Ò)&€Žá>›‘çáËƳ6/‰³Î—²eÖYÛ=ƒ>ó,ÒîÄþI´ÍZiþž² jÃo×t7ú}‘üI™CãHÛÚ÷yNšªŠìœáA÷e¾lÛ Yc‰£eƆÛŸ·ÉüìzÃ;Ü•¤~k~»Ì™»¶o³‡Q°­…ø•(–0ãÀù%)8f¡‡1aþ±ÇhTõ%C‰.©ÔÄ‹“…Dðèqó’z»6>OW«ìM»Î»“ã–BÞì¯ø÷ ùß.­ü3Æ:ÊŠò®QÙë½N¸rTjÄQšã]1rŸäO4LžV¡M*‡KÉœß7XÒàRñDXEDõŸ¹ë[4[½Ø×˜—ÛV nÌÚqo\êÃ_1ÞçYœ°ç$a+_^}òˆìÀJ'ÛyD g^}ªºMo´ÙNó$²Ø¿€*(=yч•ò3ÿý”Ò"–þ õfpÒ›g 8izƒ{o…Ÿœ2Óî¡ç£p.µ ¹Ñ †ªM;>ú[ìšÁÄåŸHð‹ m›EŠ•éR^$dðmÕól´™Ï~Y‰×¬¬…K†ë@-¨–½Šì÷å¿k²rWß¶ÔÊyznöe6D¦~ר²0­ÛgÔ§veð¶ Ù·Uú¾gK<ƒµÉEë±òÐjL-Alã«UúùV匶—]hxwøÖU± –i˜j\¯„9Ê0ޝéR•\-ïÆòu_Œ¹Ér®%Â+IP™ cOœìûÎbžÿÖTÓg®롤Œ 8Þ’ê)Spþéæoš›Ö×lî1ôñá*ý½Š×.ª#ô©Ç©Ÿç_´ç^“¸Þ±i«º"ܾߞ:}½ÉÌ·ÿP:aÐkbVûA1Ò­Îl_ç”ÊÏ­¸]ˆPoìœßI¤~îÙâ>í<¸šîg#k±°³CAò¤ó¨‹[nÒªk"øIDøœ4¡H2,O]üÖCç˜/¥È¤¬@[ÕjŽ8„.l“±|‘íX3×ÝâßêÛ+{‚<’JÐñ5ryŸè™Ï'bGE.4[0Þ»×@¬kwÿäÕÏËsj¸ã8‰-'õ'!ör‡”Ž*û§FÏaL! ž/N’XFðñQiØâþB–É8LÓcOy¿|d*1-ÞÇ*?uÑ)*q¯©yïö>¤¦„€  «Ö|ʼÊz/îyòžc•…Ñg@äÌÍ;ÏÚæ-KJzÅÐÚþ þîÇB¸3·âlÒo•2G¨ÝRžæéY§ÁWSùµa9Ûç³—ÁŒó8Bq£”b*ÁWÇøÉRæk÷–ÂPg® ߨ².3{,‘¦O:Ë1ÍM–Ÿ9¦CÈ;¹¨œæÒW¯Ã·f©Ó‹½dÞ°`}üZ™y‘—qp:q£qÖ´3ƒ¢/'eIw|…ôÎÞç£;5Xå•Mù¡ J®à]«h/Ûêe³˜‹ <¬¬[xßÄÍ#÷ Sfñ»÷ ÂÏ.§ƒä&äbþÏôŠöám£r¥¿T°$ol¦ó1ó»x*‡ Ô ¼”r«§P—Ìû:Kœö9«®ùá<yˆÐްF%#ãpÛ(¨$ mœ¿Ú-ÄÎä !ve ï!5 }Ù˜óð<:¸ƒlRªoXË ûi¸«<"V±fD³Ó£Âb~rŸãPZ½¤6ÅMžè­"P³]è{½ÎžL\ì¬LãÀe¦§ñvJÎöFÞ'åÊÊÕ®{Ï&GÉXW^,OÝnÆg‰)M™<yj½ù†°öX`Îd Hâd½ó:Ó#¯Ò ›Ô÷/}>w67|O¤;é ñ;ÓäøYÄY¶;!\Ü6~ãuÆóJºwÝc9àú†ÜÔpù›O^BÙè®±òvU á oùâõÇKµó(-,<È ·v)õési{<,|ÿXÁ’í•G&äˈÒ8œ–Ôâ'û´¹ªÖöyÔwºÙÔërþçùúÞ$Žø»e•]B僟±ÑúMeý±pÑgä­îÊÚ¶1¼tzçd!-&%Ze- šÂñðr’g¹*ùì’˜‡R¹/ÁJXdk7/¹žÉ­Œ”><ëf™bد§ü¹»PÍŸ&}Ú"W|ߟÛãJ.Çl'Lړ;»Â¨sñëw¹~žfÓçÕëÙ ¤Ø•c/Ül›(Çb– wŠÔöCåõÏ£®u9!H˜ïÑ9Yñ(°/Hñm?ès¯ô;G®ÅŸc½Bã´Ö{I’Õ|×ÚÎmKC‰»Shöœª§ÑŒ”õ=ð [ _Í¡â 1_Ýre@矸s¸»sØÞÞ«£Á=C[‹/êÈ;Tq-²”ŽF¿‹œ>ôd…Õ=J7ú˜‡ë´ZI#ìy|­ùø“iú½n))\û³Êi=ˆ=*£7ø?K«¯|¶AO-ºè0%=æ¸àx&OÍð!üm¾â®³’˜—ÜV¬š!‹tw–i‹“O/X‹©!g§¬PVÕùñjöõa/Ï.úzj·«" òžXpй¯É}¶¦z7«Ý“÷ ï)Þ|{Ö\ŠÞ†Yž¶‹¼²æzzíDÍ‘$÷}¸ZêFÎTW6Åô±Zt­Q¾¦†Þ©´¨Îö‰úsÃÂü‚OªŠÍ*`þõ~EâañòX.¸ô‰e›¡Â$Âå„P[cKF±1Ÿ‚gbf0$uUõ°)ûPc ©ænqá^VRÕ…=jYÇñ쀹œ6ŸŒ¦WάâÙ[ý%)]¤³Ûê-©yŒqÎ-F†/YShnËLgi~uɆCý <‚ç©ÀÛ£¶áúƒ_È ;Þ&Ñ”93øÐ?°ÂŽÆ³Ê:ýÁê‹ô¤:ÙÉaËQï7,ÔPDÞœèw3$“^;zž÷Ò%]%¾ a|`Áð éDVÅÎ(Ù *]ì[ŸÊ ±ÆoDÇóíAÒÝŸEöxoˆX³9^¬8„ JÓ ÷—mê5BB ç_ ïN×7_c!ÿäºc_îtØCxµÓ±[c¿+*7u>–5ÈKþ ÍÔ[]o3‘ßK§øG•R)§^ªvøò º¼yÞ/"zö.C›°ÓúTß‘ž¹ÍHüç8¿»ö¦¨…´4+¸ê9@>yÞßr"†Ži©ùÙ^ìV]ÞÄ^Ñôñä eލhh؆fF7Þµ;ÉŠ’¦‘w).éN³ò#ýg¾VÚ],Z¿ñ TÊo¿L«PNC‡b}#fþúؾkÅ6k‰É›QXËS®&‚֔ɤ8ãwnr?¯?‘¯Üxç«¿YÐ诖‰ã87_1܈ôí³ŸŒSųé,‹ÅM޲ÛmN}s¹÷CÔUä‘õd—ÿ1¿Ês×DíϪŽî…­Ç|û²ç@9BPá™–غR©-A§š¥s¥Š#ì[_àA_ónÄä ÇS£ï,Sªº'%Ç©­´~Ù¾„ºË™£4Z—ó®s‘ÜgÜPOW‹j‘uÀ% öùÎyκXgj³žÃ³ýÁŽg×|hÆà–¸Rƒéˆöñ›•ñv6J¥õ¶ö·§~fêÌž^ý؉ë¥A´í<¼Îï·„ïѺ„å3Uò5|ú—1Ð<%_[h¹yÎh¯ÍnÈý½o;,vdÊb>µ„Cky>ÓuL-¢×|ˆ‰.6M[—/FA ï©næ]³É ðŸH›åÀ…ˆÔ.¹ÏŠ?t6VþäÀ3¥˜"ÝßB¡ç0vCá"µnË_éãÀÏ6³Õ ‚߯ú´d‡ÀY‡rþ*N’Up6.¿äöÃëJU1o>g:ã.uyoìÞÅêÃþÈžrÆí}0Dæ°$öÔ”H××ùØnöiÆMÞÙÁÀçÉmõs¢äÆ•½Md~¯¶÷XcN|U\&S×:¯L®: óØßVÃóœOdÛ²µýg謹½þrt7ÎÓ«Ò]ø¹žR/„ëÅ#±ÌlxßHÚäìc?'sØ>ï¶°§ñÐùò‹jö›¢ÍÞDÙê4ñsþþ…zT…õ7uC[Å×ì[N±FÏNëMà”En§@ =C¾=ùrèÚ}N!*€»úÔÅñ‘[—ëg´ê»øësÑi y=:$/µ`Øðù‡R™i³Ñ©V…a‘Ø·¯ÒÙÉzŒ,ÚE\}J½Ígð½]ÜzìΨ±âº\y7??A•üiW~O’2ÃêfNÓéù«Ã]eqĈöŠF|¦p¾âåëøœU[G”P“>ßÖ3ÓöF`J:åçX‹¢¼)Ë4Ãöm€¥ÖåÚ#¯ê#ç÷ú~èþ Wµå‚<ê^ûÊÞm¢1ÿ/LT«Ùü; ŠH\gÙК§L-\…X¯j” ´ûÜ)ÎOþ¾~yôâ=ý‰å3‚o¦àT8õþ?²/ˆÏM(¯Ó[ÛI[‚ß~½ ùXOyTp:#&_½é.‘´,Üëf‰£vµ?öm ú56¤a Dæ—½ž¸n£W«êÑV(qw%ÏMt^¥å\['žú’½ŽÂcþqßËÇÖlU†Ew‰#ý6Héì;îDÍ4 ¤WÄWÇkÜ ¯¼Ü-{eI Ìç { ¶³vƒçá»*rÂ^†tD„9¬K¥GJå+„ºSží-:1xjt  e¯ÈWÜÙÝèúlÚbºÓtò>5ëØ©Qûkq…’‚‹ mTIDÕøtIËÙ¥'3I£Ë»Qþ[Ò¼­JЀïƒV_ÛuŠ8˜ Yó©ü#ÒI9~ ðൗ‘ï5ò¢Ž¤è¿WþA¶v¹ endstream endobj 6849 0 obj << /Length1 1624 /Length2 9955 /Length3 0 /Length 10791 /Filter /FlateDecode >> stream xÚ­tUTœë²-î$HÐÆÝÝÝÝ‚; 44ÞÜÝ]ƒ…àîÁÝ%Xw w¿d­»Ï>cÝótî~èÕ¬š¥_Q“«i2‹[:še Ìì,l½¹›«²£ƒ³„#ØRÕ ¼Ü(ÔÔ’.@3ÈÑAÊ è-R@ €ŸŸ… éèäé²¶è´5tè™þ­ùc0÷üòêé ²vм~¸ÁŽNö@È+ÅÿÚQ@l€+TUÓ“W‘Ðɪhd@30@Ííµ €Èèà ¤X9ºÀ GKПÒ\Y^¹Ä]fW' èÕ èatú1œ€.ö W××oÈ`íbæyíÄr°»YþIàUoåøWBN.ޝö¯Ø+™š£+ÄÕÂä¼FU“’ù;OˆäOlWÐ+ p´zµ´t´pûSÒ_Ø+Í+ 19¸ @ÈŸXæ@€%ÈÕ læùû•ÌÉôWn® ëgÀpZ›¹X‚®®¯4¯Üºóï:ÿ­z3''°ç_ÞŽYýW ˆ+lÅ‚ÂÎñÓòÛä€ÂúgYä¬ìlë-Ýœþ…¹]þjÝŸ¡MÂÌÒÑì °Z¡°ª8B^CèþwSfùÏ ù?0âÿÈ€ÿ#ãýÿî?gôßñÿï{þ'µŒ¬bfÿºÀë•q(þÜÀŸCãìü|ÌìA`ÏÿÁ럆:À¿3ýCöOLböÚqëב0³s°°ý­¹Ê€<€–j ˆ… ÀÊ üÚ­¿ôÚ–@0Èø:Õ¿úêÄÆöLËdaçð§ýÜC@Ëæþ:¨¿2gU‘ÓVx/Åø?ÝÖ¿,Õ^w¢åéüß0:ÊŽ–ÿ%üá‘pôx3ó°˜9xù|\l>^vßÿ!â_4ìÿ–•Í . € ;àõÿ_¿KFÿ ‘v°p´ü³3š3Ë×5û/ÅØÂÍÅåuº½ü×¢ÿ%ÿµð@ Ðeợ…`ˆmFv&¤?ohBÊ ¯‡v(Ô©¤Aëó§€jÇnÿŒˆuþ ÓÇšP–Æ)çVÏoNOÛ ;#=x`Úî4àq±/%}ï'¬šv^Æ VãôÌCï“y¥58}¶÷;êÆÅ$Síœ.H'7ô”îŸÞR];aøY¤×Çãv`6Ba×Ò$ïß\ÓŒ vŸÁ÷n1æÆ#S šáû¥§@D½öù&ìOà¢Z³ß^B“Á*Á&•7£IS.<½ì²;??Ç´~Žhù1á·*AVJ±¼ÕRÅÐ!ˆ¿±lÕ<â´O* ($®5$èv,czˆ}¡EÍõíôÜâ^ ÕÁ¶&¥A½Y;P½ ð“’…ñË<Æf^W"^[µŠ¸´ÛíÜôÏK4ÿψ‰t¹üRåIP*±ïP.žï6ó±ô_bö~ú˜¦ƒ0$¹yÉŠ(ÛV9 ÷vå’Ð/^2Ä8Îsyö¿ŽrÔ0/Ò}gÔëx0CÒЗô—LÜË ÿ<±8÷–縉f(¸?‰âS–€8þŠƒX˜Ï¸ýe*£shÆiá‚‹wRL~‰Ïo–bé#Qò'ÁÑ+d&?F4N¹%¥üýj{ xÓÁ°>W#tìõ #ïÒÁ šœÑ{R¿cÓɹhTÆ~^Ã)½If:^è²ÿ÷ì‘d—.¥¾åù<+ãì¦GzæUÄ<|ÛŒšì‚wÑeåPÙ%M ·#—k±0\²7d‘Rç* 0ka%¥d"Í‹ÿ\­òT[¡'^E‘,Eȸ·×ì’`ì%AqdοŅK)Z3)>UŠ@údÞXpHÑÒSÃ:}ËD_hK§¤P ¥ ?màR`FEÐ×JgË×k„!ÞÔgÙ;€m.G,þˆ5÷®æ’¶ïq¦AfÅ=L2³¤ÃC%X‹±ß˜a*v™œÇ!Ûä·ds/J]s]èEfü„nÆoó³O#“íª ½ì…Ñ$™ ÝÚLL÷C ϳïÑÚ9KÍYd`Q|Vû æXnÐ^;B0ì4©ï\|>î~•J=‘uK©²‰¼_¬Ôü)ŒŠJh|»-,å5á‡ß͈Ïkó›UˆÒæGl·=ã633îÍŽ ƒ_¢oHNz™Ñ;ÂÖ©X¨@¨ êD÷…Ÿí¨Ù´ %¹Uú¸“oÝ)O?—n#™J‚0‰fì¿” øÉÜ ç?—ßÿèÄ1â±³z‹ìàü S&žQ’.YSî¹ÒVF‰&Èô]«²´çB£^ÿT´­M+®Ùo&VÒ‹áKŒÓ q¿wÐOÔ‹ÛXÃñü¨Yk_C=bYnŠùÍÇóÉ.6@C oë–gß[©‘-È.JÍ%9ƒ)19N¹M^æw…ŠÚýŽÜýýÖ›n 58ÅÀ~GÙÇß,_1WúDó™½/§'›³#{E¡¾Ö«ï#hØÄD`Py§-œ-÷ àF^fÇy©ÌˆøM%s”ö«Z,ggH󎈞½{ôá;Y׃FrK¿Ž‹ü%~Í#("Lèù^ X¿Œ:¹º-R†‡®ÿ’•ƪW ]E›Ì$´b/[j··‚y¨X1MÒ®½]©ŒÞÈmçYPÑÈ+†ùô5ø—È$ض¢>²Ã Õø*Ø $\7ËKÜÁõ;lv,q‹âíJ¨_À`²¶ ¦z .v'¡=/\GûÆËmÎgÂZÎèÊ‚‚ ϳŒŠbÊ0mZÊš¦MþV:†HGŒô¦òÒ϶õþê)v¢÷‡éèfSx‡û0¤^òͨÈßÐ{’Gw“iŒƒ¢¤p¤ U~Æ؉¯+²“âüŠà{ÂßYw¦Z©$~ÁsÁ~`&£½2¶^Š‚!ã }C¨Õ%×o¾aÉuˆUQeåcØÇ~h0ÅK3zw»„Ì÷¨Ö[yëU;ªÎÑ¡89aþ†Ú„XâÖ¡Jœ‰¯h2ù¢ýZ ló!›þH‚ˆä/º”Ù¥}ÔäÇ‚0ÁzE¯å«B«®Jø#}zª÷x`ù¥&F ³õ²0|:†'Д‚å˜\˜:‘½&à‹Æ´à ZÖM™=λ~ùÊs\l’¯ˆxfÄSOXWƒ§o¦>™Ô Ù}ut¢|’Ì&*:­?ÊÄÃqi>x?q«½Úè¼®ƒàgRQòSý;íGÉ@•%ª ÄÀÚ`””™äð‹CÖ<‰I¼àÏÄLfŸé·–ÑÃ% e›kH>¯ mنɕ(ϰ4Àµ¶a£Ç6ÉyæËðF4›ýþ ‡(ÇM'RÚæÕ'Ì#íÿþ6Š8žöøiù-7çé.õ¬o4?ÜCÚ$¿¦ví¦50އ'YÀtPë ª¾OðWË%WiÝüÆT ÖsoPò`Žuh çÝ x‹Ô?ëŠ# é..¼”øjmÅA`R3>Ûf6äÙ1ˆ8÷S ;óP %¥¼ M9u=ºãmŒu1îit¸êáEÑô§“|øk—› pïÔéL܇~ÏørFø(™?õçò’#L¢™t|GÜ=]Aå¢ü,cìÁDíiXW2#¾!’íœj¦OÞ;dû¢:ýÏwÇ £Ïq†Œ0d× Óë2_3^¦ÎƒÏìii0¢™—%Æ¡ÑÚ×3ØoôÔ.­ºy,o`Œ«ò¡ßã^çh­Ü¥4ªî(o,J/ör+¿õW“ï¯ï¬àl¦¿S»ú ­GQ¢ˆYf5Cé:ßÙOÆÒ;ïm@¶>þºó*Ÿ0êXÿÊ_H‰‡ä.aa ¥œ¥¯¸n¦‰|\Ö\SNøÓÈe›}!.õðéŽëäÓ!X’AXgQή´WÓ!¯ÃÞÉ·œíöIô÷<½¤dö=oäQ¥ç„ ¦ÜxFÁõ[Ř!ÍIC–vAò•Üê¨W8·alU•l1;kSIujX·~Óãp;Â!á•+¹YÏ‚©®cǃM…g ÉÐÚÞ:¸:U¹{mV#Ë£tÀ~*¦Êv£üÊ~‚ý»òØ„8Tµ½‹ŽÄë|æØ‹…ùÃl¥,/Øsjjfõ™Êâ'„ÅÏ%ÙҦ쾟߷óà0óV‚Re÷Ó½Šƒ—o+Ú¿¥™ 8„‹4|g ïgQO>½]øQhêm´ºA‡†óőқw/-Ç&HS½oByÎŽÉÑÏøª®ÆÄp׫–>’5<)Þ€…× ŽåxK‡s@·E”!BÍ^l‘ã´VLœï"šY2§žŒ®,0n2OEvŒPˆò(õžð²`5•[©ÞJtTÊ¡bl¾ÿfK†žBÛ€¾ÄQuS¾vs ˜ ¿ÁÁý%cyÙä‹t?;â›j_œç9;ë<*÷ü9°zxpŒ“Ø 3’®÷®ô®³ýžµ‰Ÿ¯ÓRp¡vOâøŸ:k\f=Ú•°.J’h™¡%u¤‰W™pfÜ€,9Í]Û£Î/(|“Z²¡˜ÝP´ =æ\Z½ÂŠEMàîþ¢³}Àfx}òí/D¢´ÂpÈâ¥{>J¦½ç·z¹ó@F®dëÃ[a?2N£wê¦$UM§_½¢(Vd£„ª×g%¹Œêt¨¿Jn¨Eý£ä'æzïî²T«¡)t›$ªbž 6ƒ®0@áQ®Ûû¯Ççð#/ŒË“ò£rkØ‚ogWú„ä€ðˆšJH©Žm|!´!r7¬ÃYïÒŒ“õA~tV‡ðÁ‚ºΓEZçù ¸#·ËtÕüí)bÖÐA[Ãaö†è––Ÿ½ˆ†ß™Q“Ë‘K«9¸~“x|f4g$¢$ÄãÂÊVJhù+¢]dwϵ"¨S¼‹Î—l —rΕ0?«/¼YÏÎN#¢H`;ßL%@.!¸zhð!cšÁ  [œ3ߨã$x¹™ŸìÙˆö¼vÉ«²À:ôR¥”Ô•ªŠGަű öŠG¼½¥´hÿ…éö~FÌ*Â\ÄfÜÕ `c4)õ7§F%{V)Î_Ï9³h8{xõ^[2 †â2a)Ô ¢ÙÀÈzâ¨Ô‰†™¬¶Êôôã§-áHì†ä›áí|ø?ûߟ¯Ít[ b&¹™·’ýàKÕSôŒŒ† °¬¾JtYiÚ‚Kv¸…ÇáE1nò†ïÏÚ]otãéÁ:l{ Næ‚…æõ5``\ì™_µ"òn÷8É fµ1- 5iÓ ëKµê€Ÿ‹ã}5.‚°ÉÂΞ¥ßJôŠ„¹Ïç}G…B:òT ˜Iýåº0›gUÈO'mKT‡~ ¿ü}p ÛXϾçµI£›S'jmèŽeG!*]é¶ÄW>$ªõdoõfx0±D‰ŠÖ[MëTõ3#'®Ót\$«ECè«›cWqN﬉Xüaûß̦£J‘²  —ê¦M3¥½p„šrf9Û-à#÷ê&~})†~À QØæt=œŽçþ@Mú±:w³q8YJ¹©ðS"¹ð>hlŒ#L2çMØ‘L+:dû½ùº±a}Çýí.óÆzåú&â•!Ó'åíÇsØAD‰ëýeÅŸN‰Bòéô~UOß”ôÛÊ×s†«º+Mà „¿j\âýÜ‘<ì|¹¬¹£7 Ëý|8ö‹}±S#QJ?Ë ¢ýó¦ft “ä¹á%¾ÐpÓ·Ši…äyõbAwݘé47/w$Q½Æc´bÁ”ÜP>ü`’­‰%8û Ùá;fŒJ‚‹Tû¢¼[ ‰3.uYõ‚i°-h­Ú°&©UüPûfð¢ÙµWNý…ÜÉÌ\m‰x–í#!¶0‚:qÇŒÛHœ¤’±¨ÀojߟªnÖ÷¬8ÌŠ(ø½‰ÁðUÙ¤-Np‡•7ÏMówíBæöâwy£úGHë…6×j¶¯ÕºTiê2FÐSHbµ•­'KX·:`ü™ª}éêIrn‚o˜MÉè„õ÷QDúK Œî°”1›ø”£³1i–SrР:9‡>n ¤G7ˆwá\ÓwÁ¨TŽ\…s¾á…Í”¶ìDžÀ²o¥Ž¢×’EuãìÝ­©ÁáˆÖwZy—FŠÖ‹«TĦALÊCv¨)ÙߢÎB?»˜ åÚQݸ åíä85 àTãôÐŒ žóìžE83¡a;v Û}OÑc\ Æ,Š^¾Qg:ê™ÍdØž øš°Ì_ÞÛ•V±iö©èJÃèH¨OùÀŽåh‹V9dò^´vÔ8È´9“rŸB9iK–F³Ž@O¾º½§õŠpxóí£L²cwvS6´QôOÃ9¦”<áTÁÉ€JÍ÷Z©EéÁn:<þKo´K ‡¶'ßÖÑ'j_?ûRßø …ßô:++¾jåLŠüÀì#¢êÀ%ÈËfz,b5Afù†7¯RïÏìY b>ôØë¢&£%âýûû„L‘‚¯fñ‡:ÊŸ‘±”–ûDÄ¦Ë SÅP¬óÀ:,Æî$Í8RŒºS(B<5kpÄ_ª9Ì$s¬'}.±P-Ù~C]=•ò(aÒ™[–cÍ;tìƒþy†"Ï‹ê~&Ê:oÀEK$¸Á€6[û:èœ$tgw×ë §¢ÈA)!9êÖXË,}˜-„ìȲÁ? ZÕwéc µÙKj½åeéq†)VªjXfæè·{+I©ë›êº_f2.ÓRg~¿i {ÅE]øQ6+3Ж©«p¤?8…$u·ð‹»‘œüó-M¬±Þ6­£EywÇÉA/rÃóQÑŽ§áÑœ>êÁÍaãef n¼Š`s 1ÒÑèäFß±žN³³ºæ¸Î'çîÞáqhGf9w?ŒÚÓ&¯{éÎ.“IÖ[†åã=] **º¸Å2Ý|ÃËJáwL “øïYzÛyQåšÁ³ÒI¤ 5{˜ÙýߥZ,F ù$åûR ® iX{Š–ªGEÚµuîgRå~Á‹Â n+–’pª¡'ºE¬'»îqá±O2ÛÕcÍ,½ZŠ´/“±z/Þ“i‚ܾú¢%¨²«+.^ÉUéUõ轊ÞöLß5RexÎòãpöå€êqe2¯ÝeYŽiÅÑjc³aÒ²!‹/òd§>í…c>¢ä ?Ö]H² ¸vGj+1ܪÃd<ucÖW#»vvŠ+=Ä4REÔ>~_Seˆh¶Ëžx{®¿`gßœ¸ÌSˆÒF}ßÕ¥E1æ ©ôÄíósÚ;ŸXÅé–ðÄi?Ô¹Ò7bC§èS¡kÉöl¹qJô”úMÄÌPÏï´˜7=¨µ šÃɹ®©ÙañóÞW›üšÉ08‘ç…nDeà¢jU‡7“]_¢HJÎhÃÊ?w™0;PÉw,M1<™ûªYE(P.V2ª¡ò¦åY?íØqÙ:¯gú¤[ïZÇ1Öo–¤(R—mIžq6¦†ÏbE1\ü °ßÇß/¡¦g·^ [8´ýD̓ ­zHî©•¶¾æ,îòRì} ÷FzØ`° Nˆ IÖ;!CçáöšÄ×§Wk†2â.…w4Ha–.0C½,ó [ì@ðU5ÝMµãÎ=dNyQ(lÍøïøÄ»£˜ðüOôúéêS" `¦ûÆÚ›Îà¾ÃË3é=w'@øC&†(•ôv~j•¸r¹^H˜UÚ£™Ð‘ƒÀî£x\ŽÐ6ó)šºéÓr¼ÜÜ”û¹-‰) ù ¹v‚~ÔNéhXšÀþ¤Ž‡÷•};¸ö"ô%KYvb)*WøŒhgCä'4:ùº8±j¸ùë=,™.šÙZÓ> <$JëJhåúÃð¦Ü@Ný—q«¦™s‡i¬ÎLuÎÕæUŽŸ1A=CÚÆŒÈ*Ü:!{¨É»/TÓ·B^l»-^ü¿ Kï­5-Œ‚ÎgW*³ ¾|£Aï€ÌHëØœ°Ÿ\µ¡ü¿7 4-ä/8À"ÁlWé÷v¿‰ŸD‚UÚZ84Zû„øî/’K‚Œ÷Š¡Xê+ù¾íÍ×}ã‡=Þ§}ë¼|Z1«Ïþ`ÒkoßBÌ}K™zfÔ¥?òcO…âÓjñpˆ›ü ÁJRT&¼·4 ßìŠëêª!')nÏc˜´;ш±® e•ÃHpˆ‚JßURÃ2Wjïoær¤Ä*ë“„ÜZ' £ˆÒÉÜm˜¿g}{{ˆ× íÑÙŸû«îøÓï§!±tO?‰Ëi©H1çDkå6Ý d²ž6-:\žd›y€Êsâdiçµ7SÃjÛÌú9©gX wÑk"·ËwŠVüå¤iÒ{ØY¡Z(V$Nжë±!ƒX´=ò‹JQÖûou5`Õšö숚SŸ Ñ&ÒsÜc4™oÛÏ,07”mñ§èªW ‚&L—“- ­*¬i± 8„£³¨Y÷‡Õ,Ž´l)Œ¡æS£Ñ¼, <Á†dK)7¹w@[NuÒò…¼£C¯T)ºVkM˜ÛüZ•Ó^›ex`rü˜±>ý¨$‚ç^£îN,Ž˜(‘õæMÀœØ×ÖÌtîú%SÜ[;¦Ì~($ˆÚ¾£BÆq¹3»;CÛWÑ£í;hžU©™ä÷,@ ÛáG$b“y0#ç±böòŒD&w§LÀV ïg#¥’0PÌâ1*…ŒW4=|ÊË^€4W^wïËTëÞ|/fØb²µ[ïÃWň=5€ Û]SåЕ0—«Õ3wF=K|Ë‚ÕRÁ,Ÿ·ê`²S†N’5‹žÃCzmIƒÈS;±³sWk&¦æ¶êý¶o†¡v¬‰×¢Ç禭K!߉qmä?8Ê1åIÉ6$SHl%%×z\Ñ“V…Û)ëúò}Ö¬cšU´FÇË®ï™WM§º²+àC¹P—²ÊÇíCó°åcHóNPè–uðTëjìýM·DKt%‡QÔ~´¿ïp·5ƒ+Ò}N®/o¸©EÁ½ÛÅ'õúp篂DŒ,²™ ý–ÅÚKåð»BßîØ¯cÖa¬/§\¤m 6ÓÙHs›wPZÖçù½UÓ>î!ééHVQi\?5—„%ÑJkþo\ƒ|.&.!Ù6/SAyÄO¾É²6J‚T­Ð}N=ß–ÝÎË„‚Ý‘3¶L£’kào‡ëLÇBÍÉ·°µhØc+xDDú…‡±E…íM‹äbÖ‚+mŒÁzé^¿MQóÞ]™¢§åKmU~7]á™Û!R }íMÀjûâ2ËÆŽB¦ñþI©Tõ8J9ªò^ƒžgÑF\ÝÞÌÞmV®š0’ì–Ñpº¬þ4¿€?&-ìX7q„©²p;uE£¨{§4|ÓwüL5èGŠ>R±k–ɲ¦=ꇣÇB …„*‹ÃB]ꇄ€6ɤ¯©‘ÝåvÅÂè~ú˜ÁJT]5f5‘÷:ƒ)ÇîÑÉ- ¸ uûÀoÒè§R“–½Õƒû«þí Åô›LvoôDŒ·é‰Mb2G¢× ‹ñì§ÖzÓ¦îhGÞƒ8L";æPMr¡ƒ1‘¿x –`zý{s< rO´äln¯“Žñ¬ ÍWyF;O1?è0v‹!Œ»G@w•¿³ìÃLµå@šÃÁá;˘jLlû¦AÕD*± (ð±ÚÆJó+¿¬3»Íö¼ž¸;´±ê¤¸Ȳí`v2ÈŠM£s¨EQq}7 ¸ÎÝ£|iŒ3g“H–i,bÑœ¨ ­w|Ç å§ÀÔ9šÃ¿¤—T£ßR°n|ßÎgs®; Ö–CñÐ+ªºöÉw1@s†½GµQ@_|3€¬YÓ'G˯äûMe{82Wɇ¬+3'‹Jt?W1j*òXïö ¦†Ôp4P6Í73­ÉØPïÈG‘ràÙ~ѶžºSî45e”jô–û'D|ƒ&f;þútnÉX5jZkÿ+­V®ØÀÛ:„¨åmŽEï<îÍ“ÁÒ÷c§Å#imÊߤL¨EtÚ/äxÄ}p¥sÞÔЬÆ$.jѸan`Yü4aÓ¬mêéõSf¸o¾W †/D‡„-¨ÎëŒÌúÄ“š\ým6BÁÄ®_Y)#7!³–|›>ÓÆŒímW^"cáíÂDM¬fHôÝ!uØÄè;ŸçžnAw„—¯X^aaxÁ¶ßDcÁoï¼»©ãweaDSüb0”9à> stream xÚ¬·eTeͲ% …»;wwwwwgãîî…îNáîî®…»»»¼úÎéîÛã¼~úÝ{Œ•‘3fČ̵6‘¢ ©½1PÜÞÎ…Ž‰ž‘ oikìê,go'K§ 4wü5²Á’‘‰8\,ííD\€Ü  )@h`f0qqqÁ’Dì<,Í-\”jÊT44´ÿeù'`ìù?=w:[šÛÈÿ>¸mìlv.!þ¯7ª ÀÌÒQPÔ’’—PJÈ«$€v@'#€¢«±¥ @ÖÒhç ¤˜Ù;lþ½˜ØÛ™ZþSš3ý_,!g€ÀÙhbùwÐÃèð‹àt²µtvþû °t˜;Ù¹üí‹=ÀÒÎÄÆÕôíföÿ"äàdÿ7Âö¯ï/˜¢½³‹³‰“¥ƒ àoVEQñót±0rù'·³å_7ÀÞìo¤©½‰ë?%ýË÷æ¯×ÅÈÒÎàôpù'—1`jéì`cäù7÷_0'ËÑpu¶´3ÿ/´' ¹‘“© ÐÙù/Ì_ìºó_uþ·êl<ÿµÛþ_Qÿ‹ƒ¥‹3ÐÆŒ–‰ùoN—¿¹Í-í`þ);3{ã¿í¦®ÿÓçtúWƒ(ÿ™ª¿$ŒLííl<¦@3Xy{—¿)”ÿw*Óÿ÷‰üß ñ‹Àÿ-òþÿ÷?5úßñÿßóüŸÐâ®66òF¶àß àï cüsÇØ9ý¿Âl-m<ÿþ3Pøo’ÿ8R.F›!dgþWFzÆ-Å-=€¦Š–.&3#›¿ú—]ÍÎèdciü«è¿š  cbdüŸª…¥‰µÝ?­gû· hgúŸäÿŠô/ê r"j¢Ê¢4ÿy§þ+Jñ¯ö.ªž‰ýRäìMÿ×â aa{€7ÝßHÇÌÂ`ÿ›“‰É÷ÿí_0Lÿµ–3rq²ôèü-™‘é_…ÿß­ôþFÌÎÄÞôŸYQq1²3ý;^ÿËðÛÄÕÉ鯪ÿ:ñ þŸë :è4]]²7á ±JËLw©ÅÊžÕéïeu(mP-*¨¶ïñO‹Øáª0ü¨ ¥oœæþló\ÝÁâ}ýL@âV€Núä€èg’Z‡Ñ‰Ü‚Z[xvNþóäù‰bpldx¨ç¢ï&'†ŒÇË/ùŒ(ÉÅÓÐé¡ÁäâÍÃ}—G)¹Œþ<©5ÆwÔ…ðZkH¨É\h8"ˆ£ Ù ›,}NÉ?gÐ¥L%“y¬8?€pI¼‰jº¿‘ñv `pýÓCÆFµÓÒà„®·m A›ÝbÎǾqËïñëÀ#šuß®I¤w)Š}/˜€dPpàð¶XÒ„ûµý‡MŽïh ´»±xFLÑ}³Ðݽ¬Ó:‹Ñ1h/³„ééפD]Ó¶OON<ÕC•Lü þì#-L˜ÐLJÍ1€CÎÄ8p^Æ¥ÕBg™ÝIOK¶NKùêìhñïk67 ŽG—¡b÷›'=Ë1Pšàg͞æY‹¶ÚÞÃÊ#t;¥ ,½‘Ð&FR©Q@»ØÈºm+ÜŒÔûwæ' +š'ƒ÷~ÔÀ›ò&i“™\JL…r^.õ\ýÜ2Æ_½>š`^Áý¾;(~®ß_2ªv šÊtÉ—?pÞÉûTé}Ž;‰>³[G/ªhr:;K°Àó˵¢†Q2eEèKpm­86è¥ø`€×aÚyý•޼8iîWê ‡GiÛtÔP‰ÂM % %Ÿ æ¯P4è·c¢4!ûЗbUů$¤çpèW»"‡~M^ñ@‘.0ƒZ9¸Yâ’ʳ_µ+èXrI{Â5„Y^NÖÑò'= B¿1ãXµÇ?ìFòÏ[¯Ðè¤â¼¦A¬†Ž)ù/äïH”¤Ï22ªK®wîF¢‰3BÞDáš·ßË—3PZÓÒ¼¸TßÛ9±xþ:úŸòU+˜4jûöći¤ag¦õ@=!Q!zÎ26`e]…g¿%¼ h7‹–²Á±–¹a[î9Ë¢ õ ÷·þpM(Ô¦§Ù^áQ”ñ¡¼Äs‡Äþ´µÑ"hOp‘ÑCù"„ôéRŸ(a&vÏP7­Q#N³µT­Ûo0¿®nìI]~c"ð¼ žÍ)k>Dbätú“êaÌ–ÍSR´Š»üE€d7OW]Ù.:ˆ×|‡òLOú˜ç¥ûx*Èøþ®“îþ{“àF¬Ì—ïõ>‡7ü£†Eˆ4u Û4zjÅ ×DSvn*sLcÞà§Þò;æ>Áâ~+ô’ [‚w<Êÿ@Ü™æT6³ƒŠC( õ²Îb½Üšø([7³h¸Ý!/´c0}ÂõRN×w-lj”*(É õ"@™mJþ.+ ß¡\R€Ü>Tùª,DÏ,. H÷BòKöŽxÈãÿì˜ÇÖøñZk‘Ÿ%\ųÜ UT—Rb}^½ ™+-óD[À %νGZ{`¨"Þˆ ]K²±&Ó>a™-ÈhžáƆ Ú¢ÝNÐ4ºu¿ š¿À0Æ"¾±#ü5 á¼àƒ,GNé9‰‰w¨ í’c$·Œ7â¿æüÊ%üýw‰<`§îôÙIZ{-Ý®?äÙFÒo¾2‡˜É_ïýûªYôÛæ©n‚HM⺥ ,È##(ØEwþɪp‘µ€Ï„Â^Ms«BH*™PX‚ „Žw¯ÈRu†K8.Œ™)°¨rXÿRÚ.J@?Þ Aä}ÄB!fm4áW|õ™Éq¤ä F<ÁÌ<âd´/Wõ°z£”évRPRÎ  N§B8rs:«¢ö;†~®@6´Vgonc¾=2ˆˆš×Z%ì±¼{ÿ¤TEÑÆžÀ>޼Vº+5õl—nO vK¼ؽ(ý.=NºŠt¿…‚‚8y!¤Dîì š¸] rSLð èºX* ÎÎtRhyÆÉ¶JAÁ®Ça‘©¶ì“ý©FpvaM®!ܨvTµÅ­árÏȘ‘dâFÛ@eÔÆ#ÐÓ4&`Á×,¸\Ü“Ã|ú÷†ºÕ÷}üª÷]€Ç¥UxŒ·½j•ï(Í1¡ˆóÑ­¸-¶<'É>)ktâ]Ü4¼[Ü,Mþ+¯ØÄÍþ…ÊÒA’lý9…`ÚÇh‰ˆìΕÅXˆr¶3F”ŸŠ'÷=Xôï@… +ýѺS!™üö°˜×ÇRCÁc®ƒÓªi¾µAÀ¯ÉΚù½%¿·°\ ‡Oôn‚‘rÂ%Êo‹üºúÙVÖÃ`=YÁ!1Gš9|ÌÂ,‰±`kü¢Ÿ¦hŒùòˆ;\Š‘5ñI’Ðw«Ÿ(Þ‹X:¾9|¦Ç¬ø•Ù§£vÜóI ¹Á²ë‡H¢c÷l:¥9üâ·c9—~(×:}Åry˜I#qxó"ðeÝps®…52#¨ìvš˜`ÓXÈzþŸ?‚wZ|”äòç7â×Ê] ËwاßÝœ¬Xk•x: ¾C Ø´·eõY)/´¾å^ç Î`õ$ü*Bc+Å·¡áoîù Ú:4mv…‚ûá¯)„äY‰ë@~Vµù Uáê¥`-A%uc|s;0íÁðÃcëã©°³7‹ŠjÙb_ËLYõy¦)wÌ{«þA³‰üH¢Â“}8Ýo,ÍÀjÌâFúˆã°.Ú´,õéƒVìm¨²Hž˜TÊцpÿ >ÚgiòÚÓ¬+í*õ„†úüçA-UœÔœF³”pDtøœ¾ý¼p)ó±ß„‡K:MS¨ß{„“\¾Hä,%±ˆ[Ç*`åŠÿ÷µ©Ôž• _iìL9k•Ù Õ³´ü _ýÐâ¹¾UÅÈýù™Öz‹&u£—|`87ƒè®ÔÊ–]¯Û„ñËŠTx©ÎUÙÎ’û×ío¿ëLsΊæø X&޲n„ MB¹¢ùוT÷xÃûLûÁ„(wþ’Z®(~8æõ˜D¤«„Ô¬|' äSù‰bÙÛåן>w+{wÄ+ŽÔÉí`„ß 6-ÈMûÍuß·Œ1hJH´z*ÅÜuIøŽÓNE¯NÅ!»R–‹BkŒ0Pö_Xœ¨ÿ„­æ^ÄcÀA…DÆÓCƒoúÑ®%mS÷¾êaX™’ ßÂiàÄdÊÅ2ýÀ$ij¥v°íå`t‘&ië^Ý¡ûŽ)H½!˜F ,Ø\80½ šÿ}.F˜üØ“ðu±¦¿P•)ôƒ¶R¾ §ƒ£'¯‘´Ð«Dž™ªGv,$VŽØô^Î ¾Ÿ“†;ÍóØ’íy0…HgÊ ‹÷!¨ÆõžÁ©ïn'X/A7ÐÝbÌ¿Òâðm†ú ÿ´:™kà>ÝúŒ¼eS,*ýÙ/PHMüž*iÔÚ‹!:bcÝy³õ›[mÍàMPë$î-ï¶&°Ùf{ì¨ã‰m{Ŧba쥃Áö5ȼçå;è÷-‘`÷O)2é6gJš¬Ö è7c8øc EÇë%9ñÈFLØ™¬"(ú0ùjf,ÂßYOFöÐwn»(¬–ˆõØ ¨»¥NÑ‹ÿ±Ñi¿,rÙÓõö»s¬µÎµ­ÕÀ—MßåLj§nû©{ª»¯£(¸™÷õ{4»5ï*1¡Q_ŽìQX™%4pEðEÃêR¢ì¾Á¸^ù6rÔ™™kL':…d ÷œ+áÑœ„-ÝÝW`³$× =(Ë#>Ó"ÜšDÀ»ðÆç´@@ìZ—¸›½à–­eRþ(JŒºÑjU,ƶ¨3=ziÊí-уù‰šÀí%7^ºŽ¶[Ü®ô¯Zá¬ÅH?¹f›² hÀó›Y…PÃvâ6&ÉíR7lŸÛã˜dãi÷›Î«`; ýʉƒ„jÛrjúKpÒ»ó¬`eD‰–‰ÒbekD¸¢*ù’2p—ê‘Ï2¹'ÚÁ÷Ið=@|Ùû8ôh dÚ¥àŽEó‚G(b¯! ÃsdE Ú3Í€ä'žC`#×`†î«-6›+qÛ^‹F‡§õ¢™£ˆ~bÊÓS=›þ`K ¼â^Z:Zp iÒ®\‡Þß±Ö*É'€Ä{þQœRZƒJ’VVê»Z ±ùYE´ßxa!] ·Ï®_¡†ƒS“†Þ´–¬Ójn²¦,IófšèÅ_ÑçêðJ“¾+€–~¸:oá¥pôçú°‡m>+㽊Ì9EGêæi±è×UŠRÁ}jÝÞHKR‡Èx\Tªž¤{*®å8\—ÐúûÒ•Ê╤zB³žL»+‚›™°e{‰ŸE†DC¯¬üØý T°0! f~ÿЉ¸‰Â]Ú% D«HÉ¥7b%^sz–ïçYÐn^t ¹cja2~½» u]ÓÖKœ©%‡£âÊ’³nÓ¶&¬âÉ’Ï„ä­H(Ðȼ–OÿÄB¤|³À¹WûR­pÉÒÝ0Õˆñ 5V÷€É)2ï•Àydi‘öv´vo9ˆáçœE&½E¼µ†¤¹æ>ñ³Q} 4ÿIQRiš&²_™é*jƒ|¯W>–±lõµù|åØ{¡åíÒÛH@2L¹û‚ w]²4¥ˆ¿@ŸµÝíÖ—9èùƒˆÿ hlÜ@é·Ô”K»\ )ecq²q|¯ÔY´‚¦¯ýf‡e{=MAP9 ¦BGû'~ÿØBfOÍ^ëÀ9Í›úЧâr \"¾²n¿h)Á‚jÓ¨jö$Ë8r'c}:.ÿéÕ;L˜9gB•¾ñ­ÝnYoŽÝ*VÛ궸4ùÎÊø‹Š’å "ËS@VÄèbÓ§ÛŸ  ?‘›j²—Ô¥;Ã/ö]+øti§¸ž¤6[wÉœX™žÂäºP W|Ï„ `¦š›<áÞ@g¥`’ ¸Ó«K:ŒOêÀª]óqˆ-ˆ÷På"%Z…híX‡¤Ö4—–få!bÆŸ´êïku†›íµW94Ë2j¿öú×ÖËO¾ã1•žÒ0ÚtÞ3¾’Èô{ŠÀâg›"ÙuÏ ž2 ¥BK@ªš‡I.áÙn,;èc‚eä¡ÊXDâ†|GP”n©Ø=éë‰ÀÖӰ胠ÌÛ1ö)›LHNåÓÓk/È„5³lºßúw~Åõ¢ÝÒk±gr"ÊW¶?ýð;§`¨\§Ó]z¢>6­Pe¶ß()÷º·p»f鳿\b…keÙ #cq-–T/Ã}¯öщAõô»k†C2`¡X×Vxs¡ökñ¤K:B62FA ãZ®»“ÇÓõòýø|Œô¨†ŸùA)¶If*ŸBc!ô3F\q‹WÒ9+¸{­!l¬N`,˜pÑ D”4^ènµ3ÙšMË£¬[{CÒ0n­|¨[FfA­óÅ„öÅ‚NÈÐ9¨Rõ’ÿ€Ö¾>íf/r¶‘(5ÂöLBMp¢ÜèžÞØåÊm|%€Ç-µ@H‚% àÎ/OïÑ‚‡aù#;®+¦Å8¥¯ÀlМkFÞ#£ç‡ôqŠc pŸýp,Žš_LJ ÉéGÃôtÌ .ŠCvÓi؃yhŸë Ř8R‘Í:lû•T¾rå«<â9N ýâGYŠ?¶ºšB‚‘éTêDŽc|Ô5ÉrK¦Ð~xLÕ‡*ñ=Âòú Jþ}rv.dè”oâö«É6Y0yFú¢"»uÜÚR{Ðd’¯¬¯;nО<ãçÓ;?­XFÏŇŸEˆ^­QΪ™Õ"_¸³Nu…}®%÷]Ru] $±Urò¯Ï'®Ä”ã<[é•Í!ª§É~¦Á|¦£§ÇÎ//ÜÊœ‹œ‡Â÷³ÛÜ)ùÄ‘·ÊCûcT½朓°¡¯½’pê u¹¹Ðß]~8®ÚG–àŒ÷ ·<¸.÷­ab-(Ksqî¦"ÄNõ¦÷B'ØÓ |_4!%+¥‰Wþa¢ê¤§Z€²rÓì׺üK.Ë¥+KC¥_>ÙM,Ö߼ßduμv`§BîëæM9&±Pw‚Ÿ¡O‘|.Öž2rŠb5Þ Ývi6ÓM£ÊÝ–L¨T¶îªt¨ØÞBæ³brM¶*¯ž$FÖ¾—eê[cAG?]¯{`ÓòÍ÷†)fiÌo£3òí­ wù Ï~è·eáÐÔ(Öwr•,´’“ .úq)[yïƒon§g:ÕQØñ*wM B ˆÏwúÝn¬ÓHhÊ6ñOy›R‚Ž»DfWÛo(~R•-Ël²å¾3^±ÞI§µ‰Ùǯû)üâÉ;F…ᤱ_´ÙG¿W-óŽlÊ ~íö_$.°½l¼Ž¢šJÞ{»èü ‡¡ŸWz‘o’¿úX؆õÇ4Ü£Rb8Ñ'¤ŽUyÍ#Þ[_÷ýªÅDËå(ÌtfìJaåý¸ ˜e12Âßón_&ŸpÞK@G ¿µcU\úµê©¬¹Â(ŠÙLº.3³ïô¡9‡*TÛ5‚G>ÑᣀlçôýÃ=̆º å›Á´:A¯Ô91*útB¬ûç×Yd”Óh1i¾èÃK#:³lQsœs}_&æß‰û颽~±þ =”ú‰^Ö‡L¢‰ò"£7/€(ü ¿iÄÅï0ÄÌaÑÉY~W¹ ÖdºšuSZG¯+&Sò5dÓ™æ8?aмã¬êÈ /e)ÛœBº‹2q­.ïêt+Ö»·˜Ô5bçÜ/í wnfSW‹ï¢á'cÿ<݃ÑSyfˆ@Ä’Áµ.ÛåkÓÙÒ¶(q8Ð47„¦Yº(&h-¯}ÂëKCeOëìÕz{_Ž0VX³w2íðêÖ‰Ò{Ѽóí¾Ÿ†ñ÷CÄøœp–ÓžeA+”­ÌˆžPÈ7 ¾kð·îFï‡x•àÖÅ,T™S¤¬Hd+À°œjj4±°|×o£!_tƒ꨸÷l.¦r¾§pQÒñÕ=%$ýÂü2œsÚÂI…–K†[UH+’ÿ§n=Ä=ÚF4®¡Ñ…ÂeÈVŽÎé«kÏÅq¢¸94¨»e‹Ú—¥ºc$™2ˆÁAâ¦mËØÉB Ç?`ss¾k¹y ç_#¹ñ¢èÕ~¤ŸÄôÚÞ¾³¯<Šð»ˆœ3Ä—W!º?õm´Sa¡Ig·0¿þ僯BÖÂ{“Sßx)ú”ùœÒóU›¥›Ý³Ò Žžó¨‘¡õXÁ°±”5Ò÷šþi;FÒj<òe7…‡9Ÿ‚Éù-yáÛJéçêÚ¥Q ýé ³îÆFŸ©XµDï"½býò±²ãº$qj­!žCvþÔ¤iwÿ®ŽÔ鬦_ªz*Óc¢„?G˜t46³®!Ïwý7ŸÛÛ´)˜#¿ˆ#ªó Øô°•ß,(K½F Ë_0(Ò¿ÏKW±yuíèâ¼?–åú4§ÞdÌ8͹4JÈyf®•x…èæÌÞù~?Æ2¼ƒ¿1ë$šÛ–C>ýË’+Ò0n.® ÐZZçI›†C^z9t$ zþOÞ   0:Åë™dãÅo2Õ­ŠWÐvÎ^ÜZÈÏN»µ›¤´)¹t±[…˜o«“±Æ©f®SÕfÙQ'ˆ­Nñ6çô|Kñ%L{ðåˆèN¼çñlÇRu­µ¶"ÜÚý`øíÒÜ(MÖ_jZDÇÞ­¸\®â'[Q-œÕ“s%:VÕÜæ¢KaBœwHIEºh®áSóåy3ncÖ »ŒyÜ•µo¼\½Zóñ½u¨ùÛ¦ôãK=8½_¬•ÙŒ­B×üÍÉ,â·¢Ëoî¥8œØ߯”ÅxlK¡Ôï FëâTå¿©ÆÀ¾h—PR¿Y]Ë÷Œ¡¬ÕìçBuëH¬Ä1¢ï’â·Ÿ]ØJƒ9L5¬—3!TuÐ6‡Nws8=ýð<°>fÎ5}’›ˆçÙ5¸µfh„Õ‰áè÷w­dËSeP¾.±'MíÈ¿SÈSÿ-¤¼ƒ/ûYÌM8?l÷Ôûö(­°êQÛÅf×Í¢Üøx çÅ&ó5`_4½òH)ã Ç2áßW -EÃåSj—äsF^ùùè5IÊ?"«WéFfV™®Ò±uÉ÷Cfn òfD¿M=ðÅ+òì"*Åìôn0<“­šç«ÇkÞ±ˆxf±U‰VBËÒËC?[&DNØbp©g¼_ÚhAWŠY«mŽZÿôgÿN-nn¨ªÀrjôŽ£ ñjy­aÿÚøùyßþ†,*ñe¥ðxªVA´¾¸oj¯Á'@AQÃÛ z3KHVsÍ«lÆâ•ÏlMú¨ô4ÊÐBƺý{u9oɓ枂¡m(k® h~5„Å ç"ZŽqk|ÝJz:µÍ:VNÎv§´¦Ó ã3GÃq›½/F%jæWLÀ"Ûñk[G¬ŒšF.š½þm÷Û¯îN=à¯(å#’^Y>²Ž.ÿà~q4`4Ýo@‡¯L>íŸñ*Æ™ù‡Ï×Âßä„ôí’9c‡¢Uﮚ›ÉL øOŸŸí5lU/MÚb˜Œ2»jJ£|.nS Ú"8,.©£Y3u/ ^!Ü ·‚Nö¬C8Àñ¸?pµh'¶ƒ 1õ0.Y+Z&âØM§Ô5¡ñ€ò®]qÓŠ¿/~Ÿð‘1¹kÂÞS‚ÃióEħëSkäØ^ã]| mœ}01·ùæ¢ ìì·p|N> «u°ÈöæM£ao5g1çP×›Ú#Ù!†}ögxbTØûlè>qtCc~!K¢!‡²Oè°Ã…JQöûFTHŒ½«!Uuq«Ò­§v2'Ùeƒ6PÞ3÷¨d| |s¹ý¿$6p·;4_ÝõôÊ/Cþ8v‡Ý6xC ¢Ñåê¬Évä/"~™Ã«ï'2kN®F ë!E vâZ!¸&á¼SºŽU¸¢“J³7fék3¼˜CÓ0ÊŸ6–{ü†u¿œ_ÓÒø‘Ïe_¬oP£XÖLïÞEÄ3GÅÒ0sO±æEÛq–°%ó*µµ\ºyj¿NCƒ?r=<ᣓúÁ&,œí–Û>¿¼°ÄbcÃ~A½éÈ^¿_ÖSÓ ÑEά„ÐæÞ è*ô*:$Æ7ÂÕ´Jþ€Ç“=xÞž8KP;X‡ÁÂr€ú<œ‹úMFPè¤ +>©xv •Ç,®VÌ„ø3ýÌœ¬ýôæTi±;¨§v fè"·»’[¾8vbQ(sƒ|5z_!ûK°9N™Ô‘H@ˆˆãj—L+ßuˆ‚ s÷ŒÄ· q–ŒNïQ"–[q/Y¾e‡†(CÅ9MÑЫiìYèü[oXzý¥["uo&ðäh^© ú%ŸVÞ¨§¾¾:óãÐØñg‘X’÷(ˆv¿<âW|ÐX¤›õ ¬ù°c€5j ècÐÒw­)ľFÌ9ú~¨üÃvÊ€Qì|½0© zòx–çž%”ë›=E½6|«ò–úü€'ñû€ IÒ• Ê|0TP~´Ù7ƒoYÅ7q€` !Û¶…²ö¥zNômx•;%]ê»U½QĬ[(rpvÉ•ïÈ"dü0+Úòˆe†eÙWG0Á³ T­%òwÎãÞÓT1X2ÙŸW:nWü?©è`H&Üq[FÑF®Dô­¹ÊÊžð'Eííçç8âN(ó?5°6öÆiœQNÊY³ý@‡µ: é[MúÕŸ´ã¯¸{Çž0d¥Cß »ÿØœfMãÿǧ¾ü±š…Ñ…h6عfƒ\?|Œ%³îÃ'YžM¡h9|€r’6'pР4ks1•©EFÌCë²f‰À݂ľ·ˆQJp†›ž\»ÿ;ðJZëK× L‘l0Šâ÷ Á"6ûñröÍ„ÃGqì¼<Ó”õAMm¯?ƒÙkîž-·§2K(/W;Ú¬˜“ {•ßg³c¯(ÃÙ™¬k ù)*œø%Lc›mÈ­>HÓ˜9ÏX8X[ *qó-)²þ¼5!BâMÕ¥:ìá½·ºý|ÁŒ$r ¼c,Þ,¶1>u[q]ñ¸Rž®u$ÕHm oýL(Оx­štÁz5ƒ|ŽÜ–+FK%hƒ9Š·ÓEKç‹ ‹}=«s¦o˜žö ¶¬"{ù@Vê˜Éë?û¼‘ç`€¹ý3e'õ59kŸÃ›³‹î&â8M1yìKŠ^™;㈆‚ÇdÖNÇ_ 7ÍØ)­·6Šd¢ö ›nx×лáìJ`µ¥9dôù~3]Äpî_§3›ÝP|çÞî_&JÀp5ëëD|¸³2”¾ØÃTÆ;¶ù4PÊ2v¿BÛÀIî‚ m ÇŸÔÁ*"™{¾ûÙV$Šx­Pn~¾›0Z‚ÅÔæåiù³&X—úz(UàÀ ]¾0,]Z’ï:þ9œ°•þã=æ ä(h®+ Ÿ,{¿"gùÕô’Iî±úŒïÔ »Þa†$Ù[ZણþwÐyì•@˜íÈ,í±Ý¦·ðø;î´[%úÞëׇ[‹z;éºRA~ŒŸãÒév#oŽ6‘¥R¿v[ÄÈ™¶Ýpè´‡ÞjßþQ¹,þhÈ^.q9ˆe<‹ÜÏ}BÄ'*H'»9+a9¢ ©°ÁÁãhãÐz’ s€žÜ<çIx‡V4ǦA­+| ™¹ u[i±Ìhõ«Žsƒ5Úhf."(‚¿/X`ùäwxØX¬5{’ÐN4ÞÍ+Kìç«Ñâð7Vª›³(έ—<ùÊ("2Mê?Ãîf›gi=o¹ý¯ÉÙK•™†òª wŠŠU—ù[fjíõòàŸˆûÈZ˳ ¶‡,µ1É«Êצ̢¿ýj½+ŠQGÛÌíc²w²ô"÷$Ç ½Ê¬ÙÚ«2ÅÀjš_a—-1lɹ-Í‚2KÓÌKUA˜Ù™EÐA8ð·Æ ~•5Q9*÷[²Ú™°JráñtMã´¾ rž9gh”»ûzìûaŠÓÁŸ½}‹t ù†L´›v–´¢QFܘ#9Ò‡X¯|:07æ©ø"½Ò|X§‘¿–¯}”’/„í˜9¿ÀÆ m$w뎚Õýu6õÇRÔîmêÓƒ‡¶ªoN|8c÷^Î*á†T ê›'ÆûFú´¤­³OOC}"E´à =.¥oÂ×e1fÇ“PÈDŸŽF§…åúÛ"eï$ëƒÆÜ¡L0 н?™¥ ÊlZ*mÙÅ]ß^ÚãK/÷°ß½Ê÷°›<~¼kç&ÝžˆFßF BZ|[øêT°m>;‚…"ªý¹€@dÕ :-žø¨Ë,G¢‚/b. d½U2+›ïúPqü˜C0Áüqè¢"賟V«a´ ëbÁöH®#ˆ˜‰;‘;Ã’Ø P/ þ´Š| åTÕyNLUšÂØ¢DŸÎ˜"ˆHÝÅbíô@KšTâ ŽÛaŽVœ_Â&ý½R/‚GºXЈl,5 ZÞðŽ Âj½\Éõ…—n,QÿüÇṚWd‰âî¢`i"õ(´QU ¿‹ù,Z½â–úŠß~ u/ØËSŽ\áxºÖ ¿ågˆÀ•Øêùà C½‡%ÝQ`ʶ™ò9mž¥~¿Ä ÓèÂGê"ºhpNoÙº˜Wî·ìjTvŒý„çCðÉHBßÕŠ£üDÑ(a¾Ih¢i„øÏm1þé?3…ëLÒ‚BîoápÑ_ÑPŒbz<T‰nOswÙ÷J4ʧ ½a~—<ÜÑô:ûȼ¿œœ¤ÎDýÓ@!ØÔ¶ŠFª¿Ñ®-©ïˆ-^!ºÊš¯Ò£¹ó^}ú7ášÊ ª×¦ñ °ãNÜ„}Mꀅ[c=à^gGLS½í‚ëêÚI˜D•}âðMy5ÁTÆ‹d,‚åSÜJ¢‰àù®$`u"˶Ä),hW7\yZ…D¼å·´ûÕ\–¿q±{SÞÉc5©Æ OPkt;à»RÓ ›à&¨@–l8áLjΟeÓO”ß¶Y̾T[ ÇÁ³‡³VÉ©¶£+ µø¦—A '2@(s-e¦1*HÒ .ù!ù‰@]Tu°ÊJrêívÅzÁ ˜`ç0$çÜx\¬5[É× G1Õ7OÐ4«JPr›kÙGR-”~p¶ÛÀº#Zu¥6Að>ÏÊQ˜þ“ —Èõºþ|@µ æÒ}ÕØõyëé\¹Žæì¶ç½—ù)Ítéw§‚¯!Ö_Ç>K¦Õõ•MAš×?V×ã`êⶬ,–w'2žS¼àö úwè ×…{wмºÀakr·DT<-Ÿòë]·Ÿndþl}ÊqÓ„€¤ÄM©É·è³W*úK­9©öN~kîÖ¿5½HìCª.éšúí¡œ‰ÏíùU¦â“ÅÐ^À2–šk)­An.·ö|¦´b•Yߢ²¾ÞOмÉj.^üÅmåJýŽš$@m¬ˆ†5XØnÔÙ<.?2½š½œØ€YÿM¶gM½ÙŸ¬ X´jl•ÝÐÅG ô®ìw™x•´\ÝŽ`³WPИfÓiÏâ^ÑÎ^Ó¶Š-wÛ4E¦2zš²ô‹ï8üÑœ3bVÊI\—t<ªgÈ ¬žÓŠŸuÔÓê—ÃÒU6óˆÔªùT;ËÀ]—Ô|™´Ájè": °d50ûHe± óY( FÇîðoæ#dŒ´Ùz14uM¥× Çíf/ŠÍ}àn¶`¿L«+áL *èÒøŽyñ:PïFrª$Űþ0°¸îÞS|hÂGÆæ@s? ÀñŠ›BU+EB(_{V “@ý"CwEGøˆñþóÏ­šY%•<6IZ”ŸÚ S÷ý®“­vrËóãÒÒmðAb'¼Ú‡ï›EÀ#·gZ¦K ‰Xºübü/Mbv IÀp5*G×FÇoUìÓS‰}ÒŒ&Û•7/dóß‘‚ŒËÃ9ž8–Ú[á±ùÄd}É­OP*âSP{‡ä¢G¾0{Aþ;ïW‰ŒJ:+ ¼«×T !æ}çé'Ù„⮟[dÃk –úbßט>„YçŸÝ°#‚†‡L¬=Uû¯W¦ª'Wÿ„ ì°2+È­6åE@c>£•MÜ,¹?o ¶ä:ÂÓ›ù* G…Ó˜!ã"sY_XÂѳ½¥ÛGéÖØ~xr‡ E@þFò(F%¡1ÅxÁUÙ!2ßÈ$VkézVÜÌ*žùБ§ªÏ}ìÛ‡9c5fú5ç¨5Vr—’^£t‹U^umÇÜ60#8ćg) ‹Þr‹P.PÊL÷ÛÕeíözö9õžÎıòê´8E ÚäšJÜ[Õ×!á{dNªÂö‰?xñ¸– Ç4)ùÁzèàù–úöŠ. Í9÷F •‰$Œò"ù"õ]°…¹=iÔ|=¡¼$âçŠ{ºÎÙø;XÈj‰ð‡dpôží°íg(U¤8‚%4Y‘YçRâ ÿÑ$c¿6÷ćD¿•SÍO³WQvbÑÝã{í¼]v¿bCWéi—ê&%fD žÔ  {‡š¾=°w0:FÌîú:éî)k—ÃkÌF;©˜,4(ø@T3Fæˆ’ÏøW%r‡š•—‘¶ø¿Ey]¢§ {9MZ+?ÇDÊø$;¬”wìîØÍYàh;ÉÔ G9ƒ IŽŸÿ†ÖÙãŽ%ØOH›çOghoIÛ@kw=.HlCŸvŒ=¥ÃŽpkñqXótAd¼Þk|/õÛÁ `ãJÈ—5Rç`ë‡ê°g•% ©Xòâj[šðÍ«#­k%¬$1¿{^dí¥GàØ*ßd_2ÇñêÂaó¡Çu³¤Nß<4Ú|¹7d’¦],;¬L™/|k޳½zöÄQ󛌷^ýÞFzˆ&Hu³Ò-'OcãõƬO‡•ÍgÁ½ÊOb°ÍSº?Ž“E9×78kÓó$ZÞÏÉ¿9535T¿]ž—×ZC(U5Âýý&—êïpDÓò\ œ¼ÙKWµÜ’öX *è«Æ7ÈàG¾ò> Õ…*@Œ)åïªFÛêÈ ßR|jÕùnà§/ºm Bl¹ªôÐ$£Rí#™„Í Ãm ÀbLÌI±l1ä¶Ëý·æ±L‹o *ye$òî9¥:‚TµKÿ}Šn÷â}ˆÒÉKdìƒ.L7™–^¹ ‰uN9Âæ¸§sw*O'‰O¯7ð§RÅ…(Â=-VÙônxß›ŒéRñÙRìùj‰“^ôFÙú¬à4”…3¡2ÖQ×jRdß}­ã¢KD4ÎQ½œ‚„àÉôAWœjë7þR¼–ÃZðõâ5úNô #–j6Ù­¨’ˆ˜U|JÅS„õ×H°ÇP¾*‚¡GȾ¥|Á6ÃTÐfyg6Å;8÷4MjÏf³¨¢O¯TtK¿/a‰ …ÃYHÊ`1¬6<´8N»òL¿kØÆu÷”žõéÂfÛ+Vð´2ÍÄ=Øêa(ÚKDS] !<ç³8”R¯ô& vg×<2ãŠÊ­$Gz ü%àØ¢làÝÅZŠæô;¿¡´ÿ3¶ˆ¿æMÅ™;,‹AšÆËq‹§¯Lÿ(ß:ûÄ™ýb‰çü~R;ÛYô<·4]n2÷„V}§Ö|}¤Ò<Ñ’xØ~*Û"WÑqOÅÝ‘0ï³/ìÿ¨.£vUÙ:#bù©çq*}ŸM¾D‘ç1LEFWu›à ŸT»òuÍwŠ?°S¨/$K¦ KÑšš/c¾5ý®,'½½ Fmp¯&§sÆRžXeÄ–°øÓi´éçNqb¼KþDiéaV6*V«ú’dÉ ¹“$*Ýës‰‚lwÆC„Ž˜Üœ{úußïEëÓ©mÂæª/¥Üi'nüNä^á§Ûz:*jÏî‡RùféÙ[]À&Q®”QÖXûp ‘Šä§ŸDë ¸¯O‰—ׯu ‡%e7È|3Qíúd/)ø5)?ö[â;«ÛxÍ”ùeUM¶r#H{]]¦ÄÆqÝè+ÍÀ>*ä9)[N®T,S IK¢IóÈáodaé»]`ÆüFÜ/™à‚UQx¨I.šÁ¦‘m¸ÀWLâßÛâ xˆ"-ÜÔSš²$šSìr¢J0é A\išwˆ8ÅTtS²Œ'¶:$ß©¢øÂ¸8Ô²—Ù‡êM·áÎô YbŽ‹eLŽ„…càºo ôXжÍuövÉ:ZÝÐü^ bKA3sƒâ:„xòm¦üíÀÔÄ>J•kf"âlDD¥ï=5?á eû¾‰å#{>G‡a, ùÒ„ÓB´5–[³ik5ÚÒHMÍ÷c©ð?1=E~æ ù±Ù'Óµ(ʧiÖá YÂU–²Åd,SÕèNþÿXE!3¼uD^†Ò{КÝaÐc¿ _=àBR<  a¼rÔš‚"ùaQÅyø^•Ú.X¶ÚÜæ7‹êZI¬.uUDØØ{º*gôl"GD6Qö0Ã7LƒÑëU—àƒj”9’yï6<£ò@ „4âî]îÑ]Õ9&³Ë¶0ÿÀùj^ J1øxkòö ¡ìWC…=¢'SÂìÆÌ?·ˆ©¢3¥ÙÃ{ˆ „Úv~FËÈ øÆó^Mp×äÜ`´Uüô$3õþ‚Ùý\½ ·Ö$­ôHß?D~ONÐ"ÌÝ{*εú8¢4´‹’Xä–—),È©öÇBÚvNPl¾UAEÔçlK­•?ÊL Q=óÙùÉþC \NùRž“7 oŸÕrµ¢èÒ<¶9ŽN½ uðѯ2ÍÅÍôqg$³_aßZ:‰““„NýU-!z%¨*/ó‹ø6 bš¥)0=¨°¶ZwçÑŽvÿq¸:®·°/]æì” Î/îVCé{¿ƒH;Wtà«PªÏ„µç%®ã4öd&g*óú(7I.ä•© Õ¯jî>-¡""Àí¢˜2”ʾ[K ";5>I˜Q—! ÷2*\ø¤ÙíÝxŒX²ÀlÓ¢€¿[Žœä¨Òé'W8åLùaó‰q€@´D<:&W†”Ð=>\}q ”ž”qËYú.>Úæñ&ÿÒxáfkH—u.À6ÜÎu|eÔóÄXþÐpŸë{[Gà„úÙ·!2!a¸ö㛩¯Gl)=-üÀý¯×Ó6¤{·3‹ÊFí¤Ú°xÈgŽŽ¶Z«Û©³¯MÔªPðéÖ-¥tr9Ún™WæŽV®ŽÇ ,D¢7jáñÌd9®¢ã¸5ßGq¾WöhLQ|òoK>SÊ­¡>W;ì«–ÜŸ!¤VuA¡?ÚYʉòq7Öe=ô`Ôܰj¸ý¢çi›1rm|kЮíÑ>¦ÏØ»€Œ–´;Þ ¼CÈh=ù•m÷Ég›€•ÇǶe€mÂ"µw)Ñôq!†Êö´ZðÓÑs¦ÁÌË-±Û"C5Ù^Ør'¡ö%›èÅ%ä±y Ø2‡ìø0û½Já¨Ø÷û§¡9Ú¶|’ø•Qz ˆÃqKšñà¼q $¬w†“ †f¸›âö¸ÄWÉ¥(™ áþêŒtX|ÇâwŸÇ Tp§§÷¢à½D›l8‘9Û2­… ¡+h—ˆþ£©„û¬-ƒF ¥<™Õö·ºË0.Ü×½WmZ1fFbyçŸh ï¾]·äþàª.¯ÜÀ6È6ú¨vÙà^P®cšŠF|ô9x¢ð¹¾ªTv“¥Î®pQZdõÚ¢EßIt²ÒåXˆ¯~Až¦*½‘j”ï)GC´¡{§ª˜÷N½š¨¼5›½êÓ£±5’böj¹eƒ ¿±ØpH8ÉÞ!ë^Hý7qõ¹éL,w]í¯Û?É’Åw-ИK ±Ú\킘`%êèFO)’øt~¨pv¤]Íü?n‘øw—Tü”’IF´9ŠO&å4ø·üTiÅPRܾ«‚™Ò7¯øE€˜¶xÒ¬#Šå‡yeÑš`^ë\Ž51²ÎÕœ°õQªã,~"õuêÔ “pxÔŽú‹¨xp€XÔ U4­m87¼Ñ=kGúQãØì \ÚŽÜ•@|ÒniÞ5|ìt+ÀžÛIP'8aÔçi-E ©ùÊ/úçúŠ<+èª×wéß‘r3mR“j°žž÷Õ#©§Sbî îx–—¤­æ /ŽaD~"/•Q€¹h3ËpNs3Ñfâ4¸-¾g¡¦lîn;`Ìa5yšÞƒD‡>¸çlNƒ2ò5~#Ðf¥ÊÙ’4 k?æ=Ùô¤.ÁŒ(xLÒ?VòzkU3v&0Ђ¸FÊKWô[~cí¦°p`n.ÌŽJˆCÓ#*Nru–C8¢§FpF.£H¿÷wè>ÝÈJ\m<#§»”\±ºi² Q²!ÂÍÝöeÖ4,+“»c¸¥<ªLzkÉò „Ü&Cn€SN#¨Á׳Q޵¶lËî ¦cB2ÄU¸êÃÚ7§?™£B>'Ãôv@ü· ’æªÅc"sÜ6òäŒË»ÉjgŸˆÙî@<öR¢ô²fVº U_ßêϪtµUäPÙ6Ú[_-)çAp9ïB©Å( !£:|¼üô˜q2²s¨'ä+C ¤‚ÄŽÖ!'l"Ϲ0Ãý/œt¦-“ƒ‘ÚwÊf¸â0ºDõt?óyÅ[Êû§ÝúK9ÇtkêÿÚòßÏ´F·°zóëT7_hâ!8µß>‹NMý/Œ6Út‡ Ã"ݘߤ› jLMwb³)Š2 «b‹½qãDÍ¿64L°“SåÐÚ¸ëÂË/ ùLaÑJ 0¥Üw¯Òˆ5BÕlœûð ˾Ԍ)Â0`òè+R´Ü¤‚&ÿ{_\Òîã~ók’˜ÿ'wE ¡XNò¥ÜCê…Û_òaø$¤—¼Ýkû±SãMš3ã³r^h}“ãBvWo3âù´7æ3Žéª£ª±ìð e!¤¦{¶é%&6L¢ÒÕJÈûv(BðÁì»q’rœ¯àÂ`wñyæµæ‡F¹E5óPû”jÐ_í¢êŠÈÿwNµ¥œ ÅGÐîå×È[ÈRmß!E¨M€Æ ¶ãL1¾–ü ‚ %‰Röà»Ö‘ñ»çFÚCêù=döQ:O¬ï¬-ä]BÏ-¾†d“üŒt)Ô˜ò` ¯¨TÀH—é»öL’5èxc³å‚?vÙí2[ÒD÷n|dìë4Öçí‰þWh ÖéŒÛõ ,U”Ï@ÀÑâ)­M·I Ó<ÍŠ•(ßô‘7{µEüñÔÌ)4:{1áLe“;žž¯¢^ W~`½—\`â3ÎjXÉü;‡-]$Лz\.~ð7ÒÃ,’›„܉Et–‰ˆ—ãd3‡†ô¡ÌÊäkj%¡nߎôžœÚñãñˆo…˜5‹?³˜ƒ- ÔjÈÀŠA¼¬õ ¿«‰[tüÝN´dês£Ù2¾n "V Úm>a Ü“¬Lõû:[#d•€ñ]P[„{â@Œ¤X3ùÞBYe¼À_NIqP áa3˜ÛHõ³Ö¿‡ gÄÿ;…¢ÚªÓLïûí²U\+1ãIÕ¦—›öÑPýY‘ GÍwûICà&xKìÃO¾Ø„Æ!hÂÃ:%ýnÁ7ÑFq)|5o¼rÚ(Ý®LcÏ6¿5Äýzs£ó&ž¿` ¨¡|“958ù°àTºŸÙ_ÿ[TݲÍÚ½üó)‘w3$‡,ì¨÷S ûb¯![®çãA C,`ù(ã‘Ú.=Yãï÷¹ÝWSî‘rÐFß`\ _Ü¿BÆŠ½!”º“ÀHü}Å‹ja{¤ÿ­a®=Zµ<¼b*8H`õ„Ø»î–äûÅÞ ¾fë!R£‰Q.í}©»¸•Ü…í+ßù%·¯ ôSCþ2žüUŠÜ–…¾wŒXñå ÍÙ´E×@ª «† endstream endobj 6853 0 obj << /Length1 1630 /Length2 8618 /Length3 0 /Length 9450 /Filter /FlateDecode >> stream xÚ­weX”íÖ6Ý)%=twƒtwwÇ#03C#ÝH£ R‚”€t‹t HƒÒtè³ã=žoÿzßýc港u®u®¼Ö=ÃD§£Ï%ë±*AÀp.>n^q€ÈÍΦ kpé<µí\A€G@‹‰I ´…ƒ `[8P` t(íüü>111,&€<ÄÝ rr†X õŒÙ888ÿ-ù­°óý'òh 9Ì^@Wˆ» ¤ø_ê¸3àräµuLUµ”¬ÊZ†e µuèx>¦bÐÙÁ0 À¸þuØCÀ ß©Á¸¹da[Ìhz4úØÝCœw Ô ƒ=>@0€Ô ¬í]=~ð(w„ü È yÔp{ÄÉt 08Ì r‡½ê((ý'ÜÙþÛ7 ô Žš{Ïß)ýÁiQ¸- À>ðß¾ì€ÌÝÕÖ÷Ñ÷#™;ô' Oìôï8P “-ÔÁƒ=ÒkÚ¡ €9/7//àñûŸŸŸ,ÿF£¶‡8üž}¸-ØáqØþ%ø Û{B¡=þsÿ“þçùÏØ>@{¬o3{‰ðçoßÀ«Èrû†Ì»:øû"Ü‹k Þç„´eD/‹•ÙÜVFp׊ß7ûNï¸ß­©±¯tº²´¿¼£zÁÀÖ™O¸ÈÜ*±ÊcUŒûf×ø¥ÿá”ÆŠ™0¯Ñúʰ®žUÑ-õh«ãð‚-˜Á+?˜˜ñÜ/Ð>½&‘äA“ª‚]æÔ­‹s–žÁþ¾ÞöcÔÎ5JŽœDL& [²ÀW;tip_èi­ý=êµ—ˆ÷Š„nA92÷nZÓËpÚCÓ^ÙzÙ¾èP‘ü†çO™ÞŒëåôÀKõsIù ßÓÎ(Õ³vÕñÐw]:5ŠÐ±fzÄc‘&”4Ò*QªÃƾɠ ä(a#3FË~H¤ûÔíøÅ˜e}µ<™üB‰a-‘RÐoŒ/¡;õ߬#S'<¸O‹—¸­Ñë^ÁüRGS~‚`Ÿ0\õÚ»AÒ\n#›Òõâsv¢§e†¾ø±­/˜^³ çZdú±&P‡÷}—qRUŸâgöau´fèÙÄÑ9?‚e=òõJGw߯ðlýÀ„‚¶¨ËÕTsÐE¨Ùš”ÆŽ$éZ¤Åñóç“5¯ªãh ^¡°¶›)Õ{8»MW>u²˜’Ó2³J4¤ÓßêuPÙÂOBê½hÀ%{”Š×°¢2ÌX”§6_€NF´BRÄ„Y·ˆïÈ ä¯ˆMa§—,䆨º‹äÁµOÆ5³‘{ìôy´…íFu„pG¹¸ _ë^ø6 ¸j,á‰SÒ Xnûfa㔳gBc_ûå1wáî%p[ËËï§ú;¸ÜÊÔGiÓír9H¿¢èÏ­õÌ$(×ÜT’ÛÛ/NœÔè¢Vtøs AïL櫌º¸¹Ím BI¹ýTTpñ­¦±öÞJùÒ…Æýí bÒ¤(€ÅÖfâIÝt"Dˆ2…[ ì2‹qöÔ3)/bQ?a*Ê~ñåÇ“Véçï4ËnÝv mñUòt“§É~&os÷éù¹¢Œg4ŽË{¦lõOœåÇ*ˆˆGËR røÛÆåˆÊf2b±l+•MMì}; $™ÓÑÖb+¥Ò/̬vTŽó8ÛoOV²³mf¸P¿a¦ ?´›¦Jä¿m˜™³»±ÝiPÕ[gðÿjz9N‡T÷â–³šÇAŒ§Wk2ëP:%e{¸Ëq#ÆH¥È)åÚ?¶ R£¼}ƒ¨ƒ¢²©ài i”¤ç‹ê+ŒÀb†Žç[?ìÄÉgyô}Ö-Ô̺ÏÌ2»Šœ•Údª$ì…ô¥›Z·9©_åø(%‘s×͒ΟYÚÌÒ'ÒJNT›òÓÞŽ˜®žJSЛ%Æz7wN7š2öˆNC‘X׿ûMÌÈX?XÇý²A#UÆ4uÅóá§ÊªGÃNãúÆ Å¬^êí',(Ö»¹ÄAÈ®$¤k¡Ï$&(»¦óg§(ŒÜ0+×›ÝǸ» xǘ볒°HÿfÃÿêеsYKÓj]èÚj*½1ÍÿÉXíØª³ß?ðÝ´1 ±Ä”#àú¦]{Â^ÿ“5DÎh¹kcâÊ«uϨjÛ ~VB‡ddfÏ~GqyÜ Ã7ŽtŒñN¬fŒ’óõSÊ:„Û‚Ë´¥–éåÖuÌž§u>,®-ñ¬­$9RZoÁÜÉf &5|ÓŸ×  G!ÊB¢#Q—Æåø•Ÿ3KnB-¯²¨’øµêe’~¤¨ö–Uc \N¬“lˆµBØÂ:¨¹Fòø×=ÑX²’S_Â!7^Ž «vé(Oté’|zéˆ=Ë’Ü$´0ß[¬eÛ%þzT¡À"ñн°³²gó[q L=,­ ÐÛur…ò©¤Ëщ-ZÔ¼ó0·aÕSË-8”­ÅÓgoååt%×ßu$I”‰úâEqF?»”'õåÖÔÇÈJi)-ri“Ë(œìÐ}ûªìÝH´aŸZ’ûºünÔ…%*ñbÖ{*bãÙÑõéõGRНzÛWŠ«MS•¯Ç•ÚÍ5hÐññcø‡]¨S–™Ñ>ðËû­ºæÏ2Oiðú?a-czzÔmÂÑ´´J.cYÆ¡ªi 3Nàt³.k÷›ø #KkC±–pïOÔhØKÈuæ6­”nvó0Ë"ç,Näãוù:ySݽvYÛ6q›AzˆyJOi3¹u û¯Ý¿}™}y䄨°|Ô€h¨»Ç¼ÙF@Œj9›§3ëòæø8[âzVJ/.ájqnõ(ƒo/Î ûžïÃÖ5 ýWŒý…)úë95è…-=„â×ò\ kEÑz®ä‡‰ä¾‰›zdU¤G‘!Ѹ9yt%gö©–ý»œn—02yÅ¡·L§É"D:æÓ6T^, ©¥(ÛI#M€ÂvÓd ‹æ‡^õÐZ7·{ª'2ÌŸÍQ…–˜Ìj¢³|p{,}‰äŒC Ì·„§pê¿Øh›c;˜vcÄág̽z³ßÝü$P«ùJtd#9¥ŽË¥ý]£-Â`—¹û0A2$B\$æ‰yWP]ir‘`÷d«ÿ:qñH‰u£XÅQ}µ‹Ý6Ù“AmHþ6§c<|‰ï'ëRº(ßC#Œ·$P®Ç‡p€8OYÀò)å™T‰w©I·)]N/Ç0´©¯ñº>ÆEÀLú:K¹„YxßuN²´2,‰+”E÷-©:Vu5NºëëræC¹ 8uKâxji…j÷06á+ÎjPÕY)[ ùu^õ/l"{›åÓõekìEâyãÁ€[–ã>b“¡àøÔ  '>!K¹ û$¹Á»`;˜Ó÷ IÞTIxA“„‰„ȤêTþÙûÍõÀ?6AW¡FuÄ–$çYMø±„91ž{çum,aVÏ)¢0`ùM½aóä‡)›*'¤ŸAAþÞë«ÂâA¦×¬Fû3§ÈÅ7w~C{›Gü,8B|ö¨°#—ÅéÎΫ]vÃ×»¤Ñ¹%œÝVðó-¶ފ_—ÔrêPs¼‡EW݃&ùìu¿>T5µåO©Y]'Õ½‰€§SÓP|{ýÂâ!ãZüH*ævªøÙhÖ—ç„ËÑ7ó[¨ef?ð0/™Ž^x\Dï=µ×oî©¡ö‹<§î½Y’6霸â3)‚&Ôë]cXÄ<[ã¼> -ŒWL£#:–ÝÕþn‰òÒiHõ‡e‚t .L[2…i½¢‚õ"”Sº?4–=þ ¸Kwt±Œa+»±,Æ1Ь˜¡ï̉:²|z¨H٢Ƥ˸':X:žíbIÝ„ [È }_1{² ²ì›ø`†Ý-oø:#žÊIæù¤ˆülÆ„©Ù‚F¾à–uÆNB@:"ÏBŒ~·6¤¬Õì–Úói%+BÍ(wÇ®UFHZ~×ÚÝ7Ïá»F†Õ$µÃ›€ÙÓ%Ó5¢0ÅÁ[ÙøÏ©_7Q©ì¤œ•¶Øg™^ÎѲ¸ËÏâ57¾öj=SögÖ •>´UÅ=1UlñÎá!üÐàía 6„íÔ=ëÕ/7.V¤ˆàÕ¹ò;LEÕѰ¸UTÎo˜Ú¬mãÔ YšEí¥–³Dÿ|Ó§x‘ïcË)T·ÞZÐQtÍ/‚fƒô—K£ÚU±*¨ü´ŠõJkº%¢Y~ZÃ/ï_7Ö©Ö±Á 2Óþ´À¥«œ~©sèVZ6ÈÉÙ7?@vPÙ·®d€úfFC–𣩕SxÿyqŠ^²ÝÚ |µ²b§™ÎÝiFmØjo1×´·M_ù)ú^”Üj|#”÷¨Rµ#Ÿ>#9?’R|–tÖÍ}¯:Yøõ](ÚFòEß‘].0%2Y¡&A PÆNNⲋ v‹Ù„e."hËÅüÒ‚³F]¸uSNá°?m!Mé”›ûD6hßïMo‹pâÑ7´¥ «9œØ'„ZÅË‚Wœ¶€gȳZj{sï¯ØÍb¼ê0›ÈkæŠÐ Ò¸ýåÃpÜ(†:Z,eIÉ,ƒ.‚ÛmmºãºãŸSÊûöè§F%GiÉ)uóSlñ¥âcœE–èŠe¢wõ>Ï{GÄíË0_¶y¨ÐÝê¥pVÿåH$aN8rI‰9¼[,ÛM ?N£œ×XüPü[E÷xñ¾'(Òkˆµ–æ¡ßkQfräŽ ]fŠcpÀp$eÍ_‘Þ´BC!ÏÕЂ1U)¯pG„Ñ £Gó}fÂëÜ«¶¬üÎ2 ÏE{”у |~ oë˜ò_XA¢·˜ïÑj¤‡ËiK[£E5:c;ngôÛª¤/µ}t x!m.¹‰…LõûzzN’×óF.æj¿«üìoÕ%Œ¹àcV×&¨_5›ÝR€:[ôPå&d홈ßsç‹3ØIµ©{ÿkþ‹Ð¢3#铬Œoà|€÷ÝÂÑU ¹îrCEåðnuïJGª Ø¢Jwµ­2î2`¾u€Mˆø­N•÷ÒØ"¹cx[x 6­òËÎée$NZèóô˜÷`ËZp‹ó9)ôZêmjI%x ×!ê;Q]&}GçÃ_Pè9;!tægYkY‡ ÂÓÏ„÷š šl‹\"Æ·bÁ~˺ónElì×*è\ÀÙ•”":a¹Å†FOUúÀ(¯¼A Ö ð•Ojr\8‘KEÞ˜§y]Å7—Ò5ãȳÓ_75¸©xYWoÈÞ%ñè¯qŒ;èÙ¿·¹ åù2¤ÊÛWŒ_™}îN]á<÷ªàÐ3q‰ÞëDì9~œüû«1: Jr[ñ××õ”'"­]¯pÖä6p¦09ÐÌVfëš”ÞÞ7X˜9ór·:O¨·âšE —á+¨í1HýxüѶ\ƒ³ªõ è¤#BZÒæütgF4†Ø \£”Uæ›Af¯XyÛûì“Y(÷ÍcF«ŠljùÝõŠSýV¹!Z®î–EîUùe’põŠú ›6°>ÃT?.!±(Ôdø.ƒ¶÷;U¯æt@Do©ÕؾuÇãç™ 3oŒ¥Úò|2áàîý#*4{Œ„öuÆÌ_›ÚGÊšW3Ô?ÙÒ«8]îc2 @•óóæ{¬Ÿº¡¾f}ßÒXO%«Ds™4Õ9¸£B~Í }D‹™PÈ©fÂ@£,>Æ´Ry“ä{«ë¯ë”nhs2*œ¶É·>ùý°U9óY­‰0¹Ô‡©!GÕk — AÎ1‰žÌôíZ˦ËAâJyj:ÓÙêÝ1NKEÂdÝNœJû%_ŽRý+@ºîÓ>ýî¥öèaeÞÞžCÍêj×Ô3?_Öw—ÇU´ÌÒÖØé€Ö=؀ܤm;?¹¦œXßÐÑ9Yú¡3õ'zÄ¿ý~C´õ*@ŽÙª‚⭹哩ž¸ÊSmûô¢wíµÉJû0·œ•û޾Š0§í ›–¾œ5)Ñãµ:È…­ šêm b(Qòdõ„Òù)*LÙ“Æ3?ɳ|ŸMòÒ!öÙU8Z5w N'n¶¾!j4òÅæQ)܉a¨Û–¨Y_ÔñÂ~ðâñË$F®.zvÙ`Gç À ˜|û¦BÜ ×ô«À šËA?ཅ)“‘}Áè••t˜ÑÅ÷è QÝG¸µðFÔÜßýn>¾¯M #S^Ê@'©ê!qŽ}·ËrCyKP8ˆnÒGHžšlû±r§«Fy-ŸÌ4–SìuŠ5æüs&÷û°dÉ¢YD“ ÊÛGg¥ÄBݶ‘Šâ+Ÿ4_)‹K·léW†? ¸>JuL¨¡íuw|±¸!#›»{3e¢õ9‡ý6*êF…š²¦Wã“}îÆy?-‡!#:I1*Ž…Ö|=ÛÁhÒ1çymôIÍæ‘(ú~#p¥˜Ìšh0¢°¯Ó®0OÛ²†˜Ì? ÅS1jœ~Äĺº-Ðèo è ëHX¡Ì½ZaaÆxÔ†b‚æ6H‘[uj@Ü^.<ЖņcÓ ;ÏìÐÇŠxغ±ÙOPnaÜSÇžé*Eë u6ŒJ-VåºäéI[ïV…tæóžçNlÏ-ùñe(Тú ±þw§nˆ Z¾ïcçÉÙÁò9è9ɹћ&Ž­*&‘Àé¥3;]³ÖåtŽ{X+槦ȆÑÜ4 ‰GÇK­ ­JkGQ¦9,ÇKLº~Eׂ¥¢›/4œ‹Æ6)w˵/YköŠAäÛe X®CŠÃ;Šœ†"Ë€V¬S3Q‚Ým[5F/a=2ª?˜ÀTßì«ýxb •GÆ!jéæºTüØöJëqAb{.ÓycsšiÄ`ÒËø•{týL›ˆû´Ö‹åe}G•¹™ì"âpŸ\î#¡»¼—á 6©ò¶$ºµßC76¾—¥qêðO{»–~K¤ß–½[ˆïAŒ>~ÇL~í#’&B|ëÄB‘J¼ØÆè\Y@Ç@§+|N§Zk…”òÉlåùwLæ*Ô‹Èbö¶*ÿNKqsió³c©¦þT£³û•P Ðq‡¼á]o~PªöG'6‹ô»‹ätYÿ”'®7-„9Wß´Y»l‡w8lœEêýµEÛùu%­Þ¯µFäû·ù„‡âž6ù5¤¬Ø¨ZÔ¨ZøÂve9Ç$ø¹… ëM©7Wâ0A¾… ¼|$pÔuBÌ#oÝÄêå¤zpjW¦ÄÕ/úâf…hV›ßûœ?ƒô-ß ×(‰‚(qa²‹õb€Ç”dAƒ–v|béUp?ç°~ì3s^êÏ(lfÈd«5̃-\Žq¡g»Ð%ªÕhŸmòÍ?)+™¬«jZÐò2ökñÏÄ¡y[ëÜ&?óòD¯Üñ“z,šopc¤}OPäljˆfv›ù^?$+8¥Ð«ˆÌ¤`ª¤¨ü`ÑÙn—Uáì«®ÑEÒ¦Pݾ So²Ç~•Ë>¬òIÞ{˜²ã¯Ælèׂ[©+Tfæ÷‚wèÙ:|ºŸk ³™ÿ<Á3 Ø4[.!CªŸ– *¦¬øüS¡M¿¢†Q[‚#Š^O¤8?”Ì ÜRÆ-Ôk•Mó:’ºW`sd.xv:¦6± 3ØHc^þx¹GÙÍRaLÀ!`ÿÈZ#L%"ßÜe54/ðó|&;âònË‚w|ÕîúŠ•D@ÖÖA]à!€TÒòKJÁ6ƒþú!‘l~†½·TK–¡mƒ·¬’9¬½AÀÓLF\Ä8,6UjhDìúr½ Ù h ãÅâñ«vºdBÌm†K§0ñ~ôœ'¿hÿpçcÎix U¹xñÍw<=~váXÚùƒð¦wœç]Æ&´Üˆc;+–¢õK®»PÉXmdë¨qQ/ å)hbŽ5w£xÙxEJ“" ‡•~M#g7}…}¤³®âòV»U© ¼¯C7R ¹™Ðb^ð¨?¸^}H.)ÊЭ~å9•@T³Oí:è-;ëQ~û¬—aÎÉ…B‹˜åÂÝÂíÄ’ƈey)^½&x‚­ü3¹ðk ðƹ6¯ÇzLųTJ_Ôp|=¤'AÇ3%ªÙ† X­ïpÕVÁ7“lα3Õ0Òuv®»Ž,¹×rfÖJ÷OqLnøò\«ÑÑ«Í$ ?¼ ©Ãè–S^· øÙxñÁ}t¾Áö{·Ïn4›?”½'-';€šü«X{1¡|D}Ê¥¾“3çí,>w¾ßbP‰ KW™= ÉŠáaë\VbF¾ -²?îç]\tÄ*Õì(-àŒƒ@5Ä›ÆKõ`õ³mô.Å@ÙfX†FrØ&üŸîos’6$6LI‹'÷Ñ…'O µ¡¾%>2rh@<‚³_Çê‚°O]w‡¤ò¯ö™û.×YÇÖävzÄö¦#8±Sýœ?ÝP¥Æ&—ziôj×ÇÝ3´Ö]g0°¼¶N×ëÓV”’\ãÓ½6g2ÂûX;~ô® kxžmh'âa¶ƒµoI¢ƒøb'ädÂUyx™4›Žâ¿³´†÷>Ð[×ÙÎãΙĿ¸“Šk˜Û /·|‡]¿%‰ §Ñ<†0i†Ý‹Crêi57Ôw*˜qu*–˜rnâ4RDŸÀ!ô¬çSxNþk|ÚôR&˹"F±ôUWöp<Ï×%ñ©l|M—¹‚=ÿõ;”ïg'µþéau©×?'6õ¿-“Å£E뻯„Èí˼õ|p‹‰ÐÔ›¨ÇÂpnò¦"6Ìk„¶czùúá‚)‹™x¶!pQô„6ÎÄH‰²ã÷|HuÁO¸g¤S°µ’©à*ïê‹)}?_^#•XýºÓ‚13„ o£Ùä~^ßqg.IwŸ¥áí^}ÊPk‡îDìÿýŒñ…*yZVb¤r:d&gk_Š;M©pJü­ã¾SÞötÚ¤¬±7oìݧÞgȳgÔñÔBÒ¿¯±kxh_°LÀÙ³Ühi“„º¦ûõ«+þ= 7oBŽ!A°Þ~½ã‡¨g3—í#I›Wî‰T=OLBóæÊ–m.‡n|p7­™òCçyã„VÇ¥O‹›Ù_ÍP.(YÕÓÈ®rÈgœ`ÏZ(=¤cÕ±®cÚ„$öes½e°]Ø÷XÇô‹-à ŒIÚ°~×TŒåKwYG!çéÄbE¼Ð"•[Qþ,ÌJs©¨Î"ÑWØú6ûdX¬E38ÜJäÇ¡ŒšØ.¹0êмŠ5Ù>ñ®B³Ÿ`b•eV1ýgÄúUcË•õݽy{QÏŸ˜³¢Õ£uéEÖÜa²®æ/I$¹Te‚&’ö¥¶ðÅØI<œŒœvëŸ}!¿"Ž0¶´^ÒID«¤/XrîUÄ_×unÓL¥“äøOðúáÆìøæ³uyñ<•Br ±z×t^[ÀÃNÑ|öB= «ž s¢ѯԛã|G,¿VyVxNºŠ®ñv€'°Ä€¯@q«•ôG¶ÉÐ ¤Uª'Ó …]ð{ß×Z—â˜üU£Ÿñ\ä”͵Ì†Û¹ÏøøD«žÅQÖšº YdѲO³Òh• 2>‹ NhzˆSÕÛup1îëz¾ZyƒC÷Y_<ñ•áWϦ’ម·au¶äî«:Rgíʧ;ÏB¤¾=°_k]Ðá_+†¨° ÅW­ßô?+Mpk¹Á,Å~´ôKKÔòô¤æÏeÛ^ã}j:šäW¦=¡¾À¸„Â'¼Ü*ù,ˆ¡í»‰][ºíd÷˜EXèXÄÑ𠼟ªI†,†t¾(×Þ"Deù½Ÿµuq@Í~Ï|ÉqýŸÒ9$m‹´É oq™¹¥°4L“N[ž‰*œo7Æâb›^]0·ÃÊÝÎÜ…»Ÿ;€TH›F&vôÔn¿†7¼Èʽ‰J |¾+¹uÉ´Ë—‹„|îÍB!÷g.íšþÆVð©'Ÿïë\þx=Ö“0ÍPL5¾À–ºûªÂA‰öÓqÄUz°È>¨`ðuv/^§ôMeŒÒgòÊuA_•4yp8¾ù„+zÿh«ê®ÜÈ÷fºÌxoè^'‡§§uÌ Oû±ÑðBû¬ŒÉPaÉk=YÙ]$òZyÔœ·5íBÏW"bS²´²ñ^÷dIoÑÃsvý˜1I;Ù2*Òé¡5·Ú!µN_–Þ.'ûR[ºÙfW¬¤€:Û6Ò©7çý›FMÂKýnŒ¢5^6àãÛ+øÈôBÓ# ›‡Åeîå¢ ÖmHä¦Îü‰ÆïÃ’ávº–›Cœ>ì*í·6_g7Âd‘XzÝ¥Éñä·t£ºý ]ÒŒ¿Ý4â‰ÞŸ1^ÙÅÛ ¯cæåo[S’s3ïDPÄ6b ³©}Sé!k¨ßÏ»ÈpûIRÝ÷jþ8þ%BØ-åÉÿ(ÀÄ endstream endobj 6855 0 obj << /Length1 1608 /Length2 10842 /Length3 0 /Length 11669 /Filter /FlateDecode >> stream xÚ­veTœÝ’5î\Cãî‚w îÖ4îNpww‚;àÜÝÝÝÝ÷½3sgÝo~ÍܽVŸª:»vÕ®Së¡ QPb4²1‰ÙX;2°02sä̬ ” ¬e„l,Æ/Âö G3kG7@ d¬¬... €°­›½™‰©#€ZEQ†ŽŽþŸ–¿B†nÿéù¸é`fb  üøã ²´±µY;~@ü¯/*@GSÀØÌ–WДP‹Ë©ÄAÖ {K€‚“¡¥ cY;€hÆ6öË@k#³¿Js`üÀtlA@³k W Èö/=Àdoeæàðñ`æ0±7°vüè£ ÀÌhédô»±Íß„lím>"¬>|` 6Ž@{3[GÀGV±ðt45pü+·ƒÙ‡`cüidtú«¤¿}0^G3k€#ÈÕñ¯\† €‘™ƒ­¥ÛGî0[{³¿i89˜Y›ü“=Àdb`od rpø€ùÀþ«;ÿ¬ðߪ7°µµtûû¶ÍßQÿÅÁÌÑdïÀÂú‘èø‘ÛÄÌé¯A‘´6¶°0ÿÃnädûŸ>gýß ¢þkfh>HÙX[ºŒ@ÆLr6Ž)Ôÿ;•ÿ}"ÿ$þ·üo‘÷ÿ&î¿jôßñÿõ=ÿ+´˜“¥¥œÕÇücÁ>6Œ@ð׎ùÿb ¬Ì,Ýþ‡è Týƒáÿ"éhðÑAk“)˜™ÿa4s3s)˜9MÆ–=úÛ®bm²·4³}hùw ,_¾ü‹OÙÔ haýWÓ9¸þv¬þ•ù‡<óf’•Q•¢û×múw”‡êŽÊn¶Äþ£Y£ÿ:ü…!$dã pg`ád0°1s~<6f6;—çÿïo –že íÍ\ZE3³ü]úüþyÒùQk Ñ_s¢äh`mô1ZÿeøË t²·ÿPôï×þQòžÿrÈDXœ³ò˜§üLu¬ÄÉêÑêê`ì ´-ªQÎÏõ)·i÷N Ùà*Õ©d¬ã~kr›=²}Ý‘¢ÝèÀ¶¤jOåz’Ñtæ~Z¥üÃI·ëǤ[„œz¬á~>#³¥ÉÁ¬º»9ò]Q·ð†hì›=Üù=™s®&ù-Š0¹:«­ ½2ïè˜2þàþŽªg°¿¯·ýºs‡€.3ž‚ÇÇ+ñˆ$ÁÑMßþ¦øêÂPÎ8Jì€a|¬ Gì ‡Ú$ 2=ÓIác[Ö/yÍïãJ±ŽUé8ÅbÔ´Ò×¶µë]”„ðJÇòÙŸ‹ ™Zü8IÒî¾ÕšXÕR|ïá¼ 52_‡4ñð´GxŸb§ÈLð2ïaMe#;xA$t†7QQ/GÄ{iv×Î9°z“ͼøb££6ñ ‘U$ÃÔDïÚnXed‘CVõ^Üղޮn42@è©~ïØ@4ZÖÝîÐRLÈ!®Ô?#C›2 -‰éSœ¨Z…ý9ãíì4E8µ)š=e‚ÄÂQØksÊñd è(öyT—>rtÍÀlB8$–ƒ@¬œÇv[sêÒö(4Á‹Mij=GnJH´A€¾ÄÃ$¹be…ÑÓ¼‘°;›K´âæÛÂg߆˜!˜?»Ê‡à6b:ï¸èÚ„.k  ½U»›’…öÕ¸LÍx߈Ãôë*¾ ‚V ÿ”iµZ1ÞËÈcB‘eUñ/¨TJ içO?$U–ð˜•@i!¬PÔò݃"ú¡R3{ôݽ3åg›‡YG4ËTNr,Áj|+íhþ$¹H(Ä$†/”9&Ð0…à n²˜õ”óXÚFL¦Ñv×w…Õ«®Ì6S2ìÆgà'îd |ì}ÙÌ…?ÒÄvYZHàqÀµèô‚|†iEi±AoǸޮ¥H¿Ás×Ìûa¡0ŠêL°ãYcyGã‚{@²„à·ÃÎuá±¼<6~oƒž*Û1, IÝŠËBöû¼Z•<ìŽѶÄ>2!öµG(g¬e÷\úøþNît(ØljJ˜á”T UߪH4bÊZœ¹òç“Ù:|l°½4b ^ˆ±6ä/·Žü²,"ã­ß«P˜÷ó‹TãöcŠÆ;¯wž¿VÄ…¿ñ¬áyU#jC²qMœpoZ»<é³ÜèXM'ë>ÕUèH@ü,¤Ð`dmì4%5"ë¦k}]ÎÏÕ–®n'ó¶ZÏxÕ^¹¼jáXèîc Jt9Ë6%·áð ñ?›Ñhêa©q›ï ƒšë·r“p’¼»&¼×KœSU«ð<šü%™Z;׿‘ VˆµÖ–ÜØI”¸N'ÜÕÙ»!êÈSˆ]›@†×®HÛü€s s.zOIBýÈ«èQqè‘^Q&z8Ì¡'›4š€p_Ÿ\ˆ}ñ£D¯K¶©»ÓÕ˜Ô ä9µÙ; »»—*Ù“ƒÉðP¢¼:¨œF©"NôP.õYØ=^úÕE-ƒ§¸u×ψ`Â÷h L=PìCҀܘÙÓÔ'¤ÎPíe‰¯F…ÿÊx‘É¢/Ô›•ueLfÖ¨:¼=ý̬¼~cã§&Xî•4Bü*÷¼ñJ~4î½½–0ªÐeöhr} Ñ€/?®xÍî•Y·•Ф’¨ZâØÐ>n UoÉ©ÿ‡{’üÝßÃSNö*^yÖÎ’ªØãÐ`cufl¥uÃí¢wHŒžÁ¦u«^Øá 9± ã ÔÆ˜ÖjѰÆOY1A#`g˜ûXé.OFœ»SF8áyâ\€ Æ¥ýj•ÿ7ï%[ IŠû‹ón#.ëˆ>+”¡‹xHn˜ÉÖ­?ö§©Õûƒ§ƒî+&*ºƒ¤ „/šŸgüÑñ‚¾àµn˜¦j¼¼±xš ”ž`×ÃÑà Y©œF Qðºâzô‡‹?Ùw`˜#è>,aæ¨Pc×¥„íDT› M(v43xD¿÷{â[©Û ²ò¹U¼Jýò—Eµj™Ž<ÕBn“sË[w ‚¯Ç(‡Júƒ5Ù?ºnºˆi]Q ¥xsßq[ÅÉÍ$}ÃOpX½£i—$Aÿ~K…L¯‹w[…ÑòÛÒKݧÅÒ—HÐlƒÖôÇy…’/6¶FÙaJ ö™¡R¶ª`¨Ã½×õ—!5V8%à»C¦ˆ·£Z3fðž/«(–ú˜Rî ³†(ór9õºa§ÆËš¨5ˆ²•q̹zëÒ^D"„DZ¯ëÉÃNëtƒ/ø3}žB½VJ7ã°;4lœÇÓr~“«H?–’g9ˆ¬pp[d)k]jP´8s'kNÁñãÂÎýŒšXñvÕi«û%Ƕðòèpù^Ïär¿Æ÷ƒ±>7Ÿ´[mŽ;ª| ‡8/Ñ8S1›(šždÄvL #Uyu@ÃÁú>ñe¥]†Î™Ø1{ĺMn)¹øy«;¥Æ¢–¡ƒJ½ ª¢ß5æÜs4Ž¢R«ßeáÉyœLi¨™JARyA!³ÔOú[ÍøxKÇLn–¨”^‘ÑY'Š EÞ•þ÷`Ãj „o384\e£À˜;Î9­)»c_îHõéÔ+Wó‰úh¼Úéš#þeN1YÃ+D²"*0q—¨oz*ú;}š,ÛN‡§™ï'ä ‹ë3G JØ´ 5ç.0‹JÝ=y9gÏân™²+€”W¤)tBüÀ× ñ¡` 1¬%Î/3³¢\³$Œ„nñ¸út3?ÙìÊKQƒ\B÷6Šó쥴öE!µ‹x¦ùKž´*óÀcäÕ “µDÈ[”ü³‚+㪞+k< òU2¦ÙíšÊ5í¬¡ŠÚ<áeÝà×8»Ç."¦Br€vN¼Õ.s•}T5ü³&âõÞ¤þç`zFΜ—„× æg)£P|XËõ ™6ëI¿[mìó å°qÂÃb‰ú8çZkp÷oɇ$ÛNØÚxFþJµ(;gû²®†Êq˜a-—ÑÃæw+¿YTçYð"Ëöq,Ržz{n[ •ppVØUÀO€}?Úñ~{è÷rÉzH U’~¿÷IѪ7dQP:õMðtyêµü.fÞ7v1»¶¦€ß«µ—]•ùÚ/e».õË3F¡ž¡.(·ñ{@V]Ø5OILàlxß`’q)µK7çóήœuAÑZ/÷Þ1[ô±Ï³¸N Þñ¨ÁÜ|ö elÜnüt~Á'A†ÕÌñ"i|°?>UpŽ—Èáø'À\ᤷ<¦JÎÖî°o´Ewöƒ8‰Ù#¸Å/Æ67¨Ã¶T^Å9Ù_«ï«ùÂH÷÷ PoP&†¾›SjƲj壘û|®Éœ‡x‘"Ú{ãzê÷ ¿¹w’©¿ª>YO‹>{n܈„CPÓ½]9ŸEØÚ¾Lö:2.½¨°½é«Ácv”ëÚünH ©°×[qøé*Õå1•/Y¥+Se3xõž_B%0!#+øö ªpVËÙr&ê_ÐÖƒî`³3‹#‘jEjüs‹NäY6±kBî"”˜¥ç à³ æ0^/ú"½<ÝðÍìû×ëR§XܬÏê|’ðpm¹mØòóg)mÉS‘ŠÀ3 ÁRçݬ9äzã:öˆ~ªË wy|ú\EÛóŠÚ(<Kz°lsŸ%i³¤^’#—]Àï'6»ñnÛ/Ë’€‹Æãñ_ •Ço›·9®Ûa<‰¾ÛD Ð|3,¢Ã³Usä}uÚFË`€kËž²„‚‰¢««Ž¹08ßwkÇ|[3yðÖ¶(ŒD¨¹X;Õ!ƒ®bñ“Ï·ˆ¸šê?ŒE4—WoFŒfœH/w—ÌÃÇu^õ!¡mCÕ@žïË÷!Ü:„°ozÌoÞ1U#%çË^n+ßc¬ÊW€ƒAÄ`OVa”Á¼‚õ,`òëèâ8C³±,V•ò¹¹£]s_`MùöiÝ‹¸R3$^z.3Ï’£W50r¥Ž\W’á¸ö3°SD÷aúçDˆpz—Ék4‡ý§³{4—³Å˜!•.ˆK:šÒü~²äe&-«…»>M ÖlÁB®5V²¡Å6®QGåá-i½Q‚ÌãÒGÒ'¿«xLlá`ÂM¶å%ok{Ç–õ¦PÏó¤pðE?'†çÍôha!~ÛÓa\èÙ-ô Ñœö¸Wåù·t½òÞÔíRÚ}{ Ed«¦¬ }ýÁltåÀ±œ2ɪX]Ø«ëNé½}æg³7MoÆY™E}<Û=J8?í(º¸¢2Qkê$4DÒ$y'…”ÓD»±pWQò| Þ_F'XN?MúÚÈ2º‚çUFŽi u¯e ¥ (‰P½Ÿºz&ʰ…•¥Ç²Ë{(™‡z}iÅØìS¿)ÑM“k†P8ðq˜ZiþÄIä`¦q•äD…÷}UƔԆÒ‚0¿ã0=;¶®“µ˜ê¾§ÀQÍu‰Q ’¢Så÷Ñ Rù23i¯ð˜|q±'‹×Œ.Áì”=.©ºø:×Þ^¤Òøc`ÿ}U› ù,'aÞ{סø{EÖ¹ÆgÉazêjXI‘}©‚ùkÄô³çEäñ¨‡Gœ„á â5ÎÝ«ûuÎ(‚ÒjyÜßu¯þD¥Üöì{V×ß(S8&/…b •λ‹~Õ×ò]Jç°}|F º'† ¦Ó~‚i ŽÑ~‹|Ý¿ŸU°JýT'Yu0€LÉR/ÖËŒ  ”üfG5hŠïÄÑ‚2^Œ”’ÒD2ìÙØÓŠRßX„ÿf‘§8`ÍFÚùÓkØÓ ;GîxóæzO'úàs¤ø–FÇE=¢ ]¬¶"’©'ÈM’Ràµrl£ÛÑ«(œÕµÆûû£ ¼Aï<#·q¹VúVÚ"ºÒGszÚæJ3¤® ¯S‡ï%æ–½+i0ˆ ©Ó?Oß"if†,R½±€<Åcœä2­“˜¿Ç˜ãY˜%s€èüvo5þ+"×›2éC•hÁ–ÍAÍ™F”ðŸ®ãŸ1!öŽãntÕÏ€|²V!Ÿì,¡½¸š†Ÿ• ÀRle79Êb_¦AÖÉ¢àvpX„ Ãx³ý§dyÌáè…¶÷a'IòƒL¿€ Tãsu4ê†$ÍN?ËQkåeµ€'{·Þܤ¶<éþ”_\ˆvŽsY7=S_Cz7U;Ô¥ðŸÑ%Bü1eV“w+åT‰ÞJúGv+18o#Ùzø¬ã2|.]4—ZÈ´´¹žæŸ„3Ç’,‘ßN^Ã}X½{CØÔõçõ!åa¡ zSÏãO—}v¢]¼ìC*‚¾x€rû׸+Ecø|‘_ª`c^&u¾M¤¦Ÿ9(ùñöyqØ6¿¨X<.up±¶c©ü“ÂäTvÍÿPþcMRy¢jÓ‡!öN²ºE e)¨óü¶Lõ¦Rs³Ýo ¨Ä=ÞI‡oÓîÐ"bõðÊ‹jYû°rYÁ=­PÚßv¦\KÅÚ_àØï`!JÀÿ{ººEÿªÔc‡Ù¥ïIC4O9tø…;úʨVDçe™wŽQð¹ íF[9e^»/ÐNöé{?îùbZ!RWl·íuHzÅ)¸d‚öÙÂ…ÞKua?[jðw3!±K#ƒãÌN-¸UˆZýô˜n€yðe<Ô¢ó¯Ðˆ‡Iã¦ÒHic¡Z:gÓ \Bô/Ä0¿MïÂÿ€N¯Öpo›ñNÏÛTÏà(|Ÿ:‡Èn-öH èï¾­Ü}2\=ð/9=Ñ«Aƒ}…ÐM÷TÔ÷#SXÈO&CZ‹æ|žØ )\,œ_x¥cˆŒ:&Ö :o°Z@k^È.øV¥)ÿ;”¨±Åw%¥-Y©òbêŒDSçFŸÞAFÍVD×;·WúFO,mb þÿŽên«ýOÏ,úx|¦#ʲ|3ÌÍÁEÂG`1\ì£4C 2%èÉ,ôqs©¹áé R`üóâÙÂÂAý †v6‘ÏŒ–ŒÅ¡€*H° á“K\î±]g–-= qéÚßT;|¤oÎ\þI|ªãí cQ»Íéû&zÙ«Ÿº_/YI^œÖÖÜ|!cZÁ ÛŠ™œP9 /+t”Ê$d”§-ø[iY-Ïe|Ð5êõ,ƒy‡”ëL' zÆ 6ă,¿/?ë&Jôa¡’ÌÊ»Çi+Å'%øZ%]X0¸Þïk-äUм§\4½49f^´L]Mù£ß užª…e5GÄX‰«_¬ ¡žòŒîÃOŒ5CÁé‹<†Bgì3§[T¡ºßÉÄtŽKh:áÇ-*T¤aô#⥕&Šå¤oãÓ2x½jtaÄØÐgްRj½b(#qXë¯y¸Ç’«•mniËqY0".ÆFÊóàô ^X ÊCm¸‚þ 2véúÐU}]æ ¼tyÛ¬P¹Ä’<ú…¦7éÞ¼CIîê”%&J"4-úë¾´$¶Õw¸{)¾±™ƒ‹Ë§B8ê@ÉI;&^d~*šäWs¢óÇ~~`@·N¬¥ˆÏµ0»Šù_º{ÀMz*êà1‹˜ÛD¨žÎ¿ƒ¾ßŽU0ì±9¼=õîj^ÝŸ¾Hö|[؃ïë’_·¡ ´¾óž³Äህª©XVC¸‡Oוãò™t (lâz~[ù {‚iyÇà­§k4¶¯Ì'Jã.ã3Äò EÖ^òm…|}ϼ1þ¸e}ÃÙHÇ×Â+Ú?cŸn†³phÖL,"×W¯`¥®Ovì¿53–¢OØjÒ$xn?ûyí@f»`’<·ótO* îøñ™G±Ë±k 8Å©½BS’ïÎ1Ö5J 7}ª{ ¦ÏñŸcQO*GàôáÛnžojM'\/ªëÖ3iÔoãm̵EúJ=ãZ=ZÄ_¬ÚërÇêú°b«ryuÉìù:"ôÍšïÑØvz­†nK®ÞÁ.öùÙ˜Ýãôµ/ÍGåh0£„pº2·á—,?1¤bJ˜üJq¬Ê>ôد!×½?éùBÀL_Ÿ!Ö÷YÞq“¡ðË**“;”‡ïÄGáÔY—:;6þžH<¾&Øò°11ÆdéÉ`³‡Öë±x&²Ì*dÓ» .vQ òè-]±¥Cl’XO¬Ùf/ˆ| žÝè¯Ý…šØOX”€ÚÖq¦Y¶ßãE£ZhIQµÓÑãÈõ¶‹'9@eêMÔ]Žlü|.žc…^€yICÊFç4ÂÕM}€nkûT·ë(w $Œ}/—ñÚJ"ÆŸ0O]klÓUIºÐÕ5ÀOÄ¢íDàǵ7|TÄZØnÖY£.çͯ[‘O°Jùrƒ»¾å±TÏàmkYöx145½´ÛÙf³”Z®ëŸÃL_99HÄD(¹îÉœ“¾‡xâiï/ ¤ëåj›ò&vóoû«î¹` /7øì¤y§y} /éAÙ¯: -ÐF<¯cîZfÆÛ´ÙRì·$?Ô®éjgÀÛ_=faÍγ+ 6íÙ°Q–¨Üy#ŒÊnîNŸé ¢„9£é­çÔsôJ´=”œõÚͧ7²3®i”¸¿Œu'ß1]rÇKLèÖ•T#>‡ÀkÕ]Ùë«oisXôƒïúüžZV=ʦµ¡®|<¬z#òP‰Ô°ôK~báÊlíB!Mn‚ *™¾®™º‰o?Ûç¦óx‡/Á]ÇËÝÐ~f•÷¢ïÝï1 xŠóö…ñÛôgë‚~šŽŸ;BØøàzjÝ0 ûÈ]< ÅG&¾P¸v×ÐÌ$g1ØÖaÖú¨ f᥹AC´Œ©·#¨U£s£wI%â÷÷Ç3ÑÑÅQGSåbö³pg¿ØQ¾dœtAz(*ñe€äòYï>9מ7Žû…ßÝ)*Ê1Ú G¥¿ê&âä5 kÃõL"Ê jü)Èx 9×0GÄ5'-ú£#¤.>`_ßÿO~lå@ÊRÿsýLÇîð‘Ö„ÞêÏCió‹›“|KôûÈÁÛHѱ5©j†vòØëPFšŒÄ+ðBžå{ZIô2¥ V$?ïé»×jæ¡ÆËæ¹Së{,ÚéG0ý×H|<RXÃÎQ©é8¯~ÛÍC±‡æÈD•‹l–}‡vÉ"ÔCo"ç'àbçåë½8z–«ƒ¯EG<©á3*çÔ…2Ÿ †ÖRt 4êwäþ–lÏwàªþ²ÖM³¢¯ºÞ¹BæÃ㬻Ž)Q–Ç®4:€ë„}&#I,1™~\¸´µqÀð#– ñ{Tãx¤nßzÛVa_´™PñþU‘àʧ§=½ÇA¢_á¬á¹b|¼ïsÿ›iFa¤¡Ñï–¾åhèª_¯å€X†Ë¨é^¶ÙÝ"8QÙÒ:’2nÖyæDøçö€=ú”{¤®ï&+I¾‰Íõí“íK꬇`šzâC¢Ï&5®˜œg×ÁÍMãIzB°e­ðWѯUÚB2J‰h-eÄm2Ñ:õ)¾¯)͵—C–w(ª“7CMÖ›§‰ §ß»Í²P•u¸y“»Ñ¥cQYÆ{ °ŸâHË”2|]r|ì㺜\×ð àjìqK–LIÏ&‡‘T-*’7Ècí‹„ 5AÆ <²ÀL§‘@¥ •\îå}O¸õÝ[¥â½|èJJøá6”ýÛê]Ô.õEã«zõ·×Á¶¤­%ÝÈ\"']+骪’_cÆ_H~fÐpcŠŸÊ:ýô`~îì‹O™ä8ÍõäçWpÖ„f{+ÇíqTê?6—èNìCü£ÃÚ©À8·~"WëÔbºPr3¹\d§x¤Ñê²)1OÙ]w¤Ña¤Í2nÓG!­á(’×”|}owÐÖxVµ§QÒ’q‡¾4œ?䪒´9]~u U±JÚ²@¾ùæwûÐÅu¥¬3öÛöåšR®Êþ2„5´åAi6 ˜žË—þB÷• }=xkSIÄXÉyÌíáB—–ßo…†ÄÜu©ˆ¤™…Œrà½ùG¼™a$æµ^ïäÛn Wâ5$ϯôm÷þ}¢F ä_«&.t(ojÕ8‹-UäNY§ùU%ÜhÛrkaŒ~±ë{ë=ÁoQC)¼@JÂ¥ÙãÝUÂÍ@¬ˆ“æ”9âUò¦ßèÍíkX ŒÊr«‹—æ)»цï\ÌæYnídD¤`ªˆ(?bý+ lö¸/§ƒï ·m lƒýiPLR™!|röæ·+yŽ(uOl¨l¼eç¤ä-~«“£¬$Ù¤òJËs%@1 C¿¨C­hö¤sX¯EAåôE»–Û«M÷†¯öíÞ4a*HÊM<~ò“޲ ݬFGõ­Ëb†°lýð‚6¥oû9ÖÅÉB¦™sgWˆÅ§)9q\Åç¬!‘ZÊÚ[ï‡úGzâ'GïdÖÝ„cœ¹·7‰Ý KeɹÚHeYó}.? @½ÃÅç±ö–³ØÃ6QÌ'w“uÅÎÜ«£êSÊçsªñD²¨¨è憂w»d[ÙÚÝ™kׯu$ø£œ‹'%½ÞÂr‚Jôçh1YÛ–(Y"uóÖXu­U"Ù n癫“9¸´õ²hš—¶Åö´ùC†„-qoâŒùÙxþ¨C¤«NÀ ­ÓIsgÁ¹ýv5B< âÏ Bk=õ0Ô' L–¶ú™Öçda0Wë¹ZNªwIêQÞ½&*…¶9ŒÔõù O R±Ã>ÿvmšæ_ „Ÿú#÷׃ݬ÷¯H(ù”ìP%ÅøìÌݱß*`¨eøÏ[MЬ$ߦ%^D÷‡ÄÊN#ˆþ É¢Iië,irô†¤94!H£>¸V–òøÂgò1ӷؾ(ŽÂŠÂ‚frÜ´NµÚ´Œþ~–EñH€wÖW€¯Î UjÒÙ·ÈÒiV½$j`˜*ŠÈU5QÉùEÐ× (ô—ò; ð[–r«QiL‘Ù—æ:9>ïÖäOSßÇ9÷?-¿R 8 *5÷§=ê‘6›óû£Áˆj8&íR7¼ÉÐÛÚb©ïÊí`ƒ¦—hvž|‚R’/!Äæ‘ÇŒ‰½Ne`³¤Ýîc]Ñ­»¨ qYºÌÍm›ž}Yˆ»?l ð `ô¦I}ºGwJfàìmXåGÚŒ³K²@.4•Û¤Œz‰%[½3¢…‹¾NŒ»üHXz¡UÿfíQŒr‡¥ÏPorÿ®Õbq”–޽¿ÚÓÑwëÓ¯}Û wh» šÄV{†±OÌô?Hòµ ÂdlMqë7ÔΘ+•©,ÇætM?çÂægåz“ÞÔq0U1Õe±u¥›sn/ýÑ út¢ù¨ID’vÅŒgŽ„ƒ¤€†¯›kíÇÜÀ^ÏëÇDòÊã&:•ŒßÛ=á#‡ÒË, s*Áp"è/{b6ë(IXùòY‹ãNi<³9r`A†Ÿ'‘.UÔÕÃqn–·ôŒÂü\ymÅÀ<¡&¹âZ}Q^0ãOÒû¬jZò`à»óÖVèmž­•3^ºÅDF’0$ÜËùl'—cé‘2bjÚk=EÏÈr§Dòþ5>Qž®5MŒÓ´òQŸ¯E—z©´è!Àr=$w´ëe²½[iz/ˆI>29t I ‡R yž®Ï=ÕOßÊ"ëM—om«=œ”:ÝÁ§û§Ì¿ù§¤ªu6å.ÔÖ…lÃÕ*p? ½dMI1ø¥üW‹¿9ÏÚϱˆâMÿ¥¾Ó\s:K>wå‡}qç]¤‘ oWßv8ÍËoó¡J}0‡ÁÜuhå£ñqkÍØÝ#¤;òòç§‹Ž> É¢RAÛãfky8Šy9û ‚©J ½ÊÌV¶yŽ•'зïpÁÐteˇ¨-tÊ”Àˆ~µw· r{Š^ïÔè,—!±^§öÀ§b&¸¨ÖOy#êl´j´;13üˆ@jp›û¯ t ˜¶È 9ÝdUŠÇwh3dôeÌÓ3¤©ßQxUñCa˜ó ±¿L•Hºd½õ¦­¬×sV—ÃÅ Ì"pÞÙèLÈŸ–Yæ½À1.}ð‘Ù˜1Ë­m«÷îvŽbg"lQNâYÌ:ô’Y׈ÏÂk•«z—8MäSŠ)æ_@¡J%{zººL‹Ž­IÃ…DM®„è zö±y¥e+„ýäÑ|’Í}t,»·òêV'( Ë7Ì FQ`×s–æx~ѪHqJ¤Í~]†Iè [«˜td”`Mré,s6!ÿQÿ’ÈgM«¢§(ð`ì°'ÉÃ~ã]þù:bÓþšœþën“¤/ýÍ–•ê2—;m6x£‰jy(b›ˆ|/íP~Dv>²µL¬J„, ãÁÓÀ ûs„™êYo]y½ý"]ÒyoÔTÚŸS~`Ê"]¹¸WöN$(áY)½¦CSVÿnªŽ ÚéàÑ8._§v¢=õ,§¾¦²F$èþ0üÈ!š6»£ÄôD/˜ Hgáá«ÍºChÅç*˜3¢8ˆŽ®súóÚ;ו3M)£ù¡áž®ÒVƒØpʳ; Î¼JãÄ?°—\é¤À4Ïð¦þ*¡8Ã:¸•™ &WÁ†0§H+ÎRÒ·+éÙ¦Áš(£?®Þ™w‚[Õˆ,Aö:ˆküÄÖE¢g}Ld)ÜÙÈœrmBÏ/³;ÇBÿ¢D~ÜľJ¯ºâ,%¸étlÌÞ ÐY‘‡þ£iµå~=yBÔÉÅýŒptÆ?V³ ’|F6 ô·éùz…TÛïÜçÚÏ7l›Å™aNf…z|µ¡üTØ#">ó«f2<‚ÑŸ#´½|=››Q&Ö±Ã(ÝÞýÈ ÆF Ã[ç0´JK¹/ irºÐ•êt¾V˜Î&Rž<ù0ÏëÈ·ršQ6e:Ä©¢.º'øo²Ï§Uü‘>Ú é¼x ¾„R ãbåCM¦ybq+zïâ jW¢…©³îyù'Ä>yÕÔ°°íËÞx£œ/ìYÝŽw5;xaÜœ›»ù ®m)ºÈõ‘Ó{$T‘ÄÂÈQRù1¨ÓûZ¦T ”.‘ãÂd r~}p.V`ø1úœž­E>*ÕJ#Xóâäײ…b­fGbe‹ øŒ ŽÕ‡B>Ózy]2ºF]¡WpÀŠ–í[˜¦ã ï-P  Q±U‰;ª¸ù¢Ê~å, ‘„l¯žH ÚÔlô³ˆö‰Yè×w¦­‡‡^ÓÂö´*{„|B-ýÐäwst¦<š_Í8jI¨ZúbŒà`cà†ÀOà0FÙñðˆŽæ”ݬ(•¸¹æCོ\EÈÍ:Á—68O1x5‚' 6r¶†Aé]XmŠGŠ7 IU[ EðVAJAV [Þf#ù¬uÌ©;èX´„5TòßË0òð}Í]–9¢½¦`B¿6xEÓ±*ÍbÄIxD½-J†_^ÿHDöðª[,zÞIÉæøž¾ü%\‚'ã5õ<…ËœL20x»¹*RùÒóQáÑGÛ6¡“PºV?ÔÒªÌÃJEåß»Âô‚;¢wŸã™Oñz@pÅOmU<ÃÆÝq¢Ï|Fø*¹ ž¯Q!x<•Å_Ú‡ÅÝ̶T” «TVÏ9øw‰ßsT÷è’àT-(Dƒ×µñ1ßõ*©,ZB¯¬%F²•ÝÔ`/:?0 D~Õá³W=P&UU: µèÙlÂèå“çZm&nR„sª©»Ö-7ZÝ—¤åi»"Ä|ÿv=»¸"ÞYŒäAÒÀƒyð« `‰ÉÆ} %×ÞÅ×stúûAeïm2Þê A×Àügc…;Hà„q8%ær@i©$‚”Ê¿oÕé98^mÏd­þÑïì‚ã´XEFý4t€,ÜžN‹àf 1¡iký[Î(ç\_«Œ†9~ ¶´o-ižâ+€iÓ7úôÌ ÇGr[y.h•Ï>*oÄ q …¥f¹¼_ŒlõC™ G°€‹È*-ä†ã0,JLÔ¨®ý`ÀÏRÊ€/Níò¾¬‡½G«ÂŸgˆÈ âÆ5r\e÷@jÜ!=+UºW7Šn¤ûFɲ„›yT—.Cƒª›yÍ58+êU‹BoŸÄV(n¨sÖϘ(°,ltS–›J‡U÷bæa JÜÅNŒôë²XóØq;÷çs:]/™6êà#ŒÏ÷µ=uó«®ûRÃÈ!áùÿUÕF endstream endobj 6857 0 obj << /Length1 1166 /Length2 6469 /Length3 0 /Length 7242 /Filter /FlateDecode >> stream xÚuVuX”Û¾¦‘ɤ¤††!¤»Aºz†ii¤AB‘în‘¥[ºC@Ê‹{ß}ö=ûœû||k½ïïûÅ»Þõ<#†6‡¤•“DÎ æÎÁÍ Ôì p7m0L…C b<€ü`FF;wGÈЄ´+ìnç“»?ð:¶p€*ØÀpA@!?÷ÃÈûW “+ ájuòh@Ü!®Žv°JÆÉ…ÀܵáÎÎŽv+-ˆ›ÜÕâX?töŸUÒNÎ^®v6¶î–—Zz¬llì#Ü ¯¿€ ÄÍÎ`zX¼‚8:9ÿ®ôBƒ¸>4mõ;VÃ,keçþ{\‹­»»3ˆ‹ËÙ yÀ8ݬ9aw.Ö‡FeaVÒNÐß Üp~k&cç ±|ʋ럺9Àœ<`>ÿ[ÛÁ¬þÉ îÌõfç‡(Êüoð„ó7fqðy€Â@Äñ´´åú]RÇËòÉýìü|œœÖ`G7ˆŸ5äá…ãã~¸»Â!~>ÿ—ø÷77ÀÊÎÒ`±y8†¿³?Àë?÷ª`wW;O€ä?ÿZ™<¨•ÌÑëïp50à’QÒS3TbûçìÿŠ’’rzHÉÁ-ÈààâpÊCFa~Þfü—éðª¶ûß>§T„Y;„ÿçAÇ¿Fzqu{ð&€å³þ=¿š“»%Àò·uŒüÀ×<¼¸ÿ«¥þÿ¯Æúg 9¸£ãª°ü)àA7€ à·"Ž`×ÿCí½þËÿ Ôƒüéþÿ'¢;ØÑÎRfãø/™ìÜäì5Ý+…Ïï?&ã^sbAiP,jé๱mS–hGîd/ˆÌaÞ>ãƽ[x>‰‡Ažø–z ï9ùX ¿ Td΋2}*··m‚eOh–Cf¾oQéA¹ì]œÃ@WÁ”_][¸jæši›u²>³1‰ùBÒÚØ{®; }²ôÕdhë•tw»ò÷õa¤jc$M*§ÊÄ WbN {¾ŠÚf]yiòqÍ|öÂ’ù¢ÇuæÄvþíñY X´{ÙÔÛcÚǦ?L™ÐÙ5JöúÌP¬ÿ*vRÉo]fùp¯ ?£›®+S±‹˜ï”â U¢ñjr´Άsok_· 1Öü íÆý4¢zï)b::4v-5¸Ö* a²b£Ÿ¡ZÆ’£¹o†j¤;Ò0ëYEÄä£.ä(ÈïN­E]ÝFh/‡×ûëN-Ùr¢ÃQñr™Õò+Éù¶ï*Ä»ýKõ’ãÂ{qƒ(ÅŸGD}yQNª|ñЍŠ×\éÜ»È"ULmX U—¹:±Ò¯½„Š¿qf_ÂëÕ„I>·ù‰UÓ…Im["àø‚é'¹ÊYÁWŒ¥±w¡i$o›ž˜؈=ŠœÙ'êçªxô(ÓËÐ4ðqåI ûœˆº¢q„ogÎGämÉq¬ˆµñómžIx§”HÊF°rZ‹˜½™~ÿÇ“iîOiC/„ð0 <8›ÉüY¤µMÕ˨^ÞuÞÂG öšÇŽMŸÄ¶£8³ßÔ§l‡ìÜ©-Vñ·z¡~³Wpáo4ÑÝ·²ÙŒÅ‘”¯{]¬0>Ê­Kˆ¦PÙ9KZœý,›Ø`-»|^ñ,®Ñùxbm(®SO!ò¬M¬;Ý~Ò:§.á@M>Õ,NŽÞFž¬äa!Š5ÁàeêÓSý~pÎIxc«Êh6"ŒT±2šU”øMÓehG”©'9mðyç ‡¼q;‹ë5ÒÔ|l1¯Ž9vF³‡”õÄúܨÍøš[È0=ÈRÍÛzE¿~‰fšë)w눯§?"3+4¡ö¬ ËBZ€ŒRluh/ÆAEÖìG–²®›¤K¸gEËé4Íà ×v&Ó8˜ûJ]÷\|‡0²ÇOªJø©"“J¿b´T`òp~,ðÞXdh(¡î¦žÇ­ù1ÏR~„q?3îÖUnD·!ø>›EI]‡}k“wû…AÌqÒ]´¹8Û Š£ÂË)°Uàçç€ðFŸ¥œMDð›èe˜’ÛÓËDóú|YŒÚ¨m¢€ [aÿ´gXë;­‰1 X¥ÉÃWª¯Äå­Ü4EŽñøOxQQJ­ .Ëh˜ž¤y}Ö¨{þÒ(ªLrWH‚ÉÏ"™Bç-‡ç¡›xü±øC§X—r ÍEgzªjmÉO?‹7Qûb°#È_Q'>>ج+‹z_kq¥ ÿî)å.ü;Ou7Þ· ýØÖ ^>,Zìs¦¶Ö%w±-ïà䟌ÍsÄê·IzÙ8­XrÐéܨä„)H2'Ó÷×9¼ä&2×SÔCéyÆÍœô™Ä‹ŠIÆæZ"Âlè¸Ém…O%ó~Uqaa_ˤz+ý)š*+•Ö3Ý®l95ãÅTŽïaúvsù1Â,#?í;m¯\›¦N†þd)BÙi/ÃÒIû’ú“Q´RTÑ`´5ÖbïýÇý–\ÈP‘Õ…G6^м¢L’/‰†XW%í=;C,{Àu* ð-…ŒMÚd_4Z}pãéc}èèÚüG݉ânu’çjæö‘"Zã’>I$ŽRg½–ýñW‹jÄÑqgû7Q›«é7²ÆOZóØ'ŒDˆW|­ÇQÏ*p sõ?¨Šò…r;ééˆÑDD‰ƒÊÆìCK¸»ÇÕˆi£ó‚¾†½#  ”£´`"d1¶.&¡¾!Åì~«Þg¬Öi7¹'SHS¬h|)©IPÈzufVZ¬Ù\æ*ü+™ —nÈ{ºÏ¯ÐÏz¦µØ’ö\}4ë,vépí}É©ž¡ßlÐÁÞwW*¯ô¬f¢]äŸÀf p´Ä‹c(¶Ý`¥ÎˆY"bBûs>Ø«¬²‹F Wã ‰” GÙúÇK¢\`ía7žíШז=ŸÑŸ‡ X$÷&÷Û””|˜7 å,¡˜öwD{ºŸoׂ³·Og- vƒ¼ªÎühÔ÷8E³#3tYŒ%ÞSŸ«¼yßø‰ ¹‘ù5ƒê"\áYÞP ° .äGìBf9¢߀1êx¢ò¦OãCÁ¾ÙÄÂ8Ô³ó&!™Ow {Ó2?bZ©iŠiÿEñºM\FÏX¾—…9jXÓ uÝ«(&†P“Ø[ùð9ëŠzà¶®ŽB}iƒ»•$öŒýÎ'ºêùÑ| p¶gi ·¾yÈ`K•CÄùU¬kcQúöKd@Ä'q‹äk*ƒýëïÎ=˳t[%-î“¶vù´^LÉ×Â"~õ¬Â>€Öò7n´Þ©ý}AUvÊÕ¾Œ9fVÍiêUÝåiZ‡šÕKl:#¬}°¼8Í%L¹âunÂNná(4eç½rÀn‡ñ6¬Ñ°`0°‰—+Èø®‚¦ï*jkÔ—#òôîÉÞ)Tðp…+Àëéûù­é{ Âûï­á÷ÕBè/ MSTħn£KöÜF`¤-¢ôs!jÚ¥³¨7©s¨K›ª\NÛ_*Qøë‘¬ÍcmߪñÀù}=«ÎdÞ4¸—ļdîÑŒk Ô-¿åÝxÚÒªgæjPbÃTƒ}óÈçÎÜTpÙßæJš/†’%ž›I^†1WOWÞ¹? ß’Ÿk™#á@ >ýXÅ_ddÍò3Ã7n?Åg9Q'>†Ó!šÄ”ïžè5™Vißu¸÷¨1okç|”zç”cR Óý ß<;YRƒ°­vWoê-Á3÷›Åèý}ƒSeº?}»ŸÄ‡ 4Z¶Üa âRy¨™èb½(ñ+ˆ[ö¡fà¿KýºQGi[`ÖÒ†õƒ=Ñ•áMæ Å`–‹ñÏٙѫë@;ðhTê|ú~EpO–:N4à‹ìh˜åzV Gw´p&·ø›2,…çðLí T–¶Y⹈…äîúÑS©QÔ CŒa»fL‹ÊqZ0l“8Û;‘TèMí±%æ‚âã`2žá³(‰šªÅ]šÁ©ÚGW¼rA­¨oÚ.Ú« À'ÂfNã®I­Ã“§„3?’OH×Ì‘)øIDnâŸr>Ã2QßÅš<2‹î•ô+#ã]ý1^þb ¯¦+ô¡É™´+X¹dÔ$Ó×P gš™æöA™ú~Ù¾·‰L•Ìg‡Ûg f$foÃŽÖ·…©‹ÎU÷úï¤ñ­PG&Lâ>¯ÜhߣvFk 3P곞ITæ"|ÀÅ©È4Í\%ÉٵJ…Ûí^•³ï‰ÏL¯©eª÷ìeh äOÏ.>ŒSÕ›½a’!'ï×"80d H¬&­)1‚FwŸpÚ‹”|¨ טŒPùá’Ôù¬¼Åëä†tß¾n¹ÿä´2ö…’{²§,D¿Ÿôm®Aõ4†Mõl)ëÇwZj¦~§{)"F!#üÜÚ‰tIØëŸÅ‰yÔ:v{1¿ó`Ì ;tY¦¿î-/ý4~¸#û1¦] 2P•È(÷±HíÅm0õ–§E.ŇÜÜÚ4Ùê¡é+l¢qªÝ_±(Cf™FHdÐó÷™EâŒLzod„#i¿áan²ÝJ×ݼóÑo)4ö¢Â1‘¦Pê?¸·|º¬dÕy¶»«XŸYŽækÏS¤lF¤ÍÆÚ=úÄåaC ÜxGÝTúѶ!™K^nIùãFË+¾Ô/UN:AŠ÷2S´¿%ï)È)jAw>~ ›¡ÞlæÃÌžbSi zçY ÿHl½vJQ•ÝŠ´Öõ «ŒÊs3…¯P·_(á~!øÊë²û;ê prKLÿh#)yçëPÔþ^BüxØ [‹œ-½ŒWÛ¦~£òW,iÈæTh„ô•Öêæe–D»Í0 à›F^’ Ð55Sq§lí¬WZ™24»ÄV¿X³ŠÊÅÈ\®>2‘š‡hhDKc­tFŒÍK9rvˆ±Ü}A›%4ë£1bÊcŽl¾E^ô™û=5Î@ùF]1Z,³Mƒ ‹^^÷¾%Ö§þ1Ë=ªàÕÕ—P6sLí,RÆ¥ðù$å²…F!émÕâ\©z~ƒÅååV`_6N3×ÉüH‹H\CVÙlÅxãûkm+%ÑÔdQQo¼Y™o€4<¥^ßö&:±ÿÔq‚ àcÝ:T¦¿¢.iò¿(N6]‹²¦‰ý¦™FpÐÂum1M2$CàÌ y±VôšEHcôDHSžÎ|ë&ÕT×£K¹iIbu·­pú¿¸Ã`s1ÝëµÖÖs böM…†@[²V5ûõF-iùé¦!ü> p62I§Oô†=ÅÂé'<ùDä‰]½l«§‚ãV.Ù“æ\øb$‡éñ»—¶=üRwC¯?K &sPÊКV¬>ˤÃ1:·È þ$z¼\Ï„×S*²Ø{W¿Á™§Ÿ¶ÇÏ$GÖå±~áòë8<9žc ÅY²ì¾•{î‘ÖŒ{ã, )P½¤£uƒ/-ç¥,|´»PcÃE]Y¹„]²ðX Ÿ$ì³ÚùûŒ'‡¶ +ú„¨Ü)v½^Ä=›Õ«lÄ5çHSt¿»J­N'_Ä®¨ö×$¿«>‘f9±X#ëµêì®´8ö±žiNþ</}ƒ.„Œ¡”úˆ÷ÌHUšÄ´Q•i¯ùM/4[©CŽ ¾UaØ8üÚP&!‘iÄ<éNÌ¢è¾É›ÚÚÇ© 6PäÃQ«1A„~ÅIù².É»-añ6®ùèfBh£¾f~–é\6­M°G½dtÇ´Îð%½Y†8~øÝµvKÝ^,pÐÁx7Dð÷ü°t¡T`תZ ÎKmȃ*ÊñH—›j—ÒHò'gGŒß 5Ú÷ª|‡EWÅ£YßÁ›q™©ù&C³;ˆ²AøÃe«ÛC¨8LO×v¼¾Ü="72x2h~ÜÚM" ?CŠg˜Kˆõ>:Í´BÒ¥šSZè*üTa#vTîã^ÿ>hUР3ƒÌØ$„LѲ¥Ì}‹¥ q. É—?ºD})‘ª#xÂWiÒr¾5ÜÝê',ÞžŸkBÒ<é¨9äv)Ž–[ÀÇÝ¡P(ޏ¦Ì$§î‹¾í§@½‹¿;\Ñf@|ã”%12~[ä‡êB»$ÊÃfÓfßó¸O½ÏØÐO|âK–¦$—É^äö¦²µmÊØÚÁ—šöpdû†f;dœ÷I-®’KWý¦.&¹P"kQ\d1•Úþ#Ô(4¨ÞÌäKb{: Y'²˜zç_eä?kbB›:‘.¨D¾)fH‹yB+ÔI§Ó#D» À­Dðx§†Ã•ƒãµŶ!gz`Oh ) ƒ± _†ÿüëIŠ®no¶3SUãìAÖ­ÔË·öû³“±&¸š Ͼ¦aãR©Ð#}ÏS½äïf¡«BuxÄœÃ^'¸ìŒ wÿm¿&#"Ò`}‡Ùë›ú3¿gœnè ÑsָЯãJu:«%b)ØPûîŽ×~7ÂaÖâ0ÙÇ`‡$&³ÎFD,UÀŠ™8-é÷ù˜ô:ägYäƒñèÜÖþcê9./yrö.~¦‹¾õív“UpìZÙ„¿–‰KŠD>Ëô)„x†©Æÿt%3Ÿ>Ñàóçæ>_‡éƒ_æ_ŸžqIÒš^¢nœp¥Ÿ${q/2„8?Ýóºœ -[jwí׺Õd|ð 8@Æ|'øzʵe/¦¥‰ÔÞMó³¹nlÃóxeÓÆ ÷pZ ¢dûŽ÷T÷ 9d!×Ö ýú¡/¼¢Êº¦öIÂñSß]Ö-¶_—Ñ,¾67êdò“ó/!ö†RÀÈÁº½3°óûb–ç¬O% RåNò7ëÓ“Ö¢áZïéN:çó/^©ƒ CTm ¸ûý|«)6}É¢YžÔåsfk›D’ÑJúI£m2“q–7³øíÑ K>¯DöœiñÃP ·—yOGKA“d o/ÇQŽÄ‰÷‹kr(äÇè†tBùÐy§DÙƒeÛG=÷±/t?q‰Iã” 6v6$ŠZWh×àÃ7>òì$™ññX+ˆô>AaùDû«Bé‰úÞø(šÎY *vÄåéçF¤øÍÚ1Êû“}öpxݶ(‡˜_•Ár@‚/9V/Ж‰ö´)}á°bY°(„BCK\°?xuö¾s9!ØGÐ&éJ(;ÖØÑ³¡ßT¹×·1Ž:¢{P‹­kÅPsµv[¶¥0ÊÈ¥ˆØ•O ¸‡LŠä#›U- ¸À7'–¾1ùœ† ùJF?GADlI´/lëö˜{F‡Ž$zõVCÝܱ×-~Jûl +æi¾\½ÈeB#æ±;×õû|Át³>ÇÝHü²‘î+.‹nE1–[C4©½G\m@.Ž”ÉnÇ|‹ú;k å•ÀcD_ß'/Inh5‹Ç#¡óΧ‰ øýr=Y_äßö^ºFž]ëv vÄûú%¶a,ÿ°Þ endstream endobj 6859 0 obj << /Length1 1199 /Length2 3288 /Length3 0 /Length 4042 /Filter /FlateDecode >> stream xÚmSy<”í÷¶eYB OdgÌÈ6$ÙG¶±e¯ÆÌ#O˜a–ìk–l cЊbx-¥D¨l-DQJ啊²Ë}G½½ýÞ~}ž?žû>×9×9çºÏ‘ÛqT3½As"¢†„#ô[(À›JvĬÕÀcTK Ö`ZXn99'ˆâþÑ…š@,"L±†“/°Á’ €Dè!tõ4Œ3bïOG"IÀ b€) É"0 S"Ž(ŽÔÀ@Ä;€d"•„Éz€£Â?gLˆ¡$è˜/PtvpQRQQýeA¢P(À;ô'˜‚dègN€þÄÀ­l ’…ã·|1>X3 ãÇNÆž ‰ F†ÿ_à¿7n$ÀC8 à c<É/v†ôùq·ÁRHPà€#H±õý{òb<.žHðýån‹ ucsgs´ÊŸúÿ×ÓØ˜È UCêèjºšÉ襵÷wÖõø©Åw+ ýS+â¥%Á‡ ~´ÄÐòg['@™1«€â÷ÑVþËoK¤@8Pü5Fž-c‚?äÇë?ø‡ì÷æTÿïÊ(þ`hB¬-Uü‹³¥ „ûQØÈ?ôq¿;º€?âºßáìF„cþ  †Ôøa„ÈæPˆÇ@œïÙù)7þû‚‚"ÚZqFˆò7ÌÉÂù@2™ñ(ß!€ÿ-©GÄC„c€#…1¢Xþ_ÃŒ£’H ¾¿#öçÝb”‚! Ž{ä)§¼.þÖ ÝH"XmâáÞmçåoTiMîtæq8K»­˜_…„fÙ’nN±)¦×wµ« +sâ ³t`?”q œCP(A¼kþ×>[=ÞYNÅÇsˆŽ]™ibyç>˜„ÞCÏì®Zv“Ûoò@Ð1‘( [qŸ|dÇ.!Uuþ—Ýû§J¨kqŸíÐþQözìƒÝ·MÇã’òx¶6ö¯*tçiœþ"t­EðèÐÓNc>­èÁD nJݬ·„[…ŽÞí­k¾-Vn3·©^L)U˜\PïãÙ|Ý­<ÈË.– {É»]LìQ¬–u€þŽS¢p¨¼³¥_±›WwX͈ptÊ»&X&åUXEI©¬ÕšÃâõÛ+×û4zŸµ }Žy¥Åß®õÀޏM$Xÿšf“1+3^¨±“n€kÛþ…›çµ÷Gq8¼ò;¢´ëÅ¥R…V!ð¸oáa`#$8NòL’1ÌÊ”ØGÛæç—,ÃçÛÅóPʹÉì#hbe]C’¤&WU¥s×’ÄQïé&ŸUBUI ÙKz†ço«»’†ú’"Áƒ6ÐïxÄ¡¸Üí¦ÓÐTzŽxÐp#ª»W`—­¾Ò(³"ë™{ûýžQºŒC]þP@’O?=ɬJàêOWâËhäãZà›»²0†~TuUã›mMê|äÔÑ[o±áªDïÛ78íyŽå"m6kLãCùr$)jcÃWö;~+©â(s,á|׃Íþ6xJôžöc»æõæ[d,Ó½³h‡"‘÷éZÙlG°Þ¢X¹}kû“ïô%[‰§?¾¡r÷µ¨Ïê=J¯ÁŽ{—ÿz¿Â‘mïpO0ÍÍxƒÞ¤“K›Üñf1†eaç|§ò–…ÞñÊ_U„W?I0°“™”¬½ÁV?ZŽâ:-5ÝšT³&ù=–Ø«=»¡ó¹Éæ1ÆA–d§Ö©S‡oòVz{>ÖN6ÅÄÀæ ^Š^Ëe.=áÆæÈg¯¤uÇã Ž©´9óLœ$”ñ.8ý°DI|Šã€…Ï¥œظ¾btÞ$e±YãÈ•ärª “r&ÿe…ί#ùHÜlæ—3 ·ñ‹w;é3V¾Ãl2<0æej³ ¢Éw[ea…‰¡Æõ½¥üì¦ ÒÞ]…6%#§ˆsÍu̳œ¼ö'âåL™ —aÃãƒÓѯ½—•¥iö‡éÊH3Ð3âa§[‹žó>*‡Å£9(Îçšt°oDŒ*•1ú2ȼK·ÿÊWæwå+Gt?–Ìì±+ÍçɬíÀÜPñ‡hÙnò¬Óœp•Ó’Qe›ï¥øLnt1ëʧ²ïÐzqý.ÙO‹…⣆% *˜²eÆ`gYý·J `ÖÆéú±›Pp—°KK \´Ésmj ¶iûµ›§õô.þ4Úrø³Ôá‚ѭÏm)õúXZ”fµQfBOø·§ÊùŸÛW-{]áëP5Ó~(Þ|: ¹Mõ1eÅÍ&u&9Ø:TL#2I8cÙ›±üž¤Wç¶hß½»ULœ »”âqj‡ÜÃìÅMúÞƒi˜‡Å®ª˜Ž(!‹‚sˆüÕŸ—w9¢žnë’Š¾¥cKñó©÷D-%…)ökM`ê²Âè…0¢×…Ëßê¢jYLDö#ˆ¯“˜ºÓðò ÏÎG#³pe˜»lŸhMÕ Q´r[Ͻ¶ês/´éñžÛ—<±ÞÌöò6M_yïlyûޥ؂•tmê7½Æˆ§xQëú,%ÿJ+rŠ 61—n¯Ãõ6þÂgKju[iFÃËíþ/ ó&RóµÍmÜŠf:–QrÀm‰kžcn­‡8‹*†›/yª½ëTÝœ}³Á&Jt¶W% æ\¶°0ù8GØcruï·p>´, W|þj0³ì±´~N×3aSs¾Í}óa†ѼÖÒeŽý7㢦ʤùtðÂR­4¡¡‘kç ´ÙsÙ-ˆ°$òT–ÊϺŠ%òñ7 ÆÕöe·ØuÆ¥óx¤'VßPÙxzt Noò%ðsp¬u8|fós檜—·³;¨`¸óøJžhªÐ­¨×Àk&öžUßЫ‡5(êiû“Øh¥Ø÷Â"37õ®¶°7ä7YH) ²vg&š µwˆ ¿“>ɼZx"„~îbäH4èD«*àÆAÚ!ÈøémÙÖœ<†eL{È7!K£d`’ô¢ 'î†êØ·•¤Ü :zˆ‰åSÕݵ)4šùÑIÏŒ:ú)‰éóÉûúøÃîi.ª×­¡fzó´í®ºî)( ‹O~ìÛ‹>s\Ãy¿Â¨ŒC—úkyzÓÒE®ÔE1Ò‹\ðIrÐ6RýÎ+û)ªmqWRîf%Õ𮹸9±©P[’ëæÔû.æî–Û¤áãvö|ø¼$ý«£‚ˆ«W–ò½¤t§1Ó¦ícñ;Ö•ÐE^²³U¹ïWUÍ©+™°¥‡ÈÍOM%(™¾˜¼òšXé â´Êh,Å _Öø"5™W&ƒ– ›”eáû\VˆçF¥,Úy¬³åGžïð9p›6œ!®Zk-3ÔÎ6¡Ã«gZ:ºŠ×£¯¾¹Ÿç™ä²m³)j3¼9»Òħ?ÿ1Ш>Šký]—ó'´“ÇþÓþ5£õâ¦[ËÛ`'5’f¼?Í×¾¾­Ÿ–iÛ«Óë)y¥46$)†"EWk~=á¡u³ àŸóU›W0ÖÝR|/7´×í\3æü’ †%zO˜•&ó\Å gž}Ï8©¨•ìÂÐáÆlw<စâ‘˃Ml™ ˜YBe†í‡Ô%tÒ¼›È©ð¨ÀWáÞ¿×!FÖ%7B†[²~„^;µ²w„ ‘ØŸÝÑ›Î}ÔfÜ£Kåß^É;Yþ¹¯½|g)®hH2[¯ïH_hzpS[.ÔÍ›íLgxbi›Ìõ²)7Xÿ?½LÄ» endstream endobj 6861 0 obj << /Length1 1626 /Length2 8962 /Length3 0 /Length 9800 /Filter /FlateDecode >> stream xÚ­veTœÛ–-®\) ¸{€àîî‚ ©ªÐÜ!¸wîîîî$8ÁœÓÝ·Çyýþô»?jŒo/™k®5×Þ£è¨U5ØÄÌ¡@4gãbç(ƒí€N0u¨2TP‘M d<Ùù°èè$A¦p0"i  t@æI€›À%((ˆE€Ú»9‚-­àF-u&ÖYþ„€nÿéyÊ„-!ú§g-ÔÞ?Aü¯5@ Ü °Û‚*ªzrÊ2Fe-€ r4µ¨:mÁfE°1, ŽÛ¿3(Äü§5û– ` €ÙƒÌÀOi W3ý+Àäh†Áž¾`ÀÒÑš CÌlÌÿx²[@ÿ"dï}а{ò=©Bap˜™#Øxªª*)ý7O¸•)üOmøÉ €Zÿ­{S{{[·¿²¡Eý0²µ`Çââ~ªiªm †`qüÙ9ˆÀÅù·ÝÜÉþ?}Î Ç¿Äøgg˜žH˜šC!¶ns‡2þTÀø¿S™ýß'ò¿Aâ‹ÀÿyÿÿÄý§FÿíÿÿÞçBK;ÙÚ*›Ú=-Àßo àé‘1…žÞ€"àÏCãd÷¥˜ÚmÝþ_IÿŒÖýÍVjkþOŸÜôi$bË'Y8Ù9ÿ6‚aÒ`W¹*nf°0µ}š×_v-ˆ9ÈÑ =éú×Hl\œœÿðiZÍl àûÛ‚˜ÿ“þ“T‘çÐ’‘•Ó—aù׿UŸ–®éfÿÄí?ZQ‚šÿ×ጸ8Ôð‘‹ÿ €‡—ëéî=äçüô?”ü ˆë_g%S¸#Ø`ðÔ7'×_ÝÿÇï_'£ÀHAÌ æÖFn 1Ú´ÿ2üq›99:> ü×åêú?Ïí<ä 2ÃZœƒš û['¥$Ã+H2úF$ º:¸ûì ª5s³½¿BÛ½’‚7KLîËØkÆ„ÝfìïÈ3è ¶ehOe½üDËÔ™ýb•¾Y€å›/‡qNòðÇ3Šë(úüœÚß6GÔÔóïÑ(Çšy1ޝ˜¼i³½ __Úãzš%VEµàÕ àWäü Ý»ºdèìïëm?EíÜ¡`IĤ6%ñŒ? Žƒ»™8^T›= Þ: Ø#h :ÙëË/J°G›×6}Q²([eöJáèf)Óeßœ-ÿzyn§¯ík.nw™/©æT¾7U)ã€RßÓ3K‰Põ…ºõV+ªãês-%hp÷kB€“£Už§´¢1IJƒ díJ¡‚+oÔ »7_üx®O%ГOùþðË·0PëEç>¢x à!ŠÞ÷…Ÿç@´¥<Ýâ·§¯>KÕ4Ï;‘Ž2x%¥ )f .¹3ž¬ û“3ñÑD/„£c˜u#Ê6€B$y—49÷kBl_'ö–¬1ݰHÆÀKs„ÉßÖt/,KÙVE(çýÈØ‡o_ÎäM*²¾z~.*áöýð‹óNJ„²Š£f?Ì,h¹Ì0xƒkì P6!XÛIÒ½JœŽ¸ ¦ÏéOLÊþ¯ BàâKÕÊÚærW™1„Æp%!ZKË:"ÖN«êÆ(„切#Üt˜÷w×ê[%ûC³av3ÒEïÉ“ÐGR¯60õêk½˜N óü4¡÷ž8©aEâæM•áJCͪ=TY„LjŸ[È–ˆ‰.‡Ý¶D ܬ“yÓRèÕ2E˜j½§uÁ§—Y±gºÖ%Íx>ôˆ¡àCÈ­¼ÂŠF~@Sà'k¯ù/®7×"òbLdDÖiK.²Zêó0¤'§ú%… ÙQ›’ÊY‘ÜØ’ÚÖZö‹;Œª’‰è+ôÑ}š£&Ž¡.¤ÿ (•8p^s^Íð$/ã¾Và0.›~_F´~°a](ƒAO¢~®»¾4£ä5u~,H´,QE&}¿DD1#ÿ:z3×q•>Èv®2R¬”Œã:î/*ZRvîàùì¦C=~f~«Æ‡ÕgXWr膥çþã .¶lçâ$ÓÒâDäLrçú+/õ#^²iBxrg<@4#ÿˤñôäŒ8þ¥Ö¤W˜~­bhä=K’Brþ'úǼ)„þ?ùüƒbëÎîÅy*êV*Ó(·ž)ªÈŒ®n£ªýÐé@!,[QqßêSÌ` 1KVQ‚½´Jo" {f:ôúx¯<2J»4NÉÅz²1i%Py|c.>Mð œÐ~({P†éå&î…Ó¯€ª]¢dÛ­ ‹t¯aL|M­ˆÆF²|¤-1ǯ{ZÌp—©ØŒ×YÂ;ý*®o”½¦“Gdšé‘Þ&”â¸êÁ”„Ü­¯{?ë¢õ‰ukµ›ÿLé×p(òŽVkó:Eßé1ÝÁ:L96Müü[’ô/Í9ŒWÖ!\œ ºE{ùçNÁ½îJ× öúcï§D|om»ØÃjKY²ðÝüóJ–k7ÝÝJD)¶=KTü¯úYí:±†>ã}ø&ã,4ŸÁ_Vw3°+ž]ÜÓ‹–}&ÌM©XÑr .$%ЖÑR¿ëí)|üŠcCä5ƒvKd…¸[Gtys=]Œ_¿$)Ý;·ªÈëòÊ?ŽIœ êQ Ç>FøÙŵUŸD,ð®ó·Ù­zh£Aô:×d^G%³ W.4°BÖyB1•¼ñEѪUj¿¶{7ËwBÍè:lY@#åqYØÜøXí× Ëmê‘÷.b©ÍS³»{ÈÀK ²¯è’ïî+,¥§ÏVŠa0Œkã—Æ¥d{«ÖÔpÛhÕÈ·¶¤€nKߦöC7ô5ã £¼>v¿XŨxóOU¦ñΙžQæÆª¼EÎQ®WtQ<´Ãzrxïù© +_íKÅõx"(W»mšI=+x*R?RªÑLxuxp 2޽U÷šøè˜ñL%þNºÊå;PÛsæã‚™¶¼o'wílXÓé$Óãq)ÅQÒtï I¡ïÕ.°ê¯XYÞñO|îÀŸìY¶k7ÌÕaܧOìe€Š7è5þêãàºÉâÛ<#—‡C¯i‘»F(èûÃàKÖê¹k|ÖG¨¦’Kù«Fš1C$üy,aiñ_i‹º}5 åêÌ~Em•fϘ§Íû'è‡,¯«ô¯ÑÆDé:Ý3N¸:^DZá[Â錸7ôÑø’ƒ‹_+Ò•~2¼:ê¿öüP{S³X·ïÔÉåÑ·\&¡÷IC9Ϫ°CŒOŽðǽš/õ| ƒ„îâ+àQCÛœÍàøØÒÖ Ê³~#ù¥Þ ?ûÍ¿ Û·M‹UïÐè?}©Å]8“è/#F —÷”ó5"SK5®Õ!º^ÚŠ½„9Íâx·ós"V’ý.6µøÕƒ¾67mê‘{·ÿu»¤ e c“dõH½ŸZ£çsK7õÄ â=‘Ó¾(r|^š‰ Ùu޳¼â’UEUÙ¶MßÊä£ñÚ—"Ý7ëÌw.°9Ÿò[÷冱Éм×FM‰šã”W*'Î()¥x\W’ÕŸ×-C{{-€Ó<-p€Ë³ß\h=mtÐ(ãZ©°ã¨µÀî@)ª†*®+ž”— ë ,*‚Ñ+µ±2%?Lù¶ÈMo®‰tð-Z/õæU§'Ü`B×ÓíܯäC¥‚Öǽ%Èã BÊòAÇ÷<´6ŠË¥6%?Á‘߇^ËÊË8V¡™ö–o„†ŸM¤$U ³Õ˜ ºhüøxäE“/ Õñ9[ÿže…ß:R»WñF ha”wˆ÷hÉO_÷;y a{ƒOФ{Q7FæýJ‡Ø”òʤáâÌ¥‡ÆŸTÊIÊŠåÂ}ªÐÈ>hìôk•¼?éñv3%ˆ:±ÜÈ'E±›øš¯-t¿~…ñ¶‡Ýµ%CÂìd®ÿͪU”Vú! 8TQðÂĬÏNŠQÃnæñPM%²›Z[à¡ ¥7†µUn赯/vÁ,gIÆAÖ•Њ|fîn+’±8Ÿ_Jbæ}æLï¶û<ÿ»‰mþ$ÜTÿýÝù— ¡.²q:½!KB<&,žmÓ>²V`{=éýħ™ÍÛׂçåI)‹ÃÕm'¾ óyËG1Æ9fÒLoqKá¬|3Þ*ÉíÒrìÙr%Ò-µÛXU’ˆA'ZÇô*õÒO²‹q±¹Š*mõvPJh-Çž6w[Ü—ŽˆZî¡u@†â­4QžO/ùr¦y…ÑÞuÿd7Õ2ñzâ~s8?˜e{\Dºüøc3 /Q7vK-Äê˜ëÆ‘¤Ô~aq‚މåëËäÞƒlÿ…Ø.'2†äYz÷ïêðâ—Ì@äÀÌmÝu½lÈQv£Zš“Ú" s,¤frîÖsÕzʸñ† P±`DÊ‚ [?³TAñ£«ä ?ÇÌè}mªÄ·ÑÀŒã4¾h‘áî>äí¸¹ËfÍÐP´ö3jm>΋•Æ;ÞÉ#‘à¸çæ†máAQØôÕËŸ¥*‹Üó`5Â/Ä×Û*ÍO ~µd”Í+Ö¾j¸Žx;µ¬sEô­Ú‹µÁã¦sfˆÉ ñ>Ëä¶kÓ‡‚ÑäªáR92í2Ôè;´D³ƒVkï ß:n–óŒ¤âÚcŽWôCðÒ][ã´[qŽK)hÛ®'ï Š™2Ye=å °Q:û1IŸ/+°qh¹µoô냹STMX¾‚ls±Ï¿WNœ²D?C‚¸BÊÆtO´,¾a&jãF_­@À¨„ÏÜVJ¥&;\pê&l’Å2¶\²kç™™•,.v-Ž6¡1–7Nⶆ§â nr4t¤Ѳœ¡Å3UÌ£6’÷‚f~¾¶[Þà˜?ó`MÛ4Ã*úr;­é§;á‹;á“kñb†< Ëh·»e!(þ(xëZWe„ÍÍ&ˆ"Ö]¢Ï©*„9)-t&}—#r]Ú½n@鯱"‡µ|?+2FÏíüAaó¶SÍjðX:…âÒåÚFçó|“®–[DaúpÂövS¿ŠN7‘ër•|U~ìýlÉÀ—€6s !t¬d1Qûާ·ÜǬÉÁžd|9wpxž¡!J±!W }ry Ó\S¥‰KšÔb`v¯9/#óըׅ¥N"Z2ë I¹½4ÈðB£|õ~CÅ¡%Ö aa*+‘÷Mz Ëc”%]jÍÊC·>-J·•}ocËýpø[÷Îæ«€µJDë׊,”‘W/Žë'lõ~Ã2zvî}ÕZ,P(¾||¨àœ‚lt[˜ºéiѾUÎvù}êüîQÌÓoŒ6 O™ã9»F=£A€’Dl¿wÄnÂBÄ­xo=H¬Q«ð»Íûæ 1ÿÙNEÞn³Ï[øÃب-2ö6Œ‰xÐé—ß½ö¾¸Ú–vys‰›weeë*;Ìa —†PAYçãû•^>bôøp*g¦Üà¼IŸ÷,õ€gÁü‰M¨®é§«3Ç—Bͱ8%7ûú”©ñYž½–+xw*˜e­ÅË~X:ì¬Öݘå¸ó}IR„x¾Â«Á>¸ µ,Û`[ =ù´Qlx+ç©c’W´f“І¾2§'+€=FØv›])ýÀ:Þu†6*qÖp€’AºuD¨c„¡SõPg 1%TÇ‘õŸ Á‹ÖÓ¢èDËxähŒm"êuî‘Õ”5RªŠîmäºúQY›P£ˆq`ÉRÕëò=>Ê$à;½Á5f í1r‹=À¿&6!b$0ï#N)Eó"ÎHâjZZ~Ÿ”RÆî;m £»d‚£g&–²ûwV*×.HÀBü®œ0êgÔ¸#ƒIïÛ™66÷¡s5Ú‚ÒYïºoï„16ñÆ;(§cò¼býŠiuHÊýËÛ¼?s£ãØ3{Þߊ…ÄzI;9Ð{w‰>«°¢xùl{Þý˜'£FëÜÇ㊔íU =!›ëhB'…úP'+Èü=õ GÙHÄ õiÎp˜‚àñïÃBÙ|a2÷ÌÓ ”ëæË߀8Š£e-Îçß ˆ€Ìœ™nÉ&œq(¨êoq5§w/«Z µŽ_|7r<â+8½ó7ñ©ó†Ì §Øúº %ϼÎÅê& ÂêYˆ[y5)b´ß ú{ÑÌÑ-½]1£¡tY•DŒjÁÛ”‡?NÄ—ƒ@y¨¡föÁµ$d…)âSP‹”w)×>.+#’Ê\aAδYØ)ª=<àåë­ªnÊ/_^VøíT”Òÿ Ú¾%W0{[§ùÞåüÄQøíaާµ67~UrW‚èË€ûãᔘ©*³f>„$zãÕÏãÅ^t?qÖmB/»(¢ÂpôvGèL.–š` Ô»ÚR'"Eå¾Á$I`%=¾·„_.cÔ'÷&ØP­&2J/·Ç¼í%þ‰”. p<BÀI»tÄT¶ÄG­²"¾CHüE0lŒd½Ž´ô89z­„¦žk*JÊÍ”™KM½¤ÒaÓ÷`ó•ú…wÕŸñTbið·R©S’¦+š‚~é^M¼¼ ‡RÆÅfšΉßëö ·²Ÿ«(Ÿ¥ãnߤŠLÊÎ?2²¸µ¼Ïâ ž)ÚŒüŒMµ¿OœJ:N÷¼—Ì0kø-:öj™YyßD±ÚÝFàdÓÒ臑+…Ú„_¿JqoS5R€ƒçHR׆ØÌ­CƵ>~l¥5Á«Ñka’ùµ*at^ØÄ¾ÇZ7ù·Ø!¾rÂÅ("NBžÏÞv»8¿I$¤~^§¿¤tOÐæb²iDO’ÿàÄþÅcŸ†˜ËØÜ…Þèä1áR ù²¥åq#´è{ Ýz¨À~ŒâñÞ·´½è`/3û]v£ùE P“°g Ǭђ•ê»ÁôÚå¹?NñVvÖÇ’ w6sÙ%j—E;¸bñ´äê-ÂþóÕoi(ìÏØðèß ®Þ4iT„Mضï¤sÒ§o?z]âC{cÜùƒ‰ÈL”‰ ŠÉ0/=TB¼‹e55óõžÉÕàØn¯UFä¦Q±‹ºpGuÅÝ&û¾‘§qø’ØÙGÏ1ü"+£nÀè¦æÄÑð„ÕlùSë/=t%i#Xê¶œ™²ú”U0Þ#q‘Y̽¿öÌsMÞ¹Vךs`¸ËuóB..¯5¿ýO¾µë;SeG(YRôs¢ ÅÅj9óxý^\ulEÆéò‹hpÙÒA«‹±5 ~™p•׉Á×ÖÕÁ†u†À˜¸ì”]È&oóˆ\•ˆ¹Ί˜$ y¶oñi—[Vä$UltZÙžŸŸ€—œsN ½Ch³¾"³:¦—Y¸£–óîÐÊ}gRȤÏó2ÉŠ¤ âR /F1>ˆ7Þ›w¾çge@læ„d™œÁ]ù«¤{ž³ gÃFx5“ÓÁ&4*à`q*‹ßÎ÷ÍõThw¾°«k; ƒ/©È¢D9_$îh¯•‰{_²´áú»ÆiOŽP Gô*’ªÇ’3|²¸Œ£,™ žä¤VȆ$3ާ¶ÙÿXŸ„:o±*níŸyÖÔ•‰ÙŒ¼ØÚp} °k¿D}…S-$§¤ö©N·ãÓ#ÖèÛf¹­VT„ÝGJˆX+º™àM7ïÍ¢pÉÊ|<+cˆÔ~¾‘ à:½¢…j•C[ËÓ·è£Fšðr ¿cIz¶Y:~ï4;òÕèûuLœß»¢AÄt\TG*£mØk…ȤÑKÓ“jb»a-7§:ßa‹Ä£qæþvîvo*›‡ÿ.À>²žæÁøÍ[ ×$ÞåòDEÚ\ýÞ§"ÝAäRz©“¨$ãƒ0‚ÎÞ…‡^\ž°_ÒÁÀ2nÕèLÇqõ*àÒ‘ÂéhÓ‰<#$ȹ蚣¤A/ÍwøÔ„È!›v‘ƒ“³#³w-N%Ð#7 ³'àÌT.¥Ó!ÿé¤vFÔ+’?á1Õ¥üm¨W.ç£î‹oÓ,”'"Ùˆ†až¦öÒÒE•#$÷ $ºtйág,=sÓÇþø:¤¥zØ:h2·èõu™=[á¡h`úd¥üjѲ–ß8÷1k­¾£‹ï'Áz?Œ2Öo‡N:|˜…¢1´?ÿÒÚa=0ì«b_Á ø Ü|IÂ,2Zäb¢MFòÉTJ`ץʀ—gL-“æ×Zm›ø!’šréåH,ôâ½`š$FÞëžÓ|1Ø¡¤OxÔ+ùºŸšû¾yužP{þü‰-…„¤ÅV}…*€%ªhx®Çú‹Ž×l£äÝLªÒù©?pjŠ›ÙTߪÄsûE(—s([yy”,Ƭ&rð‡™LH äÇ-o;gi|ñ-PŽ›Ÿýª–&=…ÒQ $93ôÝÈZäû­‰4}YIGÕ?4EAòo`ܽŒ Ë)~z±õT©oH?ÆõˆL $þxxÕÿ9qï;2…hž¸@¿S‚ý\Ÿ"Y|j‹D 3>Új}sLìäk%×O 9¥\C7¬yó·ÍëŃވ/†™O•bö³ V05 ox÷gǼ͓3›¥Ç[žº%[Oß¼ï€Ýl²¥½»HD.<QL:S$~9Ò‰þîKDfÓ0¼ Ó-ù1ªˆSŸ5HÝTÔ¼ ý¡-oûVÅvQ½-’ñ@3é¾w¤1žÝÐ%bC±EsÞ¢A‹,”XÉQç”TóA¬’&ØÍ‡ÈgÂ@Óø„+ü“;Ž9ÆÑIå0½’æl‹‚C_g«ÂÔš=)HÒ#Óñ©+÷}q·M³Z,N©–ä«lÝ[£^ûʸW*¡¯`É©w?>6¹ÈöÄן’­ûêK+øDÊú¡kµÓ¿|5LYû*aÉ:%#Î4W&jF:épÁfý•µtBƧߚ<’_ìw÷¢„Ö!Z\è%fôs„•s¸UyZ ¤üöp\­\&t$ŒbuL¥«í%R z|&H$\‡ê$c-ŸorõŠ£ðØÑE„ST!ªJßx²0á$Á_”+mè•°%³47¹L$zH”Xùì ™T»ØW\ùÕŒFä=2ýŸ¾ÌMò3âÃI)Ýlл²±nÓœ›<Õl±C• šâncåªx»A§–ݼ÷©úûhî»p©»Ã‡û@¢V «*'LÉò¡[ï󲉸˜«ý;ï*ÊêØËýª9ÑBÝCð»—½ÍÑ ÒÙ×êaÝdGùµ9àçR.…˜¹±S¹GÕGã@26©KíOÍê÷¹&·† vI@žþ®6󝻿@l æ<€Kòóa%qá¡Úœ©T'= ˜†7ÜyÒ)ø©6ò«k¡È¹±àgâðÿc†žK endstream endobj 6863 0 obj << /Length1 1642 /Length2 5441 /Length3 0 /Length 6281 /Filter /FlateDecode >> stream xÚ­tgX“k³.½„Ò¤¤÷¢ ‚Ò{ M:H@Hï ½ J•Þ¥wéM¥7D@P¥I—r¢ë|ßÚ×:gÿÙûû‘\ï3÷Ì=3Ï=Ïðp‚ŒE” ({¨: ‰‘¿Ô‡»Ú{z¡\õQ²º"zP\ F±Ø  ÆÀQHU0zh…U¡@II „¬¬,€¨‚róAÃ0@~S#3!!á¿-¿]€ö>ÿB°‘pG$ûáE Ü\¡H –âh …1NP Ž€U @Zú@~ }S  Ec›yÚ#à@]¸éÂPh â¯Ð…„À·æ!ŠåRò‚nP86 êíuû Ý hW¸‡ö÷:¢ÁH ö0( é€ð„ü.k‡¡þä†Fa=\±– „òÀx8 án 6+HUý¯:1N`ÌïÜp, DÁ°ž”ƒçï–þ`X,ŠÑ@ Ôó;—={¸!À>ØÜX274üOžp¤ãßÑPG0‚€zx`i°Ü¿oçï>ÿ¥{°›ÂçO4ê׿k€c< ˜(@B›ÓƒÍíGÄ~Ï‹†Jˆÿe‡xºý ó‚¢ÿ\ÿï™À†   ˆé£0Ø”@þÿ™Ê¢ÿ9‘ÿÿGþÈû¿÷Ÿý—Gü¿}Ïÿ¤V÷D ôÁ®Øøkϱ‹Œbw Pø{Ùxºï¸Ãÿ v…#|þ»Øz›Aÿ*Z…€üû‹_ éˆUGD⎨Ô_f¸‡:Ü Á1N@½¸?vS$ŠFÀ‘P¬Àî$.þÌÄ îà‚ü­Ä¿ (òϰšý)_LE¤¦£%ôßlÚ?Î ìD`L|Ü Àÿ›ÉLù÷á7•²2Êè'"‰-EDJò6PVV(+};àÿ“õÄßg=0 ÷Z‰‹Š‹K±ÿÿúý}²ùÒù=BÆ0‚º~Þh4Vì?‹Ûø¿Îæ õ†:æPráÎéY˜ZÆÜ×ïT­úz$ð_G¸•6˜W£ºƒÒ£Vd+]ÔDˆ6ŽÝ»jó™Ýr»\×Üêa@ðu?ƒîä³Üè- ùÈÛ.#´*f[J‘±mç·;£û‰ÀRZüáÆê;C#Û’ "¶±v)4Éî‰@ð-¯‚àÜÇn”Ïëé;¨qhk ·¶yŸnžó ¿y=ؽOØ»Î"ô"‘”G̘¶Å™Šñy„>lp¸"<÷’AŸ)ÞnAϽû ©åŠ} æ'€À§U„½Q±6 ±ªmçvjêÖ6ç#•»G’ÂÅŠSå»+dn…³-ü¤ £(ÒþÉܪ³-ò=òôÅ»¸‡<{êM˜3X‰ïL¼®ûúÚún®LϦOû½ésÓl•Á^y î›ÞfͧÓM¦Çˆþ‘k²ƒEVî膱Fùº'WrЮ\õï>ñg¯HÅcšßÑnBðg©É|:*»Æô j/Û3[H}i ™¥-5[º;u—R%= _…óÕìUo Ž-…Ùó­7â´ta\ÍDêCꇯK”²,î+—0í¿yîºRuô ¤øX>_ÈÓfN¥MkñLÏAe¯mìƒÒÿÑÜ'>ðÈ­6~æÞuãD%@i„èi-j‰F×pŸÍOå&h±ùÀˆƒ jX:yΑjë|½ Ó–U¥{s5¶v²–1BéEVA¯¸Ü œ¨íj™àeÄ`ýjª:Ú,¬À?ÙTl‹ë•·¿þÁ¯“Ù‡G¤´Ô±C9´âþi•¤B»‰ªà¬`‹èÈà’Ðõ·13ŒV^í„àý;sß—3­d)]ËoÙðO¯´ôÊ:Áƒ•oä¡ÖovÏ›8ðÝût]Ã.>Vœ³+÷Ë\¯'ÏÇô/þÖT·zCV º×Ö"l-tG]n[£Ã$J ë.QZ—3 ÕNMR ™\œ¼5Öï^¬Lœ²7¿'– \ÍLFsoºšÙ&¦3fÜäô•Ôrë>dþ¬´xø R¢™E X‹¥RrRçügYõÕñCé]J?oµ,¡¡æ›B¤žœ©´~Å8?1šIjÊÞE™D³ãiQµŽþ !ìµY»Ä¥+:*¶R€rV1iAÁ5ýe „?tÈúŒMÆ'zç @÷ßhÓõé¤nìbö„Ÿ ƒHž}^à.¯ú¥÷æÆÜD0›‡¯ãÍ…jò–°©îâãÚ}Û4z^`Óýµ÷b¾5_åñÂî.µ¸T'ªr;o‘•üÏsFr÷¿6”¯Fgž[ÞŽ ©à~¤1"0â¢*¶µÌ£ëÂí%Àïª9gô‚¾jø=“ÔŃ$õœÚˆâÑ]òC—ù•Î3Aɶ#·Tb¢ƒý¸Á•FQš<'n–‘w ºþ’ž]4 œ¡0ÚÂ{Ò©ìGþî1cèxPÿ­/LÎʘWÙÈZýÚGœH”Æ’æÛaRo5Ùz©/nT´~ã5°‘)¡üFþÀãÃòay¡DÂj@Í€c¦_Ø­îùc²1ïÕãgá€X Ä"•G}¨h,*$¾ó«>EB”ž„ÝCÓa¼Ö|T@‹öñû–"ÜO¼ Í„'4žkgÁ«íMÆ6ùºc6ÜÝB»¤ó*³« ¢ÙönWˆîXÖÐ$Ür>á<·ëˆu¡xA×pi~ÌW)ù{ÔøŠ¾Ê=nð á(BÞR}ÓÐñqÄ|r/\”,áë º_œ2üQûì„eNµú«ýf_?XlTm* H†TÌWóXkþ‰ßü>+æ:F¿JÔ>@«mJ¦ò^öf?$å[æ)ç›()ü£±L"¥wÀ绿r]o\¤?Ș J–~¿$¡òÀ^Tò–ÇȇêƒÑ63ÚŸG\¢óõ[&Ÿñ°H6w›‹rd¾ÏgºÞÌOÅ}Ž0_ngÁÎYBúFÝ5Éõí‹@í[ ²Â9yyùÚ§ÉZ¡‡[›F{´¦0>¬Czÿ¢j£ºc옸¿Yþ¼å=w¤8ýàÒ’\‰w]î7™8X•s@¦Þ(àþ‚PW›×vÊæ¸»<3-›gcUùòèõÎ1 W'¯ÏaHqë‡êéóàn:\»ŒÉ}[A*€xïý½ÔIMt‘Âzüzyp´OýÕ~.Ÿ IÖLæ)?÷ãN«#½EÜÇlÕ\U 4Ó´‹]ãFc9ÿδÍÜgW•É]Öù ÔÑ)~®ô=r‰J¥³˜÷Ðáƒ1mRN›Ã¬´Ì/o5hñbŸ®|ÊÎ »ȸîQÅ1˜ö¥†ƒ!/VÕv|¸Q˜s›-«è£ÏÜ͠5š5ÖÌÒ­ÄúxõÄjž·½œ«ßÝ/;ŒÞ:&/›ØýG¾Z¸‡ßxX“­Ÿuÿ.WòKj‡¸Àš_3C2ÃJ »Æî›å|Rë<Ú;ŸyÀ8™5ÿjþhNù°ù!ÃZ×­Úo'î¶«›à ‘q“£¦¹Ð:tüÕBþÙ爌†àµ±™‘Ë—´ ¡PñÞÊBU’~ž”Wu g¬Œ2áID_FüE€±sr8î¡DÞ‡­~ÂQÓwØ¢RR"ØŸøôâù)›¨ÙnfÇR<ªI:Ú>&%hªd£ÙÕ6|˜©ùVéi’OrÎËÓûMî]Ôëw§RNkƺf5Ëßád=QÔRªëýùÒ¨Sxê‰Á «GüYÊ‹˜“ÚÒ â¾/¿´Ÿ®“ˆ&-^=yÍ„Cõn ½ab¯4."`æ8Å ér¤®0 œžµ T°¸öãXxú—VÓN¸„¢ØÆ9iX¼ÌÉJ½>F6º¹PE- ¾§W½Ðï¦ÝcáÐ|9rÇ.!îÚ—bæÁá4BÞåB‚LI°sØŽˆ¾§ÞŸÕÿ^(e>Ÿä‚­<çHÙY[_ж=îÔ47£ûA¼UÛ•U†£ËÑ×Kí÷³{~ r'Ó­Þ¡/Èõ–ü¼É\Ã]ròz‚R<¹§^ßS$-ÅÈé‚PÚ–2=ElÝÝmÐ!A{ØÏ[lìe0âw_s…šÉmkèû•çʸ 4™‹OÛ‰)Šô¯;37—’È-Â:HÂÑg5 gßTQ‘U-eCœ)~4‰Ù8Ì L£÷ÂÞØ£’»ìœ‰®‡¬9ËNÕ†Ä'W /š?Ñ(©EâÔ•ù~f‡¶ì~­{‹÷nã~­|ÂéΚl•Ñ §Õ=†Š%=ígoWÑXÀ.JÛh4Ì&ˆ±ÕE×Q$“Êw([òÞÔj5ÿŠ¦Þ™Hl¢Ñ©@Ñy\Øz•Š<‰`vA4LÝðžkAEê5ۄ˾–Ü%Q~x¹~àøp®ýÁ/U´zÖ:L¼§µ¿ÏfuB(r& ]4Bç?ø¼[>Y‡ðHOÕYˆs^ŒZ¬*Üä²|˜ã[Ʋ¬~»1¡Ø;]ÄîÅ ¿¦]ÕXþð˜žûˆ›t¼olÛ4nDðS¡…t.òäMEo[kqÜ`{šWË-Qòøó§s¾}Áð½§Hh;³¸±ïæ™—2ÂÓýsŒV„År¤¦¸ÔAO:û–Û·úú1I•; €îUlŠo\ð¼÷H¾y­~@²±ùŠé³=Þ&ÄŠ›”Ö¸þ ©N©òO ¸ª §$ü¥!&[“µÕ[ÓýB z†žàG ­…-³Ê¥O2Þ]Ä·ƒ?NhžáɨÕ{yJ]¥ÿ€ß6=#MÔºÖôâƒH”‚… iRÑñ<%P˜oe‘ÓwÊ—VR1­üwlÖë¸$üÔê×Ö³åØE· ëq§ët›ñIØå¡`SÇ}…yKRê R¶–ûÕY%çkìC¹ä¶ààÙÔ#6“ËACú¥×!Thõƒ2ÏÁãg ½e<ÙÜ?з??;¾ŽŸŠÉ‘™Üf#F»g¡dã[Z4õð,¯n5ƒ¹w¤ß\T¨Èe»ª‡ Ò^Tflƒ.+{Â;>õàí[ÙZP~f÷*ß‘²¥Ñ«$—†#lë[”Òw bïâeÁAžX%¢_¶á«æBºé-Òâm3.¦c¨h\ gm¬Åˆ¨— Þü²÷öÓñÄ­ÄCElb(g†Ù_’—È>‘î9ó¹KúÆôRK&•Sä|óý:®ï7û=v9¯^²ÀVÉŒi–Ξì§>Ùì«ó5 Ú¯E3ͦÇ~öx`Þ³ëÔ+ÅbÔ^€Œ“{šÛ¥ÊËî²Nc p]z“ Ëú\¼¼Ô7#6œò²b9Äëàõ“¯€cܮϔhOüŠqô«µŠÄ[†$§Â0ë9çqârâb°Õšá TÂíâ§ Ó©6°ƒRÒÅ÷¿98aL"Á…þ¢ŸáøA¦-óJS¾'ÃÔç‘ ­ÈûÂŽ¤Ú,örLöBŽØýÌñiÇÙÎb>1?I(øc Ú§¶âô ÁŽÝü¡V6¡Ö¬w `îàaNKg°˜‡7öÙ|÷¸`bÍ#åêîE[¼~6`þ~›ò¢”G3?;?,—WµÓYºësiµ¿8„I¨r5òõ‚.ÎŽOÈ>½û–JüÇÝ×ó¸Ù9+uü„Iœ(‚'›Ö&àw/Ún“Í#>‘èwwLØ»½ dFo8±侓öZ‹~RO{ØqùÃŒ2ZöX‚ÇÌÆð³à·,aÑ4=ó˜J[ð‚ˆ噼P–`4±FÕgÚ¨’ iÛ¿v}úD¦d"9zIò»µq^â­ø‹r¢€t€ôò,óÈèëü{ŠWÙªPkš5¤?År€=mŽaMéÇúÔ µìê³Ó&ZBN+¢ô÷K…lêÇ)94ÌbÊGÒ\„ ^DIYj?u•NTIKŸMsmL¬ xQ´rÜ`ÕL6.Š>w“Ëø!§õHîkmr»ö­åÃI_&p5ÅvçFüü˜DûŒ¦Ü-æÕ“_‡Êá$j;“ åƒo9–Që;íI×õÍræÅÌ?õÔmqÅ9ô”ýV¾¯u’.(á.ää—•ËQ¿ÿ«åyhYõ<ã­ˆÌç_-Ò0DQ*¼Úþ$ù" @¬0S¥›zŸ ‰ÊÓ¦'xŻ˿@噯,Aa”ó·¹N¸à 4hü|!~²¿ò¾‘k)@Jl¯Pa2'¾=«Á¶†iÑ´íž =ݶ¦”9«‡×˜áïÑP/0ñzר¥ëm?cñ/Ù´vQ¼¦‘LäEÚ)À‚8È,Vº ¾Å$ˆÍFmjgù÷ë9L^ý2ÐÕ›x’÷àðvÕ©=`÷Ú¶»³óHݲͬ$RÛëáP“÷(¤=Û´ç§®öa‰>‰ÉÜK_’áy«¢3Õ­7‚&/K¢¦yZ¡¦mbSÁBgåÊ-?c»‰ÈÕX%<È ™&Цx»În½£mæŠÃ%¬¶‹cÃWt”Z™1|Ú«ÁÉR|ñŠ{$u`ÚÊŠu»qåY„þÕg ½çý6I<¦Äê+ÿg—ÁWE:‡BÆëŒsñesuOÕ.õÞ¿)·êcÜîæ¿®)í:&]Ë[2þzúü%‰½5P4«¾ŒþqÞ+g.ÿÖ{',Æç>­›:²‡µõ•u§ž]ϦXšô®zØžýšŸðºôÞŽwç¸ð’4Üb³´"G-*{f®9ÿÅÝj1b :½ñçÄ9‚f"[qëݲ4få ]Ùuœ³ë·ö*†_šLó.´ÐQŽ»ÖÐk¯gy§,*ƒbÖ¸³é'·ÄrI3ïM“X“G¥sx’=™*þ,íŒlà~q“=¢J+z–š·\t~ö%]¦ÑINºcOyV£VŸì9¨UÇ]jð³;dëþp@8½³©O¬|t™Q¡@tÉ]ÂX˜b²>È4àÜ>¸X°K]š}ÌkOÕ¼¼¾ Þ–¿XZ0´ðéõ×ió銎×,ýã}fco©ò…ZeÜoò®ËÀYÎ\øH›Jmà(îû|öyœªsÙD‹Õ­Ÿ?p¦6s┪KS·[ßp6ûn³šWsÕí~7=»?'š «ŸmÝã3ÖQû ~v%&÷”áb¤!k&е¶Rìë]’¥ÃLnhJaóÊŒÿ¼¡sf³¶×õ½ÛÖñC…¾ NF[iIø PËi-Ó&ÿÃ. sŽçº6Y4ƒøÕpe<ˆŒ;ußólÉUkÓª·YµZnæàG÷bßJí~ÃÞÐ7í<‹ÛŸƒ¢rŠ %¤Òµ;ÜŽ­®ì[9”‚ t\Q›¼òåæy{ÛL÷1dæ© úJBúø¦R¬¿ýblÔ—)u$D£æ4$¡ç| iÊbPØ4tyÊãW©.;µæ6ù hÔÏ¿­úòœæÿÛ“ãÆ endstream endobj 6865 0 obj << /Length1 1630 /Length2 19351 /Length3 0 /Length 20200 /Filter /FlateDecode >> stream xÚ¬¸ctem·&ÛIÅØ±mÛ¶';¶mV¥¢Š“ŠmÛ¬ØNªb_=ï{ºOóuÿé>?Ö랸&®yÏ1Ö¢$UQgµ™¥@ŽnŒ¬L,|%3wW5ƒˆWQ håø+çD ¤wšºÙ€%LÝ€|m @h`c°òòò"PÄANÞ.6VÖnM5mZzz†ÿ”üc0óþš¿ž®6VŽª¿/@{“ÐÑí/Äÿµ£:p³,mìqe]Y%i´’&@èt1µ¨¸›ÙÛ˜lÌŽ®@Z€%È`ÿïÀähaóOi®L±D]¦W' ¹Í_7 —9ÐéÀ èâ`ãêú÷`ã °r1utûÛ7ÀÆÑÜÞÝâŸþÊ-AÿJÈÉô×Âá¯î/˜ ÈÕÍÕÜÅÆÉ ð7ªŠ„Ô¿ót³6uû'¶«Í_5dù×ÒdîþOIÿÒý…ù«u3µqt¸½Üþ‰eXظ:Ù›zÿýÌÉÅæ_i¸»Ú8Zýg  •©‹…=ÐÕõ/Ì_ìºóŸuþ—êMœì½ÿå ú—ÕÿÌÁÆÍhoÉ„ÀÊö7¦¹ÛߨV6ŽÌÿÌŠ¬£%ÀÊòo¹…»ÓÿÐy]þÕ šf†öo¦ G{o€ÐY äö7$€æÿŽe¦ÿ>’ÿ(þo!ø¿…Þÿ7rÿ+GÿË%þ½ÏÿZÊÝÞ^ÉÔáïü{Çþ.SGÀß=Pü³hìM]þ>¦6öÞÿ'¯ÿj­ üwºÿ0Y7Ó¿mu´úK Ë¿…6®R6^@ 7sk€¥©ýßžýK®éht±·qþåö_m0²²°ü†µ¹ã?$pþ[t´ø¯ü¥ë_ù3Ë+ÈJêÊÓÿoì¿ Uþ‚›†·ÓßÜþ£EÅÿ<ü#&òø2²rñÙxXÿÞ¿¿ ñ²qøÿoBþ ˆõ?ÏŠ¦n.6^ý¿u³°þ«úÿxþódø_`$ÍAÿŒŽº›©£ÅßiûŸ‚Ôæî..Iþ×ø[õÿ8ÿkî@/ 9ÂêÈœ?Ì6=+í'wxRB¿¿—r8ÜégƒFQAP5¨'0=j‡·Âä­&œ©qšï£Í{ñÄéý@Žîp´Ûžº' x‘OèONÛW€¾IÕÁMÂlô9ãT;Î÷rAaJ‹EëpwRUÍ¨ä †hºƒÝîò‘6ˆÜ£ ‹âÁ %Àü{}â—N´F0ŒÚ“SªÔßÔƒc#ÃC=×Ð}ô9‰ð”ü¦8ßNH¿ºy›¸Ü5˜@¿xp»V.f·hW£§jzú¼.¹“PÜ'ì`²fœ³[}Š‚ï³ˆ,™%Ê{^DF &°¥1Œ‹ÏhÈÕu.Éž®p­Õ ñ¥Ûe­ð&Ø 5Æ.I§“qn} kÑˆÈ .déE$[Èh±ð e¨êjÅ ÎpsÔá SJ ¡ÄŠÔ•Ý)Ž7êpó'†ì«ÒH¨ûqªÂ8,hÉÏzäsç,À""¢kAw÷û¢VÆ‘ ¼'€‘¶Ùˆ-V>e[ùkxV8½)¡ ½ÆSþbŸ’ý/]fÓ¡‘„/N6—òÖïö›QK~Wwº$gò¼°ÉÌq£|É.œwð®L÷9X©<¼P‚R^Ç7½Ów”³š¡ÆFýØß;ÙíbiY=1\{_ù‰²—Ø{TšùiãÈ^1v(ó Cµrcà÷ÆÌV,öäªuàëüz±¸ú–õOù1’‰f+» oS°â¯Z_+<7òÚœb©(öáý<<²“òr«¾ïw/¾‡¹÷6ù~ÇÑ+6pjÈpÚ˜ñ€É^OK².2³5¯&ÒNƒÇÔ˜êRm’#(óÊõðÒ°ÛzPÈV(µãøåýè{ª¤-È+t†eê‹~HTq: 9G”‡{Õ¹j¡=xx…:a±Þ¨°‹‚©šyïtÐ$PoEÏ‹´ŸªÈ0¡cØmÀ-ÔpÃröTE` ,ò”Ö ZkÎR”óªž%.8Ù]½l°9vãD½o×­„úléá…ÎT‹LÑX>wúò%…ª  ÀÇ” sþ(„Ü´JEÞì•å®Dè-(µÑŠ£Ìgö¦Éð0a—3:ðó‚þX°RlènÁϯXý¹Ü’íÝ”xg¯•/:™:n8žìý¡¥gQÉò–ÜEZ‰«¢1ýajàGfú3Àõž‡I§L¼xëí§4J }Òjù}™‹Fm2®Ï4m¥ívQ¶?ˆsª"µŠM“•›‹¿àj£ý]ä%ñÅSú4«‰h œ– ×•ý ëúƉ½B&$ÄX´-!Ã,þJ,ûl-'=§}jzÀª)7`†~¿Îb¸¨ ñŽ0sï “±ø¿?Xy2Ì_b°Æº v`ƒ¹Ïé¹{êh›)»‹‘gÞÇ :*Ûqaòç¾8•,L‘Ž ŸÞvÛÒú³šÑÄëçêÐ5ã©ð==!‡>‘ýr‡D©wÒ'ã;RÊdòÔ¤EXMÃ'1^;ÔA*£÷š[B‘‡~…¥¨’LÄá®ùT#r<â ÷õ½Y$ôõ¬jq|ãµÿêD‘Ö-GälÕil<|ΆBd +íÛ@ÉZ-iÎiò´À-‹/õì³_ï;®¼¸Ccxç” Óº·‚ë†ä>ÙÓ>ó>qË©àO—õæFÏ~93&×]ÂaÈßtĤíd™Xh/¤ÎâtøÅGz•j ÆO#CÌ`j%@&ûæBJR³Ú’DN=Ê ¾áu†Ðï.<íJ"òþ¸ò»¦ç®­Å‹öa»bQ0(;xCP‚.œZ°Àø`Rx31Ŭޤ5zʉDµÖ°<·ÁA ´/`Eé*Øì4” ¼¾ _œŒ‘µR´V‹¬·=úd˜G>¡tv Zƒl×`±QzŽ”+¡n±ŒÂf‰‰û‡ßh—ù Ôkca^?2–ضoEåŸ^ṵ̈/zØÞßlÒ¥gmÞè€VD–§’B(Ý,ÁÕQ ?u˜ß'\*x^ÈÊüÌ왓öJüµï³zÞCïŽ^ý<Ò“ ,?C×ÌÃ™Š‡½ø’&§ã/¯}ßH¨HºuØ 3°¾ÚüºÏƒ}¹®Ùªv à+—³½~V±È$'MÀ²&§œÃ§S%¶@´ »j8Ê´EýIªÚtÆãùe¦j@:`ÏÐèÈxȉ…ž°­c‡¾ÏyKV›•SSð2¦ [8þAÒ[4m ò? #-wAÐSq Ê$f䔊t>Èvvs‹+°]«õ\ÉçêNçGX9žÑ©Ó$øî&!O¿×mGìh-¾ Žrbµ†0­Ti^ˆ—tر³óZLý|†Nø»¥Ë爚ҡz*xŽcì/É"i7¡ÃþËŽÈ'[µ¢-NÛ ÈÐö/Vºl·û¥Jò;Nüt 7ÀNW–­ÎðÀN‹_Ãßl ÷2ÚÐr æA+„KôsUm0ÅÁÐuº¶4ùe¶N¯¦0œÂB:Õ ÅÇjyçQš¾ôb%µ$ïMÌTí! r9&”sJ”€öÒ J8¢P†?:’AKxÜ#:÷›”7L›t^ù‚aÐmß×wx<¦gù³,|ú¡HH¦JŒ\O¿çpZ•œßfŠ)¡`åö\ÜJ-:ÊÜôø‘ûÄMMÈLä¬dMÔžrn¬óî#Øv¤¤ç–¼Ï¸a3N5è¹Ïš¼ïN,:4½ü‰ù~¦kŽÖ\©>×¥Gh“Ÿƒ½«Ùè2ÁÊÄ“øÖÆ“®ÖH?|¬~À¥YF4X‹ÌÛSò~‰. Ašy—aÚm+S„ªB¿´jÒÅb7¯f; QŒÝ! ³’ Äêô&Õb7§æ¦Ô´`#(^n‰0 |møüáæ¼ï•0} ?ÕŒ‹'î}ŸñËÞmmå+ç/D€9ÕÈ‘¶¼ÍE«Ž¢íhÔûÇ–th oÉZòŸù,¯ž¡×pú—=¡¤ðò¤ã×!r’Ú“Ž¼[‰å“ngGDZEüÒ²r5fZ·±ŽžV]-áÄ“….qÜ2ÛR³A—^2—–õß°qÎK²w–¥)8oë¤)ßáªSR‚T«2CûPómu‹ 2>é$)?ñm‹Ð€³2&Ë’;ÓÉ>…Ä­:Õ¹÷¯ic‘¶ZnŒ"ÃYŸ (.ÝW¶‹¥Úœí¡QVÝ ¸¦¨eéµÑB®d]uçÁ1ý /˜³fùþ糸©Iµ| °ßÙ¨Þ'¦—&;%Ò Ù'tyfNDOBµæG7DË…z¼B’rªÑRÐDI=Çݤ"x"/Ö•µMøqüb QÊ‹3H8ÅôAxçÊê2n†dV …¨/¸™§=ùµ› Í!p*†x×¹"|N| ?gcÎ-ï/ƒÝG»ÄbÊ[Pà {e‹ȶˆÑ€ƒ´²Í²2NãC…äü(DÔ-V{zS'ÅázÒ>HzÛ¥z(_23•-–IÊäþñp¦?ÊVÆ*‚½äÂP(°í›—FÕÂ/b¾³Ù™4̘|××¢öÇø&½))ü;3ßÊLlõP¯ý»‚™¢âk|/-­S+É¡MþtY!_•œMíy“¹ír犿¯ÅšÉûÊ#ÔæÈ©èbÀ„QñŸ3>pðg"Åûa^&Y¾íÏ‚Ü\+”rš™YäÙ;<2K¦’?ôfQ/_:Sì%OP÷ \â¼×á2ú‹E¨Ü¡>KÆ:ý*͹Ûm6LölÚ Ä»=#t¾cB [8älÁ¾è{‹‘6æ Åi‰49‰ÈC¦ ²ðsW.sÅwùŽ n…¤u ;£ðFK©¬Âø$“µ¥¾ò2/@…Ê”2äçFRb:†EâlÍY¨ŽRï(ñæ® ^ ¦ÑÞ%ŸÐRKð®j“q&—µTóœò°À"+Ûu¨¯Û1CÐIpÉ_uˆðn®¸|,Ê)pÞ¡9@æi½Ö-/Ú;r¨ÛÊ#ÁÌ'û+füD ]@ËÉNú†çc´lÙ\÷DœnÙ‡0¥åÏbÌ’>­f{D®ÈÉhÛmŸvS¿Fäß÷Ãà'×M2†KÔf‰wj^zó>™!Ýt%ËýSµF%+tm¸fEìôâùx%•¥dþàüÉV 9ëR²›‹ü%ÃçҒȶ$†ÅFެq…ë§ÔÎKÓdµ7‘Œuué1û3ÞÜÉ‘€ƒ«9›¡ÜÞ&ŒHwü ¯½æ?gêºÞµ‘¡.õ±ÙÍóžªfEaaˆY>+hÍ8H#ÏÌ7pj>%v?€S­lxÏï •ïþy¿ä^Ï¥… e7>ÂT`xl­ PÄçGsµX7¡Ã‹è”pMS¾4hî.n{Z,,|ñ<°€mRì¾Ëßà/®°‰V nf;>uÑȦ5©Ig9»˜<ˆ•6ªÛ¾ù½XëÍ?œÿ.=„ÝvNϰì’Ìn]kûÓBÃDŽ1ú^!‚iÍs ¥Öád/]û1¥Ę=–ÇÓ~Ø»5ã6j/£õ·–Ûò¨Okã!ht×Ë‹Bu*›×Qz× Ûn ="ù;0*~¯Ë&e•çý:[ábôþG¢‚I!á¨:܇šBëPÉŽ"לŸ+6eòü5©7 üÞ¡ÆÏÉÑ7 õwöZdovà‡Ø´¦ˆ61Ð:¼·WÔã¡<&ªíG˜àxUW`ŽŒ÷üÍ”X—Ì/h¢MÍ7K=©ÚY¦€Aƒ3­ŸÝ¥í^ä ¢¶Ë×?šÎ뀬ßÕrøÂ]Ë)muV¸YDÃK«ÓREÞ¼%Ð.ƒ¾µgŒ[”nÇŸÚ{¨Dµz*'+ÜŠ{ÕÒŒ \¼ iûÉ4iÄܦ Þñ±RÛòJ­jHÌÜq]¢pûzIfϯ• ïkl?%sñ¬$Ùè³C)Íîqnzù͹ÁhaKkz@egžÝºÍÁ “šRDËdI·þ‘ÚßœO툊“’½K¨O•a:éàºâe¤c„È{3õ®áÈAnŠË—(Û›~È¿þfÍ9_§?MXkn~ÊuÔ/Ñw £,õ uÅÍŒÔ?ç¢4aP­0 ʶ*+Í/UyècºtYÉxÁ““²Ìó£ÝÁäŒÙ|ÕƒÂÞ@\¦i÷˜…O-Ñ¡yÀEý²™vñ¹„ôs0*™ð"T3/®'’"]à3~¢ê0-÷ê¹Ï3£@>n–ªWÞZ :ïæi>ÎÎPWË<> ùI¾.8u$ºa²+{ç°{¤eàg2ÎÝãHà@ŽÂó0±®H›4޹_›.-Ûun9lúe®p6ñi ë*bwu'Šn|êˬTs3µùŸÆ{ÎàZf¼UKµ³°{ cýϦ¯&fÆ"hæ ΩåvJ§aÿúqÁGjâ‘ÝÚz¿÷rsŒð‘òâÊÁ˜VCÿ'Q0€Q4%¿A¢+nÐò}ðÆíç ‹z «ÕŒÑô~Šmê?‘5JÖÒ¦·“uqÿ³†V]H-N c™}…5y{¶zÔÈ—Ó×=7Ã¥Ó¦w”„èë"¬Ž95K¯gmà1›U?r>h-Ü5^ýyÑvй¤Ï«mÒÞÈý¼NZš+Ò)е°+}ˆ‹À’̱ø7›„òäñ—¬5·&¦z*I¥_føi·¢Š±Žïp£>ý>oÅ„ê p }XùéUI‡Ø“3â5,j¿¯Ä&ä¸Öu)'hÖÌjÚI'¥:Ø`­ìÒl “IÚ²ÚG‚ƒ'M§ï(Š•ÌÐÞ/1ÇÃV±7©4è½ø®öS…4cÈ}K`¸ŽGù†bêżB¿ôµ÷Q`ЛÝjiI’z” &+µý|®8Êý OhA5 Ï—Æ_‡ˆ7CÏÿ»$»ŽE Po–†ÏÙä=¸>û0Ö©ÿíù—(ö†ûÎùË”ßÏU\9ëiR‹;:ÒJ®kÅu<ˆË( ųde€nuDž>S L@eQ¸ö¾y‡gˆHH™W +çÅ»w²´‘ú–»ˆÊò1ÿÜjê€ÁXî¸À‚›«1ºêRfE,w?KjÊ®¥Û ¶ëv‡„Î$-[çä`†°A4_Ä ˜ÑEwš`1òí…ÌÔ/š³C‹a/Ô£¬ëi¨þ«Q²^?±«MÊŸo­L¬e"yËœ D¤ ¸‰…HµQðs:_…¿IBOŒØ%km s¢U&Ç|zy€J\XaàÜ©ñdT¦êÂ3„³¹ŠÅëôÁ ï[»Ÿ¿‹aºñb“O£ö{˜—ý¸8‚?§mýR¢tã:î; ÿõgÈGþ—I‰zÚn…Cá½Ü+ŽÓü'×\f“MpÏ>L¦ ìüæ€à9†¥–ÍÓâ(©X3°ñ_cÙÈœ°ùs¦X€¦(ž*mÑJÌ­ôçZ­xð0ÿ4<‚«X¿œ!‚½lt­Ó$jgQ"²¥ãdå0A ûú;©*—w³‰hÿ5)õѲgžŸm–`¬*Í3T‘/gæˆ V=­ø‡­ò¶ñÚ{‹A—ætÊ·j«”ÁóHÞk=€;ªoê^á¹tv¡2-c=åeâ°KÆ-®?Œ˜›ÉÙá•kóõ_J3¸ù“‰à}‘M¸\1ÑǸÎÒ~&ZÀtŒPw€…ñ8¦­§2µ‹UÁÊ€7ÇF Œ«¥Õðµ|TfzÞ ûê÷Õ,__•ä¯8 …?8¥ñ©¼ÓáfƉÑ}¼·OJ±¿»RµÄ»?׺6™=3~MþéoìþÔáW¼Äá|zïšÍ^®¾åê8ò³€>öK°¢]¤;0ÞréC|båÅ ¼+ƒS8…ëñè%.ã›jcI5"ù²•vj”eÙëú²#è•€ìHô€²¹ Ë8X}EÀùŠ{”ÏÒ¬`J¯ `  Ùy/ÑX%gµCLÍÅòì_nÆóõŒæØ;B»pWžr28ï"tž±oÕÞÇyùˆàͬï;¯¶¯¹ÅãHçò ëÀæHüŠê¶¯ìZ—Š;T1,Î U©AšÃ‡3ÿ»O¦aAö(ˆ3k˜ÿ&Þyi¿oP¾WYÍ>ÞTAù'«϶?ÚÓuà3Æp³m‚+㋵.ø÷–Œó´ÃOfœÑŒ¼É ¶Ï𔓒ɆûÊ;=ësÇèB?ªœÇ='DIÛhuEª.õì¾§]fYSR á7¹ ðümÀŽwc-‘èÀ‡<´bW*ìßçå×wúÁÄcb«N‘ï¹Y;dŒª§¬@P ¥ŽÓ”éèŒOé––?ŽÒ¼¤ˆ‚þW3›VM­¤ÃÔ›"xʹÊ3[¹G†©ÈôÏëÌ8ëô45vVúM¯Ý%á„Ü0nTÚþø#†šçh9Ûóub HœÙTb±9‰4ÒÊOÕ§‚>öxM¹“­¸³‰›ŠŸèÝíHc¨%âYñã~Rõ~u°ì°%ϾGòDˆ(Œ¶êfh`¬³J50Íf]±“ Û} SÄÙ€?s±«JbÀÙQ„4­ñG˜\ºˆpÓeé¼Éd=î,ƒ…¦ö‰Âíˆ JÔb‹•ì,ù®N캈 žŸ–‚1¸Æ&VÄØAf}sˆ—Çöîs×µŠàôLÉû¨]$«NËÛTRÚæWzš aâ–$„ßWØmY:Õ|*èÍÔ”>óND$ð%Ô0¾áõ‹ÓL¨{uX^ÓƒÞvYwƒ"cêS.@¬“·Ò{úÁ5´ØE ž½7wÆÎ=ó×3m?àb“¿ý>Ò™%Gno›E—µÆlµøVÀiiúClàݦY=«aˆdÅ‚¸Qú¹p½íP bn–xå$£NÃ_fÞæ¥\±ÕÆeë‘æj'‹p­PVC«Ûdxœ²:Žœ_öqî¡=Z¼¤ c7×1†ÞÿuX>EDíÊp5Q¬u$7^¸UÉ?"Rü½Vi[’w¶ZWÁ7ê%èÉ…€¤‡Ú”sñ3+SagÑŒÈPölØwÉ\}2§GO@åCF(“‹â]ìh͡ȮüLóéݼaT )û{ž½ÇCò8ÖU2¬  Ò~ž‘â0”ûÁšzÒu™›Ä`øTúÝ!:Z  Ñy̼ŽÙ­Ä1ùýÈ©Ž¤7qˆ?ÓKÿåÇä^PáìÅÍE‘cA,Ò¢×"u%Y,E›lXD挗zZ5›;ƒÍ´.ñP¢c:U8©ˆ8X¡ô³tU˜ájÖv£ø—‹ñ’[FbO‹Éý?b˜´xzb=^k 7TéuL_j “”ö×ùtÒ'<$ã°Lñ:´u-ÐsçÙ”3¢×½™„À‹› (P™ù#°öù­)Å3û0ÍyÒ†;¡A¹â¸l€8‘ýiñ¤ž/“Mn{–êµÀ6#4Ôb3«7CKÕRž£óŽÛ œÞ«‹=CÓ‹›–‰&³E®2  ßœ¬(ÃCŸJÔv{ÌúÊ‹°úÞŸ€~.‹ÎHv^ò»6™‰} Æ!å;EÏWë“åk5pÓ‡|v'$7ÂPöN$f++•ߥDdë4!óÞ”Œ¯-B>>é„ÙÏ?Ò°hbùP´6ž+íô6‹ÇøXоv$WX; ‹[G¼ëB£ÂéMï5ºfOY’™}zŸ©tŒ~fÁèogÔypBEÐbSÒ0p4Åå&QLC†p6×ÕZSÝes¿ƒÓñz†Øé*D êOöäöˆ3Ý~7'M­[LQì04Kƒ˜ 3¹!¦óµGËÕ¼l* y´}^G‰úÒ¶ïoÑCÒŒúŽÕ[Ôš•gC¯ãny_™|çpów×párOpõr¹ä³¥]Mï·+Èèon.â/9Xj(*nËëMJe:,Íw÷hƒÒŸN%T:fkëé»õ`ª)2æKil°·YT¶Æ¾[È Î5kõ¤áŸž’k6°†Ù\y :M³ö2x6ÇMòi@^ýl,å0ýszoñnjã Ć7·gѾ5ü€u˜ÅkH”^+(Ò˜ŒüLq'ÛÄí¬U¡¢sdið`ÑtNÞæJÄ6ÃÌÚA§ðµ ¹D™V—ïž^‰OÂLÝÜ­k“u± ˆcOÎóQ_Œtë»Âû:l‘¿“Š c塳#w¯zàÖó¿-ZôdáÇ´R°\¡­I}Ò@ÿ‚×Ĩ,Z:¥DÛ¹’8ÅGå•©7™ó-»esÅ!ɰ…oÁ«“·Ã«f«ÓâyÏ=).O¯M®žŽÎøáw Gh>É4Ò:i’÷Å &ÝϹ óºãég1™¤YÉ3O%>7;{sB0”Ξ»í a‹æò (\ÞufÖÍ©ÈøžœK‡X€Î8{Ï Äž'»b8‹œ’• øl,1°Ë\gGw!÷v~¨°ã‹8Å'ÚŠÕºùYªºñþ-câ¾Òõ×@@£À Ù&U,á@;ÿ ð"æƒæŠ3‹¸3ÒÒ%aþX,6ö“[€OJŒ|Œ«”¨D}ìe…¬Ij¶á1ÑWÂð””-XX»©Ð2„ħ㮳 KSæîŒTkŒCÐÓ¯$BÕv­¤†4ÍŒQ9×»vdp(›;Õæ'Ôüt*nÞîy_ ŠOxÈòU¯ÄG |E»¼ò*ý1ݦõ¹hü«RÐ,¡ûåÕ ³Rn²+~1ןðÇ´ã?žÉnù°6 µá±UÁɾoü^Ç« u±iAšñùQvÜn¬á¨{a jˆÙÆF´Ücú*³oϸ!Î@S¶cÆL$FJ5x,3zȘŸ ê¥eÜýÀIšR!‡¥ÉL¢å›?Z?r-ý7•cÑÕ‰üs¤ø¨ÉDHÆÏÙy)ç]ð°ýñv̼ª‹¢cºó$ºóX¬"f E“ÀìT‡&^Ó«LUóíÆã¬»1n`±‚=,)‹–]·ñtuõÄÐ[–wƉÆl]Fƒ¾=ü©ÜâgTHÊ@ÞpbW~Xn”zð}D8½Õ£ÛÿTÁ:ütFë[ÜÍÜd6èëÍ\Jè€â®l±û _ªÒÃJø1Tã_.äíBƒù&*¼ê}IÆ{ì·¤·—榱¬‡`¾þ6ù3ížpÕ>0<\ ÞEЀåêg\‡i9ô¥¤ˆÞ™}8yÕc÷äñ΀¸UÃ5.øãÕŠ«VØ«}XA÷LXÐaÉ{¶W%iÍÀÑyñÌÊ ¢ºÈÎæœypS|GþQ~ýr|²ÈthFŸV^ŸàÉ1¢ßˆ—¿ÆWxü~•+ÞìéVÿâx6ßÓDB¢p‘#ÅCªqÈLO}; K v–2b‹ÁÅ "ÅoDp·›N­F5Ñ@¢ÈÎÇJrA¾ÛHKå 5ÈÑæ;go¼° ø-æ³ZT¢BG€åžf +º< z‡`÷é“ÓÆ%¼í:™zó¸ŠX³ÍÚ·ºuVŸåϸ55ü44ýÝJß.RW¡=I.* ”nPl 1¸KÕ÷èͯÂ[ü_²e÷¡=„áÖV©¸ÍŒª@ƒ?·a¶q9ØîúáË›ô8Ðæç‚k©Ñ/ÐŒ;°ÛkÒïl`bÓ‹Ñø‰a©ý=ß¶”ȳJF¨é=÷m†E;Ç…D>ɾÁ2àì Öƒîí¹Ò¾Óê`îùÆôZ{c ëLø½,G’¨¥-šsÔ9ví:”½M~Ø°Ëæl|¹áXM´J"PsÖÔ–%Pƒˆ(!Ògs JY:Ì®Ùæ§óåÀ‹6§–P²}7>ÆÿSÍsÍÇöGoIªA)>—ù°å‹ÖÐÉdÌú¥MXªŒî®S¹Ô–>|ZWÅ€œÌ1﹡hE3ßÏØ:„xÊ–*æäÄð Þ¾}Më¾yš¤Ë€N\-3Zü¬T•‘ÀjJàþR\¶as+®«¸fÂ"4.¡]jt÷÷<´éE|X¸;Nñ=1Ù£¦€Õ™c}›µ·rÝ/äÊFGÓwSy® ½žz¤=¥UÇ€c:¾ÅJ »!¡’xÛEi¿Ã±cÞî×µœ±Ñ'°'³Œ€)»®ÆL»f_ƒPœ­é±§  ´ïó¶8²‹ nfM•Zôsï}´<]µANyqGrÚE¿ƒºëI,DLëY0ÆÅ´ˆÞzyÓñnŽß?Éß°¦hPrÓ#21NgVA¤`¯ðCßäîÁ“w±çÍÛz.kœyžÉ¬¶\¨È…²çK¼y ¾L­úé ¨©8·‰ï<Æn2ë¶?b@³ üؘ9„ÛŽõ8 ZdÙ`$ºÞ\.zï•ÍúèŠFÉŒxÎ`¶ºôÎudú-£•„÷Í4;h”¨J&¿Ú’ÓŒü$ö;ÅëŸN€Øø#šg ù\£Î/ù—çÁ®bþå~yj!;¾a¼ðиacµàüu¸ã zÑwX”‚²ë3Š–¹ïÏ$a7‚E:ø bvQ‰‰ £2¨Ed]ý¸õ¥|Ú±{ÀãÚÓ´³ë‹ÂãÆ ]¬GTô4!!°©<¸ZËþìß¿_î-&KŠ| éu3×I9pä~ÆHeÕ{"y‹Á¬çà?Ú»wFyaÛìÀk^°¾3Oñvbà`F˜ð>WÙ}êOº<²õó‰uæÆ‰*~öÁz4¤É…_¿µ#š˜RþAEýŠ òÊt²¥"h‰M‚M¯ZÑÌñÜUäoåß2ïmý+ Áao2ýœÚ«ýŸøRôõ.~eË?› ±<¶Ïå–Ò$G*bDüê,0£j¹Y#þLÖáñÚ­{k/à°ÇOZéD­·!5í·6ʘП‹®NkK‡šc©åçi-·¼ýge/ˆ9‰ÐΛAzÐ*gXÍïÛ§{Ü‚‡âÐÈd\k8Òßï TëoHCóËÙ@úZ¶… •ìgYô4ËI p…³¼)ßI Tj[iÞ>ŒöË9y7ì4rÁùHÀžoß:8ScéüIééŽì’nÿ+Õ2HÙ ó8àÝÔ$Vu¼¦U~ÓžÕÁ9 Þ¹‘(rnÖ#¶®£XI3¥~ýJ¼nÙ´ñ~d.Z¾ßùƒäfÅ„j¼ÈÃjtî©nR…G3þ Ì›Mˆ½Uƒ A_ñEsÑ¢;cÇr±näþ‰OÄÁ§•BÒÚ§˜»/†¬üÕý·­b©¸ò~tLÊ^úú!Ük2 ˜ø>:pòŠÜ.Z/mÅ­êfkoî­Cg‹UO>_°0ƒæƒ=Çê¸*tžè’94÷r¢Âi_ƒðÌøoÈeÁ@? ªâÔ×üQ˜2Ž¥`1NLÔkØqTÙ:[øêMRoßï]ÁØzÜV ú~ýüŠÈyü”ûâÛ\ 1››Ø Á±Y¦Hó³lëáwkÈ‹¦·m]µ˜ÃW»Oõ»—ÈÑŠÚÔ°M÷ƒwQºÐÔd¢„û &<™`99ìÎomÓÔàÌÖR.mÅY¿©*æ…wgôXiÔ<‘+üs{; Ÿã$1cÇ«ºª1fþТÃ-¸>^<ÙsœÓB9æ*Cìù‰y¦h©ágœÏLL“×kž:)t‹1a &ÎKµ_4S iÀz‹šâÓq@ñ×­ uY2ªßÜÌŪŸªp;NÙŸ”\4f–‚j[E¨~æ “èûË|Î2}Ár#;~ù¢™»(\nØš×Gða‘‚®ÿ!>£jnf€Ó êUÝz…™9‡~–#¸_yb¼{¥lßf-©j“å·a‚݉¦òkìø-2µ^CbNù~IóH.½ùT8\ˆÊ/”4i•KÃ46új¾ÑÛ—V)3Æ…ï–⑱”O)N7&ö«Rç#+±q׺£´A“ÚìÌOxuÌ¥ê¼)á¾vþsE!ëã¶6±N<[±.×6ä] $ ª9ÀŒ*ó…ã F(vÕ+!ÞDÐÍœ˜JâìÆÌ„ÔÿòÑlçÆ±£ëDCÌ칟 ó'fXÄ$Ð`ôü׬1ýžj,—‘Î,½&}þë#-¦vŽI°X&êì…$Ãòxr­´°¥µRö«Z×ÌKÛûDM Î~rå\r`zÔ‚åÁgêçWÕÓ€>Lzÿ—;EJµÐbi"ðÎä„X—zAm»õý£ºô’+-Δø+ œ‘œ­ÒÜÄ »ÚH"êGu)¬_®< 0.igM'ü@¡äàTîõÒ¼’XãÕ¶TÜÙÆÿ¦ˆKD6]-c¿¾WÔ,÷·eÍ_Ђ»¢¨ð7( V¬†ï9C#êÕ‘†BÜ„ ËÈÖeÔ¢ie18ylùedÞ0UÄa:¶lŧ»WaLU ܼ¾Â~}ß’ï 49ü@,Oäaj>Ä mÐzÏ WñJ®n&Õ S+ãÑiRM¿«Ü=P2’bïˆÀ6ÃøãL«S ZÀǧ*ôÖפ b}WÛs¸fÙ)KTOœt}õ6×x›Ò1ç%°ÁIV͈ì›;[Uñ:Õ×Ãá¤7.Ü»7g:‰>}óf²µÞoBÛ€ZUï?`;r h3#Ž’Qí“xŒæì~ï—XéÓ´xŒP•ãUŸ7u=Ò'Q|ÙvSä+ÁwþL ­GcntìtusèX_œCŽ^¡ -ù ùîº,“|®\ç<=3ÈšàEY¡HréH¼Ù>·µÎýêDcúˆY+–Á›ÝÍÂ~¡@Mm¤ùL €‚|Óƒùž<ÕÆqŸ°`Á(r«fv8QÍM™ŽÔRé›b;ÓÝ7(‘x5ª>\é&2z…"¬¼·¤Wß‘ý¨äÙh ádé?½3ÌÝàmeÄÕòó} 0;µ¹hD‰Ø5 –ªèY[(cI'lAq].îI‡“lïP‹n‚Æ$’ëNyŸ£N¸ ¡ÍoÂñÞ¾²ã½þ"Ê• ‚TZßÔâ0 Ä.‹ÈtFˆpâjžSu"nbÕQ|$QÁ¨Éf3ûÜ3Ñ1NªÔ„«9ã¡j½1ÂA:•¤dT}:V+×"±õ?›i¥WÓÖ^è(vÊa&=&8Ý^+Rm*@ÿgd“é¥Ò7P«¯OM ·nóçtšM©Y©%ä'W€Z(#ò°½¶å_¨–yŸxr }/øEyƒ‹Ý ŒíCÜ7 Ia~²5Qe^V¾dò¶5\%ÐÌ,|u²ØZÊ™XDÝ´sþe(m†Í´@¤ô êÅqT2ưª,: 9T´ý¦]ô\ ©¥éÛF³ÏÇû+Ãä„&bØÅ±¤#{rññcÝ4~ІSj9XžÓ™ËÜš—qø[àFaÓÈc§Õ…÷àFZPñP^úUð+çù”øXÄQ~sè î`Ÿ@¶çÂÇvÈM—»£š“-ÒôE²–ô`: ‘Š%lk±òpGÆ-ÌkD/~J¯¥ÊÔv£ê"Æ…$Ž›î\}ÿƒÆwXy~w𸶝ÕWU`Ã1y_¸¤mÆ"óF5DÓƒ1ÊêbÖy×þlŸ§Œƒœ8Ý®›FUÌó¾nÂnìp%=£XF-+Qýv\ƒ£ñ¾yE2/\ôFHæÈáÄÒm Ô˜æ9\  ÝqcüóTÙS7M—¦î®ž€VVI÷MÃ¥>‘äãÎÀy¢P½é¼)PK“s„#²%â®H.ÓÑ<ÇÃËîÎ 1¡oõVT¤ÉY\Æ)’RÓ’¤ † ‘¾ÍƒLeÚ_£G¯Ü6DBÄüó[ß ŒÕ³ä:zøR¨¿©£ÏþàRvþ¼5Eß‘)|· mÑv(q._Wú8å—F®Nà¬1¨Q[a÷•“Ì[½Á³ÅÙu-ýêm÷ð£.t9² i™[•¯ô³4àH·B7TuO*ÌtÿÖ?Ìïí€[ŒUq-ÝŽX*Ó׌õÅ$•;qk'îFc”õ©ZœwŽûÓ:ó(|¯æcþ3ºæf” qˆ ³é•y°&ë$¸Q »Ë»¢n¾¸úFÙ›\µœö,œlè5‰³ÕŸcýhŠ#A ÈÐ`ÿ{igM:Œ©Äø=v¾€}5ý"«ÅLø¹ÛП…®m„ï{V%ÀC#N•gW¡ªãôÇ)ÕÑ–Aº¾5K¦ŒQE ÓCÆFÔ>½hsÉñä½#7ä_"°\ÙR„Jm5òI‡‘€ï„X¿ˆV‚DÒGJ£Ç •¸þM<ƒåTãðgY«ðžF53WÏvÔÚ™X‡¸Ía}¢ÉJbÁIñÏ'µ*UW!!+¹}cJðOˆ“Žl&Ö÷gºòÆÚL#ÆÅfë¼ÅOÜR„—f Ây†·‰Fb —‹©àÅÈmªÀ—»»ú6Ï›qºˆñâèi¹&©¡i!éµJ,É“¾†Bá§íQ`s;áúŒ¯ê1|ã ¶Ê¢]Ô^íºùଌ£¸ ÒbycrtÌUCGðÊb 79Š•PdÀJ°5l4H?øÒ»‡–Œ§¨Rrb$ð Ú¼¥“¶÷ºµ1…ç«Ñ‰6›ú]jZdŒÚ õ´póøÆ&Á— «NaQÞy寣msíY=Ü?_¢^bC qµÙ†e‚Ä*Nç‹ø 1¿»Á'Á¾|»¬È¤ØóôŠV_è§–YØî«a+o÷V¡¸(‰‚›ìØz  Ë·SÙ*vƒæm#>¤FTV˜—Éäišž˜Õ…ˆ×\&CüÔßžœÃƒ]­Y,Ílqd8­¤a8ry<]~‚Y 7}‹£p–|lðÉ#ã(14Æä õegMï Ó’‹ p(‚ml?›ÙÐõ{lÜfY¸9¥².Ôê“çæ!ï|WGää ™Uád™"cPÕöæJåÒ» eØi±f€d¥ Š”`ãß¶êi[j!¦A܈œ¼Ww~äEåNÇÂmn5aºR‡™ÚýxѱŠ-†<#’íw¯œýåñ(hi+ãWqgOñ†¿KǨÇr¾qImÝ‚'Ÿ²#æ¸æž¤=H8-ÛN½åÂ3òòe;¼[±‡ÖÏIqêî*M‹vÏhóŒòjÀ"¿âf¦Ôgr{T¯X¸ýÅu¢x]D0:\SµH¦¡— ]"ÿ1EJw{ò øµÖ­(#6Æ+_ÆZ:èžäÀ-JÛœ‡<¶ U‘…¿‹iƒK/d•Ÿ.{NO2²,µÎ˜hwŽD„ð`DÜ’Wà*·¢soÏ <Ë4:TLá Ê5FFE$¯}|¶÷Fˆd¿*˸P¥hî}R% Rü#N° ¼×–›òlIâ0óZ°QªÙŸ¯Ðl̾j÷ÔSКPL`å/‘!LʨµêD\Y…·n° ÖË%ä^BÊBÌ?\W å”E³Ÿ€QR´V³`n¼3ä›B@+b{e ûð”Ê8¹^,Îð¢V*0”5ƒ¿8Ïý¦y3²#ÚÉ¿õVð} ¿šGØÚâºÛ¦[ãÞæò[š#P¥¥÷‚w‘" cµjªºo=¡ùŒa´½YºÎbDÏ:ºËÝê°‚>ncÛÝÙoÂ6Lî‰[]V"ê?ášÇC"¤,‘é ÷ñm´ ð5|x’™ü…81šÐÿur]<"7'n®J I.åT¬q‘œ•¡ †H‚ZbGØ@JÀñe~£ýªobEÍõuãnk Øø¤-¤v=)¢Š®X{o7 ðð'ÕQuᇫµ}y•CFŽ4—÷¢Šó°‘ýUʆÔ¨žŽ½áô¹w(ž®ÓUnë«ôÈ÷…v2íÖwZv.¶q‘ œ^6-P=.ŠØœ1¡ ÔtkQ¶Ûœ1ÅãæeÀ;ÄfmÙºÉÇÃá’7ˆe®#×£à m· ]ëß!Ê‘,ÎÕÊáÛ·ÿŒ4ûÚ M@˜¥65¤ÜŠCNÒ—7]? Ï:üÃþ§Ë<øWE©t&äÙ%@ò ƒfªt\H€ú4ì] QÇî(J¢¦•‘¡°ÏÛ«ž ȇ”Äe«N©{ØÆ“à¢×5±¢l艪 4œ†‰q®Çͧß8Æ2“¬¢öƒ~Íg7~õÉÒN+#€ëà¬ÏÍ+ Ü’Ô8HóßŸŽ»Ë)‡.†A ­htã‰ÅOkyèÊÁÏš³y¡Ë†P5«‘aÈíXòÈúÉ*ë|„E]qå–ªp—¬b®Õª‘!”+aíµÑ:ëKæúUQº–hÖPy}úG[ðut‰æ¦áåšÍprbíÓ ÎJí|ö}ðcœ:ଊۚ/+²(îÇ›ñ[þ1ð3ΧÑðf²"rSÁϺÚQ·×±°9À©¤œ½Å/ŠR‹=п8K¥ Aê‘EÜûÅ:k·îÇÞˆ"úRg$ï˜8lБt×@á˜ëóÑì1q("qùÍýå òXõÒž~¯n`jaæ ¹…=¾®"Hܰ|ÖŽß/ouYKd(W‘ÊV5ŒŠ"íÃã?ý\ ºcÈ<0™hQÈ W/ê5Ù7‚‰µˆÝ‚ÿÔa QöYäÅšIøÈÇ‘‘›Áަù–õKÑ LxíqׂÙ"ÃeÅ X›vƒZ}Ù \X_È !Úèü utÜí}hnÓ–Ïs*‰‘sÞ·[2O5â踟G‚xðx-c‹†{?ሜO6LÂŒXt„WÑ]R΋~x‘qÍCzV`BŽÇ5@{õ”ÈoƒTd®rõ 4OŒí/Vº)9bÜ]{vÒ @êç7ge ðÌ—×§)ðÅnThYUZXëÅžu˜JÝëx‘‰ ;²ùªú«_Òü¤;‚¤›œô D>ìÉn,µË„eFÜ¢ ;׊}M”‰3^¶ÑÆML.©=h‰µ÷èœ9¯I]+gI!§áA€iýÆ*åíE*R v•[Ú(¢zAõå‰Ùüµù :æTó®| ò£l”12äzFÝü€ÓûñE:Š"\ö%¬èaYc‘¸pgºLÅyÇw$Š`‡º92á.ÁlYñÂ2 œ›ÅÌ «Þûœïv´åS |&‹ =€îþFÊfÑç«}Ù®¦¢øÓSÖ)’l”Pçº?·)iX"}ýM¾ÑZb ^uÿIn—Œ¸èŽßz’âÒ,‰GK^*èùï(¶• µgÿÇò›ˆ•<ñþ‚†OÒ^±¼;¡/*ía׈W;FäƒìUºW3«mÈîGá}™Á> X#<÷î‹Î. ÔÏÉË7úøtÉ»¥D©'…+A<[Ì[¿>ÿÍÈêì‡Ý8_™>UøYC °F,}â¸ÌL»3½àU„ Ì¢±u¤¸^P|ŸØ[e̹ܥÁ$ªB¿R­õô0Ó>ʃ iB­¥»¿ ÊGrV㘻‚Ó$ë±Þ—×¼¬×O\Ë ïF‚:•üÊÜÏØ]TH”LyæHùÊÙèI5˜‰üˆË©?´·Æ¶h,'Ó~'r©EÇ©pÃ5?ªÂšÚÕ—èýŸÓÀÕl&‹-Ê î{²E,’Á½u/jÆÌÌûbn/İOD§Q—ãTOåÍþ0….ÀáC´Çd’%ÅõP/˜#Áp›Š<Éäfo”“0jŠ ·nœ8&+c0”¿’ííô`ù2–=6S5þ÷øÖ6ÈüSXªÇªWÃîÆ¥¦„›öôä>î[£4ì!™F"{å\El¼êiT™”‚SNŒXgÛ1û¯Ô½‚ûU~â€5ð 4®®ßÝq†ˆÂrµºDž+¸Uµ²Ó‹ãɡǟÿPo  ЦÉdzY\§VeOâÿ$‡@´³{ÄÍSŒ!ʪÐ{‘jü¸cÙÑ3ªÓr’ÿOÏÒ)xÒ ÄFe5´¶ž[) ¸WKL¨"ëÃY<ž ÆNûÎh­_=Šý$Á™{ͯ*ûªG¯­ˆXAóZ—ÒÄåùǶŒR üX3×Têˆ8]£ëñ.ǽªŒcAhæÁ§Íæ-èÚÔc/óªÏHèq>„íÛËúÃó4_š¦q ±ƒÎŸ‚{X|(™ò9â¤ö?nfù•l¨ °c)$-p(@FuöÔÔTb&Àþ†гÆP~ÿöåÂÈ‘ ¡õ6UãUÕ à{Иæ7HpÆÓE©(šnáoª“‹2§5L¹Z¯#Ø É çj+aň ä$4²¬«Œt~íP5î%JòEDøÃÿ ¦ùd½VȉjΉ'ÕPãc¾7@ò¹·kqÓ.õfôÝÁ)ú]õþr“ƒR~\ŽüÆ*ºs¥JÁºËÈWà/å÷÷»¼Ç`ÂíI.¡ýTlE[öZ¢0ÜÓ„oäŠ{/%û¯ ¡’¼ÌóTà>z2¡ô¤š‚6õ4"W/=‹GGžu¨EÉì˜ýTú•Vz)cÁ5_ÞÚ+ÜÖï÷ëÁ” ôîHäﻂòOá8f®'¬ý™êÔ4¼BêIýà©…4x§%áŒMJ¢•¿yæ­†ù®à£nîŽf‰¤d²Â D–ÖqÅ2ŒÁ72¦1’ÕuÉèŒ;ÎÕ;(äé…2y¸ ê”–-˜ÖbmRt§<\ÓsÐ?<"3va"wСCöM•ÐNÅà\æ-ß.AIQd=Tríëüúv³Ùµº+€/Ò³ÆIN^;ú LfVEs3Hjõ"¬;×Úòã“Z(V‚î9ÁOû,Ÿ2ví>Ûj„|ñ.¶Ã:˜Ûð¸¡òg 'ÿW@Ú §‚ïCpù9òÛ\W(SótÍsGë„ñ9VKì—§Ú³>z܆ q·‰Xc–&ÕñŸó1h¿-´#<ÃJp}”Ê·5¿7z Δâ¡G¦¬À¿f™¨‡6÷:I–1Êã-]»× ÞUYô>{nÖ«P*Ls™•К—{Æs€íW7:­ØÒ–Ç¡Fõ°Õ(0úB3á_ë¶³j¿ä¹Ë+xt&æ ²ë6íìakáUú×Yï^÷ÂVGÛdåÄB>¾‡¡ÞÆ20“w3îøŠ +ÞäE·’¥ts+Œ“÷²ÑíãeÅ^ïŒ&ZŠç×ýp\žXWCWj#;„’–›ü ¡ôÊmñçVgVžË,h/þ˜Èœðq¡ýÀ¯è2Äûw?R8†ë¥jABªÁè, OV‘†'ë}×ô÷ZK¨4Ôbvj"œ¹Q¡ÐÄΰQvÛOèÔ×> Ó:±X¢lîu᨜;ÞbYëlN†®÷j>à_\Qð˜.¢€Íz,­ˆè|4À7¨Ç_Á§qLÝ @‡D *ªòv²B×Õ8xÞq鎸 çÞpùqÜØªëQ÷rýïÈþ;+¦ÄqQ×—g¸öYþ$pjÚ¯šw6˜|zçŽbÏ,ÔQâ*ö¿ó”§)þ¶ý&¹ØX¤ÜróxDV©ÌÈ™eeQ?©î¿—ƒW>V XO<«J9‰ñYUi>ë Ú±‹ë€?¿îxlŒt󛀣füö&°R%Swý².%,nJÀYt•²î1ÝÊkÏŒh^lÊbÙbFÏL,qp¬e¿|±W;š?ÞèjüçߤU&Š{9ûÂŽQ8Þh½àÖ`YÛc·4RÜÎÙT ÊLÁ¨$÷&¼ÑC%"È#‡]ßô ýð4)ež”m&rAc¹™øÿ“UÀç¾äÆï[ÀWÊAtHÖµu£NP°\˜=—#¦Ìu£»½o¹“= ˜‚í’Ôò ‹‚½=ÑRßú¯,D™¯´CK°Ô$˜ª)7Lšgõ´:·içÕv7~ÚWkk&áAUÖ¿…ÊÙxÓ„ˆJˆKqBŽ=ÊÑ0·¼‚·‹ÑÕ§>zìkã×¢Õ’ù9¼Ú‘íá&údu- ʪ–¥„4ïàë,½ì<ô3ˆöšÎVIáJ4‚Zj5Ît 3ÄÂDâŠñþsýÖ$íhŒÉ\|4ÊðRòṵ́mÓZà¹?6ÞÄF”Zw ÛÒµC€ÌÃmØjÃ*>ø>mìXÄÁuIY'#ÒÇÜÓ…òhàdÙ¶ã‡aþ1qvö[UÞËÖkbeÝDMLãýÜþx OœÙï‚ ü céÃlÏ·6kŽèHãש›þØioZs>‘F=l]«©# ³å$6¶­Ï žeí‚ãp1 ä^ë·ßó,¥Áó•:^in{ U`UDúsW-ϳaûû¤+=¶-\üäÒhÚbv»ü£¶11;Ò@*7 †hÏúS¯¥z·òx£¿…,$ý˜*©Üä©Ç8®a½²±á ¼¤lþy á^ˆtüPúwͬÞU†§Šmk.ÌÚJ¢Ï‚›7þíå$Ä EáÁšÑ;r˜^Ù9éŽÆ$ÜÖ0Önò2Mó›#JXú(H“‘öd»¿›+(•ÊÓÍO5Tnrlb¥ƒc wF½¤‘Âõ.ˆü»Ù‚LVëçšÝq´-ÅmJ&ßLOЂˆ,GraKÀâ‡×ÄÏOE".p½TÒ¨^umMª>h„ìzë]6¿4¿ÇáD,çì=JDícçøôO¹ŠBrÖ> ɹ{Iºò>½^†«eÕI3~r‡ý"˜D˜VÝùPC1èÓ Í «ªwzot+‰D?/téŸåÎÑ·;%2Œ*<}‡ÆN¯"Þp˜L•4sc²_ Ðo©T]fŠŒn endstream endobj 6832 0 obj << /Type /ObjStm /N 100 /First 985 /Length 3681 /Filter /FlateDecode >> stream xÚí[ÛrÛF}×WÌcR)aî·*Wª,˲eKŽW²Ø*?Ð,1¦H…¤'_ŸÓ3’"l)\înm*gˆfºOŸîé çƒg‚9“ÚP'2å:Q0#$u$³ÚRG1ç"u4 BSǰ¨=u,“§«“JØô<¦ÔézLn|º!2éîB0é žd2xC=Ŕȣš)™G S*Z¦ŒpÔsLY#vÐó–f"0ò½Ð ¦{¥`Z¤Q)™ViT*¦uÕL›¸)j­b‹ö€Hf´¤ô’¼U°BE´v[AS*Fz¤QHÚİ} ‘„PDÑ$Ì&…À¾M Êà‚jçdž!¨>‹Û’¢Þ/TmµŸk©p^w”B›…BR¨<šíî °ÂiÓYo ƒp…ýBY0ÎI%IBÂE$Â]E¡‘›L»}á$=Ÿ£Ô2%wî¢ Œí¬7*„¥¤Ph"ƒJ§ BY·5( ôÐ’(J)'’ %!•ÆF¿5, »§ÇSØÍèªÁÆNU™Buæ;ëãÍÒBaUÃ$’K¼ðha .ßYµIƒ ü¡ÇÛÁå´ByzþFÅYgy¼Q)PiDz¦çMÎ+ÔЃP‰â,˜­aAõ¦ç‰*çHµ<2`IÅYØÈu£ ô¤²ð†oÔA(—%¤‹úÛ±Øgg.  vÂø/oß±]éÒ¶ –È£›áð}}õÁx4KÓ`ã1ßu=¹¥>.ã/'ãþi ¹Àø«òËŒ¥ÎÝòƒÙûÿÕ_ Il ³BÀgNöÏq§ãÿ5Ò!ÛÒ«)™§77øBL-£ƒªåCj-½¢ÂÝ©/r?½aªÚæ<æ¤{è ßÔzêÓË®ê¾4Ö¢Cå±ûâAÛ&ëŽT­Ö¨œZ4Ü¡¶î'NUv'ÓµÔ§±H/éZú]_Gu‰‹­y(Œ-Lº@Æ ÉHÓëNw+Ó着~=ÞÜC„l%¡WY«"~×T¯]ŠVhT¤ûªëšûèÑèYíd²Òúµ¬tTÚa#i¬Ö—®kþKã:4óoɹkië5’q(Ÿ­Î5Ž[Ýóµ£!½?­’5zÛ Õ‰æHcôzóë¨5ª-²¤‚iì\·v[ã\c]_—xAÁ¯k áÓº/ÉÛÆ'ñã¾è5׷гé}7vöén…¯‚㲺ªòÇe7i+Gרì"©mÜj‰õ0‡«ý ñ]MüÚ¡¿F|IéžÍ}#B½2mÒ×Á+Ô×S[#ú-Gc:gšƒäŒjŽtm½†8•%kÇkˆ_õë(XßßÞéh"gu_›øÉrU€hïÊ+»s[ööî|[įwçê\›9MJ¯EjéÓ˜¹%ê+R oO™OTÌ ½Û6Ls’¬6ßÙyEB9þ~9íO׳ñ$çü/zWT›œ¾~y¸÷ãããC)00ì]L™ÉWìí¿°³]­Ø.Y -Õ+§ýUƒ‹¸òQïúi9¸¸œÑ÷"(>Ê<¶+iðpÖúGÃgpâtV^½;ü—ê.£%&¹ìM¨ÀøŽ÷&“ñï—ãñ§ ~Ÿ%9à~LÊÚ‹­õªœì½zõT;}»N5Ùn¤bè# ïí\5èy?ÕŒèVmX~\ÖÊßE«O_?{³ÿËÁÕ‡›éñxt´»7žÿôa8¸]E'a=ŠÑîìeËxJ·5´Vµ5TnYCUk(…n«Û*îóçüˆ¿ä§¼Ç?ð>?ç%ÿÈ?>—ü‚_òÿćüŠøh0*ù˜ñï5¿.'ƒñ9ÿOø”Ïø ¿¡TžöÇ“’æ¿ó/üþ'ÿ³œŒ—‹wAîøÑëý“äNÊ‹›ÛQ“Äyú‚¾°’ ¨ÙEÔ|5ãQ +d 2ÂvÙC¾Ç¸Çü€?IÏž%ù þ ü?œ¯økþ†ÿÌáoù;€Û›öƒÙ`x^¢;~ÓO¼7æ&½~I$˽äE©û©œ5§ÑÏ}Þ_]õ’’t¼üí¦7¬möq|3I†»üãú²Á~¿.Zptsõ–\ŒæÆìMÊQZ)õò:•…¯‡7S˜ù·›ñ¬<ÿ0Ì|™~Z^ úãáx„Þg,7|áÓaoz RÌ.'eÉg¿¿VÞ…Ÿ?|up´L¯8–¦lÁüŠ´Ëè’~~x ,ëù@I<dT/ô±x~U!Cfm'¡ ™]ilÔ6 Áî(Œê¿¤êâùó£ÃÇoŸ/©ÚL\¢}ÍÕÖÓ/êiåíÝ7“rí¿›]!"O{£óŽÔ‰O"`Õ`Ò¿¹ú8,¿,¦s~>{“y:tuN7䬨üÒö®nÝ<.&eku¤Jÿ}ù‘»eóy<êÏ£ qðñc û唩¤òÅg B#c+ÌØ¡úmY£¥Â­š7&Jºg+TV d Iü„ ©˜•MÐ';$ $Ùj ð© 3þ•+[1gˆ÷¡ÛB>ݰªYcoh™EKâöëšÔmn³&™§?¾h'ôsŽ3©]‹Íôò°"íûÕ`Ðz)I'áª{½i™Þ®< XˆùïOˆ-ü`0™ÎÈ[á·;ü¨×úñóà|v9Ísk0êZ¹\_Y?,¯O‰`³>ý˜¯oî¾~ga½,Œ+`¸–0R-HS!WûVþÚ; ¸¶~]N­ e„smáâF„묞V4Ë:»=¿×V0+­ð\­•ͨȶ6¯_‘mÅÌ‚eeh §7C»®yY@':-ÚAÂÈÈו̮ˆ·â&.W´å‘ïkY劌+ÎHUòÜ9ÂFdìJWäëöÊÿæšoïe"ßPB¹ƒß“œB»Ê÷ŸΑ„Tm¨$Ë1že±¼;°üTãý½¦ÏÅËú1Ÿ¿~ñyŸ§êþÓ‡> stream xÚ¥[moGþî_±­ÜÌpÞE4qš ®³â®‡~ð%J"$± I.ÚûõGr9²Wât.P$“åðõáp¸\Õƒ¬Íq°& ÖÅ8€õƒ Hp` ò`sðCpaãì= ÆÉ—\HCȬJts f€Œ4kSœq¨²œ-U;8Q…/ypÁ¡ÖhPk,¸/YÉ´Ù–Áüȃ·1“ îÀ;Hd«|0¨||ŒŽÌñƒÏ÷yÒÉ2d –¬Ž) îK†àq3ä\†2Ê+¨<$@åÖ¸ƒ‹£0˜!ZzælbFÿ«ˆny+rŽvåá ÷¥BCW S9ãh…FZ°¸ a`t0.¸Bg<º…«Œ+€+ D (Ò…„èQ þÅ6d EJ$'Ûc(›\t@r²C#Yƒ„”ø†¢Dò„ØDva¢Wyˆ¡fr'Eâ(øGá( ™R@¸%9–‚ÑÂmdÁÔÈž9ÐP“È> -ÆŽäÊ—Àûò€fZ•¡„4t¡ö´²C ˆ®`(‰äƒ)VÈË‚ég ØHKJ7-)•#±PF›2ÊİYy/¦fI°”ûÑeZZ: ý)h"cÉDÊb>‘0:Fÿ%2ËEíÖ–kéü`–Óµa-)ÕS"¦+Ë¥“å!g˜WÖ{– ¨ ¡&Ë0½ð\°\<‰x){èØàY.j·˜Ôd¥D £p‰Ú"nÁ¥CmÑqãèÌÁ÷ß<¹üóv>ª² t ‹"ÎPé’ìx«ÛÇ«r5ñu,4,GYÞï¡ Ïç(¤l8põ‰d ƒª“îõoQUظˆ‰’sYžxÍù :}ÞGU0#äx%ŠW!Õ…”>4<qUQ.—¤6`+SÑÊb¬GØ_~ã%2U•¥è¸\Sÿà ºßÇ…d½ÃæeUEŠ«7ã dëBÒ›ÊðxUÞ#bÒ%R<ˆÃظdYäo;Ân¢Êãœxåä6ñN Â({|ØG•—Ñ×ë3[B¤~ø u_üª¢ô>¦*¯ˆ†u!-¶ëvU© Îr`}–æÌg¹¦|ME/©øHU%J‹4gÁØ ïd!ãqÏW¬XŒ¯kYQ°’Ø×|›*?QUûÊPûÊà¤c X e!w$Ö.ØC•—új_¤¯Ä·2#‚ôž!ø°‡ª 7¾ÑмXÃ%QBô•”âªjƒ’Á©º—ä8…\%{»‡*)TøÂ*õ(y=e¼2p!ùåÊ~œªh¥Qеý‹N*^ôR±ÓuÆd»´U…‰ªÜÏ_7±4N{;±Šÿª¯M¶¾ÜÈ¿cØC…­ÝcEQîééÅ0Ô×¶¸žÚ†ðèI^cê»…¼ØðèiìÂß'l.ÔØJ[O«±‹«ÆŽ®”=tñˆkluäˆð€kìB½Ö%áxºõx]<ï2Sï©<“ky…oÓ•¦µ3¹ZÐj«Õ™æg㉗†ˆ§gßrHÒô¸ná;15Oùåþ¨#‡Í›ß¦ßôA›ëè/Ã’þBWòUN÷ØÑèž/V>íöìnýeqM¬/ËÕz‚ur…k+œÝ0.Ö_惕Ëõé`åe÷Þò"–óßEà„µTÎ8aTv†Ž†ŠÓù÷vŽää‡Ù*üôêëcsøüæÝÑÅúj¹ž Òž¾=9ùû³§o.fC–—ŠÃ‹—¯ð¿£gÏž>{y|t|~~v.[0#ÝdÏóÓ‹£W§BIׇċó_6Ô°C½üçå†*öÉÉâëb½e­ÊóÛ¶{²éÅÙ›ãÓ‰Ùø–'º:>=>zòê×ãç—¯~>>:9>ýéòe5EêKcó¯Û»íd÷«³©jk§n¿~þŒ6½9?~úöòåÑùñ?Þ¾:?~^÷{yÇ{¸ŸÔž½­¡r¾¾ßǪézSL+z¯ÿuùôÇmâĦ³×B)fš2—ggG??=99úñí‹Çç›mÓýr|~ñêl“62:¼ø´X}ZàƒM"ò²ýìv½¸¹^Í5|W Wìº=n¹ºÑå5Ñ{u{³Q›ì”Ä϶¶¯®->Í[;ïÖŸn–‹ÿ^‘$"û ùÝçÕÝ×5–&$³ãÚ½q» -WÞ-ÿ¼]ßÌh„2Qõž¡//[VËߑӠÏG£ÜæÀ?,¾TŠ›ºÿyþ'åfjøP­z¸½åÒÈÔ`¶Ü­°ìeêÄçåŽæËåÍ’ÎÏ4ü_–£µ¡Àäù×ÕǑ͔áM9R}ÓÛqf4p—¥åÐÍÝúön-R·²ìöêýÕúªªLeJ\.›´Úò>ÛÂkuõùÓVz­?®èa ”‡v=diù±^¼û<_ørÅbËÔªõg¬ÔySî6Wô4ï<=ú´¸&°:I´ÔWò })¡Ê®u\&Vnóí¸öîÓÕíz¾üÛwxxk%Ú<ʨÉ3Þ6}‚›dÔ|øîæëíÍ5ÞÙ¨YšÒËwËùw–8ëûè½ÍÕ?ܺcç‡å½öQÞ#?Î×ïo¾^-®)ýf4—°§›Õzó6ïïé—ÙÆáý.ìaŧÅõûùtoÛ9ªúŽqˆ×ò†äŒR¾¬°ËZ­×Ñ—#ªŠµŒlQ •QÐIH³|–‰Y' PGÕ÷.ˆ‘Êö¶·8–ØPçgô-èÄ@DÐãb"“NLDtàd"úžI±[aíº[HzÐCOhÖ*µM2̧‡‰mLî 2'­û‘¢ï²í9[fkÏYËðå†j†¯èðY‚ÏxKðyÛˆafb#P}ï\Ç]²[aí¹ Ôƒè €aÅz:Áç½n2|>ê΂cbƒ“¢ïSÏY˜iœ]_ =ߨÀè5 FO>í½¢Ÿ ô‚ÑCá(ø¡çk˜)Œ=_¬n±³LÔ‘u^h”(Gà× z&êGÇQðƒïZ²[aíºYº~ö¡õËe&6Œfô¢î®§½AâèÇØs6Î4Öž³žákTGÏð5*²gø—¨gø•Ï3|µÙØ&Rô£Ž»d·ÂÚu7ÍÆŸ°©ª3õ3í ¾huŒ½ýèBƒa>ýðŠ~„Ôs6Í4Öž³à‹k>8&6ŒöLÔ#¾è‘`ø|Ã]Ž~èµA)ÉÈÚu—ák°ÀðEÝ®HðéÎF†/êå-2|IOäÈÑϽD&«Öž³‘áË:|‘áËú¹ _ip2|n4|É4bAÑO¶çnTÚÆØocaéºÑi6´ÚàDðÕY÷‘àK#¾äœŽ‰½DŽJÛ˜ú÷m"øRÐs5|©‘s)2Q/»‰ákTóÄð5º·ÄÑïvIiS¿mÌŸîlføŠîO&ør£Ê_¶z˜²cbC,Eó9£é¬rls¿mÌ…ëG(zÙ7JLlØœ™¨C› ½uÎBÓ¶ÒóUiû¸¯~¼Ù!2xI‡½0xd,Þf:¼MôLÔQ(øÅúŽ·EiK¿m,„^ý]Û11Q/5…Ð+;³zE¿Õè… T\é}«ÿ_v{Fè¶ŒÀÓ“z ×¢Ï]€§'Eïs!¥$H ²1 ±ˆ¶Ó!³Ý k×ÝHÒ¡atbb#™ˆ¾ÁY˜¨sÒ PxϵL°=ghm[Á˜Ð°Šòͤ‘^@M6:‘áË^'2|z·Ô›5=l­i¬]w >k‘ÎLl¸KðYý@ÓÈ¢1ª:˜]#áŽÄ®³»¯ÄÚs–Ì 4T;&êÑ$µêØÒLlr:‘áËú¡Ž~é´Œl·ÂÚu—ákÔ¥ z,MæõRC#½ÇÓh«'²ãb ]gwû bí9K³hÝ4K€†]èMÐP‰ ±‰¿¼ëYA£$vîZ¶[aíºËð5Ž˜§Orº?žák\]žák”7ÏðéÍ3xŽ~ïU­VX{Îz†O—€gøZî2|¥áÃW|®qßÒ(“ÝtÜõ~¦±öÜ ôáTWL³T¬;K³$êÎÒH‰º³4 ÁCÖÐéùg=gw;dâìúX¸žÇ4JV@£<ž NF/éU*0zYéÓtêùª8Û¿k#ƒ§€&)xu‹i’‚PG– ˜j NÏ7Î; B`óM4½JÛûm#MR 1暤@cÌ4IÁTop&꜉~Ð Qô¸ž³JÛ˜úm#MR €Ž-MRðŒé§–&)Hlp|¡qha;Ð dØþî&¥mLýT¦I „FZ%†¯qS$†¯Ñ#cl4ЙákôÈ™£_zwmRÚÆÜoi’©8Ð$¯Ž-MRØà$ø"48 ¾¨ýš„@ì}ýa»Ö®»™¥7T|±‘…~M£;K#ˆúGL QÄF)/ý”{Î*mcé·…ák44KdF&68#ÿö¢áÁ—\#†™‰½7 ¢´¥ß6Ò,ë†zĸ…SÏõüIÿw†e‚Näß3D]ÍBðHö rÙí]ÿW%ކ)RÖU3°ú—;ÇÔ”œlÖQw< ɶ¨ÌİNùU‰ëÿªÄñ0%70²ô35!¦d½Î8ž…dßÊ?vðI'ŽãMÏYÛþçxÇÔ¬‚v

  • > stream xÚ…\ÍÎ-·Üß§èåÜEœÖE òAÙY$@00g{ÞXÕ’ŸâáÂFÛõQ"Uj¶XÍ>ëŒ~Ý×:c^},\Ø5Ýp±.o~k¸ØWk{ãê\mv«y_m­‰«vµs\õ«·y‹«£úÁÿ‹ñWøӮ¾9Þ\׸fŸ~Ñi»¯a ÓÎs…)lí¾æ=0o˜Å´Åú5­Í˜ÃÆx6¯y8žÙeþÙºl.f~™ßÙöeç/†oŽ¿[a6âX1Ô2ø7öAk`-àK„êƒã-»|Ýð%þÓ÷ ê×¾#¯}íÁx×¹¶FöûÚNÿ¼]çîÅûuú²˜ÃG,3ýóyÅ?ˆ(B=‡ãùºÚÝ\ Û=Ÿƒ‘;èÀePrŸÑwpÒÚ‚C;H *àÇîq1ÆT{Hþí¼Zo #l‹Ëað`ÇlÝ6GˆÙúîð!¨oã^,fã†P6avb¶ážŸ˜mÞíÄlá^lÃ'f›ó`„øW›>h³M¬I\ÆlÖoL|b6›“f1›­pÊï;f³Ó —1Ûj æŽe‹Ðîþ-.6dìÙ¸ŒÙÖvšÅl+˘͇Ñ,fs‹â2fóÝi³í¤Þ-fÛ3.c¶mfqW´aÆl±p±é;FˆÁÛA˜q³ÅN>¸ŒÙ‚dþAÌv°­ãr_=þÅÿ{â2V*.ã¯ú½èCoq¹9XÇÝtï³ÅÒÛà`=î§fF³¸¡bcÜØR½Ãë¸ô¸ì“³õ;-.c¶î7¢ˆ­Ò;îû¸ŒÙƳ’AHãÌo¿ûÝ·ßþñ¯?ýýçëÏÿóŸùÇ?ÿòã?ÿ÷‡öÃoF·ïWG¸¯?]oà·»`b¹Æ­+Á0î Žï—Çv è/ß~û‡úñ—Äëwÿ|ûýï?Å:nÎëzÞpw v€G‡—6³'ÀØ94€}ÑÂoaZ†»0úL¦v€KS;6Àl¡À‡¢70¢ÝI°3¢-nŽ"Øõ]™VÁÎÆÑ5C³ìšÛ9ê`'è‹ì¨AÐ×f²XýHzE¸ð[˜–Ⴞ¶ôž››`² éJúôm¤oëA«î*Xÿ®L«`ô%wŸ¾8¢hôõÞ4hËEPï Ãê÷'i~~ Ó2\Ð×§Þsvê[,|ÞÉ._ ¯›¦}5‚zV¿/¯‚Ýß•iì"}®Z¤Ï5C‹ô¹¾ûéK²ù"}I[XýÈŒE¸ð[˜–Ꭾo1}š}#Ù«ÞêxôÅcHƒƒ`õ¸…×´ ÖA¡rj#¨7²/‚É2¾‘œô%[ƹú»JSð[˜VáÆÌQ&ȉ7é;z%6é;:ÕlЧa ‚‰%Vöê¾·mX–±‚½9ôfÝ`oZâØC'A°•„ÁÞܚڃůnÚ-Ž5¯çæ¼z37“gÓy–œ ȳ¦c= /Š' Á*Ú#ާ>6°g#™ìYRœM0Y(°g&-#Ø>äÇ¡qÏ*?÷3c}dœ÷MŽž¼šÎ#q;܉Çäu»ÁëºK#XDK¿…i.x…l#§¯Kï·yƒ×5’µ8åÇۭ©³aõ×ìU°‚ÚVsÛG_zjз2¿A½Lô-½eéÛCƒ\ý]dcú-LËpIßizjÐçw² ÏuBÙ´u¾ý¦¦½cõ½*Ø÷r¦U°ôùÐñtÐÁM‚“`b ú >Jôy²+ „X”ô[˜–á’¾$uÒ§Á(lw’‡éK6Ì }G/¤8ÏT÷m?WÀ´ –ZÊN’µ”¤>ÔRv×™RÈɰ oO(…ìiE¸c|W¦e¸ o'{ZJµ”lGJ!ÛKÒ§¥I)dïŠÛñ^À´ –ZÊ>ÉÔ ï$Fj)çÖ»œRÈÑÀ¤rz²PXý3 EŠ~ Ó*\h)G{E-å$Û‘ZJ¢ÈNJ!G—ñ“RÞ¡Hp¬’Ôû –e¬d/IC”RÎN¢ öf"žNh óNž\PBæ­Kil˜S¤L[?k¡¤L¼7ó6‚zCI™wOÀP×BH€z !„ÄÁ²¨jé·0-Ã]=Yf²—ì¸Eöt…?ÙKÎ`1êÑ*òt®~ù¬]âØèõ±ÑIŸknôyâés½LNú’“¡“¾“XbõÛ]¤\½ÞÊPRbt½!¡¤ÄyToH()oQ†'yC‰#¶ÞÈB¬n[ÇÆ]¡¤Ì– PRLâ}‰ž>¡)Ä[/Ó&}[o™ÍÕ?ÕÓv‹cã®Râ”®S2¤”8jë}~@Ÿv’BØ%`#¨×RHΫsÔÇÆS¡¥Äé^gh)3‘Ì'´”8Ý'+±&– ¯'¹âpõw!ÑÐoaZ†Kú´œˆ÷¹úþ©ãè²Én«Ïf-$Š=´«Âö¼ŸaZDjS¢nH¦±c$NƒØ¡ß¢T…·Al"[´9VA,ý¦e¸ vè£;Î…Goqƒ˜vz%é;É ¤Oë—-$j» VpÛÊzÀ ¦Ìy'Sƒ¾™1eΞ„ úæH,7AM<´(D*nÛü®L«p;èÓÛbJ9š[ˆ)N v‚:žNú´Li«_e(ñ –e¬dï$‘½dËAKA3˜7Á£A°gºÔCetfë{=`õ6†”5’ŽRJ€‰S Ï,±KgIž€`­è*±º«Ä ¥Da–LMötÕkƒì郮AS˜+Iìi;(!Quí*Ø÷zÀêW)%Ê6¤”¿@ßJž¶PâŽÖw-Jð(Ì’9±úË‹®]%V—¶†Â+F×yÇúÈ4z·NÒ§µb”ÙGŸ° g’(ÌônÂ/J›êñ#ºJ¬î*1¤¶]‹„5û1À$X#¨¹…2uÚ(…¸µž©”\w•µ×Õ¸QKñ¥ý‚–’¤j!®ÈF-Ä]ßÒÔB|·*Ø÷zÀꮣ˜âÉv¤˜â[3D1e'’ZȾ“p NÔBv«î[ÑUbuW‰QLÙº»êè7êF1e'G%j!;É`ÔBv²‘©…ìò%ºJ¬î*1Š){%‘>ý‚Î(¦ìäTB-$lZÈ>ÉcõO¥Ñ˜è*±º«7@Ò²jSqÛ(¦­'µ“d0j!')«¨…| Ђ·mÝUbÔRNò裖‚~ ‚½£‹q£r´pg”BŽîOõÎÖDW‰Õ¼RJ9Z4J)h¶—`g‰dnPì¾ËI0‰Õ¶BY5ÑUbuW‰AJ±»'~9AM-¤”¨§ËpÊ½ŠæuýÆcëTݪ&ºJVyd\PRìÖ‡ú%%@Ó y]‰%yÕo×M^õ^7y­ ½%ºJVÝU² ¤XÓïí””ÀkkIDàµéƒ7Îç$ÐM;¯‚ÔÖ]% JŠ5S”KZÅ”kZSZ\4‚šÛÆÕ_…„¼DWɪ»JV#}ž„Kú˜qj"É3NM$y£èÔDÊob\4˜xÝ`âUöLœ};I­Uv’Z©‰ì„xj"+Á°ü»úhÜE‡‰×&NQ%ùÈÎ)ªlý¦Ú)ª$Å85‘£«_§&’4Ø;5‘ç—Ä>…+:L¼î0qŠ*IªSTIZ¢JÒ@çÔD’t@Mä$ùšÈY¹¢ÅÄ맨rtã¸ST9ž€ä/yxQIÞ€8E‘D_wˆ"ë®~ƒÇE‹‰×-&UeÝwâטl:ª*ºQÑ¡.¬[šìPEVòZÑ¡Š¬òç•\¼¬öºÇÄ!«¬[·9uÝ÷ï¬ajQ5]°ãµô#…/~$®ˆS4—ì2A¡nnÉ‹8T­éjE/~­Nb“˜·rÓT¼­yq³î÷Ì´ËÄ„z9†Ö¡€°¦ë¿MÂô§²ø•3݉‚J·uý’…nëwñ~¿'¤Sæ#”É-ùzÅbKÞ¡ÆmÉ«t”¸-ù±"T¸-yë‚·õ*ñž÷DtÊ<„ò8†ÖÓ‚¯þò¤øçÿýô·¿ÿë‡ß´ðûo/ûüßÀM䥃êÁϹ´@ŠÒùJ<ÿe¦‚{ùüTÆË!æÁ‡/’èÐúžãžxù8óãžØj¶ö5¦Ú¦ÿíí»Ýçû3ò‹äÿŠÑÛ3$FoÏ”wð1‰qåøòås”ôøÝðs˜ƒ¡Œû–ÓbMb“X—˜SË3ÊhKbôE~Ãó+ß ?‡9ŸP^*âWŒ¡¼”'ÿÁìq·w‰ÑÝ>$Æùä}lÏ|Ý>†Iß ?‡¹¾ÜUa®/wÄèîP»ÀŸ1ÇÇ*ÌýØÍÏ›v½oÚ]nÚýLk·œ–¡˜Ú´çqɦĞ1MbϘbÓ>ùZVe¿ò÷ÍìcŒOºo¯¿=öŠÑ×uKŒ¾.ÿãl{}»úŠ=cN‰=c~ܱÇÃ|ÒìPŒö¤Ùá[btÉÕò<érì.1޹‡Ä8¦Ôïåñ»áç0¿ÒÞVa~¥½½%ö¸¤ÂüÊMê Õ¾r“zBµ¯Üt>‡9ßô2Ì'ÿ¼¾ Å:1—Ø ¶%6‰‰áI3Û-±E¬} ó=ÿÐðs˜OJœMÝ+OJœÍ$Æ0Õïí¯1Ä8f¿%Æ1ûç0ý=Ì]²¹Ÿ•W¿ö¤Ò©2{Réë¯òýëOºÛ²ß_#n‰=#~|–<þ¾~ ²?ùrÎ[N˘MbÜz³KŒ[oê0Ø”Ø&ö1Ï>¿Va-¶^ s‰qåÕ£¶?¹{ªGFr÷\&1.¹üxùW¿2Ìÿ‡…LW endstream endobj 7034 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 4267 /Filter /FlateDecode >> stream xÚ…\±®-· ìßWl™SÄYQ¢D†¿ H‘6p‘.Ä)bçÿ£!åÖ\©y8xs)q4Iq÷œñÖú¼Ïx«>R >ô§uÁ‡ñt¯ø`ÅJi}~jïSêøTžÒ_Ã'yŠÕ@ë#o/ßæ§öˆÆos|}>õGFÅxm<â=þÏžZ<þÏŸÚ£èûÔ®@µ<Õ ¨ÊÓJ ´>­6sÌ?i:âÿôiöÂ+íÂïùi<*ÝñÉÕ¾¨?:ãõ÷Qo`ÛËÓK‡Å$߫âק÷úÎ9¦“Ý:–§ÃÌÃbNY Ôç”Úb¼9ÀˆÙæ?öÆlã},—v”Çrm‡<–‹;êc.mÎ1–£ }¼MZÞKŒ2·£ØS^Œ0?NAÞúbœ¹Èe. –˦$Ó`S“×c"«S<‰™¬Aǘj®ê\ϘkþSŠ,Ÿ§H‰u±9›Ôÿ;gux3ÿ)bãúœ­æZÏe)Ubâ9e©ÍÆœÍöJëSáR=öˆÏÙÚÜ9ø8gk5ôõ9[ë/p*PšaÝ&Û§(t™çl* TÞ9›ª4|œ³éйÊÜbEçJáçl]@¨¼s¶ÞæÞšçl½[ 6gë^âoçl£4üí\î2êÀßN§Ëè;ÿ)ÃjüÁœÍæÖ™³MÛbbpgžbŠ“€ Zlî |œ³™k˜ÍÙ¼•9›·éÔ(2gó¹ÉðqÎæY¦Nó½áƒà0ÕwêV&W™GƒÍÝ+sŸ„Ù(–;šÍµÂ÷¸ðÛèÁîÌoxcÞ®o$»·…é·¢)K‹mES–Û y~<‚éñnx¦™Q±Óƒ6ƶ•-ŒÉœá ÷‚ &µõ]Vz$Ù7’ax$©¹ƒ:6wP£X؉S ±7“˽ÓY¶Õº°c—ï†gšm ÍÜÍ-ÔYÖÔµ ,ºöKCºöKCºö@?ª™ï†Gš=·q¨¯-Ä"E_:³ûU_zÑ«/½X‘Û³ªêvŒ>ûŽ »3Ç%¥“ÝÕ3Rt/‹]ÉòxÏ+[g9§¯íÁ2H_Ûõ\ߥ Ã3ÍÜ]ƒ%Èž·ºÁ"LÏkÙ(lyrWΫ:Á|ab1_9‹9vš~UÓ—»F§m9ÅpõBh†•]?Fž‚Á®##á8_?ÒßÝðHrþE¥ÓI!ë>ò`ŽÊ±p—]?FàÁ®‹ùÎ×ôx7<Ó,©Icšdìú1²f­Q,¨°<± Â®-£®ùÎ4ÃãÝðL3C:hlÚpW ÅÂ]e3ƒÚP¥XÎ×)–óOfz¼ži¶å®ÑiCi–úFÆËÁ²ÉÈKèB± 2*Å—q<›coc…á™f_î²s´b0+tÇŠ¥,1ŽKYb+–²Bw¬`hÇ;󨳿¸¶±ÆŠ¥¬¹h/•"¸ß²ö‡åµr+\PYÔ²¼ ÖóvÝYaw$í†*tNL)ƒ!¸³òÖ°¿«ÐÅÂ…˜•¶†«T­Ç‹ˆmVb†a…Mˆ;#«¤må9Ö›µ•çØýÔV¢b7TËDeyGýš }ˆÝ™áÑÄXGØ2kiX¦@c= Ëhì‚fe1K_ŽG0=Þ Ï43Za43»Z¦@cU›e ´Â–§®ùÅr¾3ÍýÚl×úÜêr×é´á.«Ú,S Ñž)Ðè^Ïh4He³z¼j¥Ç»á™¦.wÙ1Òå®S,ÜeE’ešÃ³ÚË TbñxBXf“3?ù³=ˆdT$HFEˆdT$HFEˆÄxTçµ— =ýìfzÕ¨B#£UhäT£ OjT¡‘Ó£P±Ê^Ïüàënw#‘œŠT!’S‘*Dr*R…HNE¿Nù5,³Û…_ÿ» ¿•œªÔ¦Jí¥*µ ˆªÔ ÎBѳÐ: v&ØÊ‡ØÝŒLUjˆªÔU [­Súˆ-€üÂo|ˆÝ…ŸB¥BUR¨T¨J • UI¡Rá¡R¡‡A±ÌÇw[—¯»Ý T*T%…J…ª„cÛ©§*ªR‡J­°Ìrãgbwáס’P~* ç•„³€JBt‡J•n–Že®—Ñë‡ØÝB¥J÷"h§gs@¥Jwá€J•ª4 Råb™o%/Ww» ¿•*Ui@¥JUP‰®*5ªòJ§{i¥_ ´±h·ú,/ù¥1ùò’_X“Cò’_X“#;RX“CÊÓ(–cžÃè~É—ë%_J^$ô¥ÓÆHY Íæ@¡Y».L)4©”Ùœ,1Ë~¨WšùÄB¯>Ùw(ƒÑÔ…5Šz¥È@¡wŠÕ°sUSwš·×®ñá->W€VŸ«À:ܲ´\ Z ®À¥xëûåâÚd”Õ? Õ[^Ö…byYV‰Åžm#ɬÛhbÚÎ;vï1¦á‘$þ¤`lãó 0çØEÉ˸5`c lp¬;j¹<&–W¢ƒAfF~e÷d`¬P r*—z²ïX†5ïõÆs|˜å')ìKšA´ÎECA; ÍöõºÀ Zçíí~!ZÈÎ-ãN¢ .:*:¸h¨b”¯š":¸hèŠèàb£-¢ÇW¯s˜XÞx¢±¢ƒ‹†ÎŠ.::¸hèŽèࢡ=¢ƒôGÖ·D¥~˜å•(D3.êË/¢ :j\4´IÔ¸hè“°oZ†57½ñô³¼ñD«E‹†^ ûŠg`͸hh—¨qÑÐ/Qç “óWCó˜XÞˆ¢tÿ"  tÿ"  tWÎ¥û!¬/"8nHýF‘0¼D$it!4ýGZ§[a¤ñÐ#ÕxäF h½Ÿùí!öÖ]­Ñ²l<ê#~4ô>ØØ‚Hk±èY–Kê[•vûaÉŸÈaïCÕõ9$ùòŸÐPR—ÛÙhz³Ñ.íœê÷÷¨ëí—$nÍ\ʆ¹Ð”žMqa?j6Å…6…mÙ)ÅÒîOûNóúæ[]ov…WV­Æ{•ÊŠÕxÉPY­_KUVÆ+è¥õ\»|ùXâ·ÎÔ)³y;+FÛ:Tì’ÜÖ¡b·ä–ð„]“[|¥anîc¾ow»3ÃøNö¹ÐY{`B±X¥˜Æt_gŸõ Û:ûç^bÛ¾Ež†gš+<°¶_[á]òÚ t ¯óM7džáJ7ˆ-ìx=luß®×TùCi3\*Á„ý,™§:«N5žgtVjtÍ;«N5z³ý\¶ý<êÿ_ÏüË ú endstream endobj 7135 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 4252 /Filter /FlateDecode >> stream xÚ…\»®m; íÏW¬’]pIb;v$Ä Zt nÄ¥àñÿø édœ¤›{•ÄÃ#qìd®¥øÓ>Úi~ÆxгŃ}¦öxX[Ó¸}zïOýã äñé¢#žèÓ­Q<ñg4âoþ$ÞëŒnÙûçêE?CG¶°ÏXœý­õOÒ>D¶â©hްMƇLb4¡7‹1„?L=Æù°d/2?¬¶‹~¤õCì#ƒ³ÅúøÇØŸfûˆ¶°jö¬£Íñ™Ñ•?Ñg’…¥“?svõ1œÂ´ôÊt i¶ð!©zq@(,¨Äê®üœûÐF [ÜMÆÉ\éc3ûsƒÌtù*ŸÕ{ô¢ó³Ê»ªŸUÞuZËZþo}zkÿ4¤ìÌi¼bhsIš¦˜îªÞ–ãÏ‚‰?r —9Ï3õGK˜}úhéI—¢JY—6dD³å£ •h¶|´±4†X>4Ò ñ 2ÈG[>ÍtŠëïÓÊbˆå£±>S*¸|4÷„Žæ£±µ>š4Ÿ˜~ôé÷æì-ü‘sÚ7ôÑdIþ×G›aµ?úh“GGmÎ0}4mZL§á~w¡Z4ë>šÅg}¹,¡Óè>šªæ8&zo>Z÷Ñlp~ÖG3­†/÷fË~}4s1ãÑG[9k†Ïj÷P8j¸Mî–`øÌp_ÔÈWP[1ðÈÅ4\·XŸÎOò¿¾œ\ 0Çqóc¡Œá Ê%Ê~—?²E¿>3ݤÿuVnç‡/͘ˆþè£ na¤[ê}}ûýï¿ýîOýõ—þò›üû?ÿüï¯ûå_?ývÈO¿>ÓÍnŸ?¾‡$ ¡AHbY@¡Ð èço¿ûãßýû°­g»Ÿ¿ýá‚Ã;nМÑbL…PÈ º"‡\…›©ßù/ÐìE/D"(Ò‘Š4B$Â^ ‘Š4B$š æMôäëlö G¡A(4"¨…F5¢°”¡F1\ ^æqç¶ží^C$†"QˆÄP$ ‘Š$Ô(84èʰ¡ÙƒÝü:›=Èeû;T!æXGö·Ÿ\pyÈ!}cˆÝ(l´;?ýíîüh÷ŒÔ£XÍŽ1Ä(1'†<À5œ¢\ã=æhZ|6¼Óä2NR.sá,å˜qŽ Äfbˆ¦lšhâÌÂäN3->ÞiÎò 6] ±tÄÒ‚hjQ™ bi‹Þçì«<ä%Ë>ׄXö¹ôJSN5çSÍ*ó¤!5«Ì˜@T&0°Ý§@¬úœ«>ï4õ¤ù¬·fÕT‚ÎtfÕTÒ;ÄÒ¤h¦-ƒôÛD‹ ½6õž­ƒ ¾øeeKÚ}ÞYöãü#ÞiÖ.-èXk—tÀ¦µÿÚµ6 A[¢ÖF!¨ÔQÙ}^×cY|6¼Ó”m’ÁaË$1hEPA•³VT:kEPAµ³î8ï4Ïûlx§¹#(Ú¢uGPtÀ¦;‚ZƒXö‰6&ÝmLºC ]÷ʲølx§¹#¨M8l™bS²œˆˆÕ1ÏjŠV ·ŠÀ»®eìÙîÊÐê˜g4bïbEðEÛ½Õ1Úí­ŽyvXœ>¬kšnç1=y¬ŽyÐ E牦”å16¨RÜQjƒ*Å¥6Ü!D~ë ´{ð‹+NmP¥¸ùÓUŠKJmP¥¸¤ÔUŠKJm¡кüÚ=Æ58AãæO;T)n)µC•â–R;T)n)µã±ÂÍïüÎùIü¤"u(RÜýi‡"ÅÒ4(z¬LƒÝÅÂ4Ø[¬KÓ7ù:›=¸Å¢68]bQZ”;yƒr'o0Dîäm!]wò¶äÎо@»;üÁp·“7ï*yƒ—´Vɼ¦µJÞ&œØ•¼ÍÇ=“7{&oFÛ$ÖIȼMZË>Ñq£Uòß±JÞö«.?¤y&oöLÞL¶I‡-“ÍJÞàûVÉ|aÂ*yƒoLX%o—ìLÞ왼Y%oðí«ä ¾þ`¶MRˆUŸ±êѬäíqbgòfÏäÍ*yƒ× VɼI‹MÙU± ^T­ŠMû¦êÀr´y-íÌß²á•äêÛ$dn'Xɯ N°–_uI0ÑÖªK‚‰´V]L½®Ìu^¬ç%ÁªK‚©‡µÄÀÊ\;΢ëèµã,ªEÖŽ³(…_uX¿Ç Íïï²áfõÃlgÕY?Üô×ýh«Y;v/ƒXÒDÙñªóm½ßß•ÅgÃ;Í:‡Iôª-&´K6¦‰Ä(±±¤Ùï4é¤)OšR4Ñf½òå¯ÓÐUÛ‰¢›¢UÛ‚¢ŸUq]ÑϪ¸®÷Ÿ²ølx§iÛ$¤Šm“ be¢YÛ‚¢K’Uq]щЪ¸®r-´Êâ³áæ~ç쌔›‚‚ëË@¢@'mE+à³€¢@. ( ”ëñÜñªYµºrkYê+cvQŸ€£¹€¢>aÌ<ŠHaE$H0Š"’oiú¶õl÷ .М,õj”¥>C²Ôg¨Q–ú Ù (Ü,íÎo|f/z!’@‘²Ò(RVú‚½" )+}pMK™æè51ߦÍô²Ð¨Qú5ÊB_ FYè Ô( ý —B–ê³ßù}ÿ:rµ{ ‘&)^GÖ EŠ×‘uB‘(DšP¤à70n¾f©ÛԳ݃‡JªÄ¡Ò„*q¨4¡J,ªÄ¡’µÀáfw‚|PžO‚¡’B•8TR¨‡J µÎx •CáfÕ?ýíü$TR¨’„J U’PÉ J ª$¡’ÁÅ áf£;A9#¨è‹`Œ9à!dÂ6t%¤kۉ̈́X%6ýŽõ÷zc.>QibQ¤Î±´¦ª qdª ‡¦*ÉTïÛÄñÆ\5¼Ó¬Š/¨ªèðº¡mÒ‚Xö 'q•Oxï:Æî4ǹÛó“&o“[&!š»|²±ìs5ˆeŸ ѬZÅÚ}ÎòIs>iÖÉ™5ƒÃRbˆJ•HÖIJÏNË>;š´¶û¼Óœ'M{Ò´m’ÁaË$D³J$ƒ…G•HÞ*‘ ¼A Ôî €$_ÇäÔ+ê*wzE=CõN¯¸e D¤^qËPùÑ+nª?zÅ-ãëÂ,‹Ï†wšö |ó†úØæ"š åï7ÆKš(ïL®b–ÅgÃ;ÍŠ#¦ÈóG eB½âˆ¡T¨ï8¢ ±êÓ V}^Kâ.§šóIsÇ”ˆôGŒ –&¢¹ãˆ)ĪOƒXõy§©'M{Ò¬8²Àew`#±1J ¸gT«v´=š@¬F»OÙã-²jx%9Ú6ø}T Yà¾-°4 á–}¢}fT$XhŸcw¥9Îh< 1¶¹ ‡-sÁô€ÖèË>Ñ>3*ZhŸ¸]OsÆ™g4*î-t°6*î-´ÕŒ \ sÕ×ÀëË>ÑVS_érìNóL€Æ3ªï!y×[&!š¸–4ˆeŸh«©—8Ë }=XÝŸ ï4m›‹hÚ6W!Væ¢ ½ƒ:;¨¡íkì ¦wšv† çùñ¨o*.´ûú¦âB…K.M74Tߘ€ùq}_¦Ç”ÇËv½ïØÆží® )O§ ÅJÊC[˜’S0ÃŒœò€&ä” íY’¬]éèx“Œ^ß÷ ¼³ „ý Ú¯@½-‰ˆÞ™º=ÎÆioÉ(½¢½%£Ê˜öžŠ*cÚ{*Êhï©(?¢½§^ßåÜŸ ï4÷–Œ*cÚ[òÂXš îVKs—A,ǃ+75µÇ,=“sz½ªCµ2¼ë‡¥ÄbœCLˆÍÄ&Ä4±û”=^Õ©†wš\D™q¹e:ÄåTQ— FƒXºeHÄå‚q=W&>'-?Þ{ˆO¤Q‚Eùý!ÇbRîAš$åt¤IRî béjšß/Óë¦<>‘Þ¥‡MïÒ€Xº‡béÂîY‰¡ =Ëu|Ÿ´ÇMy5¼Ó¬/ùSC©Í’Ð,YÐ¥"Í’e{4˯(Û£Y~•û¬-“Ï–/¢© ºZ¤Yº  š¥ :Ð -]æ°t,J®Ì–*¦ÇÄÍ–w¦ZªÍ NÕеi©†î½HK5tñåXª†n¾K¯ë}WÑ3Üê3Üj‰†rfÇR4täCV¢Áܶhè0„l‹f?h™^¿‡”Ѡ媕¢0å±R¦Ü÷°€÷=¬BŒ3ˆqbÈ£ÆCÛ5ïþzoGVÃ;ÍQæ¢K}¦m’A¬LZË>ÑO\¹bGÛ5WbÖéNóøijx§Yy]G»6ó6wB¬ÌEJW¢ÔÑÎÊ•(u´³r%J]®±–Ïc~ýø^|"ÍEÇ0\ÉIG$Ïmî„X™««ñÐ ©M·ßßy)‹Ï†wšµsvt·Ìµsvt·Ì¶Mš«>bÕ'¢YA­Ûæ¹sòzÒ\e ý¼Ê$ús^*EdÇReÇR´¥JÛ£Ù•äñz5¼’”gÑ ±ì8 ¾˜Xš´v,E5¹ìXŠjrÙÁðú]ÂmñÙðN³bé_ƒ¡úáA}BŒSˆqb1I §úQB÷¢óüáÁjx§)»kDsn ™[Áb ãõúe=èx½~hÎ14Cl÷yÝNä¼ß“çÅ{ýBžwh®=¬B¬ÚÌZµ`:×OeÑ@¥XýT–cw-Ï4ïù[YT¿<å]#“ú6iB¬LRˆUŸÈµjÇÄXöyýí:+‹þÿãJÿO³ endstream endobj 7236 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 4287 /Filter /FlateDecode >> stream xÚ\½î/»mìïSl™SÄ^‰¤$†ŸÀH‘6p‘. 䦰÷ÅQã«9Ü4û?ó£ÈÑÇPÒJ;»Øó>³Ë|º´ý°}?ø3\âAßÇ›í‡ö´¦c?õ§ÉœûIž6ÞµŸôi+ŒâÉžþý%žÆÓ»§m”o=m×Ó§¥­?Ý×¶µ÷‘Þ¶­µGÔvDÖ3QyÄßDõѦ‰Ú£2[ø°¿;â(T—ìm=öZZøc}n¿ã}Ìòw£=6ówAÔ|è~’g´Œ4þš‘{ư>ÆxÆJ¾#þy}—<"4‘ˈ?mìÊ›ñçôíc¶g½}û˜ýY›V<ɳt%ªÏš-Q{–뮫ÒÛÜ„#׌4èûÈH§?¾2Òõ>í}3Ô òJÆŶײZW4É;Wþ Ú¤½-`ñÍžÖØí˜U»f<άÛhˆÖ\²Zocûõð]a;öð5¶Ë Š-JÜåFiò®m¿j"m—á51Ýíã#ûʦãáMß7Ë oÚ%Ë oª»0yÃ›Žˆ:Ûf¿“¨ŠfÙñ$l›ÉÌÿ o6ÞüßðfK‚›ÄßѳmÞð6véñÞ†õ,7¼i»„ÞFÔê~ o³·¹ÃÛTÝ%D µ9¢)ã1¼Mß"S[A4¼EÍFŸßÍ"aÛ–y–ÞÖêYnxó7½õðæ=½õðæ–Þzxó™Þ¢·4÷¹ãHûÛßüß=˜T<¼E‰1®v“ÃéõwGÖcnšëslÙc Ë~4†-ûѶ@èÈbÈž ²L"G#êLÒïM4,)Ê‘–IäH Ë$r$Æ'ÅPæ¢ÊtŠm¹_o¹ÚBÄ·aMò³Ø¢R ?‹-*ò³Ø¢Rú —ô4­Æ±ô×fIó–Ÿ4¬iB~KùY,aˆ;¥ìX@[m t ~r"¾ kšX¯.–0p–0ð"Jèö£@šè¤`ú³L)–þ¬TYD|–4³,ò’J±Ý)tí‰mY¡«OlÌ ]bkVè KuYõÂäî±ú¹E‰¥~”,ÔkFK^aªI$¯0U¦±íK=𯲓M[¥Ìê½E™†5Í#{‹Ñ<²Ç–_*'$£XVÁbàèË4zô®< z"¾ kš˜­99Š£ )u–iRê,Ó¨2bš«‚qüÕ4¯w[0¬iBÁ-¿ìlù¥8 álûR!ÏΖ_:?FìõÒDÇÝi?gy ÷>©Û¤ÙÅ’fgc ìÒ)–þÈkAtžå¥Èê=ϳ/ŽÙñy¡n·Ø4ÎÞÃaP ˜TÔÙ^¨A½<׃ho»š!ÔÐÙÛ8“ƒ)Å2"ö‚Ì KÎ^‘dÉÙJƒ,ù(Öîž}¾¦4¨š³íC;²Ä6” cÎöÿ çÍœm*Λù0ŠÍÄÊ1iz·æ6¬ieùËŽŠ²Õ•]bY«S,«€%.; »jšv·æ§ÂÚQØ5©[PY§XRa¯í çÍÜŲ5ëE¦Ý ›†_4WÍj7‚¾o£XO¬SLãejb¬C¯ão~Ð\?ˆaMÓQ4Ë—Ù‡œ½cÌ un#i Ñzã=1”ïŸíºPÃ’ÞxÑ?q›­ÁÒúh'$Ò‘GÖ9–þX~Åõ%}Ë'âÛ°¦)pËÒóÐVzBC™“b(“U¡Ì:]¹i~ÎpML_öŽ ·¦c]ïŒW–KÇ[,'ŽuÊd4ÏÀ5Í{ o|¾˜ÅE¦(ºS·Yó,'&Kg/Ë'ÆëbHŽWgȯ½œŒûÕì×%'ÍsµÎvtæÑ¶Ó:Ï€d‹Q\q Œ4ï<ƒ•¥™g@Ö‹ÊŒ÷¶«9žñÈRúïñ8?÷´pã(Šfk·¬kaÌ5¶ØÂ•¡À„b’£‰ñؤnÌû Äü¸UE7ê6Cb‹¦™ûO*YÎö.qý'¬ˆ&ãN`åÂyÞ£r}îöàOÞÉgn“$ÛŸ\ $ÙþäÊã± ÀÀll ƒë?•³×uïö|^ÿQ\¦‰¢‰àú6v‚×kË2™^ãú6¦×¸ñXMó>S°>—\¸âE3šGdØšb‘ak Ü™ ŒuÚ#@lQ°Ž­ò¤Öº—\ëS€p¿%Švê6kž­)Ö.6¹_G¸Ø$Ü„ÐÎD 77´×çîÖ½©¾>7Õqñ#ŠfáúqKÂuˆÌdÈž°lêÝ íõ; uOÓýsšŽÛÚÙ; ÜÞ¬QL#]×/´3Åõ íln‹ëÚ¥ì®~hòÏ­fÜÐÐÎt´3Å íLGqÅB»²ö×ãÑ„ ôò׉ø6¬iBD:Û›ÁµíL˜pÊ_;{‚{ ÚÙ+ÇHïlÞˆ; ÚgMóÞ½óÏM¸ò M;qåAÙ4Ôˆ0­ô#"lw´3±ó…*ðR|ü>Д†5Í#>L+ýˆÓJ\‡ÐNÎm®CÜÛ·l‡›·þ1(/í±¯³”öU#¯c ×´“ÿ†kÊ>¸a¸6 BôÚpŒ^…èµáà¿J«¦ê'âÛ°¦ÙOHŒf?!9Å2¤ÎhBΤ Ų̮C™5Í~Ó”OšPCö• ÑwYËpÅ)–áêK±ôGÝpH?0-iÊoÏßÁ°¦ …rËpä=0Vã„äË2Ñ„ŠŠ Å`WÓ¼†5M(¥ ¦PJ‹bYƒÑ„œ 9–e8i˜P,Ëœ5ÍuwZÿì´X'²/hཔ³î…£çʾ‘a8z˜S,‰WËHV+IúÕeÓ°$ÙŽ&’3ÖŽ&’cíyhíyhíÓuW}Kš÷™uÖ4¡{úvêVc4õ„4(†2'ÅP&£ Ò.%Íkç†5M2yo í¬;Ò¢ÊtŠe™Â:-Ä©þ¼Ä‰ø6¬iBÛT”ºEHF1MŒµæ:á:ÅÒK58 ®j³¤9ošþIºÇ>/¾NV†3ÕÊ> a8®ì†“ÞÅ`7J’× K’8­ìC†ÓÜÊ>aýˆÙ±~FûbÕsF4™æ[?#ºÜ±û47 kšgÐ;k•3j™÷3j™÷3j™÷3j™÷3j½¦i7ͯ;zû9ÂØÔ'¶•}­Àpb[Ù× '¶•}­Àpb[̓qˆYÏ× ~Js\Y³¯ÏÖÄLÆz§n51Öb~ÂC¸“bðG”@ ¥üôë0¥}¦ÌC®Ì#ÆØôGªëKd¿Äp\Ù‡ ‡ÀÕjŽw¾”OñÁò(™±„0±ïÎy+ûNáœw`Œ¥œ2ÅPfͲÝ-)Ÿ4å„´¨Ûì®ä;E†Õ‘Ú:Å2\6)Ì~ŒlÁ·ë¹EÿSšrÓüœýàx¹²KøCHŒ&tÔV§X–ÉÒ Nb+»EorÄ®<w"¾ kšG+™ìËÑJ&û8z®ƒmàèy`bòŸ€f˜&VNòäžýÈ×—áè¹²‹ö†£çMŠ!ÜE1„KzAöugËììéç4àO)Þ{\Ÿs‚%Î4§Õc çKî,åá´º²+ò†ÓêÊ®ÈN«ë¨·~®ƒ¿öyZÝpö;JÔ+¢%­ˆé:ØÊ'ÒkË2¥S,k ^‘ܧÕa˜4ÿ€Ó'Š endstream endobj 7337 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 4268 /Filter /FlateDecode >> stream xÚ…\»Î.»mí÷SL™>]x ?A"màÂ\ÈIáËû›"ÙähmN7ÿ¿†"—$’ºp>Y‹Ÿ÷‘µô™kœ{6OØïöÎÃxlîó0Ÿ1v<­g,9rþçà÷nz†®äg¾¼~ø“[g´b½tþÇïCSõ<‡hØyšÉt=.è~x¾ÒÃ{nÌ3o×Áò°ÚÑËþò|^§#(tˆw„†™¾¡Ã)è ²¥Ð!ô¨„áG-xˆ<6B‡¿l;tˆ=Æ¡CßÇ4úJÇ3Þ¥> ï -ê#âŒã’WßxÁÇÄ߈Ø'«kR9ãhÇ·z YÇ54:ÿµ÷sØù¯¹¶¹ç`sm“éŒÏ‹á½zÇGw,oî<º¶uæ†?º6ïœÓw>4ÃÍ?–™kÛï:–¹öá]l¿®mïÃ|ûD[õýº6ÿg<º6nµ?º6Ú#þëÚˆwˆ¹6Rñ^ܯkãñÆ»®ÝžóèÚ˜ø¼;\‹†k“7´ ×&óô´Ï/Üg8·³"g<÷pmb;ÞumêÿwmõéQä®My… צÊçÝéÚì=³óôá°5ϻӵ®ÞîÃg`¼°ÝmÞ/?Î/gÚúº¶éÞôJhóf|¶®xÁýÉÇÐkû8Îq:ч?òÒÞ[°%É,L/®`!± ) ±ð0Ó’Ë£QæårmÃlZ| ö4ËûPâæò>”A¹¼Ï^ˆEðvNÏT”…8—„ú¶q6-¾{š¹¢T”ĘË$4šé™:^ˆ…¹(8úP:a­6ûѤk‚=M-“ªM“Íôh±hs.ôÚ³Ž’ž¢^#)_) tø"oYŠì%'K9…XôÊ$’.«}&I‹oÁžfæpE™D2‡+Ê$’‘BQ¶tuEÙBrÓ©hëãØ‰ZÊíÆ2-¾{š+–8ŠvN’ÑGQ¶Œ>ŠVã’ÑGÑz\vQAÝS‘IzšëZå…`O³› ¨6ÌE©Or¯«‚fAE-d%×!j¨ÍŠhÖºfZ| ö4+ êù zf;rö¾[ ˆíÀÍŒh–ÿ§4å¦iŸ4­Ì%¨6Íeˆ¥¹1 ø¦fEHC›Ü’´‹d¶$5c©MjƒäÄ&I”I4c°¡•¾ÎÂ@§ê*¬]å¥Å·`O3c¢¡ð®€ zi C§^J%GK90?”K®]±ë½üÑωf@0tz¥ M†^µäÐ )ïÓbѦ¶ÛL½7&!ØÒ ­¦`ZZyŠnˆ¥A`¼¬¦¬mˆ…œa¹pk=óÞ—Øç‰åÂL Öˆ"†z Œ^Hm¶!6#ˆ­Àz–÷‰Aö4cÑáM#š;ÍE‹r£Ä&Æ‚ÊD]À%·!–rmÊL‹oÁž&gNLÊ$ƒX˜„å&Ù&:l1Í6ÑÙ´Úìiòµ/ Áž¦–Iˆ¦¥Iûž´1&Äæ<0°öÉ+~ßTDmàISoÁŽßy#ºŽ°ÚàN `£Lbˆe›±lôÙ[ŽÎͲøìiÎ4‰ÍŠ!à2ã`!' ± "ˆf9:H#‹6µ§9oš_×]ç0I'TqIÄ(° °ŠK*K* ±´ÅZšûž´ôbÏAÅPïf8ï‚Ø lClFÛ¡Y ¥¯§I¿ ±)ØÓÌP9Æ Õ†¹c@,Ìhdƒ –úÍŒu£Í$eñ-ØÒAã-¥ ±0äœX®ó˜…mˆE›m¹+S®ç8s¸@9X 8à9¦ãÀ br°ýBLkãOZ| ö43””1F†ÒA¨ãwÉ¡.Èø3Q)gg¤¯SfKsÝ£ù阣S°ÚiA4ËùPÆå|‚Fºœe“a)×g“q;æ°ÏIkIe“a9iQ6–“eÇbÒ‚-KÞ# -Ï\µ!6­½ÄZ†1ÇÇ ŽoxVìAë±YñŬ™‹ŸŽ’ v@<3.Í·;ÄãÛ)ççÚgfT›`ÿt°b¹Ê"Ä2v¢3©0$Ç…iËò^ûLþ¤™É}‚Ëãƒ͉:ãÄœ bÑ&Ø[,ÛD4ÓÑçZ-M¾iê'M«¦ÑüÊX0Q&‰Á<‡šM…ƒ Ð7+dî~Â^')Ør\£šFjÓ¿&¸CàU>´b)Â˪™Ž63+ÓÖ¤®¦,¾{š¹˜h/´ÊÁx@,LB›™UÎîx•ó±B,ÛlclZ| ö4ËÁ™[Ž‚RÅÊŒ8QªXåhã±k¦3‚r¦÷c)×X~n¼v9Ú×ïšÍà$î`Áe’Ùb¢L²ãdÊ10ÓwzÁê3É~o–Ÿ©$+C½iÔíé(ë5ˆ* ídvž—-™²jÔ± ±Ð×^F—Å·`Os—¹ Õ¦¹¨çÓùJ3Y5êØ€Xè›ÀC²ÔÒ±žæ½ÞŸss™ÄPmš„h¦C¯õB,Ú\bÑ&Ú–e¡$­ÝfÌ}gÌý™1³2”Ê;÷ÎG7fe’B,Û4ˆE›ôB,fO{’Wß‚-Mʰ‡æ^PÒB[¯, ¤î|8 (i¡¼˜%‰´À½;gI"­öÞ= ¾åz’J‹Tq7ÄÒ"‚X¶É‹ñ×îL µg9.Ϥ¯Ë=¦Š¥: Ú0íʨb)Ú•QÜÿÓB©Ö1 uOÅà¶Ð¹,¾{šÂÕ Ú ‰Îø¨â¬-ˆE›(ÛRÅY”m³šV{ïUß‚=Í áûE“(cðF5 /i£ŒJy$¹QFÍâ&ÚhÕžåM´Çniòí›òé›Þ7Ú÷‘”¹ÈÇ´Ì5ˆ…¹0ªe|Þhã–Åœ´gOSnßü<ÉZPÚhßGÞ7ʨ\ñy!(–¥h—™÷E´AuçI¤c½gÞç"!Ø’Ì:QoÚ Úèt¶˜g8Ž-ˆE›(çöÔ1Xʵ4Óâ[°§¹Š ¢™qo£›±ÜH8†hfpÚ( e¨c±°…ÛÄ÷Œ?ïK¸#š€ftÎÉHÐ9'W$@7j\Þ.ýhÞ賆”¹‚… š,PÖ”ôLt# é™Èû$FÐ9Œ”ÓöW_wi ¶¥|KJ9-J‹Rމ6“RÎ*Ü8K/‰ÐiÖ9:Ö®Ùå>‘Ï•A–4¡ô–~Ž ˆ­ÀP÷pµ‰S Sˆ¥¾v4å^ÎÊgÊÌÚB"´ñËÚB"”0²FÐ1†XÊPª5ÓÁ@gEÑj3¦\ß³ñgEgõœ7,ÊyI(™dõœc ´æÚdiMµ&µQVï9ûYªÆZs툴æºÄÒšèXNk È­5 йšå@·õÝeð%×’´ ˆhH¬fŠúY©æ˜°VÓ…í¬T#B7_Y©æX»—¾JHù³R³îË[F=[m•l–µˆeMf´/©J5Bû’*#kóå]©–‚=Í]jQǧ1ºªŠ3FCUúÅ(W £\µTÜ_ Ù½ý²ï)›‘Áþ"Œû¶53¸ÏsPÎsžHltUy¯Ö)íš°òYÞ$UÞÄàÛ’ƒ­À6ÀV™$Ë6bÙ&¢™–ÛØ#wyS ö4kR‚Ó:©º¦ ± BX.¨éšÌd‹6Û3®²øìi–Ÿ0M-µbA…Íò/dræs°¬ –Ѳ¼V)ز¬éë`Ál<¤Š{ÐH÷08ã’*îA? U·ÒÌ_ß‚=Ír#E½[®bb!g¨ ÒЧâR%1èSñƒÍÀZ×ë¦ùuÉ'Umƒ>ù–*—pø#Uƒ>ù–*‰AŸ|l†hæ\¯o¨JSîIkŸ£™¹Dö Õ†I›´#=Óý@íS~™6P±¬Té õïd2??R…/‚‚l¾ÈF¥ï øèDª”}?}°èRµªÌ¤ÿJº,¾{šåC‚Ì-Bá§ÊLD•rACY¬d¥j:¤ý²­,¾[šUöJ¤Ê>P–©²4\Uö! Lë`Ñ7`A)UÓQŸOÿŒãu[›r=ÅÜ#è» Öb’VQx©jEᥪEtnˆ¥\;’ë:«”Ïj©j{~©jô´Tµú ú`ÑæÛ¡©“Σ›[š×Ye ö4ótGÁI°T‹Ò ±Cá§*P­ —”A,º‡zšt¦|EÙ*|AŸ-K¾(¿ “x@,F :{†E¡ieRÓöH¶,¾[šU‹®O¥jqЂ´ªi-ñvÆ{óƒEç€ëO©*m‰"í½åzŽÀ®_ªGÑêoWŒ7œ &6 ÃŒVU cí×eñ-ØÓÌÐf™›ñÇÆ‚XÊç«‚±”Sˆ­Àzš÷BvÝ•HÕÛÚJWÁŒ¡­tÅÚJWQŒ¡­t¾Z5VŠíÝÒä{Ò~® ª€ÅÐ*¯*IÐʈÒiÑžrÍ€ÖLUbhÙXõ'¶û¡¼²ôõC8R%*†be•¨Š•Ud‚~eMªÈýfšT‘‰¡hWE&Ö¯dé:wNÁžfÆôÓi;En÷Æ ˆI`b꞊?ÒfÌ´øìiVüA¬jbÐO HÕ¯ +¥ IÐÇGRUè{©ªþ‹¹kbR°§q„ß™«…!s-1J³‚_J«,¥Ì*KÐ6úнþä˜E Œ>g–,j`T !Y]à˜@,8NÄq¥ZæÖå¯v%Áeð%×’¬«cP¡,uuŒuC‡&«fƒè@H³Ap·¿4âP»ì¹¾ ±–žžÀâí2RÉ ‚$ Ð)ye…>vÌ;uÌ_-£?ÑÒßþòMˆµôâ¼ÆÛ]H%tw¶æu!àu„ È‘!(3ÒFRûm ©Ž™¿°N³‚îƒ(BœòùÐ>$&Äô ±´ò’ú f§YDìt$¸Ê ·A_‹„Ó OEb&MpRs~¶¿`œþV((ý u- endstream endobj 7438 0 obj << /Type /ObjStm /N 100 /First 1036 /Length 5177 /Filter /FlateDecode >> stream xÚ\ËŽ[=ŽÞç)¼œZøo‰uýYÌ¶Ñ ÇåJŒÔÕv¥‘~ú!©sã9’\@ãï‘¢ÈO/’“è]Ü™]ô.ïÀúðfÇ » øv)!¸µ&ñ—ßYç,áÎ"zþ ;£ðÅÍ9}£¯´á#ù<-z4;!ò—ÝAʼ:ÂΙ$T·s€<ƒ„:oYâÎabU0ì\ô27î\¶žÖÀ´ó&²Æ˜w<ÈoYJ°;âeÉ=K nç³>¿CáÁ _Ø¡7¼.)‰ ­Ò£ãuCÞa6,%š]0ׄ8¶#Â.¸Ì|$4 Àý.D>Ü…”yµH‹>úÛÁJº$|ôDÖ/‘Ð(ےȘ$¨ɯ–Ü.ÙÈVtÉãG•xIú »@fÄ]¢É´FJ»”Z([Ãsi2ˆ.Ùî²—Õ2ì2Fæ#us”Î~—S>Úsc„L›n¼ØIf[ /“}fÙ‰œÉgÀÑh }ò†Ð§¥Ï(v’¢ÓÓ'ù8† 9^i+,$B›>i5giMú¤Õ¡÷>i5ò ‘K«ycX‚¥Õ<0ŠHŽ`=ëGŸ´ÁÃÂ,­F:ñ–VCȬƒfWDBÂb*hµ`Òj–V âhi5òdþ¤ý°ÑX6“ÜÝFqà#!«­–L”QZ-yö5Z-E± hµ\p>?.òj@«åPx3Ÿ*Þ $_cÙo‘þ Æ[á€>C’OGŸY4sž¶3¼„C>ãå3Чœj$¼˜Ý·¿ÿýÛßþ÷ðrºîþõ?Ï×ÛëçË÷Óå¯}ú+>ìøHšÝÿí4!1*„Ì·%˜¿ìí¼5)ÕHNH™Iÿþö·ž_ηš–›Yÿþö4í2ùqÎÚŠ($[#!U̶Å:ÚÔ Éå-É’·=ëD×Í´®y®ê+ŠúaI¬‘ʬP#É6øX# ”¾²yXÖ®y¢ëfZ×<,ŠÖÜ‹¢5Ä¢(å– Iö±F’=ÇP#E!ÅžyX1/Þ3/‰Ü ¢¡ m$ D¨‘”èj$%úI@‰Ø7/=l§uÍ ÑXA4æåIÌK¦F󒭑ļ5’˜—\Ï<Ñu3­k^,æ%_[R&UÜ,ËseVH±FPrª‘”Ü œqc^¾9³ ÆÔ–D!m÷AL€¸“KV 4V#°FrB =ãò:næ{i!›Á¸-Ô¹x°¦FE­­‘DQ 5’¬e]$@Zß1/oÒ‚L뚃 ó`°!ÕHņ\#‰ •4J$±¡’FsÉzTíõÌ]7Ӻ敬Î×–ÖHbƒÛ†£ìEs$kyS#ÉZݤž7YO¦uÍ+Ù”:©í’8hƒ5RѦb^I&€U’ÄX#‰À’Zæáf÷Â=óJì‡Pq˜û!@$Ú„Ê)JƒÀP#±F*»æÅyéžy%ŠC%sçÅ¡’¹s‰âPÉÜyÄcæ~?ü8ñh–6»Ü=f¢Öļ±` ˜"Õ0Æ}pòi x, s<–’#Í©iÖcÈcnû¬ÁÌØR3°ˆqS‡1n`\jŒ{¿2‡Û¾åXŒ‘…Y c8/ê:†‡cCG Üc/Å‚ôR J˰¡ÏjŒaèUbØ‚QöYÆ!¸†švÞpbl©É°… UbØBVþf¶jyvf£fã½ÚoŠ Ú†’ñaÁØP·d”BÀ¸%§Ç·–À¸%½½À¸e§öˆnÉÌŒ-5·œ•káæŒUjòI7êì8Ã\^sY JI<–CCÉô°`l(éhu7õÃØç1¯6×!Eµ•ŽpsS3ŒEsš/ñXÀºš¬ÁÌØR“q}œ9 µ¹žqs òŒ›ÓÑÑ3n.(%=á²i(™Œ %=ãæõ¡ðŒ›Gµ½žqóI«É¸¡UÇÇ3nè5%elÕd fƆšÒþ(¯DÆ-…2nA dÜ*Üq I)Ž D4@„ ¾–Ž [ÔǶ´æ [LÊ aK+ ¶äÔXi×:ÎJ6ce`Ô’Ö'0j)«íŒZÍǨe£–£rŸÀ8äÜÐ2ÌÙ14³c ;½­Rä1¯¢`H<¦³hÈ<¦£e”ò^žaCÉ9=ÆfzŒ–E  <ÕÞFÂ̓N{Ñó˜ÞÛˆ<”GGRÃ+ãœcsË#ãæ¬˸9§ðŒ› Ê}“”—j„qsÚyᡆâœS3=&ÆÍ£^œqóI)ž7Ôá;1n¨ÃwbÜP§ÑÄ@`n„¡4§ÇÔL‰q V#¸yhˆ¢aÜBTŠgÆ-d¥df ø¦®äœs3=fÆ-¢Šn™q‹Qù[fÜâjyÆ-é-ÏŒ[Ò{“ˆ”g<Ïé17ÓcfÜtˆ!ÛUÖáZ̪€ \\{„€Ë{Ÿ£QcŒcÎ’-O©‘ë whlTb=y­$ò˜ÚZàú­Ñ*EÓsyëGG4˜[jf¡\ëU«p;€6i.nÁÀè1ÞP¾ \íáðNRQrÆÒ¶Ê àÂAe\ऊNU‘À ×Ë3nNµÀ‘ ½*§OzW?ߢÁÌØP“ÛÕW» zÕ\Ëün¹ß5JI®ï‘_¾–c úzÞ™KtækéȰ¡j\»ĬWbØ‚Þ].¯1€Öœa *\°â¶©ãTf@s»¹À *oàf£Þnn0:¥×Ö5â\ÝcT(puÉ6´tæaÁØR“aKzùÀ¤n*€›ÌF«É°e}P¸ºWõpuSCÉ©Ì`Ɔ’Ü `Ö'—› [2àf XÕ™×ÖA_|W÷Á­8)|¬gÑ`fl©I¸Ìj˹Ñê1Â-$W÷¨Ðå:W«È%\ã6CÖžØúq)£ƒ$'i•@õgN?*î°[ÅØƒ‡G’­^S¶nö²ìì:*³«[uqÁŽn°ì7”¸–#Üú+eŸ^6ŠÍík³{e÷å`ìJK%ص§‹ö2Â×$ªÛ—¦Uu5Ò²b½ûŸÖf¿êKݼÈULZn’—`¨Tgß´ËÈS³ÙfrG¾£VeœtUÂ=¦ª7ç“Zì¥×q‡I=³Ò˜MO èæþ²Ù^rwG«™%?,Î4–fœ2¨!Æ)ã26s_i‡*b«Û”¨š]%·t +î)©EQ«ðMµQ;Í%å!5ÄÉÊ*€³d+¬«7·“Ín2KºRqíÌÈ-ÿ|æ[t5pækÀåÈo¾Ü(×Óñv~{ýKÞÒëE¦t‘K¾nןgúmØxÕRöîñtewjôpºî7&Œ[7žŸßŽû§Ãùyÿôù*ë±8ÍôÎca5¶?|Þ~ž^oçãáöv!Žímñ¨dsRì ãþøëúùòx¸x×ÕdæÝ_O7Îzñ ü—Ãv‹_`¿ýy?ïxów—w wd.‡u »°tevp~|{eK\^kvz=Þ/§÷÷Ã…•òÐc4÷ûN©)Ь(ûÛ¯ÛÛ;»Ýµ˜‘ÇÄ23þ:ýá'HӥذšÒ±ùõíúù]Ħ¼±»¨×ÛåüúƒÞ8>ÙÌ¥Nm|¸¾òƒiÊ5â÷Ïóó#Q·ÌÔÇÓ…i¡mç¬wejÇÞ¥lUdUåâˆ5ñ÷ér~ú#ôÔ¦Ö[¶Ã$vR[ž!Ä6Ê’ÕÔ.“nã¦[c§wFM~<ßOBuºØ„Ø Žè†êâï—·ãézì?ZјOÇç•ÒŒ¬—k Ú¦Í6aqd…û<¬ð´Z6}æ!ÄÜg£`-?‡¾ƒÕÖÞ®Äz%@a–_8oN0É’–"V#žÛ`£°œ.kô%ŽÖw íp%QGgeO[N“Ívĵé'©‚í8¨ËŸw,c…NÉe/‰åðø(?F„ÓËá×I¸R«ìôÜfeTGPf}º¼½ìŸÎÏ¢•³­~ÿM‡,I¬ ™å*T_á¶RìB_¡^NÁo]÷ ñzø-r··_-c*óû@ÜÞ&BM…)±@Ú÷!ã[H>Ø+Öõ§…Mt"÷àhk’–;ålˆÉ˜–ˆ²åº6÷ÝAMuæ'Î_â¶B…ååóöyxæh÷y¾œ÷|à\Åß>ös˜q>¶éÃysžËéåM<ÇaìÖ±¸+·âÈ\Nóô¦xÆã"֨Éq©6w81.Õ¦'ÆU]íº¶V®S|!eÍ=q}`®Kwñ¶¶óiô¶æŸWîT®WR‰³¦¸“_j—ãÓÛ§ØæV.ÉÞå×ÞEçÏÓñ×þøJJËÕtYšÑÒÄab£M|~‘Å6ÚP5vþMfž§é&¬O›©¿.ßO—KÙ×µÌÔ¡ôë*ÁQ|×oÉÒ2¤%¤ƒÄ\T¢ÙØXR3ZW!Lµ0ÚP#óLƒ8X‡®Ê°P«Ýç.´oLï>73è+*|ÁW³á5ò`øºÈ¿®Š| µU'bÇèIóÊÔŽÁ×Óëãåtü-w¡åFêþg‰zÓš¥Ô®˜ Bõ^‡C*G§×íîHü»XÛ¶xV½2·m2³\ËÚÁøÊÚ×qíX!®Bt°fË4°9!D;½¼ßJl ë¤,duqbƒkÛ?ÛÑ–ÐE9¯Ëµ|UŸ_Ç%S¬2QZü=²xSeáJêô8tÁ»*S Þ£$¬-&W?ç×§7榇¶°%¦ÒÄ'·ô¡¢ö"²‡ªôëáI<"T|ýåtûù6á²n›…ãúc¨õBªìQù›û·§ýéùôBÞyÎÔEfiÖ=i]€ÞÒŠÜ®üòš]Qñý0Ú—+[:ÖTÑ„*‘ƒS´`†r+Z_§í¿“åÃ]œÐ=K+;z²ºxïùõù,1 º–jd²¼ÒGoÛ§’6¢ žRž™ ]ƒésZ«æ·C4Œ{)Ãjº°χ¬’*:Œ¥g¬ù?Už%}Æšû*Õ¦'É¿1W’Í.çoGÚT3#Q¹J2¹‡ÄhKWJœi1Mû›6EuÙÙ´nþ‡½Hë;wߟÏtìÇ*8ùn Q–´å´Ñ¶éz”7Æ•6«\ëÖÙZ5‡cWÿv9ÿ÷À‡bˆ8)º;³ä!„9×¾Wçܱxsý¿a¿^©»ïÝm6m('¾*®‰hÞtmí=\f½¡kiôìz[5ž}O…ãóéо.’WóØí„­Ͼ†QWþ×ð/ÌCœ£½«÷xìrîÚx;K?œs¸ÇUÖcºkSó~äyNÇ»œƒL0_x Â=©_ƒuqñzúò-ÒèȰy¿Q¬ÃÅß8+`°'«T&°yÔY1ñ•ÕxÀįùkíJµ-÷k€Sf¤bïÈ—›,0©w~¯§¡–ü*¥/q„0ýU¾;Š3ZkºÜ· çÎÛO“{‚¿´ð—Û,°Ý()œC8ëïY7míºïÌÖ ¢Óeñm7y Èә鼵Ìï ìaɼ§ý/|~ûq~å¥×·pUbÇ—wù N¨³È¥7L¿ÒÈǧ2Ö£Z×ù·«›dæ-Qºç!›´_¶fu$µÀÙ²îŸWQoõð^áì€ T\?>ŸÉÁþ\o§—Á+`t—ŒË/çËéHþGxS—w¹*R™m燛¡_Óðº¨~ct‡Õ+)Ó”]“V«®«\½þ>]®ò: °ºÃú‡V¿I%ž<ŸdúêNnâBÄÔe°¦>¹ ÃÈ5žmXÕÅÃõóýýírN¬.òŽç÷Ÿ¿?¿7ù6³¬žs–ãÛëÓÛçë#ƒ6ðaopšÅ¨ˆ3Õ8)Äü\óqmf]B¤Â5ì‚3UÓG­š]jÎAO[µX#ìÖÇøräÑõ™å‹¶7ù§ Z1Yi¿š×´XÈtÎÞŠM«+‰<½˜‚[ÕGÃp( +kJM .ꬸ¹zs(c¹.·^µòõù-ÃG.¾†o«ÊqÒ¯BãÌòùN Œ°xße™e…µ¬Ë|×x\ üÆ*k¦bÎfbƒÂ0ÞÚÃúJ1|Cj0”; @ãÚ ÂÐ’ ïWqtbԗ逛˜hóú’¯][¿åå:àêr}É8_°6¶]îÏ,Fl3..Úaýê43..Û¡ýüÔ°¼'î>ˆËjX?> stream xÚ\ÉŽ+»‘Ý¿¯ÐÒ½Ð3ç0¼ê^´— /t%U•P*IW™u}GŒ8eÆ5_Åa ‡Á™)«¥Û±ÕŠí¤äXà;cBAì¼7X;.µÃ’Úq˃Pï¸wKf'$óX²;aTÀ¹ðJþ%¿“‚£TƒåPªùN:†uµØ)fм–;%EÀ©2 mh½S^,™æ}Ñv§“·ÓÖ[°¡ýÎ0‡8Pe¤EÍ£P;ãƒ>!ÂßÔÎ*ƒú ü§•¡.ü§·AjwN»Æíœ2l¿s«iËvž”Z¾ó’[,U&Dƽó蟮˜ˆb ‹iþj èdø«ÝqÎCÌÖAQ †¬‡¢A·´cPô]w|Ç…àhåBÂ.€c,‚5É‚ Ö¤á¯[Î,X“.p ôq¾5Ö” ÀÅ1² ™uEÊëôÄx6ttøX&.¬Þ‹ w–‡Á÷ˆ©HÎØrª/c£J.x|¼^η3›°çˆ•Ù§ÑkʾÄâþ8'©äªÇçqòQËMiÔ¾]õ°BìQ¿˜ë`ïÒÓ:Íu’;õ2—ôU~ÒizަIFrß ||nÃe<Ÿ’NÜM­ÐÏçý‰Ï×\øwHˆó!J+µö÷Ïññ9¦~+„ù[SxM]Mš0„ý‚eÍã¥ðuÙÊg'3þy¹½Ü'rE>¿L1c²õá+LÙÏÃõòX§¦qA˜&9« š*Zœ,€·ûO´”-ùòÅÊ 1îÓ -²½ÌÛÇá¸ÿ8ie³[ o޲l }»#4ó°?_Ÿ×1­Ã¥d­ FF_S‹Œ*:e„Ìlöè¿Þ‡+..Çàg–íM, i@\»B\~ JÊ-Ô¤P®bÂáŸ5oØ }¥£EÝåv¨³<3{þk×’î^Æ7XYo³5V®Y²g|;ßãÖ |‰€]_mà[\ÄX[̰© ¼©{@.*Æ Š™Šì~<®Ç*Á 0=ÏG\q)©šâý[2 [#JI[M‡ X…î§Þû´^RFçn!*Ì€‰Ë[©¬¨£pi‘:£r²ŠY,&ð´³Y.”WmÌrÕHßf« uKáo§sZ¨B­’ñò¼Р¨¹¯ApT&‡¦µ±º…3,†ªª&ÓFZjU¥žòVÇ­W›¨)¶ª‚ bâŽWj]õ!î]¥ÖÕ–„ ÊÊj¢B;^ÃLCOŠ ÀwÆû4ÄH²zÝ过›º žÞ–¦`ôŒÄrµ_‡€óUÜõzÿ û÷a ›¤"¥¬!¿}^®§ ®:—õt¼®è´¸§jƒ·i'd”®¹uº ‡o0ÛÍKÝ8•„@u•L¤ñvŽ·ý€ Ò5U–©ïãjb˜»ž§à@ÐâD¾Eé3G!w´l¶bŒg5ŸpؘÓ2ÝǤ³¼͉–Û¦8ÅVT5Üãå~ &¤î³³ˆ­¡dƒœÃE{Šu"¯ë¹GêÕUÔéb³Ûz†ÑØkëˆ_—)¿¬•}rV±uTmP„ÐßÉbµIÓXnë¹E‹(ëuS¯)¤c¼ÁƒOtÀÕ‡¿ÁÜßÎõ©™bêkÚ`fF£õlNs™“U×k½|š!h¹çTCQZ›»zþátH fgTŸžU`MEì„i: ™ùõÃBùá¬éBæogŒo* ¾žlx¾¤¶OÑ"ºš† nsD3¼:ûÎë/ª­ývÈÓî³ãxfåó„ƒÉ-^–ÉüNE§û-ØS¾wò¼¨Ú a”þvÎF¡ - ëA £]]“ú鎩âóqˆÃè+"œª#€¸Ï`Äûp=ß^q•¥Xót¢ˆ¦R¿ÇD Q1V†˜æØJòRa/Ã5ÈM[§(ÅDde¶LÌ Þ¼³œ½¯Tì…œú7Ø-_láS%'xN5Œ‡Ê+i3ÉI‡Ö%†úHKb†=ºëÄïž©^/ìp:˜¼²e‹¦<™®Ë¦º%+0Ä 0±£Ô‰–”êû¢>,¬ðñK'ÞÙ÷UµN¸i‘z‹Ä ",Œ‡oÔœ³.ìãŒÃEé{§/G·Æ¡®ìɬ´õJiC¿@jÙæ'_Q5´téÊúV¦+Q/Ö¹*¿Þ˜ÉŽõq‰e§KØ-ŒƒÜóRDãˆhÏÝ+ʺLÑ£%xÅ›áòŸ(«1÷|Á]U¼&LÔrjFEºD>Œ=¿¥‹%”î1B5›á'mÆ•0¼j{Ú$B÷iP¶¥‡káZzâÕžwdÇ77·Yh5›ì?‡3¬H”ä-—\’ùìI ®• ç¸9VR6ê‡÷’#óƒ·´9 Áe·JáméÚ¤iƃ|8¼G5ßr4ÑÖÊ«óxþùŸË‘KÚy èôYè}›DÆ#°Ûà…¶¹ª¸öX#RçÕ\¶PÓ™€\DMª…j£ˆ-ý_1ÂŽ–mŽÂþ;6¤V¯&וoƒ¨©µniJ¹ª[ãܰ˜÷´m$þ2YÇ¥Y—¡9¾†šmŠó>^¯º4/’t¶Uø8ÁþV™l o”Éwç‘tßLvuë¿{XÅá6ƒŸ=Ϫ·‚žnJ’ñì9pàh÷m²×Ioï§‘ž0(“]IÍ{ët¡Ž»Ù¿~†û]@š dlc[}fY_O“ M¸Váâ•úŒÍ^»e°èºe¾Jr^Pð#<’´ÅŸ§•®•­ýWJ¥z‡…´´²b=¿eUù}¡èé%B²c‰’–6› k0âËôN0ݦˆâìêèò´\·Y«JÂ)£²ŽUEäd™g?¦¥”­eõ`ÇXUø#Ⱥ¡W.…æÚÝ #s¡Á\vD·’§è— L’‹j€éí‡rÙ.ˆÓê/ÿž!jë‚ôC+ü9ˆ²r7úõ½:¬z*.ÌÓ…3yâß?xE8 ?ïσq=Äþx¸^¿ŽïñöG9ç¿OäzÙ…¿|ÞŽf{d­cîêjqÏ@ÓAA8Z^÷–(çùq~<™'–ü(%Ÿ&•üáÿéñÙF5b–¯ÐTû¬? ©©£IIÜŸnÁo-»>Qjym3Üp¿bÇ÷ÙÁE@‡?‡jÙ²k8¼Ä?»âÏÓDã]ë ´CEI‹„9¾Ÿ8“z/J'Ò\”ßEÙbÓŒU*‡–ÑùM‰bhÆ+â4þj&Z±/]¯TíFœpÐnKÓqtÓLVŠÍ¥Yö Ö$‹cÈ}[NagËøCrß‹<[k­kwƒ#´fÙú*§šÕr2ûŒD3Wæó<kž]`ñ²>g•€L¾¼`æp.{¬wh˪M¦×¡ÙÌ@›Nç÷ÓûZÑÿ¶òç?Oçáø¼„W °€Ìž©O˜ñp¹(ç5ùðûv èÖ6„iÕl0>ÓQ0ì¸3çÂÅä4 r•-›Â‹ͳã8øëþð]âà¡óëÍgÒš›ÖˬÙÛjÕVKPê‘ܲ¦ ©Ãq[0-„¤Ê^"¢ôy{V“Ðð òjMrÌ·š¸Œ¢¦¡ÇA|é˜"ЂÕüøŽ^‹`z`§ó¯0H#ÙÞi!MÌæiNˆ…o’wXXÅÑRÒ'â;¹’ÝŸŒá;zßb×§Ç-Z(^ÁL‡8Z(Ý–S¿Õù§„Z|—’ï볇¬~ñu|˜²YƒŒ¸2e暕޴¨—Ýø‚4öáL) èz±&³ZÃó !¸’-iè±-\E=¬Ö2»*N¨éU±–¼¦¿ú°U“´ÒIŸqÔ9˜"ªVnR‘@iµ#EÕ´Þ‘yZORzûӆĶ—ºJHZsÈlÎ$)å|š•k¬B©×ß a½ÒÒºº/K\5àÅ·®Zú*må·¼ZeoVãi­VÙ•`ìaŠÛ>õM!VnÒð¾úLT«l‡FòIl 1MJ>O÷» Ô !¾Ó*{û7‹iUí,X‡ÐRÑc`‹îd19&µ-žGeKªÒÒ§XD½ù/6Æö1ä„g^²ÀúÊz eßÞêü§ÀLîÕÂ8QºiÆkâIêJé¯Çå#ëü~åá+Ù 3^ŸÏ z\ÄqÃS­«»âÏï‚|ýÞ^ëlS¹ÀP ²ì=o?CÖSÒ²ä ¿"»À¶%È›_:d!Õôø¸Ü«Îd¦t#¦ uÙÚñ4 ¿¾J"QÛš4M¡Ú˜–4½VÐéò«üÂÿ¦Ž^ü !Ú2%¯ܲ|RÛ’f×ðZ»¦¢#Š}™3‡ñø½ð¦"ý½ú€FÖ#eTGK–ûûþ€s^ϯ³É2¨Õ÷Úð²?3«T7•nŸ±g¸©@!h#Xñ;Im‡›2²š–74«Yz1ÿ\Jè3Á¨†Š9TUò5­fŒ a¬«{Dd¯Vu{á/ß×Å.nL94„_2¡™ÂTzùôS'Aî ù´°7¶%$ó®daþëq¿^Ž¿ã'Y”§®7½ñ}Qo³8FÒ¯G|Ùòu»‡ÏN`Ø+H8)‹‚ì!  –hš³e—‹ï^ǸO'{–÷²¥ˆ «­ÃÅ ^7êüZ4 ¦ë m•lŠ“¢€2[(ºÊ¬ßįܲF´‘Dœé¤Sn[U—µÕ‡õS Æ÷ÝK¿#TMÂ͇»Öê ,®{­u¥,.èPê+^.·¾ËO-°RM—D„“Þ¸džÆÇü:w ža¼Z¸ Y÷ü[«Ó9¿€a¤G©7ä®ùýs/ÐBQ—-<˨‘¥EÕ«â{¸ <…¶]cÖ[KªðÉxXë;ë[â@ˆ©$L(r¶ÇU=ÌBO—ªð"]{V‰“V+¾Üí'áDC¼uð¼ÂC:ªñ’×dñé6H+5ãtù !€²^7èy<ðª’?Ÿ—1 ×.Ðûí¾|ö´rºýñÙG°KºáŸ³—¿4óÇC>ÌúÞfyáuOK+î vc}6´Õ°q²ðÙÊ= Ïá™Í2òa©Š#û€–_@LþCjˆ ËeðVÒtˆèê웃çȲñ´ Ne¿<ñ Tà¸?]B8¢NË|EÕÅ?.'Ðbè×& }ý AIE…â}ЃÞñ”â_éE!4®¿ãšŒRd©à¨àSÁ“Cå¯Ï$˘úËu¯—a¼Ü^ÿäî9s¥UOy ÈS@éÛiCßµšÊ³–Ü‚/­*V±J‘¥W°fTàTTV/­ZYXõéU)4 ,ü†U« «‚éÒ*§È8EÆ)²´,3ôCÆ—¿›[0¥Ué*V)2N‘qŠŒç‚<|ê,ÛUز]½ ÈE&(2Aœ òLld,[ «’‰ŠUŠLPd’"“Ĺ$Ϥê[•L–Ve¥]%$) ITKrH’Cåë¹ÜBÙ®ÒTÚUQ@ŠRDµ"ªy¦Ì†US¶k¥»zE) LQ`š˜ÖäXù5on€•Fe¥Y5¦)0Mi¢\“gåÊÜBÙ¬ÊTšUSd†"3™!Ê yf6’I™²Y•¯4«¡È Ef(2CœòÌn$“òe³êÊxh)0KY Ìå–³¹¤eÙ¬ÚTšÕR`–³Í·ô[¶¦òR.·P6+,@K«4_ÓGúP Èhâ¥ÇáPØH&XÉV°«MÜÞSd4ñÒúÒT~˜7·àJ«¦4Jó6­G¡@ѼK¯ÿ,c¹dLÙ¬0ÐæVA'‚ ’ Š š É#gaÕ U±jI££E–æ]K¿m…d²B—VujÖÿzSöÈ endstream endobj 7640 0 obj << /Type /ObjStm /N 100 /First 1002 /Length 3041 /Filter /FlateDecode >> stream xÚ…™ÍnäÈ•…÷ý\Ž)óþÅ`øfV³x¡–²«„RI)«Æ~û‰ ô©Ud( …p*ÉsÏK~q²s²º¬KN.‹Hê ]Ô¶Ol1ß>ñÅ“ôE,‘·OÒ’êöI^Êšû¢,U­/ê"«ÕßrеÝ1¢}íÞšû÷C±Ò/[$Ö~Eø"Ij_Å"Ùº@¤EJûC[åEêëµeÑõõÚº¨®Ö4ÒÚŠÝ®mª[WKÍ@D¿"Ù¢)õ+’/šKWK±h©Ûi±U¶+òbbÛe1õ튺˜¥®‘×ևܯheXÔ~EÖŲô+rëRÑ~EöŪw‹¯±]‘—¼]‘×­g¹,î[ÓÚM=´k”µµØúEÏ[׊.^6ç­p¯›óâKÈÖµÒöB7ç%-a›óö•ðÍy)KÄæ¼Ô%Ú šF]ÛîmÎ[Q7çU—´n»]mIâ½ãÕ—¤[õÍj²­úÚ6Ü·êk^Z×ûkYZz-í¦M¢íy^×6}ßòÚ¾¼¶&¶•.¹mf_µ/[ÿC^ÛWZcúªý¡•ßWéu|Úªÿ!mW”%—²]ÑþPkj².EÚ?¹o@Ñ^A]ŠY¿Ll)Þ}dñ¥Ð¶Š¥¤×UZJ~]µÉ-mÖÛª,¥öÞçÖκZnº.U¼W Ò»w2«.íkýŠ&Y£÷>«/µk[ÅRsíUiZjÕ^s Y×͈–¶Ôu»f{B<šL뼬Þ©ÜÆOÖÔ{•­=$k/µ-ÛS²ß–í1Y·'!·Ín èƒØŸ}ýnSÛÌYSýníOakÜßþöÛ_ÿóîöeùŸ¶7ÖžùÿnÔzô¶‰EfQúâ¿ýõ¿î¾ß]Úõÿqÿr¹¿{¹Ü=|¹’«SŽò—¥öðãûïçç«“¬Wö—üö÷¿ÿªYßî×zû¶Ê‚ºÔšîï;E¹’£¢âIñ¤xÒ‚ªl)6IÙIêz¥GMÓáÉðd”c”cy¦©½¿jZ3~”Ä‹áÅé°SSÛLÒŽ6ý*%±q<9žœ;eyIúUÞ)&56ðx <ÊŠ˜I&?¸Ì>ÙÀT`*0ô:QW’™fØÏl‘«8j&\%\%\%š¨+M¨èÁg•Qo®®2®2ÝÎÔ•§ÔöC[ËH3ã*ã*ã*ÓíL]y:BM`§ÙÎ £BÁUÁUÁU¡Û…ºÊl†º€î4¥Žf¨àªàªàªÐíJ]u6C]`7CªW¾5+®*®*®*Ý®ÔUg3Ôä ™>+®ê›«F>ÂBYØ\3ï}ÚU»ÝA´±“‹Ä"³(,fC´)ÈQÕŽVûÙãõŽ‚1Á`À*ÿFÕŽ^{*pYà²Æ «@VQ™‹úÑé`O. \ÅlØ*šçšÇ=Á3*Y ³®`«ÀV±éYÚ¿ÿ´I|® ³M®\Åg….°÷:ò š4‹Ódè*ÐU^éú©¦|6ç:ÐÄlÇxð*¯xýL3õFî4uðžà,ÀYWàUÀ«D™jêá=ŸÒà+ÀY€³$\W¯’|ª™½Íy´ŸÀY€³$\W¯’§3Ôöli„;žü8 p–Œ+ð*àUòt†š@ì5ëÈ'pà,WàUÀ«”é 5½ÏšGû œ8KÁxð*e:Cµì÷³y-š¸ÎRq^¼JÍPH{Íá;8 p–Š+ð*àU×uª©ûÞšŒÎ¸ œ8ëj,œE°˜ÍIzÛßÍÌý \ÁV…­*³ê{Ÿ&#ŸY!³y´*hU™ÍPð½fÄ$Ì ˜•È« UA«N#oØå$óÑûV³f%ô*hUЪÓÐÛvï[ õ0+`VB¯‚V%ýê4ôÚ‘e–Fï[Ì ˜•Ô« UA«NSoØÏP®£ÞfÌJìUЪ U§±· ì{[†3˜0+¹WA«‚VæÞ.°Ÿ¡:|>³f%÷*hUЪÓÜÛv½õuô+†fÌJîUЪ U§¹××C¾w>+€Y³’{´*hÕiîí»ýôvæ<+€Y³’{´*hÕiîu=ú´4ò ˜0+¹WA«‚VæÞ.°÷éÃÌ ˜•Ü« UA«NsoØÏP 5³f%÷*hUЪÓÜÛöš©5q˜Ük Õ@«MsoØk–ÑÜ`6ÀlÄ^­Zm{»À~?ë(—`6Àl„^­Zmz»ÀÎg¬cM\f#óh5ÐjÓÌÛöš2âŠfÌFæ5Ðj Õ¦™· ì5m(‰)¸lD^ƒ¬YmyÊ> ¨lPÙH¾W ®Ú4ð†ïç'¼Þï” (y×ÀªU›æÝ.°Ë*eð®5 l@ÙÈ»V ¬Ú4ïFÔý»6òè o@Ù€²‘w ¬XµiÞíûÝ,ÃÊ”¼k`ÕÀªMónØk¿5 l@ÙÈ»V ¬Ú4ïÆñ÷Û´ŽÞµ” (y×ÀªU›æÝ$ûíL:ÜN˜l0Ùˆ»U ªÚ4îv]kÓðáÉ’´k@Õ€ªMÓnòÃÏI!CMLd#íP5 jÓ´Ûö»™FÿyÎ@²d#íP5 êÓ´Ûö­Ý~DÙk:Hvì¤]ªT}švS>ü’êhj$;HvÒ®Uª>M»]`ç3ËèÄç ÙA²“v¨:PõiÚÍrø¬±a¨‰+ì¤]ªT}šv»Àn†²Çà ï ÙA²“vª:TõiÚÍ~øµ8[ ’$;a×ÁªƒU·Ùåtx<Ë :?F;Hv¢®CU‡ª>ºeKü7HÈœë ÕAªOsn»ÿ:úÅÖÁ±ƒc'å:@u€êÓ”[_ÇõéúËùJtð8Ba‡ÂN¸u8êpÔáöíÆú®ÇÃŽC]‡ºN˜u¸épÓaöíÆñ®Qò@ƒª¡¬^N:œôcx}»qAC¥5 ªCU'¬:`tÀèǰúzã÷VéÀu êDS‡ƒýM_ïûnbðð€L™Nu ç@Ïëx»ÓŠ@¼¤H'u:ˆsçu¼Ùµ¿î^¾Þµÿ®ŸNÏç§Óíùy Eí€1H›Ú´Å1mN/çËGåþñËõÏóA9Àc€Ç s€ ÇÌù‹ÂåñôÇÝýùƒðËVÐÓóãÍùåå('Ná3 ]@º8†Ï_U~µüò íÓëÛÓïí»—ç»‡/yœ‚Ì ‡Ð  Çzº{¸¿{øhÿÇåëùárws}y|>Ýüx9ßlU £Gƒp0 aÃéPîçÇï»í¸ùz¾ùöòãûéáúû` k@Ö ¯p àöÙ¾‹<]?¿|oS©[«Î—=[¯þx<–iÒ6 edã`?—Ò? 9?Ü|»½iÓ ¼lM»Ü}?7ÒmÓ¦qL·CÅóÃí»àÇ¢ÚÆ};_¶¯|9_NßÎÿÔCü½ ì¨ PÇä;kB¿ÖÒjm<Ü>Ÿo~ž¾Þ= ú¼xi8àpÀá8¦á?…úƒ{}{ÛKêókÏçÿ==>]îï @=ǦLÇ1Uz)*h¹??|¹|=ªƒû÷AL<ògƒÚ¶gñOÍçvÚy~<""€ÿ $8pù³Qäþ§ßÜÝßuû$œÎ·×—ëA8ähdæ÷î£è¿«`SºœÿùaÏŸžï~nÿÅ95§† =Gà(峉{Ø0ü®ûrýÇùíŸÑ[€Ep RtpH Q?µ7‘ŸvûòåekÃËùùçàXœ3‚sF¥ƒCpbHëgSÖU._.ß>4ºýŸÝ[id> endobj 7741 0 obj << /Type /ObjStm /N 28 /First 269 /Length 952 /Filter /FlateDecode >> stream xÚ—ÍoÜ6ÅïûWð˜ôÁ!‡CÆE}kšM{ |³Š+d¿ ÉEûß—Ôúa³’L4|x¦¥ùÍQz´ˆ­U­D,)­'a‘OÂ*c]¬¬£$œb™þ$Ê›„WþrWPÒÅ\+][ÚD¥cEN—s¬M’®g£´ é¶Js=ÝÁJ;JõÙ)-fºC”ö<Ð!^UPTû´æêØ¢N §3­‘"K’T4À—5«ÈqªìX‘L­;§ÈKHJÑIù¨‚ÙÜÝmª_ºÝ >ÅÂÇò»ŠÂC„A5„† $6Õ»îÐñþ7÷§ÏÅDZéÇ·êÍ~÷Ý0vǧR—ÿöa³ÝÞÐÈ ’…`ŽÈÏisBXP­¡*82pd›§ZcÔØó’jàÌÀ™3ƒYtfuž‡q¡Ÿm_Z—zÉ´°caÇbÐíX´ce…y­_GÀ-Òë’W˜0ca†1fƘ}±É1=Í™D¥˜%“áŠáŠáŠ1dF_2̰3&—z…éàÊÁ•ƒ+‡i;ôå8ÇŒ€9Ó—Æ®0áÊÁ•ƒ+‡i úcFß2 ¹µ=$p%p%p%˜¶ /Éí¡ SB¹ò† \ \y¸ò˜¶G_>·‡ÀÜ2­qkLW®<\yLÛ£/ŸÛC 0crÍk³ pà*ÀUÀ´ú ¹=”³Ù²Ð*®\¸ /Ó–º†Èí¡˜1ã+¾2[© õ „…`‘ÛC 0›m êÒ¬0=êÁ•†+­!ЗÎí¡x˜¾Cçæ©-5/ßKÑp£áFà U¨¢{ç¥pz‡¿ºøS4ç¢oÏÅ®í—0ä° ‡…`y*ÈS¡Å¦YŠ¡¯ä¸@ÍpÔE;þ{n‹îøå´ÒÜ!œ…àá*W1ú•VPtmäk‡ßŸV€„´ØEÈ BVŒ¼BGýâñ¹Ûï®Üñë'Òÿs^aç ¯Ô½Þß·Íþp;Ýšý>‘v]»,m10¤¶ µ©-Hm¹¤væè•OL±xpˆkA\ âZ×Âô}‰¹þµ†ĵ ®q-ˆkaÿ?¾vß³gþÜâ~lcæž!Ž‚#€à Ë#À·O,Sû¾âåÓ>Àê±3UýÜŒÍþô´©~‹ŸAŤ𯶩><Çãâñ².Kï›C;\þ˜~O·üzÚµÕŸC‹Ë§ÅwÍc»îîª÷χáSÅǪßní$î·Û‡ØBõáÜú <4E92984447C8287DA998729ECECFA052>] /Length 17680 /Filter /FlateDecode >> stream xÚ%Ýypãÿc×÷ýøöÚ]¯VÒj×{ß÷}ß÷}ßÚûàgL±0¡¢à˜‡Âdˆ7ÄaZ„ëÆ€‡Ø˜[Ɖ1‘¹udÊU™†êñÎ?ñú’¬×Óúî~¥ÏGË–-[öߪ–-«ZE?ùi™·š«–¥§x+BvzßaoU£¦jY²|Ðûùc-êPѲe«Ã·j¨|Êð;¼òÇF,÷Ç—xï1¬Œ–EWÂW¬ò×ÞZƒµhÂz¬Ž–Õ> Ÿ·qŸüÆ[I¤‘ˆ–Õý»ð))lÀöhÙšÿ+¼o 6FËþ@øã&lÆl–Å~ÿÛ°»°Û=÷Ö~ì¢çÿSø¼}>ñV¸!DÑë÷áq‡£èýÓð¾p›žÀ±(úøÓá}Çq'£èËo‡÷Â9œ‰¢ïûÞwq>Šþàéð¾ .üƒ·®àR}ï·Â.ã:®FÑýÞw ·p#ŠÚÿzxßMÜÅí(ú»ÂûîàîEQ.Þwñ0ŠþôO„÷=rá½õ O¢èÿ\øÀS¼Äó(úÿfxß „¡^EÑŸ ï #‡ÞFÑ_øáð¾wß4E?ú"¼/ü€_ð)Š~l)¼ï³ ÿä­ïð5Šz¾UèQlO¥ç¿úx_OE '¼¥Óžê(úk'ÂkЀº(ú¹_ïpÏ 4FÑßh ï[ö¬Œ¢Á_ ï ~ö–D{VGÑÏÿÛðÙöÄÑEçkxŸX{$Ú³>Šþî? ïK@±=©(ú{±ð>±ö4ccýÃá}íÙŠÍQôKßÞ·Å…»Iz$Ú³-ŠÆ[öc7vFÑ/‡_ƒ÷ìÞ(úgCá}{!ÑžýQô«>¼ï$Ús(Šþåïß~ã{$Ús4ŠþÕ ï;æÂ¿zË2='¢è×7|à$´Û£çž3m”{ÎãTÜs :íÑnÏUH´G¶=7 ÎÅö܆0{ÄÚsšìÑiÏC<‚D{ž@„=Âìñ[Û£¿Mö¸ê‘^{ÞBu=Jì©ü&G§Âmõ1Š~cgø±dÖ–·xøÉCfßùdwœ§"T¡5¨EêÑ€F,Ç ¬Ä*İk°MX‡8Ö#$RØ€46bš±[°Û°;°»°{°7ªªÊ‡æ*YüÇ?þxq‡qGq Çq'q §qgqçqq —qWq ×q7q ·qwq÷ñññOñ •¢pu_FÑï4…ë^ã ÞâÞ#tðñ Ÿñ_ñ ðý$0  H`@À€$0  H`@À€$0  H`@À€$0  H`@À€$0  H`@ÀÀ^ìÃ~~Àð†0üÀ‘¨jÝe?ï|øŽEUõ¿~| H`@À€$0  H`@À€$0  H`@À€$0  H`@À€$0 €²^ÂúÖ°þ€õ¬?`ýëXÀúÖ°þ€õ¬?`ýëχ[ÃúóÖŸ·þ¼õç­?oýyëÏ[¾1ª:¼-|…ë<¿"ªJ}ø£æu0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒywó~£æÝÌ[ÞúóÖŸ·þ¼õç­?oýyëÏ[ÞúóÖŸ·þ¼õç­?oýyëÏ[ÞúóÖŸ·þ¼õç­?oýyëÏß÷Ÿ¢ÊUß…ŸèaTµó]¸9u0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒyÌë`^ó:˜×Á¼æu0¯ƒyÌë`^ó:˜ÿÎ5X†U¨F jQ‡z4 ˱+± 1¬Æ¬EÖ!ŽõH ‰6 Ø„flÆlŶ¨êî±pM?bGTuâjøãNìÂnìÁ^ìÃ~ÀAÂaÁQÃqœÀIœÂiœÁYœÃy\ÀE\Âe\ÁU\ÃuÜÀMÜÂmÜÁ]ÜÃ}<ÀC<Âc<ÁS<Ãs¼ÀK¼Âk¼Á[¼Ã{dPY¿j&ülŸ¢ªKÿO¸­>ã ¾"ô'‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜Ù†íØÃÏ~Æð3†Ÿ1üŒág ?cøÃÏ~Æð3†Ÿ9U½ò‰êDø‰ŽGU®„Û@3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3˜‘ÀŒf$0# ÌH`F3!¿.3Ÿ`ýëÏXÆú3ß¹  ¡ Õ¨A-êPUý±ƒáó–cN£òß…÷¿>°«Ãj¬ÁZ4aâX’HaÒØˆMhÆflÁVlÃvìÀNìÂnìÁ^ìÃ~ÀAÂaÁQÃqœÀIœrÿ\¹MWö¯÷Öï;‹sxŠ3QÕ·ß?ùy\ÀE\Âe\ÁU\ÃuÜÀMßôžùã-ÜÆÜÅ=ÜÇ<Ä#<Æ_[oU,ÜVÏñ/ñ ¯ñ•Ÿ£º;lù,ªúÃ{Ãu~‡÷Èà>â>ã ¾â¤Òík»¥Ò-•n©tK¥ÛÍÙ}ǵ:Ê?,þJ)|²»ë¢ª˜ ¬G¡¦n5u¯ôeOñÄ…Ô-¤n!u ©[HÝBêR·º…Ô-¤n!u ©[HÝBêvãt ©[>ݦíÞUý™_×EMÝjêVS·šºÕÔ­¦n5u«©[MÝjêVS·šºÕÔ­¦n5u ©[HÝBêR·ßnåt+§[9ÝÆë®Ü8?´#\åt+§[9ÝÊéVN·rº•Ó­œnåt+§û&ôÒ­—n©tK¥[*ÝRé–Jw%•š*ãu‹µ[fÝfì~Uýèºpá¢éM·hºEÓ-šnÑt‡hTÒ­’n•t«¤[%Ý*éVI·Jº¿º´eˆ° „¡*¹øË5|´ Õ¨A-êP4b9V`%V!†ÕXƒµhò?ò–EU£·Â·OââQÕÏ\ ïKaÒØˆMhÆflÁVlÃvìÀNìÂnìÁ^ìÃ~ÂuŒª~..ò0Žà(Žá8Nà$Ná4Îà,Îá<.à".á2®à*®á&ná6ÞãFTõ7.\ƒ;¸‹{¸xˆÐÆc<ÁS<Ãs¼ÀK¼Âk¼Á[TЍi©Üˆµg­ññ Ÿ}4l”‰ªþÖ? ×å ¾á;õ¾•´ˆ¡E -bhC‹ZÄÐ"†1´ˆ¡E -bhCK,ªšúíð­tÐÒ„uˆC-úk±BËš¨êþÇðÉiQD‹"ZÑ"†1´ˆ¡E -bhC‹ZÄÐ"†1´ˆ¡Åß"†1´ˆ¡Ez-!‹´X¿Åú-Öo±~‹õ[¬ßbž–ÊßFÆÏ‡ë'†1´ˆ¡E -bhC‹ZÄÐ"†1´ˆ¡E-7 ‹Y´È¢E-wý’„[\ãáÖ½UM~ ©ˆE´(¢E-ŠhQD‹"ZÑ¢ˆE´(¢E-Šh Eè¯%E´(¢E-¡ ´¸hÑA‹Æ]ø¸k5®ƒqŒë`\ã•ÿ`ü§ï Ÿ"q ŒK`Ü<ãÖoˆªþÕ„O‘Ÿ,ÆÝGŒëoÜ}ĸ6Ƶ1®qmŒkc\ãbøÆÅ0îîa\ã—À¸Æí1^ùOÇܶp‘ŠWĸ"Æ1®ˆqEŒ+b\ãŠWĸ"Æ1®Éq÷ ãÚׯ¸6Ƶ1®qmŒ‹a\ ã—À¸Æ­0~>ªú®‹"Æ1®ˆqEŒ+b\ãŠWĸ"Æ1îža\zãîÆC:×Á¸Æu0®ƒqŒë`\ã•ꯄÛTã—À¸Æ3î ¯£ª…Máú)b\ãŠWĸ"Æ1®ˆñï|Ù2D¨B5jP‹:Ô£XŽX‰UQuÓßße Ö¢ ëÇz$p«£ª¥RøŠ$RØ€4ÂÝÜ&4c3¶`+¶a;v`'va7öböã€ßÁðcÆÅ1ÜÁ¡¨ê÷~,\—ã8“8…Ó8ƒ³8‡ó¸€‹¸„˸‚«¸†ë¸›¸…Û¸‡ûx€‡x„o¸UWO‡+ôOðÏð/ð¯ðoðïð!‹øˆOøŒ/¨t°¢Õ'º´A º­%0Fù.ª^þ›á£ŠTÄ "1¨ˆAE *bPƒŠ\…VCƒ²”Å ,e1(‹AY &£ê?.Hƒ”À %0(A nˆª7$Ã'+bPƒŠTÄ "1¨ˆÁ=Å ,e1xJ<m jcPƒÇüý¾r3ÅSá§à) 5x"ªÞZ.\ ƒÈ @2(A dP ƒÈ @2(A dP ƒæà]HeP*ƒR´åࣨzÏ ×@ƒÚÔÆ 6µ1¨Am jcPƒÚ skc0ãW£²tÝŠ0ÙǨúÐ÷Â7UÉ JU2øÂüÎ'/C„*„oPƒZÔ¡ hÄr¬ˆªÿÅðµ[Q¹Ë8¿1ü1†ÕXƒµhÂ:ı $‘¤±›ÐŒÍØ‚íØÓØU_ùá"wbvcöböãâãŽâŽãNâÎâÎã.â1ÎDÕ·~-\ƒK¸Œ+¸Šk¸Ž¸‰[¸;¸‹{¸xˆGxŠgxލtP×FyU߇ …×xƒ·x‡÷Èà>â>ã ¾âÄÐæûµ‰¡M mbhC[mTýG^†ê Mm:h[•°Q›ÉÚê£ê—ávi[E´)¢MmŠhSD›"ÚѦˆ6E´)¢MmŠhSD›"Ú6É;\Áµmƒ"ÚÌÓv›£ê·/\®JÚdÑ&‹6Y´É¢Mm²h“E›,ÚdÑ&‹6Y´É¢Mm²h“E›,ÚdÑ&‹6ýµ)¢Mmæi;U:.\ mŠhSD›"ÚѦˆ6E´)¢MmŠhSD›"ÚѦˆ6E´)¢MmŠhS]Ûh£Mm¡ ´I`.ÜØ/¢ê?ð5\E´)¢MmŠhSD›"ÚѦˆ6E´)¢MmŠhSÄœï2§ˆ9EÌ)bÎ sîæ”8çîaNs²˜“Åœ,æd1W¹gøábø.ÖŸ³þœõç¬?g…¹ÕQuöo‡OÜæÄ0'†91̉aN sb˜s÷0§µ9wsÒ›“Åœ,æd1'9 ÌI`Ns˜“Àœæ ?çŸ;Uÿ÷]áè`Ns:˜ÓÁœæt0§ƒ9Ìé`NsÒ›sG1§Ä9YÌÉbNs:˜ÓÁœæt0§ƒ9Ìé`Ns:˜ÓÁœæ¬?gý9ëÏY1†Ûþ^Týƒß WW sb˜ÜçÜQÌÉbNs! Ìé`Ns:˜ÓÁœæt0§ƒ9Ìé`Ns:˜ûÎå.C„*Tûm¬Ü)ü>P‡z4 ˱ •ÏûKÛÂç­ÀJ¬B «±k±q¬GI¤°ilÄ&4c3¶`+¶a;v`'ö`/öa?®ã®bwTÝS ×ôâãŽâŽãNâNã ÎâÎã.â.ã nânã¾à+>áZTÝ÷›áZÝÅ=ÜÇ<Ä#„@žà)žá9^ üƒã^ã ÞâÞ#ƒøˆo°þ¨ µþ¨õG«æùUÿµ ­A-Ä0*†Q1ŒŠaT £Öµþ¨õG­?jýQëZ´ GÕÿègÂw¶þ¨õG­?jýQëZÔú£öµÇ¨FQõÏÿPøZYŒÊbT£²•Ũ,Fe1*ÑÑÝȨ@F2*QŒê`T£:µù¨ÍGm>jQ{ŒoôhTýwÛÂ…‹aT £bèFÅ0*†Q1ŒŠaT £"½aŽ sT £½í—.ܺ†5ü¨áG+Ã7¬ Yù·ÆßŸ oé`T£:ÕÁ¨Fu0ªƒQŒê`T£:ÕÁ¨Fu0ªƒQŽ~†0G…9ªÑÊ¿&þOkXY…jÔ u¨G6c ¶b¢¨ºðÓá4b9V`%V!†ÕXƒµhÂ:ı $‘¤±Û°;°»°{pçÑUOþãp­öböãâãŽâŽãNâNã ΢ÒAC×Go]Âe\ÁU\ÃuÜÀ\ˆªÿEU¸B7q ·qwq÷ññ¡'xŠgxŽx‰W¨Ä°º3|çwxŒkFyUÿ«Ÿ×àµÿ„Ïø‚¯ø†ï|™O.mti£K]ÚèÒF—6º£šÚß _aø.Ãw¾Ëð]&ëªüƒã·“áStÐ¥ƒ.té K]:èÒA—ºtÐ¥ƒ.té Ku]Íc—»äØ%®í~ÁµÒF—6º´Ñ¥ƒ.t©¤kgTý¾®‹,ºdÑ%‹.YtÉ¢K]²è’E—,ºdÑ%‹.YtÉ¢K]²è Yè¯ëdÑ%‹.YtÉ¢K]²èÒA×[\Šªç÷olãuÉ¢K]²è’E—,ºdÑ%‹.YtÉ¢K]²è’E—,ºdÑ%‹.Yt½†»Ñ¥ˆ…°Ñ»¨ú÷ árÑ%†.1t‰¡K ]bèÂÏ[Âİ †1,ˆaÁ; †w ª[XÕˆ…¯µÖª¨fe¸Èm,hcA bXÂİ †1,ˆaA bXÂİ † ,XfaKT³ögÂe(bÁ]Æ‚þÜe,ÈbA ²XÅ‚,t° ƒ,è`A :XÐÁ‚t° ƒë/XÁú Ö_°þ‚õd¶àîaÁ2 §¢šÔÿ®•,d± ‹Y,ÈbA ²XÐÁ‚t° ƒ,è`A :XÐÁ‚t°à1Ãé0€®t° ƒ,T:h|µa™çQÍÖ_ WH î2²QÄ‚ûˆY,ÈbA ²XÅÂw¾Õ2D¨B5jP‹:Ô£•ûˆÓá+V!†Õ؈J*Çþ—ðÑ5X‹&¬Cë‘@)l@ÍØŒs8ƒMQ͹ãá›nÁVlÃvìÀNìÂnìÁ^ìÃ~ÀAÂaÁQÃqœÀIœÂiœÇ\Äœj®ÿP¸V—pWp×p7p·pwp÷pðOPé q$Œò0ª¹ÿã႞á9^à%^!dñoñï‘Á|Ä'|Æ|Å7è`dYTÓæ‘ÇÆ ŒH`D#Ù„ª¨æýƒð)ŠQÄH#–cÔ9¢mŒhcD #bÈFÄ0"†1ŒˆaD #bÃÈF¿ áÛ+bÄú#Ö±þˆ6Fš£šÏ©p…Ä0"†1ŒˆaD #bÈFÄ0"†1ŒˆaD #bÈFÄ0"†1ŒˆaD #ÂQĈ"F1b”‘Jß·.\EŒ(bD#ŠQĈ"F1¢ˆEŒ(bD#ŠQĈ"Fd6òÚÑÆˆ6FBb‘ÀˆF$0RI`ùîpƒ½ˆjþБp]1¢ˆEŒ(bD#ŠQĈ"F1¢ˆEŒ|ç[-C„*T£µ¨C=¢š¿ø›á“W`%V!†XÕdÿAø”ÕXƒµhÂ:ı $‘¤±›ÐŒÍØ‚­Ø†íØÝ؃½Ø‡+ØÕüÉ_ ×e?à á0Žà(Žá8Nà$Ná4Îà,Îá<.à".á2®á:nà®F5úwÂÕ¸‰[¸;¸‹{¸xˆGxŒ'xŠgxŽx‰WxÅ[¼Ã{„ÿO½Ü[Ÿð_ð•–÷…e>F5?t=\IEôy«O}ŠèSDŸ"úѧˆ>Eô5 .£O}²è“EŸ,útЧƒ¾J‰ÞJCùÿ¾½útЧƒ>ôé O}&ë3YŸUûÖE5?¾3|™@úÒ'>ô ¤O }éHŸ@úÒ'̾]JŸTútЧƒ>ô™¬Ïd}W±/ªù©UáÒÒ'>ô ¤O }éHŸ@úÒ'>ô ¤O }éHŸ@ú„Ù§ƒ>ôé O%}×¢šŸù‹á"eÑ'‹>YôÉ¢O}²è“EŸ,údÑ'‹>YôÉ¢O}²è“EŸ,údÑ'‹>YôÉ¢/Eô)¢O}Šè ETXѸ ª–©TòsoªQƒZÔ¡ hÄr¬ÀJ¬B «±kÑ„uˆc=HF5ÿøO„KKc#6¡›q¢šá>o ¶b¶cvbvcöböãâãŽâŽãNÂÓí¦Ãxçpp—pWð g¢š_ø®îU\ÃuÜÀMÜÂmÜÁ]ÜÃ}<ÀC<Âc<ÁS<Ãs¼ÀK¼Á[¼Ã{]†›ýuTóZÃuÉà>â>ã <ØÙø Ú_ѪVm´Š¡U ­bhC«ZÅÐ*†V1´º­ZÅÐ*†V1´Š¡U ­k£šß ßY­:hÕA«»ÕmßZ¹øåfk)l€@ZÒ*V´ ¤U­ŠhUD«"ZѪˆVE´*¢U­ŠhUD«"ZѪˆVE´*¢U­ŠhUDë)ˆ°õ tÐjV{´Ú¨õDTó+Cá: ¤U ­iH«@ZÒ*VE´*¢U­ŠhUD«"ZѪˆVE´*¢U­•"šÚÃM"V ´Z«õQTó/9\¸"ZѪˆV%¶¾†6ZµÑ²ÐA«ZuЪƒV´ê U³¾ß¬õg­?ø.ª)ýxø€fÅ0+†Y1ÌŠaV ³b˜ìfÅ0+†Y1ÌŠaV ³îf%:ëžaV³Š˜UĬu6å×oeT»z>\®õg­?kýYãͦ£š¿?|T ³b˜ìfÅ0+†Y1ÌŠaV ³b˜ìfÅ0+Y Ìúõ›=Õü—Åð1«ˆYEÌêtÖ}Ĭlg2+YÌ dV³:˜ÕÁ¬fu0«ƒYÌê`V³:˜ÕÁ¬fu0«ƒYÌê`V³:˜u0«¿Y“ÍZpöaT»lS¸¦šœȬ@f1«ˆYEÌ*bV³Š˜UĬ{‹YYÌÊbV³:˜ (l¶r°Ò_V^P…0Ô§¨¶þß„T£µ¨C=ЈåX•X…Vc Ö¢ ëj÷í ß>‰6 ãHDµ‰?>e#6¡›±[± Û±;± »±{±ûqq‡qGq 'q §qgqOp"ªÝÔ®ßy\ÀE\Âe\ÁU\ÃuÜÀMÜÂmÜÁ]ÜÃ}<ÀC<Âc¿.á†}†çx—x…×xƒð$róô‡µžFµÛ×…kúï‘Á|Ä'|Æ|Å7¤ß×ö ¤_ ýŠèWD¿"úMÛ_ùM¾ÿOÃç)¢_ýVè7J}T{teø¨JúýýéH¿@úµÑ¯þ8ÐF¿6úµÑ¯~1ô‹¡_ ýbèC¿úÅÐ/†~ë÷[¿ßúýèßÕž^ WC ýbèC¿úÅÐ/†~1ô‹¡_ ýrì?YôË¢_ý²è—E¿,úuЯƒ~ôë _ý:è×A¿õû­ßoýþ0”Ýú¯Gµ—šÂUSD¿"úѯˆ~Eô+¢_ýŠè %ö?…,úeÑ/‹~YôË¢ßæý6ï·y¿ÍûmÞÿÉS}Ö"¬ð&ª½1®úuЯƒ~ô‡çý/C„*T£µ¨C=ЈåX•X…XTûGg·jÂ:ıÛ°&ª}ö§¬GI¤°ilB36c ¶úM©Äµnè«?îÄ.œÆö¨öíïçÝØƒ½Ø‡ý8€ƒ8„Ã8‚£O:Ž8‰S8‹s8ç8Õ~ý—áÒ.à".á2®à*®á:nà&ná6îà.îá>à!á1žà)žá%^á5Þà-Þá=2ø€J«:ÂP/¢Úï_®sä Â-ù :èðÑtè C:èÐA‡:tСƒtè ãƒ§•…âOFµ?Ö¾‹":bX5Ðd‡6:,ÓQ¹kù›á“¥Ò!•YtÈ¢C²èE‡,:6BÚèÐF‡6:¶BaÛ!¸t¤CŠèÐA‡:tÐaŽ}Qmç÷ÂÕE‡,:dÑ!‹YtÈ¢C²èE‡ê:Î@ éH‡":Ñ¡ˆEt(¢CŠèPD‡":tСƒtØ£ãVTûCÍá É¢C²èE‡,:dÑ!‹YtÈ¢C˜/ t¤C éH‡@:ÒÚCÇg|ñ ÖCÙ5(‹¡,†r˜â[Tû#oôQÖFYem”µQÖFYem”¥WvQVDYe—QVDYeE”%P–@Ye ”“QíІK³~Ùúeë—­_¶~Ù(å Qí_9>O e1”ÅPCY e1”ÅPCY e–Ý=”eQ–…³¹¬*ë ¬ƒ²Ê:(ë ¬ƒ²õËÖ/[¿lý²õË(W~~&D]CY e1”ÅPCY e1”ÅPCY e9–Ý=”eQ–EYe”uPÖAYe”uPÖAYe”­_¶~Ùúeë—+ëÇn„e*÷ýçÃõCY e1”Ý[”QVDYe÷eM–ÝG”¿ó]–!BªQƒZÔ¡ò·‚_9>o9V`%šÑÕŽ|_øè*İk°MX‡8Ö#$RØ€46b¶`+¶áŽasTû‹ûÂEnÇìÄ.ìÆìÅ>ìÇÄ!Æõ›®îIœÂiœÁjéWÂEžÅ9œÇ\Ä%\Æ\Å5\Ç ÜÄ-ÜÆÜÅ=ÜÇ<Ä#<Æ3<Ç TŠˆ †e*cüå5áZ½Âk¼AäÞ#ƒøˆOøŒ/øŠoP„'ZÇ<Ñ:æ‰Ö1O´Žyful°6ªýÏ>|´P„g=Ç< :6XI%œd%æ‰Ö1O´Žy¢uÌ­cžhóDë˜'ZÇ<Ñ:æ‰Ö1O´Žy¢uÌ­cƒ²ðÜîØ ,<Û:æÙÖ1϶Žy>uÌó©cžOó|ê˜ç5Ç<Í96Xiã×/„k ϱŽyŽuÌs¬cžcóë˜çXÇ<Ç:æ9Ö1ϱŽyŽuÌs¬cžcóë˜'sÇ¥ç9Ö1ϧŽyųcžõó$èØ`å¯ÿ÷t¸\ExRuÌ“ªcžTó¤ê˜'UÇ<©:æIÕ1OªŽyRuÌ“ªcžTó¤ê˜gQÇ<;6XI`õÚj„=îEµ /ÃeÈÂ3«cžYóÌê˜gVÇ<³:6Q„gVÇ<³:æ™Õ1ϬŽyfuÌ3«cž©T„çSÇ<Ÿ:æùÔ1ϧŽy>uÌó©W¯]æ÷cmT—ôŒîÕkkP‹Í¨Šjÿëúð:Ô£XŽX‰Uˆa5Ö`-š°q¬GI¤°ilÄ&4c+¶a;v`'.`KT·ìi¸~»°{°û°p‡pGpÇp'p§pgpçp—pW𣺆áº\Å5\Ç ÜÄ-ÜÆÜÅ=ÜÇçû>†ï,E ,J`Q‹X”À¢%°h£ÅuQÝ­?¾L‹ŠXtWµ(½E÷‹J\âŰ(†E1,ŠaQ ‹bXâŰxÈ?NÀú‹bXÃbø£Ű(†EC-ÚmñHT÷(®•»ŒEa.ºËXTÉ¢Je±(‹EY,ÊbQ‹²X”Å¢,e±(‹E÷‹ÚXâŰ(¸Ek-oñnT÷j8\¸»ŒE©,JeQ‹ÚXÔÆ¢6µ±¨Em,jcQ‹ÚXÔÆ¢6? Ýoèb(Bu‹•ûˆ5~ÕÖ8m̧Yã´1k¾ ~Žê>üáðÑÔ¢õh@#–cVbbX5X‹&TæþsÃ7M ‰6 8‚CXÕ}o8|Å&4c3¶`+¶a;v`'va7ö`/öa?à ŽâŽãNâîàGu¬®ÆiœÁYœÃy\ÀE\Âe\ÁU\ÃuÜ@8uD¸Ü»¸‡ûx€‡x„/øŠO¸ÕýÉ¿®Æc<ÁS<Ãs¼ÀK¼Âk¼Á[¼Ã{dðñ Š˜ôí'ãX°[%†?óÛáR™”ʤT&µ1©ImLjcR“Ú˜ÔÆ¤6&µ1©ImLjcR“•û_ ßY“Š˜TĤ"&%0i­ÉJ9?òáóT2©’IEL*bR“Š˜TĤ"&1©ˆIEL*bR“Š˜TĤ"&÷ûÕ?ïaHoR“晼ƒQÝýF¸p•LªdR%“*™TĤ"&1©ˆIEL*bR“Š˜TĤ"&1©ˆIEL*bò&´6©ˆIEL*bò3t0©ƒIkMÞ‰êþJC¸Bz™Ôˤ^&e1)‹IYLÊbR“²˜”Ť,&e1)‹IYLÊbR“²˜”Ť"&+E¬uPûÚóÂFŸ¢ºŸþ¯á}U¨F jQ‡z4 ˱+± 1¬Æ¬EÖ!ŽpÒ–£QÝßÿ§áÒRØ€46bšqɨ.œ;aíùÍØ‚­Ø†íØØ…ÝØƒ½Ø‡ý8€ƒ8„Ã8‚£8†ã8…Ó8ƒ³8‡ó¸€‹xŠgxŒ“QÝð_ ×ô.ã ®â®ãnânãîâîãâžã^â^£²ùÚÞ°Ì“¨nä_‡kðïð|ÀG|Âg|ÁW|ƒ6z}ƒ^môŠ¡W ½bèC¯zëý‚UîÇ‹ÿ9|²zÅÐ+†^1ôŠ¡×<½æé5YocT÷K?¾B%½*éUI¯JzUÒ«’ÞõH •ôª¤W%½*éUI¯JzeÑ+‹^ ôJ W½è•@¯Û¾×½Û¢º‰®,zeÑ+‹^YôÊ¢W½²è•E¯,zeÑ+ÇÞ“H¯@zÒ+^ô ¤W ½éÕA¯z ßkø^Ã÷¾×ð½6ê ^ê&„«&†^1ôŠ¡W ½bèC¯z×û"ìa¯@zÒ+^ô ¤W½è­$Ðä¤-MUa­·Qݯþ|¸HYôÊ¢W½²è•E¯,z¿óË¡ Õ¨A-êP4byT÷ßþEø²Vc/VFu¥Ÿ XƒµhÂ:ı $‘¤±›Ð ÿàp²˜&'‹ir²˜&'‹ir²˜&'‹ir²˜&'‹ir²˜&§ˆirBš&§oir6—¦ª}QÝ¿© ×ê á0Žà(Žá8Nà$Ná4Îà,Îá<.à¢_—ðÃ\Å5\Ç ÜÄ\Žêþý_ ×ànãîâîÃs!œ1¦Écšœ1¦Écšœ1¦Écšœ1¦Écšœ1¦Écšœ1&=~˜wx dÑn€ö°G%‹¥-áj|Ä'|Æ|Å7È¢ÝçµË¢]í²h—E»,ÚeÑ.‹vY´Ë¢}9V`%äØ.öÕQýÖáðýtЮƒv´›¬}mT_×>ê–lWD»"ÚÑ®ˆvE´+¢]íŠhWD»"ÚÑ®ˆvE´+¢]íû ˆv1´‹¡}oT¿ª7\šJÚÑ®ˆvE´»ÛÑ®ˆvE´+¢]íŠhWD»"ÚÑ®ˆvE´+¢ý"ÄÐnžöËQýº¿.MíÚh×F»6ÚÅÐ.†v1´‹¡] íbhOŒC»ÚÅÐ.†v1´‹¡] íbh ­µ¿…¦Â(¯¢ú ÿo¸²h—E{ÈBíh—@»Ú%Ð.v 8<¬iJS˜’À”¦$0%) L9uût2ª¿µ+|…¦$0%)M-ê÷ UÄ”»Œ)MN¹˜’è”6¦´1¥)1L¹˜RÄ”"¦1¥ˆ)EL)b*üO EL)bJS:˜ÒÁ”¦d6åjJSÛ£úC=áºdJ Sb˜Ô¦Ä0%†)1L‰aJ Sb˜Ô¦Ä0%†)1L‰aJ Sb˜Ôô¦1%) LI`JS˜’À”¦$0%){LUò9õ áš*bJSŠ˜RÄ”"¦1¥ˆ)EL)bJSú›r÷0¥)mLicJS:˜ÒÁ”¦t0¥ƒ)ëOUÖ_çÜùëF¨B5jP‹ Hc#ÂP_£úK?¾¬õh@#–cVbªÿ³?.R C:úÎG—!BªQƒZÔ¡XŽX‰Uˆa5Öø]Øà—½ò«ö·n„ï¼qì@STÿ—¿†¬GI¤°ilÄ&4c3¶`+¶a;va7ÎagTÿ“¯Ã·ßƒ½Ø‡ý8€ƒ8„Ã8‚£8Ž8‰S838‹‡8Õ÷ÿh¸Œ ¸ˆK¸Œ+¸Šk¸Ž¸‰[¸;¸‹{¸“=ŠêÿzK¸ŒÇx‚§x†çx—x…×xƒ·x‡÷È <‘å#>¡rWwm<õ%ª¬ ô Šp¼iÜÁ½q÷ÆÜwpoÜÁ½q÷ÆÜwpo¼KŽ"ŽwɾqGøÆáw„o¼«rðÏþSø¦Féª$ð ÙðGm8¸7îàÞ¸ƒ{ãî;¸7îàÞ¸ƒ{ãî;¸7îàÞ¸ƒ{ãî;¸7îàÞ¸ƒ{ã%Žwí„,ᛞß@Žæ;š7îHÛ¸oã]•¿Yþât¸.²p„oܾqGøÆáw„oܾqGøÆáw„oܾqGøÆáw„oܾqGøÆJï’…c}ãŽõ;¸7îÚx×µ¨þ•ÃåÊÂÁ½q÷ÆÜwpoÜÁ½q÷ÆÜwpoÜÁ½q÷ÆÜwpoÜÁ½q÷ÆÜwpoÜÁ½q÷ÆÜw(q¼Kó;Ì7î¸Þ¸ãÔãî;¸7îÞ¸CzãKnâ%7ñR¸Ù+I(xâN|) %m,icIKÚXÒÆ’6–´±¤%m,icIKÚXÒÆ’6–Ö@‰KMPÄ’"–±¤ˆ%E,)bIK]ÚÕÿÛ\¸.X’À’–$°$%{,5Gõÿâ·Âç)bÉÅ’—Ü3,ÉbIK²X’À’–$°$% ,I`IKX’À’–$°$% ,~ÉðK†_2ü’–*wÿúwÃÕÐÁ’ô–Ü=,)qIK:XÒÁ’–t°¤ƒ%,é`IK:XÒÁ’–t°¤ƒ%,é`IK:XÒÁ’õ—*ë¯xÕÏï×E KbXÃ’–İ$†%.¹£X’ÅÒw¾Á2D¨B5jP‹:Ô£XŽ~7F Mµáİ»±*ªÿÃÖ`-š°q¬GI¤°ilÄ&4c3¶`+¶a;v`'vá<*+Xº.|/öa?à á0Žà(Žá8Nà$Ná4Îà,Îá.Dõÿß™pAq —qWq ×q7q ·qwq÷ñññOñÏ£†ªáp¹/ð¯ðoð!÷Èà>â*E¬[é­¯QÊïÂ÷ûYxhuý˜,Æd1&‹1YŒÉbLc²“Ř,Æd1¶"j¸|6|­QÆVE Éþ(1Œ)bLcŠSĘ"Æ1¦ˆ1EŒ)bLcŠSĘ"Æ1¦ˆ1EŒ)bLcŠÛ!ÌðyÆÛ54ÿásld1&‹1YŒÉbLc²“Ř,Æd1&‹1YŒÉbLc;5ìy¾³6Æ´1¦1Ž]€,Æd1&‹1YŒÉbLc²“Ř,Æl4v;j82¾©6Æ´1¦1mŒicLcÚÓÆ˜6Æ´1¦É±çŘ,Æd1&‹1YŒÉbLc²ÃX%†Äþ0Ҩát)\xhCkc_!‹±ï|Þ2D¨B5jP‹:Ô£XŽX‰Uˆa5Ö`mÔðõwÃwÞ‰uQÃþÇz$D ÆFlB36c ¶b¶cvcöböãâ® RÎß Wã0Žà(Žá8Nà$Ná4Îà,Îá<.à".á²D½dßp¸Ük¸Ž¸‰[¸;¸‹ ÞájÔðâWíîãâã žâžã^â^ã ÞºBáÖø€m|ÆÞ6yë}ÔðþwÂ…Å7hÃÿÍKx\#áq„Ç5×Hx\#áq„Ç5½²ðFÂC i$<¤‘ðFÂ# \$z+YüðÚðMuàA‹„-´HxÐ"áч„G‘HôVÊùC{ÂWÄ£ f$<š‘ðhF£ f$à#>á3¾à+¾ÁúŽ«LyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµ”WUKyUµÔŒõ½ä\jÆú^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åµÔR^K-åÅÓR3aó+QÃT]åqÔð[Ã[Ö÷ªj)¯ª–òªj)¯ª–òªj)¯ª–òªj)¯ª–òªj)¯ª–òªj)¯ª–òªj)¯ª–òªj)¯ª–òªj°ái„*T£µ¨C=ЈåX•X…Vc Ö¢ ëÇz$D ÆFlB36c ¶b¶cvbvcöböãâãŽâŽãNâNã ÎâÎã.â.ã ®â®ãnânãîâîãâã žâžã^â^ã ÞâÞ#ƒøˆOø†°ùÓ¨a¾#,ý9jXúãá-ëOxkÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý ëOXÂúÖŸ°þ„õ'¬?aý‰Ïø‚¯ÄÍâsCÁæ›l^°yÁæ›l^°yÁæ›l^0r!üÆWþøŸÿCøV+£Æêß]56ýTø£ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H  ‚ (H PI ítói§›O;Ý|:œnÞ©ïÓWjQOjuºù´Óͧn>íüòiç—O;¿|ÚùåÓÎ/Ÿv~ù´ó˧½äRÚIæÓN2Ÿv’ù´“̧d>í$ói'™O;É|ÚIæÓN2ŸvVùô•°y,jŒí ׯ9jÜþëá­mpö`§›O;Ý|Ú©ïÓW<ÀèÄói'žO;ñ|Ú‰çÓÎ/Ÿv~ù´ó˧_>íüòiç—O;¿|ÚùåÓÎ/Ÿv~ù´ó˧_>íüòiç—O;¿|ÚùåÓÎ/Ÿv~ù´ó˧_>íüòiçµO_¹†ë¸Ç>8ç|Ú9çÓÎ9Ÿvjù´S˧Z>íÔòi§–O;µ|Ú©åÓN-Ÿvjù´S˧Z>íÔòi§–O;µ|Ú©åÓN-Ÿvjù´S˧Z>íÔòi§–O;µ|ÚyíÓW>Ñ÷ÎuŸvºù´Óͧ‡ÃS‚¬?lýaë[ØúÃÖ¶þ°õ‡­?lýaë‡×¿´þ°õ‡­?lýaë[ØúÃÖÏo·þ°õ‡­?ž`ýaë[8üßÕÍØ1 Û|ØæÃ6¶ù°Í‡m>lóá0÷–¨qó­ðI`zk´ü·~2üÑ‚Ãvë›qØŒÃf6ã°‡Í8lÆa3_ÿ‘ð nD÷~-¼u3jü8¼u+jü±åá­ÛQcñwÃ[w¢ÆßûÞº-?øû_{/Z~ïhxë~´ü]6¼õ Zþƒ'Ã[£å?u:¼eýi?êôöhùï|/ÝñóNûy§Ãƒè~Þéðú¡§Ã!Ჟ‹zZÔÓ¢žõt8a]8PÔÓn’i7É´[cÚ­1žëÖ˜ÿ£Û­1žRåÖ˜õ´¨§E=-êépž|QO‡—ìõ´¨§E=-êéðc…ó‰z:œûXÔÓ¢žõ´¨§E=-êiQO‹zZÔÓ¢ž§²õt8ºKÔÓ¢ž§“õ´¨§+Qo\¿,ZQï߸>BªQƒZÔ¡ hÄr¬ÀJ¬B «±kÑ„uˆc=H"… Hc#6¡›±[± Û±;± »±{±ûqq‡qGq Çq'q §qgqçqq —qWq ×q7q ·qwq÷ñññOñ Ïñ/ñ ¯ñoñï‘Á|Ä'|Æ|Å7>W~ƒ_É9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|Îð9Ãç Ÿ3|©2ü~'„ÛX2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð%× _2|Éð¥Êð›nV†¿à™›nF¨B5jP‹:Ô£XŽX‰Uˆa5Ö`-š°q¬GI¤°ilÄ&4c3¶`+¶a;v`'va7ö`/öa?à á0Žà(Žá8Nà$Ná4Îà,Îá<.à".á2®à*®á:nà&ná6îà.îá>à!á1žà)žá9^à%^á5Þà-Þá=2ø€ø„Ïø‚¯øÃç+Ã?ô í¦¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†Ï>oø¼áó†ÏW†oŽU†ÿèt?ÍN%ØìT‚ÍN%ØìT‚ÍN%ØìT‚ÍN%ØìT‚ÍN%ØìT‚ÍN%ØìT‚ÍN%Ø‹a5Ö`-š°q¬GI¤°ilÄ&4c3¶`+¶a;v`'va7ö`/öa?à á0Žà(Žá8Nà$Ná4Îà,Îá<.à".á2®à*®á:nà&ná6îà.îá>à!á1žà)žá9^à%^á5Þà-Þá=2ø€ø„Ïø‚¯øÃg+÷û7SsÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg Ÿ5|ÖðYÃg _¬ ßýß _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðEà _4|ÑðÅÊð›/U†ïÉ/óV„*T£µ¨C=ЈåX•X…Vc Ö¢ ëÇz$D ÆÆhÅ¿¨\¡ŸüÕeÿ?ƒ1µ& endstream endobj startxref 760018 %%EOF shishi-1.0.2/doc/reference/Makefile.in0000644000000000000000000016003212126772724014454 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/version.xml.in $(top_srcdir)/gtk-doc.make subdir = doc/reference ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.xml CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE = $(PACKAGE) # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR = $(top_srcdir)/lib # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS = # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS = # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = $(top_srcdir)/lib/*.h CFILE_GLOB = $(top_srcdir)/lib/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES = asn1.h cfg.h crypto.h diskio.h internal.h shishi-int.h \ starttls.h utils.h ccache.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = ../components.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS = GTKDOC_LIBS = @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # This includes the standard gtk-doc make rules, copied by gtkdocize. # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ tmpl.stamp sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt #DISTCLEANFILES += # Comment this out if you want 'make check' to test you doc status # and run some sanity checks @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/reference/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/reference/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/gtk-doc.make: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ test -d $(abs_srcdir)/tmpl && \ { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ chmod -R u+w $(abs_builddir)/tmpl; } \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### templates #### tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt @echo ' DOC Rebuilding template files' @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ if test -w $(abs_srcdir) ; then \ cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ fi \ fi @touch tmpl-build.stamp tmpl.stamp: tmpl-build.stamp @true $(srcdir)/tmpl/*.sgml: @true #### xml #### sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) @echo ' DOC Building XML' @-chmod -R u+w $(srcdir) @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$(?)" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building PDF' @rm -f $(DOC_MODULE).pdf @mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ rm -rf tmpl; \ fi maintainer-clean-local: clean @rm -rf xml html install-data-local: @installfiles=`echo $(builddir)/html/*`; \ if test "$$installfiles" = '$(builddir)/html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc dist-hook-local @mkdir $(distdir)/tmpl @mkdir $(distdir)/html @-cp ./tmpl/*.sgml $(distdir)/tmpl @cp ./html/* $(distdir)/html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs #TESTS = $(GTKDOC_CHECK) -include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/doc/reference/tmpl/0000755000000000000000000000000012126773323013435 500000000000000shishi-1.0.2/doc/reference/tmpl/shishi.sgml0000644000000000000000000026136212126773323015542 00000000000000 shishi @SHISHI_KDCOPTIONS_RESERVED: @SHISHI_KDCOPTIONS_FORWARDABLE: @SHISHI_KDCOPTIONS_FORWARDED: @SHISHI_KDCOPTIONS_PROXIABLE: @SHISHI_KDCOPTIONS_PROXY: @SHISHI_KDCOPTIONS_ALLOW_POSTDATE: @SHISHI_KDCOPTIONS_POSTDATED: @SHISHI_KDCOPTIONS_UNUSED7: @SHISHI_KDCOPTIONS_RENEWABLE: @SHISHI_KDCOPTIONS_UNUSED9: @SHISHI_KDCOPTIONS_UNUSED10: @SHISHI_APOPTIONS_RESERVED: @SHISHI_APOPTIONS_USE_SESSION_KEY: @SHISHI_APOPTIONS_MUTUAL_REQUIRED: @SHISHI_AUTHORIZATION_BASIC: @SHISHI_AUTHORIZATION_K5LOGIN: @SHISHI_CRC32: @SHISHI_RSA_MD4: @SHISHI_RSA_MD4_DES: @SHISHI_DES_MAC: @SHISHI_DES_MAC_K: @SHISHI_RSA_MD4_DES_K: @SHISHI_RSA_MD5: @SHISHI_RSA_MD5_DES: @SHISHI_RSA_MD5_DES_GSS: @SHISHI_HMAC_SHA1_DES3_KD: @SHISHI_HMAC_SHA1_96_AES128: @SHISHI_HMAC_SHA1_96_AES256: @SHISHI_ARCFOUR_HMAC_MD5: @SHISHI_KRB5_GSSAPI_CKSUM: @SHISHI_NO_CKSUMTYPE: @SHISHI_NULL: @SHISHI_DES_CBC_CRC: @SHISHI_DES_CBC_MD4: @SHISHI_DES_CBC_MD5: @SHISHI_DES_CBC_NONE: @SHISHI_DES3_CBC_NONE: @SHISHI_DES3_CBC_HMAC_SHA1_KD: @SHISHI_AES128_CTS_HMAC_SHA1_96: @SHISHI_AES256_CTS_HMAC_SHA1_96: @SHISHI_ARCFOUR_HMAC: @SHISHI_ARCFOUR_HMAC_EXP: @SHISHI_FILETYPE_TEXT: @SHISHI_FILETYPE_DER: @SHISHI_FILETYPE_HEX: @SHISHI_FILETYPE_BASE64: @SHISHI_FILETYPE_BINARY: @SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP: @SHISHI_KEYUSAGE_ENCTICKETPART: @SHISHI_KEYUSAGE_ENCASREPPART: @SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_SESSION_KEY: @SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_AUTHENTICATOR_KEY: @SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR_CKSUM: @SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR: @SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY: @SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY: @SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR_CKSUM: @SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR: @SHISHI_KEYUSAGE_ENCAPREPPART: @SHISHI_KEYUSAGE_KRB_PRIV: @SHISHI_KEYUSAGE_KRB_CRED: @SHISHI_KEYUSAGE_KRB_SAFE: @SHISHI_KEYUSAGE_KRB_ERROR: @SHISHI_KEYUSAGE_AD_KDCISSUED: @SHISHI_KEYUSAGE_TICKET_EXTENSION: @SHISHI_KEYUSAGE_TICKET_EXTENSION_AUTHORIZATION: @SHISHI_KEYUSAGE_GSS_R1: @SHISHI_KEYUSAGE_GSS_R2: @SHISHI_KEYUSAGE_GSS_R3: @SHISHI_KEYUSAGE_ACCEPTOR_SEAL: @SHISHI_KEYUSAGE_ACCEPTOR_SIGN: @SHISHI_KEYUSAGE_INITIATOR_SEAL: @SHISHI_KEYUSAGE_INITIATOR_SIGN: @SHISHI_KEYUSAGE_KCMD_DES: @SHISHI_KEYUSAGE_KCMD_INPUT: @SHISHI_KEYUSAGE_KCMD_OUTPUT: @SHISHI_KEYUSAGE_KCMD_STDERR_INPUT: @SHISHI_KEYUSAGE_KCMD_STDERR_OUTPUT: @SHISHI_KDC_ERR_NONE: @SHISHI_KDC_ERR_NAME_EXP: @SHISHI_KDC_ERR_SERVICE_EXP: @SHISHI_KDC_ERR_BAD_PVNO: @SHISHI_KDC_ERR_C_OLD_MAST_KVNO: @SHISHI_KDC_ERR_S_OLD_MAST_KVNO: @SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN: @SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN: @SHISHI_KDC_ERR_PRINCIPAL_NOT_UNIQUE: @SHISHI_KDC_ERR_NULL_KEY: @SHISHI_KDC_ERR_CANNOT_POSTDATE: @SHISHI_KDC_ERR_NEVER_VALID: @SHISHI_KDC_ERR_POLICY: @SHISHI_KDC_ERR_BADOPTION: @SHISHI_KDC_ERR_ETYPE_NOSUPP: @SHISHI_KDC_ERR_SUMTYPE_NOSUPP: @SHISHI_KDC_ERR_PADATA_TYPE_NOSUPP: @SHISHI_KDC_ERR_TRTYPE_NOSUPP: @SHISHI_KDC_ERR_CLIENT_REVOKED: @SHISHI_KDC_ERR_SERVICE_REVOKED: @SHISHI_KDC_ERR_TGT_REVOKED: @SHISHI_KDC_ERR_CLIENT_NOTYET: @SHISHI_KDC_ERR_SERVICE_NOTYET: @SHISHI_KDC_ERR_KEY_EXPIRED: @SHISHI_KDC_ERR_PREAUTH_FAILED: @SHISHI_KDC_ERR_PREAUTH_REQUIRED: @SHISHI_KDC_ERR_SERVER_NOMATCH: @SHISHI_KDC_ERR_MUST_USE_USER2USER: @SHISHI_KDC_ERR_PATH_NOT_ACCPETED: @SHISHI_KDC_ERR_SVC_UNAVAILABLE: @SHISHI_KRB_AP_ERR_BAD_INTEGRITY: @SHISHI_KRB_AP_ERR_TKT_EXPIRED: @SHISHI_KRB_AP_ERR_TKT_NYV: @SHISHI_KRB_AP_ERR_REPEAT: @SHISHI_KRB_AP_ERR_NOT_US: @SHISHI_KRB_AP_ERR_BADMATCH: @SHISHI_KRB_AP_ERR_SKEW: @SHISHI_KRB_AP_ERR_BADADDR: @SHISHI_KRB_AP_ERR_BADVERSION: @SHISHI_KRB_AP_ERR_MSG_TYPE: @SHISHI_KRB_AP_ERR_MODIFIED: @SHISHI_KRB_AP_ERR_BADORDER: @SHISHI_KRB_AP_ERR_BADKEYVER: @SHISHI_KRB_AP_ERR_NOKEY: @SHISHI_KRB_AP_ERR_MUT_FAIL: @SHISHI_KRB_AP_ERR_BADDIRECTION: @SHISHI_KRB_AP_ERR_METHOD: @SHISHI_KRB_AP_ERR_BADSEQ: @SHISHI_KRB_AP_ERR_INAPP_CKSUM: @SHISHI_KRB_AP_PATH_NOT_ACCEPTED: @SHISHI_KRB_ERR_RESPONSE_TOO_BIG: @SHISHI_KRB_ERR_GENERIC: @SHISHI_KRB_ERR_FIELD_TOOLONG: @SHISHI_KDC_ERROR_CLIENT_NOT_TRUSTED: @SHISHI_KDC_ERROR_KDC_NOT_TRUSTED: @SHISHI_KDC_ERROR_INVALID_SIG: @SHISHI_KDC_ERR_KEY_TOO_WEAK: @SHISHI_KDC_ERR_CERTIFICATE_MISMATCH: @SHISHI_KRB_AP_ERR_NO_TGT: @SHISHI_KDC_ERR_WRONG_REALM: @SHISHI_KRB_AP_ERR_USER_TO_USER_REQUIRED: @SHISHI_KDC_ERR_CANT_VERIFY_CERTIFICATE: @SHISHI_KDC_ERR_INVALID_CERTIFICATE: @SHISHI_KDC_ERR_REVOKED_CERTIFICATE: @SHISHI_KDC_ERR_REVOCATION_STATUS_UNKNOWN: @SHISHI_KDC_ERR_REVOCATION_STATUS_UNAVAILABLE: @SHISHI_KDC_ERR_CLIENT_NAME_MISMATCH: @SHISHI_KDC_ERR_KDC_NAME_MISMATCH: @SHISHI_LAST_ERROR_CODE: @SHISHI_LRTYPE_LAST_INITIAL_TGT_REQUEST: @SHISHI_LRTYPE_LAST_INITIAL_REQUEST: @SHISHI_LRTYPE_NEWEST_TGT_ISSUE: @SHISHI_LRTYPE_LAST_RENEWAL: @SHISHI_LRTYPE_LAST_REQUEST: @SHISHI_MSGTYPE_AS_REQ: @SHISHI_MSGTYPE_AS_REP: @SHISHI_MSGTYPE_TGS_REQ: @SHISHI_MSGTYPE_TGS_REP: @SHISHI_MSGTYPE_AP_REQ: @SHISHI_MSGTYPE_AP_REP: @SHISHI_MSGTYPE_RESERVED16: @SHISHI_MSGTYPE_RESERVED17: @SHISHI_MSGTYPE_SAFE: @SHISHI_MSGTYPE_PRIV: @SHISHI_MSGTYPE_CRED: @SHISHI_MSGTYPE_ERROR: @SHISHI_NT_UNKNOWN: @SHISHI_NT_PRINCIPAL: @SHISHI_NT_SRV_INST: @SHISHI_NT_SRV_HST: @SHISHI_NT_SRV_XHST: @SHISHI_NT_UID: @SHISHI_NT_X500_PRINCIPAL: @SHISHI_NT_SMTP_NAME: @SHISHI_NT_ENTERPRISE: @SHISHI_OUTPUTTYPE_NULL: @SHISHI_OUTPUTTYPE_STDERR: @SHISHI_OUTPUTTYPE_SYSLOG: @SHISHI_PA_TGS_REQ: @SHISHI_PA_ENC_TIMESTAMP: @SHISHI_PA_PW_SALT: @SHISHI_PA_RESERVED: @SHISHI_PA_ENC_UNIX_TIME: @SHISHI_PA_SANDIA_SECUREID: @SHISHI_PA_SESAME: @SHISHI_PA_OSF_DCE: @SHISHI_PA_CYBERSAFE_SECUREID: @SHISHI_PA_AFS3_SALT: @SHISHI_PA_ETYPE_INFO: @SHISHI_PA_SAM_CHALLENGE: @SHISHI_PA_SAM_RESPONSE: @SHISHI_PA_PK_AS_REQ: @SHISHI_PA_PK_AS_REP: @SHISHI_PA_ETYPE_INFO2: @SHISHI_PA_USE_SPECIFIED_KVNO: @SHISHI_PA_SAM_REDIRECT: @SHISHI_PA_GET_FROM_TYPED_DATA: @SHISHI_TD_PADATA: @SHISHI_PA_SAM_ETYPE_INFO: @SHISHI_PA_ALT_PRINC: @SHISHI_PA_SAM_CHALLENGE2: @SHISHI_PA_SAM_RESPONSE2: @SHISHI_PA_EXTRA_TGT: @SHISHI_TD_PKINIT_CMS_CERTIFICATES: @SHISHI_TD_KRB_PRINCIPAL: @SHISHI_TD_KRB_REALM: @SHISHI_TD_TRUSTED_CERTIFIERS: @SHISHI_TD_CERTIFICATE_INDEX: @SHISHI_TD_APP_DEFINED_ERROR: @SHISHI_TD_REQ_NONCE: @SHISHI_TD_REQ_SEQ: @SHISHI_PA_PAC_REQUEST: @SHISHI_OK: @SHISHI_ASN1_ERROR: @SHISHI_FOPEN_ERROR: @SHISHI_IO_ERROR: @SHISHI_MALLOC_ERROR: @SHISHI_BASE64_ERROR: @SHISHI_REALM_MISMATCH: @SHISHI_CNAME_MISMATCH: @SHISHI_NONCE_MISMATCH: @SHISHI_TGSREP_BAD_KEYTYPE: @SHISHI_KDCREP_BAD_KEYTYPE: @SHISHI_APREP_BAD_KEYTYPE: @SHISHI_APREP_VERIFY_FAILED: @SHISHI_APREQ_BAD_KEYTYPE: @SHISHI_TOO_SMALL_BUFFER: @SHISHI_DERIVEDKEY_TOO_SMALL: @SHISHI_KEY_TOO_LARGE: @SHISHI_CRYPTO_ERROR: @SHISHI_CRYPTO_INTERNAL_ERROR: @SHISHI_SOCKET_ERROR: @SHISHI_BIND_ERROR: @SHISHI_SENDTO_ERROR: @SHISHI_RECVFROM_ERROR: @SHISHI_CLOSE_ERROR: @SHISHI_KDC_TIMEOUT: @SHISHI_KDC_NOT_KNOWN_FOR_REALM: @SHISHI_TTY_ERROR: @SHISHI_GOT_KRBERROR: @SHISHI_HANDLE_ERROR: @SHISHI_INVALID_TKTS: @SHISHI_TICKET_BAD_KEYTYPE: @SHISHI_INVALID_KEY: @SHISHI_APREQ_DECRYPT_FAILED: @SHISHI_TICKET_DECRYPT_FAILED: @SHISHI_INVALID_TICKET: @SHISHI_OUT_OF_RANGE: @SHISHI_ASN1_NO_ELEMENT: @SHISHI_SAFE_BAD_KEYTYPE: @SHISHI_SAFE_VERIFY_FAILED: @SHISHI_PKCS5_INVALID_PRF: @SHISHI_PKCS5_INVALID_ITERATION_COUNT: @SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH: @SHISHI_PKCS5_DERIVED_KEY_TOO_LONG: @SHISHI_INVALID_PRINCIPAL_NAME: @SHISHI_INVALID_ARGUMENT: @SHISHI_ASN1_NO_VALUE: @SHISHI_CONNECT_ERROR: @SHISHI_VERIFY_FAILED: @SHISHI_PRIV_BAD_KEYTYPE: @SHISHI_FILE_ERROR: @SHISHI_ENCAPREPPART_BAD_KEYTYPE: @SHISHI_GETTIMEOFDAY_ERROR: @SHISHI_KEYTAB_ERROR: @SHISHI_CCACHE_ERROR: @SHISHI_LAST_ERROR: @SHISHI_TICKETFLAGS_RESERVED: @SHISHI_TICKETFLAGS_FORWARDABLE: @SHISHI_TICKETFLAGS_FORWARDED: @SHISHI_TICKETFLAGS_PROXIABLE: @SHISHI_TICKETFLAGS_PROXY: @SHISHI_TICKETFLAGS_MAY_POSTDATE: @SHISHI_TICKETFLAGS_POSTDATED: @SHISHI_TICKETFLAGS_INVALID: @SHISHI_TICKETFLAGS_RENEWABLE: @SHISHI_TICKETFLAGS_INITIAL: @SHISHI_TICKETFLAGS_PRE_AUTHENT: @SHISHI_TICKETFLAGS_HW_AUTHENT: @SHISHI_TICKETFLAGS_TRANSITED_POLICY_CHECKED: @SHISHI_TICKETFLAGS_OK_AS_DELEGATE: @SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED: @SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE: @SHISHI_TR_DOMAIN_X500_COMPRESS: @void: @Returns: @handle: @decryptp: @key: @iv: @ivout: @in: @inlen: @out: @Returns: @handle: @decryptp: @key: @keylen: @iv: @ivout: @in: @inlen: @out: @Returns: @void: @handle: @ap: @Returns: @ap: @Returns: @ap: @out: @len: @Returns: @ap: @authenticatorcksumdata: @authenticatorcksumdatalen: @ap: @authenticatorcksumtype: @authenticatorcksumraw: @authenticatorcksumrawlen: @ap: @Returns: @ap: @cksumtype: @ap: @authenticator: @ap: @ap: @Returns: @ap: @encapreppart: @handle: @ap: @etype: @Returns: @handle: @ap: @etype: @tkt: @options: @data: @len: @Returns: @ap: @Returns: @handle: @ap: @Returns: @option: @Returns: @ap: @Returns: @ap: @aprep: @Returns: @ap: @Returns: @ap: @out: @outlen: @Returns: @ap: @der: @derlen: @Returns: @ap: @aprep: @ap: @Returns: @ap: @aprep: @Returns: @ap: @der: @derlen: @Returns: @ap: @Returns: @ap: @apreq: @Returns: @ap: @Returns: @ap: @Returns: @ap: @out: @outlen: @Returns: @ap: @der: @derlen: @Returns: @ap: @key: @Returns: @ap: @key: @keyusage: @Returns: @ap: @apreq: @ap: @tkt: @options: @Returns: @ap: @tkt: @options: @node: @field: @authenticatorcksumkeyusage: @authenticatorkeyusage: @Returns: @ap: @tkt: @options: @data: @len: @Returns: @ap: @tkt: @options: @cksumtype: @data: @len: @Returns: @str: @Returns: @ap: @Returns: @ap: @tkt: @handle: @ap: @tkt: @options: @Returns: @handle: @ap: @tkt: @options: @node: @field: @authenticatorcksumkeyusage: @authenticatorkeyusage: @Returns: @handle: @ap: @tkt: @options: @data: @len: @Returns: @handle: @ap: @tkt: @options: @cksumtype: @data: @len: @Returns: @handle: @Returns: @handle: @aprep: @key: @keyusage: @encapreppart: @Returns: @handle: @aprep: @encticketpart: @encapreppart: @Returns: @handle: @aprep: @encapreppart: @authenticator: @encticketpart: @Returns: @handle: @aprep: @etype: @buf: @buflen: @Returns: @handle: @aprep: @filetype: @filename: @Returns: @handle: @aprep: @etype: @Returns: @handle: @fh: @aprep: @Returns: @handle: @fh: @aprep: @Returns: @handle: @fh: @aprep: @Returns: @handle: @fh: @aprep: @Returns: @handle: @aprep: @filetype: @filename: @Returns: @handle: @authenticator: @encapreppart: @Returns: @handle: @Returns: @handle: @apreq: @key: @keyusage: @authenticator: @Returns: @handle: @apreq: @key: @keyusage: @authenticator: @Returns: @handle: @apreq: @filetype: @filename: @Returns: @handle: @apreq: @etype: @Returns: @handle: @apreq: @ticket: @Returns: @handle: @apreq: @Returns: @handle: @apreq: @flags: @Returns: @handle: @apreq: @option: @Returns: @handle: @apreq: @option: @Returns: @handle: @apreq: @options: @Returns: @handle: @fh: @apreq: @Returns: @handle: @fh: @apreq: @Returns: @handle: @fh: @apreq: @Returns: @handle: @fh: @apreq: @Returns: @handle: @apreq: @etype: @kvno: @buf: @buflen: @Returns: @handle: @apreq: @ticket: @Returns: @handle: @apreq: @filetype: @filename: @Returns: @handle: @apreq: @Returns: @handle: @decryptp: @key: @keylen: @iv: @ivout: @in: @inlen: @out: @Returns: @handle: @as: @Returns: @handle: @asreq: @asrep: @Returns: @handle: @asreq: @asrep: @Returns: @handle: @asreq: @asrep: @salt: @saltlen: @Returns: @as: @as: @Returns: @as: @out: @outlen: @Returns: @as: @krberror: @handle: @asreq: @asrep: @string: @enckdcreppart: @Returns: @as: @Returns: @as: @key: @Returns: @as: @out: @outlen: @Returns: @as: @der: @derlen: @Returns: @as: @key: @password: @Returns: @as: @asrep: @as: @Returns: @as: @Returns: @as: @out: @outlen: @Returns: @as: @der: @derlen: @Returns: @as: @asreq: @as: @Returns: @as: @hint: @Returns: @as: @Returns: @as: @tkt: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @node: @handle: @node: @field: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @node: @Returns: @handle: @node: @field: @n: @Returns: @handle: @Returns: @handle: @Returns: @handle: @node: @fh: @handle: @Returns: @handle: @node: @field: @data: @datalen: @Returns: @handle: @node: @field: @flags: @Returns: @handle: @node: @field: @data: @datalen: @Returns: @handle: @node: @field: @i: @Returns: @handle: @node: @field: @i: @Returns: @handle: @node: @field: @data: @datalen: @Returns: @handle: @node: @field: @i: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @node: @der: @len: @Returns: @handle: @node: @field: @der: @len: @Returns: @handle: @node: @field: @data: @datalen: @Returns: @handle: @node: @field: @flags: @Returns: @handle: @node: @field: @n: @Returns: @handle: @node: @field: @n: @Returns: @handle: @node: @field: @n: @Returns: @handle: @Returns: @handle: @Returns: @handle: @asreq: @client: @clientlen: @Returns: @handle: @realm: @server: @client: @Returns: @handle: @Returns: @handle: @authenticator: @adtype: @addata: @addatalen: @Returns: @handle: @authenticator: @key: @keyusage: @data: @datalen: @Returns: @handle: @authenticator: @key: @keyusage: @cksumtype: @data: @datalen: @Returns: @handle: @authenticator: @Returns: @handle: @authenticator: @etype: @Returns: @handle: @authenticator: @subkey: @Returns: @handle: @authenticator: @adtype: @addata: @addatalen: @nth: @Returns: @handle: @authenticator: @cksumtype: @cksum: @cksumlen: @Returns: @handle: @authenticator: @Returns: @handle: @authenticator: @client: @clientlen: @Returns: @handle: @authenticator: @client: @Returns: @handle: @authenticator: @client: @clientlen: @Returns: @handle: @authenticator: @t: @Returns: @handle: @authenticator: @t: @Returns: @handle: @authenticator: @cusec: @Returns: @handle: @authenticator: @cusec: @Returns: @handle: @authenticator: @filetype: @filename: @Returns: @handle: @authenticator: @subkey: @Returns: @handle: @fh: @authenticator: @Returns: @handle: @fh: @authenticator: @Returns: @handle: @fh: @authenticator: @Returns: @handle: @authenticator: @Returns: @handle: @authenticator: @Returns: @handle: @fh: @authenticator: @Returns: @handle: @authenticator: @seqnumber: @Returns: @handle: @authenticator: @Returns: @handle: @authenticator: @seqnumber: @Returns: @handle: @authenticator: @cksumtype: @cksum: @cksumlen: @Returns: @handle: @authenticator: @name_type: @cname: @Returns: @handle: @authenticator: @crealm: @Returns: @handle: @authenticator: @subkeytype: @subkey: @subkeylen: @Returns: @handle: @Returns: @handle: @authenticator: @filetype: @filename: @Returns: @authorization: @Returns: @handle: @principal: @authzname: @Returns: @handle: @principal: @authzname: @Returns: @handle: @tkt: @authzname: @Returns: @handle: @option: @Returns: @handle: @value: @Returns: @handle: @etypes: @Returns: @handle: @Returns: @handle: @value: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @cfg: @Returns: @handle: @fh: @Returns: @handle: @file: @Returns: @req_version: @Returns: @handle: @key: @keyusage: @cksumtype: @in: @inlen: @out: @outlen: @Returns: @type: @Returns: @type: @Returns: @checksum: @Returns: @type: @Returns: @type: @Returns: @type: @Returns: @type: @Returns: @type: @Returns: @type: @Returns: @cipher: @Returns: @type: @Returns: @type: @Returns: @handle: @in: @inlen: @out: @Returns: @handle: @key: @keyusage: @etype: @iv: @ivlen: @Returns: @ctx: @ctx: @in: @inlen: @out: @outlen: @Returns: @ctx: @in: @inlen: @out: @outlen: @Returns: @handle: @node: @field: @t: @Returns: @handle: @key: @keyusage: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @iv: @ivlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @iv: @ivlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @iv: @ivlen: @ivout: @ivoutlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @iv: @ivlen: @ivout: @ivoutlen: @in: @inlen: @out: @outlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @der: @derlen: @Returns: @handle: @name: @salt: @Returns: @handle: @decryptp: @key: @iv: @ivout: @in: @inlen: @out: @Returns: @handle: @key: @iv: @in: @inlen: @out: @Returns: @handle: @key: @prfconstant: @prfconstantlen: @derivedkey: @Returns: @handle: @handle: @key: @prfconstant: @prfconstantlen: @derivedrandom: @derivedrandomlen: @Returns: @handle: @Returns: @handle: @encapreppart: @t: @Returns: @handle: @encapreppart: @t: @Returns: @handle: @encapreppart: @cusec: @Returns: @handle: @encapreppart: @cusec: @Returns: @handle: @encapreppart: @filetype: @filename: @Returns: @handle: @encapreppart: @key: @Returns: @handle: @fh: @encapreppart: @Returns: @handle: @fh: @encapreppart: @Returns: @handle: @fh: @encapreppart: @Returns: @handle: @fh: @encapreppart: @Returns: @handle: @encapreppart: @seqnumber: @Returns: @handle: @encapreppart: @Returns: @handle: @encapreppart: @seqnumber: @Returns: @handle: @encapreppart: @authenticator: @Returns: @handle: @encapreppart: @filetype: @filename: @Returns: @handle: @Returns: @handle: @Returns: @handle: @enckdcreppart: @authtime: @Returns: @handle: @enckdcreppart: @endtime: @Returns: @handle: @enckdcreppart: @flags: @Returns: @handle: @enckdcreppart: @key: @Returns: @handle: @enckdcreppart: @key: @Returns: @handle: @enckdcreppart: @nonce: @Returns: @handle: @fh: @enckdcreppart: @Returns: @handle: @enckdcreppart: @encticketpart: @Returns: @handle: @fh: @enckdcreppart: @Returns: @handle: @fh: @enckdcreppart: @Returns: @handle: @enckdcreppart: @renew_till: @Returns: @handle: @fh: @enckdcreppart: @Returns: @handle: @enckdcreppart: @server: @Returns: @handle: @enckdcreppart: @name_type: @sname: @Returns: @handle: @enckdcreppart: @srealm: @Returns: @handle: @enckdcreppart: @srealm: @server: @Returns: @handle: @enckdcreppart: @starttime: @Returns: @handle: @encprivpart: @userdata: @userdatalen: @Returns: @handle: @encprivpart: @userdata: @userdatalen: @Returns: @handle: @key: @keyusage: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @iv: @ivlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @iv: @ivlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @iv: @ivlen: @ivout: @ivoutlen: @in: @inlen: @out: @outlen: @Returns: @handle: @key: @keyusage: @etype: @iv: @ivlen: @ivout: @ivoutlen: @in: @inlen: @out: @outlen: @Returns: @handle: @Returns: @handle: @encticketpart: @Returns: @handle: @encticketpart: @authtime: @authtimelen: @Returns: @handle: @encticketpart: @authtime: @Returns: @handle: @encticketpart: @client: @clientlen: @Returns: @handle: @encticketpart: @client: @clientlen: @Returns: @handle: @encticketpart: @name_type: @principal: @Returns: @handle: @encticketpart: @crealm: @crealmlen: @Returns: @handle: @encticketpart: @realm: @Returns: @handle: @encticketpart: @endtime: @Returns: @handle: @encticketpart: @flags: @Returns: @handle: @encticketpart: @key: @Returns: @handle: @encticketpart: @key: @Returns: @handle: @fh: @encticketpart: @Returns: @handle: @encticketpart: @trtype: @trdata: @trdatalen: @Returns: @handle: @Returns: @handle: @handle: @Returns: @handle: @format: @...: @handle: @errstr: @handle: @type: @handle: @fh: @etypeinfo2: @Returns: @handle: @fh: @etypeinfo: @Returns: @handle: @t: @Returns: @handle: @Returns: @handle: @t: @Returns: @p: @now: @Returns: @handle: @key: @keylen: @in: @inlen: @outhash: @Returns: @handle: @key: @keylen: @in: @inlen: @outhash: @Returns: @handle: @Returns: @handle: @hostkeysfile: @handle: @service: @Returns: @handle: @service: @realm: @Returns: @handle: @server: @Returns: @handle: @server: @realm: @Returns: @handle: @format: @...: @handle: @Returns: @handle: @Returns: @handle: @systemcfgfile: @Returns: @handle: @tktsfile: @systemcfgfile: @usercfgfile: @Returns: @handle: @kdcreq: @enckdcreppart: @Returns: @handle: @kdcrep: @encticketpart: @Returns: @handle: @kdcrep: @encticketpart: @Returns: @handle: @kdcreq: @enckdcreppart: @Returns: @handle: @fh: @asreq: @asrep: @encasreppart: @Returns: @handle: @kdcreq: @kdcrep: @key: @keyusage: @enckdcreppart: @Returns: @handle: @realm: @indata: @inlen: @outdata: @outlen: @Returns: @handle: @realm: @indata: @inlen: @outdata: @outlen: @hint: @Returns: @handle: @kdcrep: @key: @keyusage: @enckdcreppart: @Returns: @handle: @kdcrep: @Returns: @handle: @kdcrep: @client: @Returns: @handle: @kdcrep: @name_type: @cname: @Returns: @handle: @kdcrep: @crealm: @Returns: @handle: @kdcrep: @crealm: @client: @Returns: @handle: @kdcrep: @key: @keyusage: @enckdcreppart: @Returns: @handle: @kdcrep: @filetype: @filename: @Returns: @handle: @kdcrep: @etype: @Returns: @handle: @kdcrep: @ticket: @Returns: @handle: @fh: @kdcrep: @Returns: @handle: @fh: @kdcrep: @Returns: @handle: @fh: @kdcrep: @Returns: @handle: @fh: @kdcrep: @Returns: @handle: @kdcrep: @etype: @kvno: @buf: @buflen: @Returns: @handle: @kdcrep: @ticket: @Returns: @handle: @kdcrep: @filetype: @filename: @Returns: @handle: @realm: @service: @req: @Returns: @handle: @kdcreq: @padatatype: @data: @datalen: @Returns: @handle: @kdcreq: @key: @Returns: @handle: @kdcreq: @apreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @client: @clientlen: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @etype: @netype: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @filetype: @filename: @Returns: @handle: @kdcreq: @padatatype: @out: @outlen: @Returns: @handle: @kdcreq: @apreq: @Returns: @handle: @kdcreq: @nonce: @Returns: @handle: @kdcreq: @nonce: @Returns: @handle: @kdcreq: @flags: @Returns: @handle: @kdcreq: @option: @Returns: @handle: @kdcreq: @options: @Returns: @handle: @fh: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @fh: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @fh: @kdcreq: @Returns: @handle: @kdcreq: @realm: @realmlen: @Returns: @handle: @kdcreq: @realm: @realmlen: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @Returns: @handle: @fh: @kdcreq: @Returns: @handle: @kdcreq: @kdcrep: @Returns: @handle: @kdcreq: @kdcrep: @hint: @Returns: @handle: @kdcreq: @server: @serverlen: @Returns: @handle: @kdcreq: @name_type: @principal: @Returns: @handle: @kdcreq: @etype: @netype: @Returns: @handle: @kdcreq: @realm: @Returns: @handle: @req: @realm: @service: @Returns: @handle: @req: @service: @Returns: @handle: @kdcreq: @name_type: @sname: @Returns: @handle: @kdcreq: @till: @tilllen: @Returns: @handle: @kdcreq: @Returns: @handle: @kdcreq: @filetype: @filename: @Returns: @handle: @kdcreq: @Returns: @handle: @key: @Returns: @dstkey: @srckey: @key: @handle: @type: @value: @key: @Returns: @handle: @type: @name: @password: @passwordlen: @parameter: @outkey: @Returns: @handle: @type: @rnd: @rndlen: @outkey: @Returns: @handle: @type: @password: @passwordlen: @salt: @saltlen: @parameter: @outkey: @Returns: @handle: @type: @value: @key: @Returns: @key: @Returns: @key: @Returns: @handle: @fh: @key: @Returns: @key: @Returns: @key: @principal: @handle: @fh: @key: @Returns: @handle: @type: @key: @Returns: @key: @Returns: @key: @realm: @key: @Returns: @key: @timestamp: @handle: @filename: @key: @Returns: @key: @Returns: @key: @type: @key: @Returns: @key: @value: @key: @Returns: @key: @kvno: @handle: @keys: @Returns: @keys: @key: @Returns: @handle: @filename: @keys: @Returns: @handle: @data: @len: @keys: @Returns: @keys: @handle: @filename: @service: @realm: @Returns: @handle: @filename: @server: @Returns: @handle: @filename: @server: @realm: @Returns: @keys: @filename: @Returns: @handle: @filename: @outkeys: @Returns: @handle: @data: @len: @outkeys: @Returns: @keys: @keyno: @Returns: @keys: @fh: @Returns: @keys: @keyno: @keys: @Returns: @handle: @filename: @keys: @Returns: @handle: @keys: @filename: @Returns: @handle: @keys: @out: @len: @Returns: @handle: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @client: @clientlen: @Returns: @handle: @krberror: @client: @Returns: @handle: @krberror: @realm: @realmlen: @Returns: @handle: @krberror: @t: @Returns: @handle: @krberror: @t: @Returns: @handle: @krberror: @cusec: @Returns: @handle: @krberror: @cusec: @Returns: @handle: @krberror: @out: @outlen: @Returns: @handle: @krberror: @edata: @edatalen: @Returns: @handle: @krberror: @errorcode: @Returns: @handle: @krberror: @Returns: @handle: @errorcode: @Returns: @handle: @krberror: @errorcode: @Returns: @handle: @krberror: @etext: @etextlen: @Returns: @handle: @krberror: @filetype: @filename: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @methoddata: @Returns: @handle: @fh: @krberror: @Returns: @handle: @fh: @krberror: @Returns: @handle: @fh: @krberror: @Returns: @handle: @fh: @krberror: @Returns: @handle: @krberror: @realm: @realmlen: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @krberror: @Returns: @handle: @fh: @krberror: @Returns: @handle: @krberror: @server: @serverlen: @Returns: @handle: @krberror: @server: @Returns: @handle: @krberror: @name_type: @cname: @Returns: @handle: @krberror: @crealm: @Returns: @handle: @krberror: @edata: @Returns: @handle: @krberror: @etext: @Returns: @handle: @krberror: @realm: @Returns: @handle: @krberror: @name_type: @sname: @Returns: @handle: @krberror: @t: @Returns: @handle: @krberror: @t: @Returns: @handle: @krberror: @susec: @Returns: @handle: @krberror: @susec: @Returns: @handle: @krberror: @filetype: @filename: @Returns: @handle: @in: @inlen: @out: @Returns: @handle: @in: @inlen: @out: @Returns: @handle: @fh: @methoddata: @Returns: @handle: @in: @inlen: @out: @outlen: @Returns: @handle: @fh: @padata: @Returns: @handle: @name: @principal: @realm: @Returns: @handle: @P: @Plen: @S: @Slen: @c: @dkLen: @DK: @Returns: @handle: @Returns: @void: @Returns: @handle: @principal: @handle: @namenode: @namefield: @out: @outlen: @Returns: @handle: @namenode: @namefield: @realmnode: @realmfield: @out: @outlen: @Returns: @handle: @namenode: @namefield: @name_type: @name: @Returns: @handle: @namenode: @namefield: @name: @Returns: @handle: @priv: @Returns: @priv: @key: @Returns: @priv: @handle: @priv: @etype: @Returns: @priv: @Returns: @priv: @out: @outlen: @Returns: @priv: @der: @derlen: @Returns: @priv: @asn1encprivpart: @handle: @priv: @filetype: @filename: @Returns: @priv: @Returns: @priv: @key: @handle: @fh: @priv: @Returns: @handle: @fh: @priv: @Returns: @priv: @Returns: @priv: @out: @outlen: @Returns: @priv: @der: @derlen: @Returns: @priv: @asn1priv: @priv: @key: @Returns: @handle: @fh: @priv: @Returns: @handle: @fh: @priv: @Returns: @handle: @priv: @etype: @encpart: @encpartlen: @Returns: @handle: @priv: @filetype: @filename: @Returns: @handle: @s: @format: @...: @Returns: @handle: @Returns: @handle: @cb: @handle: @s: @format: @ap: @Returns: @handle: @keytype: @rnd: @rndlen: @outkey: @Returns: @handle: @strong: @data: @datalen: @Returns: @handle: @Returns: @void: @Returns: @handle: @realm: @handle: @server: @Returns: @handle: @server: @Returns: @handle: @server: @Returns: @zone: @querytype: @Returns: @rrs: @handle: @safe: @Returns: @safe: @key: @Returns: @handle: @safe: @cksumtype: @cksum: @cksumlen: @Returns: @safe: @handle: @safe: @filetype: @filename: @Returns: @safe: @Returns: @safe: @key: @handle: @fh: @safe: @Returns: @handle: @fh: @safe: @Returns: @handle: @fh: @safe: @Returns: @safe: @Returns: @safe: @out: @outlen: @Returns: @safe: @der: @derlen: @Returns: @safe: @asn1safe: @handle: @fh: @safe: @Returns: @handle: @safe: @cksumtype: @cksum: @cksumlen: @Returns: @handle: @safe: @userdata: @userdatalen: @Returns: @handle: @safe: @filetype: @filename: @Returns: @handle: @safe: @userdata: @userdatalen: @Returns: @safe: @key: @Returns: @void: @Returns: @handle: @service: @Returns: @err: @Returns: @handle: @keytype: @password: @passwordlen: @salt: @saltlen: @parameter: @outkey: @Returns: @handle: @tgs: @Returns: @tgs: @Returns: @tgs: @tgs: @Returns: @tgs: @out: @outlen: @Returns: @tgs: @krberror: @handle: @tgsreq: @tgsrep: @authenticator: @oldenckdcreppart: @enckdcreppart: @Returns: @tgs: @Returns: @tgs: @keyusage: @key: @Returns: @tgs: @out: @outlen: @Returns: @tgs: @Returns: @tgs: @Returns: @tgs: @Returns: @tgs: @out: @outlen: @Returns: @tgs: @der: @derlen: @Returns: @tgs: @Returns: @tgs: @tgsreq: @tgs: @Returns: @tgs: @hint: @Returns: @tgs: @realm: @Returns: @tgs: @realm: @server: @Returns: @tgs: @server: @Returns: @tgs: @Returns: @tgs: @tgtkt: @tgs: @Returns: @tgs: @tkt: @handle: @Returns: @handle: @Returns: @handle: @realm: @server: @tkt: @Returns: @handle: @Returns: @handle: @ticket: @key: @encticketpart: @Returns: @handle: @ticket: @key: @encticketpart: @Returns: @handle: @ticket: @etype: @Returns: @handle: @fh: @ticket: @Returns: @handle: @fh: @ticket: @Returns: @handle: @fh: @ticket: @Returns: @handle: @ticket: @realm: @realmlen: @Returns: @handle: @ticket: @realm: @Returns: @handle: @fh: @ticket: @Returns: @handle: @ticket: @server: @serverlen: @Returns: @handle: @ticket: @etype: @kvno: @buf: @buflen: @Returns: @handle: @ticket: @server: @Returns: @handle: @ticket: @name_type: @sname: @Returns: @handle: @ticket: @realm: @server: @Returns: @handle: @node: @field: @t: @Returns: @handle: @tkt: @Returns: @handle: @ticket: @enckdcreppart: @kdcrep: @Returns: @tkt: @Returns: @tkt: @authtime: @authtimelen: @Returns: @tkt: @key: @Returns: @tkt: @client: @clientlen: @Returns: @tkt: @client: @Returns: @tkt: @client: @clientlen: @Returns: @tkt: @client: @Returns: @tkt: @realm: @client: @Returns: @tkt: @key: @Returns: @tkt: @tkt: @Returns: @tkt: @enckdcreppart: @tkt: @Returns: @tkt: @encticketpart: @tkt: @Returns: @tkt: @endtime: @endtimelen: @Returns: @tkt: @Returns: @tkt: @flags: @Returns: @tkt: @flag: @Returns: @tkt: @flags: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @key: @Returns: @tkt: @etype: @Returns: @tkt: @Returns: @tkt: @etype: @Returns: @tkt: @lrtime: @lrtimelen: @lrtype: @Returns: @tkt: @fh: @tkt: @lrtype: @Returns: @tkt: @hint: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @fh: @tkt: @Returns: @tkt: @Returns: @tkt: @realm: @realmlen: @Returns: @tkt: @renewtilltime: @renewtilllen: @Returns: @tkt: @Returns: @tkt: @Returns: @tkt: @server: @serverlen: @Returns: @tkt: @server: @Returns: @tkt: @realm: @server: @Returns: @tkt: @Returns: @tkt: @starttime: @starttimelen: @Returns: @tkt: @Returns: @tkt: @ticket: @tkt: @Returns: @tkt: @now: @Returns: @tkt: @Returns: @handle: @tkts: @Returns: @tkts: @tkt: @Returns: @handle: @filename: @tkts: @Returns: @handle: @data: @len: @tkts: @Returns: @handle: @Returns: @handle: @Returns: @handle: @Returns: @handle: @ccache: @handle: @Returns: @handle: @Returns: @handle: @tktsfile: @tkts: @Returns: @tkts: @tkts: @Returns: @tkts: @hint: @Returns: @tkts: @client: @server: @Returns: @tkts: @server: @Returns: @handle: @filename: @outtkts: @Returns: @handle: @data: @len: @outtkts: @Returns: @tkts: @filename: @Returns: @tkts: @hint: @Returns: @tkts: @client: @server: @Returns: @tkts: @service: @passwd: @Returns: @tkts: @server: @Returns: @tkts: @hint: @tgt: @Returns: @tkts: @hint: @Returns: @tkts: @ticket: @enckdcreppart: @kdcrep: @Returns: @tkts: @ticketno: @Returns: @tkts: @fh: @Returns: @tkts: @fh: @service: @Returns: @tkts: @fh: @Returns: @tkts: @ticketno: @Returns: @tkts: @Returns: @tkts: @filename: @Returns: @tkts: @fh: @Returns: @handle: @format: @...: @handle: @key: @keyusage: @cksumtype: @in: @inlen: @cksum: @cksumlen: @Returns: @handle: @format: @...: @handle: @Returns: @handle: @Returns: @handle: @x509cafile: @handle: @Returns: @handle: @Returns: @handle: @x509certfile: @handle: @Returns: @handle: @Returns: @handle: @x509keyfile: @void: shishi-1.0.2/doc/reference/tmpl/shishi-unused.sgml0000644000000000000000000000000012126773323017017 00000000000000shishi-1.0.2/doc/reference/tmpl/low-crypto.sgml0000644000000000000000000000045412126773323016363 00000000000000 low-crypto shishi-1.0.2/doc/shishi.info-30000644000000000000000000033757212126773203012765 00000000000000This is shishi.info, produced by makeinfo version 4.13 from shishi.texi. This manual is last updated 3 April 2013 for version 1.0.2 of Shishi. Copyright (C) 2002-2013 Simon Josefsson. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION GNU utilities START-INFO-DIR-ENTRY * shishi: (shishi). A Kerberos 5 implementation END-INFO-DIR-ENTRY INFO-DIR-SECTION GNU Libraries START-INFO-DIR-ENTRY * libshishi: (shishi). Library implementing Kerberos 5. END-INFO-DIR-ENTRY  File: shishi.info, Node: GNU Free Documentation License, Up: Copying Information C.1 GNU Free Documentation License ================================== Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See `http://www.gnu.org/copyleft/'. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: shishi.info, Node: Function and Data Index, Next: Concept Index, Prev: Copying Information, Up: Top Function and Data Index *********************** [index] * Menu: * ago in date strings: Relative items in date strings. (line 23) * am in date strings: Time of day items. (line 22) * day in date strings: Relative items in date strings. (line 15) * first in date strings: General date syntax. (line 28) * fortnight in date strings: Relative items in date strings. (line 15) * hour in date strings: Relative items in date strings. (line 15) * last DAY: Day of week items. (line 15) * last in date strings: General date syntax. (line 28) * midnight in date strings: Time of day items. (line 22) * minute in date strings: Relative items in date strings. (line 15) * month in date strings: Relative items in date strings. (line 15) * next DAY: Day of week items. (line 15) * next in date strings: General date syntax. (line 28) * noon in date strings: Time of day items. (line 22) * now in date strings: Relative items in date strings. (line 33) * parse_datetime: Date input formats. (line 6) * pm in date strings: Time of day items. (line 22) * shisa: Kerberos Database Functions. (line 69) * shisa_cfg: Kerberos Database Functions. (line 143) * shisa_cfg_db: Kerberos Database Functions. (line 126) * shisa_cfg_default_systemfile: Kerberos Database Functions. (line 167) * shisa_cfg_from_file: Kerberos Database Functions. (line 155) * shisa_done: Kerberos Database Functions. (line 78) * shisa_enumerate_principals: Kerberos Database Functions. (line 202) * shisa_enumerate_realms: Kerberos Database Functions. (line 184) * shisa_info: Kerberos Database Functions. (line 457) * shisa_init: Kerberos Database Functions. (line 85) * shisa_init_with_paths: Kerberos Database Functions. (line 103) * shisa_key_add: Kerberos Database Functions. (line 343) * shisa_key_free: Kerberos Database Functions. (line 417) * shisa_key_remove: Kerberos Database Functions. (line 394) * shisa_key_update: Kerberos Database Functions. (line 362) * shisa_keys_find: Kerberos Database Functions. (line 314) * shisa_keys_free: Kerberos Database Functions. (line 429) * shisa_principal_add: Kerberos Database Functions. (line 271) * shisa_principal_find: Kerberos Database Functions. (line 221) * shisa_principal_remove: Kerberos Database Functions. (line 295) * shisa_principal_update: Kerberos Database Functions. (line 242) * shisa_strerror: Kerberos Database Functions. (line 447) * shishi: Initialization Functions. (line 10) * shishi_3des: Cryptographic Functions. (line 1766) * shishi_aes_cts: Cryptographic Functions. (line 1787) * shishi_ap: AP-REQ and AP-REP Functions. (line 40) * shishi_ap_authenticator: AP-REQ and AP-REP Functions. (line 430) * shishi_ap_authenticator_cksumdata: AP-REQ and AP-REP Functions. (line 351) * shishi_ap_authenticator_cksumdata_set: AP-REQ and AP-REP Functions. (line 371) * shishi_ap_authenticator_cksumraw_set: AP-REQ and AP-REP Functions. (line 390) * shishi_ap_authenticator_cksumtype: AP-REQ and AP-REP Functions. (line 409) * shishi_ap_authenticator_cksumtype_set: AP-REQ and AP-REP Functions. (line 420) * shishi_ap_authenticator_set: AP-REQ and AP-REP Functions. (line 442) * shishi_ap_done: AP-REQ and AP-REP Functions. (line 88) * shishi_ap_encapreppart: AP-REQ and AP-REP Functions. (line 710) * shishi_ap_encapreppart_set: AP-REQ and AP-REP Functions. (line 722) * shishi_ap_etype: AP-REQ and AP-REP Functions. (line 59) * shishi_ap_etype_tktoptionsdata: AP-REQ and AP-REP Functions. (line 269) * shishi_ap_key: AP-REQ and AP-REP Functions. (line 577) * shishi_ap_nosubkey: AP-REQ and AP-REP Functions. (line 75) * shishi_ap_option2string: AP-REQ and AP-REP Functions. (line 733) * shishi_ap_rep: AP-REQ and AP-REP Functions. (line 588) * shishi_ap_rep_asn1: AP-REQ and AP-REP Functions. (line 654) * shishi_ap_rep_build: AP-REQ and AP-REP Functions. (line 642) * shishi_ap_rep_der: AP-REQ and AP-REP Functions. (line 610) * shishi_ap_rep_der_set: AP-REQ and AP-REP Functions. (line 627) * shishi_ap_rep_set: AP-REQ and AP-REP Functions. (line 599) * shishi_ap_rep_verify: AP-REQ and AP-REP Functions. (line 666) * shishi_ap_rep_verify_asn1: AP-REQ and AP-REP Functions. (line 696) * shishi_ap_rep_verify_der: AP-REQ and AP-REP Functions. (line 678) * shishi_ap_req: AP-REQ and AP-REP Functions. (line 452) * shishi_ap_req_asn1: AP-REQ and AP-REP Functions. (line 565) * shishi_ap_req_build: AP-REQ and AP-REP Functions. (line 507) * shishi_ap_req_decode: AP-REQ and AP-REP Functions. (line 518) * shishi_ap_req_der: AP-REQ and AP-REP Functions. (line 474) * shishi_ap_req_der_set: AP-REQ and AP-REP Functions. (line 492) * shishi_ap_req_process: AP-REQ and AP-REP Functions. (line 550) * shishi_ap_req_process_keyusage: AP-REQ and AP-REP Functions. (line 530) * shishi_ap_req_set: AP-REQ and AP-REP Functions. (line 463) * shishi_ap_set_tktoptions: AP-REQ and AP-REP Functions. (line 99) * shishi_ap_set_tktoptionsasn1usage: AP-REQ and AP-REP Functions. (line 164) * shishi_ap_set_tktoptionsdata: AP-REQ and AP-REP Functions. (line 115) * shishi_ap_set_tktoptionsraw: AP-REQ and AP-REP Functions. (line 137) * shishi_ap_string2option: AP-REQ and AP-REP Functions. (line 748) * shishi_ap_tkt: AP-REQ and AP-REP Functions. (line 329) * shishi_ap_tkt_set: AP-REQ and AP-REP Functions. (line 340) * shishi_ap_tktoptions: AP-REQ and AP-REP Functions. (line 191) * shishi_ap_tktoptionsasn1usage: AP-REQ and AP-REP Functions. (line 298) * shishi_ap_tktoptionsdata: AP-REQ and AP-REP Functions. (line 213) * shishi_ap_tktoptionsraw: AP-REQ and AP-REP Functions. (line 239) * shishi_aprep: AP-REQ and AP-REP Functions. (line 1050) * shishi_aprep_from_file: AP-REQ and AP-REP Functions. (line 1142) * shishi_aprep_get_enc_part_etype: AP-REQ and AP-REP Functions. (line 1160) * shishi_aprep_parse: AP-REQ and AP-REP Functions. (line 1111) * shishi_aprep_print: AP-REQ and AP-REP Functions. (line 1062) * shishi_aprep_read: AP-REQ and AP-REP Functions. (line 1127) * shishi_aprep_save: AP-REQ and AP-REP Functions. (line 1077) * shishi_aprep_to_file: AP-REQ and AP-REP Functions. (line 1092) * shishi_apreq: AP-REQ and AP-REP Functions. (line 760) * shishi_apreq_add_authenticator: AP-REQ and AP-REP Functions. (line 897) * shishi_apreq_from_file: AP-REQ and AP-REP Functions. (line 852) * shishi_apreq_get_authenticator_etype: AP-REQ and AP-REP Functions. (line 1021) * shishi_apreq_get_ticket: AP-REQ and AP-REP Functions. (line 1036) * shishi_apreq_mutual_required_p: AP-REQ and AP-REP Functions. (line 961) * shishi_apreq_options: AP-REQ and AP-REP Functions. (line 933) * shishi_apreq_options_add: AP-REQ and AP-REP Functions. (line 989) * shishi_apreq_options_remove: AP-REQ and AP-REP Functions. (line 1005) * shishi_apreq_options_set: AP-REQ and AP-REP Functions. (line 974) * shishi_apreq_parse: AP-REQ and AP-REP Functions. (line 821) * shishi_apreq_print: AP-REQ and AP-REP Functions. (line 772) * shishi_apreq_read: AP-REQ and AP-REP Functions. (line 837) * shishi_apreq_save: AP-REQ and AP-REP Functions. (line 787) * shishi_apreq_set_authenticator: AP-REQ and AP-REP Functions. (line 871) * shishi_apreq_set_ticket: AP-REQ and AP-REP Functions. (line 918) * shishi_apreq_to_file: AP-REQ and AP-REP Functions. (line 802) * shishi_apreq_use_session_key_p: AP-REQ and AP-REP Functions. (line 948) * shishi_arcfour: Cryptographic Functions. (line 1715) * shishi_as: AS Functions. (line 81) * shishi_as_check_cname: AS/TGS Functions. (line 167) * shishi_as_check_crealm: AS/TGS Functions. (line 134) * shishi_as_derive_salt: AS/TGS Functions. (line 96) * shishi_as_done: AS Functions. (line 93) * shishi_as_krberror: AS Functions. (line 248) * shishi_as_krberror_der: AS Functions. (line 260) * shishi_as_krberror_set: AS Functions. (line 276) * shishi_as_process: AS/TGS Functions. (line 249) * shishi_as_rep: AS Functions. (line 166) * shishi_as_rep_build: AS Functions. (line 194) * shishi_as_rep_der: AS Functions. (line 207) * shishi_as_rep_der_set: AS Functions. (line 233) * shishi_as_rep_process: AS Functions. (line 178) * shishi_as_rep_set: AS Functions. (line 222) * shishi_as_req: AS Functions. (line 103) * shishi_as_req_build: AS Functions. (line 114) * shishi_as_req_der: AS Functions. (line 135) * shishi_as_req_der_set: AS Functions. (line 151) * shishi_as_req_set: AS Functions. (line 124) * shishi_as_sendrecv: AS Functions. (line 324) * shishi_as_sendrecv_hint: AS Functions. (line 308) * shishi_as_tkt: AS Functions. (line 286) * shishi_as_tkt_set: AS Functions. (line 297) * shishi_asn1_aprep: ASN.1 Functions. (line 210) * shishi_asn1_apreq: ASN.1 Functions. (line 200) * shishi_asn1_asrep: ASN.1 Functions. (line 170) * shishi_asn1_asreq: ASN.1 Functions. (line 160) * shishi_asn1_authenticator: ASN.1 Functions. (line 250) * shishi_asn1_done: ASN.1 Functions. (line 89) * shishi_asn1_encapreppart: ASN.1 Functions. (line 220) * shishi_asn1_encasreppart: ASN.1 Functions. (line 270) * shishi_asn1_enckdcreppart: ASN.1 Functions. (line 260) * shishi_asn1_encprivpart: ASN.1 Functions. (line 310) * shishi_asn1_encrypteddata: ASN.1 Functions. (line 110) * shishi_asn1_encticketpart: ASN.1 Functions. (line 240) * shishi_asn1_etype_info: ASN.1 Functions. (line 140) * shishi_asn1_etype_info2: ASN.1 Functions. (line 150) * shishi_asn1_krberror: ASN.1 Functions. (line 280) * shishi_asn1_krbsafe: ASN.1 Functions. (line 290) * shishi_asn1_methoddata: ASN.1 Functions. (line 130) * shishi_asn1_msgtype: ASN.1 Functions. (line 363) * shishi_asn1_pa_enc_ts_enc: ASN.1 Functions. (line 100) * shishi_asn1_padata: ASN.1 Functions. (line 120) * shishi_asn1_print: ASN.1 Functions. (line 755) * shishi_asn1_priv: ASN.1 Functions. (line 300) * shishi_asn1_read: ASN.1 Functions. (line 38) * shishi_asn1_read_inline: ASN.1 Functions. (line 11) * shishi_asn1_read_optional: ASN.1 Functions. (line 64) * shishi_asn1_tgsrep: ASN.1 Functions. (line 190) * shishi_asn1_tgsreq: ASN.1 Functions. (line 180) * shishi_asn1_ticket: ASN.1 Functions. (line 230) * shishi_asn1_to_der: ASN.1 Functions. (line 344) * shishi_asn1_to_der_field: ASN.1 Functions. (line 322) * shishi_asrep: AS/TGS Functions. (line 1060) * shishi_asreq: AS/TGS Functions. (line 306) * shishi_asreq_clientrealm: AS/TGS Functions. (line 483) * shishi_authenticator: Authenticator Functions. (line 28) * shishi_authenticator_add_authorizationdata: Authenticator Functions. (line 481) * shishi_authenticator_add_cksum: Authenticator Functions. (line 419) * shishi_authenticator_add_cksum_type: Authenticator Functions. (line 442) * shishi_authenticator_add_random_subkey: Authenticator Functions. (line 582) * shishi_authenticator_add_random_subkey_etype: Authenticator Functions. (line 597) * shishi_authenticator_add_subkey: Authenticator Functions. (line 614) * shishi_authenticator_authorizationdata: Authenticator Functions. (line 502) * shishi_authenticator_cksum: Authenticator Functions. (line 369) * shishi_authenticator_clear_authorizationdata: Authenticator Functions. (line 466) * shishi_authenticator_client: Authenticator Functions. (line 320) * shishi_authenticator_client_set: Authenticator Functions. (line 192) * shishi_authenticator_clientrealm: Authenticator Functions. (line 343) * shishi_authenticator_ctime: Authenticator Functions. (line 208) * shishi_authenticator_ctime_set: Authenticator Functions. (line 225) * shishi_authenticator_cusec_get: Authenticator Functions. (line 241) * shishi_authenticator_cusec_set: Authenticator Functions. (line 257) * shishi_authenticator_from_file: Authenticator Functions. (line 138) * shishi_authenticator_get_subkey: Authenticator Functions. (line 540) * shishi_authenticator_parse: Authenticator Functions. (line 105) * shishi_authenticator_print: Authenticator Functions. (line 53) * shishi_authenticator_read: Authenticator Functions. (line 121) * shishi_authenticator_remove_subkey: Authenticator Functions. (line 526) * shishi_authenticator_save: Authenticator Functions. (line 69) * shishi_authenticator_seqnumber_get: Authenticator Functions. (line 273) * shishi_authenticator_seqnumber_remove: Authenticator Functions. (line 289) * shishi_authenticator_seqnumber_set: Authenticator Functions. (line 303) * shishi_authenticator_set_cksum: Authenticator Functions. (line 393) * shishi_authenticator_set_cname: Authenticator Functions. (line 173) * shishi_authenticator_set_crealm: Authenticator Functions. (line 156) * shishi_authenticator_set_subkey: Authenticator Functions. (line 558) * shishi_authenticator_subkey: Authenticator Functions. (line 40) * shishi_authenticator_to_file: Authenticator Functions. (line 86) * shishi_authorization_parse: Utility Functions. (line 338) * shishi_authorize_k5login: Utility Functions. (line 321) * shishi_authorize_strcmp: Utility Functions. (line 304) * shishi_authorized_p: Utility Functions. (line 350) * shishi_cfg: Initialization Functions. (line 132) * shishi_cfg_authorizationtype_set: Initialization Functions. (line 265) * shishi_cfg_clientkdcetype: Initialization Functions. (line 225) * shishi_cfg_clientkdcetype_fast: Initialization Functions. (line 238) * shishi_cfg_clientkdcetype_set: Initialization Functions. (line 249) * shishi_cfg_default_systemfile: Initialization Functions. (line 170) * shishi_cfg_default_userdirectory: Initialization Functions. (line 182) * shishi_cfg_default_userfile: Initialization Functions. (line 213) * shishi_cfg_from_file: Initialization Functions. (line 145) * shishi_cfg_print: Initialization Functions. (line 157) * shishi_cfg_userdirectory_file: Initialization Functions. (line 197) * shishi_check_version: Version Check. (line 17) * shishi_checksum: Cryptographic Functions. (line 842) * shishi_checksum_cksumlen: Cryptographic Functions. (line 766) * shishi_checksum_name: Cryptographic Functions. (line 755) * shishi_checksum_parse: Cryptographic Functions. (line 777) * shishi_checksum_supported_p: Cryptographic Functions. (line 745) * shishi_cipher_blocksize: Cryptographic Functions. (line 678) * shishi_cipher_confoundersize: Cryptographic Functions. (line 689) * shishi_cipher_defaultcksumtype: Cryptographic Functions. (line 724) * shishi_cipher_keylen: Cryptographic Functions. (line 701) * shishi_cipher_name: Cryptographic Functions. (line 667) * shishi_cipher_parse: Cryptographic Functions. (line 735) * shishi_cipher_randomlen: Cryptographic Functions. (line 712) * shishi_cipher_supported_p: Cryptographic Functions. (line 657) * shishi_crc: Cryptographic Functions. (line 1603) * shishi_crypto: Cryptographic Functions. (line 1490) * shishi_crypto_close: Cryptographic Functions. (line 1570) * shishi_crypto_decrypt: Cryptographic Functions. (line 1546) * shishi_crypto_encrypt: Cryptographic Functions. (line 1521) * shishi_ctime: Utility Functions. (line 427) * shishi_decrypt: Cryptographic Functions. (line 1376) * shishi_decrypt_etype: Cryptographic Functions. (line 1248) * shishi_decrypt_iv: Cryptographic Functions. (line 1335) * shishi_decrypt_iv_etype: Cryptographic Functions. (line 1205) * shishi_decrypt_ivupdate: Cryptographic Functions. (line 1289) * shishi_decrypt_ivupdate_etype: Cryptographic Functions. (line 1156) * shishi_der2asn1: ASN.1 Functions. (line 393) * shishi_der2asn1_aprep: ASN.1 Functions. (line 709) * shishi_der2asn1_apreq: ASN.1 Functions. (line 694) * shishi_der2asn1_asrep: ASN.1 Functions. (line 529) * shishi_der2asn1_asreq: ASN.1 Functions. (line 499) * shishi_der2asn1_authenticator: ASN.1 Functions. (line 619) * shishi_der2asn1_encapreppart: ASN.1 Functions. (line 724) * shishi_der2asn1_encasreppart: ASN.1 Functions. (line 574) * shishi_der2asn1_enckdcreppart: ASN.1 Functions. (line 604) * shishi_der2asn1_encprivpart: ASN.1 Functions. (line 679) * shishi_der2asn1_enctgsreppart: ASN.1 Functions. (line 589) * shishi_der2asn1_encticketpart: ASN.1 Functions. (line 484) * shishi_der2asn1_etype_info: ASN.1 Functions. (line 439) * shishi_der2asn1_etype_info2: ASN.1 Functions. (line 454) * shishi_der2asn1_kdcrep: ASN.1 Functions. (line 559) * shishi_der2asn1_kdcreq: ASN.1 Functions. (line 739) * shishi_der2asn1_krberror: ASN.1 Functions. (line 634) * shishi_der2asn1_krbsafe: ASN.1 Functions. (line 649) * shishi_der2asn1_methoddata: ASN.1 Functions. (line 424) * shishi_der2asn1_padata: ASN.1 Functions. (line 409) * shishi_der2asn1_priv: ASN.1 Functions. (line 664) * shishi_der2asn1_tgsrep: ASN.1 Functions. (line 544) * shishi_der2asn1_tgsreq: ASN.1 Functions. (line 514) * shishi_der2asn1_ticket: ASN.1 Functions. (line 469) * shishi_der_msgtype: ASN.1 Functions. (line 378) * shishi_derive_default_salt: Utility Functions. (line 272) * shishi_des: Cryptographic Functions. (line 1745) * shishi_des_cbc_mac: Cryptographic Functions. (line 1698) * shishi_dk: Cryptographic Functions. (line 1463) * shishi_done: Initialization Functions. (line 32) * shishi_dr: Cryptographic Functions. (line 1439) * shishi_encapreppart: AP-REQ and AP-REP Functions. (line 1174) * shishi_encapreppart_ctime: AP-REQ and AP-REP Functions. (line 1302) * shishi_encapreppart_ctime_set: AP-REQ and AP-REP Functions. (line 1318) * shishi_encapreppart_cusec_get: AP-REQ and AP-REP Functions. (line 1333) * shishi_encapreppart_cusec_set: AP-REQ and AP-REP Functions. (line 1348) * shishi_encapreppart_from_file: AP-REQ and AP-REP Functions. (line 1269) * shishi_encapreppart_get_key: AP-REQ and AP-REP Functions. (line 1287) * shishi_encapreppart_parse: AP-REQ and AP-REP Functions. (line 1236) * shishi_encapreppart_print: AP-REQ and AP-REP Functions. (line 1187) * shishi_encapreppart_read: AP-REQ and AP-REP Functions. (line 1252) * shishi_encapreppart_save: AP-REQ and AP-REP Functions. (line 1202) * shishi_encapreppart_seqnumber_get: AP-REQ and AP-REP Functions. (line 1363) * shishi_encapreppart_seqnumber_remove: AP-REQ and AP-REP Functions. (line 1378) * shishi_encapreppart_seqnumber_set: AP-REQ and AP-REP Functions. (line 1391) * shishi_encapreppart_time_copy: AP-REQ and AP-REP Functions. (line 1407) * shishi_encapreppart_to_file: AP-REQ and AP-REP Functions. (line 1217) * shishi_enckdcreppart_authtime_set: AS/TGS Functions. (line 1399) * shishi_enckdcreppart_endtime_set: AS/TGS Functions. (line 1430) * shishi_enckdcreppart_flags_set: AS/TGS Functions. (line 1384) * shishi_enckdcreppart_get_key: AS/TGS Functions. (line 1337) * shishi_enckdcreppart_key_set: AS/TGS Functions. (line 1353) * shishi_enckdcreppart_nonce_set: AS/TGS Functions. (line 1369) * shishi_enckdcreppart_populate_encticketpart: AS/TGS Functions. (line 1495) * shishi_enckdcreppart_renew_till_set: AS/TGS Functions. (line 1445) * shishi_enckdcreppart_sname_set: AS/TGS Functions. (line 1477) * shishi_enckdcreppart_srealm_set: AS/TGS Functions. (line 1461) * shishi_enckdcreppart_starttime_set: AS/TGS Functions. (line 1414) * shishi_encprivpart_set_user_data: SAFE and PRIV Functions. (line 678) * shishi_encprivpart_user_data: SAFE and PRIV Functions. (line 657) * shishi_encrypt: Cryptographic Functions. (line 1118) * shishi_encrypt_etype: Cryptographic Functions. (line 990) * shishi_encrypt_iv: Cryptographic Functions. (line 1077) * shishi_encrypt_iv_etype: Cryptographic Functions. (line 947) * shishi_encrypt_ivupdate: Cryptographic Functions. (line 1031) * shishi_encrypt_ivupdate_etype: Cryptographic Functions. (line 898) * shishi_encticketpart_authtime_set: Ticket (ASN.1) Functions. (line 281) * shishi_encticketpart_client: Ticket (ASN.1) Functions. (line 311) * shishi_encticketpart_clientrealm: Ticket (ASN.1) Functions. (line 334) * shishi_encticketpart_cname_set: Ticket (ASN.1) Functions. (line 242) * shishi_encticketpart_crealm_set: Ticket (ASN.1) Functions. (line 226) * shishi_encticketpart_endtime_set: Ticket (ASN.1) Functions. (line 296) * shishi_encticketpart_flags_set: Ticket (ASN.1) Functions. (line 211) * shishi_encticketpart_get_key: Ticket (ASN.1) Functions. (line 180) * shishi_encticketpart_key_set: Ticket (ASN.1) Functions. (line 195) * shishi_encticketpart_transited_set: Ticket (ASN.1) Functions. (line 261) * shishi_error: Error Functions. (line 22) * shishi_error_clear: Error Functions. (line 35) * shishi_error_outputtype: Error Functions. (line 79) * shishi_error_printf: Error Functions. (line 66) * shishi_error_set: Error Functions. (line 49) * shishi_error_set_outputtype: Error Functions. (line 91) * shishi_generalize_ctime: Utility Functions. (line 397) * shishi_generalize_now: Utility Functions. (line 384) * shishi_generalize_time: Utility Functions. (line 370) * shishi_hmac_md5: Cryptographic Functions. (line 1656) * shishi_hmac_sha1: Cryptographic Functions. (line 1677) * shishi_hostkeys_default_file: Cryptographic Functions. (line 560) * shishi_hostkeys_default_file_set: Cryptographic Functions. (line 572) * shishi_hostkeys_for_localservice: Cryptographic Functions. (line 638) * shishi_hostkeys_for_localservicerealm: Cryptographic Functions. (line 619) * shishi_hostkeys_for_server: Cryptographic Functions. (line 586) * shishi_hostkeys_for_serverrealm: Cryptographic Functions. (line 601) * shishi_info: Error Functions. (line 103) * shishi_init: Initialization Functions. (line 47) * shishi_init_server: Initialization Functions. (line 96) * shishi_init_server_with_paths: Initialization Functions. (line 114) * shishi_init_with_paths: Initialization Functions. (line 69) * shishi_kdc_check_nonce: AS/TGS Functions. (line 200) * shishi_kdc_copy_cname: AS/TGS Functions. (line 152) * shishi_kdc_copy_crealm: AS/TGS Functions. (line 119) * shishi_kdc_copy_nonce: AS/TGS Functions. (line 185) * shishi_kdc_process: AS/TGS Functions. (line 273) * shishi_kdcrep_add_enc_part: AS/TGS Functions. (line 1302) * shishi_kdcrep_clear_padata: AS/TGS Functions. (line 1324) * shishi_kdcrep_client_set: AS/TGS Functions. (line 1214) * shishi_kdcrep_cname_set: AS/TGS Functions. (line 1196) * shishi_kdcrep_crealm_set: AS/TGS Functions. (line 1181) * shishi_kdcrep_from_file: AS/TGS Functions. (line 1163) * shishi_kdcrep_get_enc_part_etype: AS/TGS Functions. (line 1230) * shishi_kdcrep_get_ticket: AS/TGS Functions. (line 1245) * shishi_kdcrep_parse: AS/TGS Functions. (line 1132) * shishi_kdcrep_print: AS/TGS Functions. (line 1083) * shishi_kdcrep_read: AS/TGS Functions. (line 1148) * shishi_kdcrep_save: AS/TGS Functions. (line 1098) * shishi_kdcrep_set_enc_part: AS/TGS Functions. (line 1276) * shishi_kdcrep_set_ticket: AS/TGS Functions. (line 1260) * shishi_kdcrep_to_file: AS/TGS Functions. (line 1113) * shishi_kdcreq_add_padata: AS/TGS Functions. (line 1005) * shishi_kdcreq_add_padata_preauth: AS/TGS Functions. (line 1046) * shishi_kdcreq_add_padata_tgs: AS/TGS Functions. (line 1028) * shishi_kdcreq_allow_postdate_p: AS/TGS Functions. (line 749) * shishi_kdcreq_clear_padata: AS/TGS Functions. (line 950) * shishi_kdcreq_client: AS/TGS Functions. (line 460) * shishi_kdcreq_disable_transited_check_p: AS/TGS Functions. (line 808) * shishi_kdcreq_enc_tkt_in_skey_p: AS/TGS Functions. (line 857) * shishi_kdcreq_etype: AS/TGS Functions. (line 622) * shishi_kdcreq_forwardable_p: AS/TGS Functions. (line 673) * shishi_kdcreq_forwarded_p: AS/TGS Functions. (line 692) * shishi_kdcreq_from_file: AS/TGS Functions. (line 409) * shishi_kdcreq_get_padata: AS/TGS Functions. (line 964) * shishi_kdcreq_get_padata_tgs: AS/TGS Functions. (line 986) * shishi_kdcreq_nonce_set: AS/TGS Functions. (line 427) * shishi_kdcreq_options: AS/TGS Functions. (line 658) * shishi_kdcreq_options_add: AS/TGS Functions. (line 935) * shishi_kdcreq_options_set: AS/TGS Functions. (line 919) * shishi_kdcreq_parse: AS/TGS Functions. (line 378) * shishi_kdcreq_postdated_p: AS/TGS Functions. (line 768) * shishi_kdcreq_print: AS/TGS Functions. (line 329) * shishi_kdcreq_proxiable_p: AS/TGS Functions. (line 712) * shishi_kdcreq_proxy_p: AS/TGS Functions. (line 730) * shishi_kdcreq_read: AS/TGS Functions. (line 394) * shishi_kdcreq_realm: AS/TGS Functions. (line 506) * shishi_kdcreq_renew_p: AS/TGS Functions. (line 876) * shishi_kdcreq_renewable_ok_p: AS/TGS Functions. (line 835) * shishi_kdcreq_renewable_p: AS/TGS Functions. (line 788) * shishi_kdcreq_save: AS/TGS Functions. (line 344) * shishi_kdcreq_server: AS/TGS Functions. (line 543) * shishi_kdcreq_set_cname: AS/TGS Functions. (line 442) * shishi_kdcreq_set_etype: AS/TGS Functions. (line 640) * shishi_kdcreq_set_realm: AS/TGS Functions. (line 528) * shishi_kdcreq_set_sname: AS/TGS Functions. (line 566) * shishi_kdcreq_till: AS/TGS Functions. (line 584) * shishi_kdcreq_tillc: AS/TGS Functions. (line 608) * shishi_kdcreq_to_file: AS/TGS Functions. (line 359) * shishi_kdcreq_validate_p: AS/TGS Functions. (line 897) * shishi_key: Cryptographic Functions. (line 195) * shishi_key_copy: Cryptographic Functions. (line 217) * shishi_key_done: Cryptographic Functions. (line 208) * shishi_key_from_base64: Cryptographic Functions. (line 248) * shishi_key_from_name: Cryptographic Functions. (line 341) * shishi_key_from_random: Cryptographic Functions. (line 287) * shishi_key_from_string: Cryptographic Functions. (line 311) * shishi_key_from_value: Cryptographic Functions. (line 228) * shishi_key_length: Cryptographic Functions. (line 185) * shishi_key_name: Cryptographic Functions. (line 175) * shishi_key_principal: Cryptographic Functions. (line 29) * shishi_key_principal_set: Cryptographic Functions. (line 42) * shishi_key_random: Cryptographic Functions. (line 269) * shishi_key_realm: Cryptographic Functions. (line 54) * shishi_key_realm_set: Cryptographic Functions. (line 66) * shishi_key_timestamp: Cryptographic Functions. (line 147) * shishi_key_timestamp_set: Cryptographic Functions. (line 162) * shishi_key_type: Cryptographic Functions. (line 78) * shishi_key_type_set: Cryptographic Functions. (line 89) * shishi_key_value: Cryptographic Functions. (line 99) * shishi_key_value_set: Cryptographic Functions. (line 111) * shishi_key_version: Cryptographic Functions. (line 124) * shishi_key_version_set: Cryptographic Functions. (line 136) * shishi_keys: Cryptographic Functions. (line 375) * shishi_keys_add: Cryptographic Functions. (line 433) * shishi_keys_done: Cryptographic Functions. (line 387) * shishi_keys_for_localservicerealm_in_file: Cryptographic Functions. (line 533) * shishi_keys_for_server_in_file: Cryptographic Functions. (line 515) * shishi_keys_for_serverrealm_in_file: Cryptographic Functions. (line 495) * shishi_keys_from_file: Cryptographic Functions. (line 477) * shishi_keys_nth: Cryptographic Functions. (line 408) * shishi_keys_print: Cryptographic Functions. (line 447) * shishi_keys_remove: Cryptographic Functions. (line 422) * shishi_keys_size: Cryptographic Functions. (line 397) * shishi_keys_to_file: Cryptographic Functions. (line 460) * shishi_krberror: KRB-ERROR Functions. (line 33) * shishi_krberror_build: KRB-ERROR Functions. (line 143) * shishi_krberror_client: KRB-ERROR Functions. (line 220) * shishi_krberror_client_set: KRB-ERROR Functions. (line 272) * shishi_krberror_crealm: KRB-ERROR Functions. (line 174) * shishi_krberror_ctime: KRB-ERROR Functions. (line 391) * shishi_krberror_ctime_set: KRB-ERROR Functions. (line 406) * shishi_krberror_cusec: KRB-ERROR Functions. (line 434) * shishi_krberror_cusec_set: KRB-ERROR Functions. (line 449) * shishi_krberror_der: KRB-ERROR Functions. (line 157) * shishi_krberror_edata: KRB-ERROR Functions. (line 626) * shishi_krberror_errorcode: KRB-ERROR Functions. (line 537) * shishi_krberror_errorcode_fast: KRB-ERROR Functions. (line 552) * shishi_krberror_errorcode_message: KRB-ERROR Functions. (line 704) * shishi_krberror_errorcode_set: KRB-ERROR Functions. (line 566) * shishi_krberror_etext: KRB-ERROR Functions. (line 581) * shishi_krberror_from_file: KRB-ERROR Functions. (line 125) * shishi_krberror_message: KRB-ERROR Functions. (line 719) * shishi_krberror_methoddata: KRB-ERROR Functions. (line 643) * shishi_krberror_parse: KRB-ERROR Functions. (line 94) * shishi_krberror_pretty_print: KRB-ERROR Functions. (line 688) * shishi_krberror_print: KRB-ERROR Functions. (line 45) * shishi_krberror_read: KRB-ERROR Functions. (line 110) * shishi_krberror_realm: KRB-ERROR Functions. (line 288) * shishi_krberror_remove_cname: KRB-ERROR Functions. (line 259) * shishi_krberror_remove_crealm: KRB-ERROR Functions. (line 192) * shishi_krberror_remove_ctime: KRB-ERROR Functions. (line 421) * shishi_krberror_remove_cusec: KRB-ERROR Functions. (line 464) * shishi_krberror_remove_edata: KRB-ERROR Functions. (line 675) * shishi_krberror_remove_etext: KRB-ERROR Functions. (line 613) * shishi_krberror_remove_sname: KRB-ERROR Functions. (line 341) * shishi_krberror_save: KRB-ERROR Functions. (line 60) * shishi_krberror_server: KRB-ERROR Functions. (line 321) * shishi_krberror_server_set: KRB-ERROR Functions. (line 375) * shishi_krberror_set_cname: KRB-ERROR Functions. (line 241) * shishi_krberror_set_crealm: KRB-ERROR Functions. (line 205) * shishi_krberror_set_edata: KRB-ERROR Functions. (line 660) * shishi_krberror_set_etext: KRB-ERROR Functions. (line 598) * shishi_krberror_set_realm: KRB-ERROR Functions. (line 306) * shishi_krberror_set_sname: KRB-ERROR Functions. (line 357) * shishi_krberror_stime: KRB-ERROR Functions. (line 477) * shishi_krberror_stime_set: KRB-ERROR Functions. (line 492) * shishi_krberror_susec: KRB-ERROR Functions. (line 507) * shishi_krberror_susec_set: KRB-ERROR Functions. (line 522) * shishi_krberror_to_file: KRB-ERROR Functions. (line 75) * shishi_md4: Cryptographic Functions. (line 1623) * shishi_md5: Cryptographic Functions. (line 1639) * shishi_n_fold: Cryptographic Functions. (line 1412) * shishi_parse_name: Utility Functions. (line 154) * shishi_pbkdf2_sha1: Cryptographic Functions. (line 1814) * shishi_principal_default: Utility Functions. (line 126) * shishi_principal_default_guess: Utility Functions. (line 115) * shishi_principal_default_set: Utility Functions. (line 140) * shishi_principal_name: Utility Functions. (line 178) * shishi_principal_name_realm: Utility Functions. (line 204) * shishi_principal_name_set: Utility Functions. (line 235) * shishi_principal_set: Utility Functions. (line 255) * shishi_priv: SAFE and PRIV Functions. (line 364) * shishi_priv_build: SAFE and PRIV Functions. (line 695) * shishi_priv_done: SAFE and PRIV Functions. (line 377) * shishi_priv_enc_part_etype: SAFE and PRIV Functions. (line 617) * shishi_priv_encprivpart: SAFE and PRIV Functions. (line 464) * shishi_priv_encprivpart_der: SAFE and PRIV Functions. (line 487) * shishi_priv_encprivpart_der_set: SAFE and PRIV Functions. (line 503) * shishi_priv_encprivpart_set: SAFE and PRIV Functions. (line 476) * shishi_priv_from_file: SAFE and PRIV Functions. (line 599) * shishi_priv_key: SAFE and PRIV Functions. (line 387) * shishi_priv_key_set: SAFE and PRIV Functions. (line 399) * shishi_priv_parse: SAFE and PRIV Functions. (line 568) * shishi_priv_print: SAFE and PRIV Functions. (line 519) * shishi_priv_priv: SAFE and PRIV Functions. (line 409) * shishi_priv_priv_der: SAFE and PRIV Functions. (line 432) * shishi_priv_priv_der_set: SAFE and PRIV Functions. (line 449) * shishi_priv_priv_set: SAFE and PRIV Functions. (line 421) * shishi_priv_process: SAFE and PRIV Functions. (line 710) * shishi_priv_read: SAFE and PRIV Functions. (line 584) * shishi_priv_save: SAFE and PRIV Functions. (line 534) * shishi_priv_set_enc_part: SAFE and PRIV Functions. (line 633) * shishi_priv_to_file: SAFE and PRIV Functions. (line 549) * shishi_prompt_password: Utility Functions. (line 484) * shishi_prompt_password_callback_get: Utility Functions. (line 471) * shishi_prompt_password_callback_set: Utility Functions. (line 447) * shishi_random_to_key: Cryptographic Functions. (line 821) * shishi_randomize: Cryptographic Functions. (line 1584) * shishi_realm_default: Utility Functions. (line 24) * shishi_realm_default_guess: Utility Functions. (line 10) * shishi_realm_default_set: Utility Functions. (line 36) * shishi_realm_for_server: Utility Functions. (line 100) * shishi_realm_for_server_dns: Utility Functions. (line 63) * shishi_realm_for_server_file: Utility Functions. (line 50) * shishi_resolv: Utility Functions. (line 503) * shishi_resolv_free: Utility Functions. (line 517) * shishi_safe: SAFE and PRIV Functions. (line 32) * shishi_safe_build: SAFE and PRIV Functions. (line 311) * shishi_safe_cksum: SAFE and PRIV Functions. (line 231) * shishi_safe_done: SAFE and PRIV Functions. (line 45) * shishi_safe_from_file: SAFE and PRIV Functions. (line 213) * shishi_safe_key: SAFE and PRIV Functions. (line 55) * shishi_safe_key_set: SAFE and PRIV Functions. (line 67) * shishi_safe_parse: SAFE and PRIV Functions. (line 182) * shishi_safe_print: SAFE and PRIV Functions. (line 133) * shishi_safe_read: SAFE and PRIV Functions. (line 198) * shishi_safe_safe: SAFE and PRIV Functions. (line 77) * shishi_safe_safe_der: SAFE and PRIV Functions. (line 100) * shishi_safe_safe_der_set: SAFE and PRIV Functions. (line 117) * shishi_safe_safe_set: SAFE and PRIV Functions. (line 89) * shishi_safe_save: SAFE and PRIV Functions. (line 148) * shishi_safe_set_cksum: SAFE and PRIV Functions. (line 251) * shishi_safe_set_user_data: SAFE and PRIV Functions. (line 294) * shishi_safe_to_file: SAFE and PRIV Functions. (line 163) * shishi_safe_user_data: SAFE and PRIV Functions. (line 274) * shishi_safe_verify: SAFE and PRIV Functions. (line 326) * shishi_server: Initialization Functions. (line 21) * shishi_server_for_local_service: Utility Functions. (line 288) * shishi_strerror: Error Functions. (line 10) * shishi_string_to_key: Cryptographic Functions. (line 791) * shishi_tgs: TGS Functions. (line 83) * shishi_tgs_ap: TGS Functions. (line 127) * shishi_tgs_done: TGS Functions. (line 95) * shishi_tgs_krberror: TGS Functions. (line 267) * shishi_tgs_krberror_der: TGS Functions. (line 279) * shishi_tgs_krberror_set: TGS Functions. (line 295) * shishi_tgs_process: AS/TGS Functions. (line 221) * shishi_tgs_rep: TGS Functions. (line 214) * shishi_tgs_rep_build: TGS Functions. (line 253) * shishi_tgs_rep_der: TGS Functions. (line 226) * shishi_tgs_rep_process: TGS Functions. (line 241) * shishi_tgs_req: TGS Functions. (line 138) * shishi_tgs_req_build: TGS Functions. (line 203) * shishi_tgs_req_der: TGS Functions. (line 161) * shishi_tgs_req_der_set: TGS Functions. (line 177) * shishi_tgs_req_process: TGS Functions. (line 192) * shishi_tgs_req_set: TGS Functions. (line 150) * shishi_tgs_sendrecv: TGS Functions. (line 344) * shishi_tgs_sendrecv_hint: TGS Functions. (line 328) * shishi_tgs_set_realm: TGS Functions. (line 369) * shishi_tgs_set_realmserver: TGS Functions. (line 382) * shishi_tgs_set_server: TGS Functions. (line 356) * shishi_tgs_tgtkt: TGS Functions. (line 105) * shishi_tgs_tgtkt_set: TGS Functions. (line 117) * shishi_tgs_tkt: TGS Functions. (line 305) * shishi_tgs_tkt_set: TGS Functions. (line 317) * shishi_tgsrep: AS/TGS Functions. (line 1071) * shishi_tgsreq: AS/TGS Functions. (line 317) * shishi_ticket: Ticket (ASN.1) Functions. (line 35) * shishi_ticket_add_enc_part: Ticket (ASN.1) Functions. (line 162) * shishi_ticket_get_enc_part_etype: Ticket (ASN.1) Functions. (line 120) * shishi_ticket_realm_get: Ticket (ASN.1) Functions. (line 47) * shishi_ticket_realm_set: Ticket (ASN.1) Functions. (line 64) * shishi_ticket_server: Ticket (ASN.1) Functions. (line 79) * shishi_ticket_set_enc_part: Ticket (ASN.1) Functions. (line 136) * shishi_ticket_sname_set: Ticket (ASN.1) Functions. (line 102) * shishi_time: Utility Functions. (line 410) * shishi_tkt: Ticket Functions. (line 17) * shishi_tkt2: Ticket Functions. (line 30) * shishi_tkt_authctime: Ticket Functions. (line 634) * shishi_tkt_client: Ticket Functions. (line 155) * shishi_tkt_client_p: Ticket Functions. (line 177) * shishi_tkt_clientrealm: Ticket Functions. (line 190) * shishi_tkt_clientrealm_p: Ticket Functions. (line 211) * shishi_tkt_done: Ticket Functions. (line 46) * shishi_tkt_enckdcreppart: Ticket Functions. (line 76) * shishi_tkt_enckdcreppart_set: Ticket Functions. (line 87) * shishi_tkt_encticketpart: Ticket Functions. (line 107) * shishi_tkt_encticketpart_set: Ticket Functions. (line 118) * shishi_tkt_endctime: Ticket Functions. (line 660) * shishi_tkt_expired_p: Ticket Functions. (line 709) * shishi_tkt_flags: Ticket Functions. (line 274) * shishi_tkt_flags_add: Ticket Functions. (line 300) * shishi_tkt_flags_set: Ticket Functions. (line 287) * shishi_tkt_forwardable_p: Ticket Functions. (line 313) * shishi_tkt_forwarded_p: Ticket Functions. (line 333) * shishi_tkt_hw_authent_p: Ticket Functions. (line 502) * shishi_tkt_initial_p: Ticket Functions. (line 466) * shishi_tkt_invalid_p: Ticket Functions. (line 430) * shishi_tkt_kdcrep: Ticket Functions. (line 97) * shishi_tkt_key: Ticket Functions. (line 128) * shishi_tkt_key_set: Ticket Functions. (line 142) * shishi_tkt_keytype: Ticket Functions. (line 581) * shishi_tkt_keytype_fast: Ticket Functions. (line 593) * shishi_tkt_keytype_p: Ticket Functions. (line 604) * shishi_tkt_lastreq_pretty_print: Ticket Functions. (line 720) * shishi_tkt_lastreqc: Ticket Functions. (line 619) * shishi_tkt_match_p: Ticket Set Functions. (line 256) * shishi_tkt_may_postdate_p: Ticket Functions. (line 385) * shishi_tkt_ok_as_delegate_p: Ticket Functions. (line 558) * shishi_tkt_postdated_p: Ticket Functions. (line 411) * shishi_tkt_pre_authent_p: Ticket Functions. (line 484) * shishi_tkt_pretty_print: Ticket Functions. (line 731) * shishi_tkt_proxiable_p: Ticket Functions. (line 351) * shishi_tkt_proxy_p: Ticket Functions. (line 370) * shishi_tkt_realm: Ticket Functions. (line 225) * shishi_tkt_renew_tillc: Ticket Functions. (line 672) * shishi_tkt_renewable_p: Ticket Functions. (line 450) * shishi_tkt_server: Ticket Functions. (line 241) * shishi_tkt_server_p: Ticket Functions. (line 262) * shishi_tkt_startctime: Ticket Functions. (line 647) * shishi_tkt_ticket: Ticket Functions. (line 55) * shishi_tkt_ticket_set: Ticket Functions. (line 66) * shishi_tkt_transited_policy_checked_p: Ticket Functions. (line 520) * shishi_tkt_valid_at_time_p: Ticket Functions. (line 685) * shishi_tkt_valid_now_p: Ticket Functions. (line 698) * shishi_tkts: Ticket Set Functions. (line 70) * shishi_tkts_add: Ticket Set Functions. (line 132) * shishi_tkts_default: Ticket Set Functions. (line 60) * shishi_tkts_default_file: Ticket Set Functions. (line 34) * shishi_tkts_default_file_guess: Ticket Set Functions. (line 22) * shishi_tkts_default_file_set: Ticket Set Functions. (line 47) * shishi_tkts_done: Ticket Set Functions. (line 82) * shishi_tkts_expire: Ticket Set Functions. (line 204) * shishi_tkts_find: Ticket Set Functions. (line 269) * shishi_tkts_find_for_clientserver: Ticket Set Functions. (line 310) * shishi_tkts_find_for_server: Ticket Set Functions. (line 326) * shishi_tkts_from_file: Ticket Set Functions. (line 180) * shishi_tkts_get: Ticket Set Functions. (line 383) * shishi_tkts_get_for_clientserver: Ticket Set Functions. (line 403) * shishi_tkts_get_for_localservicepasswd: Ticket Set Functions. (line 434) * shishi_tkts_get_for_server: Ticket Set Functions. (line 419) * shishi_tkts_get_tgs: Ticket Set Functions. (line 363) * shishi_tkts_get_tgt: Ticket Set Functions. (line 341) * shishi_tkts_new: Ticket Set Functions. (line 147) * shishi_tkts_nth: Ticket Set Functions. (line 103) * shishi_tkts_print: Ticket Set Functions. (line 243) * shishi_tkts_print_for_service: Ticket Set Functions. (line 228) * shishi_tkts_read: Ticket Set Functions. (line 167) * shishi_tkts_remove: Ticket Set Functions. (line 118) * shishi_tkts_size: Ticket Set Functions. (line 92) * shishi_tkts_to_file: Ticket Set Functions. (line 215) * shishi_tkts_write: Ticket Set Functions. (line 192) * shishi_verbose: Error Functions. (line 125) * shishi_verify: Cryptographic Functions. (line 870) * shishi_warn: Error Functions. (line 114) * shishi_x509ca_default_file: X.509 Functions. (line 41) * shishi_x509ca_default_file_guess: X.509 Functions. (line 13) * shishi_x509ca_default_file_set: X.509 Functions. (line 26) * shishi_x509cert_default_file: X.509 Functions. (line 84) * shishi_x509cert_default_file_guess: X.509 Functions. (line 55) * shishi_x509cert_default_file_set: X.509 Functions. (line 68) * shishi_x509key_default_file: X.509 Functions. (line 124) * shishi_x509key_default_file_guess: X.509 Functions. (line 97) * shishi_x509key_default_file_set: X.509 Functions. (line 110) * this in date strings: Relative items in date strings. (line 33) * today in date strings: Relative items in date strings. (line 33) * tomorrow in date strings: Relative items in date strings. (line 29) * week in date strings: Relative items in date strings. (line 15) * year in date strings: Relative items in date strings. (line 15) * yesterday in date strings: Relative items in date strings. (line 29)  File: shishi.info, Node: Concept Index, Prev: Function and Data Index, Up: Top Concept Index ************* [index] * Menu: * 3DES: Cryptographic Overview. (line 21) * abbreviations for months: Calendar date items. (line 38) * AES: Cryptographic Overview. (line 21) * AIX: Supported Platforms. (line 70) * anonymous tls: Kerberos via TLS. (line 41) * Application Programming Interface (API): Programming Manual. (line 6) * ARCFOUR: Cryptographic Overview. (line 21) * authenticated tls: Kerberos via TLS. (line 97) * Authentication: Glossary of terms. (line 7) * Authentication header: Glossary of terms. (line 10) * Authentication path: Glossary of terms. (line 14) * Authenticator: Glossary of terms. (line 18) * Authorization: Glossary of terms. (line 23) * authors of parse_datetime: Authors of parse_datetime. (line 6) * Autoconf tests: Autoconf tests. (line 6) * beginning of time, for POSIX: Seconds since the Epoch. (line 13) * Bellovin, Steven M.: Authors of parse_datetime. (line 6) * Berets, Jim: Authors of parse_datetime. (line 6) * Berry, K.: Authors of parse_datetime. (line 19) * calendar date item: Calendar date items. (line 6) * Capability: Glossary of terms. (line 28) * case, ignored in dates: General date syntax. (line 66) * certificate authority (CA): Kerberos via TLS. (line 97) * Ciphertext: Glossary of terms. (line 35) * Client: Glossary of terms. (line 39) * client authentication: Kerberos via TLS. (line 97) * combined date and time of day item: Combined date and time of day items. (line 6) * comments, in dates: General date syntax. (line 66) * Compiling your application: Building the source. (line 6) * concurrent writers: Multiple servers. (line 24) * configuration file: Shishi Configuration. (line 6) * Configure tests: Autoconf tests. (line 6) * Contributing: Contributing. (line 7) * Credentials: Glossary of terms. (line 45) * database definition: Shisa Configuration. (line 6) * Database interface: Kerberos Database Functions. (line 6) * date and time of day format, ISO 8601: Combined date and time of day items. (line 6) * date format, ISO 8601: Calendar date items. (line 30) * date input formats: Date input formats. (line 6) * day of week item: Day of week items. (line 6) * Debian: Supported Platforms. (line 10) * DES: Cryptographic Overview. (line 21) * Diffie Hellman key exchange: Kerberos via TLS. (line 41) * displacement of dates: Relative items in date strings. (line 6) * Download: Downloading and Installing. (line 6) * Eggert, Paul: Authors of parse_datetime. (line 6) * Encryption Type (etype): Glossary of terms. (line 49) * End-user Shishi usage: User Manual. (line 6) * epoch, for POSIX: Seconds since the Epoch. (line 13) * Error Handling: Error Handling. (line 6) * Examples: Examples. (line 6) * fail over: Multiple servers. (line 82) * FDL, GNU Free Documentation License: GNU Free Documentation License. (line 6) * FreeBSD: Supported Platforms. (line 93) * general date syntax: General date syntax. (line 6) * Generic Security Service: Generic Security Service. (line 6) * GNUTLS: Kerberos via TLS. (line 6) * GSS-API: Generic Security Service. (line 6) * GSSLib: Generic Security Service. (line 6) * Hacking: Contributing. (line 7) * High Availability: Multiple servers. (line 64) * HP-UX: Supported Platforms. (line 74) * Installation: Downloading and Installing. (line 6) * IPSEC: Multiple servers. (line 6) * IRIX: Supported Platforms. (line 66) * ISO 8601 date and time of day format: Combined date and time of day items. (line 6) * ISO 8601 date format: Calendar date items. (line 30) * items in date strings: General date syntax. (line 6) * KDC: Glossary of terms. (line 59) * Kerberos: Glossary of terms. (line 68) * Kerberos Ticket: Glossary of terms. (line 125) * Key Version Number (kvno): Glossary of terms. (line 74) * language, in dates: General date syntax. (line 42) * LDAP: Multiple servers. (line 6) * leap seconds <1>: Seconds since the Epoch. (line 27) * leap seconds <2>: Time of day items. (line 14) * leap seconds: General date syntax. (line 71) * MacKenzie, David: Authors of parse_datetime. (line 6) * MacOS X: Supported Platforms. (line 99) * Mandrake: Supported Platforms. (line 62) * master server: Multiple servers. (line 13) * Meyering, Jim: Authors of parse_datetime. (line 6) * minutes, time zone correction by: Time of day items. (line 30) * month names in date strings: Calendar date items. (line 38) * months, written-out: General date syntax. (line 38) * Motorola Coldfire: Supported Platforms. (line 103) * NetBSD: Supported Platforms. (line 83) * NFS: Multiple servers. (line 6) * numbers, written-out: General date syntax. (line 28) * OpenBSD: Supported Platforms. (line 88) * ordinal numbers: General date syntax. (line 28) * Pinard, F.: Authors of parse_datetime. (line 19) * Plaintext: Glossary of terms. (line 81) * Principal: Glossary of terms. (line 85) * Principal identifier: Glossary of terms. (line 89) * pure numbers in date strings: Pure numbers in date strings. (line 6) * RedHat: Supported Platforms. (line 45) * RedHat Advanced Server: Supported Platforms. (line 54) * relative items in date strings: Relative items in date strings. (line 6) * remote databases: Multiple servers. (line 6) * Reporting Bugs: Bug Reports. (line 6) * rsync: Multiple servers. (line 6) * Salz, Rich: Authors of parse_datetime. (line 6) * Seal: Glossary of terms. (line 93) * secondary server: Multiple servers. (line 13) * Secret key: Glossary of terms. (line 98) * Server: Glossary of terms. (line 104) * server authentication: Kerberos via TLS. (line 97) * Service: Glossary of terms. (line 109) * Session key: Glossary of terms. (line 113) * Shisa API: Kerberos Database Functions. (line 6) * Solaris: Supported Platforms. (line 79) * specifying user database: Shisa Configuration. (line 6) * SQL: Multiple servers. (line 6) * STARTTLS: Kerberos via TLS. (line 6) * Sub-session key: Glossary of terms. (line 119) * SuSE: Supported Platforms. (line 31) * SuSE Linux: Supported Platforms. (line 36) * Ticket: Glossary of terms. (line 125) * time of day item: Time of day items. (line 6) * time zone correction: Time of day items. (line 30) * time zone item <1>: Time zone items. (line 6) * time zone item: General date syntax. (line 46) * TLS: Kerberos via TLS. (line 6) * tls resume: Kerberos via TLS. (line 18) * Tru64: Supported Platforms. (line 26) * uClibc: Supported Platforms. (line 103) * uClinux: Supported Platforms. (line 103) * user database definition: Shisa Configuration. (line 6) * X.509 authentication: Kerberos via TLS. (line 97) shishi-1.0.2/doc/keytab.txt0000664000000000000000000001064112015626624012465 00000000000000The Kerberos Keytab Binary File Format Copyright (C) 2006 Michael B Allen http://www.ioplex.com/utilities/keytab.txt Last updated: Fri May 5 13:39:40 EDT 2006 The MIT keytab binary format is not a standard format, nor is it documented anywhere in detail. The format has evolved and may continue to. It is however understood by several Kerberos implementations including Heimdal and of course MIT and keytab files are created by the ktpass.exe utility from Windows. So it has established itself as the defacto format for storing Kerberos keys. The following C-like structure definitions illustrate the MIT keytab file format. All values are in network byte order. All text is ASCII. keytab { uint16_t file_format_version; /* 0x502 */ keytab_entry entries[*]; }; keytab_entry { int32_t size; uint16_t num_components; /* sub 1 if version 0x501 */ counted_octet_string realm; counted_octet_string components[num_components]; uint32_t name_type; /* not present if version 0x501 */ uint32_t timestamp; uint8_t vno8; keyblock key; uint32_t vno; /* only present if >= 4 bytes left in entry */ }; counted_octet_string { uint16_t length; uint8_t data[length]; }; keyblock { uint16_t type; counted_octet_string; }; The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502. The format of older keytabs is described at the end of this document. The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry. Note that the size should be evaluated as signed. This is because a negative value indicates that the entry is in fact empty (e.g. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry. Based on these size values alone the entire keytab file can be traversed. The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array. The num_components field is followed by a counted_octet_string representing the realm of the principal. A counted_octet_string is simply an array of bytes prefixed with a 16 bit length. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator. Following the realm is the components array that represents the name of the principal. The text of these components may be joined with slashs to construct the typical SPN representation. For example, the service principal HTTP/www.foo.net@FOO.NET would consist of name components "HTTP" followed by "www.foo.net". Following the components array is the 32 bit name_type (e.g. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL. The 32 bit timestamp indicates the time the key was established for that principal. The value represents the number of seconds since Jan 1, 1970. The 8 bit vno8 field is the version number of the key. This value is overridden by the 32 bit vno field if it is present. The keyblock structure consists of a 16 bit value indicating the keytype (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, 16 is des3-cbc-sha1, etc). This is followed by a counted_octet_string containing the key. The last field of the keytab_entry structure is optional. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present. This value supersedes the 8 bit vno8 value preceeding the keyblock. Older keytabs with a file_format_version of 0x501 are different in three ways: 1) All integers are in host byte order [1]. 2) The num_components field is 1 too large (i.e. after decoding, decrement by 1). 3) The 32 bit name_type field is not present. [1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively. Permission to copy, modify, and distribute this document, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include this copyright notice in ALL copies of the document or portions thereof, including modifications. shishi-1.0.2/doc/Makefile.am0000644000000000000000000010367212126773105012506 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SUBDIRS = . cyclo if ENABLE_GTK_DOC SUBDIRS += reference endif EXTRA_DIST = gdoc gdoc-error shishi.html shishi.pdf shishi.ps components.dia components.png: components.dia $(DIA) --export=$@ --filter=png components.dia info_TEXINFOS = shishi.texi shishi_TEXINFOS = fdl-1.3.texi $(gdoc_TEXINFOS) \ shishi-api-error-labels.texi parse-datetime.texi \ texinfo.css components.png keytab.txt ccache.txt AM_MAKEINFOHTMLFLAGS = --no-split --number-sections --css-include=texinfo.css dist_man_MANS = shishi.1 shisa.1 shishid.1 keytab2shishi.1 ccache2shishi.1 \ $(gdoc_MANS) MAINTAINERCLEANFILES = $(dist_man_MANS) shishi.1: $(top_srcdir)/src/shishi.c $(top_srcdir)/src/shishi.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi client tool" \ --output=$@ $(top_builddir)/src/shishi$(EXEEXT) shisa.1: $(top_srcdir)/src/shisa.c $(top_srcdir)/src/shisa.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi database interface" \ --info-page=shishi \ --output=$@ $(top_builddir)/src/shisa$(EXEEXT) shishid.1: $(top_srcdir)/src/shishid.c $(top_srcdir)/src/shishid.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi KDC server" \ --output=$@ $(top_builddir)/src/shishid$(EXEEXT) keytab2shishi.1: $(top_srcdir)/src/keytab2shishi.c \ $(top_srcdir)/src/keytab2shishi.ggo $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi host key conversion tool" \ --output=$@ $(top_builddir)/src/keytab2shishi$(EXEEXT) ccache2shishi.1: $(top_srcdir)/src/ccache2shishi.c \ $(top_srcdir)/src/ccache2shishi.ggo $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi user ticket conversion tool" \ --output=$@ $(top_builddir)/src/ccache2shishi$(EXEEXT) shishi-api-error-labels.texi: $(top_srcdir)/lib/error.c $(PERL) $(srcdir)/gdoc-error $(top_srcdir)/lib/error.c > $@ gdoc_MANS = gdoc_MANS += man/shishi_ap.3 gdoc_MANS += man/shishi_ap_etype.3 gdoc_MANS += man/shishi_ap_nosubkey.3 gdoc_MANS += man/shishi_ap_done.3 gdoc_MANS += man/shishi_ap_set_tktoptions.3 gdoc_MANS += man/shishi_ap_set_tktoptionsdata.3 gdoc_MANS += man/shishi_ap_set_tktoptionsraw.3 gdoc_MANS += man/shishi_ap_set_tktoptionsasn1usage.3 gdoc_MANS += man/shishi_ap_tktoptions.3 gdoc_MANS += man/shishi_ap_tktoptionsdata.3 gdoc_MANS += man/shishi_ap_tktoptionsraw.3 gdoc_MANS += man/shishi_ap_etype_tktoptionsdata.3 gdoc_MANS += man/shishi_ap_tktoptionsasn1usage.3 gdoc_MANS += man/shishi_ap_tkt.3 gdoc_MANS += man/shishi_ap_tkt_set.3 gdoc_MANS += man/shishi_ap_authenticator_cksumdata.3 gdoc_MANS += man/shishi_ap_authenticator_cksumdata_set.3 gdoc_MANS += man/shishi_ap_authenticator_cksumraw_set.3 gdoc_MANS += man/shishi_ap_authenticator_cksumtype.3 gdoc_MANS += man/shishi_ap_authenticator_cksumtype_set.3 gdoc_MANS += man/shishi_ap_authenticator.3 gdoc_MANS += man/shishi_ap_authenticator_set.3 gdoc_MANS += man/shishi_ap_req.3 gdoc_MANS += man/shishi_ap_req_set.3 gdoc_MANS += man/shishi_ap_req_der.3 gdoc_MANS += man/shishi_ap_req_der_set.3 gdoc_MANS += man/shishi_ap_req_build.3 gdoc_MANS += man/shishi_ap_req_decode.3 gdoc_MANS += man/shishi_ap_req_process_keyusage.3 gdoc_MANS += man/shishi_ap_req_process.3 gdoc_MANS += man/shishi_ap_req_asn1.3 gdoc_MANS += man/shishi_ap_key.3 gdoc_MANS += man/shishi_ap_rep.3 gdoc_MANS += man/shishi_ap_rep_set.3 gdoc_MANS += man/shishi_ap_rep_der.3 gdoc_MANS += man/shishi_ap_rep_der_set.3 gdoc_MANS += man/shishi_ap_rep_build.3 gdoc_MANS += man/shishi_ap_rep_asn1.3 gdoc_MANS += man/shishi_ap_rep_verify.3 gdoc_MANS += man/shishi_ap_rep_verify_der.3 gdoc_MANS += man/shishi_ap_rep_verify_asn1.3 gdoc_MANS += man/shishi_ap_encapreppart.3 gdoc_MANS += man/shishi_ap_encapreppart_set.3 gdoc_MANS += man/shishi_ap_option2string.3 gdoc_MANS += man/shishi_ap_string2option.3 gdoc_MANS += man/shishi_aprep.3 gdoc_MANS += man/shishi_aprep_print.3 gdoc_MANS += man/shishi_aprep_save.3 gdoc_MANS += man/shishi_aprep_to_file.3 gdoc_MANS += man/shishi_aprep_parse.3 gdoc_MANS += man/shishi_aprep_read.3 gdoc_MANS += man/shishi_aprep_from_file.3 gdoc_MANS += man/shishi_aprep_get_enc_part_etype.3 gdoc_MANS += man/shishi_apreq.3 gdoc_MANS += man/shishi_apreq_print.3 gdoc_MANS += man/shishi_apreq_save.3 gdoc_MANS += man/shishi_apreq_to_file.3 gdoc_MANS += man/shishi_apreq_parse.3 gdoc_MANS += man/shishi_apreq_read.3 gdoc_MANS += man/shishi_apreq_from_file.3 gdoc_MANS += man/shishi_apreq_set_authenticator.3 gdoc_MANS += man/shishi_apreq_add_authenticator.3 gdoc_MANS += man/shishi_apreq_set_ticket.3 gdoc_MANS += man/shishi_apreq_options.3 gdoc_MANS += man/shishi_apreq_use_session_key_p.3 gdoc_MANS += man/shishi_apreq_mutual_required_p.3 gdoc_MANS += man/shishi_apreq_options_set.3 gdoc_MANS += man/shishi_apreq_options_add.3 gdoc_MANS += man/shishi_apreq_options_remove.3 gdoc_MANS += man/shishi_apreq_get_authenticator_etype.3 gdoc_MANS += man/shishi_apreq_get_ticket.3 gdoc_MANS += man/shishi_as.3 gdoc_MANS += man/shishi_as_done.3 gdoc_MANS += man/shishi_as_req.3 gdoc_MANS += man/shishi_as_req_build.3 gdoc_MANS += man/shishi_as_req_set.3 gdoc_MANS += man/shishi_as_req_der.3 gdoc_MANS += man/shishi_as_req_der_set.3 gdoc_MANS += man/shishi_as_rep.3 gdoc_MANS += man/shishi_as_rep_process.3 gdoc_MANS += man/shishi_as_rep_build.3 gdoc_MANS += man/shishi_as_rep_der.3 gdoc_MANS += man/shishi_as_rep_set.3 gdoc_MANS += man/shishi_as_rep_der_set.3 gdoc_MANS += man/shishi_as_krberror.3 gdoc_MANS += man/shishi_as_krberror_der.3 gdoc_MANS += man/shishi_as_krberror_set.3 gdoc_MANS += man/shishi_as_tkt.3 gdoc_MANS += man/shishi_as_tkt_set.3 gdoc_MANS += man/shishi_as_sendrecv_hint.3 gdoc_MANS += man/shishi_as_sendrecv.3 gdoc_MANS += man/shishi_asn1_read_inline.3 gdoc_MANS += man/shishi_asn1_read.3 gdoc_MANS += man/shishi_asn1_read_optional.3 gdoc_MANS += man/shishi_asn1_done.3 gdoc_MANS += man/shishi_asn1_pa_enc_ts_enc.3 gdoc_MANS += man/shishi_asn1_encrypteddata.3 gdoc_MANS += man/shishi_asn1_padata.3 gdoc_MANS += man/shishi_asn1_methoddata.3 gdoc_MANS += man/shishi_asn1_etype_info.3 gdoc_MANS += man/shishi_asn1_etype_info2.3 gdoc_MANS += man/shishi_asn1_asreq.3 gdoc_MANS += man/shishi_asn1_asrep.3 gdoc_MANS += man/shishi_asn1_tgsreq.3 gdoc_MANS += man/shishi_asn1_tgsrep.3 gdoc_MANS += man/shishi_asn1_apreq.3 gdoc_MANS += man/shishi_asn1_aprep.3 gdoc_MANS += man/shishi_asn1_encapreppart.3 gdoc_MANS += man/shishi_asn1_ticket.3 gdoc_MANS += man/shishi_asn1_encticketpart.3 gdoc_MANS += man/shishi_asn1_authenticator.3 gdoc_MANS += man/shishi_asn1_enckdcreppart.3 gdoc_MANS += man/shishi_asn1_encasreppart.3 gdoc_MANS += man/shishi_asn1_krberror.3 gdoc_MANS += man/shishi_asn1_krbsafe.3 gdoc_MANS += man/shishi_asn1_priv.3 gdoc_MANS += man/shishi_asn1_encprivpart.3 gdoc_MANS += man/shishi_asn1_to_der_field.3 gdoc_MANS += man/shishi_asn1_to_der.3 gdoc_MANS += man/shishi_asn1_msgtype.3 gdoc_MANS += man/shishi_der_msgtype.3 gdoc_MANS += man/shishi_der2asn1.3 gdoc_MANS += man/shishi_der2asn1_padata.3 gdoc_MANS += man/shishi_der2asn1_methoddata.3 gdoc_MANS += man/shishi_der2asn1_etype_info.3 gdoc_MANS += man/shishi_der2asn1_etype_info2.3 gdoc_MANS += man/shishi_der2asn1_ticket.3 gdoc_MANS += man/shishi_der2asn1_encticketpart.3 gdoc_MANS += man/shishi_der2asn1_asreq.3 gdoc_MANS += man/shishi_der2asn1_tgsreq.3 gdoc_MANS += man/shishi_der2asn1_asrep.3 gdoc_MANS += man/shishi_der2asn1_tgsrep.3 gdoc_MANS += man/shishi_der2asn1_kdcrep.3 gdoc_MANS += man/shishi_der2asn1_encasreppart.3 gdoc_MANS += man/shishi_der2asn1_enctgsreppart.3 gdoc_MANS += man/shishi_der2asn1_enckdcreppart.3 gdoc_MANS += man/shishi_der2asn1_authenticator.3 gdoc_MANS += man/shishi_der2asn1_krberror.3 gdoc_MANS += man/shishi_der2asn1_krbsafe.3 gdoc_MANS += man/shishi_der2asn1_priv.3 gdoc_MANS += man/shishi_der2asn1_encprivpart.3 gdoc_MANS += man/shishi_der2asn1_apreq.3 gdoc_MANS += man/shishi_der2asn1_aprep.3 gdoc_MANS += man/shishi_der2asn1_encapreppart.3 gdoc_MANS += man/shishi_der2asn1_kdcreq.3 gdoc_MANS += man/shishi_asn1_print.3 gdoc_MANS += man/shishi_authenticator.3 gdoc_MANS += man/shishi_authenticator_subkey.3 gdoc_MANS += man/shishi_authenticator_print.3 gdoc_MANS += man/shishi_authenticator_save.3 gdoc_MANS += man/shishi_authenticator_to_file.3 gdoc_MANS += man/shishi_authenticator_parse.3 gdoc_MANS += man/shishi_authenticator_read.3 gdoc_MANS += man/shishi_authenticator_from_file.3 gdoc_MANS += man/shishi_authenticator_set_crealm.3 gdoc_MANS += man/shishi_authenticator_set_cname.3 gdoc_MANS += man/shishi_authenticator_client_set.3 gdoc_MANS += man/shishi_authenticator_ctime.3 gdoc_MANS += man/shishi_authenticator_ctime_set.3 gdoc_MANS += man/shishi_authenticator_cusec_get.3 gdoc_MANS += man/shishi_authenticator_cusec_set.3 gdoc_MANS += man/shishi_authenticator_seqnumber_get.3 gdoc_MANS += man/shishi_authenticator_seqnumber_remove.3 gdoc_MANS += man/shishi_authenticator_seqnumber_set.3 gdoc_MANS += man/shishi_authenticator_client.3 gdoc_MANS += man/shishi_authenticator_clientrealm.3 gdoc_MANS += man/shishi_authenticator_cksum.3 gdoc_MANS += man/shishi_authenticator_set_cksum.3 gdoc_MANS += man/shishi_authenticator_add_cksum.3 gdoc_MANS += man/shishi_authenticator_add_cksum_type.3 gdoc_MANS += man/shishi_authenticator_clear_authorizationdata.3 gdoc_MANS += man/shishi_authenticator_add_authorizationdata.3 gdoc_MANS += man/shishi_authenticator_authorizationdata.3 gdoc_MANS += man/shishi_authenticator_remove_subkey.3 gdoc_MANS += man/shishi_authenticator_get_subkey.3 gdoc_MANS += man/shishi_authenticator_set_subkey.3 gdoc_MANS += man/shishi_authenticator_add_random_subkey.3 gdoc_MANS += man/shishi_authenticator_add_random_subkey_etype.3 gdoc_MANS += man/shishi_authenticator_add_subkey.3 gdoc_MANS += man/shishi_authorize_strcmp.3 gdoc_MANS += man/shishi_authorize_k5login.3 gdoc_MANS += man/shishi_authorization_parse.3 gdoc_MANS += man/shishi_authorized_p.3 gdoc_MANS += man/shishi_cfg.3 gdoc_MANS += man/shishi_cfg_from_file.3 gdoc_MANS += man/shishi_cfg_print.3 gdoc_MANS += man/shishi_cfg_default_systemfile.3 gdoc_MANS += man/shishi_cfg_default_userdirectory.3 gdoc_MANS += man/shishi_cfg_userdirectory_file.3 gdoc_MANS += man/shishi_cfg_default_userfile.3 gdoc_MANS += man/shishi_cfg_clientkdcetype.3 gdoc_MANS += man/shishi_cfg_clientkdcetype_fast.3 gdoc_MANS += man/shishi_cfg_clientkdcetype_set.3 gdoc_MANS += man/shishi_cfg_authorizationtype_set.3 gdoc_MANS += man/shishi_crypto.3 gdoc_MANS += man/shishi_crypto_encrypt.3 gdoc_MANS += man/shishi_crypto_decrypt.3 gdoc_MANS += man/shishi_crypto_close.3 gdoc_MANS += man/shishi_cipher_supported_p.3 gdoc_MANS += man/shishi_cipher_name.3 gdoc_MANS += man/shishi_cipher_blocksize.3 gdoc_MANS += man/shishi_cipher_confoundersize.3 gdoc_MANS += man/shishi_cipher_keylen.3 gdoc_MANS += man/shishi_cipher_randomlen.3 gdoc_MANS += man/shishi_cipher_defaultcksumtype.3 gdoc_MANS += man/shishi_cipher_parse.3 gdoc_MANS += man/shishi_checksum_supported_p.3 gdoc_MANS += man/shishi_checksum_name.3 gdoc_MANS += man/shishi_checksum_cksumlen.3 gdoc_MANS += man/shishi_checksum_parse.3 gdoc_MANS += man/shishi_string_to_key.3 gdoc_MANS += man/shishi_random_to_key.3 gdoc_MANS += man/shishi_checksum.3 gdoc_MANS += man/shishi_verify.3 gdoc_MANS += man/shishi_encrypt_ivupdate_etype.3 gdoc_MANS += man/shishi_encrypt_iv_etype.3 gdoc_MANS += man/shishi_encrypt_etype.3 gdoc_MANS += man/shishi_encrypt_ivupdate.3 gdoc_MANS += man/shishi_encrypt_iv.3 gdoc_MANS += man/shishi_encrypt.3 gdoc_MANS += man/shishi_decrypt_ivupdate_etype.3 gdoc_MANS += man/shishi_decrypt_iv_etype.3 gdoc_MANS += man/shishi_decrypt_etype.3 gdoc_MANS += man/shishi_decrypt_ivupdate.3 gdoc_MANS += man/shishi_decrypt_iv.3 gdoc_MANS += man/shishi_decrypt.3 gdoc_MANS += man/shishi_n_fold.3 gdoc_MANS += man/shishi_dr.3 gdoc_MANS += man/shishi_dk.3 gdoc_MANS += man/shishi_key_print.3 gdoc_MANS += man/shishi_key_to_file.3 gdoc_MANS += man/shishi_encapreppart.3 gdoc_MANS += man/shishi_encapreppart_print.3 gdoc_MANS += man/shishi_encapreppart_save.3 gdoc_MANS += man/shishi_encapreppart_to_file.3 gdoc_MANS += man/shishi_encapreppart_parse.3 gdoc_MANS += man/shishi_encapreppart_read.3 gdoc_MANS += man/shishi_encapreppart_from_file.3 gdoc_MANS += man/shishi_encapreppart_get_key.3 gdoc_MANS += man/shishi_encapreppart_ctime.3 gdoc_MANS += man/shishi_encapreppart_ctime_set.3 gdoc_MANS += man/shishi_encapreppart_cusec_get.3 gdoc_MANS += man/shishi_encapreppart_cusec_set.3 gdoc_MANS += man/shishi_encapreppart_seqnumber_get.3 gdoc_MANS += man/shishi_encapreppart_seqnumber_remove.3 gdoc_MANS += man/shishi_encapreppart_seqnumber_set.3 gdoc_MANS += man/shishi_encapreppart_time_copy.3 gdoc_MANS += man/shishi_enckdcreppart_get_key.3 gdoc_MANS += man/shishi_enckdcreppart_key_set.3 gdoc_MANS += man/shishi_enckdcreppart_nonce_set.3 gdoc_MANS += man/shishi_enckdcreppart_flags_set.3 gdoc_MANS += man/shishi_enckdcreppart_authtime_set.3 gdoc_MANS += man/shishi_enckdcreppart_starttime_set.3 gdoc_MANS += man/shishi_enckdcreppart_endtime_set.3 gdoc_MANS += man/shishi_enckdcreppart_renew_till_set.3 gdoc_MANS += man/shishi_enckdcreppart_srealm_set.3 gdoc_MANS += man/shishi_enckdcreppart_sname_set.3 gdoc_MANS += man/shishi_enckdcreppart_populate_encticketpart.3 gdoc_MANS += man/shishi_encticketpart_get_key.3 gdoc_MANS += man/shishi_encticketpart_key_set.3 gdoc_MANS += man/shishi_encticketpart_flags_set.3 gdoc_MANS += man/shishi_encticketpart_crealm_set.3 gdoc_MANS += man/shishi_encticketpart_cname_set.3 gdoc_MANS += man/shishi_encticketpart_transited_set.3 gdoc_MANS += man/shishi_encticketpart_authtime_set.3 gdoc_MANS += man/shishi_encticketpart_endtime_set.3 gdoc_MANS += man/shishi_encticketpart_client.3 gdoc_MANS += man/shishi_encticketpart_clientrealm.3 gdoc_MANS += man/shishi_strerror.3 gdoc_MANS += man/shishi_error.3 gdoc_MANS += man/shishi_error_clear.3 gdoc_MANS += man/shishi_error_set.3 gdoc_MANS += man/shishi_error_printf.3 gdoc_MANS += man/shishi_error_outputtype.3 gdoc_MANS += man/shishi_error_set_outputtype.3 gdoc_MANS += man/shishi_info.3 gdoc_MANS += man/shishi_warn.3 gdoc_MANS += man/shishi_verbose.3 gdoc_MANS += man/shishi_generalize_time.3 gdoc_MANS += man/shishi_generalize_now.3 gdoc_MANS += man/shishi_generalize_ctime.3 gdoc_MANS += man/shishi_time.3 gdoc_MANS += man/shishi_ctime.3 gdoc_MANS += man/shishi_hostkeys_default_file.3 gdoc_MANS += man/shishi_hostkeys_default_file_set.3 gdoc_MANS += man/shishi_hostkeys_for_server.3 gdoc_MANS += man/shishi_hostkeys_for_serverrealm.3 gdoc_MANS += man/shishi_hostkeys_for_localservicerealm.3 gdoc_MANS += man/shishi_hostkeys_for_localservice.3 gdoc_MANS += man/shishi.3 gdoc_MANS += man/shishi_server.3 gdoc_MANS += man/shishi_done.3 gdoc_MANS += man/shishi_init.3 gdoc_MANS += man/shishi_init_with_paths.3 gdoc_MANS += man/shishi_init_server.3 gdoc_MANS += man/shishi_init_server_with_paths.3 gdoc_MANS += man/shishi_as_derive_salt.3 gdoc_MANS += man/shishi_kdc_copy_crealm.3 gdoc_MANS += man/shishi_as_check_crealm.3 gdoc_MANS += man/shishi_kdc_copy_cname.3 gdoc_MANS += man/shishi_as_check_cname.3 gdoc_MANS += man/shishi_kdc_copy_nonce.3 gdoc_MANS += man/shishi_kdc_check_nonce.3 gdoc_MANS += man/shishi_tgs_process.3 gdoc_MANS += man/shishi_as_process.3 gdoc_MANS += man/shishi_kdc_process.3 gdoc_MANS += man/shishi_asrep.3 gdoc_MANS += man/shishi_tgsrep.3 gdoc_MANS += man/shishi_kdcrep_print.3 gdoc_MANS += man/shishi_kdcrep_save.3 gdoc_MANS += man/shishi_kdcrep_to_file.3 gdoc_MANS += man/shishi_kdcrep_parse.3 gdoc_MANS += man/shishi_kdcrep_read.3 gdoc_MANS += man/shishi_kdcrep_from_file.3 gdoc_MANS += man/shishi_kdcrep_crealm_set.3 gdoc_MANS += man/shishi_kdcrep_cname_set.3 gdoc_MANS += man/shishi_kdcrep_client_set.3 gdoc_MANS += man/shishi_kdcrep_get_enc_part_etype.3 gdoc_MANS += man/shishi_kdcrep_get_ticket.3 gdoc_MANS += man/shishi_kdcrep_set_ticket.3 gdoc_MANS += man/shishi_kdcrep_set_enc_part.3 gdoc_MANS += man/shishi_kdcrep_add_enc_part.3 gdoc_MANS += man/shishi_kdcrep_clear_padata.3 gdoc_MANS += man/shishi_asreq.3 gdoc_MANS += man/shishi_tgsreq.3 gdoc_MANS += man/shishi_kdcreq_print.3 gdoc_MANS += man/shishi_kdcreq_save.3 gdoc_MANS += man/shishi_kdcreq_to_file.3 gdoc_MANS += man/shishi_kdcreq_parse.3 gdoc_MANS += man/shishi_kdcreq_read.3 gdoc_MANS += man/shishi_kdcreq_from_file.3 gdoc_MANS += man/shishi_kdcreq_nonce_set.3 gdoc_MANS += man/shishi_kdcreq_set_cname.3 gdoc_MANS += man/shishi_kdcreq_client.3 gdoc_MANS += man/shishi_asreq_clientrealm.3 gdoc_MANS += man/shishi_kdcreq_realm.3 gdoc_MANS += man/shishi_kdcreq_set_realm.3 gdoc_MANS += man/shishi_kdcreq_server.3 gdoc_MANS += man/shishi_kdcreq_set_sname.3 gdoc_MANS += man/shishi_kdcreq_till.3 gdoc_MANS += man/shishi_kdcreq_tillc.3 gdoc_MANS += man/shishi_kdcreq_etype.3 gdoc_MANS += man/shishi_kdcreq_set_etype.3 gdoc_MANS += man/shishi_kdcreq_options.3 gdoc_MANS += man/shishi_kdcreq_forwardable_p.3 gdoc_MANS += man/shishi_kdcreq_forwarded_p.3 gdoc_MANS += man/shishi_kdcreq_proxiable_p.3 gdoc_MANS += man/shishi_kdcreq_proxy_p.3 gdoc_MANS += man/shishi_kdcreq_allow_postdate_p.3 gdoc_MANS += man/shishi_kdcreq_postdated_p.3 gdoc_MANS += man/shishi_kdcreq_renewable_p.3 gdoc_MANS += man/shishi_kdcreq_disable_transited_check_p.3 gdoc_MANS += man/shishi_kdcreq_renewable_ok_p.3 gdoc_MANS += man/shishi_kdcreq_enc_tkt_in_skey_p.3 gdoc_MANS += man/shishi_kdcreq_renew_p.3 gdoc_MANS += man/shishi_kdcreq_validate_p.3 gdoc_MANS += man/shishi_kdcreq_options_set.3 gdoc_MANS += man/shishi_kdcreq_options_add.3 gdoc_MANS += man/shishi_kdcreq_clear_padata.3 gdoc_MANS += man/shishi_kdcreq_get_padata.3 gdoc_MANS += man/shishi_kdcreq_get_padata_tgs.3 gdoc_MANS += man/shishi_kdcreq_add_padata.3 gdoc_MANS += man/shishi_kdcreq_add_padata_tgs.3 gdoc_MANS += man/shishi_kdcreq_add_padata_preauth.3 gdoc_MANS += man/shishi_key_principal.3 gdoc_MANS += man/shishi_key_principal_set.3 gdoc_MANS += man/shishi_key_realm.3 gdoc_MANS += man/shishi_key_realm_set.3 gdoc_MANS += man/shishi_key_type.3 gdoc_MANS += man/shishi_key_type_set.3 gdoc_MANS += man/shishi_key_value.3 gdoc_MANS += man/shishi_key_value_set.3 gdoc_MANS += man/shishi_key_version.3 gdoc_MANS += man/shishi_key_version_set.3 gdoc_MANS += man/shishi_key_timestamp.3 gdoc_MANS += man/shishi_key_timestamp_set.3 gdoc_MANS += man/shishi_key_name.3 gdoc_MANS += man/shishi_key_length.3 gdoc_MANS += man/shishi_key.3 gdoc_MANS += man/shishi_key_done.3 gdoc_MANS += man/shishi_key_copy.3 gdoc_MANS += man/shishi_key_from_value.3 gdoc_MANS += man/shishi_key_from_base64.3 gdoc_MANS += man/shishi_key_random.3 gdoc_MANS += man/shishi_key_from_random.3 gdoc_MANS += man/shishi_key_from_string.3 gdoc_MANS += man/shishi_key_from_name.3 gdoc_MANS += man/shishi_keys.3 gdoc_MANS += man/shishi_keys_done.3 gdoc_MANS += man/shishi_keys_size.3 gdoc_MANS += man/shishi_keys_nth.3 gdoc_MANS += man/shishi_keys_remove.3 gdoc_MANS += man/shishi_keys_add.3 gdoc_MANS += man/shishi_keys_print.3 gdoc_MANS += man/shishi_keys_to_file.3 gdoc_MANS += man/shishi_keys_from_file.3 gdoc_MANS += man/shishi_keys_for_serverrealm_in_file.3 gdoc_MANS += man/shishi_keys_for_server_in_file.3 gdoc_MANS += man/shishi_keys_for_localservicerealm_in_file.3 gdoc_MANS += man/shishi_keys_add_keytab_mem.3 gdoc_MANS += man/shishi_keys_add_keytab_file.3 gdoc_MANS += man/shishi_keys_from_keytab_mem.3 gdoc_MANS += man/shishi_keys_from_keytab_file.3 gdoc_MANS += man/shishi_keys_to_keytab_mem.3 gdoc_MANS += man/shishi_keys_to_keytab_file.3 gdoc_MANS += man/shishi_krberror.3 gdoc_MANS += man/shishi_krberror_print.3 gdoc_MANS += man/shishi_krberror_save.3 gdoc_MANS += man/shishi_krberror_to_file.3 gdoc_MANS += man/shishi_krberror_parse.3 gdoc_MANS += man/shishi_krberror_read.3 gdoc_MANS += man/shishi_krberror_from_file.3 gdoc_MANS += man/shishi_krberror_build.3 gdoc_MANS += man/shishi_krberror_der.3 gdoc_MANS += man/shishi_krberror_crealm.3 gdoc_MANS += man/shishi_krberror_remove_crealm.3 gdoc_MANS += man/shishi_krberror_set_crealm.3 gdoc_MANS += man/shishi_krberror_client.3 gdoc_MANS += man/shishi_krberror_set_cname.3 gdoc_MANS += man/shishi_krberror_remove_cname.3 gdoc_MANS += man/shishi_krberror_client_set.3 gdoc_MANS += man/shishi_krberror_realm.3 gdoc_MANS += man/shishi_krberror_set_realm.3 gdoc_MANS += man/shishi_krberror_server.3 gdoc_MANS += man/shishi_krberror_remove_sname.3 gdoc_MANS += man/shishi_krberror_set_sname.3 gdoc_MANS += man/shishi_krberror_server_set.3 gdoc_MANS += man/shishi_krberror_ctime.3 gdoc_MANS += man/shishi_krberror_ctime_set.3 gdoc_MANS += man/shishi_krberror_remove_ctime.3 gdoc_MANS += man/shishi_krberror_cusec.3 gdoc_MANS += man/shishi_krberror_cusec_set.3 gdoc_MANS += man/shishi_krberror_remove_cusec.3 gdoc_MANS += man/shishi_krberror_stime.3 gdoc_MANS += man/shishi_krberror_stime_set.3 gdoc_MANS += man/shishi_krberror_susec.3 gdoc_MANS += man/shishi_krberror_susec_set.3 gdoc_MANS += man/shishi_krberror_errorcode.3 gdoc_MANS += man/shishi_krberror_errorcode_fast.3 gdoc_MANS += man/shishi_krberror_errorcode_set.3 gdoc_MANS += man/shishi_krberror_etext.3 gdoc_MANS += man/shishi_krberror_set_etext.3 gdoc_MANS += man/shishi_krberror_remove_etext.3 gdoc_MANS += man/shishi_krberror_edata.3 gdoc_MANS += man/shishi_krberror_methoddata.3 gdoc_MANS += man/shishi_krberror_set_edata.3 gdoc_MANS += man/shishi_krberror_remove_edata.3 gdoc_MANS += man/shishi_krberror_pretty_print.3 gdoc_MANS += man/shishi_krberror_errorcode_message.3 gdoc_MANS += man/shishi_krberror_message.3 gdoc_MANS += man/shishi_randomize.3 gdoc_MANS += man/shishi_crc.3 gdoc_MANS += man/shishi_md4.3 gdoc_MANS += man/shishi_md5.3 gdoc_MANS += man/shishi_hmac_md5.3 gdoc_MANS += man/shishi_hmac_sha1.3 gdoc_MANS += man/shishi_des_cbc_mac.3 gdoc_MANS += man/shishi_arcfour.3 gdoc_MANS += man/shishi_des.3 gdoc_MANS += man/shishi_3des.3 gdoc_MANS += man/shishi_aes_cts.3 gdoc_MANS += man/shishi_pbkdf2_sha1.3 gdoc_MANS += man/shishi_kdc_sendrecv_hint.3 gdoc_MANS += man/shishi_kdc_sendrecv.3 gdoc_MANS += man/shishi_prompt_password_callback_set.3 gdoc_MANS += man/shishi_prompt_password_callback_get.3 gdoc_MANS += man/shishi_prompt_password.3 gdoc_MANS += man/shishi_x509ca_default_file_guess.3 gdoc_MANS += man/shishi_x509ca_default_file_set.3 gdoc_MANS += man/shishi_x509ca_default_file.3 gdoc_MANS += man/shishi_x509cert_default_file_guess.3 gdoc_MANS += man/shishi_x509cert_default_file_set.3 gdoc_MANS += man/shishi_x509cert_default_file.3 gdoc_MANS += man/shishi_x509key_default_file_guess.3 gdoc_MANS += man/shishi_x509key_default_file_set.3 gdoc_MANS += man/shishi_x509key_default_file.3 gdoc_MANS += man/shishi_principal_default_guess.3 gdoc_MANS += man/shishi_principal_default.3 gdoc_MANS += man/shishi_principal_default_set.3 gdoc_MANS += man/shishi_parse_name.3 gdoc_MANS += man/shishi_principal_name.3 gdoc_MANS += man/shishi_principal_name_realm.3 gdoc_MANS += man/shishi_principal_name_set.3 gdoc_MANS += man/shishi_principal_set.3 gdoc_MANS += man/shishi_derive_default_salt.3 gdoc_MANS += man/shishi_server_for_local_service.3 gdoc_MANS += man/shishi_priv.3 gdoc_MANS += man/shishi_priv_done.3 gdoc_MANS += man/shishi_priv_key.3 gdoc_MANS += man/shishi_priv_key_set.3 gdoc_MANS += man/shishi_priv_priv.3 gdoc_MANS += man/shishi_priv_priv_set.3 gdoc_MANS += man/shishi_priv_priv_der.3 gdoc_MANS += man/shishi_priv_priv_der_set.3 gdoc_MANS += man/shishi_priv_encprivpart.3 gdoc_MANS += man/shishi_priv_encprivpart_set.3 gdoc_MANS += man/shishi_priv_encprivpart_der.3 gdoc_MANS += man/shishi_priv_encprivpart_der_set.3 gdoc_MANS += man/shishi_priv_print.3 gdoc_MANS += man/shishi_priv_save.3 gdoc_MANS += man/shishi_priv_to_file.3 gdoc_MANS += man/shishi_priv_parse.3 gdoc_MANS += man/shishi_priv_read.3 gdoc_MANS += man/shishi_priv_from_file.3 gdoc_MANS += man/shishi_priv_enc_part_etype.3 gdoc_MANS += man/shishi_priv_set_enc_part.3 gdoc_MANS += man/shishi_encprivpart_user_data.3 gdoc_MANS += man/shishi_encprivpart_set_user_data.3 gdoc_MANS += man/shishi_priv_build.3 gdoc_MANS += man/shishi_priv_process.3 gdoc_MANS += man/shishi_realm_default_guess.3 gdoc_MANS += man/shishi_realm_default.3 gdoc_MANS += man/shishi_realm_default_set.3 gdoc_MANS += man/shishi_realm_for_server_file.3 gdoc_MANS += man/shishi_realm_for_server_dns.3 gdoc_MANS += man/shishi_realm_for_server.3 gdoc_MANS += man/shishi_resolv.3 gdoc_MANS += man/shishi_resolv_free.3 gdoc_MANS += man/shishi_safe.3 gdoc_MANS += man/shishi_safe_done.3 gdoc_MANS += man/shishi_safe_key.3 gdoc_MANS += man/shishi_safe_key_set.3 gdoc_MANS += man/shishi_safe_safe.3 gdoc_MANS += man/shishi_safe_safe_set.3 gdoc_MANS += man/shishi_safe_safe_der.3 gdoc_MANS += man/shishi_safe_safe_der_set.3 gdoc_MANS += man/shishi_safe_print.3 gdoc_MANS += man/shishi_safe_save.3 gdoc_MANS += man/shishi_safe_to_file.3 gdoc_MANS += man/shishi_safe_parse.3 gdoc_MANS += man/shishi_safe_read.3 gdoc_MANS += man/shishi_safe_from_file.3 gdoc_MANS += man/shishi_safe_cksum.3 gdoc_MANS += man/shishi_safe_set_cksum.3 gdoc_MANS += man/shishi_safe_user_data.3 gdoc_MANS += man/shishi_safe_set_user_data.3 gdoc_MANS += man/shishi_safe_build.3 gdoc_MANS += man/shishi_safe_verify.3 gdoc_MANS += man/shishi_tgs.3 gdoc_MANS += man/shishi_tgs_done.3 gdoc_MANS += man/shishi_tgs_tgtkt.3 gdoc_MANS += man/shishi_tgs_tgtkt_set.3 gdoc_MANS += man/shishi_tgs_ap.3 gdoc_MANS += man/shishi_tgs_req.3 gdoc_MANS += man/shishi_tgs_req_set.3 gdoc_MANS += man/shishi_tgs_req_der.3 gdoc_MANS += man/shishi_tgs_req_der_set.3 gdoc_MANS += man/shishi_tgs_req_process.3 gdoc_MANS += man/shishi_tgs_req_build.3 gdoc_MANS += man/shishi_tgs_rep.3 gdoc_MANS += man/shishi_tgs_rep_der.3 gdoc_MANS += man/shishi_tgs_rep_process.3 gdoc_MANS += man/shishi_tgs_rep_build.3 gdoc_MANS += man/shishi_tgs_krberror.3 gdoc_MANS += man/shishi_tgs_krberror_der.3 gdoc_MANS += man/shishi_tgs_krberror_set.3 gdoc_MANS += man/shishi_tgs_tkt.3 gdoc_MANS += man/shishi_tgs_tkt_set.3 gdoc_MANS += man/shishi_tgs_sendrecv_hint.3 gdoc_MANS += man/shishi_tgs_sendrecv.3 gdoc_MANS += man/shishi_tgs_set_server.3 gdoc_MANS += man/shishi_tgs_set_realm.3 gdoc_MANS += man/shishi_tgs_set_realmserver.3 gdoc_MANS += man/shishi_ticket.3 gdoc_MANS += man/shishi_ticket_realm_get.3 gdoc_MANS += man/shishi_ticket_realm_set.3 gdoc_MANS += man/shishi_ticket_server.3 gdoc_MANS += man/shishi_ticket_sname_set.3 gdoc_MANS += man/shishi_ticket_get_enc_part_etype.3 gdoc_MANS += man/shishi_ticket_set_enc_part.3 gdoc_MANS += man/shishi_ticket_add_enc_part.3 gdoc_MANS += man/shishi_tkt.3 gdoc_MANS += man/shishi_tkt2.3 gdoc_MANS += man/shishi_tkt_done.3 gdoc_MANS += man/shishi_tkt_ticket.3 gdoc_MANS += man/shishi_tkt_ticket_set.3 gdoc_MANS += man/shishi_tkt_enckdcreppart.3 gdoc_MANS += man/shishi_tkt_enckdcreppart_set.3 gdoc_MANS += man/shishi_tkt_kdcrep.3 gdoc_MANS += man/shishi_tkt_encticketpart.3 gdoc_MANS += man/shishi_tkt_encticketpart_set.3 gdoc_MANS += man/shishi_tkt_key.3 gdoc_MANS += man/shishi_tkt_key_set.3 gdoc_MANS += man/shishi_tkt_client.3 gdoc_MANS += man/shishi_tkt_client_p.3 gdoc_MANS += man/shishi_tkt_clientrealm.3 gdoc_MANS += man/shishi_tkt_clientrealm_p.3 gdoc_MANS += man/shishi_tkt_realm.3 gdoc_MANS += man/shishi_tkt_server.3 gdoc_MANS += man/shishi_tkt_server_p.3 gdoc_MANS += man/shishi_tkt_flags.3 gdoc_MANS += man/shishi_tkt_flags_set.3 gdoc_MANS += man/shishi_tkt_flags_add.3 gdoc_MANS += man/shishi_tkt_forwardable_p.3 gdoc_MANS += man/shishi_tkt_forwarded_p.3 gdoc_MANS += man/shishi_tkt_proxiable_p.3 gdoc_MANS += man/shishi_tkt_proxy_p.3 gdoc_MANS += man/shishi_tkt_may_postdate_p.3 gdoc_MANS += man/shishi_tkt_postdated_p.3 gdoc_MANS += man/shishi_tkt_invalid_p.3 gdoc_MANS += man/shishi_tkt_renewable_p.3 gdoc_MANS += man/shishi_tkt_initial_p.3 gdoc_MANS += man/shishi_tkt_pre_authent_p.3 gdoc_MANS += man/shishi_tkt_hw_authent_p.3 gdoc_MANS += man/shishi_tkt_transited_policy_checked_p.3 gdoc_MANS += man/shishi_tkt_ok_as_delegate_p.3 gdoc_MANS += man/shishi_tkt_keytype.3 gdoc_MANS += man/shishi_tkt_keytype_fast.3 gdoc_MANS += man/shishi_tkt_keytype_p.3 gdoc_MANS += man/shishi_tkt_lastreqc.3 gdoc_MANS += man/shishi_tkt_authctime.3 gdoc_MANS += man/shishi_tkt_startctime.3 gdoc_MANS += man/shishi_tkt_endctime.3 gdoc_MANS += man/shishi_tkt_renew_tillc.3 gdoc_MANS += man/shishi_tkt_valid_at_time_p.3 gdoc_MANS += man/shishi_tkt_valid_now_p.3 gdoc_MANS += man/shishi_tkt_expired_p.3 gdoc_MANS += man/shishi_tkt_lastreq_pretty_print.3 gdoc_MANS += man/shishi_tkt_pretty_print.3 gdoc_MANS += man/shishi_tkts_default_ccache_guess.3 gdoc_MANS += man/shishi_tkts_default_ccache.3 gdoc_MANS += man/shishi_tkts_default_ccache_set.3 gdoc_MANS += man/shishi_tkts_add_ccache_mem.3 gdoc_MANS += man/shishi_tkts_add_ccache_file.3 gdoc_MANS += man/shishi_tkts_from_ccache_mem.3 gdoc_MANS += man/shishi_tkts_from_ccache_file.3 gdoc_MANS += man/shishi_tkts_default_file_guess.3 gdoc_MANS += man/shishi_tkts_default_file.3 gdoc_MANS += man/shishi_tkts_default_file_set.3 gdoc_MANS += man/shishi_tkts_default.3 gdoc_MANS += man/shishi_tkts.3 gdoc_MANS += man/shishi_tkts_done.3 gdoc_MANS += man/shishi_tkts_size.3 gdoc_MANS += man/shishi_tkts_nth.3 gdoc_MANS += man/shishi_tkts_remove.3 gdoc_MANS += man/shishi_tkts_add.3 gdoc_MANS += man/shishi_tkts_new.3 gdoc_MANS += man/shishi_tkts_read.3 gdoc_MANS += man/shishi_tkts_from_file.3 gdoc_MANS += man/shishi_tkts_write.3 gdoc_MANS += man/shishi_tkts_expire.3 gdoc_MANS += man/shishi_tkts_to_file.3 gdoc_MANS += man/shishi_tkts_print_for_service.3 gdoc_MANS += man/shishi_tkts_print.3 gdoc_MANS += man/shishi_tkt_match_p.3 gdoc_MANS += man/shishi_tkts_find.3 gdoc_MANS += man/shishi_tkts_find_for_clientserver.3 gdoc_MANS += man/shishi_tkts_find_for_server.3 gdoc_MANS += man/shishi_tkts_get_tgt.3 gdoc_MANS += man/shishi_tkts_get_tgs.3 gdoc_MANS += man/shishi_tkts_get.3 gdoc_MANS += man/shishi_tkts_get_for_clientserver.3 gdoc_MANS += man/shishi_tkts_get_for_server.3 gdoc_MANS += man/shishi_tkts_get_for_localservicepasswd.3 gdoc_MANS += man/shishi_check_version.3 gdoc_MANS += man/shisa_cfg_db.3 gdoc_MANS += man/shisa_cfg.3 gdoc_MANS += man/shisa_cfg_from_file.3 gdoc_MANS += man/shisa_cfg_default_systemfile.3 gdoc_MANS += man/shisa_enumerate_realms.3 gdoc_MANS += man/shisa_enumerate_principals.3 gdoc_MANS += man/shisa_principal_find.3 gdoc_MANS += man/shisa_principal_update.3 gdoc_MANS += man/shisa_principal_add.3 gdoc_MANS += man/shisa_principal_remove.3 gdoc_MANS += man/shisa_keys_find.3 gdoc_MANS += man/shisa_key_add.3 gdoc_MANS += man/shisa_key_update.3 gdoc_MANS += man/shisa_key_remove.3 gdoc_MANS += man/shisa_key_free.3 gdoc_MANS += man/shisa_keys_free.3 gdoc_MANS += man/shisa_strerror.3 gdoc_MANS += man/shisa_info.3 gdoc_MANS += man/shisa.3 gdoc_MANS += man/shisa_done.3 gdoc_MANS += man/shisa_init.3 gdoc_MANS += man/shisa_init_with_paths.3 gdoc_TEXINFOS = gdoc_TEXINFOS += texi/ap.c.texi gdoc_TEXINFOS += texi/aprep.c.texi gdoc_TEXINFOS += texi/apreq.c.texi gdoc_TEXINFOS += texi/as.c.texi gdoc_TEXINFOS += texi/asn1.c.texi gdoc_TEXINFOS += texi/authenticator.c.texi gdoc_TEXINFOS += texi/authorize.c.texi gdoc_TEXINFOS += texi/ccache.c.texi gdoc_TEXINFOS += texi/cfg.c.texi gdoc_TEXINFOS += texi/crypto-3des.c.texi gdoc_TEXINFOS += texi/crypto-aes.c.texi gdoc_TEXINFOS += texi/crypto-ctx.c.texi gdoc_TEXINFOS += texi/crypto-des.c.texi gdoc_TEXINFOS += texi/crypto-md.c.texi gdoc_TEXINFOS += texi/crypto-null.c.texi gdoc_TEXINFOS += texi/crypto-rc4.c.texi gdoc_TEXINFOS += texi/crypto.c.texi gdoc_TEXINFOS += texi/diskio.c.texi gdoc_TEXINFOS += texi/encapreppart.c.texi gdoc_TEXINFOS += texi/enckdcreppart.c.texi gdoc_TEXINFOS += texi/encticketpart.c.texi gdoc_TEXINFOS += texi/error.c.texi gdoc_TEXINFOS += texi/gztime.c.texi gdoc_TEXINFOS += texi/hostkeys.c.texi gdoc_TEXINFOS += texi/init.c.texi gdoc_TEXINFOS += texi/kdc.c.texi gdoc_TEXINFOS += texi/kdcrep.c.texi gdoc_TEXINFOS += texi/kdcreq.c.texi gdoc_TEXINFOS += texi/kerberos5.c.texi gdoc_TEXINFOS += texi/key.c.texi gdoc_TEXINFOS += texi/keys.c.texi gdoc_TEXINFOS += texi/keytab.c.texi gdoc_TEXINFOS += texi/krberror.c.texi gdoc_TEXINFOS += texi/low-crypto.c.texi gdoc_TEXINFOS += texi/netio.c.texi gdoc_TEXINFOS += texi/password.c.texi gdoc_TEXINFOS += texi/pki.c.texi gdoc_TEXINFOS += texi/principal.c.texi gdoc_TEXINFOS += texi/priv.c.texi gdoc_TEXINFOS += texi/realm.c.texi gdoc_TEXINFOS += texi/resolv.c.texi gdoc_TEXINFOS += texi/safe.c.texi gdoc_TEXINFOS += texi/starttls.c.texi gdoc_TEXINFOS += texi/tgs.c.texi gdoc_TEXINFOS += texi/ticket.c.texi gdoc_TEXINFOS += texi/tkt.c.texi gdoc_TEXINFOS += texi/tktccache.c.texi gdoc_TEXINFOS += texi/tkts.c.texi gdoc_TEXINFOS += texi/utils.c.texi gdoc_TEXINFOS += texi/version.c.texi gdoc_TEXINFOS += texi/config.c.texi gdoc_TEXINFOS += texi/core.c.texi gdoc_TEXINFOS += texi/db.c.texi gdoc_TEXINFOS += texi/err.c.texi gdoc_TEXINFOS += texi/file.c.texi gdoc_TEXINFOS += texi/fileutil.c.texi gdoc_TEXINFOS += texi/setup.c.texi $(gdoc_MANS) $(gdoc_TEXINFOS): make update-makefile make Makefile make doit GDOC_SRC = $(top_srcdir)/lib/*.c $(top_srcdir)/db/*.c update-makefile: MANS=""; \ TEXINFOS=""; \ for i in $(GDOC_SRC); do \ BASE=`basename $$i`; \ TEXINFOS="$$TEXINFOS\ngdoc_TEXINFOS += texi/$$BASE.texi"; \ done; \ FUNCS=`$(srcdir)/gdoc -listfunc $(GDOC_SRC)`; \ for i in $$FUNCS; do \ MANS="$$MANS\ngdoc_MANS += man/$$i.3"; \ done; \ grep -v -e '^gdoc_MANS += ' -e '^gdoc_TEXINFOS += ' Makefile.am | \ perl -p -e "s,^gdoc_MANS =,gdoc_MANS =$$MANS," | \ perl -p -e "s,^gdoc_TEXINFOS =,gdoc_TEXINFOS =$$TEXINFOS,;" \ > Makefile.am.new && \ mv Makefile.am.new Makefile.am doit: @$(MKDIR_P) man texi; \ echo -n "Creating function documentation" && \ for i in `$(srcdir)/gdoc -listfunc $(GDOC_SRC)`; do \ $(srcdir)/gdoc -man \ -module $(PACKAGE) -sourceversion $(VERSION) \ -bugsto $(PACKAGE_BUGREPORT) \ -includefuncprefix \ -seeinfo $(PACKAGE) -verbatimcopying \ -copyright "2002-2010 Simon Josefsson" \ -function $$i \ $(GDOC_SRC) >> man/$$i.3 && \ echo -n "."; \ done; \ echo ""; \ echo -n "Creating file documentation" && \ for i in $(GDOC_SRC); do \ BASE=`basename $$i`; \ $(srcdir)/gdoc -texinfo $$i >> texi/$$BASE.texi && \ echo -n "."; \ done; \ echo "" .PHONY: update-makefile doit shishi-1.0.2/doc/ccache2shishi.10000644000000000000000000000223612126773204013226 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH CCACHE2SHISHI "1" "April 2013" "ccache2shishi 1.0.2" "User Commands" .SH NAME ccache2shishi \- Shishi user ticket conversion tool .SH SYNOPSIS .B ccache2shishi [\fIOPTIONS\fR]... [\fIINFILE \fR[\fIOUTFILE\fR]]... .SH DESCRIPTION ccache2shishi 1.0.2 .PP Read ccache data from INFILE (usually /tmp/krb5cc_UID) and write Shishi tickets to OUTFILE. If INFILE and OUTFILE are not specified, use the defaults. .TP \fB\-h\fR, \fB\-\-help\fR Print help and exit .TP \fB\-V\fR, \fB\-\-version\fR Print version and exit .TP \fB\-v\fR, \fB\-\-verbose\fR Produce verbose output. .IP Use multiple times to increase amount of information. .TP \fB\-q\fR, \fB\-\-quiet\fR Don't produce any diagnostic output. (default=off) .PP Mandatory arguments to long options are mandatory for short options too. .SH "REPORTING BUGS" Report bugs to . .SH "SEE ALSO" The full documentation for .B ccache2shishi is maintained as a Texinfo manual. If the .B info and .B ccache2shishi programs are properly installed at your site, the command .IP .B info ccache2shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/shishi-api-error-labels.texi0000644000000000000000000001041212126773203015756 00000000000000@item SHISHI_ASN1_ERROR Error in ASN.1 function (corrupt data?) @item SHISHI_FOPEN_ERROR Could not open file @item SHISHI_IO_ERROR File input/output error @item SHISHI_MALLOC_ERROR Memory allocation error in shishi library. @item SHISHI_BASE64_ERROR Base64 encoding or decoding failed. Data corrupt? @item SHISHI_REALM_MISMATCH Client realm value differ between request and reply. @item SHISHI_CNAME_MISMATCH Client name value differ between request and reply. @item SHISHI_NONCE_MISMATCH Replay protection value (nonce) differ between request and reply. @item SHISHI_TGSREP_BAD_KEYTYPE Incorrect key type used in TGS reply. @item SHISHI_KDCREP_BAD_KEYTYPE Incorrect key type used in reply from KDC. @item SHISHI_APREP_BAD_KEYTYPE Incorrect key type used in AP reply. @item SHISHI_APREP_VERIFY_FAILED Failed verification of AP reply. @item SHISHI_APREQ_BAD_KEYTYPE Incorrect key type used in AP request. @item SHISHI_TOO_SMALL_BUFFER Provided buffer was too small. @item SHISHI_DERIVEDKEY_TOO_SMALL Derived key material is too short to be applicable. @item SHISHI_KEY_TOO_LARGE The key is too large to be usable. @item SHISHI_CRYPTO_ERROR Low-level cryptographic primitive failed. This usually indicates bad password or data corruption. @item SHISHI_CRYPTO_INTERNAL_ERROR Internal error in low-level crypto routines. @item SHISHI_SOCKET_ERROR The system call socket() failed. This usually indicates that your system does not support the socket type. @item SHISHI_BIND_ERROR The system call bind() failed. This usually indicates insufficient permissions. @item SHISHI_SENDTO_ERROR The system call sendto() failed. @item SHISHI_RECVFROM_ERROR Error receiving data from server @item SHISHI_CLOSE_ERROR The system call close() failed. @item SHISHI_KDC_TIMEOUT Timed out talking to KDC. This usually indicates a network or KDC address problem. @item SHISHI_KDC_NOT_KNOWN_FOR_REALM No KDC known for given realm. @item SHISHI_TTY_ERROR No TTY assigned to process. @item SHISHI_GOT_KRBERROR Server replied to the request with an error message. @item SHISHI_HANDLE_ERROR Failure to use handle. Missing handle, or misconfigured. @item SHISHI_INVALID_TKTS Ticket set not initialized. This usually indicates an internal application error. @item SHISHI_TICKET_BAD_KEYTYPE Key type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error. @item SHISHI_INVALID_KEY Reference to invalid encryption key. @item SHISHI_APREQ_DECRYPT_FAILED Could not decrypt AP-REQ using provided key. This usually indicates an internal application error. @item SHISHI_TICKET_DECRYPT_FAILED Could not decrypt Ticket using provided key. This usually indicates an internal application error. @item SHISHI_INVALID_TICKET Invalid ticked passed in call. @item SHISHI_OUT_OF_RANGE Argument lies outside of valid range. @item SHISHI_ASN1_NO_ELEMENT The ASN.1 structure does not contain the indicated element. @item SHISHI_SAFE_BAD_KEYTYPE Attempted access to non-existent key type. @item SHISHI_SAFE_VERIFY_FAILED Verification failed on either side. @item SHISHI_PKCS5_INVALID_PRF Invalid PKCS5 descriptor. @item SHISHI_PKCS5_INVALID_ITERATION_COUNT Invalid claim of iteration count in PKCS5 descriptor. @item SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH Derived key length is incorrect for PKCS5 descriptor. @item SHISHI_PKCS5_DERIVED_KEY_TOO_LONG Derived key is too long for PKCS5 descriptor. @item SHISHI_INVALID_PRINCIPAL_NAME Principal name syntax error. @item SHISHI_INVALID_ARGUMENT Invalid argument passed in call. Wrong or unknown value. @item SHISHI_ASN1_NO_VALUE The indicated ASN.1 element does not carry a value. @item SHISHI_CONNECT_ERROR Connection attempt failed. Try again, or check availability. @item SHISHI_VERIFY_FAILED Verification failed on either side. @item SHISHI_PRIV_BAD_KEYTYPE The private key uses an incompatible encryption type. @item SHISHI_FILE_ERROR The desired file could not be accessed. Check permissions. @item SHISHI_ENCAPREPPART_BAD_KEYTYPE The present AP reply specifies an inpermissible key type. @item SHISHI_GETTIMEOFDAY_ERROR A request for present time of day has failed. This is usually internal, but a valid time is imperative for us. @item SHISHI_KEYTAB_ERROR Failed to parse keytab file @item SHISHI_CCACHE_ERROR Failed to parse credential cache file shishi-1.0.2/doc/shishi.texi0000664000000000000000000061550612126661243012641 00000000000000\input texinfo @c -*- mode: texinfo; coding: us-ascii; -*- @c This file is part of Shishi. @c See below for copyright and license. @setfilename shishi.info @include version.texi @settitle GNU Shishi @value{VERSION} @finalout @c Unify some of the indices. @syncodeindex tp fn @syncodeindex pg fn @copying This manual is last updated @value{UPDATED} for version @value{VERSION} of Shishi. Copyright @copyright{} 2002-2013 Simon Josefsson. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end quotation @end copying @dircategory GNU utilities @direntry * shishi: (shishi). A Kerberos 5 implementation @end direntry @dircategory GNU Libraries @direntry * libshishi: (shishi). Library implementing Kerberos 5. @end direntry @titlepage @title Shishi @subtitle Kerberos 5 implementation for the GNU system @subtitle for version @value{VERSION}, @value{UPDATED} @author Simon Josefsson @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @ifnottex @node Top @top Shishi @insertcopying @end ifnottex @menu * Introduction:: How to use this manual. * User Manual:: Using Shishi as end-user. * Administration Manual:: Administrating server aspects of Shishi. * Reference Manual:: Detailed description of config files, etc. * Programming Manual:: Calling Shishi from a programming language. * Acknowledgements:: Whom to blame. Appendices * Criticism of Kerberos:: Why you maybe shouldn't use Kerberos. * Protocol Extensions:: Description of protocol extensions used. * Copying Information:: How you can copy and share Shishi. Indices * Function and Data Index:: Index of functions, variables and data types. * Concept Index:: Index of concepts and programs. @end menu @c ********************************************************** @c ******************** Introduction ********************** @c ********************************************************** @node Introduction @chapter Introduction Shishi is an implementation of the Kerberos 5 network authentication system, as specified in RFC 4120. Shishi can be used to authenticate users in distributed systems. Shishi contains a library ('libshishi') that can be used by application developers to add support for Kerberos 5. Shishi contains a command line utility ('shishi') that is used by users to acquire and manage tickets (and more). The server side, a Key Distribution Center, is implemented by 'shishid'. Of course, a manual documenting usage aspects as well as the programming API is included. Shishi currently supports AS/TGS exchanges for acquiring tickets, pre-authentication, the AP exchange for performing client and server authentication, and SAFE/PRIV for integrity/privacy protected application data exchanges. Shishi is internationalized; error and status messages can be translated into the users' language; user name and passwords can be converted into any available character set (normally including ISO-8859-1 and UTF-8) and also be processed using an experimental Stringprep profile. Most, if not all, of the widely used encryption and checksum types are supported, such as 3DES, AES, ARCFOUR and HMAC-SHA1. Shishi is developed for the GNU/Linux system, but runs on over 20 platforms including most major Unix platforms and Windows, and many kind of devices including iPAQ handhelds and S/390 mainframes. Shishi is free software licensed under the GNU General Public License version 3.0 or later. @menu * Getting Started:: * Features and Status:: * Overview:: * Cryptographic Overview:: * Supported Platforms:: * Getting help:: * Commercial Support:: * Downloading and Installing:: * Bug Reports:: * Contributing:: @end menu @node Getting Started @section Getting Started This manual documents the Shishi application and library programming interface. All commands, functions and data types provided by Shishi are explained. The reader is assumed to possess basic familiarity with network security and the Kerberos 5 security system. This manual can be used in several ways. If read from the beginning to the end, it gives a good introduction into the library and how it can be used in an application. Forward references are included where necessary. Later on, the manual can be used as a reference manual to get just the information needed about any particular interface of the library. Experienced programmers might want to start looking at the examples at the end of the manual, and then only read up on those parts of the interface which are unclear. @node Features and Status @section Features and Status Shishi might have a couple of advantages over other packages doing a similar job. @table @asis @item It's Free Software Anybody can use, modify, and redistribute it under the terms of the GNU General Public License version 3.0 or later. @item It's thread-safe The library uses no global variables. @item It's internationalized It handles non-ASCII username and passwords, and user visible strings used in the library (error messages) can be translated into the users' language. @item It's portable It should work on all Unix like operating systems, including Windows. @end table Shishi is far from feature complete, it is not even a full RFC 1510 implementation yet. However, some basic functionality is implemented. A few implemented feature are mentioned below. @itemize @bullet @item Initial authentication (AS) from raw key or password. This step is typically used to acquire a ticket granting ticket and, less commonly, a server ticket. @item Subsequent authentication (TGS). This step is typically used to acquire a server ticket, by authenticating yourself using the ticket granting ticket. @item Client-Server authentication (AP). This step is used by clients and servers to prove to each other who they are, using negotiated tickets. @item Integrity protected communication (SAFE). This step is used by clients and servers to exchange integrity protected data with each other. The key is typically agreed on using the Client-Server authentication step. @item Ticket cache, supporting multiple principals and realms. As tickets have a life time of typically several hours, they are managed in disk files. There can be multiple ticket caches, and each ticket cache can store tickets for multiple clients (users), servers, encryption types, etc. Functionality is provided for locating the proper ticket for every use. @item Most standard cryptographic primitives. The believed most secure algorithms are supported (@pxref{Cryptographic Overview}). @item Telnet client and server. This is used to remotely login to other machines, after authenticating yourself with a ticket. @item PAM module. This is used to login locally on a machine. @item KDC addresses located using DNS SRV RRs. @item Modularized low-level crypto interface. Currently Gnulib and Libgcrypt are supported. If you wish to add support for another low-level cryptographic library, you only have to implement a few APIs for DES, AES, MD5, SHA1, HMAC, etc. Look at @file{gl/gc-gnulib.c} or @file{gl/gc-libgcrypt.c} as a starting pointer. @end itemize The following table summarize what the current objectives are (i.e., the todo list) and an estimate on how long it will take to implement the feature, including some reasonable startup-time to get familiar with Shishi in general. If you like to start working on anything, please let me know so work duplication can be avoided. @itemize @bullet @item Parse @file{/etc/krb5.keytab} to extract keys to use for telnetd etc (week) @item Cross-realm support (week). @item PKINIT (use libksba, weeks) @item Finish GSSAPI support via GSSLib (weeks) Shishi will not support GSSLib natively, but a separate project ``GSSLib'' is under way to produce a generic GSS implementation, and it will use Shishi to implement the Kerberos 5 mechanism. @item Port to cyclone (cyclone need to mature first) @item Modularize ASN.1 library so it can be replaced (days). Almost done, all ASN.1 functionality is found in lib/asn1.c, although the interface is rather libtasn1 centric. @item KDC (initiated, weeks) @item LDAP backend for Shisa. @item Set/Change password protocol (weeks?) @item Port applications to use Shishi (indefinite) @item Finish server-realm stuff @item Improve documentation @item Improve internationalization @item Add AP-REQ replay cache (week). @item Study benefits by introducing a PA-TGS-REP. This would provide mutual authentication of the KDC in a way that is easier to analyze. Currently the mutual authentication property is only implicit from successful decryption of the KDC-REP and the 4 byte nonce. @item GUI applet for managing tickets. This is supported via the ticket-applet, of which a Shishi port is published on the Shishi home page. @item Authorization library (months?) The shishi_authorized_p() is not a good solution, better would be to have a generic and flexible authorization library. Possibly based on S-EXP's in tickets? Should support non-Kerberos uses as well, of course. @item Proof read manual. @item X.500 support, including DOMAIN-X500-COMPRESS. I will accept patches that implement this, if it causes minimal changes to the current code. @end itemize @node Overview @section Overview This section describes RFC 1510 from a protocol point of view@footnote{The text is a lightly adapted version of the introduction section from RFC 1510 by J. Kohl and C. Neuman, September 1993, copyright likely owned by the RFC 1510 authors or some contributor.}. Kerberos provides a means of verifying the identities of principals, (e.g., a workstation user or a network server) on an open (unprotected) network. This is accomplished without relying on authentication by the host operating system, without basing trust on host addresses, without requiring physical security of all the hosts on the network, and under the assumption that packets traveling along the network can be read, modified, and inserted at will. (Note, however, that many applications use Kerberos' functions only upon the initiation of a stream-based network connection, and assume the absence of any "hijackers" who might subvert such a connection. Such use implicitly trusts the host addresses involved.) Kerberos performs authentication under these conditions as a trusted third- party authentication service by using conventional cryptography, i.e., shared secret key. (shared secret key - Secret and private are often used interchangeably in the literature. In our usage, it takes two (or more) to share a secret, thus a shared DES key is a secret key. Something is only private when no one but its owner knows it. Thus, in public key cryptosystems, one has a public and a private key.) The authentication process proceeds as follows: A client sends a request to the authentication server (AS) requesting "credentials" for a given server. The AS responds with these credentials, encrypted in the client's key. The credentials consist of 1) a "ticket" for the server and 2) a temporary encryption key (often called a "session key"). The client transmits the ticket (which contains the client's identity and a copy of the session key, all encrypted in the server's key) to the server. The session key (now shared by the client and server) is used to authenticate the client, and may optionally be used to authenticate the server. It may also be used to encrypt further communication between the two parties or to exchange a separate sub-session key to be used to encrypt further communication. The implementation consists of one or more authentication servers running on physically secure hosts. The authentication servers maintain a database of principals (i.e., users and servers) and their secret keys. Code libraries provide encryption and implement the Kerberos protocol. In order to add authentication to its transactions, a typical network application adds one or two calls to the Kerberos library, which results in the transmission of the necessary messages to achieve authentication. The Kerberos protocol consists of several sub-protocols (or exchanges). There are two methods by which a client can ask a Kerberos server for credentials. In the first approach, the client sends a cleartext request for a ticket for the desired server to the AS. The reply is sent encrypted in the client's secret key. Usually this request is for a ticket-granting ticket (TGT) which can later be used with the ticket-granting server (TGS). In the second method, the client sends a request to the TGS. The client sends the TGT to the TGS in the same manner as if it were contacting any other application server which requires Kerberos credentials. The reply is encrypted in the session key from the TGT. Once obtained, credentials may be used to verify the identity of the principals in a transaction, to ensure the integrity of messages exchanged between them, or to preserve privacy of the messages. The application is free to choose whatever protection may be necessary. To verify the identities of the principals in a transaction, the client transmits the ticket to the server. Since the ticket is sent "in the clear" (parts of it are encrypted, but this encryption doesn't thwart replay) and might be intercepted and reused by an attacker, additional information is sent to prove that the message was originated by the principal to whom the ticket was issued. This information (called the authenticator) is encrypted in the session key, and includes a timestamp. The timestamp proves that the message was recently generated and is not a replay. Encrypting the authenticator in the session key proves that it was generated by a party possessing the session key. Since no one except the requesting principal and the server know the session key (it is never sent over the network in the clear) this guarantees the identity of the client. The integrity of the messages exchanged between principals can also be guaranteed using the session key (passed in the ticket and contained in the credentials). This approach provides detection of both replay attacks and message stream modification attacks. It is accomplished by generating and transmitting a collision-proof checksum (elsewhere called a hash or digest function) of the client's message, keyed with the session key. Privacy and integrity of the messages exchanged between principals can be secured by encrypting the data to be passed using the session key passed in the ticket, and contained in the credentials. @node Cryptographic Overview @section Cryptographic Overview Shishi implements several of the standard cryptographic primitives. In this section we give the names of the supported encryption suites, and some notes about them, and their associated checksum suite. Statements such as ``it is weak'' should be read as meaning that there is no credible security analysis of the mechanism available, and/or that should an attack be published publicly, few people would likely be surprised. Also keep in mind that the key size mentioned is the actual key size, not the effective key space as far as a brute force attack is concerned. As you may infer from the descriptions, there is currently no encryption algorithm and only one checksum algorithm that inspire great confidence in its design. Hopefully this will change over time. @cindex DES @cindex 3DES @cindex AES @cindex ARCFOUR @table @code @item NULL @code{NULL} is a dummy encryption suite for debugging. Encryption and decryption are identity functions. No integrity protection. It is weak. It is associated with the @code{NULL} checksum. @item arcfour-hmac @itemx arcfour-hmac-exp @code{arcfour-hmac-*} are a proprietary stream cipher with 56 bit (@code{arcfour-hmac-exp}) or 128 bit (@code{arcfour-hmac}) keys, used in a proprietary way described in an expired IETF draft @file{draft-brezak-win2k-krb-rc4-hmac-04.txt}. Deriving keys from passwords is supported, and is done by computing a message digest (MD4) of a 16-bit Unicode representation of the ASCII password, with no salt. Data is integrity protected with a keyed hash (HMAC-MD5), where the key is derived from the base key in a creative way. It is weak. It is associated with the @code{arcfour-hmac-md5} checksum. @item des-cbc-none @code{des-cbc-none} is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. It is weak, because it offers no integrity protection. This is typically only used by RFC 1964 GSS-API implementations (which try to protect integrity using an ad-hoc solution). It is associated with the @code{NULL} checksum. @item des-cbc-crc @code{des-cbc-crc} is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using the key as IV (@pxref{Key as initialization vector}). The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted @code{CRC32}-like checksum. It is weak. It is associated with the @code{rsa-md5-des} checksum. @item des-cbc-md4 @code{des-cbc-md4} is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD4 hash. It is weak. It is associated with the @code{rsa-md4-des} checksum. @item des-cbc-md5 @code{des-cbc-md5} is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD5 hash. It is weak. It is associated with the @code{rsa-md5-des} checksum. This is the strongest RFC 1510 interoperable encryption mechanism. @item des3-cbc-none @code{des3-cbc-none} is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by the same algorithm as @code{des3-cbc-sha1-kd}. It is weak, because it offers no integrity protection. This is typically only used by GSS-API implementations (which try to protect integrity using an ad-hoc solution) for interoperability with some existing Kerberos GSS implementations. It is associated with the @code{NULL} checksum. @item des3-cbc-sha1-kd @code{des3-cbc-sha1-kd} is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by a algorithm based on the paper "A Better Key Schedule For DES-like Ciphers" @footnote{@url{http://www.research.att.com/~smb/papers/ides.pdf}} by Uri Blumenthal and Steven M. Bellovin (it is not clear if the algorithm, and the way it is used, is used by any other protocols, although it seems unlikely). Data is integrity protected with a keyed SHA1 hash in HMAC mode. It has no security proof, but is assumed to provide adequate security in the sense that knowledge on how to crack it is not known to the public. Note that the key derivation function is not widely used outside of Kerberos, hence not widely studied. It is associated with the @code{hmac-sha1-des3-kd} checksum. @item aes128-cts-hmac-sha1-96 @itemx aes256-cts-hmac-sha1-96 @code{aes128-cts-hmac-sha1-96} and @code{aes256-cts-hmac-sha1-96} is AES encryption and decryption with 128 bit and 256 bit key, respectively, and 16 byte blocks in CBC mode with Cipher Text Stealing. Cipher Text Stealing means data length of encrypted data is preserved (pure CBC add up to 7 pad characters). The keys can be derived from passwords with RSA Laboratories PKCS#5 Password Based Key Derivation Function 2@footnote{@url{http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/}}, which is allegedly provably secure in a random oracle model. Data is integrity protected with a keyed SHA1 hash, in HMAC mode, truncated to 96 bits. There is no security proof, but the schemes are assumed to provide adequate security in the sense that knowledge on how to crack them is not known to the public. Note that AES has yet to receive the test of time, and the AES cipher encryption mode (CBC with Ciphertext Stealing, and a non-standard IV output) is not widely standardized (hence not widely studied). It is associated with the @code{hmac-sha1-96-aes128} and @code{hmac-sha1-96-aes256} checksums, respectively. @end table The protocol do not include any way to negotiate which checksum mechanisms to use, so in most cases the associated checksum will be used. However, checksum mechanisms can be used with other encryption mechanisms, as long as they are compatible in terms of key format etc. Here are the names of the supported checksum mechanisms, with some notes on their status and the compatible encryption mechanisms. They are ordered by increased security as perceived by the author. @table @code @item NULL @code{NULL} is a dummy checksum suite for debugging. It provides no integrity. It is weak. It is compatible with the @code{NULL} encryption mechanism. @item arcfour-hmac-md5 @code{arcfour-hmac-md5} is a keyed HMAC-MD5 checksum computed on a MD5 message digest, in turn computed on a four byte message type indicator concatenated with the application data. (The @code{arcfour} designation is thus somewhat misleading, but since this checksum mechanism is described in the same document as the @code{arcfour} encryption mechanisms, it is not a completely unnatural designation.) It is weak. It is compatible with all encryption mechanisms. @item rsa-md4 @code{rsa-md4} is a unkeyed MD4 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms. @item rsa-md4-des @code{rsa-md4-des} is a DES CBC encryption of one block of random data and a unkeyed MD4 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the @code{des-cbc-crc}, @code{des-cbc-md4}, @code{des-cbc-md5} encryption mechanisms. @item rsa-md5 @code{rsa-md5} is a unkeyed MD5 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms. @item rsa-md5-des @code{rsa-md5-des} is a DES CBC encryption of one block of random data and a unkeyed MD5 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the @code{des-cbc-crc}, @code{des-cbc-md4}, @code{des-cbc-md5} encryption mechanisms. @item hmac-sha1-des3-kd @code{hmac-sha1-des3-kd} is a keyed SHA1 hash in HMAC mode computed over the message. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of @code{des3-cbc-sha1-kd}, which does not appear to be widely used outside Kerberos and hence not widely studied). It has no security proof, but is assumed to provide good security. The weakest part is likely the proprietary key derivation function. It is compatible with the @code{des3-cbc-sha1-kd} encryption mechanism. @item hmac-sha1-96-aes128 @itemx hmac-sha1-96-aes256 @code{hmac-sha1-96-aes*} are keyed SHA1 hashes in HMAC mode computed over the message and then truncated to 96 bits. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of @code{aes*-cts-hmac-sha1-96}, i.e., PKCS#5). It has no security proof, but is assumed to provide good security. It is compatible with the @code{aes*-cts-hmac-sha1-96} encryption mechanisms. @end table Several of the cipher suites have long names that can be hard to memorize. For your convenience, the following short-hand aliases exists. They can be used wherever the full encryption names are used. @table @code @item arcfour Alias for @code{arcfour-hmac}. @item des-crc Alias for @code{des-cbc-crc}. @item des-md4 Alias for @code{des-cbc-md4}. @item des-md5 @itemx des Alias for @code{des-cbc-md5}. @item des3 @itemx 3des Alias for @code{des3-cbc-sha1-kd}. @item aes128 Alias for @code{aes128-cts-hmac-sha1-96}. @item aes @itemx aes256 Alias for @code{aes256-cts-hmac-sha1-96}. @end table @node Supported Platforms @section Supported Platforms Shishi has at some point in time been tested on the following platforms. Online build reports for each platforms and Shishi version is available at @url{http://autobuild.josefsson.org/shishi/}. @enumerate @item Debian GNU/Linux 3.0 (Woody) @cindex Debian GCC 2.95.4 and GNU Make. This is the main development platform. @code{alphaev67-unknown-linux-gnu}, @code{alphaev6-unknown-linux-gnu}, @code{arm-unknown-linux-gnu}, @code{armv4l-unknown-linux-gnu}, @code{hppa-unknown-linux-gnu}, @code{hppa64-unknown-linux-gnu}, @code{i686-pc-linux-gnu}, @code{ia64-unknown-linux-gnu}, @code{m68k-unknown-linux-gnu}, @code{mips-unknown-linux-gnu}, @code{mipsel-unknown-linux-gnu}, @code{powerpc-unknown-linux-gnu}, @code{s390-ibm-linux-gnu}, @code{sparc-unknown-linux-gnu}, @code{sparc64-unknown-linux-gnu}. @item Debian GNU/Linux 2.1 @cindex Debian GCC 2.95.4 and GNU Make. @code{armv4l-unknown-linux-gnu}. @item Tru64 UNIX @cindex Tru64 Tru64 UNIX C compiler and Tru64 Make. @code{alphaev67-dec-osf5.1}, @code{alphaev68-dec-osf5.1}. @item SuSE Linux 7.1 @cindex SuSE GCC 2.96 and GNU Make. @code{alphaev6-unknown-linux-gnu}, @code{alphaev67-unknown-linux-gnu}. @item SuSE Linux 7.2a @cindex SuSE Linux GCC 3.0 and GNU Make. @code{ia64-unknown-linux-gnu}. @item SuSE Linux @cindex SuSE Linux GCC 3.2.2 and GNU Make. @code{x86_64-unknown-linux-gnu} (AMD64 Opteron ``Melody''). @item RedHat Linux 7.2 @cindex RedHat GCC 2.96 and GNU Make. @code{alphaev6-unknown-linux-gnu}, @code{alphaev67-unknown-linux-gnu}, @code{ia64-unknown-linux-gnu}. @item RedHat Linux 8.0 @cindex RedHat GCC 3.2 and GNU Make. @code{i686-pc-linux-gnu}. @item RedHat Advanced Server 2.1 @cindex RedHat Advanced Server GCC 2.96 and GNU Make. @code{i686-pc-linux-gnu}. @item Slackware Linux 8.0.01 @cindex RedHat GCC 2.95.3 and GNU Make. @code{i686-pc-linux-gnu}. @item Mandrake Linux 9.0 @cindex Mandrake GCC 3.2 and GNU Make. @code{i686-pc-linux-gnu}. @item IRIX 6.5 @cindex IRIX MIPS C compiler, IRIX Make. @code{mips-sgi-irix6.5}. @item AIX 4.3.2 @cindex AIX IBM C for AIX compiler, AIX Make. @code{rs6000-ibm-aix4.3.2.0}. @c @item Microsoft Windows 2000 (Cygwin) @c @cindex Windows @c @c GCC 3.2, GNU make. @code{i686-pc-cygwin}. @item HP-UX 11 @cindex HP-UX HP-UX C compiler and HP Make. @code{ia64-hp-hpux11.22}, @code{hppa2.0w-hp-hpux11.11}. @item SUN Solaris 2.8 @cindex Solaris Sun WorkShop Compiler C 6.0 and SUN Make. @code{sparc-sun-solaris2.8}. @item NetBSD 1.6 @cindex NetBSD GCC 2.95.3 and GNU Make. @code{alpha-unknown-netbsd1.6}, @code{i386-unknown-netbsdelf1.6}. @item OpenBSD 3.1 and 3.2 @cindex OpenBSD GCC 2.95.3 and GNU Make. @code{alpha-unknown-openbsd3.1}, @code{i386-unknown-openbsd3.1}. @item FreeBSD 4.7 and 4.8 @cindex FreeBSD GCC 2.95.4 and GNU Make. @code{alpha-unknown-freebsd4.7}, @code{alpha-unknown-freebsd4.8}, @code{i386-unknown-freebsd4.7}, @code{i386-unknown-freebsd4.8}. @item MacOS X 10.2 Server Edition @cindex MacOS X GCC 3.1 and GNU Make. @code{powerpc-apple-darwin6.5}. @item Cross compiled to uClinux/uClibc on Motorola Coldfire. @cindex Motorola Coldfire @cindex uClinux @cindex uClibc GCC 3.4 and GNU Make @code{m68k-uclinux-elf}. @end enumerate If you use Shishi on, or port Shishi to, a new platform please report it to the author (@pxref{Bug Reports}). @node Getting help @section Getting help A mailing list where users of Shishi may help each other exists, and you can reach it by sending e-mail to @email{help-shishi@@gnu.org}. Archives of the mailing list discussions, and an interface to manage subscriptions, is available through the World Wide Web at @url{http://lists.gnu.org/mailman/listinfo/help-shishi}. @node Commercial Support @section Commercial Support Commercial support is available for users of Shishi. The kind of support that can be purchased may include: @itemize @item Implement new features. Such as support for some optional part of the Kerberos standards, e.g. PKINIT, hardware token authentication. @item Port Shishi to new platforms. This could include porting Shishi to an embedded platforms that may need memory or size optimization. @item Integrate Kerberos 5 support in your existing project. @item System design of components related to Kerberos 5. @end itemize If you are interested, please write to: @verbatim Simon Josefsson Datakonsult Hagagatan 24 113 47 Stockholm Sweden E-mail: simon@josefsson.org @end verbatim If your company provides support related to Shishi and would like to be mentioned here, contact the author (@pxref{Bug Reports}). @node Downloading and Installing @section Downloading and Installing @cindex Installation @cindex Download The package can be downloaded from several places, including: @url{ftp://alpha.gnu.org/pub/gnu/shishi/} The latest version is stored in a file, e.g., @samp{shishi-@value{VERSION}.tar.gz} where the @samp{@value{VERSION}} indicate the highest version number. The package is then extracted, configured and built like many other packages that use Autoconf. For detailed information on configuring and building it, refer to the @file{INSTALL} file that is part of the distribution archive. Here is an example terminal session that download, configure, build and install the package. You will need a few basic tools, such as @samp{sh}, @samp{make} and @samp{cc}. @example $ wget -q ftp://alpha.gnu.org/pub/gnu/shishi/shishi-@value{VERSION}.tar.gz $ tar xfz shishi-@value{VERSION}.tar.gz $ cd shishi-@value{VERSION}/ $ ./configure ... $ make ... $ make install ... @end example After this you should be prepared to continue with the user, administration or programming manual, depending on how you want to use Shishi. A few @code{configure} options may be relevant, summarized in the table. @table @code @item --disable-des @itemx --disable-3des @itemx --disable-aes @itemx --disable-md @itemx --disable-null @itemx --disable-arcfour Disable a cryptographic algorithm at compile time. Usually it is better to disable algorithms during run-time with the configuration file, but this allows you to reduce the code size slightly. @item --disable-starttls Disable the experimental TLS support for KDC connections. If you do not use a Shishi KDC, this support is of no use so you could safely disable it. @item --without-stringprep Disable internationalized string processing. @end table For the complete list, refer to the output from @code{configure --help}. @node Bug Reports @section Bug Reports @cindex Reporting Bugs If you think you have found a bug in Shishi, please investigate it and report it. @itemize @bullet @item Please make sure that the bug is really in Shishi, and preferably also check that it hasn't already been fixed in the latest version. @item You have to send us a test case that makes it possible for us to reproduce the bug. @item You also have to explain what is wrong; if you get a crash, or if the results printed are not good and in that case, in what way. Make sure that the bug report includes all information you would need to fix this kind of bug for someone else. @end itemize Please make an effort to produce a self-contained report, with something definite that can be tested or debugged. Vague queries or piecemeal messages are difficult to act on and don't help the development effort. If your bug report is good, we will do our best to help you to get a corrected version of the software; if the bug report is poor, we won't do anything about it (apart from asking you to send better bug reports). If you think something in this manual is unclear, or downright incorrect, or if the language needs to be improved, please also send a note. Send your bug report to: @center @samp{bug-shishi@@josefsson.org} @node Contributing @section Contributing @cindex Contributing @cindex Hacking If you want to submit a patch for inclusion -- from solve a typo you discovered, up to adding support for a new feature -- you should submit it as a bug report (@pxref{Bug Reports}). There are some things that you can do to increase the chances for it to be included in the official package. Unless your patch is very small (say, under 10 lines) we require that you assign the copyright of your work to the Free Software Foundation. This is to protect the freedom of the project. If you have not already signed papers, we will send you the necessary information when you submit your contribution. For contributions that doesn't consist of actual programming code, the only guidelines are common sense. Use it. For code contributions, a number of style guides will help you: @itemize @bullet @item Coding Style. Follow the GNU Standards document (@pxref{top, GNU Coding Standards,, standards}). If you normally code using another coding standard, there is no problem, but you should use @samp{indent} to reformat the code (@pxref{top, GNU Indent,, indent}) before submitting your work. @item Use the unified diff format @samp{diff -u}. @item Return errors. The only valid reason for ever aborting the execution of the program is due to memory allocation errors, but for that you should call @samp{shishi_xalloc_die} to allow the application to recover if it wants to. @item Design with thread safety in mind. Don't use global variables. Don't even write to per-handle global variables unless the documented behaviour of the function you write is to write to the per-handle global variable. @item Avoid using the C math library. It causes problems for embedded implementations, and in most situations it is very easy to avoid using it. @item Document your functions. Use comments before each function headers, that, if properly formatted, are extracted into Texinfo manuals and GTK-DOC web pages. @item Supply a ChangeLog and NEWS entries, where appropriate. @end itemize @c ********************************************************** @c ******************** User Manual ********************** @c ********************************************************** @node User Manual @chapter User Manual @cindex End-user Shishi usage Usually Shishi interacts with you to get some initial authentication information like a password, and then contacts a server to receive a so called ticket granting ticket. From now on, you rarely interact with Shishi directly. Applications that need security services instruct the Shishi library to use the ticket granting ticket to get new tickets for various servers. An example could be if you log on to a host remotely via @samp{telnet}. The host usually requires authentication before permitting you in. The @samp{telnet} client uses the ticket granting ticket to get a ticket for the server, and then uses this ticket to authenticate you against the server (typically the server is also authenticated to you). You perform the initial authentication by typing @command{shishi} at the prompt. Sometimes it is necessary to supply options telling Shishi what your principal name (user name in the Kerberos realm) or your realm is. In the example, I specify the client name @code{simon@@JOSEFSSON.ORG}. @example $ shishi simon@@JOSEFSSON.ORG Enter password for `simon@@JOSEFSSON.ORG': simon@@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:44:49 2003 Endtime: Fri Aug 15 05:01:29 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: INITIAL (512) $ @end example As you can see, Shishi also prints a short description of the ticket received. A logical next step is to display all tickets you have received. By the way, the tickets are usually stored as text in @file{~/.shishi/tickets}. This is achieved by typing @command{shishi --list}. @example $ shishi --list Tickets in `/home/jas/.shishi/tickets': jas@@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: krbtgt/JOSEFSSON.ORG key des-cbc-md5 (3) Ticket key: des-cbc-md5 (3) protected by des-cbc-md5 (3) Ticket flags: INITIAL (512) jas@@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Starttime: Fri Aug 15 04:49:49 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: host/latte.josefsson.org key des-cbc-md5 (3) Ticket key: des-cbc-md5 (3) protected by des-cbc-md5 (3) 2 tickets found. $ @end example As you can see, I had a ticket for the server @samp{host/latte.josefsson.org} which was generated by @samp{telnet}:ing to that host. If, for some reason, you want to manually get a ticket for a specific server, you can use the @command{shishi --server-name} command. Normally, however, the application that uses Shishi will take care of getting a ticket for the appropriate server, so you normally wouldn't need to issue this command. @example $ shishi --server-name=user/billg --encryption-type=des-cbc-md4 jas@@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Starttime: Fri Aug 15 04:54:33 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: user/billg key des-cbc-md4 (2) Ticket key: des-cbc-md4 (2) protected by des-cbc-md5 (3) $ @end example As you can see, I acquired a ticket for @samp{user/billg} with a @samp{des-cbc-md4} (@pxref{Cryptographic Overview}) encryption key specified with the @samp{--encryption-type} parameter. To wrap up this introduction, let us see how you can remove tickets. You may want to do this if you leave your terminal for lunch or similar, and don't want someone to be able to copy the file and then use your credentials. Note that this only destroys the tickets locally, it does not contact any server telling that these credentials are no longer valid. So, if someone stole your ticket file, you must still contact your administrator and have them reset your account. Simply using this switch is not sufficient. @example $ shishi --server-name=imap/latte.josefsson.org --destroy 1 ticket removed. $ shishi --server-name=foobar --destroy No tickets removed. $ shishi --destroy 3 tickets removed. $ @end example Since the @samp{--server-name} parameter takes a long string to type, it is possible to type the server name directly, after the client name. The following example demonstrates an AS-REQ followed by a TGS-REQ for a specific server (assuming you did not have any tickets to begin with). @example $ src/shishi simon@@latte.josefsson.org imap/latte.josefsson.org Enter password for `simon@@latte.josefsson.org': simon@@latte.josefsson.org: Acquired: Wed Aug 27 17:21:06 2003 Expires: Wed Aug 27 17:37:46 2003 Server: imap/latte.josefsson.org key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (12) $ @end example Refer to the reference manual for all available parameters (@pxref{Parameters for shishi}). The rest of this section contains descriptions of more specialized usage modes that can be ignored by most users. @section Proxiable and Proxy Tickets At times it may be necessary for a principal to allow a service to perform an operation on its behalf. The service must be able to take on the identity of the client, but only for a particular purpose. A principal can allow a service to take on the principal's identity for a particular purpose by granting it a proxy. The process of granting a proxy using the proxy and proxiable flags is used to provide credentials for use with specific services. Though conceptually also a proxy, users wishing to delegate their identity in a form usable for all purpose MUST use the ticket forwarding mechanism described in the next section to forward a ticket-granting ticket. The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket. This flag allows a client to pass a proxy to a server to perform a remote request on its behalf (e.g. a print service client can give the print server a proxy to access the client's files on a particular file server in order to satisfy a print request). In order to complicate the use of stolen credentials, Kerberos tickets are usually valid from only those network addresses specifically included in the ticket[4]. When granting a proxy, the client MUST specify the new network address from which the proxy is to be used, or indicate that the proxy is to be issued for use from any address. The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail. Here is how you would acquire a PROXY ticket for the service @samp{imap/latte.josefsson.org}: @example $ shishi jas@@JOSEFSSON.ORG imap/latte.josefsson.org --proxy Enter password for `jas@@JOSEFSSON.ORG': libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:02:35 2003 Starttime: Mon Sep 8 20:02:36 2003 Endtime: Tue Sep 9 04:02:35 2003 Server: imap/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXY (16) $ @end example As you noticed, this asked for your password. The reason is that proxy tickets must be acquired using a proxiable ticket granting ticket, which was not present. If you often need to get proxy tickets, you may acquire a proxiable ticket granting ticket from the start: @example $ shishi --proxiable Enter password for `jas@@JOSEFSSON.ORG': jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:04:27 2003 Endtime: Tue Sep 9 04:04:27 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXIABLE INITIAL (520) @end example Then you should be able to acquire proxy tickets based on that ticket granting ticket, as follows: @example $ shishi jas@@JOSEFSSON.ORG imap/latte.josefsson.org --proxy libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:04:27 2003 Starttime: Mon Sep 8 20:04:32 2003 Endtime: Tue Sep 9 04:04:27 2003 Server: imap/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXY (16) $ @end example @section Forwardable and Forwarded Tickets Authentication forwarding is an instance of a proxy where the service that is granted is complete use of the client's identity. An example where it might be used is when a user logs in to a remote system and wants authentication to work from that system as if the login were local. The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket. This flag allows for authentication forwarding without requiring the user to enter a password again. If the flag is not set, then authentication forwarding is not permitted, but the same result can still be achieved if the user engages in the AS exchange specifying the requested network addresses and supplies a password. The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets. If addressless tickets are forwarded from one system to another, clients SHOULD still use this option to obtain a new TGT in order to have different session keys on the different systems. Here is how you would acquire a FORWARDED ticket for the service @samp{host/latte.josefsson.org}: @example $ shishi jas@@JOSEFSSON.ORG host/latte.josefsson.org --forwarded Enter password for `jas@@JOSEFSSON.ORG': libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:07:11 2003 Starttime: Mon Sep 8 20:07:12 2003 Endtime: Tue Sep 9 04:07:11 2003 Server: host/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDED (4) $ @end example As you noticed, this asked for your password. The reason is that forwarded tickets must be acquired using a forwardable ticket granting ticket, which was not present. If you often need to get forwarded tickets, you may acquire a forwardable ticket granting ticket from the start: @example $ shishi --forwardable Enter password for `jas@@JOSEFSSON.ORG': jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:08:53 2003 Endtime: Tue Sep 9 04:08:53 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDABLE INITIAL (514) $ @end example Then you should be able to acquire forwarded tickets based on that ticket granting ticket, as follows: @example $ shishi jas@@JOSEFSSON.ORG host/latte.josefsson.org --forwarded libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:08:53 2003 Starttime: Mon Sep 8 20:08:57 2003 Endtime: Tue Sep 9 04:08:53 2003 Server: host/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDED (4) $ @end example @c ********************************************************** @c **************** Administration Manual ***************** @c ********************************************************** @node Administration Manual @chapter Administration Manual Here you will learn how to set up, run and maintain the Shishi Kerberos server. Kerberos is incompatible with the standard Unix @file{/etc/passwd} password database@footnote{And besides, Shishi is intended to work on non-Unix platforms as well.}, therefore the first step will be to create a Kerberos user database. Shishi's user database system is called Shisa. Once Shisa has been configured, you can then start the server and begin issuing Kerberos tickets to your users. The Shishi server is called @file{shishid}. After getting the server up and running, we discuss how you can set up multiple Kerberos servers, to increase availability or offer load-balancing. Finally, we include some information intended for developers, that will enable you to customize Shisa to use an external user database, such as a LDAP server or SQL database. @menu * Introduction to Shisa:: Explanation of the Shishi user database. * Configuring Shisa:: Define the user database in Shisa. * Using Shisa:: How to add realms and principals to database. * Starting Shishid:: Issue Kerberos tickets to your users. * Configuring DNS for KDC:: Placing the KDC address in DNS is useful. * Kerberos via TLS:: How to setup Shishi to use TLS. * Multiple servers:: High availability and load-balancing. * Developer information:: Writing your own Shisa database backend. @end menu @node Introduction to Shisa @section Introduction to Shisa The user database part of Shishi is called Shisa. The Shisa library is independent of the core Shishi library. Shisa is responsible for storing the name of your realms, the name of your principals (users), accounting information for the users (i.e., when each account starts to be valid and when it expires), and the cryptographic keys each user has. Some Kerberos internal data can also be stored, such as the key version number, the last dates for when various ticket requests were made, the cryptographic salt, string-to-key parameters and password for each user. Not all information need to be stored. For example, in some situations it is prudent to leave the password field empty, so that somebody who manages to steal the user database will only be able to compromise your system, and not any other systems were your user may have re-used the same password. On the other hand, you may already be storing the password in your customized database, in which case being able to change it via the Shisa interface can be useful. Shisa is a small (a few thousand lines of C code) standalone library. Shisa does not depend on the Shishi library. Because a user database with passwords may be useful for other applications as well (e.g., GNU SASL), it might be separated into its own project later on. You should keep this in mind, so that you don't consider writing a Shisa backend for your own database as a purely Shishi specific project. You can, for example, choose to use the Shisa interface in your own applications to have a simple interface to your user database. Your experience and feedback is appreciated if you have chosen to explore this. Note that the Shisa database does not expose everything you may want to know about a user, such as its full human name, telephone number or even the user's login account name or home directory. It only stores what is needed to authenticate a peer claiming to be an entity. Thus it does not make sense to replace your current user database or @file{/etc/passwd} with data derived from the Shisa database. Instead, it is intended that you write a Shisa backend that exports @i{some} of the information stored in your user database. You may be able to replace some existing functionality, such as the password field in @file{/etc/passwd} with a Kerberos PAM module, but there is no requirement for doing so. @node Configuring Shisa @section Configuring Shisa The configuration file for Shisa is typically stored in @file{/usr/local/etc/shishi/shisa.conf}. You do not have to modify this file, the defaults should be acceptable to first-time users. The file is used to define where your user database resides, and some options such as making the database read-only, or whether errors detected when accessing the database should be ignored. (The latter could be useful if the server is a remote LDAP server that might be unavailable, and then you would want to fall back to a local copy of the database.) The default will store the user database using directories and files, rooted by default in @file{/usr/local/var/shishi}. You can use standard file permission settings to control access to the directory hierarchy. It is strongly recommended to restrict access to the directory. Storing the directory on local storage, i.e., hard disk or removable media, is recommended. We discourage placing the database on a network file system, but realize this can be useful in some situations (@pxref{Multiple servers}). See the reference manual (@pxref{Shisa Configuration}) for the details of the configuration file. Again, you are not expected to need to modify anything unless you are an experienced Shishi administrator. @node Using Shisa @section Using Shisa There is a command line interface to the Shisa library, aptly named @file{shisa}. You will use this tool to add, remove, and change information stored in the database about realms, principals, and keys. The tool can also be used to ``dump'' all information in the database, for backup or debugging purposes. (Currently the output format cannot be read by any tool, but functionality to do this will be added in the future, possibly as a read-only file-based Shisa database backend.) The reference manual (@pxref{Parameters for shisa}) explains all parameters, but here we will give you a walk-through of the typical uses of the tool. Installing Shishi usually creates a realm with two principals: one ticket granting ticket for the realm, and one host key for the server. This is what you typically need to get started, but it doesn't serve our purposes, so we start by removing the principals and the realm. To do that, we need to figure out the name of the realm. The @samp{--list} or @samp{--dump} parameters can be used for this. (Most ``long'' parameters, like @samp{--dump}, have shorter names as well, in this case @samp{-d}, @ref{Parameters for shisa}). @example jas@@latte:~$ shisa -d latte krbtgt/latte Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt lattekrbtgt/latte. host/latte Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt lattehost/latte. jas@@latte:~$ @end example The realm names are printed at column 0, the principal names are indented with one @samp{TAB} character (aka @samp{\t} or ASCII 0x09 Horizontal Tabulation), and the information about each principal is indented with two @samp{TAB} characters. The above output means that there is one realm @samp{latte} with two principals: @samp{krbtgt/latte} (which is used to authenticate Kerberos ticket requests) and @samp{host/latte} (used to authenticate host-based applications like Telnet). They were created during @samp{make install} on a host called @samp{latte}. If the installation did not create a default database for you, you might get an error similar to the following output. @example jas@@latte:~$ shisa -d shisa: Cannot initialize `file' database backend. Location `/usr/local/var/shishi' and options `N/A'. shisa: Initialization failed: Shisa database could not be opened. jas@@latte:~$ @end example This indicates that the database does not exist. For a file database, you can create it simply by creating the directory, as follows. Note the access permission change with @samp{chmod}. Typically the @samp{root} user would own the files, but as these examples demonstrate, setting up a Kerberos server does not require root access. Indeed, it may be prudent to run all Shishi applications as a special non-@samp{root} user, and have all Shishi related files owned by that user, so that any security vulnerabilities do not lead to a system compromise. (However, if the user database is ever stolen, system compromises of other systems may be inoccured, should you use, e.g., a kerberized Telnet.) @example jas@@latte:~$ mkdir /usr/local/var/shishi jas@@latte:~$ chmod go-rwx /usr/local/var/shishi @end example Back to the first example, where you have a realm @samp{latte} with some principals. We want to remove the realm to demonstrate how you create the realm from scratch. (Of course, you can have more than one realm in the database, but for this example we assume you want to set up a realm named the same as Shishi guessed you would name it, so the existing realm need to be removed first.) The @samp{--remove} (short form @samp{-r}) parameter is used for this purpose, as follows. @example jas@@latte:~$ shisa -r latte host/latte Removing principal `host/latte@@latte'... Removing principal `host/latte@@latte'...done jas@@latte:~$ shisa -r latte krbtgt/latte Removing principal `krbtgt/latte@@latte'... Removing principal `krbtgt/latte@@latte'...done jas@@latte:~$ shisa -r latte Removing realm `latte'... Removing realm `latte'...done jas@@latte:~$ @end example You may be asking yourself ``What if the realm has many more principals?''. If you fear manual labor (or a small @samp{sed} script, recall the format of @samp{--list}?), don't worry, there is a @samp{--force} (short form @samp{-f}) flag. Use it with care. Here is a faster way to do the above: @example jas@@latte:~$ shisa -r latte -f Removing principal `krbtgt/latte@@latte'... Removing principal `krbtgt/latte@@latte'...done Removing principal `host/latte@@latte'... Removing principal `host/latte@@latte'...done Removing realm `latte'... Removing realm `latte'...done jas@@latte:~$ @end example You should now have a working, but empty, Shisa database. Let's set up the realm manually, step by step. The first step is to decide on a name for your realm. The full story is explained elsewhere (@pxref{Realm and Principal Naming}), but the short story is to take your DNS domain name and translate it to upper case. For example, if your organization uses @code{example.org} it is a good idea to use @code{EXAMPLE.ORG} as the name of your Kerberos realm. We'll use @code{EXAMPLE.ORG} as the realm name in these examples. Let's create the realm. @example jas@@latte:~$ shisa -a EXAMPLE.ORG Adding realm `EXAMPLE.ORG'... Adding realm `EXAMPLE.ORG'...done jas@@latte:~$ @end example Currently, there are no properties associated with entire realms. In the future, it may be possible to set a default realm-wide password expiry policy or similar. Each realm normally has one principal that is used for authenticating against the ``ticket granting service'' on the Kerberos server with a ticket instead of using the password. This is used by the user when she acquire a ticket for a server. The principal must look like @samp{krbtgt/REALM} (@pxref{krbtgt,,Name of the TGS}). Let's create it. @example jas@@latte:~$ shisa -a EXAMPLE.ORG krbtgt/EXAMPLE.ORG Adding principal `krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG'... Adding principal `krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG'...done jas@@latte:~$ @end example Now that wasn't difficult, although not very satisfying either. What does adding a principal mean? The name is created, obviously, but it also means setting a few values in the database. Let's view the entry to find out which values. @example jas@@latte:~$ shisa -d EXAMPLE.ORG krbtgt/EXAMPLE.ORG Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt EXAMPLE.ORGkrbtgt/EXAMPLE.ORG. jas@@latte:~$ @end example To use host based security services like SSH or Telnet with Kerberos, each host must have a key shared between the host and the KDC. The key is typically stored in @file{/usr/local/etc/shishi/shishi.keys}. We assume your server is called @samp{mail.example.org} and we create the principal. To illustrate a new parameter, we also set the specific algorithm to use by using the @samp{--encryption-type} (short form @samp{-E}) parameter. @example jas@@latte:~$ shisa -a EXAMPLE.ORG host/mail.example.org -E des3 Adding principal `host/mail.example.org@@EXAMPLE.ORG'... Adding principal `host/mail.example.org@@EXAMPLE.ORG'...done jas@@latte:~$ @end example To export the key, there is another Shisa parameter @samp{--keys} that will print the key in a format that is recognized by Shishi. Let's use it to print the host key. @example jas@@latte:~$ shisa -d --keys EXAMPLE.ORG host/mail.example.org EXAMPLE.ORG host/mail.example.org Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des3-cbc-sha1-kd (0x10, 16). -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: host/mail.example.org Realm: EXAMPLE.ORG iQdA8hxdvOUHZNliZJv7noM02rXHV8gq -----END SHISHI KEY----- Salt EXAMPLE.ORGhost/mail.example.org. jas@@latte:~$ @end example So to set up the host, simply redirect output to the host key file. @example jas@@latte:~$ shisa -d --keys EXAMPLE.ORG \ host/mail.example.org >> /usr/local/etc/shishi/shishi.keys jas@@latte:~$ @end example The next logical step is to create a principal for some user, so you can use your password to get a Ticket Granting Ticket via the Authentication Service (AS) from the KDC, and then use the Ticket Granting Service (TGS) from the KDC to get a ticket for a specific host, and then send that ticket to the host to authenticate yourself. Creating this end-user principle is slightly different from the earlier steps, because you want the key to be derived from a password instead of being a random key. The @samp{--password} parameter indicate this. This make the tool ask you for the password. @example jas@@latte:~$ shisa -a EXAMPLE.ORG simon --password Password for `simon@@EXAMPLE.ORG': Adding principal `simon@@EXAMPLE.ORG'... Adding principal `simon@@EXAMPLE.ORG'...done jas@@latte:~$ @end example The only special thing about this principal now is that it has a @code{password} field set in the database. @example jas@@latte:~$ shisa -d EXAMPLE.ORG simon --keys EXAMPLE.ORG simon Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). -----BEGIN SHISHI KEY----- Keytype: 18 (aes256-cts-hmac-sha1-96) Principal: simon Realm: EXAMPLE.ORG Ja7ciNtrAI3gtodLaVDQ5zhcH58ffk0kS5tGAM7ILvM= -----END SHISHI KEY----- Salt EXAMPLE.ORGsimon. Password foo. jas@@latte:~$ @end example You should now be ready to start the KDC, which is explained in the next section (@pxref{Starting Shishid}), and get tickets as explained earlier (@pxref{User Manual}). @node Starting Shishid @section Starting Shishid The Shishi server, or Key Distribution Center (KDC), is called Shishid. Shishid is responsible for listening on UDP and TCP ports for Kerberos requests. Currently it can handle initial ticket requests (Authentication Service, or AS), typically authenticated with keys derived from passwords, and subsequent ticket requests (Ticket Granting Service, or TGS), typically authenticated with the key acquired during an AS exchange. Currently there is very little configuration available, the only variables are which ports the server should listen on and an optional user name to @code{setuid} into after successfully listening to the ports. By default, Shishid listens on the @samp{kerberos} service port (typically translated to 88 via @file{/etc/services}) on the UDP and TCP transports via IPv4 and (if your machine support it) IPv6 on all interfaces on your machine. Here is a typical startup. @example latte:/home/jas/src/shishi# /usr/local/sbin/shishid Initializing GNUTLS... Initializing GNUTLS...done Listening on IPv4:*:kerberos/udp...done Listening on IPv4:*:kerberos/tcp...done Listening on IPv6:*:kerberos/udp...failed socket: Address family not supported by protocol Listening on IPv6:*:kerberos/tcp...failed socket: Address family not supported by protocol Listening on 2 ports... @end example Running as root is not recommended. Any security problem in shishid and your host may be compromised. Therefor, we recommend using the @samp{--setuid} parameter, as follows. @example latte:/home/jas/src/shishi# /usr/local/sbin/shishid --setuid=jas Initializing GNUTLS... Initializing GNUTLS...done Listening on IPv4:*:kerberos/udp...done Listening on IPv4:*:kerberos/tcp...done Listening on IPv6:*:kerberos/udp...failed socket: Address family not supported by protocol Listening on IPv6:*:kerberos/tcp...failed socket: Address family not supported by protocol Listening on 2 ports... User identity set to `jas' (22541)... @end example An alternative is to run shishid on an alternative port as a non-privileged user. To continue the example of setting up the @code{EXAMPLE.ORG} realm as a non-privileged user from the preceding section, we start the server listen on port 4711 via UDP on IPv4. @example jas@@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/udp Initializing GNUTLS... Initializing GNUTLS...done Listening on *:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on *:4711/tcp socket 4 @end example If you have set up the Shisa database as in the previous example, you can now acquire tickets as follows. @example jas@@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \ simon@@EXAMPLE.ORG Enter password for `simon@@EXAMPLE.ORG': simon@@EXAMPLE.ORG: Authtime: Fri Dec 12 01:41:01 2003 Endtime: Fri Dec 12 01:57:41 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE RENEWABLE INITIAL (12) jas@@latte:~$ @end example The output from Shishid on a successful invocation would look like: @example shishid: Has 131 bytes from *:4711/udp on socket 4 shishid: Processing 131 from *:4711/udp on socket 4 shishid: Trying AS-REQ shishid: AS-REQ from simon@@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for *:4711/udp on socket 4 shishid: Sending 511 bytes to *:4711/udp socket 4 via UDP shishid: Listening on *:4711/udp socket 4 @end example You may use the '-v' parameter for Shishid and Shishi to generate more debugging information. To illustrate what an application, such as the Shishi patched versions of GNU lsh or Telnet from GNU InetUtils, would do when contacting the host @samp{mail.example.org} we illustrate using the TGS service as well. @example jas@@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \ simon@@EXAMPLE.ORG host/mail.example.org simon@@EXAMPLE.ORG: Authtime: Fri Dec 12 01:46:54 2003 Endtime: Fri Dec 12 02:03:34 2003 Server: host/mail.example.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (45398796) jas@@latte:~$ @end example This conclude our walk-through of setting up a new Kerberos realm using Shishi. It is quite likely that one or more steps failed, and if so we encourage you to debug it and submit a patch, or at least report it as a problem. Heck, even letting us know if you got this far would be of interest. @xref{Bug Reports}. @node Configuring DNS for KDC @section Configuring DNS for KDC Making sure the configuration files on all hosts running Shishi clients include the addresses of your server is tedious. If the configuration files do not mention the KDC address for a realm, Shishi will try to look up the information from DNS. In order for Shishi to find that information, you need to add the information to DNS. For this to work well, you need to set up a DNS zone with the same name as your Kerberos realm. The easiest is if you own the publicly visible DNS name, such as @samp{example.org} if your realm is @samp{EXAMPLE.ORG}, but you can set up an internal DNS server with the information for your realm only. If this is done, you do not need to keep configuration files updated for the KDC addressing information. @subsection DNS vs. Kerberos - Case Sensitivity of Realm Names In Kerberos, realm names are case sensitive. While it is strongly encouraged that all realm names be all upper case this recommendation has not been adopted by all sites. Some sites use all lower case names and other use mixed case. DNS on the other hand is case insensitive for queries but is case preserving for responses to TXT queries. Since "MYREALM", "myrealm", and "MyRealm" are all different it is necessary that only one of the possible combinations of upper and lower case characters be used. This restriction may be lifted in the future as the DNS naming scheme is expanded to support non-ASCII names. @subsection Overview - KDC location information KDC location information is to be stored using the DNS SRV RR [RFC 2052]. The format of this RR is as follows: Service.Proto.Realm TTL Class SRV Priority Weight Port Target The Service name for Kerberos is always "_kerberos". The Proto can be either "_udp", "_tcp", or "_tls._tcp". If these SRV records are to be used, a "_udp" record MUST be included. If the Kerberos implementation supports TCP transport, a "_tcp" record MUST be included. When using "_tcp" with "_kerberos", this indicates a "raw" TCP connection without any additional encapsulation. A "_tls._tcp" record MUST be specified for all Kerberos implementations that support communication with the KDC across TCP sockets encapsulated using TLS [RFC2246] (@pxref{STARTTLS protected KDC exchanges}). The Realm is the Kerberos realm that this record corresponds to. TTL, Class, SRV, Priority, Weight, and Target have the standard meaning as defined in RFC 2052. As per RFC 2052 the Port number should be the value assigned to "kerberos" by the Internet Assigned Number Authority (88). @subsection Example - KDC location information These are DNS records for a Kerberos realm ASDF.COM. It has two Kerberos servers, kdc1.asdf.com and kdc2.asdf.com. Queries should be directed to kdc1.asdf.com first as per the specified priority. Weights are not used in these records. @example _kerberos._udp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._udp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. _kerberos._tcp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._tcp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. _kerberos._tls._tcp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._tls._tcp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. @end example @subsection Security considerations As DNS is deployed today, it is an unsecure service. Thus the infor- mation returned by it cannot be trusted. Current practice for REALM to KDC mapping is to use hostnames to indicate KDC hosts (stored in some implementation-dependent location, but generally a local config file). These hostnames are vulnerable to the standard set of DNS attacks (denial of service, spoofed entries, etc). The design of the Kerberos protocol limits attacks of this sort to denial of service. However, the use of SRV records does not change this attack in any way. They have the same vulnerabilities that already exist in the common practice of using hostnames for KDC locations. Implementations SHOULD provide a way of specifying this information locally without the use of DNS. However, to make this feature worthwhile a lack of any configuration information on a client should be interpretted as permission to use DNS. @node Kerberos via TLS @section Kerberos via TLS @cindex GNUTLS @cindex TLS @cindex STARTTLS If Shishi is built with support for GNUTLS, the messages exchanged between clients and Shishid can be protected with TLS. TLS is only available over TCP connections. A full discussion of the features TLS have is out of scope here, but in short it means the communication is integrity and privacy protected, and that users can use OpenPGP, X.509 or SRP (i.e., any mechanism supported by TLS) to authenticate themselves to the Kerberos server. For details on the implementation, @xref{STARTTLS protected KDC exchanges}. @subsection Setting up TLS resume @cindex tls resume Resuming earlier TLS session is supported and enabled by default. This improves the speed of the TLS handshake, because results from earlier negotiations can be re-used. Currently the TLS resume database is stored in memory (in constract to storing it on disk), in both the client and in the server. Because the server typically runs for a long time, this is not a problem for that side. The client is typically not a long-running process though; the client usually is invoked as part of applications like @samp{telnet} or @samp{login}. However, because each use of the client library typically result in a ticket, which is stored on disk and re-used by later processes, this is likely not a serious problem because the number of different tickets required by a user is usually quite small. For the client, TLS resume is typically only useful when you perform an initial authentication (using a password) followed by a ticket request for a service, in the same process. You can configure the server, @samp{shishid} to never use TLS resume, or to increase or decrease the number of distinct TLS connections that can be resumed before they are garbage collected, see the @samp{--resume-limit} parameter (@pxref{Parameters for shishid}). @subsection Setting up Anonymous TLS @cindex anonymous tls @cindex Diffie Hellman key exchange Anonymous TLS is the simplest to set up and use. In fact, only the client need to be informed that your KDC support TLS. This can be done in the configuration file with the @samp{/tls} parameter for @samp{kdc-realm} (@pxref{realm-kdc,, Shishi Configuration}), or by placing the KDC address in DNS using the @samp{_tls} SRV record (@pxref{Configuring DNS for KDC}). Let's start Shishid, listening on a TCP socket. TLS require TCP. TCP sockets are automatically upgraded to TLS if the client request it. @example jas@@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/tcp Initializing GNUTLS...done Listening on IPv4:*:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on IPv4:*:4711/tcp socket 4 @end example Let's use the client to talk with it, using TLS. @example jas@@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls \ simon@@EXAMPLE.ORG Enter password for `simon@@EXAMPLE.ORG': simon@@EXAMPLE.ORG: Authtime: Tue Dec 16 05:20:47 2003 Endtime: Tue Dec 16 05:37:27 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (12) jas@@latte:~$ @end example On success, the server will print the following debug information. @example shishid: Accepted socket 6 from socket 4 as IPv4:*:4711/tcp peer 127.0.0.1 shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 4 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying STARTTLS shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `Anon DH', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed shishid: TLS anonymous authentication with 1024 bit Diffie-Hellman shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 131 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Processing 131 from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying AS-REQ shishid: AS-REQ from simon@@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Sending 511 bytes to IPv4:*:4711/tcp peer 127.0.0.1 socket 6 via TLS shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Peer IPv4:*:4711/tcp peer 127.0.0.1 disconnected on socket 6 shishid: Closing IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Listening on IPv4:*:4711/tcp socket 4 @end example @subsection Setting up X.509 authenticated TLS @cindex X.509 authentication @cindex authenticated tls @cindex client authentication @cindex server authentication @cindex certificate authority (CA) Setting up X.509 authentication is slightly more complicated than anonymous authentication. You need a X.509 certificate authority (CA) that can generate certificates for your Kerberos server and Kerberos clients. It is often easiest to setup the CA yourself. Managing a CA can be a daunting task, and we only give the bare essentials to get things up and running. We suggest that you study the relevant literature. As a first step beyond this introduction, you may wish to explore more secure forms of key storage than storing them unencrypted on disk. The following three sections describe how you create the CA, KDC certificate, and client certificates. You can use any tool you like for this task, as long as they generate X.509 (PKIX) certificates in PEM format and RSA keys in PKCS#1 format. Here we use @file{certtool} that come with GNUTLS, which is widely available. We conclude by discussing how you use these certificates in the KDC and in the Shishi client. @subsubsection Create a Kerberos Certificate Authority First create a CA key. @example jas@@latte:~$ certtool --generate-privkey \ --outfile /usr/local/etc/shishi/shishi.key Generating a private key... Generating a 1024 bit RSA private key... jas@@latte:~$ @end example Then create the CA certificate. Use whatever details you prefer. @example jas@@latte:~$ certtool --generate-self-signed \ --load-privkey /usr/local/etc/shishi/shishi.key \ --outfile /usr/local/etc/shishi/shishi.cert Generating a self signed certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example CA Organizational unit name: Locality name: State or province name: Common name: CA This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): y Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 10:59:00 2003 Not After: Fri Jun 18 11:59:00 2004 Subject: C=SE,O=Shishi Example CA,CN=CA Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:TRUE Is the above information ok? (Y/N): y Signing certificate... jas@@latte:~$ @end example @subsubsection Create a Kerberos KDC Certificate First create the key for the KDC. @example jas@@latte:~$ certtool --generate-privkey \ --outfile /usr/local/etc/shishi/shishid.key Generating a private key... Generating a 1024 bit RSA private key... jas@@latte:~$ @end example Then create actual KDC certificate, signed by the CA certificate created in the previous step. @example jas@@latte:~$ certtool --generate-certificate \ --load-ca-certificate /usr/local/etc/shishi/shishi.cert \ --load-ca-privkey /usr/local/etc/shishi/shishi.key \ --load-privkey /usr/local/etc/shishi/shishid.key \ --outfile /usr/local/etc/shishi/shishid.cert Generating a signed certificate... Loading CA's private key... Loading CA's certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example KDC Organizational unit name: Locality name: State or province name: Common name: KDC This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): n Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 11:02:00 2003 Not After: Fri Jun 18 12:02:00 2004 Subject: C=SE,O=Shishi Example KDC,CN=KDC Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:FALSE Is the above information ok? (Y/N): y Signing certificate... jas@@latte:~$ @end example @subsubsection Create a Kerberos Client Certificate First create the key for the client. @example jas@@latte:~$ certtool --generate-privkey \ --outfile ~/.shishi/client.key Generating a private key... Generating a 1024 bit RSA private key... jas@@latte:~$ @end example Then create the client certificate, signed by the CA. An alternative would be to have the KDC sign the client certificates. @example jas@@latte:~$ certtool --generate-certificate \ --load-ca-certificate /usr/local/etc/shishi/shishi.cert \ --load-ca-privkey /usr/local/etc/shishi/shishi.key \ --load-privkey ~/.shishi/client.key \ --outfile ~/.shishi/client.certs Generating a signed certificate... Loading CA's private key... Loading CA's certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example Client Organizational unit name: Locality name: State or province name: Common name: Client This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): n Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 11:04:00 2003 Not After: Fri Jun 18 12:04:00 2004 Subject: C=SE,O=Shishi Example Client,CN=Client Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:FALSE Is the above information ok? (Y/N): y Signing certificate... jas@@latte:~$ @end example @subsubsection Starting KDC with X.509 authentication support The KDC need the CA certificate (to verify client certificates) and the server certificate and key (to authenticate itself to the clients). See elsewhere (@pxref{Parameters for shishid}) for the entire description of the parameters. @example jas@@latte:~$ shishid -l *:4711/tcp \ --x509cafile /usr/local/etc/shishi/shishi.cert \ --x509certfile /usr/local/etc/shishi/shishid.cert \ --x509keyfile /usr/local/etc/shishi/shishid.key Initializing GNUTLS... Parsed 1 CAs... Loaded server certificate/key... Generating Diffie-Hellman parameters... Initializing GNUTLS...done Listening on *:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on *:4711/tcp socket 4 @end example Then acquire tickets as usual. In case you wonder how shishi finds the client certificate and key, the filenames used above when generating the client certificates happen to be the default filenames for these files. So it pick them up automatically. @example jas@@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls' \ simon@@EXAMPLE.ORG Enter password for `simon@@EXAMPLE.ORG': simon@@EXAMPLE.ORG: Authtime: Sun Dec 21 11:15:47 2003 Endtime: Sun Dec 21 11:32:27 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE RENEWABLE HWAUTHENT TRANSITEDPOLICYCHECKED OKASDELEGATE (12) jas@@latte:~$ @end example Here is what the server would print. @example shishid: Accepted socket 6 from socket 4 as *:4711/tcp peer 127.0.0.1 shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 4 bytes from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying STARTTLS shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `RSA', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed shishid: TLS client certificate `C=SE,O=Shishi Example Client,CN=Client', issued by `C=SE,O=Shishi Example CA,CN=CA', serial number `00', MD5 fingerprint `a5:d3:1f:58:76:e3:58:cd:2d:eb:f7:45:a2:4b:52:f9:', activated `Sun Dec 21 11:04:00 2003', expires `Fri Jun 18 12:04:00 2004', version #3, key RSA modulus 1024 bits, currently EXPIRED shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 131 bytes from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Processing 131 from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying AS-REQ shishid: AS-REQ from simon@@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Sending 511 bytes to *:4711/tcp peer 127.0.0.1 socket 6 via TLS shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Peer *:4711/tcp peer 127.0.0.1 disconnected on socket 6 shishid: Closing *:4711/tcp peer 127.0.0.1 socket 6 shishid: Listening on *:4711/tcp socket 4 @end example @node Multiple servers @section Multiple servers @cindex remote databases @cindex LDAP @cindex SQL @cindex NFS @cindex IPSEC @cindex rsync Setting up multiple servers is as easy as replicating the user database. Since the default @samp{file} user database is stored in the normal file system, you can use any common tools to replicate a file system. Network file system like NFS (properly secured by, e.g., a point-to-point symmetrically encrypted IPSEC connection) and file synchronizing tools like @samp{rsync} are typical choices. @cindex master server @cindex secondary server The secondary server should be configured just like the master server. If you use the @samp{file} database over NFS you do not have to make any modifications. If you use, e.g., a cron job to @samp{rsync} the directory every hour or so, you may want to add a @samp{--read-only} flag to the Shisa @samp{db} definition (@pxref{Shisa Configuration}). That way, nobody will be lured into creating or changing information in the database on the secondary server, which only would be overwritten during the next synchronization. @example db --read-only file /usr/local/var/backup-shishi @end example @cindex concurrent writers The @samp{file} database is designed so it doesn't require file locking in the file system, which may be unreliable in some network file systems or implementations. It is also designed so that multiple concurrent readers and writers may access the database without causing corruption. @strong{Warning:} The last paragraph is currently not completely accurate. There may be race conditions with concurrent writers. None should cause infinite loops or data loss. However, unexpected results might occur if two writers try to update information about a principal simultaneous. If you use a remote LDAP server or SQL database to store the user database, and access it via a Shisa backend, you have make sure your Shisa backend handle concurrent writers properly. If you use a modern SQL database, this probably is not a concern. If it is a problem, you may be able to work around it by implementing some kind of synchronization or semaphore mechanism. If all else sounds too complicated, you can set up the secondary servers as @samp{--read-only} servers, although you will lose some functionality (like changing passwords via the secondary server, or updating timestamps when the last ticket request occurred). One function that is of particular use for users with remote databases (be it LDAP or SQL) is the ``database override'' feature. Using this you can have the security critical principals (such as the ticket granting ticket) stored on local file system storage, but use the remote database for user principals. Of course, you must keep the local file system storage synchronized between all servers, as before. Here is an example configuration. @example db --read-only file /var/local/master db ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem @end example This instruct the Shisa library to access the two databases sequentially, for each query using the first database that know about the requested principal. If you put the @samp{krbtgt/REALM} principal in the local @samp{file} database, this will override the LDAP interface. Naturally, you can have as many @samp{db} definition lines as you wish. @cindex High Availability Users with remote databases can also investigate a so called @i{High Availability} mode. This is useful if you wish to have your Kerberos servers be able to continue to operate even when the remote database is offline. This is achieved via the @samp{--ignore-errors} flag in the database definition. Here is a sample configuration. @example db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --read-only file /var/cache/ldap-copy @end example This instruct the Shisa library to try the LDAP backend first, but if it fails, instead of returning an error, continue to try the operation on a read only local @samp{file} based database. Of course, write requests will still fail, but it may be better than halting the server completely. To make this work, you first need to set up a cron job on a, say, hourly basis, to make a copy of the remote database and store it in the local file database. That way, when the remote server goes away, fairly current information will still be available locally. @cindex fail over If you also wish to experiment with read-write fail over, here is an idea for the configuration. @example db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --ignore-errors --read-only file /var/cache/ldap-copy db file /var/cache/local-updates @end example This is similar to the previous, but it will ignore errors reading and writing from the first two databases, ultimately causing write attempts to end up in the final @samp{file} based database. Of course, you would need to create tools to feed back any local updates made while the remote server was down. It may also be necessary to create a special backend for this purpose, which can auto create principals that are used. We finish with an example that demonstrate all the ideas presented. @example db --read-only file /var/local/master db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --ignore-errors --read-only file /var/cache/ldap-copy db file /var/cache/local-updates @end example @node Developer information @section Developer information The Programming API for Shisa is described below (@pxref{Kerberos Database Functions}); this section is about extending Shisa, and consequently Shishi, to use your own user database system. You may want to store your Kerberos user information on an LDAP database server, for example. Adding a new backend is straight forward. You need to implement the backend API function set, add the list of API functions to @file{db/db.c} and possibly also add any library dependencies to the Makefile. The simplest way to write a new backend is to start from the existing @samp{file} based database, in @file{db/file.c}, and modify the entry points as needed. Note that the current backend API will likely change before it is frozen. We may describe it in detail here when it has matured. However, currently it is similar to the external Shisa API (@pxref{Kerberos Database Functions}). There should be no need to modify anything else in the Shisa library, and certainly not in the Shishi library or the @file{shishid} server. Naturally, we would appreciate if you would send us your new backend, if you believe it is generally useful (@pxref{Bug Reports}). @c ********************************************************** @c **************** Reference Manual ********************** @c ********************************************************** @node Reference Manual @chapter Reference Manual This chapter discuss the underlying assumptions of Kerberos, contain a glossary to Kerberos concepts, give you background information on choosing realm and principal names, and describe all parameters and configuration file syntaxes for the Shishi tools. @menu * Environmental Assumptions:: Kerberos 5 assumptions about your system. * Glossary of terms:: Glossary of Kerberos related terminology. * Realm and Principal Naming:: How to name your realm and principals. * Shishi Configuration:: Explains the Core Shishi configuration file. * Shisa Configuration:: Explains the Shisa database definition file. * Parameters for shishi:: Command line parameters for 'shishi'. * Parameters for shishid:: Command line parameters for 'shishid'. * Parameters for shisa:: Command line parameters for 'shisa'. * Environment variables:: Overriding compile-time defaults at run-time. * Date input formats:: Details of the understood date formats. @end menu @node Environmental Assumptions @section Environmental Assumptions Kerberos imposes a few assumptions on the environment in which it can properly function: @itemize @bullet @item "Denial of service" attacks are not solved with Kerberos. There are places in the protocols where an intruder can prevent an application from participating in the proper authentication steps. Detection and solution of such attacks (some of which can appear to be not-uncommon "normal" failure modes for the system) is usually best left to the human administrators and users. @item Principals MUST keep their secret keys secret. If an intruder somehow steals a principal's key, it will be able to masquerade as that principal or impersonate any server to the legitimate principal. @item "Password guessing" attacks are not solved by Kerberos. If a user chooses a poor password, it is possible for an attacker to successfully mount an offline dictionary attack by repeatedly attempting to decrypt, with successive entries from a dictionary, messages obtained which are encrypted under a key derived from the user's password. @item Each host on the network MUST have a clock which is "loosely synchronized" to the time of the other hosts; this synchronization is used to reduce the bookkeeping needs of application servers when they do replay detection. The degree of "looseness" can be configured on a per-server basis, but is typically on the order of 5 minutes. If the clocks are synchronized over the network, the clock synchronization protocol MUST itself be secured from network attackers. @item Principal identifiers are not recycled on a short-term basis. A typical mode of access control will use access control lists (ACLs) to grant permissions to particular principals. If a stale ACL entry remains for a deleted principal and the principal identifier is reused, the new principal will inherit rights specified in the stale ACL entry. By not re-using principal identifiers, the danger of inadvertent access is removed. @end itemize @node Glossary of terms @section Glossary of terms @table @asis @item Authentication @cindex Authentication Verifying the claimed identity of a principal. @item Authentication header @cindex Authentication header A record containing a Ticket and an Authenticator to be presented to a server as part of the authentication process. @item Authentication path @cindex Authentication path A sequence of intermediate realms transited in the authentication process when communicating from one realm to another. @item Authenticator @cindex Authenticator A record containing information that can be shown to have been recently generated using the session key known only by the client and server. @item Authorization @cindex Authorization The process of determining whether a client may use a service, which objects the client is allowed to access, and the type of access allowed for each. @item Capability @cindex Capability A token that grants the bearer permission to access an object or service. In Kerberos, this might be a ticket whose use is restricted by the contents of the authorization data field, but which lists no network addresses, together with the session key necessary to use the ticket. @item Ciphertext @cindex Ciphertext The output of an encryption function. Encryption transforms plaintext into ciphertext. @item Client @cindex Client A process that makes use of a network service on behalf of a user. Note that in some cases a Server may itself be a client of some other server (e.g. a print server may be a client of a file server). @item Credentials @cindex Credentials A ticket plus the secret session key necessary to successfully use that ticket in an authentication exchange. @item Encryption Type (etype) @cindex Encryption Type (etype) When associated with encrypted data, an encryption type identifies the algorithm used to encrypt the data and is used to select the appropriate algorithm for decrypting the data. Encryption type tags are communicated in other messages to enumerate algorithms that are desired, supported, preferred, or allowed to be used for encryption of data between parties. This preference is combined with local information and policy to select an algorithm to be used. @item KDC @cindex KDC Key Distribution Center, a network service that supplies tickets and temporary session keys; or an instance of that service or the host on which it runs. The KDC services both initial ticket and ticket-granting ticket requests. The initial ticket portion is sometimes referred to as the Authentication Server (or service). The ticket-granting ticket portion is sometimes referred to as the ticket-granting server (or service). @item Kerberos @cindex Kerberos The name given to the Project Athena's authentication service, the protocol used by that service, or the code used to implement the authentication service. The name is adopted from the three-headed dog which guards Hades. @item Key Version Number (kvno) @cindex Key Version Number (kvno) A tag associated with encrypted data identifies which key was used for encryption when a long lived key associated with a principal changes over time. It is used during the transition to a new key so that the party decrypting a message can tell whether the data was encrypted using the old or the new key. @item Plaintext @cindex Plaintext The input to an encryption function or the output of a decryption function. Decryption transforms ciphertext into plaintext. @item Principal @cindex Principal A named client or server entity that participates in a network communication, with one name that is considered canonical. @item Principal identifier @cindex Principal identifier The canonical name used to uniquely identify each different principal. @item Seal @cindex Seal To encipher a record containing several fields in such a way that the fields cannot be individually replaced without either knowledge of the encryption key or leaving evidence of tampering. @item Secret key @cindex Secret key An encryption key shared by a principal and the KDC, distributed outside the bounds of the system, with a long lifetime. In the case of a human user's principal, the secret key MAY be derived from a password. @item Server @cindex Server A particular Principal which provides a resource to network clients. The server is sometimes referred to as the Application Server. @item Service @cindex Service A resource provided to network clients; often provided by more than one server (for example, remote file service). @item Session key @cindex Session key A temporary encryption key used between two principals, with a lifetime limited to the duration of a single login "session". In the Kerberos system, a session key is generated by the KDC. The session key is distinct from the sub-session key, described next.. @item Sub-session key @cindex Sub-session key A temporary encryption key used between two principals, selected and exchanged by the principals using the session key, and with a lifetime limited to the duration of a single association. The sub- session key is also referred to as the subkey. @item Ticket @cindex Ticket @cindex Kerberos Ticket A record that helps a client authenticate itself to a server; it contains the client's identity, a session key, a timestamp, and other information, all sealed using the server's secret key. It only serves to authenticate a client when presented along with a fresh Authenticator. @end table @node Realm and Principal Naming @section Realm and Principal Naming This section contains the discussion on naming realms and principals from the Kerberos specification. @subsection Realm Names Although realm names are encoded as GeneralStrings and although a realm can technically select any name it chooses, interoperability across realm boundaries requires agreement on how realm names are to be assigned, and what information they imply. To enforce these conventions, each realm MUST conform to the conventions itself, and it MUST require that any realms with which inter-realm keys are shared also conform to the conventions and require the same from its neighbors. Kerberos realm names are case sensitive. Realm names that differ only in the case of the characters are not equivalent. There are presently three styles of realm names: domain, X500, and other. Examples of each style follow: @example domain: ATHENA.MIT.EDU X500: C=US/O=OSF other: NAMETYPE:rest/of.name=without-restrictions @end example Domain syle realm names MUST look like domain names: they consist of components separated by periods (.) and they contain neither colons (:) nor slashes (/). Though domain names themselves are case insensitive, in order for realms to match, the case must match as well. When establishing a new realm name based on an internet domain name it is recommended by convention that the characters be converted to upper case. X.500 names contain an equal (=) and cannot contain a colon (:) before the equal. The realm names for X.500 names will be string representations of the names with components separated by slashes. Leading and trailing slashes will not be included. Note that the slash separator is consistent with Kerberos implementations based on RFC1510, but it is different from the separator recommended in RFC2253. Names that fall into the other category MUST begin with a prefix that contains no equal (=) or period (.) and the prefix MUST be followed by a colon (:) and the rest of the name. All prefixes must be assigned before they may be used. Presently none are assigned. The reserved category includes strings which do not fall into the first three categories. All names in this category are reserved. It is unlikely that names will be assigned to this category unless there is a very strong argument for not using the 'other' category. These rules guarantee that there will be no conflicts between the various name styles. The following additional constraints apply to the assignment of realm names in the domain and X.500 categories: the name of a realm for the domain or X.500 formats must either be used by the organization owning (to whom it was assigned) an Internet domain name or X.500 name, or in the case that no such names are registered, authority to use a realm name MAY be derived from the authority of the parent realm. For example, if there is no domain name for E40.MIT.EDU, then the administrator of the MIT.EDU realm can authorize the creation of a realm with that name. This is acceptable because the organization to which the parent is assigned is presumably the organization authorized to assign names to its children in the X.500 and domain name systems as well. If the parent assigns a realm name without also registering it in the domain name or X.500 hierarchy, it is the parent's responsibility to make sure that there will not in the future exist a name identical to the realm name of the child unless it is assigned to the same entity as the realm name. @subsection Principal Names As was the case for realm names, conventions are needed to ensure that all agree on what information is implied by a principal name. The name-type field that is part of the principal name indicates the kind of information implied by the name. The name-type SHOULD be treated only as a hint to interpreting the meaning of a name. It is not significant when checking for equivalence. Principal names that differ only in the name-type identify the same principal. The name type does not partition the name space. Ignoring the name type, no two names can be the same (i.e. at least one of the components, or the realm, MUST be different). The following name types are defined: @example name-type value meaning NT-UNKNOWN 0 Name type not known NT-PRINCIPAL 1 Just the name of the principal as in DCE, or for users NT-SRV-INST 2 Service and other unique instance (krbtgt) NT-SRV-HST 3 Service with host name as instance (telnet, rcommands) NT-SRV-XHST 4 Service with host as remaining components NT-UID 5 Unique ID NT-X500-PRINCIPAL 6 Encoded X.509 Distingished name [RFC 2253] NT-SMTP-NAME 7 Name in form of SMTP email name (e.g. user@@foo.com) NT-ENTERPRISE 10 Enterprise name - may be mapped to principal name @end example When a name implies no information other than its uniqueness at a particular time the name type PRINCIPAL SHOULD be used. The principal name type SHOULD be used for users, and it might also be used for a unique server. If the name is a unique machine generated ID that is guaranteed never to be reassigned then the name type of UID SHOULD be used (note that it is generally a bad idea to reassign names of any type since stale entries might remain in access control lists). If the first component of a name identifies a service and the remaining components identify an instance of the service in a server specified manner, then the name type of SRV-INST SHOULD be used. An example of this name type is the Kerberos ticket-granting service whose name has a first component of krbtgt and a second component identifying the realm for which the ticket is valid. If the first component of a name identifies a service and there is a single component following the service name identifying the instance as the host on which the server is running, then the name type SRV- HST SHOULD be used. This type is typically used for Internet services such as telnet and the Berkeley R commands. If the separate components of the host name appear as successive components following the name of the service, then the name type SRV-XHST SHOULD be used. This type might be used to identify servers on hosts with X.500 names where the slash (/) might otherwise be ambiguous. A name type of NT-X500-PRINCIPAL SHOULD be used when a name from an X.509 certificate is translated into a Kerberos name. The encoding of the X.509 name as a Kerberos principal shall conform to the encoding rules specified in RFC 2253. A name type of SMTP allows a name to be of a form that resembles a SMTP email name. This name, including an "@@" and a domain name, is used as the one component of the principal name. A name type of UNKNOWN SHOULD be used when the form of the name is not known. When comparing names, a name of type UNKNOWN will match principals authenticated with names of any type. A principal authenticated with a name of type UNKNOWN, however, will only match other names of type UNKNOWN. Names of any type with an initial component of 'krbtgt' are reserved for the Kerberos ticket granting service. @xref{krbtgt,, Name of the TGS}, for the form of such names. @subsubsection Name of server principals The principal identifier for a server on a host will generally be composed of two parts: (1) the realm of the KDC with which the server is registered, and (2) a two-component name of type NT-SRV-HST if the host name is an Internet domain name or a multi-component name of type NT-SRV-XHST if the name of the host is of a form such as X.500 that allows slash (/) separators. The first component of the two- or multi-component name will identify the service and the latter components will identify the host. Where the name of the host is not case sensitive (for example, with Internet domain names) the name of the host MUST be lower case. If specified by the application protocol for services such as telnet and the Berkeley R commands which run with system privileges, the first component MAY be the string 'host' instead of a service specific identifier. @subsubsection Name of the TGS @anchor{krbtgt} The principal identifier of the ticket-granting service shall be composed of three parts: (1) the realm of the KDC issuing the TGS ticket (2) a two-part name of type NT-SRV-INST, with the first part "krbtgt" and the second part the name of the realm which will accept the ticket-granting ticket. For example, a ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the ATHENA.MIT.EDU KDC has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "ATHENA.MIT.EDU") (name). A ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the MIT.EDU realm has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "MIT.EDU") (name). @subsection Choosing a principal with which to communicate The Kerberos protocol provides the means for verifying (subject to the assumptions in @ref{Environmental Assumptions}) that the entity with which one communicates is the same entity that was registered with the KDC using the claimed identity (principal name). It is still necessary to determine whether that identity corresponds to the entity with which one intends to communicate. When appropriate data has been exchanged in advance, this determination may be performed syntactically by the application based on the application protocol specification, information provided by the user, and configuration files. For example, the server principal name (including realm) for a telnet server might be derived from the user specified host name (from the telnet command line), the "host/" prefix specified in the application protocol specification, and a mapping to a Kerberos realm derived syntactically from the domain part of the specified hostname and information from the local Kerberos realms database. One can also rely on trusted third parties to make this determination, but only when the data obtained from the third party is suitably integrity protected while resident on the third party server and when transmitted. Thus, for example, one should not rely on an unprotected domain name system record to map a host alias to the primary name of a server, accepting the primary name as the party one intends to contact, since an attacker can modify the mapping and impersonate the party with which one intended to communicate. Implementations of Kerberos and protocols based on Kerberos MUST NOT use insecure DNS queries to canonicalize the hostname components of the service principal names. In an environment without secure name service, application authors MAY append a statically configured domain name to unqualified hostnames before passing the name to the security mechanisms, but should do no more than that. Secure name service facilities, if available, might be trusted for hostname canonicalization, but such canonicalization by the client SHOULD NOT be required by KDC implementations. Implementation note: Many current implementations do some degree of canonicalization of the provided service name, often using DNS even though it creates security problems. However there is no consistency among implementations about whether the service name is case folded to lower case or whether reverse resolution is used. To maximize interoperability and security, applications SHOULD provide security mechanisms with names which result from folding the user-entered name to lower case, without performing any other modifications or canonicalization. @subsection Principal Name Form Principal names consist of a sequence of strings, which is often tedious to parse. Therefor, Shishi often uses a ``printed'' form of principal which embed the entire principal name string sequence, and optionally also the realm, into one string. The format is taken from the Kerberos 5 GSS-API mechanism (RFC 1964). The elements included within this name representation are as follows, proceeding from the beginning of the string: @enumerate @item One or more principal name components; if more than one principal name component is included, the components are separated by `/`. Arbitrary octets may be included within principal name components, with the following constraints and special considerations: @enumerate a @item Any occurrence of the characters `@@` or `/` within a name component must be immediately preceded by the `\` quoting character, to prevent interpretation as a component or realm separator. @item The ASCII newline, tab, backspace, and null characters may occur directly within the component or may be represented, respectively, by `\n`, `\t`, `\b`, or `\0`. @item If the `\` quoting character occurs outside the contexts described in (1a) and (1b) above, the following character is interpreted literally. As a special case, this allows the doubled representation `\\` to represent a single occurrence of the quoting character. @item An occurrence of the `\` quoting character as the last character of a component is illegal. @end enumerate @item Optionally, a `@@` character, signifying that a realm name immediately follows. If no realm name element is included, the local realm name is assumed. The `/` , `:`, and null characters may not occur within a realm name; the `@@`, newline, tab, and backspace characters may be included using the quoting conventions described in (1a), (1b), and (1c) above. @end enumerate @node Shishi Configuration @section Shishi Configuration @cindex configuration file The valid configuration file tokens are described here. The user configuration file is typically located in @file{~/.shishi/shishi.conf} (compare @samp{shishi --configuration-file}) and the system configuration is typically located in @file{/usr/local/etc/shishi/shishi.conf} (compare @samp{shishi --system-configuration-file}). If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored. All tokens are valid in both the system and the user configuration files, and have the same meaning. However, as the system file is supposed to apply to all users on a system, it would not make sense to use some tokens in that file. For example, the @samp{default-principal} is rarely useful in a system configuration file. @subsection @samp{default-realm} Specify the default realm, by default the hostname of the host is used. E.g., @example default-realm JOSEFSSON.ORG @end example @subsection @samp{default-principal} Specify the default principal, by default the login username is used. E.g., @example default-principal jas @end example @subsection @samp{client-kdc-etypes} Specify which encryption types client asks server to respond in during AS/TGS exchanges. List valid encryption types, in preference order. Supported algorithms include aes256-cts-hmac-sha1-96, aes128-cts-hmac-sha1-96, des3-cbc-sha1-kd, des-cbc-md5, des-cbc-md4, des-cbc-crc and null. This option also indicates which encryption types are accepted by the client when receiving the response. Note that the preference order is not cryptographically protected, so a man in the middle can modify the order without being detected. Thus, only specify encryption types you trust completely here. The default only includes aes256-cts-hmac-sha1-96, as suggested by RFC1510bis. E.g., @example client-kdc-etypes=aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5 @end example @subsection @samp{verbose}, @samp{verbose-asn1}, @samp{verbose-noise}, @samp{verbose-crypto}, @samp{verbose-crypto-noise} Enable verbose library messages. E.g., @example verbose verbose-noise @end example @subsection @samp{realm-kdc} @anchor{realm-kdc} Specify KDC addresses for realms. Value is @samp{REALM,KDCADDRESS[/TRANSPORT][,KDCADDRESS[/TRANSPORT]...]}. KDCADDRESS is the hostname or IP address of KDC. Optional TRANSPORT is ``udp'' for UDP, ``tcp'' for TCP, and ``tls'' for TLS connections. By default UDP is tried first, and TCP used as a fallback if the KRB_ERR_RESPONSE_TOO_BIG error is received. If not specified, Shishi tries to locate the KDC using SRV RRs, which is recommended. This option should normally only be used during experiments, or to access badly maintained realms. @example realm-kdc=JOSEFSSON.ORG,ristretto.josefsson.org @end example @subsection @samp{server-realm} Specify realm for servers. Value is @samp{REALM,SERVERREGEXP[,SERVERREGEXP...]}. SERVERREGEXP is a regular expression matching servers in the realm. The first match is used. E.g., @example server-realm=JOSEFSSON.ORG,.josefsson.org @end example Note: currently not used. @subsection @samp{kdc-timeout}, @samp{kdc-retries} How long shishi waits for a response from a KDC before continuing to next KDC for realm. The default is 5 seconds. E.g., @example kdc-timeout=10 @end example How many times shishi sends a request to a KDC before giving up. The default is 3 times. E.g., @example kdc-retries=5 @end example @subsection @samp{stringprocess} How username and passwords entered from the terminal, or taken from the command line, are processed. "none": no processing is used. "stringprep": convert from locale charset to UTF-8 and process using experimental RFC 1510 stringprep profile. It can also be a string indicating a character set supported by iconv via libstringprep, in which case data is converted from locale charset into the indicated character set. E.g., UTF-8, ISO-8859-1, KOI-8, EBCDIC-IS-FRISS are supported on GNU systems. On some systems you can use "locale -m" to list available character sets. By default, the "none" setting is used which is consistent with RFC 1510 that is silent on the issue. In practice, however, converting to UTF-8 improves interoperability. E.g., @example stringprocess=UTF-8 @end example @subsection @samp{ticket-life} Specify default ticket life time. The string can be in almost any common format. It can contain month names, time zones, `am' and `pm', `yesterday', `ago', `next', etc. @xref{Date input formats}, for the long story. As an extra feature, if the time specified by your string correspond to a time during the last 24 hours, an extra day is added to it. This allows you to specify relative times such as "17:00" to always mean the next 17:00, even if your system clock happens to be 17:30. The default is 8 hours. E.g., @example #ticket-life=8 hours #ticket-life=1 day ticket-life=17:00 @end example @subsection @samp{renew-life} Specify how long a renewable ticket should remain renewable. See ticket-life for the syntax. The extra feature that handles negative values within the last 2 hours is not active here. The default is 7 days. E.g., @example #renew-life=1 week #renew-life=friday 17:00 renew-life=sunday @end example @node Shisa Configuration @section Shisa Configuration @cindex database definition @cindex specifying user database @cindex user database definition The configuration file for Shisa is typically stored in @file{/usr/local/etc/shishi/shisa.conf}. If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored. @subsection @samp{db} Currently the only configuration options available is the @code{db} token that define the databases to use. The syntax is: @example db [OPTIONS] [LOCATION] [PARAMETERS ...] @end example Specify the data sources for Kerberos 5 data. Multiple entries, even of the same data source type, are allowed. The data sources are accessed in the same sequence as they are defined here. If an entry is found in one data source, it will be used for the operations, without searching the remaining data sources. Valid OPTIONS include: @example --read-only No data is written to this data source. --ignore-errors Ignore failures in this backend. @end example The default (when the configuration file is empty) uses one "file" data source (see below), but for a larger installation you may want to combine several data sources. Here is an example. @example db --read-only file /var/local/master db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --read-only file /var/cache/ldap-copy @end example This demonstrate how you can store critical principals on local disk (the first entry, /var/local/master) that will always be found without looking in the LDAP directory. The critical principals could be, e.g., krbtgt/EXAMPLE.ORG. The second entry denote a LDAP server that could hold user principals. As you can see, Shisa will not let the caller know about errors with the LDAP source (they will be logged, however). Instead, if for instance the LDAP server has crashed, Shisa would continue and read from the /var/cache/ldap-copy file source. That file source may have been set up to contain a copy of the data in the LDAP server, perhaps made on an hourly basis, so that your server will be able to serve recent data even in case of a crash. Any updates or passwords change requests will however not be possible while the LDAP server is inaccessible, to reduce the problem of synchronizing data back into the LDAP server once it is online again. Currently only the "file" data source is supported, and denote a data source that use the standard file system for storage. Valid syntaxes for the "file" database: @example db file PATH @end example Examples: @example db file /var/shishi db file /usr/share/shishi read-only @end example If no @samp{db} tokens are present, the default will be: @example db file /usr/local/var/shishi @end example @node Parameters for shishi @section Parameters for shishi If no command is given, Shishi try to make sure you have a ticket granting ticket for the default realm, and then display it. Mandatory arguments to long options are mandatory for short options too. @example Usage: shishi [OPTIONS]... [CLIENT [SERVER]]... -h, --help Print help and exit -V, --version Print version and exit Commands: -d, --destroy Destroy tickets in local cache, limited by any --client-name or --server-name. (default=off) -l, --list List tickets in local cache, limited by any --client-name and --server-name. (default=off) -r, --renew Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm. (default=off) Flags: --forwardable Get a forwardable ticket, i.e., one that can be used to get forwarded tickets. (default=off) --forwarded Get a forwarded ticket. (default= off) --proxiable Get a proxiable ticket, i.e., one that can be used to get proxy tickets. (default=off) --proxy Get a proxy ticket. (default=off) --renewable Get a renewable ticket. (default= off) Options: --client-name=NAME Client name. Default is login username. -E, --encryption-type=ETYPE,[ETYPE...] Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. -e, --endtime=STRING Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time. --realm=STRING Set default realm. --renew-till=STRING Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time. --server-name=NAME Server name. Default is 'krbtgt/REALM' where REALM is client realm. -s, --starttime=STRING Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately. --ticket-granter=NAME Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@@REALM' where REALM is client realm. Other options: --configuration-file=FILE Read user configuration from FILE. -c, --ticket-file=FILE Read tickets from FILE. -o, --library-options=STRING Parse STRING as a configuration file statement. -q, --quiet Don't produce any diagnostic output. (default=off) --system-configuration-file=FILE Read system configuration from FILE. --ticket-write-file=FILE Write tickets from FILE. Default is to write them back to where they were read from. -v, --verbose Produce verbose output. (default=off) @end example @node Parameters for shishid @section Parameters for shishid If no parameters are specified, @samp{shishid} listens on the defaults interfaces and answers incoming requests using the keys in the default key file. Mandatory arguments to long options are mandatory for short options too. @example Usage: shishid [OPTIONS]... -h, --help Print help and exit -V, --version Print version and exit Commands: -l, --listen=[FAMILY:]ADDR:PORT/TYPE Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'. -u, --setuid=NAME After binding socket, set user identity. TLS settings: --no-tls Disable TLS support (default=off) --x509cafile=FILE X.509 certificate authorities used to verify client certificates, in PEM format. --x509certfile=FILE X.509 server certificate, in PEM format. --x509crlfile=FILE X.509 certificate revocation list to check for revoked client certificates, in PEM format. --x509keyfile=FILE X.509 server certificate key, in PEM format. --resume-limit=SHORT Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). (default=`50') Other options: -c, --configuration-file=FILE Use specified configuration file. -v, --verbose Produce verbose output. Use multiple times to increase amount of information. -q, --quiet Don't produce any diagnostic output. (default=off) @end example @node Parameters for shisa @section Parameters for shisa The purpose of @samp{shisa} is to manipulate information stored in the Kerberos 5 database used by Shishi. Mandatory arguments to long options are mandatory for short options too. @example Usage: shisa [OPTIONS]... [REALM [PRINCIPAL]]... -h, --help Print help and exit -V, --version Print version and exit Operations: -a, --add Add realm or principal to database. -d, --dump Dump entries in database. -n, --key-add Add new key to a principal in database. --key-remove Remove a key from a principal in database. -l, --list List entries in database. -m, --modify Modify principal entry in database. -r, --remove Remove realm or principal from database. Parameters: -f, --force Allow removal of non-empty realms. (default=off) --enabled Only dump or list enabled principals. (default=off) --disabled Only dump or list disabled principals. (default=off) --keys Print cryptographic key and password in hostkey format. (default=off) Values: -E, --encryption-type=STRING Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. --key-version=NUMBER Version of key. --password[=STRING] Derive key from this password. --random Use a random key. (default) --salt=STRING Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name. --string-to-key-parameter=HEX Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver. Other options: -c, --configuration-file=FILE Use specified configuration file. -o, --library-options=STRING Parse string as configuration file statement. -v, --verbose Produce verbose output. (default=off) -q, --quiet Don't produce any diagnostic output. (default=off) @end example @node Environment variables @section Environment variables A few of the compile-time defaults may be overridden at run-time by using environment variables. The following variables are supported. @itemize @bullet @item @env{SHISHI_CONFIG} Specify the location of the default system configuration file. Used by the Shishi library. If not specified, the default is specified at compile-time and is usually @file{$prefix/etc/shishi.conf}. @item @env{SHISHI_HOME} Specify the user specific directory for configuration files, ticket cache, etc. Used by the Shishi library. If not specified, it is computed as @code{$HOME/.shishi}. @item @env{SHISHI_USER} Specify the default principal user name. Used by the Shishi library. If not specified, it is taken from the environment variable @env{USER}. @item @env{SHISHI_TICKETS} Specify the file name of the ticket cache. Used by the Shishi library. If not specified, it will be @code{$SHISHI_HOME/tickets}, or @code{$HOME/.shishi/tickets} if @code{$SHISHI_HOME} is not specified. @end itemize @lowersections @include parse-datetime.texi @raisesections @c ********************************************************** @c *************** Programming Manual ********************* @c ********************************************************** @node Programming Manual @chapter Programming Manual @cindex Application Programming Interface (API) This chapter describes all the publicly available functions in the library. @menu * Preparation:: What you should do before using the library. * Initialization Functions:: Creating library handle, configuration file. * Ticket Set Functions:: High-level ticket management functions. * AP-REQ and AP-REP Functions:: Client/Server authentication functions. * SAFE and PRIV Functions:: Client/Server session data functions. * Ticket Functions:: Medium-level ticket manipulation functions. * AS Functions:: Medium-level initial authentication functions. * TGS Functions:: Medium-level authentication functions. * Ticket (ASN.1) Functions:: Low-level Ticket functions. * AS/TGS Functions:: Low-level KDC functions; AS and TGS. * Authenticator Functions:: Low-level authenticator functions. * KRB-ERROR Functions:: Low-level KRB-ERROR functions. * Cryptographic Functions:: Low-level cryptographic functions. * X.509 Functions:: Utility functions for X.509 support. * Utility Functions:: Utilities for use in the global context. * ASN.1 Functions:: Perform low-level ASN.1 manipulations. * Error Handling:: Error codes and such. * Examples:: Example code. * Kerberos Database Functions:: The Shisa generic database interface. * Generic Security Service:: If you want to use the GSS API instead. @end menu @node Preparation @section Preparation To use `Libshishi', you have to perform some changes to your sources and the build system. The necessary changes are small and explained in the following sections. At the end of this chapter, it is described how the library is initialized, and how the requirements of the library are verified. A faster way to find out how to adapt your application for use with `Libshishi' may be to look at the examples at the end of this manual (@pxref{Examples}). @menu * Header:: * Initialization:: * Version Check:: * Building the source:: * Autoconf tests:: @end menu @node Header @subsection Header All interfaces (data types and functions) of the library are defined in the header file `shishi.h'. You must include this in all programs using the library, either directly or through some other header file, like this: @example #include @end example The name space of `Libshishi' is @code{shishi_*} for function names, @code{Shishi*} for data types and @code{SHISHI_*} for other symbols. In addition the same name prefixes with one prepended underscore are reserved for internal use and should never be used by an application. @node Initialization @subsection Initialization `Libshishi' must be initialized before it can be used. The library is initialized by calling @code{shishi_init} (@pxref{Initialization Functions}). The resources allocated by the initialization process can be released if the application no longer has a need to call `Libshishi' functions, this is done by calling @code{shishi_done}. In order to take advantage of the internationalisation features in `Libshishi', such as translated error messages, the application must set the current locale using @code{setlocale} before initializing `Libshishi'. @node Version Check @subsection Version Check It is often desirable to check that the version of `Libshishi' used is indeed one which fits all requirements. Even with binary compatibility new features may have been introduced but due to problem with the dynamic linker an old version is actually used. So you may want to check that the version is okay right after program startup. @include texi/version.c.texi The normal way to use the function is to put something similar to the following early in your @code{main}: @example if (!shishi_check_version (SHISHI_VERSION)) @{ printf ("shishi_check_version failed:\n" "Header file incompatible with shared library.\n"); exit (EXIT_FAILURE); @} @end example @node Building the source @subsection Building the source @cindex Compiling your application If you want to compile a source file including the `shishi.h' header file, you must make sure that the compiler can find it in the directory hierarchy. This is accomplished by adding the path to the directory in which the header file is located to the compilers include file search path (via the @option{-I} option). However, the path to the include file is determined at the time the source is configured. To solve this problem, `Libshishi' uses the external package @command{pkg-config} that knows the path to the include file and other configuration options. The options that need to be added to the compiler invocation at compile time are output by the @option{--cflags} option to @command{pkg-config shishi}. The following example shows how it can be used at the command line: @example gcc -c foo.c `pkg-config shishi --cflags` @end example Adding the output of @samp{pkg-config shishi --cflags} to the compilers command line will ensure that the compiler can find the `Libshishi' header file. A similar problem occurs when linking the program with the library. Again, the compiler has to find the library files. For this to work, the path to the library files has to be added to the library search path (via the @option{-L} option). For this, the option @option{--libs} to @command{pkg-config shishi} can be used. For convenience, this option also outputs all other options that are required to link the program with the `Libshishi' libararies (in particular, the @samp{-lshishi} option). The example shows how to link @file{foo.o} with the `Libshishi' library to a program @command{foo}. @example gcc -o foo foo.o `pkg-config shishi --libs` @end example Of course you can also combine both examples to a single command by specifying both options to @command{pkg-config}: @example gcc -o foo foo.c `pkg-config shishi --cflags --libs` @end example @node Autoconf tests @subsection Autoconf tests @cindex Autoconf tests @cindex Configure tests If you work on a project that uses Autoconf (@pxref{top, GNU Autoconf,, autoconf}) to help find installed libraries, the suggestions in the previous section are not the entire story. There are a few methods to detect and incorporate Shishi into your Autoconf based package. The preferred approach, is to use Libtool in your project, and use the normal Autoconf header file and library tests. @subsubsection Autoconf test via @samp{pkg-config} If your audience is a typical GNU/Linux desktop, you can often assume they have the @samp{pkg-config} tool installed, in which you can use its Autoconf M4 macro to find and set up your package for use with Shishi. The following illustrate this scenario. @example AC_ARG_ENABLE(kerberos_v5, AC_HELP_STRING([--disable-kerberos_v5], [don't use the KERBEROS_V5 mechanism]), kerberos_v5=$enableval) if test "$kerberos_v5" != "no" ; then PKG_CHECK_MODULES(SHISHI, shishi >= 0.0.0, [kerberos_v5=yes], [kerberos_v5=no]) if test "$kerberos_v5" != "yes" ; then kerberos_v5=no AC_MSG_WARN([shishi not found, disabling Kerberos 5]) else kerberos_v5=yes AC_DEFINE(USE_KERBEROS_V5, 1, [Define to 1 if you want Kerberos 5.]) fi fi AC_MSG_CHECKING([if Kerberos 5 should be used]) AC_MSG_RESULT($kerberos_v5) @end example @subsubsection Standalone Autoconf test using Libtool If your package uses Libtool(@pxref{top, GNU Libtool,, libtool}), you can use the normal Autoconf tests to find the Shishi library and rely on the Libtool dependency tracking to include the proper dependency libraries (e.g., Libidn). The following illustrate this scenario. @example AC_CHECK_HEADER(shishi.h, AC_CHECK_LIB(shishi, shishi_check_version, [kerberos5=yes AC_SUBST(SHISHI_LIBS, -lshishi)], kerberos5=no), kerberos5=no) AC_ARG_ENABLE(kerberos5, AC_HELP_STRING([--disable-kerberos5], [disable Kerberos 5 unconditionally]), kerberos5=$enableval) if test "$kerberos5" != "no" ; then AC_DEFINE(USE_KERBEROS_V5, 1, [Define to 1 if you want Kerberos 5.]) else AC_MSG_WARN([Shishi not found, disabling Kerberos 5]) fi AC_MSG_CHECKING([if Kerberos 5 should be used]) AC_MSG_RESULT($kerberos5) @end example @subsubsection Standalone Autoconf test If your package does not use Libtool, as well as detecting the Shishi library as in the previous case, you must also detect whatever dependencies Shishi requires to work (e.g., libidn). Since the dependencies are in a state of flux, we do not provide an example and we do not recommend this approach, unless you are experienced developer. @node Initialization Functions @section Initialization Functions @include texi/init.c.texi @include texi/cfg.c.texi @node Ticket Set Functions @section Ticket Set Functions A ``ticket set'' is, as the name implies, a collection of tickets. Functions are provided to read tickets from file into a ticket set, to query number of tickets in the set, to extract a given ticket from the set, to search the ticket set for tickets matching certain criterium, to write the ticket set to a file, etc. High level functions for performing a initial authentication (@pxref{AS Functions}) or subsequent authentication (@pxref{TGS Functions}) and storing the new ticket in the ticket set are also provided. @xref{Ticket Functions}, to manipulate each individual ticket. @xref{Ticket (ASN.1) Functions}, for low-level ASN.1 manipulation. @include texi/tkts.c.texi @node AP-REQ and AP-REP Functions @section AP-REQ and AP-REP Functions The ``AP-REQ'' and ``AP-REP'' are ASN.1 structures used by application client and servers to prove to each other who they are. The structures contain auxilliary information, together with an authenticator (@pxref{Authenticator Functions}) which is the real cryptographic proof. The following illustrates the AP-REQ and AP-REP ASN.1 structures. @verbatim AP-REQ ::= [APPLICATION 14] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (14), ap-options [2] APOptions, ticket [3] Ticket, authenticator [4] EncryptedData {Authenticator, { keyuse-pa-TGSReq-authenticator | keyuse-APReq-authenticator }} } AP-REP ::= [APPLICATION 15] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (15), enc-part [2] EncryptedData {EncAPRepPart, { keyuse-EncAPRepPart }} } EncAPRepPart ::= [APPLICATION 27] SEQUENCE { ctime [0] KerberosTime, cusec [1] Microseconds, subkey [2] EncryptionKey OPTIONAL, seq-number [3] UInt32 OPTIONAL } @end verbatim @include texi/ap.c.texi @include texi/apreq.c.texi @include texi/aprep.c.texi @include texi/encapreppart.c.texi @node SAFE and PRIV Functions @section SAFE and PRIV Functions The ``KRB-SAFE'' is an ASN.1 structure used by application client and servers to exchange integrity protected data. The integrity protection is keyed, usually with a key agreed on via the AP exchange (@pxref{AP-REQ and AP-REP Functions}). The following illustrates the KRB-SAFE ASN.1 structure. @verbatim KRB-SAFE ::= [APPLICATION 20] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (20), safe-body [2] KRB-SAFE-BODY, cksum [3] Checksum } KRB-SAFE-BODY ::= SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress, r-address [5] HostAddress OPTIONAL } @end verbatim @include texi/safe.c.texi The ``KRB-PRIV'' is an ASN.1 structure used by application client and servers to exchange confidential data. The confidentiality is keyed, usually with a key agreed on via the AP exchange (@pxref{AP-REQ and AP-REP Functions}). The following illustrates the KRB-PRIV ASN.1 structure. @verbatim KRB-PRIV ::= [APPLICATION 21] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (21), -- NOTE: there is no [2] tag enc-part [3] EncryptedData -- EncKrbPrivPart } EncKrbPrivPart ::= [APPLICATION 28] SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress -- sender's addr --, r-address [5] HostAddress OPTIONAL -- recip's addr } @end verbatim @include texi/priv.c.texi @node Ticket Functions @section Ticket Functions A Ticket is an ASN.1 structured that can be used to authenticate the holder to services. It contain an encrypted part, which the ticket holder cannot see, but can be encrypted by the service, and various information about the user and service, including an encryption key to use for the connection. @xref{Ticket (ASN.1) Functions}, for more details on the ASN.1 structure of a ticket. @include texi/tkt.c.texi @node AS Functions @section AS Functions The Authentication Service (AS) is used to get an initial ticket using e.g. your password. The following illustrates the AS-REQ and AS-REP ASN.1 structures. @verbatim -- Request -- AS-REQ ::= KDC-REQ {10} KDC-REQ {INTEGER:tagnum} ::= [APPLICATION tagnum] SEQUENCE { pvno [1] INTEGER (5) -- first tag is [1], not [0] --, msg-type [2] INTEGER (tagnum), padata [3] SEQUENCE OF PA-DATA OPTIONAL, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData { AuthorizationData, { keyuse-TGSReqAuthData-sesskey | keyuse-TGSReqAuthData-subkey } } OPTIONAL, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL } -- Reply -- AS-REP ::= KDC-REP {11, EncASRepPart, {keyuse-EncASRepPart}} KDC-REP {INTEGER:tagnum, TypeToEncrypt, UInt32:KeyUsages} ::= [APPLICATION tagnum] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (tagnum), padata [2] SEQUENCE OF PA-DATA OPTIONAL, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData {TypeToEncrypt, KeyUsages} } EncASRepPart ::= [APPLICATION 25] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } @end verbatim @include texi/as.c.texi @node TGS Functions @section TGS Functions The Ticket Granting Service (TGS) is used to get subsequent tickets, authenticated by other tickets (so called ticket granting tickets). The following illustrates the TGS-REQ and TGS-REP ASN.1 structures. @verbatim -- Request -- TGS-REQ ::= KDC-REQ {12} KDC-REQ {INTEGER:tagnum} ::= [APPLICATION tagnum] SEQUENCE { pvno [1] INTEGER (5) -- first tag is [1], not [0] --, msg-type [2] INTEGER (tagnum), padata [3] SEQUENCE OF PA-DATA OPTIONAL, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData { AuthorizationData, { keyuse-TGSReqAuthData-sesskey | keyuse-TGSReqAuthData-subkey } } OPTIONAL, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL } -- Reply -- TGS-REP ::= KDC-REP {13, EncTGSRepPart, { keyuse-EncTGSRepPart-sesskey | keyuse-EncTGSRepPart-subkey }} KDC-REP {INTEGER:tagnum, TypeToEncrypt, UInt32:KeyUsages} ::= [APPLICATION tagnum] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (tagnum), padata [2] SEQUENCE OF PA-DATA OPTIONAL, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData {TypeToEncrypt, KeyUsages} } EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } @end verbatim @include texi/tgs.c.texi @node Ticket (ASN.1) Functions @section Ticket (ASN.1) Functions @xref{Ticket Functions}, for an high-level overview of tickets. The following illustrates the Ticket and EncTicketPart ASN.1 structures. @verbatim Ticket ::= [APPLICATION 1] SEQUENCE { tkt-vno [0] INTEGER (5), realm [1] Realm, sname [2] PrincipalName, enc-part [3] EncryptedData -- EncTicketPart } -- Encrypted part of ticket EncTicketPart ::= [APPLICATION 3] SEQUENCE { flags [0] TicketFlags, key [1] EncryptionKey, crealm [2] Realm, cname [3] PrincipalName, transited [4] TransitedEncoding, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, caddr [9] HostAddresses OPTIONAL, authorization-data [10] AuthorizationData OPTIONAL } @end verbatim @include texi/ticket.c.texi @include texi/encticketpart.c.texi @node AS/TGS Functions @section AS/TGS Functions The Authentication Service (AS) is used to get an initial ticket using e.g. your password. The Ticket Granting Service (TGS) is used to get subsequent tickets using other tickets. Protocol wise the procedures are very similar, which is the reason they are described together. The following illustrates the AS-REQ, TGS-REQ and AS-REP, TGS-REP ASN.1 structures. Most of the functions use the mnemonic ``KDC'' instead of either AS or TGS, which means the function operates on both AS and TGS types. Only where the distinction between AS and TGS is important are the AS and TGS names used. Remember, these are low-level functions, and normal applications will likely be satisfied with the AS (@pxref{AS Functions}) and TGS (@pxref{TGS Functions}) interfaces, or the even more high-level Ticket Set (@pxref{Ticket Set Functions}) interface. @verbatim -- Request -- AS-REQ ::= KDC-REQ {10} TGS-REQ ::= KDC-REQ {12} KDC-REQ {INTEGER:tagnum} ::= [APPLICATION tagnum] SEQUENCE { pvno [1] INTEGER (5) -- first tag is [1], not [0] --, msg-type [2] INTEGER (tagnum), padata [3] SEQUENCE OF PA-DATA OPTIONAL, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData { AuthorizationData, { keyuse-TGSReqAuthData-sesskey | keyuse-TGSReqAuthData-subkey } } OPTIONAL, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL } -- Reply -- AS-REP ::= KDC-REP {11, EncASRepPart, {keyuse-EncASRepPart}} TGS-REP ::= KDC-REP {13, EncTGSRepPart, { keyuse-EncTGSRepPart-sesskey | keyuse-EncTGSRepPart-subkey }} KDC-REP {INTEGER:tagnum, TypeToEncrypt, UInt32:KeyUsages} ::= [APPLICATION tagnum] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (tagnum), padata [2] SEQUENCE OF PA-DATA OPTIONAL, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData {TypeToEncrypt, KeyUsages} } EncASRepPart ::= [APPLICATION 25] EncKDCRepPart EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } @end verbatim @include texi/kdc.c.texi @include texi/kdcreq.c.texi @include texi/kdcrep.c.texi @include texi/enckdcreppart.c.texi @node Authenticator Functions @section Authenticator Functions An ``Authenticator'' is an ASN.1 structure that work as a proof that an entity owns a ticket. It is usually embedded in the AP-REQ structure (@pxref{AP-REQ and AP-REP Functions}), and you most likely want to use an AP-REQ instead of a Authenticator in normal applications. The following illustrates the Authenticator ASN.1 structure. @verbatim Authenticator ::= [APPLICATION 2] SEQUENCE { authenticator-vno [0] INTEGER (5), crealm [1] Realm, cname [2] PrincipalName, cksum [3] Checksum OPTIONAL, cusec [4] Microseconds, ctime [5] KerberosTime, subkey [6] EncryptionKey OPTIONAL, seq-number [7] UInt32 OPTIONAL, authorization-data [8] AuthorizationData OPTIONAL } @end verbatim @include texi/authenticator.c.texi @node KRB-ERROR Functions @section KRB-ERROR Functions The ``KRB-ERROR'' is an ASN.1 structure that can be returned, instead of, e.g., KDC-REP or AP-REP, to indicate various error conditions. Unfortunately, the semantics of several of the fields are ill specified, so the typically procedure is to extract ``e-text'' and/or ``e-data'' and show it to the user. The following illustrates the KRB-ERROR ASN.1 structure. @verbatim KRB-ERROR ::= [APPLICATION 30] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (30), ctime [2] KerberosTime OPTIONAL, cusec [3] Microseconds OPTIONAL, stime [4] KerberosTime, susec [5] Microseconds, error-code [6] Int32, crealm [7] Realm OPTIONAL, cname [8] PrincipalName OPTIONAL, realm [9] Realm -- service realm --, sname [10] PrincipalName -- service name --, e-text [11] KerberosString OPTIONAL, e-data [12] OCTET STRING OPTIONAL } @end verbatim @include texi/krberror.c.texi @node Cryptographic Functions @section Cryptographic Functions Underneath the high-level functions described earlier, cryptographic operations are happening. If you need to access these cryptographic primitives directly, this section describes the functions available. Most cryptographic operations need keying material, and cryptographic keys have been isolated into it's own data structure @code{Shishi_key}. The following illustrates it's contents, but note that you cannot access it's elements directly but must use the accessor functions described below. @verbatim struct Shishi_key { int type; /* RFC 1510 encryption integer type */ char *value; /* Cryptographic key data */ int version; /* RFC 1510 ``kvno'' */ }; @end verbatim All functions that operate on this data structure are described now. @include texi/key.c.texi Applications that run uninteractively may need keying material. In these cases, the keys are stored in a file, a file that is normally stored on the local host. The file should be protected from unauthorized access. The file is in ASCII format and contains keys as outputed by @code{shishi_key_print}. All functions that handle these keys sets are described now. @include texi/keys.c.texi The previous functions require that the filename is known. For some applications, servers, it makes sense to provide a system default. These key sets used by server applications are known as ``hostkeys''. Here are the functions that operate on hostkeys (they are mostly wrappers around generic key sets). @include texi/hostkeys.c.texi After creating the key structure, it can be used to encrypt and decrypt data, calculate checksum on data etc. All available functions are described now. @include texi/crypto.c.texi An easier way to use encryption and decryption if your application repeatedly calls, e.g., @code{shishi_encrypt_ivupdate}, is to use the following functions. They store the key, initialization vector, etc, in a context, and the encryption and decryption operations update the IV within the context automatically. @include texi/crypto-ctx.c.texi Also included in Shishi is an interface to the really low-level cryptographic primitives. They map directly on the underlying cryptographic library used (i.e., Gnulib or Libgcrypt) and is used internally by Shishi. @include texi/low-crypto.c.texi @node X.509 Functions @section X.509 Functions The functions described in this section are used by the STARTTLS functionality, see @ref{Kerberos via TLS}. @include texi/pki.c.texi @node Utility Functions @section Utility Functions @include texi/realm.c.texi @include texi/principal.c.texi @include texi/authorize.c.texi @include texi/gztime.c.texi @include texi/password.c.texi @include texi/resolv.c.texi @node ASN.1 Functions @section ASN.1 Functions @include texi/asn1.c.texi @node Error Handling @section Error Handling @cindex Error Handling Most functions in `Libshishi' are returning an error if they fail. For this reason, the application should always catch the error condition and take appropriate measures, for example by releasing the resources and passing the error up to the caller, or by displaying a descriptive message to the user and cancelling the operation. Some error values do not indicate a system error or an error in the operation, but the result of an operation that failed properly. @menu * Error Values:: A list of all error values used. * Error Functions:: Error handling related functions. @end menu @node Error Values @subsection Error Values Errors are returned as an @code{int}. Except for the SHISHI_OK case, an application should always use the constants instead of their numeric value. Applications are encouraged to use the constants even for SHISHI_OK as it improves readability. Possible values are: @table @code @item SHISHI_OK This value indicates success. The value of this error is guaranteed to always be @code{0} so you may use it in boolean constructs. @include shishi-api-error-labels.texi @end table @node Error Functions @subsection Error Functions @include texi/error.c.texi @node Examples @section Examples @cindex Examples This section will be extended to contain walk-throughs of example code that demonstrate how `Shishi' is used to write your own applications that support Kerberos 5. The rest of the current section consists of some crude hints for the example client/server applications that is part of Shishi, taken from an email but saved here for lack of a better place to put it. There are two programs: 'client' and 'server' in src/. The client output an AP-REQ, waits for an AP-REP, and then simply reads data from stdin. The server waits for an AP-REQ, parses it and prints an AP-REP, and then read data from stdin. Both programs accept a Kerberos server name as the first command line argument. Your KDC must know this server, since the client tries to get a ticket for it (first it gets a ticket granting ticket for the default username), and you must write the key for the server into /usr/local/etc/shishi.keys on the Shishi format, e.g.: @example -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: sample/latte.josefsson.org Realm: JOSEFSSON.ORG 8W0VrQQBpxlACPQEqN91EHxbvFFo2ltt -----END SHISHI KEY----- @end example You must extract the proper encryption key from the KDC in some way. (This part will be easier when Shishi include a KDC, a basic one isn't far away, give me a week or to.) The intention is that the data read, after the authentication phase, should be protected using KRB_SAFE (see RFC) but I haven't added this yet. @node Kerberos Database Functions @section Kerberos Database Functions @cindex Shisa API @cindex Database interface Shisa is a separate and standalone library from Shishi (@pxref{Introduction to Shisa}). If you only wish to manipulate the information stored in the Kerberos user database used by Shishi, you do not need to link or use the Shishi library at all. However, you may find it useful to combine the two libraries. For two real world examples on using the Shisa library, refer to @file{src/shisa.c} (Shisa command line tool) and @file{src/kdc.c} (part of Shishid server). Shisa uses two @samp{struct}s to carry information. The first, @code{Shisa_principal}, is used to hold information about principals. The struct does not contain pointers to strings etc, so the library assumes the caller is responsible for allocating and deallocating the struct itself. Each such struct is (uniquely) identified by the combination of principal name and realm name. @example struct Shisa_principal @{ int isdisabled; uint32_t kvno; time_t notusedbefore; time_t lastinitialtgt; /* time of last initial request for a TGT */ time_t lastinitialrequest; /* time of last initial request */ time_t lasttgt; /* time of issue for the newest TGT used */ time_t lastrenewal; /* time of the last renewal */ time_t passwordexpire; /* time when the password will expire */ time_t accountexpire; /* time when the account will expire. */ @}; typedef struct Shisa_principal Shisa_principal; @end example The second structure is called @code{Shisa_key} and hold information about cryptographic keys. Because the struct contain pointers, and the caller cannot know how many keys a principal have, the Shisa library manages memory for the struct. The library allocate the structs, and the pointers within them. The caller may deallocate them, but it is recommended to use @code{shisa_key_free} or @code{shisa_keys_free} instead. Note that each principal may have multiple keys. @example struct Shisa_key @{ uint32_t kvno; int32_t etype; int priority; char *key; size_t keylen; char *salt; size_t saltlen; char *str2keyparam; size_t str2keyparamlen; char *password; @}; typedef struct Shisa_key Shisa_key; @end example Shisa is typically initialized by calling @code{shisa_init}, and deinitialized (when the application no longer need to use Shisa, typically when it shuts down) by calling @code{shisa_done}, but here are the complete (de)initialization interface functions. @include texi/setup.c.texi The default configuration file is typically read automatically by calling @code{shisa_init}, but if you wish to manually access the Shisa configuration file functions, here is the complete interface. @include texi/config.c.texi The core part of the Shisa interface follows. The typical procedure is to use @code{shisa_principal_find} to verify that a specific principal exists, and to extract some information about it, and then use @code{shisa_keys_find} to get the cryptographic keys for the principal, usually suppliying some hints as to which of all keys you are interested in (e.g., key version number and encryption algorithm number). @include texi/core.c.texi Error handling is similar to that for Shishi in general (@pxref{Error Handling}), i.e., you invoke @code{shisa_strerror} on the integer return value received by some function, if the return value is non-zero. Below is the complete interface. @include texi/err.c.texi @node Generic Security Service @section Generic Security Service @cindex Generic Security Service @cindex GSS-API @cindex GSSLib As an alternative to the native Shishi programming API, it is possible to program Shishi through the Generic Security Services (GSS) API. The advantage of using GSS-API in your security application, instead of the native Shishi API, is that it will be easier to port your application between different Kerberos 5 implementations, and even beyond Kerberos 5 to different security systems, that support GSS-API. In the free software world, however, almost the only widely used security system that supports GSS-API is Kerberos 5, so the last advantage is somewhat academic. But if you are porting applications using GSS-API for other Kerberos 5 implementations, or want a more mature and stable API than the native Shishi API, you may find using Shishi's GSS-API interface compelling. Note that GSS-API only offer basic services, for more advanced uses you must use the native API. Since the GSS-API is not specific to Shishi, it is distributed independently from Shishi. Further information on the GSS project can be found at @url{http://www.gnu.org/software/gss/}. @c ********************************************************** @c ******************* Acknowledgements ******************* @c ********************************************************** @node Acknowledgements @chapter Acknowledgements Shishi uses Libtasn1 by Fabio Fiorina, Libgcrypt and Libgpg-error by Werner Koch, Libidn by Simon Josefsson, cvs2cl by Karl Fogel, and gdoc by Michael Zucchi. Several GNU packages simplified development considerably, those packages include Autoconf, Automake, Libtool, Gnulib, Gettext, Indent, CVS, Texinfo, Help2man and Emacs. Several people reported bugs, sent patches or suggested improvements, see the file THANKS. Nicolas Pouvesle wrote the section about the Kerberos rsh/rlogin protocol. This manual borrows text from the Kerberos 5 specification. @c ********************************************************** @c ******************* Appendices ************************* @c ********************************************************** @node Criticism of Kerberos @appendix Criticism of Kerberos The intention with this section is to discuss various problems with Kerberos 5, so you can form a conscious decision how to deploy and use Shishi correctly in your organization. Currently the issues below are condensed, and mostly serve as a reminder for the author to elaborate on them. No encryption scheme with security proof. No standardized API, and GSS mechanism lack important functionality. Lack of authorization system. (krb5_kuserok()) Host to realm mapping relies on insecure DNS or static configuration files. Informational model and user database administration. Non-formal specification. Unclear on the etype to use for session keys (etype in request or database?). Unclear on how to populate some ``evident'' fields (e.g., cname in tickets for AS-REQ, or crealm, cname, realm, sname, ctime and cusec in KRB-ERROR). Unclear error code semantics (e.g., logic for when to use S_PRINCIPAL_UNKNOWN absent). Some KRB-ERROR fields are required, but can't be usefully populated in some situations, and no guidance is given on what they should contain. RFC 1510/1510bis incompatibilities. NULL enctype removed without discussion, and it is still used by some 1964 GSSAPI implementations. KRB_SAFE text (3.4.1) says the checksum is generated using the session or sub-session key, which contradicts itself (compare section 3.2.6) and also RFC 1510, which both allow the application to define the key. Verification of KRB_SAFE now require the key to be compatible with the (sub-)session key, in 1510 the only requirement was that it was collision proof. Problems with RFC 1510bis. Uses bignum INTEGER for TYPED-DATA and AD-AND-OR. Problems with crypto specification. It uses the word ``random'' many times, but there is no discussion on the randomness requirements. Practical experience indicate it is impossible to use true randomness for all ``random'' fields, and no implementation does this. A post by Don Davis on the ietf-krb-wg list tried to provide insight, but the information was never added to the specification. @node Protocol Extensions @appendix Protocol Extensions This appendix specifies the non-standard protocol elements implemented by Shishi. By nature of being non-standard, everything described here is experimental. Comments and feedback is appreciated. @menu * STARTTLS protected KDC exchanges:: How Shishi talks to KDC protected by TLS. * Telnet encryption with AES-CCM:: Integrity and privacy protected telnet. * Kerberized rsh and rlogin:: Description of KCMD protocol. * Key as initialization vector:: Some cryptography discussion. * The Keytab Binary File Format:: Format of keytab files. * The Credential Cache Binary File Format:: Format of ccache files. @end menu @node STARTTLS protected KDC exchanges @section STARTTLS protected KDC exchanges Shishi is able to ``upgrade'' TCP communications with the KDC to use the Transport Layer Security (TLS) protocol. The TLS protocol offers integrity and privacy protected exchanges. TLS also offers authentication using username and passwords, X.509 certificates, or OpenPGP certificates. Kerberos 5 claims to offer some of these features, although it is not as rich as the TLS protocol. An inconclusive list of the motivation for using TLS is given below. @itemize @bullet @item Server authentication of the KDC to the client. In traditional Kerberos 5, KDC authentication is only proved as a side effect that the KDC knows your encryption key (i.e., your password). @item Client authentication against KDC. Kerberos 5 assume the user knows a key (usually in the form of a password). Sometimes external factors make this hard to fulfill. In some situations, users are equipped with smart cards with a RSA authentication key. In others, users have a OpenPGP client on their desktop, with a public OpenPGP key known to the server. In some situations, the policy may be that password authentication may only be done through SRP. @item Kerberos exchanges are privacy protected. Part of many Kerberos packets are transfered without privacy protection (i.e., encryption). That part contains information, such as the client principal name, the server principal name, the encryption types supported by the client, the lifetime of tickets, etc. Revealing such information is, in some threat models, considered a problem. Thus, this enables ``anonymity''. @item Prevents downgrade attacks affecting encryption types. The encryption type of the ticket in KDC-REQ are sent in the clear in Kerberos 5. This allows an attacker to replace the encryption type with a compromised mechanisms, e.g. 56-bit DES. Since clients in general cannot know the encryption types other servers support, it is difficult for the client to detect if there was a man-in-the-middle or if the remote server simply did not support a stronger mechanism. Clients may chose to refuse 56-bit DES altogether, but in some environments this leads to operational difficulties. @item TLS is well-proved and the protocol is studied by many parties. This is an advantage in network design, where TLS is often already assumed as part of the solution since it is used to protect HTTP, IMAP, SMTP etc. In some threat models, the designer prefer to reduce the number of protocols that can hurt the overall system security if they are compromised. @end itemize Other reasons for using TLS exists. @subsection TCP/IP transport with TLS upgrade (STARTTLS) RFC 1510bis requires Kerberos servers (KDCs) to accept TCP requests. Each request and response is prefixed by a 4 octet integer in network byte order, indicating the length of the packet. The high bit of the length was reserved for future expansion, and servers that do not understand how to interpret a set high bit must return a @code{KRB-ERROR} with a @code{KRB_ERR_FIELD_TOOLONG} and close the TCP stream. The TCP/IP transport with TLS upgrade (STARTTLS) uses this reserved bit as follows. First we define a new extensible typed hole for Kerberos 5 messages, because we used the only reserved bit. It is thus prudent to offer future extensions on our proposal. Secondly we reserve two values in this new typed hole, and described how they are used to implement STARTTLS. @subsection Extensible typed hole based on reserved high bit When the high bit is set, the remaining 31 bits of the 4 octets are treated as an extensible typed hole, and thus form a 31 bit integer enumerating various extensions. Each of the values indicate a specific extended operation mode, two of which are used and defined here, and the rest are left for others to use. If the KDC do not understand a requested extension, it MUST return a @code{KRB-ERROR} with a @code{KRB_ERR_FIELD_TOOLONG} value (prefixed by the 4 octet length integer, with the high bit clear, as usual) and close the TCP stream. Meaning of the 31 lower bits in the 4 octet field, when the high bit is set: @verbatim 0 RESERVED. 1 STARTTLS requested by client. 2 STARTTLS request accepted by server. 3...2147483647 AVAILABLE for registration (via bug-shishi@josefsson.org). 2147483648 RESERVED. @end verbatim @subsection STARTTLS requested by client (extension mode 1) When this is sent by the client, the client is requesting the server to start TLS negotiation on the TCP stream. The client MUST NOT start TLS negotiation immediately. Instead, the client wait for either a KRB-ERROR (sent normally, prefixed by a 4 octet length integer) indicating the server do not understand the set high bit, or 4 octet which is to interpreted as an integer in network byte order, where the high bit is set and the remaining 31 bit are interpreted as an integer specifying the ``STARTTLS request accepted by server''. In the first case, the client infer that the server do not understand (or wish to support) STARTTLS, and can re-try using normal TCP, if unprotected Kerberos 5 exchanges are acceptable to the client policy. In the latter case, it should invoke TLS negotiation on the stream. If any other data is received, the client MUST close the TCP stream. @subsection STARTTLS request accepted by server (extension mode 2) This 4 octet message should be sent by the server when it has received the previous 4 octet message. The message is an acknowledgment of the client's request to initiate STARTTLS on the channel. The server MUST then invoke a TLS negotiation. @subsection Proceeding after successful TLS negotiation If the TLS negotiation ended successfully, possibly also considering client or server policies, the exchange within the TLS protected stream is performed like normal UDP Kerberos 5 exchanges, i.e., there is no TCP 4 octet length field before each packet. Instead each Kerberos packet MUST be sent within one TLS record, so the application can use the TLS record length as the Kerberos 5 packet length. @subsection Proceeding after failed TLS negotiation If the TLS negotiation fails, possibly due to client or server policy (e.g., inadequate support of encryption types in TLS, or lack of client or server authentication) the entity that detect the failure MUST disconnected the connection. It is expected that any error messages that explain the error condition is transfered by TLS. @subsection Interaction with KDC addresses in DNS Administrators for a KDC may announce the KDC address by placing SRV records in DNS for the realm, as described in @file{draft-ietf-krb-wg-krb-dns-locate-03.txt}. That document mention TLS, but do not reference any work that describe how KDCs uses TLS. Until further clarified, consider the TLS field in that document to refer to implementation supporting this STARTTLS protocol. @subsection Using TLS authentication logic in Kerberos The server MAY consider the authentication performed by the TLS exchange as sufficient to issue Kerberos 5 tickets to the client, without requiring, e.g., pre-authentication. However, it is not an error to require or use pre-authentication as well. The client may also indicate that it wishes to use TLS both for authentication and data protection by using the @samp{NULL} encryption type in its request. The server can decide from its local policy whether or not issuing tickets based solely on TLS authentication, and whether @samp{NULL} encryption within TLS, is acceptable or not. This mode is currently under investigation. @subsection Security considerations Because the initial token is not protected, it is possible for an active attacker to make it appear to the client that the server do not support this extension. It is up to client configuration to disallow non-TLS connections, if this vulnerability is deemed unacceptable. For interoperability, we suggest the default behaviour should be to allow automatic fallback to TCP or UDP. The security considerations of both TLS and Kerberos 5 are inherited. Using TLS for authentication and/or data protection together with Kerberos alter the authentication logic fundamentally. Thus, it may be that even if the TLS and Kerberos 5 protocols and implementations were secure, the combination of TLS and Kerberos 5 described here could be insecure. No channel bindings are provided in the Kerberos messages. It is an open question whether, and how, this should be fixed. @node Telnet encryption with AES-CCM @section Telnet encryption with AES-CCM This appendix describe how Shishi use the Advanced Encryption Standard (AES) encryption algorithm in Counter with CBC-MAC mode (RFC 3610) with the telnet encryption option (RFC 2946). @subsection Command Names and Codes @verbatim Encryption Type AES_CCM 12 Suboption Commands AES_CCM_INFO 1 AES_CCM_INFO_OK 2 AES_CCM_INFO_BAD 3 @end verbatim @subsection Command Meanings @verbatim IAC SB ENCRYPT IS AES_CCM AES_CCM_INFO IAC SE @end verbatim The sender of this command select desired M and L parameters, and nonce, as described in RFC 3610, and sends it to the other side of the connection. The parameters and the nonce are sent in clear text. Only the side of the connection that is WILL ENCRYPT may send the AES_CCM_INFO command. @verbatim IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_BAD IAC SE @end verbatim The sender of this command reject the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST be sent if the nonce field length does not match the selected value for L. The command MAY be sent if the receiver do not accept the parameters for reason such as policy. No capability is provided to negotiate these parameters. @verbatim IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_OK IAC SE @end verbatim The sender of this command accepts the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST NOT be sent if the nonce field length does not match the selected value for L. @subsection Implementation Rules Once a AES_CCM_INFO_OK command has been received, the WILL ENCRYPT side of the connection should do keyid negotiation using the ENC_KEYID command. Once the keyid negotiation has successfully identified a common keyid, then START and END commands may be sent by the side of the connection that is WILL ENCRYPT. Data will be encrypted using the AES-CCM algorithm, with the negotiated nonce and parameters M and L. After each successful encryption and decryption, the nonce is treated as an integer in network byte order, and incremented by one. If encryption (decryption) is turned off and back on again, and the same keyid is used when re-starting the encryption (decryption), the intervening clear text must not change the state of the encryption (decryption) machine. In particular, the AES-CCM nonce must not be re-set. If a START command is sent (received) with a different keyid, the encryption (decryption) machine must be re-initialized immediately following the end of the START command with the new key and the parameters sent (received) in the last AES_CCM_INFO command. If a new AES_CCM_INFO command is sent (received), and encryption (decryption) is enabled, the encryption (decryption) machine must be re-initialized immediately following the end of the AES_CCM_INFO command with the new nonce and parameters, and the keyid sent (received) in the last START command. If encryption (decryption) is not enabled when a AES_CCM_INFO command is sent (received), the encryption (decryption) machine must be re- initialized after the next START command, with the keyid sent (received) in that START command, and the nonce and parameters sent (received) in this AES_CCM_INFO command. At all times MUST each end make sure that a AES-CCM nonce is not used twice under the same encryption key. The rules above help accomplish this in an interoperable way. @subsection Integration with the AUTHENTICATION telnet option <> As noted in the telnet ENCRYPTION option specifications, a keyid value of zero indicates the default encryption key, as might be derived from the telnet AUTHENTICATION option. If the default encryption key negotiated as a result of the telnet AUTHENTICATION option contains less than 32 bytes (corresponding to two 128 bit keys), then the AES_CCM option MUST NOT be offered or used as a valid telnet encryption option. Furthermore, depending on policy for key lengths, the AES_CCM option MAY be disabled if the default encryption key contain less than 48 bytes (for two 192 bit keys), or less than 64 bytes (for two 256 bit keys), as well. The available encrypt key data is divided on two halves, where the first half is used to encrypt data sent from the server (decrypt data received by the client), and the second half is used to encrypt data sent from the client (decrypt data received by the server). Note that the above algorithm assumes that the AUTHENTICATION mechanism generate keying material suitable for AES-CCM as used in this specification. This is not necessarily true in general, but we specify this behaviour as the default since it is true for most authentication systems in popular use today. New telnet AUTHENTICATION mechanisms may specify alternative methods for determining the keys to be used for this cipher suite in their specification, if the session key negotiated by that authentication mechanism is not a DES key and where this algorithm may not be safely used. Kerberos 5 authentication clarification: The key used to encrypt data from the client to the server is taken from the sub-session key in the AP-REQ. The key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REP. If mutual authentication is not negotiated, the key used to encrypt data from the client to the server is taken from the session key in the ticket, and the key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REQ. Leaving the AP-REQ sub-key field empty MUST disable the AES_CCM option. @subsection Security Considerations The protocol must be properly and securely implemented. For example, an implementation should not be vulnerable to various implementation-specific attacks such as buffer overflows or side-channel analysis. We wish to repeat the suggestion from RFC 2946, to investigate in a STARTTLS approach for Telnet encryption (and also authentication), when the security level provided by this specification is not adequate. @subsubsection Telnet Encryption Protocol Security Considerations The security consideration of the Telnet encryption protocol are inherited. It should be noted that the it is up to the authentication protocol used, if any, to bind the authenticity of the peers to a specific session. The Telnet encryption protocol does not, in general, protect against possibly malicious downgrading to any mutually acceptable, but not preferred, encryption type. This places a requirement on each peer to only accept encryption types it trust fully. In other words, the Telnet encryption protocol do not guarantee that the strongest mutually acceptable encryption type is always selected. @subsubsection AES-CCM Security Considerations The integrity and privacy claims are inherited from AES-CCM. In particular, the implementation must make sure a nonce is not used more than once together with the same key. Furthermore, the encryption key is assumed to be random, i.e., it should not be possible to guess it with probability of success higher than guessing any uniformly selected random key. RFC 1750 gives an overview of issues and recommendations related to randomness. @subsection Acknowledgments This document is based on the various Telnet Encryption RFCs (RFC 2946, RFC 2947, RFC 2948, RFC 2952 and RFC 2953). @node Kerberized rsh and rlogin @section Kerberized rsh and rlogin This appendix describe the KCMDV0.2 protocol used in shishi patched version of inetutils. The KCMD protocol was developped by the MIT Kerberos team for kerberized rsh an rlogin programs. Differences between rlogin an rsh will be explained, like those between v0.1 and v0.2 of the protocol for compatibility reasons. It is possible that some parts of this document are not in conformity with original KCMD protocol because there is no official specification about it. However, it seems that shishi implementation is compatible with MIT's one. @strong{Warning:} If you are seriously considering using Kerberos rsh or rlogin, instead of more robust remote access protocols such as SSH, you may first want to explore @url{http://www.cs.berkeley.edu/~hildrum/kerberos/} and the full paper at @url{http://www.cs.berkeley.edu/~hildrum/043.pdf}. @subsection Establish connection First the client should establish a TCP connection with the server. Default ports are 543 (klogin), 544 (kshell), 2105 (eklogin). eklogin is the same as klogin but with encryption. Their is no longer ekshell port because encrypted and normal connection use the same port (kshell). Kshell need a second connection for stderr. The client should send a null terminated string that represent the port of this second connection. Klogin and eklogin does not use a second connection for stderr so the client must send a null byte to the server. Contrary to classic rsh/rlogin, server must not check if the client port is in the range 0-1023. @subsection Kerberos identification When connections are established, first thing to do is to indicate kerberos authentication must be used. So the client will send a string to indicate it will used kerberos 5. It will call a length-string "strl" the couple (lenght of the string strl, null terminated string strl). Length of the string is an int32 (32bits int) in MSB order (for the network). So the client send this length-string strl : @verbatim KRB5_SENDAUTH_V1.0 @end verbatim After that the client must indicate which version of the protocol it will used by sending this length-string strl : @verbatim KCMDV0.2 @end verbatim It can be V0.1 for older versions. If indentification from client is good, server will send a null byte (0x00). Else if authentication message is wrong, server send byte 0x01, else if protocol version message is wrong server send byte 0x02. @subsection Kerberos authentication When client is indentified, kerberos authentication can begin. The client must send an AP-REQ to the server. AP-REQ authenticator must have a subkey (only for KCMDV0.2) and a checksum. Authenticator checksum is created on following string : @example "serverport:""terminaltype""remoteusername" @end example for example : @example 543:linux/38400user @end example remoteusername corresponds to the identity of the client on remote machine. AP-REQ is sended in der encoded format. The length (int32) of der encoded AP-REQ is sended in network format (MSB), following by the der encoded AP-REQ. If all is correct, server send a null int32 (MSB format but like it is null it is not important). KCMD protocol use mutual authentication, so server must now send and AP-REP : (in32 lenght in MSB of der encoded AP-REP)(der encoded AP-REP). Now server and client are partially authenticated. @subsection Extended authentication Client must now send 3 different null terminated strings (without lenght) : @itemize @item remote user name (user identity on remote machine) @item terminal type for rlogin or command for rsh @item local user name (user identity on client machine) @end itemize example for rsh : @example "rname\0" "cat /usr/local/etc/shishi.conf" "lname\0" @end example Server must verify that checksum in AP-REQ authenticator is correct by computing a new hash like client has done. Server must verify that principal (in AP-REQ) has right to log in on the remote user account. For the moment shishi only check if remote user name is equal to principal. A more complex authorization code is planned. Look at the end to know how MIT/Heimdal do to check authorization. If all is correct server send a null byte, else an error message string (null terminated string) is sent. User read the first byte. If it is equal to zero, authentication is correct and is logged on the remote host. Else user can read the error messsage send by the server. @subsection Window size For rlogin protocol, when authentication is complete, the server can optionnaly send a message to ask for window terminal size of user. Then the user can respond but it is not an obligation. In KCMDV0.1 server send an urgent TCP message (MSG_OOB) with one byte : @example TIOCPKT_WINDOW = 0x80 @end example In KCMDV0.2 server does not send an urgent message but write on the socket 5 bytes : @example '\377', '\377', 'o', 'o', TIOCPKT_WINDOW @end example If encryption is enabled (eklogin) server must send this 5 bytes encrypted. Client can answer in both protocol version with : @example '\377', '\377', 's', 's', "struct winsize" @end example The winsize structure is filled with corresponding setting to client's terminal. If encryption is enabled this answer must be send encrypted. @subsection End of authentication The "classic" rsh/rlogin can be used now. @subsection Encryption Encryption mode is used when a connection with eklogin is established. Encryption with krsh can be used too. Before, there was a specific port for that (ekshell), but now to indicate that encryption must be used with krsh, client must add "-x " before the command when it send it between remote user name and local user name. When the client compute the checksum for AP-REQ authenticator the "- x" must not be included. Encryption in KCMDV0.2 is not the same as in KCMDV0.1. KCMDV0.1 uses ticket session key as encryption key, and use standard Kerberos encryption functions. This protocol only supports des-cbc-crc, des-cbc-md4, des-cbc-md5 and does not use initialisation vectors. For example on each encryption/decryption calls, the following prototype kerberos function should be used : @example kerberos_encrypt (key, keyusage, in, out) (or decrypt) @end example KCMDV0.2 can be used with all kerberos encryption modes (des, 3des, aes, arcfour) and use AP-REQ authenticator subkey. In opposite to KCMDV0.1 initialisation vectors are used. All encryptions/descryptions must be made using a cryptographic context (for example to use the updated iv, or sbox) : @example kerberos_init(ctx, iv, key, keyusage) kerberos_encrypt (ctx, in, out) @end example For both protocols, keyusage id for des-cbc-md5, des-cbc-md4, des-cbc-crc and des3-cbc-sha1 (for KCMDV0.2) : @example keyusage = 1026 @end example For other KCMDV0.2 modes keyusage is different for each encryption/decryption usage. To understand, eklogin use 1 socket. It encrypts data (output 1) to send and decrypts (input 1) received data. Kshell use 2 sockets (1 for transmit data, 1 for stderr). So there are four modes : @verbatim transmit : input 1 output 1 stderr : input 2 output 2 @end verbatim There is a keyusage for each modes. The keyusage must correspond on client and server side. For example in klogin client input 1 keyusage will be server output 1 keyusage. @multitable @columnfractions .15 .15 .15 @item I/O @tab Client @tab Server @item intput 1 @tab 1028 @tab 1030 @item output 1 @tab 1030 @tab 1028 @item intput 2 @tab 1032 @tab 1034 @item output 2 @tab 1034 @tab 1032 @end multitable Those keyusages must be used with AES and ARCFOUR modes. KCMDV0.2 uses IV (initialisation vector). Like for keyusage, client IV must correspond to server IV. IV size is equal to key type, blocksize. All bytes of IV must be initialised to : @multitable @columnfractions .15 .15 .15 @item I/O @tab Client @tab Server @item intput 1 @tab 0 @tab 1 @item output 1 @tab 1 @tab 0 @item intput 2 @tab 2 @tab 3 @item output 2 @tab 3 @tab 2 @end multitable ARCFOUR mode does not use IV. However, like it is said before, a context must be used to keep the updated sbox. Normal message with klogin and kshell are sent like that : @example (int 32 lenght of message in MSB order) (message) @end example In encrypted mode it is a bit different : @example (int 32 length of unencrypted message in MSB order) (encrypted message) @end example In KCMDV0.2 encrypted message is create like that : @example encrypt ( (int 32 length of message in MSB order) (message) ) @end example A check on message size can be made in second version of the protocol. @subsection KCMDV0.3 This part only gives possible ways to extend KCMD protocol. Does not take that as must have in KCMD implementation. Extensions of KCMV0.2 could be made. For example kshell supposes there are no files with name "-x *". I think the same thing can be supposed with terminal name for klogin. So client could add "-x " to terminal type it sends to server to indicate it will use encryption. Like that there will be only one port for klogin/eklogin : 543. In encrypted mode kshell send command in clear on the network, this could be considered as insecure as user have decided to use encryption. This is not really a problem for klogin because it just sends terminal type. In encrypted mode, klogin and kshell clients could only send "-x" as command or terminal type. After that encryption is activated, and the client could send terminal type or command encrypted. The server will send the null byte to say that all is correct, or error message in encrypted form. @subsection MIT/Heimdal authorization This part describes how MIT/Heimdal version check authorization of the user to log in on the remote machine. Authorization check is made by looking if the file .k5login exists on the account of the remote user. If this file does not exist, remote user name must be the same as principal in AP-REQ to valid authorization. Else if this file exists, check first verify that remote user or root are the owner of .k5login. If it is not the case, the check fails. If it is good, check reads each line of that file and compare each readed name to principal. If principal is found in .k5login, authorization is valid, else user is not allowed to connect on remote host with the specified remote user name (that can be the same as principal). So someone (for example user "user1") can remote log into "user2" account if .k5login is present in user2 home dir and this file is owned by user2 or root and user1 name is present in this file. @node Key as initialization vector @section Key as initialization vector The @code{des-cbc-crc} algorithm (@pxref{Cryptographic Overview}) uses the DES key as the initialization vector. This is problematic in general (see below@footnote{The post is copyrighted by David Wagner, included here with permission, the canonical location is @url{http://www.cs.berkeley.edu/~daw/my-posts/key-as-iv-broken}}), but may be mitigated in Kerberos by the CRC checksum that is also included. @verbatim From daw@espresso.CS.Berkeley.EDU Fri Mar 1 13:32:34 PST 1996 Article: 50440 of sci.crypt Path: agate!daw From: daw@espresso.CS.Berkeley.EDU (David A Wagner) Newsgroups: sci.crypt Subject: Re: DES-CBC and Initialization Vectors Date: 29 Feb 1996 21:48:16 GMT Organization: University of California, Berkeley Lines: 31 Message-ID: <4h56v0$3no@agate.berkeley.edu> References: <4h39li$33o@gaia.ns.utk.edu> NNTP-Posting-Host: espresso.cs.berkeley.edu In article <4h39li$33o@gaia.ns.utk.edu>, Nair Venugopal wrote: > Is there anything wrong in using the key as the I.V. in DES-CBC mode? Yes, you're open to a chosen-ciphertext attack which recovers the key. Alice is sending stuff DES-CBC encrypted with key K to Bob. Mary is an active adversary in the middle. Suppose Alice encrypts some plaintext blocks P_1, P_2, P_3, ... in DES-CBC mode with K as the IV, and sends off the resulting ciphertext A->B: C_1, C_2, C_3, ... where each C_j is a 8-byte DES ciphertext block. Mary wants to discover the key K, but doesn't even know any of the P_j's. She replaces the above message by M->B: C_1, 0, C_1 where 0 is the 8-byte all-zeros block. Bob will decrypt under DES-CBC, recovering the blocks Q_1, Q_2, Q_3 where Q_1 = DES-decrypt(K, C_1) xor K = P_1 Q_2 = DES-decrypt(K, C_2) xor C_1 = (some unimportant junk) Q_3 = DES-decrypt(K, C_1) xor 0 = P_1 xor K Bob gets this garbage-looking message Q_1,Q_2,Q_3 which Mary recovers (under the chosen-ciphertext assumption: this is like a known-plaintext attack, which isn't too implausible). Notice that Mary can recover K by K = Q_1 xor Q_3; so after this one simple active attack, Mary gets the key back! So, if you must use a fixed IV, don't use the key-- use 0 or something like that. Even better, don't use a fixed IV-- use the DES encryption of a counter, or something like that. @end verbatim @node The Keytab Binary File Format @section The Keytab Binary File Format The keytab file format is described in the file @file{keytab.txt}, included in verbatim below. @verbatiminclude keytab.txt @node The Credential Cache Binary File Format @section The Credential Cache Binary File Format The credential cache file format is described in the file @file{keytab.txt}, included in verbatim below. @verbatiminclude ccache.txt @node Copying Information @appendix Copying Information @menu * GNU Free Documentation License:: License for copying this manual. @end menu @node GNU Free Documentation License @appendixsec GNU Free Documentation License @cindex FDL, GNU Free Documentation License @include fdl-1.3.texi @node Function and Data Index @unnumbered Function and Data Index @printindex fn @node Concept Index @unnumbered Concept Index @printindex cp @summarycontents @contents @bye shishi-1.0.2/doc/cyclo/0000755000000000000000000000000012126773323011634 500000000000000shishi-1.0.2/doc/cyclo/Makefile.am0000664000000000000000000000247412126660507013620 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. EXTRA_DIST = cyclo-$(PACKAGE).html vcurl = "http://git.savannah.gnu.org/gitweb/?p=$(PACKAGE).git;a=blob;f=lib/%FILENAME%;hb=HEAD" cyclo-$(PACKAGE).html: (cd ${top_srcdir}/lib && \ $(PMCCABE) *.[ch] \ | sort -nr \ | LANG=C $(AWK) -f ${abs_top_srcdir}/build-aux/pmccabe2html \ -v lang=html -v name="$(PACKAGE_STRING)" \ -v vcurl=$(vcurl) \ -v url="http://www.gnu.org/software/$(PACKAGE)/" \ -v css=${abs_top_srcdir}/build-aux/pmccabe.css) \ > tmp mv tmp $@ shishi-1.0.2/doc/cyclo/cyclo-shishi.html0000644000000000000000000176174112126773323015061 00000000000000 Cyclomatic Complexity report for GNU Shishi 1.0.2 Back to GNU Shishi 1.0.2 Homepage

    GNU Shishi 1.0.2 Cyclomatic Complexity Report

    Report generated at: Wed Apr 3 11:30:59 CEST 2013

    Summary
    Total number of functions 876
    Number of low risk functions 825
    Number of moderate risk functions 39
    Number of high risk functions 11
    Number of untestable functions 1

    Details for all functions
      Cyclomatic Complexity Risk Evaluation
      0 - 10 Simple module, without much risk
      11 - 20 More complex module, moderate risk
      21 - 50 Complex module, high risk
      greater than 50 Untestable module, very high risk

    Function Name Modified Cyclo Number of
    Statements
    Number of
    Lines
    Source File
    shishi_krberror_build 57 85 127 krberror.c
    shishi_cfg 43 138 234 cfg.c
    shishi_tkts_add_ccache_mem 31 102 189 tktccache.c
    parse_credential 27 80 116 ccache.c
    shishi_tkt_pretty_print 26 75 102 tkt.c
    shishi_keys_add_keytab_mem 24 104 201 keytab.c
    _shishi_sendrecv_tls1 22 75 141 starttls.c
    des_string_to_key 22 117 179 crypto-des.c
    shishi_tkt_to_ccache_mem 21 86 149 tktccache.c
    shishi_kdcrep_get_ticket 21 75 111 kdcrep.c
    shishi_apreq_get_ticket 21 74 110 apreq.c
    act_hint_on_kdcreq 21 48 99 tkts.c
    shishi_apreq_set_ticket 20 69 100 apreq.c
    shishi_key_parse 20 51 88 diskio.c
    _shishi_sendrecv_tls 19 68 131 starttls.c
    pack_credential 19 62 89 ccache.c
    init_read 19 33 50 init.c
    shishi_tkt_match_p 19 19 38 tkts.c
    shishi_resolv 18 66 133 resolv.c
    shishi_kdcrep_set_ticket 18 68 98 kdcrep.c
    _shishi_kdcreq 18 60 102 kdcreq.c
    shishi_tkts_get_tgt 17 50 87 tkts.c
    recover_preauth_info 17 48 93 tkts.c
    shishi_cfg_from_file 17 30 51 cfg.c
    arcfour_hmac_encrypt 16 78 144 crypto-rc4.c
    shishi_prompt_password 16 59 104 password.c
    shishi_apreq 16 48 95 apreq.c
    shishi_principal_name 16 47 63 principal.c
    shishi_parse_name 16 32 60 principal.c
    arcfour_hmac_decrypt 15 70 120 crypto-rc4.c
    shishi_enckdcreppart_populate_encticketpart 15 43 70 enckdcreppart.c
    _shishi_simplified_encrypt 15 42 83 crypto.c
    shishi_as_rep_process 15 42 79 as.c
    shishi_tgs_process 15 33 64 kdc.c
    shishi_priv 14 49 72 priv.c
    shishi_krberror_pretty_print 14 43 81 krberror.c
    shishi_kdcreq_add_padata_preauth 13 46 68 kdcreq.c
    libgcrypt_dencrypt 13 43 83 low-crypto.c
    shishi_authorize_k5login 13 39 73 authorize.c
    sendrecv_host 13 31 60 netio.c
    shishi_keys_for_serverrealm_in_file 13 22 44 keys.c
    _shishi_binprint 13 19 23 utils.c
    _shishi_simplified_dencrypt 12 35 72 crypto.c
    shishi_safe 12 43 63 safe.c
    parse_principal 12 34 54 ccache.c
    shishi_ap_req_build 12 31 74 ap.c
    set_tgtflags_based_on_hint 12 24 43 tkts.c
    _shishi_bin7print 12 18 22 utils.c
    shishi_as_derive_salt 11 46 67 kdc.c
    shishi_kdcrep_decrypt 11 39 70 kdcrep.c
    shishi_tkts_get_tgs 11 31 51 tkts.c
      recover_preauth 10 45 96 tkts.c
      sendrecv_tcp 10 55 92 netio.c
      shishi_dr 10 45 74 crypto.c
      shishi_as_check_cname 10 36 57 kdc.c
      shishi_authenticator 10 35 73 authenticator.c
      maybe_install_usercfg 10 34 55 init.c
      _shishi_kdcreq_input 10 32 62 diskio.c
      _shishi_read_armored_data 10 32 61 diskio.c
      shishi_key_print 10 31 48 diskio.c
      _shishi_kdcrep_input 10 30 61 diskio.c
      _shishi_enckdcreppart_input 10 29 65 diskio.c
      _shishi_simplified_derivekey 10 28 57 crypto.c
      shishi_kdcreq_build 10 25 48 kdcreq.c
      shishi_as_sendrecv_hint 10 22 35 as.c
      _shishi_escapeprint 9 9 15 utils.c
      shishi_n_fold 9 53 100 crypto.c
      shishi_kdcreq_sendrecv_hint 9 40 78 kdc.c
      shishi_kdc_copy_cname 9 35 50 kdc.c
      shishi_priv_process 9 33 57 priv.c
      shishi_apreq_decrypt 9 32 58 apreq.c
      shishi_aprep_decrypt 9 32 58 aprep.c
      shishi_ticket_decrypt 9 32 57 ticket.c
      pack_principal 9 30 42 ccache.c
      shishi_tgs_req_build 9 26 54 tgs.c
      shishi_kdc_check_nonce_1 9 22 48 kdc.c
      shishi_priv_from_file 9 21 34 priv.c
      shishi_priv_to_file 9 21 34 priv.c
      shishi_safe_from_file 9 21 34 safe.c
      shishi_kdcreq_from_file 9 21 34 kdcreq.c
      shishi_apreq_from_file 9 21 34 apreq.c
      shishi_safe_to_file 9 21 34 safe.c
      shishi_authenticator_from_file 9 21 34 authenticator.c
      shishi_encapreppart_from_file 9 21 34 encapreppart.c
      shishi_kdcrep_from_file 9 21 34 kdcrep.c
      shishi_aprep_from_file 9 21 34 aprep.c
      shishi_kdcreq_to_file 9 21 34 kdcreq.c
      shishi_krberror_from_file 9 21 34 krberror.c
      shishi_apreq_to_file 9 21 34 apreq.c
      shishi_authenticator_to_file 9 21 34 authenticator.c
      shishi_asn1_read 9 21 41 asn1.c
      shishi_kdcrep_to_file 9 21 34 kdcrep.c
      shishi_encapreppart_to_file 9 21 34 encapreppart.c
      shishi_aprep_to_file 9 21 34 aprep.c
      shishi_krberror_to_file 9 21 34 krberror.c
      shishi_tgs_sendrecv_hint 9 20 35 tgs.c
      des_verify 8 38 70 crypto-des.c
      key_to_keytab_entry 8 84 122 keytab.c
      sendrecv_udp 8 43 71 netio.c
      arcfour_hmac_md5_checksum 8 42 75 crypto-rc4.c
      main 8 37 69 ccache.c
      shishi_tkt 8 31 69 tkt.c
      shishi_ap_req_process_keyusage 8 30 70 ap.c
      shishi_encrypt_ivupdate_etype 8 29 63 crypto.c
      shishi_encapreppart 8 28 60 encapreppart.c
      shishi_aprep_verify 8 26 60 aprep.c
      _shishi_simplified_decrypt 8 26 61 crypto.c
      _shishi_priv_input 8 24 48 diskio.c
      _shishi_safe_input 8 24 48 diskio.c
      _shishi_krberror_input 8 24 49 diskio.c
      _shishi_authenticator_input 8 24 49 diskio.c
      _shishi_encapreppart_input 8 24 50 diskio.c
      _shishi_aprep_input 8 24 48 diskio.c
      _shishi_apreq_input 8 24 48 diskio.c
      shishi_tgs_rep_build 8 23 45 tgs.c
      shishi_as_rep_build 8 23 46 as.c
      shishi_tgs_rep_process 8 22 46 tgs.c
      _shishi_ticket_input 8 22 43 diskio.c
      do_preauth 8 21 49 tkts.c
      shishi_realm_for_server_file 8 21 34 realm.c
      shishi_realm_for_server_dns 8 19 33 realm.c
      des_decrypt_verify 8 38 78 crypto-des.c
      shishi_authorized_p 7 27 52 authorize.c
      des3_string_to_key 7 37 65 crypto-3des.c
      aes_string_to_key 7 35 65 crypto-aes.c
      shishi_principal_name_realm 7 30 60 principal.c
      shishi_done 7 30 49 init.c
      shishi_asn1_to_der_field 7 29 61 asn1.c
      rot13 7 28 51 crypto.c
      shishi_tgs 7 27 50 tgs.c
      shishi_tkts_print_for_service 7 26 50 tkts.c
      shishi_tkts_read 7 25 43 tkts.c
      shishi_aprep 7 23 46 aprep.c
      ocadd 7 21 33 crypto.c
      shishi_krberror 7 21 41 krberror.c
      shishi_keys_from_file 7 21 37 keys.c
      shishi_kdc_process 7 20 54 kdc.c
      shishi_tkts_find 7 19 30 tkts.c
      srv_compare 7 16 25 resolv.c
      shishi_cipher_parse 7 16 21 crypto.c
      shishi_ap_rep_verify 7 16 30 ap.c
      shishi_init_server_with_paths 7 11 19 init.c
      shishi_realm_default_guess 7 11 21 realm.c
      shishi_tkt_key 7 10 24 tkt.c
      shishi_init_server 6 9 18 init.c
      arcfour_keyusage 6 7 63 crypto-rc4.c
      init_handle 6 41 73 init.c
      armor_data 6 30 56 diskio.c
      shishi_cfg_print 6 27 35 cfg.c
      shishi_principal_name_set 6 27 42 principal.c
      shishi_as 6 25 46 as.c
      shishi_decrypt_ivupdate_etype 6 25 57 crypto.c
      shishi_kdcreq_get_padata 6 25 40 kdcreq.c
      shishi_cfg_authorizationtype_set 6 24 39 cfg.c
      shishi_cfg_clientkdcetype_set 6 24 38 cfg.c
      shishi_encticketpart 6 24 45 encticketpart.c
      shishi_ticket_sname_set 6 23 37 ticket.c
      shishi_tkt_lastreq 6 23 38 tkt.c
      shishi_safe_build 6 22 36 safe.c
      shishi_tkts_write 6 21 46 tkts.c
      shishi_enckdcreppart_sname_set 6 21 38 enckdcreppart.c
      simplified_hmac_verify 6 21 37 crypto.c
      ccache_pack 6 19 28 ccache.c
      _shishi_kdcrep 6 18 36 kdcrep.c
      shishi_keys_to_file 6 16 27 keys.c
      shishi_tkt_lastreq_pretty_print 6 16 28 tkt.c
      shishi_key_to_file 6 16 26 diskio.c
      shishi_tkts_expire 6 12 27 tkts.c
      shishi_asn1_read_optional 5 8 17 asn1.c
      des_encrypt_checksum 5 28 51 crypto-des.c
      shishi_des_cbc_mac 5 26 50 low-crypto.c
      shishi_aprep_enc_part_add 5 25 51 aprep.c
      des3_random_to_key 5 24 45 crypto-3des.c
      shishi_ap_nosubkey 5 24 47 ap.c
      des_checksum 5 23 40 crypto-des.c
      shishi_safe_verify 5 22 35 safe.c
      shishi_as_check_crealm 5 22 43 kdc.c
      shishi_verify 5 22 44 crypto.c
      shishi_checksum 5 21 45 crypto.c
      shishi_authenticator_add_authorizationdata 5 20 37 authenticator.c
      shishi_kdcreq_add_padata 5 20 31 kdcreq.c
      shishi_authenticator_authorizationdata 5 19 33 authenticator.c
      shishi_kdcreq_set_etype 5 18 27 kdcreq.c
      shishi_as_process 5 18 34 kdc.c
      shishi_encapreppart_time_copy 5 18 29 encapreppart.c
      ccache_parse 5 18 28 ccache.c
      sendrecv_srv3 5 18 35 netio.c
      shishi_derive_default_salt 5 17 31 principal.c
      shishi_encapreppart_get_key 5 17 29 encapreppart.c
      shishi_tkts_get 5 16 30 tkts.c
      shishi_ap_req_decode 5 15 29 ap.c
      sendrecv_static 5 15 30 netio.c
      sendrecv_srv2 5 15 30 netio.c
      shishi_enckdcreppart 5 15 25 enckdcreppart.c
      des3none_dencrypt 5 14 42 crypto-3des.c
      shishi_key_from_base64 5 14 31 key.c
      shishi_kdcreq_get_padata_tgs 5 14 25 kdcreq.c
      shishi_kdcrep_set_enc_part 5 13 25 kdcrep.c
      des_set_odd_key_parity 5 13 18 crypto-des.c
      shishi_apreq_set_authenticator 5 13 26 apreq.c
      shishi_ticket_set_enc_part 5 13 25 ticket.c
      shishi_tkt_key_set 5 13 24 tkt.c
      des_set_odd_key_parity 5 13 18 crypto-3des.c
      shishi_keys_done 5 12 19 keys.c
      shishi_tkts_remove 5 12 27 tkts.c
      shishi_pbkdf2_sha1 5 11 24 low-crypto.c
      _shishi_hexprint 5 11 16 utils.c
      shishi_kdc_sendrecv_hint 5 11 27 netio.c
      raw_des_checksum1 4 29 53 crypto-des.c
      raw_des_checksum0 4 26 47 crypto-des.c
      shishi_principal_default_guess 4 9 15 principal.c
      shishi_ap_string2option 4 9 16 ap.c
      shishi_ap_authenticator_cksumdata 4 7 13 ap.c
      _shishi_transport2string 4 7 12 cfg.c
      shishi_tkts_done 4 7 14 tkts.c
      shishi_der_msgtype 4 3 9 asn1.c
      shishi_keys_to_keytab_mem 4 22 41 keytab.c
      shishi_string_to_key 4 21 46 crypto.c
      shishi_key_value_set 4 2 8 key.c
      shishi_principal_set 4 19 33 principal.c
      shishi_dk 4 19 36 crypto.c
      shishi_ticket_set_server 4 19 31 ticket.c
      shishi_random_to_key 4 18 39 crypto.c
      shishi_priv_build 4 18 36 priv.c
      shishi_enckdcreppart_server_set 4 18 31 enckdcreppart.c
      shishi_key_from_name 4 17 36 key.c
      shishi_authenticator_get_subkey 4 16 29 authenticator.c
      shishi_der2asn1_kdcreq 4 16 32 asn1.c
      shishi_enckdcreppart_get_key 4 15 26 enckdcreppart.c
      shishi_encticketpart_get_key 4 15 26 encticketpart.c
      shishi_asn1_read_bitstring 4 15 30 asn1.c
      shishi_asn1_read_int32 4 15 26 asn1.c
      shishi_key_random 4 14 24 key.c
      skip_authdata 4 14 22 ccache.c
      skip_address 4 14 22 ccache.c
      shishi_tkts_to_file 4 13 23 tkts.c
      _shishi_asn1_init 4 13 28 asn1.c
      shishi_tkts_from_file 4 13 23 tkts.c
      shishi_ap_rep_build 4 13 27 ap.c
      shishi_krberror_methoddata 4 13 26 krberror.c
      shishi_encasreppart 4 12 20 enckdcreppart.c
      shishi_tgs_req_process 4 12 21 tgs.c
      shishi_checksum_parse 4 11 17 crypto.c
      shishi_authenticator_add_cksum_type 4 11 28 authenticator.c
      shishi_authorization_parse 4 11 19 authorize.c
      shishi_tkt_renew_tillc 4 11 19 tkt.c
      shishi_tkt_startctime 4 11 19 tkt.c
      shishi_cfg_default_userdirectory 4 10 19 cfg.c
      des_key_correction 4 10 19 crypto-des.c
      shishi_asn1_read_inline 4 10 20 asn1.c
      shishi_verbose 3 15 32 error.c
      shishi_checksum_name 3 9 15 crypto.c
      shishi_asn1_number_of_elements 3 9 19 asn1.c
      write_binary_file 3 9 16 keytab.c
      shishi_cipher_name 3 9 15 crypto.c
      shishi_key_from_string 3 9 23 key.c
      shishi_kdc_copy_nonce 3 9 17 kdc.c
      shishi_tkts_from_ccache_file 3 9 19 tktccache.c
      shishi_tkts_from_ccache_mem 3 9 20 tktccache.c
      shishi_keys_from_keytab_file 3 9 19 keytab.c
      shishi_keys_from_keytab_mem 3 9 20 keytab.c
      shishi_strerror 3 9 16 error.c
      shishi_krberror_errorcode_message 3 9 16 krberror.c
      shishi_authenticator_subkey 3 9 16 authenticator.c
      shishi_get_date 3 9 19 utils.c
      shishi_authenticator_set_subkey 3 8 20 authenticator.c
      shishi_ap_req_der 3 8 15 ap.c
      shishi_tgs_set_realmserver 3 8 16 tgs.c
      shishi_authenticator_set_cksum 3 8 20 authenticator.c
      shishi_krberror_remove_sname 3 8 16 krberror.c
      shishi_authenticator_cksum 3 8 20 authenticator.c
      shishi_tkt_flags_set 3 8 17 tkt.c
      shishi_kdcreq_set_realmserver 3 8 16 kdcreq.c
      shishi_priv_set_enc_part 3 8 19 priv.c
      shishi_ap_tktoptionsasn1usage 3 8 25 ap.c
      shishi_ap_etype_tktoptionsdata 3 8 19 ap.c
      null_decrypt 3 8 19 crypto-null.c
      shishi_safe_set_cksum 3 8 17 safe.c
      shishi_ap_tktoptionsraw 3 8 18 ap.c
      shishi_safe_cksum 3 8 17 safe.c
      shishi_enckdcreppart_srealmserver_set 3 8 17 enckdcreppart.c
      shishi_ap_tktoptionsdata 3 8 18 ap.c
      shishi_krberror_der 3 8 16 krberror.c
      shishi_ap_tktoptions 3 8 16 ap.c
      shishi_tkt_serverrealm_set 3 8 18 tkt.c
      shishi_tkt_clientrealm_set 3 8 19 tkt.c
      shishi_kdcrep_crealmserver_set 3 8 17 kdcrep.c
      shishi_key_from_value 3 8 16 key.c
      null_encrypt 3 8 19 crypto-null.c
      shishi_aprep_enc_part_set 3 8 17 aprep.c
      shishi_encticketpart_transited_set 3 8 20 encticketpart.c
      shishi_encticketpart_cname_set 3 8 19 encticketpart.c
      shishi_ticket_srealmserver_set 3 8 17 ticket.c
      shishi_ap_rep_verify_der 3 8 15 ap.c
      shishi_enckdcreppart_key_set 3 8 18 enckdcreppart.c
      shishi_ap_rep_der 3 8 15 ap.c
      _shishi_verify 3 7 11 crypto.c
      _shishi_checksum 3 7 11 crypto.c
      shishi_checksum_cksumlen 3 7 11 crypto.c
      shishi_checksum_supported_p 3 7 11 crypto.c
      _shishi_cipher_decrypt 3 7 11 crypto.c
      shishi_krberror_ctime_set 3 7 16 krberror.c
      _shishi_cipher_encrypt 3 7 11 crypto.c
      _shishi_realminfo 3 7 11 cfg.c
      _shishi_cipher_string_to_key 3 7 11 crypto.c
      _shishi_cipher_random_to_key 3 7 11 crypto.c
      shishi_cipher_defaultcksumtype 3 7 11 crypto.c
      shishi_cipher_randomlen 3 7 11 crypto.c
      shishi_cipher_keylen 3 7 11 crypto.c
      shishi_randomize 3 7 15 low-crypto.c
      shishi_cipher_confoundersize 3 7 11 crypto.c
      shishi_cipher_blocksize 3 7 11 crypto.c
      shishi_cipher_supported_p 3 7 11 crypto.c
      shishi_hostkeys_default_file 3 7 14 hostkeys.c
      shishi_enckdcreppart_renew_till_set 3 7 17 enckdcreppart.c
      shishi_tkts_add 3 7 15 tkts.c
      shishi_enckdcreppart_starttime_set 3 7 17 enckdcreppart.c
      shishi_tkt_valid_at_time_p 3 6 12 tkt.c
      shishi_asn1_done 3 5 14 asn1.c
      shishi_error_set 3 5 13 error.c
      shishi_init_with_paths 3 4 12 init.c
      shishi_check_version 3 3 8 version.c
      shishi_init 3 3 10 init.c
      shishi_tkts_nth 3 3 8 tkts.c
      shishi_tkts_default 3 3 9 tkts.c
      shishi_keys_nth 3 3 8 keys.c
      shishi_tkts_to_ccache_mem 3 18 33 tktccache.c
      shishi_kdcrep_add_enc_part 3 17 37 kdcrep.c
      shishi_kdc_check_nonce 3 17 36 kdc.c
      arcfour_hmac_string_to_key 3 17 32 crypto-rc4.c
      shishi_ticket_add_enc_part 3 17 38 ticket.c
      shishi_apreq_add_authenticator 3 16 36 apreq.c
      der2asn1 3 13 27 asn1.c
      _shishi_simplified_checksum 3 12 29 crypto.c
      shishi_ap_set_tktoptionsasn1usage 3 12 26 ap.c
      shishi_kdcreq_add_padata_tgs 3 12 24 kdcreq.c
      shishi_time 3 12 23 gztime.c
      gss_des_checksum 3 11 24 crypto-des.c
      shishi_kdcreq_tillc 3 11 19 kdcreq.c
      shishi_asn1_write_bitstring 3 11 30 asn1.c
      shishi_ticket 3 11 22 ticket.c
      shishi_kdc_copy_crealm 3 11 19 kdc.c
      _shishi_save_data 3 11 19 diskio.c
      shishi_tkt_endctime 3 11 19 tkt.c
      shishi_tkt_authctime 3 11 19 tkt.c
      shishi_tkt_lastreqc 3 11 19 tkt.c
      shishi_authenticator_add_random_subkey 3 10 19 authenticator.c
      shishi_ap 3 10 23 ap.c
      shishi_apreq_options_remove 3 10 19 apreq.c
      shishi_apreq_options_add 3 10 18 apreq.c
      shishi_tkt_flags_add 3 10 18 tkt.c
      shishi_keys_to_keytab_file 3 10 18 keytab.c
      shishi_arcfour 3 10 25 low-crypto.c
      shishi_aprep_enc_part_make 3 10 28 aprep.c
      shishi_keys_print 3 10 17 keys.c
      shishi_keys_add 3 10 20 keys.c
      shishi_encticketpart_key_set 3 10 20 encticketpart.c
      shishi_kdcreq_options_add 3 10 19 kdcreq.c
      shishi_ap_etype 3 10 25 ap.c
      shishi_ap_option2string 2 10 26 ap.c
      shishi_warn 2 13 29 error.c
      shishi_info 2 13 29 error.c
      _shishi_realminfo_new 2 9 19 cfg.c
      shishi_tkt_clientrealm_p 2 9 17 tkt.c
      des_random_to_key 2 9 20 crypto-des.c
      shishi_tkt_client_p 2 9 17 tkt.c
      shishi_crypto_decrypt 2 9 22 crypto-ctx.c
      shishi_crypto_encrypt 2 9 22 crypto-ctx.c
      put_uint32 2 8 12 ccache.c
      shishi_tkt_server_p 2 8 16 tkt.c
      shishi_asn1_write_int32 2 8 15 asn1.c
      shishi_asn1_write_uint32 2 8 15 asn1.c
      shishi_tkts_add_ccache_file 2 8 17 tktccache.c
      shishi_ap_set_tktoptionsraw 2 8 21 ap.c
      shishi_tkts_new 2 8 20 tkts.c
      shishi_keys_add_keytab_file 2 8 17 keytab.c
      shishi_ap_set_tktoptionsdata 2 8 20 ap.c
      shishi_ctime 2 8 16 gztime.c
      put_uint32_swapped 2 8 12 ccache.c
      shishi_authenticator_add_random_subkey_etype 2 8 18 authenticator.c
      shishi_asn1_empty_p 2 7 13 asn1.c
      shishi_kdcreq_etype 2 7 14 kdcreq.c
      get_uint32_swapped 2 7 12 ccache.c
      get_uint32 2 7 12 ccache.c
      asn1_new 2 7 15 asn1.c
      get_uint16 2 7 11 ccache.c
      get_uint8 2 7 11 ccache.c
      shishi_ap_set_tktoptions 2 7 16 ap.c
      shishi_tkt_decrypt 2 7 14 tkt.c
      shishi_asn1_msgtype 2 6 13 asn1.c
      put_uint16 2 6 10 ccache.c
      shishi_realm_default 2 6 13 realm.c
      shishi_tkts_default_file 2 6 14 tkts.c
      shishi_tgs_set_realm 2 6 16 tgs.c
      shishi_tkts_default_ccache 2 6 14 tktccache.c
      shishi_tgs_set_server 2 6 16 tgs.c
      shishi_principal_default 2 6 13 principal.c
      ccache_pack_credential 2 6 13 ccache.c
      shishi_key_from_random 2 6 15 key.c
      shishi_as_rep_der_set 2 6 14 as.c
      shishi_tkts_default_ccache_guess 2 6 15 tktccache.c
      ccache_parse_credential 2 6 13 ccache.c
      shishi_asn1_write 2 6 16 asn1.c
      shishi_priv_encprivpart_der_set 2 6 14 priv.c
      shishi_resolv_free 2 6 13 resolv.c
      _shishi_tls_init 2 6 15 starttls.c
      shishi_priv_priv_der_set 2 6 14 priv.c
      shishi_tgs_req_der_set 2 6 14 tgs.c
      shishi_safe_safe_der_set 2 6 14 safe.c
      shishi_hmac_sha1 2 6 14 low-crypto.c
      shishi_as_req_der_set 2 6 14 as.c
      shishi_hmac_md5 2 6 14 low-crypto.c
      shishi_md5 2 6 12 low-crypto.c
      shishi_ap_rep_verify_asn1 2 6 13 ap.c
      shishi_ap_rep_asn1 2 6 13 ap.c
      shishi_md4 2 6 12 low-crypto.c
      shishi_ap_rep_der_set 2 6 14 ap.c
      xtime 2 6 14 utils.c
      shishi_tkt_keytype_p 2 6 13 tkt.c
      shishi_ap_req_asn1 2 6 13 ap.c
      shishi_tkt_keytype_fast 2 6 13 tkt.c
      shishi_krberror_errorcode_set 2 5 12 krberror.c
      shishi_krberror_susec_set 2 5 12 krberror.c
      shishi_krberror_susec 2 5 12 krberror.c
      shishi_authenticator_remove_subkey 2 5 12 authenticator.c
      shishi_ticket_realm_set 2 5 12 ticket.c
      shishi_krberror_stime_set 2 5 13 krberror.c
      shishi_krberror_remove_cusec 2 5 11 krberror.c
      shishi_krberror_cusec_set 2 5 12 krberror.c
      shishi_krberror_cusec 2 5 12 krberror.c
      shishi_kdcrep_clear_padata 2 5 11 kdcrep.c
      put_uint8 2 5 9 ccache.c
      shishi_krberror_remove_ctime 2 5 11 krberror.c
      shishi_authenticator_clear_authorizationdata 2 5 13 authenticator.c
      shishi_krberror_server_set 2 5 12 krberror.c
      shishi_krberror_set_sname 2 5 14 krberror.c
      shishi_krberror_server 2 5 13 krberror.c
      shishi_krberror_set_realm 2 5 12 krberror.c
      shishi_authenticator_remove_cksum 2 5 13 authenticator.c
      shishi_apreq_options_set 2 5 12 apreq.c
      shishi_encprivpart_set_user_data 2 5 14 priv.c
      shishi_krberror_client_set 2 5 12 krberror.c
      shishi_kdcreq_set_server 2 5 12 kdcreq.c
      shishi_encprivpart_user_data 2 5 14 priv.c
      shishi_krberror_remove_cname 2 5 11 krberror.c
      shishi_kdcreq_set_sname 2 5 14 kdcreq.c
      shishi_authenticator_seqnumber_set 2 5 14 authenticator.c
      shishi_tgs_krberror_der 2 5 11 tgs.c
      shishi_krberror_set_cname 2 5 14 krberror.c
      shishi_authenticator_seqnumber_remove 2 5 12 authenticator.c
      shishi_safe_set_user_data 2 5 14 safe.c
      shishi_krberror_client 2 5 13 krberror.c
      shishi_kdcreq_set_realm 2 5 12 kdcreq.c
      shishi_authenticator_seqnumber_get 2 5 14 authenticator.c
      shishi_cfg_default_systemfile 2 5 11 cfg.c
      shishi_safe_user_data 2 5 14 safe.c
      arcfour_hmac_random_to_key 2 5 15 crypto-rc4.c
      shishi_as_krberror_der 2 5 11 as.c
      shishi_krberror_set_crealm 2 5 12 krberror.c
      shishi_authenticator_cusec_set 2 5 12 authenticator.c
      shishi_tkts_default_file_guess 2 5 11 tkts.c
      shishi_encapreppart_seqnumber_set 2 5 14 encapreppart.c
      shishi_krberror_remove_crealm 2 5 11 krberror.c
      shishi_authenticator_cusec_get 2 5 12 authenticator.c
      shishi_encapreppart_seqnumber_remove 2 5 12 encapreppart.c
      shishi_authenticator_ctime_set 2 5 13 authenticator.c
      shishi_encapreppart_seqnumber_get 2 5 14 encapreppart.c
      shishi_as_rep_der 2 5 11 as.c
      shishi_kdcreq_set_cname 2 5 13 kdcreq.c
      shishi_encapreppart_cusec_set 2 5 12 encapreppart.c
      shishi_authenticator_client_set 2 5 13 authenticator.c
      shishi_tgs_rep_der 2 5 11 tgs.c
      shishi_encapreppart_cusec_get 2 5 12 encapreppart.c
      shishi_kdcreq_nonce_set 2 5 11 kdcreq.c
      shishi_authenticator_set_cname 2 5 15 authenticator.c
      shishi_kdcreq_nonce 2 5 11 kdcreq.c
      shishi_encapreppart_ctime_set 2 5 13 encapreppart.c
      shishi_kdcrep_client_set 2 5 12 kdcrep.c
      shishi_authenticator_set_crealm 2 5 13 authenticator.c
      shishi_enckdcreppart_srealm_set 2 5 13 enckdcreppart.c
      shishi_kdcrep_cname_set 2 5 13 kdcrep.c
      shishi_encticketpart_endtime_set 2 5 14 encticketpart.c
      shishi_priv_encprivpart_der 2 5 11 priv.c
      shishi_kdcrep_crealm_set 2 5 12 kdcrep.c
      shishi_encticketpart_authtime_set 2 5 14 encticketpart.c
      shishi_enckdcreppart_endtime_set 2 5 14 enckdcreppart.c
      shishi_realm_for_server 2 5 11 realm.c
      shishi_priv_priv_der 2 5 11 priv.c
      shishi_tgs_req_der 2 5 11 tgs.c
      shishi_enckdcreppart_authtime_set 2 5 14 enckdcreppart.c
      shishi_safe_safe_der 2 5 11 safe.c
      shishi_encticketpart_crealm_set 2 5 12 encticketpart.c
      shishi_enckdcreppart_flags_set 2 5 12 enckdcreppart.c
      shishi_as_req_der 2 5 11 as.c
      shishi_tkt_build 2 5 12 tkt.c
      shishi_enckdcreppart_nonce_set 2 5 12 enckdcreppart.c
      shishi_encticketpart_flags_set 2 5 12 encticketpart.c
      shishi_xalloc_die 2 5 9 utils.c
      shishi_as_req_build 2 5 11 as.c
      shishi_keys_remove 2 5 13 keys.c
      shishi_krberror_remove_edata 2 5 11 krberror.c
      shishi_krberror_set_edata 2 5 12 krberror.c
      shishi_kdcreq_clear_padata 2 5 11 kdcreq.c
      shishi_kdcreq_options_set 2 5 13 kdcreq.c
      shishi_krberror_remove_etext 2 5 11 krberror.c
      shishi_ap_key 2 5 15 ap.c
      shishi_authenticator_add_subkey 2 5 16 authenticator.c
      shishi_krberror_set_etext 2 5 12 krberror.c
      shishi_key_realm_set 2 4 9 key.c
      shishi_krberror_errorcode_fast 2 4 10 krberror.c
      shishi_tkts_default_file_set 2 4 9 tkts.c
      shishi_realm_default_set 2 4 9 realm.c
      shishi_tkts_default_ccache_set 2 4 9 tktccache.c
      shishi_principal_default_set 2 4 9 principal.c
      shishi_ap_req_der_set 2 4 10 ap.c
      shishi_key_principal_set 2 4 9 key.c
      shishi_hostkeys_default_file_set 2 4 9 hostkeys.c
      shishi_x509ca_default_file_set 2 4 9 pki.c
      sendrecv_srv 2 4 12 netio.c
      _shishi_crypto_init 2 4 10 low-crypto.c
      aes256_random_to_key 2 4 11 crypto-aes.c
      shishi_x509key_default_file_set 2 4 9 pki.c
      aes128_random_to_key 2 4 11 crypto-aes.c
      shishi_x509cert_default_file_set 2 4 9 pki.c
      shishi_x509ca_default_file 2 3 8 pki.c
      shishi_ap_req_set 2 3 7 ap.c
      shishi_ap_authenticator_set 2 3 7 ap.c
      shishi_cfg_clientkdcetype_fast 2 3 8 cfg.c
      shishi_cfg_default_userfile 2 3 9 cfg.c
      shishi_tgs_krberror_set 2 3 7 tgs.c
      shishi_as_krberror_set 2 3 7 as.c
      shishi_authorize_strcmp 2 3 9 authorize.c
      shishi_as_rep_set 2 3 7 as.c
      md5_checksum 2 3 11 crypto-md.c
      gcd 2 3 8 crypto.c
      md4_checksum 2 3 11 crypto-md.c
      shishi_priv_encprivpart_set 2 3 7 priv.c
      shishi_tkt_encticketpart_set 2 3 7 tkt.c
      shishi_tkt_enckdcreppart_set 2 3 7 tkt.c
      shishi_x509key_default_file 2 3 8 pki.c
      shishi_tkt_ticket_set 2 3 7 tkt.c
      shishi_error 2 3 8 error.c
      shishi_priv_priv_set 2 3 7 priv.c
      shishi_tgs_req_set 2 3 7 tgs.c
      shishi_safe_safe_set 2 3 7 safe.c
      shishi_as_req_set 2 3 7 as.c
      shishi_tkt_done 2 3 7 tkt.c
      shishi_x509cert_default_file 2 3 8 pki.c
      shishi_ap_encapreppart_set 2 3 7 ap.c
      shishi_ap_rep_set 2 3 7 ap.c
      ccache_print_credential 2 24 26 ccache.c
      shishi_tkts_size 2 2 5 tkts.c
      srv_rr 2 17 27 resolv.c
      shishi_crypto 2 12 25 crypto-ctx.c
      shishi_encticketpart_authctime 2 11 20 encticketpart.c
      armor_asn1 2 10 19 diskio.c
      ccache_print_principal 2 10 17 ccache.c
      shishi_error_printf 2 10 18 error.c
      shishi_der2asn1 2 23 56 asn1.c
      shishi_keys_for_localservicerealm_in_file 1 9 21 keys.c
      shishi_tkts_get_for_localservicepasswd 1 9 19 tkts.c
      shishi_generalize_ctime 1 8 18 gztime.c
      shishi_crc 1 7 13 low-crypto.c
      shishi_tkts_find_for_clientserver 1 7 15 tkts.c
      txt_rr 1 7 13 resolv.c
      shishi_ap_done 1 7 11 ap.c
      shishi_tkts_get_for_clientserver 1 7 15 tkts.c
      shishi_tkt2 1 7 16 tkt.c
      shishi_server_for_local_service 1 6 14 principal.c
      shishi_key_copy 1 6 10 key.c
      shishi_tgs_done 1 6 10 tgs.c
      shishi_as_done 1 5 9 as.c
      shishi_keys 1 5 11 keys.c
      _shishi_print_armored_data 1 5 16 diskio.c
      ccache_print 1 4 8 ccache.c
      shishi_generalize_time 1 4 11 gztime.c
      shishi_key 1 4 10 key.c
      shishi_priv_done 1 4 8 priv.c
      shishi_kdcreq_renew_p 1 3 9 kdcreq.c
      shishi_tkt_ok_as_delegate_p 1 3 9 tkt.c
      shishi_kdcreq_enc_tkt_in_skey_p 1 3 9 kdcreq.c
      shishi_tkt_transited_policy_checked_p 1 3 9 tkt.c
      shishi_kdcreq_renewable_ok_p 1 3 9 kdcreq.c
      shishi_kdcreq_disable_transited_check_p 1 3 9 kdcreq.c
      shishi_tkt_hw_authent_p 1 3 9 tkt.c
      shishi_kdcreq_renewable_p 1 3 9 kdcreq.c
      shishi_tkt_pre_authent_p 1 3 9 tkt.c
      shishi_kdcreq_postdated_p 1 3 9 kdcreq.c
      shishi_tkt_initial_p 1 3 9 tkt.c
      shishi_kdcreq_allow_postdate_p 1 3 9 kdcreq.c
      shishi_tkt_renewable_p 1 3 9 tkt.c
      shishi_kdcreq_proxy_p 1 3 9 kdcreq.c
      shishi_tkt_invalid_p 1 3 9 tkt.c
      shishi_kdcreq_proxiable_p 1 3 9 kdcreq.c
      shishi_tkt_postdated_p 1 3 9 tkt.c
      shishi_kdcreq_forwarded_p 1 3 9 kdcreq.c
      shishi_tkt_may_postdate_p 1 3 9 tkt.c
      shishi_kdcreq_forwardable_p 1 3 9 kdcreq.c
      shishi_tkt_proxy_p 1 3 9 tkt.c
      shishi_tkt_proxiable_p 1 3 9 tkt.c
      shishi_tkt_forwarded_p 1 3 9 tkt.c
      shishi_tkt_forwardable_p 1 3 9 tkt.c
      shishi_ap_authenticator_cksumraw_set 1 3 11 ap.c
      shishi_apreq_mutual_required_p 1 3 9 apreq.c
      shishi_apreq_use_session_key_p 1 3 9 apreq.c
      shishi_cfg_userdirectory_file 1 3 9 cfg.c
      shishi_key_done 1 3 7 key.c
      shishi_ticket_get_enc_part_etype 1 3 10 ticket.c
      shishi_crypto_close 1 3 7 crypto-ctx.c
      shishi_tkts 1 3 9 tkts.c
      shishi_tkt_expired_p 1 3 8 tkt.c
      shishi_safe_done 1 3 7 safe.c
      shishi_kdcreq_validate_p 1 3 9 kdcreq.c
      shishi_ap_authenticator_cksumdata_set 1 2 9 ap.c
      shishi_generalize_now 1 2 7 gztime.c
      shishi_cfg_clientkdcetype 1 2 6 cfg.c
      simplified_hmac 1 2 11 crypto.c
      shishi_der2asn1_padata 1 1 5 asn1.c
      shishi_tkt_keytype 1 1 6 tkt.c
      shishi_x509cert_default_file_guess 1 1 5 pki.c
      shishi_tgsrep 1 1 5 kdcrep.c
      shishi_krberror_errorcode 1 1 6 krberror.c
      shishi_krberror_print 1 1 5 krberror.c
      shishi_keys_size 1 1 5 keys.c
      shishi_krberror_stime 1 1 5 krberror.c
      shishi_asn1_to_der 1 1 6 asn1.c
      shishi_key_realm 1 1 5 key.c
      des_md5_verify 1 1 11 crypto-des.c
      shishi_asrep 1 1 5 kdcrep.c
      des_md4_verify 1 1 11 crypto-des.c
      shishi_hostkeys_for_server 1 1 7 hostkeys.c
      shishi_tkts_find_for_server 1 1 6 tkts.c
      shishi_asn1_encprivpart 1 1 5 asn1.c
      null_string_to_key 1 1 8 crypto-null.c
      shishi_asn1_priv 1 1 5 asn1.c
      shishi_krberror_ctime 1 1 5 krberror.c
      shishi_asn1_krbsafe 1 1 5 asn1.c
      shishi_kdcreq_options 1 1 6 kdcreq.c
      shishi_ap_req 1 1 5 ap.c
      shishi_ticket_realm_get 1 1 6 ticket.c
      shishi_asn1_krberror 1 1 5 asn1.c
      des_md5_checksum 1 1 10 crypto-des.c
      shishi_authenticator_add_cksum 1 1 12 authenticator.c
      shishi_prompt_password_callback_get 1 1 5 password.c
      des_md4_checksum 1 1 10 crypto-des.c
      shishi_asn1_encasreppart 1 1 5 asn1.c
      shishi_ap_authenticator 1 1 5 ap.c
      des_crc_checksum 1 1 10 crypto-des.c
      shishi_asn1_enckdcreppart 1 1 5 asn1.c
      shishi_apreq_get_authenticator_etype 1 1 6 apreq.c
      null_random_to_key 1 1 6 crypto-null.c
      aes256_decrypt 1 1 11 crypto-aes.c
      shishi_ap_authenticator_cksumtype_set 1 1 5 ap.c
      shishi_asn1_authenticator 1 1 5 asn1.c
      shishi_ap_authenticator_cksumtype 1 1 5 ap.c
      shishi_asn1_encticketpart 1 1 5 asn1.c
      shishi_asn1_ticket 1 1 5 asn1.c
      shishi_tgs_sendrecv 1 1 5 tgs.c
      shishi_asn1_encapreppart 1 1 5 asn1.c
      shishi_asn1_aprep 1 1 5 asn1.c
      shishi_kdcreq_till 1 1 6 kdcreq.c
      shishi_asn1_apreq 1 1 5 asn1.c
      shishi_tkts_print 1 1 5 tkts.c
      shishi_authenticator_clientrealm 1 1 10 authenticator.c
      shishi_krberror_realm 1 1 6 krberror.c
      shishi_as_sendrecv 1 1 5 as.c
      shishi_asn1_tgsrep 1 1 5 asn1.c
      shishi_tgs_tkt_set 1 1 5 tgs.c
      shishi_asn1_tgsreq 1 1 5 asn1.c
      shishi_ap_tkt_set 1 1 5 ap.c
      shishi_authenticator_client 1 1 8 authenticator.c
      shishi_tkt_flags 1 1 6 tkt.c
      aes256_encrypt 1 1 11 crypto-aes.c
      shishi_tgs_tkt 1 1 5 tgs.c
      shishi_ap_tkt 1 1 5 ap.c
      shishi_asn1_asrep 1 1 5 asn1.c
      shishi_asn1_asreq 1 1 5 asn1.c
      shishi_apreq_options 1 1 5 apreq.c
      shishi_prompt_password_callback_set 1 1 6 password.c
      shishi_asn1_etype_info2 1 1 5 asn1.c
      shishi_kdcreq_server 1 1 7 kdcreq.c
      shishi_tkt_server 1 1 5 tkt.c
      shishi_as_tkt_set 1 1 5 as.c
      shishi_asn1_etype_info 1 1 5 asn1.c
      shishi_as_tkt 1 1 5 as.c
      shishi_tgs_krberror 1 1 5 tgs.c
      shishi_priv_enc_part_etype 1 1 6 priv.c
      shishi_tkt_realm 1 1 5 tkt.c
      shishi_asn1_methoddata 1 1 5 asn1.c
      shishi_aes_cts 1 1 10 low-crypto.c
      shishi_key_principal 1 1 5 key.c
      shishi_asn1_padata 1 1 5 asn1.c
      shishi_kdcreq_realm_get 1 1 7 kdcreq.c
      shishi_asn1_encrypteddata 1 1 5 asn1.c
      shishi_kdcreq_realm 1 1 7 kdcreq.c
      shishi_3des 1 1 10 low-crypto.c
      _shishi_tls_done 1 1 7 starttls.c
      shishi_asn1_pa_enc_ts_enc 1 1 5 asn1.c
      shishi_as_krberror 1 1 5 as.c
      shishi_tkt_clientrealm 1 1 8 tkt.c
      _des3_decrypt 1 1 12 crypto-3des.c
      shishi_kdc_sendrecv 1 1 8 netio.c
      shishi_asreq_clientrealm 1 1 10 kdcreq.c
      shishi_priv_read 1 1 5 priv.c
      aes128_decrypt 1 1 11 crypto-aes.c
      shishi_des 1 1 9 low-crypto.c
      shishi_krberror_crealm 1 1 6 krberror.c
      shishi_priv_parse 1 1 5 priv.c
      _shishi_quick_random 1 1 5 low-crypto.c
      shishi_kdcreq_client 1 1 7 kdcreq.c
      shishi_enckdcreppart_read 1 1 6 diskio.c
      lcm 1 1 5 crypto.c
      shishi_enckdcreppart_parse 1 1 6 diskio.c
      shishi_tkt_client 1 1 6 tkt.c
      shishi_authenticator_ctime 1 1 6 authenticator.c
      shishi_x509ca_default_file_guess 1 1 5 pki.c
      shishi_encticketpart_clientrealm 1 1 10 encticketpart.c
      arcfour_hmac_exp_decrypt 1 1 13 crypto-rc4.c
      shishi_aprep_get_enc_part_etype 1 1 6 aprep.c
      shishi_asn1_write_integer 1 1 6 asn1.c
      shishi_kdcrep_get_enc_part_etype 1 1 6 kdcrep.c
      des_none_decrypt 1 1 12 crypto-des.c
      arcfour_hmac_exp_encrypt 1 1 14 crypto-rc4.c
      shishi_keys_for_server_in_file 1 1 6 keys.c
      shishi_encticketpart_client 1 1 8 encticketpart.c
      shishi_priv_save 1 1 5 priv.c
      des_md5_decrypt 1 1 13 crypto-des.c
      shishi_tgs_rep 1 1 5 tgs.c
      shishi_safe_read 1 1 5 safe.c
      des_md4_decrypt 1 1 13 crypto-des.c
      shishi_priv_print 1 1 5 priv.c
      shishi_ticket_read 1 1 5 diskio.c
      shishi_safe_parse 1 1 5 safe.c
      shishi_ticket_parse 1 1 5 diskio.c
      des_crc_decrypt 1 1 14 crypto-des.c
      shishi_encapreppart_ctime 1 1 6 encapreppart.c
      shishi_encticketpart_authtime 1 1 8 encticketpart.c
      _des3_encrypt 1 1 12 crypto-3des.c
      aes128_encrypt 1 1 11 crypto-aes.c
      shishi_error_set_outputtype 1 1 5 error.c
      shishi_error_outputtype 1 1 5 error.c
      shishi_kdcreq_read 1 1 5 kdcreq.c
      shishi_asn1_read_integer 1 1 6 asn1.c
      des3_checksum 1 1 10 crypto-3des.c
      shishi_resolv 1 1 5 resolv.c
      shishi_asn1_read_uint32 1 1 6 asn1.c
      shishi_apreq_read 1 1 5 apreq.c
      shishi_kdcreq_parse 1 1 5 kdcreq.c
      shishi_safe_save 1 1 5 safe.c
      shishi_authenticator_read 1 1 6 authenticator.c
      shishi_priv_encprivpart 1 1 5 priv.c
      shishi_key_length 1 1 5 key.c
      shishi_tkt_encticketpart 1 1 5 tkt.c
      shishi_apreq_parse 1 1 5 apreq.c
      shishi_safe_print 1 1 5 safe.c
      shishi_key_name 1 1 5 key.c
      shishi_tkt_kdcrep 1 1 5 tkt.c
      shishi_authenticator_parse 1 1 6 authenticator.c
      des_none_encrypt 1 1 12 crypto-des.c
      shishi_key_timestamp_set 1 1 5 key.c
      shishi_as_rep 1 1 5 as.c
      des_md5_encrypt 1 1 13 crypto-des.c
      shishi_encapreppart_read 1 1 6 encapreppart.c
      shishi_kdcrep_read 1 1 5 kdcrep.c
      shishi_error_clear 1 1 5 error.c
      shishi_key_timestamp 1 1 5 key.c
      shishi_tkt_enckdcreppart 1 1 5 tkt.c
      shishi_encticketpart_print 1 1 7 diskio.c
      aes256_checksum 1 1 10 crypto-aes.c
      shishi_aprep_read 1 1 5 aprep.c
      shishi_ticket_print 1 1 5 diskio.c
      des_md4_encrypt 1 1 13 crypto-des.c
      shishi_kdcreq_save 1 1 5 kdcreq.c
      shishi_ticket_save 1 1 5 diskio.c
      shishi_kdcrep_parse 1 1 5 kdcrep.c
      shishi_encapreppart_parse 1 1 6 encapreppart.c
      aes128_checksum 1 1 10 crypto-aes.c
      shishi_krberror_read 1 1 5 krberror.c
      shishi_key_version_set 1 1 5 key.c
      shishi_kdcreq_sendrecv 1 1 6 kdc.c
      shishi_enckdcreppart_save 1 1 6 diskio.c
      shishi_aprep_parse 1 1 5 aprep.c
      des_crc_encrypt 1 1 13 crypto-des.c
      shishi_apreq_save 1 1 5 apreq.c
      shishi_kdcreq_print 1 1 5 kdcreq.c
      shishi_enckdcreppart_print 1 1 7 diskio.c
      shishi_tkt_ticket 1 1 5 tkt.c
      shishi_key_version 1 1 5 key.c
      shishi_decrypt 1 1 11 crypto.c
      shishi_krberror_parse 1 1 5 krberror.c
      shishi_etype_info2_print 1 1 6 diskio.c
      shishi_priv_priv 1 1 5 priv.c
      shishi_decrypt_iv 1 1 12 crypto.c
      shishi_tgs_req 1 1 5 tgs.c
      shishi_authenticator_save 1 1 6 authenticator.c
      shishi_apreq_print 1 1 5 apreq.c
      shishi_decrypt_ivupdate 1 1 14 crypto.c
      shishi_etype_info_print 1 1 6 diskio.c
      shishi_tgsreq 1 1 5 kdcreq.c
      shishi_encticketpart_crealm 1 1 8 encticketpart.c
      shishi_decrypt_etype 1 1 12 crypto.c
      shishi_safe_safe 1 1 5 safe.c
      shishi_methoddata_print 1 1 6 diskio.c
      shishi_decrypt_iv_etype 1 1 13 crypto.c
      shishi_priv_key_set 1 1 5 priv.c
      aes256_string_to_key 1 1 11 crypto-aes.c
      shishi_tgs_ap 1 1 5 tgs.c
      shishi_x509key_default_file_guess 1 1 5 pki.c
      shishi_padata_print 1 1 5 diskio.c
      shishi_authenticator_print 1 1 7 authenticator.c
      shishi_asreq 1 1 5 kdcreq.c
      shishi_safe_key_set 1 1 5 safe.c
      shishi_priv_key 1 1 5 priv.c
      aes128_string_to_key 1 1 11 crypto-aes.c
      shishi_encrypt 1 1 11 crypto.c
      shishi_key_value 1 1 5 key.c
      shishi_krberror_message 1 1 6 krberror.c
      shishi_hostkeys_for_localservice 1 1 5 hostkeys.c
      shishi_tkts_get_for_server 1 1 6 tkts.c
      shishi_encrypt_iv 1 1 12 crypto.c
      shishi_asn1_print 1 1 5 asn1.c
      shishi_tgs_tgtkt_set 1 1 5 tgs.c
      shishi_server 1 1 5 init.c
      shishi_encrypt_ivupdate 1 1 14 crypto.c
      shishi_der2asn1_encapreppart 1 1 6 asn1.c
      shishi_safe_key 1 1 5 safe.c
      shishi_der2asn1_aprep 1 1 5 asn1.c
      shishi_encrypt_etype 1 1 13 crypto.c
      shishi_der2asn1_apreq 1 1 5 asn1.c
      shishi_ap_encapreppart 1 1 5 ap.c
      shishi_tkt_valid_now_p 1 1 5 tkt.c
      shishi_der2asn1_encprivpart 1 1 6 asn1.c
      shishi_key_type_set 1 1 5 key.c
      shishi_kdcrep_save 1 1 5 kdcrep.c
      shishi_der2asn1_priv 1 1 5 asn1.c
      shishi_encrypt_iv_etype 1 1 13 crypto.c
      shishi_encapreppart_save 1 1 6 encapreppart.c
      shishi_tgs_tgtkt 1 1 5 tgs.c
      shishi_der2asn1_krbsafe 1 1 5 asn1.c
      shishi_der2asn1_krberror 1 1 5 asn1.c
      shishi_tkt_renew_till 1 1 7 tkt.c
      shishi_hostkeys_for_localservicerealm 1 1 7 hostkeys.c
      shishi_der2asn1_authenticator 1 1 7 asn1.c
      shishi_aprep_save 1 1 5 aprep.c
      shishi_der2asn1_enckdcreppart 1 1 7 asn1.c
      shishi 1 1 5 init.c
      shishi_as_req 1 1 5 as.c
      shishi_tkts_default_to_file 1 1 5 tkts.c
      shishi_tkt_endtime 1 1 6 tkt.c
      shishi_der2asn1_enctgsreppart 1 1 7 asn1.c
      shishi_der2asn1_encasreppart 1 1 6 asn1.c
      shishi_ticket_server 1 1 6 ticket.c
      shishi_der2asn1_kdcrep 1 1 5 asn1.c
      shishi_key_type 1 1 5 key.c
      shishi_tkt_starttime 1 1 7 tkt.c
      shishi_der2asn1_tgsrep 1 1 5 asn1.c
      shishi_kdcrep_print 1 1 5 kdcrep.c
      shishi_der2asn1_asrep 1 1 5 asn1.c
      shishi_tkt_authtime 1 1 6 tkt.c
      des3none_decrypt 1 1 11 crypto-3des.c
      shishi_der2asn1_tgsreq 1 1 5 asn1.c
      shishi_krberror_save 1 1 5 krberror.c
      shishi_der2asn1_asreq 1 1 5 asn1.c
      shishi_encapreppart_print 1 1 7 encapreppart.c
      shishi_der2asn1_encticketpart 1 1 7 asn1.c
      shishi_krberror_edata 1 1 6 krberror.c
      shishi_ap_rep 1 1 5 ap.c
      shishi_der2asn1_ticket 1 1 5 asn1.c
      shishi_aprep_print 1 1 5 aprep.c
      shishi_der2asn1_etype_info2 1 1 6 asn1.c
      shishi_der2asn1_etype_info 1 1 5 asn1.c
      shishi_der2asn1_methoddata 1 1 6 asn1.c
      shishi_hostkeys_for_serverrealm 1 1 7 hostkeys.c
      shishi_krberror_etext 1 1 6 krberror.c
      shishi_ap_req_process 1 1 6 ap.c
      des3none_encrypt 1 1 11 crypto-3des.c

    Copyright (c) 2007, 2008 Free Software Foundation, Inc. shishi-1.0.2/doc/cyclo/Makefile.in0000644000000000000000000013072212126772724013632 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/cyclo DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = cyclo-$(PACKAGE).html vcurl = "http://git.savannah.gnu.org/gitweb/?p=$(PACKAGE).git;a=blob;f=lib/%FILENAME%;hb=HEAD" all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/cyclo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/cyclo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am cyclo-$(PACKAGE).html: (cd ${top_srcdir}/lib && \ $(PMCCABE) *.[ch] \ | sort -nr \ | LANG=C $(AWK) -f ${abs_top_srcdir}/build-aux/pmccabe2html \ -v lang=html -v name="$(PACKAGE_STRING)" \ -v vcurl=$(vcurl) \ -v url="http://www.gnu.org/software/$(PACKAGE)/" \ -v css=${abs_top_srcdir}/build-aux/pmccabe.css) \ > tmp mv tmp $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/doc/gdoc-error0000775000000000000000000000225312015626624012436 00000000000000#!/usr/bin/perl # Copyright (C) 2002, 2004 Simon Josefsson. # # This file 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 file 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 file; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # I consider the output of this program to be unrestricted. Use it as # you will. use strict; my ($inerror); my ($label, $txt); while (<>) { if ($inerror) { $txt .= $1 if (m,"(.*)",); $inerror = 0 if m/},/; if (!$inerror) { print "\@item $label\n"; print $txt, "\n\n"; } } else { next unless m/{(SHISHI.*),/; next if $1 =~ m,SHISHI_OK,; # Handled separately. $inerror = 1; $label = $1; $txt = ""; } } shishi-1.0.2/doc/texi/0000755000000000000000000000000012126773323011474 500000000000000shishi-1.0.2/doc/texi/db.c.texi0000644000000000000000000000000012126773203013100 00000000000000shishi-1.0.2/doc/texi/utils.c.texi0000644000000000000000000000000012126773203013653 00000000000000shishi-1.0.2/doc/texi/crypto-ctx.c.texi0000644000000000000000000000622712126773202014647 00000000000000@subheading shishi_crypto @anchor{shishi_crypto} @deftypefun {Shishi_crypto *} {shishi_crypto} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{iv}, size_t @var{ivlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key will encrypt/decrypt. @var{etype}: integer specifying what cipher to use. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. Initialize a crypto context. This store a key, keyusage, encryption type and initialization vector in a "context", and the caller can then use this context to perform encryption via @code{shishi_crypto_encrypt()} and decryption via @code{shishi_crypto_encrypt()} without supplying all those details again. The functions also takes care of propagating the IV between calls. When the application no longer need to use the context, it should deallocate resources associated with it by calling @code{shishi_crypto_close()}. @strong{Return value:} Return a newly allocated crypto context. @end deftypefun @subheading shishi_crypto_encrypt @anchor{shishi_crypto_encrypt} @deftypefun {int} {shishi_crypto_encrypt} (Shishi_crypto * @var{ctx}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{ctx}: crypto context as returned by @code{shishi_crypto()}. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call. When the application no longer need to use the context, it should deallocate resources associated with it by calling @code{shishi_crypto_close()}. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_crypto_decrypt @anchor{shishi_crypto_decrypt} @deftypefun {int} {shishi_crypto_decrypt} (Shishi_crypto * @var{ctx}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{ctx}: crypto context as returned by @code{shishi_crypto()}. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call. When the application no longer need to use the context, it should deallocate resources associated with it by calling @code{shishi_crypto_close()}. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_crypto_close @anchor{shishi_crypto_close} @deftypefun {void} {shishi_crypto_close} (Shishi_crypto * @var{ctx}) @var{ctx}: crypto context as returned by @code{shishi_crypto()}. Deallocate resources associated with the crypto context. @end deftypefun shishi-1.0.2/doc/texi/kdcrep.c.texi0000644000000000000000000002124012126773202013773 00000000000000@subheading shishi_asrep @anchor{shishi_asrep} @deftypefun {Shishi_asn1} {shishi_asrep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new AS-REP, populated with some default values. @strong{Return value:} Returns the AS-REP or NULL on failure. @end deftypefun @subheading shishi_tgsrep @anchor{shishi_tgsrep} @deftypefun {Shishi_asn1} {shishi_tgsrep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new TGS-REP, populated with some default values. @strong{Return value:} Returns the TGS-REP or NULL on failure. @end deftypefun @subheading shishi_kdcrep_print @anchor{shishi_kdcrep_print} @deftypefun {int} {shishi_kdcrep_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{kdcrep}: KDC-REP to print. Print ASCII armored DER encoding of KDC-REP to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_save @anchor{shishi_kdcrep_save} @deftypefun {int} {shishi_kdcrep_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{kdcrep}: KDC-REP to save. Print DER encoding of KDC-REP to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_to_file @anchor{shishi_kdcrep_to_file} @deftypefun {int} {shishi_kdcrep_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write KDC-REP to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_parse @anchor{shishi_kdcrep_parse} @deftypefun {int} {shishi_kdcrep_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{kdcrep}: output variable with newly allocated KDC-REP. Read ASCII armored DER encoded KDC-REP from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_read @anchor{shishi_kdcrep_read} @deftypefun {int} {shishi_kdcrep_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{kdcrep}: output variable with newly allocated KDC-REP. Read DER encoded KDC-REP from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_from_file @anchor{shishi_kdcrep_from_file} @deftypefun {int} {shishi_kdcrep_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{kdcrep}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: output variable with newly allocated KDC-REP. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read KDC-REP from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_crealm_set @anchor{shishi_kdcrep_crealm_set} @deftypefun {int} {shishi_kdcrep_crealm_set} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, const char * @var{crealm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: Kdcrep variable to set realm field in. @var{crealm}: input array with name of realm. Set the client realm field in the KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_cname_set @anchor{shishi_kdcrep_cname_set} @deftypefun {int} {shishi_kdcrep_cname_set} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_name_type @var{name_type}, const char * [] @var{cname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: Kdcrep variable to set server name field in. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{cname}: input array with principal name. Set the client name field in the KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_client_set @anchor{shishi_kdcrep_client_set} @deftypefun {int} {shishi_kdcrep_client_set} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, const char * @var{client}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: Kdcrep variable to set server name field in. @var{client}: zero-terminated string with principal name on RFC 1964 form. Set the client name field in the KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_get_enc_part_etype @anchor{shishi_kdcrep_get_enc_part_etype} @deftypefun {int} {shishi_kdcrep_get_enc_part_etype} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, int32_t * @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP variable to get value from. @var{etype}: output variable that holds the value. Extract KDC-REP.enc-part.etype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_get_ticket @anchor{shishi_kdcrep_get_ticket} @deftypefun {int} {shishi_kdcrep_get_ticket} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_asn1 * @var{ticket}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP variable to get ticket from. @var{ticket}: output variable to hold extracted ticket. Extract ticket from KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_set_ticket @anchor{shishi_kdcrep_set_ticket} @deftypefun {int} {shishi_kdcrep_set_ticket} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_asn1 @var{ticket}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to add ticket field to. @var{ticket}: input ticket to copy into KDC-REP ticket field. Copy ticket into KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_set_enc_part @anchor{shishi_kdcrep_set_enc_part} @deftypefun {int} {shishi_kdcrep_set_enc_part} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, int32_t @var{etype}, uint32_t @var{kvno}, const char * @var{buf}, size_t @var{buflen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to add enc-part field to. @var{etype}: encryption type used to encrypt enc-part. @var{kvno}: key version number. @var{buf}: input array with encrypted enc-part. @var{buflen}: size of input array with encrypted enc-part. Set the encrypted enc-part field in the KDC-REP. The encrypted data is usually created by calling @code{shishi_encrypt()} on the DER encoded enc-part. To save time, you may want to use @code{shishi_kdcrep_add_enc_part()} instead, which calculates the encrypted data and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_add_enc_part @anchor{shishi_kdcrep_add_enc_part} @deftypefun {int} {shishi_kdcrep_add_enc_part} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_key * @var{key}, int @var{keyusage}, Shishi_asn1 @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to add enc-part field to. @var{key}: key used to encrypt enc-part. @var{keyusage}: key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY. @var{enckdcreppart}: EncKDCRepPart to add. Encrypts DER encoded EncKDCRepPart using key and stores it in the KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcrep_clear_padata @anchor{shishi_kdcrep_clear_padata} @deftypefun {int} {shishi_kdcrep_clear_padata} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to remove PA-DATA from. Remove the padata field from KDC-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/crypto-3des.c.texi0000644000000000000000000000000012126773202014666 00000000000000shishi-1.0.2/doc/texi/crypto-null.c.texi0000644000000000000000000000000012126773202015002 00000000000000shishi-1.0.2/doc/texi/crypto-des.c.texi0000644000000000000000000000000012126773202014603 00000000000000shishi-1.0.2/doc/texi/err.c.texi0000644000000000000000000000127512126773203013322 00000000000000@subheading shisa_strerror @anchor{shisa_strerror} @deftypefun {const char *} {shisa_strerror} (int @var{err}) @var{err}: shisa error code @strong{Return value:} Returns a pointer to a statically allocated string containing a description of the error with the error value @code{err}. This string can be used to output a diagnostic message to the user. @end deftypefun @subheading shisa_info @anchor{shisa_info} @deftypefun {void} {shisa_info} (Shisa * @var{dbh}, const char * @var{format}, @var{...}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{format}: printf style format string. @...: print style arguments. Print informational message to standard error. @end deftypefun shishi-1.0.2/doc/texi/crypto-md.c.texi0000644000000000000000000000000012126773202014430 00000000000000shishi-1.0.2/doc/texi/resolv.c.texi0000644000000000000000000000136412126773203014043 00000000000000@subheading shishi_resolv @anchor{shishi_resolv} @deftypefun {Shishi_dns} {shishi_resolv} (const char * @var{zone}, uint16_t @var{querytype}) @var{zone}: owner name of data, e.g. "EXAMPLE.ORG" @var{querytype}: type of data to query for, e.g., SHISHI_DNS_TXT. Query DNS resolver for data of type @code{querytype} at owner name @code{zone}. Currently TXT and SRV types are supported. @strong{Return value:} Returns linked list of DNS records, or NULL if query failed. @end deftypefun @subheading shishi_resolv_free @anchor{shishi_resolv_free} @deftypefun {void} {shishi_resolv_free} (Shishi_dns @var{rrs}) @var{rrs}: list of DNS RR as returned by @code{shishi_resolv()}. Deallocate list of DNS RR as returned by @code{shishi_resolv()}. @end deftypefun shishi-1.0.2/doc/texi/encapreppart.c.texi0000644000000000000000000002055312126773202015215 00000000000000@subheading shishi_encapreppart @anchor{shishi_encapreppart} @deftypefun {Shishi_asn1} {shishi_encapreppart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. @strong{Return value:} Returns the encapreppart or NULL on failure. @end deftypefun @subheading shishi_encapreppart_print @anchor{shishi_encapreppart_print} @deftypefun {int} {shishi_encapreppart_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{encapreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{encapreppart}: EncAPRepPart to print. Print ASCII armored DER encoding of EncAPRepPart to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_save @anchor{shishi_encapreppart_save} @deftypefun {int} {shishi_encapreppart_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{encapreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{encapreppart}: EncAPRepPart to save. Save DER encoding of EncAPRepPart to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_to_file @anchor{shishi_encapreppart_to_file} @deftypefun {int} {shishi_encapreppart_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_parse @anchor{shishi_encapreppart_parse} @deftypefun {int} {shishi_encapreppart_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{encapreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{encapreppart}: output variable with newly allocated EncAPRepPart. Read ASCII armored DER encoded EncAPRepPart from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_read @anchor{shishi_encapreppart_read} @deftypefun {int} {shishi_encapreppart_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{encapreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{encapreppart}: output variable with newly allocated EncAPRepPart. Read DER encoded EncAPRepPart from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_from_file @anchor{shishi_encapreppart_from_file} @deftypefun {int} {shishi_encapreppart_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{encapreppart}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: output variable with newly allocated EncAPRepPart. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read EncAPRepPart from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_get_key @anchor{shishi_encapreppart_get_key} @deftypefun {int} {shishi_encapreppart_get_key} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, Shishi_key ** @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: input EncAPRepPart variable. @var{key}: newly allocated key. Extract the subkey from the encrypted AP-REP part. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encapreppart_ctime @anchor{shishi_encapreppart_ctime} @deftypefun {int} {shishi_encapreppart_ctime} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, char ** @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{t}: newly allocated zero-terminated character array with client time. Extract client time from EncAPRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_ctime_set @anchor{shishi_encapreppart_ctime_set} @deftypefun {int} {shishi_encapreppart_ctime_set} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, const char * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{t}: string with generalized time value to store in EncAPRepPart. Store client time in EncAPRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_cusec_get @anchor{shishi_encapreppart_cusec_get} @deftypefun {int} {shishi_encapreppart_cusec_get} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, uint32_t * @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{cusec}: output integer with client microseconds field. Extract client microseconds field from EncAPRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_cusec_set @anchor{shishi_encapreppart_cusec_set} @deftypefun {int} {shishi_encapreppart_cusec_set} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, uint32_t @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{cusec}: client microseconds to set in authenticator, 0-999999. Set the cusec field in the Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_seqnumber_get @anchor{shishi_encapreppart_seqnumber_get} @deftypefun {int} {shishi_encapreppart_seqnumber_get} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, uint32_t * @var{seqnumber}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{seqnumber}: output integer with sequence number field. Extract sequence number field from EncAPRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encapreppart_seqnumber_remove @anchor{shishi_encapreppart_seqnumber_remove} @deftypefun {int} {shishi_encapreppart_seqnumber_remove} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: encapreppart as allocated by @code{shishi_encapreppart()}. Remove sequence number field in EncAPRepPart. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encapreppart_seqnumber_set @anchor{shishi_encapreppart_seqnumber_set} @deftypefun {int} {shishi_encapreppart_seqnumber_set} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, uint32_t @var{seqnumber}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: encapreppart as allocated by @code{shishi_encapreppart()}. @var{seqnumber}: integer with sequence number field to store in encapreppart. Store sequence number field in EncAPRepPart. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encapreppart_time_copy @anchor{shishi_encapreppart_time_copy} @deftypefun {int} {shishi_encapreppart_time_copy} (Shishi * @var{handle}, Shishi_asn1 @var{encapreppart}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encapreppart}: EncAPRepPart as allocated by @code{shishi_encapreppart()}. @var{authenticator}: Authenticator to copy time fields from. Copy time fields from Authenticator into EncAPRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/config.c.texi0000644000000000000000000000325412126773203013776 00000000000000@subheading shisa_cfg_db @anchor{shisa_cfg_db} @deftypefun {int} {shisa_cfg_db} (Shisa * @var{dbh}, const char * @var{value}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{value}: string with database definition. Setup and open a new database. The syntax of the @code{value} parameter is "TYPE[ LOCATION[ PARAMETER]]", where TYPE is one of the supported database types (e.g., "file") and LOCATION and PARAMETER are optional strings passed to the database during initialization. Neither TYPE nor LOCATION can contain " " (SPC), but PARAMETER may. @strong{Return Value:} Returns @code{SHISA_OK} if database was parsed and open successfully. @end deftypefun @subheading shisa_cfg @anchor{shisa_cfg} @deftypefun {int} {shisa_cfg} (Shisa * @var{dbh}, const char * @var{option}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{option}: string with shisa library option. Configure shisa library with given option. @strong{Return Value:} Returns SHISA_OK if option was valid. @end deftypefun @subheading shisa_cfg_from_file @anchor{shisa_cfg_from_file} @deftypefun {int} {shisa_cfg_from_file} (Shisa * @var{dbh}, const char * @var{cfg}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{cfg}: filename to read configuration from. Configure shisa library using configuration file. @strong{Return Value:} Returns @code{SHISA_OK} iff successful. @end deftypefun @subheading shisa_cfg_default_systemfile @anchor{shisa_cfg_default_systemfile} @deftypefun {const char *} {shisa_cfg_default_systemfile} (Shisa * @var{dbh}) @var{dbh}: Shisa library handle created by @code{shisa()}. @strong{Return value:} Return system configuration filename. @end deftypefun shishi-1.0.2/doc/texi/enckdcreppart.c.texi0000644000000000000000000001420412126773202015352 00000000000000@subheading shishi_enckdcreppart_get_key @anchor{shishi_enckdcreppart_get_key} @deftypefun {int} {shishi_enckdcreppart_get_key} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, Shishi_key ** @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{key}: newly allocated encryption key handle. Extract the key to use with the ticket sent in the KDC-REP associated with the EncKDCRepPart input variable. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_key_set @anchor{shishi_enckdcreppart_key_set} @deftypefun {int} {shishi_enckdcreppart_key_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, Shishi_key * @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{key}: key handle with information to store in enckdcreppart. Set the EncKDCRepPart.key field to key type and value of supplied key. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_nonce_set @anchor{shishi_enckdcreppart_nonce_set} @deftypefun {int} {shishi_enckdcreppart_nonce_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, uint32_t @var{nonce}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{nonce}: nonce to set in EncKDCRepPart. Set the EncKDCRepPart.nonce field. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_flags_set @anchor{shishi_enckdcreppart_flags_set} @deftypefun {int} {shishi_enckdcreppart_flags_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, int @var{flags}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{flags}: flags to set in EncKDCRepPart. Set the EncKDCRepPart.flags field. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_authtime_set @anchor{shishi_enckdcreppart_authtime_set} @deftypefun {int} {shishi_enckdcreppart_authtime_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, const char * @var{authtime}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{authtime}: character buffer containing a generalized time string. Set the EncTicketPart.authtime to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_starttime_set @anchor{shishi_enckdcreppart_starttime_set} @deftypefun {int} {shishi_enckdcreppart_starttime_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, const char * @var{starttime}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{starttime}: character buffer containing a generalized time string. Set the EncTicketPart.starttime to supplied value. Use a NULL value for @code{starttime} to remove the field. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_endtime_set @anchor{shishi_enckdcreppart_endtime_set} @deftypefun {int} {shishi_enckdcreppart_endtime_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, const char * @var{endtime}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{endtime}: character buffer containing a generalized time string. Set the EncTicketPart.endtime to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_renew_till_set @anchor{shishi_enckdcreppart_renew_till_set} @deftypefun {int} {shishi_enckdcreppart_renew_till_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, const char * @var{renew_till}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{renew_till}: character buffer containing a generalized time string. Set the EncTicketPart.renew-till to supplied value. Use a NULL value for @code{renew_till} to remove the field. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_enckdcreppart_srealm_set @anchor{shishi_enckdcreppart_srealm_set} @deftypefun {int} {shishi_enckdcreppart_srealm_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, const char * @var{srealm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: EncKDCRepPart variable to set realm field in. @var{srealm}: input array with name of realm. Set the server realm field in the EncKDCRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_enckdcreppart_sname_set @anchor{shishi_enckdcreppart_sname_set} @deftypefun {int} {shishi_enckdcreppart_sname_set} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, Shishi_name_type @var{name_type}, char * [] @var{sname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: EncKDCRepPart variable to set server name field in. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{sname}: input array with principal name. Set the server name field in the EncKDCRepPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_enckdcreppart_populate_encticketpart @anchor{shishi_enckdcreppart_populate_encticketpart} @deftypefun {int} {shishi_enckdcreppart_populate_encticketpart} (Shishi * @var{handle}, Shishi_asn1 @var{enckdcreppart}, Shishi_asn1 @var{encticketpart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{enckdcreppart}: input EncKDCRepPart variable. @var{encticketpart}: input EncTicketPart variable. Set the flags, authtime, starttime, endtime, renew-till and caddr fields of the EncKDCRepPart to the corresponding values in the EncTicketPart. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun shishi-1.0.2/doc/texi/priv.c.texi0000644000000000000000000002721512126773203013514 00000000000000@subheading shishi_priv @anchor{shishi_priv} @deftypefun {int} {shishi_priv} (Shishi * @var{handle}, Shishi_priv ** @var{priv}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{priv}: pointer to new structure that holds information about PRIV exchange Create a new PRIV exchange. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_done @anchor{shishi_priv_done} @deftypefun {void} {shishi_priv_done} (Shishi_priv * @var{priv}) @var{priv}: structure that holds information about PRIV exchange Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle. @end deftypefun @subheading shishi_priv_key @anchor{shishi_priv_key} @deftypefun {Shishi_key *} {shishi_priv_key} (Shishi_priv * @var{priv}) @var{priv}: structure that holds information about PRIV exchange Get key from PRIV exchange. @strong{Return value:} Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_priv_key_set @anchor{shishi_priv_key_set} @deftypefun {void} {shishi_priv_key_set} (Shishi_priv * @var{priv}, Shishi_key * @var{key}) @var{priv}: structure that holds information about PRIV exchange @var{key}: key to store in PRIV. Set the Key in the PRIV exchange. @end deftypefun @subheading shishi_priv_priv @anchor{shishi_priv_priv} @deftypefun {Shishi_asn1} {shishi_priv_priv} (Shishi_priv * @var{priv}) @var{priv}: structure that holds information about PRIV exchange Get ASN.1 PRIV structure in PRIV exchange. @strong{Return value:} Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_priv_priv_set @anchor{shishi_priv_priv_set} @deftypefun {void} {shishi_priv_priv_set} (Shishi_priv * @var{priv}, Shishi_asn1 @var{asn1priv}) @var{priv}: structure that holds information about PRIV exchange @var{asn1priv}: KRB-PRIV to store in PRIV exchange. Set the KRB-PRIV in the PRIV exchange. @end deftypefun @subheading shishi_priv_priv_der @anchor{shishi_priv_priv_der} @deftypefun {int} {shishi_priv_priv_der} (Shishi_priv * @var{priv}, char ** @var{out}, size_t * @var{outlen}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{out}: output array with newly allocated DER encoding of PRIV. @var{outlen}: length of output array with DER encoding of PRIV. DER encode PRIV structure. Typically @code{shishi_priv_build()} is used to build the PRIV structure first. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_priv_der_set @anchor{shishi_priv_priv_der_set} @deftypefun {int} {shishi_priv_priv_der_set} (Shishi_priv * @var{priv}, char * @var{der}, size_t @var{derlen}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{der}: input array with DER encoded KRB-PRIV. @var{derlen}: length of input array with DER encoded KRB-PRIV. DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the KRB-PRIV in the PRIV exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_priv_encprivpart @anchor{shishi_priv_encprivpart} @deftypefun {Shishi_asn1} {shishi_priv_encprivpart} (Shishi_priv * @var{priv}) @var{priv}: structure that holds information about PRIV exchange Get ASN.1 EncPrivPart structure from PRIV exchange. @strong{Return value:} Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_priv_encprivpart_set @anchor{shishi_priv_encprivpart_set} @deftypefun {void} {shishi_priv_encprivpart_set} (Shishi_priv * @var{priv}, Shishi_asn1 @var{asn1encprivpart}) @var{priv}: structure that holds information about PRIV exchange @var{asn1encprivpart}: ENCPRIVPART to store in PRIV exchange. Set the ENCPRIVPART in the PRIV exchange. @end deftypefun @subheading shishi_priv_encprivpart_der @anchor{shishi_priv_encprivpart_der} @deftypefun {int} {shishi_priv_encprivpart_der} (Shishi_priv * @var{priv}, char ** @var{out}, size_t * @var{outlen}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{out}: output array with newly allocated DER encoding of ENCPRIVPART. @var{outlen}: length of output array with DER encoding of ENCPRIVPART. DER encode ENCPRIVPART structure. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_encprivpart_der_set @anchor{shishi_priv_encprivpart_der_set} @deftypefun {int} {shishi_priv_encprivpart_der_set} (Shishi_priv * @var{priv}, char * @var{der}, size_t @var{derlen}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{der}: input array with DER encoded ENCPRIVPART. @var{derlen}: length of input array with DER encoded ENCPRIVPART. DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_priv_print @anchor{shishi_priv_print} @deftypefun {int} {shishi_priv_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{priv}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{priv}: PRIV to print. Print ASCII armored DER encoding of PRIV to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_save @anchor{shishi_priv_save} @deftypefun {int} {shishi_priv_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{priv}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{priv}: PRIV to save. Save DER encoding of PRIV to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_to_file @anchor{shishi_priv_to_file} @deftypefun {int} {shishi_priv_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{priv}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{priv}: PRIV to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write PRIV to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_parse @anchor{shishi_priv_parse} @deftypefun {int} {shishi_priv_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{priv}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{priv}: output variable with newly allocated PRIV. Read ASCII armored DER encoded PRIV from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_read @anchor{shishi_priv_read} @deftypefun {int} {shishi_priv_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{priv}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{priv}: output variable with newly allocated PRIV. Read DER encoded PRIV from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_from_file @anchor{shishi_priv_from_file} @deftypefun {int} {shishi_priv_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{priv}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{priv}: output variable with newly allocated PRIV. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read PRIV from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_enc_part_etype @anchor{shishi_priv_enc_part_etype} @deftypefun {int} {shishi_priv_enc_part_etype} (Shishi * @var{handle}, Shishi_asn1 @var{priv}, int32_t * @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{priv}: PRIV variable to get value from. @var{etype}: output variable that holds the value. Extract PRIV.enc-part.etype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_set_enc_part @anchor{shishi_priv_set_enc_part} @deftypefun {int} {shishi_priv_set_enc_part} (Shishi * @var{handle}, Shishi_asn1 @var{priv}, int32_t @var{etype}, const char * @var{encpart}, size_t @var{encpartlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{priv}: priv as allocated by @code{shishi_priv()}. @var{etype}: input encryption type to store in PRIV. @var{encpart}: input encrypted data to store in PRIV. @var{encpartlen}: size of input encrypted data to store in PRIV. Store encrypted data in PRIV. The encrypted data is usually created by calling @code{shishi_encrypt()} on some application specific data using the key from the ticket that is being used. To save time, you may want to use @code{shishi_priv_build()} instead, which encryptes the data and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encprivpart_user_data @anchor{shishi_encprivpart_user_data} @deftypefun {int} {shishi_encprivpart_user_data} (Shishi * @var{handle}, Shishi_asn1 @var{encprivpart}, char ** @var{userdata}, size_t * @var{userdatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encprivpart}: encprivpart as allocated by @code{shishi_priv()}. @var{userdata}: output array with newly allocated user data from KRB-PRIV. @var{userdatalen}: output size of output user data buffer. Read user data value from KRB-PRIV. @code{userdata} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encprivpart_set_user_data @anchor{shishi_encprivpart_set_user_data} @deftypefun {int} {shishi_encprivpart_set_user_data} (Shishi * @var{handle}, Shishi_asn1 @var{encprivpart}, const char * @var{userdata}, size_t @var{userdatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encprivpart}: encprivpart as allocated by @code{shishi_priv()}. @var{userdata}: input user application to store in PRIV. @var{userdatalen}: size of input user application to store in PRIV. Set the application data in PRIV. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_build @anchor{shishi_priv_build} @deftypefun {int} {shishi_priv_build} (Shishi_priv * @var{priv}, Shishi_key * @var{key}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{key}: key for session, used to encrypt data. Build checksum and set it in KRB-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_priv_process @anchor{shishi_priv_process} @deftypefun {int} {shishi_priv_process} (Shishi_priv * @var{priv}, Shishi_key * @var{key}) @var{priv}: priv as allocated by @code{shishi_priv()}. @var{key}: key to use to decrypt EncPrivPart. Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the PRIV exchange. @strong{Return value:} Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed. @end deftypefun shishi-1.0.2/doc/texi/crypto-aes.c.texi0000644000000000000000000000000012126773202014600 00000000000000shishi-1.0.2/doc/texi/file.c.texi0000644000000000000000000000000012126773203013432 00000000000000shishi-1.0.2/doc/texi/tgs.c.texi0000644000000000000000000002374712126773203013337 00000000000000@subheading shishi_tgs @anchor{shishi_tgs} @deftypefun {int} {shishi_tgs} (Shishi * @var{handle}, Shishi_tgs ** @var{tgs}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{tgs}: holds pointer to newly allocate Shishi_tgs structure. Allocate a new TGS exchange variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_done @anchor{shishi_tgs_done} @deftypefun {void} {shishi_tgs_done} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about AS exchange Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle. @end deftypefun @subheading shishi_tgs_tgtkt @anchor{shishi_tgs_tgtkt} @deftypefun {Shishi_tkt *} {shishi_tgs_tgtkt} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get Ticket-granting-ticket from TGS exchange. @strong{Return value:} Returns the ticket-granting-ticket used in the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_tgtkt_set @anchor{shishi_tgs_tgtkt_set} @deftypefun {void} {shishi_tgs_tgtkt_set} (Shishi_tgs * @var{tgs}, Shishi_tkt * @var{tgtkt}) @var{tgs}: structure that holds information about TGS exchange @var{tgtkt}: ticket granting ticket to store in TGS. Set the Ticket in the TGS exchange. @end deftypefun @subheading shishi_tgs_ap @anchor{shishi_tgs_ap} @deftypefun {Shishi_ap *} {shishi_tgs_ap} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get the AP from TGS exchange. @strong{Return value:} Returns the AP exchange (part of TGS-REQ) from the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_req @anchor{shishi_tgs_req} @deftypefun {Shishi_asn1} {shishi_tgs_req} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get the TGS-REQ from TGS exchange. @strong{Return value:} Returns the generated TGS-REQ from the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_req_set @anchor{shishi_tgs_req_set} @deftypefun {void} {shishi_tgs_req_set} (Shishi_tgs * @var{tgs}, Shishi_asn1 @var{tgsreq}) @var{tgs}: structure that holds information about TGS exchange @var{tgsreq}: tgsreq to store in TGS. Set the TGS-REQ in the TGS exchange. @end deftypefun @subheading shishi_tgs_req_der @anchor{shishi_tgs_req_der} @deftypefun {int} {shishi_tgs_req_der} (Shishi_tgs * @var{tgs}, char ** @var{out}, size_t * @var{outlen}) @var{tgs}: structure that holds information about TGS exchange @var{out}: output array with newly allocated DER encoding of TGS-REQ. @var{outlen}: length of output array with DER encoding of TGS-REQ. DER encode TGS-REQ. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_req_der_set @anchor{shishi_tgs_req_der_set} @deftypefun {int} {shishi_tgs_req_der_set} (Shishi_tgs * @var{tgs}, char * @var{der}, size_t @var{derlen}) @var{tgs}: structure that holds information about TGS exchange @var{der}: input array with DER encoded AP-REQ. @var{derlen}: length of input array with DER encoded AP-REQ. DER decode TGS-REQ and set it TGS exchange. If decoding fails, the TGS-REQ in the TGS exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_tgs_req_process @anchor{shishi_tgs_req_process} @deftypefun {int} {shishi_tgs_req_process} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ is taken from the EncKDCReqPart of the TGS tgticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_req_build @anchor{shishi_tgs_req_build} @deftypefun {int} {shishi_tgs_req_build} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Checksum data in authenticator and add ticket and authenticator to TGS-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_rep @anchor{shishi_tgs_rep} @deftypefun {Shishi_asn1} {shishi_tgs_rep} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get TGS-REP from TGS exchange. @strong{Return value:} Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_rep_der @anchor{shishi_tgs_rep_der} @deftypefun {int} {shishi_tgs_rep_der} (Shishi_tgs * @var{tgs}, char ** @var{out}, size_t * @var{outlen}) @var{tgs}: structure that holds information about TGS exchange @var{out}: output array with newly allocated DER encoding of TGS-REP. @var{outlen}: length of output array with DER encoding of TGS-REP. DER encode TGS-REP. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_rep_process @anchor{shishi_tgs_rep_process} @deftypefun {int} {shishi_tgs_rep_process} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Process new TGS-REP and set ticket. The key to decrypt the TGS-REP is taken from the EncKDCRepPart of the TGS tgticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_rep_build @anchor{shishi_tgs_rep_build} @deftypefun {int} {shishi_tgs_rep_build} (Shishi_tgs * @var{tgs}, int @var{keyusage}, Shishi_key * @var{key}) @var{tgs}: structure that holds information about TGS exchange @var{keyusage}: keyusage integer. @var{key}: user's key, used to encrypt the encrypted part of the TGS-REP. Build TGS-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_krberror @anchor{shishi_tgs_krberror} @deftypefun {Shishi_asn1} {shishi_tgs_krberror} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get KRB-ERROR from TGS exchange. @strong{Return value:} Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_krberror_der @anchor{shishi_tgs_krberror_der} @deftypefun {int} {shishi_tgs_krberror_der} (Shishi_tgs * @var{tgs}, char ** @var{out}, size_t * @var{outlen}) @var{tgs}: structure that holds information about TGS exchange @var{out}: output array with newly allocated DER encoding of KRB-ERROR. @var{outlen}: length of output array with DER encoding of KRB-ERROR. DER encode KRB-ERROR. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_krberror_set @anchor{shishi_tgs_krberror_set} @deftypefun {void} {shishi_tgs_krberror_set} (Shishi_tgs * @var{tgs}, Shishi_asn1 @var{krberror}) @var{tgs}: structure that holds information about TGS exchange @var{krberror}: krberror to store in TGS. Set the KRB-ERROR in the TGS exchange. @end deftypefun @subheading shishi_tgs_tkt @anchor{shishi_tgs_tkt} @deftypefun {Shishi_tkt *} {shishi_tgs_tkt} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Get Ticket from TGS exchange. @strong{Return value:} Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_tgs_tkt_set @anchor{shishi_tgs_tkt_set} @deftypefun {void} {shishi_tgs_tkt_set} (Shishi_tgs * @var{tgs}, Shishi_tkt * @var{tkt}) @var{tgs}: structure that holds information about TGS exchange @var{tkt}: ticket to store in TGS. Set the Ticket in the TGS exchange. @end deftypefun @subheading shishi_tgs_sendrecv_hint @anchor{shishi_tgs_sendrecv_hint} @deftypefun {int} {shishi_tgs_sendrecv_hint} (Shishi_tgs * @var{tgs}, Shishi_tkts_hint * @var{hint}) @var{tgs}: structure that holds information about TGS exchange @var{hint}: additional parameters that modify connection behaviour, or @code{NULL}. Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The @code{hint} structure can be used to set, e.g., parameters for TLS authentication. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_sendrecv @anchor{shishi_tgs_sendrecv} @deftypefun {int} {shishi_tgs_sendrecv} (Shishi_tgs * @var{tgs}) @var{tgs}: structure that holds information about TGS exchange Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_set_server @anchor{shishi_tgs_set_server} @deftypefun {int} {shishi_tgs_set_server} (Shishi_tgs * @var{tgs}, const char * @var{server}) @var{tgs}: structure that holds information about TGS exchange @var{server}: indicates the server to acquire ticket for. Set the server in the TGS-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_set_realm @anchor{shishi_tgs_set_realm} @deftypefun {int} {shishi_tgs_set_realm} (Shishi_tgs * @var{tgs}, const char * @var{realm}) @var{tgs}: structure that holds information about TGS exchange @var{realm}: indicates the realm to acquire ticket for. Set the server in the TGS-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tgs_set_realmserver @anchor{shishi_tgs_set_realmserver} @deftypefun {int} {shishi_tgs_set_realmserver} (Shishi_tgs * @var{tgs}, const char * @var{realm}, const char * @var{server}) @var{tgs}: structure that holds information about TGS exchange @var{realm}: indicates the realm to acquire ticket for. @var{server}: indicates the server to acquire ticket for. Set the realm and server in the TGS-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/encticketpart.c.texi0000644000000000000000000001457312126773202015376 00000000000000@subheading shishi_encticketpart_get_key @anchor{shishi_encticketpart_get_key} @deftypefun {int} {shishi_encticketpart_get_key} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, Shishi_key ** @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{key}: newly allocated key. Extract the session key in the Ticket. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_key_set @anchor{shishi_encticketpart_key_set} @deftypefun {int} {shishi_encticketpart_key_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, Shishi_key * @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{key}: key handle with information to store in encticketpart. Set the EncTicketPart.key field to key type and value of supplied key. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_flags_set @anchor{shishi_encticketpart_flags_set} @deftypefun {int} {shishi_encticketpart_flags_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, int @var{flags}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{flags}: flags to set in encticketpart. Set the EncTicketPart.flags to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_crealm_set @anchor{shishi_encticketpart_crealm_set} @deftypefun {int} {shishi_encticketpart_crealm_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, const char * @var{realm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{realm}: input array with name of realm. Set the realm field in the KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encticketpart_cname_set @anchor{shishi_encticketpart_cname_set} @deftypefun {int} {shishi_encticketpart_cname_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, Shishi_name_type @var{name_type}, const char * @var{principal}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{principal}: input array with principal name. Set the client name field in the EncTicketPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encticketpart_transited_set @anchor{shishi_encticketpart_transited_set} @deftypefun {int} {shishi_encticketpart_transited_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, int32_t @var{trtype}, const char * @var{trdata}, size_t @var{trdatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{trtype}: transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS. @var{trdata}: actual transited realm data. @var{trdatalen}: length of actual transited realm data. Set the EncTicketPart.transited field to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_authtime_set @anchor{shishi_encticketpart_authtime_set} @deftypefun {int} {shishi_encticketpart_authtime_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, const char * @var{authtime}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{authtime}: character buffer containing a generalized time string. Set the EncTicketPart.authtime to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_endtime_set @anchor{shishi_encticketpart_endtime_set} @deftypefun {int} {shishi_encticketpart_endtime_set} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, const char * @var{endtime}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{encticketpart}: input EncTicketPart variable. @var{endtime}: character buffer containing a generalized time string. Set the EncTicketPart.endtime to supplied value. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encticketpart_client @anchor{shishi_encticketpart_client} @deftypefun {int} {shishi_encticketpart_client} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{encticketpart}: EncTicketPart variable to get client name from. @var{client}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Represent client principal name in EncTicketPart as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_encticketpart_clientrealm @anchor{shishi_encticketpart_clientrealm} @deftypefun {int} {shishi_encticketpart_clientrealm} (Shishi * @var{handle}, Shishi_asn1 @var{encticketpart}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{encticketpart}: EncTicketPart variable to get client name and realm from. @var{client}: pointer to newly allocated zero terminated string containing principal name and realm. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Convert cname and realm fields from EncTicketPart to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/low-crypto.c.texi0000644000000000000000000002217312126773202014650 00000000000000@subheading shishi_randomize @anchor{shishi_randomize} @deftypefun {int} {shishi_randomize} (Shishi * @var{handle}, int @var{strong}, void * @var{data}, size_t @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{strong}: 0 iff operation should not block, non-0 for very strong randomness. @var{data}: output array to be filled with random data. @var{datalen}: size of output array. Store cryptographically random data of given size in the provided buffer. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_crc @anchor{shishi_crc} @deftypefun {int} {shishi_crc} (Shishi * @var{handle}, const char * @var{in}, size_t @var{inlen}, char * @var{out[4]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{in}: input character array of data to checksum. @var{inlen}: length of input character array of data to checksum. Compute checksum of data using CRC32 modified according to RFC 1510. The @code{out} buffer must be deallocated by the caller. The modifications compared to standard CRC32 is that no initial and final XOR is performed, and that the output is returned in LSB-first order. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_md4 @anchor{shishi_md4} @deftypefun {int} {shishi_md4} (Shishi * @var{handle}, const char * @var{in}, size_t @var{inlen}, char * @var{out[16]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{in}: input character array of data to hash. @var{inlen}: length of input character array of data to hash. Compute hash of data using MD4. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_md5 @anchor{shishi_md5} @deftypefun {int} {shishi_md5} (Shishi * @var{handle}, const char * @var{in}, size_t @var{inlen}, char * @var{out[16]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{in}: input character array of data to hash. @var{inlen}: length of input character array of data to hash. Compute hash of data using MD5. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_hmac_md5 @anchor{shishi_hmac_md5} @deftypefun {int} {shishi_hmac_md5} (Shishi * @var{handle}, const char * @var{key}, size_t @var{keylen}, const char * @var{in}, size_t @var{inlen}, char * @var{outhash[16]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: input character array with key to use. @var{keylen}: length of input character array with key to use. @var{in}: input character array of data to hash. @var{inlen}: length of input character array of data to hash. Compute keyed checksum of data using HMAC-MD5. The @code{outhash} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_hmac_sha1 @anchor{shishi_hmac_sha1} @deftypefun {int} {shishi_hmac_sha1} (Shishi * @var{handle}, const char * @var{key}, size_t @var{keylen}, const char * @var{in}, size_t @var{inlen}, char * @var{outhash[20]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: input character array with key to use. @var{keylen}: length of input character array with key to use. @var{in}: input character array of data to hash. @var{inlen}: length of input character array of data to hash. Compute keyed checksum of data using HMAC-SHA1. The @code{outhash} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_des_cbc_mac @anchor{shishi_des_cbc_mac} @deftypefun {int} {shishi_des_cbc_mac} (Shishi * @var{handle}, const char @var{key[8]}, const char @var{iv[8]}, const char * @var{in}, size_t @var{inlen}, char * @var{out[8]}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{in}: input character array of data to hash. @var{inlen}: length of input character array of data to hash. Computed keyed checksum of data using DES-CBC-MAC. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_arcfour @anchor{shishi_arcfour} @deftypefun {int} {shishi_arcfour} (Shishi * @var{handle}, int @var{decryptp}, const char * @var{key}, size_t @var{keylen}, const char @var{iv[258]}, char * @var{ivout[258]}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{decryptp}: 0 to indicate encryption, non-0 to indicate decryption. @var{key}: input character array with key to use. @var{keylen}: length of input key array. @var{in}: input character array of data to encrypt/decrypt. @var{inlen}: length of input character array of data to encrypt/decrypt. @var{out}: newly allocated character array with encrypted/decrypted data. Encrypt or decrypt data (depending on @code{decryptp}) using ARCFOUR. The @code{out} buffer must be deallocated by the caller. The "initialization vector" used here is the concatenation of the sbox and i and j, and is thus always of size 256 + 1 + 1. This is a slight abuse of terminology, and assumes you know what you are doing. Don't use it if you can avoid to. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_des @anchor{shishi_des} @deftypefun {int} {shishi_des} (Shishi * @var{handle}, int @var{decryptp}, const char @var{key[8]}, const char @var{iv[8]}, char * @var{ivout[8]}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{decryptp}: 0 to indicate encryption, non-0 to indicate decryption. @var{in}: input character array of data to encrypt/decrypt. @var{inlen}: length of input character array of data to encrypt/decrypt. @var{out}: newly allocated character array with encrypted/decrypted data. Encrypt or decrypt data (depending on @code{decryptp}) using DES in CBC mode. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_3des @anchor{shishi_3des} @deftypefun {int} {shishi_3des} (Shishi * @var{handle}, int @var{decryptp}, const char @var{key[8]}, const char @var{iv[8]}, char * @var{ivout[8]}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{decryptp}: 0 to indicate encryption, non-0 to indicate decryption. @var{in}: input character array of data to encrypt/decrypt. @var{inlen}: length of input character array of data to encrypt/decrypt. @var{out}: newly allocated character array with encrypted/decrypted data. Encrypt or decrypt data (depending on @code{decryptp}) using 3DES in CBC mode. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aes_cts @anchor{shishi_aes_cts} @deftypefun {int} {shishi_aes_cts} (Shishi * @var{handle}, int @var{decryptp}, const char * @var{key}, size_t @var{keylen}, const char @var{iv[16]}, char * @var{ivout[16]}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{decryptp}: 0 to indicate encryption, non-0 to indicate decryption. @var{key}: input character array with key to use. @var{keylen}: length of input character array with key to use. @var{in}: input character array of data to encrypt/decrypt. @var{inlen}: length of input character array of data to encrypt/decrypt. @var{out}: newly allocated character array with encrypted/decrypted data. Encrypt or decrypt data (depending on @code{decryptp}) using AES in CBC-CTS mode. The length of the key, @code{keylen}, decide if AES 128 or AES 256 should be used. The @code{out} buffer must be deallocated by the caller. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_pbkdf2_sha1 @anchor{shishi_pbkdf2_sha1} @deftypefun {int} {shishi_pbkdf2_sha1} (Shishi * @var{handle}, const char * @var{P}, size_t @var{Plen}, const char * @var{S}, size_t @var{Slen}, unsigned int @var{c}, unsigned int @var{dkLen}, char * @var{DK}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{P}: input password, an octet string @var{Plen}: length of password, an octet string @var{S}: input salt, an octet string @var{Slen}: length of salt, an octet string @var{c}: iteration count, a positive integer @var{dkLen}: intended length in octets of the derived key, a positive integer, at most (2^32 - 1) * hLen. The DK array must have room for this many characters. @var{DK}: output derived key, a dkLen-octet string Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a pseudorandom function to derive keys. The length of the derived key is essentially unbounded. (However, the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function, which is this function is always SHA1.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/aprep.c.texi0000644000000000000000000000735712126773202013647 00000000000000@subheading shishi_aprep @anchor{shishi_aprep} @deftypefun {Shishi_asn1} {shishi_aprep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new AP-REP, populated with some default values. @strong{Return value:} Returns the authenticator or NULL on failure. @end deftypefun @subheading shishi_aprep_print @anchor{shishi_aprep_print} @deftypefun {int} {shishi_aprep_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{aprep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{aprep}: AP-REP to print. Print ASCII armored DER encoding of AP-REP to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_save @anchor{shishi_aprep_save} @deftypefun {int} {shishi_aprep_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{aprep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{aprep}: AP-REP to save. Save DER encoding of AP-REP to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_to_file @anchor{shishi_aprep_to_file} @deftypefun {int} {shishi_aprep_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{aprep}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{aprep}: AP-REP to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write AP-REP to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_parse @anchor{shishi_aprep_parse} @deftypefun {int} {shishi_aprep_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{aprep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{aprep}: output variable with newly allocated AP-REP. Read ASCII armored DER encoded AP-REP from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_read @anchor{shishi_aprep_read} @deftypefun {int} {shishi_aprep_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{aprep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{aprep}: output variable with newly allocated AP-REP. Read DER encoded AP-REP from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_from_file @anchor{shishi_aprep_from_file} @deftypefun {int} {shishi_aprep_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{aprep}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{aprep}: output variable with newly allocated AP-REP. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read AP-REP from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_aprep_get_enc_part_etype @anchor{shishi_aprep_get_enc_part_etype} @deftypefun {int} {shishi_aprep_get_enc_part_etype} (Shishi * @var{handle}, Shishi_asn1 @var{aprep}, int32_t * @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{aprep}: AP-REP variable to get value from. @var{etype}: output variable that holds the value. Extract AP-REP.enc-part.etype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/crypto.c.texi0000644000000000000000000007512312126773202014054 00000000000000@subheading shishi_cipher_supported_p @anchor{shishi_cipher_supported_p} @deftypefun {int} {shishi_cipher_supported_p} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Find out if cipher is supported. @strong{Return value:} Return 0 iff cipher is unsupported. @end deftypefun @subheading shishi_cipher_name @anchor{shishi_cipher_name} @deftypefun {const char *} {shishi_cipher_name} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Read humanly readable string for cipher. @strong{Return value:} Return name of encryption type, e.g. "des3-cbc-sha1-kd", as defined in the standards. @end deftypefun @subheading shishi_cipher_blocksize @anchor{shishi_cipher_blocksize} @deftypefun {int} {shishi_cipher_blocksize} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Get block size for cipher. @strong{Return value:} Return block size for encryption type, as defined in the standards. @end deftypefun @subheading shishi_cipher_confoundersize @anchor{shishi_cipher_confoundersize} @deftypefun {int} {shishi_cipher_confoundersize} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Get length of confounder for cipher. @strong{Return value:} Returns the size of the confounder (random data) for encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type). @end deftypefun @subheading shishi_cipher_keylen @anchor{shishi_cipher_keylen} @deftypefun {size_t} {shishi_cipher_keylen} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Get key length for cipher. @strong{Return value:} Return length of key used for the encryption type, as defined in the standards. @end deftypefun @subheading shishi_cipher_randomlen @anchor{shishi_cipher_randomlen} @deftypefun {size_t} {shishi_cipher_randomlen} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Get length of random data for cipher. @strong{Return value:} Return length of random used for the encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type). @end deftypefun @subheading shishi_cipher_defaultcksumtype @anchor{shishi_cipher_defaultcksumtype} @deftypefun {int} {shishi_cipher_defaultcksumtype} (int32_t @var{type}) @var{type}: encryption type, see Shishi_etype. Get the default checksum associated with cipher. @strong{Return value:} Return associated checksum mechanism for the encryption type, as defined in the standards. @end deftypefun @subheading shishi_cipher_parse @anchor{shishi_cipher_parse} @deftypefun {int} {shishi_cipher_parse} (const char * @var{cipher}) @var{cipher}: name of encryption type, e.g. "des3-cbc-sha1-kd". Get cipher number by parsing string. @strong{Return value:} Return encryption type corresponding to a string. @end deftypefun @subheading shishi_checksum_supported_p @anchor{shishi_checksum_supported_p} @deftypefun {int} {shishi_checksum_supported_p} (int32_t @var{type}) @var{type}: checksum type, see Shishi_cksumtype. Find out whether checksum is supported. @strong{Return value:} Return 0 iff checksum is unsupported. @end deftypefun @subheading shishi_checksum_name @anchor{shishi_checksum_name} @deftypefun {const char *} {shishi_checksum_name} (int32_t @var{type}) @var{type}: checksum type, see Shishi_cksumtype. Get name of checksum. @strong{Return value:} Return name of checksum type, e.g. "hmac-sha1-96-aes256", as defined in the standards. @end deftypefun @subheading shishi_checksum_cksumlen @anchor{shishi_checksum_cksumlen} @deftypefun {size_t} {shishi_checksum_cksumlen} (int32_t @var{type}) @var{type}: checksum type, see Shishi_cksumtype. Get length of checksum output. @strong{Return value:} Return length of checksum used for the checksum type, as defined in the standards. @end deftypefun @subheading shishi_checksum_parse @anchor{shishi_checksum_parse} @deftypefun {int} {shishi_checksum_parse} (const char * @var{checksum}) @var{checksum}: name of checksum type, e.g. "hmac-sha1-96-aes256". Get checksum number by parsing a string. @strong{Return value:} Return checksum type, see Shishi_cksumtype, corresponding to a string. @end deftypefun @subheading shishi_string_to_key @anchor{shishi_string_to_key} @deftypefun {int} {shishi_string_to_key} (Shishi * @var{handle}, int32_t @var{keytype}, const char * @var{password}, size_t @var{passwordlen}, const char * @var{salt}, size_t @var{saltlen}, const char * @var{parameter}, Shishi_key * @var{outkey}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{keytype}: cryptographic encryption type, see Shishi_etype. @var{password}: input array with password. @var{passwordlen}: length of input array with password. @var{salt}: input array with salt. @var{saltlen}: length of input array with salt. @var{parameter}: input array with opaque encryption type specific information. @var{outkey}: allocated key handle that will contain new key. Derive key from a string (password) and salt (commonly concatenation of realm and principal) for specified key type, and set the type and value in the given key to the computed values. The parameter value is specific for each keytype, and can be set if the parameter information is not available. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_random_to_key @anchor{shishi_random_to_key} @deftypefun {int} {shishi_random_to_key} (Shishi * @var{handle}, int32_t @var{keytype}, const char * @var{rnd}, size_t @var{rndlen}, Shishi_key * @var{outkey}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{keytype}: cryptographic encryption type, see Shishi_etype. @var{rnd}: input array with random data. @var{rndlen}: length of input array with random data. @var{outkey}: allocated key handle that will contain new key. Derive key from random data for specified key type, and set the type and value in the given key to the computed values. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_checksum @anchor{shishi_checksum} @deftypefun {int} {shishi_checksum} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int @var{cksumtype}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to compute checksum with. @var{keyusage}: integer specifying what this key is used for. @var{cksumtype}: the checksum algorithm to use. @var{in}: input array with data to integrity protect. @var{inlen}: size of input array with data to integrity protect. @var{out}: output array with newly allocated integrity protected data. @var{outlen}: output variable with length of output array with checksum. Integrity protect data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_verify @anchor{shishi_verify} @deftypefun {int} {shishi_verify} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int @var{cksumtype}, const char * @var{in}, size_t @var{inlen}, const char * @var{cksum}, size_t @var{cksumlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to verify checksum with. @var{keyusage}: integer specifying what this key is used for. @var{cksumtype}: the checksum algorithm to use. @var{in}: input array with data that was integrity protected. @var{inlen}: size of input array with data that was integrity protected. @var{cksum}: input array with alleged checksum of data. @var{cksumlen}: size of input array with alleged checksum of data. Verify checksum of data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt_ivupdate_etype @anchor{shishi_encrypt_ivupdate_etype} @deftypefun {int} {shishi_encrypt_ivupdate_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{iv}, size_t @var{ivlen}, char ** @var{ivout}, size_t * @var{ivoutlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{etype}: integer specifying what cipher to use. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{ivout}: output array with newly allocated updated initialization vector. @var{ivoutlen}: size of output array with updated initialization vector. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt_iv_etype @anchor{shishi_encrypt_iv_etype} @deftypefun {int} {shishi_encrypt_iv_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{iv}, size_t @var{ivlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{etype}: integer specifying what cipher to use. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt_etype @anchor{shishi_encrypt_etype} @deftypefun {int} {shishi_encrypt_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{etype}: integer specifying what cipher to use. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt_ivupdate @anchor{shishi_encrypt_ivupdate} @deftypefun {int} {shishi_encrypt_ivupdate} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, const char * @var{iv}, size_t @var{ivlen}, char ** @var{ivout}, size_t * @var{ivoutlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{ivout}: output array with newly allocated updated initialization vector. @var{ivoutlen}: size of output array with updated initialization vector. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt_iv @anchor{shishi_encrypt_iv} @deftypefun {int} {shishi_encrypt_iv} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, const char * @var{iv}, size_t @var{ivlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_encrypt @anchor{shishi_encrypt} @deftypefun {int} {shishi_encrypt} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to encrypt with. @var{keyusage}: integer specifying what this key is encrypting. @var{in}: input array with data to encrypt. @var{inlen}: size of input array with data to encrypt. @var{out}: output array with newly allocated encrypted data. @var{outlen}: output variable with size of newly allocated output array. Encrypts data using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt_ivupdate_etype @anchor{shishi_decrypt_ivupdate_etype} @deftypefun {int} {shishi_decrypt_ivupdate_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{iv}, size_t @var{ivlen}, char ** @var{ivout}, size_t * @var{ivoutlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{etype}: integer specifying what cipher to use. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{ivout}: output array with newly allocated updated initialization vector. @var{ivoutlen}: size of output array with updated initialization vector. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt_iv_etype @anchor{shishi_decrypt_iv_etype} @deftypefun {int} {shishi_decrypt_iv_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{iv}, size_t @var{ivlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{etype}: integer specifying what cipher to use. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt_etype @anchor{shishi_decrypt_etype} @deftypefun {int} {shishi_decrypt_etype} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, int32_t @var{etype}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{etype}: integer specifying what cipher to use. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data as per encryption method using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt_ivupdate @anchor{shishi_decrypt_ivupdate} @deftypefun {int} {shishi_decrypt_ivupdate} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, const char * @var{iv}, size_t @var{ivlen}, char ** @var{ivout}, size_t * @var{ivoutlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{ivout}: output array with newly allocated updated initialization vector. @var{ivoutlen}: size of output array with updated initialization vector. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt_iv @anchor{shishi_decrypt_iv} @deftypefun {int} {shishi_decrypt_iv} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, const char * @var{iv}, size_t @var{ivlen}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{iv}: input array with initialization vector @var{ivlen}: size of input array with initialization vector. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_decrypt @anchor{shishi_decrypt} @deftypefun {int} {shishi_decrypt} (Shishi * @var{handle}, Shishi_key * @var{key}, int @var{keyusage}, const char * @var{in}, size_t @var{inlen}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: key to decrypt with. @var{keyusage}: integer specifying what this key is decrypting. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt. @var{out}: output array with newly allocated decrypted data. @var{outlen}: output variable with size of newly allocated output array. Decrypts data specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate if you need it. Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_n_fold @anchor{shishi_n_fold} @deftypefun {int} {shishi_n_fold} (Shishi * @var{handle}, const char * @var{in}, size_t @var{inlen}, char * @var{out}, size_t @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{in}: input array with data to decrypt. @var{inlen}: size of input array with data to decrypt ("M"). @var{out}: output array with decrypted data. @var{outlen}: size of output array ("N"). Fold data into a fixed length output array, with the intent to give each input bit approximately equal weight in determining the value of each output bit. The algorithm is from "A Better Key Schedule For DES-like Ciphers" by Uri Blumenthal and Steven M. Bellovin, http://www.research.att.com/~smb/papers/ides.pdf, although the sample vectors provided by the paper are incorrect. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_dr @anchor{shishi_dr} @deftypefun {int} {shishi_dr} (Shishi * @var{handle}, Shishi_key * @var{key}, const char * @var{prfconstant}, size_t @var{prfconstantlen}, char * @var{derivedrandom}, size_t @var{derivedrandomlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: input array with cryptographic key to use. @var{prfconstant}: input array with the constant string. @var{prfconstantlen}: size of input array with the constant string. @var{derivedrandom}: output array with derived random data. @var{derivedrandomlen}: size of output array with derived random data. Derive "random" data from a key and a constant thusly: DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, SHISHI_ENCRYPT(KEY, PRFCONSTANT)). @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_dk @anchor{shishi_dk} @deftypefun {int} {shishi_dk} (Shishi * @var{handle}, Shishi_key * @var{key}, const char * @var{prfconstant}, size_t @var{prfconstantlen}, Shishi_key * @var{derivedkey}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{key}: input cryptographic key to use. @var{prfconstant}: input array with the constant string. @var{prfconstantlen}: size of input array with the constant string. @var{derivedkey}: pointer to derived key (allocated by caller). @strong{Derive a key from a key and a constant thusly:} DK(KEY, PRFCONSTANT) = SHISHI_RANDOM-TO-KEY(SHISHI_DR(KEY, PRFCONSTANT)). @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun shishi-1.0.2/doc/texi/setup.c.texi0000644000000000000000000000361512126773203013672 00000000000000@subheading shisa @anchor{shisa} @deftypefun {Shisa *} {shisa} ( @var{void}) Initializes the Shisa library. If this function fails, it may print diagnostic errors to stderr. @strong{Return value:} Returns Shisa library handle, or @code{NULL} on error. @end deftypefun @subheading shisa_done @anchor{shisa_done} @deftypefun {void} {shisa_done} (Shisa * @var{dbh}) Deallocates the shisa library handle. The handle must not be used in any calls to shisa functions after this. @end deftypefun @subheading shisa_init @anchor{shisa_init} @deftypefun {int} {shisa_init} (Shisa ** @var{dbh}) @var{dbh}: pointer to library handle to be created. Create a Shisa library handle, using @code{shisa()}, and read the system configuration file from their default locations. The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf). The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) @strong{Return value:} Returns @code{SHISA_OK} iff successful. @end deftypefun @subheading shisa_init_with_paths @anchor{shisa_init_with_paths} @deftypefun {int} {shisa_init_with_paths} (Shisa ** @var{dbh}, const char * @var{file}) @var{dbh}: pointer to library handle to be created. @var{file}: Filename of system configuration, or NULL. Create a Shisa library handle, using @code{shisa()}, and read the system configuration file indicated location (or the default location, if @code{NULL}). The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf). The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) @strong{Return value:} Returns @code{SHISA_OK} iff successful. @end deftypefun shishi-1.0.2/doc/texi/authorize.c.texi0000644000000000000000000000456212126773202014545 00000000000000@subheading shishi_authorize_strcmp @anchor{shishi_authorize_strcmp} @deftypefun {int} {shishi_authorize_strcmp} (Shishi * @var{handle}, const char * @var{principal}, const char * @var{authzname}) @var{handle}: shishi handle allocated by @code{shishi_init()}. @var{principal}: string with desired principal name. @var{authzname}: authorization name. Authorization of @code{authzname} against desired @code{principal} according to "basic" authentication, i.e., testing for identical strings. @strong{Return value:} Returns 1 if @code{authzname} is authorized for services by the encrypted principal, and 0 otherwise. @end deftypefun @subheading shishi_authorize_k5login @anchor{shishi_authorize_k5login} @deftypefun {int} {shishi_authorize_k5login} (Shishi * @var{handle}, const char * @var{principal}, const char * @var{authzname}) @var{handle}: shishi handle allocated by @code{shishi_init()}. @var{principal}: string with desired principal name and realm. @var{authzname}: authorization name. Authorization of @code{authzname} against desired @code{principal} in accordance with the MIT/Heimdal authorization method. @strong{Return value:} Returns 1 if @code{authzname} is authorized for services by @code{principal}, and returns 0 otherwise. @end deftypefun @subheading shishi_authorization_parse @anchor{shishi_authorization_parse} @deftypefun {int} {shishi_authorization_parse} (const char * @var{authorization}) @var{authorization}: name of authorization type, "basic" or "k5login". Parse authorization type name. @strong{Return value:} Returns authorization type corresponding to a string. @end deftypefun @subheading shishi_authorized_p @anchor{shishi_authorized_p} @deftypefun {int} {shishi_authorized_p} (Shishi * @var{handle}, Shishi_tkt * @var{tkt}, const char * @var{authzname}) @var{handle}: shishi handle allocated by @code{shishi_init()}. @var{tkt}: input variable with ticket info. @var{authzname}: authorization name. Simplistic authorization of @code{authzname} against encrypted client principal name inside ticket. For "basic" authentication type, the principal name must coincide with @code{authzname}. The "k5login" authentication type attempts the MIT/Heimdal method of parsing the file "~/.k5login" for additional equivalence names. @strong{Return value:} Returns 1 if @code{authzname} is authorized for services by the encrypted principal, and 0 otherwise. @end deftypefun shishi-1.0.2/doc/texi/gztime.c.texi0000644000000000000000000000446512126773202014034 00000000000000@subheading shishi_generalize_time @anchor{shishi_generalize_time} @deftypefun {const char *} {shishi_generalize_time} (Shishi * @var{handle}, time_t @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{t}: C time to convert. Convert C time to KerberosTime. The string must not be deallocate by caller. @strong{Return value:} Return a KerberosTime time string corresponding to C time t. @end deftypefun @subheading shishi_generalize_now @anchor{shishi_generalize_now} @deftypefun {const char *} {shishi_generalize_now} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Convert current time to KerberosTime. The string must not be deallocate by caller. @strong{Return value:} Return a KerberosTime time string corresponding to current time. @end deftypefun @subheading shishi_generalize_ctime @anchor{shishi_generalize_ctime} @deftypefun {time_t} {shishi_generalize_ctime} (Shishi * @var{handle}, const char * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{t}: KerberosTime to convert. Convert KerberosTime to C time. @strong{Return value:} Returns C time corresponding to KerberosTime t. @end deftypefun @subheading shishi_time @anchor{shishi_time} @deftypefun {int} {shishi_time} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, char ** @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 node to get time from. @var{field}: Name of field in ASN.1 node to get time from. @var{t}: newly allocated output array with zero terminated time string. Extract time from ASN.1 structure. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ctime @anchor{shishi_ctime} @deftypefun {int} {shishi_ctime} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, time_t * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 variable to read field from. @var{field}: name of field in @code{node} to read. @var{t}: pointer to time field to set. Extract time from ASN.1 structure. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. @end deftypefun shishi-1.0.2/doc/texi/keys.c.texi0000644000000000000000000001372512126773202013507 00000000000000@subheading shishi_keys @anchor{shishi_keys} @deftypefun {int} {shishi_keys} (Shishi * @var{handle}, Shishi_keys ** @var{keys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{keys}: output pointer to newly allocated keys handle. Get a new key set handle. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_keys_done @anchor{shishi_keys_done} @deftypefun {void} {shishi_keys_done} (Shishi_keys ** @var{keys}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. Deallocates all resources associated with key set. The key set handle must not be used in calls to other shishi_keys_*() functions after this. @end deftypefun @subheading shishi_keys_size @anchor{shishi_keys_size} @deftypefun {int} {shishi_keys_size} (Shishi_keys * @var{keys}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. Get size of key set. @strong{Return value:} Returns number of keys stored in key set. @end deftypefun @subheading shishi_keys_nth @anchor{shishi_keys_nth} @deftypefun {const Shishi_key *} {shishi_keys_nth} (Shishi_keys * @var{keys}, int @var{keyno}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. @var{keyno}: integer indicating requested key in key set. @strong{Get the n:} th ticket in key set. @strong{Return value:} Returns a key handle to the keyno:th key in the key set, or NULL if @code{keys} is invalid or @code{keyno} is out of bounds. The first key is @code{keyno} 0, the second key @code{keyno} 1, and so on. @end deftypefun @subheading shishi_keys_remove @anchor{shishi_keys_remove} @deftypefun {void} {shishi_keys_remove} (Shishi_keys * @var{keys}, int @var{keyno}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. @var{keyno}: key number of key in the set to remove. The first key is key number 0. Remove a key, indexed by @code{keyno}, in given key set. @end deftypefun @subheading shishi_keys_add @anchor{shishi_keys_add} @deftypefun {int} {shishi_keys_add} (Shishi_keys * @var{keys}, Shishi_key * @var{key}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. @var{key}: key to be added to key set. Add a key to the key set. A deep copy of the key is stored, so changing @code{key}, or deallocating it, will not modify the value stored in the key set. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_keys_print @anchor{shishi_keys_print} @deftypefun {int} {shishi_keys_print} (Shishi_keys * @var{keys}, FILE * @var{fh}) @var{keys}: key set to print. @var{fh}: file handle, open for writing, to print keys to. Print all keys in set using shishi_key_print. @strong{Returns:} Returns @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_keys_to_file @anchor{shishi_keys_to_file} @deftypefun {int} {shishi_keys_to_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_keys * @var{keys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: filename to append key to. @var{keys}: set of keys to print. Print an ASCII representation of a key structure to a file, for each key in the key set. The file is appended to if it exists. See @code{shishi_key_print()} for the format of the output. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_keys_from_file @anchor{shishi_keys_from_file} @deftypefun {int} {shishi_keys_from_file} (Shishi_keys * @var{keys}, const char * @var{filename}) @var{keys}: key set handle as allocated by @code{shishi_keys()}. @var{filename}: filename to read keys from. Read zero or more keys from file @code{filename} and append them to the keyset @code{keys}. See @code{shishi_key_print()} for the format of the input. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @strong{Since:} 0.0.42 @end deftypefun @subheading shishi_keys_for_serverrealm_in_file @anchor{shishi_keys_for_serverrealm_in_file} @deftypefun {Shishi_key *} {shishi_keys_for_serverrealm_in_file} (Shishi * @var{handle}, const char * @var{filename}, const char * @var{server}, const char * @var{realm}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{filename}: file to read keys from. @var{server}: server name to get key for. @var{realm}: realm of server to get key for. Get keys that match specified @code{server} and @code{realm} from the key set file @code{filename}. @strong{Return value:} Returns the key for specific server and realm, read from the indicated file, or NULL if no key could be found or an error encountered. @end deftypefun @subheading shishi_keys_for_server_in_file @anchor{shishi_keys_for_server_in_file} @deftypefun {Shishi_key *} {shishi_keys_for_server_in_file} (Shishi * @var{handle}, const char * @var{filename}, const char * @var{server}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{filename}: file to read keys from. @var{server}: server name to get key for. Get key for specified @code{server} from @code{filename}. @strong{Return value:} Returns the key for specific server, read from the indicated file, or NULL if no key could be found or an error encountered. @end deftypefun @subheading shishi_keys_for_localservicerealm_in_file @anchor{shishi_keys_for_localservicerealm_in_file} @deftypefun {Shishi_key *} {shishi_keys_for_localservicerealm_in_file} (Shishi * @var{handle}, const char * @var{filename}, const char * @var{service}, const char * @var{realm}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{filename}: file to read keys from. @var{service}: service to get key for. @var{realm}: realm of server to get key for, or NULL for default realm. Get key for specified @code{service} and @code{realm} from @code{filename}. @strong{Return value:} Returns the key for the server "SERVICE/HOSTNAME@code{REALM}" (where HOSTNAME is the current system's hostname), read from the default host keys file (see @code{shishi_hostkeys_default_file()}), or NULL if no key could be found or an error encountered. @end deftypefun shishi-1.0.2/doc/texi/ap.c.texi0000644000000000000000000006052412126773202013133 00000000000000@subheading shishi_ap @anchor{shishi_ap} @deftypefun {int} {shishi_ap} (Shishi * @var{handle}, Shishi_ap ** @var{ap}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use @code{shishi_ap_etype()} or @code{shishi_ap_nosubkey()} instead. In the future, this function will likely behave as @code{shishi_ap_nosubkey()} and @code{shishi_ap_nosubkey()} will be removed. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_etype @anchor{shishi_ap_etype} @deftypefun {int} {shishi_ap_etype} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, int @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{etype}: encryption type of newly generated random subkey. Create a new AP exchange with a random subkey of indicated encryption type. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_nosubkey @anchor{shishi_ap_nosubkey} @deftypefun {int} {shishi_ap_nosubkey} (Shishi * @var{handle}, Shishi_ap ** @var{ap}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange Create a new AP exchange without subkey in authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_done @anchor{shishi_ap_done} @deftypefun {void} {shishi_ap_done} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle. @end deftypefun @subheading shishi_ap_set_tktoptions @anchor{shishi_ap_set_tktoptions} @deftypefun {int} {shishi_ap_set_tktoptions} (Shishi_ap * @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}) @var{ap}: structure that holds information about AP exchange @var{tkt}: ticket to set in AP. @var{options}: AP-REQ options to set in AP. Set the ticket (see @code{shishi_ap_tkt_set()}) and set the AP-REQ apoptions (see @code{shishi_apreq_options_set()}). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_set_tktoptionsdata @anchor{shishi_ap_set_tktoptionsdata} @deftypefun {int} {shishi_ap_set_tktoptionsdata} (Shishi_ap * @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, const char * @var{data}, size_t @var{len}) @var{ap}: structure that holds information about AP exchange @var{tkt}: ticket to set in AP. @var{options}: AP-REQ options to set in AP. @var{data}: input array with data to checksum in Authenticator. @var{len}: length of input array with data to checksum in Authenticator. Set the ticket (see @code{shishi_ap_tkt_set()}) and set the AP-REQ apoptions (see @code{shishi_apreq_options_set()}) and set the Authenticator checksum data. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_set_tktoptionsraw @anchor{shishi_ap_set_tktoptionsraw} @deftypefun {int} {shishi_ap_set_tktoptionsraw} (Shishi_ap * @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, int32_t @var{cksumtype}, const char * @var{data}, size_t @var{len}) @var{ap}: structure that holds information about AP exchange @var{tkt}: ticket to set in AP. @var{options}: AP-REQ options to set in AP. @var{cksumtype}: authenticator checksum type to set in AP. @var{data}: input array with data to store in checksum field in Authenticator. @var{len}: length of input array with data to store in checksum field in Authenticator. Set the ticket (see @code{shishi_ap_tkt_set()}) and set the AP-REQ apoptions (see @code{shishi_apreq_options_set()}) and set the raw Authenticator checksum data. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_set_tktoptionsasn1usage @anchor{shishi_ap_set_tktoptionsasn1usage} @deftypefun {int} {shishi_ap_set_tktoptionsasn1usage} (Shishi_ap * @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, Shishi_asn1 @var{node}, const char * @var{field}, int @var{authenticatorcksumkeyusage}, int @var{authenticatorkeyusage}) @var{ap}: structure that holds information about AP exchange @var{tkt}: ticket to set in AP. @var{options}: AP-REQ options to set in AP. @var{node}: input ASN.1 structure to store as authenticator checksum data. @var{field}: field in ASN.1 structure to use. @var{authenticatorcksumkeyusage}: key usage for checksum in authenticator. @var{authenticatorkeyusage}: key usage for authenticator. Set ticket, options and authenticator checksum data using @code{shishi_ap_set_tktoptionsdata()}. The authenticator checksum data is the DER encoding of the ASN.1 field provided. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_tktoptions @anchor{shishi_ap_tktoptions} @deftypefun {int} {shishi_ap_tktoptions} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{tkt}: ticket to set in newly created AP. @var{options}: AP-REQ options to set in newly created AP. Create a new AP exchange using @code{shishi_ap()}, and set the ticket and AP-REQ apoptions using @code{shishi_ap_set_tktoptions()}. A random session key is added to the authenticator, using the same keytype as the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_tktoptionsdata @anchor{shishi_ap_tktoptionsdata} @deftypefun {int} {shishi_ap_tktoptionsdata} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, const char * @var{data}, size_t @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{tkt}: ticket to set in newly created AP. @var{options}: AP-REQ options to set in newly created AP. @var{data}: input array with data to checksum in Authenticator. @var{len}: length of input array with data to checksum in Authenticator. Create a new AP exchange using @code{shishi_ap()}, and set the ticket, AP-REQ apoptions and the Authenticator checksum data using @code{shishi_ap_set_tktoptionsdata()}. A random session key is added to the authenticator, using the same keytype as the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_tktoptionsraw @anchor{shishi_ap_tktoptionsraw} @deftypefun {int} {shishi_ap_tktoptionsraw} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, int32_t @var{cksumtype}, const char * @var{data}, size_t @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{tkt}: ticket to set in newly created AP. @var{options}: AP-REQ options to set in newly created AP. @var{cksumtype}: authenticator checksum type to set in AP. @var{data}: input array with data to store in checksum field in Authenticator. @var{len}: length of input array with data to store in checksum field in Authenticator. Create a new AP exchange using @code{shishi_ap()}, and set the ticket, AP-REQ apoptions and the raw Authenticator checksum data field using @code{shishi_ap_set_tktoptionsraw()}. A random session key is added to the authenticator, using the same keytype as the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_etype_tktoptionsdata @anchor{shishi_ap_etype_tktoptionsdata} @deftypefun {int} {shishi_ap_etype_tktoptionsdata} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, int32_t @var{etype}, Shishi_tkt * @var{tkt}, int @var{options}, const char * @var{data}, size_t @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{etype}: encryption type of newly generated random subkey. @var{tkt}: ticket to set in newly created AP. @var{options}: AP-REQ options to set in newly created AP. @var{data}: input array with data to checksum in Authenticator. @var{len}: length of input array with data to checksum in Authenticator. Create a new AP exchange using @code{shishi_ap()}, and set the ticket, AP-REQ apoptions and the Authenticator checksum data using @code{shishi_ap_set_tktoptionsdata()}. A random session key is added to the authenticator, using the same keytype as the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_tktoptionsasn1usage @anchor{shishi_ap_tktoptionsasn1usage} @deftypefun {int} {shishi_ap_tktoptionsasn1usage} (Shishi * @var{handle}, Shishi_ap ** @var{ap}, Shishi_tkt * @var{tkt}, int @var{options}, Shishi_asn1 @var{node}, const char * @var{field}, int @var{authenticatorcksumkeyusage}, int @var{authenticatorkeyusage}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ap}: pointer to new structure that holds information about AP exchange @var{tkt}: ticket to set in newly created AP. @var{options}: AP-REQ options to set in newly created AP. @var{node}: input ASN.1 structure to store as authenticator checksum data. @var{field}: field in ASN.1 structure to use. @var{authenticatorcksumkeyusage}: key usage for checksum in authenticator. @var{authenticatorkeyusage}: key usage for authenticator. Create a new AP exchange using @code{shishi_ap()}, and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using @code{shishi_ap_set_tktoptionsasn1usage()}. A random session key is added to the authenticator, using the same keytype as the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_tkt @anchor{shishi_ap_tkt} @deftypefun {Shishi_tkt *} {shishi_ap_tkt} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get Ticket from AP exchange. @strong{Return value:} Returns the ticket from the AP exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_ap_tkt_set @anchor{shishi_ap_tkt_set} @deftypefun {void} {shishi_ap_tkt_set} (Shishi_ap * @var{ap}, Shishi_tkt * @var{tkt}) @var{ap}: structure that holds information about AP exchange @var{tkt}: ticket to store in AP. Set the Ticket in the AP exchange. @end deftypefun @subheading shishi_ap_authenticator_cksumdata @anchor{shishi_ap_authenticator_cksumdata} @deftypefun {int} {shishi_ap_authenticator_cksumdata} (Shishi_ap * @var{ap}, char * @var{out}, size_t * @var{len}) @var{ap}: structure that holds information about AP exchange @var{out}: output array that holds authenticator checksum data. @var{len}: on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data. Get checksum data from Authenticator. @strong{Return value:} Returns @code{SHISHI_OK} if successful, or @code{SHISHI_TOO_SMALL_BUFFER} if buffer provided was too small (then @code{len} will hold necessary buffer size). @end deftypefun @subheading shishi_ap_authenticator_cksumdata_set @anchor{shishi_ap_authenticator_cksumdata_set} @deftypefun {void} {shishi_ap_authenticator_cksumdata_set} (Shishi_ap * @var{ap}, const char * @var{authenticatorcksumdata}, size_t @var{authenticatorcksumdatalen}) @var{ap}: structure that holds information about AP exchange @var{authenticatorcksumdata}: input array with data to compute checksum on and store in Authenticator in AP-REQ. @var{authenticatorcksumdatalen}: length of input array with data to compute checksum on and store in Authenticator in AP-REQ. Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set. @end deftypefun @subheading shishi_ap_authenticator_cksumraw_set @anchor{shishi_ap_authenticator_cksumraw_set} @deftypefun {void} {shishi_ap_authenticator_cksumraw_set} (Shishi_ap * @var{ap}, int32_t @var{authenticatorcksumtype}, const char * @var{authenticatorcksumraw}, size_t @var{authenticatorcksumrawlen}) @var{ap}: structure that holds information about AP exchange @var{authenticatorcksumtype}: authenticator checksum type to set in AP. @var{authenticatorcksumraw}: input array with authenticator checksum field value to set in Authenticator in AP-REQ. @var{authenticatorcksumrawlen}: length of input array with authenticator checksum field value to set in Authenticator in AP-REQ. Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set. @end deftypefun @subheading shishi_ap_authenticator_cksumtype @anchor{shishi_ap_authenticator_cksumtype} @deftypefun {int32_t} {shishi_ap_authenticator_cksumtype} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get the Authenticator Checksum Type in the AP exchange. @strong{Return value:} Return the authenticator checksum type. @end deftypefun @subheading shishi_ap_authenticator_cksumtype_set @anchor{shishi_ap_authenticator_cksumtype_set} @deftypefun {void} {shishi_ap_authenticator_cksumtype_set} (Shishi_ap * @var{ap}, int32_t @var{cksumtype}) @var{ap}: structure that holds information about AP exchange @var{cksumtype}: authenticator checksum type to set in AP. Set the Authenticator Checksum Type in the AP exchange. @end deftypefun @subheading shishi_ap_authenticator @anchor{shishi_ap_authenticator} @deftypefun {Shishi_asn1} {shishi_ap_authenticator} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get ASN.1 Authenticator structure from AP exchange. @strong{Return value:} Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_ap_authenticator_set @anchor{shishi_ap_authenticator_set} @deftypefun {void} {shishi_ap_authenticator_set} (Shishi_ap * @var{ap}, Shishi_asn1 @var{authenticator}) @var{ap}: structure that holds information about AP exchange @var{authenticator}: authenticator to store in AP. Set the Authenticator in the AP exchange. @end deftypefun @subheading shishi_ap_req @anchor{shishi_ap_req} @deftypefun {Shishi_asn1} {shishi_ap_req} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get ASN.1 AP-REQ structure from AP exchange. @strong{Return value:} Returns the AP-REQ from the AP exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_ap_req_set @anchor{shishi_ap_req_set} @deftypefun {void} {shishi_ap_req_set} (Shishi_ap * @var{ap}, Shishi_asn1 @var{apreq}) @var{ap}: structure that holds information about AP exchange @var{apreq}: apreq to store in AP. Set the AP-REQ in the AP exchange. @end deftypefun @subheading shishi_ap_req_der @anchor{shishi_ap_req_der} @deftypefun {int} {shishi_ap_req_der} (Shishi_ap * @var{ap}, char ** @var{out}, size_t * @var{outlen}) @var{ap}: structure that holds information about AP exchange @var{out}: pointer to output array with der encoding of AP-REQ. @var{outlen}: pointer to length of output array with der encoding of AP-REQ. Build AP-REQ using @code{shishi_ap_req_build()} and DER encode it. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_req_der_set @anchor{shishi_ap_req_der_set} @deftypefun {int} {shishi_ap_req_der_set} (Shishi_ap * @var{ap}, char * @var{der}, size_t @var{derlen}) @var{ap}: structure that holds information about AP exchange @var{der}: input array with DER encoded AP-REQ. @var{derlen}: length of input array with DER encoded AP-REQ. DER decode AP-REQ and set it AP exchange. If decoding fails, the AP-REQ in the AP exchange is lost. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_ap_req_build @anchor{shishi_ap_req_build} @deftypefun {int} {shishi_ap_req_build} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Checksum data in authenticator and add ticket and authenticator to AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_req_decode @anchor{shishi_ap_req_decode} @deftypefun {int} {shishi_ap_req_decode} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Decode ticket in AP-REQ and set the Ticket fields in the AP exchange. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_req_process_keyusage @anchor{shishi_ap_req_process_keyusage} @deftypefun {int} {shishi_ap_req_process_keyusage} (Shishi_ap * @var{ap}, Shishi_key * @var{key}, int32_t @var{keyusage}) @var{ap}: structure that holds information about AP exchange @var{key}: cryptographic key used to decrypt ticket in AP-REQ. @var{keyusage}: key usage to use during decryption, for normal AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP-REQ's part of TGS-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR. Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_req_process @anchor{shishi_ap_req_process} @deftypefun {int} {shishi_ap_req_process} (Shishi_ap * @var{ap}, Shishi_key * @var{key}) @var{ap}: structure that holds information about AP exchange @var{key}: cryptographic key used to decrypt ticket in AP-REQ. Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_req_asn1 @anchor{shishi_ap_req_asn1} @deftypefun {int} {shishi_ap_req_asn1} (Shishi_ap * @var{ap}, Shishi_asn1 * @var{apreq}) @var{ap}: structure that holds information about AP exchange @var{apreq}: output AP-REQ variable. Build AP-REQ using @code{shishi_ap_req_build()} and return it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_key @anchor{shishi_ap_key} @deftypefun {Shishi_key *} {shishi_ap_key} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used. @strong{Return value:} Return application key from AP. @end deftypefun @subheading shishi_ap_rep @anchor{shishi_ap_rep} @deftypefun {Shishi_asn1} {shishi_ap_rep} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get ASN.1 AP-REP structure from AP exchange. @strong{Return value:} Returns the AP-REP from the AP exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_ap_rep_set @anchor{shishi_ap_rep_set} @deftypefun {void} {shishi_ap_rep_set} (Shishi_ap * @var{ap}, Shishi_asn1 @var{aprep}) @var{ap}: structure that holds information about AP exchange @var{aprep}: aprep to store in AP. Set the AP-REP in the AP exchange. @end deftypefun @subheading shishi_ap_rep_der @anchor{shishi_ap_rep_der} @deftypefun {int} {shishi_ap_rep_der} (Shishi_ap * @var{ap}, char ** @var{out}, size_t * @var{outlen}) @var{ap}: structure that holds information about AP exchange @var{out}: output array with newly allocated DER encoding of AP-REP. @var{outlen}: length of output array with DER encoding of AP-REP. Build AP-REP using @code{shishi_ap_rep_build()} and DER encode it. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_rep_der_set @anchor{shishi_ap_rep_der_set} @deftypefun {int} {shishi_ap_rep_der_set} (Shishi_ap * @var{ap}, char * @var{der}, size_t @var{derlen}) @var{ap}: structure that holds information about AP exchange @var{der}: input array with DER encoded AP-REP. @var{derlen}: length of input array with DER encoded AP-REP. DER decode AP-REP and set it AP exchange. If decoding fails, the AP-REP in the AP exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_ap_rep_build @anchor{shishi_ap_rep_build} @deftypefun {int} {shishi_ap_rep_build} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Checksum data in authenticator and add ticket and authenticator to AP-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_rep_asn1 @anchor{shishi_ap_rep_asn1} @deftypefun {int} {shishi_ap_rep_asn1} (Shishi_ap * @var{ap}, Shishi_asn1 * @var{aprep}) @var{ap}: structure that holds information about AP exchange @var{aprep}: output AP-REP variable. Build AP-REP using @code{shishi_ap_rep_build()} and return it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ap_rep_verify @anchor{shishi_ap_rep_verify} @deftypefun {int} {shishi_ap_rep_verify} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Verify AP-REP compared to Authenticator. @strong{Return value:} Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. @end deftypefun @subheading shishi_ap_rep_verify_der @anchor{shishi_ap_rep_verify_der} @deftypefun {int} {shishi_ap_rep_verify_der} (Shishi_ap * @var{ap}, char * @var{der}, size_t @var{derlen}) @var{ap}: structure that holds information about AP exchange @var{der}: input array with DER encoded AP-REP. @var{derlen}: length of input array with DER encoded AP-REP. DER decode AP-REP and set it in AP exchange using @code{shishi_ap_rep_der_set()} and verify it using @code{shishi_ap_rep_verify()}. @strong{Return value:} Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. @end deftypefun @subheading shishi_ap_rep_verify_asn1 @anchor{shishi_ap_rep_verify_asn1} @deftypefun {int} {shishi_ap_rep_verify_asn1} (Shishi_ap * @var{ap}, Shishi_asn1 @var{aprep}) @var{ap}: structure that holds information about AP exchange @var{aprep}: input AP-REP. Set the AP-REP in the AP exchange using @code{shishi_ap_rep_set()} and verify it using @code{shishi_ap_rep_verify()}. @strong{Return value:} Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. @end deftypefun @subheading shishi_ap_encapreppart @anchor{shishi_ap_encapreppart} @deftypefun {Shishi_asn1} {shishi_ap_encapreppart} (Shishi_ap * @var{ap}) @var{ap}: structure that holds information about AP exchange Get ASN.1 EncAPRepPart structure from AP exchange. @strong{Return value:} Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_ap_encapreppart_set @anchor{shishi_ap_encapreppart_set} @deftypefun {void} {shishi_ap_encapreppart_set} (Shishi_ap * @var{ap}, Shishi_asn1 @var{encapreppart}) @var{ap}: structure that holds information about AP exchange @var{encapreppart}: EncAPRepPart to store in AP. Set the EncAPRepPart in the AP exchange. @end deftypefun @subheading shishi_ap_option2string @anchor{shishi_ap_option2string} @deftypefun {const char *} {shishi_ap_option2string} (Shishi_apoptions @var{option}) @var{option}: enumerated AP-Option type, see Shishi_apoptions. Convert AP-Option type to AP-Option name string. Note that @code{option} must be just one of the AP-Option types, it cannot be an binary ORed indicating several AP-Options. @strong{Return value:} Returns static string with name of AP-Option that must not be deallocated, or "unknown" if AP-Option was not understood. @end deftypefun @subheading shishi_ap_string2option @anchor{shishi_ap_string2option} @deftypefun {Shishi_apoptions} {shishi_ap_string2option} (const char * @var{str}) @var{str}: zero terminated character array with name of AP-Option, e.g. "use-session-key". Convert AP-Option name to AP-Option type. @strong{Return value:} Returns enumerated type member corresponding to AP-Option, or 0 if string was not understood. @end deftypefun shishi-1.0.2/doc/texi/password.c.texi0000644000000000000000000000413212126773202014366 00000000000000@subheading shishi_prompt_password_callback_set @anchor{shishi_prompt_password_callback_set} @deftypefun {void} {shishi_prompt_password_callback_set} (Shishi * @var{handle}, shishi_prompt_password_func @var{cb}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{cb}: function pointer to application password callback, a @code{shishi_prompt_password_func} type. Set a callback function that will be used by @code{shishi_prompt_password()} to query the user for a password. The function pointer can be retrieved using @code{shishi_prompt_password_callback_get()}. The @code{cb} function should follow the @code{shishi_prompt_password_func} prototype: int prompt_password (Shishi * @code{handle}, char **@code{s}, const char *@code{format}, va_list @code{ap}); If the function returns 0, the @code{s} variable should contain a newly allocated string with the password read from the user. @end deftypefun @subheading shishi_prompt_password_callback_get @anchor{shishi_prompt_password_callback_get} @deftypefun {shishi_prompt_password_func} {shishi_prompt_password_callback_get} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Get the application password prompt function callback as set by @code{shishi_prompt_password_callback_set()}. @strong{Returns:} Returns the callback, a @code{shishi_prompt_password_func} type, or @code{NULL}. @end deftypefun @subheading shishi_prompt_password @anchor{shishi_prompt_password} @deftypefun {int} {shishi_prompt_password} (Shishi * @var{handle}, char ** @var{s}, const char * @var{format}, @var{...}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{s}: pointer to newly allocated output string with read password. @var{format}: printf(3) style format string. @...: printf(3) style arguments. Format and print a prompt, and read a password from user. The password is possibly converted (e.g., converted from Latin-1 to UTF-8, or processed using Stringprep profile) following any "stringprocess" keywords in configuration files. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/starttls.c.texi0000644000000000000000000000000012126773203014373 00000000000000shishi-1.0.2/doc/texi/hostkeys.c.texi0000644000000000000000000000703612126773202014403 00000000000000@subheading shishi_hostkeys_default_file @anchor{shishi_hostkeys_default_file} @deftypefun {const char *} {shishi_hostkeys_default_file} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get file name of default host key file. @strong{Return value:} Returns the default host key filename used in the library. (Not a copy of it, so don't modify or deallocate it.) @end deftypefun @subheading shishi_hostkeys_default_file_set @anchor{shishi_hostkeys_default_file_set} @deftypefun {void} {shishi_hostkeys_default_file_set} (Shishi * @var{handle}, const char * @var{hostkeysfile}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{hostkeysfile}: string with new default hostkeys file name, or NULL to reset to default. Set the default host key filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_hostkeys_for_server @anchor{shishi_hostkeys_for_server} @deftypefun {Shishi_key *} {shishi_hostkeys_for_server} (Shishi * @var{handle}, const char * @var{server}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{server}: server name to get key for Get host key for @code{server}. @strong{Return value:} Returns the key for specific server, read from the default host keys file (see @code{shishi_hostkeys_default_file()}), or NULL if no key could be found or an error encountered. @end deftypefun @subheading shishi_hostkeys_for_serverrealm @anchor{shishi_hostkeys_for_serverrealm} @deftypefun {Shishi_key *} {shishi_hostkeys_for_serverrealm} (Shishi * @var{handle}, const char * @var{server}, const char * @var{realm}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{server}: server name to get key for @var{realm}: realm of server to get key for. Get host key for @code{server} in @code{realm}. @strong{Return value:} Returns the key for specific server and realm, read from the default host keys file (see @code{shishi_hostkeys_default_file()}), or NULL if no key could be found or an error encountered. @end deftypefun @subheading shishi_hostkeys_for_localservicerealm @anchor{shishi_hostkeys_for_localservicerealm} @deftypefun {Shishi_key *} {shishi_hostkeys_for_localservicerealm} (Shishi * @var{handle}, const char * @var{service}, const char * @var{realm}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{service}: service to get key for. @var{realm}: realm of server to get key for, or NULL for default realm. Get host key for @code{service} on current host in @code{realm}. @strong{Return value:} Returns the key for the server "SERVICE/HOSTNAME@code{REALM}" (where HOSTNAME is the current system's hostname), read from the default host keys file (see @code{shishi_hostkeys_default_file()}), or NULL if no key could be found or an error encountered. @end deftypefun @subheading shishi_hostkeys_for_localservice @anchor{shishi_hostkeys_for_localservice} @deftypefun {Shishi_key *} {shishi_hostkeys_for_localservice} (Shishi * @var{handle}, const char * @var{service}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{service}: service to get key for. Get host key for @code{service} on current host in default realm. @strong{Return value:} Returns the key for the server "SERVICE/HOSTNAME" (where HOSTNAME is the current system's hostname), read from the default host keys file (see @code{shishi_hostkeys_default_file()}), or NULL if no key could be found or an error encountered. @end deftypefun shishi-1.0.2/doc/texi/asn1.c.texi0000644000000000000000000006251212126773202013374 00000000000000@subheading shishi_asn1_read_inline @anchor{shishi_asn1_read_inline} @deftypefun {int} {shishi_asn1_read_inline} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, char * @var{data}, size_t * @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 variable to read field from. @var{field}: name of field in @code{node} to read. @var{data}: pre-allocated output buffer that will hold ASN.1 field data. @var{datalen}: on input, maximum size of output buffer, on output, actual size of output buffer. Extract data stored in a ASN.1 field into a fixed size buffer allocated by caller. Note that since it is difficult to predict the length of the field, it is often better to use @code{shishi_asn1_read()} instead. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. @end deftypefun @subheading shishi_asn1_read @anchor{shishi_asn1_read} @deftypefun {int} {shishi_asn1_read} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, char ** @var{data}, size_t * @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 variable to read field from. @var{field}: name of field in @code{node} to read. @var{data}: newly allocated output buffer that will hold ASN.1 field data. @var{datalen}: actual size of output buffer. Extract data stored in a ASN.1 field into a newly allocated buffer. The buffer will always be zero terminated, even though @code{datalen} will not include the added zero. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. @end deftypefun @subheading shishi_asn1_read_optional @anchor{shishi_asn1_read_optional} @deftypefun {int} {shishi_asn1_read_optional} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, char ** @var{data}, size_t * @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 variable to read field from. @var{field}: name of field in @code{node} to read. @var{data}: newly allocated output buffer that will hold ASN.1 field data. @var{datalen}: actual size of output buffer. Extract data stored in a ASN.1 field into a newly allocated buffer. If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this function set datalen to 0 and succeeds. Can be useful to read ASN.1 fields which are marked OPTIONAL in the grammar, if you want to avoid special error handling in your code. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise. @end deftypefun @subheading shishi_asn1_done @anchor{shishi_asn1_done} @deftypefun {void} {shishi_asn1_done} (Shishi * @var{handle}, Shishi_asn1 @var{node}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 node to dellocate. Deallocate resources associated with ASN.1 structure. Note that the node must not be used after this call. @end deftypefun @subheading shishi_asn1_pa_enc_ts_enc @anchor{shishi_asn1_pa_enc_ts_enc} @deftypefun {Shishi_asn1} {shishi_asn1_pa_enc_ts_enc} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for PA-ENC-TS-ENC. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_encrypteddata @anchor{shishi_asn1_encrypteddata} @deftypefun {Shishi_asn1} {shishi_asn1_encrypteddata} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for EncryptedData @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_padata @anchor{shishi_asn1_padata} @deftypefun {Shishi_asn1} {shishi_asn1_padata} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for PA-DATA. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_methoddata @anchor{shishi_asn1_methoddata} @deftypefun {Shishi_asn1} {shishi_asn1_methoddata} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for METHOD-DATA. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_etype_info @anchor{shishi_asn1_etype_info} @deftypefun {Shishi_asn1} {shishi_asn1_etype_info} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for ETYPE-INFO. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_etype_info2 @anchor{shishi_asn1_etype_info2} @deftypefun {Shishi_asn1} {shishi_asn1_etype_info2} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for ETYPE-INFO2. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_asreq @anchor{shishi_asn1_asreq} @deftypefun {Shishi_asn1} {shishi_asn1_asreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for AS-REQ. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_asrep @anchor{shishi_asn1_asrep} @deftypefun {Shishi_asn1} {shishi_asn1_asrep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for AS-REP. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_tgsreq @anchor{shishi_asn1_tgsreq} @deftypefun {Shishi_asn1} {shishi_asn1_tgsreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for TGS-REQ. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_tgsrep @anchor{shishi_asn1_tgsrep} @deftypefun {Shishi_asn1} {shishi_asn1_tgsrep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for TGS-REP. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_apreq @anchor{shishi_asn1_apreq} @deftypefun {Shishi_asn1} {shishi_asn1_apreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for AP-REQ. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_aprep @anchor{shishi_asn1_aprep} @deftypefun {Shishi_asn1} {shishi_asn1_aprep} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for AP-REP. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_encapreppart @anchor{shishi_asn1_encapreppart} @deftypefun {Shishi_asn1} {shishi_asn1_encapreppart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for AP-REP. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_ticket @anchor{shishi_asn1_ticket} @deftypefun {Shishi_asn1} {shishi_asn1_ticket} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for Ticket. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_encticketpart @anchor{shishi_asn1_encticketpart} @deftypefun {Shishi_asn1} {shishi_asn1_encticketpart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for EncTicketPart. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_authenticator @anchor{shishi_asn1_authenticator} @deftypefun {Shishi_asn1} {shishi_asn1_authenticator} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for Authenticator. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_enckdcreppart @anchor{shishi_asn1_enckdcreppart} @deftypefun {Shishi_asn1} {shishi_asn1_enckdcreppart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for EncKDCRepPart. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_encasreppart @anchor{shishi_asn1_encasreppart} @deftypefun {Shishi_asn1} {shishi_asn1_encasreppart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for EncASRepPart. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_krberror @anchor{shishi_asn1_krberror} @deftypefun {Shishi_asn1} {shishi_asn1_krberror} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for KRB-ERROR. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_krbsafe @anchor{shishi_asn1_krbsafe} @deftypefun {Shishi_asn1} {shishi_asn1_krbsafe} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for KRB-SAFE. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_priv @anchor{shishi_asn1_priv} @deftypefun {Shishi_asn1} {shishi_asn1_priv} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for KRB-PRIV. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_encprivpart @anchor{shishi_asn1_encprivpart} @deftypefun {Shishi_asn1} {shishi_asn1_encprivpart} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Create new ASN.1 structure for EncKrbPrivPart. @strong{Return value:} Returns ASN.1 structure. @end deftypefun @subheading shishi_asn1_to_der_field @anchor{shishi_asn1_to_der_field} @deftypefun {int} {shishi_asn1_to_der_field} (Shishi * @var{handle}, Shishi_asn1 @var{node}, const char * @var{field}, char ** @var{der}, size_t * @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 data that have field to extract. @var{field}: name of field in @code{node} to extract. @var{der}: output array that holds DER encoding of @code{field} in @code{node}. @var{len}: output variable with length of @code{der} output array. Extract newly allocated DER representation of specified ASN.1 field. @strong{Return value:} Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values). @end deftypefun @subheading shishi_asn1_to_der @anchor{shishi_asn1_to_der} @deftypefun {int} {shishi_asn1_to_der} (Shishi * @var{handle}, Shishi_asn1 @var{node}, char ** @var{der}, size_t * @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 data to convert to DER. @var{der}: output array that holds DER encoding of @code{node}. @var{len}: output variable with length of @code{der} output array. Extract newly allocated DER representation of specified ASN.1 data. @strong{Return value:} Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values). @end deftypefun @subheading shishi_asn1_msgtype @anchor{shishi_asn1_msgtype} @deftypefun {Shishi_msgtype} {shishi_asn1_msgtype} (Shishi * @var{handle}, Shishi_asn1 @var{node}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 type to get msg type for. Determine msg-type of ASN.1 type of a packet. Currently this uses the msg-type field instead of the APPLICATION tag, but this may be changed in the future. @strong{Return value:} Returns msg-type of ASN.1 type, 0 on failure. @end deftypefun @subheading shishi_der_msgtype @anchor{shishi_der_msgtype} @deftypefun {Shishi_msgtype} {shishi_der_msgtype} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Determine msg-type of DER coded data of a packet. @strong{Return value:} Returns msg-type of DER data, 0 on failure. @end deftypefun @subheading shishi_der2asn1 @anchor{shishi_der2asn1} @deftypefun {Shishi_asn1} {shishi_der2asn1} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Convert arbitrary DER data of a packet to a ASN.1 type. @strong{Return value:} Returns newly allocate ASN.1 corresponding to DER data, or @code{NULL} on failure. @end deftypefun @subheading shishi_der2asn1_padata @anchor{shishi_der2asn1_padata} @deftypefun {Shishi_asn1} {shishi_der2asn1_padata} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of PA-DATA and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_methoddata @anchor{shishi_der2asn1_methoddata} @deftypefun {Shishi_asn1} {shishi_der2asn1_methoddata} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of METHOD-DATA and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_etype_info @anchor{shishi_der2asn1_etype_info} @deftypefun {Shishi_asn1} {shishi_der2asn1_etype_info} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of ETYPE-INFO and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_etype_info2 @anchor{shishi_der2asn1_etype_info2} @deftypefun {Shishi_asn1} {shishi_der2asn1_etype_info2} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of ETYPE-INFO2 and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_ticket @anchor{shishi_der2asn1_ticket} @deftypefun {Shishi_asn1} {shishi_der2asn1_ticket} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of Ticket and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_encticketpart @anchor{shishi_der2asn1_encticketpart} @deftypefun {Shishi_asn1} {shishi_der2asn1_encticketpart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncTicketPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_asreq @anchor{shishi_der2asn1_asreq} @deftypefun {Shishi_asn1} {shishi_der2asn1_asreq} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of AS-REQ and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_tgsreq @anchor{shishi_der2asn1_tgsreq} @deftypefun {Shishi_asn1} {shishi_der2asn1_tgsreq} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of TGS-REQ and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_asrep @anchor{shishi_der2asn1_asrep} @deftypefun {Shishi_asn1} {shishi_der2asn1_asrep} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of AS-REP and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_tgsrep @anchor{shishi_der2asn1_tgsrep} @deftypefun {Shishi_asn1} {shishi_der2asn1_tgsrep} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of TGS-REP and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_kdcrep @anchor{shishi_der2asn1_kdcrep} @deftypefun {Shishi_asn1} {shishi_der2asn1_kdcrep} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of KDC-REP and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_encasreppart @anchor{shishi_der2asn1_encasreppart} @deftypefun {Shishi_asn1} {shishi_der2asn1_encasreppart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncASRepPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_enctgsreppart @anchor{shishi_der2asn1_enctgsreppart} @deftypefun {Shishi_asn1} {shishi_der2asn1_enctgsreppart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncTGSRepPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_enckdcreppart @anchor{shishi_der2asn1_enckdcreppart} @deftypefun {Shishi_asn1} {shishi_der2asn1_enckdcreppart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncKDCRepPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_authenticator @anchor{shishi_der2asn1_authenticator} @deftypefun {Shishi_asn1} {shishi_der2asn1_authenticator} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of Authenticator and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_krberror @anchor{shishi_der2asn1_krberror} @deftypefun {Shishi_asn1} {shishi_der2asn1_krberror} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of KRB-ERROR and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_krbsafe @anchor{shishi_der2asn1_krbsafe} @deftypefun {Shishi_asn1} {shishi_der2asn1_krbsafe} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of KRB-SAFE and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_priv @anchor{shishi_der2asn1_priv} @deftypefun {Shishi_asn1} {shishi_der2asn1_priv} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of KRB-PRIV and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_encprivpart @anchor{shishi_der2asn1_encprivpart} @deftypefun {Shishi_asn1} {shishi_der2asn1_encprivpart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_apreq @anchor{shishi_der2asn1_apreq} @deftypefun {Shishi_asn1} {shishi_der2asn1_apreq} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of AP-REQ and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_aprep @anchor{shishi_der2asn1_aprep} @deftypefun {Shishi_asn1} {shishi_der2asn1_aprep} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of AP-REP and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_encapreppart @anchor{shishi_der2asn1_encapreppart} @deftypefun {Shishi_asn1} {shishi_der2asn1_encapreppart} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of EncAPRepPart and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_der2asn1_kdcreq @anchor{shishi_der2asn1_kdcreq} @deftypefun {Shishi_asn1} {shishi_der2asn1_kdcreq} (Shishi * @var{handle}, const char * @var{der}, size_t @var{derlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{der}: input character array with DER encoding. @var{derlen}: length of input character array with DER encoding. Decode DER encoding of AS-REQ, TGS-REQ or KDC-REQ and create a ASN.1 structure. @strong{Return value:} Returns ASN.1 structure corresponding to DER data. @end deftypefun @subheading shishi_asn1_print @anchor{shishi_asn1_print} @deftypefun {void} {shishi_asn1_print} (Shishi * @var{handle}, Shishi_asn1 @var{node}, FILE * @var{fh}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{node}: ASN.1 data that have field to extract. @var{fh}: file descriptor to print to, e.g. stdout. Print ASN.1 structure in human readable form, typically for debugging purposes. @end deftypefun shishi-1.0.2/doc/texi/pki.c.texi0000644000000000000000000001160212126773202013307 00000000000000@subheading shishi_x509ca_default_file_guess @anchor{shishi_x509ca_default_file_guess} @deftypefun {char *} {shishi_x509ca_default_file_guess} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Guesses the default X.509 CA certificate filename; it is $HOME/.shishi/client.ca. @strong{Return value:} Returns default X.509 client certificate filename as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_x509ca_default_file_set @anchor{shishi_x509ca_default_file_set} @deftypefun {void} {shishi_x509ca_default_file_set} (Shishi * @var{handle}, const char * @var{x509cafile}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{x509cafile}: string with new default x509 client certificate file name, or NULL to reset to default. Set the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_x509ca_default_file @anchor{shishi_x509ca_default_file} @deftypefun {const char *} {shishi_x509ca_default_file} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename for default X.509 CA certificate. @strong{Return value:} Returns the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is not a copy, so don't modify or deallocate it. @end deftypefun @subheading shishi_x509cert_default_file_guess @anchor{shishi_x509cert_default_file_guess} @deftypefun {char *} {shishi_x509cert_default_file_guess} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Guesses the default X.509 client certificate filename; it is $HOME/.shishi/client.certs. @strong{Return value:} Returns default X.509 client certificate filename as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_x509cert_default_file_set @anchor{shishi_x509cert_default_file_set} @deftypefun {void} {shishi_x509cert_default_file_set} (Shishi * @var{handle}, const char * @var{x509certfile}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{x509certfile}: string with new default x509 client certificate file name, or NULL to reset to default. Set the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_x509cert_default_file @anchor{shishi_x509cert_default_file} @deftypefun {const char *} {shishi_x509cert_default_file} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename for default X.509 certificate. @strong{Return value:} Returns the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it. @end deftypefun @subheading shishi_x509key_default_file_guess @anchor{shishi_x509key_default_file_guess} @deftypefun {char *} {shishi_x509key_default_file_guess} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Guesses the default X.509 client key filename; it is $HOME/.shishi/client.key. @strong{Return value:} Returns default X.509 client key filename as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_x509key_default_file_set @anchor{shishi_x509key_default_file_set} @deftypefun {void} {shishi_x509key_default_file_set} (Shishi * @var{handle}, const char * @var{x509keyfile}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{x509keyfile}: string with new default x509 client key file name, or NULL to reset to default. Set the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_x509key_default_file @anchor{shishi_x509key_default_file} @deftypefun {const char *} {shishi_x509key_default_file} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename for default X.509 key. @strong{Return value:} Returns the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it. @end deftypefun shishi-1.0.2/doc/texi/error.c.texi0000644000000000000000000001061112126773202013654 00000000000000@subheading shishi_strerror @anchor{shishi_strerror} @deftypefun {const char *} {shishi_strerror} (int @var{err}) @var{err}: shishi error code. Convert return code to human readable string. @strong{Return value:} Returns a pointer to a statically allocated string containing a description of the error with the error value @code{err}. This string can be used to output a diagnostic message to the user. @end deftypefun @subheading shishi_error @anchor{shishi_error} @deftypefun {const char *} {shishi_error} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Extract detailed error information string. Note that the memory is managed by the Shishi library, so you must not deallocate the string. @strong{Return value:} Returns pointer to error information string, that must not be deallocate by caller. @end deftypefun @subheading shishi_error_clear @anchor{shishi_error_clear} @deftypefun {void} {shishi_error_clear} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Clear the detailed error information string. See @code{shishi_error()} for how to access the error string, and @code{shishi_error_set()} and @code{shishi_error_printf()} for how to set the error string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. @end deftypefun @subheading shishi_error_set @anchor{shishi_error_set} @deftypefun {void} {shishi_error_set} (Shishi * @var{handle}, const char * @var{errstr}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{errstr}: Zero terminated character array containing error description, or NULL to clear the error description string. Set the detailed error information string to specified string. The string is copied into the Shishi internal structure, so you can deallocate the string passed to this function after the call. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. @end deftypefun @subheading shishi_error_printf @anchor{shishi_error_printf} @deftypefun {void} {shishi_error_printf} (Shishi * @var{handle}, const char * @var{format}, @var{...}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{format}: printf style format string. @...: print style arguments. Set the detailed error information string to a printf formatted string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure. @end deftypefun @subheading shishi_error_outputtype @anchor{shishi_error_outputtype} @deftypefun {int} {shishi_error_outputtype} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Get the current output type for logging messages. @strong{Return value:} Return output type (NULL, stderr or syslog) for informational and warning messages. @end deftypefun @subheading shishi_error_set_outputtype @anchor{shishi_error_set_outputtype} @deftypefun {void} {shishi_error_set_outputtype} (Shishi * @var{handle}, int @var{type}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{type}: output type. Set output type (NULL, stderr or syslog) for informational and warning messages. @end deftypefun @subheading shishi_info @anchor{shishi_info} @deftypefun {void} {shishi_info} (Shishi * @var{handle}, const char * @var{format}, @var{...}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{format}: printf style format string. @...: print style arguments. Print informational message to output as defined in handle. @end deftypefun @subheading shishi_warn @anchor{shishi_warn} @deftypefun {void} {shishi_warn} (Shishi * @var{handle}, const char * @var{format}, @var{...}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{format}: printf style format string. @...: print style arguments. Print a warning to output as defined in handle. @end deftypefun @subheading shishi_verbose @anchor{shishi_verbose} @deftypefun {void} {shishi_verbose} (Shishi * @var{handle}, const char * @var{format}, @var{...}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{format}: printf style format string. @...: print style arguments. Print a diagnostic message to output as defined in handle. @end deftypefun shishi-1.0.2/doc/texi/tktccache.c.texi0000644000000000000000000001210112126773203014451 00000000000000@subheading shishi_tkts_default_ccache_guess @anchor{shishi_tkts_default_ccache_guess} @deftypefun {char *} {shishi_tkts_default_ccache_guess} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Guesses the default ccache ticket filename; it is the contents of the environment variable KRB5CCNAME or /tmp/krb5cc_UID where UID is the user's identity in decimal, as returned by @code{getuid()}. @strong{Return value:} Returns default ccache filename as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_tkts_default_ccache @anchor{shishi_tkts_default_ccache} @deftypefun {const char *} {shishi_tkts_default_ccache} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename of default ccache filename. @strong{Return value:} Returns the default ccache filename used in the library. The string is not a copy, so don't modify or deallocate it. @end deftypefun @subheading shishi_tkts_default_ccache_set @anchor{shishi_tkts_default_ccache_set} @deftypefun {void} {shishi_tkts_default_ccache_set} (Shishi * @var{handle}, const char * @var{ccache}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{ccache}: string with new default ccache filename, or NULL to reset to default. Set the default ccache filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_tkts_add_ccache_mem @anchor{shishi_tkts_add_ccache_mem} @deftypefun {int} {shishi_tkts_add_ccache_mem} (Shishi * @var{handle}, const char * @var{data}, size_t @var{len}, Shishi_tkts * @var{tkts}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{data}: constant memory buffer with ccache of @code{len} size. @var{len}: size of memory buffer with ccache data. @var{tkts}: allocated key set to store tickets in. Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. @strong{Returns:} Returns @code{SHISHI_CCACHE_ERROR} if the data does not represent a valid ccache structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_tkts_add_ccache_file @anchor{shishi_tkts_add_ccache_file} @deftypefun {int} {shishi_tkts_add_ccache_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_tkts * @var{tkts}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: name of file to read. @var{tkts}: allocated ticket set to store tickets in. Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. @strong{Returns:} Returns @code{SHISHI_IO_ERROR} if the file cannot be read, @code{SHISHI_CCACHE_ERROR} if the data cannot be parsed as a valid ccache structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_tkts_from_ccache_mem @anchor{shishi_tkts_from_ccache_mem} @deftypefun {int} {shishi_tkts_from_ccache_mem} (Shishi * @var{handle}, const char * @var{data}, size_t @var{len}, Shishi_tkts ** @var{outtkts}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{data}: constant memory buffer with ccache of @code{len} size. @var{len}: size of memory buffer with ccache data. @var{outtkts}: pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. @strong{Returns:} Returns @code{SHISHI_CCACHE_ERROR} if the data does not represent a valid ccache structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_tkts_from_ccache_file @anchor{shishi_tkts_from_ccache_file} @deftypefun {int} {shishi_tkts_from_ccache_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_tkts ** @var{outtkts}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: name of file to read. @var{outtkts}: pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. Read tickets from a ccache data structure, and add them to the ticket set. The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format. @strong{Returns:} Returns @code{SHISHI_IO_ERROR} if the file cannot be read, @code{SHISHI_CCACHE_ERROR} if the data cannot be parsed as a valid ccache structure, and @code{SHISHI_OK} on success. @end deftypefun shishi-1.0.2/doc/texi/fileutil.c.texi0000644000000000000000000000000012126773203014330 00000000000000shishi-1.0.2/doc/texi/realm.c.texi0000644000000000000000000000742012126773203013630 00000000000000@subheading shishi_realm_default_guess @anchor{shishi_realm_default_guess} @deftypefun {char *} {shishi_realm_default_guess} ( @var{void}) Guesses a realm based on @code{getdomainname()} (which really is NIS/YP domain, but if it is set it might be a good guess), or if it fails, based on @code{gethostname()}, or if it fails, the string "could-not-guess-default-realm". Note that the hostname is not trimmed off of the data returned by @code{gethostname()} to get the domain name and use that as the realm. @strong{Return value:} Returns guessed realm for host as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_realm_default @anchor{shishi_realm_default} @deftypefun {const char *} {shishi_realm_default} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get name of default realm. @strong{Return value:} Returns the default realm used in the library. (Not a copy of it, so don't modify or deallocate it.) @end deftypefun @subheading shishi_realm_default_set @anchor{shishi_realm_default_set} @deftypefun {void} {shishi_realm_default_set} (Shishi * @var{handle}, const char * @var{realm}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{realm}: string with new default realm name, or NULL to reset to default. Set the default realm used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_realm_for_server_file @anchor{shishi_realm_for_server_file} @deftypefun {char *} {shishi_realm_for_server_file} (Shishi * @var{handle}, char * @var{server}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{server}: hostname to find realm for. Find realm for a host using configuration file. @strong{Return value:} Returns realm for host, or NULL if not found. @end deftypefun @subheading shishi_realm_for_server_dns @anchor{shishi_realm_for_server_dns} @deftypefun {char *} {shishi_realm_for_server_dns} (Shishi * @var{handle}, char * @var{server}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{server}: hostname to find realm for. Find realm for a host using DNS lookups, according to draft-ietf-krb-wg-krb-dns-locate-03.txt. Since DNS lookups may be spoofed, relying on the realm information may result in a redirection attack. In a single-realm scenario, this only achieves a denial of service, but with cross-realm trust it may redirect you to a compromised realm. For this reason, Shishi prints a warning, suggesting that the user should add the proper 'server-realm' configuration tokens instead. To illustrate the DNS information used, here is an extract from a zone file for the domain ASDF.COM: _kerberos.asdf.com. IN TXT "ASDF.COM" _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM" Let us suppose that in this case, a client wishes to use a service on the host foo.asdf.com. It would first query: _kerberos.foo.asdf.com. IN TXT Finding no match, it would then query: _kerberos.asdf.com. IN TXT @strong{Return value:} Returns realm for host, or NULL if not found. @end deftypefun @subheading shishi_realm_for_server @anchor{shishi_realm_for_server} @deftypefun {char *} {shishi_realm_for_server} (Shishi * @var{handle}, char * @var{server}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{server}: hostname to find realm for. Find realm for a host, using various methods. Currently this includes static configuration files (see @code{shishi_realm_for_server_file()}) and DNS (see @code{shishi_realm_for_server_dns()}). @strong{Return value:} Returns realm for host, or NULL if not found. @end deftypefun shishi-1.0.2/doc/texi/keytab.c.texi0000644000000000000000000001251512126773202014007 00000000000000@subheading shishi_keys_add_keytab_mem @anchor{shishi_keys_add_keytab_mem} @deftypefun {int} {shishi_keys_add_keytab_mem} (Shishi * @var{handle}, const char * @var{data}, size_t @var{len}, Shishi_keys * @var{keys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{data}: constant memory buffer with keytab of @code{len} size. @var{len}: size of memory buffer with keytab data. @var{keys}: allocated key set to store keys in. Read keys from a MIT keytab data structure, and add them to the key set. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} Returns @code{SHISHI_KEYTAB_ERROR} if the data does not represent a valid keytab structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_keys_add_keytab_file @anchor{shishi_keys_add_keytab_file} @deftypefun {int} {shishi_keys_add_keytab_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_keys * @var{keys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: name of file to read. @var{keys}: allocated key set to store keys in. Read keys from a MIT keytab data structure from a file, and add the keys to the key set. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} Returns @code{SHISHI_IO_ERROR} if the file cannot be read, @code{SHISHI_KEYTAB_ERROR} if the data cannot be parsed as a valid keytab structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_keys_from_keytab_mem @anchor{shishi_keys_from_keytab_mem} @deftypefun {int} {shishi_keys_from_keytab_mem} (Shishi * @var{handle}, const char * @var{data}, size_t @var{len}, Shishi_keys ** @var{outkeys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{data}: constant memory buffer with keytab of @code{len} size. @var{len}: size of memory buffer with keytab data. @var{outkeys}: pointer to key set that will be allocated and populated, must be deallocated by caller on succes. Create a new key set populated with keys from a MIT keytab data structure read from a memory block. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} Returns @code{SHISHI_KEYTAB_ERROR} if the data does not represent a valid keytab structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_keys_from_keytab_file @anchor{shishi_keys_from_keytab_file} @deftypefun {int} {shishi_keys_from_keytab_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_keys ** @var{outkeys}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: name of file to read. @var{outkeys}: pointer to key set that will be allocated and populated, must be deallocated by caller on succes. Create a new key set populated with keys from a MIT keytab data structure read from a file. The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} Returns @code{SHISHI_IO_ERROR} if the file cannot be read, @code{SHISHI_KEYTAB_ERROR} if the data cannot be parsed as a valid keytab structure, and @code{SHISHI_OK} on success. @end deftypefun @subheading shishi_keys_to_keytab_mem @anchor{shishi_keys_to_keytab_mem} @deftypefun {int} {shishi_keys_to_keytab_mem} (Shishi * @var{handle}, Shishi_keys * @var{keys}, char ** @var{out}, size_t * @var{len}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{keys}: key set to convert to keytab format. @var{out}: constant memory buffer with keytab of @code{len} size. @var{len}: size of memory buffer with keytab data. Write keys to a MIT keytab data structure. The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} On success @code{SHISHI_OK} is returned, otherwise an error code. @strong{Since:} 0.0.42 @end deftypefun @subheading shishi_keys_to_keytab_file @anchor{shishi_keys_to_keytab_file} @deftypefun {int} {shishi_keys_to_keytab_file} (Shishi * @var{handle}, Shishi_keys * @var{keys}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{keys}: keyset to write. @var{filename}: name of file to write. Write keys to a MIT keytab data structure. The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format. @strong{Returns:} @code{SHISHI_FOPEN_ERROR} if there is a problem opening @code{filename} for writing, @code{SHISHI_IO_ERROR} if there is problem writing the file, and @code{SHISHI_OK} on success. @strong{Since:} 0.0.42 @end deftypefun shishi-1.0.2/doc/texi/kerberos5.c.texi0000644000000000000000000000000012126773202014413 00000000000000shishi-1.0.2/doc/texi/principal.c.texi0000644000000000000000000001633112126773203014512 00000000000000@subheading shishi_principal_default_guess @anchor{shishi_principal_default_guess} @deftypefun {char *} {shishi_principal_default_guess} ( @var{void}) Guesses the principal name for the user, looking at environment variables SHISHI_USER, USER and LOGNAME, or if that fails, returns the string "user". @strong{Return value:} Returns guessed default principal for user as a string that has to be deallocated by the caller with @code{free()}. @end deftypefun @subheading shishi_principal_default @anchor{shishi_principal_default} @deftypefun {const char *} {shishi_principal_default} (Shishi * @var{handle}) @var{handle}: Shishi library handle created by @code{shishi_init()}. The default principal name is the name in the environment variable USER, or LOGNAME for some systems, but it can be overridden by specifying the environment variable SHISHI_USER. @strong{Return value:} Returns the default principal name used by the library. (Not a copy of it, so don't modify or deallocate it.) @end deftypefun @subheading shishi_principal_default_set @anchor{shishi_principal_default_set} @deftypefun {void} {shishi_principal_default_set} (Shishi * @var{handle}, const char * @var{principal}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{principal}: string with new default principal name, or NULL to reset to default. Set the default principal used by the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_parse_name @anchor{shishi_parse_name} @deftypefun {int} {shishi_parse_name} (Shishi * @var{handle}, const char * @var{name}, char ** @var{principal}, char ** @var{realm}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{name}: input principal name string, e.g. imap/mail.gnu.org\@code{GNU}.ORG. @var{principal}: newly allocated output string with principal name. @var{realm}: newly allocated output string with realm name. Split principal name (e.g., "simon\@code{JOSEFSSON}.ORG") into two newly allocated strings, the @code{principal} ("simon"), and the @code{realm} ("JOSEFSSON.ORG"). If there is no realm part in @code{name}, @code{realm} is set to NULL. @strong{Return value:} Returns SHISHI_INVALID_PRINCIPAL_NAME if @code{name} is NULL or ends with the escape character "\", and SHISHI_OK if successful. @end deftypefun @subheading shishi_principal_name @anchor{shishi_principal_name} @deftypefun {int} {shishi_principal_name} (Shishi * @var{handle}, Shishi_asn1 @var{namenode}, const char * @var{namefield}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{namenode}: ASN.1 structure with principal in @code{namefield}. @var{namefield}: name of field in @code{namenode} containing principal name. @var{out}: pointer to newly allocated, null terminated, string containing principal name. May be @code{NULL} (to only populate @code{outlen}). @var{outlen}: pointer to length of @code{out} on output, excluding terminating null. May be @code{NULL} (to only populate @code{out}). Represent principal name in ASN.1 structure as null-terminated string. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{outlen} does not include the terminating null. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_principal_name_realm @anchor{shishi_principal_name_realm} @deftypefun {int} {shishi_principal_name_realm} (Shishi * @var{handle}, Shishi_asn1 @var{namenode}, const char * @var{namefield}, Shishi_asn1 @var{realmnode}, const char * @var{realmfield}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{namenode}: ASN.1 structure with principal name in @code{namefield}. @var{namefield}: name of field in @code{namenode} containing principal name. @var{realmnode}: ASN.1 structure with principal realm in @code{realmfield}. @var{realmfield}: name of field in @code{realmnode} containing principal realm. @var{out}: pointer to newly allocated null terminated string containing principal name. May be @code{NULL} (to only populate @code{outlen}). @var{outlen}: pointer to length of @code{out} on output, excluding terminating null. May be @code{NULL} (to only populate @code{out}). Represent principal name and realm in ASN.1 structure as null-terminated string. The string is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length @code{outlen} does not include the terminating null character. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_principal_name_set @anchor{shishi_principal_name_set} @deftypefun {int} {shishi_principal_name_set} (Shishi * @var{handle}, Shishi_asn1 @var{namenode}, const char * @var{namefield}, Shishi_name_type @var{name_type}, const char * [] @var{name}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{namenode}: ASN.1 structure with principal in @code{namefield}. @var{namefield}: name of field in @code{namenode} containing principal name. @var{name_type}: type of principal, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{name}: null-terminated input array with principal name. Set the given principal name field to the given name. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_principal_set @anchor{shishi_principal_set} @deftypefun {int} {shishi_principal_set} (Shishi * @var{handle}, Shishi_asn1 @var{namenode}, const char * @var{namefield}, const char * @var{name}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{namenode}: ASN.1 structure with principal in @code{namefield}. @var{namefield}: name of field in @code{namenode} containing principal name. @var{name}: null-terminated string with principal name in RFC 1964 form. Set principal name field in an ASN.1 structure to the given name. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_derive_default_salt @anchor{shishi_derive_default_salt} @deftypefun {int} {shishi_derive_default_salt} (Shishi * @var{handle}, const char * @var{name}, char ** @var{salt}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{name}: principal name of user. @var{salt}: output variable with newly allocated salt string. Derive the default salt from a principal. The default salt is the concatenation of the decoded realm and the principal. @strong{Return value:} Return SHISHI_OK if successful. @end deftypefun @subheading shishi_server_for_local_service @anchor{shishi_server_for_local_service} @deftypefun {char *} {shishi_server_for_local_service} (Shishi * @var{handle}, const char * @var{service}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{service}: null terminated string with name of service, e.g., "host". Construct a service principal (e.g., "imap/yxa.extuno.com") based on supplied service name (i.e., "imap") and the system's hostname as returned by @code{hostname()} (i.e., "yxa.extundo.com"). The string must be deallocated by the caller. @strong{Return value:} Return newly allocated service name string. @end deftypefun shishi-1.0.2/doc/texi/apreq.c.texi0000644000000000000000000002240112126773202013633 00000000000000@subheading shishi_apreq @anchor{shishi_apreq} @deftypefun {Shishi_asn1} {shishi_apreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new AP-REQ, populated with some default values. @strong{Return value:} Returns the AP-REQ or NULL on failure. @end deftypefun @subheading shishi_apreq_print @anchor{shishi_apreq_print} @deftypefun {int} {shishi_apreq_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{apreq}: AP-REQ to print. Print ASCII armored DER encoding of AP-REQ to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_save @anchor{shishi_apreq_save} @deftypefun {int} {shishi_apreq_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{apreq}: AP-REQ to save. Save DER encoding of AP-REQ to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_to_file @anchor{shishi_apreq_to_file} @deftypefun {int} {shishi_apreq_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write AP-REQ to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_parse @anchor{shishi_apreq_parse} @deftypefun {int} {shishi_apreq_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{apreq}: output variable with newly allocated AP-REQ. Read ASCII armored DER encoded AP-REQ from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_read @anchor{shishi_apreq_read} @deftypefun {int} {shishi_apreq_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{apreq}: output variable with newly allocated AP-REQ. Read DER encoded AP-REQ from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_from_file @anchor{shishi_apreq_from_file} @deftypefun {int} {shishi_apreq_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{apreq}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: output variable with newly allocated AP-REQ. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read AP-REQ from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_set_authenticator @anchor{shishi_apreq_set_authenticator} @deftypefun {int} {shishi_apreq_set_authenticator} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, int32_t @var{etype}, uint32_t @var{kvno}, const char * @var{buf}, size_t @var{buflen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ to add authenticator field to. @var{etype}: encryption type used to encrypt authenticator. @var{kvno}: version of the key used to encrypt authenticator. @var{buf}: input array with encrypted authenticator. @var{buflen}: size of input array with encrypted authenticator. Set the encrypted authenticator field in the AP-REP. The encrypted data is usually created by calling @code{shishi_encrypt()} on the DER encoded authenticator. To save time, you may want to use @code{shishi_apreq_add_authenticator()} instead, which calculates the encrypted data and calls this function in one step. @strong{Return value:} Returns SHISHI_OK on success. @end deftypefun @subheading shishi_apreq_add_authenticator @anchor{shishi_apreq_add_authenticator} @deftypefun {int} {shishi_apreq_add_authenticator} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, Shishi_key * @var{key}, int @var{keyusage}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ to add authenticator field to. @var{key}: key to to use for encryption. @var{keyusage}: cryptographic key usage value to use in encryption. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Encrypts DER encoded authenticator using key and store it in the AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_set_ticket @anchor{shishi_apreq_set_ticket} @deftypefun {int} {shishi_apreq_set_ticket} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, Shishi_asn1 @var{ticket}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ to add ticket field to. @var{ticket}: input ticket to copy into AP-REQ ticket field. Copy ticket into AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_options @anchor{shishi_apreq_options} @deftypefun {int} {shishi_apreq_options} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, uint32_t * @var{flags}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ to get options from. @var{flags}: Output integer containing options from AP-REQ. Extract the AP-Options from AP-REQ into output integer. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_use_session_key_p @anchor{shishi_apreq_use_session_key_p} @deftypefun {int} {shishi_apreq_use_session_key_p} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ as allocated by @code{shishi_apreq()}. Return non-0 iff the "Use session key" option is set in the AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_mutual_required_p @anchor{shishi_apreq_mutual_required_p} @deftypefun {int} {shishi_apreq_mutual_required_p} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ as allocated by @code{shishi_apreq()}. Return non-0 iff the "Mutual required" option is set in the AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_options_set @anchor{shishi_apreq_options_set} @deftypefun {int} {shishi_apreq_options_set} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, uint32_t @var{options}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ as allocated by @code{shishi_apreq()}. @var{options}: Options to set in AP-REQ. Set the AP-Options in AP-REQ to indicate integer. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_options_add @anchor{shishi_apreq_options_add} @deftypefun {int} {shishi_apreq_options_add} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, uint32_t @var{option}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ as allocated by @code{shishi_apreq()}. @var{option}: Options to add in AP-REQ. Add the AP-Options in AP-REQ. Options not set in input parameter @code{option} are preserved in the AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_options_remove @anchor{shishi_apreq_options_remove} @deftypefun {int} {shishi_apreq_options_remove} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, uint32_t @var{option}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ as allocated by @code{shishi_apreq()}. @var{option}: Options to remove from AP-REQ. Remove the AP-Options from AP-REQ. Options not set in input parameter @code{option} are preserved in the AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_get_authenticator_etype @anchor{shishi_apreq_get_authenticator_etype} @deftypefun {int} {shishi_apreq_get_authenticator_etype} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, int32_t * @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ variable to get value from. @var{etype}: output variable that holds the value. Extract AP-REQ.authenticator.etype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_apreq_get_ticket @anchor{shishi_apreq_get_ticket} @deftypefun {int} {shishi_apreq_get_ticket} (Shishi * @var{handle}, Shishi_asn1 @var{apreq}, Shishi_asn1 * @var{ticket}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{apreq}: AP-REQ variable to get ticket from. @var{ticket}: output variable to hold extracted ticket. Extract ticket from AP-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/tkts.c.texi0000644000000000000000000003475012126773203013523 00000000000000@subheading shishi_tkts_default_file_guess @anchor{shishi_tkts_default_file_guess} @deftypefun {char *} {shishi_tkts_default_file_guess} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets. @strong{Return value:} Returns default tkts filename as a string that has to be deallocated with @code{free()} by the caller. @end deftypefun @subheading shishi_tkts_default_file @anchor{shishi_tkts_default_file} @deftypefun {const char *} {shishi_tkts_default_file} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename of default ticket set. @strong{Return value:} Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it. @end deftypefun @subheading shishi_tkts_default_file_set @anchor{shishi_tkts_default_file_set} @deftypefun {void} {shishi_tkts_default_file_set} (Shishi * @var{handle}, const char * @var{tktsfile}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{tktsfile}: string with new default tkts file name, or NULL to reset to default. Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_tkts_default @anchor{shishi_tkts_default} @deftypefun {Shishi_tkts *} {shishi_tkts_default} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get the default ticket set for library handle. @strong{Return value:} Return the handle global ticket set. @end deftypefun @subheading shishi_tkts @anchor{shishi_tkts} @deftypefun {int} {shishi_tkts} (Shishi * @var{handle}, Shishi_tkts ** @var{tkts}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{tkts}: output pointer to newly allocated tkts handle. Get a new ticket set handle. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_done @anchor{shishi_tkts_done} @deftypefun {void} {shishi_tkts_done} (Shishi_tkts ** @var{tkts}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this. @end deftypefun @subheading shishi_tkts_size @anchor{shishi_tkts_size} @deftypefun {int} {shishi_tkts_size} (Shishi_tkts * @var{tkts}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. Get size of ticket set. @strong{Return value:} Returns number of tickets stored in ticket set. @end deftypefun @subheading shishi_tkts_nth @anchor{shishi_tkts_nth} @deftypefun {Shishi_tkt *} {shishi_tkts_nth} (Shishi_tkts * @var{tkts}, int @var{ticketno}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{ticketno}: integer indicating requested ticket in ticket set. @strong{Get the n:} th ticket in ticket set. @strong{Return value:} Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on. @end deftypefun @subheading shishi_tkts_remove @anchor{shishi_tkts_remove} @deftypefun {int} {shishi_tkts_remove} (Shishi_tkts * @var{tkts}, int @var{ticketno}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{ticketno}: ticket number of ticket in the set to remove. The first ticket is ticket number 0. Remove a ticket, indexed by @code{ticketno}, in ticket set. @strong{Return value:} @code{SHISHI_OK} if successful or if @code{ticketno} larger than size of ticket set. @end deftypefun @subheading shishi_tkts_add @anchor{shishi_tkts_add} @deftypefun {int} {shishi_tkts_add} (Shishi_tkts * @var{tkts}, Shishi_tkt * @var{tkt}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{tkt}: ticket to be added to ticket set. Add a ticket to the ticket set. Only the pointer is stored, so if you modify @code{tkt}, the ticket in the ticket set will also be modified. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_new @anchor{shishi_tkts_new} @deftypefun {int} {shishi_tkts_new} (Shishi_tkts * @var{tkts}, Shishi_asn1 @var{ticket}, Shishi_asn1 @var{enckdcreppart}, Shishi_asn1 @var{kdcrep}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{ticket}: input ticket variable. @var{enckdcreppart}: input ticket detail variable. @var{kdcrep}: input KDC-REP variable. Allocate a new ticket and add it to the ticket set. Note that @code{ticket}, @code{enckdcreppart} and @code{kdcrep} are stored by reference, so you must not de-allocate them before the ticket is removed from the ticket set and de-allocated. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_read @anchor{shishi_tkts_read} @deftypefun {int} {shishi_tkts_read} (Shishi_tkts * @var{tkts}, FILE * @var{fh}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{fh}: file descriptor to read from. Read tickets from file descriptor and add them to the ticket set. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_from_file @anchor{shishi_tkts_from_file} @deftypefun {int} {shishi_tkts_from_file} (Shishi_tkts * @var{tkts}, const char * @var{filename}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{filename}: filename to read tickets from. Read tickets from file and add them to the ticket set. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_write @anchor{shishi_tkts_write} @deftypefun {int} {shishi_tkts_write} (Shishi_tkts * @var{tkts}, FILE * @var{fh}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{fh}: file descriptor to write tickets to. Write tickets in set to file descriptor. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_expire @anchor{shishi_tkts_expire} @deftypefun {int} {shishi_tkts_expire} (Shishi_tkts * @var{tkts}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. Remove expired tickets from ticket set. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_to_file @anchor{shishi_tkts_to_file} @deftypefun {int} {shishi_tkts_to_file} (Shishi_tkts * @var{tkts}, const char * @var{filename}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{filename}: filename to write tickets to. Write tickets in set to file. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_print_for_service @anchor{shishi_tkts_print_for_service} @deftypefun {int} {shishi_tkts_print_for_service} (Shishi_tkts * @var{tkts}, FILE * @var{fh}, const char * @var{service}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{fh}: file descriptor to print to. @var{service}: service to limit tickets printed to, or NULL. Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkts_print @anchor{shishi_tkts_print} @deftypefun {int} {shishi_tkts_print} (Shishi_tkts * @var{tkts}, FILE * @var{fh}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{fh}: file descriptor to print to. Print description of all tickets to file descriptor. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_tkt_match_p @anchor{shishi_tkt_match_p} @deftypefun {int} {shishi_tkt_match_p} (Shishi_tkt * @var{tkt}, Shishi_tkts_hint * @var{hint}) @var{tkt}: ticket to test hints on. @var{hint}: structure with characteristics of ticket to be found. Test if a ticket matches specified hints. @strong{Return value:} Returns 0 iff ticket fails to match given criteria. @end deftypefun @subheading shishi_tkts_find @anchor{shishi_tkts_find} @deftypefun {Shishi_tkt *} {shishi_tkts_find} (Shishi_tkts * @var{tkts}, Shishi_tkts_hint * @var{hint}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{hint}: structure with characteristics of ticket to be found. Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint->startpos field must be updated appropriately. @strong{Here is how you would typically use this function:} Shishi_tkts_hint hint; Shishi_tkt tkt; memset(&hint, 0, sizeof(hint)); hint.server = "imap/mail.example.org"; tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint); if (!tkt) printf("No ticket found...\n"); else do_something_with_ticket (tkt); @strong{Return value:} Returns a ticket if found, or NULL if no further matching tickets could be found. @end deftypefun @subheading shishi_tkts_find_for_clientserver @anchor{shishi_tkts_find_for_clientserver} @deftypefun {Shishi_tkt *} {shishi_tkts_find_for_clientserver} (Shishi_tkts * @var{tkts}, const char * @var{client}, const char * @var{server}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{client}: client name to find ticket for. @var{server}: server name to find ticket for. Short-hand function for searching the ticket set for a ticket for the given client and server. See @code{shishi_tkts_find()}. @strong{Return value:} Returns a ticket if found, or NULL. @end deftypefun @subheading shishi_tkts_find_for_server @anchor{shishi_tkts_find_for_server} @deftypefun {Shishi_tkt *} {shishi_tkts_find_for_server} (Shishi_tkts * @var{tkts}, const char * @var{server}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{server}: server name to find ticket for. Short-hand function for searching the ticket set for a ticket for the given server using the default client principal. See @code{shishi_tkts_find_for_clientserver()} and @code{shishi_tkts_find()}. @strong{Return value:} Returns a ticket if found, or NULL. @end deftypefun @subheading shishi_tkts_get_tgt @anchor{shishi_tkts_get_tgt} @deftypefun {Shishi_tkt *} {shishi_tkts_get_tgt} (Shishi_tkts * @var{tkts}, Shishi_tkts_hint * @var{hint}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{hint}: structure with characteristics of ticket to begot. Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange. Currently this function do not implement cross realm logic. This function is used by @code{shishi_tkts_get()}, which is probably what you really want to use unless you have special needs. @strong{Return value:} Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on. @end deftypefun @subheading shishi_tkts_get_tgs @anchor{shishi_tkts_get_tgs} @deftypefun {Shishi_tkt *} {shishi_tkts_get_tgs} (Shishi_tkts * @var{tkts}, Shishi_tkts_hint * @var{hint}, Shishi_tkt * @var{tgt}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{hint}: structure with characteristics of ticket to begot. @var{tgt}: ticket granting ticket to use. Get a ticket via TGS exchange using specified ticket granting ticket. This function is used by @code{shishi_tkts_get()}, which is probably what you really want to use unless you have special needs. @strong{Return value:} Returns a ticket if successful, or NULL if this function is unable to acquire on. @end deftypefun @subheading shishi_tkts_get @anchor{shishi_tkts_get} @deftypefun {Shishi_tkt *} {shishi_tkts_get} (Shishi_tkts * @var{tkts}, Shishi_tkts_hint * @var{hint}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{hint}: structure with characteristics of ticket to be found. Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using @code{shishi_tkts_get_tgt()}, and then uses that TGT in a TGS exchange to get the ticket. Currently this function does not implement cross realm logic. @strong{Return value:} Returns a ticket if found, or NULL if this function is unable to get the ticket. @end deftypefun @subheading shishi_tkts_get_for_clientserver @anchor{shishi_tkts_get_for_clientserver} @deftypefun {Shishi_tkt *} {shishi_tkts_get_for_clientserver} (Shishi_tkts * @var{tkts}, const char * @var{client}, const char * @var{server}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{client}: client name to get ticket for. @var{server}: server name to get ticket for. Short-hand function for getting a ticket for the given client and server. See @code{shishi_tkts_get()}. @strong{Return value:} Returns a ticket if found, or NULL. @end deftypefun @subheading shishi_tkts_get_for_server @anchor{shishi_tkts_get_for_server} @deftypefun {Shishi_tkt *} {shishi_tkts_get_for_server} (Shishi_tkts * @var{tkts}, const char * @var{server}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{server}: server name to get ticket for. Short-hand function for getting a ticket to the given server and for the default principal client. See @code{shishi_tkts_get()}. @strong{Return value:} Returns a ticket if found, or NULL. @end deftypefun @subheading shishi_tkts_get_for_localservicepasswd @anchor{shishi_tkts_get_for_localservicepasswd} @deftypefun {Shishi_tkt *} {shishi_tkts_get_for_localservicepasswd} (Shishi_tkts * @var{tkts}, const char * @var{service}, const char * @var{passwd}) @var{tkts}: ticket set handle as allocated by @code{shishi_tkts()}. @var{service}: service name to get ticket for. @var{passwd}: password for the default client principal. Short-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See @code{shishi_tkts_get()}. @strong{Return value:} Returns a ticket if found, or NULL otherwise. @end deftypefun shishi-1.0.2/doc/texi/version.c.texi0000644000000000000000000000101512126773203014207 00000000000000@subheading shishi_check_version @anchor{shishi_check_version} @deftypefun {const char *} {shishi_check_version} (const char * @var{req_version}) @var{req_version}: version string to compare with, or NULL Check that the version of the library is at minimum the one given as a string in @code{req_version}. @strong{Return value:} the actual version string of the library; NULL if the condition is not met. If @code{NULL} is passed to this function no check is done and only the version string is returned. @end deftypefun shishi-1.0.2/doc/texi/authenticator.c.texi0000644000000000000000000005173412126773202015410 00000000000000@subheading shishi_authenticator @anchor{shishi_authenticator} @deftypefun {Shishi_asn1} {shishi_authenticator} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. @strong{Return value:} Returns the authenticator or NULL on failure. @end deftypefun @subheading shishi_authenticator_subkey @anchor{shishi_authenticator_subkey} @deftypefun {Shishi_asn1} {shishi_authenticator_subkey} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. It adds a random subkey. @strong{Return value:} Returns the authenticator or NULL on failure. @end deftypefun @subheading shishi_authenticator_print @anchor{shishi_authenticator_print} @deftypefun {int} {shishi_authenticator_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Print ASCII armored DER encoding of authenticator to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_save @anchor{shishi_authenticator_save} @deftypefun {int} {shishi_authenticator_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Save DER encoding of authenticator to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_to_file @anchor{shishi_authenticator_to_file} @deftypefun {int} {shishi_authenticator_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write Authenticator to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_parse @anchor{shishi_authenticator_parse} @deftypefun {int} {shishi_authenticator_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{authenticator}: output variable with newly allocated authenticator. Read ASCII armored DER encoded authenticator from file and populate given authenticator variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_read @anchor{shishi_authenticator_read} @deftypefun {int} {shishi_authenticator_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{authenticator}: output variable with newly allocated authenticator. Read DER encoded authenticator from file and populate given authenticator variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_from_file @anchor{shishi_authenticator_from_file} @deftypefun {int} {shishi_authenticator_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{authenticator}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: output variable with newly allocated Authenticator. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read Authenticator from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_set_crealm @anchor{shishi_authenticator_set_crealm} @deftypefun {int} {shishi_authenticator_set_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, const char * @var{crealm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{crealm}: input array with realm. Set realm field in authenticator to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_set_cname @anchor{shishi_authenticator_set_cname} @deftypefun {int} {shishi_authenticator_set_cname} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, Shishi_name_type @var{name_type}, const char * [] @var{cname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{cname}: input array with principal name. Set principal field in authenticator to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_client_set @anchor{shishi_authenticator_client_set} @deftypefun {int} {shishi_authenticator_client_set} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, const char * @var{client}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator to set client name field in. @var{client}: zero-terminated string with principal name on RFC 1964 form. Set the client name field in the Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_ctime @anchor{shishi_authenticator_ctime} @deftypefun {int} {shishi_authenticator_ctime} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, char ** @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator as allocated by @code{shishi_authenticator()}. @var{t}: newly allocated zero-terminated character array with client time. Extract client time from Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_ctime_set @anchor{shishi_authenticator_ctime_set} @deftypefun {int} {shishi_authenticator_ctime_set} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, const char * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator as allocated by @code{shishi_authenticator()}. @var{t}: string with generalized time value to store in Authenticator. Store client time in Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_cusec_get @anchor{shishi_authenticator_cusec_get} @deftypefun {int} {shishi_authenticator_cusec_get} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, uint32_t * @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator as allocated by @code{shishi_authenticator()}. @var{cusec}: output integer with client microseconds field. Extract client microseconds field from Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_cusec_set @anchor{shishi_authenticator_cusec_set} @deftypefun {int} {shishi_authenticator_cusec_set} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, uint32_t @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{cusec}: client microseconds to set in authenticator, 0-999999. Set the cusec field in the Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_seqnumber_get @anchor{shishi_authenticator_seqnumber_get} @deftypefun {int} {shishi_authenticator_seqnumber_get} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, uint32_t * @var{seqnumber}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{seqnumber}: output integer with sequence number field. Extract sequence number field from Authenticator. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_authenticator_seqnumber_remove @anchor{shishi_authenticator_seqnumber_remove} @deftypefun {int} {shishi_authenticator_seqnumber_remove} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Remove sequence number field in Authenticator. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_authenticator_seqnumber_set @anchor{shishi_authenticator_seqnumber_set} @deftypefun {int} {shishi_authenticator_seqnumber_set} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, uint32_t @var{seqnumber}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{seqnumber}: integer with sequence number field to store in Authenticator. Store sequence number field in Authenticator. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_authenticator_client @anchor{shishi_authenticator_client} @deftypefun {int} {shishi_authenticator_client} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{authenticator}: Authenticator variable to get client name from. @var{client}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Represent client principal name in Authenticator as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_clientrealm @anchor{shishi_authenticator_clientrealm} @deftypefun {int} {shishi_authenticator_clientrealm} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{authenticator}: Authenticator variable to get client name and realm from. @var{client}: pointer to newly allocated zero terminated string containing principal name and realm. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Convert cname and realm fields from Authenticator to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_cksum @anchor{shishi_authenticator_cksum} @deftypefun {int} {shishi_authenticator_cksum} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int32_t * @var{cksumtype}, char ** @var{cksum}, size_t * @var{cksumlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{cksumtype}: output checksum type. @var{cksum}: newly allocated output checksum data from authenticator. @var{cksumlen}: on output, actual size of allocated output checksum data buffer. Read checksum value from authenticator. @code{cksum} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_set_cksum @anchor{shishi_authenticator_set_cksum} @deftypefun {int} {shishi_authenticator_set_cksum} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int32_t @var{cksumtype}, char * @var{cksum}, size_t @var{cksumlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{cksumtype}: input checksum type to store in authenticator. @var{cksum}: input checksum data to store in authenticator. @var{cksumlen}: size of input checksum data to store in authenticator. Store checksum value in authenticator. A checksum is usually created by calling @code{shishi_checksum()} on some application specific data using the key from the ticket that is being used. To save time, you may want to use @code{shishi_authenticator_add_cksum()} instead, which calculates the checksum and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_cksum @anchor{shishi_authenticator_add_cksum} @deftypefun {int} {shishi_authenticator_add_cksum} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, Shishi_key * @var{key}, int @var{keyusage}, char * @var{data}, size_t @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{key}: key to to use for encryption. @var{keyusage}: cryptographic key usage value to use in encryption. @var{data}: input array with data to calculate checksum on. @var{datalen}: size of input array with data to calculate checksum on. Calculate checksum for data and store it in the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_cksum_type @anchor{shishi_authenticator_add_cksum_type} @deftypefun {int} {shishi_authenticator_add_cksum_type} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, Shishi_key * @var{key}, int @var{keyusage}, int @var{cksumtype}, char * @var{data}, size_t @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{key}: key to to use for encryption. @var{keyusage}: cryptographic key usage value to use in encryption. @var{cksumtype}: checksum to type to calculate checksum. @var{data}: input array with data to calculate checksum on. @var{datalen}: size of input array with data to calculate checksum on. Calculate checksum for data and store it in the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_clear_authorizationdata @anchor{shishi_authenticator_clear_authorizationdata} @deftypefun {int} {shishi_authenticator_clear_authorizationdata} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: Authenticator as allocated by @code{shishi_authenticator()}. Remove the authorization-data field from Authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_authorizationdata @anchor{shishi_authenticator_add_authorizationdata} @deftypefun {int} {shishi_authenticator_add_authorizationdata} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int32_t @var{adtype}, const char * @var{addata}, size_t @var{addatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{adtype}: input authorization data type to add. @var{addata}: input authorization data to add. @var{addatalen}: size of input authorization data to add. Add authorization data to authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_authorizationdata @anchor{shishi_authenticator_authorizationdata} @deftypefun {int} {shishi_authenticator_authorizationdata} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int32_t * @var{adtype}, char ** @var{addata}, size_t * @var{addatalen}, size_t @var{nth}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{adtype}: output authorization data type. @var{addata}: newly allocated output authorization data. @var{addatalen}: on output, actual size of newly allocated authorization data. @var{nth}: element number of authorization-data to extract. @strong{Extract n:} th authorization data from authenticator. The first field is 1. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_remove_subkey @anchor{shishi_authenticator_remove_subkey} @deftypefun {int} {shishi_authenticator_remove_subkey} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Remove subkey from the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_get_subkey @anchor{shishi_authenticator_get_subkey} @deftypefun {int} {shishi_authenticator_get_subkey} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, Shishi_key ** @var{subkey}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{subkey}: output newly allocated subkey from authenticator. Read subkey value from authenticator. @strong{Return value:} Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT if subkey is not present. @end deftypefun @subheading shishi_authenticator_set_subkey @anchor{shishi_authenticator_set_subkey} @deftypefun {int} {shishi_authenticator_set_subkey} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int32_t @var{subkeytype}, const char * @var{subkey}, size_t @var{subkeylen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{subkeytype}: input subkey type to store in authenticator. @var{subkey}: input subkey data to store in authenticator. @var{subkeylen}: size of input subkey data to store in authenticator. Store subkey value in authenticator. A subkey is usually created by calling @code{shishi_key_random()} using the default encryption type of the key from the ticket that is being used. To save time, you may want to use @code{shishi_authenticator_add_subkey()} instead, which calculates the subkey and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_random_subkey @anchor{shishi_authenticator_add_random_subkey} @deftypefun {int} {shishi_authenticator_add_random_subkey} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. Generate random subkey, of the default encryption type from configuration, and store it in the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_random_subkey_etype @anchor{shishi_authenticator_add_random_subkey_etype} @deftypefun {int} {shishi_authenticator_add_random_subkey_etype} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, int @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{etype}: encryption type of random key to generate. Generate random subkey of indicated encryption type, and store it in the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_authenticator_add_subkey @anchor{shishi_authenticator_add_subkey} @deftypefun {int} {shishi_authenticator_add_subkey} (Shishi * @var{handle}, Shishi_asn1 @var{authenticator}, Shishi_key * @var{subkey}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{authenticator}: authenticator as allocated by @code{shishi_authenticator()}. @var{subkey}: subkey to add to authenticator. Store subkey in the authenticator. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/krberror.c.texi0000644000000000000000000005604612126773202014367 00000000000000@subheading shishi_krberror @anchor{shishi_krberror} @deftypefun {Shishi_asn1} {shishi_krberror} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new KRB-ERROR, populated with some default values. @strong{Return value:} Returns the KRB-ERROR or NULL on failure. @end deftypefun @subheading shishi_krberror_print @anchor{shishi_krberror_print} @deftypefun {int} {shishi_krberror_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{krberror}: KRB-ERROR to print. Print ASCII armored DER encoding of KRB-ERROR to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_save @anchor{shishi_krberror_save} @deftypefun {int} {shishi_krberror_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{krberror}: KRB-ERROR to save. Save DER encoding of KRB-ERROR to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_to_file @anchor{shishi_krberror_to_file} @deftypefun {int} {shishi_krberror_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write KRB-ERROR to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_parse @anchor{shishi_krberror_parse} @deftypefun {int} {shishi_krberror_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{krberror}: output variable with newly allocated KRB-ERROR. Read ASCII armored DER encoded KRB-ERROR from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_read @anchor{shishi_krberror_read} @deftypefun {int} {shishi_krberror_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{krberror}: output variable with newly allocated KRB-ERROR. Read DER encoded KRB-ERROR from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_from_file @anchor{shishi_krberror_from_file} @deftypefun {int} {shishi_krberror_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{krberror}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: output variable with newly allocated KRB-ERROR. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read KRB-ERROR from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_build @anchor{shishi_krberror_build} @deftypefun {int} {shishi_krberror_build} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. Finish KRB-ERROR, called before e.g. shishi_krberror_der. This function removes empty but OPTIONAL fields (such as cname), and @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_der @anchor{shishi_krberror_der} @deftypefun {int} {shishi_krberror_der} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{out}: output array with newly allocated DER encoding of KRB-ERROR. @var{outlen}: length of output array with DER encoding of KRB-ERROR. DER encode KRB-ERROR. The caller must deallocate the OUT buffer. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_crealm @anchor{shishi_krberror_crealm} @deftypefun {int} {shishi_krberror_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{realm}, size_t * @var{realmlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{realm}: output array with newly allocated name of realm in KRB-ERROR. @var{realmlen}: size of output array. Extract client realm from KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_crealm @anchor{shishi_krberror_remove_crealm} @deftypefun {int} {shishi_krberror_remove_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. Remove client realm field in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_crealm @anchor{shishi_krberror_set_crealm} @deftypefun {int} {shishi_krberror_set_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{crealm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{crealm}: input array with realm. Set realm field in krberror to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_client @anchor{shishi_krberror_client} @deftypefun {int} {shishi_krberror_client} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{client}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Return client principal name in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_cname @anchor{shishi_krberror_set_cname} @deftypefun {int} {shishi_krberror_set_cname} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, Shishi_name_type @var{name_type}, const char * [] @var{cname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{cname}: input array with principal name. Set principal field in krberror to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_cname @anchor{shishi_krberror_remove_cname} @deftypefun {int} {shishi_krberror_remove_cname} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. Remove client realm field in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_client_set @anchor{shishi_krberror_client_set} @deftypefun {int} {shishi_krberror_client_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{client}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror to set client name field in. @var{client}: zero-terminated string with principal name on RFC 1964 form. Set the client name field in the Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_realm @anchor{shishi_krberror_realm} @deftypefun {int} {shishi_krberror_realm} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{realm}, size_t * @var{realmlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{realm}: output array with newly allocated name of realm in KRB-ERROR. @var{realmlen}: size of output array. Extract (server) realm from KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_realm @anchor{shishi_krberror_set_realm} @deftypefun {int} {shishi_krberror_set_realm} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{realm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{realm}: input array with (server) realm. Set (server) realm field in krberror to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_server @anchor{shishi_krberror_server} @deftypefun {int} {shishi_krberror_server} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{server}, size_t * @var{serverlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{server}: pointer to newly allocated zero terminated string containing server name. May be @code{NULL} (to only populate @code{serverlen}). @var{serverlen}: pointer to length of @code{server} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{server}). Return server principal name in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_sname @anchor{shishi_krberror_remove_sname} @deftypefun {int} {shishi_krberror_remove_sname} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror to set server name field in. Remove server name field in KRB-ERROR. (Since it is not marked OPTIONAL in the ASN.1 profile, what is done is to set the name-type to UNKNOWN and make sure the name-string sequence is empty.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_sname @anchor{shishi_krberror_set_sname} @deftypefun {int} {shishi_krberror_set_sname} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, Shishi_name_type @var{name_type}, const char * [] @var{sname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{sname}: input array with principal name. Set principal field in krberror to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_server_set @anchor{shishi_krberror_server_set} @deftypefun {int} {shishi_krberror_server_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{server}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror to set server name field in. @var{server}: zero-terminated string with principal name on RFC 1964 form. Set the server name field in the Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_ctime @anchor{shishi_krberror_ctime} @deftypefun {int} {shishi_krberror_ctime} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror to set client name field in. @var{t}: newly allocated zero-terminated output array with client time. Extract client time from KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_ctime_set @anchor{shishi_krberror_ctime_set} @deftypefun {int} {shishi_krberror_ctime_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. @var{t}: string with generalized time value to store in Krberror. Store client time in Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_ctime @anchor{shishi_krberror_remove_ctime} @deftypefun {int} {shishi_krberror_remove_ctime} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. Remove client time field in Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_cusec @anchor{shishi_krberror_cusec} @deftypefun {int} {shishi_krberror_cusec} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, uint32_t * @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. @var{cusec}: output integer with client microseconds field. Extract client microseconds field from Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_cusec_set @anchor{shishi_krberror_cusec_set} @deftypefun {int} {shishi_krberror_cusec_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, uint32_t @var{cusec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{cusec}: client microseconds to set in krberror, 0-999999. Set the cusec field in the Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_cusec @anchor{shishi_krberror_remove_cusec} @deftypefun {int} {shishi_krberror_remove_cusec} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. Remove client usec field in Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_stime @anchor{shishi_krberror_stime} @deftypefun {int} {shishi_krberror_stime} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror to set client name field in. @var{t}: newly allocated zero-terminated output array with server time. Extract server time from KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_stime_set @anchor{shishi_krberror_stime_set} @deftypefun {int} {shishi_krberror_stime_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{t}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. @var{t}: string with generalized time value to store in Krberror. Store server time in Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_susec @anchor{shishi_krberror_susec} @deftypefun {int} {shishi_krberror_susec} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, uint32_t * @var{susec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: Krberror as allocated by @code{shishi_krberror()}. @var{susec}: output integer with server microseconds field. Extract server microseconds field from Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_susec_set @anchor{shishi_krberror_susec_set} @deftypefun {int} {shishi_krberror_susec_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, uint32_t @var{susec}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{susec}: server microseconds to set in krberror, 0-999999. Set the susec field in the Krberror. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_errorcode @anchor{shishi_krberror_errorcode} @deftypefun {int} {shishi_krberror_errorcode} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, int32_t * @var{errorcode}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. @var{errorcode}: output integer KRB-ERROR error code. Extract error code from KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_errorcode_fast @anchor{shishi_krberror_errorcode_fast} @deftypefun {int} {shishi_krberror_errorcode_fast} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. Get error code from KRB-ERROR, without error checking. @strong{Return value:} Return error code (see @code{shishi_krberror_errorcode()}) directly, or -1 on error. @end deftypefun @subheading shishi_krberror_errorcode_set @anchor{shishi_krberror_errorcode_set} @deftypefun {int} {shishi_krberror_errorcode_set} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, int @var{errorcode}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code to set. @var{errorcode}: new error code to set in krberror. Set the error-code field to a new error code. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_etext @anchor{shishi_krberror_etext} @deftypefun {int} {shishi_krberror_etext} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{etext}, size_t * @var{etextlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. @var{etext}: output array with newly allocated error text. @var{etextlen}: output length of error text. Extract additional error text from server (possibly empty). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_etext @anchor{shishi_krberror_set_etext} @deftypefun {int} {shishi_krberror_set_etext} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{etext}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{etext}: input array with error text to set. Set error text (e-text) field in KRB-ERROR to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_etext @anchor{shishi_krberror_remove_etext} @deftypefun {int} {shishi_krberror_remove_etext} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. Remove error text (e-text) field in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_edata @anchor{shishi_krberror_edata} @deftypefun {int} {shishi_krberror_edata} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, char ** @var{edata}, size_t * @var{edatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. @var{edata}: output array with newly allocated error data. @var{edatalen}: output length of error data. Extract additional error data from server (possibly empty). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_methoddata @anchor{shishi_krberror_methoddata} @deftypefun {int} {shishi_krberror_methoddata} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, Shishi_asn1 * @var{methoddata}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. @var{methoddata}: output ASN.1 METHOD-DATA. Extract METHOD-DATA ASN.1 object from the e-data field. The e-data field will only contain a METHOD-DATA if the krberror error code is @code{SHISHI_KDC_ERR_PREAUTH_REQUIRED}. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_set_edata @anchor{shishi_krberror_set_edata} @deftypefun {int} {shishi_krberror_set_edata} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}, const char * @var{edata}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. @var{edata}: input array with error text to set. Set error text (e-data) field in KRB-ERROR to specified value. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_remove_edata @anchor{shishi_krberror_remove_edata} @deftypefun {int} {shishi_krberror_remove_edata} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: krberror as allocated by @code{shishi_krberror()}. Remove error text (e-data) field in KRB-ERROR. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_pretty_print @anchor{shishi_krberror_pretty_print} @deftypefun {int} {shishi_krberror_pretty_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle opened for writing. @var{krberror}: KRB-ERROR structure with error code. Print KRB-ERROR error condition and some explanatory text to file descriptor. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_krberror_errorcode_message @anchor{shishi_krberror_errorcode_message} @deftypefun {const char *} {shishi_krberror_errorcode_message} (Shishi * @var{handle}, int @var{errorcode}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{errorcode}: integer KRB-ERROR error code. Get human readable string describing KRB-ERROR code. @strong{Return value:} Return a string describing error code. This function will always return a string even if the error code isn't known. @end deftypefun @subheading shishi_krberror_message @anchor{shishi_krberror_message} @deftypefun {const char *} {shishi_krberror_message} (Shishi * @var{handle}, Shishi_asn1 @var{krberror}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{krberror}: KRB-ERROR structure with error code. Extract error code (see @code{shishi_krberror_errorcode_fast()}) and return error message (see @code{shishi_krberror_errorcode_message()}). @strong{Return value:} Return a string describing error code. This function will always return a string even if the error code isn't known. @end deftypefun shishi-1.0.2/doc/texi/diskio.c.texi0000644000000000000000000000233512126773202014011 00000000000000@subheading shishi_key_print @anchor{shishi_key_print} @deftypefun {int} {shishi_key_print} (Shishi * @var{handle}, FILE * @var{fh}, const Shishi_key * @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle opened for writing. @var{key}: key to print. Print an ASCII representation of a key structure to file descriptor. Example output: -----BEGIN SHISHI KEY----- @strong{Keytype:} 18 (aes256-cts-hmac-sha1-96) @strong{Principal:} host/latte.josefsson.org @strong{Realm:} JOSEFSSON.ORG Key-Version-Number: 1 P1QdeW/oSiag/bTyVEBAY2msiGSTmgLXlopuCKoppDs= -----END SHISHI KEY----- @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_to_file @anchor{shishi_key_to_file} @deftypefun {int} {shishi_key_to_file} (Shishi * @var{handle}, const char * @var{filename}, Shishi_key * @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{filename}: filename to append key to. @var{key}: key to print. Print an ASCII representation of a key structure to a file. The file is appended to if it exists. See @code{shishi_key_print()} for format of output. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/tkt.c.texi0000644000000000000000000006262512126773203013342 00000000000000@subheading shishi_tkt @anchor{shishi_tkt} @deftypefun {int} {shishi_tkt} (Shishi * @var{handle}, Shishi_tkt ** @var{tkt}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{tkt}: output variable with newly allocated ticket. Create a new ticket handle. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt2 @anchor{shishi_tkt2} @deftypefun {Shishi_tkt *} {shishi_tkt2} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, Shishi_asn1 @var{enckdcreppart}, Shishi_asn1 @var{kdcrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: input variable with ticket. @var{enckdcreppart}: input variable with auxiliary ticket information. @var{kdcrep}: input variable with KDC-REP ticket information. Create a new ticket handle. @strong{Return value:} Returns new ticket handle, or @code{NULL} on error. @end deftypefun @subheading shishi_tkt_done @anchor{shishi_tkt_done} @deftypefun {void} {shishi_tkt_done} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Deallocate resources associated with ticket. The ticket must not be used again after this call. @end deftypefun @subheading shishi_tkt_ticket @anchor{shishi_tkt_ticket} @deftypefun {Shishi_asn1} {shishi_tkt_ticket} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Get ASN.1 Ticket structure from ticket. @strong{Return value:} Returns actual ticket. @end deftypefun @subheading shishi_tkt_ticket_set @anchor{shishi_tkt_ticket_set} @deftypefun {void} {shishi_tkt_ticket_set} (Shishi_tkt * @var{tkt}, Shishi_asn1 @var{ticket}) @var{tkt}: input variable with ticket info. @var{ticket}: ASN.1 Ticket to store in ticket. Set the ASN.1 Ticket in the Ticket. @end deftypefun @subheading shishi_tkt_enckdcreppart @anchor{shishi_tkt_enckdcreppart} @deftypefun {Shishi_asn1} {shishi_tkt_enckdcreppart} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Get ASN.1 EncKDCRepPart structure from ticket. @strong{Return value:} Returns auxiliary ticket information. @end deftypefun @subheading shishi_tkt_enckdcreppart_set @anchor{shishi_tkt_enckdcreppart_set} @deftypefun {void} {shishi_tkt_enckdcreppart_set} (Shishi_tkt * @var{tkt}, Shishi_asn1 @var{enckdcreppart}) @var{tkt}: structure that holds information about Ticket exchange @var{enckdcreppart}: EncKDCRepPart to store in Ticket. Set the EncKDCRepPart in the Ticket. @end deftypefun @subheading shishi_tkt_kdcrep @anchor{shishi_tkt_kdcrep} @deftypefun {Shishi_asn1} {shishi_tkt_kdcrep} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Get ASN.1 KDCRep structure from ticket. @strong{Return value:} Returns KDC-REP information. @end deftypefun @subheading shishi_tkt_encticketpart @anchor{shishi_tkt_encticketpart} @deftypefun {Shishi_asn1} {shishi_tkt_encticketpart} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Get ASN.1 EncTicketPart structure from ticket. @strong{Return value:} Returns EncTicketPart information. @end deftypefun @subheading shishi_tkt_encticketpart_set @anchor{shishi_tkt_encticketpart_set} @deftypefun {void} {shishi_tkt_encticketpart_set} (Shishi_tkt * @var{tkt}, Shishi_asn1 @var{encticketpart}) @var{tkt}: input variable with ticket info. @var{encticketpart}: encticketpart to store in ticket. Set the EncTicketPart in the Ticket. @end deftypefun @subheading shishi_tkt_key @anchor{shishi_tkt_key} @deftypefun {Shishi_key *} {shishi_tkt_key} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again. @strong{Return value:} Returns key extracted from EncKDCRepPart or EncTicketPart. @end deftypefun @subheading shishi_tkt_key_set @anchor{shishi_tkt_key_set} @deftypefun {int} {shishi_tkt_key_set} (Shishi_tkt * @var{tkt}, Shishi_key * @var{key}) @var{tkt}: input variable with ticket info. @var{key}: key to store in ticket. Set the key in the EncTicketPart. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_client @anchor{shishi_tkt_client} @deftypefun {int} {shishi_tkt_client} (Shishi_tkt * @var{tkt}, char ** @var{client}, size_t * @var{clientlen}) @var{tkt}: input variable with ticket info. @var{client}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Represent client principal name in Ticket KDC-REP as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_client_p @anchor{shishi_tkt_client_p} @deftypefun {int} {shishi_tkt_client_p} (Shishi_tkt * @var{tkt}, const char * @var{client}) @var{tkt}: input variable with ticket info. @var{client}: client name of ticket. Determine if ticket is for specified client. @strong{Return value:} Returns non-0 iff ticket is for specified client. @end deftypefun @subheading shishi_tkt_clientrealm @anchor{shishi_tkt_clientrealm} @deftypefun {int} {shishi_tkt_clientrealm} (Shishi_tkt * @var{tkt}, char ** @var{client}, size_t * @var{clientlen}) @var{tkt}: input variable with ticket info. @var{client}: pointer to newly allocated zero terminated string containing principal name and realm. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_clientrealm_p @anchor{shishi_tkt_clientrealm_p} @deftypefun {int} {shishi_tkt_clientrealm_p} (Shishi_tkt * @var{tkt}, const char * @var{client}) @var{tkt}: input variable with ticket info. @var{client}: principal name (client name and realm) of ticket. Determine if ticket is for specified client principal. @strong{Return value:} Returns non-0 iff ticket is for specified client principal. @end deftypefun @subheading shishi_tkt_realm @anchor{shishi_tkt_realm} @deftypefun {int} {shishi_tkt_realm} (Shishi_tkt * @var{tkt}, char ** @var{realm}, size_t * @var{realmlen}) @var{tkt}: input variable with ticket info. @var{realm}: pointer to newly allocated character array with realm name. @var{realmlen}: length of newly allocated character array with realm name. Extract realm of server in ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_server @anchor{shishi_tkt_server} @deftypefun {int} {shishi_tkt_server} (Shishi_tkt * @var{tkt}, char ** @var{server}, size_t * @var{serverlen}) @var{tkt}: input variable with ticket info. @var{server}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{serverlen}). @var{serverlen}: pointer to length of @code{server} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{server}). Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{serverlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_server_p @anchor{shishi_tkt_server_p} @deftypefun {int} {shishi_tkt_server_p} (Shishi_tkt * @var{tkt}, const char * @var{server}) @var{tkt}: input variable with ticket info. @var{server}: server name of ticket. Determine if ticket is for specified server. @strong{Return value:} Returns non-0 iff ticket is for specified server. @end deftypefun @subheading shishi_tkt_flags @anchor{shishi_tkt_flags} @deftypefun {int} {shishi_tkt_flags} (Shishi_tkt * @var{tkt}, uint32_t * @var{flags}) @var{tkt}: input variable with ticket info. @var{flags}: pointer to output integer with flags. Extract flags in ticket (i.e., EncKDCRepPart). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_flags_set @anchor{shishi_tkt_flags_set} @deftypefun {int} {shishi_tkt_flags_set} (Shishi_tkt * @var{tkt}, uint32_t @var{flags}) @var{tkt}: input variable with ticket info. @var{flags}: integer with flags to store in ticket. Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_flags_add @anchor{shishi_tkt_flags_add} @deftypefun {int} {shishi_tkt_flags_add} (Shishi_tkt * @var{tkt}, uint32_t @var{flag}) @var{tkt}: input variable with ticket info. @var{flag}: integer with flags to store in ticket. Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_forwardable_p @anchor{shishi_tkt_forwardable_p} @deftypefun {int} {shishi_tkt_forwardable_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is forwardable. The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket. @strong{Return value:} Returns non-0 iff forwardable flag is set in ticket. @end deftypefun @subheading shishi_tkt_forwarded_p @anchor{shishi_tkt_forwarded_p} @deftypefun {int} {shishi_tkt_forwarded_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is forwarded. The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets. @strong{Return value:} Returns non-0 iff forwarded flag is set in ticket. @end deftypefun @subheading shishi_tkt_proxiable_p @anchor{shishi_tkt_proxiable_p} @deftypefun {int} {shishi_tkt_proxiable_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is proxiable. The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket. @strong{Return value:} Returns non-0 iff proxiable flag is set in ticket. @end deftypefun @subheading shishi_tkt_proxy_p @anchor{shishi_tkt_proxy_p} @deftypefun {int} {shishi_tkt_proxy_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is proxy ticket. The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail. @strong{Return value:} Returns non-0 iff proxy flag is set in ticket. @end deftypefun @subheading shishi_tkt_may_postdate_p @anchor{shishi_tkt_may_postdate_p} @deftypefun {int} {shishi_tkt_may_postdate_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket may be used to grant postdated tickets. The MAY-POSTDATE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. This flag MUST be set in a ticket-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket-granting ticket; postdated ticket-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime-starttime) of a postdated ticket will be the remaining life of the ticket-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime-starttime) of the ticket-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated. @strong{Return value:} Returns non-0 iff may-postdate flag is set in ticket. @end deftypefun @subheading shishi_tkt_postdated_p @anchor{shishi_tkt_postdated_p} @deftypefun {int} {shishi_tkt_postdated_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is postdated. The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use. @strong{Return value:} Returns non-0 iff postdated flag is set in ticket. @end deftypefun @subheading shishi_tkt_invalid_p @anchor{shishi_tkt_invalid_p} @deftypefun {int} {shishi_tkt_invalid_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is invalid. The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot-list mechanism). @strong{Return value:} Returns non-0 iff invalid flag is set in ticket. @end deftypefun @subheading shishi_tkt_renewable_p @anchor{shishi_tkt_renewable_p} @deftypefun {int} {shishi_tkt_renewable_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is renewable. The RENEWABLE flag in a ticket is normally only interpreted by the ticket-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets. @strong{Return value:} Returns non-0 iff renewable flag is set in ticket. @end deftypefun @subheading shishi_tkt_initial_p @anchor{shishi_tkt_initial_p} @deftypefun {int} {shishi_tkt_initial_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket was issued using AS exchange. The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client. @strong{Return value:} Returns non-0 iff initial flag is set in ticket. @end deftypefun @subheading shishi_tkt_pre_authent_p @anchor{shishi_tkt_pre_authent_p} @deftypefun {int} {shishi_tkt_pre_authent_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket was pre-authenticated. The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket). @strong{Return value:} Returns non-0 iff pre-authent flag is set in ticket. @end deftypefun @subheading shishi_tkt_hw_authent_p @anchor{shishi_tkt_hw_authent_p} @deftypefun {int} {shishi_tkt_hw_authent_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is authenticated using a hardware token. The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket). @strong{Return value:} Returns non-0 iff hw-authent flag is set in ticket. @end deftypefun @subheading shishi_tkt_transited_policy_checked_p @anchor{shishi_tkt_transited_policy_checked_p} @deftypefun {int} {shishi_tkt_transited_policy_checked_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket has been policy checked for transit. The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list. While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross-realm authentication. When the KDC applies such checks and accepts such cross-realm authentication it will set the TRANSITED-POLICY-CHECKED flag in the service tickets it issues based on the cross-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required to honor this flag. Application servers MUST either do the transited-realm checks themselves, or reject cross-realm tickets without TRANSITED-POLICY- CHECKED set. @strong{Return value:} Returns non-0 iff transited-policy-checked flag is set in ticket. @end deftypefun @subheading shishi_tkt_ok_as_delegate_p @anchor{shishi_tkt_ok_as_delegate_p} @deftypefun {int} {shishi_tkt_ok_as_delegate_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is ok as delegated ticket. The copy of the ticket flags in the encrypted part of the KDC reply may have the OK-AS-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials. @strong{Return value:} Returns non-0 iff ok-as-delegate flag is set in ticket. @end deftypefun @subheading shishi_tkt_keytype @anchor{shishi_tkt_keytype} @deftypefun {int} {shishi_tkt_keytype} (Shishi_tkt * @var{tkt}, int32_t * @var{etype}) @var{tkt}: input variable with ticket info. @var{etype}: pointer to encryption type that is set, see Shishi_etype. Extract encryption type of key in ticket (really EncKDCRepPart). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_tkt_keytype_fast @anchor{shishi_tkt_keytype_fast} @deftypefun {int32_t} {shishi_tkt_keytype_fast} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Extract encryption type of key in ticket (really EncKDCRepPart). @strong{Return value:} Returns encryption type of session key in ticket (really EncKDCRepPart), or -1 on error. @end deftypefun @subheading shishi_tkt_keytype_p @anchor{shishi_tkt_keytype_p} @deftypefun {int} {shishi_tkt_keytype_p} (Shishi_tkt * @var{tkt}, int32_t @var{etype}) @var{tkt}: input variable with ticket info. @var{etype}: encryption type, see Shishi_etype. Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type). @strong{Return value:} Returns non-0 iff key in ticket is of specified encryption type. @end deftypefun @subheading shishi_tkt_lastreqc @anchor{shishi_tkt_lastreqc} @deftypefun {time_t} {shishi_tkt_lastreqc} (Shishi_tkt * @var{tkt}, Shishi_lrtype @var{lrtype}) @var{tkt}: input variable with ticket info. @var{lrtype}: lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST. Extract C time corresponding to given lastreq type field in the ticket. @strong{Return value:} Returns C time interpretation of the specified lastreq field, or (time_t) -1. @end deftypefun @subheading shishi_tkt_authctime @anchor{shishi_tkt_authctime} @deftypefun {time_t} {shishi_tkt_authctime} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket. @strong{Return value:} Returns C time interpretation of the endtime in ticket. @end deftypefun @subheading shishi_tkt_startctime @anchor{shishi_tkt_startctime} @deftypefun {time_t} {shishi_tkt_startctime} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past). @strong{Return value:} Returns C time interpretation of the endtime in ticket. @end deftypefun @subheading shishi_tkt_endctime @anchor{shishi_tkt_endctime} @deftypefun {time_t} {shishi_tkt_endctime} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid. @strong{Return value:} Returns C time interpretation of the endtime in ticket. @end deftypefun @subheading shishi_tkt_renew_tillc @anchor{shishi_tkt_renew_tillc} @deftypefun {time_t} {shishi_tkt_renew_tillc} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Extract C time corresponding to the renew-till field. The field holds the time where the ticket stop being valid for renewal. @strong{Return value:} Returns C time interpretation of the renew-till in ticket. @end deftypefun @subheading shishi_tkt_valid_at_time_p @anchor{shishi_tkt_valid_at_time_p} @deftypefun {int} {shishi_tkt_valid_at_time_p} (Shishi_tkt * @var{tkt}, time_t @var{now}) @var{tkt}: input variable with ticket info. @var{now}: time to check for. Determine if ticket is valid at a specific point in time. @strong{Return value:} Returns non-0 iff ticket is valid (not expired and after starttime) at specified time. @end deftypefun @subheading shishi_tkt_valid_now_p @anchor{shishi_tkt_valid_now_p} @deftypefun {int} {shishi_tkt_valid_now_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket is valid now. @strong{Return value:} Returns 0 iff ticket is invalid (expired or not yet valid). @end deftypefun @subheading shishi_tkt_expired_p @anchor{shishi_tkt_expired_p} @deftypefun {int} {shishi_tkt_expired_p} (Shishi_tkt * @var{tkt}) @var{tkt}: input variable with ticket info. Determine if ticket has expired (i.e., endtime is in the past). @strong{Return value:} Returns 0 iff ticket has expired. @end deftypefun @subheading shishi_tkt_lastreq_pretty_print @anchor{shishi_tkt_lastreq_pretty_print} @deftypefun {void} {shishi_tkt_lastreq_pretty_print} (Shishi_tkt * @var{tkt}, FILE * @var{fh}) @var{tkt}: input variable with ticket info. @var{fh}: file handle open for writing. Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart). @end deftypefun @subheading shishi_tkt_pretty_print @anchor{shishi_tkt_pretty_print} @deftypefun {void} {shishi_tkt_pretty_print} (Shishi_tkt * @var{tkt}, FILE * @var{fh}) @var{tkt}: input variable with ticket info. @var{fh}: file handle open for writing. Print a human readable representation of a ticket to file handle. @end deftypefun shishi-1.0.2/doc/texi/netio.c.texi0000644000000000000000000000350312126773202013643 00000000000000@subheading shishi_kdc_sendrecv_hint @anchor{shishi_kdc_sendrecv_hint} @deftypefun {int} {shishi_kdc_sendrecv_hint} (Shishi * @var{handle}, const char * @var{realm}, const char * @var{indata}, size_t @var{inlen}, char ** @var{outdata}, size_t * @var{outlen}, Shishi_tkts_hint * @var{hint}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{realm}: string with realm name. @var{indata}: Packet to send to KDC. @var{inlen}: Length of @code{indata}. @var{outdata}: Newly allocated string with data returned from KDC. @var{outlen}: Length of @code{outdata}. @var{hint}: a @code{Shishi_tkts_hint} structure with flags. Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname. @strong{Returns:} @code{SHISHI_OK} on success, @code{SHISHI_KDC_TIMEOUT} if a timeout was reached, or other errors. @end deftypefun @subheading shishi_kdc_sendrecv @anchor{shishi_kdc_sendrecv} @deftypefun {int} {shishi_kdc_sendrecv} (Shishi * @var{handle}, const char * @var{realm}, const char * @var{indata}, size_t @var{inlen}, char ** @var{outdata}, size_t * @var{outlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{realm}: string with realm name. @var{indata}: Packet to send to KDC. @var{inlen}: Length of @code{indata}. @var{outdata}: Newly allocated string with data returned from KDC. @var{outlen}: Length of @code{outdata}. Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname. @strong{Returns:} @code{SHISHI_OK} on success, @code{SHISHI_KDC_TIMEOUT} if a timeout was reached, or other errors. @end deftypefun shishi-1.0.2/doc/texi/ccache.c.texi0000644000000000000000000000000012126773202013720 00000000000000shishi-1.0.2/doc/texi/cfg.c.texi0000644000000000000000000001205612126773202013267 00000000000000@subheading shishi_cfg @anchor{shishi_cfg} @deftypefun {int} {shishi_cfg} (Shishi * @var{handle}, const char * @var{option}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{option}: string with shishi library option. Configure shishi library with given option. @strong{Return Value:} Returns SHISHI_OK if option was valid. @end deftypefun @subheading shishi_cfg_from_file @anchor{shishi_cfg_from_file} @deftypefun {int} {shishi_cfg_from_file} (Shishi * @var{handle}, const char * @var{cfg}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{cfg}: filename to read configuration from. Configure shishi library using configuration file. @strong{Return Value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_cfg_print @anchor{shishi_cfg_print} @deftypefun {int} {shishi_cfg_print} (Shishi * @var{handle}, FILE * @var{fh}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{fh}: file descriptor opened for writing. Print library configuration status, mostly for debugging purposes. @strong{Return Value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_cfg_default_systemfile @anchor{shishi_cfg_default_systemfile} @deftypefun {const char *} {shishi_cfg_default_systemfile} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. The system configuration file name is decided at compile-time, but may be overridden by the environment variable SHISHI_CONFIG. @strong{Return value:} Return system configuration file name. @end deftypefun @subheading shishi_cfg_default_userdirectory @anchor{shishi_cfg_default_userdirectory} @deftypefun {const char *} {shishi_cfg_default_userdirectory} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. The default user directory (used for, e.g. Shishi ticket cache) is normally computed by appending BASE_DIR ("/.shishi") to the content of the environment variable $HOME, but can be overridden by specifying the complete path in the environment variable SHISHI_HOME. @strong{Return value:} Return directory with configuration files etc. @end deftypefun @subheading shishi_cfg_userdirectory_file @anchor{shishi_cfg_userdirectory_file} @deftypefun {char *} {shishi_cfg_userdirectory_file} (Shishi * @var{handle}, const char * @var{file}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{file}: basename of file to find in user directory. Get the full path to specified @code{file} in the users' configuration directory. @strong{Return value:} Return full path to given relative filename, relative to the user specific Shishi configuration directory as returned by @code{shishi_cfg_default_userdirectory()} (typically $HOME/.shishi). @end deftypefun @subheading shishi_cfg_default_userfile @anchor{shishi_cfg_default_userfile} @deftypefun {const char *} {shishi_cfg_default_userfile} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Get filename of default user configuration file, typically $HOME/shishi.conf. @strong{Return value:} Return user configuration filename. @end deftypefun @subheading shishi_cfg_clientkdcetype @anchor{shishi_cfg_clientkdcetype} @deftypefun {int} {shishi_cfg_clientkdcetype} (Shishi * @var{handle}, int32_t ** @var{etypes}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{etypes}: output array with encryption types. Set the etypes variable to the array of preferred client etypes. @strong{Return value:} Return the number of encryption types in the array, 0 means none. @end deftypefun @subheading shishi_cfg_clientkdcetype_fast @anchor{shishi_cfg_clientkdcetype_fast} @deftypefun {int32_t} {shishi_cfg_clientkdcetype_fast} (Shishi * @var{handle}) @var{handle}: Shishi library handle create by @code{shishi_init()}. Extract the default etype from the list of preferred client etypes. @strong{Return value:} Return the default encryption types. @end deftypefun @subheading shishi_cfg_clientkdcetype_set @anchor{shishi_cfg_clientkdcetype_set} @deftypefun {int} {shishi_cfg_clientkdcetype_set} (Shishi * @var{handle}, char * @var{value}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{value}: string with encryption types. Set the "client-kdc-etypes" configuration option from given string. The string contains encryption types (integer or names) separated by comma or whitespace, e.g. "aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5". @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_cfg_authorizationtype_set @anchor{shishi_cfg_authorizationtype_set} @deftypefun {int} {shishi_cfg_authorizationtype_set} (Shishi * @var{handle}, char * @var{value}) @var{handle}: Shishi library handle created by @code{shishi_init()}. @var{value}: string with authorization types. Set the "authorization-types" configuration option from given string. The string contains authorization types (integer or names) separated by comma or whitespace, e.g. "basic k5login". @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun shishi-1.0.2/doc/texi/as.c.texi0000644000000000000000000002015212126773202013127 00000000000000@subheading shishi_as @anchor{shishi_as} @deftypefun {int} {shishi_as} (Shishi * @var{handle}, Shishi_as ** @var{as}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{as}: holds pointer to newly allocate Shishi_as structure. Allocate a new AS exchange variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_done @anchor{shishi_as_done} @deftypefun {void} {shishi_as_done} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle. @end deftypefun @subheading shishi_as_req @anchor{shishi_as_req} @deftypefun {Shishi_asn1} {shishi_as_req} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Get ASN.1 AS-REQ structure from AS exchange. @strong{Return value:} Returns the generated AS-REQ packet from the AS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_as_req_build @anchor{shishi_as_req_build} @deftypefun {int} {shishi_as_req_build} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Possibly remove unset fields (e.g., rtime). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_req_set @anchor{shishi_as_req_set} @deftypefun {void} {shishi_as_req_set} (Shishi_as * @var{as}, Shishi_asn1 @var{asreq}) @var{as}: structure that holds information about AS exchange @var{asreq}: asreq to store in AS. Set the AS-REQ in the AS exchange. @end deftypefun @subheading shishi_as_req_der @anchor{shishi_as_req_der} @deftypefun {int} {shishi_as_req_der} (Shishi_as * @var{as}, char ** @var{out}, size_t * @var{outlen}) @var{as}: structure that holds information about AS exchange @var{out}: output array with newly allocated DER encoding of AS-REQ. @var{outlen}: length of output array with DER encoding of AS-REQ. DER encode AS-REQ. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_req_der_set @anchor{shishi_as_req_der_set} @deftypefun {int} {shishi_as_req_der_set} (Shishi_as * @var{as}, char * @var{der}, size_t @var{derlen}) @var{as}: structure that holds information about AS exchange @var{der}: input array with DER encoded AP-REQ. @var{derlen}: length of input array with DER encoded AP-REQ. DER decode AS-REQ and set it AS exchange. If decoding fails, the AS-REQ in the AS exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_as_rep @anchor{shishi_as_rep} @deftypefun {Shishi_asn1} {shishi_as_rep} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Get ASN.1 AS-REP structure from AS exchange. @strong{Return value:} Returns the received AS-REP packet from the AS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_as_rep_process @anchor{shishi_as_rep_process} @deftypefun {int} {shishi_as_rep_process} (Shishi_as * @var{as}, Shishi_key * @var{key}, const char * @var{password}) @var{as}: structure that holds information about AS exchange @var{key}: user's key, used to encrypt the encrypted part of the AS-REP. @var{password}: user's password, used if key is NULL. Process new AS-REP and set ticket. The key is used to decrypt the AP-REP. If both key and password is NULL, the user is queried for it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_rep_build @anchor{shishi_as_rep_build} @deftypefun {int} {shishi_as_rep_build} (Shishi_as * @var{as}, Shishi_key * @var{key}) @var{as}: structure that holds information about AS exchange @var{key}: user's key, used to encrypt the encrypted part of the AS-REP. Build AS-REP. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_rep_der @anchor{shishi_as_rep_der} @deftypefun {int} {shishi_as_rep_der} (Shishi_as * @var{as}, char ** @var{out}, size_t * @var{outlen}) @var{as}: structure that holds information about AS exchange @var{out}: output array with newly allocated DER encoding of AS-REP. @var{outlen}: length of output array with DER encoding of AS-REP. DER encode AS-REP. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_rep_set @anchor{shishi_as_rep_set} @deftypefun {void} {shishi_as_rep_set} (Shishi_as * @var{as}, Shishi_asn1 @var{asrep}) @var{as}: structure that holds information about AS exchange @var{asrep}: asrep to store in AS. Set the AS-REP in the AS exchange. @end deftypefun @subheading shishi_as_rep_der_set @anchor{shishi_as_rep_der_set} @deftypefun {int} {shishi_as_rep_der_set} (Shishi_as * @var{as}, char * @var{der}, size_t @var{derlen}) @var{as}: structure that holds information about AS exchange @var{der}: input array with DER encoded AP-REP. @var{derlen}: length of input array with DER encoded AP-REP. DER decode AS-REP and set it AS exchange. If decoding fails, the AS-REP in the AS exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_as_krberror @anchor{shishi_as_krberror} @deftypefun {Shishi_asn1} {shishi_as_krberror} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Get ASN.1 KRB-ERROR structure from AS exchange. @strong{Return value:} Returns the received KRB-ERROR packet from the AS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_as_krberror_der @anchor{shishi_as_krberror_der} @deftypefun {int} {shishi_as_krberror_der} (Shishi_as * @var{as}, char ** @var{out}, size_t * @var{outlen}) @var{as}: structure that holds information about AS exchange @var{out}: output array with newly allocated DER encoding of KRB-ERROR. @var{outlen}: length of output array with DER encoding of KRB-ERROR. DER encode KRB-ERROR. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_krberror_set @anchor{shishi_as_krberror_set} @deftypefun {void} {shishi_as_krberror_set} (Shishi_as * @var{as}, Shishi_asn1 @var{krberror}) @var{as}: structure that holds information about AS exchange @var{krberror}: krberror to store in AS. Set the KRB-ERROR in the AS exchange. @end deftypefun @subheading shishi_as_tkt @anchor{shishi_as_tkt} @deftypefun {Shishi_tkt *} {shishi_as_tkt} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Get Ticket in AS exchange. @strong{Return value:} Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_as_tkt_set @anchor{shishi_as_tkt_set} @deftypefun {void} {shishi_as_tkt_set} (Shishi_as * @var{as}, Shishi_tkt * @var{tkt}) @var{as}: structure that holds information about AS exchange @var{tkt}: tkt to store in AS. Set the Tkt in the AS exchange. @end deftypefun @subheading shishi_as_sendrecv_hint @anchor{shishi_as_sendrecv_hint} @deftypefun {int} {shishi_as_sendrecv_hint} (Shishi_as * @var{as}, Shishi_tkts_hint * @var{hint}) @var{as}: structure that holds information about AS exchange @var{hint}: additional parameters that modify connection behaviour, or @code{NULL}. Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The @code{hint} structure can be used to set, e.g., parameters for TLS authentication. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_as_sendrecv @anchor{shishi_as_sendrecv} @deftypefun {int} {shishi_as_sendrecv} (Shishi_as * @var{as}) @var{as}: structure that holds information about AS exchange Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/core.c.texi0000644000000000000000000002310412126773203013455 00000000000000@subheading shisa_enumerate_realms @anchor{shisa_enumerate_realms} @deftypefun {int} {shisa_enumerate_realms} (Shisa * @var{dbh}, char *** @var{realms}, size_t * @var{nrealms}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realms}: Pointer to newly allocated array of newly allocated zero-terminated UTF-8 strings indicating name of realm. @var{nrealms}: Pointer to number indicating number of allocated realm strings. Extract a list of all realm names in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. @strong{Return value:} Returns SHISA_OK on success, or error code. @end deftypefun @subheading shisa_enumerate_principals @anchor{shisa_enumerate_principals} @deftypefun {int} {shisa_enumerate_principals} (Shisa * @var{dbh}, const char * @var{realm}, char *** @var{principals}, size_t * @var{nprincipals}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm, as zero-terminated UTF-8 string. @var{nprincipals}: Pointer to number indicating number of allocated realm strings. Extract a list of all principal names in realm in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. @strong{Return value:} Returns SHISA_OK on success, SHISA_NO_REALM if the specified realm does not exist, or error code. @end deftypefun @subheading shisa_principal_find @anchor{shisa_principal_find} @deftypefun {int} {shisa_principal_find} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, Shisa_principal * @var{ph}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to get information on. @var{ph}: Pointer to previously allocated principal structure to fill out with information about principal. Extract information about given PRINCIPAL@code{REALM}. @strong{Return value:} Returns @code{SHISA_OK} iff successful, @code{SHISA_NO_REALM} if the indicated realm does not exist, @code{SHISA_NO_PRINCIPAL} if the indicated principal does not exist, or an error code. @end deftypefun @subheading shisa_principal_update @anchor{shisa_principal_update} @deftypefun {int} {shisa_principal_update} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_principal * @var{ph}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to get information on. @var{ph}: Pointer to principal structure with information to store in database. Modify information stored for given PRINCIPAL@code{REALM}. Note that it is usually a good idea to only set the fields in @code{ph} that you actually want to update. Specifically, first calling @code{shisa_principal_find()} to get the current information, then modifying one field, and calling @code{shisa_principal_update()} is not recommended in general, as this will 1) overwrite any modifications made to other fields between the two calls (by other processes) and 2) will cause all values to be written again, which may generate more overhead. @strong{Return value:} Returns SHISA_OK if successful, @code{SHISA_NO_REALM} if the indicated realm does not exist, @code{SHISA_NO_PRINCIPAL} if the indicated principal does not exist, or an error code. @end deftypefun @subheading shisa_principal_add @anchor{shisa_principal_add} @deftypefun {int} {shisa_principal_add} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_principal * @var{ph}, const Shisa_key * @var{key}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to add, may be @code{NULL} to indicate that the @code{realm} should be created, in which case @code{ph} and @code{key} are not used. @var{ph}: Pointer to principal structure with information to store in database. @var{key}: Pointer to key structure with information to store in database. Add given information to database as PRINCIPAL@code{REALM}. @strong{Return value:} Returns SHISA_OK iff successfully added, or an error code. @end deftypefun @subheading shisa_principal_remove @anchor{shisa_principal_remove} @deftypefun {int} {shisa_principal_remove} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to remove, may be @code{NULL} to indicate that the @code{realm} itself should be removed (requires that the realm to be empty). Remove all information stored in the database for given PRINCIPAL@code{REALM}. @strong{Return value:} Returns @code{SHISA_OK} if successful, or an error code. @end deftypefun @subheading shisa_keys_find @anchor{shisa_keys_find} @deftypefun {int} {shisa_keys_find} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_key * @var{hint}, Shisa_key *** @var{keys}, size_t * @var{nkeys}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to add key for. @var{hint}: Pointer to Shisa key structure with hints on matching the key to modify, may be @code{NULL} to match all keys. @var{keys}: pointer to newly allocated array with Shisa key structures. @var{nkeys}: pointer to number of newly allocated Shisa key structures in @code{keys}. Iterate through keys for given PRINCIPAL@code{REALM} and extract any keys that match @code{hint}. Not all elements of @code{hint} need to be filled out, only use the fields you are interested in. For example, if you want to extract all keys with an etype of 3 (DES-CBC-MD5), set the @code{key}->etype field to 3, and set all other fields to 0. @strong{Return value:} Returns @code{SHISA_OK} iff successful, or an error code. @end deftypefun @subheading shisa_key_add @anchor{shisa_key_add} @deftypefun {int} {shisa_key_add} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_key * @var{key}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to add key for. @var{key}: Pointer to Shisa key structure with key to add. Add key to database for given PRINCIPAL@code{REALM}. @strong{Return value:} Returns @code{SHISA_OK} iff successful, or an error code. @end deftypefun @subheading shisa_key_update @anchor{shisa_key_update} @deftypefun {int} {shisa_key_update} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_key * @var{oldkey}, const Shisa_key * @var{newkey}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to remove key for. @var{oldkey}: Pointer to Shisa key structure with hints on matching the key to modify. @var{newkey}: Pointer to Shisa key structure with new values for the key, note that all fields are used (and not just the ones specified by @code{oldkey}). Modify data about a key in the database, for the given PRINCIPAL@code{REALM}. First the @code{oldkey} is used to locate the key to update (similar to @code{shisa_keys_find()}), then that key is modified to contain whatever information is stored in @code{newkey}. Not all elements of @code{oldkey} need to be filled out, only enough as to identify the key uniquely. For example, if you want to modify the information stored for the only key with an etype of 3 (DES-CBC-MD5), set the @code{key}->etype field to 3, and set all other fields to 0. @strong{Return value:} Returns @code{SHISA_OK} on success, @code{SHISA_NO_KEY} if no key could be identified, and @code{SHISA_MULTIPLE_KEY_MATCH} if more than one key matched the given criteria, or an error code. @end deftypefun @subheading shisa_key_remove @anchor{shisa_key_remove} @deftypefun {int} {shisa_key_remove} (Shisa * @var{dbh}, const char * @var{realm}, const char * @var{principal}, const Shisa_key * @var{key}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{realm}: Name of realm the principal belongs in. @var{principal}: Name of principal to remove key for. @var{key}: Pointer to Shisa key structure with hints on matching the key to remove. Remove a key, matching the hints in @code{key}, from the Shisa database for the user PRINCIPAL@code{REALM}. Not all elements of @code{key} need to be filled out, only those you are interested in. For example, if you want to remove the only key with an etype of 3 (DES-CBC-MD5), set the @code{key}->etype field to 3, and set all other fields to 0. @strong{Return value:} Returns @code{SHISA_OK} on success, @code{SHISA_NO_KEY} if no key could be identified, and @code{SHISA_MULTIPLE_KEY_MATCH} if more than one key matched the given criteria, or an error code. @end deftypefun @subheading shisa_key_free @anchor{shisa_key_free} @deftypefun {void} {shisa_key_free} (Shisa * @var{dbh}, Shisa_key * @var{key}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{key}: Pointer to Shisa key structure to deallocate. Deallocate the fields of a Shisa key structure, and the structure itself. @end deftypefun @subheading shisa_keys_free @anchor{shisa_keys_free} @deftypefun {void} {shisa_keys_free} (Shisa * @var{dbh}, Shisa_key ** @var{keys}, size_t @var{nkeys}) @var{dbh}: Shisa library handle created by @code{shisa()}. @var{keys}: Pointer to array with @code{nkeys} elements of keys. @var{nkeys}: Number of key elements in @code{keys} array. Deallocate each element of an array with Shisa database keys, using @code{shisa_key_free()}. @end deftypefun shishi-1.0.2/doc/texi/kdc.c.texi0000644000000000000000000001714312126773202013273 00000000000000@subheading shishi_as_derive_salt @anchor{shishi_as_derive_salt} @deftypefun {int} {shishi_as_derive_salt} (Shishi * @var{handle}, Shishi_asn1 @var{asreq}, Shishi_asn1 @var{asrep}, char ** @var{salt}, size_t * @var{saltlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{asreq}: input AS-REQ variable. @var{asrep}: input AS-REP variable. @var{salt}: newly allocated output array with salt. @var{saltlen}: holds actual size of output array with salt. Derive the salt that should be used when deriving a key via @code{shishi_string_to_key()} for an AS exchange. Currently this searches for PA-DATA of type SHISHI_PA_PW_SALT in the AS-REP and returns it if found, otherwise the salt is derived from the client name and realm in AS-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdc_copy_crealm @anchor{shishi_kdc_copy_crealm} @deftypefun {int} {shishi_kdc_copy_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_asn1 @var{encticketpart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REP to read crealm from. @var{encticketpart}: EncTicketPart to set crealm in. Set crealm in KDC-REP to value in EncTicketPart. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_as_check_crealm @anchor{shishi_as_check_crealm} @deftypefun {int} {shishi_as_check_crealm} (Shishi * @var{handle}, Shishi_asn1 @var{asreq}, Shishi_asn1 @var{asrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{asreq}: AS-REQ to compare realm field in. @var{asrep}: AS-REP to compare realm field in. Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see @code{shishi_kdc_process()}. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_REALM_MISMATCH if the values differ, or an error code. @end deftypefun @subheading shishi_kdc_copy_cname @anchor{shishi_kdc_copy_cname} @deftypefun {int} {shishi_kdc_copy_cname} (Shishi * @var{handle}, Shishi_asn1 @var{kdcrep}, Shishi_asn1 @var{encticketpart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcrep}: KDC-REQ to read cname from. @var{encticketpart}: EncTicketPart to set cname in. Set cname in KDC-REP to value in EncTicketPart. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_as_check_cname @anchor{shishi_as_check_cname} @deftypefun {int} {shishi_as_check_cname} (Shishi * @var{handle}, Shishi_asn1 @var{asreq}, Shishi_asn1 @var{asrep}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{asreq}: AS-REQ to compare client name field in. @var{asrep}: AS-REP to compare client name field in. Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see @code{shishi_kdc_process()}. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_CNAME_MISMATCH if the values differ, or an error code. @end deftypefun @subheading shishi_kdc_copy_nonce @anchor{shishi_kdc_copy_nonce} @deftypefun {int} {shishi_kdc_copy_nonce} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_asn1 @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to read nonce from. @var{enckdcreppart}: EncKDCRepPart to set nonce in. Set nonce in EncKDCRepPart to value in KDC-REQ. @strong{Return value:} Returns SHISHI_OK if successful. @end deftypefun @subheading shishi_kdc_check_nonce @anchor{shishi_kdc_check_nonce} @deftypefun {int} {shishi_kdc_check_nonce} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_asn1 @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to compare nonce field in. @var{enckdcreppart}: Encrypted KDC-REP part to compare nonce field in. Verify that KDC-REQ.req-body.nonce and EncKDCRepPart.nonce fields matches. This is one of the steps that has to be performed when processing a KDC-REQ and KDC-REP exchange. @strong{Return value:} Returns SHISHI_OK if successful, SHISHI_NONCE_LENGTH_MISMATCH if the nonces have different lengths (usually indicates that buggy server truncated nonce to 4 bytes), SHISHI_NONCE_MISMATCH if the values differ, or an error code. @end deftypefun @subheading shishi_tgs_process @anchor{shishi_tgs_process} @deftypefun {int} {shishi_tgs_process} (Shishi * @var{handle}, Shishi_asn1 @var{tgsreq}, Shishi_asn1 @var{tgsrep}, Shishi_asn1 @var{authenticator}, Shishi_asn1 @var{oldenckdcreppart}, Shishi_asn1 * @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{tgsreq}: input variable that holds the sent KDC-REQ. @var{tgsrep}: input variable that holds the received KDC-REP. @var{authenticator}: input variable with Authenticator from AP-REQ in KDC-REQ. @var{oldenckdcreppart}: input variable with EncKDCRepPart used in request. @var{enckdcreppart}: output variable that holds new EncKDCRepPart. Process a TGS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the ticket used to construct the TGS request and calls @code{shishi_kdc_process()}, which see. @strong{Return value:} Returns SHISHI_OK iff the TGS client exchange was successful. @end deftypefun @subheading shishi_as_process @anchor{shishi_as_process} @deftypefun {int} {shishi_as_process} (Shishi * @var{handle}, Shishi_asn1 @var{asreq}, Shishi_asn1 @var{asrep}, const char * @var{string}, Shishi_asn1 * @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{asreq}: input variable that holds the sent KDC-REQ. @var{asrep}: input variable that holds the received KDC-REP. @var{string}: input variable with zero terminated password. @var{enckdcreppart}: output variable that holds new EncKDCRepPart. Process an AS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the password and calls @code{shishi_kdc_process()}, which see. @strong{Return value:} Returns SHISHI_OK iff the AS client exchange was successful. @end deftypefun @subheading shishi_kdc_process @anchor{shishi_kdc_process} @deftypefun {int} {shishi_kdc_process} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_asn1 @var{kdcrep}, Shishi_key * @var{key}, int @var{keyusage}, Shishi_asn1 * @var{enckdcreppart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: input variable that holds the sent KDC-REQ. @var{kdcrep}: input variable that holds the received KDC-REP. @var{key}: input array with key to decrypt encrypted part of KDC-REP with. @var{keyusage}: kereros key usage value. @var{enckdcreppart}: output variable that holds new EncKDCRepPart. Process a KDC client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. Use @code{shishi_kdcrep_get_ticket()} to extract the ticket. This function verifies the various conditions that must hold if the response is to be considered valid, specifically it compares nonces (@code{shishi_kdc_check_nonce()}) and if the exchange was a AS exchange, it also compares cname and crealm (@code{shishi_as_check_cname()} and @code{shishi_as_check_crealm()}). Usually the @code{shishi_as_process()} and @code{shishi_tgs_process()} functions should be used instead, since they simplify the decryption key computation. @strong{Return value:} Returns SHISHI_OK iff the KDC client exchange was successful. @end deftypefun shishi-1.0.2/doc/texi/key.c.texi0000644000000000000000000002512512126773202013321 00000000000000@subheading shishi_key_principal @anchor{shishi_key_principal} @deftypefun {const char *} {shishi_key_principal} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get the principal part of the key owner principal name, i.e., except the realm. @strong{Return value:} Returns the principal owning the key. (Not a copy of it, so don't modify or deallocate it.) @end deftypefun @subheading shishi_key_principal_set @anchor{shishi_key_principal_set} @deftypefun {void} {shishi_key_principal_set} (Shishi_key * @var{key}, const char * @var{principal}) @var{key}: structure that holds key information @var{principal}: string with new principal name. Set the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_key_realm @anchor{shishi_key_realm} @deftypefun {const char *} {shishi_key_realm} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get the realm part of the key owner principal name. @strong{Return value:} Returns the realm for the principal owning the key. (Not a copy of it, so don't modify or deallocate it.) @end deftypefun @subheading shishi_key_realm_set @anchor{shishi_key_realm_set} @deftypefun {void} {shishi_key_realm_set} (Shishi_key * @var{key}, const char * @var{realm}) @var{key}: structure that holds key information @var{realm}: string with new realm name. Set the realm for the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function. @end deftypefun @subheading shishi_key_type @anchor{shishi_key_type} @deftypefun {int} {shishi_key_type} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get key type. @strong{Return value:} Returns the type of key as an integer as described in the standard. @end deftypefun @subheading shishi_key_type_set @anchor{shishi_key_type_set} @deftypefun {void} {shishi_key_type_set} (Shishi_key * @var{key}, int32_t @var{type}) @var{key}: structure that holds key information @var{type}: type to set in key. Set the type of key in key structure. @end deftypefun @subheading shishi_key_value @anchor{shishi_key_value} @deftypefun {const char *} {shishi_key_value} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get the raw key bytes. @strong{Return value:} Returns the key value as a pointer which is valid throughout the lifetime of the key structure. @end deftypefun @subheading shishi_key_value_set @anchor{shishi_key_value_set} @deftypefun {void} {shishi_key_value_set} (Shishi_key * @var{key}, const char * @var{value}) @var{key}: structure that holds key information @var{value}: input array with key data. Set the key value and length in key structure. The value is copied into the key (in other words, you can deallocate @code{value} right after calling this function without modifying the value inside the key). @end deftypefun @subheading shishi_key_version @anchor{shishi_key_version} @deftypefun {uint32_t} {shishi_key_version} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get the "kvno" (key version) of key. It will be UINT32_MAX if the key is not long-lived. @strong{Return value:} Returns the version of key ("kvno"). @end deftypefun @subheading shishi_key_version_set @anchor{shishi_key_version_set} @deftypefun {void} {shishi_key_version_set} (Shishi_key * @var{key}, uint32_t @var{kvno}) @var{key}: structure that holds key information @var{kvno}: new version integer. Set the version of key ("kvno") in key structure. Use UINT32_MAX for non-ptermanent keys. @end deftypefun @subheading shishi_key_timestamp @anchor{shishi_key_timestamp} @deftypefun {time_t} {shishi_key_timestamp} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Get the time the key was established. Typically only present when the key was imported from a keytab format. @strong{Return value:} Returns the time the key was established, or (time_t)-1 if not available. @strong{Since:} 0.0.42 @end deftypefun @subheading shishi_key_timestamp_set @anchor{shishi_key_timestamp_set} @deftypefun {void} {shishi_key_timestamp_set} (Shishi_key * @var{key}, time_t @var{timestamp}) @var{key}: structure that holds key information @var{timestamp}: new timestamp. Set the time the key was established. Typically only relevant when exporting the key to keytab format. @strong{Since:} 0.0.42 @end deftypefun @subheading shishi_key_name @anchor{shishi_key_name} @deftypefun {const char *} {shishi_key_name} (Shishi_key * @var{key}) @var{key}: structure that holds key information Calls shishi_cipher_name for key type. @strong{Return value:} Return name of key. @end deftypefun @subheading shishi_key_length @anchor{shishi_key_length} @deftypefun {size_t} {shishi_key_length} (const Shishi_key * @var{key}) @var{key}: structure that holds key information Calls shishi_cipher_keylen for key type. @strong{Return value:} Returns the length of the key value. @end deftypefun @subheading shishi_key @anchor{shishi_key} @deftypefun {int} {shishi_key} (Shishi * @var{handle}, Shishi_key ** @var{key}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{key}: pointer to structure that will hold newly created key information Create a new Key information structure. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_done @anchor{shishi_key_done} @deftypefun {void} {shishi_key_done} (Shishi_key * @var{key}) @var{key}: pointer to structure that holds key information. Deallocates key information structure. @end deftypefun @subheading shishi_key_copy @anchor{shishi_key_copy} @deftypefun {void} {shishi_key_copy} (Shishi_key * @var{dstkey}, Shishi_key * @var{srckey}) @var{dstkey}: structure that holds destination key information @var{srckey}: structure that holds source key information Copies source key into existing allocated destination key. @end deftypefun @subheading shishi_key_from_value @anchor{shishi_key_from_value} @deftypefun {int} {shishi_key_from_value} (Shishi * @var{handle}, int32_t @var{type}, const char * @var{value}, Shishi_key ** @var{key}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{value}: input array with key value, or NULL. @var{key}: pointer to structure that will hold newly created key information Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_from_base64 @anchor{shishi_key_from_base64} @deftypefun {int} {shishi_key_from_base64} (Shishi * @var{handle}, int32_t @var{type}, const char * @var{value}, Shishi_key ** @var{key}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{value}: input string with base64 encoded key value, or NULL. @var{key}: pointer to structure that will hold newly created key information Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful. @strong{Return value:} Returns SHISHI_INVALID_KEY if the base64 encoded key length doesn't match the key type, and SHISHI_OK on success. @end deftypefun @subheading shishi_key_random @anchor{shishi_key_random} @deftypefun {int} {shishi_key_random} (Shishi * @var{handle}, int32_t @var{type}, Shishi_key ** @var{key}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{key}: pointer to structure that will hold newly created key information Create a new Key information structure for the key type and some random data. KEY contains a newly allocated structure only if this function is successful. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_from_random @anchor{shishi_key_from_random} @deftypefun {int} {shishi_key_from_random} (Shishi * @var{handle}, int32_t @var{type}, const char * @var{rnd}, size_t @var{rndlen}, Shishi_key ** @var{outkey}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{rnd}: random data. @var{rndlen}: length of random data. @var{outkey}: pointer to structure that will hold newly created key information Create a new Key information structure, and set the key type and key value using @code{shishi_random_to_key()}. KEY contains a newly allocated structure only if this function is successful. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_from_string @anchor{shishi_key_from_string} @deftypefun {int} {shishi_key_from_string} (Shishi * @var{handle}, int32_t @var{type}, const char * @var{password}, size_t @var{passwordlen}, const char * @var{salt}, size_t @var{saltlen}, const char * @var{parameter}, Shishi_key ** @var{outkey}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{password}: input array containing password. @var{passwordlen}: length of input array containing password. @var{salt}: input array containing salt. @var{saltlen}: length of input array containing salt. @var{parameter}: input array with opaque encryption type specific information. @var{outkey}: pointer to structure that will hold newly created key information Create a new Key information structure, and set the key type and key value using @code{shishi_string_to_key()}. KEY contains a newly allocated structure only if this function is successful. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_key_from_name @anchor{shishi_key_from_name} @deftypefun {int} {shishi_key_from_name} (Shishi * @var{handle}, int32_t @var{type}, const char * @var{name}, const char * @var{password}, size_t @var{passwordlen}, const char * @var{parameter}, Shishi_key ** @var{outkey}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{type}: type of key. @var{name}: principal name of user. @var{password}: input array containing password. @var{passwordlen}: length of input array containing password. @var{parameter}: input array with opaque encryption type specific information. @var{outkey}: pointer to structure that will hold newly created key information Create a new Key information structure, and derive the key from principal name and password using @code{shishi_key_from_name()}. The salt is derived from the principal name by concatenating the decoded realm and principal. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/init.c.texi0000644000000000000000000001146212126773202013473 00000000000000@subheading shishi @anchor{shishi} @deftypefun {Shishi *} {shishi} ( @var{void}) Initializes the Shishi library, and set up, using @code{shishi_error_set_outputtype()}, the library so that future warnings and informational messages are printed to stderr. If this function fails, it may print diagnostic errors to stderr. @strong{Return value:} Returns Shishi library handle, or @code{NULL} on error. @end deftypefun @subheading shishi_server @anchor{shishi_server} @deftypefun {Shishi *} {shishi_server} ( @var{void}) Initializes the Shishi library, and set up, using @code{shishi_error_set_outputtype()}, the library so that future warnings and informational messages are printed to the syslog. If this function fails, it may print diagnostic errors to the syslog. @strong{Return value:} Returns Shishi library handle, or @code{NULL} on error. @end deftypefun @subheading shishi_done @anchor{shishi_done} @deftypefun {void} {shishi_done} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. Deallocates the shishi library handle. The handle must not be used in any calls to shishi functions after this. If there is a default tkts, it is written to the default tkts file (call @code{shishi_tkts_default_file_set()} to change the default tkts file). If you do not wish to write the default tkts file, close the default tkts with shishi_tkts_done(handle, NULL) before calling this function. @end deftypefun @subheading shishi_init @anchor{shishi_init} @deftypefun {int} {shishi_init} (Shishi ** @var{handle}) @var{handle}: pointer to handle to be created. Create a Shishi library handle, using @code{shishi()}, and read the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_init_with_paths @anchor{shishi_init_with_paths} @deftypefun {int} {shishi_init_with_paths} (Shishi ** @var{handle}, const char * @var{tktsfile}, const char * @var{systemcfgfile}, const char * @var{usercfgfile}) @var{handle}: pointer to handle to be created. @var{tktsfile}: Filename of ticket file, or NULL. @var{systemcfgfile}: Filename of system configuration, or NULL. @var{usercfgfile}: Filename of user configuration, or NULL. Create a Shishi library handle, using @code{shishi()}, and read the system configuration file, user configuration file, and user tickets from the specified locations. If any of @code{usercfgfile} or @code{systemcfgfile} is NULL, the file is read from its default location, which for the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration file is $HOME/.shishi/config. If the ticket file is NULL, a ticket file is not read at all. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_init_server @anchor{shishi_init_server} @deftypefun {int} {shishi_init_server} (Shishi ** @var{handle}) @var{handle}: pointer to handle to be created. Create a Shishi library handle, using @code{shishi_server()}, and read the system configuration file. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_init_server_with_paths @anchor{shishi_init_server_with_paths} @deftypefun {int} {shishi_init_server_with_paths} (Shishi ** @var{handle}, const char * @var{systemcfgfile}) @var{handle}: pointer to handle to be created. @var{systemcfgfile}: Filename of system configuration, or NULL. Create a Shishi library handle, using @code{shishi_server()}, and read the system configuration file from specified location. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/ticket.c.texi0000644000000000000000000001146112126773203014013 00000000000000@subheading shishi_ticket @anchor{shishi_ticket} @deftypefun {Shishi_asn1} {shishi_ticket} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new ASN.1 Ticket, populated with some default values. @strong{Return value:} Returns the ticket or NULL on failure. @end deftypefun @subheading shishi_ticket_realm_get @anchor{shishi_ticket_realm_get} @deftypefun {int} {shishi_ticket_realm_get} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, char ** @var{realm}, size_t * @var{realmlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: input variable with ticket info. @var{realm}: output array with newly allocated name of realm in ticket. @var{realmlen}: size of output array. Extract realm from ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_realm_set @anchor{shishi_ticket_realm_set} @deftypefun {int} {shishi_ticket_realm_set} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, const char * @var{realm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: input variable with ticket info. @var{realm}: input array with name of realm. Set the realm field in the Ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_server @anchor{shishi_ticket_server} @deftypefun {int} {shishi_ticket_server} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, char ** @var{server}, size_t * @var{serverlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{ticket}: ASN.1 Ticket variable to get server name from. @var{server}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{serverlen}). @var{serverlen}: pointer to length of @code{server} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{server}). Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{serverlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_sname_set @anchor{shishi_ticket_sname_set} @deftypefun {int} {shishi_ticket_sname_set} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, Shishi_name_type @var{name_type}, char * [] @var{sname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: Ticket variable to set server name field in. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{sname}: input array with principal name. Set the server name field in the Ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_get_enc_part_etype @anchor{shishi_ticket_get_enc_part_etype} @deftypefun {int} {shishi_ticket_get_enc_part_etype} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, int32_t * @var{etype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: Ticket variable to get value from. @var{etype}: output variable that holds the value. Extract Ticket.enc-part.etype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_set_enc_part @anchor{shishi_ticket_set_enc_part} @deftypefun {int} {shishi_ticket_set_enc_part} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, int32_t @var{etype}, uint32_t @var{kvno}, const char * @var{buf}, size_t @var{buflen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: Ticket to add enc-part field to. @var{etype}: encryption type used to encrypt enc-part. @var{kvno}: key version number. @var{buf}: input array with encrypted enc-part. @var{buflen}: size of input array with encrypted enc-part. Set the encrypted enc-part field in the Ticket. The encrypted data is usually created by calling @code{shishi_encrypt()} on the DER encoded enc-part. To save time, you may want to use @code{shishi_ticket_add_enc_part()} instead, which calculates the encrypted data and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_ticket_add_enc_part @anchor{shishi_ticket_add_enc_part} @deftypefun {int} {shishi_ticket_add_enc_part} (Shishi * @var{handle}, Shishi_asn1 @var{ticket}, Shishi_key * @var{key}, Shishi_asn1 @var{encticketpart}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{ticket}: Ticket to add enc-part field to. @var{key}: key used to encrypt enc-part. @var{encticketpart}: EncTicketPart to add. Encrypts DER encoded EncTicketPart using key and stores it in the Ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/texi/safe.c.texi0000644000000000000000000002402112126773203013442 00000000000000@subheading shishi_safe @anchor{shishi_safe} @deftypefun {int} {shishi_safe} (Shishi * @var{handle}, Shishi_safe ** @var{safe}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: pointer to new structure that holds information about SAFE exchange Create a new SAFE exchange. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_done @anchor{shishi_safe_done} @deftypefun {void} {shishi_safe_done} (Shishi_safe * @var{safe}) @var{safe}: structure that holds information about SAFE exchange Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle. @end deftypefun @subheading shishi_safe_key @anchor{shishi_safe_key} @deftypefun {Shishi_key *} {shishi_safe_key} (Shishi_safe * @var{safe}) @var{safe}: structure that holds information about SAFE exchange Get key structured from SAFE exchange. @strong{Return value:} Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_safe_key_set @anchor{shishi_safe_key_set} @deftypefun {void} {shishi_safe_key_set} (Shishi_safe * @var{safe}, Shishi_key * @var{key}) @var{safe}: structure that holds information about SAFE exchange @var{key}: key to store in SAFE. Set the Key in the SAFE exchange. @end deftypefun @subheading shishi_safe_safe @anchor{shishi_safe_safe} @deftypefun {Shishi_asn1} {shishi_safe_safe} (Shishi_safe * @var{safe}) @var{safe}: structure that holds information about SAFE exchange Get ASN.1 SAFE structured from SAFE exchange. @strong{Return value:} Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured. @end deftypefun @subheading shishi_safe_safe_set @anchor{shishi_safe_safe_set} @deftypefun {void} {shishi_safe_safe_set} (Shishi_safe * @var{safe}, Shishi_asn1 @var{asn1safe}) @var{safe}: structure that holds information about SAFE exchange @var{asn1safe}: KRB-SAFE to store in SAFE exchange. Set the KRB-SAFE in the SAFE exchange. @end deftypefun @subheading shishi_safe_safe_der @anchor{shishi_safe_safe_der} @deftypefun {int} {shishi_safe_safe_der} (Shishi_safe * @var{safe}, char ** @var{out}, size_t * @var{outlen}) @var{safe}: safe as allocated by @code{shishi_safe()}. @var{out}: output array with newly allocated DER encoding of SAFE. @var{outlen}: length of output array with DER encoding of SAFE. DER encode SAFE structure. Typically @code{shishi_safe_build()} is used to build the SAFE structure first. @code{out} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_safe_der_set @anchor{shishi_safe_safe_der_set} @deftypefun {int} {shishi_safe_safe_der_set} (Shishi_safe * @var{safe}, char * @var{der}, size_t @var{derlen}) @var{safe}: safe as allocated by @code{shishi_safe()}. @var{der}: input array with DER encoded KRB-SAFE. @var{derlen}: length of input array with DER encoded KRB-SAFE. DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the KRB-SAFE in the SAFE exchange remains. @strong{Return value:} Returns SHISHI_OK. @end deftypefun @subheading shishi_safe_print @anchor{shishi_safe_print} @deftypefun {int} {shishi_safe_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{safe}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{safe}: SAFE to print. Print ASCII armored DER encoding of SAFE to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_save @anchor{shishi_safe_save} @deftypefun {int} {shishi_safe_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{safe}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{safe}: SAFE to save. Save DER encoding of SAFE to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_to_file @anchor{shishi_safe_to_file} @deftypefun {int} {shishi_safe_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{safe}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: SAFE to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write SAFE to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_parse @anchor{shishi_safe_parse} @deftypefun {int} {shishi_safe_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{safe}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{safe}: output variable with newly allocated SAFE. Read ASCII armored DER encoded SAFE from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_read @anchor{shishi_safe_read} @deftypefun {int} {shishi_safe_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{safe}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{safe}: output variable with newly allocated SAFE. Read DER encoded SAFE from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_from_file @anchor{shishi_safe_from_file} @deftypefun {int} {shishi_safe_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{safe}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: output variable with newly allocated SAFE. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read SAFE from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_cksum @anchor{shishi_safe_cksum} @deftypefun {int} {shishi_safe_cksum} (Shishi * @var{handle}, Shishi_asn1 @var{safe}, int32_t * @var{cksumtype}, char ** @var{cksum}, size_t * @var{cksumlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: safe as allocated by @code{shishi_safe()}. @var{cksumtype}: output checksum type. @var{cksum}: output array with newly allocated checksum data from SAFE. @var{cksumlen}: output size of output checksum data buffer. Read checksum value from KRB-SAFE. @code{cksum} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_set_cksum @anchor{shishi_safe_set_cksum} @deftypefun {int} {shishi_safe_set_cksum} (Shishi * @var{handle}, Shishi_asn1 @var{safe}, int32_t @var{cksumtype}, const char * @var{cksum}, size_t @var{cksumlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: safe as allocated by @code{shishi_safe()}. @var{cksumtype}: input checksum type to store in SAFE. @var{cksum}: input checksum data to store in SAFE. @var{cksumlen}: size of input checksum data to store in SAFE. Store checksum value in SAFE. A checksum is usually created by calling @code{shishi_checksum()} on some application specific data using the key from the ticket that is being used. To save time, you may want to use @code{shishi_safe_build()} instead, which calculates the checksum and calls this function in one step. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_user_data @anchor{shishi_safe_user_data} @deftypefun {int} {shishi_safe_user_data} (Shishi * @var{handle}, Shishi_asn1 @var{safe}, char ** @var{userdata}, size_t * @var{userdatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: safe as allocated by @code{shishi_safe()}. @var{userdata}: output array with newly allocated user data from KRB-SAFE. @var{userdatalen}: output size of output user data buffer. Read user data value from KRB-SAFE. @code{userdata} is allocated by this function, and it is the responsibility of caller to deallocate it. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_set_user_data @anchor{shishi_safe_set_user_data} @deftypefun {int} {shishi_safe_set_user_data} (Shishi * @var{handle}, Shishi_asn1 @var{safe}, const char * @var{userdata}, size_t @var{userdatalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{safe}: safe as allocated by @code{shishi_safe()}. @var{userdata}: input user application to store in SAFE. @var{userdatalen}: size of input user application to store in SAFE. Set the application data in SAFE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_build @anchor{shishi_safe_build} @deftypefun {int} {shishi_safe_build} (Shishi_safe * @var{safe}, Shishi_key * @var{key}) @var{safe}: safe as allocated by @code{shishi_safe()}. @var{key}: key for session, used to compute checksum. Build checksum and set it in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_safe_verify @anchor{shishi_safe_verify} @deftypefun {int} {shishi_safe_verify} (Shishi_safe * @var{safe}, Shishi_key * @var{key}) @var{safe}: safe as allocated by @code{shishi_safe()}. @var{key}: key for session, used to verify checksum. Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. @strong{Return value:} Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed. @end deftypefun shishi-1.0.2/doc/texi/crypto-rc4.c.texi0000644000000000000000000000000012126773202014520 00000000000000shishi-1.0.2/doc/texi/kdcreq.c.texi0000644000000000000000000006555412126773202014014 00000000000000@subheading shishi_asreq @anchor{shishi_asreq} @deftypefun {Shishi_asn1} {shishi_asreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new AS-REQ, populated with some default values. @strong{Return value:} Returns the AS-REQ or NULL on failure. @end deftypefun @subheading shishi_tgsreq @anchor{shishi_tgsreq} @deftypefun {Shishi_asn1} {shishi_tgsreq} (Shishi * @var{handle}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. This function creates a new TGS-REQ, populated with some default values. @strong{Return value:} Returns the TGS-REQ or NULL on failure. @end deftypefun @subheading shishi_kdcreq_print @anchor{shishi_kdcreq_print} @deftypefun {int} {shishi_kdcreq_print} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{kdcreq}: KDC-REQ to print. Print ASCII armored DER encoding of KDC-REQ to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_save @anchor{shishi_kdcreq_save} @deftypefun {int} {shishi_kdcreq_save} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for writing. @var{kdcreq}: KDC-REQ to save. Print DER encoding of KDC-REQ to file. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_to_file @anchor{shishi_kdcreq_to_file} @deftypefun {int} {shishi_kdcreq_to_file} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to save. @var{filetype}: input variable specifying type of file to be written, see Shishi_filetype. @var{filename}: input variable with filename to write to. Write KDC-REQ to file in specified TYPE. The file will be truncated if it exists. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_parse @anchor{shishi_kdcreq_parse} @deftypefun {int} {shishi_kdcreq_parse} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{kdcreq}: output variable with newly allocated KDC-REQ. Read ASCII armored DER encoded KDC-REQ from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_read @anchor{shishi_kdcreq_read} @deftypefun {int} {shishi_kdcreq_read} (Shishi * @var{handle}, FILE * @var{fh}, Shishi_asn1 * @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{fh}: file handle open for reading. @var{kdcreq}: output variable with newly allocated KDC-REQ. Read DER encoded KDC-REQ from file and populate given variable. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_from_file @anchor{shishi_kdcreq_from_file} @deftypefun {int} {shishi_kdcreq_from_file} (Shishi * @var{handle}, Shishi_asn1 * @var{kdcreq}, int @var{filetype}, const char * @var{filename}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: output variable with newly allocated KDC-REQ. @var{filetype}: input variable specifying type of file to be read, see Shishi_filetype. @var{filename}: input variable with filename to read from. Read KDC-REQ from file in specified TYPE. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_nonce_set @anchor{shishi_kdcreq_nonce_set} @deftypefun {int} {shishi_kdcreq_nonce_set} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, uint32_t @var{nonce}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set client name field in. @var{nonce}: integer nonce to store in KDC-REQ. Store nonce number field in KDC-REQ. @strong{Return value:} Returns @code{SHISHI_OK} iff successful. @end deftypefun @subheading shishi_kdcreq_set_cname @anchor{shishi_kdcreq_set_cname} @deftypefun {int} {shishi_kdcreq_set_cname} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_name_type @var{name_type}, const char * @var{principal}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set client name field in. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{principal}: input array with principal name. Set the client name field in the KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_client @anchor{shishi_kdcreq_client} @deftypefun {int} {shishi_kdcreq_client} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get client name from. @var{client}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Represent client principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_asreq_clientrealm @anchor{shishi_asreq_clientrealm} @deftypefun {int} {shishi_asreq_clientrealm} (Shishi * @var{handle}, Shishi_asn1 @var{asreq}, char ** @var{client}, size_t * @var{clientlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{asreq}: AS-REQ variable to get client name and realm from. @var{client}: pointer to newly allocated zero terminated string containing principal name and realm. May be @code{NULL} (to only populate @code{clientlen}). @var{clientlen}: pointer to length of @code{client} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{client}). Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{clientlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_realm @anchor{shishi_kdcreq_realm} @deftypefun {int} {shishi_kdcreq_realm} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, char ** @var{realm}, size_t * @var{realmlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get client name from. @var{realm}: pointer to newly allocated zero terminated string containing realm. May be @code{NULL} (to only populate @code{realmlen}). @var{realmlen}: pointer to length of @code{realm} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{realmlen}). Get realm field in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{realmlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_set_realm @anchor{shishi_kdcreq_set_realm} @deftypefun {int} {shishi_kdcreq_set_realm} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, const char * @var{realm}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set realm field in. @var{realm}: input array with name of realm. Set the realm field in the KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_server @anchor{shishi_kdcreq_server} @deftypefun {int} {shishi_kdcreq_server} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, char ** @var{server}, size_t * @var{serverlen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get server name from. @var{server}: pointer to newly allocated zero terminated string containing principal name. May be @code{NULL} (to only populate @code{serverlen}). @var{serverlen}: pointer to length of @code{server} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{server}). Represent server principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{serverlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_set_sname @anchor{shishi_kdcreq_set_sname} @deftypefun {int} {shishi_kdcreq_set_sname} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_name_type @var{name_type}, const char * [] @var{sname}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set server name field in. @var{name_type}: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. @var{sname}: input array with principal name. Set the server name field in the KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_till @anchor{shishi_kdcreq_till} @deftypefun {int} {shishi_kdcreq_till} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, char ** @var{till}, size_t * @var{tilllen}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get client name from. @var{till}: pointer to newly allocated zero terminated string containing "till" field with generalized time. May be @code{NULL} (to only populate @code{realmlen}). @var{tilllen}: pointer to length of @code{till} on output, excluding terminating zero. May be @code{NULL} (to only populate @code{tilllen}). Get "till" field (i.e. "endtime") in KDC-REQ, as zero-terminated string. The string is typically 15 characters long. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length @code{realmlen} does not include the terminating zero. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_tillc @anchor{shishi_kdcreq_tillc} @deftypefun {time_t} {shishi_kdcreq_tillc} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: Shishi library handle create by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get till field from. Extract C time corresponding to the "till" field. @strong{Return value:} Returns C time interpretation of the "till" field in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_etype @anchor{shishi_kdcreq_etype} @deftypefun {int} {shishi_kdcreq_etype} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, int32_t * @var{etype}, int @var{netype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get etype field from. @var{etype}: output encryption type. @var{netype}: element number to return. @strong{Return the netype:} th encryption type from KDC-REQ. The first etype is number 1. @strong{Return value:} Returns SHISHI_OK iff etype successful set. @end deftypefun @subheading shishi_kdcreq_set_etype @anchor{shishi_kdcreq_set_etype} @deftypefun {int} {shishi_kdcreq_set_etype} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, int32_t * @var{etype}, int @var{netype}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set etype field in. @var{etype}: input array with encryption types. @var{netype}: number of elements in input array with encryption types. Set the list of supported or wanted encryption types in the request. The list should be sorted in priority order. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_options @anchor{shishi_kdcreq_options} @deftypefun {int} {shishi_kdcreq_options} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, uint32_t * @var{flags}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. @var{flags}: pointer to output integer with flags. Extract KDC-Options from KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_forwardable_p @anchor{shishi_kdcreq_forwardable_p} @deftypefun {int} {shishi_kdcreq_forwardable_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option forwardable flag is set. The FORWARDABLE option indicates that the ticket to be issued is to have its forwardable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also forwardable. @strong{Return value:} Returns non-0 iff forwardable flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_forwarded_p @anchor{shishi_kdcreq_forwarded_p} @deftypefun {int} {shishi_kdcreq_forwarded_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option forwarded flag is set. The FORWARDED option is only specified in a request to the ticket-granting server and will only be honored if the ticket-granting ticket in the request has its FORWARDABLE bit set. This option indicates that this is a request for forwarding. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request. @strong{Return value:} Returns non-0 iff forwarded flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_proxiable_p @anchor{shishi_kdcreq_proxiable_p} @deftypefun {int} {shishi_kdcreq_proxiable_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option proxiable flag is set. The PROXIABLE option indicates that the ticket to be issued is to have its proxiable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also proxiable. @strong{Return value:} Returns non-0 iff proxiable flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_proxy_p @anchor{shishi_kdcreq_proxy_p} @deftypefun {int} {shishi_kdcreq_proxy_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option proxy flag is set. The PROXY option indicates that this is a request for a proxy. This option will only be honored if the ticket-granting ticket in the request has its PROXIABLE bit set. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request. @strong{Return value:} Returns non-0 iff proxy flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_allow_postdate_p @anchor{shishi_kdcreq_allow_postdate_p} @deftypefun {int} {shishi_kdcreq_allow_postdate_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option allow-postdate flag is set. The ALLOW-POSTDATE option indicates that the ticket to be issued is to have its MAY-POSTDATE flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based also has its MAY-POSTDATE flag set. @strong{Return value:} Returns non-0 iff allow-postdate flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_postdated_p @anchor{shishi_kdcreq_postdated_p} @deftypefun {int} {shishi_kdcreq_postdated_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option postdated flag is set. The POSTDATED option indicates that this is a request for a postdated ticket. This option will only be honored if the ticket-granting ticket on which it is based has its MAY-POSTDATE flag set. The resulting ticket will also have its INVALID flag set, and that flag may be reset by a subsequent request to the KDC after the starttime in the ticket has been reached. @strong{Return value:} Returns non-0 iff postdated flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_renewable_p @anchor{shishi_kdcreq_renewable_p} @deftypefun {int} {shishi_kdcreq_renewable_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option renewable flag is set. The RENEWABLE option indicates that the ticket to be issued is to have its RENEWABLE flag set. It may only be set on the initial request, or when the ticket-granting ticket on which the request is based is also renewable. If this option is requested, then the rtime field in the request contains the desired absolute expiration time for the ticket. @strong{Return value:} Returns non-0 iff renewable flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_disable_transited_check_p @anchor{shishi_kdcreq_disable_transited_check_p} @deftypefun {int} {shishi_kdcreq_disable_transited_check_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option disable-transited-check flag is set. By default the KDC will check the transited field of a ticket-granting-ticket against the policy of the local realm before it will issue derivative tickets based on the ticket-granting ticket. If this flag is set in the request, checking of the transited field is disabled. Tickets issued without the performance of this check will be noted by the reset (0) value of the TRANSITED-POLICY-CHECKED flag, indicating to the application server that the tranisted field must be checked locally. KDCs are encouraged but not required to honor the DISABLE-TRANSITED-CHECK option. This flag is new since RFC 1510 @strong{Return value:} Returns non-0 iff disable-transited-check flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_renewable_ok_p @anchor{shishi_kdcreq_renewable_ok_p} @deftypefun {int} {shishi_kdcreq_renewable_ok_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option renewable-ok flag is set. The RENEWABLE-OK option indicates that a renewable ticket will be acceptable if a ticket with the requested life cannot otherwise be provided. If a ticket with the requested life cannot be provided, then a renewable ticket may be issued with a renew-till equal to the requested endtime. The value of the renew-till field may still be limited by local limits, or limits selected by the individual principal or server. @strong{Return value:} Returns non-0 iff renewable-ok flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_enc_tkt_in_skey_p @anchor{shishi_kdcreq_enc_tkt_in_skey_p} @deftypefun {int} {shishi_kdcreq_enc_tkt_in_skey_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option enc-tkt-in-skey flag is set. This option is used only by the ticket-granting service. The ENC-TKT-IN-SKEY option indicates that the ticket for the end server is to be encrypted in the session key from the additional ticket-granting ticket provided. @strong{Return value:} Returns non-0 iff enc-tkt-in-skey flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_renew_p @anchor{shishi_kdcreq_renew_p} @deftypefun {int} {shishi_kdcreq_renew_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option renew flag is set. This option is used only by the ticket-granting service. The RENEW option indicates that the present request is for a renewal. The ticket provided is encrypted in the secret key for the server on which it is valid. This option will only be honored if the ticket to be renewed has its RENEWABLE flag set and if the time in its renew-till field has not passed. The ticket to be renewed is passed in the padata field as part of the authentication header. @strong{Return value:} Returns non-0 iff renew flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_validate_p @anchor{shishi_kdcreq_validate_p} @deftypefun {int} {shishi_kdcreq_validate_p} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to get kdc-options field from. Determine if KDC-Option validate flag is set. This option is used only by the ticket-granting service. The VALIDATE option indicates that the request is to validate a postdated ticket. It will only be honored if the ticket presented is postdated, presently has its INVALID flag set, and would be otherwise usable at this time. A ticket cannot be validated before its starttime. The ticket presented for validation is encrypted in the key of the server for which it is valid and is passed in the padata field as part of the authentication header. @strong{Return value:} Returns non-0 iff validate flag is set in KDC-REQ. @end deftypefun @subheading shishi_kdcreq_options_set @anchor{shishi_kdcreq_options_set} @deftypefun {int} {shishi_kdcreq_options_set} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, uint32_t @var{options}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set etype field in. @var{options}: integer with flags to store in KDC-REQ. Set options in KDC-REQ. Note that this reset any already existing flags. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_options_add @anchor{shishi_kdcreq_options_add} @deftypefun {int} {shishi_kdcreq_options_add} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, uint32_t @var{option}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ variable to set etype field in. @var{option}: integer with options to add in KDC-REQ. Add KDC-Option to KDC-REQ. This preserves all existing options. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_clear_padata @anchor{shishi_kdcreq_clear_padata} @deftypefun {int} {shishi_kdcreq_clear_padata} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to remove PA-DATA from. Remove the padata field from KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_get_padata @anchor{shishi_kdcreq_get_padata} @deftypefun {int} {shishi_kdcreq_get_padata} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_padata_type @var{padatatype}, char ** @var{out}, size_t * @var{outlen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to get PA-DATA from. @var{padatatype}: type of PA-DATA, see Shishi_padata_type. @var{out}: output array with newly allocated PA-DATA value. @var{outlen}: size of output array with PA-DATA value. Get pre authentication data (PA-DATA) from KDC-REQ. Pre authentication data is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_get_padata_tgs @anchor{shishi_kdcreq_get_padata_tgs} @deftypefun {int} {shishi_kdcreq_get_padata_tgs} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_asn1 * @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to get PA-TGS-REQ from. @var{apreq}: Output variable with newly allocated AP-REQ. Extract TGS pre-authentication data from KDC-REQ. The data is an AP-REQ that authenticates the request. This function call @code{shishi_kdcreq_get_padata()} with a SHISHI_PA_TGS_REQ padatatype and DER decode the result (if any). @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_add_padata @anchor{shishi_kdcreq_add_padata} @deftypefun {int} {shishi_kdcreq_add_padata} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, int @var{padatatype}, const char * @var{data}, size_t @var{datalen}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to add PA-DATA to. @var{padatatype}: type of PA-DATA, see Shishi_padata_type. @var{data}: input array with PA-DATA value. @var{datalen}: size of input array with PA-DATA value. Add new pre authentication data (PA-DATA) to KDC-REQ. This is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket. (But also see @code{shishi_kdcreq_add_padata_tgs()} which takes an AP-REQ directly.) @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_add_padata_tgs @anchor{shishi_kdcreq_add_padata_tgs} @deftypefun {int} {shishi_kdcreq_add_padata_tgs} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_asn1 @var{apreq}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to add PA-DATA to. @var{apreq}: AP-REQ to add as PA-DATA. Add TGS pre-authentication data to KDC-REQ. The data is an AP-REQ that authenticates the request. This functions simply DER encodes the AP-REQ and calls @code{shishi_kdcreq_add_padata()} with a SHISHI_PA_TGS_REQ padatatype. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun @subheading shishi_kdcreq_add_padata_preauth @anchor{shishi_kdcreq_add_padata_preauth} @deftypefun {int} {shishi_kdcreq_add_padata_preauth} (Shishi * @var{handle}, Shishi_asn1 @var{kdcreq}, Shishi_key * @var{key}) @var{handle}: shishi handle as allocated by @code{shishi_init()}. @var{kdcreq}: KDC-REQ to add pre-authentication data to. @var{key}: Key used to encrypt pre-auth data. Add pre-authentication data to KDC-REQ. @strong{Return value:} Returns SHISHI_OK iff successful. @end deftypefun shishi-1.0.2/doc/shishi.info0000644000000000000000000006521212126773203012612 00000000000000This is shishi.info, produced by makeinfo version 4.13 from shishi.texi. This manual is last updated 3 April 2013 for version 1.0.2 of Shishi. Copyright (C) 2002-2013 Simon Josefsson. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION GNU utilities START-INFO-DIR-ENTRY * shishi: (shishi). A Kerberos 5 implementation END-INFO-DIR-ENTRY INFO-DIR-SECTION GNU Libraries START-INFO-DIR-ENTRY * libshishi: (shishi). Library implementing Kerberos 5. END-INFO-DIR-ENTRY  Indirect: shishi.info-1: 840 shishi.info-2: 307473 shishi.info-3: 593719  Tag Table: (Indirect) Node: Top840 Node: Introduction2207 Node: Getting Started4049 Node: Features and Status4979 Node: Overview9880 Ref: Overview-Footnote-115155 Node: Cryptographic Overview15353 Ref: Cryptographic Overview-Footnote-125751 Ref: Cryptographic Overview-Footnote-225810 Node: Supported Platforms25868 Node: Getting help28811 Node: Commercial Support29274 Node: Downloading and Installing30236 Node: Bug Reports32111 Node: Contributing33504 Node: User Manual35635 Node: Administration Manual48406 Ref: Administration Manual-Footnote-149936 Node: Introduction to Shisa50015 Node: Configuring Shisa52537 Node: Using Shisa53969 Node: Starting Shishid64282 Node: Configuring DNS for KDC69209 Node: Kerberos via TLS73779 Node: Multiple servers88883 Node: Developer information94082 Node: Reference Manual95389 Node: Environmental Assumptions96540 Node: Glossary of terms98758 Node: Realm and Principal Naming104076 Ref: krbtgt112474 Node: Shishi Configuration117974 Ref: realm-kdc120327 Node: Shisa Configuration123413 Node: Parameters for shishi126134 Node: Parameters for shishid132064 Node: Parameters for shisa134439 Node: Environment variables138038 Node: Date input formats139180 Node: General date syntax141597 Node: Calendar date items144589 Node: Time of day items146595 Node: Time zone items148800 Node: Combined date and time of day items150061 Node: Day of week items150922 Node: Relative items in date strings151940 Node: Pure numbers in date strings154751 Node: Seconds since the Epoch155741 Node: Specifying time zone rules157371 Node: Authors of parse_datetime159752 Ref: Authors of get_date159940 Node: Programming Manual160903 Node: Preparation162516 Node: Header163207 Node: Initialization163825 Node: Version Check164507 Ref: shishi_check_version165041 Node: Building the source165831 Node: Autoconf tests167743 Node: Initialization Functions170725 Ref: shishi170927 Ref: shishi_server171324 Ref: shishi_done171732 Ref: shishi_init172297 Ref: shishi_init_with_paths173110 Ref: shishi_init_server174316 Ref: shishi_init_server_with_paths174966 Ref: shishi_cfg175715 Ref: shishi_cfg_from_file176049 Ref: shishi_cfg_print176395 Ref: shishi_cfg_default_systemfile176743 Ref: shishi_cfg_default_userdirectory177158 Ref: shishi_cfg_userdirectory_file177730 Ref: shishi_cfg_default_userfile178314 Ref: shishi_cfg_clientkdcetype178650 Ref: shishi_cfg_clientkdcetype_fast179081 Ref: shishi_cfg_clientkdcetype_set179409 Ref: shishi_cfg_authorizationtype_set179968 Node: Ticket Set Functions180428 Ref: shishi_tkts_default_file_guess181342 Ref: shishi_tkts_default_file181770 Ref: shishi_tkts_default_file_set182158 Ref: shishi_tkts_default182640 Ref: shishi_tkts182906 Ref: shishi_tkts_done183223 Ref: shishi_tkts_size183545 Ref: shishi_tkts_nth183797 Ref: shishi_tkts_remove184334 Ref: shishi_tkts_add184770 Ref: shishi_tkts_new185195 Ref: shishi_tkts_read185857 Ref: shishi_tkts_from_file186202 Ref: shishi_tkts_write186562 Ref: shishi_tkts_expire186884 Ref: shishi_tkts_to_file187150 Ref: shishi_tkts_print_for_service187506 Ref: shishi_tkts_print188004 Ref: shishi_tkt_match_p188330 Ref: shishi_tkts_find188680 Ref: shishi_tkts_find_for_clientserver190030 Ref: shishi_tkts_find_for_server190567 Ref: shishi_tkts_get_tgt191086 Ref: shishi_tkts_get_tgs191950 Ref: shishi_tkts_get192596 Ref: shishi_tkts_get_for_clientserver193352 Ref: shishi_tkts_get_for_server193862 Ref: shishi_tkts_get_for_localservicepasswd194349 Node: AP-REQ and AP-REP Functions194928 Ref: shishi_ap196103 Ref: shishi_ap_etype196805 Ref: shishi_ap_nosubkey197282 Ref: shishi_ap_done197647 Ref: shishi_ap_set_tktoptions197976 Ref: shishi_ap_set_tktoptionsdata198448 Ref: shishi_ap_set_tktoptionsraw199135 Ref: shishi_ap_set_tktoptionsasn1usage199965 Ref: shishi_ap_tktoptions200882 Ref: shishi_ap_tktoptionsdata201584 Ref: shishi_ap_tktoptionsraw202502 Ref: shishi_ap_etype_tktoptionsdata203561 Ref: shishi_ap_tktoptionsasn1usage204575 Ref: shishi_ap_tkt205716 Ref: shishi_ap_tkt_set206019 Ref: shishi_ap_authenticator_cksumdata206296 Ref: shishi_ap_authenticator_cksumdata_set207004 Ref: shishi_ap_authenticator_cksumraw_set207807 Ref: shishi_ap_authenticator_cksumtype208690 Ref: shishi_ap_authenticator_cksumtype_set209025 Ref: shishi_ap_authenticator209359 Ref: shishi_ap_authenticator_set209721 Ref: shishi_ap_req210011 Ref: shishi_ap_req_set210329 Ref: shishi_ap_req_der210576 Ref: shishi_ap_req_der_set211149 Ref: shishi_ap_req_build211607 Ref: shishi_ap_req_decode211908 Ref: shishi_ap_req_process_keyusage212225 Ref: shishi_ap_req_process212998 Ref: shishi_ap_req_asn1213504 Ref: shishi_ap_key213836 Ref: shishi_ap_rep214179 Ref: shishi_ap_rep_set214497 Ref: shishi_ap_rep_der214744 Ref: shishi_ap_rep_der_set215306 Ref: shishi_ap_rep_build215764 Ref: shishi_ap_rep_asn1216061 Ref: shishi_ap_rep_verify216407 Ref: shishi_ap_rep_verify_der216708 Ref: shishi_ap_rep_verify_asn1217252 Ref: shishi_ap_encapreppart217682 Ref: shishi_ap_encapreppart_set218039 Ref: shishi_ap_option2string218344 Ref: shishi_ap_string2option218881 Ref: shishi_apreq219257 Ref: shishi_apreq_print219558 Ref: shishi_apreq_save219935 Ref: shishi_apreq_to_file220301 Ref: shishi_apreq_parse220856 Ref: shishi_apreq_read221293 Ref: shishi_apreq_from_file221720 Ref: shishi_apreq_set_authenticator222284 Ref: shishi_apreq_add_authenticator223253 Ref: shishi_apreq_set_ticket223910 Ref: shishi_apreq_options224315 Ref: shishi_apreq_use_session_key_p224762 Ref: shishi_apreq_mutual_required_p225166 Ref: shishi_apreq_options_set225558 Ref: shishi_apreq_options_add225985 Ref: shishi_apreq_options_remove226475 Ref: shishi_apreq_get_authenticator_etype226996 Ref: shishi_apreq_get_ticket227422 Ref: shishi_aprep227816 Ref: shishi_aprep_print228124 Ref: shishi_aprep_save228501 Ref: shishi_aprep_to_file228867 Ref: shishi_aprep_parse229422 Ref: shishi_aprep_read229859 Ref: shishi_aprep_from_file230286 Ref: shishi_aprep_get_enc_part_etype230852 Ref: shishi_encapreppart231260 Ref: shishi_encapreppart_print231683 Ref: shishi_encapreppart_save232107 Ref: shishi_encapreppart_to_file232520 Ref: shishi_encapreppart_parse233122 Ref: shishi_encapreppart_read233606 Ref: shishi_encapreppart_from_file234085 Ref: shishi_encapreppart_get_key234686 Ref: shishi_encapreppart_ctime235115 Ref: shishi_encapreppart_ctime_set235601 Ref: shishi_encapreppart_cusec_get236082 Ref: shishi_encapreppart_cusec_set236573 Ref: shishi_encapreppart_seqnumber_get237067 Ref: shishi_encapreppart_seqnumber_remove237576 Ref: shishi_encapreppart_seqnumber_set237999 Ref: shishi_encapreppart_time_copy238513 Node: SAFE and PRIV Functions238955 Ref: shishi_safe240041 Ref: shishi_safe_done240381 Ref: shishi_safe_key240706 Ref: shishi_safe_key_set241035 Ref: shishi_safe_safe241296 Ref: shishi_safe_safe_set241636 Ref: shishi_safe_safe_der241934 Ref: shishi_safe_safe_der_set242536 Ref: shishi_safe_print242998 Ref: shishi_safe_save243366 Ref: shishi_safe_to_file243723 Ref: shishi_safe_parse244269 Ref: shishi_safe_read244697 Ref: shishi_safe_from_file245115 Ref: shishi_safe_cksum245646 Ref: shishi_safe_set_cksum246309 Ref: shishi_safe_user_data247166 Ref: shishi_safe_set_user_data247803 Ref: shishi_safe_build248305 Ref: shishi_safe_verify248782 Ref: shishi_priv250312 Ref: shishi_priv_done250652 Ref: shishi_priv_key250977 Ref: shishi_priv_key_set251295 Ref: shishi_priv_priv251556 Ref: shishi_priv_priv_set251893 Ref: shishi_priv_priv_der252191 Ref: shishi_priv_priv_der_set252793 Ref: shishi_priv_encprivpart253267 Ref: shishi_priv_encprivpart_set253641 Ref: shishi_priv_encprivpart_der253980 Ref: shishi_priv_encprivpart_der_set254543 Ref: shishi_priv_print255024 Ref: shishi_priv_save255392 Ref: shishi_priv_to_file255749 Ref: shishi_priv_parse256295 Ref: shishi_priv_read256723 Ref: shishi_priv_from_file257141 Ref: shishi_priv_enc_part_etype257690 Ref: shishi_priv_set_enc_part258097 Ref: shishi_encprivpart_user_data258987 Ref: shishi_encprivpart_set_user_data259676 Ref: shishi_priv_build260216 Ref: shishi_priv_process260691 Node: Ticket Functions261149 Ref: shishi_tkt261728 Ref: shishi_tkt2262026 Ref: shishi_tkt_done262532 Ref: shishi_tkt_ticket262775 Ref: shishi_tkt_ticket_set263018 Ref: shishi_tkt_enckdcreppart263292 Ref: shishi_tkt_enckdcreppart_set263578 Ref: shishi_tkt_kdcrep263883 Ref: shishi_tkt_encticketpart264138 Ref: shishi_tkt_encticketpart_set264421 Ref: shishi_tkt_key264698 Ref: shishi_tkt_key_set265086 Ref: shishi_tkt_client265382 Ref: shishi_tkt_client_p266193 Ref: shishi_tkt_clientrealm266532 Ref: shishi_tkt_clientrealm_p267365 Ref: shishi_tkt_realm267749 Ref: shishi_tkt_server268178 Ref: shishi_tkt_server_p268976 Ref: shishi_tkt_flags269303 Ref: shishi_tkt_flags_set269622 Ref: shishi_tkt_flags_add270026 Ref: shishi_tkt_forwardable_p270396 Ref: shishi_tkt_forwarded_p271191 Ref: shishi_tkt_proxiable_p271897 Ref: shishi_tkt_proxy_p272715 Ref: shishi_tkt_may_postdate_p273253 Ref: shishi_tkt_postdated_p274527 Ref: shishi_tkt_invalid_p275318 Ref: shishi_tkt_renewable_p276165 Ref: shishi_tkt_initial_p276713 Ref: shishi_tkt_pre_authent_p277439 Ref: shishi_tkt_hw_authent_p278146 Ref: shishi_tkt_transited_policy_checked_p278892 Ref: shishi_tkt_ok_as_delegate_p280747 Ref: shishi_tkt_keytype281780 Ref: shishi_tkt_keytype_fast282144 Ref: shishi_tkt_keytype_p282483 Ref: shishi_tkt_lastreqc282893 Ref: shishi_tkt_authctime283358 Ref: shishi_tkt_startctime283765 Ref: shishi_tkt_endctime284150 Ref: shishi_tkt_renew_tillc284507 Ref: shishi_tkt_valid_at_time_p284893 Ref: shishi_tkt_valid_now_p285278 Ref: shishi_tkt_expired_p285552 Ref: shishi_tkt_lastreq_pretty_print285845 Ref: shishi_tkt_pretty_print286186 Node: AS Functions286415 Ref: shishi_as288555 Ref: shishi_as_done288872 Ref: shishi_as_req289179 Ref: shishi_as_req_build289518 Ref: shishi_as_req_set289777 Ref: shishi_as_req_der290024 Ref: shishi_as_req_der_set290539 Ref: shishi_as_rep290985 Ref: shishi_as_rep_process291327 Ref: shishi_as_rep_build291874 Ref: shishi_as_rep_der292194 Ref: shishi_as_rep_set292700 Ref: shishi_as_rep_der_set292955 Ref: shishi_as_krberror293411 Ref: shishi_as_krberror_der293766 Ref: shishi_as_krberror_set294296 Ref: shishi_as_tkt294562 Ref: shishi_as_tkt_set294875 Ref: shishi_as_sendrecv_hint295126 Ref: shishi_as_sendrecv295695 Node: TGS Functions296009 Ref: shishi_tgs298261 Ref: shishi_tgs_done298586 Ref: shishi_tgs_tgtkt298905 Ref: shishi_tgs_tgtkt_set299258 Ref: shishi_tgs_ap299534 Ref: shishi_tgs_req299859 Ref: shishi_tgs_req_set300186 Ref: shishi_tgs_req_der300456 Ref: shishi_tgs_req_der_set300980 Ref: shishi_tgs_req_process301453 Ref: shishi_tgs_req_build301807 Ref: shishi_tgs_rep302102 Ref: shishi_tgs_rep_der302424 Ref: shishi_tgs_rep_process302948 Ref: shishi_tgs_rep_build303302 Ref: shishi_tgs_krberror303691 Ref: shishi_tgs_krberror_der304030 Ref: shishi_tgs_krberror_set304568 Ref: shishi_tgs_tkt304843 Ref: shishi_tgs_tkt_set305170 Ref: shishi_tgs_sendrecv_hint305446 Ref: shishi_tgs_sendrecv306017 Ref: shishi_tgs_set_server306376 Ref: shishi_tgs_set_realm306723 Ref: shishi_tgs_set_realmserver307078 Node: Ticket (ASN.1) Functions307473 Ref: shishi_ticket308724 Ref: shishi_ticket_realm_get309042 Ref: shishi_ticket_realm_set309522 Ref: shishi_ticket_server309925 Ref: shishi_ticket_sname_set310833 Ref: shishi_ticket_get_enc_part_etype311395 Ref: shishi_ticket_set_enc_part311820 Ref: shishi_ticket_add_enc_part312719 Ref: shishi_encticketpart_get_key313259 Ref: shishi_encticketpart_key_set313686 Ref: shishi_encticketpart_flags_set314187 Ref: shishi_encticketpart_crealm_set314634 Ref: shishi_encticketpart_cname_set315077 Ref: shishi_encticketpart_transited_set315677 Ref: shishi_encticketpart_authtime_set316331 Ref: shishi_encticketpart_endtime_set316825 Ref: shishi_encticketpart_client317305 Ref: shishi_encticketpart_clientrealm318260 Node: AS/TGS Functions319193 Ref: shishi_as_derive_salt322259 Ref: shishi_kdc_copy_crealm323050 Ref: shishi_as_check_crealm323480 Ref: shishi_kdc_copy_cname324117 Ref: shishi_as_check_cname324541 Ref: shishi_kdc_copy_nonce325189 Ref: shishi_kdc_check_nonce325615 Ref: shishi_tgs_process326405 Ref: shishi_as_process327423 Ref: shishi_kdc_process328265 Ref: shishi_asreq329600 Ref: shishi_tgsreq329891 Ref: shishi_kdcreq_print330197 Ref: shishi_kdcreq_save330581 Ref: shishi_kdcreq_to_file330955 Ref: shishi_kdcreq_parse331517 Ref: shishi_kdcreq_read331961 Ref: shishi_kdcreq_from_file332395 Ref: shishi_kdcreq_nonce_set332950 Ref: shishi_kdcreq_set_cname333375 Ref: shishi_kdcreq_client333926 Ref: shishi_asreq_clientrealm334832 Ref: shishi_kdcreq_realm335758 Ref: shishi_kdcreq_set_realm336626 Ref: shishi_kdcreq_server337037 Ref: shishi_kdcreq_set_sname337941 Ref: shishi_kdcreq_till338483 Ref: shishi_kdcreq_tillc339440 Ref: shishi_kdcreq_etype339833 Ref: shishi_kdcreq_set_etype340352 Ref: shishi_kdcreq_options340932 Ref: shishi_kdcreq_forwardable_p341365 Ref: shishi_kdcreq_forwarded_p342033 Ref: shishi_kdcreq_proxiable_p342828 Ref: shishi_kdcreq_proxy_p343471 Ref: shishi_kdcreq_allow_postdate_p344186 Ref: shishi_kdcreq_postdated_p344882 Ref: shishi_kdcreq_renewable_p345673 Ref: shishi_kdcreq_disable_transited_check_p346476 Ref: shishi_kdcreq_renewable_ok_p347584 Ref: shishi_kdcreq_enc_tkt_in_skey_p348458 Ref: shishi_kdcreq_renew_p349109 Ref: shishi_kdcreq_validate_p349978 Ref: shishi_kdcreq_options_set350911 Ref: shishi_kdcreq_options_add351385 Ref: shishi_kdcreq_clear_padata351845 Ref: shishi_kdcreq_get_padata352196 Ref: shishi_kdcreq_get_padata_tgs353001 Ref: shishi_kdcreq_add_padata353636 Ref: shishi_kdcreq_add_padata_tgs354482 Ref: shishi_kdcreq_add_padata_preauth355102 Ref: shishi_asrep355512 Ref: shishi_tgsrep355803 Ref: shishi_kdcrep_print356109 Ref: shishi_kdcrep_save356493 Ref: shishi_kdcrep_to_file356868 Ref: shishi_kdcrep_parse357430 Ref: shishi_kdcrep_read357874 Ref: shishi_kdcrep_from_file358308 Ref: shishi_kdcrep_crealm_set358865 Ref: shishi_kdcrep_cname_set359291 Ref: shishi_kdcrep_client_set359844 Ref: shishi_kdcrep_get_enc_part_etype360327 Ref: shishi_kdcrep_get_ticket360750 Ref: shishi_kdcrep_set_ticket361173 Ref: shishi_kdcrep_set_enc_part361596 Ref: shishi_kdcrep_add_enc_part362497 Ref: shishi_kdcrep_clear_padata363226 Ref: shishi_enckdcreppart_get_key363585 Ref: shishi_enckdcreppart_key_set364105 Ref: shishi_enckdcreppart_nonce_set364606 Ref: shishi_enckdcreppart_flags_set365044 Ref: shishi_enckdcreppart_authtime_set365483 Ref: shishi_enckdcreppart_starttime_set365981 Ref: shishi_enckdcreppart_endtime_set366539 Ref: shishi_enckdcreppart_renew_till_set367035 Ref: shishi_enckdcreppart_srealm_set367596 Ref: shishi_enckdcreppart_sname_set368070 Ref: shishi_enckdcreppart_populate_encticketpart368699 Node: Authenticator Functions369224 Ref: shishi_authenticator370135 Ref: shishi_authenticator_subkey370565 Ref: shishi_authenticator_print371025 Ref: shishi_authenticator_save371493 Ref: shishi_authenticator_to_file371951 Ref: shishi_authenticator_parse372570 Ref: shishi_authenticator_read373075 Ref: shishi_authenticator_from_file373575 Ref: shishi_authenticator_set_crealm374189 Ref: shishi_authenticator_set_cname374674 Ref: shishi_authenticator_client_set375303 Ref: shishi_authenticator_ctime375799 Ref: shishi_authenticator_ctime_set376298 Ref: shishi_authenticator_cusec_get376793 Ref: shishi_authenticator_cusec_set377297 Ref: shishi_authenticator_seqnumber_get377803 Ref: shishi_authenticator_seqnumber_remove378327 Ref: shishi_authenticator_seqnumber_set378763 Ref: shishi_authenticator_client379285 Ref: shishi_authenticator_clientrealm380240 Ref: shishi_authenticator_cksum381228 Ref: shishi_authenticator_set_cksum382003 Ref: shishi_authenticator_add_cksum382985 Ref: shishi_authenticator_add_cksum_type383741 Ref: shishi_authenticator_clear_authorizationdata384592 Ref: shishi_authenticator_add_authorizationdata385058 Ref: shishi_authenticator_authorizationdata385721 Ref: shishi_authenticator_remove_subkey386515 Ref: shishi_authenticator_get_subkey386931 Ref: shishi_authenticator_set_subkey387485 Ref: shishi_authenticator_add_random_subkey388480 Ref: shishi_authenticator_add_random_subkey_etype389003 Ref: shishi_authenticator_add_subkey389551 Node: KRB-ERROR Functions389963 Ref: shishi_krberror391217 Ref: shishi_krberror_print391533 Ref: shishi_krberror_save391931 Ref: shishi_krberror_to_file392318 Ref: shishi_krberror_parse392894 Ref: shishi_krberror_read393352 Ref: shishi_krberror_from_file393800 Ref: shishi_krberror_build394361 Ref: shishi_krberror_der394810 Ref: shishi_krberror_crealm395367 Ref: shishi_krberror_remove_crealm395893 Ref: shishi_krberror_set_crealm396271 Ref: shishi_krberror_client396705 Ref: shishi_krberror_set_cname397396 Ref: shishi_krberror_remove_cname397984 Ref: shishi_krberror_client_set398361 Ref: shishi_krberror_realm398822 Ref: shishi_krberror_set_realm399341 Ref: shishi_krberror_server399790 Ref: shishi_krberror_remove_sname400484 Ref: shishi_krberror_set_sname401014 Ref: shishi_krberror_server_set401598 Ref: shishi_krberror_ctime402059 Ref: shishi_krberror_ctime_set402498 Ref: shishi_krberror_remove_ctime402949 Ref: shishi_krberror_cusec403314 Ref: shishi_krberror_cusec_set403769 Ref: shishi_krberror_remove_cusec404223 Ref: shishi_krberror_stime404588 Ref: shishi_krberror_stime_set405027 Ref: shishi_krberror_susec405464 Ref: shishi_krberror_susec_set405919 Ref: shishi_krberror_errorcode406367 Ref: shishi_krberror_errorcode_fast406810 Ref: shishi_krberror_errorcode_set407252 Ref: shishi_krberror_etext407691 Ref: shishi_krberror_set_etext408208 Ref: shishi_krberror_remove_etext408678 Ref: shishi_krberror_edata409052 Ref: shishi_krberror_methoddata409571 Ref: shishi_krberror_set_edata410146 Ref: shishi_krberror_remove_edata410616 Ref: shishi_krberror_pretty_print411004 Ref: shishi_krberror_errorcode_message411482 Ref: shishi_krberror_message411952 Node: Cryptographic Functions412458 Ref: shishi_key_principal413423 Ref: shishi_key_principal_set413806 Ref: shishi_key_realm414196 Ref: shishi_key_realm_set414547 Ref: shishi_key_type414933 Ref: shishi_key_type_set415196 Ref: shishi_key_value415427 Ref: shishi_key_value_set415739 Ref: shishi_key_version416180 Ref: shishi_key_version_set416502 Ref: shishi_key_timestamp416814 Ref: shishi_key_timestamp_set417224 Ref: shishi_key_name417565 Ref: shishi_key_length417799 Ref: shishi_key418040 Ref: shishi_key_done418386 Ref: shishi_key_copy418578 Ref: shishi_key_from_value418897 Ref: shishi_key_from_base64419511 Ref: shishi_key_random420217 Ref: shishi_key_from_random420760 Ref: shishi_key_from_string421437 Ref: shishi_key_from_name422428 Ref: shishi_keys423718 Ref: shishi_keys_done424032 Ref: shishi_keys_size424345 Ref: shishi_keys_nth424585 Ref: shishi_keys_remove425087 Ref: shishi_keys_add425398 Ref: shishi_keys_print425830 Ref: shishi_keys_to_file426129 Ref: shishi_keys_from_file426678 Ref: shishi_keys_for_serverrealm_in_file427182 Ref: shishi_keys_for_server_in_file427863 Ref: shishi_keys_for_localservicerealm_in_file428434 Ref: shishi_hostkeys_default_file429539 Ref: shishi_hostkeys_default_file_set429940 Ref: shishi_hostkeys_for_server430450 Ref: shishi_hostkeys_for_serverrealm430959 Ref: shishi_hostkeys_for_localservicerealm431576 Ref: shishi_hostkeys_for_localservice432298 Ref: shishi_cipher_supported_p433061 Ref: shishi_cipher_name433303 Ref: shishi_cipher_blocksize433620 Ref: shishi_cipher_confoundersize433911 Ref: shishi_cipher_keylen434297 Ref: shishi_cipher_randomlen434590 Ref: shishi_cipher_defaultcksumtype434979 Ref: shishi_cipher_parse435304 Ref: shishi_checksum_supported_p435600 Ref: shishi_checksum_name435859 Ref: shishi_checksum_cksumlen436164 Ref: shishi_checksum_parse436466 Ref: shishi_string_to_key436785 Ref: shishi_random_to_key437889 Ref: shishi_checksum438531 Ref: shishi_verify439461 Ref: shishi_encrypt_ivupdate_etype440367 Ref: shishi_encrypt_iv_etype442296 Ref: shishi_encrypt_etype444026 Ref: shishi_encrypt_ivupdate445690 Ref: shishi_encrypt_iv447510 Ref: shishi_encrypt449115 Ref: shishi_decrypt_ivupdate_etype450645 Ref: shishi_decrypt_iv_etype452574 Ref: shishi_decrypt_etype454304 Ref: shishi_decrypt_ivupdate455944 Ref: shishi_decrypt_iv457764 Ref: shishi_decrypt459375 Ref: shishi_n_fold460873 Ref: shishi_dr461739 Ref: shishi_dk462525 Ref: shishi_crypto463510 Ref: shishi_crypto_encrypt464663 Ref: shishi_crypto_decrypt465505 Ref: shishi_crypto_close466343 Ref: shishi_randomize466782 Ref: shishi_crc467293 Ref: shishi_md4467948 Ref: shishi_md5468399 Ref: shishi_hmac_md5468860 Ref: shishi_hmac_sha1469507 Ref: shishi_des_cbc_mac470160 Ref: shishi_arcfour470692 Ref: shishi_des471792 Ref: shishi_3des472529 Ref: shishi_aes_cts473274 Ref: shishi_pbkdf2_sha1474251 Node: X.509 Functions475352 Ref: shishi_x509ca_default_file_guess475701 Ref: shishi_x509ca_default_file_set476137 Ref: shishi_x509ca_default_file476763 Ref: shishi_x509cert_default_file_guess477277 Ref: shishi_x509cert_default_file_set477736 Ref: shishi_x509cert_default_file478380 Ref: shishi_x509key_default_file_guess478908 Ref: shishi_x509key_default_file_set479336 Ref: shishi_x509key_default_file479946 Node: Utility Functions480370 Ref: shishi_realm_default_guess480592 Ref: shishi_realm_default481201 Ref: shishi_realm_default_set481542 Ref: shishi_realm_for_server_file482014 Ref: shishi_realm_for_server_dns482391 Ref: shishi_realm_for_server483781 Ref: shishi_principal_default_guess484310 Ref: shishi_principal_default484725 Ref: shishi_principal_default_set485251 Ref: shishi_parse_name485722 Ref: shishi_principal_name486544 Ref: shishi_principal_name_realm487547 Ref: shishi_principal_name_set488785 Ref: shishi_principal_set489468 Ref: shishi_derive_default_salt490051 Ref: shishi_server_for_local_service490567 Ref: shishi_authorize_strcmp491175 Ref: shishi_authorize_k5login491758 Ref: shishi_authorization_parse492335 Ref: shishi_authorized_p492649 Ref: shishi_generalize_time493406 Ref: shishi_generalize_now493805 Ref: shishi_generalize_ctime494169 Ref: shishi_time494486 Ref: shishi_ctime494950 Ref: shishi_prompt_password_callback_set495568 Ref: shishi_prompt_password_callback_get496455 Ref: shishi_prompt_password496868 Ref: shishi_resolv497530 Ref: shishi_resolv_free497988 Node: ASN.1 Functions498169 Ref: shishi_asn1_read_inline498380 Ref: shishi_asn1_read499314 Ref: shishi_asn1_read_optional500163 Ref: shishi_asn1_done501109 Ref: shishi_asn1_pa_enc_ts_enc501451 Ref: shishi_asn1_encrypteddata501734 Ref: shishi_asn1_padata502002 Ref: shishi_asn1_methoddata502266 Ref: shishi_asn1_etype_info502538 Ref: shishi_asn1_etype_info2502811 Ref: shishi_asn1_asreq503074 Ref: shishi_asn1_asrep503326 Ref: shishi_asn1_tgsreq503580 Ref: shishi_asn1_tgsrep503836 Ref: shishi_asn1_apreq504090 Ref: shishi_asn1_aprep504342 Ref: shishi_asn1_encapreppart504608 Ref: shishi_asn1_ticket504869 Ref: shishi_asn1_encticketpart505138 Ref: shishi_asn1_authenticator505421 Ref: shishi_asn1_enckdcreppart505704 Ref: shishi_asn1_encasreppart505985 Ref: shishi_asn1_krberror506256 Ref: shishi_asn1_krbsafe506518 Ref: shishi_asn1_priv506772 Ref: shishi_asn1_encprivpart507037 Ref: shishi_asn1_to_der_field507317 Ref: shishi_asn1_to_der508055 Ref: shishi_asn1_msgtype508684 Ref: shishi_der_msgtype509163 Ref: shishi_der2asn1509605 Ref: shishi_der2asn1_padata510100 Ref: shishi_der2asn1_methoddata510583 Ref: shishi_der2asn1_etype_info511074 Ref: shishi_der2asn1_etype_info2511566 Ref: shishi_der2asn1_ticket512050 Ref: shishi_der2asn1_encticketpart512538 Ref: shishi_der2asn1_asreq513024 Ref: shishi_der2asn1_tgsreq513497 Ref: shishi_der2asn1_asrep513970 Ref: shishi_der2asn1_tgsrep514443 Ref: shishi_der2asn1_kdcrep514918 Ref: shishi_der2asn1_encasreppart515405 Ref: shishi_der2asn1_enctgsreppart515905 Ref: shishi_der2asn1_enckdcreppart516407 Ref: shishi_der2asn1_authenticator516909 Ref: shishi_der2asn1_krberror517401 Ref: shishi_der2asn1_krbsafe517882 Ref: shishi_der2asn1_priv518355 Ref: shishi_der2asn1_encprivpart518839 Ref: shishi_der2asn1_apreq519324 Ref: shishi_der2asn1_aprep519795 Ref: shishi_der2asn1_encapreppart520280 Ref: shishi_der2asn1_kdcreq520766 Ref: shishi_asn1_print521255 Node: Error Handling521604 Node: Error Values522365 Node: Error Functions527373 Ref: shishi_strerror527540 Ref: shishi_error527919 Ref: shishi_error_clear528342 Ref: shishi_error_set528871 Ref: shishi_error_printf529568 Ref: shishi_error_outputtype530092 Ref: shishi_error_set_outputtype530437 Ref: shishi_info530725 Ref: shishi_warn531033 Ref: shishi_verbose531335 Node: Examples531620 Node: Kerberos Database Functions533254 Ref: shisa535945 Ref: shisa_done536185 Ref: shisa_init536374 Ref: shisa_init_with_paths537020 Ref: shisa_cfg_db537969 Ref: shisa_cfg538602 Ref: shisa_cfg_from_file538917 Ref: shisa_cfg_default_systemfile539261 Ref: shisa_enumerate_realms539900 Ref: shisa_enumerate_principals540518 Ref: shisa_principal_find541171 Ref: shisa_principal_update541891 Ref: shisa_principal_add543097 Ref: shisa_principal_remove543888 Ref: shisa_keys_find544459 Ref: shisa_key_add545537 Ref: shisa_key_update546046 Ref: shisa_key_remove547429 Ref: shisa_key_free548398 Ref: shisa_keys_free548692 Ref: shisa_strerror549322 Ref: shisa_info549642 Node: Generic Security Service549890 Node: Acknowledgements551137 Node: Criticism of Kerberos551860 Node: Protocol Extensions554108 Node: STARTTLS protected KDC exchanges554928 Node: Telnet encryption with AES-CCM564065 Node: Kerberized rsh and rlogin572055 Node: Key as initialization vector582659 Ref: Key as initialization vector-Footnote-1585018 Node: The Keytab Binary File Format585184 Node: The Credential Cache Binary File Format590028 Node: Copying Information593457 Node: GNU Free Documentation License593719 Node: Function and Data Index618852 Node: Concept Index695607  End Tag Table shishi-1.0.2/doc/shishi.pdf0000644000000000000000000340346112126773317012443 00000000000000%PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 6 0 obj << /Length 310 /Filter /FlateDecode >> stream xÚ‘KKÄ0…÷ýY¦`bnM²Tе®Ä…Ô¦Ó1)‚ÿÞ›f,.D¤‹{“œ|çæˆÀˆÄ*Žväe¬Ä²ßHin7uZI¬JXÖ0øŒ¡+³rá·Õé¥5D ÞgHÛå™LÜ:GÚWò@ïú!õCýØn«‹¶z_1Ygw°Úå Ð11®º)tcî…‡L—¸7š-¹4¶X\…ø\3éhˆSª™RŠšR†ñ° cÍ€†}‚ùi¦}9ë¦Xš¹¹Ñts}_vÒgšñÎLœãÂ6˜ŒD_(~ëÍÌ k )7+¸àò¤ôª”³CvÅJ P™¿¤š+ÝÈü>&½àBáïÀH%˜c†Ã¸`­¡Û)….%\þ–(ÅÔÏD1/¯¾ýÚ8 endstream endobj 13 0 obj << /Length 629 /Filter /FlateDecode >> stream xÚ}TÛnÛ0 }ÏW{’YÑÕì©í–bÅ0 ‹·—uŽí$Â+ð¥]ÿ¾¢¨4ÙÐ "Š<¤(óˆ¹ eRÒBåQ}X0ïv_o<à”ný/$ÑBDÉEµër±\iqF Vð¨ÜÂq™ºíÇšÉ òò\'a <§2œ7àZõ(‚vnÒ‚ÿrˆ^a~œ7› ÐTŒlBUpìœ+PÖ÷Ún'@=Â_5¯oÎ:¥|ïâD§y4ÓKôa=ˇXk—ê† wЍu[Cöè×Ò']2FÂHÆ¢fÉÅz¾G7g<#%ÚßT‘‚ÁÝc8Àz]Õ€ÿuNÎBrzN¦Ž‘,Ȧ¼Œ˜ßù·ÇÃÑá}áÆ`íënnœ°¯¨nÂƒÆ îqŒØ9zÃ@˜©;}.î¹T~Ž{ž#ØýkŽ -ÌÑÿâÊÅ3¶ÖSú endstream endobj 58 0 obj << /Length 2552 /Filter /FlateDecode >> stream xÚíœKsÛ8Çïù:Ja‰ `o'“ÊÎNv*öTmÕY«W‘T2ùö’Ø”ñ°۱Ǫ©+2ÙÝÆÿ§n  ÏõžÉdÆ)E’‰Ùjó*éÞ­>Ïúß½Âúº¥ºp ®üéâÕß~NÓNL$ž]\ÍR,äÖÜÅåì?órñ¿‹¼z{aí¤„ÜÒa{å \yäˆà”µUL™`SÖ{»XH6Ï?­‹Å’òt¾»êží¶ ŠçMÑÿ¨Û˜zS Q–‘Ö”úëF ËzKx±Ä˜¤ó÷ý-ÕNYÂóËê)•±î~œ$ÐV¯ÓŒ)C¿+ïd£ÝþÍ©÷=Ú›ÞKŽDgjh%eŒ¢Dôº£Tý %Rý“€ñ;}ûÜoa8r¢e<ŽD9aøñk¯¼áq ëésÚ'» E"ÃvHïJÿpmƒ¹éAq¶×`$PŽ}ºÓ– q³ëAìNØoU7)û£Ô[³pFf~÷­ÿ¢\µÿüÿ‚ðyá.º8cˆ¤Ù‹›¥yòŽóÉyä‘´ØÙPƒ‘Äp ú´81‰2Ì N£=­]õµ%¯.o@E¯0]·.ÞÂ%¼pI¤xöK+z@§³2±uÙ“IŒ•#Ÿ7kQ¡jöúõúrSn˺©òîÄÆ­ª•š9%)~åÊWZôHL/-ƒPiŽÍNILß#Ÿž\ ~&BçjKË{=Þuë4s>§û´7;Ýjº.ëÜÝcj—oì´…óH+3=© BIàDƒ.èÓ@G¥zÏ.£¶©UØÌ>ªá|2ŒQ–¥'È`êcä™L0 oD›<I„¼°OKçˆ SÓ왊ßë8qBM­>uÎǃM­ßt4!4!&X:Ñ‘ÄÐ ú´hªõWF-šæ EwÂqDçué9ï¨Ê·À§®éýyðA¨•šá` !‚8; 0’„AŸÂ#&ˆ0õWæ7ÎûW»ªo9üòæÌ½ûà/½qêCI÷t”!” ¬ÄÙe€‘ÄP úÄX"!ÄŒR(Å%»¶°ä|©ÑB-CÓù/EõI-4ø¼¨vuÓ²¿ä,¯‹þób[—Mù¥lÚ•‰nkuO"tJùzÓ_÷!ßΑ)oÇ¡O.ý7M—k0’ G.IL® O+I»òaå"®ó¦P›öóÞ½X÷«ÄU>,Ëm{ +žê8Ò¢}ØD°'–|¢ë‘™.ú` $:À#:ˆ$&zЧ”ÐAs3~ûG¾Ù›ößrHï“åVó™ä‰nèúTï‡fºèöþæ`ü‰³¡ˆ)rh'R Áå ¸f+UÜan]íT½,úFŸ»©ËÔý)~©•ÝŽâÉätFJºÙ‘Dà û4³C"Rĉ¥ÇœŒÔå[Øò­J{™ë½ž»Û7 ÖTžÚ7P¯ŒJÓ „„0x‘Ä ú´é‹”ra´sÊsx8÷°ØëJWUÔ‡MáNaJ?M¤‡y:AƒAPMA ’AAŸ– ö,"áA$DÐëm{0ˆÏ¿mv‡:œÐ2‰Ò”ÿ%k¡=”Ó) „(Šî¤D£$èÓR¢Òဢäßêo•}¦ÉÍuÑï•j‚lwÈÝÐDý‰üi·F|âëš.þ` $>‚8÷`$1ñƒ>1íU„RuÄ·eæ¬*”¨úT„^Ýì]œUS¶ý²•½øµâbgç×.¨*fü÷³|Zê?xº–ƒ–p\=Z‚HbZ}Z-ÕZòjI]õŽEu.r‰zMø‡Ù'²‰é"B"Ã'ÎILä O+r’!AF"Ó»}`×¥NÚ·Öš#ÊàwKøDÖ#1]äÁ@HäÑ€;nÃHb"}‘ÛSDgPd÷™ýÄ~-›ë^_[ éq¶¬:òà b,öð¨GûdY€€,ã!rža†‘Dd û4-,à!1û\Ú¯‡uSÚb]Tº‰\û¾©…srÚ¹|ðY›Qk:ˆ"t¨ìØM…sçFQÜæ ›ú󻔬A´Ï­=yëÝ^·¨nձƔ öä6(žÏÚШ1´Á@´‘èÎ=I ´#Ÿ7NÄb*1Û¨LŸˆýX\U±]·; ›¦(a±g7<ÇfÍpM>6 ŽÍŽT¡Î6Œ$Á‘OO¶! ¦3³ë÷ÝÌâKYí¶=ËèŸÌfó×u}Øìý{)FX¾Øoð¥=ÌÓÓÈ` ”F š‚@$1‚‚>-A‰@™´™Ué»õ®®ójt¾Í›Â÷&#ÆOßöôû(F¡éð BðA<ðHbð}ødŠRfê˜],ÛS4£çÈÊíÏWê’y¹W¯L>ûo|ûgé“þ §G>>¢Çz2EÃýˆ  ÔÙZaD :4rA•Ød+ `È{ 'X­,Åé(õ}θµ “1î`Uwc¸ٟ»Ÿ Y endstream endobj 133 0 obj << /Length 2915 /Filter /FlateDecode >> stream xÚí[sÛºÇßó)ôVi¦Â!â¾õ¤IÚNÛÉ{úÒvZZ¢mNlÊCQIs>}A—¥2œsâ:œÌøÂ»+ü\Ü–4^dê^ÙBPŠŠ\.6÷¯²ãÑöf1üðÓ»WXŸ·V'®Á™?^¾úá-c œ¡"+ðâòzÁ0C-¬½Ëíâ˺^ýëòϯÞ\ZKŒ3]ögF|b\ )åB¨cƒÏQDVkœeÙò}[7›ú¡¼[­)¥Ë¿•÷վ臷œŽ 1D©ò{´ð;u5Ã7>úÍ{ðŒSžxðÙ;3§ê[д/(bêÿÔQõ“£²ã#PbsýðÈ|êæ(-¾ˆFù‘L£ÕŸñ‰iŽ$% ^p…D a WOÓÀÕîºÿž/÷UûqEä²j‡ã??tÕÝ /oõ/·õ¦O=·Ã©Ýn8¼ÙÝß÷‡M½)»ÊGQˆL>¼) õM×Ði8jO¿† ’˜†AŸVC&PN†ùô¸cÐãíJæË]{ïMê“ðï~2E‘nêtŠœE#E‰—"IŒ¢ Oœ©þ_¥|žçˆÈÜPdº¸­÷·õÐë]óÏ ç7‡¶ìê]ãï@âû^;G_7Å™#3g ÄÙHs?g ’gAŸ6[QŒ°Ê/†3;ýÏÀãð*Êåv<²­®ËÃ]·n«òN'¯±¡ 2›»~ã#”¡<ãÏv´ûløœS«—¦3s‰LI Ì O &¨Lòx0ÝØÈg!Ô%$'G™˜»^?yZžtòœy# ¨—<IŒ¼ OK^6Lå,yô|ò6wuÕtëÛͺê>?˜…¥™¼¯Hž–'4ˆÆí·ÃèÑk$ˆ81¹.÷ öÙåž`¸ÙÕþˆ‡XVç,Ö„PD„jRLÖÃqË ŒžúÚ´ŸÔØãL*T$>ÿcH¿ééOƒqŽ˜[Æ™^|ƒqÐÄMÆ„DŒâô› Üdæ¬ÀM#‰ÜdaŸö&ã Qéî1vþ=vèöÉݧ2ÃJd9G‚ó†Â/·4¨µM§Ö^‚ägÖ…C6äÐË"¤pÈòó‘íwªvzŠvÌá<’šdÎ^ȆÄ7[B0¦£é „Ø¡â‡D£3èÓâÙû £ŠóñìÊ]}_í—N‚Š"eèÒÛm«®­ý#pNcyZæ/dQbŠG-Z:Î@ˆÇ~A$1ƒ>-„¡‚å#Ò¥B¦¹yhw›j¿Ÿ—´¾ÅÈS«—¦3sIîD3èÓ‚Ùç(!˜Åù`võæCÕ­ïêëêŒDé_R ’̓ϯ3ÎÔJ¦Cê „ ã‡Dƒ4èÓ@š℃ ,DiŽ‘ÄÒMšêÓ$¤L¨é{xÝ‹*ŒÅ¼]õ5ë°Œ É¬VÇÜxY…‘DX û4›¤¹ä(–U6IËGì‘b¸;Opž”$é´9!ÚFÊ3/m ’mAŸ63 Š(±…ìQ[¥Wþ…ÁÑ2§0I <÷ÚÏtMC:èÎ@ôt~ÐA$1Ѓ>mZå*jakOÌjÓû¾f¬lËûª«ÚýPºt½ÓU­û¡0Å›_U·/ÅÌðÓ&ìF”tÞœo#í¹—7IŒ· OË[.PF,oâ|Þ¶þ’9•š9›gàNiZ‡tÄœb#¹…1I ± O‹¥H [M"ÏE¬œªªË¹œGŒOÌhZ“tÜœn#é¥7I · O‹É ¶„Ĭó¼izÞ>Öí®¹¯Ž?wsWŒ+ëòênâY$•Ó²yëðñ)M ‘Θ3b êͼOšÀHbŒ}ZÆ2˜°ŒÙeš?ô%ýÇV7 Øõ ÷æe·ŸJhTˆ9¡=1¡iEÒasB°Aá'`‘Ä` ú4s_Zä('ØÁf'¿ïª¦jÍ3 [Í^¾Üò[ù_:ãª9òy¡/ºL“'Ó h)ë§ F¡)ìÓÒ$1"Àdj{_—wU³-ÛSšê®ºßOÄñœ¹‚ ­Î‘½>„”y+ÄA1ˆB-C\ö;†L•îe}ú˜å¶ìSÑgÝ)N¢DÔD‚Í›ç÷wZ‚t°ìõ!°€Î`¹0b`…Z°XÿvÈÊ¿ ëç]ÍLjÇr2ãôØ!»iÿt¬œWPfæ­L‘ÄÈ ú´héÝR‡–Ù²z½;>‘{U7Õö´ó+}¨KÌl„Dùs!qJvÝ6é²;!Ù¡²ƒHb²}ZÙ‰DœCÙ¹«ýŒ¨ŸŽo‹¨>œÑ_‘S¦ö«ôWZ‡tÄœbPnæÝ ‡‘Ä ú´ˆa††Cj³ŠþSuWvõðØeé‚/æm}Ü /oüÌI5Îz)ËPS”è¦L§ÄQ› D£$èÓR’õ”Ø…ðC«»–ã´ý z#±¼Z­ÕW»0~ ÕÕ’~RD¡°¥/Ýžé¨8!T lÌ» #‰¡ôiP!²@CTÌ"öEµÙ5[@öu³©N^fóæaxUÉ‘žMÒ­—&Q!¿‡Ú† zL'Ó è)é§F¡'ìÓÒ#8Ê8ƒË…fyúb £ÚÔןí»l:Ï̪=Lí…5%Ë^æþî*º=ÓQqB¨@Ù˜wóFC%èÓ¢Ò—.ã¢b––ènwíÞŽŽ=UV…DRØÉCÙî«÷ýÓ(;£üÅ”LÁ¢[4g  nI –ŸBùÌÍ99ʬlõ¯DoãöÓfLØò}»»iËûû!‘¶ükÙ¬(^Ì+GÐVúSVü-{ó‚j Žm£<^êáú50àiöS7CÛ{+6`$1©O|ú·7 ˆšWw¹ZË÷m¥îòÉb^IÉñ<'þ¦;WFºôä „Ј?• ’•AŸ¶·Rtš[*-—¬ÊmÕzŸ»‘ˆ11#ùm‘Ôº¥#é „ááGDC2èÓ ‰ Œ2 4›©jê®.ïêŸ'³eÁ‘ ù\Uô ”ëU’ÀÅ÷#‰öiæm`=pfçõï+Iû增¶áé›ÛêøþÑÞi\FrNŒ_s¢h´IÇÎa7BÀˆ$†]ЧŎ÷å‡Ù–ýñPßmÝR‚Y†Úïí¦šÚ9Á¹œ·fÏÏfºíÓ±rBX$ö–êÂHbX}Z¬Fœ¬˜[}Þ¹¼Ù5ך­j?Q@™1$ÅüÈÁ×Y5’¤Óæ „h)ï§ D£-èÓ¼S‰ró†·#m‡y~úX—ê¨ÿÝ'Tv‡ÿáÃͺ7Rß$>…­fàâyïòM‘£›7g DÎHE?9 ’9AŸ–rük$3οèÊf[Þé…s)_Vx¹W.kõÃÐgæË¿ÔWݰ]³»óP‚ÿuÞi2¥ìðñÓ…µ×‡t…mìýS" Œ˜ª!‡VTLT•>RUïßa(£ÅË^å6M—N„3Bb¤Ÿ I Š O³ôY(×ÄB11?ð¶ŸqšMd¢>ZmÍCÝGŽA´Ét¹ëpA¡¹·ô„A+èÐ%ûaª©LÓz–ÞïËê~â¢êÎEŒð¾fž”δ2ɼ¹ë¼Aù¹·ä„ñoÿ|p endstream endobj 201 0 obj << /Length 2765 /Filter /FlateDecode >> stream xÚíœKsÛ8Çïù:Ê!Ä‹½ÙŠ’ñfãñZÊÔVíîA–[5²ä•ä™Ì·_€À– 4Ú™LbÕTEšìnâÿëˆöõíI/ãœ"ïÍî^%ÕÕÍM¯þrõî5÷ ÔpçÙäÕë·RöhBФ ½É§ž¤Lwö&óÞ¿û‹Åâä¿“¿¿Mœ)ÉXKŸúΈSšõWÑËÔµ„gµSIÄÉ€&IÒ?½\þy2àœ÷§«yý¥ºx©¿‹þÛ“\ôV³Ýb½ÚêH_¿Mùžƒ\’¼`* Êôß”á4«?Ò½ÿk±ësÏîá@Á ¢ßÚ–¥‡Hõ7uUýCY¥Òþ(—}~ x$;tS•k–<ŠFù‘„1ÑwF|ZLÒ"%yî0‘“ñéÛÑ$—Wç¿´ED„']ùËÐÐÕX€"[Ô)Šö-¨"I„"ܧ£(ç$ã©¥(5M³–÷Õÿ”»¶ð$)ÉXú2àùZ!ÈIªô±:}9‚õó`À‹à¾›J@š0/ƒ ”ƒ¨SÇ`¦^ —–ÁÌvxãºùRÜq”»‚™É—Úf}E!^ÝYl `,B,(å^A(1Q§ŽE™Á‹¹mßµ…QÝN¤dÇFðŒ…ø3uç¯1€ñQ 4÷òB‰ñ‡:uü AX.,Òÿ'‘Ééø‚Põ…¶¥Sª¢‘Å_v ðçÐâÊ”}w®WPbÊ„—+JŒ+Ô©ãŠSB9·\ÑÄu²¯¿ mc’0Q{Ú/žåÝk `€A­)+¼€Pb€¡N`4#EÞF-`»Ûr¥Û­Ýb6Ý­7mYI_z7âÈ”uwŽGPR*ý“JŒ#Ô©ãH}æœ9Ž˜áèýÕÙ`tu¥Aúùªu6ãØÛ…!2Ý¢ÆÔ“¦þ¬%êÔB$Õ”0Í©ƒˆˆ†›?îwë›ÍôþV ¨Ú™Ò"}á^"[Ð!ˆöô¤™·%‚¡D Â:ˆ²œHÞ@dñÿR¯U´…G}OSùC¦Ü¿Ù0Ê ÓºÆÔŸÞa %êÔA—JÂsÇœÍêÜ-–‹îüþhM#BM Žcõç$¯V§;xîyŒ;€K¼&ˆ#FæÑA'a¬pÔ¥nrxAèðÆù1ïõ¼¼aº×Àˆƒú³Ä›é‚¡Ä˜C:èôªWÖ4u6í?Úlì$ñ§éj¾\¬nüyVY ¼=ÿb“•¦;v ;HcÞesJ ;Ô)¥Éó¼'™$Øú¼_tk7]>”?%,-Žè=K6ß Ò¶ÆÔ=%êÔÁ¦:Å,Ëlì1l-ºÖ”Ђ¿ð4F´LñwG«1€¡UfÌ»P C‰¡…:µÝ§(t~ÔmÜ v¥rôyzw¿ô7\YF 5X’!ù@(1ùP§N>uMØc3Z>ÑF>sLo6+ï¡”nš»µUoÓløÆôã}Ô“\é§ÆY„JzÌÿ}‡y Vd„=åÔ 0€Ô{V`(‘úƒ;µõG7/ÔµÐõÇî{QS‚ ðYYÎõBp]c>íJ³v²}Pµ§ê¦¶ŸT›·<x¬Ê›õn1ÕiEoµ))¾òrHNóÊÝål `rÂ’ É B‰É‰:urª!@aO8h9Ó–r~š.–vxÒZC–©¾á©öÀ¦º ÜÀ†e͸wï %&0êÔ ,3’ÛZ`»yã¼o”›i•Ê7]?õˆÄÎ Üq:Ÿ«Qæ¶ÜÖ׿7c'¦&!)ÿóÅĦºKÜÀ$†¥’„“uê$‚¤9Ø.0~ܺšë4ÓýCNùåúÆfñkm…] Ê@Îíq›,¿öJOHPóÒÝm `‚² B‰ Š:u‚ªÚ#íF|-¨]œsë+ûs¥¡êUmÕ«*œÕÉI–ä/gÕ%„)âîø40| ’!|@(1|P§6%ÈhN¸Ý‚æ Õü¦\®J3›)W3}Æ¢iû]2èt¤0†š¨á/FW“Lþ½¯ñ†à0ØŽÆÔ)%êÔµ-‰$Œ7p¸\áp}wç~‡æbzg{zwmh'°UIñ£lò a ¯; ¨Q J Ô©ƒŒ$yÃóqñ¡œ®Ô˜ÂO—D¤éñ¨SºÁižG¸2î=âˆPƒztÐd¹š• 56z®w¶Ý™¦fŠþU5õ¯òñ 'ùKù…˜ؘòíÎMcÊ"„CuêØI%É2Ð∃™éÍfê¨ù‹ùE=}ÛÇÉO£‹ÉùðTn&ç?_˜U7Ðýõ}0!s­ÇTëw˜j¥’‘ô)[Ò¬‚˜»ê "¼[Òa(± ‚:u„ƒýº‚Èà4p¨¦{ |â'Âñ?[¨ÝáØ¶ŒC7(0¼õ^Ü)åõI{ÊRÂY €ivLþF“?³¡G'|« =p3§¡L´ L5¨©HŸÒ ›»?¯íÔ*=e»20€Us—© ÞS²0”XU@ºª¨Ø™„UÁNhNGãÁpøá ë¾aî#$§yåîr609aɆä¡ÄäDÚ®0OÕ¬@4jºcÏõo­­Öú£Ú;\Í92·uøðW±¨¢ãxо5S¦Ü;#Õ<Å âxÄÓÿ¸¥â² endstream endobj 9 0 obj << /Type /ObjStm /N 100 /First 838 /Length 2247 /Filter /FlateDecode >> stream xÚ½ZM¯· Ýß_¡e³Ñ)’#@RÃÝ´@{ÑÔx‹Ôy‚ïþÒߣoS83iâ§)`Ü‘çIçú Ä3ÒT’$/‰8‘J"J,–´¥Š"i²ÞYjŽGCEO„Ra´@‘*]F‘…£~ÕšHbš¸¢}kÀ@÷ÄŠ¦ø†¦ cü©àÜÑ´¢>ª€ûR šj‡hÚJª¨ªR´yMu4)š¶&°©Zª uØ,¨"+§êhbr¯¤Y@(¼©µ¸ ¨;DPvˆ&)“Quü4TEGšTó$ø'.Ц ;”Pv€ ¯[‚ëâ°C=iŠn, ” ?‚wè-E›†—ºÈ¥£­£6l³b=¡¯ŒšQ1ÆS2)œœ“)a´j2C/º$k ò1J°Î-™]¼¥6ˆ1dº&÷Ô/ N7#ˆQh:Æ ¨ÍбTjj =AERë0†àYsc ËJ/*-uŒÞÀÆZFÁS—1s¨¤®c 1iº¡ o{C×aŠÀ1ÃåÝÛ¨ “J•á¹]h̬ZFex#c‚ar¹Ö1³à¿aÈæzCæ—wÌ/ÂsÇ£A\ ºÆÃÜ„ic–•JõB<<—ñÞh-F'Ø0¯Ž¶MGi8ÔЩŒ~‚èNP¿˜ð`2ê’Žµ¢c˜µË³g—ë«ýó>]¿úöûûËõïïÞ¿K†åõõåúõý»ÇoßÜ¿ÃZÛ^üåþ»¾ýòñ§ôºà…¡³šóÝÍߢØ·jŸ¾!¿Zzö,]_4ŒÉø Š˜D}+¢Òõ«·o^Þ¿O¯aÀóéúêþ§÷éîÖ~×2 ËG¦aèžbÛ º¾0ô<Å8í§ö{Œ»~ñððœ×#‚ ;ÈæcöMC1ÇÆƒË|Ð|ð|Ôù˜nðDá‰Â…' O”:QêD©¥N”:QêD©¥N”:QêD‘‰"E&ŠL™(2Qd¢ÈD‘‰"E'ŠN(:Q>êø­£.×—þþ~ûÿŸxøÇåúåãÛïîßÎ>.wcÞ`üD(Ø#5—GAcвª|±Í‚—éú§ÇWéú<ý>Ãÿ6É gñD'otU2³JG5‹SFl8•®”\%èJ˽Ô]ºº†N»Â£¶Ñ©KFÌߥÓEt 3«f£ë”÷½ëO¤«ž 6&ÕtÒYÏÒxìÊ">Q¸|ª¹òÉ|•á“L>áLÎå#‡OuòqÏÝ}ŸñƒOÁGš{Û§ã§ÒÕÜmœÞc¸|±0ú./Z ØôrÓfð)ÞéߢՀT0sÐ!l{içÒ±fêÁ‡°ÝÔÎå+žGr¾ñ!l#‘Üç³5|ì–GÖ´ñ!l‹ê¹|X-Nì5×"çò!>‹Îƒ÷’Kåsù Ñ“Ï,÷~À×ñᄆ$vòáì}ŸoQ8㊣t >)¹•“ù°<Ž‚Ì-ëA¸æEᓱz™$ïÏκè DNðhîE\(óþ⫼ˆ®á,]æÞ@ØËÁ9°.ÚÈ.ÍàIM²ËþÞPuÍÑ…jÏÜÃ?AY†oÑb'LÎÆÁÇžåàh¶Œ“©Øä#ìƒÖOåC|–Øk©ÔLt@·h­wÎÕ'Nñní7°=O¯5¤´¿~ó·!µ6.éáÃ?Þýª´õ_ ÜS­Ü$¯šŒž¦ÇýR«ôi¢—N¥H§RÔ§RÔ§Ý}zÒ§RäÓ~Ÿ¦ûTŠ|*E>Q|¢øDñ‰âÅ'Êè‰ù¤xrm–©ÜtЭ|.fdî)ryדé”3Gr¦Èå{ÑsùË{$g*–Må\>®YKè®u+ïóÉ*Ý•s»©ô\rÕz*Ÿ¸g»Éôؘø 9[Æ×>…t‡©$Ÿ²J m5×HÎɼEk]'ôRèôb-|B[%ô¶\ø&ôJÖƒôLi[Ú2ýø&(rÀ·J韥KÂHÏ|?ZkY¥,k–›°¬™¤JWùËdC*ï~2[§Ì-dåž»ìo Ê«de…K¡IÛõ\>Ì·ÐA ;ûÁG]%cãiý9$m—sù©¼XèÊHååÀ¿E¡g\ø|Ø‹ŸÌW |ÒЕ‘ÍËþÖ ºJWFìt ]Ùrs:—[‘Kð!G29à[¥+c+Šë›¤í'±M!mSykx'Èò]¥b#êHÃÊÉ|Ðf7»àAÚ§‹„ÌÙjè®:>þ·sù Kä)$[ù\>hŽ€T‘÷¤™ê«tìq%ø†¦}ðpÒ”iæ´í Í´EG¥>n Ì£ËP´’L“teŠË¿OXþY@ÆëqóTUqþD•™ ýBež"î'\­Œ+B:i¨¤ªk˜Já׸=Ÿ¡ºZ¨®v»£ª«žž^ ¼x-ðZàµÀk×n—>¯^ ¼x=ðzàõÀë×/„tê·[¤Z:…˜N¡¦SÈéz:… N¡¨SHêÿG5¹­Rw}|¡nÿSMvzú¹bÜ&ÿ­j2^Dˆ³’Æå¢!'>ôóÕ°”Í endstream endobj 247 0 obj << /Length 1245 /Filter /FlateDecode >> stream xÚíÚMSã6à;¿ÂGç¡oÙ½•°l·íöÐIÛCÛƒq hlÆ1[à×W¶%Y –œzèvÙt˜!Áï«è}$Û (‚êE)Œ! ¥I”ßÀnk}õo~~‚ôqKuàÒ9òl}rzÁX„ HaŠ¢õUÄao½‰~å§ÅŸëïOÞ­m$†ñ)Û#'r"HÕ^ µ Ñç<d±DÂø‡¢¾\,qµ|.6‹%!$®·7ý›¬ì¶Ð¸¾­®eÙ6ôô‚“ø ‚DÕž.ò7*.ý ßùëðsÏû2´íUª’pÂm§·ULí0U¿¶œ»[ܺšó—N€‘Úî§é*€)zÑ•ÈmŠT{äDR„R$IÄS®^PiRï¶Mvy+¡¼*Ë"od5·0 0Éç J=ÄÃÇtñl>N€ŸJzø¸M™àNjù$•ÜòÁ/g¤jÛ’›¢\¨-ü"šg^L”®f£ÀtÝÅóù B|ÜJbŠGù8M™âLjùõ6ð!~>ÙCscð0rv|ZtÎ×2iq çÓâ4eJK0©Õ ÄÑB͵ê±)ʹï9 ‰#–¢{s¾”!@HŠ[4Ÿ§)SR‚I­JNè …i)¿ÉrSµ4þê­lå³ÚcBR!Gwz`>tº0óÑ BèÜúcJFÑ9M™BLjÑԱ踙žJ=3UW»3”ÏPTÅCGûLæ¤{y¾ !@H[LŸ §)S‚‚I­ $@š8‚„”×O÷>()êt~©NÞ:Ÿ6]‘ùÚ†!mná}Úœ¦Li &µÚ U·ÊxЖ˜›ïö¹úxÞ¾ü 5‡øßÜ¿cN×e¾¹!@Èœ[~Lé¨9§)Sæ‚I9¦æ*ž Á\ªÍ}ü°>ý®w›ìv¸FVµ|ö_ó¯äòè±`úk¶'@ÀÂNY0ecܦLX'5kÙL$€kÚGÿ'-`Û¯ZËR62»5º}ŸÚ¹©È›ª¶KDÇ·éC¤;z>¢!@‘[O"§)Sˆ‚I-"ÎIŒ!ó˜·¾)z' S“]öŽÎd™ÕÚÖ…¼ÕG\,uc^ßeͨ¤„‚¾²U“¾+ç+±ç‡8õ”Ú1E$”Ñ a`œ"|ŸÈª.6æaÌ\|VYÞN0æ³v@.Plуaœ¨Ï;0@>º«æ„ ¸Á4Eà4eJÁ^R¡’R@(ÇÝªŠ…‰zøÒè¾½¿WuCqQnä£z'X¼RÝB¯ªû…Úó$Ëë~LJòª+¬½QrÜØ˜1€~Í[@‘0"EöÓüã"éó—N€‘þÚOÓ‰®Û¹M™*Ò^RÏX…èo°Vö›È÷?ý⌴ºÐãî¼ê¾ Èîôb¯½= ñ2/ÊíèªJ `雟Ñ}#¸ëÀùãל½C|,l#¦Pì¤{1n©€C=O\,R?”¹.²ý¿5¨7çY“™»)G‡*)¯ûŸyýKKÓ)³‡¿ 0üwús8Vg·)•'mkMÀzdU•yqßL–´48C%ýœLúþœ¯ÄžBâ s1jdhÇ "m¡«Æ endstream endobj 207 0 obj << /Type /ObjStm /N 100 /First 889 /Length 1848 /Filter /FlateDecode >> stream xÚÅYßo7~×_ÁÇÞ E‡C $1\w½qh›Ëƒbo¡ŠÖX­šä¿¿ov·¶´m€ìâ ˤ¸3óqføãÛ±gœñâ÷-"AL-Ž„6šˆ1’ÚdRQ½lŠS=È:/+Ÿ0è ß,C5á"tä >±ñ1ãyR‹à ÙáÚ.^Õ³!T¦òÌ+<ÇÔ¢ zCA3&Ëøãs0 Œe6”läh(«,†JP™d‚c•É&b¤WŽ„@6 ™ ê˜\HõÂ"PL( uȱCôÈ‘áÁïR ¼ Æ#*–ÂÔ§lX"„ƒ3œ]‚oœá7ar\0 ÁD6‘¼Ê êTFLä 2ÉÄiE!#!Èa4&;3< öFœC$}ñ>¡Œ©  ¬2ÙG•‰è „ˆHLeEX "¡ÅZ!¨Fðƒ²/YG –æ‹ð¡ BrEW!¹’Õ ¤R2C“ƒR\!!FŠÇ43)˜!MR4ÃH“D‹ˆäÔSØJN…$ï5ŒN„eÈ¥1±Ù$¬’U^Ò ä"d‚‹èd“–hpÖ`ä5ø<´Â° Åpë¤#Њ.®ÖPŠó‰Y;˜–>Ià :ð) Ä n`5Ár ÚeO@*SöÐÂ,Sæ²zòdµ~ùé®1ë§û}Û¯Ö×Ç7ýðý_Ûýo«õ³¶»m:óJ·§{½Z¿hnzó ³´H•eØd¬)¶9È<5Ož˜õµY×¾lÍúÂ|ã}þ‡ùöÛ~¿½1€‘,‹œ$ž ²ÅþC±ÈÍ`™ Ð'[à"¼Íç#Íè7Ýý èÉb¹ž? ŽLjÆR,Åt/Íä`LÙF=ç0GDw"…e¦F 𪌀‰l‰ç#Jn®ˆb'UÀX,¼ À™¶a ¯ÆmY¬Ä @r3b'œk Æ¢[;!¥ê!9‹ûq0ÌÈ%Á«ñ(.YÜç€q&À,`äÂÖÅ)@™ 0yxÅ#`v6?Øé¯ÄÃZI` Œ»‚yŒ(H† šä™]±NjDÉÛì§<Œó†„­—Ç]pªòĦ3edÔ?nŠœ¿4 '«/`ÌÖ¥…ñé1ƒ·}˜L3âhÉõª]³ pË‚µZå» SeaÀLÖù‘ÏP‡~a<É6KÅӛʿ™®BÐЧŠ'd±, ȧÆ=AzñǼ0 ádñØ»¥½X7!é½ÓÂx.Zª‘pïg·ðšÁ;?¼w=X'èÓàLŒÔã¢Èn¼(ðʪDca@,L©|Í+#Z¤<_ó!ÙPß*X_é“W‚8µhx&’ƒ»TöäÁÅùeñ2ÛÇs ìã— ]˜WäÔÜ ³þéç_ŒVOÈ™ýq·{ýYæ²Ý÷ƒËMe/q`ãHû)šT»Æd´íõU×Þ\7˜£Y_]\šõËæco^?tõjó¶Y­Ÿ¤Ù÷œ–ƒ-uîл›æ0›†¡šÛíæYûqŒ€›RQ|µé ‹(bCðÕ:šNEËhÚjml}m©¶¡¶\ÛX[©mªíg;el¹Úãj«=®öx´÷úë“›°‚J%:Éc5M¹V“œ@y¤Ž ¼ƒ…ÌÁ¦P 7àÁOÎUG!Ž•Y ˆx뀊oѺ¥ñ@ˆ)s­½áõfêÀ›éXÀ‡}eV²MSÌj6@ᔿ/½qH ~aé ®Ò[ñàûÚˆò`œ«ö&ʈkíMÀeaÀ/­½±ÌU{sʈïkoyŠZq™ç¥_«QË})ÌOíû¹ Äщ­…0ÏÖO•úâ\e›¤ä¦Ô2Q²Èây@qsÕ‰È2ûZ'ŠÖ—‰M!é1×aù¿p‡óú~ßwííñ¦ß¶ûa‚GNä¿kú~»û_Çîºßt}s;j?ѽl6ý±k*´ÙßVÙþxML?>±ôãïM÷û¶ù0*Þ;‘{Þ}ºëÛ·ÝæîÝöF >Tœ~|béúxwת[*vµÛô¿¶Ýû:ñ‰g»wÍîî$pÃà©íû÷Mw³Ý솈ŒXuþgX¸h?ìwíæ¶ÂÔØ~¿?ô›Ýƒ£±¿•:±ûì8H¾h¶ÆâÑØo°¼¶oŽý=ùÿšN þ°Ù7»QãÑØêô¿[£vÁÇíæÍ®ù“?:öI;/·7¿5çfè¥.Ƕû°éné×Ñ1ד6žÞ¾ßî·‡¾Ûè.z<ÿɧ¹;U®o‡D¿Û6§›õ±À¹Øÿº}{ì>ïÓ?Ìœ}r&§šÆN÷y·­ƹ7ã‹_kƒí¥Í?/žŸý©Ôêô¾4ÿ¶z1 endstream endobj 339 0 obj << /Type /ObjStm /N 100 /First 869 /Length 1333 /Filter /FlateDecode >> stream xÚ¥WMoÛ8½ûWðØ›FüDEEÒí¡ÛnQ÷ÐÃ^›®‰J¢@IN³¿~ßPJëX’ÝîbŽ93óñ8t¤Ô,aR%,ϱÆú*OiMÏ%ÖŒ !°j&°'UÁD®˜L±Çá—’Xɺ iÆd¡±j¦ÇZ0•Â.ãLiàf‚¥¢ÀªXJðÉød9Ëâ¾fYž¯dް(žœ³<bÉé\üi.³ÎiÕ¬ ;ÍYAñiÁЏñ'œ„ ‚T+© á 㜫@®ÊBAд“3.PJ `+`s™ xüqÉi^RѼÏJ!~Nªî ÕR ÎRGq¸+Ä£ WíP3ÚA„)yq¸gØV^Š¥¼2-W„ÅsÀ+¯œõ…¼òŒ„šk*7ÜuA"T%á^LI„Z µJ½HÓ•’µ QL^  i‹±(ä&E‚„¡JA P‰ œŽP9ЇøÀ)F Ÿ•#„ Š¥Š¨œ”8¤"m•ÁX&p-„”$À˜š¨’ j©,2^ˆ@( dÔQ¤¡‚ "†Êœ%8tá€c"£¼€%béÐW‘§¤r=°˜Ðu%„N³•*€¬Ñs…Bˆ‚ò*€\àC2{J,KŠèÈQõ¼à@?ZSV$¼7•mŸ¯^¾d×kvýÆòìú–=ésöêÕêÙ_ÎÞG}{{CKé7¦s¾&ÙÕ;ªøu(€^3USÚÿ³¶›>Œ©l<2ÛÚ]f’8.ÉÁZ>ý¹ptgÎí:W!»¾­i ¶í+;ã—/øý^ûú¡ò}»|¤^pýüÍ'ÁôÝÞÖCíìö"ÎM°°‹~§D¹±¡s»ˆc®§ê΀ÁÆ–aNa$¿SéÛe$1V©3á±Lc÷®Û/ÕkäZÛ7Ýö]_vn$j îÛÐçÌ)&Þ·ö`KߨpÊ籨à|´;l½‰§½3uoÊbN1ñ~]\ðu…”MûÚ‚¤ÍpK†ÛxÎb‚÷¦ômkÂÑøèl¨F¨%åLNãÈ1uäì‡àêk†ó1†ÐÃÇ/Né Oœ›y| :g«’Á–Ô?ÒšORóˆ1çËç|AÃx]߬—=nöÞ·#¡Í“c޹}¿w›(t~…UÕ× WE‰…œiý,œº¬÷®Ý»x }½s_úpÄã%åâÁ[»3¸>Wš3c&Ÿš}OxÙt‡ÄÕ×íæÊvÍl÷FS4ëηö·8éùÊ´5²Q{wb² Mçg¶Ûåób’Ù²É@¡Kå ä:WYßw1 úlÜl¶j„†¾þÒ¿±í3̯¶»*ÝÎ.aÐØûâ€9Ãó3ôdl了&€ %ñMÀ¨ŒW/o$óƒ_AÛ^„Ûþž¹€fÎNëH6œ¹+ítR?ÕNßžñAuuÓwã±x_FœEítÚ£ëa˜ÛÑ©}À;ñmœ÷‹ê Ò)m½5áØÖuöñåXVO>¹ã)º5'Pgô‹XÿøÚ.À> stream xÚWÛnÛ8}÷Wð±yH#’")EÔIÛ —ÍÚi±ŒÌØDdÉ+ÉmÓ¯ß3’œ¤­d÷!!5œ9s9Ë,bŠÇL* †¥C¸H™œñßB0Á±,Ê`ÔL´ò”I.™’“ÂL””@‰ñ 4MrÃdš`LXLö1g±‹ ìãÎ¥Šu7á3Š˜ŽäDAW×R’iM£b:ŽÒÌC©„ ;•2C~´` aÁwbhÔ,ÀÓHK‰‰2ãQ8çQ 3Î#„b&6¹s26)&„šT)Qh\Pü‰Æ„I ã2J&*²ÔÀAù¸Laž9&ÀÈ1"UÀâ*B¸)©F:²2†’eœ¾td2èÈÚ$ÍlP$ÍlPI ®¸At%å Y_ Š«9MUr¡ŒHŸ§"jëÈSN §&žh°&"Ч%Ç„âÁŸˆ4I@tdH’€y§2ÅDC‚º jKLPCŠ ‘Ä0!# ƒ?!‰<d™ÐÈ1ÚGƒB¿¨ˆPœ–€LŒj”O¨KH@è¾àOh  Y˜8šh0) …©H(fp çЧ"¥ú–R€Œ(wЉ¸H ¥¤C‹"iø“¨æD#J‰r@‚&š& Ê tK‰ªSïIIeÝ2æˆ9…UÃE «M¤A·ŒÁ°F |òbî²²XÔߢ8ª}‘9š4«v8ß”Ùêhòê;™³“wåUÉNÎØ‹ùÆeþæÎËVׯ[å_eÑŽÕ6wõ{ýzò,Åúé¶Y•UOyCÿ7¶ªÝß Û8BèŸR ^Vå²²ëuË'[lmÞa…—NlãËbg÷ h¿wváªN±Ÿt. ßx›û_@÷d›¯®ª±@NW.»í¬ÒÝ›­Ï;":vër[e}=/‡ø)Ñ1mÕW7õ=#{â¥Jª4~÷¶¥ñvyLK~0Oû®jl±°yßE!°mݧòÑ_7e™ÿ_¬§(#½·Û"£yâïw…Ú•Ïn]ñ¼öÀFÖ‡´\ÏÎÿ$%dÔ&C‚Ëê³4‡›þôíù#›ËÙÅ×ö“Z#58˜üXÖóP‚ó§|¾ ™ ¤#±~ƒ“Ï/ù·£ÑÀh²8 ‡Z˜®h|f›² ^`}˜½9>ŸÍþ˜p¬ 0¦Õݦ¡#u³òYgd}€õ×K¥Œ€|`û¥ñ¹oîÖÁ•+Ä]ˆ”|`{^U]­ßc'ä8:Ó¡ø°åW›owé¾ð°Õ^¬ùÐö§]oîïìû¯ao¸êÚUe{éžÙÆ^ÛÚ…ÚäIµò;W¸ªë¼F¶UÏÍÜUßýî†zBgÈ^v[”?r·Xº5ºÇݾ4н8À3_¯Þ»Œví{X!ôì +%o_S?WÔ…:°6ÛuW¦þ{Šöf•L?9[ l#Úÿ§ÐÈŒ endstream endobj 776 0 obj << /Length 2457 /Filter /FlateDecode >> stream xÚYKsÛ8¾çWøªÊ’ù¥Ý“7g¼“Ùdbg÷°³X„$&©H?ö×OwMŠŠådÊU&Ð 4ýn(: é/:[†gy’Ì–éâlµ{ ÔmÎ0øôîU¤ë¦´p:ZùÛWWYv…³e¸ŒÎn×cR·ÅÙƒ7[³o­›L“$ ¢¿M¦iš×õ$^­k&Súݪ-›šÇYÑä·ÿ|õöv85‹ã¿È¯|Æ_Nüå³8ÊRåo¾HgQ’‚¿h2Íæ1s”Dàˆ¾=GÄÈ·÷#Ä‹Y˜æØ~³-ý¶¤Mé2(=¾¦Öùn_ÙÅ] ®Èðfo»µübÝHºFidøÔ¶åÝü¯q_•~G;Aµ\èú'ßÚÝ9M²$0JÈïAyUþF©-øN|‰(™EîPÖÐΧ+¦ù†'iFq8cm¥‡;ÒšÕdá‚4Q¦1é<—QÛ€ó9‰vËÇç§AQúÖ•w]ÛÂ…üLxŽRÒjJŒÏIyß Ÿ#)Ä9ɹ¬= †?iP•wθ'À~³ð5A¼ì|MÓˆvkZ¬_A}©Ü.—ÛÑDo—ò¥ ªäÌ~_T@Wèï{Ï÷µU³ï‰D#œÇ2‘}M}L‡Ë±V"ÜÎw{è®qÄZÆÁºq¨ÁŒ³Ý¤ad¤³y¢áÕ"šE/†,^5»© Àª²¶umY•bwOˆÔŽDÆPˆŒG¥’…xt‡Ýc[Ó[©Þãl!Rˆ³<0«?ºÒY…†gf£@2&øus#G…,ÇÌé¦E°kœeÙr£ep»Ut(4â@Ü—…=g Š™ðŠ_ìP?õVˆD¨7êlÖŸòÖi{»Kœôr*Á⵸U|X¾j:ç™›$ÎÄh F—ç©0/)W]@Yo€é¼H‰‡fðõÖ÷°ñk¬ÆÐXâÏ í]³qf·Ã䆗¯á åà°«ª+lñcÇ\Ðõ:ç”éê  ±e3ÉE\Þ\ܾ»Ú>®ØÇ¶¦ÞXX>¯ƒ­€5‚ ƒ|¡õ,ÄeJ7°ÓçAòüeW“Hœæ]•¿)ŒìQh ÀÂÿ­rv€˜»ªJ=sx ÆÆ'ˆ¬M³(<츹¼z{ññÓõ¿qŸ{2l‹©mœ:ëÅÞ•÷“ŒX=AQ¤Ê–¬¡§Çá*A¸2­ÁÄŽîû㘓±²=È·÷Zh›ªü¿-þN8J¬ÖIxb¿‹çêÝ´ÅSBìtûÎz6bIüåµC„ãIËT ǯ(¨„kQQqÄ@ƒ™h“k^c\™zú²l:b€9^äA‡Ø!XÌ“ 6;‹اÁÞx¯I¹ðïù(o” !þª ˆ65bZHk^‘ Ög$°²2wÕ@LÜ™UÛóæ©@‡ÁšÌÑTÕɸ ŸUŸ^×7¦‹E¶œF˜ËÍxðùöjºÐ¼8†›Ê7²þ‚- ‘‰thuiç‡cP),ɶ4ºR"'ê Kn(ÚÖ$ò yíþ…xÄ¥Ke_´É_ß²ë§yP®‘YëFÓ9ÉCQ¢´ìÊ‚J’FùÜ ^¹§ý!¥C\ˆwXQÂWß픚¸žMïÆiÕ0t¶P>|J'¬×1f“ŸÞÞœÃ7/uDÁø“iRª}øüI+­Z=üç_/=½ùù2úqx^†ˆé‹ePØ{ ¢CÉRÈKˆïþõùâ=Œ·{h¨<Óì¿kAÒuRŠ^dÉß‘‡øî+Ór4Õ °Öï8,¢nQÆ÷R…„”3¹”¾ H ƒÏuùˆ5#âŒÐ’' þSÖ…°ôÀ™#=*ìð~-{8CH\åÊzLF¾ÅkÊ“)Š÷ÿvÊ )Â[[ªæAy7tu(tGµÚš’ð_ÄiŒÎ#MHYÎZ@|³î;‡öÈPŠþ¶F‘F«»º”k+Â0R. ïlmû(O>vw´+Þƒ÷CEæú¨)ŽÃ¸db Ù딩“b¬›¡Ïâ>-%é<îû¬|¶ÈµÏŠfÚ¨½³­?œ'[#ñôtŸ-gQ¬mèíVd´ÈŽJ+ž?+­tDBƒAÐ4>Ê ÃXŒÚ †•P 2äÚ¬(ŽQ—T°-ʽúûº«¥õßxz¡y;yøYñ÷ኾWÓJ” mhèúXE@ ÑYÝwª:TÓdαK @_Jˆ$Ádâ¥ÖI ¥¯ËîŒgCâáÚì¨Ï0nh5øPRÏ(£g­/½¥r’7 UÆKMɉÆ'wÓ/Y^¦-æÁCÓù!HÄ çÇ5:ÍÑ8†Ù(AT JE{´3õQ‚çÞ É‚ë5ö°¤1Z»f‡åÄá¼?gSÖ5<‚‘ pÃ"[KÞ‰È1[@6%¼Ö¿]¹?ŒÒ`×ÐWÀÊã§òúþõ¦ÇæÂÏàBÑØ9"5að〘éƒnnñAò`$O´¹Ä!JH¿§äîw1®87NlǸ┛9»¶Ô—H Or‘I>š€¶¶GÔv%fLÅ']…\ž˨:oð¾E«¥’O¨†„øóüØHh#Éç##ÉÅH´šå™éYÂtàôDpÌ’9$Oö³á²_†j¶F#=‡$N‰}(Kø~¶@j °öšNw Õ)OötËUW×S7Ð’4y8m>X€ˆí„:Þ>ö=UÉW•â#BåjÇ7ØáňÊ™–\4nÅÞ°êî[0†ˆ7Ð×sžÀ°j¤¼i¾Âe–ÜJèb8T÷?îåýItØ¿gA]„ºRœ¸ÙAEçGù^ÜCÒšºÒè£OXVÜÃF—µÛÆk´fhJók‡÷4Š>E¹5KP]ð°-µCHt$™¾5ßÏÇó>ÇÈÇW“%åjæO¡ú’Òù‡WU@$Êæ°/-ó>TóÀ¢NÎaXG8.OXøP*ò=ûR‘Å6”ŠŒPùûáñAêCQ†JôP žMU2$×pù­`Û-{ÉÔ›õ3)F£JEH¿êQhì•PÝ໩š»žX+¹ëFñÍ?Eü o>¡ö endstream endobj 781 0 obj << /Length 2730 /Filter /FlateDecode >> stream xÚµksÛ¸ñ{~…§_Žž±B|ªß\'NÜ$×LäÞ}¸ÜL! ’Xó¡#H;î¯ï¾@‘ Ý\2îxÆÀb±ï]©³þÔÙ"8KÃÐ_DÙÙº|´ÙñàÓ›JöÍ`ãl°óo·/^^Çñ™ üE°Pg·Û!ªÛÍÙoÞÕ^ZÓœÏÂ0ôÔ_ÏgQ{7Õù<óÚ¦>ŸÁwÓ­Û¼®p+åÍÏ¿ýû‹×·ý­ñ|þ'ÉÃߦ/É"_…ÓwÓþd™¸ˆJ= µ:WžFŠt‘ÿÇlœ³8õ“³™ }»sp*½½®6…±<Á“u5»\^ÝÐËnÜY@ªKÃ38€ƒ¹wÐÎ)ï™Q7{ðÅqžã3÷¹ÍW… °m“W;Ûã–Ý@?R™Šél÷†ŸWä«F78‰¼ÏA­¯o¤ºá…ÒX«wÆÂÅçÖºâ¥<)õ OÚFW¶Ð-].ֲ̉ºgä8ÆGØŸ„]í:@ï¥3aêÂOæÉ©4ÄÀºi5¾ûDj Øk÷uWlø:aæ¯ÔuQðò?«ü‹ãÇnîÔ|Ÿi@ðÕNÐ"wá%4hMI¢Ç®‹nÓïû5¯65âz°ò°hî'1?-KEa–ûÜîsÐÿEâå–¿[Ýà ö¶M] Èè¶k OÖuy(LkàÞ8L½¼'u˜¹Gí5ãÓ‚¬ÃwãèÓ5xÅ`` ˜iXx¤óü Ecn?»Zÿ|–F ï-¿˜.½§•¨Œ’À³5jzÆÞJÛ|ÍÃmW±‘ƒið8öˆ+?vŒH!ÅÜÀf¹íR°˜‡©Í·êXݘ)spg€³éu!šá¥pòåu G‰Yâ'aÊÈ>*å­c£Pü1\ÍZZåm®Qÿ‘§;0H!aÍ '8äåR¬æ¬8BëÔȯž³Ö>ò„̾èJœ–=y·{ä,.ÚÖxä -n}<E!˜Äàb=Å8½þ£Ë±-fÒDL‘ØâùÑÞ<¾Þ¡‹[ß)Ê^ÖГ…ÞÅèð ¢bŒ©Ã8)­™Èåf‹ï‘ײ[YóG'RBåXLŠ á(¶Û7$7Ÿ!ÌöyÛFøž°AÌvZ¬å*Çhšð‡h#yñ#Vt•0»búS¡ßɆlºîkŠ-C:+‹Ñ1tLIåœMÊ9ý?HåªÈE³åPà²I›8ÙÔG‘ Ä$À8Ä$ÆÔé?ŒzÖÁxÝß*Û86#†^$‚’b 9’{\ç“e4ñkÏü¬á ¢ÞûZ8º7N„‹Ö'b‚¤Ãìjp0}([‡ý‚ȾϱÓÝ5yë8¥"|vkÖLLјqµ«Ž"Qìæ–—ׯPTè„¢z?¥ÄO©>¹QÑQ(ˆ{$‰PÔÐQÈÊœÿœ‡l„ì,réËðQ< §Ý’A‚ˆrHqv”"ÎHŠð°hÁÃyï±é&Ë߯|-Šó°5aû®‹K%™tì‚Erb18CäR^!ifß.‘‹4e’ÈÃçöFï^]ÉU›M% ±ÒÈ¿:ú™î«Ÿ—…üˆ¶iç„]×~¢ÝáÁˆ#v4gš54Ù‘ÂÜ3H”Э3ä³ #º ¶­þÂ0Êm#,Þ7”ÇGÂpíJøH´Üaº7ÝÚ îÙmQq¸©ez6Ùþ?á~–¨Ü¯žây„sCÓé;°«S?챿3¸PzÅ’…ÎÂ5È¿ô]Áø_O,i endstream endobj 785 0 obj << /Length 2848 /Filter /FlateDecode >> stream xÚ½YYoÜF~÷¯ìK8€Ió>òh}ÁñÚV< ` ÉC‹ì¹â1i’Rä_¿u5çð$k/”…±êîªêꯎ V>ü«Â_eQäq¾*»'>š›7>¾~ „îå?¯ž<{•$«À÷ ¿VWÛí®ªÕ/ÎóZí&mÖnENðýÚãÄyÓ¯Ãܙ̰vá[ÍåÔ =¶“ p¢õoW?>yyµœš„áW²‡”_ð—ÆGüå0™¬Ò<ö‚(fõƒ =•%½F|¦ºDž3±(Ӏߨ)Êvè5þê'þÁ@ìôZW‡ô‘Ó©i62 çÆf8ãÚ œ ÌÅ1Ç®°á©¥É·°üÎ*¸U¦ùŒ§&¾s±yïÜl›k£ÌwFä0 œfâ~©zn\Ó&²Úè]«J’ hQàJ¡bFä߃û-ç¢í†qb’ n6ÀÕóGbGµí '³¨/]” ¸wƒÈ DT´ ÕWx +±YÛaîE¿MÏ_é™ûÀ+Ÿò€j§z˜oj^1Õz¡GÔf ÒïjP™e» ·ã^©aU†Û”Þ¿ªô[®êí‹ç{júfjÔ¤«§ÌÑ=òªõíø7ØÈ¿^àæ—|Ò5\ƒ*QÈ[:Óªw;ˆB6u3*ï‘yØèéE#7±SãxL FÎß™abc.‡v¯¨E1?|fÒÿýÁ«Ý®mJ…Ö(vbŸô<ê½nêÆ¾m¼ÆÊš>>u´ðfÒþƒkfbÔænÍï5pŒk´j;™™fØ.zä³ßtp7x =¥¯ä®æNó;#½ý?N^Þu¯8>åÙßd•æÅ¥ûñåOö¶wÐh°V‰o*wj½7kº ›üž¦¹‚“Ã"·àÝk´ÀiÄÁK‘ 9õÅMÃTŠ .×9ˆé^½Þ€¤Ð‰ç¯êfd~«s[q×^KSi¦ì°;O³j™@Í€° ¥ð¤ŽA?Ø£>'ð·ü%èÆA%6¡Pü!*+­P“PŽüÕjlÚivÕ`$Ÿ5º® pžÏƈͶ'wȱW¢Ó:”ÄÚ‰}ìøÌâŲý |‡¾µ#b 9`èmÍÐqkœËRãvn¹_éÒ<ìXE´Ã–¿ìÝ *¢Ë¢Ž"?œŽùÃf0ésúÔm—¯~'ƒ!˜j3OĵÀ`7qCևàOdÝÐ4Âõ$`9lsHÍßt³cåRSXswâKüÅn.ŸÞµ`Câûš‰j^¢Î©eñà“ì±ÇáÃnF'ÚÇ~±3Hl²‡Ž¢ºÅëÝ<ºÆ/ॠÆb gù>苳Œ¨Ø€kñ¢nž¡¢5“Ì«Ää¿/Áv^‘¥«8 ½0Š0Üþå7UÁ$hÍ‹³Õ=Qv«È ³Zíjóä§s9¨ÁÇ[^QHâ „sPâ—gç‰rt^xAœ½C­°*Px±øí‡‰ŠuwÃ)À)ÚÚUý”ŒÇ ³ÌK`û#Hž8- âCøÄî>Þ2`°&w²xºí“&nÛ!•1zêÐëH¬7úÍuk—[±EÕB=a„°L#¬|¾Ô¨eû³0·q_~ºün<ŒÇãÓgü'€8¬‰HÞpfSŒðã¾ÕæšFµämA¨%û«ñ04n[‰öé-£Ãf3êÇÒ/ÅKÚS ¸ªlZGo‚jûò߇sâðHS(rŒOÙÎã&P¼øðîâÍ{÷,qŸxwùñåfãñ‚o8÷ %`0 À­ì&nïÔ$1ÊÈì=±Õtg]4@¨ ïlrÕŒrh¨™lDQ2庤/ˆX;%‘<Ÿ‹áÿId½f)^9sì~òêìg ¾Ø‹â4$]Ãk†Gæ^’…ÌlàEàAÒÐù€\Ü­£Ìê®Ñ÷çÔ‚.„¯§CÁµ”*(ÈÕci1ÑÙ>¾By$mù’¬²;GÛýÓœF\Js¨Ukl{fãU ÐåÈ*„W^ž€tE"ìçDн8-Vî™'û1ÙeRÈÕÊÓËíÓK“àŽFR&:]«^èˆ]˜e¨2ÍöM¦ø:aö` !ÍÕ'ëv ºÙ©–L)ã>Œ“î(|JŽh|ÄB5™yÙDŽÛo«ª³˜Rˆsõ(•¢ýÖTyú}nŒà\áìjf]î¤jyÞèl°\Ä‚Á™ì°žØ¡üŒÜ$x™;¹5b) Ós_‘=ÉvgdQã8w6J÷ ¨ÐÚ)ë3tŠ2mÔ>™mYNÝÉ`›Ìš:KEíÔpˆËvÐØ‡ÐAO…øÅ „XUƒ¡¶£,P6=˜>GÒxútÆÑ£A#Nøq¾ƒ'ØÏ@Ÿ Cúޤ34“Zá†\¥”òÒ/Ê*©-§¤Ç ômç¾< •Ô vÅ-öö8ÍãTJC¯üYfä§l#>GUÐ'ÐXçÚFŽÍv¼åñrè{ö (iXM¦|ÿšÛru0x=ê¾Ô'‡öl­ŒÛéQ€š,‘ þqÛ/ 3KQ7ÿV!—Ïíƒ;ôÿzÓÂóÓ…â.–p5ÆÈÄ? h»æ¦¶ Ña¾>¬ÊTY樸X 0*0ê¡Qƒ&ɬêQΗ9›yŸ–Åb˜J²ÜZøÂcf~ÏûÔ/>ÂÙ 6áB[æ¶òluîÄäO"„!ídÈÖ5ŽP+„(MekÊ@Ã&¢ñTÍbÏ¡Dµ!„Œ œEb<ÖM‰ÀÎÌ‚qËÑbä /);¶† 0ÍöðíY;Åx¤ßß T7èFc‘ËÃQ»šß2Ü"ùgðížö¤9ÖÊ÷tli(ãO­eÚd#‰Ùuž¡>#Œ] äj± [Ù£" KÝëQÍÝ:·7iPô Û‰¼7ŒÍüÒ³Œì"Ãâ>.Uœñ$‘K-Ói´îÅÎéç” ¦ÞôrÊlìâ£rò#ã3¿u(–Ì w‡PO\‰G7ZbŒ(—9gsSÉé’`½•âÆc «yh¿x¹áÆ^ÑQ.µ“-ºŒ.“ê‚qR8›¡Ó`¬dL¼öÌ= rƒÝß Ü×t'ÐêþÚŸÈd)€FC/gIK==/èÞö<0Z2²±â-Œ3á‹Äãçë–Òç4;:lãêØEøÃÞaê£wóžÀrÉ]eEY”8‰aàðAX:®xðϼ,ÍO«Q‘/åŽBÞ£bÇa¦P$^žf«"òâ,:ÊÂUî)¤« ûY†yBî/ÙV‚à‚&ý@XqDq·%ü/¸bŠªÂ}+&’0zäTÂ^©&»qsþç`¤K[‹? >'Q¸hɲ°ÃY\##ÂÆϾêVë…©çÞr>dFrïõ ÑÉSÎz7kª\[äÇqÈèŠ"’‚c„?cÀms‹=Mý{` w-‹Øf­öI#t$i„y®ÖHF>#— ㈺À$áY Ƴ†ó)¥#ƒ endstream endobj 790 0 obj << /Length 3121 /Filter /FlateDecode >> stream xÚ•ZK“Û¸¾ûWLåbN•Åð’bnÎÖÆåäT<9esàP‰e‰THjgçß§»¿ RôÚ)W™@£Ñh4ú­‰"ú?”ÑC‘¦aiöõå]$Ðþø€Á??½‹oGˆ;óÏOïþø—,{ˆ£°ŒÊøáéÅ'õtxøwðÓ©ºŽ¶Ü¥iÄzÜ“ŸÛÇdŒ}÷¸£ïáVM×ò8‹ãÀ<þçé¯ï~~šNÍ’äÙcÌïðG†VÍC¾7aœ0ùt²Ì  ªÛx²`®©+pÅð«²ZÛaXCìAA•~_ºó¹c¯ˆ½óG^Ì‚úÜè@l;íǧ·ÿ½ÙA—ÇN¿Kw,£‡]Œ»ìâ4Œ3\eæÛd9QïåÃøxþK”E¿Ðÿ1æzVÓ™ É*_È*ËÂ}ž‘l…ôg!Ï,,’ÂaÔ½=8ñUça‹f…y¹ÿ]’4,¢Ø¡¼tÊ{…ϱÁîn>îöqŠ·ä•_ø›Ñ‡«Ì[$“,ÓòN°tù¸ÔW+ —4¯Ú‰ê&Ãè“Dd'q`ÙŽ.üŠEÐõUÿ ·´^ó€ qpUݧNä‚ÊŠß½Œ¢54­«ó™_ñ¶E¥a–ýª?gÀѱ¼vÁGoé?é[ºÿqº,Ò˜"JT³‰cχˆ¬Ó¼ ?P,ý@_µÃ¥EŸœjòÀrÛ8 ˆä÷Ê  ­ ‘,’6ÊqUÓ®éͼ¼×¥fÒæ‘?o€Ê ËÀ‘¼òº*î“ÄÉÏxØó, ç“«GKýòí2Ia—‰sž‰ñœ…0K(úRjX‡;ïIç=¢c$¶_£¯Ç*m›”Ž',Ó‘@QOUæLðì„㶈´ÀRÛ¸ç|e¼H‚†oTÄÁm"W!ˆ j‚ƒgÚ|& wëSÊ¥rOD“NL‹ÿ†mÏbJÃë¡É:’*êßg}’mFÞí3_?/…)ßÓ›FÏâÎ-&z4aº¬Z€ÉË­§C{LêîraŠ·vŽî3½/Å·²º!ñ`ZÓC®U?6vÀDÞê•»)Zü[ªÚ£¤Âg°D²áLàö¼›u)M=]šÔ»;Môîi:å óÝ 8ß&ww…g—B$q™ØK‡ Ðåz¶}F—VZjt€ÅÆ+ßV·IĦï¥ë-6låUÆ7®^iõ·¶ålD â{=‰ÍVÚ£<ת™„8ØúÖ‹AåÁ©#6Å:ßf·™ìÉ~)\Èï9ÿ²ÕX=WƒÒ'F‹×¾iëæŠXNpvMhØކɕ Æ€P/F#3¯ë ‹9Êø¾=)¯€UgøÊy¶~Ò ÛbõÜqãûûÅÅdIÆ•”KYœ°ì<§‹‘7Â1xMÁmUìPœ®X\TñEl‚/ ÌÐGZF;­2G`njݵ¢÷ûpŸ$?Þ7kÚÕÉ’´lvä²°L¾Û‘NMêµä".ÿWåo£×©z=qòyb(oo£ã©´ýœGt­Í&´1‚R];´ïG@(>»l•ØŒ}.ÔV‹E‚¡|£Á¥9ž\ú“Gsàç‰ó}m5#òwöV`Vr¶ _&í¾ž8 %¥¶Ñd°4M<$%7膛=p¬L9õhà0fI0€ÕËõ§½îŠáN›BD‰ya´±sD×c³“¨17ɧf¨Ö¡I±‡ð‰ä|;°câY…ÏØÄÇêr QY#ŸÊͼ¼Åë Š"Ï'T°+Ÿ×gÑåœPÔS·³ü£¥TªÒßc\ÓhO”m7ê >j,¬ÍtWæ>/ƒŸÕîHT’]™ÄUñ½èÆ?ÞÜ¿£‰§LÖ2À¶jÜP.ÉþhY: •â.®˜ÌškÐM$»¤ JSzÂ.äœ<­zŒ&þ»‡ÈDÔuóbÛá+Ý=¦Ay‚½Ž‹‹'«7B¾3)Nå¡USN_Ƌ씾rÛœs-ò´µŒç ‘W¤Ç6úÆQxöhÆžgáE÷ÅtætʺA$@˜’DzıÀÍbºÑ°z¼U®Z²S‹e#è»Nû}ØO½Šü{=Û2ÛÌù,QªÔšŽ^òG³uòWfë®8'ø½VÍ2w%lilðmz& 9¾Ýǽ©²FN¹"ߪ¢Ä+ h‚P< vAóÝšÜ×˃{ ÷³¨EÏg'ërA+ZC¯Λ¦Þ —S÷öìµY¥ñJáÇÎùf¤ù8!°ŽËoÏ!Ës¬U2ÚžfÏÉÐaìmuÁø¢5tý ÷C©„A=|A•›Æ”§|±Ò ›Á¼®» %áà ?ùx]0«›ÂÆý–45)Go Ÿº;1bgçþ¤½?—½[„Õáv”ŸÜžûêºxÆýš»Å,{'þéeà:×ähÙäеeU/·VÃýº®ÝGZQ÷V¬å$ˆŠüúON)ùÿ´2SÉ}§[¬ÿ"€|ï?¤0ÊP1JÕJ'|#BÜÛxZ¢ÀLK§¼ä£¼Î.W6Π o±²øƒæh\–±÷T™èO-·¢>lNDðØeò­vÿ€Bô2´“Ìû}‹Î´y|C“WL4Žºë¤˜sdȼa—4P,-¶-݃$=.> stream xÚÝYKoÜF¾ûW{YÎÂdØdóµ7[¶eãìÂRr‰„CR3„†ð!Eþõ[¯æjc`±‡ LW«««»«¾ªn©+þÔUâ^E¾ï$:¾ÊªW.q»ÃŸ¾}¥DÎA{&ùöîÕ7‚àJ¹Nâ&êêî~®ê.¿úź>¦íPt;Û÷}Ký}gkX7õ΋­¡kv6´ù˜ eS#(e»_ï¾õþnš5ð¼¯4%/ì‹À>íø:ôľ0ÖŽò5Û§½³ƒÐ³®»ç­¬vh]ÚË LŽ´õÏǯ¬¢{,‹'4l½^Ø•8Ê“åÞËþXÂ*c×*«öTT¯µg^_<î¼ô¥'f4÷ÜÇB$†´ÎÓ.ç^Ö=Ï-BVÛ•U9”¨¶èÇ´£¢¦œf’]ÅÎMŠö“Á¾£¶÷ z`±¡b#üеê´*z&ÑÀÅ·~l[:·¦ŠœyEM†Ò|,SEÿ;‘ëa}SýÍ`ô§{V6܇y*ÃÀ²òiú²[,@ñ Ò¾g7ÊÊ”íGËpQÇ"Ãe?ôcÅ\²Ê!%à‰Ö )r”M·(˜Ÿ—ÁV…½æâö3¸O9°D)¼'ÚÇôá/ÜíÍxÊYWˆÛO®H󥶪Hë²>pg8¦¢VÜÌ4sÔ ·YWäåþÄjOk™í œþ؉`¸µö`ŸëôôÜ“&OÜÎ3nDUðBÁ”¾’ÈxÜ•–§¦{Ñ«ð<¿i:3žÌjZ0Í%í0¤¤öû|Ô2c;îO,pd—nIß²Óó.ÖÌê‰uñg{Ʊ’‚‹äÜ<9vO匦þ4)vú±ƒøé‹âF+ßzs"ï/"E˽²æ¶*kQË+eª˜‘iúò‹° A4¬'‡ƒ‡à»ZBÊõ­4Fd²ñÏÜA¥ ŠB†…e”¶ŠÏ®ò1ʧ¾Þ¦™ðÓžGß§Ýœ-ó÷Ý8ˆè}ÓM£fˆýR´dM]ÛøR4½AQíƒûQtcG[U*‰_Êúž÷]S1Å«"/ú¬+ SHth"‚ÆŠvðòN¶û$j1H°]`ôÓÓ¡8VlŠ€Ë‹ÔÔ¤Ðת &ΨTî\¯‰Ÿ UÖ}[v2öq/|Ø<89ƒ…‘”v虀ŗ‡Úáhÿ®i@îÇ“±‰q©§òtÚˆ ÍœÂ×VÃÁŒÎ!Éx(+CHiá*¥y®Ä!kúñ§~  ‚È aŽÐ ½`ùi½ÈqÃÝ=VäiÐäcU/€î☠O Íä=¢ )öãá ;ıõ~5†3 Nè`ÅùƤ]™£ãÀVN0Iñ1Ö”7{Ú|mý؈糓‡n&®Œ”ÕA2˰v y•E#!%K¼šh7 BóçsH]æ1`>_m!FÉÆÉ©Ø‰âØìû‹§:ŒÔ:Unº„­\ÏI|Ÿ<Ã$Þ.»oÆÎ>V—8ÿl¿·sš§ï¹Øß¶Ì…jÍ #c._’7TC°ã `z1¤XÁ!¯ Ø*ËÊöH4í&QAÈ’{ÌâÈøìîÖÂ=8q”œgŸY+.–$«UÉz×KA|Œ=£ æT؉…~Ž-”‘L]H¼dWè:n¼eÕÖ´!¸…^N+¹áÕK\kìÑíðe?hSnÚ®!?7{Œ/W;ÃïÃfDÀÁ„p#E… c¼+ºò+32܇:ÊŸåA›-ÄœLi,´Zg ø¦Ëåc)í²~¦Ô ‚ͤrÎ:@íq§Ÿ™Îšª*±›rµzŸD= ΖíïÒ­ôeƒ|ähÈð™ñ` Ìä> ÍL>¯S&áoάcÚ‹ nÔwßàÇkûã»wì5z’Ä7 öõ¹ $³ú ,ÌÑ‘¦¹ ÄQ€b-òi/Ô¹„“Pô9±É°Œ8|«@„j™2¤ÇÙ‡÷“”I>äÉõçËäƒcþ›ä³@Ê*¶Â. /ò6"¹ÌD…Ä i)Ræ÷sV²³}f×?«”³-±¶*òœèœi‡à.úîý-‰©WÀ.¹í&æ‚ÏËê‹Û%àp€…ñ8æb£óä‚'-a’ãb”ŠœÚë·×LT&†)â€ø+„Å})ð!©›Ÿ&îÈ+•;7zY*Lw*ì,½âÝ@-ap×öæ†êÆ|k„¶Ù÷PÖÂl[¸ Þh¨w{¹ÿe%Ñ™H™ìaÿп‘O×]hûã Ö ùY:ö2M)ºSu2 `é2˜7*A¬Ò[*ÑNÌ{h®í¦eñ–Cu<²ø–Ôh\žóà÷‘þô;×ÜQI¨yÌ···ö›ÝÈ,•½µÃ³7(ÚE> stream xÚYÉrÜF½ë+:f.`„¢°Ã7’ò¢‘äЈ´/¶h ÈF ´QhQÔÁß>¹–nPvL0‚•µ'ª2_¾¬VþÔ&÷7izy”mÊý+ŸZû‡ Ÿ~|¥dœ ÝÙÈë»W—?ÄñFù^îçjsw?_ê®ÚüæÜìŠÃ û 7 CG}wáFQì¼m/‚ÌúîÂ…²:–Cݵ(ÇJ9ÉÅwÿyõýݸkÿP=ù7ú©(õ’M’Ež #V±hQ+åÛGTK?ÓÿŠ·ÇÝ–ý3|Š´x±°+ÌλpÓ$sÞÊÐÚpùD /tÆð”u1®ûT;–†Æ“€Hæ7 BOŬ{o w_En¥ ^|m’xI˜À\¢>; Eê<^(ô€¯Þ{kÛ¸*ˆ¼æº*õ2Ù vqËm ;Æ8gãY²:juÄ™>©å±Õ‡BΛïoY3&cÀzÑV,TzÙ!§Rœp¹­äÍÉ ¡³ÅÞçNvãŠ:óÝ6r'8ðV •ïÔ-—7×7,ìÅrõk¬ÇÎÑÀå<` .–}Õhà(½ýÕcáIK¬•…l°¥eeL¥ûú³µEl¸ï»=K°²®®¯èâG³{àï„Á`w´8”ÝÖ”Ç^KãáÐÔeÁGŠ æÀ{—õハJÕó@œË¶…Ý/x`+0e­]ÍÉvÌí á%çŒ"/RêÛÎ Âø€$ À~èÜsþ,²( Àiû ÍÀÕO?àz7\ƒöeš\WßÉu÷Ŷ‘fÞGŸ#ú-nj¯YÏ¢­Í À! °@@¡íZ}Š/ 9=«4ó•Î#Ì8ÂL-€;Èí±cØÁ—‹=îךC°‰0fÞ µßýØ×÷rÇ¢ÈâPî50öTD¼?¸D°bª˜ú«4+°XUqM0*eŒJ'ŒâÚ) acÝrI€„ÂHh(yÌ@#ªZÊy–¹6¼‹j®9äz¢8èAi =ÔdÁe²GL±i©š5³ bßµ7<„ÙÊ}¬Öl"WÜÆ`žùìâ¸KmÄ'£Àó“hùy½óØ¢nYXBèt€…¡îÅÚŽ[×0š=QDËœ¼•™&IÉ3€½MóÌëvm#K€·É™Îï†uÿñöÖ½úø–a¶Þ½×¬¹á´Ù§]ÍÎ M©t ”y¹³0M*ËbëPޱíEŽ$PVîÎZ%5˜Î]3£æˆ*±¥#ÿ»ï„®ÁPÝLÛÂñÔ0‚ÅÑ’°M©ÍÀÚ@íîåæúÎpŽl0L*c!Õ[S­†¦Þò,0Ì5 _ Je^¶&ùó/ï߯Ùmxq¯â¾y‰~àÅ~θå/;É:'û{_J<å‡Kbæ¾Â©Ý²¼àf~nQË_r3è°Ü ¬lÓ e±ÆL 8:ÅÀò´ä«¢ÄBy_òÂ9ƆÙذaÄYèbœa†³a&ƒIX;ÃÙ0cœ…’q6\âlg‚³£:Ï21öÜu'v—¤'ì„Ýt±Ø4ñ¹”è%¬ÒˆÂØ•˜ÒYn@ Z7[å3~èj¼ü­ÙGì¥Á~¯xÕk=pfò;ý,xëg}-ïðVl¼:6d ‰óÂkψânS?ÎâçM}Ø!ê®ùX”{aœ(m/OÃlRrÀXÜ$X5xÏGn36F1Pé—¾fM®›£…×]Ñp§X~âÜú3Eú–ë<.¯uÆs>×B¥Tyä½'–MI‹ï³Ãù "Œ4”.zé»ç>ެÐ0^üë9ð};BÏÂ~®1pïãSœ‘Ù³&t&Yj;›\ŠJ¥ƒMúÛÆH"Ô5«&:ì:ä°œ¸?â,¬b´Þ­½ûæ}ÏX2 9*WÂ,)!ŒlF H£Ú\ŒEŠž¶‚ý·?])dB%,¡ßcùÓ‡+œxÃ5rþ”? bN'x - î£!ѵЃ¼ut÷¯mVÃ(ˆÃk™nÖVq…NSf’)U«L­¨ôŸÇb ‰çZÚ´öO9šJЉ„!ÄBÝmÛŠ1Jv8í©ÑÕƒôœ@ïnì”y—´%’‹B’ÞqÒðl2mlxl郞ڵϡ5ÉÛpsHÙÇ-ä©xàQàüL%6‹Îó‘ö¢©•ÑÙ¦ph»?¶åT#½`ë… Á ƒÆ£e dVxoÇÁœÞkÜ‘{ÆK6‚¾„ymI.™XÏŽÇmP6ñªu…œ=ñ™ºú‰xd¼ò>äÛ쥗²S`*È,@îö…~Ágé>gëÄ çÈÿÏÈŠò•é" ,´mÝr0î¤Rž¬(Œ âd}ä9¹ùƺgO!$´éç6×tŸ½¬ÌúòÑœCqà\aŽÄй :ûË3H³d;Èr/HOŸEèI"[P,¬Û'  :A†Bι+¶Œ“$\(Œ]6-Í"Q(Oœ‘•8d†•"ÏÆÈ‚¹£ìz#o¢Ú)oÂÆzþ‰ ²tÂQ®Ú¯±qŸò)‚þ"/6j‹˜¿<äLSñá~H…F;^6ÔE+O>Ålltû°þÅ.íÏœÂ<—©S¸öù•‹¶6ºŸÈ\Îù×ÛpÓGŒI•ô²;.Sn>å•¥/ ²õFâb…D8WTžÑO=NñãhbœØz’ÔGßJê# 4ÐùéöŠ›Þ¼^×0-»}„CxGaòöß1üHÄwÅ ì>ðÅqî\ mñ7ê7§à mÄ'‡áÁ9õSYꥊɟüþ®‚š%9“?†„%t¥Ì°Å(!U׺jD?’IÅ­meþŸm‚æ[ú—žÊN‘ Sqð/"þi€[Òk´™Fƒ¯ ñøöš2‹ÃákŒšçŒ(µ¿(`‡LŸ¿± åÃfæA(!z½fe”ÁBD‹èuðtrg8ÄXßÐÃ=IÄ‚Ádâ0,O¸ŽI>Ö$ ™\zå¥ŶãKñ—M, ·â_gp“ÝZl6¯öÚp/èù›m“©Q!sªÅ£&rd'ú‡ .‘Z’¬Šó!–ð0¥ZÃzœŒã )eÙO´*£¨¿g‰”b!0 LÄj±+ÂH¥¡RÔ_ÈWüœ3¡Ed\Q¾×¥ó‰ëNe~†KELÅr¨÷ô£ x3?ÒžÌ```)òây×Z\F«¶üÓL:¾Ò€tS¯>Já²Z(Ns)Aú¶k]3@kn]qõöWÉ…ˆÃŽƒ¼1Ì"ØÈ=¡‡¡q[Öç3±„5±±è«ú+ç%ø“çŸão™9üƒ¼<BQî_ýö‡¿© >Æ ólóD£ö #ßh6·¯þË?vÎÑ0½,I±Ól– Ï[U~éz„o©1@"þ¼êÅÐ…ÙªD‘~g]¶ÌpµÓÝi>©ªMæåI*/÷`Z: ‡ï./Ÿžž<à ë–;¯¯ìö—™ýöòP ð]‚+ïPÝŸê ‰„—å ½_þYØ>Õrå°²Ðóá§Ð±vX)P5?üÿkšÿòaɘ³Ã2…ÀÐ3Ô›bk.%ÿsã˳³ ˆ>é\í³³úÏ…'Å endstream endobj 806 0 obj << /Length 1980 /Filter /FlateDecode >> stream xÚíYKãD¾ï¯ÈÑ#ûeÇÜ`ØE,H0HHÀ¡c{kb;òcGóï©êªvìij‹Á‚P.WWwWW}õhGlbø‰MoR¥¢Lo7yý"vÜn¿!âû¯^– A0œI~~÷â“/Ùˆ8ÊâLlîîçKÝ›Ÿƒ—{Êî&TJâÓ›Pk¼inä6ºö&„g1æCÕ6H!‚ôæ×»¯_|q7íj¤üê¡äô:’M²Õ‘PšTü%6ñ¡lò”SIдUQŸˆî‡±¨ÊDEt¦FoXªêéiûžŽ“Wv( dXb8Ððp(ñ\ N2WG&&2[ê;UµÍÃþ`E˜%¡-{!·d ˆ¶#®×Ö~×v€]Wàì*†ªŽÈ~°ÃØ9À1™Žß’É KZbP>ñ‚Ïk»¬Ä«ï|ä 1Ù•Qqœ¾ÌÇ®¼´Òìdp¢èò’3EAüÝL–ÎL;‡¶‹Ö²[¼Ì&ßþøÍ7NƒY>&ÊD¶ºLu2‰ÒÔ':t2 &=б®½Bf5[·+—]€x!¡‚¢Üû}ÕìaqêŠ œÀýPõ`þ;(.¼YÓÒ³¢ªXî'“¹Ü $Ó¡"$­РзרŒW±Å@ëúðUÏ•&aT”d“iÞc?£—ZÆÿø•¯õª#C©Òh«/ªƒíòûvìBW¶êÂÌ};;úšØUc¢#•fsGK#ÐÑŠùƒ³Ý“G"²^¿ý __†o_’]É£Èm]DÏŽƒŸìº™óòÓKBr «³ˆ»wáo‚¢Ú—ýàòCB™˜ÃØ1…®9ãJ ð´ô@CE±4ðš°µßÒƒ LfUM.Êñ0vh;¿U“Cm ×rQCEK%™P´@ØÓéXÁ\‚0 ;XD3˜;®»gP·Í"h¼ŸØ³kÕЉI¢©Ú7³íîBxÖ‘ß0Å> PA«(3¹g~#p•Å1ñ”Ñ>º]ËgSïû›FåzÓØp\ÆÞÜ$AOßüÆSŠíi`8¸NøÔDÅtÇË‘‹zx=ohÎË mÓóM/‘o†•ÈÿÃWtiû3  nN¯+ñ…Ä%تñ3°kJøxõÅH¨àåç/‰3×ß±wϦ$bwl] 㛩›í…:h†±6#µ‡÷™6uhN|×q6íxaXœΙÌœLço'S8 ¼&H“&¸Ód!7•hÇmé¹ì Í+Ðe``jßáŒq<µ5¡Ê2¾¹!Ûa8ÐÑŸ»o¸ïPM"À±³=/æ/è)]ЯÖ÷hÆŸþî{à À¶kºC‹W:%~[”ä5§-I~mxNœ6”϶¶Økêt;ëÂ|—‡y—¯‚vú‚ªvþÔPáCq÷ï»ú§$†Ê!õV¹èßξ+¥G`ýðú3A2sÈü‹ÿ͉¸5ÿ=VÒà90q>"r`ò%š4YØ™¿UogõѤÿëÄì ãB(Ý.C¥îÝgËš^¦%)Šºüï}zšá¾ÿUþ#üdv¬~‰…öûxmøÀß@}ik endstream endobj 812 0 obj << /Length 1804 /Filter /FlateDecode >> stream xÚµXYÛ6~ϯ0й¨¸â))oiÚMÓÝ-úÐôA–eKCÇn¶¿¾3Ê–Þ\X¬Er†äÌð›ƒä«þø*V¡”,VÑ*­v´Ý¯¨ñÇóGÜñùÀèO8¼ytõLëXÄ|u³›.u³]ýí=Í“CŸµk_JéñÇk_)í½¬×"òú¶YûðÝi_45¶5ç^´þçæ—G?ßwÕB8 6;´„ ½Íà&n.œéPY%`°oNÓ`Ö-*„Bs‘÷nQÂ8üŠx¾w$=”•Þ ‚é4YBhé@!@TÛÅÁoY˜µÇ~?Αm‘õIë(Äç:ç@ÇÅGܱ™ ¤5!¸­µ‚T^ÚT˜º)3¿+úœZ(À^¹ŒGb†× ¨Œ5áqœz{p^ûTYŠ åà’I]t:[Ú¨Y Ñ!"¦"éPT%nóØøIÖq-¨}Î%´±\#Ç•gœß/iÄÎâ8UJZ°žúðwKC×/žpjjsôÃÚPuѧ®Ž9¿Œ4ƒœ?U×™óÝak„†ýþà¤ÒâÛ »¡èm¢Ž1tXK:,âHÙÔ{jÕI5²YgKzê¤IM —i‡<±ÈF憾UV5mñ_–7øgë“ÁF²fƒ‚"LÍÑ’6õI´ºÀ” QY¬RŠƒ?4ei#×]ØGáàó¦íýÜF%äJÊÂCGÄì}ÑÙØc"±çžx¬JH?–%Ø¡Réw`¼ÑÆD; 1”å`ÎÏt4&Èoƒ:Žáú‹ )˜oÒ¦;g«s$¹4ÞÆ 1?Auiý]Ó.­®1N)Æ.n1»XùÄÅ1 ,çO̘¹Ð¿ý´M¿Ðvq¨ >²»â 2” ]mÕ·ú#|¡Ðz„@¹ Jø¥ªè¯£Š8}KÙP^Öäóår™É™‘ú‚:±dÚÄgŽ{¬¿ßÚµ–n$¾ €€›°Ñ*°«S™ûõ‘EkZ!ðÀŠÊˆ¹Z"dÂÉÏ™†bÀïzÀë©„tëjUí½)“$­ñ†vˆØÝåݼèòR†T %mšÄ®©2¡+pI >ŽZÔôí‹‘ËeÓl$À•eBR3ŽÙ«4¦™oOC‡QnF ê÷º,jǾŠÒ-ÕfNš¶ï–æÌG¦¯:ã|²½ìœ=ŽÌ·¡Zߣ™¼+¼ïâ/‡ëÍÐ7£mÉ#ïߦËv]GçâÆšvïæR ¬‚§³Öº:×™K«‹­ £ð³•cö'ÜK/Wó%O‚bœdæ¥XÐx?e›"qËóßþ¼úµ°EØðž*É¢á…ç/¬ª]ýN…÷=^ ì&x‰ô<À=Š7Qp6Hš)jS• د݃H*¼"Š0~©ò‚F• ak‹µ>q4‡*£çB"Œ°] yRKëÊcä)y’Ýšp|%sä™{ õ»º¹«}ð­á½¿¯‡Å|29}0[Ø®[à¤ç[ûZž«Ú᧬ßV\Ú^ÅliDêÿ¯ ‰“ endstream endobj 816 0 obj << /Length 1288 /Filter /FlateDecode >> stream xÚíX[O+7~çWD}J¤³>ßÝ7.§ª†"j¥žªZ’V„$Ú ÿ¾ãµwÙK²$Ç DÌf<3ßçñøóBâô,íiΉ¦7~< ùÓì®ç—§ì"4Œ*–GW_‘²”Xj¡wu[uu5éýÕ?¾OI6ˆ8ç}øy !ûg³3ý§l>ˆðs²?¥ó™K€¾ü}õëÁ·«2ªdlËôœe;?U͈ê)#páSŒ³Çg1V³‡ÙüeMÓÙê5º›­\MxÀ5’c¸|ê—`SÁ ç¶0¹_,â-}3I¬5;úV¢áÝMëEÌRÌö"œÒ›oŠ« ö^XE˰©2*ZŒ»ÑXM¸â»xmCé$ÊîàûQ™‡ýùŽEp:p !DºXî1}J„–eúè;Ùg…:ï¢0YÌ_’ —smáFêP?QG” …É’[¥7P»‹ÛEœ·% ˆfjWç›ö\¬¸"~>gÄ(WVŠ0°þ+F‘R´’ܤñÌ·ÑÓó믿¥y]½ºGÍ ÷’(#½ æ=œûiŒXI„·g“Ò— ãç0Dàóiñ 0=].Ä'º&)Z”"xyÀ{50¼Ÿ­”ðÙ]ŸŸýÙXÌ©ÚJåmóѱÿÏé4?„ð?ikÁ3jˆ²º?]ÜÇɳÒÑ$Góå­ôü·€ƒ RˆÎúRÄjÓtlrÇ¡,8ͱÖöàæ˜\ToàZRBñL¬Ñ&Õ£Õè›g¹QTzMQ“óª’L¹ªR~”ëyM¹A'¥ ,ÚB¾eE ƒcÝI¬%ÌÊöŠþ¹®•7ú[gd ¸¢²A¯Ò„ñ:Aò}vYÜM¯›„½¯sÇêMì2$H|ôl5Í­ª)QM„ªa'.#Ì 27È‘¹/»ëF£v{kȯFý³58¡P>•SPI‡'®¸ð¿;¡Š:4ôb<#9«ÆÔŒÃddë¿?¡ ­«A—Éä{üT¡H÷Wè¿ÕÁÿ»¬{—mè›Jé}8XKŒm°o¶Z?ƒ;t‹mÌö±·ÞMiÁktMØ5ð'Ï)1Ëqò%Ùs^^Ùf¥Ñ‚ëËõ#xÝéõÀ-q!Q­Ø†¸ÀI¡eMã±õðâþÆYâ“­uhîVJ$|_ºênX2ÈCL-+s©–r@kCW ²«¸æÞ*µ¤h¢,dòÙe®ý0!E䦕ž]Œ¼Ñ±‡SÄ/þ雓îÖŠMŠ ^½¤EË»4J³ô5Do!¢¸l­›À2kˆ3(„ða‘ nŒpR¬tv4¬!º‡W.åôFñö¼¢ax`–«–-¥þʧ¯yB¾hÚM%«†Öý†-= úý"º9l¨ÄŠMcéüò.¿_ø¯»Ñ)<ÔÎûþ®^qÛ0öÁ×µƒÉ½¢A’^*޶§L¸ „jV{©-¯ÏC“žOã,]Úl*“Ñ*\!ÿpwŸyö0ºŸ/Ÿ5"»Ê«Ï ±!$2‹'`W'gx›­\qý¥|¹šEKŸkÈòSQ9(°R  zž<NBéÕÙ°­ eö<07È;™¼³!P墨œ*uÇ,yºYNBë_5tKÄnß®É)7ª©£8Š¡êBʇM¦·"+ƒuQ÷zõ?LS9 endstream endobj 825 0 obj << /Length 2123 /Filter /FlateDecode >> stream xÚµX[oã¶~ß_áGˆhQ¢nyj7»ÍI‹^Pç hû H´­F– ]Ö»ýõg†3Td[ïœ"@ÌËp8óñãÌPráÁŸ\¤Þ"‘ªd‘ïßxf´Ý.¨ñëýÉr.ºÉ·oVß…áBz"õR¹xÜLU=‹ß»]vèu»tƒ päíÒU*t꥟8}Û,]ø-†¼/›Ûž”Žô–>~ÿæýã¸mèû_hJ^5P¨h%JÈ@‘2K7Š<ççƒ1H×o×ïÈâ@Hjdu #>Ú·ð¥jáÊHøR’žû»»¥›Ä±ã‹4µÍBlÜÿôojü˜=£ûZ 0/šš'Á0å%àŽQ™U‡]æõsÝk·9èú©+Ð(Zzâ™ b¡ÂÀ.½™U¯„—„V¤ ’hTn¼C/Ç`—{}ß0~ì[‚ôĉPÒg||Æ9aœ¿[&Ój=¬D|³ÉÌþfÌ ÛŠa†Áû¥+5t^‡:NE¨Òy¨7`¸Œ†ý¯PSd<¯ÝbíHzŠõ¸qrëÙ}#Eñì _óIŠØ®êŽ^×|næH†B¦ñIR&ÉYþóšXñâ(ôi`­Ûæ`9°¼/JB^cÌä:+˳€n%6,U>ótñ¸Ö…CsÔí!w³Ã¡Òn‘µÇ²ŽDøyçÃ3çýDŠÄ O õ=vþ®mºŽ Ë›=ÚtXJ§¬4_¾¡Éá®*M0>®°ýdXN“SkMß´M•ÑÒ»¦*þð¤jéV|6^ê*^³P)¥# ÷Qòì9X:|tuµ™)•" .0òáŠ' —Š‚’™{Ø€iè|Âí›:C§©±Þ•Ý®¤vS߀­žï4- PxoÚþR¶oX6£~­¼¦ÊúMÓîmOgv«VŸé+{«‹w,™ ýÎÚð‡zp”ž©Öç©Òg([0Ó‰†…1JE0厜çæÉÚùÜl ’k͉×äf‘ÒQÿþvØÒЯ/vÞÐØ!Ûj^ Ï÷á>û*8ñàó¹ÚJ_1ú\©±@”|Iã“°ÃGi 1k…Û*%‹·–nùνîû²F÷âÐÙéê0GEÏð ®;-þj/pöYY•pp¸ûUÙõÔ:ît«±é# ÛŽF› Y’‘äì'ê˜íˆÎrßñB MKMý6éy%Sº‚8:;yV“’Öh‰I‹o¸ˆóO´#^' ¹Õ麡Ð.º‡íÙ{v®2ŽD×Pèˆó×2Ó®w' è¤Ïòñé6ÆLDÉí †ßlëA4íö‚vI(bˆ¤Só^¡K_sJ»3¥–Ü0öœo[:¯ò®;Âͭdža !1]p¸(»|è:¸xx²C9¸ÂTF èÇ6N ŠóPKo²ÜÐÍ£,¦°Sm®%ŽuÃS—·å¡ç ”Œœ²#¹ íý° a˲ʞ*«f¼n›a»³}Mò¿aÖ´UAã¿a *´íÀœ~bÅýù¡¨Ä3_‰ ¯|-gìzw¢`†3çÛgúþ/P9+þOåFÊ*§¨â¹t‚™µÂ#0W8ZÖ›f5¡ß¹‡X½…i”ULt…uVØ}‘ž!ݙʗTxæ|ÅúNÃ\Laî®ÙïM!Ó‰åeV½ÖÃ"Nà›Œu=ð---W)¤,³Ü&<A^ᯠkÀ«pÂ+Þ`ÎÆ ‹Ð4a~),Â…Jeâ<îxÅsi‚ÜDîrÓ~—q‹b4¨êÑ'QŽÏ÷0ðe…´Í%Œ)§l$ƲΫ¡Ð·„I¤¦˜`ÍÇEZ¢lò‘ó´/¢p,aöP+ì5]Z4Ó£šB%©³ÑY?´º3îC5;Œ‘&³Ž¤ÙóØzî1ž Ò5{MC¹çæ„`üYQŒô;üA·OF›†Êr¨®‡0”µElj^‹­ ×ú/?<üôðÈÃ;9¢OYËu@ß<›0ÈuÖ:ìu™gh˜ÃÕe´NÊß/Cö—¥¥ƒy p~ €×¶*6@›j…‹·Î¸¢€håXUUA«øøy…%EîÀŸlŒd5Íé=ÚÂô+ Ë0ÜÖɹÆÖdXŒõÖ~JÅZÛ ¯÷MË£ ?sºòoM³xîûòï_þ:£·mÖóv§ì1C!›tr?é6Ñ/—)-‰›R†1€ðÓ¤¡¿ >™@•÷ÿo/ÖŸºŽÇlWè®ÜÖŒÜf|V±á5Ó•O¦Õpzçï, œ)ð&£Ë'Ê~BÙ 3&r 74k(plË~¼\·s,rAªÔi\Z—{,æC?t¾o:½é:Û}—õÙ3”CÕÏ]ýe[øë3–öÕœdšV1ý®û&Þ5Õ~†èë£.tm'üHÀËŠfÞ›Jó–Tthñ7Ycmqwq°3ΚW`¢&,ÃjVó}‚ˆ kLÙ•KGR§‘ÅÆ3Çió|ƒßñy˜ðûGÚ¯ânUÚ¯Ó•6™ŽÍpSíø`¸áRÏú6:ohE–sˆ ‚Œƒ« øì._¾eBh>T;ÉW^v½;Q0WŸmó<(ƒ(aøòJÅÒW,?WzåAéǬÕTZö#•H¨Òz×,éëªÉ^^Sc=ÿPCV­Ì#à•r+%öô{6uº'Ï8~q¦NÑ Qh{›|6m³§ÙNóG2SR^ÊuÇÂÄ/EÒ© 1 ù·/?è øÞ×’°ËÝ—õsï¾ÓM(SB¿Z™¦cq~žVÐ^Q9¾º ‹Š ¦¶^på¿×Î¥ endstream endobj 829 0 obj << /Length 2047 /Filter /FlateDecode >> stream xÚXÛnä6}Ÿ¯è‡£,¶¨»²O“Ûîdgƒ ã<,v-QX-)Ûóõ©bQjµF¶' h^Šd±êÔ©¢øÁƒ?~ȼC, ÓC~~ã™QU¨ñËßßp+ç‚ »’üæöÍé‡(:pe^Æ·åz«ÛâðçÛZ Zª£ÿ>ºa9ﻣŸ:ZõG~‹)×MßaÛãÜáüø¿Ûß|»ùþꇒ¯(ȽfÃCœ†Œ!iy[KÔ,tZ¡å¨±8 ’RF7œlFšu¯daÇ:Ôý¯ÇÃVÞ@'áŽd³ÍßðN J¼VÅç>Ë‚T7JŒuÿ.gó™ŠUŸìªÍR–òd^õ–Î8ºÜ©p(65P#=_mW…8`q°ìeŽÞ;ÓOA,¾ "7„Ñ,9¸<`<¢™¦+šLHî6GAèÔMU³âè•YqÀ8Ó‡ï ¤bæNžryIJ4Zy*ˆSg9®¸?F±#*;ˆÂ_87G>j%r- pD$NÞwè£j2D Ñ´ènjZMcmsJIê…Áë‰õ°¹ÚÕa9\hjM£$S-7¹˜êݤ þ QÉŽn”ùÎÇ4pzÜ<õBjÑ´FKmº²WgA‚Óô¬.ÔtMÑ`oT,ÃFd‘£din¨ƒù5f¡]”)@.Éfÿ¿ÿéãí»ö€z [/…ÓÊŒc°€" G¡,Zúrƒ¥¢µjî&½àG(ã…º!d=H…±ÚHN#°õå£8­¤A «sÓ‰–¦F9ZÀ)£)=öе½@hñ¬¡eGŒýIÞø·hºQ‹ÖnŽ·z pE.FQüo‘‰nþÐàF&†¤ ØGÐ@)¨q'Æ&§) ¸¾v‘&nHdœÈ€Öœ#IïSV¢ÆÚ%(ÎÂh‘ykÙÝ0ñú9‹{¹Ë>>6W„gÔìŠô ¼õ’<VÏhÙ–ííãžÇ¢l¤¯Ð½‘óPIM-÷wú-õðõé$Ú¡¬ê&Ö«ê4Lw'hŸˆÞOϰ<¨±v¾=æ©ñX~¢ÆkËùÕú¼ø|ÕéyvB6jÂ;J1Æ^X;{o;ý«LkŒgÏÝúERpוkÞ•¦Úð3 .À9F:vžá7Øë~ÂÀô³`N941( Ô#픉›˜z¥1?“•}hà’«íð½B¸{ÜpR•¥lœîɪ¯”8»Ï†þ™8PnRdG¸‰ho,ÊöI(ÓCÀ%IÓVÀLV¦ñÑ€åy}wa˜½Èã,âKT]ÁiëÀ(b<]’E? ¥ÆùÞxí'Ka³‹°£d+ÿ0 ×XF/v> Õ|" L]fnWÏIFܵr?ƹÇYŒ—ÄÂÊÖ­® ‰—¸äõü^‚W%ÄF`;.^^ßM›¸øü•—ý¤v­œ°øêÜïhÍ€ô“«§A#*‡³…™i«^ÆÏ¶«­dš%U6gLL™ç9¿ŽDï“MrVxγփÚĦYØïݧ˜5 âìr>B"ñà™`+˜SSçâÙÔ£HDò6 ]rñ\2ÁàRœI¹YÓ¨®{èOq³ëÎU¬ êzj]Lù¶âÍ{¢…íŽL‹Ója}`+Håûˆ´>ÛÅ#°¤Òº_ñ5ß8;à–m[>¶Ø;`ɃS·>bƒj ¡Þ”c0RšêdþùÝ·4–î¤yÀX¢©ó¾$‘‹Á@¬èi°ëíNsm|bMAd;8éf¶î\nÃx·UË\/v[V3¼bÄœrq“(ekIç‚EÜ]¿ê§lö¢±Ÿ´‹ejWaFùkQiÙ ¹myÎuÈÿhcÑÎÚjµä‰Á¾¥s¬V»ŠÍ…7‹£‚—7Ư‰êVj ××ÍL·åüz×ý†Rá–Ãdí_ªþ¼[0ú!‹’øó|`V¹n-Û]û¤‹Â¥ˆ´ÖO"LHAûT›ùó¸ý„Esvâ,ƒz"öo&´M9¿`¾ |ÄÊnÐ 3Æ}iïËÏ@‚wnºûðÔ&OÑÃâŸ:›ƒ­½›ªuNšÑm f£µ;´Û¨›JÌiôUÑ‹nÙâF(ØcmFHßÑuúLvËaË’¸¶j…¡‡5š½ öFã=lÙ×PÍ<º+6 óÃŒ’6+àXG¿ËýÃ8¶# Ô žh¥hÇžfèu"s4õý| 97Õ{d]‹±{;­%Š'ë *¤-0%<^× +oMØ™Üùz±kpך‘Lþ“_=íXé X—:m”3¦ñêɧ—O,¹0l·y^‹#ÇkTY(s,D<2½× ö._ïT_`šèÿ3 O,0°µ1Œh;Ù­ÆŸÐy @Ëd Q}Wý YÁwš’ÆVé*qÌËÎF?¹cë{Dž¸™]Hw‡†’ãÔj{Ä (šµAî´û¦¢|˜ÅNeçdX£pÏà(0jGMëM˜/›/Ü'äfËMa’ê|úleÊ 7ïük‰d”¡H¾Þ”. b­,±T“XªAeº¼ "Ôq¿4½þ^µ¥Óê´Åõ׋KŽ1q¹Íú÷Íü柳üB­åœÑÆþ,û΂Q¶#•üø5ùOJÜá endstream endobj 699 0 obj << /Type /ObjStm /N 100 /First 856 /Length 1860 /Filter /FlateDecode >> stream xÚÅXIsÜ6¾÷¯ÀÑ9$v •J,©Ub'%µgóø@±!‰cŠì"Ù–=‡ùíó=²-KbK½È™\xû†ØàYÊ\š2i1HfèO1!FÄ-ŽÖ=Ac LšÀœLz…Q2%ÕÄ Í”ž0LYƒÑ3-'ÓëR0íAOú×Ì(ú7ÌXÀIÇŒ}é™ §Rfàc-ÄSŠÙ8E2кí÷ÁX!“_ èå´d¼œVÌ+ÐÓ†y’C[æ=í0wÐ9x¡wª±a4&˜€ÂÅ@u y‰´b%&AN4Ê" Eö±v#CÀhB{l9P60ƒs6 úÛB²£°@V‘‘ #â¢Nœƒ½>d¼&lr€Дnr˜¢×[3)á4‘ ‘ÎQ¤Œ§RדÛR1qA_(ŒUð…|ZZ2”–~rØ–¢€›$ ¹$DP˜@, QÒ¶cJyH Ê@q@R½‹BÀ„ìÍ”‡ã|^šäADÑ øYeå~íïçêy±3ê{è `›Øñ©P4é=áÏ(š^È‘"ÝI‰¯ @$ =7ìšJKn¬‡>hCĪLê~¾KpáúTŸ/‹rÎÿ]·ñ¢mëŠ×ÍeÒ^áf[$;Æ<J©8=µd$Ô¨—ÆþQ"Q ±±p>„ÞpeÜ®éðÜÖ‹qˆ½@üI G]=‡í™Â¯`•2]v5ŠÕ(ŸÛUÀD& \€²4†KM)ƒUfíþjÙßcOã¢nºv×ÒšOÌZ0pL"ÞèiW›þ«d¸Îв«¿¿Šåâåù¹¬–”; £}Ê´Öh§==e–Z÷ó]²²,Ú®å+’î:«úÕwý䎜»× -%§Ç|:Ŧ·ßþÿÿ,ÞVa„Þ+¥Pj;h†”EgŠ ½0)⥯]ÝvUŠÊ…Û÷¿[èb(ªåâ*»µÏbyž`þXI•›{ч0:àÖkÔf8‘Òy°NHǽ {—軗½+]W:·o¹–~ ›Þ‡¡[¼kÓÿ”" endstream endobj 836 0 obj << /Length 2806 /Filter /FlateDecode >> stream xÚ½YYÜÆ~ׯ˜7s Ã&›—ò’X²ÅH«äA6.Ù3C‹Ç˜‡¤…ÿ|êjNÏ,WG  ,û¨®î®ó«µ àOmò`“F‘ŸëlS¶n¼zñH Ýwå÷7þô<Ž7*ðó W››½Ëê¦Ú¼õž‹Ód†í.Š"O=Ùî´Ž½—Ý6̼iè·;øVs9Õ}‡í@)O…Û_nþö臛eÛ8 ¿ð|Hù™ª@ìÞ$™öU¤ù”ÿlL18dymñO'½¢Ãoˆ]åý¨¨&™z¦8¯ax¦à‰Ñ4û]Ùó]‹º3æD €ÓcÉcïC=eMßšéXwæTØRwõ$§™ŽÅ„ÒÙìßb§"_Å|‰’Ϊ2ï–ØîLfœhg…;â7¶·óá`*ÔåÞ¿¶xÑÃ,+~ŸÍP›Ñ]’y§Ú”¦5EÃZ3ŽÅÁƒ,­j8oRÎÍ$›÷L^”2ÐË‹®¢{rÅW¨úmåhš·¦#r4û=i¦éO­a±ò„ÅøÄsM ΙñË=RÆÞ®êç{ f਄gê‘'¬[Ñðcžü`íÛuÓp«êù+ܵUÃ(,'™?n[ßOÛ3]RŒ,+˜¨ì‡Á”-¬xˆ…1Œä;´ó~Å6D²,Ä4ðFä” „¦|ÐߟÑÀr¯Þ3•+Œ\ŠHD@qZ$”Â$Š( Î"j‹b¡Kr‚õiðÎZ;Ì·ÌdÊZvú9ˆƒâT 2ŒgúVÖŒïpýŠ-9bD¬|²«xD´3-ÁIŒýEt’ M#l¯>mYa·Ã^ê7Ñ£‘ß„z§«†¡†ÆB8r«eyÌèaØ·ãsWBpB¹†9Ñq„ˆÊë†úpG EØÉy½·Ûn4Ew˜Á6˜Î˜j¼«Gœ±n1ðÁÖl†ì 1’â} ÷‹fì¹eE¯Ù¤#¯ë'ó°\_/šr}V»jºðY<æææ~˜ç—×ùNA.HÜ\ùAfCÀw7‚6Žõ_~ëG³Ǿóûá ë.sH”ú:ÖvéwL“Æx‘H'!ÒÀÑ´Ÿ†)4R?Ë%F+_Û]œ„ÞSðÚÌb¨oçILøz´è܇û8¦–æ(”M :ìÀM<2õü%5Ì`u·-zdW”<ÎœŠ©ÄGîîÉL`ºb0·y´éØûC(Èßp`ì›÷âÛÉ\ù `æì0_Õci,h s óÀ›OΙ‘_U]»3ß}œOŽºuò©±QàÌÉ| SL3:1vþàÉå486û¹©¤=³t¨ÎhÀc²8ì_X``¹Æ+Z+? òÎ?‰³ø1Ìù0€> ¼\ޏ(Æ®ß9 VÌõ6â6¦ð|ÊÏù o¿ŸY¨»(Þ®s¼:_lüY¥`#JêÚSêú‚*…Űqù:K?ƒÉ„xçP¯Á²K–t,¼pÌ»9šAŽ#`ÃFV¢2Úv1ñüâ&Øp¤9ý ]Ï2´Z%̱èJ#|÷Œ„ØJ„I4ãë¹ò<°ˆ6hæÊT¶ÇaL@Mäõ„˜jV? òÌwÛ8Hö‰øø¦kƒtbíDHì±wgèÝØ­…HàÂ÷ƶ@à‚M²â‚< è_gòNe„!†,CÒ KÙ‡?l9`{0¿c¤©é³œ³q§ÇúÐY’OdŸ²?Ñœü¦Aö€[ຆ¤ÞqK_”0.z¾Íð€Ò{½Eøs}˜þ9^¾‡kè@`wI¦ÀîH|0ÍßhaÙo2åtµ×ö© V®à:{&Ð T8€š6°]–Åáµ<±s,ð°6êâdNn ØnuÇ-šñ.Ø£‚>c•.ˆL:ƒÌ€ÁžL®É¹ùÞÎËQ;C~„Ðýè\wàm1 ¼GÓ-Ù;]`˜¶÷Óº­“8¢ü¯ _J5V®JÔ½Uè«IÈX‹Âtª^p8#P^5Ö£L£ZpJÂ^ØÍ†¢m™Q)€Áà˜dâ½@ÙwÍ“æº2ä!h¹àêeß¶}· ÒÑ`”ÓÚ{3Zp5}Áý‰‘œËv¯Ä! Lj˜-þ—%lHxÎã°£+ ´uŽv 3Ñà†.‰vãù.ösÂ`NÈ‚H—®Â©ÐO`DÐÔS¹ üãµ=•–¬EMC€âÒ¤¢ ~ñÓy=AY „aa\¬ œÊ¨ÈàP ù`Å(í¥ÉWgp»~ç0 ¤w)¤ëmèþÇ5i?Ô¡•†fz0Õšèu≲Äõ» ”²°{;õ'Êú`Å'© ®yÆ.›Û_rÄà\û Œ_–ùŸ:>½Þ\œþzèÜO³pi|{õÎ!_WLôÁ—y!—ëºO'ñ9¾a§Ã(Ø`HÀžã:I<€ÕhÒ8S@?Rz…ñ’kçJfpC6]ÌÄ9›AXP¢}ø ê¶1-æT§åLÄW²Ð‚}³d¸±ZÅ “𬰹nZÓ{5Ok!âHY¾ƒ}ìÀ¢„ƒMB™²Ù%¼Sö ªŽtìga¶‰`ï4Š¿Þ'eýÎa°æ“WÛüß|2÷AÙ×>«üaŸLý8‹¾Æ'¿öˆ°*õÓøRüŸxˆê{¾<ß5ÓÅñØït‡\VÀ5り‰ó…ƒ8”'Ø‚ †wþj¢’ìó?d*I×Î åÜᨶ`ŸžC#n3@b²USøT¸h«ª÷{^¹›WÝ.¥kÝî»Aq’BbqÄ—Ý핺ãRÐ C?ŒòX|ÃRj¡BhCHkꊻXNõ²Tª&à!å÷Š[[o²Ö”ÍàHùÑ”³ IÜf5/àŒ;õ¸úŒ< -y©×š¶ä´"ÂÅy¾"&ÁPq½8½-*SçU:6˜b»¤z [«Ú ¡HÏéòCÓ¯ñ,å¯UmVBzXåFK^ Ut‰/LD%æVÙ׺âtjêÒèSo_ÑÊþ\^¬ÅòêÉq ~Ÿœäa|ê?ïM_epÏŒ”†*’ßC¨Ú:bÃí±Ø†‚ܯ…`zEåZä=ãgfåäCÓß"°Çö{*«‡º€¬9Þ_#FjO1Ðï.RôÝ/zl…µ;Bº&ÌäËnQ‰_Èn<=KÕŽm¶h »‡M)~…„º#çïk.–`œ|âÌ!÷ös'Ï>Èï\r×z˜†ñ2+¾R_=òÊ­]Y¿‰»7ÆŸHì£Kù~cûø+é¦Ç £áZLRŒaã) ̹ÕÔ·¬Pÿ£²“Ü{‰šÀ[ ˆ`ŽàÇꑜPP©d€¡aZª¼€WôœƒÃu{bÃϯì^ÂòñŠÅÝÕ+PÛR 5”Ÿ¶„u\¯f~Îï=wLAöκ¢­òì+I ‡DJÌð[;ìýŠ*ÔnYÐc1LÊJ*\$ÃØ,GD¶œ×qÀö {gG¾Gˆ ü¶&ŠÂ35þ¥CÓ¯²ÖZ›µ NÇÓò»…ÔæÒÏ4åä¼×…Ù"â,=ÍG|îà–_Þ碽-*~qóãîÙ?ž:ÔÜÚ'¾ŸoªŒ×3ø;§Úð—÷î`þÞËOœËÁ~úá߯ńìká‡Ï6UAÆ‚+Ë4ˆÿ örg endstream endobj 841 0 obj << /Length 1825 /Filter /FlateDecode >> stream xÚÕXÝoÛ6Ï_ᇕXE}X~Z:4Eº­÷aØ”‘‹,i"•Ô/ûÛwÇ£lÙQÒ¦6 òx$ïówG³Il’“”s?‹æ“|sXj»žÐàÛæøfÀ8p¾Zžœ]Äñ„~dl²¼µ\M~ó~,Dcd;qνp1EQì}Ô=åQMù׉r: Óy{ŒOÿX¾=y½Ü݇á7ЇœäKA¾ÔY9ù’yä3‘|át'a/Q[‰8³Çêþaâó€ÑîøÊ-ì BïªPºP8fž²jâ"7š–ï•)h´Åµº£‰©iÇZ"èz#i¤*eZ'¢›2ÏN=£raT]õ—ÝÔífG½RÝâîA\Ðz†:¡Œû,vJÜ[qÚÕ)ð±ÄÕ î2;ÊkRÇ)A°ÚÊc‡[jú¶2—ê®—aÀo×C/«Éþ•##Ilˆ¶n).ŒªÖ®´çò!Žxê]LçÜkë ±T5.ÞÓ¤®Nt%Uw–À ­h%ú.:òQà [›¡w/ŽW 44°îY’hî7MÙ{E>pn!Üq•D}q¤eÞµÊà}ÛžÒÞ©\ê^mÚÄq¸ b-o_ƒ*[šP8^§%¹}·åFvN{;?Âu¢(s?Æ­‰ ‚‘Vï¦1„S«êNa.Úz{çÕ˜šò‹Ø4%ÊC¬Ô]¹¢á5€…LÔ }÷Ù“²^ÓÀ¦BìÒ+¦$€OQkC£Vnjcý³;å>¹¬O†Y&‘ŸÄ)ˆI^e%Í<ðÈç ïù^‚’1¨½,äñíÝ8¬(vPÚšbf™„a+:Jüù0ñ·ök‚Á%2P»Q\ q¸&úÞF0Q•K’ (ãJ‡ÌSþl¥]†cú”ÊIM4ˆIMRPé0­‰vœüü8(ÉLqì'<9Ê-’R¤â@Ðç8ª‘fÃÔ.¢08 ðDû¢3‚Â0M"é@Û”œžžÞKrä:wÓΖe-0çf,C~†¤Q¹‹¤4tvMùp·]@Qñ+J ÁÀñ°žX@N]ʤ»Ä‚«r¼_ïlÁrkX{n.¼òað>æk‡œ¨8½Àû#aÍýx•špp,*S?z6aÜц™×@Õhú2rר NXSŽY¹y%m0K­Êf®Î u€úŽV7¨›vɲt˜šõ`mÃvÝãG˜ªØ™¼¥YÓª*W §•ÀÆGèýÎv,‡tHyû…’Å¥ï?‘§Â*&èfÖÛ°@.Æ|ˆ°`Õ –$~îÀX«M]ýðöýÕë‹««÷ïü÷ÞŒ… æþœívùc'ÏÂŽŽ"P'öÓ¹SçÄ~÷‘Fãñ;búue_Ü€½×=´X4³ÈƒƒO#½\ŒÙt„q”ï’ Cmž@7{Ñ:‘Ï»5 XLß ZDðŸÑ, >ªÂÊÇS§Å‹€-ÂÇNsÒ]*ÉOKë¶½6ksvhF»ÿVni°’šÏòë|¦ Áf·Î~þ,±‘;rÉRå·ˆÂî ¸-L¾å(rT MAn¡§×ß#ÇC1nJ±Ö ‹Á%—ï.——ç?ïˆYø˜./ÆB9æqr¥çš²h‹pn!SJT4Ð’Ò1Ú7Ž@uÅFˆ46õ4q ·­¨[CC°@ÞªÆõÀRßÐÂ.÷56¥R´Á;`åïŠ ÞG´mXÆp‰/¿"k#ÙR _[Vg¥tS ¼jK¨Žã¸%Eâ¾Þ¤8ë_'HéÅL­˜P˜÷jëŽ+}% *SPOÝë­_½„ú,‚'itûëˆnEcážXÆšÁ¢Š¾£m ?ÝáÚ_g>Õ™±ñ§Ç(K»Tê•>”ĪT(éLCÔo/ÕŒÏýh_„õ ôf³RéÑn2 ‡Âãt>`ù×`zÉ8FhbCóZ4>+ 8û,ô±÷˜<|üã?ŽÈÙ"JžÆÐgAr²“'þ{ÙáfïŒ?‹;ä+(üw? €ÿC;§Ñšþ<_?/ûwbf´Œã£ö¬ÆHÿs­åÖuå×íú8CŸ‡Äc†qSwÕ ‚=¯D*4Õ"W¡aBK­Ðà>6ÌYUjE+‚>^Ê™k$y_¥p×Á»yÙs?໚ñ¨ÇÚhxVEñÁckcAÂnjK¥û9ƒ§±ñèÐhkYÉÖ½89þŽA…Ç£')ŸýSÄ‚ž`ØœÔýkC¸ÖµöûŸšÿŒ}ê endstream endobj 847 0 obj << /Length 2209 /Filter /FlateDecode >> stream xÚ¥ioÛFö{~…>, ÎpxÈ@¦­¤Ø[ËEw‘蘢$6C3ÆTÉÀTpŦB¼[ƒømê]“ëÎŒ xÚš/ŽƒMe•C;ò(¸N±ª^ZU–­HD,9X'oÛ=ÑTÀMÞòao‚ CËÄKUâÅIĨþ1‡ð {›ãzdó¯@åÍÛ{ÐæÆÞfUÚvh·;첯VYë¦÷©[®Ô³¿ëöëïo–×ï—Ë›OÞÍ퇫)¨wûnÛåe©"ˆâÐyßnÞí aò¯¯®ÔâJE¼“¾Œð1ºe§›Îâ¾ñ…ê*Îà3ü]W+ƒNÈ%tá•]Éè2º%i±Åuªã/ÙCÕÒÁ/~èKøOLÈ|—§_ÐK @.£Ë8h ÎÛeižFÛû'¤Ãã³à iaÝh"7 DÈCƒ›Ê`qŒÜPò’A¡CÑq#ÃØùÈ·:ýcŸ7È ‚h><ÆfL±‰W›xùÛd–‹/Š•MU¥OðÆžŒ¥…}Íhón;bb’Žò½°§r§d¢à„j•pR U o ͆n}ÀŽröÌ÷0o{BReŸ K¤}ïL”ÉS2ÆWSÎÅÈŸð8ÈÝ 1øù[L õ¦Ñ»mŽUKDÎÍY¨yȳÇ_1JßÙAšÓ˜w;ᩬ2ö!?…¾ÆÔ3ÅßB»ð ÉN‘¿ÈÄ1§1לò|9®Æè‡Â΀÷\ `qÆí@g²¯Oòç”[,b/ºi\Aö^Äã¸Ûé’4tZ”îg}ÉÜV_(J„Î#XW‘³7¿\7p•s;ÓÔØ’9«=ý òØ)0ÂÁÞSœâëyÕ‹6}Lã†bMVЃ)ÃDvTY[袅tþC¬š÷¥ÆËo¨a° ×Ùî¥ôgE¿¶&âI¾æßƒ©²´)2=b ^µ–y…=*ÞQr¡wûŠ˜ßò–•Óæe^h,ù`màue™¡rŽË^ˆØ1'-ôšu•r†í{ö¶©4«ï t5ÉÀ”PíwFMtº5×è¨ *™s[ñ û êu ÈQn¼M!×f¬ë\h¥4s¥Íý¼3]œÕu2p¶Ês× jö­¶ïÇÆŸ´¨I )wŠºG¹pr¢›…ñqËÛª6çiÍlë”{::d·9ðæØ›ñ¾ËŠ‚Û>ÜÁp•µ™Á9Ö†ÁÙd–4ÿuµ±8æaèè"§6XIgY¿™’2ˆÅÑ hÓÕd·Ø·ÎÚðîÉØÀheì3TO2àA‰àû¶ãÛ$/œue° œvz¾Ÿ·]£»Ú‘#²­FÜ6pð ôUN´$ h±ã¶t ìtšÖ{¦ïñp¸ÎòrÇý°ÆM3 ZÛr.iakû_þeûëv*‰Ò<³¨/÷Àñ {à¼Ô»·…îºÌû½n³u c¡W7}G .yó0edÓduƒÞ óáCÆ ú‰¾žåd]×÷ºyÝOõp{²¸@zŠƒýKÄe^¥èU¡-¬a2]X¡¢'2:ÖÕg&ÕXy*¶[H¡¯ŸLÇΊ-ßjþÁØæ{лeh&~ü¥ìbZ Ä(à<ð¹AÄ·uÛæœÀÏ=·¥Í÷¤ žLîPXä(ážÄ¥Õ zä´ë§m¥”£×…뤅 #ˆÁXçάë¢àÂNââQö§†è´¤ÀÒåT•¢"39Õ-ÝÛëâ'±¿âÓ{[ä1eòÏ݇Ñ+ä?TöòÉ—:ê$äQEÃl\2÷prìL`³Ê qʸ؎;äÅ©éû¤|ñümFrS¼7yÅ{ì±Íü‹©¨Iß#z‹ºúúl:›ŸžÆíuEAƒ¨è±nÌÜGŠÆÅog‰½žœÜÏ‚OÏùf–³sþÏvîìi›:¾’fé‹sþõŸ;ÀÖÚ±ü"¶ >ÿÕ`r,¿œöû!]g­ #7íZw[êÔm·Z¸‹è85‹äÜØ|fd)ÆKóûßáê)SëBoP»"Äo27·?¿»ýîú;¾ûáöæßß}óÏëNùÿ ¸ÍÖ”Ž#ÓäF¶­…Eƒw0?ÙÖŽÊÁ§dÜó÷9Xèœ˜ØÆ †0÷©¿åý¹ÉÛO¼(”Àvãõߘ¼Í{w€`jò>!3ž¼‘?åE¼øüÍÌ=j¢¡nž§ra©íÉ_E’ØÔvÂå">á2IŒ¹ñk‰âÙBzAøÜnÝ#ôÔGø1Ê~Çš{ª>È'tÇlá7Z<ádè?FÀ¦oaóªåа¤MNõy`Q”ucÐKôèÿ¥ÏJ vʨ Rbb„úoÉ 7Ü”jÓØ’3êj”þM{º©júlÅ7fbQÖ­yŒ¡ZÏêþ}jŠ¥ endstream endobj 853 0 obj << /Length 2504 /Filter /FlateDecode >> stream xÚ­koÛFò{~…? ˆTñMùÓ9=7—ærlwE[ +r%±¦H•KÅÑ¿¿y-_¢àî`À»3;œ™×®Ü«%ü¹W«åUìû‹U\¥‡WKÂÖ»+žÜ¿{å Ýç=Ê·ëWßý†Wîr±Z®Ü«õ¶Ïj]ýâ|¿WÇF׳¹ïûŽw=›Aèüd,æ£*g^âœT1›{q² 7œý¶þñÕíº•zÞ7ª‡”úÅ _°ðƒÈý¢$X¸~Àúy w6#Ïù4›»N]Í|Ïù’«M¡AÁ8tT™ñ䮹Η3ƒëL3#±–æ F ’½Á€S…°¸ÞW§Ð§U™êc´83ÄTÌ^1bpo‡§kce›=Úë2œmÉt¡wª‘D&Í%÷ ‚­M[yÙËL”©$ŸœÀ× ¬ÚÀ¬~]&+$y|0zX ‹â“Å ¤b8|¦•ù„°ª³ñÖä`:E‚½*ss`_Í´Ië\’nÆ8Ú‹o¥Á¤Ô_^2:•tèKõ­à÷â@”LPIàÝÌ/ã¦# wæåh ¼•óé©ïðß¿ßß¼ýÇ-£ÙqžþˆS< ¤4ŒCGÒΉ½±e–³¦º>ÖºA» ñÆ&W\²ú ¹Ë&1ýÀiË)L‰¸7xw’ÄÎ{Ô+q9I⤫ ä;Г´ ö:œ«ã±ÈS©Pˆ@®¤Imˆsâük¯Û5Ìû¡ Êíiÿ€kÍóF… yw8øÙ|"^F§ étÀS^Ráß«†J•r8Þ}à‘|‰ðæ¤yªx(õ“ ܉q¿.Ã%U1¢¬šÁ—“GÓ×t¸;àå2^2qš£ Ó”¯kÉ¥n¸¢a×Rز¬Ö”ÑØ(N§~Ø+c¹,7G…4§·Ëöœ(< 31ZDç[kýçI›Æ†±u×A½ìz€¶ Nì0/sLÝÒžš½Myìk˜’£•óVúÂLoÕ©@çò“PDz à§¼Ž¢({ËØº?¼Qä@¾ÜãÀ'£s’L><~Ì/»„ÙÌB´ <¹RrœŸ–ò.â;K·,رΠT`z|ª êErsmv£C “î ÃU×ÇÊšâAì“]¦Ðñ¨ÈÓ•%ì—ÿ–®]„i¸êØHß‹%Êuƒoj}¨¨$ªæþÓuþ<Ù™ȽaÌù’0J€¼å®[ïõVÊz±C×ç‚HlïÄ…l;DúþE0æNœìòÏRQ"|†—Ý?­ÄÖhôu%«iמ ¸vZ¼6v#nPh3W¶rÚFQúNtʺ ô Ð]?Ü%Ò®.Wufï’¶K6—f{”ßÞ~{>‹YîÙ*û%À…ÔJ€)I€1­\kP¹UwÿÀ9÷'+iZa4MUhá5êñêáºÎ]‹Ô•Iƒ`1ÌZÕ}1¶ãêϳV‹<{¾Änë ÝÊv?ñ@mî¯I;églX—ŒMWÔä¢3ñX’Ë´8e”já+*öV€°fô_‚ß0k¶)F ¥O¤±q'„KÛ}ă@˜{ÆÀ‹zšoϼÖ~Di.j®¢Ú€6LÈ–ÄÕ§=ok?âÙ ¹¿ŠùëuW܉˜ÀKÆëØÖÑ3´hJms£m7ªšQ_Ú¿á5Ì ƒ¢{J ª EÖ6¬üí{žlNu¯XrpªË´>©½GP|ˆK]Ùé£>/¦_èw=±Ïž&?èk|$.û#F"r}ÐPM\hМ„Þòzé]û¡…–þ”ЇËÐ…¯¿Ê0z™ám™ »Hœ5^‡ìVŒX/ê'ê?ë™Å_uŽG-§iãÏÓM:7{åÎå0°yu#ºAN¨½ÎÓG +at©ê[X±ÇÕÐr§í±oþOzl µ3 ‰âCÿý¦‚8ØP›ˆ\$H Nië†jqÒ%'à‚ùƒª}°l/¿p±1œy2¥<ÓÇ˜Ì ßbÅÑÇÝJ†… ®!üŒêãÝDî¯Ç2¶=Ãð.ä'£›¿Pw¯òõ[–© Œ¤VÔ9àh=w )Æï¬A0ñpg”Û+i0~ { Z/dÎo}†~ú ŸD¸pÅUö8qÞoyÅ“€jÛPŠŸjM9‹­a;ûÌ0*{C´p½óævb{-nKÑÄK¹5Ð[Qaúå°oFìê.«ºÁ4YI¼d‘|­ŠpA`Ý&“Ñÿ\¾)7»ÿMr®½x˜üðçÅÿ2Œ”y endstream endobj 856 0 obj << /Length 2140 /Filter /FlateDecode >> stream xÚÝkoÛFò{~…>” —¤øÈ§s'u.©KE[\ tM­¤­)RåRqôïo^¤¡ìâp÷åCœÎÌΛ5 àŸåÁ(¢Ig£bó" l³1p÷î…:ý#Êïæ/^½NG*˜äA®Fóå1«ùbô/ïûµÞ¶¦ûQyáë±ÇSï'×a>êjfÞN—c?L³|ê©düûüý‹ëy/u†S=¤üZ¿äX?¥²I6J²x¢¢˜U¼®­ÝÔ- o¾3cà4õff;öU0 ¼œAüþ”W@¡ª ÚWÑDM™ÛÌ4ŸMƒÌR zhîÛUûêýíìúílvûãäöî¿þ`ö ,Œ‹üâ¾ðÝZ+ÿaÁØß@®JàWÈP,dn‹ÓöŒ@Z˜üV´Þ6ukŠÖÈöýIe©W4QÓtê}º»ýåæê»×¼wóãÍüæêÃå4 :žç„2pš¯’IžJÍצ‚ˆÉBoñRïxáÖõ®+oÁË{°Cæ^èû’ åµµ`Š¿v¶‘m°rú²çek \>àiðÓÎëº^kݽÁ¸UÃñÜÚj5Dõ-ÑW1Dh|jJí8#–uY‚f©÷Ædóœpˆñ{b›oجnmáá?µûÇ@ÌÙÞ¾*uۚɟµ3KçêjR7+Þõ}° ØcÀÏ¥½gö¯™ôQ7QVÿ|ó½„Ò®CÝ™m)qeª¢ÙoûpÛ9² qiê„ ž þê ¯Rîj×®%ƒ£‚ï#:ë4ƒ³.gŸÌ`:kuÓv ¼ýÃ(|šáÿ²Â<íÓÿÿ*ó듺 ¡DJ¡ÎÄ“(NBª3œIadÒ Â :2 ½·ã<òêæqAÕhRJ@¢® œQAƒªãHAºÃ–‘ú†ªÌ0;¯‘¢QèÖb¨ÅxPdX`N ‡±gïéJÖ•kuUÆÖKÙåÍ£‡ØÇµi„2 ´á϶è±XÙŽÅôÕ O‡ë†ÜSÔ›miZƒÅ7üÕÁ'IC (-4õÚ—P²"SÏ.ºÃ·øØ³È› ´Ì»ªø=óE£^È1„7è¹±«5±å%6Ô3Ì~Ç’À yÉõ|„½îõn*ëÕà9-µ€XÚIŒ/F mc6( n ¯ÝÞ!¨¼ ¯9d€žÝÉp²'ÎOœøN½R7¼Z6õFT.³4ÁR §]vTpzÃ0 ôÿ:5H™4ŠŠŒWè’«qߨ°Ýä}+ÆBC À«·wc¥”÷3ý^ݽA÷}$ù-PS½b͇OÍóöI$ŽŸUÝlt‰ WuÕAV±Ù6†‚‘÷7Ì´Ó픻ϑœr_¾Ø‚%0ü’Ì»A Ç ŒQ1p˜.`aW $e=íï=Ãz»-¾re#;áLÄ­g,ÅaoA$_“ƒQ†°îíáxmÔ©‘@XÚ-uÃ Š¯¤#À`¶ÒéÀ§;<Ô- è&9D³>ßbµƒØúR˜­0xÊâŽØhñRèÒÕC‰×>°¹Õ#€-„8@‰·° XqÌáíÊPMyD=(‰©‹Æ8gÐIÍxMåxt¦f)üRÓòvgˆ^˜¥Þ•0ÎA¡Š`ìXC„ÙÇ«1dݯCÇiÌ_;ãZš-:dåy3XtÆŠ)fURÌx.˜€¤ÞJ< ¸êìý«?OÔã2)tû(;PG<¶áJb+ÛZüª#üPlôS2PŸOìÉ‘@ÛdÎ<¿ɸÙû`ÇçÝ®Ž)Þê)FÐÜÝ ˆàjRSŽ×ND·ƒ3~!YFg[\T±7Ôñ9y6tà”Êþ¢²‡«+ÿy¶dÿÙ^. Ôò° “’µÎÃsBEó<giA(þˆÈñJK¨úoäW èð©…N‘0ûáö§oäu*w`ÿ¤Ð¨O”€û'áî[Mñ °æ-ŽwXÏßÍè |Ò 2rÅLapM±ðyÌŸÑñXȵŽ+npCq®Wƒ ¸w¼ª«NeÑý|¾ˆ(¶â>üõ"þÐ!`ÍW}²êï6iÅ­fW.dÝ__ª ÐF„½_°›&8¹•×hF"ˆÎHPwpÑ• ]HF“ [ÁºvíàeÔÀ=ˆŠÒI<í_}9xÛéÃ&Iý§7ž’OLNŽÁk;çè6 7 lS¾›aà¯Äò1ð¿/þ qY• endstream endobj 859 0 obj << /Length 929 /Filter /FlateDecode >> stream xÚÝWYoÛ8~ϯÐC•HuX²Ÿš6N‘^l-úÐ(-Ó–jYò’ôþ÷;£¡|çh±Ø‚1g8üæàÌg†Yü0«çYq¸½0±²Å…×håÌ¢ÅðÝ3v:{–oÒ‹«Û(²˜çö¼³Òé>T:±¾Úos¾ÔBvœ l¿ßqÂ0²ÿT­æ¯:~b¯xÙqü8éE6‹;ßÓ÷ƒtë5òýg†‡–§ñu÷ãc,q«›„. B ±,Æ*/ࢋüÈ^sYÕÌHnÞÒb¼jUC±,7´U&7à„Ä•‚ƒEÖír.6.&A:,pYD~rõúýýhp;Ývï‡ïúFŒ¬®W:×ÅB€ï Gö§º"Ô‘XvæEžÂ÷ú^Üg¬•¼àÞHs©[@§Ÿô$¼A51h!XØéJ£õHá…Ï OÈ¿…D´¬òZé«’k-ÜŸµS¥êÊ­å®®´˜8Ù8sTΙ37—ñ œ³.üeç¥E6z ýîs y)k-²íµ'ŽÓ0¦%Ÿ)„EpÏ·÷Ã/×ÛÁÍ$|(—W¨<žD´H ùÖ…^ï™nRpë³7?¶ë U­‹LL.QJl ³@z®æ8œ˜eàùö´–Ûà 6Ò’+µnàäÄ…{ƒ©NsAG¤à Û íZTs½\#—ò›E†š9â mN,ŠPºIÝa!ŒwxX€1ÜŠœÒµyöת b€# µ‹¤93ûô±çKsöÐ?éf’HJ-‚F¸ m¨@KÄö:}ÑlädI PgZ,¥P‚0±b‘oßMiÇ”–„zªÁêÌ}W³ =ˆ¤¦Ï‹‹£š66Å~¨ê'5ÜyB“G‹ ¦~F8¥bm“uñQ±Î[œ¬çÓMã@)d©¾ië÷‘¿zúMq8­nƒ=ãhP5_JÍ,cÿBúÇ =ÿÑÿH<éGÁã,ùK¤ûÜ9Î˱žé«ƒ¤^ß²çîõ›Ú½û|—Þ]ÜF,|€ÅŸ&`óÖf„›÷ÃÞnþü0Þ­Wå„6¶\†4l¨ÆIo4ít¢òhÚqÿhÚ &Wí~mü oOìqêǸ±?ãˇ¹˜Ø.€ØÊ²F̵úýA>/R?þ.ØN?ä|¦^Ò{ïiªøÅ÷Æÿ÷¼ä÷û7|{tƒÿ"ýïÈ…— endstream endobj 863 0 obj << /Length 3331 /Filter /FlateDecode >> stream xÚZY“Û¸~÷¯Ð›©*‹&HðÊÛ¬“Ý8ñ^™Ù‡ÔîVCA#Æ<´<½F™Ã,¯™nÏÖÔ$» Ÿ¼ÂQ6¿‡¥õx¬¹ûw;ïo‰=‹Ã²ô“_ó4%Ú»=÷f2$JKèM–yRè0Óz¦’ŠÍª[ûèPO»Õ4ÒG†‡ì¡ä¨ræ<ø-Rz'Ù.ÑIƒm°äÄFÆÉž`®ŽœY$e êa2<«ÁšÉòäkMiÑÏpŽ;,jTéàž,àõȃ2 ^ð2¡Þx~Zn×2·2Mc÷LÃULxarŽ» ÖHRÞÉpóhFn›¶ãnÕw(™§y°û7H*¡q#AÒë&Oš7[î“3¬¶{ªååzçº{âÎbÛ(µ—Æ<Õ.ú‘VžðеDžÍ©(ÆœdÁqÄ•»a÷‚IX¡–X‘vÓâyJœU´æMó×Qˆ-gþÂÐÝ1öz²ÓÄç‡ÍX|Ð`ÎrÏÙ|â'Š‘ 6ÎÁ`Á-. ÐÓÁZ¨¶°lË–šdi°¯ÇjGî{yæÎ™Ü•›rRHÁ02Ú‰´9<[ ÍTŸYöR_ü.áå: /¤#4_åuƒ“>mÓ,0uc릞›ó-#î)FeAÖ™Xé4½ÙïM,+f¾†F÷„bNãàÛºMž·€oø/h/ͼ—ÎØ·ž `ÑúȇoÛíÉ&’488fö–ÏÙô'qv:p‚Ðj¦Ì@’DQ`;CˆŒíÅÁ"gÎpœyœú¶þÌq®ëg‰sƒ4†k~³êLã‡n9 AÞ¢<gò¢£¼<Ê“·ýðg»û‰‰+ù¢N Šýüš7 ¶‚=ãºÅ.º±„õPq`OÁ{ðpáçj ìt`x² nÇvU†*äg‡X<$©·à)öN Z¥úSî4”š¡h dv—Å©ÛbToêÇÁ gîð°˜´Ø”xo˘yC¸…,æž/l»=À¤“B9¡Ð î‰ÏÁ’üOäš}7rìDz\l€m ;Ø!ØÁFgZjÄRPå…MÓ¢‰ë¢¸z륭Ó:Z/½l[Õ'ÓŒÜÿ-J#Âjh(\9ËSUýÌ¢b1ä­Ý |ŒÂê–ÛNá«ÅëƉÒò¹pÜç ØsÛ‚@n)„Âiµ`‹,ó%@"#YSïyŒCÐy?lÕÙϧ”䎬\|,E8·Χ©ÌéQÆ8î…‡…y쉷—¥«ì€h«€E÷}{Ó®s”<÷XÇ(‚tleKpÀè¯ç KF”³YQÞƒ,8ƒCF¶à,÷§áŽ‹¤^$ðm£Em¸#Ëú3NžI+Ë£YÜÀ]V9à+i¨ûyd厛‰iƒýc¶ã$38h7B¯5{KJsŨ+úZ]8s4Í$3á.–¼›úÝG ëgž¾âoé‡m"óérÁé2R8A%#ÈÉ€<€A÷©VÁýÄC†Ov߀Ð9ÿ œËna`1î,ÍÒªX·…fô‡ûÙ´P¤G¼“ù_0º±žfÚ­Xçì:c¼„þi˜W0 Ä À…ŒÓáI;_Á—.oak›=Ûö4á¨ÏRˆl½,šf!Ç|d²ì`fúóQ8hMgžìMU“IŒW ¿Ɉ9 ‰gbP[Ð%zß5g¦-"²$@æå!'€«ÜI[b•òâætCxÃ6x§# Ë€:=^‹n8 ¯ºˆ×†ŸÄkÇ19Ð[ãÖòñRI0<Ø òž ,hŒmð­µþB㻋ÙJ8&ڇnjW·wÇÉÒGÓ@ì"fk)gÉ q„wË’.—ˆa_Ȩ>K“YWr™•ò.¤äÇÚc6¾,™°çHøHœê3Rý­ä€V1Ý“åÄ‹¼2±Oµá†X_âó“D/à~0•Œòm.Ñ/)`ôu˜¾KBæVÒ=# 3—³¹”RaJ9 –îØÎ c¯Pö™iÓ`—,ÉMÝÙ‘›”+À„wÜ­¨Âé5FHY™JMßYžé!a.OÕš«=¿o…9tº5ùìD¹JÏ$얼̧x./¼Ü6™}c+Ù8 ~¬óÎY1¹ ƒ­µ©IÒ¸¸T©×9†S ·¯CËÊÙQ4øŒ9aXjêÊ!.åÉÞMêŠ9U²áåH: ¾ûá¦ßßÝpy ¼„††ä¶~: H#Ùóˆc£Å¸6¡KÐ+lv½[`äY| í˜z´?MƒÛŠkj/‘©1|gF(è$þ‰€ÎÞŒ‹ÚÍQ³Ø›Žµ 9"<ÛZDs  I µÂ­¾{-ô Sé½cây¨åâŽ2å‡s6”ˆY•*äÖ~¥(Î`Õºrq)U®B‘ê™ðqš‹‘ƒôä. @Å¢«Ã`%“IÄŠxB´Å‹Ç H÷ják‰ìHfÌaÏêGûÅ0˜Šý' O_ZUž ¹ò¥ Qš®&´‚X zyPé´6g*9õ<í*ò¤ìŒ00Ö-,Ò—˜¦žçõ¦+~iˆëêÖNˆr†Ì^RêÚrÙ-Áä~ËÑÚk÷Þ6è²Í„Ž6€ÊØqhàÀÏÅ}}LÄpJA#R©çdXi良¡ Üô„Y"UEµx·„$ªÃæª"‰½e±K‰6œ z7Qª$ø@AÚªì¾Â»¸H—ŒK‰•žŸ;W¹Âž‘dm–YæËÉ º»º(~¨˜‹*aTB€kí#ŠêÖÅ€Šw]Z) n\öŒP{¤ð„ úëKá°qà(k† "Y–ýDQÅbx-¼4=WI¼º/|ܺsKZrärVJ‚‹f)Ž Y)„Ç÷AÞ¹Uf2Í þèò#Sj¡t`¶œãˆÇa’2S ˜®éÀqÔH%ee—'5¦n%½YV¸HÄ@Ä7 Åm°$ðTCUÁżÅÅ%'@øõem“¥³É¿ÁðÅ‹{à+d›¥Ø~¶±§†0‰ `¯š‡Á_Ib.+ÉÐÊ!°¢#Ô›5c¸Y…eþµ_M’å‹ YµŽ |ûB4’BäJ.éÔàaËÚ3á÷l¹L:_¢T®ÖX–¦yð¾Ã EÆ"â¤&‘ ä꺚û˜™¯cfΡQö2¼·¯Ü]Ùëu”¤}ݪå‚$Xxa1Ÿ¢¢,TÚ—×ÝóZš(»ÄK”ên¹+¶ã9±f¼¾¯»<‘œ0¿øÀPøòj~ñ9'-VQÇ–L^qI6ãT’†Q~Tœ÷ÇYÎv ÷èÅ.³\ªÔزŸë‘ÓìæŽÊ¥ýÙÑÁß©b1æQ‘W¤BLæ 1Ùõí)þöSÁ€‰·­Z«°ÐÿÿÇ@X—̘<Ò°Xq%ŽfWÅ*$ý„‚¾ûž;­\f®Dåqž\ìã;¬µg=a¡²]*0xpuí}ψ•`–ø?‹Ùʳc̱’àÿІ ¡E¾¦~]®ê×q¯>Ɖi")L VãØ_óFáɈyª+úB$gÕøF-ËÝþÀ¥u˜ªÌ«u‡·M+‘‚ù{=L<nI |õåKp,ó"»Åa EŽO.[/* @™dŠSy}8ËçùÐb½áB»8:‚ãÁÌÍ$sü}¡XÝ_°ÁÖž&¹‚¯ö“/Æ»©neD>2Êß þðÿo(£M©Â$¢ÿ6üú{´Ù°/LÊbóL“Z0# ÏfsÿêgþÿÃÅWï4,²|2ŒT|ñÙ;ÞšeÿG$ÇÞE$¦sG ª}hÅ }“Òò}í‘»\q#CˆËÖµd:>r Q£ït;þ‹R&ÄNYŒ*÷*\.½pþ êØÍ endstream endobj 871 0 obj << /Length 2675 /Filter /FlateDecode >> stream xÚíYYoä¸~Ÿ_a,Œ°dQÔ9O™L6Á&`q³„ÝRw+ÖÑÐaoçaûÖEµZ–çÈs`Ã"‹E²Šu|EZÝøð£n2ÿ&ÑÚËÂôfW¿ò‰Ún¸ñ÷?¿RÂç£;ãüÃý«»?EÑò½ÌÏÔÍý~¾Ô}~óÉyw4§¡è6®ÖÚÑo6nFÎÛ¼.›²:3”mÃcïM³ Rg4ÕÆ tM•m>ßÿåÕ÷ÓþQ|£ ÈùuIã4ô”YÒûcÒe¡ó³¯ÂJÚeÏß±/rn -óùá{:4ϨF;vÓDiåf0[Ó WWôe^ô·7Ò¡cY½okahOx6²}?îpÕ#÷LŠºJ{*bñkóP6`Й3*¡?ßÈ]ar·mªó&ÕìƱÓvÌùtÜ(øL¶­Ž§]×v=·ób ¡Ý@çмá%ÌnWôý„˜ ­XêþØŽ®”fÎ ŸâÎØ)MÛ¹·q3€I"ŸíC•>TßÙ]OOh:ÐáØ÷c%Kíù;ØÀ$ÞŠ•D¦ž¿†?]Q·ƒ¬õ·?"óÛ‹ÉÝš>ÃÑ ¨~àÔåḤ{Q:ccpèqÅŽ)+³­ 4G”ˆ#@8 |¬À,þÄä'îTù¬Ë#û{ÂÈÞT•ìlv¸ÙÃõ¸ánÕ’\;#Ì;<’ö„ ž™Òî'V¼ÎÚÖ )W!Ä\L±—@^BKëÜgoÆjÀNâ<•("’û¡í &–•‡&MNŒ #{ ”]±ƒ©eÑóŽpct!¹c%[òYÞ✟‰;eC:¸“3Óþ‡ ‰Äó$¢=_ÑÃÝØwwU gy÷hº»þX¯LºÊ<*ð½ ì¼×ÚÞwþ…a‰†Ö:‹4ÜYñ Ô3]Î=›¤°}bßêꯕy=óÁ Ö³~h}Z½eŸéÚŠ »¢| =í ÇÆ™©û¤Átøg¦Ë¢3d)ò ‚bQ8? <c y!ñ·Í¡’™°L[×E““uÒ`Ú RäЕ;™lÈ5IÊ+®hçç¾ú]…|'dZ ¯ô€._pØG5 SDNéž4l’èd‘Ž)˜E.¾­d˺ÈKCÓ`6;o-±üµÂù*Å ï¡8ØÏœSev¬ ²b@… I/Eù »M1 •žP:VazÀáÉ­€§Ç?Ã5†¢&‘•³f<©ÊÿÊvÑT2ŠÜ:SÞÃŽdåõJ©ÿ4@b_£Ä„€¾(–%Aà+/‰Ò›(Ì<bË/‚1ÏÏà ¨>¸¦Ì ;ß-°R,,·a‡Ç™êí%,ø§÷#œY5”§Êª2AFÿù–¹Ol<Ôz©8³—†Ù•J/W:–û+ ,%0i³·t&À]çí éÛhA\ÜC¡Óì„^ÏŠ6ì¿d$ØTÁâ‘<È6ßo$™ïÎX3Òb›¥‘|'ô"ÖãÓGpWÃÄwmƒn€ˆ¢lÙ6l%e­üa´Ô) /IÓ+^¶’åþŠËE'+±¤{N,™EIë1( $qëH6™Gâ·Îl^È2Ìý¨.hJóÙd6ô!eÇP¼½=˜²ÁšDQA›0.Á2†€M;p£øEð‡kBÚ«å%›âš’:5§Õ¼ÜŸe=r 3dJ`0il0|½ú~-WLËC%4&q ,?Í™ú‘Á˜§\nmç1@'.:Œ4l¤^g¼!À!Y8ÿÚ#‰öŸpGaÁ ƒt*}èbI‰¥TzEh‡ºær:UI7 -™‹nov2‘j¶È°À#ÎË·€»€y!UôP®Â} ¡SS™SÖ«p·(› ˜þ%à0bÏë•4˜Õ+¸sì…IìAvm3©bb Pr R•U×¥‰Éó[¦\ÐÍ)Ä©ÄãRÃ4)‚Ê¢£ž.”RTæS]Ç{N…謦„=¥Úq°;›ª†êqÅùNPBìÊ“©zACðÄ<÷_î-“ž ë ÝEFX¢eÒtsÁß4 Éeøg¸¢æˆ)5ÆÄ ?–Sý¬Ò…îD° lKÑ÷v¥.¢¬„ì°´\F "¸»Ù¡¼ØŽ‡y?’OcÇQÖö)¬BÊýïÆÐ}YI\N÷„ŒD—ép ”KX9 ìàuÕ’ù>‚S%aðÀäC«¶âB% ýØ@¹2Èl$ÓÃ7—¯ø&´äjq~± Á7É8@/á¬nò!Ó6ÃØ‘£B4ÚóéËm%ûYÝðçr§.ç_­”¯i3!–¾òÞ/x©ø_“ËUŒv¿ 9t¯< _DryZ…7 ·ÿÕ–Lw/ó×püz“Œƒp¡—bC;Ÿ> ·šòdÌž‰Œ’ÀFùì³µc9ÎNŸc¹ê¹V_‚rfþ²‹%ç@"HU°"0Çq‚2ºÉeY˜Z%¥‚dçó3Àhû Na/×Ú9”]ÏÀœdbõ.íN/@];޼•Ú^µ°Á÷gHF%_4=tI¥¾`/Qê½è–?5p½­*†×x†×Ð{ðJŠèì jÚ)fùcÍéš›Oåpä–½ßÀ¾L¸dî7€æ>¨…K¬å,€¦:yV™D"®dâzñ€Ói$y!ˆNn1‘\à(펣Ƕ˜ô€ëgîÈ2±]&š]#(ã"Ä`¾Â!þÆÎ=?!e²3IBIŒEi8¹4£Á–)‡B¦‚%:(åÖ ‚œ.€"­Äcò}J(tß¼Êìq é!é Aú°Ÿ8€È49.ÎÇÝ™lÓ>’¹HGÆ Ìb®ŒÞjmË$>eË„ ²AsèÜcµÔ®åXB?¤g<”Qù3ÙB[Ïú|hH‘‹ƒŒsAóí SÛ±ýbH¼V9V*;°Zª©òâh*Õ\·‚ v­VÓPÆÆßkÙ¼ûÒÒáeå|¬Oß¼òé’|¥úƒ{¦¯¯•kžxöÄ‹©t Å;æG|4ŠøÉ÷=…†N|ªª¶9üÀ|—]ÑJI eðÃæ²òºš Ê·ª9ñ½– ކ¼Ïn"õǶãÿlÄ\i÷Ü4ò¥¬ZTRš€Þ™—øáú³‡­ŠC8ª^’ìª1Bªš”ÈWŸ•å¢ÀíT¢¼ ÑàRÒp"ß âv¾;[`—Û<2aÇ'“ôŽ=ƒqmaß„&׌ãìg0XêEªæŠ}ááD¸¿¢ÆrÑ뇓¥} †^¢ì;Š˜ù?¦ÿ=ý×âͯ¿ï"¹jQÓ]­öˆÂÈKUr=úÐm‡Ãp·`ZÜüßîvíØ ¼ ú~‹ß!óµ÷Q.Þ…ÿq`²v|þ`lú¿ø—磅ðµ“_â_÷Çá|*˜ß= ’»z÷X›Ûr³x¾˜ n¹«Òçbˆ¯™J”¡sšŸ™|¸ endstream endobj 875 0 obj << /Length 2568 /Filter /FlateDecode >> stream xÚ­koÜÆñ»…Pè­¸|Ó_RÛhj·M Ä*‚¢)¹§cÅÇeɳì|Èoï¼È#Ï”%džÝììîìÌì¼v¨/|øÓ¹‘†¡Ê£ì¢hžù„u· üð×gZÖmaáv¶òåõ³«oãøBû*÷s}q½›“º./þã½Ú›Ã`Ýf†¡>ßl£(ö^”MÕVýàÌPu-Ï}gÚMyGSo¶Aø›ÿ^ÿíÙ_®§óã x"£¸òNµÁlt‘d‘ÒaÄì^ï-°“ÇžÛh@홺AL䵦±=Ogwpq=ØRfž(ºúØ´ŒóÿRkßöLq¸±¨(ìC´«¶´@<‰GÞ}$hQ×ZÔÍÅV³ [*³?㠛̅ •‚fXÆ/eÉR©ÒY0.º„ƒüÄ+½q¦àKÔO~ì›»M ¬2bõÀÌWÀòHí'Pð°z¨V`–‡vtRê½xûê Cæ½a¼ÿÞÏyæuçª_;V=éf¯7Yè™›cMF\jÐ{¨Ï´%¯èra;\šövkFûœ¹¡£ºã šÕò-ªÕÌ 5ž‰·ù‹KLs¯êåwyq€‘‹h@ü=Ò豪<¦Êò§\˜žëè-.¬W›mœbÕÀñ($2ðÿ ¤>€JŽkZfØA‚öÜhuy¤‚p©”>òs2Mœ%׉ül]È$Q™?ÙÜÚ`פ 2•„ÉLJ¤Í EÒ …âÔt)=›|e]ÃÀz§#Ù;w3ÜW2‘d* Ι@G¸ßW£E Š•Q¬§ØQ š9‚Ùh«Â ¢Ì.;š Oø»u|SÖuãEðAw(¯çì/GÛ=;cØÖá¶Ö¥ŽrœìjßõŸ9NUgæ…2ƒprÈ Fü‘`„EòÛ3©‚V5.·ëE|?Qqpæguu7Zg¡gGž­[;  ŠsØôÎtûÖÉâ쎦Ê#XÃ-Ãëɵ O¡±1w–WWm‘¥^5†äÌ"q=§±ˆb" Qv†  ÂìDDÊLÅQü¹~ X{aâ+& ½DE¡äÜ7;PQq¼C@„‘h×+« ›'Àm7ð2VÆJ»3ÇzMf0|Ÿ8µÃ0Àò¾#f¹,G<ÕT·{2 Þ’)ÈÀ´ükJg31…¾jªÚHAŠdˆØuuMÑì~ºgŒeÇA­©t˜-Uõ?Óÿ™Tþü·?B¸b¯ßW½ap[[þC¸à9¯xeZÒÂPÑ •©«_-ÞUµ½dø¤9ݘâζ¥Z£þ®k"WÇÞ]Õ€«¯Þw…gï+!J¾Ž@w`â-ß_½¸\’þ˜ï7#¯³³vø-Ÿ¯1õö¤“¥$Ew¬…‰I7väʶv]È…ÖWlgñ™U_ï)Áf¨é’ “)EÅb€:q‰è²ãX*ë‰SÄÛ÷PƒB8I|í}‹Õ6V::7©ÏˆbY‘ghè):î(КqÑèCÄçðI³>ÔÀ {7hÀÇ>ï'[Ʋr¶:÷Ù‚$ñLÏsâ1ßG:ñ¾ï;'tMQØ^6$µ4UßÓõ#R ¬ŒnegYœ\¯)ót;‹}Ó•O\Q«<Ì—Z¹&M* š¨D‹É s¤§2ÓuÝj•f³ˆ„!9¦|/7 W]ò‡”öŒ´‡Úö¨þ4ñn°ZB4ݯë-ƒö½ëµ=/(mK{!ÈØA.9°F0á³eæ³hˆAøQ9(`þ•ŽÇdã)?Yd Û9X&T”qÀÎ0α]PNÕJkK´ï Aë¥óİÁƒƒ;–’öqxÆ3Ž­P¯kÞRàZ‹‹Š¬7"}F𼇽˜kQa¡˜¶k·Ô7/¢ìIæÏ«9 Šæ€),”ÀЏ½A…2ñV×ÌœDHgk.9p F«Ďƹ$÷aŠZ’\…qºT‹°ƒÑw¢]Žs¥ÎñJ@?¶€*gÒˆyw„ZÉ™›ª“†@O/à8ˆóbD6SÎoŽË¤ù¡lÃpÑ5×A¬°d%Õ€¯Y2Ò ëgä¶Ú­äÌPÿ±Ó!4Ñþôv‰ñ¨§r¡«mK1×?ñ[N|ÉÞn'¿øR²ž}'cNó™1Ó«£m¢¬f~NwXeLe–#GN €¶êV hxŽ ÙÉ¡< ô^¥ªVQýþ;ë•ærƒ«Å£ù—9oo»­»ÿÅ'eì—Fž,³WP*U)è)Ëdœ•ˆ‰çÞÓ[“&Nõ¤Ÿ’CÒË•"b ÿ<öØ âªìô÷¼6ÓÙk³ï9÷ôÌIJñtò¦És¥ƒ3&g1íT‹Fbd¾é&µ‹FÉ×1j–Oxb/ÞH³³<…¬¶êe Kêx4÷¸`EÃÛwàS<×p— c¦¹õóÏÝšEA!èØ t4ó xôreº[Sœj:JJh{^%íƒðÔ>@°jÇU27¯Ä0¬Rßì¸s„e€Ä®xp?;Üôý±±+±êÄ}š]bøÍ Úß28€N“†‡#ï€ÁÎ^);9ÂVÓXYßó/d“æp‡Mб·ð¸ïÇݳ%Á¶Áj@d9'”oz徨ô¥ dުѾ×ZJV¨ÃŽ1S”ä•Í¢y$=Ž|tfeÛ$ ¹é„SëóÎßv‹”ß­úd«Lg+͈Çn`&±™÷‰ÓRx%g‰­{°9•’—,u”ŒýRÿª¤qƹÊÁhÎÓv9¾LÝøV%[Ôá踖é¦|aúówlÿU^®’8θlöœÛè}²\;klÒ“ò´—¼TJ}*åØÉ^úàç wÞ¿û<Ææ»¿DÀu:_.⣌ˆÿŸÁÿê¶§°ûhó¦Ó£cøÍ©ôš˜þŽ»7K˜ƒdRïƒß~äÒ½O°Lc-€{ò&:ª%iFÏöý7Àb6L©W6;—;k܃ßWšÙ‡ª(ÔcSÝñ#Óþé~¸þn·°>õZ1†<éMHIº:PбV(¦ƒ¤E–Êw†©D~‹ª–<8…ärÄ#a¤Âdz÷_~3~kÀz.å,ÎQnjYà4C é)Œê˜^cËGá§Z¶ÔVúÄ%ÈW¬ç _!´ìÓÎògŒÒTú<ØžMR•œ>lwON|šŽÍ­t¬ÿÕ½ei Ëg!lZǯ«È{=u²Ç´!ÊØ™^>¤FR–Œ6>kŒÒÇcƒtí‹öž¯IºÕ~ â$ü²<³Ý}ÍŒ_ÿ¬øö„ endstream endobj 881 0 obj << /Length 2263 /Filter /FlateDecode >> stream xÚ­koã¸ñûþ £(X)’¨ç}ém÷rÛv=$®ÅîÇH´­F–\QJ6ýÐßÞyÉ‘ù6mƒæÌœ’óT‚…Á"÷©R^e‹bûÊ'j·^0pùîU ë\XèNVþñúÕùq¼|/÷ó`q½š²º.Ÿ·½ëM·t•RŽúnéFQì¼)·USÙ¾Ó}Õ6<÷Q7Ë0s]/ÝP…†Áò—뿼º¸ÞËÃð™Šâʧš&SMƒ ó²E’E^ "VöÒlÛ»ªY/aì캪)ª*„请ÝM¿îÏkÝ÷æ{ú=ó<¯lƒz‚\7P^?‡Õ¦µO0 þW.OÔ™åÔ]o…˼ÏÞuJà?´e­¾û÷ïqþØPpq/â ÐÄZþ¾Ì”Óh%ʱ›v¨K„#§iÑ8îÙhDîðÇ0Eóp¤¶»_% œ›¡ç)³Ýõ8û€dòjSYÙYê^ßhk¼¥›¦±óaéŽéϬhb„˰ã±ßˆàn ƒ7ƒ·àØ\txÛ½m×£|¤ŽíÍ!åܰj#ÔˆTê\£¤}ñƒ¨³ýã†*ËcßòXš¢*e ùŒš‡FoebÕv <Ðm ‚ÑãË] u= m»‡ A¢.áë®ÖUcJAkkî7¦3Œ~ñcßsìÏa¨¼ÄOq{A’O{1Ìy~?AHÎ}H™zù¸ß0˜‰IÇbHñ+SpðAý"O1ðù’maÝÈa~zô;D?iˆ^ë_ЈTàìôZ©²ãóEiäùêàx§C–,þÆYŽXÒQàvÑæfƒDc B2R2I•1ç©I‚suhOa(O  È ïõ­xRÁ`R1À~øtÅ@Ùnáåyƒ˜PéöˆG§ ‘@èU/ä–ñaÆŒ2„mÁ^Eó#E¡›¯z»«Íë¹XS­`ŸN-ÚO`çZ7Õ¿Æóƒ5VbÑQ*È=€1;價ȕ$ž—ÅtàMWR5£ë–N…¿©SÊ’Òh^D‡g…æõñ½ÌOG{óñ§Þ_/ß}[m™5…(”%O¤v%ö„^D~<¹º$vÞ›îF^¥µLãCùÎÏø0æŒbL:E 6úü3ä™:80æ3$ûÌ£’ýq€H6Ç«¬äå¬èùB89 CÏÏŽœ ¾d—P°,9PˆÃA¾:Hr”-ç]Ž~l¼oÊr6ÃN¶ÈÎÏÜù¢úíÐu†²Y¿Ïeaàõa°3ˆ›#д<îºvG~`º¾äUÖ²‹¼AÉÄûªß0$2ª‘ß5>n˜Ho†Àjè‡Îˆ*è‘HÜjɪˆˆ9ŸÎÑ…Zk«›š¸Fä¥8Rú³}ñÒ¬ôP÷Œbî=å]Äwp0©CJÞ©±êd–¥Ô¥«ë¡c”#QÕ¶ªuGçÌœ ] §ÍD³lÚnKÅÄ̳n4ݰïà³0©í7ºg¨’·.™²bE|Gp¹ò„P´3¢¯!ÖÛ~ä$¾@ ë0?pÂëN q¿5Ý]U˜ß*ŽIuÔS?DaD–û„‹ÍàŒæÉP‘”AêltÉH»âq°¤2ž¾ d¢ë gÆX2d$W†Ð¾v Ç€ÅÓC÷x3Ïd9¶A¢,þ9™ÂÃãø.‘ÆuÛã¾t*ŒvÊ—ª f&ïè–jO+ljIL·‚Vû دsaOùÊ‹ò}6’6èòâ͇³¡<óÒ0WŸ1ã`”žÊ£…Ê/ɳÿº÷»sEÓ‘Òìó'Ì$"_ØLˆ¬dš®ß]aч4.úŠž4©A–{iª*S^¥ß¨úÆÕîdùÌ Ž™îë>ûÎt¤æ4©Uýl"sS€Qèÿ•ˈ Öp*Ç=MT'ºê ƒï+ó/ÁñE3â§}kš&[£4å^TÛæ¬ç™²‚&.) o€ ÅPžëº‡w½á馕uÛ³zíêΊ¸©0Ñ£g©r~Þ +!z±_czEŠFR)ûI|’÷&Á"N­ÑÍPÁ± Œ³±äŠ¥È ÛX‰Þ@‰N!ð®jûØßšo\N52l×5æ|¤ ËDÈ®œ®™¶2÷Œß-c(©ëÁÈâj6–Š‹ªiß™ö^¡@;b9õgIoÔû(iH€Œ½6õ. ?Eô Üoª1ãšGµ^¤P,çuìRQ E{z¸æ„÷ÑÒìЋ¢šžâ3âh ÅN9ëa\èɆ[óÀÀé,µSˆø<`l÷¿úf8½7ŸZ?£îEÿ°3¼\Ɖ[ôÖÝluáÚÜ<™ò Â׌ÙI-®tÝ?‰aOïÏGQ©ÅêÂÃ55±K7ÍCj”À/wh*$hM1t•|¥ –ˆø k&„-O> stream xÚ½XÝSÛFç¯ðCg"Ï !é$[â!B\ÈwÜNšÒ™Òa_‘%W’ îCÿöîÞ®Œd Z¦ÀÌÝí®ö~·_·‡7pá×Äî`,„Ñ Y칆ZÎ4ùx²ç±œ ‚vKòùtïàÇ0x®»±7˜^¶UMÓÁoÖñ\.kUm!„%‡v„ÖQºÐ¹®êRֺȉ÷VæC?²V2Ú¾ðaêûÃß§¯ö&ÓÍþ¡ïÿG (¹‹tÔFêy‘ FQàx" °ÈêY&ëZþýÃt„V5ו¤©ÍãäÓÑÛo&Îû'D˜U}°:sÔ\,3å匿™Ð˜ªJàaœí Ç i¿£4Õ9‹.K'z‰ÇÇå—^­ÏZ›?q§£Ó{$¥i‘«>ÅëÛõ(moä‚ý?FÂ*ÀÅ¡°ÔÍ|YEY¡ž+š\¡ëÕe÷‘!«d¦®h”yTZœ‘cpº”¥\( ²0°¾0¶Ž³ý0tbŒʶ¯Ôºê;ƒ1Ü“¦dÀ_u–ñ¦`Y]Ó¦;'!ä¹±£-ÜÐñ½qל’âþ²(F½šŸÆR%Å,ש”$.Pýšxh‚¹v0¥몟T$³ª+aeuAŒ6fÑXèó¡gð±×pZîpz­‰™Óqóý™“òHfHõ„aûKd¡mlK"wë2ÂÑVÂ$I±Êk‚¡ŸÊåE¦ÒÞ ;^•¥j>¸BgãäZ••©f¸pi8wC×½qaðœžüÝ|{—xÜI½^ªÛ²b'‰]Í¥g_¥m-ž»OKot« ]6þ<Ÿœ¼|G_œ¾„?š¿žüjØýèÊa³ÍíîÛ¸@Ÿ!?4åéð1ðQÉlq¸I,êᲨþ)=Šæ7éõûŸO?¿ËôçW×ã¼xëúå§Ó_¢ÙŸ}ê͉'ï^ü‹9zy&³zXïÁz]ò-¥6æ‹nºWŠÓyµÜNx€³O´JœuSlR ‡‹Q±‚²P/WMm*:J„QB¬Ûšäs× à|}e£ï~øþÂq×·±$T¥‘u½qÏÝüô)«ª<ÈŠDfªN*SUypš{bª­ý;¼4Eûù‘oåꦦYVÌtbú(¸U­–DÆR„#ZǤT²V$%‰Ôºßq w MªbÁ»ÀeP‚«ý4³ž5º ¼KJ¡í2Í­Ñb³¦¥¬ª¯C —6„CÊ!@_tlaÂ#v­™ :˜H¦:A}"Ì:)±×[µéSî’ºÖ¬‚"&G+˜Ò öâÖègª¼Ö aý9:3Ǭ/Ëb±¥çõ‹ã}™§}ùo¶±­‚ó1N¶¡"ñ²„ „4=aLç3¦ŽZÀÄ”‚ÆY£\2]ƒý4[gkãòx¯q  ±¥ɘô°©¾ol` /âS /†ÊA´¸éHôM¸«bûaù:÷i|ãÂC%7yìºVE¯I(sˆy/¦€SRF¦}qݦ €P ;.s|ü`ì|%ÁFŒ+Ì4«˜Kfɾ 'ˆ‚&¼ïK„ vÜxÜHbVYJª©gCyCqŒlÝ5e*ky!+õ˜¯´ûƒtÓ=äUÆ2¤hç]ó¿¿Âð_Jÿ_ óï endstream endobj 893 0 obj << /Length 1959 /Filter /FlateDecode >> stream xÚÅkoÛFò{~…€; TQ|? ¨cû'Nš‹”C‹´À­É•µgŠT¸K'ê‡ûíÙêeºn›M‚pwvvÞ¯•?òà¯?ʽQ†ne£bõ̳ÐövD‹÷—Ï|Æ›âdóÅüÙô_q<ò=7÷r4_쓚—£ÎÙR¬lÇ“0 ðd<‰¢Ø9-WªVڴ¨¦¦³7¢™Ó‰j< –A8þeþêÙÅ|Ë?‚?((b>”4Ù—4€uÆ£$‹\?ŒHÜ×r3†Ë±ãÑçg/ö¼/||¥E±›ùÙh⇮Ó ³YKBRq2)Œž,W¢˜è¥ð'y²OËžÓÖÏvT\êFqÈt}"<Á?/..¯ÞÒÙË+øGë×?Ùc{Ý;¼J H'=ŸûGäCAw­ª µSÒjÞ`ø^ŠjÅH?ž¾yw}áþðþ²G 7ôõ•H õÖ´§Wá­iÊkñŸóÇ¿.‹—q¶XÜyw³Ø\ž¾I¯®ïß|7ÄÊ*}ñöü ‹ Ús&*ó@H«”;¤½ÐúsÓ–tcÑ4¿çªÿ ý}%Œ‘'ÿÿ'¢§"g?qƒ(¡K?³Ði:ŒÿÜÑ˦«€YyNÝ`*|¦ƒȇ̑tÒJQnni#Zà%£½>?{N ÏKUŒƒÔYÒViB_Ö•Pµ,\˜ –_ “—EŸ¤¹!-åq^BÒÇ ¬—ù6-ÝÀ®—Ã~`óór\QöîW”¼¸(rB7¢ÅÇšAÕ·´-•^ªò—ç´]‹[I«‡E%H}7îkðxa鱟ú˜¨•ÓŒuI‹[ihaÈOwèyi4£ñ÷À]°m¥¨¨Fù$J#àüeÇô÷ŸPô˜ÍqÑ‹SÚ„ÓÛO›tßlýOnì;¢:ö[èøýæ¡à hž¸yø”Ûy²ÃòÚ!É­Ó\Jé#7Œ’€RÚgšAæz1W q8{ñ˜Æ}<•¬:9XŸæ¼ÏáÙL·ú±Z¬˜Œ7T,‡ö,uã4€p :#M7\UÃÜ ’°ÇSä†YØŠÅPU»¢Z/: #êS0­fð,8·ýÚ…‘ÔpÏ^rwÚÙðñÀxÞñHÉ…è*ƒîóS,¯¾­G¶Ðú!3ÔtÆ|‰,þ;d?‰¬À¬òÔH[ŒÃÆü†ˆjJBâÏÕÝ–°ÅTéú2ÕgÊɬ+N7Ü7ôÍ2ºyê 2m€Yü£ÉyP—Ðõ¶¾›JSLY¸Am`‰âh«}Ìon1~Ÿ"° ^ã÷½Ôkõ8h8¼W‚Wï›hµ õÆ–Ñ®¥<¬lzÁ¼FÝ­·”É)à¹RÚJÁÁG˜¯¡+9 MãòVÚvÚ—¶®âb°†Päh¤^ÿÃÍãÍúA?B¢kÑÂ0`d/šዦªè÷=X›9rû z2þÊúd{ῃ«_S±ü?_²þOîߪ›Á+ endstream endobj 897 0 obj << /Length 1622 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_á"•,êÅ– ¨»¸m†´Íbí° (#Ñ6YÔD*Yöa¿}G¥ØŽœ¤[ òx¼òî¹£Iχ?Òû½Qzã(饛#ßP«UoŽˆåsÑÝâ|µ8¼Žãñ½±?&½År[Ô"ëýì|¿¦¥bUß ÃÐ '}7ŠbgšmxÁ¥ª¨â¢Àµw´è‰SÓ¼ïaà êÿºøáh¶hõÇAðLC5çCK‡Û–’xIo˜D #4ö lb/V};Ú4ý==¿N¾\³êŠUBê¬ôW¼´á¦Ý¼Íø2^£Q©+“N ®8ÍùŸm¾y¹8›H¼GØ3Q°ç'¹µ 1è @Œ< ö(,pÍõ…¶b4 Åˆç{ѱ†„§E=éŠ!ƒ›8Žž2§:ébâÜé`µžøÎšêR Âi>“@À(Âl¥H˨¢WTÚ“SðåÅÞHŠ.j‰d :'âxÛ â¤Ôn-„6å'4ý½æëÀ›|<ÕB®Mv)‰AoŒ$XŠ<zåVþãÀÛ±!oÿØ€‰{¥ßmaÐ “)k!•¹«¦"@e7Ö“‘G²wõ|#Š—{8,¬³B5娤RÞŠÊæáRXòçÒŽ']­Á>פ+(§µZ+¾a•áp;¯+{',µIbK¨O&™ø6gß»äÍŠÌŠ‹€åqqñ$‡Òæ–¬ÒÂFÀt]]©•l£Ù|ÍlŦLñÐM•tךºrM‰;Þg+I%ç‚ßçÈ•Áð $¶Ý Ô‚ý¦å+YµÌéJ‚]$Ö×ôáâãôâdv‚kç>N_Ípz1{?ûx?=}º8žm) (ìH‹'ÁÆv²‹¦´‰Z•µÂÔ\ö¡ªŠ NæM=Ù.rÔÖÈ:M¡\Ö9’±§0­Œ0e0m÷‹«¨s+*GqÝ”R„‡IgOÑ“»ˆü–ÚŽ”„¤¹AÅš.Õ8³…кî ÷¤ÞÏÇeç•Ðn·øßêü7Š: Í¢ºkµLçîÅìǧ÷X¾=ƒ¢Ø.0=ÌÏ÷Ø‘¼£*]·¦¦9‡fÇLݕ̞Sb“jEy!ízÝvð-ìnyÒá·ôÆrǤãò¿Ò•ÌY‘µŽv)l^ûúvõ˜i õ@·„OñãMÇ5Ïm:~ê'¡©òQBœi6îpbºl=0ÝB”α{sŒ¤’VtÃLÍÓSsÔzÐb†žÐ"Û¦Za¿+V0xÝ[QY»ªW+@þ|ËðTn Æ`Ø2m¹¶0®éš•çµù9A« “ÖTáÈ<È€ƒ–eζ^è!†ät¯³¶ëùñ4€ÐzIJ@Ýڼˀ€¯ºJ‚4»O?©ô6è=‘˵]©;j|`yÁŒµÄæ5TéF†œ©KÅsiÌ·áV/g¿·kVà¨yÒ»bM³^GwH¨às ‡ï…dܼÛ6”çžm=Q­ºÂnL¼a7;Ž­5øà2~G„xãxÿ†·.L—‰Z¶O7µ†è°µÅ›ùý §l·ÅD-yþ?ë/µ—f‹1è:×îγ»aÔ¿‰ý j'. endstream endobj 903 0 obj << /Length 3379 /Filter /FlateDecode >> stream xÚµksÛ¸ñ{~…¦Ó™Ê3Žxð•Ou^×ô’Kj«Íur™)MÂk‰Ô‘TœôC{÷EŠ’ÇirãX, `ßžð§gi0‹­U©KfùæA@ÐæjƳhÁ[âb„ùxùà‡ça8ÓJƒTÏ–—cRËbönþd•m;ßœ,¬µsûèdá\8?-6eU¶]“ue]ñØ«¬:1É|—­OÆhšðäýò¯ž-‡õCcîÉ(bÞæ4sªu¢’Y”8¥­cfOwݪ+7Ø´QΟ7å çO}Î møèG.z:î™ °È+¬½ÐVéÉ=« ¡æã.jæQ`ÙÏQÓLîÜ7|ƒÔbÀZÕm÷Ã&+×ÊÌ6ÛµWusÅ®ý'n¾µ‹ü"_´«L/® †þ„Žà¿žZeYæ×¾Ár&º)êo›ºóyçeøBøÈ|kÂh‘wíbµÉ„Fh$·Ø¹ÍÍå:»jâÕ¼>{{zöôÙS{söú—§_>ÛÓt¡M“8ýìFÿµ^g]çý÷8~,Ɉœ€ÈÀzð…ŸUÙ¢pó¼®òõ®ðØÓóz×0ø…8[_/ºUSï®V2|É£­ïº²ºâÎn˃w+ß|s§žÌ}S·ŒÒøl½‘Yí@à˜Y• ·Í_t þp³ í@öÝá–Û•0lâh¾.¯‘SèéùúúUÖq«®-ž× 6u#ÛÎo[¼éóÅCä5žgUÁÐòRkþ‰Äs™ì«N*»’î'ªw²ºàþbw%¤„¡ 4wNÜ&b¬çÛ¬Ëq_+àÊ&šøG8n ¿kŸµÔ4p¦[$ (2VÊ@ÖÊ!ÙÔk¿Ác“ù_<Ñ¿úþbÕSï¯:»–É]W5âÜÈ"—üý„0Ü:v®jYºcñÐeÖL¨Ã ÏZl3EL°ãXÆX’›ëÛN±½=?Ñ|ÓþØ¢­QàgadU²ª*„1À@iCæõ2¶³ýüňÀ„W8^FìY¾7ÿ0ÎÛx÷oAgtA ^Pûþ!ö$;4AïÅÆ1”9ØËç=DýΉçŠíE ˜NY² LÑÄÊZ‘K«BœÈÌŸÔÕ¯vW»F$üÀÏçܸd1 ç?=}2eŠPR8zñ©¯²k¦¡-h*&¶ºß2¶óa±ÞÃ!kßr§fë56 ùkvU5,ÀF†qr²e/M,h2©Ds#ÅÀŽ4²¢Ql};¥¶$´ ø½%S‡Ø8;R­†X/€¬/Êz×¢6‚]|q)PZ Ðno€ûjQ3°êunÚ ‹ïÑbx4·Ðoºµ–;s1µ/2Ø(³::8Á›²?ï®ù„ Mv뚥ýš»ätÏ à•,¹î8hê ·@·^TŒ\7œî…Ƙ^TÓÑ q啲nÂæŒÖ%SŸîm—‰p[^ ?ðO‹Ä:6ˆà(A7A82‰·€­ç'‰¿“ˆA#² l®G=¿^ß3p¿S—EG ¦'ã«%4þCn[7e·â_4Úl#­jh‘瀯°ÑpïØŸˆÄƒŒs !…Ì×TzòNÐ)“üÅž¤˜zr(Õž£‰Mmwë2G×n! úP¶%x1î𡜣‚ø·;ö›Ø‹x#€ð/±F‡sìTÁz´Î8úœ0]‘íÿÄ$iCð,Ø8ˆp×ÚI¨DëBòÙ/§¯Þ¼|¦^Ÿý8¹¶QišëËN/vÝ.Y¤œÚÉÏ3<â &¹¡IJ€Á~A°OÈ Æèn+Ì\p—¦lôEŠ ÅRC¥k+4Ä"J¯?hÖ\*¨ŠØI:8¤Ù2sУõpJBF"%f…™Ì"X{°ÕÉŒ~ËÐÛ–ÖŽ] àï8¾*²Ž)9Ùœíí54ØÄ¢ê°—`·CQÌp0#o >Ãv‰Æ¢ïܬÒìh¯úÌ59 +zhu¯‡€²àÏ“¬õÜ:÷U[våˆ-id'B@—͟AsÚϹêXE}FÉö8<´äÒáN5+bËÞ"c‚ôSj…):ºödþvU®e˜âV-Š_È«ëêŠ4_Bî‚G9ÈÇ–¸þ^ùn[þž«À"MèðÄÀ oeS< ,nF4uy½[ Bîæ«LYÚ‚!’õ‚õ–¥†Ö†¡OKƒù…L¦¥³póózãGÐIŒ™Ð0jt· œ7½~ⳃ²sš@¹4jÚ†‡j›ò£/ö“‘-€¦TŒÏŽpLâ-!¬éÞÆËC°S\ùÔ†H•\ANç›™ÅÙ6l”`šò³-¨Ø#R0\âl4-¥ 25¿Ë_–‹Á>S¸´sˆùü”•¶a¢ õî-ï¦%T±‰{ŒWÿ<{vúòÕ- Ù苤’ãá‘…3‰Jãéþ2W¼A;މ:­Œ³÷ß$ª}Ê5Aͤ*°æ+ŽìÓÙg‹”Ñw“Já~†Ce““¢]Ö%Xr )$‡øa‹‚¬ÉrðÜBô‚XPñ‚´´¯ùPضµ²Öp¾ÉzÛ$ó“~þâP|ò¾âý 1ŸPäÁ^î:Îå†@rä'‡˜u4£8šb+ Fy?~#è=ÃþãÎãБcθ2kqöuµ8=ò‚ /Æ6PÏïë ûß×8çÉ5s47TÔÚ{ZI©èvÐçCšÄB_ö¬LiŸ7å£L—Žæ [’#2;ºmÌ¢»ºñ’õ¶£”šoÓ¨³ ™Ó?¸wvÆÃïΞãO&Í{ñÔßs"¶™Ì°úÊM7QîщÅe½±n¡¡Ê7ªQb¸Ì½zÓÔ]­ú ¨,—/™Ì“uÖ åÑn ÷¦)ëô¼j7‹¡¦/¯V½!Ø›“±ì,O`°¹åVÈLÒLE$…«Ã”ÉîCÂ[YÒ^г5WU‰­v2%Iã[KC¿í‹CAª¬v3£ÁÎF«=ïÞ³gåâÙ anfV™­úzvþào“%!¸:%pr&å96ï`Ê-‚ÕÕÉý]™b»hB«R¬+¢Ñ¯Ó•Õä¦1$Ç´¢A¶±ãK :¦NÍ8¥]xÇ©*¸IÀ¡ñ·šÍG:R”õu´]±ä+Q:1_ãX§2E˜»ÂÄ€›ÿ{KŒ }¸·.ŸÞ[H5¯ \ˆÚ63åŽêHê­V©µßc“àÔT¥G›\·jbÕP+kÓï²j*ð ¿ËÑ‚}Ž£Ú±¯mEe°^>ØEkÈçuSpˆŒH59v«¬§ Ä]áQü2ÎTÐ…:®ÞŠua³ZßqŸ@V%{¨æ~ÃÉjX,± (X%£¿U!¡é Ìùà¨hϯþ~¾äÖÁQ”üz†1V á_‚ćØ8r4ëL Ių#|ÎÈãWêÔHн|ò«>’5YÕ/?TúÌmÀu&Ñ]—‘ €oÁœo»Œ$V6‰‰TëoóT™½˜÷—›ç˰ft]†sÁüíŠòp£%št¸Z…ÚÞq:nÃqø|Åáèû•ä¦,«S±¾Ë²ºâ‰$ù.û‹-èŽ;ÜßïPpð0Ò*C$X|(J¦½t'U#vÊÜÙ&ãLl²–¬lpw QV0T|I‘­¼®ªþýûx‘5V?ˆçJ"XêE‰xôÃèû*϶ín-µE8x~:)1 Ó2CBƒDVÅÀõ·A¢AâB"Þé]ĺA~EÃ@+ ¶ÿ`ÑÿÛêÀIF´âÑK˜˜Ÿ4éÍOÌ€¥þäs¬:8/Èœ.W%rœ"è¶O©F¤ñq¶ cX¤ßUe>¤›Ç/íT«w¡<À¹PsƉ,‡õ[n“@âh+i(ý:€”·”½ÀáÖ")&N[¾w¥á/‰úœ àáÞNÉø‡ ’r»!ß?x|æ1°G˺ÃZÆžôìÎJD/ͨd[ô Ôê ýîyZ¾|ÈvÊùéå!’~:Èúá²k”úÇsŠ”‚TÊkÁAÚOýy)Xˀ硶ƒYY#7>“_RØÜÂÓK´)•Mþˆi_h³ÃBË`#ÿ õ8 endstream endobj 909 0 obj << /Length 2752 /Filter /FlateDecode >> stream xÚ½YYsÜ6~÷¯˜Ú—åTi¸¼Ý'Y¶'¾VR²[•¤²ÐšA™ÇAÊÖ¿ß¾ÀáŒèÄ~Ø-U‰@£Ñh4º¿n`ÂU᪠VyûeR¬¶Í³€¨ýnÅë·ÆÍŒóùí³¿½JÓUøeP†«Ûû¹¨Ûjõ‹wµW‡A÷ëMÇ^ü÷õ&IRï²jLkìЫÁt-½Uí:*¼QÕëMGÐŒ²õo·?<{y;­ŸFÑW*Šœ¢i$0š¬²"ñÃ8au/-hSdÞ”(<ÒzׯPµ+îDAqkØkn|XG¹×õ÷x þ¿;c÷ÝXWÜ–‘3Aë4óT=JWYkv­–)C‡ö€mdómÄqàge Û¦ üExN¶šúy”;ŽkRÉ©ÖÙE©¥_„Å -ý2.Ç }<îøW›$ý0‚Óc?L™ñ5Y<¢Õh®8“O›7x÷Äp@¼‡}×›Á-³~ Ò (àè³r9(ûh‡ÊŸF‰ç²jì§~¼Þ¤Yä½\oBï³j59O½ ~ïÇWܯ;øFÞÖù&L{ßõ ,‹…¹Ÿ9ºÝk«ÑÑ OõÒxñÞv}e±“{ Uøøóãɱ¿ªn^Þ¼xå_½ëóäד÷JXÉ<ŸÈ™cAœÕýŸ¿½ C ätBqŽjúÊV÷þ¶kØøª¥£‰p,šÆ|ŽäŽº7Ú2ƒEÓîס'n“nÊÀîwÒC7‰=_ò× Lz;Èú–¿’9ºÄ‚Ú@Àd%p·e¸¥½a÷ÉÁ}ŠÄåÿ…mmv{rIËŽEG†“ÚN-ËIÀDu>alÊyúKA~zf~ˆküþŽOÃÿ}¬þüD£ ð^¿¡ax7×?Ã>²(õðÚã§(ø{b3É"ß¾Rø¥•¢/¬ôd¡aûÿÚÒW®ôÍ[ZX©~º\˜&ü6ö Ë}íîαqÃ~yŽ ããÆ(ÞŽ=Ä1„Lâ‚Û®µ¦Òœ³íWà åÒ8`ì‹AB¥²„åÑS€V))bïB¦&éÕrl­U5SÜÌVSt'Ô‡e† DˆXŽÕo¸ÛL%H±<Œ}ëô¹c¸ 6â©çoU;aÄ Î ýhæø¬C®2dæÕØ÷š!èB¹Ñ«íªsÓB˜z×//ß¼eZ¿”¦°Ñ¨Ã-Ó™3ŽV¤í;;´ªÑ'ã˜Ó*9NÅRΞÔ=î Cκvèz² aºíÍ-ƒ‰µÁÍåÞ¶E[·8q6P[MûÆù˜k‘s-w©”ÁnÁÛêú‘%+þÔì&[¬±n‰P¿ã9جaMrâ©:88—¡‹ˆÓ%®¡…¦j°I¶*BIßÐxkÔå®–YdD “W!Á&ÆL%,o¥»gW(tÔmðÑòÌbpGÇ¡sçÅ<-yŽmÑÝãy$1Ú—Œ‹)¬™d©§‡-›a“gnœ+E¶K^h¼ HÝ»ºH‡¾“øÜv5³×¦1ƒå¶ì)ç=Å…È,A¦Š¥ú˜hÝÒŽ& €š4;›tÈö}'ì“‹<+´9d0}&èæz†¡÷3÷Ž5t*Þ––.E46èˆöªÝ‘(D ¨mh3Ùü ™ã¿|‡y\ RûmˆQPûÀy€wGe+áØ"S†=û1¶­j¤å<ÑÔf Â‹YÕÀ-UCÁX‰LýÙX¡£‚Q)7 $@rhº–ÛGôÁÚ ¿£5€- '5D;B+¬Ž¸‚Ê¢”)`PÄë +  L+PzçÞÍ÷ïzóÛtìz˜ ˜gnP¢£Þ8p,ï@"]9çå<Ž˜R‹°Onã°€‰óŠ£wtH2 tŸ[“ÃæÎa{ðÔ4,?"ñâÈI󉓋Aç^«a„~/ƒ´_ˆ!ÊjŸöÆA‘âO}ôÇ™.ª•$†‡””Ú§ËÌùéžNÓ}Ÿò¶6GÇŠÛ]jaLPc*–ù¦w€¼:Uýój Ò¸þñ‰\ b¶)6È–S K’EîzWøi¹ò%ãâ…‘ ‹‘ Ë–£¸qûææKEK ×ÔR|½(/½ð–½ÁvÁUÐîFSÜDÿàA;‹{ ¡ïÞý‹^0• h@àXµÓ"S>M%˰i†#Úé–G޶—Ùx7{Š5¬;¦„0À*…S‰‚Äs¹‹%Œ¼…ý©Å ®,L[Œd¬Â· SKVDt6qt‘qõA´èÚÖc<Ødyæ]òÀýX׋éÀØí(®‘){tHÜAƒâ£'ØRQȈ£N ¦aÁp&‹J=»í“Mpªî5f’(âyØa ¼¼w$ÓhÕŠèI)@ÕÍÒnèMclÍô¨²Yã4œâd7{àH¹v§xTLzjûèrvèYirää4€- ^ÄÓù ï]-öá»x¾`ÆûiP2G×/yÕ5œeœåT¯_ûW.çÑX£;Û0i äâ@»›M£Ã …;„ðU#Ø” #U*îucuͧkOgp|eùYõ²T;Mo X;¿B+PÍ G_éœÚr‡¼/r•4ÎË[ªZñ¶q£õùkeÅ~”F«²œ^,ÁÆ«nbð/Œèéò”2Ãtó73 ï˜çËðaq°±ÒÏý¿ÜÜbñqy¾å˜ò  ;Ý¢X˜[oXö· îƒÚ bGñ“WÛ°€ûfR®à’î‡aö'/·Ž{3c_z½=Jº-_wK'ð䛡QŽÞa0T(ä‰7Ž ƒ€2c£¿âÆ{Œ$'„Óª¼î±#Âjµ vp”. ˜íOCY(º‘G·ˆ´Bu„íJß«±èڳР}Uj'/Hå ×ÐÕRP5•ÄVx&kN¾²{)\ðü“é5{«d€mVSš‚)÷=½ìy² ’[½ë3~0Ì`•ÌïÓ ¾±mð 7zÏ.ÏõR¥-çNãÂ+5¨;e¥GŒÏ¢îN›p©Œß†ü¢éúGîìɾ… X5ót £v#”3ð—𘠣}D »˜`Ÿ†y§äß/¿kFOª®éQ–Ÿ$£#ç º!2=ŸŽ%Ž—Ød>Šô¢°Å}C)¼æ§|ä[yâ•b?âjÊÎŽ¶‹LCÞ@‹aw_y'Ái »7Ϧ·ßÌ­ºl$|vÂÍ€ÕnYÿìÌ ™¬”ñ#8ìÃÕò1þwjaSüAµ7°«–O VÃP¡;„§H‚Âv·ÿvŽ—±³¥ŸzßhGY9÷ÊrIñdïŽãFò †ƒ¢â1ãÛ j©„­6½ÿ,¾9Ê…ÁôcÏ kü¡eºb@Ã,q|•Õû?ûyºu·3‹¿†@ažÅÙ$.MN/ïè_Çû"ì~€šï3›äeqê6RÐpA‡_vîtº£ääЯÍ]O3TA¥Oœ$uxÅmŠ©”_œP¬‘«Uå¨1Üôá& òËß HP-ƒR©%ÑX›»éͳæ£ endstream endobj 916 0 obj << /Length 2240 /Filter /FlateDecode >> stream xÚåkoã6òûþ 8 ò!RD½à€f“ì£MwƒÄm÷°-.ŠLÛºèU‘ڽ܇þöÎpHYv”M‚C?Ä£ápf8o’Í\øc³Ôžï¤A2Ë«W®ÂvëWo_1Mg¡=¢|½xuô& gÌuR7e³ÅjÌj±œ}¶N7Y+y7·}ß·ü㹡u²¬Šº²ËdÑÔ´öcVϽÄê³rn{¾ Ï[|ÿê|1È="åÓšFIà0? MËŒô C«íP"±r.‡€Œ˜%7… eó[w¨2/ïé»n$þD–à]Ñôbày[òŠ>n{žg½à„‘ ª¹+ªØ2J5+âº,æÌúÕeþÜf°ÈÕ-X9~‘ZR ýÀ6óÒ);þ{_t| ¬Ó$á=Áý€FAxL€SJM»%'PT¨ø‹Y¥Žõ=ëÍ<ñ­FïWGB / ­%šÒ ¬ÅÅ5­t\ôß'•Nm‘o…6µ@»U_ÑÁ¾n8F’çÃyÀjMO-Yº[5]E˜L‘D ,0Ú²—­#ÖQ D¿º¡Û‹¢^k2¶™_‘¸é–@ÁhqÕ”eƒ²Õš±ÆÄ¸/#”òRl¼D8ô rêd«F§n÷ «/EÎ Yèü¡Âå¬â„‡±£8³"ö‘ê€ø§rX+ˆb+Gã( ©!Ä‚ußqB(ö`À2«§™«è=B×µnPäX4Î1úŽp"%K@ mŠ¥¦ÜÉÆÀuÒ„ZhC¿5ײèS% *Ž 8Rš0ãÝEw<£=è2e ÛsÇwÓ]S/ù@š˜30ädb2·£ÌÉ ÁœÄHÂ’Z‰²bÍsŒ&Atr“i²t†´NçXû·úÜ]¨‡¹½ÎºÛlÄP&rˆFÍ—‡´Yp½@§`ÚcP3£È3ްmRÉ.‹ªSŽK\‡%;ŽÖmÖAªzŠŸ˜E(¯œûIâ„I2‹\æ$>S%Ý a Bþ1OÕö]̸țýöˆÁD¡ß£½&¿~ðù}l”G§…±µš³mÔ¤Zä8jtXÿ¦3²U>ÀT t0%¨× x8ÑSMÌÛ[ê‰ãí±TaQrÈ[1û`> b;Ö,½Àñ=­?xÜñ w"Ì‚Ù-%U¼8°ú¡e×`,ŸY÷u4@a˜OÆdìD¦­ªXicz:?B¦J>"tH2KU[b$t£±\#PDdõR#‡Î§©õ¾¦¥U–KñLwþÛND 5WÉ+$ËÒq¢56U×ýX§²ïGØo ¬ôá8;%@ôm«xÓIÂÀ¹ m°‰ úP¥¡ ×eSsBµ‘{4n[Ÿ‡*Æ¡ (õö¯ëm“§™Ì~ߤò‘,Å”=OEÐ6áýT%<(—©‰€òÞOCݹÒGJ TŽˆ •æn™C­ÉÊjJ&Ds„{2©*^;i ùà¹Nàù/®*f¿=b0‘vûb”fŸ¯U) ÓŸîúËCÀ˜)p€Àß×=ð"'üݯ†ú M÷™B+dœ4L* {[f9Õ=È©êEGM‡â=ª¹\B¯À˜NRŠY@ž}¸&À QÒ¤DÓ (ÄCþëÙQœ¯¯æ ô3}u<‡ùŒD=Ö"Ïa,ž…n sÊËcÅì·G ¦:О˜Ý„ºúNHŠ~†¨¡ùGÛ,ÝÚq5t¢X‹'58ãaò‡]Èuâ0™)Üà¦ôT"j{D>Ù‡v™î6"0Qè$lwö¼àò@ÐX&d†eAÊ¡¥šæ<¸d Éke5¾Õô›ÑÏâôRï×£îèúµ6 R3$&æê³Ýƒ¯ó4¥`j©§ó`£G¦‡DSeÒ\[Ð}»î²%5 _ut‡ÒGMÉ}ÜpÁÜ Ôb!©tñ'Ñ6ÕŠü;ßÁ]Vòã?þ&ôBë¨ÝQÙ€fGⶨÌ®í’~ß_~ Žÿ~ÄŒɼ/ßÓ…©ø¯rîyûá'ìiŽ£šÕD“¹Ø:éÑy²€Á 63úi¡­Šý;óØ1^cd \°Úô}èŠê7¡Ã.«ç‡¢ÉïpnA8˜ª`('gN$„ ¡£B‡‡¿(ˆŸ¬¼#È4}ŒˆÖC‚Mé5LNý#U#¡›› ›†~T϶¡{ÿãüÓÉ—çÎÇ«·‡*Ú6Ú*PÄÉüÌWÆ ú½?GUS7b£+ݘ”(Ïk5c¨8À»¸ªóø¥&å×ÌŽ'¼O6IuÒË,*~ŒOA8úöœÄœñ\GeD¿nxì¹phúò\ןÐóz©¹@ñmn~|ì=Æm¸Ët_x‡Üb ºënåZͨvßáåŒ /Œì\ {Se¹-6³Óh›,y,Å6¨ˆô¢p$‡uTSú¼ý´z¨ÔªÌÖÔb!xéÍÇ«_N®ÎÎÏhíòêã§÷'¯/ÎG<½ÇNºýÏÌÞú)Fô9>¹îå/¾ÛÌõã.|-ÊÒ<Ôãº?4ý¢”©Éà%¿í׿åï#j¶|vRïÖ³г<1®XÚî«®©¦ÊyL|£üµÜ$(ób(±0:ýÅõõ›Mà%œ§TŸ0Г§yg ˜H—\ìÛõe½_¨É¢»Ž~½8¹Zè«û7M6´È \·!ït‘ªùº9`Ìç&oôq3lƒÆzp¸Wzørà¶ÖœnÔÛU¾w†6ç\á¬&’÷­!ÿƒx:ÐíÆXéšÝɹ– U„€Ó×§† Ц¼~w2phªo,…QâæÃOfUŒWÔË>æîi“3dpFýö¡>ÕCóö‘qÔ¶•Í\ÏK¡%ž«UÁíw¼,«¬þ¿Í!泿>‹ðŽô'úÙ@ endstream endobj 922 0 obj << /Length 1872 /Filter /FlateDecode >> stream xÚ­ÛrÛ¶ò=_¡™v¦Ô™æU—…þœE1´=ìzaŠ]:l”L¸ëeÑ$Ê€e’BêŽÃ$°Ö)˦yÐîñ[ï£"ž(Z»•õ8:U EDs Þ¿бi4É2Òu)½ð"&áù¼(Ýß §ÛðÊ©Aû*5N‚ÍvœN[u´±k´$Ò²Ùí«Þ2@Ø­¨‰HÔ ¸º]Ó²ÀS…áб£Ñ8œäYðËx–M ¬óyPK­­ ó8î}L)µUâ$G[hµ5ZYÔ×êC\ÄËüŸXki§D³ØÈZj'ãXC®Ááf‡î5­òãµÔ×p·Î©àK'.Rß"æ)®E½B`âi§=í„ú¹ ”häi¼²´£XZ³†<%”FIÃûØïH›Å#w¨­$ÜrAˆ%ƒáFVkØ`²<,ì¹cÎã™Ô<`ÿËD+ÑòùbÞ!Æ sóuLÉaÄÝ=ã*¬êHÄFQxhåŒvj„fæŸ=¢2,¾afi—"obœq xàŒt[c¥C¦ñ4øy<Ëò4 L»Ù¸ˆâ‚“ ŽÓØvÕy ÇZVòv\àÙ:;i»RSªÕ’U- mâÂüÒ^´Ÿ=A_RêBçTA ø¢H¡nÓª-±žÒ´×›‹àzȲ<¸ƒÖGhŒ#~åûŠªi{ÈȲõ0äÿÎجIÎ͘,%ZÛh±abnäÐr7äF[˺ÔÝžú j`n¸In"Ç‘ä0gæÀVDÓ §è•;€y¶UUƒÆÜQÊnµä]ðÃbhµ’¦ÔŠ+P[⥗7.² Ô’‹“ÈÀrñ”€×ß. 8é°Y@p|ö…½åG €Ÿ§ ó%O0ÏR®? …9Ž0‚ú,-,e@SÑò²ÀQ©_y°åúXcæb- X ó4.¨ÆmeG{}¯8Iß›³¹ëº¯_½ç¾›Í´U¤R5}/ÎßæV"]ë@àÝå‚vo\¯è ­zæ×èàòò‹„Ö${Ü$^JJáCBÃø°éýÆ÷ëÉ+nö èèàÀÛ@˜îἈfÉÌS~zbßF‚KSt§ì– ßÿ—úSFãU·…{W•è%“¸kÙ1­¤»‰cì àuU‰ë ; žÌϘ1Ò««Ëª]ñêÚ—?À8žµôèr šÃ¸O¸“sìKëü¤“¸üãb&08ØŒÏËà˜µ©ý#l8'|JTXæÐ£yq*5þ÷I†> dÙÇýó?ºœt­híÞ&÷³ƒ¤]T08³Q²¶þùèÚ=^ýQ¹‡àúÞî‘ø¯LÿÚEÛZðÄQ‹&ÅÇÂó]ë˜ 0æ¡=ü¸æÆ±#Ç×JV«ÁÄ_6mmuw0‚m€›8eû·B¼‘ý)ç!úAoD­þÇoC/ËspƒFøüAÖ2`Ò±,ÁIÚÖ¾²IîÛÌe»¿#ã§®í»ÿùi¯›[U—òùËf·pŽ|ÀßCÿ=§½® endstream endobj 925 0 obj << /Length 1028 /Filter /FlateDecode >> stream xÚ•VQoã6 ~ï¯ðÀ9@­X–ØŠ-uÓC¯¸nh²Ã†uŽ£$º:v`ɹæe¿}”%;rêà:äÁE‘ŸÈd°åÂ[‘k A‘ZéîÊ­µåÆRÂó§+¬í0t ËÛÅÕð>,ì¢È°µX›®+ëo;Þ&{AËC±Édàø~`OW;–3.ÊD°"Wg_’|à…v•dÇ#ˆ^4øgñùj¶hãž÷A Òò=Ò‘‰ã…Ö(ô&¾»Ø2>€»½f4[)‘o‹ª‘óB(aIÕ·âT±\›ÐïJHi)Øš¥‰ É—2„læì–M:'Xåuʤ±¥ïÜý¬ArZ2™®:lµ[6w^ÜÀ]Ñ”í’ D7Þq¨¿øÌ©_;u:x›Œ¨:iŸñÍ|výÛÍÈ´ÕÞgoÉnŸéÜÇÓëøé&žöðnü÷j™1ýÔGzTÂC[¸> ½W¦ÙFöÄv§ñ=ϧݧ˜õ7HsjÕËoÞÄ‹Á¶ËŸœ‘Bdà]=¼N^®—x:Y<ÿ1S¨"ŒF$è¢z8Ÿ ɲ8T.wư+^ÜýfŸÌÙ&gÍD1:¡Þ‘ù-á¿f‰€¦û÷'y>¼ÃÖ$È…e$w‘ãÉ]äx>ò QW‚· "Œ<;.i݆d\ùy¤%ÌâÙ´,¸VÝ °+9–˜^\ì×ý[‡ì.j‰p YÓ«ïž•\¨Mœ6Áˆ¯’'•¯r9KvH-$OiÛãÇ»é(%«Þ…Gh4"=©hÓ'ŠBOÇiÖŠ³/Ùáµaä lé:µ€‡¸ÓŽSTbÍšfV¼f0hHE:äuSéÏ I5i:Žt¡>©ØmiõL—HÚ9.”ùÂmìz¾ÞCLœúéCž/ñ§[LiBæ;™†= ìö¢°­¨Ev’ õ ôP5m‡Ø.ðçDÐ\Cu]Ø)Àv¹å¥éRá¨|Õå—JL¦pc¯6U´–ŸÝß—ôÀŠŠëÂøð·Í練 ºÿüÿͰw;®a™ü×ù€AæÎ endstream endobj 928 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚ•VmoÚ0þÞ_‘o© qBZ@ª&JiÕ—µUAÕ¦mLbÀkbW¶CË~ýl¦e)Žs~î¹»ç.^(Àë†ÞiÝvÇK‹£pµËfžZ<]mçKCß²<µ.“ÄaÐ »ÀOm¨qæýl æðU Öôã8nĽ¦ßn'~V`‚¹`P`JÔ³o4£N£„yÓâH.ã°ù{|s4×þ“(:he¹ËôÄf â$èv€wÒi n+º¾ŸS˜ù)ôSÄžâ Ô”pI£UrÖÊi ói‹Ï±üëKPY+³_«â-yø @² üÊðâ-­­v0ÁèÁˆÙ!´Sœ£CÐVQW >8 €Ì¥ñ"¨*0™)(¨.ÏÊÔÚÊq.:w2¾aÐÿÂÕªŠ¸.ŒŒéÿNàV{Ìä‘•|«¥˜ë½ ˆsF§[O-xã1“b—DJ™6; >®ÅMÉ…‰q¾Ë‡ª«Ì(eh#ËSŒòÌ™“-‰`Ë5 Í!LÂHóŸCÆå=è©ûÑБ¢6ƒÿÕ l°Ì‰•>Ôzø‹W#§Û‹‹“ VõeZ,l`gy¥.±Xî3SV#Q+…2“NºÀ$EŸàhQ8¢ÛÄXm%_«}NK³&T4ÑŽKnÄ€ô¶£!îRèÐ/¤¬‡Á:$ÉÃ&פ,&æL%„ ¥¸€¹¥ÐxŠ»A;‰”§~*ª6”Ek ß_1³Ä p¥ng–4¥™ŽQ 6Þp®Ù¡ m&jÅ.m™‚Ž“äð] Â%1îäsAߟ,S¯œš)bzj"°sʤ¿®‰ýhÝ[¼ˆ£|×µO£Ý·ohR—gaJb:ÐËR@+åì]¼œüA©ø|°õ\©þ$awO1™ÒúPtÄ¡æøŒXUFì cdIõ~KªsônË4t–S"“%RþÛIЧå¸7yަr’š)Vê_ T-" ¥zaÔ“ÎÔn:iרý©,ƒ½dz.ÞtÐÑ×h T½ü ¾&#ªNsp6?œ}4u÷gÛskJY>–“ë`oͧÂu]:ç‘~>«šb^h†O£þf0+ìÊfݬ{ku¹q7vòÁ{kE¤Ò±Þjz­A:[£½ß»ìßé7›ßÁIœlêòz{,À ]Xbf…5îèËÞÆ\šØZs" endstream endobj 932 0 obj << /Length 1027 /Filter /FlateDecode >> stream xÚ•VMsÛ6½ûWðЙP3%H¤¾.­ªÈ™&M›‰uh§é¢ ExжzÈoÏ‚hÒ"-{ì ðöíÛ· °Áöf‘7!Í’©—¯¢zµÜ{fðùݶûØ´vþ¶¾ ¯ÓÔÚE3ì­wm¨õÖû×_è­bå( „ød> ’$õÛ#/¸T%U\æÝGZŒâ©_Ñ|Ä$†!Á£ÿÖï¯Vë&~Ç/$ªwž3·™b¼ž€EBGb!ˆ”bŽ4Fˆ0ŽýeÉÒŸ¤>5¬ÜÀ(öY)¤YZæœ#XRv®y}‰p¢™™°Ýh–4&6©k^Je4Î\@’øêÀÌâ7-;;™Õ°¥j^guxØ¢ ÖQѤˆÇh<&=ª4J*!r3 ‚=+”ž·%¿û¦Cëõ/˜$µÊ@O±•Ú`¨ÔŽçÌlý"yàðÖìÒ úhÐ9kËô΄k KÍC¯ÕÐ(òÀiʼnm¸2ƒÏ7‹—!¹§[F½w bwÄ] A=ÖRëbÕ‹¦Xí•zÞöÊϰG¾“³­y¿Ñ…=é1b„}ƒ“øË26Í¡‰ á®v‹Y¼×cQå XðøN ó¼]#j–ýN¬“«çíää%wƯvgëxΡØY4tdôü\XÉ2ÌEFó©,´Ö5¤w?†;ýò,êyWEOªÆìövÕfÏ·¥ÎM¾º1A/\ÂãH£X.ÞÈW5÷ÀéËWÿ§œQiá!SýÓÃÚ«z°eŠò܉ݓ·-|r ŸC`R|.÷‚z¶Šï+©\¾LÊs:Â> stream xÚWmoÛ6þž_á"-JÔ‹ «ë:Y»4 joèÐ#Ó¶fYòDºiöa¿}GeËŽœ¬y|î…Çç(ÚñàG;}¯鳤“®Ï<3Z-:(|¼>£VÏE·¡ùzzÖ» ÃõHßëÓÎtÞ„šÎ:ŸÑ’o”¨ºnN0躌…Îp¶ÎŠLªŠ«¬,pî=/º~âlyÞuýÀ1ð»_§ïÎÆÓýÐ÷_è¨Ö|êiÔô”Ò„$(a„ ýCT/C?tmà\¢ÆDT™öPÏßn×÷:2-ñBo)¾ÃƒÚÕžw°œZ <Ïf™z˜I’„Ƈ·¥B€×b^V¢M¶ oDŠ‚OñIéÀc°†£ž×æöt8‡Í°˜WU†Â»œ&öéa2ƒé¶ù;ÙÞÿ-Re1G—“ñŇËÉ2“K‹>þÎ×›\Øù<…ºÝ^¢Ô–#‹ˆ î¶÷yfCþM<¢ð¶˜—-Äå­+†ù¢¬2µ\[??N†‡!ù <>‘Ðë×Î+Qèš'í½æ²67=(ê¬Pr°¯‹ g)ÏuqìA’àGÃÁÕðf2F¯ú”DAh½²o%Bª¥Í%¿/¿Y1ƒ„Tk{šô@¹úeïÀŸ½ÛFa>Ö9ú„…6äI¶(²b©¨T6—• „´mÑß\¾Ê¹RbðßOz¾w ăåϖëë³åúŒ°úlb! ,D¾3QLh{A »ôf„ÂìJv ´È·qÑ ¨£³h Æåv³‰:e¥Ð‡C&Ò.ÇÆíOuÚ˜OÑš !f()œóapÀdà‹G™ÎéDªåoš©€ æV]×r×Õ²\š}7ã¼84H)*ëºÔ©ÚŒ·dßÀqßY™¥àDx;õ„ÍÌšœ Í”ùµkMã‰l °Â8L`£’À™t)úfµD.ÅÃRTöUÛ”Bó4óS·Ì I»¢¹6´ãAÀõ iŽ4Ù»^ï6ZzͱËÐi]#}‡‘…Ïwz{xÅ×Pâ) ¨5ÓL.$lHÒpØìë¾nøB0‡ÅÇñÒ$$‘u‚¾O|ý 7ÕÚnC½%ºcPãÖ’öÇúÉìÂH½á•}Ÿ ™š²Ê`7u§eN9ÇùÝÂÍ./ĤƒFéFI´¿4"Qä·0€a ›/|qmüyÀbJ{*ÝX:‚^k’G“&G©wÝïpêS>ÏêvÑÛʪ——@ž=¡Òš°¢ÏÉª× z/ƒœ=‡Ù„\‰Ç—"‚*V[[Äo h p%øwǽ׷¿Oo&'h÷ŽWRØ Ûö?ÊceÔ½)ù¬ÖÕ,SßTäÞßNXº…з³Ú­7Ù|ž ÷W‘çkn{L£lÚAž‰nV¢Íi¸Š}#ª»Ù¾ŠNX:±Îæhâ”v›êkÖ®/Õ½=Æ÷¿(ñ;ßõñCß‘~‰Ý™2] [q¬­‹i IX¾}/3g9qxúÏÖxÃõš°+(i5ìs+áj ¬ÎÂ6FÅNÊ¥]ú¨é±Üâðƒy&Cw}I/K ü€ ¤½áiY÷ªbfíXVI ž?ik.ep?gmÍ ÌÕÍ ºÐŽXèØÌEÕ'q`kŽ…–ø=|>$Žqµî¬&&›²ØY4J»tqónƒ×ý]z6NÃ‡ÍÆØªMK…§ö ®íjô§µ2s¾ÍÒïQ4lß‚`±M%IðjRâhf!6zçuÊêek”¶|Â} Ô×Cà¨Üd´•èñÒÖ,´S,oI¾Äçy%x¾vW³ôrüiøþîfL>|¼¾0”¸,¥²5ŸËó4™­ËâU§…=Qs\¨šÔ6\ʇ²²tgògì°óA+ «µj áR¥²µþ$ ¢øßd4„¨Ÿý&3‹Æ@ãy´Àø§ÐèîËô›ù´c1h­ª{µP½fÍêUýAÄ…ôÃÈM•t—kžºrÉ©ÛöÄG“šçôMç`* endstream endobj 830 0 obj << /Type /ObjStm /N 100 /First 874 /Length 1951 /Filter /FlateDecode >> stream xÚÅZÛnG}çWôcü°Í¾TuW†Û‚öaã¬!)Àn¼~˜ˆc™°L£QÖþûœša ZÃDÔŒ"ºÉéKUõ9ué¡„lœ‘ÈF oBLh³‰¬Ÿƒ!ÑÇb’h£ÉÄ&‰‘\L(Å™‘Laž 9ã‘IÅx‹‰.¢“u¾ Þ¡„Ž`>áas!<âÐ!ãSÁîŒet+!1¾$ÁÂl‚s„Gì þ‚OX˜!qpX˜1$d1YUȘÌd9(Á‚Ž`Ý„I,:6›|ž ¶ I ÚŒÉJñ„†¨ 1`=)°AB§Dt°wT-ûGŠN21zÝv#XXÔ€Á@° ÆfµlÅ©±‹TȘ]ÔÊLN—Ár“äl(¨á!Åäg‚툲ŽÁѰʅƒ ô›„ö˜—²À´X$`zÑsÔÆ?»€Y˜Éö•B†C3ˆÃ±@Ê€! Hñèdí$ÃÜÉt=F +"P`Õ¤8g’UÁò@Ž?Á^°PD)8® X£¸dë7³3ŒŒ•’š!âRñºnF‡S¸ìbœÀ)ûnR†½ žŒŽ”³~@dè Cf=Á‚³ÍR°%Î5—¬ŸŒ8JQ«xdzp´æ…~Tà‰"K…k„å lpb#µ;c©¢cµ¹"“{¤¨Pʧ\xöüùl~º^µæùs3?…”âi”ÿú°VÞvø@]ÿÅ‹Ùüm³¾<¯[óÎÌßžœšùEý¥5ïgx¤ _|ÝÔxP]Õ³ùklR¯ÚÈštúl~V߬o›Ëú¦£j÷Õ›z±¬^­¿˜w_$µ\ ï±MÕ`®Q„vã^®Vk,õ®ó *‹ú†¾ ÛV¶mìÚ;"uógóóÛ_ÛîóËÕ§ÙüÕºYÔM¿·{¯^B3"oŒ¥­‚/\ެø‚!/;»›ù?×k3?1?¼º½úŸ#wVoÖM{óL­4zk*ì|ŽÖ« Þ¦ô÷o¥Xè–À1UD·‘ó·½OÍ7mµZTÍâÆnž}笓§]o&kc¶üöTl~#‰…§}:à7­¸M'Ö}ì³Í¬.Y†ïY®ÀèRœ˜wò³þóß_àDŒ:ƒÕíõõû¿Ã,Îß{bê’R·F]ꈹ«¹ûmpߘ½ú屮cŠÑ:çÎÄÒyÇ]QïŽ4½èÛþ<4¦OuSÙY >ìƒ Ÿ Ñ"sÚë.^7_7íúª©6——ê8þý[Ýü¶¬ÿ?Ýe•b=|V€óðÿìuÂO)ò›•ylν1ûÙ$û«>×mÝܨ Ö67—ø›l¸RM„|를s–#O£#FAŒG`ÇØõŽÎn&#L£õái‡²£Üh}ÊPŸ<ô’s1K,Üe<>I﬋޾<µ Z}÷ì³ÕßPH@’šFPÁì÷Œ–*ÿø´¸œøÂ*¤;¹{EÉÄÛì Q‚ÿä~{1±ÍO~:ß1Hõù˜VH[›ÝŽ 6:š,ŒÖý¾µ„0 kp"ëŽ>Á_êGëCÇ×G†ú¤ÑúäãdÆq²x Èúß?ì*²˜‡úðƒôÙ‰pýoGÐîD²ßgf~ï endstream endobj 943 0 obj << /Length 2537 /Filter /FlateDecode >> stream xÚÝ]oã6ò}E€;`•C¬ˆ’(˨×ëݤÍ&¹ØÅî¡-Fbl5²ä£äÝõ=Üo¿)ÉŽ¶I{íP$ˆÈáp8ÎwØ‘?ìhä ƒÀ…ñQ²~ái¨ZÑàæÝ fð€8è`¾^¼8}ËùóÜ‘7bG‹û.©Ezôƒ3]‰M-Õñ 'Â;“tYU+QgeAkïEqìÇÎVäÇ?ðaÇ?-¾}1[4çsß&£ˆù˜Ó¨Ë)c±Eqè² $fYò ëcØÍ¹ný†BV>I] Vk‘ ª•`ƒQDx?zÜc1üe4ߨ²–I-SšÞíèû\pc¸Á€.㙺ÏŲ¶rçíÕ͇ÉÍ›ÙZ»¾¹úx>y}1£éÍìrö¡ž}˜|¿8›].hº¸™\Îϳ7×WçÓLÏfÓï,¡«ï&ó7³‹Ù»ÉbÖáÏÄ#Õ7¹¨k9þ÷_qýP%9ÙXäúaD›Î¤’ôðY…ßÐù¼5Aê•Yª¤útì«?ŸQCÊmžÒt£²—k×»ÿ¾ÝS,«U¿é˜®5I¹i^ª*[9›w¹Wåúñbh^´¢ï߯á±Ó:ÙÈ.Ž˜?t=øé•Ú>+` ²ÈŠ%MÑ(úhï³ñ{Qíã¸G$Usÿ´3+‘Ъ~-«CA>ûlËì×yè½òBíšûΓ›ÅâbþŒ]€¤+Q¤`š’¦…\–u&Aã.“2§Ùm³¹ÞË“ÆoÐ@~I€ÚÒPº½™O,J"U}Ÿ%@–æõnc±>ºÜ5xÙfe¥s;™é³Bܦ¯§<ŠA›ŸµÇ”ë’U•YQÞ^~qaW«îJQ þv ·}ê­››'y&‹º½WÖ½ØíôÕ|vrõj®÷löE¬7¹A˜êÝ'ÓËW4²ÌeUµ=ô O›œ3iMÚKªL˜×*¶ë»Fš^ó^ïßp££ 7R¡O1×¹|œcv?æñxe€ƒ$ûéXÞï‡ã…?ïÆÜ߯–¤HêìS«4·ó­óižÉ7JÎØØ Çžg žXòË&SÖ|nß*sáo-)[«9 Z Ÿ¤jø/Á¡z‚>Ý)Óm¾5'1Ï·Ö›Õ•U¤­Rð8¹Ù9ûx}~ÁâOçÔØ/z5°ÿ_ëãâZ• ¬½uÃÌÿdzN惛ÙߟÞcðƒi¶.‹of'ï¯/fîÕÍ;ƒP~Ô]½¬O;{ÈOÉ꽨“UÃj×AÉÖÓZûK‘•YßVVd­ßÛò mùd°9ëQ{Ã?ú­æ²H ôqR—ÿ•ÕƒÉD žz”?…/¸nè<û„4«’²(:ÁosÓ¼l­ÿºßo}¤Ó·CÈøC7#_gü>–Vø×ãæ6;„ ‘'êÅÙæu¦ãv0 )ËdùU_ù€\曂r.ëZsz¡³Ýà7pÖX4DRIÙßöU-뀨î3¸MD|‡ë%H1 ïÂQ lÆ +,øVu©P 5¬ o½lƒW”jÙŽôX˜xµµXŸà$rvTƒÑJ"ŠætP¿3Ëåz­ëû0Ðw憘£L>wGÁh_2ö $U†?¼e)°,¹ØNˆKPF MÕ¡z Œ›l‚çÙ♕˷s‹Î=Èî7šI©0×ÑçHH~´Ì`r‡š´;ŽCç„vKwéžìñˆû‡NiêÒA]z,›ÑH±ƒ5¯úº[¯e­àÖ¹>Û÷­Á›ÒÐøÈõ¨ 0(cˆH#}F‘à‘+UÙ¿´~#xïe`žÃA(¤¡ÐèUÔÐó\¸¸ÕB¥‰÷)kìFAÔ*«~ô £áþ£ Û¨µ˜7È…¾¹VI€ïe‰.øÑãŒÂp¿¯° ÃÃÔä’ µ³Sl%ÄÆta¾¢>Žïô£™} Š‘…Kzv„ü¼ÅüG­î଱ñµæ²ª‰vØi[hÇ0rÎïia‡P´íMª-•æ>­ªüŽ>"f¿¢Y‰wiû+!k€Ak丫¤¯.q°f'™@jâCúж¾&kÒ²4Cé&ºñÏ8àq¬ÅóèTšÖ(h¬ †âë>#QÚÓDžós €Ø5Wè"¹£8øÕê« Rƒ NH¡FKÀ«î.Š™)¨˜"<ÌûR•x‘¨ëEºVN0Ñ^L4®O3×iJÔÄ/\ËÝ€3Ëð` ¤HeN¥çvQð ÄãbIþMópÛ¢ƒ˜‡ñ#ÓQѸÀ^¶bHbnKïú˜aÌ 9¥õ¥Èl£˜š‘•”‡½a?àëEn V„ýa—Ú‹fùƒnïCºc»Ð!ÐÓß><Æä$IË_èrü€ Abš’WYcÑÊÿÓ ­lÄÒÄ¢Þ)Œ˜;bñÞ¾Þó¶ØOÜà¨ycÎ0šr<(õa¹QÅNÐÓ* Í17U É¡FkOšî°q:Ÿ³›ùQàЪ¤IN®‡&–„Ÿ€®RÚ…kh3ø%·/Š¥YÁÜå‰É I`„­­¯ÓÄ Z³Ü†‡¾¬¸ '¶7‰´9ÙŽô°Ó‘nZ/©>«¬†Ôš¨¥[l\ƒ*дiwò‹é€S¤šHM×dNo››RínëÒ©y×öM‡Ë¶ÊN·•:ÍKH6N? uz'’‡íf@ÅÀ³[ø:ÔúàªûQèÆñ¯Sþ^˜Â: •U¶,´æÀ¬*ÍjmVIõdU¼4%ÿ¹Í”!bÓ ç‰ôƒ>R!¡‚¾õªgK“û#ÖQmà†A´gC!antÿóµ-”Ì3q§ËXÄSñ[•k)“YZ^„öµšŸŠh(š¶B×’Lª °CËçµÁ0;DŽâCH#Ô>+ÐAMJ;„ü]S»Å:÷¤î W1P"Õõ"P" ´ ;QlmÑÙBì¥*°9«!˜ú‰ØêR¸‡å¤Tj»Á«[[îE˜nÂhÞêÃ1² °ê÷ih8r¯Iù#'˜R~¡ÄR‰ÍŠt±ߎX´³%Pœ:󹬥] `TÀ:’3ѹ0çZPC-(Î;Þö(‘˜´1 ]ŸÊ¡HuÈDf<¦åG£G†«ô4èÿÁ]–…$¸Í‘õ>A%ž‡–bB²™{*7æ0ìxdÆ£"êsVâ…´vËÆÇš°÷¯ Þy endstream endobj 947 0 obj << /Length 2951 /Filter /FlateDecode >> stream xÚÍÙ’ä8ñ}¾¢ƒÜ”Û¶ä‹XØ…Yvzƒ–T.U•i—]Èv÷6_O^òÑíÞŽb"¦”©””Ê[éŽo"øß”ÑM®TXê⦺¼‹ëN7<øö·ïb¡ÛánAùËûww¿IÓ›8 ˨ŒoîË­î7 ~u6×ÁºÛR*P?¿Ýiï—º­ûÁ™¡îZžûÚ´·IŒ¦¹Ý%*¡Ò·½ÿÝ»/î§óÓ$ùLF‘òÓœf…c¥™Ó±µ?\áì"°Õ`ÀUªgû±z.õéŒ<ê â<¨ªÑ1\™l@š'ü¯cÄ“«A=S îYÈdväCf°Œ¨Ûcç.^4€0{¢èÆA`þ¹ºº­ê+ Ä×ÞÅ*ŒS¾L__HšÍ`ZÛ}H4±yh LÃT'LùÕ7O‚ç[¸L720ötÂÎ^ºAP~;¿ÿ#ÏôÖ=âJT1ÂcªúÀ¸—Ù¿ßp“Ü`ØóØ3 e GË´& H¦Ø2 L{ÖªÊö=Ýk7] %óÅj”V–µáü|„-Ïu/ÐÞTÈþÞɶ8Då) £ a ÉÙ ôHŒ¹˜‡ÔNF²ÌÉA/N)¦Sü¾í¡‘•Uׂ9Ûzûœ7›×Ú½ºN,Õ5Ï·…ÂÛ]~…ºÔJÏìk¥X—ˆ5 _:¶7ëZFªÀ« „ S`øç‰«CµíÍN#O¨ í†ÕÞx ØwÅŽ"M,W™Õ•âéNûÆ^PÑÒK âÆû<#ì –àH,t(üe×sB⺑L6BFxy¿úr…cEðu{blß],¯y¨yutG™{nI›g×µõ?ÙO7.ÔQЋÁC.æz&[Gðby±x 1jΙ¦ámz!ï‘ûžÇk®c¨ê€óº‚°AV ˜ÙjqÚ´þ|tŸÄu•ÝÎvIª; ³AxÚ'äåhoÈJ^Oª<þ†ÄY³edMU¨’¶ µ»³æ°ëÚæYˆWa8K²,=ñOyûÅyx·l†s7Bü¥ùù¦Àò_ï$=˜m:’îCjD¢ãØV¨)ÓÔƒh ¾Ò¨©'oB  Ú—8ƒûä/ÌÕô½©ì‚ "I-Å¢T E|"qàÐËâˆÍ&ç4P·p—“lU_ˆºÌå*çØŸ0úhÍaü7KÊໞoå7möFLÉ$ìkkÝl¸ @ððf;^JöïQ ,›~äØÂ#3t &ÛÈÉ6wrfúVThA,,ÄS¾>ð•¿ØmÄD¬9­î{™×š§ð8Ør¸”Ìâë¨ã-A©hQF täàIµ€£YTUðÍ‘'*HȔӘò \"‘çĶW†$:®¯ˆ°¿"ŽýiÌWÜRÕ:aPi YP ÙW‹ +¥°¤µ(®( âT¿Z r°!×Ô_ZÎ0Š­ii;Ø æ8FB@œF®½Ã­øa±.p^š¤«XNˆcãèîѸ»¦9Ý] Z6$á÷iæÊ£‡C ƒaçNŒ¬Ì/îìPÝõXAÝÉ®2á$½‘?pÿø_Ū{ò´„ ÔÂ3c¬†H«)˜àG¬8©â¸ ‹|ÚšÌyƒ$Áá åri_.ÃÄSÝÈ™zï"{,YÌ_¦­Dé°ˆõ*ÖlKÖMå=ý˜zÆ…n½ˆkÊ—~êe²YÄ Fýœò @Û*Šã0S¹¿4¸î†`€F§zY½Áv‹ÚÖó㾩[Ûs4ò,ŠU ëÏ¡H!*ÂXçëøó z*`4 z](h)~µ'núŽQu;ë¢ê“ñK ÿ0]„öÒ€7ð]‹å]U‡eœøË~‰Ýx(åÁûÛ$ Mݘ} ååf™[@ ™Nv6½ÁäÒ:Ra[¯<ˆƒ˜ŠrŽèQ†Ùî86‚;2n–# QŽŒ¦îBôêñ­©@÷{ë$—¸NN[û€ØS£C–Óˮ€”"åS¡ãÙ,˜^ªÜ߀Ë»·ŸKÛ¤,¤h)˹õPË^@(¤èÀÚr0°_— 6J2Ç4ð|à[[v†c©b_¶í eFE6?hêS ‰w>Ýñûü•¶S ·ÀC€ÍÔœ„¯Å5Éàéï y`Yô¬Ýêí¤ÏÕÿSþú¶ÿmþ~«$øTiQ™êlïðà]Õ]ŸÿÍR@ƒöçR@'>ZÚ4ˆ›êÄ£!Xã‹0rçÔCèU{i%KS3%áš—¸8òt-ðâF/DÈ!áG^1¸¸Ä¬ )5ˆ¡€¿¤%ÌH¬øÉ1srL]rß)©Iº`®ÊÏ;˜ìd_#s»¢æÁÏSO¦é‡R¾xÓ•TŽ-Ùò³òíÒpCô‘*3Ðt¾í-Ø}Šsªÿu¢çú_ké©1^*Ÿž!ÉÙ0‚äà‡¨Y(úÓ¢·ES ùQ:µ½EYË£³iø¡Åhû£­ôÞ’ÛÖÝHI)GæXš@(Žc½Rà0K€@,Ô„=ºî"çûmeÌúDsê äów¿|õ(‰)1~‘«Á1œMeä…¯òÄg'ÄH—+}y„‰AväoG€ ¨œÇÁà,ë¨D¤ðØ7RpÎÝùÏ~ñâ~‹¯qS"†×ZQ¾™ˆS­¹¡jnĽüÂÆB›B6Â3¢»ãrêš[~F—at¦Ëƒ#ç2ÀLßöâ>ç3­}¶ü+Û]Ìa³™÷t&ËW±ïÜÆéœ}ât¿cùE^Ü“¡ò‚ÌW£§Z‰ñâS­ÅvKˆùcþV^"¸ €ñ_±kºn´¬OQŒX:xCßë0"ml("¯£ãý:i¢*%yÑn0#Çp…\Q‘8p¹¨”^õ«‘„;U´Ì > stream xÚ•WmoÛ6þž_áo£ˆEQ/ö¡]ÖmÝ:m€ah Œ‘h[¨,y”œÔûõ»ãQެ(I‹y<Þû=<‹Eb‘‡‹TJžÇÙ¢Ø]„Žj7 Z¼ûåBx¾ƒçËë‹Õ+¥"äy˜‹Åõz,êº\|`?mõ¾7vH)™ü~ıb/Ê]ÕT]ou_µ ½ÑÍ2ÊØA×Ë ’,¥Z~º~}ñóõI¿Š¢¯49ZšŒ-"ãÙ"Éb.dLÆ–7K¸©XX£Ë mê#ÖUmhµºÕvU·…®W;Ý¡g`#è „äBMÅT›¦µ&0Ö¶¶#b]ê=­>—7_ôn_ÞÚ  ýãÊôŪÛV^KPh¾7»35â+ô<çC¡‹­Y¡5AÑîOÉŸ¿‰1ûR÷¦ÃÛ«W)TBÌeœDß ÂøQʳÜFò ä$»2·K)˜©[ˆ…Œ˜+4fU³^‚µvG•áÄžÚ˜sùúºÞ¼š°·¶ÝX½ƒÂÚ Šìíot²n--Þo—‚AXiWuô-MWØ \…’3%Ýõ»ºÅ’¼#¾¡ ;c¦5)ÅS©*Oy¢rW—\Ásø'"W ç”q¥÷ƒ‘€™¾šªqο7…o °Oq‘“õ~7Ö{`[ïå•îõîœù˜¯tœîWËL²CãDvŸ.¡U£œíõ‹EQ2õ]d9OÒd¡ ‰Tø\OÜÁˆ}ÆÓ©Pg_ü€à‘³~‹™C‹ºÁ}ÜQ0ž§¬=ô´7_zÓ”U©ßå=¶–wO7%]/ÀgóïÁ¥¬ÇžA*²n+ÏÛ·¼Ü»1ŽÝ"DyÈŽX1íÁÒŽê§¡ ðxr9$Ãíº#àÈŽƒ²¿1 íNvïis‡–HöDƒH@Í?§~RçF@¯ûl‚a,k÷ÙW(ùÅ[¢Þ;€;y‹Æ{Iê8X ðæ6äq Z.<à¾(Kׯ±€Tà'c¹£ý.Pågüg(M¹ÏrÎðí¨6[ ¼:)B¶„P¦á(”$Öx5' -Û™æ$KË÷½îtÐ9@qprä>\kß7Øl¤ÇHdÓ¥C #¨’¬†§Û5}=VÉ{9‚uþbK,ÿx0<{â^¸$†ÜyÀ^•7¼˜ƒÍ˜Ð‡ø¾#‘®øQÇžZ¦ëª¬|$éºóн ‘¯½ãàÃÕÌ> ÜÏ85zš|7EYÂãh œ®–`¾è¶í¡.iíK6Më¿î¡ÄUï)®ã³SLJÃCƒ˜›µbê΋!Â^¥šÅ5•‰;¦gã¸ÌbvI‡X`3Šßý\!{úÇÛ¦™<  ^Lẹ"ê Ìñ#ÉéÎ,NÂOA€ëÓƒÚ¹ù¯|ôAãõl  à_ÅâÚ°Yu ŽB=a¢Þ0×cþ=óYˆÑû½5E¥{CûjMl~Ô#âÙx âÁ¡£ïý`(‡! ÉàtÖ¯"«È˜oŽº2䢷æ‰,y¬ß˜Æ¿.î0®õ“ðÁƒ @ŒÌÕ·ÃÃp? ˜é¤©š‡ð ø€/"½ó3Mkûbö÷¡ÊÎ|y<÷3–O…žcªÿs¼s endstream endobj 958 0 obj << /Length 2587 /Filter /FlateDecode >> stream xÚµÙŽä¶ñ}¿b«mE÷á<­á8ŒõØ/q¸»›XmRÚIçëSÕêwí `X,–ŠÅbìø!‚¿ø¡ŽÊ4 ë¬zhúWaíñw߼Ѕn„ûåW¯þü·<ˆ£°Žêøáñ°fõØ>ü3øú¤Î“¶»}š¦AöånŸeyðN´ÕC£ý½vI̪Û퓼(² -vÿzüû«·ËÖy’|¦ŒHùLÈ„,Ã$Î3²¨²0N32Ûíó" Þíöq°­ÌI´4!Ñ@ ûÂ6’,¬ã‚Ù<žŒƒdUÐàyüÉÑ×ÌNV§“f`Zm»‹Ž8/…q0ïâ ?OfäƒñÀãwÚ¾¨ ´Ýk€Š"s7Këà‚ð8óä½¢C~8Úޏ*0Ãa´½BÉ™ˆGÒGœFÚytt^\¶Zu=ƒÊó8[34挶€øAõÚKƒ4k‘c–¹Õ®±FÃ¥ºŽ³²À®Áá<ãmpúKgÇÙŠ¸ˆDL§™Ò]D¯ÿÖŽWál Ðý!Ípá'#È‘;²© Éeaš‰7•",oqaÌ6÷/œl죱ãÐk€cصcû{ãÜìMaÛã:Œq¶ûQ˜þÌr9:FDö ý$óÕ´BÚ€… ÌN °&e,"¢bxÁ üÑÓÉ°Ñ zbt£„ÙÙŽg1¼î¨Ã<4¸í—|²"[Ÿ¬÷Íáty˜G¢3¸R”P¬Iã$,@-SýiKOyX&¥§ø« ™è= G§íGN¿Á¾ŠÃ*þmöVžDM“ø†cæÊj†q’íÆŽ«åù“™N Ý8h¸ÛWE qE{ «s§-üñpD»DÿØ×UHÊ[9 è_,´ÅÐÁß$G÷c”ỵsK‘ 0_:[Í2ûëG$-â÷çsgq%\8ر—ï” zôÄq¨q $ÞãY w#(©y×Õuà&}FeI—:éæºD~žjz¾¢)"vöÆJÄë Ãå_¢߆–½Œ—‚KþrpùÁ''Ü-.ƒïúñ‘¡äúÌ38†± :ÝX=­‰.n½ržûöÀH:Œ·ŽHä`Bû$ˆI/‚(8yî7|dþi³ÈK±«Òà5bŽÖ°òd(otͦ0Qï;èš`ì•ûuÖVµžBXO'%¬Vi§d20útw3jòŸÓa/­[·å$q}W©"K"ŽOXl›^jGÁÑ;åñz"—%ÿƒZd1–ë~ñhµÀ°ýfm–‡i\ÿkÀ¡·Xf ‚ŸÊ"×<ƒe,ßx…QZÜjíZ`Å»ôÌtSeÄþ„4>·ï¯:eº÷ÊìâÓêÀyb$[h™ôy†KáZqÅWn½Æáy±éÕAÎÓž+¥yÒ˜Ãò<åRJ>Þxá¸ñ\L9±o«xæ[„% p5‚ˆÙ”ͦR.1+RnÆhù>T<߯?˜ÀÂM›Æ(ŠFm& ®~n?¸€jä–ðáBqº w¥„;,£ïréÿ¯jæ˜`ZßÌ¡5±Û•>í”)/ˆ±º¹4ÛZÂ6tLåN£ö“¶=£ÉÄЊ8x#ÁɆňžUKU+r<Gª¶_Ã8õŽô2YJœ@°Ÿf”|Lð}tÐÈö”opõë8î”K— „G«–¶:/Gê Ôü ¸—ÒQϲ2_º’pËP¾¥×ØhT§#ò0Þ—^³º‡Áñ„ê/$RoÕJLš®OrèÏb‘ÈÁÈÛ%Üæ*ˆµ›O”ûRþý3eÂÏ”ß,¯É©¼šáˆÞ÷Ò»$0˪„Ù¼yþ€ƒ:É˰¸QËϨN¸´ÃEŠæôª‚¦SP}´r¬EaÓR…{Íd\¦w-àÃ^¶+Ã*/_”‹¾> stream xÚYK“ã¶¾ï¯ÐÍTÕHAR”œÓd׉í-»\ŽÊ9Ä9`HHb–€vvüëÓ/ð¡¡Æ®9h4~|hôÄ‹ üÅ‹ýf‘'ÉzŸîEónCT{Zðà—¾‹…oŒ«çßï¾þG–-âÍz¿ÙÇ‹Ãq,êP.þ½?ë‹7v¹J’$J¿Y®Ò4‹~1GcM[&ÿ¨Û¥ÚEW]/W*ÛnÓ(É—ÿ=üðîÛC¿u¦Ô_Ô9ÿ\Éí.]ÇIÊJ>^ý¹³ÕÚW]‹;/²|½]¬âdgÌr8£²y]lZî¢Â8‡”,ꎼR8hSµU{bÂóÙø3¸4ÓŠº2tZÏäFãä…'W'›3NãÈ.ãèsUàÐ<ÀÂ%þ;‹OËU–Eÿ3…w¤þFtYyKËî9íóÊñ¯®ëå=ãš)™è;Y,ସ»{B8‚\ß½\À0ð9’R¶JøÚ1m´Í®ßæØY^5šÏ´¦#¬ÄùzŸ$Kú¢Ÿªºòb²\eÑ#DÔ¬Ù}"™-N÷ ˜ö<:Y.0Œ¬þ≼h´EáÊ… àAç0 D./†SÐX6Y]"É þ2ëåj›ÇÑ÷w"꣱¢ƒíȲjGÉÒ¨©Nçà(˜ 'O4ÿxŽOä3á{>wN¸®aÀ"³ÈçmUx2<É”ÈCYga.:ŽÓ[ ©äLa›‰/=ÉŸUï¢R{Í£ß6qjêòS=]=“G!œÆû¨® Ê)ÊÈSÀÐvòk|šýÄD]–pgÐpi†ëN’k(ì¹òç7óÀ‘3ã7E1ü8€^˜¡5…°hL¿f Á¦EÂøwˆñ¯ƒXIWÐÓ›/þ6,âÒ¤É&ê®þBÖÂ18 U{0ð´/17Ì×¶ÀÄ\º|;^†Ï|¬\´õ•qk®\lÁ·¬¸TXBFº©]½—l5·ß"¶#ç«K™ûK9$N`„7…c¦)l;f!Ъi±:‹`<‹ÿŠçy@q÷7D"®³‘¬e¹j×ì¼\~C‘넼ÿ˜³P1 _Ønòºñ²l¯-†N–o©F›‰±vÿ¤fwu+1^^|’ú·‚@[Î-®ú·Ì9·_ÃGÖü~…Jß *…mçêâ1*Ë£>½9L2Î üÅÊÄW‘iHzž1È€³e•ÌŒƒÇ™ëéãâ çx­u23ÕÄæõ›\¥»·íôši!E ÐÓœŸ!£C¦“C¦ü*D*笈Ä}>¯È_(ÆÂÙC159û\vŸ t`ËÏHx¼8tC]$dÑ©úÜ¿‘až¶@öჟ±T´@y$åÁmú+ÇÌ¡¨ÉG^DºhK¯±í îU²Bi}§4˜§'93<–ì…Ñ :‰SNßÍn¸l –_ÊtF`‰qß\jÓ 5ìøãÙmØónÐÑQ7‚À}¥ì¤r¶†íšðH ]’³5fu6º Lewbž1äýtÕ¶©ß»{#äùu¹ƒ"ɺ¾düéJ„Ü£ûô¹íÞ(ÅFú$6zU0ªÜ|›Ý¤`”Ú‡fŠ@X>S=ƒš‰€¡DÇeœhÇ+Á—ûPs…ÝæŠGq^š`ÛMFšêŽðG¸ùç¾É”awäuTÇGMU‡ï+x‚Ãt¨æ¨ÅÅ›X¦ çIô½gR5Û¨ 'VQyµŒò›8„«âg|ÂTIˆ³bðÓšgþ€_)/Lu]Â¥yX…çî9.hƒØ8j¤û•äls +ÞÔuˆæÐø7 %4p½÷r’Lˆz+¼ÿ8qºZC«°_á#'Idx^ÜÍ•Ÿ§]Xm·—JÁõÈÍÅfMUÌÍ¥¦Í˜‡f Ϩë§ÄKD}ùW3O°ð­¤õ|ôÁL_ã6½Í«‹4 âÈú0ú𻡣Ãuçøð÷M4ÄvœÄ{ƒDÖ•<œ¶•¸DÉ]&¼2|߬åPÐòU⸑§¬I¿iB_AÝtý–ÓÜÁ¦w`C+€ýpƆڼk§bŠ„8õ= – aQÝáõÝFÞÈT$h wö­îÞdƒ[ÝFå>œJºúåv££P¨qž‡»£D|ÎŒº6=f­Ã?VþI¥ö endstream endobj 966 0 obj << /Length 2313 /Filter /FlateDecode >> stream xÚ•ÛnÛÆò=_!œ—P€Åð²©ypS§'-œ±´hû°¦VÒ"©îRqü÷ÛR”,÷Öììpvî3»é$¿t²H&ežÇ UMêÝ‹„°n3aàã÷/R¡›álDùíòÅ«wE1I“x‘,ÒÉr=fµ\M~‹Þnõ¾7n:ËóWQ^MÿXþðâf9]dÙ¿”)ÿYÈy¥â4W,äÁ£ó"É¢å´Ê£Ä,‹$´û- +Í?ÎÔ[1\w$x¯mkÛ ã¼ù‚8ã%"~OReš•ç•m…ìPO³2Úžð~À/5þ{dD¿Õ}€Ì;0Ф(ãùd–æqZ°&µnÛ>ɪ2º‡Ÿ22¼°íÊ~±+°qóÈgö®Í WóèÁöÛî _X Ún;è¡1«ðêÖü ÉDômí÷½sÐÆgTÍ<’ˆ‰È—²€„Bc4}{¤Ñq*2 à1*ðüíõn:K£=kãÀÐ11ž±òY§IüX;ƒ›ç(C…2̪¤ˆ®[FŽ=!Â…ßj‡æ@ø…#|FÎÔކx ·ÂR·BÊžàÇïÞ^1´²¾wöþÐv`YºûLlBòy%ë-F "ÈóòHá}ovpL^²Ïx_ónÓa"¢±kÓÛ‰§³B•Ñû– „O qâÍéÂbK™¸Ó-cÞ¸—þÄ‘,ó`+ñÒVÜæÑYâ\&Fß‚³¯1Ã~åMT¸Š o®À¹œ;+Þ]»nÇfнöžr2ðiT!œd V“"ƒgy’ÀÇ®·õ¡Ñˆ_,¢ŸþÄåÃÖÖøÙ–—{Gaéù{ÍÎøîà0HqÕwüÛ‚ºà:î3#ëÆ.ü @%Y ˜ù£óØz±f·C?’Må°xº`#M£ý™®÷ûÆÖšclL¡¿5%ÕÒ…B»e‹âDáùØ.+ư 6A…&(ƒ б ¾AÍ1ÞzÓ^æU i‡ð®sr&TÁ–q]+¨²ßïI‘¬C­1_õnߘ+¶”3»®#a1mBà²òðeú7ÆûÁ ã*÷4©Ñz9Ôm³ÛSwN;Ô ëܸ\Í"¸€Œ[1$ɬ  ‘F±ÆÌFH­ãÄîÒ åᦀ’B„šBy«ÅRu¡\SxU!¬*HÒpw!¬Aõ£â…õ™, pÓm@,à ýw>î¿iQÅe¡à0:äBsÒ£‹¸ÌÊ@áÅîxåYœ'ù¿g…‚›*âX±&hØyÑg(¸uAÇ£4Y\¤éIôk^Qr*óhcZ ¨% ú^Ú:h2n/hrŽ-×ñ‚›'Büb÷h¸ ,%±<¹Pã2D–›õ)ýI¾ÕáœðCH!:Z \œOã‡p™£¼dޱÿ‡úSÐ14B(ãƒÄÀ«³æVÄ+oZo{yæ8Ï¡¶…$8Í´¸G-ðr¥3§–N÷gj£€ÇwH¦4Œ!€`6|6@xlYäav¦gç'Õ CO`ð|™ØA¥7S_Oqš ÄÃWÜI ñ=U.0¡b0è¹5FΤ·ÈE~¬˜Rð¥9ƒëj·ƒ¾vu!V~9ÿ¼ Ððƒ*Ýð£?Fªq¢æ#a$Jº¦á’õúÒMZ½Êç§aÁò°i­ézùÿ›×ñíûe|óÝ'Ž¥4V…z"yøâí›Ow¯~zóÓÝ;Žéª{úâŠJú×·7Ë_¾y Õ¸Õ­c4Öyü!ÒÙšsEàÿoÄc× endstream endobj 969 0 obj << /Length 2944 /Filter /FlateDecode >> stream xÚYësÛ¸ÿž¿Âߎž‰>%23ýæÑú.ñe§×N¯` ²0¡H… âøþúî$eúÚÉL‹Åb±ûÛ‡“‹þ%U|±Î²e•—›Ã³˜f»» |úÛ³Dè@¸QþõæÙ‹wEq‘ÄË*®’‹›Ý˜ÕÍöâßÑë½9ö¶»\dYå//y^DŸìÎv¶ÙXžþ`šË´ŒN¦¾\¤Åj•GYuùŸ›ŸŸ½½ Giúʈ”ÿCÈ$Îa5¿X•ù2Ér–ôM{0®‰ÖYäjˣΚúÀÃæ2‰ Œ“ÈzœI£_>ßðZÝ‚èeÔ~•O÷o$<¶#Îc& "Í¢~oxqÓ6Þùž?ÚNŽÀ|µ=­£Þ£r. _b‘dˤà;x{4éí–Ý¢ñfßžîö¼&ŠÂÛÅr¯„/Ö˜+=GÉÞÖßQ:g:˃ñ2r· ÍÞ}§—x³eñ3äQÛmÉ(a¸ke@O­‡´ü{0ýÚó 8ÿü¬™/?\!{JØ3säEÝ“øu Z(ã<úmoK Ö÷æ¶v~ïš;ž1üÓØ{äj’4jáÑ-³åõV8ùuü~¶klÏ3jH=°p²êüDp–»³`‡ÛlñtÚ[¼ÀÅDXÓl£¥Àµ~oz‰¿³FÁP7 ”Wv q˜ ?´Ø^¤GßÓñÈÔ+øK’9¸Äzg+–üŸË"Ž0I‚Ápƒ.8¶lœ4òk¿áÍõ/lÓL±í7èÍM‹÷KÒ©£±¢‹ ÜÔC²œ.½ÆK'Ñ8µdÅÀ‰5¥‚ £dkp;ã÷‰>ÃTº —ÎlÚ0§:/¯Àá`×5ÓyðÃ÷™ RvöØYoå~ø¸Â‚@ ß›$>c0Á«OAØ™oŒÐ+üPô±@©¢ˆÞ[³eÙ`‰Ÿ}g\¦èàǽ£+(õÊ] .FXØÔ'0máÝö² Ö«Û+ãé ôV)éÕóP`]ÔÇs¬œt•D¿ØNdéZÙàÇÚÎÔ´âåHƒ&…SŸÞ¡B_ƒãç¨cDý$:É1®g*'œ·î÷8É0ø²,3¯°ëÚÃÄaóñÕpþÁÊRF¯Ó´ÈžöÇk¶t‹vÓUí >Î ZµJ—±¤ ØIY¢ ~Ï8ÑPŽ3L pæÑÛ<^~¸ºY¾}ó åŒ2æ&@µàïöà‡`Ðë>r«¦ˆ„ Ϫ—eXn 7ÑÉV!ƒ›‹°{(Dõ £I¬pδP!!´XÒy8'Uq±L¿f³±G¬Ü-ËKo ›L!QSŸ¤¥–ïñ*!˜lš<òøÜMdzX­ ÍÃÓ. Ï1"KHÃT’’Ê]3ÁéLá™IƒGËŽ >#Ï+£½«·‚Àt¦0 $ ŠÈµ‘c`û¹Zë<öà9w7òË‘ŽZ*yšEW;ž´¨¦*¤}x e‚?åàЕظVíIwÕ¾å‘á(Np±UFZ}„“ÿ¼¯Å w¡Ò ˜Ú;Û™NzI”×—9w¡Fçu"©™¶ `b¸åO>$v\‹`z %ò%b³Ô ˜zI Æñhh\B\:ir¨yÞ–Œ¼”²¦™ÛÑ+êÛ`—»SÏ,aÒþàVgÁ.ºY8á¶r·¡$¢ŽÜ˜—:pèaሜ\ý'‚ ògH ñži|S>oæF!ôUÒ>T*‡ËÔ²1Ždyñn]\ó¸Š+ìJÃQi¾,ã5•/³e y8TíñeÀÎ6îh°]Ã}F.¤‰Ñ´½X­²Lª&¯F<× f¥‹ #†ò|Hmrv&W¤Ó®œ\šA°‡ËÜa-÷r)n`Î6bIt0YRŽžTËÞ;®r`ŽeEªY‹) +A<ü…Èæ¸7’ }ïUÎŽˆÈê«ù“p"áLVçüŠÇ§a+2[ kM4ò¡Á“£Ïõ¼LÁy¥¸=9÷iïg`˜u˜‡ú DÆÑW!ÿÒ%.*—KWË,N¥Ë{³ørýËõ¯¿]£1@A9MÚ§¨…÷O'¦8"ÃÁצ½Ÿ«7€ÛÇOWׯ¯>¾z/r$Âïg*˜‰ß^Ù…#ð 'K£0€ŸˆSø‹Žˆ¿o^¿}.;;þÝéòøn¶C²}þôÅÕ5µiW –TDûl»ïn#'SzKœ¹¬'žûv²*‚ïM£Ôh¨_»ÛþŽLAÿþ_õ^à endstream endobj 973 0 obj << /Length 2891 /Filter /FlateDecode >> stream xÚ]sÛ6ò=¿Âs/¥f"–Á¯{jš8­/›±å63i`‰–8‘H•¤âË¿¿ý RT®ã\,‹ý^(¼ à/¼Êƒ«4Šü\gWëË€ ÍöŠ'w¿¼o ˆKóçÕ‹߯ñUøy‡W«'—ÔjsõÉ{½3Ç®hË(Š<ýïÅRëØ»+žŠ¦¨Öƒß›j¡2ïdö‹¥Š“D{:X|^ýçÅõª?:Vêòˆ˜çL&.“a˜ùÙU’i?Œ4óy»ZÞßý±üõ~,ª ð¢Å2 âÀ»/š¯%r«Ø{.»ÏvuÛñ¬2Y5-eÕv¦²{þ*]±¯Šî%šu}8˜jÓÂJˆ÷¾—aä‡ñˆ•ÄK”¤±§ÿ)/–ƒ¦8˜²*«-ÂǺ*ª®öç=ܼY,“®ËQUù÷IN‚Åùmã X~¸»¹}}óáÕoŒœëj]oŠ ?úqóôMÙvÀXÙîìâ ÀOwo_óL©8ú|A6ïW–·¯Þ_ƒpB8(•o{2eÅãSÝxV?ñˆ{y†ÚOÏGUþÖç¯S[4?=Õµâ;SÕ „ëÛÕõáR!ˆ0 €£Ôv]囲-¦-y8˜oÒ{îmÐâ4I¬àÉ_A¨LMø9ˆî‚‰HøÑrwÍâÓ©Õ­fù1^‰tPTZk3!ÁпF';ùoþìörüÎ}BMäè¿<y]å)+-ÃIÏã2–ÖØ=å[ôºæËm U˜F@[ÃwOÃÏÏb.Z~îïaz,çŒáæ– œhm0Â&|HØLC±ƒŠÿH²N ƒ±Û¡#àLt¦ôY…E‹ÄºÉ»¢‘óšÚ®•r¾,x[èuË­ ¨Äó04è?H½g(€hj%„ÀÖB81¼2#Àf1`"ò—æ±Û Œ­+H˜P Gƒoè׆¦Mp\Ç‚¨°?°ÓqŒØóŽ%²ãOÁÕcA‰CS4¤¯‹xÜ—›ï;¨%§a+ÉâAK2çÅÙ+E¢v ¼UÑãÜO´AO#±1°PºøF¸í^–„“T8A£¿è´Oõ~_#Ïäô*Râ5Qèø%@Å…<ÕÑx“ãëF[B¨,+)¹„¥ŽÏ(ÃVkäu7Ù0 H¿exsª0N½¼`"™u, û$Ž ±«!hð|úüõ¸YÉ’x;ÎÝ=âí%WäÐhO–Ê5'>K‚gl¿0¹‘Äß@×sÙ{‘d¢9õ¶ž±¨qä–I`Õ‚ë L4„“Ÿ‹†ý`_|cȶ½ÂB(¸ÊÂac[@ejº¢Ç>Ë ´P;ûf”àu`]A‡ž9Ÿ"6¬zq•¬Á-1»–_%ÈáÚmflå|>n˜˜4â³ãŽŽ$·t—D¶Dt’Š Y„™kˆA%Ñ™Ò5”íE‡´Ëƒ!%}ÚˆÁ¦ÅæhF£r$‰†ªÚÒ51NƸ28’œxA=¹QÆP‰mhÀ@©¾8ØR4¢øjƒr»7­_,¤þPFåTÄÒ3µx¸:\>ÌËí©>µ£ò+t™¬÷l·ðcJRÔ"Ò¤ç^dµA¸4xxæzxÖ»g†­˜žŸ™yOM}à™nÙ/ÜuÑpÀ_“')Å!ÇR7È{( JÞ5FšTJ:[ EAÆýŠj]Ú†C4 :GšHšÈã‚ê;l%/!;HN“MêßAxã)${~G û¨G 9šòGùü´/¤ˆ>¯òÜrûî-*ú5£âƒÇŒ‰„½è°/ŽÃü¼W•BF~ãÀ™±„ʬ€rì˜JÍããÁæË6uB8kж`Û¦«:´‡ÃùåÜ~†°Ci‡2”$NJ1ìšXk4õþ$¢ÕX@ÈËÇø5$ƒ>‰ð¿æÞFb?U™ÅøiŽFæëìû4r_'¡ÅàŽ^+v¤ÈÛÔÒMi5°ÁµbX/”§­ ?OæJ/İÓÔS}¡Žœ˜0k9ô¾kT*±ˆ*9«ÞDÎH·ïnÇå?oyÁ†•8íƒêc8¢p¸A»j¢Å˜Ä„µ]rÙ 8‚ºcÀ—ŠÍ¸ò/Ú“¼tÅ\¿š†M&–8êˆ3RVlOÂ…Õ˜ÒTêFܸ¿pJFÀsIfÓõKìȽåos¢¤KIkMQp&=qNÒIÿ €Sò¼ÄyÀoà2Y¬(À’£qÚvv0‡£ÌpâøÀÉýäÜÿå|~%•P&–G—6ÝÚÐYWT"bÒtDf“æ$³­Qp ÑHóè­P’{E® £$?¯E¬h“Ʋ*»’\(™²pÉÿÀmâB¢ª¥FÙ0„ëâD(pržf³ì\¿7êŒ9[qÉçó+÷E1ýñD)åÇ:¹RAà‰¢P i^ÁWÿBE¿¤Œ!îO*vÿÒ!0óÛÏôºÂ'~—¤…UY«_î?‹ÕÍVª&NÙbÐ2_—ýË¿ÿXìÿÃì”(1+ÌHŽœòk™4ç÷·Íøk;¾Þ }Î )œDA¦øB¯Ë™ö#%*†©¯|(.c(wo‘¢¼ÓŠC¤1—¼Ð3’Ϥ±qf:jê'ö‡­§™q~жmOmÛÞ0T:¸È&6¶d~²¥TT–¹ ÂL-^0çY?ZÔ}\t(—ÔâõOj^À^Ê4]‹¿&üÛLxég¶¨xxL‰õÜíÚ»7¯yEÜ>¿³Äz@u»u\([K~[¶ÐÖ›R¨ˆ5±§¤Kˆ#›j(°ò¥–³ÑĦ£óŠ”ƒLp¶þP:3i̯´ø;ÁÝ$AßãI‰wÁ¸O'H_É8ûãUyH†j¿Ó¾+ÝKÙwe¹Ûå^SÞÙpœ^@îå¤íÄ5»a'hSZÙà«0—»ãÆv|¢áAœŸó†×\n™€íéH#´œzzævÒ2ª$s[F•äöÁ¡nðIß;¹½!Dy”TCºqß»‰K¥¼¿ ²ÉL ‹!¨"Ä>àNW7gôl¥•‹Ó"lÔgŸ£ˆÝywG!±ñ¹#ú܃Æïæn$â•hà+ÿØn¸Ï'u AÔ%Ê-J°ÊkŠÉ²5„LTl“¬cô“Íœ=Ö¼om¨§×“ª… À>Ò •)a1°/á/¹`—@¢ÏI;Ž$Ï5­ûVõÏ88ã(è,¡Dkû.E¹÷þ|Aãÿ^ªÇ endstream endobj 977 0 obj << /Length 3247 /Filter /FlateDecode >> stream xÚ½ZYÛF~÷¯ìK(`Ĉ7™7'¶oÖà™ì"HòÀ‘z$nx($e{ö×o}UÕ<$ÎØÆ00jVWWWW×Ýö®6ôÏ»Ê6WI¸Y˜^m«g†¶û+¼ûþ™§xkB\O0¿½}öõ«(ºò6n¶É¼«Ûû)©ÛÝÕ¯Îw‡üØ›vµ‚À ¿Y­Ã0rÞ™{Óšzkü&¯W~êœòrµö£8Ð[ý~û×g/o‡­#ßÿLùi&ã4t½ &ïhßÔ7Yä” ˜ù°ò‡ù&Ð6ZÇç¼¾Pw”5Ûâ·š 1"؃`ô#Àü¸òœcYló¾hjÛ¦oˆBâlWkÏiJYsßèŽiß[Ó vwÚ‚ðAær…ö¦¬M¯°Z9À®$:ÅÚ \/’~kÚ?@Á”Ü…™ó?©³mªŠÖvüp(†h²=Õ /zu]o*Ûâ}Qš½é® zbšHÚ®×-ø€Õ‘OÛÔ†ïºÂož¯ÒÐùE>Æ[ Uççðä ]ßõ^Ôæ«CÓõ_a:EM2î°SoòÌ7÷ò›ËÏB¬„É<©öÍor+Àb§|Êõ¶.˜ùúUBj¸Ò#¨ñæoq ¼…nàú®¿ZG±ï¼Åy…=’PXI¬NÐàöû¡8WLœ6qc«—·@Ó¢&®ëmq„rΠ@±O˜Š0 — •Ëï×û6×U"TÑôã—¥P.¤%8Ž^amŸïÖËhÞöÝ7K7÷Û&ÚxôÇ#DÏSiК¼¬dÈô¦s?¾øNEׄåé4„(Ù)óy?Ü/WLµíÔiÖàU 5_ÔŒ6äã ½½]ß¼[y4úûzÁÄ^¿½¹%;ˆ6‰š FÌj´Q‹TT&yQ‚xª^à»›€È3Ý¿,éIä&~j1þhïúý"¥`ó)Bžçú±Å`'2aÚ!Ö ëÚÉIDj3,FßìÜz»,•Á¹@x¤ç™»!=S’ë߯wòíÖq=õ+Îî™%y®ÑçH=Üvä;¯V)9„V0ÌǼ:–æ÷š±f`“'-åA(‘^‚ÓÊ~v¶a€ÙYvdÏÁÐí/ß>wß¼¾u_¾ø™t-†!õ‹ èããÄÖ7Þƒ vß ð¾m,¹ƒ’`Ÿ{±u&ÖÌE˜KÏa >\‘õCø¼ôC€’,)6£0ù|Í^ÒÙ,u³ {’jꦣ!À3°˜áH üL¼Åí0rãðÿd‹ 4çz‰Fìú^öù4þk⛑}*›pè'n¥—~hd| ™Às14ÖÏä1 ³ƒ žŸã—fåolȦ‡$+¤sÂ1d½êa2¶¡48vkR:½`ª{áåÜtãia)p«Âǰ{ÀvŃ\BÔÄ”]é^ðˆ)¾çÆ›ø¡ á“DI¢¤…I0s ç… êQ‹Š]Œ>›ñOX”÷›TÇŸ¯üOÈ.LÝ$M?ŸÉM¬¨F“YH4×^ºai¾Žùf ÙæwRì€ün'Ù1e˜¹üLt ŸšÉSJÊᘠšƒf¦ü¢ øT£^1O%©Á4IM([3­ÚUÛt²e rÁ¾ß;4··t*“× ãz(L|ç=Û\[Ü?ˆ· 9H­;ÝAÎ?ͶW*͵œ#twªŽ=rèFHû¨ÎJLª Ã(qÓ4à ÓLW@<ŸKÍ9ä¼.ž¬].9-Kí†8æjŠJQ <ç×—ìÞmSWê Ø=ÒóNA'ø©K8(,󽑵A|~ *ŒÜ$Œf§z¼n¶ØŸ8È9щ.‹_Î{áGn€@Ö«õ¸wuߢ‡<kN¬¢Qई’fSJ¢ŒMrÅQR®^©$Ò_¢,Å;)Áh4áBJtÆÌ¹¥Üçš>Z³/¨Ìm¹ª“¡üMl…K®ÈI-.Œí$•ôe^TvñèÕuçËÌ š oy½çl€@…%¸{¿ŠÐbÙ¢dˆÜtÑ)m±¶vªr›¦è.ÈÝ¥ä±|OD¦%fKžNU&pº‡êØçä"¶T‘?xh.…¡Õµ§t–hæ.ï„K˜q9Vú¶% ®·¨Á¶¥‡’¶mÄ혂 LoÒÑ0iLIW‹LÒ é]î¶©±ßþÔNHRš†@’…Ú…›dDc¬ã@FN¹‘–†„ A›5O´ÖVÿ"™ayÚiN9CZƒÏP’I  =8Œ§ûâ»*öíuás’sBoÚBw°iddÓȈE¤”g÷a— ýõøy|_ -}U(Ó¾ïÛî\Å—@IþÂFad-ý¢”Ëb7û’lÌ~½DÉ܈ôééêÍ‹†åØá£å² ‹3Àrg'ž)>—ýW 5Aìi6Sò³þ i# í‹„^" “õª<±–±;O¼x¬âs•ˆÅ ¤37°ÕÛåÃÒ¦Ê%Ÿ9×éÖŒÝÐp4B/4± W%:ÄÝS¶NöÑ÷ÈŸZnRðð±Qš–ØotY©n…Oúþ‘ƒZ`S`1‹@Ý>\õ7Ûóó?ÕÜU§Ès+,»F@­aW™©ç£ß¾=}áà“ónw2 éÒd%äÐ|•K:`ëüÌÕC6TGžzAkj»õ¢Gݽ\Y´±A)̜殧ËãK'8d,mFlåè|£`h†»SA¢+-Tãé¾-¦ÈÐzÊ;’¢€\êë‡<@ M½àðõM#…˜NÂŒxAûv’Ø— ¤6ᯕFKy~UôÄ?®$TJp¬ï®µ´–×tÖ° $E¸;4§r'ÄꦠU‚äüžmrÊkéžH#Àˆñ¤ª?AÇŒHSV¤Ø¬-#{@.ßì”P¹¾«0²½O($Uœ®Í7c Ñ’\zú \s”j‹”Øþ^0!¨ƒü*Þìâg±bÀÑ’Éǘx#s¢­OR.(ÿÝ*Aˆ–wêi~ì”´º4_Ò¨JüÄŽ*»32xR8 õBST6cêššS¼Ù¢©2~yòi=àgŸ¯¡žCÁÆ5¸”÷üž¹~€$â¦gE²NjÇ$êGI¼ùùæVFoÒÁàïŒ|ug¶§ö‰ ôÅÛ:mºqþ8}ßeH­Û÷‚Å•–gEIÑÏ\/ž`’‡GÓ—Í(™%ÓGìÊ©~Oô_ƒ2ªŒY"˜ç·ú„Û Ø–“ã µ,¬_jÏÍ?ýü·âØÖឆ‡!I£þ<­õ`CÙ…Ô‹{pt—^êK\ís 5ßÈ‹¨þ¿™ kl+ôãx²]2qбhVt Ç&@(S1ÖkÑ7»MÐ<ߣ^Œnõ¹ÞY)Š©ñ©›>p¡úØÜ÷Ü EÚÍ»EÀŒ¤3ŠDz?è럾n)…å.:kOÒëNH5+•õ™rþÐ /Ò,€¡‚ô3鋟eÒù¡_X¦ÈthRÕۙȫ†3šSÁKª5‹H4™‹þ7ÐW¬»B™Í!²l” šC žb•\×}S²´1îõ’Kn÷~ŽÅ·j4 ™ V%ÞZ,JN›ò4ª Ë"Nøá†d¾sËï»®òEÅኑ5ºÛò£±ùC~§ò¨ß“Œ#ŒÇ "ír­éÝ/´m8ØhOµO‘S*ŒÂŽ5cE)ÕUÚ çn¤6Åyk[söŸsP9v§²·-ßï¯Ü‰ endstream endobj 980 0 obj << /Length 2740 /Filter /FlateDecode >> stream xÚ•YKsܸ¾ûW¨’ƒ©* D€à˹DqYŽw+k—¥[œ*A3 Ër–ä¬W{Øßž~'±Ë%l4@ãëçè‹þé‹<¼H£Hå6»Xï_…DmŸ.xðùý+-|+`\M8ÿqÿêú6Ž/t¨ò0×÷Û©¨ûÍÅ¿ƒ·;wè‹örEQ`ß\®¬ƒÏŶh‹z]0ù_®¾4YptÕåÊÄIbk.ÿsÿÓ«w÷ÃÒ±1ß¹Gäüÿ›L2«tdy“Û¶ÙÃVâ4Ø6Õ¦¬Ÿø¥ß<8vE»*h“p ê`Ã3µÛ Oßð³jíþGÇŽ³`íºâ †I|+û]sì™õÇM×n/uд{Y; X%ÏÌØÀNZîa˜Ø”_Bm×n…z‚s¯t¤ţé˦îX³ )ÞÂê¦.×®*ÿp8­ð³ëÛ´©Ô‚Z)´–³«"e/Wqb‚O´Ã²^—Û„[ŠÒ8ø…£ÛË—ڳйªqk©J¼¦?‰”e¤¾Ž‡kØtÙõüÒlùéøÑáŠ_2#C׃À§µåÁ·]¹Fµíx²ì˜Ü r{ÒsÍ3}±)›£¬L7σk»BBã<¸…Û¦½šéWó!îve·+1³ »`ÐPÒñÈñã ìûcÜlþÂÔ-jJ¾åçaTŠÍ#¸Ñl“âa©Ø£˜GºýbÃ4(Mòe[,H´ŒÒ—@aåáæA'êEMæ!ÀoÃôæ€xqUõÌï®ê±uÀ -\µ—ïä°ÂÒÔÂÂ+nãÌ n™*˜w=¿Òu¡`÷Ïj%®ÙöKÁ[œÿ\´¢™¶èÇŒü÷ww«›O˜¶/®.»=Ï ãðó-Rß2Î DM&r¡-¸ «&Êh± ÞEUìEóS@ëÕqƒ×ƒohìeÍc ¸ µÅ¡-:‘@vÉt× ƒ“OÀ+‰[!¤'à:Zöë¢ðþ*g7†»^ Û^R–hꩬkþÅ–ÕÑ#î ó¥½!‰±Ê535€†V lî#^²‰59|î›V(šØŸ'Öèoµ8@@‰(ñoø@Øž êáÊXFS/ÉÖsÙ:á —é ºÑX%YW9-öœ—x4ÀD@‡ky” †Ý—#æÈ®ñ2‰gëÒ¯N~}S´„ïîM:49AÓ{Öj¯ž5J<Âq[Ih§ ÅAL»u Î¶cÚÃߘ ±‰O¸ žñ¶‰DÇ$Ö– „ä‚]Ï\þz΢j¿ãTï„8Ö¾.Ø;À›HD‡³Ã-JM¦aT[«2“ÁM“hŒ,KÑ6V©I=Ó¯óë±éåó¹’ðîáTÿh{¿QÚâŒÄ’qR´0;ø( ;‰­NNª8ŽgáeI‹Ó¤„â“:4!×7­qàgàD„I$ ä}Mž7wo?>>ð{]|«ÊšX6ìeôèèÐ_»ƒ[ûY¬ɓ€N‡Ðª*–rŠ"¤F™&K ?¶,ewÝWÂAкÄ\ƒá2Iм‰-kÈŠ†¢qa$>zëbÝMB9.ä˃ݔ|—°)H)®¼çÅ-ÂÌ$)8øè‡`V?ˆôeàf*Í~ ·ýÿ˜¨<ý!y^žÞ¢ÜÈÀý˜>\£.w×µÀõVÉë|yq›*›~ש²©uƒÜѺá…óEF„P®¼`F²@l'„cny¶9JÂÙÜï…oStë¶ÓN¤QNOÌ´Ãd‰ß9ø‰Gš`ýdJ›dfŽERVÃHÅà›Ë^L–M’:ŸÉN¼saV…S>Ë&?EQ&«”»‚ `6yp#8f †-ÂÕZ2'mÄ=$`góP ÕÙ¦9>V”ÃËRzg¡´[†5èÈêÎÁ@kec;Á•òs¾hJQ Hލ±’}Žpð‰[åOã±%)e®²TÏ>»ßí£ûfŒî…õ‰87•ôŒ¢ŒQ¡þñH¨Ó¶2ÅÎSLÓéh•£‚T§/¹¥Õ¤^âXòå:óiçJ˵ÍS„ª*ž\5¸e²“¼Èø,{¬Ã  »Âl’êÌL†²œFwäéʧºÜ>ó¹ ÓToå™ÿÚ‡á|èfqž»äSkìpGP.“gƒ™º9›‰h“zÑ&ͦU0Vv2œ$â™÷@¯$ê’¦Ù²`²Õ¯±;ÂîÉÞÉÒ”S?äáo®Ä¸)@Y”ßA*ð²V>Í °2¥fÑ@¨)eG|óûP ¦äx†ªY>ƒ#@écÃhL³¯UªêIj“kŸÚ Uz†©(y|P§9KNêÅ Ì$³Á—¡ÜˆÌ´ÜÀ©cÇø 63µ&¼™¦=¹4#¸ “/bÉç¹1†à™Ì4v¹pâ[KðÁ2dP Sš4¹¬ŠlbÐ/¬ŒV‰LN$ö.ésù¾ö´Þ65vØžŽ\¸œkmåزI[À@þÛeCÀ(7üº>‘%f ³Î‚_ûæ+k®ãw®/áãSÕ! [SnŸ ÃØ¡<·‘â×"3ZJz†M°1v¾ äJ€ì(¤F6â{³gr¨8RYâîŸ×ª#…^óCÁζ‹ñ̄ʤÚ÷šÀûEŸÊÍ{&ŒS(‹rÿiç/ð°Záz¥×Ãj[VÅâê±Q±ÂékA”Å"á’û¼–[’ÊX‡vÞG{îúm9Œ¼úáËñNݟРÖÁà¼ÊijpnCÿIÑð\ÎÓÃ\ [¾>víuÕ€Äë¢__§Ò³Låy6U:,&J_ÉYóLÁßIs/ÄÄgv1,SÙÜÍ•²ŠÁ»þôñîÝíÝÝÇ_ÔÇÏïýϺÿ:Žåæ endstream endobj 984 0 obj << /Length 2096 /Filter /FlateDecode >> stream xÚ­ÛrÛ¶òÝ_¡éK©!HðÖ™>䢸iÓØ•t2gÆÍLi’Øð¢‚Tÿ}w± HÊT✓á.\ì.ö¾à3>>‹Yèy,Ñ,-/½«¶3š,¯.¸³Ð@¾X_<{íû3î°Ø‰ùl½¢Zg³[ëå.Ù·RÍmÏó,ñÓÜ·–r#•¬RIÛ¿'ÕܬCRÌm×a oþaýëÅb}$í»îyDÈGL†À¤ÇàÒ0D‚qO“‚ æÎm?p­¿ð³×Üœ…nø5x&7É¡hí½Ê«4ßÛú̘ç‚ù<êÎüH0caÙܘ+|˜„,ð<]íA ‘%Ó|ó@jwFR†2.„µWsn.iëåøðöˆAXE½Í+Ú;4RUIiPç ÀnÆPMÂZ°-»4|C¾ÝˆEšg?àçDzð­¿“fJ66!p}æy¼W÷t¤E.«Öþ˜¥¶lö²ùN*“*àºßå) wGK0^õ°oóº¢u«oN5´§yÄý–ÖIóÑüÁÂÚ/ðtM£’ ¡¨«Œvrƒ?;€`·4¾z¶¾Z>>WIµ• à Âmm÷é&oóÈ‹(¶>ÍýÀJŠ<£åð¸ßàõiò"ŠÀÔzEàZeR•Äœ[«ÃÞ0­Zi'ŶVy»+ZƒQ‡L²Fn5àéöˆac iÛØ»2Iíf—p;.Ñ=8Õp7²»¿ˆâ"“g§wÀKh þ̺ÿà.Dúe—¸Æ~Dí!2q9Å&P@©‚n òEʱoâC눋½És­õ] j#v} hj:‘WYž&­4@ƒÃåP]¸>58Ä(i¦©ÜkeઠúÄÇF2²T×ÚíÎå`‘©Ì?‘éÁ #zÿh©Ôá‚[ïêÖümwI{r`hAøC[Muäª6‡ôMë­Jö ?CRS*Ø+ ˜Â=1ú9ŽE’äVBC™T4Éõh˜Ñò,+Ì<í ÊZ_(Ó.üÈ+î݃Qׇ–¤}©¥ƒëL;Zá(\Ûú’ƒÏTÓ·hƱ&ëׂK‚>Qø èå8Mër_ÅÁí:£WݸóC¸“t¢Ï°ÐLê™qYC¼ý½oÂ~NÜÓIbÒIsØBdÒ¶ˆÛ}‚Öò5.^‚ œ»¼ùöœó(ü<àrÈå"Ò.*wõf™ù_ÊTpWö™J<=S}’ê®när‚ýczBÉ…þ¤pqñ¤vÒT| sä°È ¾³{йªói¦#Ð@èþ?¨É½§pÇPÀ¬Ç¦f{Ï|•/ ¦3úŒèZË$½ó7‚2p¨°3eB0á‹q™°¨’»ÂÔO&¡SL@…S¹•ß¡ã%ÊØ|)›&Ñ©úÉÖþÈŒNÈWUv¦ÜòŸnÄJ&E‰ž6…>pXðUñ9.óNÅ7®²\ˆü¿½zI“$Ë Å4:³ÁrS+š( ¼„x­S9 Ò ­÷óbNq–›sMÊÖ ÀžDÇðrñüíï—@ùù«WËÅjuûl½|þnus½\¸=³Ïû0uOÏu@lGÔ?REfûÜen$F íëïÖDlœïê¦í+ôZÑî›bIFæç†F@Û—ƒ`y­ó Öå¡#¬î&óæ´…ôqüÜáí •ÒN¾1Øw“øÛòEׯþslD9÷™ã3ÏñYZÑÛÎ,ƒŸ€€A:¹×åÌcnèÁ¬˜­.þ˜jª9™#<Ê÷LZ,—D ƒC߃(¤'ÏÆDÁ^o®ß­)»ûï@Ù圹<S^__OõHtß庮€œœ\÷Å›+r+©Tç~¹ñ8*uÔÏŒŸsÏg±;öó7Æ1©º…I_ï¡Rñ Û+hv¹éÖÁˆ ÝÂXPuŠ ÂÉ›€Ž™ÔÏSŽÈ–s­Ù{Z-—!BME¨»ØcÌÑW©ËRVY“¡K+7 ŒÏûæ ÔÃv¾wT¥.Ö ªêf¦P¦¹‚wM-îÊÏF,*/M/¢ ç ÔqAP8bwÓNî’¬#R&9ƒ(L¸©ÎbÔ%5ß3ÞÏ¿^¯¯W«ëwìzyu© ŸV²mkö7äÜMÓÔ«ÕöÒnðô´‹ïRÙš—³eÞ×2¯ëÂ¥¾˜yɆžn:KïŸ)ºzef‡9k2Íò f^|’fW‹å{\‹«ÅonG«s)³õà ‡u5!ÞHc€ŒŒ¾ÃWÄ#Ž JnE‚%\ê‡>ÏuwªÛþ†Ì~éêºXhµÃ¡‚P ŠFj…% Œ ê²pÓ$#Z”Ikzû³ÎÖ¹æñ9Îÿ†bqh7'ö;e¶§ã±0 bkÿ™€~YÁ‡ ¥¤~äh‹‡“G> stream xÚ­XYÛF~÷¯6¦“K²›W?ÄãqvìðLž’nK-‰ '¿>u‘"ejf˜}TW×ùUµ‚•ÿ‚U毥¼L§«MùʧÕf¿âÁ§Ÿ_Bç¡;¡|w÷êߢhø^ægÁên7eu·]ýî\̱³ÍÚUJ9úǵ«uä|²;ÛØjcyù¿¦Z‡©Ó›bí†QkGëõŸw¿¼º¾¯ŽÂð…2"å÷BÆS!ƒ õÒUœj/Pšå¼ßnÜ./mÝwoo?×Ì ”—7ˆ=? øØj”üÔ §d=y†ÜZ¶‡þdl«--ûŽá•ÆþÕÛ¶“S5eï×÷WLûL“:vW7–wöù×¼ÚófôÖnœ$ÎÝAv·vgúBxærŸBµ@~ ¦Ñ¤O‰$¬ÇÞ¹^Ž·÷Þˆf– Ñp3  áÛ5¹mßF|$»)χ3d7>*/ :£=í¥k7ŠCç3 üÙxI˜€?‰¼îÕþØÔÛ¶KW¤‰%j ½ì½0ó|/|>:O…‘Ó·¶©Liyfª-ަm¬nÐm¸dÉËÔVhvM]ò¨;ÈyØ-óÊopÃaY6÷x8\:¸©Ër¼¼È+KnÕØ],¸i$sÀ&h»õ–<6z}òù-Y(šš¼ª+»èÿÐÓ¡¨.òI Jx ìP^-ò&(ïÚ…\È+ˆµ=ïa”¢Ný%M`×K“l~Ï«2D=.1Õ©ûñ³ %S…ü ÜDAðu ÊØò,„Xfw†±r q‹),omð`P—4·rÓüv÷ÁMyHÞǽ©sy«o)åqÓ~;2"4¹Ÿ@õéN¯8Ù“Èóý³d‡Ï¶žØ†ýò5õ~  K>X Ÿ^¥>¨‡qœXmÍKS<1üáK˜2¯¶ùÆt2I6(1˜Çl¸V¤ˆ“rKÛYÕºé(ãèÆYb9ú‚¶¾æÂ³È¿œÔ{³}¬LŽ:$Êy8ä,O7¦µ<ÚšÎðˆ"÷Fç£ýY(X–lNÎÜO'D?V Y±ËjžqöÓ2™gàxnX"§r®ŒÁAÜK±„ÀùÎÍíG7M£Ì dáWdùñf$¸~wõþæÊŘ¼¹ïÓè >K·@©|ç WñÞÏÿûMˆÛΖTRÒÈùl„¢­K»$µÀJk!]êž'f8dXD8_yQ¾”fîAÆn¹ Ú Ã§¡†a4b×n„m®æPFP¯ë(vL^˜/Ã}g~ÕAŒ~EcÅ™ï¼{d*©áà(­bŠ‘%@VÚSYúr{Ù£'ù¸:Œ½0Q³üÁ%¡ÿà I Ãye–V'H¡¬$È%¤ywàÝÁhYÐ FÝÁtLÀl ˜òbÂ"å0$J;Ü×öÆ7²yD»ç»˜<é 0µÝß0Vže=ë ˜II¬FÇa^"v“ë‘X [>ô õÝæK^äcYªœËˆ{}©[êIgíÒ[ëå}Yöò¾ Œxo;·Èwvé‚Úëgz² òRà7ëÊnÅ:›|÷Ȇ›YœtO÷äY# d·\*\biã±$áXà%¡Ú•8–'yÅ»¦(kÎfŸÚû˜µZNBW^šŽÒWQuœð‡ÀéÌÀÏ…¤<Å®³¥,OHþË]úß»-·r>›ò5"j&½*`ùçcùzØ}äȃhÛ’zÜ1ûzWö[Ç ÆÜ Zg¡skíùóKE™ê¾7iFO0/‚=ð6üè‹o±ùÊôQ6œw' ^ç×p@XHW.0„(¡Œ~…’Ï+l\úŽgìöO©ùa,WO@ëhö0‘®j §b½Rì¡ÊžymÔî„|A±s¦$…ËŽ^ˆ$ÐÂò¸¨_°G«› <¸a@=‡‡ŸaíP?(h»ÆðÒΚ®o,^…Q½ãUÆÇ€ó…—Ú1í°ý#ø†Õ±ÑÚ¡(C‹(G†ÆÆ›ºi,ñšJN4¢\ç—mûᤠÛrÄ“ŸP¡æï¡îʸˆô…5‹½Ê7ŒÕ†•-UÞGžPµ€¯Ùnùɳd¸ÕÑ£7h©Š‚k€Ì)“°™žkç +- ¯eÀZþ€È{~È í”ÏŸxÏò ùÑ÷+9<®uöd%‡§p¬¦m š)PH† ©Y¥%Ÿ'Âï“ÇR/+©v;þŠù$Ĺ˓‚:ôaŒç´0GŽ![µóòzzYðµÊòÂ&‹æ A@V:N/L©ÒIÞØLêÄËÊ­Üõä ¾Å_5àáN¬—Ú‹qÀÄ[ó¸ðÆŸž\ý¢ŽùDÏ\¬áq2”KU<öt¤Ÿ«â‡ñ׆·ÓËß0I‚4Ü(“óÇbŸJ±‡:[ž6¶¤Âú‡ËmÖ·3öØK¸C¡§l‡À•"þ#BL`«F°Žšnêj[ØvÈ=ãD2d¿Š~ À>8¯N÷?Ž x(QØqúÉ·ªEìyGtBwØæ‰'þÓ ”Èž@Åÿ!‡NQ8dѵ÷ i1¥Ü59æ‘)ržqú¶¯$×°Þÿ\I¼ endstream endobj 993 0 obj << /Length 2452 /Filter /FlateDecode >> stream xÚ½ioã¸õûüŠ ý0 Óº--Úé4ÝM;³dŒ¢Åì¥%Ú"K.%OÖýõ}—;š£@QøƒÈGòñÝí]¹ðó®R÷j* “«lÿÊ%¨Ý]ñàñÇWžì[ÀÆÅdçׯ–Ž¢+ÏU©›zWëíÕ:¿úè¼)ô¡3özþp½ÃÈy4[cM¿ÓõµŸ8G]]/ü(ŽC'Œ®?­ÿòên=\ùþwÒˆ;_¹"C„±/DÆI¨¼ d"C]/¢Øw>e«¨Uä¼iê_\/Ü­îʦFz.yax©ò|au]?¾ï;ÙÅQ"¤’ ÛÆâ èïCXÙò·CQœe¦«êÄ ¶k¬ÉùD)èþ)ÅS‚ü8ñ" ŒZ[»¬À´4]¶lá²¢¤V@ãvŽ'/ ”¿òz¯nºZ„þJ­’\@k÷[TŸëtÈwà§Ä¢m;†ÖÈ8BŸ‹²3 k:“a†lÚêL¬Ãuš-Ð<­ÊZö¢h& ¯ûúfzóìÞrW£Ð\àÜí וsâEÜÞò~m qè k󦫶aã‘°ÐŽå‚´ÄüXyi4˜‘òØD=ž{¶?ôÔÊ_õ²Í7s8a®‚Aþs:ZD‘÷V*î-øÍÑ‚C¡L;´šÀ D80hjÍ&-pÜòD#ŠÏ×Qìè²Ò›JP”íˆsÎîâD­¢ä’± Ë aÏÀ|×<áU¦îëŽG¹AI@ñÀD®;½Ñ-¨ìÑ3EKŸÚc';¶FqœYaÚËFÿŠóøùa–D%€2Q¡¬@@‰œïÖ÷ïþð‰§¿[ÿãáî²ôöý›[\”µ··ïîÖw ”ú4«F =‰âó ?À¿A.Y¹E¥%©ˆ(¥àGÍÑfdÁ¦`‚п Ô‚•Û´ ŠÆ“ ’؃X{¼öœª+¤ZØ"VcKÓ‚W… jó]…4gÉ+2ðr½ŸDêݦaxîBL$S·jÌ:ï*!Ï£Et ®?“A ËFQ ºƒea;N'l¯ÜÉñ `-ÆG܃ñ‘n¤ãxèzá9L2ÎÌ¿Ž’xðhËPØ|±NÃXØ$Üz¡S¼ÛsP¤IBqÁÅà =1}ÁÛæX ‚Rv6hæ8ÈA)Ä&N˜MTF9eÇÀç²BÅñdÂddÇ–éŠØDÌÓ"röwPðL¨{.»¢9vâ(FÛ Õ_”p]½cwéz?²f¯ËºdxЫvˆjÈïBço× „’ªÌy›øŽÄÓ:«Ž¹ùNÿ[,¬ÑùBBX yù熽ŠïÆ ¿Ï¶ì:4[œt²­+úåñ«f½Xp¸_k‹¦Á•÷ã³[ˆ‹GkgY_Þ²ÑÙ“©ûtñÏUCä‘mõ•Üñü7rŸ ägosgŠ Åì¤B¾†r¸ òxÛã'-¢åÍ)`ƒ#Ùÿ7s\DÓ&Ï ^Ó ý*&B<ÜÅêA*ÉcŒS`Š04=‘ÛaR<@rȶ éÝU®çŸ›øÍëöÐÇRç•¶;cy\Öm¡H¤Š"Bh²§Ôxâ …*®Z3Ú~³fÐ $h1œ’ V `FiipšÕ*p~¢¨‚ÄQÄ€u]Ϙ¨ùUï!x«ÿ.ùÙqY‰E/?ë¾JÜ뫱™ 1â¹pV¹>ðè)ÏTO`cw Ìôï‡úS/aË"Óê`ö_¿çëôf:+Ì/^dÍáômo zo#áF!¸Û"b^dPH¢É c ©RY!EwX¡bœ‡¬Óyv°2³òÅ#ƒ9fŠæ:lÍËö‰GhÔ­i"õ3NÆ,±ôæËivÉÕª°¿DôÈ~„n_]ÁÒHÅ#]±“U· ò N$_AŠB¸‚¡I2,ËuÍg€Pê ‡ªFdÙ8ò†etx·-o¢îÊÐ JAÒP•ஆ¾DðÈfPeºž#´EW˜m¨’± ~ªÅæ:"–°T ¾ÓÌéXBðHtïOu³¡„-bò§þ(‘ {FãpÕìv&¿áôÌ•”‡"\´m)6îÁ‹!VÜHy±å/WÅp˜Â:V|3áÈ„ƒQT0a‚š¶-Yfz.Ê~È&ƒ1²àìL 0§ôŽßšûBÄEþºâ –¬É™a°l;÷‡TØ\tP£SÛ4Í>Õp” ©ï#4m¿Ò¿qAÚwqû2T“šïò-( û' ô‹/8i¨ðmôÿS÷ÃÐõƒó©Ñð°ãAìÂvyAkIqWŸ›q§ éÑtᆩ]–b*H•›F3aH¹¶9kcZQm'H9û³DÃ…¡Þ™½HíyÑoRü:[¸¢Çö=yn¢Üà›zJþ'zJU‡S5áÜlã¾ðü@ùn4ß|ŒµûÃíú§ïîŒï¸‘˜ª›;ðò>êøÝ{îYçå~|1o mMŠÀc/ò½´ßKR‹ÿÏ?×£zßx5õtãs0WYøxŠOtø-,À"Ò´âú7‡Ÿºóª+ìóú¼VýXÅIúM!3œ‹ÿ¿ù)ðÐT endstream endobj 996 0 obj << /Length 1200 /Filter /FlateDecode >> stream xÚ½WmoÛ8 þÞ_‘oq€Zgù5Ðw]6ô°µE›8ôúAµǘ_Yiç”(»vê´»phÐÐE>|HÑ 9ðGg±3‹<Äþr–”'ŽÖŠl†ÂÍçjìl0´–¬O~û3êØ‰él½ºZ§³{ë|Ëv’‹…íyžåXؾX7|ïŽê¯¬Z¸KkÏŠ…íaè[~¸xXÿy²Z÷¡×ýIŒÊòÈ@úÄóC×€ —>¡ž }.ì t­ë…G-&XÉsè¢ÀÚÔ…f›ÃG;LX¡1¡®Éùb£6ÄVUÃ÷Ò±’º,Y•¢2oP™å j=-ÜÈâÕ)¨bjÝnA¥Ö©¥%4”¢ÅÒ¸+ÙwEGm³õ­ÒÖ{To™zBÿ¨aÆKž(%º¨ËV@æUf‚*«åÀ tÀ¤¹Pë[®ˆÐ™{„˜xÊ7l_H¬ªà¬(Ufžoaö „}JiÞì ²E›\íêû>ø IäF¡CR&kÍìe"Û—!7¸[“KE­S©Þɼ®Ì2¦×ʱ',.Ͷm=íWÑJLÝÃaÝ!õ%hj„P¿5,ãÐçÛwŒ–ﯮ×W—·„£9ÿr±º\›‡ÛÕÍÝêæA/k(ñ Á ‰çPômoOÑÚ¶·¼ØA£QàX×"¯$. ZIšr%ð¹Õªsv×;{‚f‡”ÁŸO¡Ñþú•i—öÊsl÷æÃ(Qè´òFŠºíBìÕ*4áw® ¬r¢¨5'”˜°dËOu×wHà{ã0E^æ’Ìm—DÛÅNŠœWҮร šáuSÛvÃð í tÔÊÿ†¦ÛÏêÍ)2 Ä.ú|‹¼‘]ݾhù_dŠj“ÕÑ´&SUÊ©žø…\ѧ ž?«\]W|ýð’lçý[û ƒØÆ²>že³ãI¾uЉÜO!M¦!õp`/eÝ•@ð„W½ `ÙcÁ‡Þ'ZCÍMœ™3-ë¹ÒÅ¡š¡'åûl”Äq4>kŸ –™ƒæÁû-1SpúÌUhêQ÷hÞ=¶Q[£Oú Œ¨ä†þIƒÿ™|¹jÈÿÆü0ã¶;÷SÙ¶ï> òjB ç4¡“§÷Wê:uð®ð’ðÖÑ ݳËß¿®vì‚s­FlfÌ*ñãÔÔ*ê ÞGaBmº8>Wý<† ·h5l[¶;~¶Zÿu½:½×_pëx0 ­z3ÃØ6ジŸzwúè´æ9 BÑÕ'ƒüH_Hèß¿æ (yÆ¦ÈÆÞîX‘›ÍO¬ØóþÅ™ûÔøš3ÞÀ|Ž÷{è(øµ1?}±Ÿ£¨z¤yyU6S}ØíVmÒyðà2Ó»Ù.ÓÀÄ?Ü«þÈ:ÉðùÌëÉšƒX0ý]mÎD²©÷bNÞº ðA—¤2‡Ž½]ß\\~Æ*;Öíðmû¬/ñ‡¯¼'U”\¶ÝÕ·Þi÷+î£âÆC endstream endobj 999 0 obj << /Length 1321 /Filter /FlateDecode >> stream xÚ­WÛnã8 }ïWä-P«–¯qÛm‹.¦´YìÃì«ØrbÔ—T¶›ÉßeQ®:™.°˜ÂJyHR2XðNBk8 Ýù$ÊO¬vU¬&Jxº9¡¨g‚¢ÙÓü}qrvíyj‘Ð éd‘ôM-âÉ7ãËšmj.f¦ã8†{>3]×3žxÂ/"®–ïX1³çFò™i{¾ïn0û¾øóäjѹölû“¥æG~¤X$ƒ‰?w u\…”ÿؤ‚“™I-Ï2kçÙžQ§9JÕ®¨Ù%çl§„%—HÁ³IB=eJðŒÕéžûìÕ%ZÓf«š‰úÝèÐSÜi¢õÀ&UFY¥ö§¶¥„uÙˆjЧJ¡~Ù²*³¦æŸ7fQÓ²MËQ –{nyç–¯þúrµ˜%Ê„|Œ4æ k2 $E£ó>D•´ÉÀ6™Òn˜6 ˆ웦à,Ë/žO·÷7P/êAÁž9¢@j5Épi¤à[³N³¬³4áÈó†Gi²ÓçA‰-3Äœ¥ Je¢‹½ðZyE{›o²”cЫ4¨‰vE|Sã~År~(%IÈ:«¼ˆUÖ”ÍÛäpÄïÁèrUmÀ)Oß+4‚a´ÔTýl9ù?+­W\¼qa–‹ûË»«™ºm­å²2.÷¢ì!³0ƒÐKYüqr”*Æ[ĸÄ`ÞX–ƇÉö>ãFâüÙô\ô݈Í=—<*ó>>Lvžó8e5ÏvGY¡2c®+€lHŒ`x-1Òˆ¿3 ¤Tci*TJ`„d k€Íœ‡¹^¬tå_^Õ˜‡‡"Û í%aqó<äi5(â°Y ýí(Oäû O=JB¸ÿLÛ'Ž…‡ Bì©rS§eQ·ÚŽKßÙÁQY$éªLjšIšñ‹ëÛ¯P/äÏâ.½htp3%Ê\Iò¬gË{zÏ_Ô5¿ç±m¢wJ¡:ìao,–é,] &v&†ßu©ïX–ñÈ„fŠ^ï·;$ =ܦÐÍ5Ï¡J£#D‡ÿÚa|mRÉ` ¯ RYL±¼QÆf>+ŠÐM«¢¬ %XئÞ4ú¶Ò$è%C>U°/Ê$‘¯]”Xóù> ª]è“Á¦V¿4Jý?ÑÁÚw‰õߊ´æ}Wm‘þ–«Ÿ š†¿¾/ðšÂQ±íY_ë8–,zN”^‡‚Ún,Œm§!ºäHŒGIðÖ‘.¿e)ÙH] Ýöد}·w¼ÞôhÁÏ®xÕC㻾-̦Ú €é }uØ%¸ñãqæØ0oaCÊ@MÁV¨Ö)ü•ÙáÇ‚ÌJH¨ß ðl1Ý 4ŠRýnz&åßL&M Õ¨XMtF! êª÷ õÑÕàÉO=pK¶ÝaP{)¡âTyÌR`n8$_åoûÀ‘B›A€ÑÎt¹àä ‹¸F_ÄR˜ƒPmå¶Œ«-7 Cb»{•I ¸#Û»F~"á]#së¸0T»ƒ^ä'”¤„±«Ôмõ*Ý NÚPú;µ#ó—áS ʺ²|bá§| Å¬.j3±j`dI‘ä¾ÜÊJ ‡¨Ún+'Wó¡%Eà#Xï ÓÚ7%­©Cæ°Ò"uBõ¯Š­ø¹~5©"·|{x\Ü>Ü?'„èËŸÈ~úà endstream endobj 1002 0 obj << /Length 1399 /Filter /FlateDecode >> stream xÚµW[OÛH~çW䤪o‰‘xÈØe %‚tµ‹Ô‰=NFø†=f›¿g®Ø`PUi•OÆg¾sÎwncŠƒÅ$)\¹Ûl'jqóûÖr:=ÉßÖGça8Á.ŠÝOÖYjNv¤æ´™9¾ïOƒã™áô†f´¡eBÕö)gÞbÚ‘|æxaÓ`1»_ÿyp¶¶ªCÏûI…äk#£¾‘Øw‘“h ìÊRg÷q‡Ã©ãìh^Ï솮;]5¬äê…Ú+R¦jA0.LÕö5Ö_ë‰6-«Ê™³ˆá;t0FØèxò]O³Yˆ¶ÇRÄHôçVqÎZNË“»óåÕÅå·ãûåééÍñêúf}´þ¶:SsŒ8ÒXAÜVÉå­‚á•z*0µÎªF-;Ú0ª%«)ʦç¤`ù^í²öÙÒp¨çûÅê)8Ô‡5¢Ø‹µ ,ÓÜlZjHã;ªx­d‚”&,¥šÕ–ÜR¾«Z¾Ù—¤ ÿ€±‚xb¤Þ/M8Ò´¡­ñ,Àó?hÛY™²„pÃÉóÆ3?/<È«~YX¨íYá”f¤Ë¹õW±õáø6ÚTíQ—ÖGXèIð¤>D:µ>òæx¨Öélê´”w,=ù²¼:›9ÑB“É"–\ ‡Ë­úÓÊdÑá˜Zt­†”œñ=Éi­w}yksÖÉíÈü&:eåðÜH´SÖ’M®z†éêºj¸NFdMÞI•e"Öcœ;ÎÐ’±œžœ_\‚ßÁÀþF°­pÚp–ÉPëwL ã¶ÀítX6Pã,Û«ˆ\pÈD'É™Íì|k @§ÌêìÊV^A¸ár8ô°zžøÑ|à Dçɨ§ög´ŽÓÖä}Þ<èšïñÖÐ'H}n{Ÿè-CÚ’Mž›Í[ô  CùÿÅåÝ¿ãÜTª 8úKœBÛè ¼`üäöhÙC Éü™R=€xC C•n“]=$‘ïLŸ€‘±Y$Й í{$cò°F Ö]SW¶¥‰Úr‡JÓÑ’TªÏ¾îQýýº‡¶Fªp8¯¡ƒjÆ«ZdÑ;Ó0±--©ÊŒm»FæÓ‹¨xýµÕ·5LŒÙœêÒTÁÉñ°=õGþ¦zäWi—PÛÔ+i~ÇëN'ÁhK¶vÀ « ¯œôÅ|feÒPbÄIQu¦^L/ÌJ•€LLíwF£õé±c¢»Ç1´’Óª<Ôèuß9›f)#Û¦KF51í+z£KÏár ƒ €¤„{›ãÁTˆç1,æ(Š#u8@ PùÓÕÌ÷¦¤Ñà òçú²"-”Q Ã«`&FØÓV9r½¹/s]¬¦2^bGTšx~×0ƒ;å> stream xÚWÛnÛ8}ÏWØÛ@¨ÕÕ± ä¡Iœn/i‚Ä-èö‘(›XIT)*÷ëw(^,9²7äÁ¢4œ9sfæñþ|'ñœ³0t“há¤å‰×½åkG=Ü8ñµCÔ³¼Xü~ǎ﹉—øÎ*ï»ZeÎéåׂð Ãp½›¡(Ч÷$'œT)Q¯op5 Ó3Äóy4’ÙÏÕ§“åÊ†Žƒà•¥åKó>H?]:óEäúa¤"ô7Ù"NJö¸’äLâT‹8ˆ§Xý€zÈ9+_jN«”Ö2 ¹¤•LÁñ 7Iò!d¬"eXàGÜ·³@ï²3mâk4Å©òƒPA1ƒ>¬¾tÏò=©§¤±Áºß¡goÏei]–,£9$â¤y£W#YÈ(Û×ÄÐ!¸ aˆT!úLr‚ Mã£QwÜîQLEq”ÍÝÐ TÌ;ÌqI ÇšwŠqmÓ‡•[X9ãi‡jîyÓ÷EÁž (hâ³\ýV¬B¤¬Å¶¼QP‚ tù?dø//ö2’ã¶ç,Ïaéë{€ öêH… ’?޽émUèHY[ÖC†Š^áõ¦qÖ ÐÛPe´±°<ˆñ:X»]ÿëÿÑÕÏÆÌÁø×S¾­[s\ohº7¤¸2xpÓ<3ž™M jñrÆK,\ˆ Pà5ÍÐõ¥vô-ëICôÒ6%H¡L‚B»‰mMÎV÷¿~qœÃèÜ>Îi¦‡GÇßËsç@­¥Mü˜¸4ª©xêPZÒ¢5&˜4~°˜œŽŒ¹üB=9Ý™NÔ£¤¨qÔô7;i/;“¦I˜ ãžQ™Å{ëh2¾U~MyÚ·>Ƹ?ˆÆvÍó4g-Ÿùsul@`ÿüë·›‹å=ì>ƒÊ}W/‡šÖãêŒLþÐõÿ9CóTêŠpj´säøÚ ›ü€yÉMJ‘¿5ÃÍ|µ_ô¼í÷=ÍG †0=›D°Ë:oj’ÒœY–v²LCCv´Zï±3:›W ˆNW0-¬J±Y/Èî5²¨#´ÈüÚêÔ£&Y—áØTAíãj뺡6GÒùË?5‘˽ÅÅšq*6倨ÔTR;8Ì…%p(m¦‚—-‡»– IŸYm]²÷ˇQ„)ÖÈ[A úiÙŠz Ÿ7pÃÓ²¢KN­Ì@b5‡ô²ádJ#)˜÷j›²ÖH¿)³Å~÷ùòá·X?_|¾ºÆÚ!êÈ"Ü=¢â·à[ͺêSôÔ*:ôdN×­ÂrZóë_– éþ‘ñìÒs[GoZ¬w?|ä˜o‘Æ7<=àvdƒu=:¤ü@ÄÃGG#`ÔJè§£—×' è}dºâÜq–µ©d¿uì¶¢nÅ›.Wkà—Eð«¥D˜ß«&ÂŒx ®LKP¼®à `&ñ­°äÿ.ÿÅ™—z endstream endobj 1010 0 obj << /Length 2861 /Filter /FlateDecode >> stream xÚ¥Y[oܸ~ϯðÃÕE¢®“>¥i6ë¶»ç©[li‰3õ$NIÉŽýñ=R£qäÅ ˆ<<¼ëw8éUéÕ.¹ª²,ÞåõUÓ¿HˆjWÜøøþEêù¶À¸]pþåæÅ«ï‹â*Mâ]²K¯nöË¥nÚ«Foò4*»ÙfYå¯7Û_Ú#ÞŠ®‘ÅiÁ·¸ßå|ë˜õwsôšÛ›®38óVͲü’Ÿ¹¤U<æ¦Ó ®QEÆŽªY†e¾”a j+àPŸàç$­¼¸Ë%k*â0×§®áÿ—·~úþúýšvª:ÎÊzf?±<½ÉdÅÔ²IQ¾Ø†Káh#Gm&¡ö˜xê +¦ºG7ªžÛàÈùa²‹éHéȯIôÙ¡©–ºE>’è·þ¬€”J;Š¢ˆ>µ;jnwúÖJû¸©ó•’ÖÑõžG3rÃÍWÄÍUûEŸÎ÷D–ùØÑn}S¥çº4ZÚË&Ø€nˆ Ùufåoõï5•fq’ }w²j¯¿¼RcóÊÑÍcì~Mµi–Æ•(ÃÌ?­ZÖ6Í«8OÓo0®>üønmÿÌÖ-K”µW`¹çÃHˆ-Ç~ PJ,ç†y[mU3ûÈ|{c™þ•Qá(•CÅÖ XÝ £ßQX™£‘ vÊóІc³µñ¹—ÞþÙ‘U‚Ó† í1ø{°@lϘ‘æ9Y º9Y ²¬X ’µÖŽùѤ¦1l,Ýš>Ä.Çöl¨ŠW1ÛŪ·çq^ä}Ý ²ZÄIZƒA|þôîãªAT±HÅ3±¦ö)ç “ÕC£O˜±ËÖ‚­Aö:Ê$ ¢Юα Ú³Ž€ç2Jàüë½W=ŸðÂ%ÿ˜Þr¯70 ɶ60yoMÿÄ^ž¦˜*ò;,³ÄªºË2ÕìSÏÉYˆ¥Q<£å$ë¬ú-ß\¿ýû»›Ok¨‹¸麢óÚg‹|—xWe"ª“© –läÃõÙ‡q°AŸ ~ jÜ¥Á p4˜Í>ú‚ ±Ó[V¹?ë…Ê/]8a™7!VMAl 0ü€gÓ`|]ÇLY“mQÄU9 ÷»EP}÷¾Sã*ªJ¸ùìÊþ×¶ØÅuº$~o‹­Ø%„Û–¡PïWwHÖο¤òÙ‚ƒÏxËç ë÷¨nÓp,¬¬q.ZM†«•£blªˆ Ü„”ÑËñwêŽú^[7zß–|ªÿLfT¯É^DW»Ý¥Û|˜ "åeMè\P-½Ã PÀwÄÔ+é&«À|‰6™úPãNAfkÃ:c,M'¿žá~o8vŸOˆGœY¬˜O: àÍ5ÁœòØ÷j´@Äc‡ .Ðr»Õî×ihF͈š‰ÎxFÇßÑ÷{ô¸×˜#V2 žyÜ÷ÂFÎÉ£·k È ŒÆÓ4ˆ_,6@°=áCèZظE kÏNiœÓ·*˪Œ®†ùO÷ÎÅ.:Ê–§8C!‡ÖÇxaå0°0pôÀp×ó6†o`QÂÔ•““jÀÕà:IAÞK‰†ÌDäQ¯Y·¢˜' nÄÓåÕL:‹4÷¡çò½À÷Ê“{ó(!$žl¤\#ÊúÚFÜt‹>ý h‹A:†aÃ_¯†ærm•Aµfõ@5 °èE2y©3—s‚Ã%& éÜ8Ë“<â„ÅÁÔù™GiQcÝcè.ĸ"ñÖ TÏ¥!ÆŽTW#a<Ê[Ðh}æMeâƒb¥@pµ›M6O„/^ÐŒr(#FæÒŽ¿¾Û0RÅžäSž‹kZÆd½jç¿Ý’CÔ`ÆpçIw|L"t,jF¯„fA@ !]æóõîè(Žãh¬þÍ,üÆ@{Ù¨°]ƒÝ%Ïëäp˜äÁÁ¿¶“‡#gä£ÇØå¡áÀzl¦Ã1D ´ª—dúØ1v @mp.7Ú‰ŒŽÏ&èÁRžù$ñ†T;cílE ã1 @úÚ6SêÖ‰–Çj³Ñçá|ù¬ò(çôÆú–›•ÛO³œ$×àx”Jßr).ì=s2×h|Ù¡zcw!¾ ¬c ÀíšüiXá‹ÚâõÅÛ’ÕüH„D6zÓµè/ÈÏʯ¸0†.D?IZ‘N±ÉtÛ£’­Â™€tèd5¹ÃJXu|-øÚ¨\âŽeh. ¬êš©ƒJ öäà^U1› y4P8F NÙa­Ó°ú%\NBuÌJ^Š kìjÒØ{”­±* †¸,Åe¦Ý‹\ð‡Ð]‘äÛÙÎxŸÛ°ïÍ—ÚÒ²Âô‘ÑS!FÃ}Vg¢·E^yàï^)Êõ):rûtR1ƒQi8ûâ‚,7L_JÏ^•eœ#‘®ºÎý™It…,¡+€2èн• ˜õÙá˜ÐÏÏŽ ì¬\Rl@âÝÀ[jk µ  ÄBôvï#$ö[ÄsÙ@M<‡Ð`ñë‘™éÅÆ9Ä•§ÑÌà,–éàª@ˆgžy3³™¡Š|5wÜÕ¼½áÉÆ¯É×Ö,KHj5ƒÊT@@OÂú~÷ÓjGP•Bq9ß _Mʵ2D¤ÅɺšRw~!®¡õiÂ4vN\šƒ?1*ÕA¦p~ÍýÚ±ª;qE·ÀG¢É¶Ñè“báìa…³ü÷£ñ9Õúúô½ A½ô zwQòÕq^XC¯` Éh³ü\ü¾ ‹ÿ.ò}¯-ž{Ã߸¨eögY\¥OPøÍí¦HsDÏl×èÝ- «o9t:¦ÑasT_Fz`ÇNK*Æ–¥ˆyBëPü(é³(%?•L[ïúÌ“5+{¿‰„äqý‰¡zÙAµ¶t•›#0ü¬òÀ=«|© pNÖ/vѶ̈́‘£¤— žÄ|ñ# áœ=NJ‰-°ÛÃP¸'&<ïZÏïfòáFñšÍïÝoý/®,ç,ù9)’{-ƒ P.Z+©þš Ù;õ ªƒžS×2¨hgsÛS™‚OEzù†6¿Ýœ­ ŽÂ“Ö(‹ú2‹|5¡Â7ñ.«ÑÐâ<+Îfœr‰ù^ ŠÓ”–í\oºGþeD~y®Î¬â2ü¼òfÍRí\ÓÊk> stream xÚÅZmÛ¸þž_±èe-.VIŠ’¨-\.Í]î͇ËMS´Z›^«'K†$g³ùõá eÉ+J€ °æëÌœ—gF‘gþɳLœ¥QfÚœ-·„mnϨñÛÏ$¯[ÀÂÅ`å×þúSŸIf"“g×ë!©ëÕÙ?ƒ›|×ÙæbEQ //ZÇÁovm[-- _åÕ…2Á>//*NÄòâ_׿>zyÝ³Ž•š)#®| d¢GB˜ŒÏ£Ciô½)2=>Ta#‚VuÅ–…®×ø«ƒU޲ßÓ`ÑÙmKTÆLf!ÓШ¯dù©®,1ý|–õOrSTvÅG»AÞ1˼Z‘ÿ‡+0ÐÌ䨰w8iíŸßîj[æ]ñÁñùv\vû†ODæÏ‘7`i`›6Dg %Ãþ‚âEÛþ¸0QÀW¶]6î1~ÈæK¤¶ypy­=<Mvî–w´»åÙŠ7ì›ê)-c‘Êå»#¹¤‹Òpê,ŒEF‚=cD°¶wØAÝ¬Š mG+ܼžòb!ƒÆZÚ°õÏŽþP¸û®)ºÎVLwßÑhÁN!€[;në-o_"£ÚÝrg?vp·à0’àzSø-^‚ºíèÞûF¡Œé|ûÖ®÷pœ(–ÁºF« åë[ëû¢º¥Ùƒþ ÷0Hú;qSÖ_è‘fÑʆ†ŽÔf‹Þ‹XЕI Bø®ð…Lp+$œPgYð|[{™˜½:œQðédï`u‰R…‡Eû7ƒgÄá^SgÚ´¨&™f°Æ?õþÆ AãX*o eN"Û‹RØô«žÁ¶×Ô’lø Fg¡Æï{/„˜¢nBmzc”|ŠIqešƒ´ªÍ×Jë3Cë´-Òà¢xü “¢D¡ˆ<‹uÑœ¸7Ô’¡$2f 6+jO“¡>x§ eÞ)¥b]¨» ‘w‡¦:3Œ9•ŒÒàG»Ì÷ÎIïÓåHgN‰' ±Éœ[»¬éúŽ%Œt%ÑÑéI$g7Øe±”— öUÑÑ3XÉžGÀÕ˜±7€è¾µHÉ{ˆ$¨jê»Ãô¾ :?nÌÒZÇÇ^:æEËhŒVqpã|¬tÀÆ’üy‹ª ”…ÓoÅ¡`MѬfiRôºŒõü£§|GI&°ù U¸Þ7 5³^ÑD Ò΂âiZ„ Bo%ëi­dÈ!žÏ¡->~ ‡ä 8ضšæ VqÌ#Ï÷›¯y 3ŸEUT_sQ™W± üzú¥^²³³™Fž) éœttÂiH7ÒþæÊÏ<†s’‰¤lO2K”;®?Ï-×suaÄLyL)L˜ÆŠÑ'nl_©$Ïå~¶ ˜6Ø'GΛ=Ãe.ºÖÐíÁó=EЪ£Y¿ªíв¤&¸®¶X]1©š~{è稙±´M±ÌËrĦj;›¯&Àë‰GÂLœ°ôßCFèA\YÚÕë_ù—¿y ]0H&„W·„šõ!7©„9ŒÇÄÚ®víiäü rË|8„Ærß@¾ì®ŸŠí®´[pX#8×b&!6Xò²º-‹vÃë[úm÷;:[ÝtNœÌ+D q3vI ±qsÓØ…cÓž„Ãeñç Aš†yC;|~5™É!èxò9›ýMUot{=I/u™Ò—Ó{ùzr>=ó¥àl¾„¿æÕ>oîgþ|šo÷Õ*¿Ÿáôç“ìêmÝ4õÝ oøtäýô)Ȫç·ÜÛ¼9‰J„ÙÑEQ íš—Áj>þæôóó›ß©a?‚i¶€šÂÓÒ©…b*2!é mV©RR™…0—T«:qKÇÒ*£ÔXÔ“"M\ÿ§ü8,ÒOöfðZ#)™­03<õrÜûôd,÷ù§oqµ§„>)óçmxþæX6/SåÏò†{JÌvRΤH@{ðêS®w÷YaX`/w›œ}W,Áàu,so¡å‚,ŽÔ˜,tÖ%üômU»Ë-ªèݺ*± ^L±®@ßµ´ÅÅú¾ˆ Ëû‚=Ó@ßÇ^í—ž¸—3 üJSÌšz_1€xÅA?S¸‚2dvyËx„jØ©Ñq\Q¿„ÆÞÔéð¦æ€d8F5îj`¨²5®àâ$ ^Ýï Ðó.×8Ôåbê5ûTÏþÚÍàËXΞ¹¸u•Å(:xôA~Wòg.~%ޝ!—íSÔO¶©9Ѭ«£/Fƒ:üˆÇ€àg²NW8ŒA‘ËÂቄô‚šT¥„)’é — €»}+ŒÙ §¢]‚ÂKŠ@ÕUeê‚û|¶€¶LÔÇV¥/§ ü‹˜@Ðݲlìí’^?É´ËÁqž ³(}ÃJÍ8K£J’†B›‘:;mœãŸ ~eq­nã>«Rg€r°KZAžN –6ßñ´+vÓ—ãYð‡Y\xHÅ͉BDŠ0Iû> stream xÚ½Y[oãÆ~ß_ •H;7]&}J·gOwÑvnŠ>´ªXãX€,#y³î¯/9ÝyãE“sn$‡ÃùHŽøƒ~¥ÙU*e¤UvµÞ½b®×>\ñóÿ_q?/„‰ádæ·w¯^¿ã+Î"Í4¿ºÛLYÝW¿o¶ù¾3vJ)u³ •ŠƒŸÍÆXS¯ uÿ˜×+‘‡¼Z…"NÄbõÇÝûWÿ»DÇB\¨#Î|¢d Jʈ–^É$S—Š”’EbƉÞä•©‹5Nã È;CTÙ™]‹ZîLÂÓ(‘’xÝú9z:‡‹HiSÝ”õ(B"tâD,IÐ*J³´_ÝîÁJY`ÖåïŒ+Ó—œX+¤Hƒ#u7úí¶^Æ-mr­ÂD²à]çE{6'Ì ¯"¶$®îªã*“Á5œ%çAapIÀŽÊú¸55nìÂÒHdp&`{sÒÿqk@g_éõJU°kˆ÷–šN_ÐFÉ]vÆ–`ÊêHSKƒ˜ÑºîLjÜV ‚¼ÖxÖ…[êålŽ'šµùθí°ù>&§>Œ§xã/™žÈ¢ &àmšrŠéP(™ˆ8ø ”„Ÿw?‘%ŒGK"a-S‚±~ÙmÛ‚)ˆæúóg¢6h$M¿ÝÖ6‡‡-5´¾vü³ôÌæB<[Áž°blU’‘ªáŒ× ¯ß§LÒaŸ?˜œ\Û´DæÖï¢|¨kŠEè×B½NÅÜošú£‰>FD=Ú²9‹lP'œóÑ:íîíí—ŠÙô§³‰B ¦gwÂg›÷{¢Ÿvž…ðæúîï­ùTæ]ÙÔÏ)7J“<ö{·µÆ„•éº^à”g/ºzÌ]5g,:Hêú+„­Ù‡'cƒÎ0FC§ð…ó2¸îxĽs·‹³ Å4Ü©šºóªmˆº't¡F³+aϰPÉ4xWÓªnëàÆ×yk®‘TþþB_•·Í[“¹Ð*@=³Ck Ϭñ£ÓõÁöhè¡NA¼Q3{MK@´ EÝÔõW*x‹0Úx1ŸóݾzCÔx N¨òÒƒøÞX…s"zËA=T¦}fa£æŸ¢1u XÞ¢ùt¥0â  „8¤¢Ë.ï¨÷OÒ:³ÍsI؈G´è’’ý¬p‰S¥b£ $›ec'2¹œQ‘—Œ 9ÏD?ékÚ óSøÅûˆ&zÄPM^f‚ÈhÍRú e$ø ÒàW R¸aÊû™eKΩ ;IÒù¥¤ £`ÝŒ¦ÄüäØSwúvØsOwÇ^/æ7LFR$Ûú`¾ ¢T‡é‰ŠNR¾(Ð]|Xô=ÎytZššFœ3!—º ‚ ´©®gIá4ŽäxÊEN¶X²(xŸN¿¨.@Ɖ 5vG Žâ$ôºm`2WûÄKrŸ§ÝR»ÂÐ â(т色 ‚RË™íàÐZþÀ¨±·÷x¼råf’7Æýž´Ÿ×ö’Û¶O%H#eê>Ü,Y¦UgÙE~G\È™•5æ>‹µÞh:Ž çœcÞ.º%x9†t  é# ¹áo^ˆùHvê¾A(ÏÇ”ô±tÑù”‹pR¨ 7$²xº!”GVt8+"Å{¢<×ËÊ;+@‰%u3סâIÊEXìYCFÐÙús9Ó2Æb¢ ý±ñõ?ÀÆä<6>ÏæxÎÈ3Ìÿͨx@õH³?T{QjÚ;lŠã@ú—ê„‚Æ?v½·~9Y\ùzI]áíy‹ …ú,Ò“¢fѪPpÊˤÙ%á†OMÜåKT–MûXúk*ðy„ÿª(4å4 c[;—npÀlô)\É‚zšCG.Þª ߸ì­vb(~2=lå}^r»¸gÅ"¦g{Pò-2…œ×ñ­¹·g™ÆQƳ0ý1·ëÅ€çN8}ÇÛ½-«³“Ë9&£Ž—9Ï ¢“zÑÑçB¦ŽþþP›Ëî*æÑçtVé„auüWÞ0H.§&2‘/`9– \cÅ*~×ë®9Ãó©ë_Èó§æÓYEë§Ó”•ùÒ‡ñ.8ð’~ÅwfýeÞãµr\<¢ J˜  ÁcîôH€è1ÅA¼îK`*ì´ ‰îwkJK$Ö}–*<î2!Žò ˜¦aª¨]Õ"Ä·å}ånš1qÁE¯Æ¨°m}¡§h:W÷¹G·§µ›Ëy° £ÊàÚ¿«Yªy=„74 ß6<˜Ÿ9tˆQq6õÏ î1,!_€<“6›/H‰5I_r |ä*8д"ýÕeAjÍô]…Šî¾ëgMÞûÜ£¤ˆ9E:é°EO­ŽõÁä4‚AãÁ@ž{ÞË®ý«*6Ð(ø;ˆA¿·j\ž'~³˜dMªï>Ìb4w;åŽì³Ó'–“¹ 3&L†ÉO¸=Ÿ™ñÿ®ŠÎžKñ”Ce0ýø`Ϥ7”Ý!Ýg8ĉéܪùGƒ^a„Œ4ç“ï’¾Ü!¤”;ÿhì®û~°÷8^ø A}éãêœ$KòÅX %¬ë<÷%!Õ‘ƒÍ]FËþZ“áM»Ÿ~hÀ^òy˜;QÁóÉi`zƒwR n'â .½9¹¶ÜôÌü;Xë“ÍÀ!åÌus÷˜/¥Ç&> stream xÚµZ[¯ÛÆ~÷¯8@̃X ÷Æ‹ó”¸Ná¢A€XAÑ&B‹ÔŠTIÊŽóë;·åE‡²uzÐr/ÃÙÙ¹|3KuÁOÝeÑ]bL˜Ùônw|Qo÷pÇþöLɼ LÜÌf~³}öå·ÎÝ©(Ì¢LÝm÷sRÛâî§àÕ!? ew¿1ÆöåýÆZüPîË®lv%w—7÷: Îy}¿Ñ.ŽmàÌý/Û¿?{½_í´¾‘Gœù˜ÉxΤRi˜ÞÅ© •±Ì§Ž^Fz¹(ž”‹‚¿Ü%¼iøÿõÛ-7~†9?†oCéÎ{ØÌy;äM‘w?m«c “Uˆ[¹ÓF™0¦6*u¢™‡ïÚ%b³à¡lÊ.¯ë÷© ^@Ÿ3ÁpÁs«Ýó‘ßë$øÈÇ…)ï@¢ià©Vïq¨l`ä=wÿÊ ÆzΠ6ièb*±vhÏìc!I­¡™úY/×(¹0ÑãŒcÕœ‡r’±¡‰Íg)%~F_îÚ¦X“í’Òs߇¨œLÏæÓ­ c£W6º ªãÐÚQUsî6VÛ0Ž:Nåæ ó, <“ó%.§Ðñ€< 8òODgiñÐ"~ÖæÅÇÊÄ¡³s™’ùŒr]J#Ó4ž1N”'Óù)!“ ó˜z“Àe(àÈQϳq–x˱¹P»'ðI`’NOÉðÚ+òM"â=΄wh¸ŒÿO´¢íûê˜uíÛºn…B¼ÓÂö¯kZ¬À§=êɪí/Ôø9k;æp•¨ úÅ­4ÇmæL{ß廡jî„cÀÍ yÕT̓pÑ”<•ØŽ#y$lÕC5ô!K]«$´&]ªý×5zÂ|'3ù®8]ßVÛšDõ§-Þζobìò†“„‡öX CY_•Lùp¨vÈõÁ/õS~I5ÈÏÿCþÛèFñ±]yÍe×RˆHƒïý¼ƒŒu9;"ŸRa¢ôRއ¶zŒÃ!ÇwôçÓ‰L²í¤§.óÏb¹ôë®Â%aÅ7Y_lG/8Åx“ø~ˆ#Ñ•¤¡‰ì2‚½Á€ù½FÚǪH¤ÿbXÞ­Üë ׬–6  £Èk›qZ·Ð º|•,įY¬8ÝNaÀ§)ƒcŠ&~Ããª/ ø™ý Žo£‹8äJ(×òÙØçÂLes׌\ve?tÕnà#ÔlØn䤻ö(^Z¡®¸¥ž+˜•ŠùÀ¿Òh“™f·…=«Û1ÛÛÆp| &ð;'ÅOçFÞqðžþÜ Ìö1[Än€1àÆ¥Éµ&jìS5¨WMQíò¡ì…ƒƒ°ús¤l×Ü{Èë=·-òiD`ëZ/b&¯…€ë¡djÑw[åÖ™¶q¨¬{ªÝdYPÝ«`Æ6ôŒ¯fŸKŠž…shÎOq ¢mD8§à„tÓ9F<Ù‰Ò¼ºº|ó©+‹rWö}+°¼¦Ë²¥¾2 ¨Ä8±±*šêá@A”G˜îÅM3€7£)½~ÎK<ýœéAtªKn6-Gæ†7‚ƒž[¥O·¼Å©RðíÁ“÷ÿ"0ÖëMÛU%c2 œ'”%Ïý^ó4È3‰.àò*ï&ŒÌM²ZøNçÄ{¸+jkTh&0üI‘d‹Â6¥K@¸=y¸XÊ«ÈôñŸÄƒSj?ÒåE%r€Ç¢ìÑxÌ.’†þâ’Ys0çž,f_Ù¤ j¦X붘„*U²Ú{u·Jƒ¼íÂ#¦¥¬i2X®ÐXe<œVú‰rez{Šv€,ОÀtɤ’`ÑoŠ5f¡JA†WoIÖ*õtö8fÁð?B£4{òÎð€PÞxFh–$´|MüA([»¶ëÊ8££ ü¿ï=Ò•®'Ø&…@>9„þp8® ­8ž)£$ž“M¶8±«®ÓMFï×Þ’†™Ö‹Ÿ^b6tf´Í/nIFò5šE«iÅæó4×±L4è‡Ãª€ eêr£9ÿ­fìÄüžÿåè¡…PÉ/¾’÷‚M$Ù„¨¯Y„qÿv¦À˜¢e @›ZºZ2d²[³•Üfs\¯r¡šÌw}Côf~æfïѪþhø0ec:Í(Ã^v€ :@€™!.È{Y2îÕ¸¼)7Òêdt´åvC)+wO–*É‹1 Ká ô¯,ƒš2væ4hðhðqµn‚x48ôbiÅÁ¿0nÏ<@Y)Q¬û–[}yÊ»|X7Ý(Ø ?£Ô Ø÷(t»/Ii‘úŒ>‚<Ì8çCÂff…ù¶nQ0FrnáþyàÚ"«°Ó?X*º }³³ gÒz˜±¨Njr=·¨#*äË¡1gåŽâÇ®”™«øÃ‰ÁŒ%Ô_²˜z ´±h© ëuðJÂaWTU8ÐÁ,íz,^`oˤa*ÅÛWœ{±áâNdAWTwa2fÀ(+¸ Þ#”mÏ=÷÷ ;Ê]…ø~ç·Ë÷Þ¹J û[Ù Ÿ‚Ø`l”òì¨YîpøÌ"Â.BX˜DÁ·ˆ¸yiÑ.?žêÁµN®U®L8Õþ¾ˆœ‰nˆqL>G4Pp{ùhPÀí—ëÄåyHk-é7<öáÈÞoO$“N„Ì) #µŒº"R.t, Ø—ʼà^r Ð*Á Ô2|Q€3˜¢Ê%YL4(®¬„s¤_‘¡„ià1òyÞÏâT\˜ÔfÿQx’ |ÀÐA[XÑ–…¥T{7+ ùb"©=Œ óU+²6˜’Ë2Gˆ?VP‚½ü÷ê(N”&‰€!|«·€ÙË+¡®-O;mtï•dö¢õÜ—¿yZW ,£ßRRç<ÿr©Ð©'gÃ(*Á¾¹ÔûØw<Çü®—æ–‚kœxjç ûs$W6¤t”8¬EˆÍñj*ÅraÃÈÊõ´(É»X[<æ4±žÓÄG.«àÕŠk\(^E€„Ò1Ή R7b&¿F=#7º] ¡çµ¤ŠHÈ&•º—¯{!U)S<2*?’ã?²¿c^ •¾¸ÁøÌu à¦ë²§àä–Eoü*»ZBÌ&‰~ã–ÌÎFZ\´ºŠ¶Ý:ÿ} ‚Gš{Oôq(ÄÞ1¢P8b7†C*ÑdÁ×ägØ_5»ú\ðbœ¼ÃRÌù EÏ£X/çEMÛ•Ò‡ùÍGlbÁ².ît}CAÖfI,UPšMÁ6Tûòͦ§Ô‘â­Ÿ.î‹ìá¡Ïë€õµìÄ*(/º&ïÔ„fò3}»½zŽz.s.¨Ìy‘"u2ÌÅëf£’$ÞH¤ŠB§“K„K±:é>ús¡–¶­"Dáƒ4ûS¾+ÇàzÁqŒü“X]Û0¦ABR¢«§‘AûY"e #RV³t¼‡›‡§UK'­€dc~ •ð5—2 G>åFH.U õœ)7rœ9ïÐ5ú]|˜_r §øM8~/ÄoÔ¯£Ü,aÿç/0îlÄÁ<LTÜí£„G^,SÞß8Îë3f‚›Ì*#°ö*ÿ`DGú¸€ž QoL§€?ßÍæž]Ã^²Û4»Å7M:ýVÁ½#;HVY—†Y¢žX„7_‡~€¥fþùHØ üϹaI“û ñ_ƒ S•Þ:í¬ªÊi§Ë`¹YÂN¬I¼¢™TB)u¶ b°Ì»áÎ+•HÐÝÏ„é1ú5W.j!YVIö´€D;ÙMû®oë²ßb^¼R¦%ŒO°ºßeS †‘ÂqªìB7$óÞåçžnV©û‘[D”œ¤WgH¤¾â‹Η`pÊ`LråÀu”ÂQ:ôúFçÔTÿ‹.À_ŽÊà‡O^Û óXæ|ÿŽ|킯ÏTòºÊý¶r©[hí Ö% ?HU“TªÏØ€HL®]§1~’D5!pÛ)dýéUeO=ïyÿ`‚¾Ó"R-ÿ“`‘̹YÈ‘G¥RvÕN–‘&ã|©/AßäÊú5OWW¿ h@Ó[?¹¹óZ·”I¹j-¶^€öuÕ» eH1»jüE»àîSW¾¯8åFDÍœPrýøÂÛBbÜ”’làCÎA’1¶A‹@,¯ /È_g\›=Çþ´ºçü ®á»ÈΖB{<ɤé+ŸÍ¡À£"—ÒpÜý¤’`ÞæÖ¢±ØùXQîós=H¯ÄK=ÆK®€ôeyù-–ŽbP_•faLjßó…ÆB,/†JÓ‡}Ëžù~~ýfF`åSÄË×ÐÆßŽòþ(«Qïæ§·³LyĘüëÄ¿õQA5‡õË VœSþ Ý.¾Ü½8hµŸ_ØÏ|ÍègofÓWözI”˜›}}x‘âeB”R<3Kñ§x¯Úã½Q`î ¥?Ü;±Å7Aɘ5%’ðÐ$\õñiéà–ë,6xóö{n¤q¤¸Åoµòuuùº”ÔZi’‡Zºô‡¯Èš=žÛ;ðD}a3§AuÞ9á^†áÑ7eÁOéé šíµ(9»Ü•›„= η9VX¸~1"ö¶{ÁÏr—J‘%cƱƒÇ–¯&Èw¢&%•¼6·.pˆs¼Œp÷¥R£ÆQ ÉMõG)¯­öÜ?€¤ò–ÿŸXfz2µòTCBRøˆ¯‡®£XÎW®†ÞP Þ—˜-‘aóxʾŠjÇ*1ŽsY_ÏT :ûC{®  H‰Únè3êõßÐE€æêé¬nFDøã-žÿI—/³ º•ޤFoàY_îruÇœ»[é’»ó¹5‚û߉¥`¶ù°¸Èžª|øýJ”Š’9oóTJ¥óû$q|ÿ-av endstream endobj 1027 0 obj << /Length 2893 /Filter /FlateDecode >> stream xÚ­ÙrÛÈñÝ_¡·€™ —öi““MÕæaÃTª§*9ƒƒC²üõéžîÁA2½µ¶J˜ôt÷ôô É;ÿå]&î­Ã̤wûó;áV›Ç;üü§w’ᶸ@þ~÷îw¢èNŠ0™¼Û§¨v‡»8å—Î6›­Ö:0÷›­1Qð³=ÚÆV{KË?åÕF¥AŸ—›­ŠâØ‘Ùü{÷—wÜ ¤#¥nä!¿ÎdœšPjCLæÕ8I“à´‘AÝ7-ÍòÆÒ ª;ÄAÛ_.ÀcÔMgáf ìù—K±ÏËòe“êà=œRˆàT·câ} îc”yU·v_å8芳`tùùBKmë²ïŠºú¥§ÛJʈx¶Ÿ÷¶EôÚ`y•Á¾hžÄZ´ôl‹Ò:wÀžƒ?í>oxD, ÈÊö$±ú?Û†o‡¤»ÚúÌKö30YÚö·ƒpã©pÇVfØ”j+²­2;%î…º",EB,œÍÖ;¥ï£ ~Þgþßo¥¼Ú$i—̱~6 Q €’ø'±˜DÈ—‘E¸Á0…ßQh"& Ú Â6Æ*ø!ßh ¬’(¨ô|Æ5k?Ѭèì¹åÓÏTKÐÁµ&´»ŠL*Ù¥,öEG³3_Ý•”D^äô8äN§hâßu„K+ IÄ ÎŠ²$€cÝ<ã>¸ÚÙÄ×ñÞ òº*uÁ¨+‹Ê”7/ðZòÞš646ß#½Ó’È»SÞ‘JŒƒ¦8Ža‘èÃ`Â1*f5{m‚cßõN…×õñÂ*­2á¨4# 8 àìì™AØg° ×’ùÚ²´Z©ûŽà+\8öe‰~J©à?Kú­@±@wãû[_ò—%UÐ&Ô±öp¿ydÒeœR…ÚDô§ú×Bi<è®·í N¦˜ý.ÿaÕ*ÒH†ÑH°â½‚L£0ÓÙÌÖ)©§ÜÀ!¯ñ…©L§Ìë,[a^‡Æ  šâ6“+®z.+„ A'}È»¾¹]?ôDµ‘ênâ &.hpÊûT€)û˜Qóód fð£¦i;¿ÞXKÃÒv…[¾ÇaœÍM¹¾ 7r! v€ÔeY#c봃 òÌeÎWÁƒ-ª)jǬ‹Šà?ÈóMLn_`|wýA€`KKË‚ÍDº‰:¼$U¥`˜În ÙoÞ žEÊ[CNÌÀ­*XšÌ­cUÁFÓ𖑆Y2¿:‚^#—…‰Jn7Æh* ë.óç»l€n85ÁUÉgWˆ‰ë¼ ,;–3Ó^DœB¯߯‡:37;äZ>ËÉ˶楙`vu€ E!j«àEt¤¾‡½R6{Æß|z1Ä%œ\ºK“œ‡)€‹¢ðì0+e¸I …f!8Òä BOÌ1®Ì“XÀ\´´>˜?`NsË‚ðèªD¿b %–Fûõ¼Ü·ÎK @Eô@Ë)¬—Å'Ï™Y¹F ð¦ƒ5w§Âñ ×q^ŠèÍ&ÚÈ$qð#3(Z"Ù¶;³ýÜa¤0+þ<“!¤x]™ÃùT¬®ômbT+œrÈTMU Øpjlôª¨Ñ‹TÀê¯F|ÕÑ |ŒÊXõ *Ë~o/]þPÚïP˜ †˜z5×0\©+Kû½ ÑŒµôÏÃ5Læè Bºü ß ŠO«9Ÿ:ÊfNI'a”êñØ´gÙ1Eƒ=LP]kË#Ñt¶T÷å$£Aó$Dþ™h‹̶²êÑðAE÷õùœsJ;„Ï¢zdÂÅXóãÑ_¯²áQŒ.Y&×f¨çŠÇ dJµÛ«ÊÆs÷ª¶I°¶ÑPz—wŸ6Z93JVôärFm×ÿíÒmøJ‡}ŸGÌö-²õ)‘al† þÛ;"(¥©§ ®\ihL‚Á¾or‰’|mw½ÍÕ5ð¬@7¹¤Ù•+¤‘øâKœ4øä4Þ¢Ñ1§0ðpHm÷]KšÂüO]£¿Äf.mñ¢ì÷’ /Q:w¤Ná—×ÛTËNÃ׿/6oëäÉk7Êë…"\`íEïÁù,^òv©à$ªâ,è+,…qäJ9xb„F‡¢½”ù~Q´:äÅ8òb•ˆ,îÆÕsî—~±/a@jLãe·›&PÛ ~׋¦;AóbЕÑA ëN7%<ˆðè1Ÿ'yÂ#«JÀº3=».nmTð|ªKd±‹á“—m¦% A ùq">µ¨†@ .¨µôŽôPû/_1^[ûžÂWθˆBÞð”òJØ6â¾ÂGÝ4\q ÃÝX°ÿÃà‚®úÆU ÎX4Èd#Â%QEË“¾‚®ç³ÜìæÙAÔ]U<žºóg2.œÓ8ÑÔ9gÅ@v¢©4ôšc•“–kåu‰ÇN?c¸-é3˜,L¢~*K¼£\ :3ïWkð[Ó£f¬àTŒÌ‚öU±~2+}•L…z¬Éü¦Ó/Œ‘é׎¿¾|_½U Ë4TÉx°E+žÖËL¼í!²ÇŸ=Ý!k™çïæÙ¥ÆöpUEO“2¸†,jž$RðKcüÒˆû˜±~°2†9˜LZ—±¯þÕ–€+8û²+.ea×È‹‚GNF*‚A§í¶ð|ÚõÁy çð©SªÙćÝf©Dd¥û{…(—F,UÂ-½qÞ]þÉÕ´¯ó{þÌÒ>›r BJ!uð×z “¼ª¸ºŽŸjpPœQ:LDÒƒâ,Bуr4ƒ—e¸“>à§žy–¯”Ëòñ1O•òÅ:¾RXuzÏC–¢ÖÔ<•¡Û'œ·}Õ̪/Ò€[ɧMJPŽ–¢‚¢ œP¥´WÛ«ðyçÊÇú‘¥!„ëYšò\PŒÒž…ž]-¸›©±NýÔGA|® ØÓ!,KVJ¥q"ÒN ¿—0Ž%¥¡Ëï®>×MS?ßÐË%œ®’é4 À)UÈbZæ"pEÏÎs‡ŸAcáƒwu}QnCýÆ \cʨ["÷s°F˜¢’‘–'œ"‰úÆøòb[¨ô¿¥)Y´“ا3ÚG„×µó«/I—¼åRÆS"TW¿KÊFÍH®~ÙÚtfY6“¤of&L¢¥ `WÖpœÇ–拼Ä*LÆü¡ZÖÄ…ü!â´d-XG¡ˆF%_¹¡W5 âËæîàp…+]„ÚƒÙXnüC'›S$xýb›zË7Óc°ÀE ‚àÖ‡˜4Œ¢t®x³ê3j A[dCÏÖ¶dxùØÔgZ Ç|ßÑRNW|9ð£x]™âûY¨I,Ä ì\Œ{øu’@=a+Z£ú5`iž©¼)†Å´ïÑñ–$cÕ—¸ᩨû–fî6 LF‰F¥{!ø±ÄczîÞ&üY ž Gü ƒ×ÇV|çx*žvw÷’Öô:‹C‘®ÿ€ yMãÙ ×ã…x‡yŠo{£z|ƒp ¶bô¤»ÜÞVba—„> €zž\é«"V$œm^1aîÛ+—–é]'ß`0Á«„•¿¦O-!%‡å‡¾›ûÉñ?Ž>kkÜ’ÏJ+ÿu¾ó9õ`zÖ_õ†ñ,Îq3ݹÜõ/,‰šJ¡ÿcžÿ³Þ™ endstream endobj 939 0 obj << /Type /ObjStm /N 100 /First 898 /Length 1638 /Filter /FlateDecode >> stream xÚÅYMo7½ëWðØ^(9Ã!#@R×=´Œ8‡¶©²³q…Ø’¡"é¯ï›•‹*Z%–v ½£Õœ÷ø8îÖÄ.¸šŠ#ürQ_Å%"W9ºT ®ÁIH®D—Su .Ùܘœ’]³+AF•áÐ[ÙUIŽBëP‘0XFpı 9’"®ÀW)¡sø*T‰0JUQG%c vT3!$øVô’ŠºU4¡Qv‘ÐMÍÁÅ"Œ£²º˜’ý$0JaÔÈ€œ* !¸d†!f3¨!ÀˆMÆPŠ–UÑ_1U1B$AÑJÉhK£ªFÊ.¥ -¹‰ÑªDbp˜„Ì£RÍFF+F(I#„_R ¯@œŠèˆ0ɘ©çjsƒIáÍ(h‰ÛµdÇÑ"´¾ÐL“c ö“°é©h•“ýCÁ ”\rÁlWÄÄ¥²M”ãZ*šè Zs†©¨w 1î€^ôadŒÎ%…:¢V±ÁÄ sÊN$BzAO°ÐC¶®BÀ¯jÁ„!ª&#D/ Ä&”3øA,ÑGÒoRDNl©Do[X;}b¡%B`oH¯Ö7Áëæ~¾X-w3†¤Ç3ÆŽONذ§?w—Ò]R¹o’=÷ñ>9¤ôø¨_Ìð‹‡dÝ­D›­ŠëRÛ—ÏL]>ëa|æŸ9t{Ç;qgî·<>Ç;>)fºùÙõŸk·öÆ]zl’Û›þpýi·*S: Ï֩ë²½ v ª>ÙÙY0ÍÙª´â#óÞÜúaqµºYíæTß¼âÕnA¥Ò›[Ê­aE<dJìÅNMØ]e/­?Îþž.æ³;Ä3¹µÍëår¹¾»ïl -Ùùñ¼ã“Sô%Äg| ÝI)}°ÖpîU}†¢ûâŸQÀ a,t+ãr`e\d—…r@ù²ã“ £†:rëÝþ4Zè&ó¢G±°µ@ËFßö¨hèy@*’]¶‡ZÊæÙ®ÿD tk¹Ê½8 –{Ìç¶Ú]úU{c.`þ܇'læç®I(„¸ ¼}rÜyû@ú1觘“WðñüØeötv8j<Ëe½Pؤ R™ÅN\2O;RfÏ¡<ÉY_ª‘DIæ.Éû“L©‡Zžöq‚({@å ôQôq2AØkÐã6†­yß‘D¶—GT‡±S—½HDZ÷ÉØ¾û²xÚW_ƒ"ã\A⨨¯±ì]¿ðëâ¾¹ž¾ÿ4µ&WÓ»¶zûg>k¯‹õm3¼~$M¾´o³’g@$Týú…·YGÆÓJ&Ætµã”K}ÜѨzô.µ­³]AßÁ¢î ô_¾ñ+÷ò[ô% endstream endobj 1032 0 obj << /Length 3026 /Filter /FlateDecode >> stream xÚkoäDòûþŠ€@qDÆç~ø•Ó Ž¬@ÇØ¬îH×;ߎí‘› ºõj=ë! «¸ººº»ºÞÕ£."ø_]äÑEjL˜Ûìb[¿ˆÛ=\0ðó«Jè6@¸™Q~}ûâO߯ñ…ŠÂ<ÊÕÅíý|«Ûââ—àåΆ²»Úc{sµ±6~.ïË®l¶%£p͕΂Ñí¯6:NÄñÕo·ß¿øæv::Öú#yDÊg˜T‘…Y{‘d6TÆ2§ÿØ• °§“Àá'ºrï†êÝ•Nƒ’1ÕPÖL²uc_ö »’®ìÇýP5<,Ü ë†VVumßÏÎH‚;¸q´cS¸î‰Q;ÍÉÎÛ}K„[dæm¹Ø(¾ÄF™PÅ|‡G”#-7± \ñß±Êâ‡ÀN>ª­ÛïŸ÷mǤ…£É}õ°C``lOØwt#U]úÍv%o1»4o4È„kŠã*a¨ósÂ]$’+(¾ƒÛnÛ®€ ÉÌ!ÑLwÃÝgç‡d7QŠªÜ^A™à )Û‘)YÛ¸þ-lá°t:êdsÁ½œ‘ UÌ4àŸ÷'SÛ±ƒøÅ2_1áéˆã˜ŽeÓ1Ö›Î͚̀ˆ²…‘R…Â^…Ðæçµowã5Ï£Þðûý¸gÊ27‘¾1¹l¥Q´Øë܉„ÿr¹‘É6/þâòo®fx]ÏÀç_y¹Æï¯ÞŸ¾\[vŽ·O?û5Š£#ú‹Ïÿµù¼9Z¸^pÿéÇrÿÉ劄žc¾)?Ys]Ü"‹“…zÿºï[´ãÔƒ{ëOƒ!w=RZBg­]SF QlDÏ ë0‰ÈâE¶àÅï\óÀ lŒWJfd™Ätb:€yŒ-)Å¿ê˜>ÌC¢©}é8cßÿSnq_>òxëzÏ 8 Àîxwɺ´®(Ê‚éȇÕwCç¶ãÍÄwMuÄÿîÃ3&Жǻvìußµ5Cì×(%’\Ðo¯×l°Çàf"H ûs0nïR€] ¼@äŠö00 rg˜®Çz‡¨8A݉á¾DÓH²+WãEªÂ(É|>¸ý÷šá½x[类mjÂèŽéÆ×9÷ð]MoJå ví·}sû2ZMXÁcÂ"‹±çò“”·ŒÃ KRæëÞŠ@ý OAS6E‡•̄ؒg´M2)°aÂ6@‰Ú„‰’àì‹Â Ì3ÑÁOätjjƒæÊÀ¨Æ¿w˜`PO8sq‘úèƒP?tÀZ¿vm4šÒÕ*6J0ÏmÉ:p€¹<«ìøY‰| p€ñ¢VR:YMl"TÀ65Þ\=³¸XЧ:ð¸)zÆðƾ²„¶’ªÊ÷ÃÄÔœBÊØ5G ÛŸ-ϾÜ™ø¼›ÌXFì*Ë8AîÔíryJ‰\ƒ³°ó…)fQ8ÕYOðßÕ&K‚º.Š5ÕÄP†€ñ 9W©ÈQ+É ›™ë„Ö;òHmB˜vú²ªžb±ÑòWb̵!……IÚÄ…"„Øo2ñĈ ß°À5İßy1KeLÂŽdíãíÔÈjr$“dgIé4´‰>^üŒE‰]øœ$þ'9Ášª5Fq>˜M°çŒ;ÁXÿ¼‹)mÆMr`C¸æ¦wô™óÂ=¼±¡±'Ay¿f«å&Ôx§[]·n)x‘±Ó-¡ ×o˜‡Zégn¨ÂLME"÷Èp†Ûs-kÑ‚Š¬º °¥¸OAgYò/ÙȈ«´~ld¹H1³¬‰ÈÄÈ!)ÐБÆñ˜ï‹.tŽ÷eò,ž¬Z–´¼@Ê Æý°ÜCø8SY©pf[xÏv3G±ÝHïäÙfÐ+¯yràöí¨ûc©¼°V:dµ« jŽh 1E€}Bùè"7ç"÷5…K(öŠžëܾâç×Ô?åðÍ;z½Á¶þì>¢¶åÈšbp€unYPäÊP!ˆ;dSyCh½Ó°&Ìã©bûjµ¨ƒ5Q\^ãöÅ6ܵ+¾ä4Ô3¿•”¿]ù "n jwõAÈûÅU¶ÐlKë„ÃVDЗ$aï:6“Ìž¾Ôàæ6;# ›²"…/Í]ÕðŒŸ8áÙf³ddì1m5qX¨–•¤{FÐ:…0–Ç^Œáó‚æÍÛ?Üê«l Á×ÏàŸQžIÀ¿ <ñ)åûm‰¯çc` C›Æb^%¨F6šv°¥‹³E¾ëGÉ“mG¯:ÃD)§d>Áp"dÀ,ÌÈqÍM”½,íÆfë¦]rgz‘wà|&¡†xo04`ªÔùSœÇþ8x s£›ÁµŽ?kv³Ò¡8b1TP-GžªñYGÀ1#xyS4’FÈ_ ,#eJB­l¼Ütêa_ú]|ž³ìbç‹¶™޾QLÛô³’ÎÙcQ¢yÆ¿0 pTnPÈlÏ ç^ CòbøŠË€ã$­j%Mõì¥h÷?Ç$ôlµßoÎç’¢$…KÐUr³ÓÊSâbfæð^d :ø±aÔ«¿¿a®óÓ¯¿û'ƒýSF¿4KôŒßtzíÃ=Èp@åi´‰üãqÝÐ?½¹}yþ!,=÷:”@É1yýW«OCÐÚØÎËHrÑú³è®gü°£r1¦¡ Ÿy˜Ra>;[}ÜÙ°óô Ãáe…‹¹¤p…HJñ,IŠðòªOB‚ ~ ˆc¼Â}Al"1tÁvù«¯†$]·øÒŒwFIár¨ÊMx˜ÒYýò65J ËôMp$>ƒ ó߆¿åû¡lz oDÙÎÎ]µ„±—:¨mʇE-dNÖKýä‹Îaç$rœÉúôF赸YWc ÉEÍÕhÌéq :íÒÓ¯oÚÜÄ9ücV@qáQ:J—?4bàé\QaÈçÇ,xƒ­gõž$yÔ*Iß," Íûˆ‚n³ÀèÍ]%$Ô,ÚËžµ[Ö¥ HáÒ¿HšLìÄðÏ^gÎ"bçœ)oâPÂR97ˆIëèÆÆ7±–e»®vü›§†ÌŠ® ržŒÌ²7QÊ#’èÆÚ(øtWsÄ, œ¯üªr´^|Ä t N¬ˆHÏŠ.!¢IÏ¥«}-‰Pãš–§xÜœ—‰óž‚;#~(2õ~Ïs¾é;ñïO˜›©ôgÄÛ†KiöÕ}yÌ€ÜéÍÚþ»‚Þ§ËVÒ³ï7úv?rýqìÁÆÅéÞ¾Ü+ ý³Þÿ­ï‡¯ endstream endobj 1044 0 obj << /Length 4028 /Filter /FlateDecode >> stream xÚ¥i“Ô6ö;¿bŠJž*ZH–|±•Z!w€ Ãf“e‹hÜîi‡n{â~ý¾CòÑãžl1Eëx’žÞýž¬N$üS'™œªÀî±u ­Ýw›M2¬_g¥´P߆pG8ü@@‚xJ ÍLÅúQ¦"eÒ$ËìŒ\Q"Â$ô°÷xצà+Ž”Ê²t¥Â•VÜõÃ(ƒ?î½:{rÿŒT𠓤(¥Rþ¿(e+©VL(­@"¦”âÕ±5q åCúÃ^â±…q[­y˜K|†±²åߪæ©÷x¦Åÿ®lÍ3œ†mÜ&šš¬S™W¹,Èû¦ 3Œ;´w‡Áûm™#Ìv8œaû¦ñšÒ—ïÒq`çµT†°T:8GÆ]qñXë$5S^RÏ~_¢èo |r0|‡weSWûñ>ÊïN#Ʀ´ç;ºJÙf0",zfy¨½jÑhtÅžûëbcûÛªÜ,ᆑ0Yò9È’"À†Uݹc‹ا32jnt ßæÊ«b("΅زԯ‘Ⱥhfjó,1¡† AÇñàœœ¢î9aÁé­uÛØK2¨NMÿì[¿SØa5Š*R9’AÛÙÆƒm'ÓN÷Ënë,Å’b¶]C¢f,³øK»`c*­E›˜f@#3òãË» ‡s¶As0œxëeæbÓCÝ]´ª" ‡}îupæqídèjø«¯;7—£"lmcsÐã–Ç^ËH.[z£àZ·b2Èá=ØIñž{ gØ;g¡âÎÌÎâªöŒØÌQ’¾œÖñLÅÙÎÃ9A ц/ÙòDíâ˜sK÷}Ûîl»õ“(p$_&›{6%T.0(:`‰=ÐxQD/š° 4AÑæÖ©“CxÐ~DÞ­°dåEá¸tœ¡ÊE"4šC '|°ûKg\´lé]–LƒoŸ½Z䨎…JA%ÝXºa,Âx`|^ï÷Ls‰F.X÷ÜÉmÅ [µïÉ76xüÕmWÖì5q¿²†#›€*[wq0Â:Us½,ðWN5.ÊÊ…zà'´þ8â© œ›§}S_^àmÕ4ºÆó0 $°e$*€Å¨x˜=­™¸sæo·c IP¨ÝÎA6Àÿ¼)/»‡KøBØ cÔ\ž¿¢…Hòe6Ûx•Çû¢)sû¸üæ7`îÝ%SíÖ²iÇÖj…í/ï]'M#—VJR¼‹}‰œ¾·´óKHäyîÖ(XCQ'öž~}6n½DqÜ5âù¿'=@Ò’TÊÈ)2š%½ö˜#ñ·T"L‡H…¯¾„ÄÐzÔâ{¼eí,Rã4ÚL$°åoN úèš^@„F†·Æ"Éhv Bè@ŽÜmÛÚ¥àÃÀ?tÙŸ².ƒk!’xžBͯddFÁŽ­/§óEÛ¢ Æ1›çu³&1Æ.†¸d™Ô‰‰b¨©d-Ý2ÜÂxBp<€‚¸ª ÁÃ5…íøhéü‚øÈÛËx+Ãtð³qf¢$†‚y¶„2¾hÜÁ¹èxf "g bŒ7©OFúFp6¥cg¢Ñ´RZ¬‚ïê!ä(8Gjîó 0ƒœ[G>þ‡È­ï.ûŽëÍ8¹ %'ûÅÙu…q;¦„ÑYjBÛQ>tr¸‰¿ÞB›œÆ;¦Œ%#˜)ïÍ`Ú¶ÐxÞ®„õ÷-Å"Ðb_ߨ»¿÷ÒÆ¡¤àlêÉ–sXש|îF½¶ü°àc¶uß"ƒ3Ú–ô^:åòþ&8Hçna…í>;ìsâÌyû¥|   –‹ÜÑ Æ,wÏ›²pç}g½/! ’×–X>q¡“  UÉìZó$9÷sídJ\¯1âÀ(¦€Ì'ž$BŠRq³¡31ÑõO 9ªÌQ§£Ìà®Ç€6Iñ×òOÓ»Rv8ã¡E‡—àýˆŸ8TÙ}Ak•_ë£ËQí^1„Ó¡i5N'(‚„ëD )UäDs3 ¡B*ÍÍG¦5:¿~5Ù`¡Nwx Ñ`¹œ„ôDê>.ÒQ Eó„WÅ·ç¶½v?£‘h=»ßñŠ£‡¾å6‡›"héBâA¤nŠ|La?`‡ÝÕάwÌÔG¡ð'šÙ3Š9ðå¼âÇjlbêKÍ’6%ÌbœY`q)‘†á‰Ž28>ŸÅ~ýj²ÁQaMøµ|[2f_s𠏲酡3W’ÒÁ·09­¼rQF"…c¦W¸‹ú„7õ\Ä ÚcÆtC–i_W+̘¨ÃYæ¤rGMmNSüÕ—M1ËâòzWW>Ç#Ömêˆ>T\B–óú²ò°KNbž(¹ÍüDBŽå«I„»âBÜ烕26ÓŠÆÐÃðkg¢ÿ̦…¦Z–A„17«TœPá±Gö*ýÃ`&†¶,w!ÜØõkT$êZ÷û¾\{_œ+:—ŒÓ(ê'5flòÛ@dyAõ6M½ç›Æ€’Šçâq«Ù{Üä]™?ø©®.®@ÃϯŠjñºÀõT%“û¦!»Õ4°œ€x*JF ™!€£S(e„d‚ÌÀ½,®û|È4IOHäù|ŸïÖ¯&,ùüƒc¸BRäìÁs,轜aL«]º„mŽüwLX;LQ©a)à’êÛ^cfá®Ký+»¡fR2ã( B `S´™‰2à6Ÿ°Ëü©bÃ)J¨`Í3p»[zb›züo†¶°ÚñÄwån‡¦_>½!PÊ_e´Û¹«@©ÊÆÂvv–¾•ÁfG/$%–ßš'¼ a}.ÄHyÝûb/vñ8ëJ5» œ¨xâU[TE‡ßPUØ ç´+vn÷i=jkÁOÍ1XZ~ßÖ!‚úÂî>rkIb• E Á¹ߦ£Ï–X¿|5®_؃C8¦h¯GççÕ¢¨‚í‘CL°ºARð5æ‚:ßr*§±vi-4~(÷Üøªh *!œ–1Õ—þ&áüò› wp!ýç9avŒtlU Îå“Hço&ÝÁ–¤£ìÓîþ¢oQœuBüHLÇÁÃþ ’սϻ¥?t–w¿+[NÊ4Dçþ¤"+³Ðfß öªuTÌjØÐÛÛµkßbÄÁ×.[s÷g›ÿXTK~aÍÏq¢¸âÝ\v ÊÊÕÙ­‹Š‚§EÓ-aI~Â4☫Âa¹|•¿;Hñ+¤Êî]‹ðø !üâㄞÆ?àßõŠ)xÞÁ+v5ok³Q—k?DhäuõZª¨Ìü"D¨Ð}ŠÅM°€dÉ>—ÃÙô8ì‹Ðš„B§_qmúŠÈ…+M1Í'ºù‰—7ÆÕÐzZ.ÕyJ&«³­Gˆ©2 ‘¾1š3 ¯ã#&L2â*žM2A„ 3oº3æù2ü”ØŸÄa5Šs­enî]íiRÍØ«ù—Q9ƒßyA¨jD_"• _,W¢”ÐfÂ5—Çèc"‘Žû|? h¬ŸîJ.WÃdà/²üY•Æ8køY—ÏYÆL"ÔÁƒàðHñ„Ô=SãµgO­Z ;ÿ†üvÕ»nÛ@B¼jíf(á|}ä»,P´äï ߣ7™ÖÏèÅ% ý<îcÝhúé1Ä=U„* ù—¯528÷¥\9@hÓç%½×ò‚{°þİaã–,ú¹4R‡'àtôùɨ_¾×/ù¹ù!L`BìHŠè÷u…¯«;‘ÛkŸ$ƒ_O¢tŠß _%;àkØÌ?{šo9ú;N+C·ÇÌîaÕ†—­ðH1äÙÈ#Ù˜¸Zü¸C>èÂÞmÝ7¹;gˆdÉcùe“Š[źä (4£X@ûGÁ¿ë4nhI >a¢O’ DW¶øå«qý‚B·}{þ(oûç¢ù¾ÆxCŸ§M°º‰ñ | ‡ÆÏ¶/üÙÿUŸ- endstream endobj 1051 0 obj << /Length 2706 /Filter /FlateDecode >> stream xÚ­Ymܶþî_±@?Dܪ¢D‰’[p »¹À)ÒøZ pŒD·âÞ §•6z±sýõ7j%îì… ,5g†3Ï yjÀ?µÉ‚‰"?Óéfzµ½Ûðà§¿½P·ÆÝ„ó¯7/þø6Ž7*ð³ S››ÃTÔM±ùà½>æçÞ¶Û]E^ür»Ó:ö~l›»6?ÊúŽ'~Èëm˜zC^mwa”)åÅfûñæûonÆÍã0üJ-‘ó‘šÔ4~¨b-j&©öU¤YÍx»‹“Ðûq»S)·UžÓÏĤ_¤H?Ðji38%4~¢Ää›cÙ±Yûmh¼© ÛíÛòŒL=+LyUñ ?Zhï<ÜV%(°GmªaC}ÚÆ‰——U~[ ïa¨÷}ÙÔ"¬¬²*Ø LÊÛ‡my>«¾Ð~¤“𢾠bq…¯¦Î°çœà&O¯2_…Îxܦ3ã ÅAêýú®¼íÀ+Çò›+P+ÐÞZÓ <}ÛÐ)LéE™=ÕšöÄ”®9 Ïùy}‡Žœ.Ù-S;í™Åxy]ïÑ2åv(+¡u]oOä"²*òUìN¸5x³¶$Jy:”H35t{y+Ì݉އ´/NÚßÏU^Ö¶`:þö¼Aìš ¼]58Ÿ)üH’å3ö·;£SïnÙ/VÚZd6‡™ŠMè9(õ¨0%†6^ÙóŒã˜EiÁ´cƒË>óG—¦è¢Ðš-/ë²/óªü-d2ÿi)­ým([{²5šÝ‹°cd[1è²5&G+áÎAÔ–?JÛ‚ÏB=ÓV'~ %ß_¡ìÔ;äç¦Î@+XJ‘øÀŒ'dBYl†UÏ“KRá̼¼·2é„4q>ã±–{N#¢AL3+¥ iPöG&M† §©br2dÜn´nzØ »¥jˆ³¹/õì$‡¢1?«ˆM“Õ0 £ ‡l§ `ã÷ÏAPbX»Äí(,6±V~%„Ý~ s>@ñ9eŠænýn"`¥ð,·!G¼çÄ‘êã«”íøðF ÿxÅSçüNlÃøQá'‘™ðLñî/¨»Jê‚Õ¢#ðXÜ;ŠÔ0òÊF¤vXýù>/ ˜ŸÀh(P®Ø½ª¨Ì†?ˆ$€¯9C$Ðð$ ּϙÐSäÇš…4ÆQ¨ˆcùAÕyƒ…ÖAŠåñ˜¬´¸µ¼¸°”Z¶µ‘…2dƒD-¥+¡ÿJ‘†â1Cüã7þ@ü›*–z'D–¡ëù«¬÷ÕP 4IP3™)Û88sŸ"ÓCG€Ìkd1šPy…h 0ò˜ô†¢lÙ PÎ{¬å(©i˜¶îŽL”Ê䆖¯˜ä‡¹rUþ^ª'ÿ²{)qLã LýtŽƒ]‡±÷gÆÿø—µ(BUR8@¥1JŒWç'%^w†hb"üÎñ xÀå+ú©8…(Ál’Í+~ùvMù©2Ž“±6: àíÚ%½¨Õ]­m–H<'à=mµ¾“&XZl4¦~,R„p9J´«d~€˜7kç¢|{¼ÿîþ?i¶Ñj¡M P™AsBm¸F4ö qy×5³äEQ:cžâ¸“C Æã (Mwaܱ)V¸ym™œâƒº°»Á(?Ô³fj€É¶Û7­]ÔîÖv¶å.u‡íã>‰ªv‡‹&.ç"MÒ±*YX[iøÓÌËJ7%u•D±¤±Z#TEÀ™¦^Åå€9¼àqˆxŒîoKôlë<åY’h•xtZZ2 ø1鱘WL<[‘Pöü»G«­'@w´K²Hš[ açépšöèDÒã½ØgÈ´°DX\‰êxI6£´5g$‰ŸE©‹lê'÷ÊÀUîYv¾NÍÿÜK¸õ»‰€•â¼ÜfÑKÄÇxÐ8øp=?f"¾Ý¦Ús•‘zŒ$u=L'Á£)K|¨îS³žî0„ù 6,DNú Àãp/xã )‚F"—ûFt«.£€÷œäñ˜9±»nÆ“Þßy#¦*Êâl×1…b—Ä„ÖV6¿$'PÊÃL|„™9i¢P7¼oÕÀ¬eÚ1—mrž«rYKí1©QUkev^­‡ÜY^] ¬“ôà Šq€òLr„0Öñ²Ô‘˜µä€ÞöR ¸ÝÙ…P-c5/ÇטìpEhZjtµHês×# 5/ø-•BÉX°‰™@%ßÉyÉëˆUÙÉ àŠƒÍû¡¥Ë/³\¬“K¿6Pš¾{2kÞ=sióº«(ü`%y‹¥@ã¸u 2ôÑ¢,ÌÍÂ×M¾:+Y!9´­­Ýuù„jÂÁMßÊFéüm_5´l­srÌ3#gÍ7’<ã»Ø$Ÿ«?Ó AÄ‚mÚ¡Îr¦˜Ø{}´û-4Ò÷_Q‰®ñ&*Žnø…¨P®…|"([y…ʨPÉÛ‚¥Ÿ{™:æ½Y^ü CjÔ-ä¨CŽyâ˳8UJ蘦¤ñ€Áçcé" ?±]A…eÉY>}u€óÇFICó†;jR×åÀ趬幦9!Ên˪ìÇþ!…®ã3.9_—»{4yë2ܤ®.Þ’´;-c1ì¹!Þ¡_3¥A6ìÙšÛÊÁÞiöº€\Ga/ ÍÃ6?©îǦ ¢æß†š*0?6LöN8÷ýN~à/i-t¦½÷¢ÎøÚ‡wÀ?ºH>~xsüz‰+Â`~¯˜¼uJÏ×7~‡ÒÍ=aÝx Ðk–píâ´§Îï0>ÑÊOzÊ>oûáü½‡­«ë¿]:–Ðø*ƒ…)äW@¯>›&¿ÇN% 7Ÿ‰õ´Ñ¾VØU›÷/þqy´¾ì¨¢ÐO*QVä\´ßÒM™~îWöOàJ†ÿŸý \…Œšïÿ 7§¯ K˜ÁE JúJ‡¯ÞâmYŠ*„éÇ À*?‹ãP@3ò³ñŠ·‡òÛó5u„+7¾å©ž{pÃý/Ÿ¦Ê$Á¼è†~l’i“);g³K\Yž“ç| ¹Ÿ%áTéD‘—ƒbžS'É p«‰6jM›]¤à“øz­vgª«–›tyØÚŒgù¡‰æg=ßUE)ð§$ÊèÈõ%ÁVÎ:Â#+"ý­G/PüÖõíXß8¿5ª+ƒTÒh5âë¿ÿóÝ;îbð\ÛgMÏë 2hÈsF(·Rç4Cœ¡>‡x-Æ*¤Ò͈,.b%FiÉH§…lªBH¹+ÇÒôÜ áOg6’Êú¹ûÒ±óÅŽXÌ,p„‡}%b²P™¨%À:ŒêUƒ}¹¶ÜÜM:¦ƒ¬q`cµ\˜ÏÖ(.ê&¸¬ÿ ¾ÒŒ”èÔåuyˆ€1dÝøFa¤úÃoÝôã³*7uØÉöXv"ã]V¶€p´ÇEÔ#¼Jü0¯¡´¯‚zšw܉(©±Aæ.@q×þ¢+ ü.{!Œâä¶ y½iMMõS9©`á]5ñnÉŸ±z„ xÆòçDˆÿà2—& endstream endobj 1057 0 obj << /Length 2770 /Filter /FlateDecode >> stream xÚµkÛ6ò{~…/_¢jVI=rŸÒCÒì!} ÙhЬ֖mueÉ•äÝ,ýï7/êá•“í‡ü ©¿ˆµV©I«ý3Ÿ ÍvÁƒ÷ß? dß6.G;¿»zöík¯R? W›1ª«õâWï»ìÐåÍÅRkíÙ—Kc¬÷sSo›l¿/ª-/üUaâ³òbê4<›\üvõÏg¯¯zâ6 ŸÈ%îü ›o`Õ,¢Ä¨@æõj—;~äUu³GVp|Œeøßºš¿ÇVvwîØæX­º¢®pf½¢î?;´õ>ïv|wœû¢Ìšéænwxm]–õE{÷EP9–gM)dµX|§e U`ùJÈx}lpÈ Ë 4*‰SíÜgŒæTRaˆC·ëå¢e¬¬FºV%QÈ‹ÍèÁz}ëÿ­Ýð÷Ój—¯n?ÝåMKBrËÞ^ÂßOÿzýþÃåO?$Àt¥ PƺŒù?ÊÜõÐU7"ûü<ÙMV”ùúåGP}õœðà=ˆ§”ž¿Í³5Ú.<*ªU½?d]qã ÷è‹Fí.kò5Ëâ¦ÉšÅTðNg=ÍÑÊ?ÝÀúë_^}zóêòÝ/ï_N.-ÿdÄ 4­|TjÄ*ö“8“ÒVäcQè}w,Ê5[`lÅ€aЂ¥¬ò9+¿b9O¹1ë qæÅö” -µcY3|Q^$>œdüZ4þèÆ-ƒtË£ð†(v¿fmªÝ žïD7Ãùo`SžöVZágŸÝâœ0¦^ nN†¢õ'–Ôí2òÕÀùvè®Ð0x•U<@ÊÕš·r¦¨NήLÑä«‹%k$úÀ »" Y!O;Ž0‰öÄHm q <÷ÍVÈD RÈ…âM–`u-BÊã[‰©€ÍîPF†jakäx{à)]¾÷»B¸ãc¼]Â`¯<<×òâÕÌ€nœuÄ.R«'hL/ÔÖQEÕ ‰1Ú6ï¥tþZZ“ëÜh`Ú !Æ×sa+J•N‹lËË9»—${^0™ú€QýR±_FœÀ·52|/öxw4j¾9‘¤Ó‰“N8,ÄŽÄ¡EÊ`WyG¨Ñ¢ö8(`P9i“ :ÄÅ>?µx |p®Ì4è§BºÛ#Ä4u6Ç\¡Õ¢Â¯.ïäÊ¡kf²cœš"æ$Fwý®¸a—~ÁG!Ÿ¶<"öðDþJ‡ŠŠƒ¢"¸½°Ö˶ùlJ‹c•¦Ó×áv»„;lŠíœnmªÒ0r{Ùç‘ÎmŪ¶…Q Ak sÁIQꢩïQ¶&±–0`M¸×$ìÍ(vÀ †S ¡gRLÀ¡ú(pÚBx°VK­‚'É[G›´£*';€£Ž¯¸Ç>$¼^çBÖgœŠoéQà #Æž´\Ê•ð‰»I†Ã)ž°ááqHŽ ªÕC8vQŒ¶îdçõ9õÂbï²Ëզ̶íœr)Ç&#Ç%ª‡S¾ö)péÈDóözŠÃdbýlÃs,h£t¤. ëÆˆÞ $IU—`U'Upþ9ƒø.ëí®·B\“¯Q¦ §!­Gº…UtgrlÒ°–H Ûã9rûýžÍeQåó¥Uî0‰lÛÕŠ+•¥|7u­dx=™D$Þ/úºž“Ê4âR¯$©Ç=œí`–¬7 ›5— UbâmÒ¥k(³/™R`PëÑÈ–ˆš9èÙ%3™²|qSÉ‘™­(ŒCeO£Ç}Q–b&¹Ëau7"°¡·€¾ïÄXÜÞçmí,‡õ>ªe6¦ž„¶á¼"Þ¿:â•p¿Ë+ÞötKŠC0û4 üìã-\3OÖ¥`vEl¯¶ð*¡„‘Ûz ¹g“ÿq,èM«“”‹ ø¢ƒãÈ=ÐÔ{7NØ»é„[Ÿ#ÂqCî—5:‚Ð,éíø²¦+VGˆ=$=Â4§B ÓaoåyÖü(•ÆÇš¯IIÞ`EC¦¶gê˜35L‡LÍæF@‘Œæ ?PaÒ³„ µžmÆ€‚t41éÀÉÚº§ƒ=)®™þ(48¦2þ8ÅÍ¥ÿ0Ä"ù$¼{³ VAõÎlFVQœ+'꾜êŠúIu†€§W?a÷B£³Aê¢TI]ƒ˜»Ú=ïuï^´—Z 7P(1à†^¸5?={‹hyÖÉ©Œñµ ˼Gäê®ÑÆí0r›ë…̓T†.vÔîý1—ó÷Ö_(nm=ñq•v~¹í—øÊ7I›¥JœÑíI“ ¼a¦Åe±Å¥½WGî>aHÝHŸ+o»ö‰Ý­0ò‡NN\Âç½"lŠ Æ)¸Rõ~çD D;^—W%l‘ç-Œ˜3,ˆ3܆q¯ÍóÓ–·®ÒØ,‚4…[GÔöVÖvdURÿ{ 7ÂÝùå5Ãá 5'd¸†šœ*4½Q«uN…$Ú;Åj¢qÍ0ˆcåöøkW~Ãr*Æ*ʽï§8m¨Lj݉ÿ‹cñ›$T'â?ÿ«ƒÛýHØ'ü %ÒÔð&ã Ó€ïÎYö’žSGaÈQ}ek±ñØvù©XìËAÈ­T@Ç®€†HsÜnÁ8\ €_õ4”M˜ò»¢>ÊŽ6—_6p‰_ñ­êŽ!=êœÊ—®hKK=EWÐǘA›ÙÞ$ãLÙ£à³É1ƒú¾‡¿•p7qÝòÿFâSû‹ü,•F °9ß8\6Y'H?H|áÄbͳþšº&€n²6ÜÔ€Š±aJñCïêL³µÉ7yÃ…“Lp€Á ¬–¼F~ 2’,¸ÆHÞÂF]2„j"øÜâŽ:ÖûÄ 89³˜p@Æ5ìîÔàÉ=$OÃÇÏ‹¾_…N\ô–Á¦!—øPÅЪ梴/:EhðϯÐÀçã4ø‰I?ÁľÒ~|.£M‰bx˜IÕ÷¨Z5¤8xœL4>βãšÊsž¡. ÊŸŽòú¡X¡Àðý¿|ûŽ-ïø™Aë¼½…‡Åmj†\ƒKTà Þ`ÛâAÀ÷Úö¸¢ Úí2y5Ä^¿væ·ùâYùú© ¨’wÏV¶ÖDq2Ùz-¿&Äô…éPr%®•¸Øplrµ<c…èÃß}¶jêížúp÷5OÙbü ¡“f=ÚL8uÖãí{ä_ÚŒÎäï®o'ýfRÇ™i§O?îôÁÝÊòØvŸ¸cSHåÖ®ò ‚v­\2ú/X'l endstream endobj 1061 0 obj << /Length 1311 /Filter /FlateDecode >> stream xÚÅVYoã6~ϯp T"®(‰²Ôb 8‰r4N6°œö!kŠEÛBd2Õ‘ ÿ¾$‡²%G¹¶X6ìáhŽ£¹pÏÜ ¬ÞÀqPàú½ùzÏRÜ|Ùb|²‡µœ)͆äÁdïË1!=l¡À po²hšš$½ãpß—4ãä·¾éºÄ¸Êù2×ë”-áÁEÌú¶oTqÖ7m'ÀØ A:ùs/œlœÛ~'J)ù¦×„‰±üžç»;. Άã“Yx9<…ß-bÝÑü–漘=} F7±ƒ0ÙÈŸ†£«Y4Ÿ]žH…ÓLÒ"¾Í¨ÙЂ2v0ØD›À`ã&áìײ/£*(åJçáø ‹f`¬é|³´XO…; vÍNà ÿ_?S&1=Ä™Ôê¸IºÐŽi¡±|úÜ0ð x¿|ÕÏלß7xY˪Æpu~2;< Ïgߎ®Ga$cž‰ï>h«T|þC›·øìwÙ»i^ꉛÀKœÖZ¢ŒO77ÛÒø‡ |¿/mÝ9tÌþŽ/U5¸ƲàKtÄ ¿Tݨ ÑàD¦Ï^°B3‘\o·êFxŸ]ªŠ¸ŽÂY#)5&ˆØõEy vÞÙ]¤¬Nl®௎ú¯€xŒYÙy/Ô|]niô&n…\%f]·5’·u’ò*K€¾¥›ZM^ ¶ö0£ëÑDÚoæR­ôåx ú¦ƒ,Ñ‘dC2mÙLÇB¶ï‚0"È=ۈʘ%qÆe,1†•Œ¦csÎÀ‚ì•TU@gä(½U‚Øàøm÷k‰}€¼º ž-T6žd;æU§ûx.Ïw}âñ’SÄ Jû²ÅX¥»ÍÛv-ä‘ ç"–­¸ z¢ÖñƒmÕÉÛœfK¯õ͆ÕÖ=·y›]7êN«®{»Èva[Iˆú¢ß-ì2š€lÛªë!Ë«eÓ.kòÝA-qSò{Ñ›L›ø"rKÚe’ØÈò7þ_Dh!nAlFßµ\ä:ƒVô_Ÿµô³XïàÛ1ª\Ã\RW×))2^>L9ÉQSNŒçë8ƒâv°vݪ§Jg¤ºkAªšä舁HÚÛ’é~*é,½Íãü 1ˆ#§™fq¦ ÖÊuZdé(NBï*Þ›k½2×Õ¡jNCê²lžU …ØÀ剨¬œk“9> stream xÚíXK“Û¸¾Ï¯ÐaÔ–…Á¤oÉ®;ë]ïŽ''¯kŠ– ‰µ”¨ÔŒ'¿>Ýh"5ljÇ9¤RRA Ñ/tÝ ˜qø‰YÆgN)–ét¶Ü]ð0[of4¸úË…ˆt \ (ÿ|}qùÒ˜™à,㙘]¯‡¬®W³÷ÉÛüÐúz¾PJ%æù|¡µI~­«MïvÅ~C ?çû¹L“c^ÎReB$–Ï?\ÿõâÅu/ÜHù…Z"å¿VÓ¦š ¥IͲøX¬ö¿s#¨¨tò®Ø/=(ÇMÒÎE²ã•?€†.ñû•ß/ ßà´NòÚÓ ØÇ "oÚ¼+Õšž¿saŽŸžáK–ÜÍ‘-¬*zî«–‡ºB§Ü«H‘GæþS¾;”ýäŠwHìÑkà……PL²-0'c°­öËj·óa#Ì·Û¢¡Q~™ùmŸíq_ú&.ßãBu¤2fý't ˆ® p‰LWþ6èSVÝ*CÕ._:8Í”¶Ï4•œij˜œ/Œ•Éë}ÑyYü#o‹ ­v&y9Ϩ³Ä™æÄK1‡Úñ²,Í2bÖ€YÛ‚LJ¯R ÔQôû—ó´gþ!n´3!XfLÐvwrÚóŽ$@¼™ä{z …Z>ЏŒY.º­i[Á",3©œÝÒÝL3-PÛröîâ7ª?cÉBIfµ^Ð/bPãëÛ¹‚€ª'QK ¦¤ý†°uƒ tÂÇ#´bF™/¯ì©àK;æäY¾ü/Â×½´ÊNè¥5è…“„^8³ŽÐ…³cèÂU2–Π §v°K$|áL¨á¸m„]A^E ¨Õn5÷MYm°UÒ:‚˜ôëã ÁÔ‚é€`é$‚é3S¦#Ö#”EMþeÿ ”arèŸÊt8N«®çÜûo b\†Øu’x†\Ü(¹‡Èe²!™fRËs„D—?…s`ú8’Ó©O WŽY“M@]6†:ˆ ¹5ʱ!×3'J&d Ï) ›AXÆ­ÔÓw½}YV¡_æmפ¤6b*JuÊ”ÕgàWü~ì‹éÝBÄ#5ÄÅ(ô#}PÇLƬÎÄɘs|¤pZçDzþhHuÆâzG~Wmë÷4ÐéCM™âB#¸‹j\úîÕp´}* À ¦O!YÝÐ1w£›'‰½Y¥ÇšùÙB –}ž ç6¡Ëh¾ßxz§AoR˜ &áM*}‘7T`átyÅÍ‘{¼kÛä̉¬â:t 3ØØé8 †“o{Et¯ž`Ô²¬)™p÷ؾ»¢ÝÒè1ðV€´Y2uL"ž·v=v«ˆRì>Ck‡ÓBVÂÆð º<”šÂ­]š'‘š"¸ˆ±TÄoŒ¾„j©Cu <s›xÒfÌØ3ÜÄî?, .Vxë£T}¬€²³zJ1.³'©žשøÑ qö›VÏbߎŠçIà—}´øÒÚ9]<-ôõîéŠ§É )³¯*žôªêšàÀãuyXN»ôTOàeY{,ª±àE #Èÿ!PP^çôèo,Üz~xÙÂ!“àÑŠ€3µ:còç0VC+$Üé.ØÓ•䂊«FYì®[¿£ñ²Ú#¦mŽ5}”£ ”à|;þÆÔ#ŸuK-xÓòìÁ~˜L#-Epò´§-ÀKìRþ_$q~³ÚE¢­/jÚÙc*Οú ,ÏP oyh&Jú!o·ÀÜaRáS‘p¢óN>° :+p\4D¸òËb…mNâåvïEGÙ;ôRÈLG‚¢™Rî;ЯWE}I§ÌðLJSGmNEôŽh‰“–8m<¿{õöç—Œ˜^vÛ@+#H«‡Ÿ“û«‰ ‰R„2ψV;i¸ÞÝ ÇÒÆ»ÆRDà`š”§ÇÈMʾ£u]G‹sµßäõ*ö4xÙ¥-øñŸu¼⸻Rë´`µÔøu}é-Ñ@©¡Á»W¯áÿ°h@džªž_S5d§„DVœ[rÀ«?ýòã›r3H}åžDn8 $#¹/®®ðXÞ^EHsPÏš»»-öM;éUѵòðšÓãPWKÌ07hù©Bۮ緃ÖÞ(JÍu·RMMÃp¦!ëªè:ïð¾ó“Ù³®)0þá­AŒNŠÔ† Pó¿òá‘’ÖA©t3Ȫү9Yé èf9É.£Þþ?Ä€ÕŠìoŽË¥ošõ±d6ÿÄ! endstream endobj 1071 0 obj << /Length 2150 /Filter /FlateDecode >> stream xÚÝYYsÇ~ç¯Àƒ.a8÷á·Ä‘"9²“ô“¬R­À±eÌîŠþ}ºçXì€ Š V*%U¡wŽîž¾æ›&›PøÇ&ŽNŒÄI;™¯/¨mî&¸úû‹ëf°p6Xù×›‹ËJM%Ž:6¹Y YÝÜNÞ?.Ëû®j¦3!D¡~˜Î¤TÅ?›í]S®×õæ.Lü\n¦Ü»r5qá+4›¾»ùéâùM/\q~¢–¸òšÔ„‚žQMm%aB5Ûe ÿ“Èõ¼7„9åK®ÛÛwtr “?M(Q–O>ú¥ë ,`¨Õäúâ×1™Lp¢¥Ì×›º«1ZŸG¬f„3•‹ýXwË±Ž ¼Ï"Öi"ÏÅޗݲE¹‡aÃ!ZØÉŒK¢LŒ·/¦V»Í¼«·›)+ÞÅzÂqJqÜ9m@•hÏn  ¢Gߣ}ßãißdk:”Í´¿°Äáwªhä†Ë$áR¤E×!^|ð~ÿ}äʇzIM ïÕZ–›ÛU5ÆVÀÁ•Mëž–óí¦í”ÅcYÆ 5ãÔ f™ý™bU÷G×.êq¡ŠBH°¯ F㦷Gû©íªõ|qwL¢eD9qF‰»¶j2y¹Sµ#4ó)Ój&”%’ªh¹_eQ Ìö>õÅL÷P²l±­}‹¥NÝ6œ$2ót“ÅØaŠ*¼©Ê®º%ãê3Uˆš½_§LQ3P¨øŒ´)×QâvÕ©½Ñÿ˜¢2] Œ£{¶ñ,¿üöúõý‚´ Ÿ>…ãJjJ <Ÿ¤dàMµÝ O¨w»¦Ä¢ð,.Žas\Ñ(13dŒ ãjJHMÃORyõ1Óp2‹Ü3ÛýèƒQ]”á'U¤Wõ‡¦l>…Œ,0…÷kP¯Ó¾BêH-]Ÿªž!V¹AVäçVÄ23ÈUÉeÒ¼\P1RÝ2ªšœ„ôÁùÃY9wDêƒÕÇäw4 ¢vÀNxøñl¹×G÷ûöál!œÛ0¸h¶ë8Ê"ц„­æ5r¬"ŸÕÖνÀ–LgNÛâÕ"LtòÉŸ…fµü?fq¼+äÑJu Ö×î¸eŒ¡"àÅÏÛŒ¥qÄõµ¯ö¦ >ôž2Ú‚F›"ÍúuÁ¿H%ãÑ¢îâämµ(w«.|¬¶³à^··q"wï<Å¿b´ø¸ ÞYBY,0¤Q1„`¤!|˜çaR\À¬àZa¡*ê¯q-7àR'=+¥£ÛÞü#æ"œ[ ´»ùòd±[Eø“¿ÅfÌ>ø¼²Æœöæ• Vçyó"/x žòæ=‹ØøæÍÄBiþs ‘Y5£À™qÈ^õ^ (;É=x}JA”POöúÌ¥û×§{ô™Ä© B˼|<òNÒßîF:ÏëžûëLd†êÁs/.A‡g Ã×èãq õS™cèèÕÏAi«€<|Ý{ü‘ÊYVˆïýS"¢,®¥Ï‚aiÜã#Êb„ú«¥ ×-ކ¾‡'Ѱþ7Íyœñ)AˆáYŽ]¦~ Ú0Ê&äEY@^žAB^(Í#¯ ÕÛ!  9D^ õr y(–ã ýUøÂ?¡ý)0#EÌgÐ?z/$¨!Íë‡î¿È Øž5Î!7BLîÿÔ`_‚5…úi¡7€"µ=Ô@VTˆ§…\ˆ'}¨¼˜Ò§@³ˆP#›CŸQl²Û³ç›ì6>ÞÛçBJÏcj•LªSïíƒcÓY¹o‚¬iñswÊèS@ÿBeŸ¨Å¯À.+V# üÜy×ý(¼cR‡ê/é‚ë§î‚€½S»Ìüv™c[ùXµ ?}—ËA&‚]°Ã*Í縒¸ýI¾ |ºaWÚØüâ©sƒZ8ˆy•špÜ7áî„‹ÉJö°y;èm¹=8°X/\¤ðñ°áŠË³†+bVf„Ã-³â:.¯þ¾<Çä.ÇFúl°`¯ ;Òäëa«°<´®,ßÃVüˆ Cábï[ØDqÎÕ¾1wØ)DXâh<ÝR¤‡!¼Ij4Õl¤û±o‚IÐ)þ&tŠ4 Ý7Á¤v–¢v÷ \Ö„Ž«<ŽNÜÎ@Ñá¼ýU] ×…W²Òìt*,ÀE¨Qçë8‰œz±{pêO?ìCË ‡âg™ÿdÇË›7‚Ma0@D öØÔò6…™„MLØÔRMñi“à©Z{l # jH£´‘°þß„§Æ)΂N§'ƒSÔæ?R— endstream endobj 1079 0 obj << /Length 1757 /Filter /FlateDecode >> stream xÚåY[sÓF~ϯÐtú 3xÑÞ%Þ M ´J2}&£È²­©m¹ºÀäß÷íJ–œubˆÊt`È +iuîç;ŸÖÔ àõ¢ÀÓœ“H„^²> š»ÅÂ3‹w/N¨Ý7…ÓÞÎg—'OΤôh@¢ ¢Þå¼/êræ½÷Ÿ/ãm•“)çÜ—O'S!¤ÿ¶ÈE¼^g›…yð:ÞLXè×ñj2e<¢ÔWlòñòÕÉée§\2v¤•¸ó–™Ìä$;­™*„raÌ,—üµ*ÿédQ¦ d³Y0‰ÒÞ ¼<|åD†ÌûÜl]{°†°Zy'ºtRΈb¨8™/Pë~¹ „3åM™$:äfïû³IÈýz“TY¾™Pÿ£}Sy”’HJ†oNyŽk0¤y'ÛTˆ´^uúT0Hu¢}éC +;êï„ Þnº0!kò÷ÈÊd}KÀ¦Y»}of«Ô%•k¢àŽÝ÷ØHLòMYáRø –Æ2.îP¥BPÕY–o›9ÜlT…=7©Ë :'ŠEÞ²G%u80L#re¥65.záþ*». _qqc®­(ãh‘Æ•]_O˜öovYÝ© 2$Aç Íe¶É*LUÏ]JRvI%nW• z††„Sv;~{ž„ḭ̈ž–UaYøŸ³ji|){åþ[繕ÞXÅjÔ?Ï7*u‘Þ)ª¯m‘}Â*I7·t€ ºïB`•Ù¬¾K«º°oý…í¯êô©3šŒhÙõ•y¯4/^¼<‡¿ÛèÁty2 ˆˆ¢}ôºnë·Cí ’IµjD1%o~3ú³¹‰G¾…*krgƒ!‰­Ÿ&R‚sÙÌFeˆM# ‚-à܇ŠŠG€Ýc "Ê¢! âžVÉÀ41ŽV©‰ä|¨u^äk‡Ú0$šªqÔF NÉ¡Z,v7°0‘0v ˆQ§Àz{5ÏZÍC ¤Ë üN¡8²èþiA­(ñÃMz'C¡‚ìÐÐzi*y¯SãY•OÀ©Y—E‹íñ§æh½)õíX0¿r*ÔeÇ+긵òÎáÀÆŽÔAxµm™fp\Ž;dJ A»³¹õ¼N’´Äp•óB·:éQ(Í¿ Ò!Zh DGQ úë~DC©ôÒ-“ ‡‘èìSªˆàú¿WÔ\91Oòc€•}°ò#5ÜÖ³óßOMã¸e"ì|/N1"%¿HF ,þh¬º ÝÞ÷2áw¨qj––I‘m«¼h™-|!#ÑM-¢ÎÛ'Ÿ‹¬à³jä x‹ÝïVÌ´@ áBsYÅU]ÚJYçeµº¨E¯ëÅ"Ãf±ßÛº@#µŸ—iRßjâá\ªDb Ž¢¸ŒZ~ ©fÇ!0|‡ÝУ@0ÊbZÁ£hµ<Ð:Kçq½ªI Ø8þ² °çoySVéúv­$4‰zø°ÔG@ÒÐR\=º5l$®Œ]‡˜7S ”øVâ«ÎG8ãft~wŒØ Ý—K0cKʬoqK¼ÙB7® ÆUVšÿgi’͸ñ"®Z9ë-Ô´ÊÖécwæ_×öÙ:FÀ¾1×ùÍEŽÌ™GQd³YÚœ×4¨º®×ömŒ]µ´%m†À§¬È7ë´?Ì A‘Å×mìâiÄ¡e¹Ç$à}žÂÇ•òðÀ-lOŒßüqvþÂ93¦TÃ'ÛáÁaÏ8êŠÉ=;W´ÎË©mf{ÃÐõÕ`Ö˜Y7âG0wµü2ÊÍ‚ˆh˜c>Ê¡<ðGÑj õ^ÀCs øÍu™³¬H`K7ÿ'Äw¶ú¡&a4òWA÷9þr€o;°ÿþÓZ¥Ùý\鮬› L¨½Ý¥µ¹Dðpf®€$#uÖÒO ó©rç<<¯²æ(ëoô-µ¢“Øo¥éÍ-øÿ&/ÖñjeUáܨ+PÕÇ}:~¡aÎl o¸8ø¬9ÁGÏ~¹8uô)j‹ð¤€¼²;Ð1/@דˆ[Zöëù;£½Wåj8ˆV]Íüä<!šuÍø„ìv_—}âs¿,t´Ï®„ÍÜÄÐóͰìf&ÞÌçv·ÙÕü±Þ›®ø`0]Í!WH,ÝùóË7¯O±d„2$I¼±wZ€y£g@ì&;óa]ÚÅ$›ß˜31¸iˆÊ…Z¥Mƒ íoãæ·¸Ÿmö6ºƒ£èÀCÕçâ  ‘"!¤¦e¨éƒ*,À5GIŠ+cÆÐM àtÿצ‘øC¿LÝA&ìWkZ%¤Ñ¿c[¢ endstream endobj 1088 0 obj << /Length 1885 /Filter /FlateDecode >> stream xÚåYÙŽÛ6}Ÿ¯Š•ƒˆw1-²´E63oI0ÐȲ-Ä[%yÒùû^.²L™;’‡Ä4EÝç\Ò8JáŽTIJ‘bYT¬®R3[Ï#;x÷ê »u ,LVþzsõì%çN‘JŽnf‡¢n¦Ñûø·E¾mËz’PJcþ|’0Æã¿êͼÎW«j=·Þäë Éâ]¾œ$„*ŒcA'oþ¸zq³WÎ ¹ÐJ½òÈL fR”‚ÎL‘1„)³f6‹ þ:•ÿìea"VÜ,f„kiï?¦Ñþ¥ˆg$úl–®"X€3-£ë«¿C:1%H0æ+.fó€VNPš±q´r‰8¥¾Ö]SÖÓª.‹vS?ë'Œ" AC?a a‰}ýRÌ–¥V<¬B’JE |Â+vùû—“ŒÆ»uÑV›õÇÝ›"Â)Ή~3¡d\‚-6°‹ªŽ?±6Å·ð[ÏýÛYÕ™"RÏŠKy'ðCÊS§W.cÂÕ-º¶udŠú‰J­dIºå‹|=ÝÇÁ“J%0ãÖ=µ‹Íºiõj€8 %j̱óYo"ã7¥,¬vE*p'÷¤ëaÏs²1‘:µÊ·ÁsÉK-”?&¢j €ŒÅËꮆìæP’æ»e]¯Ë¼uã» ‘ñC_½ Ì3”î“á2^­«V'ïÀ Ï. 5ÌY÷ zªÃ aK°D“sEŒâ|àè]Þ”ë|UZ×63늓aÆíÆ>Ósë©«ÖöSW¬} u 1‚WplwoƬÍ`œQkm¤Vù«²uÂNól·\Ú©mÞ.5Ó¸ÙüfqYTÚ†r 1ÓÅÄŽ+h°âlƒÎ½ÚŸæ—}Ukuó]›ým&{t‚ßåDz9Á"CLCÅ¡ÃïÊvWƒ .d|?á"Η»òy0í"ûR9|ÍFHl„ôHGˆ‹,žWü{]¥[]—K0û^ï¼ÒÎØœê\öD–tâL<ô„ɯI¢5Ën)WÆ^VŠI’1_ƒnëè¯G1Ô“} á+‰óÆNׯWÈ®ùv§Í n&¢Lì&ŸÓr–ï–í­ƒ"·ÎƒbÛ}™‚Ba‡ Û‹¶U‘/—¶~~ýöÍ‹gÈš %¹Šð©&Á8C„iòPÙ…ÔÎ)0£P»–E¿€ÚGÑê¨ÝÓêr õÒCÆñ—¤ârà¯Nù#Ä.8¢JŒ@ì† ¥?Æñ]j«NÓ Æ—0<ù2†§!†÷•†ÏÎr,…/ÄëÇ#Ù««‡QŸ2»ðâÁ¹žH˜ã¨“Ðb½@ d$›4Ì2Z° 7,ŠÃD›Kò!Óœ°^›‚|ëuˆ§¢0e^x z@݃Žx >U†/¼Q´:Àóµ.+àbŠãöÓ´€âÑ0&ÕMRhƒ`•‡ø×ãPµn@ÇØbíxØw=Î$bòœ)è…gŠlp¦¨ÌÉ»¥ä8uTAê0¤N£=ÅÃÔ]æ¨3à sÕJ 8PhIHÀà¶ð“ O‰Æf¢ótˆ{&¬ÍI4UgÑ K@¶Wÿƒ í¢gá϶“MÐeÝ <ÞìÚí®µæuÛ†Ñ8ö¹êŽ庨¶=ìöª¤=¬4ó­Ï®ë£CÊÐÒh¡¯«üné–uç÷õÍë)c[—³²®Kw¨²ˆ†9µm•öÛ믕þÿΚá®Ì:NÇ·ÐÑ)+¯ ÚêƒsâS;Úe«2_»7×›õ%saGMSŽ„`£Œ–E%½€`FÑêÆ×ú8Á ºl8›€í£XcÚS 9ÏšYn¯€Žúk(Oš©Qx’ÛsÜvÛÛ1è©óúÚïÝSŸg¢àœH@ãþ‹Û:/†kúh0{Ù†0×.žÕ›ÕàµeÕ´>4yèÊ:t;]é·AWïÈà#)ƒæÐfë32§ËÖ¢0Q€àJúJ¿G0¦ƒ@Ϙ¦üæxýö& À(Fñ½Àï’Ÿ 4æ, :=ò«„Œ#5ì¶ïͶ Á,†@“óÍ6ATñӳ0 ਇߠÝr€»ûûç`µrÊÐߦ­Ýo¢ìdoD,}^2òµ²HˆÍPÖWëO!39’dOæ=´'°’ðyÂÓ ’\>ª†úÙßî ~ ó7Û~ì( Fsw¥îØØ!}åNãýûY;Ù‰û¥„2 è‡åÞæ•î‡%^Äõ÷Ö–Žû†›™+*žºós9×»^»qŸúÒ¦15eÖ6å6¯m‘ê§îÚÝŒ‹Íj•ÛUÝËŸU[6Û¼Ð7WŒÃ ÍQ(À©·½N¦pŸ‚¼lS“¢m’Å*/’f‘ãD‰Ž'šöâ}šv·nMÿd5åÁ EBɳõ$‡{Iö7I·%p'ë׿Ã_€³„4”º`;ðªÃߨpU1-‰¤Îú·ºÚ̺ÙEÙ4³Ýu¦üª,-à endstream endobj 1101 0 obj << /Length 2636 /Filter /FlateDecode >> stream xÚíZëÛ¸ÿž¿Â8Pù°fÄ—(µŸÒC÷noÝO›`¡µe[ˆlíIrö¶}g8”,Êòzsq ´(.¸¥¨!g8¯gd> á?>I‰‘’%*ž,¶/B;[­'4øõí îèf@8ëQþuþâå­'ãÅj=ÂU Æê2\µaZJŸkºo6e•ÿ3mòr7•¸•Ñ„s ÒWÎd >`@»&ß5Sð íŒ} ª¿õÑ<Þg·QØ—BHÎT¨Û½Þ‡:t,“>™bBÉ–èšœÊzø7nSÑPqZmÉ7énYdc»JÃ"˜qtW´ãb* ¬©žØ&"ÅLºÝsÍiý§´Øgcg„#ÊXôŽÈÇ„2 !áíéÉž‹¨ÝÔ&ÕÓŒ Šü® ¦Õ#=»­èŒU–6Ù’îðÀC÷\Ž‰Ã°Ì·ù.oÐN½ƒx’pS­ÚElô¬Â„,2S¸f1NS%ú» Zž·n*—ëTð7:…vªÁ4ø1²ÚÊBЖ$ƒt¾n:Sq4›lL% †¦óįÆ$Ṏ.8ê¢\ÑFv8Ó&zþ®­hÆ‹”SŸðô׬ÙWγ!h4 ‡¨ GÀÓy-­iíõ»ïàß$EÆB‚†#HˆÒ$)Ó!’ç>" ÂÖ@ÚD­¸ŒHˆ_~ þùŠB·Þ/Y]¯ö…Ó¢šTŒ(Ýò˜6W²Ê°›h&vÀ æè2`@Úˆ¹ÁÒh e¼™&ªÅ´zLEè% ¤Sw·z…ñïA›ÜÂÁG7 Í×2l¾¢§¼Ü ¸nÜ&ûf—n3šÊ·÷Ežu„ôzQEF8k‰ÊÍ[–1²„¸i WÍŒ—{g° ÒÊ1º¯J\ñ)_b”XJzi~éÅ à<– NãŽ0¡X¨€1†«`i"¥?CÍà`ü©¼qÄ¿í3‹?0¤›èÝQR¨è¼ÛñpðŽ=½tùɲ±9bÈ*û½©ÒEã yÈxÇÉÀ×Ð+P0!-¨KÕL%ÄNE0“Vvƒ =[³ÛÁP1–Ø V6QµTž€Ë6mhK5 [dfY÷PAr«òýv ÊΚÙÊ$’ã³Â\Ýì6ð7¥?dü+zÈš: ’Á»|½¡¹"#¥ô¸:x¥}´'„÷å*˜pÉ^!ò´ BÄŽŒ¼,_´óu– ë(1 /0I[®0 ÓpKÿA Ǻş–Y½µãeVK஋ÑÈ8]. n^]ÓLÿ¶\° O×Ñq.‡Ò‹(bîmý#œ®¸Zê3R7=Ü3­”Ö" N½¿«3ˆH`šk•÷•%§”¯dÂ!ÿ°Úõg4d3f‹ØÙbþöš®*´w/È °ã #Îãá y %TOìòsj©g=ò‘ó 7í/¬»¥¦¬ºâ¢»ì^79d¤AvAݹ×í‚£pÇ­[j vPÔ%½ëˆ»Ç‚ÅP”îÆGþÀ…bQ¤À`pølohWϺåcºóX =A‚'D4¸™A’ õ¬… Ô°õ â¡žLrˆ©8êì´´´OžÃß°«8 w&!ýïòû}—]zÎÒ`"´ò2 Ù^>ûp YZƒ%¯Çó¥ý«äåËÃÚùÒ ,ƒm)–‘ebßk1üºþ™ñ6”É¡hUýhGÍ+)¤í ôOø„õ™C 7íwÞ°¼¶!ó0ë£!¼·'"ŠÎœàwp ÞÕöа™ éDBžmæ\×L&†…±¼H×L&3‰sÈæcSµÍbf8¿ ÛHAF÷¹.³Uº/š‘:$L˜Ñâ"Œd2rŸ³»è3–@,.£h¡°Õ1PôzõÎh›ý!¹@Wna[XØ–ûÆëΡ‰oÆoWy‘Ýödöæ ‹¼ÆÕÉÞœø¼ÞœëÍ šfØ›‹Ï6ÍD"X¨ÿ“]³³M3ˆ–P~yÏŒºŒ÷1ø- Û)BWj é"hŠýfû<¼ 1ù:¥‰*W÷"w»}}ª¥ Ó` ©4ãaô%í©9Ó˜Á”b±qæš÷í¯ç×WgÄÀË7æb( $ ROŒw¿üôúå .»rWK‰aî_-K×!þÚ®cdè—GÕûHO'ïæ¨PZ ã­È ü¨“ƒëÚ в¸>ØœžÓš(RzlÛ§8n6©[¾IÝj¼—à_W®·œÒ¢°í…`aÛrVA$™„¶;Öl•«.°WU–=²£ì:‡«±Š"«Æ¡5áp±CÖèyÈ*Lb“ô%÷Ò!²^„-!«Çõ,²^‚q‹¬ç²7òáÌQâ.þ„ƒK¢ûòôl°û?Ìý—ÀÜ¡J8d0Ô6 ¥<$<¿Þ5]yQcMôDòÃVº9—|ᛑ>ºiÓQÔ—Êø l[ÆDä*q38› ö5}’s]OÙ6aí…Æ‚úûqZóöUÿk“Ñó’Ü5ûw¥ë¤ÎÌå=eTWâ\‚¯«p<¾'~up±úæS™/Ï6§~rÀEÿÃÜ¿;ß?ç'„döBc;>g~}àD áð.çgAÆÀ„úĘc8íCN¯÷qúÖ"ÑÝŸ÷ó×®õ0JÙ/hö^ŽÝ6$‡üå'ÖŸÿñãÙ\F®2÷ÑËŸvX[¥XÏ MïkŒ‚sÜ,6ÆA”‰|ˆ2DÁ Q¦Å>˜è J"Di£DsЮ«ià'ïí… ÊÃŽ#³zèÔÕÂÕ#®.÷mEàºË¼¦OPeí4ÝÞºê¿ÊÓ»Öùv›-spÍÂ9mºê~e‡µF¯9Ÿ;[®ö;Û•G€§ôÅÚlû/uí¥µ endstream endobj 1109 0 obj << /Length 1920 /Filter /FlateDecode >> stream xÚíZYsÛ6~÷¯Ð#•‰PÜòØ#iÓ;vŸ’ŒG–(›™LHÊiúë»8H$I¶œ>¤-‹½°ûí.2ÁðL4ž¤Œ!ÍÕdq{†íju=q^½8#žn„³å·gß<bB0ÒX“ÉŪÏêb9y|w3ßdÕtÆKijéŒs‘üQ•×Õüö6/®Ýƒ_çÅ”ªd3_Og”iB)¦o/^žýpÑ ”¨¥¡©™‚š aÐÓ«)G„q§f}“ÃO+òCÇ‹Ð-,1§Âp{ýO–ððå#¡èä£%½Qði=9?û3&“0Š$ç¡àæ]SGÄ …RBN#V‚8J]f«ùfÝÁÃdX#N¤¥T;ò×ϧŠ%›bÑäe1%É[¿QNAZj6Θ§ ŠÝsn=ziíƒÉ÷§Þ®_jHÜWƒŠD*[no°À^¨î“qD9 Eºˆzâ™Ò¾Šœ š²–üf^,×YL8K‘9[Ù$&{F¥Ö“8›2f:p,E„vÙLà=•y²Î¯*pî¼úä¾{VÖœE•ÍÿùjJÓäÓö¶"LØàÎ>ïé¼È㾞^)Dàí&dHŒiIˆ"Ô> ^dS ¹Éœ†íù¹Õ|arøùå(yR·[V¥‡cäÖBc®1yÅÒ¾bØ‹÷Hò*k6Uá¸ÜM…HæëM žE‚$4Àã­òƽ°}í¿^¯Ë+?¡)iÒZ¦x-Ãôši,n!Ü&Ì>8’‘è“À‰Ð )ªB8„>ƒè³iÍîŸÕyÑŒÒ8–Aà‰É—ÊÞ«Í^ÕÒ=uÏwœÀ´p )ø‡±áð´;æ…÷Îc +U©e…uÿ<œIQ›˜”í¼»Ë›T ‚å~<"Áãѽà¨îÁQ~æÞˆùz]B…VÉÐh¹ޏBLòûà ð(b)‡âÎB|ÚûD!­ÅÀÒrÓ¼ßx”z&¥I™ÛÄ7+ïðÍÊ@1'4 s·8G s:#ÉsF¬%ëØIBêqÑžÿøü\þþsŒ'Ä Q]æço0aÞ˜Íba«ëÕf *Åá”h‰0!Çá)W ð”ŸO¹J!‹Ø!íÙIĺö,º,‹l_oö¿+óe¤넆àCOiÐ Œå#ÇQ‰ÁpœPŽÔCàÖt( 6VX³ÿn1™ Û¿£0Ȧ}Ú”µ'{Xí@`p’–z€ÀFÉã;BˆyÊÚ|Ÿú•ÓG)™TY]nªE·^מ6÷ÊÍǼ¹qG $<µ]× Z‰äÂöm™oÎ`­néÁkà4W·àë­*kÿ°(í¨a!³wfWV'_é6uëÕ¼pž_€9ÞùmI(¡‰ôU¢Þéàyˆ0v|¤‹0Ò5 !·¬ÂHK@2mÌ)¤j }m(ôI5®©÷°Sû]ë ñUÛkçuå)¶ÜyŒ§™Á /,šÁO"Öƒ|_jÿ“=ækÕ/·B‡ Ÿ; ÈCs&‡>ìªÀ\:€ß +LÕƒ`m˜}X{ÚE6}ãjúÖùBÿ]ÖeÌ•#JÈ^ÀdDÃñufä^"Ò$‡€Òzw)°otãÏ-»nߟäÅ2 »×&Uöa“ÕÛ«ˆ\3vÞaÀ‚õÌ+ôÙ `ß(Z›úÏ»cµí} ÀQÕØ®3«æÙªuÕ†®šÄK …dFI¡Ç€ñܰJ)=¼˜ÓƒŠ¹Œsõ™bÎ.ætÿ —¸_ü_Ì·/îU̱*iâþÓƒ½¤ò—P•yà†C0tŸY3ÕÃÐX4 µ{â®§Ì_óÙVHd‹ñf·fê¯ÑÌ®˜íÎ0›5Ì»žÅ·õ©k¶õ £ʃ‚ÝWÎ@lRëÂ~™ý}@4€’Éx„§Ä€˜g×ñ½Q.šâÉŽùVîžo÷¿_éR7_õ^®¸+®ºµã*&ÒZ3}“t?OÖóªëEsÕꊰ¿ÌÚ;Ú9ƒÃÿH¾… endstream endobj 1119 0 obj << /Length 1770 /Filter /FlateDecode >> stream xÚíYms›Fþî_ÁGÔ)Wîý.ßÚ4ióÒ&M<ÓIƃŠKÈÿ}÷^@€¬Æ8¦{Fîv÷ÙÝÛ}á †?è8”"ÍT0_ŸÅönù1po~9Ã~] £ÎÊŸÎÏ~xÊy€c¤cƒóEWÔy¼ /“ë:+g¥4äfc<|]n>–Éz݃ߒbFT¸MV³ˆPq(ÄìÃùó³'ç­rNȉVš•{fJ0“¢ìôf Ŧ̙Y-søoTþÕÊÂD"¬¹]Ì7ÒÞ}ˆƒ>bÄ nìÒu °‚«Uðöì1˜$ë+®¯êjD-WHbŸ^™*‘y£+wÁÂeR¤™«Ì}M|’ÕjåD…ó¤ÎRwïҸݥpG--Z(Ì5)ÙAÖ3VÂñã¬Ù„ÆÁÃa6g4Âà‚þ€yRŸ¾Þ8°—€P† ò4m€ºçô㬥`¨öcj$&îà PæÞÆ.³Ã‹¬–ˆ3¾*V·ƒ ×60›Ü–}×àn^ù­õ¦ÌRs6$ +¯,_¸Ï[³e³u_Ö.Â&üùb4®TP$ù~üeŠjçT‚fc­uU°’jŸ¾M»˜g½w“ó¼Åz8.d7ùjÕ¤kµi’4r2Í—aþ>Æ,K›“]ëcBgØ›¬Þ–ÞˆO3ÎAò6{4š½ÐJd[‹Ü¾j̉ Cš·gòí¯ÏàÿâÕ‹1™ê›Âm'«©‡¼Ï³Ê8ªZlÍqõPúÝ*ÂZ »&¤ ¤Ôž¹àиØ$íÙÈâä¤ö<‰Zמ{Z‹ìæÎöÌ'nϭ·oÏœÁ1RlŠö åXžþ·ûóˆšþÜC”TmÍÌìk¡äó«¬C%\ïÀØjF$œæ~/>„ 0°iNcÓ{áÃÒ¨W TæáËŠùU:/³ë뤅©€ÒhzjÌL©¤r Lk$€(&hìÄÙ˜©»)ô5Æð 'ý¿9UŸ…ŒˆJ+b<ðC^\o=ê=Ó¶Ð2O.WÙcœÔž-³VÒ0o{æ‰vÌä4kÒ¬Nò•{–‰ã–9]rÐÍ»Aw!ïQÏŽ5/~~½yòºuJ_5ô·¿O&»éâ3È}˜vs$d[áS+IýE> ½}r5ÂÂZŽ÷-ú}c á°p™ÔcIËcD5­­}1ܲW[‡¢`€ÂøXëç=tGÕvパjw,ǪÈÀ:Äh'¬ô ³v×—æôߺë2[d%X˜™â ¡µTîïÈ6|Y› ÛªömŠç¬_€ŠMm y%ýà©LØÖî¹ç¸‹M™¹6¢vÍ !Ì=3˜EetŒød¦îæ¢Ü¬[ñ^X+CzÒ•6³ÊfטÇÉ5>®¡R&ØüKl˯`¯À¤ 6Uæs~M•@JëSøõZ½î)-³äË¿þÚ)l !ZÑS6¹“`s†8P  ÁÂ{ñk>ÀV%|j~Í\íé³—O\a•lXöν‹åø ÕˆÞM›8…ò®¿½‰j ZãÎÁ{|ð@7o hiVÍËüÚIÿ}“Ms»Â”eO œ°AMÒ±×#Þc®¦›«cJ‡<Áðp¿-‚ëÁ{°ev˜T5dá¿]ú›w+—~Ó¬¢ôQŒžTú§ÐêJO©Í«}¥š#ÊèJIÃ(HúZ} $f*–êzŽA{±ÈÕƒ‚)X>MãQ¨.øšk„ïÕw”„Ôö%¼ïÌ7EåK·­ ˤ<¢("±@ÜÖÏå5þ-’õ¨a– » à`S’€€|ûudWiÝÙyµ/–Å(Žùhs²[\4¤#Æw)/öþmj|usO׬‘V~eýèF,à”L4‹˜¨ˆ:¥!M¢Öu¤žÖ›2¯³/>t´Ç‰×Ótpœ,¦ô½úxNÁ# ¦œ‡~ß?Õ> stream xÚÕY[o·~ׯàcòPЇdI/. œS‰[´Mò°’·‰YkHk$'¿þ|³²][’³+É-ÃFÔGÎpî³â’3Ñ‘ao¼£h2á=àC)ºPLðÙøè GP çb¢Ç¦à "éVF„FXa“cЯ"^+%Æû¨/Tºµd<‡Ž™žŸº`™\VÎÎÜíPQÀÒGoÈ¢ ¢ Q ‘S)X@u7`ÕÝ"»n-Ф×álHpÇ](ÈNÁž@”…Gw§â"î>'GˆE%'=“LpÔ Å8Ñ3£˜@ŸÈ&€ÄéÁÆzd%J‘Lˆ¡¨!Ĥg‚¤îØlB*P’žPBwÎ/¢œ$v0ìd}‰ØÈ¾èKTuÃPR’ ¯ªÃvìвJ!Uî„5¡n DT$ÈÅÉéÞ„“w{ ¨îö ç_À#«Ïx]ËTÔ½YÝ£èÞŒ {µ¹Ë ª»b†Ü¤žä’*;ª8ºÕÛªK©_y§6‰$à/bÝ‹«âκWU)Üáp²µ}†ž“ê ÎfbÕÄ×qƒVÅÃ)ð-”:B5+lÜ [ÀD™Áå$§§3uATV†jD½6äõiÅ@¢kÙ¤Î_Ašä4…?PI÷z2‰TgÞP°9(¥†ð0)¨×{/ rwŸd“ÊŽ«¤¨Zöp¯‘•ÂÉ’ËèÉ“Ñø[ó‚ Bù¹ÿúÛïFÕX²Í}q9Ÿ¿}õÕ½@vÙªòïOšEkž<1ãx\^ãOÔ—ëðtEŠú"¢ñ ¥öÁ½¯¾ƒÔÜÑ8yüÓ²™¾¨[óÒŒúöÄŒOë­¹azú¿‹_ToêÑøP/Ú•¦Òý£ñózÕ\.§õjwºµÿÖg³êëæƒy© ¢J.ôŒª%v+0¬Ï‹§½\'5•gƒm_\NÚîóf‹w£ñ×Íò¬^®Ow¯U†)¤‡ÖBʶÀØÁ{«¹2äbsô€<ëôöÂŒ¿oN•?ú¦š×‹³jù yí¬jk}Ÿµõùê±*å¶i‚¿cšsoÛoÄ‘-ñz”‚õœŽ0ômÓlNæms2nΰv¯®à\rEðÍJº&ò5Q®1îšðŸp‹Ý~RDè i'g³fÛd$ ÙÙ˜Òë o2¹ÆÏÏX¿yº¬Wuµœ¾µUÛªí) *¥­›ðgÑÖÈ'«‚ÏÞÆ@ûH³\UóO'“Åb ³Bnå1B!Ûõ”û‹ñç¤^ÖíêPA²X-?Èíè´—±I ·C|‡¸³Eµ<{:[6öò¹pYWs;­ö”‡Ù!<Ð>ˆå¤ò0â;™œlÈ{‰ónòtº‚$[Ÿ]nU!ªÐHûÐÿõ‰âq¢Õ6òïéK´—+ùÈRýŽRV/e|]¦8Û¢„HVÛÒ² ú_Ðg‹F|gŸò݇êüb^¯ŽK¦>«kW}DÇ ¾Ù^¤ìäûÃbÖΪùìcÕΚ…&Ó“ËÅTéí)º¾yH4÷¡cêb|Bô‡~ ;¶:Šô ýBá'úðq@HÜnÚnG‡èÈÃîVýn¸$SøÈÎ=¦íøˆñðøˆ|tX …¿Õ+u´Íd1 võ–R¾]î«Ë¶™6‹?v•ü¶¹ØöLâtC,¯ÁÞ $8Ý Ãß› oæ°Ê}²#÷Å#r_<:媣¬œØ¤0hÉñž¬dÞhåÚ¦™5­ôä“-q¸îwŒP²çuç~C þH0vêÓ–~ *óÜŒhû2ä톂~Ìû~ 1ŠŽ“Ë—÷fÈÓŽ˜’¡1•dË®iHÜ šlu¦^ û`}Lý@b8@ŸMÕJeÛ )a…<Ä yà dIR?0 ØÎèÚ2ú›°Û®wÈòÎN~¨5S§ÅÏÅ®9oÛ5ËávÍi€]7@]^r?0RºgLÚrp÷¤× `pjWé’Ãàµé)ÿ^»â´m»–=³æíN¤\?5,WÏõ·ƒ«•ë­äx†Ì± AC"V†àälà¸sFzöâÞ¹hÞŠ-nÐGoŸb~úýCrï’‘XÊ fD}rŠYÑþ˜{ÂŒþIÆS0ÁC÷ÈÌÞ†L»%˜MßÕíkƒHÐg´,aöcÊ–‚ïáÿ ~ð£õ¯rHÖ_Âz3Ó&H0¶§]™i¨Orà~ >¶c’~ %’Tú>ŒÞùóÉLÛ„þªwhÅÑ_Øu»“Шz±x›KèrŽ6çÜ %ë3ô@}ÚMXûmôòÙ8€ßáþðCÀïpº5-ýæ— ® endstream endobj 1129 0 obj << /Length 1678 /Filter /FlateDecode >> stream xÚíYÛrÛ6}÷Wè‘êD(î—<¶“´IÓ6MÜéC’Ñ02eq¢[)Êiÿ¾‹ )‚†d5fÜNÓ±glQÀžÝÅâ,HF~ÈÈà‘b ®G³ÕvO«ë‘ÿçÕw$Œ›ÀÀIgä7—_?bD02ØÑå¼kêòjô&ûv‘oë¢Oc™x<žp.²—ÕæºÊW«r}í¿ø1_©Îöùr<¡Ì’I5~wùüâÉe .(=ÓK;ò–› ÜdƒŸÁM©9"Œ{7w‹~Èß[[„*DŒpƒ9ÖÚ›wxt_>a$4}tCW#@4ü·½¾ø%…IE’ó¸þPï°B#EÈ0°àdŒZü±-«Ââö×aƒ4ä xDüè7OÇšeûõ¬.7ë1ÉÞ…‰rD2BP;qÂ4$\'nN¹®Ç°"dvjãœva%îÂÎ`¢™ý @LwG”³fÐë#kF¥BX«‘„$r©ûÉãªÍCT±8w1UÊ)ÊXgÉ\Ù~B¡ÝD0Viãd³¾ý€!¿ËN¼$ï„b( å Jéی׎hdL›C·×xV—³1UÙ»¿ŠÚû½óÿðl‘¯¯`A—…ÿ˜‡¸òårQg³¼.®ü³÷ÖÀŸ‡•ïÀBiÜ΂Ûeì„9« po&!;ÄVvåÔ "{#jŒâ‘5¥äáÞ -Rî0`¨ª[-,-ë)ÉÑÞjPÑb€p˜®뇓8Ð0[’óAP5Fh"B]D zL•µ«ëfB}ôMÛÝÍ%³¼‰oßÍ&Å6”2gˆ§gpø®hÚæ&¬@ñ›uZÍB$*mFRQÝï²êj?Òñ±¬mï®mïžÏê¢*wàù.Ö¥øþ3nÓÞûþ'¼fÛì×WAƒ]º´¼ÐÆ^6ª ÞažîìÅB”h·ºY|tsq¸>ˆX*Kó¼\öä»É¼.ý›Ìp˜Ù[çªÌQ³ÅþódôF endstream endobj 1139 0 obj << /Length 2434 /Filter /FlateDecode >> stream xÚíZÝÛÆ¿¿BíC@Öf¿?b¤-š¦Ab$ñõÉ6 V¢N„%ñLRvÜ¿>3»KŠKQº3N(¤° -—»3³ó±ó›¡ÙŒÂ6stf„ NÚÙrwCýl}7 ƒ_þqÃâº,\ Vþõöæ«o•š1Julv»’º]Í^eÛä÷mQÏBˆL}=_H©²Ÿêê®Îw»r^ü˜ïçÜf‡|;_páË´¿¹ýþæï·=sÅù#¥Ä•'bS rF1µ•„ Äl6%üíX¾ïi1nsÊ/–\!µWoèl/¿ŸQ¢,Ÿ}ôKw3XÀ,Œ¶³—7?Oñd‚-eʸ}×6l•%†±ë°ÕÀN§\_S&÷+ä;¶Ÿ ŽXÐ!çDiV¿úvnEvØ/Û²ÚÏYö&nÔ3ƈSŠãÆ…° p’ø=/½BßÂñæ`•}~š~ºy».;4ŠÀ¬!²'ôš*ù¹á*I¸)·S= ‚7h͈¥r¬GàÒ©QnDªÆ”Ÿ`ŠPe=)¥ÝÀzÞƒ¿Œ'áC©&¦SæŠ0ª»UϽs'’”ÃÄ5N$AR)ÝĉN¹ JL<üS¹ I FÔë¦ôñß"gð='‰_€3ÅÂ’I;‚TiO¤ò§T¿àOlÊ ¥g‘ç‰ÁTê ÄÁ "A§É¬-—sn²wxŽ¢ FlÂ@f›\eÛ"<æÑiòí¶‚ Ïf˼-VaîßHàÓ1Âl!hŒ¯,J#ƒs%¸ ”ì6‘É£s¸nðY€kfNmr¢G·# 4m}X¶‡:òcÙn‘–Hg“×ù2AÙ€¦š°¤Z‡^wv¨;ÐgÕéT„‡uuدHð’(CYÇ{ ÈëÀ D2 ü¦ˆƒÄ:Þ.8ÝïE8f ÆøfQëºÚá“;W„lµC’(ŸÉ0Ãá ÷lêê¿Û„g =£'Ö„IPt/-¦žÒzã.¤6 ä¤m–‡ç#A¤Ã¹MGxÏ{.ºÓLÞ•<û}˜Ÿ°™/¬4Ù?×aC Œ¯ÊHÜ®.EÙ‘QçA‹)oò/Sn¦ˆá}"hÚ¼nï½7Tè?JûãÛUx(ãä!¬YÅ‚ïJð7w~¼óB e²}ñk÷jì•Èd?ZÆÁ[ó¬é)u’¬»”韖€q¼ã†S /šÞÇ9øÊœ%Çq]™ < º'N†Àâ–)pªÉwqÔG­_×w‡]ÑÏÀ{<þVõ }ÖS©ÂT~ì–'Þo‚Ãâä.oƒ× €›ðØ£NRÔmî5†u‰þuØtž½¨Ú"¼ ï Aè¤ÞçuÜ’¯VᾄÝê_²¬ªÃD]ì*ÜõÁ‹Wa8?‹Ä7ß“;aâ(«CíQ*\‘x,®\ö#h°¬†Á§0¢bœáT4вC£(<Þ ‡'^ø{ìдáéèŒðSHÎÊåxâ¿ùý}]Ý×%¬'µ²O3fñƒüò]QÇ[½Œé`ãíö1L~Â1\¢!—„‡mÌ‘­Ï‘÷å2ÜÙ¸mÒ B#Í…˜3b~=¥'.!§rù Žt€§…˜)@Ç ÓçáŸ`;C¨ñ”»XH¦‰0îL%‡õ`­„ëÑ+QMË=f”©Ô(½ž«’¤ˆåfÒa!ž")Sœ0©€8¹³½~¢Ußõò "¤J=jWìB®¤_tg{¼ƒFTÝ”ÿ)ª5®è`fÅÏûàœ·[Dš¢9³ô¾™ŠK­ˆ5=(úó¹°ìW”»üþ«]^nIñk¾»ß¤ªï&Œ©xpïQEXG -Ò#õªü&œälákÀùà”ÒnŸfRK‰°Ö“¢òbÁœ#ŠÈ+påT¾˜píR*½àÜé¹ÕI}9 ÎPÌ<âôŒáôWÑ9‡j]-áº*Öùaë ’mŽ#ã‹a@tíø¨,(×Gõý ÎÑÕãØt®¼N[ Ä ÷x·~Q ª…Q¥ B¦øX¸*DÅ¿fB>Èj?ßäXE>ÝC= ·îè²*¶M1¥·U5‚Aΰ3VµÌ>)Tà ’Ràc T»¢íÀ܈µï@É«°¶Pej–²ö¸é4`›ú\9ƒÀ’„ëTÁ‰nýùù|Y8°’©) àÝýa(?ߊI¤¡ñfë½=ìk"J8|$Îa´áïÚ—“¾Äâ.`]œ~ñ¯~ˆ¸>.ÜWqá4Yñº xýë‡ð÷,=Âò.¥,RÒB|Ün„EÄúþ¡íú‡5W á’_¥¹*à×uàýrsõ*lCs5ázl®ŽC pœ0×á ÎÈìˆ1ö&BIÂ.}®œ|”*åºÜ–Pa ¨û=J‚AQOBmzÙÿ­Öò[PÇ[/œ¬jÔDÄzì©=©Ù,™€MgHãðû”&)gÄÀõƒ¤„Õj6CàÁ„@R¿~VÓyYí›xv]¡ µv·ƒ¦§XAöÓÊ^‘Õys¦¬Î¶zÞ9ûÿfï1… >×îg9ÕAÜbºrïÛ U]F=¢í©Œ zNDÏ/ÁEƒlJB¸Òá&5¤}?`X¹=EJŸÙŒÿ,1PÜËMU· oò…0IÏŸ|S oöøÎÏ ã›ÐŽ2ú¤“¶µ !ß‹MGA92ëIvÞÐhòSCûçWá‘OÂø"ò¹×ù$\ÿñΤ£4¡ì1H‡?صjaÈÐ: ™§|V·h$çIQqõÏêê;b[°™a¤‹ˆx9_Æ" <@?‹¸±ãNcÏ¢¶?ù¥z«†©Ÿ|†€AÓƒ9¦BBÆÁ˜©_²Ç‡õ<~È‚1f(«'÷ôÌzʃºh¾Åu‡f1‘æ½€’»øÉ±E†XŸ}K È[ÞÃ(ß<0‚ŸƒØù•NœÃ'Ú%oââYô÷WÞÿ÷¥„#НQ€60±)2ÁÛï7F×cC endstream endobj 1146 0 obj << /Length 1966 /Filter /FlateDecode >> stream xÚíZÝÓF¿¿Â"ÛýòÇòP©EåTD«–KŸ!“8‰ECs½ÿ¾3;»‰7v¡‹ÐIE lïÎî|îÌo'ˆˆÃeJ1£óhº¾âvt»ˆèåõõ•ptc w(\ýô"I"Á™áFD“yw«É,z?_Ÿvåv4VJÅɳÑXë$þk[/¶Åz]m4ñG±ÉIC® 0`Ÿiž0Îåe˜Ît"Žt]ì†\/sÅaÀš!‰öÍ‹Q®âv3ÝUõ‚æ[™B¤1“$ÒzRÁR“ù¨¹±N|&AÈ&ñz4ûáæ=(þ~/FÊ1xÊ”ßê-O¸ãhºDšI-C~}C*iXŽÊ+$ÏŽ #ÞŽŠÉL…v ùA ³<ÏíVÜÛÆÆŒñ'NÙµŠ°ë^H`Ç;Cð žzª§H‚'ݦ¢1¸"ଖ"5L@bH¥·?HK‘!;[q–§òìÉ0’é4¿W“²„'!×eeçî¼}sý~Áp8¡}“N<‰!/€¡5Keî,.z> N äXcö{ÚÜïòbæÅ†^t¼,638=«’> ŸRW« CO‹]9£±¸ÁÝá˜uØB1©ñ|;ç IGµ0£C’H´_ĵ—0“ŒEÆ´>òÀ sËüÈÍnÛN¡^8o«Ý’4²õbYl‹)̪C5DRω _RÀœµ7Ú§\Ô;FgÃñ¶¢*C\ã*ÍS¬Qšg½ q 3)d‹3¨²Øo€–œ\O¬1í@ÓV»â:7™cU³Œ¦ŸÛjn•u¦ñºØ‘æŽ ÄZ–4åmK*ñ0ê~g%ꥭð"lí…H†/œäÀ»%¾4åö‹å¾%ŠmY¬Ö4UmZÞ=\¸²ã7øD x‚ñP*ÂÛÏC’°LîëÁA4+ÚÖêç0„’Yç*ðŘР³r^´+w¤¼^"•«—=n#¢zË….WîpUM”ØùçÅÆïÜì¹X“Áä/7ô]þë‚x³(NëDàóx’ÑVw^¬ÊÅùÜ×O;>s‘½©=³õ§U¹ÆÕ™OxÓmÝ4=…Wõ¢šìÝYXV2Í;¬ð˶ f|;“]D)ªõ¹ c2¦Ru(ap`E|»¤Óµ %ù´­?Àqº£¯Ûe±£·;¤­[ú@•÷$h•⊠Y *=Ýâè³(J¦j7«Ò[p¿·ÍÄ#Y;´ü\Kà:µàú²ÖRö‘5,,èÑKƒ0FY+sYKIÕ¯3Òx6ít jÏÛ0™Òƒ Œ÷ÔE§´Ñ 6™ŽÆ!0r¬‘´Á9ô‡§ÝPBì¦iʇΜõfðK¼›| Ü×ZB¥û¸Wv°¦ö;<ÏBý‹°tP¿«ç¢y@¿ù>@,ĸT—úÎx–çèk®Yü.ôq«Tå÷ú—àê€~Àõ@À¾I§ á~§l)sÃ@ŒKh%‚j z¶<£L»8þÄ=9ê«÷ —&Hn?®-ûÚÒ¿oÜbNôe”’,½‡ÛÂΩ^I¨*ù1èZñÚSŸiú}©Üääz%{&ûVècYD>;¶avRcÌ3ÀÿÇX< ¬¹94˜‡10À•´ß]Æ…xs¼s‡1„¬H [-ML—qãÐ-¾YRÜ’>Üléã–Ä"Šu¹Í®¨ð%»ù[±í=Á­LU~p+}Ù½àíEؼ ¸:€{ìrÅ›‰ï…5‡ ©{ëË M(ò™ÍÁÝâA8“ƒ7Àä‚!O“gŠìⶇœà )â°ò •4çBÙÃU²(×*õyJp­Qà p²ì ÊS–„ÓšÃAÍ‚c~¶ƒœ~‰é” a~ ±CI~\PŒ>ì/”ä÷C->Ð’áG}]$^TTH7D0 -C¹)¸¤Ó„ˆˆÀ»ÛÆ6aˆÂ9¶þèVØ–$<©ÛyB¶†RàqKÙµ­õÇᜭ¦¶=¼qÓ[¦*÷UÓZ‚ÐŽ4ÔmŽ«x‚Ò_OžÒÁ‰ºi*‹upÈ"F+†c„íUüîG' !Ç æÁ¡øQñ\, ¸.ÉLt²£NÓ¸°j)ãMžj >ˆØZÁN!NÃ7Û„Gô~ü†ÆCl×4cûùŽ‘‹A'P˜6÷ 5|¿±ÝŒû4ï:Ÿ€þ¼ï{¡\Üë?€úíPN?vpÙo˜²ÝK˜³Ç¶ÆòÆsjs´ks oxëX7jˆnßËDÚšžô« Jà½ä„ýš“°Èý5d_© endstream endobj 1154 0 obj << /Length 2060 /Filter /FlateDecode >> stream xÚåY[oÛ6~ϯ0ö2y¨8^%ªÀ².-Ztiš¸OnP¨¶ u,W’“ýó;ä¡lQ–·õ†Eƒšâå|‡‡çòQb ÿØ ¡ƒX’H=˜ÜQÛ[^°qþ∹y!L [3ÿýþ\©£$¡ Œ®Ú¢FÓÁ8x6K—uVC!D žC)UpV×ezs“/®qàït1ä:X¥óaÈEÂXÓáåèÕÑÉh ®8ßSK3sKÍÔ„‚žNÍHK„D5«Y äçµ,ÆcÂe'K®Œ´ñ%LaðÕ€¥ùàÎN½À¦¡5\½íÃd‚“HJ¸þTW=°J“˜±ÃÀFù¨×Yݪ¡”4¡D*æ£^å6*§ Ña¶Ê™$º:™çÙb(XPWYyk™Õ¢ë¸\%ÆLà~„+·vü|¨E°ZLê¼X YpéFÆH¢7 C¡ÁÓbÐË®¹°žôÎuލ‚ßð§ZwWÀúÀ¬jV­F¥ˆz*é˜èD4’ßSEI{š$\r~ÛÌ4–Æù"FÛ2³Œ×V†ýÇ·r)"™#J´n¹± åßÜN¸g#+EzÂi1ð Ï÷»\F£fGOPî¤XTµiÊ`brÅ,-Œ´ÛÅÆê>(“HéBí>M “õ)r“¬‹–Ú2”ç³L“’“i“« ꔎƒOFó¬FÅ«Ìíg–.¦àÈó Swhé|^@æÕÁ$­³)ö}4î7ß‚…Œ’DÉzË×6.ÚÚ™§l á å‘›×6ÆCp±$bíeêþ¸í±[nÿ‹ô&ÃV]àίÓXsé¶¹¤IT»ô³`žz6­˜Åýi¹æõÀê& 5ËöW1^Ÿh£"脞N³¢¬C{Ø0[WMç¢Ä Ô®ë ÅŸm{´Գ̭Ìo­6NbëˆPV¼1­«$¸È²>—x;ëxîÏ me“Fò7ˆ#ó®¿ÅÞyº9žíγzU.ÐÊ·C¥ 8VÄÌÓ^§† ¯½—61…§¸mOäWŸ­S—t ç§ï^¿vÊúÅ-L PB—©PJ‰ýx‹’ C‡à-FlÞrXä-êƒ¼å  Ž·x¨ò–C :Þâ~[Qÿ [y€§(J¸ûðñO±€tÇ:Sð¤ïà)"ú'£ /Ž£½ˆŠ`íb¾/AÁ<œ€#híî5“-Ê0 F¢ØG˜Dò(“`Ž%Þ͹~*‘|u­ÝZ™b}ÈZ-v×jΡ(¬ÀªM¹¶¦4˜Æº\snË‹éëâ™!£”3ÕÚ.ÌQ}'°eûì Åi½rš]¥«¹“»,óÅ$_Â%Ýl†ú޵¡/ù;*½6Çmøcõ<‰!ß>RÏd"‘ˆ= úîjý¸Õ\RJXœ¤š P@{×·Õü °XÍ=Ô«ùA@]5÷P¬æ‡@uÕÜ59Šù$›àË'Ù2­ª»éRÚçE¿b~Ù‘°&¼úö]¥žA©‘²Ü?fú{J=ƒR/)³¢¤ÿa©ÿÖ¼]ÖÁ̽Vƒãê€/#vŸåž/#î^ÉWPˆèg ›óódBfUœmñœowx¨÷ÉSlwFk…L:j™Ù†ØÜ¼¢œ®™ŠÓfæ4F‡Ôø wÓoqÇpk÷Ë·_F˜' ÍËxHñgË(T£å̘UÑ,ܰó¸ö9>»0áÄx°Ñ¢Á]Ëi¸N¹Ù0ŸË¨ÃuXŒ,_‚‘yZ×Yùkežb<’µÍxîFÚŒ ºS× ±Í‚ëÕåœ-„lJPN4ÕßJ§ÄÃt «!û±èŽõ L…Üw9¾Skq-¸Éˆû\+&J¸Š¬ˆ„‚ñàØ,< ÏOÞ‚äX9‰åfà žÙÔàÞhœj7wè‘Þ3!-Â/Ø„»=rÖŒ”¸+þ´O Ѫ.W°`VáóªÊœ&ÁÞ»õKX³œç9ñþ}í—¡ˆsÜZ¼ ÀÕ¡¬úüÞÞ$"å…9"œŠ]ÍP–bYBáXì­îfnt5Ú•™qgÎ7¶én Êuû4_ Ätõ¨›ÏçyZÞcW¾0ÁË‚s@°Qh ð¸ì‚Zà÷3¼ßuws—ƒÓÀQRcü]Á\´1™u3è6qSaÀµ¿@r΀äi ‹pˈ,I‡1è…ÿ·Ÿ#ýžöwÉf}ØÐó µ ƒI4kr&蜄™ ư÷ãþM e\ß%«KKšBRºÎpS¼»E©Ĭ¿ÅÝZ›Ùl¨+tÃ9¬w3äîlL$›_“—Ý `‡Ò"žefsqBƒIy¿¬Íçä¥c»Œ·šP\oÔyŒ\†ZÀÐÞ£¡ >>;{ýòÙñèå›Sìaò'oßœ>;Á§/\*àèW>ËÛØ#”cêÖ¾<¼89ÇãîÊœÇo¸ú¦ºëûefâÖH`»$0¹-Âi.Ãb‰iŠ0loÌ”ã³78лüùSV;“Œ…[3²½}ºb8¯£€)ÈÚãÆ\' ë*Ùô¯´NÍŽÛ P"j,•ðù‚ó?e÷vÃeŽ^\œgŸCÐÅÒ¿¥ 2 endstream endobj 1160 0 obj << /Length 1719 /Filter /FlateDecode >> stream xÚíYmSÛFþίÐG¹]to’Ž™~ ÔIiâ€ó‰0!XS[re ʤùïÝ»=Ù–#$N¦™ÉÀ étûöìÞîcC½~¨§B/æœ(‘xÙ|/´«Õ•‡7'Ï÷¨ÛÀÆ`cço㽧ϤôhHT¨¨7¾ÜT5žxgþá4]Ôºœs_î!¤?ªÊ«*Ïóâ _¼J‹Kü& Æ¥~Lçã?÷†ã•qÉØ½4;?u3Út“%‚ÄLz\)èë¿•þ_ú¶Yêà`t¢ÿÒ¦žê¢Î³´.+|ÿñ£qÍ ¨Bå„JT¯%2\<'Ñýýý_QÍÙÁhôòèð`|ôúW¨<Ç›Óá›·ÃãÃ!>}°:…$ M:Æ×E9"†þYèDŽÇÃçÃ|xÊPÂú¤uËJSŸ/¯‚úv¡!'̨ w© wëÐE,Òªnu0§cXdÕ-$~ò{Z§. X3˜.F°•Q!y'¨$lÊl¡ŸpÂbÚu§ ¿[ìê`4¼7 ,~hœú¬Î瀡Œc¹Nà ]]èª\Žá]/pD—µR-ò¯ò dtV“eW …–Íàâ ië¼,^¸—þë‘ èàe¯é%”uÑÌ/쩤FwšÞ5g]ˆv_àì§Ïb8ÿœ„p²ÌÁ2Ø qålMsømòß«3JYL¨’žˆ‘,2§ôì<ô&ðü%2aÞÝ:÷`9ôfÞéÞ<Ë]“”3 au1î Jè]·;qA sÆÇöÔŸ=$ÜoŠÌ 8 þ¹„~A‰’’Á€C¹©ܰ2yáªã{ßZ‹ÂMkILB‘´2æ$9Õjs— L°vÓ)âe›â/N'Ût`1o·OÓb2Ó}ZádEreû j<½#LEØ'ßû+—$´ç²óâçDýA¿syüDZìŽ3vœ:û1þåÿ4UbEOv1T@ ùCgŠñæ?$±»× endstream endobj 1167 0 obj << /Length 1765 /Filter /FlateDecode >> stream xÚíY[sÓF~ϯУܩ·{¿ðF[hK§S y&#l%Ö ØF’IÓ_ß³ÙZEv V e˜dÙ::×=ß~gE ?$18QŒ!Ãu2»9ÃîÛê:ñ/9#An ‚ÓŽäg?<"!lHrqÕUu1O^¥?-²u“W“)c,&SÎEú¼Z]WÙÍM±¼ö7þÈ–ªÓMVN¦”BRE'o.ž=¹Ø”饕¼ç¦7ÂàgpSjŽãÞÍzQÀokòýV¡ #œ0§Âj{õ's¸ù,ÁHhšÜ:Ñ›ˆ†«29?{1d“0Š$ç±ál=`”„‰Ǩ)b£óÕ2·fûÅcÄ E5@JáWO'š¥›å¬)VË Iß„'eB2BPûä”iH·OÜ3VÅ|u!±—ÙúrgTâ®QB9RX¶¾Æ ¦+Æå¬:ßS.Ê5¢B'Rb$ ïgŽ«m⢊ʼn‹íQA5Ü©bz[,·\¿ qÐn h䡯ëýX‘¬* uJÛðŸ!"H¬0®Ø×|›;×^<­›j3k6Un½åi³Èï÷bUÎkY,¯VÕMæjê¾ÈÞBëétµ ²Ÿû§ó¿f¶5ÙòÚ•¼ò6§D"ª™·üsž•åÊi˜e æJ¥U^¯6Õ,¯ýǬ®­„Jg“)I ›Û2½-š…±Fíÿ®Q4™j%Ò (¹¿Y/V›rî¯ß:…ÁÞ |È·7àù;Ý,¼ç¸ŸÑuYÌ:)¸]äáªh|ðË•ÿ\®À‘bËÜÚp‰ w7MQçþƒ5æîú²8¾ Ùr^B\®žq»B‘†¿aq$4 ÂŒŽMÂ@ãsò04b4@Sd´Î›«ÊâǪ2ˆb[mÞ5«µ]õP“ %Íé°X,›>*B¼—}ë=ÌÐêÌÁGú>2 ‘@ï 0”œ‚ k¤ ñBd´: i c­1@~ïµí2c¥ÇˆF ßDÁ@YE#‘5w²Cá@7÷£)Õi†tN©ˆ”ŒqêÀÚà°º˜xp?‘ÜQ¡/r?¹¿ù l/»ôÆÞB·+Óó¶)À€JßY+y0;ti‹Ðz]Œ†ñÚ#G €Ù¢çÌãçÓ—O^xãí³XëòàÃëŒ\8·OI¡;y¸.\VßÙÈý}â¢Îó.uXº˜ÜúºC#ȳE$ûdg1Å9‡¾×DEkιYœûëzçcîiá$×n×ÞæÃ~wÀÙ)“`߯ߞÏUþþ2hzÐu`‡G®·•W½Ê{Á(ï/shP¤!Ò¬Üäò£!S€HBmì •?ÿõ7øà®R¨¶D$™þH4‹7,˜[†UÅqðÿÏßÃÒ í°™;«¯6å0±[ÕóQ|„s\b:bU1n¦#cØ l$²yŒa4‘ÈèŽ̳&{˜ˆ‘ì<ˆ7Š%bãPj†M‰…4 =§lâ0òk­* ŠŸƒ’pÈ‹„çGˆ†Ãµ´ýÔæ0'TÅïô¸ 5äD “Xk€­|¼šý¤$(žpØéÂþ_Dà«m]:mÐÑÙCµÄî¯2n;ÊÑTú¤EÆð^éTqÞò“¡ `ìÈI £å ¹ïa/£ö Äðûâ Ü=†øÜ^'ˆÚs§X®7Á^VUY8äp‡îÅ^9…Ñ…/Xî)b½¹é9¼iìÁ‡JìqȪö=øù¾]Õ½²Zè—d¯½‹É«¶ŠëvyEáðpX7Õ§]|O8®u¬S߸t‡K“QÉt(ärÞëÕp$6°ÒºByÚºôœjØ–•ƒž[UÐ#Ñsv=§Š&£ðs«‹™#Ž G1zdô AÅj`è‘Õ?Ìb$½ý¼$½Ên‡9:F˜²Q^¬0Âv @°š“ø¬CIˆÓ$™üä+$MÒí+:B0Žóð¹¡:âØ°KÍýYpûr®‹Ü¥TŸÊ׃bF`ÀÐýÄ EOzÇ|HSâ4q-ŽåÒ3»I4wëAú }ʵ:}ú`#N€1Љr„ŒqJ–ìc3vÚôaGt£È·óã¯qüر.$ùÝ:¼TpRÀ¥â='³@ëT—Öí›:Gò×®¸ù ±OþëQª†ðòxàŠ“A7ž—óÓG-úùF-~?ÜnYÕp¸ñ(æç*’þï'²¹·ûcv( ¯ûg³}³ö³Ù؃u>ÎkGù~kb½ùaŠc¢ endstream endobj 1175 0 obj << /Length 2131 /Filter /FlateDecode >> stream xÚíZ[o7~÷¯Ð£TT,ï—¾y»év»è6Mü–ÁTÛ‚¥‘«5›ýõ{ɹp̱åZ‚mQ$Ïýðû†a3 ÿØÌÑ™‚8ig«Ýõ£‡›Yxxó ç-aâr0óoW_}«ÔŒQâ¨c³«ëáVWëÙ»ù7·Å}SK!Ä\}½XJ©æ¯û›C±Ûmª›ðÃEµàv~,¶‹%ޱ¹‹÷Wß_¼ºê„+ÎOÔg>PÓ€š‚PÐ3ª©­$LÈ f}»¿Vä¯Ý^Œœò“%W¸Û»÷t¶†¿ŸQ¢,Ÿ}ôSw3˜À,Ôf"‹ƒèÇ ÅòˆþTNz¶yA—¸]PJD@ƒ•`œ lÛ†î阆âü‰õƒ“Šj¦!÷¾3ÑwÆYLÃ"ü~¬‘tÀnPÆ”ué•⹈â”á Ñ#=”nÐŽSÖˆ]Ÿ ‹%@’ùÕ-øNR•3GRI æà²MFšvŸ¿¿zFÊj;8Г Ý_‡i8ßÛµJŽˆAù$å…¡8ìѳ¿mÖåºÍ;3´’¦÷¦„Ú‹UùÛBÛcùuÎ=€Z”éÜÖÅŽóö»Â_éhG©™IÃ!­ž ÓÞbàT˜ˆ[)aâÿŠ•^ñ 9®Ve]_·Ñú”“,™ û ±PBFü¤¢„[qâ'×9'ž&~g‰_"´¯ˆìiÉQ€]ó2ge^cÉ#Ô¤4¡ÖžB¶ÄˆlMcQ`, àf½Í¢$zʈà=ÿ‚ƒQB~8Xÿ"*$ÙH¿•QzÀåТ<™sD÷n>ÍùV‚5d؈LMÙÈ@1Æ98@·|‰‰øNÁî¤iß–‰׃D:'™Y2—æ¡'sOƒwÍMr6I~¥eD™?Àï]öÊvi@p-’ÛnÃN¹c¿`{ÿ”; @¡åè€ÜT›æ±SÏHÒw§^sAqPt ,xO¹Œ#§<¤P¯*?æ¡àÿ·Ÿ"x<”}4??šÓi*†šJ¯©œGœ˜ã;ßøÙ ÖÑy>|d¥c>(8ÅLÂ=ÍJ2ýî=–ËšC;¶Å# EQž1¡¹ø%à1|H@mP·À3nݪî=¨ÀW¥o brwÎuzÚ(ǰÑyÛŽ™ˆETL£ ÷¶îwṊ¾D_Œ‡¤8X¬×>¸ðÙ äÐT­HOïª,±ü2¤F07¤U;·.v±Œ£ì?>g%mNö‹ÒXünø Á;7‚åÎBÿ¶ç@°Üb[,öb«OC°ø¢PK{‹{ ežF°gl"4åtO£Xý¡Ø^úÉBˆ˜“¿çÚà $+Îd%Nv®#^‚d$€‰q'ÆÙ d&–™çY.OQu$ËöñÏÈfn%ÔË_åw²ÕöðÎ`,¨Þü·ÌÜQI(ÖóË£!)ôdÊÓh䌀~k:Z¹…,[²ÄЧ_Ø3 ¨#õ§Àüü/ÌÿçÆü']yLÆŽ.Ƨo;ŠÃ¡ðð0èðqÓ܆§ðu˜8ù[Œî^á´WïQŸD÷®/Œ/ ‡ŽÓæÞ¥a¢~ߦcbŽÌ˜#†æ˜é›„Ë©×ôA©,ýâÒ ýÂ_dø€õŸ)ý‘iú¥(ñ2úŵ ô Eù¬Ã÷ýCRMq~›½ÞŽ”[…³:µ¢|tgŠB„f‘Jh®[øoJèïÁ`J&ƒ`~ ü>éŽÅÙS¯)ööÔ5[/=ƒS Ée$ÖVÎeÂ0[V'•éY~éX~ñ ðY>b’ùOÏuñ· “Ö¶.Ì Š^X±ó”9‘6âq~Ûº—ƒVÐülYÐq)ÎBêüu:™Ó¡6ÿz/—¨ endstream endobj 1183 0 obj << /Length 2098 /Filter /FlateDecode >> stream xÚíZ[“Û¶~ß_ÁGª"¸Ì››IÚ¦Ó©cï›ëÙ¡%î®f%J•¨nÔ_ßsP$(HV²r2ÛñxgHIà¹~88ß¡YFáËJš!H)m6]ÞP÷íæ!ó7ïþrúƒ•¾½ùöG¥2FIIK–ÝÞEÝβù÷Õº­7“B‘«ï&…”*»Y=lªårÞ<øþQ5nó]µ˜\”ŒåFN>ÞþtóÃíA¹âüB+q呙̄‚ÁLm%aBz3·søëTþû ‹qCX©ÜbÉJûð‘f3øñ§Œeyöì–.3XÀ,Ü-²÷7?§t2Á‰–2V\­JeI(Ó×Qª`‰V±Òö©]­ÛùªÙnª‰`ù3Ú0Τ`%QTe¸†'?ü8±"ß5S|zÂòáI1FJ¥8>Y ±7`–{fÞ´ȉ A¾«ÖwC‚rM‡Ê™‘¤dÿ¢ŠMåp™$\ŠnÑ{ŸC¨?¡|h—d„›ÃòǪ™-ê”TaˆV¶[÷—øþB–j“iM‰ÕGÉ’æ+´r5Òk-aT8QZðáJzÄK¢û@{,¥2N”½7°rZŽdVR˜bQüŽá¨KÂ`Kiiˆaò%2ƒúJ'Jšò€Æ3Iãz%\šrÑËËQÂæ®¤´I™‚ÀŠn}@b_€c¡Ò‚O€¢J}P Î|ª”7†Xsp~ú´Ý-Ûý: l¥‰´c`OÁw—™OѱÇjs&Ú‚á¼1«Ú*¥ˆ+²)ÚÎÿ[‡LQA¬°×™¢ yAÈ ~PÍâ °¨›d-ŠÐ¥ˆ¥\.DI¬äAb¢ÄÄŕÖ:È‹²;„\*£.pÕ6\‹œ6ŸVm=óß}šp“ïû*<0[Z"´ìt„â;oæ-VÓ‘aPwe_-HÒSgJ u·`šP«GÅ'1·rìçÚ9± ûÈ72oWÞ£¦~xi7»i»ÛÔá÷Ç*Ô‰ÇÕb¶íöâýj³¬ÜiäcôÉ ß…µoÞú§ë_¸›‡äÖ(‚¥‘O}¹‰’^±Sí|Š©xB-uPî]‚Äv_Ì›ƒ‹}Øs›ºÏ&X Çk:êA«7ФJWŒ0E¨R##ß¼-Þýð³WÜ=;°Tt–ÊcKÅÐRé,•', ª£PºècmòEA‹00yr{(¸5rd|µka‡Â3ëª]…2åóZ÷ ööF¾jàòxŽ!k¼ €¦ûÎÚu·õ"weÂÝAJ&Ë1£,¯cWz¯MÚë>@èµÀò#ç]]F"o¿wžHI…íË~ÆÊרr¸%»-—TɵŒ(ÃF%·ZŸ+¸š“²ö.†Cèš™Wå°ŠV@BÃMTgÂú°¯}k'%ŸlU(¹Ý–—¥ô:ðÆ‰–¥Ê1ü ö?ÁÈíôG@Äo}RQÌ!9øõÉX hÂ(+bu.ßyOº%Ã#5bçâjÜÚþ + eù0Š•ù|_-ýý¶ÞnÝéžÐµzï?Ì·þZÍfXõðñê®.døÛ Ì}ƒ;„ï8¯‚aQ~¶Õ2ìö`A¢|u]€ÓíjÅܧÀ#¡ÛâfÃý] ÇiØXÿ™(ÀübW—l€˜Ãé០úßÿõoðwÜÈqm ¿2´®Eüu\\H ´j¥t¢¨gÝ?ÿ¶;àK„su7Búîw‹à}Ì} Ü()¬¥R} ¤Jqyª²¸Ÿ§úWQ¨~¤ê|D’`y¢ýf@5í«PÖ´Ž è7ìÉcÓp¨ü"ƒ†©Ð]ʆ¸ÇçØä+þ æ ’s¡<“êˆ/áKPJz¡(ÃË!JqBÀ ç*®Sé)t¦ªoòÏL!x‚IC7éM‘iV×´@ªÁË^ä)§œ/ŠRÆ^J¦ëSDZ0",¿0cˆo¥äUüÀ£d#?^Ùüä7 ÄEuÙÀ (!$WH‡‚ÃU y¬ a4ì±/7p`_'ÿ‡:nüR§¥†Û‘u3Ýì×MIöÛ´Áèá¡nêMŸØ®+v‘Ø}ò}åþ45–¼’‰‰~m“ßaʼÚ)Â11ê_9àÒà\/®Hà îo¼Æsüæô\@)èlÅËæ\ÎŽªêðƱAw3ž àú½Îxà›<8j!N‰Ð,0MÍ!t÷i4|ƒ% ÁúøýdH8nNjÒô?î×ÏE‰S´ý{B‚ý¿šïçVC ;zËuàþÊ ¸¿ê"·÷÷‡kÇýáÖq"î~ I¿µÒïÖúá€SV-qJPGÚF…Ú‰ÝözÐ Ï?®CúÁ¬kó~l׫_ö£$&ôïKûñ³æâ*´e Á?Oû¯¢4ÐþHi¿ƒªmÃvÛê¡þü;~õ…ÞñL3oìõ%Ì›æ]^̼´ð?ÅÕüEÌøŠA“…Vß\òª*~OC/{ãÖ+faÛBhÄ¢dìEo÷  A(Jó‡²Sy);•—þ?À àqRåÅ 7IÒ‰ÏuF6«Y}ñ ÷—¼Ù¿ŸãÿÒÑÇ™l@o«ˆ`£SØŸáÜtÿgá©ÞËTŒ Zó[‘²Xψxƒs¶#œfÞ@½…°_©÷×—ýס®Xjþ¡Q‡ endstream endobj 1190 0 obj << /Length 2224 /Filter /FlateDecode >> stream xÚÕZYsÛ6~÷¯Ð#Õ‰PÜGßÜ6é•4©í>¥+Ѷ&:\‰Jšþú.° DP¤­ÔêL;M‡ bì~ûai6¢ð9:2B'íhº<£áîæv„ƒ‹ïÎXœ7‰“Ö̯¯Î¾|¡ÔˆQâ¨c£«›öRW³ÑÛâ›»ò¾®6㉢P_'RªâÍf}»)—Ëùê¼*Wcn‹]¹O¸pŒFß]ýxöü* Wœ©¥Ÿy¨¦k«É˜%v¤­$LHÔt}_Ï׫­Û5J(BáʼnÁYœ¿™\<ÿÅë/Ó»Á˜z×mUãÓù o¬ª‹O8œnª²®føüüÍØÊ‚DÉ™ž“(zÂ1F +ÞšU}ºrA„°]ç«û]Tæüòg¢‚õf7­w›ª£÷xÂàÇfÌŠ ß)£e宾«ÂNÕóié§„ÇSç® —÷ÛÝïÎÊV(ûÍŠZffýF™¬³^£(‘ÜuŒjæg>2O&óvÛj@'’ét`q2òý˜›¢ú´Û–·½ûÀ„&ŠwTŽ/5ŠøWÃðæ!WŠhœ<Ô¦ß(úaCÞûñCúSMŒþlúU]âr™Rß„,€ /J¼@Žà’®¢¨þDŸ”«Û8s·õ¸*ëLe-ˆv¬Qy{7‡×åýoTQøŸõ™©9q.EÖ3`A—Õ Ea ÃŒ [̯Ã4ÖÊz“Þ IqN˜ åœkÐÊï aŠ¡œ}úÈÞ=—!}¼K$øv³Ž÷Àµ8øöù>«VÓˆ¥ðl}ƒÒä&%²”‘bØB*â¸=ðã5ÔÏJ”Iå_*\~ÿükJç©&rmˆ ”¢„ç«âÛwt4ƒ‡?Ž÷Ìèc˜¹ x.`´]žýÒWá¹a22,Ee,ž¯ŠH&¢çvÓ)lÝÍn*ƒ·)¬ƒ(eq_ ˜±íX;ÔŸqC˜S@à vtôW–'$‘!¬Zä’™àDƒâ Ójññ¾G¨t„2}¡ ¦h• …Œé¥ÌE•‡ba³ÂÜ·/Ærv5õ‘ñnŸ¹àGxè‚ÖcšÐ¸ÄÌõb€©â ¼ì:) i¤<”€Ôgq_¡‘„K‘Ëê‰<ÇaçÄHQ˜Äìó"/“dž%,FZ“6.DÞÑÞöÏTÄ=>0–µ/Ô-´ê°æõ—ê5 v€+u§pvÉÈ]Y£ÞwëÅlÛ”y(£Ë²F´ó|ë÷3ë]œj"¼ÕD„3”™aÊwU|íÊщïÅ¢2°ègA–Ѳt€¬~¼‚ Ñú¯àE„L?Hu„{QÇö4d •5¨l¨Æºå¦üüëË—8šßàäÕ:.ø©½ú¶À‹Á‡Qͬ$”q'ªÍ¦a8¾Þšb:…½œõ#÷g‹Ï‚5 “¹'5 ¨á …µ“°– ¨Ò‘j$1\œFª¥à[‘KõûÙwtp‚€DSûÏÁôÃz>ëÁÏë$·+@0”P§ÁP¨ÞORJ³OÂPˆr0æ—¢V‹¡¼‹¡ã´ÇPÑfÑž‹ XÜ“XôO·FH 5‚åÖ„r7lŽníéPýƒÞ7‡K„4T¶0þ#%áðPØS!øT:iº§íº§ˆà‘Ú[²nšéþÆgXsøÃ3Ù—i‘†j_uK@ë䛨5Ú+²p*€ ê$ìWâÔ=ŽÁ'8‰§ÁÒIóS$„6'ЀCŠhKÒ`ê…ûÓl8Çöá²?+ùt’;_Õ]XFó£é×Ó\<Õ¹0D[~ LóÇ`ZhF¸#A¿kõ$`Ó ¦„•„ø7A:fÑæµ'\ÃÆ††Òžúzê“‘!g”±ÿUõ¤ì"£"°zÉžä-f!eX‰Å\¨0(:)¹€Dùç5€QßB¶ÿã"°ßÉ\[§ónÏæ¦Fr¹Ù”¡ÒÀøæØ Ä62+º}cÑj|™V³Ógê@_UÊ´O»×í¾Ben—0¥è{÷¹Ø ‡Ø”ŒËòÏù2|{XâCXð”ãÐJs*˜ fËágÛr—ö Fånß5`2¼:õˆ–»ž––IT: %ï P•kÔçR§Mðãb'|4q£y˜sã¯*Ÿ»WÛÿDµý(ªævøýíÃ¥¿›vª{4L'OD—n;;¶6!>nÀ5ñ *‹ó¡îö1§PÅä¾qÖ ÕDQÛ=…ö´?žJ±çä¡£výú§¾5•o ¥5ýyS1Õê|=óGã ³+Çr"œíȹzýúúòÕùË—×_ÿúâÅó‹þà†‚»n‹}Y€?+:Øßw¾#×|€»ß¬½?ÌgÍ·§þwÙúråq%Âö²\,p–/‹asúºîèü¾‘;œ¶'}œãÊ(cÕ…÷]¹‰°’ëï+‰‡âÆÇýÎéHúÌq¤JŒ´'¡}~-©ìã´ï$B#ñË…OüN¡CCý2¨_‡%Aù5ò4ò÷ÍE“Ëh@JØx2áìk 0Ρæ×Zž†u:>àO ö z ëtž“ó°”2î_âøUÌ ¢…ÌÁjº^më£y)°mMŸÊv Cù;úK¨eG‘T¡aç5$®Dkñ4Jo€¾˜°”䉦ön8»2ÛqN¿CìUÇe³W:qñŸljE^‡¿Ï;“ÔP¤?p"gwJ²ÁD[\ì{8ñºô ¹a…Ï0pS-k1'"m>;;'±…/é_j§ôÿåžÛâÿ…4ñû7)¿µb endstream endobj 1198 0 obj << /Length 2012 /Filter /FlateDecode >> stream xÚÕZYsÛ6~÷¯à#Õ‰PÜGßÒô˜vÚŽ»OIÆÃJ´­©W¢ê¦¿¾»H)Ë6Ócò@w¿],v¿…Ã2 ÿXæhf„ NÚl¶:£~v{“…ÁÛoÏX\7……ÓÖÊ//Ï>ÿF©ŒQâ¨cÙåu[Ôå<{—¿¹-îªr;™ !rõÅd*¥ÊÏ·››m±Z-Ö7áÅÅzÂm¾/–“)ޱÜèɇËïϾ¾l”+ÎOD‰+aº6LÆ,±™¶’0!Òb_Ý–Fµ˜Õf;Ãño»ýj^TÅ^ ®¹ŒƒcA¯—öqžÃâ›êL±.ß\‡çb}·¯Â°Øn ”ý1ü¼_ÔkQQUx:šÏ6+ø¬ “ÐmÙàŠ <°lZC™2A˜Š6­çÁÁ;°§Ä¡ aêu×Þ0^Ëüõùôí×?OXN¼xØxp¯·õ¢D[œÈAdŸ8|ÿÆã55^˜ù*é’– €t^”S‹õMIÀ¥‚å—·‹]üj×ѽ槊ë~±\6¸üñ+º,GG(›{\-w–óWðB«è5XáUÕçyœ½[³2.õnƒ¹øÉ¡ôðú=e²\ÎÁ(Åiþ]?Þ…·ëMÕQ\Ì*<mKX0%…4™²|›µ ›÷ FJ ›·¾Xî61À·‹úˆýÞœ®% BsM´ÁÃóîÍæði²{¿p• €Ñ2»8û¹/pm‰°ÖK’¢ŽÇ»•– ºFP ÇÙPÑQy—„t°~ B XßAЄ@8õ÷‡$e„»1Hªìt `WV$$/‹¡°O «§°š²x´‡BƒqC˜S™¦¼l»(•å LI$³)ÌT3œh)½,ÉÌpp0ØÊô8J,Ѫ£4„d˜Áðà’‹:. Ñžà ÕǼ/@cÄAU‚`Á°„HoySš(ç @1Ì…µï¾™X‘ï׳jµ‡åâ—:C”Jñ[ꯩ ã›ÅsžŠáuUÜ]×G·_Í‚î¯(š¦ù„cï©¢QoRØ%Ô(Q/ºea5Ľ˔‘Ä þė莂7•¥m"ÙgÙÏ¢!¼íž@ A@O8QªYó*xnaã”MËÀ"¤6Á{Îär±¦4ϽÈJÉ¡(%cÌT}Öà ®1®½Ã~ƒ«we¯ÁÂjÙƒÅÞ³ÍzW…Ò Áöˆc#7|X7W¿j8ÞTuœ-`?1©³w‹¿Ê?+C45™’–hÁ^ægæó"ŠN?âg{ÔÖ†±¦çˆ)(·óÎëóÊ”CMp¦4Ñšf p Ôm ¤cWm÷@^jÖ¨îÝíf9ßÕ\óz³]>ø‰"´Í>®EBˆ_· a/Ú!pTó¡GjVyÆe¿U¤ì˜U 5)kî!ˆht£#NXXÕ¬¬:tü³*°.@9Ñ<ä&¿ï7 BH·‚xª{aM»7ÁŸ¡7ñ/z ‡éÃa6òOüaó?&JõÜ—á÷ÖÚ×ÝÛ(Jc÷–*=½{Cݽ%šîÍÃÀ+>¾ÑÛÜ…MQ¦0pT/ DÓ´`íOE¿Q=Ì ¿jÖŸ=óQö¤äÉ-DDÚÉeqŒßÇ’ç(JcòL•žž<ÇÀP'ÏÃñäÙ½ÓPïø(`Çžƒ§`/Á8¡Ôþc—`˜¯‡oÁ (´<%góGs¶ƒHd H¶/ËÙXÕ¸¥„85góçÜ‚9áï/žz ¬5cÜ‚¡(aù©·`G‹08L&5˜ Þ0æþÇ·1­Ë‹ùÙ½|Q04ÿÆÝK6ª{ºà£Æv9?þÙ:Ô,wZÍ ¥ðõ5‹iÐ>^³FQkVª´¯f´QÌEÕËöELÓ»5;š·{35(gÜ“©ñfÙ‚w¡XAê{I¢†Zf 2(ìιg'êg‘k4Ï@?5‰©nË’j ›÷É9¶àد/~"ìhH2­È¯·›Õ3‰´é°a¦ˆô‹>“²èôMÝÞE˜LÜÑ™€ÿ.Ã\^õÓ/?üïê®Ã×á0ÀÄGTQßðF`éõ\íÒúJ·ˆ;Un·µ/7~Ïf3ðf¸Ãcñ7/{Þ¼ endstream endobj 1206 0 obj << /Length 1832 /Filter /FlateDecode >> stream xÚÕYÛrÛ6}÷Wð‘êD(î—¼%mÒ{.¶û”d2ŒDYœ‘)—¤Ò¦_ßRDYjÌLÓ‰gÄPÀîÙÅîÁD ÿHbp¢C†ëdq{Û·ÕMâ.¸ ~ÜÎ#Ÿ^_|û\ˆ„`d°!Éõjhêz™¼I¿[gwM^ÍæŒ±T<žÍ9é«j{Se··Eyã¾ø-+gT§»l3›SfI•š½»þùâÙuï\Pz&J;ò¦˜ aÀéaJÍaÜÁ¬×üu.ÿèmª1¢Ì©°ÖÞ¼Ãɾü9ÁHhšüÙ½M`Ñð´I®.^ù$Œ"Éyè8»qÊ ÂDNãTÀ)"§»f—3FÒ¦XdͶ:Ä@9AZªI0P®óñì3ž7Ök\?”J$OæT ¬ŒûæùL³tW.šb[ÎHúÎÏ” !ÈAíÌ9Ó°â €´s>n‹å JAøµ}ŸÝ½wqû˜ß÷$`‰Xgå-Ø;3ÃAQN»AWGЇQƒ´ ‰QmârÕ§!ªX˜ÂÐ4 ÒZ·¦0d¬«¶{¾ñaÐa:hÑ•Yl•P$Dë#gíX4Û•1SDÃáYÚ® ¢©K2Èœ* ±CKCIHç „å/£&H˜á:’± Ì †¦Ä22~7Vš€IsÑYl©Œ§õl]TAQîÍ®ÊmyÚ¬³Æes½Ý,k÷X”«mu›µ5ܾÈ>Ûét»ócŸ¼r³ó¿– ×Yy“ƒvHæDvô4Ì ’† 9R‚F!t3U?³EÓlÝg o|XEÙÕ¸·ÛUä€åÑmÙ2‡—{¨qJÎ: à 8 ‹ö$ †a×Uâð0leó?Áßø!ÀÊ RÿV5‹ø ` o- î¼/ñÁ¾Å„¹Õ»Å"¯ëÕn3®µ¬°vþ•Ü¢$„1…ܲ¶ˆ”§åÖ$N½Ü œÞ+·&ñêåVàÕ Ÿ¨>0Cúi ¯ÃÆ…zìx-AHЇÿàs\ã=a+K¢ b”LqeiMÙCûÛëðd¿´ðqX£ÁolÐÿ`»-÷Ÿ¯¼Í¶þªT‹2ˆ³IT X¢ÝUßË_PçòL}A‡ endstream endobj 1215 0 obj << /Length 1930 /Filter /FlateDecode >> stream xÚíZKsÛ6¾ûWðVª¡x?rsç9mV$ãa$ÚÖD–‰j›ß]” š¶Õˆq|è$3†(`¿ÝÅâÛ]P,£ðeŽfFâ¤ÍÆÔ?]eaðîÙ‹ó†0qؘùhtðÛS¥2F‰£Že£Ó¦¨Ñ$û?>/–U¹ …¹z8J©ò7«ÅÙª¸¸˜ÎÏ¿ó·ù¦˜ †\8ÆrcŸF/ŽF[pÅùŽZâÌ+jPS zF5µ•„ Ô\ŸOá ùu+‹qC˜S~²ä ¥}øD³ |ù2£DYžýí§^d0YͲヷ]˜Lp¢¥L‹e¨t„2ݨ‚)Z¥ «òkªÑ„RÙªeD*‘¢~ÞLgÄmÇ wœ(f2Øzℳ?<X‘oæãjº˜Xþ)®ÔcÄ)ÅqåPXXb@¿f:¯°û*nçI±<SOÀš6ÑÑ–ñzùGªhDqÍi’p¹t|M¤p#ˆÐ`²¦D ÑvŸ4[ï sSï¥xÜ"½ æì6LüAù5šÁ›^à‰‚!¢®˜ .V¢a)ë²t±NÄû6“)–JLw °RÕýÉ–ùz0dyµ‚ýÚŒ«ÍªD­e^UÐÿ|1›¬Ãp:?]¬. ¿½þAñ¿Í›8÷ðMX]þ3Fr8/æg%*Êè!ÓÛ²&šÒOû²Þ\„u“¢*j¨ˆ°©ÎKÏ4Õt\T‹U˜XÌ'ñûIÀ×^Ö€›¼Œê\Îê–R-jµ‡ïŽÞ’è2ÓtMU~W‚‹¢j ”ʋ٦×=ìr·#h¶îK£'Ÿ¿€ÿ!© ĈÉ4“D(ùC2=¢ÂÍI/Š1”xý*º÷#e"8a½Ëõút3‹HyaˆÄ€r†³BíF¾ÊÁI0ý¯²päíäÛ h$ßôFòí5’o‚:)ÇŸ ·S°é‚¾Fn“Ë­Ý…ƒÅíì`“3¥5aà±}(ŒÒ¢@+¨"Ì®$,z!aN€óH·r°nspµúáä«#“Eížøè‚y“òz­Y8dBª t= ¸5 F( »D#Ëh„Ü Ü.éRú>±âpº©èƒˆƒÃ­íݱ„êÀqÙ £, uÒ­DÜ h$âôF"î5q‚º\ÆÝéˆîˆþíž IŒÕ)ü—`—ß6ëâ¬;Ü)X"óÑò“/‰)Mrf‰U¼—” $'÷Ï`ûä!2‚$íôw§„ThšD¹Æ ‡žC¿Òƒ1ö—C{œX¸ö[`N“†˜¥PIn‚½ì4 v‘»–iÀÙ@ê‘à§ÊŠ* ¡»—ÌIB¥ó¢”ŒV]6bͶþ¸).õÞ¿µ‡Ð ·su§ùûª¶Ít.Ó8èÒXCÚhw}ãÕ·e…W:ËsHÚ·JÀë²n¬±7+ýšv±K|ÙU0nõƒ>I5±¯å8 ãDÓàÄKtTšš<,÷C¯µL6«pw…ã` ì†8ãù©ïá›9nÑ,Œƒ ¿àöQhát³<~˜®›ÓgßB™•lž³ëÊ ¦0Y˜L8d²OuÁ”#N /I°xh^ýùþøÝóì¨+cqŸ©öçöR³üð ÖŠU/c=%¨n¢±ïGÏþ½x|ˆ¹oôúì®R,ì®R´±£øxY¬ª0Zœ†¿£gÇÃX1+ yªSBðkA&—xÄ18yøË/cÁº©®ä`‡°ý{{ý ‚X}ŒnÞw8Å„Cß¶7¶°eŠ ÎëÜwaQ¼ThŽ•n¡^lŠ2 âö•x'ÍZ˜]±FBà¦c)7?©™“}¥ÍÂgÈšø·n³p¼Y{ºÂáz³\ΦÈÇøiKÓøÁ7cÜ¥9y*D¨çc||xõâ«5§i¬GxhÖļÀ"ÁóšBC’`ùàAø"v‹<YÕ]Nx[H^÷ƒ,´IÚq¸A˼A¦y“Ç.»ÌSZ=§Œ‰VÜÛžS`ïfúh9òsÝ*ÞUË)(¤Çzi9Q–¹½áì26œ ÈÛÍ^0c»ÙÀl7›w}í»½Î»0͉ЪŸw/ì7¼h÷»øƒ œˆ¢Œßýöe.O€g $ĬZƒ©1·7y›¯fGÔ¹Iwwý]¦ƒ„mÌ®w™?ã}RwKÔÝSÜÖ¨Õý¤2†ËÿË„:Â÷¯ÔÝV xñÂT/7Ó ”ÝñÍ4Ã÷4¦Ÿ›i”¥í7Ó½€ÆB!½±Tè5– ©©ë9û?ϸÄmÿ:C%T?o!Ω…8— Ýž¯!Τgev5Øk…ž±õû[#¤ñWÉ©5¸#×Û#ä¥-1TÛ{'–ïPH-q¯nrsy ¯8¢ux4pJû†0—V&oCá!½®¦ÅçYs{\Ÿ$…Gþ÷LWÞ¥†ô¹=† ×Q‰ãZ‰ŽGáÙjlRêx<öt[n³j¤¦iՙ̆JI‹Ôñ3:_㈶”’8»f4Ôæ_Jv´ endstream endobj 1224 0 obj << /Length 1894 /Filter /FlateDecode >> stream xÚÕY[sÓ8~ï¯ð£Ã­u³$Þ`),—…nÛ}†q§ñÚ]Û¡°¿~.v,ÇmRâîÀÀLG:ß¹Hßù¤à ‚8PQ (EŠÉ`vu™·åe`N_a7n §‘ÏÎ~{Áy€#¤"…ƒóE×Ôù<øþ¾L®ë´œL)¥!2™2ÆÃ“²¸,“««,¿´_ü™ä"Ãu²šL U‡BM>¿>:>oÁ9!{z©Gn¹)ÀMŠ"ðÓ¹K†0eÖÍj™ÁÿòŸÖ&aÅÍ`F¸¶öáSÌáË×A„¸$ÁzÀ,áiœý5„‰)A1c>pr=ÊŠp<(‡!1÷A¿L(Óï¹_?Šâ¦„£H(;þˉ¤á:ŸÕY‘OpøÉÍŒŒ‘âœè™S*!ãœ1sÎLF?(Ù?6ÑŸ“kó1G]p,!K¸1ó1â‘CSÝa F}¬íDE z4ˆ¹BDª~"™hóHÔÏ£GTŒQÆT)kŠg–ï#éæƒx.Ú:oK½‰Å:%lL¡°˜cߢ_?p@²¸±hö «º\Ïêu™jwYX/“Ú:¾,VóÊ>fù¢(¯Saó"¹€½(ÃbíÆ>=±³Óo3½W—I~™jÀ+‹9ÅÅ‘Û÷Çßê2™é©Š`j’ëëU6k@…•¦ôÑß.ÊâÊ>,8d?¼ZØ¿Õú† ^9k¥3»®Òùc5aæ ³ÊÔ‰…ÈûÎ'ˆk=5aD~zá{ÃIµö·(Û$ðº¼Éª6“©}_¥Uå2Ç:A鼺ü®õÎaû W8Ñ-\äçï4…z¹J|p&«u sŸ ])À¶¶§ú §&á¢õÍeÃ×$Ü÷dª¢Â2r?¾ä‚ 6]jS˜«Ýt9¦cK³L¯w2¥<˜(“*Ç}Šl‘ûIù>IvR¤äHéä1(fQ¤T#5¦ÚÖ±›"ÉIwSd$L»ÿ…(òeÚL;{‡°ùôdzz|â8¥ëRo³nÁÜ‹Sb¦9%6œ2L(öð ¥²-åÅWc.`­[÷àCg„ýÛõSó¨ aQÚ¯Þýýö­•-웼¨íÃwâîC¥¹>˜d:ïl©­‹…S˜‰£à´,›W…©Ñl‰œ‘H:zSûÑ‹õÖ`£ð›¶…%ÝÍo£€:‚ó@ÍôPE Æè8¨–?l}µ²åì/=£Ù"y0­~-²ùŸ~na{4Ã(â”#;c @X ŒÂ’¢ò N…µŽAùiS8¢?Ì©¾UŸS´¹- ™‘zÍ …Π(îE£ßp zù´ÜÒ )FTî!¡¡Ï1}.ܳ?ð~ÐT—°ø®Ml9í<±$.¶ÑÛ8°èˆè¹mG[_‹¦­MKÉò¦ëL$³ê2eíxã¬iUNðú*˽/ïlPS/1Ц…zµ-ÊånêÔQ¯z'õŽ‚ê¨×C§åCRo–×CÌÛ¢ö˜— D¸GÍBƒ‘8‹ÆˆCaÞ˜ÁæÆò‡üÌKzÌ;Óg²eâôÊ£Aã sCsšJ†¬Ãn"ªg½ÊþMX]A+½?B¦¨b†R½LÕw$ ÇHŪË ŽÚCÔ ä-Œaj§Î@?¥ôæôÞI`SNß[8š©~#‚±×ؽ,æŽó7Y½´Oyz³úîÆ¬VZ‹p–Ôéܾ{~|jÇ¥ùÌÊãy{[,š€ ÁonúqXç¼ÞÔ-eŸZP¬úÍ Æ^ZY » úá±Nx»ý7= ‡ÓSݶái ЛuÆ+Á³u¶ÒÙaxÓÚ˜¾YÒ†[ÊëÔ&‚Eo¨·Óµ¦»ÐÆ4‘uÖ¬_Y|©ÚÙI>·pÏÁS†i3-ãšÈõKÒ¹€Àð † Í«@ˆ+#ÍooÞm„ Íü´h|‰ÃE’­ªÇÖŠÓ/>¨½õ°_ü~øÔ]Ž˜d0Ñn^º5Y¦WI–W?“| úè(ò,‘ærïýÔ@þw2 ò endstream endobj 1234 0 obj << /Length 1829 /Filter /FlateDecode >> stream xÚÕYmoÛ6þž_¡òPq|'Õoéšlí:,K‚C[ª­ÄÆü’Érºí×ï(R²(ËŽ=3i‡ˆ ‘÷ïŽwÏ‘$ÂðG¢GŠ1”r g'¸z[ÜEöáòÇâÆ%00i|u}òý¹Á(Å)‰®oÛ¢®Gчø‡qv_æÅ aŒÅâå á\ÄÅâ®Èf³ÉüÎ~ø%›¨ŽWÙtP–k<øtýöä캔¹¡¦5 §SSjŽãVÍåx¿òÏF¡ ‘TTƒ9FÚ‡O8ÁÇ·FBÓèK5tÁ¢ái]üÖ‡IE’s8»ïå)ÂD†0D ´ÈûP•a, ª&HKê£~^M¦#ƒÛšRD°Ž*a4±£?œ4‹Wóa9YÌ$þäfʈ” AÍÌ„ið²Uª9“y9ï çΛìþ–zÓ–¸ l ­ ­§Ä;”´=Œ#Ê›AW["…*†˜ó (Ó]óqÕX!ë[ÏÇ£J!^ ˜5aRm”ïÜ2hÛ ÔSÐFÔÆR)‚µVJúVš@¬#ñž€3‰ðúN|ÍE-°ÚØ<^—¸k5,WEn”æq9ÎJ«þx1-íãd~»(fYåÝêEöö¾Ž+7öôÂÎÎÿšÜ0Îæw¹Qt³Ð ÑHÊ:ÍäÕ¨?–«™6ÊʬFr«rœWy¦œ ³rQØÙ|ä¾Ü|®d ¨Šs§ÍzT¿”rQk\ž] 4‘³šj[ [­Áê•Ú—9XÉ©÷0"Φ«¬÷²Ïâ 6¡j,n§:c^ýô~=A)D‰Š$VHÉôÀ ô7©‚€Ky%JÔ[úן‰?b¬!–«á0_.oWSg?3$&59f³s¶_ö0ÇDeˆìkd¼Gö 겯º3ûAuÙ×_êrN¾Fò]ãvs/ƒ8ûä^öhî…0ÇZEBDñ‘¹lF!LÀs©úïÙ×—êgßnÓnY Ëhõǯ†qØÿàT5Æ#Û×{»Y‹ Õ®ïĨ¦šr$ ¦m1!ßd5Ù¬€­âR§é–!ºIaª:jæ½…åu9¨¼Œ³b’}žæÈV27ß{U±•v1©žWKÖ›mØ2†páºV¢‡ú˜½Õr’ox {7³›2W´*Ó¤ì­e õ(óUJ×¼9z+×¢rùsV4.R¤° RÑŒ,þŠÔU4tgE ‚ê*š‡ú0`$΋Éíß_£®=´;•M˜ÈÔa*›JÁLJfVã ,J*Y‰¢šï[ØX¶‚bàtïJ »• ,ž¼¡èä±÷&R¬7rñp1»Ïмn.×w;ƒ]€ô³%dµu¶ìM•"?Õ©’J_A$Cª„béžz’&lð®‰lÌì0d°DQè›>à…]ö¬Í†`!SC_Ó ãœMXeHfTèÉxÍC}vùæü÷MXN 0·4.§Â®…{> „ħoÞ½¶f7]¨‰„Ì…R^MøuªcVà!ÕŠAF“*Lÿed1½GÿÔU+tgµ ‚ꪕ‡êW«Îö$)b"Œ)¤m;våEoSê§­‘7 z§v˜ö4åANßæHA 7y†ëãz&¬‘‹W)KÞ}°¦™[ú~"«AGÙ´‡Èª=¿¥¯˜¥Aè«Eä¡ô5€5}õØM_C :úê¡>F_àÖôÕÃ}núJRŒp Ë[¢¡ ïsyÔÑWt'} ‚ê談º} ^ÓWßÎÛî.ž‡¿n½ÂÐÊl†ç< tÃl.ÒÇÝ3¨åXèJ”Üÿþ˜…¼ÁÃhd1©‰EÙYÌÚÝu˜( t{Á¨‰jõ?æ—‡][´f‡-ößS\þD'•ãÜ>ÔGdæÙ©ÎGû¿Z‰ªY•y³Uaý\æFEL\HïZÃ`µ©uÜo§ # 1"ý0xZUê½Ny¦BHýB!Xæ›Ê¯Ž‡¯éU~7» €éÈUó1nu> stream xÚÕXMo7½ëWðØ^¸ä 9F§{i Ρ­ëƒë­Ñ@*lHÿ}ßPNaíJåVŠê"q¹o‡ófø±1¹àb$v©ý'§Ñþ³³W1Æâ¢°õ¨£ŠÞÈÁqµŽ.±1¹TÌŠÙåH 4’˹a²Ë5™yqÂÍ\]FŒ§b=)ºl¬D®&³ÂOU³b5ýäî„>Ê­OѪͲ: n¦qi$ HÑXÌ“œÄZðR0(tihœøÑd$U^Ø8.V„" F¨Ò8F[ƒê¨9%:¢6)Á[*F‚XGfxÙl:n±q”Éff’63ŸˆÙ–ਘgѤbˆ ¥¢ ·•l%™j-qrë+h5YŠ:80F©h³E@˜¢µ”³…“vœZXAÏIÍ_&cQðå&<ò%˜/ ¾Â6ZEŸ¶1~Ö&>ç[ Ì5&͵y¥Šcc©Å% ZÕ%²è"²–JÑZ–T&!%›&VJÍ«*hm-²KhOjëÃ… ˜‹éAÌjz\KjzP³š„i¥Ê‚1(9˜ÜIlþr?·L¡¨h¥ÖªhYn—y['­­ KP¸‹ ¨ÖB Cs‚xYJ³s‰ÍÌÅ$s©f‹¢ÊÊæ J0k1$·‹®%œÄÐú-ËkB: $[œ-†7î e«(ëwnøáÇŸP\æ€Gî¯?~¼^¼zuÇš¼" º@*ÕC»>0JðŠ™î/Ö«;;sêï D-OM‹¦¹}”ðÓ+LÜâðôŽì©~~W°~¤ö€†·÷ëÛËåÆ]¹áí› 7¼_~Ú¸¿}xÿçK¼¸ùu¹¾?ËÕæÁÖ©F¶Þ-Ö÷·Ë‡íÚÕú¾_~¸»y½þä®:iT*]c ›{XÛr% ø<´Ž‚¬™Æl%ÏšûÀ  "à] JÅ[etT“Oy#–_£œŒ®¼GW~®Žrðçˆð,„/WähršŠé߉0œ¯Vk°]mUæÏhØX —¿lÚóww«ßÃëõý‡åý–=\›·ð;¨ÕÎZÅ 6ÿ”³Ï8Ç`G÷9GàÎ[,/ÝðíúýÚA†¯Î7¿Á¥»Û›ÍúþçÂÅãêvs·^=|m¡y®×ç`þc–Œ@‚ n²¾ífªXƒ©Ä‘ÈKéãkµŒõÿqMKØ“Nz|Mç:G­:ÚßÔÛ½ ¤j ¦ö8Èûªsö·Ð?“ä?V¡LU|¼ "3TDƒ'Ö>0+j&å>0qÁq„û@ܪ|ªédЦä©\…gÊ¥a"WI3äl‰³ËJˆ[¢'É} n¯^ødDPžŠ ñx”fˆ0YÍ„ûÀDÙÇÔÇÅbEXOF„ºgûP}s¶(VéãR´óÈ Sñ¸Ä:æÃøf¾›ÙÑaG°CÇÊ]!¿ÈÙ±êT­*Ç«UË µF \Õ§½×ã5ú²W…P„L}vT_æ vÔšWi_¼¶(L¯[öÉëXµì£[W­1H Bî³Ôé]v0eÜö¸Ç@Æ©°Ìa¤ëÉ|¤²/¹]ãñ§ûøÙ×u²+Q—×m©}`ª7.í õ_÷ÕÿŒr27)¢éÅœhæÅœ8Nd¥÷Þ1èp¹Ž€‡Ëu<\®#àárO­\y®ü]yŽ®Ì“o²ïü8æbº>þ²VÍ endstream endobj 1244 0 obj << /Length 2080 /Filter /FlateDecode >> stream xÚÝX[oÓH~﯈öÉAÍìÜÇæE-b¡”î ÊMœÆKbÛ¡Ûýõ{æbÇã8—R#­VTÄqÎ̹çBFþ‘Q„GŠ1ñp4]aó¶¸Ù‡«×gÄÑM€pÒ¢üíúì×WBŒFŽÈèzÞ¾êz6ú¼\Äë*)ÆÆX ž'œ‹à²ÈïŠxµJ³;ûÃq6¦a°‰—ã e!AHÆ_®ßœ]\7Ì¥'J©)wÄT &CätbÊ#¸³\¤ðW³üÖÜE¨B$†˜S¡oûôfðã›F"¤£{Cº ái9úxö¡'aIÎ}Æñº‡)&r¦H¤ð™&Ù4^Éz•fßu"#XŒÀˆQb}z5Y°É¦Ušgc|q'åˆ AõÉ Áì $2g>³ÞÄeFÆàáì|¯ove¸-%! áRwÓg,°cµÉ8¢œùìv Ê8Eƒå%AØÆDÛ \5ödˆ*æÛÓçǸDÚ‡£°Æ‡&ŠŸ9=hÛ"ԓк»«+¡HÖR•ô©:¡|Éähþ%‚ø7úB.ëMÚñ ¬ŠÍ´Ú‰—Õ"®¬à‹|9+ícšÍób›ñ-¤däGûâÒžNþžê”]ÄÙ]¢%©,Ï (Š\¤½Nêcß!bO^dÓ—WÉúRŸ×Þ7žp,˜ùÊ’[†ÌcˆœÎª­3v¬…e}•ÀmZ )‚ïc!ƒx¹Iž÷K$![pû\iV‹Ä>X¡/.[BÃ['¥!„”p´Fbø4+-1üVšà~Q4È KñîÏ·oíS:·ŸY^Yk:¡<_?hæÖ¢àÍÚ´¹C×8sž)ŠúUn|7‚YgÎf><ÀÏ(4yQ{ Á' … Á ô8ÂÔ!¡Ç´‹B>{Ê1¢!„=åAMòÙkö$¯P¦þÒÇßïy:;¼7ðÅaʆ_PB€-„™âIà 1( 1W‰ð‡Á׿ԀoSgÎímû”á`n@(H3‘¯Œ.”=zè—¸†þ}UÜw¢ˆu´ªDAXþ'kÊŽ¬^‰§53’"EiGìV RçNU«¼.Gy­S ¿fM- y€,B»‹½z÷±e[8öV»4ë¨rû›œÙ\&ÈA[_%et±‡àéÛ㙯uQ;=<üÌÞušgeeÁsº€1OϺhÚ#OJÞS ¥`‘š.¬)Ÿ¥Ê”4}ã-,Õyit*û€¨±$µœ–°Ok@-£أ="ÔGŸö­ß‚¬˜uR9ÉtoVIWɬ”Éûõo*RV¹Ä!|™¸ÌÛ?4HB·ÍAÎkl_n0[$ú*Öcl‡)ò +æ#ÜËÜLÇßM÷§„‡¸­¢þê©è^å5%D¼GœÅ+Gcã'!àÚ»¼ªjoR¤]€R’öù¿£1$á6•Vf¸/ä·NH£0“¦"ò Û_–T@Ÿœi4²sûÂà¥~h«¯ßë0ê« )Ï5#¤•=<3ÝVÂÛÆBð%v§oÓ,.,ñû+DúmšÍÒ)T-½¤ÐßËÄy ^Ù±¶D壦Fõt"L'ë’íN'¦HxS{‰C óþ>…qļµž6£Àܾ馆+ØT;IY'™ƒ¹«T·Ö¦öË,‰—7ŸX±Ú~[ºqCçáy3›ô„ÀUMýÒ§54Ë´ÁMö5˵íï³¾ë8Ô vð¶±­ ͨµ ÷¦p–mÔßd³¤(+«™ýÏ$E81C£J³ÙLÐaj³¾‹0q¼6ÂÔg©Az†^,­ëZÕ)Ë=’tʲHrJY¦Ž@‡…싳‡$¦cÇiz7?ÐÌÑèx„!……¡8Í•6“v‘$"ø')tð*TI±¸3¥’*¸v³ˆ§fM«I⢈M9±Mô“EM¢ÑD¿irè\§àºC½…†*åÑ”o¼)“I™”%\=ùj`÷¡ï^@¡‡§#‰+³zŒƒÑèp•µm¹‡[8µs‚#Ðャá~%>X xwQ¥NXT©¾E•2]PØî‚àWí«Ub`ÞºÙB`çEa·W$(-yµÏT}Mn?Û¾f: ûoVª³°ª¡Ö+NOÄÙGo¬¨éº†ÙXQ&ÁÍÞ·H¾õ”ûäýÍþýyùƒ'k8 dÚØd M«\Ãh:[&{›þã`Fá —¦¿}kǘP`èÎÚ¡‘™×GífÁÅU¼l7#u'£Ó¡E¡Aà V[#§YZi¶ñ³¢f»µ¯x=¢qægø5\èÖÚµÿ]ŒkR$­¥wÉ‘Ü7 suñÁµTõذYBçæŽÎü¾._¹ñf–Ìã Ð-¢5óÈ6•mÛT¸mo§ªDo§ÚÚshUüŵۂïµaæqºÜ{ tsJ< ˆ@µçP³I:|%ô9” Ãâ,RÌç»<3½µê[Gz¶`}œfÕ.ìÜhÞ½ G¸`â'€ëŸÎBÃÛ8¸\yõûÛ Yýws$·ÚÎ{×Ãìäõp„"°¡)ÆŸ´&ÚÄ\Å£èØ~‚„ˆ°»ÆÝS%1Kìc@- é„äixÿ˜Þ-Ij‹N> stream xÚíY[SÛF~çWèQîTÛ½jwû–¦¤%M§˜étH&£Ø2ÖŒ,9’ åß÷¬veK² &’¶lðîùÎý;:Ãñ4ö$cHsåM—G¸þkqåÙ7g¿w.€ƒAëäOG?¼Â#i¬‰w1o‹º˜y—þËE´ªâb0Æ|ñã$à\ø§E~UDËe’]Ù~² Uþ:J'eš_ÑÉû‹×GÇpAéZš“»jê¶š„(¤¼PqD·šF«"þd@û&Ñ…<Ñõ±Úî¿8 ÎŽßí¹_åÖŠU‘ÔfTȈñw1 !¢ÂÞ>mŽØ/Î_ž€ÅÊ?±¿GÅ2/â™ûóñ™ýkœMóúÔlã°|î ¨ñžÆÈ™"Û¦àŽ2gqµ.2{éz"„¥ëxBÀÄ/HŒ„ìÕÒÞ=ÿõ¾›x}Ú‚†iP ©P›P\¾ÇÞ >|íaÄ¥wSŸ\z QÉà]ê½J+* Òš×¢Â&büfñ°˜Y”ëé4.Ëù:uöƒÊ„! rŒ˜€(+' aJ¬œr‘À÷®þ„JD´ðBxÕ˜÷õŠn àˆÕ5 ‹L…d൬°^ÊõpCeãàJŽ´d]Ü2š0!gÔ3^+ð’/1$¡˜êK—¯&ŠùëlZ%yYòÞÝ ¡˜ Ì‚Öf ÊN6i’dè‚ çâµÁÊèÚÁ†¸S”LBnêæò;,°ÃèÔ.G”ÓæÐ¹]ß9¡´­'.·êã‹(›¥ñTÀ·Øß[‰¯NÞÛÄ–ÍQ¸5v¾’K(2§»rÏ÷dÇ ´€Æ„¡1ÑðÓõƒLò‚H¥]¦GeF† L©*È«R‡²Ó»b1E[q"C–Cà ¬ÌÿwrêÃXÜí²å&º¼¹jû¤ët |Â{fÚŽ½kf¾ª‹]žçŽGoФ*ÖÅ´ûüã™ èqm~€jÄßOpç“ÿ)PÊŠò1ḧJ?/q3УИ‘%Bu‚ëh¬ƒ ™² ª4\âã€jŽDßXW«CÕ$5âОˆ5«üÃ6n/°i2¿Ý°mUûÛ|"rnx;0g‡ð´š‘£Š3—°eß3È è@9L•zòãB"©d- s¾×mÃ.g ždÔÏ·5ÓÃÃcñ_ß$ÕÂ~f$COë0Ý>Zšw¿Úé-nòÇMRµ­æŸ†8š£íi¡žù5ÉúÁ7šj»øëô¹·F«Å„4ÁmGÿ&IÓ¦<ƒíWk8Ÿ™ê5—ÌÄ¥OâöñßIY•wÎläy‡6é#¨ch3¢¨fÏ;´Ìl”¡ÍÈ2”~ÈÐ6 ®Ú:¸«¨(¿ÄÒ¡…Ûž8XÊÄ O‡nÔmØÁ[4x€Á«TâQ[b"AjQB´f²ý®’á0v¨Îž`ÔÕùíî[=°G®Š8šÝ¹z`X=äëê žÍâ›ôv,Uí(6äÍ>oß…p¾)òå.‚/Ýê›ùjF —_%vTÌvMýŠö”(ă:(ÚüK蹨³~|'jê4²(<ôB£à:êìàšÚû̹…ý¶®^ר2ÉÇØÖIJœß–öÏGœü©‰“w9ê+cÎ>q:nä 7ʆù 7²Ž¿v¹Ñ<ÅFÍSq‡ŽûêèÑl{Ù(– ‰âƒŸ+6ÿЙöT endstream endobj 1262 0 obj << /Length 2018 /Filter /FlateDecode >> stream xÚíZYoÛF~÷¯à£TTÛ½¾õpE“Ø/E´DÅD$ÊáaCýõ=HqiJ‘kE‹"L“»3ßœû ’`øGƒÅ2\'ËívwË÷‰¿xýã ë°pÑ[ùíõÅW?‘Œ 6$¹^÷E]¯’7³ïnÓ»:+ç ÆØL|=_p.f/ËÝû2Ýnóâ½ðkZÌ©ž5éf¾ Ì2ÓlþöúÅÅåu§\Pz&J»òL0€3À”š#¸‡YÝæðÓªüØÉ"T!b„[Ì©°ÒÞ¼ÅÉ ¾H0š&né6DÃÕ&¹ºx5¦“0Š$ç±âô®Ì>Žè• ʦѫ82ŠÅz×ånûX-Å1¹”$ñÀÜ?0á›Ì*&•1)“•€Vùåo~˜k6kŠeïŠ9™½ ;eÂÔî\0 ¡V€ÅíÉ‹z) BLß9¿³ö¾[ç­n‰ûº‰ÔÒJø ™þ2Ž(gí¢+Ÿ1.}¿Bi'ˆ*Ú.¿M‹Ugx$•)$áNX÷¥—xu$™RHÁ>)b†ÄUÚYŸ^M¦Ê‰""8<­ rÂ&#äí#±1MæÀˆ¶p!¸D´q²%_©!IÙÔF­Þß:O`y6pÞrWTµ½ä³¥Õq›–'l‚Ø{OuÊŠt;š&±2È2ia‹ˆ©ÖX2ÿ(ñ¡+@—i¥ºÉÛ~äl[i~o6;h•z¶LëlåïÝÌ©šíÒËo®¡¶ºØ…ÂÈ‹¼¶©Þ3$mƒ‹Î1hÜV½zÚ‚@¿Ââqn jÊlhꮩïš®û¹³´ÌÓ›Öà‡¼¾õÏŠìa³?ný7/¯/_AéõF }'ªm~ìñèÄåq^œ\aË|½ïηڅÆ>Q³ÌïÜ­ý£Ðý²vÓ_Xfé*$v•e§ÛgiHQa(š<±=D†sΆóShà‚cN÷8£aØ=âòCu b„aå\}È +Žû€ÌìA‘níUäVæ<éׯa Èw§ 9Âú:¬m+ì+a#œÒ 4³AôíÓ,¨»þýåeë'Õ·¥²UZ7eæ Hô&_–'œÇªó—ߺÃÕO?ÃÏÈñ.´=•àFBŠç¤UÐA w¢ó~û%8lgÞòªY.³ªZ7›`ÌD{1ï QžGÆ„m°|2feaq›Do c‘Þ*«G´àr¥Æ —±±M}›sFfu}tWŽvleAÏÅÊÀðwG„!>v)ÑH úØ;“é3Ù§: M¸2ˆ‘g±3ù‰™v¢°ê³³cú=¥"âWg3´¶Y6ÆèØP@]·à†ù,«,5’%24X5JÒª#ÅGéߨ)Í)[ )©a“Ø¢ÓRóT[>Ü»1SàÀ$X>ŸÉvÞ¸iÖczl1±š*ÿ3#pòCOžÀWh”!쩾€/Œõ„¸,RqC¥Obâò_ÍÄÙS˜øÐÔ>Ói9Sº 6…ãÂVhÕ Ê6«–hàß2†öiê »˜ÔŒY±,÷wîàñ8#)¾þ«lóé°éˆ!G1[íæ^íÆHN©!Ò{›YY¨¬cü ÞÃú`AdûIQ{$êC#ˆ@åºúQ¾–e꜓mÖâjÉí™È‚ºˆïÞ4>¢­ðOáÜ3dXŒ¶QEãS˜Å€ù1ÀÇ\iQ§1òÝUf…s‚}að§6w“†<¢ê€§‡êàÒÏ}Q®Þ^Z.…üëX È­à `•Ö©žWþwS5Ð\§q³Äáô_°ã@rLl?rn±×KØ`çÒ‘ædp¿ÿ…Þì=Õž °ÊÃ{›îV‘3Ó^|ùÚ_€(ß*W-°‘P,$׳빆û5Uj é~Þ¶ ;4ÀÄTÜÖë|›Ùã 3°ÖîPeälÛæ„ýãÁ^ÛwÍ{G¸b³O üFû50:¦>ñäZcL^OùÈbæ}:\Õa®À·¹?Þ=Ñ"¼7#0Fk[ºl6ÚjÐLIrŦ{n-m*Aô!­ªÐt÷#Sˆ×OuR¿âÐIp95ö1ÜYî66ÎYi½öMþ8øöÛÁ§°q¤…gÄÉ‘:œBÁ€v§êöoç74f†ù}>9¦Âb¢L‡*†“ŽðA°.½“J7Z8ßµ~Éݹïg«£j¢îû\”ea®`i£0·± ´{øÙñÉÜø3|ÜQq¦§`Ç ‰â³¿íX4v˜»ï endstream endobj 1269 0 obj << /Length 1736 /Filter /FlateDecode >> stream xÚíZ[sÚF~÷¯Ðô :Õvï—¼µ§·É$±Ý§$ÃPŒmƈ¶þ÷ýVZÉZ!0Ä´™xbF¬Îwîß‘ŽYBñ%Ž&Fâ¤MFw'4¿º¼NŠg?°p.ÅÁ´vòÇ‹“ï_)•0Ju,¹¸ª‹º¸LÞ÷^Þ ÙxÙO…=õ¢ŸJ©zo—óëåðîn2».¾x=œõ¹í­‡Ó~Ê…c¬geÿãů'§¸â|O-ýÉ 5 Ô„BÏ ¦¶’0! 5W7ü”Ÿ*YŒœÊK®¼´÷ir‰/M(Q–'åGï`Ÿ¦ÉùÉ»6L&8ÑRÆÀÃÅrü©W;¢¸è×HâŒh<ÎZP$\wê1øf“Q_°Þ­ÿ¯Ào¦7^Ä3\cÅmï_õ­è­g£l2ŸõYïc¸S' §”âþÎTXÜ@§üžÉ,ë#Tˆì ÷óV Äm ®iÚÃé 5o•²lLÈYÞšgÆp~O§sôLÛ ³ñeqí>7½û‡"©yCZ"´,1BmLf“Ì'{ÍH1”…TU “V[¹‚ïP)S„[¹™!q™kt¦©?¼MÏNߦfó`Þe°É·XuëiAɯ} LާåùÅ ¨B/õЇ §¶EAÊ Nf‹uô‹% ŠïFó…¿|_\äÌV~÷`£h‘!K“HQ3A‹È§/#émniC,}cêFÒXòÙ8[/g…Œ?ûJ!·Öc´Û­9>@ǧõ[CJžÿü ~6«škƒJ3 î#”»«ºA(Z'!JãBTßüì‡Eaüj=W««õ48 &©”ÙBNÊÑüJºyl@³ Öv3 xYÊí7 t‚fw¾ðĺj­gá s,>Žd¬4¶=ó=ÉØíKÆE$l¢ð§‘1B(¥ÝAlu££b6^‡Æ!xKæõŽÚe†óDF–D3‘‹R2ؘíšgÑ*®¦ÃëÖ|‰ÍÜÎÉC˜>Œ“ÍÍÉòN6{pòuI4eõæß^-çw;ØÄ Œ­ª@6ô`ÄpÑÐãÍ:«¸7¤éøº|¬Í‹+C8­x¢”Ð ©¡^qºFˆy[ó`‘‡NÿΖÃQIê7ãŠGß,BÃÛ"ó~Må¬y¥¸¨+¾“Õ>ÞNÆú³ÈXJA¤í„Œ½(¤\7d¼KÄOÈn¨ØË¢j?*î7Pq„»^ÛË51Lv‚Ê):šn ®ŸÙ›Y"}ïµÝ cäè¥rñ*à¾C¢èÊfK‰iÚ¼h+$æÂôhã¢;¾ÜŽï‹6"ãÌ«øðBrK(å‰pxL·O|$Šb†ò¢˜zdðI¹C‡à*&ñ±}Öd€ôNGÑÿb.PO 1Ïn1;<Üê†y¹»ìC)ƒ'"û`ÐD ¹ýqv6Ÿ¥4L%!ÜÞ¢™sõZù¦M ÏÑÿ}â ? ™­4¿P<–·šox­[´b¸zô‹Q+Pj?VµþYÅG‡õZÇ ­!b—»Ž6mð6rÓ†@^:çžsÚTáþN† ÿ6Ô”Ú?2ltföÎsï:óK—Í€9µ]`sß@|ìëØ0x=Y¢Kl"[ß®;q6·šX¡bävÞGE0œ,xŸwÍûw¹—¥ÑÿÞç0 Ýïsˉ…áý#Ðþ×÷_0ï«gæý×EïÌEÖûÙÕ£¶Ä¹­)õ“ÇÙ)>½ÛBù¨Ú\%< ås/ÆØ.(ß‹2åÃç¡|fÑ”7–Ïâ|/«záùçw‚H?­½qo2>GróN9‚#¯¶lÚ¤ÊÉù¸†ÁjËÊ)ÁœÜ‡tùqHwï-ƒ£DÀ—Lc¨yÚxá$¨1—¤%?Þ’Aà€ÅTqë>[¦rQw±eð¢¤cå–¡ÅBwº¸÷¶.$’M¨= ˆ*7_—þ‡/ýÿíbÓ¾|¾hØ·c[*ðÈ¢TsuQß’”kŸËx+äDcÍùxËFí±_NÑŸÌËï.'Þ¡‡í"žùoŒƒÃ; ‰Ó½g¯Í?Ô¢¥ endstream endobj 1278 0 obj << /Length 1630 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯУ=Lï¤úÖ í¶C/É[[j¬ÆFÛµåný÷ûHQЍH¶Ó(]± b…::×ç|¢YBñÃ’Œ&F’I›\\ŸP¿º¹Lª‹W¿ž° —B0mIþ|vòÓS¥FIF3–œ½o«:›%¯'¿ÌóuYl¦©b¢MS)ÕäÅfu¹É¯¯ËËêÆŸùrÊíd—_MS.2Æ&VMßž=;yrÖWœ饓¼å¦›‚PøÜÔV&dåæv¾Àomòc£‹qCX¦¼°äÊi{ý–&3Ü|–P¢,Oþò¢× ˜ÅÕUrzò²Ï&œh)cÃùzS|챫3¢¸Ç®‘$3"¶»Z—‹Õr{Û2çœ$p Ëœ[ ëD<›9«]àp©ˆÉ²$åø”¼’}ýtjÅd·¼pÎNÙämxR'Œ‘L)îžL…E© ñÏ,–åP¡¦ç>Ãç!ÞóÆº¦mëÌ2ÔYÖ:ÞPEƒ©¬-& ‡kAè´ÂŒðA)o;&áÈ{ŸçËÙUѧU¢±ä~¬4ž Rd”‰j*K47ÝúHÓ”Gë­òtìf’ë5‰,d<ß.Y_,\ºÇjÔÞRÉ ‘ß„ÔVÙ$4˜bÕ½ÝÂoùRðô͘DÒèûÄèÀ¯™ðª¸ ¶Ë¾ ±¦ °‚KRâb(¬/)£Èb­bîA@~tÆu­ÔwIY÷$ AÖzdäÛðyuµB»´“‹¼,fÕÚ»)7“Ï7»¤•‰*ëáas,–‹Ò½Gä²'UaÒ*WÀ™2‹j°Û‰÷¹Fì†úøEúêÉË*ÔáÙðxF4Õð¼ûâ³”`ëˆOh"E'¾6@:µÄþ¤¢àóÐn}„å*D8 aa+øÏ* $ìšJOeµRöØ=W&å¼p>qj4…u¯É/FËUY‰l‹2~f±\ïÂÒ:Çx.ÜÜîIµ˜M‚÷m•N&2L‚F.ß!0ë:—ŒÛ µ-6Ÿ\}«bÃ4üeÈØ¼¸•!X3mk4.Ы¢ÜmB^?M•žv4>ê…¹ë7ªö´z4Àðô·ßñÛ3'µAë0‰’ÚGy·o ƒ.„á£Ð£¬ µ~þGÀÆÊD•…íîâ¢Ønßï®Bâi›º!æô¤Øc´îu‡˜âØÔŒÂlˈeú(f3ŠÝÀl"»™Í–kfYÞ׫©`€þ‡IŽx(’ãùTôM/N)¡\ÃsÄÝx™çHš!Ã"‘ޤP{ Q8Žº9UÔˆýD'…2Ð!Mî£ùŽiµáÔ5?HG8Õ½ègØup^bˆe\ŒDmìajƒ¾.ˆÛýû;·ùp›ñ¨o…ˆ§èÕ½÷›Õõ!žÓ ïÎã2pwÑæ<îÿ WÞèÅ?|ÉxÖã.<ëqžsùÏõM7¬î'>Ú+Ìaâ“Ö’Ñqȇßp3): ð.Dçëò†eŒƒç8UJd#ñ~Ï #×ÚQxŽÓ%3sÏÅnà9‘Ýˢ챚B29ŠUŽWX®;Vó ºt§\ y­6=ˆqü^ëq|ÀÈfLÅ> pØÿ¼Zx3 eXz Ã$¤þ¼JDHÂyQ~^÷.¥‰bì_"£©›üüùJÙ»¹ '†š‡üpâCm¼ó%’K3p¸ò³~ÿ—HVª±« ÞS8¿×—H`{ ïoN•²æðXg_ø%€àt'Ú´";}ÚâTI¡[ñ ×L4sp,Ƕ¸ÃÌ÷Iÿ“Þõ„ýÁ¿‰‡µ»û v¨#9~Èî6îW­aïWŠjv×ʼný¾™ùÎP;yÑÈ ö[ýb¯pRØ1æ=4q*Ž÷ΛòYH‚ endstream endobj 1287 0 obj << /Length 1620 /Filter /FlateDecode >> stream xÚíY[s›F~÷¯à:Ñv¯ì’·4uZ§iëÚêt:IÆC$d3ƒ@d×ÿ¾gÙ] ²å;M&c…a÷|çþVÄÃðC¼{’1qåÍ–G¸¹[^zæâì§#b×M`ᤵò‡éÑ÷¯„ðFŽˆ7]´EMçÞ[ÿåU¼ª“2˜0Æ|ñ<˜p.üÓ²¸,ãå2Í/̓_ã< Ê_ÇY0¡,"ÄWað~úúèxº”¨¥^¹£¦5 §U3TÆšÕU ¿òŸ,B%"‘hs*´´·ï±7‡‡¯=Œ„¢ÞM³téÁ¢à*óÎþÂ$Œ¢ó.p¼*“•Æí;’q‚ ½ %H*aV¿}(æ¯óYy@ü÷vgè‚"!¨Þ9a L— J³ç¼1í"®r€k„µõ¢…â62!ÂJ¹ýï°À&j/ãˆrÖ1ÁüÎ ¥m¥À*©[~çó,g…€³Å&CØàŒ8 LÀ¿D]©=gRDÀ—Vj“…ÜÅtænk£\ÙÏ,+ •?‹ëdnî}¨ôo·^oy+ÄBî0¬“Ó<­µ[†t“5bãE¤—€q‚Cê20N J¥y6F‡…‹óß,˜¿„\Hôhê´7yrc,|q:9;> ÷Ÿ™+°MúÅjmÍ»Ië+ó´*–Öód¯³ÚüsŽY'²æÈ¶9ØêÏ’z]æ½ êóAW@9AÁàöVkK}•­â5\6­¢N!*…í+îó·?ß¼1 wqš­ËÄ*Û­ÇI!·&”B¾‹ÃˆBÈi2J#в°×z°a„"FÇ•1E;°«2ÍFüz("4R€ l ?¾¥y½Ûz.4v=Ø€8C‚‰Gh@l¨u¥6 hÓüž‰¯NޛĖÍQ¸µvq5$—P$¶•nåžïÉ6ŽuØ!Û d¢× ;—›¨3kU+ê=/  Oh5J:ÖÑd0`tà&0¿ÓW÷2#MBÝ׬E JÇÈüšZõ.- uîM>t%ð ë™ùž%»f«Æ¸Ä55×ïnÊ´†jXÐÑdï°Í SÙÓÆ2F£M]Ħ_èöë¨ÊlìtýS·Ælyqþò¤QÿÄÆª\¥ ÷<>3w“|f"8ß …Å ÐÃxêN’ãrÐùÏ'ð»[ª4”P>Òã >1y`©ö¢•ñFTè:ôï¿üLf–›×³YRU‹u6ÌkD9"6 ètbÓ²„"1Û(¸–Ù:¸U¬‰í:`ÔO>»Uñõà€K€`hgÂÝKnôqÈ-z$r£“k(z Â쓸 ƒ=:wa`‘¸Û R•¢•ÚÈ7nÛrlnãcs4 PäZÿiޥóÎÒ¯‹È¼þ+JÇ 2-J(ù´D‚¡°QˆL˘Dd£àZ"ëàBªì‚ªðq@#(l¨þ¨-×ÁzŠ&ò±x³..éðÙÐL@û(ŽÁ B™¡C¯íá8éoe(I»9Žr½Ï)Ùn‰Ñ~r³¶¸¡}:•@Rt©SG©¾] :K`D éÌŠ¼ªMáÏ4ÔU\Þ—PµG –ÇËÁ´è‚í¥j]2œó®–_4W?ˆ!ÕÇ2ä.¸×!LÓNj½óÖþ Óâýù(ÍWk›6@{!¼?¦ñçøÊ ›¥‹Û ßÖÇÍù¦¥gGÁÛ)„Y«8¨µPu’Û”­’äžYVÀä)< ‰@gûÎäBB;• J (¤{Ý6ìsÆŠ”ìÜìÞ–M#ŒÅCœ½=Ö’¡ËgMè~/õUDZf„K\ÙiÊ¢vôüKs‡[Û“XoL2²Ò¼{ýÔ•ÛôïÓcd/ݱq;ê7i–¹Âœlç·Z¡¹º›2©=ÇHþM«úI½ï›Ôô— ‚È1&5-Š*ú´“Q q¥F™Ô´,]‡Lj£àÚI­ƒ»ŠËêsœ5´p¿¤Ÿ¤“0„< Ç8I×¢8!­Il¿¯¾¨QêeÏï@½X×±kžÜd·ûãà¾ÉewPœ%wþÞƒ1*‹å.•‚Cí·ÍNûU²¹u™š11ß5÷ÿtØﲜ©1$QÌ%P­Í_i2 endstream endobj 1296 0 obj << /Length 1826 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯУ=Ôï¤úÖméÖ.Û²${Ú"Pe9`Ëž$7Ë¿ß9"K²œÄ’uÄ@d“Lp¢¥l+ŽÖy²îÑ«C >Œ^£ˆ°¼­7O¢)ªí懤ÛÒ@´anò»×c+F›,.ÓU6f£~¥#¡RWN„…ˆ°¤Z“få2¡|h/+G/·j5mªe®Âzñ{ª¨×6§IÂ%¯'»œUô•Ê›IF¸õôy”MIŸTЭ·º_8‰¯ßœã“Ü#[½uv6ï“Ë8ÁÙm¹ç{*MR¸²Ö$ÛnÆ¥¹M¸ð^5Þ‰‡°hA”ÔÂZ‘±;b5áÚ U2ÊaªSœÝt VUÔ6[¬ÏH?`‡ÉzÒÐ*=ØŒëZh²Þ˜U"üÒʉ¨ðÿ‹`†ÅQ™LÝoÇÜŒn¶5ÚȈ´DhYëð¥™fi‰×ð£e˜-¦nëˆôºÊ•¸à«À;eцHŠì¸ùž2é\k»¹ZWÎ%™û:[y$Å}èÙo‹S€–ð»[·^(}}àÆï¤64¤ í7ñ/?:í)L¸x›8NŠb¶Yx÷Û c¬“ƒM@îARIE´ÕƒtH”…Àñ9ˆ^ß![z«JÛÍÕDi9ˆZ rÒVë˺o³jV•ɵfô÷r–Öº;ýY[È {H‡õgþ™ýy_Æ"]DEꣶÄBQ†ËõQq‹ìMÐ ÷7Ïôlêv¯L+V\öé|ÒzË? måͺ7zŠÎX'zñ*+<ÄǨcåw8Éo)T–EËÞ:i+ÛK p £bæÍ d»¥ÜÝ‘í³tä]Kî–¡ŽJ¬‘ÏEz3¤€iv¬N³;Œ.¼°8ÝÜË*=ëªûûÖ½šu»=L[¹±Í‰Èˆ|qIr×!±P¦@Ž«SÇ#Z®”‚X8f¢(ZcDOÐú#.¸"TÚ&Wsk·û«£ŽJÕ!ÞVJFZl„½"ZâS+¨ŽYºù3˜=Á³7¯y{ÛR4X—ÃBÇÒd+oiÖÍ=ŽÖ,ïâ÷ÓcXø%2Éà”§Ù” EI8Ý<'%!%Œ‚’¡,©ôƒ(Ù z=%ké½JÊ­!ì.ÑÊ)j%ÚZá@ÒS"\â1y¥iKå:Ê{<å ¨ “Ã(¼bºëi9¬‚,ÁúqžÃ³¥OÆA!Á—îKôÿ²ÁhÚ$ƒj2þw^Ù{ãÊiÃ6ŸÙ×}p›0¥­ uèð1 •ÔV¢´h2Ô¡b1ù‡ÒÓº‘‰ Þ–Pƒxõ$ª¦åMyGΠ'l+jo¹<𲊅°i¨ýïÞVvKÔìø»¬£¦hˆØÍ6 è°Ijšà¹E?í\ÝOA9)ôa̹œG~l¾ZLÁ¶Â}+çI‡\ÔWXNGƒ®ÿYæQ\îl@± ¢é§_»áÐbC>»AQxòœì†+ŒtvÜðÙ¶ßW[¡nÂ;;Z…€­ÿèxî[_u£Ðè…»tú.ÎÅs]Ætдu³ÿ„#BóoDÓ=ðyÁiF³º ªo1œ¨ÊÄEîÔÝÃq¿:=KÖ§nl·Šm¯±Þ3˜êrðT¬–‰{š&³h³(݇o€øY=zSUO/$lФ¨áÏCq¼ÉóÄß5¹‘tY߬õ±‘¥eÀ´X7E™,[/*£q-SÔ·õ¨·Hâíù>YL‹çÈ[ÿ[νwñ×a?ÿvrâ/"êW0QºØäI?Ž…!ðÓ!0Æð"Yso޲P/Œuš³Õ»Á!Ôst—ñ¶úuœŽ½Ê ˜z‚·ÌM§/Ñ„^eÖ`›??ãü0èËfÑ=—K¨e‡KµÄX;ĹE¡UœKîk~x/ÀÌýl ZÙÿß=?Á»çë<-ëwÏXAQ,£ endstream endobj 1305 0 obj << /Length 1579 /Filter /FlateDecode >> stream xÚíZ[oÛ6~ϯУ<̯"Ù·®K·t–%†!-Õ–c²ìIr²üûŠ”,Úrj·JÚ¡EXáå;Wž> 0ü@ã@2†4WÁdq‚ëÑâ6°?Ÿ·n Ç•?^üðZˆ€`¤±&ÁÕ¬ u5 ®ÃWóxU%ÅhÌ ŋјsžËÛ"^,ÒüÖNüç#ªÂuœÆ”iBB¥Fï®Þœœ^µÂ¥jiV»j¢ "ÅaÜjšä“xU$«U\TFö¶eE€±]][ÂÃÓ|òòü"Y¨ ãbDÂÊXÄÃji-[imZ… f0v(c"âÚb7kì–——¯ÎÀ *<³ÇÅbY$S‹ûÓé…u—õªiëÅåÌ~~P©·˜ð,AÎJÙµûª]$ÕºÈí®»‘aœ­|Ñç!‰‘¢ñÝZÚ½—¿œÁoÒÚXÑH" D‚¢H­ëw8˜Âä›#.ƒûzå"`ˆJOYpyòg_æQIÖ¼†â,²Jüñ«•Ÿ‚ÉÌ:¡\O&IYÎÖ™s¨L€c`ÆDYHDĨóC9OáwWB%"Z@rhÄ´ÜÖ_(ÚÀ'Ê7À—Lø€ó‹`ÙŸ•[îƒ4æD<{5¡¾ø21‘g4LúBNFX¨ÚY˜»éúõH±pOªt™C²¼s;#8vmAk?3òd“-i9*¨pž¾éÚ}SÆwNz„½S ¡"*‡ñ ìDy‡#ÊÛƒ{i#YgÅw”vãÄeZ½|çÓ,éCeE0âÖ}o_ŸývjÓ¬›£hcólÞ‡K(2«[ܺl˜äV’FñLÙMÊ"EFhXy¦|]¤§‰"M…—9é3Žr³¯Q|·œú±“1";¡#}΀bÄ!…o¸/ámé² 9o¶ÚÂêŠSœe¶”NâÊÖY¾7µóa“¸Ÿp…XÔ&Ë×4O+“CüÚçO´Y…zm¥`«æÌ¯Àm’ø4 Ço™i«ú®™ËUm\âÊøl騸¾H+àŽ~]¬O“§!H¨0 Ü™NáÈËfòQL¨B£ö484 ¡ˆ°!8Ð@1©†á@vrmÖêA(Ð`áæ y!¾¡@O9ŒB¼ &òq"¶†´Ð‘#­½ÕSïçCgYó½ mMæµ6ÁªV½>ƒ+%t y²ÌKW'FÆ<. O¤ºá1ÂòxÑ›¾°½´N(Œ}µ´þLdº£L·ÚbS™­î®Ð¶ê-•Ò|µvJ1F U¿o"Q:´I:{h¹¹ªC`fdCå ]on0Ì™Ä!b…æÊR%¹Ëá2I>PCPl9\©©ø$båB" U×@a¢öú­ßé èB›š½ëõÍ9Úu‹cœ}ŸVs;g!7Ì Ä óä9Ö^ÿ’&}ÜÍËIõôüËP‹]Kµ OϦ¡Á\Á_.+;o੎ÚXš1(cõç&̬9“fôêïóSäçnGw÷}šeö©Í…ZP|gOv-cæ>É¿iY•]îÄó¶8 ¸ Îàzg ¸|ÞŠæŒr½3X„“c®wCˆo®wžx[~ÆÖFGüvoCšË:´µ¡ž¨µÁvZp—Vä¸Öâîü ÐÛ`èYèΕn¿º½1Iÿ¦ø5\ƒÄS77Š$ž>ysc¹®"ä<¹ÏöGc»KñHäÌÙŠ{o àëãæ-™¬{#æÁõFd8m¦v["ftV,ö©q´y?[pëäåjÅ•›»Mm3&¯•Åþñí:ã‹é¯PÈu4(‘çe`¢áKÙ L4(tz!¾a`O¼9ªŸ€7Ò¿½[8‚€‰ð•F AÀJŠoüûÿ/ük6¹×ÛkFúÞ:0G±~›ÃQlý>Åš¡ Åvˆñ #U©ák™‚S‰bv(¥mþùmV endstream endobj 1313 0 obj << /Length 1680 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯУ\Ìï—¾uCº†eI^†¶EN„Ú²'ËëÜ_¿C‰’E…NìZ ¬ˆÒá¹ó|%aø#‘Á‘b ®£tq†ë»å}Ô\\þtFœÜ§=ɮϾ+DD02ØèzÖWu}½‹|HVUVN¦Œ±X¼žL9ñE¹¼/“Å"/'Å„êx“Ì'SÊ !±6“׿ž_wÆ¥zi%¹©ÀM†0øéÜ”š#Âxãæú!‡_kòïN¡ #jaN…ÕöîŽîàá¯FBÓèS-ºˆ@€h¸šGWg†lF‘äÜ7œi²*³Õ*)«Çæ)шK6ŠyJ!!„úægår0+,ã㘕°`õ{Lø<³†‡ýCa)§2šR‰°Rø»·ÍâM‘Vù²˜øƒ[)#B‚Ú•S¦!@¾Ôkò¢š@'WÚ›~¢olØ7³¼uAbߊ„’­¢÷X`gÏôÅ8¢œ¶BWMÿ@3“ø•SJûÞq‚(ít>$Å]¿§•)$᎓ûÎj¤V;D½žLIü>å” )#)4¢† ÆUW/†¨b~½aQ$¤ÑªÂ Yä‰à¦T ¤5¦P="Â=4¤bDy‘2¨šUÈ´/H´ò¶xÕvÌ¡Àj8М.‹ue/yœZ‰JÁˆ$äQѾ±"Y»Å7ÍBB.A†4bp¯É ´· `T]»Ôc“·CªŽÁ-­#HÖîÿ|¾„ù©ã4©²»æÞ턪x»Û/;„ƒG’·6Ü6É‹¼²ß ÄsLÁ†]P8VÁaô2ˆU#‰÷·ƒ§XR¤(D¼ÜT««Ú?!ã¤Ì“Û6îOyõÐ<+²Oóíþ$œ雋Ëlua öÃn;¯ePUvÝvU« —K@VÌÀù¼xÂ÷µÓ–æ³mƒU],ûDÅY³r9k¹‰Ùˆ-›g·}Á2Kî\«¯3'xµÕ83H€TÑÒGN /pÎÒ€²V“àboÒÂg0k0¬ö¥Y½Ûnƒa<"Ó».±ša|Ú$¶8’,ì•—UV'²‘ŸEí{4u–=_/ìãs,¼>ª ¹úéÚU:ÍíÓÌY½þëâ¼M—ꇎ‡¶«MY4!j¿ÉÀã×Ám ¬º´5KÝÔ¸úùøH€T0U$˜FFŠSº„*˜¬À'¬*¬}øã7— ˆ¹|lÒ4[¯g›¹‹ßg}£Ær¦äaÌM˺ÆanVG1·1Ì·ÌÍ3Ÿ…¬rØÐ‚cÕ"f¾ÕàÙ6ÈÜÀK%•cnú…˜„}ó±u`ÀÛ0ìPÊámì1ocûyÛŽÅÛž˜¿Ø k‰ÌáSèTŒBÁ¬*Ú®yšeäéfØĘ< ?4HH¥UE0y?%†ãóñà‹4µ~÷"œ:»çºáZ…*Ö€þ³0Æœóô7; ÆzG:0;ÏÚ3!ë=!Cï03 ¹ïÙS¡ l\‘§cgpgZù±†D*ó,Pz‘}ÎÊå´ÊÊE^ìn6mlÒkp-”eÒäbp OçyæÞò50 è=b×^yÞ{ ë/åõÒ!êªV}MGij±ˆ°1ŽÒVƒds–V‡á1Å0o ­.Œé1x<†ù=ó Ë{ΘqìJ×¾ÝuÜœkD-í}ypÓ¹0æ71¨ÀÁgiJ`vCþ4FDžúåCY•A†Šç¨€€3æô£ô|˜`cp˜cZ}û ñÿâòHNPs¬ì{p÷‘‚wHÎâû¬ÈÊdžnmñ¸} oQÔûb±®–¥÷|^©ÀÕnñ~"ð¤Ú¯„À|áLÁ@“}E{ °Þüev#v endstream endobj 1321 0 obj << /Length 1526 /Filter /FlateDecode >> stream xÚíYMsÛ6½ûWðHu*‹oä–v’¶étšÆ¾%M36g$Ê¡H·ý÷] MÐTEŒãIâx™öíÃ.v ˆ(þƒÈÒHsN¬0Qº>¡ÍÓò*jß¼úõü¸%\Fþ|vòÓs)# ÄR ÑÙ»¡©³ËèuüËurSeåbÉ9å“ÅR¿,7We²^çÅUûÁŸI±`&®“Õbɸˆ-]¼={qò쬗Œ}¤—nä=75ºÉ E?½›Ê\´nn¯süí ß÷¶€iV6ƒ“ÎÚë·4ºÄ_D”Hâš¡ë€Áw«èôäï)LàŒ(!Bà¬H“›2»¹IÊê><C„â³À3† ,„Oëm–NàJC´wõh\…xvDû*kØŽ³‡QK´V&QÚ±¯Ÿ/ ë"­òM±€ø­Ÿ©"b¥dnæ’¤§Ñ‘fN^T Ìé{>\æó†ôyï‚¢ ÀˆD¼¡7TRg‡Ãa‚uƒNÛìiRùo” ½@˜æÝð뤸\eSV¹& Ÿøq?¶Owä¦`@4G)J”5ã ÝLj{ôAŒFl˜$]v¦\¾5ðɶ€)2Kf$n--1Ê §óxŒ %á GÌê¼ÙögS)ˆqP‘šH¤r9&‘˜ÎO®ú@´@ 2©ß!ãDá@¸aƒ<)ÞK0Š@¿X0‘ÁÀ¬Ï¾¦^Š®:¡Ç¢›ÚxŸlýÿ«Õ §‰Ó¤Ê.Ûg ¦ãÿî¶ÊC¸†ß!y‘W.ÙDÇ4ntÙ§0™äʤÀÄàÈ9[»33Êa³ãgEúôå«ìæ¥c‘”¸ë«–þÊfeÌknÇ”‡ž}ˆ:0Š9æÎÇ|Ð wv/uFeNb‰1ÞÔÕMíIúm‘]u󟼺nߥ«ƒq;¢}¶ÎÓrƒP›âүΠ"[]6žº°8¸ (Ïþ­Ê$­îlÞÙ»íµ¼+7ëvà J£Tu+£‡diˆü*«ê²h-Ý.¤ÄHÖÆ÷ÉdÒa¯ÁnB‡S½K§¿ýŽ¿uCiÜÈ:’Êu`Ùƒ¤±"`Î8C\ù2÷×-zŽ+ÂÛEØÖišm·ïê•§¶?,­×Ó°¬|”ÜBeÔ,rÃÙâV"7æ€ïäF¿GnÌ‚ëåF€»ýòrcûµÈ ÉÐ,rC6&ÅAr>¯ÞÔCÍzÙ’º×Ô41ÚÎ&4´&ãò]h|;B£ç~Ôðý^ïÖÕÆ÷¶ÌÉ}ÇNêêÚÏÍqA6¥ßYti›Ÿ{ŠÃK¡ÓÎNoM·ßW-’èòø©‡4äcR‚Sbf‘Î’b+3Å“Ž˜Gf8[J$3æ€ïdF¿ÍÞ q½v¯¸€£”¾ïˆ¸•Ì<Ž`ònBGv\s€vW!ì3ë· õú"+w^u¸þt–‡Öæ®A·u7E° ‡í$€Â° sÜ¿TÕ²A;<q傸çþƒ 7¯ó|v!Âq²9-‚t: µïæCõÔúšJ9˜½ª„!´¤ß¯?¾IUÒÔaw¯¿v¯Ã]6…†}Ú•ÈÖ݇dïk\%5qÚ>fcm@/nÝKÖÝܵÉAóÕM›Ô¾MŠ©C?ÿR_(L,!nz!ûm =Ç–6¥]$ÁÆÕ×°®Ýñ¶Ý9!Ò´Ž“û ´º“{@kÿwûOìú#Nì´Ù1ßOì_Gëv9ú?LmI endstream endobj 1331 0 obj << /Length 1884 /Filter /FlateDecode >> stream xÚåXYoÛF~÷¯ úDå–{qÉ}P\9q[‘”…c4EKD$R!)»FÑÿÞÙ‹"eÊq£}(bD«ÕÎñÍÌαØñáv"ß”¢ˆ…N²>òÕn¹pôbòê›sôZ'_ÎŽ~>áÜÁ>Šü;³›6«Ùܹp—ñ¦NËG)uù‹ÇwÇe±(ãõ:Ëú‡÷q> ¡»WÐc7ƒËÙ›£Ñ¬Î y¢–òäC5£¶š‡(t‚!L™Ö´J¿h%ÖòÿkP$tAqÐb#ÇH„d):…‰¹ ·Nì]V/õ 8oÓù˜¥«¹þRútUeª·@‚úVñ¦L7›¸¬‘Ôk<@­ÖtGøOäkaÌåÉp…¿«ó·½þá‡ØÍ5†Ø&IZ <ìV7Û¨dЀ˜"è%¹‡£ù‰ˆFUµÌàÏå—&Ú0GÜ ˆDDe¼]\úÎ~|ã8pË:ºvb8„ÕÊ™}ÐQÙ•Œ)AcŠ÷à¶»Š'`xÐgO\Lºâëlöˆå ΞG,ñiWlRl»÷}þ%˜!åßúçâdRw›'uVäàÚË]aqN”kiEy=€lÁs¯Ú¦¾’À¯@ £BàwU ·eôÉ羑×I3 Ö$Š©Ž ‰?¦¤­„8Ô_Æù|•öq¥°cÎý¤9NÄ'#wxÄ ¶ø¾§˜hEô–£öÐv'ŠÃZz\å¸ $ù7‚ÛDæ¸?–÷%Ž(ODF ëa?px©!b߃ŒÈ”ž’¬ ‡F˜¤³JÆÛz™æu–ÄpûBX‚ÁZ‘‚û{((ÿtìՉ΀LI°Wƒª&˜%UŒ+ó¹Z*僲©IôײlÝ÷e\ÌBDƒFssG²<«e¸·€t:Äo‚õcå`BF;U£'4:|a¼_t[ÕI@u‚k_kô_A@øð÷·5{ 9†üE~:eÑPè¸CR­Ní’ß7ÀÐPІ²Õ=P•EXe•ÊÛ¥Þé¦,Ö¦‘0BÚŽ9nñ  ÖÃC¯¨”i|F±oj+ð³õ:Ÿ¨Þ¡'Ÿî¸pXDQàoÌ'Ý % ]@ IV\S¥4+Ú¶!a¦!‘ÍH«aˆ²@'Qhcb@bT|8âPµâN‡²•9/!ŸËøÐ]ONÓ«“AԔĪÏJÒÂ$Ӭϖà[¼>AWüvòÒ›OF?譬ҟЩ«Ïáô a¹„¶JªQ—[ðE¢–°Ø–†Õ¶’÷N®L¦Q$ñf³’Ñ!kµú1YeæX1†ªJËÛêR2„ägúG"Bž[¨ ©À´r§ ¸tQfµ àH¸›²¨ÓD'ƒ(pçq£€3zyäqJ¥²$•‘ûŸ•z÷êÿ9Ô,†ÁèÌ2«{}ÐLp4Ö–Bï-ÊÔj¬ÛH4Û È˜È¥‚r1ËOÚ5Ú‘ù©J¥ÒýùIvŠzŒº35@A³a-+D€š¤º;í‘J{;ê¾ o Ð5—Tš#¦ñ7}Ð +?kL°9ÖkhåX·—Ò¤„¸›xaà  C€:è‡öðãhöX6Å[ T°¨ŒI#í{7…¬;àä»fÄÍV«mU—P†*“—&Û‹fÒ§¾Wzö+· $®õ+˜;öf¾'F|ß}ñâÝÞ‚ÅÇïN‡³Óó3½CüK½˜Ž>|ô·?&ÆQˆEÑæ6/ä5¶–öôl6z5šè/2ò¸4ÐO}—q]-¼ú~“Í.ð!ÄÈÃTãø&õ®‹¹¼6$· bxXÔÞËó_|®`àõ¸dÔ/S½¯Ü؇ù/ËKÎ>îÚXIƒ‹Ufgè§Z’béÉÔc±X“žÏF3Ãk69={Õ‹G᪎×KnÍù6-¯Ó²¨fªJ+†céôá»>‹‚‰õ©5æû,ú4)rYÙsÀÍ£‰—o××ê sgÞ§yMÉSXxñ|^B´`˜áðº¨ê¡þ©OûrŸŽ?¤ëŠÿЧ¾˜¦žðÓž0ô¿<Šžå@ò¢~¸ ÿÞA¦F -††éó Ã;Ýy&ŠPàãÿpò Ÿ8‚éê§Bô}s/…a_@Ï.9‘v:2ˆz!Ñjhc¦CÆ„‰ûüëÃ!̧Óÿípx(øáÈîMÐàÜ(…mâJSmÍà‘§wæ-ÐW[ãZÿ°,š¡&ËoŠrmºTe#ýbZlÍY[¶M7¶ºQOëÖ™`ŽËlkX™×X«Ï®Øuupsª™ûw^]Ÿ4‰1>Çp$ô³ßg#©Íß›µ endstream endobj 1337 0 obj << /Length 1645 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯУ\Ôœx'ûÖ® íŠ-Éžº"Ðl9¢H™$7Í~ý/’%YŽ=XÙV`HPy¾sÉIDðƒ’R¤™ ·g‘}[^®pþî ûzs¨8ïÔ|uyöÃ[Î!i\®º¦.—ÁçðÇu|W'ålN) ù‹Ùœ1þ\×e|{›æ×îÃOq>#*ÜÄÙlN¨Æ8Ôdöåòýٛ˜r¤—¦æŽ›ܤ(?½›B1„)snVë~È?Z[˜H„5·•áÆÚç/Q°„ïƒqE‚{[õ6€ XA) .Î~ÃÄ” ÁØ8^%#°\"%è4°‚"ŠIvYävØ}Ê‚«`N hWùóÛ™¢á&_Ôi‘ÏpøÅ·ÆHsNLË9Up žØ6_‹t9ƒžà>µW&Ы-¬ˆº°˜JD¸nÿñÈcèn5†#M¥‹=]FD„ÆàI5L“mæ("’ö3ׇ#‚! Œ%Îx§Ãì }æ#!Ý4PÈŸh³Ðôî0^ÂŽx'\<îœDBÑÁºs<´Ùï:¬oMÚ‰ÆÂª.7‹zSZYX¯ãÚù¾.²eåŠi¾*ÊÛØö­}ÿ“P…ů׽xùökŸ|[˜iºŽókë8fAçf –úugYaM,âÚ +–IUlÊER¹Ç¸ª|ª,ÍKÞÏæ8La|ÕkWË«>0‚a¥Ex Ýï>Vëb“-]Ù¹îAàHÒ~€÷®\¯÷Q?±ñÝ]–.:‰¸_'¾”Ö.yáž³ñ¤–'ä×ÝÔi–þéG‰³_›4Ò~]wÄù2ƒÈl·ö§/ăÜ|TÍ|¨çý…R×ßçðJʰ(ݧO¿~üèÛ¯Üÿ¼¨]áÁ¦Å?TP°‰ôözºðôç>?eÙ¼òÔ¿0 =Èyê8Îc0 9f“pž±E=†ó&õœ×ƒípÞY XOƒ ,k¸¡°ëÕá($Š j„µaÚÉ…!pëU <àW.P¤Ô1üJjC©!à€I%NÓ†”š”žD¯ˆ^ESë¹ç™} †ävƒ0ADrÃîG´å˜Â£A³Ì´½³wDŠèƒK†Y³höÿê’±ãðˆüm26æ±@Z]î-4‚¬ê¢‰!Í·^!¿n9;½…ë¢Y¸Z½ù¡1ÚXØ*Q˜ª­['“1ˆlPe“p±1E¾yœ‹§@õT<Šú¨ö<]zÆUŽw‰qŸ{ ÕIaçEl ÕIÍæ[èÿUçQ[æVu¾¼ø„ðp»8©úT}õI´>¤>aLŒ¨OÓЊ)x·MÑõµ)¥ù –óÖ”†Ú3V.šON{Úö+÷ßjOShµ§Åiµ§óïßÔžDñÐiøÎØ¢ì¨ÃÁI`=á«`àR< ¬TÔ=ºd Èݧ‘îÏÝ)@ð >Í™¤âHcÁ(}šðœZS†èŽfX1­ð„õGFxŠˆ($GRÙÈ®†#¡X‚פ!ømå}ëÁøàº!͈}ŸÊSea U4p:ðùÃù«ùrG{6ÊqßÑ¥W£ÞtoAQ£¬Iz`%;ù@  ,2 ?S”¥G§@õô| ª§ç)P;÷@—IyˆO9~Móz;·ÀO~*€a$kɦ80¦${êC…DëØ+›g£æ-a«Ð44L3bÝlÏéÀxen0vRÅ`Fi2Eª5NÊ^ªêGòª Ì eI>6@¨„ÍÙá#® ÃÈ ¼ï{×ÜiyRïÞ~yÉîoŸÚyб {/*Ú}\gø›!Ýq»/Êaó¶ÇÐø ¡%X–}bÞ€~d|ädêÞmüÅW\–qsƒfnÆR{Ggo¿î3<ä—ÛÀYøú͹_8ò…Ëʲ½ô/Vƒ“ÝøîAG·Ç\³xË(>¨{í|e-à60ÚŒuû[ž›Iò¢^ä endstream endobj 1347 0 obj << /Length 1913 /Filter /FlateDecode >> stream xÚåYYoÛF~÷¯à#UTÛ½¾õpZ÷@ÓØ@Q¤A@K”M@¦\‘ÊÑ_ßÙKÒR+[™4@áC$µ;×ÎÎ÷í~Hap¡C†ëbvw†ÝÓõMá/^üpF¸) œîüöêì«gB#ƒ )®û¢®æÅËò»Û꾯ד)c¬_O¦œ‹òùzu³®îîšöÆñkÕN¨.7Õr2¥ÌR6yuõÓÙùÕV¹ ôD+íÈGÌ$D#]HÍaÜ[úýù 0F˜²ng+0C—óÚ?¸üæÙ¹¿êúõfÖoÖ5šX-啵úý}3«–Ë÷Ö`Ð#=F!l8Øått· ü¾îªEýúzÓ,çaᄹ)RLƹMçmØtõÜ_õ`&“¸¼žÒ ówý-ÜÖV`1eØ ÍŠ)aˆ/&8CÕÎû&|Ýõ(ëHMYmúœÁ#%sA,DÆGsVõÎpxvíÂæ¯ûÛ8r±ig}³j¿´·¦¬Ú0ºéÃgg‹×uwïD¯Ú®¹n–0p'wµð! T"!IˆñÆÙõŠIé¢È8¬v0U9SýÃfµï)l"¡!É_ÔÆÖ‹{3œÞÔ° _碤0»0ù©Ÿ{ùãüÆÄÿ{›ÑT*dÀÉ)䫱9ýò.æðåOF\oÝÈ»‚!ª\-‹Ë³ßs‰OARrøÄ!'~ûÙëo ˜w¼ÛÌfu×-6Ë0"ˆAŽ3%ÚË트6ûé}h?¡ # »Na5´_hºu€#Ntê@ª™0Š$çN'2(† •Q+Ò’£V2Ä=I­ÖH02ŽZUL§Z繇)òq ¥”Ä”øZç÷¼ Hæò€Ä'îà EÔÈ1¸…%‰ÜgD‚Ã¥vŒc ‚ce ¨K'œQÔ‚“¨½_Cæ0Rf¡ŸÁµú#A¿UÇ|(ë4)ë'cþq|6ì“Ç ‡0_fñ7…”‘Ï.~ ;)/›#¹svq›…^`Q‚äc*3x8J#àhO_ ÙÄQ°(^}Õµ$‹¿v/j}*ÓurTE>о\"BL*2‰šsp¢rÀÛÕåqª/ÿñ:Ç\gà¸i›þ©pLG†³´~nó!m£ f†`lèËúÐÍ•?ס/V¾]7=@FÞ¯ ÁÞá<¡‹–øã3ó¥ÌèpúY‰«Ïã?ã›Ëï.œå­ïVëH2½íE¤?4‡èAØ2Ÿ¶˜€=Šé°eEY67Α]Ÿ†hÌî¸qN쌤•9ÐÆÐðl Õ¢Ù› £eý(¤˜}Sç ®5ûM$@c'³çX\{n6”? ÐˆË +JFRr Ð(ÔcrxäÎà˜xÇlÊJ–öZÿ8f>ÓcàXçNŒoì¿:eÁÛ˽Q°>ñ9‹2{8¯¨­¼ô·˜©Ý÷tÀ²²;©Å<ŠÚ€X‰ZH”C¥J!Îø8J5JÏR¥a‡f»0a­>Ò™¯_½^4Ë> stream xÚÕYËnd5Ý÷Wx ܶëa[ŠFÊ0„ Ha’²I EŒºQÒð÷œr”¸oäKGHôb’º¾§®SU×ÎÄDÅUÇ¿9¸’ì¹ý°rIÄq$mEUÓá옚Pç¦]Ä´ˆI‚1Ô¦•œÛ ¹¬j‚¸¢mE] ¦.ÙUnZÅÕbZR] ©°T`[5cM R-8³C-fÅ#å&Á Ç&!Hn±kqQŠid¬ióa‘çdû0µ¬>2^”S†åÒ‚ÊP+MCá¼¶¨rv)ˆí&W—¢ØZ ªé–èÒ6“ÈijF $Šl>RKmÄÅvT ²Ýâ+°§Ét‘kì¥mör0ö2ÉMy«!~t›ü+ð4Ñ6¾Z 5&ju ’m‹°UJQMJÄb© jXƒÔ˜¦î%µ5Xãƒ,khº°¬¨ŠH–µ49ÐQm –‹‘‡í£‚¤­¡¨j5]8ç@MBY…Ü$ÔUŒ>b„$fD±¥RBù5(Tædû)ÌF<öàX‚Å‚”°pÃÁ²”æå®mGøÁYQ³„mq1ʰ] -dp'æ•!±Y#‚Ôö˜¬Ø›„-¤â„c[Ã[6v -%\Ða"dº((‘l8ô—h4g ·ªÍŠÀ£U¡×¤À%¤bÔÖ`¹Z!ºLC0]´™ ‹££Åòƒ»@ëÚú£[þøÓÏh.l;û‚²X?~út¹x÷îU {ëÊ!;÷)vÀ“ÍúÁ¹å‰5÷‚ËO¢U"6·}°­¡¿_Y§ƒæ§wÖíÈÊÓ;› Üàhyz·¹>[=¸ ·<ýpâ–ç«ÏîŸÎÿüc…W¿­˯Ïjýpoó§é/–W÷›Ç»ëÕýv&µµïW7·Wï7ŸÝEÀ‚¢PsM—ptum„-®éà—é°²›³¤¹úI:œdöm0²VÏ…Ç@¢<Ë3¦<—10rðŠº?úe‚~yý2‡þ¤‰¼N²ÕA)’[Ç@Ì odŒ5x›åcº^ñ,õs™|ÎÝÞtiÚ¥KÃþtiœAWÂéÀ³ŽqÄSãð‰÷…ÊÁ´ŒÖ ò8(s8(;3ñ'œ½Ö:rTeÇ$_à ×e¢|8´æ²K+N[óh-¼CkÎ3hí@Z’OIÇ@‰øn…<âjâíh7¦<§x0t•¼KW‘ýé*:ƒ®d]q…¥FŸ'éꀬ8>¤2ÚNdŒ³.´3Þ¡ÐZu—ÖÊûÓZe­HKðveq¥ñ¸~¸ßyܦÆÀ„yi7xOýÉõÿË+.Û;¼Úx_^íê=äµiÂõaŠ…ˆëîôi¿â†ëKŒc`,ø‡t(çLŠ´K×6¨ýèŠi]È>†¢cœÄàsãHŒS`| æäB)NU÷'+…du Wgf|ufö@ÆDó `Rò•fmfÒ¯i&¯DOÍãõzk®ý!ÏâéÜ6ÀbyöøëC{þîvýûbù~sw³ºÛZ—Ã5¢O±xÂ]|‘´“Ï6WÕ¼·Lž¹å·›ó _Ÿ~õñ›~ ®Ö7ö«-œštò¸¾~¸Ý¬ï¿´=çæ`R„V§®ü=óôŸ|z\Ìâíèñ¦‘ý¢zžUÕ0²i÷@L$ÿ®Z^¤Cç ;ÐÉg”Nœüw@Îj ®íÿ#†À”L3bŒ˜+%ÒÁŒ ž(~Cðœè@'§8²²§4ˆ¶D¥> stream xÚíZ[oG~ϯØG»ª§s¿ð4i­J“¼T€ÐÆ^Ç«Úk×^ƒÒ_ß3—½zlLc j‘Øìž9÷9ß7$Áð‡$'Š1d¸NÆ‹3ìÞ®ïÿpõÓ r#µ$ŸÝœýp!DB02ØäfÚVu3I^žÏÒU™­‡#ÆØ@<Ž8ƒWëåÝ:],òâÎø5-†T¶é|8¢Ì20|øöæÅÙùMm\Pz¤—VrÇMn2„ÁÏà¦Ôƽ››Y?•É¿j]„*DŒpœ «íõ[œLàã‹#¡iòÁ‰. žæÉõÙï1›„Q$9ïN§YĬPHKv³’!Fh×ì*]oœÝ~ý‰vLkUçØ/ Í{ýó%ü쎻 x ¤ŠâGAÇ:UÄ« SïÃo/½ùÒÅ|6Ûñ8Ûl¦Ûyˆ¿‹ PA¯Æ‚gæ8Èœ"­èI Óêš™'1 ³cÖnº#&91d6Vûˆ Ïš}EÄÔŸ 1Ù‘ˆÉŒB ª*`¾H%†˜Äµ„UÅL‚$ßó?˜ú±¦éfÀD^a¢ª0‘G0‘u2µƒ‰0˜jXä]X¬ íñÁ"œ‡Âä°hUq)¿,.ÚaÈ> .Z]˜ªcpñ$f.v̺^Û5k@›á§1kà Ó64v¤·( “ñ³am´ï¦ù<~Œ•æ¥xD ¼<™0®¬J 'Huz²SšIkv Sô¢ÉÝ-QÇch8í¥…ž¶Påý*jAÀA›ž…ñ²Ø„Y>¶¶féú@R·Kcé"Ú]c{Ñf›þÿR€¯ ¼‘jì\ýÔ)mkÜ®- àJs¥üÍ‹în‚¶q>½¯¯EKW–•CùÒËi×Alé¿Ý¶-å M½É²\>1ƒ4´'# qÍ­œ3؆ک¢ÜìÍZ<ã ¶=æ:–ófgõ b„±ø”T7a5Ød`a!]اNZ=yôòSùhZ°¼‡§Ud¬^µ{G‘ýÚÛ¯›»ùãÕ9¬|LÔËþÍ•9õ²ªhuÖúRÔ‹r«Až„zQ{Ï€Å1Ôë$fõê˜ü¹Ù.¾øMþ¸±úØoò÷R 8nsH.…1¯ÍƒnÜÀ;ç©’R´(P$(‡­é1üGÆù£±Nf§†xi8u‚)^…‰°èQ/×!{¹¤^÷¹êØ¢]C¸âiÑuã´º°W⮆ºú7ùß‘MJí5…Úa8Vò‡µ=뀿V•¨¶Ü¡ÌÁ oö™ pîôb`ßèã1ôÑÉú{‘áé=¡a ÍjýhhüphĶ¤ì± wqýîŽ@mb1 c?@˜ýé&k´º· ESû(ZÐÜa=–ØqzR¨®¤ëuê³Ü¡g¬!î¼*r¥±mRÏŒH“´Lûaûi~p0žízCöX'kßfG‚rÃÆßIÆÞ|­F]×mV» L~k™P¶®˜¦·û'4¢bÊàmÃݯ!D^î_Ù>9ŽÚPÌn{K8XlÔö‡65œåong+áÛªÈð½œyIíØq $vNS®)A(/½ˆº4P{]Ghw¼•³¬¢éGÃ>¿ÍçyÙj*_h{p¬úß(¿Ÿdo½`^þkâ}jÖ­ 0\} Ò š(fÇrnëÍ?´‘[ endstream endobj 1364 0 obj << /Length 2057 /Filter /FlateDecode >> stream xÚíZYoãF~÷¯à£DvWŸyK™Í&Xd3öÛd`Ð=&F‘Œáüú­>xº%ËcNdcÀt³º®®ã«æÐ$Å41i¢ˆá:Yï.R·zøø‡·ÿ¼ n…„«å·W_½"¡)1©¡ÉÕíÕÕ&y·øÇ]v_ç‡å âëåŠs±øÏ¡üpÈv»bÿÁ¿øw¶_2½h²írÅÀPº0bùþꇋï®:Ⴑ3µ´”OÔT¨&õ jJÍ îÕ¬î üiEþÚñ¢Lj„#æLXnïÞ§É_þ¤Dh–<8Ò]‚TãÓ6¹¼ø9&“#’ó‰àì6ˆŠh óˆ•@€²‰Ø¼ŽHÕŒc摪5IÑý#©ë%ÐÅǪÙYÙÓÈaZcOŽ!s¿ãÝ›¥†E³_×E¹_ÒÅû°S&”#³;W ñ¬ªãöûz‰1 ¡^[_£Á×ë^´L‡¢©d¤hü’Š4È1C2Ng-Ñ¥¾_¦l¨§„)hÉï²ýf›Ç¸‚"Rè–îKÏñòH<‚¢DPŒ!aˆ9="®º‚ }pBS¹‚A+•R/>«ö4f ž‰=Øt´S–LšŠÞ$ÁãÄsUÈe…ÑAmÏÈæ{ ,…’£‰2‘\¥ÅkL¤R£‰àXa°9ÉuÌ<Ì6ÕYç¤~¼š($áZMNk]î«Ú>r q´ë.;œ Tjƒ œœ% ÙDRUü)€å"1‡Ë@R’*ú).ÛæûXr‰”0J¹EcÖ® M1i“HÒŒŠ–RÊdËÔµÞqwa«sZV…ßÛm‰ýE/ÖYoüÚÍ’©Åc_UÁÃ5*Ä»˜÷ŤØµ­;FŠ),^¢;\5• Ì&hª$½:Í©CjCxj¨¥uf>cš>bZÊ#¦Y®ÏšÆO›FBÎ:˜FÛ²Š¸0·9ï~ʪEÔ`Œ£øÄâbߌ2,ÕÚÛ²õKeÈ™º<„¥[ÈÞ?^~󿻏 A#&Ä:P¡^¦1,6YQl}|FË tC„.ÇŠr ÒLu%Å +o[áAu°ÕqÕ!¨ÎŸª½êÉ*ÈyôÒïàÌDücW[ qÝ8"íØÚeÏÖ=~sj{QùßM…¨rûH¹ÏûGÈÿi,$ ~êëWÈoWx5êlkÔÄjq*“°Æö5¢´þ2é¢*wÖƒ†.²ûûm‰\t¯î]nçëâ—”òµ_ ‡€OMå4>ÖwÇGk\þèWoåÎ/×w˜¤.¼ËeݾÏj¿ýçlôºŽL¼ñÚ8¡LYçw$rqeáZé—«Ìrþͱ·;P»b—c#cÈþÑ.—§Üeá(ì6äü× qPŠE™CŠaª_ã@è8‰u YÚD ³Ïñˆ°WMí92IT“?;1‚0oÆÞüŸ˜‚è_j ‚s¦  àü˜§`^6u7Bd‡C‹‘¬Q9÷´Ï¶Æ[¯zë¹ï ÌÐ ¾ýñí·«ãFPj,žDùdvãD‚Qú¦±h ?„‰"9ø-"7$ºµZ˜–ÐÃqÂþœ€OS'ŒcÄØ GŠÖø q c}Óª<÷'!)úÁþèWoÛ×ÖüÐmá“ÂF_k9Z­¦7i¡Bµ 2 PXò06”ûª¸)¶E= Öû‡zg÷cè&)Ø×'q'=;Ñ’¹¡'`=0fäi9©ö¢ëÕÈÎCž £ (Ì‚<-¯”±sç,bò‹=õ5a©ákÂHjï2*ˆNçñ1cˆùÄÄÇGñ®`DQù¿_œÆ¼ZÙ8òÂË /;òšs!/(†!"ÒŒ¿°qDK]iY mfC¼rò@ =¹çiïüˆøÄ?%2=ûžwíÏ”$vèQ¯Â¾:E(©+ú™{ýÐûüÕ?a©þõÿ÷»ú1è\›÷Øu|!Ú];¯ö§×Χñ,ýt<{ò¼UššÒdä2¯'׋Žy Q>¶—†=f޹äπިЮSÎß,+®é ß( 3 |£DµÿYæ4|›El€o#±î–¤ˆ@ĬÇ/¹¾‹ÄönŠNL-¦¯i‘’Í•ãm›jËñ‘¶è?©>éší(|Â-l¾Ú @×H`cƒúïF˜=Q›&¯îÀÇü1ŽFÜ™ç;¿6„s3FVãvØz7f’™©y-DÉÃÌ~[†vXaEÃÜû²k“›qƒY—;ìGG>D‘6¤þ 7^‡% endstream endobj 1373 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚÍYYoÛH~÷¯öe¥…Ù˾Iûà8rÆãŒãØšc h‰¶ˆH”†¤œ5óß§ªФ);Aô°ˆµú¨»ë«.ÑAÿè šs‹h0]„f¶xØÁÕ»êö°1hì|39ø÷©”’8Œé`rß$5™ n†'ód]¥Å(àœåÑ(B/‹ÕC‘,—Yþ`~Kò‹†›d1 )Æjt;ùõ`<©™KƾSJÜùŠ˜”F$¨HÊ…•ôÍ&[Ì@¾ §(Ì<5_ËÍÒÎ&¹[.ÓÊ2ÿ™ã'ž_½ ®OÇÄN_¬ªÔŽªyRùQVÚÑýj±X!‡onâê¿Ø/TÒðÎoëÐá  ”*­Ìv¦«å:©²»Ejg¾eÕÜ‘t¸%Í éC²p˜,ªùjó0· kàR¤%îßÀp‰ƒäF‹'»á>ýæø-׋t™§UÀv•;A6¥ã_ÍÓ–¼Ô ìtDÐó$xXÀÄ]<žÒMO!ˆ0í¼t•V›"·Qó8’lR8äζ¼¬C"µ£¥={ýËüùû³¦4‰AÅc¢cássf°Ê¡ßÌÎ倃PF‹ÁõÁǾcš’H ))c+ćsË?ûRnMPn¦Ó´,ï7 gl$ê[:S$Îó%ÄÑ<{.?ešÐXPˆBÙ•_F¬V@A£¶mΔ3¢„0´$u(“û´‡­Ô$R|?l'œ²6ÛǧôÈîŸúÍa¬d&’DƒÌ‘›ÓQ™O1>!DnÝI·|,™±. Oh#Y÷T2éìûjûÇcƒ¯ [iD€ˆ¼Ž°/¡ “¸¹M&¸ßt½Ãsya¤2ŠH²Œ¼¸y” ¥‰Vºá8{ÿrª°¦!8XP)/¤÷ò3ʒаÞuèîÒ¸b$Òlq¥`µ5úй$}²·¨W)E^ܯi¿ XÜð!íÓ<`1Ä“­üÛ0“ì”uTеý!ç¹”  Ã4©Ò™»Cž¶‘Ú  •¨=´ P »†Øí×MÖ±Gz5£±ÊÚ%ZÙ6nŸvà‹¸«ì×Î+‡ø%$6¸}‡Vq@§fµò)¹ иwÎì°‘䳌[€ð /¹½ <ª»•Ch]#40#vƃ´ªAZÕ ­º ­ €i‹¤ª ÒÊ—jè' (}(X#5gÂ!5‡œS8íPš7DiØ5n\Jo–Éâ2î5¸Œ ½¸Œ; .ãÄe3ÓDâç……åW1Yv09VˆÉÊ`r?  pöáàN@Wq<1‡ë§Ñ\R"f @þa¸d,“(Û)›CQ¼Ù„¹Ýq[6©Ï¹beËè^¸r[í´¸¾9~ÛÃry¬ö£ªê0<ž|¾Û;ÎDV»È½‡$©ð‚á§î»¸RçüR™ º6‰5u'J»„ùçÂ!&(\ÚåZÎ èa ©~F_.B(%µ!ÅÅ‹®å·Ä{á ÁÎ#Ùæúi|uvú¹Ç»pC탯`Œ„S-¾§# oºã³÷ã·ÖÖ§Ú¦#ãÜi…¯?!p­œi‘¢Àk*¦&µ9¨I²E:óÕ' &VÊhèëtØØ[›NŸAhI„ôæø2¸´³ÖÛ00“N¿æK¤¼EÓJU€Õ4ê°«$TT„¾6•ÜÝðð»_Q©K´®w1^¢ØÅ (´­z°Ccï¤t,š¡™-¸'P½ºŠÖVPÀù{f§ýµÂ‚Ð_+Ò[ãÂã5bíoKJ°0ýǾÐÀê—ïÏNŽ'g.ì £·vp=þøûøâdl¿ýÏh $‰¨îÔa9Ü@ÅìMèΞ]LÆïÆWö † D ö•qËò!¨žÖ©“ì†î"Áè–FL¡R­[vëŇɸÈÁ˜ypˆ·?QT£7slªÄù¦EÒÉ–æÓ`•—»Cã|Z<­á¹ñò„òìa鼸»,²ÇK> stream xÚíY[s›F~÷¯àe¢íÞ/ykšË4I3©íö%Íxˆ„-Æ2¸€âº¿¾g/ @ÈVjÜ63dgÏw.ì·ß.$Âð‡DGŠ1d¸ŽWGØÝ-/"qüúˆ»9Î;–ÏO¾{%DD02Øèô¼ëêt}ŒX%×uZÎæŒ±X<›Í9ñ‡²¸(“««,¿ð~JòÕñ&YÏæ”Bb£fŸNß½«†‚–0ÝTëü@O'pqi±]xðcS9‚«,Ø…xáªïS¸¥e\”þÑû_Þ½³W<ÎÎý¼¨ýŭÙÍI\{‹Ê^C‘\C¤½“<Ô©,›[ðÐÓå½l§c;óO> ÛY_”²CØnØÀv=ØÛ µFXÑi ®&}äÊwugnj` DZ“ B`Õ³xÀ¬B"¬õ!ÌÊîÕ„Ê@‡#.µ|˜&„¤¤’ΕdìAÄ:ðl‰U6VO½¿½K…x,§ÈˆAƒ%”°—Ñ–_` &EíÓvgïêˆ45÷. ÄÿÃkň0ßU½MÉFb&°ša̽¦U]4Idù6,äù6øé­X'ÍŠÕJÍ·ÓÆÃV„ZUm |L‹NÅÈ ö™rš²uÅÒ¹›§@ |<Šz§ô|¸òLªœì²ã> ö¢“Á¶c>…èd¶'Òü/:Ü/·¢óû“÷ˆ ÷‹½X¾R‰ê¾¥ÆX%*¬…·u…xÉ®µc­Ø‹&lŒC·íÍ,X…€Áh(E±—¢ÖÈKQ7þÜÿï¥(ŒòR´öw«V‚úøþM JP›†ñ¬/Æ:œ6PÞ!°†Âü—ÓÀ…•}Ø}ú”›ÇÑŸîŸ}TRĤ˜æPR ddÌ 2ÚHð¶½9`ßëNÜ}}SY´=C{V /ïóóöèUˆ‘£ °½Þ„`IY&Í×4û•̲s_ÂnÖáÀ($®¶‰óøÅËãÀîùÂWeÙ~þ/ÎG;)„°z‹]·åƒþÀTÞÒJHl/|¬¼Ü&Æú‰ñNb_¹&í+ê+ endstream endobj 1390 0 obj << /Length 1911 /Filter /FlateDecode >> stream xÚåYKsÛ6¾ûWðHe"ïGnIê¤IÓÔµÝ^’Œ‡–(‹32å’”S÷×wA€AQ¶<â!3?DÀî·‹Å· €D~Hdp¤C†ëhv{‚ëÖâ&rçïOˆï7…ŽÓNÏ7—'?½""lHt¹èŠºœG_â·Ëä®J‹É”1‹W“)ç">+Ö7Er{›å7îÅoI>¡:Þ$«É”2CHlôäÛåÇ“ÓËV¹ ô@”¶ç0 ÑHGRsDwH>=0RÇi>[ ÏSÛ`â³ó¹WeUlfÕ¦HÑd*Ž/-ꇻl–¬V0è‘#‘ÐpÕ:Êe¿WwEvu½ÉVó¯X`ø#~l#EšÉflV:4› ‰á‘ÄéܪÖî³èúTËÔJŒ¦ Ä©ˆ¦„!"œ o[sÜׯ˜ð¢¬Ð !˜#-Z0ëM5™b@¬Ä œã:Kª4´]מsÏղ鹨ä³*[ç/íW'¹ïUþ³lFxÈEZÞÕ¢×y™]g+踕»^8'*4Ü;8pvÊš¸¬=È8L¸‡ªj¨®1k¢º¦ÂJ€bÚÇùy ~̸û‰°FoR˜©WCnR %7¹¡¥{ñËømbÿï6¨©TÈÉ ’uTù†£9¼ûaÄUô½îx1Dƒ§UtqòÇPèSEoXI°†ßuê3ˆæì.7³YZ–‹ÍÊÛˆÁäX1`½“3¥¼jº¾ ŸP…ˆ‘ B©>~¡ikGœèЀP3aIÎkYTK§Ø.©µÂ ÅFR+"Z¤ÖP˜9ŽZ£¢2T;‡ÈÝ ¡s?†V K†ZËtxÑsàR`Ú)Œiº~y7Ñ,ö«–Á·-§@ÔAëb8Zµt‘Ã*T,Yÿs¯Zå¼QH ½ ˧^•évãˆrÚtºØ¤ 8Nq ­”䙋,ÐǰF nEqÚ –)#*~áM¡]w0‚¸a È&²ú’íÄà–‡-QRÏ&@YKðsR<¦À JÛ\äc¨/ß&Æm'/¿ÌþMwýÅ9„¦Ðcø‹ ‚Lcà¯jÈ0¾h²9³Jó¡a€M˜N|!«§BÃÚ¡¡ÐÎô³-}×5 o&ˆ3ñT¾›öX“ö¬@‚ËJá±AÁJmÌ AÓ(¶xy˜¯¶³ÖÉ{¦eùݦò¶EÒfXϪ¥{rÕôðÕ“ s×òëù›©­9†Ñy}pílö\o€–Hô½q8¸Íù.‘5˜Yˆ™ïbfÝŠÏÏS€\èÔ ëÑTQ4³åXcµýØ pßËs÷l‰¬~È*7~Û-ýgf.“üÆV˜œòøÃ½%b]4Ûq‹$[•/m£/ˆ½7ã9óõ‰¯žx[ †š]K‘Þ&Y^þHµ‡h—°jF(~¬(NISüŒXápȆ–䎕Eþ¨pFQë+œ@-¬ «ù.)“¿KtâèäïròURæd·ØÁR¼+VÌ85Øõ5§0LUŠQµ(ŽiP@°ï+l%µSôì J€½)Ø)rDN ö‡x#ñ”º\¯æeC´‹uq›ÔSíèöÚmÈúmH†‡$ãxÕi Øä}ê¾¾øŒˆyšÏΊ BéþÌV:6ê.@/Šõ­g6è;¨÷9|FµÙòÙ ™I›bµCfv cdƒ3l[7ŽëwÖ¤Ü=ºþº9m°M]Ü–ç xµp¯>ÿùé“ëž-Üg¾®œO=¦`Ö¬œÔçð²qðÚo“Üû©(š&_¸ÌÀµóar¤öåYÌr¡X‘£0£•tu3Ž¢Ö3c ¶ÇJ½œÅaña5ŠvÊ%¢ #оo3ÎV„ÍÇ÷ëlþ(ïÛQ,‡Š©d»-SPEÅà8 «ÛJbXEÅOíÆl³Ç ØØ MôqÑ"ƒêÜ9´c¢† Ì{‰Àö~"¯Ž:Ï(á- ü°yf`G´›výÑ+]%¬TÓÃ~úù­Õ|f—Øësûÿ²{¨hsÔº1¬)À{u·ê¤¦hêµà.ÊnK÷­Zª=°È‹Ô©… Ç u+ K}©¢Ö“z ö RC{Cêö=»ò±H}ð„­Ëé­þ>§Ã‚¡±:{šÕY½´g¤œ³£hÜ"‰?nÅúpZ7ѺèѺ_©¾Bz1(žÛ¢»·$±ù›ØHI²èð¹`7„!QQCq!‘¤^zV†ªÑŸ»í÷‘ÈHÓ1ð¸c7£îÿèØmϽ™=3}Ó ïÓçnyú}å¶‚»+ö6pÄÕ^º6GelÿQ;í?ª“[êyä¨nkçóÎê6¤>¿³XvÏýû^º'¥Ã‹Îõï@(Ù ×[ÖØwEJê+çàR—î-´][¾ypÏþŠžºW¤Òø+RéNí{èçLE†õª2_°ÇîMò+R¶½"Õ?ì)Pg£\‘Z~ÅìÐR‹æ?^œ÷Û endstream endobj 1398 0 obj << /Length 1738 /Filter /FlateDecode >> stream xÚåYYoÛF~÷¯à#YTÛ=¹»yKS§uO×ZI`02e(W¤ì¤¿¾³—Ä¥(lj™4h`&¨Ù¹g¾ÙI0ü‘DãD2†4WÉly„íÛõUâξ?"žn„“å·Ó£ož ‘Œ4Ö$™Î»¬¦—É‹ôÙuqÓ–ëlÂKÅ“l¹HO׫«u±\Võ•û◢ΨJ7Å"›P¦ IµÎ^M<:žn… J¨¥¡ÜSS‚š aÐÓ«™+ŽãNÍæº‚Où÷–¡-,1§Âp{ñ '—ðå FBÑäÎ’. žÉùÑïC2 £(ç<|³®nÄ $Il.Q"[Ö3#ù¦X·ûÒ)ÇHa9ŠtÊsDEK¿„„Ø—š+D1Gªd(¬ãÒÚÚÏXŠ1bD&š#,¥£}ñývW ñ@‚ocÚ)“ÍÅ#U$Ô²`á´ÍT(lƒÄÆ{AøtÎ{¦Uõͦõ¶­×…3ÁšsWµ×îé»ã3Gk¬– áÒ½9þõÙéÙɧ™âéÓ3ӦÊzáNÏ|?²½(h(yÒSh¯œJ<]Íj[õY¬>ßWŸõUPŸuÔg‘úàX§AäWËHÎo¹np_õ¥{0ÍÍ>Tþ¿¡wOå›™Ñûº¨¯J”M´féɼ/ÈÎæÕ¼¨ T¬ÈiÚ^Û‚?uk¾o7Ê—Tµ³Ú³NëšlBÒ7ÐÍ}£UÜërYTu‚*»QÂq8ÏÊv³ö"n3! H6%°|2˜Ü[r[g­óNà3„‚:„L7 §ß³Åù%¡ÙhnYåA𷟼•1`‚ŽØ  “ùæ"žÁZ2  «‡LE£ˆõSQ_l1’Î +$áÄÇ™ŒèÁÉ€PñA“ÁaåÄ'%‡J¸\”C\cðñúüäçcWkü9ÊwÆÎ¯¡™"Có=4Ïpl†9•p Bòü1àÌ1‰kXIæQ²hjr`ր܀¤:€©½ .šhâ4ŒÃʺÛÊ"÷Ç)G¡?ç=„h¶Áåᨃ†ûQ[@mÙ0}JVuÕ>µL@œÅís›ñ¥1ÝÇì—˜pgZlæêÆWú<_ùqñn]µ€ú8ν×l0„§íʉ³­ôh”ºc‘ˆÓ@ãŽ<=vbu? X¾\­ÃŒ1€ßÛÛq˜öµpNº·Ä§Å-¸¼C'âcà–a…M·v¸åg!0™9'4›Ù¬lšùf1"¤A- Mù(fxåŒ=ÒFë!-ÛÐn3FÓòݨ¦FFµ¦¸-‡A žûAM}$Pc5¦%b]ÆÀÿúq˜FlfNBˆû1Bš‘ýËù”‰wB3iÎØ—‡eâ³Á²|,kì•òÖøµ¼ÎΙJËÿhQ­cœË¦³ñO ZÊZt3¼ò‡ÝÃFëA+ ™²/TBâc9ŽPÅ‘„Þ õE:TFJCzðtókWój1 “\#Eèg“áL(¸›A”4ÀY.µtÎ)T€²¬Ä»îhϰþ ms˜Ío~ÔŒï}&FíÛ›AWAÍSBúÛìUÝø¥£_}Ý·Ø6?~ì¢b„ÕÅr0)ba‡´«Øˆ/ žÇŵô>Fº&ÒÚ­÷Ao 0JÞRØåp?¬Š×Áåç6«æo·ÛZ_ߨmuïŒw#ó&qM‡ÐÌmY‡ŸEÊòKÁm¢·ƒ”\H¸qHË }ÐoèÀÐ FÉxþq§wÓqÂâ}œÖênrƒæ¾°«cÓæ‹¥yŠëæµ2¤Ÿ ¼Ô(;þ4h»›é!kHFBŒÂ.{|C*mú×é1r„Ó°ìî†ý®Z,BMNvC[»ÞÔvvìʶ ¿5øeEù¦jÚæsÒÿ9ScÌhÀ‰böÐÍhó/ŽÈ0 endstream endobj 1406 0 obj << /Length 1553 /Filter /FlateDecode >> stream xÚíY[OãF~çWøÑ©šéÜ/ûÖn¡eÛªP¥Š]!oâK‰:ÎRþ}ÏxƉm&„w ÚjYaâñùÎmÎ÷yB" ÿHdp¤C†ëh²<Âõ§åMä.Î:"~ÝŽ[+¸<úîDˆˆ`d°!Ñå¬mêr]ÅoçɪJËј1‹7£1ç">+‹›2Y.³üÆÝø-ÉGTÇ›d1SÆ ‰ Æ£—/·è‚ÒÝ´+ïù©ÀO†08êý”š#¸ós=Ïà§ü{k‹P…ˆõbN…µvõGS¸ù.ÂHhÝÖK—, ®ÑÅÑ!LÂ(’œwWeö)+ Rl X)Ñ¢›”ëÔâö ȰF V©DX)·úêd¤Y¼É'UVä#ðOʈd„ öÉ1Óq®ÔÏdy5‚JŸÚkèu Vâ6,a Qaš‡ßc=†i/ãˆrÚ,ºp5«;èo”¶=âQÅšåó$Ÿ.ÒUÀ–;ìoÅ“Ó_íßc›#¹ v6Ù%ÙÕ]»{:c^èþ#jh¿ä\m+Î|T­Š÷²„! Û´` _Ãd“rõVHC_¡uˆè6g¿Z: ËV±H(ü1—ˆã-’@ºG¡[£õ¨à;¬ëà­cHÖþ÷bQÀÌÐñ$©Ò©ûì㈪øn×¢­‚p˜ä †ïÌ,Ï*Ûp­8:Ž)ØbbÛF(*¦ ƒX5’Xôº¢;"3¼æ{L¸ ­f±ªƒKs÷ç¬ð“´L“)Lϰ/Ày"û…ìúB14ˆè9SlªÕ¦rÎ| 'e–|l\ºÍª¹»—§·‹»ýe8;?ý³v²ã`:É9‡ÜÂï/ÞžÖŸzcå²(ÿx|î>M󉃘¶|^Êbé–ï vr¿Ð%±Xmàûèòa;“Ø'·j“XÕNîPmÊݳ’°Ia8¾ ö mµM´{Ô·ðÅϧðs Ø iÀ!<ûÄyЭ²‚}-a-1æÝÿýŸAʘKÞz3™¤ëõl³ðñw‰¢wv,70%cNÁ` Cœ‚ALÐì稞7;¨vã}yÚÜ¡öY®5ûYS&Öd²&3ÐÒPU¡XD=5IÝóšdMRO„ÇýO›¯6Å+ MÏŒ¼aFÕ0#0#ëä*ÈŒ0 üí†;äv1Ê/KŒ6ª-ÙÌhM‘fÆ)fd ä¹âƒP#S ø‡BƒÀznìÀÖ½vÖ@J¤–ˆÖDva}c‡¶©‚Ù(øg"eîõ,[„ßg%…¨Å bæ½ [@è @œ<‡A™@ݤ6¥šiðƒ²íLo [s5E/š¬>0ªÂœl€ÀkRi¨-Tu· æK`D é!LŠ|í§ùÄbÍ“ò0¤n—Æ‚åÉ2Ø]°½"€hØ­Xw^Ç¿ ðÞXï»`b7w*Ûw^oK# ¦çp–?àïÚ[›d³»íiUfUó¼§ébÖgvXV¸{Û ­ìñ]½NÓGŽ¡˜ $«5âÔ<‡\9g°umо7ká”3Ø÷˜ëPÎw[«UÂâ)©Þµ†µ l°ð'$N–öª“V' Ýú,ðJÍ#ïQjãA9V3W‹èK<±êƒ7‚îò¯³ã—t&A­ì léeM15”ôR‡I/Š%¢† "½¬-Œé!ÒkX/½:°ð @Õ $Õ Ú 6)«@P)@FCÀ‚$U?ØjÄH== Ï\Ê@®ÓH¶ý"£ºn Šžúƒl)®^úã˜"m #ÖÏ:>‘È0e¡¢%þö}Û@ö}ÙÐ2¬ÿ ¿pP &cóœ˜(ÆxLI¤”÷³z FD¶šgo{0RŸY=*)P1tïW{ô$ ¸#Ùû4ߨ¢›´êrãîÌcÖùÃÚOnGÐ#²Ï²‘ÔOÒ©Õ<ñ÷æÅb ®­Ý_Õ<í1zs>ä0:9;þ§*“IÕ´0®Æv\¡°êz rFgz5–(f‡Š ëÍ¿Ç{É_ endstream endobj 1414 0 obj << /Length 2129 /Filter /FlateDecode >> stream xÚíZ[oã6~ϯУ]Ô,ïûØb»‹M‚}™ÅVÆÂ8¶+ɤ¿¾ç”,*²c5m±]L0–%òÜøÃïPf …,±41B+ÓdþxEÝÝòCâ/®ÿyŸ œuF~w{õÍJ%ŒK-Knº¢nÉ»É÷Ël[çåt&„˜¨o§3)Õäm¹ùPfÅúƒð¯l=åéd—­¦3.$cFÙôýíOWÿ¸mµ+ÎO4G¾°Ó€‚P04Ø©SI˜ÞÎjYÀ_£ò×Vã†0«Ü`ÉJ{÷ž& xøSB‰Jyòä†>&0€¥pµJn®þ3¤“ N´”±âmY|P«,1b$µZ–ªž¿y= µ>ŽÖÔËY¬5_Ï_jåŒaí(Z93$…ECœ•ÎÙ>V¹Ò„!T8ÈÂ~÷Ã4“Ýz^›õ”MÞ‡™:aŒX¥8Μ‰ÀeÀ7§X×S (ºÃ5½ƒß¿w{íšvµ³”²d#ãªhPe»Ã$á’7ƒn×ðN]<æ_ãdñ…g›ÞO'Y9z ¾™zëM«gh!°.*nªÒÝý®X-Ž­ƒÍIK¶gUg‹†‚h —&ÚZž–>jË€ÄRÌ9^”p˜«<à]¤ã|†Ý%ìù€«P‚ëe®ÊåËf7¹”o›T7}$v’ü:¯we˜üiªù]¦};Xœ›¶4ù©Áœ›ßÀßÙ×6tå‚——g‡¸~à@ QfàŒø÷Ï¡ÎÚ…Eµ›ÏóªzØ­Bâ–a†Då``?­”à‡é(ý Ê’ày[e}ÍnЋ.§õ(Ú9\¦bí%å€Zh+°/E-Ð<ì #µäC[4D›J;~‡Ö‰òú|·· f’œÂný'öhé‰=šd Âi $žÃç„\2 Ü^9Q°eoÒ [¢M¯Õ긯A[XUÖoj°Œ/qc*}Þ~5=<ÌhçâÚuÀiQ”pÆOkgx ý(T%LÒ¦µ3Ô“š[’jÑô3‡á€Õ×ôý9Ô×`à^mk¸…>ÝñáÎ’ü-úšƒð‹ä*€ì;ÜsI—Ù ³¿D—»­=O{ø9%ÚöùfW·CV–™wÄ9õTÔ™¬ó§Õsã½7{ï¥ß$zäÄsD|úóõw³ÃE0*â/@ß[.I´ÐGühº Ñvݧ;()®ziôýYB^†Ž"(Š| Œkã¤ãiî[¢M‡%¹¯!:}ˆ'x¶Ïº£ë…dßY9¾z^À4Þ7« Ï3„» 3Ä h´£‘Î].%”Ñ;$ ¥ªèóÐ2Äf]÷Ū¨;ÐiâŽÌ4å»éâydj_%£ì%£‚¥ÀÇà¢(É4§XsQqåˆ%&Fá¢(‹r~C{ÃE#탯(¸€Y”£U¤PvY¬õ†nG-`Eê"µ0åNáeÀøªâ8 ÐPu çñ`~þ» _¼4$ˆÖqñ:DŽð&|у/|´ïÔg()ÒsÞ`œBŠ/?è'Scv5– Wűƒ~’ ÝÁ“þôJÌ^?ê7ØþmúÿO‰RâÎYúžÙF稟}Ô±]öùl÷è9zc´ü<£{¼7àå&¯›Ƽ#¼9­øBaÝ?º É_á1¼Œé1(Š’)ûc)P:……â1 P¦ù}ÎñŸŸŒ¢6üü$RëÎÖ+/°J|¡üe~“ÑQÛû1 ¾'çô `Ž’vWF-¾Ð¾`ÃD’“Jã$‰f×jÞà ÀÔRyÚ¯&Ô©¿ÿP†cFpHh°ŽÉØ!ÿ)œ7 ú„§siK>æÏÿ§6Ùžp85Y°˜8þ/¿oÂ;ô †Ù¾{í«?w¬³ ûa%-œ!ø}rï0áÕå~? Ž~mu°ì endstream endobj 1423 0 obj << /Length 2194 /Filter /FlateDecode >> stream xÚåYmoÛFþî_ÁTm÷d¿%Žs—K/qeÝAh‰²K¢Ž¢âúßßÌÎ’"iªQjõТH-÷eÞ÷™™8üAƒH)–è8˜­/¸›-ïLþv!ü¾1l·v¾š^|ÿƘ@p–ðDÓE›Ôt| /—é¶ÊÊÑX)šFc­Mx]weº^ç›;ZøgºÉ8ܧ«ÑX*-D(¸}žþãâjÚp7Rž(&îüŠœBÄ,l¬™PšD}µÏWsPðp6’Q¸‰0~Åáýn¿¦Åtãwíp1«è#¯7ø+Âw“WãëÉÛ3š~_TªeZÑ–j™ïhnQ¬VryØÑÒä ~]Òª0‚ßæ~¹ƒa@ѱPL’Ý­rÜgÅz›Vùí*£™‡¼ZâH†·¡ KH÷ %è´ª–ÅþnI [м̜z{®qÞÂhõHÙƒç·Þ®²uæ¼WÛbãÙï<ÿj™uä$°WEÀÐ Á]Q wÍðx,j{ Ä̪š@VíË …Ï—‘1@`ŸÁùüÙŽ·#ÎLd€DëèŽÎÞüý-ü­cí¿MI±$°*aZEFŸ>ó`‹  ÓQðàv®Åd¤`´ n.~Š5 –$Ú‘’\’Þÿüg.™`·ŸÍ²Ýn±_y€È`3t ¨OtÆÒ2]ÓÙA-ó§ò 1‘˜À: ¢/¿‰e£€fZÄ]ºœ…’ÌjP@Hæïõ¶Ì¿ 05 ‹Ô™˜ZÃDlºL °\H°Ò›YGÐ@‚+:ôéÍ(†xÜÌ0:!@>û“0 .Ÿ:‹:*Ò`ÛUèq${¤4¨“Ä htº‡½C„t ZþCz‹uÊZVê^{θi@Ç¥>ÝØÏPŠÐ?%fi•Íiî•z<jKNn˜Ñí[ñ‰A×¼‹pÛL£ÔMr”WwQ¶¶îMþLúêÝcâ$oôôërª\O̳Yù¸­èãj3»ñ¯‘SZVN8‚¨w„y]Ó„Ú¸´~ÎÓ*ÅQB fêL_”´a°Ë<LLî@OZ­©ø]qX“JÂì—ñPFsUÂ2ÝÜeß’¾0¥7ék8w¥žä.-dxpv,}AÎQ6 ×€ÈÏL_Òq¤L;}¡ì>}¡4‡ô…EÀô±Ôª¹€6çMãuˆEW6窧\±”â,\Õ®¯^¾`j%KÌÏÀÔö¾»ú8ýx}E÷Eé˜Én@æ ¸`ÖBèÓo·6Ä™vÂGå0gë È¯cU‰¿pçˆò‘‹’¦ŽùViÃT:Çö9 +HªZ(GJÕJ]N0›¼ž~à@É£ÏÂCTÄ=ÞW“ ÚèÃÄ[ÇÛ×A„3ô¬r ŽçXS2(.zXÐ…åˆCÀEš¯²y«æƒ4C¨Œm Ô<€¾ž1ÌBmbe8Ų<Ÿ”G*êDTd ÄOt]ï –IE ÒWU/áÃiîºЉп\ð˜Bˆ'áË›÷LÐÔ®*÷ oéR}[ƒ›f´;†,VÇ|` ùíK÷`9êrÌ}5Œ–±ý*Vs×;Â'Bü.¿ä€3ØW)¾­±¸ðIîD1^ÓΊC6¼ÇÀ {Xæ„à´Ñ‹aP6×þÌbÂe#—Am±ª,üÒ.Ë<ÁÛ}Õì n-{ô$1uÆox?mñ¼â®a³>Ÿñ“|•y±ßÑD¾Yå:¥ð‰”ø(~SJƒ¸¤ô[jj]&€«ýÜué´‹~½è ƒV‘Ðw„ó! 5€4·|µÉ\°‚K†¬–eýÖ_*HI¨€7v0 ݬA·ÿ@åïÝ™öƒ@}~Ü"0”ézl¨N'áHXÃ|šöã&±sWÄÕanªÝ|ì>{ݦw^y!u_W Åš€ÌÝÖõøSG½û+šõ‰6…;HÓ¸d]”™Ï&±§Úöå<ƒû´òU+a—ön„‰`Ø@m)¾ÐõUac8ˆ¤j°ÓåßÖâb9K‹‹´tý"TÝWƒm¦†¤ íùÛ̆_·7I !”ú”æRõšË㨠£¦…²u¾Ê†¨B¥caæÄVKȲ`D)™±öY½· )©ºfFóFý+0?˜éˆ-OëóÛëó:Fê„À±½Vh׸@×Géüzßéû .•Õ½¾/ßäÕ³û>£Y¢U·=9ùP™è(é) ‰eër(Zg£ô¶V—Þqm“=¬ëÞI´XÚTp‹ênøvD¼,3*jhqŽÒróä‡?Òó¢4Šásõž‘”¬±ýÿõ¼(ñ7²gÁ^ ŒãØ4(Wð½9`®ÃàïúP,ñÃXƯId0¶†ŽZ.žÆ6-à ÎYûÈHw1øÜ¦ñ\Ãùì>«NQ†º¥D2.“.ðÓPXìb€95ñóÒÀWœR œ¦!TÃ÷óY™m±™R®•IÔ©^Ðß©è:)hò,xí7èD Å¿óZüõjÓZü…h·=z¶ÌrÑÓ9ßœ”J«|$Âv»~D2bÑ ÂÕ ÖÙŽlœLôÛDK÷¿ä+ü¼´|¬…íuJ ‰Á–¦O–ž„è>G·âòi=©LNùÝëËñäêz th¤=´ÔMMâ9’|òÏT“x‘†=ƒÏ.N¢¾{+‡o“b»!ÿþ_?þx$Æñ¡×ïªß»²²,JVcßÿbàÇt endstream endobj 1429 0 obj << /Length 1508 /Filter /FlateDecode >> stream xÚíYMsÛ6½ûWðHu*X|çÖæk&vR[·Ôãa$ÚâD"]ŠJÒßAJ„DÙ´ÍÄ9t’‘ Ø· ì>¼EXDñ‹,4çÄ Í×g´~[ÞDþáüíkÆMqà´3ò·ÙÙ/o¤Œ%–ZÍ®»¦f‹èCür™ÜVi9™rÎcùb2BÆïËâ¦LÖë,¿ñ?ü‘ä0ñ6YM¦Àc1£|r9{wöz¶C—Ýt#üÔè''müTFÆ…÷s³Ìðo ùÏÎM˜•õ`ÒYûpI£þø.¢Dˆ¾ÔC×`ŸVÑÅÙ_}˜ŒQB„ÀÕ§ªU®(Œƒ* á’…¨‹"Oìáöq&‰b6š#V3?øÃ›‰áñ6ŸWY‘OX|ÙÌTÃQR‚›9å×[£'õœÏE¶˜àFÈfe¯0Ϋ=ª¢]TÆñÙðvîßTÒÂv‡ ÚA'6 ¤ ÃT ·æpé„Þ­' y¸r!àÊI\gŠ)¾ß¯:gj"î*€"VÙÖÇfoÂ5$–õ;eF":~sÂ$;0îÃ$Ð;ÔºÈDœå·ÛÚUžH'e–|\¥Þù/Yµô¿UÙÜ•Þ'÷‘6¡eùuA¢{ÓSÌ ŽyQ¼J“ÕªÀJ5ñ<©œE¡â2ÝÛržnÜ?uœl6n„Žç“)‹3¶ðãd|Ú#kD&è5fÙl™v~Õ¿ðÝÚ½ÙbnœÑæe^4kšéÛDOn’,÷/“kGE..z°®˜L>ô9†Fü‡e„¶‰ÁOÀ¬FÒbú`ÚŒAÎh@£ 6”¢â†p†‚iu?yÀãÉÃ×öU²ÉÙ‡ ŸÒe¥]y ~‰pôâ!"µB2‘O!·(TšÚÔ` Ñ콂t‰Ø-‡<'…Ï MN¼mGýzñ'aÞÈìȈˆ7U¹W®àËÔ¿¹.‹µŸzÈ>&݉†´užVÛ2÷³1'«mú¢o14Ö‹Víbøy ?$èS)Çq÷³†µ„ã+Ïl q +’³qˆmÁ©1 hË]Ð#Ú8À·’0,¨1ðâ«üM?WaÕâÆðo$ta¸&Jš{i—ƒ$†šç•nÇz²GÉXè«EeþÝIÛHÍEKßE™¶nuX[”‰%è1º'ÄÅÎÖ²aþ&ï=*vË´3HßMΖtÇŽÓ:K@íb³¡å3Í=//æez{›”Õ7mïRtèÉ¡aÙgDP9޲ÃöТLÔ± <‰`pY­£^4Ü|om‡í¡µð#õ‡w¨»×ùü÷W/ÏÓÛ÷ÎŽÛçzD#ðZ–hÕÝ iõpu‡ÙyZàÉ~·ý𭲤ü·°öá—ëÄ¥ÿÑ7ŒY0h"ð˜ƒ[œ-¦Ínµa—µ—]/jp?Æq$öVh#pá”ðcÚŸ6OmR{…_Àe§ô0èöOºîâ\™ˆìI|&(aJÔ¦€ªgÑÂí ·c„#P…YÌ“ œSé×QÐé½'“aØo ¸Ê£X˜èÂcûðæº Ûà=["G.“fo–Åj±9⦆ÏüµX±­út‘—~­ß-—û7éIùvñ®ÆGß© ”®¯PÃxº§ÞŸ^7ò½nÜ˺ÙñyMÛÁ1p,O=‚QôAô Fmíúyà˜ªFÂì€ßÖÊÌ> jÃìªßîg‹]øo~ýø ÒŽqýµIñ¬€ì¸lë´O$ú2Mˆ×~èÚôüõû–”c1—׎–‘jñqD%ȄĤ§Ëd»5äúoÔ†/ÔÔ•~÷ ð¹{M½ó={MH¸ý#ôš  þþ¿×¼³× ÏòîÁÿ]þSámgë´îsú¸åt‰öŠ| endstream endobj 1441 0 obj << /Length 2028 /Filter /FlateDecode >> stream xÚÝY[sÛ6~÷¯à#•©°Äèã¶i·÷lâ}J3F¢lŽeJ•¨¦Î¯ßsP$((QÆL¶³cI‚à¹áœï\L³~hf‹LsN¬0Ùâáªp«»ÛÌß¼üþІ}sØ8ìüçõÕ?¾“2£±…¥ÙõjHêz™½Î¿¹+·mµ›Í9ç¹üz6Bæ/v›Û]ùðP7·þÅ/e3c&?”ëÙœqAiN 1{sýãÕóë#wÉØ…bâÎ95ÈÉI‚9•„ráåÜßÕðÛ±üãH‹2M¨•n³`©½~SdKxùcViXöÎm}È`5p·Î^]ý;Å“rF”1ãö¾Mp• ,ʦá* á’Æ\«fÑÖ‹§ù=þ©Úm¹KÈÁ'J›Iä`°æÈì•ã:ö"Æ1‚gà p {_738EšÒN ÍBÚtl¬È9)¸º>ËAšÈëf{p§ ò?gRåå®.ß®+oÉwu{çßaÐÐÝãŸ*œZݬ6$-p2pQ„k®§¡}àB,$UŒp3D¢9†ÏoÚÚÝ¥ ’³£«Ýx‘÷ífWu’†W‘Nöl¸EÒ¾êtlï*Oíy³¸Žlð/©è9Ü–×§¬ÆÀŽA´Î@ã"<—ZŽ1ž#-p  ð|®Ï#®ÅS^À©$ŠÚ§c©Çƒ›{`ãõÙ °ÞwÄ1Hµ –êK ” J™5D(›Iɉ8µä'A)ļ„˜GRLšK±TÙ0© `úqÄaÌwù¿E1zµßã>ÆTøèt~7Ù#fTKÿc¯1HL˜ü->=ú k@xÚÜ»zW~/¨ØíÛ˜@ÃOß~ó²Úö€Ëeø&4^”Ái0ñʱqXyíý^Ôä1˜cï¯åzW•˰¸õ2oë²­–!%ÖL…/šM°hõW»+-šß—·eÝt˜®‡GYĦ~Yµ‡]À<8E 2*0ô×)7Ѐ€ÅðÓýQ'íNêDž¯v›‡¾@ÙÙãvˆ½<ß„*=²ª[õ}­uä§¡¯U¸š|‘T¡ìà;Ó€½ÓöŽCñÁ¸™„1Ô>ʘ˜ñ¹âÙh€ø“¿nÚÄŸ«˜áô‰är˜WšFgB(€û§ <Ójoá(1&Ÿ€ò§%3¿°bæàÆš ´ádGÚac<­THÆtÒžKÓQp>qI´dÃRyœÇ:»¤3Z9,Q_þò¾ü‰ò×ôåo ø‘òwpT|\ìŠä³/”J^ýëøM‡¤ 8öïŸ\yÉqLZ+27]åõÛOÁ*PðÐz‹j¿_ÖéÔƒ‹t>)÷pè5i1MòáÒCåÉg®!ûD\ëÊ"~¦œ¬øOåÇ: 8¤ i'ž0°œ¡~ˆÂЧå…c%paŽcúY§'®©¾+CMõ,I\HBÍÑCsŽP_%͈Á¾~_%†3¢Ô©ødk¹9#k}ÀV¡°3J ^­58iÂQ ‰>1Í9ÐêÊ‚F“Ÿ¿WÆáÃ`„ÏÓ…™%I‹®Ï¨ýgnR®´Ï>JåMõnýèoËu裥/íaí½«ãwa3|ýP7ýÛ}»óv ¸ØxЗ„5•oáõ¢ÞâÐÝñ*ªÌ‚¤C{ÿR†Ž­òÖ Rõ¸1ðUh’ƒ’¿þç矓¦PDЍTìòí¦Y‡J-£»,Å kb¥ãð9úYÌORà'†~–>TVÔ8J¬ý¡ž!*«$Ðç 7==Wf•;Wfu”nÑípm³J)‡I­Òà Gà {î›&=´à󅀆p±>,}÷m{? :.D@lÎúcÆ8fȽЉÈÑÄô‹wÒ º-~rÖ±ÚU=£²i»«ö]Ôι(º×Ýó0NàãÄß¹®q»ì× Ëž¿|þÂ?”{ECÏ£0…E7TiqŠ ‚Ç d~}W¥F]D3ÅÜ ¯.ø¥ãðîÛ»nã*d|œÐhæ*H¨ ºroÀ.Á‹›}ý¶^ÃÆž.xm¼{‚87ÇE”Hñ| J¹I ØŽæC9ÊÕ-ñpýë¦ q{W¶£°wlÿzÝ‘Ç*ã)G (~H`:¦ÝÖ¥—¶zÀ ˜Ž±¢˜ÂS‰²0ÆFéÕûÔ¥;µJ©IJw$%õ.Ý)è¡Ù4¥;Òü’Ò}®¡t¸Æ¥ûˆ¹ƒ¢ræÖ­mÌ|›Äi½ýœíÂÍ6=;–†MÓ0hîΣ {âð,æ[ö3· €±Õ\.é;‡e‚ä'©06kÜ8œ-¯9> stream xÚÝYY“ÛÆ~ß_GÐŽç>ü–8rÇrbiý$«T Š(ó Z–~½{3ÐKg)YIiK‹ úîþz¦Iá) .cÈp],¶wØ­¶o ÿðìow$ì›ÃÆy´ó/÷w_~#DA02Øâ~“º_/ʯ×Õ¡¯ÛÙœ1VНfsÎEùïvÿ¦­¶Ûf÷Æ¿xZífT—Çj3›SÆ ) ³—÷ßÞ=¹?q”^)¦Ýùœ ädƒ AN©9"Œ{9»u?Ëÿœhª1ÂmæTXj/^âb /¿-0šoÝÖmˆ†§Mñüî‡OÂ(’œ§ŒûŸû WAÁ¢ô6\…FL”ëbÓÔ»#eßÖÕfk%˜z’$1Åœ¤„ôß½øf¦YyÜ-úf¿›‘òeøR„ #µ_ΙÓ+Ê}Óìú¸D¿_9þ1o‰cÞDj°(ü„ŒL¼#ÊÙ°éùRCÁƒ¬¬OØÔ–\LÉU,5eʉ(5ŽSzt  â/‚&4¶•‘%‚¯§d‰F¨†MòÔ3ªÊu2ç‹,q.PÀ‘O³ ˜BRè‘l·j0¸|±B >|4ïë\8¬ É â Â#LH$ñ9¤(UÁ. HÀ€Ò¤:n v3Q#$âZGACrƘ É0 ŠO=“äìR'æ®zqˆçÃÑIÌË_fB–UÛT¯7µ×ámÓ¯ý»¾YØšö³ý¯6»Õå…òœæt”Ð8Iáó¬lT …i”MHR ~êrßøÏ\Ý5ä{û›–»úíæ¬6X„[T}½ôkïë6l„/¡8oHÙõ­¯Õðn±÷Ä«fÖ€-¼^4[¾Ÿj[‡ óB&1Ví–Þ.ý‘‡„§•%úοxí´¨ÇÚá‹ ùSaøþÇï¾ËÚF"Áe\>œ €ô~ç,þ98õ÷‡ãô̱ÒI)ÏD^ÊOà'âÈË{™ ƒ ÓçÜ|†:3HŽEÄF!•OCurž¦F•@é D»¶_å´#˜"%óÅCLЇ¹ƒó=ÑcY`kæeýëbs\ºhpB„è Ê–õ3££ŸíÆ ~ž¡<É$K/º[ÜÂÝê {pÄ$ûÀ×6…ÁRJ¤ÎýÚgË/® ´¶ S.\‚À£Ék- )¬‘ÒB¢{õ&¼Þ,;ÿתÝoýÎ??Ÿ?{òƒ_õ™­]ú¬ô•¶%9©Ë‘åjßn«Þ ÓÔ¼_×ÖMê”ðö¹éìo• 'f¶¾µÏýÚoVå*ô!\r¯¦#ÖÇDíµ§ÞÖ]pÑ®k^7Ø8ÐÕ6„ãݶjm66æÝâ>§Ê²òjWâl_ õ··aíå÷ûa©_Wýðä–xˆm¿)—@F!FÕuõ#¬O8²ôbÕg±Û^à/H£z"MœM¡¦èùÒÌðæ9«˜3NÃñYÝÛÏ /N=Öy_å¤VØÅ3Ž?íü·ÏÿþøÉ4[Rr«B`ƒ!¿³SH“ZA`¸#ÅUè?ÿõϤÌ'vw\,ê®[7Áiû …ÄÓ™Sê ÊUí>×*'ÿÕî[Zœ^Ñíß„ièöc¦™fâ5f¹¨›@™D˜ÉD€C¶h°Æ?úùâÕ!{€¨ Wœ0èC' €@¤ ÝàR mÌcÚc†5R`nKJJþqOPiCë:Õñ°‘cn-¥N«l “©Ý™Ã<ØŒC¸JEÿïzq+[ À ƒ çjk¡3ˆgc."ëÖJ3>é’ý|G³Ê©„&ív$ù_k k³º`’οƒÁ/t¾Ë¬kF‚D©Ð‘¢ŸvûÝ{þ'0`­xЊ]ÖŠ—SWLµšÀŠ1ˆÙfÏ¡Š¸U˜…4Én‚*––Íœ‡aå&\¬$\¯¼:R·-íç/ÅŒf7)é:6àĶué1wF`9¡ÀrŽ~q‰»\ÑÇ+ %=úÎ(va D±q[ Ÿ¿âX fna+n[=6µÕEP’p6&:Á§Ó¹+" •ˆ<ˆJå”òê>KX:›‚C“;Îs·CVŠpVn‡à19:-Óધûüªmãk›Q1/Ö ÑÎ\†x?ÔçÌ!Šc$™œ¨4\tX®?º"ÅãÔs ä‹cNˆìÄM+ïW=Îaìó¹9ŒFXgkCZàá16üv ãhcŽq<†q2Äc¦%D‘ 7Š‘X”Oí…„­^ïÂüBk$1MÓïB[dõ¿o6 §lÚHÚº;ú9I—fÿŽR‡®gì Û¾Ùß÷“ZbתÎï~ï.{Úý> stream xÚÝYYsÛ6~÷¯à#Õ©Pâ"À¼9W›¤iR[3m'Éx‰²8‘D…¤âäßwi’¢,%¦¦c ‹½±êðC½(ðç$Ú›®NÓ›_z¶qöë utc 7(NN~y*¥Gõ&ó&«ÉÌ{ã?ZÄ›2ÉGcι/ŒÆBHÿuž]æñj•®/íÀËx=bÚ߯ËјqA©Oƒpônòüäɤ–.;RM¤ÜÑSžœ ¨Ó3Ô‚P.¬žÅ"…ßJäÇšeŠÐHbÁ$r{ó.ðf0øÜ ˆÔÌ»2¤+¨†ÖÒ;?ù³O&匄B´—Ê©’GÙ0R¥&\ÒŽ¹IþiÄ©‘Ùi°aLf'BuLÞ Ìnâ0…ÄŸ(œŒ”ožŽ4÷·ëi™fëõß¹™¡G)‰¤d8sÌ5DZfNº.GÒ…ô|æ&ù…MÁTDDSVMÈÀI‰šd‚0Qïɦ8á!÷Â0 !Ìï¸N¨ÚsœmÛsmyL)" #ŒA*f¹üäì`M7°°á—U]¦TÍ¢ŠègËmš­ ÃXøS\…‹8¿AL¨æuÙ꺕+ð€nx•ö)4æðÁ¹7†œ¡¤åe;PàÀZySJD{³uÊÉÐó4~¿L¬Wi¹°cejLû€çÅt=ÏH¯RNÒ˜†„qÝX18;ïÍ^M”fÝŠÑWX5Í]Ç+§\6ïSÍ(‹Àòkið8B 5ÓÍOç7˜VرyæÄ(¬0>MßT$3×[+WùA5 ÚòÏ’r›¯íLðµôãå6Eù Ï!°š%”‚ 9µp.ÈÖãÀê‡ÚpÛ»k†pfð›Í»f´kÐ8Ї®1$ôqõ^*A4,ø!ê=ò2«ç`½Dª«÷-©à._}‘âT’F¶ðÒaëî|Y í]m͇)º l‘’’@…·*ºà; N20q8²ì†Ñu—wÊî65{ž’³]“` Dôq!A²êtƒ9´eÎÞøqJ¸f«;SèôPÞoX ŒźµÝ¢ÌÅÐVwÐ#sµ}[:½QKrYUjóJhU󭜖ZO>—y<-[ä®6®÷×M\N)IˆË´'ëé‹ÇÎ’Ík$ŠóãuŸÿü·gðÛ³rC‰§<¡#Â(ûÊDïl!‡#¬4Ô$e•xõÂ… ‚ÀŠítšÅ|»ìÇ ª-Ÿ¯ JÂv·{ß"f‹A¤:°hIm¬…Žd­ˆ†=ú ’#Ø* Ù–\$eÿî ¶ÓLÞD]Ô‚;0%Ch} LñÃgƒì (íì6(F…€ È Ãp—‡ƒQ*®A8„IªGøÔ6©ÏÈ@5>E yÀÿ‡ø„aSרÃwQ§XE™åI XNiXVSdÓ9›ôàÔ9Z%8»fŽÈ ÿ·Í‡ÌRù °ùÀTù*ˆä€W“´)¸Â-;¯g5]×Èh¬õÿÈÊÄ ^ÄeÕcRã?ƒrxçIQÅ$6^ûâ>–yÏÜGò9-Êú¾ª Üû0TÝ/†âbJ¡ÈŠ 1†FÇa(ŒH‚¡È‹qy†"ÕahKêA D²ÃЖäx6û>Z ¾s åU·<è9ENòŽï׎ÐÛ[T!hÛ¢£´/jL zP tLý0Ú«Ð@Ü~:y-íNg³îqNÕ†6r'Pø“žs_Œ‹Ø]Šõ#6YT—ƒ>wsVT·´cm¸Ë6X þSpÇ ªèHwÈ* éýÂ¨Š à wÈ+<ê~q©îZRçY~…ïIq>3Ëw7nŽy{ChÀZȶýJœ›bx' &;s÷<,A^ÐH rÇÉA”÷¡JÝ (û¶Ààtüç.ôu­mBß~Àà¤Óï ýñmï+W¶¼š< õñ¢Áv²ÀÃH¨ü§HùêlD)õÿ2OÏcßéÃߟ IX”!7‡'è‹ígW CRX’u–¯ t±½ÙÚ¶ÂÄr(õ%¾–`ç{äàHËJ·OGM¬·NJÖ’ËÜ>Ó[``*0//é4AhaÜVÚÞ)¾{阅‘9ÛC;’^‚ª¨~TŠ`;Þl–é46K²ælßt Ã]X?âÐ?"É5Øw{‹CG#£ì•êëYã#§Žé*]š—P 2  ö<‰=æõÎô$¶ãõzï2ûû™Õ»­&¸d Pušlƒ²íî–o{ôn‡ã.µ¿Š«XÂG¼,2Ûª]nŽÙE±5¡‡»<°53ø–ä‰j;×Wðe2:Ë?8¶³ìŠà©rû©“Ú¶OáYÚ> stream xÚÕXAOc7¾çWø¸{¨cgƶ„Vb»¥—¶¢À¡-p UhWIAÚþû~ãD+x/[¿M/äBæ™Ïãñ|Ÿí±crÁÅÄâ8âWÄÅœÌÈŽrk).…bFu‰+ .Uë¤ÑqjvœÉZ’ÓÀ3ârh-êrj½²Ë¥õ*®õÒêŠ6ƒ\m`ó›d $Ûgh–X Þ³Â*ÖÕBdj}£ˆmÚB´Øè…l^6|«ÜfV.±áà¹´Ñ <—j3ÈÙÅšlH8 €ðcªÑ\›EލÅ\,¶¾•a™ÓTÅQ¢Ö·ÀR ·"¡\-‘þ¤ê,rŽ4¡/xÖÜ,²Ä³Y𜥦°ðmð\©˜•Á µ6cH[_P-WÁQd̃c„eäÀ.Që“KF,,©ÒÚÔèm}áYŒŽð,–vŽð¬±áÔÑÒŽ¬WŒAM˜*ÂCˆæ„ ‰•¸Âx&Ó˜QÌ‚)6$DÆcRÜÒÏ ‰Ùòhâb¡ˆÁ2±0ÒÅj™g„Èj™gÐĺ顦D‹8eX–y&X%XÄ ÏÕÔÈLNBjm V¶L1;è¬M`µ¬°Âª —P²œÁ€kƒe Ž,щkƒð Cë‹<ˆë‹ ŠRÁ STÍ äfÓž 7/ð·‰kLªÉœ1i Ѽ`™hh™oËÌ´„ù;­ÂÕ˜ëìèh6ÿà.±R+ûÌÍûý,/“°W$tùôéÓõìÝ» …¼5`4¦·(DˆíÿlC1ö…æ§«ÛóÅÚ]ºùé‡7¿X|^»/1\üó÷ÿ¸ùk1›xËõ£ПÍÏ«§‡ÛÅãfŸim?/îîoÞ¯>»Ë€…$s¥k tó€Þ¦ p;BK‡È‹tdhöE*v´¯”ú@¨À+¤ÓbÉû ±$x, ¶O×3R^07•¡ïM—ò˜.¥ýéÒ4®HKò¶Jº@Võ9KH5ù4‡)ø€åz(lå4f+Çock~¼\®àírs\[<ƒa`6?úsݾº_~œÍ߯îïáÚb¸Eô1o›*¶ÓF vco'>N¯E€;n¹ÃzÒr0A c”²¿J €ÈVWéQyαL)z»8t¨æ±ëäƒ)ŠjÓUuºjž@פ…¼h'–ÛÄ} S¤öD=¾ÞÅÅa\ÂÚ%l_¶ìò×ekú[CœPõvîqùö´ë,)°·[Ý¡°Ç¬]v÷f+N¨`‡ »pÔ˜û@\ü5x{‚éWoO2] QöeX7½Þz˜©îÕÄz˜SíT¦Ð5®‡ õqRÅWÉ€!ûJÚrÌÞžx»Àd‡Åðš³ H„J> stream xÚíYÝsÛF÷_¡GªSñ¸ä’½'§I:m’Ijë&½I3Z¤mN$R%©øôß°ÀR$E»n£´yè$c.±X|ì‚Ào!1 àŸ˜%ÁÌ(å':ž­6g¥Ö73\üp&˜oŒ‹ç“åÙ¿ž‡áL~$b¶¼î‹Zf³wÞ÷·é¶ÍëùB)å…ßÍZ‡Þ›ºº©Óͦ(ohâUZÎeìíÒõ|!•™¿_þtölÙi¥|¤™Èyd§;•€¡lgk_(Mv6·üw*ëd i|‘„–YË¥½{Ì2˜üiøa,gw–u3Ãh=»<ûyJ§PÒ´*n?¶ZC ;*O£5Œ}Š¡Ö몾›+á¥u–gÇú¥T¾ÑÑIôK™t;ØéߢÎqìH­}‹!|q½{>•·+WmQ•sá½ç•ÑL? C‰+*†Ã6`†]S”í‚ äSý{ü=¶Þ~`ÝQÐ×-¢ÎF8 ¿aÀŠ’>›ö¥VŽéòž˜‘‰Õ,Šp¡ïž6Ýæ)_5ܼ¡>™D>l EÑ!dìgó {"û{!£ÞNptyû1H=8+¦œ]`HÏpœ"Iž€80Dûk8‡íΚª½Oó0‚h+Ò«uNÆßí-͵Š¿þø'g׊òºòQ('Ñ ù‹Š§9$È,«¸~@RCs6änƒ€DC¡Ë[Þó¹4Þ당Ò{ …w~ñôÙSœ°["LoˆÑʆgc•Áäjر%qÂ[þpI”»Û¼$RJ„ÕºÈmæãåÛ"V HtVÒü‘(”ögA¡sëp`Ï‘Ù:#Î íüÉËgpN"é\±ui™Ñ ÎÛå Z¢¥µ‰ƒÝ$ÒØ8¤]áNîYò’»ñòú'&¼½-v-îŠgkGy28 ­bïÅÓïqxÕÖfK$»Øì¶Û5«@:S­i¸æšéYVçMC»N$pŽxÈ, ”ùS:'Á“ÖŸ/Lx?²H‡ ³ÓuSÁ%šÃ$ÁƒžézMƒ¡Ø†¹šf‡›‹ã«´qꯉk8pÚ† &ÀF3LvÑLæC˜p¾]LDÒv]¬RÚháNÖŸ¬îu›ÀÛ¤.úav…®ÜVöÈ+Ü]äh+šÜÖ8{+Øx¢ÜÿÉá²#OaEV€í*¯ñC1^»f½ímÊö•U9F÷ïd‹ÑAøœëL?×ÒÆEÞîê’–Cš áTw9D÷wSyÒ@õ„ô—6´í (WY׈:úÐÔròâæ8§R!û1¬Ì‹$ñ×[™Ç¡œ bu ‰où t­ „Z1ý Óq)‡Jêä$ú±š&I<Ò? „¨áòË!ð˜¼ý뀎#?„õ'B(JIýúó@CÈ!©¼76WâŸ_~$¼€ä.IÎ7ðD„"%)6=΋¶ª7PôöD¨J7*íäõ¶‡2"v` Æ­3ièÙî‘´ëüD²Ç"U¬ÀÍ…•-ÔJoek„Š@–¡œ^Š›²ª)ÉFrÁqºí—> ôJŸ•¬½·íì\û-iioiË£^Æj¾^3™œÂÁ`צjïÀO(oAÏz‡Â×Ò¨pφž¯_0Gåè€+h˜ÒÃÂË2Ž a ¸ÚñKYµƒ•Ç1b¬Ö}eã£rß±²tõ+ 8ãýò_"u)ÆVƒvÅM'”‚´í–àc¨Šh,ÃyÒ“p (œµQvëtÜhˆÅörZL¿ljwŽ kòß!1­FM ¼:Ç/κ*¹ ‘³vž1€î¥b§øqf> stream xÚÍYmsÛ6þž_¡ÔMÈ#^H‚½ONíörmÚÔVÛ餙 -A¯”¨’”=ý÷·‹]R$EûœŒ.¹i¦ ì »×bÂb–†³D© Õf¶Ü¾µº›ÑàúÛ‚ù|`ô{œ¯/þþMÍD¤a*f‹uÿ¨ÅjöÎûz“í[Í}¥”}5÷µŽ¼·UyWeÛm¾»£…7Ùn.wÈŠ¹/•¡™¿_üëÅÕ¢“IùL5‘ó¿è)„ Ì,6:J“ªM Ú%©WÞ6Y¾Ã±ñ2"íA-ã•u³Ê»"Z“/Qç?ð¶ñÁ °!ò\xhWÇ“´<ÿ˜ûQ$ž˜òà$ÇCMÄ%p“Àh_¨@DdG¹+þ·‚ö·¸…ÇdÊ㕤]©ìŸ[“(œ7Kƒ¾¢Ý*zfÀõÝõ«ö¦þì®@‡:Ðr'""Å;x÷>œ­` ´ t2{pŒÛ™ d¢`TÌn^ü4uQ:4Žb8 h†¯êâfB¤TŽÏ#S&NÓ¡Ì뫟Èà­­ëìÎp›p ðÞ¯@Ñ6ÑUÚTäkt“–ÞïaÚݪɷ֯›¬jpDAËåNÇ1‚´aŒí!/ Ý fÝð ²[¸uº<˜¶ê–×ãEà ®Ø˜aTÊ$Å7Ñ2þu'KŒ0”H(t°Ä¡÷­…ç¿+Àµ#–ë«®~ !½‹Ws_xß_ñYû&/w4ÎySVÔ%íª-zú4\ðF‘÷°GJºo¢á)Õ–Öò†~ñq¹¥[w¼Jþêúà<$v*Оºc`t>ïŸ1|Ô£Wß1tþ ¦.eáƒúÝå×8ÐÞ›‹¹ÑÞo4)ò­36%ó@“uVƒs šöœõ¡9T<Έç$ò€¶ÍÚä|GÁd»Nix`Iÿ¡ q(¾–k "Yû9x(+nè+Þ;xœð&£$‚#z[kÚ»+w~Èfý ETÖÔèEKÀew¼ƒ©-û‹<3¶ží àBP uòÓ4P@ò¥¢0!ÕêMÿN•€ì"Òh%eÔ8OEFv‰ r¨0ÃD5”+” b­ÝQB¥\Çþh&„F<(Ï"42‚ðç*qLX'ò¥”Ág/¥ d*Çò'BEê(ˆã®E¶×òQk–.ï=ïŒiIw¡ÊzHÚ(Ëw‘ŒøN?€‹?ì[c?°ì8ŒÊí ˜XP:(5Ôªeºy$bÀZˆp^?N>²´ äÉ4¤Lá(ˆ%ãBþol‰ìûBÆ=OppX h N=+¦Œõ%Ôh¸¾aëŽ!4„¤;Ò!GÌVû' H±—Uyv[ðk~È›Íc Ÿóº¤ êóуti¦"å³òõ'Õ´vL(F.§‡Ç<çÇý<+ïí7‹K<îãpquIä.Ũê*_Â5M› ÖTa>Ž'”‚¥MÆÜœ‹íަãlìG y§L¶ß( ŸÂi¹¬muïdTË •D7@êÆ²ŽDÙnAve(`š¶ÅŠ&¹;"9òŸ`¤•ÄT[fzØØÝHNYåwù޾Hªåê9a‡Z霱\ªÊù"wS¢žÊgn¾t^7©÷nÒ]Ño´J6—ìNÞ‚Šâoeÿm— O°›1cø€G‡.+^ÝØ¿h„µŠ€9LŸ°"[.í¾ÁOçÆ-0úé³%¦Ï–Ä[Úªý”IX-[ådŠ9×îëL· GÏâìÔ³à8“DÞ¯îNh'øÊNa’8„'S(œC bá½…=ôÏ!~ á("^"1!X‹Œxñ‡öpt„0Ùfí\1[Mò^ÿð ÀH¸Óï__¾¤¥vûÀBçƒ)÷ž‰KË"gŸ0æúùfÁè§²õ`‰ó(r!Ô`kWèŠÒ^‘·Á¥ôú o=Ǩbi‡Ú~yôuò°ë˜LG°KMaß³À.›â0> î³TìO⮳Heà5 îàu?ÇdQ1B$REQHäPƒièC„¥ÿ#è•ïîÑÖG€W¡1ç^ ø ®9‰uŠZ? wQq»£Dh>7î‚IŒåËã.ó‰° t€ˆ©»VXèRáã€ Û ýÄO”6ÿà°–ë0~ÃN‚I¸"àzF?ÃÎ[kþÅŽ.ôòµL½‹~ÙŒ0PñVªòˆ NkèÀ¨bãöjÀD´²Ái|BlHÞ†ÿ3cO©6âTÎyØõ¼hJŸ$ã÷Y]“n‘jVqÿâW%Œbçž¼"¼Ns¢NƒÑ(^ŸFZÈþ³ÑBž RzpÊ\ØS7eAãn™Â ìâë€+î{ é‚Cjew+ëlÃ¥–o³GÛ4èÏG/‡T6›ª<Ümz ;lõ5~‘×m«Ž>Ô6Ù.¯·X#>> 〄CSæøÑìXNa!vãÜÝM@Ã.?ÆÏƒ†[øJžâYJ‹g@óHeh8 fºR=Ñ’S„qùØ“3:Ê´''Ž04ç†Îb´öóõä„ÑŠÍ9zrÂý5R}ÑžÜÿEK.þä–…<,  CX `aØýa ªì+÷G% qRÈ8&$N ¡`iÒw5gô÷W>º­K0¬ ;pâm•yê/AÅ€;UXPSÆ«¼^°È"É´õ¦hÿâƒl®¿µ¥Wæ!PAðÞ놨T·€÷PÈ.œtuÑvF“¸´3 ÷>ÖQã–bí°ŠòþÉJ"ñÞÙ_!ø\SgöPVóå¡È*.¨beׇ‚&ÃöŒál$¼é:yØúÊk°ªûk˜46þ:Fò°Q?YBãÏÑX„ú±€b+zú/Zz¢~v­LnÿUrwî endstream endobj 1483 0 obj << /Length 2079 /Filter /FlateDecode >> stream xÚíZYsÛF~ׯàÛ‚[!sÏä͉µ³Ù6Sûà¸T09±‚Íõ¿ßîéI@P$Uh'©r%ÎÑÓ÷t„Í2ø‡Í\63B¤NÚÙêæ" «ÍÕŒ/ÿyÁ"Ý'”_-/þñR3–¥.sl¶|wÊj¹ž½N¾ÞäÛÎ7ó…"Q_ÎRªäǦ¾jò››¢º¢çÕœÛd——󒱄enþfùíųåAºâüj"å-= è)Ò zj+S&$éÙn ø·ùëã&eNbÉr{ý&›­aóÛY–*Ëgû@z3faTÎ^]ü4%“ žj)‡‚»ënBªâàQ~©Ê¦B±¡Ô¢*º¼}[²Ó©eò,’yÆS®ÅPòe޳†–šÌÌ ø©Ô1u^3·"ÙU«®¨«9KÞÄ“zÆXê”âxr!,„ـѮnáW1ž—àÝËhëe”¬³SÉLé4³¶?ÿK¦²(Æ’É”Kѽº#W¸qß™ÖxŽ]'ÍÁs"åF =7ÇÁ(mt`¥µ>fJ¸-†ðSGp}↘T·Œµ©åîÄV6eë‚ÃDC(K¦F‡cæÀ1\o AØî‚ª2y?W:É›"[zR~_tÚëŠ^úkü¦Õ»:EA X[øøôñÔC)ªYïîb$“=Nò6¶íίi¼kcÕ‘É“W´äÿÎoòêÊ“ðl(w¹‰,{ñý‹å‹'ßáDÿ˜Ê¯h£¨ÖÅ*ï|KÓn“w4ʉv¬"nŠ&¨DqU çzɨ+þn›º«ah“U]~Í“&²æ ¹:˜p ßÁÌ%o󶽂_‹Zâô¨¥-P£CYîÈcÌéÍH1ÜYòd —s[¢ý1tIë›÷¨i#ëàQdˆqÜ«é·ñ¿îŠÆ÷üÀF†¬ýM]µ˜l"¹®jäµ/ýúÊÓR‰!y0 ¦«²ð$ïo-­´~Õ„LÁóAÏ4ÁûïÓ+´Ì:Ï“mÞ¶!Xu³SóKC¾A*jjý­+¾ÊÑ5S¥-Z”mUï‹q+Zõi…ûoC¤=m´¾ë9Ð.9ñCd0ˆ]Ûsõq;_­ý¶ƒ¤¯Z÷4¡õ¶G‰†$‚ÈšÆèòn"³B†â-Š^6ÑËâÔ³xïûlÇIãW1"åº‹ÛÆ·q©¿©!-„3šï 窹`É„Í\hç‘Î%KµIŸFHnøÇAHàåK²¹»%YÙ%‚’ø}(Id<®gÒÛü.”$2›p7r’F}j”$ s,Vù?&kªtæ‘8iT–!1÷CÛGD³¾éL'?¾|¶x‚Ô?/Ÿ?û~I‹¡·èL%Ïÿƒ›æd³‡M-QBÓÄÃï‹uä—¯×f3Sœ£¥Í Õü‰®šS‡¬Ñ‘Z[êZ›cEÆÕ‘MÀ š Q€œüUÞ¬Kß¶DˆÀ÷OjÀ3´Ðܳ¦‰.Œü8Dü9¡sÅŒtÉðÎ*4Aœá½Â €° £F±!Š`7 h .Ê’–ó²­itÀHÐ"7ß…d uCT§ÊÔýŽ¡© °»™r:¸I9…ø§CûG°ñ6­õ¶"Ÿý†6´EF†ƒ`ÿ&Ž㉾Çâi¥ ø¼ùÝÏÁxˆT7å}ЦÊ\Ûg. (s‡›ÇÌEÊ&òYåMSøx ’•"ßô M}C£;í¤óL¹{¤p Àþ&Ø1¿vÀ)wãõ¼3*cÜ##îcÜ3®AçÃ=BBÕvü,¸yéŒ=÷œEjÄ=©û ÁƤƱó\d(øè‘ç‘Î…ƒÀ¤ß}0`‹ûÐg³¿ù™:fÎó}ÈY0ÀÍW©Ðö÷AžªLVLˆ‡Bí€}ÄýЇ;®þTÐÇ>úô›ÝB<·>å´²ª«»ïÿD¥¿·«!H2ŸAÒgô$ýyA’ý )|WÛq’œø>tÀIrø}è18I? 'a?SÒ'!/­á~œt©' ¥B&´ÖìÛÝ"íœ<‹lÎy*ÇoñCuR—ÅêÄt —»óH×m‡ÒWˆÑ6>ü\ÏO¦| ˜I­<¿w9;öÁTËWø~ô‘¾U"~¹ ®¿\®q:…g¸æ©±çoÂêT8Å%»ý4ú(øæ²puÑSç?í—+Ì aä_¾mòˆßOмcõÜà W“^ Bçô'O$彫ãÿ›óêî¯]R¹á „T6¾s»†æXÏ‘pWv2 ço£N $¸ ©ƒðÀw…/3¡›á´_nüøÄå¡-¦aŽJá³Þ¯5_=ÿáçïžâ˜'„‘z'„íÁ¾A᤮‚º0jwE…½¸Ð5»6 cœüëé×-q ý—_´Í“]oi> stream xÚÍÙrÛÈñÝ_Á·€)Á¸6OZIëUlÇŽÅTjËëRAäˆDD0ŽÕêïÓÇà¢@Ûs³)«Œ™žž¾¦§¡˜ùðOÌ)å%:ž-w/|‚–ëÞ¿|!,ž ˆîóûÅ‹¿ü3á{‰ŸˆÙâ~Hj±š}p.6iQ›rî*¥œà»¹«uà¼+óu™îvÙ~Í oÒý\ÆN“nç®TZGþqñ·W‹Ž{ åWЉ˜_SˆØ‹ga¬=¡4‹ZoH† dTó¸É–8ßàT;¯./ªŸý@ØE\1¥áYFÂÿ‚ÿå[ú˜U·B»ëEMà"˜ ‡vÕÙ2­³Üâeˆ¥©¬`ᬺ1a¥E±m·@gW(O¬FeJ–h”5ròf»âé>/wévûÄ3VÑÐçACfO~ö…6Û•7w?r®ïyŸ–%‘[ èX»^ÞÞ°ŽeSÕÆò¯s‹–0½ ÌHÑžÒÆÙ~EHHÃól3»•çE™¡™–hÕ ú.À‰ù`Ó»ôŽJ+ގגºk5µ”A¥I·;÷.­'r :“lþ„.pP¡záÒÆ="üÁ «X8i]›]rǾóæŸ7 Ý Ã8¥ù·Y‚²hõ8tÄŠ,¼_Z,²;@{ëÝ”ÁÙÞ.oè,am›Uõ„¿¬ØåLÅWqŸ×<@_Ïù ºBžjxð€°nÒ’µ!‡þ+ÃÑMñ{xøt‹€Øwé€Ö&%^sk€Ü§wewæª57ìC5¼NÐó#ÉŠük“mG&1#ãÀìW<à[Ñ­Ày³­³PG¿ÀùÊ,³Ú',æ£ÒI"<#ä„B'Ýf+ô ?èyÃYðà>/'ìÎ Í2* nîŸ*†+2Ö›óy¬œŸx‚àÉŸaV쯠ÞÞ%¯#,bf Eè @òÏÑ;9$‹ ¯†C®2<‡ '·ñˆ‡pÈØ!˜l¹4“Bø²4«Ö‚é¶bâÏ«yU¹V~ÚýÌàp´”pÀfÏ(lcØÌ6ÆME1G‡#œ³jÚX.ãhô*†±ìpÛXv =Ø7’q§\³š×³íÖ2Ä’dñþüï7׋«ËÉàñîíë닟܋¯.^]]‚ú‘¶Ò5)±D¾M,0@ßÉ–vRcêŠ  £ .´¥¶ßªjŒ…Ù ‡Ã|LQŒ´}— 8 ç?>Åä>«1¬÷Ù£Ú'à[ó„’LÚM lô‚G!$‹Š Tî<“à/⤋ë0ã“3Ë0‚øåõÍù÷¯¯ÜþXÈö¼ˆ–Gy× rVN\¡L‡ˆËyS¦k2'Ìïšš¤ Ê6ï‚A“•ÓŠÒ#Ä|Ÿ—m䣡=`üì¾óAM¸rLl`·É–LÆÑ ¡xëóQ„•½][_ÇÕÃKCˆ³C*cËžêŒZÑ9“Mé9ºKÄýÐgø’æMÍÚwG"»Èö øž0Bw[p+: ¿hXøØí½©›Ò&, t¿³{GEcä{A‰ÁÖ.mî]ŸÅÀ°«¬R%5„;.ºl¹ØŸ/oͪNKv?0m¯ku©Àº>ŠrºIâ)A-íEQ[‚m²¶¨þÔUËBFžH‚™´Jª—?|ôg+X„Só‚XÎ u7Óž1Œ¶³›ÿàªzÌX(é…Z-¥"ëÒõ×@‚Yåi¸±§À±F\ó‡ ¦‘ö‘œ†i”xI™¦ÕÓú0: S8X-Â1Ó•Ùšµ­ Ç¬e7NžF_ F¢}‹©["Eà©D’÷éÖû>ü€© Ù/)B ç£ÝB'æ%A ÉoU ¶ŠÚ –íÁõX×½GºÍnÓê¶UùÖ ú#|ßó¥jÉ``¹%C4íIÝ!ݹ ”À;¯•S„‡&ÔQgAåÉH-8æ§à¢…ÜTù^Êþrеþ³ÕD "Ã9ì=:ÔY8ã^Y1¥¬+ÑÄA²i)ôÆà QG‘zv ?Eˆ¹â-3èªL§y­NÆm(Ûß眴\$Ëö˶#³È÷Çiêíl*Ìl³aç­G¬ƒdÜÉÃÈ¿àÔ=p^ØbgØVi_µ•>ˆ·¼ÈºbªÅ|Ýï€Z |*j. ‘JËzH»ÃT\¾"¤4TÐã°ë‹p²I»§Óïȧo_¹ç7îåÕë«—Tt-®ðØÂ¾h„1¥­#(Ï(éã°í¬+F©sû% a}ØjóBÚa”pôà€ ÷¶ÿ +£ÏÖ_Ï­ e_j«,Û›=O‡=ÑЬíꢶ«C ÆÚ®¼„ùº}!àiÊzZˆ_ŸxJÕb·«ÐÒûZZ®è:'ÑÁuv½£Í=ë3´6N©£q™TËdàÁpj‘òëšQZn ­;Hë8ÏÖP¥·0r0Ù=4vJ8`we<±â¦Áµ*pkÞL›ž»S8ãÈLςړ܉¬‚š³F‹bÇ\møá—éuŒr/1¢~ßž9­[ù±sX6%ø‘½T¡æqŠmº4;{ê bõäpû À<Ÿ¼øƒçU™øí£É •qÒöÏ.›ý™}Ž©ÂO°ízí_nZ¢q2 Ф …î«:`Ì1æóB@ŸQ&Û—Ñ“ÆÝio3ÂßÐfänZ¹ƒë©Ô —Ї½„²½„žJ“'é%¤†ÇNÒK ­jÞ/÷'áj{‰ׇ¹‚»òTãç©Àg1ÇLœ‚Ê7„þâw©|@€§ÂL–€ŠTœ¤à•aäùqU|í7¼2Ð~h"åkñµo˜<«xÇt±âíô8ë</£’%¼Ž= ýÈ 4Rài Ší±FŸÑGŒô1Çš «/×ð±ðâø.âŸIe9ŠzÃéþDOv‰¡§Âø@>[½ÙÃä7*ݽ‰ÙºÚ>qA‰>âÁ¨pÁ¨B={g ©ŒÕõh»c„€0Çž¨ßè+ã`$ YR‘‹xÊ.¶)’aâ…€9JW¿B"_ÖG5˜JÔjN?ÁÚÓ±7£¾™Â(µðÖþsµ_B;òÞï¸ø¢ú鳉Mžö íæÇkø›ŽH Jù†#Á€”$š(…m|~ûÊ:x›O5>ûã/°÷Ív:%Š˜épNÔ_—1Ÿ C§È‰F⋯ȉ'ájsâˆë±œxpv>¸¶>‰ø¬äÇÉXŠû´šŒ~øZE‘’2qøM™XÉÛ£Ùø¶à÷ƒ~ì…'y‚BJZäÔÿÑ ÔgB­$™ÿE¨Åƒÿžõá½ endstream endobj 1499 0 obj << /Length 1909 /Filter /FlateDecode >> stream xÚÝY[sã¶}÷¯à#Õ©PâF€yk6N›¤ÙØêCg³³£•h‹cYR(:›ý÷=^EÅššYg2»3$!à»ãœ0üãQ–DFJ–)­¯7ZÞGþåæW<Ì›câ¼3óëÅÕß¾Õ:â Ë’ŒG‹»®¨Å:z¿Ù,U^ÎæRÊX5›+¥ã·åþ¾\>>»{ÿÿ—»™°ñÓr;› ©89ç³÷‹ï¯®v-Ä…fÒÌS;M×NÎ-³QjãRySoòê©ÜÁ •Æ¿Ìt/·OùWdÅÐIƒ×Ì@WgÝÑ/Ìw«òó¡*öAPE~}>À-ç~hGOóã±™÷@óòÏþ£¨«™0á·Êý”è¤Ì—Ûm˜{½[ýðÍ››ü0'Ká¶·mÎ%ãÚø–Ö/Ë Kù_}À÷.#*žóð½óϼ,÷%ó>ø,Y§Ég8€€Í…FÀ„—{Üø_§éç&þ\Æ3¥*e\IÊÀ»÷I´ÆßG ÓVDŸÜÔÇH1Å-Þ¶ÑíÕ>O}µPÆR¥ K3«ƒâê¡Ѫ$¦Ñª-“š÷µ>Ì$GŠ*zPFéëÔ ‘d0x+×,±YߊÃXA Øk-*_(f¥ô3ß};³2~Ú­\5òø}X™¢øY¦I Ò*-¶ISËÅe¦…¹ý€Hx€ÏŸù‡ 9MzûH§°ÑÖë©:ƒš¬;M1`„I·gêF:Á™Ðj:ešÈI&ŒìG®¯NÀ©Ô¤NT³¶j\‘ÿ%8"ºi' ¡À†b 3DVO [©pÐUIqêLf•žÂ#™"³(ž¾GcŽfM“œ27–7É™„¸6m|Ìalzͤ=8iƒÓ«AŽz6MpÒ+çðTy¨ñZËÛÜGîSQmüoèlè\\ïölÔ(Ò(â†É”×~öpvl‹¤˜=4¯‡ÖdGWJÈï1æž-[Ë‘eðS–0sºåŸÉrßH„›²G¢tbÇ|cæyjXbQø&Õ‚Ua°âI\ÜÑ“·Üâwþ9äër }7Üò–¦ bŽþ¹:Ždž‰óUñSÂU¾Ñ< ÂBò* uV'µ—Ù@¦ÔåÑcö¤“†Õ!%¨« Ï»Ÿ;Öîö»yâ«„\”~´¥m¯í<©fåâåˆö.TUp£—£ßߪÇqZÎ2&1䉙_FÌ2xNAÌ$K'êbžDk æžÖíòX•ùÏ«±ŒJph ¼|13VÅcþá”ûºܘZ„ˆOÙ@êd¤2 fú"rÌR&@c$*5üw%ÇsîHcY‚üMàhŒI7Ûr„ú.IíÆ\,8G”†¥Ú>K”ÛÁ(Ó°?SBSGc3¤!¤Rv ”6«wV 1Är7´÷O|òø× Ûª\®è^Q?Ç¥4él] {6hdU*˜ÌÔK¸T"–'ŠëlÔy†Ø'&¾f÷,XxûÏïðÿÔ0°©Â0H’T±]ÃþuC´øïÛëÝh#3žN¢md¦å@÷ßo#Z3…ÊŸFk ÌZo®üÏõí"ô3½¿Å”^©^ÿZ¡†B•¿©7ÀcØ«}YæG÷»us™@…HÏûâ·K—6õ{ÒJø!ÇÃÛõ€Ê7y‡Ó›vé7~ß!²¬í;Î5‰à'M-$Ÿ“$øLtØ01º¼C9ã~«U˪À»kßÑLo9N; ú¹F’8×kq[¼¬ ½±/è–€&s9NŠDc¿Â(t©yQ﫱_5Î$JÉÐûV5à¢BP¿÷vΧº¬Ä1¥ÒIz"’ŵ¾ 'šDkè‰zZ—OÕfUçìK7E僮Ȃ¸™¨+²LáTG§cÝø’6"è(S'J qiWÔ)²¸‹J”ÏŸ³EíúUÏÙãíB‹ÁÆ:<2YÁÅ`Œ; 65 a€JÂÝ“„¥Y· `m“xQOla›ýv}Hj%|ÚÛGÎ hïËâ¾ØÑ¥2}‘ ¹ÇÏbµì+÷ÞüÿyØ.W5èo–UMÍ%6ü}ÚVõ‰­% ÂÆøKQO2\M[äUÇcUm òݺ·ê¼#œ>z…úŸiIŽY í$ZÒö´«eY½ÔµÁ‡#äê¬Ïa-ZVœpÒHhðô ¡Ö¢ÉN’”úÿ?€ž"m{=µR»#Æ«žÔžÃZ­ÜnÖ²ÞÍ8ÁZTνÿÉÁ­®74V¹²h—v°6ÑkÛaÿ±¡&ÒÃm+©AÈÜ–yop{òç* éöå*þèo »Ü¡ïv¦ïÍÑþ\=” Ëh_¿ô àkÃë…,Ý +Ã'W’Å/A×I”tí*Eä^ Zûºÿ«=®„ ØW{$JbáFV…ýC7±Ö¸}l›>î–jOjà+½û¿e4ý¬ ý,¦ú-mmgKc´…×§æE=§…WÌ©[Y¶ ëj v[ùEàº?ø·þŒßÜœ+Ö.€¤ó?’ S$ endstream endobj 1508 0 obj << /Length 1810 /Filter /FlateDecode >> stream xÚÍZÛrÛ6}÷Wð‘êT(î—<Öq:MÛ7ñ[’Ñ0mq"‘ EÛñßwq¡LP´­TtâI&âس ,ÎÁ‚! †?$18QŒ!Ãu2_Ÿ`÷´¾JüÅ»?NHh7…†ÓNËß/N~{#DB02Øäâ²kêb‘|HO—Ù¦ÉëÉ”1–ŠW“)ç"=¯««:[¯‹òÊ¿ø'+'T§×Ùj2¥Œ’B'Ÿ.Þžœ]ìÐ¥ºi[îù©ÀO†08ü”š#¸÷s»,ào ùug‹P…ˆ®1§ÂZûð ' xù6ÁHhšÜº¦ë W«äýÉ¿C˜„Q$9›/ͪ 0¢tT¡$F­ó2¿À5 I1N´3Dp?Úbµš[Ü~ÞP…‘–2éG¦Ïµþðf¢Yz]Λ¢*'$ýzÊ„d„ ¶ç”i˜h®„u>k&"Lê †xæžuà%î­ßÙøˆP¦ÛŠ#ÊYÛèýÃÀ7 H‰‘›½1„'í2D‹‡0ÆcD ,´3%½O·h~ ÐîhPÙ Ÿ[ûÁ"MM'X2ì”r è*™Â¤H Ød<}ÒAíLºeÎÓ¢Ü\;_yz32Íê"û¼Ê½÷·E³ôïšbnÿûOb+ÊË Y @Ó~ä½gßš:›Û¦\¥§öGºy÷æU]çÛ 0‰N«rQØÌ¹ò¯š*ü.sßË¥ÅÔ¦…ñž¯Ð<½XæÑcßgY­Ûž{ôÛe^çÎsF. Ü2îÂUq¸Û¦Úø«ÏÎí<0c;p«bá__VJý;Ù … QÝ Áñˆ½Ë›ëºô]Á¤€n×ù«¡™„u(”lgÒ÷Ûúާí|­óv–l@ï›:o2·HÝóê2´lcކÙw˜úHL#ScƒG–LK O±µPÖ–…­…RÈhu[‚Ø:B½™Hê“`[àÍq @ .#èl ^Š ¢tP Ë[*Ñe›aû°œ ªq`¹AFÊv3(L”# 2v´0å¾*ÝØIeÍÌ©Öf¬ s2r€4ѧ¥I!jt" úQÂD bL8CLŠÿ/L±ÙX˜~mùr($«ž:>àMX/”¡Ò÷WV·GH+à )J~®´îy"á(+Û÷vpe`Øçˆžc­8p¯µ€ç8d2`.]J ¥­bޥܛÊ*usÈÏ\üw3ëÉ %QÄÅ8Ÿ` ¬M»§¶»þcŽ< ‹ (–5…ÖÓ›7þ}æ×ó Ý)•–ê•›—ËA‚½ìé³ʼnü©ü>x²Ò£û6ÆÞçSÄ ïydKîUÞ’b¹h©BQ^ö> ÜÖES”WAi¼Åú¼Þ{P)í1‰ýYÚÝóõ:+ýmg ¸¿ƒ\ßæ¾[8é·ÏíI¿ýubb/¼(ÔEu½õZvr7á;JxU”½ÎýSßE`ðeµºø¨rVÎÿz}ú.ßœÛ.YÝ<¼-¦)c¾o[L¶î:aM1sȡĠA&"ÐÇÈš€Œ¢ÆÀ¦˜»õ×Ã~Œ«Õùî„}l®~Š£‰&0×|œóuˆ]qéòrGƒÞ*wÐ\wÎý9šs'ºxn¦…‘—GÎýÓˆ—ÁÎî0»ÝòÛÿãØÙPmÙÙß9v¶g¾Cß‹ÝÙRß ……PP›ãÿÒãŠ| endstream endobj 1518 0 obj << /Length 1095 /Filter /FlateDecode >> stream xÚ¥Vßs›8~Ï_á·Ã3Eü2dæhâärm“‡Ÿ&\!Úñåò¿WÒ ÎIçÆ3–vWß~»ÚYâ‡G¡5š8ŽºÁ(ÝœXj•­G0¹½:ÁZ AÔ‘ü˜œ|¸ô¼¶ÌÐ ñ(YuM%Ùhaœ?-§lŒÇ1¼³1r]ψYµfd³ÉË5l|!åØŒ†cd;.ÆÆÎx™üy2Mö§{¶ýN˜RòΉÀ階ëÛ§¸&v\À陓1ò|ÛˆÆskâ—ãÐ1š2åyUÖΡ·‚šØÖÎ&T(úž5ü*—xž©ësʾç©úÛò¬h.þ1|çµ}£©i+¼‚qM9Lˆ¶“—9Ï%YJ*OåIò¯ljàV˜£æÚ®9¡±“UÃ`};Æ©¥·õµÁ2Sú¨œrLìu}1ZUEQIÁR'Ú=×È‹¢©9#œÖ Ê[hŽn§_AŠ”Yg1nç3ÃTXhRÞ0Z›šjÿ€jÛ2[Ç !á“í·ô[CkbQ;`û¦cÙ Ú‚–qvö;È~º8ß/OØzî©bPí ]Ï’éÕôöŒ“uÙlžE.ÛVÇâ"ŠãÏ×çQr}3ƒ\ÂÇ|úõn:;Ÿjcê8×3h¾õ™Û糧ïÓ ¬uõÉð!óÆƒ´ÑN«q•³–q.LdJ)hxy ³²Ò2 kÙꟄ}S¯ßm©vraÿðQÂé›i½!áD“¿p¹¸¹„1ŽÐE”Dz1–´Æ()6-®6nÕâk}²ÔQö›N@¶×±†ñFE]Á,-rZòVñ×1×].·¹ŠÇŠUÂm,Ò»›\”ÝSVÕI~Ü„ÆÁEYÜÛðl g6Ï_Ðû¿x2˜(«2Ý›˜hw×%wìÁ#)ÜsŽÞPe¤_v¦eÊv*³iæÍÄlºetEUPUš²L>ŽÄì,-¢–­fHÄ¡FüGUóèeóÍøˆ£}ºbù?ªE#¨T2bâ¶WûG³‹¶Žé€Ç´'}›QמT<ù Ì<Òhõ(¹š‹&&5¥àk±G`ÓŽ®ûÿÕm’€"‡ìÀôÿ°þ °#ÈöM+û¢‚í\úB $ž”ËAøh¦$Jz jõ+òPA¶;ü¶-`ýwú{<Üßã¶¿ãÓ}8#ÁÙ6&Œë¥'MfwëùHˆŸÀ¢‡MÏõúÊ{‘T:.çÙ'º»«ÉšÖÏšäÿó´@âE»OÏ×/ ëèËbåá“¿óI ßð?7æ(¼ endstream endobj 1521 0 obj << /Length 1615 /Filter /FlateDecode >> stream xÚÍWÝSœH÷¯à‘½ “ù„Áª{Øó#ñôԸ등RÈŽ.6ÀÆx©üï×à £F®bEúã×ÓÝ¿nˆƒáqB쌡K'^máú´¸qÌÃÙ»-bå<ô:’Í·Þî áŒBg~Ý55_8îÎ2ZWª˜xŒ1WlO<Î…{Zä7E´Z%ÙyñO”M¨t7Q:ñ(ㄸ„ðÉåüï­½yë]PúD˜Zògœ~'aI"_rD7`×Ñ"ª¢ è ì^ÐËúÉí}8ß;ÞÙ3ì›ß§Sow:ŸÚÃÓùÁÉñôèÆ <ÂÆh\¨(]5F™5z¦ûâÄÊgÑJP÷‚[ñÓ"Éâd¥ÇðrT­JâϪjÜ«7¯OÇ`©,öÖQœbÐð­Æ^w²Ånsî÷ùÝZÍsûæ9bØ‚™éìL­Ok甀óíí?Ñ‹éééÑÁÎTߦ9¡â×áîN£×µK[»¸¿Öp?‡ßkýbc㳺›x¾ÔHpÿ>’<ƒˆGo>ÊÊ+Ô—æ&‰Õ<‚ó3õeT'˳¸MrShçYÅèX²—§¾­“"Ò@ 8Ü­¥CU\©"/çI]8Ö£õ}F7å°ÀL¡ìëW£JѦZVµ}¤ñ=†¼¬ F‘ùÚ¡ÿ{ U¶°îàQ÷V¯P™ºõª$faDßš|&G¯‹ÃG»¸ìv1ÁOnã8Z,ŠV¯)¥÷yYMá…*KUöÁ>Ò}o÷àg†0Ÿæ=Ý4ù¸ k™ÀOô_Z %4@$ 0 $zq‰¼ÈHHêÜÖ¢+‡#ž±“:³­†jû. £Èç¼¶E‰¥Ú¨4èúÓ¨1ê×öèÅþD2w“Åuí÷ÒjŸ Aµ¦Ç$Ð}8j$3ThüÔ¸óq× æ²ÑùMeM‡])Ž(§ÐÌ\X=µþ°6iD@Öˆ/£l‘ª1«,@¾h}¿1g¤ƒ†>¤#€ûßœ ÓÁƒ6ÌzïdcàC`à1(™Ë6&¢Ñ B6Pǯ’P$ë\% Ú£Ìêw µwIýz ˆ€´µZo¼©YÌÕ|D”¦9  ½cÌœ]MhàÞÝN8—ˆù¼ñaë%É’J×C'°ªþ>\4«à°€0ˆÕG’ý²îá‘â`ç2O¥ s ñnžd:Œvªró.½3‚;tÈ}øæô¡²bÄv9 „yù̲d êži“PV”õ˪¬ŠM\m … [QLas3–Š¦Ý´ÙL¶ñ™8¦3s ¾Åz]„äߨ¿N„ïFE]¥ªÉFÐŇûi8S'3Ö@WÀÅmÜÜöh²ð€ÒpWÕF6{?# ëCÏ*!R¾äfi-òÚ””qrhü'1aæ ÊMÃ|¸Þ¤hŒø="ÃÿþÓøŸ Óû¯ÁÿÚ–Ïe·NÝ|h˜Wq*(<Ó¾ÓEž=@3É@¾|ì|Í“Å`î|ºw:dLŽì?eú°Áôù¹Ü€Ä(L ß<°:¼d>P¸8ªË L1Nóat<è¯2ˆ/‘`t°z>2[¢1-Q-£Êo¹Z&»Î‹•]¤k–¹ªi'ßXYÃ2¼Ï25oYŸ=&ÙUQŸ¸¸ôaë,óMë]Ë"(­DbF’–¹Mª¥y­ê“®C4mîÎ!áæe¹Ì7éÂ(ÀÖW þ›vÌÕÏÕR.òëušÄðo—Ê>%• <³s%ÍHÑp°¥¼:Xª“-Skg¿¤hfGõ87Q‰äóSâÃÆ ýýĤmù˜…µHüÎnü3;IØ àƒÝXÐðEì$Cˆ‘Õ¦4K½";ÑÇ—W¬·ðÞgáÿ”›,ºwªU;F¤iPïlïÃ`/3^ùêa7ÏY«`¼_«Fw* zÝÃJ+Ö\BuoàÛ½0„©ÏäúÕ:ª}Öÿé õ™ß³ ãÐÝ8àS fœ›æÕñù‘ý†¶zl™\[úË-7Þ5ëûkò®ß6mª(rKœ–øc¸åjzã?a.Bö endstream endobj 1528 0 obj << /Length 1760 /Filter /FlateDecode >> stream xÚÕYßsÔ6~Ï_áGÓSõÓ’x£-P(¥!IŸ€aœ;]ÎÓ;;Ø>(ý뻲dÇrœ»ƒ† ÑØÒ~»«Õ·ŸaøG"#ÉÒ\E‹í nž–W‘œ==!~Þ&Î{3¹8ùù‰ÁHcM¢‹UßÔÅ2zÿºN¯kSÎæŒ±X<œÍ9ñiY\•év›åWîÅŸi>£*Þ¥›Ùœ2NHLˆ˜½½x~òø¢C”é¦yËO ~2„ÁQïg¢8"Œ;?«u?-äûΡ-šÉœ kíõ[-áåó#¡hô±™º`Q0ÚDç'¯Æ0 £(á<N«PžÀD6 ¨ 0¦!hiÞ J†F¦A•a‚^î²ÍÒÂk†jޔ޿T !´›üúÉL±x—/ê¬Èg$~ë&!H AíÂ9S°ÇiÖdy=ƒ½~3ߥÕ;ô]7Á}\Â5R„¶Ëß`=ŠîOãˆònÒùuB!y,- lsÇe—:†`j˜ºŽJ‰xcG@NÛiŽÉí'RÄ•hýsåt+R ™e½@ÉX s¢m(0D -†{CŠ»Ì7çšÇU]îõ®4Ö]×ë´vޝ‹ÍÒÇ嫢ܦͶ6ÒK8ó*.v~î£s·Úü»°œ°Nó+c=¯æœ(¨-éO휢ª²ËÍ'·¾4Ûٜą}ñÁþgÜó]^™Ú™~ƒ 7Gvß ºB?ùõu¶56EÈÇ-ûqãþÌ@¸>3!ât³3P®Çr&q³¥¸¿Ôûpþû3ø)«DÂFË(Áv™f]…§LBÍhÞ˜¢¾°þúÃo d„¹ÜT»ÅÂTÕj·ññ‡¢wfìiUíi=ÄžÎiü1{Z[L“Ãì9 ¨gÏt/{N‚êØ3µÅû¹óC‘-ÇȳƒR'C‚‰c¨“¤N¨q{ PNäý¸“ B¡F„DŠÑcÙ“Ù3´²§§‰»¢aœBË›$…Lä­hr2·ënñE:Ü8FSô`' ¶Šñ}v‚Û}k¤1ô2081p`”øëf;_ ‡^ÕEiZOÝ«GçÈu"oÃz¥{n¼ÛõÚ´Óçg_õMt/ǃg\ ŠÂÓ­:Žn¹¢H3= ÝZ[I«æ÷Ñí$ žnнt; ª£Ût w–o/U;ÔÛ2 -[O#T ¤Â(»Û& X`Ma¥¿X«Á¶pF$œ|0jœ Dn¨Í²È˜u8LT¬WÙf„É•BLÈ)2Å4…NÎÂLÕ{E’^±@(“²¹DpQ8Èæ („Rò³ùÍn†Þ Тbà-̽Þy¥Ÿ–ejÑüÝàcV¯Ý(7Ý…æl6@ùP_‹´6K÷ì·ÇgnžÉEDzûXQ¬Ú€,½£ñœcAƒèoãUP¢‡I‡¹WÎ[ÞAÞ„ÆÂÐx/´ÏôÈÌÁ wF$±·';CXÑ>¤ƒÐ“`K Æ(9†aÄQ–tlX9³·vž]¶1¸^»™$^yºµX‘8Íýì¬vï[‹®Ý 4Õµ«GKÑ• *»„Q¶%€øÉ_1t 1¸·I[€îSÖJXï´jœög¡þžîŽ ”h"éwGkŠ3õm/ ”ˆ’“ˆkJH}XÌLéµL€¹WËLê¤L€éEÅ 80A˜ª)0)N ˜dz×uj’C#üŠêÎ+k=8Óˆ(üN’ˆa+ÌĽD”Ò#kLa:¥†¢û5Ô˜m¦‘¤ž¸ÑÀ_*¡8¾³õxÿ]½xP8ú3+”®| –f›fyµW¨¨o+T ÙƒøbSkŠ’N¨£FŽü¶BPË‚L"G¬-PÁÕÈ$˜^Žô1Ks=¶… Ô¹’H¾¼GŸ·­9'·{õõ·êÑ„s„Ù$=Ú~õVSþI ®ˆþ.ÛÎxŸyjºe/é}=m?«ö\Š+‹íÁ¢Ç]£0·ì”4ìt5a=BM˜{vÅ–&s6\º'ó0¾Nßþ±tÚÄ ÏV%‡&ˆ¾&Ì;îµÑX&Ç:.J÷êåß/^¸þ|”øö endstream endobj 1538 0 obj << /Length 1908 /Filter /FlateDecode >> stream xÚÕY[sÓF~ϯÐ[åÞî}W¼…6´´´M“ô F±•XƒcI&¥¿¾g/’µ²|!ˆB†Ìx‘ΞïÜö\´$ÂðD Žc(á:šÜ`û´¸ÜââçâéÆ@8nQ>»:ùá¹Á(Á ‰®nÚ¬®¦Ñ«øÇYºª²b4fŒÅâéh̹ˆÏ‹åm‘ÞÝå‹[÷â÷t1¢:^§óј2NHLˆ½¹úõäìªA”)¦¡Ü’Sœ aÔË)5G„q'g9Ëᯆ|ßð"T!’KÌ©0Ü^½ÁÑ^þa$4î-é]DÃj]žüÕ‡IE’ó8-{@¹B6 ¨ °¦!h‘­zPG˜ªÄu‚®Š%x›Ä“¬´:wC‡&ÀWƒû(EJùM¯ž4‹×‹I•/#¿ñ;eDJ„ fç˜iðµ‰ìž|Q „wêÛ´| ¿ü ´Ämh")bRÔ ^c=NÒ&ãˆrZ]JˆŒ¤$H$[väª1#CT±ÐŒ!Õ èÈ,+&›x±Gæ{¯m,Çu£FZö)A(2Ôžæ‰ã¶K&a£D°/Â8Tæ9õÙG#ß¡‘FJëZÚw@Û§’Fš&•&ËEYj(E‘Æ*CˆAÙÄ`ÏÒb8d,IÍw•–åý²˜öÀˆÒŠÒ'ç˜`!p¤ã¥à0À’â&¢mÞäqYëIµ.2's5K+§ël9Ÿú¸È7Ëâ.µÇÅ>H¯!§êx¹ö´§—nwö·Àâ6Û!¬aLRP‡õI,Q’ˆŽÄë2+¾+`½γw¼ºUµôB-&ÅÇ•—´šenáŸÖÄ«´¨ùò¦Cyz9¾8;7¨_''¤Ó‰´üjdk|*Æ!·¾G±6ƒŽf<νˆ­P'ùüýò%r1êQÉÎMÆ„m6miÂâEvoÜx‘ÄãјÄg°:wOÓÅÔÑ•YåU^V½B Þ·ñf(­è)z@»Zû •EjÐüÜyŸÃ(fW0HÎëÙk>_Ú9m’VõÔúÓÙESûÜ :m>ÖÖUïà¬-¶k_Û•ÝÔ‚dÒ5<ÐÞ:‰7Åv£ Õã-õ ?$5'B °c„IÍHAjt¶Õ—a i”°íÓ* ÇhóɰÀyË!ðìºVÖÕ¬¦¼të¯9ÊXoix›Wþ×RcߦÀƒ"+W.8e~ÏpÃÌãZ0K:‡f²Õ_óë¦iš‹ã6ƒ´‡a  £aDAÕu4츎†&ʽ¤£15\‰#æíA@}G€îëhõMj¾ˆìhÄÃ;šË|Ú×Ò4¸Ýq›!ÁŽºq`‡[¨ªZEæ37%ŸwãQN(wÑ®íhø 7EÐï ¡ ƒ@†°ê(³ ½zp³m£‡Ñ­†ƒ ¦é“6CRŠGÜp´,Ð90ÌÞ×;Q—¾¥¬–EV ê^^ÖuÖ²à.³pèæuymqæìmÕúÓ-t~ús-æHâanz /Fޏé´Îµmн¹vÐ:×¶Aý×ÉR˜ nö¨K¤µ Qwex›ùçgøÝ3ëÎ$ÿ®•Mÿ`Fﮕ +Á’/y¯Ü™[{/YHÍ ·ùððб•Cã±ÂPtÂpŒCU}JØ+fÊHpúì›[°IEqÙñÉL†²{£š/O­~¬ãíiÌO¬§çnã{¦QÉ·ÄÛ=JŽ˜F©?m­¿%×R·gPb¿TlÍ 0M³f¿{ÐI3:™»_&À홹“­ÜÓ|Ô,­'á×zRÕEs,pbïkC7-ã›4Ÿ—æÀÉz€ìàÚâ ¿æeû–× ïâ‡5¨ !k£"»KóEù-Цž1=Ĥœ(fõ ˆjÈÿ®=~ endstream endobj 1547 0 obj << /Length 1843 /Filter /FlateDecode >> stream xÚÕY[sÓF~ϯУÌà­ö¦ÕòVZ  m’>“¶{âÈA–Cé¯ï·ËZ[Ž¢˜ÉÆ>{®»ßùö„F þÑH'‘âœh‘E£«£Ä~Z]Dnqüâˆz¹!‡-ɧ§G?=—2¢ щ¦Ñéy[Õé8zÿ2ɯë¢ 9ç±|2 !ã?«ùE•_]MË ÷Åy9`Y¼Ìgƒ!ã‚Ò˜R5øpúòèÙic]2v ›FrËO?9Ià¨÷3Í¡\8?“)þ¯L~jtQ¦ÕÒ &¶w’hŒ/_F ‘‹>[Ñ«4ÃjýÕe“rFR!BÃù¢Ã¨H!Èû1*Ö,4zY}Dâi\TÕ¼2ö7ËÈ%™Ê"TƒdBº]ïž2/ËQ=—ð;ÓˆR¢¥dfçgÈ»‚KvωÍëY¾(éu‘>Ñøà N´ì§IÛ>Õœ(ÑhyŸÈÄÓm1A˜`¡©ílrªÓY”¦H›Ù„•U29aŠ‡É í™´p.­*–馂ö?ò°v:#"“+]±·‚eÄH¯c¥]±¢ŠH…“êRICaù°dI“={ëD¼¨«å¨^V…qWÄõ$¯ã“ùlìc˜–çóê*·¶ä8(¸™ó¥—ýùÄí.þ™;ÉË‹Âx¯œÍ!M G­åE³í ¡nç«ã§ÃgÇÇf÷Ûc÷í†gç8[ÕüÊýâ òÀ ñ1«vÌIhú¸€B„TñÍ@Ê8Ÿ-¡·xÒ•/…²"ÛI{ëÂí­'Æ+™ÅU1*¦7Ƈbì¾ÚŒB×¹õòÒŠÕNìÜÅ‚o½.å‚ÂÏvPñQ*bw_Î¥ Øoþ~ýÚ×éÜe§œûi,š| ý/s¾¹¯¨»sv÷µUñÈ–•ÉŽYޱð¡HˆaS*Ex–õ›FWdÙ ›½õ°Ý‚ÍÐ>Ž?I9íÅ>3ë,4?.:±šŒ€EªÓ¯‡êiYï‚è³Æôr¥2Ni¾¦™f82¨žä€Ìô>0ÍtJÓVk!å]a:Ôjaº ã±Ó†û«pý{Ô©\HB³ß ”viÇÝbzCûbúo±)A5Q\÷‘)C£pò‚LÕ·$ €3“®ºPÒ¬(»ZVºÖ­Mâ}¯mËÙ®F·.jè­$ZË o!{팊8¯ªÜXûâ|ø<­'nUŸg_¼Ìlæ:¯mëÁg¿>ó­³(GsǸ!Óós÷³iO í‰t‡âüs¡ˆíbn&©ÞÌ=d/œÓ¢±¼Ž‡ŠV„†`:ÒºË×½'A œ>‘´ôO“5¶ê„sª%ݾ¢aüg›{<]8í¾ï$@í ¤ÑTõD€2"R‰¹’ô^ïÔ\gݨâ4m Êv „Ý•ÿÐt÷£[1’©^bQ)Ö[±”´3 "є㶠ƒD§t/3á¸|öÖ·èÎÁLÚ£ó6Ü5ꉎ„~‡»Z]Ä4¯V½¢\9èû²×´Š“Õ«Ô5³î ÀJS#s˳ÿÞRÎq(Ó~fyFSr?(÷bÔƒr`´¾¬÷OðÒ{OðŒ Ž61²qàá߆èß$MEoC£J°^Gx|ÿr"U?äïtjߺ—íAÓ¶UÞ…F2- L-ìä©&ZlsH³Ñb†Yø7Óx3>-§•¡ãVœ]³p£¸`“qÝì°®«õ(.avrfDÜØÍ¬ÌØÍ›±›Í˜w+¨gk',géÉ6²z >B]Ç}aõ—¬ŸÁ›ÑÅøƒ·^ŒzŒ ŒzˆÙ° ŠÁ‘ô^¬*… 6w±Mà߃°M„¹“h Ée?hŠÇUrF5žÑì~“6<®(V×OÚÄWLÚv2MÞÀ{‰† SÛh,xìä4m\»Z!®ïÍADÿq©æ&Bqû”ÞðÖgU4È-Z)Ö´ÒkØC+O/ëo@&©™EmO(¾ h.~—ìŦÇÙ¶ÍEQŽ«btÓõ´×$Á9ïÃ2C9%DÚ–'¨7²êB\©í8á!þÀ±Šølb¾üŸø4‘v~ßÃߨ’‰ø&¸ ¸’´ŸhÐ}¥ÜˆÑq8Úo–Ê>¬š‚NhhÕD@ÄíI)úgõ®óÃ$¡¨Ó>ì7‡êïó]` ð¯Ãß endstream endobj 1557 0 obj << /Length 1686 /Filter /FlateDecode >> stream xÚÕXKoÛF¾ûWðVª0·Ü_zPlÅuãÚŠ$ ÇhŠ’ˆP¤Ì‡S·ÈïÌî’"e&ŽZ80—ËÙ™of¾™Y‡6üP#° s߈¶G¶Ü-Ö†ZÌΨ–³@ÐêH¾YýòÖq j“À¨±XuU-–Æ­yº wU\Œ,ι霌,!sZäë"Ün“l­>üf#æ›u˜Ž,Æ¥&¥þènñûÑdÑZwûN˜(ùgÐÅ ú‰o¸¾ ” u“HÚ=t‹„3´KIé†0Ãå2©’“\€ ñp\â §‰-Ph>Ì#Œ¶ReUÔQU7à¢0SÐï%;bƉïjç©:¨½DNåŠe\«˜¬‰^î„-…¹Êuý-.çjÑ4•hØ^¶ÝcÇ,Ì™Rð8r ªiåO†<ölâx­Çꨮ‡ùoð¯©î‡¶l™ë‘¸Ì%Ž+ ÷öÎ6–ðh@„g|–’[ƒæqX¥ÆüèýPbr © L*×ï”ýäƒM¹_EqY®êTû!à6– ¨±¨¯ô@S‚>¡³P›7Ésü²L¡¢\›ðCüŽÏZÔï;зL9^ ©‹ÙLË£ ÈŒQ‡Ášõ–Рð‡’Ì%¾çCxñ›0ß¾ùܬ3ÕÖ¨y·¯¦ã0YîCwö~`Ù@×vtl?†åǾ]×îucÁ‰Ã[v}°[éõxA˜àÐü+YCÖÙ¾g8¾M\[¼’uÁ!ë(Rwƒ6i’u?kGX7 7á‹¢Êï3gqÞñ•ù TõÀ(í7ŒFãÁ0³!½ÞÁ0ë6%¨ŒýÐÚäéRûdÐJ¶a3¯ ¨–•×ZvkÀSÊ‹à7<Éü°n4—õ}?Ôšj¯ê"ÀÓU‰·ßoÉꩉÝh½Ç§uuéç EWľ֪T›ˆ¼ÌÕ:j£F¸Í(aoÜ[Ë x:­”Té¡JôªOp¦¢‰JWyšæ(ô¹=•¤i }àkU# 1T-Ű x¤d¦M§¹"T³Gw.ˆ¸ŒYI†njý"²,5of˜R«íxm°{fšð@æääW%üîìTmãË?”}:Ûº¸ZLÎ'³“*\gõö hd¶½×x;žN//NÇ‹‹ë+µ£ïÔË|òþfru:Ñʤ9E3½¦Ýciu9¨¾¥ú¬¶¬^0óŽb¬öZ>WIÑ쪲YB£wÇj•åZæÖ¾kÎek[®­êik/oÙ× ('Ïñ@ ޅ˰ ¥4(ჱ¸~«žÓ±u6^Œõæã8¾WÄÖ}¾|jÀ‰»^R­7×gª¹5áo¥Zµífö{S÷iYùNõ-Ëõ»Qõ×êËP”¢ .ü#+¦õñþÔÇ6îêÃÇÍýì_‘ä« endstream endobj 1561 0 obj << /Length 1273 /Filter /FlateDecode >> stream xÚWÛRãF}ç+ô(§Ð¬æ*‰ª<8`°^OŽ+5سFµ²ì•äÝ¥ÿžÍHhŒ€d ŠË¨/çtŸÖ´±Âö’Ћ(E ‹½Åú lNË•gþ¸>;ÀÖ.àgù[zðá”s‡( 쥟û¡Ò¥7óïå¶Vå( ”úüh0Æýi¹Y•r½ÎŠ•yð§,F$öw2„2Œ}Œ“Ñ<ýã`’vÙ9!ÿ¦¶|‰SôqRœ 0Ž=3„)3`GàÊý/êaW© =»¹V_Ç»úþDÖ2¨TUÁÊÃ1à`Š07¾ÿ¼é»»Ó®ÅS! 1TØØÄx2§éùÇ«ñ塱ÄBÔÄ5•ËeVg›BæA-¾¨º‚Jbú3Œç&ÌÍäÓíäêxbƒžšßicí&2yG1ŽR+4DCbƒÀx_«mn9ÁQßÐb„"ד)ô<›££_ñÅɱ9ÖÿlUºŒåÃÖ’ ]Z·çEMÉÑ…z¸­äJUO¶Ÿ]Ùfãéôòüx¬[fNLÎÁn?E$ról¿›Q hR ­¯%aþù+ä!‡Ø…i¼×Õ*¨ ô”èøµÛË0- ¹„¹hÌ! yS±Óqp2NÇC³±uQ*™¯Û¨tÞê‡È, ¹&<Š ºÌZOˬXd[™_ÁÃÁ,õóA>ïÏÕ ƒ*Á4ÖMÌ;Åk9¨åI[ ÿqO(f`ž5ñrPñФÚCGá£óˆ¿¥'Ò*oý†÷ ö)qr3n"ÖPB·"ð^΃µÌeU¥úº/ÀK8‡7îP›‹M±èÚÜJÍŒÛ` À¨Û¬”° ûjºPå*7Uš5ÚyO’Ÿs¹ªö5f´rª –pmÔMxѤLVÕÐãI…N(~´*–6¿~qÏ¢wó·Rê;\GyÞÞEñÏ寜9N^ŸãÖ¾?È8|’íüÃ%Zvn­’~ßTõÀU¢ªwïÉþø}8`¢(„%Cïzh(Ø^Õ}ßíVóµ[W0‰NÀ“E(¡‘^XfóÐ[ÂC@ŒxL¼ïéÚcˆAæÐ˽›ƒOf­qSbJ`¬‰%˜°/,P`Ï]Õ`ÏB”ˆ$mAÎNG1õwÅ¢Ñ>öçÖSèû4áœhπư[E¤ñÉ »O†wùD謆†°ÖI_6vÒ·bˆ0Úݘ’5;â/6&é# $"­ù½,–¹Š ‹„€kwh"޼Ҹꋠˆ„!.’ý†°¨ë…ìÔíÇ^ÞP Ž›H´Ý2uy £AJÐAw”^©%ŽQL’^-ñkèl vµêTÉU¤AبͲÎZÙbÖº6è¥e!ó ØÞ®2sv7"‘ÿð,pX©¨èT`“Y­Ñ#â‹X³Z'4Ì•3Ø÷õ²ÈQ’¼©| áX²Çó~“/+Cs |"“šF÷é¥Þ˜ßð’Ó{¯6´Ü£†»9zUTöQ˜î„#Fâÿ©©½.ñFž 'tOSU]îõ®TÈ~ÌŠˆ9U÷;f›ØQ3,`m0'êÇB2ƒÆ¯,Áo#.|Yfò.7I4ÏBcœŽ endstream endobj 1566 0 obj << /Length 1630 /Filter /FlateDecode >> stream xÚÕY[sÓF~ϯУÌàíÞ/¼Ñh)´@Ò'`ÕVb Ž$J}Ï^dke;6c…Ë$¯´»ç;çìî·ß‰I‚á‡$'Š1d¸Nf×gؽ­¯ßxõ䌄qS8íüùâì§ÇB$#ƒ I..û¦.æÉëô—EvÓæõdÊKŃɔs‘¾¨««:»¾.Ê+ßñ<+'T§«l9™RÆ I Å“·OÏ]¬Ñ¥GºiGnû©ú~¢‘N¤æˆ0î]}•·«ºô}œ‘fËU>!éëÈ0N…‘PàzS?÷ü·ßá·óþÃÚ-*2à…eÒXÇ^¿ÅÉ:Ÿ&q•|r#¯†¨bÐZ&çg/we™*‚Œá±ÿýáñ‹7˜0Ûäi³šÍò¦¹\-‘\& a°cÍL‰öv¦”#ª…·Ó, øÝöŸP…ˆ‰”@·üš®àˆ#F‘ä€0HsãÛ«fª .Ó£  0 Î«2ߵŒØ?rûH+?øõã‰f骜µEUÂÞxfJØP°¸‚º´2 ST·9>VÅ|{R„̾ƒ8ßmP%Žö%ƒ¶fÝÜ7XàaúÃ`¹8íïY0*8°;$“ù….£9¡˜HKºY/·ãî…Hh? T"E×Ik».œBjzÑ’]ÑÂ>ˆ±),&d`2^7Û€¯M:ƃÐÖ«œÑÜŸ‹v‘µÞõEµœ‡(Šò²ª¯3·²îEö°‘N«UûðÜÏÎÿY¶Zdå•[CpËcN‰D‚„côkž-—•³0ËZæÐªó¦ZÕp&ýcÖ4aDCæö¥I?-쬅¸xrî‡öAÑdªl¬»ïlÕj¦[§Ušû‡øàíjè€?Ÿ}»]xÏqœÒìæfYÌz)ø´ÈC«h}ðe埗8x½Ì-†Klè]µÅ²ø/÷Ìõº`ì›(ƒ®k!gå|™ï&*jÙÚ³”<Ž¥„4‹QHJH”8†¤Æ 5mß·wJRçšÆQÕ½-Æêù0<ÃÊrÉŒÅ11\Þ‚ „±:…±lf°Ð`Š#¥Žg,=cQN*ø¶Œܱ”õ$ïæ0\¥ï휼‚Xsú¬Á6m g*ôyó—uu!†#®:¾òQG ÇØú¢ŠoÔ×NégL¾%½¨%Øîyh¯ýTc°ãW%1 _”µÜ¿pAÙ7ý4Þ·©–iUû®?ÿ~öÌg6øçWÞ;Y\¢¬BÂ>o²ÇÒ¦kTµïÍÂræu]Š ×Ä 6Ä|,Šä’À£p¤µE„8‚#GA $9@ 5À51àŠQp„ÓÏb\»|;¶)Ue`¬»Ñ.ØwkèGI †GD‚ô2D&œËcv’ˆÔbdΑúÛ)ù~¨Âö]1P:q(uFˆ‡)l©Çó¾½=#Í&ž=W*ƒ-«éÁKÆÝqàãwzÉlËøwÎ^iLF”8ÜF“Çï3{ˆcëŠbA™Ú«:ï"[€EËÙ‰N§i]N–õ, X,¿kK…{RBƒÖ6ê5Ð`„Zçó >›’lQà{ȲCF)î©¡°j,¡L ?…A‡S +kŠ`3*²ÃHĵŒ*¼qŒNƒLÑ4 \o®ÌÍw'0Ñ{«¼Ìkÿ?Qû¸q‚³ýáÞkh *tPÑž” kS¡"Îû>Ktp)ÍFa8k‹zÂ.B ,3@U ÉÆA… Q÷èZ;è;*Ð!Ô½å97H:ްT D*sFÆ© bgG`ñjsØ3†Ñ‚a Ým¡…ã.¾]p;¯ÈžËÊ|)ôáªCb˜üÁ«òf¡F†e¹}´Uhó~¡í­*´ûWTW­ßþmêvÕÿ¡áØ' endstream endobj 1576 0 obj << /Length 1774 /Filter /FlateDecode >> stream xÚåY[SÛF~çWèQÎTÛ½_òÖ&$Í¥-ú”da˶¦¶Ld9„þúžÕ®®0AIètàa‘Ξï\v¿ýVà cÈpL׸|š/78~y@¼]†QËò×ÓƒŸ_Œ 6$8·]΂÷á³e|Q$ù$bŒ…âé$â\„Gùf‘Çëuš-Ü‹ßãlBu¸‹W“ˆ2NHH(™|<}}pxZ£ J÷ ÓZ^‹SAœ aÔÇ)5G„qçv™Âoù©öE¨BĈҘSa½½ÿˆƒ¼|`$4 .KÓuDÃhœ¼Â$Œ"Éy¸XlPEB„*4´‡š'ŸP•AB²qPµ@˜Ð.ê  ö× Õ¡ƒˆZ·ÂÙ¾1Ñ,ÜeÓ"Ýd~ô3e@X jgFLC“RÎI³b;›gPÛ3Èô¬Æ•¸K8C‚‰jö,°1m3Ž(g•ÑÉ ë„J…°V¢cýÚqU—Ž!ªX·t]<ª"¶aàJÓ,“r«<ñ™Ðv¨DŠÖeðKªï—h¤©©Œ~rÂeì7è“Aï\ ½÷7»boïÛôŸäz­8‡àz„Zql 6Ý«Õ-•Ѝ4ˆÁZ`±AêœVI6´F˜B໵DÈPòì1©h×iÓÑ]uˆóÚcɈ<ÜùnZìòĆÎÃbû$–›ÕÌw>Íæ›|—û¡|Ÿ[ê²!åß§/OÜôäËÔÒé2ÎÉ`¸>†ˆH HÞïk7\Œ½pÁö¡ò0ÎsØž±]GW.ŽË´XºQ–\®®¼ÙjµpU8‹dæž=?„‘K¢‹ÆÅÎ\LÎ'á-ŸvEkeàm­¯oÐnöI,kªÜ: ß]·°Î«^¸XV–sÏÅvkÆ™·N ÷¾²+–‰äÉöÂ-Ðl›ž§+0,ëXfO8†s•÷¶¡/Û¢ršÜmܳYÒ Õo‰¢*ˆj§Š»+â8å÷Ìç‰ô.N<*“ÂåÉ‹ÛSý<ùíüs¿€b€†å=ùLô¹ß@Y¬+n|Yþ|ã³ý€ sUÙî¦Ód»ïV¾ÝÓ7"Úù±GªªŽÔ»4Ž  ¤Eãð©”ÜC㌂ê5NõV3 ª×8T¯5z+Ãr”£€R+†Ðm2¼å%d‰Vò›«³»'®$‰œŒ#® … Mà ،x¸2QÐ)Ö“£j+v»´òÍLÛw#¿ZYA£5¥PœÚ”z…VTÚÀ擞ÊëTþ÷‚ê†ÛŽÕ,’÷ÂM³¶žj».8jq Á ©_Žn×HR\ ífD(ÝC#ÕßO"¹ˆY;âR YÐNˆn.&0¥-…à—Bî'C``i¨¤EmæeóìN´lý!† /âÕ¼á<šÇéjk÷Ö°x`b N»àiYÂRn4KßéŸWOù*OÖqšm¿Z¼Ü¬\äW)¬È¤C¹XW„±J¹Œ(O (p0†<±¾¬éÝòdT/O:¨·Ê“QP½<é ^äVO“Ъǻ¿Å|É4Øß^20®ej É`]aL zé¶5Ã!¥-ëIØ;úü¾?ÊýMÍv:bFÙ/v [ O{ÃÀ±7 Š´$ë¿-H·»H2ž–” “Ýã+oºq½ó«‹j¾3Umíî¦ömì> stream xÚÕYMo7 ½ï¯Ð/ÐJü’9´o7‡¶FAº( va;@úïû(;wv]M×E_ÖÍ#%ò‘J®b–Jªb=y¿ž*+„†Ñf!ÔDµ…@‰t`4‘{Œh®!´¤4FzR³ OVB«—dZM’õÀtJB«Kò:F4¹Æ\Ý’ûÐÂOáPëø)m  S©À¸C"%Œ9ÇrÃH¡&˧Ðu{ðH­‡&ÐÕJ¼(°×à$¼èµo ÁrW1Xö2p°ìKEzVÂS%$OD•î'"’ЭÝOŽèqK+Cj„9 F‚GH©è°bÂEÐÉ1ÔH’"–Ôl؈¡pE cD@ ÞÂqâR)… RH>Vç‰+\KL6t1Æc\Ëð‹e o• Òðjæ!Á²šÄ–Ø"4ʰ×8âȰ×#-¡ SìÃ[„Ÿ}x+°çÃ[‘$eh°AŠÔSD%Ø@ —1æ$¬€váºpP„BI!‘Ò8I –Ãt‘¯9¨È6ä3È)0Ü«c ã “Ò}hï‘…j%ÁXDÅ(!úcŒ‘ôÃo¤ "³"˜XŒJBFDÆZƒ ¤¢êˆ(Laˆ Ê 6‡DQ;¡Ï ¬7 { XûÈÑ(6Œ£Ú¬ŒŒ妼9;Ûlßþý×.mß¼ÿc·Ùþx}u·»º»:h(ô‹Íöbw{ýéæÃîö¾’ÇØO»ßÿ|ÿÃõçtY0`0ÙœÞm`äÚ"|õjÌð:]Öûã"mùõ·„ oHÄ«O?¾û7õ’ Òg D©eCÁO(©Ìȶ)°ºeAìÏžtv–¶ç ºßãÏÚö ƦÄúð€¨ˆñ—WH£‚ò~xGñä_ÞµäÈçxÀDÛ77×~ÞÝ¥K°òúߥ¯kx‚®f‡t59®¦+èZ€ˆÙ°N¨æÜ[©HŽÚš³ð(†Ï§äd:²ÐëJº°€’Ÿ³°=]4  Öž;×9ÛzŽÕMµ• _LÑ8Òååtº¼® kÂW'ã›?cG*+€•ZnÎ/¦hܰОÁB_ÃÂ>È„sA2¢ ×Fç@î¨.ÔÇH­a[a±še//f3ÔÒxvõT^£;›òºY§lZçÀøv¹ú(Z³Ù ‹¬@ÑRØç@4)™_ÌîŠÏË!ÿõü×5üÏ@ÿ!^';Nõˆã~ºãTV8¾±y–ªs ©å.>V£ ðšíçqÎ=Ší·M?:’~´2ýô~ùûáX“~t¸ýá9P{ÍqI2 º;]²p È\rÜ‹LÕZ&{1'å#¼ò3xå5¼.@Ö<[³9PqÞŒ6s RLç8r´‹¾bæêžûªrý>h•Ãû†¸€9™VYqß°E¹ö&s 6`Ùæ@!BÏVç@&Ï¥®˜š¨fo+¦®ÔsYžÚ¾ãÐ#  ÏH]“ •š¹ö9P+€^×| ÷¶ß§Úôý¸ÿ/½¸iIÔO®­iI Š3–hû Äéa:¼E‹;ÕÓäk´24dµËˆç\Ž—@=íð8¶8·9T³0ÍUp¶¥þbެGnQuí-ª>\þ=Çš[Ô%(îïúÑVpyÝJ’ãß_ÿõ¯:À endstream endobj 1587 0 obj << /Length 1894 /Filter /FlateDecode >> stream xÚíY[sÓF~ϯÐ[e¦ÚîýÂ#Ò-©ã>“QlÙÖıRYÒ_ß³Ú•,ÉJbˆJC§Cf,¤³ç¶»ßwÎ. 0ü#Áb ®ƒéÕ.ßæ‹À=ŒOŽˆ—‹@0jH>›ýôRˆ€`d°!ÁdÞT5™ïÂçËøºHòQÄ ÅÓQĹOól‘ÇWWézá>ü¯GT‡Ûx5Š(ã„„„Òчɫ£ãIm]Pz ›VrÏO~2„ÁQï§ÔÆŸ›e •É?k]„*DŒ(…9VÛ»8˜ÁÇWFBÓàS)z€Ñð´ ÎŽ~ï³IE’ó¶áb±é±*(j «B#L;VóäºÇª2È(:ŒU-@i[ÁB«Ý5CµF‚› ¢AäNöÝË‘fáv=-Òl="á?R„ #¬Ø<ˆ˜†IVàH9&]#˜|ágór{‘ž×v%nÚ%œ!ÁD5ú=Ø1M1Ž(g•ÐÙ-ë„J…°V”Q¢º¹ãªNCT±vêÚö¨"ˆØ “¨¦»eRn•'>ÚÌ•HÑ: ~Iuõ45•ÐNÝtDU¸Œý}Ò« DÀ?0Ûkߤ%û¹âX”ó<@®86à›îäêŽLETÄ`­F°X‰¨CZ%ë¾%Â’Â4Vé‹=‚-&aã8¤; ¢½èçµÆy¸)òí´Øæ‰õœ‡Å2ö1,³ÕÌO|ºžgùU\n‡òE|`©Ëù(ÿ?99sÓÏS‹¦Ëx½HzÝõ>Dö(éÎjÛ[ŒoAöÚåaœç°9c»ŠnœŸÒbéžÖɧÕ[­2ðV…Ó¸Hfî݋㱓KÖÓ¬ eVB6¯cŠÆÇ§ P(ÎÁN(õlv€Æ ¹C  È.œÇ¼6»‹Ùc›NÉ.¼ƒüE$„y!adŸÆÇð´‹V£ó¨é¾S Úvj÷¢N¯“![“{ëý}ÚÎFj·¢ÓSíçG×óUÔðS,+ɹ‡d»Ã© c‹Í~@ZøßM5È;ž'›k·V×›ô"]`©ºLa€Ì´7¤OßürÅlŠÌ½›%-gýæ(ªŒ¨f°¸•Ùq[Ìož#! êmî?íË“Â%ãæP¿Ï~þþú9À€BZ—_ˆk¢ËÆpP…‘6Þÿ·¯}°ï1a.)›ítšl6óíÊÇßfáˆh§ÇR+¯é¾ZGÀŒ(F©u¬.~H©3ˆQ_ê4ÞYé bÔW:M£×¹]¬$´ssÅÆ¯xÀíNÕ#¬8¦ê1à¿a Ù¢û!U‘ˆBaUQ(¤¾¾êé„kÑå^§0FË=ïeìÓ܃ çˆlùÖ=LN,ÙtY'²}U¼ž9™MR¸‡"-kÀKk1¤áÄB·ýzi¿%7^4s¿³dšß\Wã(©é©|›zŸŠØi(ù¸ÄãF‰4ϳ+º£ ýØ®ü©õúõ‹çãäúÔºçE›VkqŸ2x³(ãл8 paÇd:°ªˆ”ß–8ÁËAè€3س ÖσXõ|вz'! bÕBËêÅ6]Íþ•æ·a¹ƒŒBB¹¨‡!ÈŸ„DN)£Ä”T²T%$;˜ô×t¿iyìTô*e$*ùËäf»‰ûÛ)¡‹%;Í®°‡ÞÖ@FZxw[öô¤èP²ø †˜(kÏ”ª8ñËÉa¢o`úSuÐn)@´·Q)½¿&`Ú¨ÇÊ¥‡4Ã>_Ío¹Í)¬rÖqÛ3¥Ô\]É"Éû›W¯§Çto²dO/¾Ý$ùj5 Ã¯oø:óü˜ùt¬=u7h”Uo+ákO¸¼K¸û 98/÷:ðg%äÜÖÀ?JfZ¨!(Ùª’”~[Jf­¤ƒP²ÕE9€’±ê)¹eõ2¿(Û¥$ϳÞbfy¸|8I:>7k²G–àEÃ6ôQŒÁm6W2 ›Nª)¢‚?í¬ ÜcUab¾uÓ$8bR?ÖcÏ^h?Iü°×ãgÑñxlAû­?ÇÛµ#½:¿¿$µø%Küê/‚Ô™{àÖJÚ¼Ø3„ôc ì3÷¹n³¬ˆwy7Šzßá[9úsÙN•gü‚¥iÂ,w¿ýñæ”Î]Ƽ[Mê^g>c7®³ò°Vå1óÇs±Ÿ·…Ü'ןNa‚gýàe‡þ2ä£8“éAÏêâ\€|ƒXõÈײº‡|¾‚ñ¶Â>%0‚¶íßv#;ÛýÏœOU8{뵜ãD t@¥²`œ†lAíú¬…¼Ù½aUQÃÿƒ×rЯ ƇÈç¶6ë¤ê®[9†íµ„úÿV•kqçwy/XvtQè*Šö}6Í 9Ž;rð¢Îƒnä¡}%ÇlÃAî¿“Ó†¶îä@ûÞ¼«ïä8®îä8±wrÕ©©Çf»Ñ9u§½V¶¼šÉJ·«à¡u5ù² 6Žæ¬½q×vLòÆûŽ®è”Aœé!ú?ÐD1;´ý³Þü ó&ß¿ endstream endobj 1596 0 obj << /Length 1815 /Filter /FlateDecode >> stream xÚÕYYsÓH~ϯУL¡Ù¹ÙvYvÇû%l%V%–@GXþýöhF²¤ÈÁ‘@‘*d¹§¯éþú0 0ü#Áb ®ƒõî7o‹óÀ=,ŸOaÔ£|¼:ùí©ÁÈ`C‚ÕYŸÕj¼ ߯«¤XDŒ±P…óB²YäSb&täRÇÑCGFè‚áiß<]hÖÙºJólAÂwþ¤ jAíɈi¸nŠ4g®òt³€8þb߃›ßƒÑ½ï;é÷¥Mà®yËã-Ø‹2}2Ž(§-Ñé¸a˜#Åe %A”\ó W¢Š 8”ǰF <.%¼Óû¨i2ç7„öA%R´ó…°1[¢‘¦¦%zèØ4Ç`ÄŸÅÃd`N\fdÊÈ„`Äé‚·‹Ûñ ú‘Þ’)Û#f@N8¶c7 B’@€óÎM €ñ°¬Šz]ÕEb½ÆÃjWÎÛürão&ÍÎòb7AÛ¼ˆ!åäòÚÓ®žºãÉk‹~Û8;O&µõ:DD CH/ƒáTÏCÅ9xÂè‘âÃSUî´(«ÜÙcUï4D–uyf NoHµõ~økù8z²\Zc^.‡¬:o5XœCà=‘ƒ.Øq(-”AÒ̃ҖÇÇ ô,R=J¥^L¢$³·ØâPR|?Jžzl1 V>¸™#¤T€ÓDƒ”ìkH q…¸4qÍo‡”p!X6¬($Ì÷Cå¸0ô¡ò ¨Pjö?'ªLÃȳ6‰W)«ðžißù®åºˆHx8s…ê[‡‡2– eÕ*¼ZÆ—uòhÊ-˶4àþ¹ÒtYòùò‹{Œ×Ÿê´H6ž"mÔº°f4À;oAÿ¼s<ôͰåO²°ÁDøêŸ_¼p>ó êOzæüå•sõ—¾ÓÊöÁ,cS=ÌÍ›;[¯á®7sa·9)ù,ØgyIÅŽÀ¾Y¤zìJuÈ3’ª4¢Àz©…ŠÑ¡ÔC})´?”ý¨¾L=Ø’rƒ4¡³´¤ž‚<à‚ Qu  ¥J!Þ0ÄÜSG AcìõÝÞ&)D“ÙsQÝlÏþRÉ#«†6 }ÔâþbÍèFÅ’ª±ºÕD¡9ªõܾ҃®º*°gïxñ–ˆšP5oj3žéy€ØòÂæ žEªâÔ2É6E²¾šÚ„1™E4¥³b(y ÷ÆHx`SÀ¤â­[à4«®áqkñû­ýöŽ Æa¢Ø‹&QØ=o æ°Ço †ö\TYÀ!”ä,NäDÁ0§†Bm$žÜT"[µîˆÀœòµÒÀ%"ÄüÒ•¡óÜ”Î1:ÞPÄ›Mj•±«`+õ#$r\Ä;;$UR”-Þ·¶ì\3½IϾ¸ë<Ë’uk­=Ðíoc«ÈUš×ÅC÷E·7‘Ã^OACѩՎ׈ÚÇ–Ê—(Æ h ŒjTf'F­+£å“×îCܾ¨I¬uéUS³ú¤¯Ü76Ðý~E…/—ÈBº§ö_åhXZ®õp`ó”|ªá±µfУŽåñpnÝ&Ž(]7±á¤º¬ãËvüªK7ziW¿÷™ûP&…³¨ðDƒÊ\‚þ‚HÐ?™¼E‘ÂÝò`ŸH£[Hï©ï À:öC§ßyõ´nn‹ƒçWÞq>LtŽ<è}´‘؋³vÆ[½ð E\=÷M2p€ Y42\ÖôŒ›‚mH¶ üÇŸð7Q©¥ R€;0N0ýø8ô8LÄjŸe%±¯Ô/ÿò`òæ[¹z½NÊò¬¾œî«l µ|¾©µ¢LÄYZ+Ëk´¥™î¬fê;«¾Ð~cõÃV|7õ7w5pÚ_“è ó&%´A×»^ëA‡FÀÉ¿ÒZïžk燲p\Í!‡‹ë°ßnhd½¢ca§_t,Ñ`)XþL` y ] šŒ‰àH+z·`LAj,¶¬x“tŒçê±x Ôï߯ëF³ ™E¨†~FŽeB¬6?ÂOïíO­·_9NW»q,®’ÉßP‰¤€Ûbž mfÙÖN#nÌ­Š€]”ApZVTŠ;ÞÂQúí¾ÇÛâ9R{å»{ö,ƒÙr?Z¬8ŒÚ´ G~âþç¾ÑÌÓƒá©Ð¶{ 6R:Í6ö“r´«":Ÿ‚}6¹TûPÿ•¬Â; endstream endobj 1607 0 obj << /Length 1590 /Filter /FlateDecode >> stream xÚÝX[SÛF~çWèQîDÛ½jWÌô¦&!I‰ƒÝ'‡É(ö‚5™H2$íô¿÷ìEF2†Ömf:0 íž=ç;×O 0ü Ád %\³ëlW‹ËÀ]œ½: ^.Á¨!ùóäàÇc!‚Q‚L.šª&ó`¾\¤7•.c,‡ƒˆsŽŠÕe‘^_gù¥Ûø5ÍT…ët9ˆ(ã„„„òÁùäÍÁp²±.(}"L#¹'! © VÆÔ±®šj¡ÍK]Ü\5þ,ïL^£³ád ‚Ù´¡"1¢2vÚÏtµ.üùÛaº\ë ýÙ:‰‘T4Ž–îìøõ üÖ±ù²qšÆ%€ Ž 5nOÏq0‡Í7F\wVò:`ŠÁÕ2|è‹ •% U)áùþ­ÁGL˜Ïz6Óey±^údÂÀ:NŒšˆ(§'¢ẠÊE¿ñ*IDsH &]üBÑq¢Ú´-Fè] )âìV—eQAm ÷bT@àiÛh %õШ”ˆ²£Š"¨°¦ÍB§Ëë¾¢¢ Aºƒ2$yâ„§ÇÅÂu>«²UÕxîÆÐ PN‚ÚD2­$ërÌrèA…Oå'ˆì'pôSÃpŒ[½&b„•ªÏÄ{3ISŒ#ÊY-4ÞR&T&Ú ¦Ñ$~f•·ÌQp*6±U8nT‰-ó¼#´#I7~øŠêê5ƒ…&µÐ §n¶ÊËÊuÍÌL”EZ¯Šõ FzÕ"õƒr±ZÎËz4^¬ŠëÔ–‘]H?Ã(WájíeaTºãú«@~©{ñz nzÊ]E£ø¾4=à,Ÿg³´Òe X; N‹á+·—ÂïW™…vegþ "¡Ç®Ù ½ã̵°ý?xCÀøb„ïƒ7Œ*üÓ†`1ÊöBFfô ¼±«ž7ZV%޽XuÄÑ2jÛÃÖ.#¦v¿‡µù“$Æ®| “Ð]Lˆ Q€ƒ‚¨B%ŒÂ$fªZy2•ÈŸJ" ‚egú7Çi²Rö@^ÛsÉ$Š…ÚÉ^¦=•ÿNòߟ»Ä÷¥.êm=@ÙÇb ÎêêTì‰XÛôÇ=`ÖXz®}ȳÎÞžm%ÍçMãr÷B2 ±CBI™«³!\=ÎÄò&ÞNÃñߢaNx)HöAÃ܌ɟÇÃÀ,<¦VÉs„@ 0B…¾0É‘ÂÎä£ñ)"¶£íÒñ á5?ô6® 4¸MUhÝ}÷' ¾Š6ïÿHÀü!Ô~h¯4¿Ô磆‚Þ¯m3Žc¶ˆ þÇæ‚…ÓIóa±r‹&,MŒÎaŠrEÛf†ÕÁìúǰDx¸éßöïµôoºJë™nÐ@«9È©wl‘].¢¥v»t{+sã[ù6Ów~õÂhœ "…¡.Ú·0ñ ƒûbµ\Z¥w›O?Ùr¹†!Ý3F&=#mÓæÃ|ÖÞ™ë´ðr¶ý@¨ D÷&[›”^i÷l‚ÃÃßÜSÊôh4zwòòhròþÔ­s÷<üðÛðôåÐÝýa]ç^Æ»ï[WUt›Ã äÒèÃþøÉédøjxænLëÓ6/¬ÜÇÙ‘ÐQÓÚü™Yl‹ûqž§×º–¦^zTdù,»I—§°ÙkDç³èÆF‘SŒÃ)ó'!ÜÅ·›JÏI«Ô-EÑfËmdÎÙÔ÷àÏÚÃ~±¡Ã©w·¹2µfþW.-=ˆÛæáq~$oì™y»X¦æ9.Id#kÎà±Ùê‹ý•þ60‡6å=„¹ðVë ýÌ'8áPy›”õ$¸–wvÈØî û:,Ò¼Ìl¤¥2'yíS½HWshÏ^£éºZT™±«¸©áO¿ÕÅg]¬ÊI¶¥°Ê ÒãN:»qÏI·ò~dÒuô®¾ÎçÞ|b¢+Ÿj¾Ð¹¾‹*6`Ÿ™«gÚ¯£žÎçEõÄëx½*«#X65Sl—&ˆ«"ûÝ>qFsÛQŒP¤®°£¦È}ÏÕZw´™a–¿DRÌ endstream endobj 1612 0 obj << /Length 1921 /Filter /FlateDecode >> stream xÚåYYsÛF~ׯÀ#˜ gç>ò¶IåŽlÄ}r\.ˆ„$”)@@;ö¯OÏb@Т-ÚI%%•H3}wÝ3$ÃðC2ƒ3Å2\gë» ìž¶7™ÿòë·$¬[ÂÂåhå—«‹ÿ|#DF02Ølu=&µÚdÏò¯n‹û¾lKÆX.¾X,9ù/msÓwwU}ã_<)êÕù®Ø.–”qBrBÅâùꇋ¯WwAé‰bÚ•r*“! ‚9¥æˆ0îåìn+ø,hª1Â-æTXjÏžãl/È0šf¯ÝÒ»  ß¶ÙåÅÿæxF‘äQÄ¿lZÿîéÿú)< ,¯‹j»kË iš¤KcƒG6Û¸4§U¡¢L¥:m}.U‡‰Ò ·ç ü!µ6)ÿ¶,¶w‡l)4Rú,|© ªR¾7ó¥ ‰˜ÍW ɇתîgjà §î‹›#Õ dˆ:¥²3TÔjZ ?÷/„%Sb &•a2õWƒsX`>r΄­Öˆ`– a¿9îAft¡Ö>QÄ1ª¼[Wé,ÐbRÆ]Nß!?›5 ÓH¡: ñzÀ0TÓ‰ýºêm9ÜŒ»à\‚Hæ1æ£ ÅÚ‘’4"þ;ÂÀÌ@Ñk³-ë¹hQB„G¢%¤ã?[-õ¾‚Ža®¨€o0™è\Õ÷»ÚÚª¸ŠŠG4´¸gmuM §ª¯›#2zf Žƒö@²}Í ’5»~­hÛÂò}“ÊåÀ~û&¬ñÞQ{ïð¼."ˆ7×þÓËà^V%ËÙ–¢]k‚j5oªÇH²ƒ0³Ùè$ˆBíUe#U¡Ø‡ö(IØ~ýGßëþ@«ë¶¹›Ñ«ÿ”íÊåwßÃïLÅ‘ *€Ê`6‚¤æïYqÒQPL R *Èÿó!,Äyst»õºìºëÝv¾ "ÚÓqm:­ âÄ }–ÈRؼWtî¡J¸?Ð=žkì®Ý)ýÏGjºJûà ‡Tdçè,)ÆÌ§îšºëãp<´BGl) @‹œé„&suÒ oÑ!Õ¿­q0ÿÆAHã0’ ÀØÞÔÓÖ!ô<í â‰Ä Ò_Fé‡q|À]Fx¹ÝDõ‚öÀ=®]ýmá˜ÅBŽ-){Hö)á˜* e­JÑ÷ä³ðœðïÊö•ãÝÎÆ¾1kòÑÎ,÷Èy‚€ÎXë€ôD„4§"¤´ç6 F\è ƒàlª¸#e Ôƒ‰Í‰i&I Ä5‘>ô„`ì¾,xäˆ&V¢Œ!©e? :×Ü‘âg:"P©6ÇŽ$PV#=$ áCúËÒo«+‡.í›Cä_2ôåƒH/4ÂìC€ž?ô’#I΂óÃ)úÁƸ4Æþ¾ñŸ7a–öáeK™ÝÖNÁ×Ϋ§!ŒèÌ) ‘Ú·|VéùuÞTîæÍ_Ññ %ß ð™. ž½-Û°vÞUõþM×·þZ‡‰Æ3(Àñù=,YW÷ö¶Ïñ¥c{á%§ø“ñ Ç•¤œ ftéQIwè?ïKÁ“­è—¦Ž'&ÉÈ+ Çr0å'ðãã<âTÌ­ÆGœzìª3#¿ Aæüª•÷+|¥×éÁwèïæ’CòéÙr™Ö(«zHRwµbiº#(žã¼üc½Ým¼Û­ !T™¿u©ÐBÇ»”XäOö=© ×Ä4-LX4×YÌßÝÂÈÂÜ*IŠ8eÓÆö¾-»Ò{LHDR ìÿ£Ôá$äÙ¶µ¶ŸÓbdŸÙyË®~kÍ ™»'­}á“ÖºA›|uëïûÍŽCçDÇIv&ÅÖ1ëºûÞ»»JÎñpWiCCÂXToüóª÷+ã:7CØ/`‰ʶaë¬èvfºª¶°eÏÁ)ɾ5ˆä¬eÙ7þÙ¦œ‘³òÃÆ P°§M¨þ¶óRlÒÉJs­„Væ´]ªÀeã…ŒW·u3Ì…6“ʉ4iB1_–g'(yhªå_3G)˜>Ç”(4'NQVš?gg¥ endstream endobj 1620 0 obj << /Length 2212 /Filter /FlateDecode >> stream xÚíZ[sÛÆ~ׯà#Ø)7{¿ä±­Ó\¦Nb)“Ç£HHĈY´«þúœ½ÄB ‰”à4ÓñØ#’Àî¹_¾³™`øG&OcÈp=™¯/°»º»›ø/ïþyAº,œuVþíêâ«o„˜Œ 6druÛ%uµ˜¼Ïþ¾Ì·u±›Îc™øz:ã\d?í6w»|½.«;ã_y5¥:;ä«éŒ2NHF¨œ~¸úþâÍUË]Pz¢˜vå#9ÈÉAƒœRsD÷rî—%üoXþ»¥E¨BÄ·˜Sa©½ÿ€' ¸ùý#¡éä“[ºžÀ¢áÛjryñsŠ'aIÎcÆu9Ÿ2’ÝÛ?E@ö¼š¿âHkÓS¼Ê×Åc¶”H„%…/¥ B{|½²ýø¡‚".ôÂ)Ö¾ÿfªYv¨æu¹©¦$ûvÊ !ÈAíÎÓàp‚¸=eUO!Dðì5Øù¾¨¯º×-s‰»Ì­ iIü†œLwG”³fÑ¥Æ DiW.NUíòe^-VEŠ*SH ݬû«§x9– L‰¥šH‰‘$¼ï®Zï°À½ã_­ÁÌ‘b!kó}ERºPkŸFDoÑST%àX ­g!2ˆ ‘õ’QO ‹%WˆËWéG”åg)Jç›zb bJÁ•biÁc®µ-r[¨q:+ì+¸h çBµ~Ø&ÃEHÄu?\æSª ÄvQ8 ÕeÁ R´ ñ÷RbÆZ?·¢Ÿ.Œ@ÀÐN¶” 3 &ÀZÅŽò ªP$¡ø7T]ÇàMyµx³Õ©˜ïÃçjµqfçu±ð×n¬1Ž¥¢\#þÅÝÚ]VemS¾£H$.ÚDFi]d‡”OªÙ±Äƒh÷öÏ@Õ“HbÒÓùªtîl¶9>N…Èò]™ß4¨7þsï—€©ŠÝG·%Dóž»ó&¼Xë”Õ€^”Hláa¨ü°)È×ä(7Cµ·¤l§Ê–žÕ`1íiÓÛ4£”f›[ÿ¹Ý•ռܖù ²… ÙaÅ`•Å)L_¨aÕ„"Åt¬aÚ®ŒiÈD5 WN‘1ì »:Sðì°ìµz°æ€¦-öÛï.¿ýî±lj®Çs h¤çó·W ž  ‰1xJ$DÌó—·?¼ýÑÚä×·é”`P. ìŠr¢S{6‡â)u/—Ëj{ù™ïv¹ó€ÏÃOe½ôßB|Z l×Y “¯§3€…(tPO9㲩 õ²83ÿ£}¬WnбwUÃ1ïwE}ØUÝ´: õ×Éê  Qµ­Ío Åûr Ø(xË&t%¤~ã©‚îf¸#%e€•?þL†aÁx‡ù¼Øïo«`€ÉΈöt i\Á:ivâj곃¥%ÉY£Ã(ìÃèÐe—äiÔ92 S Y +º<‹jžˆ˜,Þ…'à‰UÄt›ïšRa‘‡«ï*«Z[¿Ú:mÝ›î0Zf%1ú¬¾ƒ_[ý¯‹#Q ȱø C=qh2½IƒJŽ””çMÜwfƘ4,)…ùó£6çÏRMñ†R]ƒ{M×Mlä*ÙºI‹UªŸpô#[µƒæÔÑÃx áËèð9G‡»ft€%Ò7qwýv·YŸ0$ж^=‡×emu <ÿHÄeî-7€\H¶÷¿ZÔÒâÔäþcŒôæ?õ.Ÿ×˜ã,ª,Ìú6³õ Åâÿ™à'¶½©1à%Å)ýcáŒe®H,-ëßsðÏ(üþ‰øïÓˆ#¢ä8\ Р2æ:¨;ă+¿ Áb® zY0Åq¢>Ùw0HòÈÖ07ž€>èÿöÈ–c;Å€3¥p#ô+º2ÇÐe¡+[R’°§ÆÌÖ˜u£ú Þ0 ¼¡³: 6°uÈ„ÙÉʼꈰҎ—íiEB'ëR £§J2‚*‡§tˆ€^ÆÐâRby¢.m ݬ6)U¨€ô–ýÓÞMµÝÑõ´þÁoÌGênPßnS|8“ö½¿/ÿ›8¦âLC<±1ŒeO•ˆ6ç:tXU^F‰9/¡º!C›Aá º|ºôX’gù"(Ù+ÿ+:zª7§=¿U÷ÝÃÖµãcaWöÅ"–=lŠåõÌìän, è×Ðãχ=ºóº}+®¾¶o¼Ì»9<íHŽcj‹x:…Ú&^p.Ìâ­ÅŸ1LàÒÜ/šLíÇ lúæ ŽcfÏî} r²XN>$gÏ`)Ï(qxJL'(ö4±2þJǰðÇðávw_Eù„¬2pÑÝ…e]ùàç"¯s¿­Üû+í!¼ý1ß®bXáqܼoõ),ƒö5ŠD1á±îÕ’ ÄSåÄDO]HÒVI“ýãÍ;k`g[ÚT¶ð&Ç“ƒæ0jM5xÐßÚ;Ÿù@Ëuá ]àòæà¯¯ƒw×ÜÍDT¡?Ùûþ…ð Ä%0ئtÊBBá6=C| õªÅ—O…HÖ Ô:o‘/ìÓ©²OKïø¥|2?¬À{û ž5½qŒ’Ä Úf!*lœW‹æ¡îŒØ>Ò~ËÐ^nÝ9Ó›W¡ÆÛ²cϱDƒÎ~W!9Ç-øCçX"9ÊK$ %ΚcGáæØˆ¿íÙÉw! ‰GáJ1p54æ:0Ç*ÄÔ8LÁÔšôTc‰ËÁÏ5ÆvËÌÿÇKþ3,Æc-)¬Î™b_4ÄiDí¡ÈMì%^÷ÖÀ®!Uíé~˜c<h%é'ª‘:¾Ês_<œ<™ ¿¸@À¢£¨>†Td‘J'½Vؼ±Šy¨Á°çŸ›ÇòË3€?ñ”ÖÄx8A§OM?ç b6Ì+H{9 endstream endobj 1628 0 obj << /Length 1583 /Filter /FlateDecode >> stream xÚí™[sÓF€ßó+ô(3õvï ¡-L§ä ˜Œ°•ÄYve¹4ÿ¾g/r´Î:G\R:@bìÝsßó•I†áÉ ÎcÈpMæؽۜgþÅѯ$¬ÃÂqoå/'?¿"#lHvrÖu2ÍÞç/.Še[6£1c,ÏGcÎEþ¶Yœ7Å|>«Ïýõˆê|]T£1eœœP5úxòúàðd£]PzO3íÊ›vš¾„h¤3©9"Œ{SËzÒÎ&ÖŽKû£l—EÓZ#¶}”1m@•Ûæ|âùa=9±»U·û­ýe%8Û…ýÍób:EVf6RÆD"­„—Bš«e»ò{^ùåhLòzDò‰}’@Ë´œz‰bRÌó5l[Ùm3+àÜ¿éW^yéE$­ÚESݳ`7ìrŸµ¥#Ö…B|T?>8vê¨l×Míwÿ="/ªu ¶Ú—>ʧàõéeg€Ä‘X"ÖIù€Ê¢>6B âc_A®Ÿ‘´o'¡ÂÝò 8ÙU™’Ê’Bwë~ çkG}r"ç&“˜ ÈÓÏWì 1ˆkáD1û–U_¬j’rºœARA+‡$AúÅ|uçH=aØ=}£BÁA§™Ðñ Ê*Ô8Q”wå·é³<–L‹2¼£T,¬¨éÕ Iy>†.‚¤ ñJÔ@TÿÐ)d3¦ØjSa¼ÛêzpQU?:Ÿ­Ë?Yè]]Ÿ”žÙ\#&y§#Y=km¹÷܈']lˆ’žRÁî,€FðY½\·R;Öî&kDzfV|ªÊ´•)Äw%‘0 –#¶ÌªËÏU( |å‚o­ èDBë ³EÏÿ´M1éÆsH8`ÌöºHûdVGKûäW_ü‰ª‚&ÇÅf¡Ÿ NÒ ™B @ñ¦Swgà6„â`ÒŽÀ!ã8<À;ǹ¦®Î÷àøfŽGVôºÍràH± HAÚ#Í«²Mƒœ"Jø—&9´æÓO›ä\O‚äV”0òû!9Ü/‘ÔC€ÜJ‚)’§œ¤)­‡9†#$ãxý(ÿa”{r†[w?%ŸgíEwÝ>[4ó¢ Hæá¹ówóøJžŒÑ-Àq¹ ÿPTî€M^VÓþƒ ;ÓÚåWKWNeôT¡~÷ßÅYpÈæÄ>œX.«Y÷,c{’ù¾HÌŒC?czùÂÊ"|¯çC˜æ‹È ¢(ÎW©³€äÃ(lqÂbÍ»æ  ¦€:ôó…þRóÅY^ïœ0,8½ÏŒÁ¾ñŒÄr ³Gݨ9)†D3H€¾kÂ00RÝ}÷0 ½Bgk“ˆgºT·Þ%,•,FÜ$r'äíÄBÙƒ ¯ž4äù-W¾ßÀQÚ“ó·>:ȇ¾×Šn6¤(Û²§[“»lïÏí 6z¬ñn§-X_3ö”iG¨½A»›²òkRÖ @Yð§²Ä@׃f:e­,f[ÈÃ);„²‘“¦,ªyúË8¬ÃèU)ÌbÅ» ‹FR}éK¼w{'e)TZt=û†7yß윢M̈]è%Ò€ù \b„µy z‰²úà-a`îà·ÃRf3ŽCÝÉ¢^…^íÛEÑÜS©û1Ý”òž ¦/Aä÷ÜüI\¶å$ou‰¤Q»*;T>Ø[×íº˜¤v×R§¦ƒ±—|Ç%ÚæÞ‹.Ê›oÎA{·öÍËã£ÃwßÓ·æÊ¤.Sû|i’(f÷ýÎÜZó/—v>Ð endstream endobj 1637 0 obj << /Length 1908 /Filter /FlateDecode >> stream xÚíZYoÛF~÷¯à£TTÛ½¼µiÒˆZ*Z Fbl²¬RT÷×wö ¥¥IÛ’h4I‹’¥åÜóÍ|›Ã/’œ(Æá:™^a÷iqžø7§¿‘pnG['šýð\ˆ„`d°!ÉäÓ¶¨É,y7xz‘.ˬŽcñd8â\ Þ×çEzu•/ÎýoÒÅêÁ:G”qB„êá‡É«£g“Z» ôfÚ“·ìT`'C vJÍaÜÛ¹ºÈáw¥òÏZ¡ #ÜaN…•öîNfðå«#¡iòÙ½JàÑðnžŒ~mÓIE’óXq¶˜–ùtÈÈàÒþ••Ë´(oÛA‰BFõb¥ dÄVLéUÖ¢U ĨéG­ÂH)Ý{æ|mVÅ ¢I¤pÖŸ|÷|¨Ù`m£u½’Á‡ðœLAFjŸ1Íl˜°&_”C(²{æc}éc|æ|>«-8²€h¤Ahô šícQΪCc_C®¢¿ Bé¶yœ ªêãéb6ÏÚ¤2…¤ÐÕ¹ï½ÄqG…rªÆO‰•¦™#®ê± }+E o @1ÓN®R”®¤Í™5Q(Š$™²]Η›2nêÐ Ãè 1(2É¡ ‰>Ä7* T(”2—HkæÕwT½†ø3Õ‹VCT<ÖZZ¬»YÔéAÖZ¨zÁE#W¦åͲµT„D\7Kez½X•ö-L­®‹´¸£*¥/êJ_ùbš/‰[º"ÖMAÚl1¥‘”:TFKµGÍE([ u#‚Wxì|:ÒUxϯ]§i™Íüg‡T n6¸°QA¸FLòJG€ƒ|‘—¶±·üˆ S€i¢.UÔê*¦ W%’€”Û˜Ö]Z“\3dµB¤Pá¦á}¾X®CŸ-¦“ZÔKùÖ¾Øær_ÿ5~ÊÓó¬Ý À¨ïª{ÂÂPïRrHÝn܉âJvÖ}öèV(ÀîÆC#Jéàú“ ¥š§s¨{ {Å* 'ºð„a”Åʽ<Œ«–P¤˜Ž=l+cšMõ¢•Sd>»ãêBÁë,Só€W(¾/Ç/^¶L¨¹îÃ6î0®‘óãI‹NÉ ¦R!Péüíøõñ‰ÉïÇí-Á qO4€¯¡FRÝ]šEê²à‘ès^^øw©îœÝ\Ò«á=gZ2 ’#üg¥º¼ÈŒÏóÌ­Èá Whî›÷˜pšY™ó„ù"zœÕ ¢š RÅGm;‹ãÀœfåºn`ï:•OZ1¶BU.ÿh€ìqG RÈ¡m!0ÒTRTÁX3܉&¬$'¯CT TÌmµžN³ÕêÓz¯ª#¢½»2cFµÓ‘õB¬,»ïAú0#P„ÈŠ²H«ÜÛ–… öFÉúQ Ë— Ý4hЋò£Ò„ÚïNªÀA˜Ð¡ ôq¨‚ÙìSP#&ÞÌ»f"‘ö/šp ¯J4õ•Õg@”ÅWr7€œÙ”ãCxCî1‘Ñ–¡ ª0#}¸ÅìERÅn•m>)¤UíRYt-íͤ¼´—Å,-Ó«Zå·¬)ÜÀcFõ1n bŒ= b#&²×5Û¥êÝ™ÃÄÛŸƒ@ Lb¹÷pùUsO툃èAÔX;€Ñ©]/ºyHµìÊC EîãÌ^Eˆ†y5&ƒ—>³ú.±t°•Û†­:GþÉ®%„1«P$wæü±Å ÒÌÀŠb矜¶èt‘^tBIÞÐùóÉ›_·4:fHØî<\/ÇÐfÒÄzÿ·h…ÓJ÷¢•Idˆˆµ>=yóöôÙxܱòñžÁf¼H¤nÝI¤Ór]-ò›mÈ]‘¥ó+ÿÖŠìèS/´ÑÔ5ýDR6Q Ξ{vÁvHT[ÆbËx«eÀ:¼äȔ۬£óî5Ü·$$›åu˜2ëåhˬÁ7ÊÑ‚À°SqQôHpì E&´p€zA¬˜óÌÁ‚¡c`R0ah턽'P’ôB ¬,h©=øCVþ°mDº†¢íeÞ~å Ó~”[!H¤ý.aåÇ$Ösëu'°;š¦ÿ"зøìΜîÆ¶íÅûàV%æñùÃ;w-¢Jk뎊Á~rïŽJÌ/.v¹'ÿ6vTóí¨¸,ˬs}kHÒ4lswmPM0˜«üþ¸¶S¤ú *Ï)í} Ä×/¯°bøoϳEV¤s i!eN¹¿º* 8½ãV÷=—‡Ýc<òíàá­ÿËÛ…8€]ÃÛÊ"Bî3½û0#LŽÉ­$`ïG1€´2 ÿ»F·¡î–âQGwðº{rCQbñÿI€î{ó'9ìOr·ÉM$F¤—Á à3ñeî­Rn&ÔÞä2ñ€¹ 5+Íÿ—K_ôàŽòÜȰŒMMí4³aX0°ƒâ½våÓݳZ~³³ÚØ?ÍM°P endstream endobj 1648 0 obj << /Length 2694 /Filter /FlateDecode >> stream xÚíZÝsÛÆ÷_Áé˜1/¸o\ÞT×N›ÄŽc©O¶'‘ˆ1H*hEþë»{{(ɶ:u§xÂã}ìí÷îïD>Ká?>séÌJÉœÊfËÍ“ÔÏÖ—3¼ùñ û°qÑÛù׳'ß¿ÐzÆSæRÇgg}Rg«ÙÛäÙ:¿j‹z¾R&ú‡ùB)¼®w—u¾Ù”ÛKZx™oç"Köy5_©8O¸pó÷g?=y~ÖÝ®…x ›¸óŸø”,FŸ&SŒKE|6ëþÅ+ÿèhqawÚoVB#µ·ïÓÙ š¥Lgbví·nf°g0ªf§O~›º“KÁŒRË‹í²-—sÉ“ø¿¢½Êëö6‚[æì£°!„C.–UYlñ~õبBÃz¶tÁéÄÛóL&{ä~·óä}8hfœ3§µÀƒ ™Id;¥3嶃qtÐöï$û’ùwÏC¸ß¤ƒûÓ”¥BF2ïR†Û\›bBu›NÉ Þ½¾ DEŸ7Å™°"n_çÛUULQ•–˜ ûžÅÓ#î¢RǸ•38ŸÙØNÊvf’p»ši$ ˜L€ÅŒÎÀ%]Ÿ7[>%̈1éÌl§¸æ}ßúpð©ñgÚÉ‘l˹° ³ßM+)Ì„]…3Þ®ÂÙ(]¶kšÛ]L†_ )ÉLgL=ʘúp;˜™ˆîÛ«}‹ù3UIñç²Ú¯¼Ý=ÁO„M> 1`[Šƒ•qãV^ð J¬Žõã?dìI}(&¼ei`T¦ìжoŠ«ºhºÐW6¤e\?Jð+eܦõ31ûd½ìc)ûàrÞÐ'*yÑQ¤A! ºÏ´HÎÖ^p`}x1Œ…IÙÐç ÐÔy4ŒÛuÜx®§¨^àj» „Ú!ÁvÈ€:‚ën›ò¼¬`ã.¸êp÷ñ¾“È‘‘É êN‰ TÆ“>Ÿ}áBƒ×2Já¯vmH¸í:IØßâ½Ä;s(l‘:öC“¥KöJ×Ýyû·®ˆÙ¢ U`8€êŒU¤G8AqD·ØQZɘà|ä{í¾ÞöKTµ/~˜¬ªÐMÛ®ÚÓ¹Àâéßÿÿ&Úí?0¡gÆêÏlކÑk¡ïŒŽ¤Thÿý9(æ]Ê%©¥Ù/—EÓ\ì« ‚!ˆ€„Ad°¸¨ îCQÊèÑD)EM¹/QÀEÀP& ²js/ÿ^ Õcb„¦$>Õßš¢þZHk†ÅçÂâà{.• ¾&Pƒëœ'ey܉°„Âs‘ñoYeCVPky•Ic7RÙ}Èʸ‡C«ì^h%ACF›ÿ5h%¾udå{œ¢Äã‡C[Ü}Ü2| n9N\;ÑÁ-×uX¶ƒ[0÷‰ ŒP tP ÖnA-XïC-¼•pi Ãè ô¡ðË š;;ró¹y8üÒ€_Ú1'³ÿã¯ÏÄ_ü¿€Å~FÑòѧŸW`°%`HÁƒ˜%`M§*ªUCß0gÀˆ»;³lô2Ã'#E(¥­8šް(a@‘ F.võb žmra ·:ÃÓkÂ'¶:àc³¬¹ܬ‰uÂpƒ}à–Eà†„ZÚ÷ƒ‰Q fƒ7ØéÁ›¿#ð×7ëcB¶U1æ{~//ç³ Ô³‰ˆÙ¸SÄl8¢m*ÊœeR<ð G±ôP zPMD¨&úPmÀM?äBÞ…ž–;È£ð-ýܦ¿· “2)Ýcà6$ÅÓÏnÃʈ!p“)ï=¨2)VT‘œ ×~öã)³*y1w:i¦´‚ÚÄ–<üÁïÌÃi£““=˜‹³oCpãçO‹úc¹ ›0wœúÉÇ0ÀÇË}C¯ž:<êÐÀ t°Á*é±S'ÞˆæöM÷4Z0|”ÑÒAð`Ù×áÉ?g͵_¨Wl*pH(—%Ã|Ds?Öy“Úƒ¬'¢s^DÐfV½Œðd„-Ô¯dAF4ûó¦øcè´pÓ@Ć&÷ €çßç»KšÜâk"tëO&|]ïÚv¾©±ÉuÙ¡Û(ýUz(ÿN½ÂË}šÂµ¼›Bê¿ ’”›²Ê맘bdr½&ý­éЍ‰î( ÷ç3á͈ôªh–uyîy ÝÁÙÝbâ! 4 :@›s¬§3Èù˜þ€½k2L•Uµ‡ÄÙyÑ!ãÊÉéâÍóßžÒ0 ~£-TÃâ–×óL%ƒm¯iÛÉé+Ƽî—<ŠÆ3(“—»¦¥3˜Ô¥6‘ ÓÕÀݾ)F6Ûb³Û‚Zýú;.ÕÏ{öZ+·M[ä+úB¤Aqep˜;9 k5­ÿO§8&»eÞn©L6EîJ㣠"£øM@ßAé<*6• -Q³kÑGé«g>I©0 Ìƒ¤}±£X×…¦J%¿R“×\÷J4ø" l­Êâ’8»í&¡#ó7ùPø í²¥|¿DW4öœáýVAƒRnB[Z·y÷ÆŒ‡ÐaqàÙÀr+šèhaGÒЈhí7ŦØ`¤g÷¤üKm3ùªLWbq&_TbEÓ!¡èÃÊWÚz“‡MùÕUUƾ)ïQ ­]C¤„JJ'h%£AÃõ k|C·ŠçÐÒ*Volн2`3cSãßy8|ÐL§þ‰j.L3|z"ãï1œÿ>¥wvú÷)q=3ÁkEæ  ZìÔÓä-²ˆ3ý·¹æ=6o˜óË‚–9Ý÷-÷wD8þK•¸û®ÇD/$ž ê&]ðPœ9¢Z èF*ýÅúçïaw|Í”¦³ éŽå{UÝúAvq:{ ªãî{x`ñÜíNÀ [:s̼Zt3'˜Ô_`Ýp|q8?eÜá%CÛ"sšIb÷íáïhö¶ c{‡—àÀB?·‘`›kÔXdXX5³Ž‰TÞãqóâ°{BÀÉ^¬ÑߎzÆf‘6´¯) endstream endobj 1654 0 obj << /Length 950 /Filter /FlateDecode >> stream xÚ¥VQS£0~÷WôíÚÃ%(íÌ= VÏÓS¬øpÓëC,±2RÀ@éyýï’@¡ÆVç¦3’Ýo¿|»Iu ÿ¡ÎvúËíÌPŒ²yG¾ŒÏ²Ü4,‚ƒ¯§¶ÝAÐÀêM¨ ìLºÇ$+(ëŒq×ö€eÙ]Ÿ¥sF‹(™Ë‰Ÿ$é™nwIâ0±…PaØ›?FAÝ6ÍÒ,-ßòt¶x:®e lIžô¸›ÝÓç%Í ùÁ9Ž LÇÀISïŒG7Âv‡ÃoÒöâä¸î¾"¸®\6­\ƒ3åkõ¹Õ{¾æZ¶mt~ŒÎFãaAæÉr±æˆ&l°™x¾y~ìç×WrDNåÇíèæntuƒû4\Uì¬i+©àèúä—ð-…¥s;Óf+ÓÒ˜¨™Ø½™“Oá ¤Y¥ WÝq›sôk9£]Î,! ®ô`з79÷Y”Ì¢ŒÄWb²©‰À@4°c¶‘ªb¸Ëi(ßÒ$^©bHä³±—êäƒ6Z¥2‰­ªÆbp/[Ê^(û¢êÕNPoîÅy*ßfqD“¢rüg…˜7µÄûµÔÿKùº¯îfmQvOYšÑnÅ£ˆâ¸Æ°5úÂ.¢ {ç“‘%D’&³¢¯ îΓ›ÚTnsiïîÜ ¤}ꌒ[‰ÒJ˜½uQ%4cô2*¨Š2eaycí­I†Œæ9åõÑwKÆÅø{šÞfro~xh@–ÅcÊ¢?¤ääAUfŒoÂjçªõÑð¤:ÆÔ€\l˜ý6¦×Ä+tùy•(OtµÌ)à·¿þJÇÒpî9Ÿ‘añ‹¾áïNçå}é+,ä!L×p°ÓÆXëÔáb;tÛbGåRH ŠhöD .,FB´³Pa­9´€îÆÓ^½›æ «°­ÖÀl´¾¾5ð«ëÖéô¸f™OX¡†^•˜Í©õZ“8ÙHøúF¢Ž„7‘DzT(‘PÜçÅíÅ·Ë¡åõÉjØòmƒªd¹¼su=ޝíq$o¶µºÜíAªv‡vƒÉ#gxAWw9™Ó|­jçú%`ýzÓ½m—àÎvIËr»ÏAìsÊ&ù ã@ endstream endobj 1658 0 obj << /Length 1865 /Filter /FlateDecode >> stream xÚåXYSÛH~çWøQNEÍ%i¨Ú/GÂ’M 8µ„¢„<Æ*„äHrˆ7•ÿ¾=‡„ddŽà·-¨²<êî¯{ú6xð‡Â”"ÁÂA|»ãéÓâz`Nßï`Kç¡Û¢üs²óîóöðLfmQ“éàÜÙ›G‹JC—RêðÝ¡ËwÆE~]D··Ivm^üeC:Ë(º„2ŒLñðbò×ÎÁ¤Aç„í˜oŸÍçxäî&#{8ž}þ4úøVé :¸˜"ÌиQz[ ¥Vè©:ì’cKŸE·ˆ‚€;çÌ’‹$‹“E”~‚—½lUßȪ†á–o¢OûÔ’Yì.¢8ñ€Ã·Y\¬ÀeÓýú*œŸ“ÕBNrûæ­9<–«/et-Ë_Z¸ËÌ}vtúUãQÏ‚˜ÑÙ©\Œ58Á¾»û‡z>?íÔmšÂïõ:Þß«ùz.&ïïc÷÷˜`ÿ1Ák ·Öwƒã§æï»Š¹º~¨Tñº7äÜe¯OÓ¨¬ÜB~«}„-çG8?•ßúÜšåYÜDOÁ_޲В^ÐË•?I)EÀ:¯¥Ç²¸’E^N’#Ý ›¥Ñu¹º&Õ«>…£e5¯´xc#ïî++p‡á¤¾ôOi™M-~ ¼<‰oØ ™É;·JR(Y«K ¿ìÔñd}(Ûõ{Ï.q4 _Jò²Á Y–²ìjÛ“×­´~w@á§ÈƒŠª ªJ(¥ÄÖýržÀ]¿5µ“aÁ”(¤DUçó o0…— 1â!ÜiÒÛC €½A:8Û915¼ ‰)A>cZgǪ̈ìe>Òí€rϤ :•Eò}H±#{ÀA³í€‹ù>í‚—QZt[1 T À/…DâóÃaHeëtÇÎ…å„æˆ‘àœ(N—†Ð;ÐDó$™é+Ö©—Qy© –—÷о×é®>AÔçµ€¯PT,Žh“1D©‰ÎLÄèyàJÚZ1ŒH@kòy”MSÙ'•Âñ°¦{k$žmˆG`Ä•wô´¬{NjçP‹ÞrÎ:.G²M‰ 0©Ã1Ã}Æ@®(Ÿz5•ªò}¶`DCro‹NIåCÛ9¹É>ì HJWâ¡@ø¯± NhQܱ}‹çا}IþµCã›þ`àß3¶R #ž•Ç×Ä—É¿=iJUõá6.Š’Ê»U=ÙØGÂmcR™õåƒ ¥í´Â}V»$ð¥¢[ÿ; ûúBˆøµT=£³º€ƒÒ¬fÕ@}5ŸišÃøB_aÑœ])Ç­î+J+vX5&šB’dI¥jCËŽbDÞd<ê·•C¤Amwá¡,>̧nMd( Ã5S“l±¬Œ¥£3÷ôàÄXó}È}'*’è*•°´Ћ^hqóòøÙÈZXxSÀ"þ:0Ì.éÊ÷92_VV1ptQDj9³äwI5·y€ýÚYÈê5Q½^;ü­†ó<–Vøқa“¼FÇ™y»QWÚèÊîu…ÞfÐŒr¾ÁÜ×ýÕ`%ˆSÍ탾T{é' Á›/Ó©9½Ò7g‰—¥œ’;¤ùPÍð™CÝ3õÊ«ˆ#óq£QWæË÷$êK ÜÃb-yÊ F¾ëKk”%鮄ù%Œ÷%Ì2ô>(g¹šEàDZcbÒ|—?b¥&”kˆGCqsö–ŒÀê¸JW†¬Å c)£ÂTqiOÙc5Àî¬8Gêy2 !úÍKåS-I;qa/W[hUíxöáþ{šçH1 ð Ky7y¸€h¡Z%¶×z`a`„m6ˆùx öŸ¾á2D¡%|$ñ EÐ…<ƒ-@»È¥œBµRŸÌd‡:hjB‹0‡…¬–EVšÓ¤²¬3ó}–/³©êÃ\8yÕdHw*xôwÅ`1˜Í@-£4‘2˜‡ƒÎô3mò×°Y‘ßšÌ7‚ÔT‘&6^Í ³F骑Y.»‰©·ÚVjM<©Ë\о1¯[àNµÝMçPX—ìÚííl0M#?m®LMª‚**  ðzÐ_ãkz…`z8TËVâó±ÁO¾z˜Úª¹ŒcX gËõ­|.œm~F7â­l~J–o7››iÜW |„ƒ-úù¤ ç µö­ú×>Œ· [W-¶ lbuÃÚÇyëk\ð%Ø»ºlc¯ï}!ø?gï£/ÛûÈ3÷>ñì½/€1_E¥Zç_7îC„ªÛ¬kñ ö"¸ÒM‹Ñš1vta:r^²øa/„ù˜ocñS¢ü"¥Š8õûßÂþ¸º1pw\Ð'7ì{únÿ·M'RجOÏÇû{õ:-0oÚ›5+nu:Õ*Q?ÿ¶¸Kz endstream endobj 1664 0 obj << /Length 1743 /Filter /FlateDecode >> stream xÚíYÛrÛ6}÷Wð‘êD(î—¾¹®Ó\êÖ±5}I2†¢-%J¡ä¦þû..´ŠŽ¥„N&i&žH=»Àîâð˜$þ‘ÄàD1† ×I>?Àn´ºJü—³ßH˜7„‰ÃÆÌ_G??"!lH2ºlš“×éÑ$[®‹j0dŒ¥â—Ás‘žV‹«*›Ï§å•p’•ªÓ›l6RÆ I £ƒ·£Ç£;tAéŽnÚ™Û~š¦Ÿ„h¤©9"Œ{W‹2_Osëǵý¯X/³jmhÇ()bÚ”[æbâéq™ìjU¯>µÖ‚‹p½°Ÿ<]a ¯Šl6÷ß§%²8É0X‰˜Þþùö +üØËߎ†gǧ1Æ?!ÓlvSÔÖýðq9 i>’t…Y;ŠB¬ª+Î(ïÌY±¾©6ÀC`:öIa$”¨÷É/]ùµçÏžÃO}ÂïJ… €IA„€Ã{ý'cxø"Áˆ«äƒ›9O¢ŠÁ·Yr~ðª+©"ÈîLqJ¼½ {rŽã&Ï‹Õêòf¢ CŒXC¢½‘!…D¡!§W“)ül;O¨BÄÈ…„æmç…¦wÞsĉ޽‘!ÿ‘äÜÙ¢†yàlÕÊ%Ldý€ ßi šI'…û¸îÀ×aÕ¼aHÓ‚÷Yß‘^TCB(wʦÆOýt YzcKyaóýmX)¡â!³uÇÊ4ôUgæ´„ T„ƒ½ÈV9|}ÑÄ–8jRî“ÚÂ,pŠº G”³zÒ¹O—?£´é'Ó´ž>ÉÊñ¬è²ÊÔÆ]ÿy*ꞤdJ!ë$fH³gEŸP š*gŠK^çdIº‚‚±ÇŠëYUñ¾3nbqmP~ íÞvþI•Ia Û|»ÿÔøˆ²pÆ™bdïø–]‰ÇyBºvaHàYL: Ê|è „ÊÖ´ºK/^/u‰‘…–›Ífp?@«Ï³u1öcïì}u»)‘Æ^p88cÜlyÓrº¶¹Þˆ#îøPãâ.áQg¨TÀÎAUD÷J3?â"çHkÝ õð.½W>TéÁí¸˜Ã}bnÜ”o0áÅl]´Û>y”-—–. H¤.N?Ý#»-ÖjäÁß¶•Õôòær®'ÙÚó€`φïàLUêOv|kW  &B4VœºÇyãyðeå›gkG &Å A\Ú¤#8wÿ¬þ\”.%1ØTçîSn ¸ñ ŒÓÕºX®ê1ë¶œdõмsn~pé©.ÕÜ&¨û0)J?uY…ì…ëÚñFû8óÏê|pCeX"nú «ø×G™•WÅ“š–]Ul©U×ãü¼±Ž|¬áÐx»T\÷¶¥*ÕM²8.×ͰàÃz‹aÙ…÷2,EÇ$áZ )Íç1,‰8ÓίY´eXß2,û¹aX°Õ\’{㺮V}8Æ1ô!ÊbÇÎŽÿ8é€åÂÝä}Àrƒ¤jíÇÉóó“C[w££gw;ã*ž1 g¯ãÜt±ëоÇS¨UVTáº_T>q³@Æ‹ªZTußñ͠覴Ծøx>«vã³îÑŸµ¶Hýj•Ô*$"ª'T ¯´…š/––ËÞv@¸XI?Èø0Ü21r™Í;/tWI䨬íUïíEºÍdáSŠ]˜,Ýɲ™¬Þ™Éx=€Ã„Ü€÷9LV 8âL1ªöaz°£^ðÑ`:¨,ÙËB*¸tèËZSDÉ}"ô:ÈuSÿˆSî,aØÃœVB“$â ÿ'NeÊV¬ª- y)§Åjª…°|»‡—ÕbÞíG0¹ñ…e­ÚÍûT-ÕVµ6q}ãÑ@'{µ¬)aôµÖHIÒ °¶¸zXÓê3hZMÌÝ$­^Ѓ¤¡ßË"AK?† õý°ª¹{sêXSâzD= ršýH€-uEe$Àšâ†ü´¾YA+ŸM‹ÒÆnÍÍ-ÛP“ønú–| }kg¡…}ãŠù!yõ'yÉ–äEéÃ’—j[ò‚…÷K^€HtV‰4ÿÌ?* ¤…³$ m(^ï/JZŠÏ}~1càí“ôáÇ 6SÇŽýyxrÜ­x)­{å˜Jk?ZŠìÈFñ"pН¨xíHv 5N7êƒìZ[¶¢V¼zA ŠW„ú âÕ rP¼"ärQæ_Iñj@ë\—`¨XfúàºÖ”À|oÅëý'*^»q]ÈB¡MT,1Á÷”»¼RÓ«Üõ]Q^{hÿOžR endstream endobj 1672 0 obj << /Length 2259 /Filter /FlateDecode >> stream xÚåY[sÛ6~÷¯Ð#µSq‰î[Öu“6›Ôµ=û’f2ŒD[œÈ”JRÍúßïwP"iJ¶#fgg:öŒ@<7œÛ°I„?6I¢‰"L¤™ÌïÏ";[ÞMÜàêõóëfX8k­üçÍÙßRj¢0‰6¹¹m“ºYL>çËtSgåt&„Ô?¦3)UpY®ïÊôþ>/îÜ‹wi1å&ئ«éŒ ÉXÀ„˜~¼ùåìâfÇ]qþL1iåc9“¶œŒ™ÐLb#C&¤õËb^f×¾R‚…:1 m×Y%dðöÇóÙÕÅo¤€ êµS¤ÌÒ…ëbž¹—·åú>ôt;BÌ<á‹C©˜#Ÿs²…•f³IËzH¢X‡J÷º(æé*Û\N¹èC+H#Z•ÕNœd"È +×dæè99¸£zÕ4É 7Õfeú¬dðçTÅAºÚio±Æº­PÔe~•ÕÛÒ35å¨1¨:` AxÕXÃ}Z¹o¯ßüŒÿÆ“þع‡Â $ˆ… #&ÉI>|Œ& ¼üe…RO¾Ú•÷r-0ZM®Ï~òx®Y˜$¤d¨uâ„øõ­WýÖ©^mçó¬ªn·+¯=äe"Œ@Ä:3ŽÈŒËsáˆTËÿ…g\‡,Q“RˆÚ^¾“^†’™®ô]ÎLð0–ÒÒR*ÞEÂW‡LÄ5faÌ{\çSÁ‚ef¾ ðOtG|þ<Â×áïü|À¿8,a 6…ûlñá§©Á¶˜×ùº€g~ô_ÆH-p-rd pƒOvšÅ•ßÙO°ó§94þò©Å;Ž:y*6ØÖPø=RÑP&×HÑ,ºv~cðož(o‹%œš7Ë—i±XeCT,Ž¿îR¼Rhd†4mâÐÄú…!Õå‹h0\[R±ð)!­ 6¤ "†v5HâG•±yODÒzÎ ÎÁš |HC'!CiQZ„šÅ§hÈ4ñK,)iØK4D}è׆®ËÀx*-aƒµ‡Åˆ£˜yÕ\¡[9T{§Ú9šl>µ.’úì›®V¨¨ó´Î|]üLÅéa,-›HŠX6<|ŒäE^“×·ôè&»Úi;\f¹‚3F¹Ÿ¯ï± Ù£:ù;jJ¶ZtŠìñâÏO/þåÃÆ[¹‘öÒ °yÔ Ì§3 Ê.elþM 0+óÛˆ'A½Lk7j =ì;ûl€Ü@‹ú$ôÌh%œH¡¾© Ù6xlÚ˜öz/\åžîÓÚšk™UN̨È7p!è!¡‡ý•MÕ™ߺwõ2sƒªÎ6~Ó…&—©'am'ÉI!ÿÉÆ=”·ëòÞÚs_—YᨥT×îb>u ÷.…²Ä€ Ìþ3'›,A6-î²—4Rœó}[6ØE¡Ðè½[íº(úðp…¸Bž–øVªø¤. $?‘âœí»(âO]ýî»(Ô" qH0a(›1&Aîè öþ×÷çÙJA)u ®ͤIâ.×]¼}óf€­á¡ŽÔ(|Qqµä]¾ï~¾~÷Š"÷æü/›Ô>KÞ©´IRhN4°aK‘*¡)ÅéŸS9ôv‘#–EV"VàÒµ›\eÅ]½¬ÜeýmL¸zpy±È©’xš>ßàÅçíÝ_Se¥ãRúE‚èÒlˆ¯&·—ÔéWÒ¢Be‚p£ÊóõmGAñ0ÒØ.‰2 ‹žÔf3RhøQwãèˆ#nÆà*"F~-®m·–±[L–Zz“í Yåž›MõæZ—nèÞþfe‰)ëA >‹ôÑÝŒ¹Ë•‹l$q‚ì!ñç!$‰öÎ3 B"Z 6µŒë»j!q DG᪠ö¶ÇuCÅ舒àpã‚´'ãñ Ôýæ{¾="E¨„ú E<¤˜ç‚lQl²:2µ2'ªæÌ’ŠÈ~¬…ß8XóF1=ŒÂuÁâ—aÊÐ:Òc`"%õ‹P˜ÕpsònÑÑŠŽFQ†kjñMʤ[仢¦Òã²WŸvp=¡â>äL¡“äÈ¡À>ÏÒ Ù“‡²—p׫Ŝì¹A©¸xö–ÅP[È¥ÔI™#°¸4–”àmŒ|8i96LæEVþuar'Yu;dÁzºæÅf[·OË<ýÜ(ìQ™…hmqœ…Óˬ9£¶÷õàyqOXÇý±¬›²*Æ¿QV qû²–Ù<Ë]¯ÙÝètÊLRtdvÙÅjÝÉ0]l&Í^$þ×¼^ºw¯ÀÀ^ ì6»Žî&ÜèÕåþ|£9ç?º^¨Ž6.¡<}„\ÄXüm ]PcO0Þbðãù ûWÛ*[toàÅèSëa]¼<ãœÅ¬·õ78V‘}=p¹røæ²uº€·G -ûëk÷<_å;„EÏöðXq—¹¥ö†^íÄÆä"Û'áÕÐ}¢“ŽÜQs;}pÖ"«Ó|EBê8¸µÞ§•&Ì8å1¨Å/6®j7׎´}©æÍÉÑǦ¹µU~¿!ÄHãEVúýjÏPÑæ’‚»¯ÇŽèNr!QsPÉ®ä}µ[à.ò„U]n絟všý‰v^éRòlOaŽªP ånúMÕËÿt•à;ôce€1‚ª×aJ”x¦»ÖÞ[ÊÌ6Ȳÿ§»;FgÉWwDI)Õ»º#(ÛËùnÛèµVÍÉÜ>¬(_ÙÓK¯Êw¹þc1·Àc pK´Äþ¦e€©Œ±PŒÃ”NKÞeú$¶å,4ÚŒmÓãЀ…﯎A[þ} í³ïß°CfÂØ: Úb½T–”ŒÌ‹ÀÒAhËBaxÚÆ16StòíSÈ–qJxÏÈ–Hqõbý6ÏÑÏß•/ö>?”GÜ‚Î\÷nºA'Ÿx Ç Ê–§› u3”.™í È„F¯fzÕꯄÈÒƒ€L†Æ˜QAÎK™ãþHÔa<Ò£BǧáÅÅ ¨W¡ endstream endobj 1680 0 obj << /Length 2039 /Filter /FlateDecode >> stream xÚíY[“ã´~Ÿ_‘G‡"ºY6oÀY8\ÎaÙ™}Z¶¦Œ£L\“ØÁ²†_OK-{,Ç™ÍÖ¦¸µ,‘d©û뫺µtúÈâ…âœd"]û«Ø­6w ¼úêŠú}+ظíüüæê“/¥\ИdqF7›1©›õâMôÅ6?´ºY®8ç‘üt¹BF/›ú®É÷û²ºÃÿË«%K£.ß-WŒ J#ÊÅòíÍ7W/nî’±3aÚÇ8³1NJS’.’Tà„PMÛX@Àu*K ËR íö9!DTV‡®µðEôËR&QÞ”ùO;=”í¿ý¦›×@ qÞê5ι1VìºYÏ6À¸ò|W€•§ r×UaÏܯ‹FyÓÎN‘j‚·îÚg·ÛÜÛÖ»õ’Fg•~À /ªâÛÿ|ñJ^ZöÀ×A^¬BTÈð¥•6ÚX*ŠG`^øeÑg×8/v¥voq®uBmóêN'h´Æñ€Æk]4Ô!Iy¯M‡NÅùŠSHöSu 鬇FDvŽÌS‡lïÎd‚¾†‚¨Ï2ÛºsÁËw¼!S“ ³3}!XV¦Õ¹ B¸JL 1ÓcVšÞ¡ÖE»6·_gâ°¸ú£^X*‰ô¯F–뛈ç^ü¥ú×x6b2ƒ&-»È³‘¥÷ÿL›S•¼ „³ ¼Ü\÷iûµÑ ΈóäíF&$~êr/øvÃæÞnBæî= {g È`"€Ãø.ùgt€'Z>_Ó†QMcƒ£o\ëH{ôøãË\¥mÛü“ÁÁÉUº]ÞöG×ÓnÅÔû!cmòöí‚*2y6G]øe{xîGQ|íÿíÿ¯¿û¿öŠÙ@Ü5z>dͰô^)€JE „¹H °´hìWÙŸ•Ƭ'I aàÏg=ಠ<àÎ$ôŒ$ÅÓ“À¹Iàæ«SY@¿+üwí¤³ÿsbßKð>Áo£ùw›Ðòî endstream endobj 1687 0 obj << /Length 1477 /Filter /FlateDecode >> stream xÚíX[SÛF~çWèQêÔÛ½jWyk iIÒ)Ït:„a„-cMeÉ‘d(ÿ¾gµ+ë‚LœA$¤eð`Y:{¾sÛó-q0ü'ÀŽd \9³Õ®îæ×޹8ýõ€X¹ NZ’¿L~z#„C0 p@œé¢­j:wÎÝÃe¸.£Ü›0Æ\ñÊ›p.Ü“<»ÎÃÕ*N¯ÍƒßÃÔ£ÊÝ„‰7¡Œâ&¼‹éÛƒ£é]Pº§™Zòžìdƒ¡ÖN_qD7vË>5ä§­.B%"¨„9ZÛùvæð𭃑PÔ¹­DWW‰svða“0Š|λÀÏgyôiXúÈí£+ €´ ¼ÎãÔcÄ-5v?4 H1åL¨°”fÅùO1w“ÎÊ8K=â^Ø•¾C „ zå„)ˆ»sª5qZza|iܽÔàØÇm`¤­—Ä[” -Æå[¡3“»ª’~°JiÛ&N•¬_†é<‰†´2‰|¡j¹Æ7Çïôß¡›#¿qw±ÒK(‚õôží¨8N|D qÀDÚO<—Û¼3ëU+ï½(Q qR•*,lÃ"%CŽL¨íL8¨"úÕÙOT« •'2äù}I­N2€NÙÁ!Ô¯•VÝ‚×[³J]Z0,ìw’dÐ6”; Ëhnî]yTºwM}¶ L!æóÖeœÆ¥®µ–Ã$ì±&ƒhÐU*84¾‚ÏXô ¢Û% xÏ͘pãZ×Íl]9¥æç"³Íô6Kh Ã¶c‰?•½¨$Õ3çÝëÃÉéÑcO™̪g€1e… {ݬìx|R˘%?ŸWÛlå«,7iâîë£Ss7Jg&‡ó-'d ó=hˆ Ví»l{ƒ»æœFå&·±»ñ„€rÙDм^ ¦+´NÜ^j«ìì·cøÜ߮ԗ°…¤#„„µ_¸[»=WÂf„¬iMŒYóÿxgàc𘙛Ù,*ŠÅ&±þw›=xoôèÞͤ¿¿ HåHô&øõ¸½kÙ­ƒ[„šÛn> stream xÚÕYAo[7 ¾ûWè¸]d‰")  ´+ÒËMÛ²²Ô‚ö8@÷ï÷Qv·äù%z±»!‡Öû(QüH‰|ŽR‚ .J‰Ž£ý'‡¿(™]¤dêHĄ⒴‘êR5|p2¥ åÜri!9Ù€ÅIe{$.“š±B)®hÓª®,ª!¸ÊÉ„èja0HLÂxPµ¹ñ †lcjFV“0–¤8 øÆ°CSS1 c¢ÕÙ¢Æ`C6¥,â#[4⣔8ƒ„Ùjl`àªØ ~Átc†Äq3s—ÆêˆLM):JÑÆˆ ±é‘Ô\¦Ø8ÁgX›"ÎMf‹-®„™•Í4Â|¹¹"a\L®¦B¶nÂÌEM7aæš.ì«l$u)dxJ(‹¹3²­*HbºØB¢jºL.¥Ôp)›œAwó2ÌH* Ç.åÜÆÄb Ïš9`‚38nT«cj.ŒT-0x»–"hÚZgV5I‹¶1àŒ}H’¶0]V›X1]i‘‚¸áÒü#˜¯´XQ¬¢Í°ÄƦ—ØxÖ ©6Ýâ„’éZLÀÍXΔdd+âX˜mÙb¸±Š4ž±?1:!afm6çà$·€ÊcÉt‘NȃB9¡2lÍta."°éHµáÔ!bš.ÆR‹ydØ´u<`®IRÛ96£ÜvŽ$ƒçdvt4›¿ugÈ^ARpóŸù©úŠX~yûùóùìÕ«$ÅD¼yE"Þ¯–kwtäæÇ ´lðÇPÌ[T!I·_Àe í#¤I@|nŸYÖ#¥¶Ï²³À¶/Xhþþzuy²X»37ÿöØÍO_ÖîNÿús,fó`Ïb¹¾±c¨Ù0›Xܬn¯/7›£©ý´øxuñfõÅÙQ¨Ü\é ]\CÛ€ÍÊ{î[wÝ‘)ŒølBxx$R()y„k‡ƒÄWäSHµz‹ž.0ÖŒ•ó‹¡µê.­•÷§µÊZ £µ¨öÈ!oŽê9Ð5˜2Ò•¸Ääqµõ‘²·óò…€†Ý¼¶»ýI0½\®0ÛÙ¦Ž0{Ë6Àl~rûûº}ÿñjùi6³ºþ¸¸ÞÌÎ͆KXÒ¤ŒvæV” ¸Š}Æ…,LH{Ý|yâæïV§+¾;½ºü´Xÿ8ß./×W«åÍ÷æ“;DY­Ó Í!×¾Ç-ÝJ >¢æè9¨Ï1Mˆ;ì,{ÇH߉ö> ô«u²0áº÷±Ö>%†ç± bäX½Uè] eä}z1ç¹R¡«@WBWÐE>î…x7Æ€©ˆ·R¿ D™åë0 Ÿ3]e—.Òitiâº(O kBÑì9qÈ8€­êSRo½E+ûÀeÊaxˆ=ŽÆor¦‘Ë2Éþt¥)WÒ¤%xÍ®PÀ«µ¨] šI\´µŒeõ°¬zÆÙÅ#ÙÅOÌ®»µ o omüV­ ñвÇüppf{…A¨!Ñ¿Fø»ŒW<¯O¬vž¾vJÙ'kÔ·HDÉ%åQNß}S D¼õãG @Ä.ŒA 'éÔ{'”}{‘W½Sôšì 02*^-Osͽù£DG¢DˆMœ;áÈòöâ´ dfŸRê­éÅuÛF/1¾˜*ô“yb?i/Ö†tå)ý䤡ú4Úý €Œ+¨ŒVF z§‰•Ñó`¡Œ´‰¹À”6qBÿí3¥>ÐÔ‘hˆšÉÛoOfá®·¢ä¿`a¤˜úN}Œ…)ïÔ‡ kÖG};|¥NÕ ¡>0¡€²»@ 왞Y9ò7*¨Î‚ endstream endobj 1695 0 obj << /Length 1849 /Filter /FlateDecode >> stream xÚåY[sÓF~ϯУݩ·{¿ðX-ÐHÒét€É[N4µecË0ù÷={‘¬•¥…Â0dˆvÏ}Ï÷í$þÄàD1† ×Éty„ÝÛÍeâN;"aÝN+=?úå© ÁÈ`C’óySÔù,y3z|•®Ël3ž0ÆFâÑx¹½Ú¬.7ér™—þßi1¦z´Kã eœarüîüùÑñy­]PzK3íÊ;ØÉCƒRsD÷vn¯rø©T~¨eª1Â-æTXioÞádŸ' M“Oné2DÃÓ"9;zÝ¥“0Š$ç±âgÓMö¡C±’H‚ôAk i¬x“¥3«¶AjÒL'*äÆ/~ót¬ÙhWLË|UŒÉè]Ø)B‚Ú¦!ä ,q{ò¢C*Dˆí…÷ôb¯Wâ¦^ÂLT»ßbƒÓ\Æå¬Ztæ³æjè§ ”6MâQU/¿J‹Ù"ë’Ê’BWë~öŸ>ûãØ>ñÙɽ·ó«.¹„"!XKîYO­qlHaf²r®êŒ³àU#ã­(› ¢4Ò˜xõé¶ 7ÄjB”Da›‰h—g;_.d¦‘.Ò€   2IG¢âƒB¨¬„ºvÁ«³é2¶:/Òmø½X¬ oèÑ4-³™÷~LÕèz_¥Í:ÓˆI^éÅ™yiK®áGd„†ï‰:]¥‚CÇaà«BZ’V]Äm1Ã[n¾Å„{×b7Wkç\VøÎW¡›Úƒ´Û¯ ²¤™ÊVÔ RF·ÌYíÊõ®ôæ| 9J7yú¾2êS^^ùo¶ÀK2ú´¸îÏÇ‹''§Ç¯±Ð(¼ÂȼSÛÜÚ'ǧ^tVL­ 5šy1¼"±Y-ýS3t9ÿÒ‡mµÞ-ÀB°Ä¾Ì?ŽÑÏDåYIÕŒ n[Yî6ÑÞÅ.ù:‹ú´ª;šßjöì÷gðsبTp U"$t.r·7rgŠÀŠÂpœ/_xý9„ŒùˆlwÓi¶ÝÎw‹€<&D{9$ È­ð:9Rd¼´²8½%^¢8àe¤ØUÛa¾`#|µ”h¤$‹Õ†Òîj!ÅêÁ€Ú:|1Ï+å-´††hˆú†ÐºU,áDFï…ªLkD0s¢Ü«[¡*à 51F­Øô£jp-wì¸ìO™Ë}EB [åõº3h#JHKòtUlCŸZWéæ_¤næÇ*+ÒegyÄÊzÉ…u*â?5øfùÀÜ.|ö¨´UrI§éлöLÏ‹,ßiÓ|~]ßK—¤µCÿ€Ü«yìaÙÊ{ß\h‰Q¨ïm–}†s3ƒ4T*·©‡£}¼åpÑpá´¢°Ô½Që 9tqÌ;c¾?d-…Ð…°¸K¨÷Eb%C,\¡ØŠI—ö) «§˜~ý–þ4÷ð·Iã$Íu4Ÿ«4dyj9 ¯˜Þù?¯Ž¿%BtÁ=f>f%q-¾.cÒ \j>Æ´`·ãcƒ(|,R\¬ŠiÖ‘/ŠL†q˜Úã–ÃÛ¬ìdc;䃱1çîE­ü{gc š¥b6fE Ú c]4ÉÆ§2ñ3ì«áJ¸¬bȾŽÜ.p2F»Jß¶ð‘aW>÷ðÑ&VæDAE{ÝDZ¢ªa·>C‚œ€Ïñ2X¤Ä†6ê»ffw•´éMx‡¨[‘{x=ë^äY ôž±Y€¯12[Ì*¼™ØâFÆÛ¨ƒ´æ$ÁFºÌ.«É¼ß[[®6-´Ž‡8ArdÆÙ~S-Ò2R;Ü_Ú¿ß{´ét7šñ|1ø÷#¿l#G¥A×㢦ž\JwÈ„û7`qÝ·+gÁ-µ·,«ÈD¸ç€Üâgl wXÉéí€|ÅÈ#ÅÓZ0Ž!Ä ¢•b %£c­Ó>Vm ÁôÁ€ܽ˜öÝ›¿? '+8È cÍ×Bò(z‡eoù#ÕÀ¶µ¹'ˆ[uƉ²Ãß°C´´ƒP‡´RÌà`ðXkÇõý ¼‚×íÏyÑ;P’pÑ÷(Õtd½É‹i¾N¥H[ÿDÉ@”°úqÿ¿éŽC¥ÿƒº´†='C_¾N4rJîuþ¸AXp{JËÞ“ÐÂboûh1mZ›&”R7•²¿CñæéNåžì—ÞŠ5R4_æa+µàÓ±‡ÝqeL»yÆZ9EưâêBÁG»íÎ̵  ÀgϬ…ƒ@;AÀ6Î¥c§‘m'ç:%\Dt†Ð ÌAqëüëäÅÉK“¿OzŽôÃ[ôV+lé¡`‰êŸû¥›Mê²ýXCj=(c¿j®ç%Ç”¾:úåU óq`u¨§Šn¨Óúz;»7¿€áž2@2õÃ=À{ÛÙžµæ?tÛÍš endstream endobj 1704 0 obj << /Length 2139 /Filter /FlateDecode >> stream xÚíYYsÇ~ç¯ØÇ…+˜Ì}ø-Ql'¾‹Ì“¬r-%‰Ê …mé×ç›c³À‚„D˜I**±„ÁLOwO_Ó†ÿXáha„ NÚbvAÃìú¶ˆƒ×_]°D7á4£üóÕÅ¿Tª`”8êXqu“³ºšoÊWwÕC[¯'S!D©>ŸL¥Tå?Ö«Ûuu¿XÞÆ…ïªå„Ûr[5“)’±’ 3y{õõÅW½tÅù‰jzÊ= ô„BѤ§¶’0!£ž›»þ:‘?÷¼7„9ˆ%WžÛ›·´˜cñë‚eyñk ½/@À,FMqyñØL&8ÑRÿk>[×?6šhp?‹`Ë!ÏšE½œV¶^ø¾¹cÄ [À„)·¼ùrbE¹]ÎÚÅj9aåÛ´SŒ§÷;§ÂÂðú„=‹e;CT²ðOñ¼?éI²¦¹d¦4¡Övû¤Š&1.'“„KÑ]Fï…Xú,1å¹R’nxG~W-çM=ÆU¢1“èþ9^‰ ¡á°‘ÖàÎø¾‹¤é=$ ] =´'W; 44æL2wµY²±Ãpé÷uJîè©Ã€þtœPîŠ)óŽM¡à“ï® Y*ËÏF-(,Q §Yð´'[p³x_ÚK VÒÒªŸe?.‘ö“†Xžì×>Lg1OÓ Fâá(­É‘{Êœ#L²dW6hƒüB)`\w\C]”Y˲Y\¯‘bÕú]üžX…ÁáU›Æ×nÊw»DÌ fíS$¥ßb¹h}Jeçèe`G%»Mdô¨\K¢ýIqûÃ(ž”ãìÞI¿ùË«éë/~ˆGûe¢4º¨®»¶«¸r['Æb…(m㲺O¤7ëÕý¸šIpTSäE/ð+z t*SU1Z>àJ²åj·…«L›¨¡Öå²þµy‡UÓ¬í Ιǹ÷“)+ëu"ÆnÜy»ÕM»ŽW ÎVQ@Å9]>`y¶xð·b…C“”ÅQÓ<‰¿«üþw]TxEê±°Ž×{øû~ûí¨)4QRåE8úD”«e“BÒ[Æ”«‡mã£qD”ŦeÙPžb'ó,;{Túqêæ8²Þe»A®GüÊ~åΔàtÛÞŹÕÍhzQNŒæ£QíUDµ“7G¦ÛöaÛúúHeYÿ6k¶óà÷ DŠ“4aÊ÷!µß¹Ù>âæ)³”PÌå1òâÞµ‡$B‹WCQoeöœûº~X×›]ò+Žë IÕ 8.j?Ê—òŒÁ×T&0‚›Ãç®ð( 6NzóNɉɘœ°º¢¬¼º«óÙ /˜v±‰y<¨1oS‰Ž%à®#¼I}”£J”÷8¿h#eG×ÑÀ )f—›Åõ¢aJx,"FÿD=ƒ"ÃbeÊy´3½v^']]߯º¦½«RÕÌ}T„àã”)c‚È·Æ–ÿŠ0Ë:Òy4a½‰"–«$ ÎEžÔ{Ú ÒÅOÄt‰RÌÞ-®X¯®×u»]/ãN\EpE³­?½Ñw›þÒŽû’Š—ýþFzmÐs˜Bùj!õö8Ã$5h_P¹=+Õ)ÿ÷o’e~¤LD»l¶³Y½ÙÜl›dƒ!@aˆ||k/᱓ð4¸6õÿ(üãyÑNpµ‡?°›Å³È5;”º?h¥šûÑ2E& {>œðO&|ÁGÌÉS@ÿ0$Î ‚…ƒDH¶ÏA7ƒ'E¬³‚ú :` Z¾¬²ÿMHJNœç€@ž•é~~ù^åA8,Ü’X»€þty& b1 «ÇAQÒåY H³1PäXÔÚña8h8æqî}D z.0èÖÖóöÎ¥öîÚ…Ä_OInÐŽ<Ú6ës´Íút¤NIÊ'ì'”ôƒ’^ÅdùÅÿW¯}p®œ¥"álJÌuEsèeÝÌ7ñ›/‘¤¯L˜mCâÅlŒ% dƒ\´åNÖÍj}_튨e@QR˜>ÏýØã)lV)<¨ ÅÝ/_'GúqOžø÷Â?I-ã ¿6ç›ð“ß“ð“9ÀO~Ñã§Œz‡ŸÂäj !õhªÃzÜ÷á­@Æ~â=~Š£0%{üÄÇOÎÁOüýDjÝ~â~â9~h“'Rª¦ =µ÷(¨¢Ï‚Sê£à·½˜9œò¬¸}a8Å5úûCý? Nqv–ëÓž“Î"8=' ÅQ¿÷KÒq %±Œÿ1”=C¡Muh'9v9*Ÿ÷ ðäYiíÎø´˜™ïº=bŠ%Ã*bÀuP2Æa“y×”ÇÍ£Ðí1…mœâ2êy( Úù7=ÏJ±EQá0Ç@tdìijæÎ ¢*£>½#ã‰?Uíô^­„êšBßB™„–Lê­ŒëÑ’±‡OH˜Kh „´„•-aí-Ûei|@üXCœ0ü-øåâa ÅI…znž†? ð'>qï{ìcJ´$‘}÷é§t¡{äãÇÇŠ‘‘cun?ƒU9ð <{à¡ð :tý²º›ë°ÁÕñ½A<}Œ!†©ÿ%_qîWuhúuo$’.Á›8ïŸüd_/üdµ‰“Ï?~±þ1ŠuÀEeÀE'€¡ö_|d°zH¶ÐÞPºò÷©BÃ|xÿñŸ‰.>s`0†_¢Ÿ¥ˆï?9uÿþã'Wñó±Dy>nŒî^|“ªíFˆ±zì §=i8˱“îò ã÷{b6ÄñË¿PØs pâTœ X¼6ÿâÌ‘ endstream endobj 1711 0 obj << /Length 2227 /Filter /FlateDecode >> stream xÚÕZmsÛÆþ®_Áé'0S^ïýùØ4iÇJc)ÓŽÇ“„)2 hWùõ}w q (Ñ&-×cÏ»{»Ï¾Ý‘M(þ±IJ'F’J;™ß_Ðöi};ñ7¯þ~ÁÝ „³å_¯/þòƒRFIJS6¹¾é³º^L^'ßÝe«&¯§3!D¢¾Î¤TÉ¿êåmÝßÕ­ñ2«¦Ü&›¬œÎ¸Œ%LØé›ë/¾¿ÞJWœ©¦£ÜÓÓ@OA( zj+ Òë¹¾+ð¿ùû–ㆰTµÄ’+Çíõ:YàåJ”å“-éýÌ⮜\]ü2&“ N´”±àÿ,æuþûˆ`£‰÷³¶ù`Åy³/•SféY¤rª‰Õ6–ZçYyïäÃ5 Má7. åÆS¿þajE²©æM±¬¦,y¾ÔÆHªw_΄…§ Ti¿)ªf ¨àÒ·ÞÀo±Ü·=ášö…3#Iʶ,~£ŠIiŸL.EGtåÓâ÷›À”÷õ’Œp³%¿ËªE™q†he;º?{ŽWð(`LªÍDkJ„äCI³õÒ{þȵ-+FƒÅ³uÅÆÃ:w˜}j- @`ñtp0å_Í—ÕºñKO¹yêGL©ÑTwlºQ0"€ÐÙ˜Ž3Æ`CÊ‚>lÄ?2µŒo…·)Lvù*ËîÓVýl®e¹D.³ÉÍ¿«²ûÜS-ozªÓÀ9²ÔU·¦æ.|9¾8üûÒ;Ú`¸nÕ¦¿ z•7›ºò¬`bmr°úvÔñÈÄȵ´ÿiÀÝÕ?þ‰ÿ#‰é5… W‹ÿqy#ö€A`¦²e¥lÐÿçÁ 0ŠxØÌçùz}³)ƒâò0cÖóq_tÿ©:¬¤ J¦g©ÃŽWö¸:|Á¡G‚×yý~*X‚&i î)#VØÏXë÷äAMTšPk?CMäGÖÄôØš¨á°‘b)‘ZŸTu Ù²â‚=]izdQLE‘§Mã"4w]p(…2ùfÔ„ÂŶÁß÷ß&\ä#ÉAÂJ0“BÇ&˜:Å€\" ¬lYÑ€ðæ@ î0êSæÕGiÍÓÅ=M “,j6>²¶_õj{Y¼këIý°_ëáo÷'k»²„ŠO)íò‰Ò®%Ñ,.›Ÿ§²ßvU°ÍU€hÚT‘ÜÔËû#ª»êå<Ïg,çYbvmœSUËdÕvSË¢ýD)ƒ†¸Vù‡òÁßîu^xöG^B|‰±s÷fÝÔ~ •®±dédðP÷|’y±rÃi+ ‹îZ¯iÃ/3Çࡃ…Ó$Ã…H‰H·.¾üõ§Ÿ´;Jª~öNP´ ˜t¦1Érµ)GDY”0}(ÊbyŠAžìGÙðQéÂë€W0GöOEÚs¬RḻÖxÇâ N·mû†{4mcñE­Ë4cù0äM»Ãexn´ŽÈŽ’Ò$ÿï¼Ü,¼ß+áŒBê%™Î4UÉË]£Ù¢a Òt‡G€1ÄJûÅ0j$´bZì¹ßù™ÉŰi]Õù:÷žsš¨€2„Šbv C…~YõS Ó“jãu…ªc݆*l/M®ïòþÓVI[¾pÌ´é‚ññí3¶Ö]Ænï›»Žø&tU®^(T-üó¢ñ”ŸpWëâ]Q‚0„¿6~Ìhùê9”iM£Äq]ä; ƒvN‰Ö0²ìêMs—…'L&"@Ù߇°úkÒã’"hÒ;Ò…O«y˜4ªeÓM>.jò6qðŸƒG'!”l´È:.dÏ5 eÂÕ9æ!ÇJkÒÇCÑvƒç‡/ÎÜ–<‹à0E‚Ý–<‡Ôn[2–Ú&¦/´-ÙþµoK ŠLœe[Ò±bé³mK²È|û¸Ç`È8Ç<® GN> stream xÚíYYsÛ8~÷¯PÍ5a‰˜ÇÍfî+‰÷)›JÑl±F"5$5ï¯ßÆAŠ!YŽ¥lMÕT\!‚}áC÷‡&žäðOt>‘”"ÍÔd¾¾ÊÝhs7ñ7o¾¹ÂaÞ &ÎF3ÿy}õ¯9Ÿàé\ãÉõíXÔõbò.{¹,6i¦3JiÆ¿šÎãÙ¯M}×ëuYÝù?Õ”¨l[¬¦3BƦzúþúû«W׃vNȉfÚ™íÔc;1VHM„bSæMíÊÕje*«vß+"‘„»‰Ö ,³ ت²ºt¦;‰ÔYWÛ«Ê@Ò]·ôcõm*"rŒ”’½T«>©›;7¬º "·Sœu›m÷~ë<3ÎWÛ… ¨Õæ@t‹. è쿦©ØMÛ|ïÇoì%3)ûhÆŠõšþ÷?¦ì›Q•#¢!â˜"Ìýäÿä<·‘°‹[W«{{Ç\ÄdVo¶«¢KªT EäÀ‚°Ù»|І‘6$Wp#Ήþé’bD1í…|‘ÒÑ$©Š’"ðó¨¨R;s13«…‰p‘*‘A)Á |ütMµèÊu2²TÁZ’ÓEÙzßpåÙÿz9{óêõ ?Z´~Ôâj֣͟ڮàY¸qœ]/Íx4,¸†Eìu–V&¤‡ÎásS΋•C an¯,›O@Ë¢ðóé [ ·þѪö*Ô^%Œµn Ln|ªI½]» <vÃô›°1œË~æí¶šwe]Yϙ̊j$uþ­Á쥋"ív>7m{»]ï%·™%9.ÔXy9P ‘¢ÂËi¥Ëò¡ý*Ö|Â%ìjXŸ=û9¤‚Þ†V±±fL Œ9YL‡èÿ¶˜7æ÷„b )¤ŸE±"PI¬Ø&áy²Nj(§T¹øp*ýìw_OÍÂü¿ß¢É9  ¨Â(ͯÍÀ,'<Ä÷ƒ÷öÃH·È£ „h\ò (" 6ì«·~é ¾ BÉØ,†Ç¤c ygeRR©DF¼Ø€A¥DÞ'â:V xTP08w&{íE[á”/„Ù÷zwàÙdì‹+B g¨ xG‰6ŠP 0ð‚1}ƒ´½‹?ÔŽòÆ•”&• ÊELu™ÖÞߨòsŸä\¡|XÛ›²*;‹…‘qb‚-À‚…’®ÁÀqêÇoÏS ««ö< •Û»©ªwS7½ƒž§±ì΄DíxŽ»1–Ý6õ:°¬ &2êÕŸ]S̃ˆ—!Ë[6â£X7£B¸²}OCñ|V©Süsq4Áö8Z²ÍH.œ¯GªÃ%‰'K҃РŒMcºÂ%2Ï«ow¥ô¡S Ý`¼»Z Z>óæ„äuºÂQ+‹ŸTᘀµàç©pV–ô´ wÅ¡ÂEŠaR ü‡3sÑRWVÉ:gºûIÖ9¦‘Âä”:GžVçè‰uNZç kÈ›ŒzáúœB'/åDÙ2ò‰…î¸3.­øáðº*òÛŸ’¡6p,&ŒÂ üY>ZÃÌŒh€G(æÝ‘EƒÌ§Åàç0{nâñQâE”Ð’á‹rMuˆqøòÌ5ì5ñ,žÐŽx˜!_?8Hç LsåSˆ}„(p€£Ÿ•)˜pT÷¾cœá!…KPˆ=q©Ì' zûV×[¬µ M5oî7»"I<İœÌÈ’êqS,°[öL1+³¶eΈû°ëm®íÿ7^^*w ?«ÿi®Ô$©Ñ¤íMeÉFç€çûléð¶5vHήC /Ãæ¤Æëj‡nm¥^û(Èÿºîm°kß´]™b{%ÎØTH윎B°ú"„ë±¥q¦ÏѰ¢(f{©ý´ë „ߦoj±O@1ARè³°(+‹Iu‹:‹âÀ¢"Å­ïùî-iŽA˜>‹V{P7"­'p7@•…ð¥¸ø}„¿A!ÑX^ Oqvþ¦Ê…œ¥`åy § (!Ãó7ü‰ôÂå¾=ìš¡'°7[!'âôØ®›ÆÓ·¿éÛúÖžLßÊêâä­¬îV4MÿiÒZò±´ìÄÙ‘:³“öò¬®²xxHàú u´Ï¸Y¶.·}ðúý<¤±‡ì ‡4åaš ¾ukÉ•erØ­!ܯÊ6Œ:¹± ½·Æ£ÆêÆÏùhu¡É´ðc‘=\Ƽ²õsÊþÙ2¨¨nMk?Fq,ÃG¸‘5`ŲÞ´Én"ÆÓ9ôX¶iʺ>¹Ø7 Ó|ò‡¢ ðD,4œÂÙ9x¢ÍçZêÏû­3Žegá€Vf'vÒ΢8pÀHqíÜþ?Zh‘êýERÿ+4ÑŽ ‹=¯‰Ì„sìD‰ü¢M4 %:ç Û£anËÛ¢ÐÏë¢Iû­†:QŒ‹ÓhØ€¤ÛUq—Œcaäq¶”3„ÅÓØ’üK³%ö$¶¤ŸÙìñ³~[étYtýŽi¸ endstream endobj 1728 0 obj << /Length 1745 /Filter /FlateDecode >> stream xÚíXÝsÔ6Ï_q¾V­/ËîÐí!3í 0ŒsçËy¸ØÁöúßwW»öÙ§„rP˜dbiµÚ/íj‘œEð#gi4sZ‹Ô$³ÅåQä©õÅŒ§¿Iæ 1p>8;úù‘µ3‰4Jåìl5u¶œ½ ®³«6¯ç¡Ö:°¿ÌCclð¼®.êìò²(/hᬜ«$Øf›y¨´‘2&š¿9{rtrÖk·JÝÑLä¼ig:´SÊD$³81BjC¦¾Ž¤Í.T»ï•’Â̈½&¸[“ *¼éì£ ÚŠ\ª¶íÕ¶¥qÇrÑ1]íš–X©@­³õ„`\ÜEðäc[g –ôôøaøìª-ª²!ª®.I&.ž¼l¿Ú±È”Džæí¶.IÀ‡¹µA¶Ùæs ŽMøî"aí|§­¬üåoá·;§÷ý¨Ø‰,ˆ‘Sx¯ÞD³%,>™E¸ٵ缜i¡œ†ÑföòèÅT>)'Eš‹D;2âÙSŽ+DO“÷Ív±È›fµÝpÀd©ErP ¸OrB #9ͺ€ß›öKå„Lí,V‘p `Ï~›¨ÞÒ’±cÍR+¼ñ²Õ+~·\Ôùû Å.1H?ˆâDAn«±âUU_ϵ ²z™oò‰£³‰p.>ˆ*6B);¶àj²¾¢T8cýéH%‰óÕ£y¢ƒm¹Àt‡ì|Ã;c(^H/«üÁêÊÜuéY”P(VY>Ú·è·è6»ü– ˆ£±‘ˆ”îļŽlÄÚF·øcz¦—”=>b¡jh›‘Ýý­±ÎÊ%E|_ªv" óÝãÚº%7 „JBÍØÔ«?·¶ÆÞÀYAä½(•rmeM)§œ A˜Ði ¥¤…´ûy¼бOO9åyÙ;Å2åD Fi¥$U¼w 7ý1˜n«`Æ—T¶ÙTþ¦^dm¾$Úù\¹àï]> ú‚I„ŽM§ƒÓ¨(‹sbàÇøŽ„Z°}bˆIW•5Ðôø&pÏWhi²ç+ßñä,ÜÜ1rá Ù»E½Ç9· VÃv¦É7KbÃÞÁ‡µÏqM z4 /V»>C-ˆ;^)ÞîJ´5ÚP°î&oIÛ^7:[Ã&]èŠyv:—ÐÿÿôïŸ#íþƒßO%и P7N‹rYà±6$ ]gm7b™m±À³~‡bòn±¢ï¹O f,"ƒ-HÏq°ìÈã=ë %}@™Ýƶé½dñ°¥ú°à؇#tàåã–(—¥¥ŸTå†G;3iW·N_ò˜£(œ@Rmó¦½Gx«ª;úf,k{Þ ¡“‘äKŸ¿Wè³ C›t¡ Ñ•h[àeÍg?æ!Z—8×kZd$T´ãt9Ïš®\‰d ”›j2é¾%è)«2ŒØÔ|^ô p·íÁ–4ÚÙÏC-Æ€Nµ ¬8‘wC-Q̨e¤x€Z %nb€™úÂ!ô+«@†ëŸÆ,€jÒô«c–|9Xdâ°Ùÿ€0ƒ5Fh1ö‹ð €´B‰¢àó ¸G"ñívp)¯ü€+ß\Iÿ+\éÂ{'°’ ÀŠVz¬œ@ÉÓzÕéTÜ¿úžŽ”B,j`1Ü¡¹U#cFÓ]'V·®õ{­ø‚8›¼þàë)¨Yˆç•×ÅñƒqúÚ}y]•U37F¿„@p>Œà[’°%žgxAåHÛy‹Ô5V†gkyÀ¡§|™À*ƒsDð?£.£œ$ .vG…ã¢DvB”¸Ðöì¯e4íÅÉ ¡.â@× È4p¿×šO­l¹¬ó¦ÁšÍ_µ¡Žæ®èK ƒuåsFüî£!Œò‚Àí†Sé{@i>/q­¢oÖ8¡zÝKšf5Ó‹r±ÙRíøÙÔ)ô‘ËÀ êY“wx ³é"ù]¹OÜ_Ê) —°Ör(+6ênPî ŠÊ_Õ"¹Å-ÏOF ­ÒƒèGXè\º§Ê„ƒáׂrà49ü¡œ¾#”K>Ê©(âp(‡¢lñ;b¹OO?žžˆŽ— D÷cñOÊ™àù©Gøç¯Ç €Üã§G¸À™8~ñƒ=dãiíî+‹¦Ùb6ИñQ‹†ã&¯»e®±¿}·÷Þ%Œt¬KýûR.½dD @d,êáy]H¦žTcÇ  ýûNvïK:Iýûn.xOƌߗ†Yäj§ã&(úwT{ãêpK£0ÿÿhäîY~;Á{üöXÑ endstream endobj 1735 0 obj << /Length 1860 /Filter /FlateDecode >> stream xÚíYmsÓFþž_ár§Ruoº߀„N(Hûܵôþy ±uRJ·GRtÇ3ø1·uÛEÛ¥ÌÇžyZ¸½l ½dð ›Íê¼i°ÞóÆV¼%WèLÌœ@˜W]n ‰VWsòpN?/“›å¹‰ô^ˆ…‚Ï©ˆá{VØ„Z‡Ü-Š™3±vô¢<],gï¼®@É(GpllM‡ ¢°y%9 ¬í8Ý1n«u÷–Æý+s”·ËÚ©u&/sô`°iÀ ªW u6•UÆî}âKnš»­åÍm…ŽáŒï?Éa ÝH!tu¦Óíðbšpºü£˜ŽŒ0ÛáŸ(vø§§Ø>€®†ðOgåNtsOöºÓ—%ÀEšAoЯ–èp$b±® 0YÓß €a¼¯N.ÓÃHŒƒÃFñm˜ø±HLrÅ1É.Q*¾‰I¸1dF¦EeîFb!Oy ºßó>ƒÈÒÏ"2Ø[ó{@öd6¾Þ«ðÒ†Ùw—µGC¸GCÞ Ï¤0ÁÃgÏ,œø3|ùâx²Ë‡Ø&´ïñ®‹rÔð'5Z9iëÇÒ*ú®}+ªi–X ´î3Î3<þшÁÇÑTiðÜZúºg¹$Ëaׇ×6 ¡á<8l‰ra•\Ó ÿìêÆH:å÷éK~Âk´ÀAþp š‰L¡áמ…¾Ùk–ÓBD•äDZùç]ÚÅ Ua`CD9ç5ôj™ÚÌM>¢¡õ(´à\¸m ?nOQœÅO˜ÜÉME+‹Dé[øØ%h³’ÖËÓ—åÅ\[^¦ï‰À„0í¡,‘²íØN;ÖSÜCA³$Á.vbWðÈê †æPØ öào4‡òþÞ2‹2Áÿ‰“Ï£Œ´T_…bÀJ¥ûþIâÈØçûÿÜãŸî@ªÛ¨gÿöp“ëaŸÈíàº?™B ZùW³p{}z¯¸Lu6ÑzݱÞJê=Øv\Ó¸jàa] ¯4óÃ+ÍzAÚÍ\~ÜŒ«à‡ ¨öS Ü=®Ú` ÚJ÷œpÞÜ wÛ6ú dš5^/°€†ÀaÀ£Û!œq'µÂÉ„»i–H{“'‘nZ 4%X˜ÁâKø’Bš¯Áâð÷?ÆŒ1@ŇûD雀è€Þ&¢ƒ^àÂFÓKðxuÖ+´¹–%Ž>øèºFa×í®E:áG„¨®ZË+Ü¢dgô_rÚõP\›Õm[\ä[ÍÔÖ±$nR>asjk9·që<#|™Ïîwæ» Ô¶ï]L'¶Çtf;HÇàÄFîÒ1© uŠí ÝN;H×S\çe~…S5û :p\›èGD—pÝ×+¢øâ}Dg}F¿3¢ã["ºôËãWúó¯Et Ÿ2qèþ·ˆ+ìo~Ú^ endstream endobj 1743 0 obj << /Length 2283 /Filter /FlateDecode >> stream xÚíYmoÛÈþî_¡TqÜrßø’oÛiÓÜ]îlE‘ Z¢-ÂéÔ¹þ÷ÙR$M5)NA®À!AÄÝÝyŸ}f#ü‘‹$XDZ‹ÄÄ‹õî,p³õý‚>®þv&™ÎB@ùzuö×7Ö.d ’ ‘‹ÕÝð¨ÕfñÁ;ߦmV/}­µg_-}c¬÷s]Ý×én——÷´ðcZ.UìíÓbé+m¤ô¤QË«œ]®zîV©/)?#§”±ˆal„Ô†D½È@P)#™ò;ü5Þ»‹sÿýc›W%Í×Y™=¡´émÁ¤¿Ò¦÷Dž74×d­@ @"_†ÂXæ²ÚÂ&¥”wuùÓå?—týþõ—4W1¥€¹YJ/_/}é¥-|føÕa»…)þʈ¾RêÿɺŊÖná'ò˜0oš}¶!‚¼áÍ·)nÿÍÁÔm3×ïUÒBZI*‘üZC¨„ î6ÞÛ–fvpxä=Ó *‹gÚ„Â9v´ µl;¢p:âG^æmŽA‚«uöiŸ5íw¸$½ª¦Ù§m6Ý5¶Œ¡ç¢­Åð›QgjHV@Ið÷i‹‹‘·¥¡c, Шø{›6hçáTZ4U·cF`¨H‚¡îºcó¥sµQÆÅŒ: rž®»ˆø´ïc£Í6ßÍjD6‰ Û$²^Ýæ»ŒæÀi&+64Ÿ¿ ì4ÃÙuE–Kó²¡e¦3Þ&kò:ãSÒÛ¦*ö-/eÿ~Ìë”3÷ô¬ïÀkCy{q)‡Z26{Â¥äq4Ìã.»xëUÖîkNÔß–$)öØçïÕ€(6²pÄ`+goY•~À öÑGRßÏÂù3ÙÏ, V‘«Ë_Xà ú Êá'‰»,|e„R!‰ÓlsøÛÕÀO}q“*2± Æ–·ƒÅÁŽÂÆjñäHw #ŒŒá«X\ŸýBEpÌXj%BcÜY:aÆ›5ø|†qCuƱ‚º«ÆŒ7yãìú‚³•‘Ꜩ;æÜBEhrÈžÞ‰&ŽOÃ; E¢ã1ïõŠ×6ƒþ‚¿yyÝµŽ…'º?Îe†ÔV„F$Ü¡*"Êo–±ööåÚe²ô>òÎ.S‘X«\,ë¶D]Rå%äU–Ãù†‚ë†]}Óþf &x¸aaÂ`(ŒŠ¬€;šOü5°3N†T:FuD×”<.óþÂgª¡˜F éŽ|›– ¼é©:!Ì0W_±ˆ9®±×Çò5L„K•…²Ì÷5¸(€«ÿ.Ý- HdO3OyQÐ×_äøȃA vÃ(ìsG“)“ö-šâ9 Þp{zx…BËy€´Ä´†jˆXùú™&køeŠÄs1AŒ4®³´Ø Y5|ZÞÒ/[g'C6Ü¿ÉꜤÍ;ÜócEæ@ˆ×W‚ÅS«Ì©9B¾§ShŒ04dª„¡ ‘uQßÝœƒ8H†ÇåÀ0|€¹ Éӡ£éx£iGû°É9Dó¥(`Æ/±"õD·Fz«V º†î>pE»­ö--í`–ÜžÕàº]Z®yÖùÞ‘¹L€ÆþŒ·û¼qç:ußká ¬ÚŽóm×ü„„šgüSg„Cé®9ªbnxÀ²nH’ÉNÐûêûŸ®ß®./üŸßÿðöü_þùß/Ïß]^t‡¡û°Q cì+s¨°Ô{ãÕä¬ôq6x ·Íµ§6÷×®5¹#µlU7ÎÌgöÎÄÁÎõûMK£C ƒqÀ ÞsH=hŠ`{),4 ¤uF"dåºÚ×é=!ºIÈÜîÛä·®ÿ´çæJ gím«²â‡ îHŒwñö»]ÿ`ogh¢¢>[*WÛ¼9þV€]UÚœ‚Ö®Þ êç4N¾y÷ó;î®§ÇɯÕiˆÀš“4Dˆ”£PYCtÆÜS» íÁ‘¶È€âQ|þÊ‚âôGü«™~D…@˜Ó0´O¬=ß@@Dˆ>¿R?â,í:’êX„BÃ$>ô îÄc톑V“*µ"ˆäïi7 ¶Bë ‰%ˆuøßÛ (̉#5¾3>Óv$Ÿm;l<8ôÏ®ãÿ°ë½™ùÕÃÿðbn/æ&Óséùx¯¼‡«AÿvŽ”Œq²†–›àBJ?“‡<œzñê sêð«(îõ:{l»¢<ÅIh)Ç ~^œ sByÕ錙ð…a‘ßñÂ:-NÁï Èë§¼á¥þáuåžîóÃqŽŸ“$Kr´!‚È…C’ ¿:¹ðûð‚ƒ¡ rªîýã±;uüЍq"ÎíÜÿF<Ï0é!=|“5éô—hϱ‚¶ÐÁs€D kÝ%>«ó'ékÇúu¹Á×jì. ìVåÁqørpÜÚá)C¦á ¯`q ÜCŽhÆu!5Š|—O«-tµ«6|Gz5<Ù%Y‘­gê_Ý1yÀ{ûîÌÇPiþØ »S Àìaž‹ÌÑ·Œ¯ü0/M°ì4óÒXÇ_ø0ÆŒCGŒ¡›š‚¡< S®ð:2mÚ¦:ZF§áª- ÎpÌ¢bgÔ=O¸ä­œhÚ< ÆÏžg8vUò4!¥b€R¡³žÛ±ú+>þC8Ý€w5Ý4Ùó¼­,€¹ä¸R€EMœŒ.—Ï=úËBÇœäÑ_±ˆÑ•ßìÑ_þ‰¿¿ þÆØúdÌÇÿ endstream endobj 1750 0 obj << /Length 2140 /Filter /FlateDecode >> stream xÚíYmoܸþî_±µEÅŠïÒ}Ë%¾ÖÍÕ׋-Š\(+Ù+ÜZë“´vóï;ä µ’,Û{ȦׇXjHÎ ùpæ!Í üã‹,YX)Y¦ÒÅúö,ñÒæfw>ã4.†ñ`ä·«³?}§õ‚',K2¾X]U­ŠÅûèõ&¿ëÊfK)#ýÍ2VJGov7M~{[Õ7Øñ·¼^Š4ÚçÛe,¤â<âJ.?¬þzv¾ê­k!ŽtÓ|ÁOÎS–.Lª— ]}S‚£àS‰>U×îWEo߼ޏëª]ò²^ÇÝÏ]\Õqû³óºüŒ?%\ç78©jQÖ–sq€_17̦m­6n„R<Ú‘jײ}[Ô[o?cëÓR؈Úݦ¤Fµv ] ‹ê×±ó ë´es_­a4Ø2¶Æ‚eš{~ù:^½]Å—±ë¾Zòèíù¿zg%ã} Ê âª‹jw¥ /ÓàHÞa‡wÉ7z—,¸„²ë]3¥a ”8½÷ vø…s#wøû ½aÖºù p*‚3­mÙ¶ÎÕa ƒìø±6»[üÀÙ°WyQT.RB÷=Žd²¸ ì®Ù9Ù}U”…ßyžo„we·oY÷K­£|»/Á½ohî´6aÚjP1˜J@«wuœöˆòY¬ªV嫤€üqÈwþ#…†aAðŹg“ Š…bZKô¨Toªpné$–ñL/L’°$±îH¾ÿ, è„bãÁ½](¦x ­íâêìG<¸cÃ\ f”ZhpÀrC»[¬›ò—ÃÖ0ÚOb8+ÄØpSÖåÃc»Bp¦äi°4Õc»wsðʲ$Å=š²Úûï–©ŒöõÚb} ™R Ë´~7e ÉÒdU5 A Mú—÷£ö#™6É(Á¤é¡ùS¢²“ ‡_J„AWˆµ?R1ôJq&¬ Ã7y]lË9­Ò2£Ó0î¨ñê ,J˙怫™Ém²ýÎH²>Ø™©] Øç^•2t ó¶æsÁÀž¸ M¦€®ä8XH>r,9œ?Î(É–h 84\˜ Õ—aŽ«?ó4!%„|»Ýùôë2~2*C=†P)@@ª®:‡†A ã”ø×ý³ÙXËPÉå8qWp+g6K'±R.Ã`!Ñš(oªüSÙ—è¹ yÔÇXøÚ¾º«r[Pêu=&k#ߎd˜<&Ü!äcõw6ë+³krß빃k}r©ŸÚ¾Üù†«^ö îàwÞ ñ'~w~yþσý¥#)%‰«< ü`¦#[PRñå²lK´‹ØÓ}ÙÒ0χ@èùƒkä(Ç…ƒIùÖ±%ˆÕŒj²g <"UúŒ#Q¹’ /®.>æBm ¨sQÉRdDq@Jt–ÏY²™ù•rƒ6èæ?«»ýÎÃ7âs[ní¤w==ƒÑÕvKR¿ÓNv Kð±ÙÕ»Æ\gã…Ó¸ÂÞŒ˜äÒ<©(Måaí½bl|º€aU×¢¹ˆ^}ûý9Êz€ÃÀ6È= tS¯É¢_<tÕ-Ùódd¨Ý;w.ø™8Ç.è4ê]‡»¼mK¿¬’ -¹x<ŒôÁs>>(x‹Ásdì½$«Iæ EÞåØù‡î8ó†¬î®g@w`¨{hÒ)…SFH€ä]æEÙüöts6¡©)Á¤=•êôS%šq“ž„`ªD±ÔÚãæI Á¾_iG ¯ÎPM¸æ eNâ)p"=ö`žjJ ìèëQÍûã}‚m¦¶[ý†l3;–mf “@]dš°T§_Ä63Ådê5!Ÿ'›ž2ic'wàçIgö"éÔ+~çœÿÇœ³§.™<÷ð õ”©=hROß‹„Zzº6UwûÂË 8PO“hªÓ þ ½úþâ›ùj™ªhu>ãOÏQƒÃË•í_®|«ÄFO=ÝGƹM²fºnГãÏGë®í ¬›4â…¶ItAš‰¶A‹V Z’Úæüxš˜™Ç6 (µWb¨»®‘¯.uY1ïÝ1Šx“›ØQãâr°ö^ÒÃÆø› )CF"Owû-}†g¶eÑ4Uëá(Dá„?êPÖ!ì$÷¼áézE}Sî²u^#ã“CþÃ],Päúañ€¿ÓŒf¶вÁÕqÌÙ]–&{ „¡;Œ0v9ðádþ.¿Ã»ˆS7^—úËÚg”WözKµþ¶129¸nxµäeÕÎ`«_"̸¡ƒÔÐ3ÝÁCaOP{¦;M^y?»¡d·»ž>¿Î’[ù?CnΜ_ù•gðkOÃqyæÞä¸'1Lwd8Ô¼™gÔ Fñ“XvŒUʱa·Y³äxŽújÜ–ÂýØ[Ÿ’[ëxáÜVþ:n+NÎm`Æ –š/zHU pZ·” Êȹ­.í©ÙÜöˆ˜öf)fPÇÝS-ØÔîÁý‹> stream xÚíZÛrÛF}×Wð‘L™³˜ûLÞ´±ã\jËŠÄ7Ç¥BHHb…"´ãýú=sˆA‰¶gSIYUÁAŸîéÛéé(Ã?:²ÙHsN¬0£ùýYæï–·£pqùúŒÆuS,œ¶Vþ{vö¯o¥ÑŒØÌÒÑì¦-j¶½s—?TE9™rÎÇòëÉT9¾(7·e~¿\߆þ“¯'ÌŒwùj2e\P:¦BLÞÍ~8{5kÐ%c'ªéVè©¡''z*#å"è¹½[⯆ü­‘E™&ÔJ¿X0餽}—øñ‡QF¤a£~éý ¨ÁÕjtuöS&åŒ(!Rà_ó²ø­X+¢ }`ÃÈRàÍCµÜ¬·‡ÈŒYb ™qI8OóÅÂv#‡qƒÝÁÿ@—aéÛo'†wë¹SuBÇïâƒjD)±R2÷à”xZC ÿÌr]M2ºô:lðu4÷ºAWYMD#ãçLfʶW ¯]…ñüU”ÉÚŠ J˜fõò»|½X}R¹& wâºAâÕ‘€äqWªŒ#ºÎ µo8Àyꛎ1Y\åE1a£s¶kÚgË”a•ñSx—JÚ Þ“lÚ-}šWœõDx† ˆáÏ1ŒQC,7^Tfc!ªú¬ÒÄèFÉ!}Á‘ƒà }&O©Di·¨ÇëI¼£P¦j¡¾2Šº a·Dý¨ß¹|?W« J¤ÏóªX„{¿L˜ÜgF+¨…!9•µkÜõr½¬\€·ìHÓÈjÙD9é5•IxËGƒB =ÑÚJ‰¶¦cë/¿™^¾ú)û~"Õ8/—ù/µÉÕ&ü²-ªpŸ0üヷ?.ú9£¢X-ÂÊåº_Ùˆtå‡ÎîèšžñŽ®.põ¸*nëVöaYÝ…«ºŽ&J»*ãoàAÿõ B£€‘ìÞyýˆ[ú&¨—ÈlDø»383\=”Ŷ(ß;‹}˜Ä=û}¹­b›µÑtŒe´ñ¬n[Ÿ¥ÛtYT»2êIHÞðuoà 9 ügíG£BWß}¿ž¬WɨGR"™ýĬOû‡F^[áE17õÍÑ ãi7ŸÛíÍn7 íXSj‚œ)CÏ2'Ò)4„8Y”žÆÁì ;_yÙW¤9Q–˨%T¤°ù"¯ò^v€‚c˜‰ô@ N¼Á×mü?°œèÓû4‚ÀO$æD‚ 2FŒU ËÈiŸÇ)÷¢O2ä;N>«§JBÍþi©ŸÑRCßà㲸߸Îù~R÷M1¾˜1>Ÿº6ðÒÝ>wßg.›ÎÃC7åæ¾nV=íó²Gfuw6fÑaƒvBÛá±$¾l ÂþKõ-ȉrÕù‹¶ $ÕÆÒ‚œ,Q3ç§zÐ À±%À·EÕã.”7 7 Ê2ƒ ·ƒúHR’Haþ°ö>ÖÔŠ?±>¢‚Þ¢’¹QÕ„˜Ïí@Ü ‚Iνuí9Þ€PA¥ÒÏQÙ䘀æÎ‘Êêç§ÚîN”P¬u\‰µCàJI20­7©zv%HЦ§5«½Q¢ÑûÞwtîzé]禯úÃP¢Î5Q»ÙU}Ò1ÕÖõ×vùߢ‡aÀÒà©ìšàÂÃvvíxJ¡wí3¦¬Šãg æIþõ;¤éÄôß‚ñáÐm}„páδ¦<¼Ÿò<~€ ’L8LŸTIéê±î(YùÍuOéš )ž(½Ž©ƒüs„—¦Ïš§92Ÿ£%;QˆÇË—YÂÁU”•Â&Û|$xúºêò4…$A ìJv|‚µ»*žÞ”eî»g=ëâÃêc\’FaÕ/{uÃ]ûõJuõoªG‡ŠX_×:yîjaM{£xj”hu$äÚçrµÖØæœ¤Âk—^ÌRw.ò†pÖ»Äþø£,w?ÌÌ2O_öÛ•d£/!~y˜ÜÕþìË}»8‡Ž—þ‡Ÿ)Zt·u.c†ùÁŒ›Y¶Ûp'ø©\nvñÆr}³)ïké­g Ô‹p„Þw¹ð-߆ߗ ƒëp9Ï·EøÑ¹ÆÝÉÃ×cS ¸Fn‘BÎÌsJH<Ž¨ÌÆÐ NïÁUŠhŒúCà¢ui•ÂÎ^_õ`‚äeaZƒ*@SP×Â$«-v‚&§ }u<»ÖãìùE«£Üåu:¥¡N^[C0B¬LÏo›.Ô¬Á“.l~õCtõÿ4 302Gå†(w´ûE‡aÆ(Q\ 2 ;Y\ÈÓ†áA€ã0œ?: Zà êñ±²aÌeÀš¦ÀÕí¶·ï¡M k¿À~Ýhòv–)Âÿ ÇÀn§ž·xÊ>ïE1µ bÒ‹ê©!5vbûÇ á(JÅC¸ųöËïã~âÍГ?;ÕFïÙãoŠ:žRÿLuCNuàõ¢OæZþìù¡twþMkT8|o]k±ŸúxEÍ«P²I¯~¯Ê|î€2ꙓ¿€ªÓš|èïu¿Ås÷¬¦ÎîªõÚ8cã™çÉRÿŸù:,iøîy¾ÓC ûØV‘Ùh=ÆvîŠ-(ÍTêæ]5ÜÔUÚ¯š»÷Ô=Áè^ ª:ÁxP¢‹Lêm21:ä5dèv&µê+¢Ãȸ•ÄHúRD¥%\’USq +@‹@EMà½mÔ^&îø„ÒµIÝl’ó(çF ©óòÕe¸³(æ!q]Z^þ1ìÐðW1]@,ojQ^¼‹^b=5`º~øþ»ƒó7C°k7ÑdüTrí´ùµyÖ© endstream endobj 1765 0 obj << /Length 2093 /Filter /FlateDecode >> stream xÚíZÛrÜÆ}çWàq7%Œ1÷ßhKvb;±,2O²Š…ì‚ä––»+\¢¢¿>ÝÓby)"R*åK3}º§/s O2øÇ“‚ÿ„Š¡bŠ3ae7ýºØ­·å”Ti™;aÞ+’xv$"ež1©d+˜µc)Û;HðƒF°¹bÒyA6ž¢¢Þñ)SR¡Á-Æ&)x˜ëqì>É¢OòfJ¼ ftóÉMÍíar·Œ`Ö¨‘ìÕ~W78T‹¢\ÕŽ1nè˜ADF@B3žéP½ù£œp „Ê`/äx‘SœfP#½$öäžYæ¬Ú°-wS¡­ 9¤D6Ÿ26•Ü1¥]p0ŸˆÙ(]¡–qa:©¾°«®Šz7„¥~ÓŠ:\·Û=Tx·XM¹¦{ÿZ »¸½ËëAN*Çä§C:ov›Ós`H¤˜…¤{ß²I[1˜sÈ¡”Cuv"šc[9³¹ÙúóëïÓwo~#c›}0p¬z‹uë4}±xŠãó¥S0 ³ÙxœH« (çöà÷nÒ+“©Øø­ÅUvQôþòAý^Ѭº,)B"c"7 j&¸~fÀ ªN:w,wãSb«!è…œ¡F›|$p ™2{èèÕŸ‹‘K6»CêTQU…G¤­þ¼i®ûFRìÈÅ¿—Ú@µÇ$Ð{ öµa´ Úçú(‹7,S¾!ÐEL¯¹Œ5WhÞG}¬9D;aGªžbþ(©»ò3 UIƒ¢m®K:A6P>øû~ûý«Â‘½óÅÂOÂLÅkH_F¿CœÓ¨»¶u¹ŽWŠºöšgq$»ªÍ¾Å*Çq§.÷ÕMPQrAÕæ+Õ-Rô¼èÒuUÔ%=ñ›w úõ쯃ŸiNdLKìM¾(-€n½(Õ‘xÚÔû°*Ë™±v\;j¹ŠqÏ<›•ÈÞ,Æ* hÙ”j:ìùøfW|e”bWØ&Ä'D ÏÓ·t2(5øÖû»£.kºÝ¯‚ˆ«Âš=ݹ*›ÑX‰>âeÁkyîãþ»¶CÙÖ{’‚E|âT•Tæ£C5XEîS¼y¾h®ê‡Ž_`üph÷eïóõ¦t(Mñ7³ìøÀŽ®Ý†a™XoªrÕlo±r°Šê\UweÓV»¾Nj_mÀ‹ßNòhglO‹hiPëXš c}ÙDåPeµzIè Dú • ÒáןC¥ý=ã2ÄíjUÖõe» å>n±Rl[P 6M®;Çëe•1лÉYzY”Å…xZ/; pèe#à{Ù9P»^6B=ÆR„6ÌJ50t;ª\ )8M8€?:û:è‹^ƒ¸ÕÀ-—_±‡vOì¡Ç&+÷€Õ/j¢Ï™Â(Q¨é#]´ÅSÄçÆ3ÛècF ©@u%3Ù‹ŒF)/JZñ°Qm¬AÉâÐÛÇ47Ò‰GÛPŽ­äÀŸmèÿT:pëøµœc Ïó{:‘ê¦H7‹º©@ÕCwäÞ蘆žÂÀyŽV•)¶+E cbXvÐ"àtjpä•uwìß‹Cz5œè|€wŠ ¢·…xJ‡³Š6êîñ¡ìíöμ®i„ÍÙß„íX——E»mF%¢þ’Å…ºõ;#èShø›’üó—_ÂçôuYl¶mE ¦óNCÈ endstream endobj 1774 0 obj << /Length 1637 /Filter /FlateDecode >> stream xÚíY[s›F~÷¯à:Ñ–½±KÞÚÄI¸­k«Óé$‘Å È®ÿ}ϲ»+![nˆsiÆ ÐîùÎmÏw8Æ^?Ø‹COPŠb&½Éâ(lŸVWž¾8y„ͺ,uVþ8>úþçQÆØϺ¢ÆSïÿlž,›´ F”RŸ? FŒqÿ¬*¯ªd±ÈŠ+ýÅÏI鯒<Ê0ö1‹‚wãWGÇã5:'ä@5ÕÊ=èIQŠ=#ɦLëYÏ3øµ¯ea"Žy»˜®¤½yzSøò•".‰wÓ.]x°K¸Ê½‹£ßú01%(bÌn®ê*]*àmW‚%‘7" Éõò7/IýU1i²²°ÿÎìŒ<ŒQÌ9Q;GT‚íti÷\´¶]&uð 7Æ^v¡£° #‚hÄ­€·! NÜ]ÆaÄEÑñüÎ%]­À"¨]>OŠižöS".;ظ¼!A¥7cŽw¥ny“ Î4RÛDd6ê 3³[[ý“Ú|æy )ýIÒ¤Sýì}@„»q{ÇkL‚טÅ0^Ί¬Qìâ(& oøÚ-H-ã8ƒä¥`G„ýÝjf6Ú»I0Â~ɪ ÐÔj¯?ŠôF[8~y1:?> $óŸè'K0Nøår•[û˜“5s½±.ÆÓt–¬òFß\œƒgViŒ=¢kOh”Ž´Òçi³ªŠ­ ëÓ^_À‰ë´Ó[1͹¼¿9âFîÅž|cP׆X Ž0„o+îL¬ÃNU°oy‰„à' ¢’ÂNK=†@™é”»u“½e:¾·Ls‰"AŒÐ¯©HïR_Í^'„Û%!³-3߆˜åé®™å²5.µuÍ–¼›*k ê×E8št#¹ëuo©óúù3[f™ß”³­ LchÊìt þ™]£·üpñì¤5àÄD«Z”•åšçÇçúiZLt §ëž°œéÏ^E´³îä1,ÿ\üt¿»Ç•DŽð˜„Ï?ð¸ºEWÀi„°)Q‘-Ó¿¾Öø˜LµêÕd’Öõl•÷³–Z΃èEj„Þ”,.ñaü6°á7¸N½]”øé§à¸:¹Nû)Ž"Nj®éWJqaŒbðÔÒb8¬Á§"æ÷1”qÌ¥CFÃþÆp_6ÃAÑU®ÕŸömêp¢3\Æ,—‰5—±>.£’}†\Fy„$!Cp™Å¥x\.ÁP è \¦dñÆeƒ.s€!WvAÛ—9:( !Á1qAÍyí£Nˆ®T…ô#QgS^βþéÐ#¦`Ï},GÁIC7ö¼À?„æ(¼ r¡D ÝMs„©}VI§(ÞiŒ<Å@!w(Ò–¹,¬RpÓ@ÌšÛe¯ëxؾպ®›”EÝèB0Qó¤º#J‘ìFIÉ¢7I\°ý#Ä0Òs ÿ+w4ÆÜï#P]_µóÖ´½ªp°n[•¬X®LæFðZ™%ï­ïk#m’Ín×ï“Mët=ñL]ZÞ4&V~ß]¨:‘&-LÖÖizOË¡åîÃPë>€FP`ˆâ(ŽÈ^¿íq:•(†ÝNÌõîÍÉÙ Qò‡8Û΋u#u?oÓ@1@²PWŽcuW—Ú2í•AuôüC±‰]{GëdÕmVlÇ_-°§nüçÙ12—J¯y€m|» p“å¹=¦:'µ®Õ Öê«ÍFff2(3M`úOV7:¿¯—# †c1D/§DI·—ÃR"&å ½œ’¥äA½Ü À¦—s€—IU’DøÛнèŽ#hhX4ÄÐ]‰bwzµý¾ú6{ÿ²&UšL?âd¢\5n‘Þä·ûa)êÇcŒs°vÆî¨^ݯGõ$6£zõt3ªO;55«›YU.ôëÔVTaÖj‡šÿ8ëGW™n ½­kðç41œP9‚$ÒCiTió/t endstream endobj 1783 0 obj << /Length 1786 /Filter /FlateDecode >> stream xÚíZ[oÛ6~ϯУ=̯"ÙǵéÖuK»$Ã0¤A Êr"L‘=Yn‘¿Ã‹lQ‘R'QŠ š"ªEž;Ï÷º$Âð‡DG’1¤¹ŠÒël?­.#÷püÓñëf°pÖZùãéÁ¯…ˆFk.Ú¢NçÑÙäåU²ª³j:cŒMÄ‹éŒs1y_-/«äú://݋ߒrJÕd“Óeœ árz~úËÁáéV» tO3ÍÊ[vJ°“! †z;cÅaÜÙ¹¾Êá§QùÏV¡-ìbN…‘vvŽ£9¼ü%ÂH(}¶K¯#X@<ÑÉÁï}: £(欥Ð%œ¶À¶cÓìúW‡ÇNnV¦F˜œÌ(¾åÂP-¯ÝS;n6÷¡‹ÙrµfU€5îõeþiÚ %¸%·š0Êv`p×ÊzS{‹M ^ôV 4i¹mgn«/Ø“ŸßÀÏí@c §QF"†¶Rî×Â..á`CQ€5âÝ[§?‡1‘õ&M³õz±)|Bä˜åä4ˆÝ,¡#IÆK#‹Ó=ÁrÅ,ŶÚnç ¶IÊFQK‰†cACµ¾´ûPzÔêÉPÚ8|±È娆n¨‰|FP=© ŽáDF©L)D0³¢ìG{A*€áRmô ú°†TïZn©qÝ'ž2›û†@¶ê›UoÐF”ŽätY®}ƒOŽ«¤ºÃ—Xµóc”•Éuoy„Ê™…u2 ß/xh|ËÖ>pv]¨6%rã¹H¯ÝиD×î¼¼Ãìµ—–æ‹›í,XÛ ­,ô{Ø^.ºHË–îÝÇöBC‰|q¯³ì l›i¤ L¹É;œëG€-‡ÑEÁ¨iDáX Fm(äa®úb¾;a…Ђ°¸O¨wb$R/ÈÄ Drmž‚°:réÖ/` €'o^óyk14ÞËÐl;sù1J}–SCHxCóNÿzøœØi@ù1Ș‘Ä•øºdŒÅ@,€HAÆ€€l?26ŠbOÆÅ 6)úè“ãxLAŠv<^gu/ãÐ4yüd\Ìù{±ÕÞ!cPd7LÞEÆèÓ1½/Ó@Âá/’B<ŠŒÁIbÊJ´EÅz9À¯ˆå£HبÒ6Ø»r}à ‰9Š1ûvïPîɕ޺åHØsœ¨+Z@•‡òrŠÔÎqÇB ì¨Nª*±!Äi6±ØÐ«£¹Dqb#Nê+¿3-òÌ¡«[`Y@[§½Œñ9€2å1=*SÓ»ä_•)c•,Âé~¨<ŠbÊâ´!«]P6§žŒ¢—Rt¨u’aî—O‡ÈÆ×A@þÏÝŽ@AÂÂǸ&‚”ÉÖ]LM€¿€Ä-_|ãÃ@ÈÂ/)†ü#†Rj)’ÒòH£N[Q³­ÞþŠ'Z •ch¥˜Á™à¡ÖžAüVx[cKuð^(†DÝ“ì";gç}™Û7¶#DCGjLÑ/_IÓhÿçCOćÖYå¾%©ü•’'"=b÷¢G€CÇ' Z<%:ž\#,¸…D©âÁƒÒA b¦‡]°˜ÒM3J©å_æ÷ªÊË4_åIXƒ»c2o,VHbú@;<Í¢Ù dûµ«{ωa7…Ã<¼Ì{îÓ‚ÔÀ=ÕÃHPÞwV0Öü ·?Æœ endstream endobj 1791 0 obj << /Length 1531 /Filter /FlateDecode >> stream xÚíY]s›F}÷¯àuÊv¿wÉcݤm2¦¶ß’Œ‡ l1–ŠPR÷×÷^X0+![²‰ÛI3ñ$xµÜs¿öž£ (üaAL#‰¥ ÒÅ ­WËë y8ûù„¹}lŒz;¼8ùá•R£$¦1 .®ú¦.¦Á»ðt–¬ª¬œDBˆP½˜DRªðm¹¼.“Å"/®›~KŠ ·á&™O".$c!“vòáâõÉË‹]q~ ›¸sÇO~ BÁQç§¶’0!?׳~ZÈ?;[ŒÂbUo–\¡µwh0…_”(˃ÏõÖE˜…§yp~òÇ&œh)}à›iZf«`càE>°åDIæ§ó<+&‚…Õ.8g–(Î9ÔAÛ­tg5êv÷pE ¥P<®‰µºÙûîÕÄŠpS¤U¾,&,üàÞÔc$VŠã›‘°cÀ‘ú¼¨&ÐÊÕõ²ÉòesuÙ¡kÚGg–A­ekã=UÔAÅým’pÉÛMçMßÔ]ü3ÊûŽIF¸íöYRLçÙUaˆ†·ïûÆâùž®1%BŠ@+C¤Ûõ‘¦+pè½òláÆ’[[âí¡MÖŠ%âJ¥MA}™ÚnàƒBJ—źÂG¦xægIyOö´ÿ»d7å*•cCELK¢©pþ³šxíç•qÝZ­‡—l'E{µö?Y»çó%L1¦I•M›µnÂÛ»¾íõœ´Dè®ç\»æE^aûõñ3pêT×Td0V¬U,1Öލ(ÖN¬&ÞŠõM³½ŽõÓDé0)óäcqµl>ÁãT/¬³òÖ´™÷2,’…Ûúž2™Í]6òbØcç‚çp3¥ÀæžyAbξÓgå2ª˜…%Œ‹>äðP´õ«²ãžÏy5kžV°˜æ+$!üµõ^†0vꕳWèÉi³Èb-›å«e¹¨#¤×y!œ·é©fÎ^/¨-$̸Z;—.ïu¾ùé4:{ù§b›HÓÏ uøî€žeÕ¦t6 ˆ :t“È‹Á΂énºŒ6¯ºÆ>ÿåWø m༚@)AÔ.Y<0Œüz8ú0Ñ~ãÒ¹®|›4ÍÖë«ÍÜÅï3N„ƒÍDHÞVÆð 8GÄz†G[ŒªÃ~`Çððu6DíTÀ¼•SK¬à>jV¤¨‚ÁÆš˜è*)‡b…qo¡ãF…“!øv¬ ¨[œxh‡&¤[¯~)E5¾„Œ_b.³êv• Ñ#¦_Ruˆ²Ç)~¼²i%”Æhí)‰}j‡éx˜ÒBé“Ô3צ¨Žï—;\â{­ã軥s`jçWP]Á‡g&…Ž!$œ™L?¤êžº1 z¼ koÏà‰µüAIÅ)% í¿IªC%•#ï4Õu+š-ÈØõúU¹\®žÀd 窲Áùý§í–ËMµÚT{]œ%î³Ù4 ×Ío>éDF+Š O”¼ü«*“´Ú40Ì"fÄ÷ý^¡#ŸWèˆX¹K':hŠkö¼JŠ1£(´E>LéŒ씎|¯ÒµU:j•§Hÿ7ø×žû ­`6Yö/n¾–û ÖåÑ_!†î3ЋºÎ`ºÏØ›¯0䓞á-¬MQÑj™DWöýýáë–ý—&¨|¡CúRíÁFð8E ò ·];åÕÝj,ؽsˆhÊŽcùeã땬¡ì¶>¾ßwT@^þ<ªßíq7ÏLøNŠÜeÇ>šâ@$ÏJøÂŽBøh‹Bäþ(ÀŽð=àõ0á3b¹•S¨“1>ê!„ _Œð×_á3Z-¥‡-±VIÿ«Œ|É¥ƒñÑeÇÜR<í5Ô[±ÿÛ«§³}ÙàtºŸí¼ÿ ©–‡™$ÍçEÇò[<žO—«úûöÝí•í>ë)ŒÈ6¦{DÀ©g¾¶a|G†!­üO)˜»Ìò!–à ê¡:½ù(Læo endstream endobj 1799 0 obj << /Length 2265 /Filter /FlateDecode >> stream xÚåZÙrÛF}×Wð‘L {Ð{wÞ›qWlÈvðyòóÉhRq—Œ=QL·òžœrr’AÐ(§2‚P.‚œÛ›þJ–ÿ©hQ¦ µÒ/L:jŸ>g½K<ü¹—iXï‹_ºèa5¸š÷Æ'ÿJñ¤œ%D“ñíåtS¬ŒµÆFÖ cÈ´¥q±»Ï•e”f:áÊ2M˜ÖM®ÅršàÊ,Ѳ#3. ËZF^ç¯lÛ[7D+ÕƒÓcdXüéÇáýýrº›­–Úÿwª¥ÄJÉÜÎ!7p/ IüžÙr7€ÛÉèGçáTÏaãsh|~௲:j9Ñ¢¢ò[&³ÈÌÖ— Â+ƒ§ú¸ù.euÑ…Ùy¹ü&_^΋U®‰’¦\÷@q|$Dƈ±ª§TF„í#‚å ñȽvB-m2E,çž6°Ï·KšRfÈáŒ#¦’¶c&©“mé4óÉeÇYÊß 1.2„&Xúµ……´ñ¤2Óß.¥“ƺJÆbw·N%ܰ–*û‡t1–He;Ñ~©2õD]*ºý}¹J©Â$¡ ÖTeºZnwîRô§N§›|ó€S+Swê‹ýUŠÅa²öéogÿ-þŒÈ§’wa,!¡Æ>÷à¡Ã¼X¦²B30‘hJÙ!‡M,S14ÑÞHu¨=”Ugà ±(«ž?„¸ÕÛ,߯Ïù|…ŠlúÓ|W\†{¦ûw‡œX3¿0„+Qòˆ©p¶œí\b«éÑL#¥ËêdIRU&j9‡ª ù_$²À=]†Žº¾{ýjx6ú”Ý­¢‚—Q+dé¡ÏÒþñoÅ<>Ú­ÒBE.A&^F³s廵7Zò˜‚LK6pßÜ­}½ â5¨„Èß•dªÐœ2zèN·»"¿tr|¹™…‚äÀÁL÷sÚ6ʇ–÷¦ˆ^¨QL7¸å¸Á=|Hºn9†;îXDv7³xuU6Õ~Élî®–1ÅAÈu¦º®NÖŒƒ³b·ß,Ë\$%ÊÔ¾ëï“åøAWy$lâŒz‹¿D#…–ÓB¡-1\=³7hæ êo…'¥2„øð.f D(¶Øî§Ób»½ÚÏ£š Nè PM TìBJ¸’é³:Z‚ê§aÖNGÌÚ`ìÊu¢‡w\E'\]/Ûê¦1+pfƺѕ çU-]cVN„µf­ç˜¿f€RZé.0«#%9ûã1ë1h H"Šª—Ví¡¼#ÅM)¦/|±YI3D›ä+Ä"vMå…ˆî·ùuÒdF¤O´¸P.H_n-®w½†µŽy²´ í¬Êáô…’»´ü €ÏµñM·ú&ÿ ŸhÆK² CÉ–©aºH¾i¡ M=x" ô–GƒHÝ|òÒŠ~ØŠË S¸U Ìàûýåj³ð¿¿¬}â ÁÌ¥"ìþ4÷9íW”(eAJBÙ õ»Ñ¿Ÿ:™ßŒ9¡§:á-èªF÷èý«Ó1|ê£ §g®æN",àšEÕj•™ˆ:šè«¹@ ÅKĤÒë4ÆÙþ$1ÆÀ]tÁ1x¡¢Mî°ÒäMÛL ?Á^†¦18Ïg-1Æ£ñøí‡÷©ª  ³X•…Kܳ>r(cýÕ&|s!]ŸÐ‰ ‘BŸçÒa‰nÜ@"VP^z÷^ R^x‰.¤/P®9k{Wÿ×ÉO£÷“·¯N½+~8»/†vãv­ºCs×ų{G‘NãhKК°Öqéz»kh©«l[åe´œ¢ìë®ÎÄòÆëÕ/Î—ÂæF)…Ú;0=qUÈÍ>¦˜º ×è8HáM~æÀo¿­^íÞÆI -'uè:J¸¿Úø¡ƒ›ìª1Î bcÒS}=£÷‚ÄpÑÅhÀ‘’eyñhà‰¯³™²~ÊÔÅhÀÑå$ì±Ñ@'Œãh Áx:/òM /Á*Y7|µDÊßuî`) .Ũ«Îº×ø¼Îÿ¯Ô™ê¼\v¤${ÖËåû #ñZÎ>ŠÒ$ÚF;A”Öák¹M±X5ÆðxšÉ¡«$¯ÝíÓÐP¸Þ"N—7«E¬n©Wsg šU™‰Qä¯kXPx¢_u%¢Ø‹³‹JD‘׬1îš å§·]T"Š 7Y­‡â´ÕCµ$ Ö… D¹ôR—á:ù+‰65Ýpε’7¹Þ:½Ó3 7ó˨î~xܘqCïój2ØÌ¢ šÿjE/°`ÙýPä%5 }ƒƒ8”Afj«IîUQ»€$FˆMÍâcCdàN÷Û"šY’eìECdàN×äÐÌø{bˆœ<3Þ8â#¾Òœ"­¸Ô¿þvç¢ÿ7Z¬ýœâCåRø6Ë/æ)é »XÎ endstream endobj 1807 0 obj << /Length 1587 /Filter /FlateDecode >> stream xÚíY[s›F~÷¯àuª-g/ìn›&½d:um¿%ÁØb,#PS÷×÷ìÌbÇnÒLÆòHˆÃ¹~{¾³+ˆüƒH'‘dŒh®¢üæ(±ßÖW‘ûpòãx¹% .’ߟ}÷Rˆ¢ ÑÙåPÕÙEô:~¾Ê¶mQ/–Œ±X<[,9ñq½¹ª³››²ºr7~ͪUñ.[/–”q€D²x{öËÑ‹³Þº ô#Ý4’÷ýÔC?QQª8Æ«×Æ…âÖ˜G)ÑZ r+h£àqU¼_ßÿyœ­×ô\ÆyÖ‹%Ä.®¢ÊëÛm[n*wÝ™°­0h”\ĘŒ–ÞˆygT;S/þjë,oÑ €¸]æCbÔH«Æ\´ww×îÃû²]ù[+ÿU[æÆ²{®u7›¢2—þª¬¿úáùòäű»›5‰OÅy‰^„vÌCHa£@€# Àû_å¨è¤ØûYݺ<”Õv׺,ü¹)Þ(³w>˜{9Ì}fä¤hwµO'>+0÷»Í?›ª›Lˆ}ÝÜ£L‡‚½àéO?ãëü·WS:…   -ß$Àœ7Í.Ïmñ›ær·F—|8è¦$ÁçÍãKÐ)IQJ{NI³*ñÕáýÈ@%„D œʯß&ÑÞÄL¡hôÞŠÞDœpPøiýîÚFIʹÕE©p†Ÿ ñõE^Û­)Ï=P–P`³ø@YBÒ”†>\ܲYŒ®ç±,..ZnŠvªÀe´ÄBQ u²¯_.‹wUn3ÄoïPD Amm™Âž#{lTˆqA…¯ï9fû.Óç×ÅíyïAš$øN˛ĵÂqÃ@8íëdqøWI‡®!À©ìubëÁ¾3¥•I’ ÕÉ}ë4žîÁ'A8VHèÄ>5ª—}˜·>(Ð(Є+aUqÊœù¬©`*ì´š¤¦DÃ^¤w*6Dhö‘±Q! Cˆ )‰Hä!±Ñ» h«ŠJ²m‚“%£ŠHÕ—âºc¦*†Æ°5Þa¦"Ǧ“ÊRŸ° +[ÐtDwM1Þ=j˜5þÝq ²èùïa˜Û©† \–òΆ_!eU¶ïƒ8Â~Ž ]ô$“¡RË—3Çì®ÏþÃ#Pžb¡å(èQí¡²)þ rz{ì¨Ñ¾±8L¾ã`G©—›ú&ëf nçKKí¦.:wë^:&&Ÿ¹ÓÂÇiƒÉ<”Bx±¾}$Z Š­—¼NŒh˜MÃèöûÍeG­ÛíºìPÕiÆüub˜ž8®­ù,ƒÑ%þè‰aº‰!ð¡ÚTy1a7U$UóÄN¥ÙˆÐîžy´& eŸx^°Qï ú13ûÄ3ÒZ‚YÂ}fø ^åЄ)Te¾£Í šÚÑo†™aWÚíjËèÔÜ€•À¸8fE«ô°¹…"F•ìt¬ø€ ÙU3Å˸÷ÀÔ,–S\“†–÷íãlÀŸš—/×õ—ÃË ¥ÎÁËFSðßñréO4§6ÓŽÓ¼¼­Ù!i({ EÊÿ5EòI‘ðT !› šÏýã<"é˜&;ù)¢¼Û'ï%J§ò±D90z8UîçÉôSð$¶Òõl<‰ÿ¸pé,> stream xÚÕXË®7 Ýû+ô²(>D]´ÁÝÒ,ÚY©Qr‹äHÿ¾‡rÄc;šNºñÆæpŽ8$õ"Y—TY·Ô=þ["ÖðÔ,„ž*AÛJIU†S…N‚&­CcIÍvZ²2Fy2 [¥&óÀPI^cÕÔih8uµ$õ>¸P8ÆK8Ò  D Æ öªÄÈ ßYÙ%¤šHª†Ä,ÆV¼ÐáO„¢Ã¡ ɼ„¦ZèNŠoD\>œbØóáUÅO^±¤Z,†±!=6t-ÕZÂvH0’W=Æ ²ÇuØCúØ"© a„=Ü7 «ÆaE`ÙZXA€u$¢ AÒƒeùT躇Nkâ¡6eHq¨$¦2Æ:¤‘+„ŵ±ÐqºžX(ÆZ¤ñ]#H#rƒe‘ãëÈ•Á2ÈÄ7bö2t ÒˆÜ`ÙGäH÷Hvk°ÜmàP9¥Œ´C"‰r@¨Ryè Ò஡Â"Wø¤p”_ƒãÂ#k Oä8¢B\:$CeA’$Ql`¹Èá4+H˜ø â-âpJÒ)|é%i©&=ú‡²W‘cÎh•Û£ðuH¨|.ãkÒq„'HŽªv3$rå˜jQÅŽy¤Ö£ôP>:J¯¡4‚–{ÔU¤ØJº)"ws£l)!pÚÝÝíöÏÿùûöO_ýyØízxûxxûø>f®b²?ÛíŸÞ?|x÷úðþ8›‡îçýúñáczQ ˆ"ö—;y‡Ñ‚‹þðÃøÂ“ô‚Ž‹Ç³´ÿõ·ßüéøöÛ7/¿2§ì(æ)P™sTîÈfY±hMXDzc~œï‘žtw—ö÷(m?âïQ‹í“kë§Ì *ÊŸ_€‚´zWã©~×R—ãçñ¡ýÓw¯9<¦`åÉ}Ú??||L_|¸LW+rFW,£[éŠõzJ×d­gÇœ1ÃrÔþXti¿ަ,ôí,PYÁ„}*cŸâ”{ŽÝc ä à†=/cÝWýœ+jë¸jUϹò5\‚°Îg!ÅjV_äâY ÍØ¨r1[A×)'Œ}Åà ­§L~ÍÝfºªŸÓ…3Òfºj[A×däÙq˜qÒÈi]àjì[Dÿ„+yÿÆtú_HàóCAœQ7“À+KP¬ol2â,† os ³d¤gŠÃU!—Zof…>gKh;[RW°µi+ÙZ™5Ç1u ÈÖ°°a–\§d3 Z.°àßÁB_ÃÂ)H»e¦>bëÈÒVq¹ÍâývXhç,¨ngAm Ðqåês  €"s åh:LqÑv;‡3»°ÑØÚ¦Ñ]¶f£±óÛgñ:Šq.y]k¯YŒæ@ÇùAo†®váöÙêvºÚšÛg;¿}ÒEº@픣é8Šaïª>Æ IuŽ#ç\åvš ~áá´V_s€X€®ö€–À«= %ðjh ¼µP¿Ð}ð¾®¾¦ûЗݾ²Ç-€Z5_ì>,pl Gšké¹úíœÎû…þCoßÁÖšþÃtýD²ŠR¶‹]¥°šæèTOã2ÅíVèòr~€ô¢›éŠVý”®%Èt5·.W™™)3nð_€ÿvõIÅ endstream endobj 1816 0 obj << /Length 1551 /Filter /FlateDecode >> stream xÚíYms›Fþî_ÁGÔ©®ì½_?6MÚ&i›ÆÎ''ã!¶˜ ¤"”Lûë»wÄVƒÏÔcÏ¡½Ýg_n÷ဠÂ?L(ƈá:X¬Ï"w·¸ üÅëŸÎ ’›£à¼%ùÃÅÙwÏ„ "&2\\·U],ƒËðÉ*Þ–I1›3ÆBñýlι_››"^¯ÓüÆÿðkœÏ¨÷q6›SÆB0{wñüìéEc]PzG˜Vò§BœŒD´Â)5'À¸Ç¹[¥ø_›ü³ÑT0 s*¬¶ËwQ°ÄŸšŸœè:@Ðx•çg ÙF‰ä¼k8É3á‡å¢H¶Û¸(1P*6 Ê""%í9_¢Ý2]'¶ æ–Ã4¶$Ì@Ïvâ<î×(E„2Á}WœzÙËg3ÍÂ}¾(ÓM>ƒð]µRÄAíÊ9Ó˜x…@Üš4/gX¢ÊðÆûë«Æó«‡ŒÚ8(GeB×ÚÞF"ªŒš¶'AVBç¾–\eS)¥mˆU¬_Åù2K†´2E$Þ©ä¾µ"Œ Œ FwIÇäqùJCwƒä‚p%ûéãªÉ« µ²×ÊÚ3Nå•Ýx—Ç”Ûu5òṄÕ@„aG]è›|WÚK.lwXÅÅgb*u;¦ŠîçTHÂu;¥0„iNµ Òvè\u ÷6PY+uŽ×]ÅùP-uÄ»ê3Ë6Øñt¸ˆËdé⦅Qþu¨ìV¸&LòÆG_Ðiž–¶,[~t€)Ü—¢ vU`¾8CWmáЙÚQæ:ڥݦ=¯Ó|»¯÷4_¼øñÉëdûʪ²:œgBâ·4~Ÿ%ȼÞž^N»88'Œé… %–M¼hFÐûýÛXý KÌŠ”ØKbŒ£G<Œý¯7Ižq–þ]§Æw»²@iâwdeÛƒ­öcb=DX®‘¸H 6IYG„üò+6öS†»ýv›¥Î4ÞõËö®9g"|³K¼XìÿíÍË—¤p’þëõ¦ª%&{‹Ù/ÝØÎkáNËq81(E²ÞX·>:·ª@­ª 6O²ecÕVuÓû:)÷EÞÔGå`.‡ŠGjÐû¥»!?±Õòƒ›ç?ÿ‚ÿW¿¿Ò) ÍܰuâÑìö‹úánw½ÏRåNwºÍÇ[H?(~Ö ò6^!hD R“ð †h'óŠ)0Ô¼¢‡a9Â*pD ­¦±¬ ‰˜ìZcÈ< 2Ï*Ø}±ŠÊïQNÁ°(#qNÁNãôßr ɉ’²3ên£‡65¥àïQö°)E«˜û µ‘‰Û ºÉs{d_Q d´{MÔ¡zN¢:,¿€KT†;aódâ0VyC&ô™¨}rbõˆnQ‰&TŽJ‘YƒÀôÌŽ0páò{¦.ØWÖõQ6 "B¿6p×Ýg–q`«ÇLA¬&%ÄÃ&‡´¥TRdSüv>`ËU?òÂF#p……LñA7ªÑ_Tãø -°n­ªH²n_<êP «èkp.¿Ç„"ÇAìÅø†‹ãܹ嗨 äÂÑlªž‰ØC ¨5ìŠØøCޤÿaìPƒ |ŽÐc›´ªQI·ÛÜã¡Ægé½}¢'Ø=§`OVN„“ÙÓjòÔ°+’8[ØUv·NbVBmè˜!1Æ>·Ã½¿%qN4Ô|ÅW$GFhÂõ‰¯H@ "qßN@a¬*ÎäEÒTr?¡Ý˜ŽÓ)ñY•þé˲—6eQÔ¥÷ü^ø”¹ßª!äï§ùÝߢ´ÒÞKŒ³¬¸(ì;ygòSZ®üU×,bsÝ‚YhÀÀ‹‘öYÆ.)ü”-nó±7†Âø d·ÖÝ¡§h…ûMØÄ9;•+vŒ#d|¢âUÄïcQÏqî縛á¤Fó¼¤4® endstream endobj 1826 0 obj << /Length 2225 /Filter /FlateDecode >> stream xÚíYÝoÛF÷_!Üu(÷¸ß»îÁç:­ëÖql÷à-16‰RI*†{¸ÿýfv—4IS©S«÷p8Ä¿fçkg~3³¢“þщM&šsb…™ÌW‰{[ÞMüÍÅ4ÐÅ@w(ÿ1;øÛ[)'4!6±t2ûÔe5[L®¢£ûtSgå4æœGòÍ4BFçåú®LW«¼¸ó~I‹)3Ñ6]NcÆ¥•lz=ûéàxÖJ—Œ½PM¤|¦§=9I@Ñ §2‚P.¼žÕ}È_[^”iB­tÄ‚IävuLðñ§IB¤a“Gºš5p·œ\¼“I9#Jˆ¾à¬˜O9>/æe¶Ù¤eý\Æ$a”ïEÆ¢_¤«lD®¦ÄðýØÎ´&ÌÈÜÌY;Œ!jQ@3A$¥žöêíÔðh[Ìë|]LitVª ¥ÄJÉpeÌ lºEÜš¼¨§ 2ìî øúÉÏ7Îê›V•tu`ÔL§‰L‚@Û%„ Þ]úrý×À”uÕ”0Ý’ß§Åb™qåš(iºï<ÇË*˜!I;*-hl†»$t»I&TdË…_—#žŽ[âõéÙ1ž4TH’@ ÖB¤Û×$ –$R8VLˆIÓ÷`aÏqc‹bÆX´þ䯛2/æù&O—4 z’* »Àˆ'à€ýA ûÁMÑÜô-÷+çRïEª`Äöîö«s…ˆ¶4bËGt`3ÄÆ'—?žŒT`h„Ù‡nÒ˜ÁžŸÍFd*»`÷"‚[Îöd~8;={‡>ùçÙxFp@ +d?':à8ð9`¨2ƒ„΋Ͷö©—–eêvÀ§åC^ßû»ŸØ#fhºšÆ4ÊœZ ‡çìÔº_6y_ßDð`ž€èGè®ãÏ!‡<‘'ã’¾.²z[-8I€ãmz¿…Qèu[ãüÒ€â—;ÂÁ~¹Tp¸M_³õØÙZ++,3N‰w§Áàü·Ï³ªú´]ô›Ú˜Ï;UC_6IHƉJô^& äÅ©úæIb:4“DOPa½Ù.¡·VØRíE¾ÅFB?óA{7àY½«ÐR“ÀŽñ?{ÆØWÜxÅ>w´Q „°P/8Ø‹׉ÝïÑgî°/mÎ¥€¤Ft¿ªâ3€謔”_Ÿ;`Ã0’?càà0øX·›8*kí´éë±Ò·iwË-)dýËýÍ-w§BwK¡ï¾_Ü:tB•\UÞ‰NŠÁLe¿¦ ÓÛYß3eOGPÊ3~Þ5Hª?Ü@ý“é]…¹¢`‡·Ð“À†Öù* ¯ªdtž³bÑy*³"{ˆë|¹ôì jüÍ<],ÊV¶DÒ¸¦¼§:=v'=èÙ?ôˆ§Þe¾.ˬòíºX´gŒ¡%Çm³ª|žõ=ΡzèÐÿRÿ3’2‚Bð·„¾7ºVe„§”’¶05m ÷m F‹kež†=,¨¦r勞»%P c† qp9ð¤Pà‹‘CVL9ƒp€Œ_ãvj½ZÑÔÍjL5t•x §Â‡à&¡dô‘rqèY‚ŸË¿à7å•§I ÿ|ˆ“È¡þ©ªË휖y¢ú>­ýÝîÞºü7LüªM‰`¥]ÀáóÓ²4h„š`¬×¡+Çwk¼(*¿&íÅe@Õ~Z“i¬¹ŽN7t!θ¶s•àI”­PЭS'[,;má¯.$‘îð<¾8~ï_v†GÄL[çäÜBÅáp…mTP¤ð¬œHøF°ÄÀ&¸Cóþ›îéy³>î0'b˜øÞÉé'‰ð6\u@8LÓu¤£<ÇñÝDÝn¬ºt îé]æ§{ -Ç–4ÚA‚¿|ýW‚†:îÍ ¦mÍ yx}qó×[¯ûj]Õþõ2÷QÏR|À‡cе_³­‚eŒø¢q¾Ë‹ªÎÒ…ÿà ½'©–ô<9Ì+T7X’Dź\át‰÷éf³Dô3Ä®*š¹øúOk¬ð˜I‘} ¡¿ò4>XáKO&ÂE#>]bî>‡ô6¦Éú Öóoíö_FoÞüÝ7àeç?ŸÎNÞù7ìÚ_/ß8>;:†2Ñ¿œZ<:ðYÚå)pcȸJ§“³ÙñÇþóOúHè9Ò%ŒìV€È+\àËïFü0÷³¹µ(®Qü¼98K±¼ŽIù\mWÍ2–Ýgá=>½;Gþ<¾‚nÞ¬aý/ù¼\Ã{(ŸÕ¨®Xí›E2,:ÍÊÛ –ÍòªVÛÛÏÙcã–AÉ-7z§øñw®²_ãb»ºÅ# Í‘“œ>œ5g/`»¼.óß\ÀÇ‹´NqjEV&°:ìR|ïº\}ÖõÈsþ÷Ø)AòMÇâBìãx€d%»±Sq“?c3´†€WÅ~ºqOw<îeØèo‰"|¿SðîŸÝ#xïg·cS‰+xÿƒc†äÃÆ€ endstream endobj 1833 0 obj << /Length 1713 /Filter /FlateDecode >> stream xÚíYmoÛ6þž_¡òPs|§Ôo]—nÙÚ­k< C[ª,×Âd)“ädù÷;Ф-ÊJb§nѵCT–È»çŽwÏCJ$Àð1c(æQ®Npw·~˜‹W?œ;n §½‘ßÍN¾}&D@0ŠqL‚Ù¢oj6^‡O—Ée›Õ“)c,'SÎEø²®Þ×Éj•—ï̓I9¡Q¸NŠÉ”2NHH›¼ýtr:Ûx”î S¼'!ŠqD7Pg˼8± ë2móªÔ¿¢0­³¤Íì£ÄÜ+'$Ì&S^›ÛOÖí2ëbhó4i«úDJXx ñDau¹.ÀÄÜŒ½ÎÛ¥±ÒT«ÌÜ›g‹d]´æöÕDÈ0)ÖYƒ&SÉTxÖê\@lSÂîºé0AöÀµ¾àaº®k‹Â>ÉWöQbÇÖY»®Ë üz§ÇÞ˜Ö ››¦ÍVæzQÕƒ§©³É¤œ;¿M–š{o0áY1䀒®úI×(D"i"xÕa1ó fÑÅ ‰}lçz ¦0J€‰ÞÔaüÉpÌs÷ÿ/¿?nVÖë"É‹uY°`ò‹Á£v8cÄàÖ”r ¹Yæ®2ÿÞ”¡W,Ic((¦‹îõ[Ìá!¬ ®»¡«€#N"¸*‚ó“ßLiúŽ £Hr¶ D95ŽmhŒlBÛÁ@)F˜Ë£` T ÞÅÓÃЬßý¥d7c Dy„¸Í—¶ý_?›D,tíD·v¦„„¬ ÚešEЪʭíy—㋤)ÉZYؤ_˜Øð/4DbˆÀHÄ™{ƒ¶^ãþ0Ž(g¾OSßX£´‘DÕføJ¿ÈÆœ3Õ¿õMÆ|O†$áÈkè¾Q?µP„Jg´#QîJ±«g;Õt¥íФ(ªŽ}RK=¦ßUx³]ƒÂê1¹IšMy^æ­Î_/¿)¡Ä&+]Áú hH­×럌\õ¼ | Ç’>Ér" Éè d9Q Ü­´_;"±S¶\«9®õŒ9®Õ××öž*ǵÍrîÜw\«/·\;•1W‰d>wõ`J¥Ö–HX­ÌÏ®§´4êWÊÚ $cyÖÖ¶8³ö108Öö0\Ö¹AðQI;/Û;ÈZchÇè’Ä )®öájz®ö­ú\ýÈX|vöüÔ”Û¸mÈÓ6êÅrÌ.¡HlYñ‘eEØj2h¬~sžßV—ö°\*12¬ È—+ f#í•Ä‹ÒîâΔà¦,µ´Ž§{* ÷‹·W¸ÃÅ‹˜d÷j‘E’øÄúeˆÝN¬£Ú·©ÿ¤„XÌajF/²Ý0+#uYéíÊYx]ç-¢Æ±‰ÏG=ª&9R‚¹™Ê'éævh½àÇ(ã®… @sq¶plD„ ?õ/5ùmÏCOΟžu0Ï,ìzUÕ™=Å|úÊÜÍÊÔ3ßP«…ÐK0cªU›¶Ú‚ŠìN1ÇÓóÏàoD] íc@À"H‹d_*,š6¥°=3ÿú³ñŸCÈÌí(Ò4kšÅºh;F¡Õ~ Í$AxÿƒšiÍ9T¡Á)´‡¡I´ÿ« £av¿H«%ÒMr5z¤!‘BûI4ûK´ŠŽBuŸF3 ƒ?†F3J¡Iãÿ5úSj´øl4Z~mívÁ‰öª;…®ÄÞ©‘"ÁòÓJ0Õœ‘cH°6¥é8¼ç!™‰Ø.þI°¶…ãƒøœ÷!@Ñìúd1’DÇ'Kéù´42&÷4‚kþ±Ïämu±ÈÇ_bR 1FgòÛ4˜XKóc‚¤T¢ÁœÄˆ#iSœÑ»5v PŠúr9¢Å¾_‹ml¹!ìQ©gˆmßcëÅjo.G³¦ßx2°œVeÓÚ4š'—I}Çɨ¿@ÚY™¬F«Ãwvë–‚ÆP¾L|¯¸÷;õ?\ÇŸŒë¸“¶Æé¥ ³q<Öª§²†oÚî%´Ý©Œ®t”ˆ€òòrm+ɼ7¯óä[ŒÆZKóÅÍF¥ÛnôåDÝ ÷vÿäBâ°h½zÃÔf¥­â&Ëî!ÁPG·ðúÈ+ ©Hu¦”¼5mã9g X;R~ ˜ÙÛFøUÃâ\ÛOÇÌìBAŠî;‰„Ä}è—ŠNeæ6Fvf½zÅñ‡7–í~pñW«¿‚y9¬‚î«„mÆÙŸ/O‘™4sû³¯ó¢©€¶¡Û¶tn+'·yÉþÉ›¶ùœöv ü8oWÀÅlßFó/ÝP<9 endstream endobj 1841 0 obj << /Length 1563 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯУ<Ìï—¾u]º¥ë°®ÉËj˱[Îd¹EþýEÊe:µMÑ""‹‡çÎó}aH‚á‡$'Š1d¸N&Ëܼ­n÷ðö÷âåÆ 8îHþzqòËK!‚‘Á†$³®ª‹ir™¾˜g·u^ÆŒ±T<9é›juSeËeQÞ¸…¿²rDuºÉ£1eœ”>ººxurz±µ.(} ›VrÏO~2„ÁQï§ÔÆŸëyŸÖä[]„*DŒh„9VÛåN¦°ø*ÁHhš|lD—  O‹äü䟘MÂ(’œ‡†³M=ÏË#i]L²zUíû@)F˜ËA| T îãÙúp›UëÜÚíW“r8(Ã.A“¾|9Ò,Ý”“ºX•#’^ù2!!¨Ý9fÒ¯À•fOQÖ#(‹ðy¾vQûˆ¯;ö%îÚ'†!Å·ZÞa½1ÓãˆrÚ »J6}õ“WJ»®q‚¨b­ø<+§‹<¦•)$…nå~v_ž½>µOü€nŽä.êÙ<¦—P$ÛéH0Ôƒ •Œ¡VD‘ì÷¤4ˆ@‹K.Ԧ߯¶˜´Ó=_”5gU\x»Ùº$÷äºw{·Ó·ýúi‚„aò‘XBÆ6 Ê]ð$R˜ +á*[­ÍLáínJã·6!dkÿ{±XÁpÑ)8›OÝ»÷#ªÒ»]ûvòÏä6PßµEYÔ¶;Ž)8~»Ê¢h¬TpK bÕCÁÃF g)b†÷Â|‡ w¡…a®n›à`’4_g+?r«<›Â˜ûâ 8Ot0Ž@UPÖÐ1É‘´çÙjSßnjçÙ‡‘iVÙûÖ¿E=wkeþqqw¸&{ w@¼Í mo!8ØeTúüüÅY£éÌ~·¶—«*÷‹¿¾uy9qö¦íÒ~¸ÍëYµZº§&ß0är/_ú.Ý«ÛÍ\w¯nŠ£¶êqã9Ûzß ùm¾ÚR©nÆq?ðzS•ݽ‹M^>‹v%@ÌpÜÝêÅùgð‰ ŽTp U"¸jÆÃq&„“ºLp‰ õ€ó÷ŸÎ~ée®-Ö›É$_¯g›…O@ˆ[¾Óc¡HSý0Ô” ¦Õ ¨mua#Fí!|hQ;ðÁí¯Ú;ó=ÌÖ = ²Ù7Ù N¤&áñþfs ÝÂ`¶UʼnüÙß-f«o ³u³©0–©Ð=X¶KX¶¯,Û§6¥v{ƒÉöe“í«&7¢^¯êêÕO~FÀ0 CÀ¯U…™ü²ðËÀ87føµº(ÖGÃï>´ðøÐ4ã¾Y!‘Tz³ÒMšõÃ}˜÷ÚN©Ï‹û6îëY±ˆþÁNá˜èݘyè9…) £@†ðÇ2‡ÅL7ª¤2@v<ÁP"e4Pƒ¬ÆÃ@š Ú‡[¸©ÓNb;`+XßÝF)0‚fêiž¬Êµ‡Š‰µ1Ϫ{j&u·fÖX™-£-;È7fHƒønùÆWGùçQ”ßs>ö‡ºZµÝ{çIO´höÊô¼/Ê{œ_{m“bv·½M®›’Ù•zÚµš¹¥±•[{ß´ÜË7ü:Ï?1B˜AZ—ÂôäF?¦9g0»u£ŠJv0kñ”3˜øvDËíÞºžA@G,ŽIõ®O¬f€»@R *ÙÒ>iu,ÖÉÏ@@ÓBo9v‘k2¯Â]Èô*X”ž¼øZO,¡á¹7{ñï›Ó§Äæ(î3i6gU5¯¾$›£0…àƒ°9«kÛçG°¹!|hÙ\àÃ:¯#V9Ì2P=ˆU‹sŒ†V'pHË(™´VÀ)>3™ƒ°¯»NôØ'Ô<¿8.%4âÚwçB’4ÑCܹXUB³âí-n÷=ŽÇ=†m.h˜Óƒ\‹J‰”¡?¸Öñ\+rÃðˆ¨aft®“b'ø¾ð _cÌýñ38„÷ðøð\bЬüÞUUÖ–44t`ÑR¯$ +çyÝÜ|1í‚=‹þËd[Ú±c„;.À<\J„@Ä™‚€&À•‡ÒëÍÿâº6Œ endstream endobj 1849 0 obj << /Length 1753 /Filter /FlateDecode >> stream xÚíYÙnÛF}÷Wð‘*ªéìKÞÚ iÔic}p ƒ•i›€D¹U×ùúÞYHqhÊ‹D $€izæîsϹC’`øGƒÅ2\'³Åvo«ËÄ?|üõ€„uSX8í¬üåøà§×B$#ƒ IŽ/º¢ŽÏ““ôåUv]çÕdÊKŋɔs‘þ^-/«l±(ÊKÿ‡ß²rBuºÎæ“)eœ”19=~wðê¸Õ.(}¤™vå;ØÉCƒRsD÷v®® øß¨ü§•E¨BÄ·˜Sa¥œâäþø.ÁHhšÜ¸¥‹ Oóäèà!„Q$9gëú*/'Œ¤u1Ëêeu×J1Â\Žb¥ñàÏÆù¼ÐÊ9R z­#Êh¬uVf‹Üêí×¥ )¦“)•+åWŸ¼žh–®ËY],Ë IOÃN™‚ŒÔîœ2 IW`ŠÛS”õŠA„ìžùX‡8Ÿ×g$Žl i$}Â…¦»Œ#ÊY³èÈ׫è‚PÚ5DU»ü*+ÏçùT¦ºY÷£—x´¥B9Õcˆ­ÐˆÚÏWmšXÐÞISÏ(P ·¢°ÏV%rf Ê”S2…DÑ­æN%÷Uh‚„at …˜-A.ádר$P¤Dqx\k’ßÓª!üL¢Õ$µÖ¶ÕÝ^C§Ói>Yʑࢉ‘5ò¬¾½¬!×ýJ™-ËUmy:³º®²**JÈlG›„²Qm¡ŸœYk×l=4Œ¸tmÎ ²yÊ$CŠÀ8 Q;€¢$T6R„ð¦_;'ÃVçb¶ ?çó¥‹0Tb~îßý=¡*½Ýô Â5b’7:B»(Ê¢¶¿ãHd˜‚¾'ÚZFƒ¾R™çÖW$ŽN‰MM|R"éÚ醴›ªÝ¹×Е™é{áûÜ'%Ƙûý0‡C$‚ÿò¾sËÆÏ>ÇŽpý‹;Iö$m;v=ØÖÔ7Ó¦·iJ)M—þçuU”³âºÈæpì(°šUVlkg k¤ Sïä`|$u98UÆ4c5†RN!ß잨º@ðt½"7¿µÁ€ÞXýæíÑ›·È5×#˜Æ¹DZ÷~x< ZN2‚J©U‘Ê?ß~°ùëpÛq€l´ÇA<@„<ÞkEy½Ý=«ªÌÅߟô›¢¾òO¡6-¶¿:ùSâ(áÅF6åõàÖO˜ð|~îõeh3wú—{]/ý²U(‡Yáv‡>ôïDHhPëmPhã*ŽÍù˜×ëªl7 ·*éÅ`6ªZ¼ô[CC<ÚRz²çN…=RìSTNBµ¢`¥³áÃ{¯Þ€… ¬g³|µºXσÿ1Cï½Kz™’›J±Å8S‰•ÅÄÓ§’1lh¦’Ȇټ& åèD{åR"c¤<ŒDw’8ÝŒ&ú¹Fçz}ÖÑ›M Z„šÇÌ&ôÙg×Q( \›h؆‚D°ž&>à\{Ñk¢¬:ãDYŠxï¼B-oƒ¶Û ò³Ž5:fÝŠð9¤ÍQH·Òf[§ ¼ï´ùÉ´ùçaÚ싹Ãî“êZŽUÐNû‹dp´ŒÎC`ŠrØø`BŒñÉCmÅ2iÑ3ús^-§µÓXê…}(à¡lR鬫öíô·Ë—Q?¾¶–¼ô/‰‘Ü¿¾XV ÔhgPÄÚ[бÜ-\ÑveÏìb—’~Mi\ÑŒÁ¬(Ñ@Ì—" LÄ¥…$XY¤Á½'„1lhHBd`î–KDèM<ó%bGÜÔ‰Iƒ«¯¤ï¿@Ä0†È@fr¯ D TŠ1'Š`òÐ"0ÒóqÙ6‘ ÇHÓærjˆ%ø§ÄaØ„¥øŽÃ£áð®×WÌɽ®¯ôC×W iÕÃòA‡`*Ós·Ìoæ·aTp-|µ(ÊÍK_ÊЛ²*›5èï£3<íß…aÛ’Ž{«"ë_ýW[ÉA[´•»­ TËÅ]˜vQýšÀ™Z`"l p¶¢DkpVg “6 8[YöKÐSÁy pŽlhÁñîð®Aø(z¡짉HïÖá]"ùüß×[g÷oî»"Ñ9ÆgE¢ 2T|±ÏŠûLëûðGZÓSøú¦ùß•°ççä™?oY~ÀâAy?Ðý$·Ó;ïLï—y™WÙ¼øÜxØ`2ß\¡÷îÛÁ“<ž±‡1ÛñÝ»øßld@uyDW¬ÍtȱØÀv* w¢Ð]8Óc0Dñ£¯ò­5ÿYÊêÚ endstream endobj 1857 0 obj << /Length 1498 /Filter /FlateDecode >> stream xÚíYÛrÛ6}÷WðQêT(wä-í$mÓé´µýæx<2EÛœÑ%‘H§ýû.H"$ʲ"¸õ8¶=².ÀîÙ vÏBPü…ÄÒDsN¬0I:;¡Õ»ËÛ¤~rúó øu#\8ê¬üñüä‡÷R&@‰¥’󛮨óIr1øénü©È–Ãç| ß GBÈÁŸËÅír<›åóÛúƒßÇó!3ƒr<ŽjxyþáäÝy«]2öH˜nåN89¡ÔãTFà¢Æ¹ºËñ¯Qù¹•L°²Z,˜tÒ..i2Á?$”HÃ’/ÕÒY‚ Àà³irvòWŸNàŒ(!BÅã²¸ËæCƒ"OÇÅb¹1J¨PQ00&‰ðö´Òr•¥=z%œ™8z•$ZëPïmV8­›9ĨAŸóS( õÚ‹÷CÃå<-òÅ|ƒK¿S%ÄJÉÜÎ7t@ª=ù¼b2HÝ«Ú×ÞÏW•ÕW-E `ˆA¡^ÒG*©Wh»Ëa‚7‹Îêª2ú;/”uá L·ËïÆóÉ4ë“Ê5QÒ4뾯%žíÈPÁ ¡”% £¥¬ÙŒ’Ðm¸×Þ Ò†5˜ ”›J”PÜ'èj}ÆŒ˜eÓ)a˜Av³¹“É›* iù†ie^ÿ‚³ž$”މ#4‘hÌæ1ňÁ%No^ñ@¼@u’©=$›©ÂpÓÍè3|è.Ѻ zr 8 `ª‘ZNÑT)D,š­úñÊÿŸNXAÍýŸMê÷®‡LþYŸ–µ †p%þäó¼péÞ1$¦ñ¬Ë6‚¤×V&Ö^<ÁèA°6¨t.ÐA~Ò• z}ì¼ÙoýNÝî<Æj‰þglÃê q2°€Zk¶Ÿ Ž™Æ*ûÙVúlT;I¤Þ0xQŸÊ¢Ž³?ÙmÓE¿äÅ]ý,æÞ-õëYž.¨f1Ÿx×|¤ ²é¤BéÂâTAy÷w±§E Ï ¼êòê7ËŬ^øv3´[t×Rª>ÍŠr9¯EÝ¥Ä8–Vö7½Y‡ý; ínõ˜Î~ùÿúÚ—Æ“¬©,QÖ0BK‚• ®|¥ûã·Z{Ž.áµVešf«ÕM9õæ‡-p¦–ãúÖ•Gñ)$QFEáN·ò`ÞCÃ; {xG½žwzWÏ€w¬^ ïÌ)ŠÂ;œ(ÍÄA¼žšxHÌ CM âáDIÝã4®³Ñ&%Ö¥WÆq8ãÇeXϬ8ŽqØ}ŒÚçØO&Š…ïs™_’ûî½å-¼èÈV?[ôÃs¢³Fn¯E׈·©F­I4 ùóf‚Sb¢P'I±ÿ–rŠcˆC9œ,%§104”#À°Ê>WÊ™{¼F/ ëbñÐ!ƒ„SÀÉB ;î>@3síSsç†rv-wÞàc×\à!ž†‡Øu¯®«‡vS» »Ù.rHÕÝÇñSuTóíôÙ„£HÃ÷\Š0áö5Èã“Ó*Š]É ËìzômH›@}É#Fïå'L#77¯7"ß,?©Š±»÷Ÿ¹Çë qÖ뉃a_wK‚>Áÿ¹Ä™¹§®‚¦Õ{õç}z.O<„Ý·'hM™ÍSÏdöI=æ …E£3=Ù€²]XS+¤}Q‘ FÛqZÂ=-q>vÔ!í`'V p;aÊFã°“Š¯Ááì$††e'1€4ì$²Ìf áÞ=dÏ‚¨8H÷Y/WÁñZý&Ö ûZ®‚‰½ä0®ÂÜXÏ¢p'ŠÚc¹Jèå«ì¾tPnöà[¡o §³—ÞÑw´ðSW(Ö½{Èšûu#ì´W]5Bí¡èðÿ¿¹þ)aÕ£7Bp·ã*N#t²¸>¼ÆÀÐ4Âá0¦nycúêEé@ vð(­Ï‰’ò™ŒéìjÆôÀ®ýßìŸÏÍþù\)¢ìë|þ»¹K×>* w endstream endobj 1866 0 obj << /Length 2193 /Filter /FlateDecode >> stream xÚíZ[sã¶~÷¯à#•‰PÜ/}k3MÛ4IÛØ}ÚììÐmqJKŽDeëýõ=¯‚lÉV³éLf½‚ß¹â|„YFáËÍŒÄI›-®¨ÝÞgáâ‡?_±8o烙¼¹úÝ×JeŒGËnn–Ù»ü«UñØ”ÛÙ\‘«ßÏæRªüÛÍý¶xx¨Ö÷áÆwÅzÆm¾/êÙœ ÉXΔ™½¿ùæêO7ÝêŠóaâÌCœnˆ“1Kl¦­$LÈuWþP<àï[@bs@(¦J*FŒå°–Î+%ó 6ySÞ·Ú~¬šU¸Éûr½(ñ›ÌS‹øi?R&Ëz¾4›0{×l¶e‚üçöͪ «U‹î jXs¦‰T,€»î а¤ì–´£%Á.fh׿aíÊf¿˜ž)•õ¾œ10X¦†eTkÓðè.NÔÉ’Á ÝÄë¿ü~>üýoI?)Â,k§V ™ˆ¦Ø/ån6gùîn_¤¨`‚PxŸ3§ eP\ÎE “U?mpþÔEã†0§2 ŸÜ9Œ»wïi¶„›ßd x棟úI"™…«:»¾úgˆÎñÊLp¢¥ô²(©TÖúàç”P©/‚sEdԧð¨«!eo.-‘ r˜8ÓêÝ×3+òýzÑT›5˜ú}ïTFœÂ`S ˜ÎUëfY¬¢±?Õ£Ú<ˆ@Ó úƒ£¢˜©¢qµQòƒ7e7é:øÓÇÅQ(bƒ€ã¦ËöU±^ÖeJª0DÃHœ÷ex}$Z$u„‘i*ˆ`ž’¦s”€ÕÅØQmÀi|†¢¨V/vk–Rfˆp‚[ÖV‰‘}SºYF”ÝX‚VE¬_¤‡)Øo蹌·«>•‡¦ÜCM¦%LÛ·˜N@žÈ3eq"&xóL,@yë£4hSCB$BQA!´f‰,¥6^C$eщ%Àe\O6ž>€e^W·[ȱbû¾GQÁ]Û²hâõ-ºî)U^™²„vžŽùW­«“i Æ¸xC5Q²}ˆ¤5Õ’h6Þ!Šé¶’Ï5ÝmöÀn›Ñ }UÜÖqŸ û¨ÈïËè×PÂpɸÑ(wÛÍC{„0Â>“*…Š8§ £ù£ßh7UxÌo¸Ú„Zçëòcý.‹ºÞø¹ Z¹ cŸp»*·q2< íSw×lC7›°@n c:„Û‹ê,¿(»†ˆtT¾+PÀS+¾=H‹pPK:¿ÿ¯o¿MÚB%Õ°(·NÙ¬ë¨h“o÷5Æhb)«‰ÖÇRï =SRSïHDR‰9wÄ«G„ƒÊº/\'ËöŽåÎä é[AÛÜ%“ŽBÒé2©&eRõ«ƒŸƒÐ}ó¸o°hR™—ÿYÔû¥w¼%˜üÄØ‚÷nƉϸyÎ,ì«j²iüâîND¡Å¯©4¾¡œt¤Ûr×¥¿t¼u¸i¿c¢@]`¶UpáSo„:!]hŠqä )ÃÅ.|¢¡çÃ<ÅÁ§`ÇY~³òºû¾¹/ÿm*sÍój>G! ݶ¾ƒëfÕN¼‹Ö—h`“Cù‚š±@@.À1z׻궪ab/¢u<{@|xã "Ò"_‚•J4WôçP·4UCBÿ~Ó´zUÄÒì—ñâ:ni­xt æQrÓƒMëùâ0âË€¹®»Þ4-ïÁ$êFX£\ÂK &µÅÎØ „è 6:JÏx½¿6Ц˜LJh@ÚymÑ8ƒ t§>óœÌ=¯¿€úÈäôU÷9á9)â ÝYÒÿ€Ò91Äð ··*{©aû/ÊMƒ‹’`Kí`|b&PZ2 ködØ¿Ïï|У´¦C+òeÑý)jôfòï”C,€Jkq¤e”bÊѦñ•zJ† ÿ³²®2…)wÇîeo÷Øm•A3,xÿJ±„ endstream endobj 1874 0 obj << /Length 2038 /Filter /FlateDecode >> stream xÚíZYãÆ~Ÿ_ÁG*°:}~KŒ8‰ƒ ‰wÞÖ‹W⌈ÕHŠHy1þõ©¾(6ÕÒh ÚXd@<º«¾:ºº>ö’Ã?R\(ÆáºX<ßa÷tÿTø‹ÿzG¸9 œFþùþîß QŒ 6¤¸Šº_ïËïVÕ®«÷³9c¬ßÎæœ‹òßûíÓ¾z~n6OþÅ?«ÍŒêòP­gsÊ8!%zöáþ‡»¿Ü÷Ú¥W´#_ÁIˆFºš#¸‡úc]--Q.,˜Uí~>µ‡gÿôç™eµ>Ôö–—ûmxQºUí èšEÕm÷ÈBr¨‘bŠ´…è”-œ\?,Æ(¢ÚÄaMT¬×[p.A~½ô>Ψ*_üu·Š#›E×l7ß„‰›`SÓYm¸W lL1' 1ÔÂ@J°m_·;P§Êí¦m>6k˜u±rûè*F¶Ûú‰Ë:Aê_6]tˆZ ¹D$"JE÷w‡ýÆÏ8ºš”ßæ¼¤0JD/ù©Áˆwû;üÅäùoŸT*dàNm^¼ÿ€‹%¼ü¡Àˆ«â³ù\0Dƒ«uñîî?¹ä¡Š c8ˆâHã€ÿ_ÿÖþ„ óÞh‹Eݶ‡up@·ccÅ̉ör (ÇÓB(WÍ)~B"F’¸|¡iŸ#NtŠ?UL É$ü #-Œ×²˜‘˜ÅR ®“S@ T î¬@hë.£”s¤@ôJF”ÑTéš|n5RˆŒbÚEHò0ãý÷3ÍʰΠC?—;ÄSê‚Ë4Uõ yÓÍ .‰Þïíàé0üaP$N0ØRBƒ¤Ÿ°ÀA¡ãˆr½óIäòA(Âã$$¹¾‚2±®sR™BRè8î›°ÄΤ(§a þÅ AãK­Åàx+Š’¡í†äl™SE“Ф¦%ÎYkO6²¬ÙØB×APͤ¢ H)YÎ67ÙG…„Ý€9QXz ]Î8…´2ɮѽ첡‰\«‘A kϪÚ_Hf¢*·1¥™@Ót$¾m~©3yu]Áj™ÀOJŽÒò:?éĈ5T³Ìr²5€ WÉY;gjÄÚçɬ“ñ¶M¨ŒR]ŸÃc)w{A˜ê¼V…­êtWgqWÏ4„kÄ$:B!i6MgKÂÀt§„ª(ú4GY[)ìcŠG²Ÿt59éjó±4³ãLÕϼÅjˆ3c«“Õ}É|ûŒ1æ²ýÐq"ÂEjÿ±û³.pø|O”? 4ŠÑlv‡Î‡?×Rr+VÅúGÛ°²À°ð¨r´ñ—g[ÍÔ €ÆÛ#Çöäö9¨B½ >+—UWAíJé[ ùôK9EÍaS6cÔ®$9ͱQííˆåðœÇ>öÄvšÕÈ7ÔDüŸÎxNö)4¸2p ®¸Óag|5×’—ËÒ½,îºwûöÐZ¿„¡ûÚ¯.{óÑ¥™m»vË»2K §Å.,µ(´Ê.®2 íëÓk]|»}®ýUµÛ­­EMÿjçJ@½°í2_ø‡!puhÛY=ù;ÏKàâ“õbýâosïalŽs®¶&×óDxÃþ [U\hï?øýè—¡#¥öþÐÖKë¢Ë{Ûðmýã¶²¢vòý“®y®a?äÚ€“áñöàŸ?WÑïpóÙ^{šôvÛ^O–/jŠ 5— ßC tad½j¹|x5n@‰8ô¨mØšBiùyÕø|ƒ[ìòfqXCNµþÞÅĽ8YRö©ãaÞºŸÒ„«HRý]~·›Ú`¥ÙØÕ»/‰Frè‡ü×…[Y¤•D¹˜ˆEªëX$ø¸“™„FZYÔè7ÓÈ)0D™bX.sÍ»Õj¦Ñ*¬Vj½L$ÄqEm"Ù¯úÿ"iMךOA$­¨ÞñW2Ir •„hÄ G[ìüçˆ/TP{Æaø¬‚2xÏ8~«³) ý0ÃtVaeaBÞÌ*¦ÀYEŠá«˜Dk`‰Ö„UŒt‰èœB7Ìw 2ÑÝYÝöó$#ù¯žÄ¶OЀþV¬æáxö1¢6îdÔ&|”a@ Ò3©s”€HÍè¶­#,öºP¢¬:ãDÙíá"Ý¡Ü΋À§¥9Œ$™šÂ&F ’Ф'6]IsÔ4‡ýj,‡\/yÎ0AØþÇ•!)xýÀOßzàw‘EÉ«XÕ2$ìçy¥ÕkFœ(,ɵ£·“'Jí¶#~?ïûêè“üJéžBMNŸ&8>Í€ˆòxvªË:BBEN/Q¬`ÿYïs endstream endobj 1881 0 obj << /Length 1661 /Filter /FlateDecode >> stream xÚíZYoÛF~÷¯à£DÛ½¾¥EÒ6EÑ6ñ[ŒDÇB%Ò¥¨¦É¯ïìAŠ+-e b  [–vg¾™ãÛ¡I†á‹dgŠ1d¸Îæë+ìÞ­ßeþÅ‹Ÿ®HX7ƒ…³ÞÊ®¯¾{&DF02Øìú¶/êz‘½šüx—ß7E=1Æ&âûéŒs1ù£®ÞÕùz½,ßù~ËË)Õ“m¾šÎ(ã„Lˆ0Ó7×ϯž^wÚ¥'´+qš>NB4Ò™ÔÆ=ÔEÞäVç¾I” J(Hv«œ |²,ï·Ï'y]çýoËûesç_9nISùwæùj¾]åMþœR5¹+æv÷_›íÚ¿[•(ÀˆÏŽ ïì0¯Š2› XFö`o–§32 ú«[ÿ»3†ÅÆð„1,ÃÆhoŒ:4&›8½ ±qŠ7n«zß›y¹ðomšª›—á0–ey>È·ðÒEW³œç°¡u®ê; GÀ^Ͷ‚þ™ 1ÉWÛbJÀ‰ ?+Œ„­ŸýÖßûòç_à»ã¿»¥R!$5H¡¯ÞàlŸ=Ï0â*{ï®3†¨bðj•½¼ú3•nTd w’$|ä0üþkðÉkL˜wËf;Ÿ›ÍívÌÄ„! r\líą̊@†/gs·„ïCø„*DŒÈ$æ±_hÚÀ':6 ÖLE’ƒ˜!EC&†3c¤=³„ )F˜ËQ0P0š;{zæ«"Oé a{tcè• ,m¯êåǼYVåpI"ˆK\’Q¿óÕ³©f“m9·;!Z߄Є› î¤™†²¨Úp]–7‚ŠpÖ7ÞóÁë7Î7ˆ$Žª –`CW%_cSEŒ#Ê»E/}|¹X}„Ò,•$T æ~»mwÿ«"%)HÓŠ’p Š)ÈäkBBeRòÌ,4ñq(Ä5QZN€™oJ’2Šr»¯9<åXHLaXϯ$Ý0X¡eðTÂQqo ˆP¹ßºãàíV_AC5ËW+¨üPHk*ð[[³?ì­×`¹F B÷kÉͲ\666zvÄÅ’FtÖôAa½Ì¢Š}PåSÂát”ØoäOÂNÕí¼ÄhÞßeA*©ŽYOlõ5:22–3¤ÝëPëÊZûýQ’Ñoy]ÂÎvÚ/V ¿ú¶†Q­ýO¾â&ÉB‚Ë1º¤Åù¼]’ƒr©È(]ÒÊbúì&9„¶IF‹T‡´JÍ8J…Uªì>¡Ajˆú©$8à´öH \4¤9¥=²3Ú#ÔXaÌpÑ¿¼;rˆ<ÍØÝÑŠF_ØcÙqw|Ü^g\%côÐ,ÅàÀG0‹ ƒèŽÌjR6)(ß]QÏ͇ûÓÏg^•›pµñ¬¼>RÔmzîÒãP•Þ©ò}’ Ã…9"[pa,µ X°Ä®Ð¸‘Ås¥ DÙ€;ÙÑÕ7Î6!!àôƒœ‰`7ê#äògJs¦|\΄!øeœÉ7Ÿq¸GpÏN ݤãÞaMŸ9´"&ŽŒ~¥¥Qmù÷ïöF%‘‚hz<€ÕëŒNj1Ôç (U ƒ©a4^Á!š©—HJyöÔ©ßCF€}0?kaf³ §ëÉb1 -5ŠûšçBÔR^EÇ ¼VcêóR^«\‡ƒòZY˳9ïZÎ{€áaþÉ-ÿŸœžÄ=¥Ax×UÆÍ@Aí1HçÓÀqÊ#Þ:DD5»+5µŒM˜‹¨†b®ú[Q²›·}!" ª0äÓf1"à|UlVsäìˆìع|Ô émm®}y”;"'Ñ}iÎÉÀ6j qmÏN÷˜#ö¡RŸ*î÷A3LAf+–}°Âú¢«D­‚»ˆÅaéq2Ýù½’(ö5Óh˰üÆ£ÿg\ÛÎNÈNãëMs0šÚ°ñ+HÚœ€ìK\L´¦Ç¸—€$ŠÙ©×‹æ?3¥p endstream endobj 1888 0 obj << /Length 1924 /Filter /FlateDecode >> stream xÚíZÛrÛ6}÷WðQÊD(îó–vœ´i“´±ß’Œ‡–h[S‰rEÒõë»K€Aò=¦›4ÍÄQ$°{ö‚ÝP,¡ð%)MŒ$•6™.hsw}ž¸‹¯˜7“ÎÈ~x¥TÂ(IiÊ’ã³®¨ãYòqôÓEvYåëñD1R/Æ)Õè÷õê|-—óâÜ=x›cnGu¶O¸Œ˜¦ãÏÇo·Úç÷„‰#oà4€S @=Nm%aB:œåÅþZ•me1nKU3Xr…Ò>~¦É ¾I(Q–'×ÍÐe˜…«ErtðGL'œh)CÅY]]äÅX°Q5ŸfÕj}ç”P©ÁÀ¹"Ò۳ŰΗ+Dp…ÿå†eø0Œ%”³ž÷ëÓ?ÝTÞÏ)ð?D2M 5ˆÍ”¯ÆVŒêbZÍWŘ>û™:aŒ¤Jqœ9’Àžfμ¨ÆÊGûÄùÞûý½p•Ÿ –‡¦]\‚0e[iŸ¨¢^iÚ& —¼täòªÉòg^(ïB”Œp#ÚáY1[ä1©Â wü¸ç8b  <fŠ*o¦²N ƒ•¡¥!Ò©Ei¶AR'ˆ!fP_ÚˆÒÌëÍÊ‚Å,äçµÈŸÇ¼lQ©è8™ÅÜ1A¬fÞôˆ÷‚‚•Ǹn…6eH¶kb#Û©Mœ²Ò.+¨GvXó™»w:æf´ÙåZÇ'Ò¡e«Ã§Ø¼˜W˜(;`ŒÚZK¢¦r”m†¥” ¸2®%1Š÷¬ngšíÌÇ­(ißè Æû¬gPÒ4 ̇E k‚IØûK ºÂÿr³¦jà׃y¶^-ÝPï­é»©õ°é =UU½.Üü«±Rà’:‡ ó"?(Pàhwª÷äÑÏ¿À_¤šjkÃ$Êj¢ÅC×a Xfà~%©_‡ïuúçŸ(­§¦Ó¼,Ïê…·?¬Éf¬°Ú°ûµD¥ESɇh‰Js¦>´#¡íˆ]çyQ*5 £T1b¬”îo‚œC ³Ò7AñTM,ß×ÁWŒ§_°Ú~T–H›mந8¬8@DQœšG6ÀPvØŸûbr‹M‚)("f›€HÀâ—¡M+GÏ¢ñA¸oOž0~·6v$›`œæ{gÿ:û óc¾ÓÔcÑPYӞݫºº¬+í"¿^ln·7¤ rtEsËâd`:¥!GÈúÇ6ÚlYƒv¬Á)Yƒ–ýJîÇH$å;Ùq:‰å7éN¼•Ž…A:"eJ8c£#²¡LjôŽŽ þù™ûÜq÷Ót>I-ÑZO2(-T„ø^½c­šRs­Rä Ðúî}D'Ëø :µ†=ž uþvøöðÝqK²a#ºC[%s_AŠUå..×yé+MœPrK¬g“ü~lcž„M¢,¦~À2†–NÊ8Ÿ„"Žy1„V¨Ö\ðžÖ;¥êiŸúT¥üOÊ{©£ˆÕƒ© (-ØÓ3ʹkB‚ÇH%#0 `òSªMhV³ÉkÒEV›ËhàpÓ´ãcÞžéª(= ˜¢eÙzOŽhÛÍ‘n‚Þ#GìÞ,kg9ÿ;rrÊÌ.-2{\‚hÖ7%í]ž´¡i ¨€‘å§`Ó`ï¦äŒhHßùÿ‘Wø±¹l GCΣTõœ0/¶ì¼b t·V~(˜“o+ÕþüÐâ‘›Š=¨gY• 6²·Ø©Û®Ú>¹#’ËþÃúÓ€YµH¼ñMJß ±³BÞaE2ñº°ül ‚PM ôµç7Ù=Lm¾6:dtG4‘F^ºÇ÷qZéî×e ëÇßœ®s¿„àÉi“Uîz cð5cd= åŒõ–“/ðîQ·¾C=YCáZ-÷–h z[Pë²yÃÉ­u'Òx1ËϲzQ¹/y1]o.®åF…ëoa4[gàwä<'â7¬Ñ“‚\U×+EâÍSø€àLœÉyPãúÔ‚!ù £"øè "V­ÔŒÊ ÃÛÉãÀj¾Ì±S €g«Ú\f>&8è¯3WÝãjµÕ‹g@)ßWùN²ÙÌóÌ}ñ™´¢zv–lè=‘¸¾p¼ðd"[Lëd—/ÚþÝB“˜àÖ]†ãr)|Ç´+Ûwíöé¬åÕA¡X­¼*¿üŠ^OpðP ¬q€×(Ê(û゙`)´KcÙP¢,j̓7”C`h7”!†Ù,¢U¡Öt­ µÚP««‘ýU͹ÊŠqïÁ”ßñû€æÜÄ<õN+ŒóÀ¾ -ì鎙~ZA¹ïÕØÐBˆ²8À†E)-¿üo¾o\¾Ù ƒnž½Î‹| ›Öm¹j®;,ÊÂs¤>©ãVðÐq'¸Ø‘3ø3Õ#gpËÓ/¸š® ègò¼õ0Ã+hø@£¾!Çœö¨GÕeÈƬý}Ã×üã“)ìä$q*îË Í?s]Ú¼ endstream endobj 1896 0 obj << /Length 1927 /Filter /FlateDecode >> stream xÚíY[SÛF~çWhò$w¢ÍÞWb¦„:”±'Â0 Á–©$“x:ýï={‘‘ÌHãö¡í„I{ùÎýì· 0ü#A‚ÅJxŒg;ØŒ–×}ì·.‚…QkåÛÑΛwB£'$]µ¡F“à,Ü¿Iïê¬ìEŒ±Pìö"ÎExZίËt6Ë‹k;ñ1-z4é´QÆ ‰$½óÑûþh%]PúB5õÊGz*Г! Š:=eÌaÜêYÝäð׈üm…E¨B$f1§B£ã`“ïŒDLƒ¯fé,€$†·i0Üùä“IE’ó®àtQßdE‘°ÎÇi=/ë@)F˜Ë­è@©@ÜÙó Ãdâ‘*´Ôd;R…–w¥–i1™Ï fX …ÙV3Bl-Ö‹Ë[íðlé.$¢„nG¸$HJÚžÕZôò4Ð ¬—!1¥(ÆnÛÙ»^ÌÂE1®óyÑ#á¹Û)a9J„ zgÄbÈy:™=yQ÷ „Kî ›j.Í. è6Ú!Ùò"«—wN#‰Û1,‘‚šr¸_°ÀN|Ò^Æå«EC[P¦¼r ´£,•:6P®à2ý4Ûn@£iæCg Iqð¯-òpCÙRÀä\’Ç%¾F˜i¢ÈU¬Å®\Jâ17PD%®bª‚øŒ¢\ïk”ì8ÜgSLHØšM¹é…µž!‰„›TÚ/‚XÜñ ¨Hàƒ>€N^B÷"T6¨¦•ó¦o‚â¼ÙjŒH+÷œNçÐÓã|MìØeªpùÀ­Ô3¹2Ðåm^äµÎ¹–!ÅT¢Xym°"ÃØ Í…ÉNïÕÞîĨƒ.9R‚®™ÝìT«?b5tZ–¬[ÝIž§Ì'ÐÒ“$yÚ~8Tá¢k?ô"ÐQ÷"xxcN%Ä#^3>+ÆåòÎ4"÷.Š1v~eŸ®Ç›÷[íè¹æ£žÛçuVd%8Éh­{‚‘gµTVê[y@T8o“pÝðò†pX𓼠|vÔ†eµ ˆV¶êÚ‹Iàœî$æugŸõM„n®A‘1»r²º›à5QmÏân(Y½( ë“ûžB‹ äìz"8jp{«Ë¼á¯‡ðçiˆRAQ€š'R}gCìæ„‚†é*DŒƬ'G®y}Á„Ù´¨ãqVUW‹©s@÷tŒHlq€ñ!‚_ÈÓЅ¶BÃ(¦ÉwÓ°-¨Ð°°® O±°mu$¬#´Ë……šÀñ©¨£"âï¤"–ƒøN3í,B“í²h‡6Í_Â:â‡Úv)È|'݃s!*È“ÀÒ<þ*B”–—ºÁã’®Ñ …pì~žÒ' L’†GíÂ·àƒ¨¯ßƒ£áÉ@ó<¾ë%«#¯òùHû71Ç”Áé Q&Ã/pñ?¼ú€‘:¼²ãy¥Ÿ §ýÞ#b_«º\ŒÁÇ¡¾¸š·q³ø²¡Úú£4ñÈ&вᄇ4©ê,عù••a†®‘[pôË~4èŸzȪ©]½S³ù×vÀd2a+Bm¿ od˜–ù|QÙ¬,-Çs Òš:k!(‡Ÿ‹«yY/ ˜.WèÊ%4쯲YÚ䳃4TÞLÝ›Z+õ/„n¢m€kÙ  -x6Tö+-Ýp>Ú—ÊÑþqnVjç1š„ÕÜN¯pÜÕ¬žN—vè®t -›,V¸NPíögßêÌOMYêëÈÒ™EvÀÜHø­~eçà¸xc\§U7ë&i¾ò™ho(º?Ü̵r_]w¨»]Èu .ª¬D¶cš±«ùT€Æ ¢¿®~„ç, ÷ <ÕF'íœËW£ˆ±IÛkÓù:ûÚuÇ!4 õµ»û³å‡g{§§÷÷F‡'Çv„ásû2ìúÜ?ÞïÛ¯ßs8PYw=tw_€$Ã8æc@ÈtuUOa¸C­­÷¨á\µ `ï.SûÑx>1µ,Àq²q\Q3êSo\fétfÁrå–VƒÏø§HŒ‹ÝæÓ2/Æù]:=N_ääF’<Ö ŠÜ­%+ïó±C,Ûó^¿·U#x³n^ø¢5íwuTCiüFÈZ`‡uiJúYãm“Yá4yz²?ê\ŇÇ](Ë]|u÷‡ï–Ýõž½ìzO Iðíü/‹†Ò—%{¡(/íîæˆòQ<`… 8ýßt‡Ž³ê[YûÆ{«£³Þ½¤àí Q/¹á²-Üp=7¤øùMMÈ¿ñФSñO§¼Ù endstream endobj 1902 0 obj << /Length 1624 /Filter /FlateDecode >> stream xÚíYmoÛ6þž_¡Ò0s|'Õom—ni»µ³= C[Š-ÇÂdÉ“ädù÷;Š”-ÙJâ,J[¬EX÷Î{Žgâaø#^ˆ=Å ¹öf«\¿-.<û0þé„8ºŽZ”Ϧ'?¼Â#…8$ÞtÑf5{ïüçËh]ÅE0bŒùâI0â\øo‹ü¢ˆV«$»° ¿DY@µ¿‰Ò`D'Ä'’¦/ON§[é‚Ò#Õ4”wèIˆFÚ“š#¸UuºLJ«Îb“ͪ$Ïì·Y0"~?6Q;ªÈ~dñ•yàþ«ñ³Ñéxl y3þÞ.®ÁíçëM ûæöÝUR-íS™¯b»w/¢MZÙ×—>¸‚ø#‹øÈ¸,Pm D"&C«ý8®6EÖa°‰Å··c½ÂH(,Z[UÕ2î1Ç®å…]úõ÷ׯÝ'q%馈¢Àš0„Aš6 CÄàÕˆ‚³¯Kðõ2i"ü÷6t„*DBáIÁ#ÒïÝìÍañ¥Jkê]Õ¤+#N4<¥Þää7â®\Â(’œ×¼$Vð_Å9h ±, °æP¾Öˆ€Aä‡ —Ñ®üu‘dȯúÂB5FŒiðCšS»ãÝ‹@3¿ÉHâp;%ä0 … µ™…UÑ$ƒTT8?«kƒ?ñN´Äó )äÒ6%Þcœ°MƽÑıN€ïSÚÖŠDkÈ—Q6Oã>®L!)tCçŽÎ‹³×§6Ýúys$w/–}| EB°=¾“RS”„t¡a¢÷CÏÕ6òÌYÕŠüž— ó ¸)ͬð¨ÌHŸ#Rj‡™!²KÒm~îJ`D iʼnôY>RàzÊWÒ€N⾄ʆi]¥ysF븭¶î5õ/Móº¼Ívµí< Ê¿Þeh+\C‚ñF†KÌ$K*“k-;º… NÙ.‚¨×T*8zÖ-‡Û„è¢b!ß3ó=&<ÍÌm펛 —;»*’ €«_+ ÖDµ Žá³ hW' õžRÛ⫶ŷʤ˜  «Zoäöw¬ÛÐØ-O'ÏÏj%Î\äŠU^ØqÿÇS' Îf6žó-.ç ûy‹:Ö}Ÿ¡&?ŸÁÿá¦RÁ±RÐ'hDYxÏÜ-Äp|B¤a…±;•o^Yù ˜Ì¬ïÊÍl—åb“ö#Ñ–…>rö Ä ÏØ'0 ‰ä÷¾Aä;ìëÈ/#ƒ|—£~|7ü‘G€¿2ºŒ{ÑOH„µ>ýØýЉ~ágG?Š8x€C ¨xúQ‰`a…éø§%Rh¤¿üS_ ü5Upüƒ*o/ ¼Å=è0‰ ¥úŸâƒzÍÕ 8gXQιã`dË00gx|?˜D¾ƒ¹Ž|ȘØa…”àƒ¥ðL1ë uǸU%†{zÄKe•\$i?°B ‰z`ý¯×Ê›iŽ0¸‰A1á`ôМ&bdê’¤w  o¹ÿu™wáÏeº}Õ̺ü!êp‚·Ä©º^ÇGsžåYYÙ"03Åt·DFêvdŒ°,ZÅ@q*ÁÛ‚}½÷ØÇ‡Ï=zÐÔV—Êlºv}A¯ûXîé’dëË @C —Ï$:obP:n³dq½Eãªv¾YQ x7½ëV‹¸Þ&4íIg.{Ë8¾£í ê2Ü<h®¥°)­jV”ÒýÖïs¸ö¸)P+öv÷îÞ\Mïáìfðl›>¨úi=Ñ6õ?Z™§¸›*ƗέU¾kµŒÔŽž,ihÙáඃˆ|'ºQ(Éö³À¬6ƒ‰éŸoO3ü¶ß–ña \%iÚ“Uȶ;̉KžÄy&þ')«ò¶VN}ÚNŽBÝb|Nΰ"äÓvrCÙ—Ãtr¦Q Õý:¹Aä»N®#ågšT´DÔ÷ê tlLª‡êIý+àÞ b2ï‚Ükbˆ ?<ØìÂd߆÷ÃO/Š8š?úð>ßTG¡pÖü¦|•^ß•œÞ2óƒi¦Zrÿé·&þðj7ñ'ÌMBàínÒ,íc7-Š|e·Î6 3·£ó ·]»Hl{™Y ‹œE2ªuÇÝ´6~ù’†**Dœé!8™[ú‘@l´ù«Gõ9 endstream endobj 1910 0 obj << /Length 1800 /Filter /FlateDecode >> stream xÚíZÛnÛF}÷Wð‘ ¢íÞ/ykZ»MšÖ©­>IÐe•(—¢¸_ßYîò²4%Ø‘’¸h`–ÈÝ9sۙáI„á‡DGŠ1d¸Ž¦«\]-®#÷áâ§â×aḳòùää»3!"‚‘Á†D“yWÔd½‰X$7eZŒÆŒ±X<9ñëb}]$«U–_»¿&ùˆêx›,GcÊ8!1‘lônòòätÒ  J辶]yGOz2„AQ¯§ÔÆž›E¿5äß,B"FT‹9VÚ›w8šÁÍ—FBÓècµtÁ¢áÓ2º<ù}“0Š$ç!ð_Åø€ÄiQ¬‹|­£à†$£!~‘&3 Û$Õ1¦£1•+å¿9ioói™­ó‰ßù2"!¨Ý9f<¯@“jO–—#ˆˆð.~W¶¾o‘%î"ˆZ×ûßb=Œé.ãˆrV/ºtá3Jâ'^(í*Å ÂDÔËI>[¦CR™BR4ØO­DŸ½xuºO6OÉzÏ|1$—P$ëɽܑtœ¤¤Œ@D í«&æ QŘ÷¼DÒ˜V¢°ðaL69±Ða{ÆT d´‰Æ<à´:O›íGL`D éŒ ¹`¬¢”{©d AÂa!´ñjU9x}L¡hðzkU@’ÿ»\®¡„èxš”éÌ]»Qß¶™Ú ׈I^cøÍò¬´I×±#PLÁAkC‰M¥‚Cña`«F‹^f„1Ã{f¾Å„;ÓB3×7•qiî¾Î×¾°Ú£ÅtXà4‘¢cµ •âQ£{Z­·åͶtZ} 'E–\Õº}ÌÊ…»g+\$ñÇåíî°ürñ||zqaëþùE¥y4ö°×.l™¨vüxzáÒ|jÅ©xæ„ñP˜wN±^¹›­7A“Ü sž\ßl— ’»t}5Þ M¬=«ºNÂ}EËmá#{X½MÁÏ“j·jê‘Ûêsøòçð{·*P©àˆªH{XÂÚ'Ñ@NXIŒyõÏqð¸‹9l¶ÓiºÙÌ·KoØOÀz'Çö¦äý:©`PŽÓH› ÛÒHïûh_¥ÛݘQŽ4áÇ@¥€F% Q}jõoÎÂê3öokñûyVÃ÷š¸V6%?©‡CîêáTÑ{öpÓíµöTíHKf$"DÔj1\ ¢ æÙn«ÝeD#]5ŠNS {mˆöZo\–ÛW!PG¼é/6\åíMzoÉÓu¾ñ%j‹ã")ö˜#µwR–'«ôÊ ç†ý9ÃãìÔwtjÜ®6•vÛ­ç-ƒ1àÓ3 Ë÷è¿ñÒ¦Ùü¶y„,«ˆÝT´À3§õÜÝêöÿríî]uZúäó}“¦ûëg*:ü…jdM=  s(ÑžP­(¦v:mØã ˆ=æƒ.oÏÜTÁX<ÄÓm¦XÉ,Ë*[lÚ$+û)ðªã¡ný–@hyE8hËëšüRwÈ[¼Ì3³6ìÝ:M'¾>}L<ÁS”‚§¨#5+Jþe‰qiŽÂÔ¬,¢ôƒ˜ÚQð=U ð¯¶Ùò+Í<:Ð=¾$)´qÂDF˜Ø§ =ö&ÈI”ÖTcS6­I%Š`ÒaLCD†Û}µ’GG0àäZ‘oÜâaÜ"ÜÕ±–×Ö* ŠÐ‹õ‹¡‹fz×ÁÝgµGWZíè¢ <÷mlÓ$$2OÝ5§êrY3¡™»ìùÁ|]؈j møÁ™ÖzgÝdœÚ6N5…Jp1`\"Ž(Åw«®á1FË£ Œ¥ú,-¼õ°Þ¹h^×Äê[‘®Ö6±Ýeããaû—ÆwXººqü¦fb$®ÈùëÉ‹óß¾Õ¶þt9ÛÔ߆>g1á!›ZÂcóä©OÃ|öˆhP…ÉQh…Êfô¦ÕÇXY?ŒßÓ€rú뀸G¸}² ÿ 42Bd4RRD€÷è1V”`P€ý³ WƒU!jÔjðøÉ èÖ¾<‚‡ëÁ7<iÖsà&û' £#$,V/ÉAî£Ð?¥Í_Å|^—{ÒHœéXO‹C¹ŽÐvR(" âúÛxæóQ¨.-ùrLjp×#Ví1áÛ[8ÏbÏ<*)ФiÿíˆÅyê§P]/Ô1çõÛV¿ýÑñ¬þÔ“ž`’0l‰×/EtÏA¯$ÛŠî­µ×õ\¤Fn-d¡…¼cá=M°ñ¾ójÌk„`@^:è7Yø›Spoê Þªú¿‹×|–§Íw~LvþÇÄgáÖrK ÍRq¦Á²@Åì¾$Ëjó/éS`Á endstream endobj 1919 0 obj << /Length 1671 /Filter /FlateDecode >> stream xÚíYIsÛ6¾ûWðHe*;ÀÓIÚ&iÓÊî)Éd™¶9•H—¢œå×÷a¡Ò¤–˜v;IÆKCo_><É)ÆPÂu4_ž`û´ºŒÜÙÏ'į›ÂÂi°òÉÙÉÏ„ˆF NHtv’:;^Ç?]¥×uVM¦Œ±X<žL9ñUyY¥Ëe^\º¿¥Å„êx.&SÊ8!1‘|òöìùÉÓ³ wAébš•·äT 'CõrJÍaÜɹºÊáÓ°ügC‹P…H"ìbN…¡öú-ŽÎáåó#¡iôÁ.]F°€høµˆNOþìãIE’ó6ã¿«÷`gUUV=üµF˜ŒÂ?aH2Úæ?¯²t±4Œ»®¤#Æt4¥%š¸å¯ŸM4‹×żÎËbBâ·~§ŒA‰Ôìœ2 ¶W ‹Ý“õ|"¼‘ßÊVÛw!o‰CÞDj0i(¼Á{FI¸Œ#ÊY³èÔ¹ÐÔ#O”†bq‚¨¢Íò«´8_d}T™Bžøu?8Ч”B öÁÄ´î:ˆ«pgmÿtøj‚4U–̱OWéS¼B&<š‚‡‰ ›hÚR—¼ÀˆÒQk>¡ LáôQ¿Ý„ A¿1Œ—¶ø @;ôWùçì¶ÑhBæI$¹D”©»&a-,)Œ©c^ïˆ"ƒÐ´Ê,²¢/Ûö‚$}ZƒâRz?ôÄV+© *¢¶ò¦ø€Ì¼ÙjåOWþ{±(¡0êxžÖÙ¹{öÞ8îÓ6û‚Üá1É>éò"¯Mz´SP>Ä&—P¿ª*$Ü”(Dœ- »afLtGãö®@YÞ(« 4§$Nk(2™ùµÕ[èMJXÒѻɈ]º' ¶Ow ÅÓinªi7Ú•S"¹1¯r¹®¯×µ×±ªR§‡ÕéC^_¹_Eöañ©k‡Æé<.Ò¥òÂ};ì˼p^ÌžLŸÎf†þ«Ù2VÀÛÚlRá–%»µ&µ-çF˜­Š,Pú…•"šz2aø<ýXWéÜï™/òÌo¦r,¾¨ÊeG=¨§Biq[±YV¯+o››‰`ÙuQõ¸7  §B×ÄáVŸ…§¿ü Ÿžb& ¨“‚YËÚq£ L%ÜRbØ×’W/ûü &ÌÙeµžÏ³Õêb½ðú·ûü”hGQ}Àº=‘£C SqÀ…¿8-þU¶,'ÀÿÆüëëE• ëQ Ð„ˆ …P€ l¯ »G„e”¿Év-J(¼<hÑã€hqJ›rhøTÝ hF D6¤0çû€–†¾`eÐú"àÉNi¿} À¡©Ë÷޲‡… ½afª°¿1ÿ|»l·¹V‡ϳ…—ûVCß×ñÈÃ6<PšCbŒÐñ )Jøƒv<–˜çHÏÐéÈ#ý(ü}Çkñ_euÓ Ð'$…+%¦Pè6×mN$áhvm4Þ5L#)®þçíq˜"ȈIÀw&p ç\Æ€”¸ýÃHiBï:K(‹•GîsSÞ¶c…>žR‡ö^$ vS¢@!¿·Óoð >\z#™èèœûâ–¢oëžHØbO³{w}ëÒÆŒ1¯­…³ynwûc>4mi›öÿéxKe‚ô8ÝÞ’Üí)çHŽÔí -vd·…¿ïö-þM‚õþ!>½!¾á_C|JðˆcˆoH1Aâ?Ø ?ôÙfâCµ†ˆ¦€4øÝ†ø (üÔ’¢Gñ6CS|N«ýS|X‡Iò>|-§ñ]¸„•ÓžÃ{O-ÐcBè ¶íZÇeî¶Ù{m©\G—r3½—ò¶¯áÙgcˆ¬ò‹a÷2/¶oWuåîà iË w»g2¾†×óüÚ\‘[^é2kÆNÒ°†ü¢ï¢>“3(RÉ&Æ~ÿëåËûŒEG4¦,šë dÊëõTêc¥%’r(gÛü„\<ÌÙ—bn4î÷émиs7Ce[i"­[¡ÈÅ@éÒàBó¬¼è\8·™b_yò*¶ÜÁËŽ¨½71Åó8û8_¬Ï­Û­>Lü†B 6£[/›…;¼ € #,Úw”îì^{ð0q7žA¹²Huh®Õ½* ³ÃÜ£m.Êçý·bGãêaP-¿T«Z§S%ŠÙ¡ÚHó/0œ™; endstream endobj 1813 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1394 /Filter /FlateDecode >> stream xÚÕXM7 ½ûWèØ*KI‰À"@Òt{im6‡¶Û¶£ØÅ~é¿ï£¼-â±M½)P_lJóDqø(’šÜ2…rK8ã?Kȵ¸PÕ>ÓBIÍ … ¥PÌQ\:†Wò šx¡„ZúŒ…V[  \"×L’öõP›Sb ^0_È!S_àzŠˆK˜c)Ð_0änDÁZéV(–nFbÍ}-¨`Yc€kS—Òú F¾–14õ,Rò=X!ùƒV Rs ¯BðMn’wW“ I|-~¨˜ï+%»¹ ›×¾.•ì4+7ì!ÐW¹ÏaÚß¾¡þúM¡¹i— Ù’kQh¶í XjÍmQ %gçFk([û¼‘8 âÈ|msÅæJK©ŽÛE’¯…‘ESŸSHýÍ)Úß$–J¾..U× ¯™a†9³>W§þæp1§Ú%®î«jĵÀp¦æÕ0W:3 ”¹sn-îonXzLÁ±,ìZfÙ®€æš=¾kݹ°‚Ýÿ$c„$ôš‡ Œ…T;Œƒ$÷”y"˜JåsxJ#ît#]RHÚçjN}.Ar6 .“²!ÔE}ƒQR= ?R ÃY‘j®‘Ȇó%m»¢¹µ®§LqN¶ªyª©u©% !áýHû5h§ÎÎË—á ‡Zq¶_…å?ýü¬XŽ~Þ×ïß¿Y<{Öç›õ}8; Ës„SÛâÏ‹8—ùïQ †`x¨ÆÇ"¦>Š~ ¼þ8"W`}„–·››ËÕ}¸ Ë‹—çaùzõá>ücÃë?ÿXáÁõo«ÅòkسZßßyVéæ/–¯Vw›‡Û›ÕÝ6Óô¹ïWoß]¿Ø|W)¸£(T£7Øèú«=}P>îÐÝ‘eÇÞqÅ!6Š„¨%×èq1ÕX‘P†@JÜéúˆ†zv9Ù%õc†v(>š.:@ýKº–Ï×ë ´]…^BÜž^B\˜ìß‘‹ååï÷}üÝ»õï‹å‹ÍíÛÕív›ôƹÁk“¨(…4zîl‡ô‘ByÞz–ßn^o¸øâùÅW¯¾ùá—ÄézýÖÿúÄ…Kçë›ûw›õÝ—î©£-ò@È%Vä/*)&ölͱ&þ,õx¢9ñNÓxOц@¡sÕ1¥"zsÖHõd½”ýp/ùøìTh[’DoI†@ñ\’óˆ ’ÙHGŠçd§òñT‹óºìxº8Í kòb’¦øP(GÉ6–š{b)•¨MOæt±íÓÅõ tµ9tµ ]½™Ü[Ä!ÐO:Í1 Uå“¡Kê>]"ÇÓ%:ƒ® ÈKW>Xh&@áMÇ8FÒÔ*c Úïè׋!0sŽèEN†V=ÐÒéÜ–®æ=ZuNG2õw°Ÿýƒd³qLÂ'sª¼ÏB¥ãY¨e ’Eœ‡1×âØ8^‘R²9,|ìêOuÿyÑ4ÕŽg¡Íi & MÖ™ ŽÑØÁÊ5’Ë? ÌËUŸ‡„¶OBÓ'Pç° Òj¨Í2Š´(uŒãTqçš¡õ$µ“)v |ØʇÍ)³¥–Ç@)¨ÍMÇ@Îh ÈÆÀŒ¶ôd>àX¢=ºüûæ±tùwÕ!]S‹íPŸýF«cXQŠíÐ×¶)Z³ò©Üg-§dµydÙã—ÕwزlÞi ô³eeŒûäýh $4…RídŽVÞ¿Îúçú£ÙÊ3®³S6´½yŒ“Œú6†K±¥@b4-éÆÕ_E º endstream endobj 1927 0 obj << /Length 1810 /Filter /FlateDecode >> stream xÚíY[sÓF~ϯУÍÔÛ½_x„ …f m’NB&#…hjË©,‡†_ß³ÉZEÊ…(¶ Îê|çþ³& †?$18QŒ!Ãu2_î`÷iù1ñû?ípng­“/w~|%DB02Øäð¬-êð49š¼Ïáo ùW#‹P…ˆî0§ÂJ;:ÆÉ)üòç#¡iòÉ]&p€hxZ$;¿õaF‘ä<þ³ü> “¬,We¾ÖˆÈ(ø†!ÉhÇ𬺎J E†˜QP)шI£Î‹t™YÜnþP!Ä>*VÊŸ>z5Õl²)æU¾*¦drÞ” !ÈAí›3¦!à TqïäE5…D!²'àgçâ0ø¤/qžh…x#ã=8@™ö)Ž(gõ¡Ÿ9.Ÿ™´­'ˆªæøyZœ.²>©L!)t}î/ñ` /™‘`àD íL¨ãÃx+>c0\éDa<ž® Òg „# ÆÏ ÂD4)ÜdoWºÀˆrG£(5¸@„“‡XDF˜)Åá³`Qñ¢RnTðŒ E„ZÙ¶vu]MO²>‡R޵¬’'ÕÕEo~€ª\wóc¾*Ö•}䓹Å:OË(! -4 Ù¢h-âè¸O#@d¬93X)Œ ¦i«RHŸÎ  EÀç 驨üá4$R]ðº7;#ëÎÄt~.+çáyZe§þ³Sª&WÛ>Ñ*qnû¯1B{È‹¼²åÞ2$RLAŸM£^[©€È»ÚÐÐÃD«¿Ûè·*DÄõi£;&Çoµ¬åµµ â=#“´‚~˜Ù§­ázÀp*a¦cx]¼7oxì6ã%K0]ÞTrJ eÑÒ©8 t,î$Ù"ª¸Ã$hËÝL›ÎK3Jéduæ^”y1Ï/òtGaxYgáÄ`kÆ) °/20® aÅtl`¿WÓPÁj PÜoØ ^uŽà“ÍæµÅ•u´tHÃ×o^¿¹®šëTã\"­;{Ø ɨ`üR*¤*‚üýíÞÛwÖ#¼í/=ÆÀé¨ Î<@W†ðNÈ‹‹MhìiY¦¾ª]…Ê«sÿrÓNÍö¿N>t§(áÅF:dUï«ï1áÙâÔãå…ÿ°§ U+ÿsRaž»7C﹜ ýi“¡-ùlÍı*ûYµ)‹Î‹EÏ{Û/ ª¡IÿjèþiG!r®"leHñ$  èÑp' N:Þíyxëæý¶ÞÌçÙz}¶YûãA¬÷bìlË”¼Ûâ!ˆ]ÆY<¬,&î·xŒ‚¿Ì–«)à_ÚúF3 F…õ( PhÄæB[á\¯ ;ˆ~„ÄÚ~™ ¯!C†Üe ¡_w áD ÎMµtSÞCÖb`¼N­‹cx QI˜d‡×Ø¡ñ28­BSÊ¿«ÿ±a5žNþþð—S?ô¹j‘gî&*°d™¥‹¥ÿU‹!YÃ{û/f»ûû6|ïöo$=ù´¤Ç1G ¨fÒ³¢$Ï“²SZ/…õ˜‚N³{±Þ(øõ"|Ÿa @ß­…¦FFÁ¦ –,Z„®ú®ÚHvE´+7gtuÒàwîÜÀOên—n_›î0l2F&LÐÃn‹80¼ảRøVºƒ²&4æ¥{ߺÝvUcº«¢Æ>‚½÷@ÖæVf%ˆDȈ°ÿÌ*¬{CwÅìÃq[`g©³”Õ¯mÀ7Õ­ÈÞ+zè碣éç¬\Í*Çí%´‹¥}ÈᡨcWeó…Ï-;¬=¾ 4¹ÿÊjòÒHŒäþã³U¹¬ÉÝ+Ô¿èVçܾE²~ª“.Ç×YŠoi¿¥ÐA(1cP=…¾a4Zª‡šª…ê­,‰õ½¨~ü@õ¾û HÛ+výˆ„Û‚îp­„XŠ×2ÈIA8¸V#uïë›®@hÓŠŒÜ̵Ô~{ÓðÙ}HÖ_ºÁ-tLÕmºå“g½N„!L&0íÜ1Ã_»®óÏ}( we]ÀX)öL×VÓõ•ðpFn¤‰ŒY@óýòÅœØ ­¿oæ¶™gßÐ÷Gâ¶*‘ÜvÁ`ëjSÝ~c^dŸW]lG”íìd¿þéÜ\[úukéïãŒ&À¸ ®O²kùj«ÚBA™­‰¬e"ÐF„‚˜È‰»We:¯ê‰PàuVÖW~VsQs8±0^•«åÖ\{tŽÞéªã‰çegzŒñ$Q|çë}«Í?MÇÖ endstream endobj 1936 0 obj << /Length 2063 /Filter /FlateDecode >> stream xÚíZ[oÛ6~ϯð£<̯"¹·vènm“.I±‡®4GmŒÚ’'ËíÒ_¿sHÊ5)q¥ë°!¤Hä¹_>…M(ü°‰¥-±ÒLæ«#êžVo'þæô‡#ÖÍ`ᬵòñùÑ7ß+5a”XjÙäüM›ÔùåäUòÝU¶®ój:B$êÛéLJ•¼¨Ê·U¶Z-Š·þÅó¬˜r“l³åtÆ…d,ai:}}þóÑ“ówÅùbâʿɩANA(äL$LH/çæj¿ Ë?v´ׄYåK®Ú«×tr /žP¢ Ÿ|pKWXÀ Ü-'gG¿ôñd‚“Tʘñ»êw°Kòª*«þÆLFáoIï(ž×çÊ'–ÙQ¸rfˆHM̵ʳå ùvã‡+ER îã‚£üêWßOH¶Å¼^”Å”%¯ÃÎt±JqÜ9®A·gQÔS<{vv&¾…/ZìSÚfÏŒ&rGã7ªh`eÛ«$áR4‹Î|ä¸8þ*ÐämÁ$#\ï–_eÅå2ï£*4I•iÖ}í)ž Ä¥°)6iJ‰4²ë P¡ñÌ[þé(C)ðM).­çžm Ö§ËŒÃ*ÊÏÀÃL±] ï·K^UÆ:ZÍËbSã­Læ˜øWYuƒSÓ6à ï#sï;Ö'ÏŒiÐÀz|…#d,T€†¦+_²©Nü°Õ ŸmÂu¹,¡Ž™džÕù¥öû”ëäz·­“˜²áÂuQ,j ¿–‘`òNílBz5åJB” j IÚ®7 [Ûa*Ž­í¨ïji+m5xrÆ’¬†üÌñn¯¸Pœ+b…í(ÞÄÒMÊ[ »MùŠeAyq[Ùl²]?/Šõ6DiVU™WÄ)õaQ_ù;s“WïѽyåvÏ''ŠâˆGn8Ëë4K˜Ì——^’Eáöx¤.ýu³öoæ ·38âýT)pÖ6oì¥Û ±¡Nóz[ßö"´6–óûBœýøüöt—TCn뉂ÄVÜÞ±xÅ~ÓP&¬t¤¸ ¶=yêù£úÂ[m³ÏóÍæÍv´{ÔŒOgÆ¡I™1’„bc`¤ÅØ Á(ì$h³wÑèØ÷fŠ¡Dtú ºzßðîtgðr*Ù´g~`{¶‡¶g­‰¶ˆY!ž•½Ošz’â\ÞÖŸ%'ô÷íÏXöM¹ßnÊE!ÝM^l·ÍâcÞS°°ÜT®ÔÜËjÐŒ¤¨U­¾!  úícÓk³Ì‹¾(TP'¾gpXGCßh¤ÿj !>h˜Où—€0â¶é¹,Dï3N­J|¯.îìNÊR×Ê¡n$Eþayíu¯?æU6ä§÷o6uåN×øж#ž¯ý3Û–Ô3ÊVyW¼˜QyÞF?ÁC}–» ±ã—Ïž  -%U»Œ7Ð¥,–×ÞÛkçêr½]‚R}¬  ªt(cc~Š?ÙÎØR‰©:àÒâÐ?Z1^UŠõxUí\Ò[ á¾|Ó¹Ôjz‹k\6A™]œ–E ¹­¹B©…³]’ÿ9_n/ý¨e¤C˜NUI ©JžCûÎv5‘‘ñòv8ÜLÂùÐücÐk$ÙNæûÑÏœH.†¡ïÎùÎDþÙk¾X㨠ÿÄÄ p³ðr?=}<{rzŠûNNoÛò° nÆÛê“ð¶0 2{¼¤”úÌx[¤ >ÞFZBß oÂ>àí6û*_•ˆ·=èîq4J Å` þ\¦Å:â¿q!Ü—¤`wiñpPUŸ_´$ˆ¡§)‡À}þÏNã$SDJ;°K³{Á}É,ÀKåHIs+Ü×–¤šG 3Fûì¡ýAì YŽG¨æÿ'°«¸v}:4’‘nÊw”ʿط֔{IhQQ§_@ÁMk:ÆsB›†.Üíé®GÁ{ö´'Áت´kUa½¢gÐâÂöE®›@¸ VYõÎ ­é“ç??z¶c„òÓ8†ê«A‰Mæo×U‰".sÄ+ Á‡«¬öo%^/Ë"Ÿ8xL­7«dû±#Þ£ê³ÚáÕ0‹7½<~z|‚¯=ö :ýÍ*{7mpÍNôqÛ*øÉéиnÖàlïÛ?¶¹7º0[òÕÚ ƒu“´BõK€\(bt:$@R8œù¬ŠÑÒŒ –Twãð˜ âãg¹1¸6Ÿåb®ƒPà³|–Äÿ¶Ïr(¯¡éŸå”‚ÿ9>Ë iÅ¡»3h¦(Ï=Tâ‚ ¨II„l\Þá¨RÂ1GàŠß5-¹Æí¡Ç¢P„ZTò¢¾^÷ˆ›š;~áÄêßù¹ð¯^÷(q·¥Ê_AQŒýñl<ù%}ÁEÊ1©…žÁ¸#ކïLZB•t¤¤ƒ)×é1Œ¨ötTÛÙ4ãœãÀÌ]Ãf‘-!叄ޒ‡ƒÅ™8HóOÔ0ÎèÄZ˜XÃ~» aÔƒ«„þoÅ vu¦Év³…p¼Fs@U‡H€â´nÙ¤Lt|~|ÞÃRƒ' X U:âÙ‚÷ý! ÐXÙó!èY“îþŸÑœN 8W]aAhæìrÿ¿t¦Œ_Ê¿<ÀD["…ã”8‡@Pš¿ɽa endstream endobj 1944 0 obj << /Length 1530 /Filter /FlateDecode >> stream xÚíYYoÛF~÷¯à£TÛ½<&°Û&(ÒÊ~sŒ€‘i[¨D¹e7þõ=H‘4i[}µAˆ vçøfv¾™‰0ü#‘Á‘b ®£éb»·ùyä&¿ì‘°n ǵ•ïŽö~>""lHttVutÞ_$—EšÇcÆØH¼Çœ‹Ñùò€]Ásø™ZìH—Ac¢ÀHïéˆJ#%áè*K©®Žñ²h8ÂVg² Ÿóù šM“"=õï¾ÆT¾mr·–u\#&yå¡OÙY6+lÖi¦àä‰ Ôé+J!_%3S+<`[=f¢™ˆÝrùcc—ó¨Xzìar/\IqküY²À|Æ„§ó€Ä,ë¶6èµÆÒZò»ªM[vÞÄc[Ó–c à™ þ«"¯hçzV\ø§Kx9]ZþiZ ¥Æ}N¬ïý×ÄHî_Ÿ-ó…ó@öf40>,!).Ò¤:6¬ÒÄÛØ4ö±&î%nªnªž¤Å:R®b! ×)”Í·IÅÊ5®o 9|øëoð×Á P X ¤ArËºÓ Ÿ‚3n¸Äd¨%Ÿ>[O§éju¶ž÷›ü2&Ú˱¤ ð V\ ©å ¬ne1#¶bõAôVoè’\¤Ý‡#Æô#RkMu‹U%u~ù¬Ê %R«h'VeJ !ˆ¥(¿›U)·ûJ#·áSW,ÐB7)­Î¬|ô¦DhÍ©ÓÙA-Vê^R•ièpêàœ:ÏR7#»rjelgë ž+Ó²/K¯çß¼Ú.ôoºhv¹..×Áö$ϡ붲•#°©·£ÖìÿSäÉ´èß9_.cNÞm°m2±ú?M^qr§uæ´’$}ZætÓ†9­,)¶cÎAôælè¯è«= c„‰D¯o¹ÔM½½£0ÔfL›¯{'a­ÐÃaöÌ”mKYŸ)„i§9N@É4EFó{ç`8ÅŽj”÷¤“ðtM eTŠÿàëùÚ{[ñ£‚0õ$ÎÔ>m×=ŽÃø(¥l9^&Ò]ΈÝç¼”ˆQõü¿²XWÊÉ™×8ü<ÍÒ<™ÏnÊà–\Ì-{JϞ͞¦Xæis̽=ÝÖ;€Í8½ÙÙßôËì&~ú´´O=ECÐ>5iý´´OmíÁÃоC„lGûƒè´ßП§‹¥½÷wááƒJ °ÄÊ!§m*Ô èŸØzMØ#vÖ÷«´p{ —áú*n__;viˆAΖÿïk”Ðлš€&¢Í& —Ÿá SÊ—ìÿv¦ÿinî!㉭?`€¿­`ƒãêÌÚyWüb¯ˆ‰4hë[´Nʳ’ZʳM²þ”ge1µå ¢?P^Cÿt½J§ÏtG¼QýÚ½#fƒÜ[Q ?ÃñzæË £iè¾-#ö÷­ü$À:+JVN!ýƒbµI¦Þœa±ÍïýÃ.æˆÈí~ðU¯šNù÷ »æµªM×ÖK¾» endstream endobj 1953 0 obj << /Length 1557 /Filter /FlateDecode >> stream xÚíY[sÓF~ϯУÌTÛݳwé@[˜4É0á,‰¦¶Le9~}ÏJ+G+Ë$&J  Ç^ïÜ¿s6,¡ø—%–&šsb…IæË#Ú¼[]$í‹ã_X8—áÁ¬wòÉéÑÏϤL%–Z–œ¾ï‹:=O^§¿\æjWÍ2Îy*Ï2!dúªZ]TùrY”íäå LºÉ³ ¸`,eÊÌÞž>?zzºE—·TÓŸÜÕÓöõdÌ“(#ã¢Uu¾Y»¹Ú’H’›S "]mê›Úk/Ò¢Q¾v‹ú²}5_?ÕiÝþ¼,æÕ aVåùº}ç eÂ-ΉN²*cš  ÞÓê*Ÿ×‘8“ä½âÚÞW«e{ðEõ=«S7ËXZÍðߪ"ÁVÝ·•FàÇ®ÞTe+ìj&eš/6Ÿ~<æ&MQwÙù©}4huòÛïøÕôïm¤@ibQ%,e}¬^¿¥É9~ø<¡Dèäcsr™pšã«ErrôçXâfÄZш¢]H_¾hñ t o=±ÞÌçn½~¿YûQeÆ E9^LÆL+LJ‚kå¬/ üÚÕŸ&ÌÊD ”Š¡þÒÀÖA3±12ã@”@€Íx ü—g©«0`#øÆ† “à[N‡[ƒ¸!B‰IpÁ×)âE¸kWV¢ „úÁàP,òæìëg3ÃÓM9¯‹U‰Éù6<©°È1»$4qåa¶U\”XAdˆìú¹qñYcðÙ^Ѩiís2ÈxC% PQkï´™ÓdᣠúŠ 2»9~™—ç 7&•k¢¤éÎýêjO^r«ÂHkˆu`YÅÆPЏª¥l(‡|]²1[2P”4>Ãø2ɶ9¼Mß¡xI 06°j*‡±ÌÃ`RH#‰ÆDºƒiÀøÒ‹’¡aÔcfib´ítì±Dœ(cÞ_'38C· àÎE#Q{ö˜÷¬·9%ºG¿å¡Ûæ‹Å »½Içyí¼ó$ôéº2zI- áXË´ßêΊ²¨}‚÷숛=ֵܦ-5¤@QX¯£¡ný”qưv`rüTÏZÑY«Ó¹ç¶¼ÆаܵáfáØD,·ûlý’ñV£Çn2^a;¥,¢Ó/Ol`óͳC½ œæÂ‘"puä®PU4³ÍŸþ¤«wÒ‰©/]+¸Uxw°hqDw‡ù"~í`±ªP_5UH D€˜bªð¢˜±;UÿK;ÉT!´"F™ƒ¦ŠIðÃTáWn¹š!þ•ÿæFˆ=@S3‰ Êбû ]op¹¿ÃÛ~åÎöÒPEømF øoG Á$Â&B¡æN#³DLwdF#ÔM#†¶DiøÒˆ;41öò2:€ˆÅÞÀËê»æe5äÛѲXüâ^h'M¥¦¡eÏÃXO ìƒýñ¯ü·Žê¢ÕË=0Ÿc¾‰ï6i®1a’Mšk Æ>ð&Í6`5Í&íeI}Ø&= ~à¼]ËÑV†ÎM ~”Óƒì³ °bäwÀ6sR2 )ÑæNkײÙF¼¨®:÷± ÿX§ã!‹lÓ{80hc×›ûs™Wm =u!7hì6,£W ÍÔ7’š’ÄPùƒÔîJj;‹Öð"¶Ì—ntOW6àöu½ïB»õp.ÝÇŧˆc#ßvÕ*«]µ,Êë7¯o«1`U•·ñÜU¯]Õ¢¿#n ÇΈ´Õ%Ú壻é}ï\Ec;;~âeOý/¿!ÀÒ2| õ¢h÷‹‡"P ŒPf&!P ¸‡áìtN‚4Âß²ØðBÐb¼¦Á.ˆÞÁÝsÍwKÛp_´ý¹ŠfȺVLqí%i*ä&z¾*סÃ÷y{ÿ”éûï´Í„¿Ü‡Üÿ ío~¹"ìÀ9`í-ð¦Tá×è¢Çå®tU¾(>w±í˜XxòT-yÆ£M½ªÜM;n<„¶rý`;èÔíÐwaìÉÿÝœµ%‚›)x%å·¥}¯Í¿Û¸ý¢ endstream endobj 1961 0 obj << /Length 1639 /Filter /FlateDecode >> stream xÚíY]sÓ8}ï¯ð£³ƒµºúì»0;ì¶}¦·Í&¬ãÀòï¹²dÇr4iܲìÌi¤{îÕý8G*$ÿBbi¢9'V˜drsB«ŸW‰ÿpúòº f­•ÏÎO~}!e”Xj!9¿l›:Ÿ&oÓ߮ǟʼeœóT>eBÈô¯byUŒonf‹+ÿÅŸãň™t=ž2Æ@ ÊŽÞŸ¿:y~Þ KÆötÓ­¼å§F?9¡èhðSA€ ïçêz†ÿjÈ[À4+«Å‚Igíí{šLñËW %Ò°äKµô&Á`ðÓ<9;ù»8#JˆøcñÏÒ¼(–E¾1d|ˉâ¬øz•On7“ÌP¹I0!DÛη/F†§ëŤœ-#H߇* VJævfÜàÑkt¥Ú3[”#L‰ g|WÁ^´ mCƒb„+YxG% 8¶½L&X½èÌ'°*§_‚QÖöJaš×˯Njé<ï³Ê5QÒÔëžx‹g[ʃk 0¥ s¡¡›¡›ìð€ÞÊNW)¡2ŹòðãÕú‚aÂí«¬O´/I Ø„ƒK0A¸À`VHÿÕzVõ`ÉYOjžN”ÐX…ÇD Z¼²&DYîH¨V)m­„Ö*è;‹ (V¾R!nè)…¨°_±ÿk«Õðõ¤@E½µò~¼ ÿÏçKœb&ŒË|êöaÄtúuÓ+­óK]4ú™-f¥«úV ‘cxˆB6µLzcek§M†'È™jMô­].‘eåbm'ä×Ñ®V´¢ŽV§“Qé¸Ä™»O›ÀÍ–À™! S^Wò®à­Æ»+xå‚6!x}ר“„2Õ z¹.?­Kehüªf²/³òÚZåÅg—Ýú››Ù¤X"Îr1 ñŽ‚ÈçSâ[/`EYyþoYŒ'å½k—ÅòÆÿ8ÊR},º'aOór],üæÏ#)1™ëüio½¹öoÈï Μýþþ»=2˜ÒØÃ:‘Ê«ä3#NYkEe WV>¼yíágxÜŸÄj=™ä«Õåz‚Ù/ãÍd8<©Õûñ¾ØEL ÂûΖâü Þ?ð~„ß4C'm·ÆÆ—¡d7/{[¶<¨ ûPjã¢ï(£]Iî!8øa‚ƒí)8쾂Ã*‚0’¡ÊÃÄ‚RÄUh µ@­·é ¨¸ ƒo+†CdGÔ.‰á O`MHŠsŽŠŒ¡øÑ™B­[kŒž°41Ú&.¤3ÌŠ‹ÃÄÅÇ’XnL\à<¥pŒ¸¸›äËe`µ<è‚Y`êè¼BcÑÌVvhŒ³ÚNy×|é<î*ŠHÔ ÿ«ÂB0K¦jaáL1fWY*ñ.ÅQÎp8HY ‚”E„_áN–•Óüû<-jøG"ûÁ_<Ùs,/©ôdïLñZŠíIöpO¶wd¯S7´ûù=Ážá(êÃy'°úœ)WÙ{½)¨†vÖŠTDs7÷cEScâ~õCs?¿÷›îÃÂé³ìùé© âÍi¸þ–Åz‚4ÇmÑÖÓ¼ßÁù× ¥j_¯ƒ^òÐxo‚÷;œD¯¼ýH4Dÿf¯ð{µs´{ÇoCÞ›Š±%·³±¼3c±§`6v¦tíÿc±1S¨‡!cgJ1{¸8‚¿ÍÅôá|£Cà3…·.Ã_ŽWý·}`§ä#ðÿÅÆ…x°30ÄHö¨Á ¡+ÞùåQ2K”¢ðb訩õÚv`Êb¹KtÈ2’[Éûü–ÙŸ÷ä;á‡àÊ@Ž6vèe¾…‚pŸ¿sï`¡'þ[¾\wí ¾søº¾¹OÜž³ÅÕNîÒ1w jw©×HC"æ-¿-8"¨Ù„ÿ¦jxHWΫ<ï­ ÀægbË#ÂfÄìªîéSF-QÁOgEs&åüëÈ7°ÕS_8é\ÚøwtøC].ZyîgAæ0 ¼K;ÌS·³ÅéaO݃àŒð÷%Á!,áo{òn“ }PÜòê]y°y~ù¿g·{s  &tÇ'‰æÇ½{ãmQ;—Ñ”¤w¾{FÂ÷î]ß„û~‘Ïñ>.ö¿Šê½ž¡©ÿÇ«¨«‰oº§»' endstream endobj 1971 0 obj << /Length 1576 /Filter /FlateDecode >> stream xÚíYÛnÛF}÷WðQ ªíÞ/}L‘´MP´µý–-Ñ6Q‰r)ÊIúõ½âR¤ÙLbeI&wgÎÌÎåpL ?$18QŒ!Ãu2_`wµ¼Jü—Ó_NHX7ƒ…³ÖÊçç'?¾"!lHr~Ùu¾HÞL~¾Noª¬œÎcñÓtƹ˜üY®¯ÊtµÊ‹+ã÷´˜R=Ù¦ËéŒ2NÈ„(<}wþêäÅy£]Pú™0íÊ}œ¦“t"5G„qõïò´ëIV–ëÒ*ïÚÆ1¢Fƒ ·ÜÙÂ'¯OŸÏ^œžN©šüqê­ÙTåv^mËÌÿù!¯®í7$»‹óµÓµkªuØšU(¨Žà΂îH©Ø‰Û êC,媃¸È>|náø yá?#9¤Í+‰ Õ«ë¬¥læô¨ ‡OÞb³å"öAêfí$Õ¶ÇN38ƒ€ûv*Ä$]n³)7ôxJa$”¨=å·nüÞ³_ƒWÿ4aF¥BH¦@ ½y‡“Ü|•`W>¸•«„!ª|[&g'õe UÃA”DšPâ×Á÷à%Îc;Ÿg›Íåv Cä¸(!ÚË$B$dàæ:‡×>|B"F$Êºð…¦ ~Ž8Ñ1þX1aIÎ,Éh+ŸÙåSG¿Ö€‘Ž£ßx½‘þ¬Ê>V}gM5FŒA2QŠ´&~õ›—SÍ&Ûb^åë¢ä]Ø)¡TÀ1 êÌ4€m*/ ÊÁÇïÁbgìû–j‰£²#)b²‰³·Xà¾tçQ´^tæÐų ”¶QqâË-¿N‹Å2ë“ q*ES¿~Ñ= BRž´<2º;z‚8QJ§›‚ôC¹ÝWƒ¬=ÚgŽ€’HÈÎWŒ,ÐÂJÈáoÍmo¹NKŸCÏz}È4XÛœK;tbSbšv\¸ÉÿÍzʃޢÀj¥fr tk'JâàÀê@D‰Œ4‘5ˬè ÈØ‰¤·ý-!#k·’žH‹2 Ê¡²Ów6Móz«¯÷¡Î¦Ë¥/ïó´ÊBO¸°}õÓ.[™Ä5d¯u„ Ì‹¼²IÕ2$.óPJD“*ý­– AÎâfòmÈÁ\`°ØÙ(ìÅz[Ýl+¯7-ËÔ&ȧ³ xù)¬ñG£ÜÑLgd²ØkÍVÿ€?=Wô…d'x _”>€ö]Õ ×—=H,ÂPëÀP‚ÄÈa/>Ve:I”.¹­û–FÒ¸³Ë_¼,׫𥕷öLk^k#îÆÙz³É/–Á•Ùê¦ržµÑø˜ ×hƒ±XQB™¯ÊX84Q¨nc+ŠsaC}à+‘zK¶÷ŒPdˆC)%¶bêXépÝz ý‚$ ì=@”´B»'—C<‰}cžd$5œà6ì!]žc z¥%ê\¢I3*è¸.µ#:ǰ¥ÐhŠM(ªm’4à?©Ûþ<º˜# S (`G2 õ¤¿£0“ã]-kÛMÚö¿´‚ül÷ê ßäû §f:†×ÁtÈx£Àcw/™#­GЕî9çÅÝl¥·ewÇ*Œ +zeXû³™ýÛy!\kæ¼™4dO²Rà êQŠ'Ù°zÎô$QÌ>—¡X4ÿ‚,¬» endstream endobj 1979 0 obj << /Length 1667 /Filter /FlateDecode >> stream xÚíYÛrÛ6}÷WðQì„(®·$Vš4M“ÈÊS’Ñ0m±•(—¢ìøï»¸ˆ"iÒ—˜i“iÇ‹C»{°‹= 0ü‘@ã@2†4WÁ|}„íÝâ,p“_ŽˆÁÀ¨6òéôèççB#5 ¦§uSÓEðaôl™œ—iFŒ±‘xFœ‹ÑÛbsV$ëu–Ÿ¹¯“<¤j´KVaD'dD$ ?M=O+ï‚Ò;†iF^‹SBœ aÔÇ+Žã.Îí2ƒÏÞå_•-B%"ZØÁœ cíÃ',àá¯FBÑàÒ]0€(¸Z'Gïº|FQÌyÓñŸÅgX2J‹bStøW p2ˆÍPÌhÓÿ:-—Áb‘”‰‰ Sª0bL‘ÌÍûðîÜ\Àª²òàæù½í ttH辂T!©ô=»d“k%t?Í­)!@NAKÞzJš›ö»LŠÖ/VõõëM#ˆ)z«Ð!ÐÄ”º—Α?´Îá_£st r›û*´|VB*#2JJG˜pfª€«àT€Œ×-àûbº ¼–°b·¡ÙYA[ßßvb„cÒå•rJŠ"q@¢î `L™~)ÝÍrã¥`ZzAåí7‚9IËlüNõØUð÷œò±C3OÙ•U•uþ¡PÏ]Òæ™¹¨8>¶ß)ðƒÄAüUâ€I F¦†ÆÇl q@î&HQ:ˆ80¶»Ÿ8Ä¿ ÿEºÞ„àÿÂüK;ÍBb5H”ÇБe3€þ K¯ó:`°_¤ýRâ±áÅ ˆs üÛZ³I0ÁÔ;H:-ÔmRAj˛޼4´)z 6:¥üÿ÷{Qñݸgì6û@ÿ÷æ_zí5J‹-MÐÑ"4*ÒäuÒd×IÓ¼·ùjWCŸ“)ƒî7Ì9Ù˜bÿô9Ù¼G”“-~Ïsò þ=6üŸiY¼êHãˆÁ–Â9eX²í |—TÞ eßðÈl±_ÍLå@…Ï_þ6v5Þm›£ø€útÙe—P$íù‘ïPpèÖ­wä}´Kbè ‰_õÃh—HãO[Sò6Ú¥ÜÌÛ>ß ¤/õ—p«iRìxÞ‚i¨f•^‡¹ñç°|ítÏ`—EVfùYw4ÎÅ÷ò+E÷ÏoMg2¯×;xµuºµï}™mH.ë¹?Ên7kGúå|•äI¹)®šÏ«Cõa‘„¶Ù9 ÿž8t/æ4 –èݳ&š¿rÈÉ= endstream endobj 1987 0 obj << /Length 1996 /Filter /FlateDecode >> stream xÚíXÝoÛ6Ï_á·ÊEÍŠ)RëÓZ´Å:tiöÔ"Ó±PYò$9™1ìß?dQQÒ ö0 jŠ"ï~÷}'ºˆá]dñB& ɸZ»³Øì¶W »8}Fݹ\N>¿8{úJˆIgtq±“ºX/ÞG/¶ù¾×ír•$I$¾Y®8ÑOmsÕæ»]Y_ÙoózÉTtÈ«åŠ%œÒˆJ¶üpñæìåÅÀ]0ö…0ñä-œp&$ gª8¡ ·8»m žåï-Ê$¡™0‡9Híý‡x±†—o1Š-nÌÑÝP«jñîìç9ž4a$å˜êt/‹r{ÝÃÄ­1L|çÔƒ¯FðVœeÑÝ¾Ùø,a®Ü”UåèW7(_ŽÿÝÙÖò7 vȷΧª]#íT\nìo¿Õw[ÐíêGÎ\Ÿê vS;݆é.eÒ‡¬ýEeJðôÁÊÒúÚ2õ ü]™ øßW&T ©Mý»uâ¾ê@•‹ÅÃVN “Ìÿò²`<š¥œÈ4 ]úÝ]®þO¡qFbuË”z¼%€”„– ÁP‰ü2 Žì*ZÞÕt¶>q¼æ{=Ï–§˜0J?_žX`ï)§ÿñêd"–©h¤ÇIq=fj"òPäP é HNø›²ß~¾HYÚË]/ÿèÛ¼€cò”Á¥§G|ƒÊè´žÕ ø KäDƒ3½Û&ïîU*U軡æ`d ªõ)Ä a…uåâ ú@ðíÀÅLV0:¹G¨áBŠÏËá²Ì}¢°8;›-Ô¡‘gêÿzýÀõš“„§l\¯I¥T$( i½h¡ Ñyö=N¿ûmYQÉ£WËl¨TÝœê±ÇœìhþR¯u[ëÃ2»¥"Ú–WÛUåä¬ì(øÈ·‡…aa^8Ù±¶”tÞV¥nŸ ¯ƒ¥Ú㮌Ðâ½fï²JÞ{b<Ê[!ßã{ z¶1‡vk Ý}‡ TÔšƒ}¨µI£°êÍD )Ö@/ ÜþVwÚ.oãÃÝ}[îʾ´Jp—Öe«‹¾:bK€“…ɸr0­çáF ™Û@+Íf°š-ÈÓFQYa¿m“!ÅäÌÃ\ø¶ÁN#ÁN¤‹ÀfTŒ›N5°údD;ZdžçŸ¶Ì+” 4oRØ”ÝUGrëãžÝqBkYò“Èe×T¶ØqFý¼Ù¸§þQ‡«8rQbÖyŸÛ§J2—Ü¡§àKŠú8BŽÛ!p)KH%ÚrÜ4X˜&T’ÁVU`л,ŶÏH¡íOç›&h¥¤¢¡ÿ^Ðl‚EuÓ£ÎfÜí\¶‹¼ÆÈkzû˜·áœe»ºÒ;ÏÖî¬K¸Þj<Ö\¸îÌW²ÎÑ<˜H€m›Ä.&ÁöfœT¦‘8Û»˜'§;2g¥É¼g-j[äÐb“PùÓ†tÆ‚OS‚»ß÷ú  q=um÷ù«vÇc»Òµql®ø ÷í(íi¸¾ýéœÔ£¾þKÝ3ûàÙ½C·P³°n> stream xÚíY[oÛ6~ϯÐÛ䢿Ä;ÕÇ k¶6omQ¨– ±­L¢äßïð"Y”åÙ©•5CŠT¢Ïç|üÈà(¥I$)E)SÑbs•ØÑú&rÞ]a/7ÁyOò—뫟ßrá¥IŠ£ëe_Õu}Š]ewº¨gsJiÌßÌæŒñøÏºº©³Í¦ÜÞ¸¿gÛQñ.[Ïæ„2Œc,éìËõû«ß®;ëœ3Ý4’~Jð“¢õ~ ŦÌùÙ¬Jø×šü»Ó…‰D8åV˜n´}ú’D9||%ˆ+=XÑMXÁÓ:úxõטML Œ…†ogÇÅãˆeΧxËVH…†ïêr»(ï å¦ Vˆ³tÓ„À2 m7…6V‡ÅCXŠR ks$§NöÓÛ™¢ñn»Ðeµáø‹Ÿ)"ŒQÊ913çT ŽØ9÷U™Ï  ¸_ׯ·Åã×.à¯y‘ôÍc%ët|NxâM¥})†£­ÐÇ#eCÁ·ªP@âà ‚•6IÆö(æ(áʪ¢ ·UíUÝÃâW>ÒÏQH*Õúyë*l¨ÖYu±¼v½¸¨¶vŠÆÊ*óÝ;jfNAJÐhkŽùHi ³Ìb{Ç Ëx̳¹”ˆ'Ø«D=R:X@•ñV«Å7ºÞ-ô®.\8z•iʪZç{ 2Yn—U½Él¥9å­˜ÿI»ƒ`C·å•C·fsk(åÚ ‹J½rþl‹÷°×k%Lég3³@ÆR4÷ºg>BeÏ ô ¨I÷ÜÓd^+ñÃÖÚ&Š€¨—kS<%2¾n?A&;ù²qc‹ê®,r÷\ZüÖÕqP]$E^äÑ|©v^À¿}ÈËæžd\5… 2  ZºÜX&+÷3.â¬.³oëÂ}*7›"/3]¬ýšfËnÿYdëu·çèUéK`éÁ¹ ñ üB ~3hBrÞ^ÁC"“ìFmûêä^1‰e·W†ë"[oÆê›bq9`{Ð1ˆ½°€cž^@xÏ‹¡»Ã9zÅiЏg ’àì%(Î(¬ ³ª¸ ¢ø0x¤HzQ‰$°›ÿ`HÇÐw…4¶[i„Yí¿ºög­T`Éâš\k›=ÀOÀÕlSøç²fºò¡€èŽ(]xœ­wÅ›±üH¨X­¤?¯qƒàNŒAܘÿ(áÕû_BËXŒê‹º@ ú˜2 ÏŒØ:ÿ£ÒN6s’€ÊFöÑ ÚŒÁh©_»ì{§ƒ0˜lR”WÛŸüο©, çåÒ/c峚C@k‹á€¦ºÅ\öUw1|2.QJå$ðit &΄ÏI,;ø w°50›*DD:‰Y’ãÝc4Š€ðç¢Ù6Ø£[D?¨É)ŽMG)pkFádAÔ%èL<  ÎŒ*¥“sì=:ÉÊ0ÜŒÃäR rr à‘9Õ½|j}”vD*]ú7>Ýí(l¿@ 8M‡$šô;ø†ÙÎ…1ã¼ÅxéÃ8½”„ôšcì赑é\1ËJa¬¥×v¬£×Ç4šºØ@ùmîȶ#Á[—O¶•%Û½ýõ¥ÓkÊ1À¦šd Š Qçí“XvûC`XðÆþsÒìr«ðZ?Þ£P k"á,11§&R •ÐØ b ê"ÔNbV!ì‡Pê$E‚ËM©o ­l9²¶ÜеýÓè0Lîè0TÛ1FÌ%?dÄ}H <a§Orí@æ'gÞƒ@Š‹›qZ¼huùÍ)Í}– œmó¬ÎÇ¡(M…¡'¾%§¹6ªLGœ‡ESvPØ=€¢!e…Åtë)G Z30”±*„õLŒÕ àQÂÊJ‚ëÊï¿&ÐÖÙþa_†| )¬*ƒÑÏÎW}çQ2rI”^:EXT$àôX)Ùyxlÿ"J†Ÿ†p³‰À.òòÙpˆœc]‚'Ï´Y·Gw©ÚzçûM»C”&‚êØ±Õ8BŽŸ„è]Ì#ƒ]æ¦b‡X@/R2 "cáJú> stream xÚÍYmoÛ6þž_!ì“]XïËeSTå‚ÅïÚ•:bŒ¤Jq\™ »mÀï[U¬ªÝ׫ùýÕGtöªW­éP5Óœ­:QE[=épš$\ònÒë9í")—•%V…Oš>z‚€ËaôB}ܦà£p¢´è2J2*GÆß·Îða4¸%ÆÚÎÌ>»Æ¢ÇÓnÒ_ˆËªÜ5^òÕ¬³¶t'õhÛÚïƒÞ%Ó8¶‚aù ´lÊžD€E˜m dS,tv"[˜&iÚï˜k-2Þ5õ~ÙìëÜ;Ѭ³Æ;°®6«,ÊëªÞf.¹¦¬jµ$`¼+¥ãƒ·£$†Úä Í*ÊÛ}׬®34àÞsW4ëÞ,Óš%âUÖdÅ»b@¯!‹i)8˜ã€œÂ·` òºÇ¬\ùÁ&/oPŽ‹rba>²H¬Õñå:ï%ê^"‹‹½¬n‹|Õ IMåg4ÝÊÁBP‚ÍÅ*sfpW° öÃ;\QÕ«Ý ‡HáóÞ\fí‚Užm6  ¾-³&?t…A†C0U4Ü2@ Îúz©‹›µóÄëÉ®›Î°%ht˜…ÍÚF×]sòÖÆVû¦Ý;ÐbLèõÖ½*®ï{tÑÂÁ`çð±(wÅ*æÈ.¢XHÄ»¶\N¬ËKÅyð¦”!š²Yà e v&ºÍ¢Ø£ÛPïG§·Þª:ÜpÆ¡ª3û¢l¿jޱf¨{„4F:˜s¦o­}['AGÀNR; »@%{ èhØ[ ŠAéG¢ÎÈûuNbW)@§ýºX0ÝüŸùÖ+]=N4)à Á:S¾›²VÃúXVSr8$¸xP ÄžÒ ‘½\B àƒËCg÷²ºö»™òØêS?oݺ+6?zïúTîÞ<ÿíRð㼃ó2Tœó¬²Ÿ™w?’Z¢Œt¢4o;×ËŸþôׇ°.ø¯;ÿ·¬ºÎ ''‚ ÚTåM²)|dVmóTfh wûU TŽ{3ƒ›ØËôYè—îFÍ{°+þ îÈüºBˆhUZ›Of—9+»Øùr =ÞœI§$TI ‹æÀ”¥…>pfÑì'P¨F}PÂÑZTæw'šu»—ù Ëâºch^È1C3Rƒ?Pc¹òð6#Õ¡ùãÃCÍ_Zýuš¿··({{mk¯H#ÓÀýÞìZO)áŒ*têÒæ1gh2m]³9œÐLÈ¿Cº¿–#"VVe‚—“Û¬ÌË–ñ x7¹‚®ä,`'x ]œ v³hö`(nŠm¾k²íí'É•úrÌA%Ôj¤û%W»:s+%•ýúäê›àV"àV¼;äs—£Wƒs?÷wEÙÎ?`^¼ßÀâÙH /ÝMÛm77튪ìF·u¾ë ß [çe ŒóPÙð*Ë^@:&îÖªÁë0ôþº®¶~”×6`b;ÁÅãA"Bµ<\ÄM2h¨òpAÝ3\è\rÒàUR|¸C—³vÕ ¤pžá]ô_°¶œ¨ãî•¥qɉàæQíºŽd©EÓîXƒ™0oÒBü‹ÄÏ Ü媧jÅlÏ'#œxÐ 9í¢\NÚoªûÒ¢Üà“ð 1:ý<€`pºUr6„²¸2gÄ,š=@Šƒ&=:Ê#>‹j.ì uŸâBõÍ€K“\¨wø$‚£¾œ‡ ¼øáAIiǘ4²N”Q|ö˜Ædhºa wÌÎâP ½7~èÐ$‚<€D€fœ <]( çoûI|Å_(ûªðú0':ç§ =¦ò1ê—¶ ¨}Ì€xš¶0ƒ<ÃWä‡Ì¥#0—àðÌq…sÕù&÷ØØ!º“èGù?=B»_]&­˜ø Ï:DYß}ƒ¸<Ä¿[°Hþ uûŠ endstream endobj 2012 0 obj << /Length 1763 /Filter /FlateDecode >> stream xÚåYYsÛ6~÷¯à£Ô‰PÜóØ4i›ôL܇N’ñ0mq,‘*E9U})‚¢"ÙbÜkìÓ$¸Ç·»Kaø!QŒ#ÅŠ¹Ž¦Ë lï–7‘»xýÍñë&°pÒZùÕåÅ—/„ˆF1ŽItyÝu9‹ÞŽžÍ“U•–ã cl$žŽ'œ‹ÑÏeqS&Ëe–߸?$ù˜êÑ&YŒ'”qBFD‰ñûË—Ï/í‚ÒÍ4+÷ìT`'C õvJÍaÜÙ¹žgð[«ü½‘E¨B$v1§ÂH{ûG3xø2ÂHh}´K—, ®Ñ›‹_útF‘äXPŠ!ÈÃH2‚xv¿X„Ž)…%V” >­§Ùj|³§—b…$–Cè¥X .zm[Ï'Y ?6ªÌ?ÛðÜC>N*lL‘±QæÄ¾N!H¹q7b”,6)TàÓ¾H+ ÕDºýjm×ap¡®½5!eLâ1¸ex@yK p+ Á’"†@Iq"K¢Ù±d x‘æ7Õü(Oê‡óä:û3½ªöx±­¸CòcG&ŸbFÖ!cøÃ$©ÑC©-lç$@Ca6¢ÿ{H’„Ù¿$ƒ"Ôƒ¤Eĉ$9€Þš$½,Èm‡—§J¶G•ÊQ¥zTªôA©æ>Þ¾íÍš6›‡Åµ:ÐÉ€ŒÊá%©‡aT#‹ÅûŒºÇlP;ŒÊó©-Ë÷x­¯¤cêø½øÌ“˜¿—KÀªšÆpžä³EÚ'z)):yrŒ")Ô©$¢äÌ>R" %®àÕ˽n±…s)ÛVÖQdPaRPD 'B‚Ü…ª%ûPB^$¥wÀ‹²€NË4©üõ[Ý»ìiol8»Ù]ÎdyV™”h¹2¤¿h’õ{*9’$d‹ûî®s+2{Põ'ZØ Oä킵vІ2Àe±ð°ÀÖá{²ôãbÛÆgÖÃ,ŸÞQ¼/ÏZð&Nwÿ¿ê“d—x›Á¶²MZ!ÓâpïŠcß|ûüöl@RA®+(_Žb8©ž³)(8@Q5kÄO¯<ï0a†Ítš®××›E?k›ƒ¨‘ãh[FÛ,&Ö¾!h›Å¦-¥'6ƒhvp xVäŸu\pWd³½&x§´ÃpÌXÆPÁ8€ROŸCéèK(b‰ÝÁå1»^¢ômú¼®÷L×ôć nŠ¿N¡+.¬æ)pÙ±æ:4¥¿pX}Ϫ5¬Ã‡i¶Œ,)N=¾¢ÙWm[ñ´XÕÛG¯\P¼}¬Ê¥@y\Ñ!j׈¢L?¬vgëª)ßž.SŸÚeš8Æl·˜oœåÖºœ`¥°y>ÈJ&Ѥ’!+°ƒÃ#&8ŽÏÒu•å-’¸5íænªÇR«6h®À}c秌ňùc×Ŧœ¦§t}^E8G(VYz\’eñÂ=JÿÈ <þ«KÀ¸³#øi>Šf)¥PlÃЬ‘Eõ©4;ˆfG³âë²XöháÌ$Ù0Zc¨58rjïÆ’º¼'+)R™Ðçó{Ï)þÊ8|u·SÝ!yIPÏCHþȉžx¢ïr­/FûèÚ¬áÌ΢[8ñÄ¢CMHO·UŸ3ÐjªÆÆj»êõ„ 0Hv! ú"û?˜Ð:e[ߪz¹Å|øêøLm}kêaåÛîÝXÈÃÜ•!º€gùjS9ÅIY&Ö?„Éê1nÐ 4*žxsý0úÇ_¿ÿþ€NoÖr$µ$Á7H‚ 7H‚‹ð7› Ž ÍgþAZ¹ 75—ºe’¹ÛÉ£´~5XØLšlDLyþ›õw¨¯p˜&Y=fÚ Ãj€úzžN«f7ÆE}èlæþ™—y]ïžîyÝ€u§Hÿˆ1šŠgzˆ)H¢˜:D3Öüjþ¡5 endstream endobj 2023 0 obj << /Length 2038 /Filter /FlateDecode >> stream xÚíš[sÓF€ßó+üV»ƒ·Úû.o-…–BiKÒÎt€É[Ž5ØR*ÉdÒ_ß³ÉZE Ph'™±¼ZÛžsöÓ&xÁžèh")Eš©Éb{ÙÑâbâ.žÿp‚ý¼9Lœ·f~wvòÍ#Î'8B:Òxr¶j‹:[N^L¬ãË*)fsJé”ߟÍãÓ_‹ü¢ˆ·Û4»p7~޳QÓ]¼™Í eO±³Wg?<ÇR!Î|d{2.(5hD˜ˆZ¦íʬ•ÏlºI_Pmqáí÷¢ÜzI\ùë×3"§×ûšl™ÍŠß|%¦YZ™ÚjyØ%¡§€þ!Ôë( ‚ Ž 5 ¡¾¾„½"ÞÛZ0â¤ãneM7Éiâ¼ÌWΫzé ó°ÁÊk›ðvÆÅ´•—¼[¼î4»ÜUNoYÍVx•Vk[×­ìŒ$[äÖÒe²t#­ô¢F;·Ú}Îç~Ã}öûÓ§·òÍÒÝÊ’«Íu;Éú|M³U^lc»ئâk»ò NQ¡¦±ûÙîâ‰mAv 1ÙDQÂrfK#©ÜEµöB÷™ÑN&¥õ£ÁÄf™ìO Lyø§u!ê4ÄÜ…4N³Òù»8´âo6¹ÿ¢S'äÍf¿ÜøNWõ:¤^æªÞTÝ}?Z,W»M7²Qæç h ‚Õøv¿·°9"û pÏ•îÁÓÃoO†f€Z8l£wìϲPÐê™E|?ûc†4¿}úøûž-êƒB³A9%ö<(7 o7Ëb>mb1)›¢7ƒ¾è•+z3â²ÉеØ$Ùô ·¹‚RŠÚ[ÀÒ HÊì+_~ðnÃõåºNžçF›† }Ϲ”6ê£Lhàtˆ¶>.f°é‘HXQða]ùå‰ïm>c}¦ú4 ÉsNˆ`XRH<Œñy; @ÎŒodQ¥2þ(šãŠ X4Gù7#L kzÖ¦ã²v[k‡eu ×C0›Ü ³éÀl¬ Õ1  7ƒÙŒ#EµañA0ûç2(K©õn0âT„n à\h#6 nsÇñ.Õ@íäÞýD¼ûÂ"cØ€cÄÁ¢ùnaÑŒ¤¦!¶xÑŒµ¬6sW†ºÍ…ÛÌaBcŠu©ƒ§õºÙ)vW5·Ë|ëåøöio/ã*F}Œh ¿]°È,ÒÛaѾsìÀ˜… pe®öØX?ÖeFf˜±yÆ£#=ƒ·ÝO°J~ƒoƒ"$´i8$ÖÇÑ#t2ͬ(¦XH#éËÓHöþw˜+'çNLB9@UÄFaÊ)R˜d’Q4;& ß~î8ŠVî¨=ŒBþÜñ úÏ) ÅçŽFô¼Ïãܱ€^Ý£<¯¼LÿNzºt@, ‚X†Ê:s$"VÑCÃW˜LȦ‚H”4ÂÐSé^Ј#(Þ¶CÏM›ÏwÕ” ü J@7Åq˜_>Lbý¯¡É}euIRÚÑ\ã‘QÙàÑÍãp÷hGÉ>ûÃ…î@»züÑJàÚ^7½E·×Ömrô01CFÉ~/bfÓ«Ô¡2=•½U½çªš[Ì„w® î\U³Î¹*ÜiŸ«2ù“$sÞ«Â…;…‚‹½Ef4HL§´~4˜¸?|·_w¥9Mï)«Cûºr‹z^åfþ­À0l3Z«}…Í¥Òþ,©‰›‘Ø}øð3¦ÁHó.À¸™¼Ihƒà3wÄ_ì!SŽÂÝ;Œ·#p¦}œÛbrƒê çÀóº)|,>·PÌé|nDÉÚþ£ùœ ãsÓ©)U£ð¹íúàù0>E³ãó@ñí|>ŠVÏçZÿ7°OÂçmÝ_Ÿcà#ÇÀs#IHþyàùe\–WyÑËè`ãaŒÎ€jä`Šäú(FçØV¶ÄƆ±vä« UÓL©vÜ$ $uëļŒ7ÕÁUƒbÆ”(ÃcÄŒÁRAúÝ5fƉñbÐh+ûÜjÂ?–5A¤&ˆò]AÄHìÃsñ61˜Ö—}15ôíŠhŠ”‚NAë‰ÔQùVcmEQÉÞóÿRÞñ~¥¼_aCÿ±×«tVo’çDç° endstream endobj 2031 0 obj << /Length 2044 /Filter /FlateDecode >> stream xÚíYÝoÔFÏ_áGêm½ßë¾Q-EU[’—Š¢Èøα¯þh”þõÙ]û¼ŽB$ [Û»3¿ùžYh”À¥I¤9'©0Q~}–Ø·íûÈ-^ÿtFý¾-lÜÎvþxqöý )#š4Iitq5'u±‹ÞÄÏöÙ¡/ÚÍ–sË6[!dü{Û¼o³ëë²~ï>üšÕfâ!«6[Æ¥1Õzóöâ—³çwÉØ=aâλ8Ó9NJ 1‘2‚P.ÔCÖu7£iwÈ{)šzT»ÛŠ"â²> = !â¬m3<~ëdÊ+SŸ•õ$'²Øli<²!žOmëm©&z[UÔkð¤&‚-áÁÞ÷ýÞák®ˆ 2!‹“?×3žÃí²ª_Ã[˜ÒP¡°¤×qxâK'ÔÅa©ÒGW×ixžahUˆ‚ÃcÍÝR™¹·®nJœÇÍ!û{(ܦ¢ÎÛÛC_Rû­·'e&.êÐÍ¥i†þ’/nWõ͈–l!ŽcÝ”N.Mˆ¸o<²¾ò~h=Ð~ŸyÑoʪrïöMµs«º¸©F·i‹¬/vnïi)b£8Ts1žÙÓ°?•qæ~€¶[¼²„R²_&¬ßd4‰³zç?½[ô{Oôˆß. ‚LÇ£ÁÆ6RÅY5øMC‡.çô¬æz† M9¡’úØ—ð÷àÁþ˾¹üPÜþ•ÈþÑÕe’¤éävd³Õ&_=ÿ fæ.ß¹7™ûñê"W)w†À3k⮦ÆmþHyåöô€ÖfÄá„q`®†:?º2ìt^‚ uZ9.ò¢ë®†jtZ½TÍÑί ãir¥S.×\Q‹NˆÔrÔŠ;êùŸÿüþŽÅêï© A.")P‡Œ±uèÍÛ$ÚÁÇ_¢„ÝØ×'LsXUÑùÙkE•i Ê–”’Üøí•ׄ-÷¹qÈCù2è/:.CGg Ê•4ð»ø)Ó„¦2’‰!‚ó%~iØ$€ ‚šP€3…8SBXZT0ÇøÃ†SŸ,œ%Àãôq8+P£ _µÍõ ×”ªøãpM5Q”…lkÈõk¾Å´"\kFýæ7/6†Ç£ÃÓøí1ÖÁ†r–­)Z…©ž–5¤Éäôê—(ë味J‚`—Š$f vÌ kÉ^&ø¸éܹ‹u½'ž(›ƒÜyJô{ÈfU±F•ƒŠäT€¿´M/œÝµK*Î"2S%?3žBÖJ¥ b$õáԯɢ‰ÑÄþö°*˜&j!$ÊÎW«EÚg­Kl Ú%#Â$½ªÇ” ýäŽïü?Þ§í¥ÌÜ^¶Ý;6À3™Xÿ ™uå¿Åб¨"8¡«x±¬a)TJ4XãžÖ9¶U –ˆé ,iÀD:4å²¥ ¨ˆ8†›çz~"ÿ2È™LëHÀ)£øCTÈ8dÊ-)Å̘~§ÆHÄOVEäAäc7öva±¡ƒ¶ßJâ—õÈ­è ·#Ϻ¢Ã»£¬¥fARö#ž2ÂMdËÂ-º¾i-sX—µÿè~0ÿUöÚ‡Éð[{‘ñ §Zc¨¬ˆ ÒM=žñ‡í5Šô•{Þ7]B*Å}-˜uûf¨VÃýÝ”½çmú"wÙ]ÁÕPgC¿oZhêý·ÌÚyyËߎ<¹qa‹ïP/øûôüÙKË쥧nž§V{²áE¾9j‰fÝšP, ’Ym™ß9ßXIXŠC£­WFíêÍtJa¸T³¥´ˆŸbÁ@NãÍ“5`:š>Œ='®GoƒåÌ‹à©+z¿rþ‹]Ñåmém²óÞ(a˜c<Ì^ RºY½ÎI>ï‡jh¨©|”{ YÂ0Üãt«õ[P¨øê‹Ümtk£Hš•ÐûÜh°Ï»Ñà÷¼Ñ¸ïxÇCP¹¦;HÐ)´#àíHJQ¶Ìcï ‘bª4§4^1œîð^CqÆëgNwÝlº›Os™¯4ƒkåOLwÚ%þÏxÇ?1ÞI,<¨ñ“Â׿«„ʺ\æ„uÞÔÑâã¯Æ®vÖ¨ÞÕ‚ÌͽîÈØYæs¬?ãˆâg;ûÿ³¡Ò•øq׌ÜïsVìáÅ|ŠVÛ]BK²6¦¯š)ú§v…»vÕj[€DƈüÈh¶€ endstream endobj 2037 0 obj << /Length 2047 /Filter /FlateDecode >> stream xÚåZYsÛ6~÷¯à£ä‰Pâò–¶Iš6mÓØ}J2E¤,Žm2)»î¯ïâà)È’mÆ™iÆž1 {ãÛ]À8ŠáG:Ž$¥H3-.b;º>‹ÜÃÛ—GØÏ›ÁÄYgæ§G?¼à<Â1Ò±ÆÑé²Kê4‰ÞM~ZÍ?Wéz:£”NøÓéŒ1>y³.ÎÖóËË,?s~ŸçS¢&›ùÅtF(Ãx‚¥š~8ýõèùiÃr ˜fæ–œä¤(A½œB1„)sr–« ~k–_Z˜H„5·“á†Ú»q”ÀÇ_£qE¢k;õ2‚ XÁÓEtrôWˆ'¦ ÆúŒÏ§OÒ›2ÀZ`DÙ8œ…@Ré>ç¤ÈSÃuèBƒÊ ÌHйv“ß½˜*:Ùä‹*+ò)ž|ð+E„1Òœ³rFØ\‚$vÍU‘%Sp÷Öýxz~lÙŠ¸ËS‰°ó‹ßÇ<öƒ`5>ƒàe“ãc¯éÚ‚*Ä™¨=÷*M8Â1ïèŒC:ÏH¬‘Ð*šO1Ç)>$FZÓµÛŽ™¸-W¦•{XÍóä"uªÌK76¿¸(`'ªÉb^¥‰ûdØÝ´nïxŽ3$Dãö޳;JõD”µ¼™) (ÓHS ŠrDuß~N{ò€Œ K#£{X§e±Y/šñ²ôs3'¼¼Îª•{jŒ`^Àh:ZLNWió]u¿›eQ‘º×K‹Veåfå…ødùÚè½zÎÚ”µ³ÜÙz xsW…û[T+•l'Æ Œß1´û1nÃRXR,SÆ<ÓQK¨×¡f|܄еÄÒ#ßbóe“C*0 rñÔǸVެÁ-ÊÕa¸Îµ¥£àº¡›Ý®ÂÙãzs™ýûuq=Ë«mXo¹ažÖ!b¹1ˆù \ç€ÏŠ k­i׃°nŒG‚u¬%Ҝ߬ûúãe-ª +h±t# [(4 í8É.§¸Ÿ%Þ¦Õf»õWSÎAÛM ý4(%l4Ù8È-õFÊ97°ðÒ<HëNgxâh £–²*Ö}„§[Ž Ã–Ô‚¡»¡¨»Úöᨵ…ˈZcp®Q«Ë97œ!Iï.qÜZ@>ñÈuÒ³{?Þ´¼f°µ±BŠ“CðŒîÃ3Êb1‹˜ ä!xF™@ÌQZ>Ά` pÖÔ²Oš(òUˆêÌVÍ„y`kˆçEÈ¢K‘½`Éa@èÿϱr»ôUÄ^ïÚžÅÂd¨xfa­JÏê:*Ë“ TkZðuúe“–^UÖEཀևå™çÆúj•z˜ â²Ið¬ÁeS³ÛEÙÂpv2U÷‘ÉÓ ' !ڄΉ¶3m³,œ›?®Á¼¬êˆ‚W[ÝÃT§z;9/žZá“1IæÆ dyx-íÔÊlD Isí¦üñ÷ë×~õ2£3¯FíÚ=jĶâ3ÚªØG ¿0ͽþn.â6 Ïw+$!©øO±1^VØ%[pU±É(þg\q×°™OïcÌÖ¥ŸßšÉH[·ªàHÆäŽ’ÅÆØšx‡ñ2…t’ô¹†ŒN1äwN·¬¾“©z; {¨ç~W–u£˜‡k ctIîVK@ÀÀÈQj CK0q`-1 g_Kô8¯ÓËÂ0¿²|ƒ3.#ÀU¸8W˜ŒÓIjÑŒ2“mvÌ%%b–Wߺz   !ǽʨÇÁàßwÝÀî[7ôw‡ôöðËuõz¢`ÕÀÚ”ßØÍw1·OaÅ•]†ÜåÀi=½öaG˜•ÁÂÅuÚ­Kš +÷dŸ8@B³IúO] ÝâSVÅï¾òØ–üYæDÊomˆ·NÀÄÝàŸHƒ‘QàßТíÛÿ£pöðßã”Ju” :º~¢È6Pí‘~ßû}çšM uŸæ·©]߈Ô7*NÝ$©Ñ·þÄEÃ1èAý³ÄÜ1lð1Ò¹èCÏ|³¹jë«»&’BOž¹iIš~vŸÅggpûfòà.2ئ-KΞ¾`@±ôœf&8ùÌtäïQé‹é­0XÖA\»õ × s :‘¤w·Öœd•ß¶×™¹f³ùµð‘xé¦'ÙòfÐÓ·Ç®.v·ÎDM10Åu¢íU ¾§}¤“Þ€†@o&žüò ~?þù[ð”‚w­œA¡B½›ÅÂêQ–Ë͈´#OkbŒ}¢Ö‡%j“5'QZœš¨GáìuóçuæŽ}ÿºÊ°®ëß0ÕHb9Æÿ!RL‘ÇÈØ/^½~~ eèEkäå*\þ Îéþ¬ AÁ4û*=ZÝkØX3-çŽæ(öpf¼€¯Ù€µiUêäìµ·!d‡Y§Œ_¾'¹^glŸì1tÃT>¹9z¹öMá¼Æì.…ƒÛlÊðwþ¿$ i vëUPñv0`«!né\µ„b_ö¸n…Bÿ¬C/Aì­ìVÎ)ƒ)*XÑîž})†Ý#Åy'¿”6Á Úhÿä"\ƒ endstream endobj 1933 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1253 /Filter /FlateDecode >> stream xÚÕXMo7 ½ï¯Ð/ЊŸ’#‡6ð­@æÐ6È!HE .bHÿ}µNÏl¢éºïÅæjI‘ÔPC=•D[ê-þ÷Db«ÕC ÄTCàÄ60–¸÷X±¤x ¡&ã±Ò’¹ï ôä%´´$×ÐRJÞFS ë]%5ç,u+žzZøS$܇nQ(…q–là NCÃ ÉØƒi"屆@Ô5$°q…šiØ‹X¬ bpŽMúˆºÀGl¬p] õЦƮ<~ÖÐuO\hà*$;èHY‰€jIÌ1VdOFØU y…ª‰µ„nEJu¤ ¡²Ž<9¬ØQ£%ö‘©{u¤ª–:"o°Ü$t,·:$XîÔwc“|Lnó$¥L’„úXjIx¤ …½4MØføBÄÌ õ êb,!çLð€ÔˆLuxðQؘT ]T•Ô6tá¢1ü¤Fš+”¤Ã%Ö8i0I“’Œ5ÔUÚAò¤LC·B2 ©Aê×Q‡(FH)’Y’• ᪗±Ë®a…`Ù#]…`¹²ÂŠ\«Û‘Nme ËM‡• ù€p I“5ƒd¡‹~2pR4…„.J˸6ø`J†Üc Äš¢ð ÁžéXH-t¾9Ý>k%üF—µ>Öð´È‘lCñì®®vûWÿuHûoÿ8ìö?Þ|¸;|¸»¾­hõ—»ýËÃíͧï·Ç^k?~ÿóí7ŸÓë‚Gªkç7;ùmÉðÙ³ááyzMÇ£ãeÚÿòëo ÅR‘“ŸÞ¿ó=7Ë„ÔNF’»›Q]¹Ú ³e«ý!ðéIWWi 툿FÕ{1±ûÑFµwÿ…evÿŒãWÿò¬¦®:~ÀÑþÅÇ›w?îÒk°òü:í_>ߥ÷ð ºÄ×t‰žO×—0¾K×äsGÛL¦œ[ës xɤ€8As´Ï¥Ð¥º¦ gÍÙt©l k ºêf*¹û§Å2N»)/§¬8ã§@ Çz1”=¤Ôè|J7Pº9Kvîs Þ]¹6EkÖ¶Á"^§Ùu ]‰ø*õ[™üš»³ér:AWßH—·]^6еE6®s`ôàé÷Ûˆ©edWX¤9¸æ˜Ú.¥ ë ^ý¼Ö-¼.@N”k•9£f6ãÀ}.'ÏÌwŠ,ËÓú waík¶j}[m [m5ezá9ÐÐ\dsœ¨ç¸ÀL\p¸–Ëyŵw‚fç³Õ¶Ü ÚòN€÷ ùCæ& Èf€¸ögò˹ôI§óéê[&’(èbñ9Ðpâþ>ªI®ÚæÀ]Jís â9Í„=• )Ld«=Î,€ñÙeV+7Êñéh 4ÃeßeT¥“#é (]Ú‰`D°™èbh%^ÓJe­ߢ–´~Ùêwi]€¼öŸë¦@k5ÇçÒ)P;î¶(ÍsSß$LW´Á"S[fxÂÀ'úšéüà-}½¨6.†Ì}íÙOLÃ+ á¼nË#å Ó%t‚®~>]R6е.õÄ»bÀÉÒì¿ß ¾Îï·®ÿû Û¯ëäŠ="¹¾%¹¾ê…øP?Z—‡ÓÐ?n% endstream endobj 2048 0 obj << /Length 2050 /Filter /FlateDecode >> stream xÚí™ÝsÛ6ÀßýWè‘êT(¾æ­×¹æÒk»OiÆÃÊt̉$º$•»Ü_ßÅIP -ÇÌt:scÏ‚ì.°ØýaEVþÈ*Ç+Åʹ^m÷ض6ïVîåõË âûm ãfÔóW_}+ÄŠ`”㜬®nÇS]ݬÞdßÜ÷]Ù¬7Œ±L¼Xo8ÙÏMý®)öûêðÎ}ñcqXS‹ÝzC'$#*_¿½úîâŸW½tAé™jšž'z*Г! Šz=¥æˆ0îôlï*ø"ÿèç"T!’ Û™Saf{ó¯nàËïV MWÿ±]÷+è@4¼íV—¿¤dF‘ä<ü~ÍHV~l¢%AŒ/#YJ¤tKîê„L [IÈ2BµDLÆ2ÄïJ#wê8T+$aï(L \ç7ß®5ËŽ‡mWÕ‡5ÉÞúqrEÊ… f܆iØgŠØ1Õ¡[Ãþ ¿¡×ïai¯»úú¶ b%‹%´]sÜvǦt­VCW·¬&@ê»­×Z.$¦«¼Èî®L +½•8>ØW¶·Ö! Û÷ªuÏÑZO…&«¥érëŸ{–ÿ­Ú†ð¶Ä:»,ˤ?çàu,Ÿø3œÚk³:5Á 1Ú·&F¥`´ì ¯O};|éÃET²èd×ÇîþØGTca8vƒ×%lÔÁ¹Í‡µ€]ÚKÈ?/’§²¢ê‰Ú¦’}Ç˽‚ÿ럾OÍ) ~é>ÊU°[ÌiÓ·ÛÒ¬{ÛÞwkN{œx7$——L™8p…(«Õ"€cæ’¹<p‘ì'’|ÛÔû„ÔRŽ¢‹ˆ¥˜&‘XìŒcœ…çŸrŒµó˜#)dñ)˜s²€T `D¹â¹FÜô@u62;•äòÙ0™=€OÂ+H’ÙbÌŠW:ƬYöP€ˆÞÆêÉ™ï½ —cYHƒl„!ü1 Ñ3° ¥: Ûí³1hÛàÞç¦,þPÁ‰˜>律㵆Yö¿²©Ý›KÂ<Û×.gG\Ý”®GtÞ' )‘¦t†Îc3 Z÷f¯OÌUÐ)nïßê¾ÅéôGHêb\H%ÎLìhÔ¼»¸á°¼3é}ÃTޤbñáxZ–‡°=@µËò,Ø’M Éö&åÞ¿æù> ¢á\^ß„ùÿæé}j•T6ÆDV]V‡mùbæâ’Ë~KÁý!e%±Ò±’.;1žŸ‡ LQ´ 4˜™8ÎÏ„†äzdˆäKEd÷| ™9ApÉ‹e¶eóÁšÛ@øÚ%ˆ…Â~cµ„| 3:‘w‰dŽ×Œ.!L¦àí‘ÈyD"¼AD"ŸÎH—}r¨ôE‚˜êæÚ,¾_x¸hÏò³dá2ц‚/›¸9[€8­åϯѳ«EtAan¡?§]={ôÇèd!thú(›A¤`£´öÄÂÐå¨0´«~7Y¬h>žж lW>Zaö)u!þIn«®‹ðØYì¬r ކkštÑB8„L†Y¡=6šï/G•* 3 å$Eºül¢–„|¡&j¹ÞQ¥ª´–n¬Û@øA7³kvþH™—“1m ¤ÀMû¢Ûš¯î¼l–[Ã.Éz$ÜôŠŽp|ô˜\3ÁýxNfŽÒ8>9Äóàh³ØPù›'psEUùYkIôô´¨“À@˜˜ÁIЬÇÉ9–乜²$ ̳⃵ÞáƒCbhˆ÷kë§®Oww€¡v•¿ìß}«_TJiÐTÁ’U[ˆHvãœÌk;ÎMC™’ù ,þ¿ýáâÞ­uÂ{·õq×ß<­%Á«®f̳@ÿ…‡sÈË¡©<Àøƒ™¯+›ò&]ö‚3ªŸTó¢X!wÖ%ðÕÌE!+‡¯‹HöI~`‘ê6’: l%¶—à%„S&!@Xx’_á>mîm‹…û¦“~ ÈG4ʹ|v‘ïIû»R%ŒËýu¿pæ'?:B2Å$æ«øXæÒÔÃÀGÄò/Ù ^FÆÎâ%e`¾¤ÏùÙñÿtù·¦Ë4N¾œ£¾'›ù9(-láG’b ¡^Šœ(1U•&'ÎñcäÄVú„œÌ@K1œ“a¥M«]5ób·Ë¬œ¡“é>l=Ä.•÷(;Ø"’éä'Ç‘*_;7{2]Æ`rJFQm G| Gúޏ…#•õåÏcøA=†#ž‚#=‚#“ÿµ‹ Ö endstream endobj 2056 0 obj << /Length 2270 /Filter /FlateDecode >> stream xÚíYëÛ6ÿ¾…Ñ/•‹˜åSó­WlÛ+’\›lû% Z[Ž…µ¥­$ïÂÿýÍÔƒ2¢‡»Ã.`‰"g†óúÍlAá-4]$B-ÓÅúpEÍhý~a^ÿ|ÅܼL\fþãæêûŸ”Z0J4Õlq³“ºÙ,ÞF?6¯—+!D¤ž/WRªè·ºz_g‡CQ¾·^få’§Ñ1Û/W\HÆ"–Òå»›_¯®ozîŠóOgžÉ™€œ‚PÔɧ’0!­œÍ®€ÿŽåß=-Æ´2“%WHíí;ºØÀÇ_”¨”/žÌÔÃ&°žö‹7W¿‡x2ÁI,¥Ïø~)X”Ÿšë˜!çáÇ$IµÏy[Õ¦©"±ÖópÕŒ0°€Çu_ÉY´ÎöM^?ë¼Î³ýá\AIây4!œM)ÊS”ÁyfaÊÑ ó™þE™ÜçÈx8L&DƒâWœ$vúÛŸ–©ˆŽåº-ªrÉ¢wne¼`Œh¥8®\‰<=YÌš7Æ“oïóÓAEßÙŸ¦nnÁò·ûjb‚Û¢¼Ýp1 '5I™X¬`{Lu;QÔI£½©„KáËbcü;G˜e—Œð„wÓwY¹éµãQ ‰aÄÍ{f)®«²iñQFkL»¬þ«8V½d¸Ó2;™) ÞÂfdæÔT˜œãKxA8 ’ÆÊ™‡YR}XMm) «¤½ÊÁŒ,$ø zBÓ³ç½Ù;¢&ÍË‘õe´/îjpà¬>ÙwGÊndmÝóÝ’'ÑipóQ€¨”ÐA¥Ö‹²hÑGÛðäJ LU¯^Ü)%‰5d¾Xãtä UI ¥j²[ÚfwmewÛØ§{ܦyó¶­«CXGÚ ‡ÜgªwÅ'‚tÓ=IÞçΡîÑ¡ò““£ªÃbXºžJFåËÀc@Œd"„m8V[Ë å2Ìë h½ŽzÑ\4TÎù_ýñâ…]¹í†6ù6;îÛ^Ù{«U´©‘ÉÛÀÏ—ø8ñ öéÖZ2ß}@)‚熸N†€g‘ãýXïÒ Æ%Iô 1Ÿ^Èo¾l ²y: ŠÄŠ„‰p4vÄ×y{¬KP“L£Ç¥Š£l¹bÑâú˜?qŠ5ai¿A»¼±ëÛ]nzkà‹±†÷ÙzM‚^2ˆÔ}®þ&$è…èxýzÉ ¾üóŸ?^ÿË¿Þܼúáåu2KˆJz ¾¾þáÅË y€&š°Q>¥O;@Të‡"a„B 4FΞ+¸]ý5Ƈõ±®ó·ÜÚæÔ´ùá[7oW5-3ž ¤Ï2±õ1¹$Ú€ur4ÓÓ¯ –ı3]Bpä‡vä%ÜY“çA×Ãl¡'©9˜jé).>”«è*eÉ™`ƒ’¦6è>ÀS±µ¿ee‡¬¦>û}¼³1m_¶Õ±tãŬ´vbZB­û;ÎëºKy DMÍL¾qYq4±‚ª1Öκ7¨xÅxôú®óÇ¢:6v`ëê8óŠßþ>µ›Üî²Ö·Ýú™…#s{9žJ²\éDGP"J³üØT·<{xÀÀ,Öh{ Àú™\Bk$=¯²sƒZ×4*@"©ÒèÙmìk“—MŽÚdpz¨HÅÆ}ÈÜTã¹vÈyr ZêÜÒÒJ âä&o·c™ØŒÝá„S'CŸÌ{ö° ¹ìþXgNåèôYíb¬×¡wßÿ‚:ݸ­ ‰o’—Ñ/FÒÚŠ<"” a†Ñ5Ø×~Ê\¬Uˆ,(¬«r`¤¢p‰‰2 z mÇqÑ–í]!õTƒ¥ýÆeµst®e^£œêcÌå¿y¡¦ÑPh~Rw,É$ôMstÇH‹‰®â4 ºØ!§©a; { Á yÜcßÕgœ¹ÐDB—6g.!÷9_n9ׄªôËE×e`s¸6Æy·Ìᡦ‚ǪqîþªÍᤣñšÃ‹Dg¦ÐÿokiÂ=L_ïŽ;‹'¦¬ÞžÕаØPÕ`¶jå¡]°„‚# WŠ‚I¬U”í/”ˆPgò8>+q¡M®LD„QW¹09JgLzp‰k,pà—¢œCáÕ71Á‹Ôøë«ªµŸ3;} iÛ ŽQ°sŒ˜‹ö™U^ãšMU~Ûv™Ú ›b{ò›™ û{ûqí<$mÉ`u?IÀD’~^R,—³$eŒ4Ÿ“”gaï’²Çþ£IyÎ]Rö8Iy¢O‹y4Ž—H•ϰ:TqõåPðX›'þÛ^ŒIòÇì)]Lþüó’¿øÄ“Á4x€f3£éÀ¸¹ãC5f/À"qßÕu급"Âï\‚ĺ…ž2Ä ÿðCµxœ7lµ{¹¾QK‰ïšCCÐÖö²ˆ²è©hwøÄ£2²@Àˤ¨¦|@\^Òµ•0äÚJ mޤ`¤Î›ÜQë†úþÅx•ÒÃÛ7f‰îzoxÄÒq‡[:7«±[ðîp ž n ä47ö”ºBW ¶½é˜õ*ÒîPV†#rؾVÑ@‹1‚Æ ¨puut§ÒYé`¬pÇfU3)+\g$ÝAQ]dwk‡C¾)À;»&ÛöW„k€ÅþZ°Ý®¥Þ¶nzY—ÖÈL(Éñž ‚b”DZ²s‡OCÉYØ;”ôØo÷8Ã2Í•Øqá35}9n¹•RƒæëÞpõÐ…·\(P'Ì´ð–g¸y™±c™´`¿jzûòÙ¨uyó>ÿ‹x¥ÁK„ÿW@ñô@,èË)ÒÙÍ æ'ï–CŒ.{ß!½ûŽ®·’]¼š†”í\wl{~ÒWʈHÒ;LL'‰ˆå‡/ÃàåÚ<š|¼Ícê¼Ë£Ý⨽–ÑÆnÙk™µ알±Ãú‹6\hÀÇ„CGà0ìtI“ñ8MÇGà++öôÞûÿÇà£cpD˜í\åÌ endstream endobj 2064 0 obj << /Length 1999 /Filter /FlateDecode >> stream xÚí™YÛ6€ß÷W}©\Ä,ï£oi±é¤GvÛ—4X(¶œâ«’œÀÿ¾C%‹²v“E4@‹]À:È™á\üL³ …?6qtb„ NÚÉ|}AÃÓêõ/žÁ⸠œõF~{}ñõ¥&ŒG›\/û¢®“Ùw·ù®)ªéL‘©o¦3)Uökµ}]åëu¹y/žå›)·Ù>_Mg\HÆ2fÙôåõO—×vÅùšéGžØiÀNA(íÔV&$ÚYß–ðߪü«“Ÿ!Ì©0Xr好xI' xùÓ„eùä]ºžÀfáj5¹ºømL'œh)SÅ·Ûºy3,+õˆzkA-?z'ˆ5,U¿ÜV§Z9ãÄXv­œYÂÅÀÙEõ6,¹ªŠ|µö óˆ+EŒœ@6øÙaÖ‹'S+²ýfÞ”ÛÍ”e/ã<=aŒ8¥¸Ÿ7ÂnÀ¢0ç*„õæMq˜BV¨ì+üÀhß߃ßoÀ 7Þ¨Ä Mƒ,#šéVðŸTѨßõ‡IÂ¥HµcŠ…òÄZ.4¡ROfà1¦XL‰|³XcÒ…!žDñPò|»©)³¹¯¢Û¼ºG¥†pÞŠÀELU3îô¬`DXÞs,³gÆ5øVÙ{\•$Ôã]¸B㑽€ÈlU¾ª ‹òê€÷Q®Œmâõ«)7Ùá˜kGLYB»õÅœ*7eã“£·ŽÄ.£d;‰Ü¹T }Œ)è`®W3àò.Zi¹X(X>Xm=ùk§…Õlòu\W³Åu¿.|ð&Œ‹Þˆ}áÔ4T”˜vwk¢µ­ÂÑAÉv‰šëÄHM‰i&š&¼iÁmÞOA~bÌ÷í_Ü(®·0Ñ[XK¨naìhY¤iÕ)7£9“›‘œ?‰—z˜&q5ÓZ`L…#Ÿ;ÚÀJœÉÞN•ÊòÕ¾øf4Ï`¯9Ö9ΫqbsëSÀÙžcà©wLxZï`wÏ}ú”P"R&çñ]?RpŸûF¼Àë°Xh’ Ÿ.«í:Qk²E±Ì÷«cíĪ>n‰0Rv)Yã·#Th¸V´.ŠÑP¢´”e×ê£ò›e¹*î«Sf±I¿g¾ ½? ?ÿþô)^•KüÜl³ñf¾Ý¯xù “W9è{2ígËí~³ÀDÝÆŠÍ7˜Å°7µŠ  ÄhU,bú¤û®¯TöO%> qg„ëó ŽâàIó Ä9‹úˆ8‰ú{çZ#â$JW>X6ÏW¾dÊyña¤Ã> ꬶ£v ·eÛ·úàá#ˆ¡ò_XõèJÀ›B}NÄc …L{ã xŽ‘.UÀN>§0nÊíï·Ÿm¥Ý?n2‘È£vû 7Aå§À¡;BEÓãí&¦Ó¾Hás-jw`“uD1ul‚ï_ð=aà†–›¸´Gn‚bE'í³òüÜÀ0þ¢ ›¿ ¡I^cØÍ‘ÖÓ:’ŒHÇZ _Œ¡ú~½º|>eŒeüøÝå×?üruýóãg—£’Àé<ôüòñÓg£â¡±RÃúÍýÝ-ì˜H؇‚ë’&Ý©…0ꬬñ¡NrðgˆºÁ¨ë¬>ÔM±þ2õ9à¿~´(“"&Âˈ‰}‰˜ç ´Áû6‡t á.b¡·œ&½òFäÜcÑYÑ QR‹Õëºêu]DD×GDwDD‡ˆ/ð¦¥AûãžCˆ˜“DH“†h},˜—çcs7)çÄŠBJè‘ò,¬èei-ŠgQY1Q/+žCkdÅDé +~†˜8~$fˆuâÜ„(9œ„˜.8%Ä;¹·Yãþç¶Ämc ö9rÎÖdÖNO{¸"ŒêqlQ\¼ï¸G{B,~ZØNï¹ÃßbI^Ÿœ/2ÚO,£’¡Våñàía°" °"-ÅÅú‹$nþÁ‘Tüø©(֒Љ¤’ˆëbÜNÆÇ¦Œ¡I<Ê2÷eI ­P¤£,©Âtœb$rЉœbúœ/[N1Ç£¬ð¼å$âwØ3™tñ<ÖDÇ)rô(+L²°B”Ô8ùñGT»þx¨"tûÇh«G¾©›j?‡Z(ürµÊÊ&ΆÀÅ‘¶`ô¾.ø8´!øãªÃ.NÊÃaÜ¢è=]äM¥Ãf9߯|;Æ5,ÈÁAnFÅÜwê7õ~¿ëµ­dE5áð•`‹|¼ZÅ£@?û@¹Ê_µ›À2@GU±›.Šz^•]¤ð V„Ø‚œw£0H„L: €ózYšÆã³y¹»-FPŒòΣ×XH2—ê­÷»]€±mÕ@6œ¢`à¶óÀ%Œ¥úw£è±úŸ£_¹iØC'ßø5‡åÞìÆ ‡åIó ß=K,hÁO(¨¿€•þ°‚Ú¡AQë?Òzþ\KX¨­U7c€gŽEãšÃnœfqÿ} &éæ_îa›ÉXÙ)øÄæRnãù~"äQ{zKüêŽBä°ï;@pÖH Ї¹S à¦ÜQ¼ýͽH¬j»³æ0Â%üõ¤ì~·Ø·´Œ޵ŒÏbÂ:ãël”ˆè8 ùÙï=Áñ§Ç£ëþTŠ6•°‹Èp'æI¨+0„môÎÿë)št endstream endobj 2073 0 obj << /Length 1728 /Filter /FlateDecode >> stream xÚÍYßoÛ6~Ï_!ìIjŽÇßìㆵ@Ûš·¶(T[‰Är&Ë+²¿~w$%[¶“رÚ-"J"ï>Þ¿;Ÿ ãø2Ï3+%óÊe“ÅOëë,þ~{iÞ'Ž·fþzyñË­3àÌsÙåÕ¶¨Ëiö!ÿmVÜ5e=K)sýz4VJçÖËëºX,æÕu|ñGQ„Ë×Åíh,¤ÈÁ‰Ñ§Ëw¿_vÚµG¤™{8-┌#ЄÓ8Å@ªˆs5›ãÿVå?,–×a²š¤}øÄ³)¾|—q¦È¾†©‹ '€ÃÑmöþâ¯C:A f”ê+žÌïfhŸ}ÅV¢¼aôZÇœö}½U±(Ië®…× ($sJÇÉÞŒœÌ×Õ¤™/«äŸÒJ“0¯µ •céÐâ‘Ä-«U3B_è|2+ê8ú9^¢µ?ǽÞ@1¼…sÆ…l~äš'½~{šbBu“æ!)ö-*Á1oÐ í'Ô®I•í,*™°²oѾJ‰Æá\QÂù¨ºI{ÛF±ÌYß‚kîïoMÎÍÖ>áÐ>Ñ#‹Ù] Z¥¸Ýû;<6.?ìOÀͶ¢ÃùSyYMêû»àK<~ª/äU<’«²Œƒ÷œ a ó^fFY&Ñ\§™³Ñ:ÚQ s”=TŒàÖ`B LPfþ]ÓˆuXdQT·÷qg5¾*¾Ü¦­¬šº£œ«e§PbHãÈk°dE»ïjlÖ5Ïèüß‘Öyq»._2¿f6!¼½.D=ŽL¾¼ŠOznÁû=·Xt»f›Ã·Ñx¶ ï"í§CX4³¢;žÓr%Ç“/Aød¼š0¾™’ì8.sÇ @e^¬âæ¦åGª*§ÑR9¤+Õây}ÒÌÊè“USTSôEQOWi»}JCÔÌá_$4u$ƒk‹qêÜ N²8RÝ1 >ˆÞÄà=½_n—h-È'#üs³šÿwŸ›çóù¼j‘7¢˜l)ïXÅ<Ø¡\x܃‘™ÖhYgÎapá-óAØPéüí†âoŒ»6ö_ kÅ™”fþ&QÀáhþN'÷-N PCDÑÊ›DZÛŒ-Ó;‰§qUÇÓ%;¾¿ôH\}·Hr‹°É-*Ò"¾ÛÐb¸·žœu© ðaúó7©O#@…ÇY£w† @’%à(þDm⿞Úeuµ\WÓ²þQÔwÁn‹Áx û‰cêW¤¹ÒžiïÏ«_=Ö­"ˆ’F}/þSƼ0þSÊ0¥üüG¢¨góßmY]7³¸§PÙuAv> rñTµŠ?¸¬èS §Ú,É4N܇£€ÅFÞâ;pñ}T¶\Ä÷Ó¢)B€„·q3|‡:I^ߣÁv \¯r$:¶é”n‰Né`Ñ £ÓW$­[Çç¯=¼;áá4Vî6Sø#Tk8/<<3X¶( ‰‡²Â"ŒeÂ[Öõ62*öàuµZßÅT²¬›¸O‘Ì†Ž‰–£GËaÒ!‡øˆé¤ "ñÈ(#É $ ÐǤAô¦ÒÓ{C¥syçî›¶B(Â>L!7[Ê¿Ké,µ`ÚÀù¥3 ’ÂþÒùÅô>¤ôw0Dî Q`Í©½.wÜP±YÞï&’Ó†ÚIÎRÂ0$ )öjf\×AÀqÈx½¡]Œx³^…âG!bÁAÏIôbÇIȤ±’ÆwÛ•4ÞΫ¬˜6"Ä^ä»1ŒÇÈâ%QC5†õa¼ùÒØQ`@Ô&QÏè ?ZYwe©Œeé¾ð©t OÓ%¿O—°E—è’oâ³–-¡eKhÙ’ï°%ì;ͧv¬ƒ>[r:-I‚ðý_f{­ˆÔÂhóÉ#µ3Æ­Ãzà°n³çµ–ð—ªç2ˆ vjg‚цjª[d©v¦Û®vvmíüd·æ‘ÂYF@1=èãÒ'&¥AÒÉâÞ•Ñ›ÒCOï´¼*Ö·Mj=¯tmFRâåÛ~Z| Ó‚"@2*ÐnÄ`ߥeÖ;´—;·#-0‡é—D=Ý“웢6Œ¿¼Š€ð¥ÔC¤ÏNÝ'©\©”&9³2öƒ)üSow•úÄó¢£™¯ó¶?½a£Ä“õ·dFîõ¬iÝ% á¶}Ü4uÌŠj¾JB’¡AØ?- ßGé€NÚ¥­³Ã´Ý]‡=æ–ˆ±aÛß»»bä°”Ev endstream endobj 2083 0 obj << /Length 1999 /Filter /FlateDecode >> stream xÚÍZÛnÛF}÷W}¢‚j»÷K[4h¿%ÁHŒ%Ø–T’ªá~}g/¤¸äʲl6 $´µ;svvçÌÙ¡H†áÉ ÎcÈp-î.°ûmuù‡÷o/H7‡óÞÈ_//~y#DF02ØìòkßÔå2û˜ÿ¶*vMYÍæŒ±\¼žÍ9ùŸÕöº*îîÖ›kÿÁÅfFu¾/ngsÊ8!9ÑlöùòÝÅï—wAéaÚ‘#œ p2„hÀ)5G„q³^­áoëòïΡ #Ü`N…µöñ3Ζðá» #¡ivï†Þe0€hxºÍ>\ü•òIE’óØñb½[A|ÆŽ{ÓøUiab¿»¢ªKëv¸ƒÔDD‘2¤¹ð£?¾™i–ï7‹f½ÝÌHþ9Ì”!ÈAíÌ9ÓrPÜœõ¦™ÁVˆÛ+¿Ò«žc‰ûŽ 7HÚNÿ„^LG”wƒÛMÝø3´˜Q•¯ŠpÔ^´P$±ìæv‘"a IpzBR@æ”r$ˆÉæk"ÈØê0°ðÈ[«.x¾)îJ‹˜çÛ¯y¹YT;g÷sc3ãa‰¡óòg?¶D×è°½ Џè|ü”‚!¢º±,k6_|qÆózUùÍ2eYc˜¦NîF8x"!â!‰˜bþ£·e»c>TnE>ÿïì¿MË_Üòý {tÖöø]ûŸë¦ i#¡ú`pìó}Ùì«ÐfBäÅí¾C¯S Q_Ax<5ÞÞÛ•‡m\l«ª¬ývm7Ë>Üfë­þ¿}œ±sc»€øAƶ9xŠ¢„ÜLOBQÖå*é#ùªtÿÝÔ°Ic†#­§@1FŒ‰B½ßAHÁÿ¶jÊ啨MM@˜ c»dFcŠ˜æÿUB´m¤¯ìºÝ’¯v)¢²±Â”=…2ÙÁ—=´ £ã(2¢‘‘&M ÑDbÑ‘!ªXÄØ%ƒ`,œ)Ž©wݤHY!­:®mvÉÚ@¡&˜û8#3› 1!Gü™ÜEØn: e_LàÈÃ$wäRq]–þÃGÒÓ'©3!  Ã±:/¨1R% € gŠv§Ãh·Õân )p0i˜â›õféqo÷ŽïWeÓñ±³:Ï×u .—Ž–áìÙü†ŒŽO˜°®ì *¿ƒ€ä{x@Þo’ 'à]n [`7¦à]k‹Ésiw -íö8q’ÊЦ’‰—ó^o–ùNºÙ§Wi*<€P¡pZäY²ñ1d–HÆEJ¼ˆ™@BhgI1 ŠÓ*ZÁJHä aÌhM1É_‹ðˆUÀî9G™9MqÒ ÌÔâìT†rìÀØßŒ¹Ø~:Ü*ôñ{Ä3ótù¾º+ÂuÀÈyQÖTÈ”] KAäÓ͘Eí¶,ÇùÆ :à(¹Œîº½­ÊVôPºH^TË:M⮻Ÿx»gÚ Iø$nmú9—ç€Ðrø‚õ}[nN“¹|>™×ëË«#:vø&"–I8z„N!b­)®Ô÷±?3¥L’)øÛšbT=‹¿ù€¿á`]7«c Þ° vwûæ,Á*›KÇæiµJ /Çjæu¸àÙá)2·¿Ý×åÒ?}ÝVþÁ^4CõfŒöQ Ç«ö³¯º×Ä4V«²íF­NÉ©T{]6§Z[T‹s9u -§FŽ7O§RÆG;ÇÛ§JŠo×> ˆRXF”'iUIù %Èá6—ˆ6à†žì¨&(I„ì¸~â ôÓw—O fnÝi2LÓ~×_U®¿ªòö¢诲Ð_½îu)ŸÓcTôoš1ÌÍHüÚycð~1h³«#… uË8V·lá&Ïöލ”zIÝb ØmÐÝu“ÓSuË!ãnðµ_§m[àEh“CÂp2¸´=Ö>ŸŽ! “u‡­­CkÖÁL½ÀÂHK6c81 â9†&˜Éø4N€*Âb§7¶ê”iî×k5=÷û_5Û«›Öó€úAa­ÏRÐ!e޳='¹®@Ü–)«ñ˲@¤és‰¡D‚+¸í½´É,9’ K­©3šÌŃD„ö‰Áb|• ï³$x4©ŠUBM“Á±’]AÜu}¿­–)qé ìÕ*¡Ê¡* ¸±¦ŸÑY6ñÕ„¸ä°¦è¡kt*’íBWK3lrðd0{=æÇ%‡È=Õ·MÊO|±z4fœ“p2EÌ8lƒ¢rfÌì"ŽÄkxú|µ·ºNéÁ‘{pƒ*©é^RÇÇOBXô ”G¯…†y†„ °ù%Ð(dàÖkM‘–j­2{x$«  ªX¸Ûáǧ¾Ï=)¤ŒnÞïÅ‚€"Bå@|Ö«òvªSá-Dq{»õ/Û‹¦\vo¸A7¤e§v=NÜ/ñWëͺ±ß[G¬® ² iÆñRGŠA$!CÀO6 œBš Ë*(p»Æ~¹g·Z/ÂwN~Ÿµ nOZûgIIú ëÌgB^¦è$Ð'·–ì%Ñ­¦ŒÐ‰Юâƒ/58&œ¹—KËäUR› ¿ü±Þìö ‹ª*zJü~íû¬5¬¬aÔ†ã?R3á~ endstream endobj 2093 0 obj << /Length 2138 /Filter /FlateDecode >> stream xÚíY[oãÆ~÷¯Ð#U¬§œ‡Ìc/i·E‘6ë>m Z¦%©T ç×÷› /C g×A[Ø€†Ò™9÷s¾Ã¡›t“ÅÅ9ÉDºÙobóm»ßØÅ÷¹¡Žî„·3Ê?ÜÝüþ[)74&YœÑÍÝãü¨»‡ÍÇè‡üÔíö–sÉo¶·BÈèŸm³oó㱬÷ö‡äõ–¥Ñ9¯¶·Œ J#šŠí§»¿Ýüùnä.{¥˜šòRÎl.'¥)I7I*åŠzÊ»îY‹Ñ´UQköKí¤"‚ 01Œ6"í¾?hEDÔ6í1×Ãê8é†Ô²æ1Uu&³°ùkµ~ˆ ,›z.?½Š‘Ô*YVù}U «æéûqÿ}ÑŸ[—2ƒ÷ pù&”º*&RÉ!uíÖÎ&^Í¢DÈ‘ðÃ_ßãÿówö$IhJRíîêÑy·3ÑuçjK#§€åbì·U>KHLÑ5™$B(Wæ%þ‡üãØZ)S„fr#qhÑ[?~Š7ø !2e›gCyÜ"¨.ºÕæÃÍ¿löST‘DsU™åÛ" P*.ù¦Œ¤"{¾iJX–ú|‘4MqCI&QMwLzFPÖm‰ºgýùÙš÷sß|~8'±‡"$‚!›¥.³¡®%|ŒN+&æ~çes¡ÌL Ë5¢À©i%Gñnh ¦-qvé žÄ$ál#´G“dé"8mð‡Ü÷Ђu"H’¤æ¨˜5%¤ <©FaÅþåTFÀ\.”A“êzÛC™JÀ1óúÐN«zÈ]é Ú 6NÆlom;»·À¶liÈ®ü¹9E¨%b#B r|… ‹ œ¡IÓW[°­gXû2Ò…Vê)Q”¿…<–@7¾3$µâ–5åpáóµ2x#„ ™ä„g‰ßã¼ÌYBBÊ’$ìÆ¼úË]ß»„Œ-WC™PGB"È’‡+(e]öºHÌñj£+YÑU`Pã~[ … æŠÈ%¶ß馧›>»4O‡r÷ ?äIáb g`tÀ"u #2FÕ(ˆiö+£Î×%_¢ê£bé&Ò“oÅzB%CâTü1A]à_0 ¹¶lˆò>_™íñKIÖÇEýFãâ$ ¿" cùß5keóY+g-¬´Q4ÞuÚ.ŽÄ€s,:7´Ì†›åqËÑ/g,T×û (×T‡bI®éFêùü€Ç²¾ ä÷£Š4rfòŒlæ˜lÜ0ŸlfX¼û?Š_Cñ&àÉÛÀx}V<˜s§±í¡0OÝùL-XÓùÛƒÜOLø– ¢âä7„oW ^ ½Y†Þžð¯B4`œf GAf–~¤ñÌ+ ¦Ãì¡Cѯ$I–ȇŸ»|´šª¤tÎf†ƒ s`ŒdÙè< kÃŽHÓÅÑ£c™DöÍ…Áãx )þb Å €¦&âØ\¡ÆÏz@æ\!ȺÊÙì«@)¬p\ªÔUl>½Á-ë5dŽÄM—ú,lN Y“!Ðy_QÚZåš™d œN³·0 œM9ßLëÎ×ïÙHl ë4ÄA­ÑnìŸý"ö—)úûŸ‡þ+6ËäBÙ'-¸ F0àÞ(š¹º0¦3 èéwXŲšSH°y¥ò/Õ²Kxm*U±.Á¦×¥/ãسC‰/ïU=´3¼¬újÚ{ÅYSj(“nŽsÂx¢¿˜ƒ±ÁöÁù«sç®Ì˜wé“ Ó$Ø–¦ëÊûÊ•W}Ñ»âá~Æ£;ŸNU9üâ_"i^Û”:s+Gïç´ÝP —cÜP¯bw»S7îÁ̱zÚš^É\:w-%‡k)}÷ï;wAtÖsÒPXM];wýÐÎf—GE(ïg!8M‘F몲7p4j¿x|ü­ÎŽ?ý ŒHC endstream endobj 2099 0 obj << /Length 2315 /Filter /FlateDecode >> stream xÚíYësã¶ÿî¿B©L„/ÌǦ¾ö’ë%½s2Ó¹»¹¡%ÚæX>äêþúî Ê ­Äj“Îtìñ±Øýí‹Ý%ÅðGgi™ LôDï­õŒ/¿rL™Ô`ª'¿Ë¶«uâÊI¤îè¾¶ßOø†30NÌgI!Ô±oàIçî¤{®9’Ë$á<5¬uv¾Ç˜ÌB„Õbš(ÝýÏ!¨&š¥G:ð*j‚L9@Ó¶ÎnƒÖ’–œü'$P ˆ<*;ï£*Ai¨“>L–÷u»i»°¸„­ŽY–Ûº±&Z¢»¬z"íÇÀ Ù‹9ÄŸS_ò@€m™„%aiò²`ÀÂpŠAƒ)¢U:h°ÎƒJpMÈ ç³•ñÌÉ’ÂæZgŸÁ\B§DáÞ{Ö^ .R¢SÔÓ¦7Ý8£ò ©½PR˜³%–q"…¤yÔ15çè’¾qˆ[j¬—Õîw½.á@ÒÑ2kò•}vûö0d\/n…&<é7®K´Å¶h0‡zzŒ€)86†h'AU!Äá(ã +ì@9NN–@•‘5ÖõqÛdÆ£¦´¿{Ãd¾ Qç^pææÇ„yúP4wa|N`žŸºF#*åG]RÌo»‚¡ÞóçK€Ö wYãÔ[l^ª†ÜêÜ×ÖF5縛² £wP,ú.>{ÕMÞD—#°`HˆØT‰#eš»ü)kfëÛ²‹nÆÌa”N†oã>}Ž+0‚džݵ.ñdº:³Qlí (ìÕ*k2KÕô6~@ØÝ†èÈñ¹ã°«Ê&_ C·ˆÆÈ‡´9g_|&—TåMéÃQ¬G"ºð^ñXÝë¢NÔÅœˆ•B&¥zÒ™gÉ?䨫§B¨3ª:ÖJ÷Mßó˜ð€à$IÕY\à©ÀQ®:V;vbP¶£àcþë][°Âkå™C9^øyá¯õ¼àÐOÔ&iàÃ.A#8"E""»ŸËº.®×KŸ­¡UAÀ¸âÚé„/êv·[Ý›>ÙXáÈ|vŽ^ߌ PŸx|BÙ„è¥)ÅîÌÞº0ÊÔ+P{?—I”™b´rE¥Ê÷a<²Þ»¼i«m—ð¥5Ûü›àY ê»®uPÎ Ù¾ÿÛkøÿüÃ÷ÁÜ( Õ}>*>Æ”»ÜÞ.—&?×õM»†œäT÷L š&$†r`Á ãè: çº5Á¡ÐaÉYº5äŹ³e¾]V‡]¬Ñ4=d •_¢Ç’‹}  ½"„w ´cBÅøYä3I UìHóÕƒÅ<Á;pêó÷ªÎèŸÑ¨ýç|èPÆ¥#ÃÞA%§ô®ì?Ó»¦'ö®zWÅ RAPb§¿¹‡ÞUdd%(?µw…ÂJBU™ŽÅß½…õfÎqžpèÕŒ§šˆôE=?K‘Pø!+`{jË—OµÇgoù ñ¿¬=8Êç°•€ó„*õkmUìU{lJ¬N+·áÀåsœ¬Å¾l›öÇptÀNfvÙ@‰¦)”1̰¢´ï§]=ÔQ™ ÓwÌï;…Qfg±Wfirlµ3OaL˜õ ç|¬Zú…‘ÌŠaÉÏÄô6’±"i"O¬S¸í?ÀƇèø›œ¿HMÅþ?yÉü¥+'‡Æ‰FÿS#SÀc]·4C¤\í`sú¤%·ƒ‡"XW&àVýB=–Åî.wÇʳ³'q4±Ø‡g-бßÐÜcPÙºøâuu{ ˦¬&†((j ijˆffçiá'€¢Ñá ø{j¬æP–ÙtŒ6âÒj }ÞšÛüa}è¦j&c(“1¼á_k£c…ÅÅèÅ 6“šY¤£0îU›ð ×~Üù€é ^äþH„{ªwþ Lì:½†üøœÇÊj2Ç8Œÿ­ã8þ1G‡¥}÷$ÆÀHp"Ä¡n}|0¼(ÄW#|] Lß Ó1ËÒÀ(ЇkSU‘]w'w‡x0ýÐÏèð8ÞÑšGn.èÐøÐ/­Úxźs[¬lýOÜ‘PÙ;k$ˆL·1àÑ&oîJ—Ì71D&Ãò1¦"w¶Pz™ÛŠß:boèHBÃÀ+üD 4÷&Šp“-› äîpÈg¯ðÌÅ_;Ä«ŽÄŽ95×s“HSÕ3má¹I7vZ©Sn§•ÇÂÝ|Ò—‡óIÉb3Ÿôé =šV mK¡‡¯1˜~€QjÕÇW?üte/®[œ‡ÁÝhM_ƒïÜ÷üž‚…!q)®›ŽùÇЕ©Î¸þõϨD/מ¹½6V™žæÍåÛñàõíOoÞ|ÝÕGùT&†õ†º«•¶¥‹îÚ¤ÆÞ…&àÍÄãð5J>„Š—QÞ–xlI”4e ÞüåòÛw^ÿüñ ‹ÜË·x+º[ÜX÷šÚ×Я¬ÍòÚÞH’3Ø›ËÜ„G Û‡±Kp(òõÊ’Øí…óAˆ®aíjå#¨ßq6ð~TêÕöY¶ZÙ‹]æ.0éâï&»wŸ'EœZC‹~›ãîËÆ^º‰‘[ÙÓ^wýƒùê`ŸÙÄ„WæƒOÞW³‹PpûºðáûDVÿ íÞVÀ«Ú”UŽíX‹N; ¸Þ˜ܶY•¹oQ¹#²ŠðÈÁ/ïÝÚNö¶û6‡<•­»Æóß­ˆ8T endstream endobj 2105 0 obj << /Length 2251 /Filter /FlateDecode >> stream xÚíYmoÛÈþî_!ôUX{Ü7î2ßÚ4iÓ¢¹k¬;à Z¢$©òÅŽòë;³³¤D™²³È]ƒÖr9Ü™yvÞv–BøÇGq82R²XÙÑlsºÙr9¢Á»¿_pO7ÂÉå_§ß½ÖzÄC‡1M‡KMç£÷ÁËU²­Ór<‘RúÅx¢”~(‹e™l6Y¾¤ÿNò±°A“¬Ç!ç·ÑøÃôŸ¯¦w-ÄÅDÊGääÜ2;Ьb\*õEHðÏnlep‰²†A²®WE³\Á·Aú)«j'¶âqm¶ët“:Ùë¤Îм¢Å¢†Y÷Å6™ÓÜ]VûEêUJSŸÓ² ©ë±0Á®NÙxbÂ0˜®²Š^lÒ$@³ —Œk¶^%5`' Ü‹†6^~÷°r·ø'¥™ºÀ¥‹¨‡E¨™U8¸¥ÿäizxif„i)°yéÐJ{’ÁEb&tÜRÌ“:¹D±¢ *ðW™W •Çß-XèVUÙõz¯‘æ gU8µòïŠ2[f9ÚR¬Ó|‰ˆã›d6ˆ(N¸2Ì ëÁä^–tV w]/‹Í6)q]©‚¿\½eœ õo¯ÞÑàn•ÍØ‘Ì ošTÍá{·(7 q dÌ!2¸¹ÓÊ<ïÒº)sZèv¬5Xa“ŽyðbU2mt +}Z íŽâLéŽðêoàÿÇïÿ5¸ÝšqË[Òì—ËN­ÀƒªZ4kÉ« !|ŸOx±ƒ+ Å$÷± «^e­[ÿ·óW. ã±EÜ8}ÿ!Íá%˜=ÓVŒîéf¤8ŒÖ£«‹ÿ_÷9s)X¤¬±8òŒÓÜmïg+˜åñy8[ËpìqÎnï3!g<’ga*ˆE\©[%và=ð“m¯ˆ “Úºí A÷Ùû×öš|†V ;ûaoCœÅZ ·³ÒBXíÜ<ËÁeµÐ~o?z¤?f·Óz·õÌ£°nŒb1ï–ø%Ô¡ç÷¬• %;c%Óq&øg¿¨8” l[˜Ž|•äóu:´ª4,Ò¶¥»¤¯N¦„ôFf¤cˆVïxk»QÒs?ب#¾`<”°”€¬ä¿q¡yG!bP-a™±¸7@; ¦2y¤RFñhh͉ˆ5|{aí¦J–ƒ é Î8àÀ)Œ\p&c5Ò6d¡”ÏNÍ”„üobfboペAd7Xöw´ Ù=¼ €Wµå.n'åÖ«›.a’“ßÛÁ´>fSeŸÓ;‹bð){°¤AVO+Þ«éò$Xâù`É}Äx X.UK 1ÀÚ^Ý3 ×àÖ!8j1kŸ ¸K ¸T¤žlmYþE¢ëìQŽh˜‚»‹¦~ªëC$l̤‰Î‘€p¨¸<†è´¸ä¨ÒaÕÏ .8ljé< IÅûñ«ò{É*.¢vÕTàU]BQí§NþÄ—oÉz]¸ês–Ôéœæ¨H¬ •e2R-Ÿ ³<«1»(Ò/Ü ½ïž ë >C앇mÞX¡Žõ‘²7(8åI4ü¶E‘ƒÀNø üšC"¦ŒžJ@ø‘Grø”‘.ÛaE~:Ë»î0xGGÕƒP¾ƒL)éx€`Š•Ê åF[<œ ká%êi•—¼Õl¬}¦³l»"RÕÁßTé‰'Ž=9» stœ2BÜmÛø=Mʲ; ¢8îüI™;«³d}vç‘ö”&2«‹rP(bu$Ó>âõ!‡gÅÖß0(9±ŠE+…—Tö%UKŠHã–cñQ”'`$)ú"çÃ0âà!MB¾„$žaûÛ꽊@GG"BŠ|y[![×W IŒ{Bî“O?ÖèX´[`žÞ­½œ>К} íäkã.*p"2éû‘é0½A³(6È Gí„Î’ë6´"ï±—ö(±_øpoà„ŨºñÒôdEŠc| m»q¡¡¬3>Ì”ôD0qzç±]T¯(oÍi¢©(Á"û Çy•z‚{.”Á€Øçž¸ Ãa? O]g Þvñ’YÝBþ ßœF®Ç¿ó´ÌÈ«ç- µØ,¦€1žaÛEM·hóH@l<±± Þ,˜S†êñ /ñÌyѧPˆDC«ðèÀÐ¥øEE€³æô&)qúû§4¸n°mâ6 ž6(|ãÊf|ç¬Å1OïUŽÄ{Œ©ÅƒP¦¥ã*mœÍÓO~Ý7? ô Û|¹.ªúÒ[sêùdO&¶P‹©‘„ÊÆò/¬û^ 0tîVÂ>ÕÃ!cp}¾Jº^JovÛ€o ÉãÑY´ŽáÌ|¤s¿Ø ø½ ýØ7q]`i#_Vû`Á gª+Þ ÁDKá{ÁÚµ'_¾Cçüù‡)ž¯Þâ£j1ž`-êêQG?§¨•Vô˜5­˜§³Ô9WÑL} vYºž 'œL?ƒ¯O…«bƒØ,ò$|îRÑ\2ŸÓ€çHUÐï&¹ñ­lƾ‰ÞEIaX«ièÛþËŽöºu3|{CsØq„½GÞ˜“!½uÁò(![lÀ9#ðÄ×|SÂZå¦(S¼M¼]ZµÚQ¯¿wØãIJIJº©à)‚LñÿmË;÷±'÷a>YƒßÉ-ÿvÍñíšãyÍýLs–K× ã'^rœ¯¿âèó}ü¶ÁãPüv· §¯4ìϾ~Æ«ñÄ«†ø©W ‘fBZw9 ý¬pÈ(·”<ÿMƒˆ¿äªÁš~ ÷7ºi@ãTFã¦ÁÙ¹ú /ò3]4œ«ö¢áIXÅ_A›üžÝC¤Ák qˆ4  ÑéÍž`p-ƒœýìn¹†ƒœßšåßšåÿ/Íò“]Þ_Ñ+ÿÞ¯¬Á‹áíб- endstream endobj 2111 0 obj << /Length 2473 /Filter /FlateDecode >> stream xÚí]sÛ¸ñÝ¿BÓ'ªáˆ‚ཱུ9§M›ú®±ïfnr™ #Q'©#);ίï.ü¦l_­<´“‰3ÀÅb¿°»Øå3þñYäÏB)Y¤Ìl¹¿ðíj±™Ñàíß.¸ƒ[à¢ù×›‹ï^ÁŒû,ò#>»YwQݬfï¼—ÛøP%Å|!¥ô‚ïç ¥ï§"ßñ~Ÿfúð¯8› ããÝ|!¤âÜã&œ¿¿ùÇÅåMsz ÄÉDÈ1Q—NÎ 33mãR©ù±Â#‡ñ€EQˆ-å@!ìÀxåÅE1ç^<¡wOìÜ¥Õ–FYr·»w`»]Ü…Þ2®’­%Ù²¸?¸©ôVq3GCÚ…#bÁC ×4ôî’lŠd1…|;4ÐÆwIŸdå•é·–¯ŸÄD‹X¢,bÔäýÜHϲ2[8jˆöˆhº$ÆKØåË7ŽB/v+8ÄxÖn`fÅ2>TižÑÒ>©¶¹Zѱ$k$¥Û½Ló¹J@š¥UïÒ/q%9+É²Ê w|æ€?!I‡ 0|.8ѳ)øZÚI¼¬À„wnv,ñh¥%ý®’"½µV5ˆ%‡ð×A6Hðöƒ…m6_˜Hz¯×‡Kèž'<ÿÅî÷²¼ßeˆø!ÊÐ(œpÂÐbÁ_äÂ€ØÆµ¾¡ÁÇ#ÈXZEÁlooqY¹o¤𬒑íXwkBíU5ò%@&ÅðÈU²Ž»jJ¯¼PL¢Â!ýu $´VnSø«ÝÊï¿Ö2gnVè/Þ½÷g+ø1Îî,Ü~&™%Œv³ë‹O9?!8ã:´˜”ïDëîøÄ±a¾àç8W æ¦.ès|dÈ™ö£s€AX­ìÝ?Ôz·:Yã¯%ÃZ~¤Å,AÀå*§•xg£„ÝQꕤzÊ’Ï}#Mkk›8ßåeÕQ³õ7<ÐÌi=9¥{®4“D!S&zŽHxà3iŒE%õˆö!À1¡ÄYŽ8€DýƒÓÛ#éœk2a > ßB†Ì€ƒïó=0 éšFc \êè‡z'òˆùÈq•‹Ì¢ÚÆޤ÷ÃåË·è¢ýéæ7?ð/¯pªê)FøåøŸàWä’’¦Y^Æ,Y&ÖÅ–Á‡ G€û4Ù­„B.&ŸÁÍï&BÑyïÑ ×QË…,œ÷$RÒZ¼ZÑà»^üÝÇä­q‘oTM¨ÄÆ¶Š†©Ížê ìÇEÈ%~ýDkÝq„ѽž 2`1åc»¼@¤ÛmòR†=\U aãÊýX®bŸ \IqÇ¡V5wŠ"“ïD ›c\PòWYCÀ5bDzŽüü“Û[ŸQ†aÛX¹ãÙwÛ¦$H˜òÑÛlóã2Åaóç´¬(óÈK÷‡]²Oˆ&Kú¯«$£Ä¬QÚ„KÄ+,}IŠœ–(¸UµCßwf¹ç˜¼Ä€tl;dÙRt¯LöŽ~;ÙÚÉ­³ \qQ¨{NÁÀ Š: üÓTž°P4iâ2òd S 2‰$‚KÕhžè…öÊñZ™6€_RX^–)%ŸÄfk›IàÒÖ}3Û¤> ÞMTáK¼ÆAC ¦¯úURÛ,£ øe¾?ÄEBNè/×WŒ“ãùáò­K‚·©½+.^æÎR4(Ýï@n^ìc:$v%ã÷=ØÛ¤:!‚\++<&pݾŸ’jè3È~j±ÒÖrJ;Š34€× ~ü示Æ ¯A19– [K{ûËr}ÜIŽ êÃ~z„DšùÞWB±è±¸*€sx±¨P@Æ1J5#š£܉~€éÌ%àPÊâ’¨=X3<:ÏÉÆ0¡MÿdЬ’7‘u \,_X9i'§w¯Ðý³¥õ¡Ü{ßê’³(„•°4ðfm®[ša|òÇò$ =[û½k¢n§” rÙ éКŸRÑ¥Kq—Xð-¼’vÉVHt`j¸„ñú„…Hx{û,+¸»‘40éŸ jâ¾´¨Bß©©yáUdKš†ÜOô0 3rÀ’‹·S8!+…§º?pE€›žg@Ö(8œ®§touò8qñ€~´éê‡ÿ‚Á› ŒsC`AIJ*Pø͈(b6 *K¬ sS<€£–…¶²Ñ×4‡[ ……q¶•д £ï-þ¶Øó8þi))1-å9¤¤”dZGC)V8×]7qÛ«=h\6ZJxú2äwµÅä9iqøŽÔ­£z®ÅIÃÊÐZêgYœL¡,•òù“-.ûºwÂÞлˆèI2’ˆ*g‘„ "Êè‰öÖµ¶~ðéûûîš*fJ˜øZ÷Rß^PéESþ\èA1³lB–ª·RýÑ%j®ÖdÚ:¥¬kMS¹²2LjUŸáÂ- 1~vøè§h>´ö=]·…÷0‹ ÒöÁNnô”×Åæ¦ˆ\Ø\Ÿ¡.ÿ±"°Ï~‚‡sŠ„nPêÑ—(Œä€ {!¼Ó6u=¿}|­ï›Zþ=bTûàAú:±˜ª“–ƒú½¹ÄA]àÍ6Ó\8Šz\4‘nð …‘Þ-×7ï©^­~T ¶yzS ž"ŠŽÐtª(/º¯­ÚŽ]±]5Åö†RÙ§T=N)jE‰¥ä¼8aDE¯‘@5éíÈaUë&§ÛÓò<Õ6@Ý•¬KTØ?é}x€Ãê$kDéÐBˆµJ¸ÓyÕJAB°ôƒfȸÛ1Ñöé”ÞVOSY^œ¼¿ŽÆ>_Ù´åãà!Ë?Ù¨r-©††0| H:eøðž’g±ûšÈÚ ª‡‰¤ƒ{D>£Ç÷ÇŒü[ƒ¯ið¼VŒê6]àÓ5;PE¶Óª ÑeµööÓœZu0èµê* ]˨ó‰64Í9¢£9¬œªöZuR‡ áºnTÁ  Ì0±±›V  lÐᦖ€€Öm„%lÐÉ0° ºÂQO®³±îÉÁYÄ­¦žÜ'm‡NIÞéÐa‡å#IŸ&ã¸b«¬ë¹0h:t¡4ÔÈ׿ ¨í "LîNl–ß\^ -ƒÂ—«Ÿß¼yÑb×CÇnû?m¡¨ŽlS‘NYÔ™­«ßm“"i+õ-×|ýª]¬ªýW]þÚVøÖUøú]þ­­pƶÂÿPWátKA?µ¥ ¾FK+ÿ³ Š endstream endobj 2117 0 obj << /Length 2400 /Filter /FlateDecode >> stream xÚíZëoܸÿî¿bqŸ´‡[V|Iä}ksN›+š»Æn"Ê®v-xWrõˆãüõáPOkm§Þâ"ˆQÔpf8œ¾á_ØpKɬ2‹õá,t³ånAƒ7>ãžn„«åŸ.ÏþðRë™ -_\n‡¬.7‹·Á‹«ä¦NËåJJè—+¥tðkYìÊäpÈò}ø[’/… šd¿\ ©8¸1Ëw—?Ÿ_vÒµOT)ï郞’… ¨×32Šq©HÏê*ƒ¿Vä¿;^\ÄŒ[툕ÐÈíí»p±?/B¦XÜ:ÒøÑ~qqö÷9™\ )5œæëò‘l3ÜžF²1LDf,9ûˆB§(Œfqö ^EDúöåÒÈ É×uVäK¼ó+£çÌj-påJ°x zû¼^ÂIhoÚ÷~£ï[±Q8ËeÌ„¶íâßBzvH¦˜P¢%º 3sô½g*†)ÎD,[ò«$ßìÓ9® ;êeÿ@/Žx„TS`Ö(âL 9=wÇ"½ôÁ±Läj WÚ±ÆGÌ5FBz‡J¨ùm ÃbcZu¯vfOÜ0#¦{Ê\˜ÕsLWBƒ(»XßpÍ;æM•ìf­Ê Î'ÖE^Õ¤ûe]%å™áu9Þˆ`Zˉ˜*ûœÞ?a5“ R¤ “±xÎÑk™„È |“„Ï.f&¶ýöi>ëbœI#Ni¬ü™ÆRJ2cÕ)Œ¥T̬äO4–é·ð±¦» ÅÁ$0¬tReÜ:,Ñ~?k9®˜†TæùMý䀙7·0 T"©™Ïó³³È@ ŠYÓ™î¸ðhca+ ÇùÔ¥43H§|nÏ+L»šËqÐå¨8@ã¢3¤«æª-ÎýR§~Rùç~_@Y7Á:©Ó Í}Àüë«ÈàÐ#ÕÊðÅ#˳kÂ`##Åb(½ß³Ù½ &V¸W¨p:gÛžhi¨üãÍ^£â”ePôlk¸3ÁmV£—ÎëàyΩ0̳#=”`±•=0“ÇAîÚÞªºq6N×Ùö®ë«n¯ïK5Ø‘ôÔ(þŒàÈx€•}ƒòF75°™ß…×h´‹ùn²Xˆ{ªß4ÞVIY&¨Ž×ƙΪ¬Î’}ö9q‡›ûèL¿®‹rV)5Ñ©O0ã&6 â©c¬;µŠm«…×TŽ5UkŠ'¦¬Á’EyÄ!I R9š¤õ‰qð1/RLM,¹Iꄨ&ÞÊŽXGc+æÇ¬ ¦<‰[%ÛR+I‚GJöI}Ãz&†öqÌÓÛ½×Ó'°¸O`~m>à ‰x}?â‡i{bRË"? ïÇ¥Ž@é,ùЦÙVåÞö²³ý#›èÏ:}FÖk3Òýœ6y#j:85•Ë:8t©C5û-ä …áì4PpÎ †´{‡êAƒ6I9] 8ÁÛåU:þF+Ö5Ü÷.ƒÙFu¬©P¶Ò¡KsøÜ¤eF216ýG¯9k”ƒN@f5b«ƒWÛŽ Œ%…Ð@(y1ÃÔÀƒ$S(Í»…¨4í†6㶯cüòK˜àC敘ÿqúà.ÐØNâÛ*ô²I§‡O$äö8®[æk LK497dBZñ_òô“çýêŸôDQ}QÕ°ÛH…A…fMÓ¹Ã8zÁ†ë”ÔØŽ†Ì„ñöR“`¡o4Ž•†Žö±ûuì.“§lñ¢iÇ‚³ •dˆ–™Ë;4}ÑPæi›D²ÚÇ],@¼ÇÝë¹h)à°°¨kXðÓù‹7"ÿúõ›£ó×øªÚWŒMì—\Ïäè7äiE¯yQÇ<]§îè*È,pä˜3à.K÷"¡@ÇÉôÄÜ~&&}Q0BÓšž\<Ä{'zœïS*šK6Ü$~€Ÿ‡äÚG*ܶ}d†mÆÁ&—š†þ^ëWv´ÚÆséÒ†›£$‰#L’#ò® ZÍÄßp+ØÓîŠïB%‚@~‰voJ`UŠ2Åà¼å¬ÚÍ)ŠòЛ'vMRøU;?À9Ú‡ ¼öŵ_ÛÊÎ}äâdßö%û¹Ó¸EÚ>±£b§É¾¾*šÔ Åañ§¬ª)rëÃÍ>=¤¤“KP}(¶ušÓ ÚÌQñÁ)Ú+L}NË‚¦¨É¯]ê CÈ&n÷ðá&ÀtF[rm)Ô DàåЕhWŒeW9hì5w‘53=XôÝ\¹ÕÃ6p[&‡tŽSOòÝ|s6®Ð=ñî(¢ ÂVF`X“š®×†'XQUÕpá[3$Í·®ŸÇ©+ÿ ül—刌"ô ;WïáK²EdÕe wa#ÌÈc7i볌úˆÅá&)}{öNj׌SÞùéüM{]ȇð˜Dá Ëý5¡j†ßAÛ¢<$$  Ž3Ø›´nÊ®CÖ¼°I!Ú~œ½Ða&í7ZZÍŽâpóë/þò þÞÿò×ÙÓÖ ªZ‡>`õì¶µvÁ_UÛfß_ÞÆ êŠÛˆ…œ»þ“·ÐècÀ±PKNƒ#+®6­k÷né`pÀÿ„;‹ßrÔüá[óTøÎºè´áI?ü×ð­ä,â‘c%¹ü]á[pI 0}¶ ‘„¥qÁl¤ÇÙxˆIÙ‹/øÉ0IZfL &RLÚøYÀìÄ åXñH<ÀÍ¿À`’d¤yG%žðǧY 㚎SXI‚j‘•S+= ?Fö‰ø£}D᣺õ ~ü?~9üø 7û†›}¸™äº=8µèNö1ÔâfH0†Â”ôHØð“[Ý!až-­×c0Óc_›{’ëYŽM5w&,L ë°0a‹ðÅca8DÉøD,LXí°0OwôS,l¸°0'Ëíçü…ƒþ·þrßZø‹$LJÀÌųÃoA@t`X+Rg7é6iö5½ †OºÙz÷i\¥~Á±‚ÔX5ঠ´÷Ï ¤†îú&d¥øcÈ—ÄŸÉ¡?…`ü™º§‘`8O2Ê–žÝ]_îrv.è™ìÝr+ZL˜Ðué£C"¿wáùɇ5ÚXH<é¢:õÔÇì/"j鸀+¤žciw‰CVÀö1û‡Â1<`FLÂ-q$øÈ#‚¢:üê ÇÿSä‘UÐ#:ùüµÜ÷ endstream endobj 2123 0 obj << /Length 2413 /Filter /FlateDecode >> stream xÚíY[sÛ¸~÷¯Ðô‰êD(q#¼µÙ¤M›z·±·3$“¡%ÚâX"½¼Ø«üúžƒR¤LÙJ¥L»ÓL2‚8·ï\€Ã'!üãNb)™Uf2_Ÿ…n¶¼™ÐàýŸÏ¸_7ƒ…³ÞÊ?]žýáÖ2Z>¹¼îou¹˜|^-“»:-§3)e _NgJéà§²¸)“õ:ËoèÅß“|*LÐ$«éLHÅyÀ~ºüëÙëËŽºâ@6qå3|rn˜™DF1.±ú€,$øg352x¼†A²ª—Es³„'n‚ô׬ªÛŠÛ [ß­Òuêx¯“:+òŠ^×5̺/î’Í=dµß¤^¦4õ%- šºšŠ8ØÔ)›Îâ0 .—YE/Öi›‚&@²—Œkb¶^&5èN(`¨ =¬=ÿîaéîñOJ3u[.¢.BÍŒ@Ámý;¿f /Íb·+®ÁxéØNÛ%£›X&´mW,’:ylEAU௠2/ ¿w€­ª²«ÕVZš_;TáÔÒ¿+Êì&ËC¸b•æ7¨q|“\#Q‹3®bf„ñÊäž—t^nîЀ ­®‚WÅú.)q_©‚?^œ3N@ýáõ{<,³9*vIKæ…A†ÀUÓìå:! ¤™¸¯4®f6ö^ó>­›2§î§Z ›tʃ—cZC¦cݪ•>­Æ¬£8Sº[xñ—·ðÿó5·fÜðviö1ä²kjáAU]7+`É‹ €BCø?Ÿq±ƒ+ É´±´M¨^f­[ÿÒù+1ãVO"ðI zýð)œ,à%À¾“·t=Q œF«ÉÅÙ?ȯ‡”¹,RÊí%¢h`ÞÊF0Ãíi(¤h†”³û@,9¢=}L_(ô+yúBsÆc1¤ŸÖS ¾!Ò1K !Xl³”h-õá FÀ&Ÿ#`ÁÈŸ¶pâÌj-œ‘¥Ûy|–ƒ÷j¡½™?{¥F ôŸÓzsçYˆÂ \‚£v£¡==;€/Û uAXr˜ü½ßTô¹°‹X¶Ë—I¾X¥c»Ê˜EÛ ô‚v¼ØƒT%8ØKO´ÕL¼wì¥âÎ\ÒSï™kG¦–µU Ä˜ÈߺX½¡˜1*DˆÊã×-|3"æ8±+[–c®©Ç6áv=lÚTÉͨÖtèä¼3Ä@)F€Ip@4 ££'¢˜i+a+ÒyœŠ>î¤ï¡oœI#vDx^Õ>´»0ž”O`-2}¬e÷£¶Œk¹C¦Ê¾ŒDk¹:…® &Ä_««ì’çáºB<-!JޏãÈ•á"pžr³û¢©&5®/ÈàÃÑDƒìQúâÖ²È ·S·¥Ö–ýö" ʲGs£sÊò#Q&c@Ù)”&c™v•ö,Èò¯Y§ŸñEK÷á\ÆÄq éò¬=^E:Œ™ôḚIXÉa¼†)t˜Å ƒò1ÙgÉ‹ÁAb•TR\tYù%ÆU—wUû©“"ñeo²Z®jŸCÊ_ÐnFOÊ0uÇWYžÕXôļP mAÎF%Òª’¾¬¶Ãô:²':²Õ;ÂÞ"㔎%<à·-& Ü¡ŽïáÁï9¨ì= ý·eTcr‡Ÿ²Ó›ö ]ÑÉ(g×›îý@GBdÕ‘¿^A!éXE`_n€ó;<ÍŽ³ïYhêI<_zò£õd5G 0Ïî–©Ï&­Þ›*Ýcj¢8Ps—ƒwΟ±X»k¼1“²ìŽÏÈŽ;°Sa“ÕY²Ê¾¸\{,ClÌë¢eŠH t×Ϫ;%xÿpÝ:†$ÇVqÝrá9•CNÕ󜢦Ñä5X¼(÷¨‘¸Øa™.êQ¶Á ·áܳ kŸ×gž>¬<ë>^Ä.^ ‹>f4–ƒOHXï8ÝE‰¶Ç(ÒôOÀ­Q‘ xú‚úZûlEo ?½•kŸ3l_€ñ<M–#O!=Ê1ÞÓ =ÑG@¶ø8ª:ß|8½Ê“à¾e² Óêi&‰ð@o{@ŽKå…£@¾ðעؓEôã,²¶ Øø ~ï§:¦³äªMÝ-Ë[Ýo1ýŒ!ï/O]¶ynŠþÇ\ÄÃÖp0rçîÒ/œË—ô&ÍÛÛ9z^§õ²ðáÁM4ånËÇ«Ô/xäc0· DŠzÑæÌNŒáÍ륻½…—]nŇd^7 !ÿ¹jA#wkÐgJŠ8í Ï3] ±Ý4î6m`Þ…(Øtf¬ Þ^§jb@/|—1aÃõ}yºËOd Qá•£ • ð ‚PìÅY_ýøó% ®¼téžÖ(@ãŽ5ø®5¦T=Âj¯¾i\·›ÏaeZ:’ÆÉŒß¿ý' Ñѥ̻+M·èÝëó~Ù£‚óŸß½{ÑHé¾p ßÓ­/–òÂã»rá±³¡ƒ¼»ðØ<@­’n¡ÒóÓós—FŠ AWÞhw‹üê=Âë_?]bûúUûˆ.¥¯+Ýú)-­èѱ¤¥ïœ§84^ÆnhÁ&KW ZBþ…“鯀ÑÕ¬½â.Š5b(4ÃçAÍWÑ\²XЀú¸ª ßurë;*´¾×ÏŽÐ1kú#ÿe·öª=CàÛ[𣨄#ŒMƒå¢xM9“«/ žOnŠÞ°æß â›ö*×E™bÓGðvkÕJGpÀïîqâ¦IJ²¦~ "Ï~që¿miç>Qàä6P%«‘(óiFñïݨÿÓnÔþVTth+Jýï¶¢¸ ùIZQÜXf̨“ö¨>a:ï\ʇœñHž„¦#q1 y@ó)Š™Ôß´ù´¿íÄcÅ,i;ÉoÓv2¶¤Q,ŒÀE£È]ãsY ØàpöÁ­´å‡¶„a±1½Îо«U9ÞoeY2¡yÔÊúú®Sìê«ÑÆ“àLZpB-ÝÍë1'¡™’Üm¥Ô3×Üæ°¾“<¾# NÖw’‘uAÿº’à[P榫ÿ´ïôÍ»'.EK Àì tO#JƒW‡à§ ¢§PGu¢"Nɶê"ãóhû/6UÃÈÂ$”'P‘°€-.wUôt³.²=QŽk¦¤âß»)ß»)¿Ýn zç¿-á6R endstream endobj 2129 0 obj << /Length 2368 /Filter /FlateDecode >> stream xÚíYÛ’Û¸}Ÿ¯P핲\ pß_g+Þg²U)¯ËEKÔˆe‰Tx™ñøëÓ)R¢<›Œòk½%l¢}Ã1ãðŸ˜%|f•b‰v³åîŠûÙêvFƒ·ºAn‚‹äo®~ÿʘ™à,ቘݬ‡Kݬfï¢ç›tßdÕ|¡”ŠÌ÷ó…Ö&ú©*o«t·Ë‹[zñ×´˜Kµév¾J ‰„ÏßßüåêåM¯ÝHù+a¢ä)ÎdˆSÇÜ,vš ¥ j~‡O6Ä,¬ÆIÄã×Q^ìÛ‘ë(­ª¡?ÐFîófC£¼È›<Ýæ_Ò&/ š»›Ke˦¬‚¦¤©Zˆ˜I':LÛ¬˜‚%%Û#\uþ%#XåºCª1Rý8RHç 5s•›DPd ÓfäÉ`ÅUÚ¤$Ò”a&[Vû†± h9Bs΀ŠquûuUÀ¨¿Ž‘@– c¢0,IÌF}ÜlEv¿ 8ÓíPß-Ó&[ðÑ#m`k@p öœI'ö+xïæ&Ðyúq›!l¯zÛ?²‰ÃÂóq*ò[;šö´ñ¾¼;8¥~FD{¯$C·¯èMVø/(0ày—5„â¢M´5e1Ö{ÿ"[æ¿p¡³ p^0 ×›Aø“1Ø$\¡˜0„ÿfØ4¼ìäüCºl snÃS[£få5ý®²*'«NÄcÆ!˜_D‡Em¿h ó5"½ÍØ|á½^O(okê“6‡,¢¢Ë÷òAC¯Æ!.ƒ¿¸Ðl„‚}Jœþñï74øØ‚™•¯-ð´CðmÝ„wÝAâÃ* þãzÿñ"!r`Ül‚è$³Êk•dmœ-²ÏaÝ×?OíÂ#7Ü–uó,¸s¼¹Þäð¯«eÿì‹”H‹žm™”1–©wïùl/a}¦íìÞKîfŠI‹™j;»¾úÛTÍ•\‚«CÔ1„koYï¸§Š¥J˜Ñæ"еbbk¤8¿k) ¼² õ.f"¾Ì¾ÎŽ”g?Õˆ!‡¯éHðUÙvÉ¥Ë~y†°‚éq¾xSÂFIð´Á‘Š^¼|þãó?Ýü ùu÷ˆ9~þOò+Ê\YMEÙЊE¶Ì|€ÕÁ½1~Qà!϶+¡…“ÙgòíÙ¼p]î0¹å+|Ù£¦¹tµ¢Á> ,\ø»K)Vñ)¡¨ÀiÂ#Ll sß²u_ö²»H÷ŸhŽr;Ž0·Ä}®-`û‹©ÀîòÜö¶¬ `ì >cÆWh÷¶‚µª]Yey²NXZw»Ó”—x0=NܶiEgãÝçh#Ã~ù)|Ûé.BºÀÉC¢‡†uö=Ê ÓPd¶P:Ú[¨wZÀÇŸóº¡4,’(ßí·Ù.#L>Öô¢\7YA_Ð~`ŽŠ&NÑ^aêKV•4õóàCƒ9Ûr9Ìï^ì²=õòl%‡»¾³€‡¸ ¾3`.êâQÇ sºo—¿›ḛ̂q]Ã5 ›Zé òÝt;)MßO¢{bÚ•qTc&1¨ ¦ÏÌðKVÖuN­‡ %Šk_CpjÞ›ÝæÞFPÚ[ߦÀ›t·ÊÁœtÇ­óYFýÏór·O«ÐVþáú ”v^¼|Z Mîc%ôAË28A^„ªR·Ã÷·¬v)i ËØ¡eø8ƒ½Íš¶ê›zcÀ Û Âíû)«ZÎŒíNú´ž: ™Òô‚×~ ÿ>üøÃäq&œèD±3Rý¶–>úëzÝnR؃røžZÐ$f\À¥NjÆ¢eÎUi™€†Uƒp"äqqÁZÕUÍ (ÆÕe¬Y(¨ªZûµbùXUN2'’ËhvŽÉØ5CeSÂgr…­ÐTûí ´¸ô7 ÛYêÝ+Ì@m±ôiTDïÇ)XbŒôFVîÊ}Äå–(i‚™?„MÈš‡}ÐóñEÎȹî{¬ƒS× Í a膎лÂï¢r |LÚ>•l EÞfS«* }TŸ žÑŠ×gDņI¦å‚ .ÿÍîc¬7†$dÁ?8g.tGßc¨NnK:f¦úDmñ ;á ³ï)Ü©E¡Á°ŒÛ£\‹Sw>¡Á@ë$Ä„ë/üJNtnR0•è™r?ÉvR¦•ðKYaC!šÚ¤XÛ[kà€GgÈœ:Ú dÒ:\<)¦ÕWÜ-vCwëIŒñ±Hf̱ßÜL8Zå.a,e!ó ý+•¶p¸¦ŸK Oþ`¡éˆÄTÞx -wÝiB –¸€ 4<àÈFç{™ÀÓƒ€Rã 7N2¾¹ŸâK Ü鬵W£Ä5Ê×P_\€Ž(¨>-êîSb8B3pr“…9jù&û1혂Ë–ÍÈH`ŽlcÜ@…:¸ùË@ÓG<Öà¢ÂeÅ\VO8ȳžà°lâ †°æ„aÞáÐ’ÙD0‘>ïe·Q}hð×=I}O2BÝÐ_ó½êi€§Õ ßc? ?@Á?º¿NUùNÔ=qË|¿!ѱÚÖÙ™£&ßHÞÿ’Wü–H^£MÇ¡À(õ3Ý]Ýg‡„ >w¯E‚'YŠÃS‚× ²˜Ó€j!¸Mˆ9Ä/úüàt<íe@¬mÌÏ"1Ǭ-¾@ð¿¨â\¿>Îú¤‡dÌ=Y‹“ Ó‘µ8OjŒ'kc«=Y{²â1=ðÁª…îv;¢jqp jMœ U눪õï:®N©Z!ÿÇ›nñžªêLàÔ‘Jk¤í¶¡é×?ÓWù‚à‘¤±–x[ žçm5Ü® $h&àzøþ)`›H¿”Å«ß#¼­ûh| ÅHÇÐ-ÓŸ?tj¸ã(}EÄXç1]‹†GºVkw`£p’èZœö<̤[ÿgeœBwaþ<âÅ‘°Çž»—©é9PôÝQ‘£ áh#‡>{þÊ! ë|ù~ÊùÃ%LÁ]—2Æ=Ê0X¸?Ë‹(NðnŒ?ÆÛ+×Ü‹ì[B7í kÔ?‰¹ØØÿ5î^üFÉûoÜýŸ»ßÈû ’÷߸ûKp÷X0þ¿íyŒ endstream endobj 2134 0 obj << /Length 2200 /Filter /FlateDecode >> stream xÚíYmoã6þž_aô“]Ô,_Eªßîv³wÛnÓÞ&-pØ.Z[¶…ØR*ÉI³¿þfHê5tb ÞC‹.À5ä<ó™áM(ü±IL'ZK3YìΨ-×÷ðö_gÌÓÍpÞ£üçÕÙ·¯”š0Jb³ÉÕª¿ÔÕrònúb“ÜÔi9› !¦ê»Ù\J5ý¹,Öe²ÛeùÚ}ø1ÉgÜL÷Év6çB26e1›½¿úþìüªå®8?&R>À©§ €zœ‘‘„ épV› þ–¿·k1® ‹•%–\ájïÞÓÉ>~?¡D>¹³¤» 0OÛÉåÙB<™à$’rÈx™.Êû›:ÀÙpbX|ÎÆ™!çìvêgÓeR§ÈlKnÑTÉ%¡*v³Þ½š1Ýç‹:+ò›¾÷3£ c$VŠã̹0 | §¼žQ”×ò/óDÐ1hŸ9ӒĬ]â7ª¨ç÷É$áR4D—Έ֥¾ö‹ò>.É×-ù&É—Û4´ªÐ$R¦¡ûÆ­xyÀE(•FzE”6¶“Ô­™„gÞ3Óˆ-˜‰QaW¢`AËýwFzdX*nˆ6-Úk  ˆÄ 1b$Qfw]ZsÎcsÍdnÄk×ÞWÉ:¨3E glÄaQäUí /×&)1OdúæÉnƒrp¢ÔX*û”>4 Š R$aÃ*ϰ c"`B$#s¿‚ŠÓÄè¸a›æAcDÀ)kÆuOCaV„u³Ûb_½~XKRÄ$âZ’R(ŠÇZ:lpõ£ s@_cç2š*ôÐE[{ Ï Ç1Ѩ‹SÏõ8aˆD]  Ô<Ëã$'u iLé±—^;ào]x|”Ž„[BV9ŽäPùXGGú[ßÛ†¹gþ!õ°Ì:!LG‘÷¿@NdSHþŒ·®f+!Ù”6@ú©}Rùßí¶€’ÈL&—nì#í¾K»=+HCD$>ÛfyVcúìÉ1J”“ ¨\A6†D; *c†™)°&*ª¦¡°×Üe21­ ÷ÛÔ?VwY½š"ŒÁ¯‚ÐOJ°‰t,F80íéi®›º´º±:NÙê¾­Iï6‰w¥ôèðõr1dϪ•`6gÓòßÔ0? ßCÀoSܰ†&šó˜oö^IIY&ˆÃð:óé<«³d›}JlmfÇn­ÎuQA9V#L]–ƒ ×cÆ=na«…G*†HåÓHѨÊ4Y”<Ñ¡pu«F˜Û…¦!lpï.>zØ@û´>óônë¡û}¨í>Dˆ~/îç,ððÃ#ÖEsHÇâD;`H8̰±QH˜>áƒ)}:Ñ釢7ruQç)“ƒÚ¸ãP®<ìùøð˜ç£¢ƒˆjâ¨F‘…p||A:äøp'ñûdþäã ãÈNÎT Þ>ËÉ—| ¢³êEgý0ÃŽT 5g¬Á{;S€Î’MJl wºï|ú !º<*ޱÄ’Í@Ñ/àãUk8xÚW.C(Ÿ60ºf¿Q&-3Ø(ª¿óÝ;dz÷Ð$‹e®¨˜^mÒá'7aQïA²ûCˬ²Ða ¼LK7,Y¤[ÐQÉ,u]6†›@˜áõÊMê4nÜæ=¢Xæi5Í‹À‚ÚÐk¡7á{^NZøöÓ/W!I>îAµó´lº³M",ï¥àPYí»—e:6¼#q.“­àø°ÊBð\ c…EÊ׿")¢°4…çØ¿9¿p„(~¹øåÍ›oº•ûØô‡!ëç}²²ÙY ÝØÍïï6i™’võž^˜o†ˆ‰¶VÁ——ç/Þ¢7ý÷ç+¬ùÎ/ðU6¯èÆXÚRÐÒ/ÎÒʽZH ÄÌÓEjÓH›p îÁ}–n—ŽÄí LÿÿÜövÔÈŠ—ÅuOA¼Üî*ëø^[)}ùU¹±d¹t7‰À`‰¿»Äù$¾ÅÞ Ôx ø„û°v¾·ág¶´›z¿^»1Oð ãɀܦtlsÍî‹‚¥úº(!FíÀ³"püW¨÷} K•»¢LÑWxã…T6ÂIçPÔ«Öû¤tæ¯ÓÔ99ÄÔ£/®ý܆wÞ8: vÕl² Yãi»ˆÀ$øõ¦Ø¯!ÄJ“ÿÈªÚÆ Éâi¶»Ù¦»Ôa²ºrŠUæn†“Æ\œÆ!'+ }JË ¹³K¡FS ÛßJvi’cYíÊp.­­„ÜË®ÍfONÝþq# ¯Ðùˆ*bd[ZÊLª_ä®Êd—†VêH¾ ×1\µ%'º'†JM+ •"€ÉFøu+ª*séŽû*Ió•=¦àÐÆ?[g96Ë‘RìÚ¦Fø’¬°Ùn““Îäfà±>›ƒ‰K¹/ŠÝMRúJæ—„¹ˆôòüms Ê\ãÎ7ñ ïYîO?Õ¾ÿÐå.qœbt_1£ ö6­÷e[L*^¸O¿ R)Qº==»yUÈ2’Ái¶=_þû5üøé‡ ©U¿vÆ$.Z™vçWÕj¿íêÚaS}ÎâˆPÆlá.šþøS \cSÝœä"×’Ly‘pÎþ"aÀ9|ŠÜDŸãò xm tï=vmÀ?ϵA|쵌¤± WŒ¨˜?«¦€^*»”Púä÷:{^(pâÎ_óÞÀvs%?Ž.Å©þL÷ÏQÖs[ÞØó7±<…²$d¬X°#•eŽky‹`ËÛ>O‚yˆÐñ°ê·Â™$JF§k…³lÎáñ³®9e$2Ê.EUôÿn…cØUL •ø·è…ë/½ð/½ð?C/üOØXÕ_«'n¬š¿Rc“Ýÿ¼b‚ endstream endobj 2140 0 obj << /Length 2391 /Filter /FlateDecode >> stream xÚíZmoÛÈþî_!ôUDÛ}%¹ùÖæ¥M‹Ë]c÷€C.h‰’ˆH¤KRq”_ß™%EÒë³ ëŠ^Ä—ËÙyßggÇ3ÿÄÌòY¢³:-÷ÜÍÖ› ÞýùBxº.”ººøÃkcf‚3Ë­˜]­‡¬®V³÷Ñ‹mvÓæõ|¡”ŠÌóùBkýPW›:Ûï‹rC¾ËʹL£C¶›/¤ÒBDÂÊù‡«¿^¼ºê¥)©&R> §)Kgqª™PšT}™/ëãMÛ̱âÑ*k3§g¬DÔÜ€~I”/‹Ÿ¹ÐùŠf‹²hçðÈvÅ׬-ª’¦?£Iù²­jâ“•+|ræ 穎Œ”2ÑÕ6§…ôýèW-[pËîˆÞ뀔 C Ô@ =Wy]|î¹û^¶(½"È69h‘X½Y÷ɘ`,‰?ƒgÊ£² 0$5Lyoh#ú…¨4#Èg¾Ilôý?®pF×ð²ÂäÁé½Ë¦¥·k„3_V9x¨r¡Yf-:…H€âHã¶c¾ʼF—‹T€Lˆ›ÿRæ_<ï7?ÒUF=vUÓ‚¹±æQƒ~ÍóþͶ€Ÿ.iÿÙg£Ð1S@kͬH0ßà³|L'³[G¹Ÿ)&£ÝìòâïÁ¤5œ©4u¬âT’Ü¥m@pš0©åY[$v,¸ø|¸qQ€­’ß/aÿ¥ñYì–*a©MÆâóÖÅ÷¦KÄ‘bO Q‡¹ê@“eŽá>·”y|Ë80\ˆõ|[µ˜ JB¶d˜ °âå«ï橊~úáêgnø«·øª»WÄx ü%úeaÞÐkYµÄ±Ì—¹Ë&« ȹݑŽE¾[ Næ_`ÓÈemYíq3r°ºt¡§=ï#44—­V4¸Éü ­è¹Ï: ÒÜïœ&=p„×Ò°pøÜ­ìi¯Ý®K£%~ýDsMñÕ­Ör‡J%˜¿m ¡-*Êv›ª.Úíöj Pòý~¨W½¯êáGŠŽµî¬Ó„3Ü»'6‡¬¦ã¥u‰€sdˆŠ¼úÕ'¿¶“]zèÀÉÆûs øRûi3ZCÅ(²]»­›-¼ Xü¥hZBa¸²¿ÙåûœtrÙЇjÝæ%­ {`î|@Sd+L}Í늦®¥­oÎΜõðaŸgÀônîPf+9Ü"ð²÷ú»—­{鎜w+Ø•ñ¸a)à 'Ö¿ó4£kX"“Žb g~ât" 2±LÛQ`z>Cµâ¨©ð‰ÛšÔDãñI«š¦¸Þ, Òr튜Úúof›¢ÄÒ)vy¹Aã—l¥ !†’é8ôz!€ £®£Õþ&«s¡?^¾e‚€çå«w4¸Ýn¯l‰dYù$(0 9 ¿ƒºU½ÏHy&z†ì]Þê’Áùk 9l·ç!¯&œ™Ätn¥¥M(:Z0mzÂË¿¼Ÿßÿ-nÃàXíH±HR½YK·û›f}ØJÞPÊa=._3. ‚“P—ÅòƒU&LXƒu! ñô€1pPt'Œf°)Æ'ÌX²P’Áé¼³©¹s²N …•A ‚¢xÈ)¢ÿàP.ЉèÃÉ›ÀÕélT)Ô¥}Â%žÒx+?ŽdÆ|Z²jÕ-ÄóÇó·£h¹3¿ ¹Î…à÷ž§j£…?{ùJÔ]â plÒŽîq¼¼'0 õÓLÛ*Ÿøß<ùÇr•`±ˆ+!}Bôµ&n‘ Y2eIÚ«û)?†l€´›üAdªP ˜RYà ešòÄÙ!ˆ’ÙØLÎ<Àþ–$/Ë·Yý ÑŠÁ<>¥NÐ*ÉŒQ«Ü™¨Ð0¡ÔL§†Iþ¤8AÎ1CÈáBeo\Ћ£‰=™pÌ7Ø^©œX1ñP8¡ú…Õ¡}täÃ>R“’ËsøH%°7U:õÑýáh?˜ÒûjŒ ã½éjр͜ñ8çßhÇN†ësí9oM'º[êÔÏüéå¯aiw Ã9ªQ‚„|ˆu'Ã# ަ܆ŒÏ-óS‚³ ­Ò€‹+G§cžèik&ÆöW`´ÂXà{|v.pµ™¸GÏ3¤Â8FzÀ.J¬šè”@ñºéÚ(§Št}ì[(·TÙ¡ª® Dý@©¨:" ð ® ù ¥aõ½*#õ{Ä™”gÜÞQùæà}”Õu_\¢š®œuz¸{’L|ÖÇI!mä]ð˜\Ÿ:‘n%(­ZwHïuTcu@Ç.þú—u$Á#—hr“$Ð>ì¶2¿Ýy=§M~ÝæCîIOs7=‡3q©eñ ‹úR»§.²ë:•O¾W½ï0âÄx›þ:¼ðÚŒt?uïðjà‡—„~³t-;œív†ã ÆHj? ?¹—¾ûæÞ¨á†£¢“Ó7ÜV íH¶AŽ]³ e¾Y‡.”=¹´²k½áeâ[oŠSëMZqÂ)|ñ­7ÓµÞp®[H­·…V‚¬Å9×lC¢S³ §OÍ6|ë›mø2l¶!PØ Ÿ°H…Æß½~öÝ7­ïq—³ëì°ó‰„Í7wõqpe¢ÀuÝVÏ|:å~Ý}g¨ìÂ⑃è'tžl‰œ8”↛2’ñTŸE®‰áøcÁXrÍÝ.—qm•œü4DUÜ`¾ÿ®]ÿkìz×ô¤=e„‰£T¤`tg‡î:¡îÊýž¾/ Rà­K‚ ¡ä‹Ÿä ‰7:VÝeëÞ(H¸„*€ásÈ5J~;’;îzºŽjì:j¸•*û[ë:ŠomÇÿ¦¶ãoªë(¾µ¿µÿ7ÛŽðË$Ôçh; ÷Uå—¡¿! –b Î!RJñx,s]ÁìÄ,†+úÙûœåÇ“Èi›SBª?ªÏ©þ3}ξI§éÄy I—E=¹I§,g±P3‘›~R "râ±={Î_Í4dÚ°†^»§c« Acq¾¾€¸Â¤.›žÒÛ”œ®&aV¤õÚ“Ûuøß¬JF‡þÿS·î[¯iØkTC1P þ(ðp9ô]¸¨zÁ(eï $g8þu;`£—þu[\wCîM9’ûB$¸eF˜Ç‡èmˆK:üÃÆÃ<ú(!.þ ·Á~ endstream endobj 2146 0 obj << /Length 2211 /Filter /FlateDecode >> stream xÚåY[oܶ~÷¯Xœ'maÑâM¤ô!±žœœ8©½-P¤A ìÊ^Á»«­.vœ‡þöÎÔ…k­“ .Ð â@Eg¾¹/é$‚t’DÅ9I„žÌב™-¯&vpþÃuëBXV>›=—rB#’D Ì.‡¤f‹ÉÛàx™n묜†œó@>™†BÈàMY\•ézo®ì‡WéfÊtФ«iȸ 4  Ÿ¾›ýïàtÖ.ûB6qågø¤T=‰µ ” Ëêó©æA±Z q°Hë) R|QACàPua¿¦öñkDÅÇÌíXe›«ziÇESoaOS»åe™âö»©Á!Ì)Üæíâz™ÙAnÏ€0aNÔ£Ð|•ßà¬Û¥s|[¶Û·íòá8BÊ •VÂt»- Üð1_§u¶º³èg¿à9¦ ñüjéŽÆÏÀ•ù¶È@‘ ³Nk†oÜL¥ ÒUã^‹KG¹SÈ™HGØ# ‰³ Î"“ »*Jhm_óÊ>/Ëbû@›±§ÍH’X5Cå?n‰§pIëV<µäžeµ±M¿ÌîìàÂ2-Ðà ù‰#´ néÉéE¸Ê¯ðóq¾]¶Z+«1Œ© ²¨‰”¢]ñÉ;–~*sÇðªYg›Ð@@F$J˜§ázi\HŠ Ý,ìà¢ÎnP¢lcß_û|–­VÆnò ˜$SQ`µ^oŸÝÞÞ’2«²´´p´®É¼X §a¬;á~ÿ,þÕOúp´M·p2ÀXVGù"«ˆ}]\:†Ò•“•阨H;Yi+lÑ\-wl±B¤ëíÊê ×z̼.@5fñ‚/ÐwA:´¤D`¹äJûž–Yëó¢,"q’ª¡¤­M;.ϳº)7»ŽBƒ'c(©ˆH%[˜ìÖQ{”Ù-¼øï ø{ÿúå(ò’Ð^99Ä,î jæóÌàU]6ˆ—˜#ØÛA˜˜DÂ*‹‰ÎS«emˆþ­‹½”)B9‘*“0Ñ÷í»h²€àíDj6¹5K×AÕ0ZM.~´1Ú?™rFb! ­8q eQŽÉ9ƒp¥pý­‰èÍf^çÅÄ{×II"%3âq y¢³Ì|!J2é|ßGž§* Ýîù5’‘#x:" àjUd3Àçh²!# S¼]¾ÿ…à3B•+ËîìCKñb:莂tRrÂu²«¡:mpwú@;çFÜlHQé ¶AðÎúǨXL¥;v¯aíˆL˜ŒY²#Ó¼ØTµ¥l³\Z>_È"M"®½p¸-/ •tSƒ›ö1Ù[埲 ¡šà¤ˆ‚þ hC CRQ䀬ÇdRD«•,PiŒ‰V©ã{(šðý t<ØÜ©h‘•ùM¶(Á»dëC‰Lø¡&(V?hB3’Põ …\€À/WxRuøù^MÁÂã·¦cò‡”Aðå±€ç°~lb„BhrTM ,Úøi¬Ûm58¦.E¥˜œ1ΡPë“–cõЄÇ]íàb”j5Ʀ ~²,;qɨ¬P)@Íý”ÖzýM“$‘;ºÂÔæÐÒ”ÕF#•­ƒ©–wÛ;ƒí2ŸÛ©kS¹´‰¹°Ï¦ÊÆ™u‡{¼öncKÚ± º¯GyNõAÏpW)x'X¨K¨“ÇÙtçy•‡{œÆŠ$½‡·¦”¾S|wüóA÷1Î?ïùW_¿ãÂƒÙø—1 ?rìV7÷Ùïû‚väÁœ/¸CìÇ´NÇ9uzHßãtÖÐbrk§òça[ã±/ûÙ7pˆ^‚IèŽõÀ=é¶9?‰Ðü³ÍOà=ýìRâ‰xÚAˆD¾±\b¶33#7ѶGÑ0óØ ø>ƒ3µé?šjuhk˜89Çðõòô—C»àÍùs´ã×g®-H °®àb†UßÓ³™ {a‹à{|È`vŽ»:;~ŠÝÜ쉟œž¿øùôäüéÙÉëWÿ?=;´KmA=’Ð ˜KP‡~„˯Íh’A T•†H ó§gÇçÈþ/ofè¶Ù£Š(!½êÆÀ¡Ofüÿ`cÂþÍ gX}=J_‚¤"ˆ8Ö®?ß—ðGìK®ÿ} 6 <÷ú|JÿÅûúg5& t?F[‚„x,ÿä¶dŸapÜí›Åá à¦ÌçkÍÂu uøÞ3¢ú¢{o»À…„ºÿÝûænÁt!‡Mj±m Ä?«) ó¦à~©ý€@µ"w¶¿¹¼ý¶mwÊé6xCt¥ùdåÞJ)´<í+ÂC¡#s¤’ÞqÎVÁ8Ú‰þ+Îa<ØêŒ3à x)& äªO^öå1îîËc¬E_ã™ß»Ò ¿dÞSíR¨ÐÈÄð„’áª]*°nH©H¹2ÒTÝáìuB ,û19^ñÇ`„G‚p¨ã¿i¶ÐÙŽ¦gÊ)ôÒñ š‰6÷“ÚFƒ<- 8±tƒËÂݶݚëS3å:€Š@·+"¼ü¼³_ªº(w ´‘¬±XBO!ýû?LâyºÊ?9ä˜bíõj育ñrMË «çn”»•©}˜¥… ½k³¨½PT.AມŠÍövÅPÅø¡hoù W•lÜ]Ÿº»ªî.÷\zñsÿkJ¾¹Ÿ£Z6]Znêb Ç e˜ÛvÒF“?Wb endstream endobj 2153 0 obj << /Length 2049 /Filter /FlateDecode >> stream xÚíY[oÜ6~÷¯ú¤):¬x©>î¢Ý¦EÑnclÒ P4²-D–¦’&Žûë{I](sÆn<Ý.ÚE̘¢Îå;ž¦Qÿh”%‘âœdBGÅíEbV»ëÈ~ùñ_ÔíÛÂÆíbç?./>ÿJʈ&$K2]^-E]î¢Wñ?oòýPv›-ç<–_l¶BÈø‡®½îòÛÛª¹¶¾Ë› Óñ!¯7[Æ¥1ÍÄæõå7_^NÚ%cO4w>°Sœ$`¨³3Õ‚P.¬ýM?£Ê_&Y”)B3i6 &QÚ«×I´ƒ‡ßD ‘šEwfëm¨†ouôòâß!”3’ á+.ºûýТâ5”€á,’)f·¿új£y|hŠ¡j› _»7ÓˆR’IÉðÍ-×ø ØbÞyi|{ã4:2þÔ~ôÞ#)M–6P­ˆ˜ýœÈÄéË–»a‚ûÚl\?u2ÙÒ:p‹©iûMÞìê2$•+’J=îûÌJ|y$Nœ P Pj¾+EÛôƒ INÝä݉´Kõ2íª÷Áø0"%_©é«_Ë@ÂéÔóóÁâdœ¦¿¬ê}]6¡¢õÁ‚¢¥!_·SÁ\âªÑïFŒPhFN¨iäbìš&îUY޻Ϻ††¡)ò¡ÜÙµ·¦âû¹m-КðTŒ:\sªšjÀƳðÃ3LAßcF‚®2)à,ààjJdBýšÈ„m4}ßÙwh¸í<ÆFŠŸecš§…à®n '‡mp2C&,+سªHe|eV°Š‡òz›ýÛ'ÿuBÆð˜ß+·ž‡š´¦§>÷I(Fr¢!q\‹·s˜Ìp¶C?ƒú-­½´Ó²¿;'à©ûE1.™(à®ÖgµöÓ•\wÕv·vÅ"o‘ÜR–± ­‚ÐÁ`G©^µo›0o\`O5r X© WfT溒SžSž ÆÓVŽÀ¡-¼Ók©Å:c2‰ûÃ~_Û…¿æØ=™D´[<¬íÊ!¯êÞ®ç×yÕ`]Ðꢴ‹WnrïG!}k¿ ¹=^܃"ïÜXñ¸²ïÚ=ˆЀP¶ß¸£÷ÅlxkkÆÐ)€ÒõL£žLB]é'›K)w9—²8§«Âu|Ò´ö³nÓÁqSSâánÞsOm.¦cò¦|Y'˜ãJÅÕ`Ÿô€q½³Ûw¥72Ø ]Ù·‡®l–Ž»4é{·½šGŒEF4æ^Žþ;L À9x&ÂYTÔè“ Ui´EÔjZ“®æ€ËáÐM-ZB“«åÁi8§šÒ|ù^n=mÊ»úþøô5öo7?ÛàqðÎxôû´u›e„+ä¡Â¸÷$¾,(΋ì,|YÀ ª9]óå•b%¡qÓó(Ö ‘ÝÓ;z¡3;ƒ_8žÎ?ž§WÍ åo<Í+zž2˜wäSø9[ñó‡ìOK’ш °@˜ôžÃþt>r„Ej/p'î8ø2 »ÅðáƒæÏçlÆü)<ÐÎH¶í÷Ý09¤X䉊¸BÞÁžƒ%M©)¥@äir¨g¿æó LO‰¶px`’™_Äcñ‰á C„9‚]å a`åkˆŽ§R±4[¸rŒHã Tö(‘f,ƒ£Þ¹4§¯DHÈ ºïçÊðfê%•pšVOcÓ­g.­piÉ—÷Q^G9u†aHôclZm¦VŒ¦ ³¬$û’µË‡Üg|® ’# ´¬¬9Ư Ëó³Ð«ÑÆñ.@œ¶Ñ*^¬¹‚Öòðêö>Útò‹ñäWóÉ?Y7hþ‘‹ ùð¢bY#ëä™:a/Ì3)]åoÇÛ¡Ñäy>!ÿˆ³àedà¤y¬µfó—ãÖièJhÄ¡7£<®V Ò 7ãâHI®‰Û:]üà3ÃKì[PŒ>ÃÆåù.À”˜Y»êÚ[ûÍ£Ì1þr=ÆWî&í`Ûnžäª¦¯våxÅSkWÓ__æ{ œ€ÏA€kÓŽþÏþ@(§Ò§ý^.ä´ñå×/àçÍ÷ßï"ðŸ,¯~N(w‡ø¡(L¨ûþêPÏ—œ+ª@³Ô\a[®ÀžÆà?ÿsP%Tö4ªp½–)xjÝ…Å£L)xšÿx¦@%ꙣ›c (JŽ£Ûß‘)Àv"A䘊â>5¦pˆF¦°‚èOb ôoFþ+Dáä±þGˆÂIÿt¢à¬û+l0¿Ô_® endstream endobj 2160 0 obj << /Length 2160 /Filter /FlateDecode >> stream xÚíYYÜ6~Ÿ_ÑêÀ͈7•·Í$Îf×A6ãA²€c²¤™¬–z%µñ¯ß"‹:(kÇ#H,5»XëøŠM71ü£›$ÞhÎI"Ì&;œÅnµ½ÞàËÅwgÔÓí€p7£üúòì˧RnhL’8¡›Ë«9«Ë|ó":ߧǾh·;Îy$¿Úî„ÑÚæºM‡²¾Æ/~Hë-3Ñ)­¶;Æ¥Mäöåå¿Î¾½¥Kƨ¦¥¼GOJ 1e¡\ ªßY{sì­Š*ÊÓ>}¯šG§ÎéiWËúªii_65Zòk,ã‚\G*¢7ÖŠâ‰Ó:÷»¶4ªË¾L«òý¸WEoqÖ7-p¡¸vÕ6|Ëç’¾ø­'Ö`ÙŽrB%*{¹/ÐußÿlŸ"*;ü|:‚ Õ¿Èq¥¬»2÷Ô=nsöøMz5S¿Gf@•VÕ$]‘˜rÿ˾+˜ò™bQz+X Ñ5ѨEÚº°Ê¹ížèÔy6žŸkÞeZGeßtûæTåHž bãLÙ~k[tͩ͊.pEÕÓ®óôåä£we¿÷ÞêÑô×Vø ®Y7ØnG*ˆ#® OqÌ;pݾ|å©y•UMWØqŒ»Ã(d1a𻉧Ñsš“š(%ý0$½(úS[£zo·RFiu*ÀÍ_­‰Ñ1‘ZRpk·f DÈ‘ðù?¿‡¿W?þ{§”„šQóòW Ô¦;eÖópØÝÕ©•¼U C ûU4±Ö@²2NXŠ`Írm„¬¹—%œ0á¼Ã¥¯¥/žn dJ¹£ÑËé)I¤dαÜ@ÝÓÃÁ¼mJqÉäZhâ~!)á\ŒöÛèõb’ R@;>Ê-ÇÆt®ÞHxÄÌ,'ôè;°UóÐw¡8F)­€•!:áÁ¡¹¨ûÂÛÂæ¾à<5æfÖÿ¶j04–Ìì¥köî„`¬’°–Œ,i-‰ŠÇÜpMOÌ´]«¾¾à¶˜Ö4rÕÒ'_ŠÖªäDO‡ñ]uÇHx5AÙ±ub"'¨3ß,ë«Uhª¯Ni_Qu”Y¥m·s”£þSq퇮u‹3¼&àb†î…„ñ¥á• ´ë'ª:Á[îj8®ÃS шk®¥õHãDµWiVà’SHP7Xh­É7¸¦ý»]U@·ÖQQá2ªæ¸/3ÜulËôxP)»Á(D„aÍÛòutHø’—-@Ê/ÛjŸ¨¼œê¼h«Lðy©,Uåë6m=h§9¾Ù0(Ia §,ú®¶ÚY¿½fÛ~l¢g°}:Ã>M#0ÄÏ|8d㚥/Î ïàÚ;ãW­gµ%Ä× ”ÆÔ£ô¡5I¸·®óšCù~µ.8%œ©O/ÌeÝuy!uQ£8¼þ¢ÌEùŽêH}Õuä{_k\á(9‹'Á9¯ñµžá"êÛf„N÷óuÉÓØ4Ê1´VUçÉtY¬¾&€D‰Õ$«œIˆá2LÈÎû}ixÅz#ÀSJÑOé_TQ 4‹° |œÔUïib´™[VÒ^ èm6bïk[‰p5ÏÞà¤ÃàdÂÔ¢ouc‰aë¬eÁsÞò ã×:–0óžìƒ¿„ñè®~¥!“%_ÂäEƒ–¶ÒòpN ¢/´Àc [c?KMh¶Áqªhý`㮟?ì{Ý óB5ô@øïÍ“áÛzãëUÓÎ"¼h}=ô b[u% .ºnÝB¯r`à,öCüÉM—æ5§þxòú¦m›ÎFœG½Fsñ¸ATUá3qjã¨(¾[n9T!€A@/Dº|\_ùÞ¶#¯Os埣ÜÛa£ÍˆÉxV£žÃœ€ß<§65Y%ЭÌëçõ \Å*a8Z[Þ–ù˜'PE»:ß-&ë?ø`çæºìÔÚ9g‚(¨ÑÌ-/9ÎÚì³¶ñQ^X­ašµ~ÏPuOÿfìßÉ¢Ïèî|%Èl´îÓöQÊÌ¡BY¯‰¡ŒXêPÌzc倽“Š!,9ÿ”ÆÊa@7Œ:V41m¬e=U¡Ä…YZájúÝ‚ÒÓ“2!®€B5¥üDŽœ/VábÔV¬1Qàš±W¿\ º€Ç­A2bèb@ùK@¶ˆæðÊÊÂʲ›ç2i6^šýTŒmcj$ã¸ëöîñ¦;ÖUuòƒÆ0Ù°ÕC ä ]ô»õ¤Ê¨?ÿPÿðÀR1"„I=éï i¼_çÍ$ºXÐlÃU£­{m`?7º D7é_#Ź]¸°LÎ9Ã¥Un{”îLt”fYÓæs¨¿‰.ž:&¸pôY{£¾0îƒEcM-ClæÉæ@{hûè·Ã0x;Óú¸µ¸Ëoð ö[†ðnÞCŠ%†ÀT2zv9'áõ|‡_fp> stream xÚÕYËn7¼ïWð ¸lö‹C·†ãCÁÁY )dÀùûTSv ÍŒ2ãݼ«—¬n’UÝ|ŒkJ%Õ"5ÁÂ_Nmü•DµÂ`Md-žj×0zâ-Z’p8+%ñðÒš”ê'ÕáeI»D—&¯†§VGKK͆WO½ÄXVR—ðBsocL£ 4æ@¤†Ø†Um«GóDÌ#Fƒå#HO$4p–ÆÜ–6 ‘­6Äó±VG<7ÆŽx­„¯#^“C¼Öb ­$êuD!Xm@%Øhp£>ÚàV9|íúð…“cŒëhë°zÄë <|±,ÁhCd£Xeée´!¨KøvüãcEAD«áƒw+»1!¢a¬pŸ‰‰‡¯ÃÂRÑ&‰9"S±ÄRFzEb1¥Áj×kÈH„Ȧ c⹎6ôz¤!7_B¼n£·%)6Ú:’ ªT‘B$A)¬Ð<ÒN˜b4/BÐzÃB¾Á2X}ø"ë44',ZlDF:Š[´qädA(i¾ÌIº^MZ|´!A±TŒÁK‚+Ž4Qˆ{Â1ªC…¢ ÓUëE®ª„nÉïá‹TQ‘Q0ê6ÚÐÛŠb ÔŽ6¾+t#•I ¡G›ÂŠGÊú¡p¬†n„z³:tCé˜ ÝP2†%í..vû×é …k(ì·iÿ˯¿¡¼°\É‹¸ùôñãûÝ«W/Ù(C‡U\uÎ WXBö:^ÞÞ<¤‹‹´¿ÄRÛ#þ•è_L,;Dzü}bKùÒ…:,D_ûjüê_û;ˆŒhÿæîöÃχ‡t•öo^_¦ý»Ãç‡ôïÞýý××vû1ŸÃÍÃ}lYc:»ýÛÃýí§»‡ûÇml´ýtøýÏën?§«‚Cê{¯ï1Ðõ¼¬eŸÒ!þŒdÎÙdÞsÃÞµ TòÌØXVl-Ç–³ Ä(õläR›Ë¥r¼\ª䚀B.«´²l¨ðU vè̶ŽÃé“»ÒÙ¨e2W £lSËçjoPk µz‘u B-— @œ˜Y˜×8P®r6r9Ïår:^.¯䚀¬•̵¯'R\W¸dYL€ ½¢ mX ºÖ¶Äís>Çï8ÚB´ mI€¶5&@m–ezt-¥k¦u7œ™¶!nà9.ë«@r ÏGþ¾ ?Aþ¾Eþ ×ól‹Wœ o™¯ŒurŸÓö„¨ ÙODxÎûS¦'·/ë'Û¶Ûfµ…WÙ:O²lSà÷›¹iFn¼^%7^È«äNA—¸¥[ÜX+ewß’¹O}–¸/æêËLM.ѹ}¹D2#—Êr' ±žñýöjÿvÿÎ|Îé œÙÎlvóuªë@&ÍÎ~6Õ^ççT|:šÜºáœš‚Œ$ÇÇÉU 5ÅÖϦÚk_ ×O ·m!wrüÔ’½ÊÙT;Ïß¹ñYñhÎxÃ;w г]…×·ÒVÏçl—²@n;ܾ…Ü>¹•¶LÝ×Ô9[;Ÿj—ù÷4’ßÓHç'Ùð=m ÒF™–¾-OxsgéçsqÒ…sJéxruË9¥óçtüÿÅ*P R\ë::ör6¯Z²…ýCÛ *üÇþñpÕž endstream endobj 2169 0 obj << /Length 1454 /Filter /FlateDecode >> stream xÚí™ÝoÛ6ÀßóWèQfŽÇ;~¨o]·®ëPlkò–ƒb«±Qt–¼¢ýëwiÙ²åÔEÔ.ÍŠˆBŸî‹Ç»H$ÿ@’ÉÄ"ŠŒ\2šŸÉzuu“„‡—¿œA”²àpGòÇ‹³žj€™Ì ¹x½«êbœ\¦O&ùÛªX †ˆ˜êGƒ!‘NÿX-oVù|>]Ü„/^ä‹ré:Ÿ † …Ì ®.žŸý|ÑX×J覗<ô3ÛõÀ —G‚«ÓŬXx£û1)Ys-U‡@)‹ÞTï=¥Ë×!Šéâíº #Î$_å£<¥ùj•ûÕ÷AbóÒ8¯ò P-ÃÊ$/'Âû‘ ƒå!ûš‰ ]ÎÙJÁ¢ jQÿA¯Du¼².CzyñÅO$Øm´éŤˆšV62Ñ&Æ%‡Ñ•)´ƒÐõú•¬£cózÿÊ*ؾæmtitr\ä³Ǧ,§ei^ Àéx#ÓÂÂÕ¤‹#~©X‰è‡Ýõc¨„µ:&Æ^Õzµ)üg ušÏÖ[zÔŠåPXÜ}µ ïž?û•?›âû»©*e¬ÈØCFh4¾®.¯d2æ/Ÿ'RMÞÕ’ó…²¾^fÉùÙŸ]‡DY§Û«B Á‰ß‹UäÓ*¢\FEY¾^ÏbØeà’`=uÀ=Ce„q1ådÊŸCÿAYÞcÈØ½ï¿vª €kж ¨„!ªuˆçg>Ö]©æã,P™ÚItY½|:p˜®£jº\ð&]m«’CÒZÕñ¡ã#l7»4]pui¥c„5öŒlu dsM)¿’ZFÝ­óOBQs¦ÏCÊêôuª]O8eÕF|’/Ƴ¢K+Zax%Ê}{ÁrQŸ ÞÐM[¸Å”q±zbÌ]f@ /Ý6SN?‡»Ž\jÖQ¢9-ô©E»›NA­I)lW]!Xá¬ÛF°íªm}\n?NýH‚¸h¡ŒãòGz¿cÙ]YßäU³—]ê¸Z¨qL§ŸîfK®ºŠÎk±;5]uÆ'(ú µÔ>7J›öØ)›J¥Í«u¦òؼb§uÜ>«bÖ®}Nßw¶}rMsV⹚.¦•?6;a´{'·‡m:Dg¤J_lwèiçt­sÒŽ²¤t8H±=Hé`b¤´¤îÅ}Ø«÷|øÛ» ý€‡¿ù²ÃŸ8W”aÃß«RÚõ4üÝiß g —áïuéX˜“y>ê°ÊYsHýXµœY‡-«ÇˆCʇq¸þˆÃGy ;@‘°Ò<îxS¼ïÖ<½°a&¬²;ã¥\œE|öPßZCþŒþòZªo|õ7 ¥ Ï}l{7 …™»­Ë¢ÛÓh¹…EQÂCÙ7¾µ|·{¾ãqßÙ“=輇@l¿ÎÛ0kšBò[2KÁrQÿzS®ç~Õküm´ÆO^æÇg/{é'ÃÎÚâ1pVÎ1ÃèîÎÖÊQM_‡ðÌövà™]»®Q¹#÷ëÚ ¨êýžÑì hŸöã-ÿ›»3å´ £ûÀg¯Já—½:c\¯y¶zöº4á)øÜ‹ÙˆÏ-³å$‡tÖ3@o­î4ò³ÃSZ}Aã‰íîAƒ2n¸ªÞ…;43ï±Wšn'èŒI@µn×¾F€V²Â¬€öª¤¤‡ÐJ~èÏyáyÿÚ|¥ýíF¹÷e²Íføb‡¥-@Û @Shþ­‘kš€>öüÕ³³Ç :z;o#hÎu4Û›{ß@“mnŸ#@£ æ_. y8º>ø™5)y2?{oþQ %f endstream endobj 2176 0 obj << /Length 2121 /Filter /FlateDecode >> stream xÚåYÛrÛ6}÷WpúR© âF}Kœ¤m:´±û”d2´D[l$Ò•(»î×wq!EР¬ÄŒÛ´ODAàÞ°Ø=ÀQÿp¤’HPŠ“Ñlu”˜ÑõEd^„ݼ&Æ™OO¿à< R‰ÂÑéyWÔéLGÓA¹„Â]`Xífþ<Ÿ­o.ëËdž ‚ñˆ`d}4â5ÚGnFaTøû8 Q0‡$"bÚ:&÷(8Å&×´(Pm?F‘dž@Š^5â–.ïÆ:ƒÈTÑÖÞ ð¡Vq5¶|0w/?è—°y’" o½ž©JÈÞ˜êž$©¿½>j·¡ 1ÞMáví{ÕÓK¾AŒ1ð†D| _4f>Èì•jO(ƒb)û@3ñÁaQÎ í—ý–—F´ÃGvšn‹Uï}É™/…ívfxf783`5,¨Rü>øýº°Hzg=ë·›ÀH0äk™_/›%”Á¥ý»vöæóÆâFˆvÍñ:gƒðçö=˜›ÀÖZ’¤Ù«vÐņuišç—–2Áæ6$N¿VKtEèZôKGK¯ŠÁ QÝO^‚øB;ÿê·×ÈŽDŒ4³;I"tÈ”Üb‰B ޏ‰U§Çu¨#¬˜¦Žb’Û/-K°jø!¦H¦ÈºL±¥†.\F+E›ÿ_…üáZ‚VRdËâ¯ÌÐX2LS<««uHƒÒl‘íÕͶ5êã\‹¥Àø×¹UPlìˆñS:Òù\¶FØ-§rsÚX^é8ýi‡ ½:½ï¿CÃ!ÊØ”&¥-ew®ošhÛõÒßl°kýÕî7f·?™lô’i„e¾ž“Фp›Ï߆k+åmq0Ê(ÙÅðÈVŠÓEãUÑøã€á²¸0~Önø ¦[Ü ÒùzU”Õ²º¸ÑLö‘›XγٮìÅŽ. IïÄôT[›ºL³×Q¼v5h‘¹z{£Gí<]©šÆ_Á&vn<«Ê¯ÝöiÍ,ÜÛŹý¡£M©”®>êÑ+óS1oºÎÞ£õIG-é'µý.ÁcµhQD¦ãµ`uØY ,¸å¬EËb©ðn ÷Ÿ³àQoÐB4Au#ì3\œ‘YTàEî9d¡£²|Wr²w†C„·WØ[×:2ähÌG9ûø,—|ÈÑ>þ+÷ŠÀä!78ið÷=Ž=X ýD $Tú9/î´ƒ*nòÇkâÿ‹?yàq¹ßq‡iO#wø¢Òptí‹á,kx¸“òþ‹o0§ì~¶Ü±‹‰]t{ ú¹Y»ê±v–¤†µCIܱv=hã‡w¬]´¬]°v•"¹ë{ËÚµjÇÚµŽgÏO줶8~zlV¶zÌs`iʆh/D@•iêá€a>ß±§sëKÍ­¯˜l!Á Õ«›ze/݆½ûž×kõ|ŸÄÎŽ‡g!B!Få$$‘„ÊA´5¯ýu endstream endobj 2183 0 obj << /Length 2143 /Filter /FlateDecode >> stream xÚåZ[sÛ6~÷¯à#Õ‰PÜö­MÒÝ6»Ó´ö[šÍ0"mi¢‹+RÉxýð€Р¥ØjšNßlVÛ|ðï|;ã6=äëÙœ ÉXÊ2;{{õóÅË«N»âüD˜nå=œp B¨Ç©­$LHÄY-WðÓªü£“Ÿ!,SÍbÉ•“öæ-M xøsB‰²<ùÔ,Ý$°€Y¸Z'—¿Æt2Á‰–2T,вrjÇŽ/Áuþ †ùÅo~œY‘¶‹zµÛÎXúÖ¿©ÆH¦woÎ…Ë iÞYmëxDyßõ 5 "—MYûÖïTQ/<®’„KÞ.ºD§5!üÆËäC(`7¢]¾Ì·ÅºŒI†heÛuÏPâªÉ‰:&|"À~}Q.öw·õmL²¢„36’¼Øm«Ú]Êtát,ó}L‹Ê³±Ê;¯À 1K,ÏÚEobr¬ìÂacB4¸©[ñ6ê¡¡ŒgndFfˆ´6™CŽ1ÅðYg›p¶™IÛ8QLu9ò1j¬Qâ¨iö¨iú¨iãØ#tÈð|qЦ—Ȉá}¢Üê•ÔÇñK…h2Ó¦ËEÛa¹@þG´„AñjªÕËû½KRÉŸ%Z¢¨÷.Û¶.áõZרì%‡6ãDq¡òhibMÖ›°.£V„!y6ÊWôP¼£¨aMv[YX“ÐÊX Ã\d ògT?A“ ;2'Œw©Üle²Ý7šûWôyå¯×;ØÓlºÈë²À{ïw}ë—–Ý56ß±WÛUíúñÀ˜§O µ•+ »¡[!‘áw¬qB%‡ÞÂGÖR4´ÞµºX9»ð¯rÛHƒé.Û6{ÔüÁ—<x)ŽÛÃ`w…NÄ]„xWÛÛèüòE7Žäû}îîÞáŠÝµ‡”×9^µ+K- w±‡ €ü­‡ÇhF°ûbÃnFÅ9,½©—!°ÎqßZ#îYÓÀÇéaüˆ)Àßw×=S$ËÔþ¶ü´önõ`R :K‹ Ú€˜Ö„O+ô@¹,ZÐm)9ëî†Bæˆæ%¾k KwN‹¡mÊáMï¸rV”· Ôr´™MÝkÛh¥f6Љ $,$E,³A3jä*¯‚¦âÅËK¼ ©Ýü~þÃs¼Ø ïŠ’À§Lzµ,cpæ\RG½l"bœ½?üN™hC°qþ?@†W.TuÛ°\ë*v¢§u…T»»ôe‹Ë=éwÔ!fÄ$Ùoe}ØoQæÇ™R>‡ò»h׃éÛty‡ïù¦{ùÏŸàçþ†ÈµÄÀð3µTŸ¹!†>4°'e²Õºû—W¾NCÑüê°X”Uu}X{„Œ`Î,ŠøÊNä"FucÍY¸ˆ“%3Šsd#­ -ΣUÁÎÌx¨uQÇ 4¬÷H•ï:£Á&)¾2d¾:u2í©P6=vy’"``•ÂøÆä<:®2 &‘š«ÕSÆU¦f7ˆÒ‚WíÀ®©yÕ';|ÕêršéãRN')áÜ=É´ìÙ™ÖyÍøK¹V&ˆ=OòJ õºÐñä è§Í˜6Øô¿nÎÅ`³^úYœËü_s.ù™œK‡kfÎÄð«ÇR{¿ôOæõúQ¼ž[JËÎÁë(jå—%ö'tì,ÄÞÉ‚9«Ñ{ûþCqÍ#z LšÎoçÐ œ[Pè­–ytxâ%ÚÕ÷¹Ï6ÑÐw½ÞÑŒ }E u ¿_†ß?…³¼Ži ŽÛf,°³( £²§;„;IBéS‡^OðtƒêÈg„Œ›ãgxÝ˽œòž9É{ÎV¶r°]>éh Å/IœªS½wù÷ÔȆöZÝl±¡Ë‡Ö!ììt,NͰGÊ/>üëñTõøð‹WÑ&úéÃAÔš‰¿ïáàë˜4ð‰Ó<ä6¯ªO.ø»}ᣖûMßZ—~iUïW®ÍßD¡žÏÉ`Íçéã$ã89N ¸82¯.€vÃ¥‰ÎÌ´«ª|]?è¢Q ðÄ”è ¾¹‡F¦þÐ. Ø„OhH§1jp^Öº(RÞl÷¸îØ9Z$>n[vÕª^}œµÃj×eÊ›rÕè ?½ ÚÍh!J6m[uû± ÆÖaÆJL´ùt¹QâÊ|òú endstream endobj 2191 0 obj << /Length 2235 /Filter /FlateDecode >> stream xÚíYÝoÛF÷_¡‡Ž*¢ ÷‹äöžÒ¤iîœ^{±M­,â$Q%);þïofg(‘2;¨úÐë!F¸³ó±;;¿Ù‘œÄðON\vìä5-Åö®éu®J yúâr 7÷Å»)ÜôËË·CMòUÙÒ* /´i ’üq`†˜om*b•„¸ [;øOª ‡#Ç€Ò[;(AØ®‹ÎRFü”iÌ” ï²¼C¤J…¶ÚˆDÊã+b3µ¿#F™ ïÈP°ÔJ$Æ^Z‘ÜÏàËE>"7M…2ú4r3ëÔ@îÜ/òݪ **3'¬ -€Ô` ¡{åGäZ µÉiäZ'Tœ ä^ï 쌅á'MLpӹÇ×ÓlYà†ä• $31-+it$ޏÅ‚Üi}Cò©OtÄŸxÇ?-Ê•ÿÔÓ&‰ÚØ"±éx"€³h×'3Á9˜è‚|7\ºo˜©ê+j$‡ï@¾ð£8®S‘ج'[ŽÉžéŽ(ΆèÜç:Ü`ðz ’¹†´Ôôt6€ùWEóúŽúÌ*ØSÔ>o¹}…ˆ|w8‰^†i3ï ä}/7e‹û׳cˆ—àGv¿Ó”?ì û Qø<,ÏPJ™hÙÝ 0úž1 š/_Ð|áëÏ{È÷7ùÚÿ±%Ú’™ÿåÍO?~ÿ\Ï HYCž×Š"_“.d)¦ IHÆs#»Ÿ+Àƒ]ÐéìÊ’¨@|\Á9•œÚ¢bDul* ahÉZÊY@NÈÜ(+ƒv»Ì™Õ2§§Ñ[T±œbŽ;ê/ÐÖ‡YÔÞÉSà^8ç:ê} ìeÄQ€"¾~r œËX}æ˜psÌI0Çh)2ÅO“fÐ~uN!¹CäÇ`ç$‚v‚ßþ®¨sS•óGáf¯ÄØ(Ȭ•{ ب€Íël8g, %ç˜HOM€TŠËáM憘3*ß ÷=÷`ÌþD…3x ïœYò¿w÷,C?ÚÂÃý9ækðFÓ·W‚»rð–.±‚­¿¥Æc°ó9@ŒrÀ ðÒˆgö¸Ûà'ì R²:ÄÝ'N",CàÐ?ÿýö-µ3ð[{¾“+<†,¬×¡–ÒÛ‡ ŽéºÚ‚“‡W#Ö3a¸ÃL ¹|¨¹‘Ðã[¡žÕ—ƒƒÞïF1Á[Þ±£Œï"Ø_™=¸â|Ǹ íð ÅÜ»ï^Ä8@‡†-RÃØèüÕK©è›ï`Žò€’åè Ò Ó±Øc¾1ã“¢Ú–AQHJb]u)§½ÝÀ:V v&¹›†jç$9'Bó²Ù†×jÕ0‡P$ê³¤Ò ^Ê2¿Zñ`¹^ûy faÍ-ä- *®æ«2²Ñ\"gê^öãš(¥öié€tŽõiÒ•&"5æiéÀIs:0üh:p É]:0üp8S`)súžƒeˆÌ_ñ2üÿ›ðò&ôíñ›Ž ¥ð–Ü"b¼`Kúáû‹/¼äè…gâCAø¡jp&ï?ðŒ<¼YŒì) ;%a<—A|Amñ$0cŽð úXo˜p†a ÅÁÄ’‰ö±[w{Kj¼†~CÑ÷ž•8~/Á¶:8Ãv€³°à¬çÕpœPÍ脨€¡€jØ¿ðÀ÷>ª…Ù¥‹öŒqXøìê{ŒÓzÿ®ßTœÔæ]š»í×zq¨éRjóW&^W·æå‚/ÁÁµoÞ®–p* ‘‰Ù)€yÉî}âêˆè,Ö$§ítø b úa¨Ñا'‘¬Œ…“ %?øòL€£è)ão?± ~¸âka0 ýfˆû®Á9?µæ‰ï°,ýðM=ßÜãø&án$r¬þJž0I±R%=HÃÑ÷  §ôµJîc7®T?fØ-M”,çáê'0kþÔPùG«€b¬û/)‡ñ endstream endobj 2199 0 obj << /Length 2027 /Filter /FlateDecode >> stream xÚíYmÛ6 þ~¿"Ì)U¯¶Õ}[×vØÚ½´7`@W¾Ä¹3.—tyi—?R”lËñ]ÒÑÅp„–)’¢$>$-FþÄÈòQ¦³:Moθ]_ŽˆxùìLx¾ 0NZœßŸ=|jÌHpf¹£óy[Ôùlô:y|U¼Û–ëñD)•˜Gã‰Ö&ùu½º\77Õò’^¼(–c™'»b1žH¥…H$çã7ç?ž=9¯µ)O49ìÌÀNÅ8êíLsÍ„Òdçæª‚ÿ ò¯Z–Ö8f- J{ý†fðòÇg&—£Žõf "j1zuö[ŸN¡$KµŽÿm¸–ëmêd†)‘µ< úli™šŒéYZ´½pï„LƒP„tËq:YTkX„HöôìE‘ Öe±õôÅXfÀSŸƒF…09ó Âo~µ¬¶¸‰­eDvepˆ“XïJeªžLŽÑ6vbsº’fy®Z+NÁúÍví"®†E|¨¶WHåɲü@Ä ÖëÉÜ0*#jº¨J§·$M¨Ð†©s²x‹ÜëeqSÂ1ÒF&«5 ýüûóçĸ]Ñ©ò†F‡j]âýp6·!þö8ÁªÈb^3O¶Wn›DØÜèÌ-ÇÛ pÏñ›€¦ËnSÎèMµ¤¯…ûC³Ç ÁðH©ä<p X$Õ¦¶½µT/½¿£ÍQà¦óç¯h®ß²tñgC´mH‘@üôýc?²¢ÙÅÞ-ñ¤n+ØÉ)n)™CaZã‹ÈxÇé~«§«w•³;ÏÐ-AwÄQ;Gc(Ñ\$ϲGþÕŽ¦Å’ˆYµyØŸ%«—°šwD¾“¸[Z ?XÝÜ”³ –·ØÓ@1§tà _,p%íжp?é€Í}|÷—/†‰ÌYî@AP8–'ÅIÒAò”%2sjž0ˆjŸ'Dªæ ChyB¤ùö'ak, ú½›ÎAöÔRŽcx/~§’eyv ~«Ãoه߱r‡ßö(rº2‘ŠøBß:/ÖŸ:û±òY€’8²ëd¾òUI -TƒŠgä­@p:kÛÓÁ¤—åv·†ÐaÜJ“b±+õ-$µL7§æmh¢‹|HÔ⃷IgÑ¢ÃímîUŒ@8Ôv>ö U-#…¦9tsÞõ–FdžV‡¹ aˆÅ_ÒƒTÀ8¤ƹ™€q!óP‡ã>CQ)™…Cê@¸Áßu°ìªQŒü‡1¿x& u“!M¸ “åʈ"$Âïp®ó‡Ï7!7Y-¿öÌ70„X^Í÷4М1À"z9­¯Dµ u4œ= }ÔAYiš7¨s=†ô¥Ü÷œx«‡Ñn9Ë»Úïž”i5̺%Ø<7±æÛ TÌ<Fqš1Q$R|¹+7›þ5…ئðÔ=ðî».÷qÚ²¦ƒt&eFˆOU©ö ]~ÒÁ‘Êõ5âèp¯JŸÖú"Eßn ³Ä¿ºÆèVî»Pù-I©¶í訒¯~øåÅ“‡Œ–ð°%K$ì©Òeþƒ”Êš#H™I¸_æ)qb³J[$ŽG<7«„‡(!€ç +HL 0´½*¼„+âÒTñÀÀ… ê8ob‘Ð?#:të9#9Ãú^Í×ey×ရ`mó]B¹éS‘Æ:¨\÷cÐGK6ùih£œ>.A”¥„ü´D»G›HûQ´Bs@›Hó1´D±G›Hñ­íÐa°¦·z2·6CÓÜ|ªbª§jïh†BΠâ½3Üq[9 7×'´BÁñÂÜÉ­PÕïè†BY®dkÑ¦ÝæÊLh«ešº¡8Ô@ sû#å?I­â" endstream endobj 2208 0 obj << /Length 2001 /Filter /FlateDecode >> stream xÚíYÝ›F¿¿ÂêKq¶ì'ÐÇ~¤j•žÒÜå¡J£g°Š!œëý÷Ù0Ø\Χ’¶j«DDzìÎ×ÎüffÍüã‹8X„R²XE‹Õî"°³õf᯿»à´Î‡…þ`åW×_¼ÐzÁ1_\¯‡¤®ÓÅ[ïëmò¾Íê¥/¥ôô—K_)í½ª«Mìvy¹q~LÊ¥ˆ¼}R,}!çžøòÝõß^÷ܵgЉ+Oä ANŤ2‚ä4‘b\*'§f\/}m„÷¦Í‹¼]Jî݃p¡ö^,cåíËU›WeƒB9Z’ 4ңÌâŽT³Íá'ýo½X\„ŒÇzatÈÂH¡`oß‹>þ°˜ŽÄâÎ.Ý-S<‚Q±¸ºøé þ%—*KKÅÒ1®³¤ØMð51‹¥˜‡o¨™ŒÄ˜oš­“}Ñžr#”³p`b%Ž8oöYCG2vC¡B¦áðÁ›€‚q«ß¾XF²;É%÷ÞÑN³àœÅZ[Çðe~‚(vÏj›€ój¡½gîáN÷ÆÚú†4¿Èa‚‘\0šŽÚ/h™2 YÆÝ¢UžNÒ ô€ŸÒÜÜ0àèƒí¸&—üåË 6ã%îá¼Åo“&KÝ Óå@”ïXu¬7Y›V»$/Ëd—¡JÉÅ ¼*·ÍWéÛƒ Žç$Þå÷W_üüÊ8ªçøz·û–¯‘*«™æb¬-D¯/bGŸMÖMÐs—o¶(½ÞÂ#ò2÷’¸Ç¦²“ø7ôRšC+¢®(M ¼ª&²ë1ùu’]#;Óâô´i…T€9Øv[5íc– !^t Äëy¬Á\™!Ìmo·"ðš¶FHžRÌÈÞC?›I³P¦Ú©_V­oæS ø=Dx˜ @#}>æÐú²jIøv›´ÝÈNI¯³¤›¶OÊ}mw»,%O RU<ö¤ê—€KX¬b¯Zã3"â0‘&mâF58(Lr¯Ýè.m,Áü-úØý¤¶bÿçzÄ„î ÐVŽË½{,™‹;IêÃlR’Xû&ë6X‹á·¦ §€ qdG²´= (ÅPŽ©Žò9a•ƒ›Žmç’Ôaåã©E’atPõA3·þð4kaÃãßÍI詇=ÃØU 3#EûʳEšùìîÛÕ¡pO íÜ$æƒçCTSÞå›—/©4«º¬ÐdD¤›"Ê}ʱ²Êâ+»…Tàñ@˜íj\:”Ç‘­ãa¥Ûc”WÐ _wŸzÕq_ãö­P=€|îåVÓÔMçö¾ÍŠÞË3$®¬ûsùÀ~¹ÇõÕÞ*Œ=q•”d¼yïºæ†<ÈeTuh!\b¬óä¶è’¶`9ø\A©$Y÷÷…Xÿö‡ÙnÝ ôÖDl¦Œ"bÄ“y.äD ¨Ï»›…/¥”ß58î)Wä3 ×8f¡âc®MVÀkÓl‚¹1ÐT³0‡ý,2rÌu5 ‡ÐÏ2ÍÇ'¾ ›ß ²úfOâoðDüWuÉ-:Nnˆðe4ÀzÝ 8MÿD·DM(þs)m`>Ô΄G±ðP¶ƒ»¬AÒA··÷:]§â>ƒ3vyÈÑ%ÔùÔ–îZƉûJ·+0Ú7= C=„L7û:±±Ó‹QdOé’(hÛ%ëéF !p·3 SOJ"<”, Ì,Iié®íz$‰Ì—’ȈïG“È,\)‰Œ¸ž“Dæ`Þ%‘ó´lþ¤äø j->Awôiˆ`‚ËÿÈŒ=Ñß”@ø0(£ú›)C0¬Œ´MFQöÀe~syå…ûe­úuÿ*Sqè%«UU§ýR”É¥5t~žµkÿ×úÖ¿ÛØDˆ?ÕŒ .Ÿü@²ö÷(âÆ»ÊËê®C'h±ÂÍì’î^? ÀK×Ú¸¿ë,Å0h´âÞ%GXdó!<]¿ƒÎ¤0ÌK°ÐÎ%M‚¶?»'« endstream endobj 2216 0 obj << /Length 2376 /Filter /FlateDecode >> stream xÚÕYmoãÈ þž_aôËʇxNó¦—ý¶ÝK¶ÛfsíÆØ[Š5Ž…•¥œ$'M}ÉáH–lÅ뻸ŠÐh†"9$ç!9æþø$ö'¡”,VÑd±>óílu?¡ÁçgÜÑÍ€pÖ£üóüìÇK­'Üg±óÉ|Ùg5O'_¼÷«ä¡1Õt&¥ôôÛéL)íý½*ï«d½ÎŠ{Zø”Sy›$ŸÎ„Tœ{ÂÓ¯ó¿ž]Ì;éZˆ#ÕDÊïèÉyÄ¢I)Æ¥"U× êð *òЫL½ÉG^VÐ\Ò.¥YeMV¶óM“,ðÛol: âÐû8ü †}æfV™$_»™…)’*+ÏáUF^³ÊjU¹S€8®2óˆOãÖ4 lrÆ%ãšôNM‘¡á÷½r‰OîÕ¦zÌÆò÷½»MCÓOY³"ÂEUÖõV%î5Õ¦nh-sÔ=ƒðn×Dò<¡Wnè¥)‰$q¬K`ɽ‡)|T®qgÜ3é@qNš[ñ`36»œFÒ+1P4wÁÔeqŽ/Ú»éUF Ufc¦q„ =žP±¤*Àäî£zsoê†bÍòNšvdh°©\¯ÊMž:Žé¨ÒôíCU>@¸‚s\x¿A«£|S‘eßÐü¢,~õ¹ºßT  N6å7ëØõ— ‚¬nL’²NdÈ´p"çÖ6`'?ö²<G'ãŒêàÂO×7Î}Ų¬ÖN®ÀöRŒ{+S9rŠ8ßK zšSë^X\VåÚ-ÓÄ¿ËÂÉÃän¼£ËZ=F¬•–ë$s[~wóÓ%{ÿó§·íÉþ­;²œÇLr¢ã€…Bâ¡ýòÕŸ¤°,™ 'O–r=‘L„Fùäæì£'[HXF*r D–®îœ·Êš%uºd¨|\J8±×pr%÷æÿœ£rÀ3ðÔœE:±–ߟÍ@®ÅÖ¢Ýê33õy !5ì@ŸÂR‡,ˆÂïYc]}£ÐÅ÷1Û c˜2ÙÀ¿/ °7Š£ãíõéÝç¿]Ì?^`‡,Ç¥`‘/™ÎÇ «‰Ž$Ó¡x•í8 ¹efxÉvu’›zÜz‚GÚFVÌåK†šñX°ÄôýûöºywuqsÐVàñ z`Æ}Ád¬Ø"½2:6ð€>Εµ¡‚P\ãM3YM£ERcÚ D€Ø4‹<3Õôþ n5¦œÛ´¬Ý7.Ñ\Ù 1´º*!U€Í²$=ûNPJy 'ÊZàᡬªÝÚoS=B&!˜¼™gq,_Ч÷pMzº8šÌÔ/Ç]fEÚUTEIOÈ ÜõêœÞ³­)¢Î M[g…ŒÃ {µT@}ÐÛí«Þ1 ¡¼gϦÙTnOS¨’|c _½; ¡h¡ÛÃBŸÖô­+‘Pö²t‰ãÏÙ“¦”wýËÕ•³ð²õ€3õ²Ü”×¼!°>ȵZÇ1“05š‰6$j*rö À𱞀5˜z×:€€GC #JY^]ýK;Ý—Ä,–â4rCÍd$†rѬûRc&á§‘ fJµ ßTc!B/bðŒÚÖ/¶FÝTúsïëwáHk-¬O%䋸ÞÅ*ÑB{?ЃÜ{k} [¿EEZ%pNb zw¬~õµï$Æ}2ÐT‰.1´%2ÞŽ©è맸;ž–|•inƸJH¤ºËà.Ú J’ê ¶Ýw/onÈöÆÇ´˜I8Ú†8?Ðz˜´ã"h¹¾%ìØÚDyyvWë’ê™Þ+Ú8¥qã;Üéóx-±m âÜ™Yƒþéíc0¤Zµ±Ñ­Š@±€Ql[XŒFiÄÂHììÁ©HÖÆ{¹ÍuE:iÌUwÄk/£](ºOBéP -µ`ˆG£¦ü³¹ÐâbkÓ¬(µ¥5Ã4.¼÷›ªÂÊ2;v½Hå?àž‹|“÷uÝ@?³ •¶šôÂÛËW®U©ÛíׯŒy4âÌçáŽGwèí2ËÍ!óz"ÚJN¬a`;4éëCº@Æ\ŒêB~’è(ì>šiQÒ2æ,º¯$ͧŽîÿ<¥ŠãRªô6ÄIRªô! ¤ó ^R,²‡$Kp>\žFv¬¡ØCÙ©Y&x…µ'Y` Ðê$’…‚Õ—CÉ÷èˆFñ ì- )¡¬ªNŸU;{ߺÝßötæ h žÛä:Lg!‹Â.K=–Y:ÊK3î#¹lØn¡á£`çè~@¤ÂXQ‡Ʋ8vžðìâåœâå°Ðá|³0ŒTا!Áìc†¹¯,÷Úž ×[¸Nî0GZ«›¿|„ÿ‘0ÖXÐ í³ðuÝ‘†: 䤥Ãó_n.>;XÀ!C‚aâ—«Ÿ?\¿ût1€Ž0T{ׇˆ‘dy}ÞâOŒÜuž‚S¡ÙÆ.38Ô ’›aïÇJ‡˜©HÏgš%t`TÃ+›£Xlfèc£x˜áC{X Z6Ò~Ø•^<âÁ6Ì»›S%5-%ôê¬iÇÎ °¸Jœ$[–ÀóÎ,ÝΜfÃûCÈ9Õ (ÎÒ®:³Ó®uuåP¶W±ö¢{Ì ŽêöÔ/+s0§KÅd°[¶í$áGLªßÙÄa{A±wŠŒƒ¼txtÂ9‰h—pú¢{ùf¿›ùÑ º©²ÀûDü£SÀïÿÿNgõ‡:¨^˜¯õÿ°óI¿Ûú@‡Ò»ºþã½ìêà Üévæö( ÞÃÁد®·‘mDû;.áþìO-Å'‡D]*´QGÔm*ÄuBOJ…4Ó&!A¿vàÒÎl,Mb.BÓ‘8¨KÔ׎žëƬ1 ©P¹å`:sÏ…ý)FmAѾ”V[ê«,MMGä~›CÆîw¨E¶|ÎpW÷4O¿ ÁàÀž÷{¨@¨¼˜üãÀ4œ ¨þ¢×dáãXZV/·Ù<Fí@5ÞžPûy(B¦‚ýhPCƒmÂK?áÕ… Œ6”.Ã^Jê3Á3‡€Îö¼¾…škÛÆl;èEù@S$åaU.ÛÛÛsW¬¸¶>-‹7®ÂY»îb`X í¤P÷scÃÚóŠ>ýç"âQ endstream endobj 2223 0 obj << /Length 2585 /Filter /FlateDecode >> stream xÚåZ[sÓH}çW¸öÉÞ"=ê«ZóÆÎC2óTJØJ¢*[öZö°ì¯ßÓ]Zn‡xj/S¤*ŠÔúî·ó :IðN²d’rN2¡'óÕ“ÄÞÝÞNÜÅû—O¨?w†ƒg½“¹zòà )'4!Y’ÑÉÕMŸÔÕbòaúÓ]¾ÙÛÙç|*œ !§ï¶ëÛm¾Z•Õ­{ð&¯fLO÷ùrvƸ tÊ>ûtõêÉó«–»dìH1ÍÉ9SÈÉIA½œJ B¹prÖw%~–ÿhiQ–šI{X0i¨}ø”Lxøj’©Ùä‹=ºšàÕ¸ZN.ŸüãI9#Jˆñf[VórÍyg a”Ÿ†w&‰R,ä½(nòýrwÈ™ J˜'áÌ„"iÂæ.,×aô0X›©t‚ ÚGЇ3ͧûj¾+×ÕŒN?ùÕ„R’IÉÌ‹g\ÃÛ)ä°ïü¶.3„ô~½n­|íu¾n%PI eD¦ª!ô1‘‰ç—õ Âk]ºØ±‘ügO”õ¥3ÖLysü.¯Ë"F•§DáŽ?÷ÔQœ¯«zg.Åtn’ä.ßÞÃêŒ I2ÂTÒH U–Š­{Ó˜lgiJdB=݈&#锵V´i/zvÓeùy gæÛ¯îoOÊi¼-ò]±p|ž±túµóyǃ*AÌeÒÏàë²*wÆk==ÉR,"Û¿D¢ª²4!*5ºÂ4&Š#6 © §}ëÙî åÖ:1ýRîîœ^UñÅ]4IhŸƒ Î{>öN•¯  kïø‹_^¿vwkwg[˜p¶—î–hÈZ'g^>§O¬Kû "jwg 3w¢àn§¯ýs_[à”÷ˆ½ö¯jëOãL¤*1Ú³éUó¨Þyýq]Öî½ùzS:z¸gk¿•»¦GQØL`Ù´^[e’0¶¿š·×{:h$Ný²Þ —àIí£j}ã dàÈo3©€eþ¹ ¼rµ*%boé£2¿i{×<_.Û~µ»³ŠàêÆ&Haé¢MJšfÇõiƒ:=IŸ‘ U4Q>|óm]Dø*¤µ: Û׸ Øšðˆ׊úJO¿¿Ô—Õ.¬ôFÏëŽmXë(J,ëJìÿ\yW¬ZÉzÆ 1Ih¢†ŒLÚvÔGº|—e:¨ò×7°B›¢ºÕ¹Š9ŒS»c£Í‰Jį’aeøCµ§±DcÊ&Tµ¬6û®ã˜T››^UnŒÎ½ÆãttÜû¶ ·ÄMñå*ßü°ÊË%¹uÓ;Yooc–`R¢0´–øˆ)ðåÅ/ñù—m4‘·ï Ý—q+ðÄ”ö´‡7iôá¶Ú/—kÛ3æ×û7ï®›Fþ ÆEuã^8Peß–:µR!ޖܱtÓH#«)–_\—›e R e¶7˜?]”(¦l-5Áñ4𠍑ˆ™F‹?Å•$e­žu¹B ˆS T×¥Wo/Ÿ¿¸¼|{¥™öëeP#tuÂÐ&°5A7¿3ìÌ_ìLân˜à°~±3/ âÌ[c;asn«íø#ìàXëÖ"÷&€ÉCk~j´ùBå)ž=Ì¢^UT[sAGuÆh""½ã°Ê zbuÛp»/˜2L]W{}þ×Cæð8aJŸ‚9Ç È½ ówïÏ/~:gíg¯#ܵBW= wdA‚’Öç~ñìÍsgûò&šŒšˆìÛ±™’D‡!¥[X ÚÊ>aR’f"H˜¢ZÔÃFè!!†›zž;ØX´“¬É󹂱ƆR$tרLGŠæ;¾Ót0(»: L$¢OÄ‚‘£4$ÏáJ<Ê#hdHQî$yûw_+nœ$õ~>/êúf¿´ÊѰ¨Vj¹-H‚S€ZÀšÉ£w§'aíw§}Öã¡©‘rúÑÌXÛ.0G¡­2ñ!ÿƒÐv/G‚§µ®–§‡Eô€/¢ã’!•¤Ž{^W4¦ ¶×ÑŒ«õ"ª4±CƒÞÿà€–:œÐZô~z£èÕár#ÁMY,¿#®ˆQ§šh6ÜDÔå¿" ".á)j8Pö£œej%ê0ç¸G}#ßÝc/ªzU–EÝÁ7º#`hmLð?âŽ@÷cÞö·ETg´ß4ãŸ]^ê›Ãn»Ÿc€*ÂʃeñèàIS6Ü^õã?Q":¼8¦#ZBd òSÇYd‡ÖC›M‡hwÄ …û¦h ðRT“gÖw*†…‹9¼Ü@òÀz÷-0A ^dèÕ.ÇÀ2ë/~dôîvⲚÝ6,ggpk¶ æVˆQQ!bØ­y–KÿV±]•Uïq³e0‡jò=5Í‘ÞÎÁËdæ›ÜøÚ¤Ê"ŽàáÝFÀñ-J/žLv5Àc]5›”]£¬7û¥Ù¤Ä| ž~A”ô5ÅCpw' œÊÜ9B–eÃMWrš:T…ßËfùPÝšQwîî::{Ó8KEZG(ê ïlPyŠvÙdÑ{2-þ9_î.º©jãÄßèÂÈ ^žõMÓûÍàCÚEô˜§1H¡}g4Œ¦Çx\}Ã$v´g¨:ôïûbc>×9AŒL¶_ýì W®dÍv ámŠýÝc<ìc<Ék÷»2ÝÖ=ëòÓ=péIÌ*õ_çã˜È‡5Õ“ÈZ41-Íç&m?†%íǰ§îG7É´ÜùßþœÇ[tºm³öž¨êòsivyW“Û—û%Î}•Küö€¢ Ö æfé¿~ôºXïŠæ3^¾ ÀþÖix‹KŒ:ÍŽ¨@ Y{náìXxZ­Û=I˜b J˜7æ|›7Ñ5 Fa³×›_“àõvM£Ç7%ÀE©<Ü”˜Q~lSb!QÊ@£G-J0÷¡ŽJiÖ NM4DN©`†ÕIÀ©¡%ùñèô$¼=: x7 qà-Ìð Ø‚-ã³T…lÇ?b „uÌï ‹¯G?#²$æüpÌŽÙw~÷ǘŒEªPƒÑ²ÇÀ-o18ËPRRÞŽQ99æ(–ʇ€äïýšÍ¿. [ d@ é<{f€D©%%ñ ƒ ÆQëEñýÿ«Wh®Ãÿ’e™ŽZQ1ØEül˜Ù ‹l’¡x<.ÊÊ_¢¥¡_v§}{§`Wâÿr§`<öo" Ÿ" endstream endobj 2231 0 obj << /Length 2112 /Filter /FlateDecode >> stream xÚíZIsÛF¾ëWð¥ÌNïÎm&ÏdSf,¥rp\*˜„DVA B‚ñøßÏ× @4H”Åø¤¬*àÃÛ—ï5ÍfÿØÌÒ™‚X™ÏwgÔ?ÝÞÎÂÅ›±H7á¼GùÏ«³/_+5c”XjÙìê¦Ïêj9{›}½*î›r{>Bdê«ó¹”*ûÏvs»-îîÖõmøâÇ¢>çy¶/ªó9’±ŒSyþî껳o®:éŠó#Õt”õ´}=ËI>Ó¹$LÈ j]Ü•õ äÙ²t‡¶Éœ+ “{[döË Âœ2Û5Ûý¢ÙoË`Ô‡u³ W÷Ûu½Xß;ëÜ­ÞX×QŽîËᔡ;AŽüf]VË1#Jª–”D’ÄÔ¹?Cᦠ5üÀõWÊä_©Hžm=(¾¹ ¦´ü͸5¹"Få}cêÍ„-‘J¶”‹Ï‰¦X×]ž$Ž úŒ›ÌrF¨ÕÑd8nË¢º{4Š*ôË#ì%=bN4í$yúé¶'bl‰e2±gûX aÜœ,È&1g*ÊJ–ógDÙs› sN¨Ö©Õ›}3&—)b­êk(Dùdجƒ®OIͳfã>Q¨å‡êc¸„2,«Bî,Ц\F ß¶ª*Ü5 ïX¶EkÃ5èÜÝ2pEòxåÐl÷}ÏlϺMnXTŸ3A˜ŠÉücá| .z½LVŽEFX"lWT?ÿðØs¸FéÒñWª¨ó Ʀ®¢{/ds¿¯œ]cI ‰Ö„¡*ë1aB¢½Éž06]M¬yÜ ®Üm“dz$¾‚_÷ N·¾‚™vÉ>b£‚˜C+žH-N‰h„Ösñý¾y…N³ò‹j¿ )iP)R4ñé‰8½m/ºøî½7bÔåc‡¬ž ï\ä”pËÓzI˜Í.a¦_å]Œ¡<šK›FõMy¿-weˆ’ó€Jª·¡+¹«¢^†‹ØdÝ%â‹Ï®U»G½VíßÚE>ÑÏó6å²£G0‚’4ú)(wµrýP‰®€Ýõz>‹*m îÙû6v¸nV-å;^4ëM+*³o›”QÓJ#bêÝúýºZ7縉ì|KîS/ €Ok÷p>—pÌ<1$¼§ª£¤ÙºqùfEv±i5«¢i¯Ü#ic"‡‡±dÆJy!©þœ0c[ºeP©Üöõ¦ 2|ÔKÙ×Ä]$e²®ÿúÜâ\¢mjô‘¬Šm±ÀÛm£1}è0‘6u(‹ßÏr§Ú—_™b(Q¦39¼· /^þû[üµö·›rmˆ…xEQ¸Œ;túö-ñ%ÂE¤™}ð”w3¡ïO5»<ûïÔæ†a,H°V3&(ñÓ÷qLßDIJ_,ÊÝîf_EÓ x`#j; ä˜vcbÆï´«õCå|·‘9ÇPCå ¾Õ^ÉòTûT2@@Rz^ŒF׊þ¡l‹ÆÄid[…ÆSÙ¾Ã<Œ—äú$b¹@…ŠÝ•ã#E"c\dÜ·¯Ïs‘Å>|ñîP‡ˆ¢R<özAƒp]£¢W1¨×‹¯Á×xMÓb6.{x`lBKÂe7/CÒøìû"òä}Å$‹íÉWèãU9Æ–ëÃÂð*ÖÓDJ ‹i„H*¬sú™Õ”ÚB1ÄáIÇIóXÅ®fc¦Ì¹¦˜b"™ƒÕÆ ÎØÀ&€À]Ê´mR¸Oç}÷ —ÂTò,?ÚƒÐÍh6ÃbN°)½À…BI,ÈÆs’F=VVÂígpÜ „bõ ðP"´ñø¾›RgbPôÖf_ ÍÇûòhgŽ…Î @æ–µd}q˜:,q"Û·ïÆ´„B°¾–cµÊ±PÑ>vg£hZ+˜ÌRÅ’"L§4Zn»®Äeûª÷F‡Þ0$<rèe 0ȼ¿Äþ„…¨qý¦gG:sÑf•x|æHDë«spàñYŽwÆ7dfx‹ñ¡xý>Óytj3˜J1Œ ³ü%ý…Á ÀžnSýe0¾AÞó´Èíà%€Uî]î>; ½p‰Y]F‚ɦ ̧áƒO30­tj‰¡yjàD׊Xt…SH–X,ÖÓnõ®Ù~·G[ùèÜÐ3¬±5“ü“Cžæ¬ÄŠ: ùÅÕˆL mN#Scvb &2¾øþâ'ç“_.&Nýç–©ñ’9ã¡Z Ëßµçá> ?ì|®­o·ýÃ&4>„aO mÇE?ŠKT»,#˰ÑáýÛõïŽuY?qRž4¥öÐbŠK¿‡<{ÓƒmÓËžú¤eOpD®O±ì9VF²Ï¸ìqk ‡§Xö¸ÍQõúèeï$²ã²—ÈžÚº zaغô±uM-\€™ô3O¸qñ#7.{ì¾ ÉE_pù"ì®^#=+™ÛÇw.@vQzä²Åæ`N¥Ï›þÆÖ¡xáP¼yjcýŸlž¿€½tÝ›ÄþêIìÏQ2Wƒÿ¿ÁÿŸü"},ÒéŽõ§ãzð”wŠÿ|óÚYóuøšY-Ãã›Íö®€ôòw?Þ¹_ Ëñ@„«u—˜b˜˜É‰“B£S‚3ôªÅ)pC¿Ìyþq‘Û1…”'ÁE~_Ec ?‰”[ÄL°ll±EáäÔI„ìp¦†ÂoŠ}ÕŒÄ ¾É©9‰dάөä]Qc2é6£?à$Üû¹¼Ž_ä™ERwÎ?ÏYøó€g$,5ΪÇä¥g‰¯F±Ñ¸AÉÿê˜òå‘p…¡IªÿÚpåè~rRµ3}¿‹?|ºŠþ?8¥» endstream endobj 2238 0 obj << /Length 2074 /Filter /FlateDecode >> stream xÚíZKoãF¾ûW¹„ F=ìwso»y'6Éø6;08m‘H…¤fâùõ[ÕÝ|4EÉòFÆæØ€©V³ÞUßǦé"†ºHâ…æœ$Â,²ÝMlW뇅»øõÛê÷­`ãj´ó_·7¯¿‘rAc’Ä ]ÜÞEÝ®o£/7é¾ÍëåŠsÉ,WBÈèçºz¨ÓÝ®(Ü?¥å’™èn—+Æ¥‹åòÝí7_ßöÚ%cš‰;íLÆvRjˆY(#å™ڤÛuN]¢š0¥A²Ýe]Quh÷‡­ч¥TQZéûmîüùX´÷]™Ü>ºÅt»­À=ei›¯ÝšÕé®ÚÂAЀÅÊ«\QItìÍû*¯‹%Ô!hÔnìE­óûô`ÅÀªË÷uµsk©[؃‚¬Ø§[.(Ýn¼¤‘€¸@£¢q+m·/«J4½LÛ¢*ÝRu?ìAË¡>('TRgó:ÏœËëÎá:O·;ríbäÀÊÈB—=ÎCìã!ì_óöP—îFÈ€„øò%…ÍäPÇDjÙåp|ë›ï¾‡ß®Ö~)N” ÅbâËèí»x±†/ÁM"ôâ£Ý¹[pÂ4‡«íâÍÍ/s=©$ .Q”Ô>ÿþÑé/î]šC–åMsèœs!”1APNôéJ¢Ùð{l;ešÐD.UÄ09µ]Ö/ˆ &4>TL9#J+Kö­’×–œFÐØÇÊ5#œêë(§µÒ¡òûjNk¢ˆÒê*ZYÌe*ÔŠ½ g0¢Žkbdè•”s½/ã]dù\e3îzbÅÑ‚¹ýo¿YÊÌv*Þù;Ì=’HÉlIq²lÙ&…1-™Œ¾p\uݡƒ¨ßm+pÿ.0FÅ1$JÓ‰üO,c¯9¾‚0°ÔozãŠØ6Ã^(Û)¨o0»}cc›ÏIåÐ °â÷½raf5­ª ЉÓ$œPNTë96á¬~À‘XÑNîïÑy.GÎÓ93W‰!q<1#ð*È/wµ¢OÓÇLt·º‘Úœ†š÷K¦£Ç¡F' áJôº¼eÑbG~„#JYöi!³®2)ƒydgŠœ•lâk‰v¶[çp   #µ°y„ºéÎGÄîsJ_¹ïsò@^Í…‚ ƒ ŸÍ ®°¾k6UÓÎ Š¡hžc‚ðAGƆP£C ûK¸>dË  6EŠ”Diœ¿6’v¡O· SwÒM à&y¹›Å.Ý¿~ü#%ùí¡¬HÜbNnŒ-\î·-.kïû´Áœâ%’ ëâa¿ßÝê¨l°—¾™I¹¬ #­óÉç—0'ôó\ŸÍ0ðþ 9ÎU´Îa”#>¸Ò<6m¾û¼qŸ°¦:_”íi\­-iÉ×îÓénf Pëeëd]§ÆvžŽ` Fc|à/õ½¯œõÉÒ1öòyá$nB8"‹j4 vö¢ñý=ÔŽü¶uî磆ñ]ÌHyºÞvRó¶y=KIW pÅ_„˜öO"ÌíL};¸½~Þù€²‡y™$„kéI$½ŒE M ¿‹DYqÇjÒC»©êâS>Gç8ñUTƒÏ.Õ¦l·ŸåS€kFÑ?Ï§Š² xTïíÝXyÈ ((O¨¾„?ñ—áOf–?¹>Q¥ªV fs0`šQ*æÏ)Ufì†ù“퇙øZmúI†† kà%(Ú<53'¨£’º&3ƒª" '×4ST1ÑÓcËBZèˆnðŠž…q˜³MQw>ŽèÉ0±è ë¼®€6N;hV>eŽ]Çuçžz®åo ðÏÉT œC+FâÅœ7 2¨†­iኛŠ>@3 ‡ÖÍËD~–UõÚ%4´ÕœpXÿ4Ö7+²S(9Ïœ£8ååÊs]Ë\…MÖ™½އ¸C"(2[1MÛc<ž¸}ëÜ âíÛ1hΞ$‰u—`Ï£5 x:AëÆÝˆÜŽ+<Ι 8¶ª.+EØÀÌ /½µSc=Ç/< hÜrÇ_ðG.á"/³úqߺ:ÏØ8‰{_a¯‚³9Å.šH«?M>O+¦>‹Tpp™2zRÁã*éRNqÍžSŒ5ÿ&·Õp¯ÿ§´OHPvHú_îPærRA‘Ñ¿IÅߤâRaŸ˜Êñû†¿4ÉP4>E2  » 5 \(J>C1à‰[Ç•ç9ˆé0…œlÇ5ÒŸBñ³K^u¯ƒ $%QÌ„EÿÓ÷·¯¿Ë‹ÝºËÛQ áñÝb=È£‘ƒô$çJôH޼aÌ¡X‡)у9ÞKñ<æpß0ÒΧEI“1˜£ô1˜ãgGcÔÌqù\ûX|Qê°%ÅxjfÛÑ0mˆä2ÌO݇â :ã£î5ÊR0,àŠéø] MˆPü*úÃÇuêß§u3ÿ¦F$$–æåX€õøn¤Â€ÿh¡ŸÅzÐäšú)ФDÅÍ 15x‰Lø“ÀÉ)#|rä8#{r¦‰\o Ÿ>t¯f&OkÛno‡N>z.ƼôóÓèÕŒ{óy<Æ{ž6'dª(dÿiQý{ Xµ)áÜÏH[Œ’m¨¡Ä‹OîÐ/;È ‚>€ùÿü§ÏZÕñÀ?YÚ™ÔÜÕy㬬Êut¥­¼ £ÿæÀñó_TÁ½d endstream endobj 2247 0 obj << /Length 1969 /Filter /FlateDecode >> stream xÚíZIoÛF¾ûW=QE5áì3½µAw¤›uKƒ€¡h{‰TI*nrèoï›…I»V‹tAŒ˜ËÌÛß÷>’ÆIÿp¢³DRŠ4SI±½ÈÜÕæ:ñ?uú%,\ŽV~¾ºxò%ç ÎÎ4NVWcQ«uò<}z“ﺲY,)¥)ÿt±dŒ§?6õu“o·¦ºö7žåÕ‚¨tŸoKBÆ)ÉÄâÅêÛ‹/VƒvNÈ=Í´+ïØ)ÁNŠ204Ø)C˜2og{cà§Wùë ‰°æn1#ÜJ{þ"KÖpóÛ$C\‘äÖ-Ý&°+8Ú$—?ÅtbJ`lª8ßw7ucÞ•ë»ÊI†‘bø,ÊI&Ñxª|guÎSH„@BêdIÊõ+Ÿ¹P4ÝWEgêjÓa§H0Fšsbw.©‚˜K0Ãí1U·€\ðÜ—W_Å"+ÆL#…I¿ý—ŒgA‹/cˆ°aѥϛ«¢ƒP2¶‰aD$í—ßäÕzSƤR‰WýºO¼ÄË#UA¹BZ@0A”‰yb˜òBƒöQ^fzA„ÖʉÂ{õÝëî„KDŒ‚l—FÜÁ )¢gîuÕºÕ[(–,¡D0÷« Ûƒ7¹kVW =• Ü‹µ }WåÛ2–M.Sr”L³s‰á„ƒHoޤiRœÐB˜ˆ^ªÃÖ7¯3;luþæ›M €¢Ò"ܵWÖÉ·‡ê…Œ²Q\CÍšÊt¶GöOì‘Ðx|(/u‘@ r …9T ŸçO{ªGÏü3Õnßy÷Þ,¸HóÆä¯z'oMwãïuÆeðµý¯ dª«:nUÐäÑ„NMãIJf¦õ=;\pfØýÈWYØ2qüÒlwÓZc—Lð¹{©¾:–v¬öf¦‚‘ÃÒëÜØÂw²ËªhÞî\90!ÒbcJ7{Âí]cªÂìì ²§N[hª¥÷ kŒ2:+ØÖ¬m:d6Kä<ðdiÝļ’€;z( ¢Þ I†º|•· !"ˆP$O ÒH :`pÝ}ú¬®Av®oJ R§°Òß…ÇžúðØ£­›ß6Èö¬¨í²>$®B#Cï ¤ÔƒN§Õö;4Û’³,]Ý”1á?,®¯ù¦¾6UT”8ô}‘Å' µ4 ¬¿”w]¹Ýu­=!ÊpùÙ7«'_—f»vq† ÛzÄm\‡"ÔXN‹ÚÆõü.oÚZy¡Ð–¿d˜m¢¡R@}pï÷(,a€9Þ¯y‚ND‹‘qXD‹Š!Wu`‡ùzml´œÓp^þº7w¥ 4m@;[mhrZMjÚÜš¶ ÑÒG¨=¤%¤@®ïE™™†®Ðç¡ÌVÏk½.«²É7±ˆr 4Wá³('™_S݉§–Hà™ìñœÙS4Çš GÅìÑÇ}pÿåÁš)÷"„MÒ“î-f‹Y* ­Ê` Jü(Í(Ûă(¦zóC"u`X],|ЦòýÌ•‚ñ”Ê¿†¹¶'¬<Â`™#ë9),n 3pJacÒbüõiÏO·Á½®öW Ú-ª½qd©ékÓ êét¡ßýtTZ±ß•Í+ˆšL(6ÐzukVÆ2SgÒê&ìi»&ÌJ6&1vÔÔAÏ Ëž¬ËérÒ¯ðØì²à~ÙDGT6eÛýl²»†ÙÆÆÇ€—œ§P#s§›º]…˜Œƒ~ðŒ´á¨md£vç¶ÖÕú@êh”Ab|@JR¸ô A5´PÒsŒª9à(¹ÿˆ8‡ò0"&º«zAqzûáL‰ª¾ ûŽ€ßëu =Ø*Ÿ‰£ ²!â߈±G@5Štži†ÇÔY7ÖþJh5´ÿè˜o¨¯?ƒujÀ:úP¬ãÿ$¬‹ÆùŒp—)”³8 Üe@™”xÜAywcÝÅ_M‰­ü—Ý1p+Žq`¬)’L~@8 ¶+´Ñ«Ö#ª„«:ÊSÅ=x*TŒÐÿóÔ÷òÔ;:…Ø÷³Uqç˜eÈ@líÁ„¾Ò1]þ[ µ½£¶÷аõ/¬î¢%=®ó&Éâì<¯¬,(ÓñœZ¾qîo_ÇP ¢"2üOøäãÃVÄÄã¾xa"J:Q„<ÊÛ G¿u1»¯·±ª×QOì뎌? n!ãéámt0ëÊ”›u4vP'ŠÌ5ZÄ;¨‰'L=l|¬ãŒ}§“·çÿ TÃc–{!çQªfî~vù=Âá•‚_Ïþº¼Ã¯¯šz{Ä*¯c‚Åö%û¡b¦&A—ùÄù>ïõô/ï{ áë¿9XNGnO°8X>†ï–{SþܬÊÛÍ[¯+Võ¾ +¡~š&žØð¥’¦ï`bûËfkª~;˜øjÆCÑ3ùã³ö‹ßº&/¢ió×F±Yû&Þß:V/¿þ~"Ü!$€‚L¤FŒªê¢­5³’HfÖß… ‚z¢áp_eÛ^í7¨·æ_ÂM endstream endobj 2256 0 obj << /Length 2321 /Filter /FlateDecode >> stream xÚåZÛrÛ6¾÷SðRêTXœf¯º;n·Ý4imwoÒL†–(‹ItI*nÞ¾?<€‚d9ÒNgÚIfDAà>}€I‚áIRœ(ÆPÊu2ß\a»Z=$îáæ»+â÷Í`ãl°ó_wWÿøVˆ„`”â”$wË!©»EònòïUöØäÕtÆ›ˆWÓçbòSU>TÙfSlÜ?fÛ)Õ“]¶žÎ(ã„L(VÓ÷w?\]ßuÜ¥'ŠivîÉ©@N†0ê唚#¸“³^ð¿eù[G‹P…H*ìfN…¡öî=Nðã FBÓäÉnÝ$°hxZ'·W?ÇxF‘ä™›X_eÕ«Í(M•"™AüÖûË"_/¢ÆƒPÑtıuó( Ói¦É%ÒRc:ŠÄ ·¤$£ŽysD+"aÙÄBPO9@ÓvF°†Ôð¶‰V˜GÚÑ´ˆ·énÝá_µbgµÿ\¯K(Ez2Ïš|áÖî§TM>÷ 7HòHÞòðyVl‹ÆäÐ@@0Ct™¢šRǨ ÞÒmØYÉQm)CŒé‘¶ßܾAÄ)ûi*ä$«Šì¾U¹)Ý/UžyEÅ„›@³_–U¹9 ›c5­}3&ÄMG‚m³MËïb³¶H IŸD‚‹.ØJGÑ(ׯgeƒ ÔQi£!ep›+òh]R¶ù~Ç;®6Çêõ?×yceJfŽôТ׿7U6oB:ÜzÅ­u¾:Mµ›7»*o5TC±q¨ÚM;· =nƒb½Ë_Eã”Ú·ðð½Ú½xûŸïáÿ~‘¡Š@}Ö‰à)‚ûÂ"úQA©‡BhHaí›æÛÿ:þÅÒ|‚æ»ù<¯ëån µSzP0–*¤Óô‚q …ÉP0ðÙçÊL ê"æàŒ#IFæxó6ÂSP„¹¸O! y^¿¾þñúÍ]ç¿ º8…A×jV´ Î>Èdor—%nqQšOyìòß‹º1n„Aç`|A   ÜÈ$"RŸ_:µ=G0îdÇÜȈB)LàʨíŠ!ט÷iqžœA &!ÏÿM LÛß¼þåÚYßf¸£sZW±ÌêÊôG³ºõ^ë*‡wXÙ¸@ 0)I: „CÞ$‚iN@GÁD£#).…iLsô˜7‰ÖH˜v ®©ìiÈõúæÆ„ùÛßàÀ¢ÕSQ·Å9„0Ò8fÚ—â4LÂS eÁ$†ig¸Gè.MÌdè©Ë0Önþ guý4edRV‹HÖ›9ÓËz.{jÊc:Ò{cß}67|Œ¤"ä#ÉEØ3 hƒ„Üa ˆµ_" [é—ÃÀOe±p óòks°÷¯ýÇ álN¡ BþDx¨{„㪠Ôn­H&T0£CÒdÔRœƒ{L7Ðý-)ÉŽ§ ÅÀˆ_€-%å±­M3zF «f—`…UBÿ2_BFQ²9xi]5¿5P$zìsè)ã´Qù;@½vJo­7* @E¬7l9˜A¼Å ¬ZÄÁ¡c?>® зß>Œ#»ÒÖBXûhžd1ƒPFÅÈ ãÚâóÕ$Žâ£C.ŠŽ8#Èg§UîÑ’ß1„K·Pº€‘Õ~ µp+½™Ì·f•ùžŠõÚ=Ý;&îË®61á–Q`1ÁŽ›àXx6LÓ!X5ÛåÕçVÎÜOØЯ Ï>@Fð¯95]–öõÍwïVeÝJ ðfR¥“;;ÛÁ®Þvó^ȘÕy¶u›;³˜Õ*oª"ÿdvû˜ßwµ9Θ‡Ù+›Çk己ߘò£YFAªE%íê0LîVyÔ‘û^åO˜È<á>x}¾*wݹIiê ØçɃý8K3ËI&ŸIŸC9B„†ÂÝI¯5e)¯zûr::Ü(ZfÄ=8ò™”%ÀF f¯s¦d@òœkKJà4ÒÀ¬¡Œ‡oW­}Ùþ*f93s3F°g˜œíi¬IŠþ6ÊF“Aªc´!©~áAoȆ»û!7Ys²€¾„«Ê#ì/%RB]Âi\‰”…N[B3D#ï„Ìô..ø°óÿÓÇ(€ ~}ï-eŒŽÒ­j¢ÌOøë~o´oóVG½ H[t®Ø?(f78Ù&OVlûÌ­oó§õç`®Pù¢†ªÙÞy=ÍÊW(åßvþ¾¦{•YX»3Ìþl6°·½ Ž0©FÚÃKr¾¤ÑÈþÑÑáKsb£©> _^„±Ç—!ã“ðå%Ø·ø2`¾¼{/î'àË3®Ÿi]€u‘&,lñÏ!чHÔܰõ— ÿo$2/*BF͹«ü+B—Xå;3{s†ýÙ!<@€±²Gf-løvÅUû<˜HiÚOïÊLïfÅž?¾ºåux*¿ÜØY¿|ì_¾D§P•½t1¥¨¿C¾é;Ý Ö!š‰ˆ¨ã G¤¿>oÆ ÆKÏPGl~‚GÖÙÿÍ/¯_Ga^©Ç[ ¤°zÑá(‘PœÀ‚—h^†–l;ósÍë"Œ}ó š×þMhŽÙù'…ã?EJôß°RÀBÿ}Úêø]¿ôEwýû P·Ü5;<{h`4ÞGÿ¸"N¼aO9‚ a Õb¬KeÔP“f µÁ˜•Y»zñl©oè)$GŽ„]@ Œ²> stream xÚíZYoÛFϧö‰ZDSÎ=ì[¶uº‡ã´¶SHƒ€±h›XYtI*Žûé÷7)MÙN¥öi¤†3ÿûžÐYŠt–¥3Í9É„™]ܼHÝj}5ó/§?¼ a߃ÿ8ñÍk)g4%YšÑÙùåÔùrö>ùî:¿m‹z¾àœ'òÛùB™üXWWu~sS®¯ü‡7ùzÎL²ÉWóã‚Ò„¥fþáüß/ŽÎ{ì’±g’iw>A'¥†˜™2‚P.<©¯ç†'U}“· JÒ$_/í KnëÒ‘×­w«ÕÍmûÒþPÝ^šÔENå~á6oš»9Ó€¶\â ß²iŠš@$Y–œ_»ö—M@Ù`¹iÊ… X]PN¨ôÔZÝc› ÉEåˆýlau[,ýò¯©L rE,Á‚v™á®@›`ÉqÞ–ëõËmåŸïÎ_/L€PÕ~ ra&¹(š¦³i¼j笵ңÉÕm]ÜFtSO8ÎÿšR±*@!õæpY­V•¥ì.XˆH¼Ü[P¥ŠT™ Â4\ïoaO¤nI43ÝŽÆ’t5¤{ ¬¢DKý(ÔŒp%ºÿu¢¼¿³è®ñtƒwÇäm¹¼ÚÔk=ß °õö‚J(ƒ5SE˜ îtZ´›:œþ<—2ÉW›ÒývŠ<©eGŸ?Úø³gÿüþ:û­w¦4É@ˆàÞùÎûél‰oÐzvç6ÞÌ8DÎñ¶š½øiÊÁ˜¦$Ë„ƒ$E0Ò·ÿñèKpν€šÍ…ÕÀåfÄŠa)àôb°pLT14×%þ’O™&4“Ð&ú!ýÒ°žA511fÊQB8XÂh¸.šjõyJØ0{™œhåw¿w!e³¾p*§É‡­))™ãªÞÐÎk—VS’ÉÀêÇ!b•Fæ/IMoÜÖÏšl¸ >"x· ÖØ´Á0mœ¸ÎC„þ{ÀÀ†ÂTªº³¿Wëb “„¦½µ½ôð6!rRõPY\C0"™`ü:c‹psmˆ„Ú,(Í‚®Ú)^41:ëˆümSÔ÷íým1%WˆUDb¥S\/¸µK(<ŠiÅNA‰a½\6Ie5p·î’ä:¿)ü[ué]d™·y§à“1§ߟŒ½™ýòêÍÇGäí©ÕÏS0a–Lš1Ș{«§‚… ¥‡buñúÖ…ØIYC5#Y´V÷>Óž{/î¤àß\6‡§Ëõ@B/r\¥„) "¡Ž=¢â?á)s ˜É¯ƒË6›[/¢ÊÖT“‰=ýs2úª\û déIZ•]„ïÈéÝ~ª‹ [ /©BÜ9yw|j–p`è_y¹êùeè e–¾*A‹Lç!´…%S1NÐ#Ä(G„P‡A¬1‰ñe]LÛb¦‘äÞuÁçª\NT·xGeȈ¡ì9e‹k‰ªPsTº|&`Ò癚iTSAr¶Ô™ÈÔ,%©êãD]7“\¢‹cÙ“IšB bäÞ=ÄQc²qZêœIŒ‰'§§!?¬S!t|ÚݵHÌчÌH©VY^"úŒÄ«ÙÆ6òQ¬Øú'JÃß¹m£\“·E&â° ÆœðÀ‰x6',Âí>œxOCJ*øŠoààдì~+ MWPÝæeY¬–“‚D»mØHÏϳá(ÈÕ¹Ïmf›ò÷bBI¨S0på{) Šrê@¡¥íÚØÝÌ Üo}Áò²B…;aò>Ãå“i’)ôd\EsÅÈ”ã6ÏÔ(S6½£ˆîè ©à9LIÛÔ¢w$I4‰ƒ[pòr]¶%;W|”XƬ¢ ÉàßQ-¾ö¤-§Cj >. ºnQ¼+4eþ©ã¹ëSÃL8 ü¬=ûšº®nvçQE´uG§(ƒ•m‹ @Y7FØ–,òr=ÙòK¢·Ñiàù1>å&za—ç’;.§Ù±yPsó3ð¼ñˆ„mËÖÀÌm],ZXÛ O´·›Pœ}ÚØ¹b7Hi¯óà;wåjL²ZáD8Ý+o$KÚÅxâ0Ò»ÝÈC¤ ‚[^$§‰þj €nYŒNnò/åõ‚¾keCÍ|AÝ¿œq¤Ú^ñÞñ tPý–°˜_´îJÅ~pÁËo‰¡ùØS](¤Ú˜>úÒÖ€OfàýmU[ óïO¢mÉ«Áf¿ãK(Pnõ Ýyª¬pêG#Š-V}NÀ†\œT®,Nig+)¶õEX,Ã’»€Áï¥[«‹Í*¬;¢S{R,K' ©ð_aWíµ_t"·'®ç^©xR°ªJMÀ.{ðµºl‹µ_úäg.­¿FKÃmLꮦœ8¾FNš¢܆ôi{àԣ뉰wr˜!Ò.®6Åô$ƒ ±ý$ÃÜy7š1Eê¶U+EZÝërB¢°ÂR†Ý_NXüvü!R>¸™xi'Hl÷<Ý¥í+@˜H‘Ü‘#Âà:-ƒàvtq.PºŒÄqòv§D­#äApºk ã<:>zstrÞëÁÇ&ÔÌÌи¦tnr VÅMÑ]ÑÚÅeeŸ,,_Ð÷Z5šGî¾ý‡ úÙLíe_&Ãå@iES£íp3ôVÀÊ™« c¬Sjä(‚¹‘Á‰ÒR0ãüÙÍK_¿;òÒw%ùVi}°«×¶6´«ë µ>r…U!I1ô%Š a—6©„]1Ä,•#ä>> stream xÚíZÛrÛÈ}×Wð‘L™Ì˜}s¼ÚĉWr$%/ŽK“ ‰ (h­öë÷Ì Y’Wª\.» `8èÓ=ÝÓsºa:‰ð‡Nt4‰9'Z$“ÅÝYdG·Ÿ'îæê¯gÔÏ›câ¼3ó/7gþEÊ ˆŽ4ܬº¢n–“Ó7ëô¾Î¶³9ç|*šÍ…Ó÷Ûòó6½»Ë‹Ïî‡_ÓbÆ’é.ÝÌæŒ J§,Ò³7?;¿iÑ%cOTÓÌ<ÔSwõ¤4!ÉD%‚P.œªÿ‰¨È6KÛ·ŠED0 áv¢µBL‹ô.3ê‹i¹rf4ìC^xIª+)‘$–I#©(—Ù ž"RÈfV]:‰Û,]?=0fN9#1‡ÑTeÆÌkË´N…SÂ(ë“=l5éf@Oi éÔTîêû]íî?í`+oüZ¯ÓÚ½ûo6nl]6 ñúú‚ЃV¿as¼†Öl²bÈ . •´gPº¨m8¤*ÿ=ó6¬ú¶ˆÖ«Ëdî¥àç¿Õ[Ä|-ݺڻª.·ÙÒÝÃݸ×=6Fãvo´›†@·Å“ŸÜ,¾i߬<°tb÷JÎÓÓóëzF§™{­ã,àWÛòîˆr*Ðí»é°݃oÖ=ˆiÓ=ˆÙ¾{€QÛ=ÀXê£ãõÓšîÁ~r³øf¤¿{ñs§s21}»rî˜î,ÝëY5Ô>pÅŠˆ\±ânÍ>ÏIF VññÒ…i0ŠÇpB$U/*]8' åV”©ºN°]î†2nT…3{#@*]˜!@Œ‚ ¤Ü¦¯@Mn}å\P#뺻UÃÎìS•YÑ6øÝìÒ]#wÁà—*M©f` Ù²2¡£ôôMj£TÚžQb{FxØUÙj·q÷.2e“Qã},v}0×±B=lÚ:•X玸GÐÚȾ³M03ð_3#óB/ßß¼½¼xýÎ< ¿w¤è¨µætë9B¾rÛöÑl¤rç]W¬©Ïm«É'MÛ*ûb°Ë|æs2½[€Ežú|•m·¥OgöTm;ÛV¹=žŸ³h²ÁÖU4ܳâÉzVŒ«ƒž•yñxÏ*"4fà½84Ø {V äà¥FK:=+ƒo×× gÅu|¢g¥üŠr ìP±#=+䩤i Tä©Uy€:ܳ‚`ÍGÁk’¬ç‚n³£ëŠf¿ "A+XWldúnqá÷E·â }_) 3”ž¦’ä Ô)~Yë I=†–Få'»L£ Aá;ª–t4}^³ƒEV‚ëuð§õ:¸€–tœ^‡‘E™|J¯cXßë`—e1\ªDØì†¾´áð¥Ì—‡‡=l¯Ñ`·R?¥ÓÀ¾M§A?µÓ @?Ln¥xKȱ&Ý@„%è×uÂe ‹ñãÕkB‰R?ª×¯ª^ WTµŸÂ|^f]‹} 2Tžþœkƒ·%M«@Ip›GTUågä~ù0ç!¯×î®ÑFšÒe»C…´â\èdzQ:‘¬)ædS`ø®y£:ïì—þÊÏ*|ï¼GÚö F‚az_¦+ÿ „g½–LÁ²#)×|ãVsÙ|4Œ?8|UÂC2cOI¸£Àú„ÀÞ§CßdÌDc3è3+G±É*<•!sñD…¨u5\ujìÕQ@A’DÄM=Ų̈ýTì3ñõÇÙõþ;<ÕîÓ[àßÖÕm«F//›#fßKýÖÇ[6Ò š‘«÷ž GŽ7(Žk¯a‘=8µ;]®6·ú.déÞû8ûëùùÅ›ù͵¹<«vtœ]ZÎŽà.Í÷zyX>v»p¢›û‡r®Ö ÚòyY— 󱋒u,!éS²î(°>ë°ØÛÇ{ÄÚ±&êh|÷d‚PãG‚ø~Ä9b¦°ÿmÌ4̬ãÞÇßÿ5K˜ý÷Ã÷úm endstream endobj 2166 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1371 /Filter /FlateDecode >> stream xÚÕYM7 ½ûWèØ^dñKÀ"@Ò`{h Ù=¤Ýæ°IŒ"h°.œM‘þû>Ê‹";Õdš‹/6GóHJ|¤DÙL™C LY‚’k¨ì߈‚Õàƒ©[†PRæ#…‚Š+Z\«H0’À%˜uŒ…\»V ¥ö‘ ]«…š]«¦Ð’û*š:S T\ *äã|FD0{ÄÖ5 ¤æª•‰8®¥@š».¦nPc‚‘B˜IÂHéš J×ÄÕ½&`µ<4øjÔm4HVü-ÖŸðÈœÒÞ5$¬ƒY]‚QFÐ Á¨¤.á…hv R»|(ׯ YvSx™æL°‘[ׄ›"n’(+$øªä¾WÍq„µuøhâs‚9I¹Á• Τ¤O€¤®Ë ‘;Ž9ˆZÛ/JÌúì™óõÉÒua9—  Ë…:Ž aŒÕ© ìµÚÇ_‰]¡Öäü0L)¥®Û iÇ•€ðt]ŒIñHi ª%FŠªšë*RNûÊ–­¯\2¤âVt-:†Q­©Á^í+7Ø«}å{}H ˜s+†N{ ƒ¤ Û<Å !±¹ô±L¨[iú¬@§‰SÌ™‚©¸”iq>Pc–©WY°â{ÆXé)’} )’ýee×ô"ª¹Ãà«õõ `¬™Ïeˆ|öÌ@éeÌnuq±Z? 7È€†š~Ö/ù•… éîãû÷¯V}¨%G¡@aŽMfI%z€—Û»ûpqÖ—ˆkÝã/?BB<<”¾ì°…”ñ¥‚P¨Í„x>¼ó=ƒöîáhý|·}sµ¹7aýüéeX_o>݇çpý÷Ÿ¼¸ý}³Zÿ€ùlîî?81]µ~±ù°ý¸{³éce?öóæí»Û'ÛOá&aÀ«µ4~G·;h{§ü<¹„£ èŽc6eN±"‰†@Í+¢1"CcEõÎ`á ¤ 8ù&,`ç?b¡èrŠÍ`aÊU¢¡ø‡@ã-ËȪ±âd³ðYt(˜›þd-f¡Ê1 •–³Py P®‹ê¨­FÄf ÄNIôlXht‚…6“…öPHïî¶°v³oŠ|>·°Z_}|}ߟŸ½»ûcµ~²Ý½ÝìöÖÓ+ŸÃÌÞsÞ4²7D¥EìT†ý {¯ÂúÇíõ6€€ï~Úì^ovÛ¿%M½»õ¯ëgWß{@>g©¥É1å·jc q‹Á¨Éc YËH–£æYàö×E¹·<ÝN€­|]º„cÎ8åJ±žÜz'@tb8)Ç8t™±J%µ¨Øã†@œ°È¨³ÙËqq9¢Õ¯ KiõËËÖE lÝáh¤Ç…u ¨à´¥:rãè7º!wÉX¦'þÿ ÿ‹tæÅbòé¸ò;ßbòiF;5)šŸÄ<rkÑGq2ÆFr.W \OY`ZÎÏh§¦ \S”“E3ZN1‰°ý—œ!¤¢hìlvL¡tµåtÉŒg Ò‚‹{Ó1®ÖÆ@¿k£s¹ ²œ8·dæ¹Åû9†cΑ4eœ4ùÔÕb Ôì7Á1NзÊ aÓ$[ÀÖ×·’ß„--Çl©-gKó ¶& Œ+‰œ<Å'@EÍä2Æ Îl^3€‰c3ÑdÄvF[¡èL—Ójsú;þ9æ$ œ³Z…Ç@®gX$…BçÃVÖc¶úŸ< ÙÊ2ƒ­ (Sޤ4jC»ouW½”Ê(UcS}sõ;йôåDC’Ûr^Ë4$ÿ÷1S¹ endstream endobj 2280 0 obj << /Length 946 /Filter /FlateDecode >> stream xÚí™mOÛ0Çß÷Säe2)žïlÇöÞ1ö mc´o&†PFTjÓ.¤›øö;'nI hÑ«*TéåþŸï~8N_Xh!˜•&¸˜ xuµ¸ ê'ïàãb Œ‘oGƒ×GJÀ™å‚Ñe3Õhœ†û×é¢ÌŠ(B„êMK©Âãb~U¤³Ù$¿ªßø”æšp™N£…xt6ú88­ÕbG›.òOM>ãdÔûLŒd díóæzBß+ÉŸë\€šUU°D岞ñ`Lo~ 8SƒßUè, 0ôj _7i‚@–HÙNorØ › cû‘M4K„iË.ÒqZ¦Nøþ ž0!¨€ˆLa}z.ó‹r2Ï#ÏüIÀ¬ra—A, U\“•êžaUÑój}´#Ê—¸ºpÞ”OxS¬`Z®³|çŠ{1Û “ %¶¥êVzå“bÓš†Z¬Â¯Ó|<Í6‰ ª”2 mؤ£4 ¨BTdPð0齂ÒVb²JZ€\õY–«[+ûéÿ=ÎiLx‘–Ù¸¾ö#BÞÞ•¾Q42$¹Òð•žä“ÒÕ¯±Ž–1M­£ÖUa.„Ö¦$ Å)¦¬ï–ý"#µ‹<û]ÛÞ~fP_»)‹åE¹,|È弨CŽ#Cqñî=×B#÷cy7ºé†·%O2Ê—×ù~EJQE–µÞ›+¡‘ ¦çÍ[}!×.åK¯ß“ØZ&è’ë{¶ÈnÕ­}`Áå’´¯°Ð‹¬ÇBKv–•×ÔwÂq7>À¢22~ †…] !ž Z0¤¹¯)±ƒÄ£øtH 3zÿåÀqB;NÈÿ†Ø\1ž˜~0Áiöµî„‰>dW˜hÊfeDˆ¸]T¤È@NÄûÑGn ÛÖŸä—óMû‹  xÚ³KVÞ.²ó; ÿ;šv˜ÇÙT¡)Š!üvL¯ãŸÜ¾l ™$9„Š>Èärqkº©YO¦–lG2õ¡¿"SKßa_šp#›PÑ$Û—ýl¥-S|÷põïlÂíy¼Ô° :¹\»À©U§¶j‘ý|¾Gª†ü½\ŒfÝ>qy¾ å3´‰;*ü {Cê•ØaáÄâëöÀEÂ8MI0@A#.¡ z‘õ4¸'[d‹çÅÁb+p°£AW»Úšg4'T¿>€àrñ¤Óñ Y„–lyÕí€ðD@hÊïþ'³µH½Æ'‡/ã\àìÄZQ^ endstream endobj 2291 0 obj << /Length 917 /Filter /FlateDecode >> stream xÚí˜ßOâ@Çßù+ö±½¤{;û£ÝõÍ3jbrxóŒéA",åÌý÷7Û.Ø*ž}¨A Ñ@S¦óývvæ“m0üb‰„ Fj2œwXq6“ò wÙ``P‰ü6è|½PŠ£† ƒ»jªÁˆ\{g“x™'™!‰ÓÑ,Ù%.°RJW´a—vÀ¥¦€Â"ƒ‚—IŸ—’‡›¤ÅÈM¿¡e¹¹´°¯Ü÷l¶ÀYÐÞ0ΓQyî·Ï#ïïSé+ECC"” Wéi:Ímý*÷Q3aë¨mU¨ Á{SÇFàÍ)ªŒë–³,A¥‹4y,mŸöP(Ï­òl=Ì×™ ¹[deÈà²ôλ¾–eztU°ºL/Ái™ã¯Va`»ìtc€Îª—ºâmÉ'gN¿>1Tà)ÛëL3 Ý¢CÛ@Í%q-  Y‡‚ºì2KÞ&¼ *òÏH #Ú b ªqKAð*N»Ø*€×;Ç£ŸŸ¼! ˜¢,ÔíÀ€á„GQ#´!»AMv¹ÏmAEý“³à¸+h ƒ®m¢ƒ‚DÇ'´ Ø\Ìè&@hEÖ¡&›¤Ãb*—q–ï /MÔG”  ’©wàoÈó6´BÌš#”MÇ>h6—äMøÐŠªãCU5Ÿ}Þ½ýHòý=E û$?¾P8ô Ønx÷ö#É \„”á´.pÔ%4¡B+²Ž 5ÙÄNv• Ͷð~û‡¯o ð&4ÿØ0œ2¬Þñeð›†th÷u\tí6ÀÁ> stream xÚí˜ÝnÛF…ïõ¼$ p»³³¿¹sR»h‚6*%ôÆ5Z¢m!2­RR‚¼}fÉ•M*Bà ¬¸† ˜¦fçœå|"N?9Dæ¤f·#^ß­®£æ"ûu!.¥À´ùr:úùL©8sÜA4½j§šÎ£óøÕM¾ÚU’"b¬^$©”*Ww×U~{»(¯›~ÏËDØx›/“T ˆˆäbúzt:½WWBô´é#¿ðiÈ'2NFƒOm%”ÏõÍ‚~w’ÿÜça8UK¡|¶ó ÍéÃ×gÊŠèczQXºZF“ÑŸ‡4ÓRv…óu dµ``Ý0²Ú0¶+[”³!~?ŸUÅj•Wïaÿ0‘k†HµšVžŸ%ãm9Û,îÊâ‹°RGÌ)%üÊ-Uß­zͤ®î»z¯t:*”»¾ñެìÛмmC m€v’ýÍš®&™¢«Ø<]?…¤¢íPwá7y9_‡Ä½¶²-m8¤ '§ê¥TxP_&Ý+,®Ð»¤uWÈÝ#H–ånim?_‡¿Ë嵇gù¦˜7÷.aâO'ð Ò2Ôr§ ¾(_¿Ö>:Æ =Mê¾*̇ÐÞ”¤NBÚ›c14vUÆEY|llŸLþ`ÐÜ[oªíl³­BÈÕ]Õ„œÒ#CÏ^ ñºúåUæ/‹ÕØ÷?? ®LÛÒ¢‘Î Ê[6y?$JQe¶%{qpGÔ-Ô¼½4ôÞ­|pô»”:Çn¥α1”q (xb(c™чƒÈbtd©Móõ1ÀbÏÅ>+€I®ú°¿¢'+Ü×Ya3ÆVÀS†…'“¬ð”XÑc¿‡'Å i ƒpÂç’®&Q ˜h«¾¯.©RDôª¢Cü*&ÔwÂÙh9ØC„wpÜÄæLü ÿ‘o²—éi–ùÙámö¯HÀ ¨-U΂Ÿ‹µ‘ LèÈR7®ó«âñ¦†Ž}pÆ÷À@=ƒ´Õç¡&'g~nx:‚Ðtì¨Á ^·RõÁÁ ²ÙUµøðx,xPïö"X jËG z€SÚ>ƒ ÆÙo=¡”¡/ãüOð¹üKÒD6P #Kßä}+>úë„®‰½á@(ê wÜ_ŒcŠ‹g&|ã«ÇêrL'Tï}~]1ž endstream endobj 2313 0 obj << /Length 1953 /Filter /FlateDecode >> stream xÚíZIoÛF¾ûWðHÑtö%·4K›´MRÛ·$0h‰–‰J”CRIÝ_ß7œá*J–#ºHQ#$‘o_¾7 0ü#Áb ®ƒÙê—W³Eྜþ|B<ݧ-ÊŸÎO~|%D@02ØàüªÍê||Ÿ_G7EœM¦Œ±Ph ˆ@ÈkK€ƒy™9SH"Ü­Ù:Í gèlB8'ÛãHIÊLòl[AìÙCÀÚócýp @íæA_}îD#MûQÊ“¿ãQyÉü¸K™­]`ÅHÕ/öøŠÈV-,ãt8ÛÛ¦@²“!ƒ§ë [ûÀ‘4]U¡u”Êé«VúòêÑR÷(÷ŸËåÆŒgQÏݵK²Û¦Ô[Šs]öÜžIš¶b[†tSЫD]‡hØV e5ÿ£«4/U›š mŠ1Ý3÷ÙÙ[Dœµó¨ˆœ=Åuä#vÙÉúÅÚçýP5DG¸vÆY4+vhêävÝ×V!ßšX{5Óh;Që«=’tÈùZ %ô@ èÊ“ò¢¢r±ýÙQ¬íšÔTa‡=È4 àÍYoŠ›Má Š²¬tòí–ï×Ëyîh^¼<õj¥3âý€Cl·ƒ±)«vê—@«ã»‘€±TÝéFÚî·;2Á0¤û9[—|Ïo0"™Ùã·/!ÁyItY•èפ¸v÷€çÂ}ßå"v´Ð~.jRgP#µ¢ó¹¹«Ô¹cÞK—Hî©4þº¼õaw}D5}¤æ,¾Éâ<.am•X¢²¥$ÌoÊ$ˆgIY¾ êZ®«£ ƒj…½‚Æ)x›ÌòÂúT€f›øé`[‚!Ñä”{.wžýòþð™ÔÈÐ@0èî7Wº¡P`CÁì¼ðSùݯN|býéof³8ϯ6K;î$ ×Ù~ý8(£GQö¤ˆé*!Àçœ$’d© äZGêËÓS›9ïNWœwD™^àÀŒ¦7'{­…j^EÉ2w_í¸š­W+›‰öwGùÚFŸ^Y7Û«Ì7÷­útíÌ}‹µOÓ6Õ*ÉóZjÞ$™Mjû«NÉÜNKŸÐ]àtH—sÆHsØB&0F„ËQ2n ÒB²"Ö/d±{²Qdú…¬#sWÏÔÄ’‡\‹!"gH0qÈBÄf!Ò‡.DòF‹€+ Hç(¬-ÀÕ””œˆw/Dä }H|ÃF2¥eÝžrüfB 'f—à yÔfb“Ë ³iÆÙL¶g ›ÉÑ›‰‡ç°Ž[˾Ø1gE÷&̹Ã7‘ï¶…µ!¾X»ÆÚ0tzÅ1&ܶ ºkëk3i yè1°6ŽÚ°‘±ö VX»£à~¬=†Tµ;R±ö]X›Á4ÃÐKÇÀÚŒAà;k"ÖcíŽØU¾(&Œ„·Ðàcx€c £† ‚†¼°"ooâm<\Ý@&ÔBAÿ€˜CNa ër>ñ¸ º °²°q/"† ¡ˆRÑ9èofnÏ7;‡nOÌ#Îû&œW”SÞÛ.¦[ÄŠ@Æû;ÛÄÐ=<Bz/â"ÎVIj[£Â–Ñ´ÇÃ^¶3ºsÂ¥=T‘ûyÍ,ÍŸ%-Fyø|“eSX Rrº†º/1üØäq^]Þ¯Së´¼D­ÜJÒ¼ˆ£y¯”büyù³÷ï{ýüÙDóð|2%áëwo½ÿ¢…¯ËË h¹‘Rz¹m/Û>öË`ºˆ›³wÿp… €•ø^pžªg¨>Œˆ w+±ˆàYï6åܦÂÞ«‚PëP=qdØ;Ï+bq£oúƒ\º×ü#f2£Ì?Ë k½ç8ªG‘*1œt¥4þìFkñŽ?ûv|ïô£.ò;z?^¿AæaÙ,ö¿A†ý 6P¦ê<…ƒ¦#œ§XN´ r1d‹BZéÖö·ã(¥ëµÝG)à­Tghÿ/&¬¹ÿE’Ö+|•s°Wÿ¡ªs„Á땞í8·Øñ.ÔÉퟩì8i v #=-›„¦gך³mÍ·_¶4çÍ¡Ù,*\àäï “Ú7ÿ*AªCª†ÔŸY•à@5àà»™‹µ)Võ»‡¡m$ÿÜ{Ë endstream endobj 2321 0 obj << /Length 1349 /Filter /FlateDecode >> stream xÚí˜mOãFÇßó)üÒ©ê­gŸ÷ÞÑÚžî8 鋊"äK ‰ê8EôÓwöÁŽ.…ÜU'E ¼Ø³;ÿŸ×¥ø‘I#Å1\G£»ƒÔÝ-o#ß8ÿé‚]‚†IËòÇáÁ'BD“ˆ†7í¡†ãè2~;É$Œ±X¼$œ‹ø¬œß–ÙÝÝ´¸õ>dÅ€êx™Í e ¦ÀWÃwÇÃÆ» tK™Öò‰N…:IQhÐ)5'À¸×¹˜Lñ·vùW3PEÀgÌ©°£]^¥Ñ¾‹R"4œé]„ ±5‹.~íó ŒÉy×ñ8/i¶(Àº^&F‚0*£„JBqN®ÃåÉ@³xYŒªé¼@|zÊ€!¨í™0³W¨Æõ¹p³»v~0:"L÷ºë\¦mç 81Ð ñG*ÒàÉ´Í8¡œuýø5ý. JÛºpBT5擬Ïò¾Q™"RèÚî{?âh^,*ÛäñȦË$+Ÿq%uÛδÏh¢©YùAŒ¶„é(Á¥ÒcúOÞ“e¦*ÂE%£½–\5¹Á‚–Vn¬ ‘às‡R2,uÕ7/E´Ò­iÍò¢où\Mkõ oþ‰Ö8Us…žeé&$%€ùu»™×[Ç­KèêV%[„ël6Çm­ãQVåcïÓ€ªøq•¹­@pT$yí#$ê´˜V6[óèÃ\å¢YlÒ;U*p•0W\t%ÖÓ¢3bVÂ<§Åýr-ý²QSÛ²²ÌìÝGoñ0­&þÁÑñ¹oäÅÈÇaŒu¯_b𻦰Yá®Hjp1`M$ÚÞzÏ<žßxÇpöT8ï gO…óŽp,8^»Ý&Î[ìÛ¹«ãÛ?yYÕ>M«2+×â1Ϊ̷¼P´ôÿÞgNæŸn”0H5aö—ËSá‰ïæuXU;PiÐÒû<¯–eö†¢R!1A—ù›¾KƒMZGØ÷[øŽEþ0{ôÍN~û[AžmŽ ÄóãVæ Û¶JUÊkËü¹Éw±|6Ð<>LŽlJÚöзÃÖbB^æŽý”^TårT­ÓOè. íháóêe´ÂêŽ×½É}}’(‘Æþ¡&±½_¿e4‘£[¬¹ý\4†0¼åÉH·##“¸5ß ™¤D¶-wâ:°±ãú.¯&6pÿH:1ã ä8Ø VÏ’~™C­é=ÔúýŠla`:/fíƒ.ïwÏpy$üǃî3ФøÞXäe¸%åk IiJ¨¨yuÜÈL³%3õç™Éí‹Ûž™{fnÇL,=Å®™ùáxøóÇ#ËLm™É,3¹g&¯™Éž2“¯ Å¶d&|ÃÐÜò8IS\<‰íš4ÅJXþ<4wâ:@³ã:¯LûÝ/}Uõ¦j'þ)ÖM¦ëZÜÌ{7 “Xuà+:¯ïó땎=©_Jj†(x=¨í8\É=¨÷ þ¶@ ¯ õñð÷³ãä—Ó+ãcçPËü×[ûñ6·ç[Ü ö9òr¾O…oú´k+Í¿:êDŸ endstream endobj 2329 0 obj << /Length 1221 /Filter /FlateDecode >> stream xÚí˜moÛ6ÇßçSè¥4L,Ÿú®[aÖ¥‰ß ih6“qdW–WdŸ~G‰rDEMŒDY€Öˆa+ÒñîÏãñ~ H„áDGŠ1d¸Žf7¸¾[^FÍÅñoÄÛ¥`˜v,™¼9""lH4½èºšÎ£Óø×«lUÙ2Ic±x›¤œ‹ø¨\^–ÙÍM^\6þÈŠ„êx“-’”2NHL‰HΦ&ÓmtAéŽ2å= t2„A¨×)5G„ñFçú*‡OòËÖ¡ #jcN…óvz†£9<üa$4¾Ö¦7 W‹èäàÓPLÂ(’œ‡ç¶¤Ùº ¡ F\šqB ˜¡m•0ß®` Hlï   «QâS¦ &ŒŸKêÂö‹ˆ2‰¸€…¤)ÃëÓÃD³xS̪|Y$$>ó#eD2BP72eV]”zÌI½ªçu~¡*„_æó6é綺]Ùóމ!#¨ÇÖÝg,°jºfQΘM]ÿäÒ®FNU[󫬘/ìWH™ºµû¹ñ8[ëÊYCr`ªJ3…<ÈVm6sûè*«7ŽûKÒú…T 'ijzÁ×ù¿CeB$"ÊšÖ WÛ2a~â2 £R ù®A­Ô‘«¡(¤•éL`a‹¡Õ ‹G†fš.‘a*Ìc°,Aq¦ T¶^ëŽÆÛöQ'Ý­3–­ýïb±„Ö¦ãYVÙysïøö®Š;Éç1¹-;_´y‘W®; „)H¿ØÖœ+š"ƒ¹Ä KöJ ðG e܉ð͋զjæÙ–Z6Û6ø¬,3w÷¶±øšWW̓÷“ãæÂ³&shþÃ}ܾÄí"÷z…å =•`{Ù„æñò¢‰¼UÎî+ç¡rv_9ï*‡îãÅCF›øÚ÷¶5µM¿¹Õèãñdú×Ñ$ýýã¡“ñ'õ -æ­ä”Äeâú4\@ùçÍÏ»“ˆø=êžWåLë1\lJÛ¦Zus‡½l_óǶڔEãæŸD¨Ú…áo« =w‡®{j`_€’<²m÷*K»^ÕXw9¨–½dÏ7ÉÌ«Y’Ð ·R@3néð¿ ÄŒƒoçJ ³+¾ÇˆìéD®ò™Ã÷µû²ÕàÖPaè˜ Fù b´\·zu §O"(%ß$(&ô)¥Ü´vÞ%¥Ã¡ cºhH‡çC“@‚ f×PÜ<šDC‰óÚ“"ülê±iÇ&$D«›dÍ'aÓµ›Ñ±9ÍkY×îËúßQ³´!*y€ÊN‘~ÿpdÒ@Çá£ÐÑù‚æ¶+G íñ„¶Žp]B®²ò•)ÙHºîJéÁRR¤´zãæ®°ìÀËoS8ÛqÝ;cz‚6-AµÇÍoÄ—I,G> stream xÚíW]oÔ8}Ÿ_‘Çdµ1¾þˆmÞXZ@ ÒÎ[·ªB&ÌŒvš)™ ~ý^ÇNš¤fW©Š`ÔJMë{ν>¾G€â†Šsb„²›­WËeàÎ_ÎÀÇÅw"ÿšÏž¼2J 5Ì?tSÍÁeø|•ÞVyÅœóP>b!dxVn—ezs³.–îÅ›´ˆ˜÷é&Š!ƒ$ºš¿šÎ[tÉØ4mä=ž yrB‘¨ç™hA€ Çs·Zãoù±ÍL0²LÚl—W4XàËW%R³àsz`h|Ú³wc˜ÀI„è/ò’¥»F  %"1Ó@I †ô «å®Ì?Zàá)2¥ •ØD–e¸ ¿|iZo‹Â+¿3 ˆ‘Ž;c®±í ¹Ô{.ê¶^×â±Hßçë¦êë.‡„ö8€&“úLSI= é† Âïᦄø¤¬KO¡Ðæ\¥Åb“eåŠ$R7qÚŒ"̶ŮrÉ3+×UjuÍØ8T̤ý›ˆçÚãóµ2ÓÅÃ[±[ÍGd ÊTÒ˜,„jUÁ S¼¯Š!*Š[Ô™ÀxMŒ•¢ˆVm3°‚M^ŒXÝ4Ó90+5ì‡Vªß—ÞQô´ˆ—XÒd­'ˆh®+¶I4[ë–¥;ÿw³Ùâ(Ña–Vù­½˜ ¿Ü‰¶Ó¡ ODƒá5º.Ö•U]§1…ý—­ôÈh­L Bk5•2Ô@/à½#á ]·ûÊÕÙh.ÍÚš–ejW¿¸ˆÏëjå^œœž»‡¼È\#8lÇ9zÜ!Åö£ÁàqÀ€%Æ.´·rËœßg.úÌù}æ¢Ç§#uø=¶'yš¯|·äø‰pþò">?}çYx‘deŽŠñÝÒ³‹·ü¬Ê}Ví˼é¤ê¶†zV^Òç9Fnã§HJå>ÇJžŽŠ :ŽlÚݺà‹;|Ov[–ùî¶.p[Ü•Xm½\ lZ¥žußbƒœq)F§£Í¬ÿ‘J43ÚTvlè†S {3ì!§èC·?öBñ€^Ø¡0´B†êH±BvÏ Qß²Bg‡XáК+쌥ï@ÅL`ǹz(+5!ÌVh3)G/|p/„£þ<^øÌZáÙX!ûõ­''˜Ä m.j‡zá$ÐÞ {ÐõWÙ#»a—ÃñËð¿Ø!gV|;´™×d‡Ç/ã>Þ—áÑÿ—2;ŒžÄm.EÕ¡v8 ´·Ãô?‹ìÑí°ËᗶéÝ”U…šÀ m&•ðãÇáÑ';|}òü·´C;Nþ·ß  endstream endobj 2345 0 obj << /Length 1050 /Filter /FlateDecode >> stream xÚíW]oÛ6}÷¯Ð£TLœ.?D²oY“è°¡Kü–&«¶PGödyEûëw)R¶$ ©;¨HÚ ¼¼çÜËÃ{ð"üOGždŒh®¼ôaÕ«åÒ³×ofàâB [‘¿Ìg?¿ƒˆèHƒ7ßN5_x·þ«U²­²2c¾x„œ ÿ]¹Y–ÉÃC^,íÆoIPåï“uRÆ| 2¸›¿]Íè‚Ò3išÈžy2!QÇ3Vœã–çn•ãoù÷!PI@‹:˜Sa²ÝÞEÞ7ßzŠzëÐ@á×Ú»™ý1„ Œ’˜ó.ð"+i²+`ZG„Çzh-ˆÆtV¤É®Ì¶Û¤¬ |ÿ.©T$ØJ©™=tû:PÌßi•oŠü;w2öˆŽ'C¦°ùÕgnêæÞ×eâå×íû¦öûS&qÔa"b"š|F"r°ºÆ å´ jõõÂ%¥m’•¬ _%Åb ee’ÄB5q?™l‰ÒDIÔ6ؽtSì*‹˜TbÎòüHÅM^ìÅ8(¢¨>‚×évùçìT/”s"ñºQbCzáò æ oÉ¥‹J¹"’Çu*лªAbT«„uV Ý_ÝBݺ>ª5)W¬ÛÔÎÅtô‰Ï è¡õláÍCÆ>ñæhݳdçþ®×2ÊO“*[ص¿Ìe}: ¹Õ~l‹yƒát›ye4Ø*¤CL∃²È`­TpO¦VMΫž:ùï‘„+4/¶ûÊÖ™šá‰bKÒèMÊ21«ŸlÄǼZÙË«kûoÎ6bcx˜£ÃíS<\ro\h¼è±ÄØ¥…æþæ½E>0g§Ìy—9;eÎ;ÌqYòØQ‹ßa{™5¡ÙcåÛ%ËûWEzqsmßf"ÙŽN-i™¡tY»tqó;÷6«rŸVû2kZ*Û=Š=§íë # {ðŸ@Tç>Ã’^ª g>Nõ¨}t×ÃçG|GvS–Ùn[Wº)޵V›^S›T‰cÝuP#g\ Ñ £Æ¾ä˜]Cc˜&•™gæÈÎ/;È(™jy¾aòok˜}*=ÇŒ)‘Jžã˜ì듞阺ï˜:&8NŸ£cr…‚áz Ç4©$ðÉ2¿¹eÂd™ÏÊ2çoóÌ ¿DäÌ|8ûdCöiö+y†‹ÒßEY¬qñQlÔäÅεÑQ v QGÿÃ"}.^Ú§2yéöRFjØ^jRQ¦žÈK§ÿ>'+}"+ýõòÕd¥£[)5ƒC«Q¬Ôä’‘<×JGvVÚNöÕ ßºi•ãHÙ”Ok¥–N‡Ê÷e¥ÏÉIAÑÈ1œÔ¤’1›þ+¬ôÿd¥v:â^3’&+5³æ_ï)J‰ endstream endobj 2354 0 obj << /Length 1124 /Filter /FlateDecode >> stream xÚíX]oÛ6}ϯУˆ8ç¡|5ˆ„áE¾¼Ï“‡‡yvïnü’d¦ÃM²DŒ €\ß Ç[tÉØ‘4mäO…<9¡HÔóŒµ À…㹞Íñ¿‚ük› ˜"`d,˜´Ù®®i0Å›ïJ¤fÁ§2ô!ÀÐxµ.Ï~ëÂÎH,Dxšæ,YgÐm(±éÚHb0¤ýg~‹í‡0Íóenñۇɔ&Tb/YL”án×Õù@óp“MŠù2@xíwÆ1ÃqgÄ5v_!¥rÏeÙÝ›²N<éÛ}SƒTj,bÚ`Á*«\PI=¤©‡ Âo:q}瓲:A„)V…Ï’lºH»²rEb\ñqß»Œ“e¶.l´íŒ *Žƒ› \ØÄŠy–”ªÝø(NC•ûКhÖ_ÏÿN÷Å &£¶D§X„Új…cἩ•&*c”°2‡\tU ˆV¦VÀ"ͺN¯l ®tUˆ‰áªÙÇÆ±4”‰O°¸ÊZŽQ=ÃeÓýÖ²cÉÚÿ.Kœ/:œ$E:uk·¦ÂÏ; ך/4áØQZ7ól^XÖ iSØ~¹•!鬕I“‰c­†pU- 4ò>·;¾Ðy¶Ú®ÎJjÉd;e“Ù@FsZ'wéa‡Oë;-ƒdåoŽ1Höï ’iºÓ Ê?¨R¡MsÌwâbzóG0èx@B£F„yŒ?‚‰ ãe&¢'‡4‡’1Éú:$œòÛrÈË×çÆ9òš9Š=säGš#ûÿ›# ÎÑ‹;Ú\ ù±îØ ´·Çô*Ÿ|^oÜ1h# ÿÆmñëPㆴ_-{pBì-PŽaõÀå„U-ÊLŒëN¨ûsBlˆVÕ»âéUñd„ŒÐš'1‹ÑÏ¿ŸŒð¿!³ÓÁè^ŒÐæRTk„½@{#l@£X¬­’¼x^?Ü#Ò²EIq^‹'ø ú8ctÏ'–*Q õáþŒßSAY±¨ÇOµ‰TÌOTO.ù’^‡Ùä}~{Óè±é¥ù¥,_¥!¨ endstream endobj 2362 0 obj << /Length 1117 /Filter /FlateDecode >> stream xÚíXÛnÛF}×Wð‘*ÂíÎÞ™77v¤háXzs ƒ¥K¨L)Õ ýúÎr—I1© +U›6`z9;çÌeçhÅbhÎI,L>ŽhµZ<îáæÍ¼]„†QËò§éèÇ×R@ILc¦ïÛ®¦³à6|5OÖeVŒ#Îy(_Ž#!dx]¬Šäñq‘?¸¿$ù˜™p›,Çã dï¦oGWÓ]2v Mk¹ÇS#ON(õ<•¸p<7óþÖ_À4XVÆ‚IëíöŽ3|ù6 D|¬L4ƒOË`2z7„ œ%Dx–,Ùä0S"T|èX’M:ÐɺÈ>XÜ~™6„JÌ!S„a.+ëÛ×cÃÃmž–‹U>†ðÎïT‰%šãΈ̺F*ÕžI•Õû*>¬Šôi¾¯ƒ¾oQP´C‘ZÕŽ~£’z¼¸m&¬‹æ:ê٠LóÚ|žä³e6ä•k¢pÅÛ½pÓU¾)í£SÛ¬ó¤øTÄfœë Â*€lj=†Ö‡Û,þÊzÓ ”ØF$Æ<÷zBè¦%¸µÕ}TìlQyÒÊ׸ E£MÍCXfùPźIÂÁP¬`>Œ®ó¥è´"`MTóCÔ‡µª…ßZå,Ùø¿Ëå ‰ Ó¤Ìfní÷1Óá§]϶! áJÔ¾Eù¢´]× ¤CL㙓M/‘ÁX™Ä* ޱ¢÷z ã°[v|œ‹|½íµ\’6Ó4)ŠÄ®~råܽ¸¼ºqYžº<ÌpÒSô¸=†M‰{s!Æb@$Ú>8d®Þ;à†8ß'.ºÄù>qÑ!Ž£ÆqÇ|:ü6Ùˬ¶Ì¾¼[rôDxqÝ\½óYÌ}ƒ¤E†Ý⺥‹É¯üq,‹mZn‹¬N£n'†zN¾o2´ÌÝÆ?ÇRbCn3Œãå`#á(Çhh{릇/vøõ0*Šl³®â[å»ËU/“3„MÊijîŠBÇ„ã’ó’ÁaB(9%ÜE­+jâCuðÈ^;ÈVƒÖ§—ÁõYŸ,ƒ[#ÆS÷|´ž4è³ žeðÿ%ƒð\¼þ :øíË ×Šp~œû õEÅÁ÷Á£@{!ì@c§TB´NŠò´z¸Ï¤'‹KpBY4;rgÒÄ8Ï¡;Ï­¬Î¿þ­T@U-…y¦H2{³Ãrs®p»zŽH2Ô-TåJiø÷TRK" ï|z8‹äB$á{¹,^åéÅõM¶¾¶,ì<:ËåÓåå‚àØ:†Z2†Ó&>øÖx d/–ä?féÉ¿=msèßQ'$;D ùž@2ø¬@R`OHô(-Dç­{#cŸ»7Jûëêéñ.Ž`1êGëI¡êœæâøI"œ/Ž_[±"·¢/‰ö¥g_]Lì÷§/ÜâôÍÄ}›j߬ ·øóå«Ýb¥•vµÖÊjÑ-9±²ìh÷¬ÊiGÏßy¿¥ endstream endobj 2370 0 obj << /Length 1990 /Filter /FlateDecode >> stream xÚÍXYoäÆ~ׯ˜·p‚ Í>xùÅÐÊ#¯l]Ñ ë…BqZÂ’æ±Þù÷©êêæ\ ’ ¼°šÍ®¯ŠÃüDZ·…pc-ÒÙ§wë—-~:cæÜ ®'?lϾ»ôýóÜØ‹Ùbû<µÝ->9û¤jU½\ !ÿûåJJß¹¯Ë—:9²â…^Ü$Å’GN—äË’1‡soùyûóÙzÛk÷9#L<ù Îp × gI— I8›}ÿ¬Ê?zYŒ‡.‹}}Xr¥}úì-vðòç…çú_ü©p€E°Ê›³¿Ïéd‚»”cÅIS°µwYÿwÔ¡ˆh¬¶ª³b)˜Ó¢îi…¸B€9wCÉO—ËH8]‘¶YY,™óÙÜ Œ¹±ïs¼¹x=8úΗ2Û-!¾ñï#ZûˆºÞÀêeR¸¾ðííß<ß3Jâá1ér)ì¡ N§Ñ_P>„$™ËÃþø>)v¹š“*ÀK~dÏý$n^I áC(#H‹€¹gÓøÈ°0Úá™èõ7(JDÁ8+¦ÆpéÆÌb,Êݬ%Üw™çO,¹¼º^ãJÎ{iŃÀ¹X¬ s˜OWŸ÷³Qâ®ï‹AØPåúA`ä±ïSòV¨æ i‹R£6Wµ-Icþæy „9iÒªí=-yèO¹9̮ȴ:LFfEÖb¢ ì ¡¾NÖº³¦rÂ"Ñw¾z‘ކ¶›5— (°hbîùæÖedí.i²§Ý'-­ö rä´Ïøá7I•ÃÛ’®ª¯m¤í+HI/ ÇQž¹+b9ˆú(€P5iUmYÕ "ÀÙÒ±¶4ù§Ü×DµÝ•჎¢ÕŒw?” †^iÚºKÛ®6æÃ1rŒî‡¤ SµJvɓ͕ç²>-ž;VY ys¤³ÏþN=u//}CªººÒá+ÕW"«JWÈÀLä‚#¡=xÀ”8”]lp*9u­…‡Òùˆ¹‹²gü •ÅûÆø›²iQ±ï<ªmð1ÐÆâö?¯³'JÝ¿ÐF‚îÀµ×1Ú ÜIÌEPp™=Ó«v¯ŽFO’å0V3¼=Ù‚+8iÊœÈcÜVFoUåàÊ•Ž£7®sÝ"ôÝf_v˜¡úFþ'&¯N㣑 •›âó¾‡E‹ä´,vÙI"øÒœM~Ç›æÀ©KH>`ºvÔ*ÆP¤µä¯É¡ÊÍ¡[LM¨U(!˜ÀÀ³ŠÖ ´ìêT5ô¨ /vª¤1àA[‚¯%¸×UFX99ƒ©jLS&upóIû‰NÊÉq=¤Ä¼2…˜}!o m!Sªi’e ÒòŠ)®¡ñLbº0gGë4)R•ç}AôÇKª U'ªb†ô7©âMyP”ýÖ¡òò1 :í:xÞ•t¤([ZdàKæd©Ž"n$ô§96­:|#Ϙ.}xV§šÓä x8޾ޤóÔµôiBêmåBÓ冎ÊçÞY3þ˜r6—íL˜Ÿæ,ÐTÚ€WNÓš§IÚ“á‰SþfXåËXg¾Â+8÷™yo÷ÀëÒgĸЌQ >½m_³ÝS0—1n;B?Áµ"؈ºå*ŒCgý5UUKÂuâBÇ›WðofÄ  W-¤@gøï°Æ£Ì¿B„ Š»‘‰èÝ/¤‡ Üi„27…– ¼Ì|`›á(åµ~*:=„Ü/uso²~Pqj¨Õ÷s… ¨V,ry`R€|ñàfj‡2{{«[+r8( ´RzúÓÜgÞ6] ]¦AÈ"€[ª¿¤‘ž:’&%Ý¥¬àA×±[/]R›Tš“l'Â^2Éaê?+ÛP¦>÷ï•ùq0k›¦sļ*;z8$¶ÁQš´°ó¼ÃèÿÐ’‹Ažâ4h§³Iðk&³Q‚’=®îÞ­µqåÔ`&µcšÈ}/-뺫Œ8Èÿ0ø¶£4ʾÅxyw¿¾}Hó3 MY¨‘z) ÓÝ&4…Ûïï‚qu÷G]fy?™W]ûLùUgü@ùø.å7ç××wïpÂ:”õñÛOÃ>:¶(„ì#Ù ~>ȳ§:©‡­ù­P?œoÖ|¯>@ã ¤…}g¯¥ŽÚÎL^fÔ_(©ù¢ì‡2š. £ýh>avÃqUûÃûÌxXŸ_ß<Þ\mnηß–xy¦†ß{À¸ù¡'ÔžÛðƒ1ƒ ö§@C.š—5õ(Õ¾ýlÒ†fkXÔªÊÿÈ\ܞ߬ßj›· C“06êÿȲۻۋ÷Zö ìW!ªÀ²ºluXlb’ú „O<©éŒròd¹Y¾ýi󰾇¢ûññ—õ¯Û_ï×o³þªÀÊP©Áñ»þ%å8úmÀ´<Û’vc²ÅsÈqþù„hØk endstream endobj 2374 0 obj << /Length 1086 /Filter /FlateDecode >> stream xÚÅWÛnâH}ÏWðh`ñûÆÅdÙf'+´³²:¸V|Ûn;#þ~ª»Ú@¤Á£H«É]´ísNU.ÌFþÌÆ Óx´íöÀé7¶ÉCGEù¾þÓƒ©÷µ`cëbç(xømÚí6ÌN{И`wù¨ jücŒ$/(o¶lÛ6º¿7[ŽÓ5V<Ûs’$,Ýã ’6­¾Q’¸Ù²lÇ4 Ë2›ÿ>¸Áéí]˺¦Üù#ÎÞÎ^ßi›¶ƒ8×Ìà>Oƾ» GÃIøìn‚ÍÊ•(®IvÛ½FË´Ûfیsº-Î[Óz4è…dvÌXß *ä•c°#œæ±Þ¿ãY‚W¦­_ÿ{K¿жíÁøÃU=ôæ'Á®.iômã—p¿¸þlº §ÃÙÜ܇|*_FXŒ€lã]¢¥œ}í˜Î–,Ó³þ  ý¯ÿWRQÔDx^¸^ çópôe:uýû@C—Jhï,ªÔ}-AW»Ù1¾Éo‰Ð,2E Õ€ 6 èfÓˆkb@¼¸÷ û>¼È;æ_‹÷¦Zæ„€ 1i0rÅn¹‚}Èxqæ£(Ÿóâ$Ï%%¶Uì^%;*/kR¬¸Í‡þÓèÒa7Å ßÓ3½+²ºÈkLkbû›Uà…®ï{w–Ï\UÏ·VLßf©|¯olù1/¤ýç©£ åœ%¬Ð¹“¡±S=Ýn¶ºÎÈ+¢.E‰EuÄ5K#mN>è•Dú‰²,MC¨Íx$ÃÑpiÙ™>“"RK¶h™ÃÓ¥müLç–:³eàúËáü.™*g¡4Óª4UEq€Á3þÑâŠBÕþ•K©¨íŸÝ j,Ç~ÏGQЯ·$Žuëq+áb_;Ýü›¸á”Þ^ÇªÒ a•^•[X\æ–ÅxuTI-ù"|/Ür™o]i¦[[”9ºí¹Ùº_ðG ü±~äk¶Îh¶œÔiœS¯Ÿ¨ÉâDqe/ƒ0jʉ¡RSÎVZMÕ畚Ò*.ÔT%%¤—÷¶Œbâ.M'LhQ“éÚ]Nê™ÄO¸ šFEv›m-d¾;~™úÞ¢6—óÊ$àè¦ì]«ŽAwžlã<¯ ÊõüQÓ[çÞÚýDÕ¶q&è¥hί‰ógÌ®÷%¸KÔÙÛ³ ?eIõÀLIü†ÂATÙÕd«"•·[WÞn}ôvË xg  Í©ý ƒ*M°‹Eœ qÃösžÁá—ÔóG)ÄÒ Âç¥÷÷2œz>ÔÓp¾¸Ë*—Ùi˜×SIŠ6®M}WÕØž¡«Ÿ~8©;ç›:eTAƒÛô|]¿O«i¯:S@2´sP´& ')š?ªi}î!IêräR§â°¢j=ë±” -%å§£4d.[~3Ï¿ endstream endobj 2378 0 obj << /Length 1178 /Filter /FlateDecode >> stream xÚ­WÑn«F}ÏWø­ Õ®1‹÷kã„ÚÁ”TQ[!„7ö*ÐéM¿¾3ìBÀnLÅ ì°»Ì93gfÑcøÓóñ`¦ë£9¹DÇ‹qeåû¸ñ®.49o‡­™ßü‹_V†1ÐÆ£ùx® üÇöVþnð§²8„YA¹:Ôu]1~U‡„ŠËÓ=G–ìŃ›0Q'—JÆêp¢MS&“‰ú·ÿÛ…å7o7&“3ÝÄ™ÿ÷szâçô’Œ4?o¯møצ³ÜXåy[ß Ϙ¦ƒ¡¦4C¬[©—º²¸äT@)Rq-óÊ@”C˜ìTM‰a¨)#$€(7,Ïð8!¦?‹AÊŪ#Ë£4ùk¬‘=l½Ig:†Ò›ùH×ç¶sonìeà¯ýÛw`hb¡Ï"ŒÀþ«<-„?9•7IZÏXhXÁ˜ý‹ŽUõ,¯qCã1`ÉŽEaAs±¢,ÍøH‹Ž–0ËbœÉÒDL¥œ§¼'jß^¬-?øf.ƒµõà?¸ÖyØ×Ü%—SÀ n½dƒ h‚0îäï3…&É ilÓ&m»Tl'?IË1,ªi±CÆS=³]½·Xÿ‚¹„ÎǺ$Tx (ÝÇ;ôê’^ò>½ú‡è­“ ¸=W>Rtu”Q»÷¬Srh'ã-Xmì0ÒËMÓõ¬ßƒ¥µð\?X™öÆZžçï"-c È\ÙNæceG#T‡œA‡‡¦;„WˆûRèo3˜ƒ‘5‘…õO8F¤Š¬6«#[­•RÁ«ªDN|a.–CHÛq¯Ãþ5ò!o©§qÞ&3Cð6™LêVåÍþ‰^Ð&)Äå]e ¥« 2©KMµP­xÒªÁ$š[ªÀPx­Y«Ã‰ä½¡©/•Šàô¼ì³kY,ôn}‘RÉÂ<§»¦’V×à÷ôq{çÛUà™ÎÕ™uÒäûòH•˜Õa–%(-‹‚'âz‚‰‡Éžöõ­£Î6°6ÖåœÉ¨ŽÀê‘&<Î ^FEÓ­›ZÝirÀ'D„[„5ÁE½W] éñKZzº5WVÿ~eV¯*è1+ꜣˆæy÷’¤É~gyA–na­–½6¼™"Ï'ýý¿·<{õЫÒÞ£ž)gx¾ikíNR5³þÐ/Ì3<aŠõôÔ]/nF—®·ú„(Ý5a?™C48ËŠÞU¢ë“í[žéÛ['XlïÞMñ¸Å!;¶-šÐ $Ö "JËW!×u„|ù²%$ȽU%y°±œ+ÿú,pKHçvák¥®çéd_¤÷y}²ˆRÎi$A=¦ü€‘O¢j£ñ·Û`³u®¾k©Ìò¬§xÚÞ‹ÁûxÔ÷LÞlT®g; Û57cÞXgÁq9ÐͲú’„GùÁ“¿ˆÌ ¿¾šÞÕÝùÿM9„']Ko5PrÒ@«³?°8ñ´þ<«¿ÈÊä)©N'ÿ$M[ÃlùÑ^ﬞ¬Ó}Èkc¨Ó›ñÖîn¤ÕÝBÎeÚ…âQ ~uÿ\Æ4 endstream endobj 2382 0 obj << /Length 1937 /Filter /FlateDecode >> stream xÚÝX_Û6ßOáGùPóDŠ”¨¼9Ž·Ýöšì9F€ ²¬] •%W’“î·¿ÎH¶¼n·[ 8$ÀÒäpþÏo†’#þÉQì¢ ±¶£t{å»ÝúaD‹Å÷W’é&@89¢|¹¼ú÷µ1#鋨åhyÌj¹}ðf›d×fõxg^Œ'Zï¶®êd»ÍË:ø9)ÇÊzû¤OT ¥ô” Æ—?^Í—½t£Ô7ª‰”Oõ Oô ­2ФçÛnàÿÝìÍë×óÙòn¾X¼Y §ö™H„£‰ „4l`U–YÚæUI¦$m›mw-þÐÞ}’ÙZ ÕÚ[ŽmàÕLöäåw´®Ø=éXEÞ&KÑ¿2n}›ÐNÉ*/òO‘•`ývMXÁH¨(˜ön¾¸¹~w=½ùÏüÕWL“tóŠÉêü_ê49ØHf±ò¼—'ÒËÇÒk7ní5ù:»PÉÛÅÍ»»—ÓWw?Íß/ßßοMÏå&#%vuÎ2Þø½•=’>û&kØ­¬t^¦Õv–­ŠŒh²2­wSÉÝ;HKàs¡1×àéoʤS3ÖY“×ä`í¡ó >H«}Á~/+αèy¬~’¦YÓô)7sÙuÙÄfÔÛ¼iÀÂæB{æ¯gÓÛÅüövºX^¤'1Êš¬D­ZÚ˜ÞÒß:Û\ &ÓŽ K]úQäôQäƬŠs¿,xv`ì÷óåòæçù›ëWÓ÷ÀÁ•V`Ëoû¬iéÇ=¸Š¦[OÚ|›Ñªº'’uBõí67IÃzQ€#›¼!b,7^îÏ‚ïå$#«Ë¤ø­‡,Ù·D˜ aJ‘¯Ñ*@ÍA"’ZÎÍìö|Û¹Š¤~w9y¸Ø_šP˜?Ó——”È5"Òú´'UR7\œm²¢#®Ÿ‹›Í¦³æÏ¬X %ÍÑϱѹ‚NÚo²A­;‰H „"tUJø&&‘F æã‰ •7Ç‚©k‰Hƒ61„£tm©é"¬´Ðßm ‡6y×aë[§T‘±±l…æùá£?ZÃ!ðƪÑgGº7iaUŒÞ^ý—ZìPe(jíx,¶­3§åŸBÛB¥ˆB¢ÿàÜʆ@Ú}<„QŠØå\Xèô¨âî¤`2äºQÆK7IM«Ñ2ûn¨Fè«!­èŽÛ/¾ñYh|L¦…Òª#âzcvêX9Š0ìu©çe «â#‘òœÈ‰Œ ,j˜x=Ë¡7%Ì6àEfù‚ÚGg‹ë*®¶¹Y{º;‘F(©û1mü䊫æÖSgí¾.O˜ óƒ@±ßv°]gÉ:éÁâ#`ѱþþPü¢“¤d]ûìÅ9Ã#_Ãé^CúCHVõ I»Na¥:¢¦ K RÝÝ¢ ar5îhjš`a’Z˜êú=fÝ<­óÝ„œËúà-ŽÚJ×´õqˆ¢ .?çí†VOO}æðÊ9¤“±V?É“”Ò·²#‚fcmÄÍeuÖ¢°4a}WÔèÌWkV°"ºjßî°ñà^Bö+?¾’ƒ¦¹Î“‡²jÀá”[˜a’ÆÄ.“Ún€1µ8‹‘ êhˆ‘_Ã9hÂÆêYpy…þ¡,¿æäߊs r¡Ah.¹·=x æ Ôa0`t䛤\w­l(<€NfìWÑNtF$Ê1Ó·4ª/á_¥ñ¿{œ5ì­°Ï‘†>öUÄ>†zoÑGv ñòLJª¢"0Þ¦Áãæ¿·u’"´¶›&L_ç¸ÌK˜·¶ÝcÌÈD':¶Þëʽ| bDÒv+ÞÚfÛʽ?‘MÃ{I •ÆbØöþÖ™Ñð8 Š|U'µ{‹òK¶áZ}DFÕž«Ù=í›öäÝ²ÎØý‘s?ûæO·×{<ÛB+âP>i *0üÖp=ß%’ž³5qEB"Žn ¢€g¤/ÛF³ïqû`;þr¶+~³9ØÄÝÞ”‡”!¬ëÀ÷+~ÐàXσ2¡çy`PFèñS<‘a}ýjÐAÉLm{ÃttÀ.Ä}ˆÙÙHøœªÎ©×d_ ‡ôCamõ@=¡=Ëêµ÷_o[ÿ'ä&0Ýd›ÀLp¹ÅPú'#8Øi󘉋ícþ…]¡ë´ì¾ÂÄÚ»ß#h¤ µاsè0Ùº/31+ÁEWÛÊ%Öás íÀˆ‹áð•·Úã'UfxO§HŽÝU¹t¥7YQíÎõkÔ•µÔÏ~ï;[I_Ž:mÀ}€²1(6¦é@zn…- ‹¼%2JþîlZ\½ï÷¸®I{¼±aª&Ùòªó1œ:°p üµV'—ûš4½K±ƒüðí6x endstream endobj 2277 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1233 /Filter /FlateDecode >> stream xÚÕXÁn7 ½ïWè ´)R`äоÒÚ9é¢(Ø…íéß÷QvÚ¬f6¬¶{Ùåhž(Rï‘£¢Ê!¢ZBÉþ/ÁÈÿ5dbÚBÖâ#-PS–7°°O2¥ú,+A2ï`Hé ÒÄ”ût Z«;´P³Áh)˜xB+}„C3Ÿ…ur"Ÿ'9i…o‘sê° «4· –u«yàîÍܪˆ…\»’úü ›[ð'ž'øSJ;Xð§ÚqðRá€8'X¥{ɰ+Æà¹eu —)÷1žÄçúÔú\$œÙçzÆpƒ5²oƒ™.—êÀ¥ô1€‹SÁ§â—L¸!Ú-xÖžQFàZ|]‚çZ=OßúNOó…˜áª‰ûó0Zó¹\'îs+¬ê8B<Ý‹ö ƒÕ`¹<¸$X=*\r!p_XÚqXú ÄnÜ \ûHkç³åîžM<€­uC_ì{€¥sÎ"§ö1 …:Rau>Ä`u>¤A’Ôq.Î>4–Ò|w±u¥«‘nQ߇­ž‡ÂsÍîOṺ|Y¬ê 4ßvP)É9aä" Þ!È1)¹þ{Hj°zH(0Á.cÔ–”.>‹”.>T‚Üß~ºûp¸ìS}ì‡Ã¯¿¿ÿîösxë …~k£wXèýføãñv´£í¨PÊÊžƒ´¶((Œ)¤Ÿâu¦s£9°äÑÀç@´ˆh\æ@4¨˜eCŒ®”‚j˜+å+ÉäXÇzúZG‚:[)-/•bm›R8¥…RZÚ ”tZ)P¬EC»šO*ežVÊă,¢ÓMq§…ÒÆ–Rb"º¡ õ/„âˆs…⇙©PF£±×9Pj†GâˆçcLfs œ±ªÎ¤9ZÛà*‰RåbWŸ!€¼EyEmm,ÍðLÙÄ‘1ÖµN1ÑNbNÓØ™ò ]ç7v?ÜÏé@jIò(Yâ¼1mÀQªKúÿÏdµ%YTŸA–m!ËÍ•j…,ú[Ј·‡è¯xS á)l—Ó ¹.Ùz å<¶ð‚9gkfk I´Õš€§Ù€ÆV‘%[…7²%yÁÖ—W¸o²5€N³5O³5O³5)ãàÚ.‡.)Kº„ΧëKàߤkùsˈçÀÓ­pž¦k^Xq)-ÙÒt>[š7°5€üPè_—¦@gkõ?ถ¨yƒC"¼=^Α°¦²ìdµ-d-¿ ©ò( ¡®}EÑ[õß`áü_éiõ=­NzÚú—ÉR>?[IDŸ‘Hý±•¾e[û–é"ÛÒ·Pa‰þ¥| Äã;®~£p„F˜í«ÃÃ_z3³ endstream endobj 2390 0 obj << /Length 1663 /Filter /FlateDecode >> stream xÚíYÛŽÛ6}߯У\Ĭx§òØ¢ ¤EšÝ¾4Y,[ö %W’“úï;ä²äÕÆnã4ER$€¥Ñp.œá9$—F ü£QšDšs’ -6W‰“6ë^?¿¢^oŠóæ7Wß?“2¢ I“”F7«¡©›eô&þñ>Ûvy3›sÎcùt6BƯšzÝd›MQ­ñÃÏY5c&Þeålθ 4fLÌno^\ýtÓ{—Œ¦Õ|§†89I P§2‚P.0Îö¾€ÿÁå½-Ê4¡©tÊ‚IkíÍm-áã‹(!Ò°èƒSÝD @ <•ÑõÕ¯S>)gD 1vœ7MÝLøU’˜D\Ư¦„I~”pÞY¯Çõã #šêhΑ©/â›g3Ãã]µèŠºšÑøÖT¥$•’Ù‘sn`Â5âÆ¼¯‹å *!ýÔÞ¹Dïz·*º¥\Cˆiü6‘‰÷‘Õa‚¥k,™k ï¼Q6ŒH@Úšõû¬Z–ù”U𭾟 ÅE]µ}ñÂöæ}Ö|Ä•2ઠRm»f*ϱ+H“N4g©&R‰hU¤’N$0.#”©`Õ-2:Úeà‡ºø³Öÿ–e «ÍÄ‹¬Ë—({7c:Þª;(0„CDÉp¹ÜUÑÙZ ¦¡7e_2«°N9äšBúá ŽMB_¦°¹êDÇ¿ç ä"”ŒkV0#¡\í´«³ÅlNcFöKÖ4™-ìB½í[—AN–¬ צÓ^æí¢)¶v@ƒˆÔÄáË/¿½|é}×6`·tlˆX<ŒsQ桺û‹â­[ÙÀ: yˆÂM¤:ššëܶ%M½!–Àhˆºt5q0 ŠjU7›Ì›…oh?B´(Ûº.ÈÅÛ„Š`%­”Ä7ÁS?4Še‹z[„QÎaÝÇ=h_®8¬[xöò¦²Ðo%àb·èvMn×!Sq[£|o Yïðe‘Uø°ÌGmŒÂÞÓ!]o³¶uaZ…:(b"^pŽqg+ä/ kë¿,an¤R07ΆØpoAº©Û®Ü{Úê§@?˜ìZ—¼ñ»]ç•Vø»·ºn´Mþ½”¼¬·(Ȫ©‰Ïÿìòªí[«^aû]ßÚ°QÒØ==AqÑ¡Ú&,+|3 ŽðÂ[íJßÌ5þ‚ ?úî†Î6‡>ûØêŠzâ‡m²¾ä Æìµ%Æ-*øèYK»ap ²¶¶§g‘õEüz²ùÝBÏ8€×êKp¶õ<ѶT$1æÚæ¶Ù¿GÛ}d–º2W¦€³%áf¼ô!“ÓÍNïxJ lw¾ÙMÀ¨ǹ&Fåê „Þ­‡: ){kn*ì&l‘Ž-LÈšõn“£B‹Ô<÷`ØjHÐv?à°8b@Ї]…}4höŒ…Û ÷›á' Î`z Æ‘Xµ0Ö¹ÍJ xÉ*Nq›o'ä?o, ¦‚wd*x8µ~@Ö*0H‘©¬Ò ?˜ „Ž©L`*øŠü­GÜbÇM F¯Þ´c$cÏH i"§‡ü$?ñGø)ìÃ>‰œôyäÄ #R_„›¬)¦Ó³¸én=5ÜÖ»n»ë:ËN{[\ç§9*ýçT4AQ>Šý6ŸÄ[€ ”êÏ@S“§Ë‰#Ÿ9}äc)aðü¢ý1¼{œ|žwG'¢Å®ir¿WueõZ.Ðíp'º 붬×ë~Ùnò¶ÍÖy˜FÃ;:L½Îaiø8¼¼ŸI¦r—?Ì‹®{ÊŽ AÚgd ¢²"ãºÍžŸ FÛ-í†GúßvßBnFÝû*|ðƒ…\kÊŠsêõËë>kªá\XdÎÇ'S‚Hš^Á¬-ÆÌYv¿ÂF~ýÔ‘×L_È)ì S“Žž‰›LkK?7¿;ž,Q„Á‹9s´Ã÷»)» –ïí>š$4Q§wß àý†·ßc,›êMJ$;Êø€Øbl 03±_>ö ÅÝ9©é/†@ê÷üýVn¤nî«%šÍóóÌë*S¢¨¹`Z[> stream xÚåXÝsÛ¸÷_¡7Sˆ&ðëÞ✜KžÌïzíQ¾ÒLä|agvJ?CÙÎ8U¾Šì´ëþ:•¿÷²D˜ø"‹³ #”öåk0Éañã$ð£4œìëf "…Q9¹=¹Ó)dèÇJ*ÞO¥ðtS¡êã`B$|Æ“¡TH¾\LSéíªE[ÔÕTx_yg<ÂÏ¢(Ä3™‚÷ Xãö<ÖE>…°Dìç?ö½Æ8jAä§I¿ï· X|6dS~æ0Ó-…Î%ò/,4^„‰ìØ×ºÊK3&U&~ æ{Cue[*o5²ÖÍTÅ)¨ê-[ÖÍF·¯Q5&Êã¸ãð}4\©ŸÊA°Ä˜®Y˜ ?NÒÉ jAD#Q8Lzè‹°WìNŒêÊÓ…·º hË¿eYÃÑI½…nMN´ûi˜xOÏÕ10[¥¾ŒU§ƒk¢¨Š>ðãÀ° <ê½õÇ]: ®fP~b$ Ǿitäë¶)*4½]’~pì©s™¥¹PØxW>íƒK ›ÕncˆÁ:7à¸!d6Ys儤M÷H‚ÃÓCW[Óo½k·;6«ËJn~ „ªº„€º °'\[]²ënÒ³RÃÅâÿ ^UKkëʯ›Õ˜ú£Ë ïüøùv~q{ûù“ÿùæ}Çƾ ˜9ý{ð·æúú|û­|ûîêzþû§LÌùvÿxqQ‡e;ZvÎñù§Ÿ•ãvE¤Q|a>Ùå,áú‚ü¸¨%"ô‰^¸IÊ@’!‚Ö[†!Z1Õ¢yÚR?ƒ T#(版Bj ¥¨è—Ú\¢[Êõóx!Ié2H].rS⸱Å}‰M-ÆK®Am úž Íc¡ K2_R“õüKß ðæ1 Z«+æ-luÊ7ïR³ Ý÷3²{ò®ŠÇig—ò6æ@¾óߘ>bM÷±Äï v¼IAàݹfø¤É–~¹¡s#ÞÁW7Œð~C C°eImÔQïÜUèäRÏHôíZ[ãöá#¶Þ•`a0>25u M/4wßMÖÎöŸ†.oÎG¾Ù(éãÓ=É|%ÓãO6*é¿ØHþD0øbsx„Jü(MQRHþÈñöbNʱԬáäÜ\ Ãï\ì)ý]‹õ¡{ª?w®\{|åÝCo?ÉC½&:÷o Ÿz endstream endobj 2405 0 obj << /Length 1892 /Filter /FlateDecode >> stream xÚ¥XYä¶~ß_ÑoQ/¦µ¢$êȼ9ñ:Ž‘ HæÍ66l‰=MŒŽ)yÜ üß]Å"5R/Ç;±Àv‘,Õñ±.Û%ðíêdWfY\çÕ®éß%vW?îˆøç7ï˜ã;ãaÅùÕû9ß±$®“šíNkQíîûèOgq™¤Þ²,‹ø÷‡<çÑ?ôø¨Eß«á‘þ&†}ZE³èö‡4ˋҴØÿøð×w_?,Úyš¾ÑLäüÌÎìÌã,/RggQå1Ër²“ǬÞx‘FßI}«ÒHêÑQòèÏbGaö,’´ñq_gÑ<4“ƒvÞÂ8±:f©Cá_geøÎy¤ ýº¥‘¡Å$ÝæÐ"‘GÀÄ¢ PaQ+ºqpç:j¡¯´8é±' ÅŸÑ?$<1RÞ‚—UEÌÊtWFÆÎÓ1/Sˆ,Ö’V°’KÑö+ÑZ€6'§*r ¿‰c'Ú$ HÉ7øíÔðDÔ¨‰yöÚÈj –صü>¼U8±¢ëbëM²õã/#ZóŒÿIÌ–Ÿ,¥ï¨¢,¦fYãêJ'?$,Ç4CZMÄfæŽöÐxüm »à«£ÂäC&k²åpŠábiƒìVÒ¡Pfê<kË8õQûq_e…¬®•ZbåCŠÄꮥ¥üYô—NZaàïl¨r¢(k®Ä éa˜&Œƒü“ôºmÜ%Ñ¿]Ù*6é &ósÂmtóÁ Ü¸ 9H…º®=óH>Ö²ÅF`Vó8/òíÕ´½ðwнŒ•¼ï0Ÿhká šËRK¯Í}j›°±¡<çkcm,ðꯋ‚ñD»’N1d‹‹,Êrëã€ÛÞ°¿(N†¨m¨ÀFвˆó¬Xܘ4ÔÂô¯"[|ð:œèFhÌ$W…êø=Ø8# m¦» žE×Pø“•GŸ.Z º@€,ª8•ÿàŽº£2 ˜˜­‡‚E®¬gespdçÑ}QoËnªkã<Ñz1É w<õÞÕ;K·ÔXè*jªSY™@ôQãʉ¿tEÛR»W+ÒÍÐÇrj¬—P‹ÇPU¢|LVµ ˜¹·†$©g ¥Í¦%l*w¨¥qæ F;'ì4:6ø‚¼jœIå 0´Ò±”Äòx£suNFv§mq%/¾ bqFO€y³òkuII?ê?³ì®.yñ´•†þ¤0èhz¢p€Ã£/É¥/b@¼Ô\ûÀiÓ²\Ý:m¢w_‘ó°¥­``Qºü$~ZÅ•Ëæb“„0JòPÜàõ?ªû,†Ùm«R Nˆ2-HmïC¦ÍÀ˜¥ŸóÓOÃxÐ3©^zˆglÙG Á!ƒ2×Ü0 jR¢›§{À‹ñ$úðžN‘“(Ûó;Ãé+Zh wìOlT"!èçá›"Þø?Ìq"Á$–ün“n4‡EË×µ)HYyã§S‹½|^T.^Óõvÿµ1¢»·cÎo™²¨}AÀ}ûVu(@Ï£nåÏ…ÁòÚí?Ÿ!c·:ý§ŽAuN)‰z#ê¢iÆy˜^Ô%›z÷eX{¼Qåß/á̸^d+¼¿•ê¡ÍûP#DñøØŒ¶-¥©{ÎIh<­[[•³vÇXFSPdBìÌy­Ÿo;ó“¼'x÷ÖË” ¼NꯩMŸUÅ£uÅu£¯— Ÿè—³jhë ¹¼º ÷&u -d‹êW²¶çg ÷‡¯:¿i½°ñYëÅæ Ï×ϸ¼¤—~‰ô@ è§Á=ìê<¢©nÑÓ®ŽÑrWC+áLÖu?”Ø— €wØUci‘øÉ¥Ù§¼Fð*5tÒË~´@Û:‚Ä"‚°‰ñ-›¸h¹•¶îø2ø¹q†!f4´èUÌB]Ô¥Ÿrªrj:ÛÛàí1§ªÂMT°·€ôË; ÛIC¾HÀ+¬³èh§5Ð`Ypf‡øÕç9´X.‘ÁZ=±s%ÆÇþ§“–28”f1Œó>ôàÓ!®–¹ui^—YÇI±<ŒÔ`&)Z¼¸,‰þ>Ú›©pÁW+Rr™ pµ*(¸\pÄÅ:ÄÜ1ÞÐÜM b®¸Á¨ ·¼ÅÂô—†þÚPãJÈ-ƯÏ3o›S6L«m° /Ãà3j5]ƒ\ÍY¸þûÌ ©3ê¿K«–N_d` ò¬E!Óg²>5é”âŸñú/‹\1¿ÁLß|ï îwô7¼õíòÞÿñìW,‚Ëÿ endstream endobj 2409 0 obj << /Length 1957 /Filter /FlateDecode >> stream xÚíYK“ÛF¾Ï¯Ð!*5j³ßdnÙ$ÎN’Íc¬œ—‹#R#VQ¢–¤<™ýõÝ)QöØ5®ÊÖnéÀî& Ñ€"ŸÅðã³4žY)Yª’Ùj{»Õæ~FƒÛﯸ—[€àb ùåÕ‹—ZÏxÌÒ8å³åz¨j™Ï^Gßl²}W4ó…”2Ò_ÍJéèצ¾o²í¶ÜÝÓe»¹H¢CVÍB*Î#!ìüÍò‡«ï–½u-ÄÝDÉøÉcwÕÌ$Šq©ÈÙW›²ÍÀ#.¢²Å«Œ:ôëq_®²ªzô·veWfUùŸ"'™;'C7Q·¾ƒI32™fR .:c-{‹Ê¼ðÈ?m™°"È^£re»œ¬äʼn"ú#ÖñæØy·7-gû}Î/ÐÆl!4ìšC„¸d\“ÝC&ÚÕxÕQUïîÝ‘áZAtÔÕ´rh ¸h9ÏÒó0™(8£#Ø¡[i7î»–¦yÓ‡xÎIi)ú}”š³D‹q ózW<1itwè( *NÊ„“Цh ÂeFåã +«z»¯ŠÎÏ0èyèÏ#óñ„‡Jj@ÿ:[ùÖ‡Ý ZF¾ZðU²œE_cK¬ê¯ßijnB|™NÄìÁ‰ngŠ)ŽH­f¯®~£Ú?6Ì…eZ‚* æ%™½T>¤2 Ú¥šùôTsÉpL±A¹'Gš2óó<ÓéPJ1¡ÄIc°¿œJJ‰€2A:¿ÛLÙå ƒP|('¹äLCGpþ¶€R ÍRb•uE€>e¦ôꆈ=< àaz&"ZiZ%‰-&Ý¡íh¶«;¹s¦¼ t£œ–KŸÆD%i»HKà ¹x ^_›)12,Xè¡–ÖŽKHfÉGÁXÎÓ3ÀUqë·s‰N<ŒË]7DñÑÜ Š%“ÐUŸ€b9…âI+Ü9ŒE:ãôÇ13‰C¡WyÂƓޮc°*Ú; Ö}‡÷,¡¦ ô8ÇI@´CPM‚ayn±j H›œ#ñæFmà'Ò*Ž2º„pÁp`-”s…Éq‰ŠZíòxÈ ð”.%¾Š‡±÷Ú3MN>€ƒ~DL ícÛ[¯j`y\Ýš@`WªÂS®™Ǻ©·l×䈆y±ÎUGWtl´Â½à#V k_P@hŸu›Öë©{}Ú‚¿8>ó½¿n $bXL<€ŠU™;ºŒÔ±ó§ „±ìϿܘã`,­ó²yᎀá üOrYob…%Q1€•Yë¨ç´Ö÷Y’­—©×ä’Wܺ²¥#É0Žd´×$^ü¹*ö/uC‹¯þyóêëóâ¦TÊ´°3 I'§µMÙ¾´I×ÂG¥íoZ2m¤Ó$•ïÍÏ7Ë £1Ïa舌OŒ~w{‹)þË-áTp dFH}Ø÷¡ DÇàûa^úFˆÓŒ.û¦¾«\>˜ñAÑK°ñ}gÔ’; ,Ãd:^EC@M^†ÎåæÛb Ÿ”Qîð!]û—oÿn£<À[6¨Ÿ™œN”&Q÷‚ioùq²(¥ Ù7™¼—äL{X­ GãÛ5‚»šnÚ<™HÔ…w®é¾-RÁDjž£o£ª8˜ ôΆ6ÝïY¬j­ŸÍ>”ÝfÂl¢™5éó˜Å×8™¥š<õ )ha߃§¼Å;˜>a²ßèOfÞÃYÆ*Çœå:üϰkCqµ%kÞCñMâ‹åyY_¼ÍÉ‘ö†r;rtNã†\I†mVqæ«bÇÂâ]} ¡Úe[o,ôÆžº¸þí¨à.°k/ì_‡wsþöÔû??o íõŠ84:§@Ä.·\ôD0 ƒž‹=„> x¿[O…P<ýà‡Cè3@ìù˜ô<Ñù„@ü‚o>>´}™À‹N2ÀyÐß#òˆãÒ¿aNðE9ä‹ê„/r«˜}¾ˆšôÓøâ3õ|qdô½|ñ¿….òÿóEWΡÔÊ“?M\lEj5'g)‹!åqŒ‡×“ï$¸D%GÙ¡«· `p3|ZrFÞóEDZÛOý²«ñ‘˜`K,ÿÿƶ~À‰êØnhÙ•K¸nûxîÈd×ÖK9ÔÀ ´?¸^)í1l(Ðÿ%‡n&6|™±ÐZsü03äчjÂ_ïSA» endstream endobj 2417 0 obj << /Length 2200 /Filter /FlateDecode >> stream xÚåZmÛ¸þž_aô“Ĭø&R÷- ’ö®w—mÖw@±·Xhmy-D–\I¾óë;ádÉ+g7©s@s°¢HjÞùpf> áŸÄáÄHÉbe'‹Í³ÐÍVw¼ûû3î÷Í`㬷óoóg}£õ„‡,c>™¯ú¤æËÉUðjl›´šÎ¤”þn:SJUyW%›MVÜÑÂOI16Ø%ùt&¤â<ÂN¯ç?<{=ï¸k!ž(&î| §9% AP/gdãR‘œõ:«“–ã:R\Zîö*¡‘ØÕu8YÂâ“i+&÷nëf¸…Q>¹|ö¯1–\¦åíbu7ÂTE,6çá©Ðò\Þ"ËcÇIÁÌ€ù™Ðí¼z3µ2Ø‹&+‹)®ý‡Ñ„sk-ðÙ´Š雬h¦àM½oZ†QØgÈCͬé¾û-Ô¡'÷·)&@¿éÒyÉ…ÌsOSôe‘†E²#¹¼]Qä–Y·›^¹EYÔ U°ÀP\'Õ'øD– #[¿'ù.SQr&­èiÈÇ䓦Ôd~ãšË®dç–·ÝqR«¨ Ïn«¤Ú“èë¤Xæ©×¯J“&]Ò®[Ôppf~2,ÃÞ©@ÏôdÈ£B†#¿«Ba@?Íb°#Ùlª£à`·!U¡ÁÑ‘–uSy¼PÁ}Ö¬I¯eÒ$·Iíµ\¦¿…\Æ«¸­óË´ÙmªV˜:(aB˜ -è5¡å"½§AˇMg6´Á|Ò|½ä2A“| ÷rEÏfŽÙWDp•‰œ£Ó(™Ž»Û&€–©ƒQ¤Õc¤#ÍLÜÛ_ƨÂÑñžÿûâõÙHF1÷HË?¾}õOÿüû·?_uÃ(¸À÷—ï^þôzþúÝõõhü(ÀˆåǤ0ýãÇEp¿N+ôahœ\4=ݳ,üA㺉z·E·Ù ¬(¸a®ðÖ¸P§MiMꂘ1|xà0ÊSvÇ^Œº qE?]+ŒÂ|4€e,ã§{ÉV_þãûË—7oÿ9 Ó1ììNe¶zˆ€©¨NRÓ NÝÞ ^ý~Ü¢ätƯL½[,Òº^íò¼oŒa2ã1$"Qäò ­õ“’.-0±PçHºTdå éz€¹vá5|þ h,7°€Ò~ÙáÊhúòhûxú#³Öü¹òŸ¾ÕŽÂp(”OJ~êC@ 'â>òôÜ_•^Qw»*=¢äLÞë³»Ë~GÃ¥E‡<è}eøs:ˆ{ˆ"Š˜˜(³èa¹¤LÒ‡m,ŽòN¸„Œ)¸¤¨Ž7¦jçæ -¤y¶<€–hFO@w?OÕ©Àö)UçYxRÕ9๪ÊÍS@Î(çájcÇtÈv‰ 5qÌã¯Rñ¢²7«,­ 9ÜÆ–‹oúO\mC>§q?Â}âÏ…û'r®Øó¼zºT~$½ËÌA%ÐhÙùÎÃxÒ‚’‚ƒq g 24ÖÖ;Hü‹/€]ÝõéFJ/çÿ[ RË~‹ö‚$4ÏÏ—ÁÊÏ‹9€C1Ëb=àgáI>à¹LWÉ.oFøÆ–…ü<ÊŠP‚‘‡Œë}ݤ›O9ÜÚ„ãæËqÜ#!"ù¡ Žž?hf’nHªS/"`û¤æ¦ü,Œ`ü—ao¬ ÖßöšÇ±·?>[Û¥ãAeô<^8Ïû+ó4 "p{ÆF¾Äåp|bBD‡©•),ºšs]Dx6í&onÜ•QC$­Vɯ®Ê’ólÜç°Œ©’Eã)—tá°ôª¬6I[¨IÖ†É-5 ]§(ƒ¬f*ÔžYÌщ­0*zòÐ$£¾O÷õI£Å!ã‡f–ÓÝ¥^êÂÌ¢Úoü­m»Î´öÞ•pûš6¬°7ø¤³Ÿï‹!"ëÐzûz—`·Çµn±›ƒ ³=¥ 8E&„ÑÚGkM¯‰:‰9îQ,L:iÚõwq[žÓú{NXxÛã[¹£êkÂæî<¤5 ͹硩 ¯Q«;­Q-[Õ­wá_éÉ þ%·?bú RP;óvÇ>ÉïÊ Šå ½vŒ#€áŒˆ6š\„Ÿ•Up ˆ¥,äÚ0k<$A˜J"§féØ=u•ŠÏÂ^„œ‰ØùÃu‘oêñ+`LjÿýŽ?ªÕÒÂk{Óç}t£B™)þG\åO)×0ž5ÚóQò:쓘5~Р;æPgGœ¯¤`²}ÅHb dþèòÓS ÓGLb!ÕÓPƒ¬ae° …ñe¨ÑøÓ¨»`*ÁôÃe^Yœ«ª„ôu¯Ú:|¥G¿ú˜Vå Xm²¢ÔÁ/ó73ë“ 'å ¿da—®XBªÓt½RÄ…ÄÕÂÞ!åª+¢ó kãü¿Y‘‚] endstream endobj 2426 0 obj << /Length 2304 /Filter /FlateDecode >> stream xÚåZ[sÛ¸~÷¯Ð#•‰Pâö-ÝIÚ´ÇݧlÆCK”Å©Dº¤”¬÷×ï98àU”×n»Z÷ºZÍ>G?lÒ»}VÍRÊHÿq¾PJGUy[¥»]^ÜÒ‡´˜ Òí|!¤â<"™¹úëÙÛ«Vºâ‘0qç1Τ“sÇÜÌ8ŸTµ¨²t»«QìX+i™ÆÓý>¯„Š.æÂFeî·îKú-pñ°ÃµPÉE͆¼XåËtßjNzmTQ¹¦ év[úx+[ÑœJÃz_ÁY5CÔ³á\pÃLœÚ·?ï«t¹ÇÝ:Jég›×~Â)¥Ð =ZGEºËjÚZú©›t‰Hÿ‰ÿdÅê5­¦5­þ’UåL~m°šèWïŽÖ[¬ ¥ãèj“yÐR\2® î4¶Úy#T­²)‚½7Ù±À{¶ï½xh‘OÙþPôÚ×¹FåÙœƒ_'ÔsÈT1Tk7ùéí›?5ò5Yƒ¢&ê;JµeþSÌÄ¢Oá°êð—i+JÃ,ÐÒ¢ —ý É4¦†Õ'Ã{Â8M ~&=*}ìyx!|)2çô¨wOˆÇÆIò<¢x>²ÑÅj²Y cEÃù³ñÁVÛëuÞH1Am@¢{ ”Ob‚æ¿– ö$QZ@ͬA^ŒXᤚàî®ik Œ¬œA¸œÎa8³1–°sßE f89e F@O[V+øZm=x·™ŒÁt×N³B! ß}Êý»#…Ž:,ÿ79!–͠ʀ6=~–ÕØyQmKhý ýz<)‡ìPy óÖý&"z¨¢ÛlßàY—Õ.õ%,\9L ò†§ÃD0è=dêÝæ«'«–Ȫ„F ´Zö5/õöžžGDŠCóòû{Êà6àT‡%pžlx–ñmØRö4ø–ƒ›ü¶¾Æ¾¾¼ƒò’’çüë3²–+Nß½MXt|Ömþ•8*=^|zþÃû ì%o~œJ ÁÕ†%ñŠÉ&Õ/ë“Lú—ób’p #á4§ §Á’§Æ„s3¤¦-OF¯NűƒmÎ#’„$PÇõaûzJ‚Òë¡„ó×'­ãàËĵý  ñŒ ᳋”IW"ðNBúN8ülîq1£ƒAàbx-Ѐ®x¶xƒ÷[Ï3)¶,¶ª…„A´4Æ)”¢%fLƒðe­ hÍÚ…´9Â\Úd0òàôûBË*åoÝ4B,Z jO ”™ B‰GAÍy4¡|ÑPd€æK¨^áŠóåYåᮓ=bÊFñÿk^iÆþâ¼²§ì)Š Á$”ÊÏ!˜¾b&àB'ýQ2ùQLà†‹»xTÈ1Ýïáâqðǯg—ö…Ù¥}4»|ÒUèdÇ;ÒNÜpo£Q½/«¬Ù®cÒ}z“Öë±ÈÑÍç‡Ð$ó5[• ÏÇ îŠÆkì­8ðÑy‚ˆ-AT§¢‚´åîÉqa—H±QÎ~“îÌæ·¦ßC}JtH›ê oüׄ[R¸¹qZHe¢|•aî*KƄ߲À³pTû@QÍÍ ü}ØvUÓS^Lç°‚Þeǵi'š ÙöÒ ¼÷"zÒ4ço¸Dÿ‡Â~ˆø@÷uØLñBØ™ï1—xK´îð§,ÝÅ93´n¬°ø c‰§áµ7^wßN)ªµçýZ5º2z¨tqáúaºã(9Q>q_˜Yª*kÔÆ•^˜¾F9î-hm×Åt@\š…ÿªè¸bY GcÝx›} ‹Øø‹ôjsüƒ­q§ô&Ró æPµ­k#ÑïÙU¶,w»¬Xù~kÊiX¸ÍЬJ· Ö:„:T§xêû  ­Ê~m '"îùÉÍIi\}«rÌ1œ¦èº§‡Ö”h¢†¸ƒÕaXáð]º ¯zÿ|QÑT—,øtC$Ù£Ι÷› Mßßc­ôkáÀ‡ u[7çê¸k¡ÈM~uæ endstream endobj 2434 0 obj << /Length 2609 /Filter /FlateDecode >> stream xÚåZm“Û¶þî_¡TÆB‰7‚ȇÎ8NÒº±×ç~r<žD8¦¨ Iù|ýõÝ@àA÷R_Ò6›9‘ÄËîÏ.ž]’.Rø£ .çD‹|±Þ?IÍÓöba/Þþå uýVÐqåõüîÝ“?ý(傦D§š.Þmý©Þmï“ç»â²/ÛåŠsžÈo—+!dò¦=\´Å~_5¶áUÑ,Yž‹z¹b\Pš0ž.?¼ûÛ“ÞÒ%c÷T{Þ¡'¥9ÉY.åªzèwFQª“ËöŠäɺ캲û%•ž³4)šíÀ¦gWU]Û«uqìJÛ^ Ï>/ewDz³÷ýÁv87ó—nжêû²qC/ŠªyŠ ,¹ÚUë%SÉÎ6í \¥k;è¢lʶèK\&0{E9¡ÒZ²?´¥]ØŽþŒ£ÊvW‚½a-”¿8X‹fF¿-ûc ʈŒOê단ɩ‚ñÞ¸Î<û닳gÃþ:n Ë4É”XdR­nÎûéb`jqezîœ0Åáª^œ=ù{l¡™(jfR™Sý矬ôjk»ã·p{¬Ÿ:ý3Š\‘<ÍýÊ_ÿüñíÏ^¾ŠÙ›Ã*q6ô„lœÔfS­aG6fK`“” ÝjµeQïao¤H6cpÛz{Q~©º>ª/M®ú†ÂoÞ¾xýüÅ›g/cJÓ4#ZR_k”b´Æ‹Iks{ÙVͺºDO•T·)¹X1JIªœÇjÝÛvx´¶foJ‡EÚr3€¶Ð~¹bŒ¤*³su»ª+nB‰bŸ*€T6‡’ÌÙˆ%AÍC,…R)l•äf*ž;¦…¸)€jý8¢5 ”²‹Í&¶•,çD`lc”¨ayÞÿ¸ÌyrlÖ}uh–4ù0!‡ÂÆKf–•ÃP=ºjÕÀ6J&íÚ~Mý8 ÎÒCBƒ§È‡à—:)Úï&c§3³mfË¿qs2_%kÇG6ç»ØŒ¥Ùø§‚š®·¸ZchÛí-r²ÜEÏÿ"’8…åg÷d!Ÿ¥„ƒœÀ·£â5AiSs dFDžŸÖà,î,ËÀ@µŠ‘Ló†T†T°Šr3•ù\çÓk,‘j ¤—ñ­dDJþ`ó¸Î DÒÇ0O¤ 6mfÞ's8^[¢ÆADRÓ¾|‚¾1 €jØAd @%tv$LЗ³i>"Ç0'19•Hêê¼-Úk»Ž;`&µ;ó×€qÎáæ Àuô0 ™zQÛÓ]†«ç#™DÍc ´b¹ãô¦Ë…á,ƒU3 _p<Òdà/[û;›®¥ksl:RUš‹Î>©šŠZÑï™;gh=tå¾®2G]Q‘Z=á×WH8¶Ç5Æs¼`…ƒæÆvÙ —ûõ?^¾<µ„tTˈƒy‡#Ý)±+úá**K+¤ŽEÈ@ï^Çz`:àP ” `=1Ü “Oí¶U°ƒŽX†›†‹ýŠ.¾ ffìF„ =FúE®™ ŽN6d£7Ï–5…ãn\Öb`Ó–ý€ÖÀó7q`Ñ<…CÏW—ù&9ø¿A=T&ó& #Â]$]ß×ý³uþpUõ»øÛC»/ 'ðæÀAcrP¹¦MÑç°ð',²j A3f°M-bÕ'l,] s6 *!MÝ‚¡¾Mbœá†M"´ ”·ZF<Û¸yQÙ ãNsëòMke¥.Ì8ŽDl$á!ê„€€3"êd†gMƳyUaì‚ÐÂãIjI›¼%iKý³zLÚpàɤMÜN ’f_•³K¥€™ sdrJÚÌšÿ’Rî@:æmµÃDP>¸K.„K.ø’ ª¬|›_È{å‚Â>F~! „ªû§"Ù¥¾è¶Ü–œN8OŸ[ õ$¨Ãç2ʤ#™ ÷É5øƒrì!×°Ù…Ò„jdÔ¾ôDá’Ê5ÂE6¹†º“®R¸‘ýÝøª@¾šÿÞ|uÆÌWÝapƒ«ºÒЀ¨J2ê”d¹2J²<óÂÛþ`›MhÕìÈd:›8+ö8·õ èAÜS=ðΚÂñåqVÔ`â¬(ÅrV£Ù Î*ˆfünÎ ñkr‰ªïÊzë8+5Ag¼#µþ {º÷J©®¢¯-=VmÙ û]ôC–RÞDÃaÀ¸]B[Û_öfyÇd,æzùÓÛ`OÜÑW×'ˆŠáB›30œ³—ípj¨¹'›Á,Ö‹s_Åf¸Ôxs6GÎiB#ç„&¢¶ ~±ÕS 1'ÒÐS%SV“­ÇUNˆKDÔi"Ç2ËŃ ,‡JèÇ "8•œ* H®»ˆd8&ËGrFM­4 ŒO4›¸ãBÓâÑKðu·U/s2AÔôBàÿŒzÜWÒŠqpUXô tþ&¥M©€Sf$'y–}Uià‡á§Ê8ý÷j;SÄ<& `ãÌ;UÏÊD¡G°‰Ã!ô­6}Ǥö‰Ì'çûQ«ä̪®úgyÓ(dK=ŽQÀ©ˆšÕßGLí³ÑwšÉšÐ·CàŸ.Ð*A¸©ßLÔûW ýƒÞ¨’3….V E Ïo82£¸vNX ÝÎÕµ¢Ñ„³ l¬9VÃò©†U' ·RY¥d>‚.'µ Ý/ŽA›+ŽÁÕ Bgo „þÀ Ýç4±ßZ@£{ñL;Ñ0ÄPªí5žµèõ™3[K³6E‹½1 àù=’9—‡jÛd€åYëuªw'6 \]óhŲ;Yíå3]‹ÂšåTqlÊ«±2U×îc‘É©‹¶-¬_ULî³…xÙó„INÅÀ¤æV›2’«Úd>ÁÙã·­ÿFÜeôݶ%ÚXN‘¦$Kc‡Rh3Ù‚ä0‡H!¸Ïrˆ½ý> stream xÚíZYsÜÆ~ç¯ØGlŠ‹`.`Æ©¢i*–-Ê É<¤d ÜÅraÀ’á¿O÷ôà$xÈZ+劊Ì ¦éãë^²Ylf‚Y$„o¤ž-·-of48ÿûsû°qÑÛùýåÁ_ß(5coÃf—ëþQ—«ÙïxßÖI9_!<õÝ|!¥òÎÊ⦌·Û4¿¡…Ó8Ÿsííâl¾àB2æqÁæ/:8¹l©+Î_É&î|Äg| ?FŸ¡–>’ø¬6i7kbœûfv¯ä ûð1˜­`ñ§Yà+Íg÷vëv˜†Q6»8øÇIÆ#_‰!ÙOsÁ¼äa‚° à¼h?„•òu )Ç«Rߟ`Úg˜Á5øF+ÚûáÍ\ o—/ë´ÈçÌûè¾ gŒùF)Ž_.„†O"`Ä~“æõ.B‘f¯>%W-É0è“dŒû ã>ü5P;ßô·IŸËvÓ…½.k;qgò>3"òC6»W×›©ATÍM³éŽ[yUãPzK´ÉM\>C'Ô>Z®Ê$ζS”óÜØ—PZp0Åon–¹‹¹-Ó|™Þ‚ÛLU¡/µ~šèÅ´ÉsùL‡³PF>øâØòdÔžp²÷ oÈ™lÃQ¡oŒiLd“·Ú„jÎøP’óT⸹›+åÅÙ.ùnŠD 8±ßUSè: 2 ¼»U14Íäk’ÝmGu”]Œõ«0 ß;&_Iø×$àTJðarý#1‰Älnô>0‰ÔlQü>LRd«–ŒÔ —¬Ìg (4DT:{PîÃÌÉ—'÷OÀ.+Ÿ~v À.Œýìúÿ‚]e²-ÐÖîqh$ú} ÝìiLIö‡‚°;È)¹ÈiÃ6®)<¶ Œz3%lCw[ØûZ¥ëÌ[Ó pâ €~øŒø¬è) ”   ‚[Fðé !ß¶ŒâKO¸€ ÀM - «èÝbG{ô&¨%†= Ûó¢NšMqM£8ËÀ:æ –L²•ÓvÜÜÇ®jœÝ½Àñ´þoc—Õ£Û(ò¤¢=Õ­bÉ2µDV4{Zš \ëàSx Òa(0‡Ðy$m\èiÏàÆ•Eä8lON]ìjZ‰éÑ*¼¤9=I@÷9zL4ÌxkP„…žý= ºGåDëE„/¸ò™ù|„w¬½7iYÕÇÃí À9|ÐÌxFÇÆºÞOŠ&È3 Yó†gFÚ]ÆÖîpaã­ûÛwd«v;šW•nÓ aÛ9iÂÑ Ÿ œ¬®Öi¾z.³˜hl+ÖS¬ÁæÎ-B°»h”8ûpÕ—C:E¨.¼4¦‹$¤BìaCAŒ¶ƒ ÷pXrgµtçäàÍÓKÛoè`pšº(écM‘IÓ±lƒ (ZÃá×)èUšeÍpÎC2ì"Ïh.É‹Ý͆vÇUÿ¨ÀKWŽoçï¬ñÊ ï× *™ô·]’Ùàé‡Ú"õ­lÕcý[/ùO¼½Í¬ç‡‘—®iöÁ†ÿNÞ=¾Pk½¦Ë<»Œ4§&®YÖ`0°<´±\¤¦A»V*¾LHœ²(lˆÉ¶ƒ·'µ½·„d0‡\(OÐ+ºÒ'‹ãï§?(ç/¸R%5 žˆ/,3ê׆À°¨hK Å¤}÷ÃÛߦ4Æ[BSB¹¤F’"=áqÉLu¡+2@¶’ûy1tA L Á÷FÕW0Ùe žh¯`z±½bºP÷|{EE¯m¯ôvŽ ê­Ø$~8éÛÊ9<ÿý/W?Ÿük’mef—0ÖD#GåË~J•Ø¡ÙÙËùÎñá]wá E‹ä(&»hk/ÒØ‹œbPm×¥&¶OÿùîòíÙ»dþêôèòøÇIã²NõVÈ­Û‚PQ„I!§9@94èZÝT;QƒŠô°Ýé²L Ì@b ߆LcWÇ6]­G.A.ýd£ ËKc>«ÏÅ!r½—ŸÜ8dc^û“Û^»N×€²-Ž€øåàk7»úÝ·fן§ÙÅŒ{ûhv1@žZéo?À}ëý9;AÿÛßâöÔ"•DN%ÏüwÞéÎâhlà£a2ð׸Çrƒßø:]Â1ŽÏÌgaeGz]ÛI§[v?6â›­z[mý^6HÖ@ÚU}/ö(À™;ç|}‡"›+<¥&´¬1­¶ÃÙé:“Áîó!Œ Ge&ži sx^7E¾te¦%kËL…®¶²ŸmŠÊm~°Æ½sºãÌVà}ÌF3…•½s€¤¢ðhç|ÔˆÕ¤ûíf{Õ$TlTMÊ^5 /£jRQŸ|×6nàÊCÕw6Õz—rhR [¡ý¯ªWØ<{±>Œ¾¤>ýúP¶¡B6?)¯F¹úPtõ¡Ô‡ÝT "¶ø/9T¤n endstream endobj 2449 0 obj << /Length 2509 /Filter /FlateDecode >> stream xÚåYÝoÛFÏ_¡Gª°öö“»ì[ÚK“4M›«}‡4hqe‘DI9pÿúÎì,)’fœñ8°Èáp¾vö7³C±àð'_X¥X¦Ýb½Âµ¾YÐÅïÏŸˆÈ·ÆÕ€ó‡«'ûɘ…à,ã™X\m†¢®ŠÅÛäÇm~l}½\)¥óýr¥µIÞÔÕMï÷åᆼÎKé’S¾[®¤ÒB$RÉ廫ŸŸ<»êµ)¿ÐLä¼o§Ú)„cn‘:Í„Òdêï¾=Õ0HëäviL’ïNþ{´b꤅KeA×à½&2¦CF-˜±¦c¼|ñòòéûß^͉ÔpꎳŠf4§õÚ7Ë•Hš‹9ùư”ë±ü_{ÿêÙ¿fÍ–L»ž»ÜŽC…¿&ù€+à®N»‚è×°$6ñtSþ°BÙ‹•Ì8`òJ(& ÉlË?¸Ð¾¸ÀeÍ’üPÌZ-™”nlõëþrõòÍ/ÏÐö÷¯Ÿ^ýøbÎçÈ”KöUö)›´Ûü@´êàéâìræíï·¾ B»pC×7åmàÖu]™b*5ÑU}õu™_PþV!ÁuBÊUâ뺊9¿†ð‚ÐÂ3rÒ¤pð‚G†+©!"–ä6۲ɻÜÿwŸÔBJÆX¤Ö.³˜ÖoßñE^pfœ\| ¬û…fZ`xw‹Ë'ÿ äkÒ2£‚¨”§¤öÃR Ó}ņƒ<û8Š!a]jÇš7µ÷s‹­`‹ ® :°‘eÄ“·?-JN‡u[Â&É»s‚ –#CT•ƒWú4¹­JXm# Åöý÷þ¬4å£ ƒ¥°`Y|õnxÔ¶+“ZõV,¬öwQ¦š£,KU/²¸ÞÎID<’YÇóêr>·Ì½HyÆ2¡¦K¢m¿"ŠI«Æ+2V«ÀN›I©u]*ô;FÏ{Yk]¿ƒ?PÚÜ åÈ#ˆ¤˜órŸC.Øñæ:ÉLD ':‘¡šèsøu²+¯ë¼¾£à;waíó–ö¼D@»›C&‘BôLØ!]0ÆQ›3¼ŠìlÞ?0ÚBú®D ²Óqˆç|LY–™‰oÐäª U²/§m5Ì’€ÁÒ©¤iëÓj“§g{áóÝŽPi AaãHíÈÊ¿9£Öm” ª'"TâȿЬ‹4‹‘ä‰á*)ÛÆc ܪÍ'aÔfÙW©Q”ò¤(J97ÒfIS°.}Í©éXõ§‘*n¦#’fŠ¤Í§¡TÁµS_¥òÑ¡T}!’ Í Ä蛀Ô1¥ Ei“Í!é¼G#ÿ?ÄÄ™J—Ja:ñ©)ÿô÷]Ò\0Éò>in ¾È±OíœTöP8{1Î% Wåg+‚’)S`Ù°³üÁý· ‚PkG™ÒÌ •œ9¡¾¦"äuS‘ ·Ëv;ëàÂys–m€¶_6¿ó{Oj'¸ßù0ï¶HSÆÍ¤Âô;…¬šúýëižÅSI=k§†B!9ÌF T;3³§ÖÝoAŠ0f €hWB3'ן©¡ÚÊÄçt ‰wgC‰€îh+ÂqïÏÊÂmXÎp3y‹¼Í¯ó&*è Ha¸MN µg|‡3]è­‡ùúcò¨{<êÍïÚ€h*U£=°XiǤÀ-¡s¥'Ïâ!‰‹°3¡íh „²¡ß¦Ü—»78é¸Wöw¦B{8‡tÓ\'%ó,^Þa"V'°Ïe¸2°iÃ!»¢ ËI瘑é8%¡#¤3õL¾9h–”N2›É^iëoX¡îæ<Àu»4i˜óÐmí×> ¢ÄÒ®›jïã:@AT™˜ì‹ØKÅê\n&ýr¯ˆC½ð¨Œu¨«?}]1º°ëõ€`ÃÇ(µ™H]WûãÎwÍy_6ùz~âÀ¿ªIVÚŽ‹Çh’QTª‡–Si@Oýí§þuuhZjV×[„¼únØ½Ž­˜4¯VCëc¿jƒ?×AEHÓ^hý†³p†93^ät`¸’NJhsîæUQŽ+%A£ÒÖL¥8'ô§¦êlF70 /æôs ÊGýŒŒˆ/eÇÔ´y[®¡žÞÅw‡•µèxjª"p )Äåå¡§EQ…oÖuyŒ¾hßx¾°Y;AåØEHABŒ^ÆZ W÷Ÿòóy¶ïÈ Q×÷rb²€vØà.8g“«-Âêê¼Eeë<Ú{b­95™``E|Õ©=žZ¢åÏxƸ㎻ÌoU§üØû¦¡J3˜%ôGvPS?Ò„S¦Ð#¨G9˜£(­m·=7ÕgçÇg}ãmžÁ韋ÿcqÉPHBGš×¨IÝð Í×>oç4¡9f0Ëœ5ÄCÆØ· a‘3•þ_G±ŸÖ¸›Žuì‚6Ý€-¸Ðy¥çQb 3•0+ ¯oNá Mìø£!£Šñ¦îjdìVH3ì±Ð§#Ê„–§Gšó‘°ÿPäu1¨[¼#‡Nåo :)5 Úâ•IeòOϬÁöûT—-Nëî:J}[®g'hOwÐüGxxŠÅ  4|ïÁ_M¶aHY#\€K·ËøÕÌfäƒë{Ržˆ!€4Þ÷Ç`>Ž>ŽÂço^^ÐUÙÆß&²RÑlšòz%uª¢â‹âqYøø{ݶ®N7[­“Àþ<8‚~GpACž.hÔ%­¡;Löç——!ߌgtuÕ‰Ï *‹±6ãBãs¬²øKgU2äòrˆŽÇ:ü'ŠzäN×WŽÌÖùñ¸ƒ–¡ë˵9Mëóøq3 à—V.F+÷ýÊÀˆ ŸA›îµ°mÒÏÇr·;7íÅø¼)CSƒ/UÄW¯ŽòkàlGè´¢ð–N˜i>>)ð¬òµï¶+_ù:¾QWØ9›zRâé¡Ûº ÖJÞœ£É> stream xÚTÁnÛ0 ½ç+|› ÔŽ%ÙNÜ[;¬E7l–ܶGI4Ø–aÉ ú÷£D¹u‹ÄÔ#Eò=I¤Q?UY´â<­òuT·‹Ì£Ã)Bãçý‚†¸“Yäín±¼+Šˆfi•U4Úç©v‡èù|½•CœpÎIq'y^Í Oƒh[ÕÐñ]t1[“Q4qÂxN)aœÇv__vÏÕ Æþ³MùqŸå:O)ϱÏF ½””ˆÃc\;²â$VÆ}1º•—³˜‚kq­ªÓŠVäv ¸:bô“K¢ÇtLú…B‚r8Š:Ô­uÛ£hM)àDK òCÛà·îÐßéÿ%/pÔ]ãzâ9ÑП.þ^U£iäð¨jédwaþøŽò:ëùÖò€Èh¤A 4X¡n‹3þÞB&BØéìWÊBt™z4‡—‘@…4¶ªóJp:%`sjáØi‹€Ák,kåô¯Ã^Q¨ý.”§ ä ŒÔ~´Hºƒ âƒÕ9’…¤ä8è-̉’g³£¸‹× Ö€³ ò‚¾­¿çL_¤PD£ sý¯&ÔÝ}‡Ö"lØ#W\õ诘x'æc žkZòuTÒ"åó£*-À—füQægÖkd>¼¦ýÉ,°r>ÀÞ–ñœ­í¯—ËËå’žº1ÕÃiiôÑ^`ò,Q6¶ Ùg#ädÌò- J™+•KYÎ>¸St2 gè¾Mê«§S郇¢‘ endstream endobj 2463 0 obj << /Length 762 /Filter /FlateDecode >> stream xÚT[o›0~ϯàÑH…b. ì-«ÚtÍVM Û¤] 8`•`dCÛüûùpµšTå!ÇÇçò}ß9†:ùQ' œUùYœ:åaL^U;h|Û,¨óL wù1_\Þ$‰C? 2êäûóRyåü&W ë®\/Š"²üàzqœué†)yè$ü=µ¼ªùwp´ë…ñ*¢$Œb÷o~·¸ÎçöI¾'D¾º2@W~H“Ø]¦±O£.]/Y†díz””nNð Žxæ`àL¯9QÂÔ2[i×ÝÃ#‹È¨¹Fë³(¦; §n¸"G´oÜ4"¬o„T¢cF²€BZ]ªc?`,몹\Ý×WJ*ô ßíŸP’«Ž+LÛBí”L²7/•EÕ @#Ÿ& œ*ÁÈvâ ;0cr'5ßk-» ¼*uX¶xwž²eªEkb&kÞÚŒ =„×Z@o²¿Dɸ-ýk,Ñ#ü ,ÍTcƒxi†—YÉù#„pŦ¤€lѻ”°Ô~p“%a5Ì.´8ô­øИ¨0#YÞÊþ´ZÊN‹Ê/ZSí¤&Bf̹1²Ø^ ÷ÚM’³F¢+ÛÑÄU6j=zo&r&ý`%»½Õl=òÀ&z¨¬ê'[ëÚLxÇV6mÇ?öô©«,#õcg¯òiUžE·—ÖsËÛ><°îÕÌ® ‡¼VêwN"1ùý”˾åèP]R  <¸Š±Ö¦y’†DÏÊ'æ ölÀÙƒ˜ Ëz¬Às3KeàI˜öŸ¿'s]Û~h8–€ÑLÿE~»¾ßîÞ2µ¯ü^”²eEú 刭uËÑû¤äÀQ¼¡1ð¬­y9y’·˜.ÇÏ<ˆÚrU tJjt)Ý\ªVÖÂæö¦þi_Z~ÉgÓÈͧcaž¦ØÈìÓ´mÕ,Û“ „­Ak¯äá„Þ2² ÒTDKÊιœžTÉ€¡ú€ÿ_죦 endstream endobj 2466 0 obj << /Length 2175 /Filter /FlateDecode >> stream xÚ­XÝoÛ8Ï_aìËÑ@­Õ÷ǽ²MÚ˵H³Nz‡Ãvd‰±‰Ê’—”šzÿú›/)rê ôP¤"‡ÃáÌpæ7C þ‹Â_dQäq¾¨ö>QívÁƒõÛ‹@øVÀ¸šqþòpñó›$Y¾WøE°xxœ‹z¨¿©ËÃa¹ s¥ÛÚ|]®¢(R—çïkkzS·Çi¬ºG&¿ÓvÃ[lç`fq¦Â(Yþþð¯‹ë‡I™$ ÿ¢ÖÈùÚ¨yaÄ¢všÇ^Å3µ£`R;KÔår•¤§Z•´†/k;PkPõ¥cÀsaîù…ð°ÓËUœ¥Ê´K°µ×ü1]Ëä'ÓïxÔïŒã‘ÓÕ3ÃHì;þÖÆUƒ#b¦¾,“T•Ötƒpl·iôÞ½þÂÙHJ^¡A œ>.ÃLuÚ„F‘$Q•-ÞYª—êìž'%~U-W@l]ÅZ ©Öà8²ùvšüÄKhk}hˆ~dzÙÖ¼08Í”{ðÇÎ0±ê¬§4ÂlDòtƒejg·ekþ,ÑwÞ93^ …ýO’|tºæqnÐŽÇâ©fÒÛG' cÕµµn®_a¢8,ì;7‰uÚ~ÁͲ§Á%¬ÞbyöØÙº”C¿›ˆÝ‰%lˆnJÖ±³e¯9ØÛJÙ³õA ‰ÃÆÔ $o;fÒme‡^®(V®Bma§ãÀ¡] ÓMEb|ö㳓ᄨ8=Âõà™ÒÖæO]³¨Ë»›W¼&—©·÷÷<Øë ÃoÈ8©¦$¥>óf³G|µ —®éCKÉR6£’y¬NÓߟˆAˆ]-A#Š].\Åq¢>ù‰ÿR'P.ý1N˜e^ž‹$ͽØr~ûÝ_Ô°§{q¶x"Îý"òÂ,‚Q³¸¿øõœ†yàåEJ¢‚T\ùrÁvŸQø ð [YêIxêøBüItl¤Õe#ÎÜ—‡ƒi·<±º1ëè±Ú´tÓrÿW·÷²l§Û4ä1dÀ'?ˆ·ƒy )vç<ÓBˆïK¾%Q‡C¨ÖÍI@ÄjO;-×e_nJ'z•5dŽq½}‘ä'ñ×®è<*'u©2¨b%árcõ±­]ZæcCBÉBè#òÈa§çž G %yñíFÄ !È8÷utLÁ;Ô ¢Óì°ú€Ÿ^®wLÜvá9qNþøFØ‘3;êF=£.©xQrè04„HrÝ^3Ó'¨Šú‹©"âuôšnj'¹¡8(Ô=F(%F䳓[:¹XlÒüYÌFi!¥ȘdÆråÎrµz¦C{ó·žy7Srnæqh¨¦Ãç­äNÍ4 .àä$B —ë‚G‡šß¦B+År;˜ºl+-µÎ ÕpÑÎ+| !TöS­—¢ìvÝІ>“ KÓ~·X¿A–×à`?SàJÿgüoCͦÉ\uû°1PW âú*MSuûñý{äHÝZ°“Ú¿gd#¨Œý\YX#¦=[R³xl/:ô>N¤¡_!¨„É䪳8hÐôœÛâ(øêMÓ0 ®«æÑflWòßiÌ#h; áuh, a–¨ã+Ccýë\Jd^ ¥7ÆtŠÃK‰ÀKóœDeedßýå›kV²×_{Va%òÀŸðp¡&€ +ÉJ'Ü»)GXê<̤»£ë³ö EÆñw«[m9¦q:8jpHµñŽâš+F8sÃf5•>$pé;"¢ >í¸"ì˜aŒN[Ö¦ê8)a¸î7̇FSZ}›ŸßHEªÀÕ^Êž‰ yKР!™Ïžc¶`¸ã^3‘M:kz9cÙLï\%—ýphLUŽJðËjðÓêü3Çœ}œüW´u)XbSêT±ÔžÆ¢ëC”'^\üH0ŒE”$pÿ<Q *ˆ'ž޲^l F™Ú1ë„§Ô-¦42—çi”> Á[ǘÂË㊱Àgýæa}kÜÅòo—ÁPÚ9DÏæ8¶¿¤>å|¦JŸPVéÆM¥¼0Ì9Žªkšé‰ûí›è âÞM/ó0X8š¢'ÂTørõ‘Òé³¥¬áÔÔ †õíÃ5¨ù‡8Xó’t±zøï’¯VWhæ%¾‹¨Ð3% .¯V—·W«3ËŠXÿ›Šp´©€¶ —S¿×G¾ºé™}`; i¾IýakžagjAánÿöÜyy?6€Tg}Ÿ‹ºˆ²š×û~=i© gUˆçãW :t:¿ÕN®dEg|g¸¤`ªðõ»ôW1ßMõ‰ðøGäg= d8Ÿ_º¹øølô™æ#ÙøÉÀvÐLš+‹sn¹aPR±Þ—âÊØ3¡óPZi ·rŠÔI.ûS­äµš£_ËiøK–‡¿¢lxÚhQù6ÓUfêŠüpyEÕí 9¥àW ®K€@ÅÐýã ^æ«§- {á_×Lä ¤ŸÅX5ð68ÎlwdN<N:;âùÝÊ ÊR4j5·4g_e]ëúô1>Ñù„hÿ/x˜0 endstream endobj 2470 0 obj << /Length 2802 /Filter /FlateDecode >> stream xÚ­YIoãF¾÷¯0r¢‹á¾Ì­Ûédz’ [‡¦çP&KR¡)RÃ*º­Ÿ·‘"Õ ªzµ=¾å{‹Ã»þ»2¸ËãØ/“â®:½ ˆÚîxðôÓ»Pömaãv¶óÃîÝ÷?¦é]øeP†w»ýüª]}÷_ïýù¼ÙF…§ÛÚ¼m¶q{þÁ¿}ç:Z¬º†Ißœn­éZ ô8‰/гÍÿvÿz÷q7q‘FÑŸdw~Ãoüæ~¦‰ð›‰ÆÉŒß8œøÍSïÃf›f»°ÆìÂÊŒ]àñV «8€‡2¾yw4ðUIRxj)$Y¡Tæs&š6–ž;j^n»vkjkÕ×L9/…‡$Ýè“n7Qî9yÈœÎB+<§k¾ôgÞð <¿Ùæeà}¸àW Ûaì‡iÈl·Ê =°—±×íñ7‚+ˆYÓ˜>gïnrO¿â3º¿¸ã´­Ö¶ê®™vÔ|yä¡t¢ßD½YW °˜E±÷ÐFšì†G׸Þk]¿¨ w~AÓJøz01~bV Ÿµ†‘øq’E¢µ¨ðËT´öÁQý‘÷¼ÛÀsïŸ6eâív¿<³ tE²ÅéÏ?<ð@¿U°”£júŒ#,ý07aE€è@d&ð«^Í#Ô4þ~3·^Õú;¦ìaP”^µÙ†H¿xhM¥{nújÜQ.:ÊÄ(ž¯¬¾Ù²Û±×«VL³ëÝš QlN¤08%Þ³®†Þ¸ÑÌ@mŸƒ4‘ÁOÈ„…õ¢ù… TzΓp¿ÙŤÜ#Ö½å™ËÆo?ô›ÐÃWóñU4 ¹Ç¼nÒÌS$¤ËõrÖÜÊW¡úàfVð—„)³%©§ÛñèÊ Ñs$ògú`É¢$A)÷­:i9€ âବýº!!×(¸ùŸ%/Wºw„ p«†õ9ÃÌo¢³Àû uÎ×>þôÈ”åYø”¾ýgÝ‹öºEZz©lo”9YÚÁ’|%m‡Üy/ÛŽm‡{M`Ÿg ïÆ»ápäý Údì*ÌtYþí «`Ieë„ nM)_}ßòši«®­PÀ+Ú…mŒ•·ð·ž:'¦ÂêCÚ…‹Ñãâõõ9F¿–¡ç…•ÒtHüŠ6(È“%sHÔIR¸(ó‹$ç‹@òùz„‘Ÿ%ðÐýëè€q®"Ò¾Cþ\0\!¥»Y©#7 HÃÜû$w8ƒWªFî`[ÊG[RzÏ™®WÃvÅhW˜,BÆé"𺶹ð4ŒÛX…5Ó”ìR|ÈšZ3A“±VŽéî¨ÓùË üfÀ‰iY%rÙ_è†^nj«þr Ž ˆAVtŽg|íßs˜‘»à­ž`îã„«&°Å¢$eüWŒàaÒh#Í×ÑéeZK›HC>“o S9`í@ˆc’"®!1i&CÚ-TÖ…'(”„Eáá@5,‚¯È’•–è{'EÛ.Pÿˆ4s”&\È…”&ðž d–ÏiHÑz6V¼OU®C¼ÆÉI}TÀ™£ô GGJ²ˆÖñ%û¡Am_’¸dgˆ ¿5lkÜÀñ±¼(HZ(ŸäƒéN”gžþÿ`Æ<°fÇiÜeOªw<¬€{»®˜ðôü^ækÊίj(Y2bW:¸*ô¶«Á¯g¾Ë9ßG…²zˆò‚yÈ9äcÈ!ŽÙsO¾€™)P«¦gd‚_\w–gÆïšî</ À?‘–! )WÛ‰˜ßº¡þ‚Xì –±Š4™°&qÃŽæÊ‹ƒr< LŒtÀÙ…·ž”d8ï$ÜÑÜ홲ŠÎxz‡dS+ß"xÏ_‚IݵšÆ{ ¶@~~zd¥ÿ½ s›8ä1§Jù˜é‰l<ΓYâu ’ta"’¥Þ#~.™:ž#‡]'ÕJòˆ³Ûƒ×Œ™=râ„8½ê0„¼u-æì¡ÜÀ¬0foêÇ“3eÀlÊÌ2˜åDæŒð°‚}’…³0! ”§ä²j¼˜¾.‰!‹ëØ)~™bZÄ72û5•ÛaLÐ)ä]í±XøÎAÚme΄u°óL4áp²ÿRì_2˜/ާ¦¡w{l  1h÷â˜Â–Ϋh2Uºƒhª?gŽÍò¥×E­í Ïù™PYX€Ò®¿~Ò¯S¸V¥QŠþ=j4W/¾«ÀÈtE†µä¥×äãàl'Î?kÝX‰þ kLIÈÖÐ7“Á¢ ¦;Q¤Â‚Å8Œg$ÁH·XúY>Š5Ÿj;öˆ“”Ußý ÇNþŠc?özLY¥¸N\[©âDR‰±Säð_¬$áâܘ¸¿ n`Ž%J`’'‘{°ºÜ/wóÊÒñ¢ãª"–€A.$Ýá/¤7Û§ÿæ áC‚QbÊ•h?Ú¹ˆ0Öª¿¹n‰DHJñ{‚|lîD”ÛL Í[~õ*¸k­L‰÷ŠÏôúܨŠàLŠ,¼æ^È$ޤ1gH¨ºÝÉXîP@…£ÇÊÖØ™^§ý2@pšm_¨Pƒ­?||öyô (¡×½º­´cÈkà÷ [Ýs‰@ ÓRy‡ c¼æ™ÔK£¡……ÑH÷ v÷<œp UÙË: „èÞQRp͉lYæ¤ÆR8[ ÕÐPQ˜Œõ^2V…éì+e¡cz­UH3ûéÙ )?å• ´mM»…]Û“©ëF^ŸœÝƒ^CI*›fà½,°Ù‡°fð™”Àæ\U#EdÃm¢(Þa]ßAäî™HÖ‘‹u”caÁ]EÚ¤F‡ólMu`ÊR¨Þõ~i“M…dSkÌ«Æu²0|œ´íZ&H‚FøBÕ ¾gíÎ%‚‚ïÖ‚ŸÄº±«¨¦êŽ •o›þÞl‰»„‰˜ %‚ºi¶TÒŽétÍ‹Ô ÂÝì@¹éÍo²n¨–SD…Êòq†Ù‡áV HͯAp¹ª9O“ å°ê쬊Àkµc&súÂDÈèÍ¡½çÉWéêÂe•ÒÅBÎQ_HªZ_˜Îef=NxgO|Œ),œk¯f¼²%„¢ãVÜÛH3X.¶ØR©Öà,'ÿÜí(o¾çé§_ß?bT¦Ï¿î¥xs·qÄÓ©¦b¥Ë%;Àñ2;Àr«h.ƒ@hº9Ñûuß¾zU=T£§qœyä5~ÇÜœ¸dÎ'3ÊÑŒìxZ‰GVd0àld„‡éúYï½8¹X§O2ÖÕX×÷SÿÌ~ºJ(‚×¢È5H‘ Þm3p£ìn~X”¼é7ApZ­¥æ6ú7Á5R¥=‡C6:Ä äìÍŒ½gg-ÿØÀmÙÅ¿Lx/ñ³°˜ÿcë÷ðøý§Gnì;éˆc^ÂuK:E]é〺ôð,µ¥`޵Ãí¨þÿÈý,¬yú5€íz0;¦ñÿ€ˆh‹‚Ûyè}TSWV^‡ÅUDo¥Sד•àÜZiÕ¾ó´›,0~£ %,×WÝ> %Ò!dhtÚ1Ù0ziŽfL ßù^'¼p‰Ó‰{nZš¶¦ú¼……â‰@|i sùÇäï¤ù¶, endstream endobj 2473 0 obj << /Length 2757 /Filter /FlateDecode >> stream xÚYK“Û6¾ûWLíe©*‹! P¤rÚq™ÜÖ…SWl0Þ‘j´Øyð¡¿eÂ×Z¿êÑ[TbØ3#y ¶Ø€<7eƒñ¹ íÖÂÃO¶ @+L›7åÃŒœÊÉ6O¼ZÖˆ^bÅÊÓ¹2'w– {»ø¾&ß÷9ˆ!Þ+€(Æ †9Æ¡–à{å‡~´ZÇ›j e±‹K&`¬• i‡*Í5í[±÷‰’1 ¿r¾0Ëp>$ö²[J+¸‹Ä߸‚󯣩9uH2ÑN(<‘D¶Àôbº—³ÔÓ˜SVÖe}`º ‡©-S° ä+O kog:ÎÆ@ÙÃ:#é.1™¨9 ã£Ì}DGÚùˆÖ©]Ñ8j°‘~–¢ñ.ðË5®0„‘jû“i²ŽÀ¡cØJiðK€Að$aìÝqI?ò0ÕëH_åÙÐ8>¢mŠe§ƒ½ ª‹DIÝ&/1æeñ Ïàn¼ÖxÀ_hÒo\³!¯Pˆq›Oš?—˜æâmc_©dzfb4âJ os’0\BÒ.!!2ϸdˆ¾í³Š‘{¶1Ó€6Fˆé“¹ü¦$›M%¹œ'È…J~3MƒŠ Ûl¢™—S£>·© w ó ­þ"Cÿ¸F·~&ÓŸz÷wŸîî¿{í/j(<Ÿv·÷;‚qc»OüÍ«ÒÔ¿(ÑŸÉáN–çæ|% œie*߇MéD§j£HÈà­Þíï·oßß¾zÇÓ)mðR‡,-é)èÜ_ËL–ëë0DZüÇÁ]ömkkß6ô§å ¹…S8øžœâ¬áØ£ä (<¶„%¶Œ%\uN™ :¡nÓIc¿c”€{1¢+DÀ$p¢R€<D:uøZü…rƒë\P&Œ 9ø ³åÈV¡.—b‰ð!ÚÄ#¦j<:]GöO±7’œŽnž2`…ÞeÈà; 4js°]éªH…ïpàØJ]ZH‡´°Öñ–oMHåƒg]•Úbâ‡î¸ó뇛KŠ<²¦š)‚„òt2 àh@’´àû,žQðëà;7…‰vùZ_JOî-€U³ÍÂ@+•œ§Üƒ9ŸxáÔÝ7`ÖçPéùÕ‹Y†bB‹ Å{t×çö%yü B.ÞÆr<òŽŽOï ‚ ¸„a‹E%¢Â1¢R¿§ÌDÕ>âÀ=I^ÀB¸èŒK¡1Á¥âÀ ó#T(‘'ÓÚþ<<ÜÈó Pç'´^ÙÚÀ‘³Ið×]óÄí¾•Ã§„Æ8¡Y²ŠG1MJz†r/sê3rZ“\Î_»”Ä"—R`fÌ æ_0²ú`œ›§d|Kæ'¥çF ·ÓܦžNUæC–…Ø$“‡.[•uù!Š`«($|¤öhûª`Vö[J=ö÷¶ºLÌÓL#v¾UЮqù‘Ë ªµgƬæüº`4+9Œ\d]6EÉM)G/¯ñæ´x)¹µðˆ`duõ¨¨Çù;ïñÑèg îŒBt†nøQ#â̞Ănä¶k¢gš?+tcÁÏ{C_^ô¸3X.Çòž$—c FÅ0`Ã,ÃÃz<É(£¥L=f¢ÎØr3IC¿òs²Þ×Á ›@§ÒÚa—p´7è°ËDRzÀùw†šï0•)§‘¯„rñ {D#gú{ËCë"Ÿ•uêcAV?/zøüAÊ¥†ÚTÓ-éI2{4͖ׯé(^ñEIÜœš‡í3}=f_ÿذ3æðåLôî}çÜ·íÁÓÛvßWÜÂaœ(þÄw¯HÉ!œc"'f òðƒMJ5=䪪¢ÇÛ‰Ë->ª=ñ¤¬j-·r Aõˆ÷…„q 'áÔ@¿äÝßÇ¿¹ÑšãäÏ|@èƒí¶‹s†‹ v9=q½šXä½_ö_U:ëcA.·{ý‘‹ujAõÓu8­ZøÄˆÀÖ7¾4;Faø,EzÁŒÚò—r+hîÓ’‡í`Lž¸#êÁ¾ŒèpyM„ÞÕÏ… `4¹R°dâGÌz6æ¿s¸Ÿ'‹Sàb rr"G9z΂Èfka‘ ‰ol9ÀUô¿ìg™(~ Õï|®ùsÝ Ÿ@ý˜oŸÌ)•%/þþ€ëÈëÌðì¤wjÝ|ë@Š™uz¢L«\ᮡB}÷ñÿðá„ endstream endobj 2476 0 obj << /Length 2465 /Filter /FlateDecode >> stream xÚkoÛÈñ{~…¿•,ßûÍq’özIÄJ¢W ¹’¡¸:.Ûÿ¾óZŠ”™«aÀÜ™ç*¼ à/¼)‚›<Žý"ÙÜT§7A»Ã ¾þíM(xk@\O0ßnßüò!MoÂÀ/‚"¼Ù¶õÍ¿½»óyµŽ6žjký´ZÇqì½ý+¿t¦7´X™†AïŸzÕZmZ ð8‰/Š7«ÿlÿñæývä"¢W²‹˜/øÍߨ€aá7Û$~'Ìï[?ô³Õ:Í"上¼J©Z·ç©Wî{Õñp_êFÕ<Þ~|àA«¦×e2 ß×êý…¹ŸÅ1ŸöëåßxýQñ€èD›|F‡Vð4{ ã"÷X¥ÆZ½kž¿„«tÚhÕ®­ç¹éøkU÷ÁJæH+÷L£«gü¤ò¾œ¥Û²V e/ôíp–-]’H±¦!‹dP¤è¯Ö¡×®B¯ÂAƒç³HSÀ°ð,¦ay‡–5ÐÁ-Cˆg€4e…øßyæN˜IˆðŽá£„|0ÁÊTÌȺ"­‚˜¡ðBÊG–™s‹eÏ«µêɲ(6‰ƒœîièh’yŸ¾=l\k[™¶UUO&q‡À'µNâÔûµçmù«žX㸨™8³†e+vס&pxRÖ–eÝåœuæ¨7%ꙿsTüÕš¯§Ä¢vek÷ª#y`ÇÎñkp…>›ÿÜÛàä(ö“8»8[ÎÎök»ŠAµª++9 œéQ÷Gýöî^ü¯®;Šd‚©ÌwŸþÌÝĹïê“nµÎ{Ó…$½=Љƒ? Ÿ„óS)!´DKnÍÐVФ(Dñ…3^Þ{cÔ[QüÀÉÃ×U†Þ?yÖ©ÊtµìÑíÂí `ë8Ù0Ÿqâì *›xJœ†^iV+[uzÇ~U3Œtÿ+ʦ óØÏ¢N¥ãêÜZ«~¿þÞíÖúÔ­]7üF­ƒØïŸú%]Gp³q:JAcƈæ¬n™_l’¹ßÔ’†ÓèËqPx4YÙp´·Æa×"€N¡9Òáôâ€ôˆcÓ}ç%q€×p¯äTNo9NqåhpË#o€[¶ `ƒÅ ìVÅhë×á›DLmIàí‡n®ã Å‘(•þ=U£pI„¾fuÍh¡»ê@Ò ¹©yÂ8i`i3wÚÌI›ˆ`øK š‚BOŸÎS»‚1{]Ù¢„~ÔcÏ ‘"† ê6±w÷ÿo™c€ž§YþOƒBz  ßì˜wÇ+‘ƒ…Dr†7æ «yPøMu;¼4fƾ"> stream xÚåY[oܺ~ϯØG-ÕáM”TÇ)ÜãKN¼EœÊ®l«ÑJ®¤Mâþú3R[¶xß 9rÈáÌ|ÃY¹ð'©XÄZ‡©I›Ý+AÔæzÁ%ß W#ηëW¿¼¢…a*R¹X_—Zo¿ono—+•yµ-~,WZëàí_øû¡©»š7uɤã]^µE]µ@×F›@étùÇú¯Ž×ý."¥~r»Èùp¿v¼_©L¨­^ØÄ„R·éãËÏGGgË•MTH…;X¬4s®” µÌy¹ÿRßv°á%‹‚£z·ËªmKæøÝÊŸOÎß_,W&Æå‰+u(£¾Ï¿‚vd$õ,ëÛ7ï@s–ÕÈûËûnG‡Ž‹§Î…ÂX^àm¨Bû·ÊïÄÅQp–gUQ]·¼Ð=µÅ¡L@¹ðµ^k'oŽX —où{|~ôñÓ‡5wN.ùÛëvÔqê@Ê_Ïþæ§¾QÕÕ&wAƱÛÖÄúV£})8:ík}“ƒNÒ4£’hˆKøÍ†Éõ»›8´`N 4+/óMÇÛ¼-šÜ œ1­g<åþmÖd»¼Ë›ö5ìÀ@!bd-Ó`ÅMS|aq|E5wÏß/çMÁÚJ+É”—GZ›£åQ³èø‹þE_T6jh5޽ØzâÙ×Àµ©« Î f‚‘ê”Uˆ#Ãá¸ß ïçV ]<çä|‚¬Acp§K÷à¸ôÝ”yÖp³Ët(:N‚‹ª¼sÄ?w-Ú¹‰†¡aç~N楴Ìú¯“ÓS¦ y.‰"a—¡†ï˜µ9w , bØ®LÿíCŽÔ2T2YD†"¢ óûb±…AX)4ñâ;qî TC«\\¾úm.’J… H‘ˆÂDi–ŽžóP¨•aÛƒµ Lê©PðNTÌŸ{ƒ®ÃÎ…†U”@LS|:6|<þpúé™ðÀ¡ígbD3Ì„IºUtl£ñˆªì÷Héý;Mþò{lw<_L쟙6yñ µCeË\hÑ£irÞVL”†ißX†‘xѵkBf‡K!ëã¶bRF:=ˆÐÔ„˜ÝDho+™F0Ëă6Þx€ª¼ƒ[h‘º,vp$ᆒ‰ƒó:8NÂKDÊ» þ²{vo$ôîrï~éyXñ4©B£Æ€k û"G“646†¥L˜Æò)ï6 Ì$9ˆP‡BES¡ã»'9‰ò0ÇÓP™t*™÷Kû.J¡Ñ0Ú1a‡/»}ëzœªà2άºÎ/· m]Ö¹&½Œ„W•®‹JÏL…ÈîÒ`hçü¡@Ks†'[Å Þ¢–6{Lˆ2²,)!˜È`u„§"‡ Þ_¡¹Ã5ñt3‡pi™e„ZÓ½Žºg ¢qÆ ÅfŠÇec]‘{R$€êb ßNÆú4Ø"L輙̟Bƒ·c§öã±ÒW3†é.´w •ˆñ] *Œ{£h,P_EU@¸,‹ÿÑO%ÀPìvùhyÇLWuYÖIÈ&‘Äh§ôÓQGâÔãˆAœA½"Éëuæ:YkÊÿ$¡ †¯ïLqºâ'UÆgJ÷Š*ÊÿÂðlî¢ègªéeá(†Ê‘P”Yë&οáE®,% û²ç4¼-UL+Yõä^'àʃȄ·e¢’©Ðá§5d¡û}VÇa’ÌFô˜ìÛÆ|Oؘ^`µ@ØEªÂ(I_ö¦DËW¸’ŽÌ SBÂ[Û@¤QMŽ~·±ãתM†L^¥6ž „Oþ‡>à™Bcü4RɃC€ÄmM’*ûRæMúßî|úxÑ'¶³‹}6´QclÞf~6a6i6Ü-ý ¨é endstream endobj 2482 0 obj << /Length 3088 /Filter /FlateDecode >> stream xÚ­]sÛ6ò=¿Bo'ÍD, ÙéôÆñ9wi'MÔ¹¹iû@KÅ Eº$eÇýõ·_I…Nï&?X, ì÷ÒÑ"„¿h‘‡ £uÇÙb{|´½]ðàÝ?ŸE‚·ÄõóÅæÙ7/“d…AæÑb³“Úì¿./îîVk•-m½+?®ÖZëå‹où÷mÛô -n›ŠAW{[weSwױޗ*W¿o~xvµñ\$Jýì"æ_ó›fqé˜ùíXÉsdxµŽÃpÙì@+¸¸zïXúßeI+¢¥Óûõ÷p±ƒµa›Å!:PFèZ¼öóGQ–y’NÙº¼|ýé™*Jrö5U* ’(žúêúå ¤ó†¯½mŽÇã¡ìgÏRÛ†ÔM½˜Ç¿+Úâh{ÛvÏa%J‡Ü7[¬#Í,À ˆæàžoË«hE‚A`ÏßÂ$líÖ–÷„¹ƒy„+ñ²¬ƒ ƒªèz^z¿YeñòâÝ*ÓË /Êåb%ŠAaÿ qÃéÛöñ®å92°³ÆÇ#¼ìø·nzhØXÜTvÇЇƒ•ýÿÌê”6 òMtgÉ—ÈW›”TòŠC8+M¾Æ™qh‚$T“3G*·ö*5~±Î ˜´BGLd¬sBµRqÆÒV*È ç$§hª.Áxb‹íJ™å¡¬…Ä©ŸPipvÃnŒ'­]ó ¬Ë¾,* VþIʹcx±Gú¶å™çª¶…ê ö:ˆW åŽ_RÞÍÅ(±7|¶7Œlcòl^-Ýoô̵£‚>åf,:?Zz)ùã•Ç ,©ÝÜ%³F&Íÿc¼¥ìœ5Zj³HÁbC­¿ÈfaJ ì›<ûŒ…è0 ’<þ‡j§:š:˜¾ÄÄ1­U˜ifÄ5i ±Î†fYTúòh;¾þåý†GU<[dF.Ç‚u‰gÝ©•Q(Yþ!¬ñMh" €ÃRNB=hdË©³B¾G‘?”ùHõLƒ½¾óµ#­ñ.»åág›3®ˆò£¾¬›ƒ ¶§ÊŠÒl´ "ß»+ÊÁ9‚êN·ðÎwUÙÎõŽ51Fws|mÛ6’×´èÖyí— ¼í#’Ù7/ ˆ\!ÈE¢ðhV^*ˆWë$UËWõJ£Ï¸m ¹§I\œ…? .í—Í¿®®7¯./V9\ýÕ›kA²Um{7ü\Ĥ#µ IRÚ¾ûN¦iHÄI ¸„³ñÒÙ-¾\.¯‘ÇñkUy{ ÷©½ú³n‹ÞîDN—Eý·Þ¿—Y:Q—ˆ¸Þÿïs¬+H³²(wl}ÿýë h•O#ø2™$¢¤$~TÐD¼M"¾ Qü3ðêú’ÜâÞÊ3¬qš¸èÁ¶ü-Œâ-É“äd6€2Îb`÷ý `Eu²BlÏX‚N9~våzÆ<$0Àc’½å$âÆ;»/N_65˜ —&­DÖ"ÐçŽWŽNbL †eB$[çšyß6G9™Í†§‚ñž2hf&š9øA#’DSjé«ÐLÇW1áô*°è,Ÿk{Û@üí‰AX¤[¼àik;O§9?e°•]¨ç|=Ç2K?Žs/ý8ÆÊ…ýAQÖ¯‚ó‘¸ÏšGZ1ö ùN1þm›¸dj@îõ­lnäÉ“c@¤2!Vö ‘é$ ‚Š/Y;&ìä6b ³%L¾H/â4RQ ƒ…IjˆT<ª`Hó¼ñD‰ M½~³aϳlJÛ–Ä kMË`‰-!G”FãL r¯Š,  ^İ4Ñ#Ï:%-_¢…ŸZ1:ÅܟǤöØ´Í'Í@E‡²E¦Sp*5ÿŠ0Áí=2`O|ÃÀ™!M*[ßö‡NŠZFOTi ²órõE²Ñ)‹‰!R*ËÇÂÁ;xK‹–¯/Èïñd Lve'Å Îʽ<›aÊ3±< GFE^+yµ(Ùu²Y2+°Uር wÄCnp'[‚Ѫ0ûfe‰¦„€(W²±ìypfAƒªE3‡Ë4ž1©1šp–;†³ ØÕHR^a†„Ƴ ÅE»´ÂVÕÓÅ)ç>p(ÓÁøRV’˜$ç:÷(t·0ºëyÇ ’0Ù}Á;(¢#¤¼/w$h˜pÈ|’¡ë€J‰ŠK VèKÜV¸ê{!ÛNN>ÕžGî01넼ߓ١èècž Ç*7£úg©ƒk/Bh9˜µ<Uîç´ÆE ¯±ç>£¸­J9ÔI-Œ¹R:;ÔY€téO•Ç%Pò ü¾aˆ¿-ND>z\í!\âòÐíˆG¼ µ–¿-"8Zú춤•rÛIÿ„ß$ÜâmŸVÆkJ®´N]ý@#θq<Ÿ”£Û¾mZHw2íº—0g”=y*Ù ¤£åRÕ².;¡xkëõgÔ Òn¬g³Ôçk‹3ì @¾U>ͺSÙ³iáŒl¾6Š3KyJž‰P*½³Tª ¢5“8ñ¯Š“R€‚J‚Ęb7Ïrן^Ádî +þ©'NøLæ¹3cî• 3ru?S0% ¦ÌøpêìÊ ;Ïìj¬`JÌ}Ì@ÀÈ®Ìò'Kñóžc2CoÊc‡8º3×@oe+q±öx×RQé`"ÌèYÎ;ÿKg³€¢/È#õEŸ rŽÃ”H¥ÆŒ+gàÂõfz¾àÅyç'­ß„[¿ïíöQ»Ü¼½lê /nwsMγ&.ù5Ö}7ýª®Øà|ÈÊÌèCc»>6!qC® ¸²ŒýY{”ï7ÜÍU96Nbª•U4>ˆôœK¬–§±OæzÒçùÄ¡9Utn(ÆäcNÃåý ’0i¶ãœí(—j·…,´ã…OÏ[Ÿ%#¼±è{þâ÷A6v'÷ug˜Ì'îA1ÔU-\E ͺÙgë:Û;»æz¤¨}.ÿðPÔEõØ•ÝÓåԿуÓÿ$„Ëþ@‘GVÒº>eA¹‹É€Ñnom'¹@îÃ6ŒÞ½Df.y9mŠMÃ0ñ4ùûUúâÞ—·E/\.6ç&+L'_Ó7?½—Å»§;Ø t£Q!'ž*Ï—ôÒ7”§½_\Ç"–ó/üß‚ªkdtêýIäòey*_Ü[êòœõ»ì}e½[¾uŘÀ'W8Ü ]«iÞýú s™/;’$QAþÎþq‚8·õ_~L endstream endobj 2487 0 obj << /Length 2711 /Filter /FlateDecode >> stream xÚ•YKsÛȾûWè¨Ê„ðè›rÖq¹jk­JÙFàˆD ˜ Ù9ä·çëÇ DÇ»¥*a¦§§»§ß3Œ¯"üÅWëèªLÓpUWõþUÄP·½’Áo}+Þ ˆ«æ»»W7óü*ŽÂu´Ž¯îæ¤î6Wÿ Þ׫¤ l·i¾]¯Ò4 Þ½‘ﯮ{^¬ûV@·ßFÛ Mß €§YšI_ÿëîo¯nïŽRäIòÅ%Ìò–7 #¬òUÆi&ò¾ “0ãëU^$ÁÝõ: lÛÙâ•ypÛÕîûa„|2פ±ž ¯¶ž\3^ö] ïqšfcù\8ÌRgPj\†EšŠw;+Ú”VR2-@ê9-õòeW¡«,À8Úë8Ù¶sÙx©}ã”qÓí,ÛMHâ^ŘAÈ*,‹\„üDd³u0ìú lÚLïÅØ4©‚® ;3 Pä¨Q@3È|:(Bï·(3aØ‘Ʀö'|y€¦Án^c˜ã º;+è¯J^IŽ î›nÃç[˜†qËGoϾ"ögÖx¡zrõ2°Ö 2gNDBí©¡P7¿GqV Î`røkZÜ!Ȱ'oÄüÌ¢8ÏR@ÙÈÜ2…AX,,­íàM­B‰‚­•¼Ùš¦t"’÷õ¾ý. ½i¡~~¬C°Ç®çnë̦鶪~|½ax²§ñ4N¦eòe˜š\¸¶‡ÑÜ·–¬âà~'´ƒ³Ö91{•œ+ëb/5LHa EîØç@æÐšÚÊ"]$'‹iàì¿§ÆÙ½ÚŸ€YÀ¤±h!" ;™©m­“)Ÿ’‘ù@€˜š£[çR6«âp2`²Ý4趇‰Ôƒð¦ƒÀw>uʨ|Ÿ‰Rï6Ãë³SÍ:Ëâ3_Ê2¯6²ÈD ïNeÀ– —¢äRôe Þv2Nl9Z¥.ÑN‹G†Ãèúnk‡Q¦{2ËÑÞõ­/ ¾Ì^g “@j ½ÆiY †‘g-\[SÚ² €[R„yšÏ‹@"Eà-þöëêýû/‹ŸüùŸÍb:‹8Yq[ÎóY”Sl@Ó‚rpÍÓuXý]ukšý cNÙBHS¶L\¿—Ñ[=”y 5ÙljCÜd‰7ÚZ»ºdÆûH®a+FÅÌ<’Y­Ì†ÉéÈȧë»Z!Ò­”¸•Hï·Á‹”ÍiãØo­8;Íž›qçq=W³¿è@$©å2ðãTû‘–'G H J)©ÆùdŸùa²ÎŽdyB§¢¯†iOç¡ Ç¾ÇÊH̦ß+ý&´¡޲NUµU¬£æ Ù^ÈÀï\€æ'TÆ’VÝÑ~oî›öè„&µ-‚—~/)¢ÙJ®Ic5Б¾dxÌLw,’Q0uÍCïö­N}ÊLôðS{Á²YðÛG¢ú^â?.óHF[D‡Ïšú¾-"໣{jÄ€1²ãYán`¨ÓÆ­û=|}£Ñ¬ÀÖ¨Ô§².Òw8úÿM*Å)©³”RSyìzjŸ[»ÙR|‘VÿXáJb_âëéT¤,ËIpo$²â Mb V d®áŒ,­£VÌo©<9<íQ+(óߣ<"HEv!\³ Œ’¥'{)¼|}¡Î7“^T½ÕÎà)ày²0Òb_žB’xf…,L³"QÅ¥qXúûTlðÙ:L€´ù¶,¹v2Fiû-’ô,²㤚[„‚ØÌ®ÊÖ(îÐï½h2tãIºf¸d¦ Y,- ½‘–¥ï÷ ñ{p¦²rªYX{öRqeRïÍ´²üYSF|ÎAYðÔµ™å>UOgry€L€öÊžTÔ 8]8ÛâÚçÛ'Jgª§[ 9H3Bï%.­¿ôê Øö¤>Ü«års&ôÁZîÓÜwÜÔçjB`zÔË-Û¶TÛ/àz7 #œ{‚—~‡Pý‹ÖÁ¾³šeórž /uSÿ âm\‡¾àÍ¥š!{æxɃƒÜb¿ófÒË»ÓÇ‚Ár™â.Sÿ"-=HóÏy1¸È,’ŸÑI×ú2@÷]kôÉ¢W¸!å«ÈPÛ«E~éïåzVUˆ=îÏ2ö×WnªÅc…ÂÐ[ù $í`è:øúõ—×9©“½ñM&äHγ•»Î1l@‚¬PRéçhY^ò’¤ óRÑÂk8þÅ ¿¦CæÏj~ÿjF@ž‹3û.ذ¾vãxxCnÜøÿäxÏÏ<“r„‹¬2˜kºÂ{ëÑ?~ífºùï®i7nÚß<ÂÌdá›å9“* Ë$¿Jâ–!¥¨ÝnñÃg‰¹\è Ï•OÊ]GÁg t–¥‹åQ%¦¢(hîI4—æ™FÔJ§ä¤»'ô™Ï2 NW|qÝ#Èvç,y%·KŒ=Y'Wå,!ÎR£i¬= FΜôMß/ZÌ5‚)UaY—íìÄËËdÇ¿sðx¤öÜfUÂm?{7K¼5±ÇûêKÇš½–'U.ýÝ(cöùx!P4.AÏ$üBTå¾çöF-¬×^ÆÚ°ŸÛƒæ§Ç5á(üT„ìdÊkTRÒjäž¶2œe‘ ¦{ß sgÝ ù%&áäf†¡©ˆêæØ4ÑÅ㔜[žvYìBwÚ§7Sþ< ˆ~¢I|žcœ¹0?f6ÅôÛ-ö9ƒ°X´Š£$ }=úß‚½ endstream endobj 2387 0 obj << /Type /ObjStm /N 100 /First 963 /Length 1602 /Filter /FlateDecode >> stream xÚÕYMo7½ëWð˜^¸äp8$ #@ÒÔm€âhëúàØŠcÄ•I†“K~{ßpí4ZÉÙõÊMÒƒåYî#çã É!—BŽÆ Ùöú¿Ÿ„‚§¤-…LpY…`Ø„¢J4*F 'ÒîÙDO´#̆|1‰ñ†7)ÈdrFþKíœMqÂÆ;ªMÉxÏ-ÆSCèâ™h"-ë» ª!e㣚Í0Q»Ù{x¢†³'Hu4IMg]Ymg]¹í¡œ Hèæ]mC7t@¾z &ª=`6©L³ê…Xm!Hœô‡’¡Ö>ÂPât†’¨}†’¢} KAqú“Eûü©m&œê ×¾YÙѾˆgðj³3b„D>„XÛ@^%ÁJ¨¬1GH©ö-&D_qOXõ2´¥jsÄ(„}¬MH'*à‚®ƒ@ÂZ;0¤ÌÈÀ¨†$Q®"$åÒ'’¶ p"[ËÙ«u9•9C…áÂtØÔÌŠ®2ŠàG—ë©»1ˆ?‘²jàƒ’ÅPCÍ'4aü‰À»á™@aŒQ tŒê°F'ŠR'b ¤JÌÞµÔÆœ“¦€‰Š⪞ïh.%XâYíÂKª©”Tª‰‘¡7DÍ"µW­gÌDXžT5JÃAR×·ÀåGÄ7a¶Löö&Ísˆ‘=fòsÓüþÇŸ˜P˜Ùêø³Ë‹‹£ÉǸ?Ÿ­ÌÞžiöüÜâ÷á¸ñúf¥k¬xV¯QXœ÷7ïHŸÊÍ»d 8Ñ(jž-æ'Ó•94ͳ'û¦y1}·2mxñþí/ŽÏ¦“æØ3­–:çöŸ4ϧËùåâdºl—“Úöëôôüøñü9T R¡#(:^ ·¥¯5´á(káH˜°k¡Ø’-˜éFŠ6b1è‚«ùÑ $ Ö#ø½@/ÎbÂ÷Óú “k QZÙm¡µì@kBkéÒ*Vçm/0¦l}‘~ æ¾Å ôXø¸xÝ1ïøæÑl6Çh‡íž¬öÔ-Y…ŽþŠœ4—/Wõù—óÙ›Ióx¾8.Z5îH9¹Žu\ÈfQÄ’) ùŸ30j LóÓüÅÜ üžÎV‹ùéåÉê|>û˱[Íõ÷àõùòø; ÐhC47¸XT˜VdŠÁôr!íb‡&Œ3½yÚ ºCFÏ“²%OÒè ªµØÇ×A(­–F½À’-Ø {( b¾H¹X–{Û%o]@×çøh¶|ÚdËÇñlyÀV$©ØâS?0z­ôQ¬[2bpÁ&Éý@Å’ûÿl“$›¼ãU«ù.¯ðÚ‰+6ûØņ!@TñÖÅ8dv­ÅwmÞ #è^öÌÀ›,à\5š…°ÐáqËZØâT‰‹ú”ƒ7è$°¶^íx,Íû-,”ñ,°ÀB$ÙYÞºÐt€‘‚ !ô)xº¼~Ã+o© 8Ý…OêG½OhëÇH»×¨ÑôÎÉ3Ö!_ëG,=8hm-Û~\,æ ­Ô~>ž^œÏÎv.Ù¡ºn0WƒÞ{uéîÊÛ<R0u@BXª·ÖAÜ-˜p¢î‰·åq§`BeERú>¡VtFú6–˜7>Êø„ñ:áÅ}&áoÉpY‚Þ‘-z¥'$ªòQ'MÍ¿I÷Ûó§íσ׫ÕÛï›æêêÊžÍ.í|qÖ,ç¯VW0·9[.›[gÀ­)‹z/ +pfh‹…tïÖÔLŠiĹè>C6s@üø­GhÀÜî}~“ïë–’S†–œ’6}Rröþ#_“ÛâkÞÁ×2Ä× ðܽXì«Àšßq·O[?ùñJ´Û ¾Ò·$xÚ!ÁÓï€|!+Éùk´¥|Kiçó×'4Ó¦OÙ÷©óÅä«\¿å-:yà…ß|3ù¤êÈáºêh¿´Š®…rç:;±õú‘’ÿ¹Ö!ª|×ÿdi_No¦Ó÷vzzÙ|x}~qº¸ü»y3]àÅ|LQB>XçôS)ۤߩ>uÓBq–´¯†ížmsìÛÓW7–ýÈ‚‚à endstream endobj 2494 0 obj << /Length 2155 /Filter /FlateDecode >> stream xÚYYsÜ6 ~ϯØÙ'íLV–Dêò›8mš¦“&nûÐt:²V»ÒD·:bûß @»²Ót2c‘ ~8€wåÀ?w;«P;–Ñ*­^8šÚV4øøÃ —×maáv²òúöÅÅß_¹Ž;±»ºÝOEÝîVZWÇãfëEVVÍVa]_Ò÷C£:¥™©*‰tóÐeu[¨ººBZžô6Ýþôâæv@á{Þ„‹+Ïð†€WØf¼A$mWHÂ{m ÛÛlýÀ³ÞeÍÀò¬¬Q€G„¾Uì²z”®øì¸2M:€ŠðN­frC;‚„þ‘ö­ˆ|д®³´# EXI“'‚ku×JîʢͳÝK`ı…'5mG«º¼¨´m‡¤¢yÑò3‹ƒ´Å&Ÿòeƒ¾@½ôW=Œ(½”ÓšÛõ]Ò¤Âý½FG‹¡Ißf;{³ Dd}RDêrÊì´,X<ÎCë¾(Kâ´4J˜Ð5¤%Š`Q  ÈBd,¯` £@£%-ì3¼·Ó­ J¦‰)…Ÿ2«]¾e\äï`õÂErôþõRHøvè +@R¹$ÇõíHÆÏʉm rº<#„©ê%?;¾ƒˆs´BG4µ§ï°uƒj3Ó´Äx“Uk tYSuÒ‘#] -,½ÑE¼ÎtmmË­ëI;ŒØ¢ógm?Xí;„¾„ƒ(ëö!^kžk0ðhŠš ï®èÚúûþÓ5 R ßiäÍ(c¯šuÖ¡¨{ü£š/¤ÎVÆ>Åòté$b‡ƒY ©µ6Ãæá£™:ôèr1BÛ w¹-Ü$¿ûxíÿýéæ—×W¿Ýþø÷ï®í,…ÇÖ³=Íw^íÁ‹˜É iäIgF¨¨ÁúP¨crÅ‹Y„/ðîó"EvNÓ¯h†¬Á„MíÜQx`Or< >ç‚1¨C ñýÖžñHãV;¯F7òåå$dt97¼1·87·ü_æ~õþõïŽí}ÓÈ\ètR‘1$šcr„ H•‘E±$Uî2~¥|¥ Ÿ;Ïz»'V¡57‰yRuHX£*>vš^£ôYŸþê’âCôe I‹8‡ÂH‡ï¹IĔ¡œ&ˆP ¯BëQHH¹Çyp¾@~X7%h ‹¯)ö$ŠNΑW J½ÊÚ69˜Å-ïU~$çðCiî‰ i—·deËD8}áÚÏ{‘‰S(ˆF\‚qÁWãâ ›ÂÂ;Ω@Na`y6…Õ¼L;([ñd+ÂÖÓÍÈ·9mD$$Æi¼àõ‘¾·oº‘‘»TUqç’Q’¾¸€7Š""„Žæ³ÃDD ¼IêA.ÙéÉb/rõaûñæWN¶Š,M‰gæ ¼PÒŸ­>¬o$:xÌ|0Ëœ’¢$ì×þŽLñHdŒyU—ÄÝiïp $ü`"ÑUjª_*S/ÚFù5ÓŸ/m_øgšâ07„à"¾j= *h"5m2Èã‘Óˆ¶,•®|ÓÒ4äÍÅléEöIY£µ³æ¨šîr½æ–¡ìÙzÝd•ê2ÈíMTÙbKƒæˆàŒY>Ýý²‡¤¢Þæ)@³í É—â²,êþᮿãàùß>š÷Î!+o¹›h¨SÇgMvÜq‘§4fˆ ±N§H¢ê 9]¦cŠ,¸Ðq%Ƶì$ÂÃ1š¿‹:³‡hšÖzæ’=/)iÇ#­¦/×0orq0KÀòUÒaÜA𹥆Ñ41c‡YP$ »¯¡É|V6Ã{²Š#d/vÈ8FÈ^S=1 ,-@XÐù! —†; o$™ÞÇÚ 8ЈqÀˆCk8Û4ÁªŒ_ý@À# ÞT5 ¼ë^.·„c]ðóÞñ‚¯<Æ‚ŠÄÁ°4e¥hå~ƒAH Ãô®ïhQY|Ñ­K`¶ó©üˆ¹!sáte=Õá'ccqà‰1›é¥óryžÔz]m]ÝLBc×a:J°®ºáB½ÀíBï¡hÁ¬Žº³†¸5ù“X\baDiøÚ_ˆxI Wýˆ€Ùìiä†t#€NoW7± ^Ü™²~Ô@¡#ÑXx/”'±„”q!ÝÝáL.ð/ƒ~ -ÅP,fí2N'Ǥé ÏÇy¥ãš/ô…Æc¸Š§í‡¤öãæAÿ6aÒvàÐ^_LYßׄ¼š>8NÊ®˜øWÈÉkJÐg‡-‰Èš™ò“†TŒ/Vct]Ïî¡Ëõ}ÑåªïÆ÷B>}HŽu&S="0’?÷  —Tv=;Š3-(tš®DúŒ±¸ $C7…#¤Â …ãùb`º‹SÌ[F‚¨=/þÔ¦Ž³Y©ˆQáZ¢¡J7¥: qèLTU%¦W¶ù·Fß´äTd Ž¦4&–‹&>«ÍõìrznæÕ6Ø7Ķˆ9ëM:•Iˆú>óô\è?Öºïøì 鬗RÑ:Åà{¾uÑ·ÍE©@ó‹¬K/Zxç…ªz¿^ÈÊër.÷?õaŸf-gz[ƒáåZì‰Ë¿/gÖ–BKT"ðÚسÔ1¿ü†ÒJÄá—ͨŽ}G½*°’'ß­uvOÈò…¤‚ÉQ|îpXÇéF™6k)UÏLÏY,Ì#dšXÓÀè )-Ž:\ciº)Í"»pŠ `4ÅX´bî6 ·ŽF€ªÍi1†|ã~x‰7O·`Išªž¬¿—JÏz³´v <ÞXplUªs >ós(> "é÷?|Gd±¹²0â+sÀ7û§'SŬv Ć™ŒÈ ¯Ìü UdÐ endstream endobj 2497 0 obj << /Length 2416 /Filter /FlateDecode >> stream xÚ­ÛnÛFö=_!ô%4Ñ$‡äö!vœnšÍ&mÕÍC[4IY„)Rå%¶óõ=·áE¢cXè3gÎûeÜ•?w;+­”ûÑ*Ý¿pÚܬxñó/\Á[âz‚y±yqþ6V®cÇNì®6Û)©M¶úÍz}8œ­½ÈÊ«¬¸?[+¥¬‹ïùû©©»šÓºdÐÕ}—WmQW-À•¯|ËóÕÙ›_\m.Ï{&»ˆù4¿aäÛ®ò™ß}ÝäÀ‹ïSûC™ßó&é»]Ý_“˜3çÄ{&èEËßC™TUžÙgk_;Ö©¾2»Üµ¤æïmUŸÁ…;Þí`£ÍæÃ»Íù¿óbŸ%%ªD\»Êvf<«Y…D—"™]NŸ[>š a ×Ýø@(°ƒH(½Ûïp+)K^ h>™©iò´ãM›7_vÞ˜=ŠB÷øS!뽡q¸]þ ¶kåe›ãAl%#äMS)míÏրѶÉM.´»¦¨nxý»8Hwy³/ª¤Ë3i=È4*‡ ÀU5Áá˜FRZ+ˆ¬_[”š<ÉxŦRøÇ®ß´oŒ8rUFt»9ýü¯>)…NÍ߯yS¿ÂeLöŠÔxÖäö oÜ€ž\+›Þeá]Ye}s“gl}&¥ ÷ Ú×]·»º%‰}ߺ"; B ×jx—&•¹ÇŠHùÆRÛƒ•ØLxÀ.€pVÏѽÑcÈ÷ÎßjˆDe;Љ •çÙ’6.legë ô¬ÏÈVQ+BAV[|Í™Æ<šQ3ÚM0¿=‹”E^¥µÕ€~ t6Y‡iêk®oÝ¡-ÓØE[è¼H‘0¬k¹O¡#ÉäÕH‚DEø,8/‘‹õAèTIù`p)p4΂u÷&”–,ߤ½åÅ–,‹;Ò$ Ää (yGú¢U½å/˜Ì v­ N—vùxÊ+vX4yË™¼&#äºïxQ˜oËߪî”ñ¨úº,nžJA‚û•x‰úÿZ{ƒòýϱ]>œ*yî~æ¯úæFâ‹16—ŸF¿Ü3ʇ_~0e毡~¨È³uä¯_ÛŽ«°‚üö‡³Êà„³}½º#ÌýJÙžV°*W¿¼øi©Ì¨(´#(…¶Öâã?^˜Œ¤À~Ý΄n> ¢Nvß‹¿‡S²k/ŒlÇå‰×oÞ}¼üô~óççwÿ}ó¢'ðë_üqî#g)nÐN>5‚ë¡´uùá ²Ú÷ÊÚ׬}ØgOyË[ôX(c‘UÜ#«|4²Sô®):Õ»'Ò”ØåÚ†ÿ*—!"šky»¨º™Ä¢¹—¿C ´~ùŠÕu²¯OWGÚ~¶r·lÖ¼J›‡ƒÉý¾…Ù¡•<[%×e..NšßR fftkª‹mwÝÎÔˆ€¦ ™À®ÅÄíD+—e1‹¢¡6$U{7 ²ŠÊP_Sµqh“lµéó|Kâ¶-LÝÿÿg¬ötõ4=VTÜ@ÊļøÝ³m¶aÿ£*ä’¥5+D½od[ˆÿaçP²%ñ2‹ pªïCVÅòN]GM×ÉF²>â†x)Qf²Æ °BÅáÈ:“2PÒ†’o%Y¶èí:´C/|~ä¬ïIâÞMÿ#rmy"¤½F íÞ'•‘ý‘2rÛs½£ée‹µ©†q8@$ö:îšñ¯È±£¡QH¦84í0Ü©’½ÀøÿTJ3B½ö 2¸ „šõygh³p:3îa–èÍ?v»|!Æ™^[·m¿çd±5ÓØëO럯~g}™aÐÁ J·œÝ8²uý 3¹Çìì¨'sãˆçM ÷ǵ¥¨Ò²ÏL²ö\׎U0¯ÎÓ,â;1u#øåbÚ¾Ò)Np®caÙÅ¿Ä5Ä •r\·dhÄÄñ z.ZX{0Í(@ÉeJàB,1íX­ÎpA:£0ìÞ /ø%„ Œ»èZ‰{†>Ïõˆi·Ê’&ãÝû¼ 7õ#D·=*‡¦_Z)9bÒV1ÙBî<\/øëìy§ß ‡^èѬ¶? µåÃ,o×)ó”®Ó&EA¢xC„¬),3ŸŽŽnì³€é°äH°6Å•[jø[ö.‰Vp’¯Š®H  ÍÅqæ^5…jÖã—/‚¼OðY€7¨M˜ÍŽ^At}žå£ÚñˆŸJÐiIúÆ:bòžoë²äIŸDQ‡ÝQO*"ÀÙ-f†FV¶@»¯Ògõ‡í®îËì$$§ÍÊbÇîEМÌTt Œ ŠìÜ„cѼͤ?‡U³ l‹JußñÔã:ÝA]ã‰hNŸÛÇ/dåÈbâ†ÅÄs®§ôdÉ/1êW‹~µè1§„h{óRÜòù‡ =…ú–2KÚqÕ¤ÛºoŒXËVJøÅÕaoÆ…©¸† v>.xÒö×CÂð1žµдÍRm³¥ùñ1Œñ{œùzA›ÄÌÒKô˜•‹éÓ÷¬×eɰQy-„F;løt,¾ãLºg°÷æåtxcíYs=EsÝúòJu¤þ¶ì\Ô Þƒü? !Ô9ò›v÷&T¾Œ!tLƒIõx@NÈGà“1v’ÃH"м0ž¿¾¢Ç{‘gJXÏOAˆVd|›[í0>É÷róìƒMယÂ)n„ ¯~£ ïw|†‘~Ë?É#GöÄÇÄ¿J< ± endstream endobj 2500 0 obj << /Length 1563 /Filter /FlateDecode >> stream xÚ¥ËrÛ6ðî¯Ð‘š‰‚_žéÁΣMÓ4Xõ¥éa‹cŠT *±ûõÝÅ.øéDmÇ3&°Ø]ì{‹þÄ" ‰”~¦ÒÅfwXh{· Å§Ïã­q5¼\Ÿ½|E øY‰ÅúvÌj],þð.öûå*L=]åÃr%¥ô.Ïéû[Ût=Ü4Þ¡­X„ (¼tK‘Ù>Ÿ¬¦,´O ÒW ýïö•&ßc¾"Ðå.®'7[J8ŒÍ¶Yr°“~p𵬸fßP}§±â&(®Ý;_Ͱ*PÀžâd}÷ò#8Wf‰÷j"_ ¼«©5¦I^êä¾(H±t§°ÌDm ƒ¹Ü93ŒRÂudÀa†ìøÆ°¿Q†ÃjFÖñ…áp¡¨(þ{wì³Þ6F?µ¥!Ð(ðÀ£76ä8 |Î{Ý–Vo®è¢!Ÿl—z‹ÿ?þþ鸒L]ÆÉ54¶”›„¬†û ­Þ]y–q.»2¯J“S;Âsrê¦k\ÅS È/%¥¡P›(¼IXb â£dnçc0ÊÇÔæã³©…G‚âf<ØC/»öéù[„òoM+[]õ¯C^Èqá2Á@ôÝ#Õ+}˜y7Õ¸› O›×¡wQ1«KÕYÃb1¹Š1Rƒ÷aãìîlfca$Üùœcÿ}.Šo'#¤T¤”매!'d¼Ë¿iä÷.q©'™`&éØO²B‰QC mA[ô n릣H°°Qƒ‹ŸäóÕf/ñµ”ªz%`ðc%³4yYЊ] Y¡-eŒÝ 6 E?0íŽÙ?ñC‘°!G­Þ3tëª ….Ì0DýŠ„jP­ÿYSþÚ´»œ›ÇNî™@?T¥q“âÂr¸I mßpê¥M&»¬G¢æÝ·Ÿñä>y¸À"ŽßJ×w[†aÂá·œæú~¸ºd¬†;dÎÏ¢Lí0¾ý¨pm‘íÁã³3z_™¹…³%Jn9÷ò„@à÷Í£¾ctÜØ<‡z$æµ—.çvšýÔÔ~Ô«°~€R8z‹=1îQx:“nZ 1O°ù€“§_Hj¡¦Ï¾^N°úÿ4ò‘UgPN·öÛ Í»Õü¤‘°vƒ 6¡Þ¾ÒµPK…=½ž™/wyÁ+*ø$Ü4ntáRjJw‡m€ÄEKzûño>i“Dè™Ô!m¸d…ÊcöÀ¥*‚ãÂG ;êÀâFÎY —ø±ìŸ6t ¿ì󟨴iê G™yw% ͆¶<—SÞØép¿¢f9þ{dVT3ò;û(FX?†›©®+KïõТ Æ_Xœ.ïCwÊ™—3nßGfBckEûÒ§ÂðÜ‹Px¸÷úŽK}÷#Ï?FÀ¡# endstream endobj 2505 0 obj << /Length 2800 /Filter /FlateDecode >> stream xÚ¥MwÛÆñî_Áöåö €Å§^_ŸeÉNTÇŽb1ÉÁõV$B`P²zèoï|-RPl·ìÎÎÎÎ÷Ì.½™ ?o–º³X)' ’Y¾yá´]ÎxðáûžàÙ€h0_-^œ¾ Ùç:©›z³ÅݘԢ˜}´Î·Û¹í'–®‹òóÜVJY¯Îø{Ý6}C‹yS1èõç^×]ÙÔÀU ËÂù§Å?_¼^ \„¾ÿ•ì"æøõÜVƒY”ާfz̆ R«¹ãïÛ¹[ï~uŸy³« Þ²˜<Ùd…vævúÖ›y¢¬¦e¸þœm¶• ­»•®*w;ÑSÓi9´_é1C×ÊZÙR7üý—ë ‚ff¶ÇØžr¼x(ûjvdh w4–; 7@M„ÿWA9PMèÄ~l0l4^àZ›"æ%Nú_$– TM¤¬+f±_•õš©ƒÌ ëm•õ’yV3l¯ku¨º‚A">îÖí¦¬³j¤ ‚ß‘E´®šeY;¬Ið7ñD“ózƒ.zV^•ºžÃ1½ÌÙô8ÌŠbJ+©çø¡ú&OéÖ¿ôþ”JâQh0záw/9ÍóÇ­Ñ‚J¤ƒÐì‹öºšÛžÕÎ=ë=^·ãeØYÃJQæYDꡬä¼]'KºÎÛÇm±$:ö¼Ø ãèPÉ?–ë¹±h&ÏzÎ&`È´q4²~`5uõÈà¦Lñ†Vhˆ©•˜úTó—·C* ‚À Åì ±9I,ÁtUc2J(èd8Ýpî*@š!& qŒZåQÞl6™™”B+¯tÖò°ù>jMÖz˜“ëTd‚qЂìy*Ù«‚á³ PX1‘DÑ%—øèt¾ã´ P°ZË£U†§ß£¤Ð9/xCß 06³$¡µX^Jsš|ë¦gôVgÙ €ƒ¶ms[é ÃØf0XW@†Ì…"¹IN„Ï3æ,\ölÕßçè2ÿ&we…1sL€‹O˜?™ßWæ÷ƒ#ó{š)-ã\¸ƒ­ƒu‡+ƒŠ2ULeŸU:€q1ºxÆÞ$ÈŸ&ÒƒŸ¸N’ÿo–I•_H2^4`ds¾mIÑnø4Mž¨¼Ôñ ÎqmGþÅ:í±šãòšWyd=ÞPR(‚†@BôÉ{¦’™P7M/Åm“ÑñÐýI~:?â* ˜é•xi ¾dåL²–ŠŒñbÅ9­Y—°N]î¼ã/sn>y·ˆëÐTXÔŸË®ïxѰ3ìÌr?ÓD! Ñ~®—Ý+$ázà õ®uuÇ+½øCºg E3ò„Dê–räò„Ç{úé`½Ä´ŠXç)$¹š$ãæ#yÒ®(.¶mYçå–½,y&–ίí¯ÆðÙ]bþb,—O}ŽÄÆz]QÍ2îgdP@Ù(iâ‹gïÝÖ·%Ùèh …òî‘ç=FA&‹ƒš`¼8•4ÐÖ„X”QÀª­¸“›o1Q¸÷‡z¨M¬µ‡Náˆc¡È Â+—ýØ£C1êÞÍ ‚³NŸ­è!$⣸Ëʪ›$ᲆZÂ8Œ°§á 5Õ)¤X bžU%¶©~Êb"D*ŒŒápÌ•,ņ`³%Í=¥…‡P;cöW¢×ðÆÁ1R”O"À½6ï 2' G¶?˜ƒ4à>I†pŸc¥ùWå “H!Øšý$ÄÑ•1 øzEÝ9¹bÁˆvu­sAn„­Á/¶jÈ•J7À a†4ÛI}ÏKÔº©f­¦ü(ù``F&`ú Ýý …龜·eŽ †Ä $1¨½úŽ÷ü¥ƒ® h6šn68Á£©5ÆÉð–€btêöøNz_ß"!o²Ñ&Uúõw|y#áÀ˜ ÇTqPrwÖLrïÂú[š[äÞÿ¹OœdOè R›wüu†jGPy‚òî¸ÑÑ¥vÛênx2P¾Ë‘_æ»bðXòeËŠ|ôà &CRG:㾦ւ?TòÃ#¡;ÎÆÃ1^*'˜8ù舱 Ïåòw®¾¦9u„·;ßt„‰“¦©é®eo5Õ›C$ÆF©ìKÈCnØý\A•Èû¦}®9„+†Ÿ˜æpòÍËÎÓÁÄÐ*Úùmnçm>E2Џ’ þP-!Ùõ« ^T8;­_&ýP9q˜Ì”ë;Ü–ðuÒ aÍAJÀ=SBÆï•f¿="0ñfy| ' Pi ùóP·8øxÍz³l³íªÌö“\GîKýð òsà{Ö–ºþÀ ­'Ï­A8~ìõü“«Áþ‚ÇDG)YÜÑ+(ކÎP%Bxì—¯oð…zPª ôBêßÐÅÖºÛm ®©&/dUטãòjWà=y"DÝû͛B?´Šìá¥î0usqã¼ÒíZWúÑy}ù c¼iK¼Ã—5l %€§Î”¦ž]ß,œ¦ÑDëvÞ‚•+}ÆH¡.±aÃo——ݧ2âuÖ¯dk†:þ 0>…‡’}­hèX—Ù=Þ pzΟ߲%8ÍS)Þë‡nÙ6»mwö\ßìn‡ü!¨Œð^öÅ« §–㯎Ò3Â~¥ÔÜMѾ-=?SéÛ‘ xÉ; ’3Ofß¿[LÈôS»Ìj9V(þR—÷xyïmtüA§T—Ù ŒR§8üzr£&åMa¼ãwûêRÐþ¬ÂèÞýNÕÍK²³sk¬¦‹Ý?&˜ÿ ït«ë|8 H¨´*¿Sªy¹ÌÊÌ©;gׯŸîÞ¿_\Û×Ðá–õÒþ¾Bgp¼;`Âäñ?†äœºÔQÅýöñ“;+9*Mf„µŠ W5»yñ3gîqÖJC'‰âYª +©ƒ¬åC•R*Ç×D7¦¤•¸é¾"Ó»°ù«¦ç)¦üæÍ–RM[.Ws?µ(9áÂ-Îy|Io P@ÐoónËdgoÈ.¼ §ÂµRŽæ… ©…~¾ûÐVùó‰˜Éê¦.sLë8¥Wü÷IêëÐ÷«¤ù1NßUß\ùÍv{¿Ÿt¯¼‘ZÎ Å®ú~{vzúððplÿÓÿ@b9Ý<Ú[ÐvwºÖvÖÙå½}Û6k] ·ZÇÆü?)òÿ¶  endstream endobj 2508 0 obj << /Length 1600 /Filter /FlateDecode >> stream xÚXmoÛ6þž_áb–b½8޳¶[ã&[ÖµhV£Ã°%Ñ6k‰D*¶÷ëw_ôb9-%ÏÝs¼;ÚLàç æ“Á,Üyx5ˆ³³IõµXÔà÷ŸÏ<-瀠ӼYž]ÜM§oâÎ'so°\5U-“Á_Ã×y>rü«!¦ Ùœ †7×êù¡`‚U“1KÕ§Û½À”F9| úáåèïå¯g·K‹bêûßWJã½ìཛྷÁëU¨ðÞÓ,›Q!Hœbõò"Üó”|ì§5"È¥Ü-ÅÖÅIùj,áÁvޏÞÔSZÞ#R¨¥Ÿ0-×,G©Öôï?e¨ âØjQ³;ð¾îS¨î¹zŠ .46DbCèÚj0C¢-)¹…ej°Å½šwfîÝOn{ý›ÛÎâf¡^2–à @ÿÒ &àŸ˜•È•ç˱Ö"™®6TxÃ8¦NLr°Dà½Ð³B x«MÙx£†ŽÙ.ø±n–×)‰µÑk¸Œ?ã.ÊÕªÇ8Lãâ œhDl:îzÛ6æ†Eà,o2 ß¡âÐÞÑ>"Q,È“¡.‘FÕ iǾŒ$IŠÍË<§©©†‰µ1”eú{ž"B+×öÀˆRoõ’ÞØŒ|; ôÈu¿]o½=ZŸÆÆ3IÍŠ–bÀH§‚iט—©° 6âF. §î•wÕ¶ðµóJ&)½°.¬‹–R‰Ó§eW4ŒL8.¿t¨V+':l½tµz¯<5;D …&º«°Î/udjk¢Rï“0Ìé¹~ÁOæn)ÛÙÄa\ß!êÃã—snî¦"*Æ]VQûB,Ü£µ–Š'‰z×GÔÄÒäõsÄ͇ͤ×d¥©ó/.ïᲉâTgêWÇJçPšà¢þ½i_ç©ã|«Û)<_±ümJÅ˱¶æ3û¶v-¼jÑ=+Z‡÷¥M }vÊoÛÁïÙaÑ'WÔY«¤$ËY!à8¨_Jº­´ôâþ¿¥“#K»ž8å~-klÏìÆÄÞ„½“2¶µÐ: ’mɳEߨtuB°5¯Çni\#$m˜ªªœ—Y. ­ºî¢5Ï”lq+—É©ñ ¡ÿr|GR-q7š€ CBmо?I3æ®çë ”^¸mGþlhtÃû牦zn¥´Uc§Ü›Ìã‚Dêî•è9ªžB) +%#o˜ê×4 ÖÉ÷}È€U€¶Wì{ÑOg®?óìùØì§e¢P„ÅÓHBƒd)H¦¾h´)“3;·ãÏæî8q¼™ëͦ /U™ôÕ%ÞpQµêš 9V\T#ËC7~,?d½u‘ZÔEÄŸL.õ ‡´‡°înLsžšà‘E„M eìݘe¯úöÜ‘__\ìv;·–¼(I‰ ˜_´}ßi C6#ä ‚K̵>‰w1Éè ?MÕ/¸æ×¡wûfÙ0®™üŽ—ßÝ/mê°Ž6Ù¬0”‰Ö‰äPâT$Íc#Z´×’>ƒ—¦öºýl£#4·• DR“•¬ M„sSÁO,}ªÕéA†L1bn eo³+˜Ùâ¾c÷†í°­\UÑæP[ÂôEDÌí ®ÊŒ´ õ¿ˆ²Nž¨ ùL²Ä(³f˜„™°à]"­T“ÑsÁ1n Œ¬Ç úº”ˆz ïq_*ŽM„,S£?MØ®¾n0Ky‡˜(%|cv'‚ãtuâ®™àeÖ"»ÇU+[ «Ûö6àîšÿ þ2Ðë endstream endobj 2511 0 obj << /Length 1026 /Filter /FlateDecode >> stream xÚ¥WÛnã6}ÏWøÑ EËqj´@²Ø]¤@E×oÙÀ ¥‘M„" ‘Jì]ôßK‰],)1PäA=žsxfÈøOÿù“;or†îÝ|9‰³+¯ÍwóòÏ×+߯9:ÐiE>¬¯n¾DÑÄ÷Ü;ïΟ¬Óvªu2yšÞ3'XN'ô8sÂ0œ>üfžçB‰êÇX03ôù¨€K*¸Ôãá<œOƒùíìyýçÕçu" ‚ á–‘}¼‹3¼‹[ý¹œ¼ë=Ìô¼hš ÆÄå;óùÉaôÅþ$U^ĪÈíg)åTÔåe¬Ð1DÙ…9ÿz\›—8)²-‰i Žº~ä›õSÊjyF”;s|/ò¦÷Œ™áW ° „@¹yrPo"1Ûyy/“‚£²Óm¾ûïŸÝ –ï»óh>q‚…z›E]…þª¢‚ ²Ë  \ù‹M]òÙ*›WÈ˽] ÞôæÚÄxÇÈ ÌëõÍ(fá p•ŸL\ùJA>]?¯ª N‰™õï sU$‚±\TL¨&HDÒŸ°×åË‹l‹ì ¸^Ajªßb* +Ÿo…Oí¦e9ü÷äˆEÁ$+Pí´Ú¥9–uQ~4¥ûÔÅþ<ʶ…“ 6êt€rO£Û¨&Ê…8ä u¶ÿC·»¤¢HE²ÃÍ2t‰‘¯\,W#vÚ2¿ÔµxSleÞ¢àìôÇ?~7ÏySŒ¶Ê¤ª[¶-3Z .÷óøÎ^Z¢ øNí?”3!Š<™ØÁ¢óQJ~)2㬠+àÃFàtzZpÖïÛÍí¼ Û-„ÅÿFÕþ¬¹û FÇ[Ÿ¼§ñ~@n\¨NYz‡°G'".²Úmo‚BíEI·¡WëhkH kWÁô1Þ{e7o2Îé—ë×§}7}¿;d“â˜v˜†f$T±X„æ¼FD[;J8ž”99Õ.:bêS^¶w­{îêÊOémLAÌ# Î,Q"Xú ‰*‹uM-¤nÉ[½/-[­DíQzC¿ÛVZÛ¡Y¡ ¾‰æ^ÒÛ¸ Ü‹‚¡š0àV(o"zÐ3ì8$çè™u¶“BBG';-Å+´n8•útKÀºµ¶¯^׊‘’ØÎ…ì lÐÜ¢ÅmÚ“,pt<ÍUOðÑYɨŠ5Ÿˆ-vMq`†Q!J -"9Ì ûa~¦éAHz–ª¯ç÷7´†/ÒTr=nxkl— *ø@$B4.”=wun±L_8Þ­½ÍßíÓ1ú½“²o”N84×}¿£¤#}d¤Çw¯Lˆ °pZU>h[ƒf¨È/¹°Tûy@Õû\ü/ê?Ž˜Ð endstream endobj 2516 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚXÛrÛ6}÷WhüdϘŒ(J¶œ§ÚiÜ*ñØ[íKšÑ@äRBB,ê’¯/(by夓Ê$€=g÷ìñCýÏÜ7¾ïÞŽ§ƒ 9ߊõ øñòÇ™gÖ9z¡S[y¿8{÷0™ ¼¡{;¼õ‹¨~Ô"|¹¸KÓKg4½Òý¥ãûþÅýûâ9\ñãÇ€ÇÅ«{LRΤ~ïýñÅh<½üºøtöqQ¢˜ŒF? 7_ÙÅ{ÝÂ{=»ž?.ð.6p©÷M.X–,ž¤œS²xQˆÃâ'ÅW<ŽùÌÛÕ¡x’âðŒ)—nTˆB‰“â'ZßR}\@S»xæèÚõ‡#ãø $MÒq3ó‚šfW CD÷ÈyGÕ¦ÁÚ»¶p\QU|­Õƽt¼ádxñÀE?cÂŒ F@:‘«Ö¾7}í "Ì޻׳YñXÀC¤¦`¯Ú$/ž?@p\%ʈâ¢cðᨓ¡ÅPÔÈ4…W‹‡Ú…Ù´wWîÒÁ³¸À¦ "¥ú+æ5ÙÉt b[™ß8e]yȘȴâx0ÓËÕ"¤) H\üñ:jñ'JWŒŽ¢`O´°¡­ bK°H´ôF±ðÏÅbþn·Û¹ç.õÛÃó³ûôqahñ KAŽšÊ–»l’µQ?ÏÍœŸª%ç5 翤°*ê(Ϋ˜§9¥v¼ùþö-¸kô²Wcáôùå~²|Z,ç/³§³ùÝ£‰Á¨i—½¾ü½œ=½.̪‰}Õ_³ßÍPFã!”³aH TçnjÔX¡‰#€P„2,‰†i„•î´†eÑë[EJËӠн1 eYªdO“6þï``íˆY´Š©Ü n¢ª¤êJauM_ÖoIœÁ[Å%KV šb— s ,û C·Â~â™Ðy·7ÃÓ¾š¶\µe|ÚÛ|KP[ùÔаîÀŠ6žSãmW4× C`ÍÜìOŸ-ö‰:l×ЪŸæž>í |óà»qò±Lf%H6IWý¸…­F·^·vhsÇ4±8£U ü&™¤¬' '˜ö­DÏ„³IH}¬äO’¢õcÒ*U<ÿÿp†ÞÌ+€Õ)§ƒ¤;œê„ݦA³Krq°†ñó4ïlU¢ÎÚ'Iúãç:}×d§èªë"Žr@"åðVwÆBIáµ+Ks%}yb)9VÇ¿‘è\ªiÂ☚Y™¥úP;å·¿Õvk{@h…|ÌW«`žã‘‘=³tDcXꊞµlpGQ ÷“¡×ŠVH£HÇa™aviì%ùþ¸ÆóÜñdÜÄêå9fæä8Æ#¬5œ–ajÀmÊfšËÃ%å/ÞW×iTYúÕk˜Ù¦8ÇDëÚäB]@EH!ŽP·­°Ô«wãzÓQ‘^¡U]z+ˆW”|—ÓØVìò-<Þš¯,œW–þà4bd.{Ú£-{½Â©’›jˆÍo#qkŒWú¥Âê‰ó†Úñ#ŽÑ(¿C7xKH‰ ª'}þ͈NmE«rÑ›î ù†CLyÔW,|‡|,ª—}z zÜBlʶƒ ë¾›ç×7Y9¨ºŒ¤Óš-“ÿ(…4o«L•CZÙºx媹jgµfÐ-ùgž©š©cKæìª5Ðf”f"åx+ñ4Ή Ì;ã ~ ±:œšròÂ_ ’wÇ+T ßÒêZ\öŠÏ0óƒ8 ;ŽÈ}(èz£JE—#9ÖŠ»ÇGüžÿÿ¥ endstream endobj 2520 0 obj << /Length 1271 /Filter /FlateDecode >> stream xÚµWMoã6½çW{YgaË%ËvÒˆÝ¤Í¶ŠÆ—"¤ŒDÙldR ©8FÑÿ^RCÊ’¬5öRÄ¿†œ7ó†v0ðõ_0XøƒYz‹h>Hv~5+6èüñÓE`íÆÚpܰ\®/&wÓé ð½…¿ë¬yÔ:<oŠârŒæCÂRú~9Ãp¸¼‚öwÁ¯žÃÔí»"LRΤž£0¢hqù´þ|q»®QLúF¸ÆòoÜÁÏ#/#À›ð‚í}ЦCžA«¶:)OÊaÊ. h .@¶Æ‚ðl#Ê’¼L)ÛÀpÇSšÑWöž lr7Óù‹¼0Š‘Á£Œ^-ÎÒ‹õÎ ×C8›W‚¤„]†ÁPQœÛ9œ˜ g²¤ ‹ôïhngï.‘Ƽà ü¶yÓ~ƒ… K¸ÓŒ$àN“dÝ™9íNO8“/~å¶ŸƒªO%´)‘‰ /P©]c¦EÚî!Y€-¢P{Åhð•~ñÔ{o4Ó™‡fÈÙ~9§†Œ6„pøfb!âE“²3g Æ! ½h1× ½`À!ÎùÞëƒhr8ó‚YÜÈ¡aý}:ÜÙ¬Æ8q†Ž8Óâª^MZåÁ`+^Ýlm=~ñ§þJÿ `ˆ|?#?aø@wœA÷3—$“Ò ¿“Ç¥¿Ý’ÇÅæ‡–O›‡­RÅÕdÒ2œÈ-ÕŸI’˜X)Ý¿bi‘–EŠIµóðÛùRXìt€®üè*°­nÖÇØœ {¡ï\ÐWÒ¹³¿ÝÛ=P1Ði$Ú•¬K¡$n'M¶˜X––ÐÜä9a-“‚¼!I_¬„m(#Z R«Õ(̽wÂÐDeRf˜uÀ'ZIŽµÒ„­oÚiu0nW¥Â,ÅÂ"aN¶œ˜9ˆ˜öF»¼Vbvoá®Ü‘WÚM%g£¯åý\ uw¢@²/³Ïs¾×â9FïBÀú ç¥n,H;ËŒ¨=¯–üƒ"NÁS"NNR佃äæauïõ\ÒˆæŸÊÀJO sI™ âguŒú~6¤“w +“OÐúïº#èšôpÛ>pK°ŽC¦9f6;žÃYn‹œÚ§Ìúk‡wÆ»ô•‡¦7ùø¤½Åsô?x+„VjZ¸‚Ñþ­ÏõôuOFNª¬ËÇOO°cÜÇÍ¿×}¼6^#ßóçhUxs ‚æ×)±Âõ=4?’\á5Ý‘sÁŸZñÚ_ó†™VTüæOmâþ`ë‡ÊéwuŠS…´»&]“<í^¸c ‚Èú«’»‡–ûž°m©ÈQ­*틜/ë’«mGgj¤?ºK]à¢Ð[m–¸ … A¥‘ö¡­6š’½2¾guŽ:i¢ªéÄæB⌴ýá4­Åqw|hp®¶¼Ülß{å> stream xÚVÁŽ›0½ç+8&«ÂbŒ tO]i[©§ªÊ-Š"¼ ØÈv6‰ªþ{ml$&›­"ÅÆ~ãyžy3_þ€“øÎB/ c'«&~³Ê6Žžüþ1çJ ÛC>/&ßr€ï%~œÅ[ÿ¨Eî,§ßêzæñ“¼8Î\áôù«1*h³™ÑR/½&¼ „ËuÂp ¶Züœ¼,Î,PÜIW!¯ùF|£8ô 5ß“ØÎ¤)š¶˜è™Øb†õ4m'„ê±¢íJÆpމ(Ò’{Š´$á‘} Ïîö5þOŠ/IÇÐÈ kV¬¨[`VÒî©=³AZ³w̆@säŸ^Kší4P>YQ¢¨°Š=ðýfnó¹/ˆˆ×bæùÓ‚¯ysšAiôø =o†˜„|ÑS_TÅôPp»‡Gå ÊW“…x+Ó —¾Ð|ŽÎ¾¸)ÈC“1†e x»úzÆe9f÷»$ûjæ9ÜÛBa¶L(Ô_öLVOwzØ‹mžŠÔ o7üÌÓ²o·²qËèž,Ö4Sÿ\H¥lL‹l‡…ÕÙ¸Ç%ùºoëÚ¤û÷É&ý¡ú´ððPˆ®c¢66ÒJœj<ʼn5ÎÞ))OzVËlÈ jR D¶£Ê£Ì ´ c„™ì£Äâî=-÷x© L¢\ÛÕí3ÙE †Œà˜¢´¥,noÊEÊÄ5Ö~®ìá÷B&ø ÅR–æÆÚÖ %Õ]9D^ âÙP6£BÑ’Î-’Vf]Ù¹77“2,É{Õܤå?XšÃP:·yñj0,ç^0FÑ´£´ÂkSLƒ&K¨øT-Ï5ÙŒV5%ò\ÕÝ!@]óý«õ•ráòãñe8-«ñj3éÈ.‡ÜÏõÝó@JêCæ^’§ endstream endobj 2527 0 obj << /Length 426 /Filter /FlateDecode >> stream xÚSÁn£0½ç+|$Ra±Òd÷ÔJÝ•ªª·ªŠ¨mÀRâAfØ6ªúïkÇ&‚¦‡ŠÃŒÇï½y3%¹{(Ùæäšól»ÚqX䧪mHHþþYЈK0 oËÅßEAhžmó-%e=•*%yJnºn™²M¢ŒÔoË”sžÜþ ñÑÂéRÀ>”îÞP™^ƒé]¯ø*a]>—÷‹»òì¢`ì›v=òÒïú“ßõµ;nVÁ¯€Á ’;¨p×£Õ¦Y:¡"y÷>cžJRÊ3ZÐÀ´AÎvp{elÐù%p3âd…ÕS?t:”³[gaÃçÁVA}5õwþþ¦[î³ñ§ø„ç endstream endobj 2532 0 obj << /Length 2745 /Filter /FlateDecode >> stream xÚY[oܺ~ϯXä¥ZÀ«ˆºëôɉÀEŽOpâ¶8hú KÜ­´Õå8þ÷%í®VäpH‡sù†VþÔ&ó6I¸Y˜nŠã¨ÝaÃß?½Q·ÆÝ‚óýÓ›w£h£<7ó2µyÚ/—z*7ÿrnO§íÎOÝ”æÇvóáù¶§-Œ¼šæ€„ÐyhömwÌÓ60'ðâÌñ#ûï§¿½¹š„ˆ|ÿÿ”9¯ÄM@ÜÄõUЏqº*âj7‰œÛ]³´0ðºU CKAJ^ûZä#cÛKó!Àïþ ¹!µàÜssf½JHä”"®gÉíCk]~”]ªv¬KnƒíÈ‚§‘™ŽšðQWÄ…µHû¦äh¢b16hˆ±BKRJoÐù-Xé¬É¥UŽ¥!Zì sÞS’ Œ¬5GgèX":X¿6€ÐÈpR»’úx md¾ã¿"5Ðá2o¸1;/tà>Kn‰mDzÂ+w“ŒäqÁYÆ•;}È»²Ö}ÏÜëA-ã3z·óÈÑ"YˆS–‡mVnä¥Òs’4’UI3ðµ)¨””-ä\F;ÃaÃŽÏ ~¿ã-@š|:MYµ~¹—0ZÜ‹¬[˜“ÍÔihMtÑŠ€Ò—ªµ÷4.qã2ø˜ ÆXHÝ °ÈÜCFk »5hªÃÞ~ùòùáÃíû‡ÏOðôÛÇ;^ïîþãÃãÃÓÃo_¯!n´L\a°¯ÐÉO§!=/!X$Z£ÀÎH¸Oø4˜ñiåó8¤xu±L™­4®Én…‘½ Y!½Ó­æ¦)óO§Ùará©Î ´0B}"qmlWå0ñVmMQYú|~êÀ¾ò$LÞƒÔ1–< µ)¯Í»‚åZ …Ê¢6lÉ=àý&©óuäˆÇrFFÓñpJ˜‹² 4[—»€H¨[€Èô¨6Ìk \¯;‰¯0«ž’f`{l¦(„ƒ¦Y;@9v¶ ­äÂ;í„™œ!£<‚'ܳÊÊì!NTk›Ñ@I„€10.@ œ œë3à@uw kK]ÛŠ\”Š7_QM^ö¶Ñ±ø(›rªR‹¨°\±×‚½¥/`Ÿùì(zn‹'qÚÕcŽ’bIÙB '†8Ôæ4A—Ìץ储W.‰ph8´,!S¸§®Q}ü\0¾EAüÁÏ,ÂWú4p›ad²€HH5{þÊ*Ü™Š,.NüTxB5ó ªð»¬»Î¶™ÌeíXÍŒãL8%. ¤ÿM7=Yre€o}?]1Àéýã<4Ћ-ù²Šænà:*ð×emAi(ñðm/”·½·L¡ûmÍ„»¡å5vç8³°¹f닳… ao$å±ÓÖÉ0xå"Åj“ð"ùªãÌŠQ╳Fl9‹Dzý)¹-oOô6D¬>'tfÀ´Z…Ñâï,ÿ­¯Åóqo–¿]¼‘´CØ=oc~Ð?»0?e‹·åó+“¾jJÅo±Ç°©9„¥PÎÉ‘DFl™#.†Z†³; {p¼×’íiÒž¿léi´4„ùm檨æòßÎ4ax,Tÿ(ê±—"‘ ޳¾q˜w ¨YÛ•91…„X²L•~/ 3äÐñq@¶ä‰Á<ñÜÐ~&=½…‰ñccÕøÿÒóàâÕ ¾š‰çÀ)ß¼Èã×±lÚ€NJ–¾‚øìÓ¶/ PЖ8÷“¤ù°ú"Ã¥GÕ D}ÅÜ) àʯ{x„zBß&@ ^ ˆËcAN ¶Ås=UTÂØdJ)£hKOh¤Æ0X1Ú“ EÈ•"öOy'2ä«·sööˆ¸ RyA =VÿƒRô7’x`éIÀ]vÀ𕬿JâCªrª^3Â2…¸‹½\¹8•9O¸nEIzEþ óÎ2®˜Û‘PÏ›¡çL›*Ã3ÚΔÒl&ï…qyôl¨…ÆEÉãyì> stream xÚZmsÛ8þÞ_‘É—Sfê¬^-{¿u›¾íto;×Ìlï®÷‘d›S[ò‰Ò¦¹_¿–e÷¦3 ‚ A¸ÉELÿ’‹u|QfÙõ:_]T‡±Pûíÿx÷"Q¾1.&œ?ݾøámQ\$ñõ:^'·›©¨ÛúâßÑ«ãñj‘®¢¦­í÷«E–eÑëõÛ¯häÁ¶[&äчvÓõ3Ø®¥9Y¼\Gi‘]ýçöçonƒEšþŸÚ2ç_¨›$Éõòb¹Ê¯“,‡Æ·»†5N¢¯DúÐ²Š¿_Edzk¤7`øsS±¦î]Ó_%‘άè›DLŒm{×Ö¦8ŸÞý®s:w°Ã¾q^¦ëÆÙmk†¦~I„586 ms‘d×IÍï`i±gºN£A¥R³Û`ï§äý,Ï÷C,^#Z!‹ãHô!*¢í[5žht–3r†î1=L»éè[FÕx£LW´:«oöqM}¶¥{ÛºéY£œDZ²¨Cç#éÒºæúj‘gEôaÃÔ,2tØ :u³8°Ð6@ÿ'ùš(Ë4v8tž¥2æn­—š‰Aydr¬Ð±Q«ËX7·-h‘¯#³ßw|$÷²Z â@*gE,ZŠÔ9ù€Ît  GZFÛ…,+¾ÌL70Ÿ‚?–qÀé‡6"Câ²<ú?>°¦ïЛ…§^èýˆUH39š´ŒÕ!Ê$º¡C<Ó¦ –®"Þ_²«〶­]Þìæs ‡vÎU¤f*~rЧ -‰3–æm×’oùÍ- /VtÈãTÐáõÄQzo¯VYÔ|¸/¹Q5=,Ë·ëúÍ£qÎlyÏÜc·âï@"´%!•ÇÉIÔÞ: AžÀ ˜ø–îõA³’5›qÀ 'ï7ºž¿Eô“©xâ·Å£­ñMÉe cЪB”¹?Ùü„ĬH@Ô BœÑôßdN«ªt*ð`fC„‚š™@bårÆÊ$Â[ù|ñgÁW)kÂ_Ò„7¬½´À7¨3ëÑd•lµ–÷¦uGò5œ¹q¶fl8z¤ ^¿µÆ4æà…Æápc£ø×ζ͢oLmîöÍ£h×ìÚ1Ÿü±oœJœ¿ªè >ȸîT&;ÍA*Ë0^i†‘é„ùCíÞ+•ˆýmÆmÓ6½Ù£sïö¶e—êØS™n´ÃI©6·¾ùÝ:d@ùJסFý$²W‘zc·;¡Ì{v$Ó3ÿþ÷vØ¡%ÚÚJe‹Sq«©íÐõz—æ+ ~þ~‹xã;öTâvÕ3.«vˆÍeŒ$c™DGû½Ù;’– ÔA†ep™¦ûnÛ›ƒÃ¸ }ƒ2ÌR÷r@÷d¨‰\×qNÁ­{[7¼}nÏ%“'"æÎ6áÜ'M¯Y²ò‡J0+‡JßÉ¡RÖâáö8*§øLì .òÊ¡éU†Ÿf›qè8ï­T‡àÞ{)‹êæT6Ý5ƒÇ)""ß+tiâIwYuç&ëÎcÐ)'Ý%ÕJD‰ãÌu`Ô1zGó0²GF>ô;¾dï-äS7šA¾Ú2ÉÐØ¯t}ps[ƒ››Ó…Y*¦e¢¹#ܨ”C.Õ$rfÑN.N¢*r6 3{ReË.̓ó–$üVM¯É,¬I~f]Õ=&È#©òßñtµÏ¡]ŸÁÜqX< Íð(.sJ•äܘ1š? •%<§}ɲ„[Óù(5¦rÏS.°Áw”¨ç¼˜!ão{Ð$Ñ `2Ç¡§Â:ÆîFÚt¿¿erßðøn¢ï³Ù4êŸ\b4*›¥wfEI·h¯3~=: ËÙÛñÍws8ʃ¬ w+\dÓHâ^2fs0uÖ­™ƒöf!c¯Úuƒã^D¦¿úüúƒøÈôÓ»q.ÝNÑsY“Ki&¤—¡¥2~4·"+Y®¯Ë½•ÓkÊñuË2²¼Ž—ÉÅ„ü%H$¿€Ðô\èçw¿|ÄZâ4üÅF½ã–¸ªùËsÔf‘”Åõ*O\ÈæÃ¥LËÜÜÞè‚Àij°«Ñ#¬^ІUÒÅhÀòé¡ýþö—:ñÇemŸ«ÞР3ݼE®ù¼NOi‹ Áx0­æ7/xÆL£›œ{™gb^dQ”­õòRñ~Rúì ,ÍàaB÷>ÃO÷b¾°&¯ßθˆ˜)O’èçOïXŠ#¸O­; Šûn@ƒ® ˜ibl#‰)O—`º†7Üßüâ¬òK´é-L1ªÅòås‡¤¼µm«¬Z«Ì|™SB\ÂIèÔ)÷L™&eÏÆç F•kÜQr ZxòǧÃâ€òYyÓ¬›i@S#;„úBìó=jQ6=ôönê“'n‹Ê\2÷ ùZ3cÐYÉyΣ»G†‘ÝÐÄ žýLµ$]N*Ìi!vxƒÃæóªAýòÏ]‚ÙÛ„šc­9€ñänl¥XœªC¤…*D„¹Â ‘ïw.(né …0l,?¶f«%‚ìŸ>µ¯èI¶×Ú5)ŒáN î“‚°NT–\¡‚$…Üv×Ýモ>¶)žØ…¦ÏÜfFø\#oH>à,ÚÓm¤ø•Â^!µ‚÷ZÄÍ G*œ:ñÚ%¢AÿQIH'øSe>#½íi—n¨ê6åæž\ suüf_y…k‹Éä0ÛÆ/!Gz)è·É …> stream xÚYK“ÛÆ¾ëWð°JÜàEðM’-gS–”8W©âfá4’öß»¿î\b¥˜ééééé÷4ƒO¿`“ù›$Šn²8Ýäõ Ÿ¡ÝÃF¿þü"P¼!ï^üõí~¿ ü›ÌÏ‚ÍÝqIê®ØüÇ{u>owaêÙ¦(¿nwQyo~Ðo{ÞÒÊcÙ<{·Í±íj3”mC{"ÿyá>Þþ÷îï/~º›˜Ø‡áÿÉ-0¿Çîþ& ö›CßQ,,‡7ÛÝáà{¿ýôëëWÛ4òînß)ÇþññöýÏàhìoé~³ ’›½ÛùØí¸ÝÅAâÕf&Þ£LrÜuš™¦À õвºò~¬, '+ ?¶,µ|¬m! .ù>ʤ¶E9n¯Þîï%Á"wI¤:YÏÛº¶]^šªÒmÇW eÑ ]Ÿ™oÚæ“®BÄö¾ï»Ç}. ¾àÓ nTö2ú¥ÌmÓ[Ý#79Ì7ïʇ“» ›v ü^±E ‡dÞV µ >Ç(¶’F²ÐëÍ„h.ì`¤ì`y†¬0 š¶—ùÐ:t¥³"o€M§ë…€RŒ9¤ ´ÁXU%ºkÉwŠ}(™Ž,Ö. Ò ³€4H¢Á`bŠƒ.(€VtˆaݶL±„ô‚ù…(õ—ý ¾þÐ Âpj!¦vt ²È/,ÆÀÙ{ëñg;VmÔÖ„5å||¢½™Í|jÊÜ@&ÚnM?v,xò)¥¦~‰És{dL¾æ"cïBKýÚ¯96žLó œ+r›µ‹ÜâÎûhf!ÚÇĺÓ/Ý€†n°b»2݃•¡mÚ‘ü”Ǭ‹±÷trÂÆ…m­ž¢}zbäñž±df*˜(FǶªTl<ÕER¼Ø5sºr1v5ŠÀ½ÍEVÈÑ,ƒµ †ÉÂxé#Œ`TY L.Æ™76;P¨¨½©u¤Lnሽ.f°…R!µ¸»„R5î¬Ù0è{ÁÙñûžbÅݕۓñ+‡1H8@LcžHb·–”"Mg.y1Û÷"ÂþûÕû»Û»Ï¦4XT˜¼Óä<¯ýI'])^Ë‚ €3 Œ÷÷>Ûí8›9}‘»Œ 5*2b]· ’f'3KôÙ9?‰ötf p2ÔÕð «#ÅpÐO\Ð'¿„5†³á§lø *Q…öÔ-§„8¿Àß׬j€ôŒ•Dþ—^0ª)?ÑdJi´£³Œe÷$P ço÷„ÖátÍ»m à+YÄÐk¥ “ßHÜ2!onòŠ“CÄÂ×ÁäÓ„ÁNw%^Ymñªé:W-àȼ²¦ƒò°(¡AeÊûj‰‡¬¹®0…4´¼n' ¹êס§ò%Þ[ì4mìÞ,œ "Þ û:–:ƒG·YàâX‹c‘Ì)¹@!„׆3ܧ«³–ÌMg=k}¡ïÝ+%šËx"‡ûÞk*VV{Ù¿Ð&ah%ø,ÿP +¬;ù3” 9¹ty|”å©aZz‚°Jõw»V6r2 cJ¦µÛ'±wç,k!iAºP®Ú§KìåDp¹c²ÑãÈ-‡JýR²°`s²š 9£Ö-z § :²{EGäR,GTJSáW—ÍÌI”ªT#”Ä=I•K‚}:g,Õs¼N¥´Ã@K:A(®p™„…F¾Â\”^;]”jdrœ-Wk€ËgU6I†F®¤ (ñÀñ¢xUÖå Um¢µ±Sv©)‰:ZNÀ7‚HÌTZw¢ƒ‰G±2;GcA>e-E±’tùÚØÖžE¾{OÑ•T›ÆÄE?™ë .ÎC­FV4Àë*3YL´—¯ªàžH׎ÚB”JL´»¢º½{ùЯV-R¹¹ÄAM…‚%¬`Èu î‡ñ¤#W¥eúvÁÞV .‡ù:m5’M·c?càû»ă §xs¼>–^æõ§v¬”·ó8<èèDPíØ«Q•7î)@ElŽQö>  Óã+êX#)©oCÜI¦ç'Aó¤Ø7ù0šÊ= .ztP“Y¾9¤¤íLg]ƒP­T ­ÌLñ?“/BDä̓}^Óa¶¬³eEE+\0pÙüÃÙü1ZY›Š)à+E©YiqÅM°þ\]ƒ5©k°YêÀ¸®ùÖs)"›_¤!šM6É^‘Wcaeb[’Þ‰êo:Ò¢"pòìLÓŸÉpE¸X8,Z'˜2þ×pªR•™Šé:z8¿uEH–ÊS2ÝK!/C²ô•¥ØC>&ñtöå·(Ó›43²WʉšËûa ž;÷èfÈ ïH0óIvWª?}t$tJD2ùr*•“çü.$‡}°íà˜4öâœÝØ‹êj{¹ŒOð7 ðTíuÌ„¾…¼Ýšª5…@&*{¥²#A6…銧§&|»v)½zݶBÈ ÙX8H“ä*˽±0‘Jna Z³ÍáXfpl– WÎÀ%*?k—[ÎÒª”Bˆ¸M > ÷pÝk«š¼FÎ8óñTøšab”*3ŠóãìrßìE¼yjA`6Å»m —Dm4 È~™íó25Ó_N¶„‹Óô9ÿP6ϼ6%ì°ñÅTÿ±€èëPúS¼T<*›4˜â ’=âXR@¡7ÏØ) í"™ë"Ù3ZæxÖ²ON¹þzèlm¤J¢#O"T™öEu)1°Áa*À½ç1~ê„õvÕåv*¸¥½"SJq2`™S1®ØÇÁvOΫŒä“ˆÖö›±6öãËv±yRÄij^üx)'Â@b-¨ŒÈîýÒ:¾é“VÐô]¢Ô%í/·tv0e5½°±‘-ƒ©™aÅ7¬vu8%J²ŒÝí# ëI’k~²¬^¾¨†,êŽÛ>zX²À I‡zIÜû4[>3Éö”ZL®«ú r‰cô©íôDy-,ÖZÄ–àº5j–=JÏ €U…tùg² žÛù˜¸n W¶,0sA> stream xÚYÛrÜÆ}×Wlé%`wû%o²HÙ´åÄ1N¥¢< ³Ü‰°ÀƒÅ¿O߀ “b1Ósïé>}z6Ú„ðmªpS$É®JËÍþô&$iÿ¸áÂß~xI¿-tÜz=¿¿ó݇,ÛDá® «hs𧺯7ÿ ÞÏWÛ¸ t[›oWÛ$I‚÷–ow¾‚–gÓ>¢ îÚCןÔ`ºÆ$a^q–]ýûþ§7·÷ã&²8þ?w‹=ÿÇv£(Ýe¹ÉËt%©ìywµÍó0ø»Õ°±¬ L‹ß2Ž"¸7C#Å_ñ êQjŸÃ,TmÍÝ»–…ã°}‡¿â?ÝÛkæY`ܨZÒÌñp%£§µjcÓîn?ôÝÉ- .u‡i§ ·MTîÒ´%»(ãÓÝtt!ûËIÓŠÞv¹y¡4;Ribøž{ýÕtË58JG *àéhö8ó‘EöØ]šZV17µîeê'ÖÕb§†«2 ®é¡ì>âí?°9Aç4 PˆÆm§)_ÈXÛ ø»þ™¥VïÙ®°…ãw}¡¼°‚´È‚^•IÐ]xÄIñîhÔÅêÅ;Úé6*vUVÂ7ÛåQÎûý^üâ#(ÇfláðŽrV(;߀¢ók®*+ß Û?Í!½»ž¿§®×ó­Y6/¯\“Œ––^[ì^À|Ö<¸ °¸ãøêçm -““êðKŠÆÂ‰­¢6ŸÃ(Ý.YnA[›uýÅÂßЈ¡Cô ‹¼„ {W0º{ÔÝö~2 E*áÍá·ÑÊJ§eg›„6žÇ²›- PœÑDP.å¶Eçø¥ís?B²FfàA`‹ƒeÁú x®¢ ‹E©‘©ŽJF4û:«dÅ#ÀjÅHåÀÐ]ñšíáÒ6ÚÚÑž¹ÔkTΩYðŒãÈc¡"h£‡£±nÄïÓkw`gòå. +1ù‚7ô^LþÓ š½›wÁ£Á—Á™ÇÖ–!Ù5Ǧ]ŒaòÞ•.dW…gW(d»"&ÅTâY…û|”ÉHFœ˜N›åéü´7rÚ_Á™tÿUî uG–à¡P±Œ£7€Ñ s`qÛ f¯­Fé4è…­ñf(ϱæV¶ò®xW‚Ýê|î;0?¾Ì7Bö‹bÞ—PËÚºÓ"õÔ~tÂóN¾ê;ò\Á–XÅÌ×6•¸MÙ c“,žŸûƒœû®Ý7—š3Ø8tGnÐæC€ˆÃ@6f²#­­ bYSfR,l@ÔZí÷àÙ 80 óiæ3˜)šÏÞ—·íwDÐÝKÒ~)N’€1§ziÖØúZ¨h\[8ú#áØ'Ë2¥RüKùTCH5Zr”å‘]®¡Ô×SË—dÚ…©ƒ }½œ¸&¤á1“7À(gWùê7ÅYÈ;ƒ/i,÷wÜ i.ÆÔ× C‘T¡µ0±Ì ¸‚kŒ8MŸ˜øXž…HŠ¥öÞ'¦Aø@žžî邾 vÎ#^SÛ gÿ“0ŽÉøFÀ˜ÔÈtÕSãsàQªuLS5ÑÇ(¨çØ´D!‡ÿb'¼hº‹ÓxŽƒwë8˜ÅŽÊÇŸ„Ê­c# A4H>C2!üó-z^V¬LFÑ A¨[.4„ª–AOÆá”ZW×lÎÃÀÎ}°·®ÄK¢ø:EñìÒ£©ÄJ’(FŒš¡zªÂý@Ìæi.ôtÄ-Jd§a9£ ¡1‘—A,œ{û7$ö Q·]À° ¾Pœ2±( îžw‡±{/½ŒuñA(»Ÿ,.$þEúyFº’qS­í¾7|øÊ…œj…P£p!hÂÕ¼ Õ© L»  ~¶…iaKäE·e»2ÉçôÓ+€à6 …V8Ü®ÿÂÂF4Ío|oHŒÎ×%×M\‹oîY.Þ*+dÅLp pæ0ͳï÷Ì–q‚Ž‘Âm‘…¦1‚{ôªµgÕ{Ì'öÁ4%uvVšÆëÏ ÌסOc¾Ð©žŒ•Q2!þõöš `ÁSsG>¡À(ïxa´Hvˆ…V‚ X-Ó3‡ãœ½ú TBÑWFrE!5i–=.€ïí^ªãäES,ñvB —î%ÒoyåÆ÷ë ÒeèäA '(^Õ-sÑú;îB<ÕºJ’‰B Y5PöžÛÂt‘\:e)Ùxé(îÈ. Èg 6M Ö˜ x#×ð; c`ÖL«kîF°ÅãL/EHd?mí2C>…§TX¥ãÀŠßF1 Þæ°çO#ÿ‚Ú$ZqáBþ*Ç¡€ù Ÿ·ñ€Ћ$ÃÄB(¾Ör¨C€“F€ô5{˜¨!zºlš®+wq2¿­_ä¶nt£ÝSÑèÇXñf+–D$è”·m tn²¯·ˆöÓ}ºŒïé8ë‹ùòàD¶î­Æ§‡–)%|(‡âÛr‡X^–ÿÖ¼òþ”úïO·ýÅ)¤ã—ÞQ„©§ûIß#FAE£8¹60Šhaðt.´’U-rY7˜*3ôsJ9F1ûÅÄÑ ÷—È+-=‰µ^ŽùJŽMbàþúú³›¿Æ?0D¨¾w³O-7ÆîeNp'Î@we™Ñja™HR‹Æž;.™¯Qì<[Pì> stream xÚYKsܸ¾ûW¨| U%MÈá;{ZËòF[¶UµV’JÅ9PCÌ ¢r‡%¥òã·_A ²·æ@ 4Ýî=ÑY¿è¬ Ïò8^•Iq¶9¾ ‰ÚíθñÛ/o"™w /™ïîÞüùCšžE᪠Ëèìn벺«Ïþü|:_®‹@5µ~:¿Œã8¸ú‹|ÛÓ9Œ<ëf‡„$¸i¶mw¬Ý6°&³2X§Ùù¿ï~}s}g…H×ë?(-Îü¸Q­²³¬HVQœ°ÄÏ(T;v Sší‰ÅÁv­z½kªAq·oÔÊ‚V&W‡ƒ¬ÚòwØ«ÞÌVäÔËLùêwûvޤNWÔVç—iwçE´¼C}™æ°×ÐõQp”, ªº¶Ûéõ翌âU”ò‘=îXwdS”8— ÝÜ"©aèÆ•¡ò@¦|™N=Ý,x}jÉØµþF‰ª™ø÷ó"T×ú?õfÏjzYÔ´táК4æ!Zœ<çˆ$6ôîÙÁ¸SÃit³‘¡m×Ù·XµÏLnAàŽ›(DlÄÈ@à}VV„t•"Â?ñ íx~™dip¬„!vÈÔà›;×lUä+³¾‚³]7uÛõê¨x´ ÆLÊ"8u-i_×f¶ø»iyj¥QÿHÍíéö`ç~<¦W‹màëŒ- _ÇסGÖË]ëѱ`Tþ3·ã¶cÏ„SÕ Zõÿß¶ÂS=UÇÓA¡§Â²~€ÛC²ä" ݹ%j ™Ö •N}Óê‘Û-ÑÐëª)äÔPOBÚã Æx‡jxQu‚ËC:ÎAz©Í<6'¶+™Üv»ªÑÿ3 GúÅŽÕ8ìÛNù4³ó¦V¨ÑFO^F€oÅÞ ziꪫ¿ïv1ÜëvqÉÅjÅŸSÕS\¨vŠ ´ |Ç/ Ë}GÄ%ú#ùAW÷®þÜý€tâ}—W쟨@ºD©ÀGž´rѼKDŠ\‘< =°Ì!ìóב »•ùòç]µA)&‘Š€&Ÿ‰&–±Ø-Ç{Á ”g6ÂñÐú{H7 &Ë@èq çbaì['Áms@Ö`íFqcR])NßïÛ&Pæ «—‰˜Ãåj‘ Q`>PxĆGì¸]9\Ï¡À#)p„k{¡°ý5LCŠÐö];îöÜ©º®jv³ðÔcU£¤a,L`y$ó‡+ŸÊDXÁA£ "Š­ÙSf¾g»lF³£°=tªªŸ= ¹ä0Ö”xò59tC$ž9’8òà}¹ÙÆúŠ€f Ñ5AÔS‰²Ð7LìJÉ `Qfî(È´yÀlf£rþB©>;‰†‹lâ\ä&gFbhI¬6ª%Ú$@Añâ R!9 R˜#æä)ûê°•-¦¹0œó˜¼ :Ô„!E7Ü¢¡„ý¬ŒÐ%¢`ôÊQ {lnTÖ©Ó¡Úˆ9¬]ÚC-†­†)êéEÜ“dÔu/y0·ØÂexÂ4Ź{ã=Ä’½õLW/Ì96|ÀmY°˜ó¦„;Š3y)é¯WÏ—„ˆÛ a%XL À– nÆçZ ¹nùK&Á†ñ2^¬{n}4h;;“Y‚…æ|À®å³Ž„ãµ X¢5à‡‚ùøZÁ0j39¤;ÖÊ:â§ê†ù˜<òÌ$ ŽðöÙx€sMzvQãý(¦ã8Z-+R±OJ1Ül¿ºýôîæóÍç_˜ýûÛ«¿}ºþ|÷…ÎÖ½ÀŸ,¬cgƒwaï5FE$’u@Xë"ùQ{n Æ&›ÜÌe”†Ì:uPƒåš)cS›Eì ØW¸ð)Ç,ˆJ#Za³;öLD¨º˜Rñ;èHHøSqlq*s$_À Çå[‰zÑ@=F¢$ZîÈKdf"Šç4’P[’ÿs“ÿsе5†0JÏClðý³Ószqå³—ÜÁÜyq!_³òuVFw°« ×KÓ÷ž46 ejŠ$@Æ7˜ˆbÔ‘[,6zþÞøÞ²<äBà~§×Ç`ʤ2%» ú{àc,ø½ŠÃŽÇ8ü¤¼0—¸æ°ÊvEÒ”)bŠÚ%@É zÇsDæP”ÿ@LE™•ÏeâB¼×ýæPé#¸ÕëÁ£Êü„H™Nˆ½FzÛ˜å<úÌq‹äΟ¬ &jEr‘b¯#õDë€Äƒ†—SÀùCmÀu<}ŸXpjiæäÝ4sžæÐ‘$\s£OœšGBèá S7x.ä:§jˆ@9*¨Nf1ô‹óÀ_Ü—žï:f"2‰›3‰‘’i%ôÒ&]—ä™|=±›.œ`Ú“ËÄð—rÓ̵PŒÊ÷"À8ëIaÁ^õG".\€Á¸ ÛñÐ3ˆpä– zXªæÀ‹^N‚•™^F-ƒF°ml9LðÊF"¥„T̈÷É?á¥u.êÈÍ­Å–­ª`GËðCCo—Çæ}kqHWF$ ½óÄêÛt ‘ÊH÷”ïT·âöi2SnÌ„[Ó³úh8ÖÿûÁ‹¯wlfÊYÎë­øYnËY8‹"›;[Âm&ñ¾¯”äp²ãÂ/yÁದX! –pxœï`Ì¢”ÇL&fycÝ &éTœ‹Dˆ9· ø›3’Ic¹½xâùá`1X’&N‡•5 `eí¯ ½¶{~˽”H‚ªåÒc:†ïéÌ}Óµ7‘Â@xãÈ÷+5/l˜>/+a.j¼õ',äÆl«JDš Ç …ÄŽB<¶qŠÌI¹Ü3)hÏŸ¹hÒêy„¡Ý¼‰Òr¦HJ'åŒ{ñ‚{IÜß«RM{‹Wª -lõ=C­é1‘Ö€1‡e v6…)‹MãØ[K]½õ€oÙ2³èûãÇë«»›ÛÏ_˜ÑíIç‡ã¡§·+uLôˆS.qÓæês¿é©J½ã>ÎÄTÑïkŒm!z6åë¤ô¸%ÓgpÝøŠg»gv§:4í†dûvæÙÒÐM­2x?¸8}ÒJἬÍÒ/Öðêùª§ž3&Åäý’e\uÏ-‚ÀöÆ"#ì ¢‡©Z |¯MGE¤Ü±¨# Ãey—§‰fÙ·À‡/–=¦c£)üc“ÔEcZ(±äÄl¤m±6Ôq[Š}X «vd¢ÁLü‡@˜Y¾ŠË¤û9ÕJâUo(: ù©á “Ó_(Ÿå™¿~ðÇIœ8W쨧¡«èßš$åû’N@ÆkßUHMí'[xd9$sëa¬’«“ÐßC§x†äÎ}ëñÒ[×< /ì³›à~9v¨]æ wÁq§à॑ºDAð?“ÃRjkpÖ‚¿YOÊhBm*ß•¡É Î9¬Ñ®«bb³ÿ3bgÚ=eÏ àÎwæÖ 9s^kë›;ʺ‚FS[½gÆÕ›Ù_ÂiþÊŸCÓCîÅ©Væïâß _/  endstream endobj 2553 0 obj << /Length 2769 /Filter /FlateDecode >> stream xÚYYs¹~÷¯`ùe‡U¦2÷‘7%Vl%^{KV•+•ÍÄI”‡3 0­Ÿ¾0‡4ònña€F£Ñè ÀhÂ/ZUáªH’«*-WÛ㛨v¿âÆÝ‡7‘ðm€q3áüÛý›¿ü#ËVQxU…U´ºßMEÝ׫ÿ×§Óz—nkóc½I’$øû_åÛÖ0òdÚ=Òà¶Ýuö¨zÓµ0' ó*ˆ³býßû¾¹¹”ÈâøOj‹œ¤nvUEÙ*/Ó«(IYåâj½Éó0¸Fí>|¸»ùp½.“àþöËgVüÛíýGÑøóû›ßnÖQßÏ÷Lû†Ó¾Üýë+*¾Š²«¼ÌV›¨¸ «LlŒal»ãz'˜nÙu–A·ãñþ ™ð¾sÿù¨qB‹ ôÌÓYf1½cB­­y\gy×0KËÀÅô™‚ešÓ'eU¯y@µµHkk}¢5ÁmºE1=íÜ%WQñFêŽ|‹Š±R¸Vž±Vð½ ±³ßÝ;è ÈÓŽsЕ»ÄÞÐ6ixÇ_v}gÕ^ÏEÔÆõÖ<œÅ|@9êÚœ~EÑh«šF×K{P8- ƒßÁÿj¿·zöxË4³ã/{[ Yköï [íÎM/q;‹ž}6ñxŒ¢ÛNdœ®eRÇ߯M?Ê™êΪ7 k¨¢€*ÈØGÓÅU !º4·':ü"l°¨u<úÀiúD>À@ÀñËAõ^fĆy4õÙ¯|ÁeÑÇÜ•l· :¤Q º;@p,ž$¦qüZx§qDVBÓn›s⪖ûƒÛÀéiš‚džŸÌV·NÖ‘hÕ"“,ObN§æ‰ihz$ ºq®,h?„6'=E6”qx2êÄã—ƒÙ⌃ŒZa÷£ÎúètC)@) ƒ’Ë™ärȤ‰É±Ki2®N ʹ{5ì«PÎ;¸ÅI+ñlB=Æ5x!ˤ{,|úGÏœVÿïl¬öÉÎ,ˆqz+…ˆ ÓÐ ØE ›­zh´,Ù1½‡à<àn9FaÌh7—<(øb_ï’¢Çpƒyeoœæ2ïg媠 Ÿc¾F;Ç”þ Z¦u­Ì=¨FıZ™›bc…uŽqžŒŒïŸ—Ë_då¹å¢ÍûA’쨨 qGWÒ¯Q[-ÉK΀ïÖK‡rnEB/‰ Ó­¢ÈüN«÷~Xä-™ “Ó>ãí»ª¨D{†…=é"Æv-$Æ&)Óƒ‹£½ éÞe6n£äm t™Jè—éK ŸãaJS\k¶v î€r•UEð3þbœæ_@#0÷Ë`;âg'9¬Nrh*Ë„NªÂÉÖ†K|B{)¦{¡ôU=·Ø%Åè’Yv_]Ã:ÑšÞèœã›ÞL/ÐÜß]þúi3/ðI>‰6«Zç¬4)¹ÃwÛµÎ@e¢bœTx8#ù»ikn¡¿ð{dWÔæ÷0J·$ ë3äsðYsv…[~âÎpªkî÷£6n)–hÍR 6âÉg€3ök‡•ã&‹É®HRÏ‚«0î4&ôÈÛrH"ܲFMWúÊÓE0¯¥3pº¯MZ 5VzNŽÓ­Áã)ap¾:Çê‘¶`WÆrsŽU(uÓ N ® "ËRÈþsÏÜ£/ ãëËË€—ƒ Û3¯¥âÚ#®;j¡X¦þâÆmË¡ÿÌf86CÃ÷fÅKDR™Aumä€Á¥;åâ“ãQlö¦%PdŸY?‹—„k8%zš¾¦ry_" )Êàߘh*œ6„-vëà,Å´~šHHצª,‚R²¦¥ p “ÉDË¥M4¸ÉÍ@×q‡R&  /Ò3±Œy-dàý>qçÛJ¤²ÖAòå·m”9r¥%8–˲atF‹bÖ©—a¤®Õh2ì°¾I5ñ&önÚ}cÜ;þ“ÂTI½©<êƒÖˆú°>µõO…Oä¹Aà"\í(TŠt´uRdâ. Ö£mð(É©<ÐÈVñLñ=PÔ0EAùž *dzà'»ÌÔZñP<*ØÖ¯bì ظgìy0 ÷H5ªvœs8\ȉ›û…Ö`Q–Å_ÅÜlùÐh êªòŠ¢,ƺÓTå¹qÿ2dNVsršæU8›DlZøÌJ8Œ|Y“h* n9Ê èÕõ Ú0‚7ÄkÆJ-ßÚÎsoq¯QI|ïáÊgÞ@&Ûˆ˜ÆmýÕÙ§·Ÿä€ŠË%Ø]Â"a:r¡‡Ý@Lq“ $Lþ Îm½Ã‘BOÈr{›H›Z ‰Ñ(|B³{ª'ƒê'ý–öÃwÕîån<1jÛÓ’ˆ¨ÉOLåÌÍݯ·ŸÿÀŒ:Î':|ßÂK„œŽÈ‰Š'€e7¥ºóC3ÖçXüj|·a ’xsñ"ü@²þ±Õ'i+Ç‘¬±’òMÈ5O‹á?«³q2`™8.¼‰OT°W¡v=TuR}¯§ž;݈rI@Ç_²  ºLçl•bj¤‚U@冯ìREøN¯3KÏESsÛàfÃÓ±ÉO@¦~'÷d*®z)‰tî;|#”¤ðA8Ô*/ö‰®Çg˽á©F`¶˜ïÜFˆƒÙ ËG2üe(™R°PÃ<â\Zü”@Új®øt™i¸ñhº¡`g|‹D²è­OKÆLòPn´8I±ò! ñæÁª}ˆÇýÑœÈ1§¯^¬(—b“¨£ŽÎa¤Ì£)þù8¼M\“Ýa‡v¦÷’hú쨢Ò#ª¨š"ª0¤[ÆdÞâ%©êo6 ‘(/¶ôNOŒÞT5÷)ãRÀ*R–뎌•‹n ’‰'™GÏ1|S‹Ë±:Íå­¦äÿÔHûòÔ]¾Z+œ: ä¢?2UïØÁƒò?ùÛeòGì'ÿi¤“„#Øç³Fž8þ{,Åÿ®<Œ¼òÿÿÌT@# endstream endobj 2557 0 obj << /Length 2257 /Filter /FlateDecode >> stream xÚX[oã¶~ß_aäåÈ@숒uë[šf·9ؤÀ:{E·´DÇÄÊ’.ñ¦¿¾3œ¡DÛZ´‘Ãáp8óÍ…3þÄ,ógI.³U:Ë÷ï|Cm^f4øôá`¾0.ΟŸßݼ¢™ð—™Ÿ‰ÙóÖõ\Ìþðn‡ù"H=Uúû|†¡w÷ëÃVÞtõ‚„•÷Pmëf/;]W°'ôãÌ ¢tþçóßÝ?JDAð/µEÎTw¹ŠgqºZŠpEÃê|Ǿ÷þóóçO÷¤ë§ûÿ=¬~{Z“¦¿½'òó¯k}|¸»Zߣ²³@,Åj¶1ÍHèóNÍ«(öÞÏÓÐk”™%Þz.¼zÛ̓Ä;¢-dã²Õ}U°5¶—Æ\´óÐoJÝîh¥RÇk¥ H~Õ­*ˆçùUÓ‚„–ë-­tVOŸÏô €—E¸‘ å© ó~¯*Ù±Raxu®ªVáDxÛ¦Þ¹Ó{Å£z¤€aWYæ­ûÅìh”§Á©ºH9ê²$É‘[½×¥lhE³"íA7º;QŸ´7 $|gÕòEˆðŠö§ƒÁŒ!˜qÓóÚá¸Óc#à{Û¾ë5ÅóÆ á¨D#€Œ£ÔmE{`âv‰×CodL8hœª)¨ú–n|”Ó¸…fG!†]+X ‡ä¹:t*ø}ʧЀ6M‰ÞË ¥CºÅH~£EÙw»ºÑC‡9‚M¾â%ÃájÀvvb©±±<ŠXŒ›Á^xG ß=•?sW.¬ý¬Ü$º§Î÷áéÃyïËý4ÖŠGÙ¶\?1ïøÞ#œÔ—¦KÍϼ;<¹.Ñ’¼V7¶ý…åµîÔíÆ¨±»ŒøÇ;‡‡³L÷JšÎ×ÏÜ„ë{_L4eAk_‘þú‚9Mm0'@©{K¢±¡³< ÷¡Èn‰’óë¦Ñ/;jš¡÷£%uó9©8Y¶5‹#H¾‚b-­e¯«ƒÀ´•¹.¡nËeÌ£ýÀ^|c¼L@)ÞhÉ€¾ ªŽ0Œ D@”Äü8¹%²­69séoš…‘-@ˆ4Pž<‘¢xì‘Ü_‘ž´ò]î%+1¶ÛñýPÂÏàì­¢(4 ý~H|t±‡„;h$kL »âí µAÜþñîÊæd›r/x§ ½ (•N©¯;TƧ‰ö¡†½U¿&„?°¸`2qmJ Ku« ,Ú,ÀÁz&pu N ãïî?ÿ¾XߢIÒxÐ:XÐîVLŒ”z¿¯-ß­Qºk4<¬À¶‹õŽŠðÝ–ú›³-\‚}—CBOM›³˜²¦½_­†úˆãS ÅjD“æàæ˜kF!­BI^@- ê°ÊuDÍiO2æ%¤¡[¤o>4ºÊõA–SêJ‰µ"HɹøÝô-`_‹8Cðàw-y@õJŒnóúšµ—¥ý*-™ y·AƒÂW3Î,•+«[(á›(§åÕÕì¢éµ&·~@lt[‡ÐrÏp…'£¬ô_Üy8€sªÅC•»ÞÁ¬†#îB~.„Ñø+©´ÅÐ %±^´3èñŸñÀvÜÕRVP4,áCйM‹†iÂ26^%ˆžN…¥“[VOï}k¼RDibò"Ð ªÔ/ÚD> stream xÚWëoÛ6ÿž¿ÂØ—Ê@¬Š"­G÷©mš.ÅV›»/ë€*2s•EC¢’ø¿ßïôð£[ â‘wÇß½i1‹àOÌòh–Jæ*›•»«Èï63ZüþþJ0ßÎ7««—·ËåLDaåb¶ÚLU­Ö³¿‚×ûý|g®×æy¾Ro_ñ×îçpr0õn¨à®ÞØfW8ck‘Q’ñ2Ÿÿ½úpõn5€XÆñ¢EÎ3¸)ÀU¡TIÌp“L…B*†{sóîãÍçßbº ~±s)‚'"œ¥o×jÞØš–V¿šR×í\|²™/D`$Tp@¶kèhZDPv;]ãkÑÀS7‚ŸEŠ˜½¸šg2ð×ç|} ×ç|=o›š6 "ñ>ð2Ý GÛ\ÛŽX·Ró8%òà©1Îéú¨\€Ê²êÖ¬¿ Ž£—‚OÙM‰ë‹¨ÜV£½Þ@Š%Ùw $dHQ¯)3ö¨u´F þtc«Ê"÷ÓA%§Tc¶çzdP €¹¶È–NþéZÖ_lÙ ‚†Î†q/÷Ń~E‘“b–…y’( œÌÂX(oœbã Ï= пŒ—Á—h½…‚¤!Gé4 “(çxÁƒ.þààóÅëb§/Ü‹’¢ ½‹B “Ã" œú³OºÙ™¶õ5†ú0‡ðûеÓk"0Õñ þ<\ÓrmZטûÎi¢Á§/-cÚÙµÙXtÛk\[O7Ä{‚¢«×ºéX£d,ŠéttöþãgZÜ6š·nX=÷ ÜâŒcÄêf4S„òÁè (jF_®Çõ8ßw÷•i·½î'øFXØ{*š~ß‚¥áÏ—Üðd `(¬ìñ»ú±h „‚µé…Ûëc®ÛÆÖnñÖ>ö`WúÙõL>Û§ÜoŠò3_ÀàECγ×cÜ¿‰¡„¦Éà bÝS'2-YA„ ˈy¿~ÅÐ^€õ#~ñ"¼ÔN­IÕ^*£ÿA+E˜Eêí9,‘…YœŸÀ ó‚ç&5:ABá^Bo—ò؆ïÁ‹aþ(ùèäѰ8+¡4Óev^C2K°†Rz;1¼2šûTCÙy áј(Šn°#b¨†ÔWnM«Aæ9=¨@Kkwš8,ø™K»CÙ{SsŸðçŒø?KÇm¡Õ\Sþïtó ûw†mû¹ï_Þj~PT0&ð"²›ßþ’mgÜÉË¡5®ó¸h40À»jtn µËÎmˆºð0Š“Œ%ª0èKd¬­ï\®·‹y4EEŒú¹Øí±r1ƈƒEô^VcàMC]ŸEþ ,{ü>QFüâûß:ÿ¨½Ž endstream endobj 2660 0 obj << /Length 3661 /Filter /FlateDecode >> stream xÚíÛrÛȆïýº´.4Áœ¹Kj³9T’J%¾K¥X\²X¶H…¤Öë·Ï€pƒn<Š×æ¡¶Ê+Ë@wÏÿýœ‚ßTþ?~SW7VJV+wsÿô¦Úÿvóþ¦ûáŸ|ÃÃqwþÀ;päïß½ùÍZßðŠÕUÍoÞ=ÀPï7ÿ~ûã­“o_V÷»åzu{'¥|;_-º~˜ïæÝO^-š_nï„­”~+LuûŸwyó‡w‡¼Zˆ‰¶GŽ*´¾BË×*Thœb\ª¾ÂZ ­úB…þ§®B_VM1©Œh£yA¤eR×]°ßuÇH~ãXmŒ ‡øªJt‡Ì߯»ƒ8Æ×Çkåݲl Qòíb~Ëßîšî/ÛÝf¹z¿íÎuà\]3®dîooï¸åÝÿÄào<ÿoßÍ ‰„³Ìqyc¤`Öʽ ˜öÿƪÚÿÁÅÞ Ãß@[ôçß{k@i’½œZj©-«D=¨…6dô(óÀ"­'…`ÂÍŸ‹¦œ[¤ó‡8ê¥êóòGÆ&AËr›Ä´M 0-I›€Z¦Ø$É<ìm¼Ot-çºKûC¾»YÌ?_»›ÂîF[çµ~Ew>êÉt7°– >J3}¤,³¼³6zXn¶»±‘„a¦r’ñò¹“5å?ñ°•{…_bÚ/á˜Î/œô ¨eŠ_’Ìéð¤…d¢ S¦‡õf·Z¾D ¡4SÒ–RRÛïÚõ M9õ€¦õ?ÒK€Z¦PO2z åGW…nâOùnâqý²Az î׼Ď9iÏd¬!ì£|OmëWLV@Ò>ý1ûÀZ&Ø'Í<¶r̨0YùkÞ>çý chÿf4Ð)ܰs›”¼òÊnRy$¯˜Ó€´ÝÂ19»Z¦Ø-ÉœŽQJ´Ëú:µÒµ'šj _¹5bÚ=}µL±F’yÔÉZ²Ú…žèoGz¢0Ö=-Ô §bV–MpŒ/çDØCÚÚKøŠž íÑ“YUÃZ&Ø#ÍœöÒԬ߱|Z®^<ÌwÉ™äãý¿džg×Ì~µ#ì O”:¹Êp8Ÿö B  ).¦™À÷ñµ5ÁëÕîñºÞÍø (Vn„€vÄrÄ  –)^H2 áG|Fƒ¿çŒUóËuêúu§®ÒëíÄ+Üv8Ÿ6[wHÎk±)V¦u;•Ú,‰‹®³Ö©®ú•Û" }!ѳVXËg$™Sk?iu<Øqµ^¯®Öø"kôú[ ­1€DÏXa-¬‘fYÃI&û]àÕúÓõOáîm/d¹GbÚ#=®ÀZ¦x$É<šÃ-×a1õüæy¾Ù6³¶óØ-ŸdkýìלóT…2‰ôýšŽ$ MŽéLR‘&µL1I’yÔ‘ˆv‹6XóùzßÁkÖC½–å6‰h›@`GÆPË›$™G} ¯*\€úW¾/Ù>.·ó±)„fÆÕ×ÕÎtkµWè< §¼ü%›oÝùw b­a’=!,å-XÌo¥©Ó.ˆ[Él¿%¼÷ÍìþáýØ;ÊWYë ÷å a¹?bÚ”ï1H€b¦ø#I=ò‡ñé¥Nü1[ü„®j´²`ÊAªrÄ´ c6ÅL±A’zd-¼MøÈÍÃüåãn¶ý¼Ý5OËÈÄ•KÉ*óëø‚"ª/'Ðd DÇÈ€b¦IRÈ(Áüp‘’yجŸf8š3URWNQ -/§ÐT¡¼Ç¨‚b¦PMR¨Jάêb½B`ªšY¥.n\¦,d+·D @[²96SÅL±D’zd Á™àƒ™Z³zyj6~58{öëÀûåóü#²äÂOÍ·ðE)´¤œR @S‚r Q“”@1S(%©G”xÅ,×8¥M3ÿø„ª3üûüS C;ËÆ4C(æ±Î3…a’zݪ<ãÁdg¹zX_;ßÌÇ:ÈVn‰€¶d#¤ -Š™b‰$uj çIWvèˆåîêˆãŽª"žOú‚92ƒJ&¸!É›šÁÖ>µLÍ0û´Ü=Ξç»G´‡÷þªÜiÝbß)Z[ 1žOB„‚*™1É;€ØÞP[~c”aÖFëÍçÙ|±@.ÀV«ú‚.ÀèÊ1níA¤/u@þ0²@š$ôë{ ’y 9M‰Ó—f?1Nè?lüú›Ô—pAå@$¨SŽ= ±CÈp¾Ç ÉaORâØ…fVËû¦yZÿŒ€·f÷,oÖ8`’”³ŽhÖPwê# ɱNR⬹ŽWU"ë—çý5ÔËd$)gЬ¡îkPHŽu’gíWÑVŠ„õvö°\!ùåÞ=â¬o³9À”hâP}!Ñï…äˆ')QâºVL„8:‚_ñ^˜bâ I| >1vÃB2ÄÓ”8q¿b°Ã­™ÃÖ'>mß_í0§{µã vhy9Ò€F å%>İÒ$%ŽÔúE ï¹kÍ\eOða®ƒÊû—ƒìO§1FI‘ï=ÄC 9„ƒd8@¿265NšTŸÐŽ÷AÔ®™åØçÓÜ€’Ô§/V‘#7̇£ÓÂ'&ØQ“äSdÚY/ éA1©Ï($Ç/I‰Tœ™á‡o»Û4›ÍzsÝÂ8¨SŽ= ±CÔ4’ޤıKîª.b\Žq˪½‡ôz»çd×pÁ¬Óq¿Ø5áü;`ìš$Éž þ­‹°Žœi’Œ¸iDo^îL3“‹»{\1~IΡº Xy÷ÐݤÂk‡:’sB’w÷5K;p¼ÙÎîwÛë¨qP§{ @c‡(ì ö$%Š]Õ53 ±?£÷zkͯÇ‘1¢—²xŒÈ1bÀË¢{¨°ŽŒEÒŒ¸E\Í8O-2›¿ì›Õny?ßaK^ÕLwK‚^ÜÐÒr‚1MÊi JÔ‘#˜dÄ ZÇL¥œÝؾ<-ÚoX³Ô¾¿·ÿ‡ëܔrÝcZw(‚ըœîIF\wã|ÝSuŸmäî!nÕþ‹’&iOéê(×7 õ…%ôuäôM2âúz_j§&è»™¢äm¿æË.ïQ*‡jÊUŽh•a“‰ÞÔ‘S9Ɉ«¬,«¬œ òîósó zP_¹î1­;ÐÔ‘Ó=Ɉë. Ófªî_±÷u”ëÐúÂÆú‚:rú&q}…a•ÇõÅUþg!¾ýÝóõBSÊÅ4"¨—µ("PGQ’GÄ5Ój„ìåâ¾ á&¨TN? éCÝÑ„uäè'qú•f|À°£ß¬îçÏ›æùy¾ÙáW"œ1§tWíAâÐÞrŽ1ÍŠêð$¨#Ç1Ɉr”µbZåHõ³í‰ß%Á©oO1'€ä4 çëÈpJ3✜bÕ>«³‚U•»ˆ=ÀžH'O9õÃù4t@ßÜEäÓáÄ­dª®Qä³Ý‡Ýú¹} Ó–ØP·õ+÷´‹Px9Œ€¦Õ± ÅêÈñH2â@Ú' ÜȇùžJÓ=(qqß­pÀ´*÷@ @{±èõ{XGÎIFÜZ0e]êÕzûòjg™0çò]¶რåtcš.”šèpA9ºIFœ®âþw#º]O+º/ï:Ýô¾¥åcš ”“˜&:r“Œ8AÉ™Ò6%èg²×>zä U¹bÚÑGƒ:rH2â«•A<0›oWüRúè B9Ý€¦ ¥vè]1°ŽÝ$#N—WLI”îO/Ëøå'ò2‰iÛ @9Ø€ U&À‚:r`“Œ(XQ׬»h‹Ø®bŽó3}ö+`è5)f ¬Âã]4¬#Ã:͈³v5SœbMl8UÞDFŸâs½Ð¡Õå4cš&”–  êÈÑL2â4­ÿ]¥0š(É‹øäMÊYÇ4k(<ÁÔ‘cdÄYÇd²þ¹Ù,%pmXeä ?ÑÕ«š^Ž4 ‘B}ñÖ‘CšdÄ‘jËœ“4RbÚÌýtóoÿ ®Ð¬r\1 jGàuäp%q\ª½eCÁ…N—8×Ìòïæ1< Zh\9´€†$ :rÐ’Œ84i˜3´ÿ^÷%FZ•{  =à7LÀ:rH2â†IÍ\Ò¾D¯B9Ý€¦ ¥¶èÍú°ŽÝ$#N×÷¯N¡t/c_¢ l @ƒ…*`A9°IFl¥™”×Es¿^4g<áíZ^ôp>͈KàŒEähÓ¡0y­üÚ³Æi^è&S¯I1g€=oaÔiFœµSLVësÝdê[]N3 iBi š ŽÍ$#N³}ñEí0šÏ›õ}³Ýž%ÍÐêrš1MJ‹÷°ŽÍ$#N³]ä¸c4Ûûj^¶ó÷Í÷usS_x9€Õ!€€:r@’Œ8öµÖb@.v·×¤œu @³†Â])¨#Ç:Ɉ³n_faF¬=gp_á©î õ+‡ÐР‚ø ÷°Ž´$#­}Ý„6Ç¡µûT§ù•Ÿôêë+×= u‡"X‰êêÈéždÄuo_ ¡ôq݉›p¥dRüª A NhD9œ€†•"> Žœ$#§}3„ÌÀÙÌ?Àcb}SÊÅ4"¨Ô‘C”dĵߤ/F »›)E‡è<î©ì[ZN0  B9ñ{*a9‚IF”`ûv>è?_×K©‚Tň瓀4ð'ùAüI:”~úòŒýË]¾aã@ùÈ6’G({¹ÆÿäÕ¾U endstream endobj 2491 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1986 /Filter /FlateDecode >> stream xÚÅZßo¹ ~÷_¡ÇëC4©Ô!8 wZ4HR ½ô{“ñyõ:9¿ÜßÞZÓëxwsÞ]6gFó‘I‘’Æ”¤¹àˆš‹™]Åņë$ÙGS\ŠMÿ’K¹¨P\N–ƒ+‰õFvE„æj®xä¬OÄ ÞÃÐäZi*DCÓ1\$`†Bv5U©gHÂ*á^nõ€`e,ÐT+÷Q0ºV•bpQ’âG€µÔñA­IÒ{0%ÀZHx`•ð *Ù¬äðp‹“RPˆZ14‘¢Ñ HøU‚^ª{ «VÂàð†µœp)Iµª?[(ÐwsÐPÁÝñwÔ󵨿»*ŠÉÉ1רRqœºã”9$¼š³ÞKÑqÉÝI©©™ˆ ×îÄŠ¥ ¾e5¸q¿‡øVƒSTÕ`D$!6*%—Hyf¸=Qè@$Žý^p)qCµ¿‘]*Qï<-U--À«U­‚¹IôÝ¢Rën,ÉåÚy”ì²T EAŽ5QëKu€ëãÄÒˆd8¢0+^Õì¡…›Š¾‰\)% *µ'”—Õ¾Š Ô ¦ÕØýR««T”QW¹ö7: ÀY£T¯D‡|S½€¯’ô dim¹?MNBU<ä•ÄFÐ,Ê d$iždÁ¤Ðð@jNJQë‘R»¯æŽ4EÆÄi¡'Ìh±3Gh[ŸŸS¡qJÏŸ ¯¯/&nøëùùt~0ü8LfîMÀü¿ /'Çs÷ bk^Z Éç¡_cÈ««·óñÓórÏŸ»á•þýòï‹_ß}˜Ï/¾†ÏŸ?ûãKÿv2û89›\ûÉÉÕðLJӳ“ÙÕoCHì/NÞýÅýðÃ~Ô°ŸÝ””K^ºá?ÿýÅi¦SpçWgg¿~m²ÞW$ø§çónÚ!’Lã5ž7"JO¯› $¸^àõáÅlzüjG¸áÅχnx=ù}în‘|qô~r0ü-“óù¥–¯¦.¼œ^ÍŽ'—‹2Øïýsrrzôãô÷…£ êNmêËG3¼­Cx—$âøUOü)Á%§áÓ&¦=ùÕ5üòüÊ£ñÛ•Sa 'ÙƒSÛÓº%¸;§¼ÂI[äVœåáŠ{V{zVážþ›BòEUØTWÐr|Õò‡âÒ¸¢Î'O¨Àƒ—T0î¶šümúzêàÔï~š]_̧ïgGNÿRø×§ÉìÓéäóÝÒñ€šQÈtÂ×â#êWö(°R|‰¼wU;9ú<üvýìbz9¿>N®Ÿ]>;ýôìílúqr~¿ÆéÊàOkÜýAhí¨q¼s: ‡ nuóP’ÝGƒE~ì‘s²&çÊÎóHrðЗƒ°Îò™Ÿ~¾Å¸†{{÷y…{ ûÕ݉”U"1íA$#"Ö‘=ˆ´dã½AXTzBé|òt$^%OqwòDß*Šu ‘¼‘òˆ0­á°‘» ™ÚWúð†æÅ 6IèvXvéš¾¢d—Я·é~ï.ßùéìý°ÒÓ8>`Žì2{?_°UÛjm¸\îÞ›_Ø9ư¨Ø{tÍ ‹¸ÂÊ\W2“ÓÖ™¹³íiMmdÙÃöö„¶¯î°ô”bgÛ?¡íkVH©ìa{}:Ûóš–’ãî¶gzBÛ×t‘œ·³ýnñÍaûâËÁ·–\!l=ô±EϨJ…ûõ¶›÷çW½O/®Ï&ïæ«µ8«NWÖ,…óC—Âeµe—°ßÁ­ ziéo{1,eµ|–,Û1¼›N%Ýl®K6¡˜PMÚPƒ ¶7¯d›`ÈÕ«!WC®†\ Y Y Y Y Y Y Y Y Y Y ¹r3äfÈÍ›!7Cn†Ü ¹òÍY ¶}Á„h™À&$² Å„j‚˜`ÈÑ£!GCކ 9r4ähÈÑ£!“!“!“!“!“!“!“!“!“!“!³!³!³!³!³!³!³!³!³!³!'CN†œ 9r2ädÈ‹&·×©‘T/ð7¨ù*úy¤ú@zªßÖžå´ñhh;}|ÿXcúH|jëO©2?ŽÎ¬ÇS´äˆÉæ9J nßP~nU²Îåõ:ã#é¤è séV'5Ÿ8ŽÊ3UèÊËp&Éø[ÆÕÉäK^†3¥àѸ:‰<·;<1m¸”QãÉðmkKž,ñu¦pÑÑ%M®›ÚqÃɹzâeÚrɞ¸áäH^ôS¯éÔªÔd\¼.)nuFèL4j Q#ôC¶é Á–Qsˆ$z]‚™N’æóÈå–¸ú¨°MgJ(·ëU†GR‰GÉË Oœ¼Ô4’kS"ëXxÒïÖ7:cC87”¢úHJõCpZÖ„XÏX7(•GRZÐËÒr²ÄÒ|ˆ<²ÒŒµ/gKÌâsh#+E÷"^N—˜Ä‡GVÊúmp9_"æOc'Rlžî,ý"fPk›©=’Rý‹´l¢1¬7GN¤Ö<ó²»Ä}“ yÄô8:E¼ð²4´ì±7 XŸÜYU£65)…r±ÃÆV»rú¥dôÓ¼!’I!ëÇô¸P˜ÐL74ì½Ãx«Ø×r£›ˆÌ42È`æ…>l 6¶“¥¾ÿZû¸] endstream endobj 2772 0 obj << /Length 4449 /Filter /FlateDecode >> stream xÚí]sÛº†ïó+|™\‡ø"Á^vÚÓi/;¹ët4ŠD'Û’-ÉnÓ__R…Õb—„‘œD™ži|rÌÝï€ø yS´ÿ“7uqSi-jãnfïŠÝß®?ßìøçßÞIÿ{·í/Þ‚ßüóÇw¿ýní,D]Ôòæã õq~ó¯÷¿púýËr¶]¬–nµÖï§Ëùþ‡¿L·ÓýO_Λÿ~¸UUaì{UÊÿþøwýxÈk•JØýf¤PË'ê²4^`éŒÚìn¾,Ú&Ó§Éö~»zêtnºü¿ýîàU¥(JÝæØ]ó§·²’û?ÔÑ¿Éñÿöc.@*W 'õ¡è‹Â¶ÿMuûRíì<þèký-°óV“p’W•Ž´Ô•(T}¤…'Úÿv”9¢ZiÑág©N7Kù²™~nb¼RW¢Ræ‡ðåÈxùùdBž ô¨2, %… Ê‘)U×?ðdæ]OC‘VT²:•FÇqó…ËçðÜ ƒ- hIá†2Gܬª.ynëélE-TYf_ÉAô%͇ð¡hIˆ2G¥ÓâºyŠÉY'\qN7¹?¨E{Çò+CÀWˆÅ•leZR*ÊU-EQÅuar·^=NîÔ½±0•åIW Žä¾¸ù ×ó£®b1!)ÓFU!Œ¥(~n¶“f9›î€Ç ç;l¨%7Êᮜ(Š’À½™¾6WŠÛ{’;àqCãZ7Ð’‚eŽp—•Ð51ñ™lWÌP÷RVùú¢çS xªÐߪ@K U”9¢jKQ¹êó¯Ù,Wö†åW…Ãõ|MLœd+B’RŽÓFÕÀ”B–D=˜LçóÉôeû¥Yn³évµ¦¦@ª-îÊ€G M@ ´¤ D™#”ʈÚ(e·ÄpÔ¼Øu†ªµÀ½­ÿåŒöjòx£a‘eZRŒF™#£¥ZՌѭÅ÷Íö2–Øû’æC xˆÐΈ@K D”9‚XhQÉ’€øø²}™>´ÓÉç—ź™OžNìfä…ç3 x&ÐÇn{@-)LPfÌÄÔZÈBL.~¿/z6U€¥zä/OjI Š3GT¦{Є£Ú ÿÎu'¹/\>·€çä{H¨%…Êq«¤pÔ´íÀmÝ<®¨E©ÚŸÕÏX…á(ù¢äS xJЯJ@K %”9¢TÊvXa(mÈÑÈy´._¸|n!Ï :8Ð+-)ÜP戛-Di©Ñú5íDõ.äxÀÐj§XÀ@K `”9lZéšš%\ÓNTïB>à€ ­æ³ –À(sXÕÂ(jq½;Q½'ù¸C74~ =-)¸Qæ·tmvCà¾Þ¨Þ“|Ü!?€hIÁ2G¸ 'TAÍZ6x5í´ÖzáùLBž t‡_á„ZR˜ Ì˜‰nÑ:Ç0¹¤…·¾¤ÙAâ‘üÀjI€ˆ3G])ꊚ°\üo_ô|ª!OúËw—PK U”9¢Z•B—ÔtæeÓ´Ís³i碓ûæë©-§öÂó™„<èÎ@KZR˜ Ì“²ã4YÏîV/Ä-«Û·¹ñ×íMÆÜy;øýõ· þ8ÉÎUY³OMA1)äQꈼµBjô´1±znZ•µ½žÇ-ÒvŠ=:ïa~ýøúAIÉ÷ @LJý@©£úaŒ° Íe6“Ù—fv?™-§ä¦ÑJvçµéï]öÅÍGð(¡§Ró7^ &%J¡ìÞ›•’A¹n¦ô¥<“±·×—3ŸaÀ3„f1bR¢ÔCÕõÃ3œ7ëÅk;xš>l/«9úâæ£ x”ÐS©ÙEA(&%J¡”J”ÎF(WËæ×˜ëàN>ù€' ÝS˜ò(uD¾P¢¨&¿þÔ¬×Ô"Q;7( s~ø9¶¾üùlCž-4YJ~< Ĥ°E©1[UKaJm×Q_Ä=Ö3›`¸žà”$àCy#zÝR¼©X|ôùâóåÌçð¡™C˜„(uİj‡;:š±<­W³fCÌl]ÛYêrvS½ùÞ…|Â!OZ-5»¸ŤF©#¶¥Š&2äGºo`˜ú’×-¸ àMʯ!_ )Ù'™ ˜” €RGÀÔí€È`òéeñ@ì¨wÝ~aÏy_ÀîKžO5à©B{¥dßý‚bR¨¢ÔUí„®-E•6]hÇí]È'ð„¡ÕC„˜Â(uDXU¢Â«9æFWg»zÑ7eÀ£„ž¡bRP¢ÔJY YQ$ÙÖ9“Ü—6äázž#0tcP’Bñ8o±(…µ$E²-^hë]ȧðx¡ÕC|˜À(5&,kÛŽMLøù×PùÀ¦7)»€l8"1°ÖÅ$Tœ:ªÎ ­‰¹Òó¥•û’çS xªÐÞ “B¥Ž¨VFTÒQT¯h¨Ü»O8à C«‡1)„Qêˆpi„,J†ðÅ •ûâæ£ x”ÐÓ!”@L J”:Biµ0µ¦P^Ñ(«w!ŸpÀ†VbR£Ôa£„‹zãM³œ¯›ÙëÅïçùâç“=\σKéX®AI Öã¼U­vOƒ3X'_Èw³¤”¢°õɾ.éýôeËgðР@PL 6”:⦤(m4çÙÞoÍyoR~ø I U &¥ ÔQèš ‘D¸ª®w!ŸpÀ†VbR£Ôáv¤kðwu6KÉ}úüB {ò ‡àu¢·<_ž|P! šÆBÆ@¡”4¨îX|–õ´^¼r˜ÚÐ剮ÙìôEËgðÌ 3 dŒJI3+jQ¹’d¶þú´mæÜ ’'Ú¸|yòA…<(h7ÆBÆ@¡”$¨îÄYÔþ›:çÕ öåɰ ŽLcFPÈ(œ’地†˜¡í¾æ>Y,ïVgýÓÁ[_Î|€!šÉL±¡1€(% °ªD­Ô@u¦·±¾hùÌBžôc„Œ1C)ifÝKÚ11þµÞÚ WTç0ßæPîJœ²¿œÇ,eÆ"A£d4@[вªI„›é]Ã<+Yžï³’Ÿ}ÉóQ†À€Íä:U d JIÔVMÌç7Ÿé“i.¦Mú’ç# x¤Ð^%5‰CŠRÒH•NÚéÓtw¼ñvÓýqF³_ž|P! šÆL÷ 1P(% ªýSÖ†Ewœò\ãÁs_þ|°!šÌuª@ÈX”’[ha+b¬Ê}oþ"÷g{òñ†<^hµR4^ d /JIâ5µµ•$Þ×ëÜöë-Éf °¬|g¸PÈkœ’fݶMM´dú`«@½w$Ÿôáz40]ŽäTŒa>ÎGS®¤¨ŠšÆœÏ0·/O>¨€Mc†¹PÈ(”’e aJbûiû™y ñ²†¹}ùóÁ†Ø€ Mfæ/PÈX”’«j¡11åö¸4°¾üù`C,4™k±@ÈX”’+ÝîYïìŠy±ýÂÀúòçƒ x°ÐdfÍ ‹RÒ`‹JÔNr`'w‹æa~v»õ¥ÊÇð¸ u. d JIâêNæÑxDDŽ…l·™]]Á¹LðNe×€p=[ i,ŨÁòÑô])*|%=bºzüÞª|þ!_ © Y€±*€RÒu [*Š>ðÖ}³bö°h–[Óî°ûRåã x\Ð:©+2† ¥¤q•­ï5ê±‡ßÆ9û§Oú2çà x˜ÐXiÉ5](d &JIôF8|î„9™Î绿Y­ÿ›v Iô~œÚ¯~ÜÊb×(¯ù覷ûv¨Æ#¿a²ðÕÌÿޝfäº2VÍPJºši-*ü]¢¨šÍî7/TGoºƒj¾û·¦8^j>ƒ€gý–\$†BÆ ”4¥ÛÜ2…Á„~ÜE¶=JýÆ9—½˜|—CÞeXbÎe dÌe”’vY*aÇúÓõt9_=N6/Ÿî›¯„ÏN¶‰â Ïy¹O™oåázÞIP*Y’ o@ŘÇùh ÙVµú->N:U­w´îC ]•eùëœA²Ní/ù†€­UýïøjE.ûA!#õ §$+yìJT±Ø–iœÐßïûœù™G¦óŽLÁIÍO:.eoþÐQ)ó»Ó6T9dþøHó½cŸ3ßÌ€7ŒSA!cf¢”´™ÝÉ…0“OµŸ*ÆJ6‡È—$QÀ#‚vIKN•¡1D(%¨í.j74ì=4Ó5çJhmk°U}Nb=ÑNØoy;à±ûßl™@Èv”’Æ®*Qr{·°E5M׎I~ès4_†|8!ŵI d JIÑ•Ào×l˜Ïÿ˜ûÿ^b¾õ‡ëyç Ò’ ý@ŘïÇùhÛ‹R”vÜwn±×*Q©ï°ØËYîåå{ð¦C¸ê„ŒÙŽR’¾Ëº…ïζ òdíS%ô%ÉF°ˆŽìb2‚§¤9+Œ,Çq=Ò\ë¥æ3xÐŽ2Æ¥¤tßȯ‡Ömf/›f6ù| ¼Ô|!Ïú!mI2BÆ ”4ƒîãö•ep íÀKÍgð   dŒJI3°ZX«Ü­W“»ÅCóÓx©ù BžôCZr? c€RÒ Œµš>´½ÐO^¢ê5æ›ðæC#˜eg(dÌ|”’6_+¡‹¡…ç§ézsã%_’|D!Úŵ d JI#ê¾ÉÌ»…§‡È—$QÀ#‚vµ‰C„RÒˆv¯ Í:è—ÆNõ…”¾<ù B4kK@È(”’Õ}Ý”ƒ W¯ »)¥°*«Mq^{Iù^‡¼×°ÜÜ­ó¥$½î>U®†Öë7Ó׿|Ú„/N6¦p=K :Æô\@Å#”DD}.þQó¼|yüÔ¬™™àwo ™ßn?¸<ðív”bhš1ôÝöÿ ©½¯ endstream endobj 2662 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2292 /Filter /FlateDecode >> stream xÚµš[‹¹…ßûWè1yÑѾH[30ã¼$`ÆóÄøÁñ4aÈÐì6Lþ}ÖVÕîÓ§È­«»KëÓmKk«Šëh©$®Ã{¡'fòÂH"š¸•’TÍ ”j+^àÔL¼ Ézó‚¦î5[©‰ ÑJͧ´Yæc=‘è|n$Ò)F%Q5ö%jÝk %dÃk$Åé„?òºT0°’ÿHõ6ù#Úª—ºa^—Ô‡—ðp/^ƒä5X’öh®Ì5 «3¸aÚ¬aItö›{’Úg ŒR^CJ’^¼}BI†Ã›pÒ"IJê½Ä˜*Wï¥Ô¤Ò ñ¬kIë˜5zR+³ÆHÚ½ûM1ƒ}\ÐéZÄk@´Rõ*©¢E^ÒTÅfšªö †¶Të@›+ † ³f(ÌÑ«%ç›A·YÓðþWL˜m£¢#×Y£$“æ¿Ã¦]@¨œÌ— JXæÓÔÐQë2kÔdc®#4 —ÙÎj©Óìw“Ôyr–’’÷“ØëìmC t »ÕY£§Þçl´á‹Ï¹VÒ â\ôcÌuܰ´†ÌÖãá¡s`hFm³FM£õù»–† Ÿq,™1fëÑ4*e6߆/ìÙþŽ[0-^Ä’-b®Ô±f‹Î.@Š/göåLÅØÜ=4ºÎe4“îWætЈ|Š|­‰dÃb ¬G ШªÈÚlà ƒè#:QŸË2„xq‰˜¤Ü½zuwùáŸÿ¸O—oŸî.ï¾þõiþü‡Ÿþ~wùîñó÷ŸÓû‚-¡|¸»|ÿé)½¯¥g˜ ì3®"p´¹á‘oÓ«Wéò.]~ÿøÃcº¼N¿a)¿Mß|s‡ÿ¯ÎŒ~O`)0> Ö)m0@Ö>÷Î(3¶‹ ´ž±önyœl%ûN5­gm}qkÉÔw`µ‡ÒòvØÎQÙöÄÆ˜•oóhô“€edßè&jÆ®¸¸¨Ë~BN`©YËm ÑI¼nÞdò°wg}·yí$žµìžfòºfé¼z¯µŒ³jã™d˜kyµfìÛ¯I–ÆkÇSk.8„'¯r†_XËÍuÛÒT9‹ÒZk†ž8ì50R·qvŽ$WÝAeÊr0˜'mŸ°Æ¹ÈŽƒ£èåöØO v¡¨¼m×ZJ汘×9ÚV‹ÀSXïK73¥¨eçvn;àéI<8Š1¶å)pH(nóÆI< í;¯öŒäníxÊ€-Ûü?˜ß¶v½0|gÛyb íÚñ$ØÎº¶;ÔîvÿÊI<¸ Õíðj™I—òf©ßƃ™@Ò»t<fBy;üxÔLCÖò`&í<˜ ¤ ky0Z¶Ã–MáyíüÁLôíx€ Í­ÑZ¼„l§W±_Œƒ•èmï¼DÓ¥g;ÃJHÝqÂp½·?;ÉÉ3¼D×}8á%-æÁLø5Ïäò²Ò—òf¢ó΃™¨£/?‚™À¦9y4 \¯­åÁLôÝ{ÌD5[;ž`ȶÃÚ€ímky03‡wÌD­uíx* çž»“ö\´.5׈o²íð#˜‰*û‹œÄ#κóØra]Û?˜ Óíð#˜‰J²”7à7eÇ•–Ká¥^VÂx;já$tðÒ´Ý`67lÄèôÀ^§÷Üpž”ô}ºüéÏI£$ã’¾þüó‡ÿê¡7Oö¦¢ßÛ³o`»m/ ¥^dÿ“õøÃ| @ûÍç…6„/o??~zw>¦ËÛ×oÒå‡û_žÒ‡_ÕÛ»¿»üüû‡§/þöƒ½¾Î—ǯŸ?ÝÏß•íw¼ÿñ§ß=þ²¡¿¢²9+o?~Fm­"Ûƒs¾<ß¡x{æ+”½0öB-Q (p$ ………Pnñp‹‡[<Üâáöüp4£E3,šaÑ ‹fX([([([([([([(÷Pî¡ÜC¹‡råÊ=”{(÷Pî¡ië«"¹¶k¨T¥,"k™Ìè×5Tª ï>˜ÎzYÍüâ'\2[Ë,”Ýf=3Ë@ÖvpŸ~Ò©¢ƒ2Ñ5T9j?¸>Ù úu íÈ‹ÛX:¶Úúu EºŠLh-³úû³k¨hÃÿ*kÇVá~®;¼Ö–ˆ|Qü"ê)þ:½S_ºñ)ÃûÈ5RTjæƒÏ> stream xÚíÁ’Û¸†ïûs´ƒ A‚9¦’M%Ç”o©”J–8¶jf$™Ò8ñ>}H Zn†½IÞÚÔzÖvÿý€ ïŠáy×wMYж2w‹ç_ŠÃßöîŽ?üëï¿Hû{÷Ã/ÞƒßüË»_þô«Öw²mÑÊ»w0Ô»åÝ¿ßüúÖ”o^Ö‹ýj³~{_–å›ùzyüá¯óýüøÓ?ÖËîoïUSTúªÕÛÿ¼ûç/{wÊ«•J8þ¦§°”wF´u]Yµ©„,«£ÀÝÇÕð¿Ùüeÿ±[ïW‹ù~ÓÏvݧõËóû®ŸõÝóæs7 úÓ¯„‘M-𦲢üùí½läñ5ü P¦ªÐ§ÌcBÿŸ(Úá_Rª9ÿXÖtý=p(MI8ÉA˜Ôµ'¦mD¡Ú31¼£Óo{©=W›RŒö§¸ºëö„¥µTœ¥î¿d²ÝVR¾Ý.o7¬;d7“b7JíÙ]«±ÓíÞÏ»—gÂêjè!ÒäXúKƒ•šÁà1@?¤6, &JíaÐJ¨¶ŽaXÏŸ»WÇ`¥æcpx Щ5‹ˆIÁ€R{*)jSÆ0ôÝü‰ìF”²ýn8Vd>€ºb1)Pj@)EÑDüß½¼ì¾¼žÿGùöŸ®çÝ6Ⱥ`ÍwJR¼?ÏëY¯ Qé ÷œïʈºÖßûþ“so²5ä³qx8Ð(©K–“‚¥öø­0•ðÙof«'êbÉuóCqd¬ú|2.OZ"ĤA©1ݶB•þuÓ¯~›3–ÙvÞï(.ªª®~dÇ ÷Ÿ©’lJ KéÌ®á/8JPL%œÚ£d†»”lIJÝìQ?m>¬Ö#©EUËW`”tÇ›ªÊ'æðÄ u!b@L 1”Ú#ÖQ5Cl·ïÏ[ Øð1§ÛWáfkËçæðÜ !n@L 7”ÚãV7¢lKšÛrF0k¥¨ })Èò‡†SåùT]ž*´WìJ“B¥ö¨êZ4æ êâáƒÏ²jD«Õ±ü!ãÓFYN~}ó8^~ï®'ZÇYŠƒùþè©m8!)Mã<­×2ªZÈÚkçc ý—mÇ,Ø “ò¶i~¿i›5ƪÌ7ßà݇VÔì¬jIñeö”Zh­=‹§Õ0;x\.ºÑ}jü9Tûý޾}lcÍ´eåsxbлš2@-)ÄPfØ0òo+!6{˜ï¨S©¡äú÷ÅÆ1±Âó™¸<èN€ Ð’Âeö˜ÈJ”ª1¡ïae#U½Î Ûšfåç“qx2У %… Êì‘)JÑÈÚ#³ìæ/OûÙîËnß=sk¯OÆÊÏ'ãðd G~ %… ÊŒÉTm)dQ²d^v]¿\õÝb¿é¿¼ÚGÿ¤2À8³‚µ$À™=F‰j|fÀt 5ü¬ä%,>Ym)ù”\žô‹¿A-)”PfR#…ñ'O³‡~ó̬ٶµ(êòš§ÄÖp[z>U€§ ý ô= %…*ÊìQ­¥Pµ?ìÞö«51FhjQímMŒ9èÖ™|è.Ú€´¤@G™=躵öGîgŸt³‹‹Lòóɸ<èQà& ´¤A™=2Õ ½Dã÷Ýâqö¹ëwã‹c·{“µ¥çSuxªÐ_ݰT–ª(³GUµ¢RµO•|#i¸c7·¶øÈ¬5OÆd¯5ƒìZó™ûÒ° ZPL t”Úƒ.ÍÐä*úñe´§îúžÕMUåsxbÐ:iø›/“B ¥öˆfH/ibôkk­¦h®¡¯r(µÇg˜–5šQ¬¶»~öþi3`ZýÖ]ëkSmùÜ\ž4Pv&ŤpC©=nµMÕRÜ›õÃæe½ç¿]æ y“ú|2.OZ"ĤA©=2Z‹a®M‘±ë¢‡›óPô‡¾M?IÍÇàð ! @L ”ÚÃPU‡oâ»/äþêÇ„SÍù<]ž'46ĈIá‰R{<Ç/ÄIIñ¤Gøf\T×7çØÚúóÙº<[hrˆ-“Â¥öت!}k(¶ÌhÿVÞÙ›*ϧêðT¡½¡¡%“B¥ö¨J%j£)ªý|½ÜpË(W1´´µåssxnÐÀPobR¸¡Ô·B‰¢!§á ›l…©_qý“ceëÉgåð¬ iÒH–“ ¥Æ¬Ôx#DëÓý‚x/¶ƬÕO÷^,Ó"¬kÙ Â]϶F¶ìËï@IBk@y½Æ` a*4óè¿l÷¿AŒ_ ®Ú[n{kR>|€§IÈ–}rŤðG©½ÐB¡M!Ž `¶xÚÜò8jª<Ÿª ÀS…ö†:5“B¥ö¨êVÔJRT—ÝᇛZ ŸÊÍGéð(¡§¡ Ĥ D©=”ÃçpQ e·¾A”¶Ü|”.zB Ĥ D©=”¥e‹f7ûµ¡ÐUó ¾¸f`­Êo.ß U°oˆ@1)Í¥öšjDƒ6í`ïÊã—ÜôM¶޼u'Ÿ¼ À“‡dËN“¡˜ò(µG^6B6øó§«__¶%çÓ<]ÏîʖÝ|(IAyž×#YÔBkåê3±²¬D]\ï{^\ëB>]€Ç ­–-»LŤF©1áa°>Lw+†0×_¯c)rª-›Àr;3Pš–ãÅ$pé=nF‹²” ·—ír¾¿^n¶¶|n.Ï èoPL 7”ÚãÖT¢‘&Èíue#ªÚüà/˜Z»¬î|&.ÏšêK@L ”ÚcRWB¢ M–]?{Þ} AÜØÔ©þ|¶.Ïš¬$û¨ ŠIa‹R{lu)ªÏBz5ß­åOýžúdL>t€‡ÝW’]€bR £ÔôJ cHæ³ù¶ï¶7µ–d«Íyºžç U’¿/;%)ÏózK%TÝð?ÝE[n>F€ç= bRH¢ÔJ%E­+åîæ:¤-7¥ À£„ž*Én7Ť D©=”ã ¢’<Êë•¶Ü|”.zª$ûô ŠIA‰R{(,ÚXÅ¡„[˜^ØTÄêÎgâðL 9J²‹æPL ”31­0²¦‘tëÅað²÷û‹|wÝŠÏæâ®g±@Ÿ_@I”3iÚ!uÉ3Ù]2+>›‰»žeý ô $ Ê{Ƥ”•hIžôÉ<.4ã ¬ý¡70]!›&ûœéúà9!8 ‡e<}"íŒÃ©+ÁóAN@ÆS-dËÙö«Ï ŽÃWÚêWüJÛÉ7[C>€‡RÒp€”’†s8ë‚¿í?ì.³·XÝù@\4‡ë-@H JIO½à–)F «Åc·¿@ Vw>€Í!ÆÄ @H JIOÁ@¯w; ‡]Wë‡ÍorÏV’ÈàA»ˆÅ½" $†¥¤‡eè&†H]ô'Œ­!Ž ÀÃFqý‰ÁA)i8ãQÜÚÀq0F-TâöISŸ¼µuætx€ÐLb}ç‰D)i€ã‰ªütmù] 4“˜«!1€(% ðpØ×û÷]ß“‹9—¹?Ïd¤-*–»že}c†ã@E„ÊGƒ2FhôŽ,$µ›?p¯oÔúöÆÉK[Z>/€ýãˆ!1d(%ͬi†?™Ùís·ÿ¸Y.ÇCO/x8U’ÈàA»˜á!C„RÒˆÆ÷ˆkfŽ»3x®ïlª3  À„fr@”’8iQ1sâqùè†Þ>ùlk·éð0¡±Ü ‰ÁD)i˜ãù%3Ÿ>.7ÝFo´uætx€ÐLf>…Ä¢”4Àñ¸ ÙÞÆ|`ª3  À„fr@”’8ž­Q0‚ãúâm´uætx€ÐLfI ‰D)i€ÃŸÊx3òÕçβ1Ú_ØÓV’ÈàA»TAY€"”’FT”Â{Mm÷ÇF‘æpt-¿5œ®ç#[ò‘Pk çùÈ–0 Rh<©ßÍï³çùâfß#Ÿ Ÿêφ °TÏLf°B!®8% v.€Ç½3ä#d¨#† e¤qÕz˜þ˜.úP×KÇeËÊÇåð¸ wô,êˆáBi\Z‹BóÓÛYßÍ—ô ˆl.õŶÉO[\>4€‡dúЃ†2ÒЪJTe`꺛-.š ÀCƒ2ЀŽ4”‘†V–¨Àv×}Z¿<¿ïzf¶¤Q6ßáÉùnõåûîð¾Cèq7Ôóe¤}ö(êßûîyCvœf¨ß|ÝñÆœËVM¾Ë.ï2,™q船Œ2Ò.©u›bòîU÷Q^¾ë§ëyÓŒçNDÌòót´ã…ôN£<³ü°¶Øl¿\æŒÒÊÏGâðL GþŽ(@GŒ ÊHbϵ(C=a¿á¦ù—6£œJÉF°ˆÎü¢?‰¡Ž"œ‘FdŠÃ‹=‘Û|à°—J`9y¸YIõ-§Ý3Ñ&aÙÑ@ö!ÚYõR“w*($æ8JI;ÞŒšMÀñn½ >´%¿ÿ§Ãd‰•—ï» Àû=š¼A!1ßQJÚwÝ í¯ßžævŒë?äüΓ=Vj>€gýàÚ>c€RÒ *#LÛðkŒ¯·ÍÉ1«>‹ ÀcÉŠ\V„BbXPJKi„22€e@Â=!y},V}>€Ç-âz ÂRÒXTsøÒ?e½Y/º‹¸cY©ù \žôƒc„Ä ”4ÙˆBl7Û—§Ã¶×á=O”…1ãj§óã~Ò·¦ò_»>ð /aºëù6vüÛÄÙÄœŠX ;ÏG6°ÃVùMhÞwëî¿Ã öé‰ééõAÕß´"c«ŸÄd; °ŸUÌ þ ˆÉ8%íò¸±½ ºwãiÓ—p+¤æ3pxЦC!1(%Í`ÜȾ Àw}7zæ Q~¿Î|«1ß|€7Áu $f>JI›?î4¯B#ïÝ~øw`ÞYËÃ9î8¯­¤|¯]ÞkX7ç5󥤽Öã†vÞsÄiÿÀÑßÙË®ëgÌ7úçþ$/ßw€÷z Úw $æ;JIû>nÉÞÖ¬ï!Ï_3©ÏÇâðX E $†¥¤±Œû«û³ËŸü(½ëN>v€ÇHze ‰aG)iìã^쵦°ßÜAz'ŸmÍù0]&4Vò«øPH &JIÃ<½E²dOÒ+oå$½“ñGòáž®çÙŸ¹~êTÄÈžç£ÁŽ[º—C6x‚Þ¥oå5•–ÏËàAÿ¸Î„Ä¡”$³ÃŽï-ƒ,xxÞ¥#³•es׳À y’~¯¨ˆàBùHZÄü˜VøÈ¼×Ù'9sëýŠÀÖû(…EAîHÚvÿÿÙ@t endstream endobj 2774 0 obj << /Type /ObjStm /N 100 /First 1009 /Length 2314 /Filter /FlateDecode >> stream xÚµZËŠÉÝ÷WäÒÞäÍxåÄÀŒ…¼±AŒ´°-´5æºÂ2C7æ·- žëƒˆ%9ÙF:ûå3lÎ&~Ôù-ÈGÛØðÅ p´†uZŠøŸ;j¡¹1Tx.i|Iè”÷?0Å£K¥úBmÝ`¶Iß]]çgÐDÙ–swÁ•æ«&¢9Ál$äóŠ~)ûgldêŸ qUÙ|ª.Ù6Ÿ‚ Šð6 °q)ÞL11ÍIuy3˸{ñâîòößÿºO—ïŸî.o¾üýiþÿO??üóîòÃã§Ÿî?¥w^¡¼¿»üxÿñ)½ã.™³h6Ÿ·Ñrñ5LœE ï}Ÿ^¼H—7éòÇÇ·éò2ýÍü}úî»;üû6R’‡‹-H eèø€TO"Åoqßq%¥A™è€ÓNâlœÝñÜ8{É:ÚbÒÊè˜ì¤uäÞu1©Q¶ÒF†ß^L©œKy6¸Ú3ü×i?‰T(Ëx6¸ÒsÑ#½´“H¹ä¹q)·¬"‹I©dò}+H©æÎk9GG¿žÍh©xüu¹0Ñ9œ½¡[û„Ë6t-ek™÷ÙìšG§ÆòmŒVzÆŽ‚=>Á# 쵉OGAzµ‰PR5Y»Fµ„°mÚñ¬ìL¥ŸDØ „°©PLio‹ ‘Ï”q%„Ïéµ®]£Š\Æe&¡! V[»Q¨ ¶mgRøœÊ‹D„/9¦P ‰ÜâøP {ýugRÆVxrŸä×Á•moRÂVhc-¡ u‘z%,’‘š~=[S;‰™Ë<Žd?åltp²!zaÓL¼-Ì_“«B ›*¤a3lÇ(v’+Õ[,È0è m";Éш0’ÁM‚ ÃŽNmì$WŠ¿¯„ðÃóBŠëî+H0ä m¢z’cc¤×Ú6UxŠÏz°HëIž Y(\÷¶fñ~e[LX=ˆÙTÁ­ÂwëÚEÊæAÌÆWáäúÁÑ—${–ží*{†"¥Ðâ²m®›€×ƒ<æ¼§r]¤ŒÄéèÜÔNÚ+¸XöÊ$DŽxcm »!Õë¢AÞÉÖöYZ¶ëÛ¬- ]LØ8•+a‡—kG²¨'VÉ<6×íE…a¼˜ÐRØ|·—ŽŽ¼í¤ø‚‰“\ù·2Öî„|WhÓý¬$ô¾¸‡ÈwëØt?«‰ ™œEèAÌ&ÃYA8ª•œÕC/!Ø•Ïˬk§°{3éàpj‘µÃ¹Uœí7ªÿ£¿—é·FÀû1]þò׿¥Q’ߤxøòË/ïã¥WOè•YêÛ»¯„R/rýOÇÞ[¯(¯8yåÛm|yýéñã›{43]^¿|•.oï}Jïÿ»·¯?üãþîòÐÜ?<}ö(‰ý{ïàçÇ/Ÿ>ÞÏge{öçûŸ~þðÃã¯Û0TÝ „_ø„¯TÙ^œcøÄóg^¸-ŒƸ-^nñr‹—[¼Üâå^ 08 CÃäÈ={ ÷@<yòäÈ#G @<®È½”0( CÂÐ0,ŒF £‡ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ5k ×@®\9dÕCV=dÕCV=dÕ[ ·@nܹrh°‡{h°‡{h°‡{h°‡{h°_5øþÛ ´Q.ío•L¿9Ú¹‘6BÖ±_Pñ²éjJ/šÊ~ocN{[“‘ßH²ò³Áõêi[,ßHÚ¹»‘zµÒšXäFêÔ¶_¡˜UT]SÞH½ŠZŸÍ)# ’EaÞñÉhû¯¦!ŸFêÕT~v£«"Ç<ÈÔñúIœó€e¿¢2«ª£-&õCÚ/éÍÊj׍ղ–}J½¾JG¥²òÍ©eÌ4{œt#…ƒ²ƒƒóÊ'qª¢c»`¼Ì:íªžÄ)’­î>Ð+­rÞV9‰“ýÚåâÅÖƒù> stream xÚåߓ۶ÇßóWÜ£ýp(ñ“d;m:ícÇoŽF9ñl狼$Çqÿú‚(¬»ƒ$>Q7ÉÄŽ}Üýî÷’ò®òÿÈ»¶º«µ­iîž¨ŽºûxwúÍ¿þþƒ ?wïðüä_>üð§­½“•h«VÞ}x„¡>¬îþýîÇ÷~÷eópXo7ïïµÖï–›Õé7]–§ßýc³ê~y¯êÊØwÊé÷ÿùðÏþöáœ×*5Q`ÿ“‰B-ïÑ:g‚@×!µ9 ÜZû]/ñáswxYî‹å—çÃú¹[ì»C/æO?6 „´µ>QuŠðç÷÷²–§_ÔÅÿIîïP}ªÑBUö,¬¯QXÿw¢jý¤:{ù'°êáø{àX¹ªq’£v©šDL[‹JµbxÇŸNR'¦×ZôtxÓžÖ݆²[5Â9ûìþÝø„ÊùÄ<h”T-ˈ™Â¥Nø8ÕŸÄY>»nùôLJÔJþvHœõA^¹õ1o=ô`Ìz fŠõ(ub½÷NµnÌúÍ’½±“Íï}vp‚Ôr 1ú1v…b¦`@© F ×è1 ÇÆÏqh„–íïÆD–ˆxÐ ©j3JÐRTõˆÿÝf5vWþƒ¯@'uåÆŸç}Œµû¨dŠë—yÓU%ŒsýñiùqŸ µA À3€~Œµ} f ”:ÁPµ¢1vÃÇî°øÜ}# øînåêïÒ?âÈõådbž ´hŒ 3… JÉØ¶Ju\=æôx}2ƒúb2 KæÂ¢2PÌ28uB¦ñ9Öe=ì–›ýúЭ>Nú>±)áÃÙ$•ÛðvúGîPÌ»QêÄîºU…º©»Ýv—kaMý=Gl¯t× ‚UåÍ à›ä¡”f›3¥ ÔI3pµÐ­N› vK¢14>peæ×8¶¡þr¶1Ïš<ƈ™Â¥NØZ'ê†@»ýrxùr8|{鈫¨ôLÛ^ `Û©´rjçãyhÀ=¥ Ë,*™‚ì2oBÌ8!…ìe·ÞS\­¦²3:9 ¡òr¢1Ú;ƈ™¥N¨j+¬µU²SûhVßÈí–Ã,)Çð¸¡ïc¸˜)¸Qê·2¢5ŠÆ=~í½š¹ñ¡†r>1Ï5ƈ™Â¥NøH#´ºh|ì6Ýnù´þ_·xè'¥f{_ µ•s‹xnÐ@U9–3…Jp«´¨¥ã¸m¶_ jUå%7W}1åP†rËQÆm÷‡ÏÝ·ýbÕ=.¿<ë§î*gËõådbž ´H6Kˆ™B¥NÈØJ8«òd^çñê ¯Üú€·z0f=3Åz”:±Þxíº¥­ôü§íÃòißí~^?t¯`}Wn} À[=d­b¦XR'Ö«Vå¦YÏ­mò7¥ºvœÿœ«!s¹«1ï*,oÌU fŠ«(uâªlD# ïjoh·£æ+Œ¿H½ÆÃŽR¨¤œR ÀS‚v]v€˜)”Pê„RÕøô2G‰kõßgAÓ ²@ À€NŒ&@Ì(5 ýÚæ²ï»ÞÁTòí4®MÔþê¦Ï¾ýú6q:þ ÚÄe’£ã޽@C-SšÊœ4 ß±ÐN%M‚½}zµÊͶap€ƒ å€c0´Ú±7¨e `”9쬨MË^|]>-^–‡O{j8\û^¿yáp0-È/'ðd G#d€–)dP愌µÂ;œ’ERÑ87¯gÁåPo9Ê€G MA ´LA‰2'(9®âƒ(?¯Ÿº‡Ï‹Ívóp†:Ë;G1ß9‚fJÍ.<‚b¦0D©†ý+{R¦ ·/ßNo¿ÜÔ“º¡Ür”1z*µbQ1SP¢Ô JåÓ· ƒ’lÎðt u–3Œx†ÐL©ùK*3…!J0”J¸ÆÒ Ù+ê|OÇPn9Ê€G =;˜)(Qêe¥DU«åËnûÐí÷7¿\w¨¿œm À³…&KÍO)1SØ¢Ô˜­ê×r:Œv×½,–«Uÿ*Ä¢ b³°¡bFñxôJöÕ^ d ”7áÓT¢15è¸VÞãYõA˜ PI9¡€GícÄL„R'”jãÒ†¦Ô¿òÎ<•Ö³ý> G,TUN,à‰Aë¤aßD‚b¦C©b¶NI’ØÈ›ò³X9ÔVÎ-à¹A¥a_؃b¦pC©n¦õ}‹†ä6öjý•Ÿi¡ªrb1O Z7F ˆ™B ¥NˆéFèÖRÄwÛgn%Ï<δP[9·€ç ãÄLá†R'ÜT-jô-‹À­|è.:浂?xÅÉ ¯Üú€·z0vsb¦XR'ÖËZÈšsþôròü®q§¢Êyçq߯hE%S`]æMXUNXKÂò§Ç¾»Ý·ç†ÊˉÆÂaŸ\ùiª*§ð¸ uÒX–3JSR8kƉùqF×CúûϬ òÊ­xë¡cÖ1S¬G©ëûiE#3Ö>î¯òÝÂA}9™€'-#ÄL!ƒR'düÅ d džž¶_/ÛýÁÓé/¯ýÑAj9†€Çý†]¶ÅLÁ€Rc M+é( 3{Ü )fgA¯¤aWl%¡¼˜OÝúÔšæCû¾µ¢©fñ!E†d(¹˜d<ž% ]•š²J&Dy/HjiD[Kr‰ÀsµÞ/zêÀHO«‘‰ËŸ¿éU¾‡èOîóú”7óÊÏo}GÈVu}Ü ÁÕ¿¾×3$í ' — EíR…dv)Á)é&æ|¿Å6Të'NŸ‹õf±ï¿@ü¼©þ¨78ϾåæÇ¼ùÐÎ| $g>JI›ïûêÆ×kæ¹éñ9‚›ïs„³Û¡òr¤1Ú+uK"BrHQJ©‘¢Qäxûq»ûºÜ­Ž—íîK{î¿´wö-ÔP'àá@£¤©H8@HJIÃÑR(©Fàøû(…Fún—{Åq B=å b4„ä@¡”4(åÕ·ä@#·*È]颠³¡´rf1Ï ú'µ#™!9f(%ͬjEKv$úe)3›h<y*ªÖùxžð'QE9R—ùHPý®ÚÙqRW7Ë5Ø5¨/F°L.,b @!*8%¥i’W¹–ã Q#kޝýš7”VÎ,à™Aÿ˜k’c†RÒÌꆠo_ú)÷Ü3²vNÏÈ·rË9Æ($¥¤ÁªVXzÅ-÷ çÙ®è<ûj.‡ð0¡±R7$L $¥¤aJÿg•¤aدÎá ßPZ9³€gýã @HŽJI3ëw`h,ǬÙ±úê™…ÒÊ™Å<3èó4 É1C)IfýF ε3î ±s`6”VÌ `™]øÇ\¡ 3œ’fÖ÷Hè·Þzfû_‡ÒÊ™Å<3èÇ É1C)ifµF“£ïÃúééæ{Cýå`c,4™ „äÀ¢”4XçûJs`nw¦l¨¼i À#…ö2÷D($‡¥¤‘Z+TEå3oóÏr¦l(·œc Às„ž2B($Ç¥¤9öû´äHÿçåÓš}öº—ÙU•ãŠx\Ð:fb ÉáB)i\ý^5¿wßR@¦µ1o}K®3ª`[y{ˆøöÙÈš>}\{@)éö ´ÐNâöpÜ÷àMîP~†Œ)'ðÄ¡ûq $G¥¤‰KåÏl›_m7ÝÛ&Œ)'ðÄ¡ûq $G¥¤‰WJH?¾¸ôÓrß93ëíiÎÖžÊ,Çw>ž§œ”59ßTäØ]æ#ÑõÛ-X´íð™=1ûéö¡æb KòÂXÿJ($ç¤aöÛ2à7Ò˜»åfµ}¾‰q¨³` À„f2ç"’ˆRÒû]æJº?ìÖ›·0ÔY0àB39€@H JIì·kÀŸúáê—ÛštÊ-çð¡§L ÉqD)iŽý&V%ŸºÍGêt®Ò·²ðÙùàB9Þ€Ç ­æð!9¼(%W7Âèd’‚éð¼¡!Ê`L9ñ€'Ýçˆ!9â(%M\Õ¢Qé4DÿzÈÃúeùt‹ýÜPs9Ì€‡ õâH˜@H&JIÔõñ3e,ÌYmztv2TUŽ+àqAëdMN C!9\(%«ß\¢Mhq’½—žL(‡{>žg |æú»QEŽìe>ìq‰:<`Ö›ÔNH«oä>Ê`,)æ ° /|gNb($ƒ§¤Y÷ûM؆fM_ogj.‡ð0¡±L $¥¤aöL˜tžá°~îö‡åóË- 5—ÃŒx˜ÐXÿ?$L $¥¤aöûP¨š‡9ËÞÐPU9®€Ç­ãp!9\(%Ëjae:µ@¯«}CcÏÁ˜râ1OºÏ]mq”’&ÞoXÑ:’8s缑ÅeCååHc)´—C „䢔4Ò~K‹&N`¦xßDÏ7XRÎ:àYCß9Ö@HŽ5JI³î÷Ðp–f}«=ßPs9Ì€‡ åî¾@H&JIÃ<²ìvûõvsó ¸CùåXÏÇóTÃÔ¨"Çô2´ßÂCŽ)ÓûßCÓ¡Îrx1OšÉáBrüPJàq‹d~ø¤õÝkãÞÎ’Q¦!¿ŠÛA<žm ³x¨È4”lÔ>.¾ С|Cƒ¢ÂÍ^άG6{A)kòu›±^þM³û¾ endstream endobj 2894 0 obj << /Type /ObjStm /N 100 /First 1000 /Length 2290 /Filter /FlateDecode >> stream xÚµZM]· ÝϯвÝ艟#@RÃÝ´€gÑ4ðÂuEÐÀSøHÿ}IéqÞ˜›¯ÃÙ«{Ž(ÝC‰¢°›•Vp´V4 (H’ùˆ kƒ‹ CJv£i0ÂèÅh>šÀ[ˆñ‡„ØÝÂP jà]æS)0t>Õ6æSï´èY0"˜sÍwÑ{ÊOÑ;&=:Ž¥#zŽ´ºï–ÿgÑd j4Ÿj!XïöB8ûŒ£ t´BlÑ{j…´ÅS‚B}¢Ò˜žû ‘qôÅå&Ñ{’ÂÐg;-Œsðœ’É‚—Faæd>ij“Ü ÷éCáÁÂXØ4P˜Š´(ìss\XŠ ÍvZ„!Æ{Áè3"JÃ9JúÄóY•¡ÑN ˆõiaq×ÙBaú+\”ZôT¤(ÏÙ-*}‘^T9ú,£hqwZÇüV´µcåïÍb>œ²c›•N³§Ê¥sLÊPÿ¨dz®Zºò|·—Þ§ç>)}tvÿ,úú"|’ý+‹^ùû¼G;wÆç$ð:¯ÙŽ‹û2ÛIqôàíþåö9’½—1æWâÝfñ]u+³£Ã9’ü§èÕÀb>qaQ1Þ°¸˜N<ó¿õ9’î´ÅçHÍ`¶ðüËvt'q`¾ãôN7¢‹Ãä‰~PÌÏÂâ5å;‹×ºD‡-^‹5^sŽ0ý5WŠ7°P5"òÝ‹w—þ÷ßûrùöLJÏw—7_þõyþþ·_>üçîòÝÃÇŸï?–ŸšƒööîòýýûÏå'ÿ0+ºØ©s ¥X¯-ä0°ƒ7û¶¼xQ.oÊå¯?<”ËËò'øçòÍ7wþï+9•êô2I;TÁ±™TÈ=ã©¶j ›Ië”T’J«Ôp3){6n¤dU‡m&EpÏôFŠV[×R:‰ZUå#)ŒÊÊ›=m­¶'£Ûzõ`{À çpºÜ«ŒÛèÆO¤ŘœDÚG…â‘thUÆI|JîÓ’_”z˜u«ü¢ÒÓ®thÁ^÷Ý¥¥ö¨ïàAQé4>‚•ëÉ9Ì^1 oY`‰pD\ÛË­ú¾~ñyãqm+šgïc‰=J9؞烓ø†¹OKìqbUœqÒv7Š8]–Ø£€#G'ÃrÒÚ¸&eØÅ#ÛÁÚ.p¡DIcñyöâ‘m³ƒì–¶ô5íü|Rš‹ä¹ûX‚zÍသå zîÞ—ä£VãÁm3¡/ðrõ/*& žÃ7+&×ýü¬–îýDgµD—&f¥„úf£T²öóQ%„ÍF•„®„jûEï@5î˜M¨ŽkÛY|ÜE? #G¢?0 #c­ƒ³("G8NZ(fQäªúY9Rý8éœbDd­„«2özhqºŠY 9ºUp–ƒ³²D?« G•Ê“ V$Øþ ãw§>/£ˆâ©@+ß—Ë?~üg±÷øÊ‡/¿þú6½zøðy½)cµ}EPâöèúeøÊ«W”W·ù¦íï_^|xÿæÞ»Y.¯_¾*—îû\ÞþÞÛ×ïþ}wù‹ÓÜøü)îÔM¬pðÓ×ïïãoÍÖßþ~ÿó/ï¾{øm ƒ‚ÓYLäëwým_‘•VÃ9†ŸœxÞÌ‹þÌ{yW£§1Ò°«aÙØ²±ecËÆvm·ð®¤iPœ†¤¡iô4F‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰L‰L‰L‰L‰L‰L‰L‰L‰L‰L‰Ì‰Ì‰Ì‰Ì‰Ì‰Ì‰Ì‰Ì‰Ì‰Ì‰,‰,‰,‰,‰,‰,‰,‰,‰,‰,‰¬‰¬‰¬‰¬‰¬‰¬‰¬‰¬‰¬‰¬‰Ü¹'rOäžÈ=‘{"÷Dî‰Ü¹'òHä‘È#‘G"DNYYÊÊRV–²²”•Y"["["["["§-5h©AK ÚUƒZ¦Ai,ä·__lÎÒo–›ÿ¨ü 8Ωp¯òïíò@”€(O*ª¯ðí¶Í*÷ͤó~ìíöÀ,\O;opãÅnf5øè~žtMbVƒûí鬳mötÞ½]™UaÒ͞Π²O¥a¤½¤2/È>L“Ú6O©Ìû±7ÅÌ ñÑ®ï¬)bºî¬ÝOÃÇrÊÿ…õl4 endstream endobj 3013 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1885 /Filter /FlateDecode >> stream xÚµZ=%·Ì÷W0´.û›dpâÈR&8±}`@gràïjòY³ÁDwû¸;3,6Éê©f=J+<"φɆ±yÉŠzdËõy)J´y©—NóÒ(C j…šÑZ”=öüúænÙ’B:Ÿ$-dóQ²B¾žõBa”­(Ô׳½ÐXÏŽÂÔò*£¦S6‡Ä\Xud ¿šçŒN½s¶ðkŒyÕZQ¤É¼Ú‹ÐzvaϫҊH`å<ä˜q³ø3 %æ˜ñCúœ&±"cΓxÑÖçÕ(ÊsÌÒ‹ÊzvÕù¬¶¢6çJ S ; ÇŒEÁê䘉™Ë1cc"–ì¥{Îì% þ'ZïeŒ>{`ÅÚ¼# ”+‚"ìÀöEšjŽÓ Y|€$mí Lµˆìl€&­ÏÕEÈD­%ìQhQ'âÜË û‡H”ß>}z{ÿþ?ÿú\Þ¿ýé§/¿¼½÷ï¿ý2ÿó?ýóíý_~þÇçŸË Ù ýõíý/ŸÿþKù»TÿͽZNBÔ†~-¤R0nû¶|úTÞ¿+ïúòý—òþÇò;fù}ùæ›7üû˜¦5z@+6õTª"2{@*¸vT´z§T©"«]e®cQaJ«Û%=…IŒÀâÁäV±«¿Úüh#¦hU‡ÝÕAlüTG¯½óeÐNu½Ÿ^ ½Wö¯3†Æ)Рº2Ð 4¢ºùeP•ãIHÐ'µé×C½Õ^g.~aš×ëÒׇU«xåm@é(G]å*–¿ J^; k…H¹<½Íñù¼b”¤BÜ"±}˜Þ&UüÚ+&°a V»×¥?¨ ®a_ß½Þa†UíÏF:WRú:&ÂtA\aÙɸßÅ4¨!}T¼UT5—0_›H¥ú#SP Ti¶È!A&-D[Ddˆ-‡@Z¨=YWxԛ׋œš]jÕg¹ó¥^Õõr¤­Õ¹Hv—Ñó ã-ä]ò“eó~Ñq4 …ìá #79ÛeP‡Ò'rxm´aŒöC -ÄOd·*cÃC  0zÃ³ŽŠË 1ÔÆð¬£ô2([³+RÍéò’’!°Œ™eT¿ Ú †ücfµcÌ!MbèCÑϳŽâË øÄ{åWPšuÔÝmD-Äa /Q Æå@bˆÂˆz7 ’A =³ˆºÌÒ†¸¾PQÖ/O®4Dö!ÒYFíøb‡@ rȾÐ,£ä2hƒúpŠC³Œº‹9 †ä]fµ£Ë!E–R›¶ Cq¸#Ë!mB^èZGß©±ß˜ˆ¬õùNñ€¨Í£9´¡Ìl·’|Щ6÷ÔÅ/¢NQ[xAÆ»‡ðP¢tyBùîCÛ!@”'LcBmÅÞ)86¥†R‰r"ùŒ]YrІ2ÄxÑ>­ÞŠSSŠd¼„îñ]"U9„‡êƒÇ¢½#Çmh/vP2s/Ú§{³ÕtA­7E7]ôr€¨8TíÓµAŽ»›ØÒµé²hŸŽ ’ÜÝ)MdžiÑ>Ý$¹»´W”Þ+Ò©‘à»òBQb¤O=¡näîÒ0]yͨÇöì÷˜ºHƒ&lÑ>Ýä¸Ë{u²òTCŽ»ËÂtfŒí§+³ÓÀÒ¢œÈ/ùL@ÖÌq—I‘ÅÄX´WR$9¹û.”¯MÚ$“ÜÝ)•nˆjÑ>]$¹Ë€¡ˆjÑ>-$¹Ë€.ˆjáeŽ»¼„ C‹öÓ{é~—†¢ŒòsÑ~:/—óè4^ú¢}š.aÚÇ©ÓtñEû4\°T—©¥¹QÒ@ß\l Q-Ú§Ó‚$·<”ØÒi1^´Ÿ.ËÎÛŽCoûtYæ760–ˆË¦Ã²H1Í•ÝIü1¼4WbÑ>Ý|MëØž™ÆŠ½"DEÓ/ïÑé©è¢}ú)¼ñ”ϲÕ΋öÓLÙ^Ä!Á–f Ó¢ý4R¶Sz(“N#e,ÚOÅ/Ó~š(ýEû4PvGz§"œÊëHoš'»—Ó1ÀtO Ó8±Ý‘^:K˜ÆÉëH/Mä¸Ë€iš¼Žô¦e2.O¨B´Eûé–„]L·äu¤7»a:%±h?]Õÿ·„ÿ—AÊ\ endstream endobj 3133 0 obj << /Length 4459 /Filter /FlateDecode >> stream xÚí]sÛ¸†ï÷Wø2¹0J€Hö²Ón§½ìä®ÓÑ(–œxb[ÉI7ûëKÊ ptp^€‹mÖ’œÙ8â9ïy€Àè«jøO_õÕU[תoº«›‡Ÿªýßn?\=ÿæ_ÿIûÏ]¼&ŸüË»Ÿþô³µWºR}Õë«w·4Ô»ÕÕ¿ßüü¶«ß|y¼yºÛ<¾½®ëúÍòqõü›¿.Ÿ–Ï¿ûÇãjýËÛkÓV}c\óö?ïþùÓßÞòZcf ?)¬õU§zç/ÐuÒuó,p÷ñnøñiým·Xm×cî?ýÜ‘#Z§´­‡øûÏÿùíµnõósô'ÿ·—?€9kºZ™Ê,ÝUvø7UõÃ/Úìm>þê÷tü5 °÷Üy’½ºí"1}«*Ó‰Á¨§OG©#Üm­¬îcÜ·›íâ~s³¼ß­·_ïnÖÛõòþaq÷¸¸½»ÚѪ꺫롵7N_DkøŽ †æjUÙîw4´74ÿ™ç†ÖU°¡1sK54kTÓÔrCÛØz‹[—n†“–îþß§„ÁK-Ç` ÔÝö3Kah´êL›ÂééÚYÕû›X £½˜r£Cl4­8e43Çh–:2ºÖÊ ºc£·›dmU ’»“þ6E(}¹å(CŒ’zšBIÄÌAÉRG(ÍP@ïb”O…‘V­52"Ê@÷Æ”C0tê~j`DÄÌÎRGЫ^õ]Ìüóöîñ)¦Þåªó¥Ž?›PÎ÷p<ÆK|NÑ JæÀ=ÎËÙÚ¾Wµ³1ÜíúaóU81wCܪ9?ºëT1W‚=29A–Š™–§ŽØvjaB³»ûõ•Î_'KÊq‡7õ=…›ˆ™ƒ›¥Žp·¼\ñ´ƒ¬^«¦²gDQõ•—S 0UjobÄEÅÌ¡ÊRGT]«¬fß¾Û÷ÃÜd³}Õ#®É˜rè!†NÝ×NCèDÌè,uÝ:ÕWµ}ñþËÝýê¢fLS¹å(CŒ’zª] Q1sP²ÔÊÆ)Óµ2Ê›û»µ4„ÖU£œ>M”ˆ¡¯³œa€R3u|àÀˆ™Ã¥ŽÖV¹Ö¤.vk‰£i”q/1ZF”|%å”BL‰Ú¥…”ˆ˜9”Xꈒ±ª²PÚ/å]FOóu–3 0Cjfª§1s²ÔCݨ¦Ÿî.k¥ÐW[òp<æH Õ®…ƒ’9óF«ZuÆ&(‚³¥îUç^pôŠ0ùzÊ9…5-EŠˆ™ƒŠ¥æ¬š~LßV_v뛋êqS¹Å(IˆòÈÓJ*fJž:BÙeû&ò¼ºÝTO9«³¢¦i×j¨˜9¬XêˆÕ0Qï[yV¿X­·—»V3U^N5ÀT©½‰¹3‡*KQuZÕLÛ׫ñ>¦‹:™úrËQ†%õT·ð *fJ–:Bi+Õ6`Ú¾ÿõf³ZŸÑÉÔ×SÎ*À¬¨iÚÁ%R*f+–:bÕ ²k“aµ¸]îž^ú~šIj9†c ~¤01s0°ÔÓ+«]ÃÃz·[~ºŽm‡²O×A¦{a妇ØtZý  šNÄÌ1¥ŽL×Ã+3]øÕ­jÜwþêAL¼îr&!fBÍIu"f–:bRuÊt`þ»~ZÿòtYÃ_n9Ê£¤ž¦†DÌ”,5GYtLS·¯è0`ª§˜ Y™–}S13XñÔ«ñÖ æ¿ø[Gëá¨þT:âæk+ç`nÔÀÄW3‡Kqkjêq{ú¸Y©Ó©]]™*)§`JÔ®A¤DÄÌ¡ÄRG”œUsÛÏËíî²–æ§rËQ†%õT;Üመ9(YꥵCz0·ý¼]?=}C÷vêºV•kÿ¢ˆŒW_N&Àd¨E©NFÄÌ!ÃRGdšFÙÞ 22’3îd¾Ür”!FI=Mu2"fJ–:B9>\Ø‚Ùðv½îàé‡n[µç°Ä‹xúšËy†˜'565º$bæðd©#ž¦VµÓ§|sÁùvM_n9Ê£¤ž&n¡bæ d©#”Ú¨¶±åxßûâæq)Þlpß^}9™“¡¥È1sȰÔ™Ê(]§Á ¾ö‚‹Y^v9‘Ãñq&q;Q2Çq^NÃôZYݤq€›r^¾ŸLê‹©Ë‘E‰KýTÌ 03‡ K‘i‡¯ü.} CW‚O€ŒW_N&Àd¨E‰¹3‡ K‘±½r®M“‹ó'@Æ«/'`2Ô¢Ä";3‡ K‘izUY“$³;Ùñؤ¾œL€ÉP‹´s 3‡ K‘©;ÕÔ`»[Jχžý$vª¹œg€yRc‹TÌž,uÄÓ´ª3`ûüÊ‹‹¸E~ª³œa€R3S}’ˆ™Ã¥ŽêvŸ>ÁðLF™*)§`JÔ®Ôˆ™C‰¥Ž(UNÙAz‚ë 'zÝØ—SNêp<EK¬8%s0çå”ôðmÕ·MZm8µ¾4URLˆ€ˆŽìJ¬BP13 ñԥΪÚv˜šPhgšê)g`VÔ´Ä,‹Š™ÃŠ¥ŽXµj›:Á L±N••¯§œU€YQÓó.*f+–:båšAv‹Y¡“ß©²òõ”³ 0+jZbÔGÅÌaÅRG¬ìørJƒYíÎk@1ÕSÎ*À¬¨i)VDÌV,uĪ1ªëѬùâžbÊ-G`”ÔÓÄr.3%K¡¬2N <¯gê¦zÊY…˜5-ÅŠˆ™ÃŠ¥ŽX­œCã‹{”u*·e€QROwÐS1sP²ÔÊýM¹ ’gÖëžË)'u8ƒ"Ž¥8%s0ç( §©Áì¾tì1rs÷yy¿X­o—_îÅ)“ÝïRóÒ|._U9®ã¢Ö™J>Í!9\,¥Œ«fÀì>Á×â×õn÷Rï¬8Øã¥–30êb@„ä°”2ƒz˜‰¶àÍ /vÛÙÁ°gñåPÇc&ÄôõTäˆ瓘aâjpc¿‚×ŸÓ ÞÁ__n9ÃC¤ž"ŠDH#K)s¬†9'{Àæ˜#¼´h:åœû#i"8¾†r8!†CBpˆ–R„3îaØÛ’œÄâj}2‹«“‡S=Å HêÈ4S‰;OR!P<¥ ªú[§  DFg{óíÁg_s9ÌäÆ"˜DH&K)Ãl»a Ï¿Æ m£šÊ¼ö…6;>)ØÙƒo¿¹Aøã¯I€¸A°${Ç㥶}{ :ríe”ÛƒkUÝGãÿ¯hw‡Ë\f™\(ïî!îîÔj]i/’ÃËRÊx­Sìõ®{ºpçà¦ê/z×–CW{6¦¼;ŽÇ½™xß·"í "û8̺qJ;öúñf\:ïyüöy}Â7zН¤¼;†¸;R»†Ù›ˆÉb)eDµUÖZÑøs¤$M-‡QšëÎâÉ—Cã÷•–w°÷0j§¼¼Iu䲌2Á¡¯ôI”_œ=N){cN —MîùRÊ…õ ":rˆXFÑð³6}˜^6²­ûÞkš“=^k9ƒ3 †ô½È€èÈ1`eU­ZíÒ ÀÓa§ÖM|)åˆBŒˆúº Ñ‘CÄ2ŠˆÆmt%Œü³»aŸå"çTnñ˜‚€cŠ#OÁ˜‚ Épä)eŽÃ”¬éuÌñÓú›0Ä7ܰ»ÈY=è¿“?Åý—€ý÷‚<ا:rÜYF™{«U'Ííî`Un¼ÙÕœÿ%ôÉso@9؃¥.°DG,Ë(ƒuzî “ðvÓË\’™\(?_‡ø|M­Fçk"$‡—¥”ñÚJ9+Ì Ð6ö•ê´¾Ìí°½Ì{RÞ•CÜ•©ñò0˜êȱfeÖÍ »îEÖ__õúÛäL9ñ§öƒ“7Ñ‘#Î2ÊÄM¯ãdâ`G-§*WŸïŽZ·}éåHCŒ”ú 9¤,£ŒTwøÁHÑuj;LÂÚ}¾äà§/®Z€¡QåÙ-Õ‘ƒÆ2ÊÐÆ 5*  ÉÃãK釾ôr¤!FJýýèÈ!eE¤ã¾¶ë$¤›ñþÄý^…úaêTyñX˜€cá#{µ|ç#’AÊSÊH;7ü¦:ò‹É‡ñ‘¶õ……' Þ’rÖ!fM}ó*$Çš¥”Yôj'Ì{ä÷÷½¢±ðäLñ ›€'ì#ûåÙÕ‘#Î2ÊÄÝ0j„ÙÏþý;þ¢ôÙ= 0UUÞACÜA©uà^*$‡‹¥”qY«tÝÆ¸à#Ô¶ 8PÞCܩˠ9°,£ vÜ"Äð ÌæáóÓÐw»ÿn¶«³~Ûæ¡Óø:Ë{f€{&5ÓTâÈ— Éd)e€ãž Z§.n–÷÷ï—7ŸÄÉèpèÍo #—½˜r—Cì2­¹L„ä\f)e—M­LßÍsy÷½]öbÊ]°Ë´bä2’s™¥”]΃ŽmJº]>®6ã÷ŒxÍòìï&Ÿj.‡`˜ÔX݉w“S!9˜,¥ ³2ªjóî×õ+¿yKÊY‡˜5õ]xCÇž5’cÍRŠ¬Ç½@šã…íýÃSø™Þ³ï·¾äb”áxH’ºjäq>Q‘áÈòÉÇë‰M‹9‡}Oí.á©’r®Æ›TN?Àô) S‰Ô©}–R¦¯Û!·q»]¯/þ}M¾ür¬‡ã1Uâ0‚Tä˜ç“‘Ž›’°×œì–·ëÏ‚§¯L¾_' àu‚#8½|‚':rÍeÛÃ~ÿ“¦‰Ú|üÜ™:yRÌš€¬Œ—Ws¨Ž kžQf=îŸRë˜õͧݗ‡WÊÚ{RÎ:À¬©ñ½¸JKuäX³Œ2ëqÿÝŬ_ý[&gʉ‡˜8µ_~y*Õ‘#Î2ÊÄÇ]\Ø[^öÄ3Ïö5Ξãríd´¯ºœf€iRkAÿ%:r4YF™¦­UÃÞѲ§ùã ¿g$ÞŸrî!æN!€^Lt丳Œ2÷qS˜NÄþ*ðóõ—c=©‹Ô "Çô8ŒtÜ;ÆÅS.ølßkvyOÊ9‡45œ¶‰Žj–Qf=n.c…éÔ+~Ðoò¤œu€YSã{ñe–TGŽ5Ë(³¯æ4Ât ÞÈþj†ØÞ™râ!&Ní½›èÈgeâãp™½efO\^A{MĽ3åÄCLœÚ¾¹‰Žq–Q$¾ßÀÆÉÀ/ûÉN_y1Ðp<äIÍ•qš,SØnèæ9?ÓY¸)ÐWbS –"ñ ›Úèc{· endstream endobj 3014 0 obj << /Type /ObjStm /N 100 /First 1012 /Length 2318 /Filter /FlateDecode >> stream xÚµZ˪ÉÝ߯ȥ½ÉÎxdd&ˆ ycƒͶÐBÖ\ÌàA×èã¿÷‰¬Ž®6¨„±*Aè®Êsòq*¢¢¥J%I)œˆÄ IÌÕ M"ƒ8©ºQFÒŽ{H8Õ¦þMMÔh¸e‰ú¼½´D£Ê¬ž¸˜_¥š˜ú³Ä2X-±Î±„ûêF5[õipIܚό)qïÍ-¾N«°Ï‚ Œ,ݿä¥Î«€ÒFnaXíó*þiÅ×Å ìJ?æX¡¤¥úU,M©Í«’”û‡(6`Ž•š´nc-©‰Ï^ZÒV}ö€ÒÞ|ö¸ cøìµ¤JÅg¯”0Ô¯*¶Ot^•Tµ8TS­s¬ÖTmk©ömlKuøR‹öde;’Qõ«µ$ãy•&å+¯œ¬Î±ØN3Vp`s¬é¼Z“õê+ÇÄm4_ Z™¼¸Ðx;R“Ék%5cR«“×85›¼&©µáçašÚ(Žl5õy(Å,ušs¶–:Ï}¶žºÌó…ƒôéV{އÃëmÎGÑ;û}Øœ>Äý ”£LÄÄU?…fið<·Öu¢ô4tL”‘†¿¯—4Ú<ÁNitñû:§1ÔïÃ4N퇂:s‡—Ãæ ¸9NwŽ‚Ÿ—m‹áa„}™øfß(ì%ÆïÅ‘PÓ9‡šo L°µ6 ñÜý6ì–³ °Q%ß/,ƒÈ܋˵é{lÔqÖ‚iÃØ~˜`cߘ`cr\L&\óáÙ³‡ËOÿþ×cº|ÿþýÓ§‡Ë«Ïÿ4?ÿé—÷ÿ|¸üðôáçÇéu0”7—ß}J¯k陚¯yd÷Ì(wî¸çûôìYº¼J—?>ýô”.ÏÓï¨éïÓwß=àÏ·ŽžÕ#ÆùŠe&^Ë×Öd“oÔ\G; kçе†%M¶®yt:`ë÷lÏÓkh¥ãý˜.ùëß±éýç_}7½xzÿi½@ÀõíÞpÌGØ>@vÍèú± vã//?<½{õˆi¦ËËç/Òå§Çß>¥7ÿ½Ú—oÿñøpùhßúè… ì üøôùûÇùmßýùñç_ÞþðôÛ¶ †gJ~/ß~Àhè¿]Ï=üâùtñù̇ËÕhaô«AqÅ=÷Ðížq5¸„Aap††ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ5k ×@®\¹r äÈ5k [ [ [ [ [ [ [ [ [ [ ·@nܹr äÈ-[ ·@nܹräÈ={ ÷@îܹòäÈ#G @<yòäqEvÍ¿‡!ah5 £…ÑÃd d d d d äˆAФˆAФˆAФˆAФˆAФk ¾ùÿe–»d.žîp&D–=l­‰¹Š×¬7R蓵±x¥ÈU”viPR¨½¬õ#HÆ4ɪ}mÄH¯Ù Ü èS^{¦Ò*ä~O´e ÓÑ+ª“ÒAÓ÷(è“•£ˆ9k¡ÿÓÝB¡O£Ûâ…*ç:v”RÒ/T${Ù~ã„<µª‹}—j¿Kƒ ”"kó#!‚Úß ô©²,&-µß¥A¼–*}mRÆ£ ¹¿qúÿbXýuýž5pUhâÁîÚIœ‚¬Ávi`U×ĵzÄlÙ›a7RèS=z­rÚJÉÛïÒÀЧÑø›íÒÀ„ÃúZ=¢QóÝ:¡N­òZ5¢®û]h ¾Å95ä ¶+Až*/®'ð|„ØïÊ€¬bok}—*g“]¨¢¾X/„DÅ{W7N¨“µºVìIb¿+ ê‹£×§‘rØïC¨¤TumCT ö»2|µÏ}éù.Oùj«û,­ïR¿ Ã×ÚÝã$ýk=ËÝȯõ¼‡Óa7§¶­ÇþÕ¶Ïà“Q Õù.„mä/Óq‘“è¼4¢í Þa²~t†ý$B/‹Šl„HÆÊA„ËYŠšÈÆõpbžGˆzÈ{Ä“Pü:Ÿ!j!µº"ãƒ.áy„¨ƒü‡C“j6^ì¥ÞOb¹2¯rt„'ýŒÇ[Ivý·‘ä@Ù¾icë[©n„œÖ¿gÉZõ²§lAáÝ#:z/]褢äi} ïÕƒgÿ8é—Qåµ-&j%<ª2¹RNZ —:¶Å„7ŒD¾߬£ÁçUŽn!áÍ¢ƒ<ÎëÙ~¹çm"*_Žˆ1Nâó↯QFÖQ׬ïê/êu máÍ¡Þy­¿(jm„È¥ØDð¡œé›ß̦U[€ê•LÛâÁûAå¨ýÚ†z³I¶·‚èÎòOõúE·xð&P§¾öø¼t‘-fèà2§ñͪå¬Èí×ê‹zÉR®á@’G[û|Y¯\áH;z>œ”ʬV¶¼×»=­.ŽiÈ[6•ùû5Z±>“ùë›É7k˜¾6£ð&é³Ásðró´zG¶ˆ˜½Â9áY.*H[h oì ü\LÈH[Ê&¡2‹[LH¥Ù5&fsðn¦ßÒìÿð(wo endstream endobj 3254 0 obj << /Length 4608 /Filter /FlateDecode >> stream xÚíK“ܶ€ïþ{”‚ ðc*q*9¦tK¥¦Æ3\ijG³ò %Yÿ>$A=­Ž*޽–—èFà ùé‡løŸ~h³‡:ÏU[4»?dÓŸžß=Øþýôü{o†_|~ó¯oøñ§²|Йj³V?¼}„M½Ý?üçÕO¯›üÕ§Ó®?<Ÿ^¿ÉóüÕö´·?ümÛoíOÿ<í»__¿1uV”¯LU¾þïÛýð÷·.niLd‚ãoæú¡QmUs‚US(6ÁËûÃð׿²}ìæ¿uýÿÇŸ¸U¥²*bLÛüåõ]kûsõoúÿÿ·?gTAÓԪѹëúXEUÿMeíð7m¦r^ÿ ¬ë²ýÐÀT[Š„ƒLµjMK[«Ì´W¹ðD—ß"Të\ø ªŸ»h]©bìéÍØ€ƒ>W&ºo€‡Ëßæ,tK t9€^™ñÐC@ïúÍîéòéCH^g™*†o=tîu:Pß–¶-Y  — (r´4Ê´ ôÓ¥;oöãi#„j†Þêæ›CåˆÍÝJ'æà‰ÁÚ Ä@.1ÄPä€X¡UÕä!±þyóx8‡ÞvØ Ò·wèåØÎHgëàÙÂ* ‡WK [9`›k•Õ!ZiG¼ý£«ít:N·=OÔUØQ}"1,¯Ã(‡dQ,?wçÃã×䪩nöúˆc;W!®o€§ KÝV,^K _9œµª)ÊkÀÝyÀ²­re²b]¿¿é=×*}øøaT; @.1ÃEÆÃ l[erC ƒÍãóys|ÞmÓvÄ©YÊõïw[Ôx¥Kò·×ßnÿ4@Ôÿ:ÈÔ“á80™8t iT¥Ñ-IîÎçgbO¬µªK³òÛЙÇ\˜tè¾:¬¾1ì…L&: @¯•e†~8½/ƒŸ:âüÚ–ªÎ×·x4—zîs:OßÏV7
      $|ü€l´nÙ!’‰(t0$ÊJÕ ›íGâòʨ¶h×<(8þ¶FéøÝö<}€Aöª dÃþ:n€¾¨”®BöûçSwß§ô¹0éÀ}$|ü€ltƾ=“‰(t0$ªa·Gçgë·Ÿú÷;ú@qóRKŸÓyúxž°°Ãyå ’‰á‰B<Ë\øã<ÏÝñÐQËÄ£ªÌ¬çS†sñç*¤ö ð„a©uÆÎÅÂdb£Ðᨦao>®w‘çÜñt¦n{)¨­DÔgô:nÀ37ÃmLÍeÖ Þàªú¥Ÿéü|<@XLÍ×&ƒ…­ª²R{æ _£»ô*˜o€'K'ÉÄC¡bãi¡bwÿÙª¥0éÐ}_úý¶gžw´ª©¾áÌ·&zƒün(xƒpiž<ÎdAI¾ Š’  žŸ6ÛËfß»w*Ó¨ªúS÷HN¢ÈÄ@8ˆt'²p$ƒCÙ€8Ë´–§P©^Pðúà Ò¼iœÓÇ”|> %õž;ù1Ô‹~ꛪíñ¸m"=³ˆSöX\’®Çᢜ=—tm 7Ù©:ÏLÐñà Ò­AœŠÇ2“4<Žå♘=ÿz`—UÜà12ÑÅã .D¼‰òðX€’ƒÇ¤D<3À¯ÌÀš¦,S=¬ èÁAD°Qr Vó,`I;Ïk¸‡%§©ÂÇZöà ÜKˆ#Á8YÏÄZõ8Ö”­gb}ê¾lúÃñ¸[ÅQ8ÕÍã nD:Æyy,@ÉÉãRbžàŠN£©ªPPõà Ò­Fœ¦Ç”= åéyâ¿ ·Î%©æW0÷à â6ÊÚcñJƇ—Òö8¼ì—2V0žªùñHÍ"­1ŽSüX¤’ÞÇ!¥?#Ò~{î™—æ¬ã§½%Ç+q¢ãÇs?8ˆô$#Îïc9JnÇ‘ü ¹oНôÈ›èôñx§"-Ž‹óùX¼’ËÇ᥄>/çú½ÝÝ4Ñåã9 .Däåñ±%‡ãH‰|FŽçíér˜&ÓŸ‡Ý×Íî}7¥çÖ‡+±ºf×gp%M”äø’ ’Dš/䨒JrWRÊ3”Ô®ðÞöÓÇ9égG/äk·®z‰®HpÝà â}]”çÆ"’7 "Jtãž¿¬ä¶.ÑUãð ®B‚å©™ØIއŽÕ<õ†ùÚmu·_»u„¥5~Ò„û´é4¢„5v H²7(cÍS!GB‘™{ÿÖí²ð%UbãV×HÄ®®!'âü5vîá•I¢Çs´88ˆåNÎÄq,wɆã¸SJœ‘û¾{Ü~:öä$PU™ÛV¶ÔÄŒòÕX䂫Ƨ…5ò¨3›š©ÿ°»—ª$êf|åÝ 2õ¤&_p‹3ÍØâK–W}Z5ã«|Þmcñ»îãörùB\`êF«"/bÊ/½MôÁø’ >D*i” Æ–TÒÀ¸’Ò._Rþ’a\ëôrÞ¼]J˜¨pñœ… "qв·XN’¹Åq¢õ-–SO}“{esù©¦V0½à Òù$JòbÁJ‚—,myY¸®ÿM¢(ÆaD1(„5Ê31•ü0 RZsÙœº/ß/ “u3ޏ ›A!„[É4ó?nWP endstream endobj 3135 0 obj << /Type /ObjStm /N 100 /First 1010 /Length 2234 /Filter /FlateDecode >> stream xÚµZËŠÉÝ÷WäÒÞäÍxåÄÀŒ…¼±AHZØZÈšÆ ºÔ‚ñßûdVEÕ5ô-Œ; Š®[yN¾NdDF % )% DÒ˜s7JiݨAºÑ‚e…A)äRºA¡´Þœ8´Ô›ƒå;X D®ý°y@Q$6”@š¹[5•ÛåÚ-NJë½` ÔRGaœ¸·e LBà`Egµ£°ë–àÙ‚,«— -lt´­èàÀjÏßF¸Mã=IA9õqH*<ðJP•ÞéSb½†¥¹ôŠ¥ö>+]f]³¥Ï*Á:, Æ£­Z0)}šƒiíÈZ0ÇiüZƒîó®˜÷:x1uÖ̺E!§Ò{…Agª}v1Ê,©÷ðYG[¼œM*8,‡œ—¶¥/ßh[C®KÛJm1%¥O1,¬î²n˜Î"6~•P´Œ_5”eN³…RRGΡTî½Ï;C{r 5Yyn¡Ò˜gLXåÖ-ªö­FèPµÑð5¶x¹ë#/*Lp”jk½÷Ø‚­oJX54æ>¶ÒB“Ѷ¦Ðt´­š•þkÅ6Í£m•Ðêh‹ ¸>¶Š}š’ H°ŽØÆ6~ÇNM¼4ÇVM2ÆŒIƒfÆBáo¨†ú0$èflz°@9£'­k¢%o])w»âÐK°a§C*­Ïj¶RïNÖy€ S0N`£±ƒ9 .ÝÚ¦n‚ÆlÜÑa ¦z÷êÕÝåÿÿu.?><<>Ý]ÞÿûÓøûO¿<üóîòÓãןᅥ n!}º»¼»ÿò>Zª±Ï·$н7Ö‘J¬FxçÇðêU¸¼—?>~x —×áwÝïÃ?Üáß˹¥hXNÈ­D–ú,!&ca©•.„5ÇÌv2anQÖ–ñÉ|Vcén¦f‹ÒÚ BžD¨ø_l!4¥–“G(%v²A¨Šgz2!çØÒ¢ ‰–éaDH9r[7 slZO"$ÆzálM3|Ê Ä3‘çUÑhüGLë…Ë)ü¼(^ìeœ®jìgEçƒôüú5DW$V] j{^'ñeã\S8ÖªçŽÏ(®£³¹Ð¹£Ó„-›QSÌVÏå“{<0ø¤Æ¤vîlR‹9¯«Ç%ªÈó|2‹/ŵ >8šÊ§¯µh¶Îf‚[Kçj¡VxËe2ác¬é©l&„—ƒ.¦UúVîuøˆ¼‚÷.\þò׿!³BžÂÃ÷_ýä/½y|x8o0wuy÷ ÄŠðoù£âtG¿üø é6Ú_Þ~}üòþÝ —·¯ß„ˇûߞ§ÿíÛÏÿ¸¿»ü4÷OßzÕÅw}€ß¿ýr?žñòìÏ÷?ÿòù§Çß–iÈÈKë»æíç¯hÝ_ÌË‹c¿xdb½?#[êF[ InøËâ/‹¿,þ²úËJn°↺an8²:²:²:²9²9²9²9²9²9²9²9²9²9rväìÈÙ‘³#gGÎŽœ9;rväìÈÅ‘‹#G.Ž\¹8rqäâÈÅ‘‹#WG®Ž\¹:ruäêÈÕ‘«#WG®ŽÜ¹9rsäæÈÍ‘›#7GnŽÜ¹­È=kZ rƒÝ7Ô s#»Qܨn8292929292929292929292;2;2;2;2;2;²ËŠ]Vì²b—»¬XYYYYÙ5È®Av ²k]ƒìd× »Ù5È®A^5øéÿ÷·\‘‹b¾£F†–zª˜0Þ\[l$§øø³pÌpgABwÊ ½1fŽ ë²1fD=7²ª—†È'b:]“ðÁ‰42ÝH¬¦qöÈJÛ8ÑO¦sçÑ]÷$§ Òvî8©b\Wë‰|r{ž3OâD*ÙÊ•R?¿osz)'T ¯j á])Yeº•*Û$NŒ·è>·ˆø¢ÜÈ·àW'‘Ž‹ÝIñ¼ÜHºphN"Í5í+jÈ2qè?OJmé¸ÐÙ—ÔàšÌž— ñ¬}4.u®Ö¾©i>™t\ììД¢ÜHňyé¸ÜÙ= Á;ÝZÒiœã~g÷€Æðˆ7²2š¦˜qËs¥˜Ô¢¶çk’I¤:®zvÅ(üS­·¦—&‘Ž Ÿ]1ŠŒ”s;wMuÜúìŠÑRb¶|2é¸üÙ£ÿëÉŠÑ~”wNËñ&å$Ï ãhŒªáˆ­'o£q´ FÅúó“IÇuЕ`X£µ³3n…®C‚È¥K*ãrèJ0I¢ä“wD²‘JãXLÎõ¼Rí›W*GR:™3#²+ÒBÑø–bt©!Ò]1’rC;™TÉ®±%ñÉÓ+ˆ‡hWŒHC~xrP&Œx(ížW¸!A<[1”bnWŠ™”ž<½)Å+tXŸÅÉñPÞsT 'Í“H×ZøFzP'™¤˜µ¾qÔĉ'%‰l‡x³êâijfWAFW#=¨Ï#ÄCiÌQ}|Þô®õñô F>t­‘o¤uòy¤ Q¾RÌA­|Úš®Åòó `>s­˜;éAÕœÓ,εl¾q”Î)MÊ'¼v¾‘ÔÏ‘KN"5Ž™vÁ•Ñ)Mr¼^GßHjéóHªÈÕ~TP§Yw‚^QßHªêI—²úFz»´NiRÔÐ ]¥Gõõiœý~™÷=(²O£,ˆ…öû ÐþbFÿ+,iùŒà¨Æôbl„k‘iÞ,0½Ømt#7Z>0;ª.MúH0¼hùÀ쨴D/=L6ž5ZêJóG>´®àAQiáZU„¥y„#ZEqPN¢TæÚH‚–ÏkjI”Ú$¾‘ÿ,ª8ª#Í#\ëHƒð¨†4ëÃR¯! £úÑ,Gêõ£AxT;šåH½v4êFÓ×ºÑ <ªQšD¸ÖŒáA½hßZ/Z>¹>¨í‡ÓÝÖwa endstream endobj 3281 0 obj << /Length 1423 /Filter /FlateDecode >> stream xÚíš]oÛ6†ïó+|i_˜å7Å][†ír00 Ã`¸±’iìAV’f¿~´E‹É#)lÖ6N‘"uòœ£÷yÅCZ&l¾ÈDã‰b i^L®î.ðñ·Õͤyñû/ÄŽ››soä‹‹w—BLFk2Y\û¡ëÉ_ÓËYÁ¦÷Û«z³ÛÎæŒ±éj»n^ü´ªWÍ«_·ëòÓlNæbJ¥œý½øíâçE›WP:²ÀÃȨBF&ÒRr[ ,8"Œ7î?lÌ¿e}[ï—ÛúÃ!õ»Ë› (¸0áØ͉"Í´óþÛ·6!™ „µú¤FÂü am¾zÔ¼û_üÓü¹à€zr†IŽªJÕ¢ÂTwj±ŸFG™#ôŠ!i<¡ÿ§Úlë~M±äLàC¸­&ù¸]·/¼T n¯–1¸ƒÌnÉÁ—¦½¼ÞUË}Y=l®Ê˜—v>ŒÅ¨‡Š+d ”nÚˆ‰ HhC©ÊÕ:±üJÄWyNË/ÄÛ*“Ü€‰ûòÇ­¶EîÕ2†y9‚ÎM-D úÝî!qû™j©|µÔ!ÀV…|À. Ø—º§±zµŒdŽ3‚„J4ÖýæßòmßÕV™|è. Ý—¿ºWËèAæ:%˘y½[^o>&°k‚¤|…Û)msýùdÛù0XOâží ƒµ›6¢jŽs‚'ôcµ©Ë7ºG¶šä£v`Ö¾ð=­Ù«e í s„›ÒY·5?”ÕûÝ>ÁZ*d†¾‰³0C‹VçƒoæÏ½ ðÝ$GU)…—o¯˜1äƒÔ!yQh$‚ð!¿¹~J€§Hs}–ä¡;¿as)Û^Ф à3ÂaêÈJ#Ü=?®ªmL_pD¸8gú£«W¾Úù°<$=+WÉtóF6âÁ‰ü“Àújµ\—׫û5°#”›Sÿ ¾€Ù+É'äÀˆ|¹ˆÖ #¯˜1‚Ô%¡ŽÐ JË›ûr¿O°2'tE_`›IoËË—Þ€¥÷5è“Þ+fŒôAêHz®·)é÷eâ-dÂÒäÅ @l©ù\ƒ¯G¯˜1‚Ô&Í1…²ª‡*ÆÌ‰G}7s­fMñù\Úù0OŠ1HÅU2J7oÄ„Jņ®K’˜=JV”¶%åKíÀZû×Ýw xÅŒQ;HÉMÒLŒ;½ýßMÀ–—/½ KïkÐçs¯˜1Ò©#é±@œÆMà¶|Ü&HÊ/º}†øØkÈçãÀ||¡úøxÅŒá¤îða„#­HòÑ~ ¼KRæÚÙg  ?º€ D”Ê~¦~šßûL=L)8 Ž{ ~üEïÃôVqÅLÓVÊ›£1úbw$¾­1_|ßß+dHü ¥F,ĸ¤õ95'0›tÑèÛÁ„'óÃ4b‡ÔP3ªsç¤qÛ6‡êp6]¯êòðŠN÷uµÙÞ$nQ ‚çùÖ¯ ¦WšC¤æpðü–vš>wócëtSE€½WÇû cº%TvËðÇpy,ËÛï äY D˜.*ß;^Ð;§1=ÞñëðN˜ðÈÞpø³Ç;vÈS¹ª¾{çyÞ!áâ3¬ÓÎ‡Ó é3Ž+bÈ7ÝtÉvÓ9>•ûº¬’n†9¼Ïñ…6Þý¶?;ÑÎ<ž;Ü=Çó0Ið¾“ùÌ Š endstream endobj 3370 0 obj << /Length 4265 /Filter /FlateDecode >> stream xÚí]Qoܸ~ϯðã8³")JTßÛIܤwFì+ ôŠB^˶õ®¡]ç’þú’)Îîr(™ÐØ^hlŸ43;ßÇáp8äÒ½DýîÉ^Î9)R¹7½{“´mnöº>¿CÍsêÁðäÛ‹7y'ÄMH‘tï⊺¸Úû×äh1ŸV÷«ýÎùät~U}S?ÒœÒ Ëòý_üíÍÉE/_06Òýä–%¹²$'ŒŠÔX’É”PžnZ’ c‰Rß½•žfL¿¥>`š<É»—x÷ Û“¤È²Ô<¡žORaž8>9ï’à!¦,K¸z¶}æ¯ûê#wÿ°µßèð{E/lÐŒ¤Œîe¬ \²–D¨ÿF’Býe-7ÖÿIbß?Z¢@87•´€‰mSr’°bÍœöé-Åë\Ó M(¡”vZÉV^^6Õ׺\Õ‹ùR19e“kå¼ÉbŸNý;ŸÜ-æû¬˜¬n—Û¬¤ 'iöS³rÓï2'’ò=¡þM²ìñ0ïÛØPÒQ€a€¶Œà@H³b€È3"Lˆ:ô…ZTæ»PõQŒÓ£Š{'W4œ;Æ0 ת‰”e$¡&PžþÓÃ$õ#Ýé‡É8=žINN%ˆlr ˜2†LÅšMB¨°S˜igÞM*ßïËnšYÍ<ó‹(ˆàÙëa6YßÅOVN>YA€X޲Ø2†Íšiª~µ³Õýý¬ž¶¹H—Šœ5‹›¦¼»«ç7IN»T¤j®ËiÕýéD$‡g§êê P¹J½ÓÇ…( ci<NŽt‡À1¶ŒÁ  YcÀS’r³¼:ü¬=|ônŸÉÉo¿Þvi*•P¹ ú¡nÃ<†CÔð|˜2†)Åš)zªhÚÅð‡ÕmÕG=h««@WÃ0/’3X´0žŠN- L¢¶Œá@@³æåjjª‡ëÐ{ ûŒ)cÓW00*‡ÅSÁ À©QáJ`Ë*4k*$ ÚŒ¡ThãÁmU^UÍ6-TKžáÚÙ¸"d'ú;2°e ÈÍ äTÅyù¾\ÝnC,9‘ɳûâÖ/ш(âkÎLJ¶Œ@<¤Y#.©RN½ˆ/<#YH’+±¯}‘fÝO''Ä&@`ËB4kBä”0)!Mý_d¶WdÅŽ Öeñdpp2@\8ºZ„¶Œ!C@³&C¦–Ô™[,SÀÑ[×!8… F5 ¤ý,p_6Ëê?Wj½°ªï*O¶( ûÙÒ ãÎñ÷ïãg |´;CÆà‹«ÕðŠ„0»Ã©Æúb_<™.æ×fyW-WþB]ÁènØïÅs ÀI!è²Ú2†š·vSF]mêíàÎâ¥"N1©nTT¨ç󾂷°zb—íD²ÛBŽ,Ƶñ¤qpÒ@ü¤¶Œ!͆æ­|BýH’ÜöÒ æÓrVͯʦËô¢#X½ª<‘H+/^ØÆ1ÆÎZÇsÄ À9bžèd‚¶ŒáH@³fˆÊ8Eb¦¼£ò¾¼¬gõªíðÌ=œp±Û— 2Åø3ž)NÎ^”€¶ŒaJ@³fŠnÎ¥ËÊÌ>µ^~ÌÝœ¬M¦ªÃ‡g+%aŒ=[a°çÄÃîà°CºV /ìÀ–1°4kØ“„¤ÂÌ\ÓªYÕ$4š¹™ú”R…ŒöOº]äèéIRR<ÏvVë‰xŒcèn|¿Ú2ã€f…1“º´dv6êû[sõmå™T:‘íÖ>vXF³@Ù±ø¡-#ØÒ¬Ù‘$MÌ~ÈѬ6[Užó*!仦çØZ·õs<ƒœœÃ€-cЬ”I"m}êÔæ åˆþ©V5´x¡»ÜÖ;ñ¸;8î|^¶ŒÁ= Yã.¤Z0ØwãËznÅ+—C̯\źû“­a_• ±ð¯CiªŒøá1 ¬î#ÅcÕ¿C¼&8Š”3d P¸ZSª43Ô¶YÏ]EÀ×yXŒ‹—]¶.ŠÞ À‘‡8à >´e öÍ|žVö¼åÝ}=3;IL;5ø¦ T‚ÞñíQH™ZØÉç±­l?s<šNŽ&t,¾‡mƒf@³FS%a¹­øMóéCÓ¬M·ªµZÕøF± BˆWQγNŠ‡ß Àá‡Hp<Ž[ÆÀЬá§aö·‚_¯ÕopÞCÿeæo IÅ‹NÞ12—Å“Á ÀÉqIÑÚ.´e š5ArÆû“ô† &ÃBºLt+y._o+¹uZ<œœ™ÀÔlC‡€fEZB‹¼§C;)4õåÃJÏ÷ÛíF©ú°¯o¡…u^4-€”kQ4J@[FÐ"¤YÓB-®³ÜTšêÊ.ÆKß)#•KRº«z)bO'§D ¯ß@[ÆPdCóÖF2I£ößH6µP,/Ë¥™i®*=óÌkÿÂ!×?/{õHS¦–ßO(ñ85Ì3]Žö¯A[ÆP# YƒS"¹©'Øù¤Öû‚ziÏû– mù¥Aωš{=úîý Àýº’®ºÇÐþhÌìª5öŒžˆ~ÈÜ˹~£ g›RÙzAïzÑÜ•+Se:=ÿ­û«ÌßΡ„þ€Ä¢æÃÄQ'¢ÐcxmÚ2¦€f MˆÝ5v(u®WH­{Ÿ#Þ×G “üÅœ%4>‰»Ç¸ï憌AW«NÂìõ5 {KÇû‡Ä}émçéëhç²ŽŠ‡ß Àñ‡hˆ%°e šdÑž4 èÚ¸ÖÎüÙ6“W_‚} ‘’½¦«ŒÛ¢ùàÞGé‘)Æ`È2Ôê+ •˜ÃquY—žä›¯ë\é&¦²fúx¦t¯¸÷=LYSÑ"²]’™š hG€(æá°Ö5­Ö_°[Wb?½½t%dǺŠðµYã>½&­\­Z‹œîe)WÚMåå¹ÑO¶)?"ì ªOİÞëå“}ÿØ‚vS‰ÿ}'-4càöÚžKœ‘Âwu»df2±Õlv§’±Ò´È~ÑK¡Ê¬…ªoSýëm9¿©|Û«™š÷š| P¦‚ˆè?úãíÞ?<€®+A.Qkv !ÐØ#ÊTl²'¯êåý¬œVwkÛª}¿Š†m|¦/¦ñ¹ø&q'Gú;yjv !ÐØ#N))¨IÞz`þ©ËY³Eyå)Š3ivYT'Æ¡ñm¾ß»[Ÿ.Ú5ü}wÐ߯¨ºó÷íÍvÔB_þ¬ŽZô —Ä#íàHC¿soíB: ±G:•$·‡-OæWËÊÜËp~«/qXÞÖݯËÒ—T}âìÙWa{Œ?âavp˜¡Ó)÷ ì‚9 ±‡™«TÏÌBU7tÍ/m‚?òJŽœ‘Œ¾Š ={¤:¿Å³¡'€FxƒÀˆ!*àêz&°œäön¹“¦±(çW³¶.ïi¼É8I^ö…Ü›nO$¡yÞ{ëÑ0ïÛ ØPb¶J½I"4dˆ•= ôÜp›~+ïîg¾bJ‰Ø]ìág†ñ`<3œœ&ÆüÑ2ÄŒ •þåCª¿hÄžËy7¸|¸.뙽 NßÔ<÷Eê;¦éîk#Ƨ"iÎÛ›2¢' }ì3]Æé­c@;ÒØÓ+cD­A ½Ž?™…çû_ï’wûRLšÊ¬,Žm²2}°µ-Ð7þ©žVó¥¯2™ ’°ô)÷ÿÛh­æ@:Ì×\¶wæ[€!C(Tö(F’LØA.3íò·çÇÞk{¨Üݰ1¢`}?`|ÀBàü%hÇU64"3Bû5tfFx?8#ÜTóª)gýiI:±}Ëï]÷®HóÞG9™Íw=~I¡|ù”¨îà$1Ï -I€C$ h´áEAŒ¾÷þzjŠ•ÂzúoãPT«š¯µ¯SÉ‘¹xV"Å;DOýëè4|¬²8¨Î„Hqe= RY˜8£&ç‹Ožh^Œî¾žrİ·îŒö@:ì×0cÞB1´cˆ#=KrIxaº|ߟŸžzS!w›QÁàa>œ<€@´° "H@eO,'Ò~C‰"ȧúÒÃNÒ|·4Q²îŒ§‰€Ób†Ñ2D“ •þ“sÝ÷gš“? æ˜Ê©^~ñžä)lwëÏøRgú˜fö„ÙÉ Àg'ó r”°e°cˆU=§¨hoöëSßÜvéçá×}!'e=³7KJßÍ’9U‹öš6;¬»âYàà,€˜ø NÐŽ!4ö,HR’SÎ>œüîÙÙ┺‹®’™†Fëâè®I íš\ñð˜1Dœ …þI‰é(ÂæN'¥ÓùrUÎfÈu4©úbwPÙz˜.YŠ'L@@zì3Ò´c€A!=tyÍ^yzv~rä =I{Hyz9[Y߯SÆ À)äÞN hÇe{Êè=W{-Ëég_ÓÄÛUäŸyºYÅú;zêЩk TïÔÍbQ@aÏ"•Ð$©)®Ÿ£Ý¸Hß\tÈÆ‹öÎHñÃ@÷ãÏ|ŽøAîàƒ:Kø9°cž€Æ¦lçÅx0·KI²¼xi­ûÖ/ñp;8ÜÐùþÍVhÇÜ=ÜT™mïÏÔ\—Û—Xš ²USÏo–ÞëféóO1ØâawpØ!þ=1hÇìýëšëÝ,Cµƒë‡ÇGÈl¿+ž?qÛU·„È<§€RÌ>h߆v P,¤±'˜„Û»—>Vùú½f±ôî¤t·ÐCãÕx²88Y tY€Cd hìÉ’¦îkÂÖÉÒNCuÛ þ¥½Á“sd*Ó{UMÀ)ã·x:88 8\zéì¢C@cO®&,ûÍž+Ó›ñÝ V5Ëþ¸Ï¯ûtòp§‰qÙí1 ãúÌÏ—¯órÒ‡fJ8ÿÉ[Ä#ëàÈB?#Ø1„ì†F$ñH8É“x|L> stream xÚµZM¹ ½Ï¯Ð1¹¨ER¤$ÀX`7†sIcíCÃÇ;YÌöØüû<ªšÓm +X¬KÀ~pªUïI¢Hñ©$\,•$\Z"7zb67Fé0¨¤ªä%µê'kꆤÖg›šF™m4Q¡zË€ÈÍŸ›«³PO$ê44Us .‰´9S"ŽÂœ¨oÇ’h÷‡kâÂÃ-M dp £øË»"s6Æjw64fxR·‰'”¸“ó '³‚ʪŠÔßobÎ! —æ‚ƵÏwÑXÇ|j>Us€­â?ÃA¹rª¥úURÅ0ݪ©²9~¨Ò8ª¥Z»£(žé˜Þ5'g ¦¶ÙÓÚ’–69zRêóÙH*sîÑq­äÏà.ÕÙíî3çP´kÓ}†v}ΡÝ6‡šl[&Éx²¡±Ioh²jÎa–ló&ÛlÌiêÉ:ù\ÙH6¦ZI­TGFw' ÃßhX72&¶iñ¾à‡f4-K­ñ|£a}¹S”mTGçÔËœÉ6` ü*àí4ÇÑ%õѽ§Ý—äöLÓð5 ËÒ¹º1u£ÖÙ®§¡Ö£¤±-l,Ÿ1Š÷``M–ÂÞÁ!¾È§o@OÅ}Ó—¾LÏ‚–Jíó5,þbs„«Þ›¯aù—.˜3ÁO„Qø*ƒ ÙM°ùDciz Íq¢#DµÌ§`#åùÔ#Í|ýÉ ã¦ lX! l4z¿{ñâîôö¿ÿ¹O§ïŸîNo¾üóiþý—Ÿþ}wúáñÓO÷ŸÒ»‚œPÞß~¼ÿø”Þi陚/=Ê Œ ßh¹E›ïÓ‹éô&þüøö1^¦? ·Lß}w‡¾°ÊäY„uôÜ;ïÒ7ç†e‚¼Qõ°÷Œ}“ÐÚA´AéÆ×Z6µÛ,Gêȇ“ÐZ.Uvf´DX{FΘ|jy®ôƒè¤cLm㫚;õÂq!7 j‹‰*š¹¬Ž ²ìÛÌ$äšuðâ%S,{U0 Iòhc-¡ ËÎSZ$‹í…DØ-#ŸOBÈ*k}ˆr"˶HQ2dª´6*Äjîm‹Bi”•ûâUÁ¨6Š•§”1¹+­ B”{ÔæBTiEýbÂ6<·E%š÷‚‚©fP½ yn|Ír¡ÛAazöÜÎ{/C–±S<ÙA|(- &7>­xÖÖŽOZž¥¯óÕ ŸÞŽ«ñ±fHœI‡t£FkéPX¸p™|È6£öµ|E‘6Ïá€g"ºÔ}4P»èÙ}SÉðšÚ>øzÍU·„FSÈܦëÑ5ɽnÑ@SÆ´µ|&ÙÏP&ß”1u-Ÿr6ÚÂ¦Š¡¥Ù2cÚ²¹ˆÑpñIÉ~2ù¦Š¹­ÄG¨Zìì¿)bd-_AÑRÏþ›f)Ý@ÅrÞûh ˜¶Ô{ o¹l(4Y]ÊÖzF 8ÙdFÿ-‘ð2½VÞéô·¿ÿ#’—ôðå—_ÞG£WOç•bL[ÛWBÉÏb·?:¶v£óŒž´iãýÓëOßÜ£›éôúå«tz{ÿëSzÿõh_ø×ýÝéO ¹xúìgnËøùñ˧÷Ÿ·s½ùì¯÷?ýüá‡Ç_·i0Ý»¯?|ÂÛ~¸i[Ã9‡ŸA> stream xÚíœmsÛ¸ÇßçSø¥4ဠ¾Kr—ö®i’ZîLfÚ¾P$æÂ9[òHtçÓ r%bAδ±ÍÉLÛäîzÿ?áañ@Ïý‡ž©ä,眨Tž­¯ž%õw÷¿Ÿ5ÿ9ÿó3jŸ[èàÉ—Ï~z-ÄMˆJ=»øM]lÎþ9{µÛ®‹ëj¾àœÏ~ÝnНú¿4§tÆ29ÿ÷ÅoÏ~¹hí ÆFbžìEÂÎ$QY–Ú82™ÊÓ&ŽËbu­=§|v(æt¶Þm7ãþ§×¼%"y®]Ôïüi¾Ð‘6ÿ°£¯èðÏþÿ/œ$— I(UmZL‚‰Ð?#‰ÒQVgúø;0åîý0ÐKû©“:‚öbÉr¹8ŠÛ=ö|b²öü¼ç8gæø$Ø÷áœ8i’À{±HF¨dc“`Ÿ{>1‰$AæDRŸûþ@(ÇNš$ˆ^,*' Sc“`ŸîyÎu#”žfÌ}ø…~@»¯Ýþ­ù¤ÃðtCFMë¡ì«õ_‹í·²xn 6ûy5grö¥ÜôÛˆ\,—¤°_a€¤Zûì>€tp@ì3  ˆe ϦH&E+þ»e£û‡¾Þ)#Iž?.½c_À8±ÙŒç¤3€s%£ Ê ˆe 'φªK2ÇÉv³_ý1gjVx9Éù„I`¢ImszgZìû ` Oˉ“Z …ÂBKÀ±%‘$gvà{µ:TÅ 9÷_L—¢¿Õu ’>ÁkLlã“ÎÞ˜@©8Gù±Œá#àYó!”$¬q·uC²/·¿?o0ù­¼òÀ¡Hª:O„ —»h*€”Š#ð¡Œe!φ í\ú›F£Ü(nªâ`™¨Ê«¢š|Ûm‹æ{ëÝ~_¬«r·m~òÑ4,·}t¨žsõ¿D¯ùãµkßÇ¥Yèç2F8Ü­Ñ-ωîm¬p»Z¸ês£ÐvuUqÊmó­Íª²ò*ó™×=‚§AiFrùÃÌ.0=í¯/hgWæW0TRËMž¨YV;?Õ}ÿ³/«ªØ.v7U_:ÉõØ€>ô†SÜæ%^ñή8L¾§h䱌Q<àÙ(.²ºnÔtÊ»j·ß]®šî«Ýåæ_ M÷žÑ~Îm·Œ!`@gGªOò`,c8ñÜ« & §´qû­Ù¸ÞÕËåÏ}&¸ 4›*ãɲs5aÄÈhü„@'„î™ð„†2¬€cƒU‰”¶ {ûzééï¡ÉT5øNÃL›îøª3€·PPS|æcRÀ³)Uœ¤‰­‘6S„+3èÿ8_Ô5…q”œˆL[m×Ŧi&–…Ù®£¼Ûuh’–>ˆ¾SØ&"^áή0Ì6®0eŒÂÇZa¦tÌÜnëÙ—«ªldlT-«âj g@ÖäÕÞ+¸ß<ºWÐ^á(½"Å4…±ŒÐ4äÙhš+’ å4½ÚUvCŒ–nõqu(<’å”ÉŸÒê¬ËR¼þ\(¾öc£À³Ñ?S„º:Æyq]/yìö•ÆÕÜ—7¾Om¦i!ŸÀ ¦-ˆÎÔ†¢UKË ž¹0ªœ+Ùn·ë>ŒýH{©Úy1AMúDô)!÷~ð”Щ¤e1Çýƪ†Oµ NòÄA—þɆ¶“Øþn¹ºüf—YÏ˵U|ö¯°±©¦ék˜Z©¹"Bå÷à©3€ódŸAŠß5O Ž!ž[š˜"n…xYøj˜T–§÷*rµ7鎇¨}g(ʽg•ACáîZ€4©´þ…9¡¼Úߺ$øt4Ó]±âOh]¶ÕÇ&,žÎTé˜@C<¶$9QîhʲX 9xvëítÔ´6l-lNãQé à¨@áÄ1„JÀ£CE÷I„çÌ¡‚·,#y:u=w­ˆ:e]ž£ñP|ŽÄôããÀ'ä±ÅGšñÂõ8ö€¢9ªØ48«›êsÑ,à—ëU}ÞÈ·©Ðlœ~$› [-lfâï à‚Ãô3¿à Ž!Á[ÁóŒ0W¿1íE¹ömà IS15w†Æf7šÎ ”i%@CÐ<¶ÐdBO“¹ƒæp°çC’\ÿŽO Œ›ÎxJ:8%P3„Ç%-%BšÚãåçò°jyñþWï€5e|âãH“Dšçm"ï̇} ôù8qÒt=Ì[ pÙ’¦¤ízv—«}é)Ú³œäSÁ6º`«ÇbйLß½i^_tï{Ú—#þ¥Ýž.†!vpo-:<%‰+ì!‡uùéÖ.±ÙÍÁ]µáûl)E¤pÕ¾mÔmâ{ŽÎÞsÀ\§Â«-ˆcHÜ€ÇV]ÆëëOš–áïoCrÓìõ;?lºã)ê àAMýU3ÇE-EÚ³bv%ry1—ÙìÅù\ŠÙÅÅ›¥÷¢GñtG¨6‡ñhtp4 PÈÈÄ1„FÀc‹FÂÏÜ:ßÍÇÅaÔ$&ã$WOoÿ@«“ÍZ< ( 2Oq Áðè`H%2qãЛå/žA('ÓæÑûv6Í8Ñe;z,  ƒÑ#I½£QÆC!‡-C’&`¨nIÞØË›¾z»›L¤Ó„×ˈÍf<#œ(™ŸÆ#'ýÛKRÁˆtݾ½Ä‚{Ñì)ù£®ÁWÞ%9ecWpÌAØœÞc@{3÷L 7ƒq QðØ2Æ$¡ÂÖqÜUq|¶ûävÈ67Ã5;ž«Âs½`&I’‰'¸{À¥.žˆÎNÔ§‡YMˆcˆˆ€Ç–Ýà ¥N‰p—2xy ï ³‡¿kÓÛ&&^ïή7̾ðÎ{aCz<¶z'9IRŽë|ìuöØ6ÈŸ$;U9Q\¶º«ðîý0ГáÔ r}ƒÐ?¦‚Åß>ô|jÒÕ fd:úC¡œ8 Ñ?.5ýŽ~sA*mÉ[è¡’ÈtZRø>µC—îhŠ€”¢#Mý"ÇE!-ER´— T—‡¦Ý‡›+ÿ5ïjºÞ$ŒI“ÏxJÚ÷qH€d#]CˆàîZBrAxžº¹œÌfû›,õNÒô4p‚ã~ ˜.ÛÑ`­Iê­À0†:qè¯诉JíüðƒNn^]–Í}kïJ9Ÿ@‹ pÎôLçK©ÀÞFÙg[ÞjÄ@Cˆ<¶€1F˜[v3ø I®9K§{Gï0ô±©'¦3€õCˆq ðØC)É]‘²·‹bNÝÉùMaîÕÙ–þº¹ìAzÃD¶Ùˆ¹3€‹ SîßaãùÄ£¿çaærzië{žúWUÝpƒ½])° œrþضǞ¡nyd>uØ> stream xÚµZÏ· ¾ï_¡c{ÑER"#@Rý´€açÐÖðÁuEÐ`·°×@úß÷£fôÞx/h±£ÀÈrg5ü$Š¿9ÌTRIÌD‰¨QSå' B’4 B“ÚXÜRó±¸'£±Ø’×±ØÑ;æZ‚#áYïÚ{P5{¼P9‘–àQ%aÙø«&êƒKm‰Œ=¨žÈup±TKã .@9‰µà¢¸ ïÁEqÅÆ-aSãž”!Ó§Þ „V 4eØv‘T=¤¢–Z-±wõÔxH 0MB Œ«kª!ïVSkm<ãÔºg’šyì®§PHªµÔ‰cŸXܫаÙ @qêÒÇ3I]‡,zìqÈèVƒ3¥ûØA·dEÇ:‡ž5„iuœÛ(™”@Ã…™ÒxÆÉÚØ–X;€z˜ =´–ÌǬ'/cŠ[âŽCá%¹Œ;€˜\Ç`±7;uN‚%ÉmHÃ5¹{HA…Æ‘ TêЊJè(Èa œØ<Å‚„‰”Ö )=¶)FR [ +¡R†.ÂLâ¿ FV54”($ÐHdp©ÚÝ«Ww§ÿý¯ûtúþááñéîôþÛߟÆïúùáŸw§¿ütÿ%}oP>ÞÞÝ~Jªõlp¸Ë\ ðê=—0?•\”°îûôêU:½O§?>þø˜N¯Óï”~Ÿ¾ûîÿ^ˆÉšUÛS8km×1í ÌÚr‡zž1¹âw¾ŠÉ|&IVÜé³Ö,]¯bJ=³pvÕ“(»øRÙ’s}&ÛBYª\ŤƒÎI&¹ÁMLò’áµ®ßg?SjægzKbYíº‰¾“sxpbÊÆû$6Øg¿Š ?è äYÛ3áÖž•ëu%:ÈX¨x.üL¸„Ÿå†S8H‰÷GÏd[Z»áûÊ1øávq ®ÙõºGPy)bÍ‘ñôž0ªÁÿ!šf¹®±/uç†Dc‡ÛÏwÎ_§PÝHi‹¬¨ µÕë~G_ ‡p{k0G‚{pì™n¸ÖÚ«nN7¼j¹Ée9ãE¸@Â5ðÈp¾ëæ@å07»wéô—¿þ-yI½–ôðí—_>þ_‹Þ<>< °7ŠsokßDÏ{'QvÛ¤ Ž9Ïö S2ì:~«ÓÛ/ŸßßãTéôöõ›túñþ×§ôñ¿…óöÓ?îïNâýÃÓ×ÄRC ïB_¿}ù|Ïȶg¾ÿéçO?<þºI­62rº·Ÿ¾àmD4øþ±pˆü+€Ç´ ö3†ÑÊ$hu< ™„N¢M¢ïDŸoõùVŸoõùVŸoõó[s?}îÇæ~lîÇ&g›œmr¶ÉÙ&g›œmr¶ÉÙ'gŸœ}röÉÙ'gŸœ}röÉÙ'gß9Ç `'hu< ™„N¢M¢OÂ&19ÓäL“3MÎ49ÓäL“3Mδqþø‚^OròÔ¬Žì³")Œù[ó’¡2k† ;cîí­ßÄ<¨7yÆÜ»Z¿‰©a²e¹´`›4laIw䌈\¦=ëM6F8¦5áì6 /~é¶ Ã%Ãó1‘ÕÄ,ú 9¦4mé$H½ÆI?ßÒëTkÀêgLuRÞ—Jôð"û>cß,IjâG#¯<;ftldéüõÓpwgȨ©-5…–F4>c¢³•†¢…Qê_\¢:-Å—Š8åv±q¸$^z™E¢]¦‚¢@Ûš»œpíþl^*¢ekgîÑŒB‰zÁ,1_ìK=0x½‹!µ‚çõ¥3ÚèI=sîÈsÕµˆ fR.–Érïu-¦rŽ­Î˜¨^«óš„d÷@L£b½`FÇåF{Ó‚,%ÇdgÈÒ²ÉÒì Z4TŸ}³È gÑ„vÇD)_ 1QÏš­ÍH"e—gþ "rs¹Oè Š}¦Ñc¸hžxQ/pkqVå}6 ™V^:^Œºì³SäÎõÆôí¨öN£–»ìâ¬ÑE¦µâ„õ‘ÍÙ°dº1j?ê| Õœí¹†p%·ÚsGá!\m³›H–‹Ü˜Ý…×bÓÖÎÕ0[&•O<)¯‹ä9‡µÈ¤HÚ>m'Ü%¯ùliöþcä=ϧwÙW¶þ•‘ZìhRòïå A´Vd,ûäñâVoü¨O ðÓëþé…_³5ƒÌ‰¡~âAôÆ$ú寰éJV¶ë8ç¶ò3%1$hûL,üš¯Ôͨ0:íp° çµ®SjË2ñ•ªÕ¥“)XÕ÷Û«|sróҾƦ6¾ˆ‚¸#è¡~£ÛÁáR¯ýÅæ) endstream endobj 3436 0 obj << /Length 890 /Filter /FlateDecode >> stream xÚíØOoÓ0ðû>EŽÉ¡&þïpÛʆBB£œ‡Ð¦¥bM¦4ƒñíyŽÆíg CCMZ»ÎyïÕïW;.bøÁA’R”0Ì7'qýj¹ Ì“«×'ØŽ›ÀÀ‰3òlvòâ‚ãc”pN‚Ù2à˜#EÈ.Þl| ¿GŸgoNÎg»@ÜáϨGÞK)y€%"˜3ŠŠ!L™ÉöákQVÑ„JN‹<¢8¬2x aµÕuV o‰(¤l®ÆÑ3‘„—yDdX•‹F„‹Ûyµ†xuCu Q&ê F1ãªñBiÄÞ_¿ùâ“{ŽZ0mc2œ#ÂhMqøŠø…ImbÿGsýÄ Ðaò0íóa1Æ-¤ß¤9R›¤ ÑX˜lĪú¸ÍJ IDø.­Ý¦×}¢&žRÔß„ç <ìÌ6IØnÖMÉ^?qtQ:Hc(ÑNKN%C–¼9µ%‚•&µ”N›u¾ÞVeZ/KAÄ¥ú—ש>fÇ«Ø]ïCát «NmC$| µˆ˜!FíZÆ,‰«l™•Y>ϦöP®ÔQíZÃ[RÓK;¿ãÅ´|dÜ6RÑiÆ©d7'¨áJ"–X¢Üªy_«2ÝÀj÷:+MGÒ¡pû%GN’f:G#qxìwMv!q+@âÏ©‘H(Ýnm¢ÙlæšÃ7’úÙël±Ê6™¹IÞv#!¦àøÖ—{Xb 7Óúx+æòI{}'•½$æž“²N*mCR|5N‘ öÔu oŸNËuµž¯·³K³½ÍÊ/pŒ’aV=\¨—Éçòü†ú€Øé/¤ à#âvPÞiÄ)e‰7©V}Ê®^gZ‰àzÏ©ŠÚü¸6BÎïà˜¾…[Ù¾Õ$A³ã9õ)±Ó9^IÀ§Äíé¾3qKRâMª•àIn¿ƒ™j%‡ÓâFï/?×ùʹ̗E¹I{¿‡Á#O÷ÆÄvÏÎæx$m·i„“N$N)CH¼I5’˜ …íÒu)Þæóæô+Ã4_&¯Ò*mÀ,²»^*”òÿT윎§ÒðQq[GDÜIÅ)eˆŠ7)PaŠ#%í÷ÏÓÎÄ7Õ ©âøÈÏÃã%5S>Z’À#i¯³Dt‡ÜRîIúОÅ endstream endobj 3482 0 obj << /Length 2555 /Filter /FlateDecode >> stream xÚíœMsÛ8†ïù:Ja‰ÀÞ2N&•ìTì©ÚªÝ=02³VU$åLþý€"6e|ØŒØcÕT™ìnã}Ô 4@áY¢þÃ3™Ì8¥H21[m^%‡wëϳþÅÇw¯°¾n©.\‚+ºxõ·ŸÓt†$‰gW³SD0±ö..gÿ™ß”‹ÿ]üãÕÛ k)%äŽ.»+oùäÊ'W~RÖùTQe‚!LYïîb!Ù<ÿ´.KÊÓyuÕÿ<«¶ ŠçmÑÿhº˜zS Q–‘ΔúûF ËzKx±Ä˜¤ó÷ý-u¥,áùå~Õ–ÊØá~œ$ÐV¯ÓŒ)CW2ÞÿÈFÿºû›Sïûnoz/9©¡•t–1ŠÑëŽRõ+”Hõ?MÀøH‚¾} î·0 9Ñ2G¢œÀ0üøuWÞò8F'LÁÉfÉP–j¨C'I’ù»¢mËíg¥óó6¯Ûâ²''£c+¥‚-˜‰@D2ÛRNlÝvé­­ËOûÖ“Å$E4!§ÕÃcóѨ%›Nã` D㈠â¤D£ñÈçxGE&3Æ%" íݽ)ö{SÔýÎÚ¯ùal¯¦uî=1Ždúõô9í“Ý…"‘a;¤÷¥¿ ¸¶ÁŽÜô 8Ûk0’(Ç>ÝiK…€¸Ùõ v'ì·ú0)û£Ô[³pFf~÷µÿ¢\uÿüÿ‚ðyá.º8cˆ¤Ù‹›¥yòŽóÉyä‘´ØÙPƒ‘Äp ú´81‰2Ì N£=­ªþÒ’×—· ¢ÇW˜®Û.ÞÁ%¼pI¤xöK+z@§³2±uÙ“IŒ•#Ÿ·kQ¡jöúõúrSn˦­óÉ;U+5sJRüÊ•¯´è‘˜^Z¡Ò;›0’˜¾G>=¹@ýL„Î?Ô––÷z>\Öiæ|ÎáÓÞVºÕt]6¹»ÇÔ-ߨi ç VfzR „’ Àˆ$]ЧŽJõž9\FmR«°ÿ&˜}Þ×Ãù/d£,KO=ÂÔÇÈ3™<` @Þˆ7y0’yaŸ–<Φ¦Ù3¿7qℚZ1|êœ>4µ~ÓÑ „Є˜`éDDC3èÓ¢©Ö_µhš3‡Ž#:¯KÏyGU¾>uM΃B­Ôt!!ÄÙi€‘Ä ú´¦1A „©¿2¿ùpÞ¿¸ªê¾åðË›3÷îC‚¾ôÆ©%=ÞÓQ „P‚²g—FC)èc‰„3J¢[”ìÚÂ’sÓ …Z†¦ó_Šú“ZhðyQWMÓ²¿ä,oŠþóbÛ”myS¶ÝÊD·µO"6”òõ¦¿îC¾)œ-"1"RÞCŸ\úoš.×` $:\ ’˜\AŸV.’ʇ•‹¸Î›BmºÏûáź_%®òa‘Xn»cXùðTÇ‘ÝÃ&‚=±œà]ÌtÑ!Ñ¡ÑA$1у>­è˜ „š›ùðÛ?òÍδÿ–CzŸ,·šÏ$OtC×§z?4ÓE·÷‡4ãOœ =FLñC#8‘ .Åí4³X©âsëªR ÷²è}î¦.S÷§ø¥Vv8fˆ'“ Ð)éfF'ìÓ̉H'–s2R—oaË·*íe®÷þyînß(XSyjßJôPN§d0¢*F¸“IŒ’ OK‰J „Jhˆ’«¿Uö™&ß·×E¿wVª ²Ý!wCCõ'ò§Ýñ‰¯GhºøƒøPâÜ#€‘ÄÄúÄ´oTJUÔß–™³ºP¢êSzYt»wqVÔmÙõËVöâ׊‹Êί](PUÌø#ïgù´Ôðt-!-á¸z´‘Ä´ ú´Zª´ä)Ô’ÜKK»ê‹ê\äõšþð³Od=ÓE „D†Nœ;'0’˜ÈAŸVä$C‚ŒD¦÷ûÀ®K´ï¬5G”ÿÀï–ð‰¬GbºÈƒÈ£w݆‘ÄDú4"w§ˆ2ΠÈî-2û‰ýR¶×½¾¶@Óãm;XMäÁ)"ÄXìáQ,&öɲYÆCä<à #‰ÈöiZXÀCbö¹´_÷ë¶´Ħ¨u¹ñ}S çä´sùè³6£ÖtEèPÙ±› çÎ%Œ$¢¸ËA6õçR²Ñ>·Vôä­«nQÝ©c)AìÉmP<Ÿµ¡Qc:hƒh#Ñ{&0’hG>oˆÅT b¶Q™>û±¸*êb»*îv6MQÂþbÏnxŽÍšáš|l›©Bm$I ‚#ŸžlC0Lg8fׇo3‹›²®¶=ËèŸÌfó×M³ßìü{)FX¾Øoð¥=ÌÓÓÈ` ”F š‚@$1‚‚>-A‰@™´™Ué»uÕ4y=:ßÀæmáûNŒã§o{zŒ}£Ðtø!ø ø@$1ø‚> |2E)3uÌ.–í)šÑsdåvç+uɼܩW&Ÿ}È7¾Çý³ôI…Ów>>¢Çz2EÃýˆ  ÔÙZaD :4rA•Ød+ `È{ 'X­,Åé(õCθµ “1î`Uwc¸…ÙŸá ï endstream endobj 3531 0 obj << /Length 2916 /Filter /FlateDecode >> stream xÚí[sÛºÇßó)ôVi¦Â!â¾õ¤IÚNÛÉ{úÒvZZ¢mNlÊCQIs>}A—¥2œsâ:œÌ$2Cî®ðÿqq[Òx‘©?xQd A)*r¹ØÜ¿ÊŽGÛ›Åðá§w¯°>o­N\ƒ3¼|õÃ[Æ8CEVàÅåõ‚©ÏXkïr»øÇòc]¯þuùçWo.­)FÈ™>û3#N1.”r!Ô±ŒŠÁiŽ("«5βlù¾­›MýPÞ­Ö”ÒåßÊûjßGôÃ[Ndž¢Tù=Zøºš‹á>úÉ{ðŒSžxðÙ;3§ê[д/(bêÿÔQõ&GeÇG Äæú50à‘ùÔÍQ$Z|ò#™F«?3âÓIJ¼à 1ˆÂ®ž¦«Ýuÿo¾ÜWíÇ‘˪Ž?üüÐñ<•ºç†â¦ý’ÑhŒeÊ|hÀH"h„}Z4$E‚rˆ™D£»Õ.ß]xa yþ}¤ /NÑ£›8g DÏHIì¥D£'èÓôY\¨ø%sôPÍÎëÛÝj­’Èn_773åI:úTw+¼¼Õ?ÜÖ›>õܧv»áðfwß>4õ¦ì*yD"2ùtò¦4Ô_4]Cg ¤á¨=ý‚Hb}Z ™@9æÓãŽA·+™/wí½7¨o¿ûQÈEº©Ó)rB%^Š@$1Š‚>q¦ú•òyž#"sC‘aèâ¶ÞßÖ@¯wÍ?3œßÚ²«w¿aˆgì{í@}ÝgZŒtΜg#ÍýœHbœ}ÚlE1Â*¿Îì@ö?OŒÃ«(G”Ûñȶº.wݺ­Ê;¼ÆN„2ÈlîúP†òŒ?ÛÑî³ás L­^:˜Î@Ì$~0A$10ƒ>-˜X B0ÉãÁtc#œ…P— œebîzýäiyÒÉsBä( ^ò@$1ò‚>-yÙ0•³äÑóÉÛÜÕUÓ­?l7ëªûü`–fò¾"yZžtòœy# üäHbä}òX—Ø‘—ŸOÞǪ½Úí+oùÐ ·ß£G¯IL âÄäºÜ7Øg—Kxv‚áfWû#>r`Y³XBªI1EXÇý-ƒ2zêkÓ~~P`3Ù/Rãó¿†ô›žþ6爹eœ‰qáÅ7MÜdLHÄ(N¿É€ÀMfÎ Üd0’ÈMöio2ΕîcçßcÇnŸÜ}*3¬DfA‘s$h1o(ürKƒZÛtjíõ!h!@~f]1dC-±Œ B ‡,?Ù~÷¡j§§hÇÎ#©Iæì…lH|³%£a:šÎ@ˆÍ*~8A$1:ƒ>-ž½o2ª8Ï~ ÜÕ÷ÕîÐyé$¨(R†.½Ý¶êÚÚ?ç4–§eþB%¦xÔ¢¥óè „x±áçDã1èÓòH*àQ>"]*dš›‡v·©öûyIë[Œ<µzé`:!0Gä^0A$10ƒ>-˜}ŽÂYœfWo>TÝú®¾®ÎH”þ%"Ù<øü:ãL­d:¤Î@Ò0~HA$1Hƒ> ¤yQ N8ØÈB”æI,Ý©©>MBÊ„š¾‡×½¨ÂXÌÛU_³ËšÌ*0`uÌ—UI„Õ°O³IšKŽraYe`“´|Ä)†Ë±óçI™ÑH’N›3¢m¤<óÒ"‰Ñôi3£ ˆ[ØÁµUzå_-sú“´Às¯ý A×4¤ƒî „@AçD=èÓ¦U®¢¶öĬ6½ïkÆÊ¶¼¯ºªÝ¥K×;]Õº S¼ùUuûRÌ ?mÂnDIçÍñ6Òž{y‘Äx ú´¼åeÄò&Îçmë/™S©™³yþ蔦uHGÌ!6’[x‘Ä ú´ˆQФ°Õ$ò\ÄÊ©ªºœËyÄøÄŒ¦5IÇÍá6’^zq‘Äp ú´¸‘ bKHÌ:Ï›¦çícÝîšûêø¹˜û¸b\qX—WwÏ"©œ–Í[‡OiZˆtÆœcPoæ}ÒFc,èÓ2– Ä„eÌ.Óü¡/é?&°ºy8hÀ®W¸¯0/»ýTB£BÌ í‰ M+’›3‚ ?ˆ$[Ч™ûÒ"G9Á6;ù}W5UkžiØjöòåþóßÊÿúÓWÍ‘Ï }Ôeš<™&` @ÓHY?M0’MaŸ–&‰&SÛûº¼«šmÙžÒTwÕý~ $ŽçÌihítŽìõ!Œ€¤Ì[!ˆArhâ²Ø1dªt/ëÓÇ,·eŸŠ>ëNq%¢&lÞ|8¿¿Ó¤ƒe¯tžË…+äЂÅú'° @VþY?ïšhfRƒ8–“§ÇÙMû§cå „¸‚23oe Œ$FVЧEKï–:´Ì–ÕëÝñ‰Ü«º©¶§_ÙèC]bf#„ ÊŸ ‰S²ë¶I—ÝÉ%˜D“=èÓÊN$âÊÎí\ ègDýt|[DõáŒþм˜2µ_¥¿Ò:¤#æ „ƒr3ïN8Œ$†XЧE 3Ä0R›UôŸª»²«‡7À.K¯|1oë àVxyãgNªqÖKY†š¢D7e:%Î@ˆ¨Ø% ’%AŸ–’¬ï8 Ä.„Zݵ§íÕ‰åÕj­þ¶ ã§°P]-é'E [úÂQÑ홎Š3BÊÆ¼{À0’*AŸ" D0DÅ,b_T›]³Õ d_7›êäe6o†W•éÙô Ýz aò{¨m˜ Ç4q2=À@€ž‘’~z`$zÂ>-=‚£Œ3¸\h–§/:ªM}ýپ˦ó̬ÚÃÔ^ˆPS²ìeîïN¡¢Û3g „ ”y7ÿa$1T‚>-*}é2Î!*fiù÷‡îv×îíèØSeUH$…<”í¾úwß?ò°#1Ê_LiÀ,ºEÓaqB°@á&`‘Ä`9ñ)”ÏÑœ“£ÌÊV¿ñJô6n?mÆ„-ß·»›¶¼¿‰`Ë¿–ÍŠâåÁ¼òAqí`¥?eÅÿ×r±7/¨ÆàØ6Ê㥮_žf?u3´½·bF“úħ{“`¨yu—«µ|ßVê.Ÿ,æ•‘Ïsâoºse¤KO@Î@(ñS "‰Qôi{+E'¡¹¥ÒrùǪÜV­÷¹‰3’ßI­[:’Î@É~$A$1$ƒ> ’¸À(“I³™ú§¦îêò®þy2[ ’ÏUE¿@¹®Q%8` ÜX|/p0’paŸ8!PaÞÖgv^ÿ¾’´_.êiž¾¹­ŽïýàÆeq!çÄø5'ŠF›tìœv#üØHbØ}ZìxÿX>qØ™mÙõÝÖ-%˜e¨ýîÐnª©œËyköül¦Û>+g „ÕHbo©.Œ$†UЧŊaÄ)ÀйՇáË›]s­Ùªö”CRÌ|…Q#I:mÎ@ˆ¶‘ò~Ú@$1Ú‚>Íëá1•(7ox;Ò†p˜·áÓǺVEýï>¡Ê°;ünÖ½‘ú&ñ)l5Ï{—oŠݼéä8!rF*úÉ‘ÄÈ ú´äão#à˜qþEW6ÛòN/œÓHùò°Â˽ºpY«CŸ™/ÿR_uÃvÍîÎ[@B "ü×y§É”²Ã×OÖ^Ò¶±÷W‰€0bª†ZQ1AXPUúHU½¿C„¡Œ/{•Û4]:Î@‰‘B~&@$1(‚>ÍÒg¡\ ÅÄtþHÀÛ~Æuh6ý‘‰úhq´5u9Ñ$Óå®À…æÞÒ{F­ CC–쇩¦2 TLëYz¿/«û‰‹ª;1ÂûV˜ {R:ÓÊ$óæ®ðåçÞ’#ƼýÉ4q) endstream endobj 3422 0 obj << /Type /ObjStm /N 100 /First 1003 /Length 2311 /Filter /FlateDecode >> stream xÚµZM‹]¹Ý÷¯Ð2Ùè©T’À ÌÄ8›ÌØ‹$Æ ÇÓ„!ƒ;ø&ÿ>§to™8s/1n]0tuûéUIªS*=*©$¢D4šj­npbf7$‰ˆšTÕ KfÍ–Z0*¥>ÈÿÒÓ¨ýŽ…5Q!ÿPåDµš[’ˆyþ ÿ+2GZ"5g®-‘5§®=QëNYG¢>|—TËœ!SªtŸ+ûŒ0ÑÊÒÝj©ÊÄc5ÇvŒÐ6Q@YØ?'øÍ‚yWõ¹ȹùXá9 •€¨ÿ3œW:ª#J O”‘*†–ÿ|,~ÅÌÜ#­ˆf÷±ÊIt8nÅç‚ðJ¯>µ$ƒ'JKZæ„´'¥¹˜®Ö¹pU¹ùX£¤2|,(Rç5NÚHÀa’´ÏU0,ã˜10¬cÑ9¢%£9SëÉꜩdÜ}Bb2¦EXùâ¼X(käþ6NÖÙc…a6æL›¦VæL›¥Fs¦X€VçL;§Æ}Z%5ß ¬Xߦ伸HßÖ[ aöùa3`ò¾æ]ß"‰©u™óë-uÝVc·HvŒÝ"‰ôÁîvè(s+cA¶[Œ ;ç7$ nCÓ¹áô°¹æ€m®ùÀïsÍÇHcøšk)ØíÅ] ùÆ÷X*–€Ê ¦ƒÊŒ&Ö&Pî`ú!±2pÊ ¨"¾T:'¡ ™`ÃO¨:Ž™ƒÍs;£ª8¹Dì@qv‰œž=¤ø(¶À“'w·—ÿþ×}º}ÿîÝÃǻۋOÿ8ÿÓÏïþywûááýO÷ïÓ+ÏåõÝíÇû·Ó+ æ†˜KÑŒ½„̀ċT|âûôäIº½H·?>¼|H·§éwÊ¿Oß}w‡cãaÙWuò•š1ÿC¾j‹øºæ±¹‡ãœIÛEt-³ç’†`b[L¾N{æo,òŽkî¼ÓñÈÅÙ¨,¢«5×¶-×ïäZ>¢Ü @“ÒùD×ðU™úÆW±’RNvKÿo¾§éÔqñÇtûË_ÿ†L„tXÒ»O¿üò:>ôìáÝÇ‰ó ¹³oŸ}VSÃQØìväùíO²ÓÄèÛó÷o_Ücšéöüé³t{yÿëÇôúKoŸ¿ùÇýÝí ¹÷ñƒË¡ùxwðÃç÷oï?l²9ÿöçûŸ~~óÃï[ Ù¥ ?õÏß¼Çh—Ì}ðŒáO©÷ùL¥ß ÃÂhaô0Ænp ƒÂ¨alȯ¿}ù ä™ ×¦š«¸öÂ+㬢ÇÛóq»E¸ç I„fFrŸtbÙþ˜ŽñUBnÙèêÈ(¨Žéú"º"Ùgòùáã䶆O‘© µ‡óéÐÜÆq8µ=–¯f¯ ÕÀËÛòië¹v–E„ÊÙp|&¡QFqrB¨‹›²o;FqFNZ¿‚;R´gƒÉy(zQ­‹Q@tÚ# ­ :S÷²†õmVÝΪJˆÅ _û@°~µ@xyÊý¥àö u(Nåãt¡×ßêB/ß® ^"ÃKdx‰ /¡Ú!¡Ú!¡Ú!¬¬¬¬¬¬¬¬¬¬llllllllllܹr äÈ-[ ·@níñšH^÷š ¤ÇÕi&qä\d.‘Dd¨-t ?!ú“Ž%ד·Š¿ªm’H¹4½”®”̲ӕ–q—=VÄ5t.ˆ¥íéɦµãj[ѵ)I®.V½{tykÊp5ìðHw5ìYÎÊ™²ˆO.í|(q—¹–Ï%£íÚ$¸y6º–|âÏâÛOÔžh_1ø´ó‘æ~,½ôh©gTfPÞ6r-»òv\ÓÌ.*¶7÷  Ùö»²9Îý1.¢“á­N[¦“ųEѬyz÷ŽK–nÝ%v÷p—(};|‚B 7ÝKù¸ãÐæžõbº†ÜbÛÕÅN¬'Ë7ñYÍÞœ|­â`œÔ¡‹D/³oçSüMOøÆÅ¥îtHÛ㬠³Š®êlûL>¤í¦v-_ði«#iÛNÚvÕÖðÕaði+iEòµ|8m¯ëàÌE®åC~ö2òõ’ ×kù £ñSÍrï'|mŸ÷·tËžE|×úmÉGð1Jé²óIÉ­\̇30öR°Ö†öqº®‹ÒgÅè{)XIòñîäE… úÜ3¨…r=>|\Ñ5ÔÒeÓ‚ –“:i™Â¥-yR“Óýã›Z[éBÞ.ì»[䢶äî6g«;_YNJ³e|Øœ¸Šm|´~)ò³ìZK…3´´xÑYï5óØèPÅk_Á6ûg¾áå¸yv{fœö–Ï·6Òt{Èø¢‘¦ÛsÇÿo¤éöæñE#­E©E©G¨G¨G¨Gç©Ç¨£FtžFtžFtžFtžF @<yòØ‘ý%|7(Œ‡!ahF £‡ÈÈÈÈÈÈÈÈÈÈÈ5k ×@Ž----­ïÃíû¾•–m5C£†ËÞIïh‘Æ™7ŒlÓ¸æ/9v¬á²¨ý`ý…hëAñ˜Nø©ªyËȶ ³AòèäF¹ŒÏ[Fo‹šOÞõe‘Š›wŒl§SÊ'÷óet¨ø(Þú °íä)s)j¢½-]§}Ì·¨H±RQõÏo™R®åÓf™JôR§}-v$÷ý)³æ¡ÓiÍu¿à©ŽÜ‹^ËÇŸâ!Ó²©\ËWÙ¿Û²ñ1Ÿ~ÏEdUï¶æþZ2Ÿ<œ®âƒ¦g‹V?„©ž\ð–ñuOúùÙ´œ\`eU7µqæý‚'½äq–­u]³˜ö^¿XË'ÏPb«šÅ-—ÍbÉzrÅ“Eý‡yõÚ[ýþ®(r·ª[Œ#W.©þíãl­eUwZ³DsZý«D—Òù÷÷`Êc\ÌÖ)×¶·¦{îr, ZWµ¦.í½Fo‹½–ûØÞK5(ûÉ«¥®j…ã§=žÞr-_µ ÉÛ{Óæßo;æ[”ªQã§2XÆÅ|¥À'Ý{Ó#³ïëªÞ4rç½7m¹ º–R4dçÃÉä„ï³6üØ¢å. endstream endobj 3579 0 obj << /Length 2767 /Filter /FlateDecode >> stream xÚíœ[sÛ6Çßó)ô(?!‚—¾ÙŠ’z³q½¶ÒéÌî>(ck*K^INÓo¿‰Ë‘ 0´S×±¦3‘J“çâÿÃíí%ò?Ú+“^Î9)Ó¢7½y•ÔW×W½æËÅ»WTß77À'ãW¯ß Ñ£ )“’öÆŸ{"É ÔÚÏzÿî™ÏçGÿÿãÕhlm ÆZ:UwF¼Ò$•M{¹¼–ð¼ñ*Hz4 I’ôÏ£ 8çýÉrÖ|©/ž«ïiÿíQ‘öï–Óí|µÜ¨H_¿ÍøŽƒB¢d2 ÚôOÒp–7ÙÎÿµ¿Øõ¹G÷°'LÊK¢ÞÚ”¥‡ù7yUþCY­Òî(—y~ x$ÛwS—kžÜ‹Fú‘„1QwF|L²2#Ea1“Ëã·£=HÎ/Nm‹ˆ( Oº"ò·¡¡«±E¦¨;S í(ZRE0’E¸OKQÁIÎ3CQ¦)ϧG¬èÿ®þ©¶máI2’³ìeÀó½<ÜC“Lêctúv›çÀ€Á]7µ€4a^A(1Q§–Á\¾@! ƒ¹éð.›æKrÇQîJJD.^j›õ=„XÔzugÑÀX„XPʽ,‚Pb,¢N-‹"')·,¦=|×Fy;‚ÁG0âOkÔ?gã¢@iáå„ãujùKSŠÔðW"ýñ‘_ž*¿Ð¶t Y4¢üÛNþ:C\é²ïΕ3€q%¦,õrB‰q…:µ\qJ(ç†+šØNöõ7´mL––‡žö›g£Zy-BwÀœ 0¨5e¥0J 0Ô©Œæ¤,`Ôv·½®–ªÝÚΧ“íjÝ–µ´$ÙKïFCé²îΑ3€q%¥Â?¡Ä8BZŽägÁ™åˆiŽÞ_œ F ¤_.Zg3½]"]ÐÝ!r0ˆ ž4óg5@(1ˆP§"!§„YA-D\C4\ÿy»]]­'·×r@Õ~È”•Ù ïô™‚î 0€@´£'ͽ- %îÔB”Dp‘IÄÿ&_«l üžeâ‡L¹?Ù0ÊÓ:gƒêOKï0 †ƒuj¡Ëá…eÎdõ?nç‹ùVu~¶&‘TN cõÇ$¯Q§;xöyŒ;€K¼&ˆ#FæÑB'a¬´ÔevrxFè7ðÆù!ïõ¸¼iaºç `ÄAýYâÍtÁPbÌ¡N-tjÕ+wMIûÖk3Iüy²œ-æË+žUÔÁo¿Ød¤éŽ3€a `Ì»lC‰a‡:¥´$EQô¤d;Bïƒ÷«jí&‹»*â§„eå½GÉæAºÃæ `°AÝC°Pb°¡N-l²SÌóÀÆîÃÖ¢kÍ-ù OctAKw´œ -¨2cÞ…JJ -Ô©é>ÓRåGíÆ jV*G_'7· Õ礔ƒÁGO¹zn„ë %0€@¹ÃcÂ% %%îÔBYd$Í”fùò}µþt4Pk—ëÕ¦iõÞL¶“O“MÕ¶ Ì9É)ý‘ûÜ/ºL»óâ `¼@é˼¼€Pb¼ N-/RUÎìn fV%ßUËjm2´—Õôn­’¹I~\Vë/óiZ6Jù Ï·…HÒ¥Ý$g# ŠÊ¸7Y C‰‘´ç4—NSÂÓŒÕ{¿¤-µÎõzºJ]P&úÇÓ#Nû¿/WêãE5»ªnªågý­n_$hÐÍ"¹çEN¼Ó‘ÃÔ\ÊcÊ蛥×Ï€ ûn´ôÞ­ 0”˜ô¨S%=¥¤ºÑ:¾½•ÍíWËÙü«ü–K d±ð”÷‡²ý˜Oç››æòêsóÙtKêÕ-ù¨`•½Ø£™0•ôëtWÉÀT‚¥Æ¸hB‰©„:•*ñ\¶Éf|ìQéD©Tòþùzµ]Õœ®ÍŸF_·ÕrãûòÈÖž2þØò´ªRæ­:‹ bíãÞ~†kß©¿_æ' × Á›!¹«aÚñ…ZwÿyÙ,ÃßJÙªé¶Ò§ Þ¿6_ª¯SÕg_O–Wþ飪Ãxw=ª)§Î=*0€ô¨;r„¡Ä@šÜO›OÀ¥`<<}zÞh¼]O–›Ûzh¿Zo›kÌ·× 9²¿½ZOfz¬¯ö-î“Toaô!RYjGHH#ýÝ5r0`q…4¡Ä4BZxFrsîHidÓKM»ùi¡Ë¼Y:l„j*jÚ¿>¢ýUsCÚWS1]WËæs-kí@õ_ŽìS¼=¿ºn¾}’crŸdy" ä!‰ùúe» é `BÂ2e<÷ B‰ ‰:µB2ND„äh“»®þwWml“û , O•f‹¹Ô¶Rßšw®âU¦Cm.ݬj$fš®‡)IÅÃê¡~Åîò9˜|°$CòPbò¡N­|òZjŽÍ(ùÒ6òéczÓiu ¥´ÓÜ©zk·áÓ÷YP?N ©ŸgÕ[ù¿ç—beNØCNÝHý1waõ†©?¸SSTóBÍQ U̾9%¨ŸVÕL-75æó¶Òk'›;Y{ênjóùN¶y‹½Ç²ºZmç•VôV‹4#åw^CÉ©_¹»œÎ&',Ùœ ”˜œ¨S+§”愃’3k)ççÉ|a†'­5d¹ é Oµ‡Ö…Ð]`g–5ãÞ½0”˜À¨S+°ÈIaN(ÍæÓf¼Q­'u*_OTýT#3/°SÄÉl&G™›jÓ\ŸëÞœ]ú;19 ÉøÌCëbè.±3€I K;$1%&1êÔJœ¦$+€ÄfñãÆÖ\; ™ìò°Ê/VW&‹ßh›š¥ äÜî·Éâ{¯ô„Õ/Ý]Pg–mHPJLPÔ©TÖa6â+AÍâœ]_ÙCH e¯jªîLViä¬NAò¤x9«.!|twÇÇÀðJ†ð¡ÄðAš” £áf þ‰M4Ôó›j±¬ôl¦ZNÕ ×öÛdÐñHbt9*¢†¼•\N2ùs_ã Á¡ °;ÎÔ)%êÔ¶-‰ Œ;8l®p¸º¹±¿Cs6¹1=½½64ØÀª¿ Iú£lò ¡ ¯;ÎÔ(%êÔ€AKF’ÂqÁ|\|¨&K9¦ðÀI³ìpÔGŽ.ÝÎà¸çn „Œ{OÁ€8"Ô -4y!g奣Æ$COÕζ=дÃÌ´QOýë|g`|ÂIñR~!¦6º|»sã `à@Cä€Pbè N-;™ yZœtofzµžøF'rþ¢QOÝöqüóèl|:ñ aŒ¿ø‰Ÿ)ÔîÀpl[ƾÞz/î”òæ¤=eá,À¸{“¿ÑÞäOoèQ ßzCÜÌ©)K[P&Ô,ÍÒ š»¿®íT*=d»20€U}—® ÞS²0”XU@ÚªÈØ™€UÁLhŽG—ƒáðà W> stream xÚíÚMSã6à;¿ÂGç¡oÙ½•°ÙnÛí¡“¶‡¶ãÐ ØŒcZàׯlK²,™zèvÙt˜!Áï«è}$Û (‚êE)Œ! ¥I”ßžÀnk}õo~~‚ôqKuàÒ9òlsrºf,B¤0EÑæ2bˆŒ°·ÙF¿Çòañçæû“w‰aü”í‘9¤j/„Ú‰èsž²X"aüCQ_,–8‰‹Z>ÛÅ’×»ëþMVv[h\ßTW²lzºæd/>ƒ Bµ§‹üŠËEÿÂ÷þzùƹçýGÚ¿*HUI8á¶ÓÛ*¦ö˜ª_Š@[Îý-n]ÍùK'ÀHmÓtÀ=kŽJä6Ū=r")B)H’$â)W¯(€4©w»&»¸‘ÆP^•e‘7²çC˜Îäó¥Œâácºx6'@€Ï^%=|ܦLð 'µ|„Jnùàç3Rµë ÉmQ.Ô–FþÍ3/&ÊW3áQ`zÝÅóù B|ÜJbŠGù8M™âLjùõ6ð!~>Ù}smð0rv|ZtÎ×2iq çÓâ4eJK0©Õ ÄÑB͵ê¡)Ê­¹ïy) G,E÷æ|)C€·h>)NS¦¤“Z)”œÐA ÓR~“å¶jiüÝ[ÙÉ'µ'.Æ„¤ BŽî2ô:Á|èta棄йõÇ”Œ¢sš2….˜Ô¢#¨cÑq3=•zfª.÷g(ž¡¨Š‡Žö™Ì'H÷ò|AC€ ·˜>ANS¦“ZAH€4q +(¯ï|PRÔéüR¼ t>mº"óµ BÚÜÂû´9M™ÒLjµAªn•ñ -17ßírõñ¼}ù2jñ¿¹Çœ®Ë|sC€9·ü˜ÒQsNS¦Ì“sLÍU> stream xÚÅZ]oc·}ׯàcûBqø1C‹Ù,hQc½i7û ØêƨW2d9ÿ¾gxI£®tS#æEvtÅ{gÈáŽ%ãLHƨb¼÷jdBT£˜ ïLJ¢梆7’I`r jDCÎ¥¬DªÃí}/†BTšà Ť¾ ˜uœdC)×qÙxÇYÇ%ã)×7+:³€)ÆÊ0.UŽPŒç ãï%ê\"Ÿ«å/uÆú…ËŠáuP NQ"G_Q*hGÄ48VHRxEIð¾dNò&º¢sNÁD_ƒ™¢‰Áë\RBƒ¢`B±‚j,#3#eEê8;gÇÎÄR”É$"ecos3ƒéÕqÑÀ—:.a}¸Žc“XtV,qp œ©8ÁŽ”MœaòŠ"XRn1V@­`ยH4œDC‚¥`žVK KK•IcJqRñØÕµÄþàa—HŠ—ƒ]dXÑ× ŠT^¸/¹ò‚HŠÔqÙdW4VÍÞU^gr¨«_ÈäXW$×EN؎ѹ`‘³p—LÎu7!°¹Ô[اï2‚SˆÊ –‡¥sa`é»ì’)Ø”já ïë³ K×]1%8l&‚Uñ°d%Äú,ÂÒ¨1Ü/ˆ80ñ“n.dZ‰YQ°õŠæ, èF‡…$©Ï€¢‚…TßÓÀÆVäQ]KMƒ‚ X½y³Zøí~kÖ_ïvûãj}õøã±~þËíî_«õÛýáf{0N÷iµ~¿½>š1‹H#œÅ¶Ò$õ¢&F|mÞ¼1ë+³þvÿaoÖïÌŸÿÙ|õÕ ÿþ([°Ü²ÇM¥‹Ábœç“×ò5ï(YÏÏG›CY–ÏEë»D6Ó¢tTÎ<ÑQɖӲŮŸør²É-ÌÇÞâèœøÄ[ çùò ¾D–Q³*_*Ö;Y–/°uZ”/V{Y>àÓ”í¼-n&ýÊ >ò–¤ñQ±’Ò¢|ÿùFçØâ0?KÇn 2 £l)] åþ<[üO¶wæ#‡â½7ëïÿþT%#(»Ç»»O}ÐÅ~w¬8y{-€T˜l ©}ÐrÜLˆ2ýúPëËÃþúj‹›õå» ³þ°ýõh>=würóy»ZÆíîø 5½èûêëÃþñp½}˜T@}ö×íÍíæíþ×)"Zú¤xx}¹9àíª¥¦5œ ®*OçSE^3¸Ò§1¥Ñuƒºá»º»Ñ‘cGŽ9v䨑SGN9uäÔ‘SGN9uäÔ‘SGN™;2wdîÈÜ‘¹#sGæŽÌ™;2wdéÈÒ‘¥#KG– ùÓë÷5Ä…ª,S8»³ePqa›ót *hd–¯ÐëUcóq†ò“PU6Ðy>r~!”•*ßJ(Ùºó'QÄ—ÄÆÐø²'—Â<ˆ0’M­qòXÁó……|Dè³®-!¶Q 4CX"Jž¤{HŸ)‚ûÄ B§ruÒ"8h­Ÿ‘Êă²W.›¦ˆâÞdýŒćDHawHDwf Ë %Ä! ¯&y€óÓ–t>¢ÞŠ(2Á7=‚*a9ÇÂAiˆÊ ¯¦4D-Ä}`†Ð»A„È„â' „Ú ÁÒ„È‘æ¡w¸lùÂAGi,¯¦£4¡.z7G˜f¶Q¦<Œ%âN0Gȃ…¬vZ*av¸“Ÿç ¯Í{ìAµ¨Úi¬|)Z*2C:È nõz)Ÿó0! ‚ÔËSVœªq&)  ì ×¦¤LKF±Ôî帓[' 󅧦 1¢Ú‡BDˆ£%·RYá¼,¡Ç1ã›B N=ä… ³·Ú®*h`¡…ù8ÛÌO+ÿœƒJ!ä äSãã±X&ŒÞ¦–^ Ê zœ,Ô!É-MHl=·^jR¡±0ŸK¨ïÍAÔýìÞ3„³º´¬‡ê„|š#¤H …"»Üú©¬BcaBlLnzMœ<·Iã ½FAlh· BÕp),LHÁR“O¤qnÓÄA"wiꉠÙѲ|9ZIÓ¹uÓKØjÓQò+›ŽƒûŒ%Ÿö ÿñ>£ô†šô†ZîͲܛe¹7ËroÃåþV~z«·ároÃåÞ†+½ W:réÈ¥#—Ž\ÒëûqÓ’¿´7l½´!7Žð…9Ùe:rP³ >kÉ%ë–æƒLöí§AN¸ỗ£ZŽPÉÔô‡leNo #¤TRî ¹daÂ6ä|Œ£rr$>uä ŸgӍޫNn9†¢ä… _Ú‘‹<ª#çT'?uäòœàŠeL+@{T¡ý}…6Èh.ïGµ“cÛÚc-Í5Ó¨fލä)­y$«xžðÕ¿¹>u¼‘Z÷(Y*3IÁr¢€Šü_Ðó‰}·;ö7×ÇÛý®Îðù““ñßnÇÛÝç\tWÇÍḽ™Þ:óüäÝ‹íæøxØ>è Íî¦=>>Ló_Ÿ ýíçíáçÛí/Ó‹OŸNÆ}søíþ¸ÿ|ØÜÿt{­€Ï_œÿúéêñþ~¯né°Ë»ÍñŸû×6ñ™ï~/v?mïîOWžú°ÿòe{¸¾ÝÜÕˆL\mþg¿:Ax·ÿew·ßÜ4šÛïvÇÍÝN`ÿsÔ îÛÇ:òýVi[,þëÙo°½n|> stream xÚ¥VÁŽÛ6½ïWð˜Ý¬HJ" omÒ NzÑÊtLÄ Iöfÿ¾oFÚ×’ì½XcræÍ›™GJ:×J$Bç:2£g.2þoDnèé„£ÿi"¤rd(8*2´Ž\ÒL¨”Wr¡rwà -y )™ÚZ2”H¥$#)`d"Í5©Ù°"SD&ODf(*—"—Èp$Š0Ra$9ç¹0ýŠƲá„MˆªI„Í(Ü(a-%5Z8Iå˜L¸ŒÂM.œ±@F™$ìä`¡:GŒL2âoQuâ(À¢QRR›Áʉ§5°¸<üȾŽÆ»(šÙ@j&뀢-!»\È”9¡™25”×A&a™(E˜„úNEôHæ‰% ¸Ù& 꽂F:ZŠ¡a4\Gx(VñXCȘ»tœ 3““‡—Ñœ1fZS@q½2J •(â¢RXÔc£0ü„ù)#”d~ŒBé°tËÑô¦Çj (RˆÑP¢îÒ$•–ÐÑuÒ@‚JsŽTÂâØPiÂVJê#¦¬Ã”-0HI¾ÍQYFU¢*3” ZT™“Ȩœ+G©*W¼K"& ^Ñàa5[(RfŸƒálФ2ÌãV†ùA• GŽ ,÷ºT6'<Ö”©,0ƒÁ£„m*—³…°„’¡Sð¤-œG±”b»z±ˆuׄ»}ê¯/¯^¿7Kqó>~‰âæV¼ø«õÍ?Iš|(ê}±})Þ¼¹:]ÅȬ÷ûÔÄÛzr.ê=híŒ/¡üæ»v":ï£Í}ѬNâ‡U¿:‹ñvU…:´]St!Ö§ügwG8¿¡5qµ/ýºH¿ËMh‹êœÃ ^‡¯û>™Ü™˜Å8òdm³ìЦ;rÙ„U8µq‰ñíÇ%=Ö‘Çÿûíb’ýØk„«… ®‡ö»úæÎ7±%ûš~E˳_úº ]8„Ž¥×ôûÙÛŠŒEåÛù|sþþ Œè±åÓüC ¶ÿùî{Qíz1þ/œ¥/Ñ«¾”2¢²•ï•8QÄqK¡`Ñÿ±ìqföÎäí¾ß Þôh|»¯üDœ™‰{[Çú¡Šûv>¥ ýûU–8>Îûnãë. wÃY>‡³h<ü8îT( ¯‡¹7Rw'ÀÜE°a¤G˜c-/sÚÔvIâÀà>t›¹~ Zk÷»]lº1ì‡ý¶ ƒPqSCþmŸgjc}ë~wý ¬çþÀÎíŽp>ûµo|]úÓÛwjcý®>„&ÖJ.¶<×"Ýõ§¤?ç.’˜Í»ôºÔ*® •ûŽiÐÿÆãss²Út€îèKb×ÄÒ·gÜ:þø»Þ†µŸwÂEãïg|ø‹éŒ>Šÿ"á#cu7ÞûT4(®’öès¨eá b>ãð3h«‹p«ŸÀ+. gok[Ñðg½þ Ùî^ endstream endobj 3784 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1360 /Filter /FlateDecode >> stream xÚWÛnÛ8}ÏWð±yh#’º@Q MÝ Úífl±ŠÌÚDdÉÐ%ûõ{†’“Ô¤ìl_¢ñÌ™3‡œÅÈLI1™©„‰ŒžË=ÓO1'dpÆ3I†d‚»PÌDL9:e?`à—'0O‘¥"p+M†`q*É,áΓ°$MÉHY¢X±4Qdh–EæœeiL†`*ÊN`ÄL¥Dʦ\ϘN8ìj hŽbr ˆŽ2B É8V kˆ¦°hM Kç\¿ÐŒ N%%X„ ¨°œ0 áød¸„*X`‘’ø¤‚•Q –8" ñ8&–,ØÔˆ¡ V´tì,O„³  ‰I} –4"æ RA,X¶&‚,¢Œ$¦†8 ¨°À‚½B TJ|Ø-®#ÊM¡@§¤àZS.º$"Ç‚^ˆÈÕH,j(îV™qXNÆCðT¡F†‚ø°%B$Ä‚å á˜3°HN|*‚åÆAE:fȱ¤½R4F)ÕÀ–ˆ$¢˜B‘Hª†ŠÄí)&Q$šø4¤’p4‹©ËÕ4¿i¡iÌ„óAAæ†ó(2È¡xJX”ŒO`A¢9Ðh™P¤OGP …óEKòq(Ðx1`¡P$œ7aš††G. z÷Òh8žR yA;©1RÄΡG…L~ÊÌEÁ;¥¤qì¢`I"ªK—P@c:eE'ÏfÕ­mêjmªî[G·ycóëÒ´§'/_²³Kvö¾¾ªÙÙ[öìmÞ‚ØjÓ;ì÷ºYç]{Ê^½:™Žz<ïMeš¼$ÌbLj·U—ß DÓaé,x“_Ü5¶ZŽÜÿïÕºè¨úõµiŽUz2Ú«siŠºZ¸ŒÖV…w+÷˜mêb5ðEù¼SØï[}ܱݸ4=½˜õ€ûë¾[ÕÃ:‡Îmò¦5ÿÒj‰a`>ò÷¼©—M¾^ZþÈ«>/Ç † EÐôºÚå=8<ô“/L3GÛÃ|¬lgóÒþ|Dºçór¾b ¡ç+SÜ Yž×Ë{ÓÛr±kÄÐݶî›bÜÏép¨?5&ÆízgÚÝÑ껽ÌD…¡îH·¹kãÍò9…ì2®Ç©êpVäå8E!²¾—òÙ^wu]þ.×±–î]_d·¡þý ÂÅqŠ/‡Çٸߖ‹çóÙ_NR縰> é¿ô¯ßÍå\Ì?~ pE؃ÉÅZõeh—Çj¾¥yÞZ¿¡È—üÛéAá¨À*ÎÂ’Bà‰‹‘-ò®nB$ÓqëÓüÍóÙ|þç<À3ó/ÍvÓÑ‘ºYÙ"Às îqýó·æGÀïåþÝÙÒvÛ@v0è õ.ÔÏïåΚfØëxJœFCªïžÎüš—ýîCºïœÎÚÓðû¹wùzsÿ;ÿåφip©ÝGéü:oMhLŽÂ—íapé›±7—¦¹µ»/Ԍ߽⦪”f±4ôoîwûÞÀôâ/l»~¸[ìV´ßi@èÚAŸ÷Âì®3Uû°Q1ÿä½z=¿ºúìŽ rLÑ WçOoÏéaîŠU^-ï/]O†{•ð¯ìx„_œ}t_„®É«vS7î<ûa»=Gö~ƒ—xa†“î¾ìiˆ7Û —[&þusÜÛÍ lU羜iÑÝb—®ôµí¦ùÿ Îþ, endstream endobj 4049 0 obj << /Length1 1876 /Length2 11868 /Length3 0 /Length 13019 /Filter /FlateDecode >> stream xÚ¶P\Û¨Ü!Á5 î‚C ¸»  6¸ÜÝÝ=H€à4¸C hpwwGî9¹÷ÿ«Þ«©bö×Ý«muïŠLQ…IÄb ’„Ø82±1³òÄäDÙX¬¬̬¬ìÈTTª`G+Ðßbd*u½bÃ÷›˜=ÈÈñE&näøb'±È8YØ8l\|lÜ|¬¬vVVÞÿBìùâFÎ`€3@br@¦ƒØºÙƒÍÌ_Âüç@ ¤°ñòr3þy b ²lrFŽæ ë—ˆ@#+€ 9ºý— ZsGG[>f#kfˆ½Ù{:F€ ØÑ  rÙ;ƒL 7²ýU32@Õìð—\bêèbd¼¬À@ÃË '=à%8@EZ ` ²ùËXö/FÀß½°1³ýãîïÓ8ÛüyØ„XÛÙ¸m̦`+@AR–ÙÑÕ‘`dcò‡¡‘•ä弑³ØÊÈøÅàÏÌ’"J£—ÿ.Ïh¶ut`v[ýQ"Ën^º,ac"±¶Ù8: ÿ‘Ÿ8Ø|i»Ë_7kiq±ñøLÁ6&¦aâdË¢f¶sI‹ÿmò"BþWfrp²²²rs±@v+Мå÷ªn¶ ?•Š_*ðò°…ØL_ŠyMA/_ÈFÎ €£½ÈËãwÅ2À tƒÌÀ6ÈÿzƒLÿâ—Ë·»tX_f ÀúÇçŸ'½—ñ2ØX¹ýkþçý²¨«kªŠi1üUñ?:QQˆ+Àƒ‰‹ÀÄÎÉ `c} ÏýòàõßnþiÀŠÿSªhþ;¹ßÿ%n‹Æ?ÄûBFÿÒKc{# %èå}lêø¯œãù_Óóâ%Aà?Äù’<bõÒ»ÿHþh!‹Éoøô¾dmú¾„1û ßXÌCN ø7|ÉÜò7|‰mõ¾$fý/¾,%ËoY½¬! ä7|IÃö7|‰kÿ¾Äuø _ºéø¾¤áô¾¤áü¾¤áò/²¿¤áú¾¤áö'þ× ìí_^­îøË€ý‡ÿ|ƒ@® òÜ È`QÐzS%Bä´9*8Eµ©‘BÇä1gßæt‡ŽH÷%Ãï—ý•Hâ@×ëÅu ÚKáyÒGý¦Z„àæx¥–{σXå‰ÍäŸã¸½cû"_¿“ 3© oy>ÚyªûZÂ4AµËPåØ9ñ +æaݸôH¹~ýþya8hfSië ×G”‡Ï“L‘jº¾ÅÓT¹Æ™?ðÉá™Hé1O\1¦/¯¦0³ÇžIeb½"9 =´WØ£n¸/•«²;tPhã“À\bOP{ˆî$ÉàÍz”EüœÍâîŸè‰ûñQ€ü“"¾}@)“`ºl;eG¶ 0ÝÞJ8& ¦!ýŠèHU"e_I1PbI ö¾}¤ Q‰Ó„2ahë|Ûqp¤ÖÎÀ‚q+)2®rŽZOý:qZ[Õ§S¼pQ +Ëôn‰ðžçqІv‘/KAÜ´·q¥´ê¹É×µhú†f¸úÁ?CÖéhÿu9»gPª‘Ô¶U³‰h ì&Ìj !^×Q˜Î¯Â·§zŸ¸f'l‚ßðÞ.é—ª7%±q©VVE²Za>h¯Y«õ_ ~ktÆ÷G¿•Y6á ºª( !ýJmÏô õÁ7Ba¡hâS䆓Äyé°t‡Ö“’¿h}tÃ<3½n­Z¢«?{á™aBMä/^°Š ¹Œ',Ÿ¸_ª{Ë^¿"à›ÜMnÅ|óꎈ1t/kdÅdÖ÷YË׋Œ|µk¹ÌƒfRÊ}ìäÖ‹ªÈ¥0çR &<½”‘(ñßÔfü¢©¨=ó5ŽëÛ\gÖR…“dŒ*5Pñ.íØê<ñìÉÊP|„ÍÇñ4òw+¼T•Ž}¼V¢µw<´#ô×§¨ã¨BU\P\±®0»ÚQƒÖGr‘“€’-T—ì¶ í{EšÏì.ˆð„þül#„³›2ðro¢²÷Óâàr/öš/òò‘’§_«sËÞ¨y¶ð™ã¤G­'ÖguϸGØÙÒ¿Ù‰ê;ÖÆ$ˆãËzßœ1˜•˜kUmiLWIÈaÿºK­4µeÄg#ÄZÒZ‚ò –œãØX…ªjFôÝ©bîmmFÿ›p«%D%uªž>ß1=&«cñ¹NÁà̽xïSWX®}=:õ‡âs¹^no§#îqëwØc ®›h¥2¥óNe=ý ^Ö*Â|Pï}Gê)BSežc$.X ¨²Ægê-“ƒÛ§îKÎetk೺é£SóÚˆ"¸‘üÙôO¨`X’ fnĉû)"î+»òÞ=r¤öd8ñ¼ÆpHÞ*õÞ}à ížмõÓZÃ»Ç Ý ñi¶<’h+è³Ï7Ô½þ)?áì@º#µÿã=nd ]Ä¥©Dîæ™7Óu¢çˆê`3NXg<ÛTܘ Ÿ,"„âænfÒ™67dêí•"I$ Î)izÑ^_ÊO¸‘Cób”&m®qüÀWÖŒËæéžW礼AÔèÁЄaB4¦_5+'q`œB£cûäm‚­Kº·pcY }&Œ1ÙNæv÷èÊUÃ\žüz2!ûVm ebЙ¦ÀCâ {ÃÔ”x<³"¶~ÄNK%ñták›Lk8”7¼aÇ V @ŒÄ«B¦%anS#Jˆàþ»×P–SŸýqÔ™¤pJ2Â/°K§5)ÞJ؆¸qº¸PÑ¥”÷]’lž5ˆh n=¡Š¶4âÇ,Uhu:¸y~2¯!ƒ†{¿„>Ë–<×ÑùÓyÛ”ŸlØ \˜c½É|­/Åã¿äZY©ñFðv^a9ÞxžMXæHU)-áô5—¸G1’äÆNUõÀ*Õ­Ý<ðÔÔ ôYNˆ0¼†îñU­]ÑBAah7 WeýwO>£‰S‹`#ÁÛCÑ÷÷“§Ü)p]¦lF)‚T§[º3 +žj*­OWp¡Ü\‡‘ÙôŸñÌ7[ßù霣Hž.…1¤TÞ.tc T"¶.ÙU®l ØôÈòÁ§?6­9 t.¶U{,up‘iLž€ç…cš]h(°¾N¢-¯Íc±à@¹¾~!_|vXG N2·~Ük¼±}gÅùn3`€|H#Ó¾öWø”І+PP'ð••3-¾7€8âÚ깑£ _¹eó6{œ©Àe1i±¬V¼5„¥=2³=€!*vGI?;¿6L! ÷ZX[ƒÙËÉNÝjjœQk¸Ú¿}íd„ìç”~ÞÏJå±:®÷Œ«èôöžœ»ÜwÅV×̈0“ôÙ%„ck)Ÿ-‰jÆ…Ëã:°‹v‹6X×byóÙðk§ú/ÞÇàOuX7>q©£²Þ9¸Ê{7öÉ… 3Yšu÷ʆÂú}W­b’aÂ#¡2n´©¬fä•Ns_G=*ºÜ/ØäĦð‘ÖÓâ"qXE+}u&.ï®–Æ×„ˆ±MS:.ض[IEšçÈ®œ,PÁ0úd¢M—|Ui«ÏÂë²—¤¿ð÷¼r`M‰F}‡m—Ô÷ñ´ 8ÝÝF‘ºÆzœœ>lðR䕲<]}öÁ‚h¼ŸSCV¼-î™]™âØs 'úꓟbZ/ÜH+‰pÝÝiHýϾÇì97–o§ì6ˆç‹v[­f"DZÙÛfYêÍÅÁU?#ά©pdêÝÖŽrUïÏÁêøy2Üù}'VUk}Ô ½TϽNZz4‹¿_§˜ÑIÁ_.wÈJIczôš >þ¦”oަ»Öe• p­I¿GV¥Yõ=“Ÿçé€Wâ5ýnvpaàQáð”`@ÔüîXŠßþÚ|wªèc: œnË‘_Žg‡É €gqPHtγ¬øÉ¹N;ÞíÆëu©[ƒÓ´|ÂD}V[Z˜†À¤’ ¯`wäú!qm‡üÖl! öW8/µ}^!€•Gí')Ÿ†ûHÇLEaqSüƒ¦8W,€n$ Ÿw¼|²X1Èô­ïºt°@9ΘݵÛ<4ò§ ´êüëD­¥Qñtÿ?þ|ŸÃÕö \ìäÒ{'kÔs¯›áab¾‚<þTJ;Ifî»ïy›Àªã"uаšQöŒÎ¦/IÕAÆà»í2Λ@žcŒ¤]Å ‘uXÝ®ÿ0QÉš‹™m²’n•ÊZ¸­" ° )*PSìÆ)¸îsÕ¿f3·a¦¸æRs±Ýß“0” 6pû¦ h^[Tö÷H£¸rˆÁÙPPŽïôãSçc¢#xU Û‚Io,Ïéü,Ü`üÆ‘Œ6 Y¿:!“*ýAÝ_’Ö{ï’ì—N8/ç:™/[X늿hÀ5"ž¦f³;nÞºh͇®ï½î_£¥¥HåˆüöÌW*U€sÔØA (ý̈O¸¬N6z&ÅOÿÖ×¹ÅR˜(–­r§iü½¦ O_s1o. :ÈÚLÞ4ò‰áDŒ+±(sm„LVö+ß3 íQBy7±È+ q.2ædŽÛ6ZÜ…f_ÊQh#£òQ÷ êH#Žª†/‹%—÷U±òg’÷ HjÚŸž5wÓ„øWs©8´(Ÿ ÚYHÝ0‚Q+„,¯Z‰¨ºB}#7—¯÷æªïZ¥ r^ið`C–”΋>"¡°ù3báH¯|/ã`*Ñ;ûÅ"“ÊÖšcõÃϰŽßÐ4KªpjÊ–µ®ä˜$…_·<Š–¦}­*@X\ìm—¦øÚ4Ô§¥Îé£QÁ÷øãÛ/Ñß{¹Ý:8ßDHóO)øÅÐ~xGܯÛsG°©ÊÅ;È[bó:ƒÉ‘6äÕÖY:{ŒüÛNϨ÷fs£~. †r‡×‰ª¶j«Úçó&V4{lPº|ÊáeÓMNGëǸ("ïá °ìϹ~9$ò÷Äqz:¨B–‡¬ªû²€öây¤í3lHCô8û5wÀ›Ðæ_iLžy‘c$ŠŠö™ªcB’Á‡þ;ñþ²#z—8µÒǤ@M4BïÆ†Í Gj%L€ÚXš2ÂÑUÒj£ï–”ê—_¨†þÁþ[mÒÓ¶p*&™UÏýV7hpU¶8>ÛzÁ8=ýÅ~»”»Û§¶E£”GbÛIÉPGzï .âJK%Ï_-ùßÞ4Žl `~ÂÇN¡hœ©,¼Š’H¬d’¢pÞ‰b¥4…!yfc¿µ›°'¸¨ï½q€)Û\­#܄بk× Zc¯¥€ @Nÿ*ïМ’oÕÀ”2`ÇGš*±SÄU³Clâ¥{Oöòí~jåÖdðv/é,éÅoª•«ÎNºTX¯Åjކ‡®e˜åÃ=’PôÇ©B†ß¢ÇßöN`Á[ ¿%’ÿU›G‰±£”¨ÕðºCòË Ú“0Ýc"\Ù\ ‰òûx‡4ßÒmJÖ)4¸Àd¯)ŠQr&á(y¦yïö9·«×:*¨V…Weù-éV·²tþî"A{ñEÈ{§×Wì——FCnƒ*üìð™a‘Lm>¡g‰÷ŸàÙÊO‚¶]Ú]xåŽtÖëÓhªÉ9RèεÞϱˆ>Ó@q,%I Ì-´Þ|åáÿeX×kø>×ëGþxKaï[BîÍk»,Æ/ZGöñ-}Œ(›—¥žgÑ?G ð<¸wº(T³ã,-’³C; ûOAxá~âtÝÝWŠV‡’Ëއ˜³í NÖ<%Õ>DˆVÛ¤mÜxE¼9Ê>0BuÅ.ȉ¨CØ_ƒ¦¸:WŸŽ†?Ç™¨ ܹ/f©Â¨´º|w¿¹µ¿÷ùA­ø¦2cYœ*´¡>ßÔŽú0KVcžÛ³Äz„s¤l Q"ùQKÌÒå‘xÈ 'Ë?ö@›^4ÒŠè·ØŠþñ¡ér=¡¾Ðæt¶mþ0à†ì}Ãb¿<8}.ð0J÷™Ñ>º”êgC дMð…H½hÂZ'’0=-÷prøGr{’¨ɇÉÚkŽùó%¬ŠÂ¨I-ñ]F­Eg"û¦Ý4M¹&‰åÆÄoáVÓ,¼sê£Ù¡®¸Øb¶!š2Ç!²@Ìû©í`YÑÛOQLGd¬eWh3È‚ä2—W­ð§ËZ!bPAĦ|±užÂéþ”üÓÁ¡†äæS[—Ga¯p¿}Y‹!Ò@w’ÔúÌé…s }Ä;VŠæ*77K"Õ:âaLv‘ãH´xÓκ_J:ÕÕMO¯^Á¸eB§.égÜÞ:ª F©)O?ç¦ïùªç S„Ê–¢ð¦jz7,›»—ZŸ%º„a1ÝÚ7º5Þ…†¸îâ >W”AF9_õÝ a ZhëÔìÆ³äàÝ™®{ÐzƒÄþa¬×°î¬ÇQQ&cRJN^‹Ðb^7Oõô£Td#ŒÈDp¨òiÛ±ñ¢{lðˆ|P¿w+ãk”odÐKæf핊œ^§ñòÈe ‚Ï˘ɫEïæ® rÙË\« ³¦›ùÙØ–>««ýÓðZNE<¤¡Õ1ŠnF]ú` qý¯n“h®­ «¸8Z¾7Õ äµ‰+q¢Ë4§Å¿´¸ÍŠ*¨P¸ƒÌ¶¡Rª>ÂB±W~uüz{–‡Užù*PsŠžbÞ¨®Ì ÿWLoøYöMÌÈï£ä× 2%>ÝŸÓl4‰ÖÁR5¹Î/Ýeù Ëw¼êö¯–#l„Gw°|á‚ùãô ÷S3d(WÏ÷gÓñ¦ˆ:Ö&e•m£aöH͵¾Þ…8o%O•`•ÙnM˜[®L7±[Et×Iš²ºrg‚ð¡ú*òˆžpEjlÞ2,Z~K ©[/~eÊmë COüŒ*Õ©7Ê×íÉÆºá{pg&VÒ—FõMrîÚ¸7µ¡ê3óÞ`§Ë2SªDŸ<²8ì@LjŒ:ìíã,ò"NlS÷aÝâ›]dó„5¥ñöêÄû…àå"d ǤAåBÝQY3j\ç…?ûM¯oŒ’cÐÀq‰Š›çꪻ_«ûZv¤›á¤¦‚¼ß"òÃcÓPšœ|”åVÄóM“*Ž-|¤óQâï^'PV€oºÁÜ:Ö½‰ ¸¼˜¬‘ëëçø—q']j©J·Õ‡ré¦ãW±ßȧUŒfeȬäbè»ãió|¹½Âk‹-ÁOŸ‹z\&èkXV—‡An‘êØš_Z–U-50‹² 2H†´Ä””V÷»5ó祋 ›Í~C¶~ë—†ÊLÒRuoüĈZ¡©à?ÌN6Ø=ïÔØŸ±§‹-itH»óhŒÄ—¢|rØlîºt<›œôûk>H0e"u}…½gѱ¬çñd@¯2¦¨@Loj'«GH'%ÿu†NžÌ1–<ÉŽeÖÍ ôáÄÁ T‡g²ÃXÓì]¯È ULÀø{Y7© S—§=ÎÑ/.˜C€‡^r¶5x‡sµŠ¦.±À|ìeìQ78O2ù*£ývr 'ûV— ˰ï886>ÉÅCÂßìYÙ[>øš)³ëü®¡¨3‡xý ÎÎÒxl5jÂ]Ð%œ«ó,"¤—ûgyîHÌ:¹µ¯!Ãß‚C‹¤ ?P%d—Ñ‘õE˜¡ÍŠTî†$EK® ¬C“¢•UsKɹR³ÚF ¿jNl“Œæ‡¤Í’!bÇÈ*À“©2j·K(C™8¨¸o¼6ä:m8rÍÓz·3î2EqkTLš?ÎÝ3 †mð„A° ¡Ù×Iò02^7ZI‰³ nÊ Çáõz¼TMÜ}0¦–Þ‹™fÐGaa"³ªx¾xÈö$Ö%)ÈÓû®áÅŠÂ[Rã°ïcî©·rí ÏÜÐ~1êŽFR²nœ•{ ä(•› R/*|l=ØÇ t“!]át<3$%¨ ŸÓ3¾¹=—º:4Y–zœ]_3›®pñIûþþܵEƒ¨¥à”0¨€ò/|å#3K@ÒÞÏè}O.³Uß)uZsR´)’‚’G?‚:j d¸uðqí¶t2}SʆJJWäfà¸#œ£À ñ kVèëФ_ô¨õ̶²³UiöîÌî.X)r2W«ø7ö"Ôou¥Ä§±`÷+>3ƨ³ŠÕ—Jjþê+ç.šÛÈ^uÜX»èlWB¹}w Úí°w7÷XÒ¥«Ú¨.ÖåzïõD\ÂËlãkÈa+±u€UOT¿:QÃaæìt24÷W9x¸€+øþÅó†¶1¡l컕EV~îù¡:Y›1¬¼ø¦N)AЕm”$6Þsã‚æ—ñð`’„Ú½˜n¹ƒlÖ å§¥úÜ‘Ì‘àŒ•cɘuŠçÆšQ‚×OíTØë%p¼5¨`4šdË%:u…C¯°ü+ÙþæHÿœƒxT…ëëJ©î=S!þ±Ü‹9ƒ§”F7­Nû˜Åò—¢î_™ì{b@¢Uðôïr¼,Î髢ǀ°KDãI§¥©pr3±äLVºÞw›‘mò´Ÿ ÉÄ‘G\?³Gš†±óiµb…”_Þ‰¹¾FJI‡ à œyº[ )!c¼ÃÑÒ·u ±ùNdÄ(Ζr•vìSsÕ9Áa*Õ˜©-å$Õj_ËXã)TAÏÂy ¹{~)£}Š^˜Ïl««©ž3ßì(R:+ÞÌ…ª¶ÖZïLÈ5þ¾<›ê”üþiKÑÊ¡Î|§ó¸‹þÑÑd¡]«ÔÀAEWj\Gj º7’›W0=êÀ¨™ûjŽ«½»Ï†Í™ˆ|-#OÝ|ö.Ë]+?ŠËI2É-zéÉÁ8:Ÿá®’–³Õ¸tvµ§çnG¶‰Ü|AàÚ"s¨·žC_.ÁÜÚgôÊí†ícgþ”Œ×°gÃj^­‰±/l tX}uÊ5â[[`Ší7¸±ÓÖ^¸ÇOšÙ=RjØyý°dS^|¨£Ù;€zÅ Õ•fN˜]#Zºãë¸9äùWQ¬Ù ȇ¼º6¤„š~Š¥å¸Ã~:ŠCS‡î_(œ+¡±g‰I]i5 Ô‘ðuW3h9a4¯›Ì¦"V„¢lî ’¿îÀ{$­gÊ6wLqµ&I¯b¨îÀAŽo>»:`há_C&, Œž´tØ]¾)N ìZÙBw†øq>òã˜Ú%EßI쥧2÷ †l1UÚÓE|?c¼¡‚7Ákž‘ÙÌ3±t«iH?MM¯$ÈH[®´C¨(u3J4 H4ßÍ}B Ø´ýî[Ÿ®[ÇöË"Û¹/4À²µõ§dì…»ò=Ÿ@Z+TNGãiÌ sÖ¡ÌŒÝï;OhQ:Z@,Ág«ÇHš•®rlYvádn3×pÍÕQý’rpE»¹„zÚ/ª 4üWJ¹Hž0zmôµ¨*Øj™pŸµ5WŸaÒTèsÖ)H¿qæ„]õ!]̉ïEÔŒ µ¬ÃšfÎ9–Ȩ…„Ýkà 7DNŇ}–22?Õ“Õ§VL1H†tAg¬›k¦ Œ’—×aÂrC ~å¢Q¡L{|'ï˵‰Í棛>†ûHbþ%Ïç&ã<Å? ÷«)Ê-ý=ßš9‰’† lRé'§EÉÓÁÇuk-pTÅÛ1«@¿#§!dôàõÏhŠÐ„¬âo‰¥hQ¹0$¨c§î~í{ºN=Ä•þ4ü%„S[ôë”Ö?Ê’†ÙÆøTëÒ4Œn`/õåóÉ»>çy:˜Tx»”¼HÌ'1m:Âä —5–§yGjgÄÕ[6‰Û¹›ñÎæìÕ8Šñ~ÚXxÚ*PñhtÐÊÙ×5xÎa09ÔhसA±¥SžÅlú’ov‰Ï]¬8ìºzØ Fza®G›ÄE|á¡)Ê˯w¡,úh†ÌO úZµí½„!ëó˜5‰ Záù‚åÒž1áRzÜ®ü£L͉?hÎaèÙ"ÈFÙ†Ðò Ç{ -6ÂÓ»Äç’£óþ–´’^v%cwg·£’ eë†~p$­v¸î\Z ÷ŽÞáík$õý¢ è,-]¦ÂùA蕜]ëúsÑëg/~ß ¾/xÃfŠíNí³$RÚ÷öQR¹'>{[ëN®ÀýOî‘ µD¦ÎÀob‰&Ëë­rÒ+Ú{åuÉÒ+ÉÜæ$ÔP°(0vŸ± á;_ψuÝA<¡F;gÞHÃÅ¡ñö+c4,æœÅäVÆ”õ›.ôÅ{À•±÷WxLrOñ ÊÔáøÕŒÀ´1²ØÃlR4x®À#Ñ!f¾õ'^Ñn•nŽÒE¶V’\¥$Ž\)¯ŠÊTs~ØëñÛT€NüÌ}B…ì f~jE]6ƒ~s²$m¤¨—× [+qYÃ²ŽŠCätf{ÝLÉÕç]ˆù ³Y1Ý­F(¯û»qèÖ5ÚCB¾#J}HZŸ²I`„&lGâ@ÔXc›¶QÃ\¹Úw0i:0I±OåÑÚ·SÐ>f^vºAã’gÛuÌÆØ…Hž€dɶ ˜8ç!¹tfO.¬³’йdæiœ3ÊÝêñt½·{¸”€$‘ ªª¥iÍÒ—´”YjÀ˜¼ÕÛêŒE60!/áË›è,Õr6·ó1¼þŒ(©2_BMùùÀ‘8ê_ÕptÒ‰kIFvhÊ{‹ÎèÕVv=HÞ÷se8ýsù)íáAV~i ýBáÙØ·4yajÔ¥5+ƒVAt¡Hù{Öåð~¿7¶‹qü" J჋cá2Šž&$JDzëλ£ó}Q§ëHWn8u)å±øŸ±aÂÕÞ®Dùu«úìšöñ–½­îñ*‘+ÚxfÒI¤•OÚº‰¡ž(L0Tu÷ Q‰>\ÛOs6-òcúƒOO™lÚǸQCéêzÎÞ|»ÀÒAH^s¯Š|ì-Ìx.Ë1tn»½©éhNÎ8>AʈEl}ù ¯–>ÿòö*ž÷:L˜šPa8’ž¯5PýJ “,{÷øl ­P2t2­ÞãÈŠeÐÀ‘+u¥`âý‘€Æ¬XØdŸ–1å½Z3Ôšs­Â; 3néj•LEÝ k£¤3‡q´ÙŽì£{7^þz«rÍ›-8&Yº i°ùƒ ½ÇŠ'ÈÂ&Y=²×ÕP¨iÚRO*§ñ’g§{ • Oʄ݌’n÷k¾‰O›ÙÓ~t“É‚,+«òË2G ¬>®–('òôŠ½Ñ°Ð&Ìšt-ÁB)í¯3p¡Ó¼ø v´ô·Æ´ aåë+1° ÄÞDUâg,ý ŒŒ/¯àŸ;hÎ"Yî{GÕŽ‚*çño Á“šó‹ ‡íAu4½µ+*÷8Ÿg9l¨È¾ðØ8ÝdE_‹eŸ"ÿè,ðM¸÷ .¥ ’qÐ#ǵ›áú`ˆK}+AbIœ ÓK3`Fp²UCEÕúZþ·( endstream endobj 4051 0 obj << /Length1 2481 /Length2 18468 /Length3 0 /Length 19894 /Filter /FlateDecode >> stream xÚŒ÷Pœ[Ó† Cp'×ÁÝ݃»»ëàîîî$H°àÜÝÝÝ î™½_É~¿ÿ¯:§¨‚¹º{õº»Ÿ^ëȉUè…Líâöv.ôÌ L<9aMf+ <9¹ª¥‹ ð?vxru “³¥½Ï?"Dœ€F. ›¨‘ (PÎÞ íj`f0sð0sò01X˜˜¸ÿhïÄ5r³4È1¤íí€Îðä"öžN–æ. }þó@eB `æææ¤û{9@Èèdibd3r±Ú‚v41²¨Ø›X]<ÿ'Ÿ…‹‹#£»»;ƒ‘­3ƒ½“¹5ÀÝÒÅ  t:¹M• 7²þ»4xr€ª…¥ó¿*öf.îFN@È`ci´s-qµ3:@»T¤d @»Ëþ+€ðïæ˜˜ÿ›îß«ÿJdi÷÷b#{[#;OK;s€™¥   .ËàâáB0²3ý+ÐÈÆÙ´ÞÈÍÈÒÆÈð·t#€¸ÀTá¿ës6q²tpqfp¶´ù«FƿҀÚ,fg*bok ´sq†ÿKŸ¨¥ÐÔwOÆ?\k;{w;ïÿ™¥©Ù_e˜º:0ªÙY:º¥Dÿ2Áÿ±™]ìLLLœÜ #èabÁø×ªžÀ¿Ì™A5øz;Ø;Ì@e}-Í€ ?ðÞÎFn@€‹“+Ð×ûŸŽÿ%xff€©¥‰ Àhniÿ';È 4ûƒž¿“¥@‡ 4~̦¿~þûI4a¦öv6žÂÿ~ÄŒ²ZZRBb´ÿ.ù¿Naa{€7=;+€ž…ÀÌÌÊ àdgøþožÿvà?ÕÿmU4²ü·:¦?¥ìÌìÜÿ*Ô½ÿâöïÉ ú÷±¡üïòö y¨þŒ¿.;“ èóÿçCð÷’ÿ³ÿW–ÿ×ñÿ¿ŠÄ]mlþöSý+àÿÇodkiãùïÐ<»º€Î†œ=è„ØýßP à¿´°½éÿõI¹Nˆ¹ÍÛhé,né4U´t1±ø×ýç)€’ÛXÚí-ÿºpôÌLLÿÇ:s&Ö KÅô¬þvAGê·³3±7ýëì±°sŒœœŒ<á™@ÆÂÎðfRS Çß³ `d°³w-€Šó˜Ù;ÁÿõD9ØŒB™þEFá?Ä `ùC\FÑ?Ä `û/q2Åÿ3€Qâ±%ÿ+€Qê±¥ÿH‹Ìi‘ýC -r¤Eþ´(ü—¸@ZÿH‹ÒiQþC -*¤Eõ´¨ý!õ?Ò¢ñ‡@Z4ÿH‹Ö‰iô‡@‘Æiò_bùLìm@cð Û_[Û?ëÿšFÓ ¨6àŸ ÿÍ? rÍþà_dù'žõ/tû“€ù/ƒÍÿ_áö®NÿH 0ÿ‚Zü‘ j˜…§ƒÐî ›å?Ô ë ¨d› ¨¶TëŸTì ¥v ñ?¨xû?»ƒÛÿ¤Þá”Ìô´³šýéó¿­NÿÓ66P#@7“ý?ZýWoÿ<:P„£«½ ðÒnÛYÿ733¨Oÿè"3¨)Î û‹€nÿè;(ÜôJø¯PéÎ6FÎÿHÚÿÏ K•ÑÅ øQ•ëânÿ ®ÿ@PçÝþ áîÿÐj (½ç?ÔX¯?â@™¼€NÿÚê.&W'Pg]þ~u€n­ÿðß߀@  üÊ¢½ oˆUmHûSž;ýþ$ÿù¾F:5½÷ŠS‡ë/d˜Têê¯A[NB©#½¨ë{bT÷ŸW‰Þ¼O[êaÂ[“•Ú^|^ •göÛà—§1§ O…êàðéU?ø¼9ú¨ZC´€wI“ç9ºr!+æzrï—ð¨([[ÜW:¨æAx-›¥U‹Ñ ü>OþÍ8{›Ú…ž–íÊeþþa-wêH:‘Þ÷,–µÈ[{›%îyÁk£B•ʇ G›âm|†Â[ø(MkÉ»¤8^:,ºØŒ@±I ÅÈ‘íq× _ÙØÔÎö±A HÊÞLX¼‰Ò.¹ðȱJn'6Z^ç÷Ù7fƒxg¥ÎÃ7L¯èÊù¯NÁ‚ƒÖ.çŠ,á}I6„!÷T‚ÐGáGiKË8ùƒÜ~³”õIïþŸ—YŒ¿¹èôxy w~à|ºöš’°ƒÍѹSÕ:PÃ!5e¶ Îå…6<ÏѬB{·Ç+ù c5þcKºË ù½O>çÔ$XpUŸïàù3â‡í%GÕ}×eÓ2àL\¦tä˜ÌK)‹J~NÊé@¶°1šàx…x}H-gu‰‘QaZd>%ns¸ùÝ÷GEžÉú™ÒÙ„cÓjaÓ$Ÿ©²é‹PI}÷9”ªò) ©¨è%sv9«FrAw$Ãøôm—4&ÇRÕ<_º*ŽÜÈIƒ@ˆ6N…|ÐFNân0i–@“¶UσEþHmºÚo÷ê÷ë=ø×z²„Ÿ}Ó»º;ò "ET곺—òøy½Í¬‘¡æ…ol P{Jå›Ë:ã<ÍT(î'ÔÈ»:-RËò»Z”Æ-Í‹N®|kíQœÖÿî‹ÝÔLÕÝ=ÿ“¾dÒKfbµâÐïaO²È+Øk_‰çÃÂLòâÎCÊ †‰Gkfö—2\ªÌ 4>m¾(ŽåLv™µùÌ:ð9Z¯×ߘÀ©»ý´*’£x–ªÑGLòÁ1…‘J¿qJ©/¾A-îçi¼·d)ë!5|åî‡ÒÖÎ"°õ1Á² ÿ‘8$¥k&æg—‘r²Žø‡Ã¤‹óf&‹˜å¹¼™Ú¨Ðÿ1q—UÙÁ B5J¹z@ø¥ÇìG0Ò+c‘‰Æ—`Ñô¡7œ.ðàÑ_ʃTº(%!­“Ÿò!ûWf»2_É®>%O“¬ßr×Å(ø9µo|K¿®'èÑžzC±Õat2Fáp¡mè;i¶öº·ÙŠÑÉVRÔEµé«Ózª2æ5VeÒª/ò›¿ù©º>]-*œÖ1c$V?âûeQp²BůÏv ÀÐñ·ÒŽ•©‹c™°°ÖŒá qY Xœ@CÛ´a ÙÁ&leî75=Èw!Íwñ\}û®“A6‘kÊ3mi‚±˜aõ&ò"ÇòÓpœÝ©J6þ–§ûg]áð¯íÊÎ ¿íß&yhKr†p%Û‘ŸˆÍ¸ Oª}aÅ K* –Ò?¥6¦Ãìò%·py?¨ÁÒJcŸC=ãXÄAä “ô«Ò/W¨öûˆ¶éG É•&‘KnB;5ý…å©=Á6Óòày2›ÌéGjéÙÝ€€vùÅø¦àTÜ×®¢6¸íQ4©-PTñn&³$‚£/1å™»ØßB¬Û@“jÐ3!Lþ)†Š÷û!–)û"_þ¦&[Tû'âø+DM‘,è1B釸òÎ&TÝåy=ÍoèØ­i„õUY¯+64Íóãx¥¸[wùK>³ZŠù†5è Ùžy=¦*c<‘̽Bèˆå±y íwðRfÔx>F¦‡k ,12‚:hH¶µH.šÝP¶7ê8f5}‡eÈ^arÅWË$8ë (Û_£šs§'¡e«#Û,˜m)Lç'­~–¡ÑøÐ.Yíi0B/Ý‘2„`L0Y^p«mUjž–Pß/à!^š¿é°ï QœÝ"!°¢Pd!p›;g{7wšW’Û ¶*Í{%M«k ?I„/óÂ=Úkó)nÑ6›Z`(:Û£Óq8²àp÷B1áã߬róÍGQ)Ú‚¥‰òqZúrf&3H{WÉLXû=YÅî¹p`Ï4Ößà#M˜ANƒ®å1Ƴô„å×QDZt[i€LÀ¬#/“FåÙ÷!ÒRBÃݨ k‡Ì¶6ÌÕK[ O_váIþDÙ1óx†sÄUV¡}’ߨÂïâÕ`CîM$HJýº AÑËù{ý¹¯«¬ašÜr@Y' gŽLçÄÅãaÛÍϰ .O@´÷ÍMB¡Ož›!5a/ƒh>>ë·•ƒT²Tô‚#¸Œv«mfÚì†s_¶(VÛöœò{drQ¯*RcÀ¸É˜r–³Ä`òÀWOQ]¹ú*Ü’ËWJ±í ÙNfwßõ_uÙÙÃSI÷VÜ0tBµ¦ê©11e~ªéã×ûÙµdTÊáj¾ÐqQp! š’ýþ²‘Š ï¨¸ì9ÕåßÕýö¶‚­YIÆ›z…,TC´ÝT Íx²ªå°’ŠkBDù¬˜$ûnïSñ@êEÂÑ%‹,K¤¨9¶åeŒ\œ«f2ûèûxNMŽ%»,c¦À‚²Q¸»  ’Ÿ¯WK¨¦¯¾w8ùçÆÜ¸"*—·xƨZÛ` ´Rn×JžÏ!nrÏѧP?w½¸þ€ïv¥E·©7½ÿÉÖpÜìUj"람ù¤* ­ÃUá6‰ûz#¨)ÿ-‡AÓŠT#eyy!kvk&>Ïø]¡l<ÅurÜÀh‚8oiWøÄEïÞ+H·+ ªb3E™1É­ðôèSîWIæXÖ’¸»ÿð%2NïÆ¿^»[q‚ÐaZ¶át^DbÀÛ‹Ìd˜XßËgÍG?Ùæÿr[ÂX fÉL]ËHúIFzŽÄñ<ãýûöµüp·ªQWÜí^íLƒ¡+ÀæžÜJǼ~õ<ԊïMac$)IßÚF¤öÒ¥uÿ7õ4¹]£Æ‚øWF0t9Ô ÏJÿôùC¿[mÇŽóÒU"K©üÐ@²â\‘1Õ,ಽ—²Ã4ê;"Ë\pp6í¬4u°y=ÛýÈ@õ9°ÄU…—äÀ€ªûvjs0Ëß-ð7äô¤ÕótÌjT59çpCMÂ1£aÕ #è-8/¹äòÙ¦NðἎ¸yöÆëv¬~Û:¹Ýg)ÞÅ‘" $åÁxÜ´í<¶Éö5÷ç"x–‡•%×ÜM±£Ì(fô6;U¹ö-7í†^zð[Þsª;&®†`k{ËI¸o‹1S,°o:è’›£Õ§¤KG¾à0`\Óð¶Xž¹aŒœÉ<·:¬Sñý}.î…0ãµÐø3jgÑ ®d³ÎÏ+KÖÛQHLyÖ‚Œ:šÇK^EZvÃßJ?§?e(‰ ÉdnD$¢¸ ÊëS|w•ò¹¡}_d*m AàAO0ÅR¹ª,ïå¨Rs¿W [zñ'˜¾º9åïã$ÊC™Ñ! õ`Bû¸÷†q¯ííÛw·IÄ‚xÎ56DÙ¨ Wß3a`DnnŠä׿Ÿ`¼w$£1_~ª–çvþ=*Ÿ–ÿ@'˜^XÂ~°h|=¬Ü1Ù+놢e´ΛñC‡ð }¤?ÈC蔇úªñIäÍ)~úÓqh$VŒ ¯:i¸.oq… ¾ªr79ºWè™ó´l®³–w¤h=)ÂS°¨·Q©®o™]ªéh.åÄ„Œb¥Cò>¢ÑáúÈG,pæESdä×ÑW#11äu6’®b>“‘ _(ÎNòåÖŒÃkF©FëHÊÊïîÆ|ã©h>C¼Z»‰U]6ÝâÞËet_Џá?QÒ Ûœâh;:~®1ÄŒÄF‰®¹ CæÀYõ¹QÃ9ªÕa*õ~jß?ð¾3¨Ã ·Mv»N7Õ}úºXÅ^hÂWŠzb&—cꊢT³«û…ù[ÎTè8›»L9÷}M¾¯>#H]Oßš¯6ݱYHÛFy|ƦÛ96¿-±I>×Í[;]ûI…€‰ÅÙÞÍ_gºUFVÓõêdz”î £j…~nJßv—Åjê¦üEÄ:ÆcX$Ä)ï§IkpÞ©L*ñSH½ßE/JtÓ©³žn‘)`—&Ðu jÍëÎø'VMPz Þi¹“ÖÌyq­|TMn#ùí Ž9,ØÍ0®š&…ÅDG²Bçáí¯íyI–ú«ØO àÈ^Õç¯Kù¼ÙÉò·7O³•w’sÃ\a‰Cø·áSáTÂ×aSÍ‹„ôû¸M1_°_ÏCC€hmG¹66J¥Ÿ8Þ -íKB“ÄùêpYç3^µ!~oìÊ“cn*Aë»OboG÷ygQˆUÆðä[óP"ñ®3ñ…K~4Iù¥Âçú-¬fU›É”ZZ{â/¼zlšs¬¿VêülÏ­á• è‹ü›öœÚ$œ:§­F®¾j߯(c€ÔûÝ£‡•ÏG܈aA=èóÉ2Ó‘Ä(³Yc] ÕÙ ÷D`@¿ ÖzûÞ–Fwd:®{ÛÅa›~^=¿Ü}Ô‚+ÖË&± ƒ:û Ù¬þ»ççNMH»xš·ÀÝØã¶ý3˜ø5¤WƒÑ6µw´kï‹Øv;³Ë%&º–›ÇãòÔ£EÎ@'q½Š¿Ô¶¬js1VÐ/Ï z ØO0eóÕ uzÆUnN¼;ì‘w?v[½âðZ~~mh±EmŸ>eÍu¤¢U `A(¹‹ ÉXº£>ÍÒC‰tFJ‹fO‡G¡–5¶ Ì”Ó×±Áh˜H í3ú‰Ù I]ÐïËx°¦‰3âþl³ÇH"Yå …@•Ò¨âærz3 ¯.d[vd´O^u©WÝBO¯':Œ¾xÙ˜€¤Áí`Þ§g+›GñVQV4}mç¼ttû¸l1u"eb‡^ü£>7X³g³‹U¨i6Eê ¹Jâå¶ Òš‰eèÇ\ÎvÎ:7®±V¶ûè©\O ”v|ÃådcÙæÙà­«Ð;ßÏ0¶ÀNë¦pä*^þË”¡³²øåÌgaȶI+ƈxAžò…ÚªìþÇ%˜ê‡‡ÕÒòƒ_³È1k]âmÌ7¹Ðû‚Ÿ £gʘîQ¯ ã ¾LÖÑB÷·[‹m4õRÙŸŸfë`!¿¡!m @]rýŒåO%<«b\ÆÒ­þü™e‹x¬Pc 莈yÂÛ£™ÁI4 ³1tUhfØûú4`…Žš3œ>™Çy<ŽÏãÃ$Ã𦨜e€ÝÀkóÅ2c“¡†ú§"vA `´úFÊ£ûuXá3\{„#“ßY“ºôoÔ¨i½¡‘~‰A ›šC¦‚ć…mB©µ¦\ðñÎù?8o¼~ Ú¨'5¬ÿ‚€þ ¥-0\¼<ì-÷è3é„Â5ŒxÕ XãÕ¬û‰ó¨Žo/ƒuJ*º_Va@8ÉnC(l¯ØJUVp¯8ÃUiøX[/íAë~óÀŒ$S?YË]æ\µ ñN·óW€/”úØ[„”°?Ç+·ËAp®­t²¶”æáÛ!X*£›iu»°ÛLzœwúV—­4qïNšÁåˆôC¤,:ì+*w˜[BedIUîïJÁ{¤óŠ©Ðú—³N27ÿh~ðfëWåã¶Чª%?'Œ Þ¡ ëzÞcu½hølÊŸdbÈ}wú¬7ðA0g2‹NoWG‡ÇSS¿—»Û®h­¦íqß:“ófèn¶`deÍã -Þ'_¹ò±$ð;šòj[íç*Ù1〄–NkCð‹þãh€wÚ‰ÌÃá×Þ¬¡æLŽàt( L óáŬE:9,MÌ:‡®|‹‹¨SÝácÓOÔêf„u…ÛÉ(š³çsH(Šâø¯<ÃUºô>“i¢}¡´Ñz÷JyÜ&Fî@²* G ¬\’¾ü¹zß5«ßûÐ×ö9 dÀ1Ú¹Ë0ñ+û_Ý”b?S}à2.3yL§_Þ³[G¯[úÆüI¦£e6~L#–ŸÆAmz¡žHG)o¢ [ð`4$VŽÇ\Q¶ÚK–@=ò€×¯´„¤—b«æöHnû'÷eH®5„Z¼% }©m^þà< ‘zú•ÛQ~%œKKuHÒ¸"¯Ñsî, ‘ÅJ9y$3H爅,9ûiÃtawÆ-³ºWšõ½+-RuPª6R'FØ*[¹c ¥„âñxJ½¢Ï6»Aøh‰ GwJ?%ã<ÔÁP_W§–'ÞÞ »V\Ü­ÞáÐñÏðÒSeÃ-ÿ.tõÊ2/[¼FyY ò„*êq–ÓÚߥdè¼ «Ø]:÷0ÁŽùl”Ì%Ýüx—N þÚUþª§Ù †ú0P9 Dý"~ñS'žõ~a7ØFT7ëÓÙ -<÷ÇÙCÚþ_[íÆ™>×÷ÿ°•®¦»{ 9R¶/‡¸ò?e·¹)þînE~ Y?)ý°*ê4æœÓŒùrºշ±^3:5Àÿ>{)¡ÈËê<ÕÉÈûÙ碌Êm W{ŠØQ‚jÜãÇØ®Èv_,½ ‘_ÿk/&²‡g*ÑJNÃ$§Þ ñ<-ù½H>eý÷Á»†–6Á°ú”vœ©G·””üjp=ðW`J‚Î,Qhó£4Ö¾¨nÊÁ»ÐõTA `÷᜿E•AQŠÞ å]_Ž~³-W"]ôœpðìMMúÛx·1YIÕ…iÛ4Z[ÌҌý‰©…o6•jV]Ú ­Êñ 3FÝë·ú|ëöˆ*ˆ—Eºâu +´ému2Ë‚ ùùÃ7ÜþƒüiMtÐhJWJćúIã£ù¿M³/Û机ü•FìeŽVhCä0r^òäªq.÷­:‘(-ÕÎÙr^°mœàI©Ýè!2ìÁw$´Þò«¿hâÌý\ô‡šôÌT˜Úû ‡Gb1r£ø;åšû ž¦ñšË‚?Ä%¡*žH+Úˆ¾drÇüÐÏ£M­yˆæ­©±âmªÒ‹·"áBB ÿ‹v’ô «£bÜ™ñ®‡£¢s_àdRM¢ôyÂ@´˜çu‹JœGñv÷G(–‡Ër{=B̽¾à‡`‘spÚºL·67)ô¼ÓwùÄ0û6A¦V‰‚Ô.»4øÁ‰»¸.ªºÃÔû3|Tp¹ êx21lêlx7&ND·§ôÁW[>("9éa9–ãk*’!ß+™Ä¾Á‰¤Ø£â:-—0ú¸eö‘ç‚ብÚ6¸Ë¸ä SÌ™zºUÚ8†íiåw'sú}Š…nNxX_}æ©ûU„Žƒêc‹'4üìù3V_{úH&ÍëÕ2éXÿ£Æ£72þà+6õá{?+ã«ùõüË ÙŒˆŒËä”AFÐh«4ámæÚ½iš;Ä™Y™2zÜ΋W)Á‚üFòcñäx…º.f_½ŽQ¡pä‡ Ö,‰žÂ›h‚†Ü°Ì'rŸ‘\Û(îÎãš+*¼:ŸÔ€BÌKÅŸ‹?oÞ%—,žc°ð¶÷ ²aŽõ äÉhMùÝK·L&Å„[Œ3 >‡Ä°§¯3Å‹|ܘÅRüÕ”š¢ôÀØcÛÛymê__¯œ¹¼±ÞÍÄ…b¤¨`RœÈëÌë/À{ä©8a#í£ºQ´D ÆãA܃×ㄞLHžï•Y>ÀÙÊÙÚ:E»¢_`à#}Å=4“™a}Anør½Žùò!ê\_Ž–ÌwÇNEŸ„Tôè€"W<£‚¾¸ôõ2õœ„èsƒ¢ÄÒŽx 9ßùÁ†G·Ü*€ÒªBsõ+3û«ÇÆœ­öÇ'¦YÑ 3í€zü [²æíÅ×k  àí¼‰(L!ÑoyŠCËG„è¤ËÈwŸß®ð4œ˜ç?"Ø7B"¤‹}fCéñ©ê#L¿þÌRí"Šƒs][¼ã½·€»+óšaâ·Q3•!³;×1šaøy×à{Ï$‘¼JO^¨9 mÑlÀ¥Z«¹ðHæmFÆùéC;>Ï3l3e£ Ç:úÙ¿ißó(Ÿ,¹¦Öà3žÄ 8XVò'·Ök·í±@ ÀhîJ!†lŠl°|éNu!§K–šôûÚšõZ1®IÞñÃkª0b×|Mzðkä$‘\î)fJ§m=掠ÔoZl)S|yî*ø&NV)w‹L;éƒf ÏÒªj_G.NÇn ËGÜF‰}ã1 fVãÿÆÑp³O=ÇhDžÒÓ½#%§/}Ñâã"ä£Ñ¡WÈ»Dµ7£kåàO¶5”Ƈ×ßò®:ÉVa·_vZðéæèÍ}Þ¹w@3ÅK+uÛK,­ú©” &¸bûÒÉèé¨Ã7]HyàWù §ãfôš­ïúk8{i©\Èg ŸLoòœlaÅñÑP¥vªìÌ^kë=þt­Ú&ª˜)ëÔ'¼¸&?v¯m„‰á¥ºaÂxÇzœKÇœÐT®”–š"¼O%= P¯cŸ,¹+-Yµp+E†;i–$Uf`ýežš®§³TbwQ]ÂX“x&¡1»¸4¿¥6¯W“œ¿@³èBf;üxQ¼ªæX±BðñûÈ^Ä¿.{±°Y›®Ä “!¼*ÚkŽË^×~»™>5àÁ>µÑ&}ïpÿ"øv (ny¾ïjUu²ÚÞpè¡áÉ’¡åú¢Ì]q% ú’¾ƒûmZÝÔÌÌ¡ÀjaO{Räúòõå.ùsf!ÄåWJ¡ªWnê™ÀÛÌØåS~=Å½Õ l%à4’ô(8Р¥ L˜ZYŸŠEGEÔÖº@+Ë9BTMç’ÐàÅ6âzRlïF­Õ–UQ¥L’ H½xÕçîÒDi÷šy0jM Ž;bž"xªoOX«“™á:†”ôx®üJ¼ð† ŠúÓÞè æõ9½_ïvx=Æì9aôÒWبkK¯¤NÈ”†ð‡ÁÎøyhËŸ)Tï%9.j_|Œ:Q-Ü€¾9½7“k}Ï~µ—Ðΰ._5 r­ÐÚh:ó;+B.ÕBž[@`ÇiÐȰ6m¾¸ôÜ÷ ùbl+ŠRÄ”^E%ß„a§ðPÊc%Ц79Ý;œÔ}ye²¹OZhl:ŽswÀû-àƒqt¼nÐ\HÞÄOO8•ÎK¦ ·¥iD½ÁûxDCEáU‹þîNmðeGÍ:,M<…)ߕճvM,$I#¿ó¶LóCHN¼Ž$nZ’ïF¶ó®ä×á ¾îÆ•(^µŽtÅòhFd¿ã›;ûÉjà0B¦zh„Ðïürc Iÿ<¼"O8æP;^:þeàž·8yOÈáú†‰£Mt9ZE•aPb@Ùš_ÓbÊþ VqÍŒ[£Ý~kÂÝmœgæøó ™f‘ðÅf6³b5ünêÞ¶ò jïÀÚc÷ õf¢#FÁªnLØf,•‘D ­ÝªÈzËÏÂ"­sð“.ãž Éñ>›o/2Z{O-Y™‚Qþ5[Ë6dRo’±¢ñ‹¹miÖ¦æGɽÏ"Oĸf›¢»õ¹uõóéÉh”Ðþ'¹ažßçó¾$ºøõ;Þ6@nðÈ#ÿæ 4¿“[hþy¢dAò­-ÎJ÷w. W§L5&É” KÖ²“˜™Óø;9Ë6Åf84 s•ûÕ—±Ù“~Ž,¶¿/vÌ¥tÄa.^RJÍk«_Ãë”NÓÔP aˆØzr˜¸…¸"M®gZRÝuLd¹"æ ñýw¹]ÌyiG#ï—˜b˜ü•;Ð W¹Ûê¦Y®ˆÎ zh?o¬„fô#D6˜¦$\òQ/*‹¸ótvʨ}é<Ðä|Ö¨OXÖœôÕu°ób†xýiQÆjî.Î2B¼Üsµ 趸;”Õ‚ ’“GQï‡iŒ__G #ú€?3Úƒõåœô¦6‡YÄRWä—&M¾L’~ˆBùÈ…›,Ù¨¢-|­ØÛèµgõ‚†ù†zä³@ÿÓŠÍ¢êKèQ™ÓbY2ºÚ9 qšî)¨:ní“£8Å)f¾SÌY ™GO…õ8ïs-˜­R0êxã·ÄÚ¹ï∔16’zð¶…ØúÇkõ(1]¤Ô1$ËŠË[Á•ÔlÛC/x:lB…° Í¡o•W„ dÝÕû`3ô hà0$ªôàÓä²Çm¦ª£F3U àÌoü® Ü? þÖÿ…UË„¢M+?©g7é呜t¦ŒðäqÃ>ÒÅ>ÏÖH®’ifW­Køµe{h¼7™g¥°ù¾Ÿ_ÒªÅuÓ ÿõµ†*#Á8ñÁI!³>g&/à@>rêR.íi¾d$øø½™<‰ÄýuÍGígnýûç6øê&òÑ%!u‰ åî ÉàT íÜâS ·¹Ò”l„ý&jß•¹ŠX­òÍW›åˆÍŽ ^§È‘}Á¦µÔ áÎæ/£CBˆ4±«rÿŒ(U%¯j¾täéãuƒM4 }Ôh>îå‹Í×<ê0 uˆD8Jç|ß¶P¸F ñÛ!Ê`áƒDf?GsGø±Ý±êøàÌÉ©·mßÑ›§Ð†`ÌXI˜æ]y¼Û%Õ•µKá #QŠ=@Ѷw+ÛŠôÙ20i«¿Æ5ûÖè>ÛM'¬èç  >Ù²÷p죜]¿øúõQEQxÄÞµ| G¨9 £®z€•sà,|1jx±ìõƒÁÖ€¥Eþ0¤ÁëϨOùëNû÷¹¦,:ùyw ÒÈÈ_Ö,¬À£°]B"JÈ« 'lí…~£âÕÇùËÙŸ}p[¶–'S¨’›nNVÕvzË»ü$‚‘ûAZ+~î"½ÃϘ_±[¾}2 ñË“h¬*;ã")óºnþ}Ò¥©y7•@÷ Æ#NaGG¨ÄÈA§mÝ5mߪÌ+l]X¦ë²UìCƒi'í’e¯ØÀhýä´ÅÁÈ &S˜bv´aÓˆàé]åíCºüoᔼ]ª³¯Ô?‘á¹éj‚=I š¿t  ®ÒÖéʤ,ý¤~Œ>Œ«•4éÑ‚.âûúrƒ'gÒÎ @4-î?½ê *4µ¤êYvCœFa¬9 Éj.¤®Û¨{'Ÿz×cµÍ¦ô®“3›>N?6õifÀâ-ߌ'06zWLÓìŒÜÞñÌð7ˆûûØ r/îÍ…Ú-ZUê9F¯Èû†X‘Ô6Âô<'Cæk”NŒ–„ù öÏ1³|·AXEï35ôÓ :Ñ¢i(~d&ñ¼•F&¿¬­tm9âh‘Npù}A¿¶¯W”¸°,ÛÌY¿]ÃtÔ-JTö]¾ß ANdf&"­û'‰Çƒ— yl lÛÁÕqáÑ5œe-¯Æ ³ûæ#ý†‹wÚâ³Ñzð¿"jY½ç°V¯YÎs>D¶Íõ—ÄÎl¡»ÿ¶\¶_:a\"Ò¨ð{ùŽ4}A:ýõ7f¹=u‘'OUª°m8 8îÔÍhl4‚óÞ_Œ²† Ma7!êmd°ºê–°™Ê.o./5õ¿˜Ö´Qê~ͤ<’<þX¯å(±ÀÅÍý¬ãH+ýûzFeT˜£ñÄì‹òÚã~1µB°Ãçac)y¯‹‘Q%œefâ,#u1M»Õ¢§î÷òÉ)I‹2H>„«Ñá.Ú|ê½ÁïO=ªÈFùjßN2?~hÙ…KÎÜ,ò§+<\ú=éq5ZZ*¼ÆÆ¸;Â5ÁJ]ô‰»ÿ\×½!Ò8#Þ¥Ž‘¾×ðÙÃ'æÑÚúTÄ%ÉË =·ÌIE#Hüm~:° e©út/èFØ/°2°^…ãéAK!ˆ›4ê%BaJõ…/ÿãìlÆËy©±´¶iA¥˜1›;»’Æ ùôˆ3¼±ú+«Øâgi¯Q´ëœZEp•VÇWµ}9™d¬tJy›Äe¦ÐŸÁõ]ÈR¯VØ0pV¢ …Ȱ+àÌ’² Ble’b±q¹@rÛëÒ^î:y6L7í… ´ƒÎ)¯ýï U+Õô^_Uæ“zÇ|‹DSuÖC¡Z^æ–„Y´ÔXõæx¬>MSåèKì()üžO6¥„ŸžaæÚy’ÎN±…çŠÕw—Í+xàfsoë·lt Z~ñå^?n#Ç x2©*@}ΧäîŽmi¥C…Q&òÍâ3BN¢1Ñ#Ð`;±Ð24žá/žNÑý0‘ôcÖô>ãÉx2`Ãv]Šú>žgWEl[H{&‚3FG\/˜îFæÇú!vw’̃KTJ®®Žž£åû.T˜²Š¸´´â F¾W‚œW¥ß6ß {qÂÃÔy§^áÒülÈ áEKB†}rvqåÉz{ ëÊK“j >Jøt[¿»ýåwÑ’ õÙ7('™1O"Ì›Ðgñ+pzöt`bCŸã°ªµÞÉbhÄ™+2z‰¤¢[CìçÊoiøTeŸ9ÁˆÖ|%gõ~£kõv›Œ[ì0‡„Q iE0¯Ÿ;{ÎÄŸ}HdÚF–[ó²ùÑó÷•.óºÒ¾tSp úz^JìrÿGFšCW´”ù"€\}~-;»>fÑ®q)‚!¦#ØÎh–{€¿n‚YÍp`WÇzU2ì‚}> ósîˆ.‘(ÄÑE®–bõ½æX1©\H´B\€öš ;_+úFj€yý鬽˜­Ä¥Ðð^wÿÊKû¼2Ædª¬¯—~]`ïç šŽÅp™‡6.ðBÐPAþ*Ô“íWg#$u¦Øôh’10wéI²÷û6ámwùëïãùDãѯW鯔ë!„·¥Šœqþt~yž¢Ì£9ÎZnæ0Ä‹0›hº¯Cˆ«6m^\å‘R ºx:¬£¹†ù¥J ͦ*纆Gú¾xñ¿àÊ nÖ*á±ó{(v°UÞŽ7ÈQ¡jаã`¶!n‘ÇÍ?BÅc¦©0Y ÃȦC/e~ÉgOwXœAῊV­Ç¨'ªXÚ3;漨†´…c_$Ò>Yw"Á -φni\'}lÈxëëaçUK×DFcù0©u¾ÄIœÄÆßÛOþŒ´÷û<š9¢;Çr+wÌÊÞA镼ßJ›¥)Þ¾šÂõìvõp}T‘9 ²¹vºß>£†´ò}\Gùò|©Ê fkÜÙ#„9î¶]û;½ºlÍÆòkv>`€6ƒ!öw¸õ AsåÒÁ7g%yA¬×«hl •\ ZõŽ;Që«VA+>”æ v©¾¶¦n'kÍÎjcŠ+µÄÉ3•z7å± ’ô€Í&W*l½ˆvÖ3ÅöJ®–å¾ Ir¬áW.Oµhkí<²I¤Â³eH:¤jV"ž#RC!Š@X:’L½â{Þ¥§Ûßmlü{Me³ƒæ»/'­1˜idhXMÁ¹‹z•îÞÙöµT$*)™ÏhËIS0˧f˹+‘6¥çM|QUD RˆW¤Ùö*mbå„~ Þ¥VÀàä–(O¹ô¥­ç^}±õ Ö Î»z šç}ÕðBóµÔO¦× »®ãTô·­"¸¨¼¯/Âçân’¦a ÓégÙÃo6ÙÂŒ_trú؈ ‰˜]ò›ØMÕáßF‘Uó3|L[è½àŠžÑ¦– ¸7ssc­£¤Ðt_ïNŠ—rw5¢Ž~$O)Ý•®ðyx‹Ò™Ì2ϵìô%j©½aú Ü*³ÛïEÛú`›WzÅá°x˜Ú·¥ÇÓóþ˜ž =.'°ªr{ÕŸ¶¬\®€Ô`wâ_±8?`kë„JöêX{G ­mŒ‘³Vq¾ö[¸ÎjÀ£بÀs–o>Õ@•p#S®t¨Fi¤„ÔFI›±(P³ŽÿÊÙ Û"i 42„Õg l—toÈD(”A™:Çâ«á£ÓÚÊPeÂÊ2û8ÀMXŸÓÓ ˜ôß„;8Š‘¥{Æðp wµeàÜ3„ôê*_„¨ÙÊ›“—…q‹·k)ƒ[nY¬™ç"º·Å‘EÈj!…P­¦ËµÔkn⃤ËÉŸB|ÞÞ¢ó#ü¯Ÿ±¦qŒŠ×’jÍN¯{Á·è0D8{éâ_n4I.ØŽÇ›¶Dm«È¶~o:þðjD³ùÎ;ð,õª/Ÿ½¤mók@IBÆÿw1TJ SjKhï8œä†v¡eVÑu ô tXµZúxQûO—xøŠlè<§ÇÙ;•Àð†º±¯¯ßµa×j·›ú]ilH_¢ú<Šd$]7µ cÖ†ç}Àç¡N¹æX”_î¡7‹6s–HœFã¾C,ß–¾èåð ÕäÔèR켪|-µ*ã[!éøEâuÐ2êâ‹8r#LX¢+ÍRM³Mt›™ê0™…’Eþ4OtàÚ"DŸ2ÒHsDq¿”ù¥ƒ¶JîR… úz9Ž(ÁGjqƒ[ ¢7†¡¢ü5·Z8Ä£Ñ ŽøÍßDD*t<ÊÒ²ÈINØž=¼Ø:ÝV’zžEØ¿ –‘@(XoÞrñHÊ1e‹í½fÕlq©f¾ hp¶[‰¦ þúCžS„ bY}¥¯±A×=ñgf¿EZ˜y*ëĤ¯5G'œõLE2A¯ÙU˜  *.¼m÷X3µÉö¹´·X쪪 Íù0wc‘{rw?vóvÔ褹]#•À¯`•õW”mìv't`ß=Eôøvïæì'ðÅ–ñ.Ùãâ´ TêÏ.•ŬkR›#Eõ$ký³ÅDÛN¶HnÉu»î¨ô›Lû¹i1ª“4µ×Pß&Ý6dOðh ³±>Ó—/6¯4ï ' ò)>˜Âü’@bú„˜£êÃI&IZ­9F¿KÐÔx>þnh¥}É…aO¥&ý!â UüC+«RÞP’ªRÍÀ×\›!¼àÍmpX¤Ös‡öœ®V‰RG™yÑ2!èx!•…¶Ž ·µün {› Ï«LúÜa6ÅMömîC-ÑÞlŸÊÛ¯+˜ µp’ÄNœ+OîѶ¥õEOðõAw¨{êã:i„ØKdÇ:0§ê,§cÝuº¦GF›¿ûòJ&eŒø}Ikh­‚‡õWN¯)qÍPLµ]ýo2(K¶‡ovVŠ¥ñÑþQpýSè¬ÜÒJu öŸ\œwi†¨¿T$ºm²ž¼!Ä`¾Iư›ÅWsJ›xÉcYäi_#_[ÝG¬®oå Ý®r–”¤3r£‰Sì$‹‘QfΫ6¾NJl–é)<éš yÐæóCëÙ¼µ£ü¥Á­51€(ܹõQÖ׎̵³]%Á›4eäz¾{y••ÕÒ•¦¢vJÇYÇfúH†ã“’Ù- .7˜‘N~ŸÖǺ€Â•úëåûÖDyˆõñ§–  ¯ú&ßïUíÃÕwHãX±è—ò0O9,ßvÙNwð§âÑ".[ ¾ÕuRúÈZã!Ç7†8Kõ[š5p;Ï™V‹îÀ ¨ªÇ¶uëè†\ð…[|ÊRé ¨¥»W[Ln †Wï_Dxº¤Ð˜ÃÄ7àÅ=‚Ÿ@/}21ÓTûx#Q T#4LþøÞ¤ïìøNK”]ÞCÙq Ëð»ºØ¤uÿË-œKÛ²Ã!RåhXî˜ýó5Ãqú=Ê\>UEzö#Y¹# ëŠtjüAŠ¶Ð†tÙ8EE•“nZ ;؈åFk!l.½Â=wÓS-¶Ü(ºõu#œ°X‡oEÕ°Á”QRû¼K¢ðç4q[nÆ–kˆy#³‡|íûÙcÌ[rôJR`Ya®žê£~)aà´dHš³8uÞeš*C–ö±³j'€ÀÔ,¿dªü&ôã@ªÚŠž]†ÄíWGȯ‰\üÚz¨ÚYdz’´¯[ö†åšÇØÓ(ü'Áª°ð4Í/ëÒ• p“*ò6]/‹Jœ¥áèMÜYO–Æ$“(,±¿û›XXøX[²™Øyº‡Ü¸OtiÏŽæÉ‡{˜.߇%#•Û8ÕÐÃX˜1Ìés} h)lb±£wØãS½Ñ ÛŽ?¨i²ª,@ÿñéxƒ5 9%½£vçíD+J§µB² ޳£ZAšÀÞ›ëán°JgœÀ8^†Pïe ?sJ2òˆê¾üH´gï:RO3óüõûŒugNäjÄ mD›æ,uý¥ Mø…6ö÷˜­C}ݨ‚_À–q-tl”2Úzî£|"¾|ü²øÓÎÿž®ŠÉ¤¥y|êónj¡Ò›ÆFFÃÕ°b Æ+ZzT°¬ jxUBC›²ºþswâóêÙwÃ:¶ré"ã'ý K‚’$ñFÝÑ'Ö¾ö`v§Ò ûжè?:„˜èÐÿ€!ø†…L†5ÁƒÎ»â©—JeLÁL|l‘7üFL…ÞéBõµgg¢§:c«‰•+Qù&Ý´ä&qÒ Úƒ^Á$œê•€cD¡4Õ¿™!³·ï“kåUp|ª$ëg~;îDG>:>@†'¶I({rñéAÂà½=æÍ¨LÖÖûìRç^#>¥iÑ…ùÕå“tΨ´Ë‰ÇšÌ··¹oò7#aÈðh@Š »¤ÇØyw­aÖ¼Ü&Υϕ÷\8ƒ\Qb<ÌBìæ6¨ÒÏÔƒ%*ÁÛŸ:Þ£S¦D¥ת(ßß'K{¥à;ò^•6åz¼Ý6ÆCËO´+—®&ûc5^Pt,?U¦–r>‘í®ðœr}ád¼rsóVgeqK…n!c/…\±†/)0Œ\ÆàbX.¼ kCóK¿ µÑð38sJä ‘ª¼Ù ™a/VoQðjþ?ÿ ôÉÛÈ´`E,ÉÜN»¨Ž4ßäÞ;, §´Ž%ˆ3ÚF‘ÎÍ!˜.‚üê2SkSý5 ZîòÜqþ°>”£Ó!NÍ  òšg/S8 NHß÷Jg½ž´ã<ôêþ&fz­?¬»•qóœØåÆäšÌ{Á–gópL=ˆ•¹‹M•¾8Ñ àËè$”©&¾Šv¨Å7M²3WýßBõñ)=×÷z dn®ú‡YÜ® tlHµ;î¯è|\ƒL“úÁU &7w3ÎFIZëEz ÁÙ•rÖu¨Olg‹”S^‹±6*̹TøÅﺞ™Ûk›ˆ-5D³lµOìÊ©º<¤dLážN'WpÆë§¢ÌH0 cz\ªE½$`£B)cjÞLrŠï‡ÚõXò¸‡gý£ŒàXL¬vi$$)Ï@}a³àâ €®¤Ž}CØëyo0îž^E=v?%d*kÁ¤½µ½˜çqCr‰#Eˆâb©† }ur'…µviC¢ièú|jþò”v¯¤_Z– '‹QP> ¼[?`÷Dfý„rñÕSÐFÜ8l÷paùìDûNc³Ì»ÈÞdÈ£X&.g$gzвÔ9NÀïiÃz3Ù6ìã²EùµÙ1w!öÐ@Ž\Xbn =òPcjüRRUGÀ¥ʸé0:H¤·ýR¸/"wie7ýí^*JþÏí½ÒÅ ¿7²^£1JpX³Y1ïºlÓ°r‘œ›¤¡ñªEá[SxPifñ„rúÓ#¢¡©ÊÝv!*7YVÅúƒîˆ"9Ä-3ÝMìW½ˆ•¾Á©MΘ\/’p`´L•vá ¸‘´C9¸tMØ5„rß3þÞ„ &,_v'i• ?N ²ÂZYX!bNc©Ü¼fKàBq@Þ$öWÖoî©•f<”™Æôk$àä Â×C s 6ÕŒ˜8§ê¹îÖ=¼É˜#^õ¿Ç.,ʲ^*Ÿu»Ñôl6HRóbÆL›tËÑc0žôø±±7ÌtÀ!o#qiTÍYŒ¸ª³œŠÎt+Þ1†/T£Ñà9,{ôd/K|éö7Wéj\kÿ ûuE¦” Q1ôì×¢3Y6’×n½ôÝ !RÎoCx°Î§D ø§¬Í¦žÎ&aZ,c›ñÒ¬Õ±a{}j¥HÐTñÉÖßaO²/®?aý½ÄgHC‚¦¼‡ÖÏMJÞÅļälI¬èkC×Ô_ÉÜð ½NùŽ«¶"¯r¼«²kl1îÊî†éL¡ÔÖcÀ*ŒlúÑê>çaþ`ìêN}Ý%6f¡o¬n^Î\‹žjIÛ¡;uKø•H+Ç=Æ=­½ZªÜ8+œ˜-däƒUìžéË0 ˆ ®•Ô_ÍFcéö’­]uÕXo¸îCùúŽdØÝ\ƒ¤÷_9CÔB –åÐýw¥¼/_’¹ ü”^.ÍQÎhuʪß Ê çlíãàU{®[^ð¿Ñ#fžFê€_}Ï]ÂO ÌõõSµØhè À'…!Û÷o^@U7bŒ+3ºaõÒ. i–æùIŽÒfnhž›…¨q­ôà8jîALÚýoóxÄR¥ß?¥¢zÖü`uØOm .ˆ úUTLêÓ¯1m±vÛeò•u!Ie¾5F ý1Óå§è7„¬Üàÿo~Í Oµ$Š‚ KDJXit®pÅŠœ‰‚ýš ÏT)+ñM{ ýín’% _n±Œ? ÉI’÷Èb(z–9<±´×ÔŽÙÐã—&öÇß7)ÝÓ±ü ÒÀéÉÓ­ƒáo%JŒm[ôºÍñÜí¡ºµ énû {åÅ—ÎÄ“o,`÷4´~à[?çêÞP-!)Jçº5ádì!ûùº"/áqAú¥RO† ÛcèM^ÝŸ·êêý5|Sšµ½/g¾ˆkζ9yEµ¡bùŠyÔ=q­¸7ï@_t97Ö ?SíUO媺^²Ä£(ï<§zà(8….ljå†'Òž‚OûÉ7Íg´Â¹,e¶u¤‡Dø›Ér¸Ä© Àt9ç³™‚òNCJÀvâ©ÿ¤D|Eb³B´(Hiñ0]xÆêRws¤Û€{½® Ôø_—Œ;žHÍØ§úçïÕ3}ˆèÓ$åÿŠ¡gC»ÒDŒ î<uÄ›%«Î¼›aúÁ}U¡"%w ájتP›@7.ʲÅõ…†$¡G SÄ#ö#4‚í”ä¿Þ¡b/¸}3mÜ4Håù棆IíÐÔПü‘ÚËiFK48™b[•êŽÁãE ¿T3&B"þ[ Ÿ‡% ÐÊËÛrÁ4avSk[dE¨Ð[¸Âò÷,eÖ«ùq“ÍL7u ²$½CßY¾PŽŽ¬Õv³ûj¶À¹"PÑøð’1ÝQº¸·LÄê§kNÏâLgWZöÀr?µ¥†RåIÉdCŽ4ƒœfÁc”gçÙvs²…)qØS`^F\·mífúbÇ©GÖ¿?熉”Cõ°<ñ'’û‚t¿ ²G¬Ø»)ë\ endstream endobj 4053 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6851 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò "U¤JDàPšHï½WB ”$$¡…"HoJïMºÒ{¥ ˆR•R¤¨(½|±œ{ï¹ÿ¿Ö÷­¬•ì=óÌÌ~ö<ó®7¼×ŒL…•a(;¸ ‰‹€d€ªúúÚ`ļ¼fœ üo;€×ŽÁ"PH™ÿ@¨bàÁ¦Á€ú($PÇÝ‚¥dÀ7e@  tëo #Tƒx `@}  ÇxUQho ÂÁG¨ó÷È‚oݺyãW8PÙŽA@!H >çw%T„B\€¦((ŽóþG ~9G-#*êéé)qÅŠ 0 7€žœ#ÐŽ…c<à0àOÊ@ˆ+ü5/ÐÌýí0EÙãÂìA ,¡g¿],aq¿Úûs'ŒÚ?Ï¡Ž„¢`?gRLR Á` Þ‚$;I ˜0¼0¸×/ÍEE(!Hàì´Ga?-) Eºƒ‚ý´þ‘êŽÁŠÿ¡ðßû_Ç{Á¡€É T6Ø©&¸õ°J™ÝSxeHŽl+õð¶˜ðPÁ}J\·úˆÍb¼iVæ”î3É.°Æ}§v·Ãì¹÷;>˵\uÞûÂ\k\v±çûÆ|8¸'h›ˆžX&«\•)ÆtqFÑuP)ºMyi}ÿªéüàÉÇT¢qS'¤Õ ­£ª$S™ã–Åç&¸f»>³É]–¿r>º>Zо‘bέ+×vˆ÷¬¤[èíïâ|¨ãñpåO(Ž^]¶CM‚¢Òb&ïÒœbÍt;MF¥MXwé¼@òaÁ¶ãòö¦õ5þÄŽ›Ž¶‰öÑàÏø#Nzô “J*&756ÆEÒØ«p€µèLCh½š+ÿÈ鬢ë=5Ö9¼ðÃ]7EÛêmO0ÿ ýxù³²åÏ~õ¼/b<ìC‰[þªJ¦_VbÎØð³ÊëáqÉšÙç³³’Nul5S(š¹Üp›^\œÆ‘Za~I´þS/Eá}¼ÄYÞN[› ß”[e2†!¿P;ã›^ðäx ,úºšV­Š÷t]Ü÷­ôZ´ÖëuEú•ã[]%¿,¼§’re?Ýh Žai‰à.Ÿ^ê ß»ZF #*1È-=Þ d~Óƒj%x”FoâO7‰Ótžì™ÑeY‹‘v©Þ¼njb…ÉçßZR t$\•Aƒ§&â Í‚L}>mByÌ-Ë ·èCî+oõ— •hý„§ùÑöåbk‰| ¥È­§Ÿ27wÅØÙv2å/qYµÙpÛ£l.Sá°(˜?îy8@ѰmÉÍõ…•x¹!+ãÕd{uWk'œXÀ»ÛnöŒ6x^>ª¥°§æ·÷r:+®ûNÒ¥Ö/uÕ`§»A%—ÈÛÁvmÍ™:Ï ¾¶mŽ1Åv^zÞ Ú‚Zñœ¿ÕÜ&ºé}è`Lud5m Éã#{àÇ€>Ù°Ÿ¸„œLغÙ]$ðë;kH“…vN›¸Re­ 1Þ79.É!ÒxkPàQoZ†J¨é£y¬øÛÇsoܶ‹Oÿ†h¦„P„Hب/m0’1Ìœô ƒ·„†§èG/Ð~¶¬¯ëG£2ÕN2K#HÚ¼úíßkÕ[qY›©ï¿tJ7é‹ô:¡^^fÞ¦§ÒͺH/ãoÏÄ£kvs2²´®YÌ®5ÈÂ$òòÍ i'%en,{0]‡ê>œ™¿½Lq;º’Oã ¼R`<:ïÙ­q뱓ZÇh7éÒñ…(ÂßÄɇoØ77È}sÒýñh”ǹÉeŽ×fוǚ.íÖ’pWPîÊgˆÞÀ¶™£T³·F`ŸwŒlLÈ܈GãÙS>vf/[íÉC?~É-÷‰ÐÙä ïèôßκµÔ_´p|ðµ~^A1qj¹Î,÷C꫉gúè¢ ìj¼y ºMѲÆÉñ’…ÙûäKÓ%¿àÜ0ÜêÔí¼ î›Ûn¸àûc¿†ÕáDªPiRS“ÑÛIÞWä2±ubNI†÷[ƒZèx;.>6Ïj YðQ‹Í-«|ªêŠš_ ñ–ù=AO_}òqd–Pˆdˆ¤¸ï©VôM n¼ »ÔE²AÀî ß_Pj¯W¤D_DˆËrÔªt7+sÂON®öîî]$æ.×…®¯Ú» ?^ÿ0C Ër06½8ö.˜¼Žf$çI3â€ÔdI‹Ý—aÉjdï“»£9ì><‡Zh³V‘HñÛ`ô¹#p!°€€ Ùg›¡bÖPdq_bç\~‹ó &í¹‡÷t¥ã}Á—Zº“Õ¾÷v?܉ðd¬gÓßÌ¿!Xßé!é'ò¬ðVÑ•ªn)Hký%øõt¿X©§b~ºA ¯6UÌCÏ£)¦E‹¥:ü"@ÛÎ*ñá=g._<ãçnoÈ}ÔºSÕCêåÁð‚Ñ/`YC˜'ƒ;ÃŽé=ÞYÍØÄ'[Û{iÝ© ©+Ë™zÙ€u_¢|”\â(mw¾væÜIY0ÃÖa$ÌøYu Ñ'ÙÀ*cs®`U´ÝÚ%ÙÃNU¢[ðu> +þ(@ޣأ"Å!– Qä—Ô֛݊ ú{CJ˹wÄK%9%îG Ùƒ¸gÑø ¾Jɽ‹¯GJŽêÇ?PV Ïëݱ¸ûÌî³Äíl«Aû ³‚ú˜sM@͵ÛÝz±m ‡OzãÌSªö3–€úa.ÇfZ}È‘3ïŒ.¸yOÏùlˆ2éLf$*DœkÈך Xi¶¼ÊŽoœ5¨àKbKÔ7+Õ‡ŠˆÞ"–íÖ¾°ñVŸÈSÔ`þAT—˜Äå½½”—ÛB.'•7 ÆÓ¯ú¡––h­ ïñ´]’sBå;ÕÞ(¯w N_S¼òkL_¤’Üó®@^QlɶX{¨ÓÀzõˆ\ˆ«Ý’kÅŒŸ´O­`Hyo¯-8keÏ*O¬ÏÀ,>*ÀÛúýi]‚Û³ŠC~²ö{Âw¯E³^ÍÞÔéh p`Œ÷cë9%÷ó˜±Øéù‰* I:3|f97öÌ3<»É,ù#ü:»LÒûyæ6ÌzFŠqõ½ýW T+VMõ÷Ç[ã4S I—è{Þ„¯\\ù..øÞéºeg–Ú†ôZÏö¨ïvöµFÈùþÁȦ3¶õ)½Y›˜q²Ž6OCKrç>þ,Ì®&nkŒù:V,ñþöt$·n$—JÕ~¼b>Îõ÷R?ß|ÊazƒLüX1ˆ’zgBy¬{ÞÛ…ÿá’Þ…æ·¸ç¹\$[æ± _?¯Qu°–º*2ŸÄš1ÝŠVo&.´4tžJžxM[¥µŽ^e¹Ñ"¿ÊMy_púŠNtdôj°º“™O8b<dVd¡w:"ém©ë‹ÙYJùæ;Õ€£(pR­‡XÈWà'ŧ:Ì&tü[W­jÚêÏÆÅmO=rÏÐHLùE} Ëgû"ŸïãÖÒR׫ÊkÄðYãßã‚ ‰Âr¦R8p½K׬ís»ôÕH¢œ"íMæaN¬»i;c6p:õK¦8šBs¨äç7ª‹JQQÝ’t½^zjoÚ•S#œvq¾3¡êE}É´ïñZSãO~8ˆÌ­™šÈœFÌÄ<{;ü4KÓ9ÙôñX3GYEruGÝê©0IÙiãç½KkA%øÉ+1d´ #<…*ϨõˆE#c?É4©0ï'æÞóh²g Ý¥@ÖXÛ@@ün’ozK5³DÎ|1ÿú7•šSazçÖçÍÙ=ÉÎ…‹»'Ïu¯V¸FÍ*ÍÙ(ÿµú¾ãnËhå 8•똚IyLG Úà[Å·jòÛ3 Ê§Ò®ÊøÉ½O™¤°6Yîå4òáø’6ô|ë~Êå&VUÍ¢K ïrªuÍûÊu)¾JÑu(ÏŒõÚÚ.·9ɈR_!º[û8àü̼ˆWðXŠýÞ‡•ÕÅ„©8¹þ£h4‰Sy@GϺg'.DQ2‡¨(Ðy6–Ýøc øÂ¼°{àvíNK–Sˆ_àÞ+œ–êÅVÿÑÕ4Q€Úâ ðy?•Þµt1¤LîI%{ÛÆÛSßW">)Ъ0—CУüpþb橪”©B_ßp4qLÞm:Cóù¾ÓAŠiëxÔŸÅkhŸ Ì_™+'+ÃÍ›¬ 2\x@¼^Î×NUÓdn­²~îçì¯7¬ôéKÙ+šMù®û¥Ž6œ+3šTÒv£q‡JØûW½4ÏEâB)i7Y BÓïF}uª\Ò`2›i}Gsƒ²Äf2]uŒµO¬Ë/øpÏ5ê FU ­>  \' x©¾f·uCµÂm§“/ôô6ã¦v~FÏX*)æÅ½é†W_Ÿ<1£l=â[0°+hÅÏoÇ**3íÇU‡.“W?h¶$ÛG‡Ží8“ç õ)çrÑñOZë/³¾§§¥¢cÚŸ‰½X>»”ùqJ)äZrƒÿ²ÕèuiÙ‹žl×ï`I9sîoTÉ;¨~Ë‹« œU½©éð¨9õè5» 푊ü-ž=Šï½›,<‚Rq{Ç}ŽÚ½kAT\ð2ÙµK#–Ý"%0ÿÍ3zêâQÁœx¹¡0Æ QiñÌíbÜ`Seib9Ýú“CÁOoëù‰{™3X17ׯgŠÙ" uŽ÷e}ööÌš%Ò…vä¼z\l·5F·@Þæ¼¹Ð[ðz©í¨.ßT^hošÅwøÑ´|Õ~xò%Cl–µâ:MaiÚÙF·UU `<ê~êÝlnè¼@Kx#©ï`/}ØìÛzÛh,×âE7ÿ:~nxÃÕÇãÅ£Nœ`Îà÷t(‘ZZõ [<µ,ÎylN8#kC‚“·¸¸L£äh+õâáì—¶ $ʆ9ü¡Ø×öÕ¼ü3'è!µi-n1>²Tat$µî–U„ÝÒ®ø5ywõãõÄJþM59ÙZ§ª®þÆãùIí•#1,g^Ãü‰rC¨fÂÓÞHhØØ–÷‘ÐÙ¥›ãªî«ªä.F­U1ÉÏbb‡m“·™2]ÜÊùŬgÛÓ àìYºk‰ ZÎÏŠÅ#hpòÁwêû1©Û—˜.ÓÛù›žsÉëΞ+ª­ê²gdðÕ íDäcîñˆQñX½õš@‹·m~¼cþ¤Ì-ˆ¬^Ø6|z L]ž`.ÝÓÛŠDc/rѨî»8Û)!…veM⢑ÙñbÞoC+™ƒ'ü®>_Ó]ÿ kat½Tšm1:; ­.ÓæÙŸ•=̬e NÈé,ë”×Þ[(Öéµýö:ñ¶€‰×Ö\üz,I—•ä°È”cÉuÊ5-ÖœIP1´Þÿe3³NáťЦ­ÀB7Ræž>GoÝÙº3 Y¹;ç9ïB~øwún—6ÎSÑ3bÚO‹¸*·”»ì6Z{óëN–]Êx]ð» tˆ?öS‚š‘ª„î½†ÙíUEõëßM#IÜ‹Î×gsvã•Ls}u¨Îwµî‘²“3ùÝHñ0WT“HÞ².È8-øšôü[|ÙǹuÍw½ô/ȈÓÍxÖ´õ÷½£ˆÒ¥™%Dõ9}«Û¯çÈÛJ±õ“Åáh‡¤û¯"òÖÈå쎒2sš/–rXÂ…®ÊÊÓdjN?x€—¦»iŠAó…ÖðD8ï-¿QZ¢¬/J‚è„¿J¾Ât½¿î{’ºkWùñjõEœ^˜ôp5(¥?Ü÷íèF›áUy·w+tI8ªdÃâ|y¯šÂ–n²¨)šE6«Ýòç t§B)•#†·VB•ýYžÜ£^ô¾O{CÞË&úe©9ÙóÇóO¤ )ÜT¦–¤Cƒ?­¨‘=!Šã°z´ë­–8ÙNájYds=Þ. ržìë)@¯m»@[Þ‰€@|!=ØÂ":Yfhnñ>e%¾Uo¥_˜?Ž>%'!îHF‰î?Æ ³Q{Q'íì 2 ÞlØÒzksh,·ËöÀ4™]¨v—LÝÆ'k=ª‚9[¢o®¸y›ŒÈõ^]ô¢–ßÎô'ý¡ù–ɯêNóW<4ml·ò­°‚ø»«ÅÄ<™^zò’¥CÔÓ g˜!yÑjÚv>°†™Ÿºõ÷Vñ'óŦ¼|úMÞ1ùwT ©ìŽ–šŠb„¨”=/ëæ^9Êã2©òÕ¥–9],1aräg‡úý6lÖfáiþ¥zTrž({œBÞe,&>xIê+\Õ£# Þ­3#¥ÏùŠ÷'β}C¾‰Ro0Ðìf©´ÿƒ°Øë©# =í.I¯¤¹.7pÕt¿hrÔ9i,z™Ë‘Çïsn·"È,ï‹‹f¿I1tƒ\·ªêÞ`å,Z<‰ÊzÁ#‰O¸¹k°m§—tN×Ñ?À£$ƒú gJkae$têNúù:™~ ï).8| ×,¢ª›_š2µU½Hôð¦Ü,½€¹XήÆÕ4ÎTáÌ, mC9F¾IˆzñxÅ{}¢ÿþèðvknÙ€ƒ´®&“ÍWPíµÀ Ô.¾È2èÛàB¦—ܲUh›4E·¶µýÇ„©ç§§X·0³²6LJR˜©m½>Ë;‘]­iqÀ%‡gõz0…èˆ0b]Š ¥ññ{_M d¤Ÿä3ÿå@º^4Oi®8'°í½í)ùF”{`Ñ×9­„ÎÊ#Ê2§SÚ¦IÝ´pµwïe6HuÝ=l¶ÎÛµ½rAØ$—_¡Ppè˜j¤äsŸ˜d¸cëÚV‹¯¶ˆ¤ûK[c£üƒ‰‡¶ßŸ¦÷6¬óÿ 8HdIª½_4üI¾ÎI)©)h«øÆDC¿„f¡3àl|ÐaéѺÃ~jžIrFÔ&Ù¦…•4Ç}ÑíÚd°Òx7¹QÕ©t4ðt*ýÅÞ/µ~Írs0{¬~¹¡G»yKêðÆ‰¶ÙKž°˜³!ïŒÉ°¯ ´’шæÕs ¨c¶5‹ ßôüÎY™æWt†ë<×û")¯©É”EÑ…ð S0AX–2ô½Nûz¹môRŽ9^ÁeÂ&@[bÖ7½ø?·H ©+Œ¤[9DH=$9³±vr{j­õŒCA[‚‡ º_’Þ 5*)ÀE„§PÏF¯©²V°Ò’&?é pé§Ûê¾çÏj"t™Ç£•¬V˜6å:Oyæx´‘»á ¿øI͉YÜܯÀçV8MZòuó…uœ¯Žýp©ˆê?älŸ}Wv¥k¨p³×%ÑÂK|Ï,ëÙÅ}^=;<¹)~´N%;núé|áék$¢?~uY• RžÁ÷Qÿ~¤&̃ÂÀÇg“wJØ*z)[8U(§™A¥Ä1•®÷¨rÈ_-œcý' œ“¼MáÞPŸ“9¢D,1ŠÚc/ë*Ù`XÌ£¦ 3O{Åõø,x©ÎÈ·<¹Bÿa´ E‹.ì‡WùîÓ6eÉH80öRm×»ç[±}4{y—As8hÕà>©DS*⦑¾ƒ ‡×pöp,2]ÏcãSºYóá²÷øÛâIýZz}­±ŒÒ {ù|ëØ»÷|Ö{™Ük¥(HòY;ÈüBsi&S¼6§¿ÚüCâM– endstream endobj 4055 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xÚuT“kÓ-("DAŠJ‡Ð”¡7iR¤wAš„$$AH ¤7Þ{•"M8€4AŠ(H‘^Dzïˆáå|ç?ß½kÝ»²VòÎÌž™g?³ç '«ž!¿"mSE£pü !ià}mmu0PHHD@HHÀÉi„ÄÙÃþö8Â0X$%ý¿÷100ïSãð@m4 ¨ál‰AâÒ i!! °Ôß@4F¨ vABÚ@ 4 †pÞG;ºcpßçïG „’’’àû•Tt€a0 ¨ Æ!`øŽ°=Ð AÂpîÿ*Á%‹Àá¥]]]ÀX4.ÇÍtEâ@†qA?)uÀ°?Ôœ@#û;`ˆ¶Å¹‚10 Þa„ÀPX|Š3 Ãñ݆êZ@]Gê7Xë7€øçr€ ÐÊýÉþY‰ú• †@ÐŽ`”;Ú"ía@]U-œŽFAÁöX4>ìFÚƒmð€_GUõ`<Ã?ü° Ò‡À"írüYÍ*(è}´ƒ …Ã~žO‰Að÷î.øg¸OPhW”çß–-µýIêì(hŒB:9ÃÔ•ÿ`ð.À?>8 ’”‘œ€07Bðg#wGد è§ÏÁÛÓí´ÅÓ€y#maø€'ìâ0Î0oÏÿø·€P$´Á‘(À?Õñn˜ío? Ò h.„—(ôóóŸ'K¼Â h”½û?ð_#TÓSÔ12åýCù?A%%´Г_ä‚„„Åøï×ùÏ üÍþ—WŒüs:¡*ª£lÑø:¿Yà¯ïo&.¤Áõgo¸ÿn¡ƒÆ äúGÿBbBüèÿ{ ~¥üßÄÿ³ÊÿSÿÿ}"Ug{û_q®ß€ÿ#v@Ú»ÿAàíŒÃ/‡6¿"¨ÿ†šÀ~o´6 Štvøï¨:Œ_E/t~¨€èo?«ŠtƒAõ8â·˜þž¾‡=ÓCc‘?_<ø,!¡ÿŠáwòÿrÁâgö;Æâ÷k¼?m~Õþ} ý¹“Âbâ@0và%·Ä€ž üòBan¿4@¡qø ž³7Ðü´˜$PÐ?4ô§ð¯Úg ßü—(ðÿ¶-? æƒÆGЙ@»ªÀÆïŠ ®ü‹}²W¶“¾› ó÷åY‘à:T1LO›Ð,VRµ²kÑQrúž13ºï¹PÍòÚ]ô?‹ê œÅæÅÈÅ7ÂϱžGŒl#7ê²M”˜¥ 1zLá­¤òPx‡!ç ¯»Uíc±®wn©Jh5ê4·V¥iÝf”z¸1g€«·é6Z; ½›9ç0ÿÜ",Q'…MS¶ùãZN1ÛÕÓ=EùŽém¸Ÿ†‹ÿâG0ŽRE¦›QYôjùéò³ÌB—õ*O5êû· µ³Y hÝ÷sâê·i-ÎØ¯šÚ¥…!bë´7šrR–óhßÄc±¶ÉÄÌÏl!ðgžPÙiUßæúÑžAš£ñ+³= ö×Zûßp¥±{!J‹ö|ž~P4 ·Kz1ã0É‚Pg¿£âq…];ªW%ʺetäí%5I#Çce8ZÿªhgXY46Uoë·<>[TW_€©ìŸt%àÆ‹ NϤûJ$Þ`¥â®ÆÅÇÑÌmEy ZÕÊÇF!H3Ò®‘ `éB¿/­íI8¹à(®+¹/YX6©Yì'³]¸u-¨Ê£—ø´¹¿½7Ò|ý{²d•Ñ¡b¨¨mù’u}F^ï ]mæÞ¤f¸ù=ŽQR­†‚;k§ÃðäáÅÀÀ;â·îÈíל(s¥zÇH2=‚®tóe›œÅ+asþb›hGKU¨>üXÏz|«ß´Ös‰Õ îUær0òôot‰¡,ûXÙ‘¥HºT3™îJp)¥+3YÐæu„-Ì–Ñü!^båJO"¥Rƒ©Ü0^ï'÷‰(¿Ôd¸‘X ©"Øúåæê6•z¢LÔhf,A6×òüÐKüÕ¢Ê1¨s¾Ë’iœåîÉ7}gä+<†™ 8(ÛdMïǬMìõò0:&Íjà„92º%õbŽþ<®ð¶.¶ô`ª¢ îsúó¢‰Ðä ¢â«Ff/÷cæWæ2O›ÏâïL ¡µr.Ã% %÷èÆt¤Û7Ùwd¾œÝ ½:6JÖú>×–I.E¬éà×Kêª6O·aô™¤¡(…iGeK˜¡‡¾ŒwJ-cThvk0íz 3a‘(.÷zY™ÔÛbyßIuE´ôþ#ÊK—-ìšÃ§‡+=©UÊ×'Øeœô¬’0“íæ¦LI5޵øMä?Ù}óh‡ªŒ÷2 qµñŽËvzjªÊKŠ X‰€òpŠ+NÖ?kEsr—™© Ò¤Î>«¸ûnÝîZ=©÷I –>ÕamÒ÷t˜kÃ&*™ `ªcDü+Yâ׆ÐÔr$qãðO´ð'‚OHtšÅè™/õš8&áK¯ú. ¸^ðŠÛÔm·1vTìúô¾Ïè5/åÏYkyÑ_ØôI“µ¢ ZÞ–døÅ¤¯úÌéB1¸ªO$$–šFy“ä²pq¦ü|GÏoWÌ‘ XZfæ}Xs¿¹öÝ`g\Æ©ö¹~„㙄ËÉðÚ󦦚s=O÷*µºšÛjin½øXl²ïæÆîå;DÕa×<&srëR×£D!uÆy©ûíNt×ÁdºAZÛ†Ž¹‚t¶ð² -½Ï ›—ÄJà²æ-ËÄž)FDÿ…–œÒE§Ò©²8<}ÊôÉ›”UD>OƒR7Ônlx*:ë]ºL¦j®˜Š&ɇàq_Upqì ÷‹Ô­›KGO-©kä®èî,Œ©Š®•pÖïÿBt¥ _PrdQ[dØŽèj†€'”¬½—€ûÿØí|¼±TëBz°Pm´‹H…£².j6rú˜8§Ÿè ùƒžP€Ä÷>[«¬ìOÊ¥•·N¸¿‘¸n„¹|CäÆ-ë ‹Úü¨‘žÎʃ ò ïK=ðNsW¾³IŸ{¦ŽææûZ¡>ŸáyBúHAXŽ¥ÔOÙ5$õšåCåiô!ä‘äã{Ñêwy¦gà1ߦÍê-ê?âVß3ªv²vôÌ'ÑÐMŽ‹kHù TйÇ;бûMjàä=†Ý{'ås`™{kç#µRls߯‡°W™s7ð`1m“øBËpXäÁ'z{±4 ÓDt»BÚî¥^Œ›Yz”㧘c¥¹¿*ZZHïc :½¿˜­†Ah ³Ã(fŒ“vOGnP%¿$Vµÿ*xàpý¦™Ø$IM g{_Aì-ÙƒÙu;µ„ -M­ªc—ƒÉGÞ«}ËTOUèzG=&Ý÷Ï Ùw¾0äße4Êò¥C\J9.t ØvZŠØ´f©Ph7N:] ¢h æŠ1 07sÊ÷š×’.芩/K¯»ëYh§®ù놮[ Y(\ü^ª3)ñrîɸ¾B眂‘&C…}rÃRЇ‘—ñg î‡èj8¡ôN™Ê6Bh¤bV}ãÙ&ߺÄ{ÖÜÇ Ü¯„Æí'\ØŒ…#¯­IÌžÛPJ?Ýçæ×†¶aN–_Þ ÷.XÝÕ.æ)S»ÓhñÞ~†ÚËç!Ë´øBŠËÞbÕŒ=¤ L_ÎË䋿l.ÞA¾Ö`äŽúqΗ­ kRP6t–è6ûTü| “õ–%.Œy»¡}D_¡²1”¿ÒÂÚž0Wz)hžÃ¦àÛkÀ³¡žù[}é ú&ÁyA2Eº®J±¨¢ÀöŒriQU«v•GcÔŸ±ƒH :«…Èaã×Ô:uFñ­°—;ë Ïgxqeùöx ÄD´†P¾NŸnZeÇÇË„œ ‚ÞÇ‘¨æ<9²‹^´Ú¡Ð¡Ù[–0Ûž¸Î#Fâ„Ó¯pˆêA¶*NÕÝæÒˆo#Î"4xP€+kІ–ñˆÀ¦Á‘Ç%³i…k±‘b®ÇTñ÷=Þ”ú,I³8«N •샷0ýÝf录:-ÈBQ½Ÿ‰ãïb «ņÑ!¿“Œ”ê:¹$ÒM,n¹ Ò:DÃSYgëþù¥R~^`‰âê¢ä Es¶¸]\ —nþn"1o¾ÿÐ-"‰"÷¡ÜÈŸ—(±÷ x³s•ø˜‹)øõ1%úÒÕ=Ï¿(¾á  bþÅË/:ö=µa [¢FìÑCo#I#͹hÚ ìW½¨êk·n!ÜXÏÊž¹=•ÿÁ¦§vS7@ÅËÝã…f¿RÆi‘þ&Gb¤áجgÁÆ^‡TðÊâÙ°B9qõº¬#î‹U=»“ÉŒõmbƒ0¥zn%ö1Ɖþ·äè‘Ð{V?¾0¥ï‚AdÛ7 Ô–üÓ’J)ôïn‘O?Ó DB±êµIäp›Wô/{Ül)åvp‚ôßÄeÂÞ„e;ó÷r]°¿Pø|›>8#4(ã­võ#†ÎÜÁ®x@ ÓåáNõ7K‡{†åÌëqæ>\’óOî$5(ó#mÒüÎH9ëLt’ÓêÇË(Î’–ŠˆÐsŠh2Føš$d®”VÙ•øxãÊð}I‹„ c ZabyM›W…pº¬ªÓ³!˜ˆô[d`‘¸ÞIJøºUÙΪºoá2aÑÆÇÊ©Ûû«^$Ç `ìÍ¢kƒO±meâ›LºѶ¶›öû- 1ÍêÚ™n‘í¹¦b²ÖþM@nõK¹6Ù+!nëã&ü£!ë윥š«etå%¤…W‘w]¶ º•<=ßê9~%ÕVzÒNvbܼ+»ã’ómû²ûÉîydƆÇÈË«wø™y“&9o|VGrgmN²å°Ñ&ƒ¥!³ìZ±&Á$Ìþû‘ê{‚凮Û)oîXMˆ§žtÒx‡†KécdÇ-ÔTž‡˜®w<º´×øtM%ývš©W§²,¸l½bô AïªÁÌRC8³(µN›WÃæ CÓºDÿ,|XÎa¸`k|¥¿øõŽ@2ùp3Aʘoè›go›®GÒû——Z«ÔöJó9‡›ø™eDõ׌û¯K6ÎSñëYiï¯Â.ÞV–ù:´—‚ ®t.^Æ üà?bdgµmÚ'¦ˆ˜%ø6Z´Ùxyr»X`þéIˆõ ¿=ås:.K;¢i§|Êö ú ”Ÿ ­Âû Kò¶­1CËQ»ñ”œ¼TéYå³7SbBÆUBaz’;ES˜M ¬‰÷W®IftUó& OÌÖv¯Mò™Öh/\/«ofñ¥/ðæáµ)Où } «bßtù\zA/¶ëù†JÖ`ÜĪa¡‰8öè À•™Ðûö˜1ðy[-,UL%:Tñƒµ^Ê¿é“ Â“à„JÇQî¤%®¹§LîlC‹ùcôi;^Øæ¶Üüb>“×Í &qWÌ"þRC‰°ç@SzÖ¶Gæ.èYU„O˜Zð*ÝÍB¹v²y+ÈòûŽÓ"}øÖŠ_¹¿VLØé‚r+N©å¶fC6†š¼·–LZ´ù'[4VS<Ë-?æ»fæ Èú–$Ω@.SŽWœ (-oˆ‰Ä$X],½ePÍ^˜lÄ›¯¨ú±‡*æ¯*]Ás7&žæaÚm°¿Qä³ò"üL|Ãþ ~‘ª ~i²s¢Ö^×­¬ðœÎ䂤PÞœiï>Ú‘¿7cÑNY’þÒÅûè~á×F†ÒIâZÐYÕ˜ó¨' Ÿf²5Øi·v,ž/zÍ÷ñÖ¼/˾W›>+€¶…$¬¨hgð¥äÑ0ÓrûmJA=\çD'.“À³gÇ€ R¶<Ý?.ÞRW¸èÔ|oë–°5 „Kž—J8ç$8\>ë )]•”©ù’ïd6' ½¢|} FâU³»"ÓA¿µš®¦MÐÖ·Iªýê¡T(&*KÝöÂÊ%fôÉ\ËO¦«ç›d´‘m y ¿@ô’ ÿGðX«¾ô›Dð! û®½ƒàÁµ·Q­÷cÉ>IEËW‹PóÁ¢“LâsŸ®•k®cì-Ò¾äêˆ7×Y[+n>îºuyí™6n '”ö S‘ùuƒÄ,gþ©I§].#u/}eí¾ý•Òí©_¨¡ÿ.èÒd­@$šÑÑäô·Áô¡Z¯?÷ü¤•l8ù’Ãïý¨ÕÅ”È<,%¿Tw[+¼ª²ùÛÌÿÝq endstream endobj 4057 0 obj << /Length1 1412 /Length2 5891 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xÚTTTk»¦S@eHA†’î ‘†a€!f`f(iéV:D)é”n$•î$¥T:îçœ{þ{׺wÍZ{öÛßó½Ï³Ù™uôxd­à–%8 ÅÃÏ ÈkjªŠ€@A^ P€„]Šr€üq“°BH(&þßä ãS¡0yšp@ÍÅÀ/à Î/"€@±¿áq€ÈjÐä¨Áa$ »<Üɵ±EaÆüõ àsøÅÄDîÿ*È:BP0Сl!Ž˜‰`@†BPÿjÁ)a‹B9‰óñ¹¹¹ñ‚‘¼p„×}€e xAB®+ÀOÀ-#ä72^v€¾-ùÛ¯·F¹ÆáC`HL… Ì ‚`†ôT5ÚNØïdß ÷îÀÏËÿw»?Õ?Aa¿ŠA`0ÜÑ ó€ÂlÖP@[Iƒ厺Á¬~&‚pL=ÈuYb~P’Õ€0ÿÀC‚P'’ uø ‘ïgÌ-+¬äᎎ Iòó| PŒ¹v¾ß›µ‡ÁÝ`ž k(ÌÊú'+'>ÔÙ¢ªð'ã"ùÇgA„¢"‚¢Bˆ3â¶åûÙ^ßà ò+ÈÿÓAàíéwXc@@¼¡Ö̉'ä  .oÏÿø·EÂϰ‚‚QKˆ FòOwŒbýÛÆ,u˜1Üãþþ~3ÃÐË sðø'ý×~ùttU5ôU¸#þ;&'wxòˆx„~ ˆ0@óâýï6_À_àyu@Ð?‡þÓQf Çôù s{qýà Î?šáü{„Cf€óî›…`̃ÿÿ­€_%ÿñvù¿¸ÿŸRrqpøæüÿa#ÔÁãO†Ë.(Œ.4áuÀþ3õ1ä·–5!VPÇÿŒª¢@}ÈÂl0çáâþ¹](R ê±Ò¢À¶¿™ô×.03 0ˆ ýùÉÁTÿÃÈlù¬ 1û!1DýZîO‚QÙ¿Ï¡í~ÊQ@ø„@€º«ÐÄêføy?”d‘“R»Æ26Âm »%–6ápZm8[-VÀæÕ7 Å/˜›QaRz#És€èxM  [ãdÏ·;öZ±38ézi4EÌä#¡i†œOLÈdxIÎySI¥ã’ô^ísÙØT‰“p÷Ht|„QÕŒG~ˆz ΰW‹²E 2ëí»Tï=(îžTk‘I˰k×¥'§Ó0Ì÷›ñ5Mûbõrø¨Þ´V*á{2ª“2"Æå@°›º¦)½NïyÒwwž÷yþfD xÜËIåK /¿ßN£veÞô€lyF¨˜ôÛjù²±è’%ÇŒ²9ÙEÆe¯MtÞÿ1 ³£^PFF}êáD×ðØŠÓ >©8a1wý²“8’wã´îzãVïMê/W)} ›n‡@Η/z¢úu¬Nm?q³,c‡Ü`Ö ]„ÅÏÕ–W•Ðë/;HL”4»_5X¶âÊÔxE À)ñU7¥¹/žy;{µ°S¹øe'[Oÿ,½¾ÒX°â3·6»ôA“‚ÉÓõyÇAù›”ò½¼«Û#gJC¨…&ŸnB÷ŠØ,Ó\óúµUŸ$ˆÛÄKÑî¶êN¥Ö|ði½¸«Së -Zc0bÍþl-ÀÔ]ü>E ‹±hÿ¹Á=“¥ú×QŸ™.åóT …]Úìß"ë<É.Yv“»¯?;Ψy“7™ÜNƒ©¦S·eíöœtÎÅ¡d e)å°ÕÕäñûj$tunâxÎ 0³L[]'Ës HÊ¡ƒ ke oÕÝj·Ø^ã=¶Â¹©OFò¨Õ>7wçÒiåØ1Fin½‘‚­/2ôV‚#"î1s-r4°ä îlAý ;F7œRãx:;¹€D¶ªø|{qæåU£/H/¼Ešva·Ö°c±g“îˆë·÷»Y°®ÇÆoº¸4r$‘K€béxÇÂ.Ü˽·£«[Íç£öÎÒõÇ~|\ð ¡ÇWüÀ©ØYx5ïøÒà´‰{=(-¦¹•]Ø#Èá’ˆµªË„yº¥F¥¤3¢ß°é˹X¾—ÁœÍ'³ªÙ×n¦ÕÅ˰Dž޲’"1çF[ɧ z¬“G9(e˜1ˆš¡ -ËŸ/'3c‹ÞTúØ- P¶~„è+ŒæEó|š%¡3f·¨—nËÒ³¡f‰<ѳué²»c·c3;§Øo?/•‘å"ã"‹m^ô ¾‚ÃÓ¢ÞuYõ6VÂW Ô¡ª—0¨ og"ê½Ñàk‘"ï@óµˆÅåË"{‡tLR!˜c¼áiOç}Ž·1ØÐmå#Jšý'2œB’_ŽÌ®Iá{ðÆJ(×4`ëBW>õÝ«TG¢g¼’æd§ÞÓÞÙꪗï22™¹Z•ý{¬Œ[ïÈ~ÇÏaùrñYÐPªµ{âg¼°OÓ ®œ%5d¶eìs6ˆ¤ÐI*À 5L7{K°ë[²Z¾f·åŸ-s=±MS]ú¡RÒü¥PbcÍH§ßÍá}ìRZ$gŽNåè¸Ö¶Ÿ+w<»M¶ÔÂ9¬³p~9A%Ì3s`Cs_PÌO>¤T=}=p\¦x¨­!¶þB>ðaÁ5Âl[ÏÌc¿Únk\š¾<âÓçVø‚ÒWØÛ‹›R¾[ò°™÷4¨wÝÌm<2¾Š‰zç¬ó.g¾8òÅÕå ¢äeØã ÙwÎ$®‘¦"žÂ ðß°Ig5Y¦Zoسf_QŽ_ÄÆMÈâ‡PÔ»jáߤçXÁsæõMšVÈCOË©Û|â)À)KHG·¶[:ØËòd1Xp€L8ŽD(,$!|$cð›Ðg^ðýóQì7·)6<æ@´Îçk¶éïPæËÔº~ËÖ½mñúôðòÅøóg–ß\àÉÀÁ£bqÞö¨‡ù⪹@?ºM/…@¥iK /ï÷1ó&r>¼W›P#\©|{)RɶÒGÂ×”¸«,ôÖØ·É/3hrÞf¥¼‚b¤à­nÖ3!a¥IÖýÚy#÷·æRÆç—F•c{|lÉ´r<¤xtmhvfÚ]wˆýƒ]Bîïâ8uáÅ®´"Ç„— ¡º*Ú`»Ø•ïÇ %?óH‚Žd>ÜsÇ @€º+’ÄS™(iõýÙ¶4Ͼ>õáHkôÒ9Lªî?>Æ“bÄ£>æ'v@î9lšõ8]û.ƒ^{$ÎmÎÝ~+&“P|É¥.Yp9º^LÜÇa¡c6-!O«°±)PÖhnÍRµ·„E”äÞz-9‹šÇ·,í#5'»Ä·bî’…²ÐÞfÕÆ¹ä®T}oR÷Œ!yŒK€Øw¡GÔUoØK¢žüŽÄüáŽþ­¨\úFÜQI%¿Ô÷ϳi\où‘ÁëIÇ£—þÔ×®b¹—Z/!5Q5ò.1NâdÆ¡_9¸Úë¦hpO|ýöᇅzæ6¹¯µÄkûlá€d\ùó’&¼‚ÀÄüÏ›5s±át%Iæ…"òf?€T+8ßç€uÄœ†‡æyHÉÃGЭ–yVÆK»v¿sû™º8á]cáÝ×v8†Ýk4[Tøqw]´øý”úöãªÑ¼ &ázÑ8=ª¾+Ÿ=¦_ÙÑ7‘wÙdd«d‡“~gbCò5kiHçr¥Æ‰ËôÓÓ”ÌSž8«GžRƒéw­SÉ+RèÁñ÷몆©¾ÊÄØ]Åáïj-g®=Ì07'†¿=9²}>*³"~ê²ÿ=R-Äy0ZœŸ[%þåW¥~öۜڈ *ÆÝt÷̈ì¥Î“𨬕êl„i ï[¨£ŠYXýƒ$Ä'sN5úe?œßœq¡a,•H¨9TE·êniµèœ`ÁD‡ä&cë ÂÏ} Œý/:ì=OyëLUÇÞTðÞEFãµdQbñ2KîE»*Ò̾{áŠÝ¸jvÍ~¶¿eá/cˆog0¬:œ•bÉyPS“£wÐPС¸¦_FÓ¤úðÔ,è§JÔ´¾>ÉRb|òèúÕÚö‚l/v±ùÔËœ² â2¼!ýÜH»Ä²¨6fÆ„¥B)“†üæGÄ>ø¸ÓfŒÕ‚blê†ß…K/Ï8úù™¹Ç¢´U.Jaȳ¥‚ƒD$oYì'?8¤¬vêkCÒl'&rÜlj·#N}—Ü(üÊ,VÉC®Wj‘<>Ònæ@²sö“É÷˜ªFeëã¯Å‚ g æúú÷ÌÙôøF¤ÄXY¯«Nx¡¸±tÃÇ `Šnޤc[jî©=^Y"ùk™âì³öô«Aä§4óžºò5vé¾AºÝ‡{°9Ç*c*¥;DNÇ≣i»µ~81[M—^Wt\FÌóRCŠr$Jdœ^-ÙßàÐñx Ò·r¿ÄÅJ_Õ`h"÷™ZpÊÝ‘NË0k[ôÙgÜÅ2jyÙ!ëdb‡}?MÒ8–‡çfÅoiä ˜„ypg:ÚŽÛ»ø;_%ýÀól1“ªæÌµ|%‚8ŒÝ¯óä³}ÑÊOqµ\$ËuÛ¦TèÙ?>O©§ÔPtü€" ÿŽÜC{‡h=#1Te.PûeÛs+ž×|ñý¡Ðð²:GPÖø8?·Ðª[iG󙟘yÃH‘¿8Suòq+X­*ßà†ñ!:åå+Ï<Ýkõ[x±Ò¨·ý/‚)Ñb&te{ü%ùT_hyž~ƒsÁš“©ñDFÆAk•C·Ë%»(» 0‹K>¸¸Õ™qîKÌòÙFU÷ËÖG„Ç„Zñú—j™ü§4|+²hu5Õìç=Ò_Ð41–Èj ¨¿z¾„îFߎ|:µ¥Q.ËÒû»õ/:‚¨ŸD;ºêF ÁšWÓ³ƒÍšœìæãx,õ/à…¥LŒX[Êc áh=‘ˆž€ÞcÞ?ñ툈}ØëìÍâId9¤£tytÚ98’}"µï©âñméâ«||™)Ø5Ñ4½pFÍ -x‰lÇ×çãa´B6žâé$4ßÊMǵÎÕd_swJÞ}wúíF~åö¸¸ÀJ†|N/‚¥õÍí,ýϧí'&…ݯAááô½Ê~ÙT ñmãÃbé‰%Â2Û»A®ªË‰$÷àÂßñ •È oö‹)ïTÓ%ц¡é'%|IdÊâY+8ó•—›sÉÉül #sjó(òúw‘,Æ€b”u©‡V4Þ` ßÌ"ñ…£~×Üø‚Áq¯/' â¼Êf7ÏQ®SÀv=ùÖj©|¼EÀ÷6û5ÕDïMç®9ÿéÍ"izû‘,kF€ m¼é÷²uá X%91š¹ìÉ ~Æ15Ð(*hà¥ô½çP‰·èãìº5î8!™c˃Ó;8y^½ïý{Ró8§ÆkûFšëTÚ<ñÀdÂ+: úp{ý›¦›.¾G—äR¾âIaym4êìŠ'DÐ9ÕÐë3*û©ï§Ôß  7úpÇŽ_ßë…<ÍŽøŽ×Ò$ÝåÈjÖÌ(Öû‚räC˜@Ï ¤lƒÞ«V|)Âk8-îÖ`š›ÞU²ÅX•á0$rléºMRÅy¾Õa†+âUñÚ%϶ËÅêãÀ‘²e2—š·üðI)¿ò1¿K¼°eì¼Sê Øÿ|áî”÷A{ùý“\¡ñDbÿyÊ~pV’˜ð±*@ÀçàÍÇV^x°kBZM%g´o^N î+{‹'—êœe@©K2²aO¼EøâXGÅêî>€;KAÌÅû-6ÒÃ*¶wÖ>ˆW†mGç~4^$¡–šôQ J»_};ˆìšÌ©ÊÃ) ãÓ“éHº®®¿‚Ã'„ ÖTàz;vÇÓ˜ìŸ9û´ï©ƒN(Þ0º>ªL`Ö‘ll±35EJ}&Š·o—ƒßüyÓçþP g~ñÇeÅ!Žz)ëù»‚½ÓÛs˜I•´kTçÈ¥6¯ÝÖpz±<»¸Íåbágðx:#Àe>Û ¶m;![^Ñ%ÁOf”:tVÔרš;()…ÍN숇âÔå¿í•:’g?kÍì2éplúòཽÒÔà •O&JrÎc¤pc’Çç'èÃñ¨ÒÖ1ÜQ~ï¦;é׊W®$ªó®Þ㪶•ª Qaøf/sirçèØM“ü­2ØúšÓØyÙý]òõ ×é ™ô±û¤O%À*8Ù1—«pÙ Od`ìBÏ[Ž$cýfÊ:.›SicÂÄ)n$¼=Éá 8 ]E†¼1” ªŽ‡û6£gÚ2ÕLÖXtµf[ÅôÉYkÊ^dN™•OÙK~@êmu/<ȫᦀÙ£¼ölýÍxÉ>º‚he0k„›„h¿æWmÎziDo‡:©ƒÜ(Bv56ýt±‚{>ÃH÷Ò Ý.{ª½˜·^öèsœ¦€ïõ+}õj2ØüeÕÕË­VýþPÜŠfÒÝ'¨wÃBßRLGi-jOCa±‹Ÿ˜=wC×ÐTQîrf@ùýpæ:¾Œ^O×êþçATÉ¥,´ù ŠÖŠùGfµ¹•%jk’ŸÓ‘)R.¢êÛC¹ƒW;5æì›\‡¢2Kc…\ ë”S+Ó}®æ‡û¯9 ”ê=*¹szfÏY=®1º=ˆëÒ -r¤nݤ€,<›{¨{8‡`•ÊYþ¼Û^Ù,F¬‹EÞv=:Ú.F´ò™®¹ûºüÂÒÁc s¯i;‡JòiÓFO‘Žö~ð·ºÙéŽ2Űæi¶€Ï†ã•Å—$œ×†¿q-U¹ŸÞuX/÷Ÿ»'õq,¡\Zs‹øÍ˺ú9‰šI1Û÷ÀCFáx±}Iti>ébö÷ŒÊGò!D÷$Q9ج”w@O’nÑ ¯r!˱ϼo9XŠ ì©U¯$ègdFš%+ñ´qEÌà Ï ¯.s.ݱú’ZøÔù§K›”qw±ã†`ôâÖ¸3òèƒIg5B®Úg™ZXï®|¿ubHŸzÇž·#¯;Å·TCUã5ñpìÀÉøªËW;W}²[ÁñÁ3/Fá3øKy…ÏŠ'ŠÙ C‡÷Š¢Âè¼¶ KPÐèú~whÖ‘Á$Af[{íÖ™ÛÌ,µSXñBsãÛÝ"Æ^4I\eUËenÂKWt;ÔUT@Ô(•K«N¢ÉzqKwþ]/å§71Ñb{ý¦¦†V}©g©—7ª†òy$p·…„]¥_4?‹6vôýÊ‹.-]ƒÞi±:h©fÿrJÀÔHq…þºÞðC¸ý5™ÆÔ»À/½q7Ü<+ÓÛ^×køŽQ׺a-¦‰ñ~)—3¬3íú,Á!°˜Ž}›²*X뵑¸\qÇ,´¸åôTÒUÔ¡¨r²“I›õCVoVz¢ª×’œÌ(azÊu}Jýêú¦¶(CÖ†X!Ç–ÜÉçyÔ™vÜÕC/GW o\÷¤Ð¸üþÑÄÞZÍ6›gàFÛ«Ì»b!År¯>Oç» àOnÙ› =ë´×p”+žµG¨ÍƵ+ùš_WÁ*5ÒÀyHxÛÜœ¶ì(Túi‡;W—6•æ¼é§¤9â¹j/ýQ)BD¥µw{"«Í’p”Þ®mÐ.ÕByÙ}Ÿ@¶¬Ó°øQµÅþ¹+PõÖ{7DiZ*zù«ÖÔ-oŠÕ):ïLžº=Ún1/®ŸÜëIá™iû©wg·m!eŠrË?â‡ùÔÂþá½GILc£³^JøWf†’uŸó±^ösæH4&ªPKo\q0¹àªêe¿E<*}ÿ°Íâ¡û¥ï˜“‘(kük2™JJ”Ø)t È€…E¢90ûL!ãÒ‚m3ˆ@“dzÀaÛ-ny8 <ð9OY»q7T–a”éeD@+Uç¶ùPß½A*ï‚ÌͧÕ_øš gºØe¹…ÊsßÈš¬lûsÉëÁ‰¦æËk;\3…æïõMÞ»à760û/&“H endstream endobj 4059 0 obj << /Length1 2891 /Length2 25424 /Length3 0 /Length 27025 /Filter /FlateDecode >> stream xÚŒöPX×ŠÜ îÐÜàîîî4ÜÝ5Hp‚»;Á5Hàîîîv;3óM2ÿ{U÷UM¯}¶¬mç49‰¢ ½©1PÜÎÖ™ž™‰ "§ÌÌ`bbe`bb''Wµt¶þ#†'W::YÚÙrÿ¡ â4rÉDœAzrv¶ik3+€™ƒ›™“›‰ ÀÂÄÄõ?E;Gn€¨‘«¥)@Ž mg t‚'±³÷p´4·p…ùßW• 5€™‹‹“î/s€ ÐÑÒÄÈ gäl´E41²¨Ø™X=þり×ÂÙÙž›‘ÑÍÍÁÈÆ‰ÁÎÑœŸšàfélP:]¦€_ äl€gÆOPµ°tú[®bgæìfä€Ö–&@['…‹­)Ð P‘’(ØmÿV–ý[ðOmÌ ÌÿºûÇú—#KÛ¿ŒLLìlìl=,mÍf–Ö@€‚¸,ƒ³»3ÀÈÖô—¢‘µ“ÈÞÈÕÈÒÚȤðs#€¸À”à?é9™8ZÚ;;18YZÿJ‘ñ—P•ÅlMEìll€¶ÎNð¿ø‰Z:M@e÷`ü»³V¶vn¶^ÿ3K[S³_I˜ºØ3ªÙZ:¸¥DÿQ‰àËÌÎv&&&N.VÐt7±`üå^ÕÃø×!ó/1(/{;{€(  ¥ôÞËÉÈpvtúxýyð_ÏÌ 0µ4qÍ-má{‰fcPó-Ý:L Ùc0ýúû÷›h¼Líl­=~«ÿÕ_FqY)yIYÚ¿3þ÷LXØÎàEÏÆ gag0ÿ2NПÿºù·ÿKþ/©¢‘å?äþð(ekfàú;Pñþ—‡ë?cAõÏÊPþAÞ4Ë@ÕïÑ×ebg2}0ÿ^€¿LþÿÍý//ÿo£ÿ ‰»X[ÿuLõ×ùÿϱ‘¥µÇ?  Qvq­…œh9lÿ¯ªðïU–šZºØüßS)g#ÐzÙš[ÿ[FK'qKw ©¢¥³‰Åß3ô¿.€Ü[[Úíœ,]6zPÃþÏháL¬@ЍWAûôßb¶&v¦¿…`äèhäj=±¼˜Aj tÿk´Œ ¶vÎ (=€™#ü¯Žr°…~‰þFFá߈À(ò½0ŠþF\F±'h&#f£ÄoÄ`”üXŒR¿€Qú7q‘ù@\d#¹ßÄEþ7qQø½qQü@\”~#åßÄEå7qQý@\Ô~#õßÄEã7qÑü@\´þE\ .Ú¿ÈÎè_Ä ²3²±­Ò¯KòR6C#'ÐüY:Yý.6ˆš‘óo? Kãß”¡±£‘‰ôª™ý¡Åú¯üïü÷DÑä_ÄòmfkëßÔØALì¬A3ù/­_Z ;ø·Î¯aeüÍ›T!S;Ç?4@Ì€¿‚4€ÿ!Âü+6ÐÆÔÈÉâˆ6hÊÿ”qüòãàºþöKÉÝÄÚÈæh Ê™ý† ³? Û/hù³ÿÂÖ„áßÇ쬿 ëoòÌ¿¿ÕÙ©Û¹ü™+HÁüŠ÷;6P4 {  í Ù|˜@ÕùðŠÕÔ?È‚îNÆ?2½Œ¿=³ƒLmAwÇïb"ÙºØÿº´Íÿ`ð«Dv¿9‚|ÚýaÅü«$ö¿A1ìA¿lÿ3clÌÿHÿ;al d@ƒmigú‡;P~·ôr:ýuñý;˜,¿„vÎ@Scëÿ„aeû}ðf™ãŸ“ÿêsý#ý¯2ó¯)ø£g¿†ÀéwÝ@FN@Ëÿ>û/ ëc9q½Øÿ& ª·“õf˜ÄêwXУÇèláüc@Åtv³ûÃäÃåj·ëÄÌíQY»ÿAî=þ€ "zþ&òä tü;ÔGPßœÿzÚAûö?ü×Ï7 Ðh??cgÂü¡&¸õ®Jß~{”o’|[ã35½×¼c›Ë2LuezàªãPÒ`÷Û¥M1ªkÁâg¯Ãou0aÍ J-ÞOqÊãÛ-ðs?±¾å ÕöÂЫ îx?;x«XA|{Ó!MžåàòY1ýέW½¶¯dq8tf[i§’Cá©d‚>Z-J7 pŠ<Û8c‡Ú™ž–íÌeêúf-sì•X:ŽÞç(š5ßK{åÓý´çr™*‹S'.®6!Ä5Úð8…—ð^²4ö¬WQþÒ÷9÷o¼ùÄ™Ht)KôoöXÒ*-•#m{ª]‡çÛ™·²’Á”øßÑ·ª‹1 I0+[ "Ñ«Y­€„{ífÂË­7ê]fR¸&j_SHZ‡þM]^u˃CßéoCSšï‡6»|4 úÌݘiÄ,t"–¹ÓS JœGÀ;5€Roé\“Þ?A…ðzž ?à1oä11i¿‡êy3Lpžå}þɧ¼þL¾}m uÖÚ M/è5ˆCþÕ¸#åì,ׂUÌ0=”*;M¬ëcöJ ¥O °~*¨„ñl­‹A´ØƒX6~ƒ},ŸMJ¢g{¶b0B7ÐãÃ=W.Éz¹ZK,{®ÉÖQ$ýÈ^}À€pPH/×éÞÆMi©°>æ¾úýY¹[¸ðà§uUÎàìíÊþ™N ©B‘à·›Ó=pÆïŽU…]IlcP4Tù6G: žÜèJ¤DÉ)óçåúdöyüçõæDó{p«ü±>^7ú³Ô´)ÜQ!¦¿]þDž¾³ñΠm°QýüO_Eõ.ççXÏìÄÈ&ÉñM2/ërÝB¶Þ&{T*„uÉì¦ÿ—ËU>ª¨ˆ³ˆ¦57¡º‚ê´©ïÀÕ£aHáw0m¬Lü£G’€¼bÊôÙ|ZŒ×™„¯6<3ˆcšø*œtkV0®yCJùt;µÞ­Š „«ÀýÜyâHÊœp—ÈV²í/Åÿ»eYI>“ø•dv^– »ZçëÔ«Í|?j’(³Í@X“=ÔHX°MÞiJŒš˜äsetEV±l’`zîjTJÔµ—ŸBÈÒ(• Pó½5"Ò£`ÒÎ%`=^œÐ±ÕðïÔöüì<œž‘œÆO¸Œd,BŸ5w#gOŒq;W 'ó®| °SâÝMA@7ômàÍ bf*ö†M}åmÙ·9­k¼ŸK_´8[É ^-ß÷‡­¯¯ªJÄ5¸äL>ÄB0΂ÒIj¿|ï®ÈËÆ3™¢ºúB׆ä±%·÷Êá_šU­ßvkäü•VPù0›1Lüœ8±Õƒè]ê¦ ŠœÜìO‰>íçe›²×fϱ(q?h84ë’ûRÒniþ 䜺pŒ†0Ï®:u,ä’ÊÀ¢%.]öiÀJá©2VV~[‹xt?DI›bÃ^›,丿ûdŽÎ¨¦z8*vÿå•RV%’ªâëµkPÖ=YSY›Wte,O”G/“4í•L'OÿÐ]¾7bSbÆ®ö”rm8¨ç7çâô­ŽsœL?¥Ù"{ÆuÁ”çîæqÏÈ~õÄÕû„zV∑ŸSä*/Ú)'ÁÉE&%kùB‘ 4gŽ¿nkÍáñ&L.F\¡þ‚WnûPq$Oá“Îkh‚ßÊ„uÅnýÖölåü(˜ÆÂÏí ŠÎ¦À .æFK8Ëù 8ã¯xÝ"ðïû{=…$ó§3YßÀ{0\èd¹ÛXvfr)/É@´cÐaËU™c1vK¤58çÈñp,D‡k–úHSIˆ|·Jyh9íuóÜÜqÑ´6$àõ—ÙÅ*F–ö0Ñ2 –¾%KÔß®ŸíûS !Z7¢Ÿ0.½wa¸t¡=Ùœ'}¸äç9£óó¬'‡·k©\Ír‡`úìˆ:3€‹¦Á,î>v2µ—² 0±‰‹®wW÷¸®_@Ï Õ{çé‹“RhïzÑ…”A—z3×WÄà(Ìõ‘ Ó¶IK¤\„ù¡×¹ÄTðÝmÑ{°ŸVòaS‘2Uo²&yr;¦¬Ä¨ æ¢ä/# Þð¬­ç›¾”u?¿‰/û´JÓÁû½ ;i³=½©³€‹·^"IDÌ0D}?Çb­m°—S)aT<ßN±­wc5Ȭ$¶tœ•µõV‘k–ëH;Ú‰+ì ¥áf9Ò‘ã‚Æ=·|bþÑ€Óäub#± ´Ybº>¡Ær ›Z±µ'ÂÙ‹Æ)zÛrÈ÷#.ã×ÜmR…‚Lô¡q4½eÆC’(¥j¸ðÁD]¥¤n|qš’%KU¬óè=}yÀ©A®œaP^¨ ¹j­|³ gL%,­rêÌ‘Žc~ÚÓ€Öuú±–ЧµzŽ1?òvN+Lñá ~TüšXÎÑåKÔÙ¤LPç4ŠdeM=ÿm%ÁQ©ù5gòÜ­×äôN"jÎ^Šö§,‹QÛ ÄjÜ}-Ê©E£îÕžsJMG¿©ÕTF[Û$iÙl,XªdAøšÝ¬?¿À—×ËzɈׯ.žé[¥¯tÛøbÊVæêÁ.å©e¿ùÖçõŽæºq*»ºÔ¼“ÖpÅü™ÌÝÑFèõÄ) £ûûå…­ö*Mj _ñíÓõ™]†± WœÇ ,‰ˆq¤¶ ,ƒ†ŸvÃÑ)Ѷ-š±}ˆ¹“âgS2úqÝ›ÊÑ©4 Y^ûH´&ktDïo¾iuï÷{“hÍFû==Š\ƒˆ× j„=+†Â2C¯X\§Za¡Á.[¯gÃz4ßå’¼ÇγO^ Ã1w›'‡½ã܇ÓôPÑó=ÉO-¿·¶žÙ/K€#NÎp%aºßkŒO D\^}8)[5Ò 4»Stgó— ÉÂô>€ÑxªãY” šÁx«…NÊ*|Å>ù´s·.©K:Yª}Çœ<šzlÂ.ÇUbÏÏÂ)Ý"ü|YïÄqÑ`NuU쎩D‡ì̯S±ñ~$A©¯)€›X™ŒKƒ"üÁÆ£‚Ú²7ÂupÿC÷FQ¤l¯²°>¡²°‘uÇ¡{­AÖ¬Vw »\a%äêÎÉ"Æi ú§–r”z|¿¢GÆy!k}óÙ$>+†‰'‡¢þ%[3JšßÈ %W wQ†¥òÊ[áü¦æµÎçl1K“ß\Ù.tÃ"µ+V3—Û†<ŠòûØCÓ˜sY>õ½Ñ<•»7œÓŸø&!sÃÃ^ çÖØ¹%åèp*TÄj&¸ª…jéRæß½¼ÕsÑ6~z4¦åøvŸPôú†;&zÁ”F9b 䌊xH_K‡A½ÑlT’7Øl±1Æ¥3Uèò «²‹Ã%ŒÚ«*Sl¤I¶åf>˜Ð ¤³î‰ïДë)E•üÚúá-»la‰T§I½·Q'Yœ§èºÚXw¬[‹V4mÛs™6÷èénïX^_:sÇE½µß<°¿ÿ¡Ë 8ž7dÙ1æÌRø^Ý—ïú ø'Œ_=Æ Î²Ñ "t*G#ÞN´‹}ÍívÃë‚:2"ÂGÌöܱ¼5 ÆFóù0Tµ;(ø˜±íÓç玲sªÑ“ºmæôé3“- ²r¥µ€v±çedÒZ$Óîûcb{zÙqŠÜGˆSC~€a]y·arÎÉrÇ S‰@³ë–ïúºOiâ1gž•†Ö‹äÍBh[ÛW‚¿Ú‘ÂEϪÁµzŽ_š˜m}Šu©ÏOåíA×|ðXn*)û þ@Ó >`~óÊ& É¢×ËV$ùe$'möâ‹~×OY ]MúgµãK_ÄÛüøøŸœüGÔßó.S%mc¿‚7• q’î{‰†*ó2²8?Ëõõ_Ý;mø?ZqIi^Å›å§Cl¼Ž=?Ò¢ÏhŠ&¿`8X'éüÙCJ#½¨Â‰Ü¹ ET K°uúa‰bb^hO‘¶t'¼ã[ ,Úßu²|ö6‡k žªêÇw‹8²)¯l£…'»i`c”7G·=÷~âØ¦ê²3t´»XN˜e/ykúŒMÅu=ƒ7o,¢úPÊî﵉Ê<ƒE‹Yoh_Ò2÷äæù?PójXnɵ†ó¿Îæ ¾ú®׎ÕE¥§½Sš›5Q|Æ E#°¿« ì!˜á<ƒÎOTôአl•¹™|7§šÕˆ,~û »‹÷|«?•AˆÀ“ ×é}  Õí D’t™âxUê{þù™2C‰uÀ˜Çý]Ó'bÖKb•aî’ƨNjäMÎÒq0ŒüCÙ ¯'鄎ê+ݸîzUß [ù©7N3»êõü­3î!ØíÚßêìfÿçyK'OQD‰nY¡[-¯Ô%u!95rõ“¸S@•ûXpNü{WþFE³k™©š·ŒºÅbMc: Í웸h£EÌ"Ã\­*8µ¾ Ô8=Qˆ­›Ï3B¸¶|“æO‘7W•·ZÑÊPÀzÏî©›3ÖÖ ]ø†9çã—­uvÃlq_ƒ4÷®è µ¯Þ‘”šñõýaÁ‚(j3o9¤t‰Sƒw—nøŸ¸Õ Áù§ ¸h¤˜|°&ëuI½æ0aOYÕ<¿Ÿºl‰§›A Ïç…\+® Q‹Å†¿G |RËOp£®83Gøé0Žfúá]þ·Ê%Ìp ‡~„üôV';$úo‚ñð2œ1›¤åÞJ?ÃÀwJ¶ÚžNÞ!>¹½²Óu*èùÜþf%Ó6­…ÝB¬§13g*,½|¸q3:µ¦s OÒéºKµXDåX&G 8þO÷(ÞÐ?œÛ?0OÚu|‰À¬è¯xÁ–ví¦“!ö~wQ2–¤¾›ÿù)M)¸Ngi…W­K“›2paQÀ„ö†|­îX¾eIX…+ô.¨«öMtÉWÒž™ÞôZó=ÕýÖå-}ãb>XèEª2@”tÙÝ5fDTÂfˆ>†<‰cy–g>o~(¶c ©”¾!cx€<ýÀOÝÖ(ÃÏé2lx4#2ô¸³Ëù*ÛŠ‘#B%”A½X½Kص?'†ÅNYæ~J*rvaWkmi Ò׈¢‰ÉÅÍê}þ¸‘I†¦wÎBΫômgÃwÂBhsø¨Ê/·ÿÝB¿—i½Ûx0!˜åƒå±,—cˆš—­ç½K>EƒÍc¬€õª€V%U{¥|yeˆ[»¼g ŽÓïëåx‚$»³){BúxØ»2K"<äÎKÃ3!-ŒP;*´M]H:MèÙ¤CD«QIáwÆ“Lðľ÷b<ŸJˆR!åS&Ä[1;¯¶Líîî-úDç<Þˆ4J²*ÙnlÃûoÑ #[è`‰P Á5ôe‚Yfz¿¼\÷ëœWƒ>¾c£|W¾NT¾Q2#mp’.Ý’ ²G˜EF ùá4çì¤~zxüer¡:?RuSðCS½¡µR”â{Bh¡~רÆÏàÚµ4Ãmmõ,)U'èßwE´€\ãøÚ-/Wdóõn¨T‚Qq­‹`ÈÒ×í‚29¶ìtYKžS™áæL¤Û›ûèâ‘­eaaû3§hþÃoú\ï?"%©Ž}—|é„nÞl^I˜yË^ ÖoR¿,ä³öú’ëÎÙmy¡1à؇sûàéhol~í‡JÔ’Âá„d›’°ùr²TNnà×´ù°A@&À®i¿ëEƒ‹ù†½1]L9NÿáíDÑ5¼½…ý˜ÊhÇ1—ŸV{ü¥ä!ñl‹ž‘Èà÷ÑÛZ2ìÚ´/AGkzì÷o µñÚÑýZõoc£–œÉ²$ïËb½Œe§¶Œn1ÂXJ¾Ùàõ®© SbàV$èyةꛖ½Öb!EÏÛ%\¶mšrçP³üà•!‡„>aê?¦¡ÇÌÕá5ȬCInï­ßÌš¢½i~èW@ÊB7rm’^Ö4ïöãMRÖ'Ù¡ÎwÜA°D¢Ä¯{3lO¸I0²QZƆ¶-Y.“sió̪µ¸~Ë9j]<±'×ÙöË(p¤¥IÙãÜĬWõ4ÿ/ûŒ\QEÑ^_}@ž¥C„{þ&sÏô<³ãnÏbÙ;|^÷W™Lãúæ†Î]8"‚ßàaèÔ:†\+Ûç Nîìø.˜,NÖ»+kª;¢:g7¿Qˆ# ö<{i׌ÐÑ®žà~}2æ)fU±ü¼«Ôÿ•í~,ù±â–Ç,O¨²ŒÕ„HÉ‹HýÒ¤e:›–ð”…LEò“e"„,gDØØ®¢U W§z>iU†æÅáûƵM-& ØÅHÁðVK¯ÍkƒÝŸ¿$~K+Ù›S,cªÄh†B¼CØ÷u·#Ûž…Rˆ®]çr.uù€‚Ç‚T-Ö‡iTá¾—bÚ8{ìî°§w××b”Æq­»ðøÓuÈIå:ACœm†që½¹²*š!ÁК±ÅÞÙ¯1á¹®JŠî0øýœKœ8ÏldôJE]Ürk‡¹‡×˜÷¾ñå!,³Üvyrˆð5R1ë³»ÁÍÉo}†pLp‚ì%˜K«VhW8]ðpçWÊG*ì?nEÀ7I1€ÊÌ é–£ÛÉädß1žµ]†Å-xߥ€~q¸w3Òµ3Þ4³Ç­]>ú€3ç‹­í…ð¸ãQò­úT­ì†)œiÛ¤ã‡Þ„K{©£”úÙ‹ëP›|йa;/±:l¼yЉ§y°½Éd)ïÐãlHY›š!º]0$ `º#–ÏÞ8ù¢²^¼”À…ÛÜó#òuî°¼+óˆuÙæÄì§µ>ž©\:îÞüî#u$‹Rº²b|¢ª¬)”á[áÎÁ¸ª »lHK*öSû°w6ž”_ŸìpøåõEWcô¹Ô g3ž ;~øq†±H¡E‘ÈŠ½+´þaP“'xu¢[ÅŽÆŽ·’Óº¿ëëxô9¾€³®¼+‰Êß rªkl"|á ñìýX™¸¾€ö^Ö&¸ýYå,žÐƒ·ùÐ%/OG)øè=±’tóL¬âŒ ÆÕâ^ÛùL9SPÙÎbR¢KÆ,oQDȇ¢%‘iÚ–‹z¸9Ükеð”qùìØa´¾õˆâïQ°úa¬Âg}XéÙÛK±_×0Ýú™Yl<÷ØfÑõ™nÕgQád#Ò=a†„·d>i_\=\w†%óá-Ô©˜Ãö1•ú¾û"k›¦3f¥ÃÌ7ð±È)‹…g¼1úÊgmS‹sªµU¯1ìµ}"¢, $.®óaøõ7Oq5uʳ'ËVSø±%ÂôøQ¶Ádð¢šˆÜæÅˆh¨¨Ãˆ•ðñ>ºÑª‰FËIßvÐy§,|‹“›78†ÇÍÞ—KmÓô,[Œ°Ê·X“ëÝ[x‚Í7VÚ§oÔ;8¦w—RàŸê8ݪycÚ5ù™ÙÄ*<ú—èü‘A—o~t… Ïx˘íûÖžþOgb1±4…ºÚã=µ×DÀBÖ‘*êà¹×47ué—l„Õì„K-Á´ÄÍ4øB8J§¨”vOãL%ׂ ¾ÅÏpøofK7ò çwåL)ä0K?ŒÝYë@½JS¢8æÖgòg¿P% æÓÞº®S>à^Ä^+)¤ùbW ·Ò~ó "ìp1QuúÎÆ[¥«ª×ØKC—u’ú‘g=t¥ŠúËìjë°§qN™%)êhhÛwÒž¿å··»çáïmŒPÜ ˆl©ÌšƒÎXƒ™¨Ê{B&]=µÝ¹Ù48›kj9]‡ÕJûàKÙ† úñPŸÕ0•û %,9ÌÒåòÛPç*i£©Nü6³|8츷xv^Õè½ÎZZÊw3}ßróðË#a×Fî›G/Å6šTÊÒo÷Ë4:—É„øPõùÌxðÕI*f•z0듯û„õÇsÚ⇀‘« £òs ”mb¾M -k”[ýÎdÉŸnCB­AßNStKˆ_Ç‘ ªÕŽé?/@y†e†•™qf(ÔkšSÂê “ ´(¯Hßlb0&+‰ð–ɾE-'©aÄ*=ÙøÈ{2²ÅO=ˆ¶â³f…–4ÄÁÚÎx_¦VÚÿ„¡öS±lã¾AÀÂ,·¢„1iËC˜œ¼޵£òõw(HšŽ‹Ö5/æýA¥sï\+Ëâg{[-©»†l\_ÁŠ«"Ãã+%“.£|„TùãURÀË›Z˜Œ}iMpb‰m~4iÉ~Gè­¾"éAQ]·(èËehŸP0ý Ê4S÷›øŠ4GÍ_ùlmi¢¸gÒÄ !ku8ÉìI$ªùìe‡?í&Fû:š¾•:Ô±)¬ûQËg è?6­³OýX2$pÕ1’¢ÐZ/tä>óTƒƒ ’<5laÚŸÁ§õC÷†ÍNHOΜ­÷(¼oQêŠð‡ö^ ­µŸ@éé¥C>Á—Æàn^Vå°,Ey˜ƒ¢NY¾Ð¡¸¢v߸¤‰…Oç¦0s>:\&¾’ÝjaýPœ-èXÍ̱ٱºõ×lHªª±52ׄ1Üz5D•@õރᚢž­Yƒð>6g¦ì¦x5¨+¡{>·j%‘ÎÜÜî½½Kk97(i^Þ’ŒyhHc?°<IÞ´›ïÁê8‘©ƒ²& 3Á`§d†¶å–.â:îÜø]#fÕ?”‘¤Âeî0|q!È%ù¦8ðÃaÆ®Rt šRô¨á‡e-ò½GþÝ*a¶î—˜#±·Ðo3ÇGá†=cHñmŽ,µSº~&‰ãº£H”o²¦nO×Á|»at1, £Ydª1x}hë5§¬Ùðkà•…áŠÌwàE`Qêd×(Ðo>¾Sz,k¯ëÂTÒ˜Æ EžˆŽfý@b{!ËìüüéÆ~C<—O‘Öí Ð5pÓ?MÞRñÈc—»¦8Q¿…>ÇÂÑTh§7Ù£8™÷5“`ÿüö)6WRŠÊݺ$7Éuðc—~Ü›Ùé,Âs÷ŒZlCðKNÞÄØê/£9uP‡Üçð©‰S} ¾)y9ÙcaËuÊéTþ5<8»HÖ¬N”áÑûI=î14Áµ<„P…˜–²cÚqOܹ÷ øg‘–ÛÝ^¯‰ˆQù¦È­vž…_µ¸Å®ÓblPhýϰnMج 6Ô¿ûér>Ö÷=êéOb¥©ä×$éù$²ê«Ûæ]ïM¼ 2åô~{HEJç¦ý¡ifŽðaÑ+º¾ I5ËÄT‚·jÚÛÊ1Y†æ‹!x]„ÅvžcͪQó!L Œ¶T ¥rá•àòõãÅñŒÛ€¬QZÈoⲺ¡ÄðA*·p ƒG˜cáÕZ\hc®‡3Å–Ê”1¨éÍ÷µ+V ”J\9·^=Â%ïÕ«ªKØ{Ùûy“ lÖsžñžc„;ãés2’pt*ÓZû.TrßbŽÇF'Eü°Ûò †ËÁ?í %«bö—ötÎÀnP€ÛYc2:ÂtiAv*ì«1ÓÔ®9kÛÇ.ç_ß{á!¯ÂVºp:‘Šê¢wט *&¬cª›)?W]¬Ê\XÅÞCiåLó”Ù4ÎN–Û_SÏÙs'—ŸBƒ ÊÓ»^HÒhÅ,õ\Ô¶tN‡ßìicEXo~ “ÄT¶¬î‡ÃqÅ¥ŒWt?G…jEˆ 6¼æ+‹k€å èpÅäûùÖÓû:¹nü1^ác$ÁFÞeâ¥ì5r¥lÇLhýið½>›JßÎÀa å©LÂ~u¶ÝSôtHíÛæMRƒûA¬ v߯gÙTÎeI¬Rne2Ð`ýÞŸ 6ëd ÉûXtΉ¼ái'”ð½å¢õá’fCFfý3Àï×Që•«ø 莱C]èÔàî.ãSÅÃ`þÜã÷5dAyìêáÂ}åž0ß‚´®9é«QëëÏk!7¿°áíÇó¡ ƒ«¡¼RR;w˜•A;áQUkY¹¾i7žt±ê {É+Ó1/÷ÖRdKç`œNÊ#‘~+lÒÃâ\ÁYø¸fH¯¹L²hfR†ÌÛ„‚±ªÜDÒ€(~bqGø† AÌÙÉ,ìÇ@ÀŒíUS´»õ§ YÉÜ5ÂÛÀ÷xî%ÏEøpô»æ¶hz3:òÊ_«v „7‰¹ö1½˜ðQë?æÅÛB']jXXTÆË»×ŽùŸE!å3ùOˆÒ¤ˆ·Ù y“ñz73ú  ´Ùö‰§ÎÇà'ˆvBÌ¥$‘ʤ\¸5@Qܹ£’Ç?–Gb×N{¾ÙÛ¤guQw}>žÖfЫæDt™U~)úŽÕ|ä¼²mZ æxyËb‡{û YÎ{ïîír*·ƒÍþu¯ü‹²ÁŒ_oBàìÞgàw)Ë–„v”ouÉ2HO:Áמ0ŸÃ”7+a'žÜ&N#ž"õMZÒœÙB×r‹™lM¼h–­»9ØRÅR¨86°¹‰î®‚{Ø"ÕœÑIìjo̶w?ÆÄ³¿}'©›(ÅŽ{p:À:Ðå€!óvŠÈ£¬Ò2UE Œ"¾½êÎlÇŠŒÉñõ°jfÒøúA’ÎòÝ·Z€§¤°e±ëTƒ-$ŽõJéŠU7÷Ö)¿^(ìÆh}Ë«º`PœNEÒÝ<ŒâkZ5‚¼1o4£L½Ù’É×!µ5š6ú/TPŸËÜï0Ù‹LÞ CÉ›~©¥ï4Pˆxñ¸=:à²=}¢dŽÒ8ÐN í›ë?sŶë« Ilu…xd½àïjóøv¢ezƒTQ©¶îá ƒ›î±|Γ¡g©±ŒM¨qFõ°ÊJ­‰[Ƭs'XK¯^+ƒ–IvÐäÛFEúçüïÕ9!ØÕ ÅW˜~ËæW³CtŽ\Þ…úæ!á£c·_>|†ÏÄ@ê£kI$òq÷N•V°Lxܤ²i>éß)ºðïï§›\ü”}Ç|yëz–8éÁÊ”5s…‰ÜXŽèБ zŠì-4ZÌ*á5TV˜ªÕ7 'êTîhfq¬Ö†I¡«öj ޽ tV?ŒIZ4R¥EŠÐÒ Ÿq­í^Ö‘iðŒ·Z„ÒRJhåì“a!ý|,Ž©8juº T¿yä¾.ßj–’YcÓˆhÔ"\KyÒ]÷íi]¯1+)õE-ÐpÎ.Ð%}G…šã¢ó½à­hMµa»û䨇Ü7w´H¥–hüDë´ðË-nŸÖ:r‹hÌ ü·]=¸¢ÝÞë^;‘VœÜ_ËœÒö½#jÓ™˜â¶¹MÄyøR¸ïµšL€º·N½¥Lý£½¶FÂÓ­'¾œnñ…„hg­—æîL+õÎT=˜çGv¬÷]”ðQ3/°æF W%7Ôš–I&Æ»ÞS;vj¤ú­\7ýîö~& 9(‡Þ‹ìÏGO ‘õýƒiïw«²ýƒ2Íñ•Ÿ2¡Gô¶ÍÒn‘§äP} ['HŸ÷0§ÒLO ùÎ*5´§°t£ü ´ÒˆýJ¾\X§¶}q ±† q¬e9éâS‹Á,u-ï2³ÝCDÒBhj¹~0)=—‡ê7u#¬þ(c#…0ÖSÓkC1éÙ&üÅ©kÔ>¾fšîçÅ"”Ï„¢’w×8÷'&¨¤¤f\°”I8ù –ú•ŒJd,ö°TÐ ŽêÄÔfMfq/¬(ó¢²›ëVNe:E$;\èÈ0rFáòkç#Äï㣮äIx¾y ÑŸˆa=Ð.žžñ«‹ O¬ï“âe>s=^ ø26x ïkœ´F$¾’€ArÒÔ1/Y%R4)sŽ 1X‡ØôÏÈxV’5%íˆ$Ã~óÇEÕÂú_ÞÀNÛmExy¬Z¶‡Ù8ÅÈnÇÑÆÙ¹ XRu ó¸y±ZºÄ\v·X½µ»ý Üã· ¸i6)^$'ÀÌiG˜–±Jך 7&¬Á`N¤+àŽÏ¥»3ír Ð×jÒ•ëˆTæ;Èœ‚µ¬¯ù(ó®·„·«£XOô€Å†Êu¶¹é¤`ŽãöƒT˜ eÔA-bm÷×´Þlí¥>ŸF`6С¤ü É.ˆžF¤5¶gº8;,š×¨EÞâFˆªš¼Ñwç¤ÕæÌŸ¸ l?•=_§+iˆä93I¹ŽãýJ{ ¤ƒÈí:" ÑóyÙ iÝ -ÌNŒ³ÐgQgéX{–å’lgê;ðRÂÆYÕp´³Åv¾D¤‘% ß„¢[=iÌDðS±Ò KãÜÜä¸Z\FéGh@Ù’hø¼®–Ìpûw(JË‘AL)?^txjï&º™  Ä6ñE—z²ÞyÙy¹›Ž¢—ùÞì ÞÑCÞ»ãKìo,å$†‹¯W n¹¹¶=ï ›âáðö&?u.Ja­W0;i¹*]š¸CIJKäYOCÎ^‹•€s+’ ÚGéßÒ¬­»hýjž#c×N§XËdÍL—š³¼iT¯J1- Q¼5,cçÓ,d±ú®ï~0¢?Œ?é{°ÔñÿÍäŒ~'XËÖ„wÌeF.ÀqRCA§>´¹Ìˉ…âÂÛ`ñ¾ûÊ×ò¢`¦ƒIÓpaƒõgûìH>WG4“ Z®¥æhwªÚé—ç[ºõ—ŸÏÞYï àŽìÊ‘ã¡^žÉ²‹ŠÃ'½½gÇT÷ëÑ@pÛ÷õJÿÎu‰þJØQ[õ£ò23O[¥v‰D/ጙFâ5ç+j˜WÙ«êwÄöh»‹¸@–ÈkS^U&—ˆ¨£é|‰Ímö¾‰:i ‹Ov6ÈððLÞNÚ­†ƒ©°Æ5ª’– Uj81‡«pŸçX¦3±N¾±§MǶbRl:SůäT9{ˆk›Fãé¸Ãý-KÕæ‘ qsÒZ“0x|Îy/Bžh•UZ}!ßÑh†ž—?1Õº¨v‚í‹ç¯p…?šר\6¦ôî_)b†Qh_[Kg„M3cͰxçIÞû.?^^rÅu¦Æ0ñOu²âž N*ª¹É$“_ªÏŸ­Ãï€ûÁÐ`F,é"¯°¨ÝàtúL'všD\„q®ŒõªÏ^P[' sý¶H/šù”H˜¿CÊ‚½ð‰Ê³å‚L*ÀaÄ a¤¯•KVÉ â¸Ÿåe,Ñ™ÝÞ=MWR¬åuð"¬¢Å‘Á/òº8ì¸W½¬Ù±õÊ{Àa„h\†0âG©VXØÿަµÄQ5ª~ÄíœxQ1„2û­·M¡‚¥¢Q1CÉî¸(3³¤!©¦[³¶™è‘ãaîÇ~“ÆFƒ~ž‡ä’ìOy¥nĪÔlà<Ë^E¯4ßh/ݲ-/c¡Ôø^¿—S[Æpö,tÓ^ÄÏnSúê-¶\+·–¦µ¿Õ¤¶_eÓå¼lçxšZó bÖa½Sã2|))­ÖHÀß?x3#]ËÜÉ÷ÁÁž¼ö}8ú¡Æ¢.ƒU /nº^'"ņ¢SÓ„º†X‹öÇÞ¥ 4(I²ÃóÏËirï¹XË¡©ò>±ú®pP¨”á°k6ðŽËmq d¸rÒ´V™Ê"„i&Â[Y ²þ^í\ý꫃i<ÀDûÁ·ÄÉÜÛj²è¤¦×CÁ@ÊÔ…³ºÙŽÈ°ì<î´Uëk1!/]ïítê¹uñWg­ëƒ§½i¹ÐÈl KZÁ2.t߆E‡#žtWÂ2yÛZ›Áa¯q×§Ø$/¢—Z¤Zß DÑ J:ΙÄB¸çªÒ[ÞÂê×(‰ç´»Ùó!åÒ;QÃ˲_tª=çd…䄿>LSÙûñ#$ò™Î«°“†ßÇLg oN®WX êèkb©SI‘ªšV«êº³'¹Ôr¤áEetM›†uœÄ[Sx) ØZ•\Ûûµ}Q)Ò×ÁåÏ!.½LjÝÖ‚(Vy¬J<ó8¹fyàyô5p#hL3²Ë ýaü‘œŒ¨÷¾1oà|Ñ/d£K‚.8Áû~ŽæøàL“Lû4›áÕ©gÕµ1Îôfü;¥Ñˆ”Žß:úOf-niÖ•áh£Å=iŠaH<ß‘í`d“tZ‘{­1]Þ¡Š««XÂ0ü aqºt²Êˆ”MÕYìL… ©€Ï©W”Dƒ¡Ýe„=8k5®8hAÞ˜ckÒ®”Ý6ßP¬I醜ŒÒ8…§1¨²&Š-ìªqî†[»Ú$G¥ÑœU¦Ì¾ˆ«÷à§9ÐÉ6e¬‹>ím³[x¦vIÞ9õ\‡½!3ÌzãlOdÆš¢‘.ó3ù3wÄ`vð1A¦¥œÓ=é!„)¬F¦ÆÛ° …Ø)·ó `)ëU÷-·ƒŒßŠ{9Ȩáó6z+ÞR~áŸ.²z]¾95D¬–y;ë± <•嘲îTÉJVŸ“EíÝÒ5†Ù ø‹•æoéJ“*åð©‹HènIž=RAÌ2aáëdvºVœaSúÈ}¡Œ^GgÊÁ;qGDÇ_‹+ÕW[{%Kdë»öÐA|ámRv?E“³ø0WûJâZ@tñ­i&ñæu(~U \1õ ^ë׉ìÛτσn’à~òBrMöèQUð-ïË–ðm÷ñØ=£çÕRÑÊÁ+ÕnÆ}ÑKƒ…ºÌѼ÷ÈÍùh1f¥+—0¿ôÀ*»îÇ-Qt®•æfª=°ÌZ”ïre³?)z°+µB½•½IÈÅçuI]÷®°£lƒbÈš¹NÇ"ª7ºQ,¬¿z2QœÈI#Z_à+`½lBô}6žÂÚ€èÀžR’/ǰo ñCGSН†_ S`Çx?0ãSRó&2D53¯=ÇLÏ«hëEZ$e &À‹ñîÝj%s•4Ê¢®·UÜççïq³þ=wóû7_b>„o´i°{³»Á™‹”ʆàÜgŽÞé‡U™n‹8ë'èxÜêúÀ’J7ÇžG¯Ì1̈ ´ga}oØ;ì|-Vdsóó›]±/¿ÅDÕ6_٩̲ö™Ù{sb}¨ïã)+?ÁM|”†i9–âqÔzö6Ü‚`–I¤Ì–úìŒö5re ÙÿªHFÁÞšÈÌEô¬·À‚ ! j›ä'Ô;ð¢ÏÿO‹'tØ_K Ъ1Z¹‘„{=x䓯ÇK|fÅyTÊl‰ˆ0ršf‹›‡ …2…hL\)e2î›ÔpìØ8s@QLk×Ù-p¸4–)„gxÙƒq©\v­|8*È¥ÞíÊÌP+T|"},ßà»Ö"'ÒÓ Š¨°Ú7 ø¼/¤3‡yZd”O˜¤Gõª1aÏLüÐòëN(NÍ*¤zgvpõ~²å¶ä °åè3ßáKºSšóZPÆŠ¬Xm˜*.*½L¶VD3Ig¶b»ÆË³ç²ò2ÙÈxÏœB CO‡Ê"vñ7òú=Ï Ž³Kd÷º:=¤oÑöí¦Î¾8¿¥ð´ºçÞ¯À¢û­Ðé×÷ý G #ÌlsuÝqçæÈ—íE5‡Û‰cuþ©Yuàœ±‰’«7 VzË\0©çž…n™_‚«îÛRz ¸äU[[:”z}Á9â6úÛÝEº]õ¯"íPÙßdíÔÁî›hMœ¥,˜ÐÙóÐSîT7šf,xefÀ$Es%¬Ax%·¢Y¯ðoï_‡ÀŠÔ=¯Ks[ùÐ’aÈëÝëFÙ[9¹Àã á»:w™5ËFF˜»ŽFô7hbîzn9gDò#g<‚þÞ¡ ÚÁê\öÈŒWâ<¬€b¸<º:1Û†We瀼‰ñu{ Žjé}^Ytµ–Ÿ ÃѸx¯×}fž[jÃBFhIü?ÈD3!œñÓ¥Ü@[‰T°ä×?Šl0` uÓöËÕK… ٦4ÀTì4ÐÝäToÛŽgM¬½–6}îš>A…Ù*;fùǯh½ƒzH‡ç«º–æ›ú×a—™ZäÑú°‹rG¹ôÇ$½•Z!úŸ×jPUd\$<ÝÞ¬ÒCÙ²dËÒ~câ»MšAß‹r1ù!M^ŽÙ¶ö¦Ú‰,ÙL„HÙÙ±IÁ29qð¦Ó»y/ë.†-µö(I|@€æré0ËSHùW”Rè)]21EnX^Ç6ÈI ,,OŠÁ,Øs5‡oWÒ*â±^-éñ›+Õmt‹žæþœ3kf’X›h¢hT'Ð9ÆÉµó`ngÕ¯›³HëÔì¼ ²Ž€ê‡A‡ë¨€zu šŸHz’×UŽ!Él}•Êٮˡµê¤*?,úgÑÓÝM“B$‹0ü"ÜÁY)À |ÄmЋñ¢IAÇd ‚ÓŒ:9%ý€Ã„áoÈû‡ºu`á ¯ Ë7¶ïý:±ò5^÷àø¾,N•õZ^×tÁ!CÁê²1j‰Ì7LÐË#­Xö¶p X†ÑîMÿþ¹S¦f‘”¸a!éêä= ª"Þ|È©4@²†jÉ試8é×)®›Ó¾A”þÃ Ë ffW >6¡“J4ׄuÛb¡açÞ6àœ§¥x"‹¹€ØÃ',碄Æ=bå™qƒ®nÒDâh$¿¿ ™ö°^ ë7î2Gn8Sx­fƒ#•7c˜þU×dÛY¥jËŽàdNGqu‰_—MŽzÿyTàúrZ«^¸ÈÂV…JSè)¯¤›Mö|.Îå•ÿb”:úÒPCÜ(Šä!åA[á²l GçdW+?I{*öªÝqWÃrL~Ôn?hU¨ø|ÃFÆåÒå)Ì×ÇËÀêX]l‰Ótºs26‘bD<¥ êvfH© RO ™‘R±¯Eþ¨µnP²V6WTbÊ›ÕrÁÌñeeYŽÚkÍ2ýh±™ïl©Åº¸Ìq⇶XµŽ€ÑlÁøÅoþ£ß‚yÊë\_/•ÛÌêùgì¥ ¦\õ—/ÁUsíqhîá©VŽÎ ¡hg˜å‚_(/ûŸ%š$z INN¢› m‡.ÌêŸì(e5¶Š^ÍS1d”}†î˜#ú¿nº†Â·Ríë:\×ÍÚR2Œ¥èEèÂð\3lÆøü£œÊZýØG껜!wÏš‡Š=‡Ã¦2øŽESoÿ·f¹ƒþÄ)=à3W°7 ØyŽÊäõNù¸ñ¯Èhc™>§ rËŠ J¬ƒú1|OÅ= n?ïž¼ògbǾ¡ã·ñnˆØTו¦à]<­ZÀ)ÙâK—õ;›âXìÔÁý¨pæi"|†¡Åä¦ùµNëÇ>Ì‘aµCõ%W˜CŸØ}DU'øˆñ²¸×ìl“.Ñ[zZs§Ïu Ç…í+ïcæÑ{uñ­oýÈ/Ö‘•_<ÒÉÌmœÓ>Ç7Ó’ˆd‘!âÕTÿžÞ…k¥šU,ÇO)‘4`2Î2Ê A¿§Þ+ú+Goì Ì“oˆ#2¹!ϾžZ ~IǬÀ1«”ƒÅA¡Q„°5è`üýR¹à=€Æ ´g§ýõyóL£NÞ-š§"©´Vànì:(®G˜Çs`&ñm“¤±§ ÖøX6lÉwÈ.‹0"çÙåË̆û°ãP²Rú[Ïø1l¦G—‘ñP¥ÁW¨]f ºXô2Ër°wdb¶YNwè{Éíæ[p'ÎMá¯>¸~¦›dcá¦ò:–ãFõÿl_ÐxË´˜«é§{rw:0 §65O{ÓÓÃ/}[ž¼ºÑG$#Kš5„¬Üàÿo~ÍìÆH\¬Ã Ge?äJ³šÊÞ„5âÿgð³¤F+…]ÿ=:‡db†rb¦+–:ˆžÊ\Ñ-'MNæ ¨ŽJ¡?-´kVjìb40Æ©{¨ù½=°SK¬xQ”Ÿ÷]º3 P\žYØ{5K Ê¥äˆø^úlÐ-ñmßmä,¶Ôþ$ŒÝ{Qj×EªÈ ''(<)Ïà@ pWŠ:ÛÉ9®ãàÔĆïïº,öÿýÍ äåªMŠX&E\K’ ‡’MÛ³_º½Fq]òD åùPÜ3ØjT­X~‚9\º°8=rbESCšnQ‹‡Iiõâ:`­[c¸Iñxi]TðýødÙJâW.ßVì#`RÌgî{Uî¹ Øžd힇#°K­U.½•ªoÆ9›{#ð“À³ÌM·¬ôŠ1¼¸'5ÀÔ¹©©­žJr˜ ; ¬RÔžQß7î»^4=áŒ)„ýŒP:Ff_ÈðuÇÎ"§ºµæ‘@6LX%âØUæ"± P7}ÀÉÕ¿æ5ûP¢>RÆ!¹Ù0#)†—‡ˆŽýÞU†ædéÂæŽ´3>Þ{,£s@8ãqwãº_ljõƒ’y3ÞS‚¢INx­1Yòú±t÷<©Šqæèó£ãÇ1Œ œ†ZÌ)âçp}ÿùØãí6öÁw‰.ˆÄQ³Ñç.ÈGðfPôÐÏNIš¢Ö±º˜88O.2jøîyzˆtª•üðqm¸·¥vZ.=–YDM<ÌN‘‘‰¹j ,œ±[„ƒýëB¤R=/bÒõ˜Íñj>ÊJX ²rç6qiwù¡‹c<1òäæX jüádÖˆl°õaÑlÄ”ò &’LŸáÖÅ:í–¨ýJŽ$ÎpâXº ‹t¶X-»Å³±›p ïãøÍ@‡mmúqz(ª¦wÛ«Ñ%¸H%l`à²U1@r—_¹7T—¼S<ñü›pA޾É4BœÐžv­¼Ñiª^{F²ßúÊól@½glÜFìõšÙ•,%Ùj‰ É߉¾U/áÇNâ„æ·ºèŠcDëYÆ1ü“¹_¾Á,PG5ò![þ›ÉaÓ~ÿª÷¬]/øu7Ÿ, .<•y«Ûÿå]zM¿oµÈÁ² ¦ƒºVÏ@70Dh“Šwaܪ*$°oèâjÕBx`!®±YEo©’ƒ[uÊ£OÖi:@ CÑ&“ƒÅÎz™1×Hé^Úƒ7r”‰Ðwâ‡'DB"~>?ÒhJ“ó¢£9¶ .QäT(÷iàai‚(´ðîôðþ³èuqUR˜ƒö›?áCdÚ÷—2Ï?³0*á6WMƒ†PÄv£bq)DdL±Pï&æ~ZĹý`ýì¤CŸ~‚„‰gÞe§ô*’l›øTyQ ||ÀÜ3ží=0‘ŒE~Î]!lLÜîø„ŸºÃ¬,{~nˆš_Ø™Á/ÔÙ†vFú\’ûÓ8¼z8ä*Õ acµ‡K-ÓoÚâß6¥ñC-]ž¼eƒàhš5YµzK¶m Óù/WŸûPÕ™‹ ‰hpêB‹4´'ÀåÉtքН¿²6Íæ–h*@—$ks»‘WK´cÒhŸ\UÝ0ÍP¬×/D£%´–Ϙ:óPPƒHyd ”9¹ÅŠ¿¯kìgt{?seô­Èoбä}-§D7U Šˆç}•M2~üàRâ–•öæGÆÜåiå7Ü~UV¹«ëØ)`9èkÀŒ$ !É¡ÎÿVhgÛkg™þL^–Wùíî¹6†áß¡–Ù-Ò5©ãç3£Uû²íÔxÈEò=#¹yâEE¸¨MMôa`wŽí>}Ð:c©Öð t„ ü¯yà³ô´|ŸÑ¯¸r˜Ú3Ãù?±fGS¦÷»=—qyCZ;oo…E¨»£Ñ(à .×røäbK(YÍçøø¥Èå¶™Ií“£\¢†€±‰CEM˜@¯#SxD‡Éé_`M(¾2<Ž-’‘ù^8Ë—ÚS—«L¬¤›ÆmšÜ˜½ï`w.éñ=½=Oú×¢oÞ%”Nw¥ûÂ8àV¢Î­J‡¡’«ÿ‰š),ß¿Áe$úYÃÙÖ“½GnzѦ-'¹u¼¶*ÁÍQ®jÖd·o5DV@,X¡© €«Ï'ï {<«Œ_¯`ŸÑÕE5èúùÌši<¾„°˜u%`. Ø7[é“rzË9ÈÕ`±æš-DǼžZkÓ£BʾËÝz©ðÕµRaOÌóÓmW#YÜc™o‘ÀÚ½F^ilž¥q-ƒø#‡ÈÚ)ü«JÛÜîW™ÆŸ›‰oQ¢áÈßÅ.3L ÀÐKŒHùÈCú#ÛÙјî‘ýq= æLi§ܶ‘¼ÏT8•&Éš½Ûò5¾h¤aå¬ÿ sB!ÿ¶ îZÏâ•HÖv²Âf7›ürz#þS<Öw×J¥ÚÊ_J)ÉzZé/,Ïn»PÖ-‘ýxÇ÷” ÉÏÌ ZÊxüR鎂®iyésBÔZeSN“µ5çA ð2]–ññ…4™{Ý;(bu$ï…o+pïí[¨ Çu$žI F;[ ¿Ú¼q6Kþ%î†ý²gvhyeáP'?Ø’ÄîeÉ´§3ð+Êü wAµŽÇ‚DPù½ZË´ƒ+}9›ÓFH:–UFìzª¿KOùé¬$V „yèx·vÛ( •ÝÓæ  È> 3%JI:íOü­Õ(vM 8[æ~?õ´gi\† U@©yö  V=ù¨§”W#§µŠˆZâºsë MX2'>e_í7§CéaÝöˆ}H4‚qys'2ë¥Cm 8ûeÛzcH62(ê*[§+l,WŸ¼B§ÿqãG3}$ÄÿƒÖÔò"_r¥L¿b·fí3 í¸iH¸Õ­CZÿã/àš>¢é,1$; (’ ‘³zˆÉçÒØ—~‰¤Ý¬0®=ëÎ!ÞvŠû‘ÖaWJßâð+8µýJ•V—ß·zöÓhß*7i¼ûé„øÝ†0_÷oq4j½]|õm2FSßò*NûØæ%á„Å^qrMë(„õ×:!7éºl Á oåæ6É•3°+Jޱ§¡zE!åÚ$ÃÞæ j5ܵä8¦ä"ÉÓ»SŒ,ÍÁí/;Ø«B±ö`:¸iÜQotfg²±™V^ŸŒp®3+Ñ’øwte+h{ýÛ':ú|“ Òþý€ò2^îBîçëê ´M¦To3;i!¼¿ã JlG¾|!–¾w¿¹­ô¶žØ(kJ·üe§îŠáÊódèvìÌûîOÝO< î‡åô€jë‹’â¾éÅGøº€]Zc´/ŒÔJ‚8á*¼uÈZzF4o]£^]”/öfW|JaÒJRþgžØrÁ!Áܺp2Šyf`4Nú%ØKEÏy[|ÖSóž¤qa>D~( –Ê´´ð"2wH±X©§rtPÚaÿÏ­7½Üž,,œ?‰qƒJË3ƒÐªj7Ÿ”ÀãÄ/ìþ¶‰ëA&´ÊתH;pæ–xÛ6!þ›HÊã½×ä¸þÊÄbiwï´Ë=`³Ÿ¿Î¾ÊÚyÜq>”VÄV X¸>³Çæ4 :Ÿrð^n šXšãè”rg]Ó¢:ªÏn$p¼q§æ9ìÈÃkƒ‡ý Ë·|iªP" ÷•Ñbu,fˆrðÒ0’~;©üíÎv¤ª™ó_™HîC†(OtzÞaN$Oõé|T( X«š>™Ê¹rgÁáŰ‘–µ£}-™`•9Àl…‰¯[Ø ÇeÄØó¯¾ÁÇ*²÷¤ŸØoóˆwAT17­`u%©ë˜÷>?¹vxó£#ëwUú ˜¤B°<sïµdŽ:Ÿí㟇ýPâ¯NÔýóË‹8þ*Lç6IÇ.F­¡Ïn>Û+k,¾ýmó¦ÊwßHïV:v“Sš‹ÂŽ'š¸hû{sºu:Ý@Iq“ôäëu°bÔG8Ø®ª¹n8·,I¶õÿxvóERsûõ:ùMª–rð äl4Ùý‘>€Õm­žP@ZªÖšKÁ¦aDø6øìY±®Ž™—AGHÊ*| Wœá0MâÕ®–Gèc$“C ¶å,'ËÛ\¨Ç+Tâÿ­"”sgúY‘Ü™jÃ^þ3bTµë<Íóèß)ì3G^³¼ógfëWî‡G†T}¨ ½ÕÝ9NNÈt±–éhs‘d¤G™QB²ðKXip¸ìÆC»<=ç"·Ë‘1;w |ôda9ϸ¢`XRtñ¸ä ¿Ä\0Œ^ü˜aŒz9/ ÇðÁ@¾£PB,0¥BB¥[q~5€Î2IàÒ=Ö¾uc¢Õ‰U#(ýAÙ¤&"}Ã"ÅÏðí±¬Õý­©/¦ÐÆU¬èáS¬L”Z®8tN—ãÃSö­·áÑüt›’Ýç8û3ºÞ\]ìÁ*#Ù™Ôîÿl8µ,cÙÆÕ°V†¢Â¶¿ÊÐÓ‹ JŸ4Ú’Ê$–¤„y!À14æû~Ø3È©$rÄš‰uñ†:~—ÐC_%”3ÅÈ2| F„Yný­¬§BÑë ÏrC*ÝT[f²$WB¯:CbŠ_¹Rmº3!Ù)‚ìÏÀåÓEæW¿ð%ÿüŒ‚_>’±9ei)HîƒK=ÑÆ1\N³Hèï†F²;Yi©¶2HŒ5u&9G›q,ÐeÁƒc î¬oàüÿ4}lÑ{œ_hæDòƒ6·Šé*á.€ƒÂ(ùmëO/ÛEøôŠË\Ò *!š˜¯ –° §æ„l[Ghü©.Ë{h'Pñ¾‹x¡;U´ÓžÓ×0q9Q´BáaðÍÆ7rÂú(‡ÙÅÉ•˜U#\ ‰x-ÎBµd^·‘z§f³GèfàÐÙcá>2L6kõž²êœPHJèÛ·Îm&Jeæ1vú0ûFS ’eùÈÜ Ý˜Œåî×3§¸|I¹AÈ_…É_ð½yŠ¿„ë¹1#d·>­T’ÇŽ†—XCήəøí$4 ™Ÿ{lzìžœúGâBÛJT0Ôù¤¬ÊŸ“¦“Ý8Ê Ãh„„ÔLÌC%©»(ÇIÊÂDGVÞÎê¢"ÏK0û#lÀ±ÙûDQ×s"7EAwê#"µz‚D£¾DÏVûVÚżïòãkA (MÿÙ|!¥4Èà¼ü¢nrp´<‚TFÕB¬“6&)9¨ü“ö™d[(öp@FP«ôDãÔˑ۳ cÔ‹eSþÝä"ѫ޿SFxv+D ´aá‚ìr ‰‘w‡]Âĵ÷?Hé9¬ûõÝe=¸KÛÕmT*-ú8ˆ.™¡W1ïÊã6[‰½eZþhë±Ó ³1«µœ)$ÚV2¢ ‚q!ÚßìãýÅUô¢ :„°f>eý†O£bjƒ›øžÛ$ê]&[Uàæ´@ŠØŒ> BÓW®%dïî8õ¨¶úð­ÚQq>%ca¤ŸÁ~‡¸d­à‰È/Œê€¨h‚ÙëQgýÍ›½Pß ,ÏÿÕKÏhå–ñFϱuþË#̨bL¥ºX2b|¨)¼cο’±Bv§›f ÈŠÁ± ר ! Í«O<Õc °ð؇‚úÕhŸ³Ž“âI\¸»÷reÝ@Ì'é’ù–¾±ú(Np8çl¹Y‡À±©AÆÌƒÆ½Â ¦É7Í cIª3èša®´A8ܕѩÿ›8²ùNÅåx›Ì6mÒ¯½Ú®8d®Û?ø½õåþAsxxC+K²Xª1»@DÈ(eç3^¡*l·¨ÿ”Ðy?%z­s k‘dØj:èq dûr@(Zn¹uÄ2š\¦pGìC‘©Ètx©ª…JTŽþÀ2QÀÜíÔÅÁ,ÐwöÁÓÿ] ;{sÏOº¡m7ƒ`ÿa8:NN}²žß‡§W§&ðoDi|{5¸1S‰í¢5×2‚ÔV@^7§Ê&Ä©)ê¾p`9Geâ¨/ ¨œSR¯ƒ´(Ï5•½%T¨Ÿ Ë@Á-Nù½­tȨì®ÿTù½Æ)üëæ(E:Äû×´87ùæžV„QÓy8å®~p}Ã[+Z˜ˆ¤•ª…l¸hw±P ÙþÑR.%ïrÊ„¸ˆhž nÕ`» @AƒOa‚Lùßu"ÒßÅøuCÛ;XZabó>‚>Ô(ùðŸ—ñìÿ„@‰s2 "¢Š7£µ±˜³ß5Ü’½pvÚÀ&L¥EÌ\îSŒGø¥uF£äDE« Uˆð$HYÜÞ5¥ïsݿՈƒ ¤&Ù͵BFÉ ¤Ww®@©UaK:𽋲РPûÕge,”Ì{QØÄM{à¤H¾3¥±€ñ #xA–ÔýU.QE‡O_fuÞ¶&¶è‹RŸNÙ5?§m†Q2iF»ÃèjçCù/\"K+{õÍ//1…sÓ­í¯ýGt"HzÉz è®Qj¢±TÔ”Š¦Lü ZvÍgëÈ•5®¼÷n™»˜…´\ØéHˆ’Û‚‹_^²›0È1²ÞïÊ›¢®[§Ò®³Ñ•@ÓgÊ݃N¥ákú±¾޹nQÿ»uìAÉæò¡´š ZxÌ{Ý ˆÌaWŽiàú‘8Ñ"¹¬Î3 ¸ÞG¤$Xh¨ oËU¡û#UV^ú¬i„}½øØ!j”ºå r¸ÓÉSGàÅáï¥bÃöEòoÔkniþ¤/ȹ[þÑlµ#?ºÁìV¬ TõhÖYÙ;È[vß›¡iŽ×/ ÇiWbLbü nk ‘sÛ€t£ J›æ ,‹ú‚Î+@ä§ð¾²nC¼Ú>+‘Fyb_šHrTÖBÝ73)ŽÀ‹§qëea €oXú`4xC¿æÿ GhÕ„‡4jl‰Y Nº Þ¥cè\b'Þ§èdi–&CbIÖ¤ÆÔP³t¨¡tìˆÊœæÕeÿ_odÁ>­a-´EØ(D¾ùÕ¾qóµÝ¾)Û”ýÙˆõÔÀSHÅL¡óÁpÜj&ØŸ 7‚4àùîZËS¬D œ¤ld3O͵œ{5“ýÇD!@Ía)Jž­%h ‘CÏ `Kr›߃/>Pj‚T(ÔHÃ¥{èŸ\Ä/]<~"AD c"Ò;TÔœmóÿãˆÏa²úý‰(âþî„•Õf]BLæö~¾A^Èžš:Û&Kµ?|—5¬¢£5Ķœùää +œt¸¶ªàâ² ÔÕ&°Õ¾-‹)ª1ËÙ`6š=äÛ #GÃ<ïgÉ5æyË· Õ[(ð-:ˆìPýä·²0œõ7—´3 *ÝD,pݦ¤@u"¹ß7*JdR8Ê»ÇWêvàõË’^[¥Š¦¦êª ŸL„@ ™w©J©Í5{ŽX”¿p.ç-Êpm篛ß{éÄè„Ó1w—Û 8ñðsØX‡ýf—À_ˆÚ÷ñ‚؉q¢Ñ©J‘#ôË_ôÓs›|YD0H¼•9ݱÿÓ׸ÿ Ë žS 7Èl¸±ãÇcŽÈ ÿ;ä`jø[ ˜6p3Å5Ï ˆiŸStêÙl~,tõ4JÐ<©_’kSQzØZ,e3Kåú­Uee,/ _€õ`Ð_3Zs„ 5w6IÛ¤÷a$6N Ü_Ëý¹•àP+§Aü`•áømjº!…ÌaýI Œ™… ¸~n¶ý ø³DkÌ:­ŽÖþo€kG¤îwVuó¿®`¼ÝlŒ…Ü`ì…à‚8y›v—Çt{=è(WÜwK .Ú¾"Øm÷îá¬5g,z<Ü K¢RZɆžë •XÓA´Iº«­ÃïõDˆÛd¨=:ý©Ä™¨I"Òlh:kû“å­vÿž/JR0£¢Î¥ 8#wïí‘Ћ]q[žÐ¹þ,¡c‰±ŠK¤’L §ìc0eg^ëçÇõ¡s³MÇKµHÍ+Í/¦pY¢Þ_§çz7ë­Ä^ì=Á›‡ƒ‚­>í•\iÆ0i«js¸M…Ï©þ.Uˆ£ÕþÍ,Ї²êh›ËɾÌÀ3C•éÚìím9ÛE/L½2Ø› „†¦)ÍûhtÜû牺;ÉF¿Vèi6H¡o ¨»ÀÿÐì€Ô `PUkÝô«ö"¤!Ü^x6Þ¤¥‹Œ"ûeR±l¯\ïšSM_àdÐö?o4àÑÃÝ"%Qd¯´þ/êÍ;³Ïüç/2ôD>áa¯o¸ä‡.²›cM¶õlåõŸ>wEÜÙí{”Ö—F¯–ÿ̓UìÝ縈|©^1µáv’l J”ŒÕ]ɦrš8.  ˜ŸbµÌ½-gf/‹!!Ae&£¦3hZ& Fw¶ð1©kïí§,º_Q Gúì"©*mˆYÐP.”3Œyµ7´Fóš<'‡­ƒo¯8<ôaxi/ Lb†æùf`Æ3Uиlu4Ÿ~ÚÊbµÆÝ€:G> iI ¢NʬOß?YÝÕ…)C¿›RpR¢Ãm<Ÿ(\ó•Ò&)ñeŽf.ÃEÛ?»*c]ø¸l‰Âΰ ÕM‚É €ÝjÍô Õ Ö²Òê# ü Ëük•É>~(x>L«rþåÓÅFØÂ'ƒd„€rocÝ´ì¡{É)£2Ä3ðÏI‰6^‡$@·wºiá~ ÔÁUz3~žb%ÿ6ï * ü ‰ÀÿÄQ¢•E¿©ó¯gqòü"›–"m„.t{ØïSâÖcÛå”\ÉT÷ú’ŒJ8dU+/öœ»î”z‰òøÉþV=ºèÏl¥•Êø1{ðÅ¡ÜÒ»ÆÈ¯ öξ†˜ï?-ƒçCj90zëÙ‰D·ßÖÍ,ÿ8n$œäRxQ<œ˜j£¼MÔ5ÆEŒ(¬Õ÷7(Œ(h!ÛÛÏÎXd¯Hõûö©À‹N·¦Ê(ªœtab·é|B´„½èUÈð‘8g©_M¸»²Ò]~_öOA¯î·`î„6z)9°z^­€E2Ý|sY“Y´XÓxv}w훢“–½¼<}2WøstÙ7k \ßÅ2=\bÙɸx”æDÛ¢_¢ÆÕ>UI›½b>vTSRn=À&M¡¹{gûgc?2Fð7pHD¹—ÙDçÝÈ´®)þ,ù^ZxÓ+O3ܺƒ÷+Ü…±†*ÀnmnŸ£9ýÃ[í¢PRøh‚K'Á¡92v²&JÖ7t ÜWKVµNáãÚê…WûýEŸMúsqGý|Aìw×Dt0| »¿¡þ+̸oZ endstream endobj 4061 0 obj << /Length1 2018 /Length2 13873 /Length3 0 /Length 15105 /Filter /FlateDecode >> stream xÚ÷PœÛ¶ ãw·&8î.ÁݽqwîîîînÁÝÝ!¸ Á=<öÞçžì{ÿ¿ê½êªîÓÖk͹¾n Rez![# ¸-ȉž™‰ "«ÄÌ`bbe`bb§ P±p²þÇ O¡tp´°qÿ+@Ähèôn5tz“µ¤­̬fvnfn&& ×ÿÚ:pD ],L² i[ОBÄÖÎÝÁÂÌÜé}™ÿù  6¦0sqq|ú; dt°06d Ì6ï+Z”m-€Nîÿ«5¯¹““7#£««+ƒ¡#ƒ­ƒ?Í'€«…“9@ ètpšþ 3´þ£Œž bnáø]ÙÖÔÉÕÐx7X[AŽïÎ  à}q€²” @Þú'X柀O€ÿì €™ù¿åþ“ýW! ÐßÉ†ÆÆ¶6v† w ÀÔ—aprsú0™ühhíhûžoèbhamhôð7sC€¸"Àð]àä9;XØ9928ZXÿ%‘ñ¯2ï»,2±µ±‚œáÿâ'já4~ßvwÆNÖ dë òü0µ™˜þ%ÂÄÙŽQdaï ”ýOÈ» þÍ è`cbbâàú Ú€nÆæŒ•Wq·þídþËü®ÀÛÓÎÖ`ú.èma |ÿ€÷t4tœœÞžÿvüoÏÌ 0±0vÍ,@𪿛¦ÿà÷Ãw°ph3½÷3€é¯×¿é¾·—‰-ÈÚýOøßçË(§.¦ .J÷âÿú„…mÝžô¬Ÿô,lÌ.NNÀûWù¯þÿÑþ·UÁÐâ?ܘþ”™Ú¸þ‘ð¾wÿ#Ãå?]AýŸ‰¡üïälß[ þÓù:LlLÆïoÌÿŸûÿï”ÿmÿW•ÿ·Îÿ¿„Ä­­ÿvSÿíÿÿqÚXX»ÿ'ནާBÖö}6@ÿ7TøÏ$ËM,œmþ¯WÊÉð}:„@fÖÿÝF Gq 7 ‰‚…“±ù?-ô?§ð^ÞÚT°u´øë®Ð331ýßû¼[½ß'Žïgõ· ø>Nÿ{I1±­É_sÇÂÆ0tp0t‡gzo/66€'óû€šÝþîl#ÈÖé=ð.Ï`jëÿ׉²³…þ2ýƒØŒÂ€Qäâ0ŠþA\F±ÿ"&£øÄ `”úƒÞWøò½×”ý/â|ÏSøƒXŒJÐ{žê×{žáôÎÅèzçbü_ô×.2šü 2ÿ…ï›ÄøÏþ x_ÖôOÀ;yS —eüå¶uvøWÂ{ˆÙ¿à;Q‹Áw¦Vÿ‚ïT­ÿß¹ÚüÌï\Aÿ‚ï\mÿ ?¿Ç¾?Mþå~§b÷/øÀø/ZÌï<ÿÐþ ]€ª³½‡;¾ß4Þ÷âÏ>¼Ï&£“¹ð_ÊßÉ9¹Úþ+á]šó¿à»4—Áwº® Ë{ö¿cy/ïþGÚ{ªÐáŸÚÿ«¡Þ/ú¿¯œ÷nÿü÷Stï.ÙóZÖv<Ô ¸ÒLñÍS¨§ÒÐ{®:t:?!Ã&ÑÔdúo9Ü %ö¡~ߣ¾\#yõ¼t xXÃþá¥|Ž>J5Rǯd"Ï(k÷#Œ=ÑZô_n( ·wóè9Óo$ÒqtðÞgQ¬EžZÛ,Ñ‹•*,Ž=xäxZ¸D·è³”žÂGÉÒ8Ëž¥E[)‹Ø“;6‰ÌÖGÔrJÇWz”ÓÜÔx¸Œ˜R‘[ß$ãmJHãa>gýú.½å&uÅÑfäøI>ÞâMÞš£M ë ÷)§Áã–«^ƒ6DÉ+©ÔÏBžÓ@‰Zp`6ü…³©3l¼1¶ÙÔÊ…l FÔÖé»k–Yïêw¼¡B:úÝmDjáRÚc.ÔåxÖó×q†íP÷ᤣ‰ žxES“?ßQí·¤Q:‚ì†,"ç;®6hü(²¤ÌôÜ6Ö&„a}ÝúƒSšŒš£öAWø‡ÐÁ“=ÌrÕò7¡šª\ÎL´B8IؘèLjIgl‰™nÑMôéÐèßÔÁù×êU}ד]׺ôL¼ åfÊÂ(ˆrÖ‰ZÙò±2óyÑlz\ý˜¿¹K¾|£…öú)ïøæÙX ñ-_û´…—ýlßÃßiɤ—âvš\¯8ø›J£ÿøÜç8(¬Ãq”Ï]kTáÖ©j/›ÿ­nå»Ýbf?eµZpï˜aîâžÍrÃk&óeO^˜E×ó‰œä§`¬ 3¶¡¯þÉ#`ð„\þ澑_§Ï¯hxY•gq‘‚Lº+ ¤ûÁ–pdˆíi#n»)‚öx]©˜sý®õäD] š#³Q3$•AnZ? ã±=æ3ž²”#doHh‚×yG["º¼*Ì›û’ñ2K‘Éë8n¶Œˆß›9×öïcm[®Ó9Á?¼%ÄçýzFʱQ¨ q£zÚ‹¡da÷4°3]2G ùŸ~A…²€z5»$’­˜Öi—ƒ­¼F¾$®PK/Ãq›ËÐþ4&°³(û‚Ø›†rœÂñ½O@1•;ã3Ä€ÖÀMÊïB:ü0Å* .ö)˜|CÎ*ÑLˆÙ$L—c­ét'Ó&ºÂÇɘsHÃñf%†îÍBÅõ³zû-å01·\Øél ÇIt‘]ÒÐn5ˆÜ½‡ß§/4½•~L› p}­™9v:¶V}Âò -×¥ qx 5%ÙzðŠ]¼›¥Î»‘èê„nGDYe|õ8ž¯…Èßñ÷oîIgG6åÐdO¥V„hÀÁ´Wb¦©†õó½B»_Dá²ÝbÙ%þjUÊQ½o½Â fêøVŠëO•L¿QVω‘4ë$õ&äF;Q@¾CúÝŒD WÒWŒ°‚G©W ì\uÛ÷L€Ôº8Jvµr–Å Cþh3He€#÷©Ùu:Á‡F  ²HäÃVn²š&‡Þ®UFvÙ­4O¥1¼\O"í5Òj”aOqáöªWFüB?q¨já›ñdõVþòh©õ‚ÏNûœy:;´6ËêVÓLN,1‰Ö¶‹êMú®u‡‚Úp+²Í¯oËYDèè|”†ð?*±o¤£ûSõ‰ &êãӠݣ}Vñ½<•ü󣨳ÇR„Sb8,¥îñaýpB|GRYRð_ 1Ã^J(ßR9>#¾a|¦Ž'ì`àÿ ˜$1Èž3§²«œÛ£sKr™Ô𮈘@“XbE%âNñ×kŽiʛω¥¥lû|i·â°ëõ²Ã„$ÎÑ3Gɰ¼TÖŸˆ> ±ÖÓƒ™ð^k¦·çü6»|Û„¬kÿ] ›Ûâî*î`ŒÉµ¥€E½ŸÍkÅÙ[ÓTÎ1,ɘPÐò9EiM·­«jÞfé@µ kù“8¡×$í÷€È@HŒÊpC’»0dÜ9eÄmRÊ*hŒXƒAr¯Å{ ~•Îi«ÚÇÎAµš‚² ðç)u |EN¢W V3"ßß<&E0­ß­Çlá&ñÛX^Tw®o{ØwSE–"(ð5Un©”n"‡ñ-çÀrl—˜‰dËAÞ2¿cèÀ~%pËÿnbœ0¸ ø1Ÿ3}€†5ú¹5º±B9P1bb„¼BÓp±V N(ÎÇŒ [J1ïšw“&åÙÅ‹÷œvAbu_Ð)Ê^#8’g4ÆN §Š¢–šXãÆ%iìÛ¹‘ ܺB¨æËZµ/8 {Ú‡ädÝ„^Tºô§í:ë¸}v¬kªd¼ÓÖïV´*ˆÍÔÕeºÙý(ìlJ+ôÚ½ÔbUgBÒ¤¬ŽÜÐ@Z¡ü“ïˆÐZ¿ËGÄåf#mgÊ/ÖùCúBç¯2ù»C(Û’‡ÝªN'Ú<@©ÈÝ¡ÁV"¥µ¦öêô«I¯ìöa¶°´©vt wf–ÖZ¹ÄæN1S¬Ü,EN«—«î”âi¤®¼wö$Èçµíâ ²óÈž¸e;<éBL '£øj— M¹):锡½ŒAvÊ\ò³ŒçX^wô2;”ûéZH~Àe-ƒÊ~ØmîeZçÁBŽGÝ`–„m(WÏÄÂG=œªG_%ÔB ·/-R½A”.W1ÃeÓº¹Ÿ£-6o™QŸ?0U˽Qá§ÝA~Yïc=èD»¼:®ó«7Ÿ–NKoèà×+AçrÉ™u§%€¥’²qj¯æ6‘#»Hñ/H”™'84TrËí' z1!íTBOÌð Mo¢½Ì…ñëÞç:ÌÅQ®5Á°ZéÇ7"¯}R».×sJþìmΌ۔” u¬’*ú$ßËNµ]„·3fß@œø,'‚»Fæf7&¯’ýA퀾º…Tº©E«Ë]c ®³”T·Æcù»à2C³oÙ#"ÛyØ4}L‚¨L#›¾ÃªäÁq•½™I #±ÃÔ#³ÉŠ„7@¥ÉIwr[î‚Ыñé`êØ·é¼üM“ ê@ZîìÛ(ƒÐü|!Ù'£ÀÈ`zPa\ÈqT¼.YSQصåè<°4¥ å(ÙˆÍc–V^ Ž-©NUÅü oÃÚ¥›«@Ÿüqo‚ÜN$#}蔕n‚ºU6n±cMáY-"^Þ.olØÉXÄàÛbî.SFô@½o5'[¥¦õ Õq|(³t: "~ Fâ<ßH@Ì.:zÇÐ-?\§æñ„Šf\ÿó*Q—÷ͼº&“%~=ãMµö!t&1­!§O#¯˜x4•w@€³ŒpmÅ4:™ô~=xÓ¯žëßý—­Dv88LX“L°) it´¸/Z2¢ ’nL¥˜K ,ú©F9¹©#¥²%òrÖ`aÀÆšØÃ‡¡ðBR‘xèòêËî™nÙ+–~ã|¡>5í\ÝýR]¤PÅCÍh@ ¹n 9;¡°äÏ0ªŽºF*Rxð —ª‚;ó¶`I³+I¤Ü5~Ÿq±ÙÜoÀ¡¸}ìoÏi˜ÃÔ­äSñ|ù®Ïò}xÁêõƒòtá˜X'Á±]$•üÙɤhÚËø-î.ü™oë"#Hª¼ëÅ >õ Âòe徕°Œ ¹§ùj•”>±*K%Q²®Ä/BømKVÏûI7ØDFع•Ú5ud°(!M‹r±Ð¥Åä…y$â6dÛ]d!éûEPN05ò3õÞ´f`ã1€e³¶°ÏbÉ!c:˜‚0Ã-|vòsGÄ9çxËy o]ÈH>›Õ×EîßY¢®v+x,/k… žªà¦ ”•tš5¡ëæ\å¶q^Eêâ¬Ü1*¾n:K’Ss"OËq4\P¶¥pˆÌxŽ˜dMñ=WâŸÅY‰à¢”]%AvÞ¢uLç°O§7î·û†¦…¾¥™B¬bwÑ J¨9ÂÈà[Ð~)ÐÆÓª^òW¥tmªDä³|«!a±Õ Ø×ÆlIŸ¶w~é9ð° às­üBáWÌ”[–в€ ¨ÜºÏŒ3K ¶ãó ž×GIcZœä§otVïœ/òðÊP™hÜS“’Ý«1¥Ý*dïÂ0þQ½¦Ç›’©Ä6éBïZM{ ‹²úxÌ쯖_Œh"°Ÿï/-l”‹—uJ¤T ká¹/IÖøÙ:<—ÀlðkA¹ Øz4\e´|ÿ µë,',‰BuÞð+gPM½+’Tƒ}˜®Ñ~Íèãíøà>™•~N½îÍÅvÞÉԳ︚:sï vxƒó£Öq¸@É=T§GäJ,—Ær«ÇF6Œ‚j/w¢6]J¨»wfâŠÃN¤2·@¦½HZ¸éöí6CéëcÍ;O@tœ‹Â. †DÍËÞ.J½©.EŒ¼“ŸOLÛÁ®µi‡ìn:ÿèRNÐN‰w³`¨þtKýÞtÙµ:&åRh²Ç©eßÚôÈ¥gº<òÑX–C ý´2á,¨ B]‘ãa]cº#_¿ÙÈoдcMÕ²LmÁ÷yË:“#¿al‡HÖ¯£¯m¾©Á—}*RÑ)X]2 ¼ tˆ^ëZm™â£Ëe8vÒošûDå[ܧ@³v=S’í@;¶óY=Èn™<PÕ“ˆ>²¹tÖ_8ŒàŒo¿–›–oh ?áe¿f’ ·¹3ÅzŒ9ßÿ|ç„ñÚkNVé©…Þ ’`»±Œ‡ýPöÉk0§ßìë•ï½&À¹\»ÎúŠÚ¶cõ fÁÏ ?ÍZ åÌ5¡¥µw)Î7ÒÇîÆd­AÃ3FTÙ3?[¡ØˆEX…tF \^~زPZ×pãl:J)£'é(aåÁ产ˆÍï øeôA¦õXN¿¨p1ã^($”8Ô4¯Þèªx Ì:3¥yl«Ë†+ÿà«M€¼€oàÌYe·»/ –bmBgEÏ/þÔÖ$iíH¼…«$¢7xA‹L KŒ»œŒ#-*¡÷*»UR“u`‡3!G³Œº¯p­âç|«Š:§¦`0`¸»BrêI€7À½ñ Í>ºkŒ1˜P@³ë@¥¬m_2УÍ>æ¦|-ÄïÕ`\×>WygZ¹ád+07ãð¬´7µ‚…^®JÉ>{ÎZ–ÑÂi4ÖËü©««eŸÅŒ›ü?åtºAJ”Îð8YÝž,#õ­<Ò|¹Í"»U,ÃþŸLñ¦1Ö1 öyx1Ñ(ÄF;Ø#îËÚk"´ƒ…3ET(¾‚}°¸#Ì݉,õ&HlNOâ8Õ•žE§ß{YÚÕáZ[åèh–Cé^šŠŸIFEx±´€Ó+?ql÷žD}‰Éé2âKÓ1…`Å»;–àKoë»"I—먷áÏ"ö<s~*âýF¥îYÎþí…(4öµuð<ÃÆÿ˜š»Å¡ô¬Ó‡˜±"J•·¸õ#Ù †ûq¸; …âóÖ¬C…ŒÉÆÈ—„ID |;óЗËÑÙô/ñ×Ýg—J¬¨Ùý8ªPiqÅØÏó¬8ÞMƒ t+Æ×Rïó_†/»Ã$DÄ–\‰°ƒj2~îLðQ}l=æ…¨GÑÏ\X^¦XnÓìâ¹i‰ù”±²ÌýÀñòˆIè'©`ÉV"òéŽl«ac1‰IüèÆi9p\x±ÑóUžèÍÿƒ›UÒrb±·Ä#Ž ÆòhhÃŽ‚µb…:û“è4Gi>ŠÝ/#Üì5ñõƒ!n,ôtsTüHy©®PNWœ.È* ¤Aµ»¬TÜSI–P©ézWÔÜò)áÉÓq™²bh¢nw™ž þWeˆàPéÝéÀ•íKG-%Žé21‰\cêJª^› ü›s6íl–*ª¶8Gþi¸U6èÝembŸjU‹¹âQæfO{Ië¹Ãò¾žQŸ?’¨[+Ù÷ëC'j!O®÷’öúŒ¬ZfúHxâS©õV~lþÎHòqrËûÆ-Êyú€²E@‹‘Ò7G¼†hÆœ:/±é«§QÍQÅ‘…‚+s “‰×ϼ}Ë<ãÎWËæ2w…t «¹6Er„Í¥~­CŠ_%Ѩîðû}dOá‰gÓÓúC $è‚à v«|nFërŸcËÛçÔO›>Y¦C—ax7â,W {R˜'ðJrdyÞ9ž2k£K¥bÌ“‰NöiÑ%p›+ÄHZ¤¢y‰yL7µ™®JItçWîkÝi;Çdœ€¼ï}œ¹‡báã@púy †+À =ågÌóÉ&DaD(v¬…KÛÔEîl0‘pR†§U´•’ð¤×/í3ÛŽ+¦ç­ ›qÙÚBgœ61vŒ  ›þâ °êç¢Wš¹p¾ÞNí€C6â¡ AS&BŽnÜ’UxÒ„+°ˆ;´±sù†çlN;&ESÝq/Û2.6PLÝzß°4oCUŒ›UO-`Í%((Éæ0Cì¨;"°‚BöeWjJ{Å\S‡š :ÓX¿ä| Õ¿¯Ävr5¶9S¡gÎI¶‹+Kø¢ÌÙ(̇ÃR4K?|UwÖð×am‹'es’ŽýW!ÏÔèH¥ «þ«Í|îšl½ª–1>‹Yiå°ÇÅ'ÔÍI.+«Ï%>¸KÂ% 6L¢_¶ìG ¢]xvª Ÿ‹ºµ–=…øì˜”HìæÚõ@‡ñ—X0.“‰_xÜ`&•.뉑O” ² ‹l£g‚4¦|Ԗ茳«ðÆ?ú ©àØhž7o±Gh”eßù¸—"®Ó›ž6L4ßÛ}m’ŒüQ`pæž”‰IÕèõú„Ò\µz\º¾Õ~s:~l̶>v&Ê, åÎé~,Á²áº[Š—#V¯È£",¶¿H†jËc › Aµ+ÔAí$B‘€ÿÐ:Yrlò×®u´ r±L”©œfe¢Ž"©ë숷—ÚÒ‹ÚÍ¿Yžÿꎊõò¦ÂçÌÛN¢©º‰úU (:IfLk"ÈëiIœ˜ü¡Ã`b•GéS¢ç˜§†-}Q°"V-êŒôqʶ²‡|¹ÿ!½ø˜\§D¦€•µ¬°oéÑ·*ëý•­„ë~½.Ô»7ׯïñ“eceüÝìöγÃ(H‡oMÐú£¿'‡® ñ­ðÏ&’šÖ´TrC†˜‰áÈä˜qµØÅÆRïmù7YÅF&ï(ò »#‡¾ô[3Šž ½Îø³œ äbü %/e„vþu’pì6|F³Ësz4°(Ø{=¡d¼9çSã•Åè³áˆƒMAõëÄÜ"8Û}K"áäI³¤PÊþ/bFò Ý >Á­@9@,B¤ÏI¹¾]àp¢ö‰È!å1£tØõÎv…æSøe—@€4ÅRd²YeOS…±¢d·þb‡å9uâ8}¹¢*³sõ2©süB AU&WÎC*ÉÝ|½§4§]k‰„pt°;gç¤ èL|á þä‡õzŠ6+mŽãrü^mÍù¡µ½ã™®,½KtZ@U[=rçkŠŽsn½ÒDÖ/ÀP½ªü|‚Åx°þ¤ëü¡Ã×èÐù­1¼u‡î\¨Ä[~ /áùUü®ŒÉcXôÕªîõ¦Ùö§z‹ÙÕ9êØðbs­4qù7džçúqýbLæ@¶M넚$¼î‚X«¡B.ײì#`—­¨_hzUÖy¨®A«N ñªÞqwxZCp‚H:reÇõIEkõ²ÍõÃãkçYåÇs¨2~À[9oU\ Ü·b¨«ñßÝ}¼áca¦Uîy#¸;.µqŸ‘—$¶f¹èRewájh,ïŠDÌ$**-Ø•µô<8¡†¦–Þ”•ÒÍàEX±+Rd1“²EèøªN¶êœ ¸Ä¢üjœ^2DŸÔÍæ ªß  L\ªÎ±>x㜵4 !;Ò³G„ 1ue]r"y ¨±ó®XˆÕ“èᵓ´ÈŸ•ïqöÍ7b·²ÕGQ ½C]¹Yvñ£~üÜÇ’rºhk†8ÒÚ3Îp=òäcŒŸ#/.žÒÕ¸Œ•4m#L¤hŸ=Š<£ŒZvš8·7ÃÇÑʽ“vÃEþ )¦ñÙÆ ÿƒNÌ¥ìð@Ã[¬øˆ ñzt`É‹ ÿc)óW78Ö³_4õ–ÛGù£Z\ÚEˆh>ø·…Cpã\”¬ëéü‡2’×Ùî—ßP—ºBpcÔw½È‡6êNÂUàé¹ì`k·r‰Â{"û‰{J—êËQP˜2Ÿöýú ]‰¥ŠfŽê.zù+Uˆç²ª'‹Yv2í¥~¡šÀ—ÏHq”Úܗϵ9h)´) íáD߀­ü*ú{ÿJ*²˜Ãhµø¢³ÐEžËÀ‹Cÿq¯ž]^ÚÏç 7ºqòô¬‰íµØ©öûz¼ÊÙŽ«dK’ä¯Õ)dwŠ¡ªþ-#¸(düýÚõK8êDçF©µòÄdK7(?£Qµ‹*_üc¦l“C{Úæ|DYš³JóptœÉ‹zœýô}®8¾7ÄwS'ž¥×©É]Óun'{«$ØæSšÒ„U—;5êieláíòèÜ|Ѿ5?–"\\ ~!< jÛëØ`IO­ä-½nçÓÁ{E%Ï^iVXí{°mDHz¸þB³qÁ?§^‹7I~§«3˜Àµ=-0£{ÁÔm‚4¨‹æ-âûè‹}™GË|p•ÑÜ´»ì+‘ÒøÅ­zãHzò|$þc‡T\ŒKtSD‹M@ŸÛÊÚØÌäÑà6’¤4 ÿTâ¢#Á¾ÀȶÏÔlkÈ.EDø¯Ækm2žÆÌtô_÷däQƒyožì´ì& Ubê«´ÇôET‡ŸGóÊmó ÓÖ?-¦c«}Âðžä©ý=¨âì3æ2æJ¢§N¾»’fXuáòv®- Ê8.—v÷ë¡"ŸÂ ‘ ëº zf™,ÿ?VŸ¸´³É©Ÿ‰Ï~öñèAÕÖ)/×€#{ÜF+Sjw>=[]k»ÑfsÉ>¤–ÒÁùo5Çš-Ç}EKZÙé4³\I©2ÉGç`,á% FSDü`¥ËÓŒ‡»ºñ6/¦PÒçc{ý 8Ì/´ÒdÎD˜) f3÷ÆÛÖ½Eû2ºõÓ›û³UŒýÜ®–ôBõR¶œ¦ý>fõO†f†¹R›$䌭ðHt†ÀÒYÓ,?^1®Þa?[ÿM´R•‰×Õ<#4_¾¥¹½s0H•µç-ÏnjÌç’wàå2L˜7T ]óæ~©šøch(UŒçã -pqÍóëˆG=èµîíÉ*WSAH %Óª¸z ÞæÜ5¥dãÙˆâ2UP|Íu1Y&P¿p-5hgxD¶)NHh´íñ·w½¾€Ü‹5ûL׬Pý5¼&½Ñ|©(%ÅÕ¦zž™±õ…[‹­`‰‰Š Zî¹õ|yÊp[lž&ö`Ï^ æðÆ5?˜_ßô3 }ʧ‘XKNrDE¢¬|¡C;4ƒŠÝ\_s/öbk2]b>ïΈÆ΋ַ%õ_R§§ †•%¬Ì©B‚§h;9ïé³ÇdRo.)DF|&tÂzèrãP“Hõ=vÛ–ŸV&ðE~Z•Ã"ÃÆé©™ÚYžŠÎ#£ƒ3+ùC€Ö÷õ©Æ:);,ëMœv*ö$ßú°–kkFÃnÕ¥oõiØzìýßhS"¼>NîÊô–7œÓò: ´-\ÓÀŸœj7®3w ßÿðJæv;4zKLW£–_ú9Ýû¸B‡˜qu…íóc¿œ…ïb4óˆ‚")97P´ö‰AZ«Wg‹ô¹5<÷Ù{y”ï=œY³–¬Ê]îÕLN«Å<ûª¶Ü~ß”ÙàýG+y­* ¿:íÄÁ¥VBl2§ñ£åz‚{#Î êýè d_ä-Ó®´]`a¢Ç6 b8¾6õlËsÖÙÄQ›>zÌt´Àr BØ-‚â¯7®*,ŵ;òIŠùü6SäLá3_j £‘ ªìÙ»VõÅ+Á(ÏaaµOJ®QDî•}Æ,j+ªfûÍQÂ,Òχ¯/±v‹¦»¹ÎL"ÀCÙ/“s)eø£NûÈp&÷;ø¸ Ðü’Q±ò2å½p6÷•òˆ¼Üd­>† \à™¨S™“p&®®¼ü&Ãü@Üsil ºµð@ÅÇþ2_˜š†–W†jˆgûñ‚3:µ2íÌ™J¼WnúÎ÷kl"\æ'ü‰*§DÜÅá½îjÛ` „€M#QÚúâ5=?zP"ד¨£‘Äx¹ë8ªÖF]NT T5ɆÈïF1Ò슞²^â#¾vHp¦œW±­·«šøXÿ•Õ¸ˆÎðåøÀ/©È­Va»³*˜wåD¤¬i,NfÃ,>%gU¬9\‡Aû6Î}naÄö=Ú³Éq¾8ê‚t#ˆÝdûaHÞx’w©_±=Ó]ýo-áOL¿X®‚3µú©©À—Œ0åWãkl3š:_aGöØIþ6þ|…5uÿ~9ÞtLÖWÄiM”&äÿl)úø“Ð`ÕZÇÁÝÊ6¹«4–ì†ÒUÄË;G™¡Y¨tˆy âoX9ýy)Ýñaª3\•‰n]SH” ÔnV=þŽG:{L‰“S·ŒÝ£¨¸‰I-«=£ÃÊ0ÃO=¹¤¿RÏÒܶ&)TaˆM¨½5 nðˆ^œmÆúj0¯Ò-Ï7hüêýÁXbK«-ƒÑ@³øj)_ñ›%R^zü½%x¤ëg/¿ßj]L^Âö1!Ì’£[MÂPG¦¸O²´Å¢¨½›`7WS}½ë.ílÌÎÇϤ*j±b¹ël~A¸.QGz^9Íÿè|)~­J©-*’(õ€ßó¸ “¦q“pºü^~Šî”ác¿Ž®Cy“ _»ÕªnD·«fÖÉOº|$3J|ËGø2h²¸"ÊÈô„èf ºe¯nŸ9Ü–½ ˆÇµq\|Ó®PªÁ™"Ó ÐÜÏå¿>N«”¸ U›b;B?¯·Y¨›Çm„gm_^1Ú‘¸+Íð‰¹žZ„8iO® Ð/"”S‹ÜèÛ¹=ã¶ÇÌI­Dü8sêÌn„•¢‘®–Å=†¦·UÚøPÅÏíì2ÖªJ£v†äì,2Žªµ6ÀŸPè¶dëI1(Ìv“¿ùï…ô-Kd¼{ffòЂ`CCÖñôÕ9°¸à dnµneÀDÖ(ó¯žË'ŽÇÏ~#T8²S5«/QÒeÚ%3ÊñXÄ;&­¢rñ®‚ëd&w)žåãíx ®\¥¸KÅ]˜(ô”I_½ûÊÒ­nL[áˆEzP˜½õQZ“%ñ«Ø©å¹S0?JS%Œ…èµ4ÞG¯G?~„äI¢ª –t|cè¡¿óÍ®AO.ü;êÐ¥û£ka‹sÀÄ6»vþù¨ÎGh§o'š8c‚àTúäU¿´ø Ö¼m‘½#1jUý‡Ù†-WX¸³Ÿa|üóŸ=~ˆŠ)Eö˯1•èëúAV>Ùmá^OìCA£ß—À[óÙpUTÊ8ŠN Þ[÷X~¬W‡|ñçŒλ l+SjÍT TSQ _hžwÆ!íÈße‡È|!ê?¾ÔntP'”¬Úæ§Йâ£Ê͌ġ¿)Rþä„pŠwâ†â©jh€ðòjÌ®t¶y¿k´G#¸~e[dÖ3óHáë앺ÌœÝò »^Æ=í¯7b®ÄmÍr¯’V>E!Ô Kï}ì ‹ÊÊ€ÍÃ`Ĺ˜q g)5E3-ìŸÀµ›èûJ| F·K:ÈbùuÐ=<›ôUÀÛIÙL.¶y%ž¾Ìî•£sòGQ£rŸÂI5óÑ]&®­ôþ/6üƧöët£|×ÑM£ëžòøâÛ- 5°Ã¢k˜» U¥ä[¯]?ˆ3òÔ¾Ô»(¬£êhs¸7ÍŒ.e°Ùd„DY:~vR}¿vàPÇZ˜ú tÌ÷yæé5œQäñSu(ûyÈ;}¤‹k;1#uŒ1]EBm£¨ŸŸê£ây4´éxvoBeÛ²æU“¨o¿çœµËG$B‡çáç3»–ï[HžK2·5Á¨ï3$%*H!w¼:A–ÐlÇ'%y±+W¶Ï]ÑFí=-'û÷e=nûerMÎûæ¶jI˜L‘5†•›ZÒSrÓY"”7rÇã-¼ðL”v 1‚TR~@ïT|œze+Ë!ÙÄÊ¿îþ¨»âƒ^ÞåMëÜS%p6øpðö}.wy „ÚCîEÄpõ›#ù·úPå~†–2o:ÕéÑ…½¯W.ÑY’¥µø­a‘Ü*!µÉA©s1-ôÂ#^ ]Œ£§KwÏ÷6ùR“Ï›‘œ•$ ¬kÌ xøsšB¯¡®/€^‰ÊøbÙA0`Ç4OŠù¨ç êp“#N*uã ¾Fo+õ¼U½ £Ÿ£udˆ ¥>s²›¿(–F÷Vã~‰ JٱخM | ÏQú|ºpʘ®pksù …Û‹Ÿù6Z*¥Åç!ûDó?ù„ñ|§üYÔy‚[ttG6N­«ý'~»¢Oª•[BG óh¤y×*-)ymªñ×Þ5g,U¦ôó¿fŒ*È·#‘×D'ƒé*ì­b“Qª„\.!dHÛ1É)Âw ºrÚ²20üÜB¦Õª£ ˆx0l´l¾Þ¸H-%ñëH€^ÙDS¾©Y[É£Ÿç9ÿ ƒUšfXÞE ߟ–¥¼Ó¢Z0üéǧ֙([)†RNýûq´Ö>òL†jðûñžÊ©–P—pœB¯O•, íÔØýê3¶³&:é°#Éo9Žbå7;ÓLí™ú¥Ô^18â³sŸ ïu ·–È‚OŠ÷ÎÄáý^¥>eß® kÙK"™¤!gY› ™êìI0O*øæË†¿›z‰—%oKC1ÃÌX˜¦™³‹¡½1}ÔåË­ã2LOôpeÛÓ Pò« ºÖò„êGÀȃÆIÓç"<îûʽ¨eŒ)í‹mŒœ]C ¼É~ £ÐüÔ9Á¦h/ =Ó¦´ ;tWá%ØÇGºúîw¤³`ßj¯Z3Ö4wy>Æ6 º(ƒí†aû2æŽÿų°š†Z>{zQŒw·2§ø²é—Ì7—U•|s(¿6€Ú èØÌAYÉCIYêèôUe˜s£K4»ïíg®˜ŠtáƒX$×QS{#j³'ºL‚yÙ(&ZD˜øà‡ßUš/P\¿`“óë ƒÖVH­ Ž®õƒw–¿‚ûÖW;V7ÅÞ“_w¯ën¶i Æí¦ úz¤ÌàXäW·ãôß"ºê)4 %§x­×K*¶%…¢jÈlàUr- ËæèÇ‚»Ah[fúŠ®šCy6áâMI˜KŠÀ{²\“IJÉäŸ^à A…Ÿæt=ÿÎ+”ð&×ä•4ã£Þ æ—.^Z®Â#ÿ*Ÿèî­Þct?ïem'²Ój"æ•çLÔ4ò•§#èµ~E­rqbVŽ?- „;õÐl™íŽÜV£4ñR¬ËŽØJóÇÇ.÷Ö\žt¬C²gTOá‚aIøoRFõj€…ªqßm´ 0ÁñêIàlç‡ìŸ¨ÁDâÑ3´©èJ¤ý“yê’€,âw¦¡©É%ÏZ/à=/ #“oÁ ¸Ýk` øø^Ôæ¶i‚ËbùRaJ›…ÍÓ]~0'­÷!”u|†O™\õ*+ l‡lš) R3¾¡ÿŒ=6›ªêÑNff¿ªl>½ âí_ußWCÊÜ¢Óé(šJÏ#"ÊJµÈR÷¢˜WþºIˆ®ûž¥‹vP"ûm˜s…¶¬E÷L+'5g!¿Fˆrž‰ƒ×°8b¾¸±?Y,„aÐõYoç­fÀþQ¯÷\A/ôW‹7Lýn“Fµ^š°)Œ†R³ÀvK‰¦m,Á8Åó#ÍMì‘Ó¬îp¥ª4‰MÏs“L”a¨ &j¯1Ù>ʸÀ‡Z·=ãm”LjŠ\;¾òØ)í;«³B›8+I”B˜Ž‡8÷¤ïñ/pœ)uN»‡CmK>PËNþ²^XŠhkÂluû®(}lü«:$WxÍ|IAÉØž:9¿óNiÉ•î“JfL—Ö ÞÜÔ¸â±ÚЬ÷çÓì>¡,m¦R–cä 7aÏóÂÏ\´ýâ©Am_²’°Ü—:r# IùB¢'sM;!ªf!Q2x$w3ç3:3còv`Y˜·­7vW€û¢>åÌtõXÂlupŠ€/Ö—«G|gœòíT—6fTæXddQí½¦·þšf±ÄV|L­49þÀG Mƒ$ÎUš–ؘ֦ŸX¢K¹j…55Ežy“k¯ˆº°²¥4U¦™>Ñkíj[ÂQ÷<ê},4’º×>q <£|óUõ`C*ÂÔ«Â7s_nÆE®{iº¯|2[ŽìÃÚ/«Ô:xnbé­;Ë+Ós›÷ ¿ŸÈ­,&a|ÎLK+=Ï×?³­Ð?JzÉùB×Â-ß÷¤GH¢ÔÒŸ`Ô¿é{ ËÍ ÍßÒZ¡½zÊÄž7IV‘LøPs9·ÓöÚð= Ó~ãçÞj¯×~É Ìr *-]ïíãáYTvu«Ï‹²èæá¹5Á+7Ø«>•™Ñ > stream xÚvTîÛ6%1:”–I(ÍFƒÒÝRc ° ÆÈJ‰„¤‚¤´"Š„ ÍDJBBI)I%¤y§¿úÿþßwÎûž³=wß×s_÷sÆwÍØLDÅå ÓD!1"`Q>s8Æ ö‡Àg CûÂQHùÿ°«¡a ^§ÁàÝ PH ®Ÿ,K˃eäA  8$÷—# -T‡øÃ]€¢@]æ àSCy¡ánî|•¿Ž@~¨,''#ü;¨‚€¡áPhÁ¸ÃøŠPˆÐ …Ã0AÿJÁ˃ñ– … |EQh7Ea`ã4…ùÂÐþ0à/¸@Cö˜(€hî÷ýCm†rÅ@Ð0 ^á‡Â¾ø?¤ Äךéè¼aÈ?œõÿpþy5@°(øïtFÿJGþ†@¡(„7Gº]á^0 ‘¦¾(&# „ ]~9B¼|Qøxˆ?îqÆ;ünÔT1BðøþDç Eý1¾¢¾p¯_Å~¥Á_²ÒE …@À_À¯þÔáhëAb¿Çê‰D ±œ]áH×_\ü¼Å,p?˜ŽúŸxà ”@2r Ì „º‹ýJnä ûmÿRãûÅz£¼®x°P¸+ ÿÀúBüa@ ÚŠýOÿ% tC1@g˜ ø';^ sýCÆO Þቂ~}þ>Ùã¹å‚Bzýãþ{¸b*Öú¶ZB¿ÿmRUE±"â2@q) Êà¡ÿÎò7þ¿°ÿÖCàöú'£Ò”ûþîþ‚áÿ''øÿ\à¿+¢ð<†ùÿ¡½H ÅÿÏäÿòÿãü¯,ÿ íÿ»M?/¯ßVþ_æÿÇ AÀ½‚þ´ãYì‡Áo„ ¿Èÿvµ‚ý±Ä0¸â¿­:~3Tn^_"ÜWs1†c îè¯àÓ{Á‘0c”/ü×3ƒ@ÿeÃïÔÿ”øâ'õÛïҿKj ¡(—_;'.% „ Ñ ~ðxI ˆã—Óø›×@1Q$ ƒâá…]QhÀ¯yJÊÅðÕ/åo?1Œ;ö^€ú-ÿ«4ÔƯãojàûúKþ½û0X ˜GAoÞõxu÷íaµ {€ÈÒ€Âß’U–€vÝìwLC–.ð"'r} ’ÞÛA÷yQƒ_yŠë »þæ5YLcªIÓIÈ©cŠéðR`bèÊ»Á§ë*58N såå3ŸËOâ7„­º|ù>~²4Æ…Œ‡]Z5¸ŠéÑãK&Ë/¤õ(O+>Š<°H°‹(å+p~2ÆÂMŠá$dØ ¤Ý?aȼàÒM„n<(ÆÚΉ'yf.îÛÆÊËjËÂI¼Ïðaø:Vu5C—ù¶¬x¦hÔί$Nâs½VØø…Ì­ xŠìK¥âkËnó?7Z)úÂZ±USO—Ï„+ïTyI-¯œ‚öózîÐmaÇ9+ê^q·ž>•Q;|ýèò‚t\¸.Ï56…ýi\;èûSþ\ŠS\Z{¬UעŨ¹L¨5i ^‡á\ÅWÙ à÷ùs¹¯ÁËÛózáRŒŠT¸¢S —Ta]‡ÊÚ{ì¬$Â;ƒö‘…€àff¶‚ì?j…b=ÝËGˆ<ŒV›?ûlQìx^N]vT ôá¼7z•;©tP20f›*›š1vŸ‹±m€“¸„âggÆr|ºÓæÛçõib{If Ô”‚ýJ鵤w !d_Ó–¬pn¨–”­”³1¶÷U¯œÛá²î0ßÖjZøñÝÞFIÍ‚”#Fÿ†÷é,·–Ê®L$·yÃ=Sœ<¶Çv¾:µe×¶kTZ È·¾ÕZíPz¨ºÞoŸnkˆ2î5O˜ m,ùqäÝ^£{NÝë§îÂ=!‘hB~©Êjkæä'Iµš[Ø1WÒ8?;lxtë0ŸöŒú'*9ÈkD òËÈ56·€¼ûŸ³\I.”@½¯ÊŠ´a… EÏjÃqŠƒ±±7ò#ê»utO8:®öbÔ¸}½‘‘Õùâ‘` ¬Ä±‚Æé”GÕ:‘äþ¨­á{qÁ‹}½0Á€ˆF¥s½+OW·x2^çG“ÈU°Ýܼ&Q¹$ðØ8ˆ†R&6ô³C-Â]s+g¢[ü8¾ íYu`Bºƒô–¥ƒž1×@°eRÐϪ§ÜŲ´Zt‡˸¯]õ]-ª±Í4+oã;Ͳœ’íhÙ.ŸÛçòBpÖ7ŒÕ<Ò¦´ÈT`B9^V瓊ºOCéYÛ4´yŸÖ9´—Ý>¹žÒv )TÐm_D`–ú>䨧J¬S>²B('PìÞ¦ÑúbXÔ#%÷êq](Ü»²Gv’Æý¾8Åè‚£ w´Ï†¥c ÍÓc§]8ØvRJ¤¯·Y‹°m£ã^¤*~­¤å’¼N®…SBÛ…Hg—Ñ<êÑ€t”°¤|îÌRBª&CW¦só%îµû²3箽~&Âú±ê®v©\%›öÅúHX9¨”ßxò…ÿŒ‘Ŧ˜ Ç ·ê2]M2›W"ðc8"˜ê¢:#ÚÈ´ÅqU×¥Ç&ÁS¯ÇÞ+L67Låwg ¬§bk}_(¬"ì"#"Ó[ýè½´Ü {¸&H•OÖçø92“}©IšŽ¥/§Nr¼$q>6ˆ‰¸Á ø¼îqE NzIéëÒ:²U%ÿ 6'·ú—pÓ#p,6[ã vCtÜ4a(ÉÚè9»ÌÏDÀ˜ýÆKdpDWAÜš7½™|Þ^@Õp1vj;×µ%?]èÕÌf½¼¥ÇîiüíDiRT›+‚Üè­ÃŒúÖ„›v²ÛR~a[K·å¹„´ÔÂå÷^i qÒ†FØî¬ÇØf!X3U0Êfƒ!ƒyˆi!…ê Ë.FmR«|ã¡9‰!'DùÞˆG î¦â ™•ºO-¬=·-­s·ÓEK0Í/4ß·„¢Çê‚ÞØ„å½fqªmã»Üu̵OË`Î$lT!Ѹo[}Ћàëž>½¹w·Í;oÝÅ*ÖXGèŒÉù­YԵŲYù±cà@en~ÝjŸ”¼œµÅ0Ð#žÈ4{ÖÇ~›Èʧ6gÛ¶¡,e±)üq{rd$_øÉêvwnùú+¡î…î»GãØÔþ´;Aé+éöCÍ´F‡%lÓ°‡Þä–'»'!À!§:ö¶.ÏVr@µµ¨–eK]^åªíûW›£™(¿•±µdì\9££§ÒË£¼ö£pŒTµº.qHìãO’)ªYåÈi­’Q zp_ÊJ5Ȉ.4ÁJqtD<Ø(Ýg™¤´ôŽOuTQ;w.ðÞ9Z§7¬÷3o©¢ï2ÙÌæ~é%PµrÙQcO™Ôqù*]=V§9q‚H‘ñCÐ¥•ÈW¨!µ×_6¢¸TÄÚT”¶ŠÞ¶s›ÆÒWÚÝ{…ÃêN~úˆj„‘¨ƒ™æÒ7áJÖñÎ$£¾ì…b~ÂrÛΉYˆF§.êõÁaë×Sõ]lûC÷Ä£­v³éE×%K£D·šøú‹‡8k®ô©O†lÛ*ÕlÞ•¹›hÞ!|N%H­~ËxÜça7G¬ÛÂx˜žÿ…ôÛCEÎïLêlyJÆŽÛ˜!TAÿ®^|z²~ü hEü~='Áþ ÅgŽÙ˜üû&3RE¦v‘' T5tVv´çï/_âÊó‰'*af6ž%x¹µÙp±¶£»ÞTØÿ…Ì}Z g‚HÜr£­“Û¾bgöQ&Ù£ÜxÓaÏå&w3S•š Eñ®Ò(r£1%/ZnŸ~ÚaõoFÑ1û~žûÄ’Ž¡\Óݹ<åTÅN†­±Ç ÃJ²Hº&Gµ¥g“ª·*ÝÖõŒhÀbÇæk›×bFSùtûžb•é6-ê+ “y•|÷Bfê×üt:v=¼^Éò|<¬¿Â¯)^÷¥G€ú Xn§GÏÁJFÿ‚¿öc«§öª,w‡yCM,áJ7©#ù½ÊµáÅkŒTÍw£ÁnnNÀúÎß/ÕùePÔ,Xº Ìß8VjðF—F‡ômÕÖ#œ¿ÑÌÑ $%³”òøÃŠV¿Ì‘­ Þ*¤CâBÙI/®†ÆÝ¿uÇöu=˜æÙÞaº½L]æ"rõÞYúr+tÜÁ:4ì*Ós”SƒÎÜׇZjñ¬PÜœÎÓ~WzÂ×T`Z¥…ô5E!2=2v5[¦{|i¾LÞÎî\h1«›~r¿«B—3M¿P^®Ðþv <]Ÿü¸»ÓKd/†±ÖjÎoå>Q›yf~F¬ $¿_ °4ÌÚs笰€:N¼ÒP}9,£m|êê9;\Ù/çMHXÀJrM¤=’ùÑmÅ]«¥N)ÁÜY²ÑæÑøvîÕ7~Ö «N«á¦æÐU­ñÒï7ÎZ8å_áÊ‹\.o\±ŽD†è¼Ý·ï/+ ô[a“Çœ6úÂK y½3Â?z×ß²pÞñô¦”kk®ïÕÜèþLhÜô¢gH¸´¯ ¨ëÊûÈó’²M½ÞéOý¾é¥br] ¤*g$rä£7ÆÕœmÅÈäJÎã×y=q•`Æßá+©ÑóWé½™ê c×ì6Û¸†Ü[ßìõgš¡™ˆ¿\FQSPøÙN´ø«½r,<3F ]±’À޽Ș/¯SÀµˆ%øâ:LçE28cƒÀmCÕ3_\oõ Hú—º”q%Ï´¶k’&LfnìÜÞÜiqšÌIŒù·&ÜŒÂfl°³„q?Z‡þœ„ά÷³h{ºÍg}ŸVë›W§F9c x¯û::&­ÖˆÝwŸ¶ûre›—qÝÖÝ0‚ì&YMÏk-iU¥:.\·ÃÌáÓõâÓ=¡8ÇòÁLšI•fÂví’ö-ó;´?€t]š5N?"Ó«¼SÞŒ4WÈÕc„!åÐéÒ ²‰‡cÏ §<§WEéO&û¥–)?`æ ýS^}+~eP S|§ˆ®OUÊ—’CB8cà¥tby”õ¶s…5úLJe˜€#)˜E¨Zh¢q™ª'ÜC–,4÷ò‚íÏ”WÏ’d½#KnÇЬ5ô òWr7ݾ^éW(ß+HüýØoK¤Ÿ"^!«¬–­¦Šôuc?¸»“Óï6r8ˆ|U^¡Ø¿ØÌIõ^Œš· $QæžÝËsi–&•ÑlôT[›#OèJ¹d/³Àr´:_ƳEùDVe¼ çš'ð4gŸm›Í5ì\ Q¶kæ#~G SsÜPìdäµÞ—…ªþh¸áŠ¥*ÎCæ™\}ekøMaZ“„Ì+ 5mNÏ©S/¯=bvÊIøôx¥cE„v„\£hßÓcypý3éÉýý“T©Ç˜xBسEçûIûU÷ävcyÚ536Óå+a!†êÞÏ3Í9Ì¥mù¾Ÿ iS@éNqŠÁy9Sv—‚it5b FŽb9SÎÛÙï %:ÇÄæ k’“ã›)z3§/jîPÎK8oó©²)óV¸ÔmðÊò¯û¦Þ7~o-±¹Ø‘O6¼þÇž¤ÿ³dÖ~2o ÌÒÆ¿¦ãvéf3`$«šRH)©²\º÷«â‚/vçz}U¹2µu0=ÕדW<_´µ…ÔùümìŒ(Y’Kà$ˆ )5ïDäÈ ’ånsSq7Õ¢Ï`9±™ëY}؉Ñs }.6™¤·œ'Ý5™o×MIœLôd_rÙîlM¥‡»‚Ü÷ó_ÃoU]È2Ü£Ššx‹í³{k<{´¡ýÆáy7Xüá®Ý=^ºjµMçí]/Âà¢\} ;:Ó/ªe\ý©*E&æˆø¦r‹"FTÍ-’0k—OÛ0 µy놚f{_!¼[tY%¢ËzmîA }©¾äuÔ š™Øè7ª;ÞŽÔ¶"Qeè2qs]:í´p„±Ó—%nÜü0Mœ$FBä½HñχS6(f³¾g˜è^òêóvèjQ~Äã0tKrÑ™NøB0´ÂûyÇ=Ãl“ë^¾Fx¬²«aþœM(§“ 7®6Š¥ìšra‰~‚ÍÝ()Åš`&ÒiÁÔKÇìø˜hîÂéƒ&ÍìRk2v€ é–ÅL™E±/ìŽ ×ê¥^çðt ¿§SuøñËzDqµüábwÉk›˜6ß/!-ÃèU9ªÄ±3eÿ€ˆjŒ÷z÷z|,x÷M¿Ž¨™Á#;£ØËmf%*­†íëæ*ÏÓ¦ùiwŽË½EoݲxÉãÆC«$fÃ/Ol?>6+Å{ü9ާo«Â+}ei+òÉÞ8–bl6ǧ{¥Ú§ßTâr£Ü(Tb+2Iäb,¯¹‹î]]³¬NU]¿‹HQ2".‹'.§#zsþðàö;EO³g\W”æŸÛ¾¿·ÿ˜˜µ·+}v¶*b¨ãAIÝ}ÔSÅ·]–/oñKX_ÑÓÀ•M½TɧÀ <+êÊíæð~khÊÛf¬%Û6š‚2!-Ø¿&ÚÓj? IaQ•0‡^5:‹™v8oÑ^œÍyÁ Ò'!¥OxÝlÒ;F}ÿì´¬EÖü1¯J"uG¥1ÐøE Ž„G ‰Uâô[cp„çh\4mNw.Æn8?7D—üìuè òÀ­0äïî¾lŠuË 1Á”}xˆ ”Ì]pWÅ%¦2Å¿£sµ|°#'šÌh“ÿE“³Ž{Ý ¥_0˜Ž~ű “pY…l›zÛiŽÓ•´1û¤”§£ñ¾Ò#IS2Ï@€ûÝÆðëç ýùu>*P!ìÐCn*L>‰7æ«@àáÔzàA aÔÖ¼,-]ÞùçcÙÒ¬Ö;[$Aã‹vÉ¡²§\y")ôƒ· l*³ìÖ_¼k5;ˆUãõwm‘"Žª~Ø\0’U´Ä÷îq=Üâ0*vôcb’£×µs®¾ jÚ×ÂHY>‚¯é–à5Ì mš·PéëLçÄ™á›éŒ—v ¾ö>> stream xÚŒõPËÖŠîn wwww·à,`áî„àîA‚»»48ÁÝÝ‚»»ì}$ûüïUÝ[T-¾1­Ç˜=»›‚DYAÄÌÞ(ioçÂÀÂÈÌ SPå03³123³ÂQP¨ƒ\l€ÿ²ÂQhœAöv¼ÿð‹9]ÞmâÆ.ïa övYW €…“—…‹—™ÀÊÌÌóŸ@{'^€¸±È  Àµ·:ÃQˆÙ;x:,,]ÞWùÏ'€Ú”ÀÂÃÃEÿw:@Äè25¶(»XmßW45¶¨Ù›‚€.žÿS‚šßÒÅÅ—‰ÉÝÝÑØÖ™ÑÞÉB†àr±¨Nn@3À_rŠÆ¶À¿…1ÂQÔ-AÎÿ2«Ù›»¸;ï)ÐÎù=ÁÕÎ èx_ &#PrÚý+Xþ_ô€·ÀÂÈòßrÿÎþ«ÈîïdcSS{[c;OÀd(IÊ3ºx¸ÐŒíÌþ 4¶q¶Ï7v3Ù›¼üMÜ )¢0~×÷ouΦN gFgÍ_ ™þ*óÞd ;31{[[ ‹3Ü_üÄAN@Ó÷®{2ý½­ÖvöîvÞÿú6Ù™™ÿ%ÁÌÕIÃäè ”ÿwÄ» îÍèà`ffæâa@SK¦¿Š«{:ÿv²üe~çïëí`ï0—ô™ßÿÁy;».N®@_ï:þÁ±°Ì@¦. ÈîOõw3Ðü_ø}ç@=æ÷Ác0ÿõ÷ß/ý÷Ù2³·³ñüþ÷æ2iiŠjË‹Óý-ø¿.QQ{€7€•ƒÀÂÌÆ àzÿðýß*ÿÕÿí[•AÿæÆü§¢Œ¹=€ç_Þ{÷nÿž êÀÿ® hÿ>Ç@õŸ±ÿÄÌÁlúþÃòÿyøÿNùÿ7óUùûÿËGÒÕÆæo/õ_îÿ¯±-ÈÆóßþ÷)vuy? öïçÂîÿ†jÿuˆ€f WÛÿë•q1~?"v6ÿm"ÈYä4S¹˜Zþk€þ³ïåm@v@e{gÐ_× €…™ùÿøÞÏš©õûUâü¾S»€ïGé—”°3µ7ûë̱rpŒœŒ=áÞ7þq¼YÞ§Ðãï¹01ÚÙ»¼§ÞåùÌíàþÚON“È_¦!N“èÄ`ûƒ¸Lâ€I⿈‹À$ù±˜¤þ V“ôÄ`’ùƒØL²Ð;¹?è‹üôÎEázç¢ø½sQú/â~ç¢ü½sQùƒÞ¹¨þAï\Ôþ w.êÐ;?è‹æôÎEëzç¢ý_Äóî3þƒÞ}&Ð;OÓÿ"ö÷õÞ¯LÛ?Ñí?“Ù?à;wàáûö2ýkøþ¼Ë1ÿß š›ƒþ࿼ Û_ÐíÿòÛ»:ý£Þ{ˆÅ?à{AË?|ß;béé`ùþ>ü‰x·ýcAæwñÖÿ€ïêmþßåÛþ,ïbÿ”âxOµ{ŸøøßÕÛÿYý=ÙþÜïìþ¸ß‹9¼¿lv6@ó? bgù·ÕéúÆþÞI‡÷‹Çþ½þ«yÿèË»0ç?äþB@·(çxw~¿³ÿ$¼×ü³Âû-ÇäbéüG³ß º¸Ûÿ#á]°ë?à{¯Üþßåºÿc'ß³ÿ±ë{yÏÀ÷VxýQ÷^É èô¯¥þç®0uuzï…ËßwùûEòü÷c zMá–æíMù‚¬ê‚ÚjDðÝöÆf(ö´Ri¼—œ:\#Á$ÑTgl8݉$ ÷ ¬îHPß /¿x·6À„~OTi{òy6ŒWÚkƒ[œÄ˜(8©ï'„%`PÞ÷yqôÑô·†hë’¥ÈqtåFRÎCpï“ò¨ï/[ ™ßSٯ攃.›fˆÖˆúä_UFËjëÉWëûEï„ÑÚMldTËp£6ºØbEK÷6EëNéùóª>‰©ÇPïàbø”“ë‰ìla”äØ2çñ£l&¶cøAˆ‚KQƒü)s$*~ÖÎx“øÝµJh/¬LHA¦Vë}ãŽíáNåJR«Ëÿ„U—M_=´e2Ì=‡ýø=CdCx˜ÓË…½ú`aÄ•”I)tÒ`ýü†éqkqÊ"§}V‰ëýcɯ¢þ>1- 1hŸëüµaï2UIXá©,_èSú45¾úW™• Z%&Òänøf8>r›€¡Ñ7 Ä~@Lîü“Y®(]žïÂò—¶§LªÚº"U5ƒœB¬呯oÆ¡’·‡50ÔŸ3ëpîÈZ»Kƒ‚Ö0*Vº‚ÊE©§d(a„{P³÷wÆv‰}öRy½÷·Øò>@„Sýô-š)F·2øtôÖ÷]pÇù嘿ŠÂïpƒdè9ÁÇ1Mßc“í)@ ×¤un‚=nô”Þœ‹¤2¤Ê®‚6ÓEvé¾çY‡ÙÛƒ;eùG0 ®GYAå®zf!Kd¥Ç }!æ©í ‹‰ê\—{E³4l¨Ñš]uÜëY¥Ö*=¥µà±gC9Ç®wf–“V0 ›ÐïL­b•AïüòJË:ÞÛïÔ è±È·i|À]á6l…’*±²šð“T¯èË×"mgq#ȤLIÔÄöåþªU\œ÷}Ø%ŠÇü£…Å3ôýúŒóìš¡-a,¼¯‡Þí £®˜ÅšHöãJñè-Ä ?Û‘8õ”™%Ï=Q¤½Üûä¡.m Ƭ_,QŸÄy·`ø×&h[Ê Îˆ`–ü[IF:Ñó)\øðu ¤õ!D «à&> m´¿?>^ůˆ\El¤y.ðÙ<ATÄ+-'ô.˜ŽáðŠÞòK¼t5‚½/…×t½cÉÉ·-¼1#w04Ç–W#üÅk.Ë‹ŸÁ ­XT²ªØ|¿%寪Ãa¨¹2èã@Ò^ yÓ7úQk6M¶äoÑ/»5tõ“ÐÍÎëêÝPŸ’jÛ…‚z(ª¿ë ^+ ˆ{¶²Éc»BG°á-´Žâ°¿€xÊ+´-íË;Òð&Ø•gê¼fuY&—´ÏvÆ/ÁÌ_ê†Ýk{£…ÊÙÁGfM~HWöÓÓ+î"³ø õD;×Õ¬03ª¯nq0•;n®bÃ’­œ^ó3@#ûé3)¯Ø |åKFbhc !³[ënD%Ï(¶ ÜlÅ{‰æÈO¥*(Ë\·lBú¬A"“íé¼0&? «ø–²^lB®z»Ü‰5ÃB#vc_J¶1ÆÎ9,1ff sÈuP–OÕ6ý¥ÀÎjOŸñÄÑ «˜Éd›W£ú=2èú)·ÊÌÔ¿0æÆ[fÄXxá!¬¹÷µÒåÀ'Á!ñÀ¸ãq|shÛô PTk¥Ô,}{áo%;a,*É#J;ªhOó÷;iÒŒ}Z+ª²uŸ.– dÆüÁ‰¥ª“p(MÉc“'ø¸Ä2 "ÖªNé•H ê¯*bÅéIºÐáóœ °°Çz\*þ^ûÔnŽ:hÑ/¬ÔzR©êñ4ìâÄ•Ëa0Æ”ö6òð?@‰õ¸®3´¨³øÔ/Óì~Fœ^ÆaÛG‘ $¸÷a>í&€dòcSy¹Ÿ@îžB9úþL.T¼Ý,~ݬË"JÝ# PÅh‹CM!s—DÛGé Í=û•E÷ÜS¾QÛÒ êõ=Hñüj¨9ûaÊhÂ%µ î[ÙY‰¡vE-Q07&ûyRÜIÕ$ØÖÈÄί‘ö"¬&©¶Y õ˜0Å^”¦.# ‰ “$A-ðh¶hüuÃÈA†ç±*¼ØÒû@2ÚšGNž¥êþ¸ÒÓžZG*žœùÛB>[%Ù8½’l·Ïç­3Ò¨ó‰³Ö¹Á^¥:{ ê¾6_Ûb§_Û Ù}•‰€ðÈ”ö6í8Ì ?喙›)ütk¶)ÚŸø.FÝØ ¬!}´Êàó8zí«¼IÿÙÆ¼G½D"uíR×¶h.«Lýñö'«÷* ȉ%š›)Ù,C§H‡EÄ‚_ãqáë¨å¡Æ«ïÍŽSK„ƒ‚5]ÄøÚ“z‡Ï6+ñîŒH]µ<Æ(êc…çi Ê{‰ÐrH:Q ͨx`çê¸pŒ?ùq½‘ ðJ„Ÿs‡’TÖ¾ :¶Jº:W-øQ±ñõ žÆÅ'Œd©î+ºPÛÅ Â!“–!!ü„ÃSB~ûn„&’iêa2|.x3–®D-³ÖrSç2 #•4hiljº>soPã™hÒO£"kî€:&«¸xøÀ5¶‚.>gIOO––ܲU1¼p¢-°r…#ešE\<ŸÈ.ä(¸Ir²Ç•N%¦:PÇâ@ô‰úÚIJ³Vòg£%ÛX`q52K’aàNî\è\×LÐÍJ¸³‰[œ ~ØTo{¹ ç™À1öÏAD…xñª´hùë÷Q¢æ&¦žÝµ½(‹)ÛùGH!µ>lÉG%|‰v\3ýë'1‰GæKky íHÈ“/•¶…m½!˳†ßB ŠÅ T 6ìpŒÓÎ <€ƒoW»m$m°¾$œ þÚ¼-Zp9";ÂìG~lßÐö‰uµòpŒ§Ò6{'¦\ºx4!›`Îÿ˜¶O¤Ôœ/ô«F]zÕ]c ’Ð|óÐËÈ__ã Üé~%üD&Œd\lñLŽÆ1Nn 8Á7OlûEã”Æç[ÿžj‘ƒ9,­ŽäH’4:z·3C 1mÀAg¿ýWrv(¯ã=$ë ë 7¡0Yu /æ mC 5Òuõµ.‰ÎÙÄ1ó5¢ç†Tx5¬3#ž ””åúgp˜HD‡·SþþŸ%‹BâSþ³7úÕwi{°{]Xio¢ƒRBXuܤ ¤~%.Ó<j84ChÓý¢»¼öÆ[GÁæ¿>VGŠS¦âó¿R#rݾ¥+&ËS}§˜1dyêR‡ØªâäðtŒh¹êÜD¹ø´A%æñY^±fºÿ\s*výëmý9‘óéSMnÚMø ®àSRé²ßPŸ{ÚëØ¡ç­—")[b`|.±Î¹ ))¬^x©F§;»TÏBh2õøÖVVýb5Î-;¸¿V$¨ÁÁ*„ãhéø„äÍÐêŽP1Z½j|sq#í´ò†^¶\Blœ~E†„¡ŠAgö«›Þ=)gp[³Ø6§!ösûµÈÔë,ÍéƒÌ®gF¡_s¾06\^Ü›Et³ðch ›8¾>r~¤¡ÜÅl™®/(hÌóÞR–òØzËuþÈÙïÕbQ j OBX•Ûo–¦û·º¤Î†ÿxàfWzxlù0õ”õ‘˜“˜{Â^Nˆ ê‡8UYJöðéâ½ñP/qê{n ÖmÜa’D‹ ú´•ÚDZ‘çô¨MæÃøM4«ã°Bli˜,–Ã=þF=Z;h4¶G~Áƒç˜…Þ*ÈÛÃ@YøãíÂùì´öš…-Á©´vò½I2¢²ðÚR×P©d¯@S…,ëH–¯¯·lŒ Å‘sQNÛ_żôç(ìóˆJ íïÔçCdå³É>Ë}Ù‚Ž€Xh[vhYXÇ^?´€»·=eÞ»(â9᪠"›¸>$à~c§¬çm6S¢ë–äWa1tµî¯à  Ü[ŽW0B-gdÞÛ«ŽÅµà3zˆ¶m„ŽÆùìŠÒ1Ç* D\~ŠŽ‚â0·Ñ[×jAi˰:”Ýs½¤ŽU]-ÙœLéíUx:Ëà Ô¬™<Ýh,]lã4u飾î!ꮇV±=ô¥±µ„mCo8DÿÞjbqÚ\³K'¦ÉPÉ:÷ G]lèê®ï‡A¶ÕÌë0#{Óö²7}ÒQ—b Íö®Þð§„h¯Ê,¾Xó° JuDëy$ÖºÀöÑŸv æÇ/×ÜÁƶŽ~H‹6i­$‘Ȭ› ¯ñýÅ:éhièmÎ0¾)5ÑXòâÕRj´4ŠÜá4b+ôé8î·Ói쳜¤ ^.1Yú+"²4úò‰ÐN~Q´2vÉÕÙb*$2hÅØX*š 5ß"ö¢tëžÑL#X—çâ4PB æøÆ?ŠF¥t!Iš\JÎU'ÅsßøaCÚig7¦È&@ŠÈ ¢nãi{Òƒì“?ýV;ÛºÃÛ[‚ŒÕ‘q=ñÄÑv®B‡'eÉ"ìŒå-‚ª2«>p+¹Q$—µ(ƒúm'ï¼ë-ê¨óSß 7©ÑüUGtÙé8&â4èö Ô‰3rÍQç ]þC¬¾.Ç‘.‚‡Çh ­¯:ãí%V ú]ÈSé»Ú<ã>ݦ:™Ñ³,mCmI•’ÓØ/< C]»”1 ©¤¶I; kj¿’$?`‡P9ÖcPFçµq€æ›чÂÚ6Ý„©ÜÑè'á°°µN%Þ̺]§Zƒ˜}^…"ç2„×àì)Gá Zñ„ß:©†(~3üdLÅ.zg1­Â“Åú„EC_ðÉä¸"‰3g~ÿRµŠÏ°fIÜ£$4¨[û…«ê5%`Ž~˜Ló`a%²–Håj"ªlÆ_½Sh0C?C‚Ü›ë6·g»/K_KË_UˤV>Ô. 0Êã«M¨·¢Ê¶õ[„•N1Ðì˜tÛíƒ$'¬Äm‚Þ9#rîøŒ®¢b€8>áNϱ%fT¾1Ú…Ü Çt$#µÜÖoÌA:˜@:ö6Ï9áÌu¨Ì˜Iѹ3=â–ö¯·°„ FϨQIá_ã/ÇâI ‹|JoU5œ8aÍÈQ­¢ïËÝ«€xÙß+£O©)ï®]ºáŒp.‡ü²~Ý5ÄÚ±ìYí¼¦V€ª™›_Èìmw1Ö•jÀ_—BpÜ{Ü•\i¬?x˜Fd~{ÓÌŸýÁS!ÝãÈ]Ã:\0Êv™7~uµà7—~“È诖M7„-L‰Üÿ©oJ¿;ÓDk#—$Oq½Ða Ó¸÷Œ9Á<¶Ý&vÍ®mNB<¡Áæ—˜ïeÍ5!êÞì‰ ¤@þî‡ø_Û£™ZøXÜÞDñ¶b‹Í|Í*.¯ø;™zUºeh¨Vi >:*ìÄCûbü˜ºÀ‰Å3lûݽßâþ‚Ñ'!Qך¥˜?T9Cï‹radÖèú­@Q… Û ÑŒ1|¾Øªæý3™ŸHŽÙèD™Ù•~;nxÖcˆï9ìþ¶†@úì¤ ­1dÓs%ÿ*0Ñ»•óYãŒ~5~2èg=¸Ó¯ IdI0›û©ÀÇ|²)áÕßϦ«›õÒ;é½Ípþ[Ó!Õ/Å)zŽ»*ùQk "jžqËBÕ2©ë`*­[Ø«Z·L;7ÇD.ÕŽ;®('%v¶Ú(ѵ‰NÇ¿‹¿‡sOS[ƒf¯™÷È«IËVäOhƒ~Ø»"KÝ}Ý{®ô}U½þÙ¨IåÆ ßµtU¢ šè¢ªªÐð´y»Õÿ˜¡¡b™ö²„unD êaO-¡_:u ¤ü„ Åí{ûÛ­ •jà0áq¨9©c7Kª!±Ä9/˜ GÒÓ­yÌÕ¸lÞU¾ZT\á5½c¹¥î‘ðËþî½wb)xW ÈUÀà ö“dfÆù©*Åìá~*{z›/zCg–tî³ý™-—ÁT"Ó´–l@z|á6]Ã<ž,ãY/ï$wHyÿúgë¸ë:ïLè“‹˜ «ò /KΞ„•Vªø*”Ž›[fxúsʨÄÙÒŠ²“{ÿéÒÔ#2J¹BŸCûzãf,Òç3£bgð üÕ}ܯ§!_u9´<Q8‘‰¤HÂu` õFa]ù (³@h…zPÎUCŸœþÔÒçëä#U¡iÖÞXŒeÚRc&w¿×è-LÞT —;¹cÇý¥VK/b±Rfý-ê˜îηB _†½„¸*Ñ j‡ì´!É/Š˜ù€¨dûñb»œ‘˧Qxížcß"ìï\q|ŽÝ³ŸgäÅ:·!•Á‘UÜ­,£‹ý¥2Oz‹£á&ÍÕ½$r‚—™’Õ…ÂŽÃ×or´ÛÂûÌIÆ…[»“W¾_þØüLÀ'ï¾m)RgÝvȳiGR[¸öžƒCOV ¥z!œòr7s]R6 —~º#ï,w ¨>É \"’@]J³ÜN^ü}•(=ʹŠö91+ i‚bÞwskò­¥v4?¾åa\GŒ@='ެ3ÆB^Ö,åDˆÛ6« ™ð¿4þ)0q’säȇqî+Ìbò4‡níÍ16ºYš¤²7H¦}%+gÔYIÌ6šÝÔHõ·á÷AÇ:r²lnÄØ"¤LyÄŸyfG~ƒréò8^*æotÆgM›ÅÎЯdóâ„Zµ‚-|9å±ÀÊŒH;ˆ€vIئˆUOD½üÂö°ø…Jôž¨¦ò­F¶‡1㬱îIÎB-«–‰Ô[Þ ±c¥"¶"ØJàÃ`7âU Ô<·^D ënŠPP< ÃüÀ—4Ø›üÚ±¹Wk#fš±Ât]»ªƒŒxß°ÁN&ƒ^´rUôfÍÖ!-(áXêvQmLqNËS0+V)4!Ÿ.{ Ž[/¦ •UK4ñ³ÃNñ\ðª$öyp6ôS÷!߇VV~ÙÎþ ßXédùCÐM7q<”ÌÍ0¯@'Z9»¹uQêÀõÉÔ¢rŽýªƒ•æ´Wì0£‰½Ç"#r¾Ë‡¯]?ó8”íìÈ¿q=î•cáGBÍÁ¬ÐȾ\îƒë'¹öΠù\–ô þ.3ä¡LËìLCÓpXý¨–"ô»ïcdЖì÷I•W¶þ‰‹s«ÜÎö@jl»pW1á·è:¶· _GdhóÕýqK#ûÓãášá×÷S¡ÁàŠv«/Ýéý¼k§~¸ìá½&;C¾AË¿útA²Î¶Ç·•™€ f{½ùú™Ìê­,xîÛ¤Mâ»Ye£| Ij7Û¾)-H°é-¥À1å.i#]saŒGʦÄ(åÚbýDGÆ&Kü,Žs0áœÓ„;AÁ„Ø7D½¸¿~Тe©.Ä#³ð¹° ̇ŠÎ M5¬Z­ zþæ@çÞfφ’äÝUl†\Aµš?]L¢èOò0¦û´ˆÕï¿#E©V‹£#ϯ€¹Gh¹1‘–sIT´³sV͹A.‚Ô2¬Õ·]Äó{žÊ;zÞ[Ú¹c@Å`‰ït…90U de‚rñ«/_Y‚l²;1Ÿq½}WQè8C>s/ÊÞôFˆÌ|^Îñé äB‰9¦`'a¯ðuÒâèÇ>ƒD!ƒ¼ºÍ*e’Á‘çø¢ˆdˆ0txx/']æ÷ gä¨÷äñ‚"A¶?²šÙá¸þb6D6r¿HCTª˜æÖEÄï¨×a¡ðó¸ÃMúv´?nÈ€[ ¬/f³ù—{®€ eût»N‘+]k;5­(’èÇ Z$nF†™+}Ýlð°ë9ð/~‘B²ŒÀ(J;ãÆPÃá_ÈŒtóƒŠb'hôîŠÌ-«¥Üæ\8/ŸR”ÞB÷ßìË}–â‰eÅ‹4 Bv—Фj¬˜ ‚„ÑzªdœãÆoiqà¤%à‘‹¸g³5ß@¨bÆLú_§"ýØžÒfÇSD­L–¥eG¡RâºYЄ»“òG²1n8KäYz¢I[ø-|’ñ´Œ>²NÑgA-%;I’-|0‡<ÁÂå*Ù)-ŸN$¶î%:*ã vNTâèh´>ÝRæ‘QäýàÚ©HéÀÎæ6ú†‘„€?]Q¥”ôC´³£4XV§o1à z$‰¶Bösâv&ù"S·LÃr$ߨAEqÇ›¶îõJb^³'#£•¶#<‰¾?7ŽAcžøöþuËHÈÂlŽ“ìÞ:¹7STÇà4ó’"ÆGNî}g–ÁGQç¨ÔùåZem:]xÓZ˪O¿²÷|ÀIv•] vÈ>ZŠo„«yâμë1ýìøšóê´ï51G¹þr±iŬŒc¡BcåõsÜ®b¹;ËVt<äíí±v:Þ󽼿a<Ë—'pB†ï7ÃÄdœGמcTÂ)RÙÓŠØø‘&~¶|žåì­´ŸÉiŸ†ÏdWœqçõ\¼1ý¬°™89e߮؞㕦%©¸ŽI:²—®[·û̳}Ú/¸(–ºI©J™a_ׂãÁ ÂL[•ÏÔ1ŸoñdˆL£ËuIj¶º31/6Á·vÉ|LCëÓ3)¥ÔÔÌYê¢ÚV•LówCæ P.¤[ƒ ßl¿8ØHŠkøãÑž3«¢%T‰î§¾mÈ¡ÀÃÑ_ªy@ßô9Gœ¯/( :ãDÞˆ/þgÅ LÏy1B QORê4zÞß{]ßüÛýkwEˆoM-F̬ۻŠzêñ]”í¡ÌPJ¡‰WüKvÌ} Tñã ¿ÞQ YînÿÞÁ#ÐtäÁ«×8É0¡ü†°ŒÛCÑIÕ-¸ò‹‡î ³}ŠÒtÊF“*×pà{=Ä15; _Z ñS¿Ù®õ¸Õ)uvdÉÉë†ÚÉðvÅ6é’TLªKÙ¼?K>âÊ?ì·Å}ñ,JWKc‹ìÞàøf§P£ru3EAÈè{‹/HPì -à¿›yêaò¼ôŸFö¨‹| 9³u¨XãDD€¼ÛLebbºh³a»,…3/¾Ø‡ž:k_ƒ­»õíS.f÷»ÇE²l+G§ºAyØ1Ö „ç½d>[×È35|7¸Áïû™¯>C½’G¨ôüã¶„ž5´>K«ˆ€†?ֲ֢̔”,YŒ-:t_èÌ~=·[VÙÙiþµæ¡aç¶ Zóê³OVqÝü®Þ­ Ç”gªÖÏóÉÕ6¡Òhxékð†ôô²Z‘̇N:hX½p«ìþ‹?ŸÊ]€QT*Ü„íä ‰×‘¸ãL 8®ø&Ãi=‡ÕQÔ¨ ê!¶Æü¶x¶Ìj•üù‰‘‘²nþóž÷fš«×ÏTâÇçCk—'à$™¾ÖoMüÁ¡4Ç|,xb" äP_€²‘ŸÉ‘¬tí»ÎÛ!¢'Ëßoq¸Loì–C˜'nýr€Še•Î3$|Ò‚ÅõÎÀD¬ã'û¸ºxùð¹mÖˆØ7«ècyè±E£!æ"¾0*þ NÈŽç 7 ZùÐl ²û²¹ŠT¼Átc#Ùò¤·mióU1Å*3§‹'®Áq†:âKŸ6û SòY54_÷.ŸoIö«“JÜ#Ëz3.ú*¢,¦F·Sùú•ièt¼%P wãFW»o~ЗfyNöõ+=mûq®k éoúG‰í“HÏ#s‰ŸìuXmß ïªÎí÷(×Ó!V‡ËJT×¥>î1~`Q¿´´qÅÄ$£8®p±$ƒžàÔÓ”óÆ`´z!‹3h”Tuç¬ !˯,5á=-Pò#}³ž†pUNjãÖ‡Ú;ææs¾–ú…ÓÀòýú¸dåo'Ð \;&ÛÕ‚ªX…ýù£^ž`ðùv¾•^ÝcÏÓaä´ƒiŠcq•ˆÔ3qþî¼pÚHzí¬bk“‘Bô!{iþ“•X…*+‚±beõZ˜Ÿ«£ñþaÀaO(Á-ÙÖw)˜d¦—úA„„j>un­á+·;toaü.§ŠX ,ª–ª ›ö:r fŒ®:þHºþ® OM~fùÅKr±ì"Ñ­òÜ.9 AñÜÊSYºÀ¹ ô­øÜŒ}=âj]Z™;¬gþ_Ë51ߺ6˜zÁ&ì‚Á· Œö›—¥‹úD4럔¼GB ð¾sâ¯ÔGtâ5ÚÝ““v?ã~¯ »çµ:ï@qÇK ç/Ž:öýzôê2YhÀ¤^þRëç=ÑÙODò¨À¥Q†‡¶0ÌÚÍ_:c°kVÛH¯[‚­8;±ö–'¶Äí%åÜ_3ßHÑý“¢˜Ùð Ýo%r¿@é'ªØ¤Nãøq9#tÓ™ð7cÄ T¬ê…Cb™ˆô 8…G›N²¬ƒ50«£P«YC¥‘J>íò*ƒ¼»WŽ3ß#ºm‹Ñ]c¡£q'šå¼$eµ¨o …¥ãÙìû°^t¼€¤÷ADeH)–²î\s³½º8Y]&£«32؉²ò‚}ñ/^‡>MÜzNfëM¬®‰l/”ïp§”½Úô>©"nÐØdWÔše,;ô˜´ìÌ€+@‡ M¾ 6f¿ÐïQ ÷¹P%6ùûðeåþD£'0øI\¢T¤}Uxüò’&5³j]k.áâTJAÎßSšóL‚¬ªw¡ä¾´ÇV’6ßÛ†|Ry¤×íœ~&Å–¡À2Íûå.f6«iúò…8 &Ìn?÷ÎW< õt|{~ÿ¬lˤ¿õò¡ `?¾q*Úø«Ž;Ð:Ô¢cðk3òˆ—°~ÍIØžEš¡q“4$L%#Q÷¹P5­…ƒ-ëïtkæ…Æyv½ìù·‡ß*bAR›GEön§"Ÿ3–Ò8}  ÁðÀ9tÐ2ÚО Êihé¶i(·Q/ÒWÖ“Çi¡ÈÍɤÑbÍZØúe!v-Ït—^•f_)š¤+Ë\9lž®aÀ¾NlÒ·F\Õ%$Ú¯ÓEkêL…."/ÒLg…Ùm@£—ÝtIŒzˆ/z¾!Ýå2®”.eÝò‰+—Û÷¬ý …aM,à{Î… þÕÙ?dÙž)K"HtÏc-8Ó¸L°äèø ¹¢W ÿ|'Þ‚ƒ€ <Â6Ý §3dJ4[4¯…GËšw5½)^9þî Zêî+®ÝÐÅ0±ÄBãìȦrvÆß‹Ãñ.¡”ûòH¡Pjh¦kGÆÔì _*„²óõ`Ñij$Yc»¿Lè3±X˜ *.ÁŠH·±­|KQ>ó…Ôæç™”œ^õÞ3Œ™jxTáìÙvaá€#?LžŠt)ësˆàU¼jZ—¾Å¹A!á·gél(ƒj6Æ$u3GÐ'MײäEâ Iœ&íɉvh¨RŒ÷®2qkxÃú|%@3ÈÝ<ü!œ ðs¥+¨®Ø¸1 "I M6Ì#²ƒ=—o2Rñ¶@iÈ9¤lÔØ¨\lQØœ'å êÃИdVâŸ|ÐXi®3`‹D…"4jq,q ÿÌã½D3! ßÀ/QãŽï\Gn'^`ÙB`:-'ýŸJmmÞÕçi” ʤµÿ°–ú+á^w. «Æ&‘H–›ËBƒßøUz›=t îŠÃ…f²"tROH«LÔÐ$xIsXýÜæ«ÒfºZ>ᢇMg+³¿b]Ù:•¶‰clÉžoµÕ9ßêÁ¦I`5o½Ë:´«$šŒÆ×;0ÕyÜ•&Æ›Äýa mwŒ´öÙ¾å`÷™Îå0òL-˜ÀþérR?Ì"¯W„»8œ“c#µ.i“åú¹{(šÖ-˜Å¦Ù­îÅw̷Я *ŒZ†þOQ÷4Ï~¸©†ibòí:ì(1{GÚz ”}Hf ~Îå¨Z*Ú|EIg˜u´…8tx\Ÿ}uºôaˆ~i ¢%ù©á“T¿ö“zoU·©æg¦ o>”Ô3Àø¨Ü7v{CËfzf.ž+ƒ¼~-íYÍ¡y~„Š{ªCœ›ç¸ª5ߨ&¾hOý>!f“­x©:ŸœÖ¯AQåþ¤mÁ°w¹™y´µè¹ð$Ö×0©MRà0YËCm¡¾Üõ<Æ—3*Õ^}õKúfêû!o6¥@àp耯l´'ö÷е®!ÜHž«O‘ÊJQn®hö´˜ñ{½ÚEæèÙJˆw'ò~ù±Ú»ŠÞ”„H~Grðo~ ‚)eëlýÎÊ~"l îÒƒñdžˆ­¿i±áC>ýÊ«m8‡>ïºDw Y'㥬o¼…dîÇì ‚ÅE&‰T«[ #NŽ„“Q€ I‚Ç‚ÉMn< ¨‡ÅͽÂQ²¥Ê)aîü6« FÄð=¿•iG¨q=÷Ž0RU=^xFЕ Õ=Š‹¬©Êz褜Iò­ÊqéÖÇÁ  :ZÒØé׈IªÊ/ò‰í®õõ·•sbD°—œ wDKt'É&¦¨"~b¤»‘4‘ðèrî±ÆìÄ‹ß7Ås vïÖÇ\ÂEyÛ[Sºÿˆ R@í\žãÔoy™Ó‹xNÌ@f#³=L"½R½Ì®#ð F,ÁB ’‹>šT‡]J6/j7bƒ'Gž¿ ÜÎ{lsä: ¨“Ù€<'OôΊD¬ÎyJåÎíjsÈR?%jJkwÙgšJ£8%—à<2>ÿfí»y|ãêØP v‹$L¨ì/©ŸR{â‰È‹#‰­ãïwVL=®ÌA£Uüp¤sE=R6»0œ`‘¶Îwª¼ª´3z#…˜éó=¬¨"yc&QÒ>yÜ9#«¾y¦9éެ뒇=‚Jr '@9²ï¬lÒ–2Pûñ+5}B¡§€Â‰¬LG½øÑué$ì5ìö[ßFvGÂEª×áÎÆÓ âœ5ùÆÊÒ³5ñ‰s 5XLòKw¨\Ü(“7` %ííBXÇñGâ¸ÿJ‹KõÚ莙¤‘ý‡Ô1™M÷ŸÓF¾ÓŒònð;ÎbÒN°Ùšü¯xýUdÈßüZ ï„9!¢7¢¸TïgÕ”6V>·ˆææ­É„L¯ÑÅÞ9±ì±ã[cj $ù€áÄ’JçÆ9*ÕI™#2°ýr­½éR§±7wƒoèx$¨b¹1-K< \sÚÏåv\'W@c &)ßjqaÖœ‘à- µãVÜÆaÞðÝîÿ¾­/<Ž@Ûý,š\žØðC.¬ã¼–eÜŠeîh¤É›B4×^…çš|nüR`ûq(¸BäŽ[ïöƒ¥io‚K³¸—xÑÉÊðåcbM»Raéæå²$Y±–¢Ôâë»tä*¸DÉÐFŵºdý¾ÊÎ`(î±V“H×uALŠ‚¶ZÆâ|rCç”D˜Ú6Ÿò­s CÒtÆ_4Iyšg‚®˜=oB ¾… ™ÓµÌÈËüïãdø]º”òÞv1n¶Ëæ4÷Q~¾£¡fðÊIý™ÖW¦–'ù<´¯¹ð£=°³ ÙéCŠrÞí×˚ɱ-iDúÌì„20ý2]"]Büb½÷âÂ&’¼€Øîl}(6'WÙö“öfæßæ`¾`ÅI­æ…}f eî³áBx®³‹ß/LíBé“°ÛšÌLéêzŒC+cüBðÂê;P‚ŸÐ×ÉÉNÕ‘ñˆƒïÀ翬èÊdøkð!Mß.Ö:ëu¼=¦¬ü.pU°~D xçZä´… ½le[ó6¡†ŽìJŦÆ6p"O~ †'Yœ-SðÚ5Gç’…Íá¢ÊAJ¯uIh¹}Å"ÜH{ÑØî–”3†å M‹q‘I½á{«|F¶¥‘8Ü’†ª/ñIÌÓ]eC+”<û΀òçBÐ÷š“¸Y—Ö´1L†Œ3ß‚c*™Ë§“Žë<âÙ±bšn›Â¦p½»ÏÂ¬Ø ­‚·cèB$ŸmÅm+^RÆ´žtΙYÖQzö¤¸s.iUò{IP³=D‡âóZ®}ü}ó™ˆÎq­m® àAîIŒDõf˜Ó u¦ó›ž:&ÔúຠùŠDî-s@~Z–5Ã`j÷yã‹J‹šëoPŒIA§2ò@v°'°G*5\©e=_®¢*þ“XLñ•Ej' eóè~ùm1ÓuåË·¤7—X±³ªËÁ/cµö+n‘–7CŸ.Y4›Jš°©8u$Ì=c°øè[Evý›Ðº<.æò¹:–aXœh¶¯ù]¦P tŸË⃉O„g¡~WÒ·¹Uw°é y|ý’DÆZšŽKÄà~£–• ­&¬6ˆJ„Nã¥Â(›‡q‚Ëö= 2s³2‰ûõÒJŒ‡’¡|³ŒÍ¦<‚%H0Yü‹ö6ÆU v«¯|oû$ëÀÉrÇ™¦ê»2ÕòCÀN°+çÔK² †C_’l}×ÀÖ`x–þWóÓ´€7wi“,Y›®hÿ"º”íæë Ýúòê½ÃÑå©ÞÝùW­|¶1VMÅ”Cá˧¡Ñ^soŽÄJxˆ»¾^Å ñ¥=(J,ž°„ª“Ô+½XvÐ'Ó\rÔ7'G|àÇíK ²1_¬†ÊD-É–ï7í}yЕÒYÐo9†äiaW?3XŒø¥˜8\ „„CÓËG½ü‡*¾×ä)œ¤'‡ø!ß±‰##¿0}–¯“ǧüÞwŽªÛ„ :÷ÊUF}æ•€ÔsÚÓuùB»ÞñðEÊÒ!Œ÷Ç>LØ[èÓpœ¤1··†©KJ9—H‹_R÷[±¡œdr”2öÀžÒÆ¢¬üÍ%®©Šó&nçîGð—•_šë5DoºËƒuUTÜÅŸ½uª˜î…SàÖ8R¡×÷ÙZ;¢=¢×.5=¾a#zE+û†5±§dtIËBæð,ª‹¹˜yrPóæˆÄ~X/?™&ÞæÊö¢–mGB„àW9 3<,Eñþeƒ±ÖŒó'Ÿ/ !ãj*MÛäW_¬^qÄ.ˆ°tΓÖŸ´¿|aüPÈXa±6ÄÒ B”ü¾ãwðaàŠ]+îëé—©€Å» }ìêgp6€â¶ëðþ$7ï~žm#„ÉÞ›k¼©µ–\Þ£MC}pûy¦7&ŠECƸ½á~þj¬X0“ͨcq$ SLœŸVxªˆÎµ&X×[‰ù `oB8àvßo¾+!/ºþ>©ô éd¿ÖƒWäy$…ú@½m;ÎdhúV[KÄÿê*.¸î3å«{ò]ÊI÷Þí’?Ûe#akaAë;ìø…ó³TžKW¬dFèšÅâÛ‚Ü Ϋ*çþÍ Í„9` Ì1´5›ÖQ7‡ÎΜểFÙ·È|Ö^ñ—, Dzëîã6 @)šû¼£p¡‘¢§L{`Dy36¤µòþQâ6N"Ó.«/nò@9¡¸ç>êÜêˆ+×7ðÎøðsèæ1¢Ø˜0P"þäñ÷ÝöR…•jÍEÎ"Ë Ú5Ä$z£ØuÊ4FÞÕ6R‚2g‡k/y¨ÀÌ_õ²1dûš<]¨.¿ˆÉ"¾C¶sW< ¾ S¤`¨©ýxÐ]2 8x²Köó)æ‚¥¤æù™”ˆÉäïû=³§‰lü‹5,ìñhx×a^.j¨ü¥µGÕ´HõÀ75Ækªò5ž—>}„5ÔŽf Ñ1ÑM€æI÷V&O>Y; F- ãu<ÛîtI¤¶Q’Oƒ—XæÀ Ç,U¤ÎÚq’Ñbó¸ÑA±6۳̚^+B{h…A“îZ‚ý墨‰à/ÎYÝt üF,œÇöIiÀ¢ú„pO‹Æ‘Ç}Ž’çf'=äÊ&5 †} šª½R¿Bóçpo l†K²±©ÖÂ/LK´_¿ÀQ­˜úÓWWÉÿ0duxs„«sÿûé'29»[žæ¡ÿ¥Ÿcê Þ² ý¶9rß5ÆY‚´]'Kn=Ö©Ö« ©Ö‡g쥻D_ÕüuÑiåÝÄ5‘øm î ƒƒFð˜‰@’ŸÃt£à¬L8~aÓà|ÌÛepþ­KRI(‚[D' Æ×iâóÖòkSù-ŠáÕ—CÕb\ÚO?ZZ„çý¢•p.ªÞÈqCôÅ'#ËÔ¶Iâhð|ó4ÐöÂÕf2JÓÕVÛ¾ ¤v*•ù©Ñ³ÄRò“W­ÍIH³sŽJMÑçGϧÄ#>pè"à“›N³ï ŠÍDûHÇ•ˆ"ÅóŠ™ø"È5ˆnWž]{©´sUŽ0ƺ'§‹÷1¿K*’(y¹ 7¶A’ô2e¡i*]à5yÁcëŸÌÇÃi¾êFŒËêÎRñ6ªeŽjû&c•s»“Uõv_<8“|e“ºåз„ ž²wèò>ž­~d}‹û>6$½èìXSM[}×§²1­¿^5iÕ¯‡¾Ì±ÃÙ„AZX¶¯ªú©OñÀ“o %“5¤žhnk_—»$¥¹yn-TŽFõB²}û'r–¯súZõ°ÑOÂ:)eœß›e_+*D…ÓæùªKõÝ>¦GÙFEÍ|ØE<‹vòðX/šÛ |8ãý‰ä„’¨Ì]wTLÉ‚×~øÊwd£¬Ìœ³3âo<Ò.ªaÞM ¶»Q ^Ÿ»6œînh@hlÈæÝyëa,‰ÙŒ“Ô ”#…Á-íí;Ziꢗ±„´¬¼´nÄì6°b>îA'­ ‘÷¬Êóå=ÌŠú"aS[Dî,gj¡”ï-® l$Ui–Îä=bébq¯N2­>È´ÍYJG ÃÿŠ#=µ¾Mþ…Èû¶éT«úIókju@ÂgúOÍW\·„…®'³WvË1Åù>Jž0Pý\»rà§ÙËŸ¥…ûcËß>„IÄRTD·\{úòuO'É‘$úoÇ"ðHNRÌ6`.àƒræÙÈRá¼'ÚT}TÑoEÐ÷>Hð©ÀK—hqžFóã„á÷ hñN§ïGá,6æl÷è˜O£üæárÃ$r5‰{3~éVeÊ_†ˆ‚éÙÂbÕ+f<ÕU¥têYØbÀ›V¿|œê]åÅü˜zJD>s{—m†‹šªûT±oÂòÃIp‹¡DàG„nàH®dêVìcûÝ4•ŒýÜEy¼»¯Ž©å¬U¯¥Ç)=µïÿúð1¨ä³UÄhL×s=œ9þÉî^D0¯n>¸E ÒÚ8àTqù¼Æ_ÆQTÊFD³ ó4‡3vMA~!e®ëj×¼ î˜â¤¬†òûÁþÓàkó0Ð}ýd’.Èv´Ã‰žÓ²e’Ó±º€>5õ Ç×Þ¾jªqéñ¡£¼¬ÚÝöZkå¯I!Dè-;Û¢·~¨?ÒòmU}ZÍþ3—Q³a§C`Ijn*+$ÿ¼ò<—" Õl³3ª3í:~Á`F !@{’‹}òâ}OHÃÙ¯y.‡(t 5@Ðò÷QÛIϸ:¿i¾xîSh¡¨™:cxëS6„¯eÌo%cç_9æD„ÛJ˜"¤Gé0Ï<Ì *Ôxl4òw¿ãÈ3$W“L?÷©’~OÉ En¯Ⱦ©‘« ²oJ|Ù‚?Z~›¥#ºu&×½ÞØßÑzÌÛèg’OœÕ©WϹèc—Ô¥ '뙆:Ḛ́نaOƒîôº„ÇÒ5õŸfÿCLÍÜ–o΃ôI »~šÖ¹÷éw ñ±K¾Ý#P/¨Nðu}|Ù`m°ìº‰î)ŸÛ¤ç[¼ S¢zÕnÖæAü‚…å!¡֦賊‚×c¾¾Ú+£c@æ[¤Jö&°“I3ªŒRÔ7*Ñîhòœý^Žü1•XÖž.Íg.×–>,*^çkÅ«b ÝšeSIœO ;!¦ÿÀó®\4Û0EÏX,Þb•`ÐU‰TÕsyˆwòÃk!?k‚3§çXÀÏÿ^b;¥”òKP+÷{BÖÚh„þèbåóœ)¼×v ÷‡/d€¦œ«X«H!k× Þàý'Žó[ÔìܨPm|IÀ4’<°>ql&à( ˆRðào4/n°%ETl܈ػ°ž¦ýŠéÛ4¦KûöPWн"è#öNrh×ã¤öŒ¿ÖM‡QŒ4Êu%y8…R+óý•T…Œ<6f}B3-òÈ>AhFz"®­hÞü=ø!“oÌ€ow[SO¯: ™-¾Éhͨ4AÎŽzB†ùYP­o d-I!¬4d_ÕtÂd'èm&¦H 0«Pe³+?2ØnŒTËRßÙR«uµ_¤4NŽÉö²úº€¹ÐWöìÖIXúº¼{™XËRœ *E8á/¥ºs4k¨#êÊW˜G©!¸——鿃 IF$Š8·QÚžvÏ›çRÀξÛÖ­Õñº©Œr2óñbœIæ“ Ñ{‚%@Y~á E7Z·<ÃlèåÆÛ þó{` C§ Ùt2 ¥IZ'‘ 6aç)Q4ñ&ò—l0"uüçæä¸–ž[B±Z…êÊÃ3«è¾ãqØZ[v(ËOvº?Ï1s‚,ƒ´M*ã,•e(é´äñ©çF•§sæÅ.ìôfà‘¹ÓQT©&¢KÉb`Ä’\Ïu¿º3¬Rî±ïÁ`úUG7^¡Ý—FXTW½árùùÒÒOæö-AàAzÄ<‘jÁ eN}Šû ½µA~m!*(nqÕŸ·ˆ¬´mª•× Ž• <ô+(+M í*5bÀ‰*îêÝ­e?ˆ”×Él’Ë/Á4RôÀ³ê(3ô˜ý½ó6Ü2]kº´kÿÐÃ@‰"jâa݂Ɏê‡W»r¬Á{RȦ³í2aÏvR„e§0Xq Hݸ〾ÊËëk”NrvPãïYKs4wR%|Û_Î8ËW•«€+QSÌOW*mÕÄŽÕ^ˆÃIb5Žëå…;Ò¶ûã0€Á-ÆÔÈøªáØ8å±cÚ-¡/òÞý¨o}¶bͼtËOWe!'D‰¶“ÇÔ i°ÈÁPºT>BŠRÏçõ’[•¢Â²ºò„Øœn‡ü®ëÂ^KýÍï¤ô´¡Âǃ܋©¶S^›(·‚:]±CK¬ZÙáa•vjq ›!‡Yˆð¦U—à½vZ¦}ÅiM}:Wi¸Áð¨˜;{)ËÑ%«9ç)b•»LwXÍ5I² ‡/ªf}ÃíZ1…Þþhúc™9§I«ž˜uƒU¬c¸+ÔS¿’Þ¿æ~zÈÞû[©òzä·7ltx½µƒÓBÆtôt胶±°™›VHÙ¤ÕIí\‘ÇüE¬;‹GOæ;ú&ôN&Íe‡Ô`]DÊìäÄÛ Ãó¨ò!°aÒƒQ¬Xtqýzü6Ñ÷¡ßýe›‚¼8¢èP™ÀŽ…(ŽG¿â÷­¼eÝÃøltïhÖ¾HÈj‹aÀU< ±FÛt«!­)¤þ}@Çf—Žgáù´óX“£\¢½Ú$yC-óÈù4i®ØŸüF°?Í‘±å©Að¼ŒpäM„e^ m= ؽ¹=½¯Z¤!ôþÜÁÇ;0£$d8–aÂcaw*t2ÆX=~)¯Æù'‹Ã’aD—û¡0_ï§«P;fWÇLã”É´Í ²ÀBÕN8'7NIý(3d„ŽÎ,dî=I¢'´ºDµüY{O¶úùÿÆxgp›\Ê€kÆ«&Ú¸‚¸‹5²,àΣCž•áU@¬Ò!î6†É+¦ž[‚J¢ö©ª%|iéà•Fw×óÉû vAô„¼G$÷úÎMìÿáÓ¤ã€Ñy‚ô .©çû ‚ßsÖÑþ T{8d‘|÷í>~OE"ÎòÑŠžñ Ýí½C  KÛ–ÂHÎ'ë(ß*RC¨³aÜɵy«?IÌNäu5*´Öf„o£‹W©JCŒOünär–äâY)©µx×¨Ž¬Ç­™V‚ü,m n¼ ô—ûȵáû9µ¹Þ1ûm8rÿÄÓ±ß,øþâ²P¨[!Í!…ùÿ&Ûƒ‹Öh„1~RÁ¨ž |¹ç·Vo^+7l 3AÌ Cþ®&ä—Ô©‘)6îÚT2¯ïºü™º>¼˜$&í?àÀ‰åŽ Þ†~ Ìð@×¶Rõ²g!¸ï£„%]œLþ%õR Eå êÛWSµ†ng/±§Sz剒bä8ëÞžHµãÊn‡áôì ²‡=؉úù„ƒÑŸ"‚½7&Ozst ºo(ÕÊšlÿ3˜ŸU¾œÃ|àü®ë!QIoWxNw@³,¬FãêfNüŒ_¹÷GÊrÎQ´»j®×P>°9nG3gRœ[)®à—vû¸ÿŠaui‘BZ*eÀ}O)_]호‰Ó· ¿tW_ëW±  UŸg›ÐqžXÆ…ßͺ2w{ÈUŽ¡ó¬{¸èVÜýãYIÚƒR"°MOÒ£•vwÇŽA÷0>ËFÔ¤[—>3íïZx‹J¢dó~’Ç{ °Hl‡˜23áûS(»ÚOPXg8v[Ƴ{]¯Ü´›©*ehÝ;±XÜW—šFû&¢·Æ§†›„¶óc…tþ÷JrëBh5ל5¢½ À³ìžú±–³ËTûQ Z„ž¡0K…Ç15:„R•%ÆžßP­}¿=âAm½çS n÷bia͉嚢o?Úu#¾DBe|¿„ð$&‹h}PÜ*‡"iP©ÁN¢QðÞ…<ÞÜM½ù‰ó¶œK4¦˱YŽž ¼t©‡ƒÖq}ÿŸ_:;éO“¢ja‰X!-DºMÖ¦©¨2 ©àr`Ãnb’DgmuÍ!+Kݘx ¡"¨MGA:ØvmÀ’”ý1¸mlY+øHZúX^¸s8öØi9{1”óÀ]*ÛP·ä| ¯vPáúâ@Þ¸å%:©i%Œ†•†”iïž ?R¹n$nÅXÃ)A(çn’r™X,Õi(ì]Ò€vÊÕ´àÈ·-œÚwbL²ôÝíþ¶‚ÜwOúTêïlý[Qô°”±˜ÀZ ¿?rÈJ*__³$TQŸë¹é —[.V!o)´ H–´S=šñ/ Õ¡:îÑzV[Yxe[X’R¸1;®€Hë?µ™vZÇï^R°V´©«Ó ½Î%:x¡ùAǶ¾÷9ŃBÓlg;õÐãë²Ð£YsKªB1Ô+™Ãæô ïÖØ7¦/"K›§>œo*:˜ÖÃm˜Îì2ÄýÓç…ÌpƒüšAýãèðn{Y ×5tŠ­¢òÚáHQË0g W‹Ð:3IX®.2¼dX W~Qt ý ÜroIˆ®ÏßߣpªË"­Ž÷-“ §¯ÇK•ÎÏÇP«ÿ ²óéºXйؽHz _…Ü^/ì^¡ò62°û¬¤þ‰Ì£/£ÉϾ³`E$ƒÕg°ðÓw%«Ûï.É)4ú§ºEÇâAçk`Ü“{Û$¦ðýî Œu¤ÎàXò±ëÒN(uçVÌÖgœßH¢RÐS‰5lâzËK#ˆ†'ñÉá«c‚ù˜‹Æ¬ÿÎÿ1>†;¢r—ãT–¥FtÅÌ\°µ. ø‘õàwˆ±àý…Ée¨Œd¤Î¸–m€‚ÎR4N[J,•±E©ˆS¿Å. oáwÞÞúÝ3}”`²Êv¦^CúõL²ý|5r\”Iw}Ÿ¨¾Uö½œV×?éÓ,Â[P=¨hËù ÁÐ!ª¹h,ŒW’ÏW÷&¸h¹ŸÒõ’ÜB©¡Ø‹$¨‡á´Œ þäö?€™½>”cL/ÂbÿEëÖÊ'ãÒJXܰZTÖ˜M”Ž–¢‚Î:ÝÛ"©F#Y•ßÃ]þx‰R!CvpmmŠÔ”âK‹ªNã9ÔÖÙm Ýoâ°óÛË@Ÿ+UCŒN¤ÀO,“@s¿ˆä+ñz?ÏŸqi?F6Ìźk·ÌܧT/Ù&> ægâ7 ‚E`ܪŠÀ¢ UƒëZo„‹¼½]}¾Ôüš}e÷=g_8°3Û)¿*1~&­Psw©öXúã;òL×v>1³·3wX¾w û;ý)Œ}ˆmnÁm‰e’eIxg 3Ûg10·›¤Ì}Š4T”¼tw]Ù6¬ê|ÂÇv±ˆ endstream endobj 4067 0 obj << /Length1 2151 /Length2 16759 /Length3 0 /Length 18041 /Filter /FlateDecode >> stream xÚŒõP]ËÖ† ãîî,ÜÝ‚CpwwYH…»»»;!@pw—àAƒ‚»¿ì}$û|ÿ_uoQµ˜Oëwö=©È”Õ˜DÍA¦@I½ 3+@LAMžÀÊÊÁÌÊÊŽ@E¥níb üÏ:•&ÐÉÙdÏ÷1' ‰Ëûš¸‰Ë»£È ëj `ã°qó±ñð±²ØYYyÿãr∛¸Y›˜² { 3•ÈÁÓÉÚÒÊå½Î´ft6^^ƿâv@'k3{€‚‰‹Ðî½¢™‰-@ df tñüŸ´V..|,,îîîÌ&vÎÌ 'K!:F€»µ‹@è tršþ’ P4±þ[3@ÝÊÚù_5…‹»‰ð¾`km´w~qµ7:Þ«ÔdäJ@û9ËÿËðï—`cfûoºGÿ•ÈÚþï`33ƒ‰½§µ½%ÀÂÚP’”gvñpa˜Ø›ÿåhbë z7q3±¶51}wø{ë&IQ€É»Âës6s²vpqfv¶¶ýK#Ë_iÞ_³„½¹ÈÎhïâŒð×þÄ­€fïïÝ“å߇kcr·÷þYXÛ›[ü%ÃÜÕEÃÞÚÑ(#þoŸ÷%„?k–@+++ïÐô0³bù«€º§ðo#Û_Ëï|½@‹w@_k àû?og7 ÀÅÉèëýOÃÿÀÜÚÌ` ´´¶Gø“ý}hñ/~?'k€ë{û±Xÿúûï“Á{‡™ƒìm=ÿ¸ÿ}Ä,:’Ú¢J ÿ–ü_ãÇ €77;€‰‹ÀÆÆÎàyðýß<ÿ}ÿQÿ÷ª²‰õ¿w÷Œ2ö ï¿D¼¿½ÿqûwgÐþ{lèÿ[AôÞÏ@íŸö×gåb5{ÿaûÿ<‡üÿëý¿²ü¿¶ÿÿÝ‘¤«­íßvÚ9üÿØMì¬m=ÿíñÞÏ®.ﳡzŸûÿëªü×@+Í­]íþ¯UÆÅä}FDí-ßûœ‰—™“û_ËÖÎ’Ö@sek3«µÒÎ⽄­µ=Pälý×µ`bceý?¶÷É3³y¿ZœßOìoð}°þ·¬„½Èü¯ dçâ˜89™x"¼7À;q¼ÙÞGÕèñw‡X˜íA.ï!€w‰¾ Â_çÊÍ`ýké_Ä`ûC,âˆÀ"ñ_âa°Hþ!6‹Ôâ°Èü¡÷ rˆÀ"ÿ‡Þ+(þ—>¼çTþCìÕ?ôžSíqXÔÿÐ{ÿﻓÿç{ç÷3µv¶ùãò^Öô½ 3ûðžúý^³û“â¯ca1ÿ¾‹þß+XüÁ¿Èú¿ÈÅñºýÃý¯ÛD¿³å?ð½ºÕ?ð]™õ?ð]šÍ?ð]Æ?S½ë°ûƒï÷‹ýŸ¼‡Ú¿wÔ?ìï2@d¿ƒþÇü.Äáø¾OÇàû>þïûtþSëÝèü~µý1¿ºËó{a+'àŸbïÍÍââúGÀûn]ÿïBÝþï{uÿÇþG1ö÷ôžÿÀw^d¾gò:ý«Ôÿ ’™«“Óû§æï ï}ÊþÃ×€@ ÂÊ"ÈŒ?äS}HçïZQBw¦½)vNä¡«¨8­] |·}• 1‡kŽ¢èeÑÞ…_Ñ[Çì_ßZl´qXm 7}2£ùpV;¡-L2úÌ`>;Ë»²ÿ’ëéÑ5æ°7·Ä9oUq¿™§Ãet¼Üûžs(%@ÝZ}_euKÓ|ÂŒ1 ‹÷áDH—hNWõÇ:Ñù…nJç+‘©ÓdbÉÇÌoãì\;C«åŒàÖÛ™„GGÈr79GBýÜrÆ3€yªÝ~ ¼§Ú ›Î@ZSç 5a þ\™Ý™+髳\íF´·ÙøðyF4ÄF^CûÅm%9¬^Ž]…o‰ 6Ñç÷ØÃÒœmvªÆß¡à”î4tÚcDÖù>F\»´@úpŒ"ž· ãêj×°Ñh5Ï­U*OÍM‰*T}µNbYd!€D-e[ÎѨ-Ó?n³%Tßyºê(?\¿õÙF*¡Ãù#[7|!FÎ,UlN CF瀠4‹‘º± “%ëwR×~_öln0èAbÚÌ·DÎê—5¶“ÂGx c ùuµÌ:-¦¸‚mY†D­ëMkÛÁ?o­}R}ëG=úús¨Å Ï×è®ãêׇ¯ÚbéçúûìÝxéÏñkÍËS h¡Å^0êÇþœB¥ûòî ûòöcmi_]öŠÍÅ-Û»jÿ=ìµ0q,ß¼×úiÕÉ‹yƒwç7œyɘg}'áìœ[`°ÑŠÇu"ê¶Àä.¶Þ:]?c Uv\ç£;ãDÝ- ãÆ JÄ»+¾|rnaÑkƒúþŠø€°[l_)fžäaÑP= e!^R’ G;¢{8‹¨"û™‰Þ$<²®›9`Íéô]=wÙü{êp¦dî™2ä—㈯’kgöÍyxâI ±}&*Ò‡;pH\¯´äG™¤ý-=?b‚›Ì9‹«!%á:+ >™ð³È¬_‰ˆEå$=JœûÂùˆÁôsKÓ[¤üÌ|Z[ArÙݯ Í2ϳùËËg×/ñÛâ¸yöwævB|´ìV‚O~cÚ6ú¢ví¼™ÆØ(ªëÜc?f">·<¡þº gî>óP:¡™]ÂG¤ØQ—¥Pï8û ¹[Yf˸)¡·8]² Zó\ÉMŸV ’Í ËB j¡¼¸8ïƒàð£<7Öè: ɬp….š¨/ uO×EgUçøR÷Î8ÝWr¬.«™Œs–˜fϼ´Nªõ °”mÆgHZ~¼AúÕá@TÄ’šÔ‰¥|š*Ž Œr¯$ ig³¡¬VšÖјÝ?¤,¹‹y$h_Ü1Î_~ó€Y*Ÿ³Š“ö:åô )U2©–¡W+B¦AÒ'iûCê|Ýߎ‰¾-x7´¥ÿ.:í‡ójVœãB(ÙÕµýë8]‰éù¾¥\,Zgk¥àGt!ØGŠj™‡ z|G#àE'¼U÷×LFo¦§¸Ÿ$Ø­hÖGPGLÈXm¨Ÿ>êâÉé"9ëŽÈ5ÝÚ:RbCd€c. ´+5:L'hÄ"ÏŠ4ýYúpè¼D÷º–ÆËïƒ sa«>ÌŒ"ž`ן ÿà eÒû›x¾>Cl‡£JΗ¡‹˜l[¸Ž½º¸ ¬ÈÒn(Ÿ~VcÒå DÐz5ýdÛ&í7| FL½\¾2¿|ý‡¹ù¥ÖÜ=úúVåþ/+ßK¶ÝðöX®” D:DÔ‰bÃ< Ðv¤wÓvѧìïö=”—Ž<¢ä}›þ+-jÉÔbÞí6UÇÑ­¿ƒénDbX1мdTéøL£ë€7‚Tê­èZâÇ+ô"œ†§T­/öı$a:­åˆ®žÁß^®ŠöLxõC´°¬“9Áà*˜íZ¬*Z aÙèf¾‰[Ê  ª¤¦hš÷ë>dÛ,u¤4T· ½É+;Ôâ®Ôò 6³V{§/³ÌZšÏûUšw¿Á`™gòÂЖÚ4³hÛCD|xSŠf73"¨6œzQ²‡ÚÝ øc$âöüfs‹XÕ{ømð:ƒôÆ'Ó=­é”¿Gfx‘jV¬æ¿·QµQ¸Õõð ‰ãœžÜå(…p3|ê¬_&[/{I›ü}éW/:»M§3ä¿ ­\°§(!¥®ëìÌ»ÒüÚûãbd>‹½qËGyÀþzûk8EïGN»Ã)'/{á®@÷cáˆ9²ˆXÃÎÀ6V`…¹¡UFj?Žùanš5¯BÈŒ‡«‡5Üç)C‹Ò¥`¾š¹ÓšÐì^ÇMÓ1³çüæÒ!¸ì„E=žåF„a¡šÏ Ê+þcn×_¶|ñ+ð{> *ó ûã¶”ݯ“*Æ=¢T:÷Ã\¾Š¥£{ì†s¸&•/qïs]}…gà 7*½Ë9¹4)#=î®È0ú™–]¤žFG­D_âèøÈº"Éa!9zâEïºzwêÀžX®Àš=$å‡ .èl,-ër‘&©ˆ-ŸØ_Ó“Èb/¯%xyå¥ ŠölWˆÎ`>ëî}LòˆŽY2Ð/¾Ñ+Xt º¿{Pˆ¢ Æ”§˜Ce] 9!86Gô÷ž¡*·šÏ š³šÖ±mp&#ßnÜ«wÛ™òŸí 'hj¯5‡N´aRð¶ðsEÚ?óþ‚+Ý*ÖÇâëíðqXœL}SRŸâ„éBî†>ìNûA0®ÖªøÜƒb5Ïm"ë…çaÑ#\Kxk¡!”ie(%QÈ…_Ì$B𧾕©¼I]ßT-?ù¶¬cî8wdK@2$Á³ø$ ü¦J5!´• ŸµÅ\,XS.Ú¦Y—j]¦ä²ØÞ¼Ë”?‡ÙÖÙzùã. üSUŠ4¸PÅó³ÂÀŒ{!#çA›É¥ÜÊ¢óº“()@{Ÿ¾Œ¢p+ØÊíå—Oii|F2s}ÁðÁÃÄo[O5®@øÑz1Þ@ðpŠÝõÇDKNžVC`ܼ.l‹Ê³Î—E†=÷æàÙG‡óñ*éÐGY¯ã”mHò>á5,þ}g,nÑ× !#s°¤#.•ÔŸ•¼D׿ý ö¤Î³«¬ïe&þÚ«0Œg}Wテ\|jÞƒµu™«•²Ó8É'©–ww%M1®{úy,Ôê dÿËÎBpFqèI|»SzòÍÁH¶Œ¿Ê¯åà[åŒ?ì—&cµ†Ë¦IçΛNâXÏ•fŸ,Ó‹bÒëRxI)yCW¢JÍÕ iÅÆ˜È©I-Ì 1ùEcSôª1Sn±`ò˜Ð~û8óuòãg…” \Ú_ÃÝS&Ñ^Ex1ë^Dû‹+rãݵ]\hýùm@ãrfzÒÂË¡êÔTòÄ´˜ä<*diÚ7¯ “ÌÏ®× ¹SØ“7Cå]¤~NT4Ž¿èLÃ:w$äÃ÷#goÒ0Gƒ§&‘¤HÛ¹\ÄlœðgÛÍÕu%r4|sY¸ÇM×”üE†Kls§Ó)ë±3ïßÜqÑ ¼=Ë™•LìÐkz<ÎgÚað—ì g–1Ë P—µ#”ñÞŽ3öiv©Eä7ƒ/Æêúx•\=Š‹Â>1ïãø^W{ƒlVó¶¯OøÝ†/ÝúÐ`ð3+샪p^²Çr\‹ÙæJj7àꋦ&‹Á%¸îv71)Èt®©†8ôœ•V‚°(`)§¤½Xøiù~j{d#°H¤Óà–ÿôkbA²gŸx(ÖªŽ/^‰ÿdZïHjóqÌ‚Ý} ¡Í¥9ä9!ä3RRÔËEÐx îÑä8¿ ¿Áì9áÀ;çÉ6ÕŸ¾<²ã&ˆ6Ñó\ù³¦œGƒ«E¨"yúÆ„Ÿ§§2¸‡0‚s71?¯bkV€r‡æj¢ºp°Jôb«ö%Iõ|¼ß˯¼àßœŽ—ØfÆ2J9}œ±/›d`·§Ósm­‘ ýljtgù?C—Û2E‚~ù¦Ù½¥ß¤pêŠüaÓ*°¹m6lU2ÇG·ªé*ä%V‰Mã®áfõí ŸÝïj~á§ÁÈ‹,ã €%÷äáåòk×–AÜ„™oÊ?[é‰`Üú-à6Éïå.¤ÁàÕ,wJÂlBν7rŒsièZúlM|ÞáZ²TjrjrT "H¶›÷VЊݵE=ìy’¡£'}^²°½!.˃FsrV  %@­ }êÆ‰Ÿâ9ÛÚ ™å‰ÖF#1¾V#â6wÖwñˆàYUÁ•:G;1úHj0œPœŸCÁÄŸÙÞ«jµG±2;åLÑHsp÷©J‚Ëô˜= ×`ÌêÏõóTÚÆÞí·A»œK&Ô¯µÖm“’“›Õsû¥{š ªmd_‹.øÉfDgXKì¾L Ñä¨ý<‰Æó¯&í¾ñõº4Ìh˜àeŸâ{ÌëëÛSÇÒˆÄ$ø]Éá’ׂ,‚o6koÓÖYŽ= £l44DY;Ðo¶¡=øÎÆJt6N‹C/›™bãò£ ¦za–ìâ´ï’úbêR 'œ cKŸzÀ¸1}&R®`aÀͰvcÚ‹’/â…zŸ–£g€IA{f§ÝShYf£“þŒjÜ0šLeÄ\”àÖÜ‘<Š…9ë;”xú£Œ³FFîÉ9ú%fþ×Õ8¢%/ÉMð$7®sC f¬·0㵨ðm¯´sÖ§ü›–¨–¤ÿ’Ý5+º&eÊz» ýv‚ei ÖdÏU^îÛ„¨„±ê:p×Iæe¹ä ±cÆuô¤Å• ÍicÊjx”gµ /=‹ï@"Ì®„ª:E•Ló»·ÜSCfñu/׊´Ñà™äôÈ¢j/_Ù1”Þ“˜•ã“RêXLbM•¡¢LM9CnÕòFñhˆWAPâlEYŠÁ ˆ?ac™ú4‰uô3'tûœg’sêݷܧ½Õêä4…üù烮¨ÃK5ô°¯¿¾ÁÿPÿ /7Þ[ÞV¢ÀÌ|NÛàþ„ÖÍõé÷‘`PûÓ×úL– ,ys oQÌш¿øð*4½]WŽ¿Ëv¼ßëM2²â2tC‚»ŸÏÜrÒÉ(Ì-Ç%”û{$œïV,®é©»!øM¢7LÉt£Ì º-ùñÂÚ“Œa)La7®‡ 2²»íÝr̆ü[©B!ð° Î=Y>ô)IœÃap' ‘ÌÉ:5GÀÇëH]#j]úúº…žÖ…àÏiW…OÖs¸©y0ËæÀ߸ºšÕVJK¬È_WŸ‚ÏØ8^TÖz˜!v›¤;•‚l?PFôâ(ÖŠÉèSâ´6sQ#Ì~ŒXÐé|ÐcŠ>‘LÐMßžQŽË‡ÿlܡɷ41œÖæ§TpŸ-\?ÓN–ôZ…Æ ùû3ö]¶¡`†')‹äóbym÷Ìb®R;†Ríœ0žu »*Í^‰é¯‘ÝlB(|FÇ@Þ팘'ˆ(gõT/Ù/\¸sfŽ{LÄÇÆlÝžsÍH㣜ҕGõ työJÞ/ň߇[”ãU5Jñ+{Ù$±½½ï‹,LºƒË™š×#¸(M¢'B«SwvÓ×v“„ŠÖ ¢± ƒÎ/Ýw›Þµâ’óxfÖŒz»% ìaesíW¾B›`sØÂ Ú"Ù W!ŒÀ·ï1ÄKPlÞÚoV$¾šÅJóê¶XG3-·œ RÄ1äÚ  åÀ^‚5ð9¤©Fȳ< @AÞ›†ËÉhÚ|Ûê+Ñ_‹³g9;wµf^õ‚Kbc¸"9¿dîˆYð¿vø@C'ÈfuÆLäø¡¦ó*LÜ04yë“bK*ˆí”ÐÔ®w-L„²¨¼åá˜2ça$yž>Öe ºà0†Òm÷÷x\d‰¢&~JÌÒ7·ßC`®ÄÄ+UwFÊRñÃëÕ£í·ì ?’ŽøªÒÌaÉw=Úä DåÎOjEé´¿M1àçBÏÙ×8ÖÜ©csT…Ϋ Ù2J<ïÈ›ž§©ÈÔËÙî(ß ß®g‡sùZï=–«ã/¬×]ñ¤n&w°Ñ¿BÞ]Í6K‘Ž¿*Ìô2Ý¥ß)Rð»‚ÍY{ñ\Ò5{ &J/ú ЛfòLžÍÇ…ÿÒ<õ¢MqÀ]õ*î¡ï³¹¢ÁHøMš¦Áf~kÜw¨O/@=Ö=$ ®EÙ…"Ik‘C/í-/Väî0åêÝfl³Øt+*8ñÅþ¼7êʱœØlhúKª0u“†_‹gÍÄaëÝG}83³øoÎf±”™^ë(¬ô×Ù4¿)±i~ ®³°¢µ–­Bv‘&ÁC¸^ÿB°ïàÜ'ý-E™ÆƒuxvzÜ8½Z‚ü6w5í/–.ë ÆžÞ¶j¦AÉοDìÍnHmŠ÷]Ç‚»Ù³8Aö=xù™¡ÕˆØ ãØ—®¸VÔXý¢¹änô >Ÿ…Fåæ«b]êé£YǪ¡‘J»ƒ<åµ8šÞPøõ¢Ë¾‹í'Ý‹í° ¦ 9€¯µosêb‘Ï;6H«Ø¢Ö£ÏE+ä~Î'1Ô³ðênju‰±;Uq_Ç1ö=þM**ÿÐc Ò°Püx&ë‡Þ`:"Wh.ÌŒi(#¡g êÓÿ5n×áØ—)ŸêÖŒ"{ç5„™Ò¤M«Ôåýºí4»íŠ»M¤ôHW—˜›—=€ž£–dbîeÅQ}«“k*5ß ×KŸ…чêt0o±µAtñ›o´T§/ æÌ˜J¶Úo€p…د:!Ë ’:ÁYô}Šqq×I}ú稆© 3‰ËzÁp(‚†€)" ‡ð¾ŒkI©Ùôë•O9µÖÜÊãî¾e^£ˆÈß´¦Åõ‚!m><.èrVÓÐŽ3®d”0Œ¦p}‚ØSp¦{2NX†ÅÞo¯ ½ôܹåzyJòµA?¯H!¡²„Ì|º±aò,y§â-.¬fBkìž°~(~–ùléòý¥ÖÂ#«‘èž#l¡Ïj®¼kîÅ8âanZÉ Ü¸šzq»°ò Ç©Púe\Ñ,wžuV„„ãŒèBHo+4RþJlz$ç8NÅ?µ˜;Àbtÿ•8IFdØbmè9fåíšH®…sIÀÿ]ôiG¤D2Ò]Ÿ<öª‘@©låHˆÛ7¼Äf%U5×pW(7Ö‘³PÄ:Žc³¼"Ë»Qmc ±ÃW²”;&RP4.›So™’s|‡ZcG"½÷±ûÇ Jµ\WÒ,ædºÎI3q­Fi*„üއƒÈªx³0D^Àј^F»üÞ.‰Àtt,¶ªoãT,z S¶Ý¡çdq~€!|9l-ÝRã"#åÙâÒ:æ¾ÇÚÙÜÓ¶€EÆ'¢Zæ»§[ƒ(TÐ D;û²3ì^ñöOòd¥Ç ¶6¾H(!íW“»IÀžÔr+áòÅ—ìÇt¾ããöô£¹Â íùíú§r¢À:¶».%0iªÃLuŒ˜e÷¢OŠõÂr LÙ¯¦h­Œš,ÄÎnU,80¾Ó.•‘öÙÍhƒ¶vn—£¸d¡»Ð F¼º½µü¿#s¿pàÎ¢Ó T`Ò!.Ù±ì³tþ¬ý‘G&ϵ¸vÆO/ðÛÉßèõ–ìC~áuN§íÑ@å*XoÈM«èyì(‡qâD&Êâ Àhí¬.Þ)èÔánÒLÿþÅñ‡¼¤tŒ£MûôSE–o˜H¨‘¥™ž(œòÄbˆOÝá÷ËZe âw^Ô cÇ_ú½¢[-1Jü(ªàé{Ë~MLz%òBà=¢B-´tÛzoŠ aTEuS]5ó(JšÅ˜` Œ–Za·:ÄÜþœ±¶O+‰‚P¼û× s`SÔå‹xµh¸i‚(«bwYÃáû3%¯—òÞZâÕÀIøÀxâEž®Ô@œÖÌ)”]¨ò€9›” ¯¦õEk«Fq^/Ôç§ ·«×üª¹Mä Ñ ¶’ã,w£|¯Z†/\—v›k»E~HÒöÞÛäڧëSጓ|ʼn[Ú6 yj`‚üË8ÎÄÇ&>R"汞bßÙ:L9Ë›§Msbç ±šþn5fä {£^Ÿ¤§‡g"@ͤ—0ûëÍäçþßšvÏrØÎšV- ¤8¬VvøŠÝÏ¿Q ›l¶3 %+UÄÀï…pÊ Ðœða–R$õZó­ þµ{ ̪Üò«_w%®Úœ¨'ìçie®äúv“ŽÉó<¢M°q&ÑÇQʦ- §½Šý’•mňÑV-PGÓÒi¤n9SâŠg¤ÜÓúV+º_ž›Bš!ÜgÝõ“èþÌ“´c )1¹XàFŽ03ž]rÁú© „4íµ®:†[‘hû­ËMä79ì›ÆŠF³ r ^¥ïˆv—ɽ2È›†z ?E$‘BMìêyïÎÖnZ/‚Œ3GýÈð#®ü’±írIa©Õ#U·>Mc—£¯_φjQQœe$5D0âÚËE&#mBŽ’é'{KÕÅ)Ö®r!ÑEŸ~:¶ Ž|I–rdò.û-y {²#±?ªèÒ_Õ£¨@¹D«Û܌Ɏ:¯¢jb§îTEªSí>q`ÛkJ¶qé@ÃKÐtzÆÇX^•AÞ‹Þj4â£4´ˆ‹ ÒÝX®yç¢ã·K~lÂO2Ú1Ji¿y.]’˽ÎcG°ìîUnöhB! Ýä+ƒ?¿¥0Åjý|«<bY•|iÈ›ëNq}4ÖŸ~}1Š"†:%:2ô±O* zI®ÉzÞO«¹u5`‚´b E¶yî[ÒEùå%ÎcɤlAÿXÑÔz+[FXP—fA%}`Î]^4t5šÆieÅ!´Þ<ôKkÔgÊAš¤k yƒ‰³LcxWmâvËâs¯NN£gØßþF)Š `Ómˆ4h—Ÿ 97ìUüüèà5ÊÝä]å¾yÅ· B6ãM°mlÛ½íˆR>-ȶåŠáú<Ò ¯ÜÒÒ©öúæ³"F§giX½¼m4D)ö‰ßü#0&xWj'L5³¡ P'üȲ›cìÆÆg·”#)Ö¬ú!g'{ œQy½V|k1÷ã žÃ6*Ž+3ú£€é¹X)?ÅF¢±ð$ÇŽ¥ZL}VBÆ`ÒúÇA™½~ªI 9ÉäÖµfV±˜P-âŒ%,ƒ3~à5¶Lù pÜ?‡ÅpÕ\Ez„[·ÍM¬@:SËÕ ºÑYÄÔ)ì[—ÉgÑËFE¢ ·Í’&RRã¬@˜[¡µäe2_¾XçÁ˼=7qºÞ4Ó ňL8¤ÐY¢^µ4‘9 —Š]HjêñZ)àHµœzØ×ñµV%¬€z:@ÅEê…%¡IzKža¡4­Z±šQN£Á¾¨Õ9„„Øæx®þyeGÔ!Ð8ð'^d‘HïœüvOóÅ£R þWûqðHó6ìO +£²™é=9 ÷8îa]¨.Ùƒi«&j÷ŸAB£¢ßË~ V5Ïs& ¤‰ j Âzñ<ß5qÒ1#ÊÅöFµKÜ/ø_ÚnÊP=Ö*Ššã¿Í²a¸IeZ[Õ<“>î ÷‹Îâ•l+‚õãëõö‰j°®ŒVõAõøÙ,  JxH76^^•j×òH ª³YZŽßT/ˆá³ž=ö¼­N¡2‘\PxW^çXZY…V °¼( QÏí/jyB…#<„o…÷{·.*pÕrlíY{yôónzŸœ¼f°ž¿}Îo›/øPª_[ëκôå¨}Íø•e÷õ6fµ5*GðÜbØàÇ«ÉBtª1Øñ:3jó†›P ¬=–Éi&Ö35_þÖiÀGrï{üÒ7ìÆð`Å…þG®ØÈå*£šç•*ʲígÖ©²O©Ñè&ËkX÷æMÉ0ö9D¦àø¨¨_!—#¸õiŠV_Õ•bR–¾Ìy á¯Ü`ÂÜ9°Ã•²'°yÝ?Bh¢‘|«YÕ‡Žy,B#Iöýf࿲…ÑB TöÐN”aoy(ÌÞí3=Å»Ë ¿¿,›’Ǭhc¦' xØÊùôÌCQ¯ÃB uŒ:—^¯ð+’*™Ò§Ê„©Ÿªdzd©³ï¾à´À[ÎÏ–¤Ò†€]èܲqµW2˜Nä…,ö¡íf4àhÈD¾Ç—=‘vFõIë<Ôú»ûF:O€ég=Þ4G'&/ªñ$¾Ä_ ¤†M3š“\z&‚R{4éhziÌ/9£ŸùPò¿ÌÈ¿ÒJï:¨š3Ÿyþs€ ÚÐÊú:ªGšè8Š \”úB~dðÉK»iZcÓ}¦>å^êÇåÁµ#˧̼ÛЬöîþØ,ôhâ+#2ÆÍ8JÒºÌm*ÂN˜¸Þçi<¡ QŒC!ÖK¾P([’S(Út" À&+XÜÃ5ƨKœ†Ü[ ~r»çõùýI éÎG/^z"¼âJö8,Å ì\xü™w°{¦ÄTW§(Z G‚×WJéêt÷—墸Š5ìÌ8Ÿ-D(çQÔ”RÈÖÛOßÙ%ÂóÛUÿI~7Bûû~»£zdôŸKep‘eûÒ§ÌÔíGˆë£™”ÒÒ9~uÔg‰¨³„ºGeðR缘À—õ¯ ý öÚãÌó:¡0«:¨—#R8a@\Žï{ÚÉE ò[ÏüŸðXóªß‚®ÎTî ‚wéyh)aßX麵Rùï\Рíٌ֟¾Þ2Jìbˆ0^ƒ{TÛò§9Ù –¿z—,1ã]6"+_óh4¿÷­%Ñâ¶–)Ù±¡äe±Kêµsʯ~?]´]®¹¢ìÙaø…h»©ØÑŠ“=˜EH3]Ëš¹&ó’-‘~'{ºe,¯†ŸaRÞ“©’Ó… Öž,ì\j+L/ý->\iòcõ„æh—wš«Hž?Þîg´m‡b£–:’i[¹PBç3yÓü…ªÒ^ûŽ-&Šõ‰Zn$õ;.ÌíˆùÚó *ûÄ,\Ž‚Å¤Ð‚éÀ+>ï\úƒ·ÿ¸-2ûG}ðŸÁ‡Ý\?™.Ú£x – ŸïC¼µÖÈrr~_óÛ®E¥µnä–ïÔJ‹&rû#/,qGâ%œ›ïuR–qŽ0óÛy5jÂ`9Í ¸^&ëE¹]ñ_ g^‘ÆÙvß“K ÓRÇžŠGŒÊ (1óÅYåŒåŸV*î(¬Œi¿x‘³'[ùðs"+y$δÖTu3:`¡yi3%ýúà´72¾U*f]è#îfÚ¢¬ F .*DÍh<‚_ã¶Â’ð]Å]á[\¥±?¨e¥íd=5¿‚q»T¡°Ã…H1‡Hò´ER—œyÊx¹»à)®“|·÷DWÕ»#ÞŸ;sˆá÷1¹»)çSJR§E×Yý¹JúÅ(ÃêÖ( Æ j‘¾Ã÷ééUAç8*Ýä®Ì+šdÔ-O5µ¿¼F:Ýu+Áå‹=«TÜæ0ß$>ßËž†Úðeñ$¬SþH¡À0{ Wš‡ÅjóÄ”GyÏãLÜ[±•ãG2 ½Ô®æ)}çVÏs­WIÕìB€3±¾XN%cøº’*¤œ\tŸgZµÂ0Èšº'nÈ.Q$ˆù]Á7´)¬ ²j`÷RŽƒ‰ÍÌi‘ÝÒ™>az&¼ 0&fŸ.n÷Ö¿Å|2Yè.£[¨eá÷Ô8cŒÆ¢tvü¦èß»u(£!¶'ËÃ…9ŒäŽ´S·«™tô!¡˜£êÂu¢5áÁv&zl.5CwÓá·lIÉ`ky#ÃG5P†¥‹£ õ"«1û*|!ÆàAˆH §e#²On²çgÚ”â踘$ ÷tb<_ýqJ&‚ÃØ‘¥ã˵:ÆKÉîäpÛzâa6Çö¹®¾¨2ìyöêô o9O8“ÌÒ¢iº5ùÜ—=¬` í,ÂFƒ[ñ»½5ËBp>•ãieÉà­„µƒ‡É‡<§§p­²æÖyAuàÛ¸qçKüî+ åBñȲûGq@Užµ–©ÛðÄ¿'\ Czp¿*L:d;Cs2Mw(3ÏJ# â¥v<¬¿ôÏŽ¹Y—¹‘{émI¦X—Ö+×´ŠÎÕV¶dú ǂÔ§þpµ¬ÿê‘S¸Ë+F=Åz¹ŒÁö¼IO²y·‡ÛðzÇ£±Q % ¼¡?Ÿ­5FÏèŽM<07HÓ¸!´f}œýp/¶eC’>·ãô¥¬Õº¸l^xóˆïÙåÔ˜7k)É*5[Ä*tn^…Gý[ Š * ê"úÇ”EÅ·TX¾l~\äør$‡˜"fb•PÖ†§ø—éy0Ó+ÌÂNN~’yñIøÌÅ©;=÷mØc,mÚâÁ„×_·&ÓË5ãÑH&ñ_ã‰Jr?"æ ±g²¾±Fñ¿UÚš—‘ ‘â sÖ®uV³PüPú&WÛ¼íùxÆpìpô0°A5Kq ×¢CቆڲTáöÉÉèkn;•œ**Ï9?üiªüÐ:x‰°¬Ì‹‹~N‰ÑV‘«?>à’y~rÑÐK)$fÇ á'u«¹â‹u´J·EFPPx½1Ü)xˆÖŽo¤ã¾oSSö/Z|\Yµg^¹ÝËð§ƒøŽùK˜Ø;û"x𼂗D(±eôÐ0‘c/še ¨.½bwÒvÍ™¨+å'0æ7dÄ€[qú ·QGîþY1ÒÈYÜM7ÎFæèv‰µIAê†m{mç¯oTðÚj¦q5í'K¤H`ùŸÖ%‹ˆ„*"Ëé{[ÔK´´×µ3EÍ——¬Y`K/iï© LsUÖfE[åhfàÂOî[N v‚”ÊáíøxZ|—?6ÿŒúÁEÛÙT®ž §{§ cºZ®§ð4ÙŸÅå ÝäºÝ·hÊy©#¾à·ãÕç(Íh‘—ø2^½ùÊþÊ W0ò¹ëpõéÊfåÂxÔõ3iÕçà å=p‰×Þ·󮂼Ԕ¿äw ;«M ŸÊÖÇ4;]]¸¼Â’¬¨6W8üT–n`ÓhaL× pºÀ#<†išÙÄÝå#¯Vò"‡®wdÕ/í°nÌÁVÇy2Ó KQv¢Ò¯LGTÞ´ü6÷b/¦N>éÃwDl߃íf” ‡mÕñQµVo«7q;3Ü"ãgiZÃâa'Ò ä(øðnK±pzt°2¯n·ýðúe¬_á˜bá°i,(˜r©BÌ'ÇðsÙ'L6e혈?ù??S] ShÉÀ¸ÖÌÚawb¸ÄÂI…ŸPæŽH¤fN['Ƥ,“èY1. sÌ< Ë|Y”ÉT’óWÜ(‚w, 8ÎÌè44¾•"5ãàÆ–yfÚÕœ=xzÜ€CÁjáµLf½Vq&ªYÌ¡ældÂhª·’ãËÙNáóxñWZ‹,˜¬(ÁBE „*yÖM»ÎÙWFów5cÃØ”ÜýB*÷´Àœ!sEšCAéŒßGa^ï4Fr¬L%æ-šŠ¸|þUHÐýZÿý à´Õå³²•ÛØlá ;³«ôõîºå/g¤-’nõo:¾°úŠ^[q†[Ÿ1*[àžüÂÖ!T]ÛÈRøzõQ‹™ÐyݬŸ{2êjÇÇ;pÑX^ÈVõ­x+¿Éȇ4‡´ñÒß ó ëy·ÍïO”ï¹sŠÅ\ntG˜[ZÎyCÓ‘¦„ˆÆHwbâão×s}ÁÙ ¡:‰B4AÖŒÿÎuµ¬Øɨĉɒù¸þt¨„bê;¥ZVÐ?ær//¶…áÉëga$ݾî•~eãV_oOÓ”b‘…f9sà)×®iicDDç¯àK(N°-ŒkÁ™»±'„MÏåk~¨} ²ÒƒF+JP,4öK—›¥Ü• Ðƒ+†Q-À-œ4K8¼: ÁýȲÐá:ÞÖÁŠp``Fó¼3= æ¿àÛ«©è°œÞbw©èj^ÌÀnäÉ ÿË™À ³qÓëSŽÑ4<<ÃóOÉC?³Ö”U:$êô€3ZÎ3ÍÎ¥°¼u^Î{Ï®»!*Y¯´6lr¿ -¾®ô‰Ê¼.ri?Ãíï:~ÉŒê^É|0í›ÀÔµ(Æ iáÊ‘à[ò‘ç´Ÿür~¥ [ÍV««b(uó,LV‹”#,?:I”Ö $Ilßô0¹›Ý öuH q]è[æ˜,”ˆ¡ …QíªdfKV+\£—}ãÏ_^õ5²èçµÈé½ìª×Ö¬ÖNâ4Œ}q+¬¦~ÌB ÅÇ¥¬í?®wDSþd‰í÷ 6§ßw{ÜÜ}=0ntpÞvПʛ‡¹Ly¿ D8?>T¥vw|º\Gȉü¼Îcy$I¾7ðEõï.dÄÁÔð=>0Tj§ûÆß ’Ñd•š°Rµw‰‡ÖS†m¬à®BÖ%nÃ~›ÿK‚‚:“”…F=Š{ç0IRÃÛ™keÕµí#—…BUÆ6G áüǘ–Þ½@\K{•jΡ·xRêxt¶)šÉÛD6Jg<™f”à€Õ¨®8bC½°¦© ¬Ø´Î2‰yJ´'Ël¬Ï–¶„Ú¬VdEPpN43/Ðäþ n~*GÄ&o(òõZ}ç½è¬ãˆ›)ãk&{^v]¦2ó]Ïá‹{'q[Ç÷æê­0–[dÍÉ]›®{³/«ØLMßsˆï¼Æäýó£6ÝH*Rãh»ô_°øìT/u;|ªV![žaÖ2p¢õ3vÄâlœ^–Îoð´MåˆäÏ}]èìÐ$°1»V|(+øSÃ[>éÙ}Éô±RYc1«ó4äûÒ…öÙ,o>Wͤ>\ŸŠRv†‡ôáûO!±/tRÏ{~Î騢®úPØ5ïdªŸBŸ#²¤Ä-Ÿ5º -R.GÆ M ¶ŒÂã-SyŠ ²±ój×w£óŽšêÊëBø1PõF.D5j4ÖQÂöŠà²']««>áÛ[×ÕÆ¨Žòȱ\_ül¢ë°y;7ïÌ Á36åÛrYn×Ù^.Ôí`Ežž8I™ö˜ÇÁDKÑYáù¾²s…­…ŸY²j5³d‘6¡rÌÉ„i’ ›QÁ®Þ¼‰Q^°>Ùr9þ¾†Á¬áÙ´^¡¹ÿ0KA¿Ó÷µpñcu…Íì«=q´B"Ú<½ß8š¬÷ÈŽj#³Ú§Êo¨îy}_SU¤àKG[ad¶®$õôÛçl¶SÞ ÚK% ‹%˜G —F{Ê£‚;C¥µî Õ–R‰ÖXº—ï $·ü"¾‚òR{Jw0«C)îAˆÂÌÄ:ç%HÏeÃ5Y•:/Gö¸Ýˆ(o¹f†HíTÐä-=%ã5§zÅ)¸'©NA}‰â;äwkbÒª=– .Ëð˜â"”Í©½ç-goafRÃÃ:á±VQȾ”ÞJÉê?`B§6•ì&R|ˆ‡wMk¬Å‘RXLP‚aêæëšv©GÝõ‡û‚¾u¡¦› @„Lž»@&ãÚM*(mwÄoÀ—WΡj ú›sÄöÏ2iÇÓÕhÎeZ%Eá}œõ„hSÃüªE§uUCÇ:„‰î Ôœ§뵆褼kEIÍݯÅÙÁw7á^ÐÝÞtSÖ'Ë\5mŽ^~ƒ5ÚN¾Ê¤i 4­ÎèX—ñã/oëÓ¾N—ü+Ï-”ûù1ô­,˜»nXn#ЦxA°‰=|‚8<Š,ëÍšXÏË;-¥f  ³°8‡m93Xñë¢äxó- $ ÔbLŒ®cjܲa¶$Vpž¶r°£À ?ç_‰çhfKÃ¥òsŽCyÔK)§¨nÒE¶®Ä<ØØî÷©¾¸­°¶Izvåªð}e ¹Ý‡Ý—õ2qqÏÙ$öwúÌIºdg.ìñ£V†¦2·ì”6÷á–­Tå6{åƒÈÒý#ê>ü-5tÃCöœ»¹ rô¤˜½@Ëy—}¶Z7m¡¿9[9ÚÉ[LÌœ&ëÚ`;gÎzN4óiã6+ÅÇÏîÖî· ±­B±@5Ö>³œ’¸æ¦(CX½ÕUf¯kèZ0.4!…åµ/œtÖ>ñ”MÎ`¬½wo):…ÁûSŽ N »•ÎlDÀëµ,?_ƒ›`º0¢¥) I*ŽŽ¬Wš;w«ÅvŽëAHâUnU Órwë{U͸âÜQJ;ÿ]ñ©äæUί|ÿQF­‹Vvÿ¤Ï£ˆ˜\­5…-ˆ^ª &ß•ðÖ1½Ð–Üüýþö¨YG¾Ísx›"ö‰Hª‚ˆ¡‹+/D{ ©Wß!KÃÔ³ô[ÿ”¥,ø~pè7Éġ壆ÓYH'}·šrº%kúÈÒw^†1ôÂEíqšR+N¨Ï0æm0qNj–ámI•¹E€ûŸE|Fû_s^ øàÛ‡¨{î^t‰ý±˜UÔlZöÙ·&úH[=Ñ›¢ à˜¦‰µn–2‘ô1½M»M\ñ”ÈJ^ ±¸ŽB/ÿ΋Lñ3uF7,ýdéºMB#ÉÈbu FØ0üñ«ƒôLÿaÀ… °þäc•ÄËï&m™ ó·þ3>”[ìh+Â4 ZïnêÑÑ/󸤩ÍSþdкÉEPQVÝàñ>­7jã „¸¶4[à‹§„‹Ø«pÆýüMLg„‰+¹ ë~$èW=»Öøy¯Âf|ÿm_4’B˜¶ýe¦0Ÿ‹I‡Ãs_ûÓ¶nS³ƒÜôV3ß„d„†¿µà³ ä¯àbûÇîf Wa ð|1® ¿u¨µ¢¥†tлrî1-ËRï–˜w+Š «ºOìùD­³¨1qÜqæ wøúúý4Ø¿ÉxOaÜø…ÇILhÑOÌËoÆRhŸ÷3áÜ÷Êí)H_s^?eÛ;HC)½#/š' !.”a7x’ŒÀ–ã¼Çu;˜ûKg* MMÙ¬)Tô‡2¦êÇZ6@$™£¿6,r.Þ¯ w²NÔziÞ5Šªã]ºóJáõˆ„x`.ýÏÞ(àe¡"ã!êOâ)ë]#s´á}>õº¬¾¹77Ê–arU~ÕÍ×X8K§ü®_´f=þ\âæ„çxc V÷][˜¯\gš†~iå³äÂÔ·•á;¶J«g²]Ð×îx !“¤ñ›{BÎËuFÿ¹¹ƒ|'¼ïvˆ3‰àÀ¢qp–4uÇ-}¦˜jÒtÅÍ”Á"Rx ±mT˜¿kJKßS¬·Zæ t¢d,¨ì/Íò–Yçµ¼—jΠبßû¡sIG®Õמ܅KÙ@ZT”Wa®ÂF}Íj&@{R¥†.Û“U5™¶!ô`= Î~ÁBzaq#ÚAa#„V4Ž››êÂg>ËþeÓ®¤¤ ¯ºû¡©½F.±ýý*÷œÖr«Iã¬ê'•cÀwq%d#¥8z5Q¨6o4{!øA2Ó¯3×#_ßü^G£÷Èܲ`ëTe‡œ„4¢må:éö­@–`“Çé…Ç–TWþ]eV!éhí’P¼3] äMÁ–^ŠÞ›˜d’·Éo \½ŒU øº‹ÐAßÁ ½‘LIî ›”â+÷ÿ'ùûjøDýÑIìèÌÕ;õ—¨üâDÜ¥„=®ÇKáÚŒKÂÐ3î`‹8qf¯ª¤K=ç÷í ÖÛdžn0Vˆ6Óóþ F/ˆ_¾Ro Éa8 nPYسQYK0Ùóâ@É»bl²¤H—¢œšjW;î"»/y"½µ(i±‰Ù~ºuû«¸ÿäEIú»Ëë5qÞj1Bý©ç¿jO˜× _FJ`tŽ«ôÓ;¾0 Ñj¾Évºcáõ/:åû4îD²Xw’ ¹€Ãäs?;„I"vé‚^¥êX¹e77¥€ æùG‹ð©ï邃㠋6øÔC˜âo pŒ,"®Âësè÷SæÊYè)‘œ|“‰½_÷þ„wÓ¸åÒj’Qx:¿ß} °Ô«¡aw$Ú|À@½«)κU¸ 8é~ÆÅÇa™U&XP# Z¯ åCwTÅÚu‰gw  ùe*F} ¡ÞW|XZX²ƒOÂÍLÃk…ɾzŠÓ懣/ÿ$ëOqªÿ" ʸƒÔü‰è–ÑbŸsèíƒQ¸œÕ¤ º_ß“^ïì”g§çáU|\[¡ †e  ™Ú*ldH¸>Íqüé 7öÈLú%áÃhFƒ_4"¸Åo “I¬ï3@J›ìãìO &l™×tÐzsºNQ y ûàð²N‚}B?"ÖDjª p`Eù|뺴­eöfÓ7ë3غ'¸Ô!ÆéÔÄ÷è¡—hÔF1zŠ0«níÐEk§nØgQs8]5ÊÒ¼pgŠó€7kÍxMQðp2CQ°rK—Þf[àɉ̕FªŠ˜¿ ‰Þ)–‰[9%›Š/€!…;ÖZóR5EÄ)oË¥Õ^ÄÈ“™ìÿ9¢aÌÁ†a˜ms|F¥ÁyaÝõ}Yi}Õ3žLb~(Nây¦ïä*ƒù(¡ÐRœSðÌ⣠¯v•ÑD…eËž´–~âËMëÏVÍ}¢ÛèÆ°ÓºüläW䇃QCAs™n¹Q7`€ jFPäM=êÆì8?‘I€(üÿ¾ž^ÄtiJ©pÜÿÒBÍ;P,ó5C¦Œì‚Ç"`¶®Õ™þ™H„wvfïÛÌ„‚£5ÉÃÝÏ,»Ktà‘+ߊó²ÀÂñVAD9Áâl=>dÚ=«—kù> xƒöËØ/õ«ÔG²zìÆœ7fu8œ+B;Â[ðq<\½¬ÅD²ŠŸ’,:»þè7ÅîXY6˜äÄ üi_„ç°sCJBPÒº*õFUôóÝg[„l‰\ä§»W]Þ—.|B7˜á‹Þ&çôµ]@t©²«.0›Vr®*/°­f„/¸­ÿXsãwÞ0r¾?÷}j—U%Bö|e)FýÂv\ “ämü¶tðë—+³}fñ„W—…_cå¯[¹Ô×àù äÉr­f 9u–ç‡ïjÜ º•iÈó¸u=Škêt-'½¦tÇ0/·(^_òå3}úë`·§ZKž§6¹KótÙ§l#ç¯|V» ¯3Ëõ¶ µàÕC3´2¥ÿ¾x Xß :ÈOéjxcÒëjîȑųfR–éE-d1îR`ÎB"l +§1Òƒîå](%ÁÑs³‰‰I8;öŠ¡ze)LtêçŠc(¿\ü endstream endobj 4069 0 obj << /Length1 2015 /Length2 12045 /Length3 0 /Length 13270 /Filter /FlateDecode >> stream xÚ·eX”k6L7HK3tÏÐ)ÝÝ% 5tw‡t+]ÒH£’Ò%Òt·€ÄËÞûy¶>ï÷ýx9fÎÕçµÖºî:*5M6qK¨9XêèÆÆdH*k*iiq°ØÙ¹€ììœhttZ7{ðo ØÅuüÃFÒlæö,“2s{6U†:Üí\^A>Avv';»À ¡.‚)3ˆ%@P€:‚]Ñè$¡NÞ.k·çLÿý `´`pð±þíw»@,ÌÊfn6`‡çŒföM¨ìæý?!_Ù¸¹9 ‚@žžž@3W ÔÅZ„‰à q³h€]Á.`KÀ_´*fàÉÑèZ6×TšP+7O30àY`±;º>;¹;Z‚]ÏùšòJU'°ã?ÆJÿ°þs< Ç¿áþãýW ˆãßÎfP'3Goˆ£5À b¨Ê(ݼÜXfŽ–šÙ»BŸýÍ<Ì öfæÏoW˜=süCW ˆ“›+ÐbÿKÐ_ažZÚÑRêàvtsEû«>)ˆ Øâùä½Aÿ¶ØÎêéèû-­þ¢béîÒv„8»ƒå¥þcõ,Bû-³»xØÙÙùŸ v€½,l@%Ñòvÿ­äøKüÌÃß× ê°z¦ö‡XŸ¿Ð|]Í<À7w°¿ïŸŠÿEhKˆ…Àl qDûýY ¶ú?O Ä `Àþ<„ö¿>ÿþ2zž3K¨£½÷oó¿ R•’‘‘Rbù—ô¿j ¨À—“ÀÆÉÅàåàð ðüÿ7пGð_úKÕÌ ÿ)ï€òŽVP€À?,žï¿L<þ3ŒÿÙ&ÀÿfP>5Àø{ ÙyØ-žÿpü?ïÂß.ÿ+ðW”ÿ‡-ø¿k’q··ÿÛ‚ñ¿&ÿ 3ˆ½÷lžÛÝíyI”¡Ï«âø›ê‚ÿÙme°%ÄÝáÿÖÊ»™=/‹¸£õóÀ³ ¹yÿC\e ^`K5ˆ›…ÍßÃóßv?à3Ïßðù†ý‘‘ó™¯÷ð™ŸÏo~Ï‘|À.ÿTð?#káîâò|¹ÿ}»<ÏóñßO0Ø l6?µ ³­k»ù Nêɶ5ÆÕë}ýäNÉgû÷E…È®œ”»àŠ?-GJmØF¤Æ^6"‘T:ŽÏÓN@¢ˆŒ‹Ž 'Mrlx¥"ˆqŠÂ8qÆÞC’ô†(#oOÒû«Ü Uåµ>ˆä(®f” üæõή³*)EeQ5ªêî “á]ȱªœ}€º Ò÷Á)vÛÈ t…ÎæÉ[…×è͇?ñªÛqM§gz%0y¿GÈ¢¹ÕŸš“ê—ó vŒvrÞÙ´+ŠuÀv±–Ää3ì\°– þœW‚O ¡váS'üpÿ’Z*%3s4ÊùéJ>NÕÈÉSdü;s˜à F¦-ª•gðA‰Üq¼O._ùÁ`ï”ãIî·NÈ·Sš-„<•ØW„ò´‘’sº1ãÖ{ráâ[‰¯Ÿì“¶dx“ŒM‰Qõï§SûÝְЂ´t*wpŽÀ¬èˆ.ðªRÝS¦ŠfEdG~,Œo‡w×gð¤e´ øÛ8>šy¥þ`˜/š´èýæaôú´»j»Æ;¢a\y’ƒ%©\Ïçp²1ÂcœË(D¼šøñ3­p2¶¸ÑÄìñ÷BŠ»³)&pu'6d7ªi£G‹ãàè£oJÖÿãën˜§ ñFï6‘t‹Œ*4ÑíÛo–‹ ôsø†$–ËÑ{Øz¡ü¦cãìz¤å ìÓ8×qYóžÎ«@B?†¤£EØ™Zø“‚qÂ*L¬& "òö7@ñÐé$¹2Ë:ظh]¢vzrⰤɡ…*X§òº ¨ä]#ä&bWÁ¿²‡UÄú(cÙ«w„Gäs_ æX,E””è‹úö¦A½¿#Ixž¥|²Ýl{ô¾üéB¥ýcY¶hócE7JiÔWšLaP¬¡U»ÃˆM,–‹Áè”åò¬ãý‹‘(¼‹ú†F-ö¸0Væ£pJR53§“ ጅB"8W:=V$«½” ƒkõ°óÉkØRhKH'ðlÇn]ƒ$Ù'¡›3kŸ#àHbTÿr³>¦QEýE*ˆ §ê>þb×RžãEüîkÏ×ð&ójâêÐųDt¸¬Ú÷²ªûShndøâÞ¯šÉÓŠjKz G¾ènF8Š%`!«Ä¡{Im\øž ùšƒfßð…(öË7` Ƨ•ŽÃó½>bÇÕ›¯ë™ªKŸ³Þ{geÓ²-p3¡ Oêÿ<úˆ3“LãÃÀ&~½›ó°ÐÛM¸UÃÕÑŽRxhtmŸTÄ­É«ž­2Å©YSŠ.<”m,Û(ÈpÖ7ê 8ûcd¨_áä¨H´¾›ýåE1Iñø«iˇéá§€²D¡³1®È«A¤µÑaÉô‡u£knž/~†£Ú/•+׿êØ]1.¾ûÙ;uE%y«„,¦t¿õÁIk÷Âz¶°•¡d ×ß.e¡ÈÜ„0ï:7'2ràÒ™—>ŒšH¥×íKR{ˆ©ã^½õ0)½^Êd’§b‡š n#ŸÑ7!kà¨{KVÉmy¦­Rƒ^ThìYÀ´a[&iY¼± ‰ФÈóVæÊ‹É#OÖw˜|.sk"ᮓmçt¥l»ßUz”|Q%²À çÁ'Å“é1“ݺ{4­b`}ëgA“ÑÝ8Ïw·r”{ÒÊÙ|oZ/réO¦¿JØo3º§YZ¸;FéñNŸÚ=>qvM¿Bk"[¤1¾×5;±SjßkÁTTyéo$á—º_<â—ùVúþ£–Ú°1ç sÖÄ¡Éöv¡d›Áóâq³G¢¯´ ^·\˜µ¬øˆü&ÚØ-›ŽbuìQÓ÷îŽÒTçõÞ“Nk^Ýò<Ôl¥æF ÞÝÂ{ÌÅNFKæñsŠð 8>ʪæ†xÜX¦Qu¡KJ v73ɚ߇Xi¿Õ¾³‰|[Ö윯¥/2Ø÷suÊnãû–ïäq$ÿnÝòŠñèCoÊCMá‘b½ vôy·UI°ˆÖ~køEnF9ÆŒN -t)Zõ¼”³ Ŗ궇Þ%Öë6Xúbx¼»:­‹ Aá}á•@pU4{ñôBS¯Ë™ºÑ¶^“ϤOvìœêQ&esîhGvNü…uꪜ”p g箹€6ëœt0Õz—j%’Æ™1™ÀÒn2^KÛ4Ó@ià9•ë'Ù|?öÕ{–tP„«p]ôü¾ôzó‹l=œ² aŠÂ«åè¸ì˜=š¹\Ñ7º¼ï¸¦ŒËâ Ž”{Á¬¡åŽcáqDX¬FDšÔĻɨHã"@®F¸ Ò¤õ'b~OpLW‡„šMIZ$D¦²,ÏA—ã'Z‘¥èþ† ‡Ïï42ŸÖï]ÐMà©ÕŸª6`~X>„²õï/niº±ZvÌ%.yüL|G=à¡`m=t¹j³æŸ«ûC!w¼XHsœë¶§Ù¹%È29ÒªÊPb“ ìûiÂŽ/¶©#ÿæ8¥×y0§+<…ìa7ÓÆ'B¹¯òmô.n`“ßkZSˆÀ¥¨=}ñ›ïK¼¹éÎ4 ¬[ô“a¦¸Ã€ ¶œ+4‡@‡ÐO›ûX,Ér&Ü£•íðýõ¬6sD¤Ã^Òf„O±6Æ&†Î æ•ÅéeR/—I7ǹqe©0\Ê7+Õ²ÌË58¯B„r*»[sXP¹)sç b¦— p8"@D¶?+Õ_°mÜ}›S׳PvCÏȇM²&åäãâCÓåJ‚Ëd·ÞÚyˆysm9%,mR™%Á:5Æüº‚q!Õ·I›g¹PžØ*Ïï“E—j&Ö½q5Ÿò¬ÈR†|ÖŸÚãeÒf[…ÿ9ÑJoy݉£Â\¤z¨`¯…w%ŒØõˆeD ¶|4¿~ïFþ1£·>Ô,\q…%Q°‚Pfÿp‰,vSÀ6XLíÍ+ÃXó·L¼M«¥“©Ùi:Ý$&¹Þp°.Š\i¯±¿€¯žÜåEZÇÞP·J[®DÀÙ3£X˜~û`43W‡¾'LµT›•Qèÿ]®_ês¥EdÊI,~ÚÖ0¡2·~Ðê’Îqœ«œ5ª†S£“¾'O¨Å¼¯Ù ó¶eßÙW *U÷‰£ô ö¦Td,×~ÑzÂDˆyÊÀ²tÖOg°ŸÛMœ8q_ŠèäyJajçšÒÝ÷/ó0ëW\T Õ)ÛÍÈUƳííú®Mu~º'ÍDþÆD†[¤n.Í*ŒàòsÊfåþ!ªUuÑ0<È}ðD:øfÞwY›üªÆEñ @{À¦ -Àë!eôçD$Åk–Ä[1ÕS#+8ûÝ7QHˆg<_“Z,îÇ,Ò·ÄJŸ|¾5b a>º%-ºÝ›du{µËo¡§ò§ •%¡k¾¼õÌBàks߬Û Χ—ÿ±´)¿šï{H7Ųhqж—ÏŸü(#ãÆô0è ƒÍ.@4”€ŒVpø2Ê •õÞplð°{Ê¥| 9ÅÜ7MÀy)¿±'9óC(<ôFðÐ\<÷ØmÜyž¢ds£§×‚˜ëã;ÞüuPô¾ZáÝÈØèÑë§3ÔOµ˜†¯¿¶¡»c£_q ”DêæjO¾¾ú判u@“«ÀŒãoPJÖzæ´2Ñ{#nóR<×’R ÎUJع[¯¡µ­ƒÑo-ÇÙ#"´?cAƆýUüdG‚(ÈÛ°0—"?>Û»³¬9H;•FM·M™®v–ZEš9úðú6tŅÈ˲ã£ÕpaÆY9ç€Nûšÿ±ª÷\œ¦` Ë–EùÚ{Q¹§ üH6¼ï¤Qñ°\¿pmd˜= èÛ&m$L)òu܃eæ¬fjÒAÑØ–£Cuë¬×ÝÖœ\’Á\_%ûºÚˆ2 fü)uå¦?„ÿl^ÞDÄAP?»œáŽ._´%_з@?ݸCÆwk[ðù¸Þ­¶WNóÆè7Ãn%sqÉ{Û#(*“ÉÖl JF P{8y—[WRÇ”fÎàô-nß/+Ù 9-×Ϧ6Þ{f®1q£!¹'-„²Ýh˜<6óxÍä^Ôï|Jºø•»F☞Y$’ôšbK^U‰ê˜µ¦‚ói£D,0©°<¾ ½ÒzÌù½ÑþqL²|W2¼‹¹@ãQ=|p”ïÒé-žcLàš\nÐÐ5uÔÝ"^px!ã~C}ðƒraíãZ…t™ÆìªP­Íjš>x¯$~Ð}m+@#>½U ö£úáÙ”oÖá¢m.nÆú’1yµ>x‰Þ§h–fûG¾¯!³Þ™€óE¤Kç>³ø,¹aöœ÷(Cíó µQÁA·H‘üI„”Ç̇YQªŸV…˜¦‘Øå©¡¡ÀÊyZu—@:ÑÑ›Wßµ#ùpm~È×ÐùôûX²‹$Ûë:\þ]¬³Råk8ŸÑ q{÷¬ŠÕäJŠº¦8gFeõ˜=À¦p® †۷YÔHf6ùxý2´ä,;„ª S„-še“óþžOµÌDdÓ³¡™lRs“«Sª²#ÂYÚ4scQG¸–­ ¯zLÅÜ^¯çbÆ´tê¿Ù#®ß~äK¿-„x×ÂÕ~> ¢”ˆÉFhx‰«¶Ùí&6Ñ æäÊ“;AEÞãfA{;Öפñ¾.<¦pþpÍÚïƒazƒ÷Ì{šåu&d­ÈUÈÂ/ëM¤&B'•Àü "RUΞˆ§¯$AË<ñÉ[IJ]CçQK÷¿¶A´a9‹ùdíeóEfZ" ±V‰ÄæMLûÕáO7‚A²©*úž1ÃKÒ¬—«zwÃ`4y'Ž^ÖÓ§ßUD8îßj3‹÷(Ъ¨¼j¿D÷{ ÙÑXrš]hD2«h˜v¸âc'Q!¦†CBÛ(i3“”Vtx+û6ºC¦÷5`Ô+â×˰þ¡:/;ì,߸½ä5› ¦ºâOplÌ…ä˜+ˆ_7–îð¶dÇŽ¡ó/Ë6¸ù3§§È»{¿°¬(´4A#—ŸŒrìæÙ,UóØÚÇ|mÄå…k‡ …”åNé ØDìÏÈ=¦äšò>”ˆŠ¯‚ˆa¶Ôúu§ Ø‘ýrÍpš?`ñsºÃ3Äœµ”ä$éFÌë«[ªˆðts¼]x2FŸ·E‰r H%g'ŸY‰ Îs-¥r|Éu¿ÁZ󱃧ùHåc·9ªÖŠƒ”Õ}Ç“ßN¥·fn` öêÅÛHeèÁR g­é)+K®É(K(µrfíç*úSaëà0¬þF(WLxÄ=Z.%áÅSéú•û¸Põé/njÅ UJ8¦ª·U_öv}¢$~ØÁ8S»Mä8úŠÎ•×+Âb´$Á ͰƌBùDóÐ(3©Ù¤SXl%¨ä¯Ix*Fĺȿîƒ÷ö×%~¾deÊ÷{™…ÙjŠ©Û·^´QS£ìSfNxsjÖnOtq|Ó ­=ù*³z}¶Æe¡òÁ2ucÆÌãÉ@tîy´™•íèÚöZi’Tžß „Drõ[öº}Vúøs9Ò£Óá2("•ª{ ©ø\ÜÍÊLõ®Ýâ']ù¡rGqÁß3ØG÷¹ƒQÇN·½“•*‡PšøW†lØÇI½ £3£õ‹Z×@FP5¸•,¡oóÙ7Ñà-úZ‘FüôêÒðžú¬|ËvPÔ¥VøŠ¥aNËÏ5ë“ÉnJŒ…Á¨§Èk{¢Uã£uPÝ,2O48篙›2±&Eî\>½¯fÏᇼԃóNÔ,F¯.ÅÖ,ˆ3mã¿×ú:N.”¯ã‰^_‹DÅ¥×c˜¬ îèŽNÛ^¨Žðå—É÷¿ë[JXæ£Ãàá1Œöø¼¡dê¬=’ûüvYª¾=*œCæyª´ZöӉGÜáfÊ×àÅÏô@HÃËùÒ’Bô#µI%9µ'Áš8+|»i­|Ýå‚Î&;…Ý$<9²ŒuÆl¸º²:´ãÁjK”µ4íæVFHÉH6°šC͈òî|fÓÖîܵÌ0Ïji¦D†_‹C¦œºçÿi¾ºNšås-zû7Ìé÷Q^88}Ü _t¼œtéz/_åâIçZŒO™ÌŒ¼ìðþ`à$á¶«ÚŠﺻÊΣl÷£cgÆ)J6¼½ýjæq”È~Z£Ê…üÉÀ‚ý¨ÜQ]áanà5ƒá´÷(Êúãáo6¼ t~êõퟟJ†q8ýݹO! „|QÕűÎÅ¡c °îøÜIÛÙok1R$>Q|”ù2âÕÕH…Ãî—p?K¨¶„=×ôØ–=Ód”àÙ,Õ¯9Ys¾ÿ(´d$²“C¨°ß"ÞÂØ×J¾ ÉÑ%mΰÆñ±Zò¸OÙx¼c#´¢‰weƒÜŠœ¿ T 4J´ajv‹¾Ù9‹|+Ã,¼ÕÖ?Åxè‘§¨$\‹r^T’#ÃŽåøýÃ÷ƒ3ŒQ›,FHˆÉ9KÀ¶m3£:Q?vÐÁA(T¦!i“i»×ñZ ›Ð•WƒS8]e¢vb¿ãµM Žùçá%¿‰À83²)Øl—UAª;m„_r7—C” v‘8á9ÒÆ€>íÙõë^J໳šíÙ¹{ÐÖbUm ü®¯kþpd/±{~¾óðZh}œÄ³.M¹ñ玹 ÇBÙ\n–˜/åµÂ§5D¥ÞÜŽ?Ýž7¨´fn6ò„í= A ìÅÛÄBzÍ(-øŠÜ“e  ZÀ“¾¹¯L±’yk«™RÃýU2)ùð¶Ê6ù,ù 5ÜšÔ“$ÿœºÇO5}©<[±QùëÙN0XB)¨ó¯èÉM ™éèñ§ôEÕVý0cS½ÕK§»ëÇø’la7d&íÁ#KŽaÂè`Šõ9޳Ʈ`”ÛÏ %„!)KÏ!¾-L¡/ùåŠ7CSU‹ÌŸItYÃÓ.û1§zŸRÍd‹ ~‰4é¡ó¾&ò–o ;1L5Ý7›ÜÒ€Š¤{Ÿ É(Ý‹wcÉfÔåׯõ*#è ¡ÎmnÈj4ˆŸŸa‘j fVðÙüzK‹Ÿ%nnB¸µ&zó¡Â¯ãÓÞöi‚Ç>A4‹UˆÎ¨BJ%öŠóçfŽöó¥æõ–®°à7bÓ‰© q¬,êYÊ"¥ñ¤ÊTBs[£ä%îÄ“–¬°bºü÷mvA”4Wðtãß}–ËD¼Š /@A3—vgeKiÔ‚ðŽï¶€`Ã+¿â¾ËD'pÞÀÀð‰>¦ÿz\wFüŠzï[©´dǹø>6ú´ÆöÇZ6 ~,0òõW„«©Ù´û„õr ø.Ƥç+«Ä""Ëi1Æm¼7Û$iè¾Îš2¯™ÄrY ž*5óå,YI¬Ùì(q¬ÝÄTĵ‘„ŒâO̰gŸ*3#J•ùØóóœ\qü—i†¤ÝëÓÉ@ÿÞî!Ñ6šêa’´ØRîXg3;«šB5mhwæô®_L¦×Áõ¾åëa^²På’çhk ð:û±ŸOS4mT°E¶ûp1lã„)£o¹Î4Ù&»Õã6ûOQyиnl£P$ #‡é0Íœ(5X\ºE¶ï¸t÷z‰¢?s,JÖëÌÄ»™I&II?‹- M­[œÇ? ]÷«¼ giI甃D£c_¿Û¨Òr8’ÅýB,rÍÙYŒØV³ ò)Ü oZN/àY¡m¤8,ӇܼÕ+Q×;7HW½¬ºCI%ògƒ„ˆ,ÌñÜ×y?˜"˜žn‰óQ/¾Þµz-pp¸ÇQqG—ü}* ] Ýâë…weà”lB7²ùý³5Qq~É×Fê‡þÊO) œP,©“‡Q”Ÿ¿vë›#ÍfO¬µxÖkDÈÛo·OÅ£ý×Ȭèe¨iD¸{d·ÏuC½'k4¯L=ÉåEY6åHûy[÷¶·)UBG™£Ô¨ÝpŒ›e÷‹ŒÍÔq¼Ètw³ñ¨GÉ å"×€éæ(ÍŸS­kýíƒ',oÐ>Óžâ3o0g‚ºJµwo_³VdNvŽÅp æâNK MˆCŒ)M"Olñä”±vå½° g˜°Ôq‚×a=çU`/:M'~Ý; Õ6'OC•g ´|e±¾ƒh—Ø€@ÖÞ)Ïò}›Ìxå-gIÏ&ˆ:.ºâÖrúòå/‚¯ë/¬Zºp‡®Ö̺ö%1×öàÌg!‚Z~çÜ4@”OB)½}ûŸFåÆ_b ³¹DÉj£–zëd¯–‘‘FöËXÀr\>bÜ€nœæíÃ>Ïð@†mkŠ~~~›kÃ*ZS²|»m²´nË/&Ù¼Iv¡%÷ŒNvÔK‘Ò8œTs’†Hhá)W‹.Œ ÝŠ“ÞLa?шÞÛ‚ ÊiÙ±×=ÞDÂ9 §‰o·¡¯»š¢¨‹]•¢_¥÷´’•¤KLk;eóÙ-¢x°óùY¬1ˆër¨™U>nÁèëß>Œ¿ˆ½*óÐlJ–L>hú|%<›:·(‹M.\O·8l&vk©¸•^ú]ñ­™¥£»þβ PwÏ{-!!l Ãk-ôU?(‘Qšˆ©öV €?73ÎÇA”1`Uíìôyk‰è]†N›:•ì Ì+ž‹ŠåX«v¹¾ ZLE·_k%ìŸ_¨Q¾/½&Ø iâjHäSO²qïå  «ù,ÈÐÀÓønÌÝŸåsѬ0mùq)zÞ5¿> ÓFoèS)ßK2•`"€„ñ±IxFg[¡ÜaðЀÝ'ccuM¸h}& nî]j;âÕèÀب})]Dý¦ØŽUJˆP4÷3«ÞѨáÐDÀ|±~¨û8>ø¹º÷WC‡4Œ_@Kõ­®A$"AÒáæm”ÜS h;€¥¦±IËC?îž¼¿˜Î4çÝ& ÝÊ”HG°ZG\ÐöQ솅çÛö¯r„"128™Îâè Xò³“ÙržcšL9ûX ÅéÍìmçŽó0õäkÍ „Y,†õY@ÁËÆ./îgM᪻[¥:¥ÖëÈý2zÝÕ!‘³<æz¢‚³fÛx®úù¶*=±™2ÔD-^«>g¦(vyóKt­Ésõƒº¸zˆÂ«÷eMûõ†vtJ¤¯‹Ìâ`?MMÆT”æ/PnN¥ò®¢l%åÎ+ ¬W¥$tØ"½†¾¼ýrÖ@‚(Õ©½w@]/*?«6Ç4>ìmå1Z6õ•k~Ô=Eáþó63F¾ø>ïxúB ¤EÓ=Œ‡Dç˜JïR½eýÑ´q_ÆCàó´Í&>§ñµð°S¢ôäÛ›@:Dmºò—@XmíA}öw˜&=+KHÖ•#°›’,ÛºÝCF,8eÕÂ(Y:'R[/4ìÚ$¶séËî¬oná2éâøP½9i¾øÆ¼yÞèw‘ä´¬U¾­<DúY-X0¦Ö‰”Ðòõ(‹»9TpsY²­#.Œ¨b»|œ9é°®[§XûvòAÿ¥”ÐWPCä×ÁŽò—¸™4'­išBÅ3'¼M)0i(m›§E~zhkx3ƒuÁâéÚ¼¾?Vê ÊéÏ·—{UÀØ7Q4Pà+}ì\q 0:㟽eýj¤:À‰cо”f5޽†&s÷É÷(U3™žCT*öc9TÛƒÇáztØy!ÁëÃbùþº5ã·Z8ÌæÖÞK=—ž5]ˆAö@Ù>`Ð-Y6O†çš’nÊ7ÒÇâÞU—#Æ= +²~9ã ì–yÚRÒ²1ù‚Të¹ ²Þ{ÍOª±ž«Dï6ÁÑ'ÒíØÖ{Q˜xåå¯I•Î(‹ îõÍäÕ?Þì«Ò-ÞU‹"°5Ó‰4O®kÁ%A@ÇŒ^}ßO‰ø5²V>Bô_vÏßbÃÀe/«}¦{-–º/½—@…y '§pV* Ù¼'åðJƒÁ£€ÕFäbEˆ$"Õpc%…¦œŒC§+ë¾Ã¾ƒ)ëë´­·ÌBqóåNï—Ô¢ÃtÿýQÈW˜¨‰0VàB]x*I§Õº[¡M/8/@ ‹fŸ ³oá~]¦í^ãZyX±žJÅtŸ¬L˜rõWQ{ÇÂÏÈ~L o´(•^X—¹-©ø2oÄÿb½b'£ÖG&Ʋj;›±•¶š"y'2×Ï…o»Ìv úÆlÏ6o(‘ðýêëÅ»2Ö£MŒÐq'o Ö°O½ŸTj’?¹s§)—”+/s®gïf÷_æÍ ÞKŠ8HË€R%EÖ)Éî!¦³óLjš…%‰‚Å/â?КGÇuM_ÏݯÜìi#ÇVþ$ìl Ä›œo¾¥&è‘Nwí×´6T©l<Ô~á·Ñ^nÚýᘨùk±¦¡ó§0I›IIhà‹ûwE¿¸sKÀ²F´ îŒþ £ï׿¬„nÐê¿qFˆ7*´íŸ¨üÆVƒ…þ–¢%oGKvè6¤aK¢áõg_!>=00æÃ‹ï9á;ñƒÄ'bŠcz±½OÙ¾§¨¢[¶¿ ¡äà/š Šñ0uÀ ü2jc)m|[GiÄÿj϶ ñ‹\Ýä¾ã +5î刺BÿåúŠ…šN‘vkyŒçuÝ©XDs~ÀΨ¤@ÊU ƒÐàÆCHØ^éåX³ÅRŒZÙEíKÌX) ‰}»©±8QÏ&k„Òí4s¸Xæ%,¬½ 599d?…žjËÉuªHÈÇmC¶N>´¬Ÿ^\ò4{÷%­QùZË8ÞCŒ¢2&‹†@²VH!O… ®QžÊú (q}|¾fø#³µ²Ro  ñÝ_4á¨MÑYoÂê3sæ£j§ÓU‰ø~îk¾F‹oB!/޹¡¡uàV¤w¹"Næ"7s`û–q—ÜÆÒÆ~1w)¿ß®0¸¸`­¶o¶0C9 ˆcAuÄ7¯'SJˡƩ•#õÝ¿…ù@çÀgxÂEÁ_>¡ÆGß꬚G’3ÞO²ÅN‘¸mwöaÙSÖï–‹.ÒJx¥žm€Qâ-]ZÚåë¯Õ¬ŸrÉeüªŽ(šh­õ˜±ë@õJTµ7lò˜FR”2ï-¼#úZñowÜÔX`›†UÂÚ¹§§‡‘Ö«È¿V3öË)”Æ~ytõµ QFØ\3tbý“¿žr`Ï sŸÝØi¼K.Ø87ò…0tb…ÔìW]SÂ'Ÿîzίâȇã¹¥Ò'jðfæÁÃzä– \n¸ýϼwò]ò蘋›zÖ_(ýæ˜ÑszÞùÎØXÑ¿Ù%¬*U‚[=Kô„wjÔÂmÞÓûžý8 gËæ»ôH*s#AA‘÷Üò…+>üÊ9'ö`GZËàDCæ¦ÃAãohúÂeqC6 a<ë™ú‰(RË/‚äÎ1ý®_ŒH[rµN‰ñq_ Ñ7•MJOn¬0*ý^èáç–äLã­èäªÀXÌDú¥X͆EÕ눓ä,ˆÆÃt²†Ù¸<ô°Ë¤•å̼JÿŽ©²&σTY¶t0žyÏcçûáÌ9F«•©cúè¢(blyfnúXͨ5³›u¨ÿ…JsZÔ-©ý­k¬lrÀ Íã]ït÷êØœ.™<o.M7ÅŠŸëVd*`‚_ý×ydþ0ÇïÊâf¥Y D*Ðx”Ú1¨Ä“ñ7ê=/^þÊ÷STxš/”"ÐÖZ|þâõ›ÅÛ‰®Á»ÁP–3™óm}xñs{à×ÃÒŒÁöAÀ!ØÄu²=’ÃM.Dï‘éU¸Ì˜IÍÔ Ä“ÓhbgEZ0ÏùùÝÈŒø[ý €­S·™œA<®œzv±çWº§£ȶÿœ?Ýnæp,6Òþ\ñw1«Âx£svË6é)8µU^•=ÞÔ#vÛ_bö¡¦ôö]Û0bìb2éõ ³H[&®Ö*|gôÑÖÈêΰïÐD2rŽl­iTèhž6}¦¶|WŸ•Nn ÂÞ û%S"ÛÈÈa‚ý^õ}WhdT«"(qÔQˆÿ®%[gzZ¤³¯bAÎ1Cw·à + s%‚^q–zu˜h£ÝðÐÜ^¿ÉM°,Ç2Û q¨6HY€–ìi¼hÀM”%°æ×éÉĵ´gu£¹ŠÛ%l¨£eõUùƒ˜ð¢Û‘ ±"®;'‡ w펠ßÈ¥4…ÇÆAŸÎò4ÑmQžƒŽG0£¦ÆJg^½¨2b«¨ôìÜ“ög‹Úªï–*@­¦©Z·åeX‡íI)e»*q•|>£d™üúü ݱÁ•ÆdXMó•G-Ø}f—¹íÃ,ç$|›“Ëôé6«ÁLZ4ä—%(í¯ n˜B««¥V(BeŸ c êb¯?iXÄy¬zvï\þ(YïPøn¸mÄÀ;O° ¢ƒåŽÆ9MRÉñ-ª‡÷_<¾'Ryœˆ9ø4­Ž"<$nË÷­æBô„.Ûú.B‚Úät]'”C]jC÷KçŒú±/V±(VTe#ŽoVv'Nðè®ÄwòMU@c½O s¦!rÔ¶o ‰Œ¿rËëJ>Š'¦¿‰«VjÑ\ï©—Å $­PìD17ІyË/í˜;j‘¶9º… Dôp«a¿–ú”×´Œ0k"ó§ä^ÈH¶uç“@„©¬¡ýÊñö^7 VóÔòÄ×Ê-¨o#‹ž,(ê†UùD-R°ëò‹1?¡YŸåæ©ì— À]ÌÈs‹"–ö6DÓ•fl<ËïŽ{Ñ$0~X@ÎOþñ@¾1Ë•ý$í@¦W¼ö|§Õ'Í] ÓÆ~U]¼øfÐ95¡þ. šh FS˦R¥±o±‡¸ vµG)çÎ{Q6ãÆwÄžøŸÎŽ‹«?ˆã'}TI þÑ×¾%N·/Âêž…w’ojo·‰Ã}¨reÆöè¾ðŠ%ƒ{0ÞxÂIKÃD¥TÓ_G'aw)RÞ¸Ö0æ=ªPfC&¨?R·ŒàäÌånr9o¤'ÑVSðàÔSÅ"º@£ýo‹•é) ¾²é‹ÆfäÛð=)^ÃýuÄ'äÌžk1O’ì©^åfK§eÎo™wÈ]¶–ü{Üî¼gíTL9ÕѬÑÄ—·bVæÄäŒÃÎê¾Rr¨¦e^ÑA>Â).ÔáZ &è¨$ÇeŽ'Xˆµcú™²Ä<ŸRÄèSÞE”²ù‡f¤ N3*Noî][oIË— Si|¯œõáÉ ªJÛA~õqTpV ༂yÁµÂŒ¥l¶„Jß$D•Å^3FV_ÍöÊŒLÞ‘öéÈjKɵNåO'Æ\3Ë ¥˜ÈÆá¾U!g‰­5òx'«Ÿui‡¢&J令±Ó…=(8àÈ®`¨§1’Ç5m㦌LÝ:’íï­Óê„ózÙúÑõ¥Òy'ÙKrT¦œ¨W5×ÉŽb²77Õèšo>i GÄXPRJNÙçÅ笚3-{üø¦“\´Dg€tô܈¡êø|o|©>íW:ädhÕÐôm­÷~/ÇX’ÊQ.Ps™®Bn «W¿‹þH,p¥[ÿ„Îo¶”ü:ò›ÐÏêT‘8¿%ôÍÖ¦—¦ž–º™6M*Ç~4I+D>®ß1 .¥O\×1=y§ƒ²jÞGpFÍV‰*¯B*Å87/ŽÔ8Õ6S=||w:ª²)R>·ûà¢6rÈB^nV¹¥¨ \xÇ%ÿpHjp|%ÝõN`{âjë€pÓ&Ûq.…®­3þ ×øxâüÚîÔÊacjœÀëý¥EËVCmû"‚†‹±àk;§ý‚Û¤ƒ&êsäKœ z‚@†™[Z8-zÔ€\.f¯Ld *K3*Äadðg°»VÕõîÿ˽¢a endstream endobj 4071 0 obj << /Length1 1423 /Length2 6058 /Length3 0 /Length 7015 /Filter /FlateDecode >> stream xÚwT”k×6" "ÀC7 ‚¤tw0À3À ]Ò ¡Ò©¤RÒ¡4(‚”€”„Hw§øqÎyÏûÿk}ßšµžy½÷}ÝûÚ÷Z ƒ¶¬Ü¢‡!yøyA€¼†ž?yA \}(Òò——Åâ€Âaÿ÷€€‘(›‰jÀa€ª§ À/ð‹Hð‹J€@€$þî!(€½ v€/  ‡A¸,òp7_¨ƒ#Uç¯W€Ý–àåþȺB< ¶` F:B\QmÁ.€Ü Aúþ+»”#é&ÁÇçííÍ vEðÂ=¤9¸o(ÒÐ… ^;à'e@ì ùC—Ðw„"~;ôàöHo°@\ ¶â ³ƒx¨ê€žŠ: åý«ÿpàçåÿ;ݟ蟉 °_Á`[[¸«æ …9öP ¥¤Î‹ôAr`˜ÝO ØGѽÀP° ðkë`@IV£þᇰõ€º!¼¨ËOŽ|?Ó ŽYf'wu…ÀÜŸûS€z@lQçîË÷§¹Î0¸7Ìÿ¯•=fgÿ“†§Ÿ êî QQøƒA™pÿ±9@€0 wâcëÈ÷³€¾¯ä—“ÿ§Å!Ðß îØ£h@¡öÔ®?ìž@ÿÿtü{…ËÏØAm‘€ Ä Ãý';Ê ±ÿ½Fõßê˜Pòã@?¿Y f‡¹øþÿÕb>%%5c®?”ÿvÊÉÁ}~€G@ˆ‹‹¢Ââ@à¿Óü}‘ÿeÕCÿlî?ªÀìá€øo¨Ãû‹‡×a°ÿ™àß4á(9CöÔoÙ¢üÿçøòÿ“þÏ,ÿ«úÿ{GJž..¿üì¿ÿì uñýƒ@ÉÙ‰ 8j@`ÿ 5‚üžg ˆÔÓõ¿½*H0jDda.$¡õØiC‘¶Ž¿UôWPé] 0ˆ6ýyã<ü ÐùPCg댺U¨nýrAP3õï’Š0[¸ÝÏáÀ`_\Ja€??jJí >¿Ä ðñÂàHT€¢ØÃ=pöTð¹¡î˜ ÄùÓõÛÊÿÇú»?Íÿªjëér")µ¥¿Ö¿æñØâNMÀm%êÃßœUÉÒxó,Äš_lybÒ-Œdýœçï¨~+ãÁ¨»œµ]9eªödiäÈD çÎÙ yGVÈ\Šr.M±gIn'¿ïü°ÃBg§vMYº½›¨CKdm†aÆ–d4q!Ú)¸Z±Rð½±j*¾ ¸E'Ä )4ÈxÙœÖMôXæEäsâ³4O}ƒ¡ïè±Ð„S¹7qTç¾Kf é¾|yŸÕÛ“*xð\­«R¤<ò©Ÿ*CNÿÓwTd‰Yª 4V9áùÒ$Áݱ.´¼þX£[ø6:]G:Ù©^7cnÞj²5¾I½iXŸ¼C¯Þ‡M-&Wâð¾gÃ{MêhÁ(éjN¨N¹= )Ô5IÇÖªWPbCð(nì´W`SÉý È~v51ƒsY˜±‚ü’Èÿ^ŸâYâBþ\jÀ⫱¿¨Óomõ–W±©±ä Rä?º¶¿ c. M=®›zG,oo´ªÁº&nôN1&L^X¯’yCøJç¯^th´e€…NíoÝí=‰,I£­~†—BáîZ›ØÎFi¾øX°bþò¦ÿ&®gÀ-7 Zþæ9Ûú3¿GÂÇÔI–YÊ}ãbl|È«êú6_Ü·ZºŸæ‡ãA>:e1wˆ b寱¹1ûF·b–1Xx ~ÜszaÆÈÕÖα^RUÍr²°F‹µÜ À‰šÒbûøâe1ádõ´º‘¨Ê:Žškq毙ß6òcBž;@raÎ^O÷umyÞ88áV<Ÿ÷é²%Y7|8è¶#›ÌÁbÍò"ÉïMdŒÝ¸ê²iŸü¶ÅvV¡O\}[‹c!ÌŠ¦ÛvÒêæ˜ºGk.¯þÖÔnޕ޾·Ì(±®ΚˆÑ:¥õúyË¿y± Üí ž=bAR¤Ìbè'…‡\³dH¦º èÈ©…»‹žˆÖ:åÚSMË(dÝâ¬ñ{Ü ©?rÍØ —Æ–LªˆL[¦)PwRÙ<±°/ï¼ÝomY’"¡SÚôy°ÕKDwTzp}x:—'> c*k¦y™Nm:"‘O{§›lL!Vªœwú|ÄóJ—8LórŒ ^x¡•šx[Ó·òÃP&¥‘™HgÝ[ÐrŒ­½Çˆ§w~$Gú ‚ÆTÁä%Aí'Ùªõ~æžê;“±ís bÀ=ή¥3žÈWIVškïÞ/h±9)>i³'ÒÌÚÀJ/2þ5)Pp ¢ðýXq—~Gb…wØ”µÝì1•gµ?Z™G¥Qê'K~.YNöab>Ž#kãån+6¹L—­©S¨œ°æXòæiM($Ë9,"“{½lÜRÀEÏ÷$·¯;¥c½ø¯{?ëýØŠ‰îÇ…!ø‰ÄDÓ’1áK²à&û(“uw§AÅò@I\ëÊ9QÒ€øQÍ+Ö <¦è½hMddUåšCI"ûÏ®1ZÇfZ(= PÒŠðÚzd^-wëû~ ãgÃ:Ïž«Lg[g9ÕShçÖøÝ>, þR…NÚX ¿vöðjmG:B?Ã<›+¥Ç•ò ²áªÓ—€¤„n½Ðàc«*3?ï&°¿n›÷D>œá®¿’?Ï® ~²è ÌQ$Þíl)µõ×z™yzƒ]ÅÊxæ˜!1‘=ÚaÉ%ªy„ü²x?6ä<”!AfrD‰ß[ú1@5¸„°.ºÁQþí Ò:ý#<¤Bv˜¾Ì÷)Ek) Çæy¬öå[µºD¾cÛ7Â}0û™Þ¼³ÏÙ6Y»o•{åÈjÞuÊ<ï`”^a•öÍ=OHrÈp{:“r¬jD¤ùGzµZSOŸd“0E!ÓÇTR\§tñ%žWËûâ7ËSN?½÷Ô¹ýr‚ ô¬(;Aa_o¯†€z 8·+ÃÆÁ–² [m´ÝŸxH‰ r—¦Tèãåru׸ÿ"pÎ\¯Û÷I#0ÁÏEÏ æÀ/д8d¨*ûÑ«CÙ&kâø¦@Ž…AU¤Õ˜²³™ÄPãˆ]·”ˆE4ß⌌é´õ¹]Ôôäš v™\ÜëëØúùû]æ­Á—uS_•6k²ûRõÌúãÕ¹ ׿—\ÊøEùÏ-Ì«˜„g#|_s¬-ïà›Ò‰˜³†(]3/òu“§ÊPÇÝKvÖ˜‹f¡o™ïëÚG~wõ{ud]îvQÓO,8kcc„ݨ[5l–.MmMü¬@’€¹“ ñïäº+º¼¶hD`(MwšžØ;>v-ˆ½¸¿_o‰*“ô‚ЍÕ_FEˆ8ó‚qéuámýâoZ^Iì8%£Á&¯ß$É·'P©OGªCÓjjcyŽ‹ç²%{ÊxÝ^ç- d$îEK“ßã:½éSÑòFïEšäPNRÇàµÈ3 ¡¦_,hìRiñLQ y-9r:œ“nm1˜Ôocq~ö¹.4´ˆôÈÔÅÊŸÒ¨j? šo4€/³Øx×Ôd9­OQZNaÜB¦oS<3T`NÝ¡&Õ*äÁ¢K${Ÿ•aü¶4}¬z~¼«ÌŽ  ”öJçê»t_bdVè–&í=ÿ.X¤ümSò䀑tíÙŠb¾æ'V¾¶gѺï*ù¾p¶ùÞüz[’Õɤìa8á” ê=ò}à ¾ƒ4§>Cç•Óy« ¼‚“‚Šu¯3»s½ÃÒ­ñIâ’¯6¥È'¦¶-¢Kµ§N+ùn°sP©m®¤¿wcê$m;DÀbö½U\IxÜÐk½RÔÅILqmŽQl: Ô†•jTGÚk÷t„éCì°y*G¼½ÚÎe¾Eà S/9Hî¶=:¸äž1›ãío‘ÞL-ËrÈVá~§ÔÀÇi"ðrM/édŠ6?¾,ÿÅGêDEb’Ôë[#%¹.hïq.¿ß©{fÿ’­ê©ÕjG°eÒ½¹ñõÀÑùÀ¥L³‚ûõGÑØ Xœ{âA¹­Ǽûù×:’× ûO„XÐé¨áœýȲo:«–f*í Ó•x¾qrŽA¥7§-èé£àÉØ´y~J}}æfô›8ƒPÎ8N.Y&‹1½SuÜ#¬ÂB^ÔÉ §psàå®à™E–ËGu¾%Žõ¦9çy \͵Êq¶òÊNïÌzn¨ö’H]õ¶ž$Ê‘ëù¤R;Ó^PÛ‹é–²ZzGÎOÇÌO·D†PD)~) õ:z‘/­;’t 4^ dKrvy;Üû,h]ÙO5;*ã¢{L별ÀRŽY–GP `ð¨ûƒ%òÞO6Ô4l¤òNšŠîýwÅ»93ê9\kÙcNÜ uO g*§Ë”p ”v’s×Nó¯VV&/¹ì-ËÃÜ+éù63ãyï6Š<¦‹\ ía¬ûö™yn¼A³H¥bLhRnU(Kòy´|‹¬@îôÎQkþ Ô—ž:.n<½$Ãòãh­F“¥äy c]¹hì ¶CœŽñË™…ùÉR~pÉ̳fiþÄWÕ( ¦C4ÐëÐ8ö‹…ž5þa PÝÖfÞÉêø­ÂtãÊlꪒj¸&äÙŒŸEnW‚íÛäú Í¿ 3€•c‰M³ù*7D7ø/)8Ôà×î˜@·˜I±Kä¸y1Êó9#ž@­Êg"ÕuG1Äæƒçj•î¼ÏVÄ•ÍçÛÉݨÄÝ<#* ©3ï_o|~¤`°rcïè!÷Ê£+ôö†âôr‚UÊ"EôÓÌ®Ç'7…<!CjÄ*s %_r®Ô ¹÷}›?k 2[a~÷âÜ—í<Ü}YI‹–@ñyŒÞiÑÅÔ×ÌRžIHûøÙÏÁ–Ö}lÛ~cµË„ :ÏåÛãØÝƒEb‰U/÷½ŠLÔ´|ÿ ¤ÈB•þUqÐHð¸*U&Ñ UÒ¬Sß¿4c”“sU‘:jÜ3ÅX쨽øXÓi 4yü‚¦7AÞÙþq›7&|‚¾ð"T;PÝÍᣖ¬"Ûj˜<ð‰ìÚ6è^±OkߣˆâyqaÏØâ®Ý†ü勺ÊaxüûŠ-£öèI½Eµ-‘Îvo‰Ìê6»Æ¼+„©— ¤žûQ_Ôä=ÖVfæôN»,÷Ë‚¬V&Bêêɼoðæª’DŽ$UVIJ}«¡}tºŒÊ &øf#õÑz¥"ß§-ãŸï[oÈnñ0Õ¸ð;Ä”`å8 VMIàˆ±^°Þ={ñÜ`[]l÷Ë&Ç¥¢p^´®¶ÜV.æÊ§#Ô¶E†)mÒ”ƒ‹_—l\õ”ÍÖ"u]é†âQö  4–°k„®€·’&šŒrͳi'úÅÎT÷TZiô|Ÿz8õy£lÿÖEo¡…‡=·´<_Ãú†ÌRn_Ü9…0|y÷éÏûĔ_Ù3ÃS÷Ò^·‡êFDÏ •žQ²žÌ`¹x>L¶,&}L1ÎöƒnDֺùŒn="ŽÜ—¢•YÒX¼d¥ ‰¡³D7)`LíxAP…hÛI¶é(N” Ÿþ¡]á»Ó»Ÿi^ Ž3Ùñµ…a©qµ¬ƒá0á;£¸ñöÑž„àw ©ó3¹´(ž¶¯K½x#MÃÛõ-Ìm<ä—ÏG|Y6¥O\a—<²)ïþxDóý½ªK):¢äE˜“¦L@ѥ怉í°rÜAo üµPºUÚ}¾àÇùþ¤Žæ™¯:ƒò¿y?¯u<¾]ØÔ9PvÙcuws¯EïÚ¢Rô®iÇØäÚ…e¿ +áƒQ€ìñz´³s£Ðá£Ef&:d;±ú´³· Ѫq7RNzoÒý¦ÃȾF¯zâüó4‡Ö‘¤ë‹1 ™ØTéÂ(,Ëaz dÎŒcÐÍÙðúŠãµîÇàÍçã6£.vÛ[ –ÅŽBÄKïíã£×{Eóu0¹N5—O:‘[jÚfoαÛ8t*­‹ú]¾óY±w‡¥uuè+œ¶å!…d¼~Dß±ÒøcU%^‡±´`ÝpÔs‰ü<"åå´ï±2êDKà‡ÞTEå÷€¿åò6×Ê#eã2óö2Xmû„a‰L_¥I2>ש|„ù³µˆÇ£ÊըﶣÕA#‚š^åe?õò&ƒÇfdÃîÀNqóNu¸ÆÃc`˜ésENß ³oêÓ˜Î6vçªÜ¢†êçïߣ*‰Sx¸Ûø¥+>6:[0r8þaÊòXÏXA,¬1ñ8d{²fÄvÄæJ]ÐUJ? }+¶OîUÙ×R$O~©Ãd>bRjçŸ~¹¯/5&µeéÁ0¶áÛÝÍ}$ ÑÁôÌÅ_w±ÒÚx¢A†wjêïD¨gúVÔ±.ÂŒ¯×¢þFhƒˆµ ˆ”ˆKPKÔá¡ä›1¸ô¡Û¬õ;¾>{~&2×0%R¦ÿãCDº©Ãy6ÎÞ¾d)½3ðФxùå~91΂“Y0ÔÇî!9vî÷Ó¾œJ«&oJÞÐH«OÖuÿ•"  endstream endobj 4073 0 obj << /Length1 1502 /Length2 6529 /Length3 0 /Length 7538 /Filter /FlateDecode >> stream xÚxT“Û¶5M@¤Wéé5€ôÞ{/‚tB ½÷*¤ ‚ÒU:Ò‘. ]šHiÒ‹ò¢Çsï=÷ÿÇxodŒäÛk®²ç^síd„ÅÀ˜_ÑáVCÀQüB@)€²®±…ŠÂìì&P ü·€Ý ì„"àRÿá¡ì¶G¡m*ö(´£.Ðò„„DBbRBâR@ @”üÛá!P±÷‚:tZ8IÀ®Œp÷õ€:9£Ðuþ~p¸B’’â|¿ÃŠn`(ÈеG9ƒÝÐAö0€1£|ÿ‘‚KÆ…r—ôöö°wC <œä¸ùÞP”3ÀŒ{x¿(ôìÝÀ¨ °Lœ¡È¿cåmï  0( G¢C<áŽ`º:ÀXS ï†ÿå¬ó—àÏá„„þ•îOô¯DPøï`{áæn÷…Â( ÐWÓ@ù øöpÇ_Žö0$oïe…Ù; ~oÝ ¦h°G3üà ò€º£H(ìGÁ_iÐǬ wTF¸¹á($Á¯ý©@=À ô¹û þi®+á ÷ÿ{Â!¿h8zº šÂ¡<Áš*|Ð&‚ÛœÀ(€(PRLLT~û€œ0ñuÿ›ÑýÝîš8 £?ü‘ö^`ÊÃèÿŸÀ?WBBG(p;AáÿÎŽ6ƒ!­Ñý÷€ú,hù €¿^ÿz²F+̇ùþÛýw‹UÕjªñþ¡ü/PI áðç–ðKŠBBBbqqQ@à?óüëþfÿÛj`ý³»ÿȨ ‡ ’‘@ŸÞßD¼þ(ƒëÏØpþYAÖ3Àõoù[E ô›Ðÿy~‡üÿ´ÿ+Ëÿ*ÿÿÞ‘š' öçúËáÿÁíÝ 0ß?h={¢Ð³¡‹@Oü¿]€ÿh]°#ÔÓí¿QM”=zFáNhó ÝÞÿËEªA}ÀŽPÈù/-ýÝ t 6@ ¡¿îtø_zô@®è»‰nÙoŒž¬ÖU…ƒŽ¿FPXT `ïáaïK€Vz% ðBϪ#Øç·Ä‚p @s @¿+„Þ§ =ÜÉÁÃä Fß‘Ô/‡?˜èb5ô_ s@.ø?L"AÔƒ~õÿß è…{"þ±}§‡zÂë Ííïõïë öƒæg é—Úˆ¶‹jEzoþÜ啎Ød‹¾QÇì3g¼õÉGJvޝî?1˜+š˜  çùv1êcÕ•º”©Q€ÂPí[S:à/ü~ÜåfrDÐ9‰?‰]#ÛO1d$±³Ä±äL{0s)Þ-²ùúË‹ëäæCÉ€ äŒ”%“õX1¿c+Þ‚…m5daEšHîa™åi¢i:vM6&à…‹Ø|¿{a÷8'EHØ:C&1ðù¹’˜ŒÉ}òàã•L€‚ŽÂ@[ÅeÅsøŸÀéó>h¥9süäkÓ»¶¡îèÛ7FªÉÐdóöœÞí”7š¢gÈÌxTÅP5Ú³ˆN[î¤ü¤©`£‚|ƒÖué‡ ’sã¬If"$…&d³&:›Yz·-¤"C¦H‰)\¿•3¾þøRìý3Ù°&Ù ‰`ÐÂø¦ŠániÍÚÃîï·l’<…ñm´ ::Û•êqj¡î'Cw’¯¾*YL†ˆÏ,(ý4 ¶¥( ²*€<þ‘xºyÒ°_`®Xó›Þ9¼fûü=cûÃþD†¬·ã»=휛> —g8CêR¬Å°ÊÆ$ÑåÅ~ªXSË~{¶“&|î÷Æ“ï„B–çÒ÷×CÝm¾6èí»ÿ¨x¤¤ 'ᜋ”Y{¥Â!éCc¬Bt*ANd?Þ&<Àp†4¬Ãäµ?RíX²Å7Å‘Õ]ª»œõ0,R´Ô0j øÎ±‹ÃÔ$~xˆ|ú,h®/öÎWÑYó-hgÓúÁ#z•0ÝfÜ‹ûË¥ÇQMdEIÓï‹Ì Tt®…×l…›ï¼j.GhdøÑøLÒRnsv¶yÒ´"ˆ.Î.è13娦•ìe7'MaüàH_Ë‚1«ÝP[ëa9 ½fRËw8,y5È #R¾°”/tsáG0xA¦á¼±»yº;{Ìuç0yÏR ë·W6ÁF/¿XW¸E­“~€–FhWèN&²hÞI¨ªý±y÷Ôˆì§-jêtvçûìO®{(ž÷¥SwLŸåù¬žÚ‹l¨•Á°3:Ž%|p^Ò㽘D¥j†lùGÛ©8:‘Y/òÏÎ^UÊÞž ¼|Û?Ÿ†p*û.­VÛ¼žz­` b’H«Ó‰?â §ý‚©sußU_–fïg¥ÂŒ) µìŒoÑ¡¿DóÅëC6±8þ#lË,¸»ç—oFç¾NY!ZÃlfÙÞp$lY“IÀ2’Öß ›9""º“WWm¸sXL6zC쉎±V^~›¯[¡m7f-”NúšqåiƒaK (z”-¦$K¶Pä_È6YÕT3ÖÆ9q^Na-ˆ;Âè3Ñ?¨P0•ÉÏ%Ƽ.ÙºÃÖê§>OûW镇aì;³#¿Wlä0šgWô^P‡­o¼4û¸>:Þi_žc}òU~škïÈUKËr&K¹Ññê¶-Å5Úz_'™l °Á6Øc1t?¿Ý•LÞì!vÞÖ%]\÷0ókgÿº×“¤+¡/Y"uƒFª¯»4Êàì Í…vO(o\êÀ(Âúåb®ƒŸº²<+{Xx±Ø›åkMæˆØãáb#ƒ¯l_Þ4KÝ´àlOT½7÷µØ‘óeÏF'=s#á;a Aú>ûab`ô|'}ÂÜ'B·áȪ‡Wt½E:ÄcoO惆ƔóX/ãru4Š?´h:9nÌçÎ:Å{”Ï;»²ðÍèi-.ÈÅ$ °Õ}ŸpmǯP‡$7ý¦ç<É«?+G— ¾ q”_¬1§Â¡à ·ì=wÕ{Ð`ñvOmNæ«R`]æ–kÝBÞ²Ñ×Çé1á9vR –âÕõ®[D+FÂ(É,À-1õn·ü>­áF Õ«ˆBß§iI½˜É÷yƒ’_0õ¦«6€?ÔÎc§êöïÌ ¾:c¤ÞAÍEb_i€s¢æ ”ë·¼ô¾m²ª‹–ì}Ã+È·n*T¤I~›Î°Y͵Þl6}¸§^ö&¦ ¡@é·äQ`»'ûCÕŸ³âþp”¹. „«ónOFMÔ>­Ÿà§ºÆy¿Iž‡ͱ*˜Lý÷ùI¾¯U÷Üãè_6+¬D¿Ä©{·B;פ¸žÞÜÕŽ‚uÔŒj\Zb˜„ú Gu‹# byêŸÁåI%’ o×Ñw™.4„¸ÅñË’ ¬Ç{öÃØ€Œs?Cë+{Ìä¡ää±~Ç›ý}ÅrŽ7.¾&9C{Ìܑܾ ^¡ê™ÚCÂÍ\˜ŠÎ¾áCl‘ÐóF~8â¤í¨SfÜ¢}Ì¿+$xAœP šÀ£*zï‰côá Db¦¿µr…ÛOlµÛ~N,ã1<Ï-S·\â>ðëýÝ)y…8’HêÓö6tZ|ìžÇ#dCA&0ót´{§†PÇ,6èäÝÍÕ…%Ì~”ÈšrW€µÄ.¹µÜöµá(C0ݺûÛ³¾D¦!<ýMͧ±µ‘ìtPuMNJ˜ìÝW]Lfžáö \ÁMoÜÞX#‰.…ùùø?"PS»B‡¦Û“üÅçræ,ïÜ2À‡C £0jâ7¬“fÊ_/žJ|p¥™N¹%ã{‘§çIdŸŽ·]\ÖÞ'PÒ¿…Ò«/î ×’6¹*jZGsÓè^7}¹±Èœ‡7Ð…=ÆÅÍNšæ(ã±IdHá¼)`¬Þ½âx3 ³<Ú÷âÉyÓÝ^5ùÍö|o:ˆøUH£La/§Û.R&Ût+TÒŶ«Ô°íãé:g‰^®zýþÊ­,9b¬¾²‘·.Öõäðcs9­B?ùy•½Y½‹HÌv8ãcÿG4\r¬ó<_ã;G\Ë|E.«qŸ!DZkÝDI*Þ«ÍÖ/BÛé“©vŸù«¦R ÷Ä{‡ÎÓ®d“ °Q™­l:Ó¡òÎü\Ù\]Ù¬ïïTQဠM…—U¤­Ê82ކˆ<={âÎ 3¬z–fø%;Ça¥ŒJÐý³áøƒIÚ£µ ÛŸÓŠd©ð Ãx7EnÚ‰þ~Ò2Óù¸¡nGk–Pñ÷cÔõ;yÏ9y¨¯™‡˜`ÂP2ôÓ ®G‚øòåÂn´ÜùÃc“檽Œ•Õ¢ ß{\kUvìý+èIKYÚ ™òÈeŸæȦR%ïËiø}Õå}KÔÄG'}m†Ç†ÏÙ.Ùje)é>‡ÍæÉo;*ˆ€¸I­E*è2‰·§¦1Øyt5zè²·Šó¥•Ÿ¯dÝôpo§­¢t¹.P#£#íŒE"Q{êœç«ÊV™-îÜ8¯¸ÏpæÙ2çq×Ls5_æ7ÜÑÕm!h¨‹ zÔïÅÑX5t®¼¼!¢‡Ñ¨óYçmbàéŸBlk«¾0Èçåúª¼Ð4þIÚ©é…k«öhToeÛ¤EXœBXÉ•q†u¤§ÏÑ©—vrÅ“ì"ç²ÐäON€Ù½>ý&m7MµùEq_Cªþõ³ F¡´†ÕVÿ&ïð#‹‰Zb>‚glje25TæÌèäÝð|'ž4S,±«É¶†uô+EãžÍŸªkÏ8×éÕ[6áhÙnÇ„(ã˜Pû-MBnoÞ–™ÊLO¸ Å´»þVVšÑâl»^Yd³ 4ºK†÷1ت,„lUOØRdŒðÔyLº]äµ²Ýy¬½ðÀ?OwjID~6éq¹î‘õw©´Ò”d^ÌÉ‘¤Y·ÌW¥oE(1§ÞŽ-5§H0XÑ”–/`1y¸óI½‹}fj½þ:'‘ÿd›¨° W×kc™Ë…U¾¶ :+‚îåZZ÷b½p7R.….ÆX áy⫃ÛF–4ãY=—{_ðr†mö¶ ½¢˜#~+ÈLri¥ü4Ã%5Nª‘?‹ŒZ£x˜}ŸI;Æ)§¼ïë‹îòM …„<“—é€iNû3Vö~í;CíÀÏEïÖŽ.ø§Ýæ,¶·Ëvaü’T†‚½Åºuà|ù¹®ÁíÉêL&Ò]çul븇ƒÎÛ×[­Û•¶ÛÂ2#™ý¼8¤»(†îŠj˱¼šZ­ÂŸåú /ØuS4Ö¶ˆP% s^¸áQÓVtÍ‚k=GºfjTC@Ñ›Q^WÍ á’rÌÀò7Òñ‹ÞÆTtcåMK¡KETIOkiý—“oÉ3ƒ–TS:qÎX‰äTuÜsQqWªåŸi÷؃ñ4R­0ø^úŒœ «>{Åù2jÚdkëÑs·FöœKï4?¿‰áÆ·4álÌÿà!y1ö¨Ö]Î7ÕçC²e럼õ6žÖÙÃ*¤bÙ.ôE— Ö#¼{lÇcUq,ÚK"±ãì6ßý”Ö@Tû¹¤ÝYeA@³¹®êȽiåáе¸ÛúßwìȇðKÝS³ü›–Ë4Åh”3µ¯•±½«ŸºQâU~2þÀöÚðÓ„²ÎIÑqJµO–÷íÏ%Œ‘jMK¹·8ˆ‚X#ÖUÓäF¢¥ípHú½~°_0¬2±ÜÍàZâXÕŸ˜Ò¹<^®Äð;@yùLKy:¦P{>ôµ¥¬5qdM«xîÀ»Ù¥e=«òùÌ)æ}´&f^«LÚ©¢Í¤GÛ ÉårR𶆔˜ew[ní$©}ßb²!Qñzy{`U?×k²Š¡QÓ‹Àïräiér8¿Hépï,Ó2×Ïw,uš ,ôrÁuZô‰£‘â®W_¤‚²ì-ßr1ër—)U›¾ _únšMW.ñÿ¥Ð£!=òÏ<ñUr/‡±pø$µÜR(þ°ŸÏïXˆ³Ðî¹¾m…Ñ=‚õ…5+øœÓóÛP‹Ü‚È`ýcšž¶ç6Ó¯ÓïrOgóû¿ÑOj®ÖŸ¹&5*ë®'ñy÷uŸ9ưÿÄ[Éiëø=&*’æ˜Yþ¬Gë¡¿õã‹®ÝÒ˜$;¾ ½W›Ànç+“ÑaýMÔoð=çÓ¹±q'aݦJ¸éÖ)‡#9xj$c¯!z\«ßGVÑŽ÷†²ÿ*£›g&ëú> stream xÚ·P›ë.Œ{q‡–àNpww÷bIàP(. (Š»C±â^Š—BKâî—-çœ}ÎÿÏÜ;™I¾gé»ÖzÖ;_iµõ8elaÖ`EÎÉÃÅ- ÓÐWáápsóqqsób12êCàÎàɱ ÁîTôrî`üI&‚?jÀ UOg€GP”GH”›ÀËÍ-ò/C˜»(@ä±hpTaP°£ÌÕ×bïÊó¯G‹ +€GDDˆãOw€Œ Øb‚4@p°ËSF3@fÃ}ÿ+‹¸î* z{{s\<¸`îö’¬oÜ  ö»{m” й€ÿ. ‹ ïñøK¡³ƒ{ƒÜÁ€'3Ä õxrñ„Ú‚ÝOÙz*ê-W0ô/cõ¿ 87ÀÃÅóïp{ÿýÓdcsqA}!P{€Ä ÐRTç‚ûÀ9 ¨í† gØ“?È qY?üyt@QFzªðïúyˆ;Øæ©ï¾À¿‡ë…yCýÿ…ì P[»?ʰõt@!nž`ù¿mžDXÿ‘Ùƒánnna^aØ ö±qþ‘@ß×ü§’çñS þ®0W€ÝSà@ˆøéËßäÀÝ=ÁþÿTü7ÂâáØBlàk°=ŠõŸèOb°Ý_øiþîÀKî'úñ¸ÿøüûÉü‰a¶0¨³ïÌÿ1POËHN[“ýï’ÿ­”•…ùü9ùœ¼Ü^~€ÐÓCàÇùwþUýŸRmäïÓý#¢ Ôù«ˆ§îý«¯¿™Áò÷Ú°þ;ƒ&ì‰Ï`ËèoÆ-ÀmóôÅóÿ¼ºüÿqÿ(ÿWúÿï‰=ÿÔ³üeðÿу\ ξ[<ñÙþ´°§ þ¯©ø¯…ÖÛB<]þW«=íˆ Ôþ‰çœ<ü\ÜüÉ!а­6nãð—þ5Œ§Î(XæùãÞyòâæþÝÓêÙ8=Ý-O#ûS~Ú¬ÿΫµÙþ±‚¼‚»;Èë‰OHàÏó´«¶`Ÿ?)rAað'ÀS;˜;Öƒeþý‰„x@å#!ô$ Zÿñ`¬…9˜X˜c]XÛU •7çq^þg'1gF[ ^Û:!râ×§|ù±ó2]3?c¯× ÷xK›œŒI¹,ÖÒcEI>µ¡ÚYorLJÜìy¨{òþTëì4µâƒÚÚ“6ë~ñ>“žf%ãp;þ1›¹£$ÎÔ\uYépˆÎÜø› i<.\X˜)¬]&³½J¶Vfz¦C…ÁãDz|?ù¹âÎuzÿ¯À÷Å2DÈF:Õîî3Wµ³Ì]É÷¿z)Õ¬&ÓŒ[= ä·oYBÎÚÂ^³X{ŒêIÑ‹e©lMž(ŸlÅ©èÚ7+®#÷§!Ë­¿¥;ZÇ”Éö±fþn!ÆÖ)_ò9f!E¿ÐO€¹¬§¼\‰HB»oSqêwXW6Z€zíÐT’…¾GJÖtz!ÇHQ£¶Þ©ÿ7ž)Ì‘ØP÷x‡lûóÍ ÝP„qèŽßœ-WB&àµm½xÊØŒ´x1Ç·/öèC ¨'F•D ¹$i£·À6f`ËÂ$àBíÅ`¯íMlŽçt Ïh$ÖR)ªo«'úc-ÇK΄¬w“ÊYRLžg¿Ý?iÝö§`J)4™>ϲŠVÁ XÊó ˜‚ØMß·lRDš?†Õ‹#E‘ûÝÕþ†Á2ÏÄ’‘q«@Â:ÏWùumß_Tnæ§Šœwþè­¥Ó(A·ã²&<™þR¾IÔúLéÅ4NÓ^éï­×¹3tj4ùT„‹7ÙeéJº™f=[ǯ#œ¥}6db±>%~J4|bB nS†ñYc/J6£7q{Ú( Ð*Lã1ÊB®~ñàW$ÿWèé~ÛÊØúx)çŽE)RÁd}·Ï7> Y`ͪ;TVݪÀIñŸƒ§Ð7‰™:¶9d´¯ðtÏ~kúŠ‚E466'·ÉÙáÇèøÐÙˆ¿I^\{¥éPÃÈ}hµ)_ùc=2ÞíàxŠ#–<¾0nÈ)ÉÔ@øŒ€ãmj[á;ì1ŒMÿIÇÎÀ"0‹ÀõN÷ò Þj^ée9‰ÏÄ<µ†ˆSã ¹#›Ä·Æ3Æäûl< ¿¤|U>EÆ=é·N9ñ_iÖO¿Úƒ‘ÊÍ?ÚŸö½á¹,7»f\K†N±„ xª®1}]µÍWÁ,°3ªiƒ—›§]›£vìòñÒœ#YŸì”~D5ÄEj˜Ò{¬u^ZÕðìÓ;«û‡uc%ºúMÆm¼Ä±4º)‡ƒVñdžxC!!Â*úœzªttý‰‰˜\8Šºâ û¬™Ïºº÷|yK6V='©‰÷¯Ó•J«Í€SPwó9ŸzzÄ,™c`âd?ÃuöVö³ÁÎ ÛÒIà óªÆÒ|“É#¶â7IüãH#V¢öT:ö ¶AèpÍõÔ/"t-ô…ˆòlÇ ƒem™„ß}}Ír%"Z øþ¾to³td¼Ï€ÇSEJ޹´ÏòDã¥ô‚ñÝéy›ÎÃ1 âÙOÍ÷;ú‡½H+"êÞ¬íÍ÷u?J˜ãà’ ¿ßÚˆ#,\ñGÒ¡ l‹=?%ílsœßT }`¿šoeÑÆn—³ú&qYˆaLíf?ÎXØk:Šï†)c/ß°ßÐL92p½½N$’["’üzeë¾EÐe’ë×Ã÷nLžÒ‚ކåv¥Ì7©Tª¬z鯣!ÂC>Œ^ÅÿB€]úêjæÎͦ0¯Ø°ð}Ó^àê`ŸöÒˆ 󃮂ÃòçAäÛÔ­ÁˆPZ׃ü@Hkçg7eæ‚$É$Þ›sÜÔNŒºE­ çä0Þr@u}ò ÎËVª‘]4°<L„Ï·òð“ÛЖÚóàñ 4ÑÀüv Æ‚¹Ý~+šñ‚³ÝI>çâxÀ< ×€-ÃsB¡3‚Wä}è‘ì|øÑZº ´H›¶5”ÅÁx "(Põ«oV~Çà™µE\;©×´{4±Bg¶g .Û5« qÀË6yç®ÔN›Òâ ©uïu@´Éúõ Ô`ïWVµ£˜xÏ e.ŒW‘­»Ý¨p¦}öéØÈáSÂüX»Ÿ¹">‰Ê|n§ßRý¯Ÿêãtr 5Þ²?3ûÛ wª¸«ø˜\O½ÂùuD=ÕÞ{·Ÿ±Cåf^yu^ÌÁaëCDÓ@õÏ|ChÌÐ)LÈ…ÚÕ?êº&&ªI_‘ÙŽt…¶%ö¸I@‡¥ÐäYŽq·$$»‚v¦\¢ƒür5î¢0 ) pp¿žrŒ0ðéöðˆO킊³siYu‡­W„KsBÑ“h\I2Ü0Ft8åhžy¤ª5Í<Ê¿®LE­«ò6ì~õ5çâ¹ÆØD`ç½aæÞÞF0+Ù%Ôh‡‹R'¼¶ïZø¥Èî²ëþŽoŽ´®”7V£òÔEV§ÉAÃß ))ì—áGü?ªí‚ŸÕç vÞzè|Yi-2ܼz­©[êÖŠÁÈ­F¹~8ȵÙÿÛZ¸O?/]Î?†C›Äs_…‘«c ƒ‡p¬oþ3Á™EˆšÊ’_KIö–ÝõFÇ6)B'siº"Ä[‰‰wغB^Ü8ï|Ryü²Ùkf:ä[Ò8?ℜª†iƒnîÕaÀw2ä–ÛÒóì´nšdý‚÷:è¨ÅEÙ1š'Ðí¾µÜR›—4`$ü»pèUÔȨSöÆ?ìºÈro;ÿ7õw ‰$q˜§é…^3‰‘§qø§åCkKcÂW/[,§qw±»§XwÎÀh.Ã7Ã!¢÷Í<3qøÖMHÏä‹DîÉG­"‘ç:+¹/m¶›¶ yºË¡]*Q®Ÿ|!zR£~nàäz=[·“Gð$æñ™N–ª¡`üFAº$ ~'ÀÄ{|¼—GÚÖdj4ÁðЩ¡#ª=Ñ6ÚevÐ5î]tÑ <õ’vl–\·TO‘Ž(¼,óîÕüÚŒ¨¸lk,†Ñ’8sà;øópœñ3H£Ä¦7'h˜w@}lmý"H$#ƒ×mµÜÎŽ@'$> ¿Û … ú‹Xï Áì·QaÁfD”÷TWR˜ k<¾ÙxŽ›òÏù€—‚õ˜è†$”}þSøe‡ýC~FöýcØnmý§gÁÌv½RnõÞ­Ñðo™jy¦³·ðËs&Ô)¤qz„{Öï&ï9üÞ_÷ûÅNvÆ¡¢ÿ,ªfä¡M)@Ìi¬©0¢sõœ¸¼s9éºó”¬mºßÝÕIËE²`[d5=ƒ7n<êZpEÄŽ©Á ýg;ñìeëoéf׊/åí®h××$b“Ju¾a!oŠÞ'³tb¾Œé}U¢DçáõÂ1(}8Ù©\ÛžzxD^/6‡wzñÖÒÜáENcwŠß.M2Žþ!ƒaé”ãØÁ’éZÃYÂ#þóÇ "ïkMÅð°Ù·Ñªý…ô¯JN6ãþY˜źŸ¯‘îÕñ±‘ ˜{ÉÉ8übÀcÈõ‘Þ“†íâñŒ\àÖ”}‰ŽÎÕÖú‚#ã%%›ö.g­ui³%ÑÐÉCÂÙËzu"Ix( îK¯Y»%£ÿÑ×’zI&&?jt’Ìó\£Ãv½ˆLÜ¡a>û ÂtÃùÀ$œ¶s¥ó»_Y` ;õ¼û>ë: ?6ËBÁꢩ¬igYÅ+‰p‹ê@è0ØŽ@­­žÝ£5WÞ/‡×㸵ä¡q—Ÿ½{'¨£#ú‡¨¤ 4ÈõF8·ÐÌdü?3T¸’»¤Ï!­.æ]ŽýpY:C‘}PSæ÷¥mºxtb×<{‰¼â”d#á7xtÚºV¶šµb K½àï#¸ÁÚˆ]'T^P²È2Ã1Œï¶Ç=©جû‘ÑÉEî4¿!Ç}bš©\l¢ÏbÃXÆšº‰ØŽÜ4ÈófÏŒ‘vÑzˤý¦rú2Ĭ¯!.­7WÕî¤-lGQÞ")Uþë´2|ðC7X ذ±Ý©ÖiöLríyCÚÌÂPÌ·ùýZu=Íg=Š«¬Ñ´ôß„ÁCócÉ3öµ)h–šUs:HÍDçË¢”¹%YŨ™ÉKf2wñ¨¶âÒ–dßVªŽ°6 ÃÄ4rVÇüàH.‡© ‡vÕ¨oóµæ{Þ—î_½ê#Ź6EMS9N’IÊ*•äbjËêZËÛ]“#`ñ²ò£ò†]t²y%!]øâœÀ[v…ɯ„¼ú}è£Í_~Ê}:Š×jyQ?KT5}õìä+‚ýµD¤ø‘ôz=¯:ÿ€E'rÇl1É"Nx˜/¼ë¨üý÷‹"qß&Ÿ=ÛwúM‘¹,>÷îMÇæÛø+æ´o‘³xÆ¿µ¥í‚µº¿…¤vHH)n®ÓfÌ aé>"X¼Z¿y@?h»ëè¨ í-´žÈ\—rÍ' ñ“æ:®”{ßÉ0îün懿á·!è–2VÙ¨ñ‚ýNïuf›ÎˆÛÓ…ýŠ~!|W}§‚¹æýÔ³x¼V>-øJ”¤¿M›‡&Óí¦:„R½¸Å½¤ŠoËÏݧ( ØÞøNrnÔ«BjŒ?-4aðª½òܲU÷ù‹Õ Ò²B…§ò@žò¡úÀ„í#ê"@¿= î…}>8q? úlž3…õ£!(òù1ôN,&ÆÖ~PпYÕô{$O·û"…jeÏ ¹ìŽŽ"³w%î§×„Ù]N ÷=E5ÐÂ4íËQ’ÊrAžªPmŽþúöW²u`1‚èŠCqzêkn§lyo!¦‰ë«l„ \¡§c}1ûoF;ä* .í¢È€xGû||GñÜ?hÇWîlGÎ: v²ƒ¼¿©5]¬v3EˆÈ©;ù]ÁVÖ£ÚžÏIûû-UHƒßŠQ—GþÈ» [ùT cåÂL3Û¥¬$ÇŽ V>ŸeFè=³3¡ƒ$HM«ø¦ÚE—ØlEEÀB¢õJ@rÒ^ÚdI`+…rªGäþ{ó·¦dî¡Oõ(NÂÒ¸wÑÕC8á5¸n©2C=ÉËHò{Ñ-;üš²ež']›¾p¼I?s׊–/Åïè ãS¹¤zF“¦ªg€ËÎË/W˜2·‰) £u_%yËÒæŸ%]ÞBÍ„ÙU¼MÌ•½ˆ–ëÚÅ èßÓœ…®¿Ñ¤ ï^F%l9â?Ɉ˜Xa[Aë;—ð7Íúm ˜cWg[‘¸¯¹|dj­÷ %ð ,wó¨ é*áÐù^£X-¥Û¡äÊDí¼Z†¬Sþø(å‹ã{·gê3ig@¦þ6Áˆ@ç²@/Â`™S° ¼´³Ðò™]…´~ ~DkdGá=pÐä"£9Ú¬¾q¶Ù‚|o:k2¥¾¤u\Tpé«Z¡“ÌJÝ¥ˆÌ‹À n<ØæÀ,‡©õ¢e’7󀿱žTúm*B´+1ApXà”bOý u{±—†UŽå +xXoáØ²³HíófZÒZ*¤N¥"I+œ†³zö]Kµäè²à¢þa;Î=mfZ9Z4bPø…S˯T$¹~:ÊÇN‘É6¦JËíNX½¬Âªj“{›©5&ép–Þ€ØÌ+7E›/ôWEå66iŸçÒ;lÕ ¬¹RG: b?¬:ô›~;ªÓ %V-H²Í(•a+&,Plú‹É1ƒUlŒ]™ó‘‚yséLßó\ÒN¡(q\ºJ›c2າ0„Áþ‚Þt£çXjbiµè¥S€ªg’È>o?ÝÒ^“äÅâ<ÃÖ“9OŸ«¾œŒ ĵ~Üä{Ö‘ä]Jˆò`eµ *YF¹€\”¦®ÆfòèöÏŸX&ÈûSª©›ÑØóÓLÕñ;»ûu‘Ù'Tì¬ÃüsÆqr£BÌB_B92„Í_TËåpµÉÎ"ѱi†šÎ4 ¥Ù¿«^e³ú$u·ô=«P;"F[.¬õãÉ)«ú¬‚ü"~Ïò×CJ=½q%\Ë:³Ì캾páöì6ØãËTÿyMìE#¼\J®¨^ÛN‘¬øâÃæ2h?•EŽv~ QÞºûƒz4M¡Ô‡rÁ‘q¿yÊd¿¿çPÍè>‰ç$#n5u;hâ—îÈá 8¹öïÕ `sÚè!<¤‡òâ T{X&ŒÚ”ôõVRÐ3²¢+wŸŠUˆîʹ(§S46ðÉ·VäQõ¸$?âN°Ü¢ÎÈû÷-ÖR¼&·˜BØúD ‰«<½«ØaÓ·¨)O"w´:‡¡ÙñHž:Ú kL!¯‹Bš¨6%–|÷NÍTÃ*ÕEáRÉÕøãLÎÅfŽ¥X+å–çs2 Ü’©»­®Êl3$-'K2ó±ƒ<#ùÁ®Ì›ÊÚ\2ÀêñŽúÃè¢Ç¶Òe£üâL–ÿ–ßdi›¸kÂ,•èQÙÌÆ‚ÒõM;ÍrìÅ÷GMœs+ëï®ÏQcBùŒ~vé’¡ÜJž=(äàZ‡Ûá™±ú[µ6èÛ‘ ö¯]¼fqFùˆþq"*Krx(rWb±û°pâ+¶d¸ÌtÕx$ ä“f$ŸnœU„¤æ\næˆTŠ /Ç Ž­©…æîyƒ¶Hb†¬û+’¤Ï+ŠKå×mõŸ3dj·Ò×Ð*ðl¬ï0MA¿Ñ0Y‡¸| ÛE†ºj3}åÛÓ}# )øÑo–¿5žãk™È!zĆ,B`rklôVÝì‡ø§(Ñ$Ài¢|m¼Ä¤6Æ/Uµå! gT¬–= ¬Ÿ’[³ÂÈö˜jƒ;Kq^âè6¹­V|ˆ5¶«öç[Á*wËv [k3öá¢ÆÒZÞM°T·À¤I8À<ÅaŽ«ŽvG4Õ¾m¹~}?[ÅÌ„¼õ×øÛ4—ùèCýb,Ú±ç¶`ÂöðÜ6{ç+ùCfLš¨lš·ü}9öÌ}‘BU”Zòj|oþ&y¤Ø¾µ¦ ûÄ稵¸ÈS6ÿ†;÷áÙu)Ü !“‡]ë:(ƒOmåU¡úËÅ wÈ}b›i¿,Eqx¹Þj„|â'VÄEÝQÒn¦ë¡¨ÜÔªXà Œ¿T(ïú¦¼Ös29«égÏ|<ÏŒ½ª=òxÍ_.ÜPß>ÔHdâ¼ÂÑ6™Ïg6æ=½.ŽpÊû]¤a}›ÿ xH¢ý÷¯gþ Ì,j v‚㉄p8_çàܦf˜ê—OÄÎàßœ³úÖ ©¾©˜å]dö;eb&þÙ<¥ˆÿ6YèÙ‰â-ÓF ZK¸cŒ.IEç·”]ßšcnoÜGûžK“ºç€Åb±7 ¤ÄUŒGìeô§™¯йu1ÃãGß#P Óå–Z“ÃÆd m‘ªß½Xo³ÐŸG¶ê#œ]åÒöŸužçJ•à–Ú6Ôr¿Ç«k¡Ô !ð竬ü£®æøÑ_}­gô¾rŸc9{2l¸>Åþ §ü ®zø¢Õ‡½Nì÷ÔpC´>erx=…σaßþaPÁáh>Ž@`[C ¦-}]²9ebÈóšsüæ)ókÜ“ Üåø{¡åG¸•YßO!¥ äêYg;Ån€˜Xi¹lIߤªÕö"eD¬Žpt(°—¨¡Åj œ2ÓÜZøûÛX\ qŽº‚"ˆMº„,kÔ¸Æ8Ødãîjq„]¦ƒŠk±Ø½Ô&Œ†«Ù#V.m52%O°\³tÐê-½Rœ½ò‚{ׄƒÃ#q×äDç'Á¤ƒ‡~±†”:EÝÛ%‡®#”v…w&®À4Æ ¸“’èükÅ$¢qL T¿xtUø#“÷ð ÎT*põÍô¶ÓÍ «ËwEI¤½SxÒréP(ªñ‰¢7}…憃2sͽ&õË@k7éè• Îõ¾ýÍŸ…Gʪ\'b¨Âô ÃÛÅkÆŠËöÃû±Ähhv$0«(sSƤ\1’¸qÜ!ÞõRÄ],n4È âsj! 6W®­HíAâ,d q2ñ¡‘F_¬Ø“zC¹¤¯à<ߎ/<çMÖ:ñf†ÔøoÌëe8ÙBº¾b†ìÀ¼z jš¶®­ñì€õÓ.fþ¦„ª¡jqÉ%"$YªDü¥Ï œÖlüºmZ?¼Æp––c&‘ËFóSç%Qjô[ÏëKYçÔº ÄÄrzó¸Ìen›)íØÙÔ,Ÿï„Åÿ\…½hcr[„ìä–•¸?6¬½oŸcŠºôØÆÖêg{+¤?C,EæØIMEGüxÉïÜ~ÙyR“UrÀF™U©”òE錣5=ÿã‹Ð)î.þyMQl˜UI|JÛ „0}Åùõ¼ŽªÝjÊøçÊî·¹ýҿÕ SÑ Tl?3ûù³UdJ˜÷™^-Rôèýn½ÏÈùVC.GêþÈFïCõá­ýBóMz®©l©qŠu6‹kå$P#:ñ _ñ´ìuB&à—1yûU#}ñ⟹ÒëUÙ»êÈöm:dHÅ?BØ/-φ?î-d DÜÊ|áfßßú*ÉšÜ>èb™“Bl„'‡hPžk "ªßýþD!ª08uóöv‡~Ú}àm´÷DÌ‘ŸY;eª ŠÅ¦U má`³…¦ìö÷â¹ú(OÒfD¢5ν‘å n\_Ð<%Ï/¬UàÍs¯ïçƒ=>º^_aPfÖ¯p1îП8í¤m¹8#%6UH¨ßá$\uRcÏVɆc¼—X[Ü[»ùðy”JK÷•ºóÙ±‘tNÇÛT3~<êŠn«ë ½µÊdvO+PqP G÷Fq“ÞJG“K‡µH‰ñGõMç;ÛoIvôŽOnŸÊze).ñörÊ„$ý£üßÞ÷Ù2:ïÇR…ã|D²y”øf*Ž2ãgZÝgbg=³<õ~úJA…¦i¹ª–aŸ3òë{".2?©ÕºŸÌ鯉}e›x€'Š%Ò…Oá@iTçîµùÔ·÷ÀZolFÍ5´ÜÙhÓU*!þ`-w+TÓ³xï6"Ü«ê£q¼,ðÛê{Û ëe_–kñ ˆ¬w eå“C2¦yVÞÆšNÞÈ~…ª„5yóq£¸Œ¸³…§#žË¹Q °6aÁ¾¥J¹ÔôŸÉ.AÌUðÒîJöU̺Ãõ¢åbxv²>?Ü>oúE÷Rò½Ké–ü1Ï*¤w™0ŠÆé4Ðï<¢T4”üCX­³ žŸ•ºßö&P´ª’v¦WNTí<Å.Á2"|ýŒmh ±+9çÁBO¯VQlùLQà×#xöžÀKò°=ÏGãF&¬òdq9\auàÅ™@ˆ¾›ú—üfžv­¢èrÅ;€5›yzÄûÐ÷ø‚äÜ„å$ÝH)îÞâÉË£¨¦o‡Ö7V’zI>ÓlVüHÉŽâCÒ4#åÀ¯y^>(¢Ÿ§E` °€¬vfð³Ú9e”®²³”6 6Eòª<ÔûÌ2ÓOÿrG'{U^26]fÝ54ºÄb¿´S¸…©Æµ¾æÏ(¶ÇÏ͆ºCl…ÙJ´_ „Õ¾“^ ¸l]9£óƒ/é"¢r¶±þ,/¯ábÐi÷®Œêú‚}óìwx.¡k˜éÜ3Òaº™Ü–Ã@ݾ|ƒ¤Ø×÷Úì8ã>ž›gi~;¯übBÕïDØŽÖpƒC§OL°D ž×˜¬|à7@ø¨#øuaAä¨Pkîs÷ rD–¯¢à!.´Ã‘áŠ[Òrö£.ÙV@^p“æ­/ÜäN,JYÝtžsÐø¢EM<%óýûŠ•r|þ›AI?©Y&l¤‹ 5ºÆ E`Úóâ<9˜U&s)qPIUQQÞ¾,ÑE4¦Ú € ‰”¼ýã õ¢g‹pV °x§Iµ7“. bÀ’‹=.Ÿ†éþåÌ¡žás[@å¸=ƒ®k$?_œnmôäÕX’e]sToÐô—ÝŒo¶é”½ñ'„o0u®«ð€Ooƒj#Hç3l…ÖïåIî¦ÈØß žZéø>CÙæÑœØF0ËΊÂh·¨Š1G¯»ž2Z±ÞóÁ!¸î¨+?²æ·],—öŠŸ²Ï8?5ð;,YR‚FœŸ~g°8 A«\~¾uDAäÂ&¯ŒÆÐøƒ Çzæûºê”šLÂIÚ[|ä‰O¶A;9¦¥õ‹4v5t‹>6§X¢u|¹¸øÐ° —ÅeK]͇Ùisö$" Õ6"C&ÔRD:ç%ªùl@µNT»µûgúf^GE¨ïÒddRÎn„S“ ‚aîµóµO¢$Ïâ}w7iM¯ùÊ>º&Åó#§¿à®‘ØLºG+S˜d%³§3K$(ÚÔ`¼å˜HhBj„±ÖS­…)7¨ÞpÔ©š$H²&ÔY¬£õë*œ»r•4/ÄHsMñJôÇP3²<öŽÛ{]‚ðmmÖUÿ›( endstream endobj 4077 0 obj << /Length1 2938 /Length2 20931 /Length3 0 /Length 22573 /Filter /FlateDecode >> stream xÚŒ÷TÕ[÷ SÒ-)µéînéî‘ÜÀ¦»A¤;¤¥»[$¤»»‘é¼ÛsÎ{ôü¿oŒ{‡c ÏœsÍùÌZë%©²£ˆ©1PÒÎÖ™‘•‰… ¦ ®ÎÊ`aagbaaC¤¤T9[ÿ'G¤Ô::ìlùþ°s9ƒeâFÎ`C;[€¬‹5€•ÀÊÅÇÊÍÇÂ`caáýŸ¡#@ÜÈd P`ÈÚÙ)Åìì=AæÎà8ÿû@cB `åååføë8@Äè21²(9[mÀMŒ¬jv&  ³Ç\ÐX8;Ûó13»¹¹1Ù81Ù9š Ñ2Ü@ÎU ÐÑh ø•2@ÑÈøOjLˆ”u Óß 5;3g7#G ,°™mÀG\lMŽpt€šŒ<@Éhû·±üß €Š`ebý×Ý?§9ÙþuØÈÄÄÎÆÞÈÖdk0YJ’òLÎîÎ #[Ó_†FÖNvàóF®F k#c°Á_Ô’"*#p†ÿäçdâ²wvbrYÿÊ‘ù—p™%lMÅìll€¶ÎNˆ¿ø‰ƒ&àº{0ÿÓ\+[;7[¯ÿ!3­©Ù¯4L]ì™5lA.@ñlÀ"Äß2s 3€“………‡ tÝM,˜P÷°þ¥dý%çàãeog0§ô™Áÿ!z9¹ÎŽ.@¯?ÿEˆ¬¬S‰3Àh²Eüí,šýÁýw¹ôXÀãÇ `ùõïßßôÁfjgkíñÛü¯3+ª©«‰ËÒÿ“ò¿JQQ;w€#€‘ÀÉÎ àâåøü×Ë¿ùÿ/÷¿¤ÊF ¸ýáOÆÖÌÀûw àÚý/ ׿‚查¡ü7‚¢xššßÃÿŽ…“Åüƒõÿó üuäÿßäÿòòÿ:üÿ—‘¤‹µõ_zš¿ þôF6 k,ÀÓìâ Þ ;ð~Øþ_S-àßë¬4¹Øü_­Œ³xCDlÍ­ÿ-$ÈIä4U9›Xü51ÿkØ»5ȨlçúußYYXþ¼r&Và;Šܬ¿T@ðFý7¢„­‰é¯Õcãä9:y ²€ç‹“àÅ ÞQS û_£ `f²µs€³ó˜Ù9"þj)'€Yä—èoÄ`ý¸Ìb¿€Yü7â0Kü‹¸YÌ’¿+€Yê7b0KÿFìf™ßˆÀ,û¹ÈýF`.ò¿˜‹Âoæ¢ø¹(ý‹xÀ\”#0•ßÌEõ7sQûÀ\Ô#0ßÌEó7sÑúÀ\´#0/˜‹îo>gôã9™€@& G›å¬l\ÿ(œAÖ¦Àål¿ÄàÁ9YýnÃ/'ο}‚¹ÿFàÆF&VNÖFNøçø%vüC®ƒ±£‘ Ðhæü‡˜óñß;ü¯WÖ¿ÅV@çÿØó²ÿ+ÿ?À%1ùq‚)šØYƒçýßÄ8~Ill~—æ×"0›þ ÙÁ1µ³¶þ“3ø†dþ]ðè3ÿ”ë—ÞÁ|¡üë̼ÖF”š\!³ß^Àf ×?ÜþRÛ¹ülbþ;Xoþë+ø§ 8ßÕæÑÂÃÞhû‡Xú‚É[þÁSbõ×ëw\àÂXÿº~ëÁÕý##ðsÀü;'Ø—-øù]ph[ã_7¸ù”À³ÝoÒ`Ÿvœbe'jÿ[ Žaþš°ýOÿ9Xÿ‘þ·ûàGˆÙèþjøÃ”ë/Èîw9À…µ·vù#1ð³ÃïÄ! Ó_7忾9~ 휦ƿK~ñþþ‡;ï?Òÿ²ce»ø£y¬àúüæÀ >ä´ýw^9Ù]ÿè('؉øÿ7pÎÿgéXÁ¬~‡?„ÌÎŽÀ?F \Sg7»?€}¸üN ó¯ï5';Ç?ž×? ˜°Û vêþGõø‚›êù›3Ø“'ÐñoÿybL\Á]uþë+üþüÿõ©ºMçìLøƒ,kƒ¾ÜV‹¸1îŒ NSîh¥Ò2z-:¶»Ü£Â%ÑVe¬;^‹$ v£¯lKÐ\½]"yò:j©‡ mMPi{ð~4ˆSÜiC\˜ÀéÏ?©ë%B dT»ëýäà­éoÝÙ!K™ãàƒªüùõ­[”{]oéòHÈÜŽÊn—Òcéc”Fä;ÿ¢Ê\ãÌY<2XgF"x:Ì3w´™«ëiÌìñÙ8zDŸã(ö/Ý ¶è»YÏÕru6§N| |]<"è+Ì‘I*/ÑýdYÜy¯âÂÈuÁù,Z&ˆõ‘^ïáÒ>=yL\kÇE^© Ÿ¶:fíoÈ;j†ötµöG¨óxôfnn’RŸ•š {Þï„"Ü„9Ò›*¸ÆÀ)zxín.Â\é]ÉÔŽëyé™m! na¯4‰®Š?…:ø`)À^îòtzç[¦—PÔx}³?¶ŸvßuWkï+“8uAE„ËOJCCÿ©‘›r0îªæ5Ç;„*Þ6c„w]´zƒøK’ËLç»Ï'¹#º©˜b›Ó×Þ 6í …ÃÌèf†}hnJÑ" W¼Â —æÔa^ÚЭíËßÏÏ íM€Ä!-Уʉ’AêæØŸ½¹F‰ü›Œ†gaoeÖ¦¨W‘A‰#ú88tQ%Ù-l®š&WR§ÿq4V@mZ9 ¹ó-¦¼@ðªtKo„ð[¢~5¹oêˆît—î‚Çû@UdmhM¿¿•¸^ÜôD:fÃNë,?/a[°²ÏÏ׸õŽo“FWs–LOcQ9KÃÒ$ «¶»QïoûÜb§š¦éÜmšgqvu*S°F„ŽWP˜w^—ÇÚ›y±ˆwzs½-ÛË>Èä×?d®újá=>Át[¤*³6X-7m“a}ý~…JkÅ7bµß‹¸éóÙ“dÏ›ÕeD™õ)K³iƒì±’r¾28!ÜoqÔ¹EV””QÙø£Wc#¥‡èA!Ú5Yü>µñ·YX»–½:ÚWó.e$_ò8ûÛì—cEe¾n憫pKr¸íUÚ£8XL ¥Óff9Î\ôŽQÜtÚ¿%ÊÚÉdû¢ç<158”¼”YŸ!lq™Þlœ±ùL·HEá‡hÚW`NPFNÿÈçNs^B]â­1ù£¯ä(Ò ö®ìµxC¾ó-úŒiJwQŽ`yzçèÏ/è óO-¹»(@o_Rp¶^`ÐâCN† «3CL8„½ÑX™<¨¹‰maMt–˜jZýüeò³.+þ·¼ZÉ÷ªÂÉŒ™I™Ý…8Apï3H"¡èXÍÝnöØ:s9˜ s²›Ù;Þ–m½«æö\6ò<œd%< ýØÄ´‘vöÓ?BÂ=@‡ºu ôæ3LÒ䃠­åW¶­öYØ9¬ýX7Vä¨ÇÛ‘}v?ãlýÐŒð.æZ¾è‘ï(fs¹%+‡ ;‡ç…ÅfæÇ”ö¹ s%bj¯’˜ÙÚaT·²gµ]5`:5øËùð$ÁVÛøXç®ñd…Ÿèl±ÝtTkÜÉë÷0])§º…Ù°HG‹/ÔI±!¨J^“’©¿m¦k ø?ÜŽós®fä+ÛˆÌ ÐçhÎy®åŧ›à„ⲿWGEÌVvE¤zS]½ÝuX§£ªš^*V ó¾Šó‰—üRäd“^¸_ôˆbo¥Ÿöðm|-_õ.t(ijh¯T)2>£cüˆznHÒ,ŽÈ-H”Á*ºx ýÃX™YºËyÛ¢ÎÆ}‰á!ŒÉ÷†Äõ4IÓÔ°6i÷DHrÔhr[Ó(ÔBÙÊŠ | û^ájìRlª¨o¹Þeo3žÍ¾ÇÑŽ¢ö[Þ¿ú ‰Ãä`‘úíÕAöŃu€Qi±ÛÈ¢b¥†ýh‘aEÅåÖ'ÞØïX²æSÆn¤[)È#_œzü‡Ô§!*Ä;¡ù´Hõ?€úrÝÚ _öóK`à"©wº 7,ÞÃv#««ÇÈ”ÙJZoüŒÑ>}ó-ÇsõznÛ?Õïz~@]Ll¶ŽJ#S¦ÃÚ²{]ö1G£c²¼˜ùXéþ•:"¥!Õ1¡W ž\/“Ø1hTŽ÷s‡»t/ãk×-‰ÇwNâ°˜œÅÖÇðO= —YE¦[ÖœÔÆÃÆ« ÉÒ×L¥„ê}žÞMEEÛÝ©‹Wp.£ÄMý5s ‰P_/»ÌfL™¡¡˜àìN|ézÚ“17[¿¢ u±ìo‡YOk}ìÐüä Ži’x‰¼™pRØ&2` g5 ûà£{c^d`B`¿ŸZ*¢yXbípÍV€Ô~\±Œ%Õ„ùhÅ)xØG•®“{ "^tû2ì[Œ—â*V¡ ôÜ–„©Y‹:0” Ü’…S"í,{öìËíÿ–'ÁDË“'’álHŸ2fw¸x˜_Yâè‰e¸Kêýü¡Âˆ®rÔtO)Ž–ÉY†ÐÂ!nþ9Œ˜Ž:ÇáÔ¯µÆ¯Jh/H»_¡—½d fƒ­ÇWɹQÝ;êŒÓ‘úg‹}ßÂóÃÜz’V*¡ƒ¸|oû—h¯•ÃZ¬„S·Dïù )ÙO榌}i꯺A!ÒÆòy¢ò7¢cútÑG¢!óá¸×½ªäí×0¾ÝhÒR¾ÆÜÜ·Za :NS·Ë³õájÒ}q¨öjsÄíÒÐ}á•(Íž›‘ªÜt‰ãà]Ú0´Ãwø:Ê¿é{€ê¾•£ìaÆK2_.Ü©}Îä2 ên&e,ñÈä¦ÅÿœfÇЉ€[ *oe%×àÇkonþÈi}à]Fõ…Ào UaÀˆ.o†âú#Q‡+ùJ£Ð1·Æ±ÉÁ‡ÑopeÔMPX¡¶ÍŠhic¬‘Ÿö µÖúÊžáŠ_4WKR]`éy_–Ð8¸1"<¤Ðh&»Ÿ××QŠýQº;ÃÉ*<‡¶P픺 ½ËMtŸ =Eówß6éú‰¬~½Ûxk”tOÞ!0ŽÝ"ÃN‚|„Óé þqš1‡ûñ@½Ð\´Þæõb¯Æ“ä¡l•0¦ž½~7ÒÒ«!û1‹È…®œ±Îøâó (¿ñÙÏܽµ¯ò!Âu~÷P ¸|Ärü•W÷¹Z/”#Ú‰AW0 ¡|¸Æƒ¼öÛõ’ïM?‰ŽÏɪÒ@ré1ªÓpfDMzè@R+4<Ñ@#UÀW )¼.S!ï3‹óS'3#Œ$ƒÞ¤¶ å¡Áf5B7 ¼NN Åme k8sFoRè€Öfôlg]§à¢Ànòyð×XgµÜmqsí=Q|å¨BV××öJäw\ÇrÕ]TöíZøV/Ï}ˆ$ꇋi¶Õ††GY˜:ª¢Y×h‘Lp"ÉÉÀŽò·ù)ëãb¶6œ·à¨Bv<'=î'µÊ@3$’ §g&ø_o‹f <Îóx¯,Kg­­þxÇß*ŒhÛ· k¶^åN¢=‹•ÃJ*Ì·½‰Ñ’¼ƒŽãLNümG˜²eò&É<(\­¨çù)8 ìZ· M¹?F†¶d¼†ê9V âr½òtÉ}kˆÑ‹r¯7é[5t\ƤrìÜ#DA•9>„ÅŒÁYj1€÷GaU;T3}u ·£CqlH›ß]q5Ùƒ7Ï÷*ç´# CéVSBR¦RÝÊý,ÝÒÜ8K:Áž‰†±këGY!SäT e¾½CG饷r¡÷žî K^ïãGMôÓ·¸ì*›BZ®rÖÊ¥ÔWÄžÆçIJü[þú-óKTTÉöègH{W¨%tWׄ6ȯ:à:ŠÎn‡‰ê‹vöª;ÛúÐJ­÷P¯j îÒ¶7ÅAj\¨8wá»gÀüÓ®RvH?xQusôTØ%Øõ\u£Ô±°€°ì²q(3ìôóì¶™ç3íBzçDÖ\6Z‘9T¯õâÛÛ&óÕ9qeÅžÊt*Ã%)jóª;¦t${ÖŠ'¸ 1Ư-CK° ÜÚ] z‹ ñYÖñØ :l¾ B3ï¯P9¿¬s1»ÜúŒxN-ƒ ó¹mKxðµƒeéy-âPôѧéZú¬Æ\ÌþI¢ ÇÏ[m%\TÒ‰b¼s6ޝ¼¿q;Öbþ”º£ä ½u|nX£)3—zßÝS_ç[å®|ûÞOnkm·kCç^'X|8ì¶9‘Kج‰›8eéÓºFK¼öðw»ý°=öÇ ê-zõ` 7÷•o¶û-¯ä×ø9Ø¡@– âÈÔDÐ6¼"¯¢3>Q|0o@› Èd×iô»¬Ÿ¢‰®wcÖ+ ±½IbPø<ð,iŠìâ¡vãkÿvo‘8OÉMŽk-¸5Bé¡TÙÍ¢¬Zß,ÊŒ"c½ %áoç½üØÙªn¡ë-ýœyÂdYZ;Þ~ü³•2\§QP‰ÚPÔïLÃ÷åî.|Ø"ñ½TDhÝÞÈ:ÃioDcƒØ]"U1Ù¡ÔÓ8㌽‰}îãØ:¹ñE|‚ý³ÓÞÈkÏ(qí=0£SCò‘ŒÏœ·CÕwÔÇ·BbŸó˜GÊ@R\I1$½Œ(zøHfà Ӛį¼Zû™üé…{S‰”Gt¨=ÚriÊîŠx§aÖ%ÌQ®)HMx”EW ”èË…Âû,; ¨Í¹‰(Úa¦F@9”÷¾ýM~ô¤¨_7l¤Z\£<ÌYx…ŠêɈY OÞUÇÊe‘Õœ0EeÔ›"gg\/0û ¹$ªmV®ÖÞ ›cû³vDwˆIG»mé{•°º4WÏó½ôÞÀ3`Øâ9GŒaqÿ°Äø&µU¸L“ºÊÈý ›¹›ns¡?²Í7BaGLìòóÇÊÄ+–)2ÇONécjb•»P‚ÝSCÈz33ïH Y)ª9å×00d…žqfeN!XCMÉ30eyO©Òdb ƒÉkã½æÑë&tm¢ôÅØ+’Z¶¦! >ãª:.iÆÊÐM®ŸöL„ ̬8uízìV±¾g×N™å„@û⮟Hu Í<.4†1d£ç”§n›[ êCIð¼n†NÍ^04 Sd6´‡-BÛÛ:`cAß;#Ð0ëõ¼Ýöæ+\‡Ð7räÚžÕ¾B Òjf€ú"¡„sýQåø£Žañž¡¬hÕ±EÑŒÃùÁkdRþA¦‹ñ~‚ºžy…›òþ{鯉… rø)F^Ævré2»¶“AvÍn³æDìñ]³QÞqª_ˆ„1ÎʨïKÐv!Õîçìdæ4ßõÀ-ëƒæÔÍ"¢ô Öu Ž-C+óž9ó«Š©yÜÐÂ(áè%ø\#ÇȂ ›§K”|ØL0*tÇá×AŽ6¬³A¾©ëF]üøQBfì´rbèy£k;Dô­8}·;81BSPcÞ·`÷Pˆý Hq¬z×ô’Ýð¼R~ÿª*›zK–ÏIJ”½0ÀŒ Q1¾]L,–_ }È•LàÎ@ˆ0¯`ÇL¨Qü4Þ€Öý½Âp[xã5•ü®­KfἎålM½‘ z¦ÏÁƇÅÎ×e±¬‡L>ƒsýÓ]&“U^ßËÒ]oVš×qF<ç.Cî‘F!Γ&òV!xGa×ðüÉ2ŒœÓ†R)<&Jçr5úZÉxÝsS3By«Û,ÐYWH”óEã›´èˆtÅûÒÕ²ÕüýŽXêüfbp[Ææ:[awÔ‚j8Ç’n}¸?ÀÏôá,2v¥Óá6ˈUÆx±´„ˆ„§®ëöÖ}‡«ÄwTŠ£‘‚Gzc›ŠÉµM‚õ%æ3/h›sÝCüIñ¦–„˜ÚM¾r‡³Ö’,éB˵ÎCaÌØÌ5½%ÿŽŠa6D®2$}²ñ‹”^€YðI6UB‰r§{s=• &Þ§´—£ü ÚpJξ'_€žàÅá½Ð̤~}µk¥‡òåâ£iä´1t€3F«ç¤ÛwþI “Þäªmd5žcL¯Ì8ÔÙLrY+l§–3j GútçOO¡»Ü´A´ë6TòZ#*3(ÛòÜ ´uæ×~Mþ!ó?ãFãɘÂ:¿¼˜ÂÐ%ÒŸè¶Ѫq†®ø¸ «®,ߨ¤§B#—’6PÂt`±·¸cõè9N¿—Áœ~ÌÁ?²]}ŸæÔ:È—ý>EÁë¯DBoÖ$!ÔÏäªè¶³À’ùQ–Ó2{¼O7ºÿ®¯þ¸¢ÈÓ¤ïèɶN«—ÉÉv‡Þ0Êi/àš“ðýFÃŽ¯¸Š$~SNK–i‚æ—j%RðJú£Cn·èIt$Œ‰¶cO1 ²Ú&%m¯a1…«¤îåéôüiÌRJìË" MtÑk“¶,RK¤ðçŠk‰v†É¡¡ŒÞ¤±Ì¥5„¼©T;j‚rìæ1?™äÏqPŸ<«JWœ>Ô”ñ—ÅU;ö+;p4”þñ\j²Ê†avÙnyX^!7U®ÁVÃÂ=@” ÂïÜmSFˆ€¥4—Ÿi\_Ú¬šö†»ò«S{ß5v´Ÿ¹ p†ˆ£+óá‡qmÙïw“x?_ Üí¢Í©²Ôç^Ÿê]¤gq’nܯפI¾ã[º¦¯ÇF¡jïÒûÍ*è½Ü}^aº1Â>5â<«¸*@‡†UçSÁáSë {}yöùïCN›j“Ù»×Y_¾³â ßò+ÀË'êߺ,²Ê_±m½ê?wLµ#³ ý:3Üóºk¿ VÊ£?üŠM’Ñp)e·€§¨P7]«âÞÐ4ݶÏ! Ts½z69ZÕ¥oØÊèSç­b]ÀÇjãÐqsmǸ,%>â{„ä- ½UÍ"6µ¹ŒþHÙ§Ñ_û Py×ißTßÉ”f¼±\†›ìkM,¬W/Ò€€§BA¾lúæÂF8_Ldq!œÆ3C:¬ø®-€K¶Ð^}/c—jÏÔׄ ÷=î(œÈS(®Ô&A,ßêú7cÜ"mìµý{~+uä}振,ˆó'¯b_†—F Vž£;„`¸Úv¦½Ë˜Ü߇h^Ë‹—ÑãF+èqŸ ¬]*øà—8ÍyP6¾_°«½PiZÔð±.Wžì]V³3ã ˜ê^iBQ½zQ`IŸs„X¿PYö6 úsãÅÐ¥:s.KpÁ>õOZÄíÖlë“ÝÓHE…nò}ˆJj÷9A¤d~«)Ô½˜ùyYwPM^$ò…*€#˜8(™¼c»ó¢q”dDkuA2·à6]—¢Ÿ¿ -Ε—Ï“æñŸ!‘üûF70K+PËò­/#S‹Ôãj›÷>ž÷Dµæ(³b8íÇ7‡ÕKÎä”@k½CФÌýG÷´ŸÔü½ÚPÛ×—$¨å™e’b®Õc­7 í»'9H5»³Í4‘Ep¸­T¤°(­ŒWJ.Ê8!ÝÈpb!²ÊÓ>k…õL¬U¡¡#ø«5™çÚÁ:ŸŠ·1óíäX¤ª¿eÄÀ{:ìí/“Æ>Ú¾|âx®Pð©Öšûº[JÌÞgMøp€éÉ'EᲟÀ RÈcbGè?%¥ä$ŸÒï±÷pß${£›…dH¦j{åß§®ñãIî'ôKþ*â´˜-^¼Ä±æKzˆ(që« BÆû ZN3Õwû}htòÏ@.¹4ê¦èe ½…ÝØŠ2ïò¨4š'ECIÄmO1§=»híßi› V–ÜÄ®ˆ¢ëèÂ6j 㬫Œrß¹g4RÚF¶$U íg¤ÊVæÖ=1”ÐZeŽ+*9ñBä CÙ‚ä§bŸ³ »tXÞyÒäGòf‹`ÑNüT]Òp >ÆÊÜt$R´ Š«¹–¡$}׳ί¨™ÿZÉFs–X©xVð™E*,e|sfÆ(=¬¹Ý§Yø[ÚO«ÂÖ|&õKþwŽŒ¡Ã™8Ž}€^¯¸ëIýó8~xAwBw'Ù±Å1Ô8vÖbíQâÇ“M*£–ÁåöSÞQš*Ò«‘ȹ°¯DÑúÈÛ®„|»³k%¨.GGCE®éÜ.þ‰wÆ:·9¾”ÎeŽœê´ø1D‡#ÍZ,n÷§ •¯ý“¡$îaÓ#ðP×¼RÈûÙ: lÓyÚ8'¹ötPóZVå¾ÔVwrñ‡ †`Jɤðr–ùÑŠ5S¿YŸÈö̉Vàú¡#ž.48VaÖj.ßÿ"{Ýܽ$„–Se] Iœ‘š-`WÛÉ|L&OÝìã8r¸‰HémÔ21÷fê#a:ÕþÜN2@¯ÁSwê–åv· Sì(G˶]o£ÐÛ‰fÏA³ˆ–HÞˆ²‹éÿ ê=ÃþÒCÁ†7BÀqy“`¹Ã÷òÆwÞìŠý\G÷ßN¶úŽG‰wôˆ°ÁH¤ÚÒ³„1u®Z”j·ÖLŒu;‡ˆæ"œ.ašhù ¸äóÛ˜KÈE,ÇÙ'u F—ÑØ~G)Ý\ѳœŸ/ˆlÓO_'Eqå[¡´#ÀäéWê·yê·bˆ¥.÷Í[ ¥%ÚðÕ3þH‰˜H‘­žeß»€!‘Ä#Ú÷‹fy5óhåèùG25+¸íüÒ°o5Ç·)ßY¥™h§g¡³x·!¨eÖ¥B¥hLmðw¿š£¾ùꀉê#Å ÅxÚ2‹Ä“ùI³Õ²K }:ËÇꕊ…¦âDãg[ÛŠ¤„&’SÔÚJ'Ú€¾ âä®FZ˜ÂG»ó„i}F—>Ê9ÉŠ;² Y©³qȱø¯ŒÓ¥U˜Ÿ¤Æ@9“57 LÖ-u¬)áZü­'o‰¬•Ø³ÅÆf*;У„©½ùê”S—TˆÇɇÁcòH4FC¹ìw®~UX¦ƒÆª÷{J%Gòí·47ù7†¨vfú|g^8–â‘¥þr‡ÛЙ_ orÊB´cyQýNݳõ_¾»|±öÑÄnD{2ÈÁ„Eé€0£Ì¶—9›$¯»îeÁ¦.KtxþR¢µ…²ÔÔ0o«”™BïPÓgË«š¯µj>;ÄVë iµ—n+¢ÎCR(F«rʯÈÏÕÕwØ…½Ã0¤fj†‚x—ž°^˜î`¤6m¡ïºQËɽîÑXfâ–ÈàøVOÙ¬yÝZ¨þÌM×>Q2àQ^öçÆnlQ˜ÒöK·Ó7­ëÄ4P/"-MXKF~ÀXùƒOß”üM\Ve_)_]b°ÀHj×XCpJ!ËÄÃ%qàU‘ÞîëKû±¿ÜŒô6Hi¡°tªd“ÐxúˆIéófü¨Gn<ݧbgþþ í¬·ËTŸ³A˜´ˆºe¼—a0|žòã–ÞªÓGW¿aR$ZÀ"¾ö=l膃q³ ¤à¤©QŽFG‡ªc”`ó»Ù–èh³ ©Yã.›™ÞZ¥ž¸‘Ãm½MÛ ‰yögagØÊæ4¼)X|Mí©Ó¢OX-eB³¥PsjðØ»:Žge)³¼_øŽaÖúxjäŒÂXiHÉLµ`ÌìzîÏTUeÛ1ñÒÚ¾`ro¨ëy\‘->Ì$×£võCHþ¬("´Ë” …g/.l5–I!Ö3ÀxÕVó–È»[¦O`:5ÇÆ*P~».néÃ÷R™<¢WŒÌð© a4?p…禭Þè'Öí|Òªoñ—J±:ão™ƒ­LÓØŠôåhÑ ó!'uö«fkÚmy‰êžõÊ-”ꪰÜVmŠîõégÈX{SK7äúëÍíÅÕÖ§ _Ä¥ú‚ÆÙ’ˆ“î°*IâÚö<·bðuW™l‹ª%4raU¢s6Ü®­‡s=1>Gœ¥ÇÛ<í qPm#õ<£¯ÐAMüTÁ ·îPâ4ª"Ú¶vͱ÷?„»fŠ 1¨aüþ='  <óW›1“™à<£¬æúÙw+“¼ðÔ9|Ž)0a±ˆ–3ëVÒ>Ê)vñhHã¿?–ë+ËpYwð4Ÿ$t½g°Õüšðd¨äÕQëåeŠI½]IpùB%"‹ä^û” õÁéú(ê#Žm(²2 ƒ†‰Fªü¡{Æ5ñ‘á—(7ÀõûÔˆU´ ¼¸ü#Q¬M†9ݵ{qtûá¶JÑNt©kÎgªwç…>³ñ1£s/Jõš%ÀAŠ Êlé³3‚¦Š:.‹—¡Cû+‡Ð×\4“x¬Ja!6ðÀ%Fõ]±®û…Ã~ôzƒEß(Žœòã–%™ó¼" õO Qr",a±çsbZÜíª»dÎÝwQ›ŠÕˆ‰yiâµ3²)éN¥aþ›•6%Ru7KØm'ƾr÷­Ôš=·f^ŸØ2Sò«&e=˜ª›(é;ût®ãÍbøbl1[QI\éœ7´ EPþhIk*˜óGj[nk& —éÉßRE5;+ƒ#ôõ“aë’Äl»»¿­4,h+/Öèû?³™Ž~‚ÚT§ ñ&¶¾íÊ9uŸqÈKb°·ŒÚâ±Ó÷¾zmØt}_‹`ßF*3GÏÈžRÞþiÀ º)‘WŸ¦íz«H7ꛎ¨¥ ˜z©S'9‡·zí„0€³l\¶¾$wÏ?ŽŒ ¯`rHz¨¤«“¨hxíàá®n­-7ŽZ›y>”| šb¸uÔaüÝ© HO„B–üéè#§!ÏR´x ê £¥¨Å;l>¼ãÛn̘[1c%ÁW×Ä[°oYî ¹I…ã 2-`ºt1˜ÚL¼pb—«§K!@1×a;ª’˜Ô‹|vì˜^å~Ë—vµ5Íí ÓPÅ{ª9Ë<Þ×á‹,‹áÕNº[Äiðc ý')”£Öã½R2sxε ï‘0‹¹¦”dI?¯›}áÜlêòBÉ"Ë6ãÐã^gÝ;“˜É?†„väŒ&{ѧܚ¨.›~ÙŠ$=`Yõ1Û³ÖâJíàžÜ-í™·4'Ïè’h­ 9»s€³wS5PÒ'š>»:»Þ÷äryBc<†o¶÷“ªÓ%®’€¶iÁ"«å»‘¢Ú"6U‡Hˆ€$ÎJÒg£\;{q‹Â+ÛN‰²Wòù­r%†?òËÂ`¨ŸWÖÊ—#=ßÕðÀñìJŠ2ر0¿1%Ì+ŸjôTÇ)ðÕP˜L:3ƒxÝÛl•©)«·e9ø•G[ÌVªüÜîêôýòFƒø•ÊN€d“QH¬h‹œEøÞ¹ œåݽ>;'Ì50,º…‹¼Aåµ’3UKZ¾äà(©P Û)·ìI «'ŽšªVðu‚ºq£ v©ìÒ’çýr[ÒG¨:8–¡q©ÔlÎ4Ág)ãÎιðü—Șw°?–ï¿…Íd¾+ánë¬eä(dQÕÊ﬒jŽ]Å{À¹Ù3…ÓŽ\@¼D‹™Úš |$ZŠÌføéž-e4ÄøåëUD’ KöN–ÐdFæ›Ûz`B}J/²rÌœüˆ‰ÅÈQp¬oé‘Z­=Qü(=ØÑ¹Y«¬<¹û‘1ʧir ïft©†ݺû¦ò&ƒø»d<Ç›ŸÄ(ót¹sõ6K=îY+Û%â,Œg§§YØ6 ¶iqÜÐ{¯$v…oÑséI}å'5¯Î^ÓØt?^¸ÇºØ±ûgÄ‹ûA× ŽQ“Å“°?¹7g).ìãù2´ ¢¼ìÙsç%ßmf?õǯÈ ž'(­²½³ß,°Žg¯-sÈ 3ŽByæˆ\ÎÄ:屎@<.‡R™ŠyÌ› ï⌫›DÄ*yÂ:¾ñÅ}?,Þ?Žß©ˆÛg]Æ„º(+¦QÀ%^¿(£ÄãBdœ¸³>y]£ê¹­›^È99]”‹áê¼Ü4 7±·ÀxGDÇͪšÑBEãz¸^›ØÒµ§ùæ«MÔèh‹ºÚ–:™lT+íøå\Ë7ŸhGyõ¾šÒÇŒ8CŠb®~î϶^·6xÅjŠÞݶFp—³ÿU¨@eOÜHë9嘻RÓvµ¥.ÏCc9ly®šœSiéM+­uªTÕð®÷ÂÙù¶Õ"å\‡¸V½ä‰‰«®…[ö[Èoj†“”랯*ÈÏfÛcùá+·Nù‹wûîwÔT“Æ`h›Ö¹ˆTL#´&ø.-°f˜³ËDZHÄ«@ˆ´GVi=À¬#ùؼ츫oÈçãø¨³³Êj@ò¯Ö~2?_€ztë×óuC³c–ë3i:ƒaÙVà‡y­uGÆë|•Æð”kóSUÝ™5úàø Õ²ïýjŸ#û1ôî›lƒù1C¬ +zø,ïK„yóÎiG­ Rrù"ªÎ~ᘪ4x뮌jxÄÛÝ.2®ÒYO¾$lEŒÜÛר½;2Y&©z§ˆ°{¬ãÀ9Â5K Ú MDsØãû3zM'+Ì¡ bäá-bæ–k„Qì‘R†a5ŽP6®ƒÞçM´3àMÊçïÄÁZ3mçÓhðNçmQˆÑ?^ë0ÎL?"=ñL‹Ü$Šb_ÐúÀî<“Î$lÿZE:÷\¡¢‚+œuàÈŠ~çjÀüú0l~;ÔbºØ9éQ.ª 5w 6åî]Eª·Ïœä'¤©G=˜é‹ëoÔ„ÂîȤøb&MÏF6Pù£pj´ïotŸ ù”Ò_ŽO‹©Ê Ý¢’f®`Þ*xŒ[X²@Š$jw„hs#À‡CÖºH-="Îø[ew¶ØÎiRQÇkÒ.i¾4¡f ÆáŒÕ|VY•#å·²­;Eê­Ú”ž#WAÆìÂÇv¼‹DبÌëÝP¢·÷¥p6¥sz­lÓ× ªH-:H*™|DWr+4Þ˜¹î@¯ïm£wÝ}}_> L‹Ý”kJ‹Ãu9;öìî Åçè6y ~ AUJmŒÏ2Î £qÊÖ>An'Ú)Hνq)ÖËx-„á01»E Ì#kÜâIá`—Ñ{b» RC`R)¿+gT—œ…å¯/ihûبç$¤„ùràÅën“ã©_+”¥‰¢t*åב°µbÈ çg†÷þƒÈÛ„¾«'ÏjÃvÜI‹`ÝH¥)?wÆÄí¼25ÞˆŸgÀõ ilzTxñPËÏx=X„£ÎR¾&ü_¯,™g[ “(žØ¼öS1{&;°>_ñ/mˆ|°ÐVŽLÁÏ`í9Í0߯aí×;–“j0¼Ø=~ö"wÖéœÃ¯J"HY¤ Ý«(«[JxEGásÝ÷¼.Xį?[JÖ*«âÇñ]5ˆ¹û5³ÁŒáÃ42ÿºs«PÝ7]ÄäÜmâtSœ/ÕXŸaÉMVúXð"bù›èÓù?VÚ\î|ºãûI‘ uazH[Ðß‘ýv›sãå’²÷™å+S$ߣ½:#µ„,ÓZ;Íþ l ñR“$Ôú»6@¢®rû&^ßOAL,oÄÏ2zi:*»SD XúÊVF ÕÍïL;FæÎÙ–™¢ì7´CÛuLEpôІެ¶9ÔïiÕéKt<²¸¬[­FÎM'œT¼•ï¥>VKf»ÜõO€Pè?4&öÓ²œÙA¤^E´~ZQánñ9¢!éw"¶ðs‡¢–b‡¼ÀyŽ,5¹)A첪¨tÙu¯Þ³š×ÙX†Û¾¹¤±:ìa БZÁ’81,¸Û+©wó\T ð½Ð¡ßæh¶Ujqø´?ÙcТ 9i¸œeªx¢óÐCÿ“,(ùBÛËeëËž Á®LT˜`QÒ†—&Ü…[éU:¢´ÞQýר6`]#þ«?«I«¹Ó€Žõ—Y¢€ ëhn¹Âû*4¬ Iëè¹AnkØaµšoÔÉŸ%Ý~0«;¼uf(õì,q馇=æÏ"ÓÃA-fµ•X€w1€&gÕžDtMóîøE¦‚J¾›ˆ„DZ_âs*…BR7„v×9¦Göl°<Ý«æç¬ÖøRùÄE@ñ„0w1Ü!’ã}ííÑ;QÎ,í÷«OTÀ¿¶:GšZ+Ñc°öØÃDÅz=î%ÛÆÏK×@kš”}°”Úò-ô£d>Z]'STzK³‹Ô£ùD_ÛBäì—QZ^ƨa¡ÞyÃ÷YɈnç·?Þʵ*ÖLÉ÷Ó7 ìPÈÙFe>Ê·2ì&—+¬Æ&ÿ8«qA.,Ò.Th.0äfχ;YA(gúº9.ï$»p…SKÊ3™®þ±‹»N7öÄ>ñ0*»æé³àê·ÄhfºC”ǤW°@Äï]l‰¢.´tÈt•ß]”=,ý¶üìb¡–1Ö€ÃÁ€½S¬¾ôõ û²K"K„áêCØQ2¹`[ôçx‘¢úgÆ U¸6²Uôºårp{ñd1?¼Ë{©àòk˜©ÞÉ å]¿ì+šh­âªr¬Ö 0; çS¾Àa/žŒ'ú§aŽÔÐÁüìcž0¾„j¨Gl¾w/«mØÂàóy£I¾ºëg”o>%53“€òqY)I&ÈÛ–ån¢áZ~=Y1(ÈeÉi.nˆ›lj; ŽFáŒúûp0Õ¨6ßÿh‘Òy̳í8´Î$i9[Éï‰lJÿ^€ï§ŒàyrQÑ–G¤1P® ¨È·šœrÚKEy5ñÚFÕ÷Ú©Á$cEi ºÓVŽ}ÍáýdöŠÖådOü ¦5¦81£¹‘¼wHÚŒLgC«‡S5bn€Ý·ËTyÍø+®èÐ{3VƒoB×Úòææã!³"ÊÕT»—ÙÅD šÜìÎЗÚiš”Ï1 Ê¥ÛšÒ62¨8‹p_û™˜?‹H#ÌÍð¨V†éW‹GøupØ3* A3hï¿ïy|'sJàç¬Õ­QŸ‰uB1S•…>ûÆ-ÿ;Uˆµ»-l=ôÑ~)¶F¶«2Ö‡ýks #³oÛür=ƒ!u¼³f^FÖP¬ú>üch ;0îEʉÂ~?ªYYù’ÙýJ©f(RO¸†µܧÁKtö8/‘$õÆÃûñE ç9Mèt<ÛÕ—‘R±·kwœeÄ)%I¶ˆ¤Ðóïtp•ÍWà8pœ ݾuçžÕ$¼­›ŸT\Ï®ÿyœ6gíi‹ö}ñ¨½¥M+„!ŠÉ fb™Óiتó@ê=X{Þ¶hæÑd­ ð|E#A”ILþì‹t6AÎÁ‘EHÄÙ ÝjöACÔ‚ù Û€ãi±M1þ¡Rc‹å]}\‹´&¯¬â‘¹æ~éO¢LàÏAIG<Õ¬²ìGÞoÛ»å$í3A|…’¶‚Qâ)|bÅÄBw1¯8FT)A¦}ËZUÙïCû b'e™)ß‹Í&ÐoŒ?qsËã9îµã‚…kfÈ•I®'õ§ÉñrŠ´jªW4íœv¼^™3T‚-Œøn§~i4v=â B°ÝzÁ”8ƈ¥U–Hxð|¢;ÍUZœÁöáæ16ú£S)vzFKņG=•q¼Yî0 =u›—.F#ZtE¨RY %®pBÝÄÙÙÍHº]‰M»‰BFÇ:!ÙG<¤FpéŽC(Ę €míòXAŸ\ÞÞBo¡‹;Y«H •ÅyÑœ©’òDoN/PE¤¾»ðÂ-àÛÂÒóÏù&zìWÎøeûØÉ¯ô­ ÝîÛ´²óOJ7„¹èä8 qI5¡ºGªGæ×GN‡:åÈ̆d3ç·o4GñNÏ·¬´EH— ß¾An°`ó~PëÙh=Š%qæJø(j~Ó¶cÎûɺˎ²ISŸ~©ZÒëÁ4U4–jæ/í#U1È8úpE¸Ìwˆpõóç1›¿L‘/ì¸C·??•Çž`.‹«Ç €xõdXóNÚˆÖµRU—žîW hÊÍ.h0‡ùþ#<嬵 Ú»ek˜Eß›I|BêâÆÁ¹‹š´éÇõµô9ä׸Ú7²/ýœ‚¥ Å…‹×OnãÕ@xY¶€Àó¹îá©L$˜"¦nÃÁIÂ<õÙ¸úÌvrNÓsŽè¶Wª|:5”r]Og¦î¬kUIØ^Τ™ZŽ€7¹žÝÜ3 ]ªÞŽ»]ï+¶šè`“%V²^î´æi5Òô%N±Â¿— ­jä.š­§z„· R(\vEã?‘:Yð:—âMžˆ.ù 3y:ÖÕö)6Sˆ¿±-rWS³à¤»çþ?"Ýé!rÇÄøI*Äó¼Ù `6'¤ÿùŽH¢÷³ß|fÇ*ßÚ¡I«€2 î–þ1ÜBœ×·,v<Ï€Àêr€„¡êé¸ä;=xà5ì ú,Õ¨îúêÇàè*_âŸÉûZÀÏ$ßa½×`f•L0#ŠÛTþ˜QÚ“ Ùh-„ÚÁmXWÃ=¤+w6Núž2GÑÿÃz ­ý5Mf²¿Æª-þÌ9‹OR卸šŠÆä}.Ç 4.ÌÆ\ÔêcZ'ƒK?ÐÊ:løG_kT¸eÞ{ ´ÚÍ®‰…þnayTý¨ßÍÄ9ئެë¬i Ô’®á)«ÆYY˜ß¤gX›`Ž×ÿ‡~ñÁ{ÆSÛ`×S·×Ü$i{iÊ h»†Vfþ?ª A­a»f—Ïa%„Kí| |…l0ÃX•{‘~sOE«Ÿ34QÏõ •Òû]&ßuúì‘ö‹­)Þ¡vIîÈ›-Ä/px¹î˜Æ=º±4t¾ÊÈèD­»Pópa›ÞãèÚ¬Ì3U›i—€2.*÷žãaZvÂÏÐUÎË¿ aF˜E–eð)˹2t0½ù†–Á¶~’b¿nEðy4!^35:ú·’[ƒDW¤-ñ¿² ñÂÍÙŒ7©48x ¹Ç{•bÔ_qW É)Îq ­–Ñã’Ø~õ¥ Ð/‘údÌS²•ýXl€î÷¿C¥ƒmhÕ` ùç¹Tq$ók¶ŽÁËÒ˜æ²æªîzœ–ëúQÐ xªw~ßœ³ìÏ[€aæý`ÚECS½Éû³÷¾ZYÂýk7.8Ö ðÌ¢9¸«Ö–Q QÂ[ŸÆl®ŠÃƒûÈ Ä{µŒ¡YtZ8†Í¦û1®rÉÆQ]]S>Ïi)ì­ºs©“ªºŸ@ŠóÆâóì†dy¢2¥)ôòFT¶sH%«Ûqú­´Ê 4ùô7Ei¤ÑY°h¿A†ö<†—k‹CѤ-ã©twì4«Ȥ[ʃá>锾J¤û ª"‹7Fe:†YÃàZÎÔ=7i‹Xîsn„¡ª|àȹÞóó = aò82f§u¨ÏÆ´ÛfŸoð>p±5uèUN5T+Thßu2I×4’úÚdÑQh ñ” V’d ‡Kƒ¢üÊý̆SMàZËR™'KO@Rïë^4r20Ïsæ3·&JF/Jß¶@CÈ•ç5 §“91MOP:Ihá©¢È+ #nç©î¥!à¡á0-“ê~Üù1˜4z «Á= WÇÆ‹éxXÉWéE ’©Tªoûîˆ{(Mi÷nƒu©H2¡{m#µ2rw †Ql‹¸©úÕP☪}ÐlPœèWÂF¾Hl–³ƒ ühWÛ1J/^¥à\û3mó[Ô³"‰ü­ßa  zj´ÿ󵧈|Ó¥“>êh¼ÆoS ¨*gWÝOû“mµú~9ù«±Ÿ&³…%˜—OŒÈ,R–ð½8Hím:Ó´†ôlÛQE#®b€ÑE]·’• Ìç”ÜKq#:ýguXsåB4û·ºœfÚx«…ÃX‡}q^æ§OИ15rÆÌÆ·¿¥ô×1ãݘ‰¢Ìj9é_’Ë;­¿ -š]×'e؉þVúQ2çQãU®¢eâC±ð×!ŠÌ3þšÂ9µâ¦Ëå{Èý„íÇ¢PJù°Ph¢·òÜ_`RqßË©Æ5Òv­ ?¥îì.ËùØeü{£Ì‰eõÓÿ‚„$³æ/F¯;Â_«!<ä>©edˆL§N  àë9ÑR„Xs{KÛ82E‹:">³)À^ z’â»ËL$ÒàV?j 18 _>ï/5Ó’p7°ÎE^xlÍ9´Ä‰×ª¾½^Võ>.h÷þßãRÝZù ¨í³ &iu¤0 bÓS›–ïÍfX£°X‡ÑìŠR¸8ôú}”ØqÖ›ç5h­4µLuqr^Wuÿì Ktbø9-Q&SHJ™×\g¦¹b&çÑ(E—w+Ð{ ©,&6#åä„ÞhŒC‹Ñ£kkXŽÐí8Çåp:û ­Ó[ö¢â"…!Èzíƒr‹Yæ"åÝ¿Ãå&¥(]“¡ئL ØFÁ pÞ Î@ra-ÞT ³>§8>H·ÅÉ=_ÍoN™ûOLÒjX¯zgñedäÖñ–JQ𱯢¿˜iT!œ%w¥Îê |$ü ’ÝðŒf1×0hÞôáÚ"¹äÃÖ ÆÈ¼ù„›¥è+Å'v#TÛ({î7ŒØ QXÒ42ªLKÂQ‘/ιĹ5ÎdÁ?:&XÔQù£Õù ™øf"g€Ã¿„C’m, þ°0g•çž…2B·gî—@tqšÚJI¥±´:ŠD›c – 3[á-CÑ`YweeÈûw·§U,Àïöü{dW8ü\÷gS-8%Äz`av}˺1ÉèÒDß(KtJÌD¦vOöÓÚ¥yòœKOg9róan('/ê¾—BöG/ý àã6¨.*]zdWÇ4¡’tÊ'ç°îÉ’~>˜¯å Cˆ€âc|©L¡÷€iÿØK¢wy7¨­¦åW/ñP|ûˆe>,cº§Ðí›)²a_Òørz÷Ñä<בÏ"Q6¹Aˆí0ÖŽˆÀçæ¨Žý>L©¥ÆÆà<é«}ä“xm BUìu_Æ{KÃiˆ¢c3¸]d«µbƒyD™µ¼îÖäaÊã\ܸ®ë§ANñÿœq7R§G±Nð´°|¤¬\–´H´%ü„PKÍ { úN¨¶Þƒ¸¿ÄâÈcà<:¯õiy^Ž9Ã@—BâÚ×â&v‹Ývý‚+(P(Ú[œÍPÉJ‘“YÊÕW¹Ë™B{Vt—㟡¹ÈÁU¹sYm‰¸)tˆ+‡÷ô ý¢Ï"‰öÑ‹2Çv¨M~ä8R~”"÷o>Ïq}M¥b;S°Äë;ϋB9¼ÓÝžf=ÇÍ=6VÅ^6pŒ8:¶’iôHNe /Æí§«.ÉEËŠ¤˜™ìMÇíôﺩ d{!°oÀHˆ×¢Þ¹¢¹“M wpV¬i?)ÞèZhvVJ×ðýî'€dˆàg%br{ð;í~—YÀ"ìÄ šUl÷/$ª½ÜXðÆð' Cš3M>*‰˜S²êú%DÖÑ#ç³%})ð J’@ãj§AË“:E8ªF}(<7Ã7ƒ§çàêÅû­O³\´;ÏO·Ob?Š|)­û^‡r”¯ê¹ÖªfEôk%Ÿˆé€÷w¨ ³°2Dò÷Úú*:5Akç@¥A¦ãøM’8â÷ìÔJ bïqчL?mä •è8î²EH›Ù°q}ë;fùíÜ®÷ Ü9wéên°@}<³êä}c ^hhïø¶†É¥:Âfáä¬UD%d¢ІÈn¸™“tí:™“Ž1­¡¯ŸyòBwarɬ#;ç•Þ•OœÝØàì[¼#ï¬tM´Çà\ÊjÁa¶­ÅX ΃׶ƒRÊ̢דó­ÆûRÔ}Íl ,•‰é%)58üöT#XÞ‰•‹”Øçû-pÓÿ:¬{û¾VŠÖÚÉ IAz{D¦-H€iœÊŒì¸éúÙ0ÔÓPcüÿ>÷yh~n²Á]ÿŒ—DB¡R';˜ouAæ…EŸ#¦ÏaJeåEÿ¢Òþd§x>!ù|ú}`ô÷$¤u÷_FÞ3—J“.BnŸDÅëí§›=6¯j[évÒžH Ÿ†‰Œ'B®bwX³Ûfv-eÇ~'H›—#3ÐÞ²~¶dù‘ÇBÑžÝÜÆ6W ÝY´îÅËž¨®"Jò{S¬ïQC'ѯt~Ãi\ªU¶’J›¤×ô£Z U„hbZà(h~Ck(ò¹r‚•á«ÂŠApŒéGÉK¾úênÁx7øÈ—QóÖb…ðPàøŒ•;‹ëe¦{IçDòO³Ø›=—[¾ ëj‰Ç`ÈEìî1©iäF–álû ›8ã%yíñæÝÙÍYHÌIQBè'D!tkجºáúÊ Þ…½CÑhË+øÙ×Z XÝ’~;+g ±" ñQÐ<™“ŽÚ%Æœ‘§àÙE€ÎmGÓ2þcBÞŸ›áj¨V=:ÛjVD ëàêiŠà5›‘¶%âÍmv#AœÖ™„Î ïÅyV’'×sµXΜ4Æñ ¾…nÁ²ZTèuÔn·ËlVgï Á_­`ÐðHÓÅ Í®R3¥J²(à0]Vò´±|Î…}7¦,;ìžO‚ãÞæ—•IÛùÒVâS?À-)ãq·? ¨Ö…z¯cAQçíiݼžkB±~)¿Åh;§Ùl¾Óâ›`òÓÀ*ÿcÝ}½!ó‚rï.ɬ8Í&=¥÷[‡aù›Á¹ž‹•»Š/ýÍ ™ñç@ÿ‡VÔù_‘çnÕ–„ÀÕ$“~HÉP€,ÇGÜUŸÚ”þ‹/¨CŒÿÜõe€{JBv5Cp“Xt¯¯TáÝÁÂT·7'3#Cc8Áq8©_ëúÃJRËÛŽ¶)äzýnÕº·ô+ªéB*%n as'¹íÉ5²$¡h ^Êv«ëྗ—WLÌI“’y0’x¿%6®S‚2Á9f`tÔê! ¥<Ô‰ž¡˜ÂZˆ€$¬)b¯¯ˆ»uíæÏ7!8õþi¦[eÏÄØÅrÆJS‡§kûrlÞœÔZ¡úÚÉô0ºyÔ_À8Üx'³UØoãCnˆ3µí§½0˜¥¾.ýLCu+Û<@W¯¸qG´¼¤}ß¾þ¼påÏáÇO3t¤Û·ð'„=Õœ¾£[»§Rtýcÿ€w£%€­kâç`$NŽþƒ["sÁ_ûÏ\Oþ«é`í¸8{œCÒðÛŽ%—šª;ûBÖ+›QCu&Ñ`<=Ùh8"6儚zÀí·å)ÿBX«x†h )ý©ÙJÓ¹{"Lbñê<¨þOL:Š­Ÿ‘Ôè80Q±×¦z”’&æ©û‡]ÆÂˆ›Pú­L*_‚€|zW‚eœð½ñ{){íÓÚ PÌy¾f‚q%SeîÕ{Pý#Û{âC:õÕØý´ì¯ÎõL)aZÍÿy»¶ ÌZ¤xcðOØÝ+#¯Úœ˜ë†Þ½À 9AR5.Þ½ÈÙ“„Dùha¼4®M„obþi'œ„’å¼}/º£TØs“Î)«CIˆÃmà#jþÓiì웵áûåòQb¢m¦¼}mü9éUv7ÍdRc0¤¨q£,²ö/f’†JýÒÚ‚u?Ëš€ßøÖÑÛtL„l¼Þ;–ü Ú¤•ÓÁ¸iÕlAèêúþÚÀrx…Ïvšç/sж<‘ö8c]Ü;É`kM"´”åÈd3Ëe¶¿/-È7Fž#ôüÉZ}©reé?` vþñoV9çÆA˜oŸlñÕvõÎßÃL‘!­7`•ˆöÄœb¨ËĽ¡í˜1Çâ” ·€<úžÕPØ­(Ž4”kØsvYa¬¤ù &þ½àûݘ1ˆ.'"m]Ü#1 øÍÜëÂ[¥'+±~˜£w ¡ât]x´Ý’ÍOšü[G4ìƒgYxÎUyÞ骿>¶…T왂ùu`å¯þ3mó[Ô³"‰P§’í'{{n «ÃÌ-I'HòÜÒe=:Íî½rÒæ:ŽÁ ñR²±lM}z«2hE…¥9£†Â¼P¹ÈÞ×@Jïñ‹p2VRè'k¿5"zW3fK{ß0'PZ6ÌZdϦWÎ_Í™“Äq[è2P ³Ø< =1î’£}óZv³HàþÙOÛ˜¬:}Zr° (hÉ­ý n‡›Çî"<¸£–2«.Þ­mªƒÈýiÖmôtò# Ð>½1l>öv¢IAŠpè1¨…¢~yá 7iÒúÕd‹óÓÝdr‘ÈÜ/‚+‹ŽûÜÛº1ÏÌíäzQ ±{§³NˆÿÆê\?ʲ¤rx<¨_Ís1…`‚ÍþNW±ž$èŸW#C¸˜Rz¡Ï1¹q6®Ë{Û ÷cŒç´qêBäÂËôÆþåݾ.K+7J_†4¡Ù`åDÅmt‚Ü5šc/CÀ“ëø 7/\ˆLË4Dý7Hì{f@pêD^˜¾EËaÉàVªf%×KųúÕD¦¯*¬Õ0x=ˆs-ÀV‘]ãSH—©ûŸï„ÁòHHÇé`'v},³Í”‡î;°ÇP/—Y†ÔOÈ €úmÌ€Ÿ0¶‚IæÊ_ð<%m[Šåë‡>´¾¯*÷ÿ5 ã$X§À–… KïÍúþýÄš÷›Ù§UO* ÉKßI­¢4Æ7Ðâò(ï·†u€¶Vÿν©¼U×$cíß“;Óm¨OOÁíV^W­òµlSÈ랯iÃTPm¢åï©|GÕh¹©¥Ê6";ÅÔy ÉIâ†þØžé¡à„³µÁ;ç:0ƒžs¥L\5É8ø[.Qe’ÐCHѼèþíø7ûÒ`6Éi•q‹<°nPœ’ ·M Ï{¢¯`;* †"ø#é[ç|<# 5LžõVi¾Ö’ÂŽ÷âWk endstream endobj 4079 0 obj << /Length1 1746 /Length2 4522 /Length3 0 /Length 5588 /Filter /FlateDecode >> stream xÚt<ÔüVvV ‘ÙëÎÙ3[öIãÜwᎻ3.[H™)#‘U4l"$#$²G6eËÈ.¿ÓøæûýÿßïqÇÝ=_¯çk½_ƒŸÇÔB\Žq@è`ÐxqI °" idi) À`) 0BÃÏo‰Â» þÈiø­X ƒV<ÂÐÄ" x¢L Š'0h@ßÔ$e%åÁ`+ü!b°Š€ÔŒ$} £á×ĸ°('$žçÏ_@& H*(ȉý4Ô]X ŠŒ x$•u,00Oø— !e$ï¦yyyI@]q¬“ª°à…Â#sõDÀÃ’c¨+âwi4ü€%…û¥°À8â½ X@¸ `4Žhâ†#°1:`¡g˜¸!пȆ¿bÀïÇ$%$ÿq÷ÛúÐ ýÓ ƒa\Ý h í8¢\€‰Ž¡Þ/@ÑðC"Ô‡!ÚC=¡(¨‘ð3u( £n@‰þ®âÜð8 Êå°FСâ3k£ášWW£9ÌO …EÀˆïNýn®3ã…öùƒQh¸ãap7åîÐÓúÍ!ŠhþÊœx@ ËKIwá C‚XÜ?•’‡bb ~>n7À‘XÂåˆ þÐøà žõ@øùUüÑHJp 8 œPhš¿Þ‰b„ã/Lì?å \ÇO~þùw™8ap Ú…ð—þ³Å C3 s3Ñß%ÿ£ÔÐÀx>â’€8DJH² 2€ß¿½üSÿŸÚJM¡¨ß¹ÿúÓC;b…_%ßîOž¿çBè÷ÒÿŽ`Œ!N3ú;üö`0Œø%ù^Ÿ&ÿ¿É?ôò¿ÿ3Òñpqù©úEøôPW” á7ƒ8Íxâfaˆûþ/Õñkp”‡ëµzx(qCÔÑN.ÿ<$ §ƒòFÀMQxòçÄüiÑ» 0ÅàP‡÷—ƒÿ£#®Ì™xSpÄfýT!ˆõïˆÚh~¸zYŠÅB 4`â|AddIâŽÂÞ?GI 1x¢ @¬ÎpÄ`i[ª € ‡¢_H9üE ö:Ì?%â„ Ç#P 9ý¥e’à†$ž˜¿ ¢ uq>‰™¸ÄT\ÿBIb*G\× „ùŒÈ%â#jbjnG 4ÂÄÜšZûÒ=.¹­™É¦¡çb$¨OÎÌÏÓ»l¤Ì«&ÍÖËr\ëzø§ëµÙöb…‚7^‡ 9à>˜Æ>‘æp´\+_xâa„}µT<}¡ãE.dªûü†¥ù¢\ˆˆÓ¥»3 C†Tù•“XHU¬©Ðkå‹âÚáþNùm›OΟ»ˆSK×ó±­Y<ÛÞÿѪSHXÊO2ˆEÆyɼÆŽÊŠ[ÝXÎ,¤ü´¶;໛ᦖª¯[R6Õ°N¼kßÖÎÕ¶|Jßêöž¤p¸˜v\ᎱÝÊÌÉÙ‰.fÛ–Ú÷ì„*3ÝñfÓiç\€Ç§ö»kayE’L¼T"¯*ß)0?)Ù@{á«Wý„F|’ß«õQ‘=Ìz½îs–۵ɩ^Òw‡Wûü^l`[¯Ž¾ »’ÛÃÿ*¾âÆHüY ¾¶%b–½iæ/¦RÛhͳQ#A7ÄQT¡?¿Áø&|…ŒÇ©l7u²ð¡mÁ™[lÃÔî·7Üí®?aI³/ÑôÈ'5éÊœŠžCžl²Ÿ`€AÍ;JŽô"ö…¼jI‚Ÿ—ût©žSç34%Ágc×CC“CÜi?ÂÂ3-Æfí6Väôœè‚Ÿ¤þòÆhíóËï9ÖØo#3Tý†i —‚<üÎä Q DcË c‚6J=•¾züÊ*„ö ²´ 9–Ùµ, z4|a_à£v©û[s:p–4±¤Ìá%o÷¦Äo»úYLÆ4—óbÕ}QqÝiÞ2åSù;á&‰ &·ÆÉô {îw3êñ+‰q­oR«Æ e5~^ªÖHÒ)×|;_ŸÁŸhŽ;ù=¸¶REdž22+óÖ¤6=_ø¼¤\¤ÝZåôÑ<í¾ÞÏà˜Ùjõœ¼›Å‚mß-6÷õy‹qc#Ð2ö45ÙúÑs8­™x`€g•ô¡fÂÒ`#á|]‰–Ê»ŠÐ ó©]fäåówŽ?©{nDƤX`1ß„×LƒhâKn}EG“Œ![ëøÈeµÅ f FÄ4sÞ¸·˜ö¶êÒ,û¹ iXÚý«×[|“æ§gŒ£ËËË8Jrp¥œ²*~Áèb%«à»GbÞ3üàšxímþêJƒµ´xŸ0ñY!Œ‚¦¼@A²U*Máµë:ìü©¯—ìÞmܘÁr¸çSjö ¹S[ O{sR߇ý(AúIQ¯,ž=#aù-Ú3+x_w„O\åzsԀףּ]‘‰ý–òÁÓYÒ¨`È´ƒUMö?Ü‚™çS“?HmÚÕî½}ëpKëÄú}Øã~Ž–2Çó{>dtwαÅÄÍÙ.ú‘á.Ï·%ô¡J vF¶<Ñë,ý!b?ªF=³V\ózÖÏÊ]:VÎÀA¾Í#ÀºÂ"žÁ½ú²‡v²–<銧m6ÒˆƒKÅÄ|)ƒ¹†‘`ö¥Û·¥B×ÀSWÒÕÍоQ•U—† 7ø-¿ûöœ¥®'•-ë“ÁÑWÔ¯Ï>=þ,ŠéD̳Î,ìCÔù;cm7Ož céØz ʈó_~‡÷ßœOö‘ÛÚiPKN9#{¹êàÛͻيÙ6¦¥H8³qtfá›NØ(ilÜqåZ¶ÆÓÓŒi_>y¯³(š*~úMÍX‰Ž, “ØÛzÓ^¯$OñC°›ÏgΜ¯ç#MÔ{#Ý—*úîWêW♥ŠúÇéú©}¸W2ùíªäU˜L‹¿â}â…Ù›³{¯^å„petNd{)ˆª¾ŸDàÝïÒ^?Nîà0~,ƒ}nâá\Ôc½›;T‘£s«O £¦c.%îÒ&äíN¢úuœ”_R=<3õ¬Ðqvø/«ø1ÒA¿M½‡ð;•iE2{§m3=à"ë-n³œ÷‹² ÙJ©`'Vc¥!‚Ùôwm¥f½o–Á¹7Ç]-vîFq‡Ù2ôú{ûv]Ù—ÛI…yçÞÓª›7~@o­¬üa Ù+¸ˆ,˜w¨nR™v%Š ô~ò¨œ/ØÏx,~›K„')gÕ¯›]Ut‡å%¿ËŠè›GÆ*†6A0›JC'“O[].?óe1]/:R´Ý¸ÄѾ/²öòÌz_ $ô‰Î—ESÂRkç#†gæ‰w¿ébRb½C#gG`ùY/[/“÷Uyc "Š÷"«ƒŸ>JO'›uxíu»Ägž"o!0ãÊÈನ,ŒÓ3I9'ˆ[8Kói;8Ã"ΑàׄÕežðncÓÔgû.ü²$ÃmFëüö÷N× ðP‹2½¯šçáKYA2„ÌÜ›4½׺¯zÝ2:pöëæž]Iú¬ÛçgÄnåúº¯‰Í«×Ëk†/SA¯‰Úçæö “[pËúàŠ­Í¶å‰á¦ÊÓ¬W=¢bT(Â|ˆ‚RÃJ×Ùj͉æKäežÇ÷_$¿3–Ójg~Naå½\vósñG tNÀÜãÇ”lTuÈœ'ŸŒ.ÓY—Ù†5¸Š$[ ¿¼oð}w‘¤99{ˆó9_ÂòÁ½)Ò©âfÖ—òkïÃTo˜.³¦Ýtö“ªÑûžÅÛ—j¸ÐÚÎeŸOL?©Á)üÖÞƒðÁhrûËT„ÍŽì¨Îƒ²„IcT÷l¨Ôyõò:?ä,Ëôú(憻$5én®2m¡wçx/y%æžÊ_+“hñUO^74Ÿ1fp}Nê×úŒÅHç˜_%;Ÿso°#n; 0ªÑ,‰S­!5?¡¨Rk?sÜVЍ˜i‹œ?» J™pÛR•ŒÛ©3n$–J(nvÙrhv~U÷ñC¬Î7ÜLÅÓ ‹¯›"àMa,ï”{ؽaçŒÍxf^ÑÕ-ŠG»èƒéÊÐŽÇUӱ»ô5´‘»ˆ¦Š^{­76þæÛþÁ ‘™.¼"å ò¢w.éЭâ4 —£Êæ»ò8ŒÐéEiEˆô§S£\UŽsýé)Ó-#Ë÷›Ó’Ü-Mlk‚úNîë?8Låä“Ú®ÑÄH¶‡²R!ö ^|L¾n¦M¦6KSÌ[2˲³‹/Ý }'Q§'6,ÑWÑ~;É{¤{ÚLB'³ó¨ÁuËvø2²ŸRn]¤:;4Ý=„]e7cy5r}6fú¸Õˆª—EtŽnx¯ÀÑLHYšm²³¡-Á;гøu²Tp¦ºËM-Š©¢%™ÌntŽä*»ÛÐh7•?õ™Ž»ÎU¶èáäeD ·*þ Ÿ*{ö\mN }9ð5UPB­^ ÔµG·å>G8á:òq$샙I†Ôó›ƒ[y=Ëò¼ÁôeK/ §GÂ+«móN_Ëãý½Il7j%TOs}…µ]ËÍLZäd„OÊ`}8Àh²òîü²P[ùao‰&™ ¼Ë¾ÖcsÒsµ×ËE~I§wðã©´x{oßì4 .‘6ÔæŒ“ZL–›ŸáÓ>é Þ­Oˆw½ÎuâúÇ‹þ)±¬gƒ.¤È3Ž“`éÏMŠ…ŒÂD¨¢òlÔ¯Šu›îúŠÒGåY¯áõ#è ²+ÉTSGÙ¿¯o÷•±°¯‘ÑŽG…>†¥T§&sÕe’ÇÐ SËþö¤¾¸q䉧øék,ÅÜͯ¦OÑ+¯[6ÚVSÈ—š.h»ÿ~þŒ\Ã’± ‰¤x9wé‘ï]ãcø‹â‡’›E¼Â9`y¯pl¬£µvGþh¤Þ¢í–¼Û)R¥"ÑL@×<[¸gl­¿.TVXþÜEªúcÃQ`}bÞ9”ŒÕª› §t­JÄb?b¿‰eϵÆú4Œk«®,Ž¡¿öþÃëüú õò䥮H[×®í±Bþ¾½T.>£ü©TȆìÕêÊÜÆ‹ ·êJ?1„P‘DŠ•\T7ÐPo8M³++=½yEþÁ ¥šN~§–ш©JðL62{Íz©i€bRÁþX_чv#$^Åy °e——<[„z ïRÖ¢ý:è8á2_·†äx˜²cgæµYw–n­hσû-2ù• Ð9¿´EØKŽð¶3ƒÅm>¹.T„ "ô׎‹V¨*& ¬ÝV‰2èz›kµ '½z÷‡qåMôêp£»”ã°(’UÂÂÉÞgUàåºè³ùUµš¨ci«ä‘çŽùô7n’?Kà¦x1ûa?Æy¼¸Ýrg‚ZP8¶hyº¹trÛ€ýl‰f›¦z§•¡7Œ[;œ‹a’©–mVRÜnŸ c«PY“™ç{#K´š Ûž lÎíú¡cÓ·ÚÇ¢R|ÁßûE“¿Ÿ“®Ûãvè× ‰™Ê ½EÏžè:8Œ¦ÙtjÅí©pçU—¦oZ;Ãå˜PüÕ«X«8DëOB.¾õt—Õ8— ¯ç{ï÷Èû,ÁU‡l§oØé3ò¨»¥Ã<õ'2`«%œ K'ãMb9ØðÏ|¨à”iÌKqVoÉoEPÄR<Øšj#ô©ç$JRjIX/½_ çˆÜã:—…â÷4ÉòØ‘6¨©‡½iaI5k¹”ñüä ¡AE½.Í]÷äM±õ™´lûîíKUœÍTëH>«SãvÕß·^•£åg¶Zª˜÷þxC_0øG“ƒHëÇ=¨=¦ˆt‹–1¤É;êõW¤÷&ïà}o^YãÄV£ ¡ê2«ÔXm.†ÈE¼Ñ·øÕ)òòãÔ„ælCÜYhf›Ï‰·x»Ì&y+šo°W¹¿Vê©ä(û‘wr‹µ?¦4ué"—Üç8-Ÿ]NWM±µfÔ:W9²¤2öí9 "žy¿2˜ç 5[w¦â¶R1‰Õ5}*]o(¥=BS½1íA«o'o˜¦ÇUå\“Év+þÎHÖÎûmlªd³2³½$ ˜Zªfï• 5Æt6¦ÒÄb-í­ k&׳å'=Õ^O^£e?±ó_Ðv¦»Þµ¶“?îй8?ã4„½°ÒxJµõš¬6æ¢#çê€hÙÊ1œ4¦uÿ¦‚ChòÜš‡Wñ7ZÖwÂWqZòÇÞ—ÑWc¤«W€0ã ™ŸÈ¯(ñãoßóÖŠ‡ ‰Ý3ª[PrÓÞ].Õ²üÔè­Á*ÿŽ—£­¨&âc½mBÈ0c¾ýÆiçs×—Oˆµœ¢öóz(å/a2¨a³½ý?§( endstream endobj 4081 0 obj << /Length1 2321 /Length2 13942 /Length3 0 /Length 15319 /Filter /FlateDecode >> stream xÚ÷Pœ[Ó ãî\w—à\Ü`°Aw—àw‡àÁ- Ü!@p AïyOÎùþ¿êÞ¢ fµ¬Ý«»÷ó tÔjš¬`3 ,ØÂÊÉÆ!RÖÒppp³qpp¡ÑÑi vÀ¿Íhtï€Î. °ƒÐ¿¤œ¦¨MÚS;\íœÜN>!N~!‡àÿÁÎBiS7@™  vº ÑI=AVÖè1ÿû`0gp ò³ü™°:ƒÌMʦk =ôDsS;€&Ø„xþ‡‚AÄqbgwwwg3µwa;[½fd¸ƒ Ö   ÐÙ høC0@ÅÔø—264:€–5Èå/»&Øânê @ v s ƒ 4ÃÕÁè €ДW¨:þ Vú+€ðwoœlœÿÐýýÈáÏdSss°½£©ƒ'ÈÁ ` ²Te•Ø €©ƒÅ¦v.`h¾©›)ÈÎÔ ðgå¦Y u€)Tàßò\ÌAŽ6ÝÙÿ vYÆÁB lot€¸ ýQŸ4Èhm»'û_“µu»;xÿ ,A–ˆ°pudërrÊKÿ5¡ý¶Y!^nNÐ ô0·fÿƒ^ËÓø§óO3T¯·#Ø` ôY¡м]LÝ€ˆ³+Ð×ûߎÿ"4NN€È0ZÐ~³CÍ@Ë¿0tøÎ €>t÷8üüóɺ^`;ÏßáΗ]UMRB[“ù/Åÿø$%ÁoV>+77€—‡ À'(ðý/É?òÿ'ýO«š)èïÒ8~óÉ;X‚‚)€¶î*Üþ^ †¿/ #à¿'¨€¡› 0ü^|^sè/ÎÿÏëÿgÊÿ¿­ÿƒåÿmñÿoA²®vvºþôÿÿ¸MíAvž@Ù½Ê`èÕpø¿¡ÚÀ¿.²2Ðäjÿ½òSèåp°²û§ YÐB 1·þs]þ7(»È¨výñ¤°rrpüô¶™ÛBŸ&.ÐQýéB/ÓO”q0[üqë¸xù¦ÎΦžhÐåââåxsB¯§ÐãϽ°³9€!ÐT/ÀìŒöÇ@ùxì˜þB|vÉ߈À.õ Ø¥ÿAüvÙ߈À.÷qØå#(§ÒoeQù @YÔ~#hžæoÄ`×ú u¾ý œïþA‚Ð:MÿAœ\P§©‹9ÚU; àï(èÉf¿‘ €ÝüÄ õ™ƒí CøŸ…‡ç‹½ý¿x¡Óa·ø„jþ rØ-B¥X‚Ü~ûyÿpƒ]ÿ• ±ú„hýûx¨\kOGk Ã¿" 6п Tµí¿ T‚Ý¿ TŸýoÈ ­ý7/4Õº^ÿòCÅ€ŸMÿÇ ­Þñ·Jæ}‘8Ø-!¿­œ[ÿºðÿ˜¡Óp„^sð¿Z}²;ý4ÂÉ þ‡Ž[ðoëé89¡}úW9¡Mqù- šä´ýw–¼ÐèöŸ’ ò]ìL]¬ÿE­á÷!Ч;ÄÚø¯ñA%CÜÁÿJ€r¸þ–­âÏ7©‹9Øùß}ƒÅí_Zžû¿Jêñ/=Õó_Ús¯ß5C™¼€ÎUðŸ'€¹«3´é?ÑÐÇÃÿðŸ/a Ðh޶86±ùÒq[+AæÎºýMtšn[;‘Õ{ѹÓõ 9™±&+hÍùZ"y¨geS†áJ|‰êÑû°µ9¼-I½ýÞçÁ8Acr»ma‚ðëxÑ¡D}?*9«–øŽÏ£“Ï»@[øVØ.º<'W,µü[÷>9úþË£asÛê;5|Šè§XcÞF–ÎÐå›eÏÓ AX)P˜ðN=°g®®§ñrÇŸ©˜Ñ|b¸‹½õÖ¹bÍz­Vjq¹|!¡%Ñ#¦€¿Â¤÷–ÜKQ š÷.+‰^Ïá`dƒYpè.8•´0ºf/¦æb•›gö;/1›„ᯨÜÒÛ?YÀ¸À]¥mÐy›O¹UZîÇ&ÔêÌOÞ²|Ð=¬ âx¨ô©ëz·n˜YU¢ÛB¤U-ÛÊéø ˆdc½æQ$,ÉüШÓJ¿’Ëèþ”އv_õÙTþ̶¸Dâ'Û~w(ظ0Ta‘n¸xT.î’ ïHÝ»<Ÿ*Üõ«‹ùaý`^¦œéÏøÀd_œÓ=•PÀÃL¦-€£zÛ,cþA†©êÁ^-áêÅ0²[eûÛÂiÁñÛë¥â—i†;Ô˜©š¾ì¦©¥íE„û4ƒ×TS<2ïD0_§«g‘6M#ç¬l_wê Ž%QÓÙ¿Ÿ£…јœ6#šM›´ê¿@Árõ(›~§l}4£DË­—¶|L0µèÙŽÅ›UIÀÒ¦™à±ÛÆ„t,S"‚P§û<½_jÞ~öqÌL Æ™ÖDöËÊ÷Röºì;çëËãŽÐÕÛÀ$!É« ømyZ¿TÑ™„‚†ƒ€ñˆàæ‚Ø4ÂÅ‚ÛÁ¬Á.ê­ƒ”OÝuê_4™Œ•¾yné [1uR¿”–µ ð¼Ät“ekóè¡×^ ß2TÔŸÚÿ\ugsY…¼r†ùiM+‹ÕÚ¦%máK"ŠÐܧƒQ3óþé²_~V”¶ÄþF…z)†ßÊ裹¹­¢Ï¸wÜí¹n¾Ä:JFgÉ bE ùÅ9UÊb­ïEºŠ¬ÜÊˈŽ3M*L°U鹇M™Ÿ pâÎ éÖͱqâØ(J¸Ä·ŸöµÇÞ˜|Ó0šñ¤’RçAñlˆý>ˆµÑ4@ïMâwªn%‹6ARìf÷I-ÿgKymÁh÷´aànŸ¨œ§;š‡¡[QnR!ý].Xвy ¤ÞáØÐÓÿ}ÒÙ^}Æ„Bh?" ¿l0öå-2ž$ŒëGT!—ý]ŠðªôOþí䎸lWÛZÈ‘í¡pÞæÎYì§fGQ^–®£žW-ß¿"³+>Z/ùå\¯ +[¦«^›2¤z%§¼·ô¢~ùX궪çÚ±£·Có®÷­ÌPî{Õí#ë%,9Œx»?Ò&`ްiغ7•gNC×8ÀíªSKy.ù,¬Ó!àvRd~a>±‰Îë7~á?#ºf5²I„-ø¡ÿ“`‰Ô*2¶Vð=N$wÆBoèW"éònÒÄ_‘¨ætu- éËž5 R¢å^ˆމp§ô!·ôôÃ寃Þíôs—Ù§?W uf‹j;–D0oÚÍÅu;̇Sq[啽äÿ*4¬HÜ-Þ¨æ7Åzä*>]'ýó™‹fy¢ð“‡0Z°Buå8fõ+ǸTØs´6O±Ñ§8#©¡+¼ó_ò˜M´ñoätó Ó&¤˜!(ØûËDJY6t–•Yßà=ö4‘2‘—¢VW>—p< ‹æØ ×nõä)OÊ¿¤öiÐPí¿~¯k¿ü(Ÿl$4üBÕ§Ë•ÍèǤ î®ëi–»™ÉѤ`ïëOE·ßQ,B1jûN9Ž//tâKN‡(¯sô¿A.V×ñ)‡\÷¨ŒèJÎM(^]¡qhùçc È{£R…òÙˆæ“ÜÁºG- uw-E¢´ôó‡‘ܦ=~F_>Âïÿµ$ä}WBPŽ}•Û.f÷¦¡#ñ–¼÷ð&M㥨´$—ùñ½ú³4d}×kNÐaÄ3_2”²¿¹ aFÝ≎@x~Í’ç8O[ îAÿèCù³¯ŒçÞI´™dÐz†HAæDOTÝÚÎlV`·¯«×^OöU/.¬3+a®iÞžëìE>Éåº~¯ôž0@DçjÅÄtš#Ž2rHÞÚp®VÅÐs“àõ¼ÑüðìøbƒžX’í³#TñÊËY9óTÙìkJÝpŒ/J—DZÉ7üûéRäÆÃ¸G+™Á[Cô†²öÎ…]\#«énØdaE@q/^ñÚ”WN´'¦¿|”kTk^]6âÑWN18n ü†[ {U‘°ëiÆTÔ?°9Qìh=›†>°lò²dKì9goûÁ#KDµ•QUPT¼¼†õA‚ÿþ‚¦o<ñü®OO‹{'.½Ç[ €x½›}cl rkbs,£2¿ŠT0°æq³¿6‚“bZb¼~ÚçƒSË Bñ£/ÕY§,l£ËyÌ-¾¢Ñéžÿàå÷ôQ2¹PêÉô(,G£$|X|‘‡´¯Òy>äôŽŸîáVC†RE‰O-°÷:EW£¸l¤·ŸÝöSª.V8ѾšÞ"iˆ9 J—žË¢qŽw?™ãB«ˆRØ•¤‚úµÚâÈ®¸ÖwÂöå‡á[+¼q…õ+èD(k;N*ù³5U ž—s¼\û uÜ)kB.±‚™ƒº“õèrä-ô†U;0`—³îªíø]®¹mã=ü âG½EŸžpFAAZ¾²ãâÒ;1@ˆÞE½ƒÂ"·kàÌÊòňdpÏy¹Ë?+àZ©™`]zág†‰l³[ÄGí~êxÍGØ›*¤Ü€,æeÀÚÛØHwDÞGÌú[ÎÙEîUÝ^IŸÊ@é%h–?6R ->p]GzŸ|˜Îwuiied`ëWÉ<¶@j¥(Bw¨›èìÖ5†Øl(Ø­V•­¹,Îå#º‰«QöŸïðshWNã­}¶,꟬{È(‘.xCJ³©% ê’²¬E¯nIÞ õÊŠb}éLôQ|\Ž3¦­6MÁhZ[ø(øEß_$À Í¬m¸•6’ç+ê(¬öF• ÷]cÐ L§NÇîZÍb±—» ÇUÍK뚯mè•Îp éx?ðµ¥^dYaIªuÔŽ#@/ô‘dF¢v'\AžnâŽÝ©ß¢à"¦Š‘±Y †9ž¿ÿÚ¢;U±;[›—ÀÔŽÞ÷÷)Sü¢ö ‡G‚=ç< ŽU{ã[vröqÆÔ žQê*Þ–<«`á\LžZ>ÉPHR¢ü©îægª ,Uå:Þ1çç êp ø\«±‰ß–›eÂã‚ Ù72”Í:”Ò4¿¦± óBaíhé1ñÖçÝ:Ùt_ûâåÕ™½½—'ÖôNââ_=ƒ/Ÿ:Bƕ̴ ùþ ­d7ÏæGÓ7è¹É=V%öbåָǎÚYlÖÓOMMH¢ŸÚ²–~ºñ©•P_““z2xÕbb3¼ÉÕzí- Î{èŠ0AËñغÖþAVÍÁiøîJ?—yÙmQVl½IF^X’TŸg {î¤Röfš®¹íЧ¢¢È D Ô«^_óR%X%)Ÿ²º~«`ºÝ *A¶è„óF±Ì â Øv`ä§ æ€ Y¬^µ©ÀëŸò<,¾/óŸ.áù²tk¢Qû3ùw³]a &¥¹¥A¶'øÃn.(ˆôIT› {¨ê4n+t›ÂñÃ†Ž®R4³4g>òÎæØ1¿Æ‹í€©k±Ãæ«Ù~[­Ûö³üUUÙ/ãG:䟢µ†FB¶\€~b³.Dî©On®pOÁqq©¶ÔaÕ»ÙwW\£ïƒÅÕ˜`ˆðÝ&}gx½¸í×2ÎÙ¿^•ÕÔWæ’4cG^øuíOÈYžÂÉ}LHâùÄR\õþ@´„÷þ–.©ÕpK&ûM”¥ÃÐr€Çû¯ä çw¹JìT¯Zü(lYÍ›g@Ä›ñÎÒøšðp2Ó)9ßíPâ½lçOùh~7Œ†"´Éˆ§5\®Ed"n"çó*jø>ƒr¤¶E£èlÈjºU_'§)U…ËÚ;%5²È«ÊÁ•ûïj{O5ŸvDú‚Ò„MûÕ)9£]½8"ûè(4†Ü`¬„¼«Ý®l+úÉN&¶ü"FŒB‘#¿ˆoÿ¨{Ý<Û°@Zíqº˜Ì ¢×Ñ=gm¯âgª ;çøé‘Ä8*s‘êr¶2¥áäí3Ô·¬·cC]ßÓ‹Ù)•7‹µ"ŒŸuq_׊¡¯(/Ñmyd”}SEùÄhå+hÁôëá½™oË"]¨Îk@¼ßèîA^³Ø¢%wfclJ¶k¸ÎOô0þDD)¡^¥=ÉÍŠœÁ`W¶yˆIµ3é¨:oÆ*›²;iÈ–B^­‘­&ýâƒÈLݦô½êº4bK¦¡tOu"•(ûvú`Á¬«nÅœ«ªÚ"“¹õ!Ù`+uãay´/îÔjÚÛš+ŒÒ¬äÈéíûÚ -^=ûUưÁèó&<¥^¼ËæŠ&ßhÂño¸&Ç…`y{da&/Ñ ½Ô;}æÿh—…î‰ÙÛdä£~Ÿ“_«4aÞEO2ñÆ!‘qu¼lø× 5¸—xó‹ïV¦üm›òø%JÁ@²öì)63«^åá‹Å÷ž–ùeön3™†Ô'a 2“%Ü@pÉá‡(í7•xµÇëºð«¾D¯ÔTLÚ4]%- iY²Î&O+]Ïl]4‹Þ¹cÛ×sØ“½CÁ™ÙFM± LGÐRu€òÍ+ÓèŒo’_:ulKÇZr Û»ŠQôådgÄíØ;¼1Ù”•˜ÇµŸÊh#A›[©J2MüY³}bcé0úva9=ºW*'³Õ´Ò̽²Û·Ó sî¶¼2¿¶¤æD.C«¢fd¼dñkÏ­®åº”[+FJðÔåSÖ‰Uâ>ÈéÃw™*I7ýÜ´gDUH¤]CcñeƒEYÞ´óf*; «_†mCä³f6(ëWw*þl:#þ,scú(ÝD?‚®‰0j\jT5/u¸"XI³=Ue–2ñÚZÍzKút©I#!˜õsHu+©æùþÎûÝv1ÔÀó’íÙ"M{ª(ê©,Ãã„è!nã*DäŸôá;&C4’Ȧ;‰=¼sT=/cI,ÜÛ÷µétí"?û ±7½®Ö+ÎÈv{«¼Ìóž:öã÷¼µBÃO³&Ñl-ÀX7è•Ð`0‘î©KÑ+º ¹Ú Ï(4gøàðÍþÓ:GÈÌÉêXY}û¼Fï6<øÆX¾¢„±~`UIƒxƒ)¶Ž¬Q½ÇjH§Æ5ãËD"ÍG:ãørŠx¥o!E4\³vÈ®„V•àE!EÈÚ‘ +¡zFÂ[~Ý‘SÞ 0.Ze2íÆM‰¦$k]€ëë&åmÛšîLn¯Œ,´(ÅäÂz¿ù- tWæÎN3.ìd©}N›j„R½ÉA‹kùYcª}‘ïv`Ïö0V ¹ü…Ý\<Ç[¨Ë‚&@â®™ØmüÖPÍW ù”‰ÙÖcXø2ß6€o%l Ëc(Ž®mÓH‡kR)ÚÊ0?ñ–ì"tô}Msl‰²µÇÍV®ýO† ï\²ó «û‚ £¹B¢ÁGÔ¾¢™ÄŸãº6†# ÛÁmÒ®#öüo+m1of>À;+¼r¯”<)„Tw’•¤úçX©®š¨Ö寙Ï\¶&aTd)2]°§áÞ7àT· ¤wXÅÔ»ápÛ’Lh¾¤ÔVMõßRO04ÄÿòN„µJhfäó= Ð‰¬ð MŸÑøè<½~žÏ~œËèyR]´‰ê îþ•ó4Â6À^†‚dJÖY‰aºå"4ÄT§'+£WÞ®±u;ýàþµ“p^L¯ZÅ>Hê­XÃÝæCÂ\\²°]Àsa#ÑÒ7ì0Ã2/×Ch5gÉPÉ´¾ Ÿ0ØÙœ%dÆÐ)wøRâ°ÏªJFzMÆÔ¥‰$Æ?NP¼šs(áC@V-{”›Ú¤Ý@‘K¼¤ÒWoßpQ‘æK³ªQI.óˆëtMò-4EAÙÒmÑ94¢ÎOÁ :‡þêÂ]rí¤£QëmsE‹pDÜ"V¨Å~{»]aŸQÄuî ‘>K¿ÏÖYà\Ö2ÏK-íOuð¬­÷.%9d6VþèÝj~ÔèÌ_éDÒ}òjïñxS'øÎ{Bƒ\0ñ†”L”»Úk¹‘Ooû¥Ð·ú¤œ¯,¦øíãaóù½ïà©ùhH{¥A®Ä¡éó‘ßÈ’’Mh`®ãŽÜбGTÂ^"³§…{–jPOºSGßEoM>¶J~GÀ3;Uw˜.Ÿ\}¶K½w½,løåÁ¿£WªŽž2:ãê›[~T6²Ã:KpÌ|Cƒ£ºj 6««ŸÕ+•ŠŠŸòØÕį®K&×÷ÓE^3›šä¦ß¦›4Y! £s`$õE[É ƒDP½É9†¡.’²A’°üóØB|vÈ}Ýy‘V,p‡u¾Vn9™«%†Úà“çl$ÍäV§*L¼÷ÓÖÃ4+ÿQõë]3¹814E\j¤¦²”ødÀ ·/¸¼\4ÍF”È¿u&b¦Æ;<Á`«3Êà9+  <ê ÌxÚ¬­Â2‘R7 ½Š¡J÷6Æ£FÆ¥Éä9Ä“¿ÌhG⥇ûPA» ûàÚZwó Ž„~ÓéÔKS+kA<–õkcÖXöXsgKQð±§±pšÎñ8oÒ®$VÀçäé“Iƒ`tk»q¿>«¬s™ âÕ°Ù÷f–¬¨B®ïYvê‘çW"¹ÅKß\>wØûœ3<Í)!pÓ±ÎòSÄŒk”—:Kg,´`'Å4šh¡õE'¾…{ß®’šëÆ–X"$áAJ3b~¾¶$G-Òªc¥;[‹™âímQEÍ9q`Úç DȹJYþÎG£*)ÿcŸÒ­: ò ÛûÞÏ,¥ó7[»»Æ-¯ÃÒ|¾OXÓŠùi<𤷆tí­Š¢Y4TC.¤wçåL;~¨÷®×̆}b»¤èŽt5?Â}Åȃ-)O½C!ë/ª¯xù­:n~¥<Æœt$æešÁHÒÌû”W§™uÑÑgo¹uO”ï!mïòy±ö•º#faMà f¢a¿ºZhXtÓ¸ ©Oé[ܹc¤n@‰©*ÈEש+ÈOÌ“Ø ‹d¥žÖ¬Ú0m ÏÌæ.éûí,â³£C¤Úéø5ÑŠ%£R 4,\oæ—&Ê Ê–_AÂöûe[Žq»&s^ÉÙPé¢èó ÝÚÉ…+ÿÊ4Þ¥ž8ÿ±ÄsdÎw<â~xJíx2è9ÿ‹ÄGûÅ};?à`úcm¢ó”içðé 3 Ûñ&µÕ´XwörÕžü+¹;«)9ÃFœë4ŒGè¿%Ú—L2|ˆ¹"Íò4ë;årk8“Òp‡ÇÏ]‹¤“Ô¾·žKCœ$Ó6i“ì‡<~¶¢ÆêOÔ±rHÕ o ½™²]×Paw 1wh˜çè‡þ xŲ„Ëât¿4›Éõ¾9¥Š‘w¡×Ì ]ðuæÇfŽPÓòNk³ÀsÓÖ4:¬Ää’3‘ƒDÖkó¯eÆ›Iù¿|Vºbbߟ&–Mî’”Õvlƽþù±M% Gpf#@7l¶¹ Nz Ør Öàö³öµ/æà(øÞ' $âQAd{£Êdò¾Ãl MLý<³¼ñtMQÊ×7IuCˆ&}B^/—â®»ƒÍ¬Ê¿M\“¦óˆ[O[® xö4ô<d„õŸœmÌ2/Õ¶L›È6KÒš+k• †XØU¸¾UÛgA'ŠÍ /±lž<ˆªcß[*ïûQ©´c*^Öí╃#çx”OçÈ<à^ònÒ@ ”­;}i£ìÝæóeë[üª[8KrzÀõ £Ÿ£“Á6·%Kcq\VgSd[× *5j™ëÉÆ1ë’Xé ÞwCÇi©˜&‰,ÄçB¸måaBŸ{7¼)_çÀÀ£ìé?ì÷_•ÚÅ."Z¼µÓÌÚÙsú4§ &œðŽ“lû4òk úB•—7®3#rý'/BòÀ®^Ó¬GãS›3ß6ˆÐx¤X~úÔžn}õNJr|{𢾠úŒÞ£9QlgöÃè##%Û\/$8{š)ÜÛWƒ™ z‚'±€Ý9•óDçr½ïÊ2Y‰IhQWqÖ-DQàÌŸC1«éxóA˜˜¡#ÅTéšÂúñ<ªÔÑŠÖï_á«VY:õ&pmJÄ÷òH ¢…[lëÕ¸>ämêËÝÖRÏ_ ÍJLoF¾)~ôÇ\FöÔ æ~È’ÊÒm¿ˆFÑUZÒpª7ú’”s·£úö]‹Sä~1fh-øü*ݧªøãµÒ5Áã§õŠÄy6®´x·yÅt„Æ+õøþ=Qu wê™› ä Ÿvókñ¾Q²Dò—ôŸv?j<`æ?)×V<¾àÃ):@Bzj(¸®k°.iD~)Êß0·:¼–ý=_ôio-ªÇpª1¡ª5lå}@o¹?£BOˆZH)=Ý / +Û_zñoÅóQ”}·fyß×½÷I0˜Ñyž¦UT˜Ðp=§dìó}(‰>³.¼|—Š&'Ò_ä±3·¤+€4»CÇÇÅÈ@¸‰A×G÷z‡ƒTÜ›F¡A®îl©~üŸ:—©$ò^ÌzÉq£à¯+ Ž$-J‚Äsác­T²çø#®ÃEaš¿£ÐÚÇÙ¤õm“§|Ø äøìøHˆÿå-)¹Å­ŠX©l<¡Ä}ù¬õgJF(dÃRa–u“Ç äŽØuÕ—3èð¦ NŸÎó|?ˆŒZ(]ê!{Xˆò&1 ˜»­.= ºaô$pF<²º“ÃÀéìZ{rÍM5yVƒËVQEõQšøòA„ó,.„G4ÒeÖJu0€£‚£Ç{ošÏIÝþú’Òþ¬†7`Õ1L#æö|ÓtEé*:žVºlÔ±ã*³}J¥vÖ†ýiPk-§`yTy7Yì£ÒXUÉíÛÒK+M4oÕèÃB}”?2øÑm®së¨z—–¼òB§ ß2Œ›Îéñ,)@ëe3šƒVïC*ûYëלÀ1í*Kâ ¨fW‚êõv›u£8ÂÀvæoºÎgJS£þò3ëìV°šÝ¬2™þŸŒ³’•—v«¢W!Óc˜74©ª¬6•v÷bFŽZÉqùAÄÃa*Ú» g¿|â8´ ÆÇÙT­DCèLêjѤÖUr¤®é/Õí¨ö³{Kw EÊûñÂè³Æ½CJß4—¨StÅç¿€=¶^1Õ~>M98´{v—о ÌÑêlS¦£ìå÷mùäYøíB®ö.ßhâæk½5ÿFüs®v E+òè§"e)Að¯m„a¯ 63Ü8?÷~Íp=îA˜J¶Ò°¯ˆ—å|ÙûŽ—¨*`ý,lå¨Òƒ_áÉ–ÉŠ‚ËÒ2äqò(åj,S5"Ÿø H§)ve·&Q£*pÆ:«Ú>äà_ §}L|ω¡]òİh0Ñ6TÚêÞ‰#Ÿ€­&Iz-[ÑMîiZUB>ôÍÙ=wøº1Æ?×ø¾¹Îåò!ðù¶ÆÎz ¢Ü€™2Ë®°Ìý¢$Ö… D²ì1Nøh[éOã,¬ ¸ØáÙÞ`«¢Õ`˜KY–K/¤U{§pÈ–ÈLÔ|'³ÞÿþËÿF æûÁ3¨Œ`vJè~ÍÐõB ™ælë /I '‹¡6®#®¬rW+ѱ•œ{Ïü”µ¸âýÀªDËjrW;ÿÍ$·Ë ©­~"ðEl6ÀœT¹uÝØA$áòhã½8òç¹\+L„¶À’-ó÷‰ˆ )´Æ¾èn«‚ÃEÖBØ»âQ”Œä[~£‹ó¸ûp7‡CIŠÕ/RýÑøŠÕ1EfÏÔqæ+ŠjeHλT2ÙOG†~^¸5Øèá½þùAÇþ,¤þÎ×"ŒØqWF$}//œëÊG °¯è* _ù½3kók¨@d­y.ɳMnχhü$a͵®ÑÑÁ;C€0šc†h«¡è= 8Œ #^â„,£h}ã1¤o6}áy'³Û:CRCêÓÍÎøÊ ZNŽØ±2ŽçŠ7foú*ã(1ü¤Cü‘ª¥ËM+ \£1±xY¿ùò?bÉ}ß–È诋”®Îãd‰„G§TÊD~ö,q°cDÊÑ;PÊÍFÐ fž^CÑØGPg]£Ð2YØ1eؤÛ>?£^'N£Ž,¬‡‹}ÑðÖ£‘a³D(Åÿ‡U?ÐäáIßÁ.݈c± ö”CǬ4ì1‘@‚Õ€q“@RÝp¨ßöbÈpÄ-#Ò¦ERïÚ© úk!G…8ÝlEôþݶYè«Äœt*£3“kùpLy~Yöæ8˜ÖÄ*½óÂåUT”Ø*}ùN ³†Ý~JB58F„@1ÞL1ö=I9k‹—|!ý»9ŒNG‡ rEÞëæîÇGÄÄskÒs½KàÊÐQnb«°(+ÃáÕÚÃ/2S¶*"¹Ð†ðjª-{òÑÝ TZù ™ÌUÀýW¤i7Þk—vø}uþx×R±Åtå!ë!x•âóRãCQO"^xdý8œ¡úhH¨0?Zb{8ÀôqW®b‹û¾Ð4-íºïëÙ›Z3 £SÔ“»DDÒ—Û~¼;Ùe'ÿØÞ„57zYËnÑÇ´ ¡Ù_½Ï `7Τ¥¡ˆV¢w·|½ZÇÒT€]>Ë.“ŽýóÁ2«ÒÆÙmbõb+:VÐËÊ—ëûqæ ]ÿüªŽˆg2\’öNø#WŸ[Ì.Ap9g.ÞPl’Õl´R’R/áÏTQµÔcqÖœWZËË;T)µbu`3 R½O]Ô¬¾\Ë<&ÏzžÙ•ª×Z¾'¿ÓLœˆ0cC5V´Rée¼ñü‡FkÉ¿†ðî;U=QH+"Íx îëý.À€/ˆËWGÇú18§y¦:Os:’ñ#„mL%ÞsŠ <èÝax©uîÚ²–µÄ1‡j æ&/Éé ˜A¯ÿ÷ž_#Á[†ÇŠT…þ½3ïšA-5/¥Ð #yá¶„ôP‡FŸÖ£œïg–÷2÷ÇhÈæœ_sbì…Û²¾ë*XÒý çúz¾q¹È5¸”ÈŽ§QX)Ø€Íaú2@“ƒþ£"v®ºÖ‚LC²_@9E±@œ%J”>~?db1¶…ÛÇJwÄð˜ð•Ó[axÍ:Oõu|—ÿÕ×Û´ª¿ ·'§‹²Óæ²Äßq•OŒÙ›ÄaÆ1{înóYGsŽLÑ0ìüÙ…kÓ,¡Þ$¸ù'…iÃðc+ýá²s¾ ¤ Ÿà_Ÿ>‹­ôrÕ-™ù,‡ˆöúª×†¨3oÖØvQßM£Õii0z &v|JxÐÓi(ö ¯1Õ…Ó-(0E±Õr§WÍšpº`é’ g±aäêY@òšà rrh²Õúà‚*apÒ¿Y&çÔÝØuRrÍ«\ÞI+0zcÚ.¥@lŒpÓ–÷ ”'Œœ®Êr“úÉ3EvŸÊs~ÝúºÒ«ˆ˜dSâˆ9àÌó¸ŸMöµde­!=ð¶[ÒsAüÀ“~†ÒFÌ…‘¥O«iPÞn²UL@ç@~tzQ+‰}š¬LÄ®1ÇOßÿJ¹SÅ›CBñ, ‰.ú\;™è²R7„çúÚ‚,´’ŸòG{s¤¹¢t¤Tœñ)½´l•Õ㬻£YËÛ”}_ô5ø®gxŽÇÓU«Œ1d¯“9½ù™NšÃë€f¡ùItŽ‹ˆåØ´ÞZHåþ/Í‹ñ0µtÖºÚÏÇÚÝ P±É›©w¥òÍK#yÑo‘Û¾d¢\ÞôȘ¦h2ÂÇX¢´YXkJ¶ìÐG ÄË–2 Yà¨ìn |,`ŠÝÇslz´®Lî?~ù±”EÂÁ¶È³@ùUúöÂ…um=îÔG/§žIò8@]ímíV¬ˆo•Oˆz!¥½£ ò5ʹòÕLß’š-‡ QùDò`öv ‘ Óp9¾¡Eî[‰ð:1¥ Œï™}–¿˜¦B™ÃɲÌÑ'.ß="†× Ü9Í Ï2á¸vë«ÿÌõ)Vã Ç¡úb÷–Úp—g>>êì7GÒ>_aìíg¾Uïñüíê4¸Ü—Ðb€Qª…© JI‘ÆÚþª4y´4š×ãsöõO)m\Üö •äE¶òÒë3½·¨~B1b"äì͵ÏùzõžvÒzD…#´¾B UÙ*`¡ª½õQf!ÀOrb‹È?#g®ˆ²8õÅÌJ§ö| þ¸&DëbѬ½‚º×£ý‘£>_S˜`fjÅCÜ5Z3êwfëÁž«Šf¢_ “ø$ŸY™½ÆgŠ“Iå{£ÄIxÐk[Jb¸$ÁC~»ÀjôWÁu­µC«ÅŒD²ª™Y…ã<âóËrÉì[Äé’ÅQ—ÛSÎ8™ã`vSº¡Ÿ î@†F’{»òn¢mf ú«,DCyíË×o_Ëd¥ ¹Dg<5ŽåÍÔ0 –Ã÷Há×.\ßø:… M±ÈK¿dï¼ÌÙùéÎåÝ¢ÝÍ#D`>3Ìöê€KºJ”tBØ FI_…W§3ˆ\ãwoê‘¡&þGXš5'WFö!ðw•îcBF•0+±³ ¦e4ÄãÍJßw¶ e鬸‘Ak,û3ž‡éoI¥l¾žZ0¯nkÙ0S#*tÍr:³ÒmI’~™*lmcÅT6ºp"0="^ùª9T¤Ã^VZÿ½Q!ÍS(…û#kWªM߇ì4–aY1s-ay;Ù8¤ae@ ×™Š2k6Þ“ïCq 1ú¼Â/Þ_áŸ2 t¹Ó?Íàæ-ÅO×<XŸßÄv™ÓË厭dÍ‚œÖ {äAt…9,žÃ=#ÊIõÏ]R•Û‡Öô¦:3×:d!YÓ„~`›7Í-—bZ_¤–BKBe×uÛ2Kî$Ý=‡h_{}¸p,åúàNI@€î;‡óêúÁà«¿ãU…0A5èÄÙël§| ‡ËR"èÃLKDZ#²ö¢˃¬e{Ú…ëÍË×÷.“Í3¥q†áiM±Ç/5Èi¢ÑàayFåUe¥a=·íèwq¬·iJ²‰r‡º1#Ëw)dÒÖ­ÐtJßs*ªu{å1¢Ê [tÁî¦~äóTƒî‰¥KI³°K6_b®nT,ôAV·´²(EP‚ÜY‹cïm†AhØõEcĦ6*Ž6Ÿ>IÁª v ·'9¬[…6ýÍŒ–’”¾,~,9ÿby¹!˜‰»× v+© ]^ 3”>–F‰â¬Ñ âÔoŸ¨}¥;4×zË·„ÃV•ßpÃw»š4´Õõ˜ï]’¢räPØÄÊŒÌuR®Îuõ-a‡Z¼IM3a6 ¶vÔ…ÙHVçÄÐzŒ#zž0ÚDv|‘ÈkrR–ÜœÂÕ§ Ã8^dNSí¨OP„ÍRÚð]•ìSÐ{uu[ãU†]ÜœJº™.Nð·#p2t…j¨´xvÕdxÉÂd5Óq#qç™”OÃÏœ‰›ƒb5AÏ–ò)ßuD2yê6õ;¯{†i¦ÖTÄœÀ×|œãIÒÌíÌ2 ˜Þ;9¦·¼®<‹Ý½XEÏ8}¹¤q.«©|5üêìíT@Í®;U,&ìñ%VëSåÍÖÒZyœp®þJý"?]ç(ÄK4¥•_]Þp£$©ÔA;d®©$ëgÑ–Ê7ÏÍ»9ùDËý€À\£í…uÑëΠõÆ÷qàš)â/Ô:ßÙÉe>j¾i0:r ¬°¤áóål£>BV”ÛŠ†ämDBžÝÆÁd[UXŒûŒÅ'ͳ‡}¼]°·™¡£/“Û¡àê@“ÑqS?Õû&л»‘éL½hRÇS&•`7ó§§iSqö”zío¶ß°½éÚVÁ ]>ÂÒCtµâbÀpTSÉi¬W¼K<áÓÛ'+Ìeb‡Ñ†ÙѼ<¥h8t4uõl¼KºIÍ`A#ï嚺@†oñ/£ ã=™,ìðµN–`͸=è 9Ëv/ºüGŸ9À™Þ4Üë +Í#Ùí/#­Þ’=e‚ðRêÛkÊ!/zð¯·Dƒç‡ê´Ä.úGÀŸ+¿§”N)Ìušév”¨EíJÌ ä¦Ì§fÓ*æ”wÇ“¯;Ï"CN@+¶‡e”%‚NÊo+ˆrßíp›¯ .û rYa½(¥àÏVK/"ÂÞ÷è§p·Á»ôxª>D å߸ñŽšÿ•Rs¢¯…ðk^`yüì:½ÿêŽÆ ~5g+ÒñYÄÙ÷ØàK·yõ",“eÈ0DÕ,~ºÇR¨Kˆ+—;Jh[Ü¡¾ÄëNGà¾!’îbª¬ÿøÙnÀ‡V×8&`P&(Ñ¿«H¾EAE²oŠ£w ¹a«5Ór”+\ê)T¸ÐÅ3c=Fq«Ý²—D/ÁåsôXeÜÆI+©Îùw„˜Ö™¬\çõåESq—Öµô|fíÝ|_IúÓØ¢)È/7 ‰úû2ó ²ÔK‰`è1Bà»ZçëÛ‡ˆ¦;7ü¾ÒõdÑ%ùÊ0ÙÊh¯Ø90³’}Ș …^[X®ë/’eŸ8õ@voŠL¤ƒÈÒ¾ŠžßL;}l¦ã-O¾íî|- ô _š—zº/¶­! –‚Í}UÃr˜Ã›¹¸ £® Š5:IEËw•.­ä8Î4w·Êê7´{Áî…#Ø•ŒFkÛ´¸ý¶áÅâóM±lª•¯èqìݸf¤Jœ.^T¬Qe[èZB¬3Ë)W€ËV¦]]®¦£.šPQxåÒ5™àÍ7l`=!ò©Êòl÷m åúò÷4|u“•|ÚäNfÒwV¿è~Ñ^¼”Žb/ÿBRþ¦£V—#Í [_hÃ@PH öÉÞÍÀÏL$åç5b+@9‚ý<—$º èv¢hû2Àˆ endstream endobj 3935 0 obj << /Type /ObjStm /N 100 /First 979 /Length 3590 /Filter /FlateDecode >> stream xÚí[[SÛJ~çWèñ¤¶Âh.šU¥R'@˜@Î9û lÚØ‘å\ί߾ȶl,ÇìnÕVªâqk¦§gúëËôÈDÇÚa cmGß>ˆ ~ÇtHÈØ#¡Y$L <òš(Кx\ #âñ‘zKÇQ ½q$¡ƒHI$LE8„YI„ l¤ˆëp N"³UÓ:p‘É6 œ§!ø%[xM=qài«N±BN¸ L;” ®êP·ï| ¡„ƒZR*KHip/^R…(Ä 4Z ,®àAŠòÔˆi‰}1HÑgÄ (‹ëÆ ð5bØ‘8#)±‹a×Ò8šR È3!,)#H‰ Q°ƒ ¤D.F v`CH±Òl™`•V£@QZ‹|và”C ¤8KìÀ+)Þ¡ ; C†* .Ø>ä> ”Ó°†Š%5ÎP(G|>PJ_ ”ÅQ0ÒaˆHÑWƒiÊ‘nà?Ê)yØCƒz  Yƒú¢2`$¤@€!ÍÁŒÆÓþìHFÔ§€…úÀá¼$Ê€£Å¸ðX‹¶Ê"å` 0€õ!îtF".àŸ…¥À¹hWà·žQÇõè4@A´Hë‚ÇBÌ>Ç8œK†  ,6“a$q¸« cRÞ‘»œž*Á´DÂ4éH‚C?Ã= ÓZĽTŤ¸G“0 £Rê(·~»èîœw»Ç@eúyœŽª´7ß±í ²4¯úë·ô[•棬ÈñqXôSü–½x±õêU .ñ¦èØ ~SÚ½^¿^*ɤ×KæÖ¥å—´\±ŽZ¹ÎYYôÒ´Ÿåw$þ¶bY£1,4ÝŽøTï#OïŠ*K*X`™D¿Râm’ xßI;Êa~Ò«j¥¾fÕ=~¿Ýëô~¿„m¦#|Ȉcïôb…¸ËQ½¯zɸº3e½d²Â ¸Ëz3qoÓò&-‹Ñ ™io\f[½üû°c·dR7ä)Y2Í{å÷‡E½vö/^v:',x]æö­uŠá0É õÓdÈ0ÕÏp¥ZŦž¤I°­â>> Ò! 9Åñ|ÙmfkNšÍ“ö1íõY­OÒ<é*ËûÅWÊuÉ Æ}F¨¸ÝHü̉–1™ZÛÎÉÞ‡p[/c‰˜åä¨+ÓlØO“õ °aËòoSò­¤Î‡ä×AÍŒ=_ÀhE9AzÖÇ Œãfƒ? µ›åII¢ ÁÓwQ“ªŽªµÙÛVê”)9ëßIzֲܽ›Î}´‡Nñð½>0Žò[bBÜë¹t쑌7§—´D™ÒR{Eo<—(³Ú) ]—ùÑ*ã|zHÖ1½—T ﮟ~cñ?äZ‚@ŽÇ‚œG½[oCÕôS-”¦Ó³û­Ú6uË=X³ÚXãsè¶Ï¸mXk¶P¬:ë·5qéHC_µ:΄Q)JIœ¥'òxf-[…ÐFf*¹4–•¡>D±ß¦*º±éùíóŠ1:Â-L)ÇÛÍqšA}‘´°9|ö²ž;åâ1íCjq»LÏÆx»LSûÏ­?•¶#øÖÞoǵðÁ=â×g£¢Eh já~Æ­rè|:¤Q¸t-~|èщÁg§ºÍÂç8TÛx?‘LÄݪђZhF5¹¦eñͱÆ—m­í£í‚¥‡[ç–{\Û\HÑÆjYÔ.wU*æ¼Ùvħ!¾ðÒ8ÓÓ¸1¸*×}4·–®-Î ÈkùȪéòðÁ°– E©$¬¶FƒnØz笪f2jSDóÜÌ¡c¹¯H¤1Ê 0Í-­Œž% rýjÿZ̺Í$j%¥~Ë~ã1œG¿Óñ$Ç»ºÇbÁ( 'Š…)墸Ø-y¥³1¶Ô#CÎ%¼fâ0ò!+ÛüÎq1ˆŒŸÅä\ÑÆŸ#ŒLLFq8ã[F¸3¤IH™EÖúÖa^ª³ÓØK|Ú³´ˆê„˜`†#7&PYæ3íY2¯ÀœÔÆ1ÊiöXI+…8ÝÂLiD˜éf±!}fO<:ëkÎÁ^Å‘$h_Ì×§0™ÎMz2ÛZC5"f_eÁ£„p`øøÈnGuK%Z ¥©OƶֹmqyG=F¡¿Åä™ÔSTH|#ËÝ,œ[fáE›t“SÇ1`”7x‘æ(,hç¤=¥mî[^ ÝQ×-÷°ê”›*í!¼iÌ:¬‚}HšŸF•ÇœIUµ¥ø[J-‡ç±dn˜WKg>jeÑÝ ÑeIx†ÇôH ¸¶Q˜möv²éFMáöÓmÍ8yÜлóˆò#™j: 0]óF|ˆ õƒ´Yû+âÿ‡™€NAúVx~=ª´g•üŒZ§…[ꬌ_ÚB©YÞ;YoÖÓ`ž=suÁíRVE¿"'Ÿ¿Ôz*¤¹ ƒi¥Àõ q4.U«U}›àÒ ÎgHƒŠS…ÄáŠBz”õ¬MDÕÖ4j!…xŒ2©ÂYTH¹ Ë ó!L5'q©c Õom ØóRTðë e¦J¶¶ ȸØzÜNÐ_¸ãûFµñ«Ç_7Ö_7Ö¥7Öi¬ƒ›!„‰FççVƒÃc± 1ª¬¢ófyë F¸)gO3½›Œƒ‹aàJ ²¸" ‘ÈËzEæfzÆeèÙ48¦Ôê®ÓÖ;# ´DØ©ÅgÖ ?ÑÓR±¡ýô=¦ÏCnz*cÒÐÓk>ë"0Ž ­C˜ˆS¿êŒjÚë³^l<ýÞâ‹ CÈcLrkýÌV¸N¦F‘±tGb;Ñ7ßmöÅÞ9«ÇØr[…æMyyÜD¸3|m¥Ù#ÄtÝ¢¿½zµ%ºßÒ@yµ—ŽzeöPå=ãÏšøðáºÛùøÎÉ® ¡Üà »»Å·àÏ—€ÄKE!)%ã?·ÄΨ—æÞ’·D'y8L³»{xôvKà*8öRâàQ• ²ÞN~7HQ¥Ã Èo‰ëzÄȸOÊ‹´ ~{b_¼‡â\\ˆâJ$â¦LzŸÒjÞVºÄ™¢'zÅ ÈE_¤âV܉{‘‰Ob †"…x¥‰JŒÅñU|ß_°Rø»þ%ç[¯_¯ÒñÇG;ûÒµTËQŠ4¢„“ƒoÔŸ¥¸¥±+:„Õ¡u$~oű8§â8ï ¿®¸$ ¯ÅGÄq XŸ&ØH8€w›Á¿/ã@Üã’À¼ÿþpŸæ Ló,OØÚñ”iN6!Š-ò–YÑŸÅçqQ¥4J¢=Fé9ʾ‰Ñ ݃}ªû2MEõµ˜YJü-þNËbÞ`íë\þ~xº;9jsk=ukã`0½Ê`/¥™˜Ì©†Å´lZŒ¡YPIo¢Ò›³Óî5«ÔâƒZNTRö™T²Ñf*E›¨töþè¸{H*ÅË5RñD#8žÉHf3Ü&ƒFçmng‰Faü¦yÂÆ­úlž&þ€D‘ ‡Q’÷E2ÂØ} ¤Þ•‰8ígƒA²_úô•Ó4“ûòiÎ_ŸÇÉ@¤ßzƒdˆÿA ´*ýk>åãá l6»Ë×ÎLéÆåÄÔ¿̲<0óŠì5ÌXÅ'䱞ӫý³ƒ=ò§¶˜7|îÄÞ?;Ek¹Ó8Ò ¸Ð98Ÿ-óç Ú×<”ÙBóA t€³;×Ç\¾Aà\KfquJ¥ž8ׇ¨öTÉ­6:®>ì^“;´äK=Í—Ú>VæÙ²Ë¤yT|PÀÏùÌSªµ¼k™mtt}<¸¼Þy–¸8þaÝ,•~ÒÙ¯áb; S‘N):ÙÉ,•ÏÛ`®ô›/¡çÿ̰nèF'绽ƒƒ½c´ÛmƒTáá©ñ÷" Ú¢RÎ!ŠSD•Rmˆ®8<÷Å3@pu~kÅlzæ4 #ÐÆyά^Q¦«ñÛè¤88øøöSÃÅE«CÖå!þ ¿‹âvÄÇurCû5nY€Îkç6Jçûoþ8:8Gí>¶ú¤>üoîîsÑL=ˆ½Ÿ+MØêI~׬‡fœ‹nÆPX@e”•½AÚ+¾—•fùx´ÂFÙÿâÝUçì@è¶_j¢iÎ1Ïuð+’Î!GZ‡AA·î/‹÷m·Qv=½è^ìýŽš¶¦Ù ÒOÊÿÁ*zÔË2´ÿxÈt• úébI .Ãä ÊèAé´¼®ëξþh«¶êëFƺ+Óvñ¸¬¤£ÑOÕÖˆî$ß= Æ£e…öÓËê5ó¦ÛèÜ9~µ{þž]­¥ÄÆ´‰ŨðwÐèé®Ö^aÏNz¡µX5 èê1 ‹!·Ñùñîlwçê‚ph©-mqF þÉ0¬QYr1Ã¥Ì$Â’f4-{§uûl•äçµ\öiÎê[ŽA@i|SÑ#v<»É(Å‘G¯lçLÊÿ5 EŠƒ¬UjA ?Nê©@ØUÖ¯îGü¿Öˆ¹[\æ Q? ¦ú7C‡d… endstream endobj 4083 0 obj << /Type /ObjStm /N 100 /First 966 /Length 2447 /Filter /FlateDecode >> stream xÚ­Z]O9}¿¿Âï«v•]¶¥ÑH$„$3 @2«}ÈNÐÒ(Yíþû=tßÛpÓ4/tußö9õi—Mgç¢8ñŽrt$¸ž\q‰ªãÈÅ žç"®„Škv5&|À8_j“ð‡8­‚Oìü‰.$*®I‚§R[ †ÕˆŸ<;ò¿ƒ˜È9;b/Ž"gW"9J\V%C¼S}jZzW£K ® „prì#¸½ÏŽC§#ÞbJ)‹cNP4€£@%èã8e^AùàXp€é¸Ù˜!•¦ã6zßÜgD †G àH°,2#Áðá´ ˆ‚À¨(™ð^NàÈ. Ãbm>*x–|n¾ âRÈà¨Òb³È“w‰+œà3¤X«£'ñ  )^†¸T¨94â×JÍ£!öP 6|FŒ` ÅÎÍxÆ Q²“(àˆ#’€#v"p¢€_sG‚Ã¥à8(µÂÙ ~ÎÁÃhÿåP:)¹Ü´‡$.3F@Ê.ÇZšT\nÚÇ–BðHW2\²‚\®ÜFÀh¤Mm#[ZÒ ݯ ’4¼\˜Ú¯0ºpmx„÷¢´÷(¸’¨½º¤,à@ðW 9€£tx¾Bª­ Z©H;HÜÒŽ›„¼ --šÑµER„·CB22ÂͶ¡DÊŠ[NV®=C†Šo#2ÒÑj’@ª /ƒ£äîWpTĈ+âTF¸ËhÙpZµúf<×TšXÃêÇW{çÿûëÊí~ýr·Ú;ûö¯»î¶= «½Ÿn¯Ú/nïèãÇ·û¯þöò×—VÝëW·¿ß\ÿu÷õ¢T¼{®onï^þñéÆµ×Ž>­opwqýùî[¼ Õº—Ï¿~ørýû×ÏW.t~úi†F/?üüæøýú6ø)â¦Fpì½Fíæ^¡8ŸÿõéþñùeÏ?é™ÁŸæóŸ¾{{tþ¦ã¯SôåûéQ„³éÞ¿9ýûIï£x6ó!Œò!ÍÏÏǯN:…¦Â![ ËH¡0t=ƒBû—G¿}xÝÊSúl¥g¬Ãø Õ‰4Ÿýâï/.:wLe‡Èœr Ïà‡.÷O ÏÙÑt”±<ƒF'‡‡GFçç“:å­$Žò°NiS§§TÕáÇ_.[ÔÎΦ5ÚÎb?Ð(Ž’8>ƒ“^½þííáû¦ÐÇi…¶Òx¨úºaÉ|þ³“‹—§Çà?ŸžåóV"Kz¸¬ë¦GžPXÇgçg?7Hš­Dfi$C—ð3$ÍÑ»‹ïßõMM}e;ñQ~NN_ì_œuMÍ>e+‹¹>ì"ÿ ~ú÷Õíjïå×o ÇèÓO7Wº®²ýËõç[÷®Dß]Rîïúɲï¯}šþóI9÷¹÷9®Q¯µ¿Öþ¾ôdO#)¾')!èUïIÁ©ô×~Jz"Iï÷Ö÷×¾ÃÃUÉ’’ô ëI²’dÕ\ÝVŠ’V%­ bR}R}¯qUw¡×kÔkžE’F$¬`ýÒäjTRušy½.!é»*ìÔQ‹²’e%ËuIQM‹‚k jUÒÚ?mcûd–¶A1˜ªB`´2=‘ ²„JctºmË’7AT{"¼„*L6/5&èü‚æa¡Ì¢’U ƒa¢ÎoA“ ‚ú6ˆ,¡Òò„Âd‚W5¼M®!. "RÕ‰M° ‘YELXâ@ʦºÎ6Ø'« lÉɺV`‘𠨘5ö¬ÓCàhB2NQó8Ó*K<¶±…(Zˆ¢UZ¤yTyD-£®”3ÚâEíŒ9-¡²Ä‹5˜ äÉ+U²i#͌՘*‘Á° «d³E²Ù"É«’v !Y&ËÀvÂÕ ºÈC¨ ¨Ä¬Ë@‰öÄêJ,h2sܠʦqÖl3O´ý Ù+góbUFT9hd3/³1è AµÈI–P‰gSÝr2Wo‚ªSü*ëç0Ûš =j°® ‚Q-²ªˆ1˜UÖ‚AP—ËÉ:sÁSU[ç«­’¦Eec°¹¾&ZBeåYóZ0NKEkkÐöÏ£ªC*òZžd½ yëIO) h¥a‰LK¨t =€PLX£HÁÇT!¨ hT0ó¬í   4„º„J› É´i¡ F•í²$V¡šUæ%ÒµƒHKŽÈì$ö ¨ˆ X×¢d FÒä„0ËÕ©Ì*Ö}YÓBÚ´4A Öþã‰TÜŸ“·© ¬­ gû)ç%TÅ€‹W¢6gÔª–Xu–E£©ª[?Áti¤8o»»I%FeîŠVËÑr,¡bÓ˜A— ¢dIš·4nRé"BbóQÖÆ†Š6¡ìÕrÖC¤§Q±ílP¦ŠgåÄ1˜ k$GZðÃTIW'NšfœêÎØóHwïxûs-ÝK-É¢ÝW±“ ŸT-Ì*v4‘ììÀN l·¨ÂOµ&Xw¬ ";< b{Bk1¹,ò\´}{´Zâõ~ÀZrã’¼ˆ+['i9Ü}A _°¾ÌZ£ÝÛêG¸ºo´OYwÑ–öõ lËbŒó¸x¼LØ¡mûDA× ›å4pÝ÷ :ïí\Ò)?Ì•‚Í4¶¸'±ºÕa÷=Ã.Š0²gtTiG—냥õþ~½ÍZw»ë¦ãÑI‡áÒÆÁæˆÇýRãÈÆM{òíîÏë/mhw¼ùS¦v¾ßoÑÝöÀÖ£¯ïþ¼j¿ë„µß¾¾Ð®JMè>†èÜ\ý§ÿ:cø¯E 2@ÂzÈ!N"¤?€p|õß»þ«‘) øÇ­eÈÃ×Ü«hþS>õß[þ õž9äÌilʤ;ƒ ã@ªe›€< ú:L“€þЗ€2¤)@Ÿ€i UáMÀ8¤€~ (“€ë*A_üh•tßyõT_e`úIÀ4ä€Ã’Z+¼ H@ÿ8`)cÀ8Xê=`É;Ó0LÊð¡JQ„R&x€°Yö9‚ª”ëpž¸Wqržý!Ä-.Ï•Ë.+OSÊç<L;y˜ë$`Ò€† “ƒ2‘Í2Ii¤’ä±?MÅΟ÷ñSn¹S$²ƒ*ŽuŸ, ðÀqÉdÉ €Ä?˜Æ$“””ò€†°®˜ÿu‰˜ endstream endobj 4096 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1876 /Filter /FlateDecode >> stream xÚ…™ËŠG †÷óõÁu•T !U!ä¼ðÂpœÇÔÓÕGRëœÚõt÷§KÕ_ýϸÍ1RNmŽšJFúL…HH¦-µ!Ïôœz+4L£T Z³I`ç bÂ1Þ8艪<ÌÿÌ"· qŠãGe¤Â¡Dœ¶2ç­ ÏeH¥5I˜[*½È9s4ù š˜ÊôÆQO(ËÏJ*üqå…º«PiÁ›ÎÐj!4¤L'yÓyšï …¦“”é$o:ý:†.“”ˤ¶Ñ‚u™×Æ;ÿ«â÷ã-Ò:þÁgVv”ÚF4ÍŠ&´£Ô”hÚF4ÍŠ&´£Ô”hÚF4Õ~OZ(šªDSñ pÂHU¢©Ï> ëh»>Õü·Ž²§î”ªÒSuzÂõ%;Û_öòÊ5¬;-6W»åRR+´Ée¥VC©%µ26@+µJ­(©•ºZå•PyE)/Ï×Àl•W¯PV‚ʰZA•PPY *· Ð *‡‚ÊJP9¿â´‚Ê‘ p>…7@«¯\B (`ßÜVÁØ𵈦ŽøP Ò3¥,B$ $T/ÖmIÖâ_%žgÈ:q–®ë-—jßûSŸËúÓÕ‹ªö½?½í4BŠÊŸ"n¦aÍ †þ•?EïO/ª0‡„ÇÉ€ÞŸÞjˆŽT†½!½5Õ-Ð~5V‰çŠ£ûjÜ\9WôÎõ–Ùœ:WTνsõÀAžʹ¢w®7à°ÀðÌPF½‘½í™YTFÇF4ÖÈbhdQYìÑX#‹¡‘Eed±oDc,†F•‘EodoÀlá9¡|-z_ëÖ×bø×STvÛ3I-B(kåOÑûS\ä,Éù©«ÄS…ëœ_çî¸åRªñÖõ‚Ÿ¹j¸ •WEïUo+“к¢²®è­ë heò¤B%“›?-V5Ô…rxs~E¬.ÖŠ¯ZŸ ÔÊË¿}¡²§x³§ÖbèGQùQ¼ùÑl7øò£«ØÕË*Öþí¸ÝR)-ÝœªKe*†N•SÅ›SµÖCkŠÊ𢷦@vå²ý=õ*ñì¾´×Ý+ÓŠÞ´ºT`M+†¦”ioZo@«¬Ð´‚2­àMë h”¡ieZÁ›V´¦BÓ Ê´‚7­7 X`ôåaÁ{Ø xh†„®N?€Ý–dõs•xî lõƒ·TýÎשmí‘~Iá prHŠàõ3¦-Éêç*ñ½ûkÚOôXUªü:ý¬V”~7Àa¡~@éúhõ¡~@éÊà"„‚%˜áÓí–Ö±_%žëƒýåÿÕÃPRc“Ê*k\ÊúSs4m endstream endobj 4097 0 obj << /Type /ObjStm /N 100 /First 902 /Length 1846 /Filter /FlateDecode >> stream xÚ…™Íª$7 …÷ýõaü'Ɇ0Y…B^`w1˜LB?Ç]å’åQûnîuuÛŸ¤#[v¹3S>‘™ÂQ#þ9"§Þ(GJµ7ðq&4r=JäÞ £ÔÞ'ǃjCY:&Ñ!h¤£æÞ'¶£ÅÜ|´Vz#1H'ÆpÄH`6eé­rÄ»áѪåIG,-Âõ@÷öF'.ŒO@`P”XÁBçŠRйáôHBBD’BÅ(D’z”‚HR“ÀÕ”cyHjh4p©0:§|$*èœÂ‘žI4*ú ’$ !Ãpª$‡ ŽÔ² ŒÔ ¨ Š?¸!ºǺ»9Á1n]Y8Æáf8ƈ6FpÏq†ª]‰ÜЀ` ¨*Ê å+˃áen1 XgÈRcøT"þô4—D0ZÚQ²ÀhA Y õ BÿBˆ3:ƒú`¨Q±÷¼–Š˜8¡s…A†¥ØÓI¡›í ˆ¡è „§žA€ñ„Ø éFaþѧ QÚ¿~>EÌxtî¹"é_ÃRÞçžú×­?…™Ò‡Âp„SDp.Öü R"ôéçþUéÑbBR =þÚ}éÒ4[ŸûÏø%¢Ï3Ý1¤›[ÆW˜¸ÜZzPìéÄ$dY"¨2¦:–†”§Æh`6d¤è9_ \(Uú¤,hä>_ÑYЙ‘SÁd||ÿýãÃþñÖbÁzüíñá‡ÞNgû×O_Þþüz.Êóƒ/oÿž‹öùøËÛý[¬þøñ£F"ù[ V¿fˆ È/€ƒ\M„¼2Y—.÷úüåﯓ‹?z>ÒÑýƒÑßÑ7¦Òd*ìMåj|¿BY€¹)0Ë à D—À¡,„­KKôÃÅ+ú¡ö}þÆÔ}{SÉF…²Ó}’w€VŒìŠ‘&1Ò;b¤d€—Ã+0OÀ¸Æf~ÈA±¾d L0ʤw€Ù/‡WàT2bzhKFtKFœJFh{`°%#º%#L%#ð;@[A¢[AÂTAB~¼—‡+aZÁ.çÖ©.õó‡Y„ÃÃkŽE-­)TøaIdoˆí Ί¾W 0ïisªG Œf'νô¿'†PÝ[Çe|v*Øo*àý4ô[l’¨M[ n#g¼äEH*>…Ýè2k/ÞV*E¥_ö½…Ű<¿t ”e¼G_~y“@w5Y6µe´ÙÒÄÛÑD74Yö³•E†åù¥[›,;ÛÊšKùðraiærܱR3,òXw —T·,6,/sIçc¢-Ë,Ô> stream xÚ}YÍ®· Ýß§ÐÒwaD"%Q‚E®Š (º+²È I 8nÑÇ/g(}šÑEâáÇÿı³¤C®¤êR¡KDMÿ,cÖ?)0~ÏÍ^͹„B]ÿ¤Pc ™{¨-½e®AŠê™CÓÿ2ÇУ¾GzÓ÷(‡kÒ‡Rb}35}èúJR'}'©ŠEUQU¹ð[V„T Š¤ªb=jW§z IJÖUµÚ7=ÕÕ?n9PŒúr‹’"³2$}IHéUzc=@ UUUŽQXôE®zªpSÞ¨*AVuƒKÒ¸‘UÕàFVU‡9iÀ8¾±rc¥˜õ×TÕŽÆ‚©±þ¿j„™p’Õ`Œòf ‚â1ŽªMß)ÉÒÀ-ñÃË®Á'å®P_Ôƒ+|iˆ£2Pîb}G¹gõLýÕì²Àq¤ŽWä—ôåŠ÷þF…€ìD$Dð{R´Üv£*z·ß(”DO¬uí· ‹ý¦µ‘;㩆Rr«,ŠdzÓ§ ò¤O=(*ÞS²5¥Š§*iQé“V²¢Ojîö[êŠF³P%ÛÙª•Wí7 UýS §àúÔƒþ©»‚äêS ’<ÐøKMö+G-iˆA¢¤7;[C}’ЈD1´;g³ÒCË‚šáV:p9…&d¿Qhͧ'[¼$qï×L"·G[u±µK Ë´Um-…zzy±5 •éÑV\lÕ­4lQ²EK3ò®Pi6#ÕG[y±w¶Ê´Å¶Ò«-Ú5#ÍCqoë<7§Ó¬íTÚ ·÷k;ÑÒNîæÑNgéŽvŠWÌÉ>­ìÊÙ»A–&ߟNÇ¥ŸÒŽ}œì㥳ýôik×AqvvÌûÓvÜõrœ½Ó,P¯<Òù¸ ²¸Fž®£å¹·=äéð¦É¹Ë<Ke |{ux°9>³âç+$OȧaMrB:™ÕV¹æöA¥Ÿ§wä[™§/S)öòêJz5V|œìÝσ½”ÇFÑr€Ê%_i¡/;Â2ó%ùéty2XÁ7¶f"äR¬¾ ¶jßžuWÛãé×*dÙ%¢NV×èbëõªÙû5w"®´·užÞÅ·Îì”˦ç=ã+K ¸cVNò£(m‚ÔG¥†ë.‰eÖpá½­ãt‘Ýé1w9÷§râÅ“³4¼»y÷(Ÿäù™'ù|!Ï dÞ wΓnæÇÓ ù¼#Ÿ_ÈÇ'[,‹­_\L»ÈÇÉ7>ò¥uަ•o\ª0ŧå…ãàK—å…–ÁO»ÛŸæòB—ååzz©»w¶xÚŠO¶–­dï×ÜJ貕\måÅíl•i‹m½&Ž¼ØšÑ–ÇhK]lmzžæ"Bò{¡ÅÖ.ös!yŒ}]b¿[¨ÎØ×ÇØ×%ö»µ„êŒ}ý öÇ麋ö\%¨´úé,È¥ƒ†gGÅøÁ>ùó¯¿ù#üóÓçôŽ]%|úLï!3Z~t´² Y…ãîU¡¼ãþ”Sªš%á…ýúû×ïnÊ_nˆòŽmÃ-7HGbUêúéZ¨çk)êsõgÒùy¶@ªeÓÞ0SL8r e¼C 7$†’£‹bÈâq[B¬&ö+¸A˜zƒ.8S››hE\ìÛ÷Ö®JÆô˜.Á¢9]±¹ªï؉쌇4YZ=’ T 9ÕTLï‚já!‚E9ª`A„©7è pNL „GLkòÀ˜Vò“˜8^F¾*ßÑaê ºR¥ä%¥ïU·Æ`Z‹'‡LkZ¨Âwèþ~¨ïÐŒ¤Öædب64ÕîÀ *£T%y† º0L}‡WMóQ¡]jœ]YaÏ +Ù+?ƒ¬ŒNËÙÄ{Ø [µlp•1(2¸Š8¹l\G£eãÚk×=ejIî¼ÝºD;îÄ ˜¶äÕW0p’3+ Ú|ÒjOA§€D+wp@˜zƒ^íÌ@Ó6º©€iq(Æ´9ž÷¬‹vŸn0õ»&pÖÓ½³*¨öÁ¼‚j'r-&ºÛ,:ß»A˜zƒª=;· ª½xh+¨ö1qôÝV\ÀµËÐ!c½ÝÃ^m¸Ên¸Š¥Õ¹ŠqíŽ-6qâ Äùrµûuhâq+.èbÃUvÃUl¸²GO0rbö^SåàÖ¢Ýw^-Ù%à1kv‹ØŠmÓµí¦k³{dôR;¦ë‹M?t«&z[6±fÎ5ï}Þl¼¶Ýxm6^GôTl–ÇîVì\»e,{=v6ñ^qÍækßÍ×®i”X7®uX4®2àë¸ÈºqaëFãøn#®oÆ«º/Þ¹¸3›TÀ›<æwq ´ÉÇaã!¢0j Ê;,–""ÈÅÄî"H‘°Ž•f¤‡Ÿà|®Ì 6 L}GW.c^Q2¢~¿–"¢>´`ÊÞudûÎù• 4Î/öÚ 6¨²×a\{ÓF TÙ/wBaÒù×{*h´;6.•ÝCdµìq„“Ä>ƉŒ©xÈJÙý²u‡»‰¬HocÝL»Á¶œ:m¬D”Ó›‰ <ÏŒRQ=8Ö:ÿ p…Æõ; œø(^—À3ûÂDl…9^=êÒ¥£,oÐlÙæºƒ>J× €&yrù¨ÜSžÓ=ù¨I—Ž’¼ãâ&öŽ‹Uˆ|v6!*l,Bäka¡â„±âPqÂØpôÍ{ygëì,;äfg-ôᆲõ†õƒ U2Ñ9Û†Sîi†yÓÞ‘‹±ômŠÑôÑLÅxænDG„Š1~‰û®h¦ÞÀSß PŽc–V£:$0¿`µ>DEฉ9ì›ú5ˆÇ§6a bSkÓ˜wÕ¨z~°àpÝ :¹Ý^fº;2¶OnÍ3žø@9 ¡a»oìèÿ8GSwÁB~y“^ô©s@“v¿УÍÁ*¾Îgå2V5t^»UlBuÞ畔Áë }€øßUØç‡nûøðÌ>=òm÷ƒYènxömâ¥j_>­ì›#Ÿôì‹Ã¿oì{ÃëÙ¾6â±½"Â0”7DŨ§!ûÔð+Ç>4¢_ôèÂsQÁHtí##ßf®ž²¹öì#Ä'}]ø²o Ÿ?öeáãǾ+¼%‘Øxk ˜ýtÎÝÿè"¿’ endstream endobj 4139 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 6242 /Filter /FlateDecode >> stream xÚ•][Ü6²~ϯèÇø!‰”(X,àØN6Èe}l'8ÀÙECÓ­™¦o#©Çv~ý©*’ºð¦ÞâQw},V},‹”Ô[ä\n²M‘Ù&Ï+¼È7Œs¼`^2¼€OBâE±)%aÊM•Fl$#LµÉ3ÕÜä<¯¾+µÉ6ÎKP®H{ ÚC¨f…xÅ7¬R%^ž1ìª,7œ34¬.2ºª6\Qÿ%@˜Ê¡Rm¤ODJl+òM™U¨O°MÉ™Â+¾)Ë-àD¥PŸ(7 ˜®ÄFpAÒj#D‰VÇBªújS¡‚"¯²MUdØG•oª*§ïØFfYŽWȨ°mUldYÐwåFÊmÊu‹j£¸$©Ü(Q`•Ú(E¶Hà*CNà2‡KNÌH—¢¤K—ª@+dƒÆR"K¸,È †’ܶr–‘ß ÊYQHèLÂÀ°J"k@ŒVŽ+èÚ¥ 7.i„ô.£^½Ú}° Æ^c¡·¼ÀKè­d2  ·²(Ñ5½•Žaœô%ô&8\BoøÇKèM¨¼ÄKè­ÊÇKè­* @oü/¡7™3º„Þd!Ù7p ½IŠ&–cÔSx ½)°/¡7¥ÍÑë€Z¸,6`‡Â¸‚Þ¡GG– ¸”%vÑ Z*Ò á²( ÄY®à²ÂØ`¬ð+cä¼Â.`r0…—æL‘Ð;ãØ.¡7^h Ð×–WŒ+<¸„ÞPôC #HX½•¤Kè­Ì8É¡·’s´¦0+G z+Gà&𠸄Þ)t —² ÐĵüæïÿæûßëcÓoþï[‘½ÚàŒÌ66ߊ>dõúÃO³ú§OÊ|*°™0Jø€ŸþóÍ÷¿¶Çv°ºQøŸoþñe§0«¹ÂOÜ~’ø©°Ÿ}ªô'ÊÌ^ƒrŒ)·OP2¯Ï }Ãü¡[3ú$Í'ô g±þ„¾áüÓŸÈ9eÛ‘åJ¹Ý¢vúÝ¢sl4ÃÐÓŸÐ9Œú"a/qPp@õ'´œ¥×'¨F¡×§Dç˜T‰Î1ÁÍ'tŽU†^YÒ'3¨cÒ"ÉrU¹Ý¢vúÝ¢s<3ÎItŽç†Eø sC‚Bï`Š˜O9Ž£…¡åœ–­eŸ …^Ÿ ã…1Y¡s¼´ý sÜrªÐ9œ¸ú:Çml+²\ñ¼[ÔŽB¿[rNÞ^¿ÿîûÿùwVdõiè‹÷xõãõ´Úó©µ)m´½þèJ¬¯?~ÿé'Oª˜•þþ·Ü K¯wO§óçC³hŽÍi@QQxþ€Ù>ÒóîõþØžÚ~èjì{ü­>]ëë ÏM½¾иÝÕùó èÜõ(>ßã¿ͰÝ×Cƒ™¤ˆ.u×7Ú#@Ë\Èóî|"ÐÐôèci3Ã×üúCs9w(`Ê›.q¯ÜÖ!?\Ûþ=üÆ?ýùÚíкÂ0ò¦>4§}Md ñø·š#«—Áœwí©ÙÏ1&dÐ׉ƒ}ýuÞ^cûcÓíÚú€Ò× Ú ÎÊÊÊO»æ2 ðçÓ¾ùò ™Qtß>\;ãÅÛß)Ìîõàýòö Œ-÷’iÂïu…‹N‹m_C·l²pèÚ»ër@e¿¾|5-~>ú# xVZ@×B¶ýq¢ï—¦»kº3MiQ_/Ãù¡«/íÎD6ýx ½4ÝKÛ|{*/ Âþ$”xŒ¼µqrº\Cø‡CnÕ[ Ú¯ÏMó´ˆ ãÜÛæ¥9œ/M§•ÍXâ6·¿=>εMu?Ÿú¡> ãf Þ^Úî|Â䀘—ºkë»CCVeDÇâ뾿/†O.½E#îiZ—GÙ»®óŽ`†‡QøOðO{%l•1Êþ¬׆ZŠß}©òOp3QlêáÚ5ýŒª|…™E˜Éf ˜aÀËz>ù„ÇCÈüuM ?ýþ)ébõíyw%þ¬–_Û]sê4Á¤§ŸšSÓi~mæé¿B‹/8ªr†Ñ1û±ÙA`_õ5„/Îya«²Ÿša°Q?ÔÝÐì‘î ›ÃÓ“•Î}_w³€š9°ôÞìaT«GÚ?›zßt²¹ ôŸO9êCû—™,¥­¸–oÏ,jèÎûëN7f6Í¿&kÎólg‹ _>üðÝ»þõÁËE^m펵ñÕé¯ýK/4]ÿ8 ¬îp~h1}ÚÂÁæJuwu߸6ñö¥¥ýôëGðªÌ,€†¡îõ\wY|ivP.@çvÙþízZ˜{ŽfM‡ÑP™a˜g_/@nqòÛxê}_wp‘ÒÏ–­^R!Œ¿QÐc ¨R®¢ö¨Ìä”÷]¥ 5VÙoq©8ÍŒ±%IÉø(Ǫ‡&î»/ļ“’¹Œ¤\Šéñy´‡˜Óõxg4µ§EÖpÁÃy`+ýM}8ÎØ€]{ÑÉôR檴èû¦k NYÔ•6E|hÀÐËT=% 0Ì~|ýã»yÿ~þÓ³vOûñÓëŸ f©ÐJ uAÅ‚š/»Çúô@‹ÞÞ.¾™œÿ¢#o ÷žO{ÒÞ·†(S}½»œwX›ùFY¶1áU”ùxlC›ˆ>^š]{oK,[†þu>ÑßîJ c™›Ñ£t?+x(ÄñNKuEª}#‰«<®™•·a^w2¦Íã+°e²›÷OÍáÔP½‡u™IDŸÛòÅëw¿{óæ7l[BÒ6¼éš=îot¿©wúëÚ“Yi~luÖú‘ê,GË…È„K×Ú˜QúÔîž´™ÿ6»¼WžGÒ….ÂÛ UŸ”`SŸÌôÑïFXZS›)– JcÑjb÷^׫cȸ¸;CíC{05Éb ìe”a-Âü6Áòæ±Ù=au`¢üÿVfÊ[¶Íøz_d 1“«8£7q I.žiJxxMdyH:P^…Ä{(ó÷”"r–“kyZ’s–òýùU¬iÚiÈÝç]Ó÷ä^2Á0Ä®}ý = Òd õÔ€`6 éFã ·½áI°Mþ IÄÕ´¦aK4,Ô-óÌ£LÀ4ŒbÛã ´Ð’Ä‚q½âáœD—/”Uœ˜€K+ üÆDÅm4ü¹EÈÅ$K©üïçõx>Þ Y ð¬E[Z‡ìrýµ¡tŸñ8A®O!qJÑ@3C…Œ€*ž²‡’a_¿hó€p8OL0ONù¬ô{|ÆB×/½D|u™ù°¦(EÄórð¼u8xË5ÝŽ “,‚h«K€¯Ã•êëçkÛ5û-ÅVê|šZ¬bq¹Þ(@oY‚±…³q5i¾,Òn- ÏÊlÐðøc»;Õød@.„3ž#€N!\”í xXd@ïJV¸’'¼å@Û̼tWµIjŠš²ŒNǘŽ#N‡}é†n?+mDåq ™’ÁXÒád±ñ®`¡5Éü$f~DGÂ}”­ƒe‘…l±vp_øLã[“÷< ‰÷œE„¶WÎãÞ/¬¨H:ÿ<öâPßœö]³{¡ 1éöQ§¼²ô"@×feÉ‚1Ú\JO¹­\XàÉ›€é¦q ä™´®{Óµ¬ÂBjéêp™ƒ˜WT!ÈuzË&Ê–'Ð>º̼ˆkHr€È~êk|ÒÎÁ<íwsPÁš÷b!î–Å@ðvI³×ecU¸3½ÔŒÞˈŽ!Ìy,“EŠŸ¥‡15i’F£þîOYè©‚ò¾¾oHpèØ ç‘˜ ÇþA×mŒçý—šJô¡Ç?Äm™$eîQBQ’–K=Ìé ˆq·^0Ââ"05tqĘa˜}hõìU¢‹#¼ÄL•cÂ:‘Б$ax°‰BF¤:S¼±53OÄ:Ò³^`ÀEL EWƒ+ `Ü ÔËqUe)ï­õËfq‡õ*'¼Å¼;´öl‘T¹³À©4¥».ö(vtîÌ“f÷;Þ‹¶¢\DVÕ-È­Ù ÉJFyZæ×”ž(q^£®>ía73‚J7zÒ-ÆMœTknκ)hí2Ñbb:5’»CSÇ´G'æ]ÿ]W·Š_´KȤ?3E‹t+šÔNéÞXbõsÉ ‘¯¡Æ¾SSa®næ ©n"Ú2°¦ñF> ol©™bÈ"rx81‹ç<µÛsY¤µÛtÉEe¶ë2¾ûˆyžÐw‹zw?w:Ť9:<•úæY?kdÃCä7¡Ç3)ØM ìØó$z˜%q¿'kŠo#šðæ@–ùšÉã¬.Ä t6tIÚFOÍ€éœEr?Myφ?cÅmIvæ~JaŠKÄ6Û§Ò<' ]³  žæïŽT3yB‡ŠÌ=å§gYòÌ9²Ã§9¶Îî çó°:ÍÁŽÆ®¡™b Ž·šbäøÐí}ÝÔ3_1Ïø‘9[ÔØ7@Ni©Û·=/û•°ekU*ŸïyÊÎdŒ¾¨ãaU)þl¢Î¤ÏØÂ¯Ñ*'QêñýÐÊ¥›ä”‡X¦DP¤óÉ¡ÁàΜz~Äè9ò*AŠsö¿l¥Á¢ìÜΜû9# ·9Ò,ÊœCŠ]{y„ì|w8b!U‚/F¯§=’fpUg‚föô_ñ\"!Åþ¢õ¶ëfXC”$²£àœÜéD`P¬‹Mk§ A†Òn×áÜ}®?ðÀ¼ò}n½Ó.ê1‰ažÉ§ÜYœxßÐõ^…æp†N0èÒ”¹7:f*Lo$v“Âr»¼4>Ü>æ¸EÑIBî”<“p²Ây e‚ŒO€å< ™é*`Çô3 Œ3‡™æíÑs"ÍãdÌ`ÏÔK1ÜWpç€{ <¦Á9àäeD“sÉ…ˆãæ‡E%héeZÓ*WÞÁ¦SoÌóÃÍ2Ó*£>Î9Ík’àü “3±†b¤,_£Ïq<©p•E­‰Üeaû¡ƒ²Š fǧ¥ˆbìjQ³8Få‘9:[rV¬1e‹)YeÇžt–‘PϹS /zBFân¥ÔÄiÑϺ £ßîîvÛcMë¦óÎþ‰–Çw}?5sŠî;ÓÎyÒ’gñù1»wvÓ=”Å#šö Ç= ÷A¦ªwd œà¸kJh4:÷—ÀyÑîž/€xÌ¢7£æè9ÀUÈ󤲛(´§6î%È츳¹[€Ì™{#jùL­>.qoØ8ÏÝ.OKܬ‡%&i¯1è»i­7QéžÃp–ð’‚rw¾Ð˜ó­Óùƒ{k±¦P0?¬ÌYÜœö ¬J`ïõC?"ó[¸u˜XÓ›`w†ŸæˆÌŠ„½xXo¬ÍR~ðgF¿²òr¾\TŒ.«ˆ\²ÔˆtÍ©ù }8Ø^Xª—7!#²ŠóâdMåm÷tÈ6Ú§¬ÅW1äQa 8:êÂ#ƒ­¹Q$°Kœ7ìþÇgr¹ÿÉäMüÍëJ7Û ùÈÛ eU2í…rž„Ìtys{ K7ˆ"O€Ç{0¢PqƼ=RPI‚*<>ÙUf)ëfSBp•BÎ#Wpž€.sŸ(R\ÎsŸà)ä”ÏâLƈH+½Ù)ñ žó¡«O}‹G)–g ì¾À9ÙÔÏzÑ=?’–éù:\®ƒ-UH÷$æ75úÔåfz2 zbC0-9ö.]zп¶§ÑÓ‘ ‹ANçÏÈc€QÅ’îG(·Ç}I…xì`7ðœÝØ.ÆúÇ:'ÍË)ñxîz£Ðn"Ìû¡™³Óâ «™sqÄÞƒ©‡ó®>ôö7G+oÚùÀÜ}Æ¢þ‘ BÅê‘™ó)Qî|ìdÙr»lÏ ”ûuKÇçŽãôšªµ…"&]¼Ëš»çªÞÛ®€ˆÍ¦¸/1m1V`å4ÇúT<ÑS©KUíìáÞ*˜îÍȱç°³çbG¡ôêNÏ0ØW(¨ŒÍ,ϧ”¢1ˆÕÏCØÓŽ\:¨Ù • cf+_åÜù°ù’WÉ*„™o@+箄ß5©T§Ë÷t]å q‹w *' ŒÝ©VÎY†›=jU™0»ÓJu›}iU™îgþаæiræÞ¤T­Ò/I ŽÞ´;¬*åôû-c@V¢Jc€ÅëG®èÃc2ÂÉ îp8†S?PéJOÆq™æ­ñP—äîÙ‰•ÈBFŽÕo•‰|ßöø›i³ŠIg ò¦(CMèQÎ'¨–OÛÞ¾vQAÚÇÉÆXH ÙúsÝíÉM_–¢ï95']m+ì°yÓ¨âyоYn*8fc§1c@é˜o×… ÆæôòSÅŠ4W #jVHZ¾JU•)“l–.‹Èf6¡‚žÛ¨·£ìȦ?!#âó—vJ,MÏ·„ªŠj¦N“•…ŠIÍ“­2,ÆóÒ^²(€,=Û9+Ò8 Z™g£W 5+ĘõF¨`ZËÃ*/ÂòéÉ©*Ëb)¿ðdd8BzÛQ^¦iÑ>E5¬0‚ÇdÔKp„Pº#W‚9dZ… ^`6­CΟ´mg™Û3$o}> "™v]﵌º ó:JæqéߢĊ?à‡?ÏÍ2çø{DØ'.8ËõC¤!Ò‡ýµ–9ç˜#âe“ÌŒM¾D§H84§,6@¿ï¤õϸ¨Úky…?ŸÅå&ï*嫟Ñã¼*ú&ÐÜ|¿eÊéyÙ®”?4xLÐ5=®—e2.·Ûpç”›0zæ+%ƒ¢±w¿å8âY–ðû-°Ì9ª"ÀIÏÇ" ²ïeѧ²oq8 2Éßø›TYðÇ>&Wd¾l\ÀSG<½,Ý9`ßiµo*7ÿXÀ¸yP,ɇûº¸« êýgç¬[Œ¨1g±ÂÜ-Wîvd°ý8·ô'ÞüF@„ÓÅÝq}ð.è]B×*Kú•^å.$Vܘ]ˆr¼œø¯ù™%Ê}žX‰5u[0×üˆ‰’r lhÕm‹Ÿ Š(Z嬚/ÔŸs:<æ{<•G@sU 2=&¨H€Ú}Ê"zéšaø:îuTô=T×ô¦UžÆ³H.0ûåÜtŸËõÜäQ½aa«zų4nšì+ Ç9¯Ö¨r‘kZ¥Ê¢Ç,!’öÓRò4nŒÔ2‰³»UD4;/•EôŒ{/ÅW[úSµJ™YèmÞ1æMŸb*šbƒÇQñ,Y/â )¶åasOºn`l˜t$›ô6ôË*ªHjîm žŒy;ÂÓ´AU™Xgiô.ª(FÑq_Ð#éËè¶w—LAEv¦W™s§,Öÿß-fÿåþ”àåîiÏÆûŠÎ}‡içen’†ØV‚¬7%'ÿ çç endstream endobj 4309 0 obj << /Producer (pdfTeX-1.40.13) /Creator (TeX) /CreationDate (D:20130403113054+02'00') /ModDate (D:20130403113054+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) kpathsea version 6.1.0) >> endobj 4240 0 obj << /Type /ObjStm /N 69 /First 707 /Length 3155 /Filter /FlateDecode >> stream xÚ¥[Kä¸ ¾÷¯ðq÷°‹z‹=ì&¹L’ Ù\’EÁSåî6ººªÆvõÌäׇ’L»l=º' ¦Õ&Eò£(Šz´n«º XÅkáPI%]ƒWF(×c5s-Y1n´k©Š)ë;êŠYá¿™ ˜õ|¶Â^òN€¬+ÐÌ}“¬‹lAű‹kñŠ î¿‰ŠëÚI‘²âVùN9x*„×2•ÐàÒV²:T]I0Ž»I)œd…( ã®Å+U[×C‰Jqé !>¥Ÿª”‡CéJó|¦Ò’ùo¶ÒZZÔ¡ëJ[W³Ê€uÚ4TF*'E£«”tÚ´¨Œ¾%+c¸o©ÊXpÖk]Ùšù–©lð©¶Ø2N‡©+pVYá­2PYé@ƒá•UÖYoDe ÷-YYëËàxÔ&Ž«œfc°É½3Q.«…qc‚0X­˜S„£Åj­œ&t/«míŒ³Ü 8÷M7öÌ€ºsʱ‰Ú˜ðIáyQSÒ CmL+}'xÚ˜q°8âeÌ: õ0¨6QÆqMÔœ+×DmQ¾‰Úp@µk¢6ô¶—`\S껼{÷÷湪7„ 9B¦èç½{†kOÉŠdç"|œÏ~Ô‰I04/a–£ÑóDððÀxžã£ÞŽòùù2bçaø|î.(VâØí›ãñc³Ú=„Ì¡ê’;ª7ÉÊ{'ÓiJ]rí°¾9p> döP[™ wÿu)–©µ7|N¥Dçsy§/3dk®ÉÊ™’n*ÁËË̹+pÞŸ]¸÷/nV r“0paÙNaåâe¶CȾá||ñ± ÌO­ï¦Ö‘94÷>³‡¥)á™ɪkÎŽ8¯)\ÙHénÿ4\Ÿ=‘ÅDZpx¢ãm¦åªŽ¦L+Ò$J0" ·¦';1S²æÒÄê)»r™°mÊ=\&0Ó0 HÓ(ó ‘§ÏÀm ød^B}øoÒÃS¶¼ç$ÆÜåÐ%(Tšá:¸™ÒŒgJ¸xɲ\&œµî¯KžX°d$=S¥»÷q¨×ó‘¦Öæ*AðSíxÞûR®éö~ÖncyìÛ¾?»´²­Ôn3ïºëøàÖO©x :Û)‡i»æâdj¶ÕDóXnFÊ‘žú&7ÅÀ-yŠl¹©W,!क,ƒÒ¹Z’¤ú•@÷­GmbÛ‘2ç>iY’>Á26I]ì–ñø!Ç'ïï”æO‹fà ˆ½õé®eПÈtm’ê—L#µMrÜ€3IpsÿẋötèÛ½+CU Yòî1$ZU—}0É‹(ùÂå£iˆŠL˜‰>OyUÛ$× C y|Ÿ¼;”MÓfwÅΜzZ[ð Œm×úE±ª#ÅanèÍFÓ\èªÍbìöOAKvÍáp[^«Í®}âz¸)Âçݨ^À>ƒx]TÖ¡G¨“&IûËä³ÍabYé4}\;"é®a9t@–Í,鹆̺%³êšuƒ4±™§ügµý¼k®ãã>XÃä6쑾?vmØŠ •!î.ž¬3dš›")¬O·ð6 Hoù‚20­}‚³ˆ„CøtØã$¡ý"e: à2ņl–¥Ë<$Kð¼W¶ËÂJžÂlºŒrÂú/—®oÞ‰’ÅN¼?6¾`Š¥i.7xz¦/¡UÓÏýç¦?4mD% Y€äe”1qNXÅ6™#Çãg?)æÀ6ñ@v§nì°4 t™ ¿4ÇnR¡c!¢|”Ä“*웄(ya…bÛ¹Ùy !SªéôÐf©»ûfð¬Ê²ø8ªãX96®fvµG;Ž_ç˜d"Ǻ÷’ ™c”ì]rÆs3î½­,1£Ÿ4ð<Œ¸É˜SÇÁ{~Ú5X_·Çöaf³1’C!abŽ¾Ý„Jñ¬½& n™Áe%”\ƒÅá—n™’Ûšfâø:Qã^’¾HÐNíg\ÆŽG?¸¬Ns,ÚMÌ1¯ÐB–œ°‚‘è_rÁ´ i"aÁˆywÉ©1̹š2Äy=‰³æØ7§¡ós>vû¯»ýc‹]¦2q…ŒÓŒ¾>˜9+¸fW’RrPà=?OÚ"”nÅ`‰ÏÓbÁ€Å¤ùÀ{æÉt¸ÀâµlÍC“ÈYʧ+(¯ +ødÆ—Õ*ad(KX¼ØÓjìÓRÂ÷ÝÉ{Odhþè"ó,a Ì7l…b$…­(¯è§ÛãC"¶.ÔðLÖIR¤”y^–3åøóeïC©ó=näª4W8ÄaÙ“¼-Ф€¢—“w„0±˜%½ûƒ{}x%\Bëã"Cœñûs/dLétNÊ 23€¸oxß>Ÿ_ÂI8ðWHKXNOøåsIÕÛ½ö õdz;r…íÍ«Y *™¼é—ƒ‰õÛÉk[Oã/²¶ûf“ç€mjŠ×|Ã6Çx)ÞpÃ6§yž³õ÷–+íPÃë|7ús+r€ü)9§¥ûL×J OºÚ0#_e»¹Îâ¯3“úÜS0úU¹³#Þw)êp†T 6öˆ)*]¨Á©™ôC¥˜0"Á´’ Z­°¡©a¨AÊYtщyÀI–2–ÌÈ@F22pšÀ‚ò”˜¦ûJ²TN²1 Éd!# Yä ím"˜±(9å  2È=@Ê!z€ÁàË”d2“œ ääNÚã—( ›s2“œ ääA:ã[7!P®V±\AV ²JO©¤RDW9Z£ÜŸ¯ÿ©Eý¡½œûqHè˜ $ïH²T’w$Ù™ýìÎË»“×;(÷c8_{·v}÷þÃÏ?üùÇ_?¸¯¹ºC“ó)a‚$P’@I%ɒ̔ъÿ¾u· ¸,œž~xt?šSøíx~è\âû ÷<ÝøõKAW]tEC ÈZåÚµý€‚’_Ü–aI2Í…v˜Ý¾]ýä®ùü~=•j˜"(r€"('MÆêÜÚi]%>¤âây¾x_4É]‡æ¡mÑäM.ÐäM¦É^­ó¶,ÚÂõãLÚÜuÅvMØ a74P†¬4¹¢¨ÙÞ—-„Û]¬ì¶§}l‚!Ȇ ‚lhˆ ™ilÖ¯i5DëúŒÔ[Âk ¯%¼–FÅ’‰Ù"`«ÉM»áúÑ{Ó¾»<âæ¿ÛS‚m ¶%Ø´>­­Ú&%á‰!}ı‡[muS-$¨4ÓÂï’Š¹H\Ô¬žÐmN›ç „Ø C/#¼´ÜÒÓ1½eIX±Qws3BçaÄQ’û:2†Vq U9€Vhzv#¦'¡ cª6÷aÞÖO¹Ã^²†V~ •€AË:в>=hu•šßÖ½4Çk›°€ÐS‰@ïRýëРåx.<Œþ·‘›¿QîØ_‡vŸ *#諘´ºÕÀsº¾ø¾Ò.+ÖNH9!4 TIU=ã~>ˆo})GPQT”€ Q 2¨ÌYÿ¡—h«ý;@ PÅ2]ò…w÷SƒŒ”ê­Ï!V·~³.‚F¥ ½@e½aô¯ôßxÿ–>&&¥T…U!ôÖMг6ÿ¾j˜ÿãxvH¯@@ePÙú›¶äoÞfÕ@õP½ToÕ×~›•¨Òª *¨Šª"€ªˆ«!¾¹tª€ª ª¨jª _5äK§7/ZT@@PT@@¶€x}Ñú¶„AÅP1TL¼þcyâÍqÇi3Ï©ÌàTfp*3x-“áöf]jìåÿÒåÐ×â> z÷ Ž,nWîÞýc ™ê0wï~½ŽÇî>Éð)œÍø?ñ¿».;PÊoCKüNüÿÊÌ;‡ endstream endobj 4310 0 obj << /Type /XRef /Index [0 4311] /Size 4311 /W [1 3 1] /Root 4308 0 R /Info 4309 0 R /ID [ ] /Length 10180 /Filter /FlateDecode >> stream xÚ%Üw°«Ï]ßq­NÕ­º½÷Þ{¿÷ÜÞ{ï:· ‡˜LŒíÆ„œ ØJd œlaðcÆã¢‘F$’¤0™˜f(ÆNÀ™èõýýóžÝ}Våy>ï}ôhµ2™LæŸR&3;“2ÙŸëcèF&›Éäô«#íWg50˜2;fE)oëdS&·+Ú¦«Á0ŒÀ(ä`D—0fÁlˆç›sȧ°ÁbXKa,‡°VÁjXka¬‡ °6ÁfØ[aì‚ݰú;=ýkqH¶ÛË,ôN¶ºÃi¸ ÏàU6306Óa!,U°ŽÃ¸÷á<…—}LfaæÀˆÜ{aì‡pÁa8Gá‡0'ᜆ3pÎÁy¸á\†+p®Áu¸7á܆;pîÁ}xá<†'ðžÁ (ÀΔYx<ûsG|¦Ý_ a+섽pŽÁI8 á<„¼Îf‡`,ƒ ° vB¼û—ð úÈ´¼–ÑÊï[ƒÀöÛ[lo±½ÅöÛ[lo±½ÅöÛ[lo±½ÅöÛ[lo±½ÅöÛ[lo±½ÅöÛ[lo±½ÅöZlo±½ÅöÛ[lo±½Eï½[¡üxʬù›Ø;=a÷;ýýºÜ×b¨¶=e޽%£ÔÏrx÷"èoY0úéû®¾} l~n£Ý{ÐÏ-ww:̃£p®ÂM¸á)ôóÈUã˜y-#¯µ ºÖN0[b‹ò-Ê·(ߢ|‹ò-Ê·(ߢ|‹í­M)sð\ìå¯1£àýUó0VB?¦MôŸtæ¶x¡cÆoÿuóYÃ¥8¡m·6ã¨eô´NjÛ£-^Ò8jÅYàˆ6#¯eDµÎj;£-ÞŸ±Õ:¯í–¶xãFY뢶çÚbŒ·Öemm±«F^몶qmq ŒÁÖum¯µÅÁ1[7FFµÅQ3.[·µÍЇÓmÝU=7L[÷Uã°«-glµ¶Èèm=Ö¶F[eü¶â¤µV[$h$·žkÛª-¢5¦[ãÚNh‹Ì ö–sÝØEmá©A׊黛îö?€Î.Ë(%m›”²0 ºQi†T7( Cœ|¯k[¯: 9ÕuJÓ`ºêZ¥0SuÒ,˜­ºZ)sTW)Í…yª+•æÃÕJ a‘3͈¶åª‹Áér®¶eªKa™¶…Ú¢Wh[¤m‰j¼†OÉÅÚâ©â]­Ñ¶JÛ"ÕØuªñb§7¨.PŠÃ´I5ÞnØ-ªó”¶Â6ÕØ·í°CuŽÒNØåÕbTÄÑØ !ÿl¥½°O5Ý~8 :Sé Rã|bLW: ÇT#”ã‚䔯à¤j$x N«Ž(³ª‘ù98ï×6¤zB®°ä\Öå”¶Õ+pUÛ9m!×5¸®í’¶¤z «É›ÚÂÉ[`XMÎéµê¸«í¶¶Wª÷Àgüä#m/U@|2=ÖöBõ`“†xW}Øä mÕgðܧUFÛsÕØ0®ÍHIÑ%žô¥¶amOUã Åç ESÿéûWp)s©–QJ6Ì·á±j´q<=R„ø ]®í¡ê0Œh[¡íê(ä´­Ôv_uLׯÝtOuÌÔæLÓÞýê,˜­m£¶;ªŽyš£Êé¶ê\0Ó-¥ùïÔÅXZSº¡´–x*'§Í´â2À™0]S]+|@Æ›tÊM+a•ÏËèwEu5¬ññIÑätÖÂ:Ÿ¡†Pº¤º6h #œêÓFØäv©¶ ª›a‹6v&i+lóù댔Ωn‡Ú®ió“\‹¦]>¢ µtFu7ìñ9¯áã)í…}ÚœšÓ)Õýp@››ä£-„C>ÙhSu©›Žh{¨ÍÇb: Ç´½Ôv\5pÂgü,m>Rßx‚“ÚB®xX¼øimqüލÆ?«ÍÈ{ã%c§Ïk‹ý=¤,.0bäÅÛƒ}Y[çªÔUÕØËÈ×ç‚c}C ÃùãÅc÷(…uwÉÕ¤ãœ}Ãñ8qìchÄHÞ¡Ãê©j¤åkaš»'€mªˆq!¿€8ˆ[”^ÏÁТÚ¡Ÿ1B«1º7)œUŸƒaSÕ¸t±“çZ¶jHVcˆóÏP¶ê#ÙªøÆõPVm«bÕç ©³Uc°ÖÝuS¶êsÐ0ÈV¼jŒô«ÑæD[eqÕ)¼Jà*m«OŽÕû)ó3Ë¢s\õEéeÊ|ìÓ™”¾µ’Ñæ[êØ øª:–ƒ”2¿üÙØ:CàûÛØ´”ùõ8.óTgƒ/·cóaVÊüÖÛâa±5sÁÕØ‚”ùâ7ÇÖ¥°8eþäû¢ê’ilYÊüÕŽ¨.‡u°2e¾²*^m†êðåqll†m°>e¾ñÑ/Þ†o•cÛSÊŠçÛ»aì‡])Í+ÅÖ}_Aã©Á”–&¶„#pÆàpJë†c«ï«c§ádJ[¿m§À××±sp Τ´§[Ï{“&Æ®€/·c—S:¹%¶ºˆ»wÀ5ÈØ¸™Ò•£Ñ%¾ÜóvãGªSÿú'¶>ƒ')=ù˨ÆÕúó”ÆOGÕ豘Úx‘Òë-qÀLmLÚ:I¿Né›ßÕþ…ÄÅiQ’þä( ¦ô¶_ó°ñתæF&s)}ß@ô›ñ-Ÿ“ÒŸäÁ䌔Þý{ÑeÄ•ôü”~ø¢MÜ“KSúà’¨.ó®â|5¬HégžÆFL®Ié?U2Lò`r}JÕm&f&·Ãæ”>·6Ú?¹#¥/¬ýw@É=)ýÁ¦h[¬*éIIOöÓÿòÏÆcÉ0yަô×Õh÷d€|ýCQËÕ~¾ßøpTãÒôBÊ.‹ª©¡É+)›û“¨^õj±ûò¼ž²³JñâèÆåeÿ[ÒÒÙÑ9B~Rvý‚ègpN y2&˜ž¦ìö7^7.%c¾éUÊûç™”ý•f´ Â( ¤ìõ?ŠgYª: âBnÌ‚¸^ËC\¥Í…EKÙ'Cñ|q™·â:,žj-,NÙo™]Öxxúõ°Ö¥ì[ÿ.¶n…í°%e¿oY´í‡)û®÷Du7ì½°ŽÂ”ýO£ËA8‡áˆ—Œ‹À3p,eßÿÆ{9'` NÂ)8 WàlÊþä™è|Îø—à2\ƒëpnÁC¸š²å¯ÄÜpîÃxRöãÿ1ú=†'ðžA$X_&"·—)û™—ñˆWàšBuÂEþDÒÀ¡xñ 1N ¥ìçjQôÒŸp?!”‰éŽÕr%ùNÌLÙæ‡ã˜ À&(0±æ¥ìï¾-ºÌ‡@ nLP`b5,IÙ?|£_<}\€¯„°&eÿì·c+_&ÖA&b&klJÙ¿þ_Ñ…4[€/&÷&Hc¢gpbgÊþ]ä;± ø2Á—‰½ö-^÷ìOÙúLô;¤™ Íi&x0q4 Œ.Ç€/|™àË_&x0q: Ì‹~ ›8 |™àË_&h1q) ,ùÑ4 ›¸ ô™ ÏA&˜3q+ ¬þÓè|è3qè3AŸ úL„ÒÀæ_Îô™ Ï}&è3AŸ‰‚ÝwÄ;¾ñM¼H»¿;áä‡&8ÔÑÖáP§ÿÝðo*}:ƒiàįDÕ×Ç:êp¨Ã¡‡:ΰ™iàžx}:ôéЧCŸÃ:NùiàÚ;£}:ôéЧðÎXšîýRt‰iMudÙ‰=Нn4ëp£³6 <ý|t&R‡H"u¸ÖÙä@Ä#¸ÑÙ’^½#:³©Ã¦›:¬ë˜4î©C‹Îž4ð¦5ÑÙÙ§C¸ŽT‡Cu8ÔáFçHøöÎNPu8ÔáP‡CntN¥57ú9ñt8ÔáP‡Cuhѹ˜ÞùµèçÄÓáP‡Cu8ÔáPÇÙ§CÎÍ4ð!p‡>{ö<“sIçAx÷ŸÇVÂu}:ôéЧCŸÎs_‚Èñ4ðÃ?pÒê0§ÃœÎk]2ipè{Í0_…¾>:Õ„!†˜ ¹4ð‘ûÑoL‡0fÁXù4ð‹Îsȧ•°0 |æ³±u,†%°–ÁrXá@Äw{_Ü/¯J¿ò¾xØjˆ kÁWýËëa;lLŸ{ý6ÁfØ[aìƒi ùÑo'ì‚ݰöÂQØŸ¾ð{Ñï„CpŽÀq8ÇÒÀ—Þ8ºcp NÃ58›þôUl=çá\„Kp®@\jÄÞƒëià/<{nÂ-ˆîÀ]x ÷ÓÀ×ÚÑù<„Gðž@Èð, ô~4ú…>‡ð^™4!C­oÎôïŠß&d45ÒÔ†Òà÷üVl¥Em$ ÎÿzTiVËsjÌ©1¢63 ®üTt¡Ofµ<©6×îÇ,7jóÓà¦MÑ™aµ…@Ÿ}jd¨-Mƒ{~#ºp¨Æ¡Ú `]m0§ÆƒÚÚ4x$lªÅkЧóC95æÔ˜S#Hm[<õwñˆý°+ ž/E•45ÒÔHS#WµiðÚžèBšij¤©‘¦F®Ú1{/Έډ4x÷u<‚>µ“À¡‡j «…ëp> >Ý9TãPC5Õ8T» Ô«¤v# ¾úX<‚95nÔî¦Á7ýX´Ñ¬v(P{˜¿íbsjÌ©1§Æ°Ú3 M­`¶,ãð^Bßœá2ÊýsÎßžÒ¯LŸr`†ÒЛþwlýsÎ×?Uæ”™SfN™feF”g¦¡ìwFæ”™SfN™9eæ”—Âü44ýÑo©ìÇØ2}ÊKì¯ÌË,)/KCóçDçå@¤2‘ÊD*;.å5ihÙþèºò: R™HeF”YRÞœ†Öþzôc]y+©L¤2AÊ;ÓÐö‘è² XWÞ*S¥¼? íÿdt!R™He•¥ÊD*KC'^G?ú”O¥Ê”*Ÿ²—ñ68T>“†Î¿q°yUæZùEZ¦¡¯üatæP‘kÅ%@Ÿ"}ŠŒ(®HC1úq¨Èµâj O‘>ÅuŽŠ’.nHCÿ”‰G®¸ 8TäP‘CEn·§á¡ïŽ~ñXÖãç.9T¤Eq_žq3úæIS”~ñhžÿ­±õ¦Hš"iФ)òªxxP<›†—½%Aš"iФ)’«x ba ŠWÓðº=ÑùЧH®âM`N‘9Å;ŽAì-Š÷ÒðÖ‰x׊€>EúéSäFñiÞû±èǵ¢O‘9½ðàE>ú±•>ÅЇf~né1§ÇœÞ@þÃÑÆˆ^_ŸKÿ5ª\ëszÌé1§ÇˆÞŒ4|ëï£ÍzÎ>=æô˜ÓcN½yiøÉæèGŸ×zÎ>=æôÛs¹õÈÐ[š†_]ŽÎêq­çÔ£O>=úôèÓãKo]~ÓÓxázNA=æô˜ÓcN9=æô¸Ñë›ó/¿'ÁœžÃÞ‹w@Þž4üÝo¼]šõö³TÏ)¨w0 ÿÛwÅVgŸ‘z4ëñ¥w, ¿ç§c+‘z'ì[¼¤“Lïdþ±ÆVJõ(Õ#a4½siøCáiR=Jõ(ÕcNïrþhœnz$ì9õ˜Ó»ž†?ñ¡ØÀ«¯z¼ê‘¦w' ö‡b+{NK=JõžÂÃ4܈3CW=^õžxÏFO4½gi¸õÆÑ W/ä¢^ï…_‡iÖ{•†ÿç;¢ËkmH…4òâ Ñ6 úrußÕaQÈA¦§á¿x£Ë ˜ ³`6,„9iøk{£Ë\˜óa,†U°( ÿãG¿e°VÀJ{¹Wi¬N#CýÖÀZXëal„ݰ9ÌÚ·ÁvØ;a„=idá­è/?±Çj¹øaýJ#«þ<º¿¤¿ý(øýüíÇá,Œ¥‘­÷£ßI8§á \sidï—£Ëy¸á\¶¿ñîÀÕ4rìnt¾×áÜ„[pÃÝ4röAt¶®ïí÷á<„G𞤑k•è÷ žÃ8P¥;¨ô*<<]¨âJk´K•.Uº}U>þhww(L|8ªTéR¥K•.UºlêN–tYÒ|wvù–r<ŒMÝ9À’.Kº,鲤K¤î"ÇE(]Áw—¤‘o{O]útéÓ½ 4ëÒ§{-üð[£sºÌé2§Ëœ.sº´èöÍyÿºèGšn¬ }œF~êX´=úYCj^β¼œey9‹ñrãå,­ËÝÝF¾ôÉ輬D°/g Þì¯RÚ ÛÒÈ—G¢ßvØ;a„þIæ+?]öÂ>Øà0œ‚¾/ÿïëÑïkaïÆªœ18±¨ætZÏA,¾‰U4ÒèèµØp®¤Ñé?¡Ä Ýitþ›¢Ë}¸›FWýBTÃ4ºõ¿GõûjTiQI£ßôñ¨ ¹:-¾ù-Q<°^%W™Fßö±a!ÌK£ÿfMT…\]”Fÿý'¢—)Ö0[›’«.M£ï‰d,ZÉYŒ’«®H£ïTßX‚²&þØ7¢*}kNrÕõiô3£-V¤ÈÜ‚’\uSýÏ¹Ø ÚêŽ4ú‘ùQÝéuEfÍI®º;~b06ì!W÷¥Ñ_Þm‚wûA®Ú$SŒ66Yi’«Æ³ôÚoņØ믪ÇÓèᅩ6X›œ«žJ£_þh;íð¥JëPrÖ¡ä,<ÉYŒ’«rÃr“œ%(¹ê5 ˆE&9wAä,nÎY‚’«²ÄJ“œÕ'¹*K¬9ÉYs’³æ$giIΓœ…'9wP䬄ÎUc…8U,FÉUYR #^[¸“Y€A‚aQÈÁ4˜3`&̂ه90æÁ|X a,†%°–ÁrX+a¬†5°ÖÁzØal†XŠ´¶ÁvØ;aì†=°Áa8Gá‡0'ᜆpèlý«¡V)·àÝq$ÏÀY8çá\„Kp®ÀU¸×áÜ„[pîÀ]¸÷á<„GðžÀSxÏ¡ãð^Â+¼Ÿ¦µß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|[ðmÁ·ß|{ì‡pÈÐ&C› m2´ÉÐ&C› m2´ÉÐ&C› m™·eÞr[Èm!·…Ür;<8˜r¿‡ý\ÊíùŽ(I¿-ý¶ôÛÒoK¿-ý¶ôÛÒoK¿-ý¶ôÛÒoK¿-ý¶ôÛÒoK¿-ý¶ôÛÒoK¿-ý¶ôÛýô§»7múY€A‚aQÈÁ4˜3`&̂ه90æÁ|X a,†%°–ÁrX+a¬†5°ÖÁzØal†-°¶ÁvØ;aì†=°öÁ~8á†#pŽÁq8cpNÁi8gᜇ p.Áe¸Wá\‡pnÁm¸wá܇ÇðžÂ3xáÁ…”[ù·胔»ögQ*À8¼€—ð ¤_×¥.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýºôëÒ¯K¿.ýúx€ u2ÔÉP'C u™×e^—y]æu™×eÞyCæ ™7dÞrCÈ !7„܈À£”;ú7ñˆÁ”{p=“roþbT)Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4(Р@ƒ 4ú ÌðpÆÉY€A‚aQÈÁ4˜3`&̂ه90æÁ|XK`),ƒå°ƒá”+¬ˆ7´0åÞý QZ «`5¬µ°ÖÃØ›`3l­° ¶ÃØ »`7ì½°öÃ8‡à0£p ŽÃ ƒ“p NÃ8 çà<\€‹p .ø ×à:Ü€›p nø ÷à><€‡ðÃx Ïà9`^ÀKxÒ7Ë4£"ýŠô+Ò¯H¿"ýŠô+Ò¯H¿"ýŠô+Ò¯H¿"ýŠô+Ò¯H¿"ýŠô+Ò¯H¿"ýÊBX‹ 2TÈP!C… ™Wd^‘yEæ™Wd^‘yEæ™Wd^‘yEÈ!W„\rEÈ•ð`qÊ}×ÓØß˜8‘r“ŸŠ**¨P B *¨P B *¨P B *¨P B *¨P B *Ò¯lK¹ùb¼.#*<¨ð Âƒ *<¨ð Âƒ *<¨ð Âƒ *<¨ð Âƒ *<¨ð Âƒ *<¨ð Âƒ *<¨ð òÚmH…„!†…Lƒé0fÂ,˜ y˜sȧ°ÁbXKa,‡°VÁjXka¬‡ °6ÁfØ[!n9Ù;`'ì‚ýpÂ!8 Gà(ƒãpBK)÷jÿƒ¯v%Øœ„SpÎÀY8çá\„Kp®ÀU¸×áÜ„[pîÀ]¸÷á<„GðžÀSxÏ¡ãð^Â+yÁ.d^yAæ™d^yAæ…ˆ{_Ê}rEhÒ¢é|ÐäA“M4yÐäA“M4yÐäA“M4yÐäA“M4yÐäA“M4yÐäA“M4yÐäA“M4yÐäA“M4yÐ|SðM24g§Ü_}1v M24ÉДy“M'…&7šÜhò Éƒ&šï/'å3'•âØS>;AQ>sB)R¥|&ö< |æ˜RøBùL¦‹ò™þñ›5ÕW~†E€³¦(Ÿq`§¸;EùÌ!%¢OQ>#…)ÊOQ>s@‰òS”ψlŠòS”ÏìS¢üå3ò¢üT(¿G‰òS¡<¦(?ÊïR¢üT(Ïœ)ÊO…ò;”(?ÊÓlŠòS¡ü6%ÊO…òœœ¢üT(¿E‰òS¡<§(?ÊoR¢üT(Ïö©@(¿A)ÊG¿xúP~R¼—P>ž4Þx(¿F)ö2”w‡$”_¥Ç/”·;”_¡É„ò±o²œ å—) ~*”Á’©P~‰¥¦Bù8jü› å)‘u*”CÌì©P~å§BùȃòS¡ü<%ÊO…òå§Bù9J”Ÿ å#iÊO…ò³•(?ʇ”Ÿ åg*Q~*”‡(?ÊOW¢üT(ÂQ~*”Ï)Q~*”;)?Ê[?9žI3àsq¿i(ïVìqkÀÇCù!¥Aå£]Bù¥QåãaÓ ”OJ3 ”ט³]L¼VÊÃÕWJî(Ÿ§úRi>,P}¡äòr/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @ENABLE_GTK_DOC_TRUE@am__append_1 = reference subdir = doc DIST_COMMON = $(dist_man_MANS) $(shishi_TEXINFOS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/stamp-vti $(srcdir)/version.texi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = INFO_DEPS = $(srcdir)/shishi.info TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux DVIS = shishi.dvi PDFS = shishi.pdf PSS = shishi.ps HTMLS = shishi.html TEXINFOS = shishi.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html DVIPS = dvips RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(man3dir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 man3dir = $(mandir)/man3 NROFF = nroff MANS = $(dist_man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . cyclo reference DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . cyclo $(am__append_1) EXTRA_DIST = gdoc gdoc-error shishi.html shishi.pdf shishi.ps components.dia info_TEXINFOS = shishi.texi shishi_TEXINFOS = fdl-1.3.texi $(gdoc_TEXINFOS) \ shishi-api-error-labels.texi parse-datetime.texi \ texinfo.css components.png keytab.txt ccache.txt AM_MAKEINFOHTMLFLAGS = --no-split --number-sections --css-include=texinfo.css dist_man_MANS = shishi.1 shisa.1 shishid.1 keytab2shishi.1 ccache2shishi.1 \ $(gdoc_MANS) MAINTAINERCLEANFILES = $(dist_man_MANS) gdoc_MANS = man/shishi_ap.3 man/shishi_ap_etype.3 \ man/shishi_ap_nosubkey.3 man/shishi_ap_done.3 \ man/shishi_ap_set_tktoptions.3 \ man/shishi_ap_set_tktoptionsdata.3 \ man/shishi_ap_set_tktoptionsraw.3 \ man/shishi_ap_set_tktoptionsasn1usage.3 \ man/shishi_ap_tktoptions.3 man/shishi_ap_tktoptionsdata.3 \ man/shishi_ap_tktoptionsraw.3 \ man/shishi_ap_etype_tktoptionsdata.3 \ man/shishi_ap_tktoptionsasn1usage.3 man/shishi_ap_tkt.3 \ man/shishi_ap_tkt_set.3 \ man/shishi_ap_authenticator_cksumdata.3 \ man/shishi_ap_authenticator_cksumdata_set.3 \ man/shishi_ap_authenticator_cksumraw_set.3 \ man/shishi_ap_authenticator_cksumtype.3 \ man/shishi_ap_authenticator_cksumtype_set.3 \ man/shishi_ap_authenticator.3 \ man/shishi_ap_authenticator_set.3 man/shishi_ap_req.3 \ man/shishi_ap_req_set.3 man/shishi_ap_req_der.3 \ man/shishi_ap_req_der_set.3 man/shishi_ap_req_build.3 \ man/shishi_ap_req_decode.3 \ man/shishi_ap_req_process_keyusage.3 \ man/shishi_ap_req_process.3 man/shishi_ap_req_asn1.3 \ man/shishi_ap_key.3 man/shishi_ap_rep.3 \ man/shishi_ap_rep_set.3 man/shishi_ap_rep_der.3 \ man/shishi_ap_rep_der_set.3 man/shishi_ap_rep_build.3 \ man/shishi_ap_rep_asn1.3 man/shishi_ap_rep_verify.3 \ man/shishi_ap_rep_verify_der.3 man/shishi_ap_rep_verify_asn1.3 \ man/shishi_ap_encapreppart.3 man/shishi_ap_encapreppart_set.3 \ man/shishi_ap_option2string.3 man/shishi_ap_string2option.3 \ man/shishi_aprep.3 man/shishi_aprep_print.3 \ man/shishi_aprep_save.3 man/shishi_aprep_to_file.3 \ man/shishi_aprep_parse.3 man/shishi_aprep_read.3 \ man/shishi_aprep_from_file.3 \ man/shishi_aprep_get_enc_part_etype.3 man/shishi_apreq.3 \ man/shishi_apreq_print.3 man/shishi_apreq_save.3 \ man/shishi_apreq_to_file.3 man/shishi_apreq_parse.3 \ man/shishi_apreq_read.3 man/shishi_apreq_from_file.3 \ man/shishi_apreq_set_authenticator.3 \ man/shishi_apreq_add_authenticator.3 \ man/shishi_apreq_set_ticket.3 man/shishi_apreq_options.3 \ man/shishi_apreq_use_session_key_p.3 \ man/shishi_apreq_mutual_required_p.3 \ man/shishi_apreq_options_set.3 man/shishi_apreq_options_add.3 \ man/shishi_apreq_options_remove.3 \ man/shishi_apreq_get_authenticator_etype.3 \ man/shishi_apreq_get_ticket.3 man/shishi_as.3 \ man/shishi_as_done.3 man/shishi_as_req.3 \ man/shishi_as_req_build.3 man/shishi_as_req_set.3 \ man/shishi_as_req_der.3 man/shishi_as_req_der_set.3 \ man/shishi_as_rep.3 man/shishi_as_rep_process.3 \ man/shishi_as_rep_build.3 man/shishi_as_rep_der.3 \ man/shishi_as_rep_set.3 man/shishi_as_rep_der_set.3 \ man/shishi_as_krberror.3 man/shishi_as_krberror_der.3 \ man/shishi_as_krberror_set.3 man/shishi_as_tkt.3 \ man/shishi_as_tkt_set.3 man/shishi_as_sendrecv_hint.3 \ man/shishi_as_sendrecv.3 man/shishi_asn1_read_inline.3 \ man/shishi_asn1_read.3 man/shishi_asn1_read_optional.3 \ man/shishi_asn1_done.3 man/shishi_asn1_pa_enc_ts_enc.3 \ man/shishi_asn1_encrypteddata.3 man/shishi_asn1_padata.3 \ man/shishi_asn1_methoddata.3 man/shishi_asn1_etype_info.3 \ man/shishi_asn1_etype_info2.3 man/shishi_asn1_asreq.3 \ man/shishi_asn1_asrep.3 man/shishi_asn1_tgsreq.3 \ man/shishi_asn1_tgsrep.3 man/shishi_asn1_apreq.3 \ man/shishi_asn1_aprep.3 man/shishi_asn1_encapreppart.3 \ man/shishi_asn1_ticket.3 man/shishi_asn1_encticketpart.3 \ man/shishi_asn1_authenticator.3 \ man/shishi_asn1_enckdcreppart.3 man/shishi_asn1_encasreppart.3 \ man/shishi_asn1_krberror.3 man/shishi_asn1_krbsafe.3 \ man/shishi_asn1_priv.3 man/shishi_asn1_encprivpart.3 \ man/shishi_asn1_to_der_field.3 man/shishi_asn1_to_der.3 \ man/shishi_asn1_msgtype.3 man/shishi_der_msgtype.3 \ man/shishi_der2asn1.3 man/shishi_der2asn1_padata.3 \ man/shishi_der2asn1_methoddata.3 \ man/shishi_der2asn1_etype_info.3 \ man/shishi_der2asn1_etype_info2.3 man/shishi_der2asn1_ticket.3 \ man/shishi_der2asn1_encticketpart.3 \ man/shishi_der2asn1_asreq.3 man/shishi_der2asn1_tgsreq.3 \ man/shishi_der2asn1_asrep.3 man/shishi_der2asn1_tgsrep.3 \ man/shishi_der2asn1_kdcrep.3 \ man/shishi_der2asn1_encasreppart.3 \ man/shishi_der2asn1_enctgsreppart.3 \ man/shishi_der2asn1_enckdcreppart.3 \ man/shishi_der2asn1_authenticator.3 \ man/shishi_der2asn1_krberror.3 man/shishi_der2asn1_krbsafe.3 \ man/shishi_der2asn1_priv.3 man/shishi_der2asn1_encprivpart.3 \ man/shishi_der2asn1_apreq.3 man/shishi_der2asn1_aprep.3 \ man/shishi_der2asn1_encapreppart.3 \ man/shishi_der2asn1_kdcreq.3 man/shishi_asn1_print.3 \ man/shishi_authenticator.3 man/shishi_authenticator_subkey.3 \ man/shishi_authenticator_print.3 \ man/shishi_authenticator_save.3 \ man/shishi_authenticator_to_file.3 \ man/shishi_authenticator_parse.3 \ man/shishi_authenticator_read.3 \ man/shishi_authenticator_from_file.3 \ man/shishi_authenticator_set_crealm.3 \ man/shishi_authenticator_set_cname.3 \ man/shishi_authenticator_client_set.3 \ man/shishi_authenticator_ctime.3 \ man/shishi_authenticator_ctime_set.3 \ man/shishi_authenticator_cusec_get.3 \ man/shishi_authenticator_cusec_set.3 \ man/shishi_authenticator_seqnumber_get.3 \ man/shishi_authenticator_seqnumber_remove.3 \ man/shishi_authenticator_seqnumber_set.3 \ man/shishi_authenticator_client.3 \ man/shishi_authenticator_clientrealm.3 \ man/shishi_authenticator_cksum.3 \ man/shishi_authenticator_set_cksum.3 \ man/shishi_authenticator_add_cksum.3 \ man/shishi_authenticator_add_cksum_type.3 \ man/shishi_authenticator_clear_authorizationdata.3 \ man/shishi_authenticator_add_authorizationdata.3 \ man/shishi_authenticator_authorizationdata.3 \ man/shishi_authenticator_remove_subkey.3 \ man/shishi_authenticator_get_subkey.3 \ man/shishi_authenticator_set_subkey.3 \ man/shishi_authenticator_add_random_subkey.3 \ man/shishi_authenticator_add_random_subkey_etype.3 \ man/shishi_authenticator_add_subkey.3 \ man/shishi_authorize_strcmp.3 man/shishi_authorize_k5login.3 \ man/shishi_authorization_parse.3 man/shishi_authorized_p.3 \ man/shishi_cfg.3 man/shishi_cfg_from_file.3 \ man/shishi_cfg_print.3 man/shishi_cfg_default_systemfile.3 \ man/shishi_cfg_default_userdirectory.3 \ man/shishi_cfg_userdirectory_file.3 \ man/shishi_cfg_default_userfile.3 \ man/shishi_cfg_clientkdcetype.3 \ man/shishi_cfg_clientkdcetype_fast.3 \ man/shishi_cfg_clientkdcetype_set.3 \ man/shishi_cfg_authorizationtype_set.3 man/shishi_crypto.3 \ man/shishi_crypto_encrypt.3 man/shishi_crypto_decrypt.3 \ man/shishi_crypto_close.3 man/shishi_cipher_supported_p.3 \ man/shishi_cipher_name.3 man/shishi_cipher_blocksize.3 \ man/shishi_cipher_confoundersize.3 man/shishi_cipher_keylen.3 \ man/shishi_cipher_randomlen.3 \ man/shishi_cipher_defaultcksumtype.3 man/shishi_cipher_parse.3 \ man/shishi_checksum_supported_p.3 man/shishi_checksum_name.3 \ man/shishi_checksum_cksumlen.3 man/shishi_checksum_parse.3 \ man/shishi_string_to_key.3 man/shishi_random_to_key.3 \ man/shishi_checksum.3 man/shishi_verify.3 \ man/shishi_encrypt_ivupdate_etype.3 \ man/shishi_encrypt_iv_etype.3 man/shishi_encrypt_etype.3 \ man/shishi_encrypt_ivupdate.3 man/shishi_encrypt_iv.3 \ man/shishi_encrypt.3 man/shishi_decrypt_ivupdate_etype.3 \ man/shishi_decrypt_iv_etype.3 man/shishi_decrypt_etype.3 \ man/shishi_decrypt_ivupdate.3 man/shishi_decrypt_iv.3 \ man/shishi_decrypt.3 man/shishi_n_fold.3 man/shishi_dr.3 \ man/shishi_dk.3 man/shishi_key_print.3 \ man/shishi_key_to_file.3 man/shishi_encapreppart.3 \ man/shishi_encapreppart_print.3 man/shishi_encapreppart_save.3 \ man/shishi_encapreppart_to_file.3 \ man/shishi_encapreppart_parse.3 man/shishi_encapreppart_read.3 \ man/shishi_encapreppart_from_file.3 \ man/shishi_encapreppart_get_key.3 \ man/shishi_encapreppart_ctime.3 \ man/shishi_encapreppart_ctime_set.3 \ man/shishi_encapreppart_cusec_get.3 \ man/shishi_encapreppart_cusec_set.3 \ man/shishi_encapreppart_seqnumber_get.3 \ man/shishi_encapreppart_seqnumber_remove.3 \ man/shishi_encapreppart_seqnumber_set.3 \ man/shishi_encapreppart_time_copy.3 \ man/shishi_enckdcreppart_get_key.3 \ man/shishi_enckdcreppart_key_set.3 \ man/shishi_enckdcreppart_nonce_set.3 \ man/shishi_enckdcreppart_flags_set.3 \ man/shishi_enckdcreppart_authtime_set.3 \ man/shishi_enckdcreppart_starttime_set.3 \ man/shishi_enckdcreppart_endtime_set.3 \ man/shishi_enckdcreppart_renew_till_set.3 \ man/shishi_enckdcreppart_srealm_set.3 \ man/shishi_enckdcreppart_sname_set.3 \ man/shishi_enckdcreppart_populate_encticketpart.3 \ man/shishi_encticketpart_get_key.3 \ man/shishi_encticketpart_key_set.3 \ man/shishi_encticketpart_flags_set.3 \ man/shishi_encticketpart_crealm_set.3 \ man/shishi_encticketpart_cname_set.3 \ man/shishi_encticketpart_transited_set.3 \ man/shishi_encticketpart_authtime_set.3 \ man/shishi_encticketpart_endtime_set.3 \ man/shishi_encticketpart_client.3 \ man/shishi_encticketpart_clientrealm.3 man/shishi_strerror.3 \ man/shishi_error.3 man/shishi_error_clear.3 \ man/shishi_error_set.3 man/shishi_error_printf.3 \ man/shishi_error_outputtype.3 \ man/shishi_error_set_outputtype.3 man/shishi_info.3 \ man/shishi_warn.3 man/shishi_verbose.3 \ man/shishi_generalize_time.3 man/shishi_generalize_now.3 \ man/shishi_generalize_ctime.3 man/shishi_time.3 \ man/shishi_ctime.3 man/shishi_hostkeys_default_file.3 \ man/shishi_hostkeys_default_file_set.3 \ man/shishi_hostkeys_for_server.3 \ man/shishi_hostkeys_for_serverrealm.3 \ man/shishi_hostkeys_for_localservicerealm.3 \ man/shishi_hostkeys_for_localservice.3 man/shishi.3 \ man/shishi_server.3 man/shishi_done.3 man/shishi_init.3 \ man/shishi_init_with_paths.3 man/shishi_init_server.3 \ man/shishi_init_server_with_paths.3 \ man/shishi_as_derive_salt.3 man/shishi_kdc_copy_crealm.3 \ man/shishi_as_check_crealm.3 man/shishi_kdc_copy_cname.3 \ man/shishi_as_check_cname.3 man/shishi_kdc_copy_nonce.3 \ man/shishi_kdc_check_nonce.3 man/shishi_tgs_process.3 \ man/shishi_as_process.3 man/shishi_kdc_process.3 \ man/shishi_asrep.3 man/shishi_tgsrep.3 \ man/shishi_kdcrep_print.3 man/shishi_kdcrep_save.3 \ man/shishi_kdcrep_to_file.3 man/shishi_kdcrep_parse.3 \ man/shishi_kdcrep_read.3 man/shishi_kdcrep_from_file.3 \ man/shishi_kdcrep_crealm_set.3 man/shishi_kdcrep_cname_set.3 \ man/shishi_kdcrep_client_set.3 \ man/shishi_kdcrep_get_enc_part_etype.3 \ man/shishi_kdcrep_get_ticket.3 man/shishi_kdcrep_set_ticket.3 \ man/shishi_kdcrep_set_enc_part.3 \ man/shishi_kdcrep_add_enc_part.3 \ man/shishi_kdcrep_clear_padata.3 man/shishi_asreq.3 \ man/shishi_tgsreq.3 man/shishi_kdcreq_print.3 \ man/shishi_kdcreq_save.3 man/shishi_kdcreq_to_file.3 \ man/shishi_kdcreq_parse.3 man/shishi_kdcreq_read.3 \ man/shishi_kdcreq_from_file.3 man/shishi_kdcreq_nonce_set.3 \ man/shishi_kdcreq_set_cname.3 man/shishi_kdcreq_client.3 \ man/shishi_asreq_clientrealm.3 man/shishi_kdcreq_realm.3 \ man/shishi_kdcreq_set_realm.3 man/shishi_kdcreq_server.3 \ man/shishi_kdcreq_set_sname.3 man/shishi_kdcreq_till.3 \ man/shishi_kdcreq_tillc.3 man/shishi_kdcreq_etype.3 \ man/shishi_kdcreq_set_etype.3 man/shishi_kdcreq_options.3 \ man/shishi_kdcreq_forwardable_p.3 \ man/shishi_kdcreq_forwarded_p.3 \ man/shishi_kdcreq_proxiable_p.3 man/shishi_kdcreq_proxy_p.3 \ man/shishi_kdcreq_allow_postdate_p.3 \ man/shishi_kdcreq_postdated_p.3 \ man/shishi_kdcreq_renewable_p.3 \ man/shishi_kdcreq_disable_transited_check_p.3 \ man/shishi_kdcreq_renewable_ok_p.3 \ man/shishi_kdcreq_enc_tkt_in_skey_p.3 \ man/shishi_kdcreq_renew_p.3 man/shishi_kdcreq_validate_p.3 \ man/shishi_kdcreq_options_set.3 \ man/shishi_kdcreq_options_add.3 \ man/shishi_kdcreq_clear_padata.3 \ man/shishi_kdcreq_get_padata.3 \ man/shishi_kdcreq_get_padata_tgs.3 \ man/shishi_kdcreq_add_padata.3 \ man/shishi_kdcreq_add_padata_tgs.3 \ man/shishi_kdcreq_add_padata_preauth.3 \ man/shishi_key_principal.3 man/shishi_key_principal_set.3 \ man/shishi_key_realm.3 man/shishi_key_realm_set.3 \ man/shishi_key_type.3 man/shishi_key_type_set.3 \ man/shishi_key_value.3 man/shishi_key_value_set.3 \ man/shishi_key_version.3 man/shishi_key_version_set.3 \ man/shishi_key_timestamp.3 man/shishi_key_timestamp_set.3 \ man/shishi_key_name.3 man/shishi_key_length.3 man/shishi_key.3 \ man/shishi_key_done.3 man/shishi_key_copy.3 \ man/shishi_key_from_value.3 man/shishi_key_from_base64.3 \ man/shishi_key_random.3 man/shishi_key_from_random.3 \ man/shishi_key_from_string.3 man/shishi_key_from_name.3 \ man/shishi_keys.3 man/shishi_keys_done.3 \ man/shishi_keys_size.3 man/shishi_keys_nth.3 \ man/shishi_keys_remove.3 man/shishi_keys_add.3 \ man/shishi_keys_print.3 man/shishi_keys_to_file.3 \ man/shishi_keys_from_file.3 \ man/shishi_keys_for_serverrealm_in_file.3 \ man/shishi_keys_for_server_in_file.3 \ man/shishi_keys_for_localservicerealm_in_file.3 \ man/shishi_keys_add_keytab_mem.3 \ man/shishi_keys_add_keytab_file.3 \ man/shishi_keys_from_keytab_mem.3 \ man/shishi_keys_from_keytab_file.3 \ man/shishi_keys_to_keytab_mem.3 \ man/shishi_keys_to_keytab_file.3 man/shishi_krberror.3 \ man/shishi_krberror_print.3 man/shishi_krberror_save.3 \ man/shishi_krberror_to_file.3 man/shishi_krberror_parse.3 \ man/shishi_krberror_read.3 man/shishi_krberror_from_file.3 \ man/shishi_krberror_build.3 man/shishi_krberror_der.3 \ man/shishi_krberror_crealm.3 \ man/shishi_krberror_remove_crealm.3 \ man/shishi_krberror_set_crealm.3 man/shishi_krberror_client.3 \ man/shishi_krberror_set_cname.3 \ man/shishi_krberror_remove_cname.3 \ man/shishi_krberror_client_set.3 man/shishi_krberror_realm.3 \ man/shishi_krberror_set_realm.3 man/shishi_krberror_server.3 \ man/shishi_krberror_remove_sname.3 \ man/shishi_krberror_set_sname.3 \ man/shishi_krberror_server_set.3 man/shishi_krberror_ctime.3 \ man/shishi_krberror_ctime_set.3 \ man/shishi_krberror_remove_ctime.3 man/shishi_krberror_cusec.3 \ man/shishi_krberror_cusec_set.3 \ man/shishi_krberror_remove_cusec.3 man/shishi_krberror_stime.3 \ man/shishi_krberror_stime_set.3 man/shishi_krberror_susec.3 \ man/shishi_krberror_susec_set.3 \ man/shishi_krberror_errorcode.3 \ man/shishi_krberror_errorcode_fast.3 \ man/shishi_krberror_errorcode_set.3 \ man/shishi_krberror_etext.3 man/shishi_krberror_set_etext.3 \ man/shishi_krberror_remove_etext.3 man/shishi_krberror_edata.3 \ man/shishi_krberror_methoddata.3 \ man/shishi_krberror_set_edata.3 \ man/shishi_krberror_remove_edata.3 \ man/shishi_krberror_pretty_print.3 \ man/shishi_krberror_errorcode_message.3 \ man/shishi_krberror_message.3 man/shishi_randomize.3 \ man/shishi_crc.3 man/shishi_md4.3 man/shishi_md5.3 \ man/shishi_hmac_md5.3 man/shishi_hmac_sha1.3 \ man/shishi_des_cbc_mac.3 man/shishi_arcfour.3 man/shishi_des.3 \ man/shishi_3des.3 man/shishi_aes_cts.3 \ man/shishi_pbkdf2_sha1.3 man/shishi_kdc_sendrecv_hint.3 \ man/shishi_kdc_sendrecv.3 \ man/shishi_prompt_password_callback_set.3 \ man/shishi_prompt_password_callback_get.3 \ man/shishi_prompt_password.3 \ man/shishi_x509ca_default_file_guess.3 \ man/shishi_x509ca_default_file_set.3 \ man/shishi_x509ca_default_file.3 \ man/shishi_x509cert_default_file_guess.3 \ man/shishi_x509cert_default_file_set.3 \ man/shishi_x509cert_default_file.3 \ man/shishi_x509key_default_file_guess.3 \ man/shishi_x509key_default_file_set.3 \ man/shishi_x509key_default_file.3 \ man/shishi_principal_default_guess.3 \ man/shishi_principal_default.3 \ man/shishi_principal_default_set.3 man/shishi_parse_name.3 \ man/shishi_principal_name.3 man/shishi_principal_name_realm.3 \ man/shishi_principal_name_set.3 man/shishi_principal_set.3 \ man/shishi_derive_default_salt.3 \ man/shishi_server_for_local_service.3 man/shishi_priv.3 \ man/shishi_priv_done.3 man/shishi_priv_key.3 \ man/shishi_priv_key_set.3 man/shishi_priv_priv.3 \ man/shishi_priv_priv_set.3 man/shishi_priv_priv_der.3 \ man/shishi_priv_priv_der_set.3 man/shishi_priv_encprivpart.3 \ man/shishi_priv_encprivpart_set.3 \ man/shishi_priv_encprivpart_der.3 \ man/shishi_priv_encprivpart_der_set.3 man/shishi_priv_print.3 \ man/shishi_priv_save.3 man/shishi_priv_to_file.3 \ man/shishi_priv_parse.3 man/shishi_priv_read.3 \ man/shishi_priv_from_file.3 man/shishi_priv_enc_part_etype.3 \ man/shishi_priv_set_enc_part.3 \ man/shishi_encprivpart_user_data.3 \ man/shishi_encprivpart_set_user_data.3 man/shishi_priv_build.3 \ man/shishi_priv_process.3 man/shishi_realm_default_guess.3 \ man/shishi_realm_default.3 man/shishi_realm_default_set.3 \ man/shishi_realm_for_server_file.3 \ man/shishi_realm_for_server_dns.3 \ man/shishi_realm_for_server.3 man/shishi_resolv.3 \ man/shishi_resolv_free.3 man/shishi_safe.3 \ man/shishi_safe_done.3 man/shishi_safe_key.3 \ man/shishi_safe_key_set.3 man/shishi_safe_safe.3 \ man/shishi_safe_safe_set.3 man/shishi_safe_safe_der.3 \ man/shishi_safe_safe_der_set.3 man/shishi_safe_print.3 \ man/shishi_safe_save.3 man/shishi_safe_to_file.3 \ man/shishi_safe_parse.3 man/shishi_safe_read.3 \ man/shishi_safe_from_file.3 man/shishi_safe_cksum.3 \ man/shishi_safe_set_cksum.3 man/shishi_safe_user_data.3 \ man/shishi_safe_set_user_data.3 man/shishi_safe_build.3 \ man/shishi_safe_verify.3 man/shishi_tgs.3 \ man/shishi_tgs_done.3 man/shishi_tgs_tgtkt.3 \ man/shishi_tgs_tgtkt_set.3 man/shishi_tgs_ap.3 \ man/shishi_tgs_req.3 man/shishi_tgs_req_set.3 \ man/shishi_tgs_req_der.3 man/shishi_tgs_req_der_set.3 \ man/shishi_tgs_req_process.3 man/shishi_tgs_req_build.3 \ man/shishi_tgs_rep.3 man/shishi_tgs_rep_der.3 \ man/shishi_tgs_rep_process.3 man/shishi_tgs_rep_build.3 \ man/shishi_tgs_krberror.3 man/shishi_tgs_krberror_der.3 \ man/shishi_tgs_krberror_set.3 man/shishi_tgs_tkt.3 \ man/shishi_tgs_tkt_set.3 man/shishi_tgs_sendrecv_hint.3 \ man/shishi_tgs_sendrecv.3 man/shishi_tgs_set_server.3 \ man/shishi_tgs_set_realm.3 man/shishi_tgs_set_realmserver.3 \ man/shishi_ticket.3 man/shishi_ticket_realm_get.3 \ man/shishi_ticket_realm_set.3 man/shishi_ticket_server.3 \ man/shishi_ticket_sname_set.3 \ man/shishi_ticket_get_enc_part_etype.3 \ man/shishi_ticket_set_enc_part.3 \ man/shishi_ticket_add_enc_part.3 man/shishi_tkt.3 \ man/shishi_tkt2.3 man/shishi_tkt_done.3 \ man/shishi_tkt_ticket.3 man/shishi_tkt_ticket_set.3 \ man/shishi_tkt_enckdcreppart.3 \ man/shishi_tkt_enckdcreppart_set.3 man/shishi_tkt_kdcrep.3 \ man/shishi_tkt_encticketpart.3 \ man/shishi_tkt_encticketpart_set.3 man/shishi_tkt_key.3 \ man/shishi_tkt_key_set.3 man/shishi_tkt_client.3 \ man/shishi_tkt_client_p.3 man/shishi_tkt_clientrealm.3 \ man/shishi_tkt_clientrealm_p.3 man/shishi_tkt_realm.3 \ man/shishi_tkt_server.3 man/shishi_tkt_server_p.3 \ man/shishi_tkt_flags.3 man/shishi_tkt_flags_set.3 \ man/shishi_tkt_flags_add.3 man/shishi_tkt_forwardable_p.3 \ man/shishi_tkt_forwarded_p.3 man/shishi_tkt_proxiable_p.3 \ man/shishi_tkt_proxy_p.3 man/shishi_tkt_may_postdate_p.3 \ man/shishi_tkt_postdated_p.3 man/shishi_tkt_invalid_p.3 \ man/shishi_tkt_renewable_p.3 man/shishi_tkt_initial_p.3 \ man/shishi_tkt_pre_authent_p.3 man/shishi_tkt_hw_authent_p.3 \ man/shishi_tkt_transited_policy_checked_p.3 \ man/shishi_tkt_ok_as_delegate_p.3 man/shishi_tkt_keytype.3 \ man/shishi_tkt_keytype_fast.3 man/shishi_tkt_keytype_p.3 \ man/shishi_tkt_lastreqc.3 man/shishi_tkt_authctime.3 \ man/shishi_tkt_startctime.3 man/shishi_tkt_endctime.3 \ man/shishi_tkt_renew_tillc.3 man/shishi_tkt_valid_at_time_p.3 \ man/shishi_tkt_valid_now_p.3 man/shishi_tkt_expired_p.3 \ man/shishi_tkt_lastreq_pretty_print.3 \ man/shishi_tkt_pretty_print.3 \ man/shishi_tkts_default_ccache_guess.3 \ man/shishi_tkts_default_ccache.3 \ man/shishi_tkts_default_ccache_set.3 \ man/shishi_tkts_add_ccache_mem.3 \ man/shishi_tkts_add_ccache_file.3 \ man/shishi_tkts_from_ccache_mem.3 \ man/shishi_tkts_from_ccache_file.3 \ man/shishi_tkts_default_file_guess.3 \ man/shishi_tkts_default_file.3 \ man/shishi_tkts_default_file_set.3 man/shishi_tkts_default.3 \ man/shishi_tkts.3 man/shishi_tkts_done.3 \ man/shishi_tkts_size.3 man/shishi_tkts_nth.3 \ man/shishi_tkts_remove.3 man/shishi_tkts_add.3 \ man/shishi_tkts_new.3 man/shishi_tkts_read.3 \ man/shishi_tkts_from_file.3 man/shishi_tkts_write.3 \ man/shishi_tkts_expire.3 man/shishi_tkts_to_file.3 \ man/shishi_tkts_print_for_service.3 man/shishi_tkts_print.3 \ man/shishi_tkt_match_p.3 man/shishi_tkts_find.3 \ man/shishi_tkts_find_for_clientserver.3 \ man/shishi_tkts_find_for_server.3 man/shishi_tkts_get_tgt.3 \ man/shishi_tkts_get_tgs.3 man/shishi_tkts_get.3 \ man/shishi_tkts_get_for_clientserver.3 \ man/shishi_tkts_get_for_server.3 \ man/shishi_tkts_get_for_localservicepasswd.3 \ man/shishi_check_version.3 man/shisa_cfg_db.3 man/shisa_cfg.3 \ man/shisa_cfg_from_file.3 man/shisa_cfg_default_systemfile.3 \ man/shisa_enumerate_realms.3 man/shisa_enumerate_principals.3 \ man/shisa_principal_find.3 man/shisa_principal_update.3 \ man/shisa_principal_add.3 man/shisa_principal_remove.3 \ man/shisa_keys_find.3 man/shisa_key_add.3 \ man/shisa_key_update.3 man/shisa_key_remove.3 \ man/shisa_key_free.3 man/shisa_keys_free.3 \ man/shisa_strerror.3 man/shisa_info.3 man/shisa.3 \ man/shisa_done.3 man/shisa_init.3 man/shisa_init_with_paths.3 gdoc_TEXINFOS = texi/ap.c.texi texi/aprep.c.texi texi/apreq.c.texi \ texi/as.c.texi texi/asn1.c.texi texi/authenticator.c.texi \ texi/authorize.c.texi texi/ccache.c.texi texi/cfg.c.texi \ texi/crypto-3des.c.texi texi/crypto-aes.c.texi \ texi/crypto-ctx.c.texi texi/crypto-des.c.texi \ texi/crypto-md.c.texi texi/crypto-null.c.texi \ texi/crypto-rc4.c.texi texi/crypto.c.texi texi/diskio.c.texi \ texi/encapreppart.c.texi texi/enckdcreppart.c.texi \ texi/encticketpart.c.texi texi/error.c.texi texi/gztime.c.texi \ texi/hostkeys.c.texi texi/init.c.texi texi/kdc.c.texi \ texi/kdcrep.c.texi texi/kdcreq.c.texi texi/kerberos5.c.texi \ texi/key.c.texi texi/keys.c.texi texi/keytab.c.texi \ texi/krberror.c.texi texi/low-crypto.c.texi texi/netio.c.texi \ texi/password.c.texi texi/pki.c.texi texi/principal.c.texi \ texi/priv.c.texi texi/realm.c.texi texi/resolv.c.texi \ texi/safe.c.texi texi/starttls.c.texi texi/tgs.c.texi \ texi/ticket.c.texi texi/tkt.c.texi texi/tktccache.c.texi \ texi/tkts.c.texi texi/utils.c.texi texi/version.c.texi \ texi/config.c.texi texi/core.c.texi texi/db.c.texi \ texi/err.c.texi texi/file.c.texi texi/fileutil.c.texi \ texi/setup.c.texi GDOC_SRC = $(top_srcdir)/lib/*.c $(top_srcdir)/db/*.c all: all-recursive .SUFFIXES: .SUFFIXES: .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs .texi.info: restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $< .texi.pdf: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $< .texi.html: rm -rf $(@:.html=.htp) if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ else \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ exit 1; \ fi $(srcdir)/shishi.info: shishi.texi $(srcdir)/version.texi $(shishi_TEXINFOS) shishi.dvi: shishi.texi $(srcdir)/version.texi $(shishi_TEXINFOS) shishi.pdf: shishi.texi $(srcdir)/version.texi $(shishi_TEXINFOS) shishi.html: shishi.texi $(srcdir)/version.texi $(shishi_TEXINFOS) $(srcdir)/version.texi: $(srcdir)/stamp-vti $(srcdir)/stamp-vti: shishi.texi $(top_srcdir)/configure @(dir=.; test -f ./shishi.texi || dir=$(srcdir); \ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/shishi.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp @cmp -s vti.tmp $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi .dvi.ps: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf shishi.aux shishi.cp shishi.cps shishi.fn shishi.fns shishi.ky \ shishi.kys shishi.log shishi.pg shishi.tmp shishi.toc \ shishi.tp shishi.vr shishi.vrs clean-aminfo: -test -z "shishi.dvi shishi.pdf shishi.ps shishi.html" \ || rm -rf shishi.dvi shishi.pdf shishi.ps shishi.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man3: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-recursive all-am: Makefile $(INFO_DEPS) $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: $(DVIS) html: html-recursive html-am: $(HTMLS) info: info-recursive info-am: $(INFO_DEPS) install-data-am: install-info-am install-man install-dvi: install-dvi-recursive install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-recursive install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-recursive install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-man1 install-man3 install-pdf: install-pdf-recursive install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-recursive install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf: pdf-recursive pdf-am: $(PDFS) ps: ps-recursive ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-man uninstall-pdf-am uninstall-ps-am uninstall-man: uninstall-man1 uninstall-man3 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-aminfo clean-generic \ clean-libtool ctags ctags-recursive dist-info distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-aminfo maintainer-clean-generic \ maintainer-clean-vti mostlyclean mostlyclean-aminfo \ mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-man uninstall-man1 uninstall-man3 uninstall-pdf-am \ uninstall-ps-am components.png: components.dia $(DIA) --export=$@ --filter=png components.dia shishi.1: $(top_srcdir)/src/shishi.c $(top_srcdir)/src/shishi.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi client tool" \ --output=$@ $(top_builddir)/src/shishi$(EXEEXT) shisa.1: $(top_srcdir)/src/shisa.c $(top_srcdir)/src/shisa.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi database interface" \ --info-page=shishi \ --output=$@ $(top_builddir)/src/shisa$(EXEEXT) shishid.1: $(top_srcdir)/src/shishid.c $(top_srcdir)/src/shishid.ggo \ $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi KDC server" \ --output=$@ $(top_builddir)/src/shishid$(EXEEXT) keytab2shishi.1: $(top_srcdir)/src/keytab2shishi.c \ $(top_srcdir)/src/keytab2shishi.ggo $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi host key conversion tool" \ --output=$@ $(top_builddir)/src/keytab2shishi$(EXEEXT) ccache2shishi.1: $(top_srcdir)/src/ccache2shishi.c \ $(top_srcdir)/src/ccache2shishi.ggo $(top_srcdir)/configure.ac $(HELP2MAN) \ --name="Shishi user ticket conversion tool" \ --output=$@ $(top_builddir)/src/ccache2shishi$(EXEEXT) shishi-api-error-labels.texi: $(top_srcdir)/lib/error.c $(PERL) $(srcdir)/gdoc-error $(top_srcdir)/lib/error.c > $@ $(gdoc_MANS) $(gdoc_TEXINFOS): make update-makefile make Makefile make doit update-makefile: MANS=""; \ TEXINFOS=""; \ for i in $(GDOC_SRC); do \ BASE=`basename $$i`; \ TEXINFOS="$$TEXINFOS\ngdoc_TEXINFOS += texi/$$BASE.texi"; \ done; \ FUNCS=`$(srcdir)/gdoc -listfunc $(GDOC_SRC)`; \ for i in $$FUNCS; do \ MANS="$$MANS\ngdoc_MANS += man/$$i.3"; \ done; \ grep -v -e '^gdoc_MANS += ' -e '^gdoc_TEXINFOS += ' Makefile.am | \ perl -p -e "s,^gdoc_MANS =,gdoc_MANS =$$MANS," | \ perl -p -e "s,^gdoc_TEXINFOS =,gdoc_TEXINFOS =$$TEXINFOS,;" \ > Makefile.am.new && \ mv Makefile.am.new Makefile.am doit: @$(MKDIR_P) man texi; \ echo -n "Creating function documentation" && \ for i in `$(srcdir)/gdoc -listfunc $(GDOC_SRC)`; do \ $(srcdir)/gdoc -man \ -module $(PACKAGE) -sourceversion $(VERSION) \ -bugsto $(PACKAGE_BUGREPORT) \ -includefuncprefix \ -seeinfo $(PACKAGE) -verbatimcopying \ -copyright "2002-2010 Simon Josefsson" \ -function $$i \ $(GDOC_SRC) >> man/$$i.3 && \ echo -n "."; \ done; \ echo ""; \ echo -n "Creating file documentation" && \ for i in $(GDOC_SRC); do \ BASE=`basename $$i`; \ $(srcdir)/gdoc -texinfo $$i >> texi/$$BASE.texi && \ echo -n "."; \ done; \ echo "" .PHONY: update-makefile doit # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/doc/shishi.10000644000000000000000000001052612126773203012015 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH SHISHI "1" "April 2013" "shishi 1.0.2" "User Commands" .SH NAME shishi \- Shishi client tool .SH SYNOPSIS .B shishi [\fIOPTIONS\fR]... [\fICLIENT \fR[\fISERVER\fR]]... .SH DESCRIPTION shishi 1.0.2 .PP Shishi command line client. If no command is given, Shishi acquire or list a valid ticket for you, identified by CLIENT (if empty, default username in default realm), for the service SERVER (if empty, ticket granting ticket for client realm). .TP \fB\-h\fR, \fB\-\-help\fR Print help and exit .TP \fB\-V\fR, \fB\-\-version\fR Print version and exit .SS "Commands:" .TP \fB\-d\fR, \fB\-\-destroy\fR Destroy tickets in local cache, limited by any \fB\-\-client\-name\fR or \fB\-\-server\-name\fR. (default=off) .TP \fB\-l\fR, \fB\-\-list\fR List tickets in local cache, limited by any \fB\-\-client\-name\fR and \fB\-\-server\-name\fR. (default=off) .TP \fB\-r\fR, \fB\-\-renew\fR Renew ticket. Use \fB\-\-server\-name\fR to specify ticket, default is the most recent renewable ticket granting ticket for the default realm. .IP (default=off) .SS "Flags:" .TP \fB\-\-forwardable\fR Get a forwardable ticket, i.e., one that can be used to get forwarded tickets. (default=off) .TP \fB\-\-forwarded\fR Get a forwarded ticket. (default=off) .TP \fB\-\-proxiable\fR Get a proxiable ticket, i.e., one that can be used to get proxy tickets. (default=off) .TP \fB\-\-proxy\fR Get a proxy ticket. (default=off) .TP \fB\-\-renewable\fR Get a renewable ticket. (default=off) .SH OPTIONS .TP \fB\-\-client\-name\fR=\fINAME\fR Client name. Default is login username. .TP \fB\-E\fR, \fB\-\-encryption\-type\fR=\fIETYPE\fR,[ETYPE...] Encryption types to use. ETYPE is either .TP registered name or integer. Valid values .IP include 'aes128', 'aes256', 'aes' (same as \&'aes256'), '3des', 'des\-md5', 'des\-md4', \&'des\-crc', 'des' (same as 'des\-md5'), and \&'arcfour'. .TP \fB\-e\fR, \fB\-\-endtime\fR=\fISTRING\fR Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001\-02\-03 04:05:06 CET'. The default is 8 hours after the start time. .TP \fB\-\-realm\fR=\fISTRING\fR Set default realm. .TP \fB\-\-renew\-till\fR=\fISTRING\fR Specify renewable life of ticket. Implies \fB\-\-renewable\fR. Accepts same time syntax as \fB\-\-endtime\fR. If \fB\-\-renewable\fR is specified, the default is 1 week after the start time. .TP \fB\-\-server\-name\fR=\fINAME\fR Server name. Default is 'krbtgt/REALM' where REALM is client realm. .TP \fB\-s\fR, \fB\-\-starttime\fR=\fISTRING\fR Specify when ticket should start to be valid. Accepts same time syntax as \fB\-\-endtime\fR. The default is to become valid immediately. .TP \fB\-\-ticket\-granter\fR=\fINAME\fR Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm. .SS "Other options:" .HP \fB\-\-configuration\-file\fR=\fIFILE\fR Read user configuration from FILE. .TP \fB\-c\fR, \fB\-\-ticket\-file\fR=\fIFILE\fR Read tickets from FILE. .TP \fB\-o\fR, \fB\-\-library\-options\fR=\fISTRING\fR Parse STRING as a configuration file statement. .TP \fB\-q\fR, \fB\-\-quiet\fR Don't produce any diagnostic output. (default=off) .TP \fB\-\-system\-configuration\-file\fR=\fIFILE\fR Read system configuration from FILE. .TP \fB\-\-ticket\-write\-file\fR=\fIFILE\fR Write tickets from FILE. Default is to write them back to where they were read from. .TP \fB\-v\fR, \fB\-\-verbose\fR Produce verbose output. Use multiple times to increase amount of information. .PP Mandatory arguments to long options are mandatory for short options too. .SH AUTHOR Written by Simon Josefsson. .SH "REPORTING BUGS" Report bugs to: bug\-shishi@gnu.org .br GNU Shishi home page: .br General help using GNU software: .SH COPYRIGHT Copyright \(co 2013 Simon Josefsson. License GPLv3+: GNU GPL version 3 or later . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B shishi is maintained as a Texinfo manual. If the .B info and .B shishi programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/texinfo.css0000664000000000000000000000134612015626624012635 00000000000000body { margin: 2%; padding: 0 5%; background: #ffffff; } h1,h2,h3,h4,h5 { font-weight: bold; padding: 5px 5px 5px 5px; background-color: #c2e0ff; color: #336699; } h1 { padding: 2em 2em 2em 5%; color: white; background: #336699; text-align: center; letter-spacing: 3px; } h2 { text-decoration: underline; } pre { margin: 0 5%; padding: 0.5em; } pre.example { border: solid 1px; background: #eeeeff; padding-bottom: 1em; } pre.verbatim { border: solid 1px gray; background: white; padding-bottom: 1em; } div.node { margin: 0 -5% 0 -2%; padding: 0.5em 0.5em; margin-top: 0.5em; margin-bottom: 0.5em; font-weight: bold; } dd, li { padding-top: 0.1em; padding-bottom: 0.1em; } shishi-1.0.2/doc/shishi.ps0000644000000000000000000645662112126773321012320 00000000000000%!PS-Adobe-2.0 %%Creator: dvips(k) 5.992 Copyright 2012 Radical Eye Software %%Title: shishi.dvi %%CreationDate: Wed Apr 3 11:30:57 2013 %%Pages: 280 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: CMBX12 CMR10 CMSY10 CMMI12 CMMI10 CMTT10 CMR7 CMR9 %%+ CMTT9 CMTI10 CMB10 CMTT12 CMSL10 CMSLTT10 CMSS10 CMMI9 CMR12 %%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -o shishi.ps shishi.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2013.04.03:1130 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat {BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B /M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ 0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMR12 %!PS-AdobeFont-1.0: CMR12 003.002 %%Title: CMR12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup /UniqueID get 5000794 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR12 def /FontBBox {-34 -251 988 750 }readonly def /UniqueID 5000794 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR12.) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 73 /I put dup 75 /K put dup 77 /M put dup 80 /P put dup 82 /R put dup 85 /U put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9C535A5E57376651 F6823308463DC4E0339C78699AC82C769542FD3B410E236AF8AF68CF124D9224 FD6EE92A38075CAAF82447C7AF41EF96F3ADF62F76FB425BEDE4C4124E7B1E0B 8BF254D91912D3A99557F5427907A56514C5A3EB961B94112077FE9417B70DA0 B2E1C1FA3E1D6F01D11F640CF848E45BE3E205258E64FE36AFBD4DF4E93F6B1A 966C8E7FBE2CC8FF43C1F67BF6C361678B5E90F4BA524FE8A4CAD6AB28183E6E CA6C9636E884845105595A2E40CDBE8D4807A81AF4DB77B31873FEB221BCADD4 2C4669459704CB58A7BC230FC59F867EEADE660E49AEEDEEB042BA9A7DD8193E 56C3A36A1F639F7EA512EE4BC6992F52C2FC82A890EFDA730105B0AF7B819295 EE00B48F64C2B5BCB275B1DD62F289CDAD4AD9B7EF057684642FA6FA6322C277 E779CAC36D78F7779CB6DE12638B3C65B70C6B5F8A8C6421A379719B8DD44973 5F52856A4A29B2ED37F2B1FBE6EF4B79B7C0CD6395C756A00FACD763C235914F 847D1D99831023CE1FD89EFEC83AA7E313131C0C197248605EF5BA773D0A4000 72F607551A8EA6F0FF19441ACA179177D1FF7B423FEBDF58B0C19CAE3C10EEF6 3538D8FC4762B77C5AA023A8186C40D0365A4487DC3564265B3DF908572DEAA2 57E29EC669DD72974F806EFF5ECAFA9ADF1F9D2A63087FB7BBD100F0F81C6FFB B1EA1C9DD46548AEDD147EE64B1B4894972DAE1DC3E8569D6A3CEF9F9E46DEB7 547E10BB2959D374A33E47C58F1B20419920AB485F166062FCCC08EB5CC9AC88 F388F0C0155027B727729488E44CCABB7064A1432E179189C4627453C5231535 47D1F2B8BA43069696830CBB6E5F9A135CF22D3D1FE490A3A63C088EA32FF444 24A2427BBA63033DFE2E06DF8CE67949B6AB02F26335A376B57376814D2A7DE7 64A4347577EBE9A6E33DD2FC214A09C6D889C8FFBF1D567032548851B8F97204 49E215CC7D222F593E1EF1439ED60AD922D41E0E9EFB5CA48F2FEFF75AC5FEE7 FB6676D8B8D4DB6885FBE8B61B586313E4DAFB09D94CEDC0507E93000104F3DD F83865A2C6F6A7DA8562BF86F5DB233CC9B53391273A1462E40876A8AC2B098A DBADD5A160DEAC061F86A5FCCAB495EF8A9D121AF07928EAFD56F618E4EAEA97 CF89A3AFD406FC9DE1E9769C1E1EB83BB883786BC075EB5DA2692CD59C4DD7C1 7FD2FF9B18AC740A390C1DB38670DEB18C67721A1DCD502FE7368F47DB4281D5 459B3F020595FA3B10544AAE9EF786A0645FB7C9BB29D091E1432CD878A05918 1665643005BFD9A4B0FFD347ADC84CE22D6F9AD4EDC05E8C7179DCB360AB57D1 6ABCD200A4B4AD56825DC345984D9A3DE11CDA5E9EC1E5006EE4181E4EFE0846 67D8C27BEE8F84A1E01947E945BBE988702DEB2240C4BED952E433E5305484E5 71965D3DE95C4115FF78CE9EC18E323C599727C8B93CDFBCD1CCA780DB8C81ED C4B5E596E1603624308972FFAE9A57B0EDB51FDDB6E23EDE2946F61BEB241345 2A192D8CAD53E823D687F9C64A70A4B4B703291FA6317C051DC6A44BCCE0288E 3839D726A8F2E39BFF429865E95C726E808E02CD06F36C1CC9AC77999F8E28BF CE9D74B699CA982479E9D0DD98EAB24D29C981EF0349721D6819549A39413801 F80182D567EE316E2F0AB208068E15693E4C399A381BF9BBA625E597E6E109B8 16F3A84C8EC92F2ADE288821092A421A8D3B907048FE947230810F0777EE2542 29A3485223FEA079B359034F70464DAD2F0E420271A4E0CCF57A0ABBC20AB327 0CA71B292126D395E0D083B19BEC6B48A9DE2BF470C3D01A8C3F52075BD4BE02 A0C518355814478202FD4762EC542F8E7B9B1F7824F0554660CEB83E35635E1E DF0D03C94C903ECB36B4948ED98B6324E0094EB1DF70863142D4ED3A932D7346 39D69F8F044B6084482D7748C27328AFD24A3A70B99D1F7D32CB984488672254 28B6A9E9DCA2C9FF6A1B311D72413404B3CE5428BDB7FF3C36357D7975184F56 FA6B32AD54C37D0AF7576663AB1397B80D4E998F0B4C4F6D90B483029EF2EDA9 D4C4204C1546EFF3100629453EAE01918D09FE104E626ABA38646F17B6A94CE8 116BC7A8D9C319434CA5B830859B4164DFADF1D7C3ECA5C78D8DEA930EA4AC3F 59DBBF3148C91A2E807FB934E3439D4F67C6DBBA9972854E6E3688E1E0A34B74 482217CFE031CD7B5DFEF727C3EF8DAEEEDA08F4C90289E62FB2AF2357EB2E45 4BC547980FD479101FFEEE477AAC6268DD659E8DD9E244676FD3C6909713B71A 323B211E571BE711D103FA23B5B9AF077D84E2D20FEE805E81D20C03501F0F17 C3B081946CD0FD577F00E50B76CC37CFA97A61B89C25DD43911B28857284BEBB 5BEC61FFE3A14C64BC5425A7A82326617F6F1FA4FEAE56071C9F559F91568179 46369B394A5CE96FB7420FF8AB7C61CB83492FA5AE4A4B0799578594C9EA67E1 E54498AA5CD6ABA34AD3417F04F5D8D664A7EB39D41E2D17643CAEBBCCD9C38C C5C9541641A09335EFBCE0D276A54253EFD68141807A66F1DFEB4BEA5889FFA3 4D20BD52012206A9F8D3E0F6AFC03FDBBDF3E51506EC6336E249CEFB571AB84C BDF8E471E3795C04E38A5306BA6D450D72E50910D1AC385BB06CCD4B8E433A32 5A4B7FACC976BB31FCAA1E62DB2C4FE06DDDE7367930E336B49F47DAD91C8735 9A35D80CA2E117E86B52E41E9278046ED923454989E48610ACB3B1663F197117 52659A9D7BFA561C7ACE0771794FC778675F83C5EDCB132AF124C7E6540A140B E0A268836C73A3C746DC964E482E63C56C0D396515283970FBFF182F9F684FE2 655FD8F5D057D22246DDC3FD11B77552DB4D90ADBAB77BBB1FB1592129DE0AEC F822D7D36E52BCDABBD560B403A5C56C5E1BE789C3AC049318C7FAC5E5861E42 FD66C3C0F46361078D7E036281682BCE9BBF77983C93ECBBEBA9B359769CA442 87FCA1B98F4EEC4935CC93B08AAADDF355C99816453587310F08C50B9BA3D107 5388A1F3AED2AE32BEFADF0285DA90436D1D7EA85D7B9B6DF2AC4B778CFADFF6 6EEE54D1A1C5DEE3CCA7EFF57A7C2931933CEED90CA26DAAB45E4388EC4DC366 B9E88518D6CF094861D2A59282044CC06E63EFB390A6DF4BA5EAC7CE39E1EE03 3D84099F5BE96612789AF3EDED07266EF10A0FC23EA1EA97040B6BAA63138B1A A9CB8F5DED781260962D7618EDB200C3ED976033E8967A8CC676E9C11F74BE34 343A7ECE7EE97E8F76F7E95517A6D6163527406EF5A669535CB2BF4031F29046 BB2D0FFFB47A576F5EAB1D00A582965C56F28C00B3BB7BE2CC8D8391F789070D 775EB775437F0CD53DA840BB3575104B63E4B0BF14E3F14B320EDEF65FD4CAF5 8596DA491BBCF3153DED3B718F833D106432DF8DB8B8E6B34D5308C9010A5DD0 7E0E53260BB84BAB3EA748E8D72F75901604F80F4416920D69B4B983DCDB72C5 E9928F01A4A85954FD74578AE336C782CDF81D1EB7EBCEBFBAE7ED8AB4862584 397928F502D65139CCD582CF0723C5262EE54B9D2B8C39614652A8A90E1C3B65 7D26B99DA298FE4B9A7E98848F619C9BB4FF9FD215B72F99506F06355B332689 37D80AFD9F9ACD8172CDC51FCD3A759ACA0F7D4EBB07840840EE42C2D5B8B257 2C6DB3A7657B75F2F0B9730A20112745703E2D0FE709436CA6A5F36F59E64D9E 37C0A23D6D289E1AC1DA273872F5FC5C3DA2B127F078A4D7AB3FD7E124455817 DDC796D54EF26A1FBFD539D3A21B86DD4477DA49213259ABB3FF241424F2BE5F 89151E02FF87E0BEE26E85C0E518D8BE7CC9214B8E9A9EA1DBB49C6C212CCF08 90C0F23E9858947EE344062EBD9C574979087439975EAD4E85CD7BFAD3C91CF1 EFF577843AF1427D06CB2F3BB519ED1591974218C43F0D2038665F9E2E3960B7 FE68CD3CB2DB6B36C7997C6B21EC11CF1DE049541001FFF26D14C255E3AE862C 5A5701292FD2FB3D04523D6E2F3547923BB117718DFB6E6520F0D0B5450C695B 8C9242CC8671B7284CB2E1E9EB097A3DB1B4D5E8EEB93B4DC7E38C0A10474665 54DDCBAF079B92EA494F6FA75A84C5AAFE280284D0823D7C22249A21044BB0E6 4062074ECD17B62E03EDF4945A294BFEFB51F5FD870D9D7230FC91B83C1D85A8 86CDDF326FC90E04362145D6E8630C50594484FB829DA18F5C078F2EE67D2F2B 08DFF39AE2E8C9741FA989AE494C7166F122D2C5F71B97C973B7CE8500E9F87E D59C30F2E99CC4D34713DAB680598F41955FBDC26A14CF1E73D6BD6B9AAC8D3B B998F2D0D647356CD236DEAD6561389ED3A6746221B0CF15D6648412B35A6B54 6A0EF5BBB34AA376D9BAF025BFC650C1B74333CE85413D0EBB2F4D082A26A5BC 3C0A25D2B12CB159F140E00E262F1CFECCB2C802FF94CD34DA0CE9B4B3830FB1 DA85B9B670D5169928990A2E9CC869891CA2FFAD9774E6B92549644DAA5FE00C A5BE4F5FF91A0B6D2FD8F96121D766391EC4ED3E73DADD476B7DAE1A50AFCD98 DB7E27E44D30416088D9BC07D4661D9ECEC0806830ABF14CE55AA3CA2DF66E8E 748B8ED46466F1EEB072AC0674FE6FED231E0DDA59ED7C42BC05EF00E176050A C4834D893DE42474EA20DB1E25059E84BD137EF65A02CC295B0FFDE4CDE95879 0FE88BDF2519ABAE7F8CC3E6386ED35E04A14F1E3861922645E3A3F43B48A5AA 1999A5EFE192515FCC625C829FF5A7B337AA422F5E920545F9BB269C869A821D 6C4C26DD2AE746EF0F0B4C1E7E9871ADB5270E1CA9BE28225F7A0370D4C52422 E25263EE101C4EC1C7811B05AD42F364844A56BB91EE72FC8ED53CC6954D2BD6 F945D739BE4C61E36143CE890FC0CBF2F610018D678ECF7CEAB18FF5A0E48F76 FDE2463D40A99380D679B3B76D39C664F4992D23E5988B0D1AF33DFB04894016 E852EFD1EFFE586153C0F31ADBDBDE3F73FB49C5EE64D0D02E1504248FAFAC3D 903FD44679BB09C30288139B41B1E90A10139CA3172677250B16535A1F3E5E4B 6F4264DE58896E66051FC677030A121C5A285C47B6129CB5A3998830CE070D21 2F093FC1B44089F603A21F45F60960F134A47226874C737EF6C085634B0A4A66 139420501351F737A73F39D960EC38420BE46E5B09D298E7C16B8E32F01507D4 0141FC52DA1DE718D634AD9C8B00E46EEEF84356759324D2B9A3473C5DA38DE9 E30182B87F91B6A7F7BACF29A93B44C879CCDEDB063F9D2E51E0F1FC9F018FE1 2433D85AF24B55DE3A61C4D0A2DA4FDE933F5F6FDF17E9FA9932BFC46E2D71F6 585EEF5B2E4E89E797A24B799D7F064DD1A817A53677FC9EB8CC3E7F93FE50E8 D50E3191052943FD6C98B573BDD1F6D70349E1F8011599E3F8FDF1D6E80A710E 51E434E85801617C6FD8ACCF1B77B4BFCCDD35CB4C0367F4EB4D8D9DE8284D5E B4F43E2F8320C2C5A9AE90ECBA7E65D377E91DB69FEF27069235366AD3E126C3 A73CE97F4C90BA00D206FA012C327FD69EE59AF4470A315B1799CDC0539BF90E 512C8FC3BEFE4D1B01D969EA9E3FEF976CD6E0FA4C9ECEC955B265CFD58AB8E5 F7371E479279EE14B689269205C5B506940606CF3E24A1E7EFF3CA96ED30AD6D E243DE57690C3D69A401AB3315FA49E4BF4ACD4DD1CA39272533E82EFDD508E5 1C2CD286CCC5DE1202C7C7F654521750632EB637F918667E2233A43DF75239EB F28F3129EB5DEE2FC5BFC331FF709B0FE9B327CBBCE98BCA2C861C6547E50407 1218CEBE6EB5F9BABA4F2E11BCC6FB553A544A567B459E06375102C69F8018DF BA6A227CFB13E2D74E6A521E01B74F2963E9A0A1C9FD87A88EE6356E3BFABF55 BABC751D2BF85E6712E8EF57914920775906662E4BA68FFA21AD422D34E15578 43CA0568B431101A1194F8AB1EF25E886BFCDFC10F4A5EBD9530816548BC298E AE4A0B6B52B8B59C644C409B4191B6F4203F52314F2675F02AEB65A72C66E92A 2AC703E15D8D381522C0AC30C165B822A9B8D18CAECC094EDE020756018DCF51 D0701B507519C4270B70D8CE94B436F640C15872F9B5B77892AA3D110E4D6A65 8F0815C61A5127BA25815378683F46E69E54A391A8675977E7DF9C2D4E6FA991 9F029E50CC2F266B31EE9F9F24452D5838905F330CB7E416B8AF836C5AC26AB8 BE2ECC6EA4BDAA08C30995709E225C21D35DB6369167602CBFA8DB2697635925 969002CD1BEE745DA2E56C17EF3F0C05E3847147F86963C37A221C8827195A8A 3D38993E4939AC915BFD9A212F5FF3F826F742B952018986F9FBDDB69C3AC65A 845F7F33C55D4BE60A1817EBBCA7E1538E8087E1BD5C083A320D52953BE65F31 E8339C612A510B59CE48D2EF7061560C4AD258E7DC59694493E3AC878246F37D 6DE89253EBC8830C6B209E818213C4AC4CF1F391AD91D57BE76FB0E2924A1407 E4A949C905E44F54EAED6419F13D59942C8079336A172D4758BEB5D3E786FB93 3CBE4FD2EB53E4E1DAC34E821EB30FD44BC6CB4298242C38F848FC23AEDC9733 52BE6F32E31E25F18301370F8936810B0566B664B042C7AE0D78ACF0A87E5BF6 F9B66E358168B2CEA30DCD940074F3ADB793CDB136161FE2522905E87B8E463F 95D4DAB7E14A3DF7BCCE8141C5A08FCFA2BCE9F2D1B05A7642E75877EB840149 AAB007CD239AE47AD115929427717F219B0A8907F0EC79ADE1B901DAEE87A2F8 39361DAB43DFFF69650F601B24061A9353CFD619FF9626F63275FD09A5B13BB4 8B3379EC4D147C41197E8387FC04DA7BE409524CEF74EA91DC066808A7FD0EF3 957A44E2503EDA67B1C61827479486134E922E560A673BF314D601C66003CD07 55569085AFC8428389A140EB976CCFB8F29E27587E46C413ABE2EFB51AF5913F 53EEB74063162E0BA1E24CEDCA320377D3E11BD374F0B44E132A5C35835B6E2C D32948EF9DC7931D104C1385709DA882DED6458319F21C2329938396BC074106 CB9CFB9E0A915F8DBC8435F386917AC87A2BA45D857EC30ECA66FB4044F5439E CDD556B82A0E43418D179AD883C85AC276E1190CEC242E3E1D86E725ADC39E46 BB6C47FE9E17E29F8EA81E870302A00D91434F3B7A05F243176E6EF1082541A1 B9052191EE5C2B8E94A2E02DB65FC769653CA8D1C07A13CB853544AEC7FC35C5 218DE3128AA31952DCE19C55C23FD69BCEA2C661F57B11B8F9E86BFA718D1521 3346E78C701A5E51923D6D937E62FDE3669B214D240538F069A100A542720A86 31DE88116DE775F7ACC2A49EA6C02A24408271A846990669F2AF60AFAB4C16F9 7F4E88E917F0FFDCE68F22998AC0AF2A60A73258C3A4BBC42A2F918123128195 196D0E150D79AC3CF4628503D1F3FC528265ED8324E56849A47B3B07C29940B9 1BC270071E221D355EA51E9942D3BD7F99816304FFFC8F5B036C953B38759341 ED5D7B9C8E6B70C409DD8362FD291201CC385E4A98D73E8518A4C0E544152563 82032FBD2FCB6E403D34B85ED4053A8CB619BDD4DE001F4C3007B1F317579651 E6D6662189CC2D95AB85D7473F65C5D7B4AC63B0FE928F3400035D5A9D443D0D F3532B99F3AC26CB25EA3CD64C341159061E02EFBC7C033C05CD919BBD827A6A BFCF3BD739E32E7FE909AEE068D50FAC33605FFF98C7D0115FB860178FD03DB9 7985B78E0AC21F2EA065FA841F5928FB85163B2E2D8F850DC7EE313912C45C28 2783F6762C67882EFEDDC7E7567F91C16B16FD8D5A1ABF35B5586307701B91AD 54984598F2AD46FEE3D68A2731BEAA754C8E730FE0E84952EF77930E4118F8D7 2F3AD753B26032C02731A33F2AFEDC38FDA8EBCFB052472A98E9CE937CCBED9A 4F5D703731C17ED97C5B5BFF3099DDCEC3587CC5B109B73148CB30D76BDAA84D C39F34AB497ABB0992EBDC1CC5D85B3B6ED6498D435DA5A3D404E01163ED5318 5468808F667B8AF573098945D7CEEAEF55B3E4368E27D55676898B9A1750E3B7 31E9BA9B01268DA28B5F2850B6710E52AA3C253A22AF907059B1707D91A4FCEB 1E50468F4CAD6A7D501D4F3815EE52D5630999C92E9D6D1A40918AE89EDAEA21 73C69C56FD7D5070CEED71F02288257747B9B254F4A85783E9059D921DA688E4 AE899D58A47FD43B86DC11C7BC1A9A985BAE3303FCB28E706B593CDFDEF9C610 F37A43BB77ED5237CF06071169D953E3869E85DAD4D3A7B081E7BD4E46E0FA7B 26B6070770BAC98460C1B8344B7C24BA0B118A7FC98731AF5B116E011FCD586C B96B7E595DA03A17AC4D967E7122D39D28D6663B9318AA67E31A4BF86F7016C3 8F766A9E8442A7FD659C6E10C14F2F6BF91A05BE8D6663815FA21CF7349333D2 CBAFC9C2304A41F43D2EAB4921FA587AB0D5C6DAEFB5E3E7A6A843726A0EC9D0 7EBCDD88E683FFF30934919AE50D1DFA04ED57D3D1070285129644B4EBE2F60C 4E658961E16CA722C647E7CA9E960D77A0846EB13197FA43C113B7D06C0BF8AC F564735DBCB1816394436071916039FC352C10F1BDCE1376B64F023CDDD3199D D535914EB055DE276F1BF2D1805E938798B648EF2E5A7F385D08D3B1C74DAA34 ACD220579A36CDB74BC3D4E6C0454BE99E0C6A75D855236BF784A91D0F2BFA3E C4E4F45FF1EF87D6A450CD25F2C866AED29854BC678D3EF59F21CC62E66CE757 8C5B60FCC079EF995D5AE5B2BABB4CBFC883D95488A9119206305268E057B58E 21D07EB55D6BF98116507547D9EEA2BC4EB81CEFACE09F7256F1FDDD1D2CC5A9 8AECDD376B3FC08E1BF0CC8B22F37E957534642A21A16A3AB41151657CBACBE9 5CA20FBC20F30AAA0D04F25E88360057FB09A699F549840105ECE3FC93949075 8145C8583E34D23E53F7749050FD4BD16702E5E00A5242E5911AD867B5249F51 50B2F8D458CCC4252017D481F5E577A4504A945DDC792AE74934739D7B64924D AC17DB9B6068A68B54529BDB2B72E6757EDC3C81F1FC80953ADCB0E7FFCE0ED6 C2316800DB8FB4CF892ECBF103867A5011B4B40062DA21BD4C5831363D2DED66 97D367DCD31A2420207886D8BE46D0401A8CED51BAE03246329312F5C6616729 19A4E3521AEA7F853686474E14A0ABAA5CC154E330EEA60FADF730146F749634 6420051046C4F8AA194831166664C2733FBAE6C019B2A903688299D1D2B8C952 1601343FD98F61C688A6DDA02B0650A582266D2CF5F8A5ED8FB1F3FF66038B99 41E05C1A10363F90ED08BDEB0CFDD6128FC061E7EF53AF94D290F2B53CFFF17E 6D77FA44E24AEA5352C9B7789EF48DC7D6C39192FE984EB6670FEF90AB1E64AD B8738E739401A40A9BA3A2326D00758DF5D608B5860B04417CD06F4DEB28AF00 59A210DFB019CD95A88D20FF51D44C89B863327EB43D5B9662807A0B65DE4115 4176860D3F7AA82940EEAB87A70710F6AD68C64D7BC0B2F2FE4EB6B5B97546B1 F1B5F87B3F7600F5837F17C5C8DD8996FE2853D65C48418668CC889DDB6F14FE 7FE57398E9DF9300AE63A15A7D271CBEFFC0194A66D25A7EF72BF8243BD30E5E CF7CD36976C19CAE7C84C2F23EBD98F715143F50C866C6683384BADFCB2969E2 2E9A8302E3E1DFF12D2DE2DD538572CC4329F6BEF5D9499FF1A3C5E7D4E7C760 5655E25816E3E62B349E54F0A64A24CCAA366D722380B44830E9F5D1045609B4 909CB0EDADBD51B2AC062941654C50BD11B61D359696369860F6D0ACC7A2CB4C D8606C42E33AAE83E984389A3B96F776BB95B2DD49A5640E34804A94D3FF056D 91EF0CE5E6A4B71FF689619E9CFD9029AAF1173764C26E3ACA7F8469B16B2928 8801A4D666DBEE3CC7DBC24A70B81A2679DEF1F6DA93143CECDAE3EBF93F457B 4F35E0D630386F6281A36748540F49AC5D9DDDDAD543D7A3B3F711D877D075D3 24727F4E7ECF3BBE2975CEEE39D52F1C7D8EDB3B6F116D600101A74814F9F457 A8571DAA793DB42551FE1927C5D7CC91F12A3E65CBF6FE5F50A8C3C201CF1435 F5F2D975A309540280468A0F157F88828C3EC2A21307C354DA4C25938B7D671F 3A9069E671887359C0DB72C913EF4C7FB7CF79E636414274A2772C8C718CE6ED BF1CA692DC3362D52FC66B2C0131E822B432397C56DB8A7757213DDACFD7BC72 1D8D85D407E6E7A510EC7274F914B784B358180A43EB0A299592CD6483AFAF25 FF29EA9B752810CBEC400FA681A0EEBE9E545F87E53D6205A1F56E7FECF46953 2C3408377C636A1C7837526A07544C4D6DED2487684E2B539E0EAC0F22A315E9 2CFCAAFC699AB07975391A7D0D0A949599023996590CEA0D72A6D54428E032DC B1CD8276454669506F464D02F0786330AE46F8C1DE3592F4421A8A5B35F2DF66 B7C4C3C704199A497574602C018818C985A5E5D59699CFCAEE0CDA002B4D533C 9279B59BC9F05728A29CF321138495B300A6B5002FF18B0F021DFD077E24E565 6B19C8AE6426A57F515C4274980EC159389DDD498AE68F510DFB1F20F33F6FD7 A138E333CAC3F43F915657BFC894875BAAC5219E2ADC77ABCB663A59F0D1091F A47DB7836CF007E97C677F32D038384234F938C8B64F7EF5AFDC6D94F2B16AC3 7DBF1599F99818E708AF34B5EC300118E48009C50091A6B61198D18704257D55 44EB8F3E5157C50570F98110607A91F861512F2DA62D849CC038A8BEF8F235D4 1333C94D6EA5BD27573A95C828745919D9A1844DA923DE21E436F8AC7902326C 93608E6D72E81DE570163DE2E959DA5F6B95EB9188AAA69348A5593B9A0B69B0 E8702909B61FDF6A3DF9BB2585C5516AF83BFEDDAD5382D5BDBDD1682F448E76 D5C89F4FA68D95FD0839E85061D40C33AA64AA077B057B72B42E028C3D50BE01 FC238AB6C591290A9C0710119B3419DB887655DC98D76ABDE89990EAB1F829FB E89149EC74D012FB3103F6DA8B80A249147F1C20EC82D07376186CF5784DEE7E 1919625227181B3233AEE5286212A45949AEE65472F7DAD6307CB65F4161E31A D8CAF2241EEF6D7E930A919A680B800DC48130261D661AD397080D3E7578961E D7CA572911D5DC42FA0001BB6F5D25989418A3E6EB2F24B1785414ABB687C33E CED7A8D14511C79165B5315384F5DFE1AE2E3F77ADAA6D2B3AD382672DFCD7EB D917D9D58D22B01595202742B3EA5C081F0ADC64FDEA379CEC2433BB009EA856 55383E4E15CF659AF1A31B90323F0F9A5B8E90AC10AAD05AF49A48F3D3AF7AF0 78625F372E20AD4A762DB16573105FC0C652130FF51E86FF0D8BECAEDEB598AD 3F4EFADAEDE71B0310E7B88F2CB558C75B97F4084800A6B0DEAB45B3AA225DE7 D7FBA678308326F7E422C69CB77A0E409B4D5E17DF7F054DDF42B6F64370F789 217050F4844A5C8ABC0F076DFB5FC05A697DB133B753CE8C2163A368554D7566 485F5FB7FF1FC8ACE802F49334F929D6BF1F15B3A53435C1743B1393634BBEAC D20D086ED282780DBE5918DF2B0862F3DDCE9C30EC9AF9C49AEA477588B4506A 52D16A4BDE50E41DF4438922ACDC63FEFD5D76986447FDFE5B6080567645B51F F057E6D15FE4C47244DAACDC2552E5D3D11F42C964A281E54FEBDA9B4BAE6993 99016BE052738A844464398D235DC013CD2E0F9D8C79113813F6A74A7317271A D0CC651D22806F42E5EB1B7DEDC8D4FA7AB670FF59BB6493F6655062EE4451BE 2DB8851F7459019ED02939D1855546AC00012BD1D48DF6444D5C6C41A212209A D32AD508913A02C13FCA0A270A2C2597B19C5BC32D326EB5CA4BE72AFAC638D6 081F63CAFAA6C88263DFE2C05E21D6056988BF065E404C58D274766075BA0425 9A10C309E40F04620D8C3ACA0B53DEA440E18BAD139A837624CD145331C9DE89 5E2308F8A4A50156403BFA87CF94124C94C0CFAF4DA22B30E9BFB5C3EADA8BA5 B7B54483C7A002AF53FBCBEC1A09CA4AA1B47298251093477508E09638445110 D8756E71199F38B710CC89723AA71260614EBF8018C89E678039121EC4518BBB ADB94678398F18ED961BC147BFEC49679736A26A8CF621EEF4CCF5EDE2E930D4 B1B0B714E88CB5EA7D283DC5BFE963DA60E974ED14F8C03A2B4911E22D260F6F 1B5E3209E177E10755172487CFDFB881752DC5F9366B6022E502ED39217C93FC 09D5F41DEFDB6B594C1EF539FE86A337BD182780389CA02158374F32EDEFF099 06C9A7A6C42F8A7CA99A8D2F108DBE32B67A7255086C8E7537007DCB326FC1D0 BC555EA557EC6C5DB4A1099123D82CACDB905D29A97C653E018F256D0F195478 0E32E5BA713F8250A9C6A70D5C23E44F0C181DC91768260AA8FAA95144E06857 8D95AF4A4F63E545D26DEE9EBE4E7941A772A49EBF3508D364A94A6C709C7DA4 C242B82FC5C0BDD7CC2520BC68D8D4B1453BC4D79C0C5AA792BFB5004B54A863 A15FCC24AB16EE2BA8271DD5FF5FD43224CAB47FD72C8582AF09FB9E7729A9CC 1103F2131CCDCA7C32EB7EA201F6DA00604FA4EC7D6D996C97B8CDEFF072FD20 1F5F12419E6F55DF2B01307BEF1FB190CE93EA2CD83CAE590179A69589F59743 06E79CADBF8642DC535387F2BAAE8C45608DB852FD02076665E2FD95EE2B1B48 CD005AA0D136BA1079EDA5BB678EBC09C9F35BE8791B12B35AF6F4F847447E7C 8869656013EC3E59308DB44D960D68435494490305263D6F20B694B78B98B528 500D6BF1EF57F8DC1568D0825DDD7A5C05A8D8DE926D04DB7F99D1ED5C3A91BB 6D2EB0C7FEB9A0FD431A6F0496EE92C68AA4C6D2BDA70527A506EAC5365ED584 0532CCAF4F0C31E7D7CAF7A1FE4A41DB3F6C4307FA298CCEE8F20DA25405F8D5 31C528F0DA5603F54504168E2E701E9EAD031174517D4C1712AF445AE925E5C3 664E9E435F56C730342F8304A681DD97D6FD66FF770DBC9F16C51F2889265E3A 4709685F105B760BAB45C6B3B23C81CA9B018AF2D5ADB650A4864FA31C1C2568 04AE98BDA68F57A1A9B91AAB82EBB7DB1DD802908E6A1F25213C6033112EC014 ED34C52E2A12C703208E662E84A7C5401B7C1FEC1C11BAD1A998885797224734 67B991486E12E6EBA5EFD8AF07EC2C12B26A2295E9006B50CC00305CF5E21949 A3033EEFACF38209F25016DBA6EE9899EE197E242BC1CB0CB04B87A5EC771360 C1C2763BF1FACE3FCDB3E9AC56E3E4734405168DDA712A4F4D1BDBB27BEC58A4 D402347F1EE5B33D7DB47F5C7B2B4284169F6B0753534546582C1DED7DA7583D B1C3D9820214BE2701A6AECC4FBE5AE9A6EE86DC20665A58375C4BFF1F74995E 09BAEB61883B023A6E7CD47CD99A35F69E8E54679A2D2E689BC856660E649AA4 B5498ED753599039A793A92B894B50EFB19206D38AE70ACD8181DCB6F88F1C8A C5AC3167CBD76841BA414596D1E380CC405FEADF5371D0020B94EC96AFE0A0A2 6589E7DFE1747E17C6CF5B5E90DB3597F1226BBAE780D6F12E230DDBD3517CF2 983DD7C346BC29A65C961CC7C9235E4811F3786DF53C1E66401E38438B05A118 B7780C2D1F8C668D4445B5DD97189E26DA0E16F1E38C42637805DFF8775A2F8D F39F50B883F1C2232DDC6B45B505662DD07068F68FA840A1036CE0CFBB308256 DCE5C9CDF83825B3F51F96F0C427E8F2A9B54DAC722B45E20F69F1FFA0C2FB06 CA887AB385256AC720E4FA1FE4AC63223A459A9F538B051A9B154C6D3A0D917F 96F12DD4D134338C00D12A5F6215D4E73F72E3F5010A91410FD65A04CD7701E6 C1E01E767F0A0EADBE25FFEEC9C63FB07982041ADBC67D2086F7ECFB769D24BE 2A5814971060429F947A3DE190DB3142823E9BAE93F5783397DB092E710010D8 0BFF74490F7AD01B2587366CC4062F938EE1CFD8D9247A330880ED83156897CA 613A1EE6114A6023A0D7D9B6E39C4C9CF34D68CE02AC9B686316E546326C318E 766E8D5AF8FD02EAEBB56EFFF5A9A7B1874BC6F9A180665812DB389F1BAEA4CF AF9DCA438C61F7D1592F4F05CB025CA80301D7CECDE81C66BF311ED5EA9FBAB6 E327D72BF5F87CAA5549225B1265FD66D42E8AC6788C8EF4618A1A8CFA2B3CCD 1B4E615858AC8F750B6FB9B74BA87D5BBC52E505A8F647B18E8EE216F6F3D306 A631D14CC762726193E891C5726B66D279465855941F395E34885399DE35C3F8 D29915B599B398F10330DD7895A405DC194100BE729107780F1C7F1764B76E60 5AB510382EF8A126DA2A8F4B086B9A2C49129DCF6372674E8EAFB83890773C6A 3290858EFA846C29B0BE3841BA205E3D199200ADE7702642186BC43A63CAD5D3 DF041B7725C54DC2147D79CD5FA3482C5048CB45C1EB647649DDF7A3CC7871D2 96EB3B6F5ED0053962A9DDD8326A65838BB374E222B6426D8AF5DAFBC7B142CD F4FE23E480013D462E1A7302C0361390B233AC37BC563F53D2CAC75E842C506E 331967B4CF496493EFCA9E01B6F091C2956F8A3DE6F771E83227D4A97E15A82F 9B3A5BD553C4672C7697C3D0521A1C2024A7DA906FD4A00B92F61C74D5C42580 794E0A2786B47103184B7FA929BF18E8F325A57423DD88798AFD8D27E76E026A 790F1157E774E25882FC850214D265C8CF11D4741471E2483F18A51B0D6F5868 29D16993712CC2C391785B8EB1916B46502F17FE4CE8C68047C177011F120A11 A3CBCF666C3A8BE4977DDEA6003595F0586E658E87C0291D04E819E6FD965CB0 3638E21977FE4CA15710947F3DFF4B0FBFA10AD549BC68331F6ACABFA17139C9 AB6AC05EDBA3F0DF2239EBD068D131C7F30205DD7EC2197B8EDF990040B69B68 2B09FA636B3948F8418819995B376FDC7AD0CC6B1728358FF86AF01F91943A51 318CCA94847C444150B3CEC9863F1C1FC2B4518C451E5F9CFE0A4F6FDA825E00 3558F6C2B147FC4E8FED887F410DA21505AE5D5C538561D346106ACC343052EB E15512CCC90F5BFC8B31DC307AB8D589E2939BA51477B6AE44C6E4000F225CBD 5C4F23E48FD6B5CBF84CC7DCB7B5753B75773EA7DCD372E719F57E77B0787967 BB170960E8EF4EC0F15DC26C713F2AE6A7A316904FBE5AD56B39068BC055FEA2 A5CCE54ECAD859AAA13267D037BD91A0F1879B1FDB9C1AD389C93EF9A063BAB9 0E49FBA91A5F2D559A1B0AA2186A9A43F19A399C04664A6A990F965E5E54B894 BEE211A5C22233F8F0EC3965B567CBE14ABB7DA568A88B6873411ED81D537B85 6F9AE444D8403BC979F9624F39128B7F7918F01305AC244A223AE3C10FD023E9 F91705182A0492F7AE375E492C72B8336CA68D1B33919B5013FEBCA76506CBB7 635E5626D7A2A0F797004DFE0C60CB2C9975582DAC3CC8ED8E96FC3C293C5E7C E6135D7A92E030D993E04D0C2E929AEF3C8093BCCBA496F8407A67832175912A D822770456BEBB654F4D7AE693A4F2D48E8AB6D5401A3A41437D6972E833CA4B 854D24E6B7244A45C23319FBD9E2CF01D9A77004BFEA618B045FE101297FD739 65A2D4017F7493851E28364B0C3E30983A1EF889E7500D1878AA828FB9ABAC42 E4B9B20A49E89D91E45EFF3562024EBA64AF46D804BF3F893E58908558DDBD96 CEE0ACDE00346388615F9C04703961686C3DB1A4C64E4620CA6D7A6A33C6E104 402A74F3846F5C989BAE6048523CBE24B58DF6707CF9359C5F0433C44DFA8C79 415ACB31CB37459A381780B903F9E9E1713DF51770079B7512FF2E49888FF477 A9CE517F2EBFA2D6BAD7A9BCB4FBE049B772F9098F879E76C22B7D7417F42B4A 5EC558DBC843A9738403FAC021783E80DF860CDC5A9366AD6A3F6ECEA2CCC797 1B8092838A4F883588840730BFCC67E5B19BA303FFED79CFF5E2E1E7F1F3A033 55B271CB5A5A4A3185D720F2DB584170AB9D43EAB356432677556C55342AAB25 3CAB66D876AE3C152F973128E67009D493D40FA08758139DD321138D01ECB525 E8C2BB88F892F86D9D4B02F33283C9C740EF3F159FE14F8931588A403D6A2D9F 64E1054E2F017BEB02E2214DF41005AC57CA7A707308A295E094246B5C73C41C B48619D07948750E0E1117A0414B809E3177AF8064EB039D596D86833F77221F 5494A5EB40C4D86A6EB7252BFBB7F737450D3030D1A2EF579AE185E54B209C16 905A0C71C9ECED14ED44FDAF51F76AE896E8EA5830F5D016E590FAEA3C1DF5FB 9F14FDF2A335728BFA09F71B1D5875A29F1E8B555F4514186DB4FBB6E0012B54 3B30F70E2BDCBE802A639CAEC3539B07694D26A3A16318F57D6C860DDFCD6CA6 BE2368736B5A4D69E43D6D4AFDA143782C37FD39E0445F311BBD467560E61B3E 2EF1D887440EBEEAC933139B3CC7F1450F55C0179AD30C4D95D6FFF824F3059D E6931CA94F2AD50E1C5A818FC8938E7F6FC0A46464136EF24C1D1A12FC85B760 F0AC2F7486EE18EAD688CACCB5F004A915DC18F2BF1A65994147A55182BB31F2 2D0DD98E0D65EEC6932A19D7626D401833350F1960FE8AD69C1B7508EAA1A83F B4AA80425C59C97B31975D32DEC997B511B95AF5D4B34BF02DAB85A6F0E6AC64 C709E1E48CF701BB5CA09836D0787167D412B5961B01B66EE7DA2584C0D7D9B6 631CE08945B84BB253727FD189E82109BE4F46A039163348B5B0D593400E1CED BE31CDFD67DFC7134D2610A8E6CB6D09E94C67D0E17DE10027CAED0346F8E4B6 80D4ECADFB95BA0F1CD2135CBB36A503D504EB2A1F2E6AA2E455B4678E75B393 BE98C88B0DDC3D11EEA839D5F40D12C0D6DDD6E836A85E76C3773578322D3489 6068A535B688AF23498B9F6431CA23031B1797505E00B0FB90EAE6C7B23E5DE6 A446C77120D36146809351959DF9086D99C263A458EB8EF997F4C8618AA64C51 F13CF38E41E57A20A96F601317B14135F58A801A315C5620691C3E12D1DC6B9B 131E84D644685C6D98AA2270F8F1E51E93746C0187CF13B583954D6E65046AE8 497867DF8E0DF7073250FDC4C2EFAC7E34174144F78A8FD506BA712F83B0AF51 C63A3BBF08C2A84676171FE8DAB426F0C7C5C935715F1D78C4F2D00BB60E7823 00048821116346773D7C9096CDCC22EDC909150134274B45A4843F1A5CA1E3E1 18C38E753B1BA20E13BC8E8D523825C82CA525107832B5E3C8EC3B4A361FA6AC D0AC2E7E333E9077B4AE819F67E7152A9BB802918999CEB8C305999AA1321AB1 3C19DECBD987A7C1C5252BFE99C6AC02249B6E51B7B35B8EE020C5BEF2739BFB 2A1FF14E37DD42D1C7AB2617BD62DDD76DCB9DBDA45D418C65D8088E510BBF2D 38E8B4928737A7FD875138D714434AF5B25A5386D1C4DBA9A53D9B0066898518 73F3FAA0150303723174A9D61DD1274FDA16D33042EF8318CDFC4FE96E8455B9 ED84E70415726F511D3AF9EE8CD80E4C04C03A032C42B902F1E4869471991A78 A8B51EB4695A333CA90789812AD0116F09199C4B3BA83883060C3E04BD2B541A CA30E32A5252B81EA07B2825ADC55F71F2BBC0DBF30C70DCDB359632F4CDAB2A F3CB9373AC8BD6A04E9EB2C2A343BDDC706AD7B69E5BD33AF599EBD7831EC158 9B08E80B2BC1E7B928506E1AECBF6B0CCFA1C5C8402C4B4085253658108664D2 488FD5562C30EEE541F1BF4780A0253BE4760BE14A9F70DE317B6B434EBB52A0 DBAA900B0E1A83EED78C6DBE308A71E07552552C8B7834E0DB41DE247DC558C2 FBA619FEC9C05F34B7B18B26A72645B1C4EE57B5C185854C7424986E8EE0FE5C 97BE57B73019C9D384F31D38924D3C6B9200CCFDBD96D3675BF6B63310B47ABD A454A41611C9740712E822D63C3D0FC268109A6B32EFB8A22F4E9C4464335C5D E2876811760EDDAB8A29DC20A17BCEEE41922D99BB9063A3E593BE9DC6BA624F 6BDEA3632AB818E70CF72B68B2C84DB441F6CDAF27A67F60C0C91F9A2764538C 093E39FF92BEF55DB92A27F12C12CD890AFF0264C1C341C7D645D761BB19BE51 9C822ED7881BB55E177CB40209D408225856C87B8D5F02FCDA7FAB2AE1341CEF C0A4AEFD919434F1D8C463A72F2B0D11DC62A10C279B513CFEA89EFC4ABD7D75 F120BEE6CF3FF26D81068BBF5BDD6E0CBB2E807B765134AD6D0A6E82AB68236C 7AFB25A0AF256D6A72A9C3D59507C348A6B7B33040996135ED5B4C1AB9DBC9AC 2D3677D1968248E4E30A4834D2A3DAEBBE9327DF22279CBF314C51D9FB9A0876 84CA648379934F970388D0C2AA9D52412E81C1BD421A9EB276A3FC37BCA391D9 05AB04D49876D790EA44DAE611CF7127EA280F778E9E6C47C79BBC05B0E531BB B022B07B9A4C7DBDDD0894E4BBEB8DB4C0E1125A28B858FCABE1A5EEFB478579 F9F92500529452DC48F3390310B229626CD0560CDC46554177CBB40635C8B248 A54C92BBAAAE232E109A9FC30DD26E669CD362A9B747BD728B046658978449ED DA3C7A3B7580FB58C9244C5A6E5C05C757FF8292AACF6ED132DA90759E0F0881 94BE5826AC977CB8F19A64963D620B97066C34207B4A8E319BE4684BD1031E9B D3426C9D00676A35A8094FB83AECAAC49E54EC07A9FF552EF8179E3DAC7E3A47 6BFF518188095E03114513F7C66DE75F3116C0DD77FC2D084153FFC4C821ABD0 974148A6F4E53AD0ACB3E7DB15A6C2F06FD1D87FB11B1DA9DD94F4C4BC719A28 996B74679DA955D6489C6140D4403ADD3460D72746D4D5075CB58DC4F4FF8263 FA1254D8E54E679D41DA0C362ED0D74AF22E7D8C54A42483D55E916763C7CD3C 20E6E55E704B5A609BC95D34E0FF7ED67167254CF6E1F0EB3011D8ECCE4D825E 8D9945E241CE99BF27E47313AEE043E65BF34489369EDD1CF5D51EA5E1CEFFD7 558991E2863EA3F4257207A68E1DA978D0E14FEFF5A0605F8895785A02CA68A2 74004889F08FACCD1AE9510C1345F8DEAF3C47B1751C1139D55034D4C58732C5 B8728ED61FFC8204410FCEED548B359502E2A1DCCD477CC46DE442563A59B0B9 E7F385BE3F7F7B214CFC9ECDDF1776A8BFB44B23A23B87A83F11E589656BFCE5 CB0FD1597C513723D201ED096BA467E27430D3C632046F561BED5EE9BCA3FB70 E5FD19390DAD774318907B6E8AFB5E5547E13C85190AD78BB6E3FE75F60C0469 BA2C1549ED3FC1DED06BFD04E0E626F71E43582CE9EBAC01559520D25CDEF615 6D1C1B1019379D4438AD95FFA999A7A984E91F3E2B6642FCEF6639E3D3D91FF6 8EEA18E97A886FCE51FF75504641CC94E4A0FCF100E19EE1E8CDC120FAB40BA6 9DCF3D5D91B7E5639FDED27C0B1DB6F09CBBD59BE4334A610D39AEA653B2EA08 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI9 %!PS-AdobeFont-1.0: CMMI9 003.002 %%Title: CMMI9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup /UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI9 def /FontBBox {-29 -250 1075 750 }readonly def /UniqueID 5087384 def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI9.) readonly def /FullName (CMMI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB 7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67 7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8 BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365 82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74 91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E 540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112 7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8 93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756 972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A 6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149 796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94 DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80 E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D 0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83 F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9 ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97 72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9 4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1 692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109 4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1 CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59 41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A 9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20 5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292 2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5 8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B 33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28 03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1 749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE 3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F 64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F 90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05 DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8 F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D 4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF 49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4 E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117 58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE 88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3 B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE 7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776 01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46 19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41 194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55 53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3 F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4 412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6 C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108 4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831 E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81 AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF 00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91 C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8 2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980 F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50 0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023 28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4 E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42 20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B 7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE 5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4 74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4 90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55 3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621 98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066 54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7 93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC 19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A 9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84 A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB 107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA 5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08 22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95 B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D 403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789 D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6 20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6 943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33 AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70 B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA 2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84 2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F 8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642 87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4 2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842 D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC 512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4 4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559 6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9 9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A 0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040 9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1 430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8 56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE 718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3 F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE 95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE 6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7 6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867 630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111 6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA 89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475 3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2 90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47 38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34 EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9 B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376 9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9 1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF 1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C 62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5 84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2 AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618 D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196 BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6 4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6 531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24 FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2 43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256 D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6 0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4 E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53 DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358 99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD 8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1 8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73 A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5 362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3 C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79 E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2 07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F 0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6 190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4 5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50 005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8 6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9 F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087 F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE 2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752 F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0 0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD 73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2 62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79 5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98 F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F 6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7 DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109 EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222 E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107 536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18 36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3 F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0 431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900 5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C 074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78 E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77 2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600 324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSLTT10 %!PS-AdobeFont-1.0: CMSLTT10 003.002 %%Title: CMSLTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSLTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup /UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSLTT10 def /FontBBox {-20 -233 617 696 }readonly def /UniqueID 5000800 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def /FullName (CMSLTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 52 /four put dup 53 /five put dup 54 /six put dup 56 /eight put dup 57 /nine put dup 68 /D put dup 75 /K put dup 76 /L put dup 80 /P put dup 83 /S put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA 3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC 6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F 3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C 4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D 107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C 2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F 55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB 69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE 67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD 802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E 20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC 4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B 4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D 45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA 997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A 2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D 4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E 425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F 2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA 22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D 200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA 9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB 57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B 2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC 39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F 79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA 1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA 0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F 9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F 7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D 78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC 7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC 6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE 5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB 42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F 14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A 6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C 9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE 7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D 4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA 19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D 465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE 078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525 EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F BBC9B4A2CF19A4AC6ED7F561EC37127BD0D3662E05BA4DE5509060B1D607170F C8460BF557910870B904BFFD042752C0B839FF9E5E90361BBA35589BACDEAAFE C68C5831BD0F19419A684DD99D772D60BFF26CF80783E4368C5C13299DD502FE D5C4F8531E38EF4CDB97BC705E96485E6D35BC2603CD9EE98FCF9B0FDA17BB84 3142E3FF4FFC6659855C63098409C680B968E62B3C844B47A888865DFA5ED6E4 C1FA4A0FB50571B5D725646B993DEB64F9AC949306581200B2256868B4302A41 C9B88A51074C2584A6E2B49C6F238A36732C3ADACB8E712E46AD199263D1629C FD3DFA597AAA36E7BFE03965204975856661477E72FEEF73240A6B7207A115B1 DEBD304F05F5D77441F3CC7206DF7E287B6D9575F45562C34BAE67ECF24A9443 38FD970CAC5DD2A8EC8D022E58B207421E2EEE3ED4A8C0B2B3125B82F444DCFA 31CAE16BC91080DC88C5994B54496D8C3C8352F1AF0B9995C190200C128F4E31 56ACCDBF0051D84677B59091145D7BCD06563624ACB7C49A8D158450AE3C9C1B 184D09D8B627F532A884B8E367D69975AB5E8D7E8FF4898402CA65ADDE27AAA8 2D51391344EC50F6DA72FE54413E221AD0F5BE19B13760C7A6970EF51AEBF91A 67A687338A9AF958F25FEE888601927518C55699EF62519BE870932FA29B91EC FB3092E95AD9F9ACC66A398D3C49FD4B3733023CE0290DB68C1CE858D5AD5EDC 5985807D615CFE8233B35099992BB068AA475A5CAB1A391925ED1DD61B04902B 57DE360C65A591F6CDEE0490AAF74DC68E6519242BD1DF0778E78B9050DA9510 4BEA89CD83E6C1B8BBD96A282FCEC498BEF2F08A90186A3B553060404DA4BE1B BF2FE2FCDA401ACD6965CEDF5F20AE7E2BF5F4EA58D458EAE376EC4A99040612 837DDD236936FAF6FC370423883BA857C54FB9D6962DF8773FBF4EF803B2C976 39F56E1650C5EFB8AD2BFA1210510CC91750F977E7CCCF77EFF5D83CFE97CBD0 B0EC5CFD4485C1661CAC3E62DF8D23DEE095CE736DDB6855BB805A4B09C7D3C8 9617D707D9C611F72FDA9D4033F544E790493C9699AF938FA8E08F72354B4FC8 26766F63AB16D8B9EC0B0D538B8A1D2B1EADED892F0D28B5661B02C76A1E62E9 692D6F7A29CC9E71965E5796392B1CDD4E63EB2438F02640B4192B13AA465F57 30B06A39D81AB9BB626E194C1ADB85D45F7704A90A305A12AB7E623D16F71822 655C508132A7F77DACA111E30C2FC82BE78EBF56E62D332B38ACAD762DC904C7 B227950B9D4B182E6C2F4F53031726A66B587144711A2DB44FC9E7656B726824 D22482AC843D5D18B85002C716C18EAD9F7F1B0102CB75A37E5D2947B2D31348 0AA21E91931BC115EA930E5B8A1BECA5CC3287A26F0F8C97F3A597D34A5D3A30 5F0D9FF651DD6EC91C4D723D5C046A138241D623EDC93E255D6BA6EE7CD70937 DE7D9301DE8985397A025160EFD8F266A1259B83966834D11EEA594F4D61D6B7 45BF2EADD631C97B036721DDB877FEE1875C3B22E22EAE294B574FA971B754D7 1CF7FF4B531FFBC879D336453D8D3A2E0DBFF77F0CBEBECD1683E7CD9DBF68DF 8478115D2C87C0BEACADF4491AF88C0F4A978436DBD72AB6E3EEF3F9EEA6363C 4284C78E1A3B42F441E7149E659CE21F2F96EAE7D43CD62F84116BFF84C4B497 29864CB4A80A55AEBF3A6B698B896E0E5DA5DF267BEA079DBAD92AE31523772F 22199CBBF2FFCC9408300666F14F438DF41F8F88F5C6E96C8086B485978CBFA7 2971E59133FB8CA2B75E076159830B47DBE784FA040075F79BF1EDBCC112349C 20E9D18BD94EA9885CE26EDFCB767A2BCA4AEDC45D94DFC11C49C82E535D8E88 521D54DAD67BCB6E2BECFD83EB5E6DE26B61D3A6EEE4EB56C3C698D7C28AD9E7 48FB0A2F9B3D14076788A831F76A86A353DDD019B11698D07C34FF230E582921 8737688AE7494A9C450B0CF097E4290C4402680A46ECD7B648187FAD89A35929 370656DF15557BD51B3BE9841FA5F1326D3B83A140530A01ADDF53C12224A5D2 14F5F5EB1E3CBCADAE57822FAD674E3DD7713552217F54EF6214DA1774D78D22 0A60A67C969475E4E9F7B98B116FC83965D6DC99CDCE1B1A105EAD7F6F34EE5D CD30A19CF3A63F26671CBF1F0C3823A8CC1C0C14DA92BE415F873FA253E7C4CF 24004A66841C5FE49B54F021F1F43C9A8E828A95748822E187EDE5006EC04D6A C93D960DA4900DD128EE7AA8FF5A24533774BDF0FCFA7067A07A522BD9292977 15E94B0B04FDDE8141F692CEE75AC5ADC8F25F3903C0E67076A6112845401476 6E6AE501B51BC70DF85A76BE29B8161B3053200EC66995B0DDFCC58738B77957 A7B442F73AF6E6B02C9E7C1F7BBBF2F676578188364AB473BA10EC0D9DF578B8 87A7BA94593BB882D1FB07C8EA08A7B524FE6C3D4A2C0EF7347C378BB51CA125 E94A5F79676C3E58DC3D80ED9D23CB68C18D2983BA705B93E14396F2AFF5CFD4 718124EAF6D3672F7A49DFF53181082BC667969875ADA67B80511423FA0329D4 A098C4A42CB809DFD1AAC81BB919C947DC3C74576B1B15EC36B578359E935D9C BE05FA13BA07723619CC4AB1707D13C311A8C72BB79576C64898CBC910E113D1 0A4D05218875488F5998D393EB0647A5780B6DE7844AD627D0791AEBCBCEACB1 B75EE4FB928CB8E7F4D64FBE6F58A713F6283925173BC6B7B1A0469AB61949A6 C4C639C8F260AF6FEC5969466998BC2C78FC279A518DBF1E6DC6A767FA19A502 BD14EC42A4F1FDF566CE2DDCEA24F346F26D8819AF4193C03121FA8F9F3788BB 5E8C61E18532E63DC8E261751ECBE39302FC6FFEA296E0E5EE1077C2CD0B5789 3ABE32A0D8F8AFF4185697B213BCA4B30025D72B150C2362B5F4A70D278A2122 B2357185A3D07B5753D3946C877B3CDDEF6FC9045CBCD638E132A2135852C431 A132FEC4A3E3E38B3D84B69857767D67311EBAFBD5FF2C32D62B21CE4626A3FD 73C0817CBBDD0F2A09C782AEDC2615AF64D313DFB4A8672FD7C6483BE904FFBF 5673EEC6534D1C3B43109FDF733E29B9BA6EC36D296FD8B9651FAFB71F1418F9 05EAA7D36A962DABAEB8F43BA217E6E37A0BBA0FA766960F9844A196232C0C05 C8C13E15EAE44CCCF13514EDE96C71479FE3A4A51170CA674AAB4BF592631A59 8466B3F938D35B4B2C250AA3246A933766DBA6B12C4DAB3CFD4F9192E1E52FE6 AF2825C046EB23A13D47ED7B8B013B87922E9F73EA603172864356D375E571BF EA6EFA30A05F0F2EF029D4A565210620F5119E841142B6FBF559E5D45597B2D6 7DFF218AD9B7A498FCCF845A9AE4423E3FBD917680A5802788C7CD0EFF003B50 E19B6766EF80F7BF0F664B0B69DAFDF1767ACE6635BE70F461AD4CCF50431CFE 3762EDFFBDD03FC73F6232102FBD9B302F8F418E66C09E29D5C7A8A9997FB155 CC12304DBC5C9F57DF726127C4A1BFC50DC654610921DCA8B04B0DC458726B73 8BB86D4D072CB5812E0CB53F6824892769E3FA8AC0919F4D20DEBDFC895435ED 2AB808F5A03EF386E993962A9C8D0155AE380DEC38428B4300F174809AE595D1 9DE85BA1B2DA61970F0F00F9E8EE438C531D385991E105A5AF2DDE02444B2A56 8229215CB2D0809DAABE90FAAAD67D6A1ABD460C351C3B26C554CBA5B53B875E D0C32576BE1BC3CD8E44572C301123BB91E5448BE43B823C551C00AD0757CD47 3DCA54A8B564465AEECB028F93FC37517280B7F9564F597C423CD2F664FD7C10 1D72D6C9D0511A95CD5951B7A0119301E7577AC124D3A1E3E8B0BCC5BCDEB4FB B8631F5110577684BAC59F1D157C030013C9EF3F8CDEB3BCFD775A205E391D88 597F2644D25F70D057C2654EE484EFFD27D89B209762424B602B291A84E5274A F3F51606D8DFBAF7214BD1186B12DC817D2CDA2237F40E0D2F3926CE4AD5A3C3 2D7B548D72EDFECF847B48D33CEB36CC87DB03CCB425D5034D9619AE63950883 EE329D69ED6510C9093BFB7ED4F40DD8341EDA174343CE9C00F5EE1E9326B55E 5C58FD091C3462C7EE6D57458F0A1113F3F675E127BAEEFA672151EA0090E23D 955DEB148884212C27ECC3CDF55BD2B948C072B81583FFC61883006E975F0598 4046C819F21E325080C1D6D55C96DC4C68D0C2D1D7F99433B91E1214004A2C2C 6918EA82D8D33303A799A667EDADBD7A0F1D18F72EE4297C53E2737D48148878 B628309F6D24E52C4F7ABA148E87992E5C2BC27774459C5C7884CD257FEACBE8 37BD2A7A21283368C7DCA86CE073C8B96F381359D7545A6DC0D9DA4200703814 21F0E1093FD2148606E4682AB8D1BD900A9311AFEF9DF0FE2D0C05DB2E7209B2 CCDFC5C78371DA8F678736BF07C699436ADBE9ED83B58483DAFDC1ADC86E7559 F5D97138DEB200CC8ADACF30FF2AC7DBE1536B56C9277801D49FFCDC5A425834 9EE3227C5B430EDB7F8B19F0FC521534558D8E479745E1A6DB9DDA328EEB77B8 31549511120C578F8EB45E8C49C03C96FC8C3E99AE891BE90C0B3B4F4D248568 8FD07BF61E9C45137D2421EE0D0ADE0EBBB90BE74DED8BC5E1E23B474916A847 22D5A2A8F7F9491AF7CDFC753ED4C64C27D385C083BEC62D449C159B9E1B5A6E 4F85EF37E0E5C02B850E4AF60ECE1DBAEB11F8AA665F03C156D4A652F5184EB4 DC89E68B0507B3573DDA5450701AE979279BC1E60D134992346767EC0B3C23E7 CAD82FE9867CB2A581016F37CA1F975D56F6DF2DEBB4F34A1909429876894391 EDD000E819BAA9A813C2FF4D19922C5D5B8B9D1F216419F99893AF2A9B60B864 41250E69B4BB04D8FE62AD0BC90AFFC5F3C3F3D7E434079D98B31AB5BA5849C1 18C565A7116D48F7348C19204AAB2474DF84EDB09D37BB3109916F34D0D269C0 B8A5DFD148684EC07F399482DDE87455AF5FB26422310ACF819B4F9CFC0BD177 22210FBF9C71C946EB77ED80195FD19D3B223FED4DD082BDFB546522CABE0411 ACDFCC297AF95A5DFE89A43B298231B09965336DB50B0C482F14A0E96ECD85C2 053868172610011977ED3B56698B4C860D2244114DA353FBA3DF326273EE734B C4535F916CD86917F5F6BD300B24D6962D6FD6A5B2E306C676DE7CB1ADC7253A E220C9D62361E082B1E43A3C72B7022934D3F1AE053F2616774BA83258677B79 86039657B6FCA0D8A8B8CB4BF13F1610FDE5677446171C27AA00C4B057A7B59E 9870B0B585450BD63FB557D7A82D227D84E73202CBB586C49D422A3FA7E242CF 15414F85DBDEF8E65D91BC753FE18D53922A75DDFB21DC962CACC6C256C4FCE1 BE5280EB4E14FF021DDCE9FDF8170697F10F7A3A3E8BF383BAB366A6D791E481 7D0A0D12A8F60A605D7AD4D88D93C0C86AF6CA9CCB9C9C346520F588D4D961B8 27B51EF24144034F7DE50F07B4F062B52B3FE9D7C8FB77DE9367345CE8A77CB1 D6A7004ED8B42066CB7D3B07EB2F437E9A1A383D4E0BF8FA34C60B24481C2FA6 832F9364EEF19310F35F89455E6E32D6DD22396A07665859FF1C47485B7B510E A4B6D9F8FD095DF87C9852D768B05970608F72B35E7EF3CBF7F255280658AF89 E24D498747792804332F59D1E343B850B64FDA3AA014957728B2CA7A450D027D D8C6CA145DF8397E23E45B95D516D711A32C8F040D7E19F679DB6EEF9AC6A7FC 37B29C13D3F94C6C168B95CBEEE83DFC98E9A116C054E3C99B998080E6B949EB F112418776D7C3D8C25041883409BC298C957CC90DA9E688B66A3DD65A77F917 A8DCBFEE8C769DF390104E675CFC92D19D0E9972E8FD810E91C46E312243E8AA 88693D3A44F84EEBE5518416A8EF95A80220FE72241867B2C580303A3E7BB0E4 ADFFECFFF99F054F7DF1EB7E891F467C0B9FEE46A6B0D036846FD96071E6E594 7FE0CC2C06F431347CB1C71AAD124FE10DA8818B8331B10F899FFC1433FFBA94 65155592B1867CCC80D93503F3E1891D76DD7668AFA6DA1E62205767C7C16A80 24D9D91E7954DF090F7F5AF4858872B132CB9DB75E97AF9ADD38538E9F345C04 6094F2E7B81DB0C27FED2C7C8693903DCC46558B784D0BBCFCE9C00A5845D1C7 E81BBCD79648374C30237A5B33219255BCB2A2B2FF38F68ACE3ACE3698D1DD31 9DE85BB1E43FF5E53C0F9C7B4B2857A024E7BB591155D99C6FB0AC4D80D2832C 0969DF58B3B075284933EFA201B8F2F883FEA61E91F2D2C3F91B32E9AE06EFE6 2B59FF55C860C262F61690134A9E1FCA6EAD48FD60FDDD8AA5F7A19534C513F7 4DA65C2477689DADDE2D02D203399F3F552698A0C42C32E07CF4812637F3AEB4 F52DAB35A5564A92F98BDC4E085C384709446C2938EA7430A6490B3622F82196 D39D2DB72415DB59C651E24D7DD1FB53B7959ECDA558157035093092005FA591 A3CCBBE97B8F120668EB2BF084BD274AA291E22B59FF13467DE497AC62CA64B8 2F060531C0DCB4E7DEF9CAD8A64998A793D17E11C8588FC5DC3149AE3B999E19 BD6EE474619D98CA508B12D57EA96C66A582A18840654154611293C7F587F268 57D50BE908CFD49C5EC6FED8E4718B38C12FD780E06EE2A7FD2091836EAEEC21 231D4AA44041C04B7733F6B4920325ED797E89C1C61BB75D0FF5A7BD9EF3FABB 04B5AC1E8513D695DCDC7A8EDE66543FEBC9DC300B15F603CA01B6D20A345A42 A3DE5D8CE6557A217996FC71BFFA8C388C672B72254B8A1AEE33A137F2B1E1E7 A601B2B979DB18D5CA865DB9C4808F00884FF5E678340C1F63E711BCF18F1A52 B29704098C5E38DC0F77F100805E3EF0BE4AB89513E0011842A16A26F5B8E1AB E5DCAC3CB6FC24EE7231984176E073822414938C6BC5E6406F2D8444B90E899B 6E82CE3A876A16574205EEBA2B63701325E32118C3D018139209C68545B5C7BA 95F24EF69DACE9EA3C6B3F8C061E9C646D3A50A46681B203FA3B9B716F845B7E CADC9A2D1F1D8EE5ACCB1FF16CF840564C534A9D76A4A175BAB98749841AA1D2 A7F22E7082BAFA06DF7024BEA0294A38D7AFE23E7661C7C5CAF1B6CF2462A0F0 8488822CC6AE054960CCE1102F0155710EF82FE8ECC192C62D7F568EBDA20991 7709BAF6933B0B2815DCB70E3B6350471FAAA2E00B9D5CA56FE23FEF119C4ADF E16F9EC240E3EBF63C778A6C26AAF2007122EFFA79CBAC83AB42E46FE7AA5E32 606AFC020184B099FB514FCFB3582A860094BF1531BC3A0D980B11FCF1DFB37E DEBC573BD17ADB1A49597E3D5D90E20C9DA480C606812DA725346D551FAFD854 51B948A57494A4D2F6484A7B52703A4ADB0304AD0E674C1D486D4F8B9EC3A4A5 2723E54BFED08F73D2939E53C189179534CA09C3E2EC66AD8EF19249BB3DBB36 B1AE531244B390CEC40BCC87DE0AEC60872273B9A7DCCADDBC0458D544E19074 F26BE4640BF0F69010790BD26520B278AF4689044D53C32F2CDDAC154181B789 2029CFF7315033B1D2D6B91C9BDE0DA5F251629018BA4AF17904BEB462C0ADE7 5B1757CD160BCB693C4F5225F3557D5A76527C0678C9B4B6EF744BA03C7F74EF A91DA6164FAA37A0E98576BC9C15EE9009561ACC96254CB81A4203AFE9652FCD 9FE4C6BE47890E81250D762FBCA708CD2A4B8FF36C133ECF66C4859C91DE7D3B E5F1B4E05C8DF2337A73423D124D85EABE2BABC9D90110D40EF6C7991D6555C7 9EDEA03E22605AC3BEDFBC016BC5E8AE29C236E3EDFB47D236F1DF48588244DE B65B4145E455B1361BBA9FDAA082F8AADA66A237D8F2B434F88F43A5BD7ECCE9 78E2F2D580C860F3954D13AB2745505B6D133D4C54A764E739B63D686C19E1F8 345FEC3D6764A48356FBD3B9BABA8CF4E9061EBE40D7526AE264BF899942F23D D56A22BEA3090C3818210F537830597F59489A5034E6B6E0DA98BB8422D51FFA 348AC9FEC9E97B5ABAD70099FF5928B3ACB26E25ECBDA476D2CFA89F86600EFE 7A9059EE0BCDB047F1DEF800DBFD7AD03D12062456272885A3BB6CE61E090932 6FBD71F46B6AB02996104662943A5E3131F529B4037342ECC41B624EE5A154B6 6363BAB6B24E47A6DD78596940B49E2E4E9EF13770002F0483E9B6E3317B42AE 89174FAC639A0D0969CD5AF9FE84C344E96EC36C6D1D5274A1E200341DB6100D 7A65362D9C8181F11916C1418E31771868CC202AE1969C18B8467569E7E6DA98 D9C9FDFDABC6A18BF9CE6A0052F286B155350F3354144CDD17BD217B11100827 F521E6A5A013815E2336351B1DD120717FE2628AE60227A83713345235D83312 7376364BAA5845DF0A7A5F6DC4EA839B9BE4A39534E6C87C1659D57F5D72247A 1B0AB485E875D6474397AB4FBB6F2E739F89903C9145FCB9E3663A563E97E377 7B01710DE4A719C2017C328B01CC5773FD19FDBD82503212EAFE874B52016EB6 F7A9BA923FD71E438B060F59CA832FC2D77EE0E845B4590A2BA8D0E4A545F571 967BBEA2A20A0652B6CE9123C668A1B6BB0E03A1D3A5BE3721DD701C4B13966C DF1EA19CBA05459CE22F99A39A8209B05AF7DBCAA39E9836BF8A967F28FB2DA0 16D6A287648E848A516A17AADA8CEFD40302F1CA0ADDBD21E9EE5541D30DB1D1 93C991546E86A78350159ACA1C480FF1ECE0B4938FFF1D77FF6BA36FA15D0151 7ADC3DB75B246DCF316DAAE7DA3A9BD02DEAF084E9AC12AE107611AA3C11BFDB 14BDB8EFAE7105F70C1A682270C557A876F401F34C672557F1F1F1EE3955F9EE 7715CF2ECA6CF1E209ACAC211D2B636D49AE7CC6C64B98AD9FFD598C067F187C AF2ACEAA94E09E30683CC6DE3F0898111AC3BB3948239249489DAF1CECBC89DB 509BCE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMB10 %!PS-AdobeFont-1.0: CMB10 003.002 %%Title: CMB10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMB10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMB10 known{/CMB10 findfont dup/UniqueID known{dup /UniqueID get 5000761 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMB10 def /FontBBox {-62 -250 1011 750 }readonly def /UniqueID 5000761 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMB10.) readonly def /FullName (CMB10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /colon put dup 68 /D put dup 69 /E put dup 71 /G put dup 72 /H put dup 82 /R put dup 83 /S put dup 86 /V put dup 87 /W put dup 91 /bracketleft put dup 93 /bracketright put dup 97 /a put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D432E1428FB6D5BDAF 3F02C975AA4E0072BE5F8CC7D3D59BA3FD04709FC9E52189F55C7747056EDBF5 F85CCBDB1DDE9F9163AC7158EE8DBFBE8D94A46510118ECE6A280C4872F448F2 E6A6B36AE3224FA448DAF204D1C998D010C6BF52DDCC45831DF1EC22528B00C7 70525CAC9F6BAD892E7D5C81295A2AEFA8A5E4B6BA2C4EF61FD3FECFA2A8551B DC84DAC597222341E762620D3D3C1A4AFF2F6D68C4813004318FDBBDE23AE224 617F7BC1F3846943E915624D6BBFC555E2EDD013F190492F03CB64E5F2403723 7A2D4652BFFAD1FAA1DBA4538F2C3E608367BF95E09B853A2BBF9930D9B3BE46 0BFBEF05DA75DF3D8E11A09D472A9E45C626428A1A599C111ADDEC7A4E70407A 014F792395A2A12303EF51698D487854EA15000AB08BCCA8B2E35A5018F5460C 9B223315D7B838BFEB224E8D1DC9A0C1077DA31F5FCE0D9D499EB0507B90E9A0 1F92FB5FBB8D40568C1E8B8CD6E1DD27CAE6E107AEAC5696CFEB19091B40FD77 7A4B4F0F261702BFF5E2320C62EB5C6E9DDE142E9FC7DEAB99D90297AE0F15A7 04C0E3B39FBC85CB6B92BDA7917698230B5374D9159807ED1D07947D95802693 A856C84812ABD3EBA336B88CC8F37288CAB59790B0882A4ED6815FF6D7A1BB35 5C7B7437D2ED76E806813478007886ED1009A1E73CCE210FFA69A20D6E05A713 F6EFAB133D146B0EBD547CD29FFE7870973C1E71854C1C643BADC69974BE360A 4CF84FAB098EA3DCD2DD8B2FAAD19429B0ACC7C312B03E6446F1C1D51E6AB45F 72F11FFA078DF3196EA970B24B1BE607571795A2FDC2EE7194E9422C483799EE 23E16A737951BB935EE2C2BF008B6190E0138D551E75C9E6D0EA48E64E9750C4 BAAE32B894BE25D092CFAE894230430E43C585D0F06636C8D56BB80A4597A0AA 547FBCF12821C20F0E62369E1A9CD2343B8A8647B2FBB1F4C86CAB1F7A14669B 69DC857F9BC7538A864E523C2DF7C830315E0907CB17C8FB6E412A2A9E88317C 0026A6A402B36BDC433015AEBAD775835E5ADB4EE75FD8CA06C199E000CEDF93 00692F29C5394DEE45DFF2D42872B1370C8D4A14E144FF36163C849F9339AB97 EA87BD445733162A34E609BA1E92DC92F9AC892E7A0B39AB0FFE517856491695 56155FF0C2B231EF1314CD4A146EDB1CA9AF7DD546CACDE1E6B49BF0D4ACBC09 55C85E2D38DF84E0B779642F7E9C26CE19EDBF328104B9E803D1B03F3FC24C4C 9EF0D27C8E5AFA420A63981C000A0C1F0B3D3F853FF300EEC524C586376AF998 DF4ED5AA16D8E298C159C2A3E33048D4EF192A11287F69B11BE24D49A033B334 83CB8783383F92EFB9E3BE84CEF37796BA4211E534B0360970B9C57EA7CB54FB F582789A83113ADD2415B3F84AC4ECA15DC70878A32559198DAE67B083B0EE6D 68A92511FA8FD6BA88A42769E3FBBBBDFDAD61F99A6C274B48CB044D16FD5953 44F1503D8D1D6DBAC41C1246A71EBCEE5B1F0DCE3EE7E3A99792DD8FFBD94DD4 3A5ED347A62D301B6739AD2BCCC7C57378C29FA5A83759E7AC6F1505DF6C0E16 71587914F698608AD93ABEC43611DE709ABC3F1C0A1343CBED5F09DDB4FACE0A 8BBA9DE5B85FE9B4365358DFE877BBFD9AF08BC60BAD7C41433BBDBA17EA9A7B 92F76358612FE44F43A85588DAACCF7846ECF5C58B22F18120F895317609AFA1 06E88CA1D73C4CD5098CF44093207C31F46977B6D22665AACAD5A169906640F6 3DFFEB3937BD6CE1501C52783743F8F6110DF43ECF512D49A55379432CAB1C33 7C38B7A38DDB91F0683A052378CBED8BDE4E6DC32FFF6D723A4D1469D32AEDA9 FBF89B9604656DD0D44ADFAC39BA893808676E1E08444CE56F6CAFF3E93D8D41 F164049193BA11AF94B43515BC79D6A538C00B08FB518EB67C27E73380A651DC 4B244E8A2E4ED405EA5C7EEDDB09D44C458A883C839B98D9D6A2209516E0310C AD777536190ED06F47EB2ED61C53A2E0AD0CA4E4035324DE75F272B1CA6BC1FB B912807B7331D932DADA30F1975A1C9A8B55604EEE8A0CB514C6CAEECAF9C46B 5D5563E8934B421EA1CCE3B96412D78DBEEABA59FC603CC6ECF65BDB5B66EAF9 14B852CC04286EBEDD560713090BC417A10BB834944E007F45B61AD6E6150B9C 10A6FBA56C1B45EA5F9A5379B1A0788513DD4100B82BD61D89E6841A26B362B1 D4762EAF4FF3BEABD882700BE9832115405728C5292BE942F871661EB0E6B29D 430CB271A090B6F5399184F21ED6728171B1783C982E61DB7C0BF90CBC1482CE C6982B4F0AA39076B64CCA5A71BE73CA65F2CB60B89AFACA957EF8E6429F2182 CA36220F80EEC5D01AD7061DF45CC5109D9F0B7E2B6DB9D6C6326A45DC6C05D1 E81B636A82592D99C7B7ADA0E958A0D7570BFF1830017A6241AD62C53D4CB36C 583672FBA265142DCE545F4855CA3D9E528143AAC66EBC9527B76EE43B4F4E2B B209BD265D6AEF18D168CA7BA2CEC40DF86FF352029597A5A3B2941D467DF229 50C788D4276C5B400F360AB596E35983262A215047C9714912B2E69CABC0DBDF BF6925E19EDF3A6638CF5794722C8B92C6DCF5853DF288B9DA52A2152F98227C FC04D3C318E7D942E9D33582A490888F0C1CC1A8C4474091B4956222DE467632 33CF5DB7DA165B59A648AC6945687B0ADB83EF5B286CC469B2C9E4AE92ACAE8E 86E4C62A092B8F6C05EB2ED346DAA7C573A03760ADB3CD55B6C794FF4463BAC4 2F4A738F9C4237107C503A7EBF4F4BB4380DBB64F5F5C9B268111752FD2204CF F25085683D071FB4149A64426859D407936A3D1E2C627652C126D8F9264E2919 960ACB9DD61BDF973492CDB1FD20EA81E06BECF5E164A8ABAC12926DE1CBC0FC 6693737B4875F465B5623C899FE129B3A52A2BDF104F8B8429890AC870580C7D B078A9E26C322D1A8AC1C6B2BF340813D989EE8D054882B965905D33EC3F4278 DC41BE055E0E5F73B5A1F45E9E69718F5E155B4EA30B28BD28C52C6C322F2E84 674CE600D699CEE1D2CFB7212BD8168B45824890273A0AAE4757D112980DF2DC C3026300B4BBC9B081817AC7F4D48B309E66CC7455708C772A08EF6FAC829363 E27AEBC3E7D0A91984C05935B16E102E81D6AAAC347E38EBA40125543263BCA6 9C6F4AD6BF8C3A90279FCA4A99D9290C3B8E0DEBB4B2DF932F66FD47AAC3094B 7582FF8265CFF8BBC7F79C8C74B1FF94B26F3817A39B5FFC6BB562BF6DBF9CEC 31CC3BE4D7E431D41D55D96C4F020486F993781828E9E8850192F9F6BA350AAA 5E292210B0EFA4061EC8BD6EE15E3FAA4AB2F54110D17D29BA32C0D28559FF32 D164DCC98EAC78822D6D6AC6F4871D47290A11C83670374F072A9DC723096C89 EA584D43BBB13584D9B8B1820C415DA2E0DCA1B50655E81B47B9AC8343DD8FAF 95F4771ABF81361EBFA9259EE8901F31C21E95DD22FE04BDB77D23DA561FFCE5 A7708647AAF65FBA2FD95E843D839E5734D4C08A215180C7244924E002A965D8 AB29470A1B86065B4133A9A6EBA05EF1AC67DFB5ED8DD8C11450233D2624EFEF 3E6D3DCA7E23ADF174BC83AF25A1D7529E52D39C27DA86A2DF4BE4F8A96361CE 7025BC1954C75A765ABC95B4AFE0AF5474653E6808F85893BE6ECA1A37F8B666 05A9E9FBAADB0DD86848D6FC48A1000FAB396F756513798E09D29ED6DBCC8466 40181BB71C92CAAF8E240E16304DB9F4B0FB6880004A0F9AF6228E60646647D1 669577DA709B4FDB8721B95B07B4599652A303FFCEBF858A41F08BF3B83EBD31 74EFA947A8ABFC7467D6CC544B655A7BD4B6A4F5EA9BF11CFC9CDCE14FEEDEC5 9116A3FEF962932F8B105BC4C51744916E8976815AC286B1E682D83091E9C533 839223A68B9D977C41107F597E05C3D8C1C3E79542A990B0E8E22F34BBDD8E47 B6C2CAF54B72E8F0E8A41DB343934FD2C33B6D77AF2E9061C4E76BF258CFD615 30AEAECE9D04569D358541C346C922A01D017BCE85D4F083AA9B6939D85EEF29 335D1BDCC9E6D5F7F58EC2BA2D8CE50CCB38AE6A2DE2F695B76831F8F591BEC4 EC6391563D18E4169151F552B5E1601B1DDA6F93E5C8B5F4FE63F5E002AA3C15 E0C8DE2C735EE00E9A2A01530FF37B7FEB0FB182A4E381CF1BBC80D743209814 F99002980CEBCBE3E677005766CE1D0AF4DCC9F103499D1961771FFBF01B833F 1701EF6EB1A381A287F73E519C01084241335905661B2E8B86B398C88F39BBC5 09FACC1344E15CC7685708BCB3F43EAD4E24A84AA0687FCE0A2178D9BA84EBB9 68E8A727DAF9A0B28A7CA3B119798603F9BBC6728C5A6B4BFC84C95DC4F36839 C2649E364CEA39A4EDBBA4C0E27C61648D38CA46B64E8CE797CA3464C80214EE 28A1E58B387AE0A663A39F04F57899ED62FB0E542EA108AC32490B4B2BC068F6 2087BE9C9C3CBFDD80F2E632BC4C971A79A0A3C3A5607B997223A9F6373EE51F C58EBEE7756A391C91758A1F6567F532A5EB762A2927F57CF9F0E845E4F66B3D 8100D1795B706FD32944CEF24A054650EC911A54A22F4F35E3034AC70F07C98B 8DD43BE9F7D68C50D6449791F5331A189706D9CD18417348B9F296D8D01368E3 2523FCC0EF33B998FE925B4CC7BE329B32D6AF791BFFACB60E4874412C8C8676 34914A453A592C7614AEE5001DF3E5E8D9335A155C65174B940E1AE61ACBCBD8 A41D7E1C6FC0680E094ECF65C60CE714E6EB2A1897D8A3F39FF58D64EF7E9A41 4CD8E55BE32CE8CA29239A9BE3FD6B1DD5CA5A035AB1FE57CAFACB8A39B6A877 C853BE6BAAEF5714982FBFA414EC128B61326B60D83076E690FDCBE3D2AD256B FA7A15B804402826684AAD933E94853CD0CDEA3CCA7DC833E486F431EC4764DB F3FB244DB99FA0CA2FA14DFA75A326385B3AF92AF8E4C6D437DC3DCC07FAF25B 6C0F270333ED377B08E498BC3004C25C7A991DAC9A3E0D1FC43E2EB6996C7269 7A864CEF35FE312DD8F87E37AC69490299CEF9B059EC7E7492D1D6E5640E0AC6 35B97F7A629B6B7CDF3BF86D2B518EA807B03E4F79DEA59C84D98E4C94102EE3 71A29649ED75F5ED02EFEED8064E2D54E8F9CA0C4284B987B81B7F41FD7DCAC4 FB9C3ED70774F9FD09F3321CE1D0319C1129F5868DABBD183045984748C8A3E4 53E085818729A1353B13C78E63E837DE483E9E2ABFDAD16534420BE4D7976D35 F56B86EEB90F663E9778A6E0CD698E6324EC2D19901972B74EDAB8F4073E4F37 89082F08735E8345BA167B2B76C77703C586CA5DAF41C0DD0E231184DECD8A9C DE8FD239B6CC636507A5BE6EE5283C06A1D8D59E98A31AA76F4D358DBC641DE2 ECE3D9F2D262FE2E878E909A950A7642A3F59995519D541B96D459F24F12682A 9AE61FC08CF436D9DF060DAAA90884A1281B370A2F824704B5347FEC65E14E7E 3D212E29723427BBB12C1CB91B28CA47D6FA8259A875EDAE4B49C33B2F73938A 784C1E7A7F21873CAD55A868A1451B070A3F259A983293289B131E07C903D7A6 3CC66CEF8C4D2B6736282896A2683EEB944B67240CAC5FBD8A1392A875245A9E 2611B511909A041846063E465473D41958104E92519C0F86706AD640FC6CEA10 620C9718C4589D9D562D8810CF6F461B776D5A1B040F8272D43C029C2A695D2E 86CF508C4AB11104E575E13C2EF56914E241279BE0558CD3D59D25BF13CE8212 3D7AD1F25FA5A9155AA06306C7CD0F49E3498856318B0ADF279731E1769839EF 98657EE73CF07B0585EECB67F5FF609E0E3DA1B78F6A8FBE2F2E0C051237AB4B 1587DD72BBFD962E865EAE0CAF1A5C592F5019C7533BAF297C0F78F3287838D6 CEBFC8B5969486A5134DA76B4961C8056E1EF1F2AD17F19D7998175D66B3149A 2CF21CCABA281EA0345EF50C1EBE7004ED495C6D03963B639A66638A43C049C6 DCD311B5F86EBC814BE42D432EEC87B861FCBA9C8729FA5AE87E20C5B30B8E5A BB41189A42B9853CA408BA01A559CAB722AAC3DA28E70AD79E1BBC8B6FCC937C 180B5C2E20B03D3FBAC60C83F765CDCDB3146FE5C0B02911F6E120D63EDFB0B0 86CCF83C2AB62922450206D3701588B54A8B232126BE120432E6BB2E25C50B13 708D742A44E20176C54FF89F4589B10D5396C94625AEA1914AC168899FE7AE9A 7D90DA67A5EF3DDA25CCBB18DBAC3AF4AB889528A381542185821B96CCFB4302 987611DD5B5B8514FDD7F5148D1BAC9C34567F75EDAB317E0B8A7A76604A42F3 1D46332C4791006DD1AB657308CDBBC7314592707EB163326E345C2C5EA05B33 01FEA5B7A346E6B1B6EF58B692150C6116B149B6A26B493674337A9C1CB4F42B A7A80AC587F9BBD7A487F407EBBF9978840A01B5E7E772DF7EF28481E7AD14F2 424816AAA958320A0E6F318C757A474F7B05AC0F570094372CDE877B479AE3F4 90C257A2B3F443DE43D8A58594BE8D4B5C7E5E075ACFB1AFAD4C06415266E168 FB38C1CA256287953EDAB1D40537A3633CB52FECF3D35BEB8C2C6CBEECB54BBA CD6E043EEF68A21D7639FAB8D1006B1119CF92350D9773502F7554B4B3036EA3 D747596506FC674DC01ADEA9B45ADC43B9E6947235E9BA30FF462252038D91D1 D908E9132A946FD03B86A08885AC44CEE72F0E27AA63A901F2DCCB86D87702D9 A66F35F06D6640115B075B0260FB116E24E795E24DAE988CD48A95FFD3116E92 63D02221D272531186E2AAB74496FB78A4064C9C9772608C49D46E40FE28088E B5109171E7AF69599BD8BC1186C196EB11FB4132F5C9FC1395220392E17B66E2 32215E54E9483196341D6DC691FCCEFBD00DFF4C095FA8AB36A374BD5E1F5082 730A698AAB7B57A5399196ABCF7B7963E2970CCAC5E9A5EC552CDBE1E2EE1968 B81CF5BDDFF9D385C9C1FFD726A0C52A4CB0C8121E77AEA16157C1EDCD1AEFF5 5607E8F5C44072DC54332B95AF28417E2D45B4685F270821EB6C455AC147F938 50CC9F7F2006D933D0664AADBF5D7E3E6DAD57527AB59DDD13BCA392B059FAD2 E7833AD00F62EB89CD7BECA9DD479F7CD7C981859EF43CBB1EC1681081B58A39 2CEC9FEC039082771E1BF48968431F72817C8156D0D6B65DD33D472BCC49496D 1F5FB1796892C6A45BCC65BECF41D8604B811824739647D87A7B28FDB3574478 9807DA2557F411E0BA7479F31B9E3BBE6F3CAAA653883A9D2BEF2073F47F057A CFD20BE1371F17F5B6F0A9520F2EFCC3C04A24EC272C43E1F587ACDAFEAD7076 6139D04FD9A50F67301D7765109C76D6270D2DECC94017A877EF386AC7F625C0 ABCA9A6D15D71AF7A5889403DDB83EDE87EF5A69EEA97995CC1601160B296750 32AD8D65A456F5471AD4536F1AF41A4D370203F897686CAE7C89577D3A843E90 9C08CF3E3D489625256DA5E0984BF971E0D8D251AE5B09C17883CE07750051DF 770B920AABB2E80A4944EF613891B4EC3F9E214339AEDFDD5DD15240933DC82C D878BCB743ACBB562A41BBD86191E1129718826681FD12981D4159C7432DC3D9 AD4C6C478EEEA0A34030BDD0B9122E8AE5F0B473AC5A48346D56C2DE42815D19 FE378D252960D3F56654B31C58CBBBE0D634FF6EB81295809AF12222C58345C0 4595590B2DAEF5F3CCACE8AD4CE8585DF4099665B05B32FC49160ED307573D18 6C4D88C07CCD1BD4A0179BDDE6524D8CC9A70318578646EE6F4DE040C56C90C3 C5C5827A77DB584E95F55F083D07AF133B31DB611D1831D93180F66A13E86AAD 573C57B42DA521764563F69E7D4E26057622C17A135716EBB2552F644065C733 451295216950B589D09E00FE06779D50AA82A4653649B7CDCA11A1FF27AFA7FF 189A798A6DD355CE23F77BF90DD88672ED1AE3C262A2071CD9E6E8710E44EA18 8EAF3FC2FD7A203792FD5A925E03F5FDF5FC3C0D975724B9C0EB5891CFFFAAF7 AC4180C714BFB1BC100B055AEC13D255FDD48CDE21EFBBE6A2A5CCC75DEAEB75 CA1B5C649CF209DAF2ED786DC4D0E02F1AEFAA8A7B2B96971E35DE1AEB60A50B B4E5B18753CB1E6E18FD08BF00E01DB6497645F29D666701A930476B878C7843 D729490D64FDFA946762B2F71AFD7E3CD2A7B155D6445774A471A84FD5CDEF48 1419EBD5CA76742B84B005FD3D7F5D0A2027DD28F9561C10A7285727E0E7F90B 40EB73251BBD86E4AF64502AADABB48FAEB2D268AF7F0E87F9A4CBB439A1FE14 A67FCD1A1CF7C01409650E70010CEDB0D03EF8703998560505632AD9CD3200FF 13EAD91BAAE1DAC42FA0E95FC1A3F8814223676CE3EB11091F0DD6C57D33B925 D93CA8C655D02E03778E0B39EB6C1F2EED1A4139A6B4A5AD4D3414E18200B6D0 CDB0206D27FBA25E09E0C7A5E274DD8C84EEF97C675971BCA134931F0D81B5BF 32C4683F9B82942BC0B190ADA94419BE16F076140D754F91E279297A81E996AA 1018DE0FFEF88D090CDA33D13BBBD899E1B738A824E2B4DC225C8F4EE27780E8 D7FCE468E4E0997F5EDE9EB90B5E0F9330C91E1C9D87DCC2644144396A432E05 9CD0E518E65DD0187AD76A71008A2D7F7F1A72BED15C8B1A05109F141ACC49FD 9CE74782A5D63599A5D7E6254C724D703925D6AD0B300E99340E16E0FE37E948 E40CB8038B071C53193CC55D2D99A18FB414D83B3B4E12AE1BF4AC526A8357D0 3067AE4653C04857022C2F05BB54B03234BD0FDA55DAE9CEE93739D83C4BE3C9 654C6F8EF49A6BCFE21D4C53CFC95A71B1A57675ECB252CB04C0D0E65D70E045 1C470CC431023BD987D04C30EDE854AF6BF84B0EE2559D7A220C59BF339B8631 A165DD5FA082EC8AD74EE659F6AB7E2DD91798D8FD8A255CA437A6EE57E20063 EFB3FFFEB581ECFD0BB254C4A7D2406162E71A54328D64015D26707332D485E1 0D4DB93578C5A34911A915114ED3C4B03E293B76F00DB98624D87031F7072B05 737CA349ED488332B66F65990BC7FF9D69EA29AAEA00A32F058FBA8FF60A3221 338CF08C6CD7CF4E173595FEEF99F5C1F3EB2E5F26BB69099C57AF2EA107C134 2075E981731E2964B162647A34EF5F2ABA3259C724FB78ACA309C2CC6717519D 0F0D36FC087ABF1C0F70E5A1465AAC9EBF31D40A2402EEE6EAD9A67284147FA1 033A92F91363FB0FEBAD8FBA9CF0DC742BBFE88C85AC40F759A251C58B39E60E FC3F4C1E7B44E9D18EC3115A7ED78D90E437699E6869B56270D831CA3EA8378B B9394642AB01CA4E7DFBB87412F26869BC2969FE7310989B6D94B03CF9FAC878 07CDF8A866A3F9AA9180FA479662D73149E7CFE9BEEA197A136DB1EF8C8B7ABF 1C5935FEED283675DE0D7C3ED6020D425F11C0DACB66B86706B074C16BE5309C F91E7B329A672224F2B67B3BF8DFF7E28F6AF2276D9B7D066C82EE63E6B3D1CF B24CCC3E9E3F34E935EB4B018EEC98688C2874175041B5D80C4F73C49F1D864E BFF10A2D2EE7032BD1C70E361D4FAEC2A0871669B852EB4F83BF0546306B7B54 C14B6245D055DCE744AB51D6290038C00B77BBA1B56FAA1308610C85AE01DF1A F361277F0CF3FD3900AAF8F92B223D46CBFC2BE5A529AC1762B4A8C7BD75B558 8C007538FF8228470CC4F8E47C3F7FE217246F1CFAAB4A2848CE07F13C046975 ED0AD589CA2855B55206E4AB621524B806DD6919624FAA4BF2B5FCA38C626946 652290BD21D9C3F57C646C71C2E8BA4B523FDC1F04765E4E9BC322B92EE22213 003B7D6B32AA64F7578CDD34F04E18F097C3180AC2A072AEB1E26B093F8235E6 313E29A1CC8065704E4D01A37BD4590002220E9B633822E9678DDDCD5112981C 1DF55DF12093F274FBB894F1BBB9BCD9274CBA0EFFA54737B8818884158A282E 91B3ACF31134264D559C81FF4B2EAB81E01AFCBA39C31EAC8D3197E4FEFBA167 AF29AABD8A0C62A558D5B8B62B5F60C2F0FBBD43ADCDA072296829BA97F1333A 76423CFAF3B8DFEF089B5B2A64DC911AAFDED2FCE9F339B49E9C3F0A4871771E 7CC28E96A6ED1E63888A9FB1EE6604BE4FC7CB7D8C3056F7BD17F8BABB432598 51A71799058A5F3839BA38180579F05698191D6665F57B04CE54CF501ED3D932 A02B78D64F93C325ECE877DC3196E93B5D861AFDC425654A71943C473B6D3618 DCB53F29BE9F9581BD095BFA86771B73927BBD2E016D20398D7AB770255E6C7B 17A5C8535370F237D9E1F2CE2B3BF95EDD7E29C981C310048B435BE15FD7E508 1A85A41DA2E0D91AEA0F8515740D952B2F557BEAA350F54F37FECE3C31D7EC18 B633AB313A0C714E0EB0335FD042290CE7FD6FA64E3C16A0B691BE5AE0111E5C A93D4D27CB14EB8A4D6E53E18600051D68F51D81E0FF93497E8339FCE093AD21 3CD39E80AB2D79DDB04CA693ABECAEA0A9B336C713F943A65F60C3FD2A1B9DC7 C826B064D76DFCC8895286846CAE0448CF3BD3C01A063CD002B2DA95498BB201 F2C02A778708DC38101C9DAAD6BF157C2D546E736E71F565C118C1BF0AF4B02C EF5CD89DC311792F97395F9313DFBCC48BB3B14B2568971494C6B21603E44CAD 195FFDF0B7173470E5A49C7FDD6D6D0ADF3F526418FD0058CF33F2FB008408B1 EE2A7E407A8D17BBD743CFE5BB1240F1B2629D802D14EAB6A99218B30BFEF502 2B101EF01A619BEA6058CE0EDE0CB1A4B474FB511E146D83551F411E897D1865 FD2048206CF029CC2E2DFFE6D6F870D17F3C4E0D3170C07CF55186CFB32B81C1 FAB817C3515F18C1306DE7D5E766F345136C5170B880AEDBD4E611AC71FAB022 3733130E7687AEE5841239054B6CB3F529C0FF50BA7D6D0E3AE3788750F85099 38CE8E21B90215A251B79C81BEF47AC14441B5BA06FAE35D22DA568AD5165E52 1A9E298D4B1A0A55EF7BD70FDBBAADC552FE2A3703D7B53B1F7CA3279C1F4E69 10D7642F867E13B0ECA5732D5CC7E490D39A210525DD28A278A5C7D185B9A4A4 B3781CC7BBDD9B3A74730BAB8E46DC9D51274A48174F747316F8E76B83E04069 DE8935FD1C1D8306125BC5CED35FA4C072031FA148C5E9680DC50EC02E62DAB0 810A7B4571BA054546E2C902ACFFA9B97766DCC601677A85090FC99E06F99B24 E29CAD9181F36F4B1CBC52BF3DB68216C5905676AB6518FFC7D8C4044063AECA C4C34E2DF52EE202CA146445E4E8B1C8EC86EF69B8A2B585ACAC4CA8414B7D0C D00B36DEF9EC7BE1F1CEC925707D7D4881BA49F5A4D9FBF1ACF1F8A76A367BB2 EA99F6C68BC5F4851D3EC97CF6B98E74F3DA873A4257F78CE4EDC9154D011676 1AC36BDF01368258E97E91BC548A06719D279D11B9E05450D674AFF9BE6A47C2 3EBB3D6AC128A653126720742F42420D27487369AE90753BDF4C27471985C873 68D0EBCB0A2CAE284CD8E2F00BF9CAAA2C525D91B4514B1B51985B52DFC7DCBD FBF82244046AB8CBB8AC54A04B4E31D25177013854B10911CC447C2195E96A47 B85179CAA08613AB3530F221B2FADC6A32ACFAB88B91AA0ED95B2F733D8C7B6C 8A69F18B58C27D1AB1CDDE3A86FFF9095788F093C60901C5EA50BD8C93980696 7AA2C76160FCA8065FAD8603F39AB70930DD4B85C15EAD617D265361E12A6A51 EBD6DEBC032DB4C6D300BEC25FED541C361306DC9CFF55D7BCF6CBBA9787936B 6B5478F282CA36FC3A44700E15B2006A5EBB390CAC0D0ED93ACD6F004E73FEA9 079026A6622CAE73F392C0B17CC0E4C67EF6F51824028E7501D8E5364A533F4E 4E07380EC1FD82B24BE41746480E4FDBC89108AE216719B1AFD1FFCF535DC9E2 AF18ED268CE0DAA6AFD3D9FEB44196772A4072512EDC1EE169CA57F8B61B2D41 0EB69487C6171C27694F03027855EEC149F95C859077189431379EE812BB8D81 49B5E711DC07ADD589C07AF90D2F81A8C7C1F11A38667DD6FF9EDC13D7B79563 61E0477E09CCECC865BE676412BD9B6195F186F0A2EE48C7CAAAA8CAA2FD88A7 D2E802B6AC0290BAC14464D94D26CCC21AC6F73CC9DD3C30EBBA3C35C48F7662 42D3E601C73F80909BBA2D4B05FEB1C1605046D25189C98AFAF6336CFBBE7F31 8F6EF9F75476F12B882FED695D5AB694E8ED7F2D68A93FFB8FD0B59CF0556ADB 444C038FBAB807B5EC80B6A1994D59DE1585ADBD099D4414211E8C84E0063CB5 620197F72EF038CF3483DC2D4EEC69EE2918646321CCB01746D41D1E6C625169 F526705B988AEF1E255310AB81A8DDB460D865B37B27B6B0C13B3618B450B868 4B54E77DBA8DEAE7DAE6F2A8952E5B4E7114D2832730051512BB048FE426B2DB C9597A38FE32AC7122094A6B968BC5C441BDA3CF2BBCB61945A84308DD5893C2 E2B23E67CCA24C9A45579E7D5F2708B596E18EF041CD2B2313407380BC27F621 8BD526DC89DC6F00FEF082276D0294E44087D006516E231F0283DF41EA527855 E612BA46175A0111173F44583C99CE5735600E6C261EEB54CBEE1407BD4E5F42 1F35EB45FBB2D639D936EB5D0F45D9E9D5E0E6B3546B11769E593B9442C8035A B9D4225C0CB229053E7C87B44E947EBFB3D25CA3AAF5D3E1910EE5006CB5B445 C6A8D962949720146ECF7DEA3C15A469971A039A73323C10DF899BDD39BAE6FD 6AC27C1877A83652866679A4D5A4DE01FC8D2DF14CE92AE452D726275732A73D C25931EEC6219D8FA49A6B1525ADBDEDD9C9C41E7852052EEC85814E494800BB 754B06BDA27022CE75D278BB0D0EFE8AE5EAF88972B37B8F3CFF259A6EA0F06A 77380780556F94B5EBBAC4328C3EDB9ECAC60A3BA37DF306E441477BD21B3CF9 F536D11E8DFE68D22F6D68237E3FC0600826327780FB8BC0B17524C657403D5B 3F256D8C3C8EFF694BA625FBF6F490D570935438B763491FB2A3204A26541BC7 02803D3BB9609B97BE24BC404080F3C88AE97BD8B314FFCF1C5E37ACEC280D64 F355BDD42721074D94DA0AF4F0380FAE38B409A209F69594E94C974F90CF7807 D751ACA08900ADCBDBA4B658A31ED90C2F3D220052C01EEEBA83926F8D334C71 9D8C6FA7AE77BABCB3560DB5EEDD22D5AB4699C0E216619BCE06D20BD86E5C57 4B8726F45FE329A51EE3A5A781243EF195285BA0B7B1D68A8C4381A93D25BD01 ACABA8B72CA02B3C26E26F3EB78DB7572A8D3333CD0998554AC6BE057E156B13 E321B9102B4531DDDFCAD76A3750D08F1904A32E828A0CD2FDA39D250AEF1704 95FC898F8ABE1A677B9B1840859557AD59C6C7BB9A3B611223357624B50788E5 EFDF8980899227A54DD61CA630D77AF0CCA4093DFBCAF7B1E1ED5F315A5276FA D48DBEC187F8275B5FC4C5F0F1FE4C06E9436F0E774FF02507EE1C1321D79CA1 E9F439F4A6137F0374222D578CF599AEA915612455DD059C0CDFE3C630F18C09 E2F511B0A97FF4896B8977F01F8E1769307F5F9EAC7217B4D1A56751495EBE60 416C46107F383BB7D26F4CBA70A232AE5260464D4C7A6C310EA8283667C2D597 FBAD6FB2E8DC8BC65A37ED19ACD2366103E4BB0E3E21B5B373E4684199CD4783 A21D81E080CAA623B761431E2A156534341E1FB685817B3D0CA4A0187D10A537 E272D7EAD7CB882C80C0B3D526B551C1618780EB00E8A8545ECF7E0304D3BD24 8D319D34B92B286717317D8625C435CA905E49AABBD69822B9E29601F0BF865D 16FE8DD5A452EB7BA38C2221B468A12D787336D77874C2FC3623F64C1A53F518 01EA68AEA2100DEFC8BCD54AFA391B8CB1E2E4C2C4BD7482CCE7A42F064136A5 4E29B4F7EEA430DE105B6DF82454E2DB3A7F845AB8DE57286A53807994BD597A 5ABA5BDB8D4EF6DEFB7349BFB410E5888A722E5D322B12C887C3475CFB71737A C7E63188D63827978C5459B3E97458CA8CE3D7892C3265CC0C9375BB2E74C3B6 E8CBBA695D1F14CCB565D1E7479DD467CF2A9D9E8D626761D1DDB484243BBAA6 EDEB36A617001B259CAD1A9F5111CBD5C37F5E7B30CF3FF690A5E7A4732735AC A225C287BF0C4CC34B5F510D0431AB5F4256FBAC01C7A14A4B01FD0439BB3229 85D076ED4741DEA2A3E09FB61FBE4D101BF1C86DAE4A120AB815DAC722EE949E BC285A76A9C9634F4D8720A5C5EA6F7155C5884C8711665167BADCDB0B2C17E3 71FF80C2E032D71BF49697C97572754F3F5D7B809F7E2CD4E8AD60EC9A9CAFAF B03AED2A5D88B59E77CEFCD2A665A62937FD87CF99E74E643AAFBD4CBBE598A0 14970161DEE28FF9877627D463A71E6FD17A24A15E112C23CA1C4BCC4229841F 12AA6C55010388201C59F4712E87AFACA17D7A465600264B43365CC5A5F4DBF7 77968505BF03F86142EFD505F23693202454E4E2024B6FE50D2DA033C1D602F6 ACE30051D6E7D69A68B305BDAE7AF7C7F124B6336F1BEBBC25B71B2C286EB64A 611172C6908A29B19675A3841BB7E47B3DB621A7726114CC24B37A2608AD587C 255FF649690515B1D05E4836AD42CC66B48B8E5FA35E01C37462E0F469F345BF 79A4CB0852F468F01A95D3B19BB4446E8003762952665128A35E7B1A6A6B0E49 21628E8912FD1460921D3822D50ADD0534A1132151A35C2C450B5929789AEF63 0E68F182A3D50ADC91433D4A07D2EE1C868A0918221D4140176F2CB5EDCA5217 31F6A651578BE9E1ABC2297F0D511B6614E6262E066BC0FB934DEE003209DF67 AD60F9CE161082DF599D29DE281DD351683B09D0FF519381E93832C2148EB784 7B57BB98F3D9D33B68E53FC77F1773E49152E854983D7AACEF16E41AE442020F D8439DB568F8FDDFB6D7DA32B5A4FFB76F78246F2F39959DE0AA997D48EAB19E 06E344E351C17493B48EADB8A8B7FCF2CB3C107110432575088796B79E30EA91 711566158E54580B9FC29840FE3A2C1021BEFB2F23ABC1BD6E01FFA709CBF79B A2C7A8112839165ABE037FC2C4FC90F5E1E624D2EDBE52C25F740BEA1EE1A2D7 A3D700A61D1AC0E78B4EFF68F259DC19152B367FA649D00FFC8E0B4E81D6E6F4 3F03DE472E5109DC462FAEF0337658A7749B734453A6AFD2E0CADD8E84A8047A 3E8C8C8E3A5A57E26880A8F99576187A31C431159150D0706137A268FD552EC9 E74D89EA3329AE7882A9C5FCF0CA3E564A79DF6525B8EEF64A4EE27D1989A2A6 05EDE81BFD69F5AFAF35B125B12E2486F108053A082A596CD61347817E28AD57 1767DA15406DDDED47B715DE04468B174BC91015467A44C770D86F422C943591 D73462ED062302F52F370C384603C907C30F12E20E534D1E25464629F944C9F9 C85B92A8C1D076C62D082B99AFF5A4F605B20DEF685D94234997C9D8B700B9D2 E177DFD90A19D4DDEA3E099A8E474E9027BE79F4834D72F88D107DE63C95CEF0 6759066B8BEF5F414F80895F3942670B8F90B2B50A0FAF2880571A99B9825B8B 2356555AFCE312865B20C7D91B2344D628C0300E7A96AB8E8CD3A3C0C728F266 C303732AEE3E9A08E2B40A9E35A4D048378C9652935BB5B922C4597165DEE5B1 C1891B7D6AB1196A9F8BE46ED9C1D64A6548142A2AC00158DA6212C87CD1C4A1 8F9D7F54244E476B5C01CA49F8C28C901E8A83AA1B4D195E124D537FD17D0C89 B9CA5A8B0C156923E94F322B164250CDC832F02B00CFB98C3E5E8211AFB73AA6 E80C5A28323E4BD410303C9B2FDBF3254A936FB02B547FF78CC0AA42AD097186 2390857F5B83FB99CA42628F1ABC318978547788408DEAC7FBDEBD1D5E149027 DC2723EED7EFF00BBA8919C08BE4CC98F93CFC96CEB9C5E7EA0F8A90ECC46223 E2F50F580DFE1F0A15A77B3B5B84D7FC31585BAC3F0264734C104FD0B5864216 0A9CCD9E5EBC8972243FFFA4BBB94F9E9C414E7F80D3A9ED9B69F3598781A3E6 DB40473023ED3A02932E4F0A9C0DBB52B175BEB63DFB57C2BF313D8CE5D508E0 4631D385304D327B440489C0C61392CE6A18698CF7AE10F903123E322EB0BAD7 A7C41785B514B76A1EF3D75605944E49AA61CB9FD6E6D70AA066DD3F0D888DBB A1117677090B625F9EC878137FD4603A445D1655B7F837519DD0C2313103E928 6ACCD540B3AAFDCE6DE96B2C07A4DA135A066724FE8F675C6BC57189D447E615 747A598B89E92B3CAEF235EE4C7790D9FE9445A6F4A45E0DAEEF91189FD97B51 CA2DE7F3CE3E4FB52F25DC41EEB5258637079EDB8BB0C3B771A92A57EC6922DA EE393C02FDFBC7BA95EB57D85A7FDB577C840402140273C74FBFC13C95E4064C D4DC59036F6AE79B5E96BEC4820A7FA308E674ACB1971E46BEA18F49CC57DF98 18211B778264ADE744616BF63908C7E6EEECF991D56A67DB6466D48701867BDC EE521735675E7A497061EBBEEF71A1305732C24DF946EE028690A6B2D956E735 AC956D1CA7534967F0952AC1653AFB4FD9C6F962B9D2F12259479B728FD8B7AD D41FCC9E06368F7C03C706A5A88B4ED6DE0D867D6F4B0E525F969CB4F8E85402 569792CBECEF79DD7A69A5B108377AC7D31F6EE3380D36592F74600E5E87AAF6 F11B25230EDB5E2CD81ABF15CF61A27BA428C3E71B3EF5A047B1153C7F7F1D54 4E4D9E987AA1767AF8CB82EE6E70F7D2850897940718BA15014A197C2F286731 EC88CED9F33980FF1DEA56F0E539E5F24D9578E281A618B64E835172774CC3DC 7ED4897D6BB0FDD4ED1BFE9F4528459A8101 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSS10 %!PS-AdobeFont-1.0: CMSS10 003.002 %%Title: CMSS10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSS10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup /UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSS10 def /FontBBox {-61 -250 999 759 }readonly def /UniqueID 5000803 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSS10.) readonly def /FullName (CMSS10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48 63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3 274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F 388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4 154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B 4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200 29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5 CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5 C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16 131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682 302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575 F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378 AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49 28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18 121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D 8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7 69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7 BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960 C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92 B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8 8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01 161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565 F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14 0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674 D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169 B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434 DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5 261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2 64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038 F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29 AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3 CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF 5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091 73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5 A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F 1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6 D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C 13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7 C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8 08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220 B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3 23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA 56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788 2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE 3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D 5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D 9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5 2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7 F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB 73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5 B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007 11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7 03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7 5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1 60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7 622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5 C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16 8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474 1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647 F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE 257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA 7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315 611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4 246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97 E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698 AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1 EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68 0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A 94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120 73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680 AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443 8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070 5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE 6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28 B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378 129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB 8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6 753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4 93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE 207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433 3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26 7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80 D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825 09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C 5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105 B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29 E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26 C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90 F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9 7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989 99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A 96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982 1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B 48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F 4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A 45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3 D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81 838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794 5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200 DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240 5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5 46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D 491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318 F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B 0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287 EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298 E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0 0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D 8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C 8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741 A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447 4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1 AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C 2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780 14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A 647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E 6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6 4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36 D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD 60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627 4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289 BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0 1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194 6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE 65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7 6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9 85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC 7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853 BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4 9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440 6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3 2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A 374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336 39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6 AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F 1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8 E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6 AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684 CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF 9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3 DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441 670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD 99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B 8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900 E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1 DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2 99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF 51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A 40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5 AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977 DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093 8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2 BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49 BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A 0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0 4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A 8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E 5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C 7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E 4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC 717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1 FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37 25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.0: CMTT10 003.002 %%Title: CMTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup /UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT10 def /FontBBox {-4 -233 537 696 }readonly def /UniqueID 5000832 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB 556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F 8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC 56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F 15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD 04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA 4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D 69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A 0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C 550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A 9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F 7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A 2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE 49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE 484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C 6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F 5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C 1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F 52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B 0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC 2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F 0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D 67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC 60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F 1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D 55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C 7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E 75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB 8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA 6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD 4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD 2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE 97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF 639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A 5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE 5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A 288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E 7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F 759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E 03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A 6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D 906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE 251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6 46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33 DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813 F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46 507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025 46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F58392F2F3BD650E49 2E3AD5A14984874DF4572816931885CE8A448EC95BBF40DDF4F85653AD90A88C C4A879C0C7596E61997B972E8A55E57B17F802C738E5C7A8FBF6424F8B131B23 CEE3EA3747DB066246C250EAD335A76FA166ABF75120CECB59076AB31A51F176 57176CBE8C802A97B0542A5CFD6D5E6D7EC848B923012E45D9F065BFFA0D03E6 788B68BA4DE51DA37994948F859D41C28BA939C3A82BFDB44DA585AE80B8CD7B A6EEA79B70BFB4864E06F06A9751BD2D2A209D150D7135E0A25D67263EDD2A7C C63B5B76ADB05D44BD5BC0BB3EBCE2E74E1AE5F7DE07A59D90C932DAA2553505 27F2AFC05F7CEB39E1C7E54F69FB0BBB069959F2FBD11709F8E81F6E7CA06DBA 1CBDD8E7A78487462596DA288B50B295E46F4C3D9BA862688C68859734B232A7 4B371D2BD786924F186524765E789EEAA30B20C069322D42C893A30BF1BD2C46 F8F3732DDFE80B8FC1789239345944D8B457824FD80D11184E73FBA30EB80A9F 2FD466826D4E666E3A835B98A1D4AE5D17053A6A648E26E77BD08F9A3E02956A AE82C4929E9666F539079846527D0E326FE7CBBF86E3722BA3E53F8A5121080B ACF8D3C67A2A1DF624B9DB92105D3C833F5A6ECEC108E026E1D3D968967A1447 15CEFDD09123D56606134BC3449404ADAB1330C9238DE48F3CDFBC91EB86D7B3 8B85B5BA97376A0673E434DBFF19798EA90BFBD94493E2D21976F8106FC0C276 C81C9B9F7D4A68120DDA56FC6EC65FFA40DB78A60A05EC270A106DEEBD2CB92B F0622BD2B1D43771DF39AAD3ECB655F317AB483F7290C148690903AAA636583C 99DE3DBA99EFE20773D3D8DDD816A28D7BD8881DE570BAF5C7A30679179E1214 FCFED81605FE56AEA21C1894167F93D648B474352A65C0756F812F97AB435ADD 22C031A21714A626DE35308AC51CD676DB1748DD2773532294FA77CFB2AAFD32 A72BB7A045F12B4934A768F89217233DBBD69B900B28492A26713CA5D61A9042 A982CB071F1F875718FAC168E4E275860DB6369B8114E1BDD4801110B62C3E3E CF140554C826967A99F4E9726526E87D57BF845CE38E33893E5F9788769B6A4B A4577C38C8D45AF2EDC9F4FA7DD9979AB8E14FF5D8956233AB4C02982BE8E561 C63B7BC314793F634DB6F086E1A60D9FC3B69D3A7C20A99FBF3CB028CDBCEB60 E803C8DC3C5F0CCAC030905E72BBAC052520CB0E40E23B46B2150DE67F61E4B1 8C4D55904B7F90DDE4A4A78B11AE1009DE46DA396791B1C0EA63FB6897FDFA0F 42474042E7E9B06A703A7C6E672AC6705506F3C0B6861BC85CEBB9DC9BCFDE0D 43F5248CD7CAD4B89835BACABBCE6C791BC35FE7211E775C009844FC75CBF6CA DA6A6B7B488270BFAFFA3E9950914CB0F88C8AB7CDEFD2FDE11ADA7073037EF3 1A5CEEE37090F3A56D06FBC70597907A26498593783878C02722ECFD5D65903C 7D421CAFA78924DD27756853568535B02533C3393183D6E30DA6ED4BD6582E09 A5A4B4404EC452E91CB44515AC6124EBADAAE8A98D8A95E7D14DA39951EBC461 D426490071462F246794023DE1BDC04AB0F1834D50F748C3C60A07E1FB8EF400 78DBAB90B59500BD1232A872ED51928329CC8F06E83164FBB2D0B24222223EE5 992241E8E00D5DCCD6DB9A8E2325ADBE12FC8512AC127BBEABDA739672C1644B 554850CD75724E6779A7E76424CAF89E9455860E0AE2679231F4A535C0ED4336 313717D6F7A4A4DA833847A1BCFC7BF99234FA645F2B85C9A9AAF7108931E3CB 077A9C571E57B0D7EFD92B56C3AA4FCEC0BCAA96005E649AE8012366BE6E62CD 9E742F8F45AE4C96BCD73AD80AFB6F061D629ABEAEC3018CFF45E41F46751953 44E490B1355DC49C1E10BF343307263584091D122ABB1E3892E532B6DBAA105F CD48375C112331EC5DB49E4D4CE2D126C9274B21E678E5E3EAAD4EA0CAAA29A7 86FD8819217B195EC6E40AF23ABCD71156656DAD38C931C8730715A2773DC44C 4DEF14D92C2A054739F27D7EF349A0EB76D952BD9BA169B4F85C09D80984D232 2CB4A3812BDE539DC79E2EDC7C221739D16B10246A5F57151C210878556D4176 31EFF3AB6C4D78C4F0DF81692B3C9BDE4F85242BF0E84BACBFA39688BB222A81 E85E9CB332868ED5B64E140C66E242B97A90C13B6DFBC3D285A49BA9D4BA1A47 64D83577FFB50BF974D953F42A249ADF9AC228CC4D8E82213FD463BC757AFF26 DF4D1678FBCD55AFD5FB3014C0380B2F8CA9D6400DF2AA041580A6FA5694ADBA 674286F00E531693DB28F7C996D5A66F80AAAF53001EDFBC065C72FA5BE3F114 1FA3354376AEF7374AE1D0A8E9B06C58FD029922164DC9FA09343FB6652232E2 2EE34C662F0092BE479D739ACE775C6F589775DD768B736F7391B9AEBDE7F760 727702E145CF749DC457B2E98A36C52416107B1E59084B5F777B61511B8D17AC 88386A7933CAF852CA23FE179B67DF8DCF15800755605847ECC0FD77873727FC 1AF2BA8BC75D30E26C40913771E528724FD7C5DE284A8B58AE55A5C48AF26AC8 02E155B8FCD6755D8F7F5A6F1AE66E4D24A13567B6463B18E65972BD75ABF732 FB41F87A62FECE9A50C697BCEA1E3B3DF1E3DC961DCA598220CC746326F85F83 72E803A4E69106EC5BCA01139F92171DBF9964BBEC8D3370039623CA1F927CBF FE7DA71B04B4321EB4D3FCB27F8404994CC7DE5F26AB8FC019A203D6DF2F449D 85A4F103F7604986A1AC1F7D05D239E728FD6AD1DB5024B0A0542130D2B0E7EA 4432F910F9FD75568F5732EAC95F7A87CEBC359949C26595741533E952327791 87E42DF84E1064E1BDD3F5A6455087B8E9C783AB9ABBCAF032E9FA32C27ED7E6 CA7E3D1D76CD1905166090BD81A85485B9B4E976DB2E19A8E62EFB795FD6298C 9ADA57D5BDA2FEBB227F0EFEC59E4B51E06B8358006F9D79C1EFE92510D6046B 6AFEEDC793137DE622A8B3F5C9E3B21F29A98A589D9CEE75E348FD4D206415CE 508AB95A7496236AF1F6F5ED6B3ADFBAF1E35B51484F9B1E0C11C5AEAB9336F5 A8861ACE1EC74C4A145A64E4FC8F6BEB3A16B021AFF4AEDA59B06326A8D7FCB3 3B75F9729BFB7EEEDA8A1774728C80AED40BC35D42045E5CEEBBBEFAD2566CB1 AD69A9A972826DF0F2303BB232367E611C115E8955DC97779B1AF269B84574C0 9D816C88BAE3AACA6428CFC648FCF0869AD9236591E3B8FA326BD2EDE7F97286 511C75F4EE4F7B4DA33BA2CE7F778D92AE7C1B4844CAB3ED8FCA285454D78469 1639D24729E8002E4507A114407DF51543CF7DFFDB7E05ADB2D36E139F2DBACF D90AF274AFB3E5AB5B38918A28EDFCF6EACA78248BEFDC2FAC0E041AD35B130F 8A91E20251CE976680FCE3F8B65B33118EF7C138CA1260D3CA855C94FCC02CC2 B29C94A3FFD38056ACE512DE680DA29D97BCFC35FB2A85057E484FC9F72C9A7D 08AFAFCA705335C6E9AEDAFA97D884E0E463E79D8AB45DDF86C56EC922283C4B 777EAABC0D57BEE30D4D47FFA16FEAE2FA972E36516480E1FCAFFA5CE692B7E8 8F887C5AE573B96643F10BC62FAFA4BC6CD04F5353C0D40CBCEFBBA4DE7B8960 352E7F6497C9C4489779028934084522336B5E5DF6FF84A78158ED5035FFFC9F F199AFD543D5D81C0155F3EE0E7F6FAF7898F7F26941D417F7AB37703FE67D37 C263078FDC85C5430CF379E657FF9ADA0C00DBD605386F5494459C63D4AC057B 2E061B06E17B54AEF38A9EB401FD4C76C6755F2AB651473DA2F19E28C89229E3 FD385D8559EFFEEE5D0CEF127A8A6CF9017459466E0FAC341DE1994C03A0CA5A 799CCD03DD2B41A05F7B36493638AAF8D7CD380E03726B0A18B02A46A0BCA027 9BF16ED75AE0494C36161ED2C22DD7036FBBA2E319106B9A56FECC732B87E2F2 596167125221D42DE9D4435DAD321F878FDA68B9E72DBC2E31178621327BAC50 72148C123D4C8568DE822169839906B9F0ACAF3B4DCEB9352C8A9E246A9A5EA7 31E04981D0A53F44B6905704CFFB9F0463518C02538DEF2DBDABE936D1213FBB FCD28F833C5872057CAA92536B8E8EBA129745E2E2B5A9F07086A1212D466785 EE640432A0E47C91CCFF3FED5669C8ABC2B43551AD04E7A2FEE2F3C16511F7D4 048A8207351E83AD32A72360A2DB1AA8F78C5D2630D770F5E13D5C49BE166475 79483B2F7FEBC1D73B04E0E5D9B8243DBEF7E5D201D9F644B150A230B5CF9B90 CA34BB8474BCF408E37757B8CE5B33FE7400A68C70F542C7E2A22B8C0AB1EF9F 2BBA7A646A4C872C43C0A748F078AA98A13E882085B460050CB3F5B09B62EC01 AB87AF8DFCA6823ED6CF8426EC115C5E4DA335FE416E1D37311B7FD56793CCA0 BF90B579B0FD4E4E1D0A26FB0C1D490D99CF4994693630FA343960E15AFFC596 49BB7297BFB82FD56BBCB36DC1597F94A157AEDFC53419BA867CC02C26464BC0 2875127C688DA6902567716A908153DB4CBF710CDBCE50AB98E0CCF1DF5CC571 00027F6582CF6AB4E584436471D3C8DA2D780E5B02A9B1717364899D51EC679D CF5F4A4981EDC24F710E892772E4F891AD02B7B98A113FB1AD3B6B12D5F17AE0 5F58B483F0DA06BE1592DF2A0F06450AA75BF90968DE280DE8FF44BC3C7F19EC 82231C5973AF84C9F5CA326F19C68758D3389C4EFA9ADA181B97CBD285211981 844B23964DBD8B573D36CB3E9CDBD16379E4719F0E75054A6478F26854A3C9AF 805ED631D13A802CB7B625FDF5FC25F1657E497BE58FA29FA318A9683F14588C F988F86B2BFA4DABE2EC1EB87366359F9F1B829FD06FDCE78B61DBDA445A28A2 78C8ACAA21AAD2AA6CBC057DA34F0779F5DE8EB40EDE0D0C9A9AD91DA2D9B274 FC411E66F9B223AF035FADE15565D4FB706A7770DA6B60528565F0895423F2C7 45CE367A33B6A30A0EE46EF44EA30FC9ED12D976E9FC97AD4219291C765DC146 30D0A272A82F5E7BA32FE9AE0763D79E2452C1BBF0CBB60AAAB3EE5E948339B0 2CB4613A719938D66C42F9479F20EE137786F09371C5250F4E7EB48A0A253CC5 4EF80E7BA8B27BD2869D59774D612167B43ED717C9444DCAB5BD8580314731BB 795ECA2554DD67A7CF72692F955C99A68C3FA12B6F590292A5D90C2AD4DCCCC4 4E53040E95465FB42B733C126C6DB074FE6038B29C520A56635C5E89CFEF47AB ABFFDD36F5FB0FF7E504678606566FBE4AB7771DEF7E3B2BE11387CEABDD6D3C 95A3BFDC1A0DD87AD075AF11EBCF8EC1A6555617307DAB70BF4AB3E274F457FA AFA4875E25A4AE9F7245D584D1547FE5253FE5B2EDE119F047D07E802F698295 CA1917F010D7748A15DA722123D24B8D7AA15EED4F45183270591095401E032A 5680A3A89EB930750DBAA03AA099E89BF25DDCCE2974E7FA1F958F66B00A6482 3A318135518500156B4B744FF4A4A8F1C887091655BCC1B02A18AFE31023D9C6 56E12A4190321A026E3D72A9FC0EE92F206B2356B79FD3EFDBFD58B8459C345F BAF52BE9F5EBCA91C48E74346FD249A4D3B6E06EE98D89959458982E5E679602 3914BFF2D3A174DB1539FB475B7DE4C499BA3961AC497872C9E3F0777350BE92 36A744BB2D5643EF3EDB14FFBE5D435BF5C2625733F372A022CAF5B522C4DE61 02F3083D9DFFC0FBADB4F6F6F15A868B00D38F0578FE83857DC5EA675CAF6493 ABC66E76392590851CFB2C16A3F269B9FDDD2601BB1AB63F872244D125E5FCFF D123615D884CD7DEFEF6EACF3B9889FBD75554F3C867A1801519D6B0330BE8E5 2A302CF3292D6EB3D61AD21ED051C0506B4551336037B329B41DE664B0F84938 F28D71D6E3C1C44B8AEB55AD4C1ADE98A766CC94C7BC95694C6C7AE6CB3CB8CD 42A255421133FD2973F5FB3955BE93C5D0BABD105DB23FA713B9DF6E3EBAF101 37C71823AC146ABE01E372B1C9CD7E14EB8B6A5270134140F71EE9B070AC7F2B 9048DFD5EEFFAEC4FF3B916C8447DC37FE94DD3D776630C069D5274FB8AC34C3 265E67D9178A231B013739072CC8C8E9E2CB8D283ADA16F72ADDFB25446044C9 E196B6BBAA9ECBFDB693740EC34F3B2DDA6E386106E86E5A993B9E39328502EA 4F3FDEA468DCD7D1A2CAE4097439C2452638D889E6A59C24C842837600F4ABA9 ABF1ADE79C00813AB0D8905E62200E09945A10E23EFB857920AC2BB20F4863B7 8E05629B7AB4DA06BB7A7CD9163E6DBE2E80A7CBE84C2D31C4CD5CB77E4EFB58 4A2A65AF19B2EA663EC95AA09A50D002D03AAA0335EE8C9580044CF2AA3432DA F779640DCA95884B451E2F5F6902140684EEA0FC7EFCDC605A76EC3E0C7C1497 2A94AA4F6ED573F555EAFC53E2F1EAFDBE9FA317C264671EA1AB2C830F390E30 143B1189F54F6D849E29BD956416E5E7D09C77FF602FE1CB3F23C4125F516315 8AE8ACB9DB2A06093673DA03FA2CE12EA5AC461068B2D27FAF5EAC9A227D84E3 8831804CDCBC5B96B4EF4DC217466F773313A0D3E77C0CF7567EA25BB1740BE9 C88A72A87A9341352E4D9B13DE08BAB496A67D26494756007FF0941662D9F352 6E60932EB27EFA1ED3D4EC1C7F2C774BA944516D02957C80FFE810F076D007B3 9B3EAC1F611BCD5149508874C3317EEBA3F1345292E06BF66245B402EA42522A 84D3C243DAF31FE8E99BADA939E1CB73FA50D2CF9E126ACABB5892F93A7A671F D998DA6B3A7C80F649B3883C559108A7BFF6C5B5D277E4C6AD603EFA295CF317 BE9E5D3182D07E8F8BB6754CCB12F37688D5D96CBC08B605759269C482920BD3 A598BCD8FB93469C707D8180D444EBBC901F967208AB46B6FDA38D78B73F38FC 774FB5C148A1E1CAC4495058D2A216EE7A3310039FC94D623C6976794161707F 97584026161D8813F2EF1E8462F708E7D6962E0978EE4D647DBAAEC4F48B09C3 8B4E6F3957C05AE2AA5F74EEBD2B1787F9A0E2E2BB952DCE071D21E2093758E5 A5A49A91D6135DEA10E611444491851D4EBC339DDBC3640BC3CBCC7B27D96145 4FFDF10F71D15BA6E3B1E7D8C2BFB5D2CC007A528048E5A73661FB50309A98CA 7AD4B7FCB0E0E6158176BC16D377E365C2B9416AAB319CF9FA32BD86B5349A35 86F3642EE8E4AE1DB8FDF94822D758291885D614D82CC62FB173081F47186D94 380F509728199DCA859EEA5910411795158EB4A96E11C5C59043BCB15662AEC6 211340E274081CAC644ECDEDFA6FDDF2C840261379BDEA8736B21431142CBDF6 58C19E37E55B3254E45DA3EAB27403F88BB95C16281E532D074D54EBD9343E26 E2140737C6C174E6BF0114833AC7F22E1983DB4A724E1F53CB01B68F663E2C1C E2772C50C3F2591D7DF1C73662DE1B33B466D1B95592C91D2E4B01864FDB00F6 37834E52CC5F22BF45D1B544ED861CBE06509A310D64875BD7A379F75E93F65C 9CF515631D905FF9FA08CCF3C28FD75C5ED2A4C58D676727C1AEB519622A45E4 E1AD6CC374E71838A0BC3EC3540C93B792128A16040E576FCAADFF61875E11FA DFDA95E3DE5C920A71B314D0933A5081F1774C4E3017580E815F82E782448726 02889ED1CAAFFF1E0BECC37BAD6424F4F37399EF0E72A7EB98068B950D9D6ACD 644C015B1CA7A0EABA43EFEB65319F53097E7FDA550F196FB93A6152786C34AC D1C9780AA0F25F62EFC4B90C4F7B2397E5EC9D05B50E048949FD3493EE0F55BD 4838D863523895D30619AE47C847470D1498770B429A52BE8C6E865607715FAD B9240E884180C2C5292449F533628E0B9971E39925C2F095F92978A485379F84 E39F2DCC5612F42D7227F730726E634EED195F21B4DCD11D2FFC37066892BFA7 00E738116296650CAF2B0B0DC14DD4DD0C7598FCF5506A3F81B5797315A4E2F3 CB98FA8D83DB67796B3E3BEA9D05E153E8A986113F7111B37F9822B103DA140B BD4827D2461353BB9A6DF49334C1EAAD6E47E7022B7B247E8E6FE3C138A22AA5 523B69A155C13F9B4EC7D6D800DA0F162D3EBCCBB863FD37BF131AA30EAB0B45 38FF18FBC8427CC09ACDDC32FFA8F76EF3B588F80B7C9CFF4AEB798B7B993298 B0557B65D61530094CD76706B1EECE572030668FC456B3FB6C73017F7A7B1A6C 43F2D0DE06064192291B160545405F50B72B91642306B828B2E3D41D398C6F1F 52D510B127A7622DEA0E58B7F2F398273B19EC435266266ACFE7BE90BFF02898 EC0D87D29EF8848C5564989481D511A87994A4B686FA92C55B9A61A8CDB80887 85EDD9C1DAF5C4F4A64FF14FE4EA5EF15F66BC5051993A90E5FE7EFE9190808B 1B707CF38DB9F03CFD7E949337520165F3C412CC3B792569C2E6345AFB2098D7 20AA7DA1E1902B44A4FB75739E88ECD54B872D6EF3A7108E6D72CD2C875B2377 DBBD57648E398F929431AE0E5F717515140C2ED879513A038EC4620FC77A75D1 9F82BC0AFF47B40D2B670556AED8B15A94EF21C4F74A7A97A809346B9732AB0F A385EC08883C04819BB6F7B180E8B01417755C27BD7542BC0FCCA152643C6218 C6A56560BBCC9C8497CA0843DDC25E697D8583B539F7A42DA251AC0B117B488E 7863E54FB2EB9C7CDDE57A7F081EACA1B06D054F77A4F1789615CEC7F2B05251 810E6E3C95EB33F25C26F277957B18AD32E066A9D19DE8EF12A6F74571744109 4C6493EA55163A420485ADC9C29503973246ADC02FACCC8D815FDEABDE775CD1 862BD5DA5D797AEA2937C02A46D84014B8887FEB1FC5FC4DD9B24D723F19B566 D9625AB71BFFB06F033265591CC0545F7ECBFA373117ACAA2736E4E3A87A8569 4D80C346187E100A9FBBF12C9A81E2CEF47970E1C0631914DF39A649905A110E 5BAD7B49BF545A56F965E4E5156D4EF5DD83970366DBFE50A245AB11611BCF01 15449C350113DD9530F553E03A18FFC0A07411BEA31165512DBEA89E8F654AD0 5A644D1C0A927DC2CB03CE4E9FD5DFBEF142D6C2FE6A43AAB015F2CA593A2DD8 913463A1AE71ABD263C4508E65A53BDD0CD4B862ADD8174712ABAD7F3795F076 13776456A5666855D362210C445BBC5139F1381F0D3496F4AF75B9AAAAB96CE2 C05F4A3F34B892A1B041D7E81263026C9FC77C70532F7810F2384A501A5973D1 75322E4C0CF85D4A19B6C400E69D67EF3DBD3D059A4DF9F31C2D5C2976907CD7 01799D859866A4D8AA28AC907E42DE844726A222F8E7C08FBC5A436A403BBD2B 6330F7B617F9176D5A1C764429C6A4209C211CB1F2A228CAA240FBE8BA615523 07E9AF3AB9AA0BE7FFBEA0F654AD9A34B41F4C5BD421604F30755A3B4D2A730E 0CD4892B1DC3C5556D9F561DDB9A14310DDC92AFABBCFF8E240424905FE3044C 6A5AAF43BF1F2C6056EB8134F700E0495E6B5C5BFD37300622E64B31388226B5 78938548BB90B2F1A962C2190C7B90B29E6E925B41147BBCBC99F7F8A3F0F057 E34251B6533666F29F4345C5998DC1A260900992437B80E5A083671BE32D8E2C 258C3EFB7F0CE16CDBE3BAC05B2E837F8A974650B6CFE8F390B2C796D121C63C 44A78C5F0580F5D153B456A36A9CCF0AAD8F95BAB31D4683CEC0AB1BC9FE204B FF2D3CD66C3B0350770213BF6188DC8D26117C833DF39501F15C26CD05E96B93 2EDBE7BD8B39767F0F9EB6BC38E65D516E91790E1512B7239FC346FC7E3D6C3A A45BE5B71061601F14069132A036CC0396F846E1957D461A4295A4F6E78AC363 B58FEFD565781EBA8172D7E39AA65E0AFB7A7F2B941B6CB9A4B376BB862C2974 9077795A81325A58D8109B5A74E4C52ABEAAFF5FFA860ACE6317EBF45A20E03B 9DB6841A46EC508A1528A2664BDE3CA6F2AA55BA85962FF630CF7E2E58A9F91E 1C8C13FA9BF19B4BD735B2A9867A80AF01D63E88CC7CA4FB52B7DAB9EC37E633 FE0BEF5263E124E956B4B71BFB377E125520E35DE6C20822D6DFB41AE47E9B21 EA2F657DE470DD00A8415D70BD546370FFE52A8579F6B324C6FE537F36AE5728 103BEE556A2751A2D565DDBE88ABB89B34B182C65AF7505C907B9E29C8420683 A5C911C87F2CBE86CB6EE88BC260745632CE922317B4C67F177447EAFF00BEAE AB833E98C99AAB73D471575541EA52219D713DEA8C972804D5601A296E5F8A22 8A8296164D71D26C6C9E08E1ECEE4C2EBF740B7E6A21674EA2C2A41328C62801 7AC93682F7D621B1B596BD3C02915DEE0D711AB59A545A4FA2871882B16A87AF 1854B93793D5649C0351A4F7838A736D16D6DDC734A306F94AA71026FEFB88B4 A1548ED1FB2281590DA8FC253866EE92D1FB6F6133207F8C8EF10B5ED892F6AF C0303F9DDEB30AA53AC19715B58BCEA2F4DC4F623B17ACC922FE80F13C85A796 DB0EF836249B0F339CE71E449381B94E58A74D9902A7F43D956036CAC31DB487 C3AD8314CB221F880234363827E4731D038A48A5AECEAFECECB9B5FBFF879B54 105CD0B4951F979E005F3D6BEAA76CE3E0CFD6B8199FB74020510794A88C0EBB CA0178D8302D088F916C55B0F52FD8EE8AE23DC1968B6F3EE9626BB864AD70FB 1A4327F1E2F1247868C46067609C6BCE3FD2C7174847B125C72FDAD352D187D5 CB0EF6065EDCDFDAEF4ADE24FFC9673AEC919496F13197104041E56FCF69522A 49784DFD655520E320ADBAA889C00E4DE462D03B570897C7A52C2AC74C621AAA 2FE501BFC3250B2035B647CBD2E486370A566D031D08F38B15323B413C1D5B06 5E151F3AF3B462346845609198D54496D5401F2174C2805E3A65AB8A2C4E877A 48ED718254D11E279333005A1407A16794E190F3D3A90B1DBD9977A5F4C7A868 898468FA7EAF6B0A052FE6CBCF48FDF8E640CD82161AFFFCE9ACCE37E18187F0 D0D63D27AA64515152ECE18E5C57FBBCCEAB3E8BCD3E7CED15D4996E1710D303 64720E007D032FAEBE65CBA12761602A55673FAA9D55DB4F4B57003595A8E8E5 AF179A95DC426262747ACFFD9C16BCED1281EA19C3D8009BC15E163B3314610B A380C4700F4AAEB33B9A6B823B76B54B720E86F545206E3791B2BE1C65E93632 8FD5339C9FE00E1ADDC3D0CD82E21D807DA388C2AF03F7AEF7A80D2135D505A8 2292DF06D6BC052754E2B71B2B7B68BE0AD19726D52C31F890FB1B464DA41154 9E29BDB33823B56C4A20921516A94E514332264FFB3910AAAED67079A853EEC0 15189CF8E81CD53F0A7FCFD995B2C3EA4262A17C8D17CC89AC2B099B56A6B747 E01CE3707195188A9A37DE6135395DB2D985994EAFCCD70461E6BD994C643A48 4D4F90FA80344C5B60A52A7A2127E43B0169D3E393EDF94F88B9F9B92844C4D8 B097BC8C954BFD48BFF7C6DE1F0FF4E8E81DF89784265F75C703185CABE68C2A 018FAA8C574475CDDAFFDB7EBA6E8C35E588A43901005D5832032850C7D5961C B8CBF13801D665C00FEFEE921BDFBAE959C7146D40003560DDB2D463BA2B5CFF E82A3E0A9AAAD3F7397903B1B10318A368E5C9BEC354DFE7716FF8CD4A892A12 BA09249167875C941602036840F9C911444E2D25BE21B82BE684CE3723D842FE 2BE9B0AF3BB67DD3132E685392A4C7E8A8E077A15ABD308507831531C3A00BCF 52938EACC6F910CF502B02089F967A20D337C0A11AEA7827B21FFFBCF1263ABF B491485CA2F739C797029BAA31F8FC44BC251E050B6A5FDA221776B78FC31689 137FA24DC1B17EDC4830FB317930563FAB1CF32606E5A4E1452A9399617EE1E3 705358947BAA65C24606A7733E809163EAEC2BA438A3336BEF4C86845B1CC333 EF7A9272C668512068C3CD1B3C7C4AC26A0FDF57168CEB853D8ADBB3808FBCBA E9791F269DEE44F07B3611FBB444A3F9A14824A668F02ACF2215284C372A8527 D075CA0D46CFBB29316C8D7CC283255D9A51B5FB5C9AD76C16125F38046B2C87 9C57A49FFD6B362627614CEE3AC8A0ADE4D47B490CEFB52D3340D29A158A59BD 2F2286A7FACA60941B33965F0352D09D5BE347CBD3E0A52818D6B1A903D327C5 720C8AAD263602357ED110CDA961801E8D719AD728C754C447410691E4884C77 01ECE43A32E37248C7D3ECEC4A89A059F2944BED069508AB72AC13F5F504543D 74893C01FEAD576C17A46C8BD26F2A0F58D26A2AEE9BB7B6C829A3FBE1626F33 52EB1AFE7D758658F83536AE9000F1E62577081C0F0EF028EFA9A43B2DBDB9CE 12B4EA70A67A6B7672D3E11B8A7538DD9860FCDD3B1B9A3040EBF4F8C454299B 19BE103BE14AD1ED498342851BAEEF5AC51E0CE6986C2284FE9A58EA966052B9 26B318CA292B7BD92D1D522763FF9B39C8FBB226EB405AFD53A394F54362A3D7 DFF419A16BDD238FD5B319F0F8B28A728D83CD9ACF996B3505D7E7BF1D4F6E7D 206272D87AE8BC193FB1DB69AEFA8039B1624C2A61F4F6FAEE38FA5687D1BB3A B63FB2C86A7AA0CAC7E9FF64D493F7228F61343D5C4E7A83FDBF9C83CFB274D7 19E5A14583A2C73F593E539F79515DABE3C74E36EB0F3528BD8B47806B16A174 BC676EDCFA48966A539B233D2493CAB395D23D2A70E2D44058E33FEC7B7ED3A8 D78048569A2B2E875514141B594C418ED568C0A836DCC359A0D31DEF90AB460B 7545B2DEB3E48DF7274CB68A9C63CA6D1752CD92592590304EAF5036C9098BCC 61DCBB3C62A818CB68F96D8FA42CCAE25C58E18C314F1A51B8C83DE27499C208 F2F39F2B045769FC4ABE6A86C415EDAE2133076F12F744865672684AC1817C14 C1BA5EC957511D26FE98C66E17704D8852B94955B6716068C6AC40B388029BBF 082B29EC460A72485EE4519F4E6760E587899098742059D4EB883B6D454CEB30 BBFF4B7292C6EC701CD216EDFF8C1639BC775590F81C25BA12DCA5F65D05BF73 45CB096FF77CB7992EABC43501ACA04EFCE79BE18FF677B82395E4467C517CA0 4D47193205329768453595DDA60CE8CF2BE3D8EB681A15EAF6011298BF1B1A47 2F0495F355ADD936C5BBAFE132FAEC9D52FE219E89296499CAD8C82B5E1CA064 2F01E54667D46B9E79B94FA86434DE0380ACF50BCD00F2C8805328BEE2C81076 F50F499644BE530127F50B86A737FA7685684BE3A0E094CA69C40B019BAF7912 02A039AC3CE8892EB6D5D7E70E745323E92EEC3AB4160E1BE02822EED69CA27D B1C2ECB1C66812D0E65C1AF79E2FDAC6FD6348DE85682E7DB5D34E3F92121019 93BD21CB772B840B1F52CB5F8E9006C22EBFB2FE33C5F44BA113564869C50A69 6273CD3B811D9B3C1A805C477820EA38381D6B07788CC7A1E21311450BA1456C FBF82180A7FA6F3892DFC3F9198FB20207AB60F684B5B5B5B088BAA99721838D 1D04EBDE52B1D92122B1AE417B0C6B81A9130B73976399161ED5EEAC7FEFF66D 3FC99ECAB97B709C0C4FED0403BC125CC58A47E220E7D34361F2F7C60503D8A0 65BB92F9430B68B60803376C8A89EE33DE719317B0B7C79DC2A0E3E7D026DCB2 07106E9915635FD60379AEDE3E9FDBBCF4F3A78ECF3C581DD5DB376924074736 9C4F41AA71A3AE0EA13EFE6A702176A7D48FC40A894AB670365D7C137141D3AA 7D775256DC9C88264BA953471C79E7175E07A5250CA92DA81ED027D3630BDB87 810DA4471E1D3E74F29B393000D5472CDFEDFB6F2B630D233E2C66D98D4915C9 3ED70B6FA43CDF0A29BB35A76E57CAF0B48F14B9DFCD148645227C1E0602B370 5259847F89C7A8B3A804298B4D37BAEF277FEF1893520D85C45D957FD50E4119 550972C6A72824DE32DA44F5708B0231050CEA469E1E30EEAAFC5781AC52863F DC867A02706C41A0EDCD9181DA098CF7DB52CCD2E849CEED4ADE78C5E9A9D4DE 2CCB81C00ED5C4709FD97219ABB9D6458C504F3C383EC78A3E3CD6A45A5244DD 05F6C3DE32920D23BD9D833BCE40613B47BB38489D5F6E61A17B72FCA642CFB5 D28A91D73DB2B57897FA9D6F255BE25013D7DEF084C39E2159AFA00485ABEE4E A1E6F0DEE025121C776BF4A28489C3D946F019DC3067EBFBA71E691F9BF5CE2B 5F028960D2F0252FD440CF9505B9BBA8D90F01F14F15FEE20ABE1940031A42E6 BD4FB11C08D0FA129D435A3FC9317CC3EE747AA4F26D563200FC18AD17477678 5B6254F5F38296B32F9A5607E2C37902E69B225B3BD3E1239945D96CEB1F58B9 F6ABE5CBD604D1520B3F5E758D7657AD7082940DCF2CB995BC3647F827E5CF51 C951B9903845B9EBFED58020BD5145C5E2B543AB34D599CA31ABC4B010FA32AE 83A06A1D0888335A24F3EFEA5F370257C10166F483EA28DD8C2EF1EB4503D281 F5443F349844F7A8D407CEFDA666832DD1EF53749BCE8B198CA706BB29B55671 354F3A956D3B233AA1071AE56A9F4B61E6CEAB18EBBCA2E31153F34BD63473DC 720940BA879968E030189A911248A6E40C1523EFFF5513C81F99157629ADEF5B 2EE336B06E3FE473768F326561564439476F625018556658F594D845B3A3A204 B9909414BC311F8618466883146FD42E39E23C29DE17D5D1729A93E8BD232739 C82B39E654C44AF80831B144F703E2ACD146A9D75D34794411B74C7D9B489502 0C7829164E58F89F065F2E8D9E51E09D814B0AC67C74517CF56E0F1CC9B82B39 5BDC2F20E8FECED75653740557B987E84B51CF96EBBC458CF807B8378CD3ED44 9F106F75EEB62305F87C0030EC1E43053336634B9CC0A13336424120B361E9DE 1C2CD4B935E4DA1402C8DCA984F424A510492F779653CEDDA6086620697E362F 28DAD11174C4E0CD82C2F43A53F0DDD8AB78446C279DC2B014D122DE26FC349F 70652A7A31CD4657A010DAA3DC14250A559639CA278D4A8A875E6869DB3B7588 B4025A8263DDB6375CAF7DE898E97015BF1799228C82C0AFEB9A325D98A23C7D E05C286ED41C31CB63223C914793777A846D1BCD4A282579A05573C11ACD8830 7CBB3D2F67998EAD15EC00E93125DD4B2D0BBD77BD5270B307A2C323980E0832 637A970D583B65E114160E2767CB2901894B286A05B80FBA80E102D450793DD7 0EE12EA881FBAFC383FCC0FD9CBEAF11040375D5E1A6038DAAF03449C53D7385 4799A2730370F36D319BD4BBE40DF2F03232B4AF4DF26DE16385E77B92B4F876 0A453DCBC1929ACF9FD624D37DF131E48096C7F1ED54B1D39250E1DC847E7768 E76F736DC0B6E815FF6DEF6BA3B85D7A0BCE94C9EBE9A8412F4661689616D028 62FBB603738B27BF651D160562DC84B42C9B2FEC3FAAEF6D797E8A130C6BEEA8 58E70A6C2231721A5DA3C88B1DAA886B03F5DD98EED2D8979F02CBC6489AEFE9 AF3171CC3F9D130BE9995EE60AA1E623545FDDDA53D40A36ED0C056C16C220F0 70B319544EF63C7ED5CBEFB52D5253A5F3623E7D741522668418FBE69866C9D6 3B7769DA2B2B9EBC3E4DCC19082D4AF1AF6B680F7AE5C69C97B59CC9B32A7414 8AA7A9BE8E9EA76D8187BBFD283CB23C6295EA66C30C6ECF2645ECEC569C1220 BB54BEA66568A1DE053A68DD265C6EDAD216706A07865A2D5B6CDC7ACD305177 ACEF36712277DB40C1AA1CC8F459426299CDC13EF92B3689FD865C9BD9F01B7C 6ED6D4D4D33CD59D16D97F99CF562E058285DA624C0B07B71BF8B74D221877C2 C3E2096C4DBECA33DF69AFC81BFE1946D32BB8BD7516EBEE578CA41244EC84A9 08F593CECE8EF1BDE76E619EFC5633994E42B451DCC4638EBDFB49C25A87D634 F800FACC30206ECAD3317083CEE9D5CBE81FC37C4005A50785505602D210F900 2F2F67922E88FA576FA57A3ED5C37457A050ACA65DCC2D70D668894F0FE81F48 8A1C0BE4750037F39B9EDBC8FF2DAC29002AB77C897F78597DA8380208C31012 A4F22B1901989D6F524BAA8A160E193E88E7BE3D348F38E7C9106763E316AC8C 779334E4C9EAA1B3E6F95670C0067A92FDE8F75AEAF345CBE86EF41E2EEA86DF 6427B93DACA64B10C6138C20EC7A81C02DAD4B74D3AE84D184149AFFDDCE09BF AD4FD9A56B06D7530613AD3355B188BA8AAFD354F9EDE192D6910D5B50BE880A 39C24C202CCEC5C3342BCB2B6469DEDA91ADB1C95BE67C0994DCFC1FFE61F20D 5A79005503566AD17A7212D7BBA141C78C6D1C4A71B2619535EDA4C5DBB24FE4 8952F31729497DD07EDF2EE6D439C08295A1D9DC9F3D23CA188DACB17C06D334 35E87732D8088E887676D44CD477D01E630C461755D737392CA706B6550D85ED EB1912D0E9CC80E81345EF49B1CC025F8D219526CAA6C127E1187426FFD0563A E06E97AAC69DE2893EC1AEB03C2A0F30AA34AF98B57C998D906B785C9F88F154 D3A844248B49F4FD4AEDA9AE0B7ACE3AED5A849F7CA4541432568D91D942C145 C2204CFC7587B7FFCFB7E9796432A08AC0E5F8DEB3FCCAAEA75A950FE0A9611A F0971E40C203C553C9F20B84A0B1102ED4ACB905D2591D72FC820AD4F046D5DD 201078D7117C0F9059ED987239599E681398308EBFF876CD04EAE57F1935D356 474CA4C87F625EF53ED6159F6E7F8B20D7D140FADB5E773CDF64A9BE6F18A222 60730F26C5AC28BAA13E2A8E7AD4C11FFA98375B879573D50C345E588CB90E9F C609992689A63B8EC88E73B026539B0DB10246B73C31CA8EB3A678EC762FC73A 1E52A0CF8E55E80123785999BC3B8CE1086A237B9991AEB8CCCE3D02F211CBEA 189CF4404AD6765D3B340329DF55C31E3FE7541B2D2BF1A708F67FBC6F930D0E 7285696F508F4C47206A370AC7D20466EBB404DF0E9CA3C89A1D8DB1DD5E3650 BDB4DE673948620450951ABFC286C0324E9306E35987DC44BA76A15530E3B156 52190497B21C257B1817B92CBBA058268C2A7E0A4974C649C51F3FB79C990B93 C81CC4758DD752F3E330CC17CBBAA03FAFD3073C0FEBE4BFF875E8B66F2D95B7 46462012B0D2AF3AE6389BD72ED4B9018EC37B3B2570F6401C130378BB9B01BE 89F3D266B77FE09A3F970A8660F7D2C81EF13236C9317A9A0A6042C296D93FDA 53B3F1B86496BA6C9F677EDD5DB461042E69A545B874AAE7BA1CCAD90A57008B B4626A65AC2B2A9D101D84185A4306FB5F86F420B7011B354EC08C8D0C260A19 F1C3DCF038BDA83E650EC75BE727CD318E88BD846013326FB018F8EE8376405F AD3880938103ADC9F6A7B53612826A4C41293BE8BF3F29491DEA13B54DF2B650 92C12582A76C13CB97B53C3A2073F6D0C437D990159255459D456A0195BF6B41 EBA3AB03033C9A12C54B6D3EDB1B248C4FA3F283F0DDB6A14F02C72E4F50981E B928B80A23E1769B99CABD697F58D3DA3FD74BDA31886C58F96A0F936C02C222 306E63BF531889E4ABA7C8911E7BFA275ADC131027628B6C855BC370DC13ED34 98FB9C97AB08C568D2C548FDBFD7A2852A3264E8DAF9194975B43AC1FA919F23 A27E68CD911EB3241AC5E39BEBD504B8DEF73C345D343769A94030F5974CDC1F F3D8F871BA94B0E9DF238E910E42DC9A0FBFCF8620AAF8B9574002B647BA4171 727D81E190F45A5203B0B1DD5A46ECEF524D9FFE24632192F68D8CE4B57E2DEB E67337880EB29486B7E8B39A71A3ACF098AB58827749862CA7DBFEA419291381 CDAB1CF9CD2B97C8C88D6EA3944F1FC4797D6B14817C3E5690427FE0DBF593DA E281A99448F5D0EB6461BAB97257CD512A6F11B1947CC3E44AA1EA09B9CE525B DA15B4CD59166929D5333D7E7FA63373703FBFC29A6F50A63930257C33E97B94 F150136A54805EF5F4CCBA77FB93C75421F9C454FCF60F0AD4C7CCB759301453 A471A1B63CE3FDE5029C0AB55F392863E9E6202C50EE008DB960B9FC2AA8ACFB 3149C5AA3C9008011FC2D5D16E3E682B460754038A90460AAEA72DF9AEF200D5 EE81C8183B624733533E20C1C7DCCA61AE84DA0303C00105EBDFF23F36479D4F 6FDB931C43A4274C616CE8E9051019E35DDD7F06677397F753EA1A93E05D145F 7B5631A729EE31396BB102DCFA31A4D25380203E9AA65516F6AD0DFDC3BFC04F 0EC769986B94D8A7479D926E7CF5A438943A462F6DB4496A63C4CEB381E1431E 057B3647BB840FAB4969880497EBF8EF8C3B27E25BA9B54DE7ABD10F652BACBA 4E235C06E30959E5C9E2F4399D5B6A7D8BF8EC2940359B4757559C6D2747EB7A 2F9148C27B5B7EBC4F795EE4445490D24B129B503152B6F3DBDB23F3E4E44477 2BF4A00D10AE851368C6CCB1BC88C32EE1E82A6584E2D36AC4E349C92A679E7D 0696B737416109E4E1E02AD43468EEAFE4E3F7C73EB47382E178B05A5EE6F501 7D662DAD790AE609C11561252E3D8D68EE037E632AF172AB269008E217C3BA66 2EEF7351792AE9AC1946E6592D51512711AA6ED94C7A602F7B1F548D12C24F88 C4BF6BAF07EBDE10BD7233A7D381C9FCA733184501449AA7C5637574DAA16916 B86C7EB8C525DDDDFFF6ECFE43A4660010798696E865C63CF9226D2728F93F7D 3BB0B9C291389BE5E3609BB48868CA4F9B15C9B8FC054C1E60B7A0CF01F91A17 4E4D07EDB85B1B16BD9F4DE34C7C69AACCB25E97A8BF5E65F91A4CD1DCDE1F3A CCA5D4ED828F1483E7A598A077C9E7AAB8449EFD258C8D7231364FE2008A6C53 3A9F2375499D3EFE1D4387C6EEDAA785BEC2615AAAF6C0BDDB62968C26A768BA 1E0E5DA2F0A4276B66D05A87D45D6A1D6C8A8F9F122455D1477D7FFBA7773F1D 0FE64D3D91C61167995C787CF88B4971EB7855D035CD635116C3AB2779348D49 9113E1911EAEE848CC28F003D118FFA2C7A1ACDEA2DD362AD482D2B97349AF1F 314E85D1916714E9CB979D3B82DBDEAEC140DF309C487441E044F92431458428 4D6A75198D3709745C641BF6C608245F3A7A2FFD2CB82ACDF0ED389BE8469698 5E38D670169B3413F681165ABA7C077A79FF187061366B85CE17D615095F7B14 74CC1EA886367BD23E553760D7511F54076E28217F71E428BC369E7BCBF6AF12 842B40AD9A8416A523849931B17A20D2F12372D91387EE2FDA4222375978E81F 9E65B25658B7E13C4DD3ACC450D8A70468A99AF4752C568AD29F41692E60E0C4 B3335EB43B5B88E1016812DEAE0F693682F208DC517B8BF7E8358BE067CC3C69 D70705B35265A0DE9B2F88E2C1270AD9E53723CB4373C7B8E2CB4901EBA84E7D 2ECED70DDFA18E7113A75404E805B03AC8E6A96529FE2D8BEBD3F9DE2156A932 7F03EF36CE0390DBED5623D71085798176BB8B907C892EDB18BFE85E691A87F4 8D0E320DB1BB3F95ED1EAA6C45AEEEC81F77E4AE8B76DE982246F47B7723B3BD B4EA837B0656DB1209EF9F406AA9583872B5A557894FC8F17C6133421246FB5F 6D764349BBAB83B68CA2D4768F662D3ECF30456F168E467AEFF5D1695E1B8D43 FB4219E9FDFC6523C21E0E35F6BA683A72C3497EEBA7BF74DFAB0B003DFC85CB 5E851AB58C869E2949AF0C2201E6C85B593E923921F05C3A151F94F34CD89ACF BD1490781BFE9C2A77BCE8BF9C4D4BFD39EDD68B7D3B326CA61C9D9956CABA21 C354A4041E2C3A04ABA88DDFD533918FF982BED6F55C1005E2D0F498BC4E8587 01F74634D744D2779ADB3A92E1D3B2EF6AC6E86917D6A27965CABDFF38DF766B 08ED5F6A6C9B31C44E98FA20CBA3ADDC44B3BDAD2678A4D92F4ADB038E934F06 7002342B57DCC20F540CA8E1403B7DA8FA810AF7AAEFD744AA8D707DF1DA5E81 AB855F983FB05ED3C1147B691BFE24C61CB2452331D540DF8EF712258BF437B6 7D34B03C641F1BA3F289B5B9BF4EB84CF159AF6F3F7104B0C2D9ED4C76114CDF FD247A24738DAD8553031D2B041CEAF4D2245394B3016C7AACC80C54BF9F82C3 98255FCE845B829775477C9501588A6A93982A0B6526B9349820CA9E15E42D78 7630EAE379D6A983462C6E47F1230F76F00CC75E0B092D1B6EFC4E5204B6CA6B 0F04299E01327A01B332FBB5D4E795CB791007BDF5AA1DFE53887BC61CBC5FCD 48ADE3C3DC4C95E82D9FA540ACC79DE0E9FB5EA59F9376201221FD1522448DCC F9B542112C2E9809F1EF14BE8F193D6B0D5527AB08E99B7DC26347283B4B20FA BDA5DD423A7779F4DC988561E24983123F705142C8A257A13CFBC82E0E982855 56AEBDE6518D5CAB7C47805F7AC940DF416EC58D3B76340467981D44F7FEB8EA 7D49663FAA076E5DE74607A1259DCF63DDF9A98482001A4F94045F2B57EB9D37 09E87D54FC1D4F28B2C8852525AEA6327232EF8008308881A6B219840D68830B 9133B0500E2C7B792CA2D3474B511FC48690E26D45A18CD2833B1C402D217A06 917FB9EA1741077EFBE075199D6AD3E75F966CAA39362AAD8F2B8A159E17FEA0 2CD66C8AE9F08597FAC7A20489708A85D3B85884DB34E8E69B4E9220F0EDC6A6 E8DDAF7FC6D08FAC70988A63551AA165FD38358FAAA37B46CF619CFD996F11A5 A50E85C391B5358AA477DF5CF9748FA655760826DFECBB2ECD12FF1F2AF6A3E4 D06154E104F3B24A4A5A0F02F2C44C99F1ED9A0185D1E99F7DB1C1476DC54E61 58172A2267E67466B5CF9665D500CD08FAEFA20B73DEAF3E18801FACB5598EAF B7D7599EE02D9A5E8E4F1BC6C3DAC041EEFCEAFC80A5602CE1D9A60404C43333 5B63DD068D580A5B0EA048685D0CDB5B009F3A1044D0DA960A5241C2CB9BC06F 191AD74C9BEB7E94D9B1DA512F5D76B5C4F347FD96E27C4A2BF1F0729C376578 E09532F665AAFAA261FEFCA8C66C613A89F4AC0A054DFC7F81387AFA47F9E84E EC9A8617393ACECA4E32E17DFF6194CBCCC336E1DCEC4C2198AFB3091C73AEBD 14D78452693702B0F06217A6733DA295484230115BED98DCA126E5E498004DB9 CEA9A500C0177466E196D60B7202C425B79A41948B48B7AF804B3999C0337363 2833AD07777EA347F5535D6AF761F437098A881A012C1EA61693F7A29102F8CF 3B384DD4CC944EB9B3F76CE867C939042096193A17E9F1FC80FC2A1210074340 D79A0486E48D67B94661636F50F9A72A552464308DFFB77C6EE6F64AC23C9502 973D771BBA512DE110D2FFBE513F442BD2E1EC306C07BE3CE28E36889154C982 90C2C250FA1CF9B19B71F3E21C8C1486FFF3C821C50A5A0897057E985EE4F335 23ABC75B70FBB6B4FC527AEB6F45F8E3CFDC9BDD41BE7AA95C0BF05A379211CE 2FAAD49114E9E0D977A33131A0082F7621E14C20B70665E72C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSL10 %!PS-AdobeFont-1.0: CMSL10 003.002 %%Title: CMSL10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSL10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup /UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSL10 def /FontBBox {-62 -250 1123 750 }readonly def /UniqueID 5000798 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def /FullName (CMSL10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 13 /fl put dup 42 /asterisk put dup 44 /comma put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 53 /five put dup 54 /six put dup 57 /nine put dup 65 /A put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 73 /I put dup 75 /K put dup 76 /L put dup 78 /N put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB 5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B 966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD 94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E 4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D 8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C 567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF 62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC 38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE 730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F 021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD 97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B 362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F 9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A 44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C 683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D 87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF 550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB 17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB 3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B 1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A 8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E 7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E 523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE 144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F 172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC 0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E 3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E 993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E 0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A 6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 AB7916D44EC2210CB941B9C9DDBA700AA803F99E12BDCE73F10F769D7C8E1AB0 77431FDD829222D4A00DFFA8E5FC89B8DEC03AA4910C57E6A689EBC39EA345CD 785A2885C8133229160EB3DF0B348DE734E4F78CBFE9340432C21026C5832003 E5688E20806F46ED465309FBCD5D50D1585C981C7430956CB436B883730AEDAC 1E76732CC2F9B08F3950A7B84F0CA9C5B92A11EDC335D079E6ACC69BD64BF071 A2E22CA7B18E275EB0CF680AFAC9DDE4F9B48568A1F4CE84E9D8E13F000D152E 42DB1C1ED509438C43F0EC0000499BCF9017D11C9A36BEF738A570C32B63D0D7 094312E00AFCA7B279DDFCA02547EEA7732A94507E88C1A87E90036DD4C97198 A7145BF87D4B200E420BC52CF878D7ADA20C9A6F685102A223879BA9DC273E6F ADA20C196981F8BA6C641C488DC5B311BBE8951510732711716EF0E166BD518A 7EA6BD518F907042E7936CBD583DA8259E1190ACD48A5009CBFDA6AAC97EED31 EBB239F0EEDB23A04B93E9A96166E61706CC0274602469ED0309716702A889A2 6CE1D993B2726F2D28D351BBFC054F83C26C42C61A733C7155CB6D9AA1DBCD91 A87284FD9FB2901E5C97B2ACF3ECFF2D9F9DD42CAEED9E18C5E6A6DFF1F01F24 E253C07B1E778CFC3D091C3047AE7409C59A917B6A109D161957CA661CE3D29D 485C501FC15C4EAFC0F401F20FFBFA3215F613467B77BB40B36217CE7A7BD7D6 86368D549695A02D99CB498FA9547D19EDA81323E4600F111353F21DE326DDE4 580DE424397A84548F29A6DD0F1966E45E5B2117B32B24D834FBBDA1FD41D0B0 02556B2F784A0760C0B8BFF7F0069AFBE13A27B0F74F58C578B10ED97AD31467 1A628D5BE12146BC7929E5E6691E09F07D9191DF3FDCE75DA9854FC3F7AE8C79 030154462DC3ADEAE1CBF01C4BC972F766C21856F715CCDA1AE0B1538D53328E 67FDBB8497EA2B1BC9072FEFC58DF18593A3230A2FB6339BD10946F9CFEEC46D 9FF225AA58E5E7DECFA55B909C4446C7FB169BDA64CBD4BAF17F85B7501381FC C50671201A5A4C2DACB9641E2AB1CB36D08095F7922550BBC055FCEB4990A642 C98F0FCB301174F20C1B3970720535DEA706D156BA663CB53351C27AC92D91FC 365D7D350F0E5E8CB6655EA711A0D0721A9DB02236DC981DF496558739E72B34 4B2AD72428A34FF6BEF4E0B343D27065D176E5A960D32A6D4BBC7918D5A39261 4FB03B327139E776CA009F33479E5E11AB44C69264CCFC2E9F456E8EAA81D07C 6A4A7D82DFE3BE4243CBBDCC6E2986BDE560CD69FD54802AF6B02D4C9AF6FFD4 DC1AB7C986530082B2F8EB1262A48C6FBDADBA6C615BD93FF8F940287F2CD6FB 0E2948CC64F7C1AD9823176F73032234B7977F1506DBC1EFB1622ACE38A8CAE3 F6AADF3806437EAD8D58116CB4E6F2BAED4A838FD196661D0FE233D3CE011CA3 7838749E97FAB55F05697708C9A6FC8A74A161E13CE4B13405F4E94BAD324815 877BC9C9BBE8ACA8EC480EBCA5F325665361C82F0859D683E88414AA50A45554 3A5C9B3097D098DA4CDE4DB1D1B5652772948976F0DFE116DF5A77811AB9B25D 210A76462B5FAAB1A299C8D9A7D15A57B7C965D1E69ACA8A7AB2AA28F81724E7 AFD971700A59D42286FCB527882FC820E8D24E4332F4E89BEA4ED9866C073BE9 1A1CAB794A7608D02B0B1491FAB7CB88F38BB58EAD2C3FC3323E625A8639B179 4FC31E1F53E09E8B28620C01DBC843494CBE19FFD47B9EA36C6A00D29FC24D20 2C49D1D340CE1BE51BF400E03F255F3B371D075A6F69669140441CBFA1A4F36E 4FFC3E245BDD48CE9EF79733640613C52E55501971B9658209FAA687BEC7654D 5DF66974304E863B1CAB3DC486B900CE2829CC7954F54C1DB57F2E0F887C2088 BEB93F1BD8E3D53C17C19EFEAB158A8E98B9BD40C0C2B1A2D3A7DD31FD273943 7082BBF57C81D6BC55EE5ABADF91121DBB2DC7EC4ABD45ED1184507212D75B6F DB2CBEBCE6863E6581A72A5634FD169C5784411C4ECE1372D8C65B38350BA81B CB3911657886DC9DB626939A694BB9935443E7BA911FF0CBA4FDF1842ECBBE4C 5D41AF36C162E8C6E110D2829EEE2D8043CB1B8E607E10E388DB6C0982304D28 041C69C9F59A4DC9063A3284C14DC1CC7AC6E60E9EF40F3BD04A45E4A74781DB 22CFE76095070AD0D6B7AACB620313470853899CA8BBC9E57D7DFAA032DE38B7 3D821A45798377B224821B7FBDDFF4AD77D714DFE226D5CCEB27BB0EC37BFB49 E94DC72CC4C3C5BEC84B68D8973891C529AC45FA62CC961CE1BEA4572C5D675C B0617FB95D7ABDC3D1F75151398B14A652D547B384F7F66860A1DFD69949B4C3 DDE6498E7BEE8F9BF33F90BD26F8647C2AD19BFF119EED3A319507755AADB73C DB39972069E9A4F676B8B2B1450C7677699CD76AC42CEE77DA1EF6C744129BC8 E356F9A673D546826050CF1747B28A63D425D5441881C0AC3685E9828A23C85B 2FDA68984B03A1D0041CA60481D30FABA7510368F64C89F85B716BACDF3AA117 1B0A91D3F1A057C7B1E5F08E405AAC6AAEFB1D6C35E745CA1E24F0F7A4016607 11FE9318B0AE8759D93F0E5AD2215287E33F574DBEE3A176FE9C063756D6FCE1 156C893E0512EFEE3910E45E79F1033AFC50D3EF0A1BF59D1277B39A519F8747 135BA01C962331865DA1BDDF2CF030C56B234C62DAAE98E8EA4A894F3CE4326C 409D9651453333CA50C64594E780D7266097E58FD6796944F83BB8B180F57E00 68BBFF69111EF1A17B6D6803D4633F63277378104AE035C6811759AC07E30A04 4709EFC6B00ADAB1CDEE43BA889FC5C827D7A231772D1566963E2F29BF1526A4 5ABBA75CEE3446590617FE4443D6F11799DD114A7F023DC986F0D158227BF270 7948B8BFFF1F7C6643675AB6621AFD3E6815AADF8DF5DF8EA83BD4E33653B04A DBE8B75B6187BF655EC3F6C501B3557313307BDB363A3CA98B2F1620741CD563 D841279F8A820CA1CA77E1004ECF2C5F2CBD0DE8B4BC5CA5B878715FA6E6ED87 D2DE099EDA24B515ED0E835113C6A8AA0A586990AE9683E7B86243C6F525F8D9 63E742C7CA0D0B35C94C6262A7654E54DFB390171F40CCA8A236E7C35E11DF6E D1BC46F80C601B9A254A446B9B30A96A14A194100D1A51C3FC46F13DA2A07F1E A817C3E72303E01001F5FB9654E4D6EB71105DC65EF82ED4EA28B01929755F48 155871563EDC000B06581FFA0372F90E50727D74F43BFE31BF075AB036C25132 F2A6F5BFA94746BC686B4C767F5188D74FC989D845127C041CCED0A89D1D2AC9 78793FBA2B16D6282A23E3D4E897523C794EAE19FF7641DE594516C2F149C351 F5EAC5FF2DECA05C9A7403BA66177455EC4EF71E918DB4C6B477927BA92E30BD 77D3777A7CAD3BE3F65741944516DFED1408640FFEC9697B670DF51070D466B0 6E3C668B0368241F1625E1D1B539328F2B7C2EEA56377D2DA9C824C3FE227B0B B46C1BB67246A1CA32C2FBE1BECCFF3EEE652559F80464C4BB59138CCFF58AFB 4C04FEDB73B5CC7BDAC081A1C3E0E238928EAD90A696E0AC1BCF5C9802025B9A 467D3AE9AC2FAAA0BEEF33A7B7AF8E92D4B6BA92DC9D36A49C186CD7A67E992A 3F610DEF8CEF1BC1D0C4E4D4EFD43B5A702BA5A574820C242C067B66CD99CFF3 552981139DDEC0760F7A2DAFB0D355E9EBF063022A8445B2AC02BC117E30592D B06BC0BB6357FD707991A36FF5128F5D31743ADE274B210B9817443FEF2827B0 092EDEE7FC42CF8B8ED665FB8F13915765C002DE9C5B6A9ED25325296A9A89F1 D80489F9532704F3F5D861A70A7DF20A8EF7FBB6B1A2FFB809D455667907E939 CEB132E13ACD3320EAD612DBDDC799BB6A18C99136889984E320ED4005B87288 F8A590A5B262E378E92A9AB1BEEBA1DDC3A339479997B0B55F36D9D422DA0B1D 31891F2377BF65418E2880D2C0A0DCFE6D92E40B88F620958FAFEC8D5F905934 D8F72665DCBE88182B89F2DC4C57D72CC4B3A88311B043DD72F2EC0B8610E22B BA056E75C5D2BC006529DF29E739F1B4D2D9C8089F9E4BC79B2FC54FFC573F61 384EA93366AD6663042D76795F6E8E64F3F347DD7AF363CC2CCD06FF7AD10BEE 7DA879EB8DCBE55454F59C712A6BAE16F491B79E4CFA06E9B7A71E8C1331A847 F40D5CC40F70894E46B222A0289D4EF4C575183D285C91A101F5DF799756FD9E 445E678F23356FCD86193F139716E88CCAE5A065C58F15BE2B02D69654D9E300 1B707BE9667EA2EF2757A3EEAE886969D17E57EA780A9C6CAA1400858B13B27C 17DDCE4AF763016C057FD70CBB66F00EB695C68275A446FF05F65CC72EF410DF 13784DE9CA516CFFF985A4C9F2E2BD45D2A3C1AE2748044C9052FDCDD62D1613 0D84DB238C124A053B11B4854EBAA222635B466783C49A28B341C7A64B1366DD 744A22BBB389B5A78DD937717371FB85C6AF19165FA730180774AA167B2F3DAA A19AA8E8F06A3A93440D1B5343EBC8D9A4BC3B1B51EC31A8BCEA3E8BB6614459 978D1767A0B618D05A149D5D5E3F85999C2B56C6EF4964DA150EC239AE9D54DA 2885B0360ABF63E38333E4C58273A87863E0BB4F31AC45E3EA934325FE8CDAFF 4D0346F2518570CFAE06D2376B61CDBB9033A614F0986EF3A2DC6B9F2A9F7284 713AF03DBC9093F2F1E7D5A643FD327AD135E3FB8450142A603583E2C2DFC86E 98D8925EF812600BF94D9C3FC486CED10424D10EB74ADF5C80F15290E5C9F9BC 52D1538B07704DF8B0B7820D47EC5910A25BEF6747325A24EB2880E131B8DD43 08EC0BD3DE0B4B6D3B4F519894BBC56C895196251D74EE17039DC88626FCB0B8 032BB8578F5C5E0A5C81DDD38F355DFF3CD16353C41EE947E71B2BE670A97613 AD618D1CFE02036E7AD38B39E44940AFE8C2A08BF16B54C4981DDF4E4E91A76D 90A06C195187FE383D61CC4B0E0CF5BBC02D6B1C6359F7FBBFFC076F8447494E 2140622AFFEB90C110EDAA57C478774D0F1FC4B3B4E5942C7D35B3B646983903 39361ABCDDFD0E1489FAE371275FF05396F2AA09F58CA0DCBD348C7B5FD8F566 402357A0953047EA8907771DDD34719B9A773EBF7A8D47AB2219AE5D4FB2D843 A044073465FDFC8FB14CC9A39A92E282C94F6C12EF4BE954D97A12DD5E2427D2 C2ABBD88DDCC0C3C8BB55B1E5C90D0D8F5DEAE619C29B7BB25FA998B83AF022E 2E384E13171B5D1EA9D685599FD11247891F0AE3EA27FAA2BD39E4691A535A6C 3CEEE6BFE2AC86D4F36008D3E1D917B4C8C8B699DA779A9C0651BB5BD2AEACBE FB10AEE30C1951DADA65EA9E469EE2A86430E82E518AADA322FFC3BC5FCAC8FC 0EEA7EED6FD6EA02B201316B50E0900359EB878CD87597C4C97E7B4A81EFB976 6B85FF4134D14C5851D45A792898245132439D8C5789DCEB9F2CD9452CF89B06 C1433F68036CFCE09E92990FDDF398682B6A59CC8AEC193794CA664FBD6A538C 7F469D6E03C5D21EAAD6C31C1525EFBE1EED20E6312265DEFC9AD668A28AAA9B C67D0177D77EDEE711329F1E2215D51224F787B970E99CF4090D811133D39507 5277D020C9A364B10934F6883356B9A4CF7A22B7493AB6DCBA717D8CCFFABE6A 698AF87F1B2B09B403CDD1105C72C549CBBA5947FB8DC65833896BC775CAA342 4BC6C5C03077BC823944ABB315614E19A99B44F75C8D4795F9928D261E379E68 DC05299D6E333AECB313C494624318680D152C42CFE741E3A18F0F65B9E8C6AD 6FBD1D53572A7FAB6619026946E3FE10991B0C52F83D280F35CE6A4DD76BD2C6 2ED1D25517771552B6AF9311504E67F91AC030F9B063BEBBDB3BB2BC40DF2FCD 2B548B8F55B11908BC35AE8864BD03A18454FBF22FEA97339E452D98C5799567 6EE1EDB628ACA46AE40288EF99E3302B40CEB3F2D9430F75F9459F027953C753 57C56B2718E12A9B11EB41095BC2A02A2DE7FC97431F14F575D38A41886B07C3 68922EE2BD51247651DACEA7C35F62FF7EF908079B62FA4FD178609E6C8F9917 CCC1819F9A03CDA751D89DF7794F806ED5F8AAA1FF0B2DFC85833C1D25DA870A 3EECE459C3F1C56FD352E0DD7EF7523F7FF2B4C1085DE878486815B9DA1BFF54 13F6A9CCDC9197CDE06E3DF342BA972ED19736277BC6FD42CE5D0AAB28D29B01 93CEED55BECD5E6A61BCE80F7D46F798FC8D32E5EA7C11BEC044F17A79481CD7 F3DD029342481218C1DF1F17FEFB83750A9B24F42689618381955B237ED58172 5D33682ABD2222AD0E8253CE9C59DEF228355BD8F59BD237A1575D36221D2176 FA6DB3C311B4410E6D62E20E3BBD920640D34B2DE8017D87344501EB88E114AE D81C8B59AF9763D2F3AC2CBA04F6A5BD6F658CFD2DD88AD9BC967268A87736DE 291A405867B54201A7D71034DE52511EB4924A6DBBC4020FF9EE092D99609C76 F1E7CCB0D9033D68F60118C2184F60B2048485FB50F4122ED6CD233E73A81699 D7F9DDCD096F01575594DD7FD798276F2777B3A5A5FD566B6AA2793349362EC2 1344F6C2CAC9577969166AEA66F9E490336B3114567BD7EB48F07A5E074BDE81 1769B6FC23CA7509FF49474A193C4972EF3EFA7135A01C17242645D52B98A574 C76646570B1837B3BE1A3406BAE2C0711A4596E20E3936A111A662E91B43BE58 6CD567C10DCEF4D973123962448604AFC47CF782F93124EF7DEF20EA6450CDD0 34853FF76C795606353A220263E3873ED281074754C956947616EE91052E1E50 EDF7D8DA722F18FB1B4CEF79E7955F1D767A35D67A0521D7FD4CA22705D56AD4 741F99ED5F042824C8EAD154387AF08A66EE7BF4D96419EB550158FBFBB227C0 21E149C284FB19AE24130C4F53F9512A6D8C2E0C99D5A94912493E6FFED76E34 EEE280E46A8B96D5B06633D6FBEE3EE051565EFE8299F20909E48FCA667E6F2C 2F5EF2B15968C0B8CF7805D7460A6C293DC46DCA2CF3800442A0B554E3C623FE E533EB3DFC34D5D8B744200FACBBF8F617816EA098257167852B3A0A2462F0FF E5EA75F980D04BBE1F28BA15A731AD151B9E8A86C1920D11D76697BB9FFF61C5 407D31B203BFBA4E109F76F39ECC9B69C521FD45C9B2AA43FC1CA88963289984 8BBFD2464D6B342A58EE0E574CF407D763B600A90F182FB77362D8381C7AB043 C713F4C603DA56DA20FCD5329FDCE1CC5C8EBC32E8021FDEEC9794CDC1DA7C58 2547074A657005C54BA1DE3688865D05197883CA438A50EAD95DFC4BD5F0FCDE BE98140C83A62B0454FED70FF8C0185F8AEC7BF06A67C5788D5619FD2A5096C8 EDE34F1B6BEFC00006C50F990ECE0AF39ED16A04B30C762281B877F9B4A8B8CB C1F60C1A1F5E617A53375FC9041183A229E9DD48B67B7EF50682DFA9F5567F0C 4A5F69EE97FD357DEA706E93F56580319BBADD0BD27005E0BF7BD474BE77EFF4 69D2C53C53C8D415877C064FABC27AAC39A8722A086E205E091F8FA914866976 575B43838DBD2F2FDE7C6477AA929A88480ED0CA71301C363ACF83D6296AE76B EC4B00B8B264D3F3BD8F2710B79CCF88B150C72B8968529855425F2C8CB76D04 E5A9E2D4B9AF16A36C98F0DA46D8A1C74FEF344E6C4EF44E484CBC81656E9B3A DD5610469D2C2A5CC8BC4B6F094B19D36B96F210E797C321F8B21B43ED8CE95D C3C3D80C83B0B7E7482DF207849C51FD35BEE2F53E36F091B86BAC7644C4DB83 2B0FC90269762D8E341B74A489D415B78CA0FB92AB68C57EA92D95B4F08515E6 2819174A53C3FC235483F270B384C2FD4DBCCECE313D7DF210E1B066047A5ABA 5934069DECEE9C711BFF93DB432CE6E365712DFD9466A923F362272CCA413C51 C3EE3FA337BE63DDDB3E602BE80A38EF6EA188DE5AD38ED46C44AC3C00A4F20F FBDF986D505F32EC9E84245F2DBC9273A5DD36CDF4295248F07E119C5C824487 CA5452EEC4D4EFB265955A322ABD7AD36BC1B6257FA98942A968E46E09F23337 DC8603CBA2852FC9C271ADA6FBF5DFD0727769ABF8AD249AE03D093C310A11D2 E1FC63A43E80BD6EA9A986ADAB3419803FE6FD683D0CD5848B21EE7C2C6B6F7B 3A2A4E0688518DB03FD023B000DE1F31C1CF7B135D8CF7CC9A7435EA85ED4FA4 EF3362A26CDE875E73CF2F7B3F645660BAF33A5F565079F890BE4FCCC704F3C0 00DF53036D228650CA4439EEA6C2E31D5EE857F17191B58F474B4595F65F0718 F8661742EE9C01F552670DE83AE8A64CC1F41106B06D957A009F2C7680EAE9D0 B29C5E3030F9DE821211AD83BCEB193D82E0D031F40A37AF004DECE62096FBBE 518F9E273940B8BFB41306E256F4321E767386C63CEF08863F4416ACBFA79C4C 256DA8385AD1C0168ABE7CE5C4EB9B7B0D2D008444E687567F95C448D32E6630 8ECE50793792EB2FADAC6C3829DA82AA32D4D861293CF9A3C6AF8B1B0F516354 0E16DD2450AF0357D528E29C6FFC43F1FC14B3432AB5D3C11C6BF9C4F5971565 973C59484657CE3D53D97A4D7179BC65CB522E20907B3926F94330F3C7627A85 2ED50F86F70C2259C84079BBD2610E4B5860B4DAE1B0E5F356EE66E9208E77DF 8D16ED7159F260D621CD73B7EEF093F6C1ECC33A529C1BEDBB1315CF204B807C 4851B5ADF1F917BE8B62A540563B75207E935CF4233C26D1FAD853C25B8210B1 CC12197ADCCF2CD812BA20FB37B59799155F07E6B33C04E0A10543BE28A60ABB 62DCF0C37C08892B2732CAFF3316BD1A34B4ED20381258D96C4147CD137C8B14 F2993AC620E3392EB3283B4B62561F663FD72A94521D033E18B89D4DBD26E4B7 A5019F669642F324223CCC1AA37506269BA76611355D1CC1174DED4CDAB78938 2A871099827CB036D3BB5C683851E5E97DA9359196B0386FBEE0FBDF4CE1D2C2 90B43C26211FBDF76F26D073AF037783E4254D5B777208089368187124F9E9EA E1EE17D2B66A05990F43358FF60620810EFEB7D74845C0EC2DD18A380C1385C1 81976CA00CDD9CFD795F9BAAF9C28124ABE5645C0B0A4234D05B1D3F556ACD45 70244828997AA2A0B400A6A9CB6639CD00C8CE9C2AE1E2E00657334B8D111334 CB8B7F82F29A7689725C477BAF60CC716EFBD51FBDAFE1D45F3E57FC1EC3DD97 8EC081180C5D3A006683018C4CBD7EDD315E78AD0F9B1F8D2AEFAA6B9E6FE285 C546DFD904B6D203CB4B7E1248042E144F2392B1E9F0AF5CE7AA379DC9E4DC5A 6ADE352BB3D20E60B612B1351EEA7D327669651203E81B750601C6F6AD51341D A85CA2CDFADDF122A3FB78662C03B494EA944922045F2AE08DA06FE2E58AE2DF 258F0314DA293F61759AEB66EA80A2A8FB6FF8888CB189E0DBDE89554B74C831 36AA7085D85A81C46591CAF88AA8EDE179444E73D3461FB31A12F8FEA4415619 A8E71109264F7230327A3A8C641F133C4C6082E62BE5A32D107CA89404151426 DBA48FC672CAC60EF685DDBAFE4EFF837B460DDEE26932931CDCBC1D26D83C8A C9D242B41F625CC466940716C455991C67E82283016929DDDA1CA0457895A72C 61C77AB2880AB8B6194CED09A35494799D14507964B6CD1A9535F810AEBEC92E A1C021728CC60ECF3CC67D93F13BBF6A985AD5B77A67DCB857C53A3FECFC0AD0 9110E1628FCCF37858DEC207073AF19FD3D547A5F452B991489128843C89A2DB 039902D9B3B26BE39A9B36052B5B542CB7BBD275288C36680BBB57CA31C323C9 21FEE8DBA31558AF31CB1F98B934A5C3B91E1A84479C912411A9B7719A03AA26 352A944C5C87CDE6830E928FFE625BBC56662A5392376A9DCFECC64ABE9C6F48 87CAEB3572F5C34BF87D2C970840D93B49E5D5281BBB9DE81692DCEC7FA829E1 9B916A63B3C195AB94C8736AC96CBBDCAB325B4D780A79E22B338DDFACC795EE 36ED6B668E36396DFE07F529EF7A735FFDFAC5D632AE90013A156D4113616E85 52458B6532D266F2C01E391C9CD31712745AFB78D3291829A64F790E76A836EF 0995C03AC96445CF8106149CD24D3F99EC4EACFE9F3C41298D74CCC61695039F 999996FC325A464AF212650CF520F842D66DAF9D0D856422EB039DDA75AE121D 2E147FE327B905CD9A53FB8AA77FEADA53645D8027138F42556FDCC98600E8D5 AA649C408B2D5EF2C8E7005A4691A5E1E790BE386F09E1E48B6E23A01E08236A CDF17649815792B22F64E1B915F6F428F7FDC6FA5E794F37E9A5DAECF066AE42 D47272E554F25CAFDCC2ACC5DF26BBE33A8BE588A8CBBF4DBF818ED4B4EA72E5 7A3CF691041B22CE2162D6EFAF00A24CB5B0750C3389205C2388E6305142D7DD 37CD09A8AD28704BAEE9CD5B7DFD58D7A07C9A5111BF9898A92BB1E27D83F2B5 2CAB96F2A0C1767686DFE783870EC2BBA86ACEDC400362A71043C73A6F16ABB6 82652DF11FB8EBD6CBD57BF6977F1A8DCB34C0679516DDB162DE0C98F0852086 CEFFD41FD842B092EF7BEE9636DF5B5E7DDCB53203E1C0E7548B79E179608E12 D4D0A479BC55A1D18A410D3CF2B5D31AEA36CB1E6AD839AF03AD4AD548301C95 C6E322A889DA975CCFF2D5264D19CA87AF38952887ABE56126B9CBEB3363B99C 6C1BBE2FD98402B92D8D48827A1B9982C656AA72AB447D8DEDC10E998BDA6BCD 32FD6801B199EF63299A1F371A1C202DFAD83712AA1639CC66EBDC30E038E575 B47D7D6CB29229C942121EBA125348B5D0E1BF037E05C3913D8F01C965B690D3 4AD3095D4EC5BE83FAA6ADD20CE3FEC9F33716DD7A4D508E63F595E265C0672F 4A48FFEF604BF0839072B6A0CA634810CD3BD9EA5A7F379E5EDF8ADBCEC4AEE2 3E4A0602B2359E39E066EAFC8CE47F85DD5986B070C31762209D45FBD75FFC0A 5E7444A701BE33BFEBDC906A136DA2E854754EDBAFA2C66FB1696CE796425FDE FACBB71594F514D20D0BD54E0DC60268004FCBCA00DBE9EDF152FC96E9A37FBA 8FA6B0389028E868A79C072791D9E26048A6C28D70B71C09F2DB9011068A9494 CBD6775606D29FE0D72F12CA934C6721B593C9476F37DEEAFA48AE61156D6D1F 6729120057D86B2768CBE594801EDFEF4BD82494B26BB145C305F75A9E7058D9 EF629E04BA4B19548C91C75BB22DF6FD76812FB3AF862CCE75AA20C2572A8A18 AC25229B94332E82F659328AE131747F58949529283CD2E3AA3B2AFF9399446A D29B62383A725449FB569AD00F608781DB224C7180A1056C893093BAAEFD6B0A 7BD34EA2382AE22549997FA1C5A64927C1B7E208BAADE2DF99369009DE7C3B3D 80FFC6A0B3AB511E289A5E2C34290425C1A4F2AD6C62570EDCECDD198B75E886 3509F3E281D7DF026604F5037240B50C5845EA44A5AE5792D4667C612DBCBEF3 736EBD8AD665D36503DF64F2193417E9018990FE955D3FB9E5D326DD4DED0E4C 357C996AC0158A589DD100074757A445C249AC08A01FE23BF8BC33BCAB9279C1 A59449B402FD0B42FAE335C267C53D080ABA1987CB7418DA4AC2E5DAFEC9B242 CCC8FA8C7F43ABA587F087766D777D8C123079988E109782028EA41733F7B243 6D32FB7FE6733DE4F7BAA601D4B573ADF2FB8EAC18EC8ED99D46C4C448C089DB 18EDA5F39E3C0D93D74F8BBF966A8D16E90ABEF2AE688AA7698FFCF69CF4031A 05F52B264527F48E54AB46DFF6AEA0ED37D5496CAB1219D4D14EB299F49085A5 2033A67C3FA8E1AF821FD9D1A0BACAAB21092EFA4609D3EEA25D59A2C754B345 E121E33B3BB0D0240BE9BE934E2416F8CD02583D2CAD7F076F9F8F4714B68F5A DFF3BDD25E6FE1BE1FA6CE1FA4F4C2B61BEAA04931687DF44F61F7AB8044791C 51AAD232AE03DA4C74CAE75F0E7ED42D26C2E13C1DC322EB3470535E6DB53F5E B9B78E996FA6C848AFAC4B16A494FA92B4A1FE4493D6D1A1F1DC3F62D580BB54 00183568069CECFB2DB16AAFECBDD87B0B1499C02A6DDEA565002A9F89D0F0C9 CF906E0B8C83070D84DB184B9101060DB5A92B1FEEC2AF4B160BBD8FAC1D930B 4EE937844E588CB848C01C5DA663751205A9DEC5BBB0A4C8F2490A061C4EE1D9 7FB598B10B5996C2C374E2673731320ED5338EE1FC1139E2CFA3AF10477BC858 82DADF923406AA6854E7E629274742DB01B853A0A1D0F0A089ACEA8AD92D9739 D3BC806468FA5044E1224F4D10E96D9269EE3C8AE984F40EC8487CE9D6129291 4BE6AAA57B935543302CEB004EAEEA0D4FC79630EC6EC59ADF8628C5460F7D77 86B1BFA31807BDDBBD571439E5AF3F9C52C2650B52A55023EF22DE7500C719AB 3A385E238687131A8FD3E4A6F5E1CC8BF164ECC935E0651079A49A9BAB2FF8EB 44F9B140339FE88C9669C683F8D5E4375E1F75059716B41769969485C90A6062 4FBF12617F275F0BC82326B8C5901BF0AAAF5DD15B0843576A2DBA57A6386565 6E614FD3E9908B59DB3B358A59008B40A724003B76B54645FE08B26476ED9D7F DA45628BA26A8B8EEBF2BD5A438922061CEB93A5DA94AB402F861592EE75C971 5EF127D5E46C704926F27E625435A6C859D611D0E1AF210B6416ADA1719967D3 A5EF6DBD91A5C4BB76718ED0228A278A4387276EB1111871730305134B774B8F F780C280216CAC1C63628F2D1720173CC046533CFB6D5E33C4C5676164C3F3AA E0BFCDA08AC86BCFFE122BCC9EFC3944FA1DA306103359C20CE1B9D37FB2DFB9 53AF34EDAFD778F9628F7F3C2B15E13CEA724C75BF23A04130D694CE82476220 EAE64DEFE352B312D7E5FBF95BBE1A753DA09D7612FDC005F1F8ACCD1B33A191 D8AC81E4ECEAC78714F2FCAE180A836581C4CB11849210BB7800740D836F0F65 17D90ADEFECAE66D4BD71EBE427CBDB2C66F84130C17AC62346EF1378EA3D341 6E06B4DB861395D1C06EC791A169AD837B5017150A548EF6E1C084E2CFB5C8F5 CBA358510863E3095E20C62463C20CE08DBF72960AC876AE9335BDC6A2F4D165 53065CFF50026737D10F44D6885A255AF7C8C308270B26D0A4C2DEAC3D199243 1CD83EEA8085E39FA53BE656A20865340C9FB6AF3BDC635AB98105FB870CFD2E BFFE50EF27FF5871B1CBF95CCD3D7B279160049995857EA570807FAA06FA14F3 E4D689519DDBEFE7CD7879743D5305FA62B5B47A142DA5ADEB4C58E1C05EBB99 E55D741AF8D994CDD21E2892F0156CD152A79344083E2AD7EEBC5EC165666455 0BC449324BD803CD0D3846276CA7225C3B000EB147E70EBE2DFE8287B44C5278 0CD0AA65F6E3AE787F79FB3CA4180A3BD8817D51EFF68DA9237B0300FB7157B5 5B53E1B9BDC776BF19DA624C9D458872BB8C7E07DB9B6A242AF207D018478679 0FE6F304E7C274ABECB4A8D2B447A30C53AA576ED647953E9CBCE32137D17B84 42FD66C456F124F9F9905059BEC7A28CF241CFB2E6675E32D8C2851C097AFC77 13F16092440101198DC9AF6BA66F9D01B64239DF74786AB665F67A71806D1FF4 75A45CB34A423A0F786130FB4F43C4F74872DDDE6640D76576F68A240F0BAA21 2053D59CFBE3A3370B4269EA8DB8C9928AB9BA16F2D116D8DC269C1573557EF8 2433145D76DC6AD54C45CBC22E2C7E160A75FCCB981611B8807300E86E48395E 4DC1B358CE61FA4B70C5A708801F4267C1125E00A5D524E69E1F12F828EB28E7 B5DC46953970A79495C3DE2580663CD2E2C6D01FD24707473B31C95AE231583F 6FE4D8EF32BF8937D77CC4F5DB84FC496A85BD94EBC51346B5A59D15BF72409D B57DC72F64BE73918D1F664C6EAF41719B8CB400DF3D418BF2BB9B75A2A14E30 4DEFF994D1CEDF1E2D29BB4363FB0B901DD2A4943B460021837215E32B712571 21239AAD1A687635FCF93AD951ABCFBF7237A9ED5F046123A5C14A384B130B2B B01DA59414E302A71A5FD9EB3614D8B6816BF359D8E9D227657AFA1D739F5103 873E1E881A36A8D40A15137E8526C37B1AF2957C10537DFB888AB6BC4235CC19 0AEF6F4A4D02591238462329ABECA94FA1CC04CE33FA93D594E1239A9D75B183 974E9E8E98C80D0BB12C31CF65C66CF2EB12FEA8150C1C0B4055779B7AE2932B 2B02124415DA5CB7FE73CEDE28EDE037C5BC0904CB309CF99D1356CAB59ABF70 062C470154521C4E49655D0D2F35A3F11A99AF974994C825BCFE3A84FF73CB90 9DEB6198DEB64FDEAF68FA9DFCF9B532B5A56A01291D5B7B5EEE405101E03B73 DE3B14B29732CC59B909A2753111BD36517FFAB9C881E5D5B330D6FB390A1687 1692AFE2382CD0162D441AAFA03DC710A5FD6EA40052440233E0E41DAFB00026 D8239803B41BF5D228B42FD7B360891FA0CBAE6519C4D95B60C1671D8CD72118 D6A38AE95E93E67592CFFF1F822BCED3CBE61C94D9928885FADDB15E7C179965 BF2FB8960AA10AC37ADAEDDBA7CFD26BB9491F982FF814B48FB15FB4EBFBD9B7 0D7016E0BDB2ADD37C8962718F42C30B6073C2B570F2250493C2A0FCFBBE9A1A DCA18EB0645CDF42DD88CF7DD5E6F7FE216EE0D7F16853591559E73873D1D3CE 431513C8288A72696D27B6D67F80460143F537534AFAEA25D723CBBA4E1B3492 62E2D61F4DB2FD8703C44888D94B05FE9A9F21EE68297DEE0EF7EEBD86AAF36B F3B1C9842AE0C9E4602DAAA48D1B776D2BEC1AEF5F1048A34F6A00A0470AC234 1AC75CC3662F54EC31C85888163F95213C64AFEB7723E5A25E1A7DA70F933A53 45ED29B901EBDA761E50A3A70089FF7204B8B07A80177E4F5A6D0ECCFF5BBD31 B18D0FB99E9A9BFEDB891F0959AD2FF78CF350C6BA73E77B3EF5FB04FB002AF7 C195A9D31577B96C540EED238B157DB61BB7AAE9B0C0E5333F23F9B07F4F462B DDAF81F41ACA3DF9BBCE54AA6C6F11367F983C4CB825A411165FCC9F2E700833 DFFB1737C2ED70634CDC5A4F39214145CC5B11B535EDEC521E729D61D14454F4 0FFD3307570EECF5047F43DE9AF4FF4C49D134AF96DD6DA648730343C5FBEE6D 2B0414CD760167DBE4FDDD86A88869293BAF7989F47F0A4E2F766ED4B5486A15 A9F313946F6700E4292F5D476A1AF3668614F7EA8AD9B2F80D9A1510C12CE650 1F307153CA87110B1AE013C88ADA43A0A77F6A27CC2ECD103B894AD62323D5FF 9715B915BF3CD04E88933E13030F3877EB8095F43160B3550E27B99DA59559CB 5B0B4D41E06ABC8F597F69002F22C34D1510D95DF902D5CF045426589ED7D2AA D5E77C802FB68906A1BF015E96CE81C8C4D613434E8CFE02E3804FAC5D645AD2 F2F8B3A7DFC8FE8C1A986D1E0E173E9F9D02B0EC0ECA2FDF01502A30D2B48C13 73F37CA86ECE3A51606C06D56C10AAE9E1E28781F8A9CD9AB3733705CDB15587 B3B1EDD7F27041DF0813FE2E8358EE22C758DE0BB7A26FD1D62830D4316C197C 00488DC2EC013A66BFBC53EF5E576DF780368292A9B4C9A208B211B4604D9686 F4E1041FF53CE651066A1A1BCC1C632BE5B63EC9C070F07FA2D183B5A520D158 C23B0367A648C79110ADE5CC0B5FC0490933226C5D9294976E84BA1704813E3F F0588A465BB98223F4A5964B159426F2FE561FA918BF6593E3EB7E132679A38E CCF9C709DD8200F7C51D419FB9070129A724E8786BE65B2148B46030E9A3D97F 23857BE1296BA7AF9AF2D84B48B048A6159115B1EEE18B49863ABB861042D34B F86B91E6AFD8B1C676ED170F2FD993CC9C19BCE18E20EE5ADCCB6CED5167D3CA 2754705DCDBC553633607014F889315EE92C675C6B6F9E26C9C5270BAA173FA9 0F7AFAF6C1CB76EDA63E54F4FAC24C4AB5C08E1D322612BA356AA5580CB4EC1B 7B26967E0DF45024690F37E7DA69A39C0BFC419D06744F57031462722B8AE05B CD743C9FD7D541F7AFCA514940C82F6ABDF1422358857336C8EEDA22C8C83B5E 84240EACEB05DD6422BD7EC296D2C2540755707CE33EA1D3583C35495AEB8F25 43152A82A9543AE2B0D2B581494268913EEDA111F49ED7C2CCB63B8A914C6ADB 2ECA463362401A57FB82A2B25D 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT12 %!PS-AdobeFont-1.0: CMTT12 003.002 %%Title: CMTT12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT12 known{/CMTT12 findfont dup/UniqueID known{dup /UniqueID get 5000833 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT12 def /FontBBox {-1 -234 524 695 }readonly def /UniqueID 5000833 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT12.) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 45 /hyphen put dup 49 /one put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57D05DA0555DF933BB0 7B42D264831116C06C79335D519461E7B0E870A6715E3D74A08D1BCF86E3BCC3 A43FC6BAD1C68BD9D4AFCC06D845FD1F1E70D7A47F0BBCAECE8396E04591E5E3 4797F646AFEEB7DB548183F0B74C9BB6BA2AA04E7F5950EC8AE97C741D4B2C5C A8E7A8DF5A36A30B5A7592D95E1DBC63EF33C92FE459792CED29E2B8B6919251 75EF62089BD7D44A6E1F9B62EC802FBE62B821DA1C3B2DDED45D27964AD29ED0 9FB7868F3A8FEADA87A8E42D52C1EB7229D7C79B60BDA263F2BDB025AE14A507 098FA274206BACFB4A0A7257D5998EE8F0FDCA79CB61DD1FC59DADD11E16BF02 ECDFD706CDA1E72054D4EB55AF7BA9F19955886BC0BD6E0E3FE3769C94AF3581 DFB2BCD67FE2892AF07E858A01280194D8DD7332B3D0A585C87FAB056C2EAA9B 5AD48D1C9F00CEF8EF0D1408DBE1C03D04B231D7B8D5D998FE0CD7EE19828EF2 F988EBF6DDBFEE00F04A4A1F4E1A55DED7EF3AACEAB5005F1962C724A017C914 2936E2E0DF26A55ACD7DD836C6035CBF07981C1BCE3615064F0540A1034C69B4 E3908E76EF8925D486DF0B4A8E1F02D8AA99585A7C31847AB9382F83880C1C21 C496AB2DF8E7BD4643B28B704B5F6B53429D3EE940A79135F5BF0396E5B46F23 42AF406C26D12BEA7A41F332AEB75DF43C15334CF4651A99F602036946B1B91D 4BB0D2E51C20216D892C8173241AC8FD15A37C3CDD8AB4FB67D8565AFA61C068 95E3D6E46D7C09BBD09428207D506AD43C693F3C3D787F6A5C39084AE45E81C9 830900DB50DAD10A17E118FB5E9680B5194716A788FF7514A1167DD1A305FBE3 FC1F39A39F5613D50934419B95A4A2FE1B6C18912CECB86726926F6B77B5C3AF F38F85F974A2D2145BE010EBB4A390B842BC222AD4A0B7FDD882668C04C51F19 13FF91E7CFA0A0F4E99A1944B272E0291BBF3F9ADFCF3F625B87377AFEBD9F11 6385726E908BAB7D1357504048C0F5B26251A1FA52F08BAE1D64B9FC32A684AE 896F3DD0AAE9624050D4DFDA25E581FB2630E8840AC5322D38B92F3E77B55CE2 91ACB8321BE53A2C7D274D63CF0C68AC833BAF4B22B26EFC197D4A893A5AE492 660D995DA9294C16BED1113CBCC18AFCB5968175EE2FB374B1AA261F22CD75F6 6E7295A254FEFC41A66EA6833A6A4EE0E75EF6B6FAF292DC5D2AFB61D5203DB5 4BAEAABAF39E9F98B45F22F2E37F337A7BA412807A31B4A5A4E1627BAA964B77 6AA397D368985045244ACE969799A9489CCA8FEFCF2EAF262ECE08BBD9573C79 2785F61EF31347E7BA6F5053CDC3016406B2BE245D3802D526B84138B959B5DD 393514132E23F7CF49870B0BB2F8248D3ABE9040B9F584356D78387CF7DFCC55 53ABBAE2F36CC7350A9D0B428DE480865F27A3842296A949B275A6F5733C7DE7 4557F5A621E33D3F2DCB8B22E8C8C4E178BCCA13CF4B059841AFC0A1FD8F1193 DB5B8FC343BA9AC54EC2CDF7BAC10F74AB655AB974F05C61CCC3130A647C9CB0 3994BAB56E85DAE462689CE9A07FD2099C9B75ED0EBBCCB03E0ADE441FB4CCDF 9EAFDACAC590B6FCAF0ACB923031C60A852ABDE01FE1CA5D5977DF79DADA529A 0CDC189B67DCF634835BDF11D55D144C27C14B50E787148C1D634F8D6E8CB3DD 736622CEFC3EB09DF909E08F87DAD5FC12B714AC07634A3175EEA8D75D398472 EEBDB745966C824AE2FE553BAE20B09A6F432FD4FFE8105BE467B23B669CBFED E369466433ABA08A9C35E6564C99A2367CDFA06D80D34A07625A0E7413CB7CC0 8D4C20EF6FC08C0F996F97048217D4A95E94A979F87D8C39CF75D3BAC3919783 E6F2CF13981E27D813C15E0F4A0967CEA56DC9D07FDC5F7E02D469B648FFA4CA 1F7103B555B9A0F3B90F2B0CCC21FE13B618D442E4837BFEA6B58A5185123363 CBB58CBD254677D51E879E1E20BBEE7EE30A65F017191F33C23F74FE73196726 CD05373074263612185FDCBF820B6AFF4F272D6085B094C415EB07DFB4BFB962 3B3D7E59959E35C79F62835A2082583809A953832F808F0B51B186C16AB7A006 A933F523CDB0B39B00D98C1267ABABCC38A839D9823C3354DAC649D582B4E295 25454F331E74152571F6D53EC9F074705D8DE0F035636AA3DC9E15E7BBFC4D67 70A2DBA5B17CF4B2960AA2C8FEEE4CF11F94106D5351363DE7A43FDF5A217D4B 4082ADABF6AA5C68601388B623D5F6A17CDA4A39081754AAEA122B8C05ABD1D5 44ABABFDE0EA60F40F4568EAE880A89A7C2B105B705F1959D91A27C6FA2C3BDA A3A8E09A9F9FD722E9E543266E58DC02E8C62ACC54EBC3AE395D29E18FB1BED2 4AE6A6095257A5026226603DA37D8D922A9B394FEDD756B9D4E9A53EA7DCB0A8 6632A154F6ACF358527075BD68BCEBE2DC296324E18D74E02154D8FFE6422173 6697593238DAFA4952F0C96789F8EFC06BD9709A88B742683A4E03D092B97FC5 A35E4626AF387715A0E11CB39164DA78B4C981459D473041BEEBCF15ACBC9E7B AB5D8013DEC7CAF1E89229C355B446AA30F8243796A9AD847424B42EC8EBFDC2 3A6AB55382CFDE4B16B6CB6931C290624BD5A48B78B1FBB9713BBF91F7A6BA4E EDF5125B114270926E80C6388A2FEB17017B615EA0357C4DF905AFC7069509D8 161CFD9FAB792BD07654D0B93C14A2197E47C9B28C218D9C64D183A759899167 1D83A8F1165E91815991299687A8CD6390F8027137D642A1BCDA7769FD373BDD 59EF21FBB7DD6F652791AE89B9182885B02B621B8C7EF4B9DA719B61F86564C8 2CF4738E523A45BAB7C96D67A675F761E4E98D5AA463455CB135CA4C30AC188E 2B877BC61B38E5F0AC9D41E1C2B8D6ED6AF0C25981726BCD6B6E12C046D33089 80DB55674309982758F52705A0406B7AF8A7FAB38D8AC6101451A5903126FD23 6966EDA2714F9355FBD93563E9956CAAD4D0752625B5AB6B4CBA976ED45D612E 9FA500CF06949A3C0C75C5E7129C918046732192788303C04C08DEA4EAF11BCB 27317E5D9589A61A852D5BA2D35A1636BBE37A542B7570D7A87F6D1071169C56 0B3CAD8BDDC353967C48D2D6B9F6746DAB5CCEF2A94110B14A62E4C5E9073827 59E1F0125BBD23FA9092B79235876E1F8FDEF9431756ED2D1C266D2553ECA9C7 EA39962BE300EE686694AA272DD74555746F906D7A277A88FB9D709AC336AA8E C92747B5DB8CC698E23FD68D257BD858FAB33B081518808FE92FB951755026F8 2EE338A655247C509A4370BDB011A9F017E5C788E0DECB228E5ABF779999EFAE 14A750F0ACBF87E420D267D02B493CCA105FF9828F83B4897D8ED980BAAE1D4E CC428C1421F71CAF87107D911A96166A12D4B022A12A9564C9B2A59E274F84BF 6D5A7982433B42E1F488FCC359CCF390B9D9C7D1D332ECCC0375A83BF26B662B 01666BFEEC2C4EFE37CA1B5F5A0E40E31951E3CC38266F75F1B2F6F835FCF4BF E453A46784B34607B07D44C7395ECB0343B5800BF2EECDA2A5770B9B3ADD56DA E8C3FA474E5574311A4523AB315378DBCC00D7F3218B83F78AD4C923C9FAB105 B00EF1E2BB2584FCFBAC15A04308EA2F0403920BFFA4293F7621CF14E1BDC4DB 146ACBAF28A99F84EA4EE68273280053479A3A823418459F4423020965A7F32F 5BEF3C0EAA64EF34C24CA5C994FA25CC63023048AE435AC07DF761EACA1FEA56 EAD279D01EB7CBDFE546ED946278E1A7106543674D8388A0A11290DAE86981C4 B540A5EDD1B50091C8F1E612C8F2A7DA397E2307ED47BE921F57588B1A42F828 3E96A7FE5F6554C370B1ED2A6EC1648FA2E36B1AA6921E44172659F49F2C1B80 C4878BCFC239720F173F30EC543D3A3E8111194055E8E5749142B3DC6D6D4CF2 7B16B10AC109BC674EE4CBCB4C0BC026E0C0913EE2065C09DA1EA13A73E4359C 70EBFED604F23F0CF092044562A280FEC2B6D9A2186F9D1908010D685AB8797F 83358B1BC06A98E062E333299B8D8D99EA00D59050F1A8AB23A6890C11FDA947 F6570ECFD7F158489B26CBD83C1A9473DDF625DDAE599AD5E6B2E90C259D91C6 16F82CA10B511C6D793B86707A741D28F305AC88687196A9EC1BD3B0E806ADD5 DD4BA11DD033FDB87DDAF71CC03C54BDC8BF0CC6AAFA11773419F97DA56380F3 B137AD3259B9C0A38A580881AE201508E5D5941AE96A940D8D3CB33D4E6E0F7E 1B7CE96413140FF954B64053261F0D02CD62B2A12B2F2D9E739B0A3FEB60984D BB147C7E2F0F4C51510C53C0934669E1E401DD2211D5C3D6DB7F12EF28D21E99 4C031B7DC8F4D7E7FD9E51A4F255030D584D15C3D3C25CD21807E579919AAB69 BA2EF80C6A3D2CC7202CA720D2DAF84ABA7B498964911F9B57290DFD5DF0B7AB 1BC8DCE6B36B9C3766E9C704079874BA8F63BA7197C7444F5356ECBDAD3438CB BD0B4C2D5D2198147426CDC9F4BD7B66C7BDB4FC17741624076FB88E1C6C6DA2 492594852F5CAA2C49A20B3DF2DB61003B2AF6A307CBB1115A16D108E7C9F9B4 4CB240277CF8EA3DEA3BCAAB4766902633E09FDD1653FBA3F0AD78832C8A5A6A F3CF47CA3CF9EA3F2924B2EE14DA38C6DE9D89E2872AEACBCE683D474003E7A9 A7502DFC8DC36C044CB8C76AFBA9DADD2F2246222BEB35EA4BF4D33CB6596718 72623B09FF2DC83AEC7D276B910F1883FC0360AB8C406847E895BDBD0B7EDC23 8F4972FF4E8014C9129E0473F96F78651BBB4AC93E3DE448EB4FAD6DF81AB48F E528457C14B635AF905973ED1C2C5B6DC7B65910445B38668434A973C3802458 3C1B72185CDB8A5A06003B6C4626B7BA477F123DE68283D77028295DA86180AF 9AC37C34A71D3DA1C00AAE7D34EBFA89AE491E9552D10E311704CDA263FB950E 31C62E058DB0EF36FADB6796DBAA83A5845A91D2ED90A64522B7AB53E2FD58EF 7B9467ABDD60A2DB4D760259801031883D8409907796996A61EA507AABD02BFF E3A1172D2A2746E5AA4EEF44D8911E6784287D266EF13D18FE46DF7210B98A57 33FD963F926901C0573134CCE52D180B3CEF764A478B65798659157366B0ACF8 7C3A523196731FB9B8627F373A2E0886AE5F9F9A07DD477730900250020E2E20 C017DA1969281111FECD2006F2A969CCF78765D7732CD0FECF2BCDCA51482BCE 4037F4D00BDC6E99355B4BBD7A61C5312FC6AC474AC2F11808055CC679BC1D14 A420C82AD264E203FF6D80393A2027318B8FBA11574DF39ACE1E5312546E83B8 64339701BC6ED997671ABD6A1F7806FDBD0A476ECBF81D57B232E2A215090FC6 175D5364115A932C51FE04ADBA11B6AF44D2AC5C7033CCEF763624E816D1E7F9 D28FE7618B37E0B04504CFB14127D5DD3B3332E7AC4EAF1F31FD28895A1ACF61 80617A9E9BE63734EAFDC6A94DE69A8B2E4034D071A048C130E54DC5AB7FC19B B1E9C17851610C86CD49179001226D5699CEB5ACA90347027EA03693E840FC9F 65F4C9E8023A15580544880794B90F96AD1B4CEC20A54CE9707FE85AFA45EE3D 7AE5FA1C1B66752F6CF700B7278C0BCF1112FA31D1056523C0B309D88342FF65 57DCF89F64CE3236777BBCAC9FE73638B27C7CC0F07FD4562AAED0CD0855EBDC 741550879F34ECC648039A208AD01350BBFF2A37975BF65A4F906F96ABB5A06E 41D0E823B8E62BEF3F51698B822925BCE64408A565D659CA3AA01CA26DAFF91A 79CC3CC0E3DF44952CCB99786BC7BD32E4D14FDBE68B0C269F8B3064F9ECE85F 31E686A6D5713884C1F257566B9A4A27A6A9BDB89B9A9AB5AEEBD5F393831BC0 0400215EC34D0BDA6B7223E1A141BDBB8CFE57951CCE553A9EED4D7AE04829E5 656523BA009809946BD14565602B556E800EF2EE7ECA87E545808C389DC434FB A1A8144FF4A869FD8F075566FA0D41D1E760E8A1A0AFAF8D2C7F1322B7CDD609 F75ECA43367DF6427E84F749023D6FA4914F2837D5E55B1CC5AA8128EF2BC2DD FA316914079142BD0632762D6F98A4F95BBA4B4D814E34A03037F2998BC9B8DE E787E6E5094662F6D92D67C0089708D608CA9C2D24B41344C02D73D1E7E81FAB 38790E88A0B39395EB95729DAC43A6903403127A146111E615E4AD3D21E07EBE BCC306989FF3843C29A705F68C66DB18E9E25E742CBCEE5A514E57EFDA85CC2E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.0: CMBX12 003.002 %%Title: CMBX12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMBX12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup /UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMBX12 def /FontBBox {-53 -251 1139 750 }readonly def /UniqueID 5000769 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 13 /fl put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE 0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D 2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C 42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE 78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D 9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC 5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF 9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE 2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE 947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B 0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D 419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B 70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE 0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC 9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D 1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F 3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B 57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC 8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC 21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F 07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E 8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E 8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD 595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB 313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B 82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D 9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A 31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E 5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E 94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE 0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E 7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE 4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F 744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D 67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA 054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA 6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B 8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB 77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B 72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D 99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD 8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C 82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A 59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C 403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E 0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC 9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 0693AFFF8191C1AD2A5129C8A8DDDD492F8EC8B7B93CCD6D4F240785E515C128 D7AC38F14C1FF204DB89A8805F8D737644DED6E8EC6A58365DFAC56200AA22A9 8F20DE1C232DE4E818CB9D2D3330ADFD72C1B5146849142B447900FDB1DA01E5 C1BD63FB69472D782C659F7862671FEDEEAED3617266DBD34AC593EF6F483D5D AE56A502F9E66041D58C14FD6E83DEDA7DBA041726D78EFCF51152DE72B51F2B B65060004FC8F67755EBA2F10A2D3E496FA3BC3B664ED03F496AC074B7425C21 18FE971025F8553EDFEFBDA53A475B36DBAB73D08985749FD3B0F0C32108EF87 BE0C8DA94598691F774407E4D36D336BC9883D0FBB46C8D8F786780BC5EACB9A 0875E368521C0D91FEFF43DFA0932B65C1FF7776FC2AD3CC8496259C1C31048A EDBD06FD79BAEAB05CCF5B81D99CD34D142C6895FA79F354B447141CD77CD1AD 6B8D17AFDDDF80DB702053EF5123584D5A35087C2333AC821977FDACA7773288 1585539354138C1364483DFA0C2080BECEAFABCB8E08EE11F3E9944D1C58DEFC 6F558CE34B5A8F347C1E8C514E83C16328AEFE032A82125BFC780B67E76CC145 47730F5BD8E48FE4D056969AB8C0A8626C51F4FC2005B632F3D4A9CA4FE72E6A EB1ADE41797E0F0C40C159090555324BED27B2BD4A596AEBD9872C080E5C6FF9 B7D55B4077B438642E42FF7995452E4550397AE68035EFB998AC7802975F2036 953053872BF0D1B934ABB14C2B5599D5C6A902B7AAC786AAAF00B5F6BB0F2E64 90C41BA47A07EA7B9EE3809353AF34F0693DF4A26E59E0EDF64B2D39937B51F1 0C296B7EA55F583D151F35DA68D2B7D2085ABB8C13BAA6D0F6D85E300DA9D221 D26021738105BCEDBE23B9E772289252DA67A1AD43649D193C1A3F922161EFE9 896C0E81F1F0C01D6A5237F3CEBD198A5FD35F1CC3AF0641C213E64CDD9C35C8 BE0C4FD5AD849E58DEDBB9FB73869497A58377D1010E0752148BCC3ABA1A7F2E 7BC85DE9086BBF162C98D7997595869D0F9DA15DD58424482B43DA8B760A053E 644EA91B008FBC3ED328AE547B888033FEC998FC768D1CDBF66FC5314CD97CBC 66CF38664C77FE94E190B2265FA1DEED813642E65F217FD32C2ED79B255A2688 B9EF140A678D5DF576F23AD57691A629565B623D66F0DB0401EBC01698C3629D 2DA6FE517F67CBE4F9A91D5ECF0E9E76D8F6A0713E290B32F1DCE662BAE9308E 3099631376266B15CC8303BE88F0ED45822A5889D0CCC99C43AD6BE6FCF4AD33 962627E329E8F4B79EC743800ACD31E953599778BE55D4C74C30E675E1B83831 50F7C561903019AAE4436634A82389257F99676A019418096813A2B427F1EFF3 F8F84C2ACFBBF5407F67CC2FA928F6DE10E6D7A59D0202722C2C5776B186AF71 33CDEC668571B8970C31DBF898804A0F28B24A37597F7974A4412260F02163D2 4819582EC24197901D749C0EE1D6BC42B367EA36F731C1C0CEA81CC99D84E424 B735F610539EF512E44C7EB9354F5C798E5C22A446D25E3F379AA624DEC54D71 A06114A21382089500CC90007EC5956777E4B52BFC59FDAF4F95E1C17D70105F 375EEB758568E9C6F4F52220D191DDF00BD425DFBC86EB014F090D90C5F2BF45 5D4534E29B379FD422CE4ED622AD805C4F5D8F374CC51FCB159C36B76A45DA5F 368AFF3F63B3539EC2DA950C314EEC81CA057C4948134C159A33FC4DEF6BBD32 B189218007EA4E6E3746D0F0F3D725087FD48132FE607AC75D5925C95EF2F11D BA649CCF492D1AECC94C1A610C43C16794F546C084F343A500F8D666516C337B E0C59337625B1FF56BDD9C516ECBC905EA603CD2F3651429F67FF5F1FD399E20 0520CE971A2A6D79CC04ED402F0E6F0843141900F2BFD9EF85DB1CFAD0FF26F8 E01C7A16897078283BE8711DC9CD526709DC613168CA0FE49355745FC8FA7692 56B00CE659790EDF0585226EAE546E1E67538B73469A9024DEAA5F903A47E76D 0B40FFAFBBDDF0DACAC433F2A4752449DFEC9D90EEFB3B1EF3AACAEB80CFC991 27081D15DF67A67E42A33D19B12EA74D649B07C405D10C6D24DEDA1560AF5A9E 83386D81431B65E418A3C1677C65770FB154BCD8298270CEE2A106E25011D371 F4060411786B9FF15CF31CD1B80FB5705B5F8F86CAB55678ADFC63DFFC9E8109 685F86DA014A619EDABCD4D094579720E7FCAC1E36E0B45DEADA1D290708A822 9893D61AC1C33D04D56E12F8E415EE7D367A6284779B97ADE06DC444BF8282A6 A1B81718F3A994AA8EC810D09E74E8FA8F2218BDB35A79100C881C5E1F659392 A2EEF39274D7051285EC4B15EAFD966605E300AC5CA39E2B28C7354801154DDF 06B67D2F796B06134DA373C562A1E14D19734A5E03DEF95B4CCA825DCC6DC5C4 6093CBEB257121D44AE39B78F846438564E3173FC89B8ADD12006E9F24E2EAD8 CBABD94105894F9FF0ABB14A20EB8299D8315514D126428B5469FF3343EC58E7 CBED3AEB174C701A403FCB91E2A320E461860510BE93350DBB9E85D5AA02C2FE FB088D80C086F7A2F8A08A9702FBA2CC509A24FBC23BDF76AED61B3DC7894B00 19C19FF9E1F570C880123F71CD71C8D51359A88763DE2CC37B26083A90B52792 F9CC974D45F70F12115091468DE58F2D4C387BBF44FF7F0B295D78906DE975EC 367895205C5714971035C07BDD04150C23564D8DB0C62EBC7B592E3547794425 C4990D7EBD1755CBF44C72F5741EE800109C5C803EDC9903CE19D279082491EF 6512E7D41E5EB09A9F44D24930C5D8266A04F9302710AA6451F77BFC1209EDFA FB717D8F3E52B3D2E213728C7F699984845AEC55984E18769DE8F0BD88087E03 2D9E667B1E052209EEED8D499C9E7672A100ABBA4F32B32FEED23DC161551008 FB534F46E2D8AD9A276523C345F776F284B301C20C722FE07A56E4A772A22D4F A89D5DDA8EC6B6D734459A64A97D6A8C995D303D16A9B0FD155A109CEFD55ACC 8DB6EA541956B9046AC67F35935749D8B6908C8B07C0A94370A0FBCF6B09F4CF AA5ECFAE2410E9FDC01D38A76E25B5D9A145F49A836CF48867568A05C213E440 01AF9449D96B1DAC8BC292D333D31AB6921FF721188480345DBB269DAAB6032A 17B0A79D712C2CCC78126FF91186A3F3170E1A0D157893F1532F2F571E5DAA73 E65E1A4A866A6387C3D00810EE69FE5F7FA246A30BF603F0DC8CC82C344931F3 B29DFCF7B093463AD81C2D370F5B2FE11394218ECB611D45EDA004815161F47C 15A017DF1C9AF6784690243F4765EEAF0E4156BEB3BD61219C661DACB01ED299 ADBAF853A7622CCCF6891FA00ED44F6B3688601CC8216A216D924B9DA79C38C5 46D74661879034C719BD415A65DF7FEC50B1E6B2547944C7275EEF2173FAED18 DCEEAC292D33AE7F60B85FEC35E147DA422170135E92352509132A2C0F1550FB 26FC0E0B8496CE10F2810698A06C0D06A96B78209DAAB896D283903C00361D3E 72B1EECBB834B560A8188B31C0FD3D34FA1AD5F7325B1D57A95D8C7AF4820C60 F500B56441CE82A7BF92FB07B20EE5E686FA261429A3E2DFFAD7FBA3869C28B6 DF0189DB4A5F8842ADB474C3F13F8CB0FF5FD947AB034158BAB741DB7F6AEB87 F54A14EC8916192A92870C12B446CE59D95AD3BBA9AECCF12114874E4D43CB24 6F2836B7F4F454D7422C8AE40C0F42BBF1620858DDD5FEC60FDB0568F6C1F41A 5D1BA70F7FF1489EDABB302E862EBDBE3CFB4C2D836325473D8BC7825D580EDA 17EF1AF57B30934D330D2909ED70E1C6386CECB9455D35AA771960A4F073FC85 BB5C18DA78667E62E5DC299B06829893B0483BBC28792C6050D5D07D8FF82F34 528D14ABD8AA14C85003EC0B4D6554B6D1C26E9749A7A3A32799746AB8D4945B A6BBBBDA4E3EB9AE748B84F37282A9C5FF399A9A063177A6A62AC84A1991134E 13CC476F035694E23984723A9C2E3B106EF0011E99CC2B5AE54312211D0EB8DE AF63A4C5D1BC11CE64A73AAE54082CFD33813965D88B0B24720436ED4F96E7C8 437DBD44B4D6BDDBAD17F05DCBEA4DD6F4F02FCC6D630B1CC420A5B0DDBEE3E2 5982823E6AD9601F23A0A00659209DEACEFE6116AFC0B5BC63F404E329003BD2 3FE0DD9E291893FD142CF0202043170A87911EC005C6EFFE997B112A0461C011 1A60D302C4A745AC0A1D37C8566A231FF0D52A7A6A91875275C359F633AC3E52 14C42F7D6D45D521510EB13DE8FCC8209AFFA50A2AFA64974DA3D5CD098C0A82 932730625CC5409C21AE3E51F4E5C5059C7F81F9108D4803A95BC6F4E6CC1818 D249D2F1061430D142CBEDA203134617E5401B50B479195559C4F89DB9D974DA 348634E2A7C1BA80E62D5136B672367AD11788C706335BC09736C510DFAB7DF4 64F62E9ED49AF163C494A49BF3A171F1CCC1C123E535516681AFF60CD3270A4F 49C6C3BBFED0EAFDFAE2C5B33756BE13936C024E4ECC370B4F6868526BC9097E 66A4131CF1117745CC97AE492969E0DC0B4A2A01AE9724AF7BC8580DC7A1D04C 0BEB30A18117D5C6D5D3F248D1E56F75C810CDDCC029F5D64F6E6E404EC41CC6 AE4EB39EA04DAFDA7F6D4774CD9983655D413E22BACAD10C04A0C6F82336E274 62977BB4CC793A4C2A6B09F5F12640063E4B60962B0FDBD3D491E64B6FABB24E 489243C0250C5A826235FDAE0F22BD9D0934FE96F6B1F482E173F46C3F98A05F E96C531E1FABD4104AA123147681E0676A9D91D80208B4E9209DE21B799A5741 2ECE19C040C531C4FC8A54D23743705A2C2F350EA24FB4659A4BF9EC00BC9F44 DF85A07F14423C7531620FD981B51F885515CAFE83B6A17CFE2AE7BA5F1583E2 444F319C54BAA116B0481BCAC0BE3A1BF77E548F70F6E09CB05D772338E6B588 AE655F0449CA6230D5B34E0391FAA9FB57138E0B8565AD0B2CF2FB1D8BD54052 66941403CBF725EC524AC30B39408D4D19AFD2DAC9C5CD134F3B8036A8863BEC 409C9D86F3185096CCE60857BD17859B5AFD038440CAF326D8CEEAB10E61FEBC FFB0F7CDE282927A6C91CE9E78DD0AA168B00F3C11774E9FDFF0ED93677E5CBD F419D93570A3483A6EE8B7B92F7BF82B8054696222E5948E559B8728E2610322 757A617A5E0A7870DF9EE75BC14BFB9BD25175D813B9B5A18BE2339F12285944 CD6DE86D2977D05B350F0C605304E43AD6DF4DF86143B9EFEBBD7F3523681FB9 0FA74B4171F7A75AF868EF079D9DCF561D3823BA4A4CF5FCD8601FA561B01B97 A30B8B655F832808E4BD398CA8B309F96B9984B4F0E576A08D21AFBDBF50EA1A 438F62BD15A53EDC1552436B9F2AEA3F3743741ADB37A85D9B07CD2F6F404E5D ACDD757BD85F317ABC85FFC1019CD901EE3F49C627F10074E6773FDE3F1D1997 B194A901B98724D562BF48B2FDAB86F7530B65C5E8C333D10E29FABCD9075CCE 634E28BCF2079DF7E0A3F2339BE39F01E1D5EAA791EEC0132DEBABF683F07CFC E2B4705A83804D5BDA5736F6966A4292093C54392CBC28352B0A4966E0EAC235 D11948FF2B1F49088157EC7901527707AE9825F5C2CFA80D4FF18D66DDC4E3A9 0B0013A5ECFA56BE5CF461FD4E21FC9353BC1283FEC222993CF91269EF79ACE9 CFE6D3E551E235CB60CFA214E0E5D4A0BFC73C09D36274C9A562A36B673CB095 B0D09B8C3883E8D783999DF956C21F9DBD2D7E495845187B846EC73512B6C30D 22E51E80BED56C8B93719346F4D97668F5153138CE06F59910CFC4F690BB4CEC CF932FE21DA9CC6134D59FFA9073944F419E34B1A0C9FCBB8E3328D37E42DD36 4D35FACB235A1C09F4021B77A5C2A3AB701369C97C07B232B3C8072FEBAE9833 8C850802FC1B3727FF6617C2298A6E8C0C72076CBBBAA83ECDA863C879A656CF DAD46098EC50F036AAF8E0E186D6337E0FF8604F9814C0941E278A50B275714A 593CCE3C6E7A22E2109D06560C53B8C871C5B93AC9FAFBB2FFA04A8EA170D4FD D2BCAB40A87B162D4947F16EE5BAA9EE525A01E34EBD97BEA3429275E25F3134 B91EA2787F5948E87054CE92EDADFC6B50E7B01A62F738D54479C3E6CEA5C628 669F12CE23081B74D6C20661DA27379A0DE37BAADA64773E410E06E1848BDE6C 5C553F3D687F85739BD71A9A80F75755A5D1E8E659B15BD6729B7C7BF5066F66 B4E5C2ECEE4F37443C8BCA8CFA6B59495B03AA4E1C20D7103E8BF2FD4628BE2B 349A8B35A50C8ADC97701F75F605E77F5C40919E580E79C0254BF460316E8073 39F727189F231B2ECF6975E235C8CD20616EB42ED5CFB2E84A53BE99DF7BA736 FD8D18A3A1767B6F9C0BCCAFD1A10611FB537FA5428F75DD4C1B50700948852C 42FB626793ADD3F3A5DF928ACE185C5F22BFD18B416A6AE0FEB20E5120D3BFF0 D686E51368C07004C6671421A5D6C79A22FED55C4D8490B3EB9DF64758000F45 10D18739FCE0EFE8502CD224BD7AB460CC8E5817FCA3D812F45B17C20BD43AC3 6FD9C32DF055B12D93D255B9FACB241AC5F7816FA44B99593A53058B4BCB8114 A2468E4C7884C6554CDB2975519E2647379302C878F978A9BD6F891F67229BF9 F5C543DAE0CBFC04156F79593379D1EEFFA1BAFF4BD6B150A888ED2A206C29E6 B86C766FB04D4D22D5A5FC64884157C5DF221129C2C99145B5CBF6043EB41A71 FD93E9E9F7FE2AF5F70351874DD4763DF6F431F78A3858C4D61BDF849E407D58 F9D5119CF53EFBB6A63CB3CD8004AE9E1661C42AF43F157E7A34A49357A5CE50 78027BABA4E019BE121E856B9B2B358C7AAEBE90DD321D9D61D2932AFB090987 3702F684CADCC9DE0D2769D4E8903A03FE1763A001096489D430A3DBFE8160A4 0A1F2AD9B6036ED8986D1DD298C5F033C013C74F07297F62B92887AC202DB7A2 98E3559993D96C588848A96EDACB16BF07A66AEDC0E56CD9F866F2192D5A5065 E119AFEAD672F4F34F3E919749D9877A0A744E99FAB38E5A3D6B885B1CF750AC CD724892A643304B27722EFF53D9CA4DBABCB8CC03897086A708211B0EAEE1D8 C5FE464845117343027DE5FFC44AC140081C7E676CF2668CEE5C6D051231A97B F516D15445299DB8B8945C677A27096857CC9163135A2D0037C5C51D11FFADD4 9E1BC905E8BACFF28D483948498C70E35BC7EAB4E44FCF874A6B112F77CF86D3 9BED322116AC8A812E2538A6C81247C577D3C5C7267BEFE1EB4CD8BF7D11F28A 403A071506F31D5D84E91471593D8FF268643531B0FA15B73D5E47EB1E70E527 221B14CA37EE0BF25E3EEF69FB465270A9CA72D00519987BF38CF5B95EC12D25 F8D61D171AB9951CB64E98F0F5E1C52763F8FDEF5166752770E99E83557D9808 8ED4506B6164F2A3B3480B4B14C74A475C18E9F8DBD09DAF3FC7FF2002963B74 4D02BAF20996F408DF7A0C5C58D960FDF1F7C5447DC0F7414A628EDA66A0C1E9 C5525430456C06C6766046443D7B2A47E3E2390C8999D25D8BFA868B50737FA6 F6761725265F7757B84AB5F99096C46FF928B9841A289932534305B6CD02245E 27A9A024E4A88998AB7551E2B70C5A66E6916EBE157D60103C2E173C7A5517E2 447855E873BE819A341271C20175973BC79E77D737CBF1ADBB0BC61F84B1B3FA 9A2117CBD1BA0B0C2EF186B64145BCBE04234FDACEAAEEE832DFCDDA820B0372 A024EF4EC8577A3716A5A81FD287F79121D45F025E5A426E40187DB9E0E14A9C C9AFA8F3E6CDB59BDA85488B3247E6DF460C2761033F4B51DF073F1D01360245 4A14388FD198AC093DB9F4F6A35C9C5DD46A9E763A3C9DEB0EC81C6094E725C1 9DF00F7D0BC9E65AFBD8E58E532C461575EBD16EB8320D027C9410338814E544 48B3691483E142C666A7BF83DF941D8892F5CBF4D883487EAF600E28C9176E49 3F5F1A78ECAE0874E72CB4E5660D49C2556BF71F3F6DB1636DC5990F97F29CE1 6AF207869B7D08504D948F4D451367E3818F8EC39705F9914CAFBCD068008628 72FEE1C26123EC584897F88EE89DCF3AC3ADCBB0C8DDD235C55885E88AAA5660 6495E446F161F4302C4723441D6AB409C3973AB05FFA79682345B4EEF9E376B0 60E1D22F5DB61E8347EB269312D9EBF3B886757BEBA7EAE98E9E6CB8EB2BC6B8 1EAF87362A92E5E3B30356CBA89549345765FA8D13AFDCE4EFC789DC62AD0215 A96DE4C5FC2E7AF72883D4EE56CEF8792A49439A274220995ED33C142CC4C896 247984506165A65E46084D9A2EEF917CDF5F576EABAAE52FE4BD9DB5470BCBE0 05B8C68A34AB57F69D7781A42260737509D0643377E6B782CEE1E85CF2122911 DF52675D4E24699B5A125099CCAB057D898EC28F211E3FCE975D80F71701E148 6C9D82DA88266235367F5165EC50C09B47862393609C1E39F3EB8439DE72DF67 1EE335FF12BA89067979EF37895BAD4C54073CBBB9933BA75C2EE241178FA96C 2C821971B10920398672174E6B62B77F62BA58413A4BE170333B8579983B47B3 AD474C4F310B316C805C07C457524A6C07661FE695F902EDE37C764DAA897A68 EFC6BA9CD3EA67CD8FBE5B09A1848C545F4946ED5402354D80663DE42115D9E0 449706307E8C0F94489CC60DD36058FA2B3586E221D9BC11B046C237DA7C6552 6A8050DC9F150EBAE444904D44796E429B2F909EDD89C2977E47390D5DAE3CA9 529E800AAC2C9312F70DADE0298C91EBCA4E55C79924580144C407022932CC60 14BC4009E00195866CCC37E97938EBAC77EFAD9C78557F61868F23D29EB05CE2 02A3BE104B1D29CDB36D66EFE3B053311219A290DEE2B8776AD80A8DBCBC1A7F B004772D1FE0788C78ECE6C0BEC1440043E1B555072BDCA7E9DA4C3CBB78701D 466A0A83044EC66AE396DE7573AD3888DC73935209D0B3B27504DE858087D2BE 46960F90B4639431669DC6478E3340CE8B0EF8F7528F8332383568F221C5BB21 12DB65AD343DC6989376509C3CA2490E278593B4C7283132864304C88AB622CB A1DE77C18638AFF1D033A13B932325668F54846B668595D9F7D61A126314750F B5E2614647A5C827C0287F4BA167A9EDE65F177C87170A5C7053846A525246CD DB043AA154B7D956A185A0B5168AEC4586392C749315B6E6302357F78B1E7B6C 31B0A87040EBB55B22A57EC13DD5A5205D36CFA3630699CF7E6E80D61B58D4B5 1543AC0C656531AA79E02AE9D9D2CC3BCF4C8F6FA029A07B481F1E40AE4E8644 0820EF8DA9D4187C220AD5F86A90858B3C5D6917EC1F062B2992A400FB7AF062 70596743DACC84C67787EED07C17021F925ED2F7DCAE5FC6B803AC223FC3A75C 99B4333CBA6EAB86704B2D5AC9D946899F78D67DFBAC5A1CDD493E0D840AA6D2 5D8B4F09CBB4B8336C98382FB36C408FEDBA520EE1D4919ACC8B0F55D1C25457 2C8C1E968E2357D3496482A17A1DAAB6219D454DAFA4A6B0AE9A0C9D93BB9E9C 77D68FFE20D3EB8A788F0B237197A619C22E8AE8C8382F990E4200A81A7480F0 76D505FAD4CFAE8D2BB3E8B4BB623FA432B0455FEA3AE44CD6F04A4EB6FE910D 6096C8CA2D6D9003D0C47A79854D903FBDCF18ED2EE1602EA0DD26FE70A69B58 F497B74B0E0A3F36E25BC6B86FA25A8A2FB9AE1F6A24F00DB637C29A1072CE29 4ED591DA4382E23FA68FE7092FB026CEC78340253B6FC37920E1CCB3B37E6383 18691CF8ED514CA67E8BC56B76B9BB6D5D426121C11FBCDB24EE80122381EFCB A9563DC02DBF606316715FFDA56A9DC514D942347E1A83A7A220C202C67ED00B D23891863BAC9F6636014C14886DA9DD35FAC14CDED30829212B9AE168B655DD 8430AC6E6DD16B137ABFA74D4AAC940A9B1C5E9E0C36F2AD42E6DFC9A6A6A0A7 0F021FC1751CA6A0E8B94AF8DA3D34DB9992B7F82D48FC60F16C64FAAEF56C18 340798B697A3DEB9831D1AF852C3971D168118142B04FA8083D1507796DE92CD 854D4F53C28263CFF5C7FCB5EB193643C4DF312A4057FED07E82254FB2A788EF 2C20FE3B3387D66778EF5B3A40F7AA0FA22219FF8A6C64078DB58BE016A7B5E8 3F3F09F7531D31DF2F9BF7CE84AD81A19F11688A44B999E6A0C2731C95C033D5 F51715F93F3E356C9B9B95CE874CEF0999D0F412063D79B3AF481CA4BE17A355 D649FB22EEA672781B94DF2DFB63A2F9D49EBAD76615C752254ECC9F163CF5F5 F0628A6EF15C4D9A88D30782376C0AC3103C8610183FC19AF32DF77E892B558E 98B36C6DF1C39646EB755EAB65CD9132A1FCDC5CA4C0CCC548491BD689DE8533 A67A25FFB41EFF8AD5D1CB97A44F7BDB975F76DF1032C0CFEAD3C47FDA502D7A B88BC9904A5E4A122AED34456964695A5CB5F2CBCA516C719BB70B7545A26E40 4C766BCC94D8F6C5C708439E4EEA49AB3E5748EEC9016D868419857858CAD973 98474114119801E6E91F4C69A6BBCA93FA48D5787462E13B1485A8B6DB1A163E 7D199703D78C39F650FB9DACD07B64854AEAEC1FE6FA5BB21F090C75C4FA51B5 37305A9183C44D08464ADFA29BB0BBE19AF67981F5D8C544E9536EBDD75C8B24 8F5632B215684C697476614AE4752D7B65D2A982603718B578304C5A54243391 7C1B50911424FBEB27155CF21F5D85C248A2DA45F1AAB8D182308EBE662B5402 BAAF4D8B1B920CEFD779CB5418405B668C64E5B2B30C691CB2E388C5BDCE4422 FFFE2E8EDDDCB79EBA07FB5EC5FDFAB4BE892C1912A4012C95A6A5ECCAC83E89 61637D73A2DB4B164726E8DB9F735DE04A5A9C4D61E05D6BF7A912CFCFF9739F 69EC413A01C825FEEC871CC55EC21BCCC7E7794871B47E2020FB90E1E91D8514 B1791C25D662216D1CDEC61C35AFC553CAD66524D17B494DC7E52864C1CE735F EEE09903725DFA10D3DD68E1920C1BD3D7D1AA1566E218FA92ECFD5C712871F4 04E33428E83EEDC0187AE9D705B022053C55644BEFCAF4116686430DBFDF9902 604028AE97CE97202E23815337568EDD3AAD897FB7C016CB72041E1F2FAB9912 B1C939A52E862ACB90A8821ACE32336727F27F9F4E15E7CDCFFB4B57406E6926 846C941896244B359AA02D72206798F5244B8CD22AF48D50C872FFA57D2F6EBF 27280A8DF735DC9BE76706D618B96AF7FC5C61C411244A01FB3A5A19C7568DFB FA0290B09A793CB0F54D70E8B31A6C46C830367939F4BF09CB5075F7744E3443 302E3B7D3D22578A824FCFBD29E17F2AE8DE7731D782AA0936DA57D7ECB66325 B417E2846557AB36731468BFC52E912677D3434E1D2111FF846E6B97262E5B8F CDE0E0716559C70D737E9A97BF22E8FA95A87347914E4A3D184A467B80EEF72A 72E46880031319640C6B4F5E0566A230BDB1C4ABEB03FDEDADA67A574CCDBD3C AC2390E8341E6F9A11817987980BFC012BB307F2E7F9B2F00E9256D2CE1CB095 0030C6B4A52A817B84B49E9B2617A4A8B6E70775B26A141946804A632275A216 EF794E20FFC9CAFEE2D57B3EFB92B5DF261CF7DB35E97FEA13A7E391DE4908C9 4E372B7F44D97ABDBFD9E1C5CD09835C1F64DA848E14E77E9927F3C65137B6BC CBAFCC9B87A6ED577DAEFABB2657A090A50F74E69C6D5A7786A731383B627177 6B2491F86990C959E42936654CFE913BEDA66AE93A087EF91B0D27792C6D904D DE939CA4E11A8A815835E29DAD4891A5708DC6194906DE246020003155F88B39 C2D885F9934AA1E188AF5710C6499D3AEF18DDAD475C3543FA9CCA10989322E0 7CA7FEBE64D6193ADD0DA24B3944885EFABC2F46405A8988DE0C124DF57266EF 11B8393A78B8CA177E12716CB90622E9CB45C139DAADCBCE1F67F77755A59AEA 13F711AEBC36BC11D3A898179AA483416C0A07D23B826E349FD09696254C006C BE5D2462C6C43C7974B65B4006E91B349860049810C69E83405EF270A816607F 82B9EB6CE7CC609F38E6BA597BA2C5F9B872476CBFFAB9D57CB521B8A37767E4 28367DEDF2718303B1EE517C901B84F1FE1A8E3C624B8DA8698157ED8E9330CF D89E8136AB7417AD57778BF2E0927A6D2AC0071065C60E52C350E89C5EF208F0 A72C401B8E95B7AAE935496BFB38C0B3060A3B17FD263FDDC58F36A7FFF3C118 74EA42715BCFA4F554875DB07DB44EF6D7C6E18E06DAA539CDFCE1F3CB0E7863 429A5BA3C07E6241ED448FA76BEFEA910FDE244A80F99E51F293827CD6D54636 E1E2D7E36D796FE92E11E6B982AE3502C051D509F41F8DE7B3AE599C774ABDF8 855B55F1972306F28E047D2F72C0BAB248F2C17B417004CBBA32566FC868EDBE 996B232BDE762E95B66771DDFC1E88A59C4224406F589AA0A90707B15AB45F07 C70E38C7B58AF68CFECBB3787E8B3CF72CFAC5BFA1D98A3A284B3A7A6E76DCF0 5B42B27414157498DD5924D49E2AAE6E27CC451AFD4B2FCCCFAAD7A882B52142 D8CC76B9C951BCAF8B02E3038F59BFFB805C065B6E2131B9F2B48DCE7A95ADF9 9002FED560401F0880AF06DB9654EF60C74C5D8032866ACE9DF7AF514CEF2F5F 4C0FC33B35C4B7736720D6EF04EA845A62FB872FBC8392B416F906B7750A93FA C474E41891DB2818D5770A7AA1D5EA9758439553547A8AE8855556ABB6F27D0B 22E6AB43B6810ADB29E473E6296889E473B4C5F99B681C533A78992AC285DAE6 24A29992246D844088A675958541C81E31173F677E8E2BCF8A1C0B4141727566 BEA7F902CEF4C3A43D66218E72792C24BBC63BEB1B2851E79832700C0D7D3675 57A7D811CA109AED653B571115077A49D841B75B7CD761B8211642F72BA27FCD A264C808E09928911BA8FE47A7D944723D16AA973B7641B3411637CC837C87DA A363E9CEAE30C62114A77712A423E31238C6EB40A279F2B76493D9E8EBE5B9BA C1A73DE6D64CAAB22C30E20EAE2708212A37685FC8925D0B1973D8F45F5F97E6 9572923EF6B7AAFFB00FD091F31BBA075FDDF7B5B394F6CD5907E551ACDD93CE ACCDFCA918051735671A8B9B45F20D591A397DBE373E11561A44520015C9ECEF 51B41FD0C06777E41B0EE5D4B864161733274C01895F3D3AD221BA12049E0581 B32468B789D03CF0E19A5C5BDBF3418998AF56F4DFF335107D52CDD721D0C236 34BD3EBE5373374AF8602C807EDDC6366CDAF0E680FCC555824382AB974A5147 25755058EC0F76FAF0533551DD8D8F04CBB121F9B31B6B3C64AABC9ED1C34447 1BBF1778072B5FF3EF33893F3FE83B154DE21CF5B3BF9FD98B015095F5CB20D8 FDAAB715F3CBFAAF8F29BF6AB1661834469513D53EDA03A780B177E14469DA01 852812E22BADB0ED0766ADDB4015F559D25B216ACDC54EDF639F682B53A54DBC 00D277EAA728A573F7A063D407977E31AAC0D60BDC6C9199E45566308B6F0C57 C37B28F68A12B9A2ACE20F99E2AE55021F2357C3EB379A255AD89220F37AD22F 3A0E186634B91CFDB48EC69436DB9D1969FDC191587CE4370396C39822665E08 5861AA628ACA0874758258712CD302F18854D0365657B4313FF973AD97353745 F41D2EFEC1C8DA51D414B978DFE02872B864644A1B20287ACB0F0217813C63C9 E0D086F2F4004C72947A80374A9C80C3FF91BDAA1E242CEFB49C726212B97637 A6F2CB3E3461D7B8231D9FD8F7FCAC8D7DD151EC4497D15F29D21BF7552F03C7 62584037CC06E444F8D0BB046B200CA53D526D9C2AF3F0D79146952C8990C280 BA91BE146E1B628AAA6B6B4C91B420DBDAC88D40EBA19493951D38FC7052A72C D007F41894A826238285654C75A5C4B505E91E6129D8A8AEC314B057B6D32D86 5C156FC0F9E2F7CB4DA095671A46A4D8C4ACAE18DA6BA4533EC024CC3C2DDFED 5DC6B12CAF98AE7D576BFDFD9CB6BB4EDC12DFAA9C4372A54531692A07944162 B945673F362325E8991B6059D801FF12EF8E40C86B58C5BDFBC8B8D8E9E1A1A8 C7DE372FF4058323BFD982C3691EF55DD96B73D2DD2F362B576827A8843F08FA 6EC9E6E37ABA80594295CB2ACBB4E64070C92D7236CD1D19395B54A3F4537B39 3D2589EBFBA5C4945B6B16EB8132F326FFBD27AFE30B310B25171FEBD006603B 15CC01097C133BB37F87C01104F60D2CEB43A639917EB5AEB5DE48EA5AFF9ACF C37370E957621B9EC112D86B7752C60A8A99659100D28109A1670174C53726B8 9B90FE5313DE50D1EB534602325E135FE9D38DAFA63EA7FCADB8C44692043437 98B67AE3787020B4096F2787C8293EC5B8DB5986FF8A704C115D4CC63B4BA34C F9CCEBB1A75C38E0013FC4B54B2357ADE6243D8FEEF0F49999AA71654C166874 C999CC3274A04DCAD389B1F823EA68931CA41DC12508CA34625307C8CFED5087 B3C52528123681408774D333A9A083E391E2849F2771340465FBE1605130750E 1960928C7742EE60A9D67E9B6BA1577A660C189D48FF4EF7D12FE4903A0B1887 4268B88DAE579416AE407C3081CB314C4EDF25B77768C764603E4E479CD3063E F35FCAD5C23E00810631A70E5C4EE1906DF37C038891DB896196BAD371F10F05 ACCA6181BF5CD94F47257BC13E2038D91F478CAB439D9824454C0A445A1ED884 0B8548C85964D2FAAF75BE359334A92B894320CAEA6D05ABB707D92B3994A3F9 A8A1B782288E41928FFFCE2DB4F53958D74BE8D55297C183DC77DA68BA569C42 D47CF7710AE076188C2091851F2940C763EDBAD04F51A34BAF0C7C9B19A6BFF2 2C7467BC151DA37B9CBE2C9B4B974CC06702A4BA75FB249D74D71E34E840A947 0DFB2281F8AE28A646275BCABF47A8EA5B588BD6AB1B962A3B58B3A88A0950CD FD2842A268217CCE1CE234F3A3E798C083AA7B79DB94743E201AF35D5CAE5D3D 93DC33441B6258B95ECDC3E31E9DBF4854643987B127D4390920A83D466452A3 5E64B9DFED190D17775D7B2D68CB98E6369944F5A70B80BFE845BE8C75ACF549 64F708529206676D6CEE55D46057C73CB15B303425AF5D142B23D7F333DC0919 C43BD3ABED04326B61EEC7BAC4D59F36EE936CA5C8A4E5EF96849AC308220DA5 C44BE6CBA88BB3F23A77E813B64B9A410093DBEA3B8963D09D1640DCDE17822F A084737AA9BBE678ED365CF22F428901E64ED5457528DDAA6D305FF1223A799A BB9E4561516432E5D6F6D6D54069280FE3711BB5165AB88D7858F9E9ACFA758A D7DC81939B00871183A6E2AA9BBF42FCBE69871268EC6139C2CE1F04213F745D A0B1ABCF0F1F28B149F806A0629287B2F7B210A16F18799887DAC36885779B23 96D3D33499BA5A2B7D58CDA1DC7B954B9CA83F0E3B35FA8A1A70C9E979DB2FC2 E0870459F36EFCE058C9BA138D47097BA8863DBA869352CF0BDF5972FA207DFF 28EBD0715F7ED797D13EB44CFD862F4A919D3C02FA4378764F382160A46B013A 40F360EB4DCC95CF356FE7CBBF86E3722B8DDFCB3DA539EBAD796DA314FBB562 1B6E551EA98EB659BB9AAB35343CE103DD6E7F3A183E78A0E07955286A06B478 9D6898030B8A02C3B56996030F2AB6E42EE642C9CF2B83BA193BBA74F7958D8A 6DD1D8DC7301C65DE654916D86492C5FE022E6ED36657493B033A07F0E63120E 19ABE0E53DF43C1F2A39CC0D7FB55A9FCFD376326CBBDFB322CF1841D15B8199 65C8F3291B04CEE46B931B5AF3D661ADC44B9E1ADF15468549CA32FFD3110CBF 8F77479260C0C1D91E65C19F9888A2C44B3105DB2A901A1442208B0CE9E2E324 476D5BF89E6228C18E69B07BF4977F0C1DA65D5022EEF7E9753AAC01A66A3A4E D116247C2C2B9132D5AEAF8AB29C5A55ADCF7ACFD01216386396D23851BCECDD BD6B72475C621076B62CA71B3280CAAC87E34465AB4F190AC2DF030C54C353EE 230B3DF1A0C84909CBB09D2A77A2E8E9E3776955D46312810850472B81F4903A EF2525A0904BCB5EA7C1DFBC9893F0A4C5380D72EA6473637FFB0B76F15AF456 5311E974F134C934FCC304E56C3DCB64F1D7C0E3D54E312C1177753BF9BB1D21 9FF354F45A4F50934932953815B78B7CEA886A7EF13B8272A5B071CEBB6C3A5C 9E622A4E04D5365ED0D08417D636BE98FAE987AFD1A9084192C6D718AD89F1AB 4147E959ED9A6863243782CE79F92F0BDD64D37BBE1B9C80ECD9800F98038B81 5CE7D8A0D4F497B9C47035618F50F88B7E5A9466D0A9BEB9A63EFD630DA55B86 A76B7854D8DCED82B434103ED8DADBFA63D934E9B46181E439885AC49F890CAB B4900829D3A25A397BE4BCBF794DE90AEB9690E3C86842AC1E2E3C8B4C45C8C7 0A2EF641E285FB3862CD6B67C3FA239113F217E44E57472FF8BAE479C43A0E79 0AC398A14FFB84F8A2CC8C40E3684665FF5A6041139E6FDA0157F3E7F66B823D B7956F185E9617023432883689E34C96AA6713F4CCE5029AA6E2F0C788320FDF E58958E4928D006CFB5C3358004FACE64E8D490F63871EC0B77C134E701CAFAA B17D3DA054F787B357B73574CF1FCFE0A6738DF117FA4C6BAD2651CC915C695D 814343D5945DB457E2F798B401E458ABDB40E17C9B54BBC4674025BD0F4F4645 455EE4C435856C9BA1A3EA674A5AD363427357F62C6C61C0E362249DA9FECB09 5E1AB4A75ACB27D084F17C94F5FD46DD13D1DA4E6C3A70131B55B4E5070F2AC2 1E5ED69C7915B7EC2E4FBC526E77F5F20CA7DEEE3F75A1E51F732177EAB04340 1C1293F6F43CB16951E98ABCB0F13453E7FF596D74ADAFA6963FDEB8799AD7AD DE840D9B5D72434C63B9AC23022DC7FC12E5584CBF50D5126B5ED261A7B902DE 03E3F70286695BBAAC58C287394AB842A9369F53880B8C62B488A856B6AFBA27 94F6995A0441465CE67C7F731206F1AD21DF21962E15BE4CE891D0E697A340DB CF9C66402D23156F2A59389F94D2D142279E19DD4A109A15B1F2E1FDD4006F17 D5979FCA143DA1EDF807C64F23A67700B4AAE73FF832A36952C1BFBB71C5B7B5 B898D0D6C969C2E4776DD24DD3EF0235E14156EB8D030B43E89D3F8758D8F986 0B648A21945224F7587B00A9ADE56A323ACD3B429C355F28F42DCB205D257E62 A8E3F37DA105FEF44EE5195E3470755EB69049AF635AE07606256D05BECE94BF 1234E21AF93FBF1AA0CC6B658DDAA584936102AC68E82652CD33DCFB940997A9 FA7AB20C57032A6CDE19CEC7C6A10907F6CD1276E5B29C96C54A5EFFBA3BC227 B76FF8F104B801178DEE64532565525676DE377F66EF013CA22FF6A4C68B6E6E F40ED1E230204A395CC32B02AB305638D30291292218C029ADF677DCA64B6B32 E75F37927B961948E2036C9E7F162950817B532B86BA713579A5AFE317099D3E 77178D7EB0D16CCF6373D7CCB46ECA946FACD83B4D9A0E5D721CBD1E89304697 5A4B69662554E158C97EA9835018CFA9A68FC5D6C438F700C64926F185EE6150 7C23C7A903776F291423D14382BAD1059ABF8325F7E29ABF2D7439EFEF912E7C 7805305E1A4ED9D8F5FEE99F89086391F36B340FCBDE79EF8763E5F267C5C596 8A66D440E85922E051F8A54126F43B8F23C58D20F06971B85BC9300D4DB4496C 2257C3C0C03C8C3BD9E8EDA19CD7817DC5F5B6345F9506EF128DCA18B8D75CCD 5B7F793F76832AE7F5AB9EB6A6D2FB04DDA6151158F108D71523F8F3B098FDEA ED9616B4C221BBC639FDD5895D683789EC8C9DD48BC5EE211C74D407CC5E1D39 09FD2721D6E2A8007F678717E5ACA78553DC66AEFEAC17ACC42AAD6F6E1132F6 5EAC2E1CA3474A42983908EA6C268FFC0BAFF8452481BD11C0B8E919EA5B9EAD B5FAD1B3CF6411407B9A401ABE97A4119F8ABCCA9A470A830C084EC19328ECF8 A0BAC70BAEF0410D7E2C0B13AFA8C2EBE9BC1D879DD44B452E89ADE9B7F2D784 C398AFA4F2443699A6C69D9F89FF0A0E3A6A65603AF129BE8ECDFE915E2A77C2 22655E67EF3B2B0178EE8391439A9DB1F9E86DFDE676E8C5AE8F5C5023A9F1B0 EF1790D0F25EBE71D31D00333D6436C59D4625B029DA46DCA79286A9AFF3D4CE 9E20905FDAB4858438EEF30009D0D47802D7E18084D4C14BD0C79F0674B5D9A5 10904DDFE2F789EA35C13D00799B1E172B23B278E9AE905D535528235D0D96B4 1273C16EA91444AC89E711430B18793F0C74AF67F0305606E4DF6C87A7B0CEBC 56A4BFB53D75DC7E2B03020F01DD96941DAD475679242B73B9055ED05073CE5C F1B7495EBF636B6DB36D60E52702E82878B06DB5B008CB2ADC2FB82127BEDC14 40D3337FE0810FA66EDCAF7DFFEAB4693516B31DDBDCA3B4D45694A8A3E2A936 A5C7C9D242F53C285E47F694F5BDC498FE56ABCBA4F03CC7FA82C3AD477DB266 48A8C598F2E0B9CE9CE5BBBC89F937E488C1410D545C2C849CE6763494957F62 4EC05AF5F41F2559128F33FFC406E3B152C0A979D6EE19E2A739 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.0: CMTI10 003.002 %%Title: CMTI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup /UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTI10 def /FontBBox {-35 -250 1124 750 }readonly def /UniqueID 5000828 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTI10.) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 65 /A put dup 72 /H put dup 97 /a put dup 98 /b put dup 101 /e put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 111 /o put dup 115 /s put dup 116 /t put dup 118 /v put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E 2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD 8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2 7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC 32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09 482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF 118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381 1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA 8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4 61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20 C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504 3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70 9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0 125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8 34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A 30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9 39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49 9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184 2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF 0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348 3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D 9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757 802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28 FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0 98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9 5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93 5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815 DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37 4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC 8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362 E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F 42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96 3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59 A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F 7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4 49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428 D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C 0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955 CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485 1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB 8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388 6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468 83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29 60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284 42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2 1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A 21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA 206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9 D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7 7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B 55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4 6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762 4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392 871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E 9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645 DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5 41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8 2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F 220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001 A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D 981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F 337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8 139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B 1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC 100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A 1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905 F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB 72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7 A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D 310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928 7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989 1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2 8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33 80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610 3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996 4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB 865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B 301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48 3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9 1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29 0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0 30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E 2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0 C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89 14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A 44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654 DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34 9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87 4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3 2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676 21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26 47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4 F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9 D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F 03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5 886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8 352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD 9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0 9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3 92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F 821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93 3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0 47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0 F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B 9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1 AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71 C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978 B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E 81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038 970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C 6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7 97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668 A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594 971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96 514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7 8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C 392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170 3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F 464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053 911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6 261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA 147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516 C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB 61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3 F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C 2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C 7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193 11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C 9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66 C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3 1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692 5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5 6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0 EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23 AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D 8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94 376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6 B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B 02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56 4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF 9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD 751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198 3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A 40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962 2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360 D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A 0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E 8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946 AFFD0B2B724EF0F28393F3CB6A4DCBBA655E3D6E27F87E6D8BE12A15D35E1E75 D36532B9C5000C06A58822444593A1038EEB23C7AFC9EEE3907DF8232322B09B 230015E014F1B4CEB866234266440AD3686E30ABD086CF9C0926E711F0757925 5DEB3D39C8E6D6F0C05A364A0DBF90F6E32CD28887F7E237E04093E07A94C973 462254BC1B1586AAC29FC7F15A80FB5993ED22E79A0FB5BF0F7362CFA24BB2F3 D4EF7D39E1902C53053C27E2AA49C4DE54A05AFB1AA6C7CCFBD9F72150DE259A BEBFCA5C7E828BE667E9C72222B84C4C79C2DEB885A69861DDB635B02814BAAD 9672A14E50D6A2A236AB35C6DCBFA1165F47F8F52B0787EB4B70BFE3CAA8B511 A630E8148A51C1394C7C321156CF52EE7BFE07B6C354CB65782464D2BE42C0D8 14EAFBE88DA3D5C90614F22E02626ABD343F3AC0A9698AE84CB97F1CC421D34F 98B69FF4C335B95F4222A8BAB77662B4A57A4B574265A679334D5EBCB073FF69 66BD9322B1C2253AE85AB38889B26761BA509C7F638C6CBC4BBCDBBBF4BFE1AE 855973129978F707C87462B67509FE6EEFB5E0949674C34768F001827F12F1BA 77AE866711077C30DC0E40C2D8A6EF4D85355E596E26B675E8D223D4E55C3580 5B79260E90985DA5E5B2F43DE7713D5E67080D2843D44A3585E078615BEA476C 88233D241D3A427F9B1AD26ECD535E46C137084A835CD816CCA936D0011C53E7 B33D5B50ED7BF3F41289F48E394BDC963EB1AFD6F14F0C146E0F13B03E76B389 8AD8E81E41F14D1682A113D8BA1482D9DDFDE71208AFC351B62E028C3D50BE01 FC9CD5D5F36E28DADB469201F41E9F39098B65E43FD1227A26F6FF812CE452F8 B5476C28FC1B1B3E5FEF3A3B94CD552E29288AB0A3ABCEAAEACBD2D5E9001579 738029B0E7F635C6C4962340187558084D9CD408EF7FDCE23F465AFCAA8EAAC4 8855BF64EC9BC75371A98095CB51BE7FF107E4C6C21079571957B2AC35ABF77E 9DCBD599C549D3B40A36AB846859C7BD9F87A2FBC724621FC7B305F02742A66E F2BBB6B21671FF62D682982C4E8F6645EA4A7D875E03774474BD86F76AFD4053 61E9AF3C9B374D730501BE61106AFFF8A463406722AD2C14D1A81C08C2A31E60 42DBCDBFFE4056E6AEF59CA261835523196A8921D1BE0013F8B3D6F05793FD18 3E767E98289DA6CA9DC9E2EF9E697998D2367E45AA87B3E75A57F64021FAB21A A480FE7095000C29AB92E6D299B2E5EA7AE1997A6B23E1F90549334F62417196 89BF7E9F62484C2816CF5FC2ECB7DEFBB11E63D70CA13D96BF3DB3B95F39A41D 2E0C84ABD2FFD86525323ACE4A85A8944601CEE9D157445312EE9EB81873DD63 A1BF3256BD697289C32D8598046EF6F6646629A7C29D5B1C5855CDB95882C2D7 73536D20BEEF480B4213C0F02826D89B76300F6BF3ECC9C1DF3AA2C91CBF7D8C 2862CB42FE32A3715855D8B7B30FF83EAD80181F8034395A1ECCCE5CFA774F02 A5CFE926BDB880ECDCF487E84154C438670EFCC3DD358ADB45B39F99B832C9E9 4C3F932723A8E21794BC1C1E95DEC7CD470CFC0B19A3AB34101F34D43F491172 3D27D30408F749B31BDB96A42FA469C5D5B606F880D67F16B316CBB5CDF19779 88257A0ACAEF3BAE54A987FEFF5E808B3F760D2E77076FFCA9F880EFFFC076C9 A52A8351C9858B1FB562AEA60FE8D250BD58A794362FF481EDC256C2B32A60DC AF873CF9D79161D3E2AEC754C250257295367ED5506A8B98DD5CD77CAE4B68A8 416C1C25F566C2E8BE5B0AA4980C64B36FFCF6241B4EB773D760675EDF204981 8BDF4EBD514B503D98D5C6B793E87ABFB617DD0B756B1EF0D11E2D46415A5074 D3710CE4E3387A003C3BA355DA31EFD1B2A14DACB5365186FFB59D8CF3180E1A 793372A551AAEF3EFFB6CE34554159992662B7417404AEC1040C6283BCF89755 17B60527663A5973AB08B4377BAB3234819777080FCD2A27A8C7608725200F5E 066929D57C4183242FD92B2A1297558B2498EE9317D29E58BDE5F90244D706CA 468ADBF8E871D90D632DD8910C5CDA89C527B2B8235DAE8FE1097705237CA04C 40812D525FF7376A895A3F79C116E4637A8E7E501CE8AE617538AD5FC760A52C EADC46451F5AE88B7758D997BC23CBD47DCD6508AF393F4642766F69D71B7B51 6E2FF498B12C6D790339A022CE4889D550A12159D62C0E59110E7538EFBFADD0 8B5173C3FA3C88F6B835C5FDF30CFF6C7092D70F627550AAFF8402A954A06FD8 565208110C5B89D1FF9C7DAF9515050BF7C3888F9222CB7A9E83276C26E59A10 F9E18DE707BEBFAEEA7D87EE3501E8177E4567D5DED23552534B7E06BD937DE8 D3BE8E40B28FB7E496C455D7CAAA066BF81A60C78C282C483D12002522660628 B579B6A94CD282F6FD210A491E0D3F8AC3891F155EF6BDAE74185727DD4A057F D9F2D4C25458CDBB169D7949CD887EBC6491B3C87B8CC2B48AAA5DEF3FD4282E AC9F00447455F068F0564BB768E2451551732D7C9225EB4678B8A5CAA03499CF 4FF1FF21BFF42CFF98E46D870B93FFD31967B1B246E8CD28C7628FF6AEACB176 631A1BE9FE4CC84386B748DC80EE107D882A88BFE45DD76D7147BEF50979FD8E 4B0501BAB84C6B6C72A4EBB8B098ECBC56AC21F279EFF74B0E36E99FD9D3651E 7034A0C05589D2F424627C94D01AE4E4549415557B3A8BE2BAFE5AA8EBC99845 E499E95B091E676111C97FFB28B4139AEA07F0E9EE25DA786195517EB9F30A60 4D7358620936D7D5475230E3A457BE2D7861C4B9E9B3293B61068165DE40F23E 580E99CDB1A2C435B4B9DBCD5037C2C8F8720DAF978FDF542E5FC9D143020AE5 829317DFBAF837DCB81B0BA86921E35BA59ACB08597B2AAA10F9C5F034702A87 AFB986A0B33E77AD4F77A62A91909E3C0A72FD7A4FA376000C10E6A48FFDE368 29F41F033D52EC91BE44B569DE10297D93E4AB07F7B72D960DECB4261B5328CB CA83CAD12ABBB20015E53B34B9209C57CE4DC7F23ECDE9E8CD34D6AC67B17EA9 5AC7C4C8F6893BC25D7E93596FDAFDDBBA52137C2E1F602E904D85E60892DA48 4F6FB853628A84A666151C5AF6B8DB9967C8E20103C4322751030B3BA990FF94 D29CF05BBEEA60B493F09E28315A150BA79989ECE2F6B97E70FEA002511A5F7F 9EC05A6C3A3D9A70DE3ABDE13469CFFBDA1CC6A5B97F4C717A06D6D3A7DFAA8C E02171DC577EAC462DFA095EB790BD04FEB10A28A32883723DA9FA8FE1D5E14B 7E4A7C0B737A4E4292EE8D1EFE4D26C7062865C39552F26580C286232B5DADE8 4DFEFD113EF71EF6C4F7BBE1BFFBE238D69E52EC71126C4D74BEFA5EAAAC527B 0D7F2C0B7997C51909709D3CDD5B3E8C3DFE98EB18A22F967BCB97046EA33807 1F08333908B13AC8A57E535E99B30941B37349B61FE82EF6132CE801B6EBDD32 9E2C8ACDC2F441427BE0C61AAB575B563D6E8D82C8C5B3BE5081FF91792C872D E3CB12D14F31B65C3B4D955BA56774D01C4115894CE47896D6543E8FA05E8EC1 816615BF92F280070333D78DE65F22CA87F2C1AAFA3B10BC2DA372555379451A C40B4FA1AA8473D057EF6DB40240ECFA8FDE12B4B74D478A59779CDAD150BA26 970EC286350A272AA8EB1D5BAD4A44A8F9A2038973361C82043E76ECE73CD521 2EBE254DC01F4A583A6227254C21BFA6065E0B30350AB5CD2ED8302DD0B8F50E 36FF5ECB766EF101995B06E18572165F2F57F50D9B3E2ADD98617B9E6603585E 5B56FDCBC1BDC617684A6EEC01143F775A6C6C66A83C5FB3C9CFBB430E0B6162 92E5E1089A503737A7E9B216CAE9BE5EE21BB5E70DBA9CFA8BC885FAE09A9446 02959E6F007BBEB3583B1B41F8368DC3CD932AE02F65615C00B9D5CD5A1B8DC8 D8C6F06965C096246D8ACB3A82F1F6CA8FEF2FF2922EC1AB96CED55F6E04B9D7 4BB532309BC6D6D1DD76D259C4B90AD9BD0F13A505F0B6D566B719DFF15F1A89 B5896552BF04DB4AA90BA89F5491618A6D7A12458F64590C7C9B332DFEE8ADB1 FF9EC12F85E00E10B50F84A2C374C6A8FF2E719F989263CE017468FE5D9223D6 C8722820D41A716929E4A28FF0B0558B0932DDDDB744DB0BDA7BAE7E1E9B9EDD 8FD793077D5541EF161094DC5B36731DFFFE9D4A19752219DC88C63116C7EDDA 3AD5A84A1B17CA161EAC54EDCBA87F4032A60EE9896374D4598B2EA2D927BF4E D8C10A3B06D86659639D22C26408A548519CA477D8A928527DCD3B26C607EFA1 4C14ADA3E9540629B876A643A7E6EF47FCA93A0DED6F79B7AA1C9E4E965861E9 29FD61AE1826326D50955EB65A21013FF27B83800FC04E6574AD9075014AA7AA C6034DBAC49AB86F9A00BE7CD0020285141E063781A11755BC7B9F1AC4B784B4 C14607B78E84A307DADC704476D46E19D0E05313F86CA226343660F9988EE9FA 9CE63D924BE001D2D7A5FD0AD586BDA16D73BEA8CD5127304C6705FA4C964E36 B7F09227DF501F549A060E4BDA33F5C8A12045B1845E7F1FE23669639BF366C8 F1D1907FC411125FCF67CF24797659E72CC0920E8DD0F5F3D12F6EB9AF660D5B 55E8F7A6142682901A9F02B7300D821BE0120546590390AE97A6BCF912517D91 A5C8825D91F4E25DF592E07DD461F3819966DF72A8539936999539DB2403BA35 4D5CEAD25373E9939AB88473F56DF129E86830D512D0516A21A29AF2B4428FC2 67B2753C6EB4542DBAAC1EAD864BD57B807AC9933FE148CB0E94494D9CCB4BB3 13D5CD14F9D4CF54BF696166A9D7667978C32EAAC84ECC6179EF51AB1D5EA7CD CD5A3D7FD9FE6607C87C1884B043A26BCF2B83779E0623AE669F874B31C3DA24 7D25A3C59EAB130A823A219F815A0E95CA5AF116B1FE45C66946D06B10246A5F 57151C5DF785A15E0F997AA341A6B7DA61766C7A1A8FD52F21D98F21CEA45D4B C11C1B18A598C4955E822FC2D9742D6823D5221D0EEB5BFED3EDAD560B87B0E9 3415317FE435561CCB3A31B7BB315E9BDD0A01D9499F00BE81B7AC10F5F91AF5 BF5C6BA81EBB70BBDD7630E73F846F42AA4A74BE19F45CD4BA14E09CA09B66DF 24D2C7A85F535D0B4A6C2B244EC7146350F85874A325554F85E50F83CDE14B91 817D1DBC0C8AA8427E72A910B15598CC4390FE3C9F7CC8E6AB1B0398E343F786 65BEE304DA8843D11E33C84B591033F8E42DA8C5F4646F573DD3B6FB0E318D66 8C1CE279CC5EE7C8B8415AF1BFE8952C51B60AA59CD635FEDDC31B1AA6CDD4B7 4990EC1C77C14FDF94079287E643038A45072084F7CC6D6348E82CC0361A4738 AAA3729F5CF49744B37135E5731BFF7E5ECCC27889C5A7F5C874B6CA4F286E7C E8611D4A9A0EBA43386F8C6ADDFAEE8DDE417AD3665A6E98FE93031F81140F66 C5179D16A712B05FB0831D95EFEFCE2EDFA66641CFDD8D327EE9F779E5A81F76 24BE4B60FEC6159A2542CDE43A899FAA4C94A876C9FC4482BAAA7AF9961F0943 FF5FD700F0E80D82E7404D7E105CD76F81EE26BE0EC4578A1E13E5B90725E37B AF1B3CCAD2BE32A871CA884B9491BD553281B9F7F015904A183C75FA579683C1 5F6D11D3A19510426CC7A08FE2A07B604FC41B57A2927A7F3251BF993925A04A 6DCB9CCAD08959C3697537423F89F87287A5EBB7A5582DD1E2F8BD1C131C643E 8A2B38637EA2565314ECE40CF864E8BF8EE9166CBF5A0AB3F0D6DDDE2D630E60 FEDD3FEEC1254A373803C108DD58B881409443AE530BC44FA8DC3CD2EF1B46AF EC66EE2DD772716F364E9FB39CEA89543946F1A877ED6CC0E76E360A04A90A35 40538CE0C407CDC36D926CC626E0164E821236460729710D6B62B747555F2D4F 9328E9BE01A115298A5D7EDE95327A5767C9556EE77425EACF2FF5BB923AA4B4 386561ED0C923DE79ABE3E2ED475D136D19CB5296B7244AF380A196EF48BC30A 97128F7A965237FBD2C8D3F97CECE5513077427D9BCD8F89CC541A06E824648F A86D64BC088E4F0EB40D0C16B033EA8BF65BA31962915CB41B134713D6BC9167 86C3742931F9169F7376E7B5417F701364246C0FE3C8FC9B1D4916464A57F10D ED60673BA467D81549E75D8FE24D35BEB61758 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT9 %!PS-AdobeFont-1.0: CMTT9 003.002 %%Title: CMTT9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup /UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT9 def /FontBBox {-6 -233 542 698 }readonly def /UniqueID 5000831 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 70 /F put dup 71 /G put dup 73 /I put dup 76 /L put dup 78 /N put dup 80 /P put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 126 /asciitilde put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA 610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE 510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF 93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A 09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C 0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C 94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF 409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A 0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B 3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B 7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D 8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC 2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C 54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD 6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB 3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF 573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA 9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D 15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC 9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A 1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA 4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D 4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D 80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F 66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E 2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A 1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC 887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD 15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B 9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B 7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B 9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A 97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF 1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E 29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D 99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE 480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB 587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C 839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C 320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F 461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A 3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 097C4995B60BF4D8B3AFD0A002B3A6E4FA114131410D5658999B86DFDD3005F3 AED1FA8F077AD1F27EA249221585703F20FB70E37A26C6C3F2E101693C94612B 65BF89F37AA3C10A40EE8E49915F1A1B95D2193D8003DECEF9D76FDAA33B1AA9 CEDCB21C2A3B05747FB3ABDBD904B66EEC60CED2867442F5FE445587EB8C6D14 87A6B1B4871A8371A7ECA6A159EAB295B167CC35ADEB8512FD0C237421773BE8 A081FB687F9C5D676F2944DE6E6B639C37E8E49BD4A6F0903E0C31EAFC4C7ED2 C3C67E71D8BE2B8D5784E8A6F19A9A8929DF9833440E160945274682F435DFAC 575048CC768BB8F13AA21C6B125E6073611BE138AE06D13E62E7EDE3D0239474 E040B3E446165FFE60E20B75D2A5F9EE021B22256621C290A8F3342F0347B8EC CFA6AD68D47C05268EE3AC8683F4840D736EAB585C6284018DC94FC103B4A882 ADAEFB625EA966F3877B3FFEA518B809A4BD1A235EBC85F2CE733276B50ED38C FADC175CBCC8AA93FE3CDF2CE4DB85E1D0E5068ED5F4AFF0E009297DA670821C 2D14046BA81DFECF132E8FE3971B183955048D8089E90B74F5C9196EE7E95D2B 4861367FA88A1AFE463B2C140EB1D3BB45DB2C87B40CDD06923A624F7A018380 52DD919411CA2D045B545207216D44A9DF10F8659CB96D10FA84BE4B68D59694 C0A77BDC398A7AC55F6B9BA8EA3C21980165F9ADC6ED4A3FBD9E2E67C4DF386A 0BC08ED1F787EDA1B43BFC184D14141C06B8DEB5BF119C20BAA66D3B98435FA9 E2061A04559501ABDD6CBB0B2BEB36079E343B7B81DD9B4A13ED01F3D417E939 F0D2776CD571A1D655D7C6D8B1CD52FA5BE607D806692759FF1D59F5AE1B368D 1B4CB269B758501D98433662D89BE505B0C1A498B33CA161CE79335DD52B2C50 8296F2FE721C608BD91C431DCF663B3F0E0625B53AC42F56993B118949005528 15E7F4EFC2C0879CB6FAC1F73A5F8FA0CABB2802AD49FC7A60B298C4C883E0B1 74CE1B0426D0341A4231DEC4BD4AA892618E4B58158DF736BB394FA179C344E8 07D5969FB2F1215478A5CC6EE68F39A667BFCC91E3A5DAEEE8EC28F627F5CEB3 4817498AA79C611B1A7B6F86AEA9E2752DB7FC86F304A052FC938ED9EF606256 A70713A9F09F52E54D770DEC529AF0AF1EDEE210F56508DFCE5F20DD4F3E70C0 88C3E49CD8D7CF9FB27D58A2726FABB8E1A9C2DB0AA2B4E2921F2878D9B56D36 7C320FAB9EAAF8EA2844CB3A0B79A7504BBF5BA6392496284913CB17B1A82E31 6739497A7906522ECB2A9BB9EB24EF9CDEEA3EC4DD1C722468DBB47237C29279 E6D6093A9A6893593137670F1C9078AEDA0EEB3CFFFF2CF0AFD5399124BAE2BF 93ADB927C1C07C67B1E1BAE0730A8D50CDBDA122EC8CFD01B1F53EF3253AA8AE 178689BE06AB1123B0E7E2B00C53DF9788B4E54A0BC750430AABC5390385B6B4 275F95B6728EEDFA5A0EE32A03C6DBAF9D6E00BFE122AE50916520D6B8C434FF BD2470BD8E06B1F406314FC1D857FE98026DC8C632ACBE6296F03DC6A330F4DB 2D40F29F1DCA36F7555E289A56ABDD97A7DDA7BAB81E5787095ACA9E34C4A2A8 93BFED640C7D283ABAD52B08311B84957139C2087C99E47F2E39CF26490EB81D 3877EACFD0D34CF2CA6F37FC05B794912AABBF178C72F13274DE318C3230C851 098F6DEDE4241C7F6D0E36CF0EAE91D77AB887A718CAC81D02FBF0C29E16618A 6847EB06B148416ADDE14DB1462E4F98ED22C2685740652C1F2DCBF4B8BE54CB A146A79E8ACA1925B281BF0A28843E70B4932DA1AA5BF038DF04CFEC37582ED5 64ADE0C72BCDDFED04E9EE6096C2CBB6EED95EF2D240AFA00636FAB0CFC9A9D6 3C01386838AB813EFA50A595311087CBF3573A20A9C46B022B4480DF6EDCAFFA 12FB36D17A7654CD9079AD9E574CAAED8DE1946AEC7FB98479CEFDB790588725 1E0A48F5CDDB970F1B71C6C451CD44CD6ED4BFDD3FF1F9BA0DC7CE3639A7BD76 20C6208445AE0A0ACC0895C02C9F5CC13801FFB904AC530879D37AE143CC9CE4 14A8EF8431945E3954D4AC66114A91BD465D38A36D20EF1525E12B45DED07790 E87D13D7D72272006CD5CF917032009FCAECB1D4EC3755DD496EB35CCD5BD94A 174875DD49C8DBBE534B978FE79BDE0A75D181FA6EF1E92B1C8E287CDD99B7A2 9536C7D21BBA7DDD6C888D4C19C02CF0999002558665A03D617553D5C57CB1D1 568F5104F9701276720CF3E31424618215927F38CAADF67ECEDFD413BD0A353A 827C038645E41BEF5D21D7B623C5FD66AD647872FDCC3E11670DA58ECA799458 891D2EC4E6D29B8D66D51A9FFF22BE8F19DB5729B9FAF402A77313BCB9079B73 DA734F08ACFAF112FA972A64258C8B31F60FC251505825615723D9497286C4EB 3EE1FB4E3367DE4D0342FEF4CFB8C8CF5B0FF7168006B08C52BD93F3296AB472 3CD5A33CB72D14E3838035848916E41E8FF264386933461E36008A5F72810C43 5BCEF7CBADF5B8FECBC2C46D73A728F54F8322BD2F9298ED4E6E686E64E7FC51 FAB7CD25B1083FDCDA21835F0BF187184500F6F4225CBCEA1D35C3FC2151901D BB9E5AAE9C73FDBAF5476E2897E65FBF4116FEAB83A88D6F4834570B87206730 6E6CF955C6F90995E189EC9A476BB2F6513765A02121F139256546A683BD2F5E 22A56FDE9A02BE50D70A1DB544A2D329B2F418E5F414F8B42584E303E3FF5910 BE34682BD956F257CFBE7691EF68F0E4A8E3D6D897D91F7EE2933E1B7E9AEC2E 1CCBC984D3469DF8F7A32CC148F4D7D57463C5B42F4A34C779DD678F87949417 FE623AAD49EE1BD8D699A451020130C0503C4DBC8CC3A7668F4CB9B5C9105785 DC7B085956E20544BF602CBDC6C4F2F5FBDB559CA2CB2E74F65A87E9C76E5357 C4B98519CEC254974A06477433DF057631F278EF4FF060C99923FFC1B4913E48 853358FE0EF4A1A803BC172DA0F1A26092325E3A559723FA8E15F7332C0DB300 060C1B520CEFFFBEDE99FEEB792201EA5327277E68DBC95EC26414D4D6094CE4 6AC43464367F1BD9525E759E67524F97405EFBDD75D4010D8292F279DBD506B8 A0DA59E5B303DB6AD332349B4391BC08FE9A9DD627B19F1B37EDB6D588E5DFEA BC613371FEB92965E8DDD50E687C323057725969D808B28042F1E254D9FCE1E0 6CE61FF9E1C141F73AE7C7050E2ADDDC3EB8356B9DCB77872C6E7D58182F779C BA7929DF3D3FC4B0024114DBC1D9BFADFBE886170B7D537A9603A214B4DEF60A 5258FFAE6706999925F8758D35EF6C068E7D5BFC101E5E0FD1331D599128F8F1 E0B8E738A70733DB7AA385CA883510965648F6FB15FAE6E9B736A74398CD060C 992B144F8CDB5607670A26DB1F7F5DCB56A868356F838D7B70C063E067B261A5 69A2FB96CDCD38C0A568DD0A127F7F4E364DD7664006F74A553CD5EB87294294 4549B8A1B4FE7A1CE4A609A3C1891519EB7ED9B18E89B85A049BED77F02C3174 863506A0EFCA4DE69FD84E20C540134F5CC9429386CFAC0164D15A55C4B9F7AA B7BD4CFB755BD1A10DCF48A3AAABC9010485B5B2DF85DCF4D45AB55F452EDB92 6EC8CC9BFFE3E94BFD317D9E2E11A6823225084A941F31E34BB001102BC5C030 6B959F5ECAFE507AEBC4B43B3CF78E0AE14D080AE076CAE046A2A741FEE869FE 082AB637F9B558603360910B1730CC298A02181D8D129905B3D123516615A436 4C0FCB31D524A7E7D4EC9B4407522AF6D7340AC8ECC389014124A7C30F258D43 662D1AFF0B202CA85A273C7C1D20F1CB0E032FA0793789F07A5008CAC6070975 D78F40F95F5494179121CA3C4875620B0BB77D94F842556FC6517B30798C82EE C8C290AE975992FB63964505F86476B1C1EB516E03654995FB0319CD851D75F1 1807A16C4DD756D28435CF7F65F8A056C2C888A6A78F3B6932F7F2BADC75FAA4 307D8890507E496CF29B9F81E35B83B9C3C8967CA4149AB684C0B9D6E14B783F 520EF1390747774682FA9DD0D3756E1DE7FC0789C3E7D25820E8FC24BCD96C75 2471B784F7D243A4A44FD1024B131C04B97FED28363B37D21C334B3AC6663B77 40BBFDDAEB487E958F3317BC8BC4CA46A73F76D92623FE29D574837A05A7C631 3EDC2F49CC9CE06F70494D52914F040EA59ABB085AAA94D49080B2EBE0B22EDD 8AE4599C8B51222CD71F946AC0BB1EB7FCFF5A2BACC6214561722A3BF32E88E2 B1BD759B4CA14D2354B984D621B5DFB884F3618BFED2722B82A3F0CE22B4E853 B96F20225B4F4FD00CBD80C9C5B4FE61472451DF7D091D73BE2F36732B6AD4EF 3A462D2683DC43EA671B88B4D800CD407D2A12ECEC342297E4E69C3E8469D974 80FA2A14FCEE47BD35ED9B363CD833856A7F629D79253BACDB8A8FD7D6B209AE 117F1B17332C661AD728D71A3C284890EFF81574282E67A4EC9981C052499345 50C05BF2AD084084B0AFFA5CAF7E7695F554069CCA8B912FB9A9418E9CB1B031 7E0B376BD4642C5C57BC28FD243F56374AA3F04B30DD7B0AB0B1AEF1AC08D16D 0B36864D1C096895A36B6F72C42679596DACE15DCE4FDD5A85E5EC68AAC18FD7 9059E47903B8C5CC992883ED235B7567E145CB7A74E701E5F2FF75A41BE4E9EE FA4967CF76BC8965FED497B2AD16EB33D79621DC62C5009FD75EE1BE3307BADD 97ED47F42DFE52209DA56C2CC89D213E013F803031A5A74AD8A86BDFC792B682 EE29AB2A8813491FF27FCF565E82196F2DEBFBE07A66CC6A661B469493C2E932 A626C7ACCE03715FB87D2B6D4A6709A42CF444542AF65EB422B74E53F3147921 086B61C020836C5C1CBDB02BB87409B3564DCDE20ECCE8A2251C3583504F44BF F3940DE1D665E0732F5F346467C403F949045FCCB93DD789619909A6BEF354FD BCD5C9A79954FA801233C9771D94584AAD0E8F4FD7B80263DE4056F1C3028574 478FFBDD35BEA46C50EA0B2FCE53B1C2F4576F16433E66C3DB44A656FF5BC6F0 BFB1FE1B3DA220255C354B3FF4FC7E0425C996D81139B0A4AA155E5FCAB24BF5 A0DE982974CAF1F259997E3F5AE47589175F8C2C2EB408ECABA26D0594077A9C 0F16A42FCE3D09CEED59F415054B9E6248DD987B886BEA49832B5D38820C6950 A8B389A4A075E4EC0B32088EA0EC67052836932EEB3D35FE8F53E06A76E6E311 226360AFE23D328EA6EBAB4D151A0219FBA2FB461225A07FF1AA4C8C77EDF169 AABFB31F609973B436BF7370758E64A06C0162C46F4875EF59D64FB30241FFFA AC15B5570E8502176FFD982A92B16287983E9B5B2EC1A00DD79E71C527867B0C 20D9B24A06469691ED1583F0DE83EC0BD9DEF7441BB081B00B7641B1ECA340C1 296A8DE617E0AF1356775926764629E92CDB5D831C8E149AC638659754472380 66F4A9F6E14B4ADA596D144110C38C8411C524D2CB2CD65B0ECEDC6C18449D27 FF4E3F3231B7105D15F27ED58599E79B5EC8B80EE75089C5DFCC5E467B1EEE8E 0A35D90B85BF4A64C965EB516BCE4F54E615B2A51CE176FDF9CCC35ABD05642B 30407926BFF4478A86936614F026ED995C10850F3C48CC441606380E679953E5 5D3DDD594B1351B3AC79055A14E1A2056144BCA237D8A5BDD558ED04B395DC76 6AEE5B0777979A38DC7971FBC3399797AB48E7193E1A6FB90579380A7DAD4A65 39ACDBF9B3AE46AF4A989DB87DB2C0ED358F548B88DCA3BCFA133A95FB2EB2C5 0F9901B40567C9E6E9657FEF101F9E2A5E63FD9120F1D5CA3E1A448404F92E57 46EE0A5232202C7F74C38A55539BE703C5E1CEE2262F98B9397453060FBDEA60 07B7815F339CF1BEBEAC9964191C947E93F6CCC21D9960124C616144AB3D21B3 A4997BBA7EA2C4FE22684BB36AA999654DAD463256D04B928D274DDAAE970FCA FA63AE97F080B73C6E6A6F14A049B88F427301A1B93E81C335AE929F6B97C792 751DD1720380BF14DE59D1A8B9BCAD7FA63CC11ECD2C9AF4EAC64F7451C0B6E2 2D60D7F14A14FF3D46CEEBD89467B8367E86587846469B8782A3453445021AD8 0CFF2937C293A0977757147E66F92DC5B0A68B28B6E12DE2218C932C5206C8D5 0173C2D03575F01594429DD667AC46AF509AC5CB07F1C948688915667A46B107 C6C1EB69FDDC712DF53C77C5072809B28153DA5DEBE336F516D580CA52331FB8 5EF840B57421B9B56CB3F6312D5C337AD2F5297086A3C54532B07F88AA928F28 DCFE0C88FDE0235124956E1DF360546B13B229F0D38E840D1505A38FBAF9BBC1 8C09A6FDFAE808A652FFD18B49FE934186AD6F605A99948A022D4BDC1F37B003 5178ECAA7B76260CCDCAE2A1713431D6E870952E0CC18B9323EE4C860FCC08CB C2D303BC8D28A79575D6F276F423E7C6CB949680D52B436BCE371D8621294B74 336F524B762348B1F4B0D83111BF4B14B9289B8F8D0E7C90DB0BB3E4D0DD1641 D1A9649AB1E0A1482CC33CF0378899BC8068265D291BA900E7328A8B4B38A0CD 3345A12FE30A355EF49460DA43D0223E92477CD75DF9DF0C2623224A6AB897F6 AADC225EEF97CFFCA14E16C3CFE247BCFCEA21FB89065ED91425DC1E64D0BCA2 929361864B537C535F73370BEFE9A80BC846A38E0ED652663FBA2C18E8D4E8EE 5EC9721360BBB5C3612487455EF911286BDFEDCC36CC1BB75525826B38F99C64 FD0B51B6B2C886AD57B23345BFDFB7A8A0FD2A0100C665CD7DB84561C2097C66 6279A8B0247514438D66E7A8019BBD2A3A47C76623E087E1850D86DA97309E17 4C17EC8B0752C340D54B9047B337CDD4B7245299761F9D0747821A850E224F55 7C21B83203756E8AB367C0850882B393F153014D444E9EFBAD3D907AF2D86CE1 44FA5BFF426208A62866CFF3F6D37596B52526FC6BE58A7CA90B3DAB4732BE0F CB9BFF906220F56A05D53A9462680E26B946D98825C91BA80CA221E10224C40E DB61D26BDC83D71822AFC751C8E284162E34C30E773319988A341FD79DC83FB6 D34AEF1622F11BD95480318CB0CF958BB0D775169EE3FA3818F4F63141A484F5 B8A28BAD7318CA7CA49E112B3437158BCC8F61B6DAE2AC4D44C442276A8E94B5 686A0952E600EAF7A508092472D660BF780C32C9BA221BDDD8400BE4B637479A 1D6063A7FEAEA949CA974819D7BFD45242B98ADD66C602E13DA5078FAD86AA78 E8CAFD65B60772B4A78E265643F7420B1906B47B81C60EA15F3FC49F949BBB29 DED987C4D98908EB4392947FFF8A25B30A1380FD0ED0AF5A924EA90EA0296D9C 2D5036124D7B4054DD4FED1E3767581AC06F3BD551DC881CA2275040C92B5D9F EEB7C87681A25A3E573BC5E70718DA5883DC49AF0259ACB0DF94D8BF18EC8F32 675220ACF4ECF824EF4103BA9CF8AD4B402EBABA5F619A9A04A21C52DE2861AE 49DF4B6BE46CCCF3DD4DC3136081229A450E35AEA448C84E78C71367AE01822B 03C4BE2314742E837C419D66F81A02BDF349FA121D459C4CAC362E5F10F96FA2 B8763DF67E4C3EA5D70E0A8B1D4BF4FD20ACFE3FB1A9BDE8859322D5CD34D5F0 4BF8A0CBC265D673ED6078B88E934280E73DA7DE17ACC764C74A01AA824C98CF C671E9365541ECE71937F24627C86D374A51A3C36576C46F8108241992AB8EC8 F319F4E83DABEC90520659D564892B7C20CE4881AB2FE2428A708AE89E9670B1 D4645710B99019636F4A1ECD6BCAFDA26D1177059CFFDFC5BD88FB08F2828B88 6F844BB522F47BBFFB083504BF108C41D4A53BF29D6AFFD015BD7CD9002F8E4E E2EFCC3F8F6577440C3C69B102969746AD37831A07BD1E9A810C75FCAB44782D 78543AAA9FE0BB70A470F1A7FBA52D4A33EC0BDE76F01325452B017977E3164A AACF3CCF7825D1F93F2F62EE93C185763012D5D754931DDC98E1DD46DD82F6C8 FEBC72DB71884C82142542EBA78867A209D634B2804E14D7B4115C3D70884F3F 6F382740C3E90703BFC10E6A26B975552682CF60BF0151C52DAA69C7F49E86DA CCBBC058B6D77FAD2C3D9D795472D89DD48C3C52FBEAD6262097BB9218842738 DA06A8037FD623585E5B5F9D897C253DA3E0B92EE5A397BE29694BA27B4CA6BA 885497FD317E401278E74974E6673CA73B0E19CA2D0F29AAD82EA4B0835AB6A0 50F3CC1E5D8A6DEE460A5B9FA38A5AA04DDCEFC6A1184EA1D81A19446FA73929 539FB7F8E16596689BF5A3D845CC1AFECB41189D72EEF3467887378EC5D06742 12C34EA5EB236E7638399F60FC565C98573E800EAE7A5F7F672A5C239672E2A9 699785B0DBE13465EF95CFD8D13BFBAF71563E3AA89B37CD8705B47BEA2FD098 E42981C3890714AA568C16D41263C10C6949876485819298981E35A5AC8AE7C3 78909CE631C9D4F2C20200FFB4325C5CE29E730E9D8D69412F413F34C40C11B5 A43BBE59755231FB79555D037D91D3B0956B0FBA42A74D34C1B3EEF57A862FF9 7BCD9D350D34607CEC02EE6A25345173E912AB9982140FBF2A3182156222E697 B4388EA99F611903AAD040EAE590FE9ED189352296AF6336F5D9E0A4BACB7B44 9D2967B5B1997AD2FE088FDC001BCBC6CC0BDE08942E1646A535FEB6E93EDBA1 A467F3638A089919FDF0089F70F3D9437CB9247B332E777E4D8DD0C7E6EEA0A7 CEFEC81F5C14056B5C2C6B3FC1B5A5CC11E2426FA5D500A350BD92003E1EFB14 DA131B87C8D2C44C12E232520C1B9A31945FA364857B5DCC518FB9250B807C2A D5D1DA5EADFDA6BA2BEBEAD55699BA68F981C3E48F7DA829AC7E104A57543B40 C7100A15078B6491A26AE2D65335BEF517CB7CE943D7F2EE173490FB89A10B9B 5C4355DCA4A6667BB22C8482A018FD821645963D58B70FBADD2A6DEF62C971FB 91E093BFF1F3A0E3243433420AF48F714594FE92BF1D333A9C8D8A6B18BF076F C6402E19DCB6684BEDCBBBBD47BBDBE100AC9CBC9962E2548A2468DFECF9F3B6 D76BB2A71DC919DCCC76D96D135B201B59CFC96ADE567EA079771ABD9541C338 15696FAF7C19E8C2998A96FF7EE72069A5099B549C90E92E0363F0B5A76FF1AF AB07DEBA09C4D1A4FF1C2E37EAF7282D80BEE0AA540822E32B0FFF17A4C11F89 110156EED5E564FEE10708A0ACF68C5835AA37527C420BE22B268EE19D45C5D8 85C104E70228234483937A99B08C29F4C9DEE52CBD0851B8BC5DA5D6AE5DD3AA BB53D3BBB4EE7D9B3D97F0B0BE0F4EFD2809678FF87402ECF0624D14E4BF078D D85AEAFB23A43C98487918D42D14A7AC9FED884062E44A9FFA9773021524BF52 DC2ABBE0714164101A5BF6FFBE3B8A29D7DA1FCE6F0CBD0FFA4F091BAD9ED473 E46372DAB87F3E58F66D85712ABC355E622EE53A449B6A25CA7D222B4FD5C3A9 B8F1C8CCE36AAC6F1A9F9A90A28C45CB866FA9118486B9E5626E8C5A146C1FA7 5DDCE4D1C30D1844E7CE14DECF07A3D0BB7A4C181AFCA8555DB89EEAEAD72486 E1B9FEA6A56450E595D483DEC3187E6E02725FE1E6F0B3216035F6D76DCC280D 20EFC8A13B53BA895129552D2E663A688253CE8AAA7D5C8595472820E37F9316 8E9190CF5439431C5483189023985F840026A9A71F09FE29BF6267E32090AB9D 4051308BEA75DC3EF4E83982E089ACEEB31B4739A221438D28A167BFDF106771 D6ACDCDA32C07AEEDE9E17012C283C395C560C763176096E682EF583639D5E69 2DDE1357246503824CBD9EC1AEF66F2F8FDAE4C08D7CE05277E416B3A2594085 802EFB8FBD6FD2D9D13FC95043A8420A0E57B1349409917D1745450CEE657DEC 484BA397125489050FA8BCD2856D178877FAD7226A12E525EEF0C28A50B1CB40 83BA2F8DFEA1C76882DF0BC0A1BE48DC0FFC8BF5201C64132A5AD2BF19909A8A D850A8DC2858381BA56BCEF186350C555809A047EB62074B95C5335241885131 2A013118A005E952A54FE0E1FF0B09DF9FDDB572CE8CCBCB91FD4DFFC9BCA018 8AA522ADE25C846689ED57A0FC574322D94156727606C70098F23F53001D92DF F34FD76D510124D57F7162F14F0302C877EF4813C2009807ADAC0085634CA5D0 47A80C5B5FAC9DD931211F830C32B4EEDDD2B9980F427C81F16418E45E086CAD 762A367466DCC39DA7F3A2919C5BCFEBF215E69A46B8C173E3F4C2BCEE3D825E 5E3E87B2A697F2D5025E53BB566234E02E249D25CD0D2C5FC1618F8E2C75D746 0CE1AD89DC3FD1C57A67E4EFF64F23594E9F10304E080F23AA721AD68E8F9810 96A2BDC73453B7044AB2124249A584FC8F68F253F49E19B56975B2D426826AE9 A7CB2B0F1F102DB057DA8353015082A0A86AE191369BB95863379D248578A01B F42516F85DB57DEE2143B3403D31BC14B6A1BF0642F39DD1926BB66C9867E710 C1CD4BD3F70BD32560427840C1A787C0AE87BCF1965CD83CA72EAD7ADDE5ED88 BBE68AE344019E4E51A70B2C3C3C8FC633B3CAEC4EE42220C2BCE6C8A35EAC62 8D5899058128C8A6EF9C0BCC0A4A7BD28AC91AB573FA2598C7869CD1FC6D95CF 9DBC8C3486CF44DAA62CF914BC51646E907407F01BA087F66F1ACE9C2B8568CB 1F20E36143DA07BAE9C58A3112DF7D9992AEF60A35CC04A916798D682D4962AA 0EF3300D8ED4099D1F9AE0EC2A09DF15B9FD40EAADD9377D04DFE13629738D1C 1FF529C59D441A66BDE23845D623EE032413ECD7E888D9853E50A0521D43F663 DDEEFD3E34EC322282B60FE04952A2288E9FA968E69375B00F0ABEDE0A3906D3 CD612DE87933F5961FBF65EE9EB17158748837BDCBDC2DB7ACEB4EDAC02A7D14 8965AE7562BFD17FC6EE02D73836DCDBA5746B98DCD23099AD7F519DDD5B2AAE 139E082040311D7BF3D80D9CF8EF0F6224D1ADE69CF3FE31220160087B807146 D2C6D4535A7DA30D02DC53B040086F6843E9FCD240F4D7CA07DC6EAB3445EA29 7C110A2207D1A40C44B96C6F320571F92C554686A6E385D3325CAEEBDA299276 51D9AF819A490A586AEED9C11859D42938B62D1257737C47146BC68C4533FEB5 0454465C35590F134EDE8BAC195041BCBDA07C5B6CBA1DC65B45228E869FFD12 FC8C6E12DB84678DA1DF0D8A9EF8E68D47C699328FC9EADE58C6B1309AFBB268 B431FBF8ED4B50DFE59E7EA6B08C3DE318C410B4B5A74B7EA7D93486E9E6F234 45EC34B618DF01539EC27A564E91DBE54828050A925D1630FB9795DF04566C99 CCB6B141D02AD044C2980C93B7F7589F8D7059D63BD833453CBA91D42B53A98B 2D881575BD931672DFF377356AC24B60895D68460135B263A63887A2C7B9DEC1 79D29C392A29CEE543B379F6C0804AA5AE14D1BD1B01615805E8E1580531F8BF 6ACE6D8BD90410E0A3AC31D11C4B91A89FA1CA8707187A54EAB29F6A268AA696 5B54744FE17589B9A5FBE3C021C585398763DA502C639430B0A91D8739D7BFBB B6A5BA358AD4ADE570E1E9044C2B31C343011183A086A0D3BA7F0BAAF54018B6 8807E72D4781F8825150D56DDCB8911C3370DBD8D59C911D481BB50ED4D6D273 995C0EA2E63AC1CE02A974648ADF8D4E6BA92552599EB4BD393AFD7E34C63D34 DA02DF2EC9AE74560C32EE3BBDEDC1AC232AD8D9095C51A2DA2FD3852CC9F140 E0D0A48A9E8788E2C9FD1C72D0D2CDEB5CBC41416A3F5A22F6781D826D88131C 390CAC3B7179E98370151931FE8A2406BE97CECF18F5D8F99B879FD084AB8EE0 F3F039BC5DC1EF247CFCBECC2CF2FE7049C02829808BB9A8777A97EEED59819D 2CE56527B5D5250E43C7E5C3FE8F2FDD15FFF292761F529394983DC2BC91A665 C08B5B33731204E727ECD5F5 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR9 %!PS-AdobeFont-1.0: CMR9 003.002 %%Title: CMR9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup /UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR9 def /FontBBox {-39 -250 1036 750 }readonly def /UniqueID 5000792 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR9.) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 14 /ffi put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340 15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4 B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029 85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955 F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D 2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5 B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7 78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7 E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3 41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277 B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072 55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA 700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9 8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4 FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4 3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15 B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2 AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013 461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85 CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C 4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F 291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223 D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181 C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115 D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9 9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405 2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380 A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB 2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E 2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6 AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577 9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67 0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D 9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B 42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0 C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35 623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6 B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4 E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97 CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D 07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7 53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350 EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9 52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88 F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3 81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6 B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A 31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293 846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733 46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E 44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08 A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5 1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4 D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344 6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E 24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E 75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51 C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0 5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034 099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281 7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE 53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84 7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F 7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933 CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD 866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826 ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64 FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B 40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643 D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8 2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787 39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2 1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4 F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9 253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B 14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085 6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B 9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339 FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F 289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3 A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5 5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46 5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652 152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE 67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3 BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59 3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88 713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF 2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5 D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143 6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9 F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95 26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970 350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700 70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5 F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95 F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8 9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2 DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473 F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D 064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF 1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325 A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF 01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C 40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C 72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645 24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1 EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775 D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311 83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483 5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448 1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69 AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC 4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3 7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9 65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063 B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6 FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6 4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490 8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6 1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3 10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4 8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0 7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F 852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C 3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997 648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD 855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE 1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C 1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0 B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7 D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99 24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C 552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733 6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0 800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8 6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659 E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4 5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2 00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4 82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7 6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3 128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D 744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507 84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86 5D24AB1323A0BDCC0A8FCCAD408E091D37B62D3D1BF8537CFC619A78488DA0CF 87FF97E3181A579D373539E8AFF22856FD03F4C387BA307983EDE87FE0F320FF 41E45F60704B913C7381D84E98411045E4AC9FFDF8168FA2286D8C7EBF681EA8 787E7960CFCAF502B7A3066310BE7A1159A02F1BF2C5C11A3A9A52E01DE3E108 8ECF6C9F892370DE073A17C26D92487DC47818C92555B5FA22B8E2D726EBDC07 7B0E0DBF8060AEAD5106824D748D9C085BAC95E031069395B41D5BB131FCDAFB 5CB678DA317AA3082296487B40E1D4297E22905E096C47A26F4DF5975ED35156 F33D505FE3ED168177598CA0CE444A03F66032BD7D1C1ACA0EF9FC36C4C9CE25 C9B1F2420CF9A96365BAA62E2704F2C662090D58BB4E0B099DDB4EEBF8D05F97 A5CBC658236F5E4D62BAEFB5996AB9E8EC4F4F9AC53FF17CC7A87BF1B8EC4626 1C500327CCB89B0EB07A9F4903E0C5A5E7370D90B50C010286EB368B0503D038 A2EF77A39178507E41DBE433DF19D3F69A70793D051F813CD263B5DA690579AC 1789D2D4CA15488F73F1F01CA8FC188FA30CB08809D8228AAC5A10954A6E5471 F8D84AF40CBD5C92F789EB1742E17D5EF1F7212D71A06BD7091360023093F101 36EB44A8DE87A4A196B0140641000B445FD8F603A9A7F2C6F77EF6963811F7C9 15649EE1D81DC3E988A7A797D76DB89758A73428D690AAC6CAF6E216CA40F8C6 2E05352428D4C5BDF539C8E423815555A1051370EFB3A9606D3D58F46E7D0B97 CCA0C589D0E36D25CE3938B059FB0E2C8361014B57098F96088C5C98E7AF24CF F8A8308EA440CD67106B94310E4C81D9D739DF88C655165C148CA55C7A1E2F7E A6F673ED5F34F1C1D20B609A152EDECFA26875C005B5D3394AFC2E2FC73EC0D8 693A9561AD2C3F9B9E9C9325EA9497425941EC3A0CEF1A59E6669429B08600DA 86C38D78CFA1AE7634B2C0423F951E647B2AE424776519ABCB28AB77F98AE76A 2F70CC3FC78E82702743AB7022329C56ED8AE3BE873992E131DDC094E1E6E683 D2545B0E6044A8F3626CD111A9C0940AD0A7D86CE7038A74907C8E9A28945C73 CC08B2B5F0D608B7A4B741D9F35104F476DC5B7C9E09D0BA369B0502062B3ACA 061ACE401105AAFAB82C4AA821E8523BC287BAFD83AFA05B719CBFD536B82B6D A6E549A9FF74858C3DCC717457691AD5BAB068DFD9AC47F9426F7148BB8FA709 24316D211D3A0EA27C36EEA1E76C0BB1068594DC152E58825290920E6DDEA892 BE5622E1C421994E1338424D82156895529BDDBF81ED48361530BFB2C763E138 777FF1CA8846EF2343E735E9EB00E50971C1E7B50917CFD0E82E5F05D1F96031 216DB9AC8A26B00280FE57F64038938E7E48429061C48B21F9B051F6147B984B 193B34B606F5A5B8583654F891D0E7256870F71A8898783B772AFA05228231D0 69EDB2E2ADF1F8CD734ABE140A34004817B886A717BAF0239A5B8A0874412F72 C49ECA2EF65E34A8B9C3288D95EBA49A57783A51198028FF2CC674E022F6C6F9 91F40145A7A1313A8C12793F71E79A58BEF6ED7DDD3CD527317F3063086D8B67 46817FD31B267DD7B61DF90BED14A3164DA8B2883B0B2CA52A8B48F33D055173 A804F2704D9367231B9B797CD55E7D512BF3D4EF1709BE4290C627E04330E3CB CA9D10AA2F41A42DC3089F2C51AFB51A3A0A5E68F99F61F05D7DE8ED84DEEA3F 3F2A64C59AB48E9137F101552C270F6B5AE64868FC6AEE59C276C7DBDB0D7835 9D58E3BAE73B32391C040298C4B93B8149ACCEBDB0D1D481F6C795004617D445 4108A2BA61E53ADD1BCB8E528A1E982E5211458978B071E20C6A2FB7BFB3FBB1 BCBDB5E18BE8CBDBBF8B28BC56E147DE26DE432ABC8F6CE4663CEEFC7E2B7232 0948A931575B3F6D7C5C29F5E59914FD00CFA0B64E595CA37FF9328FCB3E5DFC 1ECD5C2CED3A0113096F86466E0EBB27A3AE1D793090520DAFAB5A00545DAA99 500D452137475078B1996A96CDB7C12ABE78F41CF4DB7207C66394AD669BB39A 19492926069ECD6A5FFFB23654B0877618512E706301A7DDC2B76C42CECCB2A4 0F5388B9759429AF631A262C6F5C1DFFE78F9FB4371E98D29FCF91F4CD7A9DB8 5665151FB63CCEE8039BB28E82A7A73ACF6434AE97F67BDD7BDC6FC671A90D09 2EF97519795B91C4AD666EBC36188457390B902BEC72BE9F0AFCB70EB75CCA91 270C5367C18CCA4396C5D97BC3D1F1C93A6E82767543FEF3277C1DAB981944E0 D8B3EB3AE74B1CE21F7C41C9A7FA5FAE2F6892FA7B8AA3866FB247E9FB015004 48E74475596253F96BF2056A346F656EFAB9595A6B92B409383CCBF368DEA6D4 3A6C9B262C5BAF4AD6E854F5D7A6DB6C0866D0AC2A1F02B7155E76D00ACC58B8 AD3C51CA0317141E8776F8B18AE01205A0911383630F2C6D55F3BB5CD7AB34F1 A5EB91801FCBAA93181ABB6988F88E8F333B1E994E4FEABE71D6474DAA2B7233 2B2847BFFAF668F2D6BF6686E9350FEC94893D1E137CCCEA331EA4D401A2E099 04FAA31BCAB24BE24CA0E11E8CC50606EBFD3F8F162239B5ACE060DC6998C712 FDE6ED9138A53B0AB85CBFB39FCAA1D2213F9466AE76A6A4753921629A522313 50136692AC7DE1C7A6EFEB4F972A0F880C842D74B7653D024BB5F5E9A01C5729 FFEF9B834CAF6B36BE2B77C463A4A0E21E3D913A0A11CFB0F45FE26C98E9C42A 526CC0A5B06D2DD7242E1988754FA5B7F94F811D14D9A4747E894B2EEB968ADB 1BBBAF958F64B20FF22440FB99BF033FABE21F986A9B2585E04803C00CB00F6A 99CCD04A9F3BF1B7BC265A1664C154C261D4E4BE030885F6EEC6B8825D44659F 5978EF6E377167583317D469769BFCD4A084C4AA2B5C73A55CE87AD8E84AC257 2DA8E79D844F081C4A3167B0B9C379DE7C0C980E8F2CE25AE6CCB8CA93A26EEA 096537D000007EF744EE8F2498F686B66DB19F3086FB169C7BF375116BD2D65C 98FF5203A1E3C2B18DE8DB38626E4B4C5153D181500621FC12A2A56665BE3A13 688DCD0856FAA6178B9C418B4C06CA2F8E2DEF7F693D22280D9E0E68D898BDCC 3479627C9606F46AB9EE12B3C30DDE1243F4DA5243C5E81923E144C8350A0542 B23DFA6EFB09D5F6C6D727DE9FC183A102017A801F48F2AFCCB8853D321F5A86 4DF984A8E12A2C5610D56B6089FACD5811512311590E01F4A3A8124AE6F79E1B A50DEA07E6D60DDD22141473F16B6D4D5A496275769036117E8EE7802AA5B82D 937DE4D9368D4701E229911DF6AAD570861D8D34D844B6AD8DEFFCCE271D765C EB319723879C417D86BD2F1C467F8CE9255460787318135198574ECB927C173B 86E8325AB0C27485FE8FBFF79A5B71C914644D578E03120C8AE571CF40018132 86E53BFFEF01BA453CA32E6E3388D893B2149B01459ED03A1D61F128A82F03ED 0BEB4D809A09CE8D2AECCE04C5C48F5EF5006FCDE4D277C05811429D569648D8 E9509D3DD85939EC795AE71D38AA778F7E33421599E3702A344759CCD4A434E6 6C21A005CC5EEA7F181A8B39C1DE685F25DC4E09FAD6677F1B8EA6E9BCD62573 CCD3FD1C514DD8A6E0807AA65779EC29E2653DA47D1E5A9C66659E7FC2DA5A75 3BA20E9234705DACAC1F04D49770B34E7957AD00A784D07F03D26197403FC3EF 48D1053090C526CA1A8F1159DEA8077F8D8805974581D690E2C458B8A9584EFE 6FBFC1E4330E6F3606B810F4E15C02CF1DE7A8C91D5B1609A14385C91E9F40BC CCCA66B958F0860576B5C3BF3A0F749323ADD392BFF108858667864332E37661 D57096A7A78D7CFCE0F31EBB686AF46BCFB6E7222F5EC3E21267653577FA2641 D68424F6110B4B10683B88AB7E52A1F5DD06F701B01BE31AB358DA23C8706C0C C09C2313848A86B3C14E3E074C49C0326A1AC28B360E84072692486316820E73 452D83BFE1CA65ACA110E8995F2FE007F3A922D81E56CE2440A58D27EA987914 6BB4038EC30E6E7478B50FD0DF38B81EACF2D777A3C857C19423EC951CAC01AE 8644621FE81AABA7138CE12F47C820392E6115117858F60EF5714AADB87A9203 247D05044F79A2DD250FBD1514404C9E08F07EFE81938965478B321EE3D052AB 8D05925F45DAF2E7D9E253C442F0E20C5903AD2478D92945EE852D863534A952 65864111E2C51B18ABDABCBCEBAD8E32DBB95C6ACDE3C49411EBC12B3EE468E7 826A6DC07437B5CE7D460A14E7B3A0436BEFE926C7FFF6BBE9759AE0B8213405 A74E917FF49DBD428ACE18F8A300FA0886E7BF57CAF34824E32EE82A338A0946 E5190C0001B6DECF5D82DD9B12A5D75990982158056B613E2EBD620D180BD2D9 F53F52A6F4041F53A12F3ED2B8E6B5B8BB872383141942C658AE228B9952AED4 926E6E476D83B167ECE99BEEEBFDDBC358A858A4000C7A73A97F9A053E1531C3 3A6C7B27F3A58F972AD9C06BBE9C90FBC11C0D09D4DA2258C9CEDFFC02AEECC5 C7D7BF5C447AE72C8ACA71E3BEB40B796AD36F4F1D266096321DD61813A02FC2 05A8F7D3CCD937F333D45CAEB014B9A033FEA700367DC32DC5A8C39F7D1C9415 AD829D454B922903C2CD24AD9D072D10C370EB6432E9F5E15B20E2108287A6D9 8664160811FA1CAD0B64ACFAE82E6CBC8C7712222D7FEAB28434057421C6161E 4F8E11B0DA9E7D3FF9C30C2EF80929D98C3078AA69B3A3E1849897A9894A0810 4224FAC598D226227FA8C1C5733A4A9564FB98958E26E62A4010240E7AB3AD21 BAB59597B9AA24BAA3F9F0218A9303959E620F9D863C4A97BE0C32CE1236AA0F 464F49DBA07EAF23E574E86AF2D91045B19E970E074A488686F4A9A54453CCF0 C0F2125E878858EED597E77A2AFEACD83D942EE6A5EF44542E2ECDEA19C945F1 FCCB8EFFA405CF3D945170085C21D836458AA64F76CFD152AA32FC9C4A6C758D 82740F2ADB6B594C1EC3A72CAE51F80517A5787FE211379BBC9D679B9A9652D4 0FD3EEAA331F62466EA8C7E7D7FD4B5C40E8A242F58E360C8821EB5AE67CE623 ADEDC06E2067D1721D34969F38134DEAE9AC1D4556B8D5498A10B080533493CD C7763B20AB1D4AE922A51D012472390AA0159FBB823E31018E2AA8045B0FA3E3 E47BF0F1EAB2354EB4F71A23E92BBB4F43C3682ADD78E297F059BD5E6DBC360D B05BD220D1186B9773F84CE822BB61C67304732C176F82E21CE3F96B7BF71DAF FE8881898E79CDCCF86DD54F21DFBFC3EDEAEE0652B8B1D6B24BFA8A5BFFC6A2 1BD840E4DCA86B2952C693F9DDC0F20AB5EE294038F603D38478D1C5F6980515 3581EE40C42D3F43DE9AAAEC70DDAFD470B299729E9C53FE693E42C89C40DD4B DDD219D36F6356C39D20F017015060A4FEF08F1D5337CE927BE4CB40575732C5 9EEEC0A7E344F01079A3386272AADA5D5BB2CF9E8FF4FE9A58F3698BB23D6E37 8D0127A7A208FC92E306A130774B692558CF5AED33BEB3CDB415F449748C4AC2 9849E455D862CB54EE3917F59A8CE3BF2870C6A915F3E47AEF50E763A35A95AB 944B7DDBF4338A983ED563B5042A7E9AE7E608A47D0DB1AD06630F3A4BE91991 3BDE87FBA66BEB473353196D396DB2DB1A33446D7A56883D079E43B6CEDB0C97 E75CF2E3D7EC37EFB17424D75097E1427CE66FE777AABF53D1B778C3F8C912F1 3A97B0776D26BB86B960367EB96B8399AB500782A5400C955524B83D9C40F96D 4D9A0E72A8C67EC09A9696EB7533040DFEA62E1D779D29E925087A906CAE0217 F7B92C55B6B2FD7F2C59B8FA63A6ED2F1518DDAE52E1726E62B4877D06F10361 4590FFDCB628459877CC520DA2EB47CBC25A6131F21337366C280C569BAE7DBF 2A7A99BB041528A3E3AE38F4A822F57B90AF964755B7A30F8DA47FA2A8B3BFBB 6DC2FA129B425F1986EB4CC69E858B0789D3F231BE070E4C6B38B614B7F38ACA 2F3BD59FAC255A7897B9A163C46EB0E94B423C1D2014804A8BB8DF2D9EFDC35B 85BA229F98D97A49D51F23EB9E0FEDF77257149EB87FC96D6F5B07855CA81B7A BD04D5DBB5FA032B9D3E3780168A21117A82444201CF56594EE8FC1E58147B78 395B87B7B9E1284C747B94CF380929F293DD0E1A44E8E9975D6668792689A3DC 283F6F5CBDF5D34B0870814C1BC6471D105ED32E8D0EC2DF0FCD7424EC7636AB 4F1C0ED8573550DC1C13EEEBBBDE77968A6D75965BD323C1E0A23EFEFF0E8302 33843942D11C20117927794A9A4FB6AFDAF271E829DDC0F93DF319785C2B02BB 443A9E1D6D425CB79301A9808D0AC65B3553615F5FE3987B7EE72990434E2EEB 3F7E970C66779C8BAF6B8773FF9258A30F67333C58A791B59B5B2FA012C91B95 009F3DB69E7279F8F313178E02D3BFFCD63FEA4D62E1A4B157612E3DDE7338DF 35F3EF63ABB3A90776B38390AC77BE6F56ABC599C08186607BE01D0ACFEA0246 FE75D4B8EF077A19A643035AB29BDC2A9E82BFBBCE06E371BF79376190F6B3C0 FE38978A9EC0E26891CF72E6308F1D5915EBB683F5A68CC331841EB7EE7E83FB 38144716ED0B96ED61446DF7AFB0D0362FBAB7080674F4A67530468A04857AFD ADFCFDF92A9248F892762FE0E3B0817F524F9C0A7B967193972E858AC77C82B0 C537FD9289ED1138A664D56C1331AD70949ACEB1B912B08B6A605A599A3B5537 B962732C5EDE5352F280D7E0747745A81F639DF959138AC4011736FFB097B527 E06638414C77D76419D9978B09576FFDE03B3554E9436B32D0047ED53E76550D A490461206E67F527102414CFA8B19CC1F33D2A166CD4D728054526E89FE7FDB 09A22A2ADF4F7BBF204D80AB1FCF365028E3738F252E466B1A532C20389AE2D3 EC975F000E58C31B3B871259B47C98F581D2EA78DDCCBF17C35A95B63056A0ED F221AE87AAE3106C70842D9BCEBBEF13AC5577249BBC37A998C81890503FA7CF D94A7688550AD8F95A024EB2F8979820953B059D1AB5C4BF38621CB132F714D2 3C9CF4BA72F4A2A22E858B4AD1D6B5F7575FB1637E170FE0884F21AE9672943A C2790149ACE1C50D9D05C15DFC64251ABB6FFE3DC082412F029D0658534B3AD3 F9047E57A8A93E3FD737DC8120E63045002DBC38BDF5C5255D39D2A20415205F 853E33C6233DD1B67C823B5F12F89ED46AC34F01EE043F51F8D49FC92F6AB334 20937D7656A85041AAD449FF3A661EB1F3A4C59657475A83019A4F1481E5DA52 5D6AA6D456F9743D272431B4A78B1FBFA7883630DFD6E2350213CB2E220EAD59 60DC47897D60926CAFE7124C6941273071B5E645C82E92F0EDE3A7B1ECAE00B1 45E455A5662877A4F1C1E45369D80346429830EBDF23AE950B17EEFB17BCD854 E4F4BF4213A8F4C04431A4F6C55CA5B53AE5E9A6AC7CBADB045ADE8308D3B827 7383B07CE17929897311BDE51FA9CABF4DB9339F2D6A3AA33BDDC434190D87A9 8D23FD99B58211A1E9723C5714E2115E737ADA5BD450A3B631311A24C1BC1FAD 034F878B91C19C9B411955643516A24E2160E7D7187EA23B87155AD9DF5BCC62 06F77015A9958EACEC945A36F9801D162AEEBC4F00E123BAB34CC86D9EEC6E4B D19AC4D4B1765FB323ACA37DC5FE87AECEE77EB562E5566DAB4CE9817057D7E0 8E88106E3C3DC92388D29AC013C2C24C22C4C22D570E9DAB97F6FBA50BD2E81A 60D534FB9E0EBAC51EF5C417148C7A19217447A5FDA490DB42D9B7BE6110A4D9 7243A53EA74EDE38542AFB4D5E3D1751ACBD0E9A9479A4F09AD9C828F5BB0634 FC211C87ACDA1616B113ACA384AFA50D6E98AA05B916BAA47669DC63A8D2D0FC 461937F8FEF7BD10325B53645123E28CC6C381B1CDAD25D2D8CC5CEE6155B533 751E47C249C1B9834E79502328D7DA2E474D22F59A4F4A1FE206723656FD053A 864B755C0F3D2FB40D85D64A32B08D31C58334001C5550AF45F9E7047FAA05E2 7E75F3B08912BC2D35EE276D2BF7D9AF99BF74FE851ADD10CA7E080EAC96A85C 7ED2A7DA2BB737264EA42090B60EE83EA92E30AD4F784AA06D3074F38DE78B3B 32A636FB671E4E675E67F237459F6DEC61BB90AE4FB33835CD6CD21143A144E3 9253F538B0E09E0A7DF86C23A01D55300EAC529777E300FC6BFDF2F835CDFF49 2FF25D2434B982EE808D10D0300854CC516A7F725F9627AF550070E8F878E6FC AECD28488B319AEDB73E53293261279AB2782653E73DE856FAE0B54E1F31B9F9 28C6862BCF5A9125436B3200AAA0C1C875FE231E16B7555E5814001D9BE8C1E3 940D47C72A6BCDBFD05B4484649D6A4DE4118410BB234001F59B1809FECA581A AAEFE7585BB9166615E6F2FAB5E288E327EB44A692ACC6842B80BEF348CBA81A 48E9F32EB89F587651E5A589AB4219C244870A98E77942FB29C54BFB4838A0A5 61027A7416655C33B979ADE8B7111256AD6B50FFD769C6C8628ED7D1522FE9B0 8B16F1A7FF2521303A9FC7C2AA8A94306BFB52DDCC458307E703663255C84532 F7A083D57AB71F91C2DBC00332723DA2FC3DC807289053973A6017229FD01AFD 410E2D6D05E880C845ABD6425B59703803B0CA034B4285FC08B180E871C58681 14F5E88C5404AFBAEE556A7215670A3619DF09BF35E67B3B52CB02E7AECBAE2F 61EF21BFE4215AD4A9F3FE02E9DD2E630996774EF3388838F56F8E376A448AB3 0EC433AF0D89807CB4FFB819D2CA11A9783C522CF4E0DD720CCA9253B7BFF5C0 77310DEFD06D47F6B05A5E7AF7D94BEA405104C25A2905B9DA4272BE04C78BD3 0E8FCB8723BCCB59EB5A0B965AB3BACD6EFC5DED12DC08310C4AEC0D96498B5A BFA2C47F47391C46FB6E1CCDC1175490A1852476CD4913C1A1D2FB02A825F1EF B85B3DA516CF37BAA902B7C5362722A991D016C340092BB9E183FA429593B4C2 D0EAA8FE165BA6CFD6BE2F3A5A1B997F110F4F096150F418653D15A25DF8FA7A 770D2F8AA4BD9F1C63B57E0A14D8F3ED4463A5D7197C10509B34D06B7D2F7C7B AD5E90EE3AABBFF0124CED4CC3C3A286F6A08DB1019F7E3D9C2A0BF2E8F37377 C944ECF1ADE8367AA3C6C5AE84D1FF1CEC2E7F7DB097CF4CD82A3285C5F82DC3 4CA6D7989C4D33E63B9F4B5DFF3BCFD0C8A9D5E335D4286C23B1567F85EA0926 A7EB1509F1EB359644146B7E140C8CED091005C4234DDECAB943DF31629289F7 CAFAE4886107B2663D141251D12021C7A496EC771826568DEE0DE1DC8E91F619 34E6E4E665F143A9A6405071BB8206C062AF0E110DB800F26D3EECFCBD2F9455 C6ADE17F9205239C2968D3CC73303D5AF8C41155CE2D64617C80B17F57CBE71B 4F400CAB17C322A0E2C37A6052FC748AD40E9313C0CAFFA73A9F04F73D70AEEE 46769E84BFFD62205D727DC3A51EFB44C056C70C1BDB43794FC1F8CF7F1BF4EA 298FEFAB95EBC63F1D4005C34FA973134372970A8F31F70C0305763ADD801AA5 316B1ED86F752573F833C2018725ECEC8D42C0A39C2DB7E5B9D344712C159EA1 D9A9211A6AD7A8FF094301F456F48ABBF60BB8D59A1CDD617E4E157E802357D2 5123F3E75BD00BF902CB64EC7659C5D12F40B6D882B7DBBB7F9D04DA8F51056D 1794CFC2720D55EFA5B7AAD38128B18500081E0DB5AF35FD0667F347EE1D6DB9 5461E4187A55D104942D5AABA045C78C6B74A3C928FBA7ABDFC53AFAB8197CDD 119E50933EEDDB18DC6EF57AD0B47389E54E1F2A2A8D057CAFFA59E47A05B0A0 6379BF3CE233DFB57A2CCA7A32F69FBD8AE5181DD21D219D427DA1A1C3213233 87C30B76C32AAF5D79DEEBFE671FF09DE90CFF74CF6474FE4E5CF2ADB16F1288 7CFCB027F975C34CBDD52EE838A2518D870C5FA2C815FBD8A5B5DD76A91EC6EC 3C9EC1C61B40E3977F66C2FFA15121092D93E4C8CC2018787D3EC7C6BC5C2919 0335D5ECD12049AB095A0C501E00C7A4019C65A8EC1AAD9AF87E63C1F4A6F753 0B116138E912EDC3EC5403AE66ABDC2F3D9DFFEF7EF9EF46CD60F7317C460837 647C29C7C383BC7FA4A35DC9035619916297746CC8F92ADD2F002015078B91A5 4E1A95363D953248DEA712D27E944C95C42D401FF4ADF90AC45C733648A968CE 64F9768390EFB64840E503571D2CD031A7F553C43CF2C4156331F5F112A89EE9 B63BCD8A490771BCBA2F3C444DAD60589ED923D0E5B96948EE9D9CD9CA7FBB73 26D18FF48A3071B9473FAAA8A30A8DABBB355BB2981151341B331EB50E288F01 CC249C33A2B4DFFEB8A7E5EE51FEBF3B62B14B807B1B240B991812A1C56DD1FD 237D481FF07CBB06A3CA7CF06BD868474C6F8A6AE95AB0B65F229E25AF8DAF48 B0C0DAE8AFF7F8507CCC5B277283CD1D7EF7ADDFF1E6C06208353D8DAE94C466 058026A02FA93812D75024AB4285F4BCF213DA6EFC55D3AF100E1E5AA9E5DCB2 758AF415BB491AE1AF17BB0396E9F5715A4B5853DA30E51E48A594A4CF081196 CC87C0A89965763A1B5B5C6C2CEC83B5E97A0B5B26ED052106D284228CBC132F C96C294A2D19D7D52D798B3B3FB1DA41BA3E93E11A17C20F00A6C436140B1DF1 22D85D49E4A94782BED2C8DF12ECA38044252232F04D413C22F76540FF984B61 6275B9BD154C2BA9447640968C58217B831255A465A4292BAF445CF5BDD64743 F6A7F1D817480FFC4DE1A32AB361CCB48ABE5699B4A95CF58C3BE9C25987F7C6 63F227CA491E56F27F46EF8EA9A46F7EF2130499EC26C3AAD0AF8A9B8AA5406C AB0DAE03111414A3B97453AE1F344980DA6A268FB95EA2391C3344D2AD3FD94E 894FE6383D83D399F1C6EC1A513AC412A020627F90E3D400CE33D77DBCD4165E 0BF767AC51F1E55BCA7A0860C2558CB2C369BFDD659C8162BD67FBA0F7CC288C F546F62A1AFC9EE94DA46E3C778FC8309AF852185CD922E7093FFF99B95AE5C8 2CAE8209AE886EE9119676A373DDFC7FFE48B8F53C7A6506BC917B84B776B239 9CAB9CEB3B4041B0A0768D7E3FF21DA8F4339205BA0FA0D9F70F5ABE2CC76B3F F2F359D766DF9DD731B80CE386E156E15B60A662F9EB21C82CC0AD9C800B2B63 5D8FD1D60A7340A2AB86CD8E02E051C2892D0E10C1DEDDB639A4F6920B41BF42 ECD9F88CDFB0B36478095AFAE68EED560421A568690645223E09CBE167F791BD 37A2E90396D7495DFEF1841A82EFD819F62E30EDF35B97C4BEE450A4942251D3 CA3BAEE228302CB32BFB06389E80591E690A914FFC7ED961E875CE3EBB4E955C 6C730BFA4B206F5401F0769DFD67C9AA5A004F5DDF06EE7FC72BD921318B1D2B 7890D649370F6AD8E6CFB0D266A9B190F5E299B9287EA34073808C90E8A1E0FB 687B970776E82C79CDCAD18B218056275A9C173FE17B7E9931A1D513571E8567 076B928F66C6BC1AADDCE5BA11CB40EC5F803C2A7FC6D67C5CBF87E8C4A32FE9 86FFE08229B93E972417972419EDDB183300FDEC1282BBAEA398674CF953B84C B3D9AC22CD4942066EE13490FD7F3FBCD5235F0D457CE325FA7953DD519F6793 0CBEB922DCD0920893A7C70608F6FA5CC4C6087D0441EF710B1B9AF5F620415C 9067A0D3ED219B6406EDE644CDDDBABB94EA36578E86C64F1A85DF2B2DB1BCD8 8F7FDED4C43CAAE67BAF4A668C157ABF6B4E465DE4722A2E6ACBBDD59E9A85AF 44400001DC6D09D7DD3C67B4A9A8141144C02CF32CD110C6073BD6871B6AA2FE F73E623E69397F0105DC0FA385E9DF6ADE94DAB2A8D0B6FF67E17E120C10B801 9BE03B2618366E71D1F3D04BF4358BAB267BC7B873BACCFF051762D12CA40DB1 580FCDBF90C693BD3F329EC1E7349FA6E272946300CFA359FCB8596F29B49EF7 19D8EDF0B56DA8E49D54276CB5C7A586340001A088A4D7481A4D209AE1C96456 AFC31CAFED6307BC444BC3CEC1A3AD00F4065A436A469ACC177540ECC94EF55D 640EFFF0D3DDC8B76FFA206AA0B908A03D18CE3A77AD6759C78C3651952624D1 44E799201F1223C7F1631403C396707D5E9BA9EC610AC54A39FAA1FA47DE1FA3 C0528EA1DF8937DE8A7537162B9A0518D5389D55666949F0007A34CE6F0B3417 CFA3DAC790F6625862B83F0445284B80B53E5ED4AED2032F191E3F3AF48110A9 3523813CBC9421F86E4993E5E0659ACD732947B74459BD85FDA5EC34940E21C8 27453B011DC90DC31B40E0078E568716BB148B57CF04655D20A3DA591DE19266 136458A1D940BFBD4B8EF8382C6082907D30D55938350C3B1209C55E4920A65B A80806BCB9219F1F5556743677179FB01F08CDE4F1857CF9E749BE6C2210369E 7189E76BBD572EC6564FA1012249A0C07FF6CE2E10F766E78D289800600A1FB5 8E2877B1D3428CE45DDAB4D9E4EA730EFF22069751EED47681A3DF4E5A9B71E7 BE6D454DE8062EF4FA68D1ACB5DA97EE66169B9B5D1075EF62089BC2E9B7AF34 D40CB5CB604F5B0B15B2B6B6225D370991137D87C0DE09E991C59B824C80CA7C 77F134BE72A7AA926E6CBC9534ABF187A39C612BE3D5A4272D49E7D5885BF061 AD93D29C1AB3B2C92EF6A575F34A7C77C9A110970E4DF9FDC81928B8C8D01E9A F1C54B45DFDDF9342A3F8F6A6969E6C9B6CD265499649D762283C51778492556 F558269CD6F14D46EE2E2F0C8E89E6821EAD771F47C430704E5B9D4BA3FE182E 4E1F513B19EAB922E808B4A8F74A06CFF28C929B6A018A68652748449A2AE573 0913A27A1FAD043CC721A420537A5D3350F8B48911062D0AC4022F20D5FC4A18 6378A399B80E0E0AC4F01BBE40C18F9482CF35332A58F44D85367DB0BDADD019 14F76244C055CCDCA8DC3671E8069A66F3FB34E097E929BFD3808585ED3C1AF0 709ED7184069A508E2A5FE3A7F2D665B735B15E1E9912355B5D6165D68456883 D608277C1B6C547F341AC47C7609D13C83AF6E8E4DDE91418C6F0A85CEF9F058 6CC105F763963CDF2A1423E22E7356F5F725E7D2AEE09797CD7AD37DB8A7A0A0 B92CA10879C2331AF5C75273C49C7F7DC9D4B80980BD2D37FBF6F498C1E7F329 08A24530BDFB644567794B02C1370EADAC17EDB16028385079FA1399C42176B6 3868E6AA2B15770F5F56B7C392C0A7B89C6576CFDE4644A0BC8149B8286447AE C6F2A44EDF1A39DE67E5ADEEEDB7FE697FAB0C4F854D9D52D50BAEB6A5D7379B 2C58937318C2CF4032EB62A175B26BAC642570EA3C62E377E9492B740F20D55E 416C7AC5A86BF18537DD65E27BCB8012A6C110EC65142C38F2E50F962C92A9AF 31497A94EFCFE9F49A4F71D32F4B4AFFF528492BB62998152A93FE0CB0DED9EF 95394AABBCC53D8E9A6BA27A7E9F96625DCBB116C04EB62DDA7719900F6F5036 F1E952B12B50E9076DFDCA191207E59F51C74B36EC8CDF06734F187959AF8514 FB4394C7E67E745F1478DF486523594FB89DFA02BE06C1DD45C0739DEA2F0224 ED6AD98587DF112E53CF4B4501104825FB219F8A96DA01B1E8F1EDBD5915B797 98BA63E6ECA649A569D0B99E296EFFCF29A2DA14DF5F249F9F93F47B230A56F8 6207D70F39115CA1647F3C632A050C2001909BEDFD2D499D2D4E660D23361C28 6B60DADCD82DD6B0EB9D2C826CAF4E58914D06C9CD72B7841CCC87A567215BED B6AABD06A60E807B472C4FA45409B5EA0084D53AAF440B76779B92366999CB4B 01A082A69C858048EECF216BFE20D672A1A279F3645A4ED9CCEC8CBCCF2A4308 C3FA1C85ABBFDEF02F426D6F8D8C9D5800F5C9DAE2B53DEFB003E500684F4612 B98155BBBFD0ADD24985C09E8B2ABFF98734FFC6EAEF11FD8064F80932D38D2D 59EE0D77C601490E11FF84753210CC933D55DD1BDF927C11725BFD45F14D03C5 402DB8F5A4D1E58537FB9BBAA70D6B30AD898F247FE6E38AE1AE639CA35A2680 3F02F89CC8FE4B5C29D2B44C4039BCDDFE39B9BC213EA9CDB82858FCC6BAD7EE 73D613DC2954903D050475E1D1D5C59658FCF8EF59C1F6920E0127B9DEEB0911 85BC99B0E39E9BA41013A118AB51F7F626F1B4D297F4D1D703CD56EC5D3671C9 68284D604268916D5C828E6AB7E58F2994D5F8D645A58EC2B85ECE63DECBC8F1 3D5FCC30BCDE331B7172A33F238150A5C15B1E174695A31A44BFF9B3CCBA6998 F6FA5FCC159E2167492128AD98827C562CAE7AA88EC19A65203FAB9A309A656C 821064F6788B1EACB1B86D7F3A6B48F7BCCE1FF44E9EEED345A6B0C881F6A14D 636176FB40FCE0620E092836D25ECED84E6A9B242B040FFB4EDD254001D8ADA0 2FC0091FFAF9733ABB04C111C0596F48E87819C8D392616CB9F3A4DF6A36A8C8 EFC8311A5C9FE45D3257D887F5013C9A4DB1F8F9EA11E8240FBE519A2D9C9B03 D1CD7DBE24636C4DE874129263614509DA4EAD0A537783914B8DA1AFFC3CE744 8E1C39F3AEDFA8A8F0D7765EB2DDEF7A195B123171A69B2D42C72E76DC2DB379 6276FA2817E2B81A9D36AAAA7D9B38F05679A98B36452178F17ADEDE39382C25 7C6DA377CA334D1657ADE08D90AAE5C10902CA930AD615AEA0EDE8919DA15B9A 78677C5707DE33CAA4A74188C4DF40C35FD13E6B7FAD83341585D256DF86E1A8 5DE56CA73822B659EEF60F78C11A5FF42B78C4330EDC0F214C7EE59050A2E3B7 CB15AC718D91A0049D02334E592BC6AEB8AB5513D6463413C85D7D69509DCD61 28A992B39E055E0AC0946EDB764033F6524F1AE9DBBA890643098EB47A6365A7 C0F563DABF0163D8B14A810CDFEA74147BCB8B490C4700A66C0B02BB28EF5B63 21B6991E171F6B5440B67BF4EB4640BC5E15CE83C8540DC9DE94F144CAF7E118 0FB623F087CE44D7A611D914738E1F99D3D8F84402029F124427238BFC5B6585 E22F4C4A4FE08518E72F5882649DC851B9E64C95E13644656846CE079F4D7292 7E99A1CA01A8DABB1B4F9B38597CC2ECB39246F2EEDD2F1A0008983A4D6C5B62 3AB7EDA4E71AA083118D0FE1ABB9D32CB024CD82D5631B10E8526108E5F58437 C312A9EB6A8454F99702070DB1E89D9813C8D229D351217A28E3366CD16105E6 9C42CDD6D119B5B3FEB9AB41BA90F396356901D9FCC3FF4A4D7AEE51283B6279 41BAC0E1397D128DC127C40F292C5131BC57CF69051E0BE85D5F2F1867B45BB5 8F869664F4C69B11B031676F83278551AF87B0A65E6B41AD750E0973FF4CDA50 493BAFB84EDAAE3856BF4E16A014982DA5B635FBC20D13CAC4AB16F76145D2C4 D55AB0AA595EBA507A0B88C9E590C8C7EAB8CF48498F13264A24C5C7245D3A64 CFB7EC939D666071FFB7B00CBF48A32BDDED5FB95EB76206675DA13D4D93AF33 B56D8886A8A9615408896DDF5584B33248669F8304C630E35D159521D6253679 3410F8BFD72B13574BC24121D88B8E4BA006F6BBAEB885E2CE605BA909636494 F374DD11E6F9DAAF64CC537297B5E42C5F59AFA0D22071A62D9B2CF45378F1DD 005D10DF64800C0E2C4DC2773980C1E84FBA88FC09179283868C78749D442E15 C839A2B00C1CB42683574AF666077FFE31343D812C439F8874B642D04B207A6A BCD362F77F3BF19BA693C93F5516B599D2233B00C916A8ECB16474F7DA5421F1 D9F14C84018E62C9FB08606919B4F1D71EB0E615A6863B34D7C8D540023FB940 DCC3F5C9B1D48711383EC64D93723BC4D6808DB6598D33E1E3A791E4286A1304 AB035053298BCEDCF70B3907D712C219A0BE47FA2641E8C9BA9E2A91080D52EF EB97460660FA86E8B545F1EC89A2C4D388D9CD3C09E77304F6B8FE42A0BD12B1 FEEF941873312A9974ED6D72A65B05BD756A8F1F7E935F7269C6365202A5A713 617A54DA55E5478552CC370E0E254C9C2103FFDC912E7420CC4C9D389037ADF5 647A9C717ECB9994D13962E5CA90FC51AC7F7DAB1EC974D45104A02FC184813E ADAFB7E6BE4AF5366221DF88F305D9CA57A6A9402450A783C859AACC4073A4A2 BDDDEEA5785E8F45D6A7D220C0F79F1384E7697C1D891977400BB6E1F4AF2D47 E16B0070515D5710DC7D3B0710A8DCEFC6263BACD1EBC0151661A9D4CE057F43 7A874F77A452B58CB2335DBFF60A15F4516CBB89A8F9A12D46B8FCA5A8E7DE09 AE841CF843C3ABDBDD6913489851C61CEDCF19ED2379FE3162284AFCE9A2034C 7C2BE02EDA13BFFF6D15CFE9043E4C2BD63FD227787609CEE2F7200A826FB87B EDEC6EBDC1FFAE1B09448F37FB4BC3AFEB422339659FC78E4FD243DBC50443E6 80A9AE8416FF88BD1CEC5FA8399EA2BD73D3E9F55ED12CB0FF817D6AB805DD2F A5DCA7C89EBBC68D26B1B2F744AABAB507D2C848A7563734ABAC279A166E100B FBA09B8897A9E692CC23EB9BC1C520E952BAEFC3E26CB1909FD055D393FA9A88 7D79FB8083D68CA051F72D080C8793D55689BA4549EB64FE8B5168CB1B829DE8 616187A0D43CF0CAAFDE9652245860B7AA64C29C3C9F8EA1EA187AE27F856474 1615AFAB3EB2C038957C1AB660DEC1F6BAFFECA87C949A1B76CF76DC14AACBF9 42F0BBBF4E42E465AC344F3C8FBBF6DE558C192AF1E8B87130FB2FAF6AAF71B5 0A48AC49C3959A940FA0EE19C40642C8F533A5B3F1C7404AB9194FB3FB0626A7 FD575A1F29C9503947F1E24B5DEC35F0AD3F8270AABE7CC2C188B6F1A965B31F 9A3374AADF62CD2BA79E5085F693D31884B7F51368FD762340AC710698C57D7F 8CBF1103E855FA941262E71FF0BDC005653177F81D2790AA471B35044C7B74CE 761C4EC8D8D37E9B9E10753640A3E59597B85DE84329A907199B6BC2F322E897 160017DF548C23060E29D631FB480D82194CDB01A2CF67FA106AB2A4771FC9C4 E60ACFCFB7362285446EB8645165DD54B6F696999F0423C3A5CB5A8565BA093E 37CF7BB59A721FBCA6443139A3C89B999198D95FC4CAFB9D170208C234B95ACE EB4EDA929E3CBC14CBA838DD756754B2AA28A915F092AF115C0CBACF8ADCC951 3C7D9F93F776039CB91533D0B20C0E91F7DAF0C8EDA1464E4B682212645A48A2 F73765F78AAA5FF854410C2C24F75D591ECBBC72C41EFBF2780B4E0C3834DD0C 0459AB46878FCBCD2F3F74CB2F0C9458E9379D8C46877E5FF7549B54623DC0E9 A700349EAB7C633060ED2AAF3BAA78D039D3F3BC84CE14715F6A49F23859EC90 A98B54A1F24CF45DA91C390A5F78B997F5253357931B1AEE90BA8BF4AE8A0071 D6375769D859E38C53E1495ADF7A299EF518AE9864CBFA27D828C36AF7097B50 FF82D802FAC44257139704690FD0021B59F862B1CF76E0158E34357C6A464030 528D414F1C2CA7FC03341AD712DB8D2AEAF81DF698CE14E2550F530C98E1AC01 462A8823C6B53D0966E2BF1228BE1ACB2666DE46B4D493857D2AE9E0ECA9C7C2 BE8A59EB17772D4A20CAE7DE0FFC36355B0C36C9DBA1834207FB51C6F5057E3E 4567F6F7F85AC231D07AAF484133F47CEEFD9F11602747D35937DE68CA029715 A807065E680BEC0BA7E24CBEE7C90F08A7F520AC8A3ADC8EB0D234F05CB9E051 0E1C1B5935BFD587135BC9817474B404652D11476FDB1ED0202652F0A55C9001 2961D82339CE7215EE7715C9E255B4061ABFE9C00999FF69A0730894DD9AB813 CA49526F0456B31AA21BD413AC97C7E1EFABE522EFB574B1C2203753CAA469C0 F3134D9CCB3FD40B99B03398405528EDC4C76356C1ECCA37EFBC1E8AE8C48D32 6849349E81DCD5A9BA03DEB10B2E38F78E27C7060B5C4EAC847FE9A9031CC38A 81586C3FEEA64A9A08E7996210F99DE8CBEB2047785349AA50453521A03469AD 3940DAB455C56E99E05EC67FC7DC0DFEB92A1579BAE7D549B8272EB82F9445C1 8EE07BBAF12C6F43BC0239E2F949D9A3BDF703FFA5D7648DB1946B790DB91582 84C9A7010C80983E0FD10E5B0C0AB39BFD238A08FC3C71F9E610988E2FCA3D7A C1751E03CE32573D25E87AD86E00A4B553E31DEA912CD32E05D91CBBF80A093D E9DD8AF2AB62A3472A5AC89D456376FEED2FBF97FE3F25160D9DD14D72EB90B0 55E139BFC088FBAE057E005FFDEBC560251DC249C6D35AF96B4D7E705E6A20B9 E4CAD41C8703169D54E60D44F20F43AB043BFD0531ED661CBC5686371373D482 A35A14A892D813C3AE9C9E7608526346B5AAD3BED944441BE8778B2951C64716 F402A562433F6388930B2832EAC5B0CD77F4DB50A294B39F494018B15DCBCABF A7030CAE701929C240AAD1804A7BF39AF4DA904013C7BDB088C723F059293788 CB8C597207257C7501D39B4B4C0C8E704037009204A63E809BC75F7239CA3B9F 51F376DABFB0961160530F31A2418D3846AF1F4F1B976D71FBB71E0A1FED21D5 0A2FAD1F452878A5B8BB6958FCAAE52C03AC3C862C0EED578929E81B15DAD45A 6F23A85580650B83F69740F5A3C772F6EB2DF9852583BEA97EB14543CF66B867 D5D3C789795DC88B81DFFE6347E3018BF1222881D335809033ED4EF167EC6626 56B2873AA0352DCE4E857C49A2267E60DD6DD516817B6B1611C1AAC35B0FF228 44E2AAA971DA56A7C52EAD967217C34AB4A4FF7DF14E0AD9173DBBCC7A65C948 0D1393F2F37E07083F6F7467B5F8FF09B344C6038F1336921FE66B06578AF330 37F7BD742B76DA52988634BDBC7D766EB973791D32065E184CC04D350C5E17FB 53F3444C3E8106E8447F53E3D4ED643145C1457B14AC9592C047FA58B29E53E3 1C30BCB10575C74709DCD36E864CDB5AC128BBBAF6FA75CE7876497892C37F9E 44FEA5CCDBF74ED7D98404649EE7F064ACAB175DFCB9DB1366E2CC5D2553A9A0 55D3E49663A5CA73CA34ECA485E4C7DD9DE48983E6265167F7EEBF2C69673E67 E0F5D95304BF6AF0CB7EF2F7D8CA692BD1F5F28144FF9F8B8461EB4BA98FA6D6 4EBD0C9EB5C608694CDF023A6307743B8DC201F2A92D774A690EC0C5D82A8A8A D1D595FB9C6E9CE8879F37CE6FB6EEA4784B5D46E16743E3EE97203FDCF6B812 51D0D9AA220C51BE410C6A5DBA6ABC93CBC9D5279C18DFA8D7B63D84BECE1685 8593D298374CB701171A3E6E129765F982701A0DAE8D5D41CFAACB83B10DE55E 7413A3129F51E090718493F343F7FE62421BEEEC70D085654DD0FB338C1EA93A D37BA2680641A307029AE05D0BE724B67CC3BC8526C562DEF3A84904A490846E B8E8BD827B09FB8E9D5987D453B3F861B1BB723AA30ED74CA21FF839EF02270C E947CC9BB38F018783347AF478B137E5BC36FB6EAE8B630014257F87A6B47AD3 1DCC759282C25D686C9A3FCDFA3C2F2A36B71F40555AF6C02D1E59F9C9BD39F4 6E6C6DBBFE7C73D90272AF0969683F44F401F5B3070CCBFADCD8E7AB8D17C881 970ABAAB5FF938203E0E620728857B15227669F6AC8EC3FBBF91B5254BD29B46 E5F15622A7025685058E90EA9FF55B57E568BF683D563EB234E942F73CA52DAF 4B3A1726E5700E2CB3537E1C79D1AC29A8A7E4EE277DC94E2B7BFA352FE0587C FAFAA19315033C5F56745D4D356CCBF66248A38453292F7B392DD8F021CF4B17 138FDCF559502D5E116FD53CE975B0192383BE8D7DCBCC7D0BE3EC810F23F7C8 6164146D208C561BDFEBB17A3300D1813F377A372B26AFAE381786E65C5F2E89 4552A6C9B4C81BCA79454E1D2CC4AB594221040A8111F5F08B830BC94965604D F5A26A9C0A4285FD9B08BB791D47C178A2E1FA30C277A526DB71BA345C1DC519 0B22776100AC4E436709D013A8CBEA4DE00685E644F70B83F21E0621BC34BD37 8E124BCFB768FA99F2E4712AE90C5B5C0F928F0049FF16AE971C9043A0C0F7F1 077422753AA8417579FD66A8A33A6AE5119EBC897D66A47F3F63354264F59C4F 2E75A501478DFF57DBE09D633881DAF2579B7171B8380D319534C575AAE9F986 AB3F99B8224F7B4AA428EE920989228EEF4295B67119A88338 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.0: CMR7 003.002 %%Title: CMR7 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR7. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR7 known{/CMR7 findfont dup/UniqueID known{dup /UniqueID get 5000790 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR7 def /FontBBox {-27 -250 1122 750 }readonly def /UniqueID 5000790 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR7.) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 51 /three put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB981ABA2ACC9A23A5 3E152596AF52983541F86D859FC064A0E3D5FC6647C3CAB83AD4F31DDA35019C CDB9E3DD3FEBD4C2B36BA3CF6E6C7DA85E25D8A31A9BAD39BDF31FD0D1790707 9DE6A078E8A409D8295F642DF492AC4F86AC84383B0F4C6BAA7C22AD5A898A71 D6CB34D2CD12266C486B75E75A69C14819DD9BB8159088E04D4717E576B8482D BDA52110AC8B8A80E4E9D58F470EEBD3CF44A1E1EE8DA318FFF3611B02534FC9 F4018C7C57E80570D2F634D98BE5D5EC6D95051157F0EA94A3D12BE0B4B79939 F82F8D73136D3337C44E314B0B16CB030D9A12E01FB667105F334C3EE965E5A3 D410D2F1531547A4497C355AEEB295CD3C5334BEE5232992960B757594B89F3E 52095042DBE6B4DA3C3AD50CA95EA9EBADA10630B500CF1FCCA7D60306743681 7E428D33B7F7C40B425CD58E4CD8AB474BCE6A307BC6C6EBC15A8A96E0E2977E A33389154536F5C5D8CF036D07F24094E779E5ACBE5502C92892F10F4C6DB627 C7EC4C7BF20B39418A8A85D7FD9B0EAAFD871DDD41F93BDE5FE619AFB8711824 DE890E62C1969A6FE28DD3578AF43D58A728FAFF0B9FAA640962C8F35A26F76C 67F3548D6DB54A25CEB368B47F97EA2B0C4D7C0E7894A4F0C823C6C1922CF9DC 10E05600556F1C7C9AFB33A2DB6F8730F70D6BF94B1FB0887451F2FFEEF3584F DFADCFA9A2D4846B8F0E51620E1327D994CDF973B837D10C90FF76DE22B47CD5 EE3183898D156861AB4DFAD34A1E3FA260B8164E6680BF58413A553E88F6100B C4F4E8E972C81A5F88A7DBCDC308B4C3581BCDE13877B976B1F84330839FE5CF C78551620EB803DF94A5C921F8EE24F7EF8FC4C3E1653514212631F54F90E3DC E9EAF96E998F340C4F729ECF7AB430FDB7C0BE3DF2C0D23015820E28B743CAD7 7F0AE95413C3EEABBC69E852F53EE1DC260D7F1E712BECEF2F18437DB23D8E74 2902AAFBC733AC5BAA452DD6F3671859AD836C8564E99CDC4183D8495AFD99D6 1F0D65B6588CE7546717911E25BDCA6C2649E3A7466A3E2DA7C7994A30AB4449 672EFD00632EFA8629C1AFB7D53D801028F77C864869FE636213A69173003EA6 BE1ABA95EB07B13D1594BEFCC95ECB0A9CFA9892EE0677D6B6C250855762B7A7 8E4E022640F93169DFA0303A0D5E73BF3E0F4D4AAD10FD7E4EB20532BA30371F E9F480F9513432946F9828AFB5D4AEAFA5829B2CB544E5EB634C4537EF7DF08A A1CFD94A52DCF0E7CE4C5EFFB01E6D50558B75DB4C8D5512B06080F27BE62E01 2EEA6A0357441401458C842D3DD4C35B8F561D816B336216CE0C14BF77648AF5 E33912CF95872A1E1AB9A18980A0B29A881D13397C15E1CBA5D3E0B27943EBE2 F3003D15EB446BCFC1C231832475D5B7AA19E4CFDE119D6CD62D053C6D29C333 5F729791D17B3F7108074EEF4D1BD101CB33E01004532CB0D716D2E54D169C6E 80163E70C0E9081F31A1ECBAE079D2A518B790B0CB2CD03DFD034A0F4788E800 B0CD2DC1FAFDD487C2F381EBAB2A2F3F3AF82021B211DC9CD2FBA6A1BB3D4AEA 4C7F3D9A5C21DFF284CCB827D205A69638E98D5DD8E36AFC1A4481B5CB2A2E8F D6C838DA6F81990F5ED928DC7457501B5C979FF4CD20A830896A460C5DB13D56 A3B2B5D9B292374A9BF392894DD99FCD6A1E655AB395E839F074D1596488700C 4E2891C8AEEF66568E82A8B826F9A28FF84D4D9BDA21F638EAF96880B4EBE0D8 081982F34831A03BEE81FC177700C2360D2A48915EC40D5FE85B400E175D5AF1 067FA0097904FB647757BB44B4042D30D1557BD0F7922D731142FD682139CEB7 58CA4C8C240A0B86B1888CACC507E24E04020BF1882BD9B4CAECFA97DB24D7F5 AD64C69454027F198BA35881B94EE9159A2D73E450C3BDAED66B886D6DEBC84B 653E165176228F88993F12A170775A8D7038BDF2FE8DC1F7B98BDC02D1E6686E 9B834F6C0AD90780B17DFE25F0A4E470CBA84E73F2D22BEE09A040F14CFA2C14 0FDA5A5149B5FAFFE49F55EEFC43831BC43A8326FEE9C7F469C0FC3B000884FA 41DA7318EB57262CB96FC4EC7F16CA07FE1C3BE8C2DBC8A8135953D6DDF20BDF 75A2B6D26074FCE752BD32FB9F5CA797775E8DB9BB9786B469A3CD65A0D9DDDA C2A166E454A94860EEF5B5C12172DDFC576A03F6E6F8A735FF21A3E9CCB4CAA1 3064893487697986A42CB5888B2B0A79FA3C74E8187BDDF7BEAB884B70B8D4AA AC6615745AEB906E08BF831CFDE222F58D02B428D55E9D5A3CDE74E42D8A2CB7 E1A3A9439B678AD438793ABBEB72B21C58981DAF3EDCE4BB93D95F4A1E943BBC B3A012DE92FED4F232A3A7D60CE60B605151F9C7C18A5C653E5D6D15E5B49A63 73E7A339504D0ACC74B8B116EA88C3EBA2CC631AAB29F761E5F062966AD2FD28 7FFE52FA8A115DBE23E471094FFB3CBAFBDF11B7E9058313F2D069B2CE98A962 64645738F02A31E2F2AC11628724034ADBCEE012721EBF0A567893411F950410 B20754A7510D041FFA6144AC9CC46D846B82581F20BBD001D34D9764010824BE 61C30D05E5C5D100A24F1917F01799CF5BC4E50FCECFEA732CB50196825F0E08 8A1EC868C6D4357857EE2957E081A0E4372E31A8ABEF23C3F2EA0FEE57DE4D08 61C570175C41AA0C7A3A579ADF593F18B4AE3782D2552E4E0759C32E059EE741 2D8191E381731769F6648B3581CAF11DAE46471896666F18F02918B0860BDA3C BD5DE777672447C23C62ACFC2611ED5239D6A266FDA6031EBC5A530C1A2FF7A6 B4380B9A4C877267854AD1F1677CB5433F28894ADF93D39EAB94541A8D232E08 22D082D0951A60F62B87DC028714EC74133A4D65F7D0D1296C0E189C4A42AA98 28E8AE7ECBB9FC8DFABCC6EEB1E9FB06227F90808EF31331CCC5D4C9A6182181 047902DC9FD0444FB94B60FC74F3B677758088CE6A159D940C5CF682335E756A 8BACF06AD7225D49B0002392C889B0FE2C71311D2596F4903D12FA20BA2FFE25 A0804B4BC282929BE31E0F46B34532CB5795A65218CFAE21F390792DA67775C7 B91A2BF4C16DE4F6551DAE3A5827F616BE9040EE6B1008DA2F99A01EF66D697A 6CD1A44E0A15D1F39EA8025E886A68A1E9C334327C7703EE721E497CA924AC90 7723106D913C5ED4BA4FC743CEA8D0F5172526107DA65775C0B1B77179D336C2 9B09B608D80B1A1E87CA1A84A833A00D980D919BFF56F6390E9D5B45E9935CF5 E69D003564462F750F7DCE02DC23CC215A0696B74D8BD3156A392A94F557655E 00BFAA035647568ED66157FACC585E411F7F428569C147DC43F6E4FDE693D0F3 9917BEFEDF61FB980B85515FF6424824E2D995B05CA1E5D3E8BD8D3281DB7CE4 E54923E84058FFC0A8A2C491327D0F87CE4C352B724167CEE224DABA3B95757E 4A419594BE4F92E78BA6D35D4C93D31ECC3134B24A45DC32445725BB044F09A3 AA8C31EFC0A2944ACE2F2CE054CF24DB350FB3C71115518C24BDC0F7E54250AF 9D3378D38480E1CB9029F31570C619A28F065CA4FED5665EDB96712ABEB33B9B 4232C00C1B0215F08D53F7E430887035AC25BEAF06942FD1B6C442253C887AB7 D694C1A6115C8990B4CAF1E81DD1FDDD6B03C00055BE956BE7FD8A4E1049AE69 EDA8593CBA8C4A41E046C689FBBF9F1B64E5856A7FB1C61EC815A56DE2A8ED33 41F370B8203D4E5B19C63AE9E6E0D26F4F3814B5AF48AD30EC9B8402C941FDD9 722FCAFC638FBB835F83DC77F93D367266FA7DFFFCB567EF82B1695AB4D94D09 B18AC041811027229DF431F5CB2BBF6ACCE9D500C8F075A74590641C1A607C56 D2B8624797BCD9C91C3177818691FBB4744EDB6056464A0B95B8D63F7C22309B 82D6126E2057BCC9FE5566D96B7A9B201A09B0D3252A5494C8CA2C8BA8A13C29 37EF2A882D61DA708C279F663D88A8E2999A0F3B6F98C49901A7631BF7708B67 54D0B4C52BF4BE0DA0439E6763A7C9D639AD4092E77B13D3510DAE1475C978AC 796F9B2AAD3BFF35C5A3E19B5E2BF704B3BBDF68CE48BA4FA2496D60E58888EA 28AE12D00E9F0816FAC190590A865BB58569A91BF0345D01230ABA361442006D BA2C90EC2036BBAB79EBAFC3F217DBD5854C519235F9627A1C3C71D21ED38AEF 0BB40F3B86BB9F09A3F309473D8757AB7E638DC1C59A7F9BCD49DE4107A2E54F 422767FB94048987847205584309397F554744690ACFFDF5902FE5DB355930B8 71863217830DD7A563B0B3A4025ACE75B0E777B4414B62A13B50C54E0E6D47E9 D43BF769B9411B74E1069BF71BA873B4B8973EC9BA492A5DEA58D267872BB246 10AA67B143D0E2223FFB4991E583E629413CC894C3FA4869B72D19CE1A0CEC8C 0FF5E5A3EC1FCB7D3C4289813F0D249A11B55104BD60B2A89BEF44CC77CCDA9A 065B8B83B4F4253AA1D535290DCFAA4773452D110D2B3370F9E2FE5432B54A9E 644EB3BA9BFF62347F376839024CD5EF3C5DFD30F412DD5474B7933E6A1AB63B 4B12F2417C72D0543C26A263AEA53E5BAEBD67E23553A72E949DEC556BEB5D09 C4D7A89B14FE4EC68D0E3E9D65A64B285E53590F418EDA8175113CA375A29930 DDCF4C71ABB26CEB800C2C2B253AC1F53651C88A56ABE5A74F3B54CB4FFDDB92 60AD7272BA25EC2F6FB759AA6E1E7964FB55AD09F4EB25DE45FD01833947BD05 6266AA8ABB7DD792941C7A070FCF3A4636FBF8921C70298D42FE92F079DBA2AD 6149D9CF9EF7264DE6DFCD4429949B15EA90B596340713BD61926DDB2BB23BE8 F9DE38A31620A817420A245946E551463960A8C5C7295E3B3D6A59BCDF5E472A 40B7A2CDDAA43CD8AAFC411D037142579D11054A903E102DF0D0C7B5BB854DBA F3F086AF991F7F5D5C730F8F9AF213F25786F3EC0E54530FF912F4876FDE16B6 A07D0DC4FC46EC6363BCB68B83ACC448B801EC43FDD2F8BE0E93D809FF81E38E 176AE17C67C85FEA58EC95435434C49A950AA955D8B20989C550AB1F1C31B7FF 99422E1F48FB7D6F327C6DBC4695A03903DB275B94CB39386E46579271870A25 21823E75C377E9D5B46655E8CD8F986372CF8BA846423E26582315A9D19E0BF5 305C32B2A0EAC3ECB275B1D8BE11A37ADF524944219D94EA2C5DBDA768828B6D 775DA8CDB09E0570E4ADDF462EFD8D3FA3F86B1DEECDFFB699AF6507257C1879 16FC615868C2D51F03CD57BA38D42995D9164B257441210084DC409B6EE4C119 0B2E17B0A8D5326DD0010E4A325D5F77BF935693BC90A00A28C7B5F74817DA39 F47A41E32F4F92AA04D30D810F7B1484EB53AD8CFC8CE8928B570314E0F713F8 AF127227190F9C16BB73D2A217FF801C391A29095DA5E4974D137A0CAA7DE702 E20DD4755B1D78739756A5E7EC3542B96AD6844199FFA2F5F2E9C64E2DA4FB2A ED79869F745C59D235438251BC2E6D26112AAED20E06021D1AB896EE1F1DD2EB 437FBD4A25E42245C5A647493FCC9922E6DD7AF57D5D482921D1CBD6F0F02949 C27777144751C1E72F4EE2BC343D4AE7A8A8758123B54FB1A026144C643651EF 0907A376945E19A8FC7F98A034832A5820A481B0823F980F59623E0511593FEA BDE6EFBCC0383242CBD4954027B075B21F10472059A480D6E5ED01C3B07461CE 9810251A5C5643EC7403130C2246E8616CEA25EAC7A0076731FEA8CC43BCE3BE 933FCE61067F5FD402E67E2B9DAD954AA77C5BC86BC5E4BCE2ED676D8D8EC7D0 ABC5C86D82180B9D5D7451C71B5149B6B67883578DE9909317928C0A92E3205E F23015400A1763A6FBF67FDE3318AD2696685A1832FC31CF38589EBC7CA1C818 60D2B2211E04EFCCEA88D9A9082E82951EEB123924A267CB03C48889032F2892 4227E217FA28F87E01CBF27BF1EA60641A4238258CB7AA355908FE36D90F5CAD FE992D03A33E47CA9AEBEFDA57793F39DC6A9E85D5B289F6B862B35DBCF82E43 5CD6A862F6FFAC36478C384C3BDB0148CB1FEDF55969C776E77917635B5A65EB F2AD351D21CD3822D43289FE8EB0FED58182997097C7E9F4373553AE1CA92083 EDE3BBE6C3BC7009D15AB5FEC6A59E9FD1BCC7B2099CA15FEF083B9CBF7B890E CDDDE6BA0AFF306C76500C945DC91BD533FF9A585CEEDEF79238C54E6168001E 26FEB29E523EE501BFA4F60B782B1499B07084C35A2434B4D29D3D8E2C8F945F A9922443B68D07DF7EAA1F4CDEFFC438B597D8943E231B5216808A85F30EDC81 9DF5DD22F54A45335B4C2203887475F39D247F0E7347BACFEAF220ED82F9263A 6488E73C1910023E505FDEB143006C1A351D441AC57F9D52D2C6D63D78C75605 999885676BBBAD56074298E0BFDACBA1830BA58E87F436CC670EE8EB1870154D 72DDBBF3794F8CAAA3F1E11DE29752DD99EAC695838A19BB67A1FA3829B6E0BC 5301610A0351AAA749F456AE31ADD87D6ABADCDD1FB3CE81C3713F48780DF407 530CB284B2AC709F52EE7AD647DEF9FA4D2A867CCEF728F3D40CF34C28D21527 10160B3DAFB5FE16AFC9D36C6EC4021FC189005862082BEA60AC72B63AD27D72 FAF3C2D89DA2648FC4C65104A069212D87144E8533CD86A6D73DC7CD9DBA25CE 7DA53B000266F3871B24663C77723703315C5E4A89DFCDBAB384AE7EB2F455AE AB191FED406F7F6EC9E5B8276EF5C4CBA041AC7E8BCEC7CAE840154BDCA3232F 15711ABD1E867A434E9787CA0A6D1F197597DA27ED2402CB2D84ED082E8D3A39 81E6EB270DCA4E7A90E2BEBD3CBB3A2BE3CAB926192D7292CC16845B6399A543 BCFD224BB52F21352732DB5154FA3442733066CDC3E186D8AA97CD801DFBE43A 116C86889BE198DA88CA978B8C40ACB67E8F7BA499DE68A6FF0DC72C3D00BA1A B378B39610F15CA026F95ED8155CE3FFFFA2E2FEB352DBE14CEE1669F2387B70 55B91185FBBED764266215D518716EDA3DFC9E5DB6B148A553E75AE5E38E1CFC 6EF47B314D54CF24BC13856F4F7C976BB91D143DE32FF49BFFC87E17885A1893 BA1B8E441B08EFC04F7D103C1FFBB665194B3D0920473740C55FB1C50EBCF717 A2359B687FCEAD65616EE89A68F8D91AFACAA0B238EE4AF0279AF5BE5294C3DE A7E1F5E6248C0210E7D40683F04B12A933C746ECB517CF94BBCC6E4CF49AC715 D8005AFECBDFB7A6B417DB8A28F8E9EAF39CEC1CA64DF37A5E66A76C26F721F8 A63B003A040A62F87DCF61B298F960D510BEFA453F118E59E7DE8CA3DD002EF0 127EAF733D5C61B5132348D280F84D159809CC71A3C6F7373BBFD8D6EF715D34 0016DEFF14AA5F960BF1BB9AC304A1823722843547BB4CA5EA4C41C6C2701C8F 7BDC810443F9DF34BA469A3260009B799871BAF8523C8763544DCD0B382D44C5 F75046AFF85F0B5A3188C2EE786CEEE5496A5AF4BCB0B429CAFC403FB983EFE3 61FD9F52ADFC38E07A0FD7BACBA530D2E4DAB2592AA9564843E7E2305047F060 C5FE4243FA8FDF1B5D4F61ACA7850A604FBC6D6970959752695C90F78961B4E2 C8CFA41082B1A37405AABCEE5BA3DC2B9EA76F486117B84728EC6D8AE6379CCB 402C2AA89078EC992C00D53151E9D82C65643F549A572A20F05107A41BE5AC57 8EDE92AE20B05E2D0C98151CC92D5389A675DFE39DF546A33A84A4C534337ADE B17C34E09145B37CE1EB1D10D42CC8D6E6B127A3809F7202381FDB88D42084CD 0AEAEB8A8288CB56870EA2BE9D0B9DC8291021CA561E2BA388DA3494E433E0EE 5E69DA51D0AC505C9F71562D3E9750F23CF14D2C8ECF0692FBBCB4A92B48B4B0 AA2163A2EA883B9272CE7F3630C6CD3865D78C49FB54B677E4E09581B1991D83 972DECD70AA818D27095A01A1645ADBCC2BF657267F237B718ABC713CD49809E 3C3F75BDF94A49445BBF509788689AAEEED658C856DAB86688A1AC36E11E7F0F 8FF51940C039F5F430FCE4AC620DB19E2DC437EC386BBC44FEBDB6CB98A763D5 6EA93ED2D7783729F2C366312C3CB0FFE43F6E3071085B4DBC075AEF38DF6E8B 18817661D82499F0F8572D78516D110561BFDC2140B873C16873583BB9B7B8EF 3EB9270EDD6CAA75B36CE74EC92E8C32336D52CDEF15AC88AE230B1327AC49DB AF77270D898561823471F0BAD78A82D83207F1DEBC633FEBDCB95DBA361DAE14 935CD01DB78F0DAEC7F2746AD3C8CA6F7AEE7BA9F80D1BB700025B9E6C6E1FE2 984134A6AB68DFFBE2EE6B575BF9FAB17E69B90FDAD6DD56DDC85D08BB65388E 8A1DC100DD311D6C6F4995A6421757ECB5FAD6BC8BEDDD96599743009F88A94E A999DA7C87967F3810D1501F8781205C740E995BF772D5A5D9DB5FF146379548 BE81674B2FB458FCEF993787D26EBFBE327E2E91F97E91230F830F3194F8DE45 AAABD1F10C1BC28C4FC58D39D4C20589824DA0F0FF32C89E834B6814D99BE267 529B3634F26AAC131D6870590C12C28FF686C67BD7E8BD94EF5B9A87D2C9A990 CF2E98FE1E10609EFAA31E0A27FA0355D0E1108C04557BF897A669EDC0666194 7D7FCDC47D714E3BFC840A9035187AFD2E1718DE10A41DF87F0D2771A2C28C23 C948A926F4A3661311794681456EF93111F4EE7592F57BAC2CB225AF8A11CCE5 CFE0D3263A4E2AA73CE01C3E2827F1FE5B6879684D02B39CCF12054875F5AF34 44 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.0: CMMI10 003.002 %%Title: CMMI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup /UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI10 def /FontBBox {-32 -250 1048 750 }readonly def /UniqueID 5087385 def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C 7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B 0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE 88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F 347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA 29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C 9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B 75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E 4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC 74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D 543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F 7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE 1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C 4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F 55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD 38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D 22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB 44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A 42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E 0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE 66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E 1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B 897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F 87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE 178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA 7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD 6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC 98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B 9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE 44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA 633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D 6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD 375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B 9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF 8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F 00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF 7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D 4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA 92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E 86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC 35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD 155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F 226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B 8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B 919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D 2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22 CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744 3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8 404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84 262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953 084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341 E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI12 %!PS-AdobeFont-1.0: CMMI12 003.002 %%Title: CMMI12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup /UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI12 def /FontBBox {-31 -250 1026 750 }readonly def /UniqueID 5087386 def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE 882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A 7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC 182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A 1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D 3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F 68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D 10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA 7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A 46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD 754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF 88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A 7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D 7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D 2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D 639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F 90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E 1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E 8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D 203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F 2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D 244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B 724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF 01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA 287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C 192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE 084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF 92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A 9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E 38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F 3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D 806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C 172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A 31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A 2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD 207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A 1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B 97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF 94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED 66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C 224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D 5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D 2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE 710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45 FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8 FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736 5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.0: CMSY10 003.002 %%Title: CMSY10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup /UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY10 def /FontBBox {-29 -960 1116 775 }readonly def /UniqueID 5096651 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 13 /circlecopyrt put dup 15 /bullet put dup 104 /angbracketleft put dup 105 /angbracketright put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A 11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F 10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D 7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B 491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D 9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E 0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD 5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B 5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB 54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD 2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C 16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F 483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA 051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B 8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB 0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD 8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F 153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A 98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B 888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D 052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F 07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D 3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F 849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE 84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA 2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD 2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E 4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB 8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C 4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF 035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B 0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E 2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B 60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E 94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA 343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE 894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F 8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC 4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70B15A0 657F5ED27D204449A841ED19E01432CFFE928E921321113780D036D34F2797DE D4459CFD15BB117B5C9745EF3CD2B296D91FAD48C80B136D94476967E255F808 AD2B5D522ADEC64176833756510391815A1D4A8DA1D0AEE7CAD36A1D161889F2 3347D5B6BC503300FDDD48F594F391D5FB42C42113C538E707C16EE24A3F375E 7C506E8F49CE50FF9DEF3B4A4C1BEB3848EAA3477349833BA22D2A9012287D8B A8C4CB4307A1188ACC0E6E9338E1559BE5FAFF381BD82A6C71C267409468B3C0 2C1A29F4281D565836EAE57F680490FEA4A952FF64C8CD11C377C294DCD1EC25 CEFB2B6DCE959D0208F85B6E32E9B44FD455F9B134A5306D95EA29F37BB8B86D 9E592159338E1293F449380E13C21AE42E6D6952083BFD432F72DFB7B6F9257F 5784C683A6E9ACD72334E0EA8060A81E14EE32300055040E24B49810DFA1468D A962DE1D1AEE09B49109257898F155A63A83D514996DCD2F96BC0F52796267DD DA6229F5E9024F78B02154C27EFDB9B6E09B131C9E9E4DB41A0FAEDD93A05512 A919AC8869C09FC929682B51174D816B85DADE28C00F6391429BA98327848AA8 C52FEFEBB2296BB78F06BC1950A8E0405EDBA2D8C51F1F607E73F5A2173E5469 BEB7918844D450B652DCFBC4C0D0C4AC2AD678B7165AA8F053B717C1D417ECF2 3A2909E864E503059135C05EA8F7CF185DA45CE17FA40B4076ABDD8B167B6F02 3C8962F09CE07257495ECE5357F755C48E49F4385DB5CE4FBACA3AD4D18E39B8 F7057F4BF581ED26ADAEE218CE130B0CD06B37D1F1E678AF4070F68B3F53FC91 5BC690590583604E5F3173804CF1B9196AD114D00840EB8BE5C6672A03A7CBAE 98C3B53C8D272A29AB18E874281787E6750956EBC3700D35BE17F5D4FC9D61DE 71584267EBC5EA7E74F48F3C3572EC40EB05AC7DF6A8FADDAE788C2DD76B6EB8 441C51F33A5B430FDCFEED82BF96622D97FE7A54EC80746A35DC9B405678D9C6 6CB038011D41F162163642719CE44734184347122D2ECFCD8390C682B067F152 5DC4F15C41EA75179365F2D6737A4EDECBF58DA8AB1AEE8D37D863D63010F04A 7D76CA15B256718C4D757465F42D2D30D733567344E2147A9C39608A750C4C77 40A537790145E3A5A8B301290E9EF001644C1ED6EE2D206FA506C0A17D31C1FD 11B994DA3FCDF59191E477F9AD4DE4AAA964F9D83CF342D313C58C87912983CD BC729732999B9C2A67501DF0AA0542A39B4D104F40909B81F3D1283CE13D1D1F 8A1548322F6E8E96A227920C7DEAB9380A2F7E5DC034E0183E9DF2F13CE03C04 68455E1CD2E5BFEB1AF6FA57DD339CA44F8FBD193976C4 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.0: CMR10 003.002 %%Title: CMR10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup /UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR10 def /FontBBox {-40 -250 1009 750 }readonly def /UniqueID 5000793 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 15 /ffl put dup 24 /cedilla put dup 33 /exclam put dup 34 /quotedblright put dup 35 /numbersign put dup 36 /dollar put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A 2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E 3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B 03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A 8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E 94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C 8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A 64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B 07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC 1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A 5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE 0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D 38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C 0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D 4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F 3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE 15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF 7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA 4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B 3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED 49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B 8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B 5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC 17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D 364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F 7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F 26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD 8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A 65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A 5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C 9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B 72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB 3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF 2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF 9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A 2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED 6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B 7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A 8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC 41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F 4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF 9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E 61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 652BF03AE2AE82B99D820CF93F5FC0BA17EBD7A83D1DF278C46A4F26DEAEFC4D 95D07A253330DCFED1B05FDFFA1995E7DF4CCFB449E94C749BD813E1949FA757 5DD7B4C68A3F7946CCEE6BDC8B12FF30657F0808D07508AF7042C2C84135434B 0EE39A08AA24298C2D91085B4E047C7F92AF7461811CDA6D6215BE29949D9B7C 6C2CE48910D18041571B8D78EC12E8AA4D8136BE32EBCAA12C5A7FE604561890 08F10D3367C653C7041D0105C2E3CCAA6E055E80BC34A62418DD202F6161D512 A8BBEF81030F8F05464D998B930B8273C00CBCC50DBBB4EC8284631410D4156C 420D073AE8ADD268DF693B9120BCC42030AFDEE9E338CF20D2350EC7C23EFC6B 84FC7A00FC6766383E542DF699BE07F01832AC295BB1D4EC2A7176E1356941B0 D84EBB40D1DAF93B95079B5208FADEA55A7F4DB794381ACC21AA586257CB4CC1 93F4F5E302F4CD994EC08C58537CEB1A07B545CE68FAB9431C7C1EE4C4D18EE0 57054558E43C1043FEC9D4F753D432EE93A75860E50D0A6138F9C1E2AE758EB7 547F9797BB7D67C94CA4C56EEA98BDA4683F7C3DC9AD05A6A8599B1DB3D766D2 D3E27F50CA9762F00A7EE3605053C657F0C29BF1E997B9206318FAAF01FDEF07 66BE08CB3A8755F90917C0356397CB0A51F6AAD0A5B019AE84033C16C4CF8124 9AF3DDACEE33F598125CED9B9D1448435737C4B976DB7C1BE5A5E04D16742A22 995AE9DFF6669B0CAA80B3AA3DA84543A2502FE791EB65AE23597A3FE54DD7F3 B5F18D3352B561261827D71DEFC21540EEC68747915A3E95355129EB8DC3AB2D 124146609E1F385C696762F6FB9BE1563BDF84BDC84EC3858F2EFEB078DDDC8F 7E5D556AAF054BB91545316B7FBA68BBCC51F65169ECDB878BFBA233122F0664 A8C32A7059E8DAC855A30E6593E8A8404E0245C6168B352568B5EF321A2190B4 D7FF9600621DCE9CDE00B2B3B74BF42249F20CF8487587EC0B8A6D267733EEE1 5CDA5DFB03D48542403188A95DBA88B32D541CD389CB12F607844E3AAF1736B9 3336ADD7402F1101B6A8D9DDD843E6E80330277D6E0220FE94FA9533CB7AF0FD 1A0B0F4F745377F6F6C1F58BF65298A8EB4181F3DF95321B7061B7E0724EBD5B 5327E16738602270A3D5548BB5D2FB075D0F0C696E83C25D3EE91CF5FDA380B3 B2DBD0E45E3881311E524EA96043C842BF330951E778C5F78A54EC33AD31D062 C51CDC286B9862B0C69172ACBBD8C29BA4C6E728D678ED7B209DE28EA7638060 0C84A5B873BBB5C95ACF2CE541F4CD21D51E4F045880A3A59649A14960092DC6 D54944FACD587E2A577DEBC4F18E2C1755C5965ECF93B9B5DE86D991E624AB1D 39A3AF2F67162A1F55641176BD1D49AB8414398650AD64241FA6ACED9F3B3B05 C10B1139EA424EDEE58B78878788B84B2F90CD6E995D461C3BF7079D2F8D9D73 31ABB4B3D8CF7AA16E329C0906D77AB2144E83E3CDDDF095CE9A836EFFBC02CA 271AA81298AB867D8574101D474D76ABB31E3B327F7984A141A4B19E695B6E4F 5EE481A86FE19A47333DC0EF0298B8B1334C1AA1B349A966B2E35BED54243580 FCB57AC33C49ECED9B0651A8A701D7C4E589D08AAF91653F9751B87E080F9D58 D0497793CD7F3E58DDB55C8651D264798761C4EEDE4626686759852C14524F98 584ACA7958632CECDFE1ABA0F78067D7ECFD7DC1D74BDEA77930F422822BB15D 1BFC89A853310FBAC8751A7D639E32C56935D7366083F9998909DE898AD273C8 F9552DE49775BF217C8C749A987CD8D037DF90A94F3150F7A88E7F6FF258DFF2 EB297BF462F7EB65F130F53748C9962D5AAF9F3302634D5652B38169615F1FD6 62DAE00DB38E8658C45DE4C70C1E197DD490B67B5A764A3D83AB75E6D5A65E59 2B1F7EAF53044BC2FE71B260410EA8E723F2DC4906B1A90BE32A5D15AF3FF0DD C87384E2A7901330070E7724BD3016C37C9A52426B91F64BADEEFB478579F9F9 25E0752FB24F272F436E5D414AA8759CC24A39C5E1B3C64C0B1E2C6891E1E109 E5BEFC2A40E67C8F60BC42F8D99017A710686D68A8AE56B83ED766137BF9DE93 B26B72FFD337D62DEA8EAC52293A16689332B9DF2949CACC76360DFA0933B8B6 339B610664417DD9BAAE8EF5FA845DCBA0FA3A311C79E23615743D19F602150A EFFB2086FBC818F1F770E2089B1A002AD7115B409DDFFEE2750E1276820E89A9 E654601A8B32C456E1E3746540D3FEA7A44B3C2F29AF468130F037242EA8FCBF A2B8E79293FF92366AB94B406D388FDA08B4A409D560FB6D269A3EEACB007FC3 391DA43178FE70E2371303D2D91078E593A5F819389E62DC1445E0FB4E607854 D3522A68E2EB0CD41602210662C53D031FDEB13D7844D6E002604AE05DACE3CC 784196A194210FB5200157C08E263713A72EBA6781EB4FCE134D4CE319947B6B AD8DE8ADCD2BB3F1607EDB09F9C68ED0C763172E10FD68718C39BD2CD34A3C47 AB803282C1A9E108FC6EDCC61F4410BE7699FF1E5C27DDA0BFA7059E492DCA4A DE31F8A15EAB988543240EA6CD5C33499F99B48F8A92F37C36121A68B5D8D2BA 0F0F047058EE30FAD733A51CB3AF448089073281EA3A153F0BF38A97D9B5BEA3 216D4234DEE2C2587B4F6233E2C2D9287FA97D0495E28C4B6FEBD4BE11D76E02 0E67B72567D21A141B694939D474D8829CFB026CD53062529F03C23C59305C7A 2A13EB8D4BCA76305F268EDD6453D78ACD6A493857078586A4978D5D2CAC77A0 D5895184338DBAE2D178C1E449853FA9B65F9E640DB8482D545CC523F824A0D4 14B78ACAE4D1B79240DFC6BC5959F15CCDB5EDF6FB73792F19A3F3844CFB2338 3C256592C59097F591180A4428B5F5E1E3EEACCD45873DC47E51E1E4CAD664D7 FBA24456666C28476F17C3D9790465B8852E123B3BFB7A6E26E235884F9C0945 FEAC295D137EC71A9AAE17E12419D4535D8409BB38FF2AB511BC73278B4B03FA 647042DC6289EB1BC15D3597CD6CCC99AFA02F36C06FA7B262B332BD30692F25 91AE7511A4119791E6B68C05199277F14EA2931D0A242D59D7FF296038CBA571 9C9CFDDBFBDDAB3A2DCCBCEA4EBAED6D0ADE2863DD76BADDD8122A4AA386835E 5AA9534511D08883DEC5C8F0DD244C0B3338E977BA417A24BAA041A20FCD7FBB EAD7A812F017F1FC52133A2722778B45B6B523FA26ED6239CE1DA897BAE6C697 DA0BC2A32EB4096C1B91B6657FD21E34890BE1595C10BB71E5F4889D27DF09FA 50C30B0872FBA1717B269FB79A3C226B8D236BD37D19658E122460848153C749 EFFDCFDC9171FC9D061F44DB7BF580862400636F0ACD21C2FA7427FC511C2B34 20A7A62D9A3955AB33E42B976BF76149CE127D7C861B4CCCDB0C3F3595204D37 6C77D861C64BDE28CFDB30B78F38C77D3163197DEF4179E719D6674DBB3561FD 06A05039754056D3109E1AAE8CB959A3AFC7C565D987966CA67DAC6B285A4CB0 05F67A4B1FBC5612984D2A04E3524579C63649A9845BBFD1CBF53B8E4BF63912 1EC4CED70568FD44C4A06C1B09547297C581E8AEC8151ABE17AE47D537C4670C 6FFE45FF252DD40ACEC5357E6ADF9AD8C35E9A96A1D2599784487797175C0CED B92CA4DD93B10176613CDBBF70DD34918B0795ACDF070745A4FA25CDE80D862A 3AE7752AC76CC989E3E4CCCD6CD01101317A71126DA519151A647E7DD77D914D 1CA90A09651805ECFD787922329586268E4196CF4CE7479621A99C4CA4FE5116 34877E4FB07ECE69B6C0C7AFB1EB859DB7B66F106F417F4B4CBC5F9332C1ACC7 C133E69C3160A9F4490F24184C496FC2C22E040E6E8E405B6610D75EAD6A45B8 347529021C949CF1915866A31AAAAFCAE6A0C08435D6020EC60FA00E445FD4F3 1D0820766FD83B173D6AEF2574A74E55217B25524B08C70599D57ED954C28AE1 56752E92A226CBDF51C8551AA749A2775DFFD6711A6B3BCB4B613958D4D4F1CB 3CD42615AC9FB770C7CE955F51CEE21B1E85D5CED699B5AC793F7177BD054B39 8E1404776A715DE0C28F91F3886B838DE2164D11927919B3C72F82932D8EF131 E429251F2CF9D3C76B94DC43DB22C6537028F942B0784D2EDEAC0C2BD3890CA1 27D8F2302B44FA2589D4D15B15A6714A362DCAECAF28DCCF9A70CE5908DE101E 04B85AA7CB71C13F9E6EB178DE3123DE572509CF872FC9564795D286861C1864 8DD540ECB9D75A8D2443EF80302912AC116396E545C3B0C3250E81B78AE359CC 28A09A94BB5ED1381699AE3552A4F0B30901535E761D9BB32BFF10B5A8068E16 7B6E9A24BFADEE9D33611275BFACD8CCD3D4790CC8A485CD0B5BBA7123DAA842 FF6BCEC22ED9DFA194E73CBAD1ADC447BDE46FDE9B905931BBFB2A882A378DD5 8457081F0EF2F1B5A882CD357EE2E010146CBD7D1CC4816486665CEDBCF3870A D69B166BE00A41CEB198A892DCFAD21C4AA63E78FD039645AE07909F6DEF34B7 C561A353903C775B46790D67CC06C6250BA67DAC397C6B87F989FC077BC23630 4C27C88FA000B08933EC3A51C8CB043AD84D4AF8AF50715712512E1EBF48AC15 CCE2A38F3F519E39D425DFAAC92B25E5439013F84D6CB08FAA241E2C9A07614B 5F8F09784F3111760388606285F7FF57A7610F631602558F3496FC0B804A01F6 7C1EAE515B7754A260DC830EEC514178030468E498096276ED6814A0921275A7 53214B3D4772E45B9F25F6F6C8B0D9FBEB02F5BE5C5D73E2392AE89CED29B60A 0DA566D4A6C285E99DB9724FB8B94C70D4A9E7A6B63C8943299AF33E060EEEEC 399C89BABBC727B584FD784D9CDFFF83DB3A3120EDAAD93A074010C5626DD947 0582E82C1AB8A01068A179E313C19ADFA5F3C967DD2D82103395FD0A5270EB75 A26606DBE2F4FF499B415AD8AAFD99A0B9437188DD87665BF143F0344948E545 7C5F7ADA1132BDB614EE50849934DE288E3A719938FAFD11BB7767CF30843CA2 357377798039E6654F151F9B1D75F7C178DC1D745F5E7295D27D7524D37DC63A 4007C2C51BC3E784E53A157C5192135A7055198A667899473C3A99270BE9F4B4 1D055528A1B3BBE8346BB13263FFEC2811B93E04B004BFF9B55C725E3CFB3810 CF9649F56E1E67D4C71B087EE24C66E1F24E18DCB561A1ECC1A59380E72566A9 BE472DD2FE0369E949D44A238B3F44FF66A3BD85C2C6A25B5E89B5EB56B95787 96B4888095E725A5B969A7B2803EAF74920BAFB86754F5AA74ED37E5907E1E74 DD89A828E6F5184ACB4A2E35636FBEBA889D5F086F672851257412BECA57231A 7CB682134460003F1A5A5A0C8007D5E112D5C61DE8648BBD1EBF369E7616793F 06A5C026381B17CFC3D3E23F5CA47EBE4DD5C1A4A7EDCC67FDD259643E4D7354 8CD878A664C1E536E5648514A5BD1B7BEBCA489FE069C95EBC4B5ECEB85F0745 E9DE44608AE2D5BBA8370AC9EAC27C6E8594C95DD4A4BCEDCA2E063463B8665C 311C7ED4F37C30C66665FB5F30C4D008A7924F6C0FC54B4C5ABD289F622809AC 66D65D821294F82DCCA8B46F051890207535E0122501AF5EE302354F8AE2DC0F 1BDAD60F199A4E7C25EEEFB02C74346CEEFFB4460193ADE83301F1E51E983F74 59CA39DD6EEDB0ABD351C372B951AD6292887843B1BFD9ED69401521C9B5490F 7838F1A35E2A53AAB535D3C12931178D24491CC7659DFB2271835A27DCFB1A77 936E94F5B6ED3FA80C169F7F3BB819FCD042033C40E4B0E21426B4C358663741 5028789D9592A77373BC1F2A8AF1181B9B4395DDE110225F3C9E80F9331EEE07 1641F9F1AD5A9D625AF9ACE06DEAD4CA6B860D6DEAF59D8721D438B427B5E09E 05F0CA8F5E08B8AE3F90F26DA6FA2E37E64F821F975D8FB85C243863889F0ED4 68EED18CE68146615AFE57F199E9BAB7F98528E1F57A8389F147F7D02BD590F7 78B19D8898F78B176B17AD337975DF619AD3304FCD82523489D4D7EFE784B340 CD0325D131B237125A13916D9D76527498104715269E235DEE6B1BD6A4928460 B259A9356414E42F755A28E7815CC550F90431044D47CA1312A73D80CE13187B 000CA2B4517D66B756D1BFB8B3491C9268DBDC68671723E1FD5E7A5DC124974E 53493E7FE0706E3A71EB2C1D7AA8AA044103EEDACBDC40EB83C3BC8F63FAB9CB CBB50948DD9DC05DC84D1938630861EF9D19641CE4E285763FD133266C191780 18CEE54064FF14C03C34C67498260525830598ECBC3F53138D4340F014917015 DDCD19539F54A65D5829720ED58554836984B9B23A5467127946945F21918C2F A5350A92141B97415C91465AEA9142CDC15F4598D337056E29AE625E3BBD0E04 63C2AB64A710758507190106CB6C64DFA4041FF31E3A9751DC7A8ACE340D5223 092C0B407E88500D80982020EA50B8CD6B8555758F23AFE39140BF254FC47E72 6FFAAE81374ED9305C8F5AC3CA63A8CF6B9420D88260A89DD0F5DAAB223C1B43 3766CF6EA907077852BE626F2F3598C274B69061D8F5BF657F0FBF6ED6368633 A66477E77AC723EAFDBFE989FE2B8313C086051D5EC367F8B7CFB580E8C0614A 1AC01AC503677A2E2DC96B25D09CFBC9087706AC885D21B5C66EECB610EA1CC6 C84A53BA7B86612B8131A9CF661594915118BF9B595ABC8576C199A4077BE3EE AB374A0A21C9BAC051D3B4C25DC2AE5B0342EEA73B4000684DB4D4525854E55C 9A60F83205F2A7A0EA06E50627FC6FC5FBE1DF6B15EB9E4FDA325889E9016DB1 6A07526DCC388DF038581590CF762AEB8C9D4F6B7FA9D11F7E7A513794BCD314 6539F1BA0DA1963511EA1A1E5B03A936B6524A0C9E8EB537BD3DE2F8B8A2856B 135BB34928991A7E98823C5DCF0EA3A48DEFE2314A04D30FCCFAF2E9ABBDE4C8 0CA1DD68E47A94228E2E482255999D7EC8D203572D8373A8F4D31EBE56FEE479 0B5567ED81163307DC4AE72EDB0DEF98A579A2BB8BA4EF436D16DDF0F1CF3B10 0D78739D5974D2ABE553262DEEB632BA62160C5F1A4D7D3B5BE149505DA76C94 A6DEF62A29C74F81A50E5316019AEDEC573D1581DD058EC4C77CD476CA555CA7 4C55B5B0AE670B47AD562B40F7C74DD8F5CE9D4E3749ECB1E575843641FEC78C 25112FB3F0BE8EA744EBED9264ADEA1AFF7424358EE28B8691AD80A5115E0EAE CA6BF6B9C1EE6A3E3BF3DC46A17CF02862DCC7C76D2222221E256BD305C60D52 AB7D6D6F98002B12EBE4672F271824A3666DF95119D2C9512FD44CDF630286F6 2502E31BA5E6420A79FBB6E7ECC78C00462FC2586852B327A0379F3B8EA0494D 68F0498E34206E5D511171D8AB6FFFD698B21A076D99E8E616539F0F16E90859 0A8425AE7F2E981FC55F383CF5B37A72695BC673B43D012129633F13A93A68CE C541F5CB0060FEA9F808D0AC8C34C148B5A052196AB07A43E36C6604F25C6E3D 53C745DFD72305FD736AC252FBC7367B5962ADF18526D1E7DDBA1972A6DFFF34 1F8BA825B8243F4003A3C742F7853C5DB0D0DDBFDA8581253B366CDAF335336A 995A87624EEE1961CA24EFE8AF8F90564673FBB9C214846A3CB16349D965C63D C69A509C4F71569C95A9626A67F280E098564E115F29920F04258B8135BA6C6D A06639FC787334F561B89598FD2B72DD30246A3FC4C77B0A769FA91A58C18B30 0157DC7A62B7C9D43A58B055F17E5810474AADF5196AF9BE9E6CAEC336709286 367BBA8C573B9E7E9767A9F5DE2E8017890FFD06080B34CE6365EA247D2413F4 E14DB8187142D1EDB11D15472F81D94ABAD19B84B9AC054C44A55EA7B86FEF32 4A28BC65140B676DACB724C64F4AC8E217B4C7532F35B666364265E6BE9F0ABE BD4D96E7528BFAF44E26916B67D5BE6406CA57F86816CA0C9AC3749214F26C57 2C7F730E147094970902F9ADD3AC7B872AE983604F4682618058A82A25EDC06B D50F73CE256E5128E204345D5DAE00C7E8161E4BCEC288014D97DBCEFD556F22 E199BB0F4E371C217EEC13EF945F6F4A7EC95ED96AC03F7B84DFD903C6C68EF6 5D076B2229FEE70B84043950DD9A94B045C0455A4011F8C8466CB81702ADDB5C CA2035A57A53B42F297714972149EAF3C5B26304A4058757A81BA8EB2B987F18 19EB55DC7D645AE5E010C786835E23EF6EDFCC3B0915B564402E1156A917F6FC 38E54D9A0FF3DEE5D76A8690E0EA67365C10DEC5C1B4C1D6A6FAF0EC479A9562 2892B00B5C3C84145BA50B8D26640A7A11DBD0699637CA22BAB9B6560E084708 DA3E503F5AC7D975356D8EC183258E856160F8B318D9D4E6F1CF08136084D549 789A6080949868110C67FAF6AF6D56AE4CF48224EB20466DCB66F4B148467FC4 A41DBB7E457BD8D30D58B2CEADD1BD9135977A7C66064C62EBB42D8BA625E36C B1C3D5EC29C0A84E6F22219C535BF5A494B884F56087BA98068DA98CC83EE062 49AD2677A67F67B811090D1D423DF584D34736EC07A999A3072B3306CC31F815 53FD711EDB9D00BAB155D73BFA062E9640E91F344D9CA584AF3FF795A954BD63 D22AE3BA261494857B095A5B41566855171FE6F715B61B5CE79B0F5EECEA4C57 D64E7B72956E2190BD6AA6068FB11E1650C758C26DA7E8959A7A708325837BDF 83BB8A7760BCADBC673FE283CDC03C2C0EF1A18824351F97E84ECB39D7B7BA8C A7FBD992E8D057B7322BEFBB708BCB19496CCF25004BCCD6C1A824A4B81A5964 C7F83B0EC0C80F02467C245D225CDBBC519DB154F5EF02431F39A5EC4C8A4AC5 FE026CE634AF375B3220554E93ACAD482D16D11CFD48D34F836277902B31B267 ACEFBC6C6B2B9012F5C2D8F02F2FC1D2738B5C1682F5AA1BB34D37ABA82D841B A50F6A6D05846D2D35CD2711590B6EEA0E1A19CDF60B762C508FF717C9A87DBA 1E322F4330A0367D3F90AB9A0BCE1BA1632DC2B47D6B8C257C2510F6D20D8E25 BA61DE4632DA993DA7F18188598F9DF15FCF936F5669B66AAA114032F346EEBB 6837A8B79D496357EE05272226342DD7FA19363FB1053D5B469EE5AC48898AE8 990CD7E8C1AA35DFC0720F3C7CE074789AFE07857C68A62F6DF8AC30928D0BBD A4DC217C6CB96A5D69A1C0740C3B04D3B93E3CFC910FB51713C75E039B1E8F4C C5C0E0BA31E692CF613FB3D52ED4BAA292372D8C0ED46701C8B6D62AE4E9E662 CACABB56D1ACF34CB0C523AEF749729754631957C5E48D0199229107B0B54703 DED6680C63FD02DBBDBC63D8B24E2EC871793CF7D11B1154FF8085DDCF4DF686 54A4B4BD0626035DF5C0D249C963CA35ECC314E59B410E30B6485B279CEAC03C 468EADAF0027AE64C7FC3F7C297812443CDD46E96180643C1116E404D9DF1DA2 9C8F55057926B89DDB6D81239A1553B2002766D6FC7D0D325B3F1386F592AB5B 693EF67EF2E6AAC67163E7882EC75C1761F9039251A6E6B4AAACB38042FA955D D96DC86D1B0ED609A12BC61C1F287724FC8B0408908C59F540170B430FF3B720 69A80AC1C993B6CEB761466C4AAD4D304E4CFEBCE864E32A7C38BB4D2C8FE257 F053ACAFB14BCE05A95FDE53057C1B8B6EBA6D5F25B6199151A14AE7B99A8506 9C03761A53956D1D4BE80F7DE079DCA21E4F24F51B661195E7F40FA2EEFAA3B4 E315BC325205FBE00760555FED46F7E26A8A7F523EDF61792A7B2D399549B4D4 300F005C5A79E802E9FA873DA5791B6C2381A588EFBC760D0F5356ACEEAC70D2 02551F5CDE03B5F75D77D43141E35806D8F53E47DCC421DF1DB6041F73255997 C514E9E5B57B19320E2704F13C0E7ABE9E20A01EBDE0635A8AA32C8BF2BB0D5A 52796F42EEAEB71FD823A5BBB0395A2E3BAA638762EB17D9EFB99E2FE09A480F 211ACD54FB14E5CEAD557C37376E073171977E68483637F5D1D90E2DDFC67933 1C94562915D656237E7D68E625927E23EF663023CF37B768DBDBF679215B68AA CE1D7EA7D1AFADFF870F96BDD0263E006EE0829548E78100BBD22F44FF4A2C96 38A4729495F983670AC6D42837285C933C97A096A821808C17DAA17C6A20BDA8 BDF41471F658353A6AFD1A71D94A5E382F967AB83806FA0F27E78C0066FE6FF3 E9A16A133BEDFC7DCD6BDD329EC67559908405113207116FEE69642897FD0879 4ED2BC801F51BC54564E4B57763C51A6342F70073F959139FD0890713A71F75F 0DC43EDFF3571CB02A758CFC7737B2BEB3E49ACD01C1C81425FD4C3CD6CEE432 4CDB9A0C56E825B40671D0174403019D292012A3BAC2E6BB24F095B0F448D0AB 68C57EA90C6E436C46E1C7256A7CECA22D415F97AB699AB295300DFF39FE84E6 6B8760C88548095F230775FB45C2C85395E0896368A3FB3D30CAB3D3ACF9E570 0FCAA17E6FDCB0084CB32BE4FC608E026AE9D00B46A57DE17452B465CDA7CCA0 9F37C542045A24BE040ECF8B8FA117512866EEBA4BD9FEBAC9D6F483D32CB2EF A294C36590B6E6EEB2AD0E99AAF9703BE412333E1E112332EA2601538376F20F CBAA9F95560E238888336160EB58B4D72872A933C74F351EEC02B711FC021DF4 3415DC38818218B715D0B2C6BF0E5E303A2C6A0828FCE83FBAADEB7F11C01E9D 89D8E8B087CD518E55196423E6E8A6E950CCB88051B2363B5A72A0180C083C37 13157361419829E57B009B9885978309259288CB51A32C53F4B82C7EE17B3FF0 8AAE31251547393F92324E1E1780FDB4A35D3EE38BEE04A632FD30163B17B110 066DA3987EF8D90A43B126E3810011543C1DEE3300606E367AF17CE8ACCB6E2F A4E29D9FB72D94B2B36FD5B2F3FF943DC4654513E1182F6D7C4E2154416B6947 0752E0DED000D8921A55915B5F9DDA3909C423F9AAB4F8DA3BC9548D893EDE6A 495BFDC0CC4968C2523B42D283773ED83F84467E937D64838BBB763CCA8AC060 FC47ECFB5BD11B7E8E0E8BA3AC94BB541E8F3C374AA75F201C1C35D7CD5CCBC4 A7C3D0AD573BA6793577F1B6CF10EFD1DB67BB3378ED564EF021A25FA9E73C43 09B6E28BB3F82AFF04C95C367906101E5F6A5D2D863C1145A5A73611770F8F07 EB51BD6FE6E86D55EFECE06322F6F08CD4618B2263644D4C56E3C6A9F1B01082 C669937B9F2C29E3C6FC7243C8990BED3A918154A9EA856EF88C95A5E3274E4A CF6300957BB9303F92C43389C87F7AEA79C23ED9FF6369153F939F060810F906 650F8678A73852C0DEC5117556EF713826CE175B4C412E8F174F3B84537C0515 FAD4B4D775BF791A6809164532691CBA433A9AA0B887594CD64F04D074A46156 17AC5D7EAF9F14E3A5E357573A6A9B60D133C4AF1FBE0453473A988F42FD1E47 D273ED4EDB45EC33088215D506A069417BECB4CD4A70D820E5388893D0623B55 338BADFB90BA0ABB382F3C066E61E1390B50840D233753ED8493CEC0EA98E755 44EC767709B17E9C397C3681CE6EECFBF847B67796404EFCBB2EAC5B3791C142 BEBDA9906EAC415313338C2EC17787C412E7273DE5B0D5FC2AEAE7FA168BD25B 577A13512FCD302E3B9ADC13BB3849DE7238A212B13F2D5830D1AA005287BC29 462D225B1EC9DD9E3781A013009850038F6612F03579622CDBFF1D474784AF30 DAB069CD8EFBA8BF9CBB85CE2D0C13A3D01DBB2A5D13D0D2A3AB473090F34DCF 094FFBC0EC9F2F29B6A7B153F66E8E5EBC26DA522BF30ABD1EEB098416E285EC 2CF28304184335F6A550444EFCEED60DDB547F91ECE435C30A6E3C07168692F3 E39F7819DDBBB97CB16429E3731B5F3F29E3F7EE54EC029F677DDE8327347FF9 A39AF33AC40A784E74A51031E75759A56F5ADF1D45F534095A30F63D734C578D 89E2CB5F106E9693C13042433C09F77ECF56F791701BD1E4FAA66D69B98575D6 F2B68F2AF39387C73328C46AB335F7E382BAC94A1061013CBAD5F87FEBF64B66 1E25B1B56ED7E0C076D5F24BCD062ADD22CCEB17FC3A8AF80B4EBF0788321A96 F8940B9B428A8C18CA1A29FB8655706B0CB1555C01E768BB064B3518100A827E 1CBC70342673265AEFECDBF853D3819510E182042652D963C3BFE48566722AB3 575391973541ED6305245422607A67F5E54BB90DD649BADDED92AEA52D92FFE2 93A1A56F9BB8C940DD17858A20E64F78280F6FA182447C5A491EAD80E4A53AC2 8F0AB4D8CB29272FE750A43528B60BFF4EFC138AAB7E6BFC4E458F540766C932 76F3E5EDBE6F52201C6F19EEF7C7742F21CFB1800057E4CD42F2B7914DBFB2DF 8B48C32A10579BB786C29EFC156ABC28386F205859CC7391BD1F25C4EC1992F6 5F951F0FA0958A6ED462E222AD9D82B639B393ACF5ADBFE054DEAAFB5EA8C5A3 DFC95F024F21918A1567F53A8D6650559F2BED3AD4456E3A67BF9364A1F8C845 1A3F723BE51ABCCC5FDD74923878AB3FDF1629B843501E6BE9E71B9A6D788B60 4C9721F17602022EB41F2B72B9FC7B7B9363E20BFA9964C2AFC8AB301D8875DD 2A3B01054A3408F44BE9A689E362507C131B70ABDBD94DEEE670BDE0278BA02F 3FF4DE1A9BEA34047340BC805F420D62DF97D0354C033BB016462FB56F2BA9C2 1E351F7B29A16F2BDF53D387F3AEE8689F400D8CEF58725D5B4DA16443CFE162 DF40B9DF87315999712EB5B0C13EAEDAB11230E37924054E4491FD78982DBDB7 7030D2FECA586A1C52415C6F2B654A9FC2B92100E55FAE9C259FA069937F71E2 805C3A1A70414C7B7674313A67637D8CE3C367BFEA98675F13860134EBF680B6 F73F564ADAC2827FEE8DF14654BC3AF0BC8F7B3AA0FA87955D3AEC342B567F06 DDA8FA6FEB661F7AEB4488D9FC85AB098D3B28176D2A04F21BBF35F70856D434 FD906C9E82DA22E34AD6F4F46E229EFD175C0317C9E9AA4ADD801D6FD6F8942D A4AD9D5E236C9F3E13A5426C1A3336AF57F179ECB51FE41F9722AF0C625B4969 BC3A0598BE45AE6E0112DAA0CF5CF106B7907C2CE1957ED8B044745893F4D6C2 E62AEDA99E75BB2EB5B8A078BE68CFA3D352B0664A5ADD6A8951DFCFB0752C49 775C8F65016DA10C99CFC1843CE0C715CA45A4EC0CD12E44EDF8487CB691E3B7 E63DC3A56FF42BABC7127F53004C968CABFA76EC2F14FEC0DDFDF3A81BB5802B 0C539D5B722AB1F6C1AEFE3AFFCBC318F5D6D939BE38D6389F2C2AE1D97E6A6E E476234FF6B0F9DE631C0EAE88636666AF499B0604FFAAB5DB74A13DCEEBB767 AA653BEE93099594876110223BA5D64EBE4CEBD851C1297D3922062D2FDFBFD0 ACB13D871EB5409C31D901803BCBAC831C8B39A603CC408424DE39B5E00B9EE2 111F1C44E7932A50B54C196CCD8AE67955B12603B4A03B65B5D54188127542B8 5D693E13CB03FD7F4CDAFCC10594A9996870F88E65C94FE07B3B4F4D8C70BF05 6CBEB0FC662D684B1BA3E8FB3585A0DEF3694EB05A2BFFE5A98B39AD9B4D2F9E 40A92674EA1634EB85E0EEE31E4AA95860B59023E6C7E0EE6C5E1CDB8F7DEADE E0224B3807AACFEC0CB9F67B126715A6E6D46FFBD05D645ED080B2E8CCDD8A25 A6FD19A7120933C9B0EAFD734E194BE6A09AEE3A786D34813B085BE847FE13AF 634617E16D4884B85BFDF8A651A0F88D2D41FA40A02A30B4D16A15F3E942A28E 8A481232312D5EFA307DDE55323A4426708A4F43C4841D34B64F21A976C90CB0 5C0A434EDCDDE9ED8E28236F28979D0E64C9158260BA1DAA1E1C751BF5057D61 84904E90D07D4580E1238CEB0C039AA6043FAE0599B21E15313F2F0D7F57DF3F CF9CA5A5FF42BF5A4CD8F9ADE2350ADFBF8F61729E9026B048BF615F2A192DC3 A7F1C09841073BAC1FE11C023B52F45391269DE01B4121FE499DC29BA4E49EDE EFB94640897CB5F52830BEB419FD387296A96B8D2AAD4CD1A858FE0C19D41188 B2198B3F3DF919C0FFE3BEA5A82898BF07C510EFEF353B0F812B6509AA0D4BEF 8A71996D6A251AFF6DC44E18A4A5614691D409E9579B42963C2158D476D0FE07 826807BB91B87F23EF18452815588E81B361F6E1C905D6E433C411438AECF14D AA5FDFE895AFDABC4176E69E88BAD42FFF3F108B1BF69B75F13BB9C8D9BEF684 E92C53582A733B3106DBF1B39BC7BAFA892E9A1D3C9EA9BA593AF1F87BAEBAB1 D1FAFE5B5FBAABF1FAEC616F30FF29BAD9534DF12ED5E49E9EF30B292D1ECFE5 F06D13097CB90681D81566D8FF659456F282EF539589D173EF6A8A0957A99989 B756C5D70581D4B2169AE358861FAFFC75D21D4F72C4BD05C7F6F45D1E4319C5 6F64B1AB1BC6DADCEE62DEDAF9768BF9233A39ADBB49135FCAAA59DC2F072F9F E1A5E4804BDAA139BEA12FE723664D922931A1AC6A339F598B4F1B7FDE519551 99C264FDF96B4B09C6A3740B8FD0CC955D2327558B61BB199F2E9A32FB92691B 25098BE2DE4E5916352C876C418349D3E01136CADE0957CFCA6BFA315EAA49D3 16055F12C8521BB8CC8D8F5710DA2C96FE4B1E850BA02E1AA7E9F242494528E0 C435A4365341F49C100973E505C31188139911A67710860AE3205E7EA6DDA4AD 65B66BB4C9C09BFDD6C90AC01A114EFDDD71ECEA2CFAB9DE25D328119C0FDA70 7DBFDAB705690DBD13BB237B66740C43E3A9D7D732B30094DE20CA765A48C6C9 546DB1F7CD6F9BA8A570040E44AD76F39400D8BC500CBED3B02D9753A8D59D02 B0D43A163B719A03DB4054BE3D3EDFA19ACF53DD5CCC40B81E20096A865A6D23 DFB072F73E5A4A22C49D2B48F1F3BB2DB772E5DA5B8AC45DF43E969A431D1605 BACE93EA73A42116107C13023E22EEB0D58CD154C3499C46DA4B79641E3D14A7 066850154CBDCCE8E021935F0EA64EA09AA7D132090F72A12429E671E9F2597E F7DAC7037408CEAFC1427816ABC7A6F1F6180103A4A41D54D153BFDA589ABD9A 1D03C7A6C8421340B01985255D26578872765D6D791332C8A02BEBD3DBD4E924 F1C35FD353729A023E3A09850871CBACD79C80399DB0CDFBF61F9A02AB98B54D 2100B88E64658985FB4CC2C6E5E819F5B0BE3CA5E6609F9D22696CC244E6DECC 8DC729A9A5849FB59C7A884DB0F71A74B8644A83A8974173CD60D1DB89CD1FE6 33908B73080E34A81B7AC87D90E08E60018682D6FC39BB1BAD83E83A246D03FE D40D51A852DF2EA9EEACCF51AABA5D16611E5879E13D266B70BB140BDF3BEF7A C820D11941FA506FE934C4746157123FEBE6D71CC963BF8C82FAB0F641EB1D38 BD434664E9972D30D37C6C1D763A2300E50459FF302A6ACB82A05712E9895871 E0310460CE05E39EDAFF97A9755063228FC8CFBF855982EE209D998877A99F0A EB4C44B8E7E959F6CCE08F3C979BA1D99A08E96DDBD6D5457972FF6738BAC0D7 8AAFD3B0D6036661C68F34FB1105923329A5386D668FF667B0761A3D3580CD98 127D35DDC77817C3B446576337ECD307B16286A1E92E96046449A558A832E9CC 5AF249292EF4D8FED670F23F86D3D164DC460EEA64AAFF4B727A9A80EE488431 336E54979C44B7FE88043CDE5DBE2DE15A410FC012CF7E52BB7DDB612D806C53 36335F217F0F4B8954086606DF3E55F4A6919A114D5FB20885E5E116AB5D428F BC6B72813882B964A2FAA9C1E7453673DF9EA2BEB49574C1EF4DECC20D43BF60 AF1D25EF420ABD1987E2E18ECF365052615A2C5ED7AB77C3AF347C781DF3752E CC011F47D2B6005AA5D5CAF0B62E4C9393695CC68626D448D1E01ECCD578BB40 87C51C25F319925B7BA3E62E9EFA15F9DD32CF9642EB6A9B8F3FB92BF3503735 1C1EB174017964A71F45F56CE31D50A525283AE077DBF8188BFB194B83BC7A97 6087CC1D0FA8DC92B97EFABBFF185150691DFDD4FAEB99DF025FA7D36ED0046E 21A2B0D2918920DE1990E6A355C255EFDAC6AD211D828E6A905EB7F85E612CE6 F5070F40A2622398A9377D6E6691CA7C24BF1F5BF992CD47CE5A39B66C412CC2 C9FCBD828B48DAF6B3F8FB9758BB5758CE7204B71EB5B50B2278231C0FCD9038 EC3450028AC94BF5D4E272EF93CC95B4AE9B5BD6B53A9282B4D1935B3F4231DB 8CCB812C6A407EEEB423FD1131B1A679423A961100D796D1300ACCC147835C11 51BE221E0E96F452E7BE873D877CEF33050D32427D793D2A22A4F09719652CEA 332147C7E17FE9CA4CF86F69255D2543EBF1DA9264E0E9F7328611004EA88286 0BCCCC4C6BE9F8CB75349FE50D9C1AF06704DBFD658BEB1EB57ED33BEC1D7E39 A042A2CBF00CFFA65A9B585346F7B35A756D8B76554CDE502B0319F99A4D8DCA 22F80847A1973F92FC169BB49A92049D3923FA8E7CFBEBECC6B1C7B07BEA3EF9 1DAD522242C084B8057A71946230C85A5060C9B13CA0FE12A682B3775751CDCC 8539E9D73EF169BFDAFD48B03409E80BF7281E676571E25C1A440789C0FF007B C6B01309BE7750223B09B238420A2FF83AC9724BBCAC63D013B287EE8BD60834 8C7E02753E6033AB055BA7B96B4BF9759E672E9EC916484F592F45FF1AD1ADFC CA33C27AC92A6E65D5A9925C53BF35315F5B2BF05212F769AB51F1746A04CB95 AB47EB0BC78804F7EB542E30AC3590C1A761C1F1A852FEFD6341B3D4496D8DAE 94E54D4C8DCAB9A29BA72DBFAAFAFC13D5B225F1581881AA09AEFC84341258C7 DB6FABDC5E4EC79F14724475D19B4D0122F4848A8FA8F1935377F3200CC34801 89D3058B4EFA5CD5A93E1EF62EEAF60CD9428CAF0EE2A9061F173BA13C93FA1E 9E7A2DE78FB01B079F9105178FE3E9E30D6E49F9C97464AEB456C00CA77A1FC9 EF4607666ABC9A343193741A1D5DD77D7D5131CE911F85868756F38D754CCE80 B54853B918555AA9EA6E32EA4B71BC600D45E23FB86E551A9605642A9241E567 A3BC5EED4403C722FBFC8AFA4F31CE940E5283F59A7C7A1A796704FCDDE1F7F1 2D2A202DCFA464233E9B5A83ABA168E42A185FA27B99E6D2440BED9B1CED84D7 BBCF686C0C5FAD3F2888F60D93EAFAE0EAC1A03F883DA3D9375B0C4C6BF9EB76 59A778765773C1B4B0F44B1F085BDACEF36E93EF4F9EFA3831FAD1C25AF29260 244A233002D98417FEA10E10785D62D09BE81A78098C5F68C5C273499C913E44 B71C3E0B09A1F1D7B1EDDCD7102E301EB075707292E5C5A6EA04FC491B5BA393 1071211354FA18E97AB131D8BBC3DA2E199CA372993B7C147FECC74B6F38619C A519BA0DAE89F5E8B4859518FE1E9F200BA9F8157F49C7FE174CD72468FDA5A4 C4186B53622CE3A6A370698B5ACEF239C469EF02C6F574D48399FD60B10B8B6C 6AA1CA4D319C31D1371AA8E22DFBECE70FEA5B0BA2C3B746EE6CC33EADB49025 B010DDF30FCF994B2916E2DD2C469B89071DBDF2A9D564CE64F8ED65E5F8C165 CD0D254D33B21279C32385D508A77F04E102EEA8229FAB6D9A4D0F398EFE282F 1AB0F36B3256D45E6FD9C1FE9DC1202944619511B5B0AE44B29AFCA2EA946373 198D40085620045E3E09DFBF5FB865418FB8BAF7F86D2B504759E9CB583B5D97 88CDC051F5D5D0E9399969783B739FA4C07CEC0109F87231206EBFC60CB113D4 D63C319FD3A81D808C3236E2463EDCB303BF13E6AD155D1244733935CB36C99A E2D0DDB902472C5523A375CF3596ECED438D95F9C64D4F73A81D2BCE502CDC6A FE179B6C628BBE87506B6EFEA0CF60B1A90E6A0C73084ECEC767FF4F9F3DCDFF AB7CE0FE1A1E5064A232CECD18B35786CC5B75CE421C327715F4A130AF693E30 7B73C73AA4A3D4BEFA262D2ABAE610363A38B848E66B249567B5C14BFC4DE738 47A5D2BF0460D45441A7A18075FD29C0BD587A39042D058C584E5A072DF3E190 926C4FB3F524642A11F9E40C28CB3BE5AE5FB2A24F64E0A93E467EAC4B4AA8CA 8345463F63813076EEBD1CFF8A5F19B58883F5E707BCB77BC0DB4D6BCD4D859D 684B8EF899BF4BA2986C7FF6ECFAB6EDE3818C8D1F76DB5C6E5ECA13B57FB5F1 8C5581454F3C3742FF913FFA802C1F11CD5686E53931903B13D0E3DCC55AD82D 0AA643A9309516BA76A98C7FC370AD017FDB7CFF570E7BFC592B3BCF7EBB864F 261EF56FAFA6E5BCB1B46D17518C6F79CB366BF78240D8A00DB58D2087D646F2 C8CD9998878691704306DCB384B5EDFB5634F519C1A10DF92984E524CA8BCBCF DD3064AA3C4211BA42411778A6A238EEF39CAAD022E2F711A719E681EDCC3A90 5E767E29BBEA0B5D068F38AFDBD3B0C301944DF190765377EABF2F34F57B409B E914D95B4A4323726470879E2155ECABBA4DB8B059CF61568025A5F126BF5B73 BC7E475C56DABAD1EBB94B80048B36BEA0263C15C636AC7EF24493A0C06D59AA 34CCBDC9FDEA888DC3650DA3A8AFD8F627424B5B3BC91E43F2C66991387B1DB0 05044883A9E28527EAE03FEFBA5F96E73A77BABC2083A0581FA4D5F0C0EE2E0E F96ECB67DF7549F4CD9B86DD27A89589619DF17DD053E50FB3A13FDBF1C6123B 8D74A9CB9B4BB8E72CA7684FB786F5ED322A2E817FD9B30D0BBA4A1BC78828A5 8BDBC69920E28953BDA3403FE1C9AC4D89F04CEE35C0B418E0D06B8F1D2E0E76 2F1DAAA1580F3A11D05C8B6DD757EA44303D4399F1FCF552D87D268B97416F04 04C0564497609B4C8574CBE48108E052FE5EC58519E6CC27E6068BD991618D46 0E25B58EE7EEAA9FA8A270F9B15763F62958CC0C204B644A8903D6E5E840E5AE B0741E45AA3FD31F621061832D0BE4E6D43EE0FCD12B62557C4BF4D1284078C1 151F2B5EED8AB060EB642178991A3A4310E98C20E6D76ED7B3C7727FF3CB5D8F F44B28C751807B608483E46DA4DB616A8B4D646DCAA8C84A219838366E8B70E4 69C8D13C3FB3CF998B84796A410517F312E93DEB9BC595E963706C6C711AE397 41AB55C516DD7F13FAF00EB0DC73EB2E4161B850DDAE5FB56CE0BA9FE02F0C7E 7162C7781CAF8977253794808829069A85CF8A005002C06D67C7C2011E88F000 D91A1B88ACE8D6C8C278A3665170E32B2ED57BAF4197E5CEDB44ED833F171767 F049AAB56ACD009A952C512ECF1913B2E6518FABB42FA263D3A03C91C8991E95 92D03D504FFF10672E27B9EDC2CE962266BB836206F14C380898A9F49DB59BFD 570FA7758A1575B6CEDD0B6149305A45BA65D9AE82D16F0DDF364D2CCF155A8B 83FEB471FA3840F7CF3AE40DC2BA1C360590DC55047BA4657F058A5BBF928457 5A46798D48440ECEE07FB63D830E8918399E48F8A86E30E49A7497F9C1EDCAE2 B80FEF452293A4E2F5C395561FE56C85E283C299BCF383200830D08CFA7F75B5 E2D3AF657511DE9EDE491373B7A2586D94B481034B7021EA8E317A492D001150 097958D6CC340DA65EA2E79C6C655687F461A727BACC5B4205E5DEAB86719083 2819D00D831ABA1B285D0B1EB6383D7E7674B0A049F8625DDCC21E8224CB801A 0D4D3656B4F67ADB4DC0555C292536A7DE7468DB4930639BF920990A175C485A B49C81FFA05EB2F993781FCF57F1CD4A3E51E5E994CD0D0D4450F18B7155748C AFE2FF4218DAC797B4ADFEDB73C021367B956E4EC395B5DEC1C05F567CD14017 E6DDA31737E88B14A7841260B37F8A6514761E73660A505C71CAD77110679577 C7EC6512B5594DCB848BD98796268509BB6D1861EB9338C13F1CABC876C16782 CC9960D1286384BEADB80461C1FDB35E1036D1A720A7634F14DDE0095BAA2A52 4A1E93EA5B0E796B86C3E1427AD84C893FC4C8B41640CA968F47688B9DA100AD 3B049F43CC6D514F3C8B55A65541EDA48C3BA78423C9CC359C4DCBBFFD915C00 675F6481F2F3E5861A5779502FC5AC4ACB830F840CDCD065392EB1111D7B1737 36C4497DC248FEAC5663F1E34510200A9BDF5094660EE021E5A65269EF1DB816 6BDFCE1332F0B8E92110CC9FDD4E4DBD0C429717D0781B9CBA4D59B8A9283475 8DCEA98BED2BC591D6C8158FB77668F57BBF51E3101BE907D79368E41B1D93BE 7CDD5DD5C6A63FA1C003CA19EAC54A4EA9D270327B06577CA66E661A309F8592 9AC52ADD3E2DC2688311AECD32714596A6F4CD295B6B00D40C60F68FA248A7EA 6AC019E617AAD05C1A4F51EF0D5205F9E44D43DBC644CA86BBF0856FB2943EA3 2BE9B593AC5FD883837A52A2D56C93BC68D9F71615BF2F3E3832C261576E0050 664231918E150E14EFDA815B25CADF419419D2A0ACA64278AD53C8062E5E4D93 B3B28AEF22D5AC04736797E777F77427CDD27E490B8E49E32B3E44974D8FE1E0 84124D0D5B3E330B8484F90DF31B6329EED8C49C2D920836DE863338DC99CAC1 322D4E84C9D4920B0143DAE2487296B7ACE2A4F65AB00AD83D2EA8FF5090F034 DCA1C2D4127386DC82345CED7F49E5937E9EA1D08AD0C656F3E99B96B49E4942 93E614E76A31EB08D354769F4076FA020D5EA43E2BC7247F8D0B14E269ED7CFD CFFC0FDE96ACEA2C05C78CD10622446BE550D77119128D5486A27B58EEB433AB E19AF5FC08227EC6C4E1E609712E3A53AB7D1D6F6B659DEB73D5CA2769D95544 94E5F667D2F1BB4098E538583B01D9DCE17E6089ACE5B8864FC0C289EF0A4450 FB7A38276BE89D28B6A49D4CA2C2A46594A05C11A1C44485E83F23BB94D96918 81FC9DBB25FFFD13E7D2D5332AD6CE0EFCEB51C3C6C8C002C03C331AC59F3D59 4903426AD5F4FF698DA7C0BA9727DEF445F4EFB82B7FBA6AB6451BAA1C50EC54 4CA895D83968B08DB0C87ED9267417335B2B0B1A7C67C3FEA4D258975E014D00 9225D64A3367F043C31FADA024CABF7DD81CF7CDC61AC9ED3F7B23D8C139EA1A 06085BBB31FA3647D2B00031A2D6A03BDD5A333094A8D990142475842C70F252 7BA79C19B052D0D3AF521F5EBA783534FDC13B79958BA37997288D35B1BE390C 306ECBC2FDCDF94E2588D3859E06A8DF68FD243786E1EF2D89DA578024409287 749E2F9C23EAD960F20A6FEFF7FAF5E2AEE4ED1C7FB672C18C99254B3FDF4465 914EE23B81F2F73E5BF2D71BC107482CE1F6A3844D05122DA40516A6F022F6CC 46FE2AB54F5DFEFA84BCF4A3E156F21F782EB05254FC993C0846FA87E9384746 DB45C44CA255DE03BBE6E3D05085A5F5A9BD65EFC9BF16D2E9F4C8D2F0FB96F1 2738AABD157BB4C3B68A2A830D2CEA9740C7FC4C607F8E75908126750041D7EA CE0A231605D53F70AE53D64ED8C024312CA5529513AD3E730C72E517C0B3FB3F 7020A066FCEF40B0370B66A6A280A70D9DE1462F61728C17AC09F084E338FB2F F22828BAD4BC659736A88489C35CF361DF88FA0DB0890CF18F9B7C42FF7930FE 973869A7A4C5DC2F084D551DCE78F764B64E0E0EED3B13E61234C61F1EAF4979 BDF8C248A197EF27FCE04856378183084243131C8E6084E4C1AB41A56C7436DC E94FAB78EE4F6502F7987D3B29988CF18EDD555C1F88213ED171B4466DE806BF 10CB7F5DF4CA970C1A94FA7C1BD0D1D857261CC4E53792CFD5B4879C8EC90F24 D6B8BB300E211DBF02B371C0C2B1B56409B9A90AD2BF27A3F05FA6157321ED75 5D60348CACC38B0F3E2F15E88D7314AFC264F72FB1F3D496EEA6DB1E923CD2BD 86D29316BBDF6F8212C0F942BA3DB10A552D0DDCA52709B8B2F1AAF9437CE9AB A483B159183009F76A7C3A3B659B654565D42144B402415038F4EDC586762777 665D33B45527BEE3D45B4A75CA94355C07C4BBE6570F90E1D83E77353E46C7C6 BC97D04CCB1E7A2F7D4B32045E13B0DB4012C9EF4505C16CB298509CF9608A36 C7D84C2627A2F8932DE61DB064DD2E239ED42C2530200BA26BFFEFA82CB1E291 3B766CA2BA6FCFA6803B3029C48168CF5AC13B1A8E6AD9BF7FE345722F0CF978 75DBD10FC1D71B74073829454B8175772238203A96CB4EEF045AB5DE665520F6 C5012FFC00527AAC4CEB83DD8DBFD43EDF881D4639D1F050F066A34ABFCC14BA EF2C217236893BFD2E39853DD1D3B4365B57DCD904B3804BE0A72AAFE7413E04 266C013CBDA829373E0D4E2768123BA2EACAC5D7C21C6E31817AC0E27302F171 F2F05A9953F5E062CD2CAECC67AE9A4914876900D38DFBBF39378481BCDEAF2F A74969A4ED8119FE5442B242AB6FCB66F16954E70D03AADE7DB62CA911E3C749 1635320B50782C900B06488B61A231B7CF5335E113DEBC3A67FE6457A3523238 25E5A7631787CE47AB178F60B17B529D50BDB1770506395D0247EE21D8207B2C C8F32DF741AD7BCFFE1FFF522F5406485A150A56287B985919BC829B95B4482B CB335D3F88855C6F1DED25D759C764AE902C7B4C01655E130A44CBF522D41FCD B7E3296B0BD7BE289D4F3761F55A6B2709DABADB4364E256EEE18AB15FC470C1 C1005B4A17E88D4FC3377AA271124D9FA4DE854FA9C6422DAD2319E0B2825603 BAC6D86D81BCBF6F1B9699E9D82301571C6DE01FA2624A8D0F2CB50F0B205A39 293CD8F62D94C20CCFD93BBC5DEF7F6136EF4CBBE30C84057602DF47754D6F0C 008691E32A110BF58FF6503D6D04BBFD6267668ECEA17812F85B791BAF9537AB E6072FD2C9AADAF36973E051D074EF26D6CB300B0C5D8718020C6D6DC0E753B4 4F6E7E9F55498A071D4F1397B40B43BA18ECB5BB2B3D4881D5F360EDB67DD107 B5F964A22AA8FAC7E592AE41AC992279C681AB8BC8D4FEC776694F6301D5B6BB 15F27F9F3FB039C0EAC24D9512557717D150F55FA0B122D7D2C0CF2D6D80FD64 23A1670C273EDFCE26AF6B1C2F5E14235B1F84D7D94493DBE43CFE4DBC65323A 99978E1CD35602D823DC0ECA8634A6AECA5A888ACDB83B6DC994D13A4350F043 AECAFFE4794FB6F051FB8C64711F1258F2595D940D8E6DD62934199AF7F94937 F09091FD92AD0F37D228A5912CA617768B4CC046C3EFEDAFFDF7ADFF4C259066 4FBDDC6FE2C37B4149C5A9C278CCE451D08479418133C6E7084CF5F9A4F48BA9 12767EC93F2D92CCDB25CA4F0038CA3BE429D70C13F92E99653638EC5DFD9187 CDFC58F476883A30154EE3129295F5FD0F6794982B7D692EE8D1934FC9A1F7CF 73943D8EA3833BE271274D5C37AF7BD2918B21B4E8E5BC8D10C97DC42B423EBA 849F68E22AE59A8D5F7E8ECC2A86CE778DF95A16BE4489283183B792A1035721 0C1EA8CDCAE6A7E37AA058F82BAF24257EF081E8F0E3DD9F8E649FC3C4EBF1D4 3B0D0DB5A2B7E25A33A047CF87C2FD279455110DA8E998F196E65327DDD0D22F E26554824AFB95143022CBFD49C96D7E9996D9AB6F973999386A62A3E70D698B C09E0DF0D381C0EA586348D4AF80DF4512FE8707C02A1EEC52A7F3A80B3E77F5 2C6CA8CB001813050642BD9A615B3C9D3605B5EA0CD388E3420DF9089A850E6B 5D9C48C24028AFF7CD21E3422A0B4A2AF28B92564B55D3ADD8863A72559AD116 6B6D2E05BD778A9D945BAE33FA762433C72BFA2808A1EAFAA4A4E29ED940E90C D8925B098A5766144442C62D0FD046B338BA1D396ED7FA55CACE381FBE893A66 AA9EEA49D5FA7AD9F622D8041F70326F410D01C3858C334C334DC6470D06FE25 7BDC47591764E658A89783C9D06A419177F25BE223C381B8EC3C8C54B072F73E 5A6FF73B43F1D5EE6DEFE6056EA400248B506674B7D5FD32A9FF884E16428ECE A4C8EFA950453F9203763C403083F6CF8A14DB490B4297AE339C02C0E4989811 1E4988FC15E3E63313C6E110C63CBD171E7C4F4A97719CB879BC70DE84F5822C 0FEB5D0EC1746B478194C8F9B8F022B3E80A87E4AA2F91E21320164DF593AC74 38AF58EBC5C4C66F2EA450370D939C63E758FD7C798D13F7C38BA90965B6A1B2 7C7E994966E6EA0CFAA65B587440373510317216DB6935475826F45841140307 9F7B9BC9186161EFD6654F21C92263BD9C3384355AE0B6EADCA20794D721B059 6581B488C4BDE367261CAE888C756187687DCF62F7B8204AABBCF63E70EFC865 C68B37D757F781437020F25FCB3742314E13F8197200142C70D993BDCA91E4AF 5D24FBD31DD84BBFF7AB50F9E31C71A08EF5FFB07511CE7F87ECDBEB4C68C44D C9B90DF5A8D15A4A87148EE814A169E5C1C5ACE80E018D9C6E5538274A98726F C3481E4FB26D75000FC0CB9D72DF2FC3B54F5B1C0FAE63FDD593669607E864AF B1E9EA94A2F39CC7A6EDCD40D09C3BD1C7B9917704CE7D55DE5875058D874D1F 0C4A3540127A4EA7D22C1815277DDA0FAF58D0EB6B285BEAB4CE3F59A81B1A70 33532E046D4AF5417E7A76EFAB28E67B7AFB9A54C27B6A089A39131A5A226462 D974A30EE6F8C5CBCAD6149405E2BE9CFD52A5D5B7B1040BC42990D2D7674A62 467E04F09E1222C1486034BD261B5C45AF1D6E795E6D9266FFD6DB566782DCD7 C90685B347CEE38574D333CC28DF3BA83C86D9EB3C73FFFABCB72B6F17A63829 8482FEB39EFFB3203668BC5144127D87935D564FE2970E09D52B1FD8B4AE45B1 77CDAC8E864EFA27EBDB0321FEBE55D57B258AE2362280A0E1C007FDFC219E49 C2F4D2C8EC2CECDA0CE95C45B67EB5EF7CF57B8FB4473562E67BC20B237B371B 6840E134805AB2E013CD2C9F6452574F1315553C8F2FDBA733285B20BFECD6B5 86C00188AA9F452176D75BD8C1FAFFEB1EBBB65A482E3B7644C9CC4583FB4621 4AD3818EC2AE95168986034459E5115E639884FC4BF2F3AE857E182F74D9E596 6733F0FFE6DEAA11847CD16E6248D632C5A280CFC6BB8B6469470F55B0A87A9F 7BCC101234F63E772FF67FB1586977EC4CC46838881407540645FF66168961B7 70C25935304DBBB746FBB62D9678314D59D0904F1F0D4CC32AF6D357FEB6A0AD CEBD1DD5E7D7EB5F01EC8B18E4ABD81EBDC18DFB91384C1F8F0BB5FAC5DA8266 67201C48BB673260051551F7003910587A5A995436837CCDD1F9D1856A8E426E 1704DDEAD2557055FEB705A9C6A60C0CBF4B5628EA32B362E1A566F510CDE856 7506554334552E044FE911F093B4C41E9A5A7186714CB2C48968AC1E1B3C0F9F EF7B269F9B78B618B457D710C2B870B2D077A5C01FE777C99AC556531D65CEA3 00542401C33BEFF201CEF2DAFD183EA8227DEA7D1E4868792D7770B6244F4D7A A1B39B4F992DD204999B5578DE46E01D9B67EF1DF6E4A90692E94169D6655957 2FE5BE88C77FA835E7D050D13E4E327D4923854A793540A15100718E2C63175A F11BB71834A979BD05B66898DF7992F837328B94FA938CF5C1CAA7651E2D3362 2D7072884E6E978CB8E88E1DDF1548235173DAAEA9DBFB509B89CF1BFD5248AF 8773AF0539A38F09ECB50445F3172EE5773FAAD3B881C06B46453CB7D08BB51A B0758759EDDEE26E3B3F496CCBAF54912243E3346A408B3E47BD4E513E44216C F8262FAF33FE69D9812B0FFDEA27436E8B2C00965BDD698C65A7E4D62D26E97B EC3136EC4892A6F398625C7F2B2B3FC18088CA9029DDE439D6E65EB83DA4F8D5 537C2FAE665458054A88EF61808B0B1067A1B94950A14103D67312E3BAF409F1 3C96F78D02FA48D1F3659456F282EF539589E32804CE3FED8167E11D988D9C68 3F8F49AE2468CDE060F6F4A44796D39131C20556BB73B9413F19B0BF5B8AC6BF BA96BBB5B881D178027FE9C9F6696BE85AE84427D16ED2FFDD22F1B588173946 5F3C5A868D47105C634A4710EF5208216A1CEB659C973D52B28DCC681DE94F22 EC8E24A49688A0231278F4100C3C057604D0E54BC754E6F60A0B5B4C2645EA2A 54762D48221A8D5411832208CFE6AA99B3355B9249C762A6B3FA94359B209ECC 6141DB18CB60FDA6E331E8406830D0B05CAC61176C85A4612E9485379357AC73 12FAC9897FC3FD9D1EF9CCF6B794B8CEE29E2C0C779CECCFE68CEC17CEAD70FF B19E897E10FF5BE4CF9A8B8275E568DE73CF7CD9D32177915DD5857A515189AF BBBCDD6DAFC167E1269909D64DB03414072EAEEBEB694B2905E79CAC804E5A18 D61436B423233CAF436AEFED9E9E949A3F7F92DF25DD71594A0A522959CC2A0F C31AE0D34C4C09973C809C2A7F48C1606122229FA5B3F2566390402586AA205A EDC655DA06E13F747E0A9DE039816176B646FB9825358FD9B1A6B09164D436E7 E3387086447257AD45F116B0E2F68451E7AE32326F8ED93BDC6E1D5DFF84E5FC A885B2CD109CFCDDE285CF51F18541BD3F18068078D3DFE9F0F44D7947AF933E 7C589BBECA2C10C81092F0FE9D53980EB5E32E2DFE6F5A7104449ABC3F253EF2 173D6C452D3BE5CBEF141171AB3998055942A063AC45483C095B4ED51810DA04 C80C539F1A311E541C653D5C34973A48393E61612DD65140CF9BAAD86CD809BB C8629F15685BF1EF3F8685EAECD16717663EB29A8D85CE81DE0466CAAC7083E3 3A970324EB2E1A22A6AC1E033DD3CE1B2B17BF68139318B12DEEF1DB5CFFB2CE 0E0606AC8157CBEEBF87F613EBA248C82596A7A1BDDF086D3D26C477D90EC7BD 46CA1205412B961DC88DE1BAB9D57050249CC60459FE05D1B68A9F511E21F499 1AFBA18176220CA4DB8C569163BB4DCC30756AE6B4902CFC2180E2AF6B7A776C 63DADDCD488C1C0850620C74F2E75EF99C5277E6A9739CC7EF4CDFB4553E5646 41625BD4A6DAD3CE16911840D60FB5DF6B0B4A7D1FC6846CB027E2CD6838D595 28121D1C8938A698CEFF323DCCAD59629A1A80A3A4FDC890E5AF04ABEB26B707 A3CA5F1230C3B8B0A71EB8E6F4832BA1C84FD1A5D8A69E7ED966913C768ED72E F4E7E2857D955D8941E64EAC7F51B405A4AF0A20A2EFEB24CC00FBC0B0A2348B 8CC209413FE9BBD12B2D356888A6E6F92110EC9442C722110A59445DEA7707F3 85C88BAF92E1C8347543ACCAA63428B5B3303A1290017CBE088EE788F71A8959 B0F47961B1001FFA390B907FF97AB43AFFF9DD2D1E2B9E4FA2B4CCCCC285ED4D 20E9BCC4B5ED54F00B5AA4456A1BEB62CDDAEF1A39FC3426B5285DA2EE710173 4DC541642CB816A60DF9FE0A09C8B320CD14E45AE98CF1F96FE562AB7D2F7DB9 1508C3F3EAD47B1AFFE4FFB4E381C2587D2C48AA89062A67E3F1ED0DCB248EEC 3B3C8EAE3E7B91F2285D5CDF6E453AFD7421035DF0588EDF093A60E7D4A87E2B 2661483F5EDFB03AA0732886559AEDD660EDC41AA0D1A399D21C42B257B9E460 754D8201064613D8DBBBBE7B32EB20FCE5FB74DCD8056F8ED2159E1C22F12528 6385CF4D94C605E32306C59BAA8AF5EB61123DAD18B7E55618B0AD3ADF969DC3 901F72AB396867AC98AE2871D36C15C1B4424A1E2DED421FB6C30C9E0D77947C 17695F4D2998CC48A666DC29684081F9EA1950627F0DDF41B89251E8A04342C3 F2A7450184FD356F458E83A210E65DC1B0568FB126ADF12E66B1B5DC05B7E85E C7C1B0B2A85823E7169D5421B613E9211FEBF42DB436C9F65379A8CE1CB91ACF D53835B3CAF4330BAEE5BCBDE660B8A71E4FA9D81E8C4CE8E91ED949CFE97A0A 0B6F807DC4E21F9CF5BA897C6D3EA3CA0C8B5252CB964762270EEB1960AE2212 486D85761308FEB4945E10BACC25CFFDAC699058DCDA7D7C49C0D493133C13C2 E61F18F1C0F5757CA41A020D01203EB032C13DAF412B353D20AF738BA6825BAA C216377455C25FA3EF8CBDC06696D33803AEC2203527103EC78852807EED10D8 33422A4388FF5B7348C1D87712F68147F11A8A45E492F4CD00FB32B4BD85DE2F F884DF6A6F6716C2788E9E1F4328E4297BCBA5C883538020383BBBBC04C638CC 7373BED70C70C77E9C3727084C3240650A204E9D919193170A213DEDB257D03A 147FE9EF0563 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont TeXDict begin 39158280 55380996 1000 600 600 (shishi.dvi) @start /Fa 134[51 51 70 51 54 38 38 38 1[54 49 54 81 27 51 1[27 1[49 30 43 54 43 54 49 11[73 2[72 1[66 2[89 1[76 1[35 2[64 66 75 70 69 73 8[49 49 49 49 49 49 49 49 49[{}42 99.6264 /CMR12 rf /Fb 197[21 58[{}1 74.7198 /CMMI9 rf /Fc 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 2[39 39 2[39 97[{}14 74.7198 /CMSLTT10 rf /Fd 162[28 1[28 91[{}2 99.6264 /CMB10 rf /Fe 133[52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 1[52 52 52 52 52 52 52 52 52 1[52 11[52 2[52 3[52 52 6[52 10[52 52 1[52 52 52 1[52 52 52 1[52 46[{}40 99.6264 /CMSLTT10 rf /Ff 214[35 35 40[{}2 90.9091 /CMSS10 rf /Fg 133[52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 1[52 52 52 52 52 52 52 52 52 1[52 11[52 25[52 2[52 52 52 52 52 52 52 5[52 42[{}36 99.6264 /CMTT10 rf /Fh 134[48 3[48 48 48 48 2[48 48 48 48 2[48 48 2[48 48 48 1[48 97[{}15 90.9091 /CMSLTT10 rf /Fi 133[40 48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 1[25 51 45 28 40 51 40 51 45 11[68 66 51 67 1[62 1[68 1[57 71 1[33 1[71 59 62 69 66 1[68 7[45 2[45 45 1[45 45 45 45 3[25 1[45 28[51 51 12[{}51 90.9091 /CMSL10 rf /Fj 134[56 1[56 56 56 56 56 56 1[56 56 56 56 56 56 1[56 1[56 56 56 56 56 56 56 1[56 45[56 3[56 45[{}24 109.091 /CMTT12 rf /Fk 134[48 48 66 48 51 35 36 39 1[51 45 51 76 25 48 1[25 51 45 28 42 51 40 1[44 9[94 69 2[51 69 9[71 71 1[60 70 9[25 58[{}31 90.9091 /CMB10 rf /Fl 133[55 65 65 89 65 68 48 48 50 65 68 61 68 102 34 65 1[34 68 61 37 56 68 55 68 60 34 7[93 127 93 94 85 68 92 1[84 92 96 116 74 96 1[46 96 96 77 81 94 89 87 93 7[61 61 61 61 61 61 61 61 61 61 61 34 41 34 2[48 48 34 25[68 68 12[{}67 109.091 /CMBX12 rf /Fm 134[44 2[42 1[30 37 3[46 1[74 23 2[28 46 42 1[42 2[42 46 24[68 6[68 65[{}15 90.9091 /CMTI10 rf /Fn 129[39 3[39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 39 8[39 39 39 39 2[39 1[39 1[39 2[39 1[39 39 1[39 39 39 39 5[39 39 39 2[39 39 39 39 39 39 39 39 39 39 39 2[39 39 39 39[{}59 74.7198 /CMTT9 rf /Fo 133[34 41 41 55 41 43 30 30 30 1[43 38 43 64 21 41 1[21 43 38 23 34 43 34 43 38 8[58 79 58 58 55 43 57 60 52 60 58 70 48 60 39 28 58 60 50 52 59 55 54 58 7[38 38 38 38 38 38 38 38 38 38 1[21 26 21 2[30 30 25[64 1[43 12[{}65 74.7198 /CMR9 rf /Fp 204[33 33 33 49[{}3 58.1154 /CMR7 rf /Fq 129[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 33[{}93 90.9091 /CMTT10 rf /Fr 197[25 58[{}1 90.9091 /CMMI10 rf /Fs 197[33 58[{}1 119.552 /CMMI12 rf /Ft 134[85 85 117 1[90 63 64 66 1[90 81 90 134 45 85 1[45 90 81 49 74 90 72 90 78 11[124 112 90 120 1[110 2[153 1[126 1[60 2[101 106 124 117 115 122 10[81 81 81 81 81 81 49[{}42 143.462 /CMBX12 rf /Fu 150[35 35 88[45 1[91 12[71{}5 90.9091 /CMSY10 rf /Fv 133[60 71 71 97 71 75 52 53 55 1[75 67 75 112 37 71 1[37 75 67 41 61 75 60 75 65 7[102 102 139 102 103 94 75 100 101 92 101 105 128 81 105 69 50 105 106 85 88 103 97 96 102 6[37 67 67 67 67 67 67 67 67 67 67 67 37 45 3[52 52 27[75 12[{}66 119.552 /CMBX12 rf /Fw 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64 68 71 43 1[71 1[25 25 45 45 45 45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25 71 1[45 76 45 25 8[40 8[76 76 51 51 53 11[{}92 90.9091 /CMR10 rf /Fx 140[76 9[54 108 20[108 83[{}4 172.154 /CMBX12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: a4 /setpagedevice where { pop << /PageSize [595 842] >> setpagedevice } { /a4 where { pop a4 } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 150 1318 a Fx(Shishi)p 150 1385 3600 34 v 1833 1481 a Fw(Kerb)s(eros)29 b(5)i(implemen)m(tation)h(for)e (the)h(GNU)g(system)2567 1589 y(for)f(v)m(ersion)h(1.0.2,)h(3)f(April)f (2013)150 5091 y Fv(Simon)45 b(Josefsson)p 150 5141 3600 17 v eop end %%Page: 2 2 TeXDict begin 2 1 bop 150 4633 a Fw(This)30 b(man)m(ual)g(is)h(last)g (up)s(dated)e(3)i(April)f(2013)i(for)e(v)m(ersion)h(1.0.2)h(of)f (Shishi.)150 4767 y(Cop)m(yrigh)m(t)602 4764 y(c)577 4767 y Fu(\015)f Fw(2002-2013)k(Simon)c(Josefsson.)390 4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f (under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8 b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26 b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43 b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8 b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 b(arian)m(t)46 b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)31 b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390 5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end %%Page: -1 3 TeXDict begin -1 2 bop 3725 -116 a Fw(i)150 299 y Ft(T)-13 b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fv(1)135 b(In)l(tro)t (duction)13 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)57 b Fv(1)275 778 y Fw(1.1)92 b(Getting)32 b(Started)21 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)51 b Fw(1)275 888 y(1.2)92 b(F)-8 b(eatures)31 b(and)f(Status)18 b Fr(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)48 b Fw(1)275 997 y(1.3)92 b(Ov)m(erview)28 b Fr(:)15 b(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Fw(3)275 1107 y(1.4)92 b(Cryptographic)30 b(Ov)m(erview)8 b Fr(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)39 b Fw(5)275 1216 y(1.5)92 b(Supp)s(orted)28 b(Platforms)20 b Fr(:)c(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)51 b Fw(8)275 1326 y(1.6)92 b(Getting)32 b(help)21 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(10)275 1435 y(1.7)92 b(Commercial)31 b(Supp)s(ort)20 b Fr(:)13 b(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)50 b Fw(10)275 1545 y(1.8)92 b(Do)m(wnloading)31 b(and)f(Installing)e Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)57 b Fw(10)275 1655 y(1.9)92 b(Bug)30 b(Rep)s(orts)20 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(11)275 1764 y(1.10)92 b(Con)m(tributing)13 b Fr(:)i(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)42 b Fw(12)150 2007 y Fv(2)135 b(User)45 b(Man)l(ual)22 b Fs(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)67 b Fv(13)275 2144 y Fw(2.1)92 b(Pro)m(xiable)31 b(and)f(Pro)m(xy)h(Tic)m(k)m(ets)e Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(15)275 2253 y(2.2)92 b(F)-8 b(orw)m(ardable)31 b(and)f(F)-8 b(orw)m(arded)31 b(Tic)m(k)m(ets)21 b Fr(:)c(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fw(16)150 2496 y Fv(3)135 b(Administration)46 b(Man)l(ual)26 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)70 b Fv(18)275 2633 y Fw(3.1)92 b(In)m(tro)s(duction)30 b(to)h(Shisa)10 b Fr(:)k(:)i(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 39 b Fw(18)275 2742 y(3.2)92 b(Con\014guring)29 b(Shisa)21 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(18)275 2852 y(3.3)92 b(Using)30 b(Shisa)20 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(19)275 2961 y(3.4)92 b(Starting)30 b(Shishid)11 b Fr(:)j(:)i(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)41 b Fw(23)275 3071 y(3.5)92 b(Con\014guring)29 b(DNS)h(for)g(KDC)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)55 b Fw(25)399 3181 y(3.5.1)93 b(DNS)30 b(vs.)41 b(Kerb)s(eros)29 b(-)i(Case)f(Sensitivit)m(y)i(of)e (Realm)i(Names)16 b Fr(:)f(:)h(:)f(:)h(:)45 b Fw(25)399 3290 y(3.5.2)93 b(Ov)m(erview)31 b(-)f(KDC)g(lo)s(cation)i(information) 27 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)56 b Fw(25)399 3400 y(3.5.3)93 b(Example)30 b(-)h(KDC)f(lo)s(cation)i(information)18 b Fr(:)e(:)g(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)48 b Fw(26)399 3509 y(3.5.4)93 b(Securit)m(y)31 b(considerations)19 b Fr(:)d(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)49 b Fw(26)275 3619 y(3.6)92 b(Kerb)s(eros)29 b(via)i(TLS)18 b Fr(:)c(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fw(26)399 3729 y(3.6.1)93 b(Setting)31 b(up)e(TLS)h(resume)14 b Fr(:)g(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 43 b Fw(26)399 3838 y(3.6.2)93 b(Setting)31 b(up)e(Anon)m(ymous)h(TLS) 20 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(27)399 3948 y(3.6.3)93 b(Setting)31 b(up)e(X.509)j(authen)m (ticated)h(TLS)14 b Fr(:)g(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)44 b Fw(28)524 4057 y(3.6.3.1)93 b(Create)31 b(a)g(Kerb)s(eros)e(Certi\014cate)j (Authorit)m(y)c Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)57 b Fw(28)524 4167 y(3.6.3.2)93 b(Create)31 b(a)g(Kerb)s(eros)e (KDC)i(Certi\014cate)19 b Fr(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)49 b Fw(29)524 4276 y(3.6.3.3)93 b(Create)31 b(a)g(Kerb)s(eros)e(Clien)m(t)j(Certi\014cate)22 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)52 b Fw(31)524 4386 y(3.6.3.4)93 b(Starting)31 b(KDC)f(with)g(X.509) i(authen)m(tication)h(supp)s(ort)22 b Fr(:)13 b(:)j(:)f(:)52 b Fw(32)275 4496 y(3.7)92 b(Multiple)31 b(serv)m(ers)14 b Fr(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)44 b Fw(33)275 4605 y(3.8)92 b(Dev)m(elop)s(er)31 b(information)9 b Fr(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)39 b Fw(35)150 4848 y Fv(4)135 b(Reference)46 b(Man)l(ual)28 b Fs(:)20 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)73 b Fv(36)275 4985 y Fw(4.1)92 b(En)m(vironmen)m(tal)31 b(Assumptions)12 b Fr(:)j(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)42 b Fw(36)275 5094 y(4.2)92 b(Glossary)31 b(of)f(terms)23 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)52 b Fw(36)275 5204 y(4.3)92 b(Realm)31 b(and)e(Principal)i(Naming)14 b Fr(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)43 b Fw(38)399 5313 y(4.3.1)93 b(Realm)31 b(Names)20 b Fr(:)c(:)g(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)50 b Fw(38)p eop end %%Page: -2 4 TeXDict begin -2 3 bop 3699 -116 a Fw(ii)399 83 y(4.3.2)93 b(Principal)30 b(Names)f Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Fw(39)524 193 y(4.3.2.1)93 b(Name)31 b(of)g(serv)m(er)f(principals)15 b Fr(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)44 b Fw(40)524 302 y(4.3.2.2)93 b(Name)31 b(of)g(the)f(TGS)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)55 b Fw(41)399 412 y(4.3.3)93 b(Cho)s(osing)30 b(a)h(principal)f(with)g (whic)m(h)g(to)h(comm)m(unicate)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)55 b Fw(41)399 521 y(4.3.4)93 b(Principal)30 b(Name)h(F)-8 b(orm)28 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)57 b Fw(42)275 631 y(4.4)92 b(Shishi)29 b(Con\014guration)d Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)56 b Fw(42)399 741 y(4.4.1)93 b(`)p Fq(default-realm)p Fw(')20 b Fr(:)12 b(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(42)399 850 y(4.4.2)93 b(`)p Fq(default-principal)p Fw(')21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)55 b Fw(43)399 960 y(4.4.3)93 b(`)p Fq(client-kdc-etypes)p Fw(')21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)55 b Fw(43)399 1069 y(4.4.4)93 b(`)p Fq(verbose)p Fw(',)29 b(`)p Fq(verbose-asn1)p Fw(',)f(`)p Fq(verbose-noise)p Fw(',)581 1179 y(`)p Fq(verbose-crypto)p Fw(',)f(`)p Fq(verbose-crypto-noise)p Fw(')19 b Fr(:)11 b(:)k(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)49 b Fw(43)399 1289 y(4.4.5)93 b(`)p Fq(realm-kdc)p Fw(')15 b Fr(:)e(:)i(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)44 b Fw(43)399 1398 y(4.4.6)93 b(`)p Fq(server-realm)p Fw(')21 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)53 b Fw(43)399 1508 y(4.4.7)93 b(`)p Fq(kdc-timeout)p Fw(',)28 b(`)p Fq(kdc-retries)p Fw(')15 b Fr(:)e(:)i(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)45 b Fw(43)399 1617 y(4.4.8)93 b(`)p Fq(stringprocess)p Fw(')20 b Fr(:)12 b(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(44)399 1727 y(4.4.9)93 b(`)p Fq(ticket-life)p Fw(')25 b Fr(:)15 b(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)57 b Fw(44)399 1836 y(4.4.10)93 b(`)p Fq(renew-life)p Fw(')8 b Fr(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)38 b Fw(44)275 1946 y(4.5)92 b(Shisa)29 b(Con\014guration)21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(45)399 2056 y(4.5.1)93 b(`)p Fq(db)p Fw(')20 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(45)275 2165 y(4.6)92 b(P)m(arameters)31 b(for)f(shishi)12 b Fr(:)j(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)42 b Fw(46)275 2275 y(4.7)92 b(P)m(arameters)31 b(for)f(shishid)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(47)275 2384 y(4.8)92 b(P)m(arameters)31 b(for)f(shisa)e Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(48)275 2494 y(4.9)92 b(En)m(vironmen)m(t)30 b(v)-5 b(ariables)29 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)58 b Fw(50)275 2604 y(4.10)92 b(Date)32 b(input)d(formats)g Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)58 b Fw(50)399 2713 y(4.10.1)93 b(General)32 b(date)f(syn)m(tax)13 b Fr(:)i(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)42 b Fw(50)399 2823 y(4.10.2)93 b(Calendar)30 b(date)h(items)12 b Fr(:)k(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)41 b Fw(52)399 2932 y(4.10.3)93 b(Time)31 b(of)f(da)m(y)h(items)11 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Fw(52)399 3042 y(4.10.4)93 b(Time)31 b(zone)g(items)25 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)54 b Fw(53)399 3152 y(4.10.5)93 b(Com)m(bined)30 b(date)h(and)f(time)h(of)g(da)m(y)f(items)25 b Fr(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)54 b Fw(53)399 3261 y(4.10.6)93 b(Da)m(y)32 b(of)e(w)m(eek)i(items)9 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fw(54)399 3371 y(4.10.7)93 b(Relativ)m(e)33 b(items)e(in)f(date)h(strings)11 b Fr(:)k(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Fw(54)399 3480 y(4.10.8)93 b(Pure)30 b(n)m(um)m(b)s(ers)f(in)h(date)h(strings)17 b Fr(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fw(55)399 3590 y(4.10.9)93 b(Seconds)30 b(since)h(the)g(Ep)s(o)s(c)m(h)26 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Fw(55)399 3699 y(4.10.10)94 b(Sp)s(ecifying)30 b(time)h(zone)g(rules) 13 b Fr(:)i(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)43 b Fw(56)399 3809 y(4.10.11)94 b(Authors)30 b(of)g Fq(parse_datetime)11 b Fr(:)h(:)j(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fw(56)150 4051 y Fv(5)135 b(Programming)46 b(Man)l(ual)18 b Fs(:)i(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)h(:)f(:)63 b Fv(58)275 4188 y Fw(5.1)92 b(Preparation)16 b Fr(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)45 b Fw(58)399 4298 y(5.1.1)93 b(Header)13 b Fr(:)j(:)g(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)43 b Fw(58)399 4408 y(5.1.2)93 b(Initialization)21 b Fr(:)d(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)51 b Fw(58)399 4517 y(5.1.3)93 b(V)-8 b(ersion)31 b(Chec)m(k)12 b Fr(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)41 b Fw(58)399 4627 y(5.1.4)93 b(Building)30 b(the)h(source)10 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)40 b Fw(59)399 4736 y(5.1.5)93 b(Auto)s(conf)30 b(tests)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 b Fw(59)524 4846 y(5.1.5.1)93 b(Auto)s(conf)31 b(test)g(via)g(`)p Fq(pkg-config)p Fw(')17 b Fr(:)c(:)i(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Fw(59)524 4956 y(5.1.5.2)93 b(Standalone)31 b(Auto)s(conf)f(test)i(using)d(Libto) s(ol)20 b Fr(:)c(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)49 b Fw(60)524 5065 y(5.1.5.3)93 b(Standalone)31 b(Auto)s(conf)f(test)14 b Fr(:)j(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)44 b Fw(60)275 5175 y(5.2)92 b(Initialization)32 b(F)-8 b(unctions)12 b Fr(:)k(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)41 b Fw(61)275 5284 y(5.3)92 b(Tic)m(k)m(et)32 b(Set)e(F)-8 b(unctions)22 b Fr(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)51 b Fw(65)p eop end %%Page: -3 5 TeXDict begin -3 4 bop 3674 -116 a Fw(iii)275 83 y(5.4)92 b(AP-REQ)30 b(and)g(AP-REP)g(F)-8 b(unctions)9 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fw(71)275 193 y(5.5)92 b(SAFE)30 b(and)g(PRIV)g(F)-8 b(unctions)28 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)58 b Fw(92)275 302 y(5.6)92 b(Tic)m(k)m(et)32 b(F)-8 b(unctions)17 b Fr(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)47 b Fw(103)275 412 y(5.7)92 b(AS)30 b(F)-8 b(unctions)22 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)52 b Fw(114)275 521 y(5.8)92 b(TGS)29 b(F)-8 b(unctions)29 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)58 b Fw(119)275 631 y(5.9)92 b(Tic)m(k)m(et)32 b(\(ASN.1\))f(F)-8 b(unctions)19 b Fr(:)e(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)49 b Fw(125)275 741 y(5.10)92 b(AS/TGS)30 b(F)-8 b(unctions)25 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)54 b Fw(130)275 850 y(5.11)92 b(Authen)m(ticator)32 b(F)-8 b(unctions)23 b Fr(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)53 b Fw(153)275 960 y(5.12)92 b(KRB-ERR)m(OR)30 b(F)-8 b(unctions)19 b Fr(:)e(:)e(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(162)275 1069 y(5.13)92 b(Cryptographic)30 b(F)-8 b(unctions)14 b Fr(:)i(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)44 b Fw(173)275 1179 y(5.14)92 b(X.509)32 b(F)-8 b(unctions)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(200)275 1289 y(5.15)92 b(Utilit)m(y)32 b(F)-8 b(unctions)9 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fw(202)275 1398 y(5.16)92 b(ASN.1)31 b(F)-8 b(unctions)11 b Fr(:)k(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)41 b Fw(209)275 1508 y(5.17)92 b(Error)30 b(Handling)24 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(221)399 1617 y(5.17.1)93 b(Error)30 b(V)-8 b(alues)19 b Fr(:)d(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)49 b Fw(221)399 1727 y(5.17.2)93 b(Error)30 b(F)-8 b(unctions)15 b Fr(:)h(:)g(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)45 b Fw(224)275 1836 y(5.18)92 b(Examples)14 b Fr(:)i(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)44 b Fw(226)275 1946 y(5.19)92 b(Kerb)s(eros)29 b(Database)k(F)-8 b(unctions)25 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(227)275 2056 y(5.20)92 b(Generic)31 b(Securit)m(y)g(Service)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)55 b Fw(233)150 2298 y Fv(6)135 b(Ac)l(kno)l(wledgemen)l(ts)20 b Fs(:)h(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)64 b Fv(235)150 2568 y(App)t(endix)44 b(A)160 b(Criticism)46 b(of)f(Kerb)t(eros)20 b Fs(:)g(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)64 b Fv(236)150 2838 y(App)t(endix)44 b(B)166 b(Proto)t(col)45 b(Extensions)16 b Fs(:)21 b(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)60 b Fv(237)275 2975 y Fw(B.1)92 b(ST)-8 b(AR)g(TTLS)29 b(protected)i(KDC)f(exc)m(hanges)15 b Fr(:)i(:)e(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(237)399 3084 y(B.1.1)93 b(TCP/IP)29 b(transp)s(ort)h(with)g(TLS)f (upgrade)h(\(ST)-8 b(AR)g(TTLS\))15 b Fr(:)g(:)h(:)f(:)h(:)45 b Fw(237)399 3194 y(B.1.2)93 b(Extensible)30 b(t)m(yp)s(ed)h(hole)f (based)g(on)h(reserv)m(ed)f(high)g(bit)21 b Fr(:)16 b(:)g(:)f(:)g(:)h (:)f(:)h(:)51 b Fw(238)399 3303 y(B.1.3)93 b(ST)-8 b(AR)g(TTLS)29 b(requested)h(b)m(y)g(clien)m(t)i(\(extension)g(mo)s(de)e(1\))e Fr(:)15 b(:)h(:)f(:)h(:)57 b Fw(238)399 3413 y(B.1.4)93 b(ST)-8 b(AR)g(TTLS)29 b(request)h(accepted)i(b)m(y)e(serv)m(er)h (\(extension)g(mo)s(de)f(2\))598 3523 y Fr(:)16 b(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 47 b Fw(238)399 3632 y(B.1.5)93 b(Pro)s(ceeding)30 b(after)h (successful)g(TLS)e(negotiation)17 b Fr(:)h(:)d(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)47 b Fw(238)399 3742 y(B.1.6)93 b(Pro)s(ceeding)30 b(after)h(failed)g(TLS)f(negotiation)20 b Fr(:)e(:)d(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)50 b Fw(239)399 3851 y(B.1.7)93 b(In)m(teraction)32 b(with)e(KDC)g(addresses)g(in)g (DNS)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)57 b Fw(239)399 3961 y(B.1.8)93 b(Using)30 b(TLS)g(authen)m (tication)i(logic)g(in)e(Kerb)s(eros)20 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fw(239)399 4071 y(B.1.9)93 b(Securit)m(y)31 b(considerations)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)57 b Fw(239)275 4180 y(B.2)92 b(T)-8 b(elnet)31 b(encryption)f(with)g(AES-CCM)21 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)51 b Fw(239)399 4290 y(B.2.1)93 b(Command)29 b(Names)i(and)f(Co)s(des)10 b Fr(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)40 b Fw(239)399 4399 y(B.2.2)93 b(Command)29 b(Meanings)16 b Fr(:)h(:)e(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)46 b Fw(240)399 4509 y(B.2.3)93 b(Implemen)m(tation)31 b(Rules)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) 57 b Fw(240)399 4619 y(B.2.4)93 b(In)m(tegration)32 b(with)e(the)g(A)m (UTHENTICA)-8 b(TION)31 b(telnet)g(option)598 4728 y Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fw(241)399 4838 y(B.2.5)93 b(Securit)m(y)31 b(Considerations)15 b Fr(:)g(:)g(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(241)524 4947 y(B.2.5.1)93 b(T)-8 b(elnet)31 b(Encryption)f(Proto)s(col)i(Securit)m (y)f(Considerations)721 5057 y Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b Fw(242)524 5166 y(B.2.5.2)93 b(AES-CCM)30 b(Securit)m(y)h (Considerations)12 b Fr(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)42 b Fw(242)399 5276 y(B.2.6)93 b(Ac)m(kno)m (wledgmen)m(ts)9 b Fr(:)17 b(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)39 b Fw(242)p eop end %%Page: -4 6 TeXDict begin -4 5 bop 3677 -116 a Fw(iv)275 83 y(B.3)92 b(Kerb)s(erized)29 b(rsh)g(and)h(rlogin)13 b Fr(:)j(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)43 b Fw(242)399 193 y(B.3.1)93 b(Establish)30 b(connection)14 b Fr(:)j(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)44 b Fw(242)399 302 y(B.3.2)93 b(Kerb)s(eros)29 b(iden)m(ti\014cation)12 b Fr(:)18 b(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)42 b Fw(243)399 412 y(B.3.3)93 b(Kerb)s(eros)29 b(authen)m(tication)e Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)55 b Fw(243)399 521 y(B.3.4)93 b(Extended)30 b(authen)m(tication)15 b Fr(:)i(:)e(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(243)399 631 y(B.3.5)93 b(Windo)m(w)30 b(size)13 b Fr(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)43 b Fw(244)399 741 y(B.3.6)93 b(End)29 b(of)i(authen)m(tication)10 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)40 b Fw(244)399 850 y(B.3.7)93 b(Encryption)21 b Fr(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)51 b Fw(244)399 960 y(B.3.8)93 b(K)m(CMD)m(V0.3)8 b Fr(:)18 b(:)e(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)39 b Fw(245)399 1069 y(B.3.9)93 b(MIT/Heimdal)31 b(authorization)d Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)57 b Fw(246)275 1179 y(B.4)92 b(Key)30 b(as)h(initialization)i(v)m(ector) 27 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)56 b Fw(246)275 1289 y(B.5)92 b(The)29 b(Keytab)i(Binary)g(File)g (F)-8 b(ormat)27 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 b Fw(247)275 1398 y(B.6)92 b(The)29 b(Creden)m(tial)j(Cac)m(he)f (Binary)f(File)i(F)-8 b(ormat)11 b Fr(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)41 b Fw(250)150 1641 y Fv(App)t(endix)j(C)165 b(Cop)l(ying)45 b(Information)18 b Fs(:)j(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)62 b Fv(253)275 1778 y Fw(C.1)91 b(GNU)31 b(F)-8 b(ree)31 b(Do)s(cumen)m(tation)h(License)20 b Fr(:)d(:)e(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)50 b Fw(253)150 2020 y Fv(F)-11 b(unction)44 b(and)h(Data)h(Index) 17 b Fs(:)i(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)61 b Fv(261)150 2290 y(Concept)45 b(Index)11 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)55 b Fv(268)p eop end %%Page: 1 7 TeXDict begin 1 6 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(1)150 299 y Ft(1)80 b(In)l(tro)t(duction) 150 533 y Fw(Shishi)31 b(is)g(an)h(implemen)m(tation)i(of)d(the)h(Kerb) s(eros)f(5)h(net)m(w)m(ork)h(authen)m(tication)h(system,)f(as)f(sp)s (eci\014ed)150 642 y(in)e(RF)m(C)h(4120.)42 b(Shishi)29 b(can)i(b)s(e)f(used)f(to)j(authen)m(ticate)g(users)e(in)g(distributed) f(systems.)275 777 y(Shishi)h(con)m(tains)i(a)g(library)f (\('libshishi'\))g(that)h(can)g(b)s(e)f(used)f(b)m(y)h(application)i (dev)m(elop)s(ers)e(to)i(add)150 886 y(supp)s(ort)i(for)h(Kerb)s(eros)g (5.)60 b(Shishi)35 b(con)m(tains)j(a)f(command)f(line)h(utilit)m(y)h (\('shishi'\))f(that)h(is)e(used)g(b)m(y)150 996 y(users)23 b(to)h(acquire)g(and)f(manage)h(tic)m(k)m(ets)i(\(and)d(more\).)39 b(The)23 b(serv)m(er)h(side,)h(a)f(Key)g(Distribution)f(Cen)m(ter,)150 1105 y(is)29 b(implemen)m(ted)h(b)m(y)f('shishid'.)40 b(Of)29 b(course,)h(a)g(man)m(ual)f(do)s(cumen)m(ting)h(usage)g(asp)s (ects)f(as)h(w)m(ell)g(as)g(the)150 1215 y(programming)g(API)g(is)h (included.)275 1349 y(Shishi)i(curren)m(tly)i(supp)s(orts)e(AS/TGS)h (exc)m(hanges)i(for)f(acquiring)g(tic)m(k)m(ets,)k(pre-authen)m (tication,)150 1459 y(the)k(AP)h(exc)m(hange)g(for)f(p)s(erforming)f (clien)m(t)j(and)e(serv)m(er)g(authen)m(tication,)49 b(and)43 b(SAFE/PRIV)g(for)150 1569 y(in)m(tegrit)m(y/priv)-5 b(acy)33 b(protected)e(application)h(data)f(exc)m(hanges.)275 1703 y(Shishi)19 b(is)h(in)m(ternationalized;)27 b(error)20 b(and)g(status)h(messages)g(can)g(b)s(e)f(translated)h(in)m(to)h(the)f (users')e(lan-)150 1813 y(guage;)28 b(user)23 b(name)h(and)f(passw)m (ords)g(can)i(b)s(e)e(con)m(v)m(erted)j(in)m(to)f(an)m(y)f(a)m(v)-5 b(ailable)26 b(c)m(haracter)g(set)e(\(normally)150 1922 y(including)30 b(ISO-8859-1)j(and)d(UTF-8\))i(and)e(also)i(b)s(e)e(pro) s(cessed)h(using)f(an)h(exp)s(erimen)m(tal)g(Stringprep)150 2032 y(pro\014le.)275 2166 y(Most,)h(if)g(not)f(all,)i(of)f(the)f (widely)g(used)g(encryption)g(and)g(c)m(hec)m(ksum)h(t)m(yp)s(es)f(are) h(supp)s(orted,)e(suc)m(h)150 2276 y(as)h(3DES,)f(AES,)h(AR)m(CF)m(OUR) g(and)e(HMA)m(C-SHA1.)275 2410 y(Shishi)34 b(is)h(dev)m(elop)s(ed)h (for)g(the)f(GNU/Lin)m(ux)h(system,)i(but)c(runs)g(on)i(o)m(v)m(er)g (20)h(platforms)e(includ-)150 2520 y(ing)i(most)f(ma)5 b(jor)37 b(Unix)f(platforms)h(and)f(Windo)m(ws,)i(and)e(man)m(y)g(kind) g(of)h(devices)g(including)f(iP)-8 b(A)m(Q)150 2629 y(handhelds)29 b(and)h(S/390)h(mainframes.)275 2764 y(Shishi)37 b(is)j(free)f(soft)m (w)m(are)h(licensed)g(under)e(the)h(GNU)h(General)g(Public)e(License)i (v)m(ersion)g(3.0)g(or)150 2873 y(later.)150 3106 y Fv(1.1)68 b(Getting)46 b(Started)150 3265 y Fw(This)d(man)m(ual)i(do)s(cumen)m (ts)f(the)g(Shishi)f(application)i(and)f(library)g(programming)g(in)m (terface.)83 b(All)150 3375 y(commands,)30 b(functions)g(and)g(data)h (t)m(yp)s(es)f(pro)m(vided)g(b)m(y)h(Shishi)e(are)i(explained.)275 3509 y(The)20 b(reader)h(is)g(assumed)f(to)i(p)s(ossess)e(basic)h (familiarit)m(y)i(with)e(net)m(w)m(ork)h(securit)m(y)f(and)g(the)g (Kerb)s(eros)150 3619 y(5)31 b(securit)m(y)g(system.)275 3753 y(This)c(man)m(ual)h(can)g(b)s(e)f(used)g(in)h(sev)m(eral)h(w)m(a) m(ys.)41 b(If)27 b(read)h(from)f(the)h(b)s(eginning)g(to)g(the)g(end,)g (it)h(giv)m(es)150 3863 y(a)38 b(go)s(o)s(d)g(in)m(tro)s(duction)f(in)m (to)i(the)f(library)f(and)g(ho)m(w)h(it)g(can)g(b)s(e)f(used)g(in)h(an) f(application.)64 b(F)-8 b(orw)m(ard)150 3972 y(references)35 b(are)f(included)g(where)g(necessary)-8 b(.)53 b(Later)35 b(on,)g(the)g(man)m(ual)f(can)h(b)s(e)f(used)f(as)i(a)f(reference)150 4082 y(man)m(ual)40 b(to)g(get)h(just)e(the)h(information)g(needed)f (ab)s(out)h(an)m(y)g(particular)g(in)m(terface)h(of)f(the)g(library)-8 b(.)150 4191 y(Exp)s(erienced)35 b(programmers)g(migh)m(t)h(w)m(an)m(t) h(to)f(start)g(lo)s(oking)h(at)f(the)g(examples)g(at)g(the)g(end)f(of)h (the)150 4301 y(man)m(ual,)31 b(and)f(then)g(only)g(read)h(up)e(on)h (those)h(parts)f(of)h(the)f(in)m(terface)i(whic)m(h)e(are)h(unclear.) 150 4533 y Fv(1.2)68 b(F)-11 b(eatures)45 b(and)g(Status)150 4693 y Fw(Shishi)29 b(migh)m(t)i(ha)m(v)m(e)h(a)f(couple)f(of)h(adv)-5 b(an)m(tages)32 b(o)m(v)m(er)g(other)e(pac)m(k)-5 b(ages)33 b(doing)d(a)h(similar)g(job.)150 4852 y(It's)g(F)-8 b(ree)31 b(Soft)m(w)m(are)630 4962 y(An)m(yb)s(o)s(dy)42 b(can)h(use,)j(mo)s (dify)-8 b(,)47 b(and)42 b(redistribute)h(it)h(under)d(the)j(terms)f (of)g(the)g(GNU)630 5071 y(General)31 b(Public)f(License)h(v)m(ersion)g (3.0)h(or)e(later.)150 5230 y(It's)h(thread-safe)630 5340 y(The)f(library)g(uses)g(no)g(global)i(v)-5 b(ariables.)p eop end %%Page: 2 8 TeXDict begin 2 7 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(2)150 299 y(It's)31 b(in)m(ternationalized) 630 408 y(It)d(handles)f(non-ASCI)s(I)f(username)h(and)g(passw)m(ords,) g(and)g(user)g(visible)h(strings)f(used)g(in)630 518 y(the)k(library)f(\(error)g(messages\))i(can)e(b)s(e)g(translated)h(in) m(to)g(the)g(users')f(language.)150 682 y(It's)h(p)s(ortable)630 791 y(It)f(should)g(w)m(ork)g(on)h(all)g(Unix)f(lik)m(e)i(op)s(erating) f(systems,)f(including)g(Windo)m(ws.)275 957 y(Shishi)43 b(is)j(far)f(from)f(feature)i(complete,)k(it)c(is)f(not)h(ev)m(en)g(a)f (full)g(RF)m(C)g(1510)i(implemen)m(tation)150 1066 y(y)m(et.)70 b(Ho)m(w)m(ev)m(er,)44 b(some)c(basic)g(functionalit)m(y)h(is)e (implemen)m(ted.)69 b(A)40 b(few)f(implemen)m(ted)i(feature)f(are)150 1176 y(men)m(tioned)31 b(b)s(elo)m(w.)225 1315 y Fu(\017)60 b Fw(Initial)37 b(authen)m(tication)h(\(AS\))e(from)f(ra)m(w)h(k)m(ey)h (or)f(passw)m(ord.)56 b(This)36 b(step)f(is)h(t)m(ypically)i(used)d(to) 330 1424 y(acquire)c(a)g(tic)m(k)m(et)i(gran)m(ting)e(tic)m(k)m(et)i (and,)d(less)h(commonly)-8 b(,)31 b(a)g(serv)m(er)g(tic)m(k)m(et.)225 1561 y Fu(\017)60 b Fw(Subsequen)m(t)24 b(authen)m(tication)k(\(TGS\).) e(This)e(step)i(is)f(t)m(ypically)j(used)c(to)j(acquire)f(a)f(serv)m (er)h(tic)m(k)m(et,)330 1670 y(b)m(y)k(authen)m(ticating)j(y)m(ourself) d(using)g(the)h(tic)m(k)m(et)i(gran)m(ting)e(tic)m(k)m(et.)225 1807 y Fu(\017)60 b Fw(Clien)m(t-Serv)m(er)31 b(authen)m(tication)h (\(AP\).)f(This)e(step)g(is)h(used)f(b)m(y)h(clien)m(ts)h(and)e(serv)m (ers)h(to)h(pro)m(v)m(e)f(to)330 1917 y(eac)m(h)i(other)e(who)g(they)h (are,)g(using)f(negotiated)i(tic)m(k)m(ets.)225 2053 y Fu(\017)60 b Fw(In)m(tegrit)m(y)30 b(protected)g(comm)m(unication)g (\(SAFE\).)f(This)f(step)h(is)f(used)g(b)m(y)g(clien)m(ts)i(and)e(serv) m(ers)h(to)330 2163 y(exc)m(hange)d(in)m(tegrit)m(y)h(protected)f(data) g(with)f(eac)m(h)h(other.)39 b(The)24 b(k)m(ey)i(is)f(t)m(ypically)i (agreed)f(on)e(using)330 2272 y(the)31 b(Clien)m(t-Serv)m(er)g(authen)m (tication)i(step.)225 2409 y Fu(\017)60 b Fw(Tic)m(k)m(et)33 b(cac)m(he,)f(supp)s(orting)d(m)m(ultiple)j(principals)e(and)g(realms.) 42 b(As)31 b(tic)m(k)m(ets)i(ha)m(v)m(e)f(a)f(life)g(time)h(of)330 2518 y(t)m(ypically)38 b(sev)m(eral)g(hours,)f(they)g(are)g(managed)g (in)f(disk)g(\014les.)59 b(There)36 b(can)h(b)s(e)f(m)m(ultiple)h(tic)m (k)m(et)330 2628 y(cac)m(hes,)49 b(and)43 b(eac)m(h)i(tic)m(k)m(et)h (cac)m(he)g(can)e(store)g(tic)m(k)m(ets)i(for)e(m)m(ultiple)g(clien)m (ts)h(\(users\),)j(serv)m(ers,)330 2738 y(encryption)27 b(t)m(yp)s(es,)i(etc.)40 b(F)-8 b(unctionalit)m(y)30 b(is)e(pro)m(vided)f(for)g(lo)s(cating)i(the)e(prop)s(er)f(tic)m(k)m (et)k(for)d(ev)m(ery)330 2847 y(use.)225 2984 y Fu(\017)60 b Fw(Most)46 b(standard)f(cryptographic)h(primitiv)m(es.)86 b(The)45 b(b)s(eliev)m(ed)h(most)g(secure)f(algorithms)i(are)330 3093 y(supp)s(orted)29 b(\(see)i(Section)g(1.4)g([Cryptographic)g(Ov)m (erview],)g(page)g(5\).)225 3230 y Fu(\017)60 b Fw(T)-8 b(elnet)37 b(clien)m(t)h(and)e(serv)m(er.)58 b(This)36 b(is)g(used)f(to)i(remotely)h(login)f(to)g(other)f(mac)m(hines,)j (after)e(au-)330 3340 y(then)m(ticating)c(y)m(ourself)d(with)g(a)h(tic) m(k)m(et.)225 3476 y Fu(\017)60 b Fw(P)-8 b(AM)31 b(mo)s(dule.)40 b(This)30 b(is)g(used)g(to)h(login)g(lo)s(cally)h(on)e(a)h(mac)m(hine.) 225 3613 y Fu(\017)60 b Fw(KDC)30 b(addresses)g(lo)s(cated)i(using)d (DNS)i(SR)-10 b(V)30 b(RRs.)225 3749 y Fu(\017)60 b Fw(Mo)s(dularized) 49 b(lo)m(w-lev)m(el)j(crypto)d(in)m(terface.)98 b(Curren)m(tly)48 b(Gn)m(ulib)h(and)f(Libgcrypt)h(are)g(sup-)330 3859 y(p)s(orted.)66 b(If)38 b(y)m(ou)h(wish)f(to)i(add)e(supp)s(ort)f(for)i(another)g(lo)m (w-lev)m(el)j(cryptographic)d(library)-8 b(,)42 b(y)m(ou)330 3968 y(only)30 b(ha)m(v)m(e)i(to)f(implemen)m(t)g(a)g(few)f(APIs)g(for) g(DES,)h(AES,)f(MD5,)i(SHA1,)e(HMA)m(C,)i(etc.)42 b(Lo)s(ok)30 b(at)330 4078 y(`)p Fq(gl/gc-gnulib.c)p Fw(')d(or)j(`)p Fq(gl/gc-libgcrypt.c)p Fw(')d(as)j(a)h(starting)g(p)s(oin)m(ter.)275 4244 y(The)i(follo)m(wing)h(table)h(summarize)e(what)h(the)f(curren)m (t)h(ob)5 b(jectiv)m(es)35 b(are)f(\(i.e.,)i(the)d(to)s(do)h(list\))h (and)150 4353 y(an)f(estimate)i(on)e(ho)m(w)h(long)f(it)h(will)g(tak)m (e)h(to)f(implemen)m(t)f(the)h(feature,)h(including)d(some)i (reasonable)150 4463 y(startup-time)27 b(to)g(get)h(familiar)f(with)f (Shishi)f(in)h(general.)41 b(If)26 b(y)m(ou)g(lik)m(e)i(to)f(start)g(w) m(orking)g(on)f(an)m(ything,)150 4572 y(please)31 b(let)g(me)g(kno)m(w) f(so)h(w)m(ork)f(duplication)h(can)g(b)s(e)f(a)m(v)m(oided.)225 4711 y Fu(\017)60 b Fw(P)m(arse)31 b(`)p Fq(/etc/krb5.keytab)p Fw(')26 b(to)32 b(extract)f(k)m(eys)g(to)g(use)g(for)f(telnetd)h(etc)g (\(w)m(eek\))225 4848 y Fu(\017)60 b Fw(Cross-realm)31 b(supp)s(ort)d(\(w)m(eek\).)225 4984 y Fu(\017)60 b Fw(PKINIT)29 b(\(use)i(libksba,)f(w)m(eeks\))225 5121 y Fu(\017)60 b Fw(Finish)32 b(GSSAPI)f(supp)s(ort)g(via)i(GSSLib)e(\(w)m(eeks\))j (Shishi)d(will)h(not)h(supp)s(ort)e(GSSLib)g(nativ)m(ely)-8 b(,)330 5230 y(but)31 b(a)g(separate)h(pro)5 b(ject)32 b(\\GSSLib")f(is)g(under)f(w)m(a)m(y)i(to)g(pro)s(duce)e(a)i(generic)g (GSS)f(implemen)m(ta-)330 5340 y(tion,)g(and)f(it)h(will)g(use)f (Shishi)f(to)i(implemen)m(t)g(the)f(Kerb)s(eros)g(5)h(mec)m(hanism.)p eop end %%Page: 3 9 TeXDict begin 3 8 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(3)225 299 y Fu(\017)60 b Fw(P)m(ort)31 b(to)g(cyclone)h(\(cyclone)g(need)e(to)h(mature)g (\014rst\))225 435 y Fu(\017)60 b Fw(Mo)s(dularize)33 b(ASN.1)f(library)f(so)i(it)f(can)g(b)s(e)g(replaced)g(\(da)m(ys\).)46 b(Almost)33 b(done,)f(all)h(ASN.1)g(func-)330 545 y(tionalit)m(y)g(is)d (found)f(in)h(lib/asn1.c,)i(although)f(the)f(in)m(terface)i(is)f (rather)f(libtasn1)h(cen)m(tric.)225 681 y Fu(\017)60 b Fw(KDC)30 b(\(initiated,)i(w)m(eeks\))225 818 y Fu(\017)60 b Fw(LD)m(AP)31 b(bac)m(k)m(end)g(for)f(Shisa.)225 954 y Fu(\017)60 b Fw(Set/Change)31 b(passw)m(ord)f(proto)s(col)h(\(w)m (eeks?\))225 1090 y Fu(\017)60 b Fw(P)m(ort)31 b(applications)h(to)f (use)f(Shishi)f(\(inde\014nite\))225 1227 y Fu(\017)60 b Fw(Finish)30 b(serv)m(er-realm)h(stu\013)225 1363 y Fu(\017)60 b Fw(Impro)m(v)m(e)31 b(do)s(cumen)m(tation)225 1499 y Fu(\017)60 b Fw(Impro)m(v)m(e)31 b(in)m(ternationalization)225 1636 y Fu(\017)60 b Fw(Add)29 b(AP-REQ)i(repla)m(y)g(cac)m(he)h(\(w)m (eek\).)225 1772 y Fu(\017)60 b Fw(Study)26 b(b)s(ene\014ts)g(b)m(y)h (in)m(tro)s(ducing)g(a)h(P)-8 b(A-TGS-REP)g(.)28 b(This)e(w)m(ould)h (pro)m(vide)h(m)m(utual)f(authen)m(tica-)330 1882 y(tion)d(of)g(the)f (KDC)h(in)f(a)h(w)m(a)m(y)g(that)g(is)g(easier)g(to)h(analyze.)39 b(Curren)m(tly)23 b(the)h(m)m(utual)g(authen)m(tication)330 1991 y(prop)s(ert)m(y)33 b(is)h(only)g(implicit)h(from)e(successful)h (decryption)g(of)g(the)g(KDC-REP)g(and)f(the)h(4)g(b)m(yte)330 2101 y(nonce.)225 2237 y Fu(\017)60 b Fw(GUI)35 b(applet)h(for)f (managing)g(tic)m(k)m(ets.)57 b(This)35 b(is)g(supp)s(orted)e(via)j (the)f(tic)m(k)m(et-applet,)40 b(of)35 b(whic)m(h)g(a)330 2347 y(Shishi)29 b(p)s(ort)h(is)g(published)f(on)h(the)h(Shishi)e(home) h(page.)225 2483 y Fu(\017)60 b Fw(Authorization)45 b(library)e(\(mon)m (ths?\))80 b(The)43 b(shishi)p 2150 2483 28 4 v 39 w(authorized)p 2608 2483 V 41 w(p\(\))h(is)f(not)h(a)g(go)s(o)s(d)f(solution,)330 2593 y(b)s(etter)29 b(w)m(ould)f(b)s(e)g(to)i(ha)m(v)m(e)g(a)f(generic) g(and)f(\015exible)h(authorization)h(library)-8 b(.)41 b(P)m(ossibly)29 b(based)f(on)330 2703 y(S-EXP's)i(in)g(tic)m(k)m(ets?) 43 b(Should)29 b(supp)s(ort)g(non-Kerb)s(eros)g(uses)h(as)g(w)m(ell,)i (of)f(course.)225 2839 y Fu(\017)60 b Fw(Pro)s(of)30 b(read)g(man)m(ual.)225 2975 y Fu(\017)60 b Fw(X.500)33 b(supp)s(ort,)d(including)g(DOMAIN-X500-COMPRESS.)j(I)e(will)g(accept)i (patc)m(hes)f(that)g(im-)330 3085 y(plemen)m(t)f(this,)f(if)h(it)g (causes)g(minimal)f(c)m(hanges)h(to)h(the)e(curren)m(t)g(co)s(de.)150 3323 y Fv(1.3)68 b(Ov)l(erview)150 3482 y Fw(This)30 b(section)h(describ)s(es)f(RF)m(C)g(1510)j(from)c(a)i(proto)s(col)h(p)s (oin)m(t)e(of)g(view)2648 3449 y Fp(1)2686 3482 y Fw(.)275 3621 y(Kerb)s(eros)i(pro)m(vides)h(a)h(means)f(of)g(v)m(erifying)h(the) g(iden)m(tities)h(of)e(principals,)h(\(e.g.,)i(a)e(w)m(orkstation)150 3730 y(user)28 b(or)h(a)g(net)m(w)m(ork)h(serv)m(er\))g(on)f(an)f(op)s (en)h(\(unprotected\))g(net)m(w)m(ork.)41 b(This)28 b(is)h (accomplished)h(without)150 3840 y(relying)35 b(on)g(authen)m(tication) i(b)m(y)e(the)g(host)g(op)s(erating)h(system,)g(without)f(basing)g (trust)g(on)g(host)g(ad-)150 3949 y(dresses,)d(without)g(requiring)f (ph)m(ysical)i(securit)m(y)f(of)g(all)h(the)f(hosts)g(on)g(the)g(net)m (w)m(ork,)h(and)e(under)g(the)150 4059 y(assumption)c(that)h(pac)m(k)m (ets)h(tra)m(v)m(eling)h(along)e(the)g(net)m(w)m(ork)g(can)g(b)s(e)f (read,)h(mo)s(di\014ed,)f(and)g(inserted)g(at)150 4169 y(will.)42 b(\(Note,)32 b(ho)m(w)m(ev)m(er,)h(that)e(man)m(y)g (applications)h(use)e(Kerb)s(eros')g(functions)g(only)h(up)s(on)e(the)i (initia-)150 4278 y(tion)d(of)g(a)h(stream-based)f(net)m(w)m(ork)h (connection,)g(and)f(assume)f(the)h(absence)h(of)f(an)m(y)g Fq(")p Fw(hijac)m(k)m(ers)p Fq(")g Fw(who)150 4388 y(migh)m(t)36 b(sub)m(v)m(ert)f(suc)m(h)f(a)i(connection.)55 b(Suc)m(h)35 b(use)f(implicitly)j(trusts)d(the)h(host)g(addresses)g(in)m(v)m(olv)m (ed.\))150 4497 y(Kerb)s(eros)29 b(p)s(erforms)g(authen)m(tication)j (under)d(these)i(conditions)g(as)f(a)h(trusted)f(third-)f(part)m(y)i (authen-)150 4607 y(tication)k(service)g(b)m(y)e(using)g(con)m(v)m(en)m (tional)k(cryptograph)m(y)-8 b(,)35 b(i.e.,)g(shared)e(secret)i(k)m(ey) -8 b(.)51 b(\(shared)33 b(secret)150 4717 y(k)m(ey)i(-)g(Secret)g(and)f (priv)-5 b(ate)34 b(are)h(often)g(used)f(in)m(terc)m(hangeably)i(in)e (the)h(literature.)54 b(In)33 b(our)h(usage,)i(it)150 4826 y(tak)m(es)c(t)m(w)m(o)g(\(or)g(more\))f(to)g(share)g(a)g(secret,) h(th)m(us)f(a)g(shared)f(DES)g(k)m(ey)i(is)f(a)g(secret)h(k)m(ey)-8 b(.)43 b(Something)31 b(is)150 4936 y(only)j(priv)-5 b(ate)33 b(when)g(no)g(one)h(but)f(its)g(o)m(wner)h(kno)m(ws)f(it.)50 b(Th)m(us,)34 b(in)f(public)g(k)m(ey)h(cryptosystems,)h(one)150 5045 y(has)30 b(a)h(public)f(and)f(a)i(priv)-5 b(ate)31 b(k)m(ey)-8 b(.\))p 150 5154 1200 4 v 199 5221 a Fp(1)275 5253 y Fo(The)34 b(text)f(is)i(a)g(ligh)n(tly)f(adapted)g(v)n(ersion)g (of)h(the)f(in)n(tro)r(duction)g(section)h(from)g(RF)n(C)f(1510)i(b)n (y)d(J.)i(Kohl)f(and)g(C.)275 5340 y(Neuman,)25 b(Septem)n(b)r(er)g (1993,)i(cop)n(yrigh)n(t)f(lik)n(ely)f(o)n(wned)h(b)n(y)f(the)g(RF)n(C) h(1510)h(authors)f(or)g(some)g(con)n(tributor.)p eop end %%Page: 4 10 TeXDict begin 4 9 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(4)275 299 y(The)29 b(authen)m(tication)k (pro)s(cess)d(pro)s(ceeds)g(as)h(follo)m(ws:)42 b(A)30 b(clien)m(t)i(sends)e(a)h(request)f(to)h(the)g(authen-)150 408 y(tication)43 b(serv)m(er)f(\(AS\))g(requesting)g Fq(")p Fw(creden)m(tials)p Fq(")g Fw(for)g(a)f(giv)m(en)i(serv)m(er.)74 b(The)41 b(AS)h(resp)s(onds)d(with)150 518 y(these)32 b(creden)m(tials,)i(encrypted)d(in)h(the)g(clien)m(t's)h(k)m(ey)-8 b(.)47 b(The)31 b(creden)m(tials)i(consist)g(of)f(1\))g(a)g Fq(")p Fw(tic)m(k)m(et)p Fq(")i Fw(for)150 628 y(the)k(serv)m(er)h(and) e(2\))i(a)g(temp)s(orary)f(encryption)g(k)m(ey)h(\(often)g(called)g(a)g Fq(")p Fw(session)f(k)m(ey)p Fq(")p Fw(\).)65 b(The)37 b(clien)m(t)150 737 y(transmits)c(the)g(tic)m(k)m(et)i(\(whic)m(h)e (con)m(tains)h(the)e(clien)m(t's)j(iden)m(tit)m(y)f(and)e(a)h(cop)m(y)h (of)f(the)f(session)h(k)m(ey)-8 b(,)35 b(all)150 847 y(encrypted)29 b(in)g(the)h(serv)m(er's)g(k)m(ey\))g(to)h(the)e(serv)m (er.)41 b(The)29 b(session)h(k)m(ey)g(\(no)m(w)g(shared)e(b)m(y)i(the)f (clien)m(t)j(and)150 956 y(serv)m(er\))i(is)g(used)f(to)i(authen)m (ticate)h(the)e(clien)m(t,)j(and)c(ma)m(y)h(optionally)i(b)s(e)d(used)g (to)i(authen)m(ticate)h(the)150 1066 y(serv)m(er.)51 b(It)33 b(ma)m(y)h(also)h(b)s(e)e(used)f(to)j(encrypt)e(further)f(comm) m(unication)j(b)s(et)m(w)m(een)f(the)g(t)m(w)m(o)h(parties)f(or)150 1176 y(to)d(exc)m(hange)h(a)f(separate)g(sub-session)f(k)m(ey)h(to)g(b) s(e)f(used)f(to)i(encrypt)g(further)e(comm)m(unication.)275 1351 y(The)38 b(implemen)m(tation)i(consists)f(of)f(one)h(or)g(more)g (authen)m(tication)h(serv)m(ers)f(running)e(on)h(ph)m(ysi-)150 1461 y(cally)31 b(secure)f(hosts.)40 b(The)30 b(authen)m(tication)i (serv)m(ers)d(main)m(tain)i(a)f(database)h(of)f(principals)f(\(i.e.,)j (users)150 1570 y(and)k(serv)m(ers\))i(and)e(their)h(secret)g(k)m(eys.) 61 b(Co)s(de)36 b(libraries)h(pro)m(vide)g(encryption)g(and)f(implemen) m(t)i(the)150 1680 y(Kerb)s(eros)f(proto)s(col.)66 b(In)38 b(order)g(to)h(add)e(authen)m(tication)k(to)e(its)g(transactions,)i(a)e (t)m(ypical)h(net)m(w)m(ork)150 1789 y(application)31 b(adds)e(one)g(or)h(t)m(w)m(o)h(calls)f(to)h(the)e(Kerb)s(eros)g (library)-8 b(,)30 b(whic)m(h)f(results)g(in)h(the)f(transmission)150 1899 y(of)i(the)f(necessary)h(messages)g(to)g(ac)m(hiev)m(e)i(authen)m (tication.)275 2074 y(The)g(Kerb)s(eros)h(proto)s(col)h(consists)f(of)h (sev)m(eral)g(sub-proto)s(cols)g(\(or)f(exc)m(hanges\).)54 b(There)34 b(are)h(t)m(w)m(o)150 2184 y(metho)s(ds)30 b(b)m(y)g(whic)m(h)g(a)h(clien)m(t)h(can)f(ask)g(a)f(Kerb)s(eros)g (serv)m(er)h(for)f(creden)m(tials.)42 b(In)30 b(the)h(\014rst)e (approac)m(h,)150 2293 y(the)j(clien)m(t)h(sends)e(a)i(cleartext)h (request)d(for)h(a)g(tic)m(k)m(et)j(for)c(the)h(desired)g(serv)m(er)g (to)g(the)g(AS.)g(The)f(reply)150 2403 y(is)41 b(sen)m(t)g(encrypted)g (in)f(the)h(clien)m(t's)i(secret)f(k)m(ey)-8 b(.)73 b(Usually)41 b(this)g(request)g(is)g(for)g(a)g(tic)m(k)m(et-gran)m(ting)150 2513 y(tic)m(k)m(et)32 b(\(TGT\))e(whic)m(h)g(can)g(later)g(b)s(e)f (used)g(with)h(the)f(tic)m(k)m(et-gran)m(ting)34 b(serv)m(er)c (\(TGS\).)g(In)f(the)h(second)150 2622 y(metho)s(d,)c(the)g(clien)m(t)h (sends)e(a)g(request)h(to)g(the)g(TGS.)f(The)g(clien)m(t)i(sends)e(the) h(TGT)f(to)h(the)g(TGS)f(in)g(the)150 2732 y(same)31 b(manner)f(as)h(if)g(it)g(w)m(ere)g(con)m(tacting)i(an)m(y)e(other)g (application)h(serv)m(er)f(whic)m(h)g(requires)f(Kerb)s(eros)150 2841 y(creden)m(tials.)42 b(The)30 b(reply)g(is)g(encrypted)g(in)g(the) h(session)g(k)m(ey)g(from)f(the)g(TGT.)275 3017 y(Once)43 b(obtained,)j(creden)m(tials)f(ma)m(y)e(b)s(e)g(used)f(to)i(v)m(erify)f (the)g(iden)m(tit)m(y)i(of)e(the)g(principals)g(in)g(a)150 3126 y(transaction,)f(to)d(ensure)e(the)h(in)m(tegrit)m(y)j(of)d (messages)h(exc)m(hanged)g(b)s(et)m(w)m(een)g(them,)i(or)d(to)h (preserv)m(e)150 3236 y(priv)-5 b(acy)41 b(of)h(the)f(messages.)75 b(The)41 b(application)i(is)e(free)g(to)i(c)m(ho)s(ose)f(whatev)m(er)g (protection)h(ma)m(y)f(b)s(e)150 3345 y(necessary)-8 b(.)275 3521 y(T)g(o)30 b(v)m(erify)h(the)g(iden)m(tities)h(of)e(the)h (principals)e(in)i(a)f(transaction,)i(the)f(clien)m(t)g(transmits)g (the)f(tic)m(k)m(et)150 3630 y(to)39 b(the)g(serv)m(er.)65 b(Since)39 b(the)g(tic)m(k)m(et)i(is)d(sen)m(t)i Fq(")p Fw(in)d(the)i(clear)p Fq(")g Fw(\(parts)g(of)g(it)g(are)g(encrypted,)h (but)e(this)150 3740 y(encryption)k(do)s(esn't)f(th)m(w)m(art)i(repla)m (y\))g(and)e(migh)m(t)i(b)s(e)e(in)m(tercepted)i(and)e(reused)g(b)m(y)h (an)g(attac)m(k)m(er,)150 3850 y(additional)31 b(information)f(is)f (sen)m(t)i(to)f(pro)m(v)m(e)g(that)h(the)f(message)g(w)m(as)h (originated)f(b)m(y)g(the)g(principal)f(to)150 3959 y(whom)d(the)h(tic) m(k)m(et)i(w)m(as)e(issued.)38 b(This)26 b(information)h(\(called)h (the)f(authen)m(ticator\))i(is)d(encrypted)h(in)f(the)150 4069 y(session)e(k)m(ey)-8 b(,)27 b(and)c(includes)h(a)g(timestamp.)39 b(The)24 b(timestamp)h(pro)m(v)m(es)f(that)h(the)f(message)h(w)m(as)g (recen)m(tly)150 4178 y(generated)32 b(and)f(is)g(not)g(a)h(repla)m(y) -8 b(.)44 b(Encrypting)30 b(the)h(authen)m(ticator)i(in)e(the)g (session)h(k)m(ey)g(pro)m(v)m(es)f(that)150 4288 y(it)h(w)m(as)f (generated)i(b)m(y)e(a)g(part)m(y)h(p)s(ossessing)e(the)i(session)f(k)m (ey)-8 b(.)44 b(Since)32 b(no)f(one)g(except)h(the)g(requesting)150 4398 y(principal)26 b(and)g(the)h(serv)m(er)f(kno)m(w)h(the)g(session)f (k)m(ey)h(\(it)h(is)e(nev)m(er)h(sen)m(t)g(o)m(v)m(er)h(the)e(net)m(w)m (ork)i(in)e(the)h(clear\))150 4507 y(this)j(guaran)m(tees)i(the)f(iden) m(tit)m(y)g(of)g(the)g(clien)m(t.)275 4682 y(The)44 b(in)m(tegrit)m(y)j (of)e(the)h(messages)g(exc)m(hanged)g(b)s(et)m(w)m(een)f(principals)g (can)g(also)h(b)s(e)f(guaran)m(teed)150 4792 y(using)27 b(the)h(session)f(k)m(ey)i(\(passed)e(in)g(the)h(tic)m(k)m(et)i(and)d (con)m(tained)i(in)e(the)g(creden)m(tials\).)42 b(This)27 b(approac)m(h)150 4902 y(pro)m(vides)36 b(detection)j(of)d(b)s(oth)g (repla)m(y)h(attac)m(ks)i(and)d(message)h(stream)g(mo)s(di\014cation)g (attac)m(ks.)61 b(It)37 b(is)150 5011 y(accomplished)e(b)m(y)f (generating)h(and)f(transmitting)g(a)h(collision-pro)s(of)g(c)m(hec)m (ksum)g(\(elsewhere)g(called)150 5121 y(a)d(hash)f(or)g(digest)i (function\))e(of)h(the)g(clien)m(t's)h(message,)g(k)m(ey)m(ed)g(with)e (the)h(session)g(k)m(ey)-8 b(.)46 b(Priv)-5 b(acy)32 b(and)150 5230 y(in)m(tegrit)m(y)38 b(of)e(the)f(messages)i(exc)m (hanged)g(b)s(et)m(w)m(een)f(principals)f(can)h(b)s(e)f(secured)h(b)m (y)f(encrypting)h(the)150 5340 y(data)24 b(to)g(b)s(e)e(passed)h(using) f(the)i(session)f(k)m(ey)h(passed)f(in)f(the)i(tic)m(k)m(et,)j(and)c (con)m(tained)h(in)f(the)g(creden)m(tials.)p eop end %%Page: 5 11 TeXDict begin 5 10 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(5)150 299 y Fv(1.4)68 b(Cryptographic)45 b(Ov)l(erview)150 458 y Fw(Shishi)e(implemen)m(ts)h(sev)m(eral)h(of)f (the)g(standard)e(cryptographic)j(primitiv)m(es.)81 b(In)43 b(this)h(section)g(w)m(e)150 568 y(giv)m(e)34 b(the)f(names)g(of)g(the) g(supp)s(orted)e(encryption)i(suites,)h(and)e(some)h(notes)g(ab)s(out)g (them,)h(and)e(their)150 677 y(asso)s(ciated)g(c)m(hec)m(ksum)f(suite.) 275 820 y(Statemen)m(ts)41 b(suc)m(h)e(as)h(\\it)h(is)e(w)m(eak")j (should)c(b)s(e)h(read)h(as)g(meaning)g(that)g(there)g(is)g(no)g (credible)150 930 y(securit)m(y)f(analysis)g(of)f(the)h(mec)m(hanism)f (a)m(v)-5 b(ailable,)43 b(and/or)38 b(that)h(should)e(an)h(attac)m(k)j (b)s(e)d(published)150 1039 y(publicly)-8 b(,)24 b(few)e(p)s(eople)f(w) m(ould)h(lik)m(ely)i(b)s(e)d(surprised.)36 b(Also)22 b(k)m(eep)h(in)f(mind)e(that)j(the)f(k)m(ey)h(size)f(men)m(tioned)150 1149 y(is)28 b(the)g(actual)h(k)m(ey)f(size,)h(not)f(the)g(e\013ectiv)m (e)i(k)m(ey)f(space)f(as)g(far)g(as)f(a)i(brute)e(force)h(attac)m(k)i (is)e(concerned.)275 1291 y(As)j(y)m(ou)g(ma)m(y)h(infer)f(from)g(the)g (descriptions,)h(there)f(is)h(curren)m(tly)f(no)g(encryption)g (algorithm)i(and)150 1401 y(only)28 b(one)g(c)m(hec)m(ksum)h(algorithm) g(that)g(inspire)e(great)i(con\014dence)f(in)g(its)g(design.)40 b(Hop)s(efully)28 b(this)g(will)150 1511 y(c)m(hange)k(o)m(v)m(er)f (time.)150 1682 y Fq(NULL)630 1821 y(NULL)j Fw(is)g(a)h(dumm)m(y)f (encryption)h(suite)g(for)f(debugging.)54 b(Encryption)34 b(and)g(decryption)630 1930 y(are)28 b(iden)m(tit)m(y)h(functions.)40 b(No)28 b(in)m(tegrit)m(y)h(protection.)41 b(It)28 b(is)g(w)m(eak.)41 b(It)27 b(is)h(asso)s(ciated)h(with)630 2040 y(the)i Fq(NULL)e Fw(c)m(hec)m(ksum.)150 2207 y Fq(arcfour-hmac)150 2317 y(arcfour-hmac-exp)630 2427 y(arcfour-hmac-*)g Fw(are)j(a)h (proprietary)f(stream)h(cipher)f(with)g(56)i(bit)e(\()p Fq(arcfour-hmac-)630 2536 y(exp)p Fw(\))25 b(or)g(128)i(bit)e(\()p Fq(arcfour-hmac)p Fw(\))e(k)m(eys,)28 b(used)c(in)h(a)h(proprietary)f (w)m(a)m(y)i(describ)s(ed)d(in)h(an)630 2646 y(expired)39 b(IETF)g(draft)g(`)p Fq(draft-brezak-win2k-krb-rc4)o(-hm)o(ac-0)o(4.tx) o(t)p Fw('.)62 b(Deriving)630 2755 y(k)m(eys)32 b(from)f(passw)m(ords)g (is)g(supp)s(orted,)f(and)h(is)h(done)f(b)m(y)g(computing)h(a)g (message)g(digest)630 2865 y(\(MD4\))e(of)e(a)g(16-bit)h(Unico)s(de)f (represen)m(tation)h(of)f(the)g(ASCI)s(I)e(passw)m(ord,)i(with)f(no)h (salt.)630 2974 y(Data)k(is)f(in)m(tegrit)m(y)h(protected)g(with)e(a)h (k)m(ey)m(ed)g(hash)f(\(HMA)m(C-MD5\),)k(where)c(the)h(k)m(ey)g(is)630 3084 y(deriv)m(ed)k(from)f(the)g(base)h(k)m(ey)g(in)g(a)f(creativ)m(e)j (w)m(a)m(y)-8 b(.)55 b(It)34 b(is)h(w)m(eak.)54 b(It)35 b(is)f(asso)s(ciated)i(with)630 3194 y(the)31 b Fq(arcfour-hmac-md5)25 b Fw(c)m(hec)m(ksum.)150 3361 y Fq(des-cbc-none)630 3471 y(des-cbc-none)30 b Fw(is)k(DES)f(encryption)h(and)f(decryption)g(with) g(56)i(bit)e(k)m(eys)h(and)f(8)h(b)m(yte)630 3580 y(blo)s(c)m(ks)29 b(in)f(CBC)f(mo)s(de,)i(using)f(a)g(zero)h(IV.)g(The)f(k)m(eys)h(can)f (b)s(e)g(deriv)m(ed)g(from)g(passw)m(ords)630 3690 y(b)m(y)37 b(an)g(obscure)g(application)h(sp)s(eci\014c)f(algorithm.)62 b(It)38 b(is)f(w)m(eak,)j(b)s(ecause)d(it)h(o\013ers)f(no)630 3800 y(in)m(tegrit)m(y)42 b(protection.)70 b(This)39 b(is)g(t)m(ypically)j(only)e(used)f(b)m(y)g(RF)m(C)h(1964)i(GSS-API)d (im-)630 3909 y(plemen)m(tations)e(\(whic)m(h)f(try)f(to)h(protect)h (in)m(tegrit)m(y)g(using)e(an)h(ad-ho)s(c)f(solution\).)57 b(It)36 b(is)630 4019 y(asso)s(ciated)c(with)e(the)g Fq(NULL)g Fw(c)m(hec)m(ksum.)150 4186 y Fq(des-cbc-crc)630 4296 y(des-cbc-crc)k Fw(is)k(DES)f(encryption)h(and)f(decryption)g (with)g(56)i(bit)e(k)m(eys)h(and)f(8)h(b)m(yte)630 4405 y(blo)s(c)m(ks)27 b(in)f(CBC)h(mo)s(de,)g(using)f(the)h(k)m(ey)g(as)g (IV)g(\(see)g(Section)h(B.4)f([Key)g(as)g(initialization)630 4515 y(v)m(ector],)46 b(page)c(246\).)76 b(The)41 b(k)m(eys)h(can)f(b)s (e)g(deriv)m(ed)g(from)g(passw)m(ords)g(b)m(y)g(an)g(obscure)630 4625 y(application)29 b(sp)s(eci\014c)e(algorithm.)41 b(Data)29 b(is)f(in)m(tegrit)m(y)h(protected)f(with)g(an)f(unk)m(ey)m (ed)h(but)630 4734 y(encrypted)i Fq(CRC32)p Fw(-lik)m(e)g(c)m(hec)m (ksum.)42 b(It)30 b(is)h(w)m(eak.)41 b(It)31 b(is)f(asso)s(ciated)i (with)e(the)g Fq(rsa-md5-)630 4844 y(des)f Fw(c)m(hec)m(ksum.)150 5011 y Fq(des-cbc-md4)630 5121 y(des-cbc-md4)34 b Fw(is)k(DES)f (encryption)h(and)f(decryption)g(with)g(56)i(bit)e(k)m(eys)h(and)f(8)h (b)m(yte)630 5230 y(blo)s(c)m(ks)29 b(in)f(CBC)f(mo)s(de,)i(using)f(a)g (zero)h(IV.)g(The)f(k)m(eys)h(can)f(b)s(e)g(deriv)m(ed)g(from)g(passw)m (ords)630 5340 y(b)m(y)33 b(an)h(obscure)f(application)i(sp)s(eci\014c) e(algorithm.)51 b(Data)36 b(is)d(in)m(tegrit)m(y)j(protected)e(with)p eop end %%Page: 6 12 TeXDict begin 6 11 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(6)630 299 y(an)40 b(unk)m(ey)m(ed)g(but)g (encrypted)g(MD4)h(hash.)69 b(It)41 b(is)f(w)m(eak.)71 b(It)40 b(is)g(asso)s(ciated)i(with)e(the)630 408 y Fq(rsa-md4-des)27 b Fw(c)m(hec)m(ksum.)150 557 y Fq(des-cbc-md5)630 667 y(des-cbc-md5)34 b Fw(is)k(DES)f(encryption)h(and)f(decryption)g(with)g (56)i(bit)e(k)m(eys)h(and)f(8)h(b)m(yte)630 776 y(blo)s(c)m(ks)29 b(in)f(CBC)f(mo)s(de,)i(using)f(a)g(zero)h(IV.)g(The)f(k)m(eys)h(can)f (b)s(e)g(deriv)m(ed)g(from)g(passw)m(ords)630 886 y(b)m(y)33 b(an)h(obscure)f(application)i(sp)s(eci\014c)e(algorithm.)51 b(Data)36 b(is)d(in)m(tegrit)m(y)j(protected)e(with)630 996 y(an)26 b(unk)m(ey)m(ed)g(but)f(encrypted)h(MD5)h(hash.)39 b(It)26 b(is)g(w)m(eak.)40 b(It)27 b(is)f(asso)s(ciated)h(with)f(the)g Fq(rsa-)630 1105 y(md5-des)34 b Fw(c)m(hec)m(ksum.)59 b(This)35 b(is)h(the)g(strongest)h(RF)m(C)g(1510)g(in)m(terop)s(erable) g(encryption)630 1215 y(mec)m(hanism.)150 1363 y Fq(des3-cbc-none)630 1473 y(des3-cbc-none)31 b Fw(is)k(DES)f(encryption)h(and)f(decryption)h (with)f(three)h(56)h(bit)f(k)m(eys)g(\(ef-)630 1583 y(fectiv)m(e)40 b(k)m(ey)f(size)g(112)g(bits\))f(and)f(8)i(b)m(yte)f(blo)s(c)m(ks)h(in) e(CBC)h(mo)s(de.)63 b(The)38 b(k)m(eys)g(can)h(b)s(e)630 1692 y(deriv)m(ed)i(from)g(passw)m(ords)g(b)m(y)g(the)h(same)g (algorithm)g(as)g Fq(des3-cbc-sha1-kd)p Fw(.)69 b(It)42 b(is)630 1802 y(w)m(eak,)37 b(b)s(ecause)e(it)g(o\013ers)g(no)g(in)m (tegrit)m(y)i(protection.)55 b(This)34 b(is)h(t)m(ypically)i(only)e (used)f(b)m(y)630 1911 y(GSS-API)f(implemen)m(tations)i(\(whic)m(h)f (try)f(to)i(protect)f(in)m(tegrit)m(y)i(using)d(an)h(ad-ho)s(c)f(so-) 630 2021 y(lution\))e(for)f(in)m(terop)s(erabilit)m(y)i(with)e(some)h (existing)g(Kerb)s(eros)f(GSS)f(implemen)m(tations.)630 2131 y(It)h(is)h(asso)s(ciated)h(with)e(the)g Fq(NULL)g Fw(c)m(hec)m(ksum.)150 2279 y Fq(des3-cbc-sha1-kd)630 2389 y(des3-cbc-sha1-kd)j Fw(is)k(DES)g(encryption)g(and)g(decryption)g (with)g(three)h(56)g(bit)f(k)m(eys)630 2499 y(\(e\013ectiv)m(e)43 b(k)m(ey)e(size)f(112)h(bits\))g(and)e(8)h(b)m(yte)h(blo)s(c)m(ks)f(in) f(CBC)h(mo)s(de.)69 b(The)39 b(k)m(eys)i(can)630 2608 y(b)s(e)33 b(deriv)m(ed)g(from)g(passw)m(ords)g(b)m(y)g(a)h(algorithm)g (based)f(on)h(the)f(pap)s(er)g Fq(")p Fw(A)g(Better)i(Key)630 2718 y(Sc)m(hedule)j(F)-8 b(or)38 b(DES-lik)m(e)i(Ciphers)p Fq(")1924 2685 y Fp(2)1997 2718 y Fw(b)m(y)e(Uri)g(Blumen)m(thal)h(and) e(Stev)m(en)i(M.)f(Bello)m(vin)630 2827 y(\(it)f(is)g(not)g(clear)g(if) g(the)f(algorithm,)j(and)d(the)h(w)m(a)m(y)g(it)g(is)g(used,)g(is)g (used)f(b)m(y)g(an)m(y)h(other)630 2937 y(proto)s(cols,)29 b(although)f(it)g(seems)f(unlik)m(ely\).)41 b(Data)29 b(is)e(in)m(tegrit)m(y)j(protected)e(with)f(a)h(k)m(ey)m(ed)630 3046 y(SHA1)d(hash)f(in)h(HMA)m(C)h(mo)s(de.)38 b(It)26 b(has)e(no)h(securit)m(y)h(pro)s(of,)f(but)g(is)g(assumed)f(to)i(pro)m (vide)630 3156 y(adequate)31 b(securit)m(y)g(in)f(the)g(sense)g(that)h (kno)m(wledge)g(on)f(ho)m(w)g(to)h(crac)m(k)g(it)g(is)f(not)g(kno)m(wn) 630 3266 y(to)h(the)f(public.)40 b(Note)31 b(that)f(the)h(k)m(ey)f (deriv)-5 b(ation)31 b(function)e(is)h(not)h(widely)f(used)f(outside) 630 3375 y(of)37 b(Kerb)s(eros,)h(hence)f(not)g(widely)g(studied.)60 b(It)37 b(is)g(asso)s(ciated)h(with)f(the)g Fq(hmac-sha1-)630 3485 y(des3-kd)28 b Fw(c)m(hec)m(ksum.)150 3634 y Fq (aes128-cts-hmac-sha1-96)150 3743 y(aes256-cts-hmac-sha1-96)630 3853 y(aes128-cts-hmac-sha1-96)17 b Fw(and)22 b Fq (aes256-cts-hmac-sha1-96)17 b Fw(is)23 b(AES)f(encryption)630 3962 y(and)k(decryption)g(with)g(128)h(bit)g(and)e(256)j(bit)e(k)m(ey) -8 b(,)29 b(resp)s(ectiv)m(ely)-8 b(,)29 b(and)d(16)h(b)m(yte)g(blo)s (c)m(ks)f(in)630 4072 y(CBC)g(mo)s(de)f(with)h(Cipher)f(T)-8 b(ext)27 b(Stealing.)41 b(Cipher)25 b(T)-8 b(ext)26 b(Stealing)i(means) e(data)h(length)630 4182 y(of)37 b(encrypted)f(data)h(is)f(preserv)m (ed)g(\(pure)g(CBC)g(add)g(up)f(to)i(7)g(pad)f(c)m(haracters\).)60 b(The)630 4291 y(k)m(eys)42 b(can)g(b)s(e)e(deriv)m(ed)i(from)f(passw)m (ords)f(with)h(RSA)g(Lab)s(oratories)h(PK)m(CS#5)f(P)m(ass-)630 4401 y(w)m(ord)32 b(Based)i(Key)e(Deriv)-5 b(ation)34 b(F)-8 b(unction)34 b(2)2194 4368 y Fp(3)2232 4401 y Fw(,)f(whic)m(h)f(is)h(allegedly)i(pro)m(v)-5 b(ably)32 b(secure)h(in)630 4510 y(a)h(random)f(oracle)j(mo)s(del.)51 b(Data)35 b(is)f(in)m(tegrit)m(y)i(protected)f(with)e(a)h(k)m(ey)m(ed)h (SHA1)f(hash,)630 4620 y(in)43 b(HMA)m(C)g(mo)s(de,)j(truncated)d(to)h (96)g(bits.)79 b(There)42 b(is)h(no)g(securit)m(y)h(pro)s(of,)h(but)e (the)630 4729 y(sc)m(hemes)30 b(are)h(assumed)e(to)h(pro)m(vide)g (adequate)h(securit)m(y)g(in)f(the)g(sense)f(that)i(kno)m(wledge)630 4839 y(on)k(ho)m(w)g(to)h(crac)m(k)g(them)f(is)g(not)h(kno)m(wn)e(to)i (the)f(public.)55 b(Note)36 b(that)g(AES)e(has)h(y)m(et)h(to)630 4949 y(receiv)m(e)g(the)e(test)h(of)f(time,)i(and)d(the)i(AES)e(cipher) h(encryption)g(mo)s(de)f(\(CBC)h(with)g(Ci-)630 5058 y(phertext)i(Stealing,)k(and)c(a)g(non-standard)g(IV)g(output\))h(is)f (not)h(widely)f(standardized)p 150 5138 1200 4 v 199 5205 a Fp(2)275 5237 y Fn(http://www.research.att.com/~sm)q(b/pap)q (ers/)q(ides)q(.pdf)199 5308 y Fp(3)275 5340 y Fn (http://www.rsasecurity.com/rsal)q(abs/p)q(kcs/)q(pkcs)q(-5/)p eop end %%Page: 7 13 TeXDict begin 7 12 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(7)630 299 y(\(hence)40 b(not)g(widely)g (studied\).)68 b(It)40 b(is)g(asso)s(ciated)h(with)e(the)h Fq(hmac-sha1-96-aes128)630 408 y Fw(and)30 b Fq(hmac-sha1-96-aes256)25 b Fw(c)m(hec)m(ksums,)31 b(resp)s(ectiv)m(ely)-8 b(.)275 564 y(The)32 b(proto)s(col)i(do)f(not)h(include)f(an)m(y)g(w)m(a)m(y)h (to)g(negotiate)i(whic)m(h)d(c)m(hec)m(ksum)h(mec)m(hanisms)f(to)h (use,)150 674 y(so)27 b(in)g(most)g(cases)h(the)f(asso)s(ciated)h(c)m (hec)m(ksum)g(will)f(b)s(e)f(used.)39 b(Ho)m(w)m(ev)m(er,)30 b(c)m(hec)m(ksum)e(mec)m(hanisms)f(can)150 783 y(b)s(e)j(used)g(with)g (other)h(encryption)g(mec)m(hanisms,)g(as)g(long)g(as)g(they)g(are)g (compatible)h(in)f(terms)f(of)h(k)m(ey)150 893 y(format)j(etc.)53 b(Here)34 b(are)h(the)f(names)g(of)g(the)g(supp)s(orted)e(c)m(hec)m (ksum)j(mec)m(hanisms,)g(with)f(some)g(notes)150 1003 y(on)c(their)f(status)h(and)f(the)h(compatible)h(encryption)f(mec)m (hanisms.)41 b(They)29 b(are)h(ordered)f(b)m(y)h(increased)150 1112 y(securit)m(y)h(as)g(p)s(erceiv)m(ed)g(b)m(y)f(the)g(author.)150 1268 y Fq(NULL)630 1401 y(NULL)h Fw(is)h(a)h(dumm)m(y)e(c)m(hec)m(ksum) i(suite)g(for)f(debugging.)46 b(It)32 b(pro)m(vides)h(no)f(in)m(tegrit) m(y)-8 b(.)49 b(It)32 b(is)630 1510 y(w)m(eak.)42 b(It)30 b(is)h(compatible)g(with)f(the)h Fq(NULL)e Fw(encryption)h(mec)m (hanism.)150 1666 y Fq(arcfour-hmac-md5)630 1775 y(arcfour-hmac-md5)18 b Fw(is)23 b(a)h(k)m(ey)m(ed)g(HMA)m(C-MD5)h(c)m(hec)m(ksum)f(computed) e(on)h(a)h(MD5)g(mes-)630 1885 y(sage)35 b(digest,)h(in)e(turn)f (computed)h(on)g(a)h(four)e(b)m(yte)i(message)g(t)m(yp)s(e)g(indicator) g(concate-)630 1995 y(nated)f(with)f(the)h(application)h(data.)51 b(\(The)33 b Fq(arcfour)f Fw(designation)j(is)e(th)m(us)h(somewhat)630 2104 y(misleading,)d(but)f(since)h(this)f(c)m(hec)m(ksum)h(mec)m (hanism)f(is)h(describ)s(ed)e(in)h(the)h(same)f(do)s(cu-)630 2214 y(men)m(t)i(as)f(the)h Fq(arcfour)d Fw(encryption)i(mec)m (hanisms,)h(it)g(is)g(not)f(a)h(completely)h(unnatural)630 2323 y(designation.\))42 b(It)30 b(is)h(w)m(eak.)42 b(It)30 b(is)g(compatible)i(with)e(all)h(encryption)g(mec)m(hanisms.)150 2479 y Fq(rsa-md4)630 2612 y(rsa-md4)19 b Fw(is)j(a)f(unk)m(ey)m(ed)h (MD4)g(hash)f(computed)g(o)m(v)m(er)i(the)e(message.)39 b(It)21 b(is)h(w)m(eak,)i(b)s(ecause)630 2721 y(it)30 b(is)g(unk)m(ey)m(ed.)40 b(Ho)m(w)m(ev)m(er)32 b(applications)f(can,)f (with)f(care,)i(use)e(it)h(non-w)m(eak)h(w)m(a)m(ys)f(\(e.g.,)630 2831 y(b)m(y)e(including)f(the)h(hash)f(in)g(other)h(messages)h(that)f (are)g(protected)h(b)m(y)f(other)g(means\).)40 b(It)630 2941 y(is)30 b(compatible)i(with)e(all)h(encryption)g(mec)m(hanisms.) 150 3096 y Fq(rsa-md4-des)630 3206 y(rsa-md4-des)37 b Fw(is)k(a)g(DES)f(CBC)g(encryption)g(of)h(one)f(blo)s(c)m(k)h(of)g (random)f(data)h(and)f(a)630 3315 y(unk)m(ey)m(ed)21 b(MD4)h(hash)e(computed)g(o)m(v)m(er)i(the)f(random)f(data)i(and)e(the) h(message)g(to)h(in)m(tegrit)m(y)630 3425 y(protect.)60 b(The)36 b(k)m(ey)h(used)e(is)i(deriv)m(ed)f(from)g(the)h(base)f(proto) s(col)h(k)m(ey)h(b)m(y)e(X)m(OR)g(with)h(a)630 3535 y(constan)m(t.)67 b(It)38 b(is)h(w)m(eak.)66 b(It)39 b(is)f(compatible)i(with)e(the)h Fq(des-cbc-crc)p Fw(,)f Fq(des-cbc-md4)p Fw(,)630 3644 y Fq(des-cbc-md5)27 b Fw(encryption)k(mec)m(hanisms.)150 3800 y Fq(rsa-md5)630 3933 y(rsa-md5)19 b Fw(is)j(a)f(unk)m(ey)m(ed)h (MD5)g(hash)f(computed)g(o)m(v)m(er)i(the)e(message.)39 b(It)21 b(is)h(w)m(eak,)i(b)s(ecause)630 4042 y(it)30 b(is)g(unk)m(ey)m(ed.)40 b(Ho)m(w)m(ev)m(er)32 b(applications)f(can,)f (with)f(care,)i(use)e(it)h(non-w)m(eak)h(w)m(a)m(ys)f(\(e.g.,)630 4152 y(b)m(y)e(including)f(the)h(hash)f(in)g(other)h(messages)h(that)f (are)g(protected)h(b)m(y)f(other)g(means\).)40 b(It)630 4261 y(is)30 b(compatible)i(with)e(all)h(encryption)g(mec)m(hanisms.) 150 4417 y Fq(rsa-md5-des)630 4527 y(rsa-md5-des)37 b Fw(is)k(a)g(DES)f(CBC)g(encryption)g(of)h(one)f(blo)s(c)m(k)h(of)g (random)f(data)h(and)f(a)630 4636 y(unk)m(ey)m(ed)21 b(MD5)h(hash)e(computed)g(o)m(v)m(er)i(the)f(random)f(data)i(and)e(the) h(message)g(to)h(in)m(tegrit)m(y)630 4746 y(protect.)60 b(The)36 b(k)m(ey)h(used)e(is)i(deriv)m(ed)f(from)g(the)h(base)f(proto) s(col)h(k)m(ey)h(b)m(y)e(X)m(OR)g(with)h(a)630 4855 y(constan)m(t.)67 b(It)38 b(is)h(w)m(eak.)66 b(It)39 b(is)f(compatible)i(with)e(the)h Fq(des-cbc-crc)p Fw(,)f Fq(des-cbc-md4)p Fw(,)630 4965 y Fq(des-cbc-md5)27 b Fw(encryption)k(mec)m(hanisms.)150 5121 y Fq(hmac-sha1-des3-kd)630 5230 y(hmac-sha1-des3-kd)39 b Fw(is)44 b(a)h(k)m(ey)m(ed)g(SHA1)f(hash)f(in)h(HMA)m(C)g(mo)s(de)g (computed)g(o)m(v)m(er)630 5340 y(the)35 b(message.)54 b(The)34 b(k)m(ey)h(is)f(deriv)m(ed)h(from)f(the)h(base)f(proto)s(col)i (b)m(y)e(the)g(simpli\014ed)g(k)m(ey)p eop end %%Page: 8 14 TeXDict begin 8 13 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(8)630 299 y(deriv)-5 b(ation)33 b(function)f(\(similar)g(to)h(the)f(passw)m(ord)g(k)m(ey)h(deriv)-5 b(ation)32 b(functions)g(of)g Fq(des3-)630 408 y(cbc-sha1-kd)p Fw(,)g(whic)m(h)h(do)s(es)g(not)h(app)s(ear)f(to)i(b)s(e)e(widely)g (used)g(outside)h(Kerb)s(eros)f(and)630 518 y(hence)f(not)f(widely)g (studied\).)44 b(It)31 b(has)g(no)h(securit)m(y)g(pro)s(of,)f(but)g(is) g(assumed)g(to)h(pro)m(vide)630 628 y(go)s(o)s(d)21 b(securit)m(y)-8 b(.)39 b(The)20 b(w)m(eak)m(est)j(part)e(is)g(lik)m(ely)h(the)f (proprietary)g(k)m(ey)g(deriv)-5 b(ation)22 b(function.)630 737 y(It)30 b(is)h(compatible)h(with)e(the)g Fq(des3-cbc-sha1-kd)c Fw(encryption)k(mec)m(hanism.)150 891 y Fq(hmac-sha1-96-aes128)150 1001 y(hmac-sha1-96-aes256)630 1110 y(hmac-sha1-96-aes*)k Fw(are)39 b(k)m(ey)m(ed)h(SHA1)f(hashes)f(in)g(HMA)m(C)i(mo)s(de)e (computed)h(o)m(v)m(er)630 1220 y(the)c(message)g(and)f(then)g (truncated)h(to)g(96)h(bits.)53 b(The)34 b(k)m(ey)h(is)f(deriv)m(ed)h (from)f(the)h(base)630 1330 y(proto)s(col)c(b)m(y)f(the)g(simpli\014ed) f(k)m(ey)i(deriv)-5 b(ation)31 b(function)e(\(similar)i(to)g(the)f (passw)m(ord)f(k)m(ey)630 1439 y(deriv)-5 b(ation)45 b(functions)e(of)h Fq(aes*-cts-hmac-sha1-96)p Fw(,)e(i.e.,)49 b(PK)m(CS#5\).)81 b(It)44 b(has)g(no)630 1549 y(securit)m(y)34 b(pro)s(of,)f(but)g(is)g(assumed)g(to)g(pro)m(vide)h(go)s(o)s(d)f (securit)m(y)-8 b(.)50 b(It)34 b(is)f(compatible)h(with)630 1658 y(the)d Fq(aes*-cts-hmac-sha1-96)24 b Fw(encryption)30 b(mec)m(hanisms.)275 1812 y(Sev)m(eral)36 b(of)h(the)f(cipher)f(suites) h(ha)m(v)m(e)i(long)e(names)g(that)h(can)f(b)s(e)f(hard)g(to)i (memorize.)58 b(F)-8 b(or)37 b(y)m(our)150 1922 y(con)m(v)m(enience,)42 b(the)c(follo)m(wing)h(short-hand)d(aliases)k(exists.)63 b(They)37 b(can)h(b)s(e)f(used)g(wherev)m(er)g(the)h(full)150 2032 y(encryption)30 b(names)h(are)f(used.)150 2186 y Fq(arcfour)630 2317 y Fw(Alias)h(for)f Fq(arcfour-hmac)p Fw(.)150 2471 y Fq(des-crc)630 2603 y Fw(Alias)h(for)f Fq(des-cbc-crc)p Fw(.)150 2757 y Fq(des-md4)630 2889 y Fw(Alias)h(for)f Fq(des-cbc-md4)p Fw(.)150 3043 y Fq(des-md5)150 3153 y(des)630 3284 y Fw(Alias)h(for)f Fq(des-cbc-md5)p Fw(.)150 3438 y Fq(des3)150 3548 y(3des)630 3680 y Fw(Alias)h(for)f Fq(des3-cbc-sha1-kd)p Fw(.)150 3834 y Fq(aes128)630 3966 y Fw(Alias)h(for)f Fq(aes128-cts-hmac-sha1-96)p Fw(.)150 4120 y Fq(aes)150 4229 y(aes256)630 4361 y Fw(Alias)h(for)f Fq(aes256-cts-hmac-sha1-96)p Fw(.)150 4588 y Fv(1.5)68 b(Supp)t(orted)44 b(Platforms)150 4748 y Fw(Shishi)21 b(has)h(at)h(some)f(p)s(oin)m(t)g(in)g(time)h(b)s(een)e(tested)i(on)f (the)g(follo)m(wing)i(platforms.)38 b(Online)22 b(build)f(rep)s(orts) 150 4857 y(for)33 b(eac)m(h)h(platforms)f(and)f(Shishi)g(v)m(ersion)i (is)f(a)m(v)-5 b(ailable)35 b(at)f Fq(http:)r(/)r(/)r(autobuild)r(.)r (josef)o(sson)q(.)r(or)o(g)r(/)150 4967 y(shishi/)p Fw(.)199 5099 y(1.)61 b(Debian)31 b(GNU/Lin)m(ux)g(3.0)g(\(W)-8 b(o)s(o)s(dy\))330 5230 y(GCC)39 b(2.95.4)j(and)c(GNU)i(Mak)m(e.)69 b(This)39 b(is)g(the)h(main)f(dev)m(elopmen)m(t)i(platform.)68 b Fq(alphaev67-)330 5340 y(unknown-linux-gnu)p Fw(,)140 b Fq(alphaev6-unknown-linux-gnu)o Fw(,)f Fq(arm-unknown-linux-gnu)p Fw(,)p eop end %%Page: 9 15 TeXDict begin 9 14 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(9)330 299 y Fq(armv4l-unknown-linux-gnu)o Fw(,)81 b Fq(hppa-unknown-linux-gnu)p Fw(,)f Fq(hppa64-unknown-linux-) 330 408 y(gnu)p Fw(,)88 b Fq(i686-pc-linux-gnu)p Fw(,)83 b Fq(ia64-unknown-linux-gnu)p Fw(,)g Fq(m68k-unknown-linux-gnu)p Fw(,)330 518 y Fq(mips-unknown-linux-gnu)p Fw(,)56 b Fq(mipsel-unknown-linux-gnu)p Fw(,)g Fq(powerpc-unknown-linux-)330 628 y(gnu)p Fw(,)64 b Fq(s390-ibm-linux-gnu)p Fw(,)c Fq(sparc-unknown-linux-gnu)p Fw(,)f Fq(sparc64-unknown-linux-)330 737 y(gnu)p Fw(.)199 872 y(2.)i(Debian)31 b(GNU/Lin)m(ux)g(2.1)330 1008 y(GCC)f(2.95.4)j(and)c(GNU)i(Mak)m(e.)43 b Fq (armv4l-unknown-linux-gn)o(u)p Fw(.)199 1143 y(3.)61 b(T)-8 b(ru64)30 b(UNIX)330 1278 y(T)-8 b(ru64)32 b(UNIX)h(C)f (compiler)h(and)f(T)-8 b(ru64)33 b(Mak)m(e.)48 b Fq (alphaev67-dec-osf5.1)p Fw(,)28 b Fq(alphaev68-dec-)330 1387 y(osf5.1)p Fw(.)199 1523 y(4.)61 b(SuSE)29 b(Lin)m(ux)h(7.1)330 1658 y(GCC)47 b(2.96)j(and)d(GNU)i(Mak)m(e.)95 b Fq (alphaev6-unknown-linux-)o(gnu)o Fw(,)47 b Fq(alphaev67-unknown-)330 1767 y(linux-gnu)p Fw(.)199 1903 y(5.)61 b(SuSE)29 b(Lin)m(ux)h(7.2a) 330 2038 y(GCC)g(3.0)h(and)f(GNU)h(Mak)m(e.)42 b Fq (ia64-unknown-linux-gnu)p Fw(.)199 2173 y(6.)61 b(SuSE)29 b(Lin)m(ux)330 2308 y(GCC)74 b(3.2.2)h(and)f(GNU)h(Mak)m(e.)173 b Fq(x86_64-unknown-linux-gnu)67 b Fw(\(AMD64)76 b(Opteron)330 2418 y(\\Melo)s(dy"\).)199 2553 y(7.)61 b(RedHat)31 b(Lin)m(ux)f(7.2) 330 2688 y(GCC)47 b(2.96)j(and)d(GNU)i(Mak)m(e.)95 b Fq(alphaev6-unknown-linux-)o(gnu)o Fw(,)47 b Fq(alphaev67-unknown-)330 2798 y(linux-gnu)p Fw(,)28 b Fq(ia64-unknown-linux-gnu)p Fw(.)199 2933 y(8.)61 b(RedHat)31 b(Lin)m(ux)f(8.0)330 3068 y(GCC)g(3.2)h(and)f(GNU)h(Mak)m(e.)42 b Fq(i686-pc-linux-gnu)p Fw(.)199 3203 y(9.)61 b(RedHat)31 b(Adv)-5 b(anced)30 b(Serv)m(er)h(2.1)330 3338 y(GCC)f(2.96)i(and)e(GNU)h(Mak)m(e.)42 b Fq(i686-pc-linux-gnu)p Fw(.)154 3473 y(10.)61 b(Slac)m(kw)m(are)32 b(Lin)m(ux)e(8.0.01)330 3608 y(GCC)g(2.95.3)j(and)c(GNU)i(Mak)m(e.)43 b Fq(i686-pc-linux-gnu)p Fw(.)154 3744 y(11.)61 b(Mandrak)m(e)31 b(Lin)m(ux)f(9.0)330 3879 y(GCC)g(3.2)h(and)f(GNU)h(Mak)m(e.)42 b Fq(i686-pc-linux-gnu)p Fw(.)154 4014 y(12.)61 b(IRIX)30 b(6.5)330 4149 y(MIPS)g(C)g(compiler,)h(IRIX)f(Mak)m(e.)42 b Fq(mips-sgi-irix6.5)p Fw(.)154 4284 y(13.)61 b(AIX)30 b(4.3.2)330 4419 y(IBM)h(C)f(for)g(AIX)g(compiler,)i(AIX)e(Mak)m(e.)42 b Fq(rs6000-ibm-aix4.3.2.0)p Fw(.)154 4555 y(14.)61 b(HP-UX)31 b(11)330 4690 y(HP-UX)g(C)f(compiler)h(and)f(HP)g(Mak)m(e.)42 b Fq(ia64-hp-hpux11.22)p Fw(,)26 b Fq(hppa2.0w-hp-hpux11.11)p Fw(.)154 4825 y(15.)61 b(SUN)30 b(Solaris)h(2.8)330 4960 y(Sun)e(W)-8 b(orkShop)30 b(Compiler)g(C)g(6.0)i(and)d(SUN)i(Mak)m(e.) 42 b Fq(sparc-sun-solaris2.8)p Fw(.)154 5095 y(16.)61 b(NetBSD)32 b(1.6)330 5230 y(GCC)85 b(2.95.3)j(and)d(GNU)h(Mak)m(e.)208 b Fq(alpha-unknown-netbsd1.6)p Fw(,)94 b Fq(i386-unknown-)330 5340 y(netbsdelf1.6)p Fw(.)p eop end %%Page: 10 16 TeXDict begin 10 15 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2546 b(10)154 299 y(17.)61 b(Op)s(enBSD)29 b(3.1)j(and)e(3.2)330 434 y(GCC)79 b(2.95.3)j(and)e(GNU)g(Mak)m(e.)191 b Fq(alpha-unknown-openbsd3.)o(1)p Fw(,)87 b Fq(i386-unknown-)330 544 y(openbsd3.1)p Fw(.)154 679 y(18.)61 b(F)-8 b(reeBSD)32 b(4.7)f(and)f(4.8)330 814 y(GCC)74 b(2.95.4)i(and)d(GNU)i(Mak)m(e.)173 b Fq(alpha-unknown-freebsd4.7)p Fw(,)79 b Fq(alpha-unknown-)330 923 y(freebsd4.8)p Fw(,)28 b Fq(i386-unknown-freebsd4.7)p Fw(,)c Fq(i386-unknown-freebsd4.8)p Fw(.)154 1058 y(19.)61 b(MacOS)31 b(X)f(10.2)i(Serv)m(er)e(Edition)330 1194 y(GCC)g(3.1)h(and)f(GNU)h(Mak)m(e.)42 b Fq(powerpc-apple-darwin6.5)p Fw(.)154 1329 y(20.)61 b(Cross)30 b(compiled)h(to)g(uClin)m(ux/uClib)s (c)e(on)h(Motorola)j(Cold\014re.)330 1464 y(GCC)d(3.4)h(and)f(GNU)h (Mak)m(e)h Fq(m68k-uclinux-elf)p Fw(.)275 1625 y(If)26 b(y)m(ou)h(use)g(Shishi)e(on,)j(or)f(p)s(ort)f(Shishi)g(to,)j(a)e(new)f (platform)h(please)h(rep)s(ort)e(it)i(to)f(the)g(author)g(\(see)150 1735 y(Section)k(1.9)h([Bug)f(Rep)s(orts],)f(page)h(11\).)150 1969 y Fv(1.6)68 b(Getting)46 b(help)150 2128 y Fw(A)37 b(mailing)g(list)h(where)e(users)g(of)g(Shishi)g(ma)m(y)h(help)f(eac)m (h)i(other)f(exists,)i(and)d(y)m(ou)h(can)g(reac)m(h)h(it)f(b)m(y)150 2238 y(sending)c(e-mail)i(to)g Fq(help-shishi@gnu)s(.)r(org)p Fw(.)46 b(Arc)m(hiv)m(es)35 b(of)f(the)g(mailing)g(list)h(discussions,) f(and)f(an)150 2347 y(in)m(terface)38 b(to)f(manage)g(subscriptions,)g (is)g(a)m(v)-5 b(ailable)39 b(through)c(the)i(W)-8 b(orld)37 b(Wide)g(W)-8 b(eb)37 b(at)g Fq(http:)5 b(/)g(/)150 2457 y(lists.gnu.org/mailman/li)o(stin)o(fo/h)o(elp)o(-shi)o(shi)p Fw(.)150 2691 y Fv(1.7)68 b(Commercial)47 b(Supp)t(ort)150 2851 y Fw(Commercial)f(supp)s(ort)d(is)h(a)m(v)-5 b(ailable)47 b(for)e(users)f(of)h(Shishi.)82 b(The)44 b(kind)g(of)h(supp)s(ort)e (that)j(can)f(b)s(e)150 2960 y(purc)m(hased)30 b(ma)m(y)g(include:)225 3096 y Fu(\017)60 b Fw(Implemen)m(t)45 b(new)f(features.)83 b(Suc)m(h)44 b(as)h(supp)s(ort)e(for)h(some)h(optional)h(part)e(of)h (the)g(Kerb)s(eros)330 3206 y(standards,)30 b(e.g.)41 b(PKINIT,)30 b(hardw)m(are)g(tok)m(en)h(authen)m(tication.)225 3341 y Fu(\017)60 b Fw(P)m(ort)31 b(Shishi)e(to)i(new)f(platforms.)41 b(This)29 b(could)i(include)f(p)s(orting)g(Shishi)f(to)i(an)f(em)m(b)s (edded)f(plat-)330 3450 y(forms)h(that)h(ma)m(y)g(need)f(memory)g(or)g (size)i(optimization.)225 3585 y Fu(\017)60 b Fw(In)m(tegrate)32 b(Kerb)s(eros)e(5)g(supp)s(ort)f(in)h(y)m(our)g(existing)i(pro)5 b(ject.)225 3720 y Fu(\017)60 b Fw(System)30 b(design)g(of)h(comp)s (onen)m(ts)f(related)i(to)f(Kerb)s(eros)e(5.)275 3882 y(If)g(y)m(ou)i(are)g(in)m(terested,)h(please)f(write)f(to:)150 4017 y Fq(Simon)46 b(Josefsson)g(Datakonsult)150 4127 y(Hagagatan)f(24)150 4237 y(113)i(47)g(Stockholm)150 4346 y(Sweden)150 4565 y(E-mail:)f(simon@josefsson.org)275 4701 y Fw(If)25 b(y)m(our)h(compan)m(y)g(pro)m(vides)g(supp)s(ort)e (related)j(to)g(Shishi)d(and)i(w)m(ould)f(lik)m(e)i(to)g(b)s(e)e(men)m (tioned)i(here,)150 4811 y(con)m(tact)33 b(the)d(author)g(\(see)i (Section)f(1.9)g([Bug)g(Rep)s(orts],)g(page)g(11\).)150 5045 y Fv(1.8)68 b(Do)l(wnloading)46 b(and)f(Installing)150 5204 y Fw(The)30 b(pac)m(k)-5 b(age)32 b(can)f(b)s(e)f(do)m(wnloaded)g (from)g(sev)m(eral)i(places,)f(including:)275 5340 y Fq(ftp://alpha.gnu.org/pub)o(/gn)o(u/sh)o(ishi)o(/)p eop end %%Page: 11 17 TeXDict begin 11 16 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2546 b(11)275 299 y(The)39 b(latest)j(v)m(ersion)f (is)g(stored)f(in)g(a)h(\014le,)i(e.g.,)i(`)p Fq(shishi-1.0.2.tar.gz)p Fw(')35 b(where)40 b(the)h(`)p Fq(1.0.2)p Fw(')150 408 y(indicate)31 b(the)g(highest)g(v)m(ersion)f(n)m(um)m(b)s(er.)275 542 y(The)j(pac)m(k)-5 b(age)35 b(is)f(then)f(extracted,)j (con\014gured)c(and)h(built)h(lik)m(e)g(man)m(y)g(other)g(pac)m(k)-5 b(ages)35 b(that)f(use)150 651 y(Auto)s(conf.)54 b(F)-8 b(or)36 b(detailed)g(information)f(on)g(con\014guring)f(and)g(building) g(it,)j(refer)e(to)g(the)g(`)p Fq(INSTALL)p Fw(')150 761 y(\014le)30 b(that)h(is)g(part)f(of)h(the)f(distribution)g(arc)m (hiv)m(e.)275 894 y(Here)44 b(is)g(an)g(example)h(terminal)g(session)f (that)h(do)m(wnload,)j(con\014gure,)f(build)c(and)h(install)h(the)150 1004 y(pac)m(k)-5 b(age.)43 b(Y)-8 b(ou)31 b(will)f(need)g(a)h(few)f (basic)h(to)s(ols,)h(suc)m(h)e(as)g(`)p Fq(sh)p Fw(',)h(`)p Fq(make)p Fw(')e(and)h(`)p Fq(cc)p Fw('.)390 1137 y Fq($)47 b(wget)g(-q)g(ftp://alpha.gnu.org/pub/g)o(nu/s)o(hish)o(i/s)o(hish)o (i-1.)o(0.2)o(.tar)o(.gz)390 1246 y($)g(tar)g(xfz)g (shishi-1.0.2.tar.gz)390 1356 y($)g(cd)h(shishi-1.0.2/)390 1466 y($)f(./configure)390 1575 y(...)390 1685 y($)g(make)390 1794 y(...)390 1904 y($)g(make)g(install)390 2014 y(...)275 2147 y Fw(After)27 b(this)f(y)m(ou)h(should)f(b)s(e)g(prepared)g(to)h (con)m(tin)m(ue)h(with)f(the)g(user,)g(administration)g(or)g(program-) 150 2256 y(ming)j(man)m(ual,)h(dep)s(ending)e(on)h(ho)m(w)h(y)m(ou)f(w) m(an)m(t)i(to)f(use)f(Shishi.)275 2390 y(A)g(few)g Fq(configure)e Fw(options)j(ma)m(y)g(b)s(e)e(relev)-5 b(an)m(t,)32 b(summarized)e(in)g (the)h(table.)150 2546 y Fq(--disable-des)150 2656 y(--disable-3des)150 2766 y(--disable-aes)150 2875 y(--disable-md)150 2985 y(--disable-null)150 3094 y(--disable-arcfour)630 3204 y Fw(Disable)45 b(a)g(cryptographic)f(algorithm)i(at)f(compile)g(time.) 82 b(Usually)45 b(it)g(is)f(b)s(etter)g(to)630 3314 y(disable)34 b(algorithms)g(during)f(run-time)g(with)g(the)h(con\014guration)g (\014le,)h(but)e(this)h(allo)m(ws)630 3423 y(y)m(ou)d(to)g(reduce)f (the)h(co)s(de)f(size)h(sligh)m(tly)-8 b(.)150 3580 y Fq(--disable-starttls)630 3689 y Fw(Disable)30 b(the)e(exp)s(erimen)m (tal)i(TLS)d(supp)s(ort)g(for)h(KDC)h(connections.)41 b(If)28 b(y)m(ou)h(do)f(not)h(use)630 3799 y(a)i(Shishi)e(KDC,)h(this)h (supp)s(ort)d(is)j(of)f(no)g(use)g(so)h(y)m(ou)g(could)f(safely)h (disable)g(it.)150 3956 y Fq(--without-stringprep)630 4065 y Fw(Disable)g(in)m(ternationalized)i(string)e(pro)s(cessing.)275 4222 y(F)-8 b(or)31 b(the)f(complete)i(list,)f(refer)f(to)i(the)e (output)g(from)g Fq(configure)e(--help)p Fw(.)150 4452 y Fv(1.9)68 b(Bug)45 b(Rep)t(orts)150 4612 y Fw(If)30 b(y)m(ou)h(think)f(y)m(ou)g(ha)m(v)m(e)i(found)d(a)i(bug)e(in)h (Shishi,)g(please)h(in)m(v)m(estigate)j(it)d(and)e(rep)s(ort)h(it.)225 4745 y Fu(\017)60 b Fw(Please)41 b(mak)m(e)g(sure)f(that)g(the)h(bug)e (is)h(really)h(in)f(Shishi,)h(and)f(preferably)f(also)i(c)m(hec)m(k)h (that)e(it)330 4854 y(hasn't)30 b(already)h(b)s(een)f(\014xed)g(in)g (the)g(latest)i(v)m(ersion.)225 4988 y Fu(\017)60 b Fw(Y)-8 b(ou)31 b(ha)m(v)m(e)g(to)h(send)d(us)h(a)h(test)g(case)g(that)g(mak)m (es)g(it)g(p)s(ossible)f(for)g(us)g(to)h(repro)s(duce)e(the)i(bug.)225 5121 y Fu(\017)60 b Fw(Y)-8 b(ou)29 b(also)h(ha)m(v)m(e)g(to)g(explain) f(what)g(is)g(wrong;)g(if)g(y)m(ou)g(get)h(a)f(crash,)h(or)f(if)f(the)h (results)g(prin)m(ted)g(are)330 5230 y(not)36 b(go)s(o)s(d)g(and)g(in)g (that)g(case,)j(in)d(what)g(w)m(a)m(y)-8 b(.)59 b(Mak)m(e)38 b(sure)d(that)i(the)f(bug)g(rep)s(ort)f(includes)h(all)330 5340 y(information)31 b(y)m(ou)f(w)m(ould)h(need)f(to)h(\014x)f(this)g (kind)f(of)i(bug)f(for)g(someone)h(else.)p eop end %%Page: 12 18 TeXDict begin 12 17 bop 150 -116 a Fw(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2546 b(12)275 299 y(Please)36 b(mak)m(e)f(an)g (e\013ort)h(to)f(pro)s(duce)f(a)h(self-con)m(tained)i(rep)s(ort,)f (with)e(something)i(de\014nite)e(that)150 408 y(can)29 b(b)s(e)g(tested)g(or)g(debugged.)40 b(V)-8 b(ague)31 b(queries)e(or)g(piecemeal)h(messages)g(are)g(di\016cult)f(to)h(act)g (on)f(and)150 518 y(don't)h(help)g(the)h(dev)m(elopmen)m(t)h(e\013ort.) 275 653 y(If)e(y)m(our)g(bug)g(rep)s(ort)g(is)g(go)s(o)s(d,)h(w)m(e)g (will)g(do)f(our)g(b)s(est)g(to)i(help)e(y)m(ou)g(to)i(get)f(a)g (corrected)h(v)m(ersion)f(of)150 762 y(the)j(soft)m(w)m(are;)j(if)d (the)g(bug)f(rep)s(ort)g(is)h(p)s(o)s(or,)g(w)m(e)g(w)m(on't)g(do)g(an) m(ything)g(ab)s(out)g(it)g(\(apart)g(from)f(asking)150 872 y(y)m(ou)e(to)g(send)e(b)s(etter)i(bug)f(rep)s(orts\).)275 1006 y(If)19 b(y)m(ou)i(think)f(something)h(in)f(this)g(man)m(ual)h(is) f(unclear,)j(or)d(do)m(wnrigh)m(t)h(incorrect,)i(or)e(if)f(the)h (language)150 1116 y(needs)30 b(to)h(b)s(e)f(impro)m(v)m(ed,)h(please)g (also)g(send)f(a)h(note.)275 1250 y(Send)e(y)m(our)h(bug)g(rep)s(ort)g (to:)1352 1360 y(`)p Fq(bug-shishi@josefsson.org)p Fw(')150 1592 y Fv(1.10)68 b(Con)l(tributing)150 1752 y Fw(If)25 b(y)m(ou)h(w)m(an)m(t)g(to)g(submit)f(a)h(patc)m(h)g(for)f(inclusion)h ({)f(from)h(solv)m(e)g(a)g(t)m(yp)s(o)g(y)m(ou)g(disco)m(v)m(ered,)i (up)c(to)i(adding)150 1861 y(supp)s(ort)38 b(for)h(a)h(new)e(feature)i ({)g(y)m(ou)g(should)e(submit)h(it)h(as)f(a)h(bug)f(rep)s(ort)f(\(see)j (Section)f(1.9)g([Bug)150 1971 y(Rep)s(orts],)29 b(page)g(11\).)42 b(There)28 b(are)h(some)g(things)f(that)h(y)m(ou)g(can)g(do)g(to)g (increase)g(the)g(c)m(hances)h(for)e(it)h(to)150 2081 y(b)s(e)h(included)f(in)h(the)h(o\016cial)h(pac)m(k)-5 b(age.)275 2215 y(Unless)41 b(y)m(our)g(patc)m(h)h(is)f(v)m(ery)h (small)g(\(sa)m(y)-8 b(,)46 b(under)40 b(10)i(lines\))g(w)m(e)f (require)g(that)h(y)m(ou)g(assign)g(the)150 2325 y(cop)m(yrigh)m(t)d (of)f(y)m(our)f(w)m(ork)h(to)g(the)g(F)-8 b(ree)39 b(Soft)m(w)m(are)f (F)-8 b(oundation.)63 b(This)37 b(is)g(to)i(protect)f(the)g(freedom)150 2434 y(of)44 b(the)g(pro)5 b(ject.)81 b(If)43 b(y)m(ou)h(ha)m(v)m(e)h (not)f(already)h(signed)e(pap)s(ers,)j(w)m(e)f(will)f(send)f(y)m(ou)h (the)g(necessary)150 2544 y(information)31 b(when)e(y)m(ou)i(submit)e (y)m(our)i(con)m(tribution.)275 2678 y(F)-8 b(or)33 b(con)m(tributions) h(that)f(do)s(esn't)g(consist)g(of)g(actual)i(programming)d(co)s(de,)i (the)g(only)f(guidelines)150 2788 y(are)e(common)f(sense.)41 b(Use)31 b(it.)275 2922 y(F)-8 b(or)31 b(co)s(de)f(con)m(tributions,)h (a)g(n)m(um)m(b)s(er)e(of)i(st)m(yle)g(guides)g(will)f(help)g(y)m(ou:) 225 3057 y Fu(\017)60 b Fw(Co)s(ding)32 b(St)m(yle.)48 b(F)-8 b(ollo)m(w)34 b(the)f(GNU)g(Standards)e(do)s(cumen)m(t)i(\(see)g Fu(h)p Fw(unde\014ned)p Fu(i)e Fw([top],)j(page)f Fu(h)p Fw(un-)330 3166 y(de\014ned)p Fu(i)p Fw(\).)330 3301 y(If)42 b(y)m(ou)h(normally)f(co)s(de)h(using)f(another)g(co)s(ding)h (standard,)i(there)d(is)h(no)f(problem,)j(but)d(y)m(ou)330 3411 y(should)h(use)g(`)p Fq(indent)p Fw(')g(to)i(reformat)f(the)g(co)s (de)g(\(see)h Fu(h)p Fw(unde\014ned)p Fu(i)d Fw([top],)48 b(page)d Fu(h)p Fw(unde\014ned)p Fu(i)p Fw(\))330 3520 y(b)s(efore)30 b(submitting)g(y)m(our)g(w)m(ork.)225 3655 y Fu(\017)60 b Fw(Use)31 b(the)f(uni\014ed)f(di\013)h(format)h(`)p Fq(diff)f(-u)p Fw('.)225 3789 y Fu(\017)60 b Fw(Return)28 b(errors.)40 b(The)28 b(only)h(v)-5 b(alid)29 b(reason)h(for)e(ev)m(er) i(ab)s(orting)f(the)g(execution)h(of)f(the)g(program)g(is)330 3899 y(due)f(to)i(memory)f(allo)s(cation)i(errors,)e(but)f(for)h(that)g (y)m(ou)g(should)f(call)j(`)p Fq(shishi_xalloc_die)p Fw(')24 b(to)330 4008 y(allo)m(w)32 b(the)e(application)i(to)f(reco)m (v)m(er)h(if)f(it)g(w)m(an)m(ts)g(to.)225 4143 y Fu(\017)60 b Fw(Design)38 b(with)g(thread)f(safet)m(y)i(in)e(mind.)62 b(Don't)38 b(use)g(global)g(v)-5 b(ariables.)64 b(Don't)38 b(ev)m(en)g(write)g(to)330 4252 y(p)s(er-handle)27 b(global)j(v)-5 b(ariables)28 b(unless)g(the)g(do)s(cumen)m(ted)g(b)s(eha)m(viour)g(of) g(the)g(function)g(y)m(ou)h(write)330 4362 y(is)h(to)i(write)e(to)h (the)g(p)s(er-handle)e(global)j(v)-5 b(ariable.)225 4496 y Fu(\017)60 b Fw(Av)m(oid)38 b(using)f(the)g(C)g(math)g(library)-8 b(.)61 b(It)37 b(causes)h(problems)e(for)h(em)m(b)s(edded)f(implemen)m (tations,)330 4606 y(and)30 b(in)g(most)h(situations)g(it)g(is)f(v)m (ery)h(easy)g(to)g(a)m(v)m(oid)h(using)e(it.)225 4741 y Fu(\017)60 b Fw(Do)s(cumen)m(t)23 b(y)m(our)f(functions.)37 b(Use)23 b(commen)m(ts)g(b)s(efore)f(eac)m(h)h(function)f(headers,)h (that,)i(if)d(prop)s(erly)330 4850 y(formatted,)31 b(are)g(extracted)h (in)m(to)f(T)-8 b(exinfo)31 b(man)m(uals)f(and)g(GTK-DOC)g(w)m(eb)h (pages.)225 4985 y Fu(\017)60 b Fw(Supply)29 b(a)h(ChangeLog)h(and)f (NEWS)g(en)m(tries,)i(where)e(appropriate.)p eop end %%Page: 13 19 TeXDict begin 13 18 bop 150 -116 a Fw(Chapter)30 b(2:)41 b(User)30 b(Man)m(ual)2537 b(13)150 299 y Ft(2)80 b(User)53 b(Man)l(ual)150 518 y Fw(Usually)28 b(Shishi)e(in)m(teracts)j(with)f(y) m(ou)f(to)i(get)f(some)g(initial)h(authen)m(tication)h(information)d (lik)m(e)i(a)f(pass-)150 628 y(w)m(ord,)h(and)e(then)h(con)m(tacts)j(a) e(serv)m(er)f(to)h(receiv)m(e)i(a)d(so)h(called)h(tic)m(k)m(et)h(gran)m (ting)e(tic)m(k)m(et.)43 b(F)-8 b(rom)28 b(no)m(w)h(on,)150 737 y(y)m(ou)37 b(rarely)g(in)m(teract)h(with)e(Shishi)f(directly)-8 b(.)61 b(Applications)37 b(that)g(need)g(securit)m(y)g(services)g (instruct)150 847 y(the)28 b(Shishi)e(library)h(to)h(use)f(the)g(tic)m (k)m(et)j(gran)m(ting)f(tic)m(k)m(et)h(to)e(get)g(new)f(tic)m(k)m(ets)j (for)d(v)-5 b(arious)27 b(serv)m(ers.)40 b(An)150 956 y(example)33 b(could)f(b)s(e)f(if)h(y)m(ou)h(log)g(on)f(to)h(a)f(host)g (remotely)i(via)e(`)p Fq(telnet)p Fw('.)45 b(The)31 b(host)i(usually)e (requires)150 1066 y(authen)m(tication)g(b)s(efore)d(p)s(ermitting)g(y) m(ou)h(in.)40 b(The)28 b(`)p Fq(telnet)p Fw(')f(clien)m(t)j(uses)e(the) h(tic)m(k)m(et)i(gran)m(ting)e(tic)m(k)m(et)150 1176 y(to)d(get)g(a)g(tic)m(k)m(et)i(for)d(the)g(serv)m(er,)i(and)e(then)g (uses)g(this)g(tic)m(k)m(et)j(to)e(authen)m(ticate)h(y)m(ou)f(against)g (the)g(serv)m(er)150 1285 y(\(t)m(ypically)36 b(the)e(serv)m(er)g(is)g (also)h(authen)m(ticated)h(to)f(y)m(ou\).)52 b(Y)-8 b(ou)34 b(p)s(erform)f(the)h(initial)h(authen)m(tication)150 1395 y(b)m(y)28 b(t)m(yping)h Fq(shishi)d Fw(at)j(the)g(prompt.)39 b(Sometimes)29 b(it)f(is)h(necessary)f(to)h(supply)e(options)i(telling) g(Shishi)150 1504 y(what)42 b(y)m(our)g(principal)f(name)h(\(user)g (name)g(in)g(the)g(Kerb)s(eros)f(realm\))i(or)f(y)m(our)g(realm)g(is.) 75 b(In)42 b(the)150 1614 y(example,)31 b(I)f(sp)s(ecify)g(the)h(clien) m(t)h(name)e Fq(simon@JOSEFSSON.ORG)p Fw(.)390 1745 y Fq($)47 b(shishi)g(simon@JOSEFSSON.ORG)390 1855 y(Enter)f(password)g (for)h(`simon@JOSEFSSON.ORG':)390 1965 y(simon@JOSEFSSON.ORG:)390 2074 y(Authtime:)332 b(Fri)47 b(Aug)f(15)i(04:44:49)d(2003)390 2184 y(Endtime:)380 b(Fri)47 b(Aug)f(15)i(05:01:29)d(2003)390 2293 y(Server:)428 b(krbtgt/JOSEFSSON.ORG)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 2403 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e(by)i(des3-cbc-sha1-kd)c (\(16\))390 2513 y(Ticket)j(flags:)142 b(INITIAL)45 b(\(512\))390 2622 y($)275 2754 y Fw(As)30 b(y)m(ou)h(can)f(see,)h(Shishi)f(also)h (prin)m(ts)f(a)h(short)f(description)g(of)h(the)f(tic)m(k)m(et)j (receiv)m(ed.)275 2885 y(A)27 b(logical)i(next)e(step)g(is)g(to)g (displa)m(y)g(all)h(tic)m(k)m(ets)h(y)m(ou)f(ha)m(v)m(e)g(receiv)m(ed.) 41 b(By)27 b(the)g(w)m(a)m(y)-8 b(,)29 b(the)e(tic)m(k)m(ets)j(are)150 2995 y(usually)e(stored)g(as)h(text)g(in)f(`)p Fq(~/.shishi/tickets)p Fw('.)36 b(This)27 b(is)i(ac)m(hiev)m(ed)h(b)m(y)e(t)m(yping)h Fq(shishi)f(--list)p Fw(.)390 3126 y Fq($)47 b(shishi)g(--list)390 3236 y(Tickets)f(in)h(`/home/jas/.shishi/ticke)o(ts':)390 3455 y(jas@JOSEFSSON.ORG:)390 3565 y(Authtime:)332 b(Fri)47 b(Aug)f(15)i(04:49:46)d(2003)390 3674 y(Endtime:)380 b(Fri)47 b(Aug)f(15)i(05:06:26)d(2003)390 3784 y(Server:)428 b(krbtgt/JOSEFSSON.ORG)42 b(key)47 b(des-cbc-md5)e(\(3\))390 3893 y(Ticket)h(key:)238 b(des-cbc-md5)44 b(\(3\))j(protected)f(by)h (des-cbc-md5)d(\(3\))390 4003 y(Ticket)i(flags:)142 b(INITIAL)45 b(\(512\))390 4222 y(jas@JOSEFSSON.ORG:)390 4332 y(Authtime:)332 b(Fri)47 b(Aug)f(15)i(04:49:46)d(2003)390 4441 y(Starttime:)284 b(Fri)47 b(Aug)f(15)i(04:49:49)d(2003)390 4551 y(Endtime:)380 b(Fri)47 b(Aug)f(15)i(05:06:26)d(2003)390 4661 y(Server:)428 b(host/latte.josefsson.or)o(g)42 b(key)47 b(des-cbc-md5)d(\(3\))390 4770 y(Ticket)i(key:)238 b(des-cbc-md5)44 b(\(3\))j(protected)f(by)h (des-cbc-md5)d(\(3\))390 4989 y(2)j(tickets)f(found.)390 5099 y($)275 5230 y Fw(As)36 b(y)m(ou)g(can)g(see,)i(I)e(had)g(a)g(tic) m(k)m(et)j(for)c(the)i(serv)m(er)f(`)p Fq(host/latte.josefsson.org)p Fw(')30 b(whic)m(h)36 b(w)m(as)150 5340 y(generated)31 b(b)m(y)g(`)p Fq(telnet)p Fw(':ing)e(to)i(that)g(host.)p eop end %%Page: 14 20 TeXDict begin 14 19 bop 150 -116 a Fw(Chapter)30 b(2:)41 b(User)30 b(Man)m(ual)2537 b(14)275 299 y(If,)31 b(for)h(some)g (reason,)g(y)m(ou)g(w)m(an)m(t)h(to)f(man)m(ually)g(get)h(a)f(tic)m(k)m (et)i(for)d(a)h(sp)s(eci\014c)g(serv)m(er,)g(y)m(ou)g(can)g(use)150 408 y(the)c Fq(shishi)h(--server-name)24 b Fw(command.)40 b(Normally)-8 b(,)30 b(ho)m(w)m(ev)m(er,)g(the)e(application)i(that)f (uses)e(Shishi)150 518 y(will)k(tak)m(e)h(care)g(of)e(getting)j(a)e (tic)m(k)m(et)i(for)d(the)h(appropriate)g(serv)m(er,)g(so)g(y)m(ou)g (normally)g(w)m(ouldn't)f(need)150 628 y(to)h(issue)f(this)h(command.) 390 784 y Fq($)47 b(shishi)g(--server-name=user/bill)o(g)42 b(--encryption-type=des-c)o(bc-m)o(d4)390 894 y(jas@JOSEFSSON.ORG:)390 1003 y(Authtime:)332 b(Fri)47 b(Aug)f(15)i(04:49:46)d(2003)390 1113 y(Starttime:)284 b(Fri)47 b(Aug)f(15)i(04:54:33)d(2003)390 1223 y(Endtime:)380 b(Fri)47 b(Aug)f(15)i(05:06:26)d(2003)390 1332 y(Server:)428 b(user/billg)45 b(key)i(des-cbc-md4)d(\(2\))390 1442 y(Ticket)i(key:)238 b(des-cbc-md4)44 b(\(2\))j(protected)f(by)h (des-cbc-md5)d(\(3\))390 1551 y($)275 1708 y Fw(As)21 b(y)m(ou)h(can)g(see,)j(I)c(acquired)h(a)g(tic)m(k)m(et)j(for)c(`)p Fq(user/billg)p Fw(')f(with)h(a)h(`)p Fq(des-cbc-md4)p Fw(')e(\(see)i(Section)h(1.4)150 1817 y([Cryptographic)29 b(Ov)m(erview],)h(page)f(5\))h(encryption)f(k)m(ey)g(sp)s(eci\014ed)g (with)f(the)h(`)p Fq(--encryption-type)p Fw(')150 1927 y(parameter.)275 2084 y(T)-8 b(o)38 b(wrap)f(up)g(this)g(in)m(tro)s (duction,)k(let)d(us)f(see)i(ho)m(w)f(y)m(ou)g(can)g(remo)m(v)m(e)i (tic)m(k)m(ets.)65 b(Y)-8 b(ou)39 b(ma)m(y)f(w)m(an)m(t)150 2193 y(to)f(do)g(this)g(if)f(y)m(ou)i(lea)m(v)m(e)h(y)m(our)d(terminal) i(for)e(lunc)m(h)g(or)h(similar,)i(and)d(don't)h(w)m(an)m(t)h(someone)f (to)h(b)s(e)150 2303 y(able)30 b(to)g(cop)m(y)g(the)g(\014le)f(and)g (then)g(use)g(y)m(our)h(creden)m(tials.)41 b(Note)31 b(that)f(this)g(only)f(destro)m(ys)h(the)f(tic)m(k)m(ets)150 2412 y(lo)s(cally)-8 b(,)32 b(it)f(do)s(es)e(not)h(con)m(tact)j(an)m(y) d(serv)m(er)g(telling)h(that)g(these)f(creden)m(tials)h(are)g(no)e (longer)i(v)-5 b(alid.)41 b(So,)150 2522 y(if)34 b(someone)g(stole)h(y) m(our)f(tic)m(k)m(et)i(\014le,)f(y)m(ou)g(m)m(ust)e(still)i(con)m(tact) h(y)m(our)e(administrator)g(and)f(ha)m(v)m(e)i(them)150 2632 y(reset)c(y)m(our)f(accoun)m(t.)42 b(Simply)30 b(using)g(this)g (switc)m(h)h(is)f(not)h(su\016cien)m(t.)390 2788 y Fq($)47 b(shishi)g(--server-name=imap/latt)o(e.j)o(osef)o(sson)o(.or)o(g)42 b(--destroy)390 2898 y(1)47 b(ticket)g(removed.)390 3007 y($)g(shishi)g(--server-name=foobar)42 b(--destroy)390 3117 y(No)47 b(tickets)f(removed.)390 3226 y($)h(shishi)g(--destroy)390 3336 y(3)g(tickets)f(removed.)390 3446 y($)275 3602 y Fw(Since)32 b(the)h(`)p Fq(--server-name)p Fw(')c(parameter)k(tak)m(es) h(a)f(long)g(string)g(to)g(t)m(yp)s(e,)h(it)f(is)f(p)s(ossible)g(to)i (t)m(yp)s(e)150 3712 y(the)39 b(serv)m(er)f(name)h(directly)-8 b(,)42 b(after)d(the)f(clien)m(t)i(name.)65 b(The)38 b(follo)m(wing)i(example)f(demonstrates)g(an)150 3821 y(AS-REQ)i(follo)m(w)m(ed)i(b)m(y)e(a)h(TGS-REQ)f(for)g(a)h(sp)s (eci\014c)f(serv)m(er)h(\(assuming)f(y)m(ou)h(did)e(not)i(ha)m(v)m(e)h (an)m(y)150 3931 y(tic)m(k)m(ets)33 b(to)e(b)s(egin)f(with\).)390 4088 y Fq($)47 b(src/shishi)e(simon@latte.josefsson.org)c (imap/latte.josefsson.org)390 4197 y(Enter)46 b(password)g(for)h (`simon@latte.josefsson.o)o(rg')o(:)390 4307 y (simon@latte.josefsson.or)o(g:)390 4416 y(Acquired:)332 b(Wed)47 b(Aug)f(27)i(17:21:06)d(2003)390 4526 y(Expires:)380 b(Wed)47 b(Aug)f(27)i(17:37:46)d(2003)390 4635 y(Server:)428 b(imap/latte.josefsson.or)o(g)42 b(key)47 b(aes256-cts-hmac-sha1-96)41 b(\(18\))390 4745 y(Ticket)46 b(key:)238 b(aes256-cts-hmac-sha1-96)41 b(\(18\))47 b(protected)e(by)i(aes256-cts-hmac-sha1-96)42 b(\(18\))390 4855 y(Ticket)k(flags:)142 b(FORWARDED)45 b(PROXIABLE)g(\(12\))390 4964 y($)275 5121 y Fw(Refer)33 b(to)g(the)h(reference)f(man)m(ual)h(for)f(all)h(a)m(v)-5 b(ailable)35 b(parameters)e(\(see)h(Section)g(4.6)h([P)m(arameters)150 5230 y(for)26 b(shishi],)h(page)g(46\).)40 b(The)26 b(rest)g(of)g(this) h(section)g(con)m(tains)g(descriptions)f(of)h(more)f(sp)s(ecialized)h (usage)150 5340 y(mo)s(des)j(that)h(can)f(b)s(e)g(ignored)h(b)m(y)f (most)h(users.)p eop end %%Page: 15 21 TeXDict begin 15 20 bop 150 -116 a Fw(Chapter)30 b(2:)41 b(User)30 b(Man)m(ual)2537 b(15)150 299 y Fv(2.1)68 b(Pro)l(xiable)46 b(and)f(Pro)l(xy)g(Tic)l(k)l(ets)150 458 y Fw(A)m(t)32 b(times)g(it)g(ma)m(y)g(b)s(e)e(necessary)i(for)f(a)h(principal)f(to)h (allo)m(w)h(a)e(service)h(to)g(p)s(erform)e(an)h(op)s(eration)h(on)150 568 y(its)37 b(b)s(ehalf.)60 b(The)37 b(service)g(m)m(ust)g(b)s(e)g (able)g(to)h(tak)m(e)g(on)f(the)g(iden)m(tit)m(y)i(of)e(the)g(clien)m (t,)j(but)d(only)g(for)g(a)150 677 y(particular)31 b(purp)s(ose.)39 b(A)30 b(principal)h(can)f(allo)m(w)i(a)f(service)g(to)g(tak)m(e)h(on)f (the)f(principal's)g(iden)m(tit)m(y)i(for)f(a)150 787 y(particular)g(purp)s(ose)d(b)m(y)j(gran)m(ting)g(it)g(a)g(pro)m(xy)-8 b(.)275 928 y(The)32 b(pro)s(cess)h(of)h(gran)m(ting)g(a)g(pro)m(xy)f (using)g(the)g(pro)m(xy)h(and)e(pro)m(xiable)i(\015ags)g(is)f(used)g (to)h(pro)m(vide)150 1037 y(creden)m(tials)g(for)f(use)g(with)f(sp)s (eci\014c)h(services.)49 b(Though)32 b(conceptually)i(also)g(a)f(pro)m (xy)-8 b(,)34 b(users)f(wishing)150 1147 y(to)f(delegate)h(their)f (iden)m(tit)m(y)h(in)e(a)g(form)g(usable)g(for)g(all)h(purp)s(ose)e (MUST)h(use)g(the)g(tic)m(k)m(et)j(forw)m(arding)150 1256 y(mec)m(hanism)d(describ)s(ed)e(in)h(the)h(next)f(section)i(to)f (forw)m(ard)f(a)g(tic)m(k)m(et-gran)m(ting)35 b(tic)m(k)m(et.)275 1397 y(The)j(PR)m(O)m(XIABLE)i(\015ag)f(in)g(a)g(tic)m(k)m(et)j(is)d (normally)g(only)g(in)m(terpreted)h(b)m(y)f(the)g(tic)m(k)m(et-gran)m (ting)150 1507 y(service.)82 b(It)44 b(can)g(b)s(e)f(ignored)h(b)m(y)g (application)h(serv)m(ers.)81 b(When)43 b(set,)48 b(this)c(\015ag)g (tells)h(the)f(tic)m(k)m(et-)150 1616 y(gran)m(ting)31 b(serv)m(er)f(that)h(it)f(is)g(OK)g(to)g(issue)g(a)h(new)e(tic)m(k)m (et)k(\(but)c(not)i(a)f(tic)m(k)m(et-gran)m(ting)k(tic)m(k)m(et\))f (with)d(a)150 1726 y(di\013eren)m(t)h(net)m(w)m(ork)g(address)f(based)g (on)g(this)h(tic)m(k)m(et.)43 b(This)30 b(\015ag)h(is)f(set)h(if)g (requested)f(b)m(y)g(the)h(clien)m(t)h(on)150 1835 y(initial)j(authen)m (tication.)55 b(By)34 b(default,)i(the)e(clien)m(t)i(will)e(request)g (that)h(it)g(b)s(e)e(set)i(when)e(requesting)i(a)150 1945 y(tic)m(k)m(et-gran)m(ting)f(tic)m(k)m(et,)g(and)29 b(reset)i(when)f(requesting)g(an)m(y)h(other)g(tic)m(k)m(et.)275 2086 y(This)g(\015ag)i(allo)m(ws)h(a)f(clien)m(t)i(to)e(pass)f(a)h(pro) m(xy)g(to)g(a)g(serv)m(er)g(to)h(p)s(erform)d(a)i(remote)g(request)g (on)g(its)150 2195 y(b)s(ehalf)27 b(\(e.g.)41 b(a)27 b(prin)m(t)g(service)h(clien)m(t)h(can)f(giv)m(e)g(the)g(prin)m(t)f (serv)m(er)g(a)h(pro)m(xy)f(to)h(access)h(the)e(clien)m(t's)i(\014les) 150 2305 y(on)h(a)h(particular)g(\014le)f(serv)m(er)h(in)f(order)g(to)h (satisfy)g(a)f(prin)m(t)g(request\).)275 2445 y(In)35 b(order)g(to)i(complicate)h(the)e(use)g(of)g(stolen)h(creden)m(tials,)i (Kerb)s(eros)c(tic)m(k)m(ets)j(are)f(usually)f(v)-5 b(alid)150 2555 y(from)34 b(only)h(those)g(net)m(w)m(ork)h(addresses)e(sp)s (eci\014cally)i(included)e(in)g(the)h(tic)m(k)m(et[4].)57 b(When)35 b(gran)m(ting)h(a)150 2664 y(pro)m(xy)-8 b(,)42 b(the)d(clien)m(t)h(MUST)f(sp)s(ecify)f(the)h(new)g(net)m(w)m(ork)g (address)f(from)h(whic)m(h)f(the)h(pro)m(xy)g(is)g(to)h(b)s(e)150 2774 y(used,)30 b(or)g(indicate)i(that)f(the)f(pro)m(xy)g(is)h(to)g(b)s (e)f(issued)f(for)i(use)f(from)g(an)m(y)g(address.)275 2915 y(The)25 b(PR)m(O)m(XY)i(\015ag)f(is)g(set)h(in)f(a)g(tic)m(k)m (et)j(b)m(y)d(the)g(TGS)f(when)g(it)i(issues)f(a)g(pro)m(xy)g(tic)m(k)m (et.)42 b(Application)150 3024 y(serv)m(ers)24 b(MA)-8 b(Y)26 b(c)m(hec)m(k)g(this)e(\015ag)g(and)g(at)h(their)f(option)h (they)f(MA)-8 b(Y)26 b(require)e(additional)h(authen)m(tication)150 3134 y(from)30 b(the)g(agen)m(t)i(presen)m(ting)f(the)g(pro)m(xy)f(in)g (order)g(to)h(pro)m(vide)f(an)h(audit)f(trail.)275 3274 y(Here)20 b(is)h(ho)m(w)f(y)m(ou)h(w)m(ould)f(acquire)g(a)h(PR)m(O)m (XY)g(tic)m(k)m(et)i(for)d(the)g(service)i(`)p Fq (imap/latte.josefsson.org)o Fw(':)390 3415 y Fq($)47 b(shishi)g(jas@JOSEFSSON.ORG)c(imap/latte.josefsson.or)o(g)f(--proxy) 390 3525 y(Enter)k(password)g(for)h(`jas@JOSEFSSON.ORG':)390 3634 y(libshishi:)e(warning:)h(KDC)g(bug:)h(Reply)f(encrypted)g(using)g (wrong)g(key.)390 3744 y(jas@JOSEFSSON.ORG:)390 3853 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:02:35)d(2003)390 3963 y(Starttime:)284 b(Mon)47 b(Sep)94 b(8)48 b(20:02:36)d(2003)390 4073 y(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:02:35)d(2003)390 4182 y(Server:)428 b(imap/latte.josefsson.or)o(g)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 4292 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e(by)i(des3-cbc-sha1-kd)c (\(16\))390 4401 y(Ticket)j(flags:)142 b(PROXY)46 b(\(16\))390 4511 y($)275 4651 y Fw(As)30 b(y)m(ou)h(noticed,)h(this)f(ask)m(ed)h (for)e(y)m(our)h(passw)m(ord.)41 b(The)31 b(reason)g(is)f(that)i(pro)m (xy)f(tic)m(k)m(ets)i(m)m(ust)e(b)s(e)150 4761 y(acquired)g(using)g(a)h (pro)m(xiable)g(tic)m(k)m(et)i(gran)m(ting)f(tic)m(k)m(et,)h(whic)m(h)d (w)m(as)h(not)g(presen)m(t.)44 b(If)31 b(y)m(ou)g(often)h(need)150 4871 y(to)f(get)h(pro)m(xy)e(tic)m(k)m(ets,)j(y)m(ou)e(ma)m(y)g (acquire)g(a)f(pro)m(xiable)i(tic)m(k)m(et)h(gran)m(ting)e(tic)m(k)m (et)i(from)d(the)g(start:)390 5011 y Fq($)47 b(shishi)g(--proxiable)390 5121 y(Enter)f(password)g(for)h(`jas@JOSEFSSON.ORG':)390 5230 y(jas@JOSEFSSON.ORG:)390 5340 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:04:27)d(2003)p eop end %%Page: 16 22 TeXDict begin 16 21 bop 150 -116 a Fw(Chapter)30 b(2:)41 b(User)30 b(Man)m(ual)2537 b(16)390 299 y Fq(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:04:27)d(2003)390 408 y(Server:)428 b(krbtgt/JOSEFSSON.ORG)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 518 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e (by)i(des3-cbc-sha1-kd)c(\(16\))390 628 y(Ticket)j(flags:)142 b(PROXIABLE)45 b(INITIAL)h(\(520\))275 769 y Fw(Then)33 b(y)m(ou)i(should)f(b)s(e)g(able)i(to)f(acquire)g(pro)m(xy)g(tic)m(k)m (ets)i(based)e(on)g(that)g(tic)m(k)m(et)i(gran)m(ting)f(tic)m(k)m(et,) 150 879 y(as)31 b(follo)m(ws:)390 1020 y Fq($)47 b(shishi)g (jas@JOSEFSSON.ORG)c(imap/latte.josefsson.or)o(g)f(--proxy)390 1130 y(libshishi:)j(warning:)h(KDC)g(bug:)h(Reply)f(encrypted)g(using)g (wrong)g(key.)390 1239 y(jas@JOSEFSSON.ORG:)390 1349 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:04:27)d(2003)390 1459 y(Starttime:)284 b(Mon)47 b(Sep)94 b(8)48 b(20:04:32)d(2003)390 1568 y(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:04:27)d(2003)390 1678 y(Server:)428 b(imap/latte.josefsson.or)o(g)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 1787 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e(by)i(des3-cbc-sha1-kd)c (\(16\))390 1897 y(Ticket)j(flags:)142 b(PROXY)46 b(\(16\))390 2007 y($)150 2249 y Fv(2.2)68 b(F)-11 b(orw)l(ardable)46 b(and)e(F)-11 b(orw)l(arded)45 b(Tic)l(k)l(ets)150 2409 y Fw(Authen)m(tication)c(forw)m(arding)d(is)h(an)f(instance)i(of)e(a)h (pro)m(xy)g(where)f(the)h(service)h(that)f(is)g(gran)m(ted)g(is)150 2518 y(complete)28 b(use)d(of)i(the)f(clien)m(t's)i(iden)m(tit)m(y)-8 b(.)41 b(An)25 b(example)i(where)f(it)g(migh)m(t)h(b)s(e)f(used)f(is)h (when)f(a)i(user)e(logs)150 2628 y(in)35 b(to)g(a)h(remote)g(system)f (and)f(w)m(an)m(ts)i(authen)m(tication)h(to)f(w)m(ork)f(from)f(that)i (system)f(as)g(if)g(the)g(login)150 2738 y(w)m(ere)c(lo)s(cal.)275 2879 y(The)24 b(F)m(OR)-10 b(W)g(ARD)m(ABLE)26 b(\015ag)f(in)f(a)h(tic) m(k)m(et)i(is)e(normally)f(only)h(in)m(terpreted)g(b)m(y)f(the)h(tic)m (k)m(et-gran)m(ting)150 2989 y(service.)44 b(It)31 b(can)g(b)s(e)g (ignored)g(b)m(y)g(application)h(serv)m(ers.)43 b(The)31 b(F)m(OR)-10 b(W)g(ARD)m(ABLE)33 b(\015ag)e(has)g(an)g(in)m(ter-)150 3098 y(pretation)j(similar)f(to)h(that)g(of)f(the)g(PR)m(O)m(XIABLE)h (\015ag,)h(except)f(tic)m(k)m(et-gran)m(ting)j(tic)m(k)m(ets)e(ma)m(y)f (also)150 3208 y(b)s(e)i(issued)h(with)f(di\013eren)m(t)i(net)m(w)m (ork)f(addresses.)60 b(This)36 b(\015ag)h(is)g(reset)h(b)m(y)f (default,)i(but)d(users)g(MA)-8 b(Y)150 3317 y(request)29 b(that)g(it)g(b)s(e)f(set)i(b)m(y)e(setting)i(the)f(F)m(OR)-10 b(W)g(ARD)m(ABLE)31 b(option)e(in)f(the)h(AS)f(request)h(when)f(they) 150 3427 y(request)i(their)h(initial)g(tic)m(k)m(et-gran)m(ting)k(tic)m (k)m(et.)275 3569 y(This)43 b(\015ag)i(allo)m(ws)g(for)f(authen)m (tication)j(forw)m(arding)d(without)g(requiring)g(the)g(user)g(to)h(en) m(ter)g(a)150 3678 y(passw)m(ord)29 b(again.)41 b(If)29 b(the)h(\015ag)g(is)f(not)h(set,)g(then)f(authen)m(tication)j(forw)m (arding)d(is)g(not)h(p)s(ermitted,)g(but)150 3788 y(the)h(same)h (result)f(can)h(still)g(b)s(e)e(ac)m(hiev)m(ed)j(if)e(the)h(user)e (engages)j(in)e(the)g(AS)g(exc)m(hange)i(sp)s(ecifying)e(the)150 3897 y(requested)f(net)m(w)m(ork)i(addresses)d(and)h(supplies)g(a)g (passw)m(ord.)275 4039 y(The)41 b(F)m(OR)-10 b(W)g(ARDED)44 b(\015ag)f(is)f(set)h(b)m(y)f(the)h(TGS)f(when)f(a)i(clien)m(t)h (presen)m(ts)e(a)h(tic)m(k)m(et)i(with)d(the)150 4148 y(F)m(OR)-10 b(W)g(ARD)m(ABLE)27 b(\015ag)f(set)g(and)f(requests)h(a)g (forw)m(arded)f(tic)m(k)m(et)j(b)m(y)d(sp)s(ecifying)h(the)f(F)m(OR)-10 b(W)g(ARDED)150 4258 y(KDC)30 b(option)h(and)f(supplying)f(a)i(set)g (of)f(addresses)g(for)g(the)h(new)f(tic)m(k)m(et.)43 b(It)30 b(is)h(also)g(set)g(in)f(all)h(tic)m(k)m(ets)150 4368 y(issued)c(based)f(on)i(tic)m(k)m(ets)h(with)e(the)h(F)m(OR)-10 b(W)g(ARDED)29 b(\015ag)e(set.)40 b(Application)29 b(serv)m(ers)e(ma)m (y)h(c)m(ho)s(ose)g(to)150 4477 y(pro)s(cess)i(F)m(OR)-10 b(W)g(ARDED)32 b(tic)m(k)m(ets)h(di\013eren)m(tly)e(than)f(non-F)m(OR) -10 b(W)g(ARDED)31 b(tic)m(k)m(ets.)275 4619 y(If)k(addressless)g(tic)m (k)m(ets)j(are)e(forw)m(arded)f(from)h(one)g(system)f(to)i(another,)g (clien)m(ts)h(SHOULD)d(still)150 4728 y(use)28 b(this)g(option)g(to)h (obtain)f(a)g(new)g(TGT)f(in)h(order)f(to)i(ha)m(v)m(e)g(di\013eren)m (t)g(session)f(k)m(eys)g(on)g(the)g(di\013eren)m(t)150 4838 y(systems.)275 4979 y(Here)95 b(is)f(ho)m(w)h(y)m(ou)g(w)m(ould)f (acquire)h(a)g(F)m(OR)-10 b(W)g(ARDED)96 b(tic)m(k)m(et)h(for)d(the)h (service)150 5089 y(`)p Fq(host/latte.josefsson.org)p Fw(':)390 5230 y Fq($)47 b(shishi)g(jas@JOSEFSSON.ORG)c (host/latte.josefsson.or)o(g)f(--forwarded)390 5340 y(Enter)k(password) g(for)h(`jas@JOSEFSSON.ORG':)p eop end %%Page: 17 23 TeXDict begin 17 22 bop 150 -116 a Fw(Chapter)30 b(2:)41 b(User)30 b(Man)m(ual)2537 b(17)390 299 y Fq(libshishi:)45 b(warning:)h(KDC)g(bug:)h(Reply)f(encrypted)g(using)g(wrong)g(key.)390 408 y(jas@JOSEFSSON.ORG:)390 518 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:07:11)d(2003)390 628 y(Starttime:)284 b(Mon)47 b(Sep)94 b(8)48 b(20:07:12)d(2003)390 737 y(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:07:11)d(2003)390 847 y(Server:)428 b(host/latte.josefsson.or)o(g)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\)) 390 956 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected) e(by)i(des3-cbc-sha1-kd)c(\(16\))390 1066 y(Ticket)j(flags:)142 b(FORWARDED)45 b(\(4\))390 1176 y($)275 1310 y Fw(As)27 b(y)m(ou)h(noticed,)h(this)e(ask)m(ed)h(for)g(y)m(our)f(passw)m(ord.)39 b(The)27 b(reason)h(is)f(that)h(forw)m(arded)f(tic)m(k)m(ets)j(m)m(ust) 150 1420 y(b)s(e)g(acquired)h(using)f(a)h(forw)m(ardable)f(tic)m(k)m (et)k(gran)m(ting)d(tic)m(k)m(et,)j(whic)m(h)c(w)m(as)h(not)g(presen)m (t.)41 b(If)31 b(y)m(ou)g(often)150 1529 y(need)37 b(to)g(get)i(forw)m (arded)d(tic)m(k)m(ets,)41 b(y)m(ou)d(ma)m(y)f(acquire)h(a)f(forw)m (ardable)g(tic)m(k)m(et)j(gran)m(ting)e(tic)m(k)m(et)h(from)150 1639 y(the)31 b(start:)390 1773 y Fq($)47 b(shishi)g(--forwardable)390 1883 y(Enter)f(password)g(for)h(`jas@JOSEFSSON.ORG':)390 1993 y(jas@JOSEFSSON.ORG:)390 2102 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:08:53)d(2003)390 2212 y(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:08:53)d(2003)390 2321 y(Server:)428 b(krbtgt/JOSEFSSON.ORG)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 2431 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e (by)i(des3-cbc-sha1-kd)c(\(16\))390 2540 y(Ticket)j(flags:)142 b(FORWARDABLE)44 b(INITIAL)i(\(514\))390 2650 y($)275 2785 y Fw(Then)21 b(y)m(ou)i(should)f(b)s(e)g(able)h(to)h(acquire)f (forw)m(arded)f(tic)m(k)m(ets)j(based)d(on)h(that)g(tic)m(k)m(et)i (gran)m(ting)f(tic)m(k)m(et,)150 2894 y(as)31 b(follo)m(ws:)390 3029 y Fq($)47 b(shishi)g(jas@JOSEFSSON.ORG)c(host/latte.josefsson.or)o (g)f(--forwarded)390 3138 y(libshishi:)j(warning:)h(KDC)g(bug:)h(Reply) f(encrypted)g(using)g(wrong)g(key.)390 3248 y(jas@JOSEFSSON.ORG:)390 3357 y(Authtime:)332 b(Mon)47 b(Sep)94 b(8)48 b(20:08:53)d(2003)390 3467 y(Starttime:)284 b(Mon)47 b(Sep)94 b(8)48 b(20:08:57)d(2003)390 3577 y(Endtime:)380 b(Tue)47 b(Sep)94 b(9)48 b(04:08:53)d(2003)390 3686 y(Server:)428 b(host/latte.josefsson.or)o(g)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 3796 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e(by)i(des3-cbc-sha1-kd)c (\(16\))390 3905 y(Ticket)j(flags:)142 b(FORWARDED)45 b(\(4\))390 4015 y($)p eop end %%Page: 18 24 TeXDict begin 18 23 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(18)150 299 y Ft(3)80 b(Administration)52 b(Man)l(ual)150 514 y Fw(Here)26 b(y)m(ou)g(will)h(learn)f(ho)m(w)f(to)i(set)f(up,)g(run)e(and)i(main)m (tain)g(the)g(Shishi)f(Kerb)s(eros)g(serv)m(er.)39 b(Kerb)s(eros)25 b(is)150 624 y(incompatible)i(with)f(the)g(standard)g(Unix)f(`)p Fq(/etc/passwd)p Fw(')f(passw)m(ord)h(database)2972 591 y Fp(1)3011 624 y Fw(,)i(therefore)f(the)h(\014rst)150 733 y(step)22 b(will)g(b)s(e)f(to)i(create)g(a)g(Kerb)s(eros)d(user)i (database.)38 b(Shishi's)21 b(user)g(database)i(system)f(is)g(called)h (Shisa.)150 843 y(Once)32 b(Shisa)g(has)g(b)s(een)f(con\014gured,)i(y)m (ou)f(can)h(then)f(start)h(the)f(serv)m(er)h(and)e(b)s(egin)h(issuing)g (Kerb)s(eros)150 952 y(tic)m(k)m(ets)f(to)e(y)m(our)f(users.)39 b(The)28 b(Shishi)f(serv)m(er)h(is)g(called)i(`)p Fq(shishid)p Fw('.)38 b(After)29 b(getting)h(the)e(serv)m(er)g(up)g(and)150 1062 y(running,)k(w)m(e)i(discuss)f(ho)m(w)g(y)m(ou)h(can)f(set)h(up)e (m)m(ultiple)i(Kerb)s(eros)e(serv)m(ers,)j(to)f(increase)g(a)m(v)-5 b(ailabilit)m(y)150 1171 y(or)31 b(o\013er)g(load-balancing.)43 b(Finally)-8 b(,)32 b(w)m(e)f(include)f(some)h(information)g(in)m (tended)g(for)f(dev)m(elop)s(ers,)h(that)150 1281 y(will)d(enable)g(y)m (ou)f(to)h(customize)h(Shisa)e(to)h(use)f(an)g(external)h(user)f (database,)i(suc)m(h)e(as)h(a)g(LD)m(AP)g(serv)m(er)150 1391 y(or)i(SQL)g(database.)150 1616 y Fv(3.1)68 b(In)l(tro)t(duction) 45 b(to)g(Shisa)150 1775 y Fw(The)35 b(user)g(database)i(part)f(of)g (Shishi)f(is)g(called)i(Shisa.)57 b(The)35 b(Shisa)h(library)f(is)h (indep)s(enden)m(t)f(of)h(the)150 1885 y(core)42 b(Shishi)f(library)-8 b(.)74 b(Shisa)41 b(is)h(resp)s(onsible)f(for)g(storing)h(the)g(name)g (of)g(y)m(our)f(realms,)k(the)d(name)150 1994 y(of)e(y)m(our)g (principals)g(\(users\),)i(accoun)m(ting)g(information)f(for)e(the)i (users)e(\(i.e.,)44 b(when)39 b(eac)m(h)i(accoun)m(t)150 2104 y(starts)c(to)g(b)s(e)e(v)-5 b(alid)37 b(and)e(when)h(it)g (expires\),)i(and)e(the)h(cryptographic)f(k)m(eys)h(eac)m(h)g(user)f (has.)58 b(Some)150 2213 y(Kerb)s(eros)24 b(in)m(ternal)i(data)g(can)g (also)g(b)s(e)e(stored,)j(suc)m(h)e(as)h(the)f(k)m(ey)h(v)m(ersion)g(n) m(um)m(b)s(er,)f(the)g(last)h(dates)g(for)150 2323 y(when)36 b(v)-5 b(arious)36 b(tic)m(k)m(et)j(requests)e(w)m(ere)g(made,)h(the)f (cryptographic)g(salt,)i(string-to-k)m(ey)g(parameters)150 2432 y(and)33 b(passw)m(ord)f(for)h(eac)m(h)i(user.)49 b(Not)34 b(all)g(information)g(need)f(to)h(b)s(e)f(stored.)49 b(F)-8 b(or)35 b(example,)g(in)e(some)150 2542 y(situations)f(it)g(is)g (pruden)m(t)e(to)j(lea)m(v)m(e)h(the)d(passw)m(ord)g(\014eld)h(empt)m (y)-8 b(,)33 b(so)e(that)i(someb)s(o)s(dy)d(who)h(manages)150 2652 y(to)g(steal)g(the)g(user)e(database)i(will)g(only)f(b)s(e)g(able) h(to)g(compromise)f(y)m(our)g(system,)h(and)f(not)g(an)m(y)h(other)150 2761 y(systems)e(w)m(ere)h(y)m(our)f(user)g(ma)m(y)g(ha)m(v)m(e)i (re-used)d(the)i(same)f(passw)m(ord.)40 b(On)28 b(the)i(other)f(hand,)g (y)m(ou)g(ma)m(y)150 2871 y(already)34 b(b)s(e)e(storing)h(the)h(passw) m(ord)e(in)h(y)m(our)g(customized)h(database,)g(in)f(whic)m(h)g(case)h (b)s(eing)f(able)g(to)150 2980 y(c)m(hange)f(it)e(via)h(the)g(Shisa)f (in)m(terface)i(can)e(b)s(e)g(useful.)275 3111 y(Shisa)39 b(is)g(a)h(small)h(\(a)f(few)f(thousand)g(lines)h(of)g(C)f(co)s(de\))h (standalone)h(library)-8 b(.)68 b(Shisa)39 b(do)s(es)h(not)150 3221 y(dep)s(end)34 b(on)i(the)g(Shishi)f(library)-8 b(.)57 b(Because)37 b(a)g(user)e(database)i(with)e(passw)m(ords)g(ma)m (y)i(b)s(e)e(useful)g(for)150 3330 y(other)k(applications)g(as)g(w)m (ell)g(\(e.g.,)j(GNU)d(SASL\),)f(it)h(migh)m(t)g(b)s(e)e(separated)i (in)m(to)g(its)g(o)m(wn)f(pro)5 b(ject)150 3440 y(later)30 b(on.)40 b(Y)-8 b(ou)30 b(should)f(k)m(eep)g(this)h(in)f(mind,)f(so)i (that)g(y)m(ou)f(don't)g(consider)h(writing)f(a)h(Shisa)e(bac)m(k)m (end)150 3549 y(for)38 b(y)m(our)g(o)m(wn)g(database)h(as)g(a)f(purely) g(Shishi)f(sp)s(eci\014c)h(pro)5 b(ject.)64 b(Y)-8 b(ou)39 b(can,)i(for)d(example,)j(c)m(ho)s(ose)150 3659 y(to)33 b(use)f(the)g(Shisa)g(in)m(terface)i(in)e(y)m(our)g(o)m(wn)h (applications)g(to)g(ha)m(v)m(e)h(a)e(simple)h(in)m(terface)g(to)g(y)m (our)g(user)150 3769 y(database.)42 b(Y)-8 b(our)30 b(exp)s(erience)h (and)f(feedbac)m(k)h(is)f(appreciated)h(if)g(y)m(ou)f(ha)m(v)m(e)i(c)m (hosen)f(to)g(explore)g(this.)275 3899 y(Note)c(that)f(the)g(Shisa)g (database)h(do)s(es)e(not)h(exp)s(ose)g(ev)m(erything)h(y)m(ou)f(ma)m (y)h(w)m(an)m(t)f(to)h(kno)m(w)f(ab)s(out)g(a)150 4009 y(user,)i(suc)m(h)h(as)f(its)h(full)f(h)m(uman)g(name,)h(telephone)g(n) m(um)m(b)s(er)e(or)i(ev)m(en)g(the)g(user's)f(login)h(accoun)m(t)h (name)150 4118 y(or)j(home)g(directory)-8 b(.)50 b(It)33 b(only)h(stores)f(what)g(is)g(needed)g(to)h(authen)m(ticate)h(a)f(p)s (eer)e(claiming)j(to)f(b)s(e)e(an)150 4228 y(en)m(tit)m(y)-8 b(.)42 b(Th)m(us)25 b(it)j(do)s(es)e(not)h(mak)m(e)h(sense)f(to)g (replace)h(y)m(our)e(curren)m(t)h(user)f(database)i(or)f(`)p Fq(/etc/passwd)p Fw(')150 4338 y(with)33 b(data)i(deriv)m(ed)f(from)f (the)h(Shisa)f(database.)52 b(Instead,)35 b(it)f(is)g(in)m(tended)g (that)g(y)m(ou)g(write)g(a)g(Shisa)150 4447 y(bac)m(k)m(end)h(that)g (exp)s(orts)g Fm(some)42 b Fw(of)34 b(the)h(information)g(stored)g(in)f (y)m(our)g(user)g(database.)54 b(Y)-8 b(ou)35 b(ma)m(y)h(b)s(e)150 4557 y(able)25 b(to)g(replace)g(some)g(existing)g(functionalit)m(y)-8 b(,)28 b(suc)m(h)c(as)g(the)h(passw)m(ord)f(\014eld)f(in)h(`)p Fq(/etc/passwd)p Fw(')e(with)150 4666 y(a)31 b(Kerb)s(eros)e(P)-8 b(AM)31 b(mo)s(dule,)f(but)g(there)g(is)h(no)f(requiremen)m(t)h(for)f (doing)g(so.)150 4891 y Fv(3.2)68 b(Con\014guring)45 b(Shisa)150 5051 y Fw(The)20 b(con\014guration)g(\014le)h(for)f(Shisa)g (is)g(t)m(ypically)i(stored)e(in)g(`)p Fq(/usr/local/etc/shishi/shisa)o (.co)o(nf)p Fw('.)150 5160 y(Y)-8 b(ou)35 b(do)g(not)g(ha)m(v)m(e)h(to) f(mo)s(dify)f(this)h(\014le,)h(the)f(defaults)f(should)g(b)s(e)g (acceptable)j(to)e(\014rst-time)h(users.)p 150 5241 1200 4 v 199 5308 a Fp(1)275 5340 y Fo(And)24 b(b)r(esides,)j(Shishi)e(is)h (in)n(tended)f(to)h(w)n(ork)g(on)f(non-Unix)g(platforms)i(as)f(w)n (ell.)p eop end %%Page: 19 25 TeXDict begin 19 24 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(19)150 299 y(The)44 b(\014le)i(is)f(used)f(to)h(de\014ne)g(where)f(y)m(our)h(user)f (database)i(resides,)j(and)44 b(some)i(options)f(suc)m(h)g(as)150 408 y(making)40 b(the)h(database)g(read-only)-8 b(,)43 b(or)d(whether)f(errors)h(detected)h(when)e(accessing)j(the)e(database) 150 518 y(should)k(b)s(e)f(ignored.)84 b(\(The)44 b(latter)i(could)f(b) s(e)f(useful)f(if)i(the)g(serv)m(er)f(is)h(a)g(remote)g(LD)m(AP)h(serv) m(er)150 628 y(that)40 b(migh)m(t)g(b)s(e)f(una)m(v)-5 b(ailable,)43 b(and)c(then)g(y)m(ou)h(w)m(ould)f(w)m(an)m(t)h(to)g (fall)g(bac)m(k)g(to)h(a)e(lo)s(cal)i(cop)m(y)f(of)g(the)150 737 y(database.\))275 877 y(The)30 b(default)h(will)g(store)g(the)g (user)f(database)h(using)f(directories)i(and)e(\014les,)h(ro)s(oted)g (b)m(y)f(default)h(in)150 986 y(`)p Fq(/usr/local/var/shishi)p Fw('.)36 b(Y)-8 b(ou)31 b(can)g(use)f(standard)g(\014le)g(p)s (ermission)g(settings)h(to)h(con)m(trol)g(access)150 1096 y(to)k(the)f(directory)g(hierarc)m(h)m(y)-8 b(.)55 b(It)35 b(is)g(strongly)g(recommended)g(to)g(restrict)h(access)g(to)g (the)f(directory)-8 b(.)150 1205 y(Storing)29 b(the)h(directory)g(on)f (lo)s(cal)i(storage,)g(i.e.,)g(hard)e(disk)g(or)g(remo)m(v)-5 b(able)30 b(media,)h(is)e(recommended.)150 1315 y(W)-8 b(e)30 b(discourage)g(placing)g(the)f(database)h(on)f(a)g(net)m(w)m (ork)h(\014le)f(system,)h(but)e(realize)j(this)e(can)g(b)s(e)g(useful) 150 1425 y(in)h(some)h(situations)g(\(see)g(Section)g(3.7)h([Multiple)f (serv)m(ers],)g(page)g(33\).)275 1564 y(See)f(the)g(reference)h(man)m (ual)f(\(see)h(Section)g(4.5)g([Shisa)f(Con\014guration],)g(page)h (45\))g(for)f(the)g(details)150 1673 y(of)36 b(the)h(con\014guration)g (\014le.)58 b(Again,)39 b(y)m(ou)e(are)f(not)h(exp)s(ected)f(to)h(need) f(to)h(mo)s(dify)f(an)m(ything)h(unless)150 1783 y(y)m(ou)31 b(are)f(an)h(exp)s(erienced)f(Shishi)f(administrator.)150 2023 y Fv(3.3)68 b(Using)46 b(Shisa)150 2182 y Fw(There)41 b(is)h(a)g(command)g(line)g(in)m(terface)h(to)g(the)f(Shisa)f(library) -8 b(,)45 b(aptly)d(named)f(`)p Fq(shisa)p Fw('.)74 b(Y)-8 b(ou)43 b(will)150 2292 y(use)30 b(this)h(to)s(ol)g(to)h(add,)e(remo)m (v)m(e,)i(and)e(c)m(hange)i(information)f(stored)g(in)f(the)h(database) g(ab)s(out)f(realms,)150 2401 y(principals,)f(and)f(k)m(eys.)41 b(The)29 b(to)s(ol)h(can)f(also)h(b)s(e)f(used)f(to)h(\\dump")g(all)h (information)f(in)g(the)g(database,)150 2511 y(for)22 b(bac)m(kup)f(or)h(debugging)g(purp)s(oses.)36 b(\(Curren)m(tly)22 b(the)g(output)g(format)g(cannot)g(b)s(e)g(read)g(b)m(y)f(an)m(y)i(to)s (ol,)150 2621 y(but)33 b(functionalit)m(y)j(to)f(do)f(this)g(will)g(b)s (e)g(added)f(in)h(the)g(future,)g(p)s(ossibly)g(as)g(a)g(read-only)h (\014le-based)150 2730 y(Shisa)30 b(database)h(bac)m(k)m(end.\))275 2869 y(The)i(reference)i(man)m(ual)f(\(see)h(Section)g(4.8)g([P)m (arameters)g(for)f(shisa],)i(page)e(48\))i(explains)e(all)h(pa-)150 2979 y(rameters,)c(but)f(here)g(w)m(e)h(will)f(giv)m(e)i(y)m(ou)f(a)g (w)m(alk-through)g(of)f(the)h(t)m(ypical)h(uses)e(of)g(the)h(to)s(ol.) 275 3118 y(Installing)i(Shishi)f(usually)h(creates)h(a)g(realm)f(with)g (t)m(w)m(o)i(principals:)45 b(one)34 b(tic)m(k)m(et)h(gran)m(ting)f (tic)m(k)m(et)150 3228 y(for)23 b(the)h(realm,)h(and)e(one)g(host)h(k)m (ey)g(for)f(the)g(serv)m(er.)39 b(This)22 b(is)i(what)f(y)m(ou)h(t)m (ypically)h(need)e(to)h(get)g(started,)150 3338 y(but)j(it)g(do)s (esn't)g(serv)m(e)h(our)f(purp)s(oses,)g(so)g(w)m(e)h(start)g(b)m(y)f (remo)m(ving)h(the)f(principals)g(and)g(the)g(realm.)40 b(T)-8 b(o)150 3447 y(do)28 b(that,)h(w)m(e)f(need)f(to)i(\014gure)e (out)h(the)g(name)g(of)f(the)h(realm.)41 b(The)27 b(`)p Fq(--list)p Fw(')f(or)i(`)p Fq(--dump)p Fw(')f(parameters)150 3557 y(can)34 b(b)s(e)f(used)g(for)g(this.)51 b(\(Most)34 b(\\long")i(parameters,)f(lik)m(e)g(`)p Fq(--dump)p Fw(',)e(ha)m(v)m(e) i(shorter)e(names)h(as)g(w)m(ell,)150 3666 y(in)c(this)g(case)i(`)p Fq(-d)p Fw(',)e(Section)h(4.8)h([P)m(arameters)g(for)e(shisa],)h(page)g (48\).)390 3806 y Fq(jas@latte:~$)44 b(shisa)j(-d)390 3915 y(latte)772 4025 y(krbtgt/latte)1154 4134 y(Account)e(is)j (enabled.)1154 4244 y(Current)d(key)i(version)f(0)i(\(0x0\).)1154 4354 y(Key)f(0)g(\(0x0\).)1535 4463 y(Etype)g(aes256-cts-hmac-sha1-96) 41 b(\(0x12,)46 b(18\).)1535 4573 y(Salt)h(lattekrbtgt/latte.)772 4682 y(host/latte)1154 4792 y(Account)e(is)j(enabled.)1154 4902 y(Current)d(key)i(version)f(0)i(\(0x0\).)1154 5011 y(Key)f(0)g(\(0x0\).)1535 5121 y(Etype)g(aes256-cts-hmac-sha1-96)41 b(\(0x12,)46 b(18\).)1535 5230 y(Salt)h(lattehost/latte.)390 5340 y(jas@latte:~$)p eop end %%Page: 20 26 TeXDict begin 20 25 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(20)275 299 y(The)35 b(realm)h(names)g(are)g(prin)m(ted)g(at)h(column)e(0,)j(the)e (principal)g(names)g(are)g(inden)m(ted)g(with)g(one)150 408 y(`)p Fq(TAB)p Fw(')28 b(c)m(haracter)h(\(ak)-5 b(a)29 b(`)p Fq(\\t)p Fw(')f(or)g(ASCI)s(I)e(0x09)j(Horizon)m(tal)i(T)-8 b(abulation\),)30 b(and)d(the)h(information)g(ab)s(out)150 518 y(eac)m(h)36 b(principal)e(is)h(inden)m(ted)f(with)g(t)m(w)m(o)i(`) p Fq(TAB)p Fw(')e(c)m(haracters.)55 b(The)34 b(ab)s(o)m(v)m(e)i(output) e(means)h(that)g(there)150 628 y(is)i(one)h(realm)f(`)p Fq(latte)p Fw(')g(with)g(t)m(w)m(o)h(principals:)54 b(`)p Fq(krbtgt/latte)p Fw(')35 b(\(whic)m(h)i(is)g(used)g(to)h(authen)m (ticate)150 737 y(Kerb)s(eros)c(tic)m(k)m(et)j(requests\))e(and)e(`)p Fq(host/latte)p Fw(')g(\(used)h(to)h(authen)m(ticate)i(host-based)e (applications)150 847 y(lik)m(e)d(T)-8 b(elnet\).)42 b(They)30 b(w)m(ere)g(created)i(during)d(`)p Fq(make)g(install)p Fw(')g(on)h(a)h(host)g(called)g(`)p Fq(latte)p Fw('.)275 984 y(If)40 b(the)i(installation)h(did)e(not)g(create)i(a)f(default)g (database)g(for)f(y)m(ou,)k(y)m(ou)c(migh)m(t)i(get)f(an)f(error)150 1093 y(similar)31 b(to)g(the)f(follo)m(wing)i(output.)390 1230 y Fq(jas@latte:~$)44 b(shisa)j(-d)390 1340 y(shisa:)f(Cannot)g (initialize)f(`file')h(database)g(backend.)390 1450 y(Location)g (`/usr/local/var/shishi')41 b(and)47 b(options)f(`N/A'.)390 1559 y(shisa:)g(Initialization)e(failed:)390 1669 y(Shisa)i(database)g (could)g(not)h(be)g(opened.)390 1778 y(jas@latte:~$)275 1915 y Fw(This)34 b(indicates)i(that)g(the)f(database)h(do)s(es)f(not)g (exist.)56 b(F)-8 b(or)36 b(a)f(\014le)g(database,)j(y)m(ou)d(can)h (create)g(it)150 2025 y(simply)22 b(b)m(y)h(creating)h(the)f(directory) -8 b(,)25 b(as)e(follo)m(ws.)40 b(Note)24 b(the)f(access)h(p)s (ermission)d(c)m(hange)j(with)f(`)p Fq(chmod)p Fw('.)150 2134 y(T)m(ypically)i(the)f(`)p Fq(root)p Fw(')f(user)g(w)m(ould)h(o)m (wn)f(the)h(\014les,)i(but)d(as)h(these)g(examples)g(demonstrate,)i (setting)f(up)150 2244 y(a)30 b(Kerb)s(eros)e(serv)m(er)i(do)s(es)f (not)h(require)f(ro)s(ot)h(access.)42 b(Indeed,)28 b(it)i(ma)m(y)h(b)s (e)d(pruden)m(t)h(to)h(run)e(all)i(Shishi)150 2354 y(applications)39 b(as)f(a)g(sp)s(ecial)g(non-`)p Fq(root)p Fw(')f(user,)i(and)f(ha)m(v)m (e)g(all)h(Shishi)e(related)h(\014les)g(o)m(wned)g(b)m(y)f(that)150 2463 y(user,)29 b(so)h(that)g(an)m(y)g(securit)m(y)g(vulnerabilities)h (do)e(not)h(lead)g(to)g(a)g(system)g(compromise.)41 b(\(Ho)m(w)m(ev)m (er,)32 b(if)150 2573 y(the)j(user)f(database)h(is)g(ev)m(er)g(stolen,) i(system)d(compromises)h(of)g(other)g(systems)f(ma)m(y)h(b)s(e)f(ino)s (ccured,)150 2682 y(should)29 b(y)m(ou)i(use,)f(e.g.,)i(a)f(k)m(erb)s (erized)f(T)-8 b(elnet.\))390 2819 y Fq(jas@latte:~$)44 b(mkdir)j(/usr/local/var/shishi)390 2929 y(jas@latte:~$)d(chmod)j (go-rwx)f(/usr/local/var/shishi)275 3066 y Fw(Bac)m(k)38 b(to)g(the)f(\014rst)g(example,)i(where)e(y)m(ou)h(ha)m(v)m(e)g(a)f (realm)h(`)p Fq(latte)p Fw(')e(with)h(some)g(principals.)61 b(W)-8 b(e)150 3176 y(w)m(an)m(t)43 b(to)f(remo)m(v)m(e)h(the)f(realm)g (to)g(demonstrate)h(ho)m(w)e(y)m(ou)h(create)h(the)f(realm)g(from)g (scratc)m(h.)75 b(\(Of)150 3285 y(course,)29 b(y)m(ou)f(can)h(ha)m(v)m (e)g(more)g(than)e(one)i(realm)f(in)g(the)h(database,)g(but)f(for)g (this)g(example)h(w)m(e)f(assume)150 3395 y(y)m(ou)35 b(w)m(an)m(t)g(to)g(set)g(up)e(a)i(realm)g(named)f(the)h(same)f(as)h (Shishi)e(guessed)i(y)m(ou)f(w)m(ould)g(name)h(it,)h(so)f(the)150 3504 y(existing)j(realm)g(need)f(to)h(b)s(e)f(remo)m(v)m(ed)h (\014rst.\))61 b(The)37 b(`)p Fq(--remove)p Fw(')e(\(short)j(form)f(`)p Fq(-r)p Fw('\))g(parameter)h(is)150 3614 y(used)30 b(for)g(this)g(purp) s(ose,)f(as)i(follo)m(ws.)390 3751 y Fq(jas@latte:~$)44 b(shisa)j(-r)g(latte)f(host/latte)390 3861 y(Removing)g(principal)f (`host/latte@latte'...)390 3970 y(Removing)h(principal)f (`host/latte@latte'...don)o(e)390 4080 y(jas@latte:~$)f(shisa)j(-r)g (latte)f(krbtgt/latte)390 4189 y(Removing)g(principal)f (`krbtgt/latte@latte'...)390 4299 y(Removing)h(principal)f (`krbtgt/latte@latte'...d)o(one)390 4408 y(jas@latte:~$)f(shisa)j(-r)g (latte)390 4518 y(Removing)f(realm)g(`latte'...)390 4628 y(Removing)g(realm)g(`latte'...done)390 4737 y(jas@latte:~$)275 4874 y Fw(Y)-8 b(ou)28 b(ma)m(y)h(b)s(e)f(asking)g(y)m(ourself)h (\\What)g(if)g(the)f(realm)h(has)f(man)m(y)g(more)g(principals?".)40 b(If)28 b(y)m(ou)h(fear)150 4984 y(man)m(ual)i(lab)s(or)f(\(or)i(a)f (small)g(`)p Fq(sed)p Fw(')f(script,)h(recall)h(the)f(format)g(of)g(`)p Fq(--list)p Fw('?\),)f(don't)h(w)m(orry)-8 b(,)31 b(there)g(is)150 5093 y(a)g(`)p Fq(--force)p Fw(')e(\(short)h(form)g(`)p Fq(-f)p Fw('\))h(\015ag.)41 b(Use)30 b(it)h(with)f(care.)42 b(Here)31 b(is)f(a)h(faster)g(w)m(a)m(y)g(to)g(do)f(the)h(ab)s(o)m(v)m (e:)390 5230 y Fq(jas@latte:~$)44 b(shisa)j(-r)g(latte)f(-f)390 5340 y(Removing)g(principal)f(`krbtgt/latte@latte'...)p eop end %%Page: 21 27 TeXDict begin 21 26 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(21)390 299 y Fq(Removing)46 b(principal)f(`krbtgt/latte@latte'...d)o(one)390 408 y(Removing)h(principal)f(`host/latte@latte'...)390 518 y(Removing)h(principal)f(`host/latte@latte'...don)o(e)390 628 y(Removing)h(realm)g(`latte'...)390 737 y(Removing)g(realm)g (`latte'...done)390 847 y(jas@latte:~$)275 988 y Fw(Y)-8 b(ou)40 b(should)g(no)m(w)g(ha)m(v)m(e)i(a)f(w)m(orking,)i(but)d(empt)m (y)-8 b(,)44 b(Shisa)c(database.)72 b(Let's)41 b(set)g(up)e(the)i (realm)150 1097 y(man)m(ually)-8 b(,)30 b(step)f(b)m(y)f(step.)40 b(The)28 b(\014rst)g(step)h(is)f(to)h(decide)g(on)g(a)g(name)f(for)h(y) m(our)f(realm.)40 b(The)29 b(full)f(story)150 1207 y(is)37 b(explained)h(elsewhere)g(\(see)g(Section)h(4.3)f([Realm)h(and)d (Principal)i(Naming],)i(page)e(38\),)j(but)c(the)150 1316 y(short)29 b(story)h(is)f(to)h(tak)m(e)h(y)m(our)f(DNS)f(domain)g (name)h(and)e(translate)j(it)f(to)g(upp)s(er)d(case.)42 b(F)-8 b(or)30 b(example,)150 1426 y(if)e(y)m(our)g(organization)i (uses)d Fq(example.org)e Fw(it)k(is)f(a)g(go)s(o)s(d)g(idea)g(to)h(use) f Fq(EXAMPLE.ORG)c Fw(as)29 b(the)f(name)g(of)150 1536 y(y)m(our)33 b(Kerb)s(eros)f(realm.)50 b(W)-8 b(e'll)36 b(use)d Fq(EXAMPLE.ORG)d Fw(as)j(the)h(realm)f(name)h(in)f(these)g (examples.)50 b(Let's)150 1645 y(create)32 b(the)e(realm.)390 1786 y Fq(jas@latte:~$)44 b(shisa)j(-a)g(EXAMPLE.ORG)390 1896 y(Adding)f(realm)g(`EXAMPLE.ORG'...)390 2005 y(Adding)g(realm)g (`EXAMPLE.ORG'...done)390 2115 y(jas@latte:~$)275 2256 y Fw(Curren)m(tly)-8 b(,)26 b(there)g(are)g(no)f(prop)s(erties)g(asso)s (ciated)i(with)f(en)m(tire)g(realms.)40 b(In)25 b(the)g(future,)h(it)g (ma)m(y)h(b)s(e)150 2365 y(p)s(ossible)e(to)i(set)g(a)f(default)g (realm-wide)g(passw)m(ord)g(expiry)f(p)s(olicy)h(or)g(similar.)40 b(Eac)m(h)26 b(realm)h(normally)150 2475 y(has)e(one)h(principal)f (that)h(is)g(used)f(for)g(authen)m(ticating)j(against)f(the)e(\\tic)m (k)m(et)k(gran)m(ting)d(service")h(on)f(the)150 2585 y(Kerb)s(eros)j(serv)m(er)g(with)h(a)g(tic)m(k)m(et)i(instead)e(of)f (using)g(the)h(passw)m(ord.)40 b(This)29 b(is)g(used)g(b)m(y)g(the)h (user)f(when)150 2694 y(she)k(acquire)g(a)h(tic)m(k)m(et)h(for)e(a)g (serv)m(er.)49 b(The)33 b(principal)f(m)m(ust)h(lo)s(ok)h(lik)m(e)g(`)p Fq(krbtgt/REALM)p Fw(')c(\(see)k([Name)150 2804 y(of)d(the)f(TGS],)g (page)i(41\).)41 b(Let's)31 b(create)h(it.)390 2945 y Fq(jas@latte:~$)44 b(shisa)j(-a)g(EXAMPLE.ORG)e(krbtgt/EXAMPLE.ORG)390 3054 y(Adding)h(principal)f(`krbtgt/EXAMPLE.ORG@EXAMPL)o(E.O)o(RG'.)o (..)390 3164 y(Adding)h(principal)f(`krbtgt/EXAMPLE.ORG@EXAMPL)o(E.O)o (RG'.)o(..do)o(ne)390 3273 y(jas@latte:~$)275 3414 y Fw(No)m(w)f(that)g(w)m(asn't)f(di\016cult,)k(although)d(not)g(v)m(ery)f (satisfying)h(either.)81 b(What)44 b(do)s(es)f(adding)g(a)150 3524 y(principal)32 b(mean?)47 b(The)32 b(name)h(is)g(created,)h(ob)m (viously)-8 b(,)34 b(but)e(it)h(also)h(means)e(setting)i(a)f(few)f(v)-5 b(alues)33 b(in)150 3634 y(the)e(database.)41 b(Let's)31 b(view)g(the)f(en)m(try)h(to)g(\014nd)e(out)i(whic)m(h)f(v)-5 b(alues.)390 3774 y Fq(jas@latte:~$)44 b(shisa)j(-d)390 3884 y(EXAMPLE.ORG)772 3994 y(krbtgt/EXAMPLE.ORG)1154 4103 y(Account)e(is)j(enabled.)1154 4213 y(Current)d(key)i(version)f(0) i(\(0x0\).)1154 4322 y(Key)f(0)g(\(0x0\).)1535 4432 y(Etype)g (aes256-cts-hmac-sha1-96)41 b(\(0x12,)46 b(18\).)1535 4542 y(Salt)h(EXAMPLE.ORGkrbtgt/EXAMPLE)o(.OR)o(G.)390 4651 y(jas@latte:~$)275 4792 y Fw(T)-8 b(o)72 b(use)g(host)g(based)g (securit)m(y)h(services)g(lik)m(e)g(SSH)e(or)h(T)-8 b(elnet)73 b(with)f(Kerb)s(eros,)82 b(eac)m(h)150 4902 y(host)54 b(m)m(ust)g(ha)m(v)m(e)i(a)e(k)m(ey)h(shared)e(b)s(et)m(w)m(een)i(the)f (host)h(and)e(the)h(KDC.)g(The)g(k)m(ey)h(is)f(t)m(ypically)150 5011 y(stored)j(in)g(`)p Fq(/usr/local/etc/shishi/shis)o(hi.k)o(eys)p Fw('.)115 b(W)-8 b(e)59 b(assume)e(y)m(our)g(serv)m(er)g(is)h(called) 150 5121 y(`)p Fq(mail.example.org)p Fw(')32 b(and)j(w)m(e)i(create)g (the)f(principal.)57 b(T)-8 b(o)37 b(illustrate)g(a)f(new)g(parameter,) i(w)m(e)e(also)150 5230 y(set)50 b(the)f(sp)s(eci\014c)g(algorithm)h (to)g(use)f(b)m(y)g(using)g(the)g(`)p Fq(--encryption-type)p Fw(')c(\(short)k(form)g(`)p Fq(-E)p Fw('\))150 5340 y(parameter.)p eop end %%Page: 22 28 TeXDict begin 22 27 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(22)390 299 y Fq(jas@latte:~$)44 b(shisa)j(-a)g(EXAMPLE.ORG)e(host/mail.example.org)d(-E)47 b(des3)390 408 y(Adding)f(principal)f(`host/mail.example.org@EXA)o(MPL) o(E.OR)o(G'..)o(.)390 518 y(Adding)h(principal)f (`host/mail.example.org@EXA)o(MPL)o(E.OR)o(G'..)o(.do)o(ne)390 628 y(jas@latte:~$)275 765 y Fw(T)-8 b(o)32 b(exp)s(ort)g(the)g(k)m(ey) -8 b(,)35 b(there)d(is)g(another)h(Shisa)e(parameter)i(`)p Fq(--keys)p Fw(')e(that)i(will)f(prin)m(t)g(the)g(k)m(ey)h(in)150 874 y(a)e(format)f(that)h(is)g(recognized)h(b)m(y)e(Shishi.)39 b(Let's)31 b(use)f(it)h(to)g(prin)m(t)f(the)h(host)f(k)m(ey)-8 b(.)390 1011 y Fq(jas@latte:~$)44 b(shisa)j(-d)g(--keys)f(EXAMPLE.ORG)f (host/mail.example.org)390 1121 y(EXAMPLE.ORG)772 1230 y(host/mail.example.org)1154 1340 y(Account)g(is)j(enabled.)1154 1450 y(Current)d(key)i(version)f(0)i(\(0x0\).)1154 1559 y(Key)f(0)g(\(0x0\).)1535 1669 y(Etype)g(des3-cbc-sha1-kd)c(\(0x10,)j (16\).)390 1778 y(-----BEGIN)f(SHISHI)h(KEY-----)390 1888 y(Keytype:)g(16)h(\(des3-cbc-sha1-kd\))390 1998 y(Principal:)e(host/mail.example.org)390 2107 y(Realm:)h(EXAMPLE.ORG) 390 2326 y(iQdA8hxdvOUHZNliZJv7noM0)o(2rXH)o(V8gq)390 2436 y(-----END)g(SHISHI)g(KEY-----)1535 2545 y(Salt)h (EXAMPLE.ORGhost/mail.exam)o(ple)o(.org)o(.)390 2655 y(jas@latte:~$)275 2792 y Fw(So)30 b(to)h(set)g(up)e(the)i(host,)f (simply)g(redirect)h(output)f(to)h(the)g(host)f(k)m(ey)h(\014le.)390 2929 y Fq(jas@latte:~$)44 b(shisa)j(-d)g(--keys)f(EXAMPLE.ORG)f(\\)629 3039 y(host/mail.example.org)d(>>)47 b(/usr/local/etc/shishi/sh)o(ish)o (i.ke)o(ys)390 3148 y(jas@latte:~$)275 3285 y Fw(The)25 b(next)h(logical)i(step)e(is)f(to)i(create)g(a)f(principal)g(for)f (some)h(user,)g(so)g(y)m(ou)h(can)f(use)f(y)m(our)h(passw)m(ord)150 3395 y(to)36 b(get)h(a)f(Tic)m(k)m(et)h(Gran)m(ting)g(Tic)m(k)m(et)g (via)f(the)g(Authen)m(tication)h(Service)f(\(AS\))g(from)f(the)h(KDC,)g (and)150 3504 y(then)h(use)h(the)f(Tic)m(k)m(et)j(Gran)m(ting)e (Service)g(\(TGS\))g(from)f(the)h(KDC)f(to)i(get)g(a)f(tic)m(k)m(et)i (for)d(a)h(sp)s(eci\014c)150 3614 y(host,)30 b(and)e(then)h(send)f (that)i(tic)m(k)m(et)h(to)f(the)f(host)h(to)f(authen)m(ticate)j(y)m (ourself.)40 b(Creating)30 b(this)f(end-user)150 3724 y(principle)g(is)g(sligh)m(tly)h(di\013eren)m(t)f(from)g(the)g(earlier) h(steps,)g(b)s(ecause)f(y)m(ou)g(w)m(an)m(t)h(the)f(k)m(ey)h(to)f(b)s (e)g(deriv)m(ed)150 3833 y(from)d(a)i(passw)m(ord)e(instead)h(of)g(b)s (eing)g(a)g(random)f(k)m(ey)-8 b(.)41 b(The)27 b(`)p Fq(--password)p Fw(')d(parameter)k(indicate)g(this.)150 3943 y(This)i(mak)m(e)h(the)g(to)s(ol)g(ask)f(y)m(ou)h(for)f(the)h (passw)m(ord.)390 4080 y Fq(jas@latte:~$)44 b(shisa)j(-a)g(EXAMPLE.ORG) e(simon)h(--password)390 4189 y(Password)g(for)g(`simon@EXAMPLE.ORG':) 390 4299 y(Adding)g(principal)f(`simon@EXAMPLE.ORG'...)390 4408 y(Adding)h(principal)f(`simon@EXAMPLE.ORG'...done)390 4518 y(jas@latte:~$)275 4655 y Fw(The)26 b(only)i(sp)s(ecial)g(thing)f (ab)s(out)g(this)h(principal)f(no)m(w)g(is)h(that)g(it)g(has)f(a)h Fq(password)d Fw(\014eld)i(set)h(in)f(the)150 4765 y(database.)390 4902 y Fq(jas@latte:~$)44 b(shisa)j(-d)g(EXAMPLE.ORG)e(simon)h(--keys) 390 5011 y(EXAMPLE.ORG)772 5121 y(simon)1154 5230 y(Account)f(is)j (enabled.)1154 5340 y(Current)d(key)i(version)f(0)i(\(0x0\).)p eop end %%Page: 23 29 TeXDict begin 23 28 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(23)1154 299 y Fq(Key)47 b(0)g(\(0x0\).)1535 408 y(Etype)g(aes256-cts-hmac-sha1-96)41 b(\(0x12,)46 b(18\).)390 518 y(-----BEGIN)f(SHISHI)h(KEY-----)390 628 y(Keytype:)g(18)h(\(aes256-cts-hmac-sha1-9)o(6\))390 737 y(Principal:)e(simon)390 847 y(Realm:)h(EXAMPLE.ORG)390 1066 y(Ja7ciNtrAI3gtodLaVDQ5zhc)o(H58f)o(fk0k)o(S5t)o(GAM7)o(ILvM)o(=) 390 1176 y(-----END)g(SHISHI)g(KEY-----)1535 1285 y(Salt)h (EXAMPLE.ORGsimon.)1535 1395 y(Password)f(foo.)390 1504 y(jas@latte:~$)275 1640 y Fw(Y)-8 b(ou)31 b(should)f(no)m(w)h(b)s(e)f (ready)h(to)h(start)f(the)g(KDC,)g(whic)m(h)g(is)g(explained)g(in)g (the)g(next)g(section)h(\(see)150 1749 y(Section)f(3.4)h([Starting)f (Shishid],)e(page)i(23\),)h(and)e(get)i(tic)m(k)m(ets)h(as)d(explained) h(earlier)g(\(see)h(Chapter)e(2)150 1859 y([User)h(Man)m(ual],)g(page)h (13\).)150 2093 y Fv(3.4)68 b(Starting)46 b(Shishid)150 2252 y Fw(The)30 b(Shishi)g(serv)m(er,)i(or)f(Key)g(Distribution)g(Cen) m(ter)g(\(KDC\),)h(is)f(called)h(Shishid.)41 b(Shishid)29 b(is)i(resp)s(on-)150 2362 y(sible)j(for)f(listening)h(on)f(UDP)h(and)f (TCP)f(p)s(orts)h(for)g(Kerb)s(eros)f(requests.)50 b(Curren)m(tly)33 b(it)h(can)f(handle)150 2471 y(initial)41 b(tic)m(k)m(et)h(requests)e (\(Authen)m(tication)i(Service,)g(or)e(AS\),)g(t)m(ypically)h(authen)m (ticated)h(with)d(k)m(eys)150 2581 y(deriv)m(ed)28 b(from)f(passw)m (ords,)g(and)g(subsequen)m(t)g(tic)m(k)m(et)j(requests)d(\(Tic)m(k)m (et)j(Gran)m(ting)f(Service,)f(or)g(TGS\),)150 2690 y(t)m(ypically)k (authen)m(ticated)g(with)f(the)f(k)m(ey)h(acquired)g(during)e(an)h(AS)g (exc)m(hange.)275 2826 y(Curren)m(tly)h(there)h(is)g(v)m(ery)g(little)i (con\014guration)f(a)m(v)-5 b(ailable,)35 b(the)d(only)g(v)-5 b(ariables)33 b(are)f(whic)m(h)g(p)s(orts)150 2935 y(the)41 b(serv)m(er)g(should)f(listen)i(on)e(and)h(an)g(optional)h(user)e(name) h(to)g Fq(setuid)f Fw(in)m(to)i(after)f(successfully)150 3045 y(listening)31 b(to)g(the)g(p)s(orts.)275 3180 y(By)d(default,)i (Shishid)c(listens)j(on)g(the)f(`)p Fq(kerberos)p Fw(')f(service)i(p)s (ort)f(\(t)m(ypically)j(translated)e(to)g(88)g(via)150 3290 y(`)p Fq(/etc/services)p Fw('\))d(on)j(the)g(UDP)g(and)f(TCP)g (transp)s(orts)g(via)h(IPv4)g(and)f(\(if)h(y)m(our)g(mac)m(hine)h(supp) s(ort)150 3400 y(it\))h(IPv6)g(on)f(all)h(in)m(terfaces)h(on)e(y)m(our) h(mac)m(hine.)41 b(Here)31 b(is)f(a)h(t)m(ypical)h(startup.)390 3535 y Fq(latte:/home/jas/src/shis)o(hi#)41 b(/usr/local/sbin/shishid) 390 3645 y(Initializing)j(GNUTLS...)390 3754 y(Initializing)g (GNUTLS...done)390 3864 y(Listening)h(on)i(IPv4:*:kerberos/udp...done) 390 3973 y(Listening)e(on)i(IPv4:*:kerberos/tcp...done)390 4083 y(Listening)e(on)i(IPv6:*:kerberos/udp...fail)o(ed)390 4193 y(socket:)f(Address)g(family)g(not)h(supported)e(by)i(protocol)390 4302 y(Listening)e(on)i(IPv6:*:kerberos/tcp...fail)o(ed)390 4412 y(socket:)f(Address)g(family)g(not)h(supported)e(by)i(protocol)390 4521 y(Listening)e(on)i(2)h(ports...)275 4657 y Fw(Running)34 b(as)j(ro)s(ot)f(is)g(not)h(recommended.)57 b(An)m(y)36 b(securit)m(y)h(problem)f(in)f(shishid)g(and)h(y)m(our)g(host)150 4766 y(ma)m(y)26 b(b)s(e)g(compromised.)39 b(Therefor,)26 b(w)m(e)g(recommend)g(using)f(the)h(`)p Fq(--setuid)p Fw(')e(parameter,)k(as)e(follo)m(ws.)390 4902 y Fq (latte:/home/jas/src/shis)o(hi#)41 b(/usr/local/sbin/shishid)h (--setuid=jas)390 5011 y(Initializing)i(GNUTLS...)390 5121 y(Initializing)g(GNUTLS...done)390 5230 y(Listening)h(on)i (IPv4:*:kerberos/udp...done)390 5340 y(Listening)e(on)i (IPv4:*:kerberos/tcp...done)p eop end %%Page: 24 30 TeXDict begin 24 29 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(24)390 299 y Fq(Listening)45 b(on)i(IPv6:*:kerberos/udp...fail)o(ed)390 408 y(socket:)f(Address)g (family)g(not)h(supported)e(by)i(protocol)390 518 y(Listening)e(on)i (IPv6:*:kerberos/tcp...fail)o(ed)390 628 y(socket:)f(Address)g(family)g (not)h(supported)e(by)i(protocol)390 737 y(Listening)e(on)i(2)h (ports...)390 847 y(User)f(identity)e(set)i(to)g(`jas')g(\(22541\)...) 275 981 y Fw(An)41 b(alternativ)m(e)j(is)d(to)h(run)f(shishid)f(on)h (an)h(alternativ)m(e)i(p)s(ort)c(as)i(a)g(non-privileged)g(user.)73 b(T)-8 b(o)150 1090 y(con)m(tin)m(ue)37 b(the)f(example)g(of)g(setting) g(up)f(the)g Fq(EXAMPLE.ORG)e Fw(realm)j(as)g(a)g(non-privileged)g (user)e(from)150 1200 y(the)d(preceding)f(section,)i(w)m(e)f(start)f (the)h(serv)m(er)g(listen)g(on)f(p)s(ort)g(4711)i(via)f(UDP)g(on)f (IPv4.)390 1334 y Fq(jas@latte:~$)44 b(/usr/local/sbin/shishid)e(-l)47 b(IPv4:*:4711/udp)390 1443 y(Initializing)d(GNUTLS...)390 1553 y(Initializing)g(GNUTLS...done)390 1663 y(Listening)h(on)i (*:4711/tcp...)390 1772 y(Listening)e(on)i(1)h(ports...)390 1882 y(shishid:)e(Starting)f(\(GNUTLS)h(`1.0.4'\))390 1991 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(socket)h(4)275 2125 y Fw(If)31 b(y)m(ou)h(ha)m(v)m(e)h(set)g(up)e(the)h(Shisa)f (database)i(as)f(in)g(the)g(previous)g(example,)h(y)m(ou)f(can)g(no)m (w)g(acquire)150 2235 y(tic)m(k)m(ets)h(as)d(follo)m(ws.)390 2369 y Fq(jas@latte:~$)44 b(shishi)j(-o)g('realm-kdc=EXAMPLE.ORG,)o (loca)o(lhos)o(t:4)o(711')41 b(\\)533 2478 y(simon@EXAMPLE.ORG)390 2588 y(Enter)46 b(password)g(for)h(`simon@EXAMPLE.ORG':)390 2698 y(simon@EXAMPLE.ORG:)390 2807 y(Authtime:)332 b(Fri)47 b(Dec)f(12)i(01:41:01)d(2003)390 2917 y(Endtime:)380 b(Fri)47 b(Dec)f(12)i(01:57:41)d(2003)390 3026 y(Server:)428 b(krbtgt/EXAMPLE.ORG)42 b(key)47 b(aes256-cts-hmac-sha1-96)42 b(\(18\))390 3136 y(Ticket)k(key:)238 b(aes256-cts-hmac-sha1-96)41 b(\(18\))47 b(protected)e(by)i(aes256-cts-hmac-sha1-96)42 b(\(18\))390 3246 y(Ticket)k(flags:)142 b(FORWARDED)45 b(PROXIABLE)g(RENEWABLE)g(INITIAL)h(\(12\))390 3355 y(jas@latte:~$)275 3489 y Fw(The)29 b(output)h(from)g(Shishid)f(on)h(a)h(successful)f(in)m (v)m(o)s(cation)j(w)m(ould)d(lo)s(ok)h(lik)m(e:)390 3623 y Fq(shishid:)46 b(Has)g(131)h(bytes)g(from)f(*:4711/udp)f(on)j(socket) e(4)390 3733 y(shishid:)g(Processing)f(131)h(from)h(*:4711/udp)e(on)i (socket)f(4)390 3842 y(shishid:)g(Trying)g(AS-REQ)390 3952 y(shishid:)g(AS-REQ)g(from)g(simon@EXAMPLE.ORG)d(for)k (krbtgt/EXAMPLE.ORG@EXAMPL)o(E.OR)o(G)390 4061 y(shishid:)f(Matching)f (client)h(etype)h(18)g(against)f(user)g(key)h(etype)f(18)390 4171 y(shishid:)g(Have)g(511)h(bytes)f(for)h(*:4711/udp)e(on)j(socket)e (4)390 4281 y(shishid:)g(Sending)f(511)i(bytes)g(to)g(*:4711/udp)e (socket)h(4)h(via)g(UDP)390 4390 y(shishid:)f(Listening)f(on)i (*:4711/udp)e(socket)h(4)275 4524 y Fw(Y)-8 b(ou)44 b(ma)m(y)g(use)g (the)g('-v')g(parameter)h(for)e(Shishid)f(and)h(Shishi)g(to)i(generate) g(more)f(debugging)150 4634 y(information.)275 4768 y(T)-8 b(o)39 b(illustrate)g(what)g(an)f(application,)43 b(suc)m(h)38 b(as)h(the)f(Shishi)g(patc)m(hed)h(v)m(ersions)g(of)g(GNU)g(lsh)f(or) 150 4877 y(T)-8 b(elnet)39 b(from)f(GNU)h(InetUtils,)j(w)m(ould)c(do)g (when)f(con)m(tacting)k(the)e(host)f(`)p Fq(mail.example.org)p Fw(')c(w)m(e)150 4987 y(illustrate)e(using)d(the)i(TGS)f(service)h(as)g (w)m(ell.)390 5121 y Fq(jas@latte:~$)44 b(shishi)j(-o)g ('realm-kdc=EXAMPLE.ORG,)o(loca)o(lhos)o(t:4)o(711')41 b(\\)533 5230 y(simon@EXAMPLE.ORG)i(host/mail.example.org)390 5340 y(simon@EXAMPLE.ORG:)p eop end %%Page: 25 31 TeXDict begin 25 30 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(25)390 299 y Fq(Authtime:)332 b(Fri)47 b(Dec)f(12)i(01:46:54)d(2003)390 408 y(Endtime:)380 b(Fri)47 b(Dec)f(12)i(02:03:34)d(2003)390 518 y(Server:)428 b(host/mail.example.org)42 b(key)47 b(des3-cbc-sha1-kd)c(\(16\))390 628 y(Ticket)j(key:)238 b(des3-cbc-sha1-kd)43 b(\(16\))k(protected)e (by)i(aes256-cts-hmac-sha1-96)42 b(\(18\))390 737 y(Ticket)k(flags:)142 b(FORWARDED)45 b(PROXIABLE)g(\(45398796\))390 847 y(jas@latte:~$)275 979 y Fw(This)32 b(conclude)h(our)f(w)m(alk-through)h(of)g(setting)h (up)e(a)h(new)g(Kerb)s(eros)e(realm)j(using)e(Shishi.)47 b(It)33 b(is)150 1089 y(quite)26 b(lik)m(ely)g(that)g(one)g(or)f(more)g (steps)g(failed,)i(and)e(if)g(so)g(w)m(e)h(encourage)g(y)m(ou)g(to)g (debug)e(it)i(and)f(submit)150 1198 y(a)34 b(patc)m(h,)i(or)e(at)g (least)h(rep)s(ort)e(it)i(as)f(a)g(problem.)50 b(Hec)m(k,)37 b(ev)m(en)d(letting)i(us)d(kno)m(w)h(if)f(y)m(ou)h(got)h(this)f(far)150 1308 y(w)m(ould)c(b)s(e)g(of)g(in)m(terest.)42 b(See)31 b(Section)g(1.9)h([Bug)e(Rep)s(orts],)h(page)g(11.)150 1535 y Fv(3.5)68 b(Con\014guring)45 b(DNS)g(for)g(KDC)150 1695 y Fw(Making)29 b(sure)f(the)h(con\014guration)g(\014les)f(on)h (all)g(hosts)g(running)d(Shishi)i(clien)m(ts)i(include)e(the)h (addresses)150 1804 y(of)34 b(y)m(our)g(serv)m(er)g(is)g(tedious.)52 b(If)33 b(the)h(con\014guration)h(\014les)e(do)h(not)g(men)m(tion)h (the)f(KDC)g(address)f(for)h(a)150 1914 y(realm,)29 b(Shishi)f(will)g (try)h(to)g(lo)s(ok)g(up)e(the)i(information)g(from)f(DNS.)g(In)g (order)g(for)g(Shishi)f(to)i(\014nd)e(that)150 2024 y(information,)g(y) m(ou)f(need)f(to)h(add)e(the)i(information)g(to)g(DNS.)f(F)-8 b(or)26 b(this)g(to)g(w)m(ork)f(w)m(ell,)j(y)m(ou)d(need)g(to)h(set)150 2133 y(up)j(a)i(DNS)g(zone)g(with)f(the)h(same)f(name)h(as)g(y)m(our)f (Kerb)s(eros)f(realm.)42 b(The)30 b(easiest)i(is)e(if)g(y)m(ou)h(o)m (wn)g(the)150 2243 y(publicly)e(visible)h(DNS)g(name,)g(suc)m(h)f(as)h (`)p Fq(example.org)p Fw(')d(if)j(y)m(our)f(realm)i(is)e(`)p Fq(EXAMPLE.ORG)p Fw(',)f(but)h(y)m(ou)150 2352 y(can)f(set)h(up)e(an)h (in)m(ternal)g(DNS)g(serv)m(er)h(with)e(the)i(information)f(for)g(y)m (our)g(realm)g(only)-8 b(.)40 b(If)28 b(this)g(is)g(done,)150 2462 y(y)m(ou)j(do)f(not)h(need)f(to)h(k)m(eep)g(con\014guration)g (\014les)f(up)s(dated)f(for)h(the)h(KDC)f(addressing)g(information.)150 2657 y Fl(3.5.1)63 b(DNS)41 b(vs.)61 b(Kerb)s(eros)43 b(-)e(Case)f(Sensitivit)m(y)h(of)h(Realm)e(Names)150 2804 y Fw(In)28 b(Kerb)s(eros,)g(realm)h(names)g(are)g(case)h(sensitiv) m(e.)41 b(While)30 b(it)f(is)g(strongly)g(encouraged)h(that)f(all)h (realm)150 2913 y(names)e(b)s(e)f(all)h(upp)s(er)e(case)j(this)e (recommendation)i(has)e(not)h(b)s(een)f(adopted)h(b)m(y)f(all)i(sites.) 41 b(Some)27 b(sites)150 3023 y(use)c(all)g(lo)m(w)m(er)i(case)f(names) f(and)f(other)h(use)g(mixed)g(case.)39 b(DNS)23 b(on)g(the)g(other)g (hand)f(is)h(case)h(insensitiv)m(e)150 3132 y(for)44 b(queries)g(but)g(is)g(case)h(preserving)f(for)g(resp)s(onses)f(to)i (TXT)f(queries.)82 b(Since)45 b Fq(")p Fw(MYREALM)p Fq(")p Fw(,)150 3242 y Fq(")p Fw(m)m(yrealm)p Fq(")p Fw(,)36 b(and)e Fq(")p Fw(MyRealm)p Fq(")h Fw(are)g(all)h(di\013eren)m(t)f(it)g (is)g(necessary)g(that)g(only)g(one)g(of)g(the)f(p)s(ossible)150 3351 y(com)m(binations)e(of)e(upp)s(er)f(and)h(lo)m(w)m(er)h(case)h(c)m (haracters)g(b)s(e)e(used.)40 b(This)30 b(restriction)h(ma)m(y)g(b)s(e) f(lifted)h(in)150 3461 y(the)g(future)e(as)i(the)f(DNS)h(naming)f(sc)m (heme)h(is)f(expanded)g(to)h(supp)s(ort)e(non-ASCI)s(I)f(names.)150 3656 y Fl(3.5.2)63 b(Ov)m(erview)40 b(-)h(KDC)f(lo)s(cation)i (information)150 3803 y Fw(KDC)28 b(lo)s(cation)i(information)f(is)g (to)g(b)s(e)f(stored)g(using)g(the)h(DNS)f(SR)-10 b(V)28 b(RR)g([RF)m(C)i(2052].)42 b(The)28 b(format)150 3912 y(of)j(this)f(RR)g(is)g(as)h(follo)m(ws:)275 4044 y (Service.Proto.Realm)h(TTL)e(Class)g(SR)-10 b(V)30 b(Priorit)m(y)h(W)-8 b(eigh)m(t)33 b(P)m(ort)e(T)-8 b(arget)275 4176 y(The)29 b(Service)i(name)g(for)f(Kerb)s(eros)f(is)i(alw)m(a)m(ys)h Fq(")p 1978 4176 28 4 v 39 w Fw(k)m(erb)s(eros)p Fq(")p Fw(.)275 4309 y(The)38 b(Proto)j(can)e(b)s(e)g(either)h Fq(")p 1363 4309 V 40 w Fw(udp)p Fq(")p Fw(,)g Fq(")p 1717 4309 V 40 w Fw(tcp)p Fq(")p Fw(,)i(or)d Fq(")p 2166 4309 V 40 w Fw(tls.)p 2327 4309 V 40 w(tcp)p Fq(")p Fw(.)68 b(If)39 b(these)h(SR)-10 b(V)39 b(records)g(are)h(to)150 4418 y(b)s(e)f(used,)h(a)g Fq(")p 665 4418 V 40 w Fw(udp)p Fq(")d Fw(record)i(MUST)g(b)s(e)f(included.)67 b(If)38 b(the)i(Kerb)s(eros)e(implemen)m(tation)j(supp)s(orts)150 4528 y(TCP)28 b(transp)s(ort,)h(a)h Fq(")p 928 4528 V 40 w Fw(tcp)p Fq(")f Fw(record)g(MUST)g(b)s(e)f(included.)40 b(When)29 b(using)g Fq(")p 2815 4528 V 39 w Fw(tcp)p Fq(")h Fw(with)e Fq(")p 3311 4528 V 40 w Fw(k)m(erb)s(eros)p Fq(")p Fw(,)150 4637 y(this)e(indicates)g(a)g Fq(")p Fw(ra)m(w)p Fq(")g Fw(TCP)e(connection)j(without)f(an)m(y)g(additional) h(encapsulation.)40 b(A)26 b Fq(")p 3381 4637 V 39 w Fw(tls.)p 3541 4637 V 41 w(tcp)p Fq(")150 4747 y Fw(record)36 b(MUST)g(b)s(e)g(sp)s(eci\014ed)f(for)h(all)h(Kerb)s(eros)e(implemen)m (tations)j(that)f(supp)s(ort)d(comm)m(unication)150 4857 y(with)41 b(the)g(KDC)g(across)h(TCP)e(so)s(c)m(k)m(ets)j(encapsulated) e(using)g(TLS)f([RF)m(C2246])k(\(see)e(Section)g(B.1)150 4966 y([ST)-8 b(AR)g(TTLS)29 b(protected)j(KDC)e(exc)m(hanges],)i(page) f(237\).)275 5098 y(The)e(Realm)i(is)g(the)f(Kerb)s(eros)g(realm)h (that)g(this)f(record)g(corresp)s(onds)f(to.)275 5230 y(TTL,)d(Class,)j(SR)-10 b(V,)27 b(Priorit)m(y)-8 b(,)30 b(W)-8 b(eigh)m(t,)31 b(and)c(T)-8 b(arget)29 b(ha)m(v)m(e)f(the)g (standard)f(meaning)h(as)g(de\014ned)e(in)150 5340 y(RF)m(C)31 b(2052.)p eop end %%Page: 26 32 TeXDict begin 26 31 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(26)275 299 y(As)35 b(p)s(er)f(RF)m(C)h(2052)i(the)f(P)m(ort)f(n)m(um)m(b)s(er)f(should)g (b)s(e)h(the)g(v)-5 b(alue)36 b(assigned)f(to)h Fq(")p Fw(k)m(erb)s(eros)p Fq(")f Fw(b)m(y)g(the)150 408 y(In)m(ternet)c (Assigned)f(Num)m(b)s(er)f(Authorit)m(y)i(\(88\).)150 612 y Fl(3.5.3)63 b(Example)40 b(-)h(KDC)g(lo)s(cation)g(information) 150 759 y Fw(These)g(are)g(DNS)g(records)f(for)h(a)g(Kerb)s(eros)f (realm)h(ASDF.COM.)g(It)g(has)g(t)m(w)m(o)h(Kerb)s(eros)e(serv)m(ers,) 150 868 y(kdc1.asdf.com)31 b(and)f(kdc2.asdf.com.)42 b(Queries)30 b(should)f(b)s(e)h(directed)g(to)i(kdc1.asdf.com)f (\014rst)e(as)i(p)s(er)150 978 y(the)g(sp)s(eci\014ed)e(priorit)m(y)-8 b(.)42 b(W)-8 b(eigh)m(ts)32 b(are)f(not)g(used)e(in)h(these)h (records.)390 1116 y Fq(_kerberos._udp.ASDF.COM.)375 b(IN)286 b(SRV)238 b(0)47 b(0)h(88)f(kdc1.asdf.com.)390 1226 y(_kerberos._udp.ASDF.COM.)375 b(IN)286 b(SRV)238 b(1)47 b(0)h(88)f(kdc2.asdf.com.)390 1335 y(_kerberos._tcp.ASDF.COM.) 375 b(IN)286 b(SRV)238 b(0)47 b(0)h(88)f(kdc1.asdf.com.)390 1445 y(_kerberos._tcp.ASDF.COM.)375 b(IN)286 b(SRV)238 b(1)47 b(0)h(88)f(kdc2.asdf.com.)390 1554 y(_kerberos._tls._tcp.ASDF)o (.COM)o(.)137 b(IN)286 b(SRV)238 b(0)47 b(0)h(88)f(kdc1.asdf.com.)390 1664 y(_kerberos._tls._tcp.ASDF)o(.COM)o(.)137 b(IN)286 b(SRV)238 b(1)47 b(0)h(88)f(kdc2.asdf.com.)150 1867 y Fl(3.5.4)63 b(Securit)m(y)40 b(considerations)150 2014 y Fw(As)30 b(DNS)g(is)g(deplo)m(y)m(ed)h(to)s(da)m(y)-8 b(,)32 b(it)f(is)f(an)g(unsecure)f(service.)41 b(Th)m(us)29 b(the)i(infor-)f(mation)g(returned)f(b)m(y)h(it)150 2124 y(cannot)h(b)s(e)f(trusted.)275 2262 y(Curren)m(t)36 b(practice)k(for)d(REALM)h(to)h(KDC)e(mapping)h(is)g(to)g(use)g (hostnames)g(to)g(indicate)h(KDC)150 2372 y(hosts)29 b(\(stored)g(in)f(some)h(implemen)m(tation-dep)s(enden)m(t)h(lo)s (cation,)h(but)d(generally)h(a)g(lo)s(cal)h(con\014g)f(\014le\).)150 2481 y(These)44 b(hostnames)g(are)g(vulnerable)f(to)i(the)f(standard)f (set)h(of)g(DNS)g(attac)m(ks)i(\(denial)f(of)f(service,)150 2591 y(sp)s(o)s(ofed)39 b(en)m(tries,)k(etc\).)71 b(The)39 b(design)h(of)g(the)h(Kerb)s(eros)d(proto)s(col)j(limits)g(attac)m(ks)h (of)e(this)g(sort)g(to)150 2700 y(denial)i(of)g(service.)76 b(Ho)m(w)m(ev)m(er,)47 b(the)c(use)e(of)h(SR)-10 b(V)42 b(records)f(do)s(es)h(not)g(c)m(hange)h(this)f(attac)m(k)i(in)e(an)m(y) 150 2810 y(w)m(a)m(y)-8 b(.)41 b(They)27 b(ha)m(v)m(e)h(the)f(same)h (vulnerabilities)f(that)h(already)g(exist)g(in)e(the)i(common)f (practice)h(of)f(using)150 2920 y(hostnames)j(for)h(KDC)f(lo)s (cations.)275 3058 y(Implemen)m(tations)g(SHOULD)g(pro)m(vide)g(a)g(w)m (a)m(y)h(of)e(sp)s(ecifying)h(this)g(information)g(lo)s(cally)h (without)150 3168 y(the)44 b(use)g(of)g(DNS.)g(Ho)m(w)m(ev)m(er,)50 b(to)44 b(mak)m(e)h(this)f(feature)g(w)m(orth)m(while)h(a)f(lac)m(k)h (of)f(an)m(y)h(con\014guration)150 3277 y(information)31 b(on)f(a)h(clien)m(t)h(should)d(b)s(e)h(in)m(terpretted)h(as)f(p)s (ermission)g(to)h(use)f(DNS.)150 3515 y Fv(3.6)68 b(Kerb)t(eros)46 b(via)f(TLS)150 3675 y Fw(If)34 b(Shishi)f(is)i(built)f(with)g(supp)s (ort)f(for)h(GNUTLS,)h(the)f(messages)i(exc)m(hanged)f(b)s(et)m(w)m (een)h(clien)m(ts)g(and)150 3784 y(Shishid)g(can)h(b)s(e)g(protected)h (with)f(TLS.)g(TLS)f(is)i(only)f(a)m(v)-5 b(ailable)40 b(o)m(v)m(er)f(TCP)d(connections.)63 b(A)37 b(full)150 3894 y(discussion)f(of)h(the)g(features)g(TLS)f(ha)m(v)m(e)i(is)f(out)g (of)g(scop)s(e)g(here,)i(but)d(in)g(short)h(it)g(means)g(the)g(com-)150 4004 y(m)m(unication)c(is)f(in)m(tegrit)m(y)i(and)d(priv)-5 b(acy)32 b(protected,)h(and)f(that)g(users)f(can)h(use)g(Op)s(enPGP)-8 b(,)31 b(X.509)j(or)150 4113 y(SRP)f(\(i.e.,)j(an)m(y)d(mec)m(hanism)h (supp)s(orted)e(b)m(y)h(TLS\))g(to)h(authen)m(ticate)i(themselv)m(es)e (to)g(the)g(Kerb)s(eros)150 4223 y(serv)m(er.)65 b(F)-8 b(or)39 b(details)h(on)e(the)h(implemen)m(tation,)j(See)d(Section)g (B.1)g([ST)-8 b(AR)g(TTLS)38 b(protected)h(KDC)150 4332 y(exc)m(hanges],)32 b(page)f(237.)150 4535 y Fl(3.6.1)63 b(Setting)41 b(up)g(TLS)g(resume)150 4682 y Fw(Resuming)25 b(earlier)h(TLS)e(session)h(is)g(supp)s(orted)f(and)g(enabled)h(b)m(y)g (default.)39 b(This)25 b(impro)m(v)m(es)g(the)h(sp)s(eed)150 4792 y(of)31 b(the)h(TLS)e(handshak)m(e,)i(b)s(ecause)f(results)g(from) g(earlier)h(negotiations)h(can)f(b)s(e)f(re-used.)43 b(Curren)m(tly)150 4902 y(the)32 b(TLS)e(resume)i(database)g(is)g (stored)g(in)f(memory)g(\(in)h(constract)h(to)f(storing)h(it)f(on)f (disk\),)h(in)g(b)s(oth)150 5011 y(the)e(clien)m(t)i(and)e(in)g(the)g (serv)m(er.)41 b(Because)32 b(the)e(serv)m(er)h(t)m(ypically)h(runs)d (for)h(a)g(long)h(time,)h(this)e(is)g(not)h(a)150 5121 y(problem)f(for)g(that)i(side.)41 b(The)30 b(clien)m(t)i(is)f(t)m (ypically)h(not)f(a)g(long-running)f(pro)s(cess)g(though;)h(the)f (clien)m(t)150 5230 y(usually)j(is)h(in)m(v)m(ok)m(ed)g(as)g(part)f(of) h(applications)h(lik)m(e)f(`)p Fq(telnet)p Fw(')f(or)g(`)p Fq(login)p Fw('.)49 b(Ho)m(w)m(ev)m(er,)36 b(b)s(ecause)e(eac)m(h)150 5340 y(use)e(of)g(the)h(clien)m(t)h(library)e(t)m(ypically)i(result)e (in)g(a)g(tic)m(k)m(et,)k(whic)m(h)c(is)g(stored)h(on)f(disk)g(and)f (re-used)h(b)m(y)p eop end %%Page: 27 33 TeXDict begin 27 32 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(27)150 299 y(later)33 b(pro)s(cesses,)g(this)g(is)f(lik)m(ely)i(not)e(a)h(serious)f(problem)g (b)s(ecause)h(the)f(n)m(um)m(b)s(er)f(of)i(di\013eren)m(t)f(tic)m(k)m (ets)150 408 y(required)26 b(b)m(y)h(a)g(user)g(is)g(usually)f(quite)i (small.)40 b(F)-8 b(or)28 b(the)f(clien)m(t,)i(TLS)d(resume)h(is)g(t)m (ypically)i(only)e(useful)150 518 y(when)h(y)m(ou)i(p)s(erform)e(an)i (initial)g(authen)m(tication)i(\(using)d(a)h(passw)m(ord\))f(follo)m(w) m(ed)j(b)m(y)d(a)h(tic)m(k)m(et)i(request)150 628 y(for)e(a)h(service,) g(in)f(the)h(same)g(pro)s(cess.)275 766 y(Y)-8 b(ou)43 b(can)f(con\014gure)h(the)f(serv)m(er,)47 b(`)p Fq(shishid)p Fw(')41 b(to)i(nev)m(er)g(use)f(TLS)f(resume,)46 b(or)c(to)i(increase)f (or)150 875 y(decrease)i(the)g(n)m(um)m(b)s(er)e(of)h(distinct)h(TLS)e (connections)j(that)f(can)f(b)s(e)g(resumed)f(b)s(efore)h(they)h(are) 150 985 y(garbage)e(collected,)k(see)42 b(the)g(`)p Fq(--resume-limit)p Fw(')c(parameter)k(\(see)g(Section)h(4.7)f([P)m(arameters)h(for)150 1094 y(shishid],)30 b(page)h(47\).)150 1297 y Fl(3.6.2)63 b(Setting)41 b(up)g(Anon)m(ymous)h(TLS)150 1444 y Fw(Anon)m(ymous)f (TLS)f(is)h(the)g(simplest)g(to)h(set)g(up)e(and)h(use.)72 b(In)41 b(fact,)k(only)c(the)g(clien)m(t)i(need)e(to)h(b)s(e)150 1554 y(informed)30 b(that)h(y)m(our)g(KDC)f(supp)s(ort)f(TLS.)h(This)g (can)h(b)s(e)f(done)g(in)h(the)g(con\014guration)g(\014le)f(with)h(the) 150 1663 y(`)p Fq(/tls)p Fw(')k(parameter)i(for)f(`)p Fq(kdc-realm)p Fw(')e(\(see)j([Shishi)e(Con\014guration],)i(page)g (43\),)i(or)d(b)m(y)g(placing)h(the)150 1773 y(KDC)e(address)g(in)g (DNS)g(using)g(the)h(`)p Fq(_tls)p Fw(')e(SR)-10 b(V)35 b(record)g(\(see)i(Section)f(3.5)g([Con\014guring)f(DNS)g(for)150 1882 y(KDC],)c(page)g(25\).)275 2020 y(Let's)43 b(start)g(Shishid,)h (listening)g(on)e(a)h(TCP)f(so)s(c)m(k)m(et.)79 b(TLS)42 b(require)g(TCP)-8 b(.)42 b(TCP)g(so)s(c)m(k)m(ets)j(are)150 2130 y(automatically)33 b(upgraded)c(to)j(TLS)d(if)h(the)h(clien)m(t)h (request)e(it.)390 2268 y Fq(jas@latte:~$)44 b(/usr/local/sbin/shishid) e(-l)47 b(IPv4:*:4711/tcp)390 2377 y(Initializing)d(GNUTLS...done)390 2487 y(Listening)h(on)i(IPv4:*:4711/tcp...)390 2597 y(Listening)e(on)i (1)h(ports...)390 2706 y(shishid:)e(Starting)f(\(GNUTLS)h(`1.0.4'\))390 2816 y(shishid:)g(Listening)f(on)i(IPv4:*:4711/tcp)d(socket)i(4)275 2954 y Fw(Let's)31 b(use)f(the)g(clien)m(t)i(to)f(talk)h(with)e(it,)h (using)f(TLS.)390 3092 y Fq(jas@latte:~$)44 b(shishi)j(-o)g ('realm-kdc=EXAMPLE.ORG,)o(loca)o(lhos)o(t:4)o(711/)o(tls)41 b(\\)581 3201 y(simon@EXAMPLE.ORG)390 3311 y(Enter)46 b(password)g(for)h(`simon@EXAMPLE.ORG':)390 3420 y(simon@EXAMPLE.ORG:) 390 3530 y(Authtime:)332 b(Tue)47 b(Dec)f(16)i(05:20:47)d(2003)390 3639 y(Endtime:)380 b(Tue)47 b(Dec)f(16)i(05:37:27)d(2003)390 3749 y(Server:)428 b(krbtgt/EXAMPLE.ORG)42 b(key)47 b (aes256-cts-hmac-sha1-96)42 b(\(18\))390 3859 y(Ticket)k(key:)238 b(aes256-cts-hmac-sha1-96)41 b(\(18\))47 b(protected)e(by)i (aes256-cts-hmac-sha1-96)42 b(\(18\))390 3968 y(Ticket)k(flags:)142 b(FORWARDED)45 b(PROXIABLE)g(\(12\))390 4078 y(jas@latte:~$)275 4216 y Fw(On)29 b(success,)i(the)f(serv)m(er)h(will)g(prin)m(t)f(the)g (follo)m(wing)i(debug)e(information.)390 4354 y Fq(shishid:)46 b(Accepted)f(socket)h(6)i(from)e(socket)g(4)i(as)f(IPv4:*:4711/tcp)d (peer)i(127.0.0.1)390 4463 y(shishid:)g(Listening)f(on)i (IPv4:*:4711/tcp)d(socket)i(4)390 4573 y(shishid:)g(Listening)f(on)i (IPv4:*:4711/tcp)d(peer)i(127.0.0.1)g(socket)g(6)390 4682 y(shishid:)g(Has)g(4)i(bytes)e(from)h(IPv4:*:4711/tcp)d(peer)i (127.0.0.1)f(on)j(socket)e(6)390 4792 y(shishid:)g(Trying)g(STARTTLS) 390 4902 y(shishid:)g(TLS)g(handshake)g(negotiated)f(protocol)g(`TLS)i (1.0',)f(key)h(exchange)f(`Anon)g(DH',)h(certficate)e(type)h(`X.509',)g (cipher)g(`AES)h(256)f(CBC',)h(mac)g(`SHA',)f(compression)f(`NULL',)g (session)h(not)h(resumed)390 5011 y(shishid:)f(TLS)g(anonymous)g (authentication)e(with)i(1024)h(bit)g(Diffie-Hellman)390 5121 y(shishid:)f(Listening)f(on)i(IPv4:*:4711/tcp)d(socket)i(4)390 5230 y(shishid:)g(Listening)f(on)i(IPv4:*:4711/tcp)d(peer)i(127.0.0.1)g (socket)g(6)390 5340 y(shishid:)g(Has)g(131)h(bytes)g(from)f (IPv4:*:4711/tcp)e(peer)j(127.0.0.1)e(on)i(socket)f(6)p eop end %%Page: 28 34 TeXDict begin 28 33 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(28)390 299 y Fq(shishid:)46 b(Processing)f(131)h(from)h(IPv4:*:4711/tcp)d(peer)i(127.0.0.1)g(on)h (socket)f(6)390 408 y(shishid:)g(Trying)g(AS-REQ)390 518 y(shishid:)g(AS-REQ)g(from)g(simon@EXAMPLE.ORG)d(for)k (krbtgt/EXAMPLE.ORG@EXAMPL)o(E.OR)o(G)390 628 y(shishid:)f(Matching)f (client)h(etype)h(18)g(against)f(user)g(key)h(etype)f(18)390 737 y(shishid:)g(Have)g(511)h(bytes)f(for)h(IPv4:*:4711/tcp)d(peer)j (127.0.0.1)e(on)i(socket)f(6)390 847 y(shishid:)g(Sending)f(511)i (bytes)g(to)g(IPv4:*:4711/tcp)c(peer)k(127.0.0.1)e(socket)h(6)i(via)f (TLS)390 956 y(shishid:)f(Listening)f(on)i(IPv4:*:4711/tcp)d(socket)i (4)390 1066 y(shishid:)g(Listening)f(on)i(IPv4:*:4711/tcp)d(peer)i (127.0.0.1)g(socket)g(6)390 1176 y(shishid:)g(Peer)g(IPv4:*:4711/tcp)e (peer)i(127.0.0.1)g(disconnected)e(on)j(socket)f(6)390 1285 y(shishid:)g(Closing)f(IPv4:*:4711/tcp)f(peer)j(127.0.0.1)e (socket)h(6)390 1395 y(shishid:)g(Listening)f(on)i(IPv4:*:4711/tcp)d (socket)i(4)150 1588 y Fl(3.6.3)63 b(Setting)41 b(up)g(X.509)h(authen)m (ticated)d(TLS)150 1735 y Fw(Setting)33 b(up)d(X.509)k(authen)m (tication)g(is)e(sligh)m(tly)h(more)f(complicated)i(than)d(anon)m (ymous)h(authen)m(tica-)150 1844 y(tion.)59 b(Y)-8 b(ou)37 b(need)f(a)h(X.509)h(certi\014cate)h(authorit)m(y)e(\(CA\))g(that)g (can)g(generate)g(certi\014cates)i(for)d(y)m(our)150 1954 y(Kerb)s(eros)23 b(serv)m(er)i(and)e(Kerb)s(eros)h(clien)m(ts.)40 b(It)24 b(is)g(often)h(easiest)h(to)f(setup)e(the)i(CA)f(y)m(ourself.) 39 b(Managing)150 2064 y(a)f(CA)f(can)g(b)s(e)g(a)g(daun)m(ting)g (task,)j(and)d(w)m(e)h(only)f(giv)m(e)i(the)e(bare)g(essen)m(tials)i (to)f(get)g(things)f(up)g(and)150 2173 y(running.)63 b(W)-8 b(e)39 b(suggest)h(that)e(y)m(ou)h(study)f(the)g(relev)-5 b(an)m(t)40 b(literature.)65 b(As)39 b(a)f(\014rst)g(step)g(b)s(ey)m (ond)g(this)150 2283 y(in)m(tro)s(duction,)31 b(y)m(ou)f(ma)m(y)h(wish) f(to)h(explore)g(more)f(secure)h(forms)f(of)g(k)m(ey)h(storage)h(than)e (storing)h(them)150 2392 y(unencrypted)e(on)h(disk.)275 2524 y(The)44 b(follo)m(wing)i(three)g(sections)g(describ)s(e)e(ho)m(w) h(y)m(ou)g(create)i(the)e(CA,)g(KDC)g(certi\014cate,)51 b(and)150 2633 y(clien)m(t)41 b(certi\014cates.)70 b(Y)-8 b(ou)40 b(can)f(use)g(an)m(y)h(to)s(ol)g(y)m(ou)g(lik)m(e)h(for)e(this) g(task,)k(as)c(long)h(as)g(they)f(generate)150 2743 y(X.509)33 b(\(PKIX\))e(certi\014cates)h(in)f(PEM)g(format)g(and)f(RSA)h(k)m(eys)g (in)g(PK)m(CS#1)f(format.)43 b(Here)31 b(w)m(e)g(use)150 2852 y(`)p Fq(certtool)p Fw(')26 b(that)i(come)g(with)f(GNUTLS,)h(whic) m(h)f(is)g(widely)h(a)m(v)-5 b(ailable.)42 b(W)-8 b(e)28 b(conclude)g(b)m(y)g(discussing)150 2962 y(ho)m(w)i(y)m(ou)h(use)f (these)h(certi\014cates)h(in)e(the)h(KDC)f(and)g(in)g(the)g(Shishi)g (clien)m(t.)150 3155 y Fl(3.6.3.1)63 b(Create)40 b(a)h(Kerb)s(eros)h (Certi\014cate)e(Authorit)m(y)150 3302 y Fw(First)31 b(create)h(a)e(CA)h(k)m(ey)-8 b(.)390 3433 y Fq(jas@latte:~$)44 b(certtool)i(--generate-privkey)d(\\)533 3543 y(--outfile)i (/usr/local/etc/shishi/shis)o(hi.k)o(ey)390 3653 y(Generating)g(a)i (private)f(key...)390 3762 y(Generating)f(a)i(1024)g(bit)g(RSA)g (private)f(key...)390 3872 y(jas@latte:~$)275 4003 y Fw(Then)29 b(create)j(the)e(CA)h(certi\014cate.)42 b(Use)31 b(whatev)m(er)g(details)h(y)m(ou)e(prefer.)390 4134 y Fq(jas@latte:~$)44 b(certtool)i(--generate-self-signed)c(\\)533 4244 y(--load-privkey)i(/usr/local/etc/shishi/shi)o(shi)o(.key)d(\\)533 4354 y(--outfile)k(/usr/local/etc/shishi/shis)o(hi.c)o(ert)390 4463 y(Generating)g(a)i(self)g(signed)f(certificate...)390 4573 y(Please)g(enter)g(the)h(details)f(of)h(the)g(certificate's)d (distinguished)h(name.)h(\\)390 4682 y(Just)h(press)f(enter)g(to)i (ignore)e(a)h(field.)390 4792 y(Country)f(name)g(\(2)i(chars\):)d(SE) 390 4902 y(Organization)f(name:)j(Shishi)f(Example)g(CA)390 5011 y(Organizational)e(unit)j(name:)390 5121 y(Locality)f(name:)390 5230 y(State)g(or)i(province)d(name:)390 5340 y(Common)h(name:)g(CA)p eop end %%Page: 29 35 TeXDict begin 29 34 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(29)390 299 y Fq(This)47 b(field)f(should)g(not)h(be)g(used)g(in)g(new)g(certificates.)390 408 y(E-mail:)390 518 y(Enter)f(the)h(certificate's)d(serial)j(number)f (\(decimal\):)f(0)390 847 y(Activation/Expiration)d(time.)390 956 y(The)47 b(generated)e(certificate)g(will)i(expire)f(in)h (\(days\):)f(180)390 1285 y(Extensions.)390 1395 y(Does)h(the)g (certificate)d(belong)i(to)i(an)f(authority?)e(\(Y/N\):)h(y)390 1504 y(Is)h(this)g(a)g(web)g(server)f(certificate?)f(\(Y/N\):)h(n)390 1614 y(Enter)g(the)h(e-mail)f(of)i(the)e(subject)g(of)h(the)g (certificate:)390 1943 y(X.509)f(certificate)f(info:)390 2162 y(Version:)h(3)390 2271 y(Serial)g(Number)g(\(hex\):)g(00)390 2381 y(Validity:)772 2491 y(Not)h(Before:)f(Sun)g(Dec)h(21)h(10:59:00)d (2003)772 2600 y(Not)i(After:)f(Fri)h(Jun)g(18)g(11:59:00)e(2004)390 2710 y(Subject:)h(C=SE,O=Shishi)e(Example)i(CA,CN=CA)390 2819 y(Subject)g(Public)g(Key)h(Info:)772 2929 y(Public)f(Key)h (Algorithm:)e(RSA)390 3148 y(X.509)h(Extensions:)772 3258 y(Basic)g(Constraints:)f(\(critical\))1154 3367 y(CA:TRUE)390 3587 y(Is)i(the)g(above)f(information)f(ok?)i(\(Y/N\):)f (y)390 3915 y(Signing)g(certificate...)390 4025 y(jas@latte:~$)150 4229 y Fl(3.6.3.2)63 b(Create)40 b(a)h(Kerb)s(eros)h(KDC)f (Certi\014cate)150 4375 y Fw(First)31 b(create)h(the)e(k)m(ey)h(for)f (the)h(KDC.)390 4514 y Fq(jas@latte:~$)44 b(certtool)i (--generate-privkey)d(\\)533 4624 y(--outfile)i (/usr/local/etc/shishi/shis)o(hid.)o(key)390 4733 y(Generating)g(a)i (private)f(key...)390 4843 y(Generating)f(a)i(1024)g(bit)g(RSA)g (private)f(key...)390 4953 y(jas@latte:~$)275 5092 y Fw(Then)26 b(create)i(actual)h(KDC)e(certi\014cate,)j(signed)d(b)m(y)g (the)h(CA)f(certi\014cate)i(created)f(in)f(the)g(previous)150 5201 y(step.)390 5340 y Fq(jas@latte:~$)44 b(certtool)i (--generate-certificate)c(\\)p eop end %%Page: 30 36 TeXDict begin 30 35 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(30)533 299 y Fq (--load-ca-certificate)42 b(/usr/local/etc/shishi/shi)o(shi.)o(cer)o(t) g(\\)533 408 y(--load-ca-privkey)h(/usr/local/etc/shishi/shi)o(shi.)o (key)e(\\)533 518 y(--load-privkey)j(/usr/local/etc/shishi/shi)o(shi)o (d.ke)o(y)e(\\)533 628 y(--outfile)j(/usr/local/etc/shishi/shis)o(hid.) o(cer)o(t)390 737 y(Generating)g(a)i(signed)g(certificate...)390 847 y(Loading)f(CA's)g(private)g(key...)390 956 y(Loading)g(CA's)g (certificate...)390 1066 y(Please)g(enter)g(the)h(details)f(of)h(the)g (certificate's)d(distinguished)h(name.)h(\\)390 1176 y(Just)h(press)f(enter)g(to)i(ignore)e(a)h(field.)390 1285 y(Country)f(name)g(\(2)i(chars\):)d(SE)390 1395 y(Organization)f(name:)j(Shishi)f(Example)g(KDC)390 1504 y(Organizational)e(unit)j(name:)390 1614 y(Locality)f(name:)390 1724 y(State)g(or)i(province)d(name:)390 1833 y(Common)h(name:)g(KDC) 390 1943 y(This)h(field)f(should)g(not)h(be)g(used)g(in)g(new)g (certificates.)390 2052 y(E-mail:)390 2162 y(Enter)f(the)h (certificate's)d(serial)j(number)f(\(decimal\):)f(0)390 2491 y(Activation/Expiration)d(time.)390 2600 y(The)47 b(generated)e(certificate)g(will)i(expire)f(in)h(\(days\):)f(180)390 2929 y(Extensions.)390 3039 y(Does)h(the)g(certificate)d(belong)i(to)i (an)f(authority?)e(\(Y/N\):)h(n)390 3148 y(Is)h(this)g(a)g(web)g (server)f(certificate?)f(\(Y/N\):)h(n)390 3258 y(Enter)g(the)h(e-mail)f (of)i(the)e(subject)g(of)h(the)g(certificate:)390 3587 y(X.509)f(certificate)f(info:)390 3806 y(Version:)h(3)390 3915 y(Serial)g(Number)g(\(hex\):)g(00)390 4025 y(Validity:)772 4134 y(Not)h(Before:)f(Sun)g(Dec)h(21)h(11:02:00)d(2003)772 4244 y(Not)i(After:)f(Fri)h(Jun)g(18)g(12:02:00)e(2004)390 4354 y(Subject:)h(C=SE,O=Shishi)e(Example)i(KDC,CN=KDC)390 4463 y(Subject)g(Public)g(Key)h(Info:)772 4573 y(Public)f(Key)h (Algorithm:)e(RSA)390 4792 y(X.509)h(Extensions:)772 4902 y(Basic)g(Constraints:)f(\(critical\))1154 5011 y(CA:FALSE)390 5230 y(Is)i(the)g(above)f(information)f(ok?)i(\(Y/N\):)f (y)p eop end %%Page: 31 37 TeXDict begin 31 36 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(31)390 408 y Fq(Signing)46 b(certificate...)390 518 y(jas@latte:~$)150 722 y Fl(3.6.3.3)63 b(Create)40 b(a)h(Kerb)s(eros)h(Clien)m(t)f(Certi\014cate)150 869 y Fw(First)31 b(create)h(the)e(k)m(ey)h(for)f(the)h(clien)m(t.)390 1007 y Fq(jas@latte:~$)44 b(certtool)i(--generate-privkey)d(\\)533 1117 y(--outfile)i(~/.shishi/client.key)390 1227 y(Generating)g(a)i (private)f(key...)390 1336 y(Generating)f(a)i(1024)g(bit)g(RSA)g (private)f(key...)390 1446 y(jas@latte:~$)275 1585 y Fw(Then)35 b(create)k(the)d(clien)m(t)j(certi\014cate,)h(signed)d(b)m (y)g(the)f(CA.)h(An)g(alternativ)m(e)i(w)m(ould)d(b)s(e)g(to)i(ha)m(v)m (e)150 1694 y(the)31 b(KDC)f(sign)g(the)h(clien)m(t)h(certi\014cates.) 390 1833 y Fq(jas@latte:~$)44 b(certtool)i(--generate-certificate)c(\\) 533 1943 y(--load-ca-certificate)g(/usr/local/etc/shishi/shi)o(shi.)o (cer)o(t)g(\\)533 2052 y(--load-ca-privkey)h(/usr/local/etc/shishi/shi) o(shi.)o(key)e(\\)533 2162 y(--load-privkey)j(~/.shishi/client.key)e (\\)533 2271 y(--outfile)j(~/.shishi/client.certs)390 2381 y(Generating)g(a)i(signed)g(certificate...)390 2491 y(Loading)f(CA's)g(private)g(key...)390 2600 y(Loading)g(CA's)g (certificate...)390 2710 y(Please)g(enter)g(the)h(details)f(of)h(the)g (certificate's)d(distinguished)h(name.)h(\\)390 2819 y(Just)h(press)f(enter)g(to)i(ignore)e(a)h(field.)390 2929 y(Country)f(name)g(\(2)i(chars\):)d(SE)390 3039 y(Organization)f(name:)j(Shishi)f(Example)g(Client)390 3148 y(Organizational)e(unit)j(name:)390 3258 y(Locality)f(name:)390 3367 y(State)g(or)i(province)d(name:)390 3477 y(Common)h(name:)g (Client)390 3587 y(This)h(field)f(should)g(not)h(be)g(used)g(in)g(new)g (certificates.)390 3696 y(E-mail:)390 3806 y(Enter)f(the)h (certificate's)d(serial)j(number)f(\(decimal\):)f(0)390 4134 y(Activation/Expiration)d(time.)390 4244 y(The)47 b(generated)e(certificate)g(will)i(expire)f(in)h(\(days\):)f(180)390 4573 y(Extensions.)390 4682 y(Does)h(the)g(certificate)d(belong)i(to)i (an)f(authority?)e(\(Y/N\):)h(n)390 4792 y(Is)h(this)g(a)g(web)g (server)f(certificate?)f(\(Y/N\):)h(n)390 4902 y(Enter)g(the)h(e-mail)f (of)i(the)e(subject)g(of)h(the)g(certificate:)390 5230 y(X.509)f(certificate)f(info:)p eop end %%Page: 32 38 TeXDict begin 32 37 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(32)390 299 y Fq(Version:)46 b(3)390 408 y(Serial)g(Number)g(\(hex\):)g(00)390 518 y(Validity:)772 628 y(Not)h(Before:)f(Sun)g(Dec)h(21)h(11:04:00)d(2003) 772 737 y(Not)i(After:)f(Fri)h(Jun)g(18)g(12:04:00)e(2004)390 847 y(Subject:)h(C=SE,O=Shishi)e(Example)i(Client,CN=Client)390 956 y(Subject)g(Public)g(Key)h(Info:)772 1066 y(Public)f(Key)h (Algorithm:)e(RSA)390 1285 y(X.509)h(Extensions:)772 1395 y(Basic)g(Constraints:)f(\(critical\))1154 1504 y(CA:FALSE)390 1724 y(Is)i(the)g(above)f(information)f(ok?)i(\(Y/N\):)f (y)390 2052 y(Signing)g(certificate...)390 2162 y(jas@latte:~$)150 2366 y Fl(3.6.3.4)63 b(Starting)41 b(KDC)g(with)f(X.509)i(authen)m (tication)e(supp)s(ort)150 2512 y Fw(The)e(KDC)g(need)g(the)h(CA)f (certi\014cate)i(\(to)g(v)m(erify)e(clien)m(t)i(certi\014cates\))h(and) d(the)g(serv)m(er)h(certi\014cate)150 2622 y(and)34 b(k)m(ey)h(\(to)h (authen)m(ticate)h(itself)e(to)g(the)g(clien)m(ts\).)55 b(See)35 b(elsewhere)g(\(see)h(Section)f(4.7)h([P)m(arameters)150 2732 y(for)30 b(shishid],)g(page)h(47\))g(for)g(the)f(en)m(tire)h (description)g(of)f(the)h(parameters.)390 2870 y Fq(jas@latte:~$)44 b(shishid)i(-l)h(*:4711/tcp)e(\\)533 2980 y(--x509cafile)g (/usr/local/etc/shishi/s)o(hish)o(i.c)o(ert)c(\\)533 3090 y(--x509certfile)j(/usr/local/etc/shishi/shi)o(shi)o(d.ce)o(rt)e (\\)533 3199 y(--x509keyfile)i(/usr/local/etc/shishi/shis)o(hid)o(.key) 390 3309 y(Initializing)g(GNUTLS...)390 3418 y(Parsed)i(1)i(CAs...)390 3528 y(Loaded)e(server)g(certificate/key...)390 3638 y(Generating)f(Diffie-Hellman)f(parameters...)390 3747 y(Initializing)g(GNUTLS...done)390 3857 y(Listening)h(on)i (*:4711/tcp...)390 3966 y(Listening)e(on)i(1)h(ports...)390 4076 y(shishid:)e(Starting)f(\(GNUTLS)h(`1.0.4'\))390 4186 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(socket)h(4)275 4324 y Fw(Then)29 b(acquire)j(tic)m(k)m(ets)h(as)e(usual.)41 b(In)30 b(case)i(y)m(ou)f(w)m(onder)g(ho)m(w)f(shishi)g(\014nds)g(the)h (clien)m(t)h(certi\014cate)150 4434 y(and)e(k)m(ey)-8 b(,)32 b(the)f(\014lenames)g(used)f(ab)s(o)m(v)m(e)i(when)d(generating) j(the)f(clien)m(t)i(certi\014cates)f(happ)s(en)d(to)j(b)s(e)e(the)150 4544 y(default)h(\014lenames)f(for)g(these)h(\014les.)41 b(So)30 b(it)h(pic)m(k)g(them)f(up)f(automatically)-8 b(.)390 4682 y Fq(jas@latte:~$)44 b(shishi)j(-o)g ('realm-kdc=EXAMPLE.ORG,)o(loca)o(lhos)o(t:4)o(711/)o(tls')41 b(\\)533 4792 y(simon@EXAMPLE.ORG)390 4902 y(Enter)46 b(password)g(for)h(`simon@EXAMPLE.ORG':)390 5011 y(simon@EXAMPLE.ORG:) 390 5121 y(Authtime:)332 b(Sun)47 b(Dec)f(21)i(11:15:47)d(2003)390 5230 y(Endtime:)380 b(Sun)47 b(Dec)f(21)i(11:32:27)d(2003)390 5340 y(Server:)428 b(krbtgt/EXAMPLE.ORG)42 b(key)47 b (aes256-cts-hmac-sha1-96)42 b(\(18\))p eop end %%Page: 33 39 TeXDict begin 33 38 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(33)390 299 y Fq(Ticket)46 b(key:)238 b(aes256-cts-hmac-sha1-96)41 b(\(18\))47 b(protected)e(by)i (aes256-cts-hmac-sha1-96)42 b(\(18\))390 408 y(Ticket)k(flags:)142 b(FORWARDED)45 b(PROXIABLE)g(RENEWABLE)g(HWAUTHENT)h (TRANSITEDPOLICYCHECKED)41 b(OKASDELEGATE)k(\(12\))390 518 y(jas@latte:~$)275 653 y Fw(Here)30 b(is)h(what)f(the)h(serv)m(er)f (w)m(ould)g(prin)m(t.)390 789 y Fq(shishid:)46 b(Accepted)f(socket)h(6) i(from)e(socket)g(4)i(as)f(*:4711/tcp)e(peer)i(127.0.0.1)390 898 y(shishid:)f(Listening)f(on)i(*:4711/tcp)e(socket)h(4)390 1008 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(peer)i(127.0.0.1)e (socket)h(6)390 1118 y(shishid:)g(Has)g(4)i(bytes)e(from)h(*:4711/tcp)e (peer)i(127.0.0.1)e(on)i(socket)f(6)390 1227 y(shishid:)g(Trying)g (STARTTLS)390 1337 y(shishid:)g(TLS)g(handshake)g(negotiated)f (protocol)g(`TLS)i(1.0',)f(key)h(exchange)f(`RSA',)g(certficate)f(type) h(`X.509',)g(cipher)g(`AES)h(256)g(CBC',)f(mac)h(`SHA',)f(compression)f (`NULL',)g(session)h(not)h(resumed)390 1446 y(shishid:)f(TLS)g(client)h (certificate)d(`C=SE,O=Shishi)g(Example)i(Client,CN=Client',)d(issued)j (by)h(`C=SE,O=Shishi)d(Example)i(CA,CN=CA',)f(serial)h(number)g(`00',)g (MD5)h(fingerprint)e(`a5:d3:1f:58:76:e3:58:cd)o(:2d:)o(eb:)o(f7:4)o (5:a2)o(:4b)o(:52:)o(f9:')o(,)d(activated)j(`Sun)i(Dec)g(21)g(11:04:00) e(2003',)h(expires)g(`Fri)h(Jun)g(18)g(12:04:00)e(2004',)h(version)g (#3,)h(key)g(RSA)g(modulus)f(1024)g(bits,)h(currently)e(EXPIRED)390 1556 y(shishid:)h(Listening)f(on)i(*:4711/tcp)e(socket)h(4)390 1666 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(peer)i(127.0.0.1)e (socket)h(6)390 1775 y(shishid:)g(Has)g(131)h(bytes)g(from)f (*:4711/tcp)f(peer)i(127.0.0.1)e(on)i(socket)g(6)390 1885 y(shishid:)f(Processing)f(131)h(from)h(*:4711/tcp)e(peer)i (127.0.0.1)e(on)i(socket)f(6)390 1994 y(shishid:)g(Trying)g(AS-REQ)390 2104 y(shishid:)g(AS-REQ)g(from)g(simon@EXAMPLE.ORG)d(for)k (krbtgt/EXAMPLE.ORG@EXAMPL)o(E.OR)o(G)390 2213 y(shishid:)f(Matching)f (client)h(etype)h(18)g(against)f(user)g(key)h(etype)f(18)390 2323 y(shishid:)g(Have)g(511)h(bytes)f(for)h(*:4711/tcp)e(peer)i (127.0.0.1)e(on)i(socket)g(6)390 2433 y(shishid:)f(Sending)f(511)i (bytes)g(to)g(*:4711/tcp)e(peer)h(127.0.0.1)g(socket)g(6)h(via)g(TLS) 390 2542 y(shishid:)f(Listening)f(on)i(*:4711/tcp)e(socket)h(4)390 2652 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(peer)i(127.0.0.1)e (socket)h(6)390 2761 y(shishid:)g(Peer)g(*:4711/tcp)f(peer)i(127.0.0.1) e(disconnected)g(on)i(socket)f(6)390 2871 y(shishid:)g(Closing)f (*:4711/tcp)g(peer)i(127.0.0.1)e(socket)h(6)390 2981 y(shishid:)g(Listening)f(on)i(*:4711/tcp)e(socket)h(4)150 3214 y Fv(3.7)68 b(Multiple)46 b(serv)l(ers)150 3374 y Fw(Setting)38 b(up)d(m)m(ultiple)j(serv)m(ers)f(is)f(as)h(easy)h(as)f (replicating)h(the)f(user)f(database.)61 b(Since)37 b(the)g(default)150 3483 y(`)p Fq(file)p Fw(')31 b(user)f(database)j(is)e(stored)g(in)g (the)h(normal)f(\014le)h(system,)f(y)m(ou)h(can)g(use)f(an)m(y)g (common)h(to)s(ols)g(to)150 3593 y(replicate)g(a)f(\014le)f(system.)42 b(Net)m(w)m(ork)32 b(\014le)e(system)h(lik)m(e)g(NFS)g(\(prop)s(erly)e (secured)i(b)m(y)-8 b(,)31 b(e.g.,)h(a)f(p)s(oin)m(t-to-)150 3703 y(p)s(oin)m(t)e(symmetrically)i(encrypted)e(IPSEC)f(connection\))j (and)e(\014le)g(sync)m(hronizing)h(to)s(ols)g(lik)m(e)h(`)p Fq(rsync)p Fw(')150 3812 y(are)g(t)m(ypical)h(c)m(hoices.)275 3948 y(The)k(secondary)h(serv)m(er)g(should)f(b)s(e)g(con\014gured)g (just)h(lik)m(e)h(the)f(master)g(serv)m(er.)61 b(If)36 b(y)m(ou)h(use)g(the)150 4057 y(`)p Fq(file)p Fw(')d(database)i(o)m(v)m (er)g(NFS)e(y)m(ou)h(do)g(not)g(ha)m(v)m(e)h(to)f(mak)m(e)h(an)m(y)f (mo)s(di\014cations.)54 b(If)34 b(y)m(ou)h(use,)h(e.g.,)i(a)150 4167 y(cron)33 b(job)f(to)i(`)p Fq(rsync)p Fw(')d(the)i(directory)h(ev) m(ery)f(hour)f(or)h(so,)h(y)m(ou)f(ma)m(y)g(w)m(an)m(t)h(to)f(add)f(a)i (`)p Fq(--read-only)p Fw(')150 4276 y(\015ag)d(to)g(the)g(Shisa)f(`)p Fq(db)p Fw(')g(de\014nition)h(\(see)g(Section)g(4.5)h([Shisa)e (Con\014guration],)h(page)g(45\).)43 b(That)30 b(w)m(a)m(y)-8 b(,)150 4386 y(nob)s(o)s(dy)22 b(will)j(b)s(e)e(lured)g(in)m(to)i (creating)h(or)e(c)m(hanging)h(information)f(in)g(the)g(database)h(on)f (the)g(secondary)150 4495 y(serv)m(er,)31 b(whic)m(h)f(only)g(w)m(ould) h(b)s(e)e(o)m(v)m(erwritten)j(during)d(the)i(next)f(sync)m (hronization.)390 4631 y Fq(db)47 b(--read-only)e(file)i (/usr/local/var/backup-s)o(his)o(hi)275 4766 y Fw(The)25 b(`)p Fq(file)p Fw(')g(database)h(is)g(designed)f(so)h(it)g(do)s(esn't) g(require)f(\014le)h(lo)s(c)m(king)g(in)g(the)g(\014le)f(system,)i (whic)m(h)150 4876 y(ma)m(y)41 b(b)s(e)f(unreliable)h(in)f(some)h(net)m (w)m(ork)h(\014le)e(systems)h(or)f(implemen)m(tations.)73 b(It)41 b(is)g(also)g(designed)150 4985 y(so)35 b(that)h(m)m(ultiple)f (concurren)m(t)g(readers)g(and)f(writers)h(ma)m(y)g(access)i(the)e (database)h(without)f(causing)150 5095 y(corruption.)275 5230 y Fk(W)-8 b(arning:)44 b Fw(The)32 b(last)i(paragraph)d(is)i (curren)m(tly)f(not)h(completely)h(accurate.)48 b(There)32 b(ma)m(y)h(b)s(e)f(race)150 5340 y(conditions)c(with)f(concurren)m(t)h (writers.)39 b(None)28 b(should)e(cause)i(in\014nite)g(lo)s(ops)f(or)g (data)i(loss.)40 b(Ho)m(w)m(ev)m(er,)p eop end %%Page: 34 40 TeXDict begin 34 39 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(34)150 299 y(unexp)s(ected)32 b(results)g(migh)m(t)g(o)s(ccur)g(if)h(t)m(w)m(o)g(writers)f(try)g(to)h (up)s(date)e(information)i(ab)s(out)f(a)g(principal)150 408 y(sim)m(ultaneous.)275 538 y(If)25 b(y)m(ou)h(use)f(a)i(remote)f (LD)m(AP)h(serv)m(er)f(or)f(SQL)g(database)i(to)f(store)h(the)f(user)f (database,)i(and)f(access)150 648 y(it)34 b(via)g(a)g(Shisa)f(bac)m(k)m (end,)i(y)m(ou)f(ha)m(v)m(e)g(mak)m(e)h(sure)d(y)m(our)i(Shisa)f(bac)m (k)m(end)h(handle)f(concurren)m(t)g(writers)150 757 y(prop)s(erly)-8 b(.)67 b(If)39 b(y)m(ou)h(use)f(a)h(mo)s(dern)e(SQL)h(database,)k(this) c(probably)g(is)g(not)h(a)g(concern.)68 b(If)39 b(it)h(is)g(a)150 867 y(problem,)27 b(y)m(ou)g(ma)m(y)h(b)s(e)e(able)i(to)f(w)m(ork)g (around)f(it)h(b)m(y)g(implemen)m(ting)h(some)f(kind)f(of)h(sync)m (hronization)150 976 y(or)j(semaphore)g(mec)m(hanism.)41 b(If)30 b(all)h(else)g(sounds)e(to)s(o)i(complicated,)h(y)m(ou)e(can)h (set)f(up)f(the)i(secondary)150 1086 y(serv)m(ers)k(as)f(`)p Fq(--read-only)p Fw(')e(serv)m(ers,)k(although)f(y)m(ou)f(will)h(lose)g (some)g(functionalit)m(y)h(\(lik)m(e)g(c)m(hanging)150 1196 y(passw)m(ords)f(via)i(the)f(secondary)g(serv)m(er,)i(or)e(up)s (dating)f(timestamps)h(when)f(the)h(last)h(tic)m(k)m(et)i(request)150 1305 y(o)s(ccurred\).)275 1435 y(One)i(function)h(that)g(is)g(of)g (particular)g(use)g(for)g(users)f(with)h(remote)g(databases)h(\(b)s(e)f (it)g(LD)m(AP)150 1544 y(or)36 b(SQL\))f(is)h(the)g(\\database)i(o)m(v) m(erride")f(feature.)58 b(Using)36 b(this)g(y)m(ou)h(can)f(ha)m(v)m(e)h (the)f(securit)m(y)h(critical)150 1654 y(principals)25 b(\(suc)m(h)h(as)f(the)h(tic)m(k)m(et)i(gran)m(ting)f(tic)m(k)m(et\))h (stored)e(on)f(lo)s(cal)i(\014le)f(system)f(storage,)k(but)c(use)g(the) 150 1763 y(remote)31 b(database)g(for)f(user)f(principals.)40 b(Of)30 b(course,)g(y)m(ou)h(m)m(ust)f(k)m(eep)g(the)h(lo)s(cal)g (\014le)f(system)g(storage)150 1873 y(sync)m(hronized)g(b)s(et)m(w)m (een)h(all)g(serv)m(ers,)g(as)g(b)s(efore.)40 b(Here)31 b(is)f(an)h(example)g(con\014guration.)390 2002 y Fq(db)47 b(--read-only)e(file)i(/var/local/master)390 2112 y(db)g(ldap)g (kdc.example.org)c(ca=/etc/shisa/kdc-ca.pem)275 2242 y Fw(This)52 b(instruct)i(the)g(Shisa)f(library)g(to)i(access)g(the)f (t)m(w)m(o)h(databases)f(sequen)m(tially)-8 b(,)62 b(for)54 b(eac)m(h)150 2351 y(query)d(using)g(the)g(\014rst)g(database)h(that)g (kno)m(w)f(ab)s(out)g(the)h(requested)f(principal.)103 b(If)51 b(y)m(ou)h(put)150 2461 y(the)43 b(`)p Fq(krbtgt/REALM)p Fw(')d(principal)i(in)h(the)g(lo)s(cal)h(`)p Fq(file)p Fw(')e(database,)47 b(this)42 b(will)h(o)m(v)m(erride)h(the)f(LD)m(AP) 150 2570 y(in)m(terface.)f(Naturally)-8 b(,)32 b(y)m(ou)f(can)g(ha)m(v) m(e)g(as)g(man)m(y)f(`)p Fq(db)p Fw(')h(de\014nition)f(lines)g(as)h(y)m (ou)g(wish.)275 2700 y(Users)40 b(with)f(remote)i(databases)g(can)g (also)g(in)m(v)m(estigate)i(a)e(so)f(called)h Fm(High)h(A)n (vailability)48 b Fw(mo)s(de.)150 2809 y(This)27 b(is)h(useful)f(if)h (y)m(ou)g(wish)g(to)g(ha)m(v)m(e)h(y)m(our)f(Kerb)s(eros)f(serv)m(ers)h (b)s(e)g(able)g(to)h(con)m(tin)m(ue)g(to)g(op)s(erate)f(ev)m(en)150 2919 y(when)e(the)i(remote)g(database)g(is)f(o\017ine.)40 b(This)26 b(is)i(ac)m(hiev)m(ed)h(via)e(the)h(`)p Fq(--ignore-errors)p Fw(')23 b(\015ag)28 b(in)f(the)150 3029 y(database)k(de\014nition.)41 b(Here)31 b(is)f(a)h(sample)f(con\014guration.)390 3158 y Fq(db)47 b(--ignore-errors)d(ldap)i(kdc.example.org)e (ca=/etc/shisa/kdc-ca.pem)390 3268 y(db)j(--read-only)e(file)i (/var/cache/ldap-copy)275 3397 y Fw(This)38 b(instruct)h(the)g(Shisa)f (library)h(to)h(try)f(the)g(LD)m(AP)g(bac)m(k)m(end)h(\014rst,)h(but)d (if)h(it)h(fails,)i(instead)150 3507 y(of)j(returning)f(an)h(error,)j (con)m(tin)m(ue)f(to)e(try)g(the)g(op)s(eration)h(on)f(a)g(read)g(only) g(lo)s(cal)h(`)p Fq(file)p Fw(')e(based)150 3616 y(database.)66 b(Of)38 b(course,)k(write)c(requests)h(will)g(still)g(fail,)j(but)c(it) h(ma)m(y)g(b)s(e)f(b)s(etter)h(than)f(halting)i(the)150 3726 y(serv)m(er)31 b(completely)-8 b(.)44 b(T)-8 b(o)32 b(mak)m(e)g(this)e(w)m(ork,)i(y)m(ou)f(\014rst)f(need)h(to)g(set)h(up)d (a)j(cron)e(job)h(on)g(a,)g(sa)m(y)-8 b(,)33 b(hourly)150 3836 y(basis,)h(to)f(mak)m(e)h(a)f(cop)m(y)h(of)e(the)h(remote)h (database)g(and)e(store)h(it)h(in)e(the)h(lo)s(cal)h(\014le)f (database.)49 b(That)150 3945 y(w)m(a)m(y)-8 b(,)44 b(when)39 b(the)h(remote)h(serv)m(er)f(go)s(es)h(a)m(w)m(a)m(y)-8 b(,)45 b(fairly)40 b(curren)m(t)g(information)g(will)g(still)h(b)s(e)f (a)m(v)-5 b(ailable)150 4055 y(lo)s(cally)d(.)275 4184 y(If)30 b(y)m(ou)h(also)h(wish)e(to)i(exp)s(erimen)m(t)f(with)f (read-write)h(fail)h(o)m(v)m(er,)g(here)f(is)g(an)g(idea)g(for)g(the)g (con\014gu-)150 4294 y(ration.)390 4423 y Fq(db)47 b(--ignore-errors)d (ldap)i(kdc.example.org)e(ca=/etc/shisa/kdc-ca.pem)390 4533 y(db)j(--ignore-errors)d(--read-only)h(file)h (/var/cache/ldap-copy)390 4643 y(db)h(file)g(/var/cache/local-updates) 275 4772 y Fw(This)36 b(is)i(similar)f(to)h(the)g(previous,)h(but)e(it) h(will)f(ignore)h(errors)f(reading)h(and)e(writing)i(from)f(the)150 4882 y(\014rst)c(t)m(w)m(o)i(databases,)h(ultimately)f(causing)g(write) f(attempts)g(to)h(end)e(up)g(in)h(the)g(\014nal)f(`)p Fq(file)p Fw(')g(based)150 4991 y(database.)51 b(Of)32 b(course,)j(y)m(ou)f(w)m(ould)f(need)g(to)h(create)h(to)s(ols)f(to)h (feed)e(bac)m(k)h(an)m(y)g(lo)s(cal)g(up)s(dates)f(made)150 5101 y(while)c(the)g(remote)g(serv)m(er)g(w)m(as)g(do)m(wn.)40 b(It)29 b(ma)m(y)g(also)h(b)s(e)e(necessary)h(to)g(create)h(a)g(sp)s (ecial)f(bac)m(k)m(end)g(for)150 5210 y(this)h(purp)s(ose,)f(whic)m(h)h (can)h(auto)g(create)h(principals)e(that)h(are)g(used.)275 5340 y(W)-8 b(e)31 b(\014nish)e(with)h(an)g(example)h(that)g (demonstrate)g(all)h(the)e(ideas)h(presen)m(ted.)p eop end %%Page: 35 41 TeXDict begin 35 40 bop 150 -116 a Fw(Chapter)30 b(3:)41 b(Administration)30 b(Man)m(ual)2113 b(35)390 299 y Fq(db)47 b(--read-only)e(file)i(/var/local/master)390 408 y(db)g (--ignore-errors)d(ldap)i(kdc.example.org)e(ca=/etc/shisa/kdc-ca.pem) 390 518 y(db)j(--ignore-errors)d(--read-only)h(file)h (/var/cache/ldap-copy)390 628 y(db)h(file)g(/var/cache/local-updates) 150 860 y Fv(3.8)68 b(Dev)l(elop)t(er)46 b(information)150 1020 y Fw(The)34 b(Programming)g(API)g(for)g(Shisa)g(is)g(describ)s(ed) f(b)s(elo)m(w)i(\(see)g(Section)g(5.19)h([Kerb)s(eros)d(Database)150 1129 y(F)-8 b(unctions],)40 b(page)e(227\);)43 b(this)37 b(section)i(is)e(ab)s(out)g(extending)h(Shisa,)h(and)e(consequen)m(tly) h(Shishi,)g(to)150 1239 y(use)26 b(y)m(our)h(o)m(wn)f(user)g(database)h (system.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(w)m(an)m(t)g(to)g(store)g(y)m (our)f(Kerb)s(eros)g(user)g(information)150 1348 y(on)k(an)h(LD)m(AP)g (database)g(serv)m(er,)g(for)f(example.)275 1483 y(Adding)37 b(a)i(new)e(bac)m(k)m(end)i(is)f(straigh)m(t)h(forw)m(ard.)64 b(Y)-8 b(ou)39 b(need)e(to)i(implemen)m(t)g(the)f(bac)m(k)m(end)h(API) 150 1592 y(function)34 b(set,)h(add)f(the)g(list)g(of)g(API)g (functions)f(to)i(`)p Fq(db/db.c)p Fw(')e(and)g(p)s(ossibly)g(also)i (add)e(an)m(y)h(library)150 1702 y(dep)s(endencies)29 b(to)j(the)e(Mak)m(e\014le.)275 1836 y(The)41 b(simplest)h(w)m(a)m(y)g (to)h(write)f(a)g(new)f(bac)m(k)m(end)h(is)g(to)g(start)g(from)g(the)g (existing)g(`)p Fq(file)p Fw(')f(based)150 1946 y(database,)32 b(in)e(`)p Fq(db/file.c)p Fw(',)e(and)i(mo)s(dify)g(the)g(en)m(try)h(p) s(oin)m(ts)f(as)h(needed.)275 2081 y(Note)24 b(that)f(the)h(curren)m(t) e(bac)m(k)m(end)i(API)f(will)g(lik)m(ely)h(c)m(hange)g(b)s(efore)f(it)h (is)f(frozen.)38 b(W)-8 b(e)24 b(ma)m(y)g(describ)s(e)150 2190 y(it)29 b(in)g(detail)h(here)e(when)g(it)h(has)g(matured.)39 b(Ho)m(w)m(ev)m(er,)32 b(curren)m(tly)c(it)i(is)e(similar)h(to)h(the)f (external)g(Shisa)150 2300 y(API)h(\(see)i(Section)f(5.19)h([Kerb)s (eros)d(Database)j(F)-8 b(unctions],)32 b(page)f(227\).)275 2434 y(There)e(should)g(b)s(e)h(no)g(need)f(to)i(mo)s(dify)f(an)m (ything)g(else)h(in)f(the)g(Shisa)g(library)-8 b(,)30 b(and)f(certainly)j(not)150 2544 y(in)e(the)h(Shishi)e(library)h(or)g (the)h(`)p Fq(shishid)p Fw(')e(serv)m(er.)275 2678 y(Naturally)-8 b(,)30 b(w)m(e)g(w)m(ould)e(appreciate)j(if)e(y)m(ou)g(w)m(ould)f(send) h(us)f(y)m(our)h(new)f(bac)m(k)m(end,)i(if)f(y)m(ou)g(b)s(eliev)m(e)h (it)150 2788 y(is)g(generally)i(useful)e(\(see)h(Section)g(1.9)h([Bug)f (Rep)s(orts],)f(page)h(11\).)p eop end %%Page: 36 42 TeXDict begin 36 41 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(36)150 299 y Ft(4)80 b(Reference)53 b(Man)l(ual)150 507 y Fw(This)22 b(c)m(hapter)h(discuss) f(the)h(underlying)e(assumptions)h(of)h(Kerb)s(eros,)g(con)m(tain)h(a)f (glossary)h(to)f(Kerb)s(eros)150 616 y(concepts,)43 b(giv)m(e)f(y)m(ou) e(bac)m(kground)g(information)g(on)g(c)m(ho)s(osing)h(realm)f(and)f (principal)h(names,)j(and)150 726 y(describ)s(e)30 b(all)h(parameters)g (and)f(con\014guration)g(\014le)h(syn)m(taxes)g(for)f(the)h(Shishi)e (to)s(ols.)150 948 y Fv(4.1)68 b(En)l(vironmen)l(tal)47 b(Assumptions)150 1107 y Fw(Kerb)s(eros)27 b(imp)s(oses)h(a)g(few)g (assumptions)f(on)h(the)g(en)m(vironmen)m(t)h(in)f(whic)m(h)f(it)i(can) f(prop)s(erly)f(function:)225 1236 y Fu(\017)60 b Fq(")p Fw(Denial)44 b(of)g(service)p Fq(")f Fw(attac)m(ks)j(are)e(not)f(solv)m (ed)h(with)f(Kerb)s(eros.)78 b(There)43 b(are)h(places)g(in)f(the)330 1346 y(proto)s(cols)24 b(where)g(an)f(in)m(truder)g(can)h(prev)m(en)m (t)g(an)g(application)h(from)e(participating)i(in)f(the)f(prop)s(er)330 1455 y(authen)m(tication)k(steps.)38 b(Detection)27 b(and)d(solution)h (of)g(suc)m(h)f(attac)m(ks)j(\(some)e(of)g(whic)m(h)f(can)h(app)s(ear) 330 1565 y(to)k(b)s(e)e(not-uncommon)h Fq(")p Fw(normal)p Fq(")g Fw(failure)g(mo)s(des)f(for)h(the)g(system\))h(is)f(usually)g(b) s(est)f(left)i(to)g(the)330 1675 y(h)m(uman)h(administrators)g(and)g (users.)225 1804 y Fu(\017)60 b Fw(Principals)29 b(MUST)f(k)m(eep)i (their)f(secret)h(k)m(eys)f(secret.)41 b(If)29 b(an)g(in)m(truder)f (someho)m(w)h(steals)h(a)f(princi-)330 1913 y(pal's)i(k)m(ey)-8 b(,)33 b(it)e(will)h(b)s(e)e(able)i(to)f(masquerade)g(as)g(that)h (principal)f(or)g(imp)s(ersonate)g(an)m(y)g(serv)m(er)g(to)330 2023 y(the)g(legitimate)i(principal.)225 2152 y Fu(\017)60 b Fq(")p Fw(P)m(assw)m(ord)42 b(guessing)p Fq(")g Fw(attac)m(ks)i(are)e (not)g(solv)m(ed)h(b)m(y)f(Kerb)s(eros.)74 b(If)41 b(a)i(user)e(c)m(ho) s(oses)i(a)f(p)s(o)s(or)330 2262 y(passw)m(ord,)49 b(it)c(is)h(p)s (ossible)f(for)g(an)g(attac)m(k)m(er)j(to)e(successfully)f(moun)m(t)g (an)h(o\017ine)f(dictionary)330 2371 y(attac)m(k)33 b(b)m(y)e(rep)s (eatedly)g(attempting)h(to)g(decrypt,)f(with)f(successiv)m(e)i(en)m (tries)g(from)e(a)i(dictionary)-8 b(,)330 2481 y(messages)31 b(obtained)g(whic)m(h)f(are)g(encrypted)g(under)f(a)h(k)m(ey)h(deriv)m (ed)g(from)e(the)i(user's)e(passw)m(ord.)225 2610 y Fu(\017)60 b Fw(Eac)m(h)33 b(host)g(on)f(the)h(net)m(w)m(ork)g(MUST)g(ha)m(v)m(e)g (a)g(clo)s(c)m(k)h(whic)m(h)e(is)h Fq(")p Fw(lo)s(osely)g(sync)m (hronized)p Fq(")f Fw(to)i(the)330 2720 y(time)f(of)g(the)g(other)g (hosts;)h(this)f(sync)m(hronization)h(is)e(used)g(to)i(reduce)e(the)h (b)s(o)s(okk)m(eeping)g(needs)330 2829 y(of)k(application)g(serv)m(ers) g(when)e(they)i(do)f(repla)m(y)h(detection.)60 b(The)36 b(degree)h(of)f Fq(")p Fw(lo)s(oseness)p Fq(")h Fw(can)330 2939 y(b)s(e)c(con\014gured)g(on)g(a)i(p)s(er-serv)m(er)e(basis,)h(but) f(is)h(t)m(ypically)i(on)d(the)h(order)f(of)h(5)g(min)m(utes.)51 b(If)33 b(the)330 3048 y(clo)s(c)m(ks)39 b(are)f(sync)m(hronized)g(o)m (v)m(er)h(the)f(net)m(w)m(ork,)j(the)d(clo)s(c)m(k)h(sync)m (hronization)g(proto)s(col)f(MUST)330 3158 y(itself)31 b(b)s(e)f(secured)g(from)g(net)m(w)m(ork)h(attac)m(k)m(ers.)225 3287 y Fu(\017)60 b Fw(Principal)34 b(iden)m(ti\014ers)g(are)g(not)g (recycled)h(on)f(a)g(short-term)g(basis.)52 b(A)34 b(t)m(ypical)h(mo)s (de)f(of)g(access)330 3397 y(con)m(trol)25 b(will)f(use)f(access)i(con) m(trol)f(lists)g(\(A)m(CLs\))h(to)f(gran)m(t)g(p)s(ermissions)e(to)i (particular)g(principals.)330 3506 y(If)e(a)g(stale)h(A)m(CL)f(en)m (try)h(remains)e(for)h(a)g(deleted)h(principal)f(and)f(the)i(principal) e(iden)m(ti\014er)h(is)g(reused,)330 3616 y(the)33 b(new)f(principal)g (will)g(inherit)h(righ)m(ts)g(sp)s(eci\014ed)e(in)h(the)h(stale)h(A)m (CL)e(en)m(try)-8 b(.)48 b(By)32 b(not)h(re-using)330 3726 y(principal)d(iden)m(ti\014ers,)h(the)f(danger)h(of)f(inadv)m (erten)m(t)i(access)f(is)g(remo)m(v)m(ed.)150 3947 y Fv(4.2)68 b(Glossary)46 b(of)f(terms)150 4126 y Fw(Authen)m(tication) 630 4236 y(V)-8 b(erifying)31 b(the)g(claimed)g(iden)m(tit)m(y)h(of)e (a)h(principal.)150 4385 y(Authen)m(tication)h(header)630 4494 y(A)e(record)g(con)m(taining)h(a)g(Tic)m(k)m(et)g(and)f(an)f (Authen)m(ticator)j(to)f(b)s(e)e(presen)m(ted)h(to)g(a)h(serv)m(er)630 4604 y(as)g(part)f(of)g(the)h(authen)m(tication)h(pro)s(cess.)150 4753 y(Authen)m(tication)g(path)630 4862 y(A)25 b(sequence)h(of)g(in)m (termediate)h(realms)e(transited)h(in)f(the)h(authen)m(tication)h(pro)s (cess)e(when)630 4972 y(comm)m(unicating)32 b(from)e(one)g(realm)h(to)g (another.)150 5121 y(Authen)m(ticator)630 5230 y(A)f(record)h(con)m (taining)h(information)e(that)h(can)g(b)s(e)f(sho)m(wn)f(to)i(ha)m(v)m (e)h(b)s(een)e(recen)m(tly)h(gen-)630 5340 y(erated)g(using)f(the)g (session)h(k)m(ey)g(kno)m(wn)f(only)g(b)m(y)h(the)f(clien)m(t)i(and)e (serv)m(er.)p eop end %%Page: 37 43 TeXDict begin 37 42 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(37)150 299 y(Authorization)630 408 y(The)34 b(pro)s(cess)f(of)i(determining)f(whether)f(a)i(clien)m(t) g(ma)m(y)g(use)f(a)g(service,)i(whic)m(h)e(ob)5 b(jects)630 518 y(the)31 b(clien)m(t)h(is)e(allo)m(w)m(ed)i(to)f(access,)h(and)e (the)h(t)m(yp)s(e)f(of)h(access)g(allo)m(w)m(ed)i(for)d(eac)m(h.)150 667 y(Capabilit)m(y)67 b(A)37 b(tok)m(en)i(that)e(gran)m(ts)h(the)g(b)s (earer)e(p)s(ermission)h(to)h(access)g(an)f(ob)5 b(ject)38 b(or)g(service.)62 b(In)630 777 y(Kerb)s(eros,)32 b(this)g(migh)m(t)h (b)s(e)f(a)g(tic)m(k)m(et)j(whose)d(use)g(is)h(restricted)g(b)m(y)f (the)g(con)m(ten)m(ts)i(of)f(the)630 887 y(authorization)40 b(data)e(\014eld,)i(but)e(whic)m(h)f(lists)i(no)f(net)m(w)m(ork)h (addresses,)h(together)f(with)630 996 y(the)31 b(session)f(k)m(ey)h (necessary)g(to)g(use)f(the)h(tic)m(k)m(et.)150 1146 y(Ciphertext)630 1255 y(The)39 b(output)f(of)i(an)f(encryption)g (function.)67 b(Encryption)38 b(transforms)g(plain)m(text)j(in)m(to)630 1365 y(ciphertext.)150 1514 y(Clien)m(t)241 b(A)34 b(pro)s(cess)g(that) g(mak)m(es)h(use)f(of)g(a)h(net)m(w)m(ork)g(service)g(on)f(b)s(ehalf)f (of)h(a)h(user.)51 b(Note)35 b(that)630 1624 y(in)d(some)g(cases)h(a)f (Serv)m(er)g(ma)m(y)g(itself)h(b)s(e)e(a)h(clien)m(t)i(of)e(some)g (other)g(serv)m(er)g(\(e.g.)47 b(a)32 b(prin)m(t)630 1733 y(serv)m(er)f(ma)m(y)g(b)s(e)e(a)i(clien)m(t)h(of)f(a)f(\014le)h (serv)m(er\).)150 1883 y(Creden)m(tials)630 1993 y(A)h(tic)m(k)m(et)j (plus)c(the)h(secret)h(session)f(k)m(ey)g(necessary)h(to)g (successfully)e(use)h(that)h(tic)m(k)m(et)h(in)630 2102 y(an)c(authen)m(tication)j(exc)m(hange.)150 2252 y(Encryption)d(T)m(yp) s(e)g(\(et)m(yp)s(e\))630 2361 y(When)35 b(asso)s(ciated)h(with)f (encrypted)f(data,)k(an)c(encryption)h(t)m(yp)s(e)g(iden)m(ti\014es)h (the)f(algo-)630 2471 y(rithm)29 b(used)f(to)j(encrypt)e(the)g(data)i (and)d(is)i(used)f(to)h(select)h(the)e(appropriate)h(algorithm)630 2580 y(for)e(decrypting)g(the)g(data.)41 b(Encryption)28 b(t)m(yp)s(e)g(tags)h(are)g(comm)m(unicated)g(in)f(other)h(mes-)630 2690 y(sages)24 b(to)g(en)m(umerate)g(algorithms)f(that)h(are)f (desired,)i(supp)s(orted,)e(preferred,)g(or)g(allo)m(w)m(ed)630 2800 y(to)30 b(b)s(e)e(used)g(for)h(encryption)f(of)h(data)h(b)s(et)m (w)m(een)f(parties.)41 b(This)28 b(preference)h(is)g(com)m(bined)630 2909 y(with)h(lo)s(cal)i(information)e(and)g(p)s(olicy)h(to)g(select)h (an)e(algorithm)i(to)f(b)s(e)e(used.)150 3059 y(KDC)274 b(Key)26 b(Distribution)g(Cen)m(ter,)i(a)f(net)m(w)m(ork)f(service)h (that)g(supplies)e(tic)m(k)m(ets)k(and)c(temp)s(orary)630 3168 y(session)34 b(k)m(eys;)k(or)c(an)g(instance)h(of)g(that)g (service)g(or)f(the)h(host)f(on)g(whic)m(h)h(it)f(runs.)51 b(The)630 3278 y(KDC)28 b(services)h(b)s(oth)e(initial)j(tic)m(k)m(et)h (and)c(tic)m(k)m(et-gran)m(ting)32 b(tic)m(k)m(et)f(requests.)40 b(The)28 b(initial)630 3387 y(tic)m(k)m(et)e(p)s(ortion)d(is)h (sometimes)g(referred)f(to)h(as)f(the)h(Authen)m(tication)h(Serv)m(er)f (\(or)f(service\).)630 3497 y(The)f(tic)m(k)m(et-gran)m(ting)27 b(tic)m(k)m(et)e(p)s(ortion)d(is)h(sometimes)g(referred)f(to)h(as)g (the)g(tic)m(k)m(et-gran)m(ting)630 3606 y(serv)m(er)31 b(\(or)f(service\).)150 3756 y(Kerb)s(eros)122 b(The)37 b(name)h(giv)m(en)h(to)g(the)f(Pro)5 b(ject)38 b(A)m(thena's)h(authen)m (tication)h(service,)h(the)d(proto)s(col)630 3866 y(used)27 b(b)m(y)h(that)h(service,)h(or)e(the)g(co)s(de)g(used)g(to)h(implemen)m (t)f(the)h(authen)m(tication)h(service.)630 3975 y(The)g(name)g(is)h (adopted)f(from)g(the)h(three-headed)f(dog)h(whic)m(h)f(guards)g (Hades.)150 4125 y(Key)g(V)-8 b(ersion)31 b(Num)m(b)s(er)f(\(kvno\))630 4234 y(A)e(tag)i(asso)s(ciated)f(with)f(encrypted)g(data)g(iden)m (ti\014es)h(whic)m(h)f(k)m(ey)h(w)m(as)f(used)f(for)h(encryp-)630 4344 y(tion)k(when)e(a)i(long)f(liv)m(ed)h(k)m(ey)h(asso)s(ciated)f (with)f(a)h(principal)f(c)m(hanges)h(o)m(v)m(er)g(time.)45 b(It)31 b(is)630 4453 y(used)c(during)f(the)i(transition)g(to)g(a)g (new)f(k)m(ey)h(so)g(that)g(the)g(part)m(y)g(decrypting)f(a)h(message) 630 4563 y(can)j(tell)g(whether)f(the)h(data)g(w)m(as)f(encrypted)g (using)g(the)h(old)f(or)h(the)f(new)g(k)m(ey)-8 b(.)150 4712 y(Plain)m(text)117 b(The)38 b(input)f(to)j(an)e(encryption)g (function)g(or)h(the)f(output)g(of)h(a)g(decryption)f(function.)630 4822 y(Decryption)31 b(transforms)f(ciphertext)h(in)m(to)g(plain)m (text.)150 4971 y(Principal)120 b(A)30 b(named)g(clien)m(t)i(or)e(serv) m(er)h(en)m(tit)m(y)h(that)f(participates)g(in)f(a)h(net)m(w)m(ork)g (comm)m(unication,)630 5081 y(with)f(one)h(name)f(that)h(is)g (considered)f(canonical.)150 5230 y(Principal)g(iden)m(ti\014er)630 5340 y(The)g(canonical)i(name)e(used)g(to)h(uniquely)f(iden)m(tify)g (eac)m(h)i(di\013eren)m(t)f(principal.)p eop end %%Page: 38 44 TeXDict begin 38 43 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(38)150 299 y(Seal)319 b(T)-8 b(o)44 b(encipher)e(a)i(record)f(con)m(taining)i(sev)m(eral)g (\014elds)d(in)h(suc)m(h)g(a)h(w)m(a)m(y)g(that)g(the)f(\014elds)630 408 y(cannot)27 b(b)s(e)e(individually)h(replaced)h(without)f(either)g (kno)m(wledge)i(of)e(the)g(encryption)g(k)m(ey)630 518 y(or)k(lea)m(ving)i(evidence)g(of)e(tamp)s(ering.)150 686 y(Secret)43 b(k)m(ey)74 b(An)42 b(encryption)g(k)m(ey)h(shared)e(b) m(y)h(a)h(principal)e(and)h(the)g(KDC,)g(distributed)g(outside)630 795 y(the)34 b(b)s(ounds)d(of)j(the)f(system,)i(with)e(a)h(long)g (lifetime.)51 b(In)33 b(the)h(case)g(of)g(a)g(h)m(uman)f(user's)630 905 y(principal,)d(the)h(secret)g(k)m(ey)g(MA)-8 b(Y)32 b(b)s(e)d(deriv)m(ed)i(from)f(a)h(passw)m(ord.)150 1072 y(Serv)m(er)232 b(A)27 b(particular)h(Principal)f(whic)m(h)g(pro)m (vides)h(a)f(resource)h(to)g(net)m(w)m(ork)g(clien)m(ts.)41 b(The)27 b(serv)m(er)630 1182 y(is)j(sometimes)i(referred)d(to)j(as)e (the)h(Application)g(Serv)m(er.)150 1350 y(Service)200 b(A)27 b(resource)g(pro)m(vided)g(to)g(net)m(w)m(ork)h(clien)m(ts;)i (often)d(pro)m(vided)g(b)m(y)g(more)g(than)f(one)i(serv)m(er)630 1459 y(\(for)i(example,)i(remote)f(\014le)g(service\).)150 1627 y(Session)f(k)m(ey)630 1736 y(A)22 b(temp)s(orary)f(encryption)g (k)m(ey)h(used)f(b)s(et)m(w)m(een)h(t)m(w)m(o)g(principals,)h(with)f(a) f(lifetime)i(limited)630 1846 y(to)36 b(the)f(duration)f(of)h(a)h (single)f(login)h Fq(")p Fw(session)p Fq(")p Fw(.)54 b(In)34 b(the)h(Kerb)s(eros)f(system,)j(a)e(session)630 1955 y(k)m(ey)e(is)g(generated)g(b)m(y)g(the)f(KDC.)h(The)f(session)g (k)m(ey)i(is)e(distinct)h(from)f(the)h(sub-session)630 2065 y(k)m(ey)-8 b(,)32 b(describ)s(ed)d(next..)150 2233 y(Sub-session)g(k)m(ey)630 2342 y(A)46 b(temp)s(orary)f(encryption)g(k) m(ey)h(used)f(b)s(et)m(w)m(een)h(t)m(w)m(o)h(principals,)i(selected)e (and)e(ex-)630 2452 y(c)m(hanged)d(b)m(y)f(the)g(principals)g(using)g (the)g(session)g(k)m(ey)-8 b(,)46 b(and)40 b(with)h(a)h(lifetime)g (limited)630 2561 y(to)32 b(the)f(duration)g(of)h(a)f(single)h(asso)s (ciation.)45 b(The)31 b(sub-)f(session)h(k)m(ey)h(is)g(also)g(referred) e(to)630 2671 y(as)h(the)f(subk)m(ey)-8 b(.)150 2838 y(Tic)m(k)m(et)232 b(A)23 b(record)f(that)i(helps)e(a)h(clien)m(t)h (authen)m(ticate)h(itself)e(to)h(a)f(serv)m(er;)i(it)f(con)m(tains)f (the)g(clien)m(t's)630 2948 y(iden)m(tit)m(y)-8 b(,)30 b(a)e(session)g(k)m(ey)-8 b(,)29 b(a)f(timestamp,)h(and)e(other)h (information,)g(all)g(sealed)h(using)e(the)630 3058 y(serv)m(er's)h (secret)h(k)m(ey)-8 b(.)41 b(It)28 b(only)g(serv)m(es)h(to)f(authen)m (ticate)i(a)f(clien)m(t)g(when)e(presen)m(ted)h(along)630 3167 y(with)i(a)h(fresh)e(Authen)m(ticator.)150 3412 y Fv(4.3)68 b(Realm)46 b(and)f(Principal)g(Naming)150 3571 y Fw(This)37 b(section)i(con)m(tains)h(the)e(discussion)f(on)h (naming)g(realms)g(and)g(principals)f(from)h(the)g(Kerb)s(eros)150 3681 y(sp)s(eci\014cation.)150 3888 y Fl(4.3.1)63 b(Realm)40 b(Names)150 4035 y Fw(Although)27 b(realm)h(names)f(are)g(enco)s(ded)g (as)g(GeneralStrings)h(and)e(although)h(a)h(realm)f(can)h(tec)m (hnically)150 4145 y(select)k(an)m(y)e(name)g(it)h(c)m(ho)s(oses,)g(in) m(terop)s(erabilit)m(y)g(across)g(realm)f(b)s(oundaries)f(requires)g (agreemen)m(t)j(on)150 4254 y(ho)m(w)e(realm)h(names)f(are)h(to)g(b)s (e)f(assigned,)h(and)f(what)g(information)h(they)f(imply)-8 b(.)275 4397 y(T)g(o)32 b(enforce)h(these)g(con)m(v)m(en)m(tions,)i (eac)m(h)f(realm)f(MUST)f(conform)g(to)h(the)g(con)m(v)m(en)m(tions)i (itself,)f(and)150 4507 y(it)h(MUST)f(require)g(that)i(an)m(y)e(realms) h(with)f(whic)m(h)h(in)m(ter-realm)g(k)m(eys)h(are)f(shared)e(also)j (conform)e(to)150 4616 y(the)d(con)m(v)m(en)m(tions)h(and)e(require)g (the)g(same)h(from)f(its)h(neigh)m(b)s(ors.)275 4759 y(Kerb)s(eros)k(realm)h(names)g(are)g(case)h(sensitiv)m(e.)59 b(Realm)37 b(names)f(that)h(di\013er)f(only)g(in)f(the)i(case)g(of)150 4869 y(the)27 b(c)m(haracters)h(are)f(not)g(equiv)-5 b(alen)m(t.)41 b(There)26 b(are)h(presen)m(tly)g(three)g(st)m(yles)h (of)f(realm)g(names:)39 b(domain,)150 4978 y(X500,)32 b(and)e(other.)41 b(Examples)30 b(of)h(eac)m(h)g(st)m(yle)h(follo)m(w:) 629 5121 y Fq(domain:)141 b(ATHENA.MIT.EDU)724 5230 y(X500:)h (C=US/O=OSF)676 5340 y(other:)g(NAMETYPE:rest/of.name=wi)o(thou)o(t-r)o (estr)o(icti)o(ons)p eop end %%Page: 39 45 TeXDict begin 39 44 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(39)275 299 y(Domain)34 b(syle)h(realm)f(names)g(MUST)f(lo)s(ok)i(lik)m(e)g(domain)f(names:)48 b(they)34 b(consist)h(of)f(comp)s(onen)m(ts)150 408 y(separated)24 b(b)m(y)f(p)s(erio)s(ds)f(\(.\))39 b(and)23 b(they)g(con)m(tain)i (neither)e(colons)h(\(:\))38 b(nor)23 b(slashes)g(\(/\).)40 b(Though)22 b(domain)150 518 y(names)34 b(themselv)m(es)h(are)g(case)g (insensitiv)m(e,)h(in)e(order)g(for)f(realms)i(to)g(matc)m(h,)h(the)e (case)h(m)m(ust)f(matc)m(h)150 628 y(as)42 b(w)m(ell.)74 b(When)41 b(establishing)h(a)g(new)e(realm)i(name)f(based)g(on)g(an)h (in)m(ternet)g(domain)f(name)g(it)h(is)150 737 y(recommended)30 b(b)m(y)g(con)m(v)m(en)m(tion)j(that)e(the)f(c)m(haracters)i(b)s(e)e (con)m(v)m(erted)i(to)f(upp)s(er)d(case.)275 879 y(X.500)i(names)e(con) m(tain)i(an)e(equal)h(\(=\))f(and)g(cannot)h(con)m(tain)h(a)f(colon)g (\(:\))40 b(b)s(efore)28 b(the)h(equal.)40 b(The)150 989 y(realm)30 b(names)g(for)f(X.500)j(names)d(will)h(b)s(e)g(string)f (represen)m(tations)i(of)f(the)g(names)f(with)h(comp)s(onen)m(ts)150 1098 y(separated)e(b)m(y)g(slashes.)40 b(Leading)28 b(and)f(trailing)i (slashes)f(will)g(not)g(b)s(e)f(included.)40 b(Note)29 b(that)f(the)g(slash)150 1208 y(separator)c(is)g(consisten)m(t)i(with)d (Kerb)s(eros)g(implemen)m(tations)i(based)f(on)g(RF)m(C1510,)j(but)c (it)i(is)e(di\013eren)m(t)150 1318 y(from)30 b(the)g(separator)h (recommended)f(in)h(RF)m(C2253.)275 1460 y(Names)25 b(that)g(fall)g(in) m(to)h(the)e(other)h(category)i(MUST)d(b)s(egin)g(with)h(a)f(pre\014x)g (that)h(con)m(tains)h(no)e(equal)150 1569 y(\(=\))k(or)g(p)s(erio)s(d)e (\(.\))41 b(and)27 b(the)h(pre\014x)e(MUST)h(b)s(e)g(follo)m(w)m(ed)j (b)m(y)d(a)h(colon)h(\(:\))40 b(and)27 b(the)h(rest)g(of)g(the)g(name.) 150 1679 y(All)j(pre\014xes)f(m)m(ust)g(b)s(e)g(assigned)g(b)s(efore)g (they)h(ma)m(y)g(b)s(e)e(used.)40 b(Presen)m(tly)31 b(none)f(are)h (assigned.)275 1821 y(The)i(reserv)m(ed)h(category)i(includes)e (strings)f(whic)m(h)h(do)g(not)g(fall)h(in)m(to)g(the)f(\014rst)f (three)h(categories.)150 1930 y(All)g(names)g(in)g(this)f(category)j (are)e(reserv)m(ed.)52 b(It)34 b(is)g(unlik)m(ely)g(that)g(names)g (will)g(b)s(e)f(assigned)h(to)h(this)150 2040 y(category)d(unless)e (there)h(is)f(a)h(v)m(ery)g(strong)f(argumen)m(t)h(for)f(not)h(using)f (the)g('other')h(category)-8 b(.)275 2182 y(These)35 b(rules)g(guaran)m(tee)i(that)f(there)g(will)g(b)s(e)f(no)g (con\015icts)h(b)s(et)m(w)m(een)h(the)e(v)-5 b(arious)36 b(name)g(st)m(yles.)150 2291 y(The)27 b(follo)m(wing)i(additional)f (constrain)m(ts)g(apply)f(to)h(the)g(assignmen)m(t)g(of)g(realm)f (names)h(in)f(the)g(domain)150 2401 y(and)h(X.500)j(categories:)43 b(the)29 b(name)g(of)g(a)g(realm)h(for)e(the)i(domain)e(or)h(X.500)i (formats)e(m)m(ust)g(either)h(b)s(e)150 2511 y(used)35 b(b)m(y)i(the)f(organization)i(o)m(wning)f(\(to)g(whom)f(it)g(w)m(as)h (assigned\))g(an)f(In)m(ternet)h(domain)f(name)g(or)150 2620 y(X.500)26 b(name,)g(or)e(in)g(the)h(case)g(that)g(no)f(suc)m(h)g (names)g(are)h(registered,)h(authorit)m(y)g(to)f(use)f(a)g(realm)h (name)150 2730 y(MA)-8 b(Y)27 b(b)s(e)f(deriv)m(ed)h(from)f(the)g (authorit)m(y)h(of)g(the)g(paren)m(t)f(realm.)40 b(F)-8 b(or)27 b(example,)h(if)f(there)f(is)h(no)f(domain)150 2839 y(name)31 b(for)f(E40.MIT.EDU,)i(then)e(the)h(administrator)g(of)f (the)h(MIT.EDU)g(realm)g(can)f(authorize)i(the)150 2949 y(creation)g(of)e(a)h(realm)g(with)f(that)h(name.)275 3091 y(This)22 b(is)h(acceptable)i(b)s(ecause)e(the)g(organization)j (to)d(whic)m(h)g(the)g(paren)m(t)h(is)f(assigned)g(is)g(presumably)150 3200 y(the)30 b(organization)i(authorized)f(to)g(assign)f(names)g(to)h (its)g(c)m(hildren)f(in)f(the)i(X.500)g(and)f(domain)g(name)150 3310 y(systems)25 b(as)f(w)m(ell.)40 b(If)24 b(the)h(paren)m(t)f (assigns)h(a)g(realm)g(name)g(without)f(also)i(registering)f(it)g(in)f (the)h(domain)150 3420 y(name)34 b(or)g(X.500)h(hierarc)m(h)m(y)-8 b(,)36 b(it)f(is)e(the)i(paren)m(t's)f(resp)s(onsibilit)m(y)f(to)i(mak) m(e)g(sure)e(that)h(there)h(will)f(not)150 3529 y(in)e(the)g(future)g (exist)h(a)f(name)h(iden)m(tical)h(to)f(the)f(realm)h(name)f(of)g(the)h (c)m(hild)f(unless)g(it)g(is)h(assigned)f(to)150 3639 y(the)f(same)f(en)m(tit)m(y)i(as)f(the)g(realm)f(name.)150 3846 y Fl(4.3.2)63 b(Principal)40 b(Names)150 3993 y Fw(As)32 b(w)m(as)g(the)g(case)h(for)e(realm)h(names,)h(con)m(v)m(en)m (tions)g(are)f(needed)g(to)g(ensure)f(that)i(all)f(agree)h(on)f(what) 150 4102 y(information)24 b(is)g(implied)g(b)m(y)g(a)g(principal)g (name.)39 b(The)23 b(name-t)m(yp)s(e)i(\014eld)e(that)i(is)f(part)g(of) g(the)g(principal)150 4212 y(name)30 b(indicates)h(the)f(kind)f(of)i (information)f(implied)g(b)m(y)g(the)g(name.)41 b(The)29 b(name-t)m(yp)s(e)i(SHOULD)f(b)s(e)150 4321 y(treated)39 b(only)f(as)g(a)g(hin)m(t)g(to)g(in)m(terpreting)g(the)g(meaning)g(of)g (a)h(name.)63 b(It)37 b(is)h(not)g(signi\014can)m(t)h(when)150 4431 y(c)m(hec)m(king)h(for)e(equiv)-5 b(alence.)67 b(Principal)38 b(names)g(that)h(di\013er)g(only)f(in)g(the)h(name-t)m(yp)s(e)g(iden)m (tify)g(the)150 4540 y(same)26 b(principal.)39 b(The)25 b(name)h(t)m(yp)s(e)g(do)s(es)f(not)h(partition)h(the)f(name)f(space.) 40 b(Ignoring)26 b(the)g(name)g(t)m(yp)s(e,)150 4650 y(no)34 b(t)m(w)m(o)h(names)f(can)g(b)s(e)f(the)h(same)g(\(i.e.)52 b(at)35 b(least)g(one)f(of)g(the)g(comp)s(onen)m(ts,)h(or)f(the)g (realm,)h(MUST)150 4760 y(b)s(e)30 b(di\013eren)m(t\).)41 b(The)30 b(follo)m(wing)i(name)e(t)m(yp)s(es)h(are)g(de\014ned:)390 4902 y Fq(name-type)284 b(value)142 b(meaning)390 5121 y(NT-UNKNOWN)379 b(0)95 b(Name)47 b(type)g(not)f(known)390 5230 y(NT-PRINCIPAL)283 b(1)95 b(Just)47 b(the)g(name)f(of)i(the)f (principal)e(as)i(in)g(DCE,)g(or)g(for)g(users)390 5340 y(NT-SRV-INST)331 b(2)95 b(Service)46 b(and)h(other)f(unique)g (instance)g(\(krbtgt\))p eop end %%Page: 40 46 TeXDict begin 40 45 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(40)390 299 y Fq(NT-SRV-HST)379 b(3)95 b(Service)46 b(with)h(host)f(name)h(as)g(instance)f(\(telnet,)f (rcommands\))390 408 y(NT-SRV-XHST)331 b(4)95 b(Service)46 b(with)h(host)f(as)i(remaining)d(components)390 518 y(NT-UID)571 b(5)95 b(Unique)46 b(ID)390 628 y(NT-X500-PRINCIPAL)d(6)95 b(Encoded)46 b(X.509)g(Distingished)f(name)i([RFC)f(2253])390 737 y(NT-SMTP-NAME)283 b(7)95 b(Name)47 b(in)g(form)g(of)g(SMTP)g (email)f(name)h(\(e.g.)f(user@foo.com\))390 847 y(NT-ENTERPRISE)187 b(10)143 b(Enterprise)45 b(name)i(-)g(may)g(be)g(mapped)f(to)h (principal)f(name)275 985 y Fw(When)29 b(a)h(name)g(implies)g(no)f (information)h(other)g(than)f(its)i(uniqueness)d(at)i(a)g(particular)g (time)h(the)150 1094 y(name)38 b(t)m(yp)s(e)g(PRINCIP)-8 b(AL)38 b(SHOULD)f(b)s(e)h(used.)62 b(The)38 b(principal)g(name)g(t)m (yp)s(e)g(SHOULD)f(b)s(e)h(used)150 1204 y(for)c(users,)h(and)e(it)i (migh)m(t)g(also)g(b)s(e)f(used)f(for)h(a)h(unique)e(serv)m(er.)53 b(If)33 b(the)i(name)f(is)g(a)h(unique)e(mac)m(hine)150 1314 y(generated)24 b(ID)f(that)g(is)g(guaran)m(teed)h(nev)m(er)f(to)g (b)s(e)f(reassigned)h(then)g(the)f(name)h(t)m(yp)s(e)g(of)g(UID)g (SHOULD)150 1423 y(b)s(e)i(used)f(\(note)j(that)f(it)g(is)f(generally)i (a)f(bad)f(idea)h(to)g(reassign)f(names)h(of)f(an)m(y)h(t)m(yp)s(e)g (since)f(stale)i(en)m(tries)150 1533 y(migh)m(t)k(remain)f(in)g(access) i(con)m(trol)g(lists\).)275 1671 y(If)43 b(the)g(\014rst)g(comp)s(onen) m(t)h(of)g(a)g(name)g(iden)m(ti\014es)g(a)g(service)g(and)f(the)h (remaining)g(comp)s(onen)m(ts)150 1780 y(iden)m(tify)27 b(an)g(instance)h(of)f(the)g(service)h(in)f(a)g(serv)m(er)h(sp)s (eci\014ed)e(manner,)h(then)g(the)g(name)g(t)m(yp)s(e)g(of)g(SR)-10 b(V-)150 1890 y(INST)38 b(SHOULD)g(b)s(e)g(used.)64 b(An)38 b(example)i(of)e(this)h(name)f(t)m(yp)s(e)h(is)g(the)f(Kerb)s(eros)g (tic)m(k)m(et-gran)m(ting)150 1999 y(service)g(whose)f(name)g(has)g(a)g (\014rst)f(comp)s(onen)m(t)i(of)f(krbtgt)g(and)f(a)i(second)f(comp)s (onen)m(t)g(iden)m(tifying)150 2109 y(the)31 b(realm)f(for)g(whic)m(h)h (the)f(tic)m(k)m(et)j(is)e(v)-5 b(alid.)275 2247 y(If)39 b(the)g(\014rst)g(comp)s(onen)m(t)h(of)f(a)h(name)g(iden)m(ti\014es)g (a)f(service)i(and)e(there)g(is)h(a)g(single)g(comp)s(onen)m(t)150 2356 y(follo)m(wing)23 b(the)e(service)h(name)f(iden)m(tifying)h(the)f (instance)h(as)f(the)h(host)f(on)g(whic)m(h)g(the)g(serv)m(er)g(is)g (running,)150 2466 y(then)31 b(the)h(name)f(t)m(yp)s(e)h(SR)-10 b(V-)31 b(HST)g(SHOULD)g(b)s(e)g(used.)43 b(This)30 b(t)m(yp)s(e)i(is)f (t)m(ypically)j(used)c(for)i(In)m(ternet)150 2576 y(services)j(suc)m(h) g(as)g(telnet)h(and)e(the)h(Berk)m(eley)i(R)d(commands.)54 b(If)34 b(the)h(separate)h(comp)s(onen)m(ts)f(of)g(the)150 2685 y(host)40 b(name)g(app)s(ear)g(as)g(successiv)m(e)i(comp)s(onen)m (ts)e(follo)m(wing)h(the)g(name)f(of)g(the)g(service,)k(then)c(the)150 2795 y(name)33 b(t)m(yp)s(e)g(SR)-10 b(V-XHST)33 b(SHOULD)f(b)s(e)h (used.)48 b(This)32 b(t)m(yp)s(e)h(migh)m(t)h(b)s(e)e(used)h(to)g(iden) m(tify)h(serv)m(ers)f(on)150 2904 y(hosts)d(with)g(X.500)j(names)d (where)g(the)g(slash)g(\(/\))i(migh)m(t)f(otherwise)g(b)s(e)f(am)m (biguous.)275 3042 y(A)h(name)h(t)m(yp)s(e)g(of)g(NT-X500-PRINCIP)-8 b(AL)33 b(SHOULD)f(b)s(e)f(used)g(when)f(a)j(name)e(from)h(an)f(X.509) 150 3152 y(certi\014cate)23 b(is)d(translated)h(in)m(to)h(a)f(Kerb)s (eros)e(name.)38 b(The)20 b(enco)s(ding)g(of)h(the)f(X.509)j(name)d(as) h(a)g(Kerb)s(eros)150 3262 y(principal)30 b(shall)h(conform)f(to)h(the) g(enco)s(ding)f(rules)g(sp)s(eci\014ed)g(in)g(RF)m(C)g(2253.)275 3399 y(A)38 b(name)g(t)m(yp)s(e)g(of)h(SMTP)e(allo)m(ws)j(a)e(name)g (to)h(b)s(e)f(of)g(a)h(form)e(that)i(resem)m(bles)g(a)f(SMTP)g(email) 150 3509 y(name.)43 b(This)31 b(name,)g(including)g(an)g Fq(")p Fw(@)p Fq(")f Fw(and)h(a)h(domain)f(name,)g(is)h(used)e(as)h (the)h(one)f(comp)s(onen)m(t)h(of)150 3619 y(the)f(principal)f(name.) 275 3757 y(A)24 b(name)g(t)m(yp)s(e)g(of)g(UNKNO)m(WN)h(SHOULD)f(b)s(e) f(used)h(when)f(the)h(form)f(of)i(the)f(name)g(is)g(not)g(kno)m(wn.)150 3866 y(When)32 b(comparing)g(names,)h(a)g(name)f(of)g(t)m(yp)s(e)h (UNKNO)m(WN)g(will)f(matc)m(h)h(principals)f(authen)m(ticated)150 3976 y(with)42 b(names)h(of)g(an)m(y)g(t)m(yp)s(e.)78 b(A)43 b(principal)f(authen)m(ticated)j(with)d(a)h(name)g(of)g(t)m(yp)s (e)g(UNKNO)m(WN,)150 4085 y(ho)m(w)m(ev)m(er,)32 b(will)f(only)f(matc)m (h)h(other)g(names)f(of)h(t)m(yp)s(e)f(UNKNO)m(WN.)275 4223 y(Names)k(of)g(an)m(y)f(t)m(yp)s(e)h(with)g(an)f(initial)i(comp)s (onen)m(t)f(of)g('krbtgt')g(are)g(reserv)m(ed)g(for)f(the)h(Kerb)s (eros)150 4333 y(tic)m(k)m(et)f(gran)m(ting)e(service.)42 b(See)31 b([Name)g(of)f(the)h(TGS],)f(page)h(41,)h(for)e(the)h(form)f (of)g(suc)m(h)g(names.)150 4535 y Fl(4.3.2.1)63 b(Name)41 b(of)h(serv)m(er)f(principals)150 4682 y Fw(The)31 b(principal)g(iden)m (ti\014er)g(for)g(a)h(serv)m(er)f(on)h(a)f(host)h(will)f(generally)i(b) s(e)d(comp)s(osed)i(of)f(t)m(w)m(o)i(parts:)42 b(\(1\))150 4792 y(the)32 b(realm)h(of)f(the)h(KDC)f(with)g(whic)m(h)f(the)i(serv)m (er)f(is)h(registered,)g(and)f(\(2\))h(a)g(t)m(w)m(o-comp)s(onen)m(t)h (name)150 4902 y(of)f(t)m(yp)s(e)g(NT-SR)-10 b(V-HST)32 b(if)h(the)g(host)g(name)g(is)f(an)h(In)m(ternet)g(domain)g(name)g(or)g (a)g(m)m(ulti-comp)s(onen)m(t)150 5011 y(name)28 b(of)g(t)m(yp)s(e)g (NT-SR)-10 b(V-XHST)28 b(if)g(the)g(name)g(of)g(the)g(host)g(is)g(of)h (a)f(form)f(suc)m(h)h(as)g(X.500)i(that)f(allo)m(ws)150 5121 y(slash)24 b(\(/\))i(separators.)39 b(The)24 b(\014rst)g(comp)s (onen)m(t)h(of)f(the)h(t)m(w)m(o-)h(or)e(m)m(ulti-comp)s(onen)m(t)i (name)f(will)f(iden)m(tify)150 5230 y(the)k(service)h(and)f(the)g (latter)i(comp)s(onen)m(ts)e(will)g(iden)m(tify)h(the)f(host.)40 b(Where)29 b(the)f(name)g(of)g(the)h(host)f(is)150 5340 y(not)j(case)h(sensitiv)m(e)g(\(for)g(example,)g(with)e(In)m(ternet)i (domain)f(names\))g(the)g(name)g(of)g(the)g(host)g(MUST)p eop end %%Page: 41 47 TeXDict begin 41 46 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(41)150 299 y(b)s(e)35 b(lo)m(w)m(er)j(case.)58 b(If)36 b(sp)s(eci\014ed)f(b)m(y)h(the)g (application)i(proto)s(col)f(for)e(services)i(suc)m(h)f(as)g(telnet)h (and)f(the)150 408 y(Berk)m(eley)e(R)d(commands)h(whic)m(h)f(run)f (with)i(system)g(privileges,)h(the)f(\014rst)f(comp)s(onen)m(t)h(MA)-8 b(Y)33 b(b)s(e)e(the)150 518 y(string)f('host')h(instead)g(of)f(a)h (service)g(sp)s(eci\014c)g(iden)m(ti\014er.)150 711 y Fl(4.3.2.2)63 b(Name)41 b(of)h(the)e(TGS)150 858 y Fw(The)k(principal)g (iden)m(ti\014er)g(of)h(the)f(tic)m(k)m(et-gran)m(ting)49 b(service)c(shall)f(b)s(e)g(comp)s(osed)g(of)g(three)h(parts:)150 968 y(\(1\))39 b(the)e(realm)h(of)g(the)f(KDC)g(issuing)g(the)h(TGS)f (tic)m(k)m(et)j(\(2\))f(a)e(t)m(w)m(o-part)i(name)f(of)f(t)m(yp)s(e)h (NT-SR)-10 b(V-)150 1077 y(INST,)46 b(with)f(the)i(\014rst)e(part)h Fq(")p Fw(krbtgt)p Fq(")g Fw(and)g(the)g(second)g(part)g(the)h(name)f (of)g(the)h(realm)f(whic)m(h)150 1187 y(will)37 b(accept)h(the)f(tic)m (k)m(et-gran)m(ting)k(tic)m(k)m(et.)62 b(F)-8 b(or)37 b(example,)i(a)e(tic)m(k)m(et-gran)m(ting)k(tic)m(k)m(et)e(issued)d(b)m (y)h(the)150 1296 y(A)-8 b(THENA.MIT.EDU)24 b(realm)f(to)h(b)s(e)e (used)f(to)j(get)g(tic)m(k)m(ets)h(from)d(the)h(A)-8 b(THENA.MIT.EDU)24 b(KDC)e(has)150 1406 y(a)k(principal)f(iden)m (ti\014er)h(of)g Fq(")p Fw(A)-8 b(THENA.MIT.EDU)p Fq(")27 b Fw(\(realm\),)h(\()p Fq(")p Fw(krbtgt)p Fq(")p Fw(,)f Fq(")p Fw(A)-8 b(THENA.MIT.EDU)p Fq(")p Fw(\))150 1516 y(\(name\).)65 b(A)38 b(tic)m(k)m(et-gran)m(ting)k(tic)m(k)m(et)f (issued)d(b)m(y)g(the)g(A)-8 b(THENA.MIT.EDU)40 b(realm)e(to)h(b)s(e)f (used)f(to)150 1625 y(get)i(tic)m(k)m(ets)h(from)d(the)h(MIT.EDU)g (realm)g(has)f(a)h(principal)f(iden)m(ti\014er)h(of)g Fq(")p Fw(A)-8 b(THENA.MIT.EDU)p Fq(")150 1735 y Fw(\(realm\),)32 b(\()p Fq(")p Fw(krbtgt)p Fq(")p Fw(,)e Fq(")p Fw(MIT.EDU)p Fq(")p Fw(\))h(\(name\).)150 1928 y Fl(4.3.3)63 b(Cho)s(osing)43 b(a)d(principal)h(with)g(whic)m(h)f(to)h(comm)m(unicate)150 2075 y Fw(The)h(Kerb)s(eros)g(proto)s(col)i(pro)m(vides)f(the)g(means)g (for)g(v)m(erifying)g(\(sub)5 b(ject)43 b(to)h(the)f(assumptions)f(in) 150 2184 y(Section)d(4.1)g([En)m(vironmen)m(tal)h(Assumptions],)g(page) f(36\))g(that)g(the)f(en)m(tit)m(y)i(with)e(whic)m(h)g(one)h(com-)150 2294 y(m)m(unicates)32 b(is)g(the)g(same)g(en)m(tit)m(y)h(that)f(w)m (as)g(registered)h(with)e(the)h(KDC)f(using)g(the)h(claimed)g(iden)m (tit)m(y)150 2403 y(\(principal)26 b(name\).)40 b(It)26 b(is)h(still)g(necessary)f(to)h(determine)g(whether)e(that)i(iden)m (tit)m(y)h(corresp)s(onds)d(to)i(the)150 2513 y(en)m(tit)m(y)32 b(with)e(whic)m(h)g(one)h(in)m(tends)f(to)h(comm)m(unicate.)275 2644 y(When)44 b(appropriate)i(data)f(has)g(b)s(een)g(exc)m(hanged)h (in)e(adv)-5 b(ance,)50 b(this)45 b(determination)h(ma)m(y)g(b)s(e)150 2754 y(p)s(erformed)30 b(syn)m(tactically)k(b)m(y)d(the)h(application)g (based)f(on)g(the)h(application)h(proto)s(col)f(sp)s(eci\014cation,)150 2864 y(information)c(pro)m(vided)g(b)m(y)g(the)g(user,)g(and)f (con\014guration)i(\014les.)40 b(F)-8 b(or)28 b(example,)i(the)e(serv)m (er)g(principal)150 2973 y(name)38 b(\(including)g(realm\))g(for)g(a)g (telnet)h(serv)m(er)f(migh)m(t)g(b)s(e)g(deriv)m(ed)f(from)h(the)g (user)f(sp)s(eci\014ed)g(host)150 3083 y(name)20 b(\(from)h(the)f (telnet)i(command)e(line\),)j(the)e Fq(")p Fw(host/)p Fq(")f Fw(pre\014x)f(sp)s(eci\014ed)h(in)g(the)g(application)i(proto)s (col)150 3192 y(sp)s(eci\014cation,)41 b(and)c(a)h(mapping)g(to)g(a)h (Kerb)s(eros)d(realm)j(deriv)m(ed)f(syn)m(tactically)j(from)c(the)h (domain)150 3302 y(part)30 b(of)h(the)f(sp)s(eci\014ed)g(hostname)h (and)e(information)i(from)f(the)g(lo)s(cal)i(Kerb)s(eros)e(realms)g (database.)275 3433 y(One)35 b(can)h(also)h(rely)f(on)g(trusted)f (third)g(parties)h(to)h(mak)m(e)g(this)f(determination,)i(but)d(only)h (when)150 3543 y(the)41 b(data)h(obtained)f(from)g(the)g(third)f(part)m (y)h(is)g(suitably)g(in)m(tegrit)m(y)i(protected)f(while)f(residen)m(t) g(on)150 3653 y(the)36 b(third)g(part)m(y)g(serv)m(er)h(and)e(when)h (transmitted.)58 b(Th)m(us,)37 b(for)f(example,)j(one)d(should)f(not)i (rely)f(on)150 3762 y(an)c(unprotected)g(domain)f(name)h(system)g (record)g(to)g(map)g(a)g(host)g(alias)h(to)g(the)f(primary)f(name)h(of) g(a)150 3872 y(serv)m(er,)24 b(accepting)f(the)f(primary)f(name)h(as)g (the)g(part)m(y)g(one)g(in)m(tends)g(to)g(con)m(tact,)k(since)c(an)g (attac)m(k)m(er)j(can)150 3981 y(mo)s(dify)30 b(the)g(mapping)g(and)g (imp)s(ersonate)g(the)h(part)m(y)f(with)g(whic)m(h)g(one)h(in)m(tended) f(to)h(comm)m(unicate.)275 4113 y(Implemen)m(tations)26 b(of)g(Kerb)s(eros)f(and)g(proto)s(cols)h(based)f(on)h(Kerb)s(eros)e (MUST)i(NOT)f(use)g(insecure)150 4222 y(DNS)35 b(queries)f(to)i (canonicalize)h(the)e(hostname)g(comp)s(onen)m(ts)g(of)f(the)h(service) h(principal)e(names.)54 b(In)150 4332 y(an)28 b(en)m(vironmen)m(t)h (without)f(secure)g(name)g(service,)i(application)f(authors)f(MA)-8 b(Y)29 b(app)s(end)e(a)h(statically)150 4441 y(con\014gured)i(domain)g (name)h(to)h(unquali\014ed)d(hostnames)i(b)s(efore)f(passing)g(the)h (name)g(to)g(the)g(securit)m(y)150 4551 y(mec)m(hanisms,)i(but)f (should)f(do)i(no)f(more)g(than)h(that.)47 b(Secure)32 b(name)g(service)i(facilities,)h(if)d(a)m(v)-5 b(ailable,)150 4661 y(migh)m(t)42 b(b)s(e)f(trusted)g(for)h(hostname)f (canonicalization,)48 b(but)41 b(suc)m(h)g(canonicalization)k(b)m(y)d (the)f(clien)m(t)150 4770 y(SHOULD)30 b(NOT)g(b)s(e)g(required)f(b)m(y) i(KDC)f(implemen)m(tations.)275 4902 y(Implemen)m(tation)25 b(note:)38 b(Man)m(y)25 b(curren)m(t)f(implemen)m(tations)i(do)e(some)h (degree)g(of)g(canonicalization)150 5011 y(of)37 b(the)g(pro)m(vided)f (service)h(name,)i(often)e(using)f(DNS)g(ev)m(en)i(though)e(it)h (creates)h(securit)m(y)f(problems.)150 5121 y(Ho)m(w)m(ev)m(er)29 b(there)f(is)f(no)g(consistency)h(among)g(implemen)m(tations)h(ab)s (out)e(whether)f(the)i(service)g(name)f(is)150 5230 y(case)e(folded)g (to)g(lo)m(w)m(er)g(case)h(or)e(whether)g(rev)m(erse)h(resolution)g(is) f(used.)38 b(T)-8 b(o)25 b(maximize)g(in)m(terop)s(erabilit)m(y)150 5340 y(and)31 b(securit)m(y)-8 b(,)33 b(applications)g(SHOULD)e(pro)m (vide)h(securit)m(y)g(mec)m(hanisms)g(with)f(names)h(whic)m(h)f(result) p eop end %%Page: 42 48 TeXDict begin 42 47 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(42)150 299 y(from)32 b(folding)h(the)f(user-en)m(tered)h(name)g(to)g(lo)m(w)m(er)h(case,)g (without)f(p)s(erforming)e(an)m(y)i(other)g(mo)s(di\014ca-)150 408 y(tions)e(or)f(canonicalization.)150 608 y Fl(4.3.4)63 b(Principal)40 b(Name)h(F)-10 b(orm)150 755 y Fw(Principal)31 b(names)g(consist)g(of)g(a)g(sequence)g(of)g(strings,)g(whic)m(h)g(is)g (often)g(tedious)g(to)h(parse.)41 b(Therefor,)150 865 y(Shishi)i(often)h(uses)g(a)g(\\prin)m(ted")h(form)f(of)g(principal)g (whic)m(h)f(em)m(b)s(ed)h(the)g(en)m(tire)h(principal)f(name)150 975 y(string)34 b(sequence,)j(and)d(optionally)i(also)f(the)g(realm,)h (in)m(to)f(one)g(string.)53 b(The)34 b(format)h(is)g(tak)m(en)g(from) 150 1084 y(the)c(Kerb)s(eros)e(5)i(GSS-API)f(mec)m(hanism)g(\(RF)m(C)h (1964\).)275 1219 y(The)h(elemen)m(ts)i(included)e(within)g(this)h (name)g(represen)m(tation)h(are)f(as)g(follo)m(ws,)i(pro)s(ceeding)d (from)150 1329 y(the)f(b)s(eginning)e(of)i(the)f(string:)199 1464 y(1.)61 b(One)22 b(or)h(more)g(principal)g(name)g(comp)s(onen)m (ts;)j(if)c(more)h(than)g(one)g(principal)g(name)g(comp)s(onen)m(t)g (is)330 1574 y(included,)h(the)e(comp)s(onen)m(ts)h(are)g(separated)g (b)m(y)f(`/`.)39 b(Arbitrary)22 b(o)s(ctets)i(ma)m(y)f(b)s(e)f (included)f(within)330 1683 y(principal)30 b(name)g(comp)s(onen)m(ts,)h (with)f(the)h(follo)m(wing)h(constrain)m(ts)f(and)f(sp)s(ecial)h (considerations:)379 1818 y(a.)61 b(An)m(y)40 b(o)s(ccurrence)g(of)h (the)f(c)m(haracters)i(`@`)e(or)g(`/`)h(within)f(a)g(name)g(comp)s (onen)m(t)h(m)m(ust)f(b)s(e)510 1928 y(immediately)32 b(preceded)f(b)m(y)g(the)g(`)p Fq(\\)p Fw(`)g(quoting)g(c)m(haracter,)i (to)f(prev)m(en)m(t)f(in)m(terpretation)h(as)g(a)510 2037 y(comp)s(onen)m(t)f(or)f(realm)h(separator.)374 2172 y(b.)60 b(The)27 b(ASCI)s(I)e(newline,)j(tab,)g(bac)m(kspace,)h (and)e(n)m(ull)g(c)m(haracters)h(ma)m(y)g(o)s(ccur)f(directly)g(within) 510 2282 y(the)k(comp)s(onen)m(t)f(or)h(ma)m(y)g(b)s(e)e(represen)m (ted,)i(resp)s(ectiv)m(ely)-8 b(,)32 b(b)m(y)f(`)p Fq(\\)p Fw(n`,)f(`)p Fq(\\)p Fw(t`,)h(`)p Fq(\\)p Fw(b`,)f(or)h(`)p Fq(\\)p Fw(0`.)384 2416 y(c.)61 b(If)29 b(the)g(`)p Fq(\\)p Fw(`)g(quoting)g(c)m(haracter)i(o)s(ccurs)e(outside)g(the)g(con)m (texts)i(describ)s(ed)d(in)g(\(1a\))j(and)d(\(1b\))510 2526 y(ab)s(o)m(v)m(e,)h(the)d(follo)m(wing)i(c)m(haracter)g(is)e(in)m (terpreted)h(literally)-8 b(.)41 b(As)26 b(a)h(sp)s(ecial)g(case,)h (this)f(allo)m(ws)510 2636 y(the)42 b(doubled)f(represen)m(tation)h(`)p Fq(\\\\)p Fw(`)g(to)g(represen)m(t)g(a)g(single)g(o)s(ccurrence)g(of)g (the)f(quoting)510 2745 y(c)m(haracter.)374 2880 y(d.)60 b(An)29 b(o)s(ccurrence)g(of)g(the)g(`)p Fq(\\)p Fw(`)g(quoting)g(c)m (haracter)i(as)e(the)g(last)h(c)m(haracter)g(of)f(a)h(comp)s(onen)m(t)f (is)510 2990 y(illegal.)199 3124 y(2.)61 b(Optionally)-8 b(,)39 b(a)e(`@`)f(c)m(haracter,)k(signifying)c(that)h(a)f(realm)h (name)f(immediately)i(follo)m(ws.)59 b(If)36 b(no)330 3234 y(realm)26 b(name)f(elemen)m(t)i(is)e(included,)h(the)f(lo)s(cal)i (realm)f(name)f(is)g(assumed.)39 b(The)24 b(`/`)j(,)f(`:`,)h(and)e(n)m (ull)330 3344 y(c)m(haracters)36 b(ma)m(y)f(not)g(o)s(ccur)f(within)g (a)h(realm)g(name;)i(the)e(`@`,)h(newline,)g(tab,)g(and)e(bac)m(kspace) 330 3453 y(c)m(haracters)d(ma)m(y)g(b)s(e)e(included)g(using)g(the)h (quoting)g(con)m(v)m(en)m(tions)i(describ)s(ed)d(in)g(\(1a\),)j (\(1b\),)f(and)330 3563 y(\(1c\))h(ab)s(o)m(v)m(e.)150 3796 y Fv(4.4)68 b(Shishi)45 b(Con\014guration)150 3956 y Fw(The)23 b(v)-5 b(alid)24 b(con\014guration)g(\014le)g(tok)m(ens)h (are)f(describ)s(ed)e(here.)38 b(The)24 b(user)f(con\014guration)h (\014le)f(is)h(t)m(ypically)150 4065 y(lo)s(cated)33 b(in)e(`)p Fq(~/.shishi/shishi.conf)p Fw(')26 b(\(compare)32 b(`)p Fq(shishi)d(--configuration-file)p Fw('\))d(and)31 b(the)150 4175 y(system)d(con\014guration)g(is)f(t)m(ypically)j(lo)s (cated)e(in)g(`)p Fq(/usr/local/etc/shishi/sh)o(ishi)o(.con)o(f)p Fw(')22 b(\(com-)150 4284 y(pare)29 b(`)p Fq(shishi)g (--system-configuration-fil)o(e)p Fw('\).)35 b(If)29 b(the)h(\014rst)f(non)g(white)g(space)i(c)m(haracter)g(of)f(a)150 4394 y(line)h(is)f(a)h('#',)g(the)f(line)h(is)f(ignored.)41 b(Empt)m(y)30 b(lines)h(are)g(also)g(ignored.)275 4529 y(All)22 b(tok)m(ens)h(are)g(v)-5 b(alid)22 b(in)g(b)s(oth)f(the)h (system)g(and)g(the)g(user)f(con\014guration)i(\014les,)h(and)d(ha)m(v) m(e)i(the)g(same)150 4639 y(meaning.)39 b(Ho)m(w)m(ev)m(er,)30 b(as)c(the)g(system)g(\014le)g(is)f(supp)s(osed)f(to)j(apply)e(to)i (all)g(users)e(on)g(a)i(system,)g(it)f(w)m(ould)150 4748 y(not)34 b(mak)m(e)g(sense)f(to)i(use)e(some)g(tok)m(ens)i(in)e(that)h (\014le.)50 b(F)-8 b(or)34 b(example,)h(the)f(`)p Fq(default-principal) p Fw(')29 b(is)150 4858 y(rarely)i(useful)e(in)h(a)h(system)g (con\014guration)f(\014le.)150 5058 y Fl(4.4.1)63 b(`)p Fj(default-realm)p Fl(')150 5205 y Fw(Sp)s(ecify)30 b(the)g(default)h (realm,)g(b)m(y)f(default)h(the)f(hostname)h(of)f(the)h(host)f(is)h (used.)40 b(E.g.,)390 5340 y Fq(default-realm)k(JOSEFSSON.ORG)p eop end %%Page: 43 49 TeXDict begin 43 48 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(43)150 299 y Fl(4.4.2)63 b(`)p Fj(default-principal)p Fl(')150 446 y Fw(Sp)s(ecify)30 b(the)g(default)h(principal,)f(b)m(y)g(default)h(the)f(login)i (username)d(is)i(used.)40 b(E.g.,)390 592 y Fq(default-principal)j(jas) 150 803 y Fl(4.4.3)63 b(`)p Fj(client-kdc-etypes)p Fl(')150 950 y Fw(Sp)s(ecify)28 b(whic)m(h)g(encryption)h(t)m(yp)s(es)f(clien)m (t)j(asks)d(serv)m(er)h(to)h(resp)s(ond)c(in)j(during)e(AS/TGS)h(exc)m (hanges.)150 1060 y(List)45 b(v)-5 b(alid)45 b(encryption)f(t)m(yp)s (es,)k(in)d(preference)f(order.)83 b(Supp)s(orted)42 b(algorithms)j(include)g(aes256-)150 1169 y(cts-hmac-sha1-96,)e (aes128-cts-hmac-sha1-96,)j(des3-cb)s(c-sha1-kd,)41 b(des-cb)s(c-md5,)g (des-cb)s(c-md4,)150 1279 y(des-cb)s(c-crc)28 b(and)e(n)m(ull.)39 b(This)27 b(option)g(also)h(indicates)g(whic)m(h)e(encryption)h(t)m(yp) s(es)g(are)h(accepted)g(b)m(y)f(the)150 1389 y(clien)m(t)k(when)d (receiving)j(the)e(resp)s(onse.)40 b(Note)30 b(that)g(the)g(preference) f(order)g(is)g(not)h(cryptographically)150 1498 y(protected,)e(so)f(a)g (man)f(in)h(the)f(middle)h(can)f(mo)s(dify)g(the)h(order)f(without)g(b) s(eing)h(detected.)40 b(Th)m(us,)27 b(only)150 1608 y(sp)s(ecify)34 b(encryption)g(t)m(yp)s(es)g(y)m(ou)h(trust)f(completely)i(here.)52 b(The)34 b(default)g(only)h(includes)f(aes256-cts-)150 1717 y(hmac-sha1-96,)e(as)f(suggested)g(b)m(y)f(RF)m(C1510bis.)43 b(E.g.,)390 1864 y Fq(client-kdc-etypes=aes256)o(-cts)o(-hma)o(c-s)o (ha1-)o(96)f(des3-cbc-sha1-kd)h(des-cbc-md5)150 2057 y Fl(4.4.4)63 b(`)p Fj(verbose)p Fl(',)42 b(`)p Fj(verbose-asn1)p Fl(',)h(`)p Fj(verbose-noise)p Fl(',)g(`)p Fj(verbose-crypto)p Fl(',)464 2181 y(`)p Fj(verbose-crypto-noise)p Fl(')150 2328 y Fw(Enable)30 b(v)m(erb)s(ose)h(library)f(messages.)41 b(E.g.,)390 2474 y Fq(verbose)390 2584 y(verbose-noise)150 2795 y Fl(4.4.5)63 b(`)p Fj(realm-kdc)p Fl(')150 2942 y Fw(Sp)s(ecify)20 b(KDC)g(addresses)f(for)h(realms.)38 b(V)-8 b(alue)21 b(is)g(`)p Fq(REALM,KDCADDRESS[/TRANSP)o(ORT)o(][,K)o (DCAD)o(DRE)o(SS[/)o(TRAN)o(SPO)o(RT].)o(..])p Fw('.)275 3088 y(KDCADDRESS)30 b(is)g(the)g(hostname)h(or)f(IP)g(address)g(of)g (KDC.)275 3235 y(Optional)64 b(TRANSPOR)-8 b(T)63 b(is)h(\\udp")g(for)f (UDP)-8 b(,)66 b(\\tcp")f(for)f(TCP)-8 b(,)63 b(and)h(\\tls")h(for)f (TLS)150 3344 y(connections.)140 b(By)64 b(default)f(UDP)h(is)f(tried)g (\014rst,)71 b(and)63 b(TCP)f(used)h(as)g(a)h(fallbac)m(k)h(if)e(the) 150 3454 y(KRB)p 358 3454 28 4 v 40 w(ERR)p 594 3454 V 40 w(RESPONSE)p 1128 3454 V 38 w(TOO)p 1374 3454 V 39 w(BIG)31 b(error)f(is)g(receiv)m(ed.)275 3600 y(If)f(not)i(sp)s (eci\014ed,)f(Shishi)f(tries)i(to)g(lo)s(cate)h(the)f(KDC)f(using)g(SR) -10 b(V)29 b(RRs,)i(whic)m(h)f(is)g(recommended.)150 3710 y(This)22 b(option)h(should)f(normally)h(only)g(b)s(e)g(used)f (during)f(exp)s(erimen)m(ts,)k(or)e(to)g(access)i(badly)d(main)m (tained)150 3819 y(realms.)390 3966 y Fq(realm-kdc=JOSEFSSON.ORG,)o (rist)o(rett)o(o.j)o(osef)o(sson)o(.or)o(g)150 4177 y Fl(4.4.6)63 b(`)p Fj(server-realm)p Fl(')150 4324 y Fw(Sp)s(ecify)30 b(realm)g(for)h(serv)m(ers.)40 b(V)-8 b(alue)32 b(is)e(`)p Fq(REALM,SERVERREGEXP[,SERVERR)o(EGE)o(XP..)o(.])p Fw('.)275 4470 y(SER)-10 b(VERREGEXP)21 b(is)h(a)h(regular)f(expression)g(matc)m (hing)h(serv)m(ers)f(in)g(the)h(realm.)38 b(The)22 b(\014rst)f(matc)m (h)150 4580 y(is)30 b(used.)40 b(E.g.,)390 4726 y Fq (server-realm=JOSEFSSON.O)o(RG,.)o(jose)o(fss)o(on.o)o(rg)275 4872 y Fw(Note:)i(curren)m(tly)30 b(not)h(used.)150 5083 y Fl(4.4.7)63 b(`)p Fj(kdc-timeout)p Fl(',)42 b(`)p Fj(kdc-retries)p Fl(')150 5230 y Fw(Ho)m(w)27 b(long)h(shishi)e(w)m(aits)h(for)g(a)g (resp)s(onse)f(from)g(a)h(KDC)g(b)s(efore)f(con)m(tin)m(uing)i(to)f (next)g(KDC)g(for)f(realm.)150 5340 y(The)k(default)g(is)h(5)g (seconds.)40 b(E.g.,)p eop end %%Page: 44 50 TeXDict begin 44 49 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(44)390 299 y Fq(kdc-timeout=10)275 433 y Fw(Ho)m(w)38 b(man)m(y)f(times)h(shishi)f(sends)f(a)i(request)f (to)i(a)e(KDC)h(b)s(efore)f(giving)h(up.)61 b(The)36 b(default)i(is)g(3)150 542 y(times.)j(E.g.,)390 676 y Fq(kdc-retries=5)150 874 y Fl(4.4.8)63 b(`)p Fj(stringprocess)p Fl(')150 1021 y Fw(Ho)m(w)30 b(username)f(and)g(passw)m(ords)g(en)m (tered)h(from)f(the)h(terminal,)h(or)e(tak)m(en)i(from)e(the)h(command) f(line,)150 1131 y(are)i(pro)s(cessed.)275 1265 y Fq(")p Fw(none)p Fq(")p Fw(:)40 b(no)30 b(pro)s(cessing)g(is)g(used.)275 1399 y Fq(")p Fw(stringprep)p Fq(")p Fw(:)35 b(con)m(v)m(ert)26 b(from)d(lo)s(cale)j(c)m(harset)f(to)g(UTF-8)g(and)e(pro)s(cess)g (using)h(exp)s(erimen)m(tal)h(RF)m(C)150 1508 y(1510)32 b(stringprep)d(pro\014le.)275 1642 y(It)34 b(can)h(also)h(b)s(e)e(a)h (string)f(indicating)i(a)f(c)m(haracter)h(set)f(supp)s(orted)e(b)m(y)i (icon)m(v)g(via)h(libstringprep,)150 1752 y(in)e(whic)m(h)f(case)i (data)g(is)f(con)m(v)m(erted)i(from)d(lo)s(cale)j(c)m(harset)f(in)m(to) g(the)f(indicated)g(c)m(haracter)i(set.)52 b(E.g.,)150 1862 y(UTF-8,)33 b(ISO-8859-1,)h(K)m(OI-8,)f(EBCDIC-IS-FRISS)d(are)i (supp)s(orted)e(on)h(GNU)h(systems.)45 b(On)31 b(some)150 1971 y(systems)38 b(y)m(ou)g(can)g(use)g Fq(")p Fw(lo)s(cale)h(-m)p Fq(")e Fw(to)i(list)f(a)m(v)-5 b(ailable)41 b(c)m(haracter)e(sets.)63 b(By)39 b(default,)h(the)e Fq(")p Fw(none)p Fq(")150 2081 y Fw(setting)d(is)g(used)e(whic)m(h)i(is)f(consisten)m(t)i(with)e (RF)m(C)g(1510)j(that)e(is)f(silen)m(t)h(on)g(the)f(issue.)53 b(In)33 b(practice,)150 2190 y(ho)m(w)m(ev)m(er,)f(con)m(v)m(erting)g (to)f(UTF-8)h(impro)m(v)m(es)f(in)m(terop)s(erabilit)m(y)-8 b(.)275 2324 y(E.g.,)390 2458 y Fq(stringprocess=UTF-8)150 2656 y Fl(4.4.9)63 b(`)p Fj(ticket-life)p Fl(')150 2803 y Fw(Sp)s(ecify)30 b(default)g(tic)m(k)m(et)j(life)e(time.)275 2937 y(The)37 b(string)h(can)g(b)s(e)f(in)h(almost)h(an)m(y)f(common)g (format.)64 b(It)38 b(can)g(con)m(tain)h(mon)m(th)f(names,)i(time)150 3047 y(zones,)33 b(`am')f(and)g(`pm',)g(`y)m(esterda)m(y',)i(`ago',)g (`next',)f(etc.)47 b(See)32 b(Section)g(4.10)i([Date)f(input)e (formats],)150 3156 y(page)g(50,)h(for)e(the)g(long)h(story)-8 b(.)275 3290 y(As)28 b(an)h(extra)g(feature,)g(if)g(the)g(time)g(sp)s (eci\014ed)f(b)m(y)g(y)m(our)h(string)f(corresp)s(ond)g(to)h(a)g(time)g (during)f(the)150 3400 y(last)j(24)f(hours,)f(an)h(extra)g(da)m(y)g(is) g(added)f(to)h(it.)41 b(This)29 b(allo)m(ws)i(y)m(ou)f(to)h(sp)s(ecify) e(relativ)m(e)j(times)e(suc)m(h)g(as)150 3509 y Fq(")p Fw(17:00)p Fq(")i Fw(to)f(alw)m(a)m(ys)h(mean)e(the)h(next)f(17:00,)j (ev)m(en)e(if)f(y)m(our)h(system)f(clo)s(c)m(k)i(happ)s(ens)d(to)i(b)s (e)e(17:30.)275 3643 y(The)g(default)i(is)f(8)h(hours.)275 3777 y(E.g.,)390 3911 y Fq(#ticket-life=8)44 b(hours)390 4021 y(#ticket-life=1)g(day)390 4130 y(ticket-life=17:00)150 4329 y Fl(4.4.10)63 b(`)p Fj(renew-life)p Fl(')150 4475 y Fw(Sp)s(ecify)30 b(ho)m(w)g(long)h(a)g(renew)m(able)g(tic)m(k)m(et)i (should)c(remain)h(renew)m(able.)275 4609 y(See)g(tic)m(k)m(et-life)k (for)c(the)h(syn)m(tax.)42 b(The)29 b(extra)j(feature)f(that)g(handles) e(negativ)m(e)k(v)-5 b(alues)31 b(within)f(the)150 4719 y(last)h(2)g(hours)e(is)i(not)f(activ)m(e)j(here.)275 4853 y(The)c(default)i(is)f(7)h(da)m(ys.)275 4987 y(E.g.,)390 5121 y Fq(#renew-life=1)44 b(week)390 5230 y(#renew-life=friday)f (17:00)390 5340 y(renew-life=sunday)p eop end %%Page: 45 51 TeXDict begin 45 50 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(45)150 299 y Fv(4.5)68 b(Shisa)45 b(Con\014guration)150 458 y Fw(The)20 b(con\014guration)g (\014le)h(for)f(Shisa)g(is)g(t)m(ypically)i(stored)e(in)g(`)p Fq(/usr/local/etc/shishi/shisa)o(.co)o(nf)p Fw('.)150 568 y(If)30 b(the)g(\014rst)f(non)h(white)g(space)g(c)m(haracter)i(of)e (a)h(line)f(is)g(a)g('#',)h(the)f(line)h(is)f(ignored.)40 b(Empt)m(y)30 b(lines)h(are)150 677 y(also)g(ignored.)150 896 y Fl(4.5.1)63 b(`)p Fj(db)p Fl(')150 1043 y Fw(Curren)m(tly)27 b(the)h(only)f(con\014guration)h(options)g(a)m(v)-5 b(ailable)30 b(is)e(the)g Fq(db)f Fw(tok)m(en)h(that)h(de\014ne)d(the)i(databases) 150 1152 y(to)j(use.)41 b(The)29 b(syn)m(tax)i(is:)390 1306 y Fq(db)47 b([OPTIONS])e()i([LOCATION])e([PARAMETERS)f(...]) 275 1459 y Fw(Sp)s(ecify)34 b(the)i(data)g(sources)g(for)f(Kerb)s(eros) f(5)i(data.)57 b(Multiple)36 b(en)m(tries,)i(ev)m(en)e(of)g(the)f(same) h(data)150 1569 y(source)e(t)m(yp)s(e,)h(are)f(allo)m(w)m(ed.)52 b(The)33 b(data)i(sources)e(are)i(accessed)f(in)g(the)g(same)g (sequence)g(as)g(they)g(are)150 1679 y(de\014ned)j(here.)62 b(If)38 b(an)f(en)m(try)h(is)g(found)e(in)i(one)g(data)g(source,)i(it)f (will)f(b)s(e)f(used)g(for)g(the)h(op)s(erations,)150 1788 y(without)30 b(searc)m(hing)i(the)e(remaining)h(data)g(sources.)40 b(V)-8 b(alid)32 b(OPTIONS)d(include:)390 1942 y Fq(--read-only)331 b(No)47 b(data)g(is)g(written)f(to)h(this)g(data)f(source.)390 2051 y(--ignore-errors)139 b(Ignore)46 b(failures)g(in)h(this)g (backend.)275 2205 y Fw(The)22 b(default)h(\(when)f(the)h (con\014guration)g(\014le)g(is)g(empt)m(y\))h(uses)e(one)h Fq(")p Fw(\014le)p Fq(")g Fw(data)g(source)g(\(see)h(b)s(elo)m(w\),)150 2314 y(but)40 b(for)g(a)g(larger)h(installation)i(y)m(ou)d(ma)m(y)h(w)m (an)m(t)g(to)g(com)m(bine)h(sev)m(eral)f(data)g(sources.)71 b(Here)41 b(is)f(an)150 2424 y(example.)390 2577 y Fq(db)47 b(--read-only)e(file)i(/var/local/master)390 2687 y(db)g (--ignore-errors)d(ldap)i(kdc.example.org)e(ca=/etc/shisa/kdc-ca.pem) 390 2797 y(db)j(--read-only)e(file)i(/var/cache/ldap-copy)275 2950 y Fw(This)40 b(demonstrate)i(ho)m(w)f(y)m(ou)h(can)g(store)g (critical)h(principals)e(on)g(lo)s(cal)i(disk)e(\(the)g(\014rst)g(en)m (try)-8 b(,)150 3060 y(/v)j(ar/lo)s(cal/master\))34 b(that)e(will)f (alw)m(a)m(ys)i(b)s(e)d(found)g(without)h(lo)s(oking)h(in)e(the)h(LD)m (AP)h(directory)-8 b(.)43 b(The)150 3169 y(critical)24 b(principals)e(could)g(b)s(e,)h(e.g.,)j(krbtgt/EXAMPLE.OR)m(G.)e(The)d (second)i(en)m(try)f(denote)h(a)f(LD)m(AP)150 3279 y(serv)m(er)36 b(that)g(could)g(hold)g(user)f(principals.)56 b(As)36 b(y)m(ou)g(can)g(see,)i(Shisa)d(will)h(not)g(let)h(the)f(caller)h(kno)m (w)150 3389 y(ab)s(out)30 b(errors)g(with)g(the)g(LD)m(AP)h(source)g (\(they)g(will)f(b)s(e)g(logged,)i(ho)m(w)m(ev)m(er\).)42 b(Instead,)31 b(if)f(for)g(instance)150 3498 y(the)38 b(LD)m(AP)g(serv)m(er)f(has)g(crashed,)i(Shisa)e(w)m(ould)g(con)m(tin)m (ue)i(and)d(read)i(from)e(the)i(/v)-5 b(ar/cac)m(he/ldap-)150 3608 y(cop)m(y)37 b(\014le)f(source.)59 b(That)36 b(\014le)h(source)f (ma)m(y)h(ha)m(v)m(e)g(b)s(een)f(set)h(up)e(to)i(con)m(tain)h(a)e(cop)m (y)h(of)g(the)f(data)h(in)150 3717 y(the)j(LD)m(AP)g(serv)m(er,)i(p)s (erhaps)c(made)i(on)f(an)h(hourly)f(basis,)j(so)e(that)g(y)m(our)f (serv)m(er)h(will)g(b)s(e)f(able)h(to)150 3827 y(serv)m(e)35 b(recen)m(t)g(data)g(ev)m(en)g(in)f(case)h(of)g(a)g(crash.)52 b(An)m(y)34 b(up)s(dates)f(or)i(passw)m(ords)e(c)m(hange)i(requests)g (will)150 3936 y(ho)m(w)m(ev)m(er)k(not)e(b)s(e)g(p)s(ossible)f(while)h (the)h(LD)m(AP)g(serv)m(er)f(is)g(inaccessible,)k(to)d(reduce)f(the)g (problem)g(of)150 4046 y(sync)m(hronizing)30 b(data)i(bac)m(k)f(in)m (to)g(the)g(LD)m(AP)g(serv)m(er)f(once)h(it)g(is)g(online)f(again.)275 4200 y(Curren)m(tly)35 b(only)h(the)g Fq(")p Fw(\014le)p Fq(")f Fw(data)i(source)f(is)g(supp)s(orted,)f(and)h(denote)g(a)g(data) h(source)f(that)g(use)150 4309 y(the)31 b(standard)e(\014le)i(system)f (for)g(storage.)275 4463 y(V)-8 b(alid)31 b(syn)m(taxes)g(for)f(the)h Fq(")p Fw(\014le)p Fq(")f Fw(database:)390 4616 y Fq(db)47 b(file)g(PATH)275 4770 y Fw(Examples:)390 4923 y Fq(db)g(file)g (/var/shishi)390 5033 y(db)g(file)g(/usr/share/shishi)c(read-only)275 5186 y Fw(If)29 b(no)i(`)p Fq(db)p Fw(')f(tok)m(ens)h(are)g(presen)m (t,)g(the)f(default)h(will)g(b)s(e:)390 5340 y Fq(db)47 b(file)g(/usr/local/var/shishi)p eop end %%Page: 46 52 TeXDict begin 46 51 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(46)150 299 y Fv(4.6)68 b(P)l(arameters)47 b(for)e(shishi)150 458 y Fw(If)34 b(no)h(command)f(is)g(giv)m(en,)j(Shishi)d(try)g(to)h(mak)m(e)h(sure)e (y)m(ou)h(ha)m(v)m(e)h(a)e(tic)m(k)m(et)k(gran)m(ting)d(tic)m(k)m(et)i (for)e(the)150 568 y(default)c(realm,)g(and)e(then)h(displa)m(y)h(it.) 275 707 y(Mandatory)f(argumen)m(ts)h(to)g(long)g(options)g(are)g (mandatory)f(for)g(short)g(options)h(to)s(o.)390 847 y Fq(Usage:)46 b(shishi)g([OPTIONS]...)f([CLIENT)g([SERVER]]...)485 1066 y(-h,)i(--help)1431 b(Print)46 b(help)h(and)f(exit)485 1176 y(-V,)h(--version)1287 b(Print)46 b(version)g(and)h(exit)390 1395 y(Commands:)485 1504 y(-d,)g(--destroy)1287 b(Destroy)45 b(tickets)h(in)h(local)g(cache,)2490 1614 y(limited)f(by)h(any)g (--client-name)d(or)2490 1724 y(--server-name.)92 b(\(default=off\))485 1833 y(-l,)47 b(--list)1431 b(List)46 b(tickets)g(in)h(local)g(cache,)f (limited)2490 1943 y(by)h(any)g(--client-name)d(and)2490 2052 y(--server-name.)92 b(\(default=off\))485 2162 y(-r,)47 b(--renew)1383 b(Renew)46 b(ticket.)93 b(Use)47 b(--server-name)e(to) 2490 2271 y(specify)h(ticket,)g(default)f(is)j(the)2490 2381 y(most)f(recent)f(renewable)f(ticket)2490 2491 y(granting)h (ticket)g(for)h(the)f(default)2490 2600 y(realm.)94 b(\(default=off\)) 390 2819 y(Flags:)676 2929 y(--forwardable)1095 b(Get)46 b(a)i(forwardable)d(ticket,)g(i.e.,)i(one)2490 3039 y(that)g(can)g(be)g (used)f(to)i(get)e(forwarded)2490 3148 y(tickets.)93 b(\(default=off\))676 3258 y(--forwarded)1191 b(Get)46 b(a)i(forwarded)d(ticket.)94 b(\(default=)2490 3367 y(off\))676 3477 y(--proxiable)1191 b(Get)46 b(a)i(proxiable)d(ticket,)h(i.e.,)g (one)2490 3587 y(that)h(can)g(be)g(used)f(to)i(get)e(proxy)2490 3696 y(tickets.)93 b(\(default=off\))676 3806 y(--proxy)1383 b(Get)46 b(a)i(proxy)e(ticket.)94 b(\(default=off\))676 3915 y(--renewable)1191 b(Get)46 b(a)i(renewable)d(ticket.)94 b(\(default=)2490 4025 y(off\))390 4244 y(Options:)676 4354 y(--client-name=NAME)855 b(Client)46 b(name.)g(Default)g(is)h (login)2490 4463 y(username.)485 4573 y(-E,)g (--encryption-type=ETYPE,[E)o(TYP)o(E...)o(])90 b(Encryption)45 b(types)h(to)h(use.)94 b(ETYPE)47 b(is)2490 4682 y(either)f(registered) f(name)i(or)g(integer.)2538 4792 y(Valid)f(values)g(include)g ('aes128',)2490 4902 y('aes256',)f('aes')i(\(same)f(as)2490 5011 y('aes256'\),)f('3des',)h('des-md5',)2490 5121 y('des-md4',)f ('des-crc',)g('des')h(\(same)2490 5230 y(as)h('des-md5'\),)e(and)i ('arcfour'.)485 5340 y(-e,)g(--endtime=STRING)951 b(Specify)45 b(when)i(ticket)f(validity)g(should)p eop end %%Page: 47 53 TeXDict begin 47 52 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(47)2490 299 y Fq(expire.)94 b(The)46 b(time)h(syntax)f(may)h(be)2490 408 y(relative)f(\(to)g(the)h (start)g(time\),)f(such)2490 518 y(as)h('20)g(hours',)f(or)h(absolute,) e(such)2490 628 y(as)i('2001-02-03)e(04:05:06)g(CET'.)i(The)2490 737 y(default)f(is)h(8)g(hours)g(after)f(the)h(start)2490 847 y(time.)676 956 y(--realm=STRING)1047 b(Set)46 b(default)g(realm.) 676 1066 y(--renew-till=STRING)807 b(Specify)45 b(renewable)h(life)g (of)h(ticket.)2490 1176 y(Implies)f(--renewable.)92 b(Accepts)46 b(same)2490 1285 y(time)h(syntax)f(as)h(--endtime.)93 b(If)2490 1395 y(--renewable)45 b(is)i(specified,)e(the)2490 1504 y(default)h(is)h(1)g(week)g(after)f(the)h(start)2490 1614 y(time.)676 1724 y(--server-name=NAME)855 b(Server)46 b(name.)g(Default)g(is)2490 1833 y('krbtgt/REALM')e(where)i(REALM)h(is) 2490 1943 y(client)f(realm.)485 2052 y(-s,)h(--starttime=STRING)855 b(Specify)45 b(when)i(ticket)f(should)g(start)h(to)2490 2162 y(be)g(valid.)94 b(Accepts)46 b(same)g(time)2490 2271 y(syntax)g(as)h(--endtime.)e(The)i(default)2490 2381 y(is)g(to)g(become)f(valid)h(immediately.)676 2491 y(--ticket-granter=NAME)711 b(Service)45 b(name)i(in)g(ticket)f(to)h (use)g(for)2490 2600 y(authenticating)d(request.)h(Only)i(for)2490 2710 y(TGS.)g(Defaults)e(to)2490 2819 y('krbtgt/REALM@REALM')d(where)47 b(REALM)2490 2929 y(is)g(client)f(realm.)390 3148 y(Other)g(options:) 676 3258 y(--configuration-file=FILE)519 b(Read)46 b(user)h (configuration)d(from)j(FILE.)485 3367 y(-c,)g(--ticket-file=FILE)855 b(Read)46 b(tickets)g(from)h(FILE.)485 3477 y(-o,)g (--library-options=STRING)567 b(Parse)46 b(STRING)g(as)h(a)h (configuration)c(file)2490 3587 y(statement.)485 3696 y(-q,)j(--quiet)1383 b(Don't)46 b(produce)g(any)h(diagnostic)e(output.) 2585 3806 y(\(default=off\))676 3915 y(--system-configuration-fil)o (e=F)o(ILE)185 b(Read)46 b(system)g(configuration)e(from)j(FILE.)676 4025 y(--ticket-write-file=FILE)567 b(Write)46 b(tickets)g(from)g (FILE.)94 b(Default)46 b(is)2490 4134 y(to)h(write)g(them)f(back)h(to)g (where)f(they)2490 4244 y(were)h(read)f(from.)485 4354 y(-v,)h(--verbose)1287 b(Produce)45 b(verbose)h(output.)2585 4463 y(\(default=off\))150 4694 y Fv(4.7)68 b(P)l(arameters)47 b(for)e(shishid)150 4853 y Fw(If)e(no)h(parameters)g(are)g(sp)s (eci\014ed,)i(`)p Fq(shishid)p Fw(')c(listens)i(on)g(the)f(defaults)h (in)m(terfaces)h(and)e(answ)m(ers)150 4963 y(incoming)31 b(requests)f(using)g(the)h(k)m(eys)g(in)f(the)g(default)h(k)m(ey)g (\014le.)275 5097 y(Mandatory)f(argumen)m(ts)h(to)g(long)g(options)g (are)g(mandatory)f(for)g(short)g(options)h(to)s(o.)390 5230 y Fq(Usage:)46 b(shishid)g([OPTIONS]...)p eop end %%Page: 48 54 TeXDict begin 48 53 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(48)485 299 y Fq(-h,)47 b(--help)953 b(Print)47 b(help)f(and)h(exit)485 408 y(-V,)g(--version) 809 b(Print)47 b(version)e(and)i(exit)390 628 y(Commands:)485 737 y(-l,)g(--listen=[FAMILY:]ADDR:POR)o(T/T)o(YPE)1917 847 y(Sockets)f(to)h(listen)f(for)h(queries)f(on.)95 b(Family)46 b(is)2013 956 y(`IPv4')g(or)h(`IPv6',)f(if)h(absent)f(the)h (family)f(is)2013 1066 y(decided)g(by)h(gethostbyname\(ADDR\).)42 b(An)47 b(address)f(of)2013 1176 y(`*')h(indicates)e(all)i(addresses)e (on)i(the)g(local)2013 1285 y(host.)f(The)h(default)f(is)h (`*:kerberos/udp,)2013 1395 y(*:kerberos/tcp'.)485 1504 y(-u,)g(--setuid=NAME)617 b(After)47 b(binding)e(socket,)h(set)h(user)g (identity.)390 1724 y(TLS)g(settings:)676 1833 y(--no-tls)857 b(Disable)46 b(TLS)h(support)94 b(\(default=off\))676 1943 y(--x509cafile=FILE)425 b(X.509)47 b(certificate)d(authorities)h (used)i(to)g(verify)2013 2052 y(client)f(certificates,)e(in)j(PEM)g (format.)676 2162 y(--x509certfile=FILE)329 b(X.509)47 b(server)f(certificate,)e(in)j(PEM)g(format.)676 2271 y(--x509crlfile=FILE)377 b(X.509)47 b(certificate)d(revocation)h(list)i (to)g(check)g(for)2013 2381 y(revoked)f(client)g(certificates,)e(in)j (PEM)g(format.)676 2491 y(--x509keyfile=FILE)377 b(X.509)47 b(server)f(certificate)e(key,)j(in)g(PEM)g(format.)676 2600 y(--resume-limit=SHORT)281 b(Keep)47 b(track)f(of)h(up)h(to)f (this)f(many)h(TLS)g(sessions)f(for)2013 2710 y(resume)g(purposes)f (\(0)j(to)f(disable)f(TLS)g(resume\).)2013 2819 y(\(default=`50'\))390 3039 y(Other)g(options:)485 3148 y(-c,)h(--configuration-file=FILE)41 b(Use)47 b(specified)e(configuration)g(file.)485 3258 y(-v,)i(--verbose)809 b(Produce)46 b(verbose)g(output.)2013 3367 y(Use)h(multiple)e(times)i(to)g(increase)e(amount)h(of)2013 3477 y(information.)485 3587 y(-q,)h(--quiet)905 b(Don't)47 b(produce)e(any)i(diagnostic)e(output.)2108 3696 y(\(default=off\))150 3927 y Fv(4.8)68 b(P)l(arameters)47 b(for)e(shisa)150 4086 y Fw(The)24 b(purp)s(ose)f(of)j(`)p Fq(shisa)p Fw(')d(is)i(to)h (manipulate)f(information)g(stored)g(in)g(the)g(Kerb)s(eros)f(5)h (database)h(used)150 4196 y(b)m(y)k(Shishi.)275 4330 y(Mandatory)g(argumen)m(ts)h(to)g(long)g(options)g(are)g(mandatory)f (for)g(short)g(options)h(to)s(o.)390 4463 y Fq(Usage:)46 b(shisa)g([OPTIONS]...)f([REALM)h([PRINCIPAL]]...)485 4682 y(-h,)h(--help)1192 b(Print)46 b(help)h(and)g(exit)485 4792 y(-V,)g(--version)1048 b(Print)46 b(version)g(and)h(exit)390 5011 y(Operations:)485 5121 y(-a,)g(--add)1240 b(Add)47 b(realm)f(or)h(principal)f(to)h(database.)485 5230 y(-d,)g(--dump)1192 b(Dump)47 b(entries)e(in)j(database.)485 5340 y(-n,)f(--key-add)1048 b(Add)47 b(new)g(key)g(to)g(a)g(principal)f(in)h(database.)p eop end %%Page: 49 55 TeXDict begin 49 54 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(49)676 299 y Fq(--key-remove)904 b(Remove)46 b(a)h(key)g(from)g(a)g(principal)f(in)2251 408 y(database.)485 518 y(-l,)h(--list)1192 b(List)47 b(entries)e(in)j(database.)485 628 y(-m,)f(--modify)1096 b(Modify)46 b(principal)f(entry)i(in)g(database.)485 737 y(-r,)g(--remove)1096 b(Remove)46 b(realm)g(or)i(principal)d(from)h (database.)390 956 y(Parameters:)485 1066 y(-f,)h(--force)1144 b(Allow)46 b(removal)g(of)h(non-empty)f(realms.)2347 1176 y(\(default=off\))676 1285 y(--enabled)1048 b(Only)47 b(dump)f(or)h(list)g(enabled)f(principals.)2347 1395 y(\(default=off\))676 1504 y(--disabled)1000 b(Only)47 b(dump)f(or)h(list)g(disabled)f(principals.)2347 1614 y(\(default=off\))676 1724 y(--keys)1192 b(Print)46 b(cryptographic)e (key)j(and)g(password)f(in)2251 1833 y(hostkey)g(format.)94 b(\(default=off\))390 2052 y(Values:)485 2162 y(-E,)47 b(--encryption-type=STRING)328 b(Override)45 b(default)h(key)h (encryption)e(type.)2251 2271 y(Valid)i(values)f(include)g('aes128',) 2251 2381 y('aes256',)g('aes')g(\(same)g(as)i('aes256'\),)2251 2491 y('3des',)e('des-md5',)f('des-md4',)2251 2600 y('des-crc',)g ('des')i(\(same)f(as)h('des-md5'\),)2251 2710 y(and)g('arcfour'.)676 2819 y(--key-version=NUMBER)520 b(Version)46 b(of)h(key.)676 2929 y(--password[=STRING])568 b(Derive)46 b(key)h(from)g(this)f (password.)676 3039 y(--random)1096 b(Use)47 b(a)g(random)f(key.)95 b(\(default\))676 3148 y(--salt=STRING)856 b(Use)47 b(specified)e(salt) i(for)g(deriving)e(key.)2251 3258 y(Defaults)h(to)h(concatenation)d(of) j(realm)g(and)2251 3367 y(\(unwrapped\))e(principal)g(name.)676 3477 y(--string-to-key-parameter=)o(HEX)89 b(Encryption)45 b(algorithm)g(specific)h(parameter)2251 3587 y(for)h(password)f (derivation.)92 b(Currently)2251 3696 y(only)47 b(the)g(AES)g (algorithm)e(can)i(utilize)2251 3806 y(this,)g(where)f(it)h(is)g (interpreted)e(as)i(the)2251 3915 y(iteration)f(count)g(of)h(the)g (PKCS#5)f(PBKDF2)2251 4025 y(key)h(deriver.)390 4244 y(Other)f(options:)485 4354 y(-c,)h(--configuration-file=FILE)280 b(Use)47 b(specified)e(configuration)f(file.)485 4463 y(-o,)j(--library-options=STRING)328 b(Parse)46 b(string)g(as)i (configuration)c(file)2251 4573 y(statement.)485 4682 y(-v,)j(--verbose)1048 b(Produce)46 b(verbose)g(output.)2347 4792 y(\(default=off\))485 4902 y(-q,)h(--quiet)1144 b(Don't)46 b(produce)g(any)h(diagnostic)e(output.)2347 5011 y(\(default=off\))p eop end %%Page: 50 56 TeXDict begin 50 55 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(50)150 299 y Fv(4.9)68 b(En)l(vironmen)l(t)46 b(v)-7 b(ariables)150 458 y Fw(A)37 b(few)g(of)g(the)g(compile-time)i(defaults)e(ma)m(y)g(b)s(e)g(o)m(v)m (erridden)g(at)g(run-time)g(b)m(y)g(using)f(en)m(vironmen)m(t)150 568 y(v)-5 b(ariables.)41 b(The)30 b(follo)m(wing)i(v)-5 b(ariables)31 b(are)g(supp)s(orted.)225 700 y Fu(\017)60 b Fq(SHISHI_CONFIG)29 b Fw(Sp)s(ecify)j(the)h(lo)s(cation)h(of)f(the)g (default)g(system)g(con\014guration)g(\014le.)47 b(Used)33 b(b)m(y)330 810 y(the)23 b(Shishi)f(library)-8 b(.)39 b(If)23 b(not)g(sp)s(eci\014ed,)h(the)g(default)f(is)g(sp)s(eci\014ed)g (at)h(compile-time)h(and)e(is)g(usually)330 920 y(`)p Fq($prefix/etc/shishi.conf)p Fw('.)225 1052 y Fu(\017)60 b Fq(SHISHI_HOME)21 b Fw(Sp)s(ecify)j(the)h(user)f(sp)s(eci\014c)g (directory)h(for)f(con\014guration)h(\014les,)h(tic)m(k)m(et)h(cac)m (he,)h(etc.)330 1162 y(Used)i(b)m(y)h(the)f(Shishi)f(library)-8 b(.)41 b(If)30 b(not)h(sp)s(eci\014ed,)e(it)i(is)g(computed)f(as)h Fq($HOME/.shishi)p Fw(.)225 1294 y Fu(\017)60 b Fq(SHISHI_USER)32 b Fw(Sp)s(ecify)j(the)g(default)g(principal)g(user)g(name.)55 b(Used)35 b(b)m(y)g(the)g(Shishi)f(library)-8 b(.)55 b(If)330 1404 y(not)31 b(sp)s(eci\014ed,)f(it)g(is)h(tak)m(en)g(from)f (the)h(en)m(vironmen)m(t)g(v)-5 b(ariable)31 b Fq(USER)p Fw(.)225 1536 y Fu(\017)60 b Fq(SHISHI_TICKETS)41 b Fw(Sp)s(ecify)j (the)g(\014le)h(name)g(of)f(the)h(tic)m(k)m(et)i(cac)m(he.)85 b(Used)45 b(b)m(y)f(the)h(Shishi)e(li-)330 1646 y(brary)-8 b(.)40 b(If)29 b(not)g(sp)s(eci\014ed,)h(it)g(will)f(b)s(e)g Fq($SHISHI_HOME/tickets)p Fw(,)24 b(or)30 b Fq($HOME/.shishi/tickets) 330 1755 y Fw(if)g Fq($SHISHI_HOME)d Fw(is)k(not)f(sp)s(eci\014ed.)150 1984 y Fv(4.10)68 b(Date)46 b(input)f(formats)150 2143 y Fw(First,)31 b(a)g(quote:)390 2276 y(Our)41 b(units)g(of)h(temp)s (oral)g(measuremen)m(t,)j(from)d(seconds)g(on)f(up)g(to)i(mon)m(ths,)h (are)f(so)390 2385 y(complicated,)30 b(asymmetrical)e(and)e(disjunctiv) m(e)h(so)g(as)g(to)h(mak)m(e)g(coheren)m(t)g(men)m(tal)g(rec)m(k-)390 2495 y(oning)37 b(in)h(time)g(all)g(but)f(imp)s(ossible.)61 b(Indeed,)38 b(had)f(some)h(t)m(yrannical)g(go)s(d)g(con)m(triv)m(ed) 390 2605 y(to)h(ensla)m(v)m(e)i(our)d(minds)f(to)j(time,)i(to)d(mak)m (e)h(it)f(all)g(but)f(imp)s(ossible)h(for)f(us)g(to)h(escap)s(e)390 2714 y(sub)5 b(jection)35 b(to)i(so)s(dden)d(routines)h(and)g (unpleasan)m(t)h(surprises,)f(he)g(could)h(hardly)f(ha)m(v)m(e)390 2824 y(done)h(b)s(etter)h(than)f(handing)g(do)m(wn)g(our)g(presen)m(t)h (system.)59 b(It)37 b(is)f(lik)m(e)i(a)f(set)g(of)g(trap)s(e-)390 2933 y(zoidal)27 b(building)d(blo)s(c)m(ks,)j(with)f(no)f(v)m(ertical)j (or)d(horizon)m(tal)i(surfaces,)g(lik)m(e)f(a)g(language)h(in)390 3043 y(whic)m(h)e(the)h(simplest)g(though)m(t)g(demands)f(ornate)h (constructions,)h(useless)f(particles)h(and)390 3153 y(length)m(y)34 b(circumlo)s(cutions.)51 b(Unlik)m(e)35 b(the)f(more)g(successful)f(patterns)h(of)f(language)j(and)390 3262 y(science,)28 b(whic)m(h)d(enable)g(us)g(to)h(face)g(exp)s (erience)g(b)s(oldly)f(or)g(at)h(least)g(lev)m(el-headedly)-8 b(,)29 b(our)390 3372 y(system)35 b(of)g(temp)s(oral)g(calculation)i (silen)m(tly)f(and)e(p)s(ersisten)m(tly)h(encourages)h(our)e(terror)390 3481 y(of)d(time.)396 3614 y(.)22 b(.)g(.)47 b(It)36 b(is)g(as)g(though)g(arc)m(hitects)i(had)d(to)i(measure)f(length)g(in)g (feet,)i(width)d(in)h(meters)390 3723 y(and)29 b(heigh)m(t)i(in)f (ells;)h(as)f(though)g(basic)g(instruction)g(man)m(uals)h(demanded)e(a) h(kno)m(wledge)390 3833 y(of)c(\014v)m(e)h(di\013eren)m(t)f(languages.) 41 b(It)26 b(is)g(no)g(w)m(onder)g(then)g(that)g(w)m(e)h(often)g(lo)s (ok)f(in)m(to)h(our)f(o)m(wn)390 3943 y(immediate)k(past)e(or)g (future,)h(last)g(T)-8 b(uesda)m(y)29 b(or)f(a)h(w)m(eek)g(from)f (Sunda)m(y)-8 b(,)28 b(with)g(feelings)i(of)390 4052 y(helpless)g(confusion.)46 b(.)23 b(.)f(.)390 4185 y(|Rob)s(ert)30 b(Grudin,)f Fi(Time)i(and)e(the)i(Art)f(of)h(Living)p Fw(.)275 4317 y(This)46 b(section)i(describ)s(es)e(the)h(textual)h (date)f(represen)m(tations)h(that)f(GNU)h(programs)e(accept.)150 4427 y(These)40 b(are)g(the)g(strings)f(y)m(ou,)k(as)d(a)g(user,)i(can) e(supply)f(as)h(argumen)m(ts)g(to)g(the)g(v)-5 b(arious)40 b(programs.)150 4536 y(The)30 b(C)g(in)m(terface)i(\(via)f(the)g Fq(parse_datetime)26 b Fw(function\))31 b(is)f(not)h(describ)s(ed)e (here.)150 4732 y Fl(4.10.1)63 b(General)41 b(date)g(syn)m(tax)150 4879 y Fw(A)36 b Fi(date)41 b Fw(is)35 b(a)h(string,)h(p)s(ossibly)d (empt)m(y)-8 b(,)38 b(con)m(taining)f(man)m(y)f(items)g(separated)g(b)m (y)f(whitespace.)56 b(The)150 4988 y(whitespace)31 b(ma)m(y)h(b)s(e)e (omitted)h(when)f(no)g(am)m(biguit)m(y)i(arises.)42 b(The)30 b(empt)m(y)h(string)g(means)f(the)h(b)s(egin-)150 5098 y(ning)d(of)h(to)s(da)m(y)g(\(i.e.,)i(midnigh)m(t\).)40 b(Order)28 b(of)h(the)f(items)i(is)e(immaterial.)42 b(A)29 b(date)g(string)f(ma)m(y)i(con)m(tain)150 5207 y(man)m(y)g(\015a)m(v)m (ors)i(of)e(items:)225 5340 y Fu(\017)60 b Fw(calendar)31 b(date)g(items)p eop end %%Page: 51 57 TeXDict begin 51 56 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(51)225 299 y Fu(\017)60 b Fw(time)31 b(of)g(da)m(y)f(items)225 447 y Fu(\017)60 b Fw(time)31 b(zone)g(items)225 596 y Fu(\017)60 b Fw(com)m(bined)31 b(date)g(and)e(time)i(of)g(da)m(y)g(items)225 744 y Fu(\017)60 b Fw(da)m(y)31 b(of)f(the)h(w)m(eek)g(items)225 893 y Fu(\017)60 b Fw(relativ)m(e)32 b(items)225 1042 y Fu(\017)60 b Fw(pure)29 b(n)m(um)m(b)s(ers.)150 1243 y(W)-8 b(e)32 b(describ)s(e)d(eac)m(h)j(of)e(these)h(item)g(t)m(yp)s(es)g(in)f(turn,) f(b)s(elo)m(w.)275 1406 y(A)39 b(few)g(ordinal)g(n)m(um)m(b)s(ers)f(ma) m(y)i(b)s(e)e(written)h(out)h(in)f(w)m(ords)f(in)h(some)h(con)m(texts.) 69 b(This)38 b(is)i(most)150 1515 y(useful)31 b(for)h(sp)s(ecifying)g (da)m(y)g(of)g(the)h(w)m(eek)g(items)f(or)g(relativ)m(e)i(items)f (\(see)g(b)s(elo)m(w\).)46 b(Among)32 b(the)h(most)150 1625 y(commonly)i(used)f(ordinal)h(n)m(um)m(b)s(ers,)g(the)g(w)m(ord)f (`)p Fq(last)p Fw(')g(stands)g(for)h Fu(\000)p Fw(1,)h(`)p Fq(this)p Fw(')e(stands)g(for)h(0,)i(and)150 1734 y(`)p Fq(first)p Fw(')28 b(and)f(`)p Fq(next)p Fw(')h(b)s(oth)g(stand)g(for)g (1.)41 b(Because)30 b(the)e(w)m(ord)g(`)p Fq(second)p Fw(')g(stands)g(for)g(the)h(unit)f(of)g(time)150 1844 y(there)37 b(is)g(no)g(w)m(a)m(y)h(to)g(write)f(the)h(ordinal)f(n)m(um) m(b)s(er)e(2,)40 b(but)c(for)h(con)m(v)m(enience)i(`)p Fq(third)p Fw(')d(stands)g(for)h(3,)150 1954 y(`)p Fq(fourth)p Fw(')d(for)g(4,)j(`)p Fq(fifth)p Fw(')d(for)g(5,)j(`)p Fq(sixth)p Fw(')d(for)h(6,)h(`)p Fq(seventh)p Fw(')e(for)g(7,)j(`)p Fq(eighth)p Fw(')d(for)g(8,)j(`)p Fq(ninth)p Fw(')d(for)g(9,)150 2063 y(`)p Fq(tenth)p Fw(')29 b(for)i(10,)g(`)p Fq(eleventh)p Fw(')e(for)h(11)h(and)f(`)p Fq(twelfth)p Fw(')f(for)h(12.)275 2226 y(When)24 b(a)g(mon)m(th)g(is)h(written)f(this)g(w)m(a)m(y)-8 b(,)27 b(it)e(is)g(still)g(considered)f(to)h(b)s(e)e(written)i(n)m (umerically)-8 b(,)27 b(instead)150 2335 y(of)k(b)s(eing)e(\\sp)s (elled)i(in)f(full";)h(this)f(c)m(hanges)h(the)g(allo)m(w)m(ed)h (strings.)275 2498 y(In)j(the)h(curren)m(t)f(implemen)m(tation,)k(only) d(English)g(is)f(supp)s(orted)f(for)i(w)m(ords)f(and)g(abbreviations) 150 2607 y(lik)m(e)d(`)p Fq(AM)p Fw(',)e(`)p Fq(DST)p Fw(',)g(`)p Fq(EST)p Fw(',)h(`)p Fq(first)p Fw(',)e(`)p Fq(January)p Fw(',)h(`)p Fq(Sunday)p Fw(',)f(`)p Fq(tomorrow)p Fw(',)g(and)h(`)p Fq(year)p Fw('.)275 2770 y(The)36 b(output)h(of)g (the)g Fq(date)f Fw(command)h(is)h(not)f(alw)m(a)m(ys)i(acceptable)g (as)e(a)h(date)f(string,)i(not)f(only)150 2880 y(b)s(ecause)c(of)g(the) g(language)i(problem,)e(but)f(also)i(b)s(ecause)f(there)g(is)g(no)g (standard)f(meaning)i(for)e(time)150 2989 y(zone)38 b(items)h(lik)m(e)g (`)p Fq(IST)p Fw('.)62 b(When)37 b(using)h Fq(date)e Fw(to)i(generate)i(a)e(date)g(string)g(in)m(tended)f(to)i(b)s(e)e (parsed)150 3099 y(later,)28 b(sp)s(ecify)d(a)g(date)h(format)g(that)g (is)f(indep)s(enden)m(t)g(of)g(language)i(and)e(that)g(do)s(es)h(not)f (use)g(time)h(zone)150 3208 y(items)31 b(other)g(than)f(`)p Fq(UTC)p Fw(')g(and)f(`)p Fq(Z)p Fw('.)41 b(Here)31 b(are)g(some)g(w)m (a)m(ys)g(to)g(do)f(this:)390 3371 y Fq($)47 b(LC_ALL=C)f(TZ=UTC0)g (date)390 3481 y(Mon)h(Mar)95 b(1)47 b(00:21:42)f(UTC)g(2004)390 3590 y($)h(TZ=UTC0)f(date)h(+'\045Y-\045m-\045d)e(\045H:\045M:\045SZ') 390 3700 y(2004-03-01)g(00:21:42Z)390 3809 y($)i(date)g(--rfc-3339=ns) 92 b(#)47 b(--rfc-3339)e(is)j(a)f(GNU)g(extension.)390 3919 y(2004-02-29)e(16:21:42.692722128-08:00)390 4029 y($)i(date)g(--rfc-2822)93 b(#)47 b(a)h(GNU)f(extension)390 4138 y(Sun,)g(29)g(Feb)g(2004)f(16:21:42)g(-0800)390 4248 y($)h(date)g(+'\045Y-\045m-\045d)e(\045H:\045M:\045S)h(\045z')94 b(#)48 b(\045z)f(is)g(a)h(GNU)e(extension.)390 4357 y(2004-02-29)f (16:21:42)h(-0800)390 4467 y($)h(date)g(+'@\045s.\045N')93 b(#)48 b(\045s)f(and)g(\045N)g(are)g(GNU)g(extensions.)390 4576 y(@1078100502.692722128)275 4739 y Fw(Alphab)s(etic)32 b(case)g(is)g(completely)i(ignored)e(in)f(dates.)46 b(Commen)m(ts)32 b(ma)m(y)g(b)s(e)f(in)m(tro)s(duced)g(b)s(et)m(w)m(een)150 4849 y(round)h(paren)m(theses,)k(as)e(long)h(as)f(included)f(paren)m (theses)h(are)h(prop)s(erly)e(nested.)51 b(Hyphens)33 b(not)h(fol-)150 4958 y(lo)m(w)m(ed)e(b)m(y)e(a)h(digit)g(are)f(curren) m(tly)h(ignored.)41 b(Leading)30 b(zeros)h(on)g(n)m(um)m(b)s(ers)e(are) h(ignored.)275 5121 y(In)m(v)-5 b(alid)38 b(dates)g(lik)m(e)h(`)p Fq(2005-02-29)p Fw(')d(or)i(times)g(lik)m(e)i(`)p Fq(24:00)p Fw(')d(are)h(rejected.)64 b(In)37 b(the)h(t)m(ypical)i(case)150 5230 y(of)35 b(a)h(host)f(that)g(do)s(es)g(not)h(supp)s(ort)d(leap)i (seconds,)i(a)e(time)h(lik)m(e)g(`)p Fq(23:59:60)p Fw(')e(is)h (rejected)h(ev)m(en)f(if)g(it)150 5340 y(corresp)s(onds)29 b(to)i(a)g(v)-5 b(alid)31 b(leap)f(second.)p eop end %%Page: 52 58 TeXDict begin 52 57 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(52)150 299 y Fl(4.10.2)63 b(Calendar)40 b(date)h(items)150 446 y Fw(A)36 b Fi(calendar)h(date)f (item)h Fw(sp)s(eci\014es)f(a)g(da)m(y)g(of)h(the)f(y)m(ear.)58 b(It)36 b(is)g(sp)s(eci\014ed)g(di\013eren)m(tly)-8 b(,)39 b(dep)s(ending)34 b(on)150 555 y(whether)f(the)i(mon)m(th)f(is)g(sp)s (eci\014ed)f(n)m(umerically)i(or)f(literally)-8 b(.)54 b(All)34 b(these)h(strings)f(sp)s(ecify)f(the)i(same)150 665 y(calendar)c(date:)390 800 y Fq(1972-09-24)236 b(#)47 b(ISO)g(8601.)390 909 y(72-9-24)380 b(#)47 b(Assume)f(19xx)h(for)g(69)g (through)f(99,)1106 1019 y(#)h(20xx)g(for)g(00)g(through)f(68.)390 1128 y(72-09-24)332 b(#)47 b(Leading)f(zeros)h(are)f(ignored.)390 1238 y(9/24/72)380 b(#)47 b(Common)f(U.S.)h(writing.)390 1347 y(24)g(September)e(1972)390 1457 y(24)i(Sept)g(72)238 b(#)47 b(September)f(has)h(a)g(special)f(abbreviation.)390 1567 y(24)h(Sep)g(72)286 b(#)47 b(Three-letter)e(abbreviations)f (always)i(allowed.)390 1676 y(Sep)h(24,)g(1972)390 1786 y(24-sep-72)390 1895 y(24sep72)275 2030 y Fw(The)27 b(y)m(ear)i(can)g (also)g(b)s(e)f(omitted.)41 b(In)27 b(this)h(case,)i(the)f(last)g(sp)s (eci\014ed)e(y)m(ear)i(is)f(used,)h(or)f(the)g(curren)m(t)150 2139 y(y)m(ear)j(if)g(none.)40 b(F)-8 b(or)31 b(example:)390 2274 y Fq(9/24)390 2384 y(sep)47 b(24)275 2518 y Fw(Here)30 b(are)h(the)g(rules.)275 2653 y(F)-8 b(or)35 b(n)m(umeric)g(mon)m(ths,) g(the)g(ISO)f(8601)j(format)e(`)p Fh(year)p Fq(-)p Fh(month)p Fq(-)p Fh(day)p Fw(')c(is)k(allo)m(w)m(ed,)j(where)c Fi(y)m(ear)42 b Fw(is)150 2762 y(an)m(y)30 b(p)s(ositiv)m(e)g(n)m(um)m (b)s(er,)e Fi(mon)m(th)h Fw(is)g(a)h(n)m(um)m(b)s(er)e(b)s(et)m(w)m (een)i(01)g(and)e(12,)j(and)d Fi(da)m(y)38 b Fw(is)29 b(a)g(n)m(um)m(b)s(er)f(b)s(et)m(w)m(een)150 2872 y(01)37 b(and)e(31.)59 b(A)36 b(leading)g(zero)h(m)m(ust)f(b)s(e)f(presen)m(t)h (if)g(a)h(n)m(um)m(b)s(er)d(is)i(less)h(than)e(ten.)58 b(If)36 b Fi(y)m(ear)43 b Fw(is)36 b(68)h(or)150 2981 y(smaller,)j(then)d(2000)i(is)e(added)g(to)h(it;)k(otherwise,)d(if)f Fi(y)m(ear)44 b Fw(is)38 b(less)f(than)h(100,)i(then)d(1900)i(is)f (added)150 3091 y(to)h(it.)65 b(The)37 b(construct)i(`)p Fh(month)p Fq(/)p Fh(day)p Fq(/)p Fh(year)p Fw(',)e(p)s(opular)g(in)h (the)g(United)g(States,)k(is)c(accepted.)65 b(Also)150 3200 y(`)p Fh(month)p Fq(/)p Fh(day)p Fw(',)29 b(omitting)i(the)g(y)m (ear.)275 3335 y(Literal)25 b(mon)m(ths)g(ma)m(y)g(b)s(e)f(sp)s(elled)h (out)g(in)f(full:)38 b(`)p Fq(January)p Fw(',)24 b(`)p Fq(February)p Fw(',)h(`)p Fq(March)p Fw(',)g(`)p Fq(April)p Fw(',)g(`)p Fq(May)p Fw(',)150 3445 y(`)p Fq(June)p Fw(',)j(`)p Fq(July)p Fw(',)g(`)p Fq(August)p Fw(',)f(`)p Fq(September)p Fw(',)f(`)p Fq(October)p Fw(',)i(`)p Fq(November)p Fw(')d(or)j(`)p Fq(December)p Fw('.)38 b(Literal)29 b(mon)m(ths)150 3554 y(ma)m(y)h(b)s(e)e(abbreviated)i(to)f(their)g(\014rst)g(three)g (letters,)i(p)s(ossibly)d(follo)m(w)m(ed)j(b)m(y)e(an)g(abbreviating)g (dot.)41 b(It)150 3664 y(is)30 b(also)i(p)s(ermitted)e(to)h(write)f(`)p Fq(Sept)p Fw(')g(instead)h(of)f(`)p Fq(September)p Fw('.)275 3798 y(When)20 b(mon)m(ths)h(are)h(written)f(literally)-8 b(,)25 b(the)d(calendar)f(date)h(ma)m(y)f(b)s(e)g(giv)m(en)h(as)f(an)m (y)h(of)f(the)g(follo)m(wing:)390 3933 y Fh(day)47 b(month)f(year)390 4042 y(day)h(month)390 4152 y(month)f(day)h(year)390 4262 y(day)p Fq(-)p Fh(month)p Fq(-)p Fh(year)275 4396 y Fw(Or,)29 b(omitting)j(the)f(y)m(ear:)390 4531 y Fh(month)46 b(day)150 4730 y Fl(4.10.3)63 b(Time)42 b(of)f(da)m(y)f(items)150 4877 y Fw(A)23 b Fi(time)h(of)f(da)m(y)h(item)g Fw(in)e(date)i(strings) f(sp)s(eci\014es)g(the)g(time)h(on)f(a)g(giv)m(en)h(da)m(y)-8 b(.)39 b(Here)24 b(are)g(some)f(examples,)150 4986 y(all)31 b(of)g(whic)m(h)f(represen)m(t)g(the)h(same)g(time:)390 5121 y Fq(20:02:00.000000)390 5230 y(20:02)390 5340 y(8:02pm)p eop end %%Page: 53 59 TeXDict begin 53 58 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(53)390 299 y Fq(20:02-0500)284 b(#)47 b(In)g(EST)g(\(U.S.)g(Eastern)e(Standard)h(Time\).)275 434 y Fw(More)32 b(generally)-8 b(,)34 b(the)e(time)h(of)f(da)m(y)g(ma) m(y)g(b)s(e)f(giv)m(en)i(as)f(`)p Fh(hour)p Fq(:)p Fh(minute)p Fq(:)p Fh(second)p Fw(',)c(where)k Fi(hour)37 b Fw(is)150 544 y(a)27 b(n)m(um)m(b)s(er)f(b)s(et)m(w)m(een)i(0)g(and)e(23,)j Fi(min)m(ute)j Fw(is)27 b(a)h(n)m(um)m(b)s(er)e(b)s(et)m(w)m(een)h(0)h (and)e(59,)j(and)e Fi(second)k Fw(is)c(a)g(n)m(um)m(b)s(er)150 654 y(b)s(et)m(w)m(een)e(0)g(and)f(59)h(p)s(ossibly)f(follo)m(w)m(ed)i (b)m(y)f(`)p Fq(.)p Fw(')f(or)h(`)p Fq(,)p Fw(')g(and)f(a)h(fraction)g (con)m(taining)h(one)f(or)f(more)h(digits.)150 763 y(Alternativ)m(ely) -8 b(,)37 b(`)p Fq(:)p Fh(second)p Fw(')31 b(can)i(b)s(e)f(omitted,)j (in)e(whic)m(h)f(case)i(it)g(is)f(tak)m(en)h(to)f(b)s(e)g(zero.)49 b(On)32 b(the)h(rare)150 873 y(hosts)d(that)h(supp)s(ort)e(leap)i (seconds,)f Fi(second)k Fw(ma)m(y)d(b)s(e)f(60.)275 1008 y(If)d(the)g(time)h(is)g(follo)m(w)m(ed)h(b)m(y)e(`)p Fq(am)p Fw(')h(or)f(`)p Fq(pm)p Fw(')g(\(or)h(`)p Fq(a.m.)p Fw(')f(or)h(`)p Fq(p.m.)p Fw('\),)g Fi(hour)33 b Fw(is)27 b(restricted)h(to)g(run)e(from)150 1118 y(1)35 b(to)h(12,)g(and)e(`)p Fq(:)p Fh(minute)p Fw(')g(ma)m(y)h(b)s(e)f(omitted)i(\(tak)m(en)g(to)f (b)s(e)f(zero\).)55 b(`)p Fq(am)p Fw(')35 b(indicates)g(the)g(\014rst)f (half)h(of)150 1228 y(the)h(da)m(y)-8 b(,)39 b(`)p Fq(pm)p Fw(')d(indicates)i(the)e(second)h(half)f(of)g(the)h(da)m(y)-8 b(.)59 b(In)36 b(this)g(notation,)j(12)e(is)f(the)h(predecessor)150 1337 y(of)f(1:)51 b(midnigh)m(t)36 b(is)g(`)p Fq(12am)p Fw(')f(while)g(no)s(on)g(is)h(`)p Fq(12pm)p Fw('.)55 b(\(This)36 b(is)f(the)h(zero-orien)m(ted)i(in)m(terpretation)f(of)150 1447 y(`)p Fq(12am)p Fw(')32 b(and)f(`)p Fq(12pm)p Fw(',)i(as)g(opp)s (osed)e(to)i(the)g(old)f(tradition)h(deriv)m(ed)g(from)f(Latin)g(whic)m (h)g(uses)g(`)p Fq(12m)p Fw(')g(for)150 1556 y(no)s(on)e(and)g(`)p Fq(12pm)p Fw(')f(for)h(midnigh)m(t.\))275 1692 y(The)e(time)i(ma)m(y)f (alternativ)m(ely)j(b)s(e)c(follo)m(w)m(ed)j(b)m(y)e(a)g(time)h(zone)f (correction,)i(expressed)d(as)i(`)p Fh(shhmm)p Fw(',)150 1802 y(where)k Fi(s)39 b Fw(is)c(`)p Fq(+)p Fw(')g(or)f(`)p Fq(-)p Fw(',)j Fi(hh)c Fw(is)i(a)g(n)m(um)m(b)s(er)f(of)h(zone)g(hours) f(and)g Fi(mm)h Fw(is)f(a)i(n)m(um)m(b)s(er)d(of)i(zone)h(min)m(utes.) 150 1911 y(The)25 b(zone)h(min)m(utes)g(term,)g Fi(mm)p Fw(,)g(ma)m(y)g(b)s(e)f(omitted,)j(in)d(whic)m(h)g(case)i(the)e(one-)h (or)g(t)m(w)m(o-digit)i(correction)150 2021 y(is)41 b(in)m(terpreted)h (as)g(a)f(n)m(um)m(b)s(er)f(of)i(hours.)72 b(Y)-8 b(ou)42 b(can)g(also)g(separate)g Fi(hh)e Fw(from)h Fi(mm)g Fw(with)g(a)h (colon.)150 2130 y(When)32 b(a)g(time)h(zone)g(correction)g(is)g(giv)m (en)g(this)f(w)m(a)m(y)-8 b(,)34 b(it)e(forces)h(in)m(terpretation)g (of)g(the)f(time)h(relativ)m(e)150 2240 y(to)j(Co)s(ordinated)e(Univ)m (ersal)i(Time)f(\(UTC\),)g(o)m(v)m(erriding)g(an)m(y)h(previous)e(sp)s (eci\014cation)i(for)e(the)h(time)150 2350 y(zone)j(or)f(the)h(lo)s (cal)g(time)g(zone.)62 b(F)-8 b(or)38 b(example,)i(`)p Fq(+0530)p Fw(')c(and)h(`)p Fq(+05:30)p Fw(')f(b)s(oth)g(stand)h(for)g (the)g(time)150 2459 y(zone)j(5.5)f(hours)f(ahead)h(of)g(UTC)f(\(e.g.,) 43 b(India\).)66 b(This)38 b(is)h(the)g(b)s(est)g(w)m(a)m(y)g(to)h(sp)s (ecify)e(a)i(time)f(zone)150 2569 y(correction)32 b(b)m(y)e(fractional) i(parts)e(of)g(an)h(hour.)39 b(The)30 b(maxim)m(um)h(zone)g(correction) g(is)g(24)g(hours.)275 2704 y(Either)f(`)p Fq(am)p Fw('/`)p Fq(pm)p Fw(')h(or)f(a)h(time)g(zone)g(correction)h(ma)m(y)e(b)s(e)g(sp) s(eci\014ed,)g(but)g(not)g(b)s(oth.)150 2905 y Fl(4.10.4)63 b(Time)42 b(zone)f(items)150 3052 y Fw(A)35 b Fi(time)h(zone)g(item)g Fw(sp)s(eci\014es)e(an)h(in)m(ternational)i(time)f(zone,)h(indicated)f (b)m(y)f(a)g(small)h(set)f(of)h(letters,)150 3161 y(e.g.,)k(`)p Fq(UTC)p Fw(')c(or)g(`)p Fq(Z)p Fw(')h(for)g(Co)s(ordinated)f(Univ)m (ersal)h(Time.)60 b(An)m(y)36 b(included)g(p)s(erio)s(ds)f(are)i (ignored.)60 b(By)150 3271 y(follo)m(wing)46 b(a)f(non-da)m(yligh)m (t-sa)m(ving)j(time)d(zone)h(b)m(y)e(the)h(string)g(`)p Fq(DST)p Fw(')f(in)h(a)g(separate)h(w)m(ord)e(\(that)150 3380 y(is,)39 b(separated)f(b)m(y)f(some)h(white)f(space\),)k(the)c (corresp)s(onding)f(da)m(yligh)m(t)j(sa)m(ving)g(time)f(zone)g(ma)m(y)g (b)s(e)150 3490 y(sp)s(eci\014ed.)62 b(Alternativ)m(ely)-8 b(,)43 b(a)38 b(non-da)m(yligh)m(t-sa)m(ving)j(time)d(zone)h(can)f(b)s (e)f(follo)m(w)m(ed)j(b)m(y)d(a)i(time)f(zone)150 3600 y(correction,)51 b(to)46 b(add)f(the)g(t)m(w)m(o)i(v)-5 b(alues.)86 b(This)45 b(is)g(normally)h(done)f(only)h(for)f(`)p Fq(UTC)p Fw(';)53 b(for)45 b(example,)150 3709 y(`)p Fq(UTC+05:30)p Fw(')28 b(is)j(equiv)-5 b(alen)m(t)32 b(to)f(`)p Fq(+05:30)p Fw('.)275 3845 y(Time)39 b(zone)i(items)f(other) g(than)g(`)p Fq(UTC)p Fw(')f(and)h(`)p Fq(Z)p Fw(')g(are)g(obsolescen)m (t)i(and)d(are)h(not)g(recommended,)150 3954 y(b)s(ecause)33 b(they)h(are)f(am)m(biguous;)i(for)e(example,)i(`)p Fq(EST)p Fw(')e(has)g(a)h(di\013eren)m(t)g(meaning)f(in)g(Australia)h(than)150 4064 y(in)26 b(the)g(United)g(States.)40 b(Instead,)27 b(it's)g(b)s(etter)f(to)h(use)e(unam)m(biguous)g(n)m(umeric)h(time)h (zone)g(corrections)150 4174 y(lik)m(e)32 b(`)p Fq(-0500)p Fw(',)d(as)i(describ)s(ed)e(in)h(the)h(previous)f(section.)275 4309 y(If)42 b(neither)h(a)g(time)g(zone)h(item)f(nor)g(a)g(time)g (zone)h(correction)g(is)f(supplied,)i(time)e(stamps)g(are)150 4419 y(in)m(terpreted)38 b(using)f(the)h(rules)f(of)g(the)h(default)g (time)g(zone)g(\(see)g(Section)h(4.10.10)h([Sp)s(ecifying)d(time)150 4528 y(zone)31 b(rules],)g(page)g(56\).)150 4729 y Fl(4.10.5)63 b(Com)m(bined)41 b(date)g(and)g(time)g(of)h(da)m(y)e(items)150 4876 y Fw(The)c(ISO)g(8601)j(date)e(and)f(time)i(of)f(da)m(y)g (extended)g(format)g(consists)g(of)g(an)g(ISO)f(8601)i(date,)i(a)d(`)p Fq(T)p Fw(')150 4985 y(c)m(haracter)32 b(separator,)g(and)e(an)h(ISO)f (8601)j(time)e(of)g(da)m(y)-8 b(.)43 b(This)30 b(format)h(is)g(also)h (recognized)g(if)f(the)g(`)p Fq(T)p Fw(')150 5095 y(is)f(replaced)h(b)m (y)g(a)f(space.)275 5230 y(In)40 b(this)h(format,)k(the)c(time)h(of)f (da)m(y)h(should)e(use)h(24-hour)g(notation.)75 b(F)-8 b(ractional)43 b(seconds)f(are)150 5340 y(allo)m(w)m(ed,)35 b(with)d(either)h(comma)g(or)f(p)s(erio)s(d)f(preceding)h(the)h (fraction.)47 b(ISO)31 b(8601)j(fractional)g(min)m(utes)p eop end %%Page: 54 60 TeXDict begin 54 59 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(54)150 299 y(and)35 b(hours)f(are)h(not)h(supp)s(orted.)53 b(T)m(ypically)-8 b(,)38 b(hosts)e(supp)s(ort)d(nanosecond)i(timestamp)h(resolution;)150 408 y(excess)31 b(precision)g(is)f(silen)m(tly)i(discarded.)275 556 y(Here)e(are)h(some)g(examples:)390 703 y Fq (2012-09-24T20:02:00.052-)o(0500)390 813 y(2012-12-31T23:59:59,9999)o (9999)o(9+11)o(00)390 922 y(1970-01-01)45 b(00:00Z)150 1134 y Fl(4.10.6)63 b(Da)m(y)40 b(of)i(w)m(eek)e(items)150 1281 y Fw(The)28 b(explicit)i(men)m(tion)f(of)f(a)h(da)m(y)g(of)f(the)h (w)m(eek)g(will)g(forw)m(ard)f(the)h(date)g(\(only)f(if)h(necessary\))g (to)g(reac)m(h)150 1391 y(that)i(da)m(y)g(of)f(the)h(w)m(eek)g(in)f (the)h(future.)275 1538 y(Da)m(ys)c(of)g(the)f(w)m(eek)h(ma)m(y)g(b)s (e)f(sp)s(elled)g(out)h(in)f(full:)38 b(`)p Fq(Sunday)p Fw(',)27 b(`)p Fq(Monday)p Fw(',)f(`)p Fq(Tuesday)p Fw(',)g(`)p Fq(Wednesday)p Fw(',)150 1648 y(`)p Fq(Thursday)p Fw(',)35 b(`)p Fq(Friday)p Fw(')f(or)h(`)p Fq(Saturday)p Fw('.)53 b(Da)m(ys)37 b(ma)m(y)e(b)s(e)g(abbreviated)h(to)f(their)h(\014rst)e (three)i(letters,)150 1758 y(optionally)h(follo)m(w)m(ed)g(b)m(y)e(a)h (p)s(erio)s(d.)55 b(The)35 b(sp)s(ecial)h(abbreviations)g(`)p Fq(Tues)p Fw(')e(for)i(`)p Fq(Tuesday)p Fw(',)f(`)p Fq(Wednes)p Fw(')150 1867 y(for)30 b(`)p Fq(Wednesday)p Fw(')e(and)i(`)p Fq(Thur)p Fw(')g(or)g(`)p Fq(Thurs)p Fw(')g(for)g(`)p Fq(Thursday)p Fw(')f(are)h(also)i(allo)m(w)m(ed.)275 2015 y(A)h(n)m(um)m(b)s(er)f(ma)m(y)h(precede)h(a)f(da)m(y)h(of)f(the)g (w)m(eek)h(item)g(to)g(mo)m(v)m(e)h(forw)m(ard)d(supplemen)m(tary)h(w)m (eeks.)150 2124 y(It)e(is)h(b)s(est)f(used)f(in)h(expression)g(lik)m(e) i(`)p Fq(third)c(monday)p Fw('.)42 b(In)31 b(this)g(con)m(text,)j(`)p Fq(last)29 b Fh(day)p Fw(')i(or)g(`)p Fq(next)f Fh(day)p Fw(')150 2234 y(is)39 b(also)h(acceptable;)46 b(they)39 b(mo)m(v)m(e)h(one)g(w)m(eek)g(b)s(efore)e(or)h(after)h(the)f(da)m(y)h (that)f Fi(da)m(y)47 b Fw(b)m(y)39 b(itself)h(w)m(ould)150 2343 y(represen)m(t.)275 2491 y(A)30 b(comma)h(follo)m(wing)h(a)f(da)m (y)f(of)h(the)g(w)m(eek)g(item)g(is)f(ignored.)150 2703 y Fl(4.10.7)63 b(Relativ)m(e)39 b(items)j(in)f(date)f(strings)150 2850 y Fi(Relativ)m(e)31 b(items)h Fw(adjust)c(a)g(date)h(\(or)f(the)h (curren)m(t)f(date)g(if)g(none\))h(forw)m(ard)e(or)h(bac)m(kw)m(ard.)41 b(The)28 b(e\013ects)150 2959 y(of)j(relativ)m(e)h(items)f(accum)m (ulate.)43 b(Here)30 b(are)h(some)g(examples:)390 3107 y Fq(1)47 b(year)390 3216 y(1)g(year)g(ago)390 3326 y(3)g(years)390 3435 y(2)g(days)275 3583 y Fw(The)24 b(unit)g(of)g(time)i(displacemen)m (t)f(ma)m(y)g(b)s(e)f(selected)i(b)m(y)f(the)f(string)h(`)p Fq(year)p Fw(')f(or)g(`)p Fq(month)p Fw(')g(for)g(mo)m(ving)150 3692 y(b)m(y)31 b(whole)g(y)m(ears)h(or)f(mon)m(ths.)43 b(These)31 b(are)g(fuzzy)h(units,)f(as)g(y)m(ears)h(and)e(mon)m(ths)h (are)h(not)f(all)h(of)f(equal)150 3802 y(duration.)40 b(More)31 b(precise)f(units)g(are)g(`)p Fq(fortnight)p Fw(')e(whic)m(h)i(is)g(w)m(orth)g(14)h(da)m(ys,)g(`)p Fq(week)p Fw(')e(w)m(orth)h(7)g(da)m(ys,)150 3912 y(`)p Fq(day)p Fw(')38 b(w)m(orth)g(24)h(hours,)g(`)p Fq(hour)p Fw(')f(w)m(orth)g(60)h(min)m(utes,)i(`)p Fq(minute)p Fw(')c(or)h(`)p Fq(min)p Fw(')g(w)m(orth)g(60)h(seconds,)i(and)150 4021 y(`)p Fq(second)p Fw(')29 b(or)i(`)p Fq(sec)p Fw(')f(w)m(orth)g (one)h(second.)40 b(An)30 b(`)p Fq(s)p Fw(')h(su\016x)e(on)i(these)f (units)g(is)h(accepted)g(and)f(ignored.)275 4169 y(The)25 b(unit)h(of)g(time)h(ma)m(y)f(b)s(e)g(preceded)f(b)m(y)h(a)h(m)m (ultiplier,)g(giv)m(en)g(as)g(an)f(optionally)h(signed)f(n)m(um)m(b)s (er.)150 4278 y(Unsigned)21 b(n)m(um)m(b)s(ers)g(are)h(tak)m(en)h(as)f (p)s(ositiv)m(ely)h(signed.)38 b(No)23 b(n)m(um)m(b)s(er)d(at)j(all)g (implies)f(1)g(for)g(a)g(m)m(ultiplier.)150 4388 y(F)-8 b(ollo)m(wing)23 b(a)e(relativ)m(e)h(item)f(b)m(y)f(the)h(string)f(`)p Fq(ago)p Fw(')g(is)h(equiv)-5 b(alen)m(t)21 b(to)h(preceding)e(the)g (unit)g(b)m(y)h(a)f(m)m(ultiplier)150 4497 y(with)30 b(v)-5 b(alue)31 b Fu(\000)p Fw(1.)275 4645 y(The)36 b(string)h(`)p Fq(tomorrow)p Fw(')f(is)h(w)m(orth)g(one)h(da)m(y)f(in)g (the)g(future)g(\(equiv)-5 b(alen)m(t)39 b(to)f(`)p Fq(day)p Fw('\),)h(the)e(string)150 4754 y(`)p Fq(yesterday)p Fw(')28 b(is)j(w)m(orth)f(one)h(da)m(y)g(in)f(the)g(past)h(\(equiv)-5 b(alen)m(t)32 b(to)f(`)p Fq(day)f(ago)p Fw('\).)275 4902 y(The)38 b(strings)g(`)p Fq(now)p Fw(')g(or)h(`)p Fq(today)p Fw(')f(are)h(relativ)m(e)i(items)e(corresp)s(onding)f(to)h(zero-v)-5 b(alued)40 b(time)f(dis-)150 5011 y(placemen)m(t,)30 b(these)f(strings)f(come)h(from)f(the)g(fact)h(a)g(zero-v)-5 b(alued)29 b(time)g(displacemen)m(t)h(represen)m(ts)e(the)150 5121 y(curren)m(t)34 b(time)h(when)e(not)i(otherwise)g(c)m(hanged)f(b)m (y)h(previous)e(items.)53 b(They)34 b(ma)m(y)h(b)s(e)f(used)f(to)i (stress)150 5230 y(other)30 b(items,)g(lik)m(e)h(in)f(`)p Fq(12:00)f(today)p Fw('.)39 b(The)29 b(string)h(`)p Fq(this)p Fw(')f(also)h(has)f(the)h(meaning)g(of)g(a)g(zero-v)-5 b(alued)150 5340 y(time)31 b(displacemen)m(t,)h(but)d(is)i(preferred)e (in)h(date)h(strings)f(lik)m(e)i(`)p Fq(this)d(thursday)p Fw('.)p eop end %%Page: 55 61 TeXDict begin 55 60 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(55)275 299 y(When)38 b(a)h(relativ)m(e)i(item)f(causes)f(the)g(resulting)g(date)g(to)h (cross)e(a)i(b)s(oundary)c(where)j(the)g(clo)s(c)m(ks)150 408 y(w)m(ere)32 b(adjusted,)g(t)m(ypically)i(for)e(da)m(yligh)m(t)h (sa)m(ving)g(time,)h(the)e(resulting)g(date)g(and)g(time)g(are)h (adjusted)150 518 y(accordingly)-8 b(.)275 651 y(The)28 b(fuzz)h(in)g(units)f(can)h(cause)h(problems)e(with)h(relativ)m(e)i (items.)41 b(F)-8 b(or)30 b(example,)g(`)p Fq(2003-07-31)e(-1)150 761 y(month)p Fw(')j(migh)m(t)j(ev)-5 b(aluate)34 b(to)f(2003-07-01,)38 b(b)s(ecause)33 b(2003-06-31)j(is)d(an)g(in)m(v)-5 b(alid)33 b(date.)48 b(T)-8 b(o)33 b(determine)150 870 y(the)28 b(previous)g(mon)m(th)g(more)g(reliably)-8 b(,)30 b(y)m(ou)e(can)h(ask) f(for)g(the)g(mon)m(th)g(b)s(efore)g(the)g(15th)h(of)f(the)g(curren)m (t)150 980 y(mon)m(th.)41 b(F)-8 b(or)31 b(example:)390 1113 y Fq($)47 b(date)g(-R)390 1223 y(Thu,)g(31)g(Jul)g(2003)f (13:02:39)g(-0700)390 1333 y($)h(date)g(--date='-1)e(month')h(+'Last)g (month)h(was)g(\045B?')390 1442 y(Last)g(month)f(was)h(July?)390 1552 y($)g(date)g(--date="$\(date)d(+\045Y-\045m-15\))h(-1)i(month")f (+'Last)g(month)h(was)g(\045B!')390 1661 y(Last)g(month)f(was)h(June!) 275 1795 y Fw(Also,)34 b(tak)m(e)h(care)f(when)f(manipulating)g(dates)h (around)e(clo)s(c)m(k)j(c)m(hanges)f(suc)m(h)f(as)g(da)m(yligh)m(t)i (sa)m(ving)150 1904 y(leaps.)49 b(In)33 b(a)g(few)g(cases)h(these)g(ha) m(v)m(e)g(added)e(or)i(subtracted)f(as)g(m)m(uc)m(h)g(as)g(24)h(hours)e (from)h(the)g(clo)s(c)m(k,)150 2014 y(so)d(it)h(is)f(often)g(wise)h(to) f(adopt)h(univ)m(ersal)f(time)h(b)m(y)f(setting)h(the)f Fq(TZ)f Fw(en)m(vironmen)m(t)i(v)-5 b(ariable)31 b(to)g(`)p Fq(UTC0)p Fw(')150 2123 y(b)s(efore)f(em)m(barking)h(on)f(calendrical)i (calculations.)150 2320 y Fl(4.10.8)63 b(Pure)41 b(n)m(um)m(b)s(ers)h (in)f(date)g(strings)150 2467 y Fw(The)36 b(precise)i(in)m (terpretation)g(of)f(a)h(pure)e(decimal)i(n)m(um)m(b)s(er)d(dep)s(ends) g(on)i(the)h(con)m(text)g(in)f(the)g(date)150 2577 y(string.)275 2710 y(If)32 b(the)i(decimal)g(n)m(um)m(b)s(er)f(is)g(of)h(the)f(form)g Fi(yyyy)8 b(mmdd)35 b Fw(and)e(no)g(other)h(calendar)g(date)g(item)g (\(see)150 2819 y(Section)39 b(4.10.2)i([Calendar)d(date)h(items],)i (page)e(52\))h(app)s(ears)d(b)s(efore)h(it)h(in)f(the)h(date)g(string,) h(then)150 2929 y Fi(yyyy)j Fw(is)34 b(read)h(as)g(the)g(y)m(ear,)j Fi(mm)c Fw(as)h(the)g(mon)m(th)g(n)m(um)m(b)s(er)f(and)g Fi(dd)j Fw(as)e(the)h(da)m(y)f(of)g(the)g(mon)m(th,)h(for)150 3039 y(the)31 b(sp)s(eci\014ed)e(calendar)i(date.)275 3172 y(If)24 b(the)h(decimal)h(n)m(um)m(b)s(er)d(is)i(of)g(the)g(form)f Fi(hhmm)f Fw(and)i(no)f(other)h(time)h(of)f(da)m(y)g(item)g(app)s(ears) f(b)s(efore)150 3281 y(it)33 b(in)g(the)g(date)h(string,)g(then)e Fi(hh)g Fw(is)h(read)g(as)g(the)g(hour)f(of)h(the)g(da)m(y)h(and)e Fi(mm)g Fw(as)h(the)h(min)m(ute)f(of)g(the)150 3391 y(hour,)d(for)g (the)g(sp)s(eci\014ed)g(time)h(of)g(da)m(y)-8 b(.)41 b Fi(mm)30 b Fw(can)h(also)g(b)s(e)f(omitted.)275 3524 y(If)36 b(b)s(oth)g(a)h(calendar)g(date)h(and)e(a)h(time)g(of)g(da)m(y) g(app)s(ear)g(to)g(the)g(left)g(of)g(a)g(n)m(um)m(b)s(er)f(in)g(the)h (date)150 3634 y(string,)31 b(but)e(no)i(relativ)m(e)h(item,)f(then)f (the)h(n)m(um)m(b)s(er)e(o)m(v)m(errides)i(the)g(y)m(ear.)150 3831 y Fl(4.10.9)63 b(Seconds)42 b(since)f(the)g(Ep)s(o)s(c)m(h)150 3978 y Fw(If)25 b(y)m(ou)g(precede)h(a)f(n)m(um)m(b)s(er)f(with)h(`)p Fq(@)p Fw(',)i(it)f(represen)m(ts)f(an)g(in)m(ternal)h(time)g(stamp)f (as)h(a)f(coun)m(t)h(of)g(seconds.)150 4087 y(The)c(n)m(um)m(b)s(er)f (can)i(con)m(tain)h(an)f(in)m(ternal)g(decimal)g(p)s(oin)m(t)g (\(either)g(`)p Fq(.)p Fw(')g(or)g(`)p Fq(,)p Fw('\);)j(an)m(y)d (excess)g(precision)g(not)150 4197 y(supp)s(orted)h(b)m(y)h(the)h(in)m (ternal)h(represen)m(tation)g(is)e(truncated)h(to)m(w)m(ard)h(min)m(us) e(in\014nit)m(y)-8 b(.)39 b(Suc)m(h)25 b(a)h(n)m(um)m(b)s(er)150 4306 y(cannot)31 b(b)s(e)f(com)m(bined)g(with)g(an)m(y)h(other)g(date)g (item,)g(as)g(it)g(sp)s(eci\014es)f(a)g(complete)i(time)f(stamp.)275 4440 y(In)m(ternally)-8 b(,)29 b(computer)e(times)g(are)h(represen)m (ted)f(as)g(a)h(coun)m(t)g(of)f(seconds)g(since)g(an)g(ep)s(o)s(c)m (h|a)h(w)m(ell-)150 4549 y(de\014ned)23 b(p)s(oin)m(t)h(of)h(time.)39 b(On)23 b(GNU)i(and)f(POSIX)f(systems,)j(the)e(ep)s(o)s(c)m(h)g(is)g (1970-01-01)29 b(00:00:00)e(UTC,)150 4659 y(so)34 b(`)p Fq(@0)p Fw(')f(represen)m(ts)h(this)g(time,)h(`)p Fq(@1)p Fw(')f(represen)m(ts)f(1970-01-01)38 b(00:00:01)f(UTC,)c(and)g(so)h (forth.)50 b(GNU)150 4768 y(and)33 b(most)i(other)f(POSIX-complian)m(t) h(systems)f(supp)s(ort)e(suc)m(h)i(times)h(as)f(an)g(extension)h(to)g (POSIX,)150 4878 y(using)30 b(negativ)m(e)i(coun)m(ts,)g(so)e(that)h(`) p Fq(@-1)p Fw(')f(represen)m(ts)g(1969-12-31)35 b(23:59:59)f(UTC.)275 5011 y(T)-8 b(raditional)31 b(Unix)g(systems)g(coun)m(t)g(seconds)g (with)g(32-bit)h(t)m(w)m(o's-complemen)m(t)h(in)m(tegers)f(and)f(can) 150 5121 y(represen)m(t)e(times)h(from)f(1901-12-13)k(20:45:52)f (through)d(2038-01-19)k(03:14:07)g(UTC.)39 b(More)30 b(mo)s(dern)150 5230 y(systems)g(use)f(64-bit)i(coun)m(ts)g(of)f (seconds)f(with)h(nanosecond)g(sub)s(coun)m(ts,)f(and)g(can)h(represen) m(t)g(all)h(the)150 5340 y(times)g(in)f(the)h(kno)m(wn)e(lifetime)j(of) f(the)f(univ)m(erse)h(to)g(a)f(resolution)h(of)g(1)g(nanosecond.)p eop end %%Page: 56 62 TeXDict begin 56 61 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(56)275 299 y(On)29 b(most)j(hosts,)f(these)g(coun)m(ts)g(ignore)h(the)f(presence)f(of)h (leap)h(seconds.)42 b(F)-8 b(or)31 b(example,)h(on)f(most)150 408 y(hosts)f(`)p Fq(@915148799)p Fw(')e(represen)m(ts)i(1998-12-31)k (23:59:59)f(UTC,)d(`)p Fq(@915148800)p Fw(')e(represen)m(ts)i(1999-01-) 150 518 y(01)i(00:00:00)j(UTC,)c(and)g(there)h(is)g(no)f(w)m(a)m(y)i (to)f(represen)m(t)g(the)f(in)m(terv)m(ening)i(leap)f(second)g (1998-12-31)150 628 y(23:59:60)i(UTC.)150 816 y Fl(4.10.10)63 b(Sp)s(ecifying)43 b(time)e(zone)g(rules)150 963 y Fw(Normally)-8 b(,)33 b(dates)e(are)g(in)m(terpreted)g(using)g(the)g(rules)f(of)h(the) g(curren)m(t)g(time)h(zone,)g(whic)m(h)e(in)h(turn)f(are)150 1072 y(sp)s(eci\014ed)e(b)m(y)g(the)h Fq(TZ)f Fw(en)m(vironmen)m(t)h(v) -5 b(ariable,)30 b(or)f(b)m(y)f(a)h(system)g(default)g(if)f Fq(TZ)g Fw(is)h(not)g(set.)40 b(T)-8 b(o)29 b(sp)s(ecify)150 1182 y(a)j(di\013eren)m(t)g(set)g(of)g(default)f(time)i(zone)f(rules)f (that)h(apply)f(just)g(to)i(one)f(date,)g(start)g(the)g(date)g(with)g (a)150 1292 y(string)27 b(of)h(the)f(form)g(`)p Fq(TZ=")p Fh(rule)p Fq(")p Fw('.)38 b(The)26 b(t)m(w)m(o)j(quote)f(c)m(haracters) g(\(`)p Fq(")p Fw('\))h(m)m(ust)e(b)s(e)f(presen)m(t)i(in)f(the)g (date,)150 1401 y(and)j(an)m(y)g(quotes)h(or)g(bac)m(kslashes)g(within) f Fi(rule)35 b Fw(m)m(ust)30 b(b)s(e)g(escap)s(ed)g(b)m(y)h(a)f(bac)m (kslash.)275 1530 y(F)-8 b(or)28 b(example,)i(with)d(the)i(GNU)f Fq(date)f Fw(command)h(y)m(ou)g(can)h(answ)m(er)f(the)g(question)g (\\What)h(time)g(is)150 1640 y(it)35 b(in)g(New)g(Y)-8 b(ork)35 b(when)e(a)j(P)m(aris)f(clo)s(c)m(k)h(sho)m(ws)e(6:30am)j(on)d (Octob)s(er)h(31,)i(2004?")55 b(b)m(y)35 b(using)f(a)h(date)150 1749 y(b)s(eginning)30 b(with)g(`)p Fq(TZ="Europe/Paris")p Fw(')c(as)31 b(sho)m(wn)e(in)h(the)h(follo)m(wing)h(shell)e (transcript:)390 1878 y Fq($)47 b(export)g(TZ="America/New_York")390 1988 y($)g(date)g(--date='TZ="Europe/Paris")41 b(2004-10-31)k(06:30') 390 2097 y(Sun)i(Oct)g(31)g(01:30:00)f(EDT)g(2004)275 2226 y Fw(In)27 b(this)g(example,)i(the)f(`)p Fq(--date)p Fw(')f(op)s(erand)f(b)s(egins)i(with)f(its)h(o)m(wn)g Fq(TZ)f Fw(setting,)j(so)e(the)g(rest)f(of)h(that)150 2336 y(op)s(erand)36 b(is)i(pro)s(cessed)e(according)j(to)f(`)p Fq(Europe/Paris)p Fw(')c(rules,)39 b(treating)g(the)e(string)g(`)p Fq(2004-10-31)150 2446 y(06:30)p Fw(')29 b(as)i(if)g(it)g(w)m(ere)g(in) f(P)m(aris.)42 b(Ho)m(w)m(ev)m(er,)33 b(since)e(the)f(output)h(of)f (the)h Fq(date)f Fw(command)g(is)g(pro)s(cessed)150 2555 y(according)37 b(to)f(the)g(o)m(v)m(erall)i(time)e(zone)h(rules,)g(it)f (uses)f(New)h(Y)-8 b(ork)36 b(time.)57 b(\(P)m(aris)37 b(w)m(as)f(normally)g(six)150 2665 y(hours)26 b(ahead)i(of)f(New)h(Y)-8 b(ork)28 b(in)f(2004,)j(but)d(this)g(example)h(refers)f(to)h(a)g(brief) f(Hallo)m(w)m(een)j(p)s(erio)s(d)c(when)150 2774 y(the)31 b(gap)f(w)m(as)h(\014v)m(e)g(hours.\))275 2903 y(A)43 b Fq(TZ)f Fw(v)-5 b(alue)44 b(is)f(a)g(rule)g(that)h(t)m(ypically)h (names)e(a)g(lo)s(cation)i(in)e(the)g(`)p Fq(tz)p Fw(')g(database)h(\() p Fq(http:)10 b(/)g(/)150 3013 y(www)i(.)d(twinsun)j(.)d(com)j(/)d(tz)i (/)e(tz-)o(link)i(.)e(h)o(tm)p Fw(\).)77 b(A)45 b(recen)m(t)h(catalog)h (of)e(lo)s(cation)h(names)e(app)s(ears)g(in)150 3122 y(the)54 b(TWiki)g(Date)i(and)d(Time)h(Gatew)m(a)m(y)i(\()p Fq(http:)18 b(/)h(/)c(twiki)i(.)e(org)j(/)d(cgi-bin)i(/)e(xtra)j(/)d (tzdate)p Fw(\).)150 3232 y(A)53 b(few)f(non-GNU)h(hosts)g(require)f(a) h(colon)h(b)s(efore)e(a)h(lo)s(cation)i(name)d(in)h(a)g Fq(TZ)f Fw(setting,)59 b(e.g.,)150 3342 y(`)p Fq (TZ=":America/New_York")p Fw('.)275 3471 y(The)109 b(`)p Fq(tz)p Fw(')h(database)h(includes)f(a)g(wide)g(v)-5 b(ariet)m(y)111 b(of)g(lo)s(cations)g(ranging)f(from)150 3580 y(`)p Fq(Arctic/Longyearbyen)p Fw(')70 b(to)75 b(`)p Fq(Antarctica/South_Pole)p Fw(',)81 b(but)74 b(if)h(y)m(ou)g(are)g(at)g (sea)h(and)150 3690 y(ha)m(v)m(e)48 b(y)m(our)f(o)m(wn)g(priv)-5 b(ate)48 b(time)g(zone,)k(or)47 b(if)g(y)m(ou)g(are)h(using)e(a)i (non-GNU)f(host)g(that)h(do)s(es)f(not)150 3799 y(supp)s(ort)39 b(the)j(`)p Fq(tz)p Fw(')f(database,)j(y)m(ou)e(ma)m(y)g(need)e(to)i (use)f(a)g(POSIX)f(rule)h(instead.)73 b(Simple)41 b(POSIX)150 3909 y(rules)34 b(lik)m(e)i(`)p Fq(UTC0)p Fw(')e(sp)s(ecify)g(a)h(time) g(zone)g(without)g(da)m(yligh)m(t)h(sa)m(ving)f(time;)j(other)c(rules)g (can)h(sp)s(ecify)150 4019 y(simple)i(da)m(yligh)m(t)i(sa)m(ving)f (regimes.)63 b(See)37 b(Section)h(\\Sp)s(ecifying)f(the)h(Time)f(Zone)g (with)g Fq(TZ)p Fw(")g(in)g Fi(The)150 4128 y(GNU)31 b(C)f(Library)8 b Fw(.)150 4316 y Fl(4.10.11)63 b(Authors)42 b(of)g Fj(parse_datetime)150 4463 y Fq(parse_datetime)27 b Fw(started)32 b(life)g(as)g Fq(getdate)p Fw(,)e(as)h(originally)i (implemen)m(ted)f(b)m(y)f(Stev)m(en)h(M.)g(Bello)m(vin)150 4573 y(\()p Fq(smb@research)t(.)s(att)t(.)s(com)p Fw(\))e(while)35 b(at)h(the)g(Univ)m(ersit)m(y)g(of)f(North)g(Carolina)h(at)g(Chap)s(el) e(Hill.)56 b(The)150 4682 y(co)s(de)38 b(w)m(as)h(later)g(t)m(w)m(eak)m (ed)h(b)m(y)e(a)h(couple)g(of)f(p)s(eople)g(on)g(Usenet,)j(then)d (completely)i(o)m(v)m(erhauled)f(b)m(y)150 4792 y(Ric)m(h)33 b($alz)h(\()p Fq(rsalz@bbn)r(.)q(com)p Fw(\))c(and)i(Jim)g(Berets)i(\() p Fq(jberets@bbn)r(.)q(com)p Fw(\))29 b(in)j(August,)h(1990.)49 b(V)-8 b(arious)150 4902 y(revisions)29 b(for)f(the)h(GNU)h(system)f(w) m(ere)g(made)g(b)m(y)f(Da)m(vid)i(MacKenzie,)h(Jim)e(Mey)m(ering,)i(P)m (aul)e(Eggert)150 5011 y(and)c(others,)j(including)d(renaming)h(it)h (to)f Fq(get_date)e Fw(to)j(a)m(v)m(oid)h(a)e(con\015ict)h(with)e(the)i (alternativ)m(e)h(P)m(osix)150 5121 y(function)38 b Fq(getdate)p Fw(,)h(and)e(a)i(later)g(rename)f(to)h Fq(parse_datetime)p Fw(.)61 b(The)38 b(P)m(osix)h(function)f Fq(getdate)150 5230 y Fw(can)30 b(parse)g(more)h(lo)s(cale-sp)s(eci\014c)h(dates)e (using)g Fq(strptime)p Fw(,)e(but)h(relies)i(on)f(an)g(en)m(vironmen)m (t)h(v)-5 b(ariable)150 5340 y(and)30 b(external)h(\014le,)g(and)f(lac) m(ks)h(the)g(thread-safet)m(y)h(of)e Fq(parse_datetime)p Fw(.)p eop end %%Page: 57 63 TeXDict begin 57 62 bop 150 -116 a Fw(Chapter)30 b(4:)41 b(Reference)31 b(Man)m(ual)2334 b(57)275 299 y(This)30 b(c)m(hapter)j(w)m(as)f(originally)h(pro)s(duced)d(b)m(y)h(F)-8 b(ran\030)-40 b(cois)33 b(Pinard)e(\()p Fq(pinard@iro)q(.)q(umontreal)q (.)q(ca)p Fw(\))150 408 y(from)e(the)h(`)p Fq(parse_datetime.y)p Fw(')25 b(source)30 b(co)s(de,)g(and)f(then)g(edited)h(b)m(y)g(K.)f (Berry)h(\()p Fq(kb@cs.umb.edu)p Fw(\).)p eop end %%Page: 58 64 TeXDict begin 58 63 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(58)150 299 y Ft(5)80 b(Programming)54 b(Man)l(ual)150 529 y Fw(This)30 b(c)m(hapter)h (describ)s(es)e(all)i(the)g(publicly)f(a)m(v)-5 b(ailable)33 b(functions)d(in)g(the)g(library)-8 b(.)150 760 y Fv(5.1)68 b(Preparation)150 919 y Fw(T)-8 b(o)28 b(use)e(`Libshishi',)i(y)m(ou)f (ha)m(v)m(e)h(to)g(p)s(erform)e(some)h(c)m(hanges)i(to)e(y)m(our)h (sources)f(and)f(the)h(build)g(system.)150 1029 y(The)39 b(necessary)h(c)m(hanges)h(are)f(small)g(and)f(explained)g(in)h(the)f (follo)m(wing)i(sections.)70 b(A)m(t)40 b(the)g(end)f(of)150 1138 y(this)31 b(c)m(hapter,)i(it)f(is)f(describ)s(ed)f(ho)m(w)i(the)f (library)g(is)h(initialized,)h(and)e(ho)m(w)g(the)h(requiremen)m(ts)f (of)h(the)150 1248 y(library)e(are)h(v)m(eri\014ed.)275 1382 y(A)g(faster)i(w)m(a)m(y)f(to)h(\014nd)d(out)i(ho)m(w)g(to)g (adapt)g(y)m(our)g(application)h(for)e(use)h(with)f(`Libshishi')g(ma)m (y)i(b)s(e)150 1491 y(to)e(lo)s(ok)g(at)g(the)g(examples)g(at)g(the)f (end)g(of)h(this)f(man)m(ual)h(\(see)g(Section)g(5.18)h([Examples],)f (page)g(226\).)150 1689 y Fl(5.1.1)63 b(Header)150 1836 y Fw(All)22 b(in)m(terfaces)g(\(data)g(t)m(yp)s(es)g(and)e(functions\)) h(of)g(the)h(library)f(are)g(de\014ned)f(in)h(the)g(header)g(\014le)g (`shishi.h'.)150 1946 y(Y)-8 b(ou)23 b(m)m(ust)f(include)g(this)g(in)f (all)i(programs)f(using)g(the)g(library)-8 b(,)24 b(either)f(directly)g (or)f(through)f(some)i(other)150 2055 y(header)30 b(\014le,)h(lik)m(e)h (this:)390 2189 y Fq(#include)46 b()275 2323 y Fw(The)32 b(name)i(space)g(of)f(`Libshishi')g(is)g Fq(shishi_*)f Fw(for)h(function)g(names,)h Fq(Shishi*)e Fw(for)h(data)h(t)m(yp)s(es)150 2432 y(and)e Fq(SHISHI_*)f Fw(for)h(other)h(sym)m(b)s(ols.)48 b(In)32 b(addition)h(the)g(same)g (name)g(pre\014xes)f(with)g(one)h(prep)s(ended)150 2542 y(underscore)d(are)g(reserv)m(ed)h(for)f(in)m(ternal)h(use)f(and)g (should)f(nev)m(er)i(b)s(e)f(used)f(b)m(y)i(an)f(application.)150 2739 y Fl(5.1.2)63 b(Initialization)150 2886 y Fw(`Libshishi')37 b(m)m(ust)h(b)s(e)f(initialized)j(b)s(efore)d(it)i(can)f(b)s(e)f(used.) 63 b(The)37 b(library)h(is)g(initialized)i(b)m(y)d(calling)150 2996 y Fq(shishi_init)30 b Fw(\(see)k(Section)f(5.2)h([Initialization)i (F)-8 b(unctions],)35 b(page)e(61\).)50 b(The)32 b(resources)h(allo)s (cated)150 3106 y(b)m(y)f(the)g(initialization)k(pro)s(cess)31 b(can)i(b)s(e)e(released)i(if)f(the)h(application)g(no)f(longer)h(has)f (a)h(need)f(to)h(call)150 3215 y(`Libshishi')d(functions,)g(this)g(is)g (done)h(b)m(y)f(calling)i Fq(shishi_done)p Fw(.)275 3349 y(In)40 b(order)g(to)i(tak)m(e)g(adv)-5 b(an)m(tage)43 b(of)e(the)g(in)m(ternationalisation)j(features)d(in)g(`Libshishi',)i (suc)m(h)e(as)150 3458 y(translated)j(error)f(messages,)48 b(the)c(application)h(m)m(ust)e(set)h(the)g(curren)m(t)f(lo)s(cale)i (using)e Fq(setlocale)150 3568 y Fw(b)s(efore)30 b(initializing)i (`Libshishi'.)150 3766 y Fl(5.1.3)63 b(V)-10 b(ersion)41 b(Chec)m(k)150 3913 y Fw(It)29 b(is)h(often)f(desirable)h(to)g(c)m(hec) m(k)g(that)g(the)g(v)m(ersion)f(of)h(`Libshishi')e(used)h(is)g(indeed)g (one)g(whic)m(h)g(\014ts)g(all)150 4022 y(requiremen)m(ts.)42 b(Ev)m(en)31 b(with)g(binary)f(compatibilit)m(y)j(new)d(features)h(ma)m (y)g(ha)m(v)m(e)h(b)s(een)e(in)m(tro)s(duced)h(but)150 4132 y(due)g(to)i(problem)e(with)h(the)g(dynamic)f(link)m(er)i(an)e (old)h(v)m(ersion)h(is)f(actually)h(used.)45 b(So)31 b(y)m(ou)i(ma)m(y)f(w)m(an)m(t)150 4241 y(to)f(c)m(hec)m(k)h(that)f (the)g(v)m(ersion)f(is)h(ok)-5 b(a)m(y)31 b(righ)m(t)g(after)g(program) f(startup.)150 4439 y Fl(shishi)p 459 4439 37 5 v 55 w(c)m(hec)m(k)p 807 4439 V 53 w(v)m(ersion)3350 4634 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_check_version)e Ff(\()p Fi(const)32 b(c)m(har)e(*)h Fe(req_version)p Ff(\))390 4744 y Fi(req)p 520 4744 28 4 v 40 w(v)m(ersion)p Fw(:)41 b(v)m(ersion)31 b(string)f(to)h(compare)g (with,)g(or)f(NULL)390 4878 y(Chec)m(k)42 b(that)g(the)g(v)m(ersion)g (of)f(the)h(library)f(is)g(at)i(minim)m(um)d(the)i(one)g(giv)m(en)g(as) g(a)g(string)f(in)390 4987 y Fq(req_version)p Fw(.)390 5121 y Fk(Return)34 b(v)-5 b(alue:)47 b Fw(the)34 b(actual)h(v)m (ersion)f(string)g(of)g(the)g(library;)h(NULL)f(if)g(the)g(condition)g (is)g(not)390 5230 y(met.)40 b(If)28 b Fq(NULL)f Fw(is)i(passed)e(to)i (this)f(function)g(no)g(c)m(hec)m(k)i(is)f(done)f(and)f(only)i(the)f(v) m(ersion)h(string)f(is)390 5340 y(returned.)p eop end %%Page: 59 65 TeXDict begin 59 64 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(59)275 299 y(The)27 b(normal)h(w)m(a)m(y)h(to)f(use)g(the)g(function)f(is)h(to)h(put)e (something)h(similar)h(to)f(the)g(follo)m(wing)i(early)e(in)150 408 y(y)m(our)i Fq(main)p Fw(:)485 541 y Fq(if)48 b (\(!shishi_check_version)41 b(\(SHISHI_VERSION\)\))581 650 y({)676 760 y(printf)46 b(\("shishi_check_version)c(failed:\\n") 1058 869 y("Header)k(file)h(incompatible)d(with)j(shared)f (library.\\n"\);)676 979 y(exit)h(\(EXIT_FAILURE\);)581 1089 y(})150 1283 y Fl(5.1.4)63 b(Building)42 b(the)f(source)150 1430 y Fw(If)29 b(y)m(ou)g(w)m(an)m(t)h(to)f(compile)h(a)g(source)f (\014le)g(including)f(the)i(`shishi.h')e(header)h(\014le,)g(y)m(ou)h(m) m(ust)f(mak)m(e)h(sure)150 1540 y(that)e(the)g(compiler)g(can)g(\014nd) d(it)j(in)g(the)f(directory)h(hierarc)m(h)m(y)-8 b(.)41 b(This)27 b(is)g(accomplished)h(b)m(y)g(adding)f(the)150 1649 y(path)i(to)h(the)g(directory)g(in)f(whic)m(h)h(the)f(header)h (\014le)f(is)h(lo)s(cated)h(to)f(the)g(compilers)f(include)h(\014le)f (searc)m(h)150 1759 y(path)h(\(via)h(the)g(`)p Fq(-I)p Fw(')f(option\).)275 1891 y(Ho)m(w)m(ev)m(er,)h(the)f(path)f(to)h(the)g (include)f(\014le)h(is)f(determined)g(at)h(the)g(time)g(the)f(source)h (is)f(con\014gured.)150 2001 y(T)-8 b(o)23 b(solv)m(e)g(this)f (problem,)i(`Libshishi')d(uses)h(the)g(external)h(pac)m(k)-5 b(age)25 b Fq(pkg-config)19 b Fw(that)k(kno)m(ws)f(the)g(path)150 2110 y(to)34 b(the)g(include)g(\014le)f(and)g(other)h(con\014guration)g (options.)51 b(The)33 b(options)h(that)g(need)g(to)g(b)s(e)f(added)g (to)150 2220 y(the)24 b(compiler)h(in)m(v)m(o)s(cation)h(at)f(compile)f (time)h(are)g(output)e(b)m(y)h(the)g(`)p Fq(--cflags)p Fw(')f(option)h(to)h Fq(pkg-config)150 2329 y(shishi)p Fw(.)39 b(The)30 b(follo)m(wing)i(example)f(sho)m(ws)f(ho)m(w)g(it)h (can)g(b)s(e)f(used)f(at)i(the)g(command)f(line:)390 2462 y Fq(gcc)47 b(-c)g(foo.c)f(`pkg-config)f(shishi)h(--cflags`)275 2594 y Fw(Adding)38 b(the)i(output)f(of)h(`)p Fq(pkg-config)27 b(shishi)i(--cflags)p Fw(')38 b(to)i(the)f(compilers)h(command)g(line) 150 2703 y(will)31 b(ensure)e(that)i(the)g(compiler)g(can)f(\014nd)f (the)i(`Libshishi')e(header)i(\014le.)275 2836 y(A)23 b(similar)g(problem)g(o)s(ccurs)g(when)f(linking)h(the)g(program)g (with)g(the)g(library)-8 b(.)38 b(Again,)26 b(the)d(compiler)150 2945 y(has)j(to)g(\014nd)f(the)h(library)f(\014les.)40 b(F)-8 b(or)26 b(this)g(to)h(w)m(ork,)g(the)f(path)g(to)h(the)f (library)f(\014les)h(has)g(to)h(b)s(e)e(added)g(to)150 3055 y(the)32 b(library)g(searc)m(h)h(path)f(\(via)h(the)f(`)p Fq(-L)p Fw(')g(option\).)47 b(F)-8 b(or)32 b(this,)h(the)f(option)h(`)p Fq(--libs)p Fw(')e(to)i Fq(pkg-config)150 3164 y(shishi)h Fw(can)i(b)s(e)f(used.)56 b(F)-8 b(or)37 b(con)m(v)m(enience,)i(this)d (option)g(also)g(outputs)g(all)g(other)g(options)g(that)h(are)150 3274 y(required)e(to)h(link)f(the)h(program)f(with)g(the)h(`Libshishi') e(libararies)i(\(in)g(particular,)h(the)f(`)p Fq(-lshishi)p Fw(')150 3384 y(option\).)46 b(The)32 b(example)h(sho)m(ws)e(ho)m(w)h (to)h(link)f(`)p Fq(foo.o)p Fw(')f(with)h(the)g(`Libshishi')f(library)h (to)h(a)f(program)150 3493 y Fq(foo)p Fw(.)390 3625 y Fq(gcc)47 b(-o)g(foo)g(foo.o)f(`pkg-config)f(shishi)h(--libs`)275 3758 y Fw(Of)29 b(course)i(y)m(ou)f(can)h(also)g(com)m(bine)g(b)s(oth)e (examples)i(to)g(a)g(single)f(command)g(b)m(y)h(sp)s(ecifying)f(b)s (oth)150 3867 y(options)h(to)g Fq(pkg-config)p Fw(:)390 3999 y Fq(gcc)47 b(-o)g(foo)g(foo.c)f(`pkg-config)f(shishi)h(--cflags)g (--libs`)150 4194 y Fl(5.1.5)63 b(Auto)s(conf)41 b(tests)150 4341 y Fw(If)23 b(y)m(ou)h(w)m(ork)g(on)g(a)g(pro)5 b(ject)24 b(that)g(uses)f(Auto)s(conf)h(\(see)h Fu(h)p Fw(unde\014ned)p Fu(i)d Fw([top],)k(page)e Fu(h)p Fw(unde\014ned)p Fu(i)p Fw(\))f(to)h(help)150 4450 y(\014nd)d(installed)j(libraries,)h(the)e (suggestions)h(in)e(the)i(previous)e(section)i(are)f(not)h(the)f(en)m (tire)h(story)-8 b(.)38 b(There)150 4560 y(are)28 b(a)f(few)g(metho)s (ds)g(to)h(detect)h(and)d(incorp)s(orate)i(Shishi)e(in)m(to)i(y)m(our)f (Auto)s(conf)h(based)f(pac)m(k)-5 b(age.)41 b(The)150 4670 y(preferred)30 b(approac)m(h,)i(is)f(to)h(use)f(Libto)s(ol)h(in)f (y)m(our)g(pro)5 b(ject,)32 b(and)e(use)h(the)h(normal)f(Auto)s(conf)g (header)150 4779 y(\014le)f(and)g(library)g(tests.)150 4974 y Fl(5.1.5.1)63 b(Auto)s(conf)42 b(test)f(via)f(`)p Fj(pkg-config)p Fl(')150 5121 y Fw(If)i(y)m(our)g(audience)g(is)g(a)h (t)m(ypical)g(GNU/Lin)m(ux)g(desktop,)i(y)m(ou)e(can)f(often)g(assume)g (they)g(ha)m(v)m(e)i(the)150 5230 y(`)p Fq(pkg-config)p Fw(')33 b(to)s(ol)j(installed,)h(in)d(whic)m(h)h(y)m(ou)g(can)h(use)e (its)i(Auto)s(conf)f(M4)g(macro)h(to)g(\014nd)d(and)h(set)150 5340 y(up)29 b(y)m(our)i(pac)m(k)-5 b(age)32 b(for)e(use)g(with)g (Shishi.)40 b(The)30 b(follo)m(wing)i(illustrate)f(this)f(scenario.)p eop end %%Page: 60 66 TeXDict begin 60 65 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(60)390 299 y Fq (AC_ARG_ENABLE\(kerberos_v)o(5,)390 408 y(AC_HELP_STRING\([--disabl)o (e-ke)o(rber)o(os_)o(v5],)1488 518 y([don't)46 b(use)h(the)g (KERBEROS_V5)d(mechanism]\),)390 628 y(kerberos_v5=$enableval\))390 737 y(if)j(test)g("$kerberos_v5")d(!=)j("no")g(;)g(then)390 847 y(PKG_CHECK_MODULES\(SHISHI)o(,)42 b(shishi)k(>=)h(0.0.0,)390 956 y([kerberos_v5=yes],)1535 1066 y([kerberos_v5=no]\))390 1176 y(if)g(test)g("$kerberos_v5")d(!=)j("yes")f(;)i(then)390 1285 y(kerberos_v5=no)390 1395 y(AC_MSG_WARN\([shishi)43 b(not)j(found,)h(disabling)e(Kerberos)g(5]\))390 1504 y(else)390 1614 y(kerberos_v5=yes)390 1724 y(AC_DEFINE\(USE_KERBEROS_V) o(5,)d(1,)1631 1833 y([Define)k(to)h(1)g(if)h(you)e(want)h(Kerberos)f (5.]\))390 1943 y(fi)390 2052 y(fi)390 2162 y(AC_MSG_CHECKING\([if)d (Kerberos)i(5)j(should)e(be)h(used]\))390 2271 y (AC_MSG_RESULT\($kerberos_)o(v5\))150 2524 y Fl(5.1.5.2)63 b(Standalone)41 b(Auto)s(conf)h(test)f(using)h(Libto)s(ol)150 2671 y Fw(If)21 b(y)m(our)h(pac)m(k)-5 b(age)24 b(uses)d(Libto)s (ol\(see)i Fu(h)p Fw(unde\014ned)p Fu(i)e Fw([top],)j(page)f Fu(h)p Fw(unde\014ned)p Fu(i)p Fw(\),)f(y)m(ou)g(can)h(use)e(the)h (normal)150 2780 y(Auto)s(conf)37 b(tests)h(to)f(\014nd)f(the)h(Shishi) e(library)i(and)f(rely)h(on)g(the)g(Libto)s(ol)g(dep)s(endency)f(trac)m (king)i(to)150 2890 y(include)23 b(the)h(prop)s(er)e(dep)s(endency)g (libraries)i(\(e.g.,)j(Libidn\).)37 b(The)24 b(follo)m(wing)h (illustrate)f(this)g(scenario.)390 3078 y Fq(AC_CHECK_HEADER\(shishi.h) o(,)390 3187 y(AC_CHECK_LIB\(shishi,)42 b(shishi_check_version,)390 3297 y([kerberos5=yes)i(AC_SUBST\(SHISHI_LIBS,)e(-lshishi\)],)390 3406 y(kerberos5=no\),)390 3516 y(kerberos5=no\))390 3626 y(AC_ARG_ENABLE\(kerberos5,)390 3735 y(AC_HELP_STRING\([--disabl)o (e-ke)o(rber)o(os5)o(],)1488 3845 y([disable)j(Kerberos)h(5)h (unconditionally]\),)390 3954 y(kerberos5=$enableval\))390 4064 y(if)g(test)g("$kerberos5")d(!=)j("no")g(;)h(then)390 4174 y(AC_DEFINE\(USE_KERBEROS_V)o(5,)42 b(1,)485 4283 y([Define)k(to)h(1)h(if)f(you)g(want)g(Kerberos)e(5.]\))390 4393 y(else)390 4502 y(AC_MSG_WARN\([Shishi)e(not)j(found,)h(disabling) e(Kerberos)g(5]\))390 4612 y(fi)390 4721 y(AC_MSG_CHECKING\([if)e (Kerberos)i(5)j(should)e(be)h(used]\))390 4831 y (AC_MSG_RESULT\($kerberos5)o(\))150 5083 y Fl(5.1.5.3)63 b(Standalone)41 b(Auto)s(conf)h(test)150 5230 y Fw(If)i(y)m(our)h(pac)m (k)-5 b(age)46 b(do)s(es)f(not)f(use)h(Libto)s(ol,)k(as)c(w)m(ell)g(as) g(detecting)h(the)f(Shishi)e(library)i(as)f(in)h(the)150 5340 y(previous)37 b(case,)k(y)m(ou)d(m)m(ust)g(also)g(detect)i(whatev) m(er)e(dep)s(endencies)f(Shishi)f(requires)i(to)g(w)m(ork)g(\(e.g.,)p eop end %%Page: 61 67 TeXDict begin 61 66 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(61)150 299 y(libidn\).)39 b(Since)28 b(the)g(dep)s(endencies)f(are)h(in)f(a)h(state)i(of)d (\015ux,)h(w)m(e)g(do)g(not)g(pro)m(vide)f(an)h(example)g(and)f(w)m(e) 150 408 y(do)j(not)h(recommend)f(this)g(approac)m(h,)h(unless)f(y)m(ou) h(are)f(exp)s(erienced)h(dev)m(elop)s(er.)150 658 y Fv(5.2)68 b(Initialization)48 b(F)-11 b(unctions)150 882 y Fl(shishi)3350 1090 y Fw([F)j(unction])-3599 b Fg(Shishi)54 b(*)f(shishi)47 b Ff(\()31 b Fe(void)p Ff(\))390 1200 y Fw(Initializes)42 b(the)f(Shishi)f(library)-8 b(,)43 b(and)d(set)h(up,)i(using)d Fq(shishi_error_set_output)o(type)o(\(\))p Fw(,)390 1309 y(the)29 b(library)g(so)g(that)h(future)e(w)m(arnings)g(and)h (informational)h(messages)g(are)f(prin)m(ted)g(to)g(stderr.)390 1419 y(If)h(this)g(function)g(fails,)h(it)g(ma)m(y)g(prin)m(t)f (diagnostic)i(errors)e(to)h(stderr.)390 1565 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(Shishi)f(library)h(handle,)g(or)g Fq(NULL)f Fw(on)i(error.)150 1775 y Fl(shishi)p 459 1775 37 5 v 55 w(serv)m(er)3350 1984 y Fw([F)-8 b(unction])-3599 b Fg(Shishi)54 b(*)f(shishi_server)c Ff(\()31 b Fe(void)p Ff(\))390 2093 y Fw(Initializes)42 b(the)f(Shishi)f(library)-8 b(,)43 b(and)d(set)h(up,)i(using)d Fq(shishi_error_set_output)o(type)o (\(\))p Fw(,)390 2203 y(the)g(library)g(so)g(that)h(future)e(w)m (arnings)h(and)f(informational)i(messages)g(are)f(prin)m(ted)g(to)h (the)390 2312 y(syslog.)h(If)29 b(this)i(function)f(fails,)h(it)g(ma)m (y)g(prin)m(t)f(diagnostic)i(errors)d(to)j(the)e(syslog.)390 2458 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(Shishi)f(library)h (handle,)g(or)g Fq(NULL)f Fw(on)i(error.)150 2669 y Fl(shishi)p 459 2669 V 55 w(done)3350 2877 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_done)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 2987 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3132 y(Deallo)s(cates)39 b(the)d(shishi)f(library)g(handle.)56 b(The)35 b(handle)h(m)m(ust)f(not)h(b)s(e)f(used)g(in)g(an)m(y)h(calls) h(to)390 3242 y(shishi)30 b(functions)f(after)i(this.)390 3388 y(If)41 b(there)h(is)g(a)g(default)g(tkts,)j(it)e(is)f(written)f (to)i(the)f(default)g(tkts)g(\014le)g(\(call)h Fq(shishi_tkts_)390 3497 y(default_file_set\(\))23 b Fw(to)29 b(c)m(hange)g(the)f(default)g (tkts)g(\014le\).)40 b(If)28 b(y)m(ou)g(do)g(not)g(wish)f(to)i(write)f (the)390 3607 y(default)37 b(tkts)h(\014le,)h(close)f(the)f(default)g (tkts)h(with)f(shishi)p 2409 3607 28 4 v 39 w(tkts)p 2602 3607 V 40 w(done\(handle,)i(NULL\))e(b)s(efore)390 3717 y(calling)32 b(this)e(function.)150 3927 y Fl(shishi)p 459 3927 37 5 v 55 w(init)3350 4135 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_init)c Ff(\()p Fi(Shishi)30 b(**)h Fe(handle)p Ff(\))390 4245 y Fi(handle)5 b Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(handle)f(to)h(b)s(e)f(created.)390 4391 y(Create)38 b(a)f(Shishi)f(library)g(handle,)j(using)d Fq(shishi\(\))p Fw(,)h(and)f(read)h(the)g(system)h(con\014guration)390 4500 y(\014le,)62 b(user)55 b(con\014guration)g(\014le)h(and)f(user)f (tic)m(k)m(ets)k(from)d(their)h(default)f(lo)s(cations.)117 b(The)390 4610 y(paths)72 b(to)h(the)f(system)g(con\014guration)h (\014le)f(is)g(decided)g(at)h(compile)g(time,)83 b(and)72 b(is)390 4720 y($sysconfdir/shishi.conf.)81 b(The)43 b(user)g(con\014guration)h(\014le)g(is)g($HOME/.shishi/con\014g,)49 b(and)390 4829 y(the)31 b(user)e(tic)m(k)m(et)k(\014le)e(is)f ($HOME/.shishi/tic)m(k)m(et.)390 4975 y(The)20 b(handle)g(is)g(allo)s (cated)i(regardless)f(of)f(return)f(v)-5 b(alues,)23 b(except)f(for)e(SHISHI)p 3082 4975 28 4 v 39 w(HANDLE)p 3513 4975 V 40 w(ERR)m(OR)390 5085 y(whic)m(h)33 b(indicates)h(a)f (problem)f(allo)s(cating)k(the)d(handle.)48 b(\(The)33 b(other)g(error)g(conditions)g(comes)390 5194 y(from)d(reading)g(the)h (\014les.\))390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 62 68 TeXDict begin 62 67 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(62)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(init)p 698 299 V 54 w(with)p 991 299 V 54 w(paths)3350 504 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_init_with_path)q(s)e Ff(\()p Fi(Shishi)30 b(**)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 613 y Fe(tktsfile)p Fi(,)i(const)e(c)m(har)g(*)f Fe(systemcfgfile)p Fi(,)35 b(const)c(c)m(har)g(*)f Fe(usercfgfile)p Ff(\))390 723 y Fi(handle)5 b Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(handle)f(to)h(b)s (e)f(created.)390 865 y Fi(tkts\014le)5 b Fw(:)41 b(Filename)32 b(of)f(tic)m(k)m(et)i(\014le,)d(or)h(NULL.)390 1008 y Fi(systemcfg\014le)5 b Fw(:)42 b(Filename)31 b(of)g(system)f (con\014guration,)h(or)g(NULL.)390 1151 y Fi(usercfg\014le)5 b Fw(:)41 b(Filename)32 b(of)e(user)g(con\014guration,)h(or)f(NULL.)390 1293 y(Create)38 b(a)f(Shishi)f(library)g(handle,)j(using)d Fq(shishi\(\))p Fw(,)h(and)f(read)h(the)g(system)h(con\014guration)390 1403 y(\014le,)51 b(user)45 b(con\014guration)i(\014le,)j(and)c(user)g (tic)m(k)m(ets)i(from)e(the)g(sp)s(eci\014ed)g(lo)s(cations.)90 b(If)46 b(an)m(y)390 1512 y(of)g Fq(usercfgfile)c Fw(or)k Fq(systemcfgfile)c Fw(is)j(NULL,)h(the)g(\014le)f(is)h(read)f(from)g (its)h(default)g(lo-)390 1622 y(cation,)i(whic)m(h)43 b(for)g(the)g(system)h(con\014guration)f(\014le)h(is)f(decided)g(at)h (compile)g(time,)j(and)c(is)390 1731 y($sysconfdir/shishi.conf,)34 b(and)f(for)g(the)h(user)f(con\014guration)g(\014le)h(is)f ($HOME/.shishi/con\014g.)390 1841 y(If)d(the)g(tic)m(k)m(et)j(\014le)e (is)f(NULL,)h(a)g(tic)m(k)m(et)i(\014le)d(is)h(not)f(read)g(at)i(all.) 390 1984 y(The)20 b(handle)g(is)g(allo)s(cated)i(regardless)f(of)f (return)f(v)-5 b(alues,)23 b(except)f(for)e(SHISHI)p 3082 1984 28 4 v 39 w(HANDLE)p 3513 1984 V 40 w(ERR)m(OR)390 2093 y(whic)m(h)33 b(indicates)h(a)f(problem)f(allo)s(cating)k(the)d (handle.)48 b(\(The)33 b(other)g(error)g(conditions)g(comes)390 2203 y(from)d(reading)g(the)h(\014les.\))390 2345 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2345 V 39 w(OK)f(i\013)i(successful.)150 2553 y Fl(shishi)p 459 2553 37 5 v 55 w(init)p 698 2553 V 54 w(serv)m(er)3350 2757 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_init_server)e Ff(\()p Fi(Shishi)30 b(**)h Fe(handle)p Ff(\))390 2867 y Fi(handle)5 b Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(handle)f(to)h(b)s(e)f (created.)390 3010 y(Create)h(a)g(Shishi)e(library)h(handle,)g(using)g Fq(shishi_server\(\))p Fw(,)c(and)k(read)g(the)h(system)f(con\014g-)390 3119 y(uration)37 b(\014le.)59 b(The)36 b(paths)g(to)h(the)g(system)g (con\014guration)g(\014le)f(is)h(decided)f(at)h(compile)h(time,)390 3229 y(and)30 b(is)g($sysconfdir/shishi.conf.)390 3371 y(The)20 b(handle)g(is)g(allo)s(cated)i(regardless)f(of)f(return)f(v)-5 b(alues,)23 b(except)f(for)e(SHISHI)p 3082 3371 28 4 v 39 w(HANDLE)p 3513 3371 V 40 w(ERR)m(OR)390 3481 y(whic)m(h)33 b(indicates)h(a)f(problem)f(allo)s(cating)k(the)d(handle.)48 b(\(The)33 b(other)g(error)g(conditions)g(comes)390 3591 y(from)d(reading)g(the)h(\014le.\))390 3733 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3733 V 39 w(OK)f(i\013)i(successful.)150 3940 y Fl(shishi)p 459 3940 37 5 v 55 w(init)p 698 3940 V 54 w(serv)m(er)p 1074 3940 V 54 w(with)p 1367 3940 V 54 w(paths)3350 4145 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_init_server_wi)q(th_p)q (ath)q(s)e Ff(\()p Fi(Shishi)30 b(**)h Fe(handle)p Fi(,)i(const)d(c)m (har)h(*)565 4255 y Fe(systemcfgfile)p Ff(\))390 4364 y Fi(handle)5 b Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(handle)f(to)h(b)s(e)f (created.)390 4507 y Fi(systemcfg\014le)5 b Fw(:)42 b(Filename)31 b(of)g(system)f(con\014guration,)h(or)g(NULL.)390 4649 y(Create)39 b(a)h(Shishi)d(library)h(handle,)j(using)d Fq(shishi_server\(\))p Fw(,)f(and)h(read)h(the)g(system)f(con-)390 4759 y(\014guration)e(\014le)f(from)h(sp)s(eci\014ed)f(lo)s(cation.)58 b(The)35 b(paths)g(to)h(the)g(system)g(con\014guration)g(\014le)g(is) 390 4869 y(decided)f(at)g(compile)h(time,)h(and)d(is)h ($sysconfdir/shishi.conf.)53 b(The)35 b(handle)f(is)h(allo)s(cated)i (re-)390 4978 y(gardless)k(of)f(return)f(v)-5 b(alues,)43 b(except)f(for)e(SHISHI)p 2209 4978 28 4 v 39 w(HANDLE)p 2640 4978 V 40 w(ERR)m(OR)g(whic)m(h)g(indicates)i(a)390 5088 y(problem)34 b(allo)s(cating)j(the)e(handle.)52 b(\(The)35 b(other)f(error)h(conditions)g(comes)g(from)f(reading)h(the) 390 5197 y(\014le.\))390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 63 69 TeXDict begin 63 68 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(63)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(cfg)3350 514 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cfg)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(option)p Ff(\))390 623 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 776 y Fi(option)p Fw(:)41 b(string)31 b(with)f(shishi)f(library)h(option.)390 929 y(Con\014gure)f(shishi)h(library)g(with)g(giv)m(en)h(option.)390 1081 y Fk(Return)f(V)-8 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1652 1081 28 4 v 39 w(OK)g(if)g(option)h(w)m(as)f(v)-5 b(alid.)150 1298 y Fl(shishi)p 459 1298 37 5 v 55 w(cfg)p 667 1298 V 55 w(from)p 972 1298 V 55 w(\014le)3350 1513 y Fw([F)d(unction])-3599 b Fg(int)53 b(shishi_cfg_from_file)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(cfg)p Ff(\))390 1623 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 1776 y Fi(cfg)8 b Fw(:)41 b(\014lename)31 b(to)g(read)f (con\014guration)h(from.)390 1928 y(Con\014gure)e(shishi)h(library)g (using)g(con\014guration)h(\014le.)390 2081 y Fk(Return)f(V)-8 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)e Fw(i\013)i(successful.)150 2298 y Fl(shishi)p 459 2298 V 55 w(cfg)p 667 2298 V 55 w(prin)m(t)3350 2513 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cfg_print)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Ff(\))390 2623 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2775 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(op)s(ened)e(for)h(writing.)390 2928 y(Prin)m(t)g(library)g(con\014guration)h(status,)g(mostly)g(for)f (debugging)g(purp)s(oses.)390 3080 y Fk(Return)g(V)-8 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1652 3080 28 4 v 39 w(OK.)150 3298 y Fl(shishi)p 459 3298 37 5 v 55 w(cfg)p 667 3298 V 55 w(default)p 1093 3298 V 54 w(system\014le)3350 3513 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_cfg_default_sys)q(tem)q(file)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 3622 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3775 y(The)24 b(system)h(con\014guration)g(\014le)f(name)h(is) f(decided)h(at)g(compile-time,)j(but)c(ma)m(y)h(b)s(e)f(o)m(v)m (erridden)390 3884 y(b)m(y)30 b(the)h(en)m(vironmen)m(t)g(v)-5 b(ariable)31 b(SHISHI)p 1847 3884 28 4 v 39 w(CONFIG.)390 4037 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(system)g (con\014guration)h(\014le)f(name.)150 4254 y Fl(shishi)p 459 4254 37 5 v 55 w(cfg)p 667 4254 V 55 w(default)p 1093 4254 V 54 w(userdirectory)3350 4469 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_cfg_default_use)q(rdi)q(rect)q(ory)f Ff(\()p Fi(Shishi)30 b(*)565 4579 y Fe(handle)p Ff(\))390 4688 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j (b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4841 y(The)i(default)h(user)e (directory)i(\(used)f(for,)h(e.g.)51 b(Shishi)33 b(tic)m(k)m(et)j(cac)m (he\))f(is)e(normally)h(computed)390 4951 y(b)m(y)43 b(app)s(ending)g(BASE)p 1236 4951 28 4 v 40 w(DIR)g(\()p Fq(")p Fw(/.shishi)p Fq(")p Fw(\))h(to)g(the)g(con)m(ten)m(t)h(of)f (the)g(en)m(vironmen)m(t)g(v)-5 b(ariable)390 5060 y($HOME,)32 b(but)f(can)h(b)s(e)f(o)m(v)m(erridden)g(b)m(y)h(sp)s(ecifying)f(the)h (complete)h(path)e(in)h(the)f(en)m(vironmen)m(t)390 5170 y(v)-5 b(ariable)31 b(SHISHI)p 1041 5170 V 39 w(HOME.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(directory)h(with)f (con\014guration)g(\014les)h(etc.)p eop end %%Page: 64 70 TeXDict begin 64 69 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(64)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(cfg)p 667 299 V 55 w(userdirectory)p 1431 299 V 54 w(\014le)3350 505 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_cfg_userdirecto)q(ry_)q(fil)q(e)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 614 y(c)m(har)f(*)g Fe(file)p Ff(\))390 724 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 867 y Fi(\014le)5 b Fw(:)41 b(basename)31 b(of)f(\014le)h(to)g(\014nd)d(in)j(user)e(directory)-8 b(.)390 1011 y(Get)31 b(the)g(full)f(path)g(to)h(sp)s(eci\014ed)f Fq(file)f Fw(in)h(the)h(users')f(con\014guration)g(directory)-8 b(.)390 1154 y Fk(Return)51 b(v)-5 b(alue:)84 b Fw(Return)51 b(full)g(path)h(to)g(giv)m(en)h(relativ)m(e)g(\014lename,)58 b(relativ)m(e)53 b(to)g(the)f(user)390 1264 y(sp)s(eci\014c)76 b(Shishi)g(con\014guration)h(directory)g(as)g(returned)f(b)m(y)g Fq(shishi_cfg_default_)390 1373 y(userdirectory\(\))26 b Fw(\(t)m(ypically)33 b($HOME/.shishi\).)150 1581 y Fl(shishi)p 459 1581 V 55 w(cfg)p 667 1581 V 55 w(default)p 1093 1581 V 54 w(user\014le)3350 1787 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_cfg_default_use)q(rfi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 1897 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 2040 y(Get)g(\014lename)g(of)g (default)f(user)g(con\014guration)h(\014le,)f(t)m(ypically)i ($HOME/shishi.conf.)390 2184 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Return)30 b(user)f(con\014guration)i(\014lename.)150 2392 y Fl(shishi)p 459 2392 V 55 w(cfg)p 667 2392 V 55 w(clien)m(tkdcet)m(yp)s(e)3350 2598 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cfg_clientkdce)q(type)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(in)m(t32)p 2665 2598 28 4 v 41 w(t)f(**)565 2707 y Fe(etypes)p Ff(\))390 2817 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j (b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2960 y Fi(et)m(yp)s(es)t Fw(:)41 b(output)30 b(arra)m(y)h(with)f(encryption)g(t)m(yp)s(es.)390 3104 y(Set)h(the)f(et)m(yp)s(es)h(v)-5 b(ariable)31 b(to)g(the)g(arra)m (y)g(of)f(preferred)f(clien)m(t)j(et)m(yp)s(es.)390 3247 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Return)30 b(the)g(n)m(um)m(b)s(er)f (of)i(encryption)f(t)m(yp)s(es)h(in)f(the)g(arra)m(y)-8 b(,)32 b(0)f(means)f(none.)150 3455 y Fl(shishi)p 459 3455 37 5 v 55 w(cfg)p 667 3455 V 55 w(clien)m(tkdcet)m(yp)s(e)p 1495 3455 V 52 w(fast)3350 3661 y Fw([F)-8 b(unction])-3599 b Fg(int32_t)54 b(shishi_cfg_clientkdce)q(typ)q(e_f)q(ast)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 3771 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 3914 y(Extract)g(the)g(default)f(et) m(yp)s(e)h(from)f(the)h(list)g(of)f(preferred)g(clien)m(t)h(et)m(yp)s (es.)390 4057 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(the)g(default)h(encryption)f(t)m(yp)s(es.)150 4266 y Fl(shishi)p 459 4266 V 55 w(cfg)p 667 4266 V 55 w(clien)m(tkdcet)m (yp)s(e)p 1495 4266 V 52 w(set)3350 4471 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cfg_clientkdce)q(type)q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(c)m(har)f(*)565 4581 y Fe(value)p Ff(\))390 4690 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 4834 y Fi(v)-5 b(alue)5 b Fw(:)41 b(string)31 b(with)f(encryption)g(t)m(yp)s(es.)390 4977 y(Set)36 b(the)g Fq(")p Fw(clien)m(t-kdc-et)m(yp)s(es)p Fq(")i Fw(con\014guration)e(option)g(from)g(giv)m(en)g(string.)57 b(The)36 b(string)f(con-)390 5087 y(tains)40 b(encryption)f(t)m(yp)s (es)g(\(in)m(teger)i(or)f(names\))f(separated)h(b)m(y)g(comma)g(or)f (whitespace,)k(e.g.)390 5197 y Fq(")p Fw(aes256-cts-hmac-sha1-96)35 b(des3-cb)s(c-sha1-kd)c(des-cb)s(c-md5)p Fq(")p Fw(.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 28 4 v 39 w(OK)f(if)i(successful.)p eop end %%Page: 65 71 TeXDict begin 65 70 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(65)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(cfg)p 667 299 V 55 w(authorization)m(t)m(yp)s(e)p 1671 299 V 53 w(set)3350 490 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cfg_authorizat)q(iont)q(ype)q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(c)m(har)f(*)565 600 y Fe(value)p Ff(\))390 709 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 841 y Fi(v)-5 b(alue)5 b Fw(:)41 b(string)31 b(with)f(authorization)i(t)m(yp)s(es.)390 973 y(Set)45 b(the)f Fq(")p Fw(authorization-t)m(yp)s(es)p Fq(")i Fw(con\014guration)f(option)g(from)f(giv)m(en)i(string.)83 b(The)44 b(string)390 1083 y(con)m(tains)34 b(authorization)h(t)m(yp)s (es)d(\(in)m(teger)j(or)e(names\))g(separated)h(b)m(y)e(comma)i(or)f (whitespace,)390 1192 y(e.g.)42 b Fq(")p Fw(basic)30 b(k5login)p Fq(")p Fw(.)390 1324 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1324 28 4 v 39 w(OK)f(if)i(successful.) 150 1551 y Fv(5.3)68 b(Tic)l(k)l(et)46 b(Set)f(F)-11 b(unctions)150 1710 y Fw(A)26 b(\\tic)m(k)m(et)i(set")f(is,)g(as)f(the) f(name)h(implies,)h(a)f(collection)i(of)e(tic)m(k)m(ets.)41 b(F)-8 b(unctions)27 b(are)f(pro)m(vided)f(to)h(read)150 1820 y(tic)m(k)m(ets)36 b(from)d(\014le)g(in)m(to)i(a)f(tic)m(k)m(et)i (set,)f(to)f(query)f(n)m(um)m(b)s(er)f(of)h(tic)m(k)m(ets)j(in)d(the)h (set,)h(to)f(extract)h(a)f(giv)m(en)150 1929 y(tic)m(k)m(et)g(from)d (the)h(set,)h(to)f(searc)m(h)g(the)g(tic)m(k)m(et)i(set)e(for)f(tic)m (k)m(ets)j(matc)m(hing)f(certain)f(criterium,)g(to)h(write)150 2039 y(the)d(tic)m(k)m(et)j(set)d(to)h(a)f(\014le,)h(etc.)41 b(High)31 b(lev)m(el)g(functions)f(for)g(p)s(erforming)e(a)j(initial)g (authen)m(tication)h(\(see)150 2149 y(Section)i(5.7)h([AS)f(F)-8 b(unctions],)35 b(page)g(114\))g(or)f(subsequen)m(t)f(authen)m (tication)i(\(see)g(Section)f(5.8)h([TGS)150 2258 y(F)-8 b(unctions],)31 b(page)h(119\))g(and)d(storing)i(the)g(new)f(tic)m(k)m (et)j(in)d(the)g(tic)m(k)m(et)j(set)e(are)g(also)g(pro)m(vided.)275 2390 y(See)i(Section)h(5.6)g([Tic)m(k)m(et)h(F)-8 b(unctions],)35 b(page)f(103,)h(to)f(manipulate)f(eac)m(h)i(individual)d(tic)m(k)m(et.) 52 b(See)150 2500 y(Section)31 b(5.9)h([Tic)m(k)m(et)g(\(ASN.1\))g(F)-8 b(unctions],)31 b(page)g(125,)h(for)e(lo)m(w-lev)m(el)k(ASN.1)c (manipulation.)150 2693 y Fl(shishi)p 459 2693 37 5 v 55 w(tkts)p 723 2693 V 54 w(default)p 1148 2693 V 54 w(\014le)p 1360 2693 V 55 w(guess)3350 2885 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_tkts_default_fi)q(le_)q(gue) q(ss)g Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 2994 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j (b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3126 y(Guesses)20 b(the)h(default)f(tic)m(k)m(et)j(\014lename;)h(it)d(is)f($SHISHI)p 2296 3126 28 4 v 40 w(TICKETS,)e($SHISHI)p 3143 3126 V 40 w(HOME/tic)m(k)m(ets,)390 3236 y(or)30 b($HOME/.shishi/tic)m(k)m (ets.)390 3367 y Fk(Return)37 b(v)-5 b(alue:)54 b Fw(Returns)36 b(default)h(tkts)g(\014lename)g(as)g(a)g(string)g(that)h(has)e(to)i(b)s (e)e(deallo)s(cated)390 3477 y(with)30 b Fq(free\(\))f Fw(b)m(y)h(the)h(caller.)150 3671 y Fl(shishi)p 459 3671 37 5 v 55 w(tkts)p 723 3671 V 54 w(default)p 1148 3671 V 54 w(\014le)3350 3862 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_tkts_default_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 3972 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 4104 y(Get)g(\014lename)g(of)g (default)f(tic)m(k)m(et)j(set.)390 4235 y Fk(Return)d(v)-5 b(alue:)42 b Fw(Returns)30 b(the)h(default)g(tic)m(k)m(et)i(set)e (\014lename)g(used)f(in)g(the)h(library)-8 b(.)42 b(The)30 b(string)390 4345 y(is)g(not)h(a)g(cop)m(y)-8 b(,)32 b(so)e(don't)h(mo)s(dify)e(or)h(deallo)s(cate)j(it.)150 4539 y Fl(shishi)p 459 4539 V 55 w(tkts)p 723 4539 V 54 w(default)p 1148 4539 V 54 w(\014le)p 1360 4539 V 55 w(set)3350 4730 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkts_default_file)q(_se)q(t)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 4840 y Fe(tktsfile)p Ff(\))390 4949 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 5081 y Fi(tkts\014le)5 b Fw(:)41 b(string)31 b(with)f(new)g(default)g(tkts)h(\014le)g(name,)f(or)h(NULL)f(to)h (reset)g(to)g(default.)390 5213 y(Set)j(the)h(default)f(tic)m(k)m(et)j (set)e(\014lename)g(used)e(in)h(the)h(library)-8 b(.)52 b(The)34 b(string)g(is)h(copied)f(in)m(to)i(the)390 5322 y(library)-8 b(,)31 b(so)f(y)m(ou)h(can)g(disp)s(ose)e(of)i(the)f(v)-5 b(ariable)32 b(immediately)f(after)g(calling)h(this)e(function.)p eop end %%Page: 66 72 TeXDict begin 66 71 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(66)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkts)p 723 299 V 54 w(default)3350 488 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkts)56 b(*)c (shishi_tkts_default)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 598 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 729 y(Get)g(the)g (default)g(tic)m(k)m(et)i(set)d(for)h(library)f(handle.)390 860 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(the)g(handle)g (global)i(tic)m(k)m(et)h(set.)150 1051 y Fl(shishi)p 459 1051 V 55 w(tkts)3350 1241 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 1974 1241 28 4 v 39 w(tkts)d(**)i Fe(tkts)p Ff(\))390 1350 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1481 y Fi(tkts)t Fw(:)41 b(output)30 b(p)s(oin)m(ter)g(to)h (newly)g(allo)s(cated)h(tkts)f(handle.)390 1612 y(Get)g(a)g(new)f(tic)m (k)m(et)j(set)e(handle.)390 1743 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1935 y Fl(shishi)p 459 1935 37 5 v 55 w(tkts)p 723 1935 V 54 w(done)3350 2124 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkts_done)c Ff(\()p Fi(Shishi)p 1574 2124 28 4 v 39 w(tkts)31 b(**)g Fe(tkts)p Ff(\))390 2234 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 2365 y(Deallo)s(cates)38 b(all)e(resources)f(asso)s(ciated)i(with)e(tic)m(k)m(et)j(set.)55 b(The)35 b(tic)m(k)m(et)i(set)f(handle)f(m)m(ust)g(not)390 2474 y(b)s(e)30 b(used)f(in)h(calls)i(to)f(other)g(shishi)p 1609 2474 V 39 w(tkts)p 1802 2474 V 40 w(*\(\))h(functions)e(after)h (this.)150 2666 y Fl(shishi)p 459 2666 37 5 v 55 w(tkts)p 723 2666 V 54 w(size)3350 2856 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_size)e Ff(\()p Fi(Shishi)p 1522 2856 28 4 v 39 w(tkts)31 b(*)f Fe(tkts)p Ff(\))390 2965 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 3096 y(Get)h(size)h(of)e (tic)m(k)m(et)j(set.)390 3227 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(n)m(um)m(b)s(er)f(of)h(tic)m(k)m(ets)j(stored)e(in)f (tic)m(k)m(et)j(set.)150 3419 y Fl(shishi)p 459 3419 37 5 v 55 w(tkts)p 723 3419 V 54 w(n)m(th)3350 3608 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_nth)d Ff(\()p Fi(Shishi)p 1940 3608 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(in)m(t)e Fe(ticketno)p Ff(\))390 3718 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 3849 y Fi(tic)m(k)m(etno)5 b Fw(:)43 b(in)m(teger)32 b(indicating)f(requested) f(tic)m(k)m(et)j(in)d(tic)m(k)m(et)j(set.)390 3979 y Fk(Get)f(the)e(n:)41 b Fw(th)30 b(tic)m(k)m(et)j(in)d(tic)m(k)m(et)j (set.)390 4110 y Fk(Return)i(v)-5 b(alue:)50 b Fw(Returns)35 b(a)g(tic)m(k)m(et)j(handle)c(to)i(the)g(tic)m(k)m(etno:th)h(tic)m(k)m (et)h(in)d(the)g(tic)m(k)m(et)j(set,)f(or)390 4220 y(NULL)32 b(if)f(tic)m(k)m(et)j(set)f(is)e(in)m(v)-5 b(alid)33 b(or)e(tic)m(k)m(etno)k(is)c(out)h(of)g(b)s(ounds.)42 b(The)31 b(\014rst)g(tic)m(k)m(et)k(is)c(tic)m(k)m(etno)390 4329 y(0,)g(the)g(second)f(tic)m(k)m(etno)j(1,)e(and)f(so)g(on.)150 4521 y Fl(shishi)p 459 4521 37 5 v 55 w(tkts)p 723 4521 V 54 w(remo)m(v)m(e)3350 4711 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_remove)e Ff(\()p Fi(Shishi)p 1626 4711 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(in)m(t)f Fe(ticketno)p Ff(\))390 4820 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 4951 y Fi(tic)m(k)m(etno)5 b Fw(:)40 b(tic)m(k)m(et)26 b(n)m(um)m(b)s(er)d(of)h(tic)m(k)m(et)j(in)c(the)h(set)h(to)f(remo)m(v) m(e.)41 b(The)23 b(\014rst)g(tic)m(k)m(et)k(is)d(tic)m(k)m(et)i(n)m(um) m(b)s(er)390 5061 y(0.)390 5191 y(Remo)m(v)m(e)32 b(a)f(tic)m(k)m(et,)i (indexed)d(b)m(y)g Fq(ticketno)p Fw(,)f(in)h(tic)m(k)m(et)j(set.)390 5322 y Fk(Return)d(v)-5 b(alue:)41 b Fq(SHISHI_OK)28 b Fw(if)i(successful)g(or)h(if)f Fq(ticketno)e Fw(larger)j(than)f(size) i(of)e(tic)m(k)m(et)j(set.)p eop end %%Page: 67 73 TeXDict begin 67 72 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(67)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkts)p 723 299 V 54 w(add)3350 487 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_add)d Ff(\()p Fi(Shishi)p 1469 487 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(Shishi)p 2273 487 V 39 w(tkt)f(*)f Fe(tkt)p Ff(\))390 597 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f (as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 727 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(b)s(e)f(added)g(to)h (tic)m(k)m(et)i(set.)390 857 y(Add)f(a)i(tic)m(k)m(et)i(to)e(the)g(tic) m(k)m(et)i(set.)50 b(Only)33 b(the)g(p)s(oin)m(ter)g(is)h(stored,)g(so) g(if)f(y)m(ou)h(mo)s(dify)e Fq(tkt)p Fw(,)i(the)390 967 y(tic)m(k)m(et)f(in)d(the)h(tic)m(k)m(et)i(set)e(will)f(also)i(b)s(e)d (mo)s(di\014ed.)390 1097 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1287 y Fl(shishi)p 459 1287 37 5 v 55 w(tkts)p 723 1287 V 54 w(new)3350 1475 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_new)d Ff(\()p Fi(Shishi)p 1469 1475 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(Shishi)p 2273 1475 V 39 w(asn1)e Fe(ticket)p Fi(,)565 1585 y(Shishi)p 810 1585 V 39 w(asn1)h Fe(enckdcreppart)p Fi(,)j(Shishi)p 2031 1585 V 39 w(asn1)d Fe(kdcrep)p Ff(\))390 1695 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated) j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 1825 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(tic)m(k)m(et)j(v)-5 b(ariable.)390 1955 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(tic)m(k)m(et)k (detail)f(v)-5 b(ariable.)390 2085 y Fi(kdcrep)s Fw(:)40 b(input)29 b(KDC-REP)h(v)-5 b(ariable.)390 2215 y(Allo)s(cate)33 b(a)d(new)g(tic)m(k)m(et)j(and)d(add)g(it)h(to)g(the)f(tic)m(k)m(et)j (set.)390 2345 y(Note)g(that)g Fq(ticket)p Fw(,)e Fq(enckdcreppart)d Fw(and)k Fq(kdcrep)e Fw(are)i(stored)g(b)m(y)g(reference,)h(so)g(y)m (ou)f(m)m(ust)390 2455 y(not)26 b(de-allo)s(cate)i(them)d(b)s(efore)g (the)g(tic)m(k)m(et)j(is)d(remo)m(v)m(ed)i(from)e(the)g(tic)m(k)m(et)j (set)e(and)e(de-allo)s(cated.)390 2585 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k (successful.)150 2776 y Fl(shishi)p 459 2776 37 5 v 55 w(tkts)p 723 2776 V 54 w(read)3350 2964 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_read)e Ff(\()p Fi(Shishi)p 1522 2964 28 4 v 39 w(tkts)31 b(*)f Fe(tkts)p Fi(,)i(FILE)e(*)h Fe(fh)p Ff(\))390 3074 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 3204 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(to)g(read)f (from.)390 3334 y(Read)h(tic)m(k)m(ets)h(from)e(\014le)h(descriptor)f (and)g(add)g(them)g(to)h(the)g(tic)m(k)m(et)i(set.)390 3464 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3655 y Fl(shishi)p 459 3655 37 5 v 55 w(tkts)p 723 3655 V 54 w(from)p 1027 3655 V 55 w(\014le)3350 3843 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_from_file)f Ff(\()p Fi(Shishi)p 1783 3843 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(const)f(c)m(har)f (*)565 3952 y Fe(filename)p Ff(\))390 4062 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 4192 y Fi(\014lename)5 b Fw(:)41 b(\014lename)31 b(to)g(read)f(tic)m(k)m(ets)j(from.)390 4322 y(Read)e(tic)m(k)m(ets)h(from)e(\014le)h(and)f(add)f(them)i(to)g (the)f(tic)m(k)m(et)j(set.)390 4452 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4643 y Fl(shishi)p 459 4643 37 5 v 55 w(tkts)p 723 4643 V 54 w(write)3350 4831 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_write)e Ff(\()p Fi(Shishi)p 1574 4831 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)g(FILE)g(*)f Fe(fh)p Ff(\))390 4941 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 5071 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(to)g(write)f (tic)m(k)m(ets)j(to.)390 5201 y(W)-8 b(rite)32 b(tic)m(k)m(ets)h(in)d (set)h(to)g(\014le)f(descriptor.)390 5331 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 68 74 TeXDict begin 68 73 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(68)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkts)p 723 299 V 54 w(expire)3350 515 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_expire)e Ff(\()p Fi(Shishi)p 1626 515 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Ff(\))390 624 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 778 y(Remo)m(v)m(e)i(expired)e(tic)m(k)m(ets)j(from)d(tic)m(k) m(et)j(set.)390 931 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1150 y Fl(shishi)p 459 1150 37 5 v 55 w(tkts)p 723 1150 V 54 w(to)p 886 1150 V 54 w(\014le)3350 1366 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_to_file)e Ff(\()p Fi(Shishi)p 1678 1366 28 4 v 40 w(tkts)30 b(*)g Fe(tkts)p Fi(,)h(const)f(c)m(har)g (*)h Fe(filename)p Ff(\))390 1475 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 1629 y Fi(\014lename)5 b Fw(:)41 b(\014lename)31 b(to)g(write)f(tic)m(k)m(ets)j(to.)390 1782 y(W)-8 b(rite)32 b(tic)m(k)m(ets)h(in)d(set)h(to)g(\014le.)390 1936 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2154 y Fl(shishi)p 459 2154 37 5 v 55 w(tkts)p 723 2154 V 54 w(prin)m(t)p 1042 2154 V 54 w(for)p 1244 2154 V 55 w(service)3350 2370 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_print_for)q (_ser)q(vic)q(e)e Ff(\()p Fi(Shishi)p 2201 2370 28 4 v 40 w(tkts)29 b(*)h Fe(tkts)p Fi(,)g(FILE)f(*)g Fe(fh)p Fi(,)565 2480 y(const)i(c)m(har)g(*)f Fe(service)p Ff(\))390 2589 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 2743 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(to)g(prin)m(t)f(to.)390 2897 y Fi(service)5 b Fw(:)42 b(service)31 b(to)g(limit)g(tic)m(k)m (ets)i(prin)m(ted)d(to,)h(or)g(NULL.)390 3050 y(Prin)m(t)f(description) g(of)g(tic)m(k)m(ets)i(for)e(sp)s(eci\014ed)f(service)i(to)g(\014le)f (descriptor.)40 b(If)30 b(service)h(is)f(NULL,)390 3160 y(all)h(tic)m(k)m(ets)i(are)e(prin)m(ted.)390 3313 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3532 y Fl(shishi)p 459 3532 37 5 v 55 w(tkts)p 723 3532 V 54 w(prin)m(t)3350 3747 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkts_print)e Ff(\()p Fi(Shishi)p 1574 3747 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)g(FILE)g(*)f Fe(fh)p Ff(\))390 3857 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated) j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 4011 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(to)g(prin)m(t)f(to.)390 4164 y(Prin)m(t)g(description)h(of)f(all)i(tic)m(k)m(ets)g(to)g(\014le) e(descriptor.)390 4318 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4536 y Fl(shishi)p 459 4536 37 5 v 55 w(tkt)p 675 4536 V 54 w(matc)m(h)p 1059 4536 V 53 w(p)3350 4752 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_match_p)e Ff(\()p Fi(Shishi)p 1626 4752 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)h(Shishi)p 2342 4752 V 38 w(tkts)p 2534 4752 V 41 w(hin)m(t)e(*)h Fe(hint)p Ff(\))390 4862 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(test)h(hin)m(ts)e(on.)390 5015 y Fi(hin)m(t)r Fw(:)41 b(structure)30 b(with)g(c)m(haracteristics)j(of) d(tic)m(k)m(et)j(to)e(b)s(e)f(found.)390 5169 y(T)-8 b(est)31 b(if)f(a)h(tic)m(k)m(et)i(matc)m(hes)f(sp)s(eci\014ed)d(hin)m (ts.)390 5322 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(0)g(i\013)h(tic)m(k)m(et)i(fails)e(to)g(matc)m(h)g(giv)m(en)h (criteria.)p eop end %%Page: 69 75 TeXDict begin 69 74 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(69)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkts)p 723 299 V 54 w(\014nd)3350 487 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e (shishi_tkts_find)d Ff(\()p Fi(Shishi)p 1992 487 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(Shishi)p 2796 487 V 39 w(tkts)p 2989 487 V 40 w(hin)m(t)565 597 y(*)f Fe(hint)p Ff(\))390 706 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f (as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 836 y Fi(hin)m(t)r Fw(:)41 b(structure)30 b(with)g(c)m(haracteristics)j (of)d(tic)m(k)m(et)j(to)e(b)s(e)f(found.)390 966 y(Searc)m(h)44 b(the)g(tic)m(k)m(etset)i(sequen)m(tially)f(\(from)f(tic)m(k)m(et)i(n)m (um)m(b)s(er)c(0)i(through)f(all)h(tic)m(k)m(ets)j(in)c(the)390 1076 y(set\))g(for)g(a)g(tic)m(k)m(et)i(that)e(\014ts)f(the)h(giv)m(en) h(c)m(haracteristics.)79 b(If)43 b(a)g(tic)m(k)m(et)i(is)d(found,)j (the)e(hin)m(t-)390 1186 y Fq(>)p Fw(startp)s(os)32 b(\014eld)g(is)h (up)s(dated)e(to)i(p)s(oin)m(t)f(to)i(the)e(next)h(tic)m(k)m(et)i(in)d (the)h(set,)g(so)g(this)f(function)h(can)390 1295 y(b)s(e)25 b(called)h(rep)s(eatedly)g(with)f(the)h(same)g(hin)m(t)f(argumen)m(t)h (in)f(order)g(to)i(\014nd)d(all)i(tic)m(k)m(ets)i(matc)m(hing)390 1405 y(a)j(certain)h(criterium.)42 b(Note)33 b(that)e(if)g(tic)m(k)m (ets)i(are)f(added)e(to,)i(or)f(remo)m(v)m(ed)h(from,)f(the)g(tic)m(k)m (etset)390 1514 y(during)22 b(a)i(query)f(with)g(the)h(same)g(hin)m(t)g (argumen)m(t,)h(the)f(hin)m(t-)p Fq(>)p Fw(startp)s(os)g(\014eld)f(m)m (ust)g(b)s(e)g(up)s(dated)390 1624 y(appropriately)-8 b(.)390 1754 y Fk(Here)31 b(is)g(ho)m(w)f(y)m(ou)h(w)m(ould)f(t)m (ypically)i(use)e(this)g(function:)41 b Fw(Shishi)p 2676 1754 V 39 w(tkts)p 2869 1754 V 40 w(hin)m(t)31 b(hin)m(t;)390 1884 y(Shishi)p 635 1884 V 39 w(tkt)g(tkt;)390 2014 y(memset\(&hin)m (t,)g(0,)g(sizeof\(hin)m(t\)\);)390 2144 y(hin)m(t.serv)m(er)g(=)f Fq(")p Fw(imap/mail.example.org)p Fq(")p Fw(;)390 2275 y(tkt)h(=)f(shishi)p 870 2275 V 39 w(tkts)p 1063 2275 V 41 w(\014nd)f(\(shishi)p 1545 2275 V 39 w(tkts)p 1738 2275 V 41 w(default\(handle\),)i(&hin)m(t\);)390 2405 y(if)f(\(!tkt\))390 2535 y(prin)m(tf\()p Fq(")p Fw(No)g(tic)m(k)m(et)j (found...)p Fq(\\)p Fw(n)p Fq(")p Fw(\);)390 2665 y(else)390 2795 y(do)p 492 2795 V 40 w(something)p 936 2795 V 41 w(with)p 1154 2795 V 39 w(tic)m(k)m(et)g(\(tkt\);)390 2925 y Fk(Return)25 b(v)-5 b(alue:)39 b Fw(Returns)24 b(a)i(tic)m(k)m(et)i(if)e(found,)f(or)h(NULL)f(if)h(no)f(further)f (matc)m(hing)j(tic)m(k)m(ets)h(could)390 3035 y(b)s(e)i(found.)150 3225 y Fl(shishi)p 459 3225 37 5 v 55 w(tkts)p 723 3225 V 54 w(\014nd)p 981 3225 V 55 w(for)p 1184 3225 V 55 w(clien)m(tserv)m(er)3350 3413 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_find_for_c)q(lie)q(ntse)q(rve)q(r) e Ff(\()p Fi(Shishi)p 2881 3413 28 4 v 40 w(tkts)30 b(*)565 3523 y Fe(tkts)p Fi(,)i(const)f(c)m(har)g(*)f Fe(client)p Fi(,)j(const)e(c)m(har)f(*)h Fe(server)p Ff(\))390 3633 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 3763 y Fi(clien)m(t)r Fw(:)42 b(clien)m(t)32 b(name)f(to)g(\014nd)e(tic)m(k)m (et)k(for.)390 3893 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(\014nd)e(tic)m(k)m(et)k(for.)390 4023 y(Short-hand)g (function)h(for)g(searc)m(hing)h(the)g(tic)m(k)m(et)h(set)f(for)f(a)h (tic)m(k)m(et)i(for)d(the)g(giv)m(en)i(clien)m(t)g(and)390 4133 y(serv)m(er.)41 b(See)31 b Fq(shishi_tkts_find\(\))p Fw(.)390 4263 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(a)g(tic)m(k)m(et)j(if)e(found,)e(or)h(NULL.)150 4453 y Fl(shishi)p 459 4453 37 5 v 55 w(tkts)p 723 4453 V 54 w(\014nd)p 981 4453 V 55 w(for)p 1184 4453 V 55 w(serv)m(er)3350 4641 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e (shishi_tkts_find_for_s)q(erv)q(er)f Ff(\()p Fi(Shishi)p 2568 4641 28 4 v 39 w(tkts)31 b(*)f Fe(tkts)p Fi(,)565 4751 y(const)h(c)m(har)g(*)f Fe(server)p Ff(\))390 4861 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 4991 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(\014nd)e(tic)m(k) m(et)k(for.)390 5121 y(Short-hand)h(function)g(for)h(searc)m(hing)h (the)f(tic)m(k)m(et)j(set)e(for)f(a)g(tic)m(k)m(et)j(for)d(the)g(giv)m (en)h(serv)m(er)f(us-)390 5230 y(ing)k(the)g(default)h(clien)m(t)g (principal.)67 b(See)39 b Fq(shishi_tkts_find_for_clie)o(nts)o(erve)o (r\(\))33 b Fw(and)390 5340 y Fq(shishi_tkts_find\(\))p Fw(.)p eop end %%Page: 70 76 TeXDict begin 70 75 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(70)390 299 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(a)g(tic)m(k)m(et)j(if)e(found,)e (or)h(NULL.)150 509 y Fl(shishi)p 459 509 37 5 v 55 w(tkts)p 723 509 V 54 w(get)p 942 509 V 54 w(tgt)3350 717 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_get_tgt)e Ff(\()p Fi(Shishi)p 2149 717 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)565 826 y(Shishi)p 810 826 V 39 w(tkts)p 1003 826 V 41 w(hin)m(t)f(*)h Fe(hint)p Ff(\))390 936 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 1081 y Fi(hin)m(t)r Fw(:)41 b(structure)30 b(with)g(c)m(haracteristics)j(of)d (tic)m(k)m(et)j(to)e(b)s(egot.)390 1226 y(Get)38 b(a)f(tic)m(k)m(et)j (gran)m(ting)e(tic)m(k)m(et)i(\(TGT\))d(suitable)h(for)e(acquiring)i (tic)m(k)m(et)h(matc)m(hing)f(the)g(hin)m(t.)390 1336 y(I.e.,)32 b(get)g(a)g(TGT)e(for)h(the)g(serv)m(er)h(realm)f(in)g(the)g (hin)m(t)g(structure)g(\(hin)m(t-)p Fq(>)p Fw(serv)m(errealm\),)i(or)e (the)390 1446 y(default)g(realm)f(if)h(the)f(serv)m(errealm)h(\014eld)f (is)h(NULL.)f(Can)g(result)g(in)h(AS)f(exc)m(hange.)390 1591 y(Curren)m(tly)g(this)g(function)g(do)g(not)h(implemen)m(t)g (cross)f(realm)h(logic.)390 1736 y(This)24 b(function)g(is)g(used)g(b)m (y)g Fq(shishi_tkts_get\(\))p Fw(,)d(whic)m(h)k(is)f(probably)g(what)g (y)m(ou)h(really)g(w)m(an)m(t)390 1846 y(to)31 b(use)f(unless)g(y)m(ou) h(ha)m(v)m(e)g(sp)s(ecial)g(needs.)390 1991 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)28 b(a)i(tic)m(k)m(et)j(gran)m(ting)d(tic)m(k)m (et)i(if)e(successful,)f(or)h(NULL)f(if)h(this)f(function)390 2101 y(is)h(unable)g(to)h(acquire)g(on.)150 2311 y Fl(shishi)p 459 2311 37 5 v 55 w(tkts)p 723 2311 V 54 w(get)p 942 2311 V 54 w(tgs)3350 2518 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_get_tgs)e Ff(\()p Fi(Shishi)p 2149 2518 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)565 2628 y(Shishi)p 810 2628 V 39 w(tkts)p 1003 2628 V 41 w(hin)m(t)f(*)h Fe(hint)p Fi(,)g(Shishi)p 1812 2628 V 39 w(tkt)g(*)g Fe(tgt)p Ff(\))390 2738 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 2883 y Fi(hin)m(t)r Fw(:)41 b(structure)30 b(with)g(c)m(haracteristics)j(of)d(tic)m(k)m(et)j(to)e (b)s(egot.)390 3028 y Fi(tgt)r Fw(:)42 b(tic)m(k)m(et)33 b(gran)m(ting)e(tic)m(k)m(et)i(to)e(use.)390 3174 y(Get)g(a)g(tic)m(k)m (et)i(via)e(TGS)f(exc)m(hange)i(using)e(sp)s(eci\014ed)f(tic)m(k)m(et)k (gran)m(ting)f(tic)m(k)m(et.)390 3319 y(This)24 b(function)g(is)g(used) g(b)m(y)g Fq(shishi_tkts_get\(\))p Fw(,)d(whic)m(h)k(is)f(probably)g (what)g(y)m(ou)h(really)g(w)m(an)m(t)390 3429 y(to)31 b(use)f(unless)g(y)m(ou)h(ha)m(v)m(e)g(sp)s(ecial)g(needs.)390 3574 y Fk(Return)37 b(v)-5 b(alue:)55 b Fw(Returns)36 b(a)i(tic)m(k)m(et)i(if)d(successful,)i(or)e(NULL)h(if)f(this)g (function)g(is)g(unable)g(to)390 3683 y(acquire)31 b(on.)150 3894 y Fl(shishi)p 459 3894 37 5 v 55 w(tkts)p 723 3894 V 54 w(get)3350 4101 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_get)d Ff(\()p Fi(Shishi)p 1940 4101 28 4 v 39 w(tkts)30 b(*)f Fe(tkts)p Fi(,)h(Shishi)p 2739 4101 V 39 w(tkts)p 2932 4101 V 41 w(hin)m(t)f(*)565 4211 y Fe(hint)p Ff(\))390 4320 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 4466 y Fi(hin)m(t)r Fw(:)41 b(structure)30 b(with)g(c)m (haracteristics)j(of)d(tic)m(k)m(et)j(to)e(b)s(e)f(found.)390 4611 y(Get)g(a)g(tic)m(k)m(et)h(matc)m(hing)g(giv)m(en)f(c)m (haracteristics.)43 b(This)28 b(function)h(\014rst)f(lo)s(oks)i(in)e (the)i(tic)m(k)m(et)h(set)390 4721 y(for)37 b(a)g(tic)m(k)m(et,)k(then) 36 b(tries)h(to)h(\014nd)d(a)i(suitable)h(TGT,)e(p)s(ossibly)g(via)h (an)g(AS)f(exc)m(hange,)k(using)390 4830 y Fq(shishi_tkts_get_tgt\(\))p Fw(,)d(and)i(then)h(uses)g(that)g(TGT)g(in)f(a)i(TGS)e(exc)m(hange)j (to)f(get)g(the)390 4940 y(tic)m(k)m(et.)390 5085 y(Curren)m(tly)30 b(this)g(function)g(do)s(es)g(not)h(implemen)m(t)g(cross)f(realm)h (logic.)390 5230 y Fk(Return)c(v)-5 b(alue:)40 b Fw(Returns)26 b(a)i(tic)m(k)m(et)i(if)e(found,)f(or)g(NULL)g(if)h(this)f(function)g (is)h(unable)f(to)h(get)h(the)390 5340 y(tic)m(k)m(et.)p eop end %%Page: 71 77 TeXDict begin 71 76 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(71)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkts)p 723 299 V 54 w(get)p 942 299 V 54 w(for)p 1144 299 V 55 w(clien)m(tserv)m(er)3350 493 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e (shishi_tkts_get_for_cl)q(ien)q(tser)q(ver)f Ff(\()p Fi(Shishi)p 2829 493 28 4 v 39 w(tkts)31 b(*)565 602 y Fe(tkts)p Fi(,)h(const)f(c)m(har)g(*)f Fe(client)p Fi(,)j(const)e(c)m(har)f(*)h Fe(server)p Ff(\))390 712 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s (cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 845 y Fi(clien)m(t)r Fw(:)42 b(clien)m(t)32 b(name)f(to)g(get)g(tic)m(k)m(et) i(for.)390 978 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g(tic)m(k)m(et)i(for.)390 1111 y(Short-hand)c (function)i(for)f(getting)j(a)e(tic)m(k)m(et)j(for)c(the)h(giv)m(en)h (clien)m(t)g(and)f(serv)m(er.)42 b(See)31 b Fq(shishi_)390 1220 y(tkts_get\(\))p Fw(.)390 1353 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(a)g(tic)m(k)m(et)j(if)e(found,)e(or)h (NULL.)150 1550 y Fl(shishi)p 459 1550 37 5 v 55 w(tkts)p 723 1550 V 54 w(get)p 942 1550 V 54 w(for)p 1144 1550 V 55 w(serv)m(er)3350 1744 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_get_for_se)q(rve)q(r)e Ff(\()p Fi(Shishi)p 2515 1744 28 4 v 40 w(tkts)30 b(*)h Fe(tkts)p Fi(,)565 1853 y(const)g(c)m(har)g(*)f Fe(server)p Ff(\))390 1963 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 2096 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g(tic)m(k)m(et)i(for.)390 2229 y(Short-hand)19 b(function)h(for)g(getting)i(a)f(tic)m(k)m(et)i(to)e(the)g(giv)m(en)g (serv)m(er)g(and)f(for)g(the)h(default)f(principal)390 2338 y(clien)m(t.)42 b(See)31 b Fq(shishi_tkts_get\(\))p Fw(.)390 2471 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(a)g(tic)m(k)m(et)j(if)e(found,)e(or)h(NULL.)150 2668 y Fl(shishi)p 459 2668 37 5 v 55 w(tkts)p 723 2668 V 54 w(get)p 942 2668 V 54 w(for)p 1144 2668 V 55 w(lo)s (calservicepasswd)3350 2861 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkts_get_for_lo)q(cal)q(serv)q(ice)q (pas)q(swd)565 2971 y Ff(\()p Fi(Shishi)p 845 2971 28 4 v 39 w(tkts)31 b(*)g Fe(tkts)p Fi(,)h(const)f(c)m(har)f(*)h Fe(service)p Fi(,)i(const)e(c)m(har)f(*)h Fe(passwd)p Ff(\))390 3081 y Fi(tkts)t Fw(:)41 b(tic)m(k)m(et)33 b(set)e(handle)f(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_tkts\(\))p Fw(.)390 3214 y Fi(service)5 b Fw(:)42 b(service)31 b(name)f(to)h(get)h (tic)m(k)m(et)h(for.)390 3347 y Fi(passwd)t Fw(:)39 b(passw)m(ord)30 b(for)g(the)g(default)h(clien)m(t)h(principal.)390 3480 y(Short-hand)27 b(function)g(for)h(getting)i(a)e(tic)m(k)m(et)j(to)d (the)h(giv)m(en)g(lo)s(cal)g(service,)g(and)f(for)g(the)g(default)390 3589 y(principal)22 b(clien)m(t.)40 b(The)22 b(latter's)i(passw)m(ord)d (is)i(giv)m(en)g(as)g(argumen)m(t.)39 b(See)22 b Fq (shishi_tkts_get\(\))p Fw(.)390 3722 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(a)g(tic)m(k)m(et)j(if)e(found,)e(or)h (NULL)h(otherwise.)150 3952 y Fv(5.4)68 b(AP-REQ)45 b(and)f(AP-REP)h(F) -11 b(unctions)150 4111 y Fw(The)23 b(\\AP-REQ")i(and)f(\\AP-REP")g (are)h(ASN.1)f(structures)g(used)f(b)m(y)h(application)h(clien)m(t)g (and)f(serv)m(ers)150 4221 y(to)h(pro)m(v)m(e)g(to)f(eac)m(h)h(other)g (who)e(they)h(are.)39 b(The)24 b(structures)f(con)m(tain)j(auxilliary)f (information,)g(together)150 4330 y(with)33 b(an)h(authen)m(ticator)i (\(see)e(Section)h(5.11)g([Authen)m(ticator)h(F)-8 b(unctions],)36 b(page)e(153\))i(whic)m(h)d(is)h(the)150 4440 y(real)27 b(cryptographic)g(pro)s(of.)39 b(The)26 b(follo)m(wing)h(illustrates)h (the)f(AP-REQ)f(and)g(AP-REP)g(ASN.1)h(struc-)150 4549 y(tures.)150 4682 y Fq(AP-REQ)476 b(::=)47 b([APPLICATION)d(14])j (SEQUENCE)e({)532 4792 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 4902 y(msg-type)379 b([1])47 b(INTEGER)f(\(14\),)532 5011 y(ap-options)283 b([2])47 b(APOptions,)532 5121 y(ticket)475 b([3])47 b(Ticket,)532 5230 y(authenticator)139 b([4])47 b(EncryptedData)e({Authenticator,)1677 5340 y({)j(keyuse-pa-TGSReq-authen)o(tica)o(tor)p eop end %%Page: 72 78 TeXDict begin 72 77 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(72)1773 299 y Fq(|)47 b(keyuse-APReq-authenticato)o(r)42 b(}})150 408 y(})150 628 y(AP-REP)476 b(::=)47 b([APPLICATION)d(15])j(SEQUENCE)e({)532 737 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 847 y(msg-type)379 b([1])47 b(INTEGER)f(\(15\),)532 956 y(enc-part)379 b([2])47 b(EncryptedData)e({EncAPRepPart,)1677 1066 y({)j(keyuse-EncAPRepPart)42 b(}})150 1176 y(})150 1395 y(EncAPRepPart)188 b(::=)47 b([APPLICATION)d(27])j(SEQUENCE)e({)532 1504 y(ctime)523 b([0])47 b(KerberosTime,)532 1614 y(cusec)523 b([1])47 b(Microseconds,)532 1724 y(subkey)475 b([2])47 b(EncryptionKey)e (OPTIONAL,)532 1833 y(seq-number)283 b([3])47 b(UInt32)f(OPTIONAL)150 1943 y(})150 2148 y Fl(shishi)p 459 2148 37 5 v 55 w(ap)3350 2351 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 1869 2351 28 4 v 39 w(ap)e(**)h Fe(ap)p Ff(\))390 2460 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2601 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g(that)h(holds)e(information) i(ab)s(out)f(AP)h(exc)m(hange)390 2742 y(Create)26 b(a)g(new)f(AP)g (exc)m(hange)i(with)e(a)h(random)f(subk)m(ey)g(of)g(the)h(default)g (encryption)f(t)m(yp)s(e)g(from)390 2851 y(con\014guration.)41 b(Note)30 b(that)g(there)g(is)f(no)h(guaran)m(tee)h(that)f(the)f (receiv)m(er)i(will)f(understand)d(that)390 2961 y(k)m(ey)38 b(t)m(yp)s(e,)i(y)m(ou)e(should)f(probably)g(use)g Fq (shishi_ap_etype\(\))c Fw(or)k Fq(shishi_ap_nosubkey\(\))390 3070 y Fw(instead.)i(In)26 b(the)g(future,)g(this)f(function)h(will)g (lik)m(ely)i(b)s(eha)m(v)m(e)e(as)g Fq(shishi_ap_nosubkey\(\))21 b Fw(and)390 3180 y Fq(shishi_ap_nosubkey\(\))k Fw(will)31 b(b)s(e)e(remo)m(v)m(ed.)390 3321 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3321 V 39 w(OK)f(i\013)i(successful.)150 3526 y Fl(shishi)p 459 3526 37 5 v 55 w(ap)p 642 3526 V 54 w(et)m(yp)s(e)3350 3729 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_etype)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2183 3729 28 4 v 39 w(ap)e(**)h Fe(ap)p Fi(,)g(in)m(t)g Fe(etype)p Ff(\))390 3838 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3979 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f (structure)g(that)h(holds)e(information)i(ab)s(out)f(AP)h(exc)m(hange) 390 4119 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(of)h(newly)f(generated)h(random)f(subk)m(ey)-8 b(.)390 4260 y(Create)31 b(a)g(new)f(AP)g(exc)m(hange)i(with)e(a)h (random)e(subk)m(ey)h(of)h(indicated)g(encryption)f(t)m(yp)s(e.)390 4401 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4401 V 39 w(OK)f(i\013)i(successful.)150 4606 y Fl(shishi)p 459 4606 37 5 v 55 w(ap)p 642 4606 V 54 w(nosubk)m(ey)3350 4809 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_nosubkey)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 4809 28 4 v 39 w(ap)d(**)h Fe(ap)p Ff(\))390 4918 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5059 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g(that)h(holds)e(information) i(ab)s(out)f(AP)h(exc)m(hange)390 5199 y(Create)g(a)g(new)f(AP)g(exc)m (hange)i(without)e(subk)m(ey)g(in)h(authen)m(ticator.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 73 79 TeXDict begin 73 78 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(73)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(done)3350 497 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_done)49 b Ff(\()p Fi(Shishi)p 1469 497 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Ff(\))390 606 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 742 y(Deallo)s(cate)47 b(resources)c(asso)s(ciated)i(with)e(AP)h(exc)m (hange.)81 b(This)43 b(should)f(b)s(e)h(called)h(b)m(y)g(the)390 852 y(application)32 b(when)d(it)i(no)f(longer)h(need)f(to)h(utilize)h (the)f(AP)f(exc)m(hange)i(handle.)150 1052 y Fl(shishi)p 459 1052 37 5 v 55 w(ap)p 642 1052 V 54 w(set)p 848 1052 V 54 w(tktoptions)3350 1250 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_set_tktopti)q(ons)f Ff(\()p Fi(Shishi)p 1940 1250 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(Shishi)p 2580 1250 V 39 w(tkt)g(*)g Fe(tkt)p Fi(,)g(in)m(t)565 1360 y Fe(options)p Ff(\))390 1469 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 1605 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(AP)-8 b(.)390 1741 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g(in)f(AP)-8 b(.)390 1876 y(Set)51 b(the)h(tic)m(k)m(et)h(\(see)f Fq(shishi_ap_tkt_set\(\))p Fw(\))47 b(and)j(set)i(the)f(AP-REQ)g(ap)s(options)g(\(see)390 1986 y Fq(shishi_apreq_options_set)o(\(\))p Fw(\).)390 2122 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2122 V 39 w(OK)f(i\013)i(successful.)150 2322 y Fl(shishi)p 459 2322 37 5 v 55 w(ap)p 642 2322 V 54 w(set)p 848 2322 V 54 w(tktoptionsdata)3350 2520 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_set_tktopti)q(onsd) q(ata)f Ff(\()p Fi(Shishi)p 2149 2520 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2790 2520 V 38 w(tkt)f(*)565 2630 y Fe(tkt)p Fi(,)h(in)m(t)e Fe(options)p Fi(,)j(const)e(c)m(har)g (*)g Fe(data)p Fi(,)g(size)p 2263 2630 V 41 w(t)g Fe(len)p Ff(\))390 2739 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 2875 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(AP)-8 b(.)390 3011 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g (in)f(AP)-8 b(.)390 3146 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(c)m(hec)m(ksum)g(in)f(Authen)m (ticator.)390 3282 y Fi(len)p Fw(:)41 b(length)31 b(of)f(input)g(arra)m (y)g(with)h(data)g(to)g(c)m(hec)m(ksum)g(in)f(Authen)m(ticator.)390 3418 y(Set)51 b(the)h(tic)m(k)m(et)h(\(see)f Fq(shishi_ap_tkt_set\(\))p Fw(\))47 b(and)j(set)i(the)f(AP-REQ)g(ap)s(options)g(\(see)390 3527 y Fq(shishi_apreq_options_set)o(\(\))p Fw(\))25 b(and)k(set)i(the)g(Authen)m(ticator)h(c)m(hec)m(ksum)f(data.)390 3663 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3663 V 39 w(OK)f(i\013)i(successful.)150 3863 y Fl(shishi)p 459 3863 37 5 v 55 w(ap)p 642 3863 V 54 w(set)p 848 3863 V 54 w(tktoptionsra)m(w)3350 4061 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_set_tktopti)q(onsr)q(aw)f Ff(\()p Fi(Shishi)p 2097 4061 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(Shishi)p 2737 4061 V 39 w(tkt)g(*)g Fe(tkt)p Fi(,)565 4171 y(in)m(t)g Fe(options)p Fi(,)i(in)m(t32)p 1330 4171 V 41 w(t)e Fe(cksumtype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(data)p Fi(,)g(size)p 2882 4171 V 41 w(t)g Fe(len)p Ff(\))390 4281 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 4416 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(AP)-8 b(.)390 4552 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g (in)f(AP)-8 b(.)390 4688 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(authen)m(ticator)33 b(c)m(hec)m(ksum)e(t)m(yp)s(e)f(to)i (set)e(in)h(AP)-8 b(.)390 4823 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(store)g(in)f(c)m(hec)m(ksum)h(\014eld)f (in)g(Authen)m(ticator.)390 4959 y Fi(len)p Fw(:)41 b(length)31 b(of)f(input)g(arra)m(y)g(with)h(data)g(to)g(store)g(in)f(c)m(hec)m (ksum)h(\014eld)f(in)g(Authen)m(ticator.)390 5095 y(Set)51 b(the)h(tic)m(k)m(et)h(\(see)f Fq(shishi_ap_tkt_set\(\))p Fw(\))47 b(and)j(set)i(the)f(AP-REQ)g(ap)s(options)g(\(see)390 5204 y Fq(shishi_apreq_options_set)o(\(\))p Fw(\))25 b(and)k(set)i(the)g(ra)m(w)f(Authen)m(ticator)i(c)m(hec)m(ksum)f(data.) 390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 74 80 TeXDict begin 74 79 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(74)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(set)p 848 299 V 54 w(tktoptionsasn1usage)3350 484 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_set_tktopti)q(onsa)q(sn1)q(usa)q(ge)f Ff(\()p Fi(Shishi)p 2411 484 28 4 v 39 w(ap)29 b(*)h Fe(ap)p Fi(,)h(Shishi)p 3049 484 V 39 w(tkt)565 594 y(*)g Fe(tkt)p Fi(,)g(in)m(t)g Fe(options)p Fi(,)i(Shishi)p 1659 594 V 39 w(asn1)d Fe(node)p Fi(,)i(const)f(c)m(har)g(*)g Fe(field)p Fi(,)h(in)m(t)565 703 y Fe(authenticatorcksumkeyu)q(sag)q(e) p Fi(,)37 b(in)m(t)30 b Fe(authenticatorkeyusag)q(e)p Ff(\))390 813 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 942 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(AP)-8 b(.)390 1070 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g (in)f(AP)-8 b(.)390 1199 y Fi(no)s(de)5 b Fw(:)40 b(input)30 b(ASN.1)g(structure)g(to)h(store)g(as)g(authen)m(ticator)h(c)m(hec)m (ksum)g(data.)390 1328 y Fi(\014eld)t Fw(:)40 b(\014eld)30 b(in)g(ASN.1)h(structure)f(to)h(use.)390 1457 y Fi(authen)m(ticatorc)m (ksumk)m(eyusage)5 b Fw(:)44 b(k)m(ey)31 b(usage)g(for)g(c)m(hec)m (ksum)g(in)f(authen)m(ticator.)390 1586 y Fi(authen)m(ticatork)m (eyusage)5 b Fw(:)44 b(k)m(ey)31 b(usage)g(for)g(authen)m(ticator.)390 1714 y(Set)73 b(tic)m(k)m(et,)86 b(options)73 b(and)f(authen)m(ticator) j(c)m(hec)m(ksum)e(data)h(using)e Fq(shishi_ap_set_)390 1824 y(tktoptionsdata\(\))p Fw(.)56 b(The)36 b(authen)m(ticator)j(c)m (hec)m(ksum)f(data)g(is)f(the)g(DER)g(enco)s(ding)g(of)g(the)390 1933 y(ASN.1)31 b(\014eld)f(pro)m(vided.)390 2062 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2062 V 39 w(OK)f(i\013)i(successful.)150 2250 y Fl(shishi)p 459 2250 37 5 v 55 w(ap)p 642 2250 V 54 w(tktoptions)3350 2435 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_tktoptions)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 2435 28 4 v 39 w(ap)f(**)g Fe(ap)p Fi(,)565 2545 y(Shishi)p 810 2545 V 39 w(tkt)g(*)g Fe(tkt)p Fi(,)g(in)m(t)g Fe(options)p Ff(\))390 2655 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2783 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f (structure)g(that)h(holds)e(information)i(ab)s(out)f(AP)h(exc)m(hange) 390 2912 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(newly)h (created)g(AP)-8 b(.)390 3041 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g(in)f(newly)g(created)h(AP)-8 b(.)390 3170 y(Create)45 b(a)g(new)g(AP)f(exc)m(hange)i(using)e Fq(shishi_ap\(\))p Fw(,)i(and)e(set)h(the)g(tic)m(k)m(et)i(and)d (AP-REQ)390 3279 y(ap)s(options)36 b(using)f Fq (shishi_ap_set_tktoptions\(\))o Fw(.)52 b(A)36 b(random)g(session)g(k)m (ey)h(is)f(added)f(to)390 3389 y(the)c(authen)m(ticator,)h(using)e(the) h(same)f(k)m(eyt)m(yp)s(e)i(as)e(the)h(tic)m(k)m(et.)390 3518 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3518 V 39 w(OK)f(i\013)i(successful.)150 3705 y Fl(shishi)p 459 3705 37 5 v 55 w(ap)p 642 3705 V 54 w(tktoptionsdata) 3350 3891 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b (shishi_ap_tktoptionsd)q(ata)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 3891 28 4 v 38 w(ap)e(**)g Fe(ap)p Fi(,)565 4000 y(Shishi)p 810 4000 V 39 w(tkt)g(*)g Fe(tkt)p Fi(,)g(in)m(t)g Fe(options)p Fi(,)i(const)e(c)m(har)f(*)h Fe(data)p Fi(,)h(size)p 2766 4000 V 41 w(t)f Fe(len)p Ff(\))390 4110 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4239 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g (that)h(holds)e(information)i(ab)s(out)f(AP)h(exc)m(hange)390 4367 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(newly)h (created)g(AP)-8 b(.)390 4496 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g(in)f(newly)g(created)h(AP)-8 b(.)390 4625 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h (to)g(c)m(hec)m(ksum)g(in)f(Authen)m(ticator.)390 4754 y Fi(len)p Fw(:)41 b(length)31 b(of)f(input)g(arra)m(y)g(with)h(data)g (to)g(c)m(hec)m(ksum)g(in)f(Authen)m(ticator.)390 4882 y(Create)23 b(a)g(new)f(AP)h(exc)m(hange)h(using)e Fq(shishi_ap\(\))p Fw(,)f(and)h(set)h(the)g(tic)m(k)m(et,)k(AP-REQ)22 b(ap)s(options)390 4992 y(and)32 b(the)h(Authen)m(ticator)i(c)m(hec)m(ksum)f(data)f(using) g Fq(shishi_ap_set_tktoption)o(sdat)o(a\(\))p Fw(.)42 b(A)390 5102 y(random)f(session)h(k)m(ey)g(is)g(added)e(to)j(the)f (authen)m(ticator,)k(using)41 b(the)h(same)g(k)m(eyt)m(yp)s(e)h(as)f (the)390 5211 y(tic)m(k)m(et.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 75 81 TeXDict begin 75 80 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(75)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(tktoptionsra)m(w)3350 495 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_tktoptionsr)q (aw)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 495 28 4 v 39 w(ap)e(**)i Fe(ap)p Fi(,)565 604 y(Shishi)p 810 604 V 39 w(tkt)f(*)g Fe(tkt)p Fi(,)g(in)m(t)g Fe(options)p Fi(,)i(in)m(t32)p 2045 604 V 41 w(t)e Fe(cksumtype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(data)p Fi(,)g(size)p 3597 604 V 41 w(t)565 714 y Fe(len)p Ff(\))390 824 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 958 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g(that)h(holds)e(information) i(ab)s(out)f(AP)h(exc)m(hange)390 1092 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(newly)h(created)g(AP)-8 b(.)390 1226 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g (in)f(newly)g(created)h(AP)-8 b(.)390 1360 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(authen)m(ticator)33 b(c)m(hec)m(ksum)e(t)m(yp)s(e)f(to)i (set)e(in)h(AP)-8 b(.)390 1494 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(store)g(in)f(c)m(hec)m(ksum)h(\014eld)f (in)g(Authen)m(ticator.)390 1628 y Fi(len)p Fw(:)41 b(length)31 b(of)f(input)g(arra)m(y)g(with)h(data)g(to)g(store)g(in)f(c)m(hec)m (ksum)h(\014eld)f(in)g(Authen)m(ticator.)390 1762 y(Create)60 b(a)f(new)f(AP)h(exc)m(hange)h(using)e Fq(shishi_ap\(\))p Fw(,)63 b(and)58 b(set)i(the)e(tic)m(k)m(et,)69 b(AP-REQ)390 1871 y(ap)s(options)45 b(and)f(the)h(ra)m(w)h(Authen)m(ticator)g(c)m (hec)m(ksum)g(data)g(\014eld)e(using)h Fq(shishi_ap_set_)390 1981 y(tktoptionsraw\(\))p Fw(.)60 b(A)38 b(random)g(session)g(k)m(ey)h (is)f(added)f(to)i(the)g(authen)m(ticator,)j(using)c(the)390 2091 y(same)31 b(k)m(eyt)m(yp)s(e)g(as)g(the)f(tic)m(k)m(et.)390 2225 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2225 V 39 w(OK)f(i\013)i(successful.)150 2423 y Fl(shishi)p 459 2423 37 5 v 55 w(ap)p 642 2423 V 54 w(et)m(yp)s(e)p 989 2423 V 54 w(tktoptionsdata)3350 2619 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_etype_tktop)q(tion)q(sda)q(ta)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 2619 28 4 v 39 w(ap)565 2729 y(**)f Fe(ap)p Fi(,)g(in)m(t32)p 1050 2729 V 42 w(t)g Fe(etype)p Fi(,)h(Shishi)p 1714 2729 V 39 w(tkt)f(*)f Fe(tkt)p Fi(,)i(in)m(t)f Fe(options)p Fi(,)h(const)f(c)m(har)g(*)g Fe(data)p Fi(,)h(size)p 3670 2729 V 40 w(t)565 2838 y Fe(len)p Ff(\))390 2948 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3082 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g(that)h(holds)e(information) i(ab)s(out)f(AP)h(exc)m(hange)390 3216 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(of)h(newly)f(generated)h (random)f(subk)m(ey)-8 b(.)390 3350 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(newly)h(created)g(AP)-8 b(.)390 3484 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g (in)f(newly)g(created)h(AP)-8 b(.)390 3618 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(c)m(hec)m(ksum)g(in) f(Authen)m(ticator.)390 3752 y Fi(len)p Fw(:)41 b(length)31 b(of)f(input)g(arra)m(y)g(with)h(data)g(to)g(c)m(hec)m(ksum)g(in)f (Authen)m(ticator.)390 3886 y(Create)23 b(a)g(new)f(AP)h(exc)m(hange)h (using)e Fq(shishi_ap\(\))p Fw(,)f(and)h(set)h(the)g(tic)m(k)m(et,)k (AP-REQ)22 b(ap)s(options)390 3996 y(and)32 b(the)h(Authen)m(ticator)i (c)m(hec)m(ksum)f(data)f(using)g Fq(shishi_ap_set_tktoption)o(sdat)o (a\(\))p Fw(.)42 b(A)390 4105 y(random)f(session)h(k)m(ey)g(is)g(added) e(to)j(the)f(authen)m(ticator,)k(using)41 b(the)h(same)g(k)m(eyt)m(yp)s (e)h(as)f(the)390 4215 y(tic)m(k)m(et.)390 4349 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4349 V 39 w(OK)f(i\013)i(successful.)150 4547 y Fl(shishi)p 459 4547 37 5 v 55 w(ap)p 642 4547 V 54 w(tktoptionsasn1usage)3350 4743 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_tktoptionsa)q (sn1u)q(sag)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 4743 28 4 v 39 w(ap)e(**)565 4853 y Fe(ap)p Fi(,)h(Shishi)p 970 4853 V 39 w(tkt)g(*)g Fe(tkt)p Fi(,)g(in)m(t)g Fe(options)p Fi(,)i(Shishi)p 2246 4853 V 39 w(asn1)d Fe(node)p Fi(,)i(const)f(c)m(har)g(*)g Fe(field)p Fi(,)h(in)m(t)565 4962 y Fe(authenticatorcksumkeyu)q(sag)q (e)p Fi(,)37 b(in)m(t)30 b Fe(authenticatorkeyusag)q(e)p Ff(\))390 5072 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5206 y Fi(ap)s Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g (that)h(holds)e(information)i(ab)s(out)f(AP)h(exc)m(hange)390 5340 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(set)g(in)f(newly)h (created)g(AP)-8 b(.)p eop end %%Page: 76 82 TeXDict begin 76 81 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(76)390 299 y Fi(options)t Fw(:)41 b(AP-REQ)30 b(options)h(to)g(set)g(in)f(newly)g(created)h(AP)-8 b(.)390 430 y Fi(no)s(de)5 b Fw(:)40 b(input)30 b(ASN.1)g(structure)g (to)h(store)g(as)g(authen)m(ticator)h(c)m(hec)m(ksum)g(data.)390 562 y Fi(\014eld)t Fw(:)40 b(\014eld)30 b(in)g(ASN.1)h(structure)f(to)h (use.)390 693 y Fi(authen)m(ticatorc)m(ksumk)m(eyusage)5 b Fw(:)44 b(k)m(ey)31 b(usage)g(for)g(c)m(hec)m(ksum)g(in)f(authen)m (ticator.)390 825 y Fi(authen)m(ticatork)m(eyusage)5 b Fw(:)44 b(k)m(ey)31 b(usage)g(for)g(authen)m(ticator.)390 956 y(Create)k(a)f(new)f(AP)h(exc)m(hange)i(using)d Fq(shishi_ap\(\))p Fw(,)f(and)h(set)i(tic)m(k)m(et,)i(options)e(and)e(authen-)390 1066 y(ticator)g(c)m(hec)m(ksum)f(data)g(from)f(the)g(DER)h(enco)s (ding)f(of)h(the)f(ASN.1)h(\014eld)f(using)g Fq(shishi_ap_)390 1175 y(set_tktoptionsasn1usage\()o(\))p Fw(.)40 b(A)33 b(random)e(session)h(k)m(ey)h(is)g(added)e(to)i(the)g(authen)m (ticator,)390 1285 y(using)d(the)g(same)h(k)m(eyt)m(yp)s(e)h(as)e(the)h (tic)m(k)m(et.)390 1416 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1416 28 4 v 39 w(OK)f(i\013)i (successful.)150 1609 y Fl(shishi)p 459 1609 37 5 v 55 w(ap)p 642 1609 V 54 w(tkt)3350 1800 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_ap_tkt)c Ff(\()p Fi(Shishi)p 1835 1800 28 4 v 40 w(ap)30 b(*)h Fe(ap)p Ff(\))390 1910 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 2041 y(Get)h(Tic)m(k)m(et)i(from)d(AP)g (exc)m(hange.)390 2173 y Fk(Return)k(v)-5 b(alue:)49 b Fw(Returns)33 b(the)h(tic)m(k)m(et)j(from)d(the)h(AP)f(exc)m(hange,)j (or)d(NULL)g(if)g(not)h(y)m(et)g(set)g(or)390 2282 y(an)30 b(error)g(o)s(ccured.)150 2475 y Fl(shishi)p 459 2475 37 5 v 55 w(ap)p 642 2475 V 54 w(tkt)p 857 2475 V 53 w(set)3350 2666 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_tkt_set)c Ff(\()p Fi(Shishi)p 1626 2666 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2267 2666 V 38 w(tkt)f(*)g Fe(tkt)p Ff(\))390 2776 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 2907 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(store)g(in)f(AP)-8 b(.)390 3038 y(Set)31 b(the)f(Tic)m(k)m(et)i (in)e(the)h(AP)f(exc)m(hange.)150 3232 y Fl(shishi)p 459 3232 37 5 v 55 w(ap)p 642 3232 V 54 w(authen)m(ticator)p 1417 3232 V 53 w(c)m(ksumdata)3350 3422 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_authenticat)q(or_c)q(ksu)q(mda)q(ta)f Ff(\()p Fi(Shishi)p 2411 3422 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(c)m(har)g(*)565 3532 y Fe(out)p Fi(,)h(size)p 925 3532 V 40 w(t)f(*)g Fe(len)p Ff(\))390 3641 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g (exc)m(hange)390 3773 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(that)g(holds)f(authen)m(ticator)i(c)m(hec)m(ksum)f(data.) 390 3904 y Fi(len)p Fw(:)52 b(on)36 b(input,)g(maxim)m(um)g(length)g (of)g(output)g(arra)m(y)g(that)h(holds)e(authen)m(ticator)j(c)m(hec)m (ksum)390 4014 y(data,)25 b(on)d(output)g(actual)i(length)f(of)g (output)f(arra)m(y)g(that)h(holds)f(authen)m(ticator)j(c)m(hec)m(ksum)e (data.)390 4145 y(Get)31 b(c)m(hec)m(ksum)g(data)h(from)d(Authen)m (ticator.)390 4277 y Fk(Return)47 b(v)-5 b(alue:)74 b Fw(Returns)46 b Fq(SHISHI_OK)e Fw(if)j(successful,)k(or)46 b Fq(SHISHI_TOO_SMALL_BUFFER)41 b Fw(if)390 4386 y(bu\013er)29 b(pro)m(vided)h(w)m(as)h(to)s(o)g(small)g(\(then)f Fq(len)g Fw(will)h(hold)f(necessary)g(bu\013er)g(size\).)150 4580 y Fl(shishi)p 459 4580 37 5 v 55 w(ap)p 642 4580 V 54 w(authen)m(ticator)p 1417 4580 V 53 w(c)m(ksumdata)p 2041 4580 V 53 w(set)3350 4770 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_authenticator_)q(cks)q(umd)q(ata)q(_set)e Ff(\()p Fi(Shishi)p 2672 4770 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)565 4880 y(const)h(c)m(har)g(*)f Fe(authenticatorcksumda)q (ta)p Fi(,)37 b(size)p 2432 4880 V 41 w(t)565 4989 y Fe(authenticatorcksumdata)q(len)q Ff(\))390 5099 y Fi(ap)s Fw(:)j(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc) m(hange)390 5230 y Fi(authen)m(ticatorc)m(ksumdata)p Fw(:)54 b(input)35 b(arra)m(y)h(with)g(data)g(to)h(compute)f(c)m(hec)m (ksum)g(on)g(and)f(store)390 5340 y(in)30 b(Authen)m(ticator)i(in)e (AP-REQ.)p eop end %%Page: 77 83 TeXDict begin 77 82 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(77)390 299 y Fi(authen)m(ticatorc)m (ksumdatalen)p Fw(:)42 b(length)26 b(of)h(input)e(arra)m(y)i(with)f (data)h(to)g(compute)g(c)m(hec)m(ksum)g(on)390 408 y(and)j(store)h(in)f (Authen)m(ticator)i(in)e(AP-REQ.)390 561 y(Set)d(the)g(Authen)m (ticator)h(Chec)m(ksum)f(Data)h(in)e(the)h(AP)g(exc)m(hange.)41 b(This)26 b(is)h(the)g(data)g(that)h(will)390 670 y(b)s(e)k(c)m(hec)m (ksumed,)i(and)e(the)h(c)m(hec)m(ksum)g(placed)h(in)e(the)h(c)m(hec)m (ksum)g(\014eld.)47 b(It)33 b(is)g(not)g(the)g(actual)390 780 y(c)m(hec)m(ksum)e(\014eld.)40 b(See)31 b(also)g(shishi)p 1603 780 28 4 v 40 w(ap)p 1739 780 V 40 w(authen)m(ticator)p 2310 780 V 42 w(c)m(ksumra)m(w)p 2744 780 V 40 w(set.)150 997 y Fl(shishi)p 459 997 37 5 v 55 w(ap)p 642 997 V 54 w(authen)m(ticator)p 1417 997 V 53 w(c)m(ksumra)m(w)p 2001 997 V 53 w(set)3350 1211 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_authenticator_)q(cks)q(umr)q(aw_)q(set)e Ff(\()p Fi(Shishi)p 2620 1211 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)565 1320 y(in)m(t32)p 769 1320 V 42 w(t)f Fe(authenticatorcksumtyp)q(e)p Fi(,)36 b(const)31 b(c)m(har)g(*)g Fe(authenticatorcksumraw)p Fi(,)565 1430 y(size)p 712 1430 V 41 w(t)g Fe(authenticatorcksumrawle)q(n)p Ff(\))390 1540 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h (ab)s(out)f(AP)g(exc)m(hange)390 1692 y Fi(authen)m(ticatorc)m(ksum)m (t)m(yp)s(e)5 b Fw(:)44 b(authen)m(ticator)32 b(c)m(hec)m(ksum)f(t)m (yp)s(e)g(to)g(set)g(in)f(AP)-8 b(.)390 1844 y Fi(authen)m(ticatorc)m (ksumra)m(w)8 b Fw(:)52 b(input)35 b(arra)m(y)h(with)f(authen)m (ticator)i(c)m(hec)m(ksum)f(\014eld)f(v)-5 b(alue)35 b(to)h(set)390 1953 y(in)30 b(Authen)m(ticator)i(in)e(AP-REQ.)390 2105 y Fi(authen)m(ticatorc)m(ksumra)m(wlen)p Fw(:)54 b(length)36 b(of)f(input)g(arra)m(y)h(with)f(authen)m(ticator)j(c)m (hec)m(ksum)e(\014eld)390 2215 y(v)-5 b(alue)31 b(to)g(set)g(in)f (Authen)m(ticator)i(in)e(AP-REQ.)390 2367 y(Set)f(the)g(Authen)m (ticator)h(Chec)m(ksum)e(Data)j(in)d(the)h(AP)g(exc)m(hange.)41 b(This)28 b(is)h(the)g(actual)h(c)m(hec)m(k-)390 2477 y(sum)36 b(\014eld,)j(not)e(data)h(to)f(compute)h(c)m(hec)m(ksum)g(on)f (and)f(then)h(store)g(in)g(the)g(c)m(hec)m(ksum)h(\014eld.)390 2586 y(See)31 b(also)g(shishi)p 964 2586 V 39 w(ap)p 1099 2586 V 40 w(authen)m(ticator)p 1670 2586 V 42 w(c)m(ksumdata)p 2136 2586 V 41 w(set.)150 2803 y Fl(shishi)p 459 2803 37 5 v 55 w(ap)p 642 2803 V 54 w(authen)m(ticator)p 1417 2803 V 53 w(c)m(ksum)m(t)m(yp)s(e)3350 3017 y Fw([F)-8 b(unction])-3599 b Fg(int32_t)54 b(shishi_ap_authenticat)q(or_)q(cks)q (umt)q(ype)e Ff(\()p Fi(Shishi)p 2620 3017 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Ff(\))390 3127 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 3279 y(Get)h(the)g(Authen)m(ticator)h(Chec)m(ksum)e(T)m(yp)s (e)g(in)g(the)g(AP)h(exc)m(hange.)390 3431 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(the)g(authen)m(ticator)j(c)m(hec)m(ksum)e (t)m(yp)s(e.)150 3648 y Fl(shishi)p 459 3648 37 5 v 55 w(ap)p 642 3648 V 54 w(authen)m(ticator)p 1417 3648 V 53 w(c)m(ksum)m(t)m(yp)s(e)p 2039 3648 V 53 w(set)3350 3862 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b (shishi_ap_authenticator_)q(cks)q(umt)q(ype)q(_set)e Ff(\()p Fi(Shishi)p 2672 3862 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)565 3972 y(in)m(t32)p 769 3972 V 42 w(t)g Fe(cksumtype)p Ff(\))390 4081 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 4233 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(authen)m(ticator)33 b(c)m(hec)m(ksum)e(t)m(yp)s(e)f(to)i(set)e(in)h(AP)-8 b(.)390 4386 y(Set)31 b(the)f(Authen)m(ticator)i(Chec)m(ksum)e(T)m(yp)s (e)g(in)g(the)h(AP)f(exc)m(hange.)150 4602 y Fl(shishi)p 459 4602 37 5 v 55 w(ap)p 642 4602 V 54 w(authen)m(ticator)3350 4817 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_ap_authenticator)c Ff(\()p Fi(Shishi)p 2306 4817 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Ff(\))390 4926 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out) f(AP)g(exc)m(hange)390 5078 y(Get)h(ASN.1)g(Authen)m(ticator)h (structure)e(from)g(AP)h(exc)m(hange.)390 5230 y Fk(Return)e(v)-5 b(alue:)40 b Fw(Returns)28 b(the)g(Authen)m(ticator)j(from)d(the)h(AP)g (exc)m(hange,)i(or)d(NULL)h(if)g(not)g(y)m(et)390 5340 y(set)i(or)f(an)h(error)f(o)s(ccured.)p eop end %%Page: 78 84 TeXDict begin 78 83 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(78)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(authen)m(ticator)p 1417 299 V 53 w(set)3350 508 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_authenticator_)q(set)e Ff(\()p Fi(Shishi)p 2149 508 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2790 508 V 38 w(asn1)565 617 y Fe(authenticator)p Ff(\))390 727 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 874 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(to)e(store)g(in)f(AP)-8 b(.)390 1021 y(Set)31 b(the)f(Authen)m (ticator)i(in)e(the)h(AP)f(exc)m(hange.)150 1232 y Fl(shishi)p 459 1232 37 5 v 55 w(ap)p 642 1232 V 54 w(req)3350 1441 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_ap_req)49 b Ff(\()p Fi(Shishi)p 1783 1441 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Ff(\))390 1551 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 1697 y(Get)h(ASN.1)g(AP-REQ)f(structure)g(from)g(AP)h(exc)m(hange.)390 1844 y Fk(Return)h(v)-5 b(alue:)46 b Fw(Returns)32 b(the)g(AP-REQ)h (from)f(the)h(AP)f(exc)m(hange,)j(or)e(NULL)f(if)h(not)g(y)m(et)g(set) 390 1954 y(or)d(an)h(error)f(o)s(ccured.)150 2165 y Fl(shishi)p 459 2165 37 5 v 55 w(ap)p 642 2165 V 54 w(req)p 867 2165 V 54 w(set)3350 2374 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_req_set)c Ff(\()p Fi(Shishi)p 1626 2374 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2267 2374 V 38 w(asn1)f Fe(apreq)p Ff(\))390 2484 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 2630 y Fi(apreq)r Fw(:)41 b(apreq)30 b(to)h(store)g(in)f(AP) -8 b(.)390 2777 y(Set)31 b(the)f(AP-REQ)g(in)g(the)h(AP)f(exc)m(hange.) 150 2989 y Fl(shishi)p 459 2989 37 5 v 55 w(ap)p 642 2989 V 54 w(req)p 867 2989 V 54 w(der)3350 3198 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_der)e Ff(\()p Fi(Shishi)p 1574 3198 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(c)m(har)g(**)g Fe(out)p Fi(,)h(size)p 2650 3198 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 3307 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 3454 y Fi(out)r Fw(:)41 b(p)s(oin)m(ter)30 b(to)h(output)f(arra)m(y)h(with)f(der)g(enco)s(ding)h(of)f(AP-REQ.)390 3601 y Fi(outlen)p Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(length)f(of)h (output)f(arra)m(y)h(with)f(der)g(enco)s(ding)g(of)h(AP-REQ.)390 3747 y(Build)f(AP-REQ)g(using)g Fq(shishi_ap_req_build\(\))25 b Fw(and)30 b(DER)g(enco)s(de)h(it.)41 b Fq(out)30 b Fw(is)g(allo)s(cated)390 3857 y(b)m(y)g(this)h(function,)f(and)g(it)h (is)f(the)h(resp)s(onsibilit)m(y)f(of)g(caller)i(to)f(deallo)s(cate)i (it.)390 4004 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4004 V 39 w(OK)f(i\013)i(successful.)150 4215 y Fl(shishi)p 459 4215 37 5 v 55 w(ap)p 642 4215 V 54 w(req)p 867 4215 V 54 w(der)p 1095 4215 V 54 w(set)3350 4424 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_der_set)f Ff(\()p Fi(Shishi)p 1783 4424 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)h(c)m(har)g(*)g Fe(der)p Fi(,)g(size)p 2813 4424 V 41 w(t)565 4534 y Fe(derlen)p Ff(\))390 4643 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out) f(AP)g(exc)m(hange)390 4790 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REQ.)390 4937 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(DER) h(enco)s(ded)f(AP-REQ.)390 5084 y(DER)f(deco)s(de)g(AP-REQ)g(and)f(set) h(it)h(AP)f(exc)m(hange.)41 b(If)29 b(deco)s(ding)g(fails,)g(the)h (AP-REQ)e(in)h(the)390 5193 y(AP)h(exc)m(hange)i(is)f(lost.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK.)p eop end %%Page: 79 85 TeXDict begin 79 84 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(79)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(req)p 867 299 V 54 w(build)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_build)e Ff(\()p Fi(Shishi)p 1678 498 28 4 v 40 w(ap)30 b(*)h Fe(ap)p Ff(\))390 608 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g (exc)m(hange)390 745 y(Chec)m(ksum)g(data)h(in)f(authen)m(ticator)i (and)e(add)g(tic)m(k)m(et)j(and)d(authen)m(ticator)i(to)f(AP-REQ.)390 882 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 882 V 39 w(OK)f(i\013)i(successful.)150 1084 y Fl(shishi)p 459 1084 37 5 v 55 w(ap)p 642 1084 V 54 w(req)p 867 1084 V 54 w(deco)s(de)3350 1284 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_decode)f Ff(\()p Fi(Shishi)p 1731 1284 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Ff(\))390 1393 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 1531 y(Deco)s(de)h(tic)m(k)m(et)i(in)e (AP-REQ)f(and)f(set)i(the)g(Tic)m(k)m(et)h(\014elds)e(in)g(the)h(AP)f (exc)m(hange.)390 1668 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1668 V 39 w(OK)f(i\013)i(successful.) 150 1870 y Fl(shishi)p 459 1870 37 5 v 55 w(ap)p 642 1870 V 54 w(req)p 867 1870 V 54 w(pro)s(cess)p 1310 1870 V 56 w(k)m(eyusage)3350 2069 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_process)q(_key)q(usa)q(ge)f Ff(\()p Fi(Shishi)p 2254 2069 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(Shishi)p 2894 2069 V 39 w(k)m(ey)g(*)565 2179 y Fe(key)p Fi(,)h(in)m(t32)p 982 2179 V 41 w(t)f Fe(keyusage)p Ff(\))390 2288 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 2426 y Fi(k)m(ey)8 b Fw(:)41 b(cryptographic)31 b(k)m(ey)g(used)f(to)h (decrypt)f(tic)m(k)m(et)j(in)d(AP-REQ.)390 2563 y Fi(k)m(eyusage)5 b Fw(:)41 b(k)m(ey)29 b(usage)f(to)h(use)f(during)f(decryption,)h(for)g (normal)g(AP-REQ's)g(this)g(is)g(normally)390 2672 y(SHISHI)p 700 2672 V 39 w(KEYUSA)m(GE)p 1257 2672 V 40 w(APREQ)p 1627 2672 V 40 w(A)m(UTHENTICA)-8 b(TOR,)50 b(for)g(AP-REQ's)g(part)g (of)g(TGS-)390 2782 y(REQ's,)22 b(this)e(is)h(normally)f(SHISHI)p 1628 2782 V 39 w(KEYUSA)m(GE)p 2185 2782 V 40 w(TGSREQ)p 2613 2782 V 39 w(APREQ)p 2982 2782 V 40 w(A)m(UTHENTICA)-8 b(TOR.)390 2919 y(Decrypt)26 b(tic)m(k)m(et)i(in)c(AP-REQ)h(using)g (supplied)f(k)m(ey)i(and)f(decrypt)f(Authen)m(ticator)j(in)e(AP-REQ)390 3029 y(using)30 b(k)m(ey)h(in)f(decrypted)f(tic)m(k)m(et,)34 b(and)29 b(on)h(success)h(set)f(the)h(Tic)m(k)m(et)h(and)e(Authen)m (ticator)h(\014elds)390 3138 y(in)f(the)h(AP)f(exc)m(hange.)390 3276 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3276 V 39 w(OK)f(i\013)i(successful.)150 3478 y Fl(shishi)p 459 3478 37 5 v 55 w(ap)p 642 3478 V 54 w(req)p 867 3478 V 54 w(pro)s(cess)3350 3677 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_process)f Ff(\()p Fi(Shishi)p 1783 3677 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)h(Shishi)p 2423 3677 V 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 3787 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 3924 y Fi(k)m(ey)8 b Fw(:)41 b(cryptographic)31 b(k)m(ey)g(used)f(to)h(decrypt)f(tic)m(k)m(et)j(in)d (AP-REQ.)390 4061 y(Decrypt)c(tic)m(k)m(et)i(in)c(AP-REQ)h(using)g (supplied)f(k)m(ey)i(and)f(decrypt)f(Authen)m(ticator)j(in)e(AP-REQ)390 4171 y(using)30 b(k)m(ey)h(in)f(decrypted)f(tic)m(k)m(et,)34 b(and)29 b(on)h(success)h(set)f(the)h(Tic)m(k)m(et)h(and)e(Authen)m (ticator)h(\014elds)390 4280 y(in)f(the)h(AP)f(exc)m(hange.)390 4417 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4417 V 39 w(OK)f(i\013)i(successful.)150 4619 y Fl(shishi)p 459 4619 37 5 v 55 w(ap)p 642 4619 V 54 w(req)p 867 4619 V 54 w(asn1)3350 4819 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_req_asn1)e Ff(\()p Fi(Shishi)p 1626 4819 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2267 4819 V 38 w(asn1)f(*)g Fe(apreq)p Ff(\))390 4928 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 5066 y Fi(apreq)r Fw(:)41 b(output)30 b(AP-REQ)g(v)-5 b(ariable.)390 5203 y(Build)30 b(AP-REQ)g(using)g Fq(shishi_ap_req_build\(\))25 b Fw(and)30 b(return)f(it.)390 5340 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 80 86 TeXDict begin 80 85 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(80)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(k)m(ey)3350 508 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e(shishi_ap_key)c Ff(\()p Fi(Shishi)p 1835 508 28 4 v 40 w(ap)30 b(*)h Fe(ap)p Ff(\))390 617 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 764 y(Extract)37 b(the)f(application)h(k)m(ey)f(from)f(AP)-8 b(.)37 b(If)e(subk)m(eys)g(are)h(used,)h(it)f(is)g(tak)m(en)h(from)e (the)h(Au-)390 874 y(then)m(ticator,)d(otherwise)d(the)h(session)g(k)m (ey)g(is)f(used.)390 1021 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(application)h(k)m(ey)h(from)d(AP)-8 b(.)150 1232 y Fl(shishi)p 459 1232 37 5 v 55 w(ap)p 642 1232 V 54 w(rep)3350 1441 y Fw([F)g(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_ap_rep)49 b Ff(\()p Fi(Shishi)p 1783 1441 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Ff(\))390 1551 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 1697 y(Get)h(ASN.1)g(AP-REP)g(structure)e (from)h(AP)h(exc)m(hange.)390 1844 y Fk(Return)i(v)-5 b(alue:)47 b Fw(Returns)32 b(the)h(AP-REP)g(from)g(the)g(AP)h(exc)m (hange,)h(or)e(NULL)g(if)h(not)f(y)m(et)h(set)390 1954 y(or)c(an)h(error)f(o)s(ccured.)150 2165 y Fl(shishi)p 459 2165 37 5 v 55 w(ap)p 642 2165 V 54 w(rep)p 870 2165 V 55 w(set)3350 2374 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_rep_set)c Ff(\()p Fi(Shishi)p 1626 2374 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2267 2374 V 38 w(asn1)f Fe(aprep)p Ff(\))390 2484 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 2630 y Fi(aprep)s Fw(:)40 b(aprep)30 b(to)h(store)g(in)f(AP) -8 b(.)390 2777 y(Set)31 b(the)f(AP-REP)g(in)h(the)f(AP)g(exc)m(hange.) 150 2989 y Fl(shishi)p 459 2989 37 5 v 55 w(ap)p 642 2989 V 54 w(rep)p 870 2989 V 55 w(der)3350 3198 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_der)e Ff(\()p Fi(Shishi)p 1574 3198 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(c)m(har)g(**)g Fe(out)p Fi(,)h(size)p 2650 3198 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 3307 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m (hange)390 3454 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f (newly)g(allo)s(cated)i(DER)f(enco)s(ding)f(of)h(AP-REP)-8 b(.)390 3601 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m (y)h(with)f(DER)h(enco)s(ding)f(of)h(AP-REP)-8 b(.)390 3747 y(Build)31 b(AP-REP)g(using)g Fq(shishi_ap_rep_build\(\))25 b Fw(and)30 b(DER)i(enco)s(de)f(it.)44 b Fq(out)30 b Fw(is)h(allo)s(cated)390 3857 y(b)m(y)f(this)h(function,)f(and)g(it)h (is)f(the)h(resp)s(onsibilit)m(y)f(of)g(caller)i(to)f(deallo)s(cate)i (it.)390 4004 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4004 V 39 w(OK)f(i\013)i(successful.)150 4215 y Fl(shishi)p 459 4215 37 5 v 55 w(ap)p 642 4215 V 54 w(rep)p 870 4215 V 55 w(der)p 1099 4215 V 54 w(set)3350 4424 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_der_set)f Ff(\()p Fi(Shishi)p 1783 4424 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)h(c)m(har)g(*)g Fe(der)p Fi(,)g(size)p 2813 4424 V 41 w(t)565 4534 y Fe(derlen)p Ff(\))390 4643 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out) f(AP)g(exc)m(hange)390 4790 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REP)-8 b(.)390 4937 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f (DER)h(enco)s(ded)f(AP-REP)-8 b(.)390 5084 y(DER)30 b(deco)s(de)h (AP-REP)f(and)f(set)i(it)g(AP)f(exc)m(hange.)42 b(If)30 b(deco)s(ding)g(fails,)h(the)g(AP-REP)f(in)g(the)390 5193 y(AP)g(exc)m(hange)i(remains.)390 5340 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK.)p eop end %%Page: 81 87 TeXDict begin 81 86 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(81)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(rep)p 870 299 V 55 w(build)3350 517 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_build)e Ff(\()p Fi(Shishi)p 1678 517 28 4 v 40 w(ap)30 b(*)h Fe(ap)p Ff(\))390 626 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g (exc)m(hange)390 782 y(Chec)m(ksum)g(data)h(in)f(authen)m(ticator)i (and)e(add)g(tic)m(k)m(et)j(and)d(authen)m(ticator)i(to)f(AP-REP)-8 b(.)390 937 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 937 V 39 w(OK)f(i\013)i(successful.)150 1157 y Fl(shishi)p 459 1157 37 5 v 55 w(ap)p 642 1157 V 54 w(rep)p 870 1157 V 55 w(asn1)3350 1375 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_asn1)e Ff(\()p Fi(Shishi)p 1626 1375 28 4 v 39 w(ap)31 b(*)f Fe(ap)p Fi(,)i(Shishi)p 2267 1375 V 38 w(asn1)f(*)g Fe(aprep)p Ff(\))390 1485 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 1640 y Fi(aprep)s Fw(:)40 b(output)30 b(AP-REP)g(v)-5 b(ariable.)390 1796 y(Build)30 b(AP-REP)h(using)e Fq(shishi_ap_rep_build\(\))c Fw(and)30 b(return)f(it.)390 1951 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1951 V 39 w(OK)f(i\013)i(successful.)150 2172 y Fl(shishi)p 459 2172 37 5 v 55 w(ap)p 642 2172 V 54 w(rep)p 870 2172 V 55 w(v)m(erify)3350 2389 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_verify)f Ff(\()p Fi(Shishi)p 1731 2389 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Ff(\))390 2499 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(AP)g(exc)m(hange)390 2654 y(V)-8 b(erify)31 b(AP-REP)f(compared) h(to)g(Authen)m(ticator.)390 2810 y Fk(Return)24 b(v)-5 b(alue:)38 b Fw(Returns)24 b(SHISHI)p 1619 2810 V 39 w(OK,)g(SHISHI)p 2153 2810 V 39 w(APREP)p 2513 2810 V 39 w(VERIFY)p 2909 2810 V 41 w(F)-10 b(AILED)24 b(or)h(an)f(error.)150 3030 y Fl(shishi)p 459 3030 37 5 v 55 w(ap)p 642 3030 V 54 w(rep)p 870 3030 V 55 w(v)m(erify)p 1229 3030 V 53 w(der)3350 3248 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_verify_)q(der)f Ff(\()p Fi(Shishi)p 1940 3248 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(c)m(har)g(*)g Fe(der)p Fi(,)g(size)p 2970 3248 V 41 w(t)565 3357 y Fe(derlen)p Ff(\))390 3467 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g(exc)m(hange)390 3623 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s (ded)f(AP-REP)-8 b(.)390 3778 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REP)-8 b(.)390 3934 y(DER)35 b(deco)s(de)h(AP-REP)f(and)g(set)h(it)f(in)g(AP)h (exc)m(hange)g(using)f Fq(shishi_ap_rep_der_set\(\))390 4043 y Fw(and)30 b(v)m(erify)h(it)f(using)g Fq (shishi_ap_rep_verify\(\))p Fw(.)390 4199 y Fk(Return)24 b(v)-5 b(alue:)38 b Fw(Returns)24 b(SHISHI)p 1619 4199 V 39 w(OK,)g(SHISHI)p 2153 4199 V 39 w(APREP)p 2513 4199 V 39 w(VERIFY)p 2909 4199 V 41 w(F)-10 b(AILED)24 b(or)h(an)f(error.) 150 4419 y Fl(shishi)p 459 4419 37 5 v 55 w(ap)p 642 4419 V 54 w(rep)p 870 4419 V 55 w(v)m(erify)p 1229 4419 V 53 w(asn1)3350 4637 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ap_rep_verify_)q(asn1)f Ff(\()p Fi(Shishi)p 1992 4637 28 4 v 39 w(ap)31 b(*)g Fe(ap)p Fi(,)g(Shishi)p 2633 4637 V 39 w(asn1)f Fe(aprep)p Ff(\))390 4746 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g (exc)m(hange)390 4902 y Fi(aprep)s Fw(:)40 b(input)29 b(AP-REP)-8 b(.)390 5057 y(Set)26 b(the)h(AP-REP)f(in)g(the)h(AP)f(exc) m(hange)i(using)d Fq(shishi_ap_rep_set\(\))c Fw(and)26 b(v)m(erify)h(it)f(using)390 5167 y Fq(shishi_ap_rep_verify\(\))p Fw(.)390 5322 y Fk(Return)e(v)-5 b(alue:)38 b Fw(Returns)24 b(SHISHI)p 1619 5322 V 39 w(OK,)g(SHISHI)p 2153 5322 V 39 w(APREP)p 2513 5322 V 39 w(VERIFY)p 2909 5322 V 41 w(F)-10 b(AILED)24 b(or)h(an)f(error.)p eop end %%Page: 82 88 TeXDict begin 82 87 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(82)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ap)p 642 299 V 54 w(encapreppart)3350 493 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_ap_encapreppart)c Ff(\()p Fi(Shishi)p 2254 493 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Ff(\))390 603 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(AP)g (exc)m(hange)390 736 y(Get)h(ASN.1)g(EncAPRepP)m(art)g(structure)f (from)g(AP)g(exc)m(hange.)390 869 y Fk(Return)j(v)-5 b(alue:)47 b Fw(Returns)32 b(the)i(EncAPREPP)m(art)f(from)g(the)g(AP)g (exc)m(hange,)j(or)d(NULL)g(if)h(not)390 979 y(y)m(et)e(set)e(or)h(an)f (error)g(o)s(ccured.)150 1176 y Fl(shishi)p 459 1176 37 5 v 55 w(ap)p 642 1176 V 54 w(encapreppart)p 1403 1176 V 54 w(set)3350 1370 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_ap_encapreppart_s)q(et)e Ff(\()p Fi(Shishi)p 2097 1370 28 4 v 39 w(ap)30 b(*)h Fe(ap)p Fi(,)g(Shishi)p 2737 1370 V 39 w(asn1)565 1480 y Fe(encapreppart)p Ff(\))390 1589 y Fi(ap)s Fw(:)40 b(structure)30 b(that)h(holds)f (information)h(ab)s(out)f(AP)g(exc)m(hange)390 1723 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(to)g(store)g(in)f(AP) -8 b(.)390 1856 y(Set)31 b(the)f(EncAPRepP)m(art)h(in)f(the)g(AP)h(exc) m(hange.)150 2053 y Fl(shishi)p 459 2053 37 5 v 55 w(ap)p 642 2053 V 54 w(option2string)3350 2247 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_ap_option2strin)q(g)e Ff(\()p Fi(Shishi)p 2358 2247 28 4 v 40 w(ap)s(options)30 b Fe(option)p Ff(\))390 2357 y Fi(option)p Fw(:)41 b(en)m(umerated)31 b(AP-Option)f(t)m(yp)s(e,)h(see)g(Shishi)p 2291 2357 V 39 w(ap)s(options.)390 2490 y(Con)m(v)m(ert)45 b(AP-Option)e(t)m(yp)s (e)h(to)h(AP-Option)e(name)h(string.)81 b(Note)45 b(that)f Fq(option)e Fw(m)m(ust)i(b)s(e)390 2600 y(just)d(one)g(of)g(the)h (AP-Option)f(t)m(yp)s(es,)j(it)e(cannot)g(b)s(e)e(an)h(binary)g(ORed)g (indicating)h(sev)m(eral)390 2709 y(AP-Options.)390 2842 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)29 b(static)j(string)f (with)f(name)g(of)g(AP-Option)h(that)g(m)m(ust)f(not)g(b)s(e)g(deal-) 390 2952 y(lo)s(cated,)i(or)e Fq(")p Fw(unkno)m(wn)p Fq(")f Fw(if)h(AP-Option)g(w)m(as)h(not)g(understo)s(o)s(d.)150 3149 y Fl(shishi)p 459 3149 37 5 v 55 w(ap)p 642 3149 V 54 w(string2option)3350 3343 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_apoptions)57 b(shishi_ap_string2opti)q(on)52 b Ff(\()p Fi(const)31 b(c)m(har)g(*)f Fe(str)p Ff(\))390 3453 y Fi(str)7 b Fw(:)37 b(zero)26 b(terminated)g(c)m(haracter)h(arra) m(y)e(with)g(name)g(of)g(AP-Option,)i(e.g.)40 b Fq(")p Fw(use-session-k)m(ey)p Fq(")p Fw(.)390 3586 y(Con)m(v)m(ert)31 b(AP-Option)g(name)f(to)h(AP-Option)g(t)m(yp)s(e.)390 3719 y Fk(Return)i(v)-5 b(alue:)47 b Fw(Returns)33 b(en)m(umerated)h(t) m(yp)s(e)f(mem)m(b)s(er)g(corresp)s(onding)f(to)j(AP-Option,)f(or)g(0) 390 3829 y(if)c(string)h(w)m(as)f(not)h(understo)s(o)s(d.)150 4026 y Fl(shishi)p 459 4026 V 55 w(apreq)3350 4220 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_apreq)49 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4330 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4463 y(This)g(function)g(creates)h (a)g(new)f(AP-REQ,)g(p)s(opulated)g(with)g(some)h(default)g(v)-5 b(alues.)390 4596 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(AP-REQ)g(or)h(NULL)f(on)g(failure.)150 4793 y Fl(shishi)p 459 4793 V 55 w(apreq)p 813 4793 V 54 w(prin)m(t)3350 4988 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_print)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 4988 28 4 v 39 w(asn1)565 5097 y Fe(apreq)p Ff(\))390 5207 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)p eop end %%Page: 83 89 TeXDict begin 83 88 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(83)390 299 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(prin)m(t.)390 434 y(Prin)m(t)f(ASCI)s(I)f (armored)h(DER)h(enco)s(ding)f(of)h(AP-REQ)f(to)h(\014le.)390 570 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 570 28 4 v 39 w(OK)f(i\013)i(successful.)150 770 y Fl(shishi)p 459 770 37 5 v 55 w(apreq)p 813 770 V 54 w(sa)m(v)m(e)3350 968 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_save)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 968 28 4 v 38 w(asn1)565 1077 y Fe(apreq)p Ff(\))390 1187 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 1322 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 1458 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(sa)m(v)m(e.)390 1593 y(Sa)m(v)m(e)h(DER)e(enco)s(ding)g(of)h(AP-REQ)f(to)h(\014le.)390 1728 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1728 V 39 w(OK)f(i\013)i(successful.)150 1929 y Fl(shishi)p 459 1929 37 5 v 55 w(apreq)p 813 1929 V 54 w(to)p 976 1929 V 54 w(\014le)3350 2126 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_to_file)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 2126 28 4 v 39 w(asn1)f Fe(apreq)p Fi(,)h(in)m(t)565 2236 y Fe(filetype)p Fi(,)h(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 2345 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2481 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(sa)m(v)m(e.)390 2616 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 2616 V 39 w(\014let)m(yp)s(e.)390 2752 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 2887 y(W)-8 b(rite)32 b(AP-REQ)e(to)h(\014le)g(in)f (sp)s(eci\014ed)f(TYPE.)h(The)g(\014le)h(will)f(b)s(e)g(truncated)h(if) f(it)h(exists.)390 3023 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3023 V 39 w(OK)f(i\013)i(successful.) 150 3223 y Fl(shishi)p 459 3223 37 5 v 55 w(apreq)p 813 3223 V 54 w(parse)3350 3420 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_parse)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 3420 28 4 v 39 w(asn1)f(*)565 3530 y Fe(apreq)p Ff(\))390 3640 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3775 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.) 390 3910 y Fi(apreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(AP-REQ.)390 4046 y(Read)f(ASCI)s(I)d (armored)j(DER)f(enco)s(ded)g(AP-REQ)g(from)g(\014le)h(and)e(p)s (opulate)i(giv)m(en)g(v)-5 b(ariable.)390 4181 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4181 V 39 w(OK)f(i\013)i(successful.)150 4381 y Fl(shishi)p 459 4381 37 5 v 55 w(apreq)p 813 4381 V 54 w(read)3350 4579 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_read)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 4579 28 4 v 38 w(asn1)f(*)565 4689 y Fe(apreq)p Ff(\))390 4798 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4934 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 5069 y Fi(apreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(AP-REQ.)390 5205 y(Read)f(DER)f(enco)s(ded)g(AP-REQ)g(from)g(\014le)h(and)e(p)s (opulate)i(giv)m(en)g(v)-5 b(ariable.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 84 90 TeXDict begin 84 89 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(84)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(apreq)p 813 299 V 54 w(from)p 1117 299 V 55 w(\014le)3350 524 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_from_fil)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 524 28 4 v 39 w(asn1)e(*)h Fe(apreq)p Fi(,)565 633 y(in)m(t)g Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 743 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 905 y Fi(apreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i (AP-REQ.)390 1068 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g (b)s(e)e(read,)i(see)g(Shishi)p 3066 1068 V 39 w(\014let)m(yp)s(e.)390 1230 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read)g(from.)390 1393 y(Read)g(AP-REQ)f (from)g(\014le)g(in)g(sp)s(eci\014ed)g(TYPE.)390 1556 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1556 V 39 w(OK)f(i\013)i(successful.)150 1783 y Fl(shishi)p 459 1783 37 5 v 55 w(apreq)p 813 1783 V 54 w(set)p 1019 1783 V 54 w(authen)m(ticator)3350 2008 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_set_auth)q(enti)q (cat)q(or)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 2008 28 4 v 39 w(asn1)565 2117 y Fe(apreq)p Fi(,)g(in)m(t32)p 1086 2117 V 42 w(t)e Fe(etype)p Fi(,)i(uin)m(t32)p 1759 2117 V 41 w(t)f Fe(kvno)p Fi(,)h(const)f(c)m(har)f(*)h Fe(buf)p Fi(,)h(size)p 2998 2117 V 41 w(t)e Fe(buflen)p Ff(\))390 2227 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2389 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(add)f(authen)m(ticator)i (\014eld)e(to.)390 2552 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(used)g(to)h(encrypt)f(authen)m(ticator.) 390 2714 y Fi(kvno)5 b Fw(:)40 b(v)m(ersion)31 b(of)g(the)f(k)m(ey)h (used)f(to)h(encrypt)f(authen)m(ticator.)390 2877 y Fi(buf)16 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(encrypted)g(authen)m(ticator.) 390 3040 y Fi(bu\015en)p Fw(:)39 b(size)31 b(of)g(input)e(arra)m(y)i (with)f(encrypted)g(authen)m(ticator.)390 3202 y(Set)i(the)g(encrypted) f(authen)m(ticator)i(\014eld)f(in)f(the)h(AP-REP)-8 b(.)32 b(The)f(encrypted)g(data)i(is)e(usually)390 3312 y(created)38 b(b)m(y)e(calling)i Fq(shishi_encrypt\(\))32 b Fw(on)37 b(the)f(DER)h(enco)s(ded)f(authen)m(ticator.)61 b(T)-8 b(o)37 b(sa)m(v)m(e)390 3421 y(time,)29 b(y)m(ou)e(ma)m(y)g(w)m(an)m(t) h(to)g(use)f Fq(shishi_apreq_add_authen)o(tic)o(ator)o(\(\))21 b Fw(instead,)28 b(whic)m(h)f(cal-)390 3531 y(culates)32 b(the)e(encrypted)g(data)h(and)f(calls)h(this)g(function)f(in)g(one)g (step.)390 3693 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3693 V 39 w(OK)f(on)i(success.)150 3921 y Fl(shishi)p 459 3921 37 5 v 55 w(apreq)p 813 3921 V 54 w(add)p 1063 3921 V 54 w(authen)m(ticator)3350 4146 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_add_auth)q(enti) q(cat)q(or)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 4146 28 4 v 39 w(asn1)565 4255 y Fe(apreq)p Fi(,)g(Shishi)p 1127 4255 V 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)g(in)m(t)g Fe(keyusage)p Fi(,)i(Shishi)p 2470 4255 V 39 w(asn1)e Fe(authenticator)p Ff(\))390 4365 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4527 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(add)f(authen)m (ticator)i(\014eld)e(to.)390 4690 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(to)f(use)f(for)g(encryption.)390 4852 y Fi(k)m(eyusage)5 b Fw(:)42 b(cryptographic)31 b(k)m(ey)g(usage)g(v)-5 b(alue)31 b(to)g(use)f(in)g(encryption.)390 5015 y Fi(authen)m(ticator) 7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 5177 y(Encrypts)f(DER)i(enco)s (ded)f(authen)m(ticator)i(using)e(k)m(ey)h(and)f(store)h(it)g(in)f(the) h(AP-REQ.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 85 91 TeXDict begin 85 90 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(85)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(apreq)p 813 299 V 54 w(set)p 1019 299 V 54 w(tic)m(k)m(et)3350 481 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_set_tick)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 481 28 4 v 39 w(asn1)f Fe(apreq)p Fi(,)565 591 y(Shishi)p 810 591 V 39 w(asn1)g Fe(ticket)p Ff(\))390 701 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 828 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(add)f(tic)m(k)m(et)j(\014eld)d(to.)390 955 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(tic)m(k)m(et)j(to)e(cop)m (y)g(in)m(to)g(AP-REQ)f(tic)m(k)m(et)j(\014eld.)390 1083 y(Cop)m(y)d(tic)m(k)m(et)j(in)m(to)f(AP-REQ.)390 1210 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1210 V 39 w(OK)f(i\013)i(successful.)150 1395 y Fl(shishi)p 459 1395 37 5 v 55 w(apreq)p 813 1395 V 54 w(options)3350 1578 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_options)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 1578 28 4 v 39 w(asn1)f Fe(apreq)p Fi(,)565 1687 y(uin)m(t32)p 820 1687 V 41 w(t)g(*)g Fe(flags)p Ff(\))390 1797 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1924 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(get)g(options)g(from.)390 2051 y Fi(\015ags)t Fw(:)41 b(Output)29 b(in)m(teger)j(con)m(taining)g (options)e(from)g(AP-REQ.)390 2179 y(Extract)h(the)g(AP-Options)f(from) g(AP-REQ)g(in)m(to)i(output)e(in)m(teger.)390 2306 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2306 V 39 w(OK)f(i\013)i(successful.)150 2491 y Fl(shishi)p 459 2491 37 5 v 55 w(apreq)p 813 2491 V 54 w(use)p 1039 2491 V 55 w(session)p 1457 2491 V 56 w(k)m(ey)p 1696 2491 V 53 w(p)3350 2674 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_use_sess)q(ion_)q(key)q(_p)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 2674 28 4 v 39 w(asn1)565 2783 y Fe(apreq)p Ff(\))390 2893 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3020 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_apreq\(\))p Fw(.)390 3148 y(Return)g(non-0)g(i\013)h(the)f Fq(")p Fw(Use)h(session)f(k)m(ey)p Fq(")h Fw(option)g(is)f(set)h(in)f(the)h (AP-REQ.)390 3275 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3275 V 39 w(OK)f(i\013)i(successful.)150 3460 y Fl(shishi)p 459 3460 37 5 v 55 w(apreq)p 813 3460 V 54 w(m)m(utual)p 1244 3460 V 54 w(required)p 1745 3460 V 54 w(p)3350 3643 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_mutual_r)q(equi)q(red)q(_p)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3643 28 4 v 39 w(asn1)565 3752 y Fe(apreq)p Ff(\))390 3862 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3989 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_apreq\(\))p Fw(.)390 4116 y(Return)g(non-0)g(i\013)h(the)f Fq(")p Fw(Mutual)h(required)p Fq(")e Fw(option)i(is)f(set)h(in)f(the)h (AP-REQ.)390 4244 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4244 V 39 w(OK)f(i\013)i(successful.)150 4429 y Fl(shishi)p 459 4429 37 5 v 55 w(apreq)p 813 4429 V 54 w(options)p 1255 4429 V 55 w(set)3350 4611 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_options_)q(set)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 4611 28 4 v 38 w(asn1)e Fe(apreq)p Fi(,)565 4721 y(uin)m(t32)p 820 4721 V 41 w(t)g Fe(options)p Ff(\))390 4830 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4958 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_apreq\(\))p Fw(.)390 5085 y Fi(options)t Fw(:)41 b(Options)30 b(to)h(set)g(in)f (AP-REQ.)390 5213 y(Set)h(the)f(AP-Options)g(in)g(AP-REQ)h(to)g (indicate)g(in)m(teger.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 86 92 TeXDict begin 86 91 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(86)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(apreq)p 813 299 V 54 w(options)p 1255 299 V 55 w(add)3350 513 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_options_)q(add)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 513 28 4 v 38 w(asn1)e Fe(apreq)p Fi(,)565 623 y(uin)m(t32)p 820 623 V 41 w(t)g Fe(option)p Ff(\))390 733 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 885 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_apreq\(\))p Fw(.)390 1037 y Fi(option)p Fw(:)41 b(Options)30 b(to)h(add)f(in)g (AP-REQ.)390 1189 y(Add)39 b(the)g(AP-Options)h(in)f(AP-REQ.)g(Options) g(not)h(set)g(in)f(input)g(parameter)h Fq(option)e Fw(are)390 1299 y(preserv)m(ed)30 b(in)g(the)h(AP-REQ.)390 1451 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1451 V 39 w(OK)f(i\013)i(successful.)150 1668 y Fl(shishi)p 459 1668 37 5 v 55 w(apreq)p 813 1668 V 54 w(options)p 1255 1668 V 55 w(remo)m(v)m(e)3350 1883 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_options_)q(remo)q (ve)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 1883 28 4 v 38 w(asn1)565 1992 y Fe(apreq)p Fi(,)f(uin)m(t32)p 1137 1992 V 41 w(t)f Fe(option)p Ff(\))390 2102 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2254 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_apreq\(\))p Fw(.)390 2406 y Fi(option)p Fw(:)41 b(Options)30 b(to)h(remo)m(v)m(e)h (from)e(AP-REQ.)390 2559 y(Remo)m(v)m(e)j(the)e(AP-Options)h(from)e (AP-REQ.)i(Options)e(not)i(set)g(in)f(input)f(parameter)i Fq(option)390 2668 y Fw(are)f(preserv)m(ed)f(in)g(the)g(AP-REQ.)390 2821 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2821 V 39 w(OK)f(i\013)i(successful.)150 3038 y Fl(shishi)p 459 3038 37 5 v 55 w(apreq)p 813 3038 V 54 w(get)p 1032 3038 V 54 w(authen)m(ticator)p 1807 3038 V 53 w(et)m(yp)s(e)3350 3252 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_get_auth)q(enti)q(cat)q(or_)q(ety)q(pe)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 3362 y(Shishi)p 810 3362 28 4 v 39 w(asn1)g Fe(apreq)p Fi(,)h(in)m(t32)p 1572 3362 V 41 w(t)f(*)g Fe(etype)p Ff(\))390 3471 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3623 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)h(v)-5 b(alue)30 b(from.)390 3776 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(v)-5 b(alue.)390 3928 y(Extract)31 b(AP-REQ.authen)m(ticator.et)m(yp)s(e.)390 4080 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4080 V 39 w(OK)f(i\013)i(successful.)150 4297 y Fl(shishi)p 459 4297 37 5 v 55 w(apreq)p 813 4297 V 54 w(get)p 1032 4297 V 54 w(tic)m(k)m(et)3350 4512 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_apreq_get_tick)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 4512 28 4 v 39 w(asn1)f Fe(apreq)p Fi(,)565 4621 y(Shishi)p 810 4621 V 39 w(asn1)g(*)f Fe(ticket)p Ff(\))390 4731 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4883 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)h(tic)m(k)m(et)h (from.)390 5035 y Fi(tic)m(k)m(et)r Fw(:)43 b(output)30 b(v)-5 b(ariable)31 b(to)h(hold)e(extracted)h(tic)m(k)m(et.)390 5188 y(Extract)g(tic)m(k)m(et)i(from)d(AP-REQ.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 87 93 TeXDict begin 87 92 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(87)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(aprep)3350 480 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_aprep)49 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 590 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 717 y(This)g(function)g(creates)h(a)g(new)f(AP-REP)-8 b(,)31 b(p)s(opulated)f(with)g(some)h(default)f(v)-5 b(alues.)390 844 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(authen)m(ticator)j(or)d(NULL)g(on)g(failure.)150 1028 y Fl(shishi)p 459 1028 V 55 w(aprep)p 816 1028 V 55 w(prin)m(t)3350 1209 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_print)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 1209 28 4 v 39 w(asn1)565 1319 y Fe(aprep)p Ff(\))390 1429 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1555 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 1682 y Fi(aprep)s Fw(:)40 b(AP-REP)30 b(to)h(prin)m(t.)390 1809 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco)s(ding)f(of)h(AP-REP) f(to)h(\014le.)390 1936 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1936 V 39 w(OK)f(i\013)i(successful.) 150 2120 y Fl(shishi)p 459 2120 37 5 v 55 w(aprep)p 816 2120 V 55 w(sa)m(v)m(e)3350 2302 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_save)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 2302 28 4 v 38 w(asn1)565 2411 y Fe(aprep)p Ff(\))390 2521 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2648 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 2775 y Fi(aprep)s Fw(:)40 b(AP-REP)30 b(to)h(sa)m(v)m(e.)390 2902 y(Sa)m(v)m(e)h(DER)e(enco)s(ding)g(of)h(AP-REP)f(to)h(\014le.)390 3028 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3028 V 39 w(OK)f(i\013)i(successful.)150 3212 y Fl(shishi)p 459 3212 37 5 v 55 w(aprep)p 816 3212 V 55 w(to)p 980 3212 V 54 w(\014le)3350 3394 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_to_file)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 3394 28 4 v 39 w(asn1)f Fe(aprep)p Fi(,)h(in)m(t)565 3504 y Fe(filetype)p Fi(,)h(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3613 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3740 y Fi(aprep)s Fw(:)40 b(AP-REP)30 b(to)h(sa)m(v)m(e.)390 3867 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 3867 V 39 w(\014let)m(yp)s(e.)390 3994 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 4121 y(W)-8 b(rite)32 b(AP-REP)e(to)h(\014le)g(in)f (sp)s(eci\014ed)f(TYPE.)i(The)e(\014le)i(will)g(b)s(e)e(truncated)i(if) f(it)h(exists.)390 4248 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4248 V 39 w(OK)f(i\013)i(successful.) 150 4432 y Fl(shishi)p 459 4432 37 5 v 55 w(aprep)p 816 4432 V 55 w(parse)3350 4613 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_parse)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 4613 28 4 v 39 w(asn1)f(*)565 4723 y Fe(aprep)p Ff(\))390 4832 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4959 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.) 390 5086 y Fi(aprep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)j(AP-REP)-8 b(.)390 5213 y(Read)31 b(ASCI)s(I)d(armored)j(DER)f(enco)s(ded)g(AP-REP)g(from)g (\014le)h(and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 88 94 TeXDict begin 88 93 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(88)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(aprep)p 816 299 V 55 w(read)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_read)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 496 28 4 v 38 w(asn1)f(*)565 606 y Fe(aprep)p Ff(\))390 715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 850 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 985 y Fi(aprep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)j(AP-REP)-8 b(.)390 1120 y(Read)31 b(DER)f(enco)s(ded)g(AP-REP)g(from)g(\014le)h (and)f(p)s(opulate)g(giv)m(en)h(v)-5 b(ariable.)390 1255 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1255 V 39 w(OK)f(i\013)i(successful.)150 1455 y Fl(shishi)p 459 1455 37 5 v 55 w(aprep)p 816 1455 V 55 w(from)p 1121 1455 V 55 w(\014le)3350 1652 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_from_fil)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 1652 28 4 v 39 w(asn1)e(*)h Fe(aprep)p Fi(,)565 1762 y(in)m(t)g Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 1871 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2006 y Fi(aprep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)j(AP-REP)-8 b(.)390 2141 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g (b)s(e)e(read,)i(see)g(Shishi)p 3066 2141 V 39 w(\014let)m(yp)s(e.)390 2276 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read)g(from.)390 2411 y(Read)g(AP-REP)f (from)g(\014le)g(in)g(sp)s(eci\014ed)g(TYPE.)390 2546 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2546 V 39 w(OK)f(i\013)i(successful.)150 2746 y Fl(shishi)p 459 2746 37 5 v 55 w(aprep)p 816 2746 V 55 w(get)p 1036 2746 V 54 w(enc)p 1269 2746 V 53 w(part)p 1548 2746 V 54 w(et)m(yp)s(e)3350 2943 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aprep_get_enc_)q(part)q(_et)q(ype)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 3053 y(Shishi)p 810 3053 28 4 v 39 w(asn1)h Fe(aprep)p Fi(,)h(in)m(t32)p 1572 3053 V 41 w(t)f(*)g Fe(etype)p Ff(\))390 3163 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3298 y Fi(aprep)s Fw(:)40 b(AP-REP)30 b(v)-5 b(ariable)31 b(to)g(get)h(v)-5 b(alue)31 b(from.)390 3433 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(v)-5 b(alue.)390 3568 y(Extract)31 b(AP-REP)-8 b(.enc-part.et)m(yp)s(e.)390 3703 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3703 V 39 w(OK)f(i\013)i(successful.)150 3902 y Fl(shishi)p 459 3902 37 5 v 55 w(encapreppart)3350 4100 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_encapreppart)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4209 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4344 y(This)h(function)g(creates)i(a)f(new)f(EncAPRepP)m(art,) i(p)s(opulated)e(with)g(some)h(default)g(v)-5 b(alues.)45 b(It)390 4454 y(uses)30 b(the)g(curren)m(t)h(time)g(as)f(returned)g(b)m (y)g(the)g(system)h(for)f(the)h(ctime)g(and)f(cusec)h(\014elds.)390 4589 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g (encapreppart)g(or)h(NULL)f(on)g(failure.)150 4789 y Fl(shishi)p 459 4789 V 55 w(encapreppart)p 1221 4789 V 54 w(prin)m(t)3350 4986 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_p)q(rint)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 5095 y(Shishi)p 810 5095 28 4 v 39 w(asn1)g Fe(encapreppart)p Ff(\))390 5205 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)p eop end %%Page: 89 95 TeXDict begin 89 94 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(89)390 299 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(to)g(prin)m(t.)390 431 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco)s(ding)f(of)h(EncAPRepP)m (art)f(to)h(\014le.)390 563 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 563 28 4 v 39 w(OK)f(i\013)i (successful.)150 757 y Fl(shishi)p 459 757 37 5 v 55 w(encapreppart)p 1221 757 V 54 w(sa)m(v)m(e)3350 949 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_s)q(ave)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(FILE)d(*)h Fe(fh)p Fi(,)565 1059 y(Shishi)p 810 1059 28 4 v 39 w(asn1)g Fe(encapreppart)p Ff(\))390 1169 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1301 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 1433 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(to)g(sa)m(v)m(e.)390 1565 y(Sa)m(v)m(e)h(DER)e(enco)s(ding)g(of)h (EncAPRepP)m(art)g(to)g(\014le.)390 1697 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1697 V 39 w(OK)f(i\013)i(successful.)150 1891 y Fl(shishi)p 459 1891 37 5 v 55 w(encapreppart)p 1221 1891 V 54 w(to)p 1384 1891 V 54 w(\014le)3350 2083 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_t)q(o_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 2083 28 4 v 38 w(asn1)565 2193 y Fe(encapreppart)p Fi(,)h(in)m(t)d Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(filename)p Ff(\))390 2302 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2434 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(to)g(sa)m(v)m(e.)390 2567 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 2567 V 39 w(\014let)m(yp)s(e.)390 2699 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 2831 y(W)-8 b(rite)28 b(EncAPRepP)m(art)g(to)g(\014le) f(in)g(sp)s(eci\014ed)f(TYPE.)h(The)f(\014le)h(will)h(b)s(e)e (truncated)h(if)g(it)h(exists.)390 2963 y Fk(Return)i(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2963 V 39 w(OK)f(i\013)i(successful.)150 3157 y Fl(shishi)p 459 3157 37 5 v 55 w(encapreppart)p 1221 3157 V 54 w(parse)3350 3349 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_p)q (arse)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 3459 y(Shishi)p 810 3459 28 4 v 39 w(asn1)g(*)f Fe(encapreppart)p Ff(\))390 3568 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3700 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 3832 y Fi(encapreppart)r Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)g(newly)f(allo)s(cated)i(EncAPRepP)m(art.) 390 3964 y(Read)44 b(ASCI)s(I)f(armored)h(DER)g(enco)s(ded)f(EncAPRepP) m(art)i(from)e(\014le)i(and)e(p)s(opulate)h(giv)m(en)390 4074 y(v)-5 b(ariable.)390 4206 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4206 V 39 w(OK)f(i\013)i(successful.)150 4401 y Fl(shishi)p 459 4401 37 5 v 55 w(encapreppart)p 1221 4401 V 54 w(read)3350 4592 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_r)q (ead)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(FILE)d(*)h Fe(fh)p Fi(,)565 4702 y(Shishi)p 810 4702 28 4 v 39 w(asn1)g(*)f Fe(encapreppart)p Ff(\))390 4812 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4944 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 5076 y Fi(encapreppart)r Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)g(newly)f(allo)s(cated)i(EncAPRepP)m(art.) 390 5208 y(Read)f(DER)f(enco)s(ded)g(EncAPRepP)m(art)h(from)f(\014le)g (and)g(p)s(opulate)g(giv)m(en)i(v)-5 b(ariable.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 90 96 TeXDict begin 90 95 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(90)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(encapreppart)p 1221 299 V 54 w(from)p 1525 299 V 55 w(\014le)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_f)q(rom_)q(fil)q(e)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2915 516 28 4 v 38 w(asn1)e(*)565 626 y Fe(encapreppart)p Fi(,)j(in)m(t)d Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(filename)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(encapreppart)r Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)g(newly)f(allo)s(cated)i(EncAPRepP)m(art.) 390 1045 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g (b)s(e)e(read,)i(see)g(Shishi)p 3066 1045 V 39 w(\014let)m(yp)s(e.)390 1200 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read)g(from.)390 1356 y(Read)g(EncAPRepP)m (art)f(from)g(\014le)h(in)f(sp)s(eci\014ed)f(TYPE.)390 1511 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1511 V 39 w(OK)f(i\013)i(successful.)150 1730 y Fl(shishi)p 459 1730 37 5 v 55 w(encapreppart)p 1221 1730 V 54 w(get)p 1440 1730 V 54 w(k)m(ey)3350 1948 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_g)q(et_k)q (ey)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 1948 28 4 v 38 w(asn1)565 2057 y Fe(encapreppart)p Fi(,)h(Shishi)p 1493 2057 V 39 w(k)m(ey)d(**)h Fe(key)p Ff(\))390 2167 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2322 y Fi(encapreppart)r Fw(:)40 b(input)30 b(EncAPRepP)m(art)g(v)-5 b(ariable.)390 2477 y Fi(k)m(ey)8 b Fw(:)41 b(newly)30 b(allo)s(cated)j(k)m(ey)-8 b(.)390 2632 y(Extract)31 b(the)g(subk)m(ey)f(from)g(the)g(encrypted)g(AP-REP)h(part.)390 2787 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3007 y Fl(shishi)p 459 3007 37 5 v 55 w(encapreppart)p 1221 3007 V 54 w(ctime)3350 3224 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_c)q (time)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 3224 28 4 v 39 w(asn1)565 3334 y Fe(encapreppart)p Fi(,)i(c)m(har)d(**)g Fe(t)p Ff(\))390 3443 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3598 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 3753 y Fi(t)r Fw(:)41 b(newly)30 b(allo)s(cated)i(zero-terminated)h(c)m(haracter)e(arra)m(y)g (with)f(clien)m(t)i(time.)390 3908 y(Extract)f(clien)m(t)h(time)f(from) f(EncAPRepP)m(art.)390 4064 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4064 V 39 w(OK)f(i\013)i(successful.) 150 4283 y Fl(shishi)p 459 4283 37 5 v 55 w(encapreppart)p 1221 4283 V 54 w(ctime)p 1570 4283 V 54 w(set)3350 4501 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_c)q(time) q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 4501 28 4 v 39 w(asn1)565 4610 y Fe(encapreppart)p Fi(,)i(const)d(c)m(har)g(*)g Fe(t)p Ff(\))390 4720 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 4875 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 5030 y Fi(t)r Fw(:)41 b(string)30 b(with)g(generalized)i(time)f(v)-5 b(alue)31 b(to)g(store)g(in)f(EncAPRepP)m(art.)390 5185 y(Store)h(clien)m(t)h (time)f(in)f(EncAPRepP)m(art.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 91 97 TeXDict begin 91 96 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(91)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(encapreppart)p 1221 299 V 54 w(cusec)p 1557 299 V 54 w(get)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_c)q(usec)q(_ge)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 496 28 4 v 39 w(asn1)565 606 y Fe(encapreppart)p Fi(,)i(uin)m(t32)p 1503 606 V 41 w(t)d(*)g Fe(cusec)p Ff(\))390 715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 850 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b) m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 985 y Fi(cusec)6 b Fw(:)41 b(output)30 b(in)m(teger)h(with)g(clien)m(t)h(microseconds)e (\014eld.)390 1120 y(Extract)h(clien)m(t)h(microseconds)f(\014eld)f (from)g(EncAPRepP)m(art.)390 1255 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1255 V 39 w(OK)f(i\013)i(successful.)150 1455 y Fl(shishi)p 459 1455 37 5 v 55 w(encapreppart)p 1221 1455 V 54 w(cusec)p 1557 1455 V 54 w(set)3350 1652 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_c)q(usec)q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 1652 28 4 v 39 w(asn1)565 1762 y Fe(encapreppart)p Fi(,)i(uin)m(t32)p 1503 1762 V 41 w(t)d Fe(cusec)p Ff(\))390 1871 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2006 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 2141 y Fi(cusec)6 b Fw(:)41 b(clien)m(t)32 b(microseconds)e(to)i(set)e(in)h(authen)m (ticator,)h(0-999999.)390 2276 y(Set)f(the)f(cusec)h(\014eld)f(in)g (the)h(Authen)m(ticator.)390 2411 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2411 V 39 w(OK)f(i\013)i(successful.)150 2611 y Fl(shishi)p 459 2611 37 5 v 55 w(encapreppart)p 1221 2611 V 54 w(seqn)m(um)m(b)s(er)p 1853 2611 V 55 w(get)3350 2808 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_s)q(eqnu)q(mbe)q(r_g)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 2918 y(Shishi)p 810 2918 28 4 v 39 w(asn1)g Fe(encapreppart)p Fi(,)j(uin)m(t32)p 1989 2918 V 41 w(t)c(*)h Fe(seqnumber)p Ff(\))390 3028 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3163 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 3298 y Fi(seqn)m(um)m(b)s(er)7 b Fw(:)39 b(output)30 b(in)m(teger)i(with)e(sequence)h(n)m(um)m(b)s(er)e(\014eld.)390 3433 y(Extract)i(sequence)g(n)m(um)m(b)s(er)e(\014eld)h(from)g (EncAPRepP)m(art.)390 3568 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3568 V 39 w(OK)f(i\013)i(successful.) 150 3767 y Fl(shishi)p 459 3767 37 5 v 55 w(encapreppart)p 1221 3767 V 54 w(seqn)m(um)m(b)s(er)p 1853 3767 V 55 w(remo)m(v)m(e)3350 3965 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_s)q(eqnu)q(mbe)q(r_r)q(emo)q(ve)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 4074 y(Shishi)p 810 4074 28 4 v 39 w(asn1)g Fe(encapreppart)p Ff(\))390 4184 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4319 y Fi(encapreppart)r Fw(:)40 b(encapreppart)30 b(as)h(allo)s(cated) h(b)m(y)f Fq(shishi_encapreppart\(\))p Fw(.)390 4454 y(Remo)m(v)m(e)h(sequence)f(n)m(um)m(b)s(er)e(\014eld)h(in)g(EncAPRepP) m(art.)390 4589 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4789 y Fl(shishi)p 459 4789 37 5 v 55 w(encapreppart)p 1221 4789 V 54 w(seqn)m(um)m(b)s (er)p 1853 4789 V 55 w(set)3350 4986 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_s)q(eqnu)q(mbe)q(r_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 5095 y(Shishi)p 810 5095 28 4 v 39 w(asn1)g Fe(encapreppart)p Fi(,)j(uin)m(t32)p 1989 5095 V 41 w(t)c Fe(seqnumber)p Ff(\))390 5205 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(encapreppart)r Fw(:)40 b(encapreppart)30 b(as)h(allo)s(cated) h(b)m(y)f Fq(shishi_encapreppart\(\))p Fw(.)p eop end %%Page: 92 98 TeXDict begin 92 97 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(92)390 299 y Fi(seqn)m(um)m(b)s(er) 7 b Fw(:)39 b(in)m(teger)32 b(with)e(sequence)h(n)m(um)m(b)s(er)e (\014eld)h(to)h(store)g(in)f(encapreppart.)390 454 y(Store)h(sequence)f (n)m(um)m(b)s(er)f(\014eld)h(in)g(EncAPRepP)m(art.)390 609 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 829 y Fl(shishi)p 459 829 37 5 v 55 w(encapreppart)p 1221 829 V 54 w(time)p 1515 829 V 54 w(cop)m(y)3350 1047 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encapreppart_t)q(ime_)q(cop)q(y)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 1047 28 4 v 39 w(asn1)565 1156 y Fe(encapreppart)p Fi(,)i(Shishi)p 1493 1156 V 39 w(asn1)d Fe(authenticator)p Ff(\))390 1266 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1421 y Fi(encapreppart)r Fw(:)40 b(EncAPRepP)m(art)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_encapreppart\(\))p Fw(.)390 1576 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(to)f(cop)m(y)h(time)f(\014elds)f(from.)390 1731 y(Cop)m(y)g(time)h (\014elds)f(from)g(Authen)m(ticator)i(in)m(to)g(EncAPRepP)m(art.)390 1886 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1886 V 39 w(OK)f(i\013)i(successful.)150 2150 y Fv(5.5)68 b(SAFE)44 b(and)h(PRIV)f(F)-11 b(unctions)150 2309 y Fw(The)24 b(\\KRB-SAFE")i(is)g(an)e(ASN.1)i(structure)e(used)h (b)m(y)f(application)j(clien)m(t)f(and)f(serv)m(ers)g(to)g(exc)m(hange) 150 2419 y(in)m(tegrit)m(y)38 b(protected)f(data.)59 b(The)35 b(in)m(tegrit)m(y)k(protection)e(is)f(k)m(ey)m(ed,)j(usually)d (with)g(a)g(k)m(ey)h(agreed)g(on)150 2529 y(via)g(the)g(AP)g(exc)m (hange)h(\(see)g(Section)g(5.4)g([AP-REQ)e(and)h(AP-REP)f(F)-8 b(unctions],)40 b(page)d(71\).)61 b(The)150 2638 y(follo)m(wing)32 b(illustrates)f(the)g(KRB-SAFE)f(ASN.1)h(structure.)293 2793 y Fq(KRB-SAFE)380 b(::=)47 b([APPLICATION)d(20])j(SEQUENCE)f({)675 2903 y(pvno)572 b([0])47 b(INTEGER)e(\(5\),)675 3012 y(msg-type)380 b([1])47 b(INTEGER)e(\(20\),)675 3122 y(safe-body)332 b([2])47 b(KRB-SAFE-BODY,)675 3232 y(cksum)524 b([3])47 b(Checksum)293 3341 y(})293 3560 y(KRB-SAFE-BODY)140 b(::=)47 b(SEQUENCE)e({)675 3670 y(user-data)332 b([0])47 b(OCTET)f(STRING,)675 3780 y(timestamp)332 b([1])47 b(KerberosTime)d (OPTIONAL,)675 3889 y(usec)572 b([2])47 b(Microseconds)d(OPTIONAL,)675 3999 y(seq-number)284 b([3])47 b(UInt32)f(OPTIONAL,)675 4108 y(s-address)332 b([4])47 b(HostAddress,)675 4218 y(r-address)332 b([5])47 b(HostAddress)d(OPTIONAL)293 4328 y(})150 4547 y Fl(shishi)p 459 4547 37 5 v 55 w(safe)3350 4765 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 1974 4765 28 4 v 39 w(safe)d(**)i Fe(safe)p Ff(\))390 4874 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5030 y Fi(safe)5 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(new)f(structure)g(that)g(holds)g (information)h(ab)s(out)f(SAFE)g(exc)m(hange)390 5185 y(Create)h(a)g(new)f(SAFE)g(exc)m(hange.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 93 99 TeXDict begin 93 98 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(93)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(safe)p 715 299 V 55 w(done)3350 504 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_safe_done)c Ff(\()p Fi(Shishi)p 1574 504 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Ff(\))390 613 y Fi(safe)5 b Fw(:)41 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(SAFE)g(exc)m(hange)390 756 y(Deallo)s(cate)38 b(resources)d(asso)s(ciated)i(with)d(SAFE)h(exc) m(hange.)56 b(This)34 b(should)g(b)s(e)h(called)h(b)m(y)f(the)390 866 y(application)d(when)d(it)i(no)f(longer)h(need)f(to)h(utilize)h (the)f(SAFE)f(exc)m(hange)i(handle.)150 1073 y Fl(shishi)p 459 1073 37 5 v 55 w(safe)p 715 1073 V 55 w(k)m(ey)3350 1278 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_safe_key)d Ff(\()p Fi(Shishi)p 1940 1278 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Ff(\))390 1388 y Fi(safe)5 b Fw(:)41 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f (SAFE)g(exc)m(hange)390 1530 y(Get)h(k)m(ey)h(structured)d(from)h(SAFE) g(exc)m(hange.)390 1673 y Fk(Return)j(v)-5 b(alue:)48 b Fw(Returns)32 b(the)i(k)m(ey)g(used)f(in)g(the)h(SAFE)f(exc)m(hange,) j(or)e(NULL)f(if)h(not)g(y)m(et)g(set)390 1782 y(or)c(an)h(error)f(o)s (ccured.)150 1990 y Fl(shishi)p 459 1990 37 5 v 55 w(safe)p 715 1990 V 55 w(k)m(ey)p 953 1990 V 53 w(set)3350 2195 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_safe_key_set)d Ff(\()p Fi(Shishi)p 1731 2195 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)g(Shishi)p 2529 2195 V 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 2304 y Fi(safe)5 b Fw(:)41 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(SAFE)g(exc)m(hange)390 2447 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(store)f(in)f(SAFE.)390 2590 y(Set)h(the)f(Key)h(in)f(the)g(SAFE)g(exc)m(hange.)150 2797 y Fl(shishi)p 459 2797 37 5 v 55 w(safe)p 715 2797 V 55 w(safe)3350 3002 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_safe_safe)50 b Ff(\()p Fi(Shishi)p 1940 3002 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Ff(\))390 3112 y Fi(safe)5 b Fw(:)41 b(structure)30 b(that)h(holds)f(information)h(ab)s (out)f(SAFE)g(exc)m(hange)390 3254 y(Get)h(ASN.1)g(SAFE)f(structured)g (from)g(SAFE)g(exc)m(hange.)390 3397 y Fk(Return)d(v)-5 b(alue:)39 b Fw(Returns)27 b(the)g(ASN.1)h(safe)g(in)f(the)g(SAFE)g (exc)m(hange,)j(or)d(NULL)g(if)g(not)h(y)m(et)g(set)390 3506 y(or)i(an)h(error)f(o)s(ccured.)150 3714 y Fl(shishi)p 459 3714 37 5 v 55 w(safe)p 715 3714 V 55 w(safe)p 971 3714 V 55 w(set)3350 3919 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_safe_safe_set)d Ff(\()p Fi(Shishi)p 1783 3919 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)h(Shishi)p 2582 3919 V 38 w(asn1)565 4028 y Fe(asn1safe)p Ff(\))390 4138 y Fi(safe)5 b Fw(:)41 b(structure)30 b(that)h(holds)f(information) h(ab)s(out)f(SAFE)g(exc)m(hange)390 4281 y Fi(asn1safe)5 b Fw(:)42 b(KRB-SAFE)30 b(to)h(store)g(in)f(SAFE)g(exc)m(hange.)390 4423 y(Set)h(the)f(KRB-SAFE)h(in)f(the)g(SAFE)g(exc)m(hange.)150 4631 y Fl(shishi)p 459 4631 37 5 v 55 w(safe)p 715 4631 V 55 w(safe)p 971 4631 V 55 w(der)3350 4836 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_safe_der)f Ff(\()p Fi(Shishi)p 1731 4836 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)g(c)m(har)g(**)g Fe(out)p Fi(,)h(size)p 2965 4836 V 41 w(t)e(*)565 4945 y Fe(outlen)p Ff(\))390 5055 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 5197 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(SAFE.)390 5340 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s(ding)f(of)h(SAFE.)p eop end %%Page: 94 100 TeXDict begin 94 99 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(94)390 299 y(DER)33 b(enco)s(de)g(SAFE)f(structure.)48 b(T)m(ypically)33 b Fq(shishi_safe_build\(\))28 b Fw(is)33 b(used)f(to)h(build)f(the)390 408 y(SAFE)e(structure)f(\014rst.)40 b Fq(out)29 b Fw(is)h(allo)s (cated)h(b)m(y)f(this)g(function,)g(and)f(it)h(is)g(the)g(resp)s (onsibilit)m(y)g(of)390 518 y(caller)i(to)f(deallo)s(cate)i(it.)390 651 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 651 28 4 v 39 w(OK)f(i\013)i(successful.)150 847 y Fl(shishi)p 459 847 37 5 v 55 w(safe)p 715 847 V 55 w(safe)p 971 847 V 55 w(der)p 1200 847 V 54 w(set)3350 1040 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_safe_der_)q (set)f Ff(\()p Fi(Shishi)p 1940 1040 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)h(c)m(har)e(*)h Fe(der)p Fi(,)g(size)p 3128 1040 V 41 w(t)565 1149 y Fe(derlen)p Ff(\))390 1259 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 1392 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(KRB-SAFE.)390 1524 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f (DER)h(enco)s(ded)f(KRB-SAFE.)390 1657 y(DER)22 b(deco)s(de)h(KRB-SAFE) f(and)f(set)i(it)g(SAFE)f(exc)m(hange.)39 b(If)22 b(deco)s(ding)g (fails,)i(the)f(KRB-SAFE)390 1767 y(in)30 b(the)h(SAFE)f(exc)m(hange)i (remains.)390 1899 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1899 V 39 w(OK.)150 2095 y Fl(shishi)p 459 2095 37 5 v 55 w(safe)p 715 2095 V 55 w(prin)m(t)3350 2288 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_print)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 2288 28 4 v 38 w(asn1)565 2398 y Fe(safe)p Ff(\))390 2508 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2640 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 2773 y Fi(safe)5 b Fw(:)41 b(SAFE)30 b(to)i(prin)m(t.)390 2906 y(Prin)m(t)e(ASCI)s(I)f(armored)h(DER)h(enco)s(ding)f(of)h(SAFE)f (to)h(\014le.)390 3039 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3039 V 39 w(OK)f(i\013)i(successful.) 150 3234 y Fl(shishi)p 459 3234 37 5 v 55 w(safe)p 715 3234 V 55 w(sa)m(v)m(e)3350 3428 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_save)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2712 3428 28 4 v 39 w(asn1)g Fe(safe)p Ff(\))390 3537 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3670 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 3803 y Fi(safe)5 b Fw(:)41 b(SAFE)30 b(to)i(sa)m(v)m(e.)390 3935 y(Sa)m(v)m(e)g(DER)e(enco)s(ding)g(of)h(SAFE)f(to)h(\014le.)390 4068 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4068 V 39 w(OK)f(i\013)i(successful.)150 4264 y Fl(shishi)p 459 4264 37 5 v 55 w(safe)p 715 4264 V 55 w(to)p 879 4264 V 54 w(\014le)3350 4457 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_to_file)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 4457 28 4 v 39 w(asn1)f Fe(safe)p Fi(,)g(in)m(t)565 4567 y Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 4676 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4809 y Fi(safe)5 b Fw(:)41 b(SAFE)30 b(to)i(sa)m(v)m(e.)390 4942 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 4942 V 39 w(\014let)m(yp)s(e.)390 5075 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 5207 y(W)-8 b(rite)32 b(SAFE)e(to)h(\014le)g(in)f(sp)s (eci\014ed)f(TYPE.)h(The)g(\014le)h(will)f(b)s(e)g(truncated)h(if)f(it) h(exists.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 95 101 TeXDict begin 95 100 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(95)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(safe)p 715 299 V 55 w(parse)3350 500 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_parse)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 500 28 4 v 38 w(asn1)f(*)565 610 y Fe(safe)p Ff(\))390 719 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 858 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 997 y Fi(safe)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s(cated)h(SAFE.)390 1136 y(Read)f(ASCI)s(I)d(armored)j(DER)f(enco)s(ded)g(SAFE)g(from)g (\014le)h(and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 1275 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1275 V 39 w(OK)f(i\013)i(successful.)150 1478 y Fl(shishi)p 459 1478 37 5 v 55 w(safe)p 715 1478 V 55 w(read)3350 1680 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_read)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2712 1680 28 4 v 39 w(asn1)g(*)565 1789 y Fe(safe)p Ff(\))390 1899 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2038 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.)390 2177 y Fi(safe)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s(cated)h(SAFE.)390 2316 y(Read)f(DER)f(enco)s (ded)g(SAFE)g(from)g(\014le)h(and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 2454 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2454 V 39 w(OK)f(i\013)i(successful.) 150 2658 y Fl(shishi)p 459 2658 37 5 v 55 w(safe)p 715 2658 V 55 w(from)p 1020 2658 V 55 w(\014le)3350 2859 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_from_file)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 2859 28 4 v 39 w(asn1)d(*)h Fe(safe)p Fi(,)h(in)m(t)565 2969 y Fe(filetype)p Fi(,)h(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3078 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3217 y Fi(safe)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s(cated)h(SAFE.)390 3356 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(read,)i(see)g(Shishi)p 3066 3356 V 39 w(\014let)m(yp)s(e.)390 3495 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (read)g(from.)390 3634 y(Read)g(SAFE)f(from)g(\014le)g(in)g(sp)s (eci\014ed)g(TYPE.)390 3773 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3773 V 39 w(OK)f(i\013)i(successful.) 150 3977 y Fl(shishi)p 459 3977 37 5 v 55 w(safe)p 715 3977 V 55 w(c)m(ksum)3350 4178 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_cksum)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2287 4178 28 4 v 39 w(asn1)f Fe(safe)p Fi(,)h(in)m(t32)p 2997 4178 V 41 w(t)f(*)565 4287 y Fe(cksumtype)p Fi(,)i(c)m(har)e(**)g Fe(cksum)p Fi(,)h(size)p 1876 4287 V 41 w(t)f(*)g Fe(cksumlen)p Ff(\))390 4397 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4536 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 4675 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(output)30 b(c)m(hec)m(ksum)h(t)m(yp)s(e.)390 4814 y Fi(c)m(ksum)p Fw(:)41 b(output)30 b(arra)m(y)g(with)h(newly)f (allo)s(cated)i(c)m(hec)m(ksum)f(data)g(from)f(SAFE.)390 4953 y Fi(c)m(ksumlen)p Fw(:)41 b(output)30 b(size)h(of)g(output)f(c)m (hec)m(ksum)h(data)g(bu\013er.)390 5091 y(Read)e(c)m(hec)m(ksum)h(v)-5 b(alue)29 b(from)g(KRB-SAFE.)g Fq(cksum)e Fw(is)i(allo)s(cated)i(b)m(y) e(this)g(function,)g(and)f(it)i(is)390 5201 y(the)h(resp)s(onsibilit)m (y)f(of)g(caller)i(to)f(deallo)s(cate)i(it.)390 5340 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 96 102 TeXDict begin 96 101 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(96)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(safe)p 715 299 V 55 w(set)p 922 299 V 54 w(c)m(ksum)3350 502 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_set_cksum)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 502 28 4 v 39 w(asn1)d Fe(safe)p Fi(,)565 612 y(in)m(t32)p 769 612 V 42 w(t)g Fe(cksumtype)p Fi(,)k(const)c(c)m(har)h(*)g Fe(cksum)p Fi(,)h(size)p 2374 612 V 41 w(t)f Fe(cksumlen)p Ff(\))390 722 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 863 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 1004 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(input)30 b(c)m(hec)m(ksum)h(t)m(yp)s(e)f(to)i(store)f(in)f (SAFE.)390 1146 y Fi(c)m(ksum)p Fw(:)41 b(input)29 b(c)m(hec)m(ksum)i (data)g(to)g(store)g(in)f(SAFE.)390 1287 y Fi(c)m(ksumlen)p Fw(:)41 b(size)31 b(of)g(input)e(c)m(hec)m(ksum)i(data)g(to)g(store)g (in)f(SAFE.)390 1428 y(Store)39 b(c)m(hec)m(ksum)h(v)-5 b(alue)40 b(in)e(SAFE.)h(A)h(c)m(hec)m(ksum)f(is)g(usually)g(created)h (b)m(y)f(calling)i Fq(shishi_)390 1538 y(checksum\(\))33 b Fw(on)i(some)h(application)h(sp)s(eci\014c)e(data)i(using)e(the)g(k)m (ey)i(from)e(the)h(tic)m(k)m(et)i(that)e(is)390 1648 y(b)s(eing)25 b(used.)38 b(T)-8 b(o)26 b(sa)m(v)m(e)h(time,)h(y)m(ou)d (ma)m(y)h(w)m(an)m(t)h(to)f(use)f Fq(shishi_safe_build\(\))20 b Fw(instead,)27 b(whic)m(h)390 1757 y(calculates)33 b(the)d(c)m(hec)m(ksum)h(and)f(calls)i(this)e(function)g(in)g(one)h (step.)390 1899 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1899 V 39 w(OK)f(i\013)i(successful.)150 2105 y Fl(shishi)p 459 2105 37 5 v 55 w(safe)p 715 2105 V 55 w(user)p 992 2105 V 55 w(data)3350 2308 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_user_data)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 2308 28 4 v 39 w(asn1)d Fe(safe)p Fi(,)i(c)m(har)565 2418 y(**)f Fe(userdata)p Fi(,)i(size)p 1307 2418 V 41 w(t)e(*)g Fe(userdatalen)p Ff(\))390 2527 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2669 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 2810 y Fi(userdata)p Fw(:)41 b(output)30 b(arra)m(y)h(with)f (newly)g(allo)s(cated)i(user)e(data)h(from)f(KRB-SAFE.)390 2951 y Fi(userdatalen)p Fw(:)41 b(output)30 b(size)h(of)g(output)f (user)f(data)i(bu\013er.)390 3093 y(Read)i(user)f(data)h(v)-5 b(alue)33 b(from)f(KRB-SAFE.)i Fq(userdata)c Fw(is)j(allo)s(cated)h(b)m (y)f(this)f(function,)i(and)390 3202 y(it)d(is)f(the)h(resp)s (onsibilit)m(y)f(of)h(caller)g(to)h(deallo)s(cate)g(it.)390 3344 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3344 V 39 w(OK)f(i\013)i(successful.)150 3550 y Fl(shishi)p 459 3550 37 5 v 55 w(safe)p 715 3550 V 55 w(set)p 922 3550 V 54 w(user)p 1198 3550 V 55 w(data)3350 3753 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_set_user_)q (data)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 3753 28 4 v 39 w(asn1)e Fe(safe)p Fi(,)565 3863 y(const)h(c)m(har)g(*)f Fe(userdata)p Fi(,)j(size)p 1699 3863 V 41 w(t)e Fe(userdatalen)p Ff(\))390 3973 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4114 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 4255 y Fi(userdata)p Fw(:)41 b(input)29 b(user)h(application)i (to)f(store)g(in)f(SAFE.)390 4397 y Fi(userdatalen)p Fw(:)41 b(size)31 b(of)g(input)e(user)h(application)i(to)f(store)g(in)f (SAFE.)390 4538 y(Set)h(the)f(application)i(data)f(in)f(SAFE.)390 4679 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4679 V 39 w(OK)f(i\013)i(successful.)150 4885 y Fl(shishi)p 459 4885 37 5 v 55 w(safe)p 715 4885 V 55 w(build)3350 5089 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_build)e Ff(\()p Fi(Shishi)p 1574 5089 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)g(Shishi)p 2372 5089 V 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 5199 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 5340 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(for)g(session,)f (used)g(to)h(compute)g(c)m(hec)m(ksum.)p eop end %%Page: 97 103 TeXDict begin 97 102 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(97)390 299 y(Build)36 b(c)m(hec)m(ksum)i(and)e(set)h(it)g(in)f(KRB-SAFE.)h(Note)h(that)f (this)g(follo)m(ws)h(RF)m(C)f(1510bis)h(and)390 408 y(is)f (incompatible)g(with)g(RF)m(C)g(1510,)j(although)d(presumably)f(few)g (implemen)m(tations)i(use)f(the)390 518 y(RF)m(C1510)c(algorithm.)390 670 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 670 28 4 v 39 w(OK)f(i\013)i(successful.)150 887 y Fl(shishi)p 459 887 37 5 v 55 w(safe)p 715 887 V 55 w(v)m(erify)3350 1102 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_safe_verify)e Ff(\()p Fi(Shishi)p 1626 1102 28 4 v 39 w(safe)31 b(*)g Fe(safe)p Fi(,)h(Shishi)p 2425 1102 V 39 w(k)m(ey)f(*)f Fe(key)p Ff(\))390 1212 y Fi(safe)5 b Fw(:)41 b(safe)31 b(as)g(allo)s(cated)h(b)m(y)e Fq(shishi_safe\(\))p Fw(.)390 1364 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(for)g(session,)f (used)g(to)h(v)m(erify)g(c)m(hec)m(ksum.)390 1516 y(V)-8 b(erify)38 b(c)m(hec)m(ksum)f(in)g(KRB-SAFE.)g(Note)i(that)e(this)g (follo)m(ws)h(RF)m(C)g(1510bis)g(and)e(is)h(incom-)390 1626 y(patible)30 b(with)f(RF)m(C)h(1510,)i(although)e(presumably)e (few)i(implemen)m(tations)h(use)e(the)h(RF)m(C1510)390 1735 y(algorithm.)390 1888 y Fk(Return)36 b(v)-5 b(alue:)52 b Fw(Returns)35 b(SHISHI)p 1656 1888 V 39 w(OK)h(i\013)g(successful,)i (SHISHI)p 2737 1888 V 39 w(SAFE)p 3016 1888 V 40 w(BAD)p 3257 1888 V 41 w(KEYTYPE)390 1997 y(if)24 b(an)g(incompatible)i(k)m(ey) f(t)m(yp)s(e)f(is)h(used,)g(or)f(SHISHI)p 2207 1997 V 39 w(SAFE)p 2486 1997 V 40 w(VERIFY)p 2883 1997 V 40 w(F)-10 b(AILED)25 b(if)f(the)h(actual)390 2107 y(v)m(eri\014cation)32 b(failed.)275 2327 y(The)i(\\KRB-PRIV")h(is)g(an)f(ASN.1)i(structure)e (used)g(b)m(y)g(application)i(clien)m(t)g(and)e(serv)m(ers)h(to)g(ex-) 150 2436 y(c)m(hange)29 b(con\014den)m(tial)h(data.)40 b(The)28 b(con\014den)m(tialit)m(y)j(is)d(k)m(ey)m(ed,)i(usually)e (with)g(a)h(k)m(ey)g(agreed)g(on)f(via)h(the)150 2546 y(AP)j(exc)m(hange)h(\(see)g(Section)f(5.4)h([AP-REQ)f(and)f(AP-REP)h (F)-8 b(unctions],)33 b(page)f(71\).)46 b(The)31 b(follo)m(wing)150 2655 y(illustrates)g(the)g(KRB-PRIV)f(ASN.1)h(structure.)293 2808 y Fq(KRB-PRIV)380 b(::=)47 b([APPLICATION)d(21])j(SEQUENCE)f({)675 2917 y(pvno)572 b([0])47 b(INTEGER)e(\(5\),)675 3027 y(msg-type)380 b([1])47 b(INTEGER)e(\(21\),)1439 3136 y(--)i(NOTE:)f(there)h(is)g(no)g([2])g(tag)675 3246 y(enc-part)380 b([3])47 b(EncryptedData)d(--)j(EncKrbPrivPart)293 3356 y(})293 3575 y(EncKrbPrivPart)92 b(::=)47 b([APPLICATION)d(28])j (SEQUENCE)f({)675 3684 y(user-data)332 b([0])47 b(OCTET)f(STRING,)675 3794 y(timestamp)332 b([1])47 b(KerberosTime)d(OPTIONAL,)675 3904 y(usec)572 b([2])47 b(Microseconds)d(OPTIONAL,)675 4013 y(seq-number)284 b([3])47 b(UInt32)f(OPTIONAL,)675 4123 y(s-address)332 b([4])47 b(HostAddress)d(--)j(sender's)f(addr)h (--,)675 4232 y(r-address)332 b([5])47 b(HostAddress)d(OPTIONAL)i(--)h (recip's)f(addr)293 4342 y(})150 4559 y Fl(shishi)p 459 4559 37 5 v 55 w(priv)3350 4774 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 1974 4774 28 4 v 39 w(priv)c(**)i Fe(priv)p Ff(\))390 4883 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5035 y Fi(priv)8 b Fw(:)40 b(p)s(oin)m(ter)30 b(to)h(new)f(structure)g(that)h(holds)f(information)h(ab)s(out)f(PRIV)g (exc)m(hange)390 5188 y(Create)h(a)g(new)f(PRIV)g(exc)m(hange.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 98 104 TeXDict begin 98 103 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(98)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(priv)p 731 299 V 55 w(done)3350 504 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_priv_done)c Ff(\()p Fi(Shishi)p 1574 504 28 4 v 39 w(priv)30 b(*)g Fe(priv)p Ff(\))390 613 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)g(PRIV)g(exc)m(hange)390 756 y(Deallo)s(cate)39 b(resources)d(asso)s(ciated)h(with)f(PRIV)f(exc) m(hange.)58 b(This)35 b(should)g(b)s(e)g(called)i(b)m(y)f(the)390 866 y(application)c(when)d(it)i(no)f(longer)h(need)f(to)h(utilize)h (the)f(PRIV)f(exc)m(hange)i(handle.)150 1073 y Fl(shishi)p 459 1073 37 5 v 55 w(priv)p 731 1073 V 55 w(k)m(ey)3350 1278 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_priv_key)d Ff(\()p Fi(Shishi)p 1940 1278 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Ff(\))390 1388 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)g (PRIV)g(exc)m(hange)390 1530 y(Get)h(k)m(ey)h(from)d(PRIV)i(exc)m (hange.)390 1673 y Fk(Return)j(v)-5 b(alue:)48 b Fw(Returns)34 b(the)g(k)m(ey)h(used)e(in)h(the)h(PRIV)e(exc)m(hange,)k(or)d(NULL)h (if)f(not)g(y)m(et)h(set)390 1782 y(or)30 b(an)h(error)f(o)s(ccured.) 150 1990 y Fl(shishi)p 459 1990 37 5 v 55 w(priv)p 731 1990 V 55 w(k)m(ey)p 969 1990 V 53 w(set)3350 2195 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_priv_key_set)d Ff(\()p Fi(Shishi)p 1731 2195 28 4 v 39 w(priv)30 b(*)g Fe(priv)p Fi(,)i(Shishi)p 2539 2195 V 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 2304 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)g(PRIV)g(exc)m(hange)390 2447 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(store)f(in)f(PRIV.)390 2590 y(Set)h(the)f(Key)h(in)f(the)g(PRIV)g(exc)m(hange.)150 2797 y Fl(shishi)p 459 2797 37 5 v 55 w(priv)p 731 2797 V 55 w(priv)3350 3002 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_priv_priv)50 b Ff(\()p Fi(Shishi)p 1940 3002 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Ff(\))390 3112 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab)s (out)g(PRIV)g(exc)m(hange)390 3254 y(Get)h(ASN.1)g(PRIV)f(structure)g (in)g(PRIV)g(exc)m(hange.)390 3397 y Fk(Return)d(v)-5 b(alue:)39 b Fw(Returns)27 b(the)g(ASN.1)h(priv)f(in)g(the)g(PRIV)g (exc)m(hange,)j(or)d(NULL)g(if)g(not)h(y)m(et)g(set)390 3506 y(or)i(an)h(error)f(o)s(ccured.)150 3714 y Fl(shishi)p 459 3714 37 5 v 55 w(priv)p 731 3714 V 55 w(priv)p 1003 3714 V 54 w(set)3350 3919 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_priv_priv_set)d Ff(\()p Fi(Shishi)p 1783 3919 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Fi(,)g(Shishi)p 2591 3919 V 39 w(asn1)565 4028 y Fe(asn1priv)p Ff(\))390 4138 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information) g(ab)s(out)g(PRIV)g(exc)m(hange)390 4281 y Fi(asn1priv)8 b Fw(:)40 b(KRB-PRIV)30 b(to)i(store)f(in)f(PRIV)g(exc)m(hange.)390 4423 y(Set)h(the)f(KRB-PRIV)h(in)f(the)g(PRIV)g(exc)m(hange.)150 4631 y Fl(shishi)p 459 4631 37 5 v 55 w(priv)p 731 4631 V 55 w(priv)p 1003 4631 V 54 w(der)3350 4836 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_priv_der)f Ff(\()p Fi(Shishi)p 1731 4836 28 4 v 39 w(priv)30 b(*)g Fe(priv)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)h(size)p 2975 4836 V 40 w(t)f(*)565 4945 y Fe(outlen)p Ff(\))390 5055 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 5197 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(PRIV.)390 5340 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s(ding)f(of)h(PRIV.)p eop end %%Page: 99 105 TeXDict begin 99 104 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2175 b(99)390 299 y(DER)34 b(enco)s(de)f(PRIV)h(structure.)50 b(T)m(ypically)34 b Fq(shishi_priv_build\(\))29 b Fw(is)k(used)g(to)h(build)f(the)390 408 y(PRIV)d(structure)g(\014rst.)41 b Fq(out)29 b Fw(is)i(allo)s (cated)i(b)m(y)d(this)g(function,)h(and)f(it)h(is)g(the)f(resp)s (onsibilit)m(y)h(of)390 518 y(caller)h(to)f(deallo)s(cate)i(it.)390 671 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 671 28 4 v 39 w(OK)f(i\013)i(successful.)150 889 y Fl(shishi)p 459 889 37 5 v 55 w(priv)p 731 889 V 55 w(priv)p 1003 889 V 54 w(der)p 1231 889 V 54 w(set)3350 1105 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_priv_der_)q (set)f Ff(\()p Fi(Shishi)p 1940 1105 28 4 v 39 w(priv)28 b(*)i Fe(priv)p Fi(,)g(c)m(har)f(*)h Fe(der)p Fi(,)g(size)p 3130 1105 V 41 w(t)565 1214 y Fe(derlen)p Ff(\))390 1324 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 1477 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(KRB-PRIV.)390 1630 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f (DER)h(enco)s(ded)f(KRB-PRIV.)390 1784 y(DER)25 b(deco)s(de)g(KRB-PRIV) g(and)f(set)i(it)f(PRIV)g(exc)m(hange.)40 b(If)24 b(deco)s(ding)h (fails,)i(the)e(KRB-PRIV)390 1893 y(in)30 b(the)h(PRIV)f(exc)m(hange)i (remains.)390 2046 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2046 V 39 w(OK.)150 2264 y Fl(shishi)p 459 2264 37 5 v 55 w(priv)p 731 2264 V 55 w(encprivpart)3350 2480 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_priv_encprivpart)c Ff(\()p Fi(Shishi)p 2306 2480 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Ff(\))390 2590 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab) s(out)g(PRIV)g(exc)m(hange)390 2743 y(Get)h(ASN.1)g(EncPrivP)m(art)g (structure)f(from)g(PRIV)g(exc)m(hange.)390 2896 y Fk(Return)c(v)-5 b(alue:)39 b Fw(Returns)26 b(the)g(ASN.1)h(encprivpart)f(in)g(the)h (PRIV)f(exc)m(hange,)j(or)d(NULL)g(if)h(not)390 3006 y(y)m(et)32 b(set)e(or)h(an)f(error)g(o)s(ccured.)150 3224 y Fl(shishi)p 459 3224 37 5 v 55 w(priv)p 731 3224 V 55 w(encprivpart)p 1408 3224 V 53 w(set)3350 3439 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_priv_encprivpart_)q (set)e Ff(\()p Fi(Shishi)p 2149 3439 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Fi(,)h(Shishi)p 2958 3439 V 38 w(asn1)565 3549 y Fe(asn1encprivpart)p Ff(\))390 3658 y Fi(priv)8 b Fw(:)40 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)g (PRIV)g(exc)m(hange)390 3812 y Fi(asn1encprivpart)r Fw(:)40 b(ENCPRIVP)-8 b(AR)g(T)31 b(to)g(store)g(in)f(PRIV)g(exc)m(hange.)390 3965 y(Set)h(the)f(ENCPRIVP)-8 b(AR)g(T)30 b(in)g(the)h(PRIV)f(exc)m (hange.)150 4183 y Fl(shishi)p 459 4183 37 5 v 55 w(priv)p 731 4183 V 55 w(encprivpart)p 1408 4183 V 53 w(der)3350 4398 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_encprivpa)q (rt_d)q(er)f Ff(\()p Fi(Shishi)p 2097 4398 28 4 v 39 w(priv)30 b(*)g Fe(priv)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)565 4508 y(size)p 712 4508 V 41 w(t)g(*)f Fe(outlen)p Ff(\))390 4617 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b) m(y)f Fq(shishi_priv\(\))p Fw(.)390 4771 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(ENCPRIVP)-8 b(AR)g(T.)390 4924 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s (ding)f(of)h(ENCPRIVP)-8 b(AR)g(T.)390 5077 y(DER)33 b(enco)s(de)g(ENCPRIVP)-8 b(AR)g(T)33 b(structure.)48 b Fq(out)32 b Fw(is)i(allo)s(cated)h(b)m(y)d(this)h(function,)h(and)e (it)i(is)390 5187 y(the)d(resp)s(onsibilit)m(y)f(of)g(caller)i(to)f (deallo)s(cate)i(it.)390 5340 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 100 106 TeXDict begin 100 105 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(100)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(priv)p 731 299 V 55 w(encprivpart)p 1408 299 V 53 w(der)p 1635 299 V 54 w(set)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_encprivpa)q(rt_d)q (er_)q(set)f Ff(\()p Fi(Shishi)p 2306 516 28 4 v 39 w(priv)30 b(*)h Fe(priv)p Fi(,)g(c)m(har)g(*)565 626 y Fe(der)p Fi(,)h(size)p 925 626 V 40 w(t)f Fe(derlen)p Ff(\))390 735 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 890 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(ENCPRIVP)-8 b(AR)g(T.)390 1045 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(DER)h(enco)s(ded)f(ENCPRIVP)-8 b(AR)g(T.)390 1200 y(DER)47 b(deco)s(de)g(ENCPRIVP)-8 b(AR)g(T)47 b(and)g(set)g(it)h(PRIV)e(exc)m(hange.)92 b(If)47 b(deco)s(ding)g(fails,)52 b(the)390 1310 y(ENCPRIVP)-8 b(AR)g(T)30 b(in)g(the)h(PRIV)f(exc)m(hange)i(remains.)390 1465 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1465 V 39 w(OK.)150 1685 y Fl(shishi)p 459 1685 37 5 v 55 w(priv)p 731 1685 V 55 w(prin)m(t)3350 1902 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_print)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 1902 28 4 v 38 w(asn1)565 2012 y Fe(priv)p Ff(\))390 2121 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2276 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 2432 y Fi(priv)8 b Fw(:)40 b(PRIV)30 b(to)h(prin)m(t.)390 2587 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco)s(ding)f(of)h(PRIV)f (to)h(\014le.)390 2742 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2742 V 39 w(OK)f(i\013)i(successful.) 150 2961 y Fl(shishi)p 459 2961 37 5 v 55 w(priv)p 731 2961 V 55 w(sa)m(v)m(e)3350 3179 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_save)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2712 3179 28 4 v 39 w(asn1)g Fe(priv)p Ff(\))390 3288 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3443 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 3598 y Fi(priv)8 b Fw(:)40 b(PRIV)30 b(to)h(sa)m(v)m(e.)390 3753 y(Sa)m(v)m(e)h(DER)e(enco)s(ding)g(of)h(PRIV)f(to)h(\014le.)390 3908 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3908 V 39 w(OK)f(i\013)i(successful.)150 4128 y Fl(shishi)p 459 4128 37 5 v 55 w(priv)p 731 4128 V 55 w(to)p 895 4128 V 54 w(\014le)3350 4346 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_to_file)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 4346 28 4 v 39 w(asn1)f Fe(priv)p Fi(,)g(in)m(t)565 4455 y Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 4565 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4720 y Fi(priv)8 b Fw(:)40 b(PRIV)30 b(to)h(sa)m(v)m(e.)390 4875 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 4875 V 39 w(\014let)m(yp)s(e.)390 5030 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 5185 y(W)-8 b(rite)32 b(PRIV)e(to)h(\014le)f(in)h(sp)s (eci\014ed)e(TYPE.)h(The)g(\014le)h(will)f(b)s(e)g(truncated)g(if)h(it) g(exists.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 101 107 TeXDict begin 101 106 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(101)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(priv)p 731 299 V 55 w(parse)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_parse)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)i(Shishi)p 2765 516 28 4 v 38 w(asn1)f(*)565 626 y Fe(priv)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 1045 y Fi(priv)8 b Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(PRIV.)390 1200 y(Read)f(ASCI)s(I)d(armored)j(DER)f(enco)s(ded)g(PRIV)g(from)g (\014le)h(and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 1356 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1356 V 39 w(OK)f(i\013)i(successful.)150 1575 y Fl(shishi)p 459 1575 37 5 v 55 w(priv)p 731 1575 V 55 w(read)3350 1793 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_read)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2712 1793 28 4 v 39 w(asn1)g(*)565 1902 y Fe(priv)p Ff(\))390 2012 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2167 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.)390 2322 y Fi(priv)8 b Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(PRIV.)390 2477 y(Read)f(DER)f(enco)s (ded)g(PRIV)g(from)g(\014le)h(and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 2632 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2632 V 39 w(OK)f(i\013)i(successful.) 150 2852 y Fl(shishi)p 459 2852 37 5 v 55 w(priv)p 731 2852 V 55 w(from)p 1036 2852 V 55 w(\014le)3350 3069 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_from_file)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3069 28 4 v 39 w(asn1)d(*)h Fe(priv)p Fi(,)h(in)m(t)565 3179 y Fe(filetype)p Fi(,)h(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3288 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3443 y Fi(priv)8 b Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(PRIV.)390 3598 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(read,)i(see)g(Shishi)p 3066 3598 V 39 w(\014let)m(yp)s(e.)390 3753 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (read)g(from.)390 3908 y(Read)g(PRIV)f(from)g(\014le)g(in)g(sp)s (eci\014ed)g(TYPE.)390 4064 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4064 V 39 w(OK)f(i\013)i(successful.) 150 4283 y Fl(shishi)p 459 4283 37 5 v 55 w(priv)p 731 4283 V 55 w(enc)p 965 4283 V 53 w(part)p 1244 4283 V 54 w(et)m(yp)s(e)3350 4501 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_enc_part_)q(etyp)q(e)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 4501 28 4 v 39 w(asn1)565 4610 y Fe(priv)p Fi(,)g(in)m(t32)p 1034 4610 V 41 w(t)f(*)g Fe(etype)p Ff(\))390 4720 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 4875 y Fi(priv)8 b Fw(:)40 b(PRIV)30 b(v)-5 b(ariable)31 b(to)g(get)h(v)-5 b(alue)31 b(from.)390 5030 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(v)-5 b(alue.)390 5185 y(Extract)31 b(PRIV.enc-part.et)m(yp)s(e.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 102 108 TeXDict begin 102 107 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(102)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(priv)p 731 299 V 55 w(set)p 938 299 V 54 w(enc)p 1171 299 V 53 w(part)3350 502 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_set_enc_p)q(art)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 502 28 4 v 38 w(asn1)e Fe(priv)p Fi(,)565 612 y(in)m(t32)p 769 612 V 42 w(t)f Fe(etype)p Fi(,)i(const)f(c)m(har)g(*)g Fe(encpart)p Fi(,)h(size)p 2269 612 V 41 w(t)f Fe(encpartlen)p Ff(\))390 722 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 863 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 1004 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(input)30 b(encryption)g(t)m(yp)s(e)h(to)g(store)g(in)f (PRIV.)390 1146 y Fi(encpart)r Fw(:)41 b(input)29 b(encrypted)h(data)h (to)g(store)g(in)f(PRIV.)390 1287 y Fi(encpartlen)p Fw(:)41 b(size)31 b(of)g(input)e(encrypted)h(data)h(to)g(store)g(in)f(PRIV.)390 1428 y(Store)46 b(encrypted)f(data)h(in)f(PRIV.)h(The)f(encrypted)g (data)h(is)f(usually)h(created)g(b)m(y)f(calling)390 1538 y Fq(shishi_encrypt\(\))32 b Fw(on)37 b(some)g(application)h(sp)s (eci\014c)e(data)i(using)e(the)h(k)m(ey)g(from)f(the)h(tic)m(k)m(et)390 1648 y(that)24 b(is)g(b)s(eing)f(used.)38 b(T)-8 b(o)24 b(sa)m(v)m(e)h(time,)h(y)m(ou)e(ma)m(y)g(w)m(an)m(t)g(to)h(use)e Fq(shishi_priv_build\(\))18 b Fw(instead,)390 1757 y(whic)m(h)30 b(encryptes)g(the)h(data)g(and)f(calls)h(this)g(function)f(in)g(one)g (step.)390 1899 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1899 V 39 w(OK)f(i\013)i(successful.)150 2105 y Fl(shishi)p 459 2105 37 5 v 55 w(encprivpart)p 1136 2105 V 54 w(user)p 1412 2105 V 55 w(data)3350 2308 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encprivpart_us)q(er_d) q(ata)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 2308 28 4 v 39 w(asn1)565 2418 y Fe(encprivpart)p Fi(,)h(c)m(har)d(**)g Fe(userdata)p Fi(,)i(size)p 2138 2418 V 41 w(t)e(*)f Fe(userdatalen)p Ff(\))390 2527 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 2669 y Fi(encprivpart)r Fw(:)40 b(encprivpart)30 b(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_priv\(\))p Fw(.)390 2810 y Fi(userdata)p Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(user)e(data)h (from)f(KRB-PRIV.)390 2951 y Fi(userdatalen)p Fw(:)41 b(output)30 b(size)h(of)g(output)f(user)f(data)i(bu\013er.)390 3093 y(Read)j(user)e(data)j(v)-5 b(alue)34 b(from)f(KRB-PRIV.)g Fq(userdata)f Fw(is)h(allo)s(cated)j(b)m(y)d(this)g(function,)i(and)390 3202 y(it)c(is)f(the)h(resp)s(onsibilit)m(y)f(of)h(caller)g(to)h (deallo)s(cate)g(it.)390 3344 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3344 V 39 w(OK)f(i\013)i(successful.) 150 3550 y Fl(shishi)p 459 3550 37 5 v 55 w(encprivpart)p 1136 3550 V 54 w(set)p 1342 3550 V 54 w(user)p 1618 3550 V 55 w(data)3350 3753 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encprivpart_se)q(t_us)q(er_)q(dat)q(a)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 3863 y(Shishi)p 810 3863 28 4 v 39 w(asn1)g Fe(encprivpart)p Fi(,)i(const)e(c)m(har)g (*)g Fe(userdata)p Fi(,)i(size)p 2816 3863 V 41 w(t)d Fe(userdatalen)p Ff(\))390 3973 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4114 y Fi(encprivpart)r Fw(:)40 b(encprivpart)30 b(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_priv\(\))p Fw(.)390 4255 y Fi(userdata)p Fw(:)41 b(input)29 b(user)h(application)i(to)f (store)g(in)f(PRIV.)390 4397 y Fi(userdatalen)p Fw(:)41 b(size)31 b(of)g(input)e(user)h(application)i(to)f(store)g(in)f(PRIV.) 390 4538 y(Set)h(the)f(application)i(data)f(in)f(PRIV.)390 4679 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4679 V 39 w(OK)f(i\013)i(successful.)150 4885 y Fl(shishi)p 459 4885 37 5 v 55 w(priv)p 731 4885 V 55 w(build)3350 5089 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_build)e Ff(\()p Fi(Shishi)p 1574 5089 28 4 v 39 w(priv)30 b(*)g Fe(priv)p Fi(,)i(Shishi)p 2382 5089 V 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 5199 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 5340 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(for)g(session,)f (used)g(to)h(encrypt)f(data.)p eop end %%Page: 103 109 TeXDict begin 103 108 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(103)390 299 y(Build)37 b(c)m(hec)m(ksum)h(and)f(set)h(it)g(in)f(KRB-PRIV.)h(Note)g(that)g (this)g(follo)m(ws)g(RF)m(C)g(1510bis)h(and)390 408 y(is)e (incompatible)g(with)g(RF)m(C)g(1510,)j(although)d(presumably)f(few)g (implemen)m(tations)i(use)f(the)390 518 y(RF)m(C1510)c(algorithm.)390 673 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 673 28 4 v 39 w(OK)f(i\013)i(successful.)150 893 y Fl(shishi)p 459 893 37 5 v 55 w(priv)p 731 893 V 55 w(pro)s(cess)3350 1111 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_priv_process)e Ff(\()p Fi(Shishi)p 1678 1111 28 4 v 40 w(priv)29 b(*)i Fe(priv)p Fi(,)h(Shishi)p 2487 1111 V 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 1220 y Fi(priv)8 b Fw(:)40 b(priv)29 b(as)i(allo)s(cated)h(b)m(y)f Fq(shishi_priv\(\))p Fw(.)390 1376 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(use)e(to)h(decrypt)f(EncPrivP)m(art.)390 1531 y(Decrypt)42 b(encrypted)g(data)g(in)g(KRB-PRIV)f(and)g(set)i(the) f(EncPrivP)m(art)g(in)f(the)h(PRIV)f(ex-)390 1641 y(c)m(hange.)390 1796 y Fk(Return)c(v)-5 b(alue:)55 b Fw(Returns)37 b(SHISHI)p 1662 1796 V 39 w(OK)g(i\013)h(successful,)h(SHISHI)p 2747 1796 V 39 w(PRIV)p 3016 1796 V 40 w(BAD)p 3257 1796 V 41 w(KEYTYPE)390 1905 y(if)33 b(an)h(incompatible)g(k)m(ey)g(t)m(yp)s (e)g(is)f(used,)g(or)h(SHISHI)p 2279 1905 V 39 w(CR)-8 b(YPTO)p 2710 1905 V 39 w(ERR)m(OR)33 b(if)h(the)f(actual)i(de-)390 2015 y(cryption)30 b(failed.)150 2279 y Fv(5.6)68 b(Tic)l(k)l(et)46 b(F)-11 b(unctions)150 2438 y Fw(A)28 b(Tic)m(k)m(et)i(is)e(an)g(ASN.1) h(structured)e(that)i(can)f(b)s(e)g(used)f(to)i(authen)m(ticate)h(the)f (holder)e(to)i(services.)41 b(It)150 2548 y(con)m(tain)29 b(an)f(encrypted)f(part,)i(whic)m(h)e(the)h(tic)m(k)m(et)i(holder)e (cannot)g(see,)h(but)e(can)i(b)s(e)e(encrypted)g(b)m(y)h(the)150 2657 y(service,)40 b(and)c(v)-5 b(arious)37 b(information)h(ab)s(out)f (the)g(user)f(and)h(service,)j(including)c(an)h(encryption)g(k)m(ey)150 2767 y(to)d(use)f(for)g(the)h(connection.)51 b(See)33 b(Section)h(5.9)h([Tic)m(k)m(et)g(\(ASN.1\))g(F)-8 b(unctions],)35 b(page)f(125,)i(for)d(more)150 2876 y(details)e(on)g(the)f(ASN.1)h (structure)f(of)h(a)f(tic)m(k)m(et.)150 3096 y Fl(shishi)p 459 3096 37 5 v 55 w(tkt)3350 3314 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 1921 3314 28 4 v 39 w(tkt)f(**)g Fe(tkt)p Ff(\))390 3423 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3579 y Fi(tkt)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)g(newly)f(allo)s(cated)i(tic)m(k)m(et.)390 3734 y(Create)f(a)g(new)f(tic)m(k)m(et)j(handle.)390 3889 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3889 V 39 w(OK)f(i\013)i(successful.)150 4109 y Fl(shishi)p 459 4109 37 5 v 55 w(tkt2)3350 4327 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tkt2)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 4327 28 4 v 39 w(asn1)f Fe(ticket)p Fi(,)565 4436 y(Shishi)p 810 4436 V 39 w(asn1)g Fe(enckdcreppart)p Fi(,)j(Shishi)p 2031 4436 V 39 w(asn1)d Fe(kdcrep)p Ff(\))390 4546 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4701 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et.)390 4857 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(v)-5 b(ariable)31 b(with)f(auxiliary)h(tic)m(k)m(et)i(information.)390 5012 y Fi(kdcrep)s Fw(:)40 b(input)29 b(v)-5 b(ariable)31 b(with)f(KDC-REP)h(tic)m(k)m(et)i(information.)390 5167 y(Create)e(a)g(new)f(tic)m(k)m(et)j(handle.)390 5322 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(new)f(tic)m(k)m(et)k (handle,)e(or)f Fq(NULL)f Fw(on)h(error.)p eop end %%Page: 104 110 TeXDict begin 104 109 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(104)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(done)3350 482 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_done)c Ff(\()p Fi(Shishi)p 1522 482 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 592 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 719 y(Deallo)s(cate)i(resources)c(asso)s(ciated)i(with)f(tic)m(k)m(et.) 47 b(The)31 b(tic)m(k)m(et)j(m)m(ust)d(not)h(b)s(e)f(used)g(again)h (after)390 829 y(this)e(call.)150 1014 y Fl(shishi)p 459 1014 37 5 v 55 w(tkt)p 675 1014 V 54 w(tic)m(k)m(et)3350 1197 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tkt_ticket)50 b Ff(\()p Fi(Shishi)p 1992 1197 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 1307 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 1435 y(Get)e(ASN.1)g(Tic)m(k)m(et)i(structure)c(from)h(tic)m(k)m (et.)390 1562 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(actual)h(tic)m(k)m(et.)150 1748 y Fl(shishi)p 459 1748 37 5 v 55 w(tkt)p 675 1748 V 54 w(tic)m(k)m(et)p 1029 1748 V 52 w(set)3350 1931 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_ticket_set)d Ff(\()p Fi(Shishi)p 1835 1931 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(Shishi)p 2551 1931 V 39 w(asn1)e Fe(ticket)p Ff(\))390 2041 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j (info.)390 2168 y Fi(tic)m(k)m(et)r Fw(:)43 b(ASN.1)31 b(Tic)m(k)m(et)i(to)e(store)g(in)f(tic)m(k)m(et.)390 2296 y(Set)h(the)f(ASN.1)h(Tic)m(k)m(et)h(in)e(the)h(Tic)m(k)m(et.)150 2482 y Fl(shishi)p 459 2482 37 5 v 55 w(tkt)p 675 2482 V 54 w(enc)m(kdcreppart)3350 2665 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tkt_enckdcreppar)q(t)51 b Ff(\()p Fi(Shishi)p 2358 2665 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 2774 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2902 y(Get)e(ASN.1)g(EncKDCRepP)m(art)g(structure)f(from)g(tic)m(k)m (et.)390 3030 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(auxiliary)h(tic)m(k)m(et)i(information.)150 3215 y Fl(shishi)p 459 3215 37 5 v 55 w(tkt)p 675 3215 V 54 w(enc)m(kdcreppart)p 1493 3215 V 52 w(set)3350 3398 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_enckdcreppart)q (_se)q(t)d Ff(\()p Fi(Shishi)p 2201 3398 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(Shishi)p 2917 3398 V 39 w(asn1)565 3508 y Fe(enckdcreppart)p Ff(\))390 3617 y Fi(tkt)r Fw(:)41 b(structure)30 b(that)h(holds)f(information)h(ab)s(out)f(Tic)m(k)m(et)i (exc)m(hange)390 3745 y Fi(enc)m(kdcreppart)r Fw(:)41 b(EncKDCRepP)m(art)30 b(to)h(store)g(in)f(Tic)m(k)m(et.)390 3873 y(Set)h(the)f(EncKDCRepP)m(art)h(in)f(the)g(Tic)m(k)m(et.)150 4058 y Fl(shishi)p 459 4058 37 5 v 55 w(tkt)p 675 4058 V 54 w(kdcrep)3350 4241 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tkt_kdcrep)50 b Ff(\()p Fi(Shishi)p 1992 4241 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 4351 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4479 y(Get)e(ASN.1)g(KDCRep)f (structure)g(from)g(tic)m(k)m(et.)390 4606 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(KDC-REP)g(information.)150 4792 y Fl(shishi)p 459 4792 37 5 v 55 w(tkt)p 675 4792 V 54 w(enctic)m(k)m(etpart)3350 4975 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tkt_encticketpar)q(t)51 b Ff(\()p Fi(Shishi)p 2358 4975 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 5085 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 5212 y(Get)e(ASN.1)g(EncTic)m(k)m(etP)m(art)i(structure)d(from)g(tic)m (k)m(et.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(EncTic)m(k)m(etP)m(art)i(information.)p eop end %%Page: 105 111 TeXDict begin 105 110 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(105)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(enctic)m(k)m(etpart)p 1434 299 V 51 w(set)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_encticketpart)q(_se)q(t)d Ff(\()p Fi(Shishi)p 2201 498 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(Shishi)p 2917 498 V 39 w(asn1)565 607 y Fe(encticketpart)p Ff(\))390 717 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 853 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(enctic)m(k)m(etpart)33 b(to)e(store)g(in)f(tic)m(k)m(et.)390 990 y(Set)h(the)f(EncTic)m(k)m(etP)m(art)j(in)d(the)h(Tic)m(k)m(et.)150 1191 y Fl(shishi)p 459 1191 37 5 v 55 w(tkt)p 675 1191 V 54 w(k)m(ey)3350 1390 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e(shishi_tkt_key)d Ff(\()p Fi(Shishi)p 1888 1390 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 1499 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 1636 y(Get)22 b(k)m(ey)f(used)f(in)g (tic)m(k)m(et,)26 b(b)m(y)20 b(lo)s(oking)i(\014rst)d(in)i(EncKDCRepP)m (art)g(and)f(then)g(in)g(EncTic)m(k)m(etP)m(art.)390 1745 y(If)30 b(k)m(ey)h(is)f(already)h(p)s(opulated,)f(it)h(is)g(not)f (extracted)i(again.)390 1882 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(k)m(ey)h(extracted)g(from)f(EncKDCRepP)m(art)h(or)f (EncTic)m(k)m(etP)m(art.)150 2083 y Fl(shishi)p 459 2083 37 5 v 55 w(tkt)p 675 2083 V 54 w(k)m(ey)p 912 2083 V 53 w(set)3350 2281 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_key_set)e Ff(\()p Fi(Shishi)p 1626 2281 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)h(Shishi)p 2342 2281 V 38 w(k)m(ey)g(*)e Fe(key)p Ff(\))390 2391 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 2527 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(store)f(in)f(tic)m (k)m(et.)390 2664 y(Set)h(the)f(k)m(ey)h(in)f(the)h(EncTic)m(k)m(etP)m (art.)390 2800 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2800 V 39 w(OK)f(i\013)i(successful.)150 3002 y Fl(shishi)p 459 3002 37 5 v 55 w(tkt)p 675 3002 V 54 w(clien)m(t)3350 3200 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_client)e Ff(\()p Fi(Shishi)p 1574 3200 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(c)m(har)g(**)g Fe(client)p Fi(,)i(size)p 2882 3200 V 41 w(t)d(*)565 3310 y Fe(clientlen)p Ff(\))390 3419 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3556 y Fi(clien)m(t)r Fw(:)48 b(p)s(oin)m(ter)34 b(to)g(newly)f(allo)s (cated)i(zero)f(terminated)g(string)g(con)m(taining)h(principal)e (name.)390 3665 y(Ma)m(y)f(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(clientlen)p Fw(\).)390 3802 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 3911 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 4048 y(Represen)m(t)h(clien)m(t)i(principal)e (name)g(in)f(Tic)m(k)m(et)j(KDC-REP)e(as)g(zero-terminated)i(string.)42 b(The)390 4157 y(string)24 b(is)g(allo)s(cate)i(b)m(y)e(this)g (function,)h(and)e(it)i(is)f(the)g(resp)s(onsibilit)m(y)g(of)g(the)g (caller)h(to)g(deallo)s(cate)390 4267 y(it.)41 b(Note)32 b(that)f(the)f(output)g(length)h Fq(clientlen)d Fw(do)s(es)i(not)h (include)f(the)g(terminating)i(zero.)390 4404 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4404 V 39 w(OK)f(i\013)i(successful.)150 4605 y Fl(shishi)p 459 4605 37 5 v 55 w(tkt)p 675 4605 V 54 w(clien)m(t)p 1021 4605 V 53 w(p)3350 4803 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_client_p)e Ff(\()p Fi(Shishi)p 1678 4803 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(const)f(c)m(har)g(*) f Fe(client)p Ff(\))390 4913 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 5049 y Fi(clien)m(t)r Fw(:)42 b(clien)m(t)32 b(name)f(of)f(tic)m(k)m (et.)390 5186 y(Determine)h(if)g(tic)m(k)m(et)i(is)d(for)g(sp)s (eci\014ed)g(clien)m(t.)390 5322 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(tic)m(k)m(et)i(is)d(for)g(sp)s (eci\014ed)g(clien)m(t.)p eop end %%Page: 106 112 TeXDict begin 106 111 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(106)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(clien)m(trealm)3350 480 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_clientreal)q (m)e Ff(\()p Fi(Shishi)p 1835 480 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(c)m(har)f(**)g Fe(client)p Fi(,)565 590 y(size)p 712 590 V 41 w(t)g(*)f Fe(clientlen)p Ff(\))390 699 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 826 y Fi(clien)m(t)r Fw(:)53 b(p)s(oin)m(ter)36 b(to)g(newly)f(allo)s(cated)j(zero)e (terminated)h(string)e(con)m(taining)j(principal)d(name)390 936 y(and)30 b(realm.)41 b(Ma)m(y)31 b(b)s(e)f Fq(NULL)f Fw(\(to)j(only)e(p)s(opulate)h Fq(clientlen)p Fw(\).)390 1062 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of) g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 1172 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 1299 y(Con)m(v)m(ert)37 b(cname)g(and)f(realm)g (\014elds)g(from)g(AS-REQ)f(to)j(prin)m(table)e(principal)g(name)g (format.)390 1408 y(The)j(string)h(is)g(allo)s(cate)i(b)m(y)e(this)g (function,)i(and)d(it)h(is)g(the)g(resp)s(onsibilit)m(y)g(of)g(the)g (caller)h(to)390 1518 y(deallo)s(cate)24 b(it.)38 b(Note)22 b(that)g(the)g(output)f(length)g Fq(clientlen)e Fw(do)s(es)i(not)h (include)f(the)g(terminating)390 1628 y(zero.)390 1754 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1754 V 39 w(OK)f(i\013)i(successful.)150 1938 y Fl(shishi)p 459 1938 37 5 v 55 w(tkt)p 675 1938 V 54 w(clien)m(trealm)p 1323 1938 V 53 w(p)3350 2119 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_clientreal)q(m_p)f Ff(\()p Fi(Shishi)p 1940 2119 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(const)g(c)m(har)g(*)565 2229 y Fe(client)p Ff(\))390 2339 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2465 y Fi(clien)m(t)r Fw(:)42 b(principal)30 b(name)h(\(clien)m(t)h(name)e(and)g(realm\))h (of)g(tic)m(k)m(et.)390 2592 y(Determine)g(if)g(tic)m(k)m(et)i(is)d (for)g(sp)s(eci\014ed)g(clien)m(t)i(principal.)390 2719 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(tic)m (k)m(et)i(is)d(for)g(sp)s(eci\014ed)g(clien)m(t)i(principal.)150 2903 y Fl(shishi)p 459 2903 37 5 v 55 w(tkt)p 675 2903 V 54 w(realm)3350 3084 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_realm)e Ff(\()p Fi(Shishi)p 1522 3084 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(c)m(har)g(**)g Fe(realm)p Fi(,)h(size)p 2777 3084 V 41 w(t)f(*)565 3194 y Fe(realmlen)p Ff(\))390 3303 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3430 y Fi(realm)p Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(newly)f(allo)s (cated)i(c)m(haracter)g(arra)m(y)f(with)f(realm)h(name.)390 3557 y Fi(realmlen)p Fw(:)41 b(length)31 b(of)g(newly)f(allo)s(cated)i (c)m(haracter)g(arra)m(y)f(with)f(realm)h(name.)390 3684 y(Extract)g(realm)g(of)g(serv)m(er)f(in)g(tic)m(k)m(et.)390 3810 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3810 V 39 w(OK)f(i\013)i(successful.)150 3994 y Fl(shishi)p 459 3994 37 5 v 55 w(tkt)p 675 3994 V 54 w(serv)m(er)3350 4175 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_server)e Ff(\()p Fi(Shishi)p 1574 4175 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(c)m(har)g(**)g Fe(server)p Fi(,)i(size)p 2882 4175 V 41 w(t)d(*)565 4285 y Fe(serverlen)p Ff(\))390 4395 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4521 y Fi(serv)m(er)7 b Fw(:)42 b(p)s(oin)m(ter)32 b(to)g(newly)f(allo) s(cated)i(zero)f(terminated)g(string)f(con)m(taining)i(principal)e (name.)390 4631 y(Ma)m(y)h(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(serverlen)p Fw(\).)390 4758 y Fi(serv)m(erlen)p Fw(:)51 b(p)s(oin)m(ter)35 b(to)h(length)g(of)f Fq(server)f Fw(on)h(output,)h(excluding)g(terminating)g(zero.)56 b(Ma)m(y)390 4867 y(b)s(e)30 b Fq(NULL)f Fw(\(to)i(only)g(p)s(opulate)f Fq(server)p Fw(\).)390 4994 y(Represen)m(t)38 b(serv)m(er)g(principal)g (name)f(in)h(Tic)m(k)m(et)i(as)e(zero-terminated)h(string.)63 b(The)37 b(string)h(is)390 5104 y(allo)s(cate)43 b(b)m(y)c(this)h (function,)j(and)c(it)i(is)f(the)g(resp)s(onsibilit)m(y)g(of)g(the)h (caller)g(to)g(deallo)s(cate)h(it.)390 5213 y(Note)32 b(that)f(the)f(output)g(length)h Fq(serverlen)d Fw(do)s(es)i(not)g (include)h(the)f(terminating)h(zero.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 107 113 TeXDict begin 107 112 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(107)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(serv)m(er)p 1051 299 V 54 w(p)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_server_p)e Ff(\()p Fi(Shishi)p 1678 496 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(const)f(c)m(har)g(*)f Fe(server)p Ff(\))390 606 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 741 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(of)f(tic)m(k)m (et.)390 877 y(Determine)h(if)g(tic)m(k)m(et)i(is)d(for)g(sp)s (eci\014ed)g(serv)m(er.)390 1012 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(tic)m(k)m(et)i(is)d(for)g(sp)s (eci\014ed)g(serv)m(er.)150 1212 y Fl(shishi)p 459 1212 37 5 v 55 w(tkt)p 675 1212 V 54 w(\015ags)3350 1410 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_flags)e Ff(\()p Fi(Shishi)p 1522 1410 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(uin)m(t32)p 2247 1410 V 41 w(t)g(*)f Fe(flags)p Ff(\))390 1519 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 1655 y Fi(\015ags)t Fw(:)41 b(p)s(oin)m(ter)30 b(to)h(output)f(in)m (teger)i(with)e(\015ags.)390 1790 y(Extract)h(\015ags)g(in)f(tic)m(k)m (et)j(\(i.e.,)f(EncKDCRepP)m(art\).)390 1925 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1925 V 39 w(OK)f(i\013)i(successful.)150 2125 y Fl(shishi)p 459 2125 37 5 v 55 w(tkt)p 675 2125 V 54 w(\015ags)p 966 2125 V 54 w(set)3350 2323 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_flags_set)f Ff(\()p Fi(Shishi)p 1731 2323 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(uin)m(t32)p 2456 2323 V 41 w(t)g Fe(flags)p Ff(\))390 2432 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 2568 y Fi(\015ags)t Fw(:)41 b(in)m(teger)31 b(with)g(\015ags)f(to)h (store)g(in)f(tic)m(k)m(et.)390 2703 y(Set)40 b(\015ags)f(in)g(tic)m(k) m(et,)45 b(i.e.,)e(b)s(oth)38 b(EncTic)m(k)m(etP)m(art)k(and)d (EncKDCRepP)m(art.)67 b(Note)41 b(that)f(this)390 2813 y(reset)31 b(an)m(y)g(already)g(existing)g(\015ags.)390 2948 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2948 V 39 w(OK)f(i\013)i(successful.)150 3148 y Fl(shishi)p 459 3148 37 5 v 55 w(tkt)p 675 3148 V 54 w(\015ags)p 966 3148 V 54 w(add)3350 3346 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_flags_add)f Ff(\()p Fi(Shishi)p 1731 3346 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(uin)m(t32)p 2456 3346 V 41 w(t)g Fe(flag)p Ff(\))390 3455 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3591 y Fi(\015ag)8 b Fw(:)41 b(in)m(teger)32 b(with)e(\015ags)g(to)h(store)g(in)f(tic)m(k) m(et.)390 3726 y(Add)f(tic)m(k)m(et)k(\015ags)e(to)g(Tic)m(k)m(et)h (and)e(EncKDCRepP)m(art.)41 b(This)30 b(preserv)m(es)g(all)h(existing)h (options.)390 3861 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3861 V 39 w(OK)f(i\013)i(successful.)150 4061 y Fl(shishi)p 459 4061 37 5 v 55 w(tkt)p 675 4061 V 54 w(forw)m(ardable)p 1359 4061 V 54 w(p)3350 4259 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_forwardabl)q(e_p)f Ff(\()p Fi(Shishi)p 1940 4259 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 4368 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4504 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(forw)m(ardable.)390 4639 y(The)42 b(F)m(OR)-10 b(W)g(ARD)m(ABLE)44 b(\015ag)f(in)f(a)h(tic) m(k)m(et)i(is)e(normally)g(only)f(in)m(terpreted)h(b)m(y)f(the)h(tic)m (k)m(et-)390 4749 y(gran)m(ting)26 b(service.)39 b(It)25 b(can)g(b)s(e)f(ignored)h(b)m(y)f(application)i(serv)m(ers.)39 b(The)24 b(F)m(OR)-10 b(W)g(ARD)m(ABLE)27 b(\015ag)390 4858 y(has)i(an)g(in)m(terpretation)h(similar)g(to)f(that)h(of)f(the)g (PR)m(O)m(XIABLE)h(\015ag,)g(except)g(tic)m(k)m(et-gran)m(ting)390 4968 y(tic)m(k)m(ets)44 b(ma)m(y)e(also)h(b)s(e)e(issued)g(with)g (di\013eren)m(t)i(net)m(w)m(ork)f(addresses.)74 b(This)41 b(\015ag)h(is)g(reset)g(b)m(y)390 5077 y(default,)27 b(but)e(users)f(MA)-8 b(Y)27 b(request)e(that)h(it)g(b)s(e)f(set)h(b)m (y)f(setting)i(the)e(F)m(OR)-10 b(W)g(ARD)m(ABLE)27 b(option)390 5187 y(in)j(the)h(AS)f(request)g(when)f(they)i(request)f(their)h (initial)g(tic)m(k)m(et-gran)m(ting)k(tic)m(k)m(et.)390 5322 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(forw)m(ardable)f(\015ag)h(is)f(set)h(in)f(tic)m(k)m (et.)p eop end %%Page: 108 114 TeXDict begin 108 113 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(108)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(forw)m(arded)p 1265 299 V 54 w(p)3350 494 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_forwarded_)q(p)e Ff(\()p Fi(Shishi)p 1835 494 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 604 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 738 y(Determine)e(if)g(tic)m(k)m(et)i (is)d(forw)m(arded.)390 872 y(The)k(F)m(OR)-10 b(W)g(ARDED)36 b(\015ag)f(is)g(set)g(b)m(y)g(the)g(TGS)f(when)f(a)i(clien)m(t)i (presen)m(ts)d(a)h(tic)m(k)m(et)i(with)e(the)390 981 y(F)m(OR)-10 b(W)g(ARD)m(ABLE)40 b(\015ag)f(set)f(and)g(requests)g(a)g (forw)m(arded)g(tic)m(k)m(et)j(b)m(y)d(sp)s(ecifying)g(the)g(F)m(OR-) 390 1091 y(W)-10 b(ARDED)41 b(KDC)f(option)g(and)f(supplying)g(a)i(set) f(of)g(addresses)f(for)h(the)g(new)g(tic)m(k)m(et.)72 b(It)40 b(is)390 1201 y(also)d(set)f(in)g(all)h(tic)m(k)m(ets)h(issued) d(based)h(on)g(tic)m(k)m(ets)i(with)e(the)g(F)m(OR)-10 b(W)g(ARDED)37 b(\015ag)f(set.)58 b(Ap-)390 1310 y(plication)35 b(serv)m(ers)f(ma)m(y)g(c)m(ho)s(ose)h(to)f(pro)s(cess)f(F)m(OR)-10 b(W)g(ARDED)35 b(tic)m(k)m(ets)h(di\013eren)m(tly)f(than)e(non-)390 1420 y(F)m(OR)-10 b(W)g(ARDED)32 b(tic)m(k)m(ets.)390 1554 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h (forw)m(arded)e(\015ag)i(is)g(set)f(in)h(tic)m(k)m(et.)150 1752 y Fl(shishi)p 459 1752 37 5 v 55 w(tkt)p 675 1752 V 54 w(pro)m(xiable)p 1222 1752 V 54 w(p)3350 1947 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_proxiable_)q(p)e Ff(\()p Fi(Shishi)p 1835 1947 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 2057 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2191 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(pro)m(xiable.)390 2325 y(The)f(PR)m(O)m(XIABLE)h(\015ag)g(in)f(a)h(tic)m(k)m(et)i(is)d (normally)h(only)f(in)m(terpreted)h(b)m(y)f(the)h(tic)m(k)m(et-gran)m (ting)390 2434 y(service.)42 b(It)31 b(can)g(b)s(e)f(ignored)h(b)m(y)f (application)i(serv)m(ers.)42 b(When)30 b(set,)i(this)e(\015ag)h(tells) h(the)f(tic)m(k)m(et-)390 2544 y(gran)m(ting)j(serv)m(er)f(that)g(it)h (is)e(OK)h(to)g(issue)g(a)g(new)f(tic)m(k)m(et)k(\(but)c(not)h(a)g(tic) m(k)m(et-gran)m(ting)k(tic)m(k)m(et\))390 2653 y(with)30 b(a)i(di\013eren)m(t)f(net)m(w)m(ork)g(address)f(based)h(on)f(this)h (tic)m(k)m(et.)44 b(This)30 b(\015ag)i(is)e(set)i(if)e(requested)h(b)m (y)390 2763 y(the)i(clien)m(t)i(on)e(initial)h(authen)m(tication.)51 b(By)34 b(default,)g(the)f(clien)m(t)i(will)e(request)h(that)f(it)h(b)s (e)e(set)390 2873 y(when)d(requesting)i(a)f(tic)m(k)m(et-gran)m(ting)35 b(tic)m(k)m(et,)e(and)c(reset)i(when)e(requesting)i(an)m(y)g(other)f (tic)m(k)m(et.)390 3007 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(pro)m(xiable)g(\015ag)g(is)f(set)h (in)f(tic)m(k)m(et.)150 3205 y Fl(shishi)p 459 3205 37 5 v 55 w(tkt)p 675 3205 V 54 w(pro)m(xy)p 1035 3205 V 53 w(p)3350 3400 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_proxy_p)e Ff(\()p Fi(Shishi)p 1626 3400 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 3510 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 3644 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(pro)m(xy)g(tic)m(k)m (et.)390 3778 y(The)h(PR)m(O)m(XY)i(\015ag)f(is)g(set)g(in)f(a)h(tic)m (k)m(et)j(b)m(y)c(the)h(TGS)f(when)g(it)h(issues)g(a)g(pro)m(xy)g(tic)m (k)m(et.)47 b(Appli-)390 3887 y(cation)33 b(serv)m(ers)e(MA)-8 b(Y)32 b(c)m(hec)m(k)h(this)e(\015ag)h(and)e(at)i(their)g(option)f (they)h(MA)-8 b(Y)32 b(require)f(additional)390 3997 y(authen)m(tication)e(from)e(the)g(agen)m(t)h(presen)m(ting)g(the)f (pro)m(xy)g(in)g(order)f(to)i(pro)m(vide)f(an)g(audit)g(trail.)390 4131 y Fk(Return)j(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h (pro)m(xy)f(\015ag)h(is)f(set)h(in)f(tic)m(k)m(et.)150 4329 y Fl(shishi)p 459 4329 37 5 v 55 w(tkt)p 675 4329 V 54 w(ma)m(y)p 953 4329 V 53 w(p)s(ostdate)p 1466 4329 V 55 w(p)3350 4524 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_may_postda)q(te_p)f Ff(\()p Fi(Shishi)p 1992 4524 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 4634 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4768 y(Determine)e(if)g(tic)m(k)m(et) i(ma)m(y)e(b)s(e)e(used)h(to)h(gran)m(t)g(p)s(ostdated)g(tic)m(k)m (ets.)390 4902 y(The)40 b(MA)-8 b(Y-POSTD)m(A)g(TE)41 b(\015ag)g(in)f(a)h(tic)m(k)m(et)i(is)d(normally)h(only)f(in)m (terpreted)h(b)m(y)f(the)h(tic)m(k)m(et-)390 5011 y(gran)m(ting)d (service.)61 b(It)37 b(can)g(b)s(e)g(ignored)g(b)m(y)f(application)j (serv)m(ers.)60 b(This)36 b(\015ag)i(MUST)e(b)s(e)g(set)390 5121 y(in)29 b(a)g(tic)m(k)m(et-gran)m(ting)k(tic)m(k)m(et)f(in)d (order)g(to)h(issue)f(a)g(p)s(ostdated)g(tic)m(k)m(et)j(based)d(on)g (the)g(presen)m(ted)390 5230 y(tic)m(k)m(et.)42 b(It)27 b(is)f(reset)i(b)m(y)e(default;)i(it)f(MA)-8 b(Y)28 b(b)s(e)e (requested)h(b)m(y)f(a)h(clien)m(t)h(b)m(y)f(setting)g(the)g(ALLO)m(W-) 390 5340 y(POSTD)m(A)-8 b(TE)30 b(option)g(in)f(the)h(KRB)p 1675 5340 V 40 w(AS)p 1834 5340 V 40 w(REQ)f(message.)42 b(This)29 b(\015ag)h(do)s(es)g(not)g(allo)m(w)h(a)f(clien)m(t)p eop end %%Page: 109 115 TeXDict begin 109 114 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(109)390 299 y(to)44 b(obtain)g(a)g(p)s(ostdated)g(tic)m(k)m(et-gran)m(ting)j(tic)m(k)m(et;) 54 b(p)s(ostdated)43 b(tic)m(k)m(et-gran)m(ting)48 b(tic)m(k)m(ets)e (can)390 408 y(only)35 b(b)m(y)f(obtained)h(b)m(y)f(requesting)h(the)f (p)s(ostdating)h(in)f(the)h(KRB)p 2770 408 28 4 v 40 w(AS)p 2929 408 V 39 w(REQ)f(message.)54 b(The)390 518 y(life)32 b(\(endtime-starttime\))h(of)f(a)f(p)s(ostdated)g(tic)m(k)m (et)j(will)d(b)s(e)g(the)g(remaining)h(life)f(of)h(the)f(tic)m(k)m(et-) 390 628 y(gran)m(ting)26 b(tic)m(k)m(et)i(at)e(the)g(time)g(of)f(the)h (request,)g(unless)f(the)g(RENEW)-10 b(ABLE)26 b(option)g(is)f(also)h (set,)390 737 y(in)32 b(whic)m(h)g(case)h(it)g(can)g(b)s(e)f(the)g (full)g(life)h(\(endtime-starttime\))i(of)d(the)h(tic)m(k)m(et-gran)m (ting)j(tic)m(k)m(et.)390 847 y(The)30 b(KDC)g(MA)-8 b(Y)31 b(limit)h(ho)m(w)e(far)g(in)g(the)h(future)e(a)i(tic)m(k)m(et)i (ma)m(y)e(b)s(e)f(p)s(ostdated.)390 986 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(ma)m(y-p)s(ostdate)g (\015ag)g(is)g(set)f(in)g(tic)m(k)m(et.)150 1191 y Fl(shishi)p 459 1191 37 5 v 55 w(tkt)p 675 1191 V 54 w(p)s(ostdated)p 1257 1191 V 54 w(p)3350 1392 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_postdated_)q(p)e Ff(\()p Fi(Shishi)p 1835 1392 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 1502 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 1641 y(Determine)e(if)g(tic)m(k)m(et) i(is)d(p)s(ostdated.)390 1781 y(The)j(POSTD)m(A)-8 b(TED)33 b(\015ag)g(indicates)h(that)g(a)f(tic)m(k)m(et)j(has)d(b)s(een)f(p)s (ostdated.)49 b(The)33 b(application)390 1890 y(serv)m(er)22 b(can)g(c)m(hec)m(k)h(the)f(auth)m(time)h(\014eld)e(in)g(the)h(tic)m(k) m(et)j(to)d(see)g(when)f(the)h(original)h(authen)m(tication)390 2000 y(o)s(ccurred.)55 b(Some)35 b(services)h(MA)-8 b(Y)37 b(c)m(ho)s(ose)f(to)g(reject)g(p)s(ostdated)g(tic)m(k)m(ets,)j(or)c (they)h(ma)m(y)g(only)390 2110 y(accept)45 b(them)e(within)g(a)h (certain)g(p)s(erio)s(d)e(after)i(the)g(original)h(authen)m(tication.) 82 b(When)43 b(the)390 2219 y(KDC)33 b(issues)f(a)h(POSTD)m(A)-8 b(TED)33 b(tic)m(k)m(et,)j(it)e(will)f(also)h(b)s(e)e(mark)m(ed)h(as)g (INV)-10 b(ALID,)33 b(so)g(that)h(the)390 2329 y(application)e(clien)m (t)g(MUST)e(presen)m(t)g(the)h(tic)m(k)m(et)i(to)e(the)f(KDC)g(to)i(b)s (e)d(v)-5 b(alidated)32 b(b)s(efore)e(use.)390 2468 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(p)s (ostdated)f(\015ag)h(is)f(set)h(in)f(tic)m(k)m(et.)150 2672 y Fl(shishi)p 459 2672 37 5 v 55 w(tkt)p 675 2672 V 54 w(in)m(v)-7 b(alid)p 1082 2672 V 53 w(p)3350 2874 y Fw([F)f(unction])-3599 b Fg(int)53 b(shishi_tkt_invalid_p)f Ff(\()p Fi(Shishi)p 1731 2874 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 2984 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3123 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(in)m(v)-5 b(alid.)390 3263 y(The)26 b(INV)-10 b(ALID)26 b(\015ag)h(indicates)g (that)g(a)f(tic)m(k)m(et)j(is)e(in)m(v)-5 b(alid.)40 b(Application)27 b(serv)m(ers)f(MUST)g(reject)390 3372 y(tic)m(k)m(ets)i(whic)m(h)e(ha)m(v)m(e)h(this)f(\015ag)g(set.)40 b(A)26 b(p)s(ostdated)g(tic)m(k)m(et)j(will)d(b)s(e)f(issued)h(in)f (this)h(form.)39 b(In)m(v)-5 b(alid)390 3482 y(tic)m(k)m(ets)34 b(MUST)d(b)s(e)g(v)-5 b(alidated)33 b(b)m(y)e(the)h(KDC)f(b)s(efore)g (use,)h(b)m(y)g(presen)m(ting)g(them)f(to)h(the)g(KDC)390 3591 y(in)d(a)h(TGS)f(request)h(with)f(the)h(V)-10 b(ALID)m(A)i(TE)30 b(option)g(sp)s(eci\014ed.)40 b(The)29 b(KDC)g(will)h(only)f(v)-5 b(alidate)390 3701 y(tic)m(k)m(ets)33 b(after)e(their)g(starttime)h (has)e(passed.)41 b(The)30 b(v)-5 b(alidation)32 b(is)f(required)f(so)h (that)g(p)s(ostdated)390 3811 y(tic)m(k)m(ets)40 b(whic)m(h)d(ha)m(v)m (e)i(b)s(een)e(stolen)h(b)s(efore)g(their)f(starttime)i(can)f(b)s(e)f (rendered)f(p)s(ermanen)m(tly)390 3920 y(in)m(v)-5 b(alid)31 b(\(through)f(a)h(hot-list)g(mec)m(hanism\).)390 4060 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(in)m(v) -5 b(alid)31 b(\015ag)f(is)h(set)g(in)f(tic)m(k)m(et.)150 4264 y Fl(shishi)p 459 4264 37 5 v 55 w(tkt)p 675 4264 V 54 w(renew)m(able)p 1263 4264 V 53 w(p)3350 4466 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_renewable_)q(p)e Ff(\()p Fi(Shishi)p 1835 4466 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 4575 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4715 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(renew)m(able.)390 4854 y(The)25 b(RENEW)-10 b(ABLE)26 b(\015ag)g(in)f(a)h(tic)m(k)m(et)i (is)e(normally)f(only)h(in)m(terpreted)g(b)m(y)f(the)h(tic)m(k)m (et-gran)m(ting)390 4964 y(service)43 b(\(discussed)e(b)s(elo)m(w)h(in) f(section)i(3.3\).)77 b(It)41 b(can)h(usually)g(b)s(e)f(ignored)h(b)m (y)g(application)390 5073 y(serv)m(ers.)f(Ho)m(w)m(ev)m(er,)32 b(some)e(particularly)h(careful)f(application)h(serv)m(ers)f(MA)-8 b(Y)31 b(disallo)m(w)g(renew-)390 5183 y(able)g(tic)m(k)m(ets.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h (renew)m(able)g(\015ag)f(is)h(set)g(in)f(tic)m(k)m(et.)p eop end %%Page: 110 116 TeXDict begin 110 115 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(110)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(initial)p 1041 299 V 54 w(p)3350 494 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_initial_p)f Ff(\()p Fi(Shishi)p 1731 494 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 604 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 738 y(Determine)e(if)g(tic)m(k)m(et)i(w)m(as)e(issued)e(using)h(AS) g(exc)m(hange.)390 872 y(The)22 b(INITIAL)f(\015ag)i(indicates)g(that)g (a)g(tic)m(k)m(et)i(w)m(as)d(issued)g(using)g(the)g(AS)g(proto)s(col,)j (rather)d(than)390 981 y(issued)28 b(based)h(on)g(a)g(tic)m(k)m (et-gran)m(ting)k(tic)m(k)m(et.)43 b(Application)30 b(serv)m(ers)g (that)f(w)m(an)m(t)h(to)g(require)f(the)390 1091 y(demonstrated)i(kno)m (wledge)i(of)e(a)h(clien)m(t's)g(secret)h(k)m(ey)f(\(e.g.)44 b(a)32 b(passw)m(ord-c)m(hanging)g(program\))390 1201 y(can)j(insist)g(that)h(this)f(\015ag)g(b)s(e)g(set)g(in)g(an)m(y)g (tic)m(k)m(ets)j(they)d(accept,)j(and)c(th)m(us)h(b)s(e)f(assured)g (that)390 1310 y(the)d(clien)m(t's)h(k)m(ey)f(w)m(as)g(recen)m(tly)g (presen)m(ted)g(to)g(the)f(application)i(clien)m(t.)390 1444 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h (initial)g(\015ag)g(is)f(set)h(in)f(tic)m(k)m(et.)150 1642 y Fl(shishi)p 459 1642 37 5 v 55 w(tkt)p 675 1642 V 54 w(pre)p 903 1642 V 54 w(authen)m(t)p 1370 1642 V 53 w(p)3350 1838 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_pre_authen)q(t_p)f Ff(\()p Fi(Shishi)p 1940 1838 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 1947 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m (et)j(info.)390 2081 y(Determine)e(if)g(tic)m(k)m(et)i(w)m(as)e (pre-authen)m(ticated.)390 2215 y(The)55 b(PRE-A)m(UTHENT)g(and)g(HW-A) m(UTHENT)h(\015ags)f(pro)m(vide)h(additional)g(information)390 2325 y(ab)s(out)61 b(the)f(initial)j(authen)m(tication,)70 b(regardless)61 b(of)g(whether)g(the)g(curren)m(t)f(tic)m(k)m(et)k(w)m (as)390 2434 y(issued)j(directly)i(\(in)f(whic)m(h)g(case)i(INITIAL)d (will)h(also)i(b)s(e)d(set\))i(or)f(issued)g(on)g(the)390 2544 y(basis)54 b(of)g(a)h(tic)m(k)m(et-gran)m(ting)j(tic)m(k)m(et)f (\(in)d(whic)m(h)g(case)i(the)e(INITIAL)f(\015ag)i(is)f(clear,)62 b(but)390 2653 y(the)h(PRE-A)m(UTHENT)f(and)g(HW-A)m(UTHENT)i(\015ags)e (are)h(carried)g(forw)m(ard)f(from)g(the)390 2763 y(tic)m(k)m(et-gran)m (ting)34 b(tic)m(k)m(et\).)390 2897 y Fk(Return)c(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(pre-authen)m(t)f(\015ag)h (is)g(set)f(in)g(tic)m(k)m(et.)150 3095 y Fl(shishi)p 459 3095 37 5 v 55 w(tkt)p 675 3095 V 54 w(h)m(w)p 883 3095 V 53 w(authen)m(t)p 1349 3095 V 53 w(p)3350 3291 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_hw_authent)q(_p)f Ff(\()p Fi(Shishi)p 1888 3291 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 3400 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3534 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(authen)m(ticated)i(using)e (a)h(hardw)m(are)f(tok)m(en.)390 3668 y(The)55 b(PRE-A)m(UTHENT)g(and)g (HW-A)m(UTHENT)h(\015ags)f(pro)m(vide)h(additional)g(information)390 3778 y(ab)s(out)61 b(the)f(initial)j(authen)m(tication,)70 b(regardless)61 b(of)g(whether)g(the)g(curren)m(t)f(tic)m(k)m(et)k(w)m (as)390 3887 y(issued)j(directly)i(\(in)f(whic)m(h)g(case)i(INITIAL)d (will)h(also)i(b)s(e)d(set\))i(or)f(issued)g(on)g(the)390 3997 y(basis)54 b(of)g(a)h(tic)m(k)m(et-gran)m(ting)j(tic)m(k)m(et)f (\(in)d(whic)m(h)g(case)i(the)e(INITIAL)f(\015ag)i(is)f(clear,)62 b(but)390 4106 y(the)h(PRE-A)m(UTHENT)f(and)g(HW-A)m(UTHENT)i(\015ags)e (are)h(carried)g(forw)m(ard)f(from)g(the)390 4216 y(tic)m(k)m(et-gran)m (ting)34 b(tic)m(k)m(et\).)390 4350 y Fk(Return)c(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(h)m(w-authen)m(t)f(\015ag) h(is)g(set)g(in)f(tic)m(k)m(et.)150 4548 y Fl(shishi)p 459 4548 37 5 v 55 w(tkt)p 675 4548 V 54 w(transited)p 1209 4548 V 54 w(p)s(olicy)p 1583 4548 V 54 w(c)m(hec)m(k)m(ed)p 2051 4548 V 52 w(p)3350 4743 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_transited_)q(poli)q(cy_)q(che)q(cke)q(d_p)f Ff(\()p Fi(Shishi)p 2620 4743 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 4853 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4987 y(Determine)e(if)g(tic)m(k)m(et)i(has)d(b)s(een)g(p)s(olicy)g(c)m (hec)m(k)m(ed)j(for)d(transit.)390 5121 y(The)41 b(application)i(serv)m (er)f(is)g(ultimately)i(resp)s(onsible)c(for)i(accepting)h(or)f (rejecting)h(authen-)390 5230 y(tication)i(and)d(SHOULD)h(c)m(hec)m(k)i (that)e(only)h(suitably)f(trusted)f(KDCs)h(are)g(relied)h(up)s(on)d(to) 390 5340 y(authen)m(ticate)29 b(a)d(principal.)39 b(The)26 b(transited)h(\014eld)f(in)f(the)i(tic)m(k)m(et)i(iden)m(ti\014es)e (whic)m(h)f(realms)g(\(and)p eop end %%Page: 111 117 TeXDict begin 111 116 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(111)390 299 y(th)m(us)39 b(whic)m(h)g(KDCs\))h(w)m(ere)g(in)m(v)m(olv)m(ed)h(in)f(the)f(authen)m (tication)j(pro)s(cess)d(and)g(an)h(application)390 408 y(serv)m(er)33 b(w)m(ould)f(normally)g(c)m(hec)m(k)i(this)e(\014eld.)46 b(If)32 b(an)m(y)g(of)h(these)g(are)f(un)m(trusted)g(to)h(authen)m (ticate)390 518 y(the)28 b(indicated)h(clien)m(t)g(principal)f (\(probably)g(determined)f(b)m(y)h(a)h(realm-based)f(p)s(olicy\),)i (the)e(au-)390 628 y(then)m(tication)37 b(attempt)f(MUST)e(b)s(e)g (rejected.)54 b(The)34 b(presence)h(of)g(trusted)f(KDCs)g(in)h(this)f (list)390 737 y(do)s(es)c(not)h(pro)m(vide)f(an)m(y)h(guaran)m(tee;)h (an)e(un)m(trusted)g(KDC)g(ma)m(y)h(ha)m(v)m(e)g(fabricated)g(the)g (list.)390 871 y(While)d(the)f(end)g(serv)m(er)g(ultimately)i(decides)e (whether)g(authen)m(tication)i(is)e(v)-5 b(alid,)29 b(the)e(KDC)g(for) 390 981 y(the)i(end)f(serv)m(er's)h(realm)g(MA)-8 b(Y)30 b(apply)e(a)h(realm)g(sp)s(eci\014c)f(p)s(olicy)h(for)g(v)-5 b(alidating)30 b(the)f(transited)390 1090 y(\014eld)24 b(and)g(accepting)i(creden)m(tials)g(for)e(cross-realm)h(authen)m (tication.)41 b(When)24 b(the)h(KDC)f(applies)390 1200 y(suc)m(h)i(c)m(hec)m(ks)h(and)f(accepts)h(suc)m(h)f(cross-realm)h (authen)m(tication)h(it)f(will)f(set)h(the)f(TRANSITED-)390 1310 y(POLICY-CHECKED)41 b(\015ag)j(in)e(the)h(service)h(tic)m(k)m(ets) h(it)e(issues)g(based)f(on)h(the)g(cross-realm)390 1419 y(TGT.)33 b(A)g(clien)m(t)h(MA)-8 b(Y)34 b(request)f(that)g(the)g(KDCs) g(not)g(c)m(hec)m(k)h(the)g(transited)f(\014eld)f(b)m(y)h(setting)390 1529 y(the)k(DISABLE-TRANSITED-CHECK)f(\015ag.)61 b(KDCs)37 b(are)g(encouraged)h(but)e(not)i(required)390 1638 y(to)31 b(honor)f(this)g(\015ag.)390 1772 y(Application)h(serv)m(ers)g(MUST)f (either)g(do)h(the)f(transited-realm)h(c)m(hec)m(ks)h(themselv)m(es,)g (or)e(reject)390 1882 y(cross-realm)h(tic)m(k)m(ets)i(without)e (TRANSITED-POLICY-)e(CHECKED)g(set.)390 2016 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(transited-p)s(olicy-c)m (hec)m(k)m(ed)i(\015ag)e(is)f(set)h(in)f(tic)m(k)m(et.)150 2214 y Fl(shishi)p 459 2214 37 5 v 55 w(tkt)p 675 2214 V 54 w(ok)p 855 2214 V 54 w(as)p 1017 2214 V 54 w(delegate)p 1510 2214 V 54 w(p)3350 2409 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_ok_as_dele)q(gate)q(_p)f Ff(\()p Fi(Shishi)p 2097 2409 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 2519 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2653 y(Determine)e(if)g(tic)m(k)m(et) i(is)d(ok)h(as)g(delegated)h(tic)m(k)m(et.)390 2787 y(The)k(cop)m(y)i (of)f(the)g(tic)m(k)m(et)i(\015ags)e(in)g(the)g(encrypted)f(part)h(of)f (the)h(KDC)g(reply)f(ma)m(y)i(ha)m(v)m(e)g(the)390 2897 y(OK-AS-DELEGA)-8 b(TE)41 b(\015ag)g(set)g(to)g(indicates)h(to)f(the)g (clien)m(t)h(that)g(the)e(serv)m(er)h(sp)s(eci\014ed)f(in)390 3006 y(the)d(tic)m(k)m(et)j(has)d(b)s(een)f(determined)h(b)m(y)g(p)s (olicy)g(of)g(the)h(realm)f(to)h(b)s(e)f(a)g(suitable)h(recipien)m(t)g (of)390 3116 y(delegation.)i(A)22 b(clien)m(t)i(can)f(use)f(the)g (presence)g(of)h(this)f(\015ag)g(to)h(help)f(it)h(mak)m(e)g(a)g (decision)g(whether)390 3225 y(to)37 b(delegate)h(creden)m(tials)g (\(either)f(gran)m(t)g(a)f(pro)m(xy)g(or)h(a)f(forw)m(arded)g(tic)m(k)m (et-)j(gran)m(ting)e(tic)m(k)m(et\))390 3335 y(to)j(this)f(serv)m(er.) 67 b(It)39 b(is)g(acceptable)i(to)f(ignore)f(the)g(v)-5 b(alue)40 b(of)f(this)g(\015ag.)67 b(When)39 b(setting)h(this)390 3444 y(\015ag,)h(an)d(administrator)h(should)e(consider)i(the)f (securit)m(y)i(and)d(placemen)m(t)j(of)f(the)f(serv)m(er)h(on)390 3554 y(whic)m(h)26 b(the)h(service)g(will)g(run,)f(as)g(w)m(ell)i(as)e (whether)g(the)h(service)g(requires)f(the)h(use)f(of)g(delegated)390 3664 y(creden)m(tials.)390 3798 y Fk(Return)k(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(ok-as-delegate)j(\015ag)c(is)h(set)g (in)f(tic)m(k)m(et.)150 3996 y Fl(shishi)p 459 3996 37 5 v 55 w(tkt)p 675 3996 V 54 w(k)m(eyt)m(yp)s(e)3350 4191 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_keytype)e Ff(\()p Fi(Shishi)p 1626 4191 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)h(in)m(t32)p 2301 4191 V 41 w(t)f(*)f Fe(etype)p Ff(\))390 4301 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4435 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(encryption)f(t)m(yp)s(e)h(that)g (is)f(set,)h(see)g(Shishi)p 2604 4435 V 39 w(et)m(yp)s(e.)390 4569 y(Extract)g(encryption)g(t)m(yp)s(e)f(of)h(k)m(ey)g(in)f(tic)m(k)m (et)j(\(really)e(EncKDCRepP)m(art\).)390 4703 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4703 V 39 w(OK)f(i\013)i(successful.)150 4901 y Fl(shishi)p 459 4901 37 5 v 55 w(tkt)p 675 4901 V 54 w(k)m(eyt)m(yp)s(e)p 1149 4901 V 52 w(fast)3350 5096 y Fw([F)-8 b(unction])-3599 b Fg(int32_t)54 b(shishi_tkt_keytype_fa)q(st)e Ff(\()p Fi(Shishi)p 2097 5096 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 5206 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 5340 y(Extract)e(encryption)g(t)m(yp) s(e)f(of)h(k)m(ey)g(in)f(tic)m(k)m(et)j(\(really)e(EncKDCRepP)m(art\).) p eop end %%Page: 112 118 TeXDict begin 112 117 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(112)390 299 y Fk(Return)31 b(v)-5 b(alue:)44 b Fw(Returns)30 b(encryption)i(t)m(yp)s(e)f(of)h (session)g(k)m(ey)g(in)f(tic)m(k)m(et)k(\(really)d(EncKDCRep-)390 408 y(P)m(art\),)g(or)e(-1)h(on)f(error.)150 618 y Fl(shishi)p 459 618 37 5 v 55 w(tkt)p 675 618 V 54 w(k)m(eyt)m(yp)s(e)p 1149 618 V 52 w(p)3350 825 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tkt_keytype_p)f Ff(\()p Fi(Shishi)p 1731 825 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(in)m(t32)p 2405 825 V 42 w(t)f Fe(etype)p Ff(\))390 934 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 1079 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e,)f(see)h(Shishi)p 1749 1079 V 39 w(et)m(yp)s(e.)390 1224 y(Determine)38 b(if)g(k)m(ey)g(in)f(tic)m(k)m(et)j(\(really)f (EncKDCRepP)m(art\))e(is)h(of)f(sp)s(eci\014ed)g(k)m(ey)h(t)m(yp)s(e)g (\(really)390 1333 y(encryption)30 b(t)m(yp)s(e\).)390 1478 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(k) m(ey)g(in)f(tic)m(k)m(et)j(is)d(of)h(sp)s(eci\014ed)f(encryption)g(t)m (yp)s(e.)150 1687 y Fl(shishi)p 459 1687 37 5 v 55 w(tkt)p 675 1687 V 54 w(lastreqc)3350 1894 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_tkt_lastreqc)d Ff(\()p Fi(Shishi)p 1835 1894 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(Shishi)p 2551 1894 V 39 w(lrt)m(yp)s(e)e Fe(lrtype)p Ff(\))390 2004 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2149 y Fi(lrt)m(yp)s(e)5 b Fw(:)36 b(lastreq)21 b(t)m(yp)s(e)f(to)h(extract,)j(see)d(Shishi)p 1982 2149 V 39 w(lrt)m(yp)s(e.)38 b(E.g.,)23 b(SHISHI)p 2828 2149 V 39 w(LR)-8 b(TYPE)p 3241 2149 V 40 w(LAST)p 3523 2149 V 39 w(REQUEST.)390 2293 y(Extract)31 b(C)f(time)h(corresp)s (onding)f(to)h(giv)m(en)g(lastreq)g(t)m(yp)s(e)g(\014eld)f(in)g(the)h (tic)m(k)m(et.)390 2438 y Fk(Return)c(v)-5 b(alue:)40 b Fw(Returns)26 b(C)h(time)h(in)m(terpretation)g(of)g(the)f(sp)s (eci\014ed)g(lastreq)h(\014eld,)g(or)f(\(time)p 3644 2438 V 41 w(t\))390 2548 y(-1.)150 2757 y Fl(shishi)p 459 2757 37 5 v 55 w(tkt)p 675 2757 V 54 w(authctime)3350 2964 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_tkt_authctime) e Ff(\()p Fi(Shishi)p 1888 2964 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 3074 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3218 y(Extract)i(C)f(time)i(corresp)s(onding)d(to)i(the)g(auth)m(time)g (\014eld.)53 b(The)34 b(\014eld)g(holds)g(the)h(time)g(when)390 3328 y(the)c(original)g(authen)m(tication)i(to)s(ok)e(place)g(that)g (later)g(resulted)g(in)f(this)g(tic)m(k)m(et.)390 3473 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h(in)m (terpretation)g(of)g(the)g(endtime)f(in)g(tic)m(k)m(et.)150 3682 y Fl(shishi)p 459 3682 37 5 v 55 w(tkt)p 675 3682 V 54 w(startctime)3350 3889 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_tkt_startctime)e Ff(\()p Fi(Shishi)p 1940 3889 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 3998 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4143 y(Extract)g(C)f(time)h(corresp)s (onding)e(to)i(the)f(starttime)i(\014eld.)46 b(The)32 b(\014eld)f(holds)h(the)h(time)f(where)390 4253 y(the)f(tic)m(k)m(et)i (start)d(to)i(b)s(e)d(v)-5 b(alid)31 b(\(t)m(ypically)i(in)d(the)g (past\).)390 4397 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h(in)m(terpretation)g(of)g(the)g(endtime)f(in)g(tic)m(k)m (et.)150 4607 y Fl(shishi)p 459 4607 37 5 v 55 w(tkt)p 675 4607 V 54 w(endctime)3350 4814 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_tkt_endctime)d Ff(\()p Fi(Shishi)p 1835 4814 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 4923 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 5068 y(Extract)j(C)f(time)h(corresp)s (onding)e(to)i(the)g(endtime)f(\014eld.)55 b(The)35 b(\014eld)g(holds)g (the)g(time)h(where)390 5178 y(the)31 b(tic)m(k)m(et)i(stop)d(b)s(eing) g(v)-5 b(alid.)390 5322 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h(in)m(terpretation)g(of)g(the)g(endtime)f (in)g(tic)m(k)m(et.)p eop end %%Page: 113 119 TeXDict begin 113 118 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(113)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tkt)p 675 299 V 54 w(renew)p 1048 299 V 54 w(tillc)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_tkt_renew_tillc)e Ff(\()p Fi(Shishi)p 1992 496 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 605 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 740 y(Extract)g(C)e(time)h(corresp)s (onding)f(to)h(the)g(renew-till)g(\014eld.)44 b(The)31 b(\014eld)g(holds)g(the)h(time)g(where)390 850 y(the)f(tic)m(k)m(et)i (stop)d(b)s(eing)g(v)-5 b(alid)31 b(for)f(renew)m(al.)390 984 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h(in)m (terpretation)g(of)g(the)g(renew-till)g(in)f(tic)m(k)m(et.)150 1183 y Fl(shishi)p 459 1183 37 5 v 55 w(tkt)p 675 1183 V 54 w(v)-7 b(alid)p 983 1183 V 54 w(at)p 1145 1183 V 53 w(time)p 1438 1183 V 54 w(p)3350 1380 y Fw([F)f(unction])-3599 b Fg(int)53 b(shishi_tkt_valid_at_t)q(ime_)q(p)f Ff(\()p Fi(Shishi)p 2045 1380 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(time)p 2697 1380 V 41 w(t)f Fe(now)p Ff(\))390 1490 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 1624 y Fi(no)m(w)8 b Fw(:)41 b(time)31 b(to)g(c)m(hec)m(k)h(for.)390 1759 y(Determine)f(if)g(tic)m(k)m(et)i(is)d(v)-5 b(alid)31 b(at)g(a)g(sp)s(eci\014c)f(p)s(oin)m(t)g(in)g(time.)390 1894 y Fk(Return)36 b(v)-5 b(alue:)53 b Fw(Returns)36 b(non-0)g(i\013)h(tic)m(k)m(et)i(is)d(v)-5 b(alid)37 b(\(not)g(expired)f(and)f(after)i(starttime\))h(at)390 2003 y(sp)s(eci\014ed)30 b(time.)150 2203 y Fl(shishi)p 459 2203 37 5 v 55 w(tkt)p 675 2203 V 54 w(v)-7 b(alid)p 983 2203 V 54 w(no)m(w)p 1252 2203 V 53 w(p)3350 2399 y Fw([F)f(unction])-3599 b Fg(int)53 b(shishi_tkt_valid_now_)q(p)e Ff(\()p Fi(Shishi)p 1835 2399 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Ff(\))390 2509 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 2644 y(Determine)e(if)g(tic)m(k)m(et)i(is)d(v)-5 b(alid)31 b(no)m(w.)390 2778 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(0)g(i\013)h(tic)m(k)m(et)i(is)d(in)m(v)-5 b(alid)31 b(\(expired)g(or)f(not)h(y)m(et)g(v)-5 b(alid\).)150 2978 y Fl(shishi)p 459 2978 37 5 v 55 w(tkt)p 675 2978 V 54 w(expired)p 1126 2978 V 54 w(p)3350 3174 y Fw([F)d(unction])-3599 b Fg(int)53 b(shishi_tkt_expired_p)f Ff(\()p Fi(Shishi)p 1731 3174 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Ff(\))390 3284 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 3419 y(Determine)e(if)g(tic)m(k)m(et) i(has)d(expired)g(\(i.e.,)i(endtime)e(is)h(in)f(the)g(past\).)390 3553 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(0)g(i\013)h(tic)m (k)m(et)i(has)d(expired.)150 3753 y Fl(shishi)p 459 3753 37 5 v 55 w(tkt)p 675 3753 V 54 w(lastreq)p 1090 3753 V 53 w(prett)m(y)p 1475 3753 V 54 w(prin)m(t)3350 3949 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_lastreq_prett)q (y_p)q(rin)q(t)d Ff(\()p Fi(Shishi)p 2358 3949 28 4 v 40 w(tkt)31 b(*)f Fe(tkt)p Fi(,)i(FILE)e(*)565 4059 y Fe(fh)p Ff(\))390 4169 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 4303 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.) 390 4438 y(Prin)m(t)24 b(a)h(h)m(uman)e(readable)i(represen)m(tation)g (of)g(the)f(v)-5 b(arious)25 b(lastreq)g(\014elds)e(in)h(the)h(tic)m(k) m(et)i(\(really)390 4547 y(EncKDCRepP)m(art\).)150 4747 y Fl(shishi)p 459 4747 37 5 v 55 w(tkt)p 675 4747 V 54 w(prett)m(y)p 1061 4747 V 53 w(prin)m(t)3350 4944 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tkt_pretty_print)e Ff(\()p Fi(Shishi)p 1940 4944 28 4 v 39 w(tkt)31 b(*)g Fe(tkt)p Fi(,)g(FILE)g(*)f Fe(fh)p Ff(\))390 5053 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 5188 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 5322 y(Prin)m(t)g(a)h(h)m(uman)f(readable)h(represen)m (tation)g(of)f(a)h(tic)m(k)m(et)i(to)e(\014le)g(handle.)p eop end %%Page: 114 120 TeXDict begin 114 119 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(114)150 299 y Fv(5.7)68 b(AS)44 b(F)-11 b(unctions)150 458 y Fw(The)33 b(Authen)m(tication)i (Service)f(\(AS\))f(is)h(used)e(to)i(get)g(an)g(initial)g(tic)m(k)m(et) i(using)d(e.g.)50 b(y)m(our)33 b(passw)m(ord.)150 568 y(The)d(follo)m(wing)i(illustrates)f(the)g(AS-REQ)f(and)f(AS-REP)h (ASN.1)h(structures.)150 737 y Fq(--)47 b(Request)f(--)150 956 y(AS-REQ)476 b(::=)47 b(KDC-REQ)e({10})150 1176 y(KDC-REQ)h ({INTEGER:tagnum})377 b(::=)47 b([APPLICATION)e(tagnum])g(SEQUENCE)h({) 532 1285 y(pvno)571 b([1])47 b(INTEGER)f(\(5\))h(--)g(first)g(tag)g(is) g([1],)f(not)h([0])g(--,)532 1395 y(msg-type)379 b([2])47 b(INTEGER)f(\(tagnum\),)532 1504 y(padata)475 b([3])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 1614 y(req-body)379 b([4])47 b(KDC-REQ-BODY)150 1724 y(})150 1943 y(KDC-REQ-BODY)188 b(::=)47 b(SEQUENCE)e({)532 2052 y(kdc-options)617 b([0])47 b(KDCOptions,)532 2162 y(cname)905 b([1])47 b(PrincipalName)d(OPTIONAL) 1868 2271 y(--)j(Used)g(only)g(in)g(AS-REQ)f(--,)532 2381 y(realm)905 b([2])47 b(Realm)1868 2491 y(--)g(Server's)f(realm) 1868 2600 y(--)h(Also)g(client's)f(in)h(AS-REQ)f(--,)532 2710 y(sname)905 b([3])47 b(PrincipalName)d(OPTIONAL,)532 2819 y(from)953 b([4])47 b(KerberosTime)e(OPTIONAL,)532 2929 y(till)953 b([5])47 b(KerberosTime,)532 3039 y(rtime)905 b([6])47 b(KerberosTime)e(OPTIONAL,)532 3148 y(nonce)905 b([7])47 b(UInt32,)532 3258 y(etype)905 b([8])47 b(SEQUENCE)f(OF)h (Int32)f(--)h(EncryptionType)1868 3367 y(--)g(in)h(preference)d(order)h (--,)532 3477 y(addresses)713 b([9])47 b(HostAddresses)d(OPTIONAL,)532 3587 y(enc-authorization-data)89 b([10])47 b(EncryptedData)d({)2059 3696 y(AuthorizationData,)2059 3806 y({)k(keyuse-TGSReqAuthData-s)o (ess)o(key)2155 3915 y(|)f(keyuse-TGSReqAuthData-su)o(bkey)41 b(})1916 4025 y(})47 b(OPTIONAL,)532 4134 y(additional-tickets)281 b([11])47 b(SEQUENCE)e(OF)j(Ticket)e(OPTIONAL)150 4244 y(})150 4463 y(--)h(Reply)g(--)150 4682 y(AS-REP)476 b(::=)47 b(KDC-REP)e({11,)i(EncASRepPart,)d({keyuse-EncASRepPart}})150 4902 y(KDC-REP)i({INTEGER:tagnum,)580 5011 y(TypeToEncrypt,)580 5121 y(UInt32:KeyUsages})281 b(::=)47 b([APPLICATION)e(tagnum])g (SEQUENCE)h({)532 5230 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 5340 y(msg-type)379 b([1])47 b(INTEGER)f(\(tagnum\),)p eop end %%Page: 115 121 TeXDict begin 115 120 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(115)532 299 y Fq(padata)475 b([2])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 408 y(crealm)475 b([3])47 b(Realm,)532 518 y(cname)523 b([4])47 b(PrincipalName,)532 628 y(ticket)475 b([5])47 b(Ticket,)532 737 y(enc-part)379 b([6])47 b(EncryptedData)e({TypeToEncrypt,)e (KeyUsages})150 847 y(})150 1066 y(EncASRepPart)188 b(::=)47 b([APPLICATION)d(25])j(EncKDCRepPart)150 1285 y(EncKDCRepPart)140 b(::=)47 b(SEQUENCE)e({)532 1395 y(key)619 b([0])47 b(EncryptionKey,) 532 1504 y(last-req)379 b([1])47 b(LastReq,)532 1614 y(nonce)523 b([2])47 b(UInt32,)532 1724 y(key-expiration)91 b([3])47 b(KerberosTime)e(OPTIONAL,)532 1833 y(flags)523 b([4])47 b(TicketFlags,)532 1943 y(authtime)379 b([5])47 b(KerberosTime,)532 2052 y(starttime)331 b([6])47 b(KerberosTime)e (OPTIONAL,)532 2162 y(endtime)427 b([7])47 b(KerberosTime,)532 2271 y(renew-till)283 b([8])47 b(KerberosTime)e(OPTIONAL,)532 2381 y(srealm)475 b([9])47 b(Realm,)532 2491 y(sname)523 b([10])47 b(PrincipalName,)532 2600 y(caddr)523 b([11])47 b(HostAddresses)d(OPTIONAL)150 2710 y(})150 2915 y Fl(shishi)p 459 2915 37 5 v 55 w(as)3350 3117 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 1869 3117 28 4 v 39 w(as)f(**)g Fe(as)p Ff(\))390 3227 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3367 y Fi(as)t Fw(:)41 b(holds)30 b(p)s(oin)m(ter)g(to)h (newly)f(allo)s(cate)j(Shishi)p 2044 3367 V 39 w(as)e(structure.)390 3508 y(Allo)s(cate)i(a)d(new)g(AS)g(exc)m(hange)i(v)-5 b(ariable.)390 3648 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3648 V 39 w(OK)f(i\013)i(successful.) 150 3853 y Fl(shishi)p 459 3853 37 5 v 55 w(as)p 622 3853 V 54 w(done)3350 4055 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_as_done)49 b Ff(\()p Fi(Shishi)p 1469 4055 28 4 v 39 w(as)31 b(*)g Fe(as)p Ff(\))390 4165 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s (out)f(AS)g(exc)m(hange)390 4305 y(Deallo)s(cate)48 b(resources)c(asso) s(ciated)i(with)e(AS)g(exc)m(hange.)84 b(This)43 b(should)g(b)s(e)h (called)i(b)m(y)e(the)390 4415 y(application)32 b(when)d(it)i(no)f (longer)h(need)f(to)h(utilize)h(the)f(AS)f(exc)m(hange)i(handle.)150 4620 y Fl(shishi)p 459 4620 37 5 v 55 w(as)p 622 4620 V 54 w(req)3350 4823 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_as_req)49 b Ff(\()p Fi(Shishi)p 1783 4823 28 4 v 39 w(as)31 b(*)g Fe(as)p Ff(\))390 4932 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g (exc)m(hange)390 5072 y(Get)h(ASN.1)g(AS-REQ)f(structure)g(from)g(AS)g (exc)m(hange.)390 5213 y Fk(Return)21 b(v)-5 b(alue:)36 b Fw(Returns)20 b(the)i(generated)g(AS-REQ)e(pac)m(k)m(et)j(from)e(the) g(AS)g(exc)m(hange,)k(or)c(NULL)390 5322 y(if)30 b(not)h(y)m(et)g(set)g (or)g(an)f(error)g(o)s(ccured.)p eop end %%Page: 116 122 TeXDict begin 116 121 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(116)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(as)p 622 299 V 54 w(req)p 847 299 V 54 w(build)3350 512 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_req_build)e Ff(\()p Fi(Shishi)p 1678 512 28 4 v 40 w(as)30 b(*)h Fe(as)p Ff(\))390 621 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g (exc)m(hange)390 772 y(P)m(ossibly)h(remo)m(v)m(e)h(unset)e(\014elds)f (\(e.g.,)k(rtime\).)390 923 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 923 V 39 w(OK)f(i\013)i(successful.)150 1138 y Fl(shishi)p 459 1138 37 5 v 55 w(as)p 622 1138 V 54 w(req)p 847 1138 V 54 w(set)3350 1351 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_as_req_set)c Ff(\()p Fi(Shishi)p 1626 1351 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(Shishi)p 2252 1351 V 39 w(asn1)f Fe(asreq)p Ff(\))390 1461 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i (ab)s(out)f(AS)g(exc)m(hange)390 1612 y Fi(asreq)r Fw(:)41 b(asreq)31 b(to)g(store)g(in)f(AS.)390 1762 y(Set)h(the)f(AS-REQ)g(in)g (the)h(AS)f(exc)m(hange.)150 1978 y Fl(shishi)p 459 1978 37 5 v 55 w(as)p 622 1978 V 54 w(req)p 847 1978 V 54 w(der)3350 2191 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_req_der)e Ff(\()p Fi(Shishi)p 1574 2191 28 4 v 39 w(as)31 b(*)f Fe(as)p Fi(,)i(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 2635 2191 V 41 w(t)g(*)f Fe(outlen)p Ff(\))390 2301 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i (ab)s(out)f(AS)g(exc)m(hange)390 2451 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(AS-REQ.)390 2602 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s(ding)f(of)h(AS-REQ.)390 2753 y(DER)j(enco)s(de)g(AS-REQ.)g Fq(out)e Fw(is)i(allo)s(cated)i(b)m (y)e(this)g(function,)g(and)g(it)g(is)g(the)g(resp)s(onsibilit)m(y)390 2862 y(of)d(caller)g(to)g(deallo)s(cate)i(it.)390 3013 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3013 V 39 w(OK)f(i\013)i(successful.)150 3229 y Fl(shishi)p 459 3229 37 5 v 55 w(as)p 622 3229 V 54 w(req)p 847 3229 V 54 w(der)p 1075 3229 V 55 w(set)3350 3442 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_req_der_set)f Ff(\()p Fi(Shishi)p 1783 3442 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 2799 3442 V 41 w(t)565 3551 y Fe(derlen)p Ff(\))390 3661 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out) f(AS)g(exc)m(hange)390 3811 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REQ.)390 3962 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(DER) h(enco)s(ded)f(AP-REQ.)390 4113 y(DER)h(deco)s(de)h(AS-REQ)e(and)h(set) h(it)g(AS)f(exc)m(hange.)44 b(If)31 b(deco)s(ding)g(fails,)i(the)e (AS-REQ)g(in)g(the)390 4222 y(AS)f(exc)m(hange)i(remains.)390 4373 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4373 V 39 w(OK.)150 4589 y Fl(shishi)p 459 4589 37 5 v 55 w(as)p 622 4589 V 54 w(rep)3350 4802 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_as_rep)49 b Ff(\()p Fi(Shishi)p 1783 4802 28 4 v 39 w(as)31 b(*)g Fe(as)p Ff(\))390 4911 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g(exc)m(hange)390 5062 y(Get)h(ASN.1)g(AS-REP)f(structure)g(from)g(AS)g(exc)m(hange.)390 5213 y Fk(Return)e(v)-5 b(alue:)39 b Fw(Returns)27 b(the)h(receiv)m(ed) h(AS-REP)e(pac)m(k)m(et)j(from)d(the)h(AS)f(exc)m(hange,)j(or)e(NULL) 390 5322 y(if)i(not)h(y)m(et)g(set)g(or)g(an)f(error)g(o)s(ccured.)p eop end %%Page: 117 123 TeXDict begin 117 122 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(117)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(as)p 622 299 V 54 w(rep)p 850 299 V 55 w(pro)s(cess)3350 489 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_rep_process)f Ff(\()p Fi(Shishi)p 1783 489 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(Shishi)p 2409 489 V 39 w(k)m(ey)g(*)g Fe(key)p Fi(,)g(const)565 598 y(c)m(har)g(*)g Fe(password)p Ff(\))390 708 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g (exc)m(hange)390 839 y Fi(k)m(ey)8 b Fw(:)41 b(user's)30 b(k)m(ey)-8 b(,)32 b(used)d(to)j(encrypt)e(the)g(encrypted)g(part)g(of) h(the)f(AS-REP)-8 b(.)390 970 y Fi(passw)m(ord)t Fw(:)40 b(user's)29 b(passw)m(ord,)h(used)g(if)g(k)m(ey)h(is)g(NULL.)390 1101 y(Pro)s(cess)c(new)f(AS-REP)g(and)g(set)i(tic)m(k)m(et.)42 b(The)26 b(k)m(ey)h(is)g(used)f(to)i(decrypt)e(the)h(AP-REP)-8 b(.)27 b(If)g(b)s(oth)390 1210 y(k)m(ey)k(and)f(passw)m(ord)g(is)g (NULL,)h(the)f(user)g(is)g(queried)g(for)g(it.)390 1341 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1341 V 39 w(OK)f(i\013)i(successful.)150 1534 y Fl(shishi)p 459 1534 37 5 v 55 w(as)p 622 1534 V 54 w(rep)p 850 1534 V 55 w(build)3350 1724 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_rep_build)e Ff(\()p Fi(Shishi)p 1678 1724 28 4 v 40 w(as)30 b(*)h Fe(as)p Fi(,)g(Shishi)p 2304 1724 V 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 1833 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s (out)f(AS)g(exc)m(hange)390 1964 y Fi(k)m(ey)8 b Fw(:)41 b(user's)30 b(k)m(ey)-8 b(,)32 b(used)d(to)j(encrypt)e(the)g(encrypted) g(part)g(of)h(the)f(AS-REP)-8 b(.)390 2095 y(Build)30 b(AS-REP)-8 b(.)390 2226 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2226 V 39 w(OK)f(i\013)i(successful.) 150 2418 y Fl(shishi)p 459 2418 37 5 v 55 w(as)p 622 2418 V 54 w(rep)p 850 2418 V 55 w(der)3350 2608 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_rep_der)e Ff(\()p Fi(Shishi)p 1574 2608 28 4 v 39 w(as)31 b(*)f Fe(as)p Fi(,)i(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 2635 2608 V 41 w(t)g(*)f Fe(outlen)p Ff(\))390 2718 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g(exc)m (hange)390 2849 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f (newly)g(allo)s(cated)i(DER)f(enco)s(ding)f(of)h(AS-REP)-8 b(.)390 2980 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m (y)h(with)f(DER)h(enco)s(ding)f(of)h(AS-REP)-8 b(.)390 3111 y(DER)28 b(enco)s(de)f(AS-REP)-8 b(.)28 b Fq(out)e Fw(is)i(allo)s(cated)h(b)m(y)e(this)h(function,)g(and)e(it)i(is)g(the)f (resp)s(onsibilit)m(y)h(of)390 3220 y(caller)k(to)f(deallo)s(cate)i (it.)390 3351 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3351 V 39 w(OK)f(i\013)i(successful.)150 3544 y Fl(shishi)p 459 3544 37 5 v 55 w(as)p 622 3544 V 54 w(rep)p 850 3544 V 55 w(set)3350 3733 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_as_rep_set)c Ff(\()p Fi(Shishi)p 1626 3733 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(Shishi)p 2252 3733 V 39 w(asn1)f Fe(asrep)p Ff(\))390 3843 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i (ab)s(out)f(AS)g(exc)m(hange)390 3974 y Fi(asrep)s Fw(:)40 b(asrep)30 b(to)h(store)g(in)g(AS.)390 4105 y(Set)g(the)f(AS-REP)g(in)g (the)h(AS)f(exc)m(hange.)150 4297 y Fl(shishi)p 459 4297 37 5 v 55 w(as)p 622 4297 V 54 w(rep)p 850 4297 V 55 w(der)p 1079 4297 V 54 w(set)3350 4487 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_rep_der_set)f Ff(\()p Fi(Shishi)p 1783 4487 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 2799 4487 V 41 w(t)565 4597 y Fe(derlen)p Ff(\))390 4706 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g(exc)m(hange)390 4837 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s (ded)f(AP-REP)-8 b(.)390 4968 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REP)-8 b(.)390 5099 y(DER)32 b(deco)s(de)h(AS-REP)f(and)g(set)h(it)f(AS)g(exc) m(hange.)48 b(If)32 b(deco)s(ding)h(fails,)g(the)g(AS-REP)f(in)g(the) 390 5209 y(AS)e(exc)m(hange)i(remains.)390 5340 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK.)p eop end %%Page: 118 124 TeXDict begin 118 123 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(118)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(as)p 622 299 V 54 w(krb)s(error)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_as_krberror)51 b Ff(\()p Fi(Shishi)p 2045 498 28 4 v 39 w(as)30 b(*)h Fe(as)p Ff(\))390 607 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g (exc)m(hange)390 744 y(Get)h(ASN.1)g(KRB-ERR)m(OR)g(structure)f(from)g (AS)f(exc)m(hange.)390 880 y Fk(Return)j(v)-5 b(alue:)46 b Fw(Returns)31 b(the)i(receiv)m(ed)h(KRB-ERR)m(OR)f(pac)m(k)m(et)h (from)e(the)h(AS)f(exc)m(hange,)j(or)390 990 y(NULL)30 b(if)h(not)f(y)m(et)i(set)f(or)f(an)g(error)g(o)s(ccured.)150 1191 y Fl(shishi)p 459 1191 37 5 v 55 w(as)p 622 1191 V 54 w(krb)s(error)p 1129 1191 V 56 w(der)3350 1390 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_krberror_de)q(r)e Ff(\()p Fi(Shishi)p 1835 1390 28 4 v 40 w(as)30 b(*)h Fe(as)p Fi(,)g(c)m(har)g(**)g Fe(out)p Fi(,)h(size)p 2897 1390 V 40 w(t)f(*)565 1499 y Fe(outlen)p Ff(\))390 1609 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i (ab)s(out)f(AS)g(exc)m(hange)390 1745 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(KRB-ERR)m(OR.)390 1882 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s(ding)f(of)h (KRB-ERR)m(OR.)390 2018 y(DER)g(enco)s(de)g(KRB-ERR)m(OR.)h Fq(out)e Fw(is)h(allo)s(cated)i(b)m(y)e(this)f(function,)i(and)e(it)i (is)f(the)g(resp)s(onsi-)390 2128 y(bilit)m(y)g(of)g(caller)h(to)f (deallo)s(cate)h(it.)390 2264 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2264 V 39 w(OK)f(i\013)i(successful.) 150 2465 y Fl(shishi)p 459 2465 37 5 v 55 w(as)p 622 2465 V 54 w(krb)s(error)p 1129 2465 V 56 w(set)3350 2664 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_as_krberror_set)e Ff(\()p Fi(Shishi)p 1888 2664 28 4 v 39 w(as)29 b(*)f Fe(as)p Fi(,)i(Shishi)p 2508 2664 V 39 w(asn1)f Fe(krberror)p Ff(\))390 2774 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e (information)i(ab)s(out)f(AS)g(exc)m(hange)390 2910 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(to)i(store)g(in)f(AS.)390 3047 y(Set)h(the)f(KRB-ERR)m(OR)h(in)f(the)g(AS)g(exc)m(hange.)150 3248 y Fl(shishi)p 459 3248 37 5 v 55 w(as)p 622 3248 V 54 w(tkt)3350 3446 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_as_tkt)c Ff(\()p Fi(Shishi)p 1835 3446 28 4 v 40 w(as)30 b(*)h Fe(as)p Ff(\))390 3556 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g (exc)m(hange)390 3692 y(Get)h(Tic)m(k)m(et)i(in)d(AS)g(exc)m(hange.)390 3829 y Fk(Return)d(v)-5 b(alue:)39 b Fw(Returns)26 b(the)h(newly)f (acquired)h(tkt)h(from)e(the)h(AS)g(exc)m(hange,)i(or)e(NULL)g(if)g (not)390 3938 y(y)m(et)32 b(set)e(or)h(an)f(error)g(o)s(ccured.)150 4140 y Fl(shishi)p 459 4140 37 5 v 55 w(as)p 622 4140 V 54 w(tkt)p 837 4140 V 54 w(set)3350 4338 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_as_tkt_set)c Ff(\()p Fi(Shishi)p 1626 4338 28 4 v 39 w(as)31 b(*)g Fe(as)p Fi(,)g(Shishi)p 2252 4338 V 39 w(tkt)g(*)g Fe(tkt)p Ff(\))390 4448 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i (ab)s(out)f(AS)g(exc)m(hange)390 4584 y Fi(tkt)r Fw(:)41 b(tkt)31 b(to)g(store)g(in)f(AS.)390 4721 y(Set)h(the)f(Tkt)g(in)g(the) h(AS)f(exc)m(hange.)150 4922 y Fl(shishi)p 459 4922 37 5 v 55 w(as)p 622 4922 V 54 w(sendrecv)p 1142 4922 V 55 w(hin)m(t)3350 5121 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_sendrecv_hi)q(nt)f Ff(\()p Fi(Shishi)p 1888 5121 28 4 v 39 w(as)30 b(*)h Fe(as)p Fi(,)g(Shishi)p 2513 5121 V 39 w(tkts)p 2706 5121 V 41 w(hin)m(t)f(*)565 5230 y Fe(hint)p Ff(\))390 5340 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g(exc)m(hange)p eop end %%Page: 119 125 TeXDict begin 119 124 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(119)390 299 y Fi(hin)m(t)r Fw(:)41 b(additional)31 b(parameters)g(that)g(mo)s(dify)e(connection)j (b)s(eha)m(viour,)e(or)g Fq(NULL)p Fw(.)390 430 y(Send)h(AS-REQ)g(and)h (receiv)m(e)i(AS-REP)e(or)g(KRB-ERR)m(OR.)g(This)f(is)h(the)h(initial)g (authen)m(tica-)390 540 y(tion,)38 b(usually)e(used)f(to)i(acquire)f(a) g(Tic)m(k)m(et)i(Gran)m(ting)f(Tic)m(k)m(et.)60 b(The)35 b Fq(hint)g Fw(structure)g(can)i(b)s(e)390 649 y(used)30 b(to)h(set,)g(e.g.,)h(parameters)e(for)h(TLS)e(authen)m(tication.)390 781 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 781 28 4 v 39 w(OK)f(i\013)i(successful.)150 973 y Fl(shishi)p 459 973 37 5 v 55 w(as)p 622 973 V 54 w(sendrecv)3350 1164 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_sendrecv)e Ff(\()p Fi(Shishi)p 1626 1164 28 4 v 39 w(as)31 b(*)g Fe(as)p Ff(\))390 1273 y Fi(as)t Fw(:)41 b(structure)30 b(that)h(holds)e(information)i(ab)s(out)f(AS)g(exc)m(hange)390 1404 y(Send)h(AS-REQ)g(and)h(receiv)m(e)i(AS-REP)e(or)g(KRB-ERR)m(OR.)g (This)f(is)h(the)h(initial)g(authen)m(tica-)390 1514 y(tion,)e(usually)f(used)g(to)h(acquire)g(a)g(Tic)m(k)m(et)h(Gran)m (ting)f(Tic)m(k)m(et.)390 1645 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1645 V 39 w(OK)f(i\013)i(successful.) 150 1871 y Fv(5.8)68 b(TGS)44 b(F)-11 b(unctions)150 2031 y Fw(The)41 b(Tic)m(k)m(et)j(Gran)m(ting)e(Service)h(\(TGS\))e(is) h(used)f(to)h(get)h(subsequen)m(t)e(tic)m(k)m(ets,)47 b(authen)m(ticated)d(b)m(y)150 2140 y(other)27 b(tic)m(k)m(ets)j(\(so)d (called)i(tic)m(k)m(et)g(gran)m(ting)f(tic)m(k)m(ets\).)43 b(The)26 b(follo)m(wing)j(illustrates)f(the)f(TGS-REQ)g(and)150 2250 y(TGS-REP)j(ASN.1)h(structures.)150 2381 y Fq(--)47 b(Request)f(--)150 2600 y(TGS-REQ)428 b(::=)47 b(KDC-REQ)e({12})150 2819 y(KDC-REQ)h({INTEGER:tagnum})377 b(::=)47 b([APPLICATION)e (tagnum])g(SEQUENCE)h({)532 2929 y(pvno)571 b([1])47 b(INTEGER)f(\(5\))h(--)g(first)g(tag)g(is)g([1],)f(not)h([0])g(--,)532 3039 y(msg-type)379 b([2])47 b(INTEGER)f(\(tagnum\),)532 3148 y(padata)475 b([3])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 3258 y(req-body)379 b([4])47 b(KDC-REQ-BODY)150 3367 y(})150 3587 y(KDC-REQ-BODY)188 b(::=)47 b(SEQUENCE)e({)532 3696 y(kdc-options)617 b([0])47 b(KDCOptions,)532 3806 y(cname)905 b([1])47 b(PrincipalName)d(OPTIONAL)1868 3915 y(--)j(Used)g(only)g(in)g(AS-REQ)f(--,)532 4025 y(realm)905 b([2])47 b(Realm)1868 4134 y(--)g(Server's)f(realm)1868 4244 y(--)h(Also)g(client's)f(in)h(AS-REQ)f(--,)532 4354 y(sname)905 b([3])47 b(PrincipalName)d(OPTIONAL,)532 4463 y(from)953 b([4])47 b(KerberosTime)e(OPTIONAL,)532 4573 y(till)953 b([5])47 b(KerberosTime,)532 4682 y(rtime)905 b([6])47 b(KerberosTime)e(OPTIONAL,)532 4792 y(nonce)905 b([7])47 b(UInt32,)532 4902 y(etype)905 b([8])47 b(SEQUENCE)f(OF)h (Int32)f(--)h(EncryptionType)1868 5011 y(--)g(in)h(preference)d(order)h (--,)532 5121 y(addresses)713 b([9])47 b(HostAddresses)d(OPTIONAL,)532 5230 y(enc-authorization-data)89 b([10])47 b(EncryptedData)d({)2059 5340 y(AuthorizationData,)p eop end %%Page: 120 126 TeXDict begin 120 125 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(120)2059 299 y Fq({)48 b(keyuse-TGSReqAuthData-s)o(ess)o(key)2155 408 y(|)f (keyuse-TGSReqAuthData-su)o(bkey)41 b(})1916 518 y(})47 b(OPTIONAL,)532 628 y(additional-tickets)281 b([11])47 b(SEQUENCE)e(OF)j(Ticket)e(OPTIONAL)150 737 y(})150 956 y(--)h(Reply)g(--)150 1176 y(TGS-REP)428 b(::=)47 b(KDC-REP)e({13,)i (EncTGSRepPart,)1295 1285 y({)h(keyuse-EncTGSRepPart-ses)o(skey)1391 1395 y(|)f(keyuse-EncTGSRepPart-subke)o(y)42 b(}})150 1614 y(KDC-REP)k({INTEGER:tagnum,)580 1724 y(TypeToEncrypt,)580 1833 y(UInt32:KeyUsages})281 b(::=)47 b([APPLICATION)e(tagnum])g (SEQUENCE)h({)532 1943 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 2052 y(msg-type)379 b([1])47 b(INTEGER)f(\(tagnum\),)532 2162 y(padata)475 b([2])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 2271 y(crealm)475 b([3])47 b(Realm,)532 2381 y(cname)523 b([4])47 b(PrincipalName,)532 2491 y(ticket)475 b([5])47 b(Ticket,)532 2600 y(enc-part)379 b([6])47 b(EncryptedData)e ({TypeToEncrypt,)e(KeyUsages})150 2710 y(})150 2929 y(EncTGSRepPart)140 b(::=)47 b([APPLICATION)d(26])j(EncKDCRepPart)150 3148 y(EncKDCRepPart)140 b(::=)47 b(SEQUENCE)e({)532 3258 y(key)619 b([0])47 b(EncryptionKey,)532 3367 y(last-req)379 b([1])47 b(LastReq,)532 3477 y(nonce)523 b([2])47 b(UInt32,)532 3587 y(key-expiration)91 b([3])47 b(KerberosTime)e(OPTIONAL,)532 3696 y(flags)523 b([4])47 b(TicketFlags,)532 3806 y(authtime)379 b([5])47 b(KerberosTime,)532 3915 y(starttime)331 b([6])47 b(KerberosTime)e(OPTIONAL,)532 4025 y(endtime)427 b([7])47 b(KerberosTime,)532 4134 y(renew-till)283 b([8])47 b(KerberosTime)e (OPTIONAL,)532 4244 y(srealm)475 b([9])47 b(Realm,)532 4354 y(sname)523 b([10])47 b(PrincipalName,)532 4463 y(caddr)523 b([11])47 b(HostAddresses)d(OPTIONAL)150 4573 y(})150 4770 y Fl(shishi)p 459 4770 37 5 v 55 w(tgs)3350 4964 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 1921 4964 28 4 v 39 w(tgs)f(**)g Fe(tgs)p Ff(\))390 5073 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5207 y Fi(tgs)t Fw(:)41 b(holds)30 b(p)s(oin)m(ter)g(to)h(newly)g(allo)s(cate)h(Shishi)p 2079 5207 V 39 w(tgs)f(structure.)390 5340 y(Allo)s(cate)i(a)d(new)g (TGS)g(exc)m(hange)i(v)-5 b(ariable.)p eop end %%Page: 121 127 TeXDict begin 121 126 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(121)390 299 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 299 28 4 v 39 w(OK)f(i\013)i(successful.)150 501 y Fl(shishi)p 459 501 37 5 v 55 w(tgs)p 671 501 V 55 w(done)3350 701 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tgs_done)c Ff(\()p Fi(Shishi)p 1522 701 28 4 v 39 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 811 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(AS)f(exc)m(hange)390 948 y(Deallo)s(cate)42 b(resources)d(asso)s(ciated)i(with)e(TGS)f(exc)m (hange.)68 b(This)38 b(should)g(b)s(e)h(called)h(b)m(y)f(the)390 1058 y(application)32 b(when)d(it)i(no)f(longer)h(need)f(to)h(utilize)h (the)f(TGS)f(exc)m(hange)h(handle.)150 1260 y Fl(shishi)p 459 1260 37 5 v 55 w(tgs)p 671 1260 V 55 w(tgtkt)3350 1460 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e (shishi_tgs_tgtkt)d Ff(\()p Fi(Shishi)p 1992 1460 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Ff(\))390 1570 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e (exc)m(hange)390 1707 y(Get)i(Tic)m(k)m(et-gran)m(ting-tic)m(k)m(et)37 b(from)30 b(TGS)g(exc)m(hange.)390 1845 y Fk(Return)25 b(v)-5 b(alue:)38 b Fw(Returns)24 b(the)h(tic)m(k)m(et-gran)m(ting-tic) m(k)n(et)31 b(used)25 b(in)f(the)i(TGS)e(exc)m(hange,)k(or)d(NULL)390 1955 y(if)30 b(not)h(y)m(et)g(set)g(or)g(an)f(error)g(o)s(ccured.)150 2157 y Fl(shishi)p 459 2157 37 5 v 55 w(tgs)p 671 2157 V 55 w(tgtkt)p 996 2157 V 53 w(set)3350 2357 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tgs_tgtkt_set)d Ff(\()p Fi(Shishi)p 1783 2357 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(Shishi)p 2496 2357 V 39 w(tkt)g(*)g Fe(tgtkt)p Ff(\))390 2467 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f (information)g(ab)s(out)h(TGS)e(exc)m(hange)390 2604 y Fi(tgtkt)r Fw(:)42 b(tic)m(k)m(et)33 b(gran)m(ting)e(tic)m(k)m(et)i (to)f(store)f(in)f(TGS.)390 2742 y(Set)h(the)f(Tic)m(k)m(et)i(in)e(the) h(TGS)f(exc)m(hange.)150 2944 y Fl(shishi)p 459 2944 37 5 v 55 w(tgs)p 671 2944 V 55 w(ap)3350 3144 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_ap)55 b(*)e(shishi_tgs_ap)c Ff(\()p Fi(Shishi)p 1783 3144 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Ff(\))390 3254 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 3391 y(Get)i(the)g(AP)f(from)g(TGS)g(exc)m(hange.)390 3529 y Fk(Return)24 b(v)-5 b(alue:)38 b Fw(Returns)23 b(the)h(AP)g(exc)m(hange)i(\(part)f(of)f(TGS-REQ\))g(from)f(the)i(TGS)e (exc)m(hange,)390 3638 y(or)30 b(NULL)h(if)f(not)h(y)m(et)g(set)g(or)f (an)h(error)f(o)s(ccured.)150 3841 y Fl(shishi)p 459 3841 37 5 v 55 w(tgs)p 671 3841 V 55 w(req)3350 4041 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tgs_req)49 b Ff(\()p Fi(Shishi)p 1835 4041 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 4150 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 4288 y(Get)i(the)g(TGS-REQ)f(from)f(TGS)h(exc)m(hange.)390 4426 y Fk(Return)k(v)-5 b(alue:)48 b Fw(Returns)33 b(the)h(generated)h (TGS-REQ)e(from)g(the)h(TGS)g(exc)m(hange,)i(or)e(NULL)390 4535 y(if)c(not)h(y)m(et)g(set)g(or)g(an)f(error)g(o)s(ccured.)150 4738 y Fl(shishi)p 459 4738 37 5 v 55 w(tgs)p 671 4738 V 55 w(req)p 897 4738 V 54 w(set)3350 4937 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tgs_req_set)c Ff(\()p Fi(Shishi)p 1678 4937 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Fi(,)i(Shishi)p 2392 4937 V 39 w(asn1)e Fe(tgsreq)p Ff(\))390 5047 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f (information)g(ab)s(out)h(TGS)e(exc)m(hange)390 5185 y Fi(tgsreq)r Fw(:)41 b(tgsreq)31 b(to)g(store)g(in)g(TGS.)390 5322 y(Set)g(the)f(TGS-REQ)g(in)g(the)g(TGS)g(exc)m(hange.)p eop end %%Page: 122 128 TeXDict begin 122 127 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(122)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tgs)p 671 299 V 55 w(req)p 897 299 V 54 w(der)3350 502 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_req_der)e Ff(\()p Fi(Shishi)p 1626 502 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)h(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 2775 502 V 41 w(t)g(*)565 612 y Fe(outlen)p Ff(\))390 722 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 863 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s (cated)i(DER)f(enco)s(ding)f(of)h(TGS-REQ.)390 1004 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h (enco)s(ding)f(of)h(TGS-REQ.)390 1145 y(DER)e(enco)s(de)f(TGS-REQ.)h Fq(out)e Fw(is)i(allo)s(cated)i(b)m(y)d(this)g(function,)h(and)f(it)i (is)e(the)h(resp)s(onsibilit)m(y)390 1255 y(of)i(caller)g(to)g(deallo)s (cate)i(it.)390 1396 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1396 V 39 w(OK)f(i\013)i(successful.)150 1602 y Fl(shishi)p 459 1602 37 5 v 55 w(tgs)p 671 1602 V 55 w(req)p 897 1602 V 54 w(der)p 1125 1602 V 54 w(set)3350 1805 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_req_der_se)q (t)e Ff(\()p Fi(Shishi)p 1835 1805 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Fi(,)i(c)m(har)f(*)f Fe(der)p Fi(,)i(size)p 2939 1805 V 41 w(t)565 1915 y Fe(derlen)p Ff(\))390 2025 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s (out)h(TGS)e(exc)m(hange)390 2166 y Fi(der)7 b Fw(:)40 b(input)29 b(arra)m(y)i(with)f(DER)h(enco)s(ded)f(AP-REQ.)390 2307 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f (DER)h(enco)s(ded)f(AP-REQ.)390 2448 y(DER)e(deco)s(de)f(TGS-REQ)g(and) g(set)h(it)g(TGS)f(exc)m(hange.)41 b(If)27 b(deco)s(ding)g(fails,)i (the)f(TGS-REQ)e(in)390 2558 y(the)31 b(TGS)e(exc)m(hange)j(remains.) 390 2699 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2699 V 39 w(OK.)150 2905 y Fl(shishi)p 459 2905 37 5 v 55 w(tgs)p 671 2905 V 55 w(req)p 897 2905 V 54 w(pro)s(cess)3350 3108 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_req_proces)q(s)e Ff(\()p Fi(Shishi)p 1835 3108 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 3218 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 3359 y(Pro)s(cess)36 b(new)g(TGS-REQ)f(and)h(set)h(tic)m(k)m(et.)60 b(The)36 b(k)m(ey)h(to)g(decrypt)f(the)g(TGS-REQ)g(is)g(tak)m(en)390 3469 y(from)30 b(the)g(EncKDCReqP)m(art)h(of)g(the)g(TGS)e(tgtic)m(k)m (et.)390 3610 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3610 V 39 w(OK)f(i\013)i(successful.)150 3816 y Fl(shishi)p 459 3816 37 5 v 55 w(tgs)p 671 3816 V 55 w(req)p 897 3816 V 54 w(build)3350 4019 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_req_build)f Ff(\()p Fi(Shishi)p 1731 4019 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Ff(\))390 4129 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 4270 y(Chec)m(ksum)h(data)h(in)f(authen)m(ticator)i(and)e(add)g(tic)m (k)m(et)j(and)d(authen)m(ticator)i(to)f(TGS-REQ.)390 4411 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4411 V 39 w(OK)f(i\013)i(successful.)150 4617 y Fl(shishi)p 459 4617 37 5 v 55 w(tgs)p 671 4617 V 55 w(rep)3350 4821 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tgs_rep)49 b Ff(\()p Fi(Shishi)p 1835 4821 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 4930 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e (exc)m(hange)390 5072 y(Get)i(TGS-REP)f(from)g(TGS)g(exc)m(hange.)390 5213 y Fk(Return)j(v)-5 b(alue:)46 b Fw(Returns)32 b(the)h(receiv)m(ed) h(TGS-REP)f(from)f(the)h(TGS)g(exc)m(hange,)i(or)e(NULL)g(if)390 5322 y(not)e(y)m(et)g(set)g(or)f(an)h(error)f(o)s(ccured.)p eop end %%Page: 123 129 TeXDict begin 123 128 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(123)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tgs)p 671 299 V 55 w(rep)p 900 299 V 54 w(der)3350 483 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_rep_der)e Ff(\()p Fi(Shishi)p 1626 483 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)h(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 2775 483 V 41 w(t)g(*)565 593 y Fe(outlen)p Ff(\))390 703 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 831 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s (cated)i(DER)f(enco)s(ding)f(of)h(TGS-REP)-8 b(.)390 959 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f (DER)h(enco)s(ding)f(of)h(TGS-REP)-8 b(.)390 1088 y(DER)30 b(enco)s(de)g(TGS-REP)-8 b(.)30 b Fq(out)f Fw(is)h(allo)s(cated)i(b)m (y)e(this)f(function,)h(and)g(it)g(is)g(the)g(resp)s(onsibilit)m(y)390 1197 y(of)h(caller)g(to)g(deallo)s(cate)i(it.)390 1326 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1326 V 39 w(OK)f(i\013)i(successful.)150 1513 y Fl(shishi)p 459 1513 37 5 v 55 w(tgs)p 671 1513 V 55 w(rep)p 900 1513 V 54 w(pro)s(cess)3350 1698 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_rep_proces)q(s)e Ff(\()p Fi(Shishi)p 1835 1698 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 1807 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 1936 y(Pro)s(cess)37 b(new)g(TGS-REP)g(and)g(set)h(tic)m(k)m(et.)64 b(The)37 b(k)m(ey)h(to)g(decrypt)f(the)h(TGS-REP)e(is)i(tak)m(en)390 2045 y(from)30 b(the)g(EncKDCRepP)m(art)h(of)f(the)h(TGS)f(tgtic)m(k)m (et.)390 2174 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2174 V 39 w(OK)f(i\013)i(successful.)150 2361 y Fl(shishi)p 459 2361 37 5 v 55 w(tgs)p 671 2361 V 55 w(rep)p 900 2361 V 54 w(build)3350 2545 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_rep_build)f Ff(\()p Fi(Shishi)p 1731 2545 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(in)m(t)g Fe(keyusage)p Fi(,)565 2655 y(Shishi)p 810 2655 V 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 2764 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 2893 y Fi(k)m(eyusage)5 b Fw(:)42 b(k)m(eyusage)32 b(in)m(teger.)390 3021 y Fi(k)m(ey)8 b Fw(:)41 b(user's)30 b(k)m(ey)-8 b(,)32 b(used)d(to)j(encrypt)e(the)g (encrypted)g(part)g(of)h(the)f(TGS-REP)-8 b(.)390 3150 y(Build)30 b(TGS-REP)-8 b(.)390 3278 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3278 V 39 w(OK)f(i\013)i(successful.)150 3465 y Fl(shishi)p 459 3465 37 5 v 55 w(tgs)p 671 3465 V 55 w(krb)s(error)3350 3650 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tgs_krberror)51 b Ff(\()p Fi(Shishi)p 2097 3650 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Ff(\))390 3759 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e (exc)m(hange)390 3888 y(Get)i(KRB-ERR)m(OR)g(from)f(TGS)g(exc)m(hange.) 390 4016 y Fk(Return)j(v)-5 b(alue:)46 b Fw(Returns)32 b(the)h(receiv)m(ed)h(TGS-REP)f(from)f(the)h(TGS)g(exc)m(hange,)i(or)e (NULL)g(if)390 4126 y(not)e(y)m(et)g(set)g(or)f(an)h(error)f(o)s (ccured.)150 4313 y Fl(shishi)p 459 4313 37 5 v 55 w(tgs)p 671 4313 V 55 w(krb)s(error)p 1179 4313 V 55 w(der)3350 4498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_krberror_d)q (er)f Ff(\()p Fi(Shishi)p 1888 4498 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(c)m(har)g(**)g Fe(out)p Fi(,)g(size)p 3036 4498 V 41 w(t)g(*)565 4607 y Fe(outlen)p Ff(\))390 4717 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 4845 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f(enco)s (ding)f(of)h(KRB-ERR)m(OR.)390 4974 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s(ding)f(of)h (KRB-ERR)m(OR.)390 5102 y(DER)g(enco)s(de)g(KRB-ERR)m(OR.)h Fq(out)e Fw(is)h(allo)s(cated)i(b)m(y)e(this)f(function,)i(and)e(it)i (is)f(the)g(resp)s(onsi-)390 5212 y(bilit)m(y)g(of)g(caller)h(to)f (deallo)s(cate)h(it.)390 5340 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 124 130 TeXDict begin 124 129 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(124)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tgs)p 671 299 V 55 w(krb)s(error)p 1179 299 V 55 w(set)3350 492 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tgs_krberror_set)e Ff(\()p Fi(Shishi)p 1940 492 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(Shishi)p 2653 492 V 39 w(asn1)565 601 y Fe(krberror)p Ff(\))390 711 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 844 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(to)i(store)g(in)f(TGS.)390 976 y(Set)h(the)f(KRB-ERR)m(OR)h(in)f(the)g(TGS)g(exc)m(hange.)150 1172 y Fl(shishi)p 459 1172 37 5 v 55 w(tgs)p 671 1172 V 55 w(tkt)3350 1365 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_tkt)55 b(*)e(shishi_tgs_tkt)d Ff(\()p Fi(Shishi)p 1888 1365 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Ff(\))390 1474 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e (exc)m(hange)390 1607 y(Get)i(Tic)m(k)m(et)i(from)d(TGS)f(exc)m(hange.) 390 1739 y Fk(Return)j(v)-5 b(alue:)46 b Fw(Returns)31 b(the)i(newly)f(acquired)h(tic)m(k)m(et)i(from)d(the)h(TGS)f(exc)m (hange,)i(or)f(NULL)390 1849 y(if)d(not)h(y)m(et)g(set)g(or)g(an)f (error)g(o)s(ccured.)150 2044 y Fl(shishi)p 459 2044 37 5 v 55 w(tgs)p 671 2044 V 55 w(tkt)p 887 2044 V 53 w(set)3350 2237 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_tgs_tkt_set)c Ff(\()p Fi(Shishi)p 1678 2237 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Fi(,)i(Shishi)p 2392 2237 V 39 w(tkt)f(*)f Fe(tkt)p Ff(\))390 2347 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e (exc)m(hange)390 2480 y Fi(tkt)r Fw(:)41 b(tic)m(k)m(et)33 b(to)e(store)g(in)f(TGS.)390 2612 y(Set)h(the)f(Tic)m(k)m(et)i(in)e (the)h(TGS)f(exc)m(hange.)150 2808 y Fl(shishi)p 459 2808 37 5 v 55 w(tgs)p 671 2808 V 55 w(sendrecv)p 1192 2808 V 54 w(hin)m(t)3350 3001 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_sendrecv_h)q(int)f Ff(\()p Fi(Shishi)p 1940 3001 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(Shishi)p 2653 3001 V 39 w(tkts)p 2846 3001 V 41 w(hin)m(t)f(*)565 3110 y Fe(hint)p Ff(\))390 3220 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 3352 y Fi(hin)m(t)r Fw(:)41 b(additional)31 b(parameters)g(that)g(mo)s (dify)e(connection)j(b)s(eha)m(viour,)e(or)g Fq(NULL)p Fw(.)390 3485 y(Send)f(TGS-REQ)h(and)f(receiv)m(e)j(TGS-REP)e(or)g (KRB-ERR)m(OR.)h(This)e(is)i(the)f(subsequen)m(t)g(au-)390 3594 y(then)m(tication,)36 b(usually)c(used)g(to)h(acquire)g(serv)m(er) g(tic)m(k)m(ets.)49 b(The)33 b Fq(hint)e Fw(structure)h(can)h(b)s(e)f (used)390 3704 y(to)f(set,)g(e.g.,)h(parameters)f(for)f(TLS)f(authen)m (tication.)390 3837 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3837 V 39 w(OK)f(i\013)i(successful.)150 4032 y Fl(shishi)p 459 4032 37 5 v 55 w(tgs)p 671 4032 V 55 w(sendrecv)3350 4225 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_sendrecv)e Ff(\()p Fi(Shishi)p 1678 4225 28 4 v 40 w(tgs)31 b(*)f Fe(tgs)p Ff(\))390 4335 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 4467 y(Send)g(TGS-REQ)h(and)f(receiv) m(e)j(TGS-REP)e(or)g(KRB-ERR)m(OR.)h(This)e(is)i(the)f(subsequen)m(t)g (au-)390 4577 y(then)m(tication,)j(usually)d(used)g(to)h(acquire)g (serv)m(er)f(tic)m(k)m(ets.)390 4709 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4709 V 39 w(OK)f(i\013)i(successful.)150 4905 y Fl(shishi)p 459 4905 37 5 v 55 w(tgs)p 671 4905 V 55 w(set)p 878 4905 V 54 w(serv)m(er)3350 5098 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_set_server)f Ff(\()p Fi(Shishi)p 1783 5098 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(const)g(c)m(har)g(*) g Fe(server)p Ff(\))390 5207 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 5340 y Fi(serv)m(er)7 b Fw(:)41 b(indicates)31 b(the)f(serv)m(er)h(to)g (acquire)g(tic)m(k)m(et)i(for.)p eop end %%Page: 125 131 TeXDict begin 125 130 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(125)390 299 y(Set)31 b(the)f(serv)m(er)h(in)f(the)g(TGS-REQ.)390 435 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 435 28 4 v 39 w(OK)f(i\013)i(successful.)150 635 y Fl(shishi)p 459 635 37 5 v 55 w(tgs)p 671 635 V 55 w(set)p 878 635 V 54 w(realm)3350 833 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_set_realm)f Ff(\()p Fi(Shishi)p 1731 833 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(const)g(c)m(har)g(*)g Fe(realm)p Ff(\))390 942 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g(ab)s(out)h(TGS)e(exc)m(hange)390 1078 y Fi(realm)p Fw(:)41 b(indicates)31 b(the)g(realm)g(to)g(acquire)g (tic)m(k)m(et)i(for.)390 1214 y(Set)e(the)f(serv)m(er)h(in)f(the)g (TGS-REQ.)390 1349 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1349 V 39 w(OK)f(i\013)i(successful.)150 1550 y Fl(shishi)p 459 1550 37 5 v 55 w(tgs)p 671 1550 V 55 w(set)p 878 1550 V 54 w(realmserv)m(er)3350 1748 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_set_realms)q(erve) q(r)f Ff(\()p Fi(Shishi)p 2045 1748 28 4 v 39 w(tgs)31 b(*)g Fe(tgs)p Fi(,)g(const)g(c)m(har)g(*)565 1857 y Fe(realm)p Fi(,)h(const)f(c)m(har)g(*)g Fe(server)p Ff(\))390 1967 y Fi(tgs)t Fw(:)41 b(structure)30 b(that)h(holds)f(information)g (ab)s(out)h(TGS)e(exc)m(hange)390 2102 y Fi(realm)p Fw(:)41 b(indicates)31 b(the)g(realm)g(to)g(acquire)g(tic)m(k)m(et)i(for.)390 2238 y Fi(serv)m(er)7 b Fw(:)41 b(indicates)31 b(the)f(serv)m(er)h(to)g (acquire)g(tic)m(k)m(et)i(for.)390 2374 y(Set)e(the)f(realm)h(and)f (serv)m(er)g(in)g(the)h(TGS-REQ.)390 2509 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2509 V 39 w(OK)f(i\013)i(successful.)150 2744 y Fv(5.9)68 b(Tic)l(k)l(et)46 b(\(ASN.1\))f(F)-11 b(unctions)150 2903 y Fw(See)41 b(Section)h(5.6)h ([Tic)m(k)m(et)g(F)-8 b(unctions],)45 b(page)d(103,)k(for)41 b(an)g(high-lev)m(el)i(o)m(v)m(erview)f(of)g(tic)m(k)m(ets.)75 b(The)150 3013 y(follo)m(wing)32 b(illustrates)f(the)g(Tic)m(k)m(et)h (and)e(EncTic)m(k)m(etP)m(art)j(ASN.1)e(structures.)150 3148 y Fq(Ticket)476 b(::=)47 b([APPLICATION)d(1])j(SEQUENCE)f({)532 3258 y(tkt-vno)427 b([0])47 b(INTEGER)f(\(5\),)532 3367 y(realm)523 b([1])47 b(Realm,)532 3477 y(sname)523 b([2])47 b(PrincipalName,)532 3587 y(enc-part)379 b([3])47 b(EncryptedData)e(--) i(EncTicketPart)150 3696 y(})150 3915 y(--)g(Encrypted)e(part)i(of)g (ticket)150 4025 y(EncTicketPart)140 b(::=)47 b([APPLICATION)d(3])j (SEQUENCE)f({)532 4134 y(flags)905 b([0])47 b(TicketFlags,)532 4244 y(key)1001 b([1])47 b(EncryptionKey,)532 4354 y(crealm)857 b([2])47 b(Realm,)532 4463 y(cname)905 b([3])47 b(PrincipalName,)532 4573 y(transited)713 b([4])47 b(TransitedEncoding,)532 4682 y(authtime)761 b([5])47 b(KerberosTime,)532 4792 y(starttime)713 b([6])47 b(KerberosTime)e(OPTIONAL,)532 4902 y(endtime)809 b([7])47 b(KerberosTime,)532 5011 y(renew-till)665 b([8])47 b(KerberosTime)e(OPTIONAL,)532 5121 y(caddr)905 b([9])47 b(HostAddresses)d(OPTIONAL,)532 5230 y(authorization-data)281 b([10])47 b(AuthorizationData)c(OPTIONAL) 150 5340 y(})p eop end %%Page: 126 132 TeXDict begin 126 131 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(126)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tic)m(k)m(et)3350 509 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_ticket)49 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 618 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 766 y(This)g(function)g(creates)h(a) g(new)f(ASN.1)h(Tic)m(k)m(et,)h(p)s(opulated)e(with)g(some)h(default)g (v)-5 b(alues.)390 913 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(tic)m(k)m(et)j(or)e(NULL)f(on)g(failure.)150 1125 y Fl(shishi)p 459 1125 V 55 w(tic)m(k)m(et)p 814 1125 V 52 w(realm)p 1168 1125 V 55 w(get)3350 1335 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_realm_g)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 1335 28 4 v 39 w(asn1)f Fe(ticket)p Fi(,)565 1445 y(c)m(har)g(**)g Fe(realm)p Fi(,)h(size)p 1350 1445 V 41 w(t)f(*)f Fe(realmlen)p Ff(\))390 1554 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1702 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 1849 y Fi(realm)p Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g (allo)s(cated)j(name)d(of)g(realm)h(in)f(tic)m(k)m(et.)390 1997 y Fi(realmlen)p Fw(:)41 b(size)32 b(of)e(output)g(arra)m(y)-8 b(.)390 2144 y(Extract)31 b(realm)g(from)f(tic)m(k)m(et.)390 2292 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2292 V 39 w(OK)f(i\013)i(successful.)150 2504 y Fl(shishi)p 459 2504 37 5 v 55 w(tic)m(k)m(et)p 814 2504 V 52 w(realm)p 1168 2504 V 55 w(set)3350 2714 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_realm_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 2714 28 4 v 39 w(asn1)f Fe(ticket)p Fi(,)565 2823 y(const)g(c)m(har)g(*)f Fe(realm)p Ff(\))390 2933 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3081 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.) 390 3228 y Fi(realm)p Fw(:)41 b(input)30 b(arra)m(y)g(with)h(name)f(of) g(realm.)390 3375 y(Set)h(the)f(realm)h(\014eld)f(in)g(the)h(Tic)m(k)m (et.)390 3523 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3523 V 39 w(OK)f(i\013)i(successful.)150 3735 y Fl(shishi)p 459 3735 37 5 v 55 w(tic)m(k)m(et)p 814 3735 V 52 w(serv)m(er)3350 3945 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_server)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 3945 28 4 v 39 w(asn1)f Fe(ticket)p Fi(,)565 4055 y(c)m(har)g(**)g Fe(server)p Fi(,)h(size)p 1402 4055 V 41 w(t)f(*)g Fe(serverlen)p Ff(\))390 4164 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4312 y Fi(tic)m(k)m(et)r Fw(:)43 b(ASN.1)31 b(Tic)m(k)m(et)i(v)-5 b(ariable)31 b(to)g(get)g(serv)m(er)g(name)f(from.)390 4459 y Fi(serv)m(er)7 b Fw(:)42 b(p)s(oin)m(ter)32 b(to)g(newly)f(allo) s(cated)i(zero)f(terminated)g(string)f(con)m(taining)i(principal)e (name.)390 4569 y(Ma)m(y)h(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(serverlen)p Fw(\).)390 4716 y Fi(serv)m(erlen)p Fw(:)51 b(p)s(oin)m(ter)35 b(to)h(length)g(of)f Fq(server)f Fw(on)h(output,)h(excluding)g(terminating)g(zero.)56 b(Ma)m(y)390 4826 y(b)s(e)30 b Fq(NULL)f Fw(\(to)i(only)g(p)s(opulate)f Fq(server)p Fw(\).)390 4973 y(Represen)m(t)38 b(serv)m(er)g(principal)g (name)f(in)h(Tic)m(k)m(et)i(as)e(zero-terminated)h(string.)63 b(The)37 b(string)h(is)390 5083 y(allo)s(cate)43 b(b)m(y)c(this)h (function,)j(and)c(it)i(is)f(the)g(resp)s(onsibilit)m(y)g(of)g(the)h (caller)g(to)g(deallo)s(cate)h(it.)390 5192 y(Note)32 b(that)f(the)f(output)g(length)h Fq(serverlen)d Fw(do)s(es)i(not)g (include)h(the)f(terminating)h(zero.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 127 133 TeXDict begin 127 132 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(127)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tic)m(k)m(et)p 814 299 V 52 w(sname)p 1200 299 V 55 w(set)3350 497 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_sname_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 497 28 4 v 39 w(asn1)f Fe(ticket)p Fi(,)565 606 y(Shishi)p 810 606 V 39 w(name)p 1061 606 V 40 w(t)m(yp)s(e)g Fe(name_type)p Fi(,)i(c)m(har)e(*)f Fd([])h Fe(sname)p Ff(\))390 716 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 852 y Fi(tic)m(k)m(et)r Fw(:)43 b(Tic)m(k)m(et)33 b(v)-5 b(ariable)31 b(to)g(set)g(serv)m(er)f (name)h(\014eld)f(in.)390 987 y Fi(name)p 608 987 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f (Shishi)p 1973 987 V 39 w(name)p 2224 987 V 40 w(t)m(yp)s(e,)i(usually) d(SHISHI)p 3091 987 V 39 w(NT)p 3264 987 V 40 w(UNKNO)m(WN.)390 1123 y Fi(sname)5 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 1259 y(Set)h(the)f(serv)m(er)h(name)f(\014eld)g(in)g(the)h (Tic)m(k)m(et.)390 1394 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1394 V 39 w(OK)f(i\013)i(successful.) 150 1595 y Fl(shishi)p 459 1595 37 5 v 55 w(tic)m(k)m(et)p 814 1595 V 52 w(get)p 1031 1595 V 55 w(enc)p 1265 1595 V 53 w(part)p 1544 1595 V 54 w(et)m(yp)s(e)3350 1793 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_get_enc)q(_par) q(t_e)q(typ)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 1902 y(Shishi)p 810 1902 28 4 v 39 w(asn1)g Fe(ticket)p Fi(,)h(in)m(t32)p 1624 1902 V 41 w(t)f(*)g Fe(etype)p Ff(\))390 2012 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2148 y Fi(tic)m(k)m(et)r Fw(:)43 b(Tic)m(k)m(et)33 b(v)-5 b(ariable)31 b(to)g(get)g(v)-5 b(alue)31 b(from.)390 2283 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(v)-5 b(alue.)390 2419 y(Extract)31 b(Tic)m(k)m(et.enc-part.et)m(yp)s(e.)390 2555 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2555 V 39 w(OK)f(i\013)i(successful.)150 2755 y Fl(shishi)p 459 2755 37 5 v 55 w(tic)m(k)m(et)p 814 2755 V 52 w(set)p 1018 2755 V 55 w(enc)p 1252 2755 V 53 w(part)3350 2953 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_set_enc)q (_par)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 2953 28 4 v 39 w(asn1)565 3063 y Fe(ticket)p Fi(,)g(in)m(t32)p 1138 3063 V 42 w(t)f Fe(etype)p Fi(,)h(uin)m(t32)p 1812 3063 V 41 w(t)e Fe(kvno)p Fi(,)i(const)f(c)m(har)g(*)g Fe(buf)p Fi(,)g(size)p 3050 3063 V 41 w(t)g Fe(buflen)p Ff(\))390 3172 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3308 y Fi(tic)m(k)m(et)r Fw(:)43 b(Tic)m(k)m(et)33 b(to)e(add)f (enc-part)g(\014eld)g(to.)390 3444 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(used)g(to)h(encrypt)f (enc-part.)390 3579 y Fi(kvno)5 b Fw(:)40 b(k)m(ey)31 b(v)m(ersion)g(n)m(um)m(b)s(er.)390 3715 y Fi(buf)16 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(encrypted)g(enc-part.)390 3851 y Fi(bu\015en)p Fw(:)39 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (encrypted)g(enc-part.)390 3987 y(Set)f(the)h(encrypted)e(enc-part)i (\014eld)f(in)f(the)i(Tic)m(k)m(et.)42 b(The)28 b(encrypted)h(data)h (is)f(usually)g(created)390 4096 y(b)m(y)h(calling)h Fq(shishi_encrypt\(\))26 b Fw(on)k(the)g(DER)g(enco)s(ded)g(enc-part.) 41 b(T)-8 b(o)30 b(sa)m(v)m(e)i(time,)f(y)m(ou)f(ma)m(y)390 4206 y(w)m(an)m(t)24 b(to)f(use)g Fq(shishi_ticket_add_enc_p)o(art\()o (\))17 b Fw(instead,)25 b(whic)m(h)d(calculates)j(the)e(encrypted)390 4315 y(data)31 b(and)f(calls)h(this)g(function)f(in)g(one)g(step.)390 4451 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4451 V 39 w(OK)f(i\013)i(successful.)150 4651 y Fl(shishi)p 459 4651 37 5 v 55 w(tic)m(k)m(et)p 814 4651 V 52 w(add)p 1062 4651 V 54 w(enc)p 1295 4651 V 54 w(part)3350 4849 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ticket_add_enc)q (_par)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 4849 28 4 v 39 w(asn1)565 4959 y Fe(ticket)p Fi(,)g(Shishi)p 1179 4959 V 39 w(k)m(ey)g(*)e Fe(key)p Fi(,)i(Shishi)p 1910 4959 V 39 w(asn1)e Fe(encticketpart)p Ff(\))390 5069 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5204 y Fi(tic)m(k)m(et)r Fw(:)43 b(Tic)m(k)m(et)33 b(to)e(add)f(enc-part)g(\014eld)g(to.)390 5340 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(used)f(to)h(encrypt)f (enc-part.)p eop end %%Page: 128 134 TeXDict begin 128 133 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(128)390 299 y Fi(enctic)m(k)m (etpart)r Fw(:)44 b(EncTic)m(k)m(etP)m(art)32 b(to)g(add.)390 440 y(Encrypts)d(DER)i(enco)s(ded)f(EncTic)m(k)m(etP)m(art)j(using)d(k) m(ey)h(and)f(stores)g(it)h(in)f(the)h(Tic)m(k)m(et.)390 580 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 580 28 4 v 39 w(OK)f(i\013)i(successful.)150 786 y Fl(shishi)p 459 786 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 786 V 52 w(get)p 1436 786 V 54 w(k)m(ey)3350 988 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(get_) q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 988 28 4 v 39 w(asn1)565 1098 y Fe(encticketpart)p Fi(,)i(Shishi)p 1546 1098 V 38 w(k)m(ey)d(**)f Fe(key)p Ff(\))390 1208 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1348 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m (art)k(v)-5 b(ariable.)390 1489 y Fi(k)m(ey)8 b Fw(:)41 b(newly)30 b(allo)s(cated)j(k)m(ey)-8 b(.)390 1629 y(Extract)31 b(the)g(session)f(k)m(ey)i(in)e(the)g(Tic)m(k)m(et.)390 1770 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1975 y Fl(shishi)p 459 1975 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 1975 V 52 w(k)m(ey)p 1454 1975 V 53 w(set)3350 2178 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(key_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 2178 28 4 v 39 w(asn1)565 2288 y Fe(encticketpart)p Fi(,)i(Shishi)p 1546 2288 V 38 w(k)m(ey)d(*)e Fe(key)p Ff(\))390 2398 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2538 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m (art)k(v)-5 b(ariable.)390 2679 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(handle)f(with)g(information)h(to)g(store)g(in)f(enctic)m (k)m(etpart.)390 2819 y(Set)h(the)f(EncTic)m(k)m(etP)m(art.k)m(ey)k (\014eld)c(to)h(k)m(ey)g(t)m(yp)s(e)g(and)f(v)-5 b(alue)30 b(of)h(supplied)e(k)m(ey)-8 b(.)390 2960 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k (successful.)150 3165 y Fl(shishi)p 459 3165 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 3165 V 52 w(\015ags)p 1508 3165 V 54 w(set)3350 3368 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(flag)q(s_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3368 28 4 v 39 w(asn1)565 3478 y Fe(encticketpart)p Fi(,)j(in)m(t)30 b Fe(flags)p Ff(\))390 3588 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3728 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m(art)k(v)-5 b(ariable.)390 3869 y Fi(\015ags)t Fw(:)41 b(\015ags)30 b(to)h(set)g(in)f(enctic)m(k)m (etpart.)390 4009 y(Set)h(the)f(EncTic)m(k)m(etP)m(art.\015ags)j(to)f (supplied)d(v)-5 b(alue.)390 4150 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4355 y Fl(shishi)p 459 4355 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 4355 V 52 w(crealm)p 1628 4355 V 54 w(set)3350 4558 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(crea) q(lm_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 4668 y(Shishi)p 810 4668 28 4 v 39 w(asn1)h Fe(encticketpart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(realm)p Ff(\))390 4777 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4918 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m (art)k(v)-5 b(ariable.)390 5059 y Fi(realm)p Fw(:)41 b(input)30 b(arra)m(y)g(with)h(name)f(of)g(realm.)390 5199 y(Set)h(the)f(realm)h(\014eld)f(in)g(the)h(KDC-REQ.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 129 135 TeXDict begin 129 134 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(129)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 299 V 52 w(cname)p 1612 299 V 53 w(set)3350 500 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(cnam)q(e_s)q(et) f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 500 28 4 v 39 w(asn1)565 609 y Fe(encticketpart)p Fi(,)j(Shishi)p 1546 609 V 38 w(name)p 1796 609 V 41 w(t)m(yp)s(e)30 b Fe(name_type)p Fi(,)j(const)e(c)m(har)g(*)g Fe(principal)p Ff(\))390 719 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 857 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m(art)k(v)-5 b(ariable.)390 996 y Fi(name)p 608 996 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 996 V 39 w(name)p 2224 996 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 996 V 39 w(NT)p 3264 996 V 40 w(UNKNO)m(WN.)390 1135 y Fi(principal)t Fw(:)40 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 1273 y(Set)h(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f (EncTic)m(k)m(etP)m(art.)390 1412 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1412 V 39 w(OK)f(i\013)i(successful.)150 1615 y Fl(shishi)p 459 1615 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 1615 V 52 w(transited)p 1751 1615 V 54 w(set)3350 1816 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(tran)q(sit)q (ed_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 1925 y(Shishi)p 810 1925 28 4 v 39 w(asn1)h Fe(encticketpart)p Fi(,)j(in)m(t32)p 1990 1925 V 42 w(t)c Fe(trtype)p Fi(,)j(const)d(c)m (har)h(*)g Fe(trdata)p Fi(,)h(size)p 3490 1925 V 41 w(t)565 2035 y Fe(trdatalen)p Ff(\))390 2145 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2283 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m(art)k(v)-5 b(ariable.)390 2422 y Fi(trt)m(yp)s(e)5 b Fw(:)41 b(transitedenco)s(ding)31 b(t)m(yp)s(e,)f(e.g.)42 b(SHISHI)p 2158 2422 V 39 w(TR)p 2330 2422 V 40 w(DOMAIN)p 2762 2422 V 40 w(X500)p 3005 2422 V 42 w(COMPRESS.)390 2560 y Fi(trdata)p Fw(:)f(actual)32 b(transited)f(realm)f(data.)390 2699 y Fi(trdatalen)p Fw(:)42 b(length)30 b(of)h(actual)h(transited)e(realm)h(data.)390 2838 y(Set)g(the)f(EncTic)m(k)m(etP)m(art.transited)k(\014eld)29 b(to)j(supplied)d(v)-5 b(alue.)390 2976 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k (successful.)150 3179 y Fl(shishi)p 459 3179 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 3179 V 52 w(auth)m(time)p 1752 3179 V 53 w(set)3350 3380 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(auth)q(tim)q(e_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 3490 y(Shishi)p 810 3490 28 4 v 39 w(asn1)g Fe(encticketpart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(authtime)p Ff(\))390 3599 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3738 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m(art)k(v)-5 b(ariable.)390 3877 y Fi(auth)m(time)5 b Fw(:)42 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 4015 y(Set)g(the)f(EncTic)m(k)m(etP)m(art.auth)m(time)k(to)d(supplied)e(v)-5 b(alue.)390 4154 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4357 y Fl(shishi)p 459 4357 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 4357 V 52 w(endtime)p 1703 4357 V 54 w(set)3350 4558 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(endt)q(ime)q (_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 4667 y(Shishi)p 810 4667 28 4 v 39 w(asn1)g Fe(encticketpart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(endtime)p Ff(\))390 4777 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4916 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m(art)k(v)-5 b(ariable.)390 5054 y Fi(endtime)5 b Fw(:)41 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 5193 y(Set)g(the)f(EncTic)m(k)m(etP)m(art.endtime)j(to)f(supplied)d(v)-5 b(alue.)390 5331 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 130 136 TeXDict begin 130 135 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(130)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 299 V 52 w(clien)m(t)3350 509 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(clie)q(nt)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 509 28 4 v 38 w(asn1)565 618 y Fe(encticketpart)p Fi(,)i(c)m(har)30 b(**)i Fe(client)p Fi(,)g(size)p 2138 618 V 41 w(t)f(*)f Fe(clientlen)p Ff(\))390 728 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 876 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(EncTic)m(k)m(etP)m (art)32 b(v)-5 b(ariable)32 b(to)f(get)g(clien)m(t)h(name)f(from.)390 1023 y Fi(clien)m(t)r Fw(:)48 b(p)s(oin)m(ter)34 b(to)g(newly)f(allo)s (cated)i(zero)f(terminated)g(string)g(con)m(taining)h(principal)e (name.)390 1133 y(Ma)m(y)f(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(clientlen)p Fw(\).)390 1281 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 1390 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 1538 y(Represen)m(t)43 b(clien)m(t)h(principal)f (name)g(in)f(EncTic)m(k)m(etP)m(art)j(as)e(zero-terminated)i(string.)77 b(The)390 1647 y(string)24 b(is)g(allo)s(cate)i(b)m(y)e(this)g (function,)h(and)e(it)i(is)f(the)g(resp)s(onsibilit)m(y)g(of)g(the)g (caller)h(to)g(deallo)s(cate)390 1757 y(it.)41 b(Note)32 b(that)f(the)f(output)g(length)h Fq(clientlen)d Fw(do)s(es)i(not)h (include)f(the)g(terminating)i(zero.)390 1905 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1905 V 39 w(OK)f(i\013)i(successful.)150 2117 y Fl(shishi)p 459 2117 37 5 v 55 w(enctic)m(k)m(etpart)p 1219 2117 V 52 w(clien)m(trealm)3350 2327 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encticketpart_)q(clie)q(ntr)q(eal)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 2437 y(Shishi)p 810 2437 28 4 v 39 w(asn1)g Fe(encticketpart)p Fi(,)j(c)m(har)d(**)g Fe(client)p Fi(,)h(size)p 2623 2437 V 41 w(t)f(*)g Fe(clientlen)p Ff(\))390 2546 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2694 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(EncTic)m(k)m(etP)m(art)32 b(v)-5 b(ariable)32 b(to)f(get)g(clien)m(t)h(name)f(and)e(realm)i(from.)390 2842 y Fi(clien)m(t)r Fw(:)53 b(p)s(oin)m(ter)36 b(to)g(newly)f(allo)s (cated)j(zero)e(terminated)h(string)e(con)m(taining)j(principal)d(name) 390 2951 y(and)30 b(realm.)41 b(Ma)m(y)31 b(b)s(e)f Fq(NULL)f Fw(\(to)j(only)e(p)s(opulate)h Fq(clientlen)p Fw(\).)390 3099 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of) g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 3208 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 3356 y(Con)m(v)m(ert)g(cname)g(and)e(realm)i (\014elds)e(from)h(EncTic)m(k)m(etP)m(art)j(to)d(prin)m(table)h (principal)f(name)g(for-)390 3466 y(mat.)39 b(The)25 b(string)g(is)h(allo)s(cate)h(b)m(y)e(this)h(function,)g(and)e(it)i(is) f(the)h(resp)s(onsibilit)m(y)f(of)g(the)h(caller)g(to)390 3575 y(deallo)s(cate)e(it.)38 b(Note)22 b(that)g(the)g(output)f(length) g Fq(clientlen)e Fw(do)s(es)i(not)h(include)f(the)g(terminating)390 3685 y(zero.)390 3832 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3832 V 39 w(OK)f(i\013)i(successful.) 150 4085 y Fv(5.10)68 b(AS/TGS)44 b(F)-11 b(unctions)150 4244 y Fw(The)33 b(Authen)m(tication)i(Service)f(\(AS\))f(is)h(used)e (to)i(get)g(an)g(initial)g(tic)m(k)m(et)i(using)d(e.g.)50 b(y)m(our)33 b(passw)m(ord.)150 4354 y(The)j(Tic)m(k)m(et)i(Gran)m (ting)f(Service)g(\(TGS\))f(is)h(used)e(to)i(get)h(subsequen)m(t)d(tic) m(k)m(ets)k(using)d(other)g(tic)m(k)m(ets.)150 4463 y(Proto)s(col)i (wise)e(the)g(pro)s(cedures)f(are)i(v)m(ery)f(similar,)j(whic)m(h)d(is) g(the)g(reason)h(they)f(are)h(describ)s(ed)e(to-)150 4573 y(gether.)48 b(The)32 b(follo)m(wing)i(illustrates)g(the)f (AS-REQ,)f(TGS-REQ)g(and)g(AS-REP)-8 b(,)32 b(TGS-REP)g(ASN.1)150 4682 y(structures.)46 b(Most)34 b(of)e(the)h(functions)f(use)g(the)h (mnemonic)f(\\KDC")h(instead)g(of)g(either)g(AS)f(or)g(TGS,)150 4792 y(whic)m(h)27 b(means)h(the)g(function)f(op)s(erates)h(on)f(b)s (oth)g(AS)h(and)f(TGS)g(t)m(yp)s(es.)39 b(Only)27 b(where)h(the)f (distinction)150 4902 y(b)s(et)m(w)m(een)39 b(AS)f(and)f(TGS)h(is)g (imp)s(ortan)m(t)h(are)f(the)h(AS)e(and)h(TGS)g(names)g(used.)63 b(Remem)m(b)s(er,)40 b(these)150 5011 y(are)g(lo)m(w-lev)m(el)i (functions,)g(and)c(normal)i(applications)g(will)g(lik)m(ely)h(b)s(e)e (satis\014ed)g(with)g(the)h(AS)f(\(see)150 5121 y(Section)27 b(5.7)h([AS)e(F)-8 b(unctions],)28 b(page)f(114\))h(and)e(TGS)g(\(see)h (Section)g(5.8)h([TGS)e(F)-8 b(unctions],)28 b(page)f(119\))150 5230 y(in)m(terfaces,)39 b(or)d(the)h(ev)m(en)g(more)f(high-lev)m(el)i (Tic)m(k)m(et)g(Set)e(\(see)h(Section)g(5.3)g([Tic)m(k)m(et)i(Set)d(F) -8 b(unctions],)150 5340 y(page)31 b(65\))h(in)m(terface.)p eop end %%Page: 131 137 TeXDict begin 131 136 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(131)150 299 y Fq(--)47 b(Request)f(--)150 518 y(AS-REQ)476 b(::=)47 b(KDC-REQ)e({10})150 628 y(TGS-REQ)428 b(::=)47 b(KDC-REQ)e({12})150 847 y(KDC-REQ)h ({INTEGER:tagnum})377 b(::=)47 b([APPLICATION)e(tagnum])g(SEQUENCE)h({) 532 956 y(pvno)571 b([1])47 b(INTEGER)f(\(5\))h(--)g(first)g(tag)g(is)g ([1],)f(not)h([0])g(--,)532 1066 y(msg-type)379 b([2])47 b(INTEGER)f(\(tagnum\),)532 1176 y(padata)475 b([3])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 1285 y(req-body)379 b([4])47 b(KDC-REQ-BODY)150 1395 y(})150 1614 y(KDC-REQ-BODY)188 b(::=)47 b(SEQUENCE)e({)532 1724 y(kdc-options)617 b([0])47 b(KDCOptions,)532 1833 y(cname)905 b([1])47 b(PrincipalName)d(OPTIONAL) 1868 1943 y(--)j(Used)g(only)g(in)g(AS-REQ)f(--,)532 2052 y(realm)905 b([2])47 b(Realm)1868 2162 y(--)g(Server's)f(realm) 1868 2271 y(--)h(Also)g(client's)f(in)h(AS-REQ)f(--,)532 2381 y(sname)905 b([3])47 b(PrincipalName)d(OPTIONAL,)532 2491 y(from)953 b([4])47 b(KerberosTime)e(OPTIONAL,)532 2600 y(till)953 b([5])47 b(KerberosTime,)532 2710 y(rtime)905 b([6])47 b(KerberosTime)e(OPTIONAL,)532 2819 y(nonce)905 b([7])47 b(UInt32,)532 2929 y(etype)905 b([8])47 b(SEQUENCE)f(OF)h (Int32)f(--)h(EncryptionType)1868 3039 y(--)g(in)h(preference)d(order)h (--,)532 3148 y(addresses)713 b([9])47 b(HostAddresses)d(OPTIONAL,)532 3258 y(enc-authorization-data)89 b([10])47 b(EncryptedData)d({)2059 3367 y(AuthorizationData,)2059 3477 y({)k(keyuse-TGSReqAuthData-s)o (ess)o(key)2155 3587 y(|)f(keyuse-TGSReqAuthData-su)o(bkey)41 b(})1916 3696 y(})47 b(OPTIONAL,)532 3806 y(additional-tickets)281 b([11])47 b(SEQUENCE)e(OF)j(Ticket)e(OPTIONAL)150 3915 y(})150 4134 y(--)h(Reply)g(--)150 4354 y(AS-REP)476 b(::=)47 b(KDC-REP)e({11,)i(EncASRepPart,)d({keyuse-EncASRepPart}})150 4463 y(TGS-REP)428 b(::=)47 b(KDC-REP)e({13,)i(EncTGSRepPart,)1295 4573 y({)h(keyuse-EncTGSRepPart-ses)o(skey)1391 4682 y(|)f(keyuse-EncTGSRepPart-subke)o(y)42 b(}})150 4902 y(KDC-REP)k({INTEGER:tagnum,)580 5011 y(TypeToEncrypt,)580 5121 y(UInt32:KeyUsages})281 b(::=)47 b([APPLICATION)e(tagnum])g (SEQUENCE)h({)532 5230 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 5340 y(msg-type)379 b([1])47 b(INTEGER)f(\(tagnum\),)p eop end %%Page: 132 138 TeXDict begin 132 137 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(132)532 299 y Fq(padata)475 b([2])47 b(SEQUENCE)f(OF)h(PA-DATA)f(OPTIONAL,)532 408 y(crealm)475 b([3])47 b(Realm,)532 518 y(cname)523 b([4])47 b(PrincipalName,)532 628 y(ticket)475 b([5])47 b(Ticket,)532 737 y(enc-part)379 b([6])47 b(EncryptedData)e({TypeToEncrypt,)e (KeyUsages})150 847 y(})150 1066 y(EncASRepPart)188 b(::=)47 b([APPLICATION)d(25])j(EncKDCRepPart)150 1176 y(EncTGSRepPart)140 b(::=)47 b([APPLICATION)d(26])j(EncKDCRepPart)150 1395 y(EncKDCRepPart)140 b(::=)47 b(SEQUENCE)e({)532 1504 y(key)619 b([0])47 b(EncryptionKey,)532 1614 y(last-req)379 b([1])47 b(LastReq,)532 1724 y(nonce)523 b([2])47 b(UInt32,)532 1833 y(key-expiration)91 b([3])47 b(KerberosTime)e(OPTIONAL,)532 1943 y(flags)523 b([4])47 b(TicketFlags,)532 2052 y(authtime)379 b([5])47 b(KerberosTime,)532 2162 y(starttime)331 b([6])47 b(KerberosTime)e(OPTIONAL,)532 2271 y(endtime)427 b([7])47 b(KerberosTime,)532 2381 y(renew-till)283 b([8])47 b(KerberosTime)e (OPTIONAL,)532 2491 y(srealm)475 b([9])47 b(Realm,)532 2600 y(sname)523 b([10])47 b(PrincipalName,)532 2710 y(caddr)523 b([11])47 b(HostAddresses)d(OPTIONAL)150 2819 y(})150 3020 y Fl(shishi)p 459 3020 37 5 v 55 w(as)p 622 3020 V 54 w(deriv)m(e)p 1002 3020 V 54 w(salt)3350 3219 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_derive_salt)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3219 28 4 v 39 w(asn1)d Fe(asreq)p Fi(,)565 3329 y(Shishi)p 810 3329 V 39 w(asn1)h Fe(asrep)p Fi(,)h(c)m(har)e(**)i Fe(salt)p Fi(,)f(size)p 2100 3329 V 41 w(t)g(*)g Fe(saltlen)p Ff(\))390 3438 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3575 y Fi(asreq)r Fw(:)41 b(input)29 b(AS-REQ)h(v)-5 b(ariable.)390 3711 y Fi(asrep)s Fw(:)40 b(input)30 b(AS-REP)g(v)-5 b(ariable.)390 3847 y Fi(salt)r Fw(:)42 b(newly)30 b(allo)s(cated)i (output)e(arra)m(y)h(with)f(salt.)390 3983 y Fi(saltlen)p Fw(:)42 b(holds)30 b(actual)h(size)h(of)e(output)g(arra)m(y)h(with)f (salt.)390 4120 y(Deriv)m(e)55 b(the)f(salt)h(that)g(should)d(b)s(e)i (used)f(when)g(deriving)g(a)i(k)m(ey)f(via)h Fq(shishi_string_)390 4229 y(to_key\(\))d Fw(for)i(an)g(AS)g(exc)m(hange.)114 b(Curren)m(tly)54 b(this)g(searc)m(hes)h(for)f(P)-8 b(A-D)m(A)g(T)g(A) 57 b(of)e(t)m(yp)s(e)390 4339 y(SHISHI)p 700 4339 V 39 w(P)-8 b(A)p 861 4339 V 41 w(PW)p 1057 4339 V 40 w(SAL)g(T)32 b(in)f(the)i(AS-REP)f(and)f(returns)g(it)i(if)f(found,)g(otherwise)g (the)h(salt)g(is)390 4449 y(deriv)m(ed)d(from)g(the)h(clien)m(t)h(name) e(and)g(realm)h(in)f(AS-REQ.)390 4585 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4585 V 39 w(OK)f(i\013)i(successful.)150 4786 y Fl(shishi)p 459 4786 37 5 v 55 w(kdc)p 702 4786 V 54 w(cop)m(y)p 1002 4786 V 53 w(crealm)3350 4984 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdc_copy_creal)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 4984 28 4 v 39 w(asn1)e Fe(kdcrep)p Fi(,)565 5094 y(Shishi)p 810 5094 V 39 w(asn1)h Fe(encticketpart)p Ff(\))390 5204 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(read)f(crealm)h(from.)p eop end %%Page: 133 139 TeXDict begin 133 138 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(133)390 299 y Fi(enctic)m(k)m (etpart)r Fw(:)44 b(EncTic)m(k)m(etP)m(art)32 b(to)g(set)e(crealm)i (in.)390 435 y(Set)f(crealm)g(in)f(KDC-REP)g(to)h(v)-5 b(alue)31 b(in)f(EncTic)m(k)m(etP)m(art.)390 571 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 571 28 4 v 39 w(OK)f(if)i(successful.)150 773 y Fl(shishi)p 459 773 37 5 v 55 w(as)p 622 773 V 54 w(c)m(hec)m(k)p 969 773 V 53 w(crealm)3350 971 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_check_creal)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 971 28 4 v 39 w(asn1)e Fe(asreq)p Fi(,)565 1081 y(Shishi)p 810 1081 V 39 w(asn1)h Fe(asrep)p Ff(\))390 1190 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1327 y Fi(asreq)r Fw(:)41 b(AS-REQ)30 b(to)h(compare)g(realm)g(\014eld)f(in.)390 1463 y Fi(asrep)s Fw(:)40 b(AS-REP)30 b(to)h(compare)g(realm)g(\014eld) f(in.)390 1599 y(V)-8 b(erify)32 b(that)h(AS-REQ.req-b)s(o)s(dy)-8 b(.realm)31 b(and)g(AS-REP)-8 b(.crealm)33 b(\014elds)e(matc)m(hes.)46 b(This)31 b(is)h(one)390 1709 y(of)46 b(the)f(steps)h(that)g(has)f(to)h (b)s(e)f(p)s(erformed)f(when)g(pro)s(cessing)i(a)g(AS-REQ)e(and)h (AS-REP)390 1818 y(exc)m(hange,)32 b(see)f Fq(shishi_kdc_process\(\))p Fw(.)390 1955 y Fk(Return)39 b(v)-5 b(alue:)60 b Fw(Returns)39 b(SHISHI)p 1671 1955 V 39 w(OK)g(if)g(successful,)j(SHISHI)p 2737 1955 V 39 w(REALM)p 3113 1955 V 40 w(MISMA)-8 b(TCH)40 b(if)390 2064 y(the)31 b(v)-5 b(alues)30 b(di\013er,)h(or)f(an)g(error) g(co)s(de.)150 2265 y Fl(shishi)p 459 2265 37 5 v 55 w(kdc)p 702 2265 V 54 w(cop)m(y)p 1002 2265 V 53 w(cname)3350 2464 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdc_copy_cname)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 2464 28 4 v 39 w(asn1)d Fe(kdcrep)p Fi(,)565 2574 y(Shishi)p 810 2574 V 39 w(asn1)h Fe(encticketpart)p Ff(\))390 2683 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2819 y Fi(kdcrep)s Fw(:)40 b(KDC-REQ)30 b(to)h(read)f(cname)h(from.)390 2956 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(EncTic)m(k)m(etP)m(art)32 b(to)g(set)e(cname)h(in.)390 3092 y(Set)g(cname)f(in)g(KDC-REP)h(to)g (v)-5 b(alue)30 b(in)h(EncTic)m(k)m(etP)m(art.)390 3228 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3228 V 39 w(OK)f(if)i(successful.)150 3429 y Fl(shishi)p 459 3429 37 5 v 55 w(as)p 622 3429 V 54 w(c)m(hec)m(k)p 969 3429 V 53 w(cname)3350 3628 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_check_cname)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3628 28 4 v 39 w(asn1)d Fe(asreq)p Fi(,)565 3738 y(Shishi)p 810 3738 V 39 w(asn1)h Fe(asrep)p Ff(\))390 3847 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3983 y Fi(asreq)r Fw(:)41 b(AS-REQ)30 b(to)h(compare)g(clien)m(t)h(name)e(\014eld)g(in.)390 4120 y Fi(asrep)s Fw(:)40 b(AS-REP)30 b(to)h(compare)g(clien)m(t)h (name)f(\014eld)f(in.)390 4256 y(V)-8 b(erify)32 b(that)h(AS-REQ.req-b) s(o)s(dy)-8 b(.realm)31 b(and)g(AS-REP)-8 b(.crealm)33 b(\014elds)e(matc)m(hes.)46 b(This)31 b(is)h(one)390 4366 y(of)46 b(the)f(steps)h(that)g(has)f(to)h(b)s(e)f(p)s(erformed)f (when)g(pro)s(cessing)i(a)g(AS-REQ)e(and)h(AS-REP)390 4475 y(exc)m(hange,)32 b(see)f Fq(shishi_kdc_process\(\))p Fw(.)390 4612 y Fk(Return)38 b(v)-5 b(alue:)57 b Fw(Returns)38 b(SHISHI)p 1666 4612 V 39 w(OK)f(if)i(successful,)h(SHISHI)p 2728 4612 V 39 w(CNAME)p 3114 4612 V 41 w(MISMA)-8 b(TCH)38 b(if)390 4721 y(the)31 b(v)-5 b(alues)30 b(di\013er,)h(or)f(an)g(error) g(co)s(de.)150 4922 y Fl(shishi)p 459 4922 37 5 v 55 w(kdc)p 702 4922 V 54 w(cop)m(y)p 1002 4922 V 53 w(nonce)3350 5121 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdc_copy_nonce)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 5121 28 4 v 39 w(asn1)d Fe(kdcreq)p Fi(,)565 5230 y(Shishi)p 810 5230 V 39 w(asn1)h Fe(enckdcreppart)p Ff(\))390 5340 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)p eop end %%Page: 134 140 TeXDict begin 134 139 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(134)390 299 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(read)f(nonce)h(from.)390 436 y Fi(enc)m(kdcreppart)r Fw(:)41 b(EncKDCRepP)m(art)30 b(to)h(set)g(nonce)g(in.)390 573 y(Set)g(nonce)f(in)g(EncKDCRepP)m(art) h(to)g(v)-5 b(alue)31 b(in)f(KDC-REQ.)390 710 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 710 28 4 v 39 w(OK)f(if)i(successful.)150 912 y Fl(shishi)p 459 912 37 5 v 55 w(kdc)p 702 912 V 54 w(c)m(hec)m(k)p 1049 912 V 52 w(nonce)3350 1111 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdc_check_nonc)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 1111 28 4 v 39 w(asn1)e Fe(kdcreq)p Fi(,)565 1221 y(Shishi)p 810 1221 V 39 w(asn1)h Fe(enckdcreppart)p Ff(\))390 1331 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1468 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(compare)g(nonce)f(\014eld)g(in.)390 1605 y Fi(enc)m(kdcreppart)r Fw(:)41 b(Encrypted)29 b(KDC-REP)h(part)g (to)i(compare)e(nonce)h(\014eld)f(in.)390 1742 y(V)-8 b(erify)43 b(that)h(KDC-REQ.req-b)s(o)s(dy)-8 b(.nonce)42 b(and)g(EncKDCRepP)m(art.nonce)h(\014elds)g(matc)m(hes.)390 1851 y(This)30 b(is)i(one)f(of)h(the)f(steps)g(that)h(has)f(to)h(b)s(e) f(p)s(erformed)f(when)g(pro)s(cessing)h(a)h(KDC-REQ)f(and)390 1961 y(KDC-REP)f(exc)m(hange.)390 2098 y Fk(Return)20 b(v)-5 b(alue:)36 b Fw(Returns)19 b(SHISHI)p 1608 2098 V 39 w(OK)h(if)g(successful,)j(SHISHI)p 2617 2098 V 39 w(NONCE)p 2991 2098 V 39 w(LENGTH)p 3422 2098 V 40 w(MISMA)-8 b(TCH)390 2208 y(if)40 b(the)g(nonces)g(ha)m(v)m(e)h(di\013eren)m(t)f (lengths)g(\(usually)g(indicates)h(that)f(buggy)g(serv)m(er)g (truncated)390 2317 y(nonce)k(to)h(4)g(b)m(ytes\),)j(SHISHI)p 1501 2317 V 39 w(NONCE)p 1875 2317 V 40 w(MISMA)-8 b(TCH)44 b(if)g(the)g(v)-5 b(alues)45 b(di\013er,)i(or)d(an)g(error)390 2427 y(co)s(de.)150 2629 y Fl(shishi)p 459 2629 37 5 v 55 w(tgs)p 671 2629 V 55 w(pro)s(cess)3350 2828 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_tgs_process)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 2828 28 4 v 39 w(asn1)d Fe(tgsreq)p Fi(,)565 2938 y(Shishi)p 810 2938 V 39 w(asn1)h Fe(tgsrep)p Fi(,)h(Shishi)p 1665 2938 V 39 w(asn1)e Fe(authenticator)p Fi(,)35 b(Shishi)p 2886 2938 V 39 w(asn1)565 3047 y Fe(oldenckdcreppart)p Fi(,)h(Shishi)p 1703 3047 V 38 w(asn1)31 b(*)g Fe(enckdcreppart)p Ff(\))390 3157 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3294 y Fi(tgsreq)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(that)g(holds)f(the)g(sen)m(t)h(KDC-REQ.)390 3431 y Fi(tgsrep)s Fw(:)41 b(input)29 b(v)-5 b(ariable)31 b(that)g(holds)f (the)h(receiv)m(ed)g(KDC-REP)-8 b(.)390 3568 y Fi(authen)m(ticator)7 b Fw(:)42 b(input)30 b(v)-5 b(ariable)31 b(with)f(Authen)m(ticator)i (from)e(AP-REQ)g(in)g(KDC-REQ.)390 3705 y Fi(oldenc)m(kdcreppart)r Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(EncKDCRepP)m(art)g (used)g(in)g(request.)390 3842 y Fi(enc)m(kdcreppart)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(that)g(holds)f(new)g (EncKDCRepP)m(art.)390 3980 y(Pro)s(cess)i(a)h(TGS)e(clien)m(t)j(exc)m (hange)f(and)f(output)g(decrypted)f(EncKDCRepP)m(art)i(whic)m(h)e (holds)390 4089 y(details)k(for)f(the)h(new)e(tic)m(k)m(et)k(receiv)m (ed.)54 b(This)33 b(function)h(simply)g(deriv)m(es)h(the)f(encryption)g (k)m(ey)390 4199 y(from)27 b(the)h(tic)m(k)m(et)i(used)d(to)i (construct)f(the)g(TGS)f(request)g(and)g(calls)i Fq (shishi_kdc_process\(\))p Fw(,)390 4308 y(whic)m(h)h(see.)390 4445 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4445 V 39 w(OK)f(i\013)i(the)f(TGS)g(clien)m(t)i(exc)m(hange)g(w)m (as)f(successful.)150 4647 y Fl(shishi)p 459 4647 37 5 v 55 w(as)p 622 4647 V 54 w(pro)s(cess)3350 4847 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_as_process)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2287 4847 28 4 v 39 w(asn1)f Fe(asreq)p Fi(,)565 4956 y(Shishi)p 810 4956 V 39 w(asn1)g Fe(asrep)p Fi(,)h(const)f(c)m(har)f (*)h Fe(string)p Fi(,)h(Shishi)p 2495 4956 V 39 w(asn1)f(*)g Fe(enckdcreppart)p Ff(\))390 5066 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5203 y Fi(asreq)r Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(sen)m(t)g(KDC-REQ.)390 5340 y Fi(asrep)s Fw(:)40 b(input)30 b(v)-5 b(ariable)31 b(that)g(holds)f(the)g(receiv)m(ed)i(KDC-REP)-8 b(.)p eop end %%Page: 135 141 TeXDict begin 135 140 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(135)390 299 y Fi(string)8 b Fw(:)40 b(input)30 b(v)-5 b(ariable)31 b(with)f(zero)h(terminated)g (passw)m(ord.)390 452 y Fi(enc)m(kdcreppart)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(that)g(holds)f(new)g(EncKDCRepP)m (art.)390 605 y(Pro)s(cess)k(an)g(AS)f(clien)m(t)j(exc)m(hange)f(and)f (output)f(decrypted)h(EncKDCRepP)m(art)g(whic)m(h)f(holds)390 715 y(details)i(for)f(the)h(new)e(tic)m(k)m(et)k(receiv)m(ed.)54 b(This)33 b(function)h(simply)g(deriv)m(es)h(the)f(encryption)g(k)m(ey) 390 825 y(from)c(the)g(passw)m(ord)g(and)g(calls)h Fq (shishi_kdc_process\(\))p Fw(,)26 b(whic)m(h)k(see.)390 978 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 978 28 4 v 39 w(OK)f(i\013)i(the)f(AS)g(clien)m(t)i(exc)m(hange)g (w)m(as)f(successful.)150 1196 y Fl(shishi)p 459 1196 37 5 v 55 w(kdc)p 702 1196 V 54 w(pro)s(cess)3350 1411 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdc_process)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 1411 28 4 v 39 w(asn1)d Fe(kdcreq)p Fi(,)565 1521 y(Shishi)p 810 1521 V 39 w(asn1)h Fe(kdcrep)p Fi(,)h(Shishi)p 1665 1521 V 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)g(in)m(t)g Fe(keyusage)p Fi(,)i(Shishi)p 3008 1521 V 39 w(asn1)e(*)565 1630 y Fe(enckdcreppart)p Ff(\))390 1740 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1893 y Fi(kdcreq)r Fw(:)41 b(input)29 b(v)-5 b(ariable)31 b(that)g(holds)f(the)h(sen)m(t)g (KDC-REQ.)390 2046 y Fi(kdcrep)s Fw(:)40 b(input)29 b(v)-5 b(ariable)31 b(that)g(holds)f(the)h(receiv)m(ed)h(KDC-REP)-8 b(.)390 2200 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(k)m (ey)h(to)g(decrypt)f(encrypted)g(part)g(of)h(KDC-REP)f(with.)390 2353 y Fi(k)m(eyusage)5 b Fw(:)42 b(k)m(ereros)31 b(k)m(ey)g(usage)g(v) -5 b(alue.)390 2506 y Fi(enc)m(kdcreppart)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(that)g(holds)f(new)g(EncKDCRepP)m(art.)390 2659 y(Pro)s(cess)g(a)h(KDC)f(clien)m(t)i(exc)m(hange)g(and)d(output)h (decrypted)g(EncKDCRepP)m(art)g(whic)m(h)g(holds)390 2769 y(details)d(for)f(the)g(new)g(tic)m(k)m(et)j(receiv)m(ed.)41 b(Use)26 b Fq(shishi_kdcrep_get_ticket\()o(\))20 b Fw(to)27 b(extract)h(the)390 2878 y(tic)m(k)m(et.)46 b(This)30 b(function)h(v)m(eri\014es)g(the)h(v)-5 b(arious)31 b(conditions)h (that)f(m)m(ust)g(hold)g(if)g(the)h(resp)s(onse)e(is)390 2988 y(to)e(b)s(e)e(considered)h(v)-5 b(alid,)29 b(sp)s(eci\014cally)f (it)f(compares)h(nonces)f(\()p Fq(shishi_kdc_check_nonce\(\))p Fw(\))390 3098 y(and)f(if)g(the)h(exc)m(hange)h(w)m(as)f(a)f(AS)g(exc)m (hange,)j(it)e(also)h(compares)f(cname)f(and)g(crealm)i(\()p Fq(shishi_)390 3207 y(as_check_cname\(\))e Fw(and)k Fq (shishi_as_check_crealm\()o(\))p Fw(\).)390 3360 y(Usually)h(the)g Fq(shishi_as_process\(\))25 b Fw(and)30 b Fq(shishi_tgs_process\(\))c Fw(functions)k(should)g(b)s(e)390 3470 y(used)g(instead,)g(since)h (they)g(simplify)f(the)g(decryption)h(k)m(ey)g(computation.)390 3623 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3623 V 39 w(OK)f(i\013)i(the)f(KDC)h(clien)m(t)h(exc)m(hange)f(w)m (as)g(successful.)150 3841 y Fl(shishi)p 459 3841 37 5 v 55 w(asreq)3350 4057 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asreq)49 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4166 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4320 y(This)g(function)g(creates)h(a)g(new)f(AS-REQ,)g(p)s (opulated)g(with)g(some)h(default)f(v)-5 b(alues.)390 4473 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(AS-REQ)g(or)g(NULL)h(on)f(failure.)150 4691 y Fl(shishi)p 459 4691 V 55 w(tgsreq)3350 4906 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tgsreq)49 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 5016 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5169 y(This)g(function)g(creates)h (a)g(new)f(TGS-REQ,)g(p)s(opulated)g(with)g(some)h(default)f(v)-5 b(alues.)390 5322 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(TGS-REQ)g(or)g(NULL)g(on)h(failure.)p eop end %%Page: 136 142 TeXDict begin 136 141 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(136)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(prin)m(t)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_print)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2869 516 28 4 v 39 w(asn1)565 626 y Fe(kdcreq)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 1045 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(prin)m(t.)390 1200 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco) s(ding)f(of)h(KDC-REQ)f(to)h(\014le.)390 1356 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1356 V 39 w(OK)f(i\013)i(successful.)150 1575 y Fl(shishi)p 459 1575 37 5 v 55 w(kdcreq)p 873 1575 V 54 w(sa)m(v)m(e)3350 1793 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_save)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 1793 28 4 v 39 w(asn1)565 1902 y Fe(kdcreq)p Ff(\))390 2012 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2167 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 2322 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(sa)m(v)m(e.)390 2477 y(Prin)m(t)f(DER)h(enco)s(ding)f(of)h (KDC-REQ)f(to)h(\014le.)390 2632 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2632 V 39 w(OK)f(i\013)i(successful.) 150 2852 y Fl(shishi)p 459 2852 37 5 v 55 w(kdcreq)p 873 2852 V 54 w(to)p 1036 2852 V 54 w(\014le)3350 3069 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_to_file)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3069 28 4 v 39 w(asn1)d Fe(kdcreq)p Fi(,)565 3179 y(in)m(t)h Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3288 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3443 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(sa)m(v)m(e.)390 3598 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g(b)s(e)e (written,)i(see)g(Shishi)p 3182 3598 V 39 w(\014let)m(yp)s(e.)390 3753 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(write)g(to.)390 3908 y(W)-8 b(rite)32 b(KDC-REQ)e(to)h(\014le)f(in)g(sp)s(eci\014ed)g(TYPE.)g(The)g (\014le)g(will)h(b)s(e)f(truncated)g(if)h(it)g(exists.)390 4064 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4064 V 39 w(OK)f(i\013)i(successful.)150 4283 y Fl(shishi)p 459 4283 37 5 v 55 w(kdcreq)p 873 4283 V 54 w(parse)3350 4501 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_parse)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2869 4501 28 4 v 39 w(asn1)g(*)565 4610 y Fe(kdcreq)p Ff(\))390 4720 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4875 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.)390 5030 y Fi(kdcreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(KDC-REQ.)390 5185 y(Read)26 b(ASCI)s(I)f(armored)g(DER)h(enco)s(ded)g(KDC-REQ)f(from)h(\014le)g (and)f(p)s(opulate)h(giv)m(en)h(v)-5 b(ariable.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 137 143 TeXDict begin 137 142 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(137)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(read)3350 510 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_read)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 510 28 4 v 39 w(asn1)f(*)565 620 y Fe(kdcreq)p Ff(\))390 729 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 878 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 1027 y Fi(kdcreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(KDC-REQ.)390 1176 y(Read)f(DER)f(enco)s(ded)g(KDC-REQ)g(from)g(\014le)g(and)g(p)s (opulate)g(giv)m(en)i(v)-5 b(ariable.)390 1325 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1325 V 39 w(OK)f(i\013)i(successful.)150 1538 y Fl(shishi)p 459 1538 37 5 v 55 w(kdcreq)p 873 1538 V 54 w(from)p 1177 1538 V 55 w(\014le)3350 1749 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_from_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 1749 28 4 v 39 w(asn1)f(*)565 1859 y Fe(kdcreq)p Fi(,)h(in)m(t)f Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(filename)p Ff(\))390 1968 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2117 y Fi(kdcreq)r Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i (KDC-REQ.)390 2266 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f (\014le)h(to)g(b)s(e)e(read,)i(see)g(Shishi)p 3066 2266 V 39 w(\014let)m(yp)s(e.)390 2415 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read) g(from.)390 2564 y(Read)g(KDC-REQ)e(from)h(\014le)h(in)f(sp)s (eci\014ed)g(TYPE.)390 2713 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2713 V 39 w(OK)f(i\013)i(successful.) 150 2926 y Fl(shishi)p 459 2926 37 5 v 55 w(kdcreq)p 873 2926 V 54 w(nonce)p 1235 2926 V 54 w(set)3350 3137 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_nonce_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 3137 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 3247 y(uin)m(t32)p 820 3247 V 41 w(t)g Fe(nonce)p Ff(\))390 3357 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3505 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(clien)m(t)h(name) e(\014eld)g(in.)390 3654 y Fi(nonce)5 b Fw(:)41 b(in)m(teger)32 b(nonce)e(to)h(store)g(in)g(KDC-REQ.)390 3803 y(Store)g(nonce)f(n)m(um) m(b)s(er)f(\014eld)h(in)g(KDC-REQ.)390 3952 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4165 y Fl(shishi)p 459 4165 37 5 v 55 w(kdcreq)p 873 4165 V 54 w(set)p 1079 4165 V 54 w(cname)3350 4377 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_set_cna)q(me)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 4377 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 4486 y(Shishi)p 810 4486 V 39 w(name)p 1061 4486 V 40 w(t)m(yp)s(e)g Fe(name_type)p Fi(,)i(const)e(c)m(har)g(*)f Fe(principal)p Ff(\))390 4596 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4745 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(clien)m(t)h(name)e(\014eld)g(in.)390 4893 y Fi(name)p 608 4893 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 4893 V 39 w(name)p 2224 4893 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 4893 V 39 w(NT)p 3264 4893 V 40 w(UNKNO)m(WN.)390 5042 y Fi(principal)t Fw(:)40 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 5191 y(Set)h(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f (KDC-REQ.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 138 144 TeXDict begin 138 143 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(138)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(clien)m(t)3350 492 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_client)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 492 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 601 y(c)m(har)g(**)g Fe(client)p Fi(,)h(size)p 1402 601 V 41 w(t)f(*)g Fe(clientlen)p Ff(\))390 711 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 844 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(clien)m(t)h(name)f(from.) 390 976 y Fi(clien)m(t)r Fw(:)48 b(p)s(oin)m(ter)34 b(to)g(newly)f (allo)s(cated)i(zero)f(terminated)g(string)g(con)m(taining)h(principal) e(name.)390 1086 y(Ma)m(y)f(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(clientlen)p Fw(\).)390 1218 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 1328 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 1461 y(Represen)m(t)i(clien)m(t)i(principal)e (name)g(in)g(KDC-REQ)f(as)i(zero-terminated)h(string.)45 b(The)32 b(string)390 1570 y(is)h(allo)s(cate)j(b)m(y)e(this)f (function,)h(and)f(it)h(is)f(the)h(resp)s(onsibilit)m(y)f(of)h(the)f (caller)i(to)f(deallo)s(cate)i(it.)390 1680 y(Note)c(that)f(the)f (output)g(length)h Fq(clientlen)d Fw(do)s(es)i(not)g(include)h(the)f (terminating)h(zero.)390 1812 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1812 V 39 w(OK)f(i\013)i(successful.) 150 2008 y Fl(shishi)p 459 2008 37 5 v 55 w(asreq)p 793 2008 V 54 w(clien)m(trealm)3350 2201 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_asreq_clientre)q(alm)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 2201 28 4 v 38 w(asn1)e Fe(asreq)p Fi(,)565 2310 y(c)m(har)g(**)g Fe(client)p Fi(,)h(size)p 1402 2310 V 41 w(t)f(*)g Fe(clientlen)p Ff(\))390 2420 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2553 y Fi(asreq)r Fw(:)41 b(AS-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)h(clien)m(t)g(name)e(and)g(realm)h(from.)390 2685 y Fi(clien)m(t)r Fw(:)53 b(p)s(oin)m(ter)36 b(to)g(newly)f(allo)s (cated)j(zero)e(terminated)h(string)e(con)m(taining)j(principal)d(name) 390 2795 y(and)30 b(realm.)41 b(Ma)m(y)31 b(b)s(e)f Fq(NULL)f Fw(\(to)j(only)e(p)s(opulate)h Fq(clientlen)p Fw(\).)390 2927 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of) g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 3037 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 3170 y(Con)m(v)m(ert)37 b(cname)g(and)f(realm)g (\014elds)g(from)g(AS-REQ)f(to)j(prin)m(table)e(principal)g(name)g (format.)390 3279 y(The)j(string)h(is)g(allo)s(cate)i(b)m(y)e(this)g (function,)i(and)d(it)h(is)g(the)g(resp)s(onsibilit)m(y)g(of)g(the)g (caller)h(to)390 3389 y(deallo)s(cate)24 b(it.)38 b(Note)22 b(that)g(the)g(output)f(length)g Fq(clientlen)e Fw(do)s(es)i(not)h (include)f(the)g(terminating)390 3498 y(zero.)390 3631 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3631 V 39 w(OK)f(i\013)i(successful.)150 3826 y Fl(shishi)p 459 3826 37 5 v 55 w(kdcreq)p 873 3826 V 54 w(realm)3350 4019 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_realm)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 4019 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)h(c)m(har)565 4129 y(**)f Fe(realm)p Fi(,)h(size)p 1150 4129 V 41 w(t)f(*)g Fe(realmlen)p Ff(\))390 4239 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 4371 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(clien)m(t)h(name) f(from.)390 4504 y Fi(realm)p Fw(:)49 b(p)s(oin)m(ter)35 b(to)g(newly)f(allo)s(cated)j(zero)e(terminated)g(string)f(con)m (taining)i(realm.)54 b(Ma)m(y)36 b(b)s(e)390 4613 y Fq(NULL)29 b Fw(\(to)j(only)e(p)s(opulate)g Fq(realmlen)p Fw(\).)390 4746 y Fi(realmlen)p Fw(:)42 b(p)s(oin)m(ter)30 b(to)i(length)f(of)g Fq(realm)e Fw(on)h(output,)h(excluding)g(terminating)g(zero.)43 b(Ma)m(y)32 b(b)s(e)390 4856 y Fq(NULL)d Fw(\(to)j(only)e(p)s(opulate)g Fq(realmlen)p Fw(\).)390 4988 y(Get)41 b(realm)f(\014eld)f(in)g (KDC-REQ)h(as)f(zero-terminated)j(string.)68 b(The)40 b(string)f(is)h(allo)s(cate)i(b)m(y)390 5098 y(this)31 b(function,)h(and)e(it)i(is)g(the)f(resp)s(onsibilit)m(y)h(of)f(the)h (caller)g(to)g(deallo)s(cate)i(it.)44 b(Note)33 b(that)f(the)390 5207 y(output)e(length)h Fq(realmlen)d Fw(do)s(es)i(not)h(include)f (the)g(terminating)h(zero.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 139 145 TeXDict begin 139 144 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(139)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(set)p 1079 299 V 54 w(realm)3350 499 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_set_rea)q(lm)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 499 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 609 y(const)g(c)m(har)g(*)f Fe(realm)p Ff(\))390 718 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 856 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(realm)g(\014eld)e(in.)390 994 y Fi(realm)p Fw(:)41 b(input)30 b(arra)m(y)g(with)h(name)f(of)g(realm.) 390 1132 y(Set)h(the)f(realm)h(\014eld)f(in)g(the)h(KDC-REQ.)390 1270 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1270 V 39 w(OK)f(i\013)i(successful.)150 1473 y Fl(shishi)p 459 1473 37 5 v 55 w(kdcreq)p 873 1473 V 54 w(serv)m(er)3350 1673 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_server)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 1673 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 1783 y(c)m(har)g(**)g Fe(server)p Fi(,)h(size)p 1402 1783 V 41 w(t)f(*)g Fe(serverlen)p Ff(\))390 1892 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2030 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(serv)m(er)g(name)f(from.)390 2168 y Fi(serv)m(er)7 b Fw(:)42 b(p)s(oin)m(ter)32 b(to)g(newly)f(allo)s(cated)i(zero)f (terminated)g(string)f(con)m(taining)i(principal)e(name.)390 2278 y(Ma)m(y)h(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)h Fq(serverlen)p Fw(\).)390 2416 y Fi(serv)m(erlen)p Fw(:)51 b(p)s(oin)m(ter)35 b(to)h(length)g(of)f Fq(server)f Fw(on)h(output,)h (excluding)g(terminating)g(zero.)56 b(Ma)m(y)390 2525 y(b)s(e)30 b Fq(NULL)f Fw(\(to)i(only)g(p)s(opulate)f Fq(server)p Fw(\).)390 2663 y(Represen)m(t)h(serv)m(er)g(principal)f (name)g(in)h(KDC-REQ)f(as)h(zero-terminated)h(string.)41 b(The)30 b(string)390 2773 y(is)j(allo)s(cate)j(b)m(y)e(this)f (function,)h(and)f(it)h(is)f(the)h(resp)s(onsibilit)m(y)f(of)h(the)f (caller)i(to)f(deallo)s(cate)i(it.)390 2882 y(Note)c(that)f(the)f (output)g(length)h Fq(serverlen)d Fw(do)s(es)i(not)g(include)h(the)f (terminating)h(zero.)390 3020 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3020 V 39 w(OK)f(i\013)i(successful.) 150 3223 y Fl(shishi)p 459 3223 37 5 v 55 w(kdcreq)p 873 3223 V 54 w(set)p 1079 3223 V 54 w(sname)3350 3423 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_set_sna)q(me)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 3423 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 3533 y(Shishi)p 810 3533 V 39 w(name)p 1061 3533 V 40 w(t)m(yp)s(e)g Fe(name_type)p Fi(,)i(const)e(c)m(har)g(*)f Fd([])g Fe(sname)p Ff(\))390 3643 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3780 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(serv)m(er)f(name)h(\014eld)f(in.)390 3918 y Fi(name)p 608 3918 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 3918 V 39 w(name)p 2224 3918 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 3918 V 39 w(NT)p 3264 3918 V 40 w(UNKNO)m(WN.)390 4056 y Fi(sname)5 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 4194 y(Set)h(the)f(serv)m(er)h(name)f(\014eld)g(in)g(the)h (KDC-REQ.)390 4332 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4332 V 39 w(OK)f(i\013)i(successful.)150 4535 y Fl(shishi)p 459 4535 37 5 v 55 w(kdcreq)p 873 4535 V 54 w(till)3350 4735 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_till)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 4735 28 4 v 39 w(asn1)d Fe(kdcreq)p Fi(,)j(c)m(har)565 4845 y(**)e Fe(till)p Fi(,)h(size)p 1098 4845 V 41 w(t)f(*)f Fe(tilllen)p Ff(\))390 4954 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j (b)m(y)f Fq(shishi_init\(\))p Fw(.)390 5092 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(clien)m(t)h(name) f(from.)390 5230 y Fi(till)t Fw(:)65 b(p)s(oin)m(ter)42 b(to)h(newly)f(allo)s(cated)i(zero)f(terminated)f(string)g(con)m (taining)i Fq(")p Fw(till)p Fq(")f Fw(\014eld)e(with)390 5340 y(generalized)32 b(time.)41 b(Ma)m(y)32 b(b)s(e)e Fq(NULL)f Fw(\(to)i(only)g(p)s(opulate)f Fq(realmlen)p Fw(\).)p eop end %%Page: 140 146 TeXDict begin 140 145 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(140)390 299 y Fi(tilllen)p Fw(:)39 b(p)s(oin)m(ter)26 b(to)g(length)g(of)f Fq(till)g Fw(on)g(output,)h(excluding)g(terminating)g(zero.)40 b(Ma)m(y)26 b(b)s(e)f Fq(NULL)390 408 y Fw(\(to)31 b(only)g(p)s (opulate)f Fq(tilllen)p Fw(\).)390 543 y(Get)i Fq(")p Fw(till)p Fq(")f Fw(\014eld)f(\(i.e.)42 b Fq(")p Fw(endtime)p Fq(")p Fw(\))31 b(in)f(KDC-REQ,)h(as)f(zero-terminated)j(string.)41 b(The)30 b(string)390 652 y(is)h(t)m(ypically)j(15)e(c)m(haracters)h (long.)44 b(The)31 b(string)g(is)h(allo)s(cated)h(b)m(y)f(this)f (function,)h(and)e(it)i(is)g(the)390 762 y(resp)s(onsibilit)m(y)38 b(of)g(the)f(caller)j(to)e(deallo)s(cate)i(it.)63 b(Note)39 b(that)g(the)f(output)f(length)h Fq(realmlen)390 871 y Fw(do)s(es)30 b(not)h(include)f(the)g(terminating)i(zero.)390 1006 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1006 28 4 v 39 w(OK)f(i\013)i(successful.)150 1204 y Fl(shishi)p 459 1204 37 5 v 55 w(kdcreq)p 873 1204 V 54 w(tillc)3350 1400 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_kdcreq_tillc)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 1400 28 4 v 39 w(asn1)e Fe(kdcreq)p Ff(\))390 1510 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 1644 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(till)h(\014eld)e(from.)390 1778 y(Extract)h(C)f(time)h(corresp)s(onding)f(to)h(the)f Fq(")p Fw(till)p Fq(")h Fw(\014eld.)390 1913 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h(in)m(terpretation)g(of)g(the)g Fq(")p Fw(till)p Fq(")f Fw(\014eld)g(in)g(KDC-REQ.)150 2111 y Fl(shishi)p 459 2111 37 5 v 55 w(kdcreq)p 873 2111 V 54 w(et)m(yp)s(e)3350 2307 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_etype)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 2307 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 2417 y(in)m(t32)p 769 2417 V 42 w(t)f(*)h Fe(etype)p Fi(,)h(in)m(t)f Fe(netype)p Ff(\))390 2526 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2661 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(et)m(yp)s(e)g(\014eld)f(from.)390 2795 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(encryption)h(t)m(yp)s(e.)390 2929 y Fi(net)m(yp)s(e)5 b Fw(:)41 b(elemen)m(t)32 b(n)m(um)m(b)s(er)d (to)i(return.)390 3063 y Fk(Return)c(the)g(net)m(yp)s(e:)39 b Fw(th)27 b(encryption)g(t)m(yp)s(e)g(from)g(KDC-REQ.)f(The)h(\014rst) f(et)m(yp)s(e)i(is)f(n)m(um)m(b)s(er)e(1.)390 3197 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3197 V 39 w(OK)f(i\013)i(et)m(yp)s(e)g(successful)f(set.)150 3396 y Fl(shishi)p 459 3396 37 5 v 55 w(kdcreq)p 873 3396 V 54 w(set)p 1079 3396 V 54 w(et)m(yp)s(e)3350 3592 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_set_ety)q(pe)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 3592 28 4 v 39 w(asn1)f Fe(kdcreq)p Fi(,)565 3702 y(in)m(t32)p 769 3702 V 42 w(t)f(*)h Fe(etype)p Fi(,)h(in)m(t)f Fe(netype)p Ff(\))390 3811 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3946 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(et)m(yp)s(e)g(\014eld)f(in.)390 4080 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f (encryption)g(t)m(yp)s(es.)390 4214 y Fi(net)m(yp)s(e)5 b Fw(:)41 b(n)m(um)m(b)s(er)29 b(of)h(elemen)m(ts)i(in)e(input)g(arra)m (y)h(with)f(encryption)g(t)m(yp)s(es.)390 4348 y(Set)j(the)g(list)g(of) f(supp)s(orted)f(or)i(w)m(an)m(ted)g(encryption)g(t)m(yp)s(es)f(in)g (the)h(request.)48 b(The)32 b(list)h(should)390 4458 y(b)s(e)d(sorted)g(in)g(priorit)m(y)h(order.)390 4592 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4592 V 39 w(OK)f(i\013)i(successful.)150 4790 y Fl(shishi)p 459 4790 37 5 v 55 w(kdcreq)p 873 4790 V 54 w(options)3350 4987 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_options)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 4987 28 4 v 39 w(asn1)d Fe(kdcreq)p Fi(,)565 5096 y(uin)m(t32)p 820 5096 V 41 w(t)h(*)g Fe(flags)p Ff(\))390 5206 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f (from.)p eop end %%Page: 141 147 TeXDict begin 141 146 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(141)390 299 y Fi(\015ags)t Fw(:)41 b(p)s(oin)m(ter)30 b(to)h(output)f(in)m(teger)i(with)e (\015ags.)390 454 y(Extract)h(KDC-Options)f(from)g(KDC-REQ.)390 610 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 610 28 4 v 39 w(OK)f(i\013)i(successful.)150 830 y Fl(shishi)p 459 830 37 5 v 55 w(kdcreq)p 873 830 V 54 w(forw)m(ardable)p 1557 830 V 54 w(p)3350 1048 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_forward)q(able)q(_p)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 1048 28 4 v 38 w(asn1)565 1157 y Fe(kdcreq)p Ff(\))390 1267 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1422 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)390 1578 y(Determine)h(if)g(KDC-Option)f(forw)m (ardable)g(\015ag)h(is)g(set.)390 1733 y(The)41 b(F)m(OR)-10 b(W)g(ARD)m(ABLE)43 b(option)f(indicates)h(that)f(the)f(tic)m(k)m(et)j (to)f(b)s(e)d(issued)h(is)h(to)g(ha)m(v)m(e)h(its)390 1843 y(forw)m(ardable)c(\015ag)f(set.)66 b(It)38 b(ma)m(y)h(only)g(b)s (e)f(set)h(on)f(the)h(initial)g(request,)i(or)e(in)f(a)h(subsequen)m(t) 390 1952 y(request)30 b(if)h(the)f(tic)m(k)m(et-gran)m(ting)35 b(tic)m(k)m(et)e(on)d(whic)m(h)g(it)h(is)f(based)g(is)h(also)g(forw)m (ardable.)390 2107 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(forw)m(ardable)f(\015ag)h(is)f(set)h(in)f(KDC-REQ.) 150 2328 y Fl(shishi)p 459 2328 37 5 v 55 w(kdcreq)p 873 2328 V 54 w(forw)m(arded)p 1463 2328 V 54 w(p)3350 2545 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_forward)q (ed_p)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2545 28 4 v 39 w(asn1)565 2655 y Fe(kdcreq)p Ff(\))390 2765 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2920 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)390 3075 y(Determine)h(if)g(KDC-Option)f(forw)m(arded) g(\015ag)g(is)h(set.)390 3231 y(The)e(F)m(OR)-10 b(W)g(ARDED)31 b(option)f(is)f(only)h(sp)s(eci\014ed)e(in)h(a)h(request)g(to)g(the)f (tic)m(k)m(et-gran)m(ting)34 b(serv)m(er)390 3340 y(and)40 b(will)h(only)g(b)s(e)f(honored)g(if)h(the)g(tic)m(k)m(et-gran)m(ting)k (tic)m(k)m(et)e(in)e(the)g(request)g(has)f(its)h(F)m(OR-)390 3450 y(W)-10 b(ARD)m(ABLE)29 b(bit)e(set.)40 b(This)26 b(option)h(indicates)h(that)g(this)f(is)g(a)g(request)g(for)g(forw)m (arding.)39 b(The)390 3559 y(address\(es\))33 b(of)g(the)g(host)g(from) g(whic)m(h)f(the)h(resulting)g(tic)m(k)m(et)j(is)d(to)g(b)s(e)g(v)-5 b(alid)33 b(are)g(included)f(in)390 3669 y(the)f(addresses)e(\014eld)h (of)h(the)f(request.)390 3824 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(forw)m(arded)e(\015ag)i(is)g(set)f (in)h(KDC-REQ.)150 4045 y Fl(shishi)p 459 4045 37 5 v 55 w(kdcreq)p 873 4045 V 54 w(pro)m(xiable)p 1420 4045 V 54 w(p)3350 4262 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_proxiab)q(le_p)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 4262 28 4 v 39 w(asn1)565 4372 y Fe(kdcreq)p Ff(\))390 4481 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4637 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f (from.)390 4792 y(Determine)h(if)g(KDC-Option)f(pro)m(xiable)h(\015ag)g (is)f(set.)390 4948 y(The)24 b(PR)m(O)m(XIABLE)i(option)f(indicates)h (that)g(the)f(tic)m(k)m(et)j(to)d(b)s(e)g(issued)f(is)h(to)h(ha)m(v)m (e)g(its)f(pro)m(xiable)390 5057 y(\015ag)35 b(set.)53 b(It)35 b(ma)m(y)g(only)f(b)s(e)g(set)h(on)g(the)f(initial)i(request,)g (or)e(in)g(a)h(subsequen)m(t)f(request)g(if)h(the)390 5167 y(tic)m(k)m(et-gran)m(ting)f(tic)m(k)m(et)f(on)e(whic)m(h)f(it)h (is)f(based)g(is)g(also)i(pro)m(xiable.)390 5322 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(pro)m(xiable)g(\015ag)g (is)f(set)h(in)f(KDC-REQ.)p eop end %%Page: 142 148 TeXDict begin 142 147 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(142)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(pro)m(xy)p 1233 299 V 54 w(p)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_proxy_p)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 498 28 4 v 39 w(asn1)d Fe(kdcreq)p Ff(\))390 607 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 744 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f(from.)390 881 y(Determine)h(if)g(KDC-Option)f(pro)m(xy)g(\015ag)h(is)f(set.)390 1018 y(The)d(PR)m(O)m(XY)i(option)f(indicates)h(that)f(this)g(is)g(a)g (request)g(for)f(a)h(pro)m(xy)-8 b(.)40 b(This)27 b(option)i(will)f (only)390 1127 y(b)s(e)35 b(honored)f(if)h(the)h(tic)m(k)m(et-gran)m (ting)j(tic)m(k)m(et)f(in)d(the)g(request)g(has)g(its)h(PR)m(O)m (XIABLE)g(bit)f(set.)390 1237 y(The)27 b(address\(es\))h(of)f(the)h (host)g(from)f(whic)m(h)g(the)h(resulting)f(tic)m(k)m(et)j(is)e(to)g(b) s(e)f(v)-5 b(alid)28 b(are)g(included)390 1346 y(in)i(the)h(addresses)e (\014eld)h(of)h(the)f(request.)390 1483 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(pro)m(xy)f(\015ag)h(is)f (set)h(in)f(KDC-REQ.)150 1685 y Fl(shishi)p 459 1685 37 5 v 55 w(kdcreq)p 873 1685 V 54 w(allo)m(w)p 1202 1685 V 53 w(p)s(ostdate)p 1715 1685 V 55 w(p)3350 1884 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_allow_p)q(ostd) q(ate)q(_p)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 1884 28 4 v 39 w(asn1)565 1993 y Fe(kdcreq)p Ff(\))390 2103 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2240 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)390 2376 y(Determine)h(if)g(KDC-Option)f(allo)m(w-p)s (ostdate)j(\015ag)d(is)h(set.)390 2513 y(The)39 b(ALLO)m(W-POSTD)m(A)-8 b(TE)41 b(option)f(indicates)h(that)f(the)g(tic)m(k)m(et)j(to)e(b)s(e)e (issued)g(is)h(to)h(ha)m(v)m(e)390 2623 y(its)h(MA)-8 b(Y-POSTD)m(A)g(TE)43 b(\015ag)f(set.)76 b(It)42 b(ma)m(y)g(only)g(b)s (e)f(set)i(on)e(the)h(initial)h(request,)i(or)d(in)g(a)390 2732 y(subsequen)m(t)25 b(request)i(if)f(the)g(tic)m(k)m(et-gran)m (ting)k(tic)m(k)m(et)f(on)d(whic)m(h)g(it)h(is)f(based)g(also)h(has)f (its)h(MA)-8 b(Y-)390 2842 y(POSTD)m(A)g(TE)30 b(\015ag)h(set.)390 2979 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h (allo)m(w-p)s(ostdate)h(\015ag)f(is)f(set)h(in)f(KDC-REQ.)150 3180 y Fl(shishi)p 459 3180 37 5 v 55 w(kdcreq)p 873 3180 V 54 w(p)s(ostdated)p 1455 3180 V 55 w(p)3350 3379 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_postdat)q(ed_p) f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 3379 28 4 v 39 w(asn1)565 3489 y Fe(kdcreq)p Ff(\))390 3598 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3735 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)390 3872 y(Determine)h(if)g(KDC-Option)f(p)s(ostdated) g(\015ag)h(is)f(set.)390 4008 y(The)c(POSTD)m(A)-8 b(TED)26 b(option)h(indicates)g(that)g(this)f(is)h(a)f(request)h(for)f(a)h(p)s (ostdated)f(tic)m(k)m(et.)42 b(This)390 4118 y(option)34 b(will)g(only)g(b)s(e)g(honored)f(if)h(the)g(tic)m(k)m(et-gran)m(ting)j (tic)m(k)m(et)g(on)d(whic)m(h)f(it)i(is)e(based)h(has)g(its)390 4228 y(MA)-8 b(Y-POSTD)m(A)g(TE)32 b(\015ag)f(set.)43 b(The)31 b(resulting)g(tic)m(k)m(et)i(will)e(also)h(ha)m(v)m(e)g(its)g (INV)-10 b(ALID)31 b(\015ag)g(set,)390 4337 y(and)i(that)i(\015ag)f(ma) m(y)g(b)s(e)g(reset)g(b)m(y)g(a)g(subsequen)m(t)f(request)h(to)h(the)f (KDC)f(after)i(the)f(starttime)390 4447 y(in)c(the)h(tic)m(k)m(et)i (has)d(b)s(een)f(reac)m(hed.)390 4584 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(p)s(ostdated)f(\015ag)h (is)f(set)h(in)f(KDC-REQ.)150 4785 y Fl(shishi)p 459 4785 37 5 v 55 w(kdcreq)p 873 4785 V 54 w(renew)m(able)p 1461 4785 V 53 w(p)3350 4984 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_renewab)q(le_p)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 4984 28 4 v 39 w(asn1)565 5094 y Fe(kdcreq)p Ff(\))390 5203 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)p eop end %%Page: 143 149 TeXDict begin 143 148 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(143)390 299 y(Determine)31 b(if)g(KDC-Option)f(renew)m(able)h(\015ag)g(is)f(set.)390 436 y(The)20 b(RENEW)-10 b(ABLE)20 b(option)h(indicates)g(that)g(the)g (tic)m(k)m(et)i(to)e(b)s(e)e(issued)h(is)g(to)h(ha)m(v)m(e)h(its)e (RENEW-)390 546 y(ABLE)30 b(\015ag)h(set.)41 b(It)30 b(ma)m(y)h(only)f(b)s(e)f(set)i(on)f(the)g(initial)h(request,)g(or)f (when)f(the)h(tic)m(k)m(et-gran)m(ting)390 655 y(tic)m(k)m(et)41 b(on)e(whic)m(h)f(the)h(request)f(is)h(based)f(is)g(also)i(renew)m (able.)66 b(If)38 b(this)g(option)h(is)g(requested,)390 765 y(then)34 b(the)g(rtime)h(\014eld)e(in)h(the)g(request)h(con)m (tains)g(the)f(desired)g(absolute)h(expiration)f(time)h(for)390 874 y(the)c(tic)m(k)m(et.)390 1011 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(renew)m(able)g(\015ag)f (is)h(set)g(in)f(KDC-REQ.)150 1213 y Fl(shishi)p 459 1213 37 5 v 55 w(kdcreq)p 873 1213 V 54 w(disable)p 1295 1213 V 54 w(transited)p 1829 1213 V 54 w(c)m(hec)m(k)p 2176 1213 V 53 w(p)3350 1413 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_disable)q(_tra)q(nsi)q(ted)q(_ch)q(eck_)q (p)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 1522 y(Shishi)p 810 1522 28 4 v 39 w(asn1)g Fe(kdcreq)p Ff(\))390 1632 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1769 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f(from.)390 1906 y(Determine)h(if)g (KDC-Option)f(disable-transited-c)m(hec)m(k)j(\015ag)e(is)f(set.)390 2043 y(By)k(default)g(the)g(KDC)f(will)h(c)m(hec)m(k)i(the)e(transited) g(\014eld)f(of)h(a)g(tic)m(k)m(et-gran)m(ting-tic)m(k)m(e)q(t)40 b(against)390 2153 y(the)28 b(p)s(olicy)h(of)f(the)g(lo)s(cal)i(realm)e (b)s(efore)g(it)g(will)h(issue)f(deriv)-5 b(ativ)m(e)29 b(tic)m(k)m(ets)i(based)d(on)g(the)g(tic)m(k)m(et-)390 2262 y(gran)m(ting)41 b(tic)m(k)m(et.)72 b(If)40 b(this)g(\015ag)g(is)g (set)h(in)f(the)g(request,)j(c)m(hec)m(king)f(of)e(the)g(transited)g (\014eld)g(is)390 2372 y(disabled.)49 b(Tic)m(k)m(ets)35 b(issued)e(without)g(the)h(p)s(erformance)e(of)i(this)f(c)m(hec)m(k)i (will)e(b)s(e)g(noted)h(b)m(y)f(the)390 2482 y(reset)g(\(0\))h(v)-5 b(alue)34 b(of)f(the)g(TRANSITED-POLICY-CHECKED)e(\015ag,)j(indicating) g(to)g(the)f(ap-)390 2591 y(plication)25 b(serv)m(er)e(that)h(the)g (tranisted)g(\014eld)f(m)m(ust)g(b)s(e)g(c)m(hec)m(k)m(ed)i(lo)s(cally) -8 b(.)40 b(KDCs)23 b(are)h(encouraged)390 2701 y(but)30 b(not)g(required)g(to)h(honor)f(the)g(DISABLE-TRANSITED-CHECK)g (option.)390 2838 y(This)g(\015ag)g(is)h(new)f(since)g(RF)m(C)h(1510) 390 2975 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(disable-transited-c)m(hec)m(k)i(\015ag)d(is)h(set)g (in)f(KDC-REQ.)150 3177 y Fl(shishi)p 459 3177 37 5 v 55 w(kdcreq)p 873 3177 V 54 w(renew)m(able)p 1461 3177 V 53 w(ok)p 1640 3177 V 54 w(p)3350 3376 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_renewab)q(le_o)q(k_p)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 3376 28 4 v 39 w(asn1)565 3486 y Fe(kdcreq)p Ff(\))390 3596 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3733 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)390 3870 y(Determine)h(if)g(KDC-Option)f(renew)m (able-ok)i(\015ag)e(is)h(set.)390 4007 y(The)36 b(RENEW)-10 b(ABLE-OK)37 b(option)g(indicates)g(that)g(a)g(renew)m(able)g(tic)m(k)m (et)i(will)e(b)s(e)f(acceptable)390 4117 y(if)43 b(a)g(tic)m(k)m(et)j (with)d(the)g(requested)g(life)g(cannot)h(otherwise)f(b)s(e)g(pro)m (vided.)78 b(If)42 b(a)i(tic)m(k)m(et)h(with)390 4226 y(the)33 b(requested)f(life)h(cannot)g(b)s(e)f(pro)m(vided,)h(then)f(a) h(renew)m(able)g(tic)m(k)m(et)i(ma)m(y)e(b)s(e)f(issued)f(with)i(a)390 4336 y(renew-till)g(equal)g(to)g(the)g(requested)f(endtime.)47 b(The)32 b(v)-5 b(alue)33 b(of)f(the)h(renew-till)g(\014eld)f(ma)m(y)h (still)390 4445 y(b)s(e)d(limited)h(b)m(y)f(lo)s(cal)i(limits,)f(or)f (limits)h(selected)h(b)m(y)f(the)f(individual)g(principal)g(or)g(serv)m (er.)390 4582 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(renew)m(able-ok)g(\015ag)g(is)g(set)f(in)h(KDC-REQ.) 150 4784 y Fl(shishi)p 459 4784 37 5 v 55 w(kdcreq)p 873 4784 V 54 w(enc)p 1106 4784 V 53 w(tkt)p 1320 4784 V 54 w(in)p 1476 4784 V 54 w(sk)m(ey)p 1761 4784 V 54 w(p)3350 4984 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_enc_tkt)q(_in_)q(ske)q(y_p)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 5093 y(Shishi)p 810 5093 28 4 v 39 w(asn1)h Fe(kdcreq)p Ff(\))390 5203 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g (\014eld)f(from.)p eop end %%Page: 144 150 TeXDict begin 144 149 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(144)390 299 y(Determine)31 b(if)g(KDC-Option)f(enc-tkt-in-sk)m(ey)j(\015ag)d(is)h(set.)390 439 y(This)39 b(option)i(is)f(used)g(only)g(b)m(y)g(the)g(tic)m(k)m (et-gran)m(ting)k(service.)71 b(The)40 b(ENC-TKT-IN-SKEY)390 548 y(option)c(indicates)h(that)g(the)f(tic)m(k)m(et)i(for)e(the)g(end) f(serv)m(er)i(is)f(to)g(b)s(e)g(encrypted)f(in)h(the)g(session)390 658 y(k)m(ey)31 b(from)f(the)h(additional)g(tic)m(k)m(et-gran)m(ting)j (tic)m(k)m(et)f(pro)m(vided.)390 798 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(enc-tkt-in-sk)m(ey)h (\015ag)f(is)f(set)h(in)f(KDC-REQ.)150 1002 y Fl(shishi)p 459 1002 37 5 v 55 w(kdcreq)p 873 1002 V 54 w(renew)p 1246 1002 V 54 w(p)3350 1204 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_renew_p)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 1204 28 4 v 39 w(asn1)d Fe(kdcreq)p Ff(\))390 1314 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1454 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f(from.)390 1594 y(Determine)h(if)g(KDC-Option)f(renew)g(\015ag)h(is)f(set.)390 1734 y(This)25 b(option)h(is)f(used)g(only)g(b)m(y)h(the)f(tic)m(k)m (et-gran)m(ting)30 b(service.)40 b(The)24 b(RENEW)i(option)g(indicates) 390 1843 y(that)40 b(the)g(presen)m(t)f(request)g(is)h(for)f(a)h(renew) m(al.)68 b(The)39 b(tic)m(k)m(et)j(pro)m(vided)d(is)h(encrypted)f(in)g (the)390 1953 y(secret)32 b(k)m(ey)g(for)e(the)h(serv)m(er)h(on)e(whic) m(h)h(it)h(is)f(v)-5 b(alid.)42 b(This)30 b(option)i(will)f(only)g(b)s (e)g(honored)f(if)h(the)390 2062 y(tic)m(k)m(et)37 b(to)f(b)s(e)e (renew)m(ed)h(has)g(its)g(RENEW)-10 b(ABLE)35 b(\015ag)g(set)h(and)e (if)h(the)g(time)g(in)g(its)g(renew-till)390 2172 y(\014eld)28 b(has)g(not)h(passed.)39 b(The)28 b(tic)m(k)m(et)j(to)e(b)s(e)f(renew)m (ed)g(is)h(passed)e(in)h(the)h(padata)g(\014eld)f(as)h(part)f(of)390 2282 y(the)j(authen)m(tication)h(header.)390 2421 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(renew)f(\015ag)g(is)h(set) g(in)f(KDC-REQ.)150 2626 y Fl(shishi)p 459 2626 37 5 v 55 w(kdcreq)p 873 2626 V 54 w(v)-7 b(alidate)p 1345 2626 V 53 w(p)3350 2828 y Fw([F)f(unction])-3599 b Fg(int)53 b(shishi_kdcreq_validat)q(e_p)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 2828 28 4 v 38 w(asn1)565 2938 y Fe(kdcreq)p Ff(\))390 3047 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3187 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(get)g(kdc-options)g(\014eld)f (from.)390 3327 y(Determine)h(if)g(KDC-Option)f(v)-5 b(alidate)32 b(\015ag)f(is)f(set.)390 3467 y(This)k(option)i(is)f(used) g(only)g(b)m(y)g(the)h(tic)m(k)m(et-gran)m(ting)j(service.)56 b(The)35 b(V)-10 b(ALID)m(A)i(TE)36 b(option)g(in-)390 3576 y(dicates)f(that)g(the)f(request)h(is)f(to)h(v)-5 b(alidate)35 b(a)g(p)s(ostdated)f(tic)m(k)m(et.)55 b(It)34 b(will)h(only)f(b)s(e)f(honored)h(if)390 3686 y(the)f(tic)m(k)m(et)j (presen)m(ted)d(is)g(p)s(ostdated,)h(presen)m(tly)g(has)f(its)g(INV)-10 b(ALID)34 b(\015ag)f(set,)i(and)e(w)m(ould)g(b)s(e)390 3796 y(otherwise)e(usable)f(at)h(this)f(time.)41 b(A)31 b(tic)m(k)m(et)h(cannot)f(b)s(e)f(v)-5 b(alidated)31 b(b)s(efore)f(its)g(starttime.)42 b(The)390 3905 y(tic)m(k)m(et)f (presen)m(ted)e(for)g(v)-5 b(alidation)40 b(is)f(encrypted)f(in)h(the)g (k)m(ey)g(of)g(the)g(serv)m(er)g(for)g(whic)m(h)g(it)g(is)390 4015 y(v)-5 b(alid)31 b(and)e(is)i(passed)f(in)g(the)g(padata)h (\014eld)f(as)h(part)f(of)h(the)f(authen)m(tication)j(header.)390 4155 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(non-0)g(i\013)h(v) -5 b(alidate)32 b(\015ag)e(is)h(set)g(in)f(KDC-REQ.)150 4359 y Fl(shishi)p 459 4359 37 5 v 55 w(kdcreq)p 873 4359 V 54 w(options)p 1315 4359 V 55 w(set)3350 4561 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_options)q(_set) f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 4561 28 4 v 39 w(asn1)565 4671 y Fe(kdcreq)p Fi(,)g(uin)m(t32)p 1189 4671 V 41 w(t)f Fe(options)p Ff(\))390 4781 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4920 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(et)m(yp)s(e)g(\014eld)f (in.)390 5060 y Fi(options)t Fw(:)41 b(in)m(teger)32 b(with)e(\015ags)g(to)h(store)g(in)f(KDC-REQ.)390 5200 y(Set)h(options)f(in)g(KDC-REQ.)g(Note)i(that)f(this)f(reset)h(an)m(y)g (already)g(existing)g(\015ags.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 145 151 TeXDict begin 145 150 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(145)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(options)p 1315 299 V 55 w(add)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_options)q(_add)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 498 28 4 v 39 w(asn1)565 608 y Fe(kdcreq)p Fi(,)g(uin)m(t32)p 1189 608 V 41 w(t)f Fe(option)p Ff(\))390 717 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 854 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(v)-5 b(ariable)31 b(to)g(set)g(et)m(yp)s(e)g(\014eld)f (in.)390 991 y Fi(option)p Fw(:)41 b(in)m(teger)32 b(with)e(options)h (to)g(add)f(in)g(KDC-REQ.)390 1127 y(Add)f(KDC-Option)i(to)g(KDC-REQ.)f (This)g(preserv)m(es)g(all)h(existing)h(options.)390 1264 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1264 V 39 w(OK)f(i\013)i(successful.)150 1466 y Fl(shishi)p 459 1466 37 5 v 55 w(kdcreq)p 873 1466 V 54 w(clear)p 1182 1466 V 53 w(padata)3350 1665 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_clear_p)q(adat)q(a)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 1665 28 4 v 39 w(asn1)565 1774 y Fe(kdcreq)p Ff(\))390 1884 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2021 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(remo)m(v)m(e)h(P)-8 b(A-D)m(A)g(T)g(A)32 b(from.)390 2158 y(Remo)m(v)m(e)g(the)f(padata)g(\014eld)f(from)g (KDC-REQ.)390 2294 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2294 V 39 w(OK)f(i\013)i(successful.)150 2496 y Fl(shishi)p 459 2496 37 5 v 55 w(kdcreq)p 873 2496 V 54 w(get)p 1092 2496 V 54 w(padata)3350 2695 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_get_pad)q(ata)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 2695 28 4 v 38 w(asn1)565 2804 y Fe(kdcreq)p Fi(,)f(Shishi)p 1179 2804 V 39 w(padata)p 1490 2804 V 41 w(t)m(yp)s(e)f Fe(padatatype)p Fi(,)i(c)m(har)e(**)g Fe(out)p Fi(,)h(size)p 2989 2804 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 2914 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3051 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(get)g(P)-8 b(A-D)m(A)g(T)g(A)33 b(from.)390 3188 y Fi(padatat)m(yp)s(e)5 b Fw(:)42 b(t)m(yp)s(e)30 b(of)h(P)-8 b(A-D)m(A)g(T)g(A,)33 b(see)e(Shishi)p 2070 3188 V 39 w(padata)p 2381 3188 V 40 w(t)m(yp)s(e.)390 3324 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s (cated)i(P)-8 b(A-D)m(A)g(T)g(A)33 b(v)-5 b(alue.)390 3461 y Fi(outlen)p Fw(:)41 b(size)31 b(of)g(output)f(arra)m(y)h(with)f (P)-8 b(A-D)m(A)g(T)g(A)33 b(v)-5 b(alue.)390 3598 y(Get)28 b(pre)e(authen)m(tication)i(data)f(\(P)-8 b(A-D)m(A)g(T)g(A\))30 b(from)c(KDC-REQ.)h(Pre)f(authen)m(tication)j(data)e(is)390 3708 y(used)e(to)h(pass)g(v)-5 b(arious)26 b(information)g(to)g(KDC,)g (suc)m(h)f(as)h(in)g(case)g(of)g(a)g(SHISHI)p 3127 3708 V 40 w(P)-8 b(A)p 3289 3708 V 40 w(TGS)p 3517 3708 V 40 w(REQ)390 3817 y(padatat)m(yp)s(e)31 b(the)g(AP-REQ)f(that)h(authen) m(ticates)i(the)d(user)g(to)h(get)g(the)g(tic)m(k)m(et.)390 3954 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3954 V 39 w(OK)f(i\013)i(successful.)150 4155 y Fl(shishi)p 459 4155 37 5 v 55 w(kdcreq)p 873 4155 V 54 w(get)p 1092 4155 V 54 w(padata)p 1510 4155 V 53 w(tgs)3350 4355 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_get_pad)q (ata_)q(tgs)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 4355 28 4 v 39 w(asn1)565 4464 y Fe(kdcreq)p Fi(,)f(Shishi)p 1179 4464 V 39 w(asn1)f(*)g Fe(apreq)p Ff(\))390 4574 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4710 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(get)g(P)-8 b(A-TGS-REQ)31 b(from.)390 4847 y Fi(apreq)r Fw(:)41 b(Output)29 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)j (AP-REQ.)390 4984 y(Extract)28 b(TGS)f(pre-authen)m(tication)j(data)e (from)f(KDC-REQ.)g(The)g(data)h(is)g(an)f(AP-REQ)g(that)390 5094 y(authen)m(ticates)36 b(the)f(request.)52 b(This)34 b(function)g(call)h Fq(shishi_kdcreq_get_padata\(\))28 b Fw(with)34 b(a)390 5203 y(SHISHI)p 700 5203 V 39 w(P)-8 b(A)p 861 5203 V 41 w(TGS)p 1090 5203 V 39 w(REQ)30 b(padatat)m(yp)s(e) h(and)f(DER)g(deco)s(de)h(the)f(result)h(\(if)f(an)m(y\).)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 146 152 TeXDict begin 146 151 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(146)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcreq)p 873 299 V 54 w(add)p 1123 299 V 54 w(padata)3350 504 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_add_pad)q(ata)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 504 28 4 v 38 w(asn1)565 613 y Fe(kdcreq)p Fi(,)f(in)m(t)f Fe(padatatype)p Fi(,)j(const)d(c)m(har)g(*)f Fe(data)p Fi(,)i(size)p 2577 613 V 41 w(t)f Fe(datalen)p Ff(\))390 723 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 866 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(add)e(P)-8 b(A-D)m(A)g(T)g(A)33 b(to.)390 1009 y Fi(padatat)m(yp)s(e)5 b Fw(:)42 b(t)m(yp)s(e)30 b(of)h(P)-8 b(A-D)m(A)g(T)g(A,)33 b(see)e(Shishi)p 2070 1009 V 39 w(padata)p 2381 1009 V 40 w(t)m(yp)s(e.)390 1151 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(P)-8 b(A-D)m(A)g(T)g(A)33 b(v)-5 b(alue.)390 1294 y Fi(datalen)p Fw(:)42 b(size)31 b(of)f(input)g(arra)m(y)h(with)f(P)-8 b(A-D)m(A)g(T)g(A)33 b(v)-5 b(alue.)390 1437 y(Add)39 b(new)g(pre)g(authen)m(tication)j(data)e(\(P)-8 b(A-D)m(A)g(T)g(A\))43 b(to)d(KDC-REQ.)g(This)e(is)i(used)f(to)h(pass)390 1546 y(v)-5 b(arious)28 b(information)h(to)g(KDC,)g(suc)m(h)f(as)h(in)f (case)i(of)e(a)h(SHISHI)p 2652 1546 V 39 w(P)-8 b(A)p 2813 1546 V 41 w(TGS)p 3042 1546 V 39 w(REQ)28 b(padatat)m(yp)s(e)390 1656 y(the)39 b(AP-REQ)f(that)i(authen)m(ticates)h(the)d(user)g(to)i (get)g(the)e(tic)m(k)m(et.)69 b(\(But)39 b(also)h(see)f Fq(shishi_)390 1765 y(kdcreq_add_padata_tgs\(\))24 b Fw(whic)m(h)30 b(tak)m(es)i(an)e(AP-REQ)g(directly)-8 b(.\))390 1908 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1908 V 39 w(OK)f(i\013)i(successful.)150 2116 y Fl(shishi)p 459 2116 37 5 v 55 w(kdcreq)p 873 2116 V 54 w(add)p 1123 2116 V 54 w(padata)p 1541 2116 V 53 w(tgs)3350 2321 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_add_pad)q(ata_)q(tgs)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 2321 28 4 v 39 w(asn1)565 2430 y Fe(kdcreq)p Fi(,)f(Shishi)p 1179 2430 V 39 w(asn1)f Fe(apreq)p Ff(\))390 2540 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2683 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(add)e(P)-8 b(A-D)m(A)g(T)g(A)33 b(to.)390 2825 y Fi(apreq)r Fw(:)41 b(AP-REQ)30 b(to)h(add)f(as)g(P)-8 b(A-D)m(A)g(T)g(A.)390 2968 y(Add)33 b(TGS)h(pre-authen)m(tication)j (data)e(to)g(KDC-REQ.)f(The)g(data)h(is)f(an)h(AP-REQ)f(that)h(au-)390 3078 y(then)m(ticates)h(the)d(request.)50 b(This)32 b(functions)h (simply)g(DER)g(enco)s(des)h(the)f(AP-REQ)g(and)g(calls)390 3187 y Fq(shishi_kdcreq_add_padata)o(\(\))24 b Fw(with)30 b(a)h(SHISHI)p 2254 3187 V 39 w(P)-8 b(A)p 2415 3187 V 41 w(TGS)p 2644 3187 V 39 w(REQ)30 b(padatat)m(yp)s(e.)390 3330 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3330 V 39 w(OK)f(i\013)i(successful.)150 3537 y Fl(shishi)p 459 3537 37 5 v 55 w(kdcreq)p 873 3537 V 54 w(add)p 1123 3537 V 54 w(padata)p 1541 3537 V 53 w(preauth)3350 3742 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcreq_add_pad)q (ata_)q(pre)q(aut)q(h)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 3852 y(Shishi)p 810 3852 28 4 v 39 w(asn1)g Fe(kdcreq)p Fi(,)h(Shishi)p 1665 3852 V 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 3962 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4104 y Fi(kdcreq)r Fw(:)41 b(KDC-REQ)30 b(to)h(add)e (pre-authen)m(tication)k(data)e(to.)390 4247 y Fi(k)m(ey)8 b Fw(:)41 b(Key)31 b(used)e(to)i(encrypt)f(pre-auth)g(data.)390 4390 y(Add)f(pre-authen)m(tication)k(data)e(to)g(KDC-REQ.)390 4532 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4532 V 39 w(OK)f(i\013)i(successful.)150 4740 y Fl(shishi)p 459 4740 37 5 v 55 w(asrep)3350 4945 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asrep)49 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 5055 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5197 y(This)g(function)g(creates)h (a)g(new)f(AS-REP)-8 b(,)31 b(p)s(opulated)e(with)i(some)f(default)h(v) -5 b(alues.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(AS-REP)g(or)g(NULL)h(on)f(failure.)p eop end %%Page: 147 153 TeXDict begin 147 152 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(147)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(tgsrep)3350 480 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_tgsrep)49 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 590 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 717 y(This)g(function)g(creates)h(a)g(new)f(TGS-REP)-8 b(,)30 b(p)s(opulated)g(with)g(some)h(default)g(v)-5 b(alues.)390 844 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(TGS-REP)g(or)g(NULL)h(on)f(failure.)150 1028 y Fl(shishi)p 459 1028 V 55 w(kdcrep)p 876 1028 V 54 w(prin)m(t)3350 1209 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_print)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2869 1209 28 4 v 39 w(asn1)565 1319 y Fe(kdcrep)p Ff(\))390 1429 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 1555 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 1682 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(prin)m(t.)390 1809 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco)s(ding)f(of)h (KDC-REP)f(to)h(\014le.)390 1936 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1936 V 39 w(OK)f(i\013)i(successful.) 150 2120 y Fl(shishi)p 459 2120 37 5 v 55 w(kdcrep)p 876 2120 V 54 w(sa)m(v)m(e)3350 2302 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_save)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 2302 28 4 v 39 w(asn1)565 2411 y Fe(kdcrep)p Ff(\))390 2521 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2648 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 2775 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(sa)m(v)m(e.)390 2902 y(Prin)m(t)f(DER)h(enco)s(ding)f(of)h(KDC-REP)f(to)h(\014le.)390 3028 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3028 V 39 w(OK)f(i\013)i(successful.)150 3212 y Fl(shishi)p 459 3212 37 5 v 55 w(kdcrep)p 876 3212 V 54 w(to)p 1039 3212 V 54 w(\014le)3350 3394 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_to_file)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3394 28 4 v 39 w(asn1)d Fe(kdcrep)p Fi(,)565 3504 y(in)m(t)h Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3613 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3740 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(sa)m(v)m(e.)390 3867 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g(b)s(e)e (written,)i(see)g(Shishi)p 3182 3867 V 39 w(\014let)m(yp)s(e.)390 3994 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(write)g(to.)390 4121 y(W)-8 b(rite)32 b(KDC-REP)e(to)h(\014le)f(in)g(sp)s(eci\014ed)g(TYPE.)g(The)g (\014le)h(will)f(b)s(e)g(truncated)g(if)h(it)g(exists.)390 4248 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4248 V 39 w(OK)f(i\013)i(successful.)150 4432 y Fl(shishi)p 459 4432 37 5 v 55 w(kdcrep)p 876 4432 V 54 w(parse)3350 4613 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_parse)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2869 4613 28 4 v 39 w(asn1)g(*)565 4723 y Fe(kdcrep)p Ff(\))390 4832 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4959 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.)390 5086 y Fi(kdcrep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(KDC-REP)-8 b(.)390 5213 y(Read)27 b(ASCI)s(I)e(armored)i(DER)f(enco)s(ded)h(KDC-REP)f(from)h (\014le)f(and)h(p)s(opulate)f(giv)m(en)i(v)-5 b(ariable.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 148 154 TeXDict begin 148 153 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(148)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcrep)p 876 299 V 54 w(read)3350 510 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_read)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2817 510 28 4 v 39 w(asn1)f(*)565 620 y Fe(kdcrep)p Ff(\))390 729 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 878 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 1027 y Fi(kdcrep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(KDC-REP)-8 b(.)390 1176 y(Read)31 b(DER)f(enco)s(ded)g(KDC-REP)g(from)g(\014le)h (and)e(p)s(opulate)i(giv)m(en)g(v)-5 b(ariable.)390 1325 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1325 V 39 w(OK)f(i\013)i(successful.)150 1538 y Fl(shishi)p 459 1538 37 5 v 55 w(kdcrep)p 876 1538 V 54 w(from)p 1180 1538 V 55 w(\014le)3350 1749 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_from_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 1749 28 4 v 39 w(asn1)f(*)565 1859 y Fe(kdcrep)p Fi(,)h(in)m(t)f Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(filename)p Ff(\))390 1968 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2117 y Fi(kdcrep)s Fw(:)40 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i(KDC-REP)-8 b(.)390 2266 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g (b)s(e)e(read,)i(see)g(Shishi)p 3066 2266 V 39 w(\014let)m(yp)s(e.)390 2415 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read)g(from.)390 2564 y(Read)g(KDC-REP)f (from)g(\014le)g(in)g(sp)s(eci\014ed)g(TYPE.)390 2713 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2713 V 39 w(OK)f(i\013)i(successful.)150 2926 y Fl(shishi)p 459 2926 37 5 v 55 w(kdcrep)p 876 2926 V 54 w(crealm)p 1287 2926 V 54 w(set)3350 3137 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_crealm_)q(set)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 3137 28 4 v 38 w(asn1)565 3247 y Fe(kdcrep)p Fi(,)f(const)f(c)m (har)g(*)g Fe(crealm)p Ff(\))390 3357 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3505 y Fi(kdcrep)s Fw(:)40 b(Kdcrep)29 b(v)-5 b(ariable)31 b(to)h(set)e(realm)h(\014eld)f(in.)390 3654 y Fi(crealm)p Fw(:)42 b(input)29 b(arra)m(y)i(with)f(name)g(of)h (realm.)390 3803 y(Set)g(the)f(clien)m(t)i(realm)f(\014eld)f(in)g(the)g (KDC-REP)-8 b(.)390 3952 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3952 V 39 w(OK)f(i\013)i(successful.) 150 4165 y Fl(shishi)p 459 4165 37 5 v 55 w(kdcrep)p 876 4165 V 54 w(cname)p 1271 4165 V 54 w(set)3350 4377 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_cname_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 4377 28 4 v 39 w(asn1)f Fe(kdcrep)p Fi(,)565 4486 y(Shishi)p 810 4486 V 39 w(name)p 1061 4486 V 40 w(t)m(yp)s(e)g Fe(name_type)p Fi(,)i(const)e(c)m(har)g(*)f Fd([])g Fe(cname)p Ff(\))390 4596 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4745 y Fi(kdcrep)s Fw(:)40 b(Kdcrep)29 b(v)-5 b(ariable)31 b(to)h(set)e(serv)m(er)h(name)g(\014eld)e(in.)390 4893 y Fi(name)p 608 4893 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 4893 V 39 w(name)p 2224 4893 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 4893 V 39 w(NT)p 3264 4893 V 40 w(UNKNO)m(WN.)390 5042 y Fi(cname)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(principal)g (name.)390 5191 y(Set)h(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f (KDC-REP)-8 b(.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 149 155 TeXDict begin 149 154 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(149)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcrep)p 876 299 V 54 w(clien)m(t)p 1222 299 V 53 w(set)3350 523 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_client_)q(set)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 523 28 4 v 38 w(asn1)565 633 y Fe(kdcrep)p Fi(,)f(const)f(c)m(har)g(*)g Fe(client)p Ff(\))390 742 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 904 y Fi(kdcrep)s Fw(:)40 b(Kdcrep)29 b(v)-5 b(ariable)31 b(to)h(set)e(serv)m(er)h(name)g(\014eld)e(in.)390 1066 y Fi(clien)m(t)r Fw(:)42 b(zero-terminated)32 b(string)f(with)f (principal)g(name)g(on)g(RF)m(C)h(1964)h(form.)390 1227 y(Set)f(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f(KDC-REP)-8 b(.)390 1389 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1389 V 39 w(OK)f(i\013)i(successful.)150 1616 y Fl(shishi)p 459 1616 37 5 v 55 w(kdcrep)p 876 1616 V 54 w(get)p 1095 1616 V 54 w(enc)p 1328 1616 V 54 w(part)p 1608 1616 V 54 w(et)m(yp)s(e)3350 1840 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_get_enc)q(_par)q (t_e)q(typ)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 1949 y(Shishi)p 810 1949 28 4 v 39 w(asn1)g Fe(kdcrep)p Fi(,)h(in)m(t32)p 1624 1949 V 41 w(t)f(*)g Fe(etype)p Ff(\))390 2059 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2221 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(v)-5 b(ariable)31 b(to)g(get)h(v)-5 b(alue)31 b(from.)390 2383 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(output)30 b(v)-5 b(ariable)32 b(that)f(holds)e(the)i(v)-5 b(alue.)390 2544 y(Extract)31 b(KDC-REP)-8 b(.enc-part.et)m(yp)s(e.)390 2706 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2706 V 39 w(OK)f(i\013)i(successful.)150 2933 y Fl(shishi)p 459 2933 37 5 v 55 w(kdcrep)p 876 2933 V 54 w(get)p 1095 2933 V 54 w(tic)m(k)m(et)3350 3157 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_get_tic)q (ket)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 3157 28 4 v 38 w(asn1)565 3266 y Fe(kdcrep)p Fi(,)f(Shishi)p 1179 3266 V 39 w(asn1)f(*)g Fe(ticket)p Ff(\))390 3376 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3538 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(v)-5 b(ariable)31 b(to)g(get)h(tic)m(k)m(et)h (from.)390 3699 y Fi(tic)m(k)m(et)r Fw(:)43 b(output)30 b(v)-5 b(ariable)31 b(to)h(hold)e(extracted)h(tic)m(k)m(et.)390 3861 y(Extract)g(tic)m(k)m(et)i(from)d(KDC-REP)-8 b(.)390 4023 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4023 V 39 w(OK)f(i\013)i(successful.)150 4250 y Fl(shishi)p 459 4250 37 5 v 55 w(kdcrep)p 876 4250 V 54 w(set)p 1082 4250 V 54 w(tic)m(k)m(et)3350 4474 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_set_tic)q (ket)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 4474 28 4 v 38 w(asn1)565 4583 y Fe(kdcrep)p Fi(,)f(Shishi)p 1179 4583 V 39 w(asn1)f Fe(ticket)p Ff(\))390 4693 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 4855 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(add)f(tic)m(k)m(et)j(\014eld)d(to.)390 5016 y Fi(tic)m(k)m(et)r Fw(:)43 b(input)30 b(tic)m(k)m(et)j(to)e(cop)m (y)g(in)m(to)g(KDC-REP)f(tic)m(k)m(et)j(\014eld.)390 5178 y(Cop)m(y)d(tic)m(k)m(et)j(in)m(to)f(KDC-REP)-8 b(.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 150 156 TeXDict begin 150 155 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(150)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(kdcrep)p 876 299 V 54 w(set)p 1082 299 V 54 w(enc)p 1315 299 V 54 w(part)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_set_enc)q(_par)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 498 28 4 v 39 w(asn1)565 608 y Fe(kdcrep)p Fi(,)g(in)m(t32)p 1138 608 V 42 w(t)f Fe(etype)p Fi(,)h(uin)m(t32)p 1812 608 V 41 w(t)e Fe(kvno)p Fi(,)i(const)f(c)m(har)g(*)g Fe(buf)p Fi(,)g(size)p 3050 608 V 41 w(t)g Fe(buflen)p Ff(\))390 717 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 854 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(add)f(enc-part)h(\014eld)f(to.) 390 991 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(used)g(to)h(encrypt)f(enc-part.)390 1127 y Fi(kvno)5 b Fw(:)40 b(k)m(ey)31 b(v)m(ersion)g(n)m(um)m(b)s(er.)390 1264 y Fi(buf)16 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(encrypted)g (enc-part.)390 1401 y Fi(bu\015en)p Fw(:)39 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(encrypted)g(enc-part.)390 1538 y(Set)43 b(the)f(encrypted)g(enc-part)h(\014eld)f(in)g(the)g (KDC-REP)-8 b(.)43 b(The)f(encrypted)g(data)h(is)f(usually)390 1647 y(created)35 b(b)m(y)f(calling)h Fq(shishi_encrypt\(\))30 b Fw(on)k(the)g(DER)g(enco)s(ded)f(enc-part.)52 b(T)-8 b(o)34 b(sa)m(v)m(e)i(time,)390 1757 y(y)m(ou)30 b(ma)m(y)g(w)m(an)m(t) h(to)f(use)g Fq(shishi_kdcrep_add_enc_pa)o(rt\(\))23 b Fw(instead,)30 b(whic)m(h)g(calculates)i(the)390 1867 y(encrypted)e(data)h(and)f(calls)h(this)g(function)f(in)g(one)g(step.) 390 2003 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2003 V 39 w(OK)f(i\013)i(successful.)150 2205 y Fl(shishi)p 459 2205 37 5 v 55 w(kdcrep)p 876 2205 V 54 w(add)p 1126 2205 V 54 w(enc)p 1359 2205 V 54 w(part)3350 2404 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_add_enc)q(_par)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 2404 28 4 v 39 w(asn1)565 2513 y Fe(kdcrep)p Fi(,)g(Shishi)p 1179 2513 V 39 w(k)m(ey)g(*)e Fe(key)p Fi(,)i(in)m(t)f Fe(keyusage)p Fi(,)i(Shishi)p 2523 2513 V 38 w(asn1)e Fe(enckdcreppart)p Ff(\))390 2623 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2760 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(add)f(enc-part)h (\014eld)f(to.)390 2897 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(used)f(to)h(encrypt)f(enc-part.)390 3033 y Fi(k)m(eyusage)5 b Fw(:)90 b(k)m(ey)54 b(usage)h(to)g(use,)60 b(normally)54 b(SHISHI)p 2381 3033 V 39 w(KEYUSA)m(GE)p 2938 3033 V 40 w(ENCASREPP)-8 b(AR)g(T,)390 3143 y(SHISHI)p 700 3143 V 39 w(KEYUSA)m(GE)p 1257 3143 V 40 w(ENCTGSREPP)g(AR)g(T)p 2119 3143 V 40 w(SESSION)p 2546 3143 V 38 w(KEY)20 b(or)g(SHISHI)p 3210 3143 V 39 w(KEYUSA)m(GE)p 3767 3143 V 40 w(ENCTGSREPP)-8 b(AR)g(T)p 4629 3143 V 40 w(A)m(UTHENTICA)g(TOR)p 5495 3143 V 39 w(KEY.)390 3280 y Fi(enc)m(kdcreppart)r Fw(:)41 b(EncKDCRepP)m(art)30 b(to)h(add.)390 3417 y(Encrypts)e(DER)i(enco)s (ded)f(EncKDCRepP)m(art)g(using)g(k)m(ey)h(and)f(stores)h(it)g(in)f (the)h(KDC-REP)-8 b(.)390 3553 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3553 V 39 w(OK)f(i\013)i(successful.)150 3755 y Fl(shishi)p 459 3755 37 5 v 55 w(kdcrep)p 876 3755 V 54 w(clear)p 1185 3755 V 54 w(padata)3350 3954 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_kdcrep_clear_p)q(adat)q(a)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 3954 28 4 v 39 w(asn1)565 4064 y Fe(kdcrep)p Ff(\))390 4173 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4310 y Fi(kdcrep)s Fw(:)40 b(KDC-REP)30 b(to)h(remo)m(v)m(e)h(P)-8 b(A-D)m(A)g(T)g(A)33 b(from.)390 4447 y(Remo)m(v)m(e)f(the)f(padata)g(\014eld)f(from)g (KDC-REP)-8 b(.)390 4583 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4583 V 39 w(OK)f(i\013)i(successful.) 150 4785 y Fl(shishi)p 459 4785 37 5 v 55 w(enc)m(kdcreppart)p 1278 4785 V 53 w(get)p 1496 4785 V 54 w(k)m(ey)3350 4984 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(get_) q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 4984 28 4 v 39 w(asn1)565 5094 y Fe(enckdcreppart)p Fi(,)i(Shishi)p 1546 5094 V 38 w(k)m(ey)d(**)f Fe(key)p Ff(\))390 5203 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v) -5 b(ariable.)p eop end %%Page: 151 157 TeXDict begin 151 156 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(151)390 299 y Fi(k)m(ey)8 b Fw(:)41 b(newly)30 b(allo)s(cated)j(encryption)d(k)m(ey)h(handle.)390 435 y(Extract)42 b(the)f(k)m(ey)h(to)g(use)f(with)f(the)i(tic)m(k)m(et) h(sen)m(t)f(in)f(the)g(KDC-REP)f(asso)s(ciated)j(with)e(the)390 545 y(EncKDCRepP)m(art)30 b(input)g(v)-5 b(ariable.)390 681 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 881 y Fl(shishi)p 459 881 37 5 v 55 w(enc)m(kdcreppart)p 1278 881 V 53 w(k)m(ey)p 1514 881 V 53 w(set)3350 1080 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(key_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 1080 28 4 v 39 w(asn1)565 1189 y Fe(enckdcreppart)p Fi(,)i(Shishi)p 1546 1189 V 38 w(k)m(ey)d(*)e Fe(key)p Ff(\))390 1299 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 1435 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 1571 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(handle)f(with)g(information) h(to)g(store)g(in)f(enc)m(kdcreppart.)390 1707 y(Set)h(the)f (EncKDCRepP)m(art.k)m(ey)i(\014eld)e(to)h(k)m(ey)g(t)m(yp)s(e)f(and)g (v)-5 b(alue)31 b(of)g(supplied)e(k)m(ey)-8 b(.)390 1843 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2044 y Fl(shishi)p 459 2044 37 5 v 55 w(enc)m(kdcreppart)p 1278 2044 V 53 w(nonce)p 1639 2044 V 54 w(set)3350 2242 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(nonc)q(e_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 2242 28 4 v 39 w(asn1)565 2352 y Fe(enckdcreppart)p Fi(,)j(uin)m(t32)p 1556 2352 V 41 w(t)30 b Fe(nonce)p Ff(\))390 2462 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2598 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v) -5 b(ariable.)390 2734 y Fi(nonce)5 b Fw(:)41 b(nonce)31 b(to)g(set)g(in)f(EncKDCRepP)m(art.)390 2870 y(Set)h(the)f(EncKDCRepP)m (art.nonce)h(\014eld.)390 3006 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3207 y Fl(shishi)p 459 3207 37 5 v 55 w(enc)m(kdcreppart)p 1278 3207 V 53 w(\015ags)p 1568 3207 V 55 w(set)3350 3405 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q (flag)q(s_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3405 28 4 v 39 w(asn1)565 3515 y Fe(enckdcreppart)p Fi(,)j(in)m(t)30 b Fe(flags)p Ff(\))390 3624 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3760 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 3896 y Fi(\015ags)t Fw(:)41 b(\015ags)30 b(to)h(set)g(in)f(EncKDCRepP)m (art.)390 4033 y(Set)h(the)f(EncKDCRepP)m(art.\015ags)h(\014eld.)390 4169 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4369 y Fl(shishi)p 459 4369 37 5 v 55 w(enc)m(kdcreppart)p 1278 4369 V 53 w(auth)m(time)p 1812 4369 V 54 w(set)3350 4568 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(auth)q(tim)q (e_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 4677 y(Shishi)p 810 4677 28 4 v 39 w(asn1)g Fe(enckdcreppart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(authtime)p Ff(\))390 4787 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4923 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 5059 y Fi(auth)m(time)5 b Fw(:)42 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 5195 y(Set)g(the)f(EncTic)m(k)m(etP)m(art.auth)m(time)k(to)d(supplied)e(v)-5 b(alue.)390 5331 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 152 158 TeXDict begin 152 157 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(152)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(enc)m(kdcreppart)p 1278 299 V 53 w(starttime)p 1825 299 V 54 w(set)3350 513 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(star)q(tti)q (me_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 623 y(Shishi)p 810 623 28 4 v 39 w(asn1)h Fe(enckdcreppart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(starttime)p Ff(\))390 733 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 885 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 1037 y Fi(starttime)5 b Fw(:)42 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 1189 y(Set)d(the)g(EncTic)m(k)m(etP)m(art.starttime)k(to)d(supplied)d(v)-5 b(alue.)40 b(Use)29 b(a)f(NULL)g(v)-5 b(alue)28 b(for)f Fq(starttime)390 1299 y Fw(to)k(remo)m(v)m(e)h(the)f(\014eld.)390 1451 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1668 y Fl(shishi)p 459 1668 37 5 v 55 w(enc)m(kdcreppart)p 1278 1668 V 53 w(endtime)p 1763 1668 V 55 w(set)3350 1883 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(endt)q(ime)q (_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 1992 y(Shishi)p 810 1992 28 4 v 39 w(asn1)g Fe(enckdcreppart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(endtime)p Ff(\))390 2102 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2254 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 2406 y Fi(endtime)5 b Fw(:)41 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 2559 y(Set)g(the)f(EncTic)m(k)m(etP)m(art.endtime)j(to)f(supplied)d(v)-5 b(alue.)390 2711 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2928 y Fl(shishi)p 459 2928 37 5 v 55 w(enc)m(kdcreppart)p 1278 2928 V 53 w(renew)p 1650 2928 V 54 w(till)p 1854 2928 V 54 w(set)3350 3142 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q (rene)q(w_t)q(ill)q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 3252 y(Shishi)p 810 3252 28 4 v 39 w(asn1)g Fe(enckdcreppart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(renew_till)p Ff(\))390 3362 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3514 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 3666 y Fi(renew)p 629 3666 V 40 w(till)t Fw(:)41 b(c)m(haracter)32 b(bu\013er)d(con)m (taining)j(a)f(generalized)h(time)f(string.)390 3818 y(Set)22 b(the)h(EncTic)m(k)m(etP)m(art.renew-till)j(to)d(supplied)e(v) -5 b(alue.)38 b(Use)23 b(a)g(NULL)f(v)-5 b(alue)23 b(for)f Fq(renew_till)390 3928 y Fw(to)31 b(remo)m(v)m(e)h(the)f(\014eld.)390 4080 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4297 y Fl(shishi)p 459 4297 37 5 v 55 w(enc)m(kdcreppart)p 1278 4297 V 53 w(srealm)p 1681 4297 V 55 w(set)3350 4512 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(srea)q(lm_)q (set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 4621 y(Shishi)p 810 4621 28 4 v 39 w(asn1)h Fe(enckdcreppart)p Fi(,)j(const)d(c)m(har)g(*)f Fe(srealm)p Ff(\))390 4731 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4883 y Fi(enc)m(kdcreppart)r Fw(:)41 b(EncKDCRepP)m(art)30 b(v)-5 b(ariable)31 b(to)g(set)g(realm)g (\014eld)f(in.)390 5035 y Fi(srealm)p Fw(:)41 b(input)29 b(arra)m(y)i(with)f(name)h(of)f(realm.)390 5188 y(Set)h(the)f(serv)m (er)h(realm)g(\014eld)f(in)g(the)g(EncKDCRepP)m(art.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 153 159 TeXDict begin 153 158 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(153)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(enc)m(kdcreppart)p 1278 299 V 53 w(sname)p 1665 299 V 55 w(set)3350 503 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_enckdcreppart_)q(snam)q(e_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 503 28 4 v 39 w(asn1)565 613 y Fe(enckdcreppart)p Fi(,)j(Shishi)p 1546 613 V 38 w(name)p 1796 613 V 41 w(t)m(yp)s(e)30 b Fe(name_type)p Fi(,)j(c)m(har)e(*)g Fd([])f Fe(sname)p Ff(\))390 722 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 864 y Fi(enc)m(kdcreppart)r Fw(:)41 b(EncKDCRepP)m(art)30 b(v)-5 b(ariable)31 b(to)g(set)g(serv)m(er)g(name)f(\014eld)g(in.)390 1006 y Fi(name)p 608 1006 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 1006 V 39 w(name)p 2224 1006 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 1006 V 39 w(NT)p 3264 1006 V 40 w(UNKNO)m(WN.)390 1148 y Fi(sname)5 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 1290 y(Set)h(the)f(serv)m(er)h(name)f(\014eld)g(in)g(the)h (EncKDCRepP)m(art.)390 1432 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1432 V 39 w(OK)f(i\013)i(successful.) 150 1639 y Fl(shishi)p 459 1639 37 5 v 55 w(enc)m(kdcreppart)p 1278 1639 V 53 w(p)s(opulate)p 1797 1639 V 55 w(enctic)m(k)m(etpart) 3350 1843 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b (shishi_enckdcreppart_)q(popu)q(lat)q(e_e)q(nct)q(icke)q(tpa)q(rt)f Ff(\()p Fi(Shishi)29 b(*)565 1953 y Fe(handle)p Fi(,)j(Shishi)p 1179 1953 28 4 v 39 w(asn1)f Fe(enckdcreppart)p Fi(,)j(Shishi)p 2400 1953 V 39 w(asn1)d Fe(encticketpart)p Ff(\))390 2062 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2204 y Fi(enc)m(kdcreppart)r Fw(:)41 b(input)29 b(EncKDCRepP)m(art)i(v)-5 b(ariable.)390 2346 y Fi(enctic)m(k)m(etpart)r Fw(:)44 b(input)29 b(EncTic)m(k)m(etP)m (art)k(v)-5 b(ariable.)390 2488 y(Set)33 b(the)f(\015ags,)i(auth)m (time,)g(starttime,)h(endtime,)e(renew-till)h(and)e(caddr)g(\014elds)g (of)g(the)h(EncK-)390 2598 y(DCRepP)m(art)e(to)g(the)g(corresp)s (onding)e(v)-5 b(alues)31 b(in)f(the)g(EncTic)m(k)m(etP)m(art.)390 2740 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2984 y Fv(5.11)68 b(Authen)l(ticator)46 b(F)-11 b(unctions)150 3143 y Fw(An)42 b(\\Authen)m(ticator")j(is)d(an)h(ASN.1)g(structure)e(that)i(w)m(ork)g (as)g(a)f(pro)s(of)g(that)h(an)f(en)m(tit)m(y)i(o)m(wns)f(a)150 3253 y(tic)m(k)m(et.)70 b(It)39 b(is)h(usually)f(em)m(b)s(edded)f(in)h (the)g(AP-REQ)g(structure)g(\(see)h(Section)g(5.4)g([AP-REQ)g(and)150 3362 y(AP-REP)35 b(F)-8 b(unctions],)38 b(page)e(71\),)i(and)d(y)m(ou)h (most)g(lik)m(ely)g(w)m(an)m(t)h(to)f(use)f(an)g(AP-REQ)g(instead)h(of) g(a)150 3472 y(Authen)m(ticator)i(in)e(normal)h(applications.)60 b(The)36 b(follo)m(wing)i(illustrates)g(the)e(Authen)m(ticator)i(ASN.1) 150 3581 y(structure.)150 3723 y Fq(Authenticator)140 b(::=)47 b([APPLICATION)d(2])j(SEQUENCE)93 b({)532 3833 y(authenticator-vno)329 b([0])47 b(INTEGER)f(\(5\),)532 3943 y(crealm)857 b([1])47 b(Realm,)532 4052 y(cname)905 b([2])47 b(PrincipalName,)532 4162 y(cksum)905 b([3])47 b(Checksum)f(OPTIONAL,)532 4271 y(cusec)905 b([4])47 b(Microseconds,)532 4381 y(ctime)905 b([5])47 b(KerberosTime,)532 4491 y(subkey)857 b([6])47 b(EncryptionKey)d(OPTIONAL,)532 4600 y(seq-number)665 b([7])47 b(UInt32)f(OPTIONAL,)532 4710 y(authorization-data)281 b([8])47 b(AuthorizationData)c(OPTIONAL) 150 4819 y(})150 5026 y Fl(shishi)p 459 5026 37 5 v 55 w(authen)m(ticator)3350 5230 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_authenticator)51 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 5340 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)p eop end %%Page: 154 160 TeXDict begin 154 159 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(154)390 299 y(This)35 b(function)h(creates)i(a)e(new)g(Authen)m(ticator,)k(p)s(opulated)35 b(with)h(some)h(default)f(v)-5 b(alues.)59 b(It)390 408 y(uses)30 b(the)g(curren)m(t)h(time)g(as)f(returned)g(b)m(y)g(the)g (system)h(for)f(the)h(ctime)g(and)f(cusec)h(\014elds.)390 552 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(authen)m (ticator)j(or)d(NULL)g(on)g(failure.)150 760 y Fl(shishi)p 459 760 37 5 v 55 w(authen)m(ticator)p 1235 760 V 53 w(subk)m(ey)3350 965 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_authenticator_su)q(bke)q(y)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 1075 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1218 y(This)35 b(function)h(creates)i(a)e(new)g(Authen)m (ticator,)k(p)s(opulated)35 b(with)h(some)h(default)f(v)-5 b(alues.)59 b(It)390 1328 y(uses)37 b(the)i(curren)m(t)e(time)i(as)f (returned)f(b)m(y)g(the)i(system)f(for)f(the)h(ctime)h(and)f(cusec)g (\014elds.)63 b(It)390 1437 y(adds)30 b(a)g(random)g(subk)m(ey)-8 b(.)390 1580 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(authen)m(ticator)j(or)d(NULL)g(on)g(failure.)150 1788 y Fl(shishi)p 459 1788 V 55 w(authen)m(ticator)p 1235 1788 V 53 w(prin)m(t)3350 1994 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(prin)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 2103 y(Shishi)p 810 2103 28 4 v 39 w(asn1)g Fe(authenticator)p Ff(\))390 2213 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2356 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 2499 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq (shishi_authenticator\(\))p Fw(.)390 2643 y(Prin)m(t)g(ASCI)s(I)f (armored)h(DER)h(enco)s(ding)f(of)h(authen)m(ticator)h(to)f(\014le.)390 2786 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2786 V 39 w(OK)f(i\013)i(successful.)150 2994 y Fl(shishi)p 459 2994 37 5 v 55 w(authen)m(ticator)p 1235 2994 V 53 w(sa)m(v)m(e)3350 3199 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(save)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 3309 y(Shishi)p 810 3309 28 4 v 39 w(asn1)g Fe(authenticator)p Ff(\))390 3418 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3562 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 3705 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq (shishi_authenticator\(\))p Fw(.)390 3848 y(Sa)m(v)m(e)i(DER)e(enco)s (ding)g(of)h(authen)m(ticator)h(to)f(\014le.)390 3991 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3991 V 39 w(OK)f(i\013)i(successful.)150 4199 y Fl(shishi)p 459 4199 37 5 v 55 w(authen)m(ticator)p 1235 4199 V 53 w(to)p 1397 4199 V 54 w(\014le)3350 4405 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(to_f)q (ile)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 4405 28 4 v 39 w(asn1)565 4514 y Fe(authenticator)p Fi(,)i(in)m(t)30 b Fe(filetype)p Fi(,)j(const)e(c)m(har)g(*)g Fe(filename)p Ff(\))390 4624 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4767 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(to)f(sa)m(v)m(e.)390 4910 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(written,)i(see)g(Shishi)p 3182 4910 V 39 w(\014let)m(yp)s(e.)390 5054 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (write)g(to.)390 5197 y(W)-8 b(rite)32 b(Authen)m(ticator)g(to)f (\014le)f(in)h(sp)s(eci\014ed)e(TYPE.)h(The)g(\014le)h(will)f(b)s(e)g (truncated)h(if)f(it)h(exists.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 155 161 TeXDict begin 155 160 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(155)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authen)m(ticator)p 1235 299 V 53 w(parse)3350 512 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(pars)q(e)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 621 y(Shishi)p 810 621 28 4 v 39 w(asn1)g(*)f Fe(authenticator)p Ff(\))390 731 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 881 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.)390 1032 y Fi(authen)m(ticator)7 b Fw(:)42 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s(cated)h(authen)m(ticator.)390 1182 y(Read)k(ASCI)s(I)f(armored)h(DER)g(enco)s(ded)g(authen)m(ticator) i(from)e(\014le)g(and)g(p)s(opulate)g(giv)m(en)h(au-)390 1292 y(then)m(ticator)32 b(v)-5 b(ariable.)390 1442 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1442 V 39 w(OK)f(i\013)i(successful.)150 1658 y Fl(shishi)p 459 1658 37 5 v 55 w(authen)m(ticator)p 1235 1658 V 53 w(read)3350 1870 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(read)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)565 1980 y(Shishi)p 810 1980 28 4 v 39 w(asn1)g(*)f Fe(authenticator)p Ff(\))390 2089 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2240 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 2390 y Fi(authen)m(ticator)7 b Fw(:)42 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s(cated)h(authen) m(ticator.)390 2541 y(Read)24 b(DER)g(enco)s(ded)f(authen)m(ticator)i (from)f(\014le)f(and)g(p)s(opulate)h(giv)m(en)g(authen)m(ticator)i(v)-5 b(ariable.)390 2691 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2691 V 39 w(OK)f(i\013)i(successful.) 150 2907 y Fl(shishi)p 459 2907 37 5 v 55 w(authen)m(ticator)p 1235 2907 V 53 w(from)p 1538 2907 V 55 w(\014le)3350 3119 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (from)q(_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3119 28 4 v 39 w(asn1)565 3229 y(*)f Fe(authenticator)p Fi(,)j(in)m(t)d Fe(filetype)p Fi(,)i(const)e(c)m (har)g(*)g Fe(filename)p Ff(\))390 3339 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3489 y Fi(authen)m(ticator)7 b Fw(:)42 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)h(allo)s (cated)h(Authen)m(ticator.)390 3639 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h (of)f(\014le)h(to)g(b)s(e)e(read,)i(see)g(Shishi)p 3066 3639 V 39 w(\014let)m(yp)s(e.)390 3790 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h (read)g(from.)390 3940 y(Read)g(Authen)m(ticator)h(from)e(\014le)g(in)g (sp)s(eci\014ed)g(TYPE.)390 4091 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4091 V 39 w(OK)f(i\013)i(successful.) 150 4306 y Fl(shishi)p 459 4306 37 5 v 55 w(authen)m(ticator)p 1235 4306 V 53 w(set)p 1440 4306 V 54 w(crealm)3350 4519 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(set_) q(cre)q(alm)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 4628 y(Shishi)p 810 4628 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(const)d(c)m(har)g(*)f Fe(crealm)p Ff(\))390 4738 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4889 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 5039 y Fi(crealm)p Fw(:)42 b(input)29 b(arra)m(y)i(with)f (realm.)390 5189 y(Set)h(realm)f(\014eld)g(in)g(authen)m(ticator)j(to)e (sp)s(eci\014ed)f(v)-5 b(alue.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 156 162 TeXDict begin 156 161 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(156)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authen)m(ticator)p 1235 299 V 53 w(set)p 1440 299 V 54 w(cname)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(set_)q(cna)q(me)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 516 28 4 v 39 w(asn1)565 626 y Fe(authenticator)p Fi(,)j(Shishi)p 1546 626 V 38 w(name)p 1796 626 V 41 w(t)m(yp)s(e)30 b Fe(name_type)p Fi(,)j(const)e(c)m(har)g(*)g Fd([])f Fe(cname)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 1045 y Fi(name)p 608 1045 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 1045 V 39 w(name)p 2224 1045 V 40 w(t)m(yp)s(e,)i(usually)d (SHISHI)p 3091 1045 V 39 w(NT)p 3264 1045 V 40 w(UNKNO)m(WN.)390 1200 y Fi(cname)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(principal)g (name.)390 1356 y(Set)h(principal)f(\014eld)g(in)g(authen)m(ticator)i (to)f(sp)s(eci\014ed)f(v)-5 b(alue.)390 1511 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1511 V 39 w(OK)f(i\013)i(successful.)150 1730 y Fl(shishi)p 459 1730 37 5 v 55 w(authen)m(ticator)p 1235 1730 V 53 w(clien)m(t)p 1580 1730 V 53 w(set)3350 1948 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(clie)q(nt_)q (set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 2057 y(Shishi)p 810 2057 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(const)d(c)m(har)g(*)f Fe(client)p Ff(\))390 2167 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2322 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(to)f(set)g(clien)m(t)h(name)f (\014eld)f(in.)390 2477 y Fi(clien)m(t)r Fw(:)42 b(zero-terminated)32 b(string)f(with)f(principal)g(name)g(on)g(RF)m(C)h(1964)h(form.)390 2632 y(Set)f(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f(Authen)m (ticator.)390 2787 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2787 V 39 w(OK)f(i\013)i(successful.)150 3007 y Fl(shishi)p 459 3007 37 5 v 55 w(authen)m(ticator)p 1235 3007 V 53 w(ctime)3350 3224 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(ctim)q(e)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 3224 28 4 v 39 w(asn1)565 3334 y Fe(authenticator)p Fi(,)j(c)m(har)30 b(**)i Fe(t)p Ff(\))390 3443 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3598 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(as)f(allo)s(cated)h(b)m(y)f Fq(shishi_authenticator\(\))p Fw(.)390 3753 y Fi(t)r Fw(:)41 b(newly)30 b(allo)s(cated)i (zero-terminated)h(c)m(haracter)e(arra)m(y)g(with)f(clien)m(t)i(time.) 390 3908 y(Extract)f(clien)m(t)h(time)f(from)f(Authen)m(ticator.)390 4064 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4064 V 39 w(OK)f(i\013)i(successful.)150 4283 y Fl(shishi)p 459 4283 37 5 v 55 w(authen)m(ticator)p 1235 4283 V 53 w(ctime)p 1583 4283 V 54 w(set)3350 4501 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(ctim)q (e_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 4501 28 4 v 39 w(asn1)565 4610 y Fe(authenticator)p Fi(,)j(const)30 b(c)m(har)h(*)g Fe(t)p Ff(\))390 4720 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4875 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(as)f(allo)s(cated)h(b)m(y)f Fq(shishi_authenticator\(\))p Fw(.)390 5030 y Fi(t)r Fw(:)41 b(string)30 b(with)g(generalized)i(time)f(v)-5 b(alue)31 b(to)g(store)g(in)f(Authen)m(ticator.)390 5185 y(Store)h(clien)m(t)h(time)f(in)f(Authen)m(ticator.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 157 163 TeXDict begin 157 162 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(157)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authen)m(ticator)p 1235 299 V 53 w(cusec)p 1570 299 V 54 w(get)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(cuse)q(c_g)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 496 28 4 v 39 w(asn1)565 606 y Fe(authenticator)p Fi(,)j(uin)m(t32)p 1556 606 V 41 w(t)30 b(*)h Fe(cusec)p Ff(\))390 715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 850 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(as)f(allo)s(cated)h(b)m(y)f Fq(shishi_authenticator\(\))p Fw(.)390 985 y Fi(cusec)6 b Fw(:)41 b(output)30 b(in)m(teger)h(with)g (clien)m(t)h(microseconds)e(\014eld.)390 1120 y(Extract)h(clien)m(t)h (microseconds)f(\014eld)f(from)g(Authen)m(ticator.)390 1255 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1255 V 39 w(OK)f(i\013)i(successful.)150 1455 y Fl(shishi)p 459 1455 37 5 v 55 w(authen)m(ticator)p 1235 1455 V 53 w(cusec)p 1570 1455 V 54 w(set)3350 1652 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(cuse)q (c_s)q(et)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 1652 28 4 v 39 w(asn1)565 1762 y Fe(authenticator)p Fi(,)j(uin)m(t32)p 1556 1762 V 41 w(t)30 b Fe(cusec)p Ff(\))390 1871 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2006 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 2141 y Fi(cusec)6 b Fw(:)41 b(clien)m(t)32 b(microseconds)e (to)i(set)e(in)h(authen)m(ticator,)h(0-999999.)390 2276 y(Set)f(the)f(cusec)h(\014eld)f(in)g(the)h(Authen)m(ticator.)390 2411 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2411 V 39 w(OK)f(i\013)i(successful.)150 2611 y Fl(shishi)p 459 2611 37 5 v 55 w(authen)m(ticator)p 1235 2611 V 53 w(seqn)m(um)m(b)s(er)p 1866 2611 V 55 w(get)3350 2808 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (seqn)q(umb)q(er_)q(get)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 2918 y(Shishi)p 810 2918 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(uin)m(t32)p 2041 2918 V 41 w(t)d(*)f Fe(seqnumber)p Ff(\))390 3028 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3163 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 3298 y Fi(seqn)m(um)m(b)s(er)7 b Fw(:)39 b(output)30 b(in)m(teger)i(with)e(sequence)h(n)m(um)m(b)s(er) e(\014eld.)390 3433 y(Extract)i(sequence)g(n)m(um)m(b)s(er)e(\014eld)h (from)g(Authen)m(ticator.)390 3568 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3767 y Fl(shishi)p 459 3767 37 5 v 55 w(authen)m(ticator)p 1235 3767 V 53 w(seqn)m(um)m(b)s(er)p 1866 3767 V 55 w(remo)m(v)m(e)3350 3965 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(seqn)q(umb)q(er_)q(rem)q(ove)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 4074 y(Shishi)p 810 4074 28 4 v 39 w(asn1)g Fe(authenticator)p Ff(\))390 4184 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4319 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 4454 y(Remo)m(v)m(e)i(sequence)f(n)m(um)m(b)s(er)e(\014eld)h (in)g(Authen)m(ticator.)390 4589 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4789 y Fl(shishi)p 459 4789 37 5 v 55 w(authen)m(ticator)p 1235 4789 V 53 w(seqn)m(um)m(b)s(er)p 1866 4789 V 55 w(set)3350 4986 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(seqn)q(umb)q(er_)q(set)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 5095 y(Shishi)p 810 5095 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(uin)m(t32)p 2041 5095 V 41 w(t)d Fe(seqnumber)p Ff(\))390 5205 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)p eop end %%Page: 158 164 TeXDict begin 158 163 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(158)390 299 y Fi(seqn)m(um)m(b)s (er)7 b Fw(:)39 b(in)m(teger)32 b(with)e(sequence)h(n)m(um)m(b)s(er)e (\014eld)h(to)h(store)g(in)f(Authen)m(ticator.)390 436 y(Store)h(sequence)f(n)m(um)m(b)s(er)f(\014eld)h(in)g(Authen)m (ticator.)390 573 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 775 y Fl(shishi)p 459 775 37 5 v 55 w(authen)m(ticator)p 1235 775 V 53 w(clien)m(t)3350 974 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(clie)q(nt)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 974 28 4 v 38 w(asn1)565 1084 y Fe(authenticator)p Fi(,)i(c)m(har)30 b(**)i Fe(client)p Fi(,)g(size)p 2138 1084 V 41 w(t)f(*)f Fe(clientlen)p Ff(\))390 1193 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 1331 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(v)-5 b(ariable)32 b(to)f(get)g(clien)m(t)h(name)f(from.)390 1468 y Fi(clien)m(t)r Fw(:)48 b(p)s(oin)m(ter)34 b(to)g(newly)f(allo)s (cated)i(zero)f(terminated)g(string)g(con)m(taining)h(principal)e (name.)390 1577 y(Ma)m(y)f(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s (opulate)h Fq(clientlen)p Fw(\).)390 1714 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h(excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 1824 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 1961 y(Represen)m(t)45 b(clien)m(t)i(principal)d (name)h(in)f(Authen)m(ticator)j(as)e(zero-terminated)h(string.)84 b(The)390 2071 y(string)24 b(is)g(allo)s(cate)i(b)m(y)e(this)g (function,)h(and)e(it)i(is)f(the)g(resp)s(onsibilit)m(y)g(of)g(the)g (caller)h(to)g(deallo)s(cate)390 2180 y(it.)41 b(Note)32 b(that)f(the)f(output)g(length)h Fq(clientlen)d Fw(do)s(es)i(not)h (include)f(the)g(terminating)i(zero.)390 2317 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2317 V 39 w(OK)f(i\013)i(successful.)150 2519 y Fl(shishi)p 459 2519 37 5 v 55 w(authen)m(ticator)p 1235 2519 V 53 w(clien)m(trealm) 3350 2719 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b (shishi_authenticator_)q(clie)q(ntr)q(eal)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 2828 y(Shishi)p 810 2828 28 4 v 39 w(asn1)g Fe(authenticator)p Fi(,)j(c)m(har)d(**)g Fe(client)p Fi(,)h(size)p 2623 2828 V 41 w(t)f(*)g Fe(clientlen)p Ff(\))390 2938 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3075 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(v)-5 b(ariable)32 b(to)f(get)g(clien)m(t)h(name)f(and)e(realm)i (from.)390 3212 y Fi(clien)m(t)r Fw(:)53 b(p)s(oin)m(ter)36 b(to)g(newly)f(allo)s(cated)j(zero)e(terminated)h(string)e(con)m (taining)j(principal)d(name)390 3322 y(and)30 b(realm.)41 b(Ma)m(y)31 b(b)s(e)f Fq(NULL)f Fw(\(to)j(only)e(p)s(opulate)h Fq(clientlen)p Fw(\).)390 3459 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h (excluding)f(terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 3568 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 3705 y(Con)m(v)m(ert)i(cname)g(and)e(realm)i(\014elds)f (from)f(Authen)m(ticator)j(to)f(prin)m(table)g(principal)f(name)g(for-) 390 3815 y(mat.)39 b(The)25 b(string)g(is)h(allo)s(cate)h(b)m(y)e(this) h(function,)g(and)e(it)i(is)f(the)h(resp)s(onsibilit)m(y)f(of)g(the)h (caller)g(to)390 3924 y(deallo)s(cate)e(it.)38 b(Note)22 b(that)g(the)g(output)f(length)g Fq(clientlen)e Fw(do)s(es)i(not)h (include)f(the)g(terminating)390 4034 y(zero.)390 4171 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4171 V 39 w(OK)f(i\013)i(successful.)150 4373 y Fl(shishi)p 459 4373 37 5 v 55 w(authen)m(ticator)p 1235 4373 V 53 w(c)m(ksum)3350 4572 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(cksu)q(m)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 4572 28 4 v 39 w(asn1)565 4682 y Fe(authenticator)p Fi(,)j(in)m(t32)p 1505 4682 V 41 w(t)c(*)g Fe(cksumtype)p Fi(,)i(c)m(har)e(**)g Fe(cksum)p Fi(,)h(size)p 2993 4682 V 41 w(t)e(*)h Fe(cksumlen)p Ff(\))390 4792 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4929 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 5066 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(output)30 b(c)m(hec)m(ksum)h(t)m(yp)s(e.)390 5203 y Fi(c)m(ksum)p Fw(:)41 b(newly)30 b(allo)s(cated)i(output)e(c)m(hec)m (ksum)h(data)g(from)f(authen)m(ticator.)390 5340 y Fi(c)m(ksumlen)p Fw(:)41 b(on)30 b(output,)g(actual)i(size)f(of)g(allo)s(cated)h(output) e(c)m(hec)m(ksum)h(data)g(bu\013er.)p eop end %%Page: 159 165 TeXDict begin 159 164 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(159)390 299 y(Read)31 b(c)m(hec)m(ksum)g(v)-5 b(alue)31 b(from)f(authen)m(ticator.)43 b Fq(cksum)29 b Fw(is)i(allo)s(cated)h(b)m(y)f(this)f(function,)g(and)g (it)390 408 y(is)g(the)h(resp)s(onsibilit)m(y)f(of)h(caller)h(to)f (deallo)s(cate)h(it.)390 543 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 543 28 4 v 39 w(OK)f(i\013)i (successful.)150 743 y Fl(shishi)p 459 743 37 5 v 55 w(authen)m(ticator)p 1235 743 V 53 w(set)p 1440 743 V 54 w(c)m(ksum)3350 940 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(set_)q(cks)q(um)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 940 28 4 v 39 w(asn1)565 1050 y Fe(authenticator)p Fi(,)j(in)m(t32)p 1505 1050 V 41 w(t)c Fe(cksumtype)p Fi(,)i(c)m(har)e(*)g Fe(cksum)p Fi(,)h(size)p 2872 1050 V 41 w(t)e Fe(cksumlen)p Ff(\))390 1159 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1294 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 1429 y Fi(c)m(ksum)m(t)m(yp)s(e) 5 b Fw(:)41 b(input)30 b(c)m(hec)m(ksum)h(t)m(yp)s(e)f(to)i(store)f(in) f(authen)m(ticator.)390 1564 y Fi(c)m(ksum)p Fw(:)41 b(input)29 b(c)m(hec)m(ksum)i(data)g(to)g(store)g(in)f(authen)m (ticator.)390 1698 y Fi(c)m(ksumlen)p Fw(:)41 b(size)31 b(of)g(input)e(c)m(hec)m(ksum)i(data)g(to)g(store)g(in)f(authen)m (ticator.)390 1833 y(Store)43 b(c)m(hec)m(ksum)h(v)-5 b(alue)44 b(in)e(authen)m(ticator.)81 b(A)44 b(c)m(hec)m(ksum)f(is)g (usually)g(created)h(b)m(y)f(calling)390 1943 y Fq(shishi_checksum\(\)) 28 b Fw(on)k(some)h(application)g(sp)s(eci\014c)f(data)h(using)f(the)h (k)m(ey)g(from)f(the)g(tic)m(k)m(et)390 2052 y(that)42 b(is)g(b)s(eing)f(used.)74 b(T)-8 b(o)42 b(sa)m(v)m(e)i(time,)h(y)m(ou) d(ma)m(y)g(w)m(an)m(t)h(to)f(use)g Fq(shishi_authenticator_)390 2162 y(add_cksum\(\))34 b Fw(instead,)39 b(whic)m(h)d(calculates)j(the) e(c)m(hec)m(ksum)h(and)e(calls)i(this)f(function)f(in)h(one)390 2271 y(step.)390 2406 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2406 V 39 w(OK)f(i\013)i(successful.) 150 2606 y Fl(shishi)p 459 2606 37 5 v 55 w(authen)m(ticator)p 1235 2606 V 53 w(add)p 1484 2606 V 54 w(c)m(ksum)3350 2803 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (add_)q(cks)q(um)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 2803 28 4 v 39 w(asn1)565 2913 y Fe(authenticator)p Fi(,)j(Shishi)p 1546 2913 V 38 w(k)m(ey)d(*)e Fe(key)p Fi(,)i(in)m(t)f Fe(keyusage)p Fi(,)i(c)m(har)d(*)h Fe(data)p Fi(,)h(size)p 3331 2913 V 41 w(t)565 3022 y Fe(datalen)p Ff(\))390 3132 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3267 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 3401 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(to)f(use)f (for)g(encryption.)390 3536 y Fi(k)m(eyusage)5 b Fw(:)42 b(cryptographic)31 b(k)m(ey)g(usage)g(v)-5 b(alue)31 b(to)g(use)f(in)g(encryption.)390 3671 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(calculate)i(c)m(hec)m(ksum)e (on.)390 3806 y Fi(datalen)p Fw(:)42 b(size)31 b(of)f(input)g(arra)m(y) h(with)f(data)h(to)g(calculate)i(c)m(hec)m(ksum)e(on.)390 3941 y(Calculate)h(c)m(hec)m(ksum)f(for)f(data)h(and)f(store)h(it)g(in) f(the)h(authen)m(ticator.)390 4075 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4075 V 39 w(OK)f(i\013)i(successful.)150 4275 y Fl(shishi)p 459 4275 37 5 v 55 w(authen)m(ticator)p 1235 4275 V 53 w(add)p 1484 4275 V 54 w(c)m(ksum)p 1873 4275 V 54 w(t)m(yp)s(e)3350 4472 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (add_)q(cks)q(um_)q(typ)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 4582 y(Shishi)p 810 4582 28 4 v 39 w(asn1)g Fe(authenticator)p Fi(,)j(Shishi)p 2031 4582 V 39 w(k)m(ey)d(*)g Fe(key)p Fi(,)g(in)m(t)g Fe(keyusage)p Fi(,)i(in)m(t)565 4691 y Fe(cksumtype)p Fi(,)g(c)m(har)e(*)g Fe(data)p Fi(,)h(size)p 1779 4691 V 41 w(t)e Fe(datalen)p Ff(\))390 4801 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4936 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 5070 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(to)f(use)f (for)g(encryption.)390 5205 y Fi(k)m(eyusage)5 b Fw(:)42 b(cryptographic)31 b(k)m(ey)g(usage)g(v)-5 b(alue)31 b(to)g(use)f(in)g(encryption.)390 5340 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(c)m(hec)m(ksum)32 b(to)f(t)m(yp)s(e)f(to)h(calculate)i(c)m (hec)m(ksum.)p eop end %%Page: 160 166 TeXDict begin 160 165 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(160)390 299 y Fi(data)p Fw(:)41 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(calculate)i(c)m(hec) m(ksum)e(on.)390 450 y Fi(datalen)p Fw(:)42 b(size)31 b(of)f(input)g(arra)m(y)h(with)f(data)h(to)g(calculate)i(c)m(hec)m (ksum)e(on.)390 602 y(Calculate)h(c)m(hec)m(ksum)f(for)f(data)h(and)f (store)h(it)g(in)f(the)h(authen)m(ticator.)390 753 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 753 28 4 v 39 w(OK)f(i\013)i(successful.)150 969 y Fl(shishi)p 459 969 37 5 v 55 w(authen)m(ticator)p 1235 969 V 53 w(clear)p 1543 969 V 54 w(authorizationdata)3350 1183 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (clea)q(r_a)q(uth)q(ori)q(zati)q(ond)q(ata)f Ff(\()p Fi(Shishi)30 b(*)565 1292 y Fe(handle)p Fi(,)i(Shishi)p 1179 1292 28 4 v 39 w(asn1)f Fe(authenticator)p Ff(\))390 1402 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1553 y Fi(authen)m(ticator)7 b Fw(:)42 b(Authen)m(ticator)32 b(as)f(allo)s(cated)h(b)m(y)f Fq(shishi_authenticator\(\))p Fw(.)390 1704 y(Remo)m(v)m(e)h(the)f (authorization-data)i(\014eld)d(from)g(Authen)m(ticator.)390 1856 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1856 V 39 w(OK)f(i\013)i(successful.)150 2072 y Fl(shishi)p 459 2072 37 5 v 55 w(authen)m(ticator)p 1235 2072 V 53 w(add)p 1484 2072 V 54 w(authorizationdata)3350 2285 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (add_)q(aut)q(hor)q(iza)q(tion)q(dat)q(a)e Ff(\()p Fi(Shishi)30 b(*)565 2395 y Fe(handle)p Fi(,)i(Shishi)p 1179 2395 28 4 v 39 w(asn1)f Fe(authenticator)p Fi(,)j(in)m(t32)p 2359 2395 V 42 w(t)d Fe(adtype)p Fi(,)h(const)f(c)m(har)g(*)f Fe(addata)p Fi(,)565 2505 y(size)p 712 2505 V 41 w(t)h Fe(addatalen)p Ff(\))390 2614 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2766 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 2917 y Fi(adt)m(yp)s(e)5 b Fw(:)41 b(input)29 b(authorization)j(data)f(t)m(yp)s(e)g(to)g(add.)390 3068 y Fi(addata)p Fw(:)41 b(input)30 b(authorization)i(data)f(to)g(add.)390 3220 y Fi(addatalen)p Fw(:)42 b(size)31 b(of)f(input)g(authorization)i (data)f(to)g(add.)390 3371 y(Add)e(authorization)j(data)f(to)h(authen)m (ticator.)390 3522 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3522 V 39 w(OK)f(i\013)i(successful.)150 3738 y Fl(shishi)p 459 3738 37 5 v 55 w(authen)m(ticator)p 1235 3738 V 53 w(authorizationdata)3350 3952 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(auth)q(ori)q (zat)q(ion)q(data)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 4061 y(Shishi)p 810 4061 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(in)m(t32)p 1990 4061 V 42 w(t)c(*)h Fe(adtype)p Fi(,)h(c)m(har)f(**)g Fe(addata)p Fi(,)i(size)p 3374 4061 V 41 w(t)d(*)565 4171 y Fe(addatalen)p Fi(,)j(size)p 1238 4171 V 41 w(t)e Fe(nth)p Ff(\))390 4281 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4432 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 4583 y Fi(adt)m(yp)s(e)5 b Fw(:)41 b(output)30 b(authorization)i(data)f(t)m(yp)s(e.)390 4735 y Fi(addata)p Fw(:)41 b(newly)30 b(allo)s(cated)j(output)d (authorization)i(data.)390 4886 y Fi(addatalen)p Fw(:)42 b(on)30 b(output,)g(actual)i(size)f(of)g(newly)f(allo)s(cated)i (authorization)g(data.)390 5037 y Fi(n)m(th)p Fw(:)40 b(elemen)m(t)32 b(n)m(um)m(b)s(er)d(of)i(authorization-data)i(to)e (extract.)390 5189 y Fk(Extract)g(n:)40 b Fw(th)31 b(authorization)h (data)f(from)e(authen)m(ticator.)43 b(The)30 b(\014rst)g(\014eld)g(is)g (1.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 161 167 TeXDict begin 161 166 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(161)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authen)m(ticator)p 1235 299 V 53 w(remo)m(v)m(e)p 1672 299 V 54 w(subk)m(ey)3350 494 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(remo)q (ve_)q(sub)q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 603 y(Shishi)p 810 603 28 4 v 39 w(asn1)h Fe(authenticator)p Ff(\))390 713 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 846 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 980 y(Remo)m(v)m(e)i(subk)m(ey)e(from)g(the)h(authen)m (ticator.)390 1113 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1113 V 39 w(OK)f(i\013)i(successful.)150 1311 y Fl(shishi)p 459 1311 37 5 v 55 w(authen)m(ticator)p 1235 1311 V 53 w(get)p 1453 1311 V 54 w(subk)m(ey)3350 1505 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (get_)q(sub)q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 1615 y(Shishi)p 810 1615 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(Shishi)p 2031 1615 V 39 w(k)m(ey)d(**)g Fe(subkey)p Ff(\))390 1725 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1858 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 1992 y Fi(subk)m(ey)8 b Fw(:)40 b(output)30 b(newly)g(allo)s(cated)j(subk)m(ey)d(from)g(authen)m(ticator.)390 2125 y(Read)h(subk)m(ey)f(v)-5 b(alue)30 b(from)g(authen)m(ticator.)390 2259 y Fk(Return)36 b(v)-5 b(alue:)54 b Fw(Returns)36 b(SHISHI)p 1659 2259 V 39 w(OK)g(if)g(successful)h(or)f(SHISHI)p 2806 2259 V 39 w(ASN1)p 3077 2259 V 41 w(NO)p 3257 2259 V 39 w(ELEMENT)390 2368 y(if)30 b(subk)m(ey)g(is)h(not)f(presen)m(t.) 150 2565 y Fl(shishi)p 459 2565 37 5 v 55 w(authen)m(ticator)p 1235 2565 V 53 w(set)p 1440 2565 V 54 w(subk)m(ey)3350 2760 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (set_)q(sub)q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 2870 y(Shishi)p 810 2870 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(in)m(t32)p 1990 2870 V 42 w(t)c Fe(subkeytype)p Fi(,)k(const)d(c)m(har)f(*)h Fe(subkey)p Fi(,)565 2979 y(size)p 712 2979 V 41 w(t)g Fe(subkeylen)p Ff(\))390 3089 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3222 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 3356 y Fi(subk)m(eyt)m(yp)s(e)5 b Fw(:)41 b(input)29 b(subk)m(ey)h(t)m(yp)s(e)h(to)g(store)g(in)f(authen)m(ticator.)390 3489 y Fi(subk)m(ey)8 b Fw(:)40 b(input)30 b(subk)m(ey)g(data)h(to)g (store)g(in)f(authen)m(ticator.)390 3623 y Fi(subk)m(eylen)p Fw(:)41 b(size)31 b(of)f(input)g(subk)m(ey)g(data)h(to)g(store)g(in)f (authen)m(ticator.)390 3756 y(Store)i(subk)m(ey)e(v)-5 b(alue)32 b(in)f(authen)m(ticator.)46 b(A)31 b(subk)m(ey)g(is)h (usually)f(created)h(b)m(y)f(calling)i Fq(shishi_)390 3866 y(key_random\(\))23 b Fw(using)j(the)g(default)h(encryption)f(t)m (yp)s(e)g(of)h(the)f(k)m(ey)h(from)f(the)g(tic)m(k)m(et)j(that)e(is)f (b)s(e-)390 3976 y(ing)h(used.)39 b(T)-8 b(o)28 b(sa)m(v)m(e)g(time,)h (y)m(ou)f(ma)m(y)f(w)m(an)m(t)h(to)g(use)f Fq(shishi_authenticator_add) o(_sub)o(key\()o(\))390 4085 y Fw(instead,)k(whic)m(h)f(calculates)j (the)d(subk)m(ey)g(and)g(calls)i(this)e(function)g(in)g(one)h(step.)390 4219 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4219 V 39 w(OK)f(i\013)i(successful.)150 4416 y Fl(shishi)p 459 4416 37 5 v 55 w(authen)m(ticator)p 1235 4416 V 53 w(add)p 1484 4416 V 54 w(random)p 1947 4416 V 55 w(subk)m(ey)3350 4611 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(add_)q(ran)q(dom)q(_su)q(bkey)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 4720 y(Shishi)p 810 4720 28 4 v 39 w(asn1)h Fe(authenticator)p Ff(\))390 4830 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4963 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 5097 y(Generate)c(random)d(subk)m(ey)-8 b(,)26 b(of)e(the)h(default)f(encryption)g(t)m(yp)s(e)h(from)f (con\014guration,)i(and)d(store)390 5206 y(it)31 b(in)f(the)h(authen)m (ticator.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 162 168 TeXDict begin 162 167 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(162)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authen)m(ticator)p 1235 299 V 53 w(add)p 1484 299 V 54 w(random)p 1947 299 V 55 w(subk)m(ey)p 2369 299 V 54 w(et)m(yp)s(e)3350 489 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q(add_)q(ran)q(dom)q(_su)q(bkey)q (_et)q(ype)f Ff(\()p Fi(Shishi)30 b(*)565 599 y Fe(handle)p Fi(,)i(Shishi)p 1179 599 28 4 v 39 w(asn1)f Fe(authenticator)p Fi(,)j(in)m(t)d Fe(etype)p Ff(\))390 708 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 839 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 970 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(encryption)31 b(t)m(yp)s(e)f(of)h(random)e(k)m(ey)i(to)h (generate.)390 1102 y(Generate)j(random)e(subk)m(ey)h(of)g(indicated)g (encryption)g(t)m(yp)s(e,)h(and)e(store)h(it)g(in)g(the)g(authen)m(ti-) 390 1211 y(cator.)390 1342 y Fk(Return)c(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1342 V 39 w(OK)f(i\013)i(successful.) 150 1535 y Fl(shishi)p 459 1535 37 5 v 55 w(authen)m(ticator)p 1235 1535 V 53 w(add)p 1484 1535 V 54 w(subk)m(ey)3350 1725 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authenticator_)q (add_)q(sub)q(key)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)565 1834 y(Shishi)p 810 1834 28 4 v 39 w(asn1)h Fe(authenticator)p Fi(,)j(Shishi)p 2031 1834 V 39 w(k)m(ey)d(*)g Fe(subkey)p Ff(\))390 1944 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2075 y Fi(authen)m(ticator)7 b Fw(:)42 b(authen)m(ticator)33 b(as)d(allo)s(cated)j(b)m(y)d Fq(shishi_authenticator\(\))p Fw(.)390 2206 y Fi(subk)m(ey)8 b Fw(:)40 b(subk)m(ey)30 b(to)h(add)f(to)h(authen)m(ticator.)390 2337 y(Store)g(subk)m(ey)f(in)g (the)g(authen)m(ticator.)390 2469 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2469 V 39 w(OK)f(i\013)i(successful.)150 2694 y Fv(5.12)68 b(KRB-ERR)l(OR)47 b(F)-11 b(unctions)150 2854 y Fw(The)21 b(\\KRB-ERR)m(OR")i(is)e(an)h (ASN.1)g(structure)f(that)h(can)g(b)s(e)e(returned,)j(instead)f(of,)h (e.g.,)i(KDC-REP)150 2963 y(or)k(AP-REP)-8 b(,)29 b(to)g(indicate)h(v) -5 b(arious)28 b(error)g(conditions.)41 b(Unfortunately)-8 b(,)30 b(the)e(seman)m(tics)i(of)f(sev)m(eral)h(of)150 3073 y(the)g(\014elds)f(are)i(ill)f(sp)s(eci\014ed,)g(so)g(the)g(t)m (ypically)i(pro)s(cedure)c(is)i(to)h(extract)g(\\e-text")i(and/or)d (\\e-data")150 3182 y(and)g(sho)m(w)g(it)h(to)g(the)g(user.)40 b(The)30 b(follo)m(wing)h(illustrates)h(the)e(KRB-ERR)m(OR)h(ASN.1)g (structure.)150 3314 y Fq(KRB-ERROR)332 b(::=)47 b([APPLICATION)d(30])j (SEQUENCE)e({)532 3423 y(pvno)571 b([0])47 b(INTEGER)f(\(5\),)532 3533 y(msg-type)379 b([1])47 b(INTEGER)f(\(30\),)532 3642 y(ctime)523 b([2])47 b(KerberosTime)e(OPTIONAL,)532 3752 y(cusec)523 b([3])47 b(Microseconds)e(OPTIONAL,)532 3862 y(stime)523 b([4])47 b(KerberosTime,)532 3971 y(susec)523 b([5])47 b(Microseconds,)532 4081 y(error-code)283 b([6])47 b(Int32,)532 4190 y(crealm)475 b([7])47 b(Realm)g(OPTIONAL,)532 4300 y(cname)523 b([8])47 b(PrincipalName)e(OPTIONAL,)532 4409 y(realm)523 b([9])47 b(Realm)g(--)g(service)f(realm)g(--,)532 4519 y(sname)523 b([10])47 b(PrincipalName)d(--)j(service)f(name)h(--,) 532 4629 y(e-text)475 b([11])47 b(KerberosString)d(OPTIONAL,)532 4738 y(e-data)475 b([12])47 b(OCTET)f(STRING)h(OPTIONAL)150 4848 y(})150 5040 y Fl(shishi)p 459 5040 37 5 v 55 w(krb)s(error)3350 5230 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_krberror)50 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 5340 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)p eop end %%Page: 163 169 TeXDict begin 163 168 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(163)390 299 y(This)30 b(function)g(creates)h(a)g(new)f(KRB-ERR)m(OR,)h(p)s(opulated)f(with)g (some)g(default)h(v)-5 b(alues.)390 435 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(KRB-ERR)m(OR)h(or)f(NULL)g (on)h(failure.)150 636 y Fl(shishi)p 459 636 37 5 v 55 w(krb)s(error)p 967 636 V 56 w(prin)m(t)3350 835 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_print)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2974 835 28 4 v 39 w(asn1)565 945 y Fe(krberror)p Ff(\))390 1054 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1191 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (writing.)390 1327 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(to)g(prin)m(t.)390 1464 y(Prin)m(t)f(ASCI)s(I)f(armored)h(DER)h(enco) s(ding)f(of)h(KRB-ERR)m(OR)f(to)h(\014le.)390 1600 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1600 V 39 w(OK)f(i\013)i(successful.)150 1801 y Fl(shishi)p 459 1801 37 5 v 55 w(krb)s(error)p 967 1801 V 56 w(sa)m(v)m(e)3350 2000 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_save)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(FILE)f(*)f Fe(fh)p Fi(,)h(Shishi)p 2921 2000 28 4 v 39 w(asn1)565 2109 y Fe(krberror)p Ff(\))390 2219 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2355 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(writing.)390 2492 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(to)g(sa)m(v)m(e.) 390 2628 y(Sa)m(v)m(e)h(DER)e(enco)s(ding)g(of)h(KRB-ERR)m(OR)f(to)i (\014le.)390 2765 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2765 V 39 w(OK)f(i\013)i(successful.)150 2966 y Fl(shishi)p 459 2966 37 5 v 55 w(krb)s(error)p 967 2966 V 56 w(to)p 1132 2966 V 54 w(\014le)3350 3164 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_to_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 3164 28 4 v 39 w(asn1)565 3274 y Fe(krberror)p Fi(,)h(in)m(t)e Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 3384 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3520 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(to)g(sa)m(v)m(e.) 390 3656 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g (b)s(e)e(written,)i(see)g(Shishi)p 3182 3656 V 39 w(\014let)m(yp)s(e.) 390 3793 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(write)g(to.)390 3929 y(W)-8 b(rite)32 b(KRB-ERR)m(OR)e(to)h(\014le)g(in)f(sp)s (eci\014ed)g(TYPE.)g(The)g(\014le)g(will)h(b)s(e)e(truncated)i(if)f(it) h(exists.)390 4066 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4066 V 39 w(OK)f(i\013)i(successful.)150 4267 y Fl(shishi)p 459 4267 37 5 v 55 w(krb)s(error)p 967 4267 V 56 w(parse)3350 4466 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_parse)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)g(Shishi)p 2974 4466 28 4 v 39 w(asn1)565 4575 y(*)g Fe(krberror)p Ff(\))390 4685 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4821 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g(reading.) 390 4958 y Fi(krb)s(error)7 b Fw(:)38 b(output)30 b(v)-5 b(ariable)32 b(with)e(newly)g(allo)s(cated)i(KRB-ERR)m(OR.)390 5094 y(Read)d(ASCI)s(I)e(armored)h(DER)h(enco)s(ded)f(KRB-ERR)m(OR)h (from)f(\014le)g(and)g(p)s(opulate)h(giv)m(en)g(v)-5 b(ari-)390 5204 y(able.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 164 170 TeXDict begin 164 169 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(164)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(read)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_read)f Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(FILE)e(*)h Fe(fh)p Fi(,)g(Shishi)p 2915 516 28 4 v 39 w(asn1)g(*)565 626 y Fe(krberror)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(en)g(for)g (reading.)390 1045 y Fi(krb)s(error)7 b Fw(:)38 b(output)30 b(v)-5 b(ariable)32 b(with)e(newly)g(allo)s(cated)i(KRB-ERR)m(OR.)390 1200 y(Read)f(DER)f(enco)s(ded)g(KRB-ERR)m(OR)h(from)e(\014le)i(and)f (p)s(opulate)g(giv)m(en)h(v)-5 b(ariable.)390 1356 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1356 V 39 w(OK)f(i\013)i(successful.)150 1575 y Fl(shishi)p 459 1575 37 5 v 55 w(krb)s(error)p 967 1575 V 56 w(from)p 1273 1575 V 55 w(\014le)3350 1793 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_from_)q(file)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 1793 28 4 v 39 w(asn1)e(*)565 1902 y Fe(krberror)p Fi(,)j(in)m(t)e Fe(filetype)p Fi(,)i(const)e(c)m(har)g(*)f Fe(filename)p Ff(\))390 2012 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2167 y Fi(krb)s(error)7 b Fw(:)38 b(output)30 b(v)-5 b(ariable)32 b(with)e(newly)g(allo)s(cated)i(KRB-ERR)m(OR.)390 2322 y Fi(\014let)m(yp)s(e)5 b Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(sp)s(ecifying)f(t)m(yp)s(e)h(of)f(\014le)h(to)g(b)s(e)e (read,)i(see)g(Shishi)p 3066 2322 V 39 w(\014let)m(yp)s(e.)390 2477 y Fi(\014lename)5 b Fw(:)41 b(input)29 b(v)-5 b(ariable)32 b(with)e(\014lename)g(to)h(read)g(from.)390 2632 y(Read)g(KRB-ERR)m(OR) f(from)g(\014le)g(in)g(sp)s(eci\014ed)g(TYPE.)390 2787 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2787 V 39 w(OK)f(i\013)i(successful.)150 3007 y Fl(shishi)p 459 3007 37 5 v 55 w(krb)s(error)p 967 3007 V 56 w(build)3350 3224 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_build)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3224 28 4 v 39 w(asn1)d Fe(krberror)p Ff(\))390 3334 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3489 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 3644 y(Finish)k(KRB-ERR)m(OR,)h (called)h(b)s(efore)f(e.g.)54 b(shishi)p 2253 3644 V 40 w(krb)s(error)p 2624 3644 V 38 w(der.)f(This)34 b(function)h(remo)m (v)m(es)390 3753 y(empt)m(y)c(but)e(OPTIONAL)h(\014elds)g(\(suc)m(h)g (as)h(cname\),)g(and)390 3908 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3908 V 39 w(OK)f(i\013)i(successful.) 150 4128 y Fl(shishi)p 459 4128 37 5 v 55 w(krb)s(error)p 967 4128 V 56 w(der)3350 4346 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_der)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 4346 28 4 v 39 w(asn1)f Fe(krberror)p Fi(,)565 4455 y(c)m(har)g(**)g Fe(out)p Fi(,)h(size)p 1246 4455 V 40 w(t)f(*)g Fe(outlen)p Ff(\))390 4565 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4720 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated) h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 4875 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(DER)f (enco)s(ding)f(of)h(KRB-ERR)m(OR.)390 5030 y Fi(outlen)p Fw(:)41 b(length)31 b(of)f(output)g(arra)m(y)h(with)f(DER)h(enco)s (ding)f(of)h(KRB-ERR)m(OR.)390 5185 y(DER)g(enco)s(de)f(KRB-ERR)m(OR.)h (The)f(caller)h(m)m(ust)g(deallo)s(cate)h(the)f(OUT)f(bu\013er.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 165 171 TeXDict begin 165 170 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(165)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(crealm)3350 507 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_creal)q (m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 507 28 4 v 39 w(asn1)565 617 y Fe(krberror)p Fi(,)h(c)m(har)e(**)g Fe(realm)p Fi(,)h(size)p 1824 617 V 41 w(t)f(*)f Fe(realmlen)p Ff(\))390 726 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 872 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m (y)e Fq(shishi_krberror\(\))p Fw(.)390 1018 y Fi(realm)p Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)j(name)d (of)g(realm)h(in)f(KRB-ERR)m(OR.)390 1164 y Fi(realmlen)p Fw(:)41 b(size)32 b(of)e(output)g(arra)m(y)-8 b(.)390 1310 y(Extract)31 b(clien)m(t)h(realm)f(from)f(KRB-ERR)m(OR.)390 1456 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1456 V 39 w(OK)f(i\013)i(successful.)150 1666 y Fl(shishi)p 459 1666 37 5 v 55 w(krb)s(error)p 967 1666 V 56 w(remo)m(v)m(e)p 1407 1666 V 53 w(crealm)3350 1875 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q(e_cr) q(eal)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 1875 28 4 v 39 w(asn1)565 1984 y Fe(krberror)p Ff(\))390 2094 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2240 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2386 y(Remo)m(v)m(e)i(clien)m(t)g (realm)f(\014eld)f(in)g(KRB-ERR)m(OR.)390 2532 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2532 V 39 w(OK)f(i\013)i(successful.)150 2742 y Fl(shishi)p 459 2742 37 5 v 55 w(krb)s(error)p 967 2742 V 56 w(set)p 1175 2742 V 54 w(crealm)3350 2950 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_c)q(real)q(m)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 2950 28 4 v 39 w(asn1)565 3060 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(crealm)p Ff(\))390 3170 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3315 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 3461 y Fi(crealm)p Fw(:)42 b(input)29 b(arra)m(y)i(with)f (realm.)390 3607 y(Set)h(realm)f(\014eld)g(in)g(krb)s(error)f(to)i(sp)s (eci\014ed)f(v)-5 b(alue.)390 3753 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3753 V 39 w(OK)f(i\013)i(successful.)150 3964 y Fl(shishi)p 459 3964 37 5 v 55 w(krb)s(error)p 967 3964 V 56 w(clien)m(t)3350 4172 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_clien)q (t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 4172 28 4 v 39 w(asn1)565 4282 y Fe(krberror)p Fi(,)h(c)m(har)e (**)g Fe(client)p Fi(,)h(size)p 1876 4282 V 41 w(t)f(*)g Fe(clientlen)p Ff(\))390 4391 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4537 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 4683 y Fi(clien)m(t)r Fw(:)48 b(p)s(oin)m(ter)34 b(to)g(newly)f(allo)s(cated)i(zero)f(terminated)g(string)g(con)m (taining)h(principal)e(name.)390 4793 y(Ma)m(y)f(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)h Fq(clientlen)p Fw(\).)390 4939 y Fi(clien)m(tlen)p Fw(:)41 b(p)s(oin)m(ter)27 b(to)h(length)f(of)g Fq(client)e Fw(on)i(output,)h(excluding)f (terminating)h(zero.)40 b(Ma)m(y)29 b(b)s(e)390 5048 y Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)g Fq(client)p Fw(\).)390 5194 y(Return)g(clien)m(t)i(principal)e(name)g(in)g(KRB-ERR) m(OR.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 166 172 TeXDict begin 166 171 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(166)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(set)p 1175 299 V 54 w(cname)3350 516 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_c)q(name)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 516 28 4 v 39 w(asn1)565 626 y Fe(krberror)p Fi(,)h(Shishi)p 1284 626 V 39 w(name)p 1535 626 V 40 w(t)m(yp)s(e)e Fe(name_type)p Fi(,)i(const)e(c)m(har)g(*)f Fd([])g Fe(cname)p Ff(\))390 735 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 890 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 1045 y Fi(name)p 608 1045 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i (see)f(Shishi)p 1973 1045 V 39 w(name)p 2224 1045 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 1045 V 39 w(NT)p 3264 1045 V 40 w(UNKNO)m(WN.)390 1200 y Fi(cname)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(principal)g(name.)390 1356 y(Set)h(principal)f(\014eld)g(in)g(krb)s(error)e(to)j(sp)s (eci\014ed)f(v)-5 b(alue.)390 1511 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1511 V 39 w(OK)f(i\013)i(successful.)150 1730 y Fl(shishi)p 459 1730 37 5 v 55 w(krb)s(error)p 967 1730 V 56 w(remo)m(v)m(e)p 1407 1730 V 53 w(cname)3350 1948 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q(e_cn)q(ame)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 1948 28 4 v 39 w(asn1)565 2057 y Fe(krberror)p Ff(\))390 2167 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2322 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2477 y(Remo)m(v)m(e)i(clien)m(t)g (realm)f(\014eld)f(in)g(KRB-ERR)m(OR.)390 2632 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2632 V 39 w(OK)f(i\013)i(successful.)150 2852 y Fl(shishi)p 459 2852 37 5 v 55 w(krb)s(error)p 967 2852 V 56 w(clien)m(t)p 1315 2852 V 53 w(set)3350 3069 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_clien)q(t_se)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 3069 28 4 v 39 w(asn1)565 3179 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(client)p Ff(\))390 3288 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3443 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(to)i(set)g(clien)m(t)h(name)e(\014eld)g(in.)390 3598 y Fi(clien)m(t)r Fw(:)42 b(zero-terminated)32 b(string)f(with)f (principal)g(name)g(on)g(RF)m(C)h(1964)h(form.)390 3753 y(Set)f(the)f(clien)m(t)i(name)f(\014eld)e(in)i(the)f(Krb)s(error.)390 3908 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3908 V 39 w(OK)f(i\013)i(successful.)150 4128 y Fl(shishi)p 459 4128 37 5 v 55 w(krb)s(error)p 967 4128 V 56 w(realm)3350 4346 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_realm)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 4346 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 4455 y(c)m(har)h(**)g Fe(realm)p Fi(,)h(size)p 1350 4455 V 41 w(t)f(*)f Fe(realmlen)p Ff(\))390 4565 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4720 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated) h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 4875 y Fi(realm)p Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)j(name)d (of)g(realm)h(in)f(KRB-ERR)m(OR.)390 5030 y Fi(realmlen)p Fw(:)41 b(size)32 b(of)e(output)g(arra)m(y)-8 b(.)390 5185 y(Extract)31 b(\(serv)m(er\))h(realm)e(from)g(KRB-ERR)m(OR.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 167 173 TeXDict begin 167 172 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(167)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(set)p 1175 299 V 54 w(realm)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_r)q(ealm)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 498 28 4 v 39 w(asn1)565 608 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(realm)p Ff(\))390 717 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 854 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 991 y Fi(realm)p Fw(:)41 b(input)30 b(arra)m(y)g(with)h (\(serv)m(er\))g(realm.)390 1127 y(Set)g(\(serv)m(er\))g(realm)g (\014eld)f(in)g(krb)s(error)e(to)j(sp)s(eci\014ed)f(v)-5 b(alue.)390 1264 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1264 V 39 w(OK)f(i\013)i(successful.)150 1466 y Fl(shishi)p 459 1466 37 5 v 55 w(krb)s(error)p 967 1466 V 56 w(serv)m(er)3350 1665 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_serve)q(r)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2549 1665 28 4 v 39 w(asn1)565 1774 y Fe(krberror)p Fi(,)h(c)m(har)e(**)g Fe(server)p Fi(,)h(size)p 1876 1774 V 41 w(t)f(*)g Fe(serverlen)p Ff(\))390 1884 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2021 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated) h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2158 y Fi(serv)m(er)7 b Fw(:)63 b(p)s(oin)m(ter)42 b(to)h(newly)e(allo)s(cated)j(zero)e (terminated)h(string)e(con)m(taining)j(serv)m(er)e(name.)390 2267 y(Ma)m(y)32 b(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)h Fq(serverlen)p Fw(\).)390 2404 y Fi(serv)m(erlen)p Fw(:)51 b(p)s(oin)m(ter)35 b(to)h(length)g(of)f Fq(server)f Fw(on)h(output,)h (excluding)g(terminating)g(zero.)56 b(Ma)m(y)390 2513 y(b)s(e)30 b Fq(NULL)f Fw(\(to)i(only)g(p)s(opulate)f Fq(server)p Fw(\).)390 2650 y(Return)g(serv)m(er)g(principal)g(name)h (in)f(KRB-ERR)m(OR.)390 2787 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2787 V 39 w(OK)f(i\013)i(successful.) 150 2989 y Fl(shishi)p 459 2989 37 5 v 55 w(krb)s(error)p 967 2989 V 56 w(remo)m(v)m(e)p 1407 2989 V 53 w(sname)3350 3188 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q (e_sn)q(ame)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 3188 28 4 v 39 w(asn1)565 3297 y Fe(krberror)p Ff(\))390 3407 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3544 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(to)i(set)g(serv)m(er)f(name)h(\014eld)f(in.)390 3680 y(Remo)m(v)m(e)36 b(serv)m(er)f(name)f(\014eld)g(in)h(KRB-ERR)m(OR.)f (\(Since)h(it)g(is)g(not)f(mark)m(ed)h(OPTIONAL)e(in)390 3790 y(the)k(ASN.1)h(pro\014le,)h(what)e(is)h(done)f(is)g(to)h(set)g (the)f(name-t)m(yp)s(e)h(to)g(UNKNO)m(WN)g(and)f(mak)m(e)390 3900 y(sure)30 b(the)g(name-string)h(sequence)g(is)f(empt)m(y)-8 b(.\))390 4036 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4036 V 39 w(OK)f(i\013)i(successful.)150 4238 y Fl(shishi)p 459 4238 37 5 v 55 w(krb)s(error)p 967 4238 V 56 w(set)p 1175 4238 V 54 w(sname)3350 4437 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_s)q(name) f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 4437 28 4 v 39 w(asn1)565 4546 y Fe(krberror)p Fi(,)h(Shishi)p 1284 4546 V 39 w(name)p 1535 4546 V 40 w(t)m(yp)s(e)e Fe(name_type)p Fi(,)i(const)e(c)m(har)g(*)f Fd([])g Fe(sname)p Ff(\))390 4656 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4793 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated) h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 4930 y Fi(name)p 608 4930 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principial,)i(see)f(Shishi)p 1973 4930 V 39 w(name)p 2224 4930 V 40 w(t)m(yp)s(e,)i(usually)d(SHISHI)p 3091 4930 V 39 w(NT)p 3264 4930 V 40 w(UNKNO)m(WN.)390 5066 y Fi(sname)5 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(principal)g (name.)390 5203 y(Set)h(principal)f(\014eld)g(in)g(krb)s(error)e(to)j (sp)s(eci\014ed)f(v)-5 b(alue.)390 5340 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 168 174 TeXDict begin 168 173 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(168)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(serv)m(er)p 1345 299 V 54 w(set)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_serve)q(r_se)q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 496 28 4 v 39 w(asn1)565 606 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(server)p Ff(\))390 715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 850 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(to)i(set)g(serv)m(er)f(name)h(\014eld)f(in.)390 985 y Fi(serv)m(er)7 b Fw(:)41 b(zero-terminated)32 b(string)e(with)g (principal)g(name)g(on)h(RF)m(C)f(1964)j(form.)390 1120 y(Set)e(the)f(serv)m(er)h(name)f(\014eld)g(in)g(the)h(Krb)s(error.)390 1255 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1255 V 39 w(OK)f(i\013)i(successful.)150 1455 y Fl(shishi)p 459 1455 37 5 v 55 w(krb)s(error)p 967 1455 V 56 w(ctime)3350 1652 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_ctime)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 1652 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 1762 y(c)m(har)h(**)g Fe(t)p Ff(\))390 1871 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2006 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(to)i(set)g(clien)m(t)h(name)e(\014eld)g(in.)390 2141 y Fi(t)r Fw(:)41 b(newly)30 b(allo)s(cated)i(zero-terminated)h(output)d (arra)m(y)g(with)g(clien)m(t)i(time.)390 2276 y(Extract)f(clien)m(t)h (time)f(from)f(KRB-ERR)m(OR.)390 2411 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2411 V 39 w(OK)f(i\013)i(successful.)150 2611 y Fl(shishi)p 459 2611 37 5 v 55 w(krb)s(error)p 967 2611 V 56 w(ctime)p 1318 2611 V 53 w(set)3350 2808 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_ctime)q(_set)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2808 28 4 v 39 w(asn1)565 2918 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(t)p Ff(\))390 3028 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3163 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)390 3298 y Fi(t)r Fw(:)41 b(string)30 b(with)g(generalized)i(time) f(v)-5 b(alue)31 b(to)g(store)g(in)f(Krb)s(error.)390 3433 y(Store)h(clien)m(t)h(time)f(in)f(Krb)s(error.)390 3568 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3568 V 39 w(OK)f(i\013)i(successful.)150 3767 y Fl(shishi)p 459 3767 37 5 v 55 w(krb)s(error)p 967 3767 V 56 w(remo)m(v)m(e)p 1407 3767 V 53 w(ctime)3350 3965 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q(e_ct) q(ime)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 3965 28 4 v 39 w(asn1)565 4074 y Fe(krberror)p Ff(\))390 4184 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4319 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)390 4454 y(Remo)m(v)m(e)i(clien)m(t)g (time)f(\014eld)f(in)g(Krb)s(error.)390 4589 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4589 V 39 w(OK)f(i\013)i(successful.)150 4789 y Fl(shishi)p 459 4789 37 5 v 55 w(krb)s(error)p 967 4789 V 56 w(cusec)3350 4986 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_cusec)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 4986 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 5095 y(uin)m(t32)p 820 5095 V 41 w(t)h(*)g Fe(cusec)p Ff(\))390 5205 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)p eop end %%Page: 169 175 TeXDict begin 169 174 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(169)390 299 y Fi(cusec)6 b Fw(:)41 b(output)30 b(in)m(teger)h(with)g(clien)m(t)h(microseconds)e (\014eld.)390 445 y(Extract)h(clien)m(t)h(microseconds)f(\014eld)f (from)g(Krb)s(error.)390 591 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 591 28 4 v 39 w(OK)f(i\013)i (successful.)150 802 y Fl(shishi)p 459 802 37 5 v 55 w(krb)s(error)p 967 802 V 56 w(cusec)p 1305 802 V 53 w(set)3350 1011 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_cusec)q(_set)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 1011 28 4 v 39 w(asn1)565 1120 y Fe(krberror)p Fi(,)h(uin)m(t32)p 1294 1120 V 41 w(t)e Fe(cusec)p Ff(\))390 1230 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1376 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 1523 y Fi(cusec)6 b Fw(:)41 b(clien)m(t)32 b(microseconds)e(to)i(set)e(in)h(krb)s(error,)d (0-999999.)390 1669 y(Set)j(the)f(cusec)h(\014eld)f(in)g(the)h(Krb)s (error.)390 1815 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1815 V 39 w(OK)f(i\013)i(successful.)150 2026 y Fl(shishi)p 459 2026 37 5 v 55 w(krb)s(error)p 967 2026 V 56 w(remo)m(v)m(e)p 1407 2026 V 53 w(cusec)3350 2235 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q (e_cu)q(sec)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 2235 28 4 v 39 w(asn1)565 2344 y Fe(krberror)p Ff(\))390 2454 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2600 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)390 2746 y(Remo)m(v)m(e)i(clien)m(t)g(usec)f(\014eld)f(in)g(Krb)s (error.)390 2893 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2893 V 39 w(OK)f(i\013)i(successful.)150 3104 y Fl(shishi)p 459 3104 37 5 v 55 w(krb)s(error)p 967 3104 V 56 w(stime)3350 3312 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_stime)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3312 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 3422 y(c)m(har)h(**)g Fe(t)p Ff(\))390 3531 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3678 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(to)i(set)g(clien)m(t)h(name)e(\014eld)g(in.)390 3824 y Fi(t)r Fw(:)41 b(newly)30 b(allo)s(cated)i(zero-terminated)h(output)d (arra)m(y)g(with)g(serv)m(er)h(time.)390 3970 y(Extract)g(serv)m(er)g (time)g(from)f(KRB-ERR)m(OR.)390 4116 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4116 V 39 w(OK)f(i\013)i(successful.)150 4327 y Fl(shishi)p 459 4327 37 5 v 55 w(krb)s(error)p 967 4327 V 56 w(stime)p 1311 4327 V 54 w(set)3350 4536 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_stime)q(_set)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 4536 28 4 v 39 w(asn1)565 4645 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(t)p Ff(\))390 4755 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4901 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)390 5047 y Fi(t)r Fw(:)41 b(string)30 b(with)g(generalized)i(time) f(v)-5 b(alue)31 b(to)g(store)g(in)f(Krb)s(error.)390 5194 y(Store)h(serv)m(er)f(time)h(in)f(Krb)s(error.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 170 176 TeXDict begin 170 175 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(170)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(susec)3350 497 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_susec)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 497 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 607 y(uin)m(t32)p 820 607 V 41 w(t)h(*)g Fe(susec)p Ff(\))390 716 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 852 y Fi(krb)s(error)7 b Fw(:)38 b(Krb)s(error)29 b(as)h(allo)s(cated)j(b)m(y)d Fq(shishi_krberror\(\))p Fw(.)390 988 y Fi(susec)6 b Fw(:)40 b(output)30 b(in)m(teger)i(with)e(serv)m(er)h(microseconds)f (\014eld.)390 1125 y(Extract)h(serv)m(er)g(microseconds)g(\014eld)f (from)g(Krb)s(error.)390 1261 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1261 V 39 w(OK)f(i\013)i(successful.) 150 1461 y Fl(shishi)p 459 1461 37 5 v 55 w(krb)s(error)p 967 1461 V 56 w(susec)p 1298 1461 V 54 w(set)3350 1660 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_susec)q(_set) f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 1660 28 4 v 39 w(asn1)565 1769 y Fe(krberror)p Fi(,)h(uin)m(t32)p 1294 1769 V 41 w(t)e Fe(susec)p Ff(\))390 1879 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2015 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2151 y Fi(susec)6 b Fw(:)40 b(serv)m(er)31 b(microseconds)g(to)g(set)g(in)f(krb)s(error,)f (0-999999.)390 2287 y(Set)i(the)f(susec)g(\014eld)g(in)g(the)h(Krb)s (error.)390 2423 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2423 V 39 w(OK)f(i\013)i(successful.)150 2624 y Fl(shishi)p 459 2624 37 5 v 55 w(krb)s(error)p 967 2624 V 56 w(errorco)s(de)3350 2822 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_error)q(code)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2822 28 4 v 39 w(asn1)565 2932 y Fe(krberror)p Fi(,)h(in)m(t32)p 1243 2932 V 42 w(t)d(*)h Fe(errorcode)p Ff(\))390 3041 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3177 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de.)390 3314 y Fi(errorco)s(de)5 b Fw(:)41 b(output)30 b(in)m(teger)h(KRB-ERR)m (OR)g(error)f(co)s(de.)390 3450 y(Extract)h(error)f(co)s(de)h(from)f (KRB-ERR)m(OR.)390 3586 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3586 V 39 w(OK)f(i\013)i(successful.) 150 3786 y Fl(shishi)p 459 3786 37 5 v 55 w(krb)s(error)p 967 3786 V 56 w(errorco)s(de)p 1533 3786 V 55 w(fast)3350 3985 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_error)q (code)q(_fa)q(st)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3985 28 4 v 39 w(asn1)565 4094 y Fe(krberror)p Ff(\))390 4204 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4340 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de.)390 4476 y(Get)h(error)f(co)s(de) h(from)f(KRB-ERR)m(OR,)h(without)f(error)g(c)m(hec)m(king.)390 4612 y Fk(Return)37 b(v)-5 b(alue:)55 b Fw(Return)36 b(error)h(co)s(de)g(\(see)i Fq(shishi_krberror_errorco)o(de\()o(\))p Fw(\))32 b(directly)-8 b(,)40 b(or)390 4722 y(-1)31 b(on)f(error.)150 4922 y Fl(shishi)p 459 4922 37 5 v 55 w(krb)s(error)p 967 4922 V 56 w(errorco)s(de)p 1533 4922 V 55 w(set)3350 5121 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_error)q (code)q(_se)q(t)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 5121 28 4 v 39 w(asn1)565 5230 y Fe(krberror)p Fi(,)h(in)m(t)e Fe(errorcode)p Ff(\))390 5340 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)p eop end %%Page: 171 177 TeXDict begin 171 176 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(171)390 299 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de)g(to)i (set.)390 430 y Fi(errorco)s(de)5 b Fw(:)41 b(new)30 b(error)g(co)s(de)g(to)h(set)g(in)f(krb)s(error.)390 562 y(Set)h(the)f(error-co)s(de)h(\014eld)f(to)h(a)g(new)e(error)h(co)s (de.)390 693 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 693 28 4 v 39 w(OK)f(i\013)i(successful.)150 886 y Fl(shishi)p 459 886 37 5 v 55 w(krb)s(error)p 967 886 V 56 w(etext)3350 1077 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_etext)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 1077 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 1187 y(c)m(har)h(**)g Fe(etext)p Fi(,)h(size)p 1350 1187 V 41 w(t)f(*)f Fe(etextlen)p Ff(\))390 1296 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1428 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with) g(error)g(co)s(de.)390 1559 y Fi(etext)r Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)j(error)d(text.)390 1691 y Fi(etextlen)p Fw(:)42 b(output)30 b(length)h(of)g(error)f(text.) 390 1822 y(Extract)h(additional)h(error)e(text)h(from)f(serv)m(er)h (\(p)s(ossibly)e(empt)m(y\).)390 1954 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1954 V 39 w(OK)f(i\013)i(successful.)150 2147 y Fl(shishi)p 459 2147 37 5 v 55 w(krb)s(error)p 967 2147 V 56 w(set)p 1175 2147 V 54 w(etext)3350 2337 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_e)q(text)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2337 28 4 v 39 w(asn1)565 2447 y Fe(krberror)p Fi(,)h(const)e(c)m(har)g(*)f Fe(etext)p Ff(\))390 2557 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2688 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2819 y Fi(etext)r Fw(:)42 b(input)30 b(arra)m(y)g(with)h (error)e(text)j(to)f(set.)390 2951 y(Set)g(error)f(text)h(\(e-text\))i (\014eld)d(in)g(KRB-ERR)m(OR)g(to)h(sp)s(eci\014ed)f(v)-5 b(alue.)390 3082 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3082 V 39 w(OK)f(i\013)i(successful.)150 3275 y Fl(shishi)p 459 3275 37 5 v 55 w(krb)s(error)p 967 3275 V 56 w(remo)m(v)m(e)p 1407 3275 V 53 w(etext)3350 3466 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q (e_et)q(ext)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 3466 28 4 v 39 w(asn1)565 3576 y Fe(krberror)p Ff(\))390 3685 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3817 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 3948 y(Remo)m(v)m(e)i(error)e(text)i(\(e-text\))g(\014eld)e (in)g(KRB-ERR)m(OR.)390 4080 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4080 V 39 w(OK)f(i\013)i(successful.) 150 4273 y Fl(shishi)p 459 4273 37 5 v 55 w(krb)s(error)p 967 4273 V 56 w(edata)3350 4464 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_edata)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 4464 28 4 v 39 w(asn1)d Fe(krberror)p Fi(,)565 4573 y(c)m(har)h(**)g Fe(edata)p Fi(,)h(size)p 1350 4573 V 41 w(t)f(*)f Fe(edatalen)p Ff(\))390 4683 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4814 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with) g(error)g(co)s(de.)390 4946 y Fi(edata)p Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(error)e(data.)390 5077 y Fi(edatalen)p Fw(:)42 b(output)30 b(length)h(of)f(error)g(data.) 390 5209 y(Extract)h(additional)h(error)e(data)h(from)f(serv)m(er)g (\(p)s(ossibly)g(empt)m(y\).)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 172 178 TeXDict begin 172 177 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(172)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(metho)s(ddata)3350 520 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_metho)q (ddat)q(a)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2758 520 28 4 v 39 w(asn1)565 630 y Fe(krberror)p Fi(,)h(Shishi)p 1284 630 V 39 w(asn1)e(*)f Fe(methoddata)p Ff(\))390 739 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 899 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de.)390 1058 y Fi(metho)s(ddata)p Fw(:)41 b(output)30 b(ASN.1)h(METHOD-D)m(A)-8 b(T)g(A.)390 1217 y(Extract)49 b(METHOD-D)m(A)-8 b(T)g(A)51 b(ASN.1)e(ob)5 b(ject)50 b(from)e(the)h(e-data)g(\014eld.)95 b(The)48 b(e-data)i(\014eld)390 1327 y(will)32 b(only)h(con)m(tain)g(a) g(METHOD-D)m(A)-8 b(T)g(A)34 b(if)e(the)g(krb)s(error)f(error)h(co)s (de)g(is)g Fq(SHISHI_KDC_ERR_)390 1436 y(PREAUTH_REQUIRED)p Fw(.)390 1595 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1595 V 39 w(OK)f(i\013)i(successful.)150 1819 y Fl(shishi)p 459 1819 37 5 v 55 w(krb)s(error)p 967 1819 V 56 w(set)p 1175 1819 V 54 w(edata)3350 2041 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_set_e)q(data) f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2041 28 4 v 39 w(asn1)565 2150 y Fe(krberror)p Fi(,)h(const)e(c)m (har)g(*)f Fe(edata)p Ff(\))390 2260 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2419 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 2578 y Fi(edata)p Fw(:)42 b(input)29 b(arra)m(y)i(with)f(error)g(text)i(to)f(set.)390 2737 y(Set)g(error)f(text)h(\(e-data\))h(\014eld)e(in)g(KRB-ERR)m(OR)h (to)g(sp)s(eci\014ed)f(v)-5 b(alue.)390 2897 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2897 V 39 w(OK)f(i\013)i(successful.)150 3121 y Fl(shishi)p 459 3121 37 5 v 55 w(krb)s(error)p 967 3121 V 56 w(remo)m(v)m(e)p 1407 3121 V 53 w(edata)3350 3342 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_remov)q(e_ed)q(ata)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2863 3342 28 4 v 39 w(asn1)565 3452 y Fe(krberror)p Ff(\))390 3561 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3720 y Fi(krb)s(error)7 b Fw(:)38 b(krb)s(error)29 b(as)i(allo)s(cated)h(b)m(y)e Fq(shishi_krberror\(\))p Fw(.)390 3880 y(Remo)m(v)m(e)i(error)e(text)i (\(e-data\))g(\014eld)e(in)g(KRB-ERR)m(OR.)390 4039 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4039 V 39 w(OK)f(i\013)i(successful.)150 4263 y Fl(shishi)p 459 4263 37 5 v 55 w(krb)s(error)p 967 4263 V 56 w(prett)m(y)p 1355 4263 V 53 w(prin)m(t)3350 4484 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_krberror_prett)q(y_pr) q(int)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(FILE)d(*)h Fe(fh)p Fi(,)565 4594 y(Shishi)p 810 4594 28 4 v 39 w(asn1)g Fe(krberror)p Ff(\))390 4703 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4862 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle)g(op)s(ened)g(for) g(writing.)390 5022 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de.)390 5181 y(Prin)m(t)g(KRB-ERR)m (OR)h(error)f(condition)h(and)f(some)g(explanatory)i(text)f(to)g (\014le)g(descriptor.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 173 179 TeXDict begin 173 178 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(173)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(krb)s(error)p 967 299 V 56 w(errorco)s(de)p 1533 299 V 55 w(message)3350 500 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_krberror_errorc)q(ode)q(_mes)q(sag)q (e)e Ff(\()p Fi(Shishi)30 b(*)565 610 y Fe(handle)p Fi(,)i(in)m(t)f Fe(errorcode)p Ff(\))390 719 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 858 y Fi(errorco)s(de)5 b Fw(:)41 b(in)m(teger)31 b(KRB-ERR)m(OR)g(error)f(co)s(de.)390 997 y(Get)h(h)m(uman)f(readable)h (string)f(describing)g(KRB-ERR)m(OR)h(co)s(de.)390 1136 y Fk(Return)26 b(v)-5 b(alue:)39 b Fw(Return)26 b(a)g(string)h (describing)f(error)f(co)s(de.)40 b(This)26 b(function)g(will)g(alw)m (a)m(ys)i(return)390 1245 y(a)j(string)f(ev)m(en)h(if)f(the)h(error)f (co)s(de)h(isn't)f(kno)m(wn.)150 1449 y Fl(shishi)p 459 1449 V 55 w(krb)s(error)p 967 1449 V 56 w(message)3350 1650 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_krberror_messag)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 1760 y(Shishi)p 810 1760 28 4 v 39 w(asn1)g Fe(krberror)p Ff(\))390 1869 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2008 y Fi(krb)s(error)7 b Fw(:)38 b(KRB-ERR)m(OR)31 b(structure)f(with)g(error)g(co)s(de.)390 2147 y(Extract)c(error)f(co)s(de)h(\(see)g Fq(shishi_krberror_errorcod) o(e_fa)o(st\(\))o Fw(\))20 b(and)25 b(return)f(error)h(mes-)390 2256 y(sage)31 b(\(see)h Fq(shishi_krberror_errorcod)o(e_m)o(essa)o (ge\(\))o Fw(\).)390 2395 y Fk(Return)26 b(v)-5 b(alue:)39 b Fw(Return)26 b(a)g(string)h(describing)f(error)f(co)s(de.)40 b(This)26 b(function)g(will)g(alw)m(a)m(ys)i(return)390 2505 y(a)j(string)f(ev)m(en)h(if)f(the)h(error)f(co)s(de)h(isn't)f(kno) m(wn.)150 2744 y Fv(5.13)68 b(Cryptographic)46 b(F)-11 b(unctions)150 2903 y Fw(Underneath)23 b(the)i(high-lev)m(el)h (functions)d(describ)s(ed)g(earlier,)k(cryptographic)d(op)s(erations)h (are)f(happ)s(en-)150 3013 y(ing.)40 b(If)28 b(y)m(ou)h(need)g(to)g (access)h(these)f(cryptographic)g(primitiv)m(es)g(directly)-8 b(,)31 b(this)d(section)i(describ)s(es)e(the)150 3122 y(functions)i(a)m(v)-5 b(ailable.)275 3261 y(Most)30 b(cryptographic)g(op)s(erations)g(need)f(k)m(eying)i(material,)h(and)d (cryptographic)h(k)m(eys)g(ha)m(v)m(e)h(b)s(een)150 3371 y(isolated)40 b(in)m(to)f(it's)g(o)m(wn)f(data)h(structure)f Fq(Shishi_key)p Fw(.)62 b(The)38 b(follo)m(wing)i(illustrates)f(it's)g (con)m(ten)m(ts,)150 3480 y(but)31 b(note)i(that)g(y)m(ou)f(cannot)h (access)g(it's)g(elemen)m(ts)h(directly)e(but)g(m)m(ust)g(use)g(the)g (accessor)h(functions)150 3590 y(describ)s(ed)c(b)s(elo)m(w.)150 3729 y Fq(struct)46 b(Shishi_key)150 3838 y({)245 3948 y(int)h(type;)190 b(/*)47 b(RFC)g(1510)g(encryption)e(integer)g(type)i (*/)245 4058 y(char)g(*value;)f(/*)h(Cryptographic)d(key)j(data)g(*/) 245 4167 y(int)g(version;)f(/*)h(RFC)g(1510)g(``kvno'')e(*/)150 4277 y(};)275 4416 y Fw(All)31 b(functions)e(that)i(op)s(erate)g(on)g (this)f(data)h(structure)f(are)h(describ)s(ed)e(no)m(w.)150 4619 y Fl(shishi)p 459 4619 37 5 v 55 w(k)m(ey)p 697 4619 V 54 w(principal)3350 4820 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_key_principal)e Ff(\()p Fi(const)32 b(Shishi)p 2440 4820 28 4 v 39 w(k)m(ey)f(*)f Fe(key)p Ff(\))390 4930 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 5069 y(Get)g(the)g(principal) f(part)g(of)h(the)f(k)m(ey)h(o)m(wner)g(principal)f(name,)h(i.e.,)g (except)h(the)e(realm.)390 5208 y Fk(Return)41 b(v)-5 b(alue:)63 b Fw(Returns)41 b(the)g(principal)h(o)m(wning)f(the)h(k)m (ey)-8 b(.)75 b(\(Not)43 b(a)e(cop)m(y)i(of)e(it,)k(so)d(don't)390 5317 y(mo)s(dify)30 b(or)g(deallo)s(cate)j(it.\))p eop end %%Page: 174 180 TeXDict begin 174 179 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(174)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(ey)p 697 299 V 54 w(principal)p 1222 299 V 54 w(set)3350 497 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_principal_set)e Ff(\()p Fi(Shishi)p 1992 497 28 4 v 39 w(k)m(ey)32 b(*)e Fe(key)p Fi(,)i(const)f(c)m(har)f (*)565 606 y Fe(principal)p Ff(\))390 716 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 852 y Fi(principal)t Fw(:)40 b(string)30 b(with)g(new)g(principal)g (name.)390 987 y(Set)c(the)g(principal)f(o)m(wning)h(the)g(k)m(ey)-8 b(.)41 b(The)25 b(string)h(is)f(copied)i(in)m(to)f(the)g(k)m(ey)-8 b(,)28 b(so)e(y)m(ou)h(can)f(disp)s(ose)390 1097 y(of)31 b(the)f(v)-5 b(ariable)31 b(immediately)h(after)f(calling)h(this)e (function.)150 1297 y Fl(shishi)p 459 1297 37 5 v 55 w(k)m(ey)p 697 1297 V 54 w(realm)3350 1495 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_key_realm)d Ff(\()p Fi(const)31 b(Shishi)p 2230 1495 28 4 v 39 w(k)m(ey)h(*)e Fe(key)p Ff(\))390 1605 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 1741 y(Get)g(the)g(realm)g (part)f(of)g(the)h(k)m(ey)g(o)m(wner)g(principal)f(name.)390 1876 y Fk(Return)g(v)-5 b(alue:)40 b Fw(Returns)29 b(the)h(realm)g(for) g(the)g(principal)f(o)m(wning)h(the)g(k)m(ey)-8 b(.)42 b(\(Not)31 b(a)f(cop)m(y)g(of)g(it,)390 1986 y(so)h(don't)f(mo)s(dify)g (or)g(deallo)s(cate)j(it.\))150 2186 y Fl(shishi)p 459 2186 37 5 v 55 w(k)m(ey)p 697 2186 V 54 w(realm)p 1053 2186 V 54 w(set)3350 2384 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_realm_set)d Ff(\()p Fi(Shishi)p 1783 2384 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Fi(,)h(const)f(c)m(har)f (*)h Fe(realm)p Ff(\))390 2494 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 2629 y Fi(realm)p Fw(:)41 b(string)30 b(with)h(new)e(realm)i(name.)390 2765 y(Set)i(the)f(realm)h(for)f(the)h(principal)f(o)m(wning)g(the)h(k) m(ey)-8 b(.)48 b(The)32 b(string)g(is)h(copied)f(in)m(to)i(the)e(k)m (ey)-8 b(,)35 b(so)390 2875 y(y)m(ou)c(can)f(disp)s(ose)g(of)h(the)f(v) -5 b(ariable)31 b(immediately)h(after)f(calling)h(this)e(function.)150 3075 y Fl(shishi)p 459 3075 37 5 v 55 w(k)m(ey)p 697 3075 V 54 w(t)m(yp)s(e)3350 3273 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_type)d Ff(\()p Fi(const)31 b(Shishi)p 1707 3273 28 4 v 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 3383 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h (information)390 3518 y(Get)g(k)m(ey)h(t)m(yp)s(e.)390 3654 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(t)m(yp)s(e)h (of)f(k)m(ey)h(as)g(an)f(in)m(teger)i(as)f(describ)s(ed)e(in)h(the)h (standard.)150 3855 y Fl(shishi)p 459 3855 37 5 v 55 w(k)m(ey)p 697 3855 V 54 w(t)m(yp)s(e)p 988 3855 V 53 w(set)3350 4052 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_type_set)d Ff(\()p Fi(Shishi)p 1731 4052 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Fi(,)g(in)m(t32)p 2420 4052 V 42 w(t)f Fe(type)p Ff(\))390 4162 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 4298 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(to)g(set)g(in)f(k)m (ey)-8 b(.)390 4433 y(Set)31 b(the)f(t)m(yp)s(e)h(of)f(k)m(ey)h(in)f(k) m(ey)i(structure.)150 4634 y Fl(shishi)p 459 4634 37 5 v 55 w(k)m(ey)p 697 4634 V 54 w(v)-7 b(alue)3350 4832 y Fw([F)f(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_key_value)d Ff(\()p Fi(const)31 b(Shishi)p 2230 4832 28 4 v 39 w(k)m(ey)h(*)e Fe(key)p Ff(\))390 4941 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 5077 y(Get)g(the)g(ra)m(w)f (k)m(ey)i(b)m(ytes.)390 5213 y Fk(Return)44 b(v)-5 b(alue:)69 b Fw(Returns)44 b(the)h(k)m(ey)g(v)-5 b(alue)45 b(as)g(a)g(p)s(oin)m (ter)f(whic)m(h)g(is)h(v)-5 b(alid)45 b(throughout)f(the)390 5322 y(lifetime)32 b(of)e(the)h(k)m(ey)g(structure.)p eop end %%Page: 175 181 TeXDict begin 175 180 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(175)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(ey)p 697 299 V 54 w(v)-7 b(alue)p 1027 299 V 53 w(set)3350 511 y Fw([F)f(unction])-3599 b Fg(void)54 b(shishi_key_value_set)d Ff(\()p Fi(Shishi)p 1783 511 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Fi(,)h(const)f(c)m(har)f (*)h Fe(value)p Ff(\))390 621 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 771 y Fi(v)-5 b(alue)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(k)m(ey) h(data.)390 922 y(Set)44 b(the)g(k)m(ey)g(v)-5 b(alue)45 b(and)e(length)h(in)f(k)m(ey)i(structure.)80 b(The)43 b(v)-5 b(alue)45 b(is)e(copied)i(in)m(to)f(the)g(k)m(ey)390 1031 y(\(in)38 b(other)h(w)m(ords,)h(y)m(ou)e(can)h(deallo)s(cate)i Fq(value)36 b Fw(righ)m(t)j(after)g(calling)h(this)e(function)g (without)390 1141 y(mo)s(difying)30 b(the)g(v)-5 b(alue)31 b(inside)f(the)h(k)m(ey\).)150 1356 y Fl(shishi)p 459 1356 37 5 v 55 w(k)m(ey)p 697 1356 V 54 w(v)m(ersion)3350 1568 y Fw([F)-8 b(unction])-3599 b Fg(uint32_t)55 b(shishi_key_version) c Ff(\()p Fi(const)31 b(Shishi)p 2126 1568 28 4 v 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 1678 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 1828 y(Get)45 b(the)f Fq(")p Fw(kvno)p Fq(")g Fw(\(k)m(ey)h(v)m (ersion\))g(of)f(k)m(ey)-8 b(.)83 b(It)44 b(will)h(b)s(e)e(UINT32)p 2770 1828 V 41 w(MAX)h(if)g(the)h(k)m(ey)g(is)f(not)390 1938 y(long-liv)m(ed.)390 2088 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(v)m(ersion)h(of)g(k)m(ey)g(\()p Fq(")p Fw(kvno)p Fq(")p Fw(\).)150 2303 y Fl(shishi)p 459 2303 37 5 v 55 w(k)m(ey)p 697 2303 V 54 w(v)m(ersion)p 1130 2303 V 54 w(set)3350 2516 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_version_set)e Ff(\()p Fi(Shishi)p 1888 2516 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Fi(,)g(uin)m(t32)p 2628 2516 V 41 w(t)g Fe(kvno)p Ff(\))390 2625 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 2775 y Fi(kvno)5 b Fw(:)40 b(new)30 b(v)m(ersion)h(in)m(teger.)390 2926 y(Set)68 b(the)g(v)m(ersion)g(of)g(k)m(ey)h(\()p Fq(")p Fw(kvno)p Fq(")p Fw(\))f(in)f(k)m(ey)i(structure.)153 b(Use)68 b(UINT32)p 3319 2926 V 41 w(MAX)g(for)390 3035 y(non-ptermanen)m(t)30 b(k)m(eys.)150 3250 y Fl(shishi)p 459 3250 37 5 v 55 w(k)m(ey)p 697 3250 V 54 w(timestamp)3350 3463 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_key_timestamp) e Ff(\()p Fi(const)31 b(Shishi)p 2126 3463 28 4 v 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 3572 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 3723 y(Get)45 b(the)f(time)h(the)f(k)m(ey)g(w)m(as)h(established.)81 b(T)m(ypically)45 b(only)f(presen)m(t)g(when)f(the)h(k)m(ey)h(w)m(as) 390 3832 y(imp)s(orted)30 b(from)g(a)g(k)m(eytab)i(format.)390 3983 y Fk(Return)24 b(v)-5 b(alue:)38 b Fw(Returns)23 b(the)h(time)h(the)f(k)m(ey)h(w)m(as)f(established,)i(or)e(\(time)p 2943 3983 V 41 w(t\)-1)i(if)e(not)g(a)m(v)-5 b(ailable.)390 4133 y Fk(Since:)41 b Fw(0.0.42)150 4348 y Fl(shishi)p 459 4348 37 5 v 55 w(k)m(ey)p 697 4348 V 54 w(timestamp)p 1317 4348 V 54 w(set)3350 4560 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_timestamp_set)e Ff(\()p Fi(Shishi)p 1992 4560 28 4 v 39 w(k)m(ey)32 b(*)e Fe(key)p Fi(,)i(time)p 2660 4560 V 41 w(t)565 4670 y Fe(timestamp)p Ff(\))390 4780 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h (information)390 4930 y Fi(timestamp)s Fw(:)41 b(new)30 b(timestamp.)390 5080 y(Set)d(the)h(time)g(the)f(k)m(ey)h(w)m(as)g (established.)40 b(T)m(ypically)28 b(only)g(relev)-5 b(an)m(t)28 b(when)e(exp)s(orting)i(the)f(k)m(ey)390 5190 y(to)k(k)m(eytab)h(format.)390 5340 y Fk(Since:)41 b Fw(0.0.42)p eop end %%Page: 176 182 TeXDict begin 176 181 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(176)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(ey)p 697 299 V 54 w(name)3350 494 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_key_name)d Ff(\()p Fi(Shishi)p 1940 494 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Ff(\))390 604 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 737 y(Calls)g(shishi)p 848 737 V 39 w(cipher)p 1130 737 V 40 w(name)f(for)g(k)m(ey)h(t)m(yp)s(e.)390 871 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(name)g(of)h(k)m(ey)-8 b(.)150 1069 y Fl(shishi)p 459 1069 37 5 v 55 w(k)m(ey)p 697 1069 V 54 w(length)3350 1264 y Fw([F)g(unction])-3599 b Fg(size_t)54 b(shishi_key_length)d Ff(\()p Fi(const)31 b(Shishi)p 1969 1264 28 4 v 39 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 1373 y Fi(k)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(k)m(ey)h(information)390 1507 y(Calls)g(shishi)p 848 1507 V 39 w(cipher)p 1130 1507 V 40 w(k)m(eylen)g(for)f(k)m(ey)h(t) m(yp)s(e.)390 1641 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(the)g(length)h(of)f(the)h(k)m(ey)g(v)-5 b(alue.)150 1838 y Fl(shishi)p 459 1838 37 5 v 55 w(k)m(ey)3350 2034 y Fw([F)d(unction])-3599 b Fg(int)53 b(shishi_key)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 1921 2034 28 4 v 39 w(k)m(ey)f(**)h Fe(key)p Ff(\))390 2143 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2277 y Fi(k)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(structure)f(that)h(will)f(hold)g(newly)g (created)i(k)m(ey)f(information)390 2410 y(Create)g(a)g(new)f(Key)g (information)h(structure.)390 2544 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2544 V 39 w(OK)f(i\013)i(successful.)150 2742 y Fl(shishi)p 459 2742 37 5 v 55 w(k)m(ey)p 697 2742 V 54 w(done)3350 2937 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_done)c Ff(\()p Fi(Shishi)p 1522 2937 28 4 v 39 w(k)m(ey)31 b(*)g Fe(key)p Ff(\))390 3047 y Fi(k)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(structure)f(that)h(holds)f(k)m(ey)h(information.)390 3180 y(Deallo)s(cates)j(k)m(ey)d(information)f(structure.)150 3378 y Fl(shishi)p 459 3378 37 5 v 55 w(k)m(ey)p 697 3378 V 54 w(cop)m(y)3350 3573 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_key_copy)c Ff(\()p Fi(Shishi)p 1522 3573 28 4 v 39 w(k)m(ey)31 b(*)g Fe(dstkey)p Fi(,)h(Shishi)p 2409 3573 V 39 w(k)m(ey)f(*)g Fe(srckey)p Ff(\))390 3683 y Fi(dstk)m(ey)8 b Fw(:)41 b(structure)30 b(that)h(holds)f(destination) h(k)m(ey)g(information)390 3816 y Fi(src)m(k)m(ey)8 b Fw(:)42 b(structure)30 b(that)g(holds)g(source)h(k)m(ey)g(information) 390 3950 y(Copies)f(source)h(k)m(ey)g(in)m(to)g(existing)h(allo)s (cated)g(destination)f(k)m(ey)-8 b(.)150 4148 y Fl(shishi)p 459 4148 37 5 v 55 w(k)m(ey)p 697 4148 V 54 w(from)p 1001 4148 V 55 w(v)h(alue)3350 4343 y Fw([F)f(unction])-3599 b Fg(int)53 b(shishi_key_from_value)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(in)m(t32)p 2456 4343 28 4 v 41 w(t)e Fe(type)p Fi(,)h(const)565 4452 y(c)m(har)f(*)g Fe(value)p Fi(,)h(Shishi)p 1403 4452 V 39 w(k)m(ey)f(**)g Fe(key)p Ff(\))390 4562 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4696 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)390 4829 y Fi(v)j(alue)5 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(k)m(ey)h(v)-5 b(alue,)31 b(or)f(NULL.)390 4963 y Fi(k)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(structure)f(that)h(will)f(hold)g(newly)g(created)i(k)m(ey)f (information)390 5097 y(Create)j(a)g(new)f(Key)h(information)g (structure,)g(and)f(set)h(the)f(k)m(ey)i(t)m(yp)s(e)e(and)g(k)m(ey)i(v) -5 b(alue.)50 b(KEY)390 5206 y(con)m(tains)32 b(a)e(newly)g(allo)s (cated)j(structure)d(only)g(if)h(this)f(function)g(is)g(successful.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 177 183 TeXDict begin 177 182 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(177)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(ey)p 697 299 V 54 w(from)p 1001 299 V 55 w(base64)3350 494 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_from_base6)q(4)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(in)m(t32)p 2508 494 28 4 v 42 w(t)e Fe(type)p Fi(,)i(const)565 603 y(c)m(har)f(*)g Fe(value)p Fi(,)h(Shishi)p 1403 603 V 39 w(k)m(ey)f(**)g Fe(key)p Ff(\))390 713 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 846 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)390 980 y Fi(v)j(alue)5 b Fw(:)41 b(input)30 b(string)g(with)g(base64)i(enco)s(ded)e(k)m(ey)h(v)-5 b(alue,)31 b(or)f(NULL.)390 1113 y Fi(k)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(structure)f(that)h(will)f(hold)g(newly)g (created)i(k)m(ey)f(information)390 1247 y(Create)j(a)g(new)f(Key)h (information)g(structure,)g(and)f(set)h(the)f(k)m(ey)i(t)m(yp)s(e)e (and)g(k)m(ey)i(v)-5 b(alue.)50 b(KEY)390 1356 y(con)m(tains)32 b(a)e(newly)g(allo)s(cated)j(structure)d(only)g(if)h(this)f(function)g (is)g(successful.)390 1490 y Fk(Return)43 b(v)-5 b(alue:)67 b Fw(Returns)43 b(SHISHI)p 1686 1490 V 39 w(INV)-10 b(ALID)p 2111 1490 V 40 w(KEY)43 b(if)g(the)h(base64)g(enco)s(ded)f(k)m(ey)i (length)390 1600 y(do)s(esn't)30 b(matc)m(h)h(the)g(k)m(ey)g(t)m(yp)s (e,)g(and)f(SHISHI)p 2019 1600 V 39 w(OK)f(on)i(success.)150 1797 y Fl(shishi)p 459 1797 37 5 v 55 w(k)m(ey)p 697 1797 V 54 w(random)3350 1992 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_random)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t32)p 2246 1992 28 4 v 42 w(t)f Fe(type)p Fi(,)g(Shishi)p 2857 1992 V 39 w(k)m(ey)g(**)565 2101 y Fe(key)p Ff(\))390 2211 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2344 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)390 2478 y Fi(k)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(structure)f(that)h(will)f(hold)g(newly)g (created)i(k)m(ey)f(information)390 2611 y(Create)41 b(a)g(new)e(Key)h(information)h(structure)f(for)g(the)g(k)m(ey)h(t)m (yp)s(e)f(and)g(some)h(random)e(data.)390 2721 y(KEY)30 b(con)m(tains)i(a)e(newly)g(allo)s(cated)j(structure)d(only)g(if)h (this)f(function)g(is)g(successful.)390 2854 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 2854 V 39 w(OK)f(i\013)i(successful.)150 3052 y Fl(shishi)p 459 3052 37 5 v 55 w(k)m(ey)p 697 3052 V 54 w(from)p 1001 3052 V 55 w(random)3350 3246 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_from_rando)q(m)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(in)m(t32)p 2508 3246 28 4 v 42 w(t)e Fe(type)p Fi(,)i(const)565 3356 y(c)m(har)f(*)g Fe(rnd)p Fi(,)g(size)p 1200 3356 V 41 w(t)g Fe(rndlen)p Fi(,)h(Shishi)p 1915 3356 V 39 w(k)m(ey)f(**)g Fe(outkey)p Ff(\))390 3466 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3599 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)390 3733 y Fi(rnd)t Fw(:)39 b(random)29 b(data.)390 3866 y Fi(rndlen)p Fw(:)39 b(length)31 b(of)g(random)e(data.)390 4000 y Fi(outk)m(ey)8 b Fw(:)42 b(p)s(oin)m(ter)30 b(to)h(structure)f (that)h(will)g(hold)f(newly)g(created)h(k)m(ey)g(information)390 4133 y(Create)37 b(a)f(new)g(Key)g(information)g(structure,)h(and)e (set)i(the)f(k)m(ey)h(t)m(yp)s(e)f(and)f(k)m(ey)i(v)-5 b(alue)36 b(using)390 4243 y Fq(shishi_random_to_key\(\))p Fw(.)66 b(KEY)40 b(con)m(tains)i(a)g(newly)e(allo)s(cated)j(structure)d (only)h(if)g(this)390 4352 y(function)30 b(is)g(successful.)390 4486 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4486 V 39 w(OK)f(i\013)i(successful.)150 4683 y Fl(shishi)p 459 4683 37 5 v 55 w(k)m(ey)p 697 4683 V 54 w(from)p 1001 4683 V 55 w(string)3350 4878 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_from_strin)q(g)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(in)m(t32)p 2508 4878 28 4 v 42 w(t)e Fe(type)p Fi(,)i(const)565 4987 y(c)m(har)f(*)g Fe(password)p Fi(,)i(size)p 1462 4987 V 41 w(t)d Fe(passwordlen)p Fi(,)k(const)d(c)m(har)g(*)f Fe(salt)p Fi(,)i(size)p 3118 4987 V 41 w(t)f Fe(saltlen)p Fi(,)565 5097 y(const)g(c)m(har)g(*)f Fe(parameter)p Fi(,)k(Shishi)p 1850 5097 V 39 w(k)m(ey)d(**)g Fe(outkey)p Ff(\))390 5206 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)p eop end %%Page: 178 184 TeXDict begin 178 183 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(178)390 299 y Fi(passw)m(ord)t Fw(:)40 b(input)29 b(arra)m(y)i(con)m(taining)h(passw)m(ord.)390 447 y Fi(passw)m(ordlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i (con)m(taining)h(passw)m(ord.)390 595 y Fi(salt)r Fw(:)42 b(input)29 b(arra)m(y)i(con)m(taining)h(salt.)390 742 y Fi(saltlen)p Fw(:)42 b(length)31 b(of)f(input)f(arra)m(y)i(con)m (taining)h(salt.)390 890 y Fi(parameter)7 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(opaque)h(encryption)f(t)m(yp)s(e)h(sp)s(eci\014c)f (information.)390 1038 y Fi(outk)m(ey)8 b Fw(:)42 b(p)s(oin)m(ter)30 b(to)h(structure)f(that)h(will)g(hold)f(newly)g(created)h(k)m(ey)g (information)390 1186 y(Create)37 b(a)f(new)g(Key)g(information)g (structure,)h(and)e(set)i(the)f(k)m(ey)h(t)m(yp)s(e)f(and)f(k)m(ey)i(v) -5 b(alue)36 b(using)390 1295 y Fq(shishi_string_to_key\(\))p Fw(.)66 b(KEY)40 b(con)m(tains)i(a)g(newly)e(allo)s(cated)j(structure)d (only)h(if)g(this)390 1405 y(function)30 b(is)g(successful.)390 1553 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1553 28 4 v 39 w(OK)f(i\013)i(successful.)150 1765 y Fl(shishi)p 459 1765 37 5 v 55 w(k)m(ey)p 697 1765 V 54 w(from)p 1001 1765 V 55 w(name)3350 1976 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_key_from_name)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t32)p 2403 1976 28 4 v 42 w(t)f Fe(type)p Fi(,)g(const)g(c)m(har)565 2085 y(*)g Fe(name)p Fi(,)h(const)f(c)m(har)f(*)h Fe(password)p Fi(,)i(size)p 2040 2085 V 41 w(t)e Fe(passwordlen)p Fi(,)i(const)e(c)m (har)g(*)565 2195 y Fe(parameter)p Fi(,)i(Shishi)p 1336 2195 V 39 w(k)m(ey)e(**)h Fe(outkey)p Ff(\))390 2304 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 2452 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(t)m(yp)s(e)31 b(of)f(k)m(ey)-8 b(.)390 2600 y Fi(name)5 b Fw(:)41 b(principal)30 b(name)g(of)h(user.)390 2748 y Fi(passw)m(ord)t Fw(:)40 b(input)29 b(arra)m(y)i(con)m(taining)h (passw)m(ord.)390 2896 y Fi(passw)m(ordlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(con)m(taining)h(passw)m(ord.)390 3044 y Fi(parameter)7 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(opaque)h (encryption)f(t)m(yp)s(e)h(sp)s(eci\014c)f(information.)390 3191 y Fi(outk)m(ey)8 b Fw(:)42 b(p)s(oin)m(ter)30 b(to)h(structure)f (that)h(will)g(hold)f(newly)g(created)h(k)m(ey)g(information)390 3339 y(Create)d(a)f(new)g(Key)g(information)h(structure,)f(and)g(deriv) m(e)h(the)f(k)m(ey)h(from)f(principal)f(name)i(and)390 3449 y(passw)m(ord)41 b(using)g Fq(shishi_key_from_name\(\))p Fw(.)69 b(The)41 b(salt)i(is)e(deriv)m(ed)h(from)f(the)h(principal)390 3558 y(name)30 b(b)m(y)h(concatenating)h(the)f(deco)s(ded)f(realm)h (and)f(principal.)390 3706 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3706 V 39 w(OK)f(i\013)i(successful.) 275 3917 y(Applications)42 b(that)g(run)e(unin)m(teractiv)m(ely)k(ma)m (y)e(need)f(k)m(eying)h(material.)76 b(In)40 b(these)i(cases,)k(the)150 4027 y(k)m(eys)38 b(are)f(stored)g(in)g(a)g(\014le,)i(a)e(\014le)h (that)f(is)g(normally)g(stored)g(on)g(the)g(lo)s(cal)i(host.)60 b(The)37 b(\014le)g(should)150 4136 y(b)s(e)e(protected)h(from)f (unauthorized)f(access.)57 b(The)35 b(\014le)g(is)g(in)g(ASCI)s(I)f (format)i(and)e(con)m(tains)j(k)m(eys)f(as)150 4246 y(outputed)h(b)m(y) g Fq(shishi_key_print)p Fw(.)57 b(All)38 b(functions)f(that)h(handle)f (these)h(k)m(eys)g(sets)f(are)h(describ)s(ed)150 4356 y(no)m(w.)150 4568 y Fl(shishi)p 459 4568 37 5 v 55 w(k)m(eys)3350 4778 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 1974 4778 28 4 v 39 w(k)m(eys)e(**)g Fe(keys)p Ff(\))390 4888 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5036 y Fi(k)m(eys)t Fw(:)41 b(output)30 b(p)s(oin)m(ter)g(to)i(newly)e(allo)s(cated)i(k)m (eys)f(handle.)390 5183 y(Get)g(a)g(new)f(k)m(ey)h(set)g(handle.)390 5331 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 179 185 TeXDict begin 179 184 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(179)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(eys)p 745 299 V 54 w(done)3350 483 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_keys_done)c Ff(\()p Fi(Shishi)p 1574 483 28 4 v 39 w(k)m(eys)31 b(**)g Fe(keys)p Ff(\))390 592 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 720 y(Deallo)s(cates)41 b(all)e(resources)f(asso)s(ciated)i (with)d(k)m(ey)i(set.)64 b(The)38 b(k)m(ey)g(set)h(handle)e(m)m(ust)h (not)h(b)s(e)390 830 y(used)30 b(in)g(calls)h(to)g(other)g(shishi)p 1485 830 V 39 w(k)m(eys)p 1693 830 V 41 w(*\(\))g(functions)f(after)h (this.)150 1016 y Fl(shishi)p 459 1016 37 5 v 55 w(k)m(eys)p 745 1016 V 54 w(size)3350 1200 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys_size)e Ff(\()p Fi(Shishi)p 1522 1200 28 4 v 39 w(k)m(eys)31 b(*)g Fe(keys)p Ff(\))390 1310 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s (cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 1438 y(Get)h(size)h(of)e (k)m(ey)h(set.)390 1566 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(n)m(um)m(b)s(er)f(of)h(k)m(eys)h(stored)g(in)f(k)m (ey)h(set.)150 1752 y Fl(shishi)p 459 1752 37 5 v 55 w(k)m(eys)p 745 1752 V 54 w(n)m(th)3350 1936 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(Shishi_key)h(*)e(shishi_keys_nth)d Ff(\()p Fi(Shishi)p 2254 1936 28 4 v 39 w(k)m(eys)31 b(*)g Fe(keys)p Fi(,)h(in)m(t)565 2045 y Fe(keyno)p Ff(\))390 2155 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s (cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 2283 y Fi(k)m(eyno)5 b Fw(:)41 b(in)m(teger)32 b(indicating)f(requested)f(k)m (ey)h(in)g(k)m(ey)g(set.)390 2411 y Fk(Get)h(the)e(n:)41 b Fw(th)30 b(tic)m(k)m(et)j(in)d(k)m(ey)h(set.)390 2539 y Fk(Return)i(v)-5 b(alue:)47 b Fw(Returns)33 b(a)g(k)m(ey)i(handle)d (to)j(the)e(k)m(eyno:th)h(k)m(ey)h(in)e(the)g(k)m(ey)h(set,)h(or)f (NULL)f(if)390 2649 y Fq(keys)g Fw(is)i(in)m(v)-5 b(alid)35 b(or)g Fq(keyno)e Fw(is)i(out)g(of)g(b)s(ounds.)51 b(The)34 b(\014rst)g(k)m(ey)h(is)g Fq(keyno)e Fw(0,)k(the)d(second)h(k)m(ey)390 2758 y Fq(keyno)29 b Fw(1,)i(and)f(so)g(on.)150 2945 y Fl(shishi)p 459 2945 37 5 v 55 w(k)m(eys)p 745 2945 V 54 w(remo)m(v)m(e)3350 3128 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_keys_remove)c Ff(\()p Fi(Shishi)p 1678 3128 28 4 v 40 w(k)m(eys)31 b(*)f Fe(keys)p Fi(,)i(in)m(t)f Fe(keyno)p Ff(\))390 3238 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 3366 y Fi(k)m(eyno)5 b Fw(:)41 b(k)m(ey)31 b(n)m(um)m(b)s(er)e (of)i(k)m(ey)g(in)f(the)h(set)f(to)i(remo)m(v)m(e.)42 b(The)30 b(\014rst)f(k)m(ey)i(is)g(k)m(ey)g(n)m(um)m(b)s(er)e(0.)390 3494 y(Remo)m(v)m(e)j(a)f(k)m(ey)-8 b(,)32 b(indexed)e(b)m(y)g Fq(keyno)p Fw(,)f(in)h(giv)m(en)h(k)m(ey)h(set.)150 3680 y Fl(shishi)p 459 3680 37 5 v 55 w(k)m(eys)p 745 3680 V 54 w(add)3350 3864 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys_add)d Ff(\()p Fi(Shishi)p 1469 3864 28 4 v 39 w(k)m(eys)31 b(*)g Fe(keys)p Fi(,)h(Shishi)p 2288 3864 V 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 3974 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 4102 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(b)s(e)d(added)h(to)h(k)m(ey)g(set.)390 4230 y(Add)39 b(a)i(k)m(ey)g(to)g(the)f(k)m(ey)h(set.)71 b(A)40 b(deep)g(cop)m(y)h(of)g(the)f(k)m(ey)h(is)f(stored,)j(so)e(c)m (hanging)g Fq(key)p Fw(,)h(or)390 4339 y(deallo)s(cating)33 b(it,)e(will)f(not)h(mo)s(dify)f(the)g(v)-5 b(alue)31 b(stored)g(in)f(the)g(k)m(ey)h(set.)390 4468 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4654 y Fl(shishi)p 459 4654 37 5 v 55 w(k)m(eys)p 745 4654 V 54 w(prin)m(t)3350 4838 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys_print)e Ff(\()p Fi(Shishi)p 1574 4838 28 4 v 39 w(k)m(eys)31 b(*)g Fe(keys)p Fi(,)h(FILE)e(*)h Fe(fh)p Ff(\))390 4947 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(to)g(prin)m(t.)390 5075 y Fi(fh)p Fw(:)40 b(\014le)30 b(handle,)h(op)s(en)e(for)h(writing,)h(to)g(prin)m(t)f(k)m(eys)h(to.) 390 5203 y(Prin)m(t)f(all)i(k)m(eys)f(in)f(set)h(using)e(shishi)p 1668 5203 V 40 w(k)m(ey)p 1841 5203 V 41 w(prin)m(t.)390 5331 y Fk(Returns:)40 b Fw(Returns)30 b Fq(SHISHI_OK)e Fw(on)i(success.)p eop end %%Page: 180 186 TeXDict begin 180 185 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(180)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(eys)p 745 299 V 54 w(to)p 908 299 V 54 w(\014le)3350 491 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys_to_file)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)f Fe(filename)p Fi(,)565 601 y(Shishi)p 810 601 28 4 v 39 w(k)m(eys)h(*)g Fe(keys)p Ff(\))390 710 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 842 y Fi(\014lename)5 b Fw(:)41 b(\014lename)31 b(to)g(app)s(end)d(k)m(ey)k(to.)390 974 y Fi(k)m(eys)t Fw(:)41 b(set)31 b(of)g(k)m(eys)g(to)g(prin)m(t.)390 1107 y(Prin)m(t)d(an)f(ASCI)s(I)g(represen)m(tation)i(of)f(a)g(k)m(ey)g (structure)g(to)g(a)g(\014le,)h(for)f(eac)m(h)h(k)m(ey)f(in)g(the)g(k)m (ey)g(set.)390 1216 y(The)35 b(\014le)g(is)h(app)s(ended)d(to)j(if)g (it)g(exists.)56 b(See)35 b Fq(shishi_key_print\(\))c Fw(for)k(the)h(format)f(of)h(the)390 1326 y(output.)390 1458 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1653 y Fl(shishi)p 459 1653 37 5 v 55 w(k)m(eys)p 745 1653 V 54 w(from)p 1049 1653 V 55 w(\014le)3350 1845 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_keys_from_file)f Ff(\()p Fi(Shishi)p 1783 1845 28 4 v 39 w(k)m(eys)31 b(*)g Fe(keys)p Fi(,)h(const)f(c)m (har)f(*)565 1954 y Fe(filename)p Ff(\))390 2064 y Fi(k)m(eys)t Fw(:)41 b(k)m(ey)31 b(set)g(handle)f(as)h(allo)s(cated)h(b)m(y)e Fq(shishi_keys\(\))p Fw(.)390 2196 y Fi(\014lename)5 b Fw(:)41 b(\014lename)31 b(to)g(read)f(k)m(eys)h(from.)390 2328 y(Read)d(zero)g(or)g(more)g(k)m(eys)g(from)f(\014le)h Fq(filename)d Fw(and)i(app)s(end)f(them)i(to)g(the)g(k)m(eyset)h Fq(keys)p Fw(.)39 b(See)390 2438 y Fq(shishi_key_print\(\))25 b Fw(for)31 b(the)f(format)h(of)f(the)h(input.)390 2570 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)390 2702 y Fk(Since:)41 b Fw(0.0.42)150 2897 y Fl(shishi)p 459 2897 37 5 v 55 w(k)m(eys)p 745 2897 V 54 w(for)p 947 2897 V 55 w(serv)m(errealm)p 1626 2897 V 54 w(in)p 1782 2897 V 54 w(\014le)3350 3089 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_keys_for_server)q(rea)q(lm_i)q(n_f)q(ile)f Ff(\()p Fi(Shishi)30 b(*)565 3198 y Fe(handle)p Fi(,)i(const)f(c)m(har)g(*)g Fe(filename)p Fi(,)i(const)e(c)m(har)f(*)h Fe(server)p Fi(,)i(const)d(c)m(har)h(*)g Fe(realm)p Ff(\))390 3308 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 3440 y Fi(\014lename)5 b Fw(:)41 b(\014le)30 b(to)i(read)e(k)m(eys)h(from.)390 3572 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g(k)m (ey)g(for.)390 3704 y Fi(realm)p Fw(:)41 b(realm)31 b(of)f(serv)m(er)h (to)g(get)h(k)m(ey)f(for.)390 3836 y(Get)g(k)m(eys)g(that)g(matc)m(h)h (sp)s(eci\014ed)d Fq(server)g Fw(and)h Fq(realm)f Fw(from)h(the)g(k)m (ey)h(set)g(\014le)g Fq(filename)p Fw(.)390 3969 y Fk(Return)f(v)-5 b(alue:)40 b Fw(Returns)29 b(the)i(k)m(ey)f(for)g(sp)s(eci\014c)g(serv) m(er)g(and)f(realm,)i(read)f(from)f(the)h(indicated)390 4078 y(\014le,)h(or)f(NULL)g(if)h(no)f(k)m(ey)h(could)g(b)s(e)e(found)g (or)i(an)f(error)g(encoun)m(tered.)150 4273 y Fl(shishi)p 459 4273 V 55 w(k)m(eys)p 745 4273 V 54 w(for)p 947 4273 V 55 w(serv)m(er)p 1324 4273 V 54 w(in)p 1480 4273 V 54 w(\014le)3350 4465 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e(shishi_keys_for_server)q(_in)q(_fil)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)565 4574 y(const)g(c)m(har)g(*)f Fe(filename)p Fi(,)j(const)e(c)m(har)g(*)g Fe(server)p Ff(\))390 4684 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4816 y Fi(\014lename)5 b Fw(:)41 b(\014le)30 b(to)i(read)e(k)m(eys)h(from.) 390 4948 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g (k)m(ey)g(for.)390 5081 y(Get)g(k)m(ey)h(for)e(sp)s(eci\014ed)f Fq(server)g Fw(from)h Fq(filename)p Fw(.)390 5213 y Fk(Return)40 b(v)-5 b(alue:)60 b Fw(Returns)39 b(the)i(k)m(ey)g(for)f(sp)s(eci\014c) f(serv)m(er,)k(read)d(from)g(the)g(indicated)h(\014le,)i(or)390 5322 y(NULL)30 b(if)h(no)f(k)m(ey)h(could)f(b)s(e)g(found)f(or)i(an)f (error)g(encoun)m(tered.)p eop end %%Page: 181 187 TeXDict begin 181 186 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(181)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(k)m(eys)p 745 299 V 54 w(for)p 947 299 V 55 w(lo)s(calservicerealm)p 1915 299 V 54 w(in)p 2071 299 V 54 w(\014le)3350 488 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e(shishi_keys_for_locals)q(erv)q(icer)q(eal)q (m_i)q(n_fi)q(le)565 597 y Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)f(*)h Fe(filename)p Fi(,)i(const)e(c)m(har)g(*)g Fe(service)p Fi(,)h(const)f(c)m(har)g(*) 565 707 y Fe(realm)p Ff(\))390 817 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 947 y Fi(\014lename)5 b Fw(:)41 b(\014le)30 b(to)i(read)e(k)m(eys)h(from.)390 1078 y Fi(service)5 b Fw(:)42 b(service)31 b(to)g(get)g(k)m(ey)h(for.)390 1208 y Fi(realm)p Fw(:)41 b(realm)31 b(of)f(serv)m(er)h(to)g(get)h(k)m (ey)f(for,)f(or)h(NULL)f(for)g(default)h(realm.)390 1339 y(Get)g(k)m(ey)h(for)e(sp)s(eci\014ed)f Fq(service)g Fw(and)h Fq(realm)e Fw(from)i Fq(filename)p Fw(.)390 1469 y Fk(Return)22 b(v)-5 b(alue:)38 b Fw(Returns)21 b(the)i(k)m(ey)g(for)g(the)g(serv)m(er)g Fq(")p Fw(SER)-10 b(VICE/HOSTNAME)p Fq(REALM")19 b Fw(\(where)390 1579 y(HOSTNAME)30 b(is)h(the)g(curren)m(t)f(system's)h(hostname\),)h(read)e (from)g(the)h(default)g(host)g(k)m(eys)g(\014le)390 1688 y(\(see)37 b Fq(shishi_hostkeys_default)o(_fil)o(e\(\))p Fw(\),)31 b(or)36 b(NULL)g(if)g(no)f(k)m(ey)i(could)f(b)s(e)f(found)f (or)i(an)390 1798 y(error)30 b(encoun)m(tered.)275 1970 y(The)46 b(previous)g(functions)g(require)g(that)h(the)g(\014lename)g (is)f(kno)m(wn.)89 b(F)-8 b(or)48 b(some)e(applications,)150 2080 y(serv)m(ers,)f(it)d(mak)m(es)h(sense)f(to)g(pro)m(vide)g(a)g (system)g(default.)75 b(These)41 b(k)m(ey)i(sets)f(used)f(b)m(y)h(serv) m(er)g(ap-)150 2190 y(plications)32 b(are)f(kno)m(wn)f(as)h(\\hostk)m (eys".)43 b(Here)32 b(are)f(the)g(functions)f(that)h(op)s(erate)g(on)g (hostk)m(eys)g(\(they)150 2299 y(are)g(mostly)g(wrapp)s(ers)d(around)h (generic)j(k)m(ey)f(sets\).)150 2491 y Fl(shishi)p 459 2491 V 55 w(hostk)m(eys)p 970 2491 V 55 w(default)p 1396 2491 V 54 w(\014le)3350 2679 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_hostkeys_defaul)q(t_f)q(ile)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 2789 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 2920 y(Get)g(\014le)g(name)f(of)h (default)f(host)h(k)m(ey)g(\014le.)390 3050 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)27 b(the)i(default)g(host)g(k)m(ey)g (\014lename)g(used)f(in)g(the)h(library)-8 b(.)40 b(\(Not)30 b(a)f(cop)m(y)390 3160 y(of)i(it,)g(so)f(don't)h(mo)s(dify)e(or)i (deallo)s(cate)h(it.\))150 3351 y Fl(shishi)p 459 3351 V 55 w(hostk)m(eys)p 970 3351 V 55 w(default)p 1396 3351 V 54 w(\014le)p 1608 3351 V 54 w(set)3350 3540 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_hostkeys_default_)q(fil)q(e_s)q (et)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)565 3650 y(c)m(har)f(*)g Fe(hostkeysfile)p Ff(\))390 3759 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 3890 y Fi(hostk)m(eys\014le)5 b Fw(:)40 b(string)28 b(with)f(new)g(default)h(hostk)m(eys)g(\014le)g (name,)g(or)g(NULL)f(to)h(reset)g(to)g(default.)390 4020 y(Set)36 b(the)h(default)f(host)g(k)m(ey)h(\014lename)f(used)f(in)h (the)h(library)-8 b(.)57 b(The)36 b(string)g(is)g(copied)h(in)m(to)g (the)390 4130 y(library)-8 b(,)31 b(so)f(y)m(ou)h(can)g(disp)s(ose)e (of)i(the)f(v)-5 b(ariable)32 b(immediately)f(after)g(calling)h(this)e (function.)150 4321 y Fl(shishi)p 459 4321 V 55 w(hostk)m(eys)p 970 4321 V 55 w(for)p 1173 4321 V 55 w(serv)m(er)3350 4510 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_hostkeys_for_se)q(rve)q(r)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 4620 y(c)m(har)f(*)g Fe(server)p Ff(\))390 4729 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4860 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g(k)m(ey)g(for)390 4990 y(Get)g(host)g(k)m(ey)g(for)f Fq(server)p Fw(.)390 5121 y Fk(Return)e(v)-5 b(alue:)40 b Fw(Returns)27 b(the)h(k)m(ey)h(for)e(sp)s(eci\014c)h(serv)m(er,)h (read)f(from)g(the)g(default)g(host)g(k)m(eys)h(\014le)390 5230 y(\(see)37 b Fq(shishi_hostkeys_default)o(_fil)o(e\(\))p Fw(\),)31 b(or)36 b(NULL)g(if)g(no)f(k)m(ey)i(could)f(b)s(e)f(found)f (or)i(an)390 5340 y(error)30 b(encoun)m(tered.)p eop end %%Page: 182 188 TeXDict begin 182 187 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(182)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(hostk)m(eys)p 970 299 V 55 w(for)p 1173 299 V 55 w(serv)m(errealm)3350 492 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e(shishi_hostkeys_for_se)q(rve)q(rrea)q(lm)f Ff(\()p Fi(Shishi)29 b(*)565 602 y Fe(handle)p Fi(,)j(const)f(c)m(har)g (*)g Fe(server)p Fi(,)h(const)f(c)m(har)g(*)g Fe(realm)p Ff(\))390 712 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 845 y Fi(serv)m(er)7 b Fw(:)41 b(serv)m(er)30 b(name)h(to)g(get)g(k)m(ey)g (for)390 977 y Fi(realm)p Fw(:)41 b(realm)31 b(of)f(serv)m(er)h(to)g (get)h(k)m(ey)f(for.)390 1110 y(Get)g(host)g(k)m(ey)g(for)f Fq(server)f Fw(in)h Fq(realm)p Fw(.)390 1243 y Fk(Return)36 b(v)-5 b(alue:)53 b Fw(Returns)35 b(the)h(k)m(ey)h(for)f(sp)s(eci\014c) g(serv)m(er)h(and)e(realm,)k(read)d(from)f(the)i(default)390 1353 y(host)31 b(k)m(eys)h(\014le)g(\(see)g Fq(shishi_hostkeys_default) o(_fil)o(e\(\))p Fw(\),)26 b(or)31 b(NULL)g(if)g(no)g(k)m(ey)h(could)g (b)s(e)390 1462 y(found)d(or)h(an)h(error)f(encoun)m(tered.)150 1659 y Fl(shishi)p 459 1659 V 55 w(hostk)m(eys)p 970 1659 V 55 w(for)p 1173 1659 V 55 w(lo)s(calservicerealm)3350 1852 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_hostkeys_for_lo)q(cal)q(serv)q(ice)q(rea)q(lm)f Ff(\()p Fi(Shishi)29 b(*)565 1962 y Fe(handle)p Fi(,)j(const)f(c)m(har) g(*)g Fe(service)p Fi(,)i(const)d(c)m(har)h(*)g Fe(realm)p Ff(\))390 2071 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2204 y Fi(service)5 b Fw(:)42 b(service)31 b(to)g(get)g(k)m(ey)h(for.)390 2337 y Fi(realm)p Fw(:)41 b(realm)31 b(of)f(serv)m(er)h(to)g(get)h(k)m (ey)f(for,)f(or)h(NULL)f(for)g(default)h(realm.)390 2470 y(Get)g(host)g(k)m(ey)g(for)f Fq(service)f Fw(on)h(curren)m(t)g(host)g (in)h Fq(realm)p Fw(.)390 2603 y Fk(Return)22 b(v)-5 b(alue:)38 b Fw(Returns)21 b(the)i(k)m(ey)g(for)g(the)g(serv)m(er)g Fq(")p Fw(SER)-10 b(VICE/HOSTNAME)p Fq(REALM")19 b Fw(\(where)390 2713 y(HOSTNAME)30 b(is)h(the)g(curren)m(t)f(system's)h(hostname\),)h (read)e(from)g(the)h(default)g(host)g(k)m(eys)g(\014le)390 2822 y(\(see)37 b Fq(shishi_hostkeys_default)o(_fil)o(e\(\))p Fw(\),)31 b(or)36 b(NULL)g(if)g(no)f(k)m(ey)i(could)f(b)s(e)f(found)f (or)i(an)390 2932 y(error)30 b(encoun)m(tered.)150 3128 y Fl(shishi)p 459 3128 V 55 w(hostk)m(eys)p 970 3128 V 55 w(for)p 1173 3128 V 55 w(lo)s(calservice)3350 3321 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_key)55 b(*)e (shishi_hostkeys_for_lo)q(cal)q(serv)q(ice)f Ff(\()p Fi(Shishi)30 b(*)565 3431 y Fe(handle)p Fi(,)i(const)f(c)m(har)g(*)g Fe(service)p Ff(\))390 3541 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3673 y Fi(service)5 b Fw(:)42 b(service)31 b(to)g(get)g(k)m (ey)h(for.)390 3806 y(Get)f(host)g(k)m(ey)g(for)f Fq(service)f Fw(on)h(curren)m(t)g(host)g(in)h(default)f(realm.)390 3939 y Fk(Return)47 b(v)-5 b(alue:)76 b Fw(Returns)47 b(the)h(k)m(ey)g(for)f(the)h(serv)m(er)g Fq(")p Fw(SER)-10 b(VICE/HOSTNAME)p Fq(")46 b Fw(\(where)390 4049 y(HOSTNAME)d(is)h(the)g (curren)m(t)f(system's)h(hostname\),)k(read)c(from)f(the)h(default)g (host)f(k)m(eys)390 4158 y(\014le)34 b(\(see)h Fq (shishi_hostkeys_default_)o(file)o(\(\))p Fw(\),)29 b(or)34 b(NULL)g(if)g(no)g(k)m(ey)h(could)f(b)s(e)f(found)g(or)390 4268 y(an)d(error)g(encoun)m(tered.)275 4448 y(After)i(creating)j(the)d (k)m(ey)i(structure,)f(it)g(can)g(b)s(e)f(used)g(to)h(encrypt)g(and)f (decrypt)g(data,)j(calculate)150 4557 y(c)m(hec)m(ksum)c(on)f(data)h (etc.)42 b(All)31 b(a)m(v)-5 b(ailable)33 b(functions)d(are)h(describ)s (ed)e(no)m(w.)150 4753 y Fl(shishi)p 459 4753 V 55 w(cipher)p 845 4753 V 54 w(supp)s(orted)p 1437 4753 V 56 w(p)3350 4947 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cipher_support)q (ed_p)f Ff(\()p Fi(in)m(t32)p 1951 4947 28 4 v 42 w(t)31 b Fe(type)p Ff(\))390 5056 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 5056 V 39 w(et)m(yp)s(e.)390 5189 y(Find)f(out)h(if)f(cipher)g(is)g(supp)s (orted.)390 5322 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(0)g(i\013)h(cipher)f(is)g(unsupp)s(orted.)p eop end %%Page: 183 189 TeXDict begin 183 188 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(183)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(cipher)p 845 299 V 54 w(name)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_cipher_name)e Ff(\()p Fi(in)m(t32)p 2056 498 28 4 v 42 w(t)30 b Fe(type)p Ff(\))390 607 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 607 V 39 w(et)m(yp)s(e.)390 744 y(Read)g(h)m(umanly)e(readable)i (string)g(for)f(cipher.)390 880 y Fk(Return)j(v)-5 b(alue:)47 b Fw(Return)32 b(name)i(of)f(encryption)g(t)m(yp)s(e,)i(e.g.)50 b Fq(")p Fw(des3-cb)s(c-sha1-kd)p Fq(")p Fw(,)35 b(as)e(de\014ned)390 990 y(in)d(the)h(standards.)150 1191 y Fl(shishi)p 459 1191 37 5 v 55 w(cipher)p 845 1191 V 54 w(blo)s(c)m(ksize)3350 1390 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cipher_blocksi)q (ze)f Ff(\()p Fi(in)m(t32)p 1847 1390 28 4 v 41 w(t)31 b Fe(type)p Ff(\))390 1499 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 1499 V 39 w(et)m(yp)s(e.)390 1636 y(Get)g(blo)s(c)m(k)g(size)h(for)e (cipher.)390 1772 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(blo)s(c)m(k)h(size)g(for)f(encryption)g(t)m(yp)s(e,)h(as)g(de\014ned) e(in)h(the)g(standards.)150 1973 y Fl(shishi)p 459 1973 37 5 v 55 w(cipher)p 845 1973 V 54 w(confoundersize)3350 2172 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cipher_confoun)q (ders)q(ize)f Ff(\()p Fi(in)m(t32)p 2108 2172 28 4 v 42 w(t)31 b Fe(type)p Ff(\))390 2282 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 2282 V 39 w(et)m(yp)s(e.)390 2418 y(Get)g(length)g(of)g (confounder)e(for)h(cipher.)390 2554 y Fk(Return)d(v)-5 b(alue:)40 b Fw(Returns)27 b(the)g(size)i(of)f(the)f(confounder)g (\(random)g(data\))i(for)e(encryption)h(t)m(yp)s(e,)390 2664 y(as)d(de\014ned)e(in)i(the)g(standards,)g(or)g(\(size)p 1779 2664 V 41 w(t\)-1)h(on)f(error)f(\(e.g.,)k(unsupp)s(orted)22 b(encryption)i(t)m(yp)s(e\).)150 2865 y Fl(shishi)p 459 2865 37 5 v 55 w(cipher)p 845 2865 V 54 w(k)m(eylen)3350 3064 y Fw([F)-8 b(unction])-3599 b Fg(size_t)54 b(shishi_cipher_keylen) e Ff(\()p Fi(in)m(t32)p 1847 3064 28 4 v 41 w(t)31 b Fe(type)p Ff(\))390 3174 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 3174 V 39 w(et)m(yp)s(e.)390 3310 y(Get)g(k)m(ey)h(length)e(for)g(cipher.) 390 3446 y Fk(Return)35 b(v)-5 b(alue:)51 b Fw(Return)34 b(length)i(of)f(k)m(ey)h(used)f(for)g(the)g(encryption)g(t)m(yp)s(e,)i (as)f(de\014ned)e(in)h(the)390 3556 y(standards.)150 3757 y Fl(shishi)p 459 3757 37 5 v 55 w(cipher)p 845 3757 V 54 w(randomlen)3350 3956 y Fw([F)-8 b(unction])-3599 b Fg(size_t)54 b(shishi_cipher_randomle)q(n)e Ff(\()p Fi(in)m(t32)p 2004 3956 28 4 v 41 w(t)31 b Fe(type)p Ff(\))390 4066 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 4066 V 39 w(et)m(yp)s(e.)390 4202 y(Get)g(length)g(of)g(random)e(data)i(for)g(cipher.)390 4338 y Fk(Return)j(v)-5 b(alue:)50 b Fw(Return)34 b(length)h(of)g (random)f(used)g(for)g(the)h(encryption)g(t)m(yp)s(e,)h(as)f(de\014ned) e(in)390 4448 y(the)e(standards,)e(or)i(\(size)p 1281 4448 V 41 w(t\)-1)h(on)e(error)g(\(e.g.,)i(unsupp)s(orted)c(encryption) i(t)m(yp)s(e\).)150 4649 y Fl(shishi)p 459 4649 37 5 v 55 w(cipher)p 845 4649 V 54 w(defaultc)m(ksum)m(t)m(yp)s(e)3350 4848 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cipher_default)q (cksu)q(mty)q(pe)f Ff(\()p Fi(in)m(t32)p 2213 4848 28 4 v 42 w(t)30 b Fe(type)p Ff(\))390 4957 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(encryption)30 b(t)m(yp)s(e,)h(see)g(Shishi)p 1709 4957 V 39 w(et)m(yp)s(e.)390 5094 y(Get)g(the)g(default)g(c)m(hec) m(ksum)g(asso)s(ciated)g(with)f(cipher.)390 5230 y Fk(Return)39 b(v)-5 b(alue:)58 b Fw(Return)38 b(asso)s(ciated)i(c)m(hec)m(ksum)g (mec)m(hanism)f(for)f(the)h(encryption)g(t)m(yp)s(e,)j(as)390 5340 y(de\014ned)29 b(in)h(the)h(standards.)p eop end %%Page: 184 190 TeXDict begin 184 189 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(184)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(cipher)p 845 299 V 54 w(parse)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_cipher_parse)e Ff(\()p Fi(const)32 b(c)m(har)e(*)h Fe(cipher)p Ff(\))390 607 y Fi(cipher)7 b Fw(:)40 b(name)30 b(of)h(encryption)f(t)m(yp)s(e,)h (e.g.)42 b Fq(")p Fw(des3-cb)s(c-sha1-kd)p Fq(")p Fw(.)390 744 y(Get)31 b(cipher)f(n)m(um)m(b)s(er)f(b)m(y)i(parsing)f(string.)390 880 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(encryption)g(t)m(yp) s(e)h(corresp)s(onding)e(to)i(a)g(string.)150 1081 y Fl(shishi)p 459 1081 V 55 w(c)m(hec)m(ksum)p 1025 1081 V 53 w(supp)s(orted)p 1616 1081 V 56 w(p)3350 1280 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_checksum_suppo)q(rted)q (_p)f Ff(\()p Fi(in)m(t32)p 2056 1280 28 4 v 42 w(t)30 b Fe(type)p Ff(\))390 1390 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(c)m(hec)m(ksum)31 b(t)m(yp)s(e,)g(see)g(Shishi)p 1664 1390 V 39 w(c)m(ksum)m(t)m(yp)s(e.)390 1526 y(Find)f(out)h(whether)e(c) m(hec)m(ksum)i(is)g(supp)s(orted.)390 1662 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(0)g(i\013)h(c)m(hec)m(ksum)g(is)g(unsupp)s (orted.)150 1864 y Fl(shishi)p 459 1864 37 5 v 55 w(c)m(hec)m(ksum)p 1025 1864 V 53 w(name)3350 2062 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_checksum_name)e Ff(\()p Fi(in)m(t32)p 2160 2062 28 4 v 42 w(t)31 b Fe(type)p Ff(\))390 2172 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(c)m(hec)m(ksum)31 b(t)m(yp)s(e,)g(see)g(Shishi)p 1664 2172 V 39 w(c)m(ksum)m(t)m(yp)s(e.) 390 2308 y(Get)g(name)g(of)f(c)m(hec)m(ksum.)390 2445 y Fk(Return)22 b(v)-5 b(alue:)36 b Fw(Return)21 b(name)h(of)g(c)m(hec)m (ksum)h(t)m(yp)s(e,)h(e.g.)39 b Fq(")p Fw(hmac-sha1-96-aes256)p Fq(")p Fw(,)27 b(as)22 b(de\014ned)390 2554 y(in)30 b(the)h(standards.) 150 2756 y Fl(shishi)p 459 2756 37 5 v 55 w(c)m(hec)m(ksum)p 1025 2756 V 53 w(c)m(ksumlen)3350 2954 y Fw([F)-8 b(unction])-3599 b Fg(size_t)54 b(shishi_checksum_cksuml)q(en)e Ff(\()p Fi(in)m(t32)p 2056 2954 28 4 v 42 w(t)30 b Fe(type)p Ff(\))390 3064 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(c)m(hec)m(ksum)31 b(t)m(yp)s(e,)g(see)g(Shishi)p 1664 3064 V 39 w(c)m(ksum)m(t)m(yp)s(e.) 390 3200 y(Get)g(length)g(of)g(c)m(hec)m(ksum)g(output.)390 3337 y Fk(Return)i(v)-5 b(alue:)45 b Fw(Return)32 b(length)h(of)g(c)m (hec)m(ksum)g(used)f(for)h(the)g(c)m(hec)m(ksum)g(t)m(yp)s(e,)h(as)f (de\014ned)e(in)390 3446 y(the)g(standards.)150 3648 y Fl(shishi)p 459 3648 37 5 v 55 w(c)m(hec)m(ksum)p 1025 3648 V 53 w(parse)3350 3846 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_checksum_parse)f Ff(\()p Fi(const)31 b(c)m(har)g(*)g Fe(checksum)p Ff(\))390 3956 y Fi(c)m(hec)m(ksum)p Fw(:)41 b(name)31 b(of)f(c)m(hec)m(ksum)h(t)m(yp)s(e,)g(e.g.)42 b Fq(")p Fw(hmac-sha1-96-aes256)p Fq(")p Fw(.)390 4092 y(Get)31 b(c)m(hec)m(ksum)g(n)m(um)m(b)s(er)f(b)m(y)g(parsing)g(a)g (string.)390 4229 y Fk(Return)48 b(v)-5 b(alue:)76 b Fw(Return)47 b(c)m(hec)m(ksum)i(t)m(yp)s(e,)j(see)d(Shishi)p 2444 4229 28 4 v 39 w(c)m(ksum)m(t)m(yp)s(e,)k(corresp)s(onding)47 b(to)i(a)390 4338 y(string.)150 4540 y Fl(shishi)p 459 4540 37 5 v 55 w(string)p 823 4540 V 55 w(to)p 987 4540 V 54 w(k)m(ey)3350 4738 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_string_to_key)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t32)p 2403 4738 28 4 v 42 w(t)f Fe(keytype)p Fi(,)h(const)565 4848 y(c)m(har)f(*)g Fe(password)p Fi(,)i(size)p 1462 4848 V 41 w(t)d Fe(passwordlen)p Fi(,)k(const)d(c)m(har)g(*)f Fe(salt)p Fi(,)i(size)p 3118 4848 V 41 w(t)f Fe(saltlen)p Fi(,)565 4957 y(const)g(c)m(har)g(*)f Fe(parameter)p Fi(,)k(Shishi)p 1850 4957 V 39 w(k)m(ey)d(*)g Fe(outkey)p Ff(\))390 5067 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5204 y Fi(k)m(eyt)m(yp)s(e)5 b Fw(:)42 b(cryptographic)31 b(encryption)f(t)m(yp)s(e,)h(see)g(Shishi)p 2422 5204 V 39 w(et)m(yp)s(e.)390 5340 y Fi(passw)m(ord)t Fw(:)40 b(input)29 b(arra)m(y)i(with)f(passw)m(ord.)p eop end %%Page: 185 191 TeXDict begin 185 190 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(185)390 299 y Fi(passw)m(ordlen)p Fw(:)40 b(length)31 b(of)g(input)e(arra)m(y)i(with)f(passw)m(ord.)390 446 y Fi(salt)r Fw(:)42 b(input)29 b(arra)m(y)i(with)f(salt.)390 593 y Fi(saltlen)p Fw(:)42 b(length)31 b(of)f(input)f(arra)m(y)i(with)f (salt.)390 741 y Fi(parameter)7 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(opaque)h(encryption)f(t)m(yp)s(e)h(sp)s(eci\014c)f (information.)390 888 y Fi(outk)m(ey)8 b Fw(:)42 b(allo)s(cated)32 b(k)m(ey)f(handle)f(that)h(will)g(con)m(tain)g(new)f(k)m(ey)-8 b(.)390 1035 y(Deriv)m(e)31 b(k)m(ey)g(from)e(a)h(string)g(\(passw)m (ord\))f(and)g(salt)i(\(commonly)f(concatenation)j(of)c(realm)i(and)390 1145 y(principal\))j(for)f(sp)s(eci\014ed)g(k)m(ey)h(t)m(yp)s(e,)h(and) e(set)h(the)g(t)m(yp)s(e)g(and)f(v)-5 b(alue)34 b(in)g(the)f(giv)m(en)i (k)m(ey)f(to)h(the)390 1255 y(computed)30 b(v)-5 b(alues.)42 b(The)29 b(parameter)i(v)-5 b(alue)31 b(is)g(sp)s(eci\014c)f(for)g(eac) m(h)i(k)m(eyt)m(yp)s(e,)g(and)d(can)i(b)s(e)f(set)h(if)390 1364 y(the)g(parameter)f(information)h(is)g(not)f(a)m(v)-5 b(ailable.)390 1511 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1724 y Fl(shishi)p 459 1724 37 5 v 55 w(random)p 923 1724 V 55 w(to)p 1087 1724 V 54 w(k)m(ey)3350 1933 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_random_to_key)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t32)p 2403 1933 28 4 v 42 w(t)f Fe(keytype)p Fi(,)h(const)565 2043 y(c)m(har)f(*)g Fe(rnd)p Fi(,)g(size)p 1200 2043 V 41 w(t)g Fe(rndlen)p Fi(,)h(Shishi)p 1915 2043 V 39 w(k)m(ey)f(*)g Fe(outkey)p Ff(\))390 2152 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2300 y Fi(k)m(eyt)m(yp)s(e)5 b Fw(:)42 b(cryptographic)31 b(encryption)f(t)m(yp)s(e,)h(see)g(Shishi) p 2422 2300 V 39 w(et)m(yp)s(e.)390 2447 y Fi(rnd)t Fw(:)39 b(input)29 b(arra)m(y)i(with)f(random)g(data.)390 2594 y Fi(rndlen)p Fw(:)39 b(length)31 b(of)g(input)e(arra)m(y)i(with)f (random)g(data.)390 2741 y Fi(outk)m(ey)8 b Fw(:)42 b(allo)s(cated)32 b(k)m(ey)f(handle)f(that)h(will)g(con)m(tain)g(new)f(k)m(ey)-8 b(.)390 2889 y(Deriv)m(e)38 b(k)m(ey)e(from)g(random)f(data)i(for)f(sp) s(eci\014ed)f(k)m(ey)i(t)m(yp)s(e,)h(and)d(set)i(the)f(t)m(yp)s(e)g (and)g(v)-5 b(alue)36 b(in)390 2998 y(the)31 b(giv)m(en)g(k)m(ey)g(to)g (the)g(computed)f(v)-5 b(alues.)390 3146 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k (successful.)150 3358 y Fl(shishi)p 459 3358 37 5 v 55 w(c)m(hec)m(ksum)3350 3567 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_checksum)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2183 3567 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)g(in)m(t)565 3677 y Fe(keyusage)p Fi(,)h(in)m(t)d Fe(cksumtype)p Fi(,)j(const)d(c)m(har)h(*)f Fe(in)p Fi(,)h(size)p 2515 3677 V 41 w(t)f Fe(inlen)p Fi(,)i(c)m(har)e(**)g Fe(out)p Fi(,)i(size)p 3606 3677 V 40 w(t)f(*)565 3786 y Fe(outlen)p Ff(\))390 3896 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 4043 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(compute)e(c)m(hec)m(ksum)h(with.)390 4191 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(this)f(k)m(ey)h(is)f(used)g(for.)390 4338 y Fi(c)m(ksum)m(t)m (yp)s(e)5 b Fw(:)41 b(the)31 b(c)m(hec)m(ksum)g(algorithm)g(to)h(use.) 390 4485 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (in)m(tegrit)m(y)h(protect.)390 4633 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f(data)h(to)g(in)m(tegrit)m(y) h(protect.)390 4780 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f (newly)g(allo)s(cated)i(in)m(tegrit)m(y)h(protected)e(data.)390 4927 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(length)h(of)g(output)f(arra)m(y)h(with)f(c)m(hec)m(ksum.)390 5074 y(In)m(tegrit)m(y)h(protect)f(data)g(using)f(k)m(ey)-8 b(,)31 b(p)s(ossibly)e(altered)h(b)m(y)f(supplied)f(k)m(ey)i(usage.)41 b(If)29 b(k)m(ey)h(usage)390 5184 y(is)g(0,)h(no)g(k)m(ey)g(deriv)-5 b(ation)31 b(is)f(used.)40 b(The)30 b(OUT)g(bu\013er)f(m)m(ust)i(b)s(e) e(deallo)s(cated)k(b)m(y)d(the)g(caller.)390 5331 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 186 192 TeXDict begin 186 191 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(186)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(v)m(erify)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_verify)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2078 498 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)e Fe(keyusage)p Fi(,)565 608 y(in)m(t)h Fe(cksumtype)p Fi(,)i(const)e(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2051 608 V 41 w(t)f Fe(inlen)p Fi(,)i(const)f(c)m(har)g(*)g Fe(cksum)p Fi(,)h(size)p 3446 608 V 41 w(t)565 717 y Fe(cksumlen)p Ff(\))390 827 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 964 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(v)m(erify)e(c)m (hec)m(ksum)h(with.)390 1101 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(this)f(k)m(ey)h(is)f(used)g (for.)390 1238 y Fi(c)m(ksum)m(t)m(yp)s(e)5 b Fw(:)41 b(the)31 b(c)m(hec)m(ksum)g(algorithm)g(to)h(use.)390 1375 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(that)g(w)m (as)g(in)m(tegrit)m(y)h(protected.)390 1512 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f(data)h(that)g(w)m (as)f(in)m(tegrit)m(y)j(protected.)390 1650 y Fi(c)m(ksum)p Fw(:)41 b(input)29 b(arra)m(y)i(with)f(alleged)i(c)m(hec)m(ksum)f(of)g (data.)390 1787 y Fi(c)m(ksumlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(alleged)i(c)m(hec)m(ksum)f(of)g(data.) 390 1924 y(V)-8 b(erify)40 b(c)m(hec)m(ksum)h(of)f(data)g(using)g(k)m (ey)-8 b(,)43 b(p)s(ossibly)c(altered)i(b)m(y)f(supplied)e(k)m(ey)j (usage.)70 b(If)39 b(k)m(ey)390 2033 y(usage)31 b(is)f(0,)h(no)g(k)m (ey)g(deriv)-5 b(ation)31 b(is)f(used.)390 2170 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2372 y Fl(shishi)p 459 2372 37 5 v 55 w(encrypt)p 924 2372 V 54 w(ivup)s(date)p 1448 2372 V 54 w(et)m(yp)s(e)3350 2572 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt_ivupda)q (te_e)q(typ)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 2572 28 4 v 39 w(k)m(ey)f(*)565 2681 y Fe(key)p Fi(,)h(in)m(t)e Fe(keyusage)p Fi(,)j(in)m(t32)p 1594 2681 V 42 w(t)e Fe(etype)p Fi(,)h(const)f(c)m(har)f(*)h Fe(iv)p Fi(,)g(size)p 2833 2681 V 41 w(t)g Fe(ivlen)p Fi(,)h(c)m(har)f(**)565 2791 y Fe(ivout)p Fi(,)h(size)p 1029 2791 V 41 w(t)f(*)g Fe(ivoutlen)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2500 2791 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 3598 2791 V 41 w(t)g(*)565 2900 y Fe(outlen)p Ff(\))390 3010 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3147 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 3284 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(encrypting.)390 3421 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.) 390 3558 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f (initialization)j(v)m(ector)390 3695 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(initialization)j(v)m(ector.) 390 3832 y Fi(iv)m(out)r Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly) g(allo)s(cated)i(up)s(dated)d(initialization)k(v)m(ector.)390 3970 y Fi(iv)m(outlen)p Fw(:)42 b(size)31 b(of)g(output)f(arra)m(y)g (with)h(up)s(dated)e(initialization)k(v)m(ector.)390 4107 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (encrypt.)390 4244 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(encrypt.)390 4381 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i (encrypted)e(data.)390 4518 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output) d(arra)m(y)-8 b(.)390 4655 y(Encrypts)27 b(data)i(as)f(p)s(er)f (encryption)h(metho)s(d)g(using)f(sp)s(eci\014ed)g(initialization)k(v)m (ector)f(and)d(k)m(ey)-8 b(.)390 4765 y(The)43 b(k)m(ey)i(actually)h (used)d(is)h(deriv)m(ed)g(using)f(the)i(k)m(ey)f(usage.)82 b(If)44 b(k)m(ey)h(usage)f(is)g(0,)k(no)c(k)m(ey)390 4874 y(deriv)-5 b(ation)32 b(is)g(used.)44 b(The)31 b(OUT)g(bu\013er)g (m)m(ust)h(b)s(e)f(deallo)s(cated)i(b)m(y)f(the)g(caller.)46 b(If)31 b(IV)m(OUT)h(or)390 4984 y(IV)m(OUTLEN)e(is)h(NULL,)f(the)h(up) s(dated)e(IV)h(is)h(not)f(sa)m(v)m(ed)i(an)m(ywhere.)390 5121 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 5230 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 5340 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)p eop end %%Page: 187 193 TeXDict begin 187 192 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(187)390 299 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with) g(the)g(zero)h(b)m(yte.)65 b(This)37 b(means)390 408 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f (the)h(original)g(length)g(after)390 518 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 656 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 859 y Fl(shishi)p 459 859 37 5 v 55 w(encrypt)p 924 859 V 54 w(iv)p 1077 859 V 54 w(et)m(yp)s(e)3350 1059 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt_iv_ety)q(pe)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 1059 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 1168 y Fe(keyusage)p Fi(,)h(in)m(t32)p 1243 1168 V 42 w(t)d Fe(etype)p Fi(,)i(const)f(c)m(har)g(*)g Fe(iv)p Fi(,)g(size)p 2482 1168 V 41 w(t)f Fe(ivlen)p Fi(,)j(const)d(c)m(har)h (*)g Fe(in)p Fi(,)565 1278 y(size)p 712 1278 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Fi(,)g(size)p 1810 1278 V 41 w(t)g(*)g Fe(outlen)p Ff(\))390 1388 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 1525 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 1663 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(encrypting.)390 1801 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.) 390 1939 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f (initialization)j(v)m(ector)390 2077 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(initialization)j(v)m(ector.) 390 2215 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (encrypt.)390 2353 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(encrypt.)390 2491 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i (encrypted)e(data.)390 2629 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output) d(arra)m(y)-8 b(.)390 2766 y(Encrypts)27 b(data)i(as)f(p)s(er)f (encryption)h(metho)s(d)g(using)f(sp)s(eci\014ed)g(initialization)k(v)m (ector)f(and)d(k)m(ey)-8 b(.)390 2876 y(The)43 b(k)m(ey)i(actually)h (used)d(is)h(deriv)m(ed)g(using)f(the)i(k)m(ey)f(usage.)82 b(If)44 b(k)m(ey)h(usage)f(is)g(0,)k(no)c(k)m(ey)390 2986 y(deriv)-5 b(ation)33 b(is)g(used.)46 b(The)32 b(OUT)f(bu\013er)h (m)m(ust)g(b)s(e)g(deallo)s(cated)i(b)m(y)f(the)f(caller.)48 b(The)32 b(next)h(IV)390 3095 y(is)d(lost,)i(see)f(shishi)p 1056 3095 V 39 w(encrypt)p 1396 3095 V 40 w(ivup)s(date)p 1785 3095 V 39 w(et)m(yp)s(e)g(if)g(y)m(ou)f(need)g(it.)390 3233 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 3343 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 3452 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 3562 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 3671 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 3781 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 3919 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4122 y Fl(shishi)p 459 4122 37 5 v 55 w(encrypt)p 924 4122 V 54 w(et)m(yp)s(e)3350 4322 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt_etype)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 4322 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 4431 y Fe(keyusage)p Fi(,)h(in)m(t32)p 1243 4431 V 42 w(t)d Fe(etype)p Fi(,)i(const)f(c)m (har)g(*)g Fe(in)p Fi(,)g(size)p 2482 4431 V 41 w(t)f Fe(inlen)p Fi(,)j(c)m(har)d(**)h Fe(out)p Fi(,)h(size)p 3580 4431 V 41 w(t)f(*)565 4541 y Fe(outlen)p Ff(\))390 4651 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4788 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 4926 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(encrypting.)390 5064 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.) 390 5202 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (encrypt.)390 5340 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(encrypt.)p eop end %%Page: 188 194 TeXDict begin 188 193 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(188)390 299 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i (encrypted)e(data.)390 442 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output) d(arra)m(y)-8 b(.)390 585 y(Encrypts)27 b(data)i(as)f(p)s(er)f (encryption)h(metho)s(d)g(using)f(sp)s(eci\014ed)g(initialization)k(v)m (ector)f(and)d(k)m(ey)-8 b(.)390 694 y(The)43 b(k)m(ey)i(actually)h (used)d(is)h(deriv)m(ed)g(using)f(the)i(k)m(ey)f(usage.)82 b(If)44 b(k)m(ey)h(usage)f(is)g(0,)k(no)c(k)m(ey)390 804 y(deriv)-5 b(ation)35 b(is)f(used.)52 b(The)34 b(OUT)g(bu\013er)f (m)m(ust)h(b)s(e)g(deallo)s(cated)i(b)m(y)e(the)h(caller.)54 b(The)34 b(default)390 913 y(IV)27 b(is)g(used,)g(see)h(shishi)p 1210 913 28 4 v 39 w(encrypt)p 1550 913 V 40 w(iv)p 1663 913 V 40 w(et)m(yp)s(e)g(if)f(y)m(ou)g(need)g(to)h(alter)g(it.)40 b(The)26 b(next)h(IV)g(is)h(lost,)g(see)390 1023 y(shishi)p 620 1023 V 39 w(encrypt)p 960 1023 V 40 w(ivup)s(date)p 1349 1023 V 39 w(et)m(yp)s(e)j(if)g(y)m(ou)f(need)h(it.)390 1166 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 1275 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 1385 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 1494 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 1604 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 1714 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 1856 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2064 y Fl(shishi)p 459 2064 37 5 v 55 w(encrypt)p 924 2064 V 54 w(ivup)s(date)3350 2269 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt_ivupda)q(te)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 2269 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 2379 y Fe(keyusage)p Fi(,)h(const)e(c)m(har)g(*)f Fe(iv)p Fi(,)i(size)p 1860 2379 V 41 w(t)e Fe(ivlen)p Fi(,)i(c)m(har)f(**)g Fe(ivout)p Fi(,)h(size)p 3062 2379 V 41 w(t)f(*)g Fe(ivoutlen)p Fi(,)565 2488 y(const)g(c)m(har)g(*)f Fe(in)p Fi(,)i(size)p 1386 2488 V 41 w(t)e Fe(inlen)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)h(size)p 2484 2488 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 2598 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2741 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 2884 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(this)f(k)m(ey)h(is)f(encrypting.)390 3026 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 3169 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 3312 y Fi(iv)m(out)r Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(up)s (dated)d(initialization)k(v)m(ector.)390 3455 y Fi(iv)m(outlen)p Fw(:)42 b(size)31 b(of)g(output)f(arra)m(y)g(with)h(up)s(dated)e (initialization)k(v)m(ector.)390 3598 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(encrypt.)390 3740 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(encrypt.)390 3883 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(encrypted)e(data.)390 4026 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 4169 y(Encrypts)31 b(data)i(using)e(sp)s(eci\014ed)g (initialization)k(v)m(ector)f(and)d(k)m(ey)-8 b(.)47 b(The)31 b(k)m(ey)i(actually)h(used)d(is)390 4279 y(deriv)m(ed)i(using) g(the)h(k)m(ey)g(usage.)50 b(If)33 b(k)m(ey)i(usage)f(is)f(0,)i(no)e(k) m(ey)h(deriv)-5 b(ation)34 b(is)g(used.)49 b(The)32 b(OUT)390 4388 y(bu\013er)38 b(m)m(ust)h(b)s(e)g(deallo)s(cated)i(b)m(y)e(the)h (caller.)69 b(If)38 b(IV)m(OUT)i(or)f(IV)m(OUTLEN)g(is)g(NULL,)h(the) 390 4498 y(up)s(dated)29 b(IV)h(is)h(not)f(sa)m(v)m(ed)i(an)m(ywhere.) 390 4641 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 4750 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 4860 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 4969 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 5079 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 5189 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 5331 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 189 195 TeXDict begin 189 194 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(189)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(encrypt)p 924 299 V 54 w(iv)3350 489 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt_iv)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2287 489 28 4 v 39 w(k)m(ey)g(*)e Fe(key)p Fi(,)i(in)m(t)565 599 y Fe(keyusage)p Fi(,)h(const)e(c)m(har)g(*)f Fe(iv)p Fi(,)i(size)p 1860 599 V 41 w(t)e Fe(ivlen)p Fi(,)i(const)f(c)m(har)g (*)g Fe(in)p Fi(,)g(size)p 3098 599 V 41 w(t)f Fe(inlen)p Fi(,)i(c)m(har)565 708 y(**)f Fe(out)p Fi(,)h(size)p 1046 708 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 818 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 949 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 1081 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(this)f(k)m(ey)h(is)f (encrypting.)390 1212 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 1343 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 1475 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(encrypt.)390 1606 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(encrypt.)390 1737 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(encrypted)e(data.)390 1868 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 2000 y(Encrypts)56 b(data)i(using)f(sp)s(eci\014ed)f (initialization)k(v)m(ector)f(and)e(k)m(ey)-8 b(.)122 b(The)56 b(k)m(ey)i(actually)390 2109 y(used)40 b(is)h(deriv)m(ed)g (using)g(the)g(k)m(ey)h(usage.)73 b(If)40 b(k)m(ey)i(usage)g(is)f(0,)j (no)d(k)m(ey)h(deriv)-5 b(ation)41 b(is)g(used.)390 2219 y(The)52 b(OUT)g(bu\013er)g(m)m(ust)h(b)s(e)f(deallo)s(cated)i(b)m(y)f (the)g(caller.)109 b(The)52 b(next)h(IV)f(is)h(lost,)59 b(see)390 2329 y(shishi)p 620 2329 V 39 w(encrypt)p 960 2329 V 40 w(ivup)s(date)30 b(if)g(y)m(ou)h(need)f(it.)390 2460 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 2569 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 2679 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 2789 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 2898 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 3008 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 3139 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3332 y Fl(shishi)p 459 3332 37 5 v 55 w(encrypt)3350 3522 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_encrypt)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2131 3522 28 4 v 38 w(k)m(ey)f(*)e Fe(key)p Fi(,)i(in)m(t)f Fe(keyusage)p Fi(,)565 3632 y(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 1148 3632 V 41 w(t)f Fe(inlen)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)h(size)p 2246 3632 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 3742 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3873 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e(with.)390 4004 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(this)f(k)m(ey)h(is)f(encrypting.)390 4135 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(encrypt.)390 4267 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(encrypt.)390 4398 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(encrypted)e(data.)390 4529 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 4661 y(Encrypts)28 b(data)h(using)f(sp)s(eci\014ed)h(k)m(ey)-8 b(.)41 b(The)28 b(k)m(ey)i(actually)g(used)e(is)h(deriv)m(ed)g(using)f (the)h(k)m(ey)g(us-)390 4770 y(age.)41 b(If)25 b(k)m(ey)i(usage)g(is)f (0,)h(no)f(k)m(ey)h(deriv)-5 b(ation)27 b(is)f(used.)38 b(The)26 b(OUT)g(bu\013er)f(m)m(ust)h(b)s(e)f(deallo)s(cated)390 4880 y(b)m(y)37 b(the)h(caller.)63 b(The)37 b(default)g(IV)g(is)h (used,)g(see)g(shishi)p 2354 4880 V 39 w(encrypt)p 2694 4880 V 40 w(iv)g(if)f(y)m(ou)h(need)f(to)h(alter)g(it.)390 4989 y(The)30 b(next)g(IV)h(is)f(lost,)i(see)f(shishi)p 1579 4989 V 39 w(encrypt)p 1919 4989 V 40 w(ivup)s(date)e(if)i(y)m(ou)f (need)h(it.)390 5121 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g (YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h (exactly)-8 b(.)390 5230 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g (pad)g(to)h(mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k) h(size)g(of)f(the)h(en-)390 5340 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f (lo)s(ok)h(in)e(an)m(y)h(sp)s(ecial)p eop end %%Page: 190 196 TeXDict begin 190 195 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(190)390 299 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with) g(the)g(zero)h(b)m(yte.)65 b(This)37 b(means)390 408 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f (the)h(original)g(length)g(after)390 518 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 651 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 848 y Fl(shishi)p 459 848 37 5 v 55 w(decrypt)p 924 848 V 54 w(ivup)s(date)p 1448 848 V 54 w(et)m(yp)s(e)3350 1042 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt_ivupda)q (te_e)q(typ)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2915 1042 28 4 v 39 w(k)m(ey)f(*)565 1151 y Fe(key)p Fi(,)h(in)m(t)e Fe(keyusage)p Fi(,)j(in)m(t32)p 1594 1151 V 42 w(t)e Fe(etype)p Fi(,)h(const)f(c)m(har)f(*)h Fe(iv)p Fi(,)g(size)p 2833 1151 V 41 w(t)g Fe(ivlen)p Fi(,)h(c)m(har)f(**)565 1261 y Fe(ivout)p Fi(,)h(size)p 1029 1261 V 41 w(t)f(*)g Fe(ivoutlen)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2500 1261 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)e(**)i Fe(out)p Fi(,)f(size)p 3598 1261 V 41 w(t)g(*)565 1371 y Fe(outlen)p Ff(\))390 1480 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 1613 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 1747 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(decrypting.)390 1880 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.) 390 2013 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f (initialization)j(v)m(ector)390 2146 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(initialization)j(v)m(ector.) 390 2279 y Fi(iv)m(out)r Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly) g(allo)s(cated)i(up)s(dated)d(initialization)k(v)m(ector.)390 2412 y Fi(iv)m(outlen)p Fw(:)42 b(size)31 b(of)g(output)f(arra)m(y)g (with)h(up)s(dated)e(initialization)k(v)m(ector.)390 2545 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (decrypt.)390 2679 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(decrypt.)390 2812 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i (decrypted)e(data.)390 2945 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output) d(arra)m(y)-8 b(.)390 3078 y(Decrypts)29 b(data)g(as)f(p)s(er)f (encryption)i(metho)s(d)e(using)h(sp)s(eci\014ed)g(initialization)j(v)m (ector)f(and)d(k)m(ey)-8 b(.)390 3188 y(The)43 b(k)m(ey)i(actually)h (used)d(is)h(deriv)m(ed)g(using)f(the)i(k)m(ey)f(usage.)82 b(If)44 b(k)m(ey)h(usage)f(is)g(0,)k(no)c(k)m(ey)390 3297 y(deriv)-5 b(ation)32 b(is)g(used.)44 b(The)31 b(OUT)g(bu\013er)g (m)m(ust)h(b)s(e)f(deallo)s(cated)i(b)m(y)f(the)g(caller.)46 b(If)31 b(IV)m(OUT)h(or)390 3407 y(IV)m(OUTLEN)e(is)h(NULL,)f(the)h(up) s(dated)e(IV)h(is)h(not)f(sa)m(v)m(ed)i(an)m(ywhere.)390 3540 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 3650 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 3759 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 3869 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 3978 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 4088 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 4221 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4418 y Fl(shishi)p 459 4418 37 5 v 55 w(decrypt)p 924 4418 V 54 w(iv)p 1077 4418 V 54 w(et)m(yp)s(e)3350 4612 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt_iv_ety)q(pe)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 4612 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 4721 y Fe(keyusage)p Fi(,)h(in)m(t32)p 1243 4721 V 42 w(t)d Fe(etype)p Fi(,)i(const)f(c)m(har)g(*)g Fe(iv)p Fi(,)g(size)p 2482 4721 V 41 w(t)f Fe(ivlen)p Fi(,)j(const)d(c)m(har)h (*)g Fe(in)p Fi(,)565 4831 y(size)p 712 4831 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Fi(,)g(size)p 1810 4831 V 41 w(t)g(*)g Fe(outlen)p Ff(\))390 4941 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 5074 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 5207 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(decrypting.)390 5340 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.)p eop end %%Page: 191 197 TeXDict begin 191 196 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(191)390 299 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 435 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 570 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(decrypt.)390 706 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(decrypt.)390 842 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(decrypted)e(data.)390 977 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 1113 y(Decrypts)29 b(data)g(as)f(p)s(er)f(encryption)i(metho)s (d)e(using)h(sp)s(eci\014ed)g(initialization)j(v)m(ector)f(and)d(k)m (ey)-8 b(.)390 1223 y(The)43 b(k)m(ey)i(actually)h(used)d(is)h(deriv)m (ed)g(using)f(the)i(k)m(ey)f(usage.)82 b(If)44 b(k)m(ey)h(usage)f(is)g (0,)k(no)c(k)m(ey)390 1332 y(deriv)-5 b(ation)33 b(is)g(used.)46 b(The)32 b(OUT)f(bu\013er)h(m)m(ust)g(b)s(e)g(deallo)s(cated)i(b)m(y)f (the)f(caller.)48 b(The)32 b(next)h(IV)390 1442 y(is)d(lost,)i(see)f (shishi)p 1056 1442 28 4 v 39 w(decrypt)p 1396 1442 V 40 w(ivup)s(date)p 1785 1442 V 39 w(et)m(yp)s(e)g(if)g(y)m(ou)f(need)g (it.)390 1577 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 1687 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 1797 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 1906 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 2016 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 2125 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 2261 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 2461 y Fl(shishi)p 459 2461 37 5 v 55 w(decrypt)p 924 2461 V 54 w(et)m(yp)s(e)3350 2659 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt_etype)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 2659 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 2769 y Fe(keyusage)p Fi(,)h(in)m(t32)p 1243 2769 V 42 w(t)d Fe(etype)p Fi(,)i(const)f(c)m (har)g(*)g Fe(in)p Fi(,)g(size)p 2482 2769 V 41 w(t)f Fe(inlen)p Fi(,)j(c)m(har)d(**)h Fe(out)p Fi(,)h(size)p 3580 2769 V 41 w(t)f(*)565 2879 y Fe(outlen)p Ff(\))390 2988 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3124 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 3260 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(decrypting.)390 3395 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(cipher)f(to)h(use.) 390 3531 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (decrypt.)390 3667 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(decrypt.)390 3802 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i (decrypted)e(data.)390 3938 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output) d(arra)m(y)-8 b(.)390 4074 y(Decrypts)50 b(data)g(as)g(p)s(er)f (encryption)g(metho)s(d)g(using)g(sp)s(eci\014ed)g(k)m(ey)-8 b(.)100 b(The)49 b(k)m(ey)h(actually)390 4183 y(used)k(is)h(deriv)m(ed) h(using)e(the)i(k)m(ey)f(usage.)116 b(If)55 b(k)m(ey)g(usage)h(is)f(0,) 62 b(no)55 b(k)m(ey)h(deriv)-5 b(ation)56 b(is)390 4293 y(used.)104 b(The)51 b(OUT)g(bu\013er)g(m)m(ust)h(b)s(e)f(deallo)s (cated)i(b)m(y)f(the)g(caller.)106 b(The)51 b(default)h(IV)g(is)390 4402 y(used,)43 b(see)e(shishi)p 1023 4402 V 40 w(decrypt)p 1364 4402 V 39 w(iv)p 1476 4402 V 41 w(et)m(yp)s(e)g(if)g(y)m(ou)g (need)g(to)g(alter)h(it.)73 b(The)40 b(next)h(IV)g(is)g(lost,)j(see)390 4512 y(shishi)p 620 4512 V 39 w(decrypt)p 960 4512 V 40 w(ivup)s(date)p 1349 4512 V 39 w(et)m(yp)s(e)31 b(if)g(y)m(ou)f (need)h(it.)390 4648 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g (YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h (exactly)-8 b(.)390 4757 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g (pad)g(to)h(mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k) h(size)g(of)f(the)h(en-)390 4867 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f (lo)s(ok)h(in)e(an)m(y)h(sp)s(ecial)390 4976 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with) g(the)g(zero)h(b)m(yte.)65 b(This)37 b(means)390 5086 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f (the)h(original)g(length)g(after)390 5196 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 5331 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)p eop end %%Page: 192 198 TeXDict begin 192 197 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(192)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(decrypt)p 924 299 V 54 w(ivup)s(date)3350 499 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt_ivupda)q (te)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 499 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)h(in)m(t)565 609 y Fe(keyusage)p Fi(,)h(const)e(c)m(har)g(*)f Fe(iv)p Fi(,)i(size)p 1860 609 V 41 w(t)e Fe(ivlen)p Fi(,)i(c)m(har)f(**)g Fe(ivout)p Fi(,)h(size)p 3062 609 V 41 w(t)f(*)g Fe(ivoutlen)p Fi(,)565 719 y(const)g(c)m(har)g(*)f Fe(in)p Fi(,)i(size)p 1386 719 V 41 w(t)e Fe(inlen)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)h(size)p 2484 719 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 828 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 966 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 1105 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(this)f(k)m(ey)h(is)f(decrypting.)390 1243 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 1381 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 1519 y Fi(iv)m(out)r Fw(:)42 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(up)s (dated)d(initialization)k(v)m(ector.)390 1658 y Fi(iv)m(outlen)p Fw(:)42 b(size)31 b(of)g(output)f(arra)m(y)g(with)h(up)s(dated)e (initialization)k(v)m(ector.)390 1796 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(decrypt.)390 1934 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(decrypt.)390 2072 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(decrypted)e(data.)390 2210 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 2349 y(Decrypts)33 b(data)f(using)g(sp)s(eci\014ed)g (initialization)j(v)m(ector)e(and)f(k)m(ey)-8 b(.)47 b(The)32 b(k)m(ey)h(actually)h(used)d(is)390 2458 y(deriv)m(ed)i(using) g(the)h(k)m(ey)g(usage.)50 b(If)33 b(k)m(ey)i(usage)f(is)f(0,)i(no)e(k) m(ey)h(deriv)-5 b(ation)34 b(is)g(used.)49 b(The)32 b(OUT)390 2568 y(bu\013er)38 b(m)m(ust)h(b)s(e)g(deallo)s(cated)i(b)m(y)e(the)h (caller.)69 b(If)38 b(IV)m(OUT)i(or)f(IV)m(OUTLEN)g(is)g(NULL,)h(the) 390 2677 y(up)s(dated)29 b(IV)h(is)h(not)f(sa)m(v)m(ed)i(an)m(ywhere.) 390 2816 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 2925 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 3035 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 3144 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 3254 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 3364 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 3502 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3705 y Fl(shishi)p 459 3705 37 5 v 55 w(decrypt)p 924 3705 V 54 w(iv)3350 3905 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt_iv)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2287 3905 28 4 v 39 w(k)m(ey)g(*)e Fe(key)p Fi(,)i(in)m(t)565 4015 y Fe(keyusage)p Fi(,)h(const)e(c)m(har)g(*)f Fe(iv)p Fi(,)i(size)p 1860 4015 V 41 w(t)e Fe(ivlen)p Fi(,)i(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 3098 4015 V 41 w(t)f Fe(inlen)p Fi(,)i(c)m(har)565 4125 y(**)f Fe(out)p Fi(,)h(size)p 1046 4125 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 4234 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 4372 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 4511 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h (this)f(k)m(ey)h(is)f(decrypting.)390 4649 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 4787 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 4925 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(decrypt.)390 5064 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(decrypt.)390 5202 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(decrypted)e(data.)390 5340 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)p eop end %%Page: 193 199 TeXDict begin 193 198 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(193)390 299 y(Decrypts)58 b(data)g(using)f(sp)s(eci\014ed)f(initialization)61 b(v)m(ector)e(and)d (k)m(ey)-8 b(.)123 b(The)57 b(k)m(ey)h(actually)390 408 y(used)40 b(is)h(deriv)m(ed)g(using)g(the)g(k)m(ey)h(usage.)73 b(If)40 b(k)m(ey)i(usage)g(is)f(0,)j(no)d(k)m(ey)h(deriv)-5 b(ation)41 b(is)g(used.)390 518 y(The)52 b(OUT)g(bu\013er)g(m)m(ust)h (b)s(e)f(deallo)s(cated)i(b)m(y)f(the)g(caller.)109 b(The)52 b(next)h(IV)f(is)h(lost,)59 b(see)390 628 y(shishi)p 620 628 28 4 v 39 w(decrypt)p 960 628 V 40 w(ivup)s(date)p 1349 628 V 39 w(et)m(yp)s(e)31 b(if)g(y)m(ou)f(need)h(it.)390 764 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e(data)h(exactly)-8 b(.)390 874 y(Some)37 b(encryption)g(t)m(yp)s(es)g(add)g(pad)g(to)h (mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s(c)m(k)h(size)g (of)f(the)h(en-)390 983 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f(lo)s(ok) h(in)e(an)m(y)h(sp)s(ecial)390 1093 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with)g(the)g (zero)h(b)m(yte.)65 b(This)37 b(means)390 1203 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f(the)h (original)g(length)g(after)390 1312 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 1449 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1650 y Fl(shishi)p 459 1650 37 5 v 55 w(decrypt)3350 1849 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_decrypt)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2131 1849 28 4 v 38 w(k)m(ey)f(*)e Fe(key)p Fi(,)i(in)m(t)f Fe(keyusage)p Fi(,)565 1959 y(const)g(c)m(har)g(*)f Fe(in)p Fi(,)i(size)p 1386 1959 V 41 w(t)e Fe(inlen)p Fi(,)i(c)m(har)f(**)g Fe(out)p Fi(,)h(size)p 2484 1959 V 41 w(t)e(*)h Fe(outlen)p Ff(\))390 2068 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2205 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(decrypt)e(with.)390 2341 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(this)f(k)m(ey)h(is)f(decrypting.)390 2478 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(decrypt.)390 2615 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(decrypt.)390 2751 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(decrypted)e(data.)390 2888 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 3024 y(Decrypts)30 b(data)h(sp)s(eci\014ed)e(k)m(ey)-8 b(.)41 b(The)29 b(k)m(ey)i(actually)g(used)e(is)h(deriv)m(ed)g(using)f (the)h(k)m(ey)g(usage.)41 b(If)390 3134 y(k)m(ey)27 b(usage)h(is)e(0,)i (no)f(k)m(ey)g(deriv)-5 b(ation)27 b(is)g(used.)39 b(The)26 b(OUT)g(bu\013er)f(m)m(ust)i(b)s(e)f(deallo)s(cated)i(b)m(y)f(the)390 3243 y(caller.)42 b(The)30 b(default)h(IV)f(is)h(used,)f(see)h(shishi)p 1994 3243 V 39 w(decrypt)p 2334 3243 V 40 w(iv)f(if)h(y)m(ou)f(need)h (to)g(alter)g(it.)42 b(The)30 b(next)390 3353 y(IV)g(is)h(lost,)g(see)g (shishi)p 1187 3353 V 39 w(decrypt)p 1527 3353 V 40 w(ivup)s(date)f(if) g(y)m(ou)h(need)f(it.)390 3490 y(Note)50 b(that)f(DECR)-8 b(YPT\(ENCR)g(YPT\(data\)\))50 b(do)s(es)e(not)h(necessarily)h(yield)e (data)h(exactly)-8 b(.)390 3599 y(Some)37 b(encryption)g(t)m(yp)s(es)g (add)g(pad)g(to)h(mak)m(e)g(the)f(data)h(\014t)f(in)m(to)h(the)f(blo)s (c)m(k)h(size)g(of)f(the)h(en-)390 3709 y(cryption)f(algorithm.)61 b(F)-8 b(urthermore,)38 b(the)f(pad)f(is)h(not)g(guaran)m(teed)h(to)f (lo)s(ok)h(in)e(an)m(y)h(sp)s(ecial)390 3818 y(w)m(a)m(y)-8 b(,)42 b(although)c(existing)h(implemen)m(tations)h(often)e(pad)g(with) g(the)g(zero)h(b)m(yte.)65 b(This)37 b(means)390 3928 y(that)30 b(y)m(ou)g(ma)m(y)g(ha)m(v)m(e)h(to)f Fq(")p Fw(frame)p Fq(")f Fw(data,)i(so)e(it)h(is)g(p)s(ossible)f(to)h(infer)f (the)h(original)g(length)g(after)390 4038 y(decryption.)41 b(Compare)30 b(ASN.1)h(DER)f(whic)m(h)g(con)m(tains)i(suc)m(h)e (information.)390 4174 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4376 y Fl(shishi)p 459 4376 37 5 v 55 w(n)p 582 4376 V 55 w(fold)3350 4574 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_n_fold)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2654 4574 28 4 v 41 w(t)f Fe(inlen)p Fi(,)565 4684 y(c)m(har)h(*)g Fe(out)p Fi(,)g(size)p 1200 4684 V 41 w(t)g Fe(outlen)p Ff(\))390 4794 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4930 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g (decrypt.)390 5067 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m (y)h(with)f(data)h(to)g(decrypt)f(\()p Fq(")p Fw(M)p Fq(")p Fw(\).)390 5203 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(decrypted)g(data.)390 5340 y Fi(outlen)p Fw(:)41 b(size)31 b(of)g(output)f(arra)m(y)h(\()p Fq(")p Fw(N)p Fq(")p Fw(\).)p eop end %%Page: 194 200 TeXDict begin 194 199 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(194)390 299 y(F)-8 b(old)42 b(data)f(in)m(to)g(a)g(\014xed)f(length)h(output)g(arra)m(y)-8 b(,)44 b(with)c(the)h(in)m(ten)m(t)h(to)f(giv)m(e)h(eac)m(h)g(input)e (bit)390 408 y(appro)m(ximately)32 b(equal)f(w)m(eigh)m(t)h(in)e (determining)g(the)g(v)-5 b(alue)31 b(of)g(eac)m(h)g(output)f(bit.)390 567 y(The)23 b(algorithm)i(is)e(from)h Fq(")p Fw(A)f(Better)i(Key)f(Sc) m(hedule)f(F)-8 b(or)25 b(DES-lik)m(e)g(Ciphers)p Fq(")d Fw(b)m(y)h(Uri)h(Blumen-)390 677 y(thal)g(and)e(Stev)m(en)i(M.)g(Bello) m(vin,)i(h)m(ttp://www.researc)m(h.att.com/)p Fq(~)p Fw(sm)m(b/pap)s(ers/ides.p)s(df,)h(al-)390 787 y(though)j(the)h(sample) f(v)m(ectors)i(pro)m(vided)e(b)m(y)g(the)h(pap)s(er)e(are)i(incorrect.) 390 946 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 1169 y Fl(shishi)p 459 1169 37 5 v 55 w(dr)3350 1390 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_dr)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 1869 1390 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)g(const)g(c)m(har)g(*)565 1500 y Fe(prfconstant)p Fi(,)j(size)p 1343 1500 V 41 w(t)d Fe(prfconstantlen)p Fi(,)j(c)m(har)d(*)g Fe(derivedrandom)p Fi(,)j(size)p 3389 1500 V 41 w(t)565 1610 y Fe(derivedrandomlen)p Ff(\))390 1719 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1878 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(arra)m(y)h(with)f(cryptographic)g(k)m(ey)i(to)f (use.)390 2037 y Fi(prfconstan)m(t)r Fw(:)41 b(input)29 b(arra)m(y)i(with)f(the)h(constan)m(t)g(string.)390 2196 y Fi(prfconstan)m(tlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i (with)f(the)h(constan)m(t)g(string.)390 2355 y Fi(deriv)m(edrandom)p Fw(:)40 b(output)30 b(arra)m(y)h(with)f(deriv)m(ed)g(random)g(data.)390 2514 y Fi(deriv)m(edrandomlen)p Fw(:)40 b(size)31 b(of)g(output)f(arra) m(y)h(with)f(deriv)m(ed)g(random)g(data.)390 2673 y(Deriv)m(e)49 b Fq(")p Fw(random)p Fq(")d Fw(data)i(from)g(a)f(k)m(ey)i(and)e(a)h (constan)m(t)g(th)m(usly:)75 b(DR\(KEY,)49 b(PRF)m(CON-)390 2782 y(ST)-8 b(ANT\))88 b(=)f(TR)m(UNCA)-8 b(TE\(DERIVEDRANDOMLEN,)90 b(SHISHI)p 3005 2782 V 39 w(ENCR)-8 b(YPT\(KEY,)390 2892 y(PRF)m(CONST)g(ANT\)\).)390 3051 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3275 y Fl(shishi)p 459 3275 37 5 v 55 w(dk)3350 3496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_dk)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 1869 3496 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)g(const)g(c)m(har)g(*) 565 3605 y Fe(prfconstant)p Fi(,)j(size)p 1343 3605 V 41 w(t)d Fe(prfconstantlen)p Fi(,)j(Shishi)p 2476 3605 V 39 w(k)m(ey)d(*)g Fe(derivedkey)p Ff(\))390 3715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3874 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(cryptographic)g(k)m(ey)i(to)f(use.)390 4033 y Fi(prfconstan)m(t)r Fw(:)41 b(input)29 b(arra)m(y)i(with)f(the)h (constan)m(t)g(string.)390 4192 y Fi(prfconstan)m(tlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f(the)h(constan)m(t)g (string.)390 4351 y Fi(deriv)m(edk)m(ey)8 b Fw(:)41 b(p)s(oin)m(ter)31 b(to)g(deriv)m(ed)f(k)m(ey)h(\(allo)s(cated)i(b)m(y)d(caller\).)390 4510 y Fk(Deriv)m(e)45 b(a)f(k)m(ey)g(from)f(a)h(k)m(ey)h(and)d(a)i (constan)m(t)h(th)m(usly:)67 b Fw(DK\(KEY,)45 b(PRF)m(CONST)-8 b(ANT\))43 b(=)390 4619 y(SHISHI)p 700 4619 V 39 w (RANDOM-TO-KEY\(SHISHI)p 1902 4619 V 40 w(DR\(KEY,)31 b(PRF)m(CONST)-8 b(ANT\)\).)390 4778 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)275 5011 y(An)41 b(easier)i(w)m(a)m(y)f(to)h(use)e(encryption)h(and)f (decryption)h(if)g(y)m(our)f(application)i(rep)s(eatedly)g(calls,)150 5121 y(e.g.,)k Fq(shishi_encrypt_ivupdate)p Fw(,)39 b(is)k(to)g(use)f (the)g(follo)m(wing)i(functions.)76 b(They)42 b(store)h(the)f(k)m(ey)-8 b(,)150 5230 y(initialization)28 b(v)m(ector,)g(etc,)f(in)d(a)i(con)m (text,)i(and)c(the)h(encryption)g(and)f(decryption)h(op)s(erations)g (up)s(date)150 5340 y(the)31 b(IV)f(within)g(the)g(con)m(text)j (automatically)-8 b(.)p eop end %%Page: 195 201 TeXDict begin 195 200 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(195)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(crypto)3350 499 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_crypto)56 b(*)d(shishi_crypto)c Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 499 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Fi(,)565 608 y(in)m(t)g Fe(keyusage)p Fi(,)i(in)m(t32)p 1382 608 V 41 w(t)e Fe(etype)p Fi(,)h(const)f(c)m (har)g(*)g Fe(iv)p Fi(,)g(size)p 2621 608 V 41 w(t)f Fe(ivlen)p Ff(\))390 718 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 855 y Fi(k)m(ey)8 b Fw(:)41 b(k)m(ey)31 b(to)h(encrypt)e (with.)390 993 y Fi(k)m(eyusage)5 b Fw(:)42 b(in)m(teger)32 b(sp)s(ecifying)e(what)h(this)f(k)m(ey)h(will)g(encrypt/decrypt.)390 1130 y Fi(et)m(yp)s(e)5 b Fw(:)41 b(in)m(teger)32 b(sp)s(ecifying)e (what)h(cipher)f(to)h(use.)390 1268 y Fi(iv)8 b Fw(:)41 b(input)29 b(arra)m(y)i(with)f(initialization)j(v)m(ector)390 1405 y Fi(ivlen)p Fw(:)41 b(size)31 b(of)g(input)e(arra)m(y)i(with)f (initialization)j(v)m(ector.)390 1543 y(Initialize)c(a)e(crypto)g(con)m (text.)41 b(This)26 b(store)i(a)f(k)m(ey)-8 b(,)29 b(k)m(eyusage,)g (encryption)e(t)m(yp)s(e)g(and)f(initializa-)390 1652 y(tion)f(v)m(ector)i(in)d(a)h Fq(")p Fw(con)m(text)p Fq(")p Fw(,)i(and)e(the)f(caller)j(can)e(then)f(use)g(this)h(con)m (text)i(to)e(p)s(erform)e(encryp-)390 1762 y(tion)34 b(via)h Fq(shishi_crypto_encrypt\(\))27 b Fw(and)33 b(decryption)h(via) g Fq(shishi_crypto_encrypt\(\))390 1872 y Fw(without)23 b(supplying)e(all)j(those)f(details)h(again.)40 b(The)22 b(functions)g(also)i(tak)m(es)g(care)g(of)f(propagating)390 1981 y(the)31 b(IV)f(b)s(et)m(w)m(een)h(calls.)390 2119 y(When)24 b(the)g(application)h(no)f(longer)h(need)e(to)i(use)f(the)g (con)m(text,)j(it)e(should)e(deallo)s(cate)j(resources)390 2228 y(asso)s(ciated)32 b(with)e(it)h(b)m(y)f(calling)i Fq(shishi_crypto_close\(\))p Fw(.)390 2366 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Return)30 b(a)g(newly)h(allo)s(cated)h(crypto)f(con)m (text.)150 2568 y Fl(shishi)p 459 2568 37 5 v 55 w(crypto)p 861 2568 V 54 w(encrypt)3350 2768 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_crypto_encrypt)f Ff(\()p Fi(Shishi)p 1783 2768 28 4 v 39 w(crypto)31 b(*)g Fe(ctx)p Fi(,)g(const)g(c)m(har)g (*)f Fe(in)p Fi(,)565 2877 y(size)p 712 2877 V 41 w(t)h Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Fi(,)g(size)p 1810 2877 V 41 w(t)g(*)g Fe(outlen)p Ff(\))390 2987 y Fi(ctx)6 b Fw(:)42 b(crypto)30 b(con)m(text)j(as)d(returned)f(b)m(y)i Fq(shishi_crypto\(\))p Fw(.)390 3125 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(encrypt.)390 3262 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with)f (data)h(to)g(encrypt.)390 3400 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(encrypted)e(data.)390 3537 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)390 3675 y(Encrypt)39 b(data,)44 b(using)c(information)h(\(e.g.,)k (k)m(ey)c(and)e(initialization)44 b(v)m(ector\))e(from)e(con)m(text.) 390 3784 y(The)30 b(IV)g(is)h(up)s(dated)e(inside)h(the)g(con)m(text)j (after)d(this)h(call.)390 3922 y(When)24 b(the)g(application)h(no)f (longer)h(need)e(to)i(use)f(the)g(con)m(text,)j(it)e(should)e(deallo)s (cate)j(resources)390 4031 y(asso)s(ciated)32 b(with)e(it)h(b)m(y)f (calling)i Fq(shishi_crypto_close\(\))p Fw(.)390 4169 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 4371 y Fl(shishi)p 459 4371 37 5 v 55 w(crypto)p 861 4371 V 54 w(decrypt)3350 4571 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_crypto_decrypt)f Ff(\()p Fi(Shishi)p 1783 4571 28 4 v 39 w(crypto)31 b(*)g Fe(ctx)p Fi(,)g(const)g(c)m(har)g(*)f Fe(in)p Fi(,)565 4680 y(size)p 712 4680 V 41 w(t)h Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Fi(,)g(size)p 1810 4680 V 41 w(t)g(*)g Fe(outlen)p Ff(\))390 4790 y Fi(ctx)6 b Fw(:)42 b(crypto)30 b(con)m(text)j(as)d (returned)f(b)m(y)i Fq(shishi_crypto\(\))p Fw(.)390 4927 y Fi(in)p Fw(:)40 b(input)30 b(arra)m(y)h(with)f(data)h(to)g(decrypt.) 390 5065 y Fi(inlen)p Fw(:)41 b(size)31 b(of)f(input)g(arra)m(y)h(with) f(data)h(to)g(decrypt.)390 5202 y Fi(out)r Fw(:)41 b(output)30 b(arra)m(y)h(with)f(newly)g(allo)s(cated)i(decrypted)e(data.)390 5340 y Fi(outlen)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(size)i(of)e(newly)g(allo)s(cated)j(output)d(arra)m(y)-8 b(.)p eop end %%Page: 196 202 TeXDict begin 196 201 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(196)390 299 y(Decrypt)41 b(data,)j(using)c(information)h(\(e.g.,)k(k)m(ey)d(and)e (initialization)j(v)m(ector\))g(from)d(con)m(text.)390 408 y(The)30 b(IV)g(is)h(up)s(dated)e(inside)h(the)g(con)m(text)j (after)d(this)h(call.)390 542 y(When)24 b(the)g(application)h(no)f (longer)h(need)e(to)i(use)f(the)g(con)m(text,)j(it)e(should)e(deallo)s (cate)j(resources)390 651 y(asso)s(ciated)32 b(with)e(it)h(b)m(y)f (calling)i Fq(shishi_crypto_close\(\))p Fw(.)390 785 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 982 y Fl(shishi)p 459 982 37 5 v 55 w(crypto)p 861 982 V 54 w(close)3350 1177 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_crypto_close)d Ff(\()p Fi(Shishi)p 1731 1177 28 4 v 39 w(crypto)31 b(*)f Fe(ctx)p Ff(\))390 1286 y Fi(ctx)6 b Fw(:)42 b(crypto)30 b(con)m(text)j(as)d(returned)f(b)m(y)i Fq(shishi_crypto\(\))p Fw(.)390 1420 y(Deallo)s(cate)j(resources)c(asso)s(ciated)i(with)e(the) h(crypto)f(con)m(text.)275 1601 y(Also)35 b(included)g(in)g(Shishi)f (is)h(an)g(in)m(terface)i(to)f(the)f(really)h(lo)m(w-lev)m(el)i (cryptographic)e(primitiv)m(es.)150 1710 y(They)27 b(map)h(directly)h (on)f(the)g(underlying)f(cryptographic)h(library)g(used)f(\(i.e.,)j(Gn) m(ulib)e(or)g(Libgcrypt\))150 1820 y(and)i(is)g(used)g(in)m(ternally)h (b)m(y)f(Shishi.)150 2017 y Fl(shishi)p 459 2017 37 5 v 55 w(randomize)3350 2212 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_randomize)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t)f Fe(strong)p Fi(,)h(v)m(oid)f(*)g Fe(data)p Fi(,)565 2321 y(size)p 712 2321 28 4 v 41 w(t)g Fe(datalen)p Ff(\))390 2431 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2564 y Fi(strong)8 b Fw(:)41 b(0)30 b(i\013)h(op)s(eration)g (should)e(not)i(blo)s(c)m(k,)g(non-0)g(for)f(v)m(ery)g(strong)h (randomness.)390 2698 y Fi(data)p Fw(:)41 b(output)30 b(arra)m(y)h(to)g(b)s(e)f(\014lled)g(with)g(random)g(data.)390 2831 y Fi(datalen)p Fw(:)42 b(size)31 b(of)f(output)g(arra)m(y)-8 b(.)390 2965 y(Store)31 b(cryptographically)g(random)f(data)h(of)g(giv) m(en)g(size)g(in)f(the)h(pro)m(vided)f(bu\013er.)390 3098 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISHI_OK)d Fw(i\013)k(successful.)150 3295 y Fl(shishi)p 459 3295 37 5 v 55 w(crc)3350 3490 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_crc)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2497 3490 28 4 v 41 w(t)f Fe(inlen)p Fi(,)j(c)m(har)d(*)565 3600 y Fe(out)p Fd([)p Fe(4)p Fd(])p Ff(\))390 3709 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y) d Fq(shishi_init\(\))p Fw(.)390 3843 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(c)m(hec)m (ksum.)390 3976 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m (haracter)j(arra)m(y)f(of)g(data)g(to)g(c)m(hec)m(ksum.)390 4110 y(Compute)f(c)m(hec)m(ksum)i(of)f(data)g(using)f(CR)m(C32)h(mo)s (di\014ed)f(according)i(to)f(RF)m(C)g(1510.)44 b(The)30 b Fq(out)390 4219 y Fw(bu\013er)f(m)m(ust)i(b)s(e)e(deallo)s(cated)k(b) m(y)d(the)g(caller.)390 4353 y(The)j(mo)s(di\014cations)h(compared)f (to)i(standard)e(CR)m(C32)h(is)f(that)i(no)e(initial)i(and)e(\014nal)g (X)m(OR)h(is)390 4462 y(p)s(erformed,)29 b(and)h(that)h(the)f(output)g (is)h(returned)e(in)h(LSB-\014rst)g(order.)390 4596 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4596 V 39 w(OK)f(i\013)i(successful.)150 4793 y Fl(shishi)p 459 4793 37 5 v 55 w(md4)3350 4987 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_md4)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2497 4987 28 4 v 41 w(t)f Fe(inlen)p Fi(,)j(c)m(har)d(*) 565 5097 y Fe(out)p Fd([)p Fe(16)p Fd(])p Ff(\))390 5207 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(hash.)p eop end %%Page: 197 203 TeXDict begin 197 202 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(197)390 299 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(of)g(data) g(to)g(hash.)390 457 y(Compute)d(hash)g(of)g(data)h(using)f(MD4.)41 b(The)28 b Fq(out)g Fw(bu\013er)f(m)m(ust)h(b)s(e)g(deallo)s(cated)i(b) m(y)f(the)f(caller.)390 614 y Fk(Return)i(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 614 28 4 v 39 w(OK)f(i\013)i (successful.)150 837 y Fl(shishi)p 459 837 37 5 v 55 w(md5)3350 1056 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_md5)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 2497 1056 28 4 v 41 w(t)f Fe(inlen)p Fi(,)j(c)m(har)d(*)565 1166 y Fe(out)p Fd([)p Fe(16)p Fd(])p Ff(\))390 1276 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 1433 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(hash.)390 1591 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j (arra)m(y)f(of)g(data)g(to)g(hash.)390 1749 y(Compute)d(hash)g(of)g (data)h(using)f(MD5.)41 b(The)28 b Fq(out)g Fw(bu\013er)f(m)m(ust)h(b)s (e)g(deallo)s(cated)i(b)m(y)f(the)f(caller.)390 1906 y Fk(Return)i(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1906 V 39 w(OK)f(i\013)i(successful.)150 2129 y Fl(shishi)p 459 2129 37 5 v 55 w(hmac)p 799 2129 V 54 w(md5)3350 2348 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_hmac_md5)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)f Fe(key)p Fi(,)i(size)p 2811 2348 28 4 v 41 w(t)565 2458 y Fe(keylen)p Fi(,)g(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 1755 2458 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)e(*)h Fe(outhash)p Fd([)p Fe(16)p Fd(])p Ff(\))390 2568 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2725 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(c)m(haracter)i(arra)m(y)f (with)f(k)m(ey)h(to)g(use.)390 2883 y Fi(k)m(eylen)p Fw(:)42 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(with)f(k)m (ey)h(to)h(use.)390 3041 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(hash.)390 3198 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j (arra)m(y)f(of)g(data)g(to)g(hash.)390 3356 y(Compute)j(k)m(ey)m(ed)h (c)m(hec)m(ksum)g(of)g(data)g(using)e(HMA)m(C-MD5.)55 b(The)34 b Fq(outhash)e Fw(bu\013er)h(m)m(ust)i(b)s(e)390 3465 y(deallo)s(cated)d(b)m(y)f(the)f(caller.)390 3623 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3623 V 39 w(OK)f(i\013)i(successful.)150 3845 y Fl(shishi)p 459 3845 37 5 v 55 w(hmac)p 799 3845 V 54 w(sha1)3350 4065 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_hmac_sha1)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(key)p Fi(,)g(size)p 2863 4065 28 4 v 41 w(t)565 4175 y Fe(keylen)p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 1755 4175 V 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)e(*)h Fe(outhash)p Fd([)p Fe(20)p Fd(])p Ff(\))390 4285 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4442 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(c)m(haracter)i(arra)m(y)f (with)f(k)m(ey)h(to)g(use.)390 4600 y Fi(k)m(eylen)p Fw(:)42 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(with)f(k)m (ey)h(to)h(use.)390 4757 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(hash.)390 4915 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j (arra)m(y)f(of)g(data)g(to)g(hash.)390 5073 y(Compute)g(k)m(ey)m(ed)i (c)m(hec)m(ksum)f(of)g(data)h(using)e(HMA)m(C-SHA1.)46 b(The)31 b Fq(outhash)e Fw(bu\013er)i(m)m(ust)h(b)s(e)390 5182 y(deallo)s(cated)g(b)m(y)f(the)f(caller.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 198 204 TeXDict begin 198 203 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(198)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(des)p 686 299 V 55 w(cb)s(c)p 922 299 V 54 w(mac)3350 503 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_des_cbc_mac)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)f Fe(key)p Fd([)p Fe(8)p Fd(])p Fi(,)i(const)565 613 y(c)m(har)f Fe(iv)p Fd([)p Fe(8)p Fd(])p Fi(,)g(const)g(c)m(har)g(*)f Fe(in)p Fi(,)i(size)p 1854 613 28 4 v 41 w(t)e Fe(inlen)p Fi(,)i(c)m(har)f(*)g Fe(out)p Fd([)p Fe(8)p Fd(])p Ff(\))390 722 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 864 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g(hash.)390 1007 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j (arra)m(y)f(of)g(data)g(to)g(hash.)390 1149 y(Computed)k(k)m(ey)m(ed)i (c)m(hec)m(ksum)f(of)g(data)h(using)e(DES-CBC-MA)m(C.)i(The)e Fq(out)g Fw(bu\013er)g(m)m(ust)h(b)s(e)390 1258 y(deallo)s(cated)c(b)m (y)f(the)f(caller.)390 1400 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1400 V 39 w(OK)f(i\013)i(successful.) 150 1607 y Fl(shishi)p 459 1607 37 5 v 55 w(arcfour)3350 1811 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_arcfour)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(in)m(t)d Fe(decryptp)p Fi(,)j(const)e(c)m(har)g(*)g Fe(key)p Fi(,)565 1921 y(size)p 712 1921 28 4 v 41 w(t)g Fe(keylen)p Fi(,)h(const)f(c)m (har)g Fe(iv)p Fd([)p Fe(258)p Fd(])p Fi(,)h(c)m(har)e(*)h Fe(ivout)p Fd([)p Fe(258)p Fd(])p Fi(,)i(const)e(c)m(har)f(*)h Fe(in)p Fi(,)g(size)p 3618 1921 V 41 w(t)565 2031 y Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Ff(\))390 2140 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2282 y Fi(decryptp)s Fw(:)40 b(0)30 b(to)i(indicate)f(encryption,)g(non-0)f(to)h(indicate)h (decryption.)390 2424 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(c)m(haracter)i(arra)m(y)f(with)f(k)m(ey)h(to)g(use.)390 2566 y Fi(k)m(eylen)p Fw(:)42 b(length)30 b(of)h(input)e(k)m(ey)j(arra) m(y)-8 b(.)390 2708 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra) m(y)f(of)f(data)h(to)g(encrypt/decrypt.)390 2851 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(of)g(data) g(to)g(encrypt/decrypt.)390 2993 y Fi(out)r Fw(:)41 b(newly)30 b(allo)s(cated)i(c)m(haracter)g(arra)m(y)f(with)f(encrypted/decrypted)g (data.)390 3135 y(Encrypt)d(or)g(decrypt)g(data)h(\(dep)s(ending)e(on)i Fq(decryptp)p Fw(\))d(using)i(AR)m(CF)m(OUR.)i(The)d Fq(out)h Fw(bu\013er)390 3244 y(m)m(ust)j(b)s(e)g(deallo)s(cated)i(b)m (y)f(the)f(caller.)390 3386 y(The)25 b Fq(")p Fw(initialization)k(v)m (ector)p Fq(")e Fw(used)e(here)g(is)h(the)g(concatenation)i(of)e(the)g (sb)s(o)m(x)g(and)f(i)h(and)f(j,)i(and)390 3496 y(is)j(th)m(us)g(alw)m (a)m(ys)i(of)f(size)g(256)g Fq(+)f Fw(1)h Fq(+)f Fw(1.)41 b(This)29 b(is)i(a)f(sligh)m(t)i(abuse)e(of)g(terminology)-8 b(,)33 b(and)c(assumes)390 3606 y(y)m(ou)i(kno)m(w)f(what)g(y)m(ou)h (are)g(doing.)41 b(Don't)31 b(use)f(it)h(if)f(y)m(ou)h(can)g(a)m(v)m (oid)h(to.)390 3748 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3748 V 39 w(OK)f(i\013)i(successful.)150 3954 y Fl(shishi)p 459 3954 37 5 v 55 w(des)3350 4159 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_des)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(in)m(t)f Fe(decryptp)p Fi(,)i(const)e(c)m(har)g Fe(key)p Fd([)p Fe(8)p Fd(])p Fi(,)565 4268 y(const)g(c)m(har)g Fe(iv)p Fd([)p Fe(8)p Fd(])p Fi(,)g(c)m(har)g(*)f Fe(ivout)p Fd([)p Fe(8)p Fd(])p Fi(,)j(const)e(c)m(har)f(*)h Fe(in)p Fi(,)g(size)p 2792 4268 28 4 v 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)f(**) g Fe(out)p Ff(\))390 4378 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4520 y Fi(decryptp)s Fw(:)40 b(0)30 b(to)i(indicate)f (encryption,)g(non-0)f(to)h(indicate)h(decryption.)390 4662 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f (data)h(to)g(encrypt/decrypt.)390 4804 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(of)g(data)g(to)g (encrypt/decrypt.)390 4946 y Fi(out)r Fw(:)41 b(newly)30 b(allo)s(cated)i(c)m(haracter)g(arra)m(y)f(with)f(encrypted/decrypted)g (data.)390 5088 y(Encrypt)36 b(or)h(decrypt)g(data)h(\(dep)s(ending)d (on)i Fq(decryptp)p Fw(\))f(using)g(DES)h(in)g(CBC)f(mo)s(de.)60 b(The)390 5198 y Fq(out)29 b Fw(bu\013er)h(m)m(ust)g(b)s(e)g(deallo)s (cated)i(b)m(y)e(the)h(caller.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 199 205 TeXDict begin 199 204 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(199)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(3des)3350 497 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_3des)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(in)m(t)e Fe(decryptp)p Fi(,)i(const)d(c)m(har)h Fe(key)p Fd([)p Fe(8)p Fd(])p Fi(,)565 606 y(const)g(c)m(har)g Fe(iv)p Fd([)p Fe(8)p Fd(])p Fi(,)g(c)m(har)g(*)f Fe(ivout)p Fd([)p Fe(8)p Fd(])p Fi(,)j(const)e(c)m(har)f(*)h Fe(in)p Fi(,)g(size)p 2792 606 28 4 v 41 w(t)g Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Ff(\))390 716 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 851 y Fi(decryptp)s Fw(:)40 b(0)30 b(to)i(indicate)f (encryption,)g(non-0)f(to)h(indicate)h(decryption.)390 986 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data) h(to)g(encrypt/decrypt.)390 1122 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(of)g(data)g(to)g (encrypt/decrypt.)390 1257 y Fi(out)r Fw(:)41 b(newly)30 b(allo)s(cated)i(c)m(haracter)g(arra)m(y)f(with)f(encrypted/decrypted)g (data.)390 1392 y(Encrypt)j(or)h(decrypt)f(data)i(\(dep)s(ending)d(on)i Fq(decryptp)p Fw(\))e(using)h(3DES)h(in)g(CBC)f(mo)s(de.)50 b(The)390 1502 y Fq(out)29 b Fw(bu\013er)h(m)m(ust)g(b)s(e)g(deallo)s (cated)i(b)m(y)e(the)h(caller.)390 1637 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1637 V 39 w(OK)f(i\013)i(successful.)150 1838 y Fl(shishi)p 459 1838 37 5 v 55 w(aes)p 678 1838 V 54 w(cts)3350 2035 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_aes_cts)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(in)m(t)d Fe(decryptp)p Fi(,)j(const)e(c)m(har)g(*)g Fe(key)p Fi(,)565 2145 y(size)p 712 2145 28 4 v 41 w(t)g Fe(keylen)p Fi(,)h(const)f(c)m (har)g Fe(iv)p Fd([)p Fe(16)p Fd(])p Fi(,)g(c)m(har)g(*)g Fe(ivout)p Fd([)p Fe(16)p Fd(])p Fi(,)h(const)f(c)m(har)g(*)g Fe(in)p Fi(,)g(size)p 3514 2145 V 41 w(t)565 2254 y Fe(inlen)p Fi(,)h(c)m(har)f(**)g Fe(out)p Ff(\))390 2364 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2499 y Fi(decryptp)s Fw(:)40 b(0)30 b(to)i(indicate)f(encryption,)g(non-0)f(to)h(indicate)h (decryption.)390 2635 y Fi(k)m(ey)8 b Fw(:)41 b(input)30 b(c)m(haracter)i(arra)m(y)f(with)f(k)m(ey)h(to)g(use.)390 2770 y Fi(k)m(eylen)p Fw(:)42 b(length)30 b(of)h(input)e(c)m(haracter)j (arra)m(y)f(with)f(k)m(ey)h(to)h(use.)390 2905 y Fi(in)p Fw(:)40 b(input)30 b(c)m(haracter)i(arra)m(y)f(of)f(data)h(to)g (encrypt/decrypt.)390 3041 y Fi(inlen)p Fw(:)41 b(length)30 b(of)h(input)e(c)m(haracter)j(arra)m(y)f(of)g(data)g(to)g (encrypt/decrypt.)390 3176 y Fi(out)r Fw(:)41 b(newly)30 b(allo)s(cated)i(c)m(haracter)g(arra)m(y)f(with)f(encrypted/decrypted)g (data.)390 3311 y(Encrypt)37 b(or)g(decrypt)h(data)g(\(dep)s(ending)e (on)i Fq(decryptp)p Fw(\))d(using)i(AES)h(in)f(CBC-CTS)f(mo)s(de.)390 3421 y(The)e(length)g(of)h(the)f(k)m(ey)-8 b(,)37 b Fq(keylen)p Fw(,)d(decide)h(if)f(AES)g(128)h(or)f(AES)g(256)i(should)d(b)s(e)h (used.)51 b(The)390 3531 y Fq(out)29 b Fw(bu\013er)h(m)m(ust)g(b)s(e)g (deallo)s(cated)i(b)m(y)e(the)h(caller.)390 3666 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3666 V 39 w(OK)f(i\013)i(successful.)150 3866 y Fl(shishi)p 459 3866 37 5 v 55 w(pbkdf2)p 881 3866 V 56 w(sha1)3350 4064 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_pbkdf2_sha1)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)f(*)h Fe(P)p Fi(,)g(size)p 2863 4064 28 4 v 41 w(t)g Fe(Plen)p Fi(,)565 4173 y(const)g(c)m(har)g(*)f Fe(S)p Fi(,)h(size)p 1333 4173 V 41 w(t)g Fe(Slen)p Fi(,)h(unsigned)d(in)m(t)i Fe(c)p Fi(,)g(unsigned)e(in)m(t)i Fe(dkLen)p Fi(,)h(c)m(har)f(*)g Fe(DK)p Ff(\))390 4283 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4418 y Fi(P)5 b Fw(:)41 b(input)29 b(passw)m(ord,)h(an)g(o)s (ctet)i(string)390 4554 y Fi(Plen)p Fw(:)41 b(length)30 b(of)h(passw)m(ord,)f(an)g(o)s(ctet)i(string)390 4689 y Fi(S)5 b Fw(:)40 b(input)30 b(salt,)h(an)g(o)s(ctet)g(string)390 4824 y Fi(Slen)p Fw(:)40 b(length)31 b(of)g(salt,)g(an)f(o)s(ctet)i (string)390 4960 y Fi(c)6 b Fw(:)41 b(iteration)32 b(coun)m(t,)f(a)g(p) s(ositiv)m(e)g(in)m(teger)390 5095 y Fi(dkLen)p Fw(:)39 b(in)m(tended)28 b(length)h(in)f(o)s(ctets)i(of)f(the)g(deriv)m(ed)f(k) m(ey)-8 b(,)31 b(a)d(p)s(ositiv)m(e)i(in)m(teger,)g(at)g(most)f(\(2)p Fq(^)p Fw(32)390 5205 y(-)i(1\))g(*)f(hLen.)40 b(The)30 b(DK)h(arra)m(y)g(m)m(ust)f(ha)m(v)m(e)h(ro)s(om)g(for)f(this)g(man)m (y)g(c)m(haracters.)390 5340 y Fi(DK)8 b Fw(:)41 b(output)30 b(deriv)m(ed)g(k)m(ey)-8 b(,)32 b(a)f(dkLen-o)s(ctet)g(string)p eop end %%Page: 200 206 TeXDict begin 200 205 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(200)390 299 y(Deriv)m(e)30 b(k)m(ey)f(using)f(the)g(PBKDF2)i(de\014ned)d(in)h(PK)m(CS5.)40 b(PBKDF2)29 b(applies)g(a)f(pseudorandom)390 408 y(function)44 b(to)g(deriv)m(e)h(k)m(eys.)82 b(The)44 b(length)g(of)g(the)g(deriv)m (ed)h(k)m(ey)f(is)g(essen)m(tially)i(un)m(b)s(ounded.)390 518 y(\(Ho)m(w)m(ev)m(er,)e(the)39 b(maxim)m(um)g(e\013ectiv)m(e)i (searc)m(h)f(space)g(for)e(the)i(deriv)m(ed)f(k)m(ey)g(ma)m(y)h(b)s(e)e (limited)390 628 y(b)m(y)c(the)f(structure)h(of)g(the)f(underlying)g (pseudorandom)f(function,)j(whic)m(h)e(is)h(this)f(function)h(is)390 737 y(alw)m(a)m(ys)e(SHA1.\))390 867 y Fk(Return)e(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 867 28 4 v 39 w(OK)f(i\013)i(successful.)150 1089 y Fv(5.14)68 b(X.509)46 b(F)-11 b(unctions)150 1249 y Fw(The)32 b(functions)g(describ)s(ed)f (in)h(this)g(section)i(are)e(used)g(b)m(y)g(the)h(ST)-8 b(AR)g(TTLS)31 b(functionalit)m(y)-8 b(,)34 b(see)f(Sec-)150 1358 y(tion)e(3.6)g([Kerb)s(eros)f(via)h(TLS],)f(page)h(26.)150 1547 y Fl(shishi)p 459 1547 37 5 v 55 w(x509ca)p 877 1547 V 54 w(default)p 1302 1547 V 55 w(\014le)p 1515 1547 V 54 w(guess)3350 1734 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_x509ca_default_)q(fil)q(e_g)q(ues)q(s)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 1844 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 1973 y(Guesses)g(the)f(default)h (X.509)h(CA)e(certi\014cate)i(\014lename;)f(it)g(is)f ($HOME/.shishi/clien)m(t.ca.)390 2103 y Fk(Return)35 b(v)-5 b(alue:)51 b Fw(Returns)34 b(default)h(X.509)i(clien)m(t)g (certi\014cate)h(\014lename)d(as)h(a)f(string)g(that)h(has)390 2212 y(to)31 b(b)s(e)f(deallo)s(cated)i(with)e Fq(free\(\))f Fw(b)m(y)h(the)h(caller.)150 2401 y Fl(shishi)p 459 2401 V 55 w(x509ca)p 877 2401 V 54 w(default)p 1302 2401 V 55 w(\014le)p 1515 2401 V 54 w(set)3350 2588 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_x509ca_default_fi)q(le_)q(set)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)565 2698 y(*)g Fe(x509cafile)p Ff(\))390 2807 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2937 y Fi(x509ca\014le)5 b Fw(:)42 b(string)27 b(with)g(new)f(default)i(x509)g(clien)m(t)h (certi\014cate)g(\014le)f(name,)g(or)f(NULL)g(to)h(reset)390 3046 y(to)j(default.)390 3176 y(Set)36 b(the)f(default)h(X.509)i(CA)d (certi\014cate)i(\014lename)f(used)f(in)g(the)h(library)-8 b(.)56 b(The)35 b(certi\014cate)j(is)390 3285 y(used)31 b(during)f(TLS)g(connections)i(with)f(the)h(KDC)f(to)h(authen)m(ticate) i(the)d(KDC.)h(The)f(string)g(is)390 3395 y(copied)36 b(in)m(to)g(the)f(library)-8 b(,)37 b(so)f(y)m(ou)f(can)h(disp)s(ose)e (of)i(the)f(v)-5 b(ariable)36 b(immediately)h(after)e(calling)390 3505 y(this)30 b(function.)150 3694 y Fl(shishi)p 459 3694 V 55 w(x509ca)p 877 3694 V 54 w(default)p 1302 3694 V 55 w(\014le)3350 3881 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_x509ca_default_)q(fil)q(e)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 3990 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 4120 y(Get)g(\014lename)g(for)f (default)h(X.509)h(CA)e(certi\014cate.)390 4249 y Fk(Return)h(v)-5 b(alue:)42 b Fw(Returns)30 b(the)h(default)h(X.509)g(CA)f (certi\014cate)i(\014lename)f(used)e(in)g(the)i(library)-8 b(.)390 4359 y(The)39 b(certi\014cate)j(is)e(used)f(during)g(TLS)f (connections)j(with)f(the)g(KDC)f(to)i(authen)m(ticate)h(the)390 4468 y(KDC.)30 b(The)g(string)h(is)f(not)h(a)f(cop)m(y)-8 b(,)32 b(so)f(don't)f(mo)s(dify)g(or)g(deallo)s(cate)j(it.)150 4657 y Fl(shishi)p 459 4657 V 55 w(x509cert)p 971 4657 V 55 w(default)p 1397 4657 V 54 w(\014le)p 1609 4657 V 54 w(guess)3350 4844 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_x509cert_defaul)q(t_f)q(ile)q(_gu)q(ess)g Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4954 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 5083 y(Guesses)24 b(the)g(default)h(X.509)g(clien)m(t)h(certi\014cate)g(\014lename;)h(it) d(is)g($HOME/.shishi/clien)m(t.certs.)390 5213 y Fk(Return)35 b(v)-5 b(alue:)51 b Fw(Returns)34 b(default)h(X.509)i(clien)m(t)g (certi\014cate)h(\014lename)d(as)h(a)f(string)g(that)h(has)390 5322 y(to)31 b(b)s(e)f(deallo)s(cated)i(with)e Fq(free\(\))f Fw(b)m(y)h(the)h(caller.)p eop end %%Page: 201 207 TeXDict begin 201 206 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(201)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(x509cert)p 971 299 V 55 w(default)p 1397 299 V 54 w(\014le)p 1609 299 V 54 w(set)3350 482 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_x509cert_default_)q (fil)q(e_s)q(et)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)565 592 y(c)m(har)f(*)g Fe(x509certfile)p Ff(\))390 702 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 830 y Fi(x509cert\014le)5 b Fw(:)60 b(string)39 b(with)g(new)f(default)h (x509)h(clien)m(t)h(certi\014cate)g(\014le)e(name,)i(or)e(NULL)g(to)390 939 y(reset)31 b(to)g(default.)390 1067 y(Set)f(the)h(default)f(X.509)i (clien)m(t)f(certi\014cate)i(\014lename)d(used)f(in)h(the)g(library)-8 b(.)41 b(The)30 b(certi\014cate)i(is)390 1177 y(used)d(during)g(TLS)f (connections)j(with)f(the)g(KDC)g(to)g(authen)m(ticate)i(the)f(clien)m (t.)42 b(The)29 b(string)h(is)390 1286 y(copied)36 b(in)m(to)g(the)f (library)-8 b(,)37 b(so)f(y)m(ou)f(can)h(disp)s(ose)e(of)i(the)f(v)-5 b(ariable)36 b(immediately)h(after)e(calling)390 1396 y(this)30 b(function.)150 1582 y Fl(shishi)p 459 1582 V 55 w(x509cert)p 971 1582 V 55 w(default)p 1397 1582 V 54 w(\014le)3350 1765 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_x509cert_defaul)q(t_f)q(ile)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 1875 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 2003 y(Get)g(\014lename)g(for)f (default)h(X.509)h(certi\014cate.)390 2131 y Fk(Return)24 b(v)-5 b(alue:)38 b Fw(Returns)23 b(the)h(default)g(X.509)i(clien)m(t)g (certi\014cate)g(\014lename)e(used)g(in)f(the)i(library)-8 b(.)390 2240 y(The)39 b(certi\014cate)j(is)e(used)f(during)g(TLS)f (connections)j(with)f(the)g(KDC)f(to)i(authen)m(ticate)h(the)390 2350 y(clien)m(t.)g(The)30 b(string)h(is)f(not)h(a)f(cop)m(y)-8 b(,)32 b(so)f(don't)f(mo)s(dify)g(or)g(deallo)s(cate)j(it.)150 2536 y Fl(shishi)p 459 2536 V 55 w(x509k)m(ey)p 945 2536 V 54 w(default)p 1370 2536 V 55 w(\014le)p 1583 2536 V 54 w(guess)3350 2720 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_x509key_default)q(_fi)q(le_)q(gue)q(ss)g Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 2829 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 2957 y(Guesses)g(the)f(default)h (X.509)h(clien)m(t)g(k)m(ey)f(\014lename;)g(it)g(is)f ($HOME/.shishi/clien)m(t.k)m(ey)-8 b(.)390 3085 y Fk(Return)36 b(v)-5 b(alue:)52 b Fw(Returns)35 b(default)h(X.509)i(clien)m(t)f(k)m (ey)g(\014lename)f(as)g(a)h(string)f(that)g(has)g(to)h(b)s(e)390 3195 y(deallo)s(cated)32 b(with)e Fq(free\(\))f Fw(b)m(y)h(the)h (caller.)150 3381 y Fl(shishi)p 459 3381 V 55 w(x509k)m(ey)p 945 3381 V 54 w(default)p 1370 3381 V 55 w(\014le)p 1583 3381 V 54 w(set)3350 3564 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_x509key_default_f)q(ile)q(_se)q(t)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 3674 y(c)m(har)f(*)g Fe(x509keyfile)p Ff(\))390 3783 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m (y)f Fq(shishi_init\(\))p Fw(.)390 3911 y Fi(x509k)m(ey\014le)5 b Fw(:)51 b(string)34 b(with)g(new)f(default)i(x509)g(clien)m(t)h(k)m (ey)f(\014le)f(name,)h(or)g(NULL)f(to)g(reset)h(to)390 4021 y(default.)390 4149 y(Set)c(the)h(default)f(X.509)i(clien)m(t)f(k) m(ey)g(\014lename)f(used)g(in)f(the)i(library)-8 b(.)42 b(The)31 b(k)m(ey)h(is)f(used)f(during)390 4258 y(TLS)h(connections)i (with)e(the)h(KDC)g(to)g(authen)m(ticate)j(the)d(clien)m(t.)47 b(The)31 b(string)h(is)g(copied)g(in)m(to)390 4368 y(the)c(library)-8 b(,)29 b(so)g(y)m(ou)g(can)f(disp)s(ose)g(of)g(the)h(v)-5 b(ariable)29 b(immediately)g(after)g(calling)h(this)e(function.)150 4554 y Fl(shishi)p 459 4554 V 55 w(x509k)m(ey)p 945 4554 V 54 w(default)p 1370 4554 V 55 w(\014le)3350 4738 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_x509key_default)q(_fi)q(le)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4847 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4975 y(Get)g(\014lename)g(for)f(default)h(X.509)h(k)m(ey)-8 b(.)390 5103 y Fk(Return)29 b(v)-5 b(alue:)40 b Fw(Returns)29 b(the)g(default)g(X.509)i(clien)m(t)g(k)m(ey)f(\014lename)f(used)g(in)g (the)g(library)-8 b(.)40 b(The)390 5213 y(k)m(ey)d(is)f(used)g(during)f (TLS)g(connections)i(with)f(the)h(KDC)f(to)g(authen)m(ticate)j(the)e (clien)m(t.)59 b(The)390 5322 y(string)30 b(is)h(not)f(a)h(cop)m(y)-8 b(,)32 b(so)f(don't)f(mo)s(dify)f(or)i(deallo)s(cate)i(it.)p eop end %%Page: 202 208 TeXDict begin 202 207 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(202)150 299 y Fv(5.15)68 b(Utilit)l(y)47 b(F)-11 b(unctions)150 521 y Fl(shishi)p 459 521 37 5 v 55 w(realm)p 816 521 V 55 w(default)p 1242 521 V 54 w(guess)3350 713 y Fw([F)j(unction])-3599 b Fg(char)54 b(*)e(shishi_realm_default_g)q(ues)q(s)f Ff(\()31 b Fe(void)p Ff(\))390 823 y Fw(Guesses)g(a)g(realm)g(based)f (on)h Fq(getdomainname\(\))26 b Fw(\(whic)m(h)31 b(really)g(is)g (NIS/YP)f(domain,)h(but)f(if)390 933 y(it)e(is)f(set)g(it)h(migh)m(t)f (b)s(e)g(a)g(go)s(o)s(d)g(guess\),)h(or)f(if)g(it)h(fails,)g(based)f (on)f Fq(gethostname\(\))p Fw(,)f(or)i(if)g(it)g(fails,)390 1042 y(the)34 b(string)g Fq(")p Fw(could-not-guess-default-realm)p Fq(")p Fw(.)53 b(Note)35 b(that)g(the)f(hostname)g(is)g(not)g(trimmed) 390 1152 y(o\013)e(of)g(the)g(data)h(returned)d(b)m(y)i Fq(gethostname\(\))c Fw(to)k(get)h(the)f(domain)g(name)g(and)f(use)g (that)i(as)390 1261 y(the)e(realm.)390 1394 y Fk(Return)h(v)-5 b(alue:)43 b Fw(Returns)31 b(guessed)h(realm)g(for)g(host)g(as)g(a)g (string)f(that)i(has)e(to)i(b)s(e)e(deallo)s(cated)390 1503 y(with)f Fq(free\(\))f Fw(b)m(y)h(the)h(caller.)150 1698 y Fl(shishi)p 459 1698 V 55 w(realm)p 816 1698 V 55 w(default)3350 1891 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_realm_default)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 2000 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2133 y(Get)g(name)g(of)f(default)h (realm.)390 2265 y Fk(Return)36 b(v)-5 b(alue:)54 b Fw(Returns)36 b(the)g(default)h(realm)g(used)f(in)g(the)h(library)-8 b(.)60 b(\(Not)38 b(a)f(cop)m(y)g(of)g(it,)i(so)390 2375 y(don't)30 b(mo)s(dify)g(or)g(deallo)s(cate)j(it.\))150 2570 y Fl(shishi)p 459 2570 V 55 w(realm)p 816 2570 V 55 w(default)p 1242 2570 V 54 w(set)3350 2762 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_realm_default_set)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 2872 y Fe(realm)p Ff(\))390 2981 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 3113 y Fi(realm)p Fw(:)41 b(string)30 b(with)h(new)e(default)i (realm)g(name,)f(or)h(NULL)f(to)h(reset)g(to)g(default.)390 3246 y(Set)d(the)h(default)f(realm)h(used)e(in)h(the)h(library)-8 b(.)40 b(The)27 b(string)i(is)f(copied)h(in)m(to)g(the)f(library)-8 b(,)29 b(so)g(y)m(ou)390 3355 y(can)i(disp)s(ose)e(of)i(the)f(v)-5 b(ariable)32 b(immediately)f(after)g(calling)h(this)e(function.)150 3550 y Fl(shishi)p 459 3550 V 55 w(realm)p 816 3550 V 55 w(for)p 1019 3550 V 55 w(serv)m(er)p 1396 3550 V 54 w(\014le)3350 3743 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_realm_for_serve)q(r_f)q(ile)g Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(c)m(har)d(*)565 3852 y Fe(server)p Ff(\))390 3962 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 4094 y Fi(serv)m(er)7 b Fw(:)41 b(hostname)30 b(to)h(\014nd)e(realm)i(for.) 390 4227 y(Find)f(realm)h(for)f(a)h(host)f(using)g(con\014guration)h (\014le.)390 4359 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(realm)g(for)h(host,)f(or)h(NULL)f(if)g(not)h(found.)150 4554 y Fl(shishi)p 459 4554 V 55 w(realm)p 816 4554 V 55 w(for)p 1019 4554 V 55 w(serv)m(er)p 1396 4554 V 54 w(dns)3350 4747 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_realm_for_serve)q(r_d)q(ns)g Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(c)m(har)f(*)565 4856 y Fe(server)p Ff(\))390 4966 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 5098 y Fi(serv)m(er)7 b Fw(:)41 b(hostname)30 b(to)h(\014nd)e(realm)i(for.) 390 5230 y(Find)42 b(realm)g(for)g(a)h(host)f(using)g(DNS)g(lo)s (okups,)j(according)f(to)f(draft-ietf-krb-wg-krb-dns-)390 5340 y(lo)s(cate-03.txt.)51 b(Since)33 b(DNS)f(lo)s(okups)g(ma)m(y)h(b) s(e)f(sp)s(o)s(ofed,)h(relying)g(on)f(the)h(realm)g(information)p eop end %%Page: 203 209 TeXDict begin 203 208 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(203)390 299 y(ma)m(y)39 b(result)f(in)f(a)i(redirection)f(attac)m(k.)66 b(In)38 b(a)g(single-realm)h(scenario,)i(this)d(only)g(ac)m(hiev)m(es)j(a)390 408 y(denial)d(of)f(service,)k(but)36 b(with)h(cross-realm)i(trust)e (it)h(ma)m(y)g(redirect)f(y)m(ou)h(to)g(a)g(compromised)390 518 y(realm.)46 b(F)-8 b(or)33 b(this)f(reason,)g(Shishi)f(prin)m(ts)h (a)g(w)m(arning,)h(suggesting)g(that)f(the)g(user)g(should)f(add)390 628 y(the)g(prop)s(er)d('serv)m(er-realm')k(con\014guration)f(tok)m (ens)g(instead.)390 774 y(T)-8 b(o)38 b(illustrate)g(the)g(DNS)f (information)h(used,)g(here)f(is)h(an)f(extract)i(from)e(a)g(zone)h (\014le)g(for)f(the)390 883 y(domain)30 b(ASDF.COM:)p 396 1029 28 4 v 430 1029 a(k)m(erb)s(eros.asdf.com.)122 b(IN)58 b(TXT)e Fq(")p Fw(ASDF.COM)p Fq(")p 2347 1029 V 98 w Fw(k)m(erb)s(eros.mrkserv)m(er.asdf.com.)122 b(IN)390 1139 y(TXT)82 b Fq(")p Fw(MARKETING.ASDF.COM)p Fq(")p 1964 1139 V 124 w Fw(k)m(erb)s(eros.salesserv)m(er.asdf.com.)201 b(IN)83 b(TXT)390 1248 y Fq(")p Fw(SALES.ASDF.COM)p Fq(")390 1394 y Fw(Let)52 b(us)f(supp)s(ose)f(that)j(in)e(this)g(case,)59 b(a)52 b(clien)m(t)h(wishes)e(to)i(use)e(a)h(service)g(on)g(the)g(host) 390 1504 y(fo)s(o.asdf.com.)42 b(It)30 b(w)m(ould)g(\014rst)g(query:)p 396 1650 V 430 1650 a(k)m(erb)s(eros.fo)s(o.asdf.com.)42 b(IN)30 b(TXT)390 1796 y(Finding)g(no)g(matc)m(h,)i(it)f(w)m(ould)f (then)g(query:)p 396 1942 V 430 1942 a(k)m(erb)s(eros.asdf.com.)41 b(IN)31 b(TXT)390 2088 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(realm)g(for)h(host,)f(or)h(NULL)f(if)g(not)h(found.) 150 2299 y Fl(shishi)p 459 2299 37 5 v 55 w(realm)p 816 2299 V 55 w(for)p 1019 2299 V 55 w(serv)m(er)3350 2507 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(shishi_realm_for_serve)q (r)g Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(c)m(har)f(*)g Fe(server)p Ff(\))390 2617 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(create)j(b)m(y)f Fq(shishi_init\(\))p Fw(.)390 2763 y Fi(serv)m(er)7 b Fw(:)41 b(hostname)30 b(to)h(\014nd)e(realm)i(for.)390 2909 y(Find)i(realm)i(for)f(a)g(host,) h(using)f(v)-5 b(arious)33 b(metho)s(ds.)51 b(Curren)m(tly)33 b(this)h(includes)g(static)h(con\014g-)390 3018 y(uration)28 b(\014les)f(\(see)i Fq(shishi_realm_for_server_f)o(ile)o(\(\))p Fw(\))22 b(and)27 b(DNS)h(\(see)h Fq(shishi_realm_)390 3128 y(for_server_dns\(\))p Fw(\).)390 3274 y Fk(Return)h(v)-5 b(alue:)41 b Fw(Returns)30 b(realm)g(for)h(host,)f(or)h(NULL)f(if)g (not)h(found.)150 3485 y Fl(shishi)p 459 3485 V 55 w(principal)p 985 3485 V 55 w(default)p 1411 3485 V 54 w(guess)3350 3693 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e (shishi_principal_defau)q(lt_)q(gue)q(ss)g Ff(\()30 b Fe(void)p Ff(\))390 3803 y Fw(Guesses)72 b(the)h(principal)f(name)g (for)g(the)g(user,)83 b(lo)s(oking)73 b(at)f(en)m(vironmen)m(t)h(v)-5 b(ariables)390 3912 y(SHISHI)p 700 3912 28 4 v 39 w(USER,)30 b(USER)g(and)g(LOGNAME,)h(or)f(if)g(that)h(fails,)g(returns)f(the)g (string)g Fq(")p Fw(user)p Fq(")p Fw(.)390 4058 y Fk(Return)35 b(v)-5 b(alue:)50 b Fw(Returns)35 b(guessed)g(default)g(principal)g (for)g(user)f(as)h(a)h(string)f(that)h(has)f(to)h(b)s(e)390 4168 y(deallo)s(cated)c(b)m(y)f(the)f(caller)i(with)e Fq(free\(\))p Fw(.)150 4379 y Fl(shishi)p 459 4379 37 5 v 55 w(principal)p 985 4379 V 55 w(default)3350 4587 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_principal_defau)q(lt)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4696 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 4842 y(The)f(default)g(principal)g(name)g(is)h(the)f(name)g (in)g(the)h(en)m(vironmen)m(t)g(v)-5 b(ariable)30 b(USER,)f(or)g(LOG-) 390 4952 y(NAME)41 b(for)f(some)h(systems,)j(but)c(it)h(can)g(b)s(e)f (o)m(v)m(erridden)h(b)m(y)f(sp)s(ecifying)h(the)f(en)m(vironmen)m(t)390 5062 y(v)-5 b(ariable)31 b(SHISHI)p 1041 5062 28 4 v 39 w(USER.)390 5208 y Fk(Return)j(v)-5 b(alue:)48 b Fw(Returns)33 b(the)h(default)g(principal)f(name)h(used)g(b)m(y)f(the)h(library)-8 b(.)52 b(\(Not)35 b(a)f(cop)m(y)390 5317 y(of)d(it,)g(so)f(don't)h(mo)s (dify)e(or)i(deallo)s(cate)h(it.\))p eop end %%Page: 204 210 TeXDict begin 204 209 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(204)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(principal)p 985 299 V 55 w(default)p 1411 299 V 54 w(set)3350 498 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_principal_default)q(_se)q(t)d Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 607 y Fe(principal)p Ff(\))390 717 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 854 y Fi(principal)t Fw(:)40 b(string)30 b(with)g(new)g (default)h(principal)f(name,)h(or)f(NULL)g(to)h(reset)g(to)g(default.) 390 991 y(Set)f(the)g(default)g(principal)g(used)f(b)m(y)h(the)g (library)-8 b(.)40 b(The)30 b(string)f(is)h(copied)h(in)m(to)f(the)g (library)-8 b(,)31 b(so)390 1100 y(y)m(ou)g(can)f(disp)s(ose)g(of)h (the)f(v)-5 b(ariable)31 b(immediately)h(after)f(calling)h(this)e (function.)150 1302 y Fl(shishi)p 459 1302 V 55 w(parse)p 796 1302 V 55 w(name)3350 1501 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_parse_name)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(name)p Fi(,)h(c)m(har)e(**)565 1610 y Fe(principal)p Fi(,)j(c)m(har)e(**)g Fe(realm)p Ff(\))390 1720 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 1857 y Fi(name)5 b Fw(:)41 b(input)29 b(principal)h(name)h (string,)f(e.g.)42 b(imap/mail.gn)m(u.org)p Fq(\\GNU)p Fw(.OR)m(G.)390 1993 y Fi(principal)t Fw(:)e(newly)30 b(allo)s(cated)i(output)e(string)h(with)f(principal)g(name.)390 2130 y Fi(realm)p Fw(:)41 b(newly)30 b(allo)s(cated)j(output)d(string)g (with)g(realm)h(name.)390 2267 y(Split)57 b(principal)f(name)h(\(e.g.,) 66 b Fq(")p Fw(simon)p Fq(\\JOSEFSSON)p Fw(.OR)m(G)p Fq(")p Fw(\))54 b(in)m(to)k(t)m(w)m(o)g(newly)f(allo)s(cated)390 2376 y(strings,)30 b(the)f Fq(principal)e Fw(\()p Fq(")p Fw(simon)p Fq(")p Fw(\),)i(and)g(the)h Fq(realm)d Fw(\()p Fq(")p Fw(JOSEFSSON.OR)m(G)p Fq(")p Fw(\).)40 b(If)28 b(there)i(is)390 2486 y(no)g(realm)h(part)f(in)g Fq(name)p Fw(,)g Fq(realm)f Fw(is)h(set)h(to)g(NULL.)390 2623 y Fk(Return)k(v)-5 b(alue:)50 b Fw(Returns)33 b(SHISHI)p 1651 2623 28 4 v 40 w(INV)-10 b(ALID)p 2077 2623 V 40 w(PRINCIP)i(AL)p 2625 2623 V 39 w(NAME)36 b(if)f Fq(name)e Fw(is)i(NULL)g(or)390 2732 y(ends)30 b(with)g(the)g(escap)s(e)h(c)m (haracter)h Fq("\\")p Fw(,)e(and)g(SHISHI)p 2330 2732 V 39 w(OK)f(if)i(successful.)150 2934 y Fl(shishi)p 459 2934 37 5 v 55 w(principal)p 985 2934 V 55 w(name)3350 3133 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_principal_name)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2497 3133 28 4 v 39 w(asn1)d Fe(namenode)p Fi(,)565 3242 y(const)h(c)m(har)g(*)f Fe(namefield)p Fi(,)k(c)m(har)d(**)g Fe(out)p Fi(,)g(size)p 2285 3242 V 41 w(t)g(*)g Fe(outlen)p Ff(\))390 3352 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f (created)j(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 3489 y Fi(nameno)s(de)5 b Fw(:)40 b(ASN.1)31 b(structure)f(with)g(principal) g(in)g Fq(namefield)p Fw(.)390 3625 y Fi(name\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(namenode)e Fw(con)m(taining)k(principal)e(name.)390 3762 y Fi(out)r Fw(:)55 b(p)s(oin)m(ter)37 b(to)h(newly)f(allo)s(cated,)k(n)m(ull)c (terminated,)j(string)d(con)m(taining)i(principal)e(name.)390 3872 y(Ma)m(y)32 b(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)h Fq(outlen)p Fw(\).)390 4008 y Fi(outlen)p Fw(:)40 b(p)s(oin)m(ter)29 b(to)h(length)f(of)g Fq(out)f Fw(on)h(output,)g(excluding)g (terminating)h(n)m(ull.)40 b(Ma)m(y)30 b(b)s(e)e Fq(NULL)390 4118 y Fw(\(to)j(only)g(p)s(opulate)f Fq(out)p Fw(\).)390 4255 y(Represen)m(t)36 b(principal)g(name)g(in)f(ASN.1)i(structure)e (as)h(n)m(ull-terminated)h(string.)58 b(The)35 b(string)390 4364 y(is)30 b(allo)s(cated)i(b)m(y)e(this)g(function,)g(and)g(it)g(is) h(the)f(resp)s(onsibilit)m(y)g(of)g(the)g(caller)i(to)f(deallo)s(cate)h (it.)390 4474 y(Note)g(that)f(the)f(output)g(length)h Fq(outlen)e Fw(do)s(es)h(not)g(include)g(the)h(terminating)g(n)m(ull.) 390 4611 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4611 V 39 w(OK)f(if)i(successful.)150 4812 y Fl(shishi)p 459 4812 37 5 v 55 w(principal)p 985 4812 V 55 w(name)p 1326 4812 V 54 w(realm)3350 5011 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_principal_name)q(_rea)q (lm)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2811 5011 28 4 v 38 w(asn1)565 5121 y Fe(namenode)p Fi(,)g(const)e(c)m (har)g(*)f Fe(namefield)p Fi(,)k(Shishi)p 2324 5121 V 39 w(asn1)c Fe(realmnode)p Fi(,)k(const)c(c)m(har)h(*)565 5230 y Fe(realmfield)p Fi(,)j(c)m(har)c(**)i Fe(out)p Fi(,)f(size)p 1824 5230 V 41 w(t)g(*)f Fe(outlen)p Ff(\))390 5340 y Fi(handle)5 b Fw(:)40 b(Shishi)30 b(library)g(handle)f(created)j (b)m(y)e Fq(shishi_init\(\))p Fw(.)p eop end %%Page: 205 211 TeXDict begin 205 210 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(205)390 299 y Fi(nameno)s(de)5 b Fw(:)40 b(ASN.1)31 b(structure)f(with)g(principal)g(name)h(in)f Fq(namefield)p Fw(.)390 433 y Fi(name\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(namenode)e Fw(con)m(taining)k (principal)e(name.)390 567 y Fi(realmno)s(de)5 b Fw(:)41 b(ASN.1)30 b(structure)g(with)g(principal)h(realm)f(in)g Fq(realmfield)p Fw(.)390 701 y Fi(realm\014eld)t Fw(:)40 b(name)31 b(of)f(\014eld)g(in)g Fq(realmnode)e Fw(con)m(taining)k (principal)e(realm.)390 835 y Fi(out)r Fw(:)64 b(p)s(oin)m(ter)43 b(to)f(newly)g(allo)s(cated)i(n)m(ull)e(terminated)h(string)f(con)m (taining)i(principal)e(name.)390 944 y(Ma)m(y)32 b(b)s(e)d Fq(NULL)g Fw(\(to)j(only)e(p)s(opulate)h Fq(outlen)p Fw(\).)390 1078 y Fi(outlen)p Fw(:)40 b(p)s(oin)m(ter)29 b(to)h(length)f(of)g Fq(out)f Fw(on)h(output,)g(excluding)g (terminating)h(n)m(ull.)40 b(Ma)m(y)30 b(b)s(e)e Fq(NULL)390 1188 y Fw(\(to)j(only)g(p)s(opulate)f Fq(out)p Fw(\).)390 1322 y(Represen)m(t)40 b(principal)f(name)h(and)f(realm)h(in)f(ASN.1)h (structure)f(as)h(n)m(ull-terminated)h(string.)390 1431 y(The)32 b(string)g(is)g(allo)s(cated)i(b)m(y)e(this)g(function.)46 b(It)32 b(is)h(the)f(resp)s(onsibilit)m(y)g(of)g(the)h(caller)g(to)g (deal-)390 1541 y(lo)s(cate)h(it.)45 b(Note)34 b(that)e(the)g(output)g (length)g Fq(outlen)e Fw(do)s(es)i(not)g(include)f(the)h(terminating)h (n)m(ull)390 1650 y(c)m(haracter.)390 1784 y Fk(Return)d(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 1784 28 4 v 39 w(OK)f(if)i(successful.)150 1982 y Fl(shishi)p 459 1982 37 5 v 55 w(principal)p 985 1982 V 55 w(name)p 1326 1982 V 54 w(set)3350 2178 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_principal_name)q(_set)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 2178 28 4 v 39 w(asn1)565 2288 y Fe(namenode)p Fi(,)h(const)e(c)m(har)g(*)f Fe(namefield)p Fi(,)k(Shishi)p 2324 2288 V 39 w(name)p 2575 2288 V 40 w(t)m(yp)s(e)c Fe(name_type)p Fi(,)k(const)c(c)m(har)565 2397 y(*)h Fd([])f Fe(name)p Ff(\))390 2507 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2641 y Fi(nameno)s(de)5 b Fw(:)40 b(ASN.1)31 b(structure)f(with)g(principal)g(in)g Fq(namefield)p Fw(.)390 2775 y Fi(name\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(namenode)e Fw(con)m(taining)k (principal)e(name.)390 2909 y Fi(name)p 608 2909 V 40 w(t)m(yp)s(e)5 b Fw(:)36 b(t)m(yp)s(e)21 b(of)f(principal,)i(see)f (Shishi)p 1948 2909 V 39 w(name)p 2199 2909 V 40 w(t)m(yp)s(e,)i (usually)d(SHISHI)p 3066 2909 V 39 w(NT)p 3239 2909 V 40 w(UNKNO)m(WN.)390 3043 y Fi(name)5 b Fw(:)41 b(n)m(ull-terminated)31 b(input)e(arra)m(y)i(with)f(principal)g(name.)390 3177 y(Set)h(the)f(giv)m(en)i(principal)e(name)g(\014eld)g(to)h(the)g(giv)m (en)g(name.)390 3310 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 3310 V 39 w(OK)f(if)i(successful.)150 3509 y Fl(shishi)p 459 3509 37 5 v 55 w(principal)p 985 3509 V 55 w(set)3350 3704 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_principal_set)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2444 3704 28 4 v 39 w(asn1)f Fe(namenode)p Fi(,)565 3814 y(const)g(c)m(har)g(*)f Fe(namefield)p Fi(,)k(const)d(c)m(har)f(*)h Fe(name)p Ff(\))390 3923 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4057 y Fi(nameno)s(de)5 b Fw(:)40 b(ASN.1)31 b(structure)f(with)g (principal)g(in)g Fq(namefield)p Fw(.)390 4191 y Fi(name\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(namenode)e Fw(con)m(taining)k(principal)e(name.)390 4325 y Fi(name)5 b Fw(:)41 b(n)m(ull-terminated)31 b(string)f(with)g(principal)h(name)f (in)g(RF)m(C)h(1964)h(form.)390 4459 y(Set)f(principal)f(name)g (\014eld)g(in)g(an)g(ASN.1)h(structure)f(to)h(the)g(giv)m(en)g(name.) 390 4593 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 4593 V 39 w(OK)f(if)i(successful.)150 4791 y Fl(shishi)p 459 4791 37 5 v 55 w(deriv)m(e)p 840 4791 V 54 w(default)p 1265 4791 V 54 w(salt)3350 4987 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_derive_default)q(_sal) q(t)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g (*)565 5096 y Fe(name)p Fi(,)h(c)m(har)f(**)g Fe(salt)p Ff(\))390 5206 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(name)5 b Fw(:)41 b(principal)30 b(name)g(of)h(user.)p eop end %%Page: 206 212 TeXDict begin 206 211 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(206)390 299 y Fi(salt)r Fw(:)42 b(output)30 b(v)-5 b(ariable)31 b(with)f(newly)g(allo)s(cated)i (salt)f(string.)390 430 y(Deriv)m(e)i(the)e(default)g(salt)h(from)e(a)i (principal.)42 b(The)31 b(default)g(salt)h(is)f(the)g(concatenation)j (of)d(the)390 539 y(deco)s(ded)f(realm)h(and)f(the)g(principal.)390 670 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(SHISHI)p 1598 670 28 4 v 39 w(OK)f(if)i(successful.)150 862 y Fl(shishi)p 459 862 37 5 v 55 w(serv)m(er)p 836 862 V 54 w(for)p 1038 862 V 55 w(lo)s(cal)p 1340 862 V 55 w(service)3350 1052 y Fw([F)-8 b(unction])-3599 b Fg(char)54 b(*)e (shishi_server_for_loca)q(l_s)q(erv)q(ice)g Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)565 1161 y(c)m(har)e(*)g Fe(service)p Ff(\))390 1271 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1402 y Fi(service)5 b Fw(:)42 b(n)m(ull)30 b(terminated)h (string)f(with)g(name)h(of)f(service,)i(e.g.,)g Fq(")p Fw(host)p Fq(")p Fw(.)390 1533 y(Construct)21 b(a)i(service)f (principal)g(\(e.g.,)j Fq(")p Fw(imap/yxa.extuno.com)p Fq(")p Fw(\))f(based)e(on)g(supplied)e(service)390 1642 y(name)44 b(\(i.e.,)50 b Fq(")p Fw(imap)p Fq(")p Fw(\))43 b(and)h(the)g(system's)h(hostname)f(as)h(returned)e(b)m(y)h Fq(hostname\(\))d Fw(\(i.e.,)390 1752 y Fq(")p Fw(yxa.extundo.com)p Fq(")p Fw(\).)h(The)30 b(string)g(m)m(ust)g(b)s(e)g(deallo)s(cated)i(b) m(y)e(the)h(caller.)390 1883 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(newly)g(allo)s(cated)i(service)f(name)g(string.)150 2075 y Fl(shishi)p 459 2075 V 55 w(authorize)p 1014 2075 V 54 w(strcmp)3350 2264 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authorize_strc)q(mp)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 2374 y Fe(principal)p Fi(,)i(const)e(c)m(har)g(*)g Fe(authzname)p Ff(\))390 2483 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(allo)s (cated)i(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 2614 y Fi(principal)t Fw(:)40 b(string)30 b(with)g(desired)g(principal)g (name.)390 2745 y Fi(authzname)5 b Fw(:)41 b(authorization)32 b(name.)390 2876 y(Authorization)e(of)f Fq(authzname)d Fw(against)j(desired)g Fq(principal)d Fw(according)j(to)h Fq(")p Fw(basic)p Fq(")e Fw(authen-)390 2986 y(tication,)33 b(i.e.,)e(testing)h(for)e(iden)m(tical)i(strings.)390 3116 y Fk(Return)39 b(v)-5 b(alue:)60 b Fw(Returns)39 b(1)h(if)f Fq(authzname)e Fw(is)j(authorized)g(for)g(services)g(b)m(y)f (the)h(encrypted)390 3226 y(principal,)30 b(and)g(0)h(otherwise.)150 3418 y Fl(shishi)p 459 3418 V 55 w(authorize)p 1014 3418 V 54 w(k5login)3350 3608 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authorize_k5lo)q(gin)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(const)d(c)m(har)h(*)565 3717 y Fe(principal)p Fi(,)i(const)e(c)m(har)g(*)g Fe(authzname)p Ff(\))390 3827 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(allo)s (cated)i(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 3958 y Fi(principal)t Fw(:)40 b(string)30 b(with)g(desired)g(principal)g(name) h(and)e(realm.)390 4089 y Fi(authzname)5 b Fw(:)41 b(authorization)32 b(name.)390 4219 y(Authorization)57 b(of)e Fq(authzname)e Fw(against)k(desired)e Fq(principal)e Fw(in)i(accordance)j(with)d(the) 390 4329 y(MIT/Heimdal)31 b(authorization)h(metho)s(d.)390 4460 y Fk(Return)h(v)-5 b(alue:)47 b Fw(Returns)32 b(1)h(if)h Fq(authzname)c Fw(is)j(authorized)h(for)f(services)h(b)m(y)f Fq(principal)p Fw(,)f(and)390 4569 y(returns)d(0)i(otherwise.)150 4761 y Fl(shishi)p 459 4761 V 55 w(authorization)p 1229 4761 V 54 w(parse)3350 4951 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authorization_)q(pars)q(e)f Ff(\()p Fi(const)31 b(c)m(har)g(*)f Fe(authorization)p Ff(\))390 5061 y Fi(authorization)p Fw(:)42 b(name)31 b(of)f(authorization)i(t)m (yp)s(e,)f Fq(")p Fw(basic)p Fq(")f Fw(or)g Fq(")p Fw(k5login)p Fq(")p Fw(.)390 5191 y(P)m(arse)h(authorization)h(t)m(yp)s(e)e(name.) 390 5322 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(authorization)h(t)m(yp)s(e)g(corresp)s(onding)e(to)i(a)g(string.)p eop end %%Page: 207 213 TeXDict begin 207 212 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(207)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(authorized)p 1082 299 V 54 w(p)3350 482 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_authorized_p)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2392 482 28 4 v 39 w(tkt)f(*)g Fe(tkt)p Fi(,)g(const)565 592 y(c)m(har)g(*)g Fe(authzname)p Ff(\))390 702 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(allo)s(cated)i(b)m(y)e Fq(shishi_init\(\))p Fw(.)390 829 y Fi(tkt)r Fw(:)41 b(input)30 b(v)-5 b(ariable)31 b(with)f(tic)m(k)m(et)j(info.)390 957 y Fi(authzname)5 b Fw(:)41 b(authorization)32 b(name.)390 1085 y(Simplistic)43 b(authorization)h(of)e Fq(authzname)e Fw(against)k(encrypted)e(clien)m(t)h(principal)g(name)f(in-)390 1195 y(side)34 b(tic)m(k)m(et.)53 b(F)-8 b(or)34 b Fq(")p Fw(basic)p Fq(")g Fw(authen)m(tication)i(t)m(yp)s(e,)f(the)f(principal) f(name)h(m)m(ust)f(coincide)i(with)390 1304 y Fq(authzname)p Fw(.)47 b(The)33 b Fq(")p Fw(k5login)p Fq(")h Fw(authen)m(tication)h(t) m(yp)s(e)f(attempts)g(the)f(MIT/Heimdal)h(metho)s(d)390 1414 y(of)d(parsing)e(the)i(\014le)g Fq("~)p Fw(/.k5login)p Fq(")g Fw(for)f(additional)h(equiv)-5 b(alence)32 b(names.)390 1542 y Fk(Return)39 b(v)-5 b(alue:)60 b Fw(Returns)39 b(1)h(if)f Fq(authzname)e Fw(is)j(authorized)g(for)g(services)g(b)m(y)f (the)h(encrypted)390 1651 y(principal,)30 b(and)g(0)h(otherwise.)150 1837 y Fl(shishi)p 459 1837 37 5 v 55 w(generalize)p 1044 1837 V 54 w(time)3350 2021 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_generalize_time)f Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(time)p 2957 2021 28 4 v 41 w(t)d Fe(t)p Ff(\))390 2131 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2258 y Fi(t)r Fw(:)41 b(C)30 b(time)h(to)g(con)m(v)m(ert.)390 2386 y(Con)m(v)m(ert)g(C)f(time)h(to)g (Kerb)s(erosTime.)40 b(The)30 b(string)g(m)m(ust)h(not)f(b)s(e)g (deallo)s(cate)j(b)m(y)d(caller.)390 2514 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(a)g(Kerb)s(erosTime)g(time)h(string)f (corresp)s(onding)g(to)h(C)f(time)h(t.)150 2700 y Fl(shishi)p 459 2700 37 5 v 55 w(generalize)p 1044 2700 V 54 w(no)m(w)3350 2884 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_generalize_now)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 2993 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3121 y(Con)m(v)m(ert)h(curren)m(t)f(time)h(to)h(Kerb)s(erosTime.)39 b(The)30 b(string)h(m)m(ust)f(not)g(b)s(e)g(deallo)s(cate)j(b)m(y)d (caller.)390 3249 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Return)30 b(a)g(Kerb)s(erosTime)g(time)h(string)f(corresp)s(onding)g(to)h(curren) m(t)f(time.)150 3435 y Fl(shishi)p 459 3435 V 55 w(generalize)p 1044 3435 V 54 w(ctime)3350 3619 y Fw([F)-8 b(unction])-3599 b Fg(time_t)54 b(shishi_generalize_ctim)q(e)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(t)p Ff(\))390 3728 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3856 y Fi(t)r Fw(:)41 b(Kerb)s(erosTime)29 b(to)j(con)m(v)m (ert.)390 3984 y(Con)m(v)m(ert)f(Kerb)s(erosTime)f(to)h(C)f(time.)390 4112 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(C)g(time)h (corresp)s(onding)e(to)i(Kerb)s(erosTime)f(t.)150 4298 y Fl(shishi)p 459 4298 V 55 w(time)3350 4481 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_time)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 1974 4481 28 4 v 39 w(asn1)d Fe(node)p Fi(,)i(const)f(c)m(har)g(*)565 4591 y Fe(field)p Fi(,)h(c)m(har)f(**)g Fe(t)p Ff(\))390 4701 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4828 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(no)s(de)f(to)h(get)g(time)g(from.)390 4956 y Fi(\014eld)t Fw(:)40 b(Name)31 b(of)g(\014eld)f(in)g(ASN.1)g(no) s(de)g(to)h(get)h(time)f(from.)390 5084 y Fi(t)r Fw(:)41 b(newly)30 b(allo)s(cated)i(output)e(arra)m(y)h(with)f(zero)i (terminated)e(time)i(string.)390 5212 y(Extract)f(time)g(from)f(ASN.1)h (structure.)390 5340 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 5340 V 39 w(OK)f(i\013)i(successful.)p eop end %%Page: 208 214 TeXDict begin 208 213 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(208)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(ctime)3350 502 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_ctime)c Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2026 502 28 4 v 39 w(asn1)e Fe(node)p Fi(,)i(const)f(c)m(har)g(*)565 611 y Fe(field)p Fi(,)h(time)p 1064 611 V 41 w(t)f(*)f Fe(t)p Ff(\))390 721 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 862 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(v)-5 b(ariable)31 b(to)g(read)g(\014eld)f(from.) 390 1002 y Fi(\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(node)f Fw(to)i(read.)390 1143 y Fi(t)r Fw(:)41 b(p)s(oin)m(ter)30 b(to)h(time)h(\014eld)e(to)h(set.)390 1284 y(Extract)g(time)g(from)f (ASN.1)h(structure.)390 1424 y Fk(Return)37 b(v)-5 b(alue:)53 b Fw(Returns)36 b(SHISHI)p 1659 1424 V 39 w(OK)g(if)h(successful,)h (SHISHI)p 2716 1424 V 39 w(ASN1)p 2987 1424 V 41 w(NO)p 3167 1424 V 40 w(ELEMENT)e(if)390 1534 y(the)41 b(elemen)m(t)i(do)e (not)h(exist,)j(SHISHI)p 1778 1534 V 39 w(ASN1)p 2049 1534 V 40 w(NO)p 2228 1534 V 40 w(V)-10 b(ALUE)41 b(if)g(the)h(\014eld) e(has)h(no)h(v)-5 b(alue,)44 b(ot)390 1643 y(SHISHI)p 700 1643 V 39 w(ASN1)p 971 1643 V 40 w(ERR)m(OR)30 b(otherwise.)150 1849 y Fl(shishi)p 459 1849 37 5 v 55 w(prompt)p 911 1849 V 55 w(passw)m(ord)p 1455 1849 V 55 w(callbac)m(k)p 1938 1849 V 52 w(set)3350 2052 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_prompt_password_c)q(all)q(bac)q(k_s)q(et)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 2161 y(shishi)p 795 2161 28 4 v 39 w(prompt)p 1128 2161 V 40 w(passw)m(ord)p 1531 2161 V 39 w(func)e Fe(cb)p Ff(\))390 2271 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2412 y Fi(cb)r Fw(:)43 b(function)31 b(p)s(oin)m(ter)h(to)g(application)h(passw)m(ord) e(callbac)m(k,)j(a)e Fq(shishi_prompt_password_)390 2521 y(func)d Fw(t)m(yp)s(e.)390 2662 y(Set)c(a)g(callbac)m(k)i(function)d (that)h(will)g(b)s(e)f(used)g(b)m(y)g Fq(shishi_prompt_password\(\))18 b Fw(to)26 b(query)e(the)390 2772 y(user)37 b(for)g(a)h(passw)m(ord.)61 b(The)37 b(function)g(p)s(oin)m(ter)h(can)g(b)s(e)e(retriev)m(ed)j (using)e Fq(shishi_prompt_)390 2881 y(password_callback_get\(\))p Fw(.)390 3022 y(The)30 b Fq(cb)g Fw(function)g(should)f(follo)m(w)j (the)e Fq(shishi_prompt_password_fu)o(nc)24 b Fw(protot)m(yp)s(e:)390 3162 y(in)m(t)31 b(prompt)p 829 3162 V 39 w(passw)m(ord)f(\(Shishi)f(*) i Fq(handle)p Fw(,)e(c)m(har)i(**)p Fq(s)p Fw(,)g(const)g(c)m(har)g(*)p Fq(format)p Fw(,)e(v)-5 b(a)p 3289 3162 V 40 w(list)31 b Fq(ap)p Fw(\);)390 3303 y(If)f(the)g(function)g(returns)f(0,)i(the)g Fq(s)f Fw(v)-5 b(ariable)31 b(should)e(con)m(tain)j(a)f(newly)f(allo)s (cated)i(string)e(with)390 3413 y(the)h(passw)m(ord)e(read)i(from)e (the)i(user.)150 3618 y Fl(shishi)p 459 3618 37 5 v 55 w(prompt)p 911 3618 V 55 w(passw)m(ord)p 1455 3618 V 55 w(callbac)m(k)p 1938 3618 V 52 w(get)3350 3821 y Fw([F)-8 b(unction])-3599 b Fg(shishi_prompt_password)q(_fu)q(nc)565 3931 y(shishi_prompt_password)q(_ca)q(llb)q(ack)q(_get)52 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 4040 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4181 y(Get)40 b(the)f(application)i (passw)m(ord)d(prompt)h(function)f(callbac)m(k)k(as)d(set)h(b)m(y)f Fq(shishi_prompt_)390 4290 y(password_callback_set\(\))p Fw(.)390 4431 y Fk(Returns:)h Fw(Returns)30 b(the)g(callbac)m(k,)j(a)e Fq(shishi_prompt_password_f)o(unc)24 b Fw(t)m(yp)s(e,)31 b(or)f Fq(NULL)p Fw(.)150 4637 y Fl(shishi)p 459 4637 V 55 w(prompt)p 911 4637 V 55 w(passw)m(ord)3350 4839 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_prompt_passwor)q(d)e Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(c)m(har)f(**)g Fe(s)p Fi(,)g(const)g(c)m(har)565 4949 y(*)g Fe(format)p Fi(,)h Fe(...)p Ff(\))390 5059 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5199 y Fi(s)t Fw(:)40 b(p)s(oin)m(ter)31 b(to)g(newly)f(allo)s (cated)i(output)e(string)h(with)f(read)g(passw)m(ord.)390 5340 y Fi(format)r Fw(:)41 b(prin)m(tf\(3\))31 b(st)m(yle)h(format)e (string.)41 b(...:)g(prin)m(tf\(3\))31 b(st)m(yle)h(argumen)m(ts.)p eop end %%Page: 209 215 TeXDict begin 209 214 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(209)390 299 y(F)-8 b(ormat)33 b(and)f(prin)m(t)f(a)i(prompt,)f(and)f(read)h(a)g(passw)m (ord)g(from)f(user.)45 b(The)32 b(passw)m(ord)f(is)h(p)s(ossi-)390 408 y(bly)f(con)m(v)m(erted)h(\(e.g.,)i(con)m(v)m(erted)e(from)f (Latin-1)h(to)g(UTF-8,)g(or)f(pro)s(cessed)g(using)f(Stringprep)390 518 y(pro\014le\))g(follo)m(wing)i(an)m(y)f Fq(")p Fw(stringpro)s(cess) p Fq(")e Fw(k)m(eyw)m(ords)i(in)f(con\014guration)h(\014les.)390 654 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISHI)p 1634 654 28 4 v 39 w(OK)f(i\013)i(successful.)150 854 y Fl(shishi)p 459 854 37 5 v 55 w(resolv)3350 1052 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_dns)55 b(shishi_resolv)50 b Ff(\()p Fi(const)31 b(c)m(har)g(*)f Fe(zone)p Fi(,)i(uin)m(t16)p 2519 1052 28 4 v 41 w(t)f Fe(querytype)p Ff(\))390 1162 y Fi(zone)5 b Fw(:)42 b(o)m(wner)30 b(name)g(of)h(data,)g(e.g.)42 b Fq(")p Fw(EXAMPLE.OR)m(G)p Fq(")390 1298 y Fi(queryt)m(yp)s(e)5 b Fw(:)40 b(t)m(yp)s(e)31 b(of)g(data)g(to)g(query)f(for,)g(e.g.,)i (SHISHI)p 2403 1298 V 39 w(DNS)p 2630 1298 V 40 w(TXT.)390 1433 y(Query)24 b(DNS)g(resolv)m(er)i(for)e(data)h(of)g(t)m(yp)s(e)g Fq(querytype)d Fw(at)j(o)m(wner)g(name)f Fq(zone)p Fw(.)38 b(Curren)m(tly)24 b(TXT)390 1543 y(and)30 b(SR)-10 b(V)30 b(t)m(yp)s(es)g(are)h(supp)s(orted.)390 1679 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(link)m(ed)g(list)h(of)g(DNS)f(records,)h (or)f(NULL)g(if)h(query)e(failed.)150 1879 y Fl(shishi)p 459 1879 37 5 v 55 w(resolv)p 828 1879 V 55 w(free)3350 2077 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_resolv_free)c Ff(\()p Fi(Shishi)p 1678 2077 28 4 v 40 w(dns)29 b Fe(rrs)p Ff(\))390 2187 y Fi(rrs)t Fw(:)39 b(list)31 b(of)g(DNS)f(RR)h(as)f (returned)f(b)m(y)i Fq(shishi_resolv\(\))p Fw(.)390 2322 y(Deallo)s(cate)j(list)d(of)f(DNS)h(RR)f(as)g(returned)g(b)m(y)g Fq(shishi_resolv\(\))p Fw(.)150 2557 y Fv(5.16)68 b(ASN.1)45 b(F)-11 b(unctions)150 2781 y Fl(shishi)p 459 2781 37 5 v 55 w(asn1)p 751 2781 V 55 w(read)p 1040 2781 V 54 w(inline)3350 2979 y Fw([F)j(unction])-3599 b Fg(int)53 b(shishi_asn1_read_inli)q(ne)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2601 2979 28 4 v 39 w(asn1)f Fe(node)p Fi(,)565 3089 y(const)g(c)m(har)g(*)f Fe(field)p Fi(,)j(c)m(har)d(*)h Fe(data)p Fi(,)h(size)p 2083 3089 V 41 w(t)e(*)h Fe(datalen)p Ff(\))390 3198 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3334 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(v)-5 b(ariable)31 b(to)g(read)g(\014eld)f(from.)390 3470 y Fi(\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(node)f Fw(to)i(read.)390 3605 y Fi(data)p Fw(:)41 b(pre-allo)s(cated)33 b(output)d(bu\013er)f(that)i(will)g(hold)f(ASN.1) h(\014eld)e(data.)390 3741 y Fi(datalen)p Fw(:)49 b(on)35 b(input,)f(maxim)m(um)g(size)i(of)e(output)g(bu\013er,)h(on)f(output,)h (actual)h(size)f(of)f(output)390 3851 y(bu\013er.)390 3986 y(Extract)d(data)g(stored)g(in)f(a)h(ASN.1)g(\014eld)f(in)m(to)h (a)g(\014xed)e(size)j(bu\013er)d(allo)s(cated)j(b)m(y)f(caller.)390 4122 y(Note)e(that)f(since)g(it)g(is)f(di\016cult)h(to)g(predict)f(the) h(length)g(of)f(the)h(\014eld,)g(it)g(is)g(often)f(b)s(etter)h(to)g (use)390 4232 y Fq(shishi_asn1_read\(\))d Fw(instead.)390 4367 y Fk(Return)37 b(v)-5 b(alue:)53 b Fw(Returns)36 b(SHISHI)p 1659 4367 V 39 w(OK)g(if)h(successful,)h(SHISHI)p 2716 4367 V 39 w(ASN1)p 2987 4367 V 41 w(NO)p 3167 4367 V 40 w(ELEMENT)e(if)390 4477 y(the)41 b(elemen)m(t)i(do)e(not)h(exist,) j(SHISHI)p 1778 4477 V 39 w(ASN1)p 2049 4477 V 40 w(NO)p 2228 4477 V 40 w(V)-10 b(ALUE)41 b(if)g(the)h(\014eld)e(has)h(no)h(v)-5 b(alue,)44 b(ot)390 4587 y(SHISHI)p 700 4587 V 39 w(ASN1)p 971 4587 V 40 w(ERR)m(OR)30 b(otherwise.)150 4787 y Fl(shishi)p 459 4787 37 5 v 55 w(asn1)p 751 4787 V 55 w(read)3350 4985 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_asn1_read)e Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2235 4985 28 4 v 39 w(asn1)f Fe(node)p Fi(,)g(const)g(c)m(har)565 5095 y(*)g Fe(field)p Fi(,)h(c)m(har)f(**)g Fe(data)p Fi(,)h(size)p 1691 5095 V 41 w(t)e(*)h Fe(datalen)p Ff(\))390 5204 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5340 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(v)-5 b(ariable)31 b(to)g(read)g(\014eld)f(from.) p eop end %%Page: 210 216 TeXDict begin 210 215 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(210)390 299 y Fi(\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(node)f Fw(to)i(read.)390 430 y Fi(data)p Fw(:)41 b(newly)31 b(allo)s(cated)h(output)e(bu\013er)f (that)i(will)g(hold)f(ASN.1)h(\014eld)f(data.)390 560 y Fi(datalen)p Fw(:)42 b(actual)31 b(size)h(of)e(output)g(bu\013er.)390 691 y(Extract)37 b(data)g(stored)f(in)f(a)i(ASN.1)f(\014eld)g(in)m(to)h (a)f(newly)g(allo)s(cated)i(bu\013er.)56 b(The)36 b(bu\013er)f(will)390 801 y(alw)m(a)m(ys)d(b)s(e)e(zero)h(terminated,)g(ev)m(en)g(though)f Fq(datalen)f Fw(will)h(not)h(include)f(the)h(added)e(zero.)390 932 y Fk(Return)37 b(v)-5 b(alue:)53 b Fw(Returns)36 b(SHISHI)p 1659 932 28 4 v 39 w(OK)g(if)h(successful,)h(SHISHI)p 2716 932 V 39 w(ASN1)p 2987 932 V 41 w(NO)p 3167 932 V 40 w(ELEMENT)e(if)390 1041 y(the)41 b(elemen)m(t)i(do)e(not)h(exist,) j(SHISHI)p 1778 1041 V 39 w(ASN1)p 2049 1041 V 40 w(NO)p 2228 1041 V 40 w(V)-10 b(ALUE)41 b(if)g(the)h(\014eld)e(has)h(no)h(v)-5 b(alue,)44 b(ot)390 1151 y(SHISHI)p 700 1151 V 39 w(ASN1)p 971 1151 V 40 w(ERR)m(OR)30 b(otherwise.)150 1342 y Fl(shishi)p 459 1342 37 5 v 55 w(asn1)p 751 1342 V 55 w(read)p 1040 1342 V 54 w(optional)3350 1532 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_asn1_read_opti)q(onal)f Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(Shishi)p 2706 1532 28 4 v 39 w(asn1)e Fe(node)p Fi(,)565 1641 y(const)h(c)m(har)g(*)f Fe(field)p Fi(,)j(c)m(har)d(**)i Fe(data)p Fi(,)f(size)p 2128 1641 V 41 w(t)g(*)g Fe(datalen)p Ff(\))390 1751 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 1882 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(v)-5 b(ariable)31 b(to)g(read)g(\014eld)f(from.) 390 2012 y Fi(\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(node)f Fw(to)i(read.)390 2143 y Fi(data)p Fw(:)41 b(newly)31 b(allo)s(cated)h(output)e(bu\013er)f(that)i(will)g(hold)f (ASN.1)h(\014eld)f(data.)390 2274 y Fi(datalen)p Fw(:)42 b(actual)31 b(size)h(of)e(output)g(bu\013er.)390 2405 y(Extract)35 b(data)f(stored)g(in)g(a)g(ASN.1)g(\014eld)g(in)m(to)h(a)f (newly)f(allo)s(cated)j(bu\013er.)50 b(If)34 b(the)g(\014eld)f(do)s(es) 390 2514 y(not)40 b(exist)h(\(i.e.,)j(SHISHI)p 1315 2514 V 39 w(ASN1)p 1586 2514 V 41 w(NO)p 1766 2514 V 40 w(ELEMENT\),)c(this) g(function)g(set)g(datalen)h(to)g(0)g(and)390 2624 y(succeeds.)52 b(Can)34 b(b)s(e)g(useful)f(to)i(read)f(ASN.1)h(\014elds)e(whic)m(h)h (are)h(mark)m(ed)f(OPTIONAL)f(in)h(the)390 2733 y(grammar,)d(if)f(y)m (ou)h(w)m(an)m(t)g(to)g(a)m(v)m(oid)h(sp)s(ecial)f(error)f(handling)g (in)g(y)m(our)g(co)s(de.)390 2864 y Fk(Return)35 b(v)-5 b(alue:)50 b Fw(Returns)34 b(SHISHI)p 1652 2864 V 39 w(OK)g(if)h(successful,)h(SHISHI)p 2703 2864 V 40 w(ASN1)p 2975 2864 V 40 w(NO)p 3154 2864 V 40 w(V)-10 b(ALUE)35 b(if)g(the)390 2974 y(\014eld)30 b(has)g(no)g(v)-5 b(alue,)31 b(ot)h(SHISHI)p 1557 2974 V 39 w(ASN1)p 1828 2974 V 40 w(ERR)m(OR)e(otherwise.)150 3166 y Fl(shishi)p 459 3166 37 5 v 55 w(asn1)p 751 3166 V 55 w(done)3350 3355 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_asn1_done)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2287 3355 28 4 v 39 w(asn1)f Fe(node)p Ff(\))390 3465 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3595 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(no)s(de)f(to)h(dello)s(cate.)390 3726 y(Deallo)s(cate)k (resources)d(asso)s(ciated)i(with)e(ASN.1)g(structure.)45 b(Note)34 b(that)e(the)g(no)s(de)g(m)m(ust)g(not)390 3836 y(b)s(e)e(used)f(after)i(this)f(call.)150 4027 y Fl(shishi)p 459 4027 37 5 v 55 w(asn1)p 751 4027 V 55 w(pa)p 934 4027 V 54 w(enc)p 1167 4027 V 54 w(ts)p 1317 4027 V 54 w(enc)3350 4217 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_pa_enc_ts_e)q(nc)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4326 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4457 y(Create)h(new)f(ASN.1)h (structure)f(for)g(P)-8 b(A-ENC-TS-ENC.)390 4588 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 4780 y Fl(shishi)p 459 4780 V 55 w(asn1)p 751 4780 V 55 w(encrypteddata)3350 4969 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_encryptedda)q(ta)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 5078 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5209 y(Create)h(new)f(ASN.1)h (structure)f(for)g(EncryptedData)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)p eop end %%Page: 211 217 TeXDict begin 211 216 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(211)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(asn1)p 751 299 V 55 w(padata)3350 487 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_asn1_padata)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 596 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 726 y(Create)h(new)f (ASN.1)h(structure)f(for)g(P)-8 b(A-D)m(A)g(T)g(A.)390 856 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 1046 y Fl(shishi)p 459 1046 V 55 w(asn1)p 751 1046 V 55 w(metho)s(ddata)3350 1234 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_asn1_methoddata)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 1343 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1473 y(Create)h(new)f(ASN.1)h(structure)f(for)g(METHOD-D)m(A) -8 b(T)g(A.)390 1603 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 1794 y Fl(shishi)p 459 1794 V 55 w(asn1)p 751 1794 V 55 w(et)m(yp)s(e)p 1099 1794 V 54 w(info)3350 1981 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_etype_info)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 2091 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2221 y(Create)h(new)f(ASN.1)h(structure)f (for)g(ETYPE-INF)m(O.)390 2351 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 2541 y Fl(shishi)p 459 2541 V 55 w(asn1)p 751 2541 V 55 w(et)m(yp)s(e)p 1099 2541 V 54 w(info2)3350 2729 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_etype_info2)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 2838 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2968 y(Create)h(new)f(ASN.1)h(structure)f (for)g(ETYPE-INF)m(O2.)390 3098 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 3288 y Fl(shishi)p 459 3288 V 55 w(asn1)p 751 3288 V 55 w(asreq)3350 3476 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_asreq)50 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 3585 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3715 y(Create)h(new)f(ASN.1)h (structure)f(for)g(AS-REQ.)390 3845 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 4035 y Fl(shishi)p 459 4035 V 55 w(asn1)p 751 4035 V 55 w(asrep)3350 4223 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_asrep)50 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 4333 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4463 y(Create)h(new)f(ASN.1)h(structure)f(for)g(AS-REP)-8 b(.)390 4593 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 4783 y Fl(shishi)p 459 4783 V 55 w(asn1)p 751 4783 V 55 w(tgsreq)3350 4970 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_tgsreq)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 5080 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 5210 y(Create)h(new)f(ASN.1)h (structure)f(for)g(TGS-REQ.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)p eop end %%Page: 212 218 TeXDict begin 212 217 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(212)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(asn1)p 751 299 V 55 w(tgsrep)3350 487 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_asn1_tgsrep)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 596 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 726 y(Create)h(new)f (ASN.1)h(structure)f(for)g(TGS-REP)-8 b(.)390 856 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 1046 y Fl(shishi)p 459 1046 V 55 w(asn1)p 751 1046 V 55 w(apreq)3350 1234 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_apreq)50 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 1343 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1473 y(Create)h(new)f(ASN.1)h(structure)f(for)g(AP-REQ.)390 1603 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g (structure.)150 1794 y Fl(shishi)p 459 1794 V 55 w(asn1)p 751 1794 V 55 w(aprep)3350 1981 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_aprep)50 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 2091 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2221 y(Create)h(new)f(ASN.1)h(structure)f (for)g(AP-REP)-8 b(.)390 2351 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 2541 y Fl(shishi)p 459 2541 V 55 w(asn1)p 751 2541 V 55 w(encapreppart)3350 2729 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_encapreppar)q(t)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 2838 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2968 y(Create)h(new)f(ASN.1)h(structure)f(for)g(AP-REP)-8 b(.)390 3098 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 3288 y Fl(shishi)p 459 3288 V 55 w(asn1)p 751 3288 V 55 w(tic)m(k)m(et)3350 3476 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_ticket)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 3585 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 3715 y(Create)h(new)f(ASN.1)h (structure)f(for)g(Tic)m(k)m(et.)390 3845 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 4035 y Fl(shishi)p 459 4035 V 55 w(asn1)p 751 4035 V 55 w(enctic)m(k)m (etpart)3350 4223 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_encticketpa)q(rt)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4333 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4463 y(Create)h(new)f(ASN.1)h(structure)f(for)g(EncTic)m(k)m (etP)m(art.)390 4593 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 4783 y Fl(shishi)p 459 4783 V 55 w(asn1)p 751 4783 V 55 w(authen)m(ticator)3350 4970 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_authenticat)q(or)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 5080 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5210 y(Create)h(new)f(ASN.1)h(structure)f(for)g(Authen)m (ticator.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)p eop end %%Page: 213 219 TeXDict begin 213 218 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(213)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(asn1)p 751 299 V 55 w(enc)m(kdcreppart)3350 521 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_asn1_enckdcreppa)q(rt)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 631 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 791 y(Create)h(new)f(ASN.1)h(structure)f(for)g(EncKDCRepP)m (art.)390 952 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 1177 y Fl(shishi)p 459 1177 V 55 w(asn1)p 751 1177 V 55 w(encasreppart)3350 1399 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_asn1_encasreppar)q(t)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 1509 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1669 y(Create)h(new)f(ASN.1)h(structure)f(for)g(EncASRepP)m (art.)390 1829 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 2054 y Fl(shishi)p 459 2054 V 55 w(asn1)p 751 2054 V 55 w(krb)s(error)3350 2277 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_krberror)51 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 2386 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 2547 y(Create)h(new)f(ASN.1)h (structure)f(for)g(KRB-ERR)m(OR.)390 2707 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)150 2932 y Fl(shishi)p 459 2932 V 55 w(asn1)p 751 2932 V 55 w(krbsafe)3350 3154 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_krbsafe)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 3264 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3424 y(Create)h(new)f(ASN.1)h(structure)f(for)g(KRB-SAFE.)390 3585 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g (structure.)150 3810 y Fl(shishi)p 459 3810 V 55 w(asn1)p 751 3810 V 55 w(priv)3350 4032 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_priv)50 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 4142 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4302 y(Create)h(new)f(ASN.1)h(structure)f(for)g(KRB-PRIV.)390 4462 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g (structure.)150 4687 y Fl(shishi)p 459 4687 V 55 w(asn1)p 751 4687 V 55 w(encprivpart)3350 4910 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_asn1_encprivpart)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 5019 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5180 y(Create)h(new)f(ASN.1)h(structure)f (for)g(EncKrbPrivP)m(art.)390 5340 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure.)p eop end %%Page: 214 220 TeXDict begin 214 219 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(214)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(asn1)p 751 299 V 55 w(to)p 915 299 V 54 w(der)p 1143 299 V 54 w(\014eld)3350 496 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shishi_asn1_to_der_fi)q(eld)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)i(Shishi)p 2654 496 28 4 v 38 w(asn1)e Fe(node)p Fi(,)565 606 y(const)g(c)m(har)g (*)f Fe(field)p Fi(,)j(c)m(har)d(**)i Fe(der)p Fi(,)f(size)p 2076 606 V 41 w(t)g(*)f Fe(len)p Ff(\))390 715 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 850 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(data)g(that)g(ha)m(v)m(e)h(\014eld)e(to)h(extract.)390 985 y Fi(\014eld)t Fw(:)40 b(name)30 b(of)h(\014eld)f(in)g Fq(node)f Fw(to)i(extract.)390 1120 y Fi(der)7 b Fw(:)40 b(output)30 b(arra)m(y)h(that)g(holds)e(DER)i(enco)s(ding)f(of)h Fq(field)e Fw(in)h Fq(node)p Fw(.)390 1255 y Fi(len)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(length)h(of)f Fq(der)g Fw(output)g(arra)m(y)-8 b(.)390 1390 y(Extract)31 b(newly)f(allo)s(cated)j(DER)d(represen)m(tation)i(of)e(sp)s(eci\014ed) g(ASN.1)h(\014eld.)390 1525 y Fk(Return)h(v)-5 b(alue:)45 b Fw(Returns)32 b(SHISHI)p 1642 1525 V 39 w(OK)f(if)i(successful,)g(or) f(SHISHI)p 2798 1525 V 39 w(ASN1)p 3069 1525 V 40 w(ERR)m(OR)g(if)h (DER)390 1635 y(enco)s(ding)26 b(fails)h(\(common)g(reasons)g(for)f (this)g(is)g(that)h(the)g(ASN.1)g(is)f(missing)g(required)g(v)-5 b(alues\).)150 1835 y Fl(shishi)p 459 1835 37 5 v 55 w(asn1)p 751 1835 V 55 w(to)p 915 1835 V 54 w(der)3350 2032 y Fw([F)d(unction])-3599 b Fg(int)53 b(shishi_asn1_to_der)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 2032 28 4 v 39 w(asn1)d Fe(node)p Fi(,)i(c)m(har)f(**)565 2141 y Fe(der)p Fi(,)h(size)p 925 2141 V 40 w(t)f(*)g Fe(len)p Ff(\))390 2251 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2386 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(data)g(to)g(con)m (v)m(ert)h(to)f(DER.)390 2521 y Fi(der)7 b Fw(:)40 b(output)30 b(arra)m(y)h(that)g(holds)e(DER)i(enco)s(ding)f(of)h Fq(node)p Fw(.)390 2656 y Fi(len)p Fw(:)41 b(output)30 b(v)-5 b(ariable)31 b(with)f(length)h(of)f Fq(der)g Fw(output)g(arra)m (y)-8 b(.)390 2791 y(Extract)31 b(newly)f(allo)s(cated)j(DER)d (represen)m(tation)i(of)e(sp)s(eci\014ed)g(ASN.1)h(data.)390 2926 y Fk(Return)h(v)-5 b(alue:)45 b Fw(Returns)32 b(SHISHI)p 1642 2926 V 39 w(OK)f(if)i(successful,)g(or)f(SHISHI)p 2798 2926 V 39 w(ASN1)p 3069 2926 V 40 w(ERR)m(OR)g(if)h(DER)390 3035 y(enco)s(ding)26 b(fails)h(\(common)g(reasons)g(for)f(this)g(is)g (that)h(the)g(ASN.1)g(is)f(missing)g(required)g(v)-5 b(alues\).)150 3235 y Fl(shishi)p 459 3235 37 5 v 55 w(asn1)p 751 3235 V 55 w(msgt)m(yp)s(e)3350 3432 y Fw([F)d(unction]) -3599 b Fg(Shishi_msgtype)57 b(shishi_asn1_msgtype)51 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(Shishi)p 2967 3432 28 4 v 39 w(asn1)565 3542 y Fe(node)p Ff(\))390 3652 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3787 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(t)m(yp)s(e)g(to)g(get)g(msg)g(t)m(yp)s(e)f(for.) 390 3922 y(Determine)c(msg-t)m(yp)s(e)f(of)g(ASN.1)g(t)m(yp)s(e)f(of)h (a)g(pac)m(k)m(et.)41 b(Curren)m(tly)24 b(this)g(uses)g(the)h(msg-t)m (yp)s(e)g(\014eld)390 4031 y(instead)31 b(of)f(the)h(APPLICA)-8 b(TION)29 b(tag,)j(but)e(this)g(ma)m(y)h(b)s(e)f(c)m(hanged)h(in)f(the) g(future.)390 4166 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(msg-t)m(yp)s(e)h(of)f(ASN.1)h(t)m(yp)s(e,)g(0)f(on)h(failure.)150 4366 y Fl(shishi)p 459 4366 37 5 v 55 w(der)p 688 4366 V 55 w(msgt)m(yp)s(e)3350 4563 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_msgtype)57 b(shishi_der_msgtype)50 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 4673 y Fe(der)p Fi(,)h(size)p 925 4673 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 4782 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4917 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 5052 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 5187 y(Determine)g(msg-t)m(yp)s(e)g(of)g(DER)f (co)s(ded)h(data)g(of)f(a)h(pac)m(k)m(et.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(msg-t)m(yp)s(e)h(of)f (DER)h(data,)g(0)g(on)f(failure.)p eop end %%Page: 215 221 TeXDict begin 215 220 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(215)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)3350 517 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1)50 b Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(der)p Fi(,)565 627 y(size)p 712 627 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 737 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 893 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h (enco)s(ding.)390 1049 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1205 y(Con)m(v)m(ert)g(arbitrary)f(DER)h(data)g(of)f(a)h(pac)m(k)m(et)i (to)e(a)f(ASN.1)h(t)m(yp)s(e.)390 1362 y Fk(Return)26 b(v)-5 b(alue:)40 b Fw(Returns)25 b(newly)i(allo)s(cate)i(ASN.1)e (corresp)s(onding)e(to)j(DER)f(data,)h(or)f Fq(NULL)e Fw(on)390 1471 y(failure.)150 1692 y Fl(shishi)p 459 1692 37 5 v 55 w(der2asn1)p 986 1692 V 56 w(padata)3350 1911 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_padata)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 2020 y Fe(der)p Fi(,)i(size)p 925 2020 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 2130 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2286 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s (ding.)390 2442 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m (haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 2599 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(P)-8 b(A-D)m(A)g(T)g(A)33 b(and)c(create)j(a)f(ASN.1)g(structure.)390 2755 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 2976 y Fl(shishi)p 459 2976 37 5 v 55 w(der2asn1)p 986 2976 V 56 w(metho)s(ddata)3350 3194 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_methodd)q(ata)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)565 3304 y(c)m(har)e(*)g Fe(der)p Fi(,)g(size)p 1200 3304 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 3414 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3570 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 3726 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3882 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(METHOD-D)m(A)-8 b(T)g(A)32 b(and)e(create)i(a)f(ASN.1)g(structure.)390 4039 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure) g(corresp)s(onding)g(to)h(DER)f(data.)150 4260 y Fl(shishi)p 459 4260 37 5 v 55 w(der2asn1)p 986 4260 V 56 w(et)m(yp)s(e)p 1335 4260 V 53 w(info)3350 4478 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_etype_i)q(nfo)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)565 4588 y(c)m(har)e(*)g Fe(der)p Fi(,)g(size)p 1200 4588 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 4697 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4854 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 5010 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j (arra)m(y)f(with)f(DER)h(enco)s(ding.)390 5166 y(Deco)s(de)g(DER)g (enco)s(ding)f(of)h(ETYPE-INF)m(O)f(and)g(create)i(a)f(ASN.1)g (structure.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)p eop end %%Page: 216 222 TeXDict begin 216 221 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(216)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)p 986 299 V 56 w(et)m(yp)s(e)p 1335 299 V 53 w(info2)3350 522 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_etype_i)q(nfo)q(2)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 632 y(c)m(har)f(*)g Fe(der)p Fi(,)g(size)p 1200 632 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 741 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 902 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1063 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j (arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1224 y(Deco)s(de)g(DER)g (enco)s(ding)f(of)h(ETYPE-INF)m(O2)g(and)f(create)i(a)e(ASN.1)h (structure.)390 1385 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)150 1611 y Fl(shishi)p 459 1611 37 5 v 55 w(der2asn1)p 986 1611 V 56 w(tic)m(k)m(et)3350 1834 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_ticket)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 1944 y Fe(der)p Fi(,)i(size)p 925 1944 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 2054 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2215 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 2376 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 2537 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (Tic)m(k)m(et)h(and)e(create)i(a)f(ASN.1)f(structure.)390 2698 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure) g(corresp)s(onding)g(to)h(DER)f(data.)150 2923 y Fl(shishi)p 459 2923 37 5 v 55 w(der2asn1)p 986 2923 V 56 w(enctic)m(k)m(etpart) 3350 3147 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_enctick)q(etp)q(art)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 3256 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 3256 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 3366 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3527 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 3688 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3849 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(EncTic)m(k)m(etP)m(art)i (and)c(create)j(a)f(ASN.1)g(structure.)390 4010 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 4236 y Fl(shishi)p 459 4236 37 5 v 55 w(der2asn1)p 986 4236 V 56 w(asreq)3350 4459 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_asreq)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 4569 y Fe(der)p Fi(,)h(size)p 925 4569 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 4678 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4839 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 5000 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 5161 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (AS-REQ)f(and)f(create)j(a)f(ASN.1)g(structure.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g (corresp)s(onding)g(to)h(DER)f(data.)p eop end %%Page: 217 223 TeXDict begin 217 222 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(217)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)p 986 299 V 56 w(tgsreq)3350 522 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_tgsreq)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 632 y Fe(der)p Fi(,)i(size)p 925 632 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 741 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 902 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s (ding.)390 1063 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m (haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1224 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(TGS-REQ)e(and)h(create)i(a) f(ASN.1)g(structure.)390 1385 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)150 1611 y Fl(shishi)p 459 1611 37 5 v 55 w(der2asn1)p 986 1611 V 56 w(asrep)3350 1834 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_asrep)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 1944 y Fe(der)p Fi(,)h(size)p 925 1944 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 2054 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2215 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 2376 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 2537 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (AS-REP)f(and)g(create)h(a)g(ASN.1)g(structure.)390 2698 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g (corresp)s(onding)g(to)h(DER)f(data.)150 2923 y Fl(shishi)p 459 2923 37 5 v 55 w(der2asn1)p 986 2923 V 56 w(tgsrep)3350 3147 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_tgsrep)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 3256 y Fe(der)p Fi(,)i(size)p 925 3256 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 3366 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3527 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s (ding.)390 3688 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m (haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3849 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(TGS-REP)f(and)f(create)j(a) f(ASN.1)g(structure.)390 4010 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)150 4236 y Fl(shishi)p 459 4236 37 5 v 55 w(der2asn1)p 986 4236 V 56 w(kdcrep)3350 4459 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_kdcrep)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 4569 y Fe(der)p Fi(,)i(size)p 925 4569 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 4678 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4839 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 5000 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 5161 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (KDC-REP)f(and)g(create)i(a)e(ASN.1)h(structure.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure) g(corresp)s(onding)g(to)h(DER)f(data.)p eop end %%Page: 218 224 TeXDict begin 218 223 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(218)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)p 986 299 V 56 w(encasreppart)3350 522 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_encasre)q(ppa)q(rt)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 632 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 632 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 741 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 902 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h (enco)s(ding.)390 1063 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1224 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(EncASRepP)m(art)f(and)g (create)i(a)f(ASN.1)g(structure.)390 1385 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 1611 y Fl(shishi)p 459 1611 37 5 v 55 w(der2asn1)p 986 1611 V 56 w(enctgsreppart)3350 1834 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_enctgsr)q(epp)q(art)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 1944 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 1944 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 2054 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2215 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 2376 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 2537 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(EncTGSRepP)m(art)f(and)g (create)i(a)e(ASN.1)h(structure.)390 2698 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 2923 y Fl(shishi)p 459 2923 37 5 v 55 w(der2asn1)p 986 2923 V 56 w(enc)m(kdcreppart)3350 3147 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_enckdcr)q(epp)q(art)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 3256 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 3256 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 3366 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3527 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 3688 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3849 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(EncKDCRepP)m(art)f(and)g (create)i(a)f(ASN.1)g(structure.)390 4010 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 4236 y Fl(shishi)p 459 4236 37 5 v 55 w(der2asn1)p 986 4236 V 56 w(authen)m(ticator)3350 4459 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_authent)q(ica)q(tor)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 4569 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 4569 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 4678 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4839 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 5000 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 5161 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(Authen)m(ticator)h(and)e (create)i(a)e(ASN.1)h(structure.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)p eop end %%Page: 219 225 TeXDict begin 219 224 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(219)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)p 986 299 V 56 w(krb)s(error)3350 522 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_krberro)q(r)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 632 y(c)m(har)f(*)g Fe(der)p Fi(,)g(size)p 1200 632 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 741 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo) s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 902 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h (enco)s(ding.)390 1063 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1224 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(KRB-ERR)m(OR)f(and)g (create)i(a)f(ASN.1)g(structure.)390 1385 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 1611 y Fl(shishi)p 459 1611 37 5 v 55 w(der2asn1)p 986 1611 V 56 w(krbsafe)3350 1834 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_krbsafe)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)565 1944 y(*)g Fe(der)p Fi(,)g(size)p 1000 1944 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 2054 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2215 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 2376 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 2537 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (KRB-SAFE)f(and)g(create)i(a)f(ASN.1)g(structure.)390 2698 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure) g(corresp)s(onding)g(to)h(DER)f(data.)150 2923 y Fl(shishi)p 459 2923 37 5 v 55 w(der2asn1)p 986 2923 V 56 w(priv)3350 3147 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_priv)51 b Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(const)e(c)m(har)f(*)565 3256 y Fe(der)p Fi(,)i(size)p 925 3256 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 3366 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3527 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s (ding.)390 3688 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m (haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3849 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(KRB-PRIV)f(and)g(create)i (a)f(ASN.1)g(structure.)390 4010 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)150 4236 y Fl(shishi)p 459 4236 37 5 v 55 w(der2asn1)p 986 4236 V 56 w(encprivpart)3350 4459 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_encpriv)q(par)q(t)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)565 4569 y(c)m(har)f(*)g Fe(der)p Fi(,)g(size)p 1200 4569 28 4 v 41 w(t)g Fe(derlen)p Ff(\))390 4678 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4839 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 5000 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j (arra)m(y)f(with)f(DER)h(enco)s(ding.)390 5161 y(Deco)s(de)g(DER)g (enco)s(ding)f(of)h(EncKrbPrivP)m(art)e(and)h(create)i(a)f(ASN.1)g (structure.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)p eop end %%Page: 220 226 TeXDict begin 220 225 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(220)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(der2asn1)p 986 299 V 56 w(apreq)3350 517 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b (shishi_der2asn1_apreq)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 627 y Fe(der)p Fi(,)h(size)p 925 627 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 737 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 893 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s (ding.)390 1049 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m (haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 1205 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(AP-REQ)f(and)g(create)i(a)e (ASN.1)h(structure.)390 1362 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)150 1583 y Fl(shishi)p 459 1583 37 5 v 55 w(der2asn1)p 986 1583 V 56 w(aprep)3350 1801 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_aprep)51 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 1911 y Fe(der)p Fi(,)h(size)p 925 1911 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 2020 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2177 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 2333 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 2489 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h (AP-REP)f(and)g(create)i(a)f(ASN.1)f(structure.)390 2645 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g (corresp)s(onding)g(to)h(DER)f(data.)150 2866 y Fl(shishi)p 459 2866 37 5 v 55 w(der2asn1)p 986 2866 V 56 w(encapreppart)3350 3085 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_encapre)q(ppa)q(rt)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)565 3194 y(const)g(c)m(har)g(*)f Fe(der)p Fi(,)i(size)p 1438 3194 28 4 v 41 w(t)f Fe(derlen)p Ff(\))390 3304 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3460 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 3616 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f(DER)h(enco)s(ding.)390 3773 y(Deco)s(de)g(DER)g(enco)s(ding)f(of)h(EncAPRepP)m(art)g(and)e (create)j(a)f(ASN.1)g(structure.)390 3929 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to) h(DER)f(data.)150 4150 y Fl(shishi)p 459 4150 37 5 v 55 w(der2asn1)p 986 4150 V 56 w(kdcreq)3350 4369 y Fw([F)-8 b(unction])-3599 b Fg(Shishi_asn1)56 b(shishi_der2asn1_kdcreq)c Ff(\()p Fi(Shishi)28 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)565 4478 y Fe(der)p Fi(,)i(size)p 925 4478 28 4 v 40 w(t)f Fe(derlen)p Ff(\))390 4588 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4744 y Fi(der)7 b Fw(:)40 b(input)29 b(c)m(haracter)j(arra)m (y)f(with)f(DER)h(enco)s(ding.)390 4900 y Fi(derlen)p Fw(:)40 b(length)31 b(of)g(input)e(c)m(haracter)j(arra)m(y)f(with)f (DER)h(enco)s(ding.)390 5056 y(Deco)s(de)42 b(DER)g(enco)s(ding)f(of)h (AS-REQ,)f(TGS-REQ)f(or)h(KDC-REQ)g(and)g(create)i(a)e(ASN.1)390 5166 y(structure.)390 5322 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(ASN.1)g(structure)g(corresp)s(onding)g(to)h(DER)f (data.)p eop end %%Page: 221 227 TeXDict begin 221 226 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(221)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(asn1)p 751 299 V 55 w(prin)m(t)3350 488 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_asn1_print)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(Shishi)p 2340 488 28 4 v 39 w(asn1)d Fe(node)p Fi(,)i(FILE)e(*)565 598 y Fe(fh)p Ff(\))390 708 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 839 y Fi(no)s(de)5 b Fw(:)40 b(ASN.1)31 b(data)g(that)g(ha)m (v)m(e)h(\014eld)e(to)h(extract.)390 969 y Fi(fh)p Fw(:)40 b(\014le)30 b(descriptor)h(to)g(prin)m(t)f(to,)h(e.g.)42 b(stdout.)390 1100 y(Prin)m(t)30 b(ASN.1)h(structure)f(in)g(h)m(uman)g (readable)h(form,)f(t)m(ypically)i(for)e(debugging)g(purp)s(oses.)150 1326 y Fv(5.17)68 b(Error)46 b(Handling)150 1485 y Fw(Most)27 b(functions)f(in)f(`Libshishi')g(are)i(returning)e(an)h(error)g(if)g (they)g(fail.)40 b(F)-8 b(or)26 b(this)g(reason,)i(the)e(applica-)150 1595 y(tion)h(should)e(alw)m(a)m(ys)i(catc)m(h)h(the)e(error)g (condition)g(and)g(tak)m(e)h(appropriate)g(measures,)f(for)g(example)h (b)m(y)150 1704 y(releasing)i(the)g(resources)f(and)g(passing)g(the)g (error)g(up)f(to)i(the)f(caller,)i(or)f(b)m(y)f(displa)m(ying)g(a)h (descriptiv)m(e)150 1814 y(message)i(to)h(the)e(user)g(and)g (cancelling)i(the)e(op)s(eration.)275 1945 y(Some)k(error)f(v)-5 b(alues)35 b(do)f(not)g(indicate)h(a)f(system)h(error)e(or)h(an)g (error)g(in)g(the)g(op)s(eration,)h(but)f(the)150 2054 y(result)c(of)h(an)f(op)s(eration)h(that)g(failed)g(prop)s(erly)-8 b(.)150 2246 y Fl(5.17.1)63 b(Error)41 b(V)-10 b(alues)150 2393 y Fw(Errors)40 b(are)h(returned)f(as)i(an)f Fq(int)p Fw(.)72 b(Except)41 b(for)g(the)g(SHISHI)p 2428 2393 V 39 w(OK)g(case,)k(an)c(application)h(should)150 2503 y(alw)m(a)m(ys)28 b(use)e(the)g(constan)m(ts)i(instead)e(of)g(their)h (n)m(umeric)f(v)-5 b(alue.)40 b(Applications)27 b(are)f(encouraged)h (to)g(use)150 2612 y(the)k(constan)m(ts)g(ev)m(en)g(for)f(SHISHI)p 1365 2612 V 39 w(OK)g(as)h(it)g(impro)m(v)m(es)g(readabilit)m(y)-8 b(.)42 b(P)m(ossible)31 b(v)-5 b(alues)31 b(are:)150 2765 y Fq(SHISHI_OK)630 2874 y Fw(This)c(v)-5 b(alue)29 b(indicates)g(success.)41 b(The)27 b(v)-5 b(alue)29 b(of)f(this)g (error)g(is)h(guaran)m(teed)g(to)g(alw)m(a)m(ys)h(b)s(e)630 2984 y Fq(0)g Fw(so)h(y)m(ou)f(ma)m(y)h(use)f(it)h(in)f(b)s(o)s(olean)h (constructs.)150 3136 y Fq(SHISHI_ASN1_ERROR)630 3246 y Fw(Error)e(in)i(ASN.1)f(function)g(\(corrupt)h(data?\))150 3398 y Fq(SHISHI_FOPEN_ERROR)630 3507 y Fw(Could)f(not)g(op)s(en)g (\014le)150 3660 y Fq(SHISHI_IO_ERROR)630 3769 y Fw(File)i (input/output)d(error)150 3921 y Fq(SHISHI_MALLOC_ERROR)630 4031 y Fw(Memory)i(allo)s(cation)i(error)c(in)i(shishi)e(library)-8 b(.)150 4183 y Fq(SHISHI_BASE64_ERROR)630 4293 y Fw(Base64)32 b(enco)s(ding)f(or)f(deco)s(ding)g(failed.)42 b(Data)32 b(corrupt?)150 4445 y Fq(SHISHI_REALM_MISMATCH)630 4555 y Fw(Clien)m(t)f(realm)g(v)-5 b(alue)31 b(di\013er)f(b)s(et)m(w)m(een)h (request)f(and)g(reply)-8 b(.)150 4707 y Fq(SHISHI_CNAME_MISMATCH)630 4816 y Fw(Clien)m(t)31 b(name)g(v)-5 b(alue)30 b(di\013er)h(b)s(et)m(w) m(een)g(request)f(and)g(reply)-8 b(.)150 4969 y Fq (SHISHI_NONCE_MISMATCH)630 5078 y Fw(Repla)m(y)31 b(protection)h(v)-5 b(alue)31 b(\(nonce\))g(di\013er)f(b)s(et)m(w)m(een)h(request)g(and)e (reply)-8 b(.)150 5230 y Fq(SHISHI_TGSREP_BAD_KEYTYP)o(E)630 5340 y Fw(Incorrect)31 b(k)m(ey)g(t)m(yp)s(e)g(used)e(in)h(TGS)g(reply) -8 b(.)p eop end %%Page: 222 228 TeXDict begin 222 227 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(222)150 299 y Fq (SHISHI_KDCREP_BAD_KEYTYP)o(E)630 408 y Fw(Incorrect)31 b(k)m(ey)g(t)m(yp)s(e)g(used)e(in)h(reply)g(from)g(KDC.)150 570 y Fq(SHISHI_APREP_BAD_KEYTYPE)630 679 y Fw(Incorrect)h(k)m(ey)g(t)m (yp)s(e)g(used)e(in)h(AP)h(reply)-8 b(.)150 840 y Fq (SHISHI_APREP_VERIFY_FAIL)o(ED)630 950 y Fw(F)g(ailed)32 b(v)m(eri\014cation)g(of)e(AP)h(reply)-8 b(.)150 1111 y Fq(SHISHI_APREQ_BAD_KEYTYPE)630 1221 y Fw(Incorrect)31 b(k)m(ey)g(t)m(yp)s(e)g(used)e(in)h(AP)h(request.)150 1382 y Fq(SHISHI_TOO_SMALL_BUFFER)630 1491 y Fw(Pro)m(vided)f(bu\013er) g(w)m(as)g(to)s(o)i(small.)150 1653 y Fq(SHISHI_DERIVEDKEY_TOO_SM)o (ALL)630 1762 y Fw(Deriv)m(ed)f(k)m(ey)h(material)f(is)g(to)s(o)g (short)f(to)h(b)s(e)f(applicable.)150 1923 y Fq(SHISHI_KEY_TOO_LARGE) 630 2033 y Fw(The)g(k)m(ey)h(is)f(to)s(o)i(large)f(to)g(b)s(e)f (usable.)150 2194 y Fq(SHISHI_CRYPTO_ERROR)630 2304 y Fw(Lo)m(w-lev)m(el)36 b(cryptographic)e(primitiv)m(e)g(failed.)51 b(This)33 b(usually)g(indicates)i(bad)e(passw)m(ord)630 2413 y(or)d(data)h(corruption.)150 2574 y Fq(SHISHI_CRYPTO_INTERNAL_E)o (RROR)630 2684 y Fw(In)m(ternal)g(error)f(in)g(lo)m(w-lev)m(el)j (crypto)e(routines.)150 2845 y Fq(SHISHI_SOCKET_ERROR)630 2955 y Fw(The)k(system)g(call)h(so)s(c)m(k)m(et\(\))i(failed.)56 b(This)34 b(usually)h(indicates)h(that)g(y)m(our)f(system)g(do)s(es)630 3064 y(not)c(supp)s(ort)d(the)j(so)s(c)m(k)m(et)h(t)m(yp)s(e.)150 3226 y Fq(SHISHI_BIND_ERROR)630 3335 y Fw(The)e(system)g(call)i (bind\(\))e(failed.)41 b(This)30 b(usually)g(indicates)h(insu\016cien)m (t)g(p)s(ermissions.)150 3496 y Fq(SHISHI_SENDTO_ERROR)630 3606 y Fw(The)f(system)g(call)i(sendto\(\))f(failed.)150 3767 y Fq(SHISHI_RECVFROM_ERROR)630 3877 y Fw(Error)e(receiving)j(data) f(from)f(serv)m(er)150 4038 y Fq(SHISHI_CLOSE_ERROR)630 4147 y Fw(The)g(system)g(call)i(close\(\))g(failed.)150 4309 y Fq(SHISHI_KDC_TIMEOUT)630 4418 y Fw(Timed)g(out)i(talking)g(to)f (KDC.)g(This)g(usually)f(indicates)i(a)f(net)m(w)m(ork)h(or)f(KDC)g (address)630 4528 y(problem.)150 4689 y Fq(SHISHI_KDC_NOT_KNOWN_FOR)o (_REA)o(LM)630 4798 y Fw(No)e(KDC)f(kno)m(wn)g(for)g(giv)m(en)h(realm.) 150 4960 y Fq(SHISHI_TTY_ERROR)630 5069 y Fw(No)g(TTY)f(assigned)g(to)h (pro)s(cess.)150 5230 y Fq(SHISHI_GOT_KRBERROR)630 5340 y Fw(Serv)m(er)f(replied)h(to)g(the)f(request)h(with)f(an)g(error)g (message.)p eop end %%Page: 223 229 TeXDict begin 223 228 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(223)150 299 y Fq (SHISHI_HANDLE_ERROR)630 408 y Fw(F)-8 b(ailure)32 b(to)f(use)f (handle.)40 b(Missing)31 b(handle,)f(or)g(miscon\014gured.)150 570 y Fq(SHISHI_INVALID_TKTS)630 679 y Fw(Tic)m(k)m(et)i(set)f(not)g (initialized.)42 b(This)30 b(usually)g(indicates)h(an)g(in)m(ternal)g (application)g(error.)150 840 y Fq(SHISHI_TICKET_BAD_KEYTYP)o(E)630 950 y Fw(Key)44 b(t)m(yp)s(e)h(used)e(to)i(encrypt)f(tic)m(k)m(et)j(do) s(esn't)d(matc)m(h)h(pro)m(vided)f(k)m(ey)-8 b(.)84 b(This)43 b(usually)630 1060 y(indicates)31 b(an)g(in)m(ternal)g(application)g (error.)150 1221 y Fq(SHISHI_INVALID_KEY)630 1330 y Fw(Reference)g(to)g (in)m(v)-5 b(alid)31 b(encryption)f(k)m(ey)-8 b(.)150 1491 y Fq(SHISHI_APREQ_DECRYPT_FAI)o(LED)630 1601 y Fw(Could)44 b(not)h(decrypt)f(AP-REQ)h(using)f(pro)m(vided)g(k)m(ey)-8 b(.)85 b(This)44 b(usually)g(indicates)i(an)630 1711 y(in)m(ternal)31 b(application)h(error.)150 1872 y Fq (SHISHI_TICKET_DECRYPT_FA)o(ILED)630 1981 y Fw(Could)24 b(not)i(decrypt)f(Tic)m(k)m(et)i(using)d(pro)m(vided)h(k)m(ey)-8 b(.)40 b(This)24 b(usually)h(indicates)h(an)f(in)m(ternal)630 2091 y(application)32 b(error.)150 2252 y Fq(SHISHI_INVALID_TICKET)630 2362 y Fw(In)m(v)-5 b(alid)31 b(tic)m(k)m(ed)h(passed)e(in)g(call.)150 2523 y Fq(SHISHI_OUT_OF_RANGE)630 2632 y Fw(Argumen)m(t)h(lies)g (outside)f(of)h(v)-5 b(alid)30 b(range.)150 2794 y Fq (SHISHI_ASN1_NO_ELEMENT)630 2903 y Fw(The)g(ASN.1)h(structure)f(do)s (es)g(not)g(con)m(tain)i(the)f(indicated)g(elemen)m(t.)150 3064 y Fq(SHISHI_SAFE_BAD_KEYTYPE)630 3174 y Fw(A)m(ttempted)h(access)f (to)g(non-existen)m(t)h(k)m(ey)f(t)m(yp)s(e.)150 3335 y Fq(SHISHI_SAFE_VERIFY_FAILE)o(D)630 3445 y Fw(V)-8 b(eri\014cation)32 b(failed)f(on)f(either)h(side.)150 3606 y Fq(SHISHI_PKCS5_INVALID_PRF)630 3715 y Fw(In)m(v)-5 b(alid)31 b(PK)m(CS5)e(descriptor.)150 3877 y Fq (SHISHI_PKCS5_INVALID_ITE)o(RATI)o(ON_C)o(OUN)o(T)630 3986 y Fw(In)m(v)-5 b(alid)31 b(claim)g(of)f(iteration)i(coun)m(t)f(in) f(PK)m(CS5)g(descriptor.)150 4147 y Fq(SHISHI_PKCS5_INVALID_DER)o(IVED) o(_KEY)o(_LE)o(NGTH)630 4257 y Fw(Deriv)m(ed)h(k)m(ey)h(length)e(is)h (incorrect)g(for)f(PK)m(CS5)g(descriptor.)150 4418 y Fq(SHISHI_PKCS5_DERIVED_KEY)o(_TOO)o(_LON)o(G)630 4528 y Fw(Deriv)m(ed)h(k)m(ey)h(is)e(to)s(o)h(long)g(for)f(PK)m(CS5)g (descriptor.)150 4689 y Fq(SHISHI_INVALID_PRINCIPAL)o(_NAM)o(E)630 4798 y Fw(Principal)g(name)h(syn)m(tax)g(error.)150 4960 y Fq(SHISHI_INVALID_ARGUMENT)630 5069 y Fw(In)m(v)-5 b(alid)31 b(argumen)m(t)f(passed)g(in)g(call.)42 b(W)-8 b(rong)31 b(or)g(unkno)m(wn)e(v)-5 b(alue.)150 5230 y Fq(SHISHI_ASN1_NO_VALUE)630 5340 y Fw(The)30 b(indicated)h(ASN.1)g (elemen)m(t)h(do)s(es)e(not)g(carry)h(a)f(v)-5 b(alue.)p eop end %%Page: 224 230 TeXDict begin 224 229 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(224)150 299 y Fq (SHISHI_CONNECT_ERROR)630 408 y Fw(Connection)31 b(attempt)g(failed.)42 b(T)-8 b(ry)30 b(again,)h(or)g(c)m(hec)m(k)h(a)m(v)-5 b(ailabilit)m(y)d(.)150 552 y Fq(SHISHI_VERIFY_FAILED)630 662 y Fw(V)g(eri\014cation)32 b(failed)f(on)f(either)h(side.)150 806 y Fq(SHISHI_PRIV_BAD_KEYTYPE)630 916 y Fw(The)f(priv)-5 b(ate)31 b(k)m(ey)g(uses)f(an)g(incompatible)h(encryption)g(t)m(yp)s (e.)150 1060 y Fq(SHISHI_FILE_ERROR)630 1169 y Fw(The)f(desired)g (\014le)g(could)h(not)f(b)s(e)g(accessed.)42 b(Chec)m(k)31 b(p)s(ermissions.)150 1313 y Fq(SHISHI_ENCAPREPPART_BAD_)o(KEYT)o(YPE) 630 1423 y Fw(The)f(presen)m(t)g(AP)h(reply)f(sp)s(eci\014es)g(an)g (inp)s(ermissible)f(k)m(ey)i(t)m(yp)s(e.)150 1567 y Fq (SHISHI_GETTIMEOFDAY_ERRO)o(R)630 1676 y Fw(A)25 b(request)g(for)f (presen)m(t)h(time)h(of)f(da)m(y)g(has)f(failed.)40 b(This)24 b(is)h(usually)f(in)m(ternal,)j(but)d(a)i(v)-5 b(alid)630 1786 y(time)31 b(is)f(imp)s(erativ)m(e)i(for)e(us.)150 1930 y Fq(SHISHI_KEYTAB_ERROR)630 2039 y Fw(F)-8 b(ailed)32 b(to)f(parse)f(k)m(eytab)i(\014le)150 2183 y Fq(SHISHI_CCACHE_ERROR)630 2293 y Fw(F)-8 b(ailed)32 b(to)f(parse)f(creden)m(tial)i(cac)m(he)g (\014le)150 2477 y Fl(5.17.2)63 b(Error)41 b(F)-10 b(unctions)150 2681 y(shishi)p 459 2681 37 5 v 55 w(strerror)3350 2862 y Fw([F)i(unction])-3599 b Fg(const)54 b(char)f(*)g(shishi_strerror)d Ff(\()p Fi(in)m(t)31 b Fe(err)p Ff(\))390 2972 y Fi(err)7 b Fw(:)40 b(shishi)29 b(error)h(co)s(de.)390 3099 y(Con)m(v)m(ert)h (return)e(co)s(de)i(to)g(h)m(uman)f(readable)h(string.)390 3225 y Fk(Return)e(v)-5 b(alue:)40 b Fw(Returns)29 b(a)g(p)s(oin)m(ter) h(to)g(a)f(statically)j(allo)s(cated)f(string)f(con)m(taining)h(a)e (descrip-)390 3335 y(tion)44 b(of)g(the)g(error)g(with)f(the)h(error)f (v)-5 b(alue)45 b Fq(err)p Fw(.)80 b(This)43 b(string)g(can)i(b)s(e)e (used)g(to)h(output)g(a)390 3445 y(diagnostic)32 b(message)f(to)g(the)g (user.)150 3628 y Fl(shishi)p 459 3628 V 55 w(error)3350 3810 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shishi_error)c Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Ff(\))390 3919 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4046 y(Extract)j(detailed)g(error)f(information)g(string.)45 b(Note)34 b(that)e(the)g(memory)g(is)g(managed)h(b)m(y)f(the)390 4156 y(Shishi)d(library)-8 b(,)31 b(so)f(y)m(ou)h(m)m(ust)f(not)h (deallo)s(cate)i(the)d(string.)390 4282 y Fk(Return)21 b(v)-5 b(alue:)37 b Fw(Returns)20 b(p)s(oin)m(ter)i(to)g(error)f (information)g(string,)j(that)e(m)m(ust)f(not)h(b)s(e)f(deallo)s(cate) 390 4392 y(b)m(y)30 b(caller.)150 4576 y Fl(shishi)p 459 4576 V 55 w(error)p 781 4576 V 55 w(clear)3350 4757 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_error_clear)c Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Ff(\))390 4867 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m (y)d Fq(shishi_init\(\))p Fw(.)390 4994 y(Clear)36 b(the)g(detailed)h (error)e(information)h(string.)57 b(See)36 b Fq(shishi_error\(\))c Fw(for)j(ho)m(w)h(to)h(access)390 5103 y(the)32 b(error)f(string,)h (and)f Fq(shishi_error_set\(\))c Fw(and)k Fq(shishi_error_printf\(\))26 b Fw(for)31 b(ho)m(w)h(to)390 5213 y(set)27 b(the)g(error)g(string.)39 b(This)26 b(function)g(is)h(mostly)g(for)g(Shishi)e(in)m(ternal)j(use,) f(but)f(if)h(y)m(ou)g(dev)m(elop)390 5322 y(an)f(extension)h(of)g (Shishi,)f(it)h(ma)m(y)g(b)s(e)e(useful)h(to)h(use)f(the)g(same)h (error)f(handling)g(infrastructure.)p eop end %%Page: 225 231 TeXDict begin 225 230 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(225)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(error)p 781 299 V 55 w(set)3350 521 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_error_set)c Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(errstr)p Ff(\))390 630 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 790 y Fi(errstr)7 b Fw(:)63 b(Zero)43 b(terminated)g(c)m (haracter)g(arra)m(y)g(con)m(taining)h(error)e(description,)k(or)c (NULL)g(to)390 899 y(clear)31 b(the)g(error)f(description)g(string.)390 1058 y(Set)f(the)h(detailed)g(error)f(information)g(string)g(to)h(sp)s (eci\014ed)e(string.)41 b(The)28 b(string)h(is)g(copied)h(in)m(to)390 1168 y(the)g(Shishi)e(in)m(ternal)i(structure,)g(so)g(y)m(ou)f(can)h (deallo)s(cate)i(the)e(string)f(passed)h(to)g(this)f(function)390 1278 y(after)35 b(the)f(call.)53 b(This)33 b(function)h(is)g(mostly)h (for)f(Shishi)e(in)m(ternal)j(use,)g(but)f(if)g(y)m(ou)g(dev)m(elop)h (an)390 1387 y(extension)c(of)g(Shishi,)e(it)i(ma)m(y)g(b)s(e)f(useful) f(to)i(use)f(the)h(same)g(error)f(handling)f(infrastructure.)150 1611 y Fl(shishi)p 459 1611 V 55 w(error)p 781 1611 V 55 w(prin)m(tf)3350 1833 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_error_printf)d Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)g Fe(format)p Fi(,)565 1943 y Fe(...)p Ff(\))390 2052 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 2212 y Fi(format)r Fw(:)41 b(prin)m(tf)30 b(st)m(yle)h(format)g(string.)41 b(...:)g(prin)m(t)30 b(st)m(yle)i(argumen)m(ts.)390 2371 y(Set)h(the)h(detailed)g(error)f (information)h(string)f(to)h(a)g(prin)m(tf)e(formatted)i(string.)50 b(This)32 b(function)390 2481 y(is)e(mostly)g(for)g(Shishi)e(in)m (ternal)j(use,)f(but)f(if)g(y)m(ou)h(dev)m(elop)h(an)f(extension)g(of)g (Shishi,)f(it)h(ma)m(y)h(b)s(e)390 2590 y(useful)f(to)h(use)f(the)g (same)h(error)f(handling)g(infrastructure.)150 2814 y Fl(shishi)p 459 2814 V 55 w(error)p 781 2814 V 55 w(outputt)m(yp)s(e) 3350 3036 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b (shishi_error_outputty)q(pe)f Ff(\()p Fi(Shishi)29 b(*)i Fe(handle)p Ff(\))390 3146 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 3305 y(Get)h(the)g(curren)m(t)f(output)g(t)m(yp)s(e)h(for)f (logging)i(messages.)390 3464 y Fk(Return)38 b(v)-5 b(alue:)56 b Fw(Return)38 b(output)g(t)m(yp)s(e)g(\(NULL,)h(stderr)e(or)h (syslog\))h(for)f(informational)i(and)390 3574 y(w)m(arning)30 b(messages.)150 3798 y Fl(shishi)p 459 3798 V 55 w(error)p 781 3798 V 55 w(set)p 988 3798 V 54 w(outputt)m(yp)s(e)3350 4020 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b (shishi_error_set_outputt)q(ype)e Ff(\()p Fi(Shishi)30 b(*)g Fe(handle)p Fi(,)j(in)m(t)e Fe(type)p Ff(\))390 4129 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j (b)m(y)d Fq(shishi_init\(\))p Fw(.)390 4289 y Fi(t)m(yp)s(e)5 b Fw(:)41 b(output)30 b(t)m(yp)s(e.)390 4448 y(Set)h(output)f(t)m(yp)s (e)g(\(NULL,)h(stderr)f(or)g(syslog\))i(for)e(informational)h(and)f(w)m (arning)g(messages.)150 4672 y Fl(shishi)p 459 4672 V 55 w(info)3350 4894 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_info)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)f Fe(format)p Fi(,)j Fe(...)p Ff(\))390 5004 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g (allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 5163 y Fi(format)r Fw(:)41 b(prin)m(tf)30 b(st)m(yle)h(format)g (string.)41 b(...:)g(prin)m(t)30 b(st)m(yle)i(argumen)m(ts.)390 5322 y(Prin)m(t)e(informational)i(message)f(to)g(output)f(as)h (de\014ned)e(in)h(handle.)p eop end %%Page: 226 232 TeXDict begin 226 231 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(226)150 299 y Fl(shishi)p 459 299 37 5 v 55 w(w)m(arn)3350 528 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_warn)48 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)f Fe(format)p Fi(,)j Fe(...)p Ff(\))390 637 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 804 y Fi(format)r Fw(:)41 b(prin)m(tf)30 b(st)m(yle)h(format)g (string.)41 b(...:)g(prin)m(t)30 b(st)m(yle)i(argumen)m(ts.)390 970 y(Prin)m(t)e(a)h(w)m(arning)f(to)h(output)f(as)h(de\014ned)e(in)h (handle.)150 1201 y Fl(shishi)p 459 1201 V 55 w(v)m(erb)s(ose)3350 1430 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shishi_verbose)49 b Ff(\()p Fi(Shishi)30 b(*)h Fe(handle)p Fi(,)h(const)f(c)m(har)g(*)f Fe(format)p Fi(,)j Fe(...)p Ff(\))390 1539 y Fi(handle)5 b Fw(:)40 b(shishi)30 b(handle)g(as)g(allo)s(cated)j(b)m(y)d Fq(shishi_init\(\))p Fw(.)390 1706 y Fi(format)r Fw(:)41 b(prin)m(tf)30 b(st)m(yle)h(format)g(string.)41 b(...:)g(prin)m(t)30 b(st)m(yle)i(argumen)m(ts.)390 1872 y(Prin)m(t)e(a)h(diagnostic)h (message)f(to)h(output)e(as)g(de\014ned)f(in)h(handle.)150 2153 y Fv(5.18)68 b(Examples)150 2312 y Fw(This)32 b(section)i(will)f (b)s(e)e(extended)i(to)g(con)m(tain)h(w)m(alk-throughs)f(of)g(example)g (co)s(de)g(that)g(demonstrate)150 2422 y(ho)m(w)i(`Shishi')f(is)h(used) f(to)i(write)f(y)m(our)g(o)m(wn)g(applications)h(that)f(supp)s(ort)f (Kerb)s(eros)g(5.)54 b(The)35 b(rest)g(of)150 2531 y(the)e(curren)m(t)g (section)i(consists)e(of)h(some)f(crude)g(hin)m(ts)g(for)g(the)g (example)h(clien)m(t/serv)m(er)i(applications)150 2641 y(that)c(is)g(part)f(of)h(Shishi,)e(tak)m(en)j(from)e(an)g(email)i(but) e(sa)m(v)m(ed)h(here)g(for)f(lac)m(k)i(of)f(a)f(b)s(etter)h(place)g(to) h(put)150 2750 y(it.)275 2917 y(There)c(are)i(t)m(w)m(o)h(programs:)40 b('clien)m(t')33 b(and)c('serv)m(er')j(in)e(src/.)275 3083 y(The)f(clien)m(t)j(output)e(an)h(AP-REQ,)f(w)m(aits)h(for)f(an)h (AP-REP)-8 b(,)31 b(and)e(then)h(simply)g(reads)g(data)h(from)150 3193 y(stdin.)275 3359 y(The)g(serv)m(er)g(w)m(aits)i(for)e(an)h (AP-REQ,)f(parses)h(it)g(and)f(prin)m(ts)g(an)g(AP-REP)-8 b(,)32 b(and)f(then)h(read)f(data)150 3469 y(from)f(stdin.)275 3635 y(Both)24 b(programs)g(accept)h(a)g(Kerb)s(eros)e(serv)m(er)h (name)g(as)g(the)g(\014rst)g(command)f(line)i(argumen)m(t.)39 b(Y)-8 b(our)150 3745 y(KDC)30 b(m)m(ust)g(kno)m(w)g(this)g(serv)m(er,) g(since)g(the)h(clien)m(t)g(tries)g(to)f(get)h(a)g(tic)m(k)m(et)h(for)e (it)h(\(\014rst)e(it)i(gets)g(a)f(tic)m(k)m(et)150 3854 y(gran)m(ting)37 b(tic)m(k)m(et)h(for)e(the)f(default)h(username\),)h (and)f(y)m(ou)g(m)m(ust)f(write)h(the)g(k)m(ey)h(for)e(the)h(serv)m(er) g(in)m(to)150 3964 y(/usr/lo)s(cal/etc/shishi.k)m(eys)e(on)c(the)h (Shishi)e(format,)i(e.g.:)390 4130 y Fq(-----BEGIN)45 b(SHISHI)h(KEY-----)390 4240 y(Keytype:)g(16)h(\(des3-cbc-sha1-kd\))390 4350 y(Principal:)e(sample/latte.josefsson.o)o(rg)390 4459 y(Realm:)h(JOSEFSSON.ORG)390 4678 y(8W0VrQQBpxlACPQEqN91EHxb)o (vFFo)o(2ltt)390 4788 y(-----END)g(SHISHI)g(KEY-----)275 4954 y Fw(Y)-8 b(ou)27 b(m)m(ust)g(extract)i(the)e(prop)s(er)f (encryption)h(k)m(ey)h(from)e(the)i(KDC)f(in)f(some)i(w)m(a)m(y)-8 b(.)41 b(\(This)27 b(part)g(will)150 5064 y(b)s(e)j(easier)h(when)e (Shishi)h(include)g(a)g(KDC,)h(a)g(basic)f(one)h(isn't)g(far)f(a)m(w)m (a)m(y)-8 b(,)33 b(giv)m(e)f(me)e(a)h(w)m(eek)g(or)f(to.\))275 5230 y(The)e(in)m(ten)m(tion)j(is)e(that)h(the)g(data)g(read,)f(after)h (the)f(authen)m(tication)j(phase,)d(should)f(b)s(e)h(protected)150 5340 y(using)h(KRB)p 596 5340 28 4 v 40 w(SAFE)g(\(see)h(RF)m(C\))g (but)f(I)g(ha)m(v)m(en't)i(added)e(this)g(y)m(et.)p eop end %%Page: 227 233 TeXDict begin 227 232 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(227)150 299 y Fv(5.19)68 b(Kerb)t(eros)46 b(Database)g(F)-11 b(unctions)150 458 y Fw(Shisa)41 b(is)g(a)h(separate)h(and)d(standalone)j(library)e(from)f (Shishi)h(\(see)h(Section)g(3.1)h([In)m(tro)s(duction)e(to)150 568 y(Shisa],)e(page)f(18\).)62 b(If)36 b(y)m(ou)i(only)f(wish)g(to)g (manipulate)h(the)f(information)h(stored)f(in)g(the)g(Kerb)s(eros)150 677 y(user)42 b(database)i(used)e(b)m(y)h(Shishi,)i(y)m(ou)f(do)e(not)i (need)e(to)i(link)f(or)g(use)g(the)g(Shishi)f(library)g(at)i(all.)150 787 y(Ho)m(w)m(ev)m(er,)33 b(y)m(ou)d(ma)m(y)h(\014nd)e(it)i(useful)f (to)h(com)m(bine)g(the)f(t)m(w)m(o)i(libraries.)275 931 y(F)-8 b(or)37 b(t)m(w)m(o)g(real)g(w)m(orld)g(examples)f(on)h(using)f (the)g(Shisa)g(library)-8 b(,)38 b(refer)e(to)h(`)p Fq(src/shisa.c)p Fw(')d(\(Shisa)150 1040 y(command)c(line)h(to)s(ol\))h(and)d(`)p Fq(src/kdc.c)p Fw(')g(\(part)h(of)h(Shishid)d(serv)m(er\).)275 1184 y(Shisa)k(uses)h(t)m(w)m(o)i(`)p Fq(struct)p Fw('s)d(to)j(carry)e (information.)50 b(The)33 b(\014rst,)h Fq(Shisa_principal)p Fw(,)c(is)k(used)e(to)150 1293 y(hold)h(information)h(ab)s(out)g (principals.)50 b(The)33 b(struct)g(do)s(es)h(not)g(con)m(tain)h(p)s (oin)m(ters)e(to)h(strings)g(etc,)i(so)150 1403 y(the)28 b(library)f(assumes)g(the)h(caller)h(is)e(resp)s(onsible)g(for)g(allo)s (cating)j(and)d(deallo)s(cating)j(the)d(struct)h(itself.)150 1512 y(Eac)m(h)35 b(suc)m(h)f(struct)h(is)f(\(uniquely\))h(iden)m (ti\014ed)f(b)m(y)h(the)f(com)m(bination)i(of)f(principal)f(name)h(and) f(realm)150 1622 y(name.)390 1765 y Fq(struct)46 b(Shisa_principal)390 1875 y({)485 1985 y(int)h(isdisabled;)485 2094 y(uint32_t)f(kvno;)485 2204 y(time_t)h(notusedbefore;)485 2313 y(time_t)g(lastinitialtgt;)282 b(/*)47 b(time)g(of)g(last)f(initial)g(request)g(for)h(a)g(TGT)g(*/)485 2423 y(time_t)g(lastinitialrequest;)90 b(/*)47 b(time)g(of)g(last)f (initial)g(request)g(*/)485 2533 y(time_t)h(lasttgt;)618 b(/*)47 b(time)g(of)g(issue)f(for)h(the)g(newest)f(TGT)h(used)g(*/)485 2642 y(time_t)g(lastrenewal;)426 b(/*)47 b(time)g(of)g(the)g(last)f (renewal)g(*/)485 2752 y(time_t)h(passwordexpire;)282 b(/*)47 b(time)g(when)f(the)h(password)f(will)g(expire)g(*/)485 2861 y(time_t)h(accountexpire;)330 b(/*)47 b(time)g(when)f(the)h (account)f(will)h(expire.)e(*/)390 2971 y(};)390 3080 y(typedef)h(struct)g(Shisa_principal)e(Shisa_principal;)275 3224 y Fw(The)20 b(second)g(structure)g(is)h(called)g Fq(Shisa_key)d Fw(and)i(hold)g(information)h(ab)s(out)f(cryptographic)h (k)m(eys.)150 3333 y(Because)29 b(the)f(struct)g(con)m(tain)h(p)s(oin)m (ters,)f(and)g(the)g(caller)h(cannot)f(kno)m(w)g(ho)m(w)g(man)m(y)g(k)m (eys)g(a)g(principal)150 3443 y(ha)m(v)m(e,)f(the)c(Shisa)h(library)f (manages)h(memory)g(for)f(the)h(struct.)39 b(The)23 b(library)g(allo)s (cate)j(the)e(structs,)i(and)150 3553 y(the)35 b(p)s(oin)m(ters)f (within)h(them.)53 b(The)34 b(caller)i(ma)m(y)g(deallo)s(cate)h(them,)f (but)e(it)h(is)g(recommended)f(to)h(use)150 3662 y Fq(shisa_key_free)22 b Fw(or)27 b Fq(shisa_keys_free)22 b Fw(instead.)40 b(Note)27 b(that)g(eac)m(h)h(principal)e(ma)m(y)h(ha)m(v)m(e)g(m)m(ultiple)150 3772 y(k)m(eys.)390 3915 y Fq(struct)46 b(Shisa_key)390 4025 y({)485 4134 y(uint32_t)g(kvno;)485 4244 y(int32_t)g(etype;)485 4354 y(int)h(priority;)485 4463 y(char)g(*key;)485 4573 y(size_t)g(keylen;)485 4682 y(char)g(*salt;)485 4792 y(size_t)g(saltlen;)485 4902 y(char)g(*str2keyparam;)485 5011 y(size_t)g(str2keyparamlen;)485 5121 y(char)g(*password;)390 5230 y(};)390 5340 y(typedef)f(struct)g(Shisa_key)f(Shisa_key;)p eop end %%Page: 228 234 TeXDict begin 228 233 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(228)275 299 y(Shisa)28 b(is)g(t)m(ypically)i(initialized)h(b)m(y)d(calling)i Fq(shisa_init)p Fw(,)c(and)i(deinitialized)i(\(when)e(the)h(applica-) 150 408 y(tion)g(no)g(longer)g(need)g(to)g(use)g(Shisa,)g(t)m(ypically) h(when)e(it)h(sh)m(uts)g(do)m(wn\))f(b)m(y)h(calling)h Fq(shisa_done)p Fw(,)d(but)150 518 y(here)j(are)h(the)g(complete)g (\(de\)initialization)j(in)m(terface)e(functions.)150 730 y Fl(shisa)3350 939 y Fw([F)-8 b(unction])-3599 b Fg(Shisa)54 b(*)e(shisa)47 b Ff(\()31 b Fe(void)p Ff(\))390 1049 y Fw(Initializes)39 b(the)f(Shisa)f(library)-8 b(.)62 b(If)37 b(this)g(function)g(fails,)j(it)e(ma)m(y)g(prin)m(t)f (diagnostic)i(errors)e(to)390 1158 y(stderr.)390 1305 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(Shisa)f(library)h (handle,)h(or)f Fq(NULL)f Fw(on)h(error.)150 1517 y Fl(shisa)p 417 1517 37 5 v 55 w(done)3350 1726 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shisa_done)48 b Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Ff(\))390 1836 y Fw(Deallo)s(cates)41 b(the)d(shisa)f(library) g(handle.)62 b(The)37 b(handle)g(m)m(ust)h(not)g(b)s(e)e(used)h(in)h (an)m(y)f(calls)i(to)390 1945 y(shisa)30 b(functions)g(after)h(this.) 150 2157 y Fl(shisa)p 417 2157 V 55 w(init)3350 2366 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_init)c Ff(\()p Fi(Shisa)30 b(**)h Fe(dbh)p Ff(\))390 2476 y Fi(dbh)p Fw(:)39 b(p)s(oin)m(ter)31 b(to)g(library)f(handle)g(to)h(b)s (e)e(created.)390 2623 y(Create)j(a)f(Shisa)g(library)f(handle,)h (using)g Fq(shisa\(\))p Fw(,)e(and)h(read)h(the)g(system)g (con\014guration)h(\014le)390 2732 y(from)40 b(their)g(default)g(lo)s (cations.)72 b(The)39 b(paths)h(to)h(the)f(default)h(system)f (con\014guration)h(\014le)f(is)390 2842 y(decided)30 b(at)h(compile)h(time)f(\($sysconfdir/shisa.conf)7 b(\).)390 2989 y(The)30 b(handle)g(is)g(allo)s(cated)i(regardless)f(of)f(return)f (v)-5 b(alues,)31 b(except)g(for)f(SHISA)p 3146 2989 28 4 v 40 w(INIT)p 3386 2989 V 39 w(ERR)m(OR)390 3098 y(whic)m(h)j(indicates)h(a)f(problem)f(allo)s(cating)k(the)d(handle.)48 b(\(The)33 b(other)g(error)g(conditions)g(comes)390 3208 y(from)d(reading)g(the)h(\014les.\))390 3355 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(i\013)i(successful.)150 3567 y Fl(shisa)p 417 3567 37 5 v 55 w(init)p 656 3567 V 54 w(with)p 949 3567 V 53 w(paths)3350 3776 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_init_with_paths)f Ff(\()p Fi(Shisa)30 b(**)h Fe(dbh)p Fi(,)h(const)f(c)m(har)g(*)f Fe(file)p Ff(\))390 3885 y Fi(dbh)p Fw(:)39 b(p)s(oin)m(ter)31 b(to)g(library)f(handle)g(to)h(b)s(e)e(created.)390 4032 y Fi(\014le)5 b Fw(:)41 b(Filename)32 b(of)e(system)h(con\014guration,) g(or)f(NULL.)390 4179 y(Create)i(a)f(Shisa)g(library)f(handle,)h(using) g Fq(shisa\(\))p Fw(,)e(and)h(read)h(the)g(system)g(con\014guration)h (\014le)390 4289 y(indicated)e(lo)s(cation)h(\(or)e(the)g(default)h(lo) s(cation,)h(if)e Fq(NULL)p Fw(\).)40 b(The)28 b(paths)h(to)h(the)f (default)h(system)390 4399 y(con\014guration)h(\014le)f(is)h(decided)f (at)h(compile)g(time)g(\($sysconfdir/shisa.conf)7 b(\).)390 4545 y(The)30 b(handle)g(is)g(allo)s(cated)i(regardless)f(of)f(return)f (v)-5 b(alues,)31 b(except)g(for)f(SHISA)p 3146 4545 28 4 v 40 w(INIT)p 3386 4545 V 39 w(ERR)m(OR)390 4655 y(whic)m(h)j(indicates)h(a)f(problem)f(allo)s(cating)k(the)d(handle.)48 b(\(The)33 b(other)g(error)g(conditions)g(comes)390 4765 y(from)d(reading)g(the)h(\014les.\))390 4912 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(i\013)i(successful.)275 5121 y(The)c(default)h(con\014guration)h(\014le)f(is)g(t)m(ypically)i (read)e(automatically)j(b)m(y)d(calling)h Fq(shisa_init)p Fw(,)e(but)150 5230 y(if)34 b(y)m(ou)h(wish)e(to)i(man)m(ually)g (access)h(the)e(Shisa)g(con\014guration)h(\014le)f(functions,)h(here)g (is)f(the)g(complete)150 5340 y(in)m(terface.)p eop end %%Page: 229 235 TeXDict begin 229 234 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(229)150 299 y Fl(shisa)p 417 299 37 5 v 55 w(cfg)p 625 299 V 54 w(db)3350 493 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_cfg_db)c Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)f(*)h Fe(value)p Ff(\))390 602 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 735 y Fi(v)-5 b(alue)5 b Fw(:)41 b(string)31 b(with)f(database)h(de\014nition.)390 868 y(Setup)41 b(and)f(op)s(en)h(a)h(new)f(database.)74 b(The)41 b(syn)m(tax)h(of)g (the)f Fq(value)f Fw(parameter)i(is)f Fq(")p Fw(TYPE[)390 978 y(LOCA)-8 b(TION[)27 b(P)-8 b(ARAMETER]])p Fq(")p Fw(,)29 b(where)f(TYPE)f(is)h(one)h(of)f(the)g(supp)s(orted)e(database) j(t)m(yp)s(es)390 1087 y(\(e.g.,)35 b Fq(")p Fw(\014le)p Fq(")p Fw(\))e(and)f(LOCA)-8 b(TION)32 b(and)g(P)-8 b(ARAMETER)33 b(are)g(optional)h(strings)f(passed)f(to)i(the)390 1197 y(database)23 b(during)d(initialization.)41 b(Neither)23 b(TYPE)e(nor)h(LOCA)-8 b(TION)21 b(can)h(con)m(tain)h Fq(")e(")h Fw(\(SPC\),)390 1307 y(but)30 b(P)-8 b(ARAMETER)30 b(ma)m(y)-8 b(.)390 1440 y Fk(Return)30 b(V)-8 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(if)i(database)i(w)m(as)e(parsed)g (and)g(op)s(en)f(successfully)-8 b(.)150 1636 y Fl(shisa)p 417 1636 V 55 w(cfg)3350 1830 y Fw([F)g(unction])-3599 b Fg(int)53 b(shisa_cfg)48 b Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)f(*)h Fe(option)p Ff(\))390 1939 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m (y)g Fq(shisa\(\))p Fw(.)390 2072 y Fi(option)p Fw(:)41 b(string)31 b(with)f(shisa)g(library)g(option.)390 2205 y(Con\014gure)f(shisa)i(library)f(with)g(giv)m(en)h(option.)390 2338 y Fk(Return)f(V)-8 b(alue:)41 b Fw(Returns)30 b(SHISA)p 1619 2338 28 4 v 39 w(OK)g(if)g(option)h(w)m(as)g(v)-5 b(alid.)150 2535 y Fl(shisa)p 417 2535 37 5 v 55 w(cfg)p 625 2535 V 54 w(from)p 929 2535 V 55 w(\014le)3350 2729 y Fw([F)d(unction])-3599 b Fg(int)53 b(shisa_cfg_from_file)e Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)g(*)f Fe(cfg)p Ff(\))390 2838 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 2971 y Fi(cfg)8 b Fw(:)41 b(\014lename)31 b(to)g(read)f (con\014guration)h(from.)390 3104 y(Con\014gure)e(shisa)i(library)f (using)f(con\014guration)i(\014le.)390 3237 y Fk(Return)f(V)-8 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(i\013)i(successful.)150 3433 y Fl(shisa)p 417 3433 V 55 w(cfg)p 625 3433 V 54 w(default)p 1050 3433 V 55 w(system\014le)3350 3627 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shisa_cfg_default_syst)q(emf)q(ile)f Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Ff(\))390 3737 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 3870 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Return)30 b(system)g(con\014guration)h(\014lename.)275 4050 y(The)38 b(core)j(part)e(of)h(the)f(Shisa)g(in)m(terface)i(follo)m(ws.)69 b(The)39 b(t)m(ypical)i(pro)s(cedure)e(is)g(to)h(use)g Fq(shisa_)150 4159 y(principal_find)27 b Fw(to)k(v)m(erify)g(that)h(a)f (sp)s(eci\014c)f(principal)h(exists,)h(and)e(to)h(extract)h(some)g (information)150 4269 y(ab)s(out)j(it,)j(and)d(then)g(use)g Fq(shisa_keys_find)d Fw(to)k(get)h(the)f(cryptographic)g(k)m(eys)g(for) f(the)h(principal,)150 4379 y(usually)28 b(suppliying)g(some)g(hin)m (ts)h(as)f(to)h(whic)m(h)g(of)f(all)h(k)m(eys)g(y)m(ou)g(are)g(in)m (terested)g(in)g(\(e.g.,)h(k)m(ey)f(v)m(ersion)150 4488 y(n)m(um)m(b)s(er)g(and)h(encryption)g(algorithm)h(n)m(um)m(b)s(er\).) 150 4684 y Fl(shisa)p 417 4684 V 55 w(en)m(umerate)p 1033 4684 V 53 w(realms)3350 4878 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_enumerate_realm)q(s)e Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(c)m(har)f(***)g Fe(realms)p Fi(,)i(size)p 3000 4878 28 4 v 41 w(t)d(*)565 4988 y Fe(nrealms)p Ff(\))390 5097 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m (y)g Fq(shisa\(\))p Fw(.)390 5230 y Fi(realms)t Fw(:)48 b(P)m(oin)m(ter)36 b(to)e(newly)g(allo)s(cated)i(arra)m(y)f(of)f(newly) g(allo)s(cated)i(zero-terminated)g(UTF-8)390 5340 y(strings)30 b(indicating)h(name)g(of)f(realm.)p eop end %%Page: 230 236 TeXDict begin 230 235 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(230)390 299 y Fi(nrealms)t Fw(:)40 b(P)m(oin)m(ter)32 b(to)f(n)m(um)m(b)s(er)e(indicating)i(n)m (um)m(b)s(er)e(of)i(allo)s(cated)h(realm)f(strings.)390 437 y(Extract)g(a)g(list)h(of)e(all)i(realm)f(names)f(in)g(bac)m(k)m (end,)i(as)f(zero-terminated)h(UTF-8)f(strings.)41 b(The)390 547 y(caller)32 b(m)m(ust)e(deallo)s(cate)j(the)d(strings.)390 685 y Fk(Return)g(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISA)p 1601 685 28 4 v 39 w(OK)g(on)g(success,)h(or)f(error)g(co)s(de.)150 888 y Fl(shisa)p 417 888 37 5 v 55 w(en)m(umerate)p 1033 888 V 53 w(principals)3350 1089 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_enumerate_princ)q(ipal)q(s)f Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)f Fe(realm)p Fi(,)565 1199 y(c)m(har)h(***)h Fe(principals)p Fi(,)h(size)p 1657 1199 28 4 v 41 w(t)e(*)f Fe(nprincipals)p Ff(\))390 1308 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g (created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 1447 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm,)g(as)f(zero-terminated)i(UTF-8)g (string.)390 1585 y Fi(nprincipals)t Fw(:)40 b(P)m(oin)m(ter)31 b(to)g(n)m(um)m(b)s(er)e(indicating)j(n)m(um)m(b)s(er)d(of)h(allo)s (cated)j(realm)d(strings.)390 1724 y(Extract)k(a)f(list)h(of)f(all)h (principal)e(names)h(in)g(realm)g(in)g(bac)m(k)m(end,)h(as)f (zero-terminated)i(UTF-8)390 1833 y(strings.)41 b(The)29 b(caller)j(m)m(ust)e(deallo)s(cate)j(the)e(strings.)390 1972 y Fk(Return)k(v)-5 b(alue:)51 b Fw(Returns)34 b(SHISA)p 1620 1972 V 40 w(OK)g(on)h(success,)i(SHISA)p 2579 1972 V 40 w(NO)p 2758 1972 V 40 w(REALM)e(if)g(the)h(sp)s(eci\014ed)390 2081 y(realm)31 b(do)s(es)f(not)g(exist,)i(or)e(error)g(co)s(de.)150 2284 y Fl(shisa)p 417 2284 37 5 v 55 w(principal)p 943 2284 V 54 w(\014nd)3350 2485 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_principal_find)f Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)g Fe(realm)p Fi(,)h(const)565 2595 y(c)m(har)f(*)g Fe(principal)p Fi(,)i(Shisa)p 1581 2595 28 4 v 39 w(principal)e(*)f Fe(ph)p Ff(\))390 2704 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 2843 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 2981 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(get)g(information)g(on.)390 3119 y Fi(ph)p Fw(:)56 b(P)m(oin)m(ter)40 b(to)f(previously)g(allo)s (cated)h(principal)f(structure)f(to)h(\014ll)f(out)h(with)g (information)390 3229 y(ab)s(out)30 b(principal.)390 3367 y(Extract)h(information)g(ab)s(out)f(giv)m(en)h(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)390 3506 y Fk(Return)21 b(v)-5 b(alue:)36 b Fw(Returns)20 b Fq(SHISA_OK)f Fw(i\013)i(successful,)i Fq(SHISA_NO_REALM)17 b Fw(if)k(the)g(indicated)h(realm)390 3615 y(do)s(es)33 b(not)g(exist,)i Fq(SHISA_NO_PRINCIPAL)29 b Fw(if)k(the)g(indicated)h(principal)f(do)s(es)g(not)h(exist,)h(or)e (an)390 3725 y(error)d(co)s(de.)150 3928 y Fl(shisa)p 417 3928 37 5 v 55 w(principal)p 943 3928 V 54 w(up)s(date)3350 4129 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_principal_updat)q (e)e Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)f(*)h Fe(realm)p Fi(,)h(const)565 4238 y(c)m(har)f(*)g Fe(principal)p Fi(,)i(const)e(Shisa)p 1819 4238 28 4 v 39 w(principal)f(*)h Fe(ph)p Ff(\))390 4348 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 4486 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 4625 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(get)g(information)g(on.)390 4763 y Fi(ph)p Fw(:)40 b(P)m(oin)m(ter)31 b(to)g(principal)g(structure) e(with)h(information)h(to)g(store)g(in)f(database.)390 4902 y(Mo)s(dify)41 b(information)g(stored)g(for)g(giv)m(en)g(PRINCIP) -8 b(AL)p Fq(REALM)p Fw(.)71 b(Note)42 b(that)g(it)f(is)g(usually)g(a) 390 5011 y(go)s(o)s(d)31 b(idea)i(to)f(only)g(set)g(the)g(\014elds)f (in)g Fq(ph)g Fw(that)h(y)m(ou)g(actually)h(w)m(an)m(t)g(to)f(up)s (date.)44 b(Sp)s(eci\014cally)-8 b(,)390 5121 y(\014rst)24 b(calling)i Fq(shisa_principal_find\(\))18 b Fw(to)25 b(get)h(the)e(curren)m(t)g(information,)i(then)f(mo)s(difying)390 5230 y(one)j(\014eld,)g(and)g(calling)h Fq(shisa_principal_update\(\)) 21 b Fw(is)28 b(not)g(recommended)g(in)f(general,)j(as)390 5340 y(this)c(will)g(1\))g(o)m(v)m(erwrite)i(an)m(y)e(mo)s (di\014cations)g(made)g(to)g(other)g(\014elds)f(b)s(et)m(w)m(een)i(the) f(t)m(w)m(o)h(calls)g(\(b)m(y)p eop end %%Page: 231 237 TeXDict begin 231 236 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(231)390 299 y(other)29 b(pro)s(cesses\))h(and)e(2\))i(will)f(cause)h(all)g(v)-5 b(alues)30 b(to)g(b)s(e)e(written)h(again,)i(whic)m(h)e(ma)m(y)g (generate)390 408 y(more)i(o)m(v)m(erhead.)390 535 y Fk(Return)42 b(v)-5 b(alue:)64 b Fw(Returns)42 b(SHISA)p 1648 535 28 4 v 39 w(OK)f(if)i(successful,)i Fq(SHISA_NO_REALM)38 b Fw(if)k(the)g(indicated)390 645 y(realm)33 b(do)s(es)f(not)g(exist,)i Fq(SHISA_NO_PRINCIPAL)27 b Fw(if)32 b(the)h(indicated)g(principal)e(do) s(es)h(not)h(exist,)390 754 y(or)d(an)h(error)f(co)s(de.)150 938 y Fl(shisa)p 417 938 37 5 v 55 w(principal)p 943 938 V 54 w(add)3350 1120 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_principal_add)e Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)g(*)f Fe(realm)p Fi(,)i(const)f(c)m(har)565 1230 y(*)g Fe(principal)p Fi(,)i(const)e(Shisa)p 1619 1230 28 4 v 40 w(principal)f(*)g Fe(ph)p Fi(,)i(const)e(Shisa)p 2719 1230 V 40 w(k)m(ey)h(*)g Fe(key)p Ff(\))390 1339 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 1466 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 1593 y Fi(principal)t Fw(:)41 b(Name)32 b(of)f(principal)g(to)g(add,)g(ma)m(y)h(b)s(e)e Fq(NULL)g Fw(to)i(indicate)g(that)f(the)g Fq(realm)f Fw(should)390 1702 y(b)s(e)g(created,)h(in)f(whic)m(h)h(case)g Fq(ph)f Fw(and)g Fq(key)f Fw(are)i(not)f(used.)390 1829 y Fi(ph)p Fw(:)40 b(P)m(oin)m(ter)31 b(to)g(principal)g(structure)e (with)h(information)h(to)g(store)g(in)f(database.)390 1956 y Fi(k)m(ey)8 b Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(k)m(ey)g (structure)f(with)g(information)h(to)g(store)g(in)f(database.)390 2083 y(Add)f(giv)m(en)j(information)f(to)g(database)g(as)g(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)390 2210 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b(SHISA)p 1601 2210 V 39 w(OK)g(i\013)g (successfully)g(added,)g(or)h(an)f(error)g(co)s(de.)150 2394 y Fl(shisa)p 417 2394 37 5 v 55 w(principal)p 943 2394 V 54 w(remo)m(v)m(e)3350 2575 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_principal_remov)q(e)e Ff(\()p Fi(Shisa)31 b(*)f Fe(dbh)p Fi(,)i(const)f(c)m(har)f(*)h Fe(realm)p Fi(,)h(const)565 2685 y(c)m(har)f(*)g Fe(principal)p Ff(\))390 2794 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g (created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 2921 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f(principal)g(b)s(elongs)g(in.)390 3048 y Fi(principal)t Fw(:)38 b(Name)27 b(of)f(principal)g(to)h(remo)m (v)m(e,)h(ma)m(y)f(b)s(e)e Fq(NULL)g Fw(to)i(indicate)g(that)g(the)f Fq(realm)f Fw(itself)390 3158 y(should)k(b)s(e)h(remo)m(v)m(ed)h (\(requires)g(that)g(the)f(realm)h(to)g(b)s(e)f(empt)m(y\).)390 3285 y(Remo)m(v)m(e)i(all)f(information)g(stored)g(in)f(the)g(database) i(for)e(giv)m(en)h(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)390 3411 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(if)i(successful,)g(or)h(an)f(error)g(co)s(de.)150 3595 y Fl(shisa)p 417 3595 V 55 w(k)m(eys)p 703 3595 V 53 w(\014nd)3350 3777 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_keys_find)d Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)h(const)f(c)m(har)f(*)h Fe(realm)p Fi(,)h(const)f(c)m (har)g(*)565 3886 y Fe(principal)p Fi(,)i(const)e(Shisa)p 1543 3886 28 4 v 40 w(k)m(ey)g(*)g Fe(hint)p Fi(,)h(Shisa)p 2296 3886 V 39 w(k)m(ey)f(***)h Fe(keys)p Fi(,)g(size)p 3072 3886 V 41 w(t)e(*)h Fe(nkeys)p Ff(\))390 3996 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 4123 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f(principal)g(b)s(elongs)g(in.)390 4250 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(add)f (k)m(ey)h(for.)390 4377 y Fi(hin)m(t)r Fw(:)45 b(P)m(oin)m(ter)34 b(to)f(Shisa)f(k)m(ey)i(structure)e(with)g(hin)m(ts)h(on)f(matc)m(hing) i(the)f(k)m(ey)g(to)g(mo)s(dify)-8 b(,)33 b(ma)m(y)390 4486 y(b)s(e)d Fq(NULL)f Fw(to)i(matc)m(h)g(all)h(k)m(eys.)390 4613 y Fi(k)m(eys)t Fw(:)41 b(p)s(oin)m(ter)30 b(to)i(newly)e(allo)s (cated)i(arra)m(y)f(with)f(Shisa)g(k)m(ey)h(structures.)390 4740 y Fi(nk)m(eys)t Fw(:)41 b(p)s(oin)m(ter)30 b(to)h(n)m(um)m(b)s(er) e(of)i(newly)f(allo)s(cated)i(Shisa)e(k)m(ey)h(structures)f(in)g Fq(keys)p Fw(.)390 4867 y(Iterate)38 b(through)d(k)m(eys)i(for)g(giv)m (en)g(PRINCIP)-8 b(AL)p Fq(REALM)35 b Fw(and)g(extract)j(an)m(y)f(k)m (eys)g(that)g(matc)m(h)390 4976 y Fq(hint)p Fw(.)73 b(Not)43 b(all)g(elemen)m(ts)g(of)e Fq(hint)g Fw(need)g(to)i(b)s(e)e(\014lled)g (out,)k(only)d(use)g(the)f(\014elds)h(y)m(ou)g(are)390 5086 y(in)m(terested)33 b(in.)45 b(F)-8 b(or)32 b(example,)h(if)f(y)m (ou)g(w)m(an)m(t)h(to)f(extract)i(all)e(k)m(eys)h(with)e(an)h(et)m(yp)s (e)g(of)g(3)h(\(DES-)390 5195 y(CBC-MD5\),)f(set)f(the)g Fq(key)p Fw(-)p Fq(>)p Fw(et)m(yp)s(e)f(\014eld)g(to)h(3,)g(and)f(set)h (all)g(other)f(\014elds)g(to)h(0.)390 5322 y Fk(Return)f(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(i\013)i(successful,)h(or) f(an)g(error)g(co)s(de.)p eop end %%Page: 232 238 TeXDict begin 232 237 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(232)150 299 y Fl(shisa)p 417 299 37 5 v 55 w(k)m(ey)p 655 299 V 53 w(add)3350 499 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_key_add)d Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)f Fe(realm)p Fi(,)j(const)d(c)m(har)h(*)565 608 y Fe(principal)p Fi(,)i(const)e(Shisa)p 1543 608 28 4 v 40 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 718 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 856 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 993 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(add)f(k)m(ey)h(for.)390 1131 y Fi(k)m(ey)8 b Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(Shisa)f(k)m(ey)h (structure)f(with)g(k)m(ey)h(to)g(add.)390 1268 y(Add)e(k)m(ey)j(to)f (database)g(for)f(giv)m(en)i(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)390 1406 y Fk(Return)30 b(v)-5 b(alue:)41 b Fw(Returns)30 b Fq(SHISA_OK)e Fw(i\013)i(successful,)h(or)f(an)g(error)g(co)s(de.)150 1608 y Fl(shisa)p 417 1608 37 5 v 55 w(k)m(ey)p 655 1608 V 53 w(up)s(date)3350 1808 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_key_update)e Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)f Fe(realm)p Fi(,)i(const)f(c)m(har)g(*)565 1918 y Fe(principal)p Fi(,)i(const)e(Shisa)p 1543 1918 28 4 v 40 w(k)m(ey)g(*)g Fe(oldkey)p Fi(,)h(const)f(Shisa)p 2638 1918 V 40 w(k)m(ey)g(*)f Fe(newkey)p Ff(\))390 2027 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 2165 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 2303 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(remo)m(v)m(e)h(k)m(ey)f(for.) 390 2440 y Fi(oldk)m(ey)8 b Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(Shisa)f(k)m(ey)h(structure)f(with)g(hin)m(ts)h(on)f(matc)m(hing) h(the)g(k)m(ey)g(to)g(mo)s(dify)-8 b(.)390 2578 y Fi(newk)m(ey)8 b Fw(:)59 b(P)m(oin)m(ter)40 b(to)g(Shisa)f(k)m(ey)h(structure)f(with)g (new)g(v)-5 b(alues)40 b(for)f(the)g(k)m(ey)-8 b(,)43 b(note)d(that)g(all)390 2687 y(\014elds)30 b(are)h(used)e(\(and)h(not)h (just)f(the)g(ones)h(sp)s(eci\014ed)e(b)m(y)i Fq(oldkey)p Fw(\).)390 2825 y(Mo)s(dify)d(data)i(ab)s(out)e(a)h(k)m(ey)h(in)e(the)h (database,)h(for)f(the)g(giv)m(en)g(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)39 b(First)29 b(the)390 2935 y Fq(oldkey)37 b Fw(is)i(used)g(to)h(lo)s(cate)g(the)g(k)m(ey)f(to)h(up)s(date)f (\(similar)g(to)h Fq(shisa_keys_find\(\))p Fw(\),)d(then)390 3044 y(that)i(k)m(ey)h(is)e(mo)s(di\014ed)g(to)h(con)m(tain)h(whatev)m (er)g(information)f(is)f(stored)h(in)g Fq(newkey)p Fw(.)63 b(Not)40 b(all)390 3154 y(elemen)m(ts)30 b(of)e Fq(oldkey)f Fw(need)h(to)h(b)s(e)e(\014lled)h(out,)i(only)e(enough)g(as)h(to)g (iden)m(tify)f(the)h(k)m(ey)g(uniquely)-8 b(.)390 3263 y(F)g(or)34 b(example,)g(if)f(y)m(ou)g(w)m(an)m(t)g(to)h(mo)s(dify)e (the)h(information)g(stored)g(for)f(the)h(only)g(k)m(ey)h(with)e(an)390 3373 y(et)m(yp)s(e)f(of)g(3)g(\(DES-CBC-MD5\),)i(set)e(the)g Fq(key)p Fw(-)p Fq(>)p Fw(et)m(yp)s(e)f(\014eld)g(to)h(3,)h(and)e(set)h (all)g(other)g(\014elds)f(to)390 3483 y(0.)390 3620 y Fk(Return)h(v)-5 b(alue:)43 b Fw(Returns)31 b Fq(SHISA_OK)e Fw(on)i(success,)h Fq(SHISA_NO_KEY)c Fw(if)j(no)h(k)m(ey)g(could)f(b)s (e)g(iden-)390 3730 y(ti\014ed,)g(and)f Fq(SHISA_MULTIPLE_KEY_MATCH)24 b Fw(if)31 b(more)g(than)g(one)g(k)m(ey)g(matc)m(hed)h(the)f(giv)m(en)g (cri-)390 3839 y(teria,)h(or)e(an)g(error)g(co)s(de.)150 4042 y Fl(shisa)p 417 4042 37 5 v 55 w(k)m(ey)p 655 4042 V 53 w(remo)m(v)m(e)3350 4242 y Fw([F)-8 b(unction])-3599 b Fg(int)53 b(shisa_key_remove)e Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)f Fe(realm)p Fi(,)i(const)f(c)m(har)g(*)565 4351 y Fe(principal)p Fi(,)i(const)e(Shisa)p 1543 4351 28 4 v 40 w(k)m(ey)g(*)g Fe(key)p Ff(\))390 4461 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 4598 y Fi(realm)p Fw(:)41 b(Name)31 b(of)g(realm)g(the)f (principal)g(b)s(elongs)g(in.)390 4736 y Fi(principal)t Fw(:)40 b(Name)31 b(of)g(principal)f(to)h(remo)m(v)m(e)h(k)m(ey)f(for.) 390 4874 y Fi(k)m(ey)8 b Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(Shisa)f(k)m (ey)h(structure)f(with)g(hin)m(ts)g(on)h(matc)m(hing)g(the)g(k)m(ey)g (to)g(remo)m(v)m(e.)390 5011 y(Remo)m(v)m(e)48 b(a)f(k)m(ey)-8 b(,)51 b(matc)m(hing)d(the)e(hin)m(ts)g(in)g Fq(key)p Fw(,)k(from)c(the)g(Shisa)g(database)h(for)f(the)h(user)390 5121 y(PRINCIP)-8 b(AL)p Fq(REALM)p Fw(.)70 b(Not)42 b(all)g(elemen)m(ts)g(of)f Fq(key)f Fw(need)g(to)i(b)s(e)e(\014lled)g (out,)k(only)d(those)h(y)m(ou)390 5230 y(are)33 b(in)m(terested)g(in.) 46 b(F)-8 b(or)33 b(example,)h(if)e(y)m(ou)g(w)m(an)m(t)h(to)g(remo)m (v)m(e)h(the)f(only)f(k)m(ey)h(with)f(an)g(et)m(yp)s(e)h(of)390 5340 y(3)e(\(DES-CBC-MD5\),)h(set)f(the)g Fq(key)p Fw(-)p Fq(>)p Fw(et)m(yp)s(e)f(\014eld)g(to)h(3,)g(and)f(set)h(all)g(other)g (\014elds)f(to)h(0.)p eop end %%Page: 233 239 TeXDict begin 233 238 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(233)390 299 y Fk(Return)31 b(v)-5 b(alue:)43 b Fw(Returns)31 b Fq(SHISA_OK)e Fw(on)i(success,)h Fq(SHISA_NO_KEY)c Fw(if)j(no)h(k)m(ey)g(could)f(b)s(e)g(iden-)390 408 y(ti\014ed,)g(and)f Fq(SHISA_MULTIPLE_KEY_MATCH)24 b Fw(if)31 b(more)g(than)g(one)g(k)m(ey)g(matc)m(hed)h(the)f(giv)m(en)g (cri-)390 518 y(teria,)h(or)e(an)g(error)g(co)s(de.)150 720 y Fl(shisa)p 417 720 37 5 v 55 w(k)m(ey)p 655 720 V 53 w(free)3350 919 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shisa_key_free)49 b Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)h(Shisa)p 1965 919 28 4 v 39 w(k)m(ey)f(*)g Fe(key)p Ff(\))390 1029 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g (created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 1166 y Fi(k)m(ey)8 b Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(Shisa)f(k)m(ey)h(structure)f(to)h (deallo)s(cate.)390 1303 y(Deallo)s(cate)j(the)c(\014elds)g(of)h(a)f (Shisa)g(k)m(ey)h(structure,)g(and)e(the)i(structure)f(itself.)150 1505 y Fl(shisa)p 417 1505 37 5 v 55 w(k)m(eys)p 703 1505 V 53 w(free)3350 1705 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shisa_keys_free)c Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(Shisa)p 2017 1705 28 4 v 40 w(k)m(ey)g(**)g Fe(keys)p Fi(,)h(size)p 2748 1705 V 41 w(t)e Fe(nkeys)p Ff(\))390 1814 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g (created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 1951 y Fi(k)m(eys)t Fw(:)41 b(P)m(oin)m(ter)32 b(to)f(arra)m(y)g(with)f Fq(nkeys)f Fw(elemen)m(ts)j(of)e(k)m(eys.)390 2088 y Fi(nk)m(eys)t Fw(:)41 b(Num)m(b)s(er)29 b(of)h(k)m(ey)i(elemen)m(ts)f(in)f Fq(keys)g Fw(arra)m(y)-8 b(.)390 2226 y(Deallo)s(cate)46 b(eac)m(h)e(elemen)m(t)h(of)e(an)g(arra)m(y)g(with)g(Shisa)f(database)i (k)m(eys,)j(using)c Fq(shisa_key_)390 2335 y(free\(\))p Fw(.)275 2525 y(Error)26 b(handling)h(is)g(similar)h(to)g(that)g(for)f (Shishi)g(in)g(general)h(\(see)g(Section)h(5.17)g([Error)d(Handling],) 150 2634 y(page)36 b(221\),)j(i.e.,)f(y)m(ou)e(in)m(v)m(ok)m(e)h Fq(shisa_strerror)32 b Fw(on)j(the)h(in)m(teger)h(return)d(v)-5 b(alue)36 b(receiv)m(ed)h(b)m(y)f(some)150 2744 y(function,)30 b(if)h(the)f(return)f(v)-5 b(alue)31 b(is)g(non-zero.)41 b(Belo)m(w)32 b(is)e(the)h(complete)h(in)m(terface.)150 2946 y Fl(shisa)p 417 2946 37 5 v 55 w(strerror)3350 3145 y Fw([F)-8 b(unction])-3599 b Fg(const)54 b(char)f(*)g (shisa_strerror)d Ff(\()p Fi(in)m(t)31 b Fe(err)p Ff(\))390 3255 y Fi(err)7 b Fw(:)40 b(shisa)30 b(error)g(co)s(de)390 3392 y Fk(Return)f(v)-5 b(alue:)40 b Fw(Returns)29 b(a)g(p)s(oin)m(ter) h(to)g(a)f(statically)j(allo)s(cated)f(string)f(con)m(taining)h(a)e (descrip-)390 3501 y(tion)44 b(of)g(the)g(error)g(with)f(the)h(error)f (v)-5 b(alue)45 b Fq(err)p Fw(.)80 b(This)43 b(string)g(can)i(b)s(e)e (used)g(to)h(output)g(a)390 3611 y(diagnostic)32 b(message)f(to)g(the)g (user.)150 3813 y Fl(shisa)p 417 3813 V 55 w(info)3350 4012 y Fw([F)-8 b(unction])-3599 b Fg(void)54 b(shisa_info)48 b Ff(\()p Fi(Shisa)30 b(*)h Fe(dbh)p Fi(,)g(const)g(c)m(har)g(*)g Fe(format)p Fi(,)h Fe(...)p Ff(\))390 4122 y Fi(dbh)p Fw(:)39 b(Shisa)30 b(library)g(handle)g(created)h(b)m(y)g Fq(shisa\(\))p Fw(.)390 4259 y Fi(format)r Fw(:)41 b(prin)m(tf)30 b(st)m(yle)h(format)g(string.)41 b(...:)g(prin)m(t)30 b(st)m(yle)i(argumen)m(ts.)390 4396 y(Prin)m(t)e(informational)i (message)f(to)g(standard)f(error.)150 4633 y Fv(5.20)68 b(Generic)45 b(Securit)l(y)h(Service)150 4792 y Fw(As)35 b(an)f(alternativ)m(e)j(to)e(the)g(nativ)m(e)h(Shishi)e(programming)g (API,)h(it)g(is)f(p)s(ossible)g(to)i(program)e(Shishi)150 4902 y(through)25 b(the)h(Generic)g(Securit)m(y)g(Services)g(\(GSS\))f (API.)h(The)f(adv)-5 b(an)m(tage)27 b(of)f(using)f(GSS-API)g(in)g(y)m (our)150 5011 y(securit)m(y)32 b(application,)h(instead)f(of)g(the)f (nativ)m(e)i(Shishi)d(API,)i(is)f(that)h(it)g(will)g(b)s(e)f(easier)h (to)g(p)s(ort)f(y)m(our)150 5121 y(application)43 b(b)s(et)m(w)m(een)f (di\013eren)m(t)g(Kerb)s(eros)f(5)h(implemen)m(tations,)k(and)41 b(ev)m(en)h(b)s(ey)m(ond)f(Kerb)s(eros)g(5)150 5230 y(to)35 b(di\013eren)m(t)g(securit)m(y)h(systems,)g(that)f(supp)s(ort)e (GSS-API.)h(In)g(the)h(free)f(soft)m(w)m(are)j(w)m(orld,)e(ho)m(w)m(ev) m(er,)150 5340 y(almost)f(the)f(only)g(widely)f(used)g(securit)m(y)i (system)f(that)g(supp)s(orts)e(GSS-API)h(is)h(Kerb)s(eros)f(5,)i(so)f (the)p eop end %%Page: 234 240 TeXDict begin 234 239 bop 150 -116 a Fw(Chapter)30 b(5:)41 b(Programming)30 b(Man)m(ual)2130 b(234)150 299 y(last)34 b(adv)-5 b(an)m(tage)35 b(is)e(somewhat)g(academic.)50 b(But)33 b(if)g(y)m(ou)g(are)g(p)s(orting)g(applications)h(using)e (GSS-API)150 408 y(for)39 b(other)h(Kerb)s(eros)e(5)i(implemen)m (tations,)j(or)d(w)m(an)m(t)g(a)g(more)f(mature)h(and)e(stable)i(API)g (than)f(the)150 518 y(nativ)m(e)e(Shishi)e(API,)h(y)m(ou)h(ma)m(y)f (\014nd)f(using)g(Shishi's)g(GSS-API)h(in)m(terface)i(comp)s(elling.)58 b(Note)37 b(that)150 628 y(GSS-API)30 b(only)g(o\013er)h(basic)g (services,)g(for)f(more)h(adv)-5 b(anced)30 b(uses)g(y)m(ou)h(m)m(ust)f (use)g(the)h(nativ)m(e)h(API.)275 762 y(Since)e(the)g(GSS-API)g(is)g (not)g(sp)s(eci\014c)g(to)h(Shishi,)f(it)g(is)h(distributed)e(indep)s (enden)m(tly)g(from)h(Shishi.)150 872 y(F)-8 b(urther)29 b(information)g(on)g(the)h(GSS)e(pro)5 b(ject)30 b(can)f(b)s(e)g(found) f(at)i Fq(http://www.gnu.org/soft)o(ware)o(/)150 981 y(gss/)p Fw(.)p eop end %%Page: 235 241 TeXDict begin 235 240 bop 150 -116 a Fw(Chapter)30 b(6:)41 b(Ac)m(kno)m(wledgemen)m(ts)2251 b(235)150 299 y Ft(6)80 b(Ac)l(kno)l(wledgemen)l(ts)150 533 y Fw(Shishi)26 b(uses)g(Libtasn1)h (b)m(y)f(F)-8 b(abio)28 b(Fiorina,)h(Libgcrypt)d(and)g(Libgpg-error)h (b)m(y)f(W)-8 b(erner)27 b(Ko)s(c)m(h,)h(Libidn)150 643 y(b)m(y)i(Simon)g(Josefsson,)g(cvs2cl)i(b)m(y)e(Karl)h(F)-8 b(ogel,)33 b(and)c(gdo)s(c)i(b)m(y)f(Mic)m(hael)j(Zucc)m(hi.)275 777 y(Sev)m(eral)e(GNU)f(pac)m(k)-5 b(ages)32 b(simpli\014ed)d(dev)m (elopmen)m(t)j(considerably)-8 b(,)31 b(those)f(pac)m(k)-5 b(ages)32 b(include)e(Au-)150 887 y(to)s(conf,)h(Automak)m(e,)h(Libto)s (ol,)f(Gn)m(ulib,)g(Gettext,)h(Inden)m(t,)f(CVS,)e(T)-8 b(exinfo,)31 b(Help2man)g(and)f(Emacs.)275 1021 y(Sev)m(eral)49 b(p)s(eople)f(rep)s(orted)g(bugs,)53 b(sen)m(t)c(patc)m(hes)g(or)f (suggested)i(impro)m(v)m(emen)m(ts,)k(see)49 b(the)g(\014le)150 1131 y(THANKS.)275 1265 y(Nicolas)32 b(P)m(ouv)m(esle)g(wrote)e(the)h (section)h(ab)s(out)e(the)g(Kerb)s(eros)g(rsh/rlogin)g(proto)s(col.)275 1400 y(This)f(man)m(ual)i(b)s(orro)m(ws)e(text)j(from)e(the)g(Kerb)s (eros)f(5)i(sp)s(eci\014cation.)p eop end %%Page: 236 242 TeXDict begin 236 241 bop 150 -116 a Fw(App)s(endix)29 b(A:)h(Criticism)h(of)g(Kerb)s(eros)2067 b(236)150 299 y Ft(App)t(endix)52 b(A)81 b(Criticism)52 b(of)i(Kerb)t(eros)150 533 y Fw(The)43 b(in)m(ten)m(tion)i(with)e(this)g(section)h(is)g(to)g (discuss)e(v)-5 b(arious)44 b(problems)e(with)h(Kerb)s(eros)g(5,)k(so)d (y)m(ou)150 643 y(can)31 b(form)f(a)h(conscious)g(decision)g(ho)m(w)g (to)g(deplo)m(y)g(and)f(use)g(Shishi)g(correctly)i(in)e(y)m(our)h (organization.)150 752 y(Curren)m(tly)c(the)h(issues)g(b)s(elo)m(w)g (are)g(condensed,)g(and)g(mostly)g(serv)m(e)h(as)f(a)g(reminder)f(for)g (the)i(author)e(to)150 862 y(elab)s(orate)32 b(on)e(them.)275 996 y(No)g(encryption)h(sc)m(heme)g(with)f(securit)m(y)h(pro)s(of.)275 1131 y(No)f(standardized)h(API,)f(and)g(GSS)f(mec)m(hanism)i(lac)m(k)h (imp)s(ortan)m(t)f(functionalit)m(y)-8 b(.)275 1265 y(Lac)m(k)31 b(of)g(authorization)g(system.)41 b(\(krb5)p 1715 1265 28 4 v 40 w(kuserok\(\)\))275 1400 y(Host)31 b(to)g(realm)g(mapping)e (relies)i(on)g(insecure)f(DNS)g(or)h(static)h(con\014guration)e (\014les.)275 1534 y(Informational)g(mo)s(del)h(and)e(user)h(database)h (administration.)275 1669 y(Non-formal)f(sp)s(eci\014cation.)42 b(Unclear)31 b(on)f(the)h(et)m(yp)s(e)f(to)h(use)f(for)g(session)h(k)m (eys)g(\(et)m(yp)s(e)g(in)f(request)150 1778 y(or)38 b(database?\).)64 b(Unclear)39 b(on)f(ho)m(w)g(to)h(p)s(opulate)e(some) i(\\eviden)m(t")g(\014elds)f(\(e.g.,)j(cname)e(in)e(tic)m(k)m(ets)150 1888 y(for)31 b(AS-REQ,)g(or)g(crealm,)h(cname,)g(realm,)g(sname,)f (ctime)i(and)d(cusec)i(in)e(KRB-ERR)m(OR\).)i(Unclear)150 1998 y(error)23 b(co)s(de)g(seman)m(tics)i(\(e.g.,)i(logic)e(for)e (when)f(to)i(use)f(S)p 2074 1998 V 40 w(PRINCIP)-8 b(AL)p 2622 1998 V 39 w(UNKNO)m(WN)25 b(absen)m(t\).)39 b(Some)150 2107 y(KRB-ERR)m(OR)34 b(\014elds)f(are)h(required,)g(but)f(can't)h(b)s (e)f(usefully)h(p)s(opulated)f(in)g(some)h(situations,)i(and)150 2217 y(no)30 b(guidance)h(is)f(giv)m(en)i(on)e(what)g(they)h(should)e (con)m(tain.)275 2351 y(RF)m(C)37 b(1510/1510bis)k(incompatibilities.) 62 b(NULL)37 b(enct)m(yp)s(e)h(remo)m(v)m(ed)g(without)f(discussion,)i (and)150 2461 y(it)d(is)f(still)h(used)e(b)m(y)i(some)f(1964)i(GSSAPI)d (implemen)m(tations.)57 b(KRB)p 2630 2461 V 40 w(SAFE)35 b(text)h(\(3.4.1\))i(sa)m(ys)e(the)150 2570 y(c)m(hec)m(ksum)24 b(is)f(generated)i(using)d(the)i(session)f(or)g(sub-session)g(k)m(ey)-8 b(,)26 b(whic)m(h)d(con)m(tradicts)i(itself)f(\(compare)150 2680 y(section)46 b(3.2.6\))i(and)c(also)i(RF)m(C)g(1510,)k(whic)m(h)45 b(b)s(oth)g(allo)m(w)h(the)g(application)g(to)g(de\014ne)e(the)h(k)m (ey)-8 b(.)150 2790 y(V)g(eri\014cation)41 b(of)f(KRB)p 965 2790 V 40 w(SAFE)g(no)m(w)g(require)f(the)h(k)m(ey)h(to)f(b)s(e)f (compatible)i(with)f(the)g(\(sub-\)session)150 2899 y(k)m(ey)-8 b(,)32 b(in)e(1510)i(the)f(only)f(requiremen)m(t)h(w)m(as)f(that)h(it)g (w)m(as)g(collision)h(pro)s(of.)275 3034 y(Problems)22 b(with)h(RF)m(C)g(1510bis.)40 b(Uses)23 b(bign)m(um)g(INTEGER)g(for)f (TYPED-D)m(A)-8 b(T)g(A)25 b(and)e(AD-AND-)150 3143 y(OR.)275 3278 y(Problems)j(with)g(crypto)h(sp)s(eci\014cation.)40 b(It)27 b(uses)f(the)h(w)m(ord)f(\\random")h(man)m(y)g(times,)h(but)e (there)h(is)150 3387 y(no)c(discussion)f(on)h(the)g(randomness)f (requiremen)m(ts.)38 b(Practical)25 b(exp)s(erience)f(indicate)g(it)f (is)g(imp)s(ossible)150 3497 y(to)35 b(use)e(true)h(randomness)f(for)g (all)i(\\random")f(\014elds,)h(and)e(no)h(implemen)m(tation)h(do)s(es)f (this.)51 b(A)34 b(p)s(ost)150 3606 y(b)m(y)27 b(Don)g(Da)m(vis)i(on)e (the)g(ietf-krb-wg)g(list)h(tried)f(to)h(pro)m(vide)f(insigh)m(t,)h (but)f(the)g(information)g(w)m(as)h(nev)m(er)150 3716 y(added)i(to)h(the)f(sp)s(eci\014cation.)p eop end %%Page: 237 243 TeXDict begin 237 242 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(237)150 299 y Ft(App)t(endix)52 b(B)81 b(Proto)t(col)53 b(Extensions)150 551 y Fw(This)40 b(app)s(endix)f(sp)s(eci\014es)i(the)g(non-standard)f (proto)s(col)h(elemen)m(ts)i(implemen)m(ted)e(b)m(y)g(Shishi.)71 b(By)150 660 y(nature)36 b(of)f(b)s(eing)h(non-standard,)g(ev)m (erything)h(describ)s(ed)d(here)i(is)g(exp)s(erimen)m(tal.)58 b(Commen)m(ts)36 b(and)150 770 y(feedbac)m(k)31 b(is)g(appreciated.)150 1011 y Fv(B.1)67 b(ST)-11 b(AR)g(TTLS)43 b(protected)i(KDC)h(exc)l (hanges)150 1171 y Fw(Shishi)d(is)i(able)g(to)h(\\upgrade")e(TCP)g (comm)m(unications)i(with)e(the)h(KDC)g(to)g(use)f(the)h(T)-8 b(ransp)s(ort)150 1280 y(La)m(y)m(er)40 b(Securit)m(y)f(\(TLS\))f (proto)s(col.)66 b(The)38 b(TLS)g(proto)s(col)h(o\013ers)g(in)m(tegrit) m(y)h(and)e(priv)-5 b(acy)39 b(protected)150 1390 y(exc)m(hanges.)g (TLS)22 b(also)h(o\013ers)g(authen)m(tication)h(using)e(username)g(and) f(passw)m(ords,)j(X.509)g(certi\014cates,)150 1499 y(or)33 b(Op)s(enPGP)e(certi\014cates.)50 b(Kerb)s(eros)32 b(5)h(claims)h(to)f (o\013er)g(some)g(of)g(these)h(features,)f(although)h(it)f(is)150 1609 y(not)k(as)g(ric)m(h)h(as)f(the)g(TLS)f(proto)s(col.)61 b(An)37 b(inconclusiv)m(e)h(list)g(of)f(the)g(motiv)-5 b(ation)39 b(for)e(using)f(TLS)g(is)150 1719 y(giv)m(en)31 b(b)s(elo)m(w.)225 1859 y Fu(\017)60 b Fw(Serv)m(er)36 b(authen)m(tication)h(of)f(the)g(KDC)f(to)i(the)e(clien)m(t.)58 b(In)35 b(traditional)i(Kerb)s(eros)e(5,)i(KDC)f(au-)330 1968 y(then)m(tication)h(is)e(only)f(pro)m(v)m(ed)h(as)g(a)g(side)g (e\013ect)h(that)f(the)g(KDC)f(kno)m(ws)h(y)m(our)g(encryption)f(k)m (ey)330 2078 y(\(i.e.,)e(y)m(our)e(passw)m(ord\).)225 2216 y Fu(\017)60 b Fw(Clien)m(t)24 b(authen)m(tication)i(against)e (KDC.)g(Kerb)s(eros)e(5)i(assume)f(the)h(user)f(kno)m(ws)g(a)h(k)m(ey)g (\(usually)f(in)330 2325 y(the)29 b(form)g(of)g(a)h(passw)m(ord\).)40 b(Sometimes)29 b(external)h(factors)g(mak)m(e)g(this)f(hard)g(to)g (ful\014ll.)40 b(In)29 b(some)330 2435 y(situations,)e(users)e(are)g (equipp)s(ed)f(with)h(smart)g(cards)g(with)g(a)h(RSA)e(authen)m (tication)k(k)m(ey)-8 b(.)40 b(In)24 b(oth-)330 2544 y(ers,)i(users)f(ha)m(v)m(e)h(a)g(Op)s(enPGP)e(clien)m(t)j(on)e(their)g (desktop,)i(with)e(a)h(public)e(Op)s(enPGP)g(k)m(ey)i(kno)m(wn)330 2654 y(to)i(the)g(serv)m(er.)40 b(In)27 b(some)h(situations,)h(the)f(p) s(olicy)g(ma)m(y)g(b)s(e)f(that)i(passw)m(ord)e(authen)m(tication)i(ma) m(y)330 2763 y(only)h(b)s(e)g(done)g(through)g(SRP)-8 b(.)225 2901 y Fu(\017)60 b Fw(Kerb)s(eros)33 b(exc)m(hanges)i(are)g (priv)-5 b(acy)34 b(protected.)53 b(P)m(art)34 b(of)g(man)m(y)h(Kerb)s (eros)e(pac)m(k)m(ets)i(are)g(trans-)330 3011 y(fered)k(without)h(priv) -5 b(acy)40 b(protection)h(\(i.e.,)i(encryption\).)69 b(That)40 b(part)f(con)m(tains)i(information,)330 3120 y(suc)m(h)28 b(as)g(the)h(clien)m(t)g(principal)f(name,)h(the)f(serv)m (er)h(principal)e(name,)i(the)g(encryption)f(t)m(yp)s(es)g(sup-)330 3230 y(p)s(orted)f(b)m(y)g(the)h(clien)m(t,)i(the)e(lifetime)h(of)e (tic)m(k)m(ets,)k(etc.)41 b(Rev)m(ealing)30 b(suc)m(h)d(information)h (is,)g(in)g(some)330 3339 y(threat)j(mo)s(dels,)f(considered)g(a)h (problem.)40 b(Th)m(us,)30 b(this)g(enables)h(\\anon)m(ymit)m(y".)225 3477 y Fu(\017)60 b Fw(Prev)m(en)m(ts)40 b(do)m(wngrade)g(attac)m(ks)h (a\013ecting)g(encryption)f(t)m(yp)s(es.)67 b(The)39 b(encryption)h(t)m(yp)s(e)f(of)h(the)330 3586 y(tic)m(k)m(et)h(in)d (KDC-REQ)g(are)h(sen)m(t)f(in)g(the)h(clear)g(in)f(Kerb)s(eros)g(5.)65 b(This)37 b(allo)m(ws)j(an)e(attac)m(k)m(er)j(to)330 3696 y(replace)35 b(the)g(encryption)f(t)m(yp)s(e)g(with)g(a)h (compromised)f(mec)m(hanisms,)i(e.g.)53 b(56-bit)36 b(DES.)e(Since)330 3805 y(clien)m(ts)j(in)f(general)h(cannot)f(kno)m(w)g(the)g(encryption) f(t)m(yp)s(es)h(other)g(serv)m(ers)g(supp)s(ort,)g(it)g(is)g(di\016-) 330 3915 y(cult)h(for)g(the)g(clien)m(t)h(to)g(detect)g(if)f(there)g(w) m(as)g(a)g(man-in-the-middle)g(or)g(if)g(the)g(remote)h(serv)m(er)330 4025 y(simply)28 b(did)g(not)h(supp)s(ort)f(a)h(stronger)g(mec)m (hanism.)40 b(Clien)m(ts)30 b(ma)m(y)f(c)m(hose)h(to)g(refuse)e(56-bit) i(DES)330 4134 y(altogether,)j(but)c(in)i(some)f(en)m(vironmen)m(ts)h (this)f(leads)h(to)g(op)s(erational)h(di\016culties.)225 4272 y Fu(\017)60 b Fw(TLS)30 b(is)h(w)m(ell-pro)m(v)m(ed)i(and)e(the)g (proto)s(col)h(is)g(studied)e(b)m(y)h(man)m(y)h(parties.)43 b(This)31 b(is)g(an)g(adv)-5 b(an)m(tage)330 4381 y(in)30 b(net)m(w)m(ork)h(design,)f(where)f(TLS)g(is)h(often)h(already)g (assumed)e(as)h(part)g(of)g(the)g(solution)h(since)f(it)330 4491 y(is)25 b(used)g(to)h(protect)g(HTTP)-8 b(,)25 b(IMAP)-8 b(,)26 b(SMTP)f(etc.)40 b(In)24 b(some)i(threat)g(mo)s(dels,)g(the)g (designer)f(prefer)330 4600 y(to)30 b(reduce)e(the)h(n)m(um)m(b)s(er)f (of)h(proto)s(cols)g(that)h(can)f(h)m(urt)f(the)h(o)m(v)m(erall)i (system)e(securit)m(y)h(if)f(they)g(are)330 4710 y(compromised.)275 4878 y(Other)g(reasons)i(for)f(using)g(TLS)f(exists.)150 5083 y Fl(B.1.1)63 b(TCP/IP)40 b(transp)s(ort)i(with)f(TLS)g(upgrade)g (\(ST)-10 b(AR)g(TTLS\))150 5230 y Fw(RF)m(C)44 b(1510bis)g(requires)f (Kerb)s(eros)f(serv)m(ers)i(\(KDCs\))f(to)h(accept)h(TCP)e(requests.)79 b(Eac)m(h)44 b(request)150 5340 y(and)34 b(resp)s(onse)g(is)g (pre\014xed)g(b)m(y)g(a)h(4)g(o)s(ctet)h(in)m(teger)g(in)e(net)m(w)m (ork)i(b)m(yte)f(order,)g(indicating)h(the)f(length)p eop end %%Page: 238 244 TeXDict begin 238 243 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(238)150 299 y(of)37 b(the)h(pac)m(k)m(et.)63 b(The)37 b(high)g(bit)g(of)h(the)f(length)h(w) m(as)f(reserv)m(ed)h(for)f(future)f(expansion,)j(and)e(serv)m(ers)150 408 y(that)h(do)f(not)g(understand)f(ho)m(w)h(to)h(in)m(terpret)g(a)f (set)h(high)f(bit)g(m)m(ust)g(return)f(a)i Fq(KRB-ERROR)d Fw(with)i(a)150 518 y Fq(KRB_ERR_FIELD_TOOLONG)25 b Fw(and)k(close)j (the)f(TCP)e(stream.)275 649 y(The)22 b(TCP/IP)h(transp)s(ort)g(with)g (TLS)f(upgrade)h(\(ST)-8 b(AR)g(TTLS\))23 b(uses)g(this)g(reserv)m(ed)g (bit)h(as)g(follo)m(ws.)150 759 y(First)33 b(w)m(e)g(de\014ne)f(a)h (new)f(extensible)h(t)m(yp)s(ed)f(hole)h(for)g(Kerb)s(eros)e(5)i (messages,)h(b)s(ecause)f(w)m(e)g(used)f(the)150 869 y(only)26 b(reserv)m(ed)g(bit.)39 b(It)26 b(is)g(th)m(us)g(pruden)m(t)e (to)j(o\013er)f(future)f(extensions)i(on)e(our)h(prop)s(osal.)39 b(Secondly)25 b(w)m(e)150 978 y(reserv)m(e)34 b(t)m(w)m(o)h(v)-5 b(alues)34 b(in)g(this)g(new)f(t)m(yp)s(ed)g(hole,)i(and)f(describ)s (ed)e(ho)m(w)i(they)g(are)g(used)f(to)h(implemen)m(t)150 1088 y(ST)-8 b(AR)g(TTLS.)150 1281 y Fl(B.1.2)63 b(Extensible)40 b(t)m(yp)s(ed)h(hole)h(based)f(on)h(reserv)m(ed)f(high)g(bit)150 1428 y Fw(When)30 b(the)h(high)f(bit)g(is)h(set,)g(the)f(remaining)h (31)g(bits)f(of)h(the)g(4)f(o)s(ctets)i(are)f(treated)g(as)g(an)f (extensible)150 1537 y(t)m(yp)s(ed)38 b(hole,)k(and)c(th)m(us)g(form)g (a)h(31)g(bit)g(in)m(teger)h(en)m(umerating)f(v)-5 b(arious)39 b(extensions.)66 b(Eac)m(h)39 b(of)g(the)150 1647 y(v)-5 b(alues)27 b(indicate)h(a)g(sp)s(eci\014c)f(extended)g(op)s(eration)g (mo)s(de,)h(t)m(w)m(o)g(of)f(whic)m(h)g(are)g(used)g(and)f(de\014ned)g (here,)150 1756 y(and)g(the)g(rest)h(are)g(left)g(for)f(others)h(to)g (use.)39 b(If)26 b(the)g(KDC)g(do)h(not)f(understand)f(a)i(requested)f (extension,)150 1866 y(it)e(MUST)f(return)f(a)h Fq(KRB-ERROR)e Fw(with)i(a)h Fq(KRB_ERR_FIELD_TOOLONG)17 b Fw(v)-5 b(alue)24 b(\(pre\014xed)e(b)m(y)h(the)h(4)g(o)s(ctet)150 1976 y(length)31 b(in)m(teger,)h(with)e(the)g(high)g(bit)h(clear,)h(as)e (usual\))g(and)g(close)i(the)e(TCP)g(stream.)275 2107 y(Meaning)h(of)f(the)h(31)g(lo)m(w)m(er)h(bits)e(in)g(the)h(4)f(o)s (ctet)i(\014eld,)e(when)g(the)g(high)g(bit)h(is)f(set:)198 2238 y Fq(0)715 b(RESERVED.)198 2348 y(1)g(STARTTLS)46 b(requested)f(by)i(client.)198 2457 y(2)715 b(STARTTLS)46 b(request)g(accepted)f(by)i(server.)198 2567 y(3...2147483647)91 b(AVAILABLE)46 b(for)h(registration)d(\(via)j(bug-shishi@josefsson.or)o (g\).)198 2677 y(2147483648)283 b(RESERVED.)150 2869 y Fl(B.1.3)63 b(ST)-10 b(AR)g(TTLS)40 b(requested)i(b)m(y)e(clien)m(t)g (\(extension)i(mo)s(de)g(1\))150 3016 y Fw(When)22 b(this)h(is)g(sen)m (t)g(b)m(y)f(the)h(clien)m(t,)j(the)d(clien)m(t)h(is)f(requesting)f (the)h(serv)m(er)g(to)g(start)h(TLS)d(negotiation)k(on)150 3126 y(the)31 b(TCP)f(stream.)42 b(The)31 b(clien)m(t)h(MUST)e(NOT)h (start)g(TLS)f(negotiation)j(immediately)-8 b(.)44 b(Instead,)31 b(the)150 3236 y(clien)m(t)j(w)m(ait)f(for)f(either)h(a)g(KRB-ERR)m(OR) f(\(sen)m(t)h(normally)-8 b(,)34 b(pre\014xed)d(b)m(y)h(a)h(4)g(o)s (ctet)g(length)g(in)m(teger\))150 3345 y(indicating)f(the)f(serv)m(er)g (do)g(not)g(understand)e(the)i(set)g(high)g(bit,)g(or)g(4)g(o)s(ctet)i (whic)m(h)d(is)h(to)h(in)m(terpreted)150 3455 y(as)f(an)g(in)m(teger)h (in)e(net)m(w)m(ork)h(b)m(yte)h(order,)e(where)h(the)f(high)h(bit)g(is) f(set)h(and)g(the)f(remaining)h(31)h(bit)f(are)150 3564 y(in)m(terpreted)k(as)g(an)g(in)m(teger)h(sp)s(ecifying)f(the)g(\\ST)-8 b(AR)g(TTLS)34 b(request)h(accepted)i(b)m(y)d(serv)m(er".)56 b(In)34 b(the)150 3674 y(\014rst)21 b(case,)j(the)d(clien)m(t)i(infer)e (that)h(the)f(serv)m(er)h(do)f(not)h(understand)d(\(or)j(wish)e(to)i (supp)s(ort\))e(ST)-8 b(AR)g(TTLS,)150 3784 y(and)34 b(can)i(re-try)f(using)f(normal)h(TCP)-8 b(,)35 b(if)g(unprotected)g (Kerb)s(eros)f(5)h(exc)m(hanges)i(are)e(acceptable)i(to)150 3893 y(the)29 b(clien)m(t)i(p)s(olicy)-8 b(.)41 b(In)28 b(the)h(latter)i(case,)f(it)g(should)e(in)m(v)m(ok)m(e)j(TLS)d (negotiation)j(on)e(the)g(stream.)41 b(If)29 b(an)m(y)150 4003 y(other)i(data)g(is)f(receiv)m(ed,)i(the)f(clien)m(t)h(MUST)e (close)h(the)g(TCP)e(stream.)150 4196 y Fl(B.1.4)63 b(ST)-10 b(AR)g(TTLS)40 b(request)h(accepted)f(b)m(y)h(serv)m(er)g(\(extension)g (mo)s(de)h(2\))150 4343 y Fw(This)27 b(4)h(o)s(ctet)h(message)g(should) e(b)s(e)g(sen)m(t)i(b)m(y)e(the)h(serv)m(er)g(when)f(it)h(has)g(receiv) m(ed)h(the)f(previous)f(4)i(o)s(ctet)150 4452 y(message.)42 b(The)29 b(message)j(is)e(an)g(ac)m(kno)m(wledgmen)m(t)j(of)d(the)g (clien)m(t's)i(request)e(to)h(initiate)h(ST)-8 b(AR)g(TTLS)150 4562 y(on)30 b(the)h(c)m(hannel.)41 b(The)30 b(serv)m(er)g(MUST)g(then) h(in)m(v)m(ok)m(e)h(a)f(TLS)e(negotiation.)150 4755 y Fl(B.1.5)63 b(Pro)s(ceeding)42 b(after)e(successful)j(TLS)e (negotiation)150 4902 y Fw(If)27 b(the)g(TLS)g(negotiation)i(ended)e (successfully)-8 b(,)29 b(p)s(ossibly)d(also)i(considering)g(clien)m(t) h(or)e(serv)m(er)h(p)s(olicies,)150 5011 y(the)41 b(exc)m(hange)h (within)d(the)i(TLS)e(protected)j(stream)f(is)f(p)s(erformed)f(lik)m(e) j(normal)e(UDP)h(Kerb)s(eros)150 5121 y(5)f(exc)m(hanges,)j(i.e.,)f (there)e(is)f(no)g(TCP)g(4)g(o)s(ctet)i(length)e(\014eld)g(b)s(efore)g (eac)m(h)h(pac)m(k)m(et.)70 b(Instead)39 b(eac)m(h)150 5230 y(Kerb)s(eros)27 b(pac)m(k)m(et)j(MUST)e(b)s(e)g(sen)m(t)h(within) e(one)i(TLS)e(record,)i(so)f(the)h(application)g(can)g(use)f(the)g(TLS) 150 5340 y(record)i(length)h(as)g(the)f(Kerb)s(eros)g(5)g(pac)m(k)m(et) j(length.)p eop end %%Page: 239 245 TeXDict begin 239 244 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(239)150 299 y Fl(B.1.6)63 b(Pro)s(ceeding)42 b(after)e(failed)i(TLS)f(negotiation)150 446 y Fw(If)26 b(the)g(TLS)f(negotiation)k(fails,)f(p)s(ossibly)d(due)h (to)h(clien)m(t)g(or)g(serv)m(er)f(p)s(olicy)h(\(e.g.,)i(inadequate)e (supp)s(ort)150 555 y(of)g(encryption)g(t)m(yp)s(es)h(in)f(TLS,)f(or)h (lac)m(k)i(of)e(clien)m(t)i(or)e(serv)m(er)h(authen)m(tication\))h(the) f(en)m(tit)m(y)h(that)f(detect)150 665 y(the)g(failure)g(MUST)g (disconnected)g(the)g(connection.)42 b(It)28 b(is)g(exp)s(ected)g(that) h(an)m(y)f(error)f(messages)i(that)150 775 y(explain)i(the)f(error)g (condition)h(is)g(transfered)e(b)m(y)i(TLS.)150 970 y Fl(B.1.7)63 b(In)m(teraction)39 b(with)i(KDC)g(addresses)h(in)f(DNS)150 1117 y Fw(Administrators)i(for)g(a)g(KDC)g(ma)m(y)h(announce)f(the)g (KDC)g(address)f(b)m(y)h(placing)h(SR)-10 b(V)42 b(records)h(in)150 1226 y(DNS)32 b(for)f(the)h(realm,)h(as)f(describ)s(ed)e(in)i(`)p Fq(draft-ietf-krb-wg-krb-dn)o(s-l)o(ocat)o(e-03)o(.tx)o(t)p Fw('.)39 b(That)150 1336 y(do)s(cumen)m(t)28 b(men)m(tion)h(TLS,)e(but) h(do)g(not)g(reference)h(an)m(y)f(w)m(ork)h(that)f(describ)s(e)g(ho)m (w)g(KDCs)g(uses)g(TLS.)150 1446 y(Un)m(til)k(further)e(clari\014ed,)h (consider)g(the)g(TLS)f(\014eld)h(in)g(that)g(do)s(cumen)m(t)g(to)h (refer)f(to)g(implemen)m(tation)150 1555 y(supp)s(orting)e(this)h(ST)-8 b(AR)g(TTLS)29 b(proto)s(col.)150 1750 y Fl(B.1.8)63 b(Using)42 b(TLS)f(authen)m(tication)f(logic)h(in)g(Kerb)s(eros)150 1897 y Fw(The)23 b(serv)m(er)g(MA)-8 b(Y)25 b(consider)e(the)h(authen)m (tication)h(p)s(erformed)d(b)m(y)h(the)h(TLS)e(exc)m(hange)j(as)e (su\016cien)m(t)h(to)150 2007 y(issue)30 b(Kerb)s(eros)f(5)h(tic)m(k)m (ets)i(to)f(the)f(clien)m(t,)i(without)e(requiring,)g(e.g.,)h (pre-authen)m(tication.)43 b(Ho)m(w)m(ev)m(er,)150 2117 y(it)31 b(is)f(not)h(an)f(error)g(to)h(require)f(or)h(use)f(pre-authen) m(tication)i(as)f(w)m(ell.)275 2249 y(The)42 b(clien)m(t)i(ma)m(y)g (also)f(indicate)h(that)g(it)f(wishes)f(to)i(use)e(TLS)g(b)s(oth)g(for) h(authen)m(tication)i(and)150 2359 y(data)35 b(protection)g(b)m(y)f (using)g(the)g(`)p Fq(NULL)p Fw(')g(encryption)g(t)m(yp)s(e)g(in)g(its) g(request.)52 b(The)34 b(serv)m(er)g(can)h(decide)150 2468 y(from)27 b(its)h(lo)s(cal)h(p)s(olicy)f(whether)f(or)g(not)h (issuing)f(tic)m(k)m(ets)j(based)d(solely)i(on)f(TLS)e(authen)m (tication,)31 b(and)150 2578 y(whether)f(`)p Fq(NULL)p Fw(')h(encryption)g(within)f(TLS,)h(is)g(acceptable)i(or)e(not.)43 b(This)31 b(mo)s(de)f(is)h(curren)m(tly)g(under)150 2687 y(in)m(v)m(estigation.)150 2883 y Fl(B.1.9)63 b(Securit)m(y)40 b(considerations)150 3030 y Fw(Because)k(the)e(initial)i(tok)m(en)f(is) f(not)h(protected,)j(it)d(is)f(p)s(ossible)g(for)g(an)g(activ)m(e)j (attac)m(k)m(er)g(to)e(mak)m(e)150 3139 y(it)e(app)s(ear)f(to)h(the)g (clien)m(t)h(that)f(the)g(serv)m(er)f(do)h(not)g(supp)s(ort)d(this)j (extension.)72 b(It)40 b(is)h(up)e(to)i(clien)m(t)150 3249 y(con\014guration)25 b(to)g(disallo)m(w)h(non-TLS)d(connections,)k (if)d(this)h(vulnerabilit)m(y)g(is)f(deemed)h(unacceptable.)150 3358 y(F)-8 b(or)27 b(in)m(terop)s(erabilit)m(y)-8 b(,)29 b(w)m(e)d(suggest)h(the)f(default)g(b)s(eha)m(viour)f(should)g(b)s(e)h (to)g(allo)m(w)i(automatic)f(fallbac)m(k)150 3468 y(to)k(TCP)f(or)g (UDP)-8 b(.)275 3601 y(The)43 b(securit)m(y)j(considerations)f(of)f(b)s (oth)g(TLS)f(and)h(Kerb)s(eros)f(5)i(are)g(inherited.)82 b(Using)45 b(TLS)150 3710 y(for)32 b(authen)m(tication)i(and/or)e(data) h(protection)g(together)h(with)d(Kerb)s(eros)g(alter)j(the)e(authen)m (tication)150 3820 y(logic)k(fundamen)m(tally)-8 b(.)53 b(Th)m(us,)35 b(it)g(ma)m(y)g(b)s(e)e(that)i(ev)m(en)g(if)g(the)f(TLS)g (and)f(Kerb)s(eros)h(5)g(proto)s(cols)i(and)150 3929 y(implemen)m(tations)30 b(w)m(ere)e(secure,)h(the)g(com)m(bination)g (of)f(TLS)g(and)f(Kerb)s(eros)g(5)i(describ)s(ed)e(here)h(could)150 4039 y(b)s(e)i(insecure.)275 4171 y(No)42 b(c)m(hannel)g(bindings)f (are)h(pro)m(vided)g(in)f(the)i(Kerb)s(eros)d(messages.)77 b(It)42 b(is)g(an)f(op)s(en)h(question)150 4281 y(whether,)30 b(and)g(ho)m(w,)g(this)h(should)e(b)s(e)h(\014xed.)150 4510 y Fv(B.2)67 b(T)-11 b(elnet)46 b(encryption)f(with)g(AES-CCM)150 4669 y Fw(This)31 b(app)s(endix)f(describ)s(e)g(ho)m(w)i(Shishi)e(use)h (the)h(Adv)-5 b(anced)31 b(Encryption)g(Standard)f(\(AES\))h(encryp-) 150 4779 y(tion)37 b(algorithm)g(in)g(Coun)m(ter)f(with)g(CBC-MA)m(C)h (mo)s(de)f(\(RF)m(C)h(3610\))i(with)d(the)g(telnet)i(encryption)150 4888 y(option)31 b(\(RF)m(C)g(2946\).)150 5083 y Fl(B.2.1)63 b(Command)41 b(Names)g(and)g(Co)s(des)150 5230 y Fq(Encryption)k(Type)p eop end %%Page: 240 246 TeXDict begin 240 245 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(240)436 299 y Fq(AES_CCM)619 b(12)150 518 y(Suboption)45 b(Commands)436 737 y(AES_CCM_INFO)427 b(1)436 847 y(AES_CCM_INFO_OK)283 b(2)436 956 y(AES_CCM_INFO_BAD)235 b(3)150 1165 y Fl(B.2.2)63 b(Command)41 b(Meanings)293 1312 y Fq(IAC)47 b(SB)g(ENCRYPT)f(IS)h (AES_CCM)f(AES_CCM_INFO)f()h()h()f(IAC)h(SE)150 1456 y Fw(The)27 b(sender)f(of)i(this)f(command)g(select)i(desired)e(M) g(and)g(L)g(parameters,)h(and)f(nonce,)i(as)e(describ)s(ed)f(in)150 1566 y(RF)m(C)j(3610,)i(and)d(sends)g(it)i(to)f(the)g(other)g(side)g (of)g(the)g(connection.)41 b(The)28 b(parameters)i(and)e(the)h(nonce) 150 1675 y(are)j(sen)m(t)g(in)f(clear)h(text.)45 b(Only)31 b(the)g(side)g(of)h(the)g(connection)g(that)g(is)g(WILL)f(ENCR)-8 b(YPT)31 b(ma)m(y)h(send)150 1785 y(the)f(AES)p 494 1785 28 4 v 39 w(CCM)p 748 1785 V 40 w(INF)m(O)g(command.)293 1929 y Fq(IAC)47 b(SB)g(ENCRYPT)f(REPLY)g(AES_CCM)g(AES_CCM_INFO_BAD)e (IAC)j(SE)275 2073 y Fw(The)40 b(sender)g(of)i(this)e(command)h(reject) h(the)f(parameters)h(receiv)m(ed)g(in)f(the)g(AES)p 3233 2073 V 40 w(CCM)p 3488 2073 V 39 w(INF)m(O)150 2182 y(command.)121 b(Only)56 b(the)i(side)f(of)g(the)g(connection)i(that)e(is)h(DO)f(ENCR) -8 b(YPT)57 b(ma)m(y)g(send)g(the)150 2292 y(AES)p 337 2292 V 40 w(CCM)p 592 2292 V 39 w(INF)m(O)p 859 2292 V 41 w(BAD)33 b(command.)45 b(The)31 b(command)h(MUST)f(b)s(e)h(sen)m (t)g(if)g(the)g(nonce)g(\014eld)g(length)150 2401 y(do)s(es)d(not)h (matc)m(h)h(the)f(selected)h(v)-5 b(alue)30 b(for)f(L.)h(The)f(command) h(MA)-8 b(Y)30 b(b)s(e)f(sen)m(t)i(if)e(the)h(receiv)m(er)h(do)f(not) 150 2511 y(accept)42 b(the)f(parameters)f(for)h(reason)f(suc)m(h)h(as)f (p)s(olicy)-8 b(.)72 b(No)41 b(capabilit)m(y)h(is)f(pro)m(vided)f(to)h (negotiate)150 2621 y(these)31 b(parameters.)293 2765 y Fq(IAC)47 b(SB)g(ENCRYPT)f(REPLY)g(AES_CCM)g(AES_CCM_INFO_OK)e(IAC)j (SE)275 2909 y Fw(The)34 b(sender)g(of)h(this)g(command)f(accepts)i (the)f(parameters)h(receiv)m(ed)g(in)e(the)h(AES)p 3233 2909 V 40 w(CCM)p 3488 2909 V 39 w(INF)m(O)150 3018 y(command.)121 b(Only)56 b(the)i(side)f(of)g(the)g(connection)i(that)e(is)h(DO)f(ENCR) -8 b(YPT)57 b(ma)m(y)g(send)g(the)150 3128 y(AES)p 337 3128 V 40 w(CCM)p 592 3128 V 39 w(INF)m(O)p 859 3128 V 41 w(BAD)36 b(command.)55 b(The)35 b(command)g(MUST)f(NOT)h(b)s(e)g (sen)m(t)g(if)h(the)f(nonce)g(\014eld)150 3237 y(length)c(do)s(es)f (not)g(matc)m(h)i(the)e(selected)i(v)-5 b(alue)31 b(for)f(L.)150 3446 y Fl(B.2.3)63 b(Implemen)m(tation)40 b(Rules)150 3593 y Fw(Once)21 b(a)h(AES)p 627 3593 V 39 w(CCM)p 881 3593 V 40 w(INF)m(O)p 1149 3593 V 40 w(OK)f(command)g(has)g(b)s(een)f (receiv)m(ed,)25 b(the)c(WILL)g(ENCR)-8 b(YPT)21 b(side)g(of)h(the)150 3703 y(connection)32 b(should)e(do)g(k)m(eyid)i(negotiation)h(using)d (the)h(ENC)p 2333 3703 V 40 w(KEYID)f(command.)42 b(Once)30 b(the)h(k)m(eyid)150 3812 y(negotiation)j(has)d(successfully)g(iden)m (ti\014ed)g(a)h(common)g(k)m(eyid,)g(then)f(ST)-8 b(AR)g(T)31 b(and)g(END)g(commands)150 3922 y(ma)m(y)c(b)s(e)e(sen)m(t)i(b)m(y)f (the)g(side)g(of)g(the)h(connection)g(that)g(is)f(WILL)g(ENCR)-8 b(YPT.)26 b(Data)h(will)g(b)s(e)e(encrypted)150 4031 y(using)k(the)g(AES-CCM)g(algorithm,)i(with)e(the)h(negotiated)h(nonce) f(and)e(parameters)i(M)g(and)e(L.)i(After)150 4141 y(eac)m(h)39 b(successful)e(encryption)h(and)f(decryption,)i(the)f(nonce)g(is)g (treated)g(as)g(an)g(in)m(teger)h(in)e(net)m(w)m(ork)150 4251 y(b)m(yte)31 b(order,)f(and)g(incremen)m(ted)h(b)m(y)f(one.)275 4395 y(If)i(encryption)h(\(decryption\))h(is)f(turned)g(o\013)g(and)g (bac)m(k)h(on)f(again,)i(and)e(the)g(same)h(k)m(eyid)f(is)h(used)150 4504 y(when)h(re-starting)j(the)e(encryption)h(\(decryption\),)h(the)f (in)m(terv)m(ening)g(clear)h(text)f(m)m(ust)f(not)h(c)m(hange)150 4614 y(the)28 b(state)h(of)f(the)g(encryption)f(\(decryption\))i(mac)m (hine.)40 b(In)27 b(particular,)i(the)f(AES-CCM)f(nonce)h(m)m(ust)150 4723 y(not)j(b)s(e)e(re-set.)275 4867 y(If)i(a)g(ST)-8 b(AR)g(T)32 b(command)f(is)h(sen)m(t)g(\(receiv)m(ed\))h(with)e(a)h (di\013eren)m(t)g(k)m(eyid,)h(the)f(encryption)f(\(decryp-)150 4977 y(tion\))26 b(mac)m(hine)h(m)m(ust)e(b)s(e)g(re-initialized)i (immediately)g(follo)m(wing)g(the)f(end)f(of)g(the)h(ST)-8 b(AR)g(T)25 b(command)150 5086 y(with)d(the)g(new)g(k)m(ey)h(and)f(the) g(parameters)h(sen)m(t)f(\(receiv)m(ed\))j(in)d(the)g(last)h(AES)p 2802 5086 V 40 w(CCM)p 3057 5086 V 39 w(INF)m(O)g(command.)275 5230 y(If)33 b(a)g(new)g(AES)p 824 5230 V 40 w(CCM)p 1079 5230 V 40 w(INF)m(O)g(command)h(is)f(sen)m(t)h(\(receiv)m(ed\),)j (and)32 b(encryption)i(\(decryption\))g(is)150 5340 y(enabled,)e(the)f (encryption)g(\(decryption\))h(mac)m(hine)g(m)m(ust)f(b)s(e)g (re-initialized)i(immediately)f(follo)m(wing)p eop end %%Page: 241 247 TeXDict begin 241 246 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(241)150 299 y(the)37 b(end)e(of)i(the)f(AES)p 949 299 28 4 v 40 w(CCM)p 1204 299 V 40 w(INF)m(O)g(command)h(with)f(the)g(new)g(nonce)h(and)e (parameters,)k(and)d(the)150 408 y(k)m(eyid)31 b(sen)m(t)g(\(receiv)m (ed\))h(in)e(the)h(last)g(ST)-8 b(AR)g(T)30 b(command.)275 556 y(If)39 b(encryption)i(\(decryption\))g(is)f(not)h(enabled)f(when)g (a)h(AES)p 2508 556 V 39 w(CCM)p 2762 556 V 40 w(INF)m(O)g(command)f (is)g(sen)m(t)150 666 y(\(receiv)m(ed\),)25 b(the)c(encryption)f (\(decryption\))h(mac)m(hine)h(m)m(ust)e(b)s(e)g(re-)h(initialized)h (after)g(the)e(next)h(ST)-8 b(AR)g(T)150 775 y(command,)43 b(with)d(the)h(k)m(eyid)g(sen)m(t)g(\(receiv)m(ed\))h(in)e(that)h(ST)-8 b(AR)g(T)40 b(command,)j(and)d(the)h(nonce)g(and)150 885 y(parameters)31 b(sen)m(t)g(\(receiv)m(ed\))h(in)e(this)g(AES)p 1700 885 V 40 w(CCM)p 1955 885 V 40 w(INF)m(O)g(command.)275 1033 y(A)m(t)e(all)h(times)g(MUST)e(eac)m(h)j(end)d(mak)m(e)i(sure)e (that)i(a)f(AES-CCM)f(nonce)i(is)f(not)g(used)f(t)m(wice)i(under)150 1142 y(the)i(same)f(encryption)h(k)m(ey)-8 b(.)42 b(The)29 b(rules)h(ab)s(o)m(v)m(e)i(help)e(accomplish)h(this)f(in)g(an)h(in)m (terop)s(erable)g(w)m(a)m(y)-8 b(.)150 1355 y Fl(B.2.4)63 b(In)m(tegration)40 b(with)h(the)f(A)m(UTHENTICA)-10 b(TION)40 b(telnet)h(option)150 1502 y Fq(<<)p Fw(This)29 b(section)j(is)e(sligh)m(tly)i(complicated.)42 b(Can't)31 b(w)m(e)f(simplify)g(this?)p Fq(>>)275 1650 y Fw(As)i(noted)g(in)g(the) h(telnet)g(ENCR)-8 b(YPTION)32 b(option)h(sp)s(eci\014cations,)g(a)g(k) m(eyid)g(v)-5 b(alue)33 b(of)f(zero)h(indi-)150 1759 y(cates)d(the)e(default)g(encryption)g(k)m(ey)-8 b(,)30 b(as)e(migh)m(t)h(b)s(e)f(deriv)m(ed)g(from)g(the)g(telnet)h(A)m (UTHENTICA)-8 b(TION)150 1869 y(option.)51 b(If)33 b(the)h(default)g (encryption)f(k)m(ey)i(negotiated)h(as)e(a)g(result)f(of)h(the)g (telnet)h(A)m(UTHENTICA-)150 1978 y(TION)40 b(option)h(con)m(tains)i (less)e(than)f(32)i(b)m(ytes)f(\(corresp)s(onding)g(to)g(t)m(w)m(o)h (128)h(bit)d(k)m(eys\),)45 b(then)c(the)150 2088 y(AES)p 337 2088 V 40 w(CCM)28 b(option)h(MUST)f(NOT)g(b)s(e)g(o\013ered)h(or)g (used)f(as)h(a)g(v)-5 b(alid)29 b(telnet)h(encryption)e(option.)41 b(F)-8 b(ur-)150 2198 y(thermore,)34 b(dep)s(ending)d(on)i(p)s(olicy)g (for)g(k)m(ey)h(lengths,)g(the)f(AES)p 2403 2198 V 39 w(CCM)g(option)g(MA)-8 b(Y)34 b(b)s(e)e(disabled)h(if)150 2307 y(the)28 b(default)h(encryption)f(k)m(ey)h(con)m(tain)h(less)e (than)g(48)i(b)m(ytes)e(\(for)h(t)m(w)m(o)g(192)h(bit)e(k)m(eys\),)i (or)e(less)h(than)f(64)150 2417 y(b)m(ytes)j(\(for)f(t)m(w)m(o)i(256)g (bit)e(k)m(eys\),)i(as)e(w)m(ell.)275 2565 y(The)i(a)m(v)-5 b(ailable)35 b(encrypt)d(k)m(ey)i(data)f(is)g(divided)f(on)g(t)m(w)m(o) i(halv)m(es,)h(where)d(the)h(\014rst)f(half)h(is)f(used)g(to)150 2674 y(encrypt)27 b(data)g(sen)m(t)h(from)f(the)g(serv)m(er)g (\(decrypt)g(data)h(receiv)m(ed)g(b)m(y)f(the)g(clien)m(t\),)j(and)d (the)g(second)g(half)150 2784 y(is)j(used)g(to)h(encrypt)f(data)h(sen)m (t)g(from)f(the)h(clien)m(t)h(\(decrypt)e(data)h(receiv)m(ed)h(b)m(y)e (the)h(serv)m(er\).)275 2932 y(Note)g(that)h(the)e(ab)s(o)m(v)m(e)i (algorithm)g(assumes)e(that)h(the)g(A)m(UTHENTICA)-8 b(TION)30 b(mec)m(hanism)h(gen-)150 3041 y(erate)45 b(k)m(eying)h (material)f(suitable)g(for)f(AES-CCM)g(as)g(used)g(in)g(this)g(sp)s (eci\014cation.)83 b(This)43 b(is)i(not)150 3151 y(necessarily)33 b(true)f(in)g(general,)i(but)d(w)m(e)i(sp)s(ecify)f(this)g(b)s(eha)m (viour)g(as)g(the)g(default)h(since)f(it)h(is)f(true)g(for)150 3260 y(most)27 b(authen)m(tication)i(systems)e(in)g(p)s(opular)e(use)i (to)s(da)m(y)-8 b(.)40 b(New)27 b(telnet)i(A)m(UTHENTICA)-8 b(TION)26 b(mec)m(h-)150 3370 y(anisms)i(ma)m(y)i(sp)s(ecify)e (alternativ)m(e)k(metho)s(ds)c(for)h(determining)f(the)h(k)m(eys)h(to)g (b)s(e)e(used)g(for)h(this)f(cipher)150 3479 y(suite)j(in)f(their)h(sp) s(eci\014cation,)h(if)e(the)h(session)g(k)m(ey)g(negotiated)i(b)m(y)e (that)g(authen)m(tication)i(mec)m(hanism)150 3589 y(is)d(not)h(a)g(DES) f(k)m(ey)h(and)f(where)g(this)g(algorithm)h(ma)m(y)g(not)g(b)s(e)f (safely)h(used.)275 3737 y(Kerb)s(eros)c(5)h(authen)m(tication)j (clari\014cation:)41 b(The)28 b(k)m(ey)h(used)e(to)i(encrypt)f(data)h (from)f(the)g(clien)m(t)i(to)150 3846 y(the)g(serv)m(er)f(is)g(tak)m (en)i(from)e(the)g(sub-session)g(k)m(ey)h(in)f(the)g(AP-REQ.)h(The)f(k) m(ey)h(used)e(to)i(decrypt)f(data)150 3956 y(from)35 b(the)g(serv)m(er)h(to)g(the)f(clien)m(t)i(is)e(tak)m(en)i(from)e(the)g (sub-session)g(k)m(ey)h(in)f(the)g(AP-REP)-8 b(.)36 b(If)f(m)m(utual) 150 4066 y(authen)m(tication)25 b(is)f(not)f(negotiated,)k(the)d(k)m (ey)g(used)e(to)i(encrypt)f(data)h(from)f(the)g(clien)m(t)i(to)f(the)f (serv)m(er)h(is)150 4175 y(tak)m(en)i(from)f(the)h(session)f(k)m(ey)h (in)f(the)h(tic)m(k)m(et,)j(and)24 b(the)i(k)m(ey)g(used)e(to)i (decrypt)f(data)h(from)f(the)h(serv)m(er)f(to)150 4285 y(the)30 b(clien)m(t)h(is)f(tak)m(en)h(from)e(the)h(sub-session)f(k)m (ey)i(in)f(the)g(AP-REQ.)f(Lea)m(ving)i(the)f(AP-REQ)g(sub-k)m(ey)150 4394 y(\014eld)g(empt)m(y)h(MUST)f(disable)g(the)h(AES)p 1570 4394 V 39 w(CCM)f(option.)150 4607 y Fl(B.2.5)63 b(Securit)m(y)40 b(Considerations)150 4754 y Fw(The)26 b(proto)s(col)h(m)m(ust)f(b)s(e)f(prop)s(erly)g(and)h(securely)g (implemen)m(ted.)40 b(F)-8 b(or)27 b(example,)h(an)e(implemen)m(tation) 150 4863 y(should)f(not)g(b)s(e)g(vulnerable)g(to)i(v)-5 b(arious)25 b(implemen)m(tation-sp)s(eci\014c)i(attac)m(ks)h(suc)m(h)d (as)h(bu\013er)f(o)m(v)m(er\015o)m(ws)150 4973 y(or)30 b(side-c)m(hannel)h(analysis.)275 5121 y(W)-8 b(e)36 b(wish)f(to)h(rep)s(eat)g(the)g(suggestion)g(from)g(RF)m(C)f(2946,)k (to)e(in)m(v)m(estigate)h(in)e(a)g(ST)-8 b(AR)g(TTLS)34 b(ap-)150 5230 y(proac)m(h)28 b(for)f(T)-8 b(elnet)28 b(encryption)f(\(and)g(also)i(authen)m(tication\),)h(when)d(the)g (securit)m(y)h(lev)m(el)h(pro)m(vided)e(b)m(y)150 5340 y(this)j(sp)s(eci\014cation)h(is)g(not)f(adequate.)p eop end %%Page: 242 248 TeXDict begin 242 247 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(242)150 299 y Fl(B.2.5.1)63 b(T)-10 b(elnet)41 b(Encryption)g(Proto)s(col)g(Securit)m (y)f(Considerations)150 446 y Fw(The)30 b(securit)m(y)h(consideration)g (of)g(the)f(T)-8 b(elnet)32 b(encryption)e(proto)s(col)h(are)g (inherited.)275 602 y(It)g(should)g(b)s(e)g(noted)h(that)h(the)e(it)i (is)f(up)e(to)j(the)f(authen)m(tication)i(proto)s(col)e(used,)g(if)g (an)m(y)-8 b(,)33 b(to)f(bind)150 712 y(the)f(authen)m(ticit)m(y)h(of)f (the)f(p)s(eers)g(to)h(a)g(sp)s(eci\014c)f(session.)275 868 y(The)h(T)-8 b(elnet)33 b(encryption)f(proto)s(col)g(do)s(es)g (not,)h(in)e(general,)j(protect)f(against)g(p)s(ossibly)e(malicious)150 978 y(do)m(wngrading)j(to)g(an)m(y)g(m)m(utually)h(acceptable,)i(but)c (not)h(preferred,)g(encryption)g(t)m(yp)s(e.)51 b(This)33 b(places)150 1087 y(a)g(requiremen)m(t)h(on)f(eac)m(h)h(p)s(eer)e(to)i (only)g(accept)g(encryption)f(t)m(yp)s(es)g(it)h(trust)e(fully)-8 b(.)49 b(In)33 b(other)g(w)m(ords,)150 1197 y(the)40 b(T)-8 b(elnet)42 b(encryption)e(proto)s(col)h(do)f(not)g(guaran)m(tee) i(that)f(the)f(strongest)h(m)m(utually)g(acceptable)150 1307 y(encryption)30 b(t)m(yp)s(e)h(is)f(alw)m(a)m(ys)i(selected.)150 1528 y Fl(B.2.5.2)63 b(AES-CCM)40 b(Securit)m(y)g(Considerations)150 1675 y Fw(The)c(in)m(tegrit)m(y)j(and)d(priv)-5 b(acy)37 b(claims)h(are)f(inherited)g(from)f(AES-CCM.)g(In)h(particular,)i(the)e (imple-)150 1784 y(men)m(tation)42 b(m)m(ust)e(mak)m(e)i(sure)e(a)h (nonce)f(is)h(not)g(used)e(more)i(than)f(once)i(together)g(with)e(the)h (same)150 1894 y(k)m(ey)-8 b(.)275 2050 y(F)g(urthermore,)27 b(the)g(encryption)g(k)m(ey)g(is)g(assumed)f(to)i(b)s(e)e(random,)h (i.e.,)i(it)e(should)f(not)h(b)s(e)f(p)s(ossible)150 2160 y(to)31 b(guess)f(it)h(with)e(probabilit)m(y)i(of)f(success)h (higher)e(than)h(guessing)h(an)m(y)f(uniformly)f(selected)j(random)150 2269 y(k)m(ey)-8 b(.)42 b(RF)m(C)31 b(1750)h(giv)m(es)f(an)g(o)m(v)m (erview)h(of)e(issues)g(and)g(recommendations)h(related)g(to)g (randomness.)150 2490 y Fl(B.2.6)63 b(Ac)m(kno)m(wledgmen)m(ts)150 2637 y Fw(This)38 b(do)s(cumen)m(t)g(is)g(based)g(on)g(the)h(v)-5 b(arious)38 b(T)-8 b(elnet)40 b(Encryption)d(RF)m(Cs)i(\(RF)m(C)g (2946,)j(RF)m(C)d(2947,)150 2747 y(RF)m(C)31 b(2948,)h(RF)m(C)f(2952)h (and)e(RF)m(C)g(2953\).)150 3012 y Fv(B.3)67 b(Kerb)t(erized)46 b(rsh)e(and)h(rlogin)150 3172 y Fw(This)27 b(app)s(endix)f(describ)s(e) h(the)g(K)m(CMD)m(V0.2)j(proto)s(col)f(used)d(in)i(shishi)e(patc)m(hed) i(v)m(ersion)g(of)g(inetutils.)150 3281 y(The)42 b(K)m(CMD)h(proto)s (col)h(w)m(as)f(dev)m(elopp)s(ed)f(b)m(y)h(the)f(MIT)h(Kerb)s(eros)e (team)j(for)e(k)m(erb)s(erized)h(rsh)e(an)150 3391 y(rlogin)d (programs.)63 b(Di\013erences)39 b(b)s(et)m(w)m(een)f(rlogin)g(an)g (rsh)f(will)h(b)s(e)f(explained,)j(lik)m(e)f(those)f(b)s(et)m(w)m(een) 150 3500 y(v0.1)27 b(and)e(v0.2)i(of)e(the)h(proto)s(col)h(for)e (compatibilit)m(y)j(reasons.)40 b(It)25 b(is)h(p)s(ossible)f(that)i (some)f(parts)f(of)h(this)150 3610 y(do)s(cumen)m(t)34 b(are)h(not)f(in)g(conformit)m(y)i(with)e(original)h(K)m(CMD)g(proto)s (col)g(b)s(ecause)f(there)h(is)f(no)g(o\016cial)150 3720 y(sp)s(eci\014cation)40 b(ab)s(out)g(it.)69 b(Ho)m(w)m(ev)m(er,)44 b(it)c(seems)g(that)g(shishi)f(implemen)m(tation)i(is)e(compatible)i (with)150 3829 y(MIT's)30 b(one.)275 3986 y Fk(W)-8 b(arning:)43 b Fw(If)31 b(y)m(ou)i(are)f(seriously)g(considering)g(using)f(Kerb)s (eros)g(rsh)f(or)i(rlogin,)h(instead)f(of)g(more)150 4095 y(robust)j(remote)h(access)h(proto)s(cols)f(suc)m(h)f(as)g(SSH,)g (y)m(ou)h(ma)m(y)g(\014rst)e(w)m(an)m(t)j(to)f(explore)g Fq(http:)t(/)t(/)s(www)t(.)150 4205 y(cs.berkeley.edu/~hildrum)o(/ker)o (bero)o(s/)22 b Fw(and)29 b(the)g(full)f(pap)s(er)g(at)h Fq(http://www.cs.berkeley.)150 4314 y(edu/~hildrum/043.pdf)p Fw(.)150 4535 y Fl(B.3.1)63 b(Establish)41 b(connection)150 4682 y Fw(First)34 b(the)f(clien)m(t)i(should)e(establish)h(a)f(TCP)g (connection)i(with)e(the)g(serv)m(er.)51 b(Default)34 b(p)s(orts)f(are)h(543)150 4792 y(\(klogin\),)40 b(544)e(\(kshell\),)h (2105)g(\(eklogin\).)61 b(eklogin)38 b(is)f(the)g(same)g(as)g(klogin)g (but)f(with)h(encryption.)150 4902 y(Their)42 b(is)g(no)h(longer)g (ekshell)g(p)s(ort)e(b)s(ecause)i(encrypted)f(and)g(normal)g (connection)i(use)e(the)h(same)150 5011 y(p)s(ort)37 b(\(kshell\).)64 b(Kshell)38 b(need)f(a)i(second)e(connection)i(for)f (stderr.)62 b(The)38 b(clien)m(t)h(should)e(send)g(a)h(n)m(ull)150 5121 y(terminated)h(string)g(that)g(represen)m(t)g(the)g(p)s(ort)f(of)h (this)g(second)f(connection.)67 b(Klogin)40 b(and)e(eklogin)150 5230 y(do)s(es)26 b(not)g(use)f(a)i(second)f(connection)h(for)f(stderr) f(so)h(the)g(clien)m(t)i(m)m(ust)e(send)f(a)h(n)m(ull)g(b)m(yte)h(to)f (the)g(serv)m(er.)150 5340 y(Con)m(trary)e(to)i(classic)f(rsh/rlogin,)h (serv)m(er)f(m)m(ust)f(not)h(c)m(hec)m(k)h(if)e(the)h(clien)m(t)h(p)s (ort)d(is)i(in)f(the)g(range)h(0-1023.)p eop end %%Page: 243 249 TeXDict begin 243 248 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(243)150 299 y Fl(B.3.2)63 b(Kerb)s(eros)42 b(iden)m(ti\014cation)150 446 y Fw(When)35 b(connections)h(are)g(established,)g(\014rst)f(thing)g (to)h(do)f(is)g(to)h(indicate)g(k)m(erb)s(eros)f(authen)m(tication)150 555 y(m)m(ust)h(b)s(e)g(used.)57 b(So)36 b(the)h(clien)m(t)h(will)e (send)g(a)g(string)g(to)h(indicate)h(it)f(will)f(used)g(k)m(erb)s(eros) g(5.)58 b(It)37 b(will)150 665 y(call)c(a)e(length-string)h Fq(")p Fw(strl)p Fq(")f Fw(the)g(couple)h(\(lengh)m(t)g(of)g(the)f (string)g(strl,)h(n)m(ull)f(terminated)h(string)f(strl\).)150 775 y(Length)h(of)g(the)g(string)g(is)g(an)g(in)m(t32)h(\(32bits)g(in)m (t\))g(in)e(MSB)h(order)g(\(for)g(the)g(net)m(w)m(ork\).)46 b(So)32 b(the)g(clien)m(t)150 884 y(send)e(this)g(length-string)h(strl) f(:)293 1020 y Fq(KRB5_SENDAUTH_V1.0)275 1156 y Fw(After)g(that)g(the)g (clien)m(t)h(m)m(ust)f(indicate)g(whic)m(h)g(v)m(ersion)g(of)g(the)g (proto)s(col)h(it)f(will)g(used)f(b)m(y)h(sending)150 1266 y(this)g(length-string)h(strl)g(:)293 1402 y Fq(KCMDV0.2)275 1538 y Fw(It)g(can)i(b)s(e)e(V0.1)i(for)e(older)h(v)m(ersions.)46 b(If)31 b(inden)m(ti\014cation)i(from)e(clien)m(t)i(is)f(go)s(o)s(d,)h (serv)m(er)f(will)g(send)150 1647 y(a)i(n)m(ull)g(b)m(yte)h(\(0x00\).) 54 b(Else)34 b(if)g(authen)m(tication)i(message)f(is)g(wrong,)f(serv)m (er)h(send)e(b)m(yte)i(0x01,)h(else)f(if)150 1757 y(proto)s(col)c(v)m (ersion)g(message)h(is)e(wrong)g(serv)m(er)h(send)e(b)m(yte)i(0x02.)150 1958 y Fl(B.3.3)63 b(Kerb)s(eros)42 b(authen)m(tication)150 2105 y Fw(When)f(clien)m(t)i(is)e(inden)m(ti\014ed,)i(k)m(erb)s(eros)e (authen)m(tication)j(can)d(b)s(egin.)72 b(The)41 b(clien)m(t)i(m)m(ust) e(send)f(an)150 2214 y(AP-REQ)30 b(to)h(the)g(serv)m(er.)41 b(AP-REQ)30 b(authen)m(ticator)i(m)m(ust)f(ha)m(v)m(e)g(a)g(subk)m(ey)f (\(only)h(for)f(K)m(CMD)m(V0.2\))150 2324 y(and)g(a)h(c)m(hec)m(ksum.) 41 b(Authen)m(ticator)32 b(c)m(hec)m(ksum)f(is)g(created)g(on)f(follo)m (wing)i(string)e(:)390 2460 y Fq("serverport:""terminalty)o(pe"")o (remo)o(teu)o(sern)o(ame")275 2596 y Fw(for)g(example)h(:)390 2732 y Fq(543:linux/38400user)275 2868 y Fw(remoteusername)f(corresp)s (onds)f(to)i(the)g(iden)m(tit)m(y)h(of)e(the)h(clien)m(t)h(on)e(remote) h(mac)m(hine.)275 3004 y(AP-REQ)g(is)g(sended)f(in)h(der)g(enco)s(ded)g (format.)44 b(The)31 b(length)h(\(in)m(t32\))h(of)e(der)g(enco)s(ded)g (AP-REQ)150 3113 y(is)26 b(sended)g(in)g(net)m(w)m(ork)h(format)g (\(MSB\),)h(follo)m(wing)g(b)m(y)e(the)g(der)g(enco)s(ded)g(AP-REQ.)h (If)f(all)h(is)g(correct,)150 3223 y(serv)m(er)e(send)e(a)i(n)m(ull)f (in)m(t32)i(\(MSB)f(format)g(but)e(lik)m(e)j(it)f(is)f(n)m(ull)h(it)g (is)f(not)h(imp)s(ortan)m(t\).)39 b(K)m(CMD)25 b(proto)s(col)150 3332 y(use)k(m)m(utual)g(authen)m(tication,)i(so)e(serv)m(er)g(m)m(ust) g(no)m(w)g(send)f(and)g(AP-REP)h(:)g(\(in32)h(lengh)m(t)f(in)g(MSB)g (of)150 3442 y(der)h(enco)s(ded)g(AP-REP\)\(der)g(enco)s(ded)g (AP-REP\).)275 3578 y(No)m(w)h(serv)m(er)f(and)g(clien)m(t)i(are)f (partially)g(authen)m(ticated.)150 3779 y Fl(B.3.4)63 b(Extended)40 b(authen)m(tication)150 3926 y Fw(Clien)m(t)31 b(m)m(ust)f(no)m(w)h(send)e(3)i(di\013eren)m(t)g(n)m(ull)f(terminated)h (strings)f(\(without)h(lengh)m(t\))h(:)225 4062 y Fu(\017)60 b Fw(remote)31 b(user)f(name)g(\(user)g(iden)m(tit)m(y)i(on)f(remote)g (mac)m(hine\))225 4197 y Fu(\017)60 b Fw(terminal)31 b(t)m(yp)s(e)f(for)h(rlogin)f(or)h(command)f(for)g(rsh)225 4332 y Fu(\017)60 b Fw(lo)s(cal)32 b(user)d(name)i(\(user)f(iden)m(tit) m(y)i(on)e(clien)m(t)i(mac)m(hine\))275 4494 y(example)f(for)f(rsh)f(:) 390 4630 y Fq("rname\\0")390 4739 y("cat)47 b(/usr/local/etc/shishi.c)o (onf")390 4849 y("lname\\0")275 4985 y Fw(Serv)m(er)33 b(m)m(ust)h(v)m(erify)g(that)g(c)m(hec)m(ksum)g(in)g(AP-REQ)f(authen)m (ticator)j(is)d(correct)i(b)m(y)f(computing)g(a)150 5094 y(new)c(hash)f(lik)m(e)j(clien)m(t)g(has)e(done.)275 5230 y(Serv)m(er)35 b(m)m(ust)h(v)m(erify)g(that)h(principal)e(\(in)h (AP-REQ\))g(has)g(righ)m(t)g(to)h(log)g(in)e(on)h(the)g(remote)h(user) 150 5340 y(accoun)m(t.)60 b(F)-8 b(or)37 b(the)g(momen)m(t)g(shishi)e (only)i(c)m(hec)m(k)h(if)e(remote)h(user)f(name)g(is)h(equal)f(to)i (principal.)58 b(A)p eop end %%Page: 244 250 TeXDict begin 244 249 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(244)150 299 y(more)31 b(complex)h(authorization)h(co)s(de)e(is)g(planned.)43 b(Lo)s(ok)31 b(at)h(the)f(end)g(to)h(kno)m(w)f(ho)m(w)g(MIT/Heimdal)150 408 y(do)f(to)h(c)m(hec)m(k)h(authorization.)275 538 y(If)38 b(all)i(is)f(correct)h(serv)m(er)f(send)g(a)g(n)m(ull)g(b)m (yte,)j(else)e(an)f(error)f(message)i(string)f(\(n)m(ull)g(terminated) 150 648 y(string\))31 b(is)g(sen)m(t.)42 b(User)31 b(read)g(the)g (\014rst)f(b)m(yte.)43 b(If)30 b(it)h(is)g(equal)g(to)h(zero,)g(authen) m(tication)h(is)e(correct)h(and)150 758 y(is)e(logged)i(on)f(the)f (remote)h(host.)41 b(Else)31 b(user)f(can)g(read)g(the)h(error)f (messsage)h(send)f(b)m(y)g(the)h(serv)m(er.)150 948 y Fl(B.3.5)63 b(Windo)m(w)40 b(size)150 1094 y Fw(F)-8 b(or)44 b(rlogin)g(proto)s(col,)k(when)43 b(authen)m(tication)i(is)f (complete,)k(the)c(serv)m(er)g(can)g(optionnaly)g(send)f(a)150 1204 y(message)35 b(to)g(ask)f(for)f(windo)m(w)h(terminal)g(size)h(of)f (user.)51 b(Then)32 b(the)j(user)e(can)h(resp)s(ond)e(but)h(it)i(is)f (not)150 1314 y(an)c(obligation.)275 1444 y(In)f(K)m(CMD)m(V0.1)k(serv) m(er)e(send)e(an)h(urgen)m(t)h(TCP)e(message)j(\(MSG)p 2589 1444 28 4 v 41 w(OOB\))e(with)g(one)h(b)m(yte)g(:)390 1573 y Fq(TIOCPKT_WINDOW)44 b(=)j(0x80)275 1703 y Fw(In)27 b(K)m(CMD)m(V0.2)k(serv)m(er)e(do)s(es)f(not)h(send)e(an)i(urgen)m(t)f (message)i(but)e(write)h(on)f(the)h(so)s(c)m(k)m(et)h(5)f(b)m(ytes)g(:) 390 1833 y Fq('\\377',)46 b('\\377',)g('o',)g('o',)h(TIOCPKT_WINDOW)275 1963 y Fw(If)29 b(encryption)i(is)f(enabled)g(\(eklogin\))j(serv)m(er)d (m)m(ust)h(send)e(this)i(5)f(b)m(ytes)h(encrypted.)275 2093 y(Clien)m(t)g(can)f(answ)m(er)h(in)f(b)s(oth)f(proto)s(col)j(v)m (ersion)f(with)f(:)390 2223 y Fq('\\377',)46 b('\\377',)g('s',)g('s',)h ("struct)f(winsize")275 2353 y Fw(The)28 b(winsize)g(structure)g(is)h (\014lled)f(with)g(corresp)s(onding)g(setting)h(to)h(clien)m(t's)g (terminal.)40 b(If)28 b(encryp-)150 2462 y(tion)j(is)f(enabled)h(this)f (answ)m(er)g(m)m(ust)g(b)s(e)g(send)g(encrypted.)150 2652 y Fl(B.3.6)63 b(End)40 b(of)i(authen)m(tication)150 2799 y Fw(The)30 b Fq(")p Fw(classic)p Fq(")h Fw(rsh/rlogin)f(can)h(b)s (e)f(used)f(no)m(w.)150 2989 y Fl(B.3.7)63 b(Encryption)150 3136 y Fw(Encryption)34 b(mo)s(de)f(is)i(used)e(when)g(a)i(connection)g (with)f(eklogin)i(is)e(established.)53 b(Encryption)33 b(with)150 3246 y(krsh)22 b(can)i(b)s(e)f(used)g(to)s(o.)39 b(Before,)26 b(there)e(w)m(as)g(a)f(sp)s(eci\014c)h(p)s(ort)f(for)g (that)h(\(ekshell\),)i(but)d(no)m(w)h(to)g(indicate)150 3355 y(that)33 b(encryption)f(m)m(ust)g(b)s(e)g(used)f(with)i(krsh,)e (clien)m(t)j(m)m(ust)f(add)e Fq(")p Fw(-x)h Fq(")g Fw(b)s(efore)g(the)h (command)f(when)150 3465 y(it)37 b(send)e(it)i(b)s(et)m(w)m(een)f (remote)h(user)f(name)g(and)g(lo)s(cal)h(user)e(name.)58 b(When)36 b(the)h(clien)m(t)g(compute)g(the)150 3574 y(c)m(hec)m(ksum)31 b(for)f(AP-REQ)g(authen)m(ticator)j(the)d Fq(")p Fw(-)h(x)p Fq(")f Fw(m)m(ust)g(not)h(b)s(e)e(included.)275 3704 y(Encryption)36 b(in)h(K)m(CMD)m(V0.2)j(is)d(not)h(the)f(same)h (as)f(in)g(K)m(CMD)m(V0.1.)64 b(K)m(CMD)m(V0.1)39 b(uses)e(tic)m(k)m (et)150 3814 y(session)c(k)m(ey)h(as)g(encryption)f(k)m(ey)-8 b(,)35 b(and)e(use)g(standard)f(Kerb)s(eros)h(encryption)g(functions.) 49 b(This)32 b(pro-)150 3924 y(to)s(col)k(only)e(supp)s(orts)f(des-cb)s (c-crc,)j(des-cb)s(c-md4,)g(des-cb)s(c-md5)e(and)g(do)s(es)g(not)g(use) h(initialisation)150 4033 y(v)m(ectors.)275 4163 y(F)-8 b(or)26 b(example)h(on)f(eac)m(h)i(encryption/decryption)e(calls,)j (the)d(follo)m(wing)i(protot)m(yp)s(e)f(k)m(erb)s(eros)f(func-)150 4273 y(tion)31 b(should)e(b)s(e)h(used)g(:)390 4402 y Fq(kerberos_encrypt)43 b(\(key,)k(keyusage,)e(in,)i(out\))94 b(\(or)47 b(decrypt\))275 4532 y Fw(K)m(CMD)m(V0.2)41 b(can)e(b)s(e)g(used)f(with)h(all)h(k)m(erb)s(eros)f(encryption)g(mo)s (des)f(\(des,)k(3des,)g(aes,)g(arcfour\))150 4642 y(and)c(use)g(AP-REQ) g(authen)m(ticator)i(subk)m(ey)-8 b(.)64 b(In)38 b(opp)s(osite)g(to)h (K)m(CMD)m(V0.1)i(initialisation)f(v)m(ectors)150 4751 y(are)d(used.)58 b(All)37 b(encryptions/descryptions)f(m)m(ust)g(b)s(e) g(made)g(using)g(a)h(cryptographic)g(con)m(text)h(\(for)150 4861 y(example)31 b(to)g(use)f(the)h(up)s(dated)e(iv,)i(or)f(sb)s(o)m (x\))g(:)390 4991 y Fq(kerberos_init\(ctx,)43 b(iv,)k(key,)f (keyusage\))390 5101 y(kerberos_encrypt)d(\(ctx,)k(in,)g(out\))275 5230 y Fw(F)-8 b(or)25 b(b)s(oth)f(proto)s(cols,)i(k)m(eyusage)g(id)e (for)h(des-cb)s(c-md5,)h(des-cb)s(c-md4,)f(des-cb)s(c-crc)g(and)f (des3-cb)s(c-)150 5340 y(sha1)31 b(\(for)f(K)m(CMD)m(V0.2\))j(:)p eop end %%Page: 245 251 TeXDict begin 245 250 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(245)390 299 y Fq(keyusage)46 b(=)h(1026)275 436 y Fw(F)-8 b(or)26 b(other)h(K)m(CMD)m (V0.2)h(mo)s(des)e(k)m(eyusage)h(is)f(di\013eren)m(t)h(for)e(eac)m(h)j (encryption/decryption)e(usage.)150 546 y(T)-8 b(o)41 b(understand,)g(eklogin)h(use)e(1)h(so)s(c)m(k)m(et.)73 b(It)41 b(encrypts)f(data)h(\(output)f(1\))i(to)f(send)e(and)h (decrypts)150 656 y(\(input)33 b(1\))i(receiv)m(ed)g(data.)52 b(Kshell)34 b(use)f(2)h(so)s(c)m(k)m(ets)i(\(1)e(for)g(transmit)g (data,)h(1)g(for)e(stderr\).)51 b(So)34 b(there)150 765 y(are)d(four)e(mo)s(des)h(:)293 903 y Fq(transmit)93 b(:)48 b(input)94 b(1)866 1012 y(output)46 b(1)293 1231 y(stderr)189 b(:)48 b(input)94 b(2)866 1341 y(output)46 b(2)275 1478 y Fw(There)27 b(is)h(a)g(k)m(eyusage)h(for)f(eac)m(h)h(mo) s(des.)39 b(The)27 b(k)m(eyusage)i(m)m(ust)f(corresp)s(ond)e(on)i (clien)m(t)h(and)f(serv)m(er)150 1588 y(side.)41 b(F)-8 b(or)31 b(example)g(in)f(klogin)h(clien)m(t)h(input)e(1)g(k)m(eyusage)i (will)f(b)s(e)f(serv)m(er)g(output)g(1)h(k)m(eyusage.)150 1725 y(I/O)491 b(Clien)m(t)301 b(Serv)m(er)150 1835 y(in)m(tput)30 b(1)320 b(1028)360 b(1030)150 1945 y(output)30 b(1)297 b(1030)360 b(1028)150 2054 y(in)m(tput)30 b(2)320 b(1032)360 b(1034)150 2164 y(output)30 b(2)297 b(1034)360 b(1032)275 2301 y(Those)30 b(k)m(eyusages)h(m)m(ust)g(b)s(e)e(used)h(with)g(AES)g (and)g(AR)m(CF)m(OUR)h(mo)s(des.)275 2439 y(K)m(CMD)m(V0.2)e(uses)e(IV) g(\(initialisation)j(v)m(ector\).)42 b(Lik)m(e)28 b(for)f(k)m(eyusage,) j(clien)m(t)f(IV)e(m)m(ust)g(corresp)s(ond)150 2548 y(to)k(serv)m(er)f (IV.)g(IV)f(size)i(is)f(equal)g(to)h(k)m(ey)f(t)m(yp)s(e,)h(blo)s(c)m (ksize.)42 b(All)30 b(b)m(ytes)g(of)g(IV)g(m)m(ust)g(b)s(e)f (initialised)i(to)g(:)150 2686 y(I/O)491 b(Clien)m(t)301 b(Serv)m(er)150 2795 y(in)m(tput)30 b(1)320 b(0)495 b(1)150 2905 y(output)30 b(1)297 b(1)495 b(0)150 3014 y(in)m(tput)30 b(2)320 b(2)495 b(3)150 3124 y(output)30 b(2)297 b(3)495 b(2)275 3262 y(AR)m(CF)m(OUR)38 b(mo)s(de)f(do)s(es)h(not)g(use)g(IV.)g (Ho)m(w)m(ev)m(er,)j(lik)m(e)f(it)e(is)g(said)g(b)s(efore,)h(a)f(con)m (text)i(m)m(ust)e(b)s(e)150 3371 y(used)30 b(to)h(k)m(eep)g(the)f(up)s (dated)f(sb)s(o)m(x.)275 3509 y(Normal)i(message)g(with)f(klogin)h(and) f(kshell)h(are)f(sen)m(t)h(lik)m(e)h(that)f(:)390 3646 y Fq(\(int)47 b(32)g(lenght)f(of)h(message)f(in)h(MSB)g(order\))390 3756 y(\(message\))275 3893 y Fw(In)29 b(encrypted)h(mo)s(de)g(it)h(is) f(a)h(bit)g(di\013eren)m(t)f(:)390 4031 y Fq(\(int)47 b(32)g(length)f(of)h(unencrypted)e(message)h(in)h(MSB)g(order\))390 4140 y(\(encrypted)e(message\))275 4278 y Fw(In)29 b(K)m(CMD)m(V0.2)k (encrypted)d(message)h(is)g(create)h(lik)m(e)f(that)g(:)390 4415 y Fq(encrypt)46 b(\()390 4525 y(\(int)h(32)g(length)f(of)h (message)f(in)h(MSB)g(order\))390 4634 y(\(message\))390 4744 y(\))275 4881 y Fw(A)30 b(c)m(hec)m(k)i(on)e(message)i(size)f(can) g(b)s(e)e(made)i(in)f(second)g(v)m(ersion)h(of)g(the)f(proto)s(col.)150 5083 y Fl(B.3.8)63 b(K)m(CMD)m(V0.3)150 5230 y Fw(This)30 b(part)h(only)g(giv)m(es)h(p)s(ossible)f(w)m(a)m(ys)h(to)f(extend)g(K)m (CMD)h(proto)s(col.)43 b(Do)s(es)32 b(not)f(tak)m(e)h(that)g(as)f(m)m (ust)150 5340 y(ha)m(v)m(e)h(in)e(K)m(CMD)h(implemen)m(tation.)p eop end %%Page: 246 252 TeXDict begin 246 251 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(246)275 299 y(Extensions)31 b(of)h(K)m(CMV0.2)i(could)d(b)s(e)h(made.)45 b(F)-8 b(or)32 b(example)h(kshell)f(supp)s(oses)e(there)i(are)g(no)g(\014les)150 408 y(with)f(name)g Fq(")p Fw(-x)f(*)p Fq(")p Fw(.)43 b(I)31 b(think)f(the)h(same)h(thing)f(can)g(b)s(e)f(supp)s(osed)f(with) i(terminal)g(name)g(for)g(klogin.)150 518 y(So)23 b(clien)m(t)h(could)f (add)f Fq(")p Fw(-x)h Fq(")g Fw(to)g(terminal)h(t)m(yp)s(e)f(it)g (sends)f(to)i(serv)m(er)f(to)h(indicate)g(it)f(will)g(use)g (encryption.)150 628 y(Lik)m(e)31 b(that)g(there)g(will)f(b)s(e)g(only) h(one)f(p)s(ort)g(for)g(klogin/eklogin)j(:)41 b(543.)275 768 y(In)21 b(encrypted)g(mo)s(de)g(kshell)h(send)f(command)h(in)f (clear)i(on)f(the)g(net)m(w)m(ork,)i(this)e(could)g(b)s(e)f(considered) 150 878 y(as)32 b(insecure)f(as)h(user)f(ha)m(v)m(e)i(decided)e(to)i (use)e(encryption.)44 b(This)31 b(is)h(not)f(really)i(a)f(problem)f (for)g(klogin)150 987 y(b)s(ecause)f(it)h(just)f(sends)g(terminal)g(t)m (yp)s(e.)275 1128 y(In)19 b(encrypted)h(mo)s(de,)i(klogin)g(and)d (kshell)i(clien)m(ts)h(could)e(only)h(send)e Fq(")p Fw(-x)p Fq(")h Fw(as)h(command)f(or)g(terminal)150 1238 y(t)m(yp)s(e.)38 b(After)21 b(that)g(encryption)g(is)f(activ)-5 b(ated,)25 b(and)20 b(the)h(clien)m(t)i(could)d(send)g(terminal)i(t)m(yp)s(e)e(or) h(command)150 1347 y(encrypted.)41 b(The)30 b(serv)m(er)h(will)g(send)e (the)i(n)m(ull)g(b)m(yte)g(to)g(sa)m(y)h(that)f(all)g(is)g(correct,)h (or)e(error)h(message)g(in)150 1457 y(encrypted)f(form.)150 1662 y Fl(B.3.9)63 b(MIT/Heimdal)42 b(authorization)150 1809 y Fw(This)30 b(part)g(describ)s(es)g(ho)m(w)h(MIT/Heimdal)g(v)m (ersion)g(c)m(hec)m(k)h(authorization)g(of)f(the)g(user)f(to)h(log)h (in)e(on)150 1919 y(the)h(remote)g(mac)m(hine.)275 2059 y(Authorization)j(c)m(hec)m(k)h(is)e(made)g(b)m(y)g(lo)s(oking)h(if)f (the)h(\014le)f(.k5login)i(exists)e(on)g(the)h(accoun)m(t)g(of)g(the) 150 2169 y(remote)e(user.)41 b(If)31 b(this)f(\014le)h(do)s(es)g(not)g (exist,)h(remote)f(user)g(name)f(m)m(ust)h(b)s(e)f(the)h(same)h(as)f (principal)f(in)150 2279 y(AP-REQ)k(to)g(v)-5 b(alid)35 b(authorization.)53 b(Else)34 b(if)g(this)f(\014le)i(exists,)g(c)m(hec) m(k)h(\014rst)d(v)m(erify)h(that)h(remote)g(user)150 2388 y(or)e(ro)s(ot)h(are)f(the)h(o)m(wner)f(of)g(.k5login.)51 b(If)33 b(it)g(is)h(not)f(the)h(case,)h(the)e(c)m(hec)m(k)i(fails.)50 b(If)32 b(it)i(is)f(go)s(o)s(d,)h(c)m(hec)m(k)150 2498 y(reads)27 b(eac)m(h)h(line)f(of)g(that)g(\014le)g(and)g(compare)g(eac) m(h)h(readed)f(name)g(to)g(principal.)39 b(If)27 b(principal)f(is)h (found)150 2607 y(in)33 b(.k5login,)i(authorization)g(is)e(v)-5 b(alid,)34 b(else)g(user)e(is)h(not)h(allo)m(w)m(ed)g(to)g(connect)g (on)f(remote)h(host)f(with)150 2717 y(the)e(sp)s(eci\014ed)e(remote)j (user)d(name)i(\(that)g(can)g(b)s(e)e(the)i(same)g(as)f(principal\).) 275 2858 y(So)25 b(someone)i(\(for)f(example)h(user)e Fq(")p Fw(user1)p Fq(")p Fw(\))g(can)h(remote)h(log)g(in)m(to)g Fq(")p Fw(user2)p Fq(")e Fw(accoun)m(t)j(if)d(.k5login)j(is)150 2967 y(presen)m(t)h(in)g(user2)g(home)g(dir)g(and)f(this)h(\014le)g(is) h(o)m(wned)f(b)m(y)g(user2)f(or)i(ro)s(ot)f(and)g(user1)g(name)g(is)g (presen)m(t)150 3077 y(in)h(this)g(\014le.)150 3318 y Fv(B.4)67 b(Key)46 b(as)f(initialization)j(v)l(ector)150 3478 y Fw(The)36 b Fq(des-cbc-crc)e Fw(algorithm)k(\(see)g(Section)f (1.4)h([Cryptographic)f(Ov)m(erview],)i(page)f(5\))f(uses)g(the)150 3587 y(DES)32 b(k)m(ey)g(as)h(the)f(initialization)j(v)m(ector.)47 b(This)31 b(is)h(problematic)h(in)e(general)i(\(see)g(b)s(elo)m(w)3284 3554 y Fp(1)3322 3587 y Fw(\),)g(but)e(ma)m(y)150 3697 y(b)s(e)f(mitigated)i(in)e(Kerb)s(eros)f(b)m(y)i(the)f(CR)m(C)g(c)m (hec)m(ksum)h(that)g(is)g(also)g(included.)150 3838 y Fq(From)47 b(daw@espresso.CS.Berkele)o(y.ED)o(U)42 b(Fri)47 b(Mar)94 b(1)48 b(13:32:34)d(PST)i(1996)150 3947 y(Article:)f(50440)g (of)h(sci.crypt)150 4057 y(Path:)f(agate!daw)150 4166 y(From:)g(daw@espresso.CS.Berkeley.E)o(DU)41 b(\(David)47 b(A)g(Wagner\))150 4276 y(Newsgroups:)e(sci.crypt)150 4386 y(Subject:)h(Re:)g(DES-CBC)g(and)h(Initialization)d(Vectors)150 4495 y(Date:)i(29)i(Feb)e(1996)h(21:48:16)f(GMT)150 4605 y(Organization:)e(University)h(of)i(California,)e(Berkeley)150 4714 y(Lines:)h(31)150 4824 y(Message-ID:)f(<4h56v0$3no@agate.berke)o (ley.)o(edu>)150 4933 y(References:)g(<4h39li$33o@gaia.ns.utk)o(.edu)o (>)150 5043 y(NNTP-Posting-Host:)e(espresso.cs.berkeley.edu)p 150 5154 1200 4 v 199 5221 a Fp(1)275 5253 y Fo(The)36 b(p)r(ost)h(is)g(cop)n(yrigh)n(ted)e(b)n(y)h(Da)n(vid)f(W)-6 b(agner,)40 b(included)c(here)g(with)g(p)r(ermission,)41 b(the)36 b(canonical)h(lo)r(cation)h(is)275 5340 y Fn (http://www.cs.berkeley.edu/~daw)q(/my-p)q(osts)q(/key)q(-as-i)q(v-br)q (oken)p eop end %%Page: 247 253 TeXDict begin 247 252 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(247)150 408 y Fq(In)47 b(article)f(<4h39li$33o@gaia.ns.utk.)o(edu>)o(,)150 518 y(Nair)h(Venugopal)e()c(wrote:)150 628 y(>)47 b(Is)h(there)e(anything)g(wrong)g(in)h(using)f(the)h(key)g (as)g(the)g(I.V.)g(in)g(DES-CBC)f(mode?)150 847 y(Yes,)h(you're)f(open) g(to)i(a)f(chosen-ciphertext)c(attack)j(which)h(recovers)e(the)i(key.) 150 1066 y(Alice)f(is)i(sending)d(stuff)i(DES-CBC)f(encrypted)f(with)h (key)h(K)h(to)f(Bob.)94 b(Mary)47 b(is)g(an)150 1176 y(active)f(adversary)f(in)j(the)e(middle.)94 b(Suppose)46 b(Alice)g(encrypts)g(some)g(plaintext)150 1285 y(blocks)g(P_1,)h(P_2,)f (P_3,)h(...)g(in)g(DES-CBC)f(mode)h(with)f(K)i(as)f(the)g(IV,)g(and)g (sends)f(off)150 1395 y(the)h(resulting)e(ciphertext)532 1504 y(A->B:)h(C_1,)h(C_2,)f(C_3,)h(...)150 1614 y(where)f(each)h(C_j)g (is)g(a)h(8-byte)e(DES)h(ciphertext)e(block.)93 b(Mary)47 b(wants)f(to)i(discover)150 1724 y(the)f(key)g(K,)g(but)g(doesn't)f (even)g(know)h(any)g(of)g(the)g(P_j's.)94 b(She)47 b(replaces)e(the)i (above)150 1833 y(message)f(by)532 1943 y(M->B:)g(C_1,)h(0,)g(C_1)150 2052 y(where)f(0)i(is)f(the)g(8-byte)f(all-zeros)f(block.)94 b(Bob)47 b(will)g(decrypt)e(under)i(DES-CBC,)150 2162 y(recovering)e(the)i(blocks)532 2271 y(Q_1,)f(Q_2,)h(Q_3)150 2381 y(where)532 2491 y(Q_1)g(=)g(DES-decrypt\(K,)d(C_1\))j(xor)g(K)g (=)h(P_1)532 2600 y(Q_2)f(=)g(DES-decrypt\(K,)d(C_2\))j(xor)g(C_1)g(=)g (\(some)f(unimportant)f(junk\))532 2710 y(Q_3)i(=)g(DES-decrypt\(K,)d (C_1\))j(xor)g(0)g(=)h(P_1)e(xor)h(K)150 2819 y(Bob)g(gets)g(this)f (garbage-looking)e(message)i(Q_1,Q_2,Q_3)e(which)j(Mary)f(recovers)150 2929 y(\(under)g(the)h(chosen-ciphertext)c(assumption:)i(this)h(is)i (like)e(a)i(known-plaintext)150 3039 y(attack,)e(which)g(isn't)h(too)f (implausible\).)92 b(Notice)46 b(that)h(Mary)g(can)g(recover)e(K)j(by) 532 3148 y(K)f(=)h(Q_1)f(xor)g(Q_3;)150 3258 y(so)g(after)g(this)f(one) h(simple)f(active)g(attack,)g(Mary)h(gets)f(the)h(key)g(back!)150 3477 y(So,)g(if)g(you)g(must)g(use)g(a)g(fixed)f(IV,)h(don't)g(use)g (the)f(key--)h(use)g(0)g(or)g(something)150 3587 y(like)g(that.)94 b(Even)46 b(better,)g(don't)h(use)f(a)i(fixed)e(IV--)h(use)g(the)g(DES) g(encryption)150 3696 y(of)g(a)h(counter,)d(or)i(something)f(like)g (that.)150 3942 y Fv(B.5)67 b(The)45 b(Keytab)h(Binary)f(File)g(F)-11 b(ormat)150 4101 y Fw(The)30 b(k)m(eytab)h(\014le)g(format)f(is)h (describ)s(ed)e(in)h(the)h(\014le)f(`)p Fq(keytab.txt)p Fw(',)f(included)g(in)h(v)m(erbatim)h(b)s(elo)m(w.)150 4244 y Fq(The)47 b(Kerberos)e(Keytab)i(Binary)f(File)g(Format)150 4354 y(Copyright)f(\(C\))i(2006)g(Michael)f(B)h(Allen)f()150 4463 y(http://www.ioplex.com/ut)o(ilit)o(ies/)o(key)o (tab.)o(txt)150 4573 y(Last)h(updated:)93 b(Fri)47 b(May)94 b(5)48 b(13:39:40)d(EDT)i(2006)150 4792 y(The)g(MIT)g(keytab)f(binary)g (format)g(is)h(not)g(a)h(standard)d(format,)h(nor)h(is)g(it)150 4902 y(documented)e(anywhere)h(in)h(detail.)93 b(The)47 b(format)f(has)h(evolved)f(and)h(may)g(continue)150 5011 y(to.)95 b(It)47 b(is)g(however)f(understood)f(by)i(several)f(Kerberos) f(implementations)f(including)150 5121 y(Heimdal)i(and)h(of)g(course)f (MIT)h(and)g(keytab)f(files)g(are)h(created)f(by)h(the)g(ktpass.exe)150 5230 y(utility)f(from)g(Windows.)94 b(So)47 b(it)g(has)g(established)e (itself)h(as)h(the)g(defacto)f(format)150 5340 y(for)h(storing)f (Kerberos)f(keys.)p eop end %%Page: 248 254 TeXDict begin 248 253 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(248)150 408 y Fq(The)47 b(following)e(C-like)h(structure)g(definitions)e(illustrate)h (the)i(MIT)g(keytab)150 518 y(file)g(format.)93 b(All)47 b(values)f(are)h(in)g(network)f(byte)h(order.)94 b(All)46 b(text)h(is)g(ASCII.)245 737 y(keytab)g({)436 847 y(uint16_t)f (file_format_version;)949 b(/*)47 b(0x502)g(*/)436 956 y(keytab_entry)e(entries[*];)245 1066 y(};)245 1285 y(keytab_entry)g({) 436 1395 y(int32_t)h(size;)436 1504 y(uint16_t)g(num_components;)187 b(/*)47 b(sub)g(1)g(if)g(version)f(0x501)h(*/)436 1614 y(counted_octet_string)c(realm;)436 1724 y(counted_octet_string)g (components[num_componen)o(ts];)436 1833 y(uint32_t)j(name_type;)140 b(/*)48 b(not)e(present)g(if)h(version)f(0x501)h(*/)436 1943 y(uint32_t)f(timestamp;)436 2052 y(uint8_t)g(vno8;)436 2162 y(keyblock)g(key;)436 2271 y(uint32_t)g(vno;)h(/*)g(only)f (present)g(if)h(>=)h(4)f(bytes)f(left)h(in)g(entry)g(*/)245 2381 y(};)245 2600 y(counted_octet_string)c({)436 2710 y(uint16_t)j(length;)436 2819 y(uint8_t)g(data[length];)245 2929 y(};)245 3148 y(keyblock)g({)436 3258 y(uint16_t)g(type;)436 3367 y(counted_octet_string;)245 3477 y(};)150 3696 y(The)h(keytab)f (file)h(format)f(begins)g(with)g(the)h(16)h(bit)e(file_format_version)d (which)150 3806 y(at)k(the)g(time)g(this)f(document)g(was)h(authored)e (is)j(0x502.)93 b(The)47 b(format)f(of)i(older)150 3915 y(keytabs)e(is)h(described)e(at)i(the)g(end)g(of)g(this)g(document.)150 4134 y(The)g(file_format_version)42 b(is)48 b(immediately)c(followed)i (by)h(an)g(array)g(of)150 4244 y(keytab_entry)d(structures)h(which)i (are)g(prefixed)e(with)i(a)g(32)h(bit)e(size)h(indicating)150 4354 y(the)g(number)f(of)h(bytes)g(that)f(follow)g(in)h(the)g(entry.)94 b(Note)47 b(that)f(the)h(size)g(should)f(be)150 4463 y(evaluated)f(as)i(signed.)94 b(This)47 b(is)g(because)f(a)h(negative)f (value)g(indicates)f(that)i(the)150 4573 y(entry)f(is)i(in)f(fact)f (empty)h(\(e.g.)94 b(it)47 b(has)g(been)g(deleted\))e(and)i(that)g(the) g(negative)150 4682 y(value)f(of)i(that)e(negative)g(value)g(\(which)g (is)h(of)h(course)e(a)h(positive)f(value\))g(is)150 4792 y(the)h(offset)f(to)h(the)g(next)g(keytab_entry.)92 b(Based)46 b(on)h(these)g(size)f(values)g(alone)150 4902 y(the)h(entire)f(keytab)g (file)h(can)g(be)g(traversed.)150 5121 y(The)g(size)g(is)g(followed)e (by)i(a)h(16)f(bit)g(num_components)d(field)i(indicating)f(the)150 5230 y(number)h(of)h(counted_octet_string)c(components)i(in)i(the)g (components)e(array.)p eop end %%Page: 249 255 TeXDict begin 249 254 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(249)150 299 y Fq(The)47 b(num_components)d(field)i(is)h(followed)f(by)h(a)h (counted_octet_string)150 408 y(representing)c(the)j(realm)g(of)g(the)g (principal.)150 628 y(A)g(counted_octet_string)c(is)k(simply)f(an)h (array)g(of)g(bytes)f(prefixed)g(with)g(a)i(16)150 737 y(bit)f(length.)93 b(For)47 b(the)g(realm)g(and)g(name)f(components,)f (the)i(counted_octet_string)150 847 y(bytes)f(are)h(ASCII)g(encoded)e (text)i(with)g(no)g(zero)g(terminator.)150 1066 y(Following)e(the)i (realm)g(is)g(the)g(components)e(array)h(that)h(represents)e(the)i (name)f(of)150 1176 y(the)h(principal.)93 b(The)47 b(text)f(of)h(these) g(components)e(may)i(be)g(joined)f(with)h(slashs)150 1285 y(to)g(construct)e(the)i(typical)f(SPN)h(representation.)91 b(For)47 b(example,)f(the)h(service)150 1395 y(principal)e (HTTP/www.foo.net@FOO.NET)c(would)47 b(consist)f(of)h(name)f (components)150 1504 y("HTTP")g(followed)g(by)h("www.foo.net".)150 1724 y(Following)e(the)i(components)e(array)i(is)g(the)g(32)g(bit)g (name_type)e(\(e.g.)94 b(1)48 b(is)150 1833 y(KRB5_NT_PRINCIPAL,)43 b(2)k(is)g(KRB5_NT_SRV_INST,)d(5)j(is)g(KRB5_NT_UID,)e(etc\).)94 b(In)150 1943 y(practice)46 b(the)g(name_type)g(is)h(almost)f (certainly)f(1)j(meaning)e(KRB5_NT_PRINCIPAL.)150 2162 y(The)h(32)g(bit)g(timestamp)e(indicates)h(the)g(time)h(the)g(key)g (was)g(established)e(for)h(that)150 2271 y(principal.)93 b(The)47 b(value)f(represents)f(the)i(number)f(of)h(seconds)f(since)g (Jan)h(1,)g(1970.)150 2491 y(The)g(8)g(bit)g(vno8)g(field)f(is)h(the)g (version)f(number)g(of)h(the)g(key.)95 b(This)46 b(value)h(is)150 2600 y(overridden)e(by)i(the)g(32)g(bit)g(vno)g(field)f(if)i(it)f(is)g (present.)150 2819 y(The)g(keyblock)e(structure)h(consists)f(of)i(a)h (16)f(bit)g(value)f(indicating)f(the)i(keytype)150 2929 y(\(e.g.)94 b(3)48 b(is)f(des-cbc-md5,)d(23)j(is)h(arcfour-hmac-md5,)43 b(16)k(is)g(des3-cbc-sha1,)150 3039 y(etc\).)94 b(This)47 b(is)g(followed)e(by)j(a)f(counted_octet_string)42 b(containing)j(the)i (key.)150 3258 y(The)g(last)g(field)f(of)h(the)g(keytab_entry)d (structure)i(is)h(optional.)93 b(If)47 b(the)g(size)g(of)150 3367 y(the)g(keytab_entry)d(indicates)i(that)g(there)h(are)g(at)g (least)f(4)i(bytes)e(remaining,)150 3477 y(a)h(32)h(bit)f(value)f (representing)e(the)j(key)g(version)f(number)g(is)h(present.)94 b(This)150 3587 y(value)46 b(supersedes)f(the)i(8)h(bit)f(vno8)f(value) h(preceeding)e(the)i(keyblock.)150 3806 y(Older)f(keytabs)g(with)h(a)g (file_format_version)c(of)k(0x501)f(are)h(different)f(in)150 3915 y(three)g(ways:)245 4134 y(1\))i(All)f(integers)e(are)i(in)g(host) g(byte)f(order)h([1].)245 4244 y(2\))h(The)f(num_components)c(field)k (is)g(1)g(too)g(large)g(\(i.e.)94 b(after)46 b(decoding,)389 4354 y(decrement)f(by)i(1\).)245 4463 y(3\))h(The)f(32)g(bit)g (name_type)e(field)h(is)h(not)g(present.)150 4682 y([1])g(The)g (file_format_version)42 b(field)47 b(should)f(really)g(be)h(treated)f (as)h(two)341 4792 y(separate)e(8)j(bit)f(quantities)e(representing)f (the)j(major)g(and)f(minor)h(version)341 4902 y(number)f(respectively.) 150 5121 y(Permission)f(to)i(copy,)g(modify,)e(and)i(distribute)e(this) i(document,)e(with)i(or)150 5230 y(without)f(modification,)e(for)j(any) g(purpose)f(and)h(without)e(fee)i(or)g(royalty)f(is)150 5340 y(hereby)g(granted,)g(provided)f(that)i(you)g(include)f(this)g (copyright)f(notice)i(in)g(ALL)p eop end %%Page: 250 256 TeXDict begin 250 255 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(250)150 299 y Fq(copies)46 b(of)h(the)g(document)f(or)h(portions)e(thereof,)h (including)f(modifications.)150 544 y Fv(B.6)67 b(The)45 b(Creden)l(tial)i(Cac)l(he)e(Binary)g(File)g(F)-11 b(ormat)150 704 y Fw(The)30 b(creden)m(tial)i(cac)m(he)g(\014le)e(format)h(is)f (describ)s(ed)f(in)h(the)h(\014le)f(`)p Fq(keytab.txt)p Fw(',)f(included)g(in)h(v)m(erbatim)150 813 y(b)s(elo)m(w.)150 956 y Fq(The)47 b(Kerberos)e(Credential)g(Cache)i(Binary)f(File)h (Format)150 1066 y(Copyright)e(\(C\))i(2006-2013)e(Simon)i(Josefsson)e ()150 1176 y(http://josefsson.org/shi)o(shi/)o (ccac)o(he.)o(txt)150 1285 y(Last)h(updated:)93 b(Sat)47 b(Sep)g(23)g(12:04:11)e(CEST)i(2006)150 1504 y(Like)g(the)g(MIT)f (keytab)h(binary)f(format)g(\(see)g(Michael)g(B)i(Allen's)d(reverse)150 1614 y(engineered)g(description)g(in)i(keytab.txt\),)d(the)j (credential)e(cache)i(format)f(is)150 1724 y(not)h(standard)e(nor)i (documented)e(anywhere.)150 1943 y(In)i(C)h(style)e(notation,)f(the)i (MIT)g(credential)e(cache)h(file)h(format)f(is)h(as)150 2052 y(follows.)189 b(All)47 b(values)f(are)h(in)g(network)f(byte)g (order.)190 b(All)46 b(text)h(is)g(ASCII.)150 2271 y(ccache)f({)627 2381 y(uint16_t)g(file_format_version;)c(/*)47 b(0x0504)f(*/)627 2491 y(uint16_t)g(headerlen;)522 b(/*)47 b(only)g(if)g(version)f(is)h (0x0504)f(*/)627 2600 y(header)g(headers[];)618 b(/*)47 b(only)g(if)g(version)f(is)h(0x0504)f(*/)627 2710 y(principal)g (primary_principal;)627 2819 y(credential)f(credentials[*];)150 2929 y(};)150 3148 y(header)h({)484 3258 y(uint16_t)g(tag;)953 b(/*)47 b(1)h(=)f(DeltaTime)e(*/)484 3367 y(uint16_t)h(taglen;)484 3477 y(uint8_t)g(tagdata[taglen])150 3587 y(};)150 3806 y(The)h(ccache.taglen)d(and)j(ccache.tags)e(fields)h(are)h(only)f (present)g(in)h(0x0504)150 3915 y(versions,)e(not)i(in)g(earlier.)189 b(Both)47 b(MIT)g(and)g(Heimdal)e(appear)h(to)i(correctly)150 4025 y(ignore)e(unknown)g(tags,)g(so)h(it)h(appears)d(safe)i(to)g(add)g (them)g(\(although)e(there)h(is)150 4134 y(no)h(central)f(place)g(to)i ("register")d(tags\).)150 4354 y(Currently)g(only)i(one)g(tag)g(is)g (widely)f(implemented,)e(DeltaTime)i(\(0x0001\).)188 b(Its)150 4463 y(taglen)46 b(is)h(always)f(8,)i(and)e(tagdata)g(will)h (contain:)150 4682 y(DeltaTime)e({)484 4792 y(uint32_t)h(time_offset;) 484 4902 y(uint32_t)g(usec_offset;)150 5011 y(};)150 5230 y(After)g(reading)g(the)h(file_format_version,)42 b(header)k(tags,)h(and)g(default)150 5340 y(principal,)e(a)i(list)g(of) g(credentials)e(follow.)189 b(You)47 b(deduce)f(from)h(the)g(file)p eop end %%Page: 251 257 TeXDict begin 251 256 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(251)150 299 y Fq(length)46 b(when)h(there)f(are)h(no)g(more)g(credentials.)150 518 y(credential)e({)675 628 y(principal)g(client;)675 737 y(principal)g(server;)675 847 y(keyblock)h(key;)675 956 y(times)190 b(time;)675 1066 y(uint8_t)94 b(is_skey;)570 b(/*)47 b(1)h(if)f(skey,)f(0)i(otherwise)d(*/)675 1176 y(uint32_t)h(tktflags;)522 b(/*)47 b(stored)f(in)i(reversed)d(byte)i (order)f(*/)675 1285 y(uint32_t)g(num_address;)675 1395 y(address)94 b(addrs[num_address];)675 1504 y(uint32_t)46 b(num_authdata;)675 1614 y(authdata)g(authdata[num_authdata];)675 1724 y(countet_octet_string)c(ticket;)675 1833 y(countet_octet_string)g (second_ticket;)150 1943 y(};)150 2162 y(keyblock)k({)580 2271 y(uint16_t)f(keytype;)580 2381 y(uint16_t)g(etype;)762 b(/*)47 b(only)g(present)f(if)h(version)f(0x0503)g(*/)580 2491 y(uint16_t)f(keylen;)580 2600 y(uint8_t)g(keyvalue[keylen];)150 2710 y(};)150 2929 y(times)h({)436 3039 y(uint32_t)94 b(authtime;)436 3148 y(uint32_t)g(starttime;)436 3258 y(uint32_t)g(endtime;)436 3367 y(uint32_t)g(renew_till;)150 3477 y(};)150 3696 y(address)46 b({)532 3806 y(uint16_t)f(addrtype;)532 3915 y(counted_octet_string)d(addrdata;)150 4025 y(};)150 4244 y(authdata)k({)580 4354 y(uint16_t)f(authtype;)580 4463 y(counted_octet_string)d(authdata;)150 4573 y(};)150 4792 y(principal)j({)627 4902 y(uint32_t)h(name_type;)522 b(/*)47 b(not)g(present)f(if)h(version)f(0x0501)g(*/)627 5011 y(uint32_t)g(num_components;)282 b(/*)47 b(sub)g(1)h(if)f(version) f(0x501)g(*/)627 5121 y(counted_octet_string)d(realm;)627 5230 y(counted_octet_string)g(components[num_componen)o(ts])o(;)150 5340 y(};)p eop end %%Page: 252 258 TeXDict begin 252 257 bop 150 -116 a Fw(App)s(endix)29 b(B:)i(Proto)s(col)g(Extensions)2131 b(252)150 408 y Fq(counted_octet_string)42 b({)341 518 y(uint32_t)j(length;)341 628 y(uint8_t)h(data[length];)150 737 y(};)150 956 y(Permission)f(to)i (copy,)g(modify,)e(and)i(distribute)e(this)i(document,)e(with)i(or)150 1066 y(without)f(modification,)e(for)j(any)g(purpose)f(and)h(without)e (fee)i(or)g(royalty)f(is)150 1176 y(hereby)g(granted,)g(provided)f (that)i(you)g(include)f(this)g(copyright)f(notice)i(in)g(ALL)150 1285 y(copies)f(of)h(the)g(document)f(or)h(portions)e(thereof,)h (including)f(modifications.)p eop end %%Page: 253 259 TeXDict begin 253 258 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(253)150 299 y Ft(App)t(endix)52 b(C)81 b(Cop)l(ying)51 b(Information)150 608 y Fv(C.1)68 b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h (License)1359 767 y Fw(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s (er)h(2008)390 898 y(Cop)m(yrigh)m(t)842 895 y(c)817 898 y Fu(\015)e Fw(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 1007 y Fq(http://fsf.org/)390 1227 y Fw(Ev)m(ery)m(one)g(is)g(p)s (ermitted)f(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390 1336 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f (is)f(not)h(allo)m(w)m(ed.)199 1467 y(0.)61 b(PREAMBLE)330 1597 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g (a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330 1707 y(useful)29 b(do)s(cumen)m(t)h Fi(free)36 b Fw(in)29 b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j (the)e(e\013ectiv)m(e)j(freedom)330 1817 y(to)f(cop)m(y)g(and)f (redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i (either)f(commercially)h(or)e(non-)330 1926 y(commercially)-8 b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f (the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 2036 y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g (considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330 2145 y(made)30 b(b)m(y)h(others.)330 2276 y(This)22 b(License)i(is)f(a) h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5 b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330 2385 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g (sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330 2495 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed) e(for)g(free)h(soft)m(w)m(are.)330 2626 y(W)-8 b(e)31 b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h (for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330 2735 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:) 65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330 2845 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w) m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g (to)330 2954 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g (for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5 b(ject)30 b(matter)i(or)330 3064 y(whether)f(it)h(is)f(published)f(as)i (a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h (License)g(principally)f(for)330 3174 y(w)m(orks)f(whose)h(purp)s(ose)d (is)j(instruction)f(or)g(reference.)199 3304 y(1.)61 b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3435 y(This)39 b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i (in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3544 y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying) h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330 3654 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f (a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d (in)330 3764 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j (conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330 3873 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h (or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g (a)h(licensee,)i(and)330 3983 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40 b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8 b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330 4092 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop) m(yrigh)m(t)j(la)m(w.)330 4223 y(A)i(\\Mo)s(di\014ed)f(V)-8 b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f (con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4333 y(a)k(p)s(ortion)f (of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s (di\014cations)f(and/or)h(translated)g(in)m(to)330 4442 y(another)31 b(language.)330 4573 y(A)26 b(\\Secondary)g(Section")h(is) f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f (the)g(Do)s(cumen)m(t)330 4682 y(that)c(deals)g(exclusiv)m(ely)h(with)e (the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f (Do)s(cumen)m(t)330 4792 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m (erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con) m(tains)h(nothing)f(that)330 4902 y(could)j(fall)h(directly)g(within)f (that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42 b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330 5011 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section) h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40 b(The)330 5121 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e (historical)i(connection)f(with)f(the)h(sub)5 b(ject)27 b(or)g(with)g(related)330 5230 y(matters,)38 b(or)d(of)h(legal,)i (commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s (osition)f(regarding)330 5340 y(them.)p eop end %%Page: 254 260 TeXDict begin 254 259 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(254)330 299 y(The)25 b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g (Sections)g(whose)f(titles)i(are)f(designated,)i(as)330 408 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27 b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s (cumen)m(t)g(is)g(released)330 518 y(under)f(this)i(License.)40 b(If)27 b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h (de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 628 y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5 b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero) e(In)m(v)-5 b(arian)m(t)330 737 y(Sections.)39 b(If)25 b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v) -5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330 878 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short) g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8 b(ron)m(t-Co)m(v)m(er)330 988 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er) j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f (Do)s(cumen)m(t)h(is)f(released)g(under)330 1097 y(this)h(License.)40 b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26 b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m (v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 1207 y(b)s(e)k(at)h(most)g(25)g(w) m(ords.)330 1348 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m (hine-readable)h(cop)m(y)-8 b(,)38 b(represen)m(ted)330 1457 y(in)d(a)h(format)g(whose)g(sp)s(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g(public,)h(that)f(is)g(suitable)g (for)330 1567 y(revising)c(the)g(do)s(cumen)m(t)f(straigh)m(tforw)m (ardly)i(with)e(generic)i(text)g(editors)f(or)f(\(for)h(images)h(com-) 330 1677 y(p)s(osed)23 b(of)h(pixels\))g(generic)h(pain)m(t)f(programs) g(or)f(\(for)h(dra)m(wings\))g(some)g(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1786 y(editor,)k(and)f(that)g(is)g (suitable)h(for)f(input)f(to)i(text)g(formatters)f(or)g(for)g (automatic)i(translation)f(to)330 1896 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g(otherwise)330 2005 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g(whose)f(markup,)i(or)e (absence)h(of)g(markup,)g(has)g(b)s(een)f(arranged)g(to)330 2115 y(th)m(w)m(art)27 b(or)g(discourage)g(subsequen)m(t)f(mo)s (di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8 b(ransparen)m(t.)39 b(An)27 b(image)330 2225 y(format)35 b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g(substan)m(tial)h(amoun) m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g(is)330 2334 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i(\\Opaque".)330 2475 y(Examples)49 b(of)f(suitable)i(formats)f(for)f(T)-8 b(ransparen)m(t)48 b(copies)i(include)e(plain)h(ASCI)s(I)e(without)330 2585 y(markup,)33 b(T)-8 b(exinfo)33 b(input)f(format,)i(LaT)1745 2604 y(E)1795 2585 y(X)f(input)f(format,)j(SGML)d(or)h(XML)h(using)e(a) h(publicly)330 2694 y(a)m(v)-5 b(ailable)36 b(DTD,)e(and)f (standard-conforming)h(simple)f(HTML,)h(P)m(ostScript)g(or)g(PDF)g (designed)330 2804 y(for)h(h)m(uman)g(mo)s(di\014cation.)57 b(Examples)35 b(of)h(transparen)m(t)f(image)i(formats)f(include)f(PNG,) h(X)m(CF)330 2913 y(and)h(JPG.)62 b(Opaque)36 b(formats)i(include)f (proprietary)g(formats)h(that)g(can)g(b)s(e)e(read)i(and)f(edited)330 3023 y(only)c(b)m(y)g(proprietary)f(w)m(ord)h(pro)s(cessors,)g(SGML)g (or)g(XML)g(for)g(whic)m(h)g(the)g(DTD)g(and/or)g(pro-)330 3133 y(cessing)26 b(to)s(ols)g(are)g(not)f(generally)i(a)m(v)-5 b(ailable,)29 b(and)24 b(the)i(mac)m(hine-generated)h(HTML,)e(P)m (ostScript)330 3242 y(or)30 b(PDF)h(pro)s(duced)e(b)m(y)h(some)h(w)m (ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330 3383 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m (ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f (follo)m(wing)330 3493 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g (legibly)-8 b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h (app)s(ear)f(in)h(the)330 3602 y(title)g(page.)40 b(F)-8 b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h (an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 3712 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s (earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330 3821 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330 3962 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit) m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330 4072 y(to)c(the)g(public.)330 4213 y(A)f(section)h(\\En)m(titled)g (XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h (whose)e(title)i(either)330 4322 y(is)d(precisely)g(XYZ)g(or)f(con)m (tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f (translates)h(XYZ)e(in)330 4432 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f (men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4542 y(as)i(\\Ac)m(kno)m (wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f (\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4651 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s (dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330 4761 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g (de\014nition.)330 4902 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W) -8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m (h)e(states)i(that)330 5011 y(this)34 b(License)g(applies)g(to)h(the)f (Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330 5121 y(b)s(e)k(included)g(b)m (y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f (disclaiming)i(w)m(arran)m(ties:)330 5230 y(an)m(y)e(other)g (implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330 5340 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)p eop end %%Page: 255 261 TeXDict begin 255 260 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(255)199 299 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)330 445 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h(the)g(Do)s(cumen)m(t)h(in)f(an) m(y)g(medium,)h(either)g(commercially)h(or)330 555 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j(and)42 b(the)h(license)330 664 y(notice)37 b(sa)m(ying)g(this)e(License)i(applies)e(to)i(the)f(Do) s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g(copies,)j(and)330 774 y(that)27 b(y)m(ou)g(add)f(no)h(other)f(conditions)h(whatso)s(ev)m (er)h(to)f(those)g(of)g(this)f(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 883 y(tec)m(hnical)35 b(measures)d(to)i (obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g(further)e(cop)m (ying)j(of)f(the)g(copies)330 993 y(y)m(ou)25 b(mak)m(e)g(or)g (distribute.)38 b(Ho)m(w)m(ev)m(er,)28 b(y)m(ou)d(ma)m(y)g(accept)h (comp)s(ensation)f(in)f(exc)m(hange)j(for)d(copies.)330 1103 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f(n)m(um)m(b)s (er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g(the)f (conditions)330 1212 y(in)e(section)i(3.)330 1358 y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g (conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g (publicly)330 1468 y(displa)m(y)31 b(copies.)199 1614 y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1760 y(If)25 b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g (that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330 1870 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f (100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330 1979 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i (the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36 b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 2089 y(these)j(Co)m(v)m (er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41 b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44 b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330 2198 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m) m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f (the)h(publisher)330 2308 y(of)k(these)h(copies.)53 b(The)34 b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i (with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2418 y(equally)e (prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g (other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330 2527 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v) m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the) 330 2637 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d (b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330 2746 y(resp)s(ects.)330 2892 y(If)32 b(the)h(required)f(texts)i(for)e (either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g (legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 3002 y(the)h(\014rst)f (ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the) g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330 3112 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3258 y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f (the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330 3367 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g (T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque) 330 3477 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h (Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d (whic)m(h)330 3587 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e (has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m (ork)330 3696 y(proto)s(cols)40 b(a)f(complete)h(T)-8 b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g (added)f(material.)67 b(If)330 3806 y(y)m(ou)39 b(use)g(the)g(latter)h (option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e (steps,)k(when)d(y)m(ou)h(b)s(egin)330 3915 y(distribution)f(of)g (Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38 b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330 4025 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s (cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h (time)330 4134 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i (\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h (of)f(that)330 4244 y(edition)31 b(to)g(the)g(public.)330 4390 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g (con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330 4500 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s (er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m (vide)g(y)m(ou)330 4609 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g (the)f(Do)s(cumen)m(t.)199 4756 y(4.)61 b(MODIFICA)-8 b(TIONS)330 4902 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a) h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under) e(the)h(conditions)330 5011 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v) m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f (V)-8 b(ersion)22 b(under)d(precisely)330 5121 y(this)29 b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30 b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f (licensing)330 5230 y(distribution)k(and)h(mo)s(di\014cation)g(of)h (the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s (ossesses)f(a)i(cop)m(y)g(of)330 5340 y(it.)41 b(In)30 b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s (di\014ed)e(V)-8 b(ersion:)p eop end %%Page: 256 262 TeXDict begin 256 261 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(256)357 299 y(A.)60 b(Use)33 b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m (ers,)i(if)e(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the) 510 408 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m (ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8 b(,)510 518 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g (the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same) h(title)h(as)510 628 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original) i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 758 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h (one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c (for)510 867 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g (Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h (\014v)m(e)510 977 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s (cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g (few)m(er)510 1087 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g (y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1217 y(C.)60 b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g (publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32 b(as)f(the)510 1326 y(publisher.)355 1456 y(D.)61 b(Preserv)m(e)31 b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.) 363 1587 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i (notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g (other)510 1696 y(cop)m(yrigh)m(t)g(notices.)365 1826 y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g (notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510 1936 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g (form)510 2045 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353 2176 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f (full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e (required)g(Co)m(v)m(er)510 2285 y(T)-8 b(exts)31 b(giv)m(en)g(in)f (the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2415 y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.) 392 2545 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g (\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g (item)510 2655 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d (authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)510 2765 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45 b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e (the)g(Do)s(cu-)510 2874 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f (title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s (cumen)m(t)510 2984 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i (then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8 b(ersion)37 b(as)510 3093 y(stated)31 b(in)f(the)h(previous)f(sen)m (tence.)378 3224 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s (cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m (t)h(for)g(public)e(access)j(to)510 3333 y(a)e(T)-8 b(ransparen)m(t)30 b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net) m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3443 y(the)g(Do)s(cumen)m (t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45 b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3552 y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net) m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h (published)510 3662 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e (the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher) d(of)i(the)510 3771 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s (ermission.)354 3902 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m (titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k (Preserv)m(e)c(the)g(Title)510 4011 y(of)j(the)f(section,)j(and)d (preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone) h(of)f(eac)m(h)i(of)f(the)510 4121 y(con)m(tributor)k(ac)m(kno)m (wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368 4251 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f (in)f(their)g(text)i(and)510 4361 y(in)f(their)g(titles.)58 b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5 b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510 4470 y(section)c(titles.)341 4600 y(M.)61 b(Delete)33 b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42 b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510 4710 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357 4840 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f (to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g (in)510 4950 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31 b(Section.)354 5080 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8 b(arran)m(t)m(y)32 b(Disclaimers.)330 5230 y(If)h(the)g(Mo)s(di\014ed)g (V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f (app)s(endices)g(that)h(qualify)330 5340 y(as)28 b(Secondary)g (Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h (Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)p eop end %%Page: 257 263 TeXDict begin 257 262 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(257)330 299 y(y)m(our)32 b(option)h(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e (in)m(v)-5 b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)330 408 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 b(ersion's)36 b(license)g(notice.)57 b(These)330 518 y(titles)32 b(m)m(ust)e(b)s(e)g (distinct)h(from)e(an)m(y)i(other)g(section)g(titles.)330 650 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)i(En)m(titled)f (\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g(nothing)g(but) 330 759 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30 b(parties|for)g(example,)g (statemen)m(ts)i(of)330 869 y(p)s(eer)27 b(review)g(or)g(that)h(the)f (text)i(has)d(b)s(een)h(appro)m(v)m(ed)g(b)m(y)g(an)h(organization)h (as)e(the)h(authoritativ)m(e)330 978 y(de\014nition)i(of)h(a)f (standard.)330 1110 y(Y)-8 b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g (up)e(to)i(\014v)m(e)g(w)m(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er) 30 b(T)-8 b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1219 y(to)g(25)g(w)m(ords)e(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s(di\014ed)330 1329 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f(F)-8 b(ron)m(t-Co)m(v)m (er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1439 y(added)27 b(b)m(y)g(\(or)h(through) f(arrangemen)m(ts)h(made)g(b)m(y\))g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)g(already)330 1548 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g(same)h(co)m(v)m (er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m(y)g(arrangemen)m (t)330 1658 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m(y)i(y)m(ou)f(are)f (acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g(not)f(add)g (another;)j(but)330 1767 y(y)m(ou)c(ma)m(y)h(replace)g(the)f(old)g (one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e (publisher)f(that)330 1877 y(added)e(the)g(old)h(one.)330 2008 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s (cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s (ermission)330 2118 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g (for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g (Mo)s(di\014ed)330 2228 y(V)-8 b(ersion.)199 2359 y(5.)61 b(COMBINING)31 b(DOCUMENTS)330 2491 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m (bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h (released)g(under)f(this)g(License,)330 2600 y(under)f(the)h(terms)g (de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f (v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2710 y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5 b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s (cumen)m(ts,)330 2819 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g (as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined) g(w)m(ork)f(in)h(its)g(license)330 2929 y(notice,)32 b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8 b(arran)m(t)m(y)32 b(Disclaimers.)330 3061 y(The)e(com)m(bined)g(w)m (ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,) i(and)d(m)m(ultiple)i(iden)m(tical)330 3170 y(In)m(v)-5 b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h (single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m (v)-5 b(arian)m(t)330 3280 y(Sections)27 b(with)g(the)g(same)g(name)g (but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f (eac)m(h)h(suc)m(h)f(section)330 3389 y(unique)33 b(b)m(y)h(adding)f (at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g (the)g(original)h(author)f(or)330 3499 y(publisher)23 b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m (um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330 3608 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5 b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h (com)m(bined)330 3718 y(w)m(ork.)330 3850 y(In)41 b(the)g(com)m (bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g (En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330 3959 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h (En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330 4069 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31 b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47 b(Y)-8 b(ou)330 4178 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m (titled)f(\\Endorsemen)m(ts.")199 4310 y(6.)61 b(COLLECTIONS)28 b(OF)i(DOCUMENTS)330 4441 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f (collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g (do)s(cumen)m(ts)f(released)330 4551 y(under)41 b(this)h(License,)k (and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f (the)h(v)-5 b(arious)330 4661 y(do)s(cumen)m(ts)42 b(with)g(a)h(single) g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48 b(pro)m(vided)42 b(that)i(y)m(ou)330 4770 y(follo)m(w)38 b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g (of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330 4880 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32 b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h (collection,)i(and)d(distribute)g(it)h(individu-)330 5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g (a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330 5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g (other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330 5340 y(that)d(do)s(cumen)m(t.)p eop end %%Page: 258 264 TeXDict begin 258 263 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(258)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m (olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called) 330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e (from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m (ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39 b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g (aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g (other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h (not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h (Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f (these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241 y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f (of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m (er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m (ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h (aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5 b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f (in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330 1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f (brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61 b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a) i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e (translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h (terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5 b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f (sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i (holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24 b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25 b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330 2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44 b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f (License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the) h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42 b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513 y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g (License)h(and)e(the)h(original)h(v)m(ersions)g(of)330 2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33 b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f (translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f (License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m (ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28 b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m (kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330 3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m (e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330 3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61 b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8 b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h (Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38 b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g (cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330 3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically) i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330 3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i (of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h (particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h (\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g (cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h (terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8 b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34 b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h (reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288 y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d (license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h (reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h (holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g (reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m (ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f (License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330 4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g (violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h (of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28 b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h (terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38 b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g (under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e) 330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g (reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f (the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f (an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end %%Page: 259 265 TeXDict begin 259 264 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(259)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F) -8 b(ree)330 543 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to) g(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h (in)g(spirit)330 653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m (y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i (concerns.)330 762 y(See)c Fq(http://www.gnu.org/copy)o(left)o(/)p Fw(.)330 897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m (en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29 b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g (License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f (follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330 1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m (ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g (b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8 b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s (ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445 y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m (ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the) h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46 b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f (can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f (License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen) m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m (tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g (for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330 2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or) e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330 2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m (table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h (facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g (w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i (edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33 b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s (oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330 2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m (orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330 2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m (ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330 2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a) g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330 2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29 b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions) f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g (organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e (or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h (as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330 3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h (licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330 3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h (License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330 3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f (part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts) 330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j (w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s (er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h (Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site) g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g (time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is) 330 4005 y(eligible)h(for)e(relicensing.)p eop end %%Page: 260 266 TeXDict begin 260 265 bop 150 -116 a Fw(App)s(endix)29 b(C:)h(Cop)m(ying)g(Information)2098 b(260)150 299 y Fv(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f(for)g(y)l(our)g (do)t(cumen)l(ts)150 458 y Fw(T)-8 b(o)35 b(use)f(this)h(License)g(in)f (a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e)i(written,)g(include)f(a)f (cop)m(y)i(of)f(the)f(License)h(in)g(the)150 568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m(t)g(and)e(license)h (notices)g(just)f(after)h(the)g(title)h(page:)468 680 y Fn(Copyright)42 b(\(C\))79 b Fc(year)g(your)40 b(name)p Fn(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h(distribute)g (and/or)g(modify)f(this)g(document)468 854 y(under)h(the)f(terms)g(of)g (the)g(GNU)g(Free)g(Documentation)i(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h(published)h(by)d(the)h(Free)g (Software)h(Foundation;)468 1029 y(with)g(no)e(Invariant)j(Sections,)f (no)f(Front-Cover)h(Texts,)g(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f(license)i(is)f(included)h (in)f(the)g(section)g(entitled)h(``GNU)468 1203 y(Free)g(Documentation) h(License''.)275 1337 y Fw(If)d(y)m(ou)h(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8 b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6 b(.)22 b(.)g(.)12 b(T)-8 b(exts.")31 b(line)g(with)f(this:)547 1559 y Fn(with)40 b(the)g(Invariant)h(Sections)g(being)g Fc(list)f(their)g(titles)p Fn(,)h(with)547 1646 y(the)f(Front-Cover)i(Texts)e(being)g Fc(list)p Fn(,)h(and)f(with)g(the)g(Back-Cover)h(Texts)547 1733 y(being)f Fc(list)p Fn(.)275 1868 y Fw(If)34 b(y)m(ou)i(ha)m(v)m (e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)i(to)e (suit)f(the)h(situation.)275 2112 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f (con)m(tains)i(non)m(trivial)g(examples)g(of)f(program)f(co)s(de,)j(w)m (e)e(recommend)g(releasing)150 2222 y(these)44 b(examples)f(in)g (parallel)h(under)e(y)m(our)h(c)m(hoice)i(of)e(free)g(soft)m(w)m(are)h (license,)k(suc)m(h)43 b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m (w)m(are.)p eop end %%Page: 261 267 TeXDict begin 261 266 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(261)150 299 y Ft(F)-13 b(unction)52 b(and)h(Data)i(Index)150 610 y Fv(A)150 727 y Fn(ago)26 b Fo(in)g(date)g(strings)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)36 b Fo(54)150 814 y Fn(am)26 b Fo(in)g(date)f(strings)12 b Fb(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)38 b Fo(53)150 1066 y Fv(D)150 1182 y Fn(day)26 b Fo(in)g(date)g(strings)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fo(54)150 1436 y Fv(F)150 1552 y Fn(first)27 b Fo(in)e(date)h (strings)c Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)48 b Fo(51)150 1640 y Fn(fortnight)28 b Fo(in)d(date)h(strings)11 b Fb(:)j(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)37 b Fo(54)150 1893 y Fv(H)150 2010 y Fn(hour)27 b Fo(in)e(date)h(strings)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)33 b Fo(54)150 2261 y Fv(L)150 2378 y Fn(last)27 b Fc(day)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(54)150 2466 y Fn(last)27 b Fo(in)e(date)h(strings)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fo(51)150 2717 y Fv(M)150 2833 y Fn(midnight)27 b Fo(in)f(date)g(strings)14 b Fb(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)40 b Fo(53)150 2921 y Fn(minute)27 b Fo(in)f(date)f(strings)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fo(54)150 3009 y Fn(month)27 b Fo(in)e(date)h(strings)c Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)48 b Fo(54)150 3260 y Fv(N)150 3377 y Fn(next)27 b Fc(day)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)45 b Fo(54)150 3464 y Fn(next)27 b Fo(in)e(date)h(strings)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fo(51)150 3552 y Fn(noon)27 b Fo(in)e(date)h(strings)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fo(53)150 3639 y Fn(now)26 b Fo(in)g(date)g(strings)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fo(54)150 3890 y Fv(P)150 4007 y Fn(parse_datetime)14 b Fb(:)i(:)d(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)40 b Fo(50)150 4095 y Fn(pm)26 b Fo(in)g(date)f(strings)12 b Fb(:)i(:)f(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)38 b Fo(53)150 4348 y Fv(S)150 4465 y Fn(shisa)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)44 b Fo(228)150 4552 y Fn(shisa_cfg)7 b Fb(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fo(229)150 4640 y Fn(shisa_cfg_db)17 b Fb(:)f(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fo(229)150 4727 y Fn(shisa_cfg_default_systemfile)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(229)150 4815 y Fn(shisa_cfg_from_file)16 b Fb(:)h(:)d(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)43 b Fo(229)150 4902 y Fn(shisa_done)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(228)150 4990 y Fn(shisa_enumerate_principals)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(230)150 5077 y Fn(shisa_enumerate_realms)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)35 b Fo(229)150 5165 y Fn(shisa_info)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 49 b Fo(233)150 5252 y Fn(shisa_init)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(228)150 5340 y Fn(shisa_init_with_paths)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(228)2025 610 y Fn(shisa_key_add)14 b Fb(:)i(:)d(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fo(232)2025 698 y Fn(shisa_key_free)12 b Fb(:)k(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fo(233)2025 785 y Fn(shisa_key_remove)7 b Fb(:)16 b(:)d(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)33 b Fo(232)2025 873 y Fn(shisa_key_update)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(232)2025 961 y Fn(shisa_keys_find)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)36 b Fo(231)2025 1048 y Fn(shisa_keys_free)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(233)2025 1136 y Fn(shisa_principal_add)16 b Fb(:)h(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)43 b Fo(231)2025 1223 y Fn(shisa_principal_find)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(230)2025 1311 y Fn(shisa_principal_remove)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(231)2025 1399 y Fn(shisa_principal_update)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(230)2025 1486 y Fn(shisa_strerror)12 b Fb(:)k(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fo(233)2025 1574 y Fn(shishi)17 b Fb(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(61)2025 1661 y Fn(shishi_3des)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(199)2025 1749 y Fn(shishi_aes_cts)12 b Fb(:)k(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)39 b Fo(199)2025 1836 y Fn(shishi_ap)9 b Fb(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)36 b Fo(72)2025 1924 y Fn(shishi_ap_authenticator)8 b Fb(:)18 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)34 b Fo(77)2025 2012 y Fn (shishi_ap_authenticator_cksumd)q(ata)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(76)2025 2099 y Fn (shishi_ap_authenticator_cksumd)q(ata_s)q(et)7 b Fb(:)19 b(:)13 b(:)g(:)g(:)33 b Fo(76)2025 2187 y Fn (shishi_ap_authenticator_cksumr)q(aw_se)q(t)9 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)35 b Fo(77)2025 2274 y Fn (shishi_ap_authenticator_cksumt)q(ype)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(77)2025 2362 y Fn (shishi_ap_authenticator_cksumt)q(ype_s)q(et)7 b Fb(:)19 b(:)13 b(:)g(:)g(:)33 b Fo(77)2025 2450 y Fn (shishi_ap_authenticator_set)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)41 b Fo(78)2025 2537 y Fn(shishi_ap_done)14 b Fb(:)i(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)40 b Fo(73)2025 2625 y Fn(shishi_ap_encapreppart)10 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)37 b Fo(82)2025 2712 y Fn (shishi_ap_encapreppart_set)17 b Fb(:)i(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fo(82)2025 2800 y Fn(shishi_ap_etype)11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)38 b Fo(72)2025 2888 y Fn(shishi_ap_etype_tktoptionsdata)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fo(75)2025 2975 y Fn(shishi_ap_key)16 b Fb(:)g(:)d(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(80)2025 3063 y Fn(shishi_ap_nosubkey)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(72)2025 3150 y Fn(shishi_ap_option2string)8 b Fb(:)18 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)34 b Fo(82)2025 3238 y Fn(shishi_ap_rep)16 b Fb(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(80)2025 3325 y Fn(shishi_ap_rep_asn1)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(81)2025 3413 y Fn(shishi_ap_rep_build)18 b Fb(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(81)2025 3501 y Fn(shishi_ap_rep_der)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(80)2025 3588 y Fn(shishi_ap_rep_der_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(80)2025 3676 y Fn(shishi_ap_rep_set)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(80)2025 3763 y Fn(shishi_ap_rep_verify)16 b Fb(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fo(81)2025 3851 y Fn(shishi_ap_rep_verify_asn1)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)46 b Fo(81)2025 3939 y Fn(shishi_ap_rep_verify_der)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(81)2025 4026 y Fn(shishi_ap_req)16 b Fb(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(78)2025 4114 y Fn(shishi_ap_req_asn1)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(79)2025 4201 y Fn(shishi_ap_req_build)18 b Fb(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(79)2025 4289 y Fn(shishi_ap_req_decode)16 b Fb(:)h(:)c(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)42 b Fo(79)2025 4377 y Fn(shishi_ap_req_der)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(78)2025 4464 y Fn(shishi_ap_req_der_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(78)2025 4552 y Fn(shishi_ap_req_process)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)40 b Fo(79)2025 4639 y Fn (shishi_ap_req_process_keyusage)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)34 b Fo(79)2025 4727 y Fn(shishi_ap_req_set)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(78)2025 4814 y Fn(shishi_ap_set_tktoptions)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 b Fo(73)2025 4902 y Fn(shishi_ap_set_tktoptionsasn1us)q(age)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(74)2025 4990 y Fn(shishi_ap_set_tktoptionsdata)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39 b Fo(73)2025 5077 y Fn(shishi_ap_set_tktoptionsraw)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) 41 b Fo(73)2025 5165 y Fn(shishi_ap_string2option)8 b Fb(:)18 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)34 b Fo(82)2025 5252 y Fn(shishi_ap_tkt)16 b Fb(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(76)2025 5340 y Fn(shishi_ap_tkt_set)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(76)p eop end %%Page: 262 268 TeXDict begin 262 267 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(262)150 299 y Fn(shishi_ap_tktoptions)16 b Fb(:)h(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(74)150 387 y Fn (shishi_ap_tktoptionsasn1usage)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(75)150 476 y Fn (shishi_ap_tktoptionsdata)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(74)150 564 y Fn(shishi_ap_tktoptionsraw)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fo(75)150 653 y Fn(shishi_aprep)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(87)150 741 y Fn(shishi_aprep_from_file)10 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(88)150 830 y Fn(shishi_aprep_get_enc_part_ety)q(pe)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fo(88)150 918 y Fn(shishi_aprep_parse)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(87)150 1006 y Fn(shishi_aprep_print)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(87)150 1095 y Fn(shishi_aprep_read)6 b Fb(:)17 b(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)32 b Fo(88)150 1183 y Fn(shishi_aprep_save)6 b Fb(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fo(87)150 1272 y Fn(shishi_aprep_to_file)16 b Fb(:)h(:)c(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(87)150 1360 y Fn(shishi_apreq)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(82)150 1449 y Fn(shishi_apreq_add_authenticato)q(r)7 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(84)150 1537 y Fn(shishi_apreq_from_file)10 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)37 b Fo(84)150 1625 y Fn(shishi_apreq_get_authenticato)q (r_et)q(ype)10 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)35 b Fo(86)150 1714 y Fn(shishi_apreq_get_ticket)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)34 b Fo(86)150 1802 y Fn(shishi_apreq_mutual_required_)q(p) 7 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(85)150 1891 y Fn(shishi_apreq_options)16 b Fb(:)h(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)42 b Fo(85)150 1979 y Fn(shishi_apreq_options_add)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)49 b Fo(86)150 2068 y Fn(shishi_apreq_options_remove)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) 41 b Fo(86)150 2156 y Fn(shishi_apreq_options_set)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)49 b Fo(85)150 2245 y Fn(shishi_apreq_parse)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(83)150 2333 y Fn(shishi_apreq_print)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 47 b Fo(82)150 2421 y Fn(shishi_apreq_read)6 b Fb(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fo(83)150 2510 y Fn(shishi_apreq_save)6 b Fb(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)32 b Fo(83)150 2598 y Fn(shishi_apreq_set_authenticato)q(r)7 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(84)150 2687 y Fn(shishi_apreq_set_ticket)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)34 b Fo(85)150 2775 y Fn(shishi_apreq_to_file)16 b Fb(:)h(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(83)150 2864 y Fn (shishi_apreq_use_session_key_)q(p)7 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(85)150 2952 y Fn(shishi_arcfour)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)38 b Fo(198)150 3041 y Fn(shishi_as)7 b Fb(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) 34 b Fo(115)150 3129 y Fn(shishi_as_check_cname)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(133)150 3217 y Fn (shishi_as_check_crealm)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(133)150 3306 y Fn(shishi_as_derive_salt)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(132)150 3394 y Fn(shishi_as_done)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)38 b Fo(115)150 3483 y Fn(shishi_as_krberror)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(118)150 3571 y Fn(shishi_as_krberror_der)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(118)150 3660 y Fn(shishi_as_krberror_set)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(118)150 3748 y Fn(shishi_as_process)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(134)150 3836 y Fn(shishi_as_rep)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)41 b Fo(116)150 3925 y Fn(shishi_as_rep_build)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(117)150 4013 y Fn (shishi_as_rep_der)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(117)150 4102 y Fn(shishi_as_rep_der_set)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(117)150 4190 y Fn(shishi_as_rep_process)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(117)150 4279 y Fn(shishi_as_rep_set) 25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(117)150 4367 y Fn(shishi_as_req)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)41 b Fo(115)150 4456 y Fn(shishi_as_req_build)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(116)150 4544 y Fn (shishi_as_req_der)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(116)150 4632 y Fn(shishi_as_req_der_set)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(116)150 4721 y Fn(shishi_as_req_set)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(116)150 4809 y Fn(shishi_as_sendrecv)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(119)150 4898 y Fn(shishi_as_sendrecv_hint)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)50 b Fo(118)150 4986 y Fn(shishi_as_tkt)14 b Fb(:)i(:)d(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(118)150 5075 y Fn(shishi_as_tkt_set)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(118)150 5163 y Fn(shishi_asn1_aprep)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(212)150 5252 y Fn(shishi_asn1_apreq)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(212)150 5340 y Fn(shishi_asn1_asrep)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(211)2025 299 y Fn(shishi_asn1_asreq)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(211)2025 387 y Fn(shishi_asn1_authenticator)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(212)2025 476 y Fn(shishi_asn1_done)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(210)2025 564 y Fn(shishi_asn1_encapreppart)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(212)2025 653 y Fn(shishi_asn1_encasreppart)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(213)2025 741 y Fn(shishi_asn1_enckdcreppart)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(213)2025 830 y Fn(shishi_asn1_encprivpart)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(213)2025 918 y Fn(shishi_asn1_encrypteddata)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(210)2025 1007 y Fn(shishi_asn1_encticketpart)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(212)2025 1095 y Fn(shishi_asn1_etype_info)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(211)2025 1184 y Fn(shishi_asn1_etype_info2)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(211)2025 1272 y Fn(shishi_asn1_krberror)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(213)2025 1361 y Fn(shishi_asn1_krbsafe)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(213)2025 1450 y Fn(shishi_asn1_methoddata)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(211)2025 1538 y Fn(shishi_asn1_msgtype)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(214)2025 1627 y Fn (shishi_asn1_pa_enc_ts_enc)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(210)2025 1715 y Fn(shishi_asn1_padata)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(211)2025 1804 y Fn(shishi_asn1_print)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(221)2025 1892 y Fn(shishi_asn1_priv)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) 33 b Fo(213)2025 1981 y Fn(shishi_asn1_read)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(209)2025 2069 y Fn(shishi_asn1_read_inline)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(209)2025 2158 y Fn(shishi_asn1_read_optional)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(210)2025 2246 y Fn(shishi_asn1_tgsrep)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(212)2025 2335 y Fn(shishi_asn1_tgsreq)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(211)2025 2423 y Fn(shishi_asn1_ticket)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(212)2025 2512 y Fn (shishi_asn1_to_der)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(214)2025 2600 y Fn(shishi_asn1_to_der_field)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(214)2025 2689 y Fn(shishi_asrep)17 b Fb(:)e(:)f(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(146)2025 2777 y Fn(shishi_asreq)17 b Fb(:)e(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)44 b Fo(135)2025 2866 y Fn(shishi_asreq_clientrealm)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(138)2025 2954 y Fn(shishi_authenticator)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(153)2025 3043 y Fn(shishi_authenticator_add_autho)q(rizat)q(iond)q(ata)2200 3130 y Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(160)2025 3218 y Fn(shishi_authenticator_add_cksum)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)49 b Fo(159)2025 3307 y Fn (shishi_authenticator_add_cksum)q(_type)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)36 b Fo(159)2025 3395 y Fn (shishi_authenticator_add_rando)q(m_sub)q(key)25 b Fb(:)13 b(:)46 b Fo(161)2025 3484 y Fn(shishi_authenticator_add_rando)q(m_sub)q (key_)2178 3571 y(etype)9 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fo(162)2025 3660 y Fn(shishi_authenticator_add_subke)q(y)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)46 b Fo(162)2025 3748 y Fn(shishi_authenticator_authoriza)q(tiond)q(ata)25 b Fb(:)13 b(:)46 b Fo(160)2025 3837 y Fn(shishi_authenticator_cksum)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(158)2025 3925 y Fn(shishi_authenticator_clear_)2178 4012 y(authorizationdata)13 b Fb(:)k(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)39 b Fo(160)2025 4101 y Fn(shishi_authenticator_client)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(158)2025 4189 y Fn(shishi_authenticator_client_se)q(t)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)46 b Fo(156)2025 4278 y Fn(shishi_authenticator_clientrea)q(lm)17 b Fb(:)i(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fo(158)2025 4366 y Fn (shishi_authenticator_ctime)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(156)2025 4455 y Fn(shishi_authenticator_ctime_set)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)49 b Fo(156)2025 4543 y Fn (shishi_authenticator_cusec_get)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)49 b Fo(157)2025 4632 y Fn (shishi_authenticator_cusec_set)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)49 b Fo(157)2025 4720 y Fn (shishi_authenticator_from_file)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)49 b Fo(155)2025 4809 y Fn (shishi_authenticator_get_subke)q(y)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)46 b Fo(161)2025 4897 y Fn(shishi_authenticator_parse)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(155)2025 4986 y Fn(shishi_authenticator_print)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(154)2025 5074 y Fn(shishi_authenticator_read)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(155)2025 5163 y Fn(shishi_authenticator_remove_su)q(bkey)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(161)2025 5251 y Fn(shishi_authenticator_save)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(154)2025 5340 y Fn(shishi_authenticator_seqnumber)q(_get)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(157)p eop end %%Page: 263 269 TeXDict begin 263 268 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(263)150 299 y Fn (shishi_authenticator_seqnumbe)q(r_re)q(move)28 b Fb(:)13 b(:)g(:)48 b Fo(157)150 387 y Fn(shishi_authenticator_seqnumbe)q(r_se)q (t)12 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(157)150 476 y Fn(shishi_authenticator_set_cksu)q(m)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(159)150 564 y Fn(shishi_authenticator_set_cnam)q(e)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(156)150 653 y Fn(shishi_authenticator_set_crea)q(lm)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(155)150 741 y Fn(shishi_authenticator_set_subk)q(ey)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(161)150 830 y Fn(shishi_authenticator_subkey)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(154)150 918 y Fn(shishi_authenticator_to_file)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(154)150 1006 y Fn(shishi_authorization_parse)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(206)150 1095 y Fn(shishi_authorize_k5login)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(206)150 1183 y Fn(shishi_authorize_strcmp)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(206)150 1272 y Fn(shishi_authorized_p)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(207)150 1360 y Fn(shishi_cfg)7 b Fb(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)33 b Fo(63)150 1449 y Fn(shishi_cfg_authorizationtype_)q(set)25 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(65)150 1537 y Fn(shishi_cfg_clientkdcetype)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(64)150 1625 y Fn(shishi_cfg_clientkdcetype_fas)q(t)7 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(64)150 1714 y Fn(shishi_cfg_clientkdcetype_set)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(64)150 1802 y Fn(shishi_cfg_default_systemfile)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(63)150 1891 y Fn(shishi_cfg_default_userdirect)q(ory)25 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(63)150 1979 y Fn(shishi_cfg_default_userfile)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 b Fo(64)150 2068 y Fn(shishi_cfg_from_file)16 b Fb(:)h(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)42 b Fo(63)150 2156 y Fn(shishi_cfg_print)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(63)150 2245 y Fn(shishi_cfg_userdirectory_file)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(64)150 2333 y Fn(shishi_check_version)16 b Fb(:)h(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)42 b Fo(58)150 2421 y Fn(shishi_checksum)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(185)150 2510 y Fn(shishi_checksum_cksumlen)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(184)150 2598 y Fn(shishi_checksum_name)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(184)150 2687 y Fn(shishi_checksum_parse)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(184)150 2775 y Fn(shishi_checksum_supported_p) 13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)39 b Fo(184)150 2864 y Fn(shishi_cipher_blocksize)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(183)150 2952 y Fn(shishi_cipher_confoundersize)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(183)150 3041 y Fn(shishi_cipher_defaultcksumtyp)q(e)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(183)150 3129 y Fn(shishi_cipher_keylen)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)40 b Fo(183)150 3217 y Fn(shishi_cipher_name)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(183)150 3306 y Fn(shishi_cipher_parse)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(184)150 3394 y Fn(shishi_cipher_randomlen)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)50 b Fo(183)150 3483 y Fn(shishi_cipher_supported_p)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(182)150 3571 y Fn(shishi_crc)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(196)150 3660 y Fn(shishi_crypto)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(195)150 3748 y Fn (shishi_crypto_close)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(196)150 3836 y Fn(shishi_crypto_decrypt)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(195)150 3925 y Fn(shishi_crypto_encrypt)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(195)150 4013 y Fn(shishi_ctime)17 b Fb(:)f(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fo(208)150 4102 y Fn(shishi_decrypt)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)38 b Fo(193)150 4190 y Fn(shishi_decrypt_etype) 13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(191)150 4279 y Fn(shishi_decrypt_iv)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(192)150 4367 y Fn(shishi_decrypt_iv_etype)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)50 b Fo(190)150 4456 y Fn(shishi_decrypt_ivupdate)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(192)150 4544 y Fn(shishi_decrypt_ivupdate_etype)9 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fo(190)150 4632 y Fn(shishi_der_msgtype)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(214)150 4721 y Fn(shishi_der2asn1)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(215)150 4809 y Fn(shishi_der2asn1_aprep)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(220)150 4898 y Fn(shishi_der2asn1_apreq)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(220)150 4986 y Fn (shishi_der2asn1_asrep)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(217)150 5075 y Fn(shishi_der2asn1_asreq)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(216)150 5163 y Fn (shishi_der2asn1_authenticator)9 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)34 b Fo(218)150 5252 y Fn (shishi_der2asn1_encapreppart)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(220)150 5340 y Fn (shishi_der2asn1_encasreppart)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(218)2025 299 y Fn (shishi_der2asn1_enckdcreppart)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)34 b Fo(218)2025 387 y Fn (shishi_der2asn1_encprivpart)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(219)2025 476 y Fn(shishi_der2asn1_enctgsreppart)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)34 b Fo(218)2025 564 y Fn (shishi_der2asn1_encticketpart)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)34 b Fo(216)2025 653 y Fn (shishi_der2asn1_etype_info)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(215)2025 741 y Fn(shishi_der2asn1_etype_info2)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(216)2025 830 y Fn(shishi_der2asn1_kdcrep)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(217)2025 918 y Fn(shishi_der2asn1_kdcreq)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(220)2025 1007 y Fn(shishi_der2asn1_krberror)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(219)2025 1095 y Fn(shishi_der2asn1_krbsafe)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(219)2025 1184 y Fn(shishi_der2asn1_methoddata)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(215)2025 1272 y Fn(shishi_der2asn1_padata)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)35 b Fo(215)2025 1360 y Fn(shishi_der2asn1_priv)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(219)2025 1449 y Fn(shishi_der2asn1_tgsrep)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(217)2025 1537 y Fn(shishi_der2asn1_tgsreq)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(217)2025 1626 y Fn(shishi_der2asn1_ticket)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)35 b Fo(216)2025 1714 y Fn (shishi_derive_default_salt)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(205)2025 1803 y Fn(shishi_des)24 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)49 b Fo(198)2025 1891 y Fn(shishi_des_cbc_mac)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(198)2025 1980 y Fn(shishi_dk)7 b Fb(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fo(194)2025 2068 y Fn(shishi_done)24 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 48 b Fo(61)2025 2157 y Fn(shishi_dr)7 b Fb(:)15 b(:)e(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fo(194)2025 2245 y Fn(shishi_encapreppart)18 b Fb(:)f(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)45 b Fo(88)2025 2334 y Fn(shishi_encapreppart_ctime)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)46 b Fo(90)2025 2422 y Fn(shishi_encapreppart_ctime_set)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(90)2025 2510 y Fn(shishi_encapreppart_cusec_get)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(91)2025 2599 y Fn(shishi_encapreppart_cusec_set)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(91)2025 2687 y Fn(shishi_encapreppart_from_file)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(90)2025 2776 y Fn(shishi_encapreppart_get_key)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) 41 b Fo(90)2025 2864 y Fn(shishi_encapreppart_parse)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)46 b Fo(89)2025 2953 y Fn(shishi_encapreppart_print)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)46 b Fo(88)2025 3041 y Fn(shishi_encapreppart_read)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(89)2025 3130 y Fn(shishi_encapreppart_save)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(89)2025 3218 y Fn(shishi_encapreppart_seqnumber_)q (get)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(91)2025 3307 y Fn(shishi_encapreppart_seqnumber_)q(remov)q(e)9 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)35 b Fo(91)2025 3395 y Fn(shishi_encapreppart_seqnumber_)q(set)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(91)2025 3484 y Fn (shishi_encapreppart_time_copy)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(92)2025 3572 y Fn (shishi_encapreppart_to_file)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)41 b Fo(89)2025 3660 y Fn(shishi_enckdcreppart_authtime_)q(set)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)h(:)f(:)41 b Fo(151)2025 3749 y Fn (shishi_enckdcreppart_endtime_s)q(et)17 b Fb(:)i(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fo(152)2025 3837 y Fn (shishi_enckdcreppart_flags_set)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)49 b Fo(151)2025 3926 y Fn(shishi_enckdcreppart_get_key) 11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(150)2025 4014 y Fn(shishi_enckdcreppart_key_set)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(151)2025 4103 y Fn(shishi_enckdcreppart_nonce_set)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)49 b Fo(151)2025 4191 y Fn(shishi_enckdcreppart_populate_)q(encti)q(cket)q (part)2200 4278 y Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(153)2025 4367 y Fn(shishi_enckdcreppart_renew_til)q(l_set)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)36 b Fo(152)2025 4455 y Fn(shishi_enckdcreppart_sname_set)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)49 b Fo(153)2025 4544 y Fn (shishi_enckdcreppart_srealm_se)q(t)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)46 b Fo(152)2025 4632 y Fn (shishi_enckdcreppart_starttime)q(_set)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(152)2025 4721 y Fn (shishi_encprivpart_set_user_da)q(ta)17 b Fb(:)i(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fo(102)2025 4809 y Fn (shishi_encprivpart_user_data)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(102)2025 4898 y Fn(shishi_encrypt)12 b Fb(:)k(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fo(189)2025 4986 y Fn(shishi_encrypt_etype)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)40 b Fo(187)2025 5075 y Fn(shishi_encrypt_iv)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(189)2025 5163 y Fn(shishi_encrypt_iv_etype)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(187)2025 5252 y Fn(shishi_encrypt_ivupdate)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)50 b Fo(188)2025 5340 y Fn(shishi_encrypt_ivupdate_etype)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)34 b Fo(186)p eop end %%Page: 264 270 TeXDict begin 264 269 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(264)150 299 y Fn (shishi_encticketpart_authtime)q(_set)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)41 b Fo(129)150 387 y Fn (shishi_encticketpart_client)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(130)150 476 y Fn(shishi_encticketpart_clientre)q(alm)18 b Fb(:)g(:)c(:)f(:)g(:)g(:)g (:)g(:)g(:)44 b Fo(130)150 564 y Fn(shishi_encticketpart_cname_se)q(t) 28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(129)150 653 y Fn(shishi_encticketpart_crealm_s)q(et)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(128)150 741 y Fn(shishi_encticketpart_endtime_)q(set)18 b Fb(:)g(:)c(:)f(:)g(:) g(:)g(:)g(:)g(:)44 b Fo(129)150 830 y Fn(shishi_encticketpart_flags_se) q(t)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(128)150 918 y Fn(shishi_encticketpart_get_key)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(128)150 1006 y Fn(shishi_encticketpart_key_set)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(128)150 1095 y Fn(shishi_encticketpart_transite)q(d_se)q(t)12 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(129)150 1183 y Fn(shishi_error)17 b Fb(:)f(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)43 b Fo(224)150 1272 y Fn(shishi_error_clear)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(224)150 1360 y Fn(shishi_error_outputtype)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(225)150 1449 y Fn(shishi_error_printf)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(225)150 1537 y Fn(shishi_error_set)7 b Fb(:)16 b(:)d(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)33 b Fo(225)150 1625 y Fn (shishi_error_set_outputtype)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(225)150 1714 y Fn(shishi_generalize_ctime)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(207)150 1802 y Fn(shishi_generalize_now)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(207)150 1891 y Fn(shishi_generalize_time)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(207)150 1979 y Fn(shishi_hmac_md5)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(197)150 2068 y Fn(shishi_hmac_sha1)7 b Fb(:)16 b(:)d(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)33 b Fo(197)150 2156 y Fn (shishi_hostkeys_default_file)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(181)150 2245 y Fn (shishi_hostkeys_default_file_)q(set)18 b Fb(:)g(:)c(:)f(:)g(:)g(:)g(:) g(:)g(:)44 b Fo(181)150 2333 y Fn(shishi_hostkeys_for_localserv)q(ice) 18 b Fb(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(182)150 2421 y Fn(shishi_hostkeys_for_localserv)q(icer)q(ealm)28 b Fb(:)13 b(:)g(:)48 b Fo(182)150 2510 y Fn(shishi_hostkeys_for_server) 16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)42 b Fo(181)150 2598 y Fn(shishi_hostkeys_for_serverrea)q(lm)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(182)150 2687 y Fn(shishi_info)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)46 b Fo(225)150 2775 y Fn(shishi_init)24 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) 48 b Fo(61)150 2864 y Fn(shishi_init_server)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(62)150 2952 y Fn(shishi_init_server_with_paths)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(62)150 3041 y Fn (shishi_init_with_paths)10 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(62)150 3129 y Fn(shishi_kdc_check_nonce)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(134)150 3217 y Fn(shishi_kdc_copy_cname)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(133)150 3306 y Fn (shishi_kdc_copy_crealm)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(132)150 3394 y Fn(shishi_kdc_copy_nonce)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(133)150 3483 y Fn(shishi_kdc_process)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(135)150 3571 y Fn (shishi_kdcrep_add_enc_part)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(150)150 3660 y Fn(shishi_kdcrep_clear_padata)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(150)150 3748 y Fn(shishi_kdcrep_client_set)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(149)150 3836 y Fn(shishi_kdcrep_cname_set)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(148)150 3925 y Fn(shishi_kdcrep_crealm_set)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(148)150 4013 y Fn(shishi_kdcrep_from_file)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)50 b Fo(148)150 4102 y Fn(shishi_kdcrep_get_enc_part_et)q(ype)18 b Fb(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(149)150 4190 y Fn(shishi_kdcrep_get_ticket)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(149)150 4279 y Fn(shishi_kdcrep_parse)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(147)150 4367 y Fn(shishi_kdcrep_print)16 b Fb(:)h(:)d(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)43 b Fo(147)150 4456 y Fn(shishi_kdcrep_read)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(148)150 4544 y Fn(shishi_kdcrep_save)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(147)150 4632 y Fn(shishi_kdcrep_set_enc_part)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(150)150 4721 y Fn(shishi_kdcrep_set_ticket)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(149)150 4809 y Fn(shishi_kdcrep_to_file)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(147)150 4898 y Fn (shishi_kdcreq_add_padata)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(146)150 4986 y Fn(shishi_kdcreq_add_padata_prea)q(uth)18 b Fb(:)g(:)c(:)f(:)g(:)g(:) g(:)g(:)g(:)44 b Fo(146)150 5075 y Fn(shishi_kdcreq_add_padata_tgs)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(146)150 5163 y Fn(shishi_kdcreq_allow_postdate_)q(p)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(142)150 5252 y Fn(shishi_kdcreq_clear_padata)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(145)150 5340 y Fn(shishi_kdcreq_client)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)40 b Fo(138)2025 299 y Fn (shishi_kdcreq_disable_transite)q(d_che)q(ck_p)2200 386 y Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(143)2025 475 y Fn (shishi_kdcreq_enc_tkt_in_skey_)q(p)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)46 b Fo(143)2025 563 y Fn(shishi_kdcreq_etype)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(140)2025 651 y Fn (shishi_kdcreq_forwardable_p)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(141)2025 740 y Fn(shishi_kdcreq_forwarded_p)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(141)2025 828 y Fn(shishi_kdcreq_from_file)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(137)2025 917 y Fn(shishi_kdcreq_get_padata)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(145)2025 1005 y Fn(shishi_kdcreq_get_padata_tgs)11 b Fb(:)18 b(:)c(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(145)2025 1094 y Fn(shishi_kdcreq_nonce_set)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(137)2025 1182 y Fn(shishi_kdcreq_options)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(140)2025 1271 y Fn(shishi_kdcreq_options_add)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(145)2025 1359 y Fn(shishi_kdcreq_options_set)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(144)2025 1448 y Fn(shishi_kdcreq_parse)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(136)2025 1536 y Fn (shishi_kdcreq_postdated_p)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(142)2025 1625 y Fn(shishi_kdcreq_print)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(136)2025 1713 y Fn(shishi_kdcreq_proxiable_p)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(141)2025 1801 y Fn(shishi_kdcreq_proxy_p)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(142)2025 1890 y Fn (shishi_kdcreq_read)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(137)2025 1978 y Fn(shishi_kdcreq_realm)16 b Fb(:)h(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)43 b Fo(138)2025 2067 y Fn(shishi_kdcreq_renew_p)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(144)2025 2155 y Fn (shishi_kdcreq_renewable_ok_p)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(143)2025 2244 y Fn (shishi_kdcreq_renewable_p)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(142)2025 2332 y Fn(shishi_kdcreq_save)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(136)2025 2421 y Fn(shishi_kdcreq_server)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)40 b Fo(139)2025 2509 y Fn(shishi_kdcreq_set_cname) 28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)50 b Fo(137)2025 2598 y Fn(shishi_kdcreq_set_etype)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(140)2025 2686 y Fn(shishi_kdcreq_set_realm)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(139)2025 2775 y Fn(shishi_kdcreq_set_sname)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(139)2025 2863 y Fn(shishi_kdcreq_till)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(139)2025 2951 y Fn(shishi_kdcreq_tillc)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(140)2025 3040 y Fn(shishi_kdcreq_to_file)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)38 b Fo(136)2025 3128 y Fn(shishi_kdcreq_validate_p)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(144)2025 3217 y Fn(shishi_key)24 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(176)2025 3305 y Fn(shishi_key_copy)9 b Fb(:)16 b(:)e(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(176)2025 3394 y Fn(shishi_key_done)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(176)2025 3482 y Fn(shishi_key_from_base64)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(177)2025 3571 y Fn(shishi_key_from_name)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(178)2025 3659 y Fn(shishi_key_from_random)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(177)2025 3748 y Fn(shishi_key_from_string)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(177)2025 3836 y Fn(shishi_key_from_value)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(176)2025 3925 y Fn (shishi_key_length)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(176)2025 4013 y Fn(shishi_key_name)9 b Fb(:)16 b(:)e(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(176)2025 4101 y Fn (shishi_key_principal)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(173)2025 4190 y Fn(shishi_key_principal_set)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(174)2025 4278 y Fn(shishi_key_random)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(177)2025 4367 y Fn(shishi_key_realm)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)33 b Fo(174)2025 4455 y Fn(shishi_key_realm_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(174)2025 4544 y Fn(shishi_key_timestamp)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(175)2025 4632 y Fn(shishi_key_timestamp_set)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(175)2025 4721 y Fn(shishi_key_type)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(174)2025 4809 y Fn(shishi_key_type_set)16 b Fb(:)h(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)43 b Fo(174)2025 4898 y Fn(shishi_key_value)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(174)2025 4986 y Fn(shishi_key_value_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(175)2025 5075 y Fn(shishi_key_version)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(175)2025 5163 y Fn (shishi_key_version_set)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(175)2025 5252 y Fn(shishi_keys)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(178)2025 5340 y Fn(shishi_keys_add)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)36 b Fo(179)p eop end %%Page: 265 271 TeXDict begin 265 270 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(265)150 299 y Fn(shishi_keys_done)7 b Fb(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fo(179)150 387 y Fn(shishi_keys_for_localservicer)q(ealm)q(_in_f)q(ile)325 475 y Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)48 b Fo(181)150 563 y Fn(shishi_keys_for_server_in_fil)q(e)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)49 b Fo(180)150 651 y Fn (shishi_keys_for_serverrealm_i)q(n_fi)q(le)10 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)36 b Fo(180)150 740 y Fn(shishi_keys_from_file)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(180)150 828 y Fn(shishi_keys_nth)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(179)150 917 y Fn(shishi_keys_print)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(179)150 1005 y Fn(shishi_keys_remove)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(179)150 1094 y Fn(shishi_keys_size)7 b Fb(:)16 b(:)d(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)33 b Fo(179)150 1182 y Fn(shishi_keys_to_file)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(180)150 1271 y Fn(shishi_krberror)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(162)150 1359 y Fn(shishi_krberror_build)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(164)150 1448 y Fn(shishi_krberror_client)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)35 b Fo(165)150 1536 y Fn (shishi_krberror_client_set)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(166)150 1625 y Fn(shishi_krberror_crealm)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(165)150 1713 y Fn(shishi_krberror_ctime)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(168)150 1801 y Fn(shishi_krberror_ctime_set)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(168)150 1890 y Fn(shishi_krberror_cusec)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(168)150 1978 y Fn (shishi_krberror_cusec_set)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fo(169)150 2067 y Fn(shishi_krberror_der)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(164)150 2155 y Fn(shishi_krberror_edata)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)38 b Fo(171)150 2244 y Fn(shishi_krberror_errorcode)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(170)150 2332 y Fn(shishi_krberror_errorcode_fas)q(t)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(170)150 2421 y Fn(shishi_krberror_errorcode_mes)q(sage)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)41 b Fo(173)150 2509 y Fn(shishi_krberror_errorcode_set)9 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fo(170)150 2598 y Fn(shishi_krberror_etext)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(171)150 2686 y Fn(shishi_krberror_from_file)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(164)150 2775 y Fn(shishi_krberror_message)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(173)150 2863 y Fn(shishi_krberror_methoddata)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(172)150 2951 y Fn(shishi_krberror_parse)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(163)150 3040 y Fn (shishi_krberror_pretty_print)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(172)150 3128 y Fn (shishi_krberror_print)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(163)150 3217 y Fn(shishi_krberror_read)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)40 b Fo(164)150 3305 y Fn(shishi_krberror_realm)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(166)150 3394 y Fn (shishi_krberror_remove_cname)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(166)150 3482 y Fn (shishi_krberror_remove_crealm)9 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)34 b Fo(165)150 3571 y Fn (shishi_krberror_remove_ctime)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(168)150 3659 y Fn (shishi_krberror_remove_cusec)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(169)150 3748 y Fn (shishi_krberror_remove_edata)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(172)150 3836 y Fn (shishi_krberror_remove_etext)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(171)150 3925 y Fn (shishi_krberror_remove_sname)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(167)150 4013 y Fn (shishi_krberror_save)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(163)150 4101 y Fn(shishi_krberror_server)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(167)150 4190 y Fn(shishi_krberror_server_set)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(168)150 4278 y Fn(shishi_krberror_set_cname)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(166)150 4367 y Fn(shishi_krberror_set_crealm)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 42 b Fo(165)150 4455 y Fn(shishi_krberror_set_edata)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(172)150 4544 y Fn(shishi_krberror_set_etext)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(171)150 4632 y Fn(shishi_krberror_set_realm)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(167)150 4721 y Fn(shishi_krberror_set_sname)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(167)150 4809 y Fn(shishi_krberror_stime)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(169)150 4898 y Fn (shishi_krberror_stime_set)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fo(169)150 4986 y Fn(shishi_krberror_susec)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(170)150 5075 y Fn(shishi_krberror_susec_set)18 b Fb(:)h(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)44 b Fo(170)150 5163 y Fn(shishi_krberror_to_file)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(163)150 5252 y Fn(shishi_md4)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 49 b Fo(196)150 5340 y Fn(shishi_md5)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fo(197)2025 299 y Fn(shishi_n_fold)14 b Fb(:)i(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)41 b Fo(193)2025 387 y Fn(shishi_parse_name)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(204)2025 476 y Fn(shishi_pbkdf2_sha1)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(199)2025 564 y Fn(shishi_principal_default)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(203)2025 653 y Fn(shishi_principal_default_guess)29 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)49 b Fo(203)2025 741 y Fn(shishi_principal_default_set)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(204)2025 830 y Fn(shishi_principal_name)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)38 b Fo(204)2025 918 y Fn(shishi_principal_name_realm) 13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)40 b Fo(204)2025 1006 y Fn(shishi_principal_name_set)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)45 b Fo(205)2025 1095 y Fn(shishi_principal_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(205)2025 1183 y Fn(shishi_priv)24 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)48 b Fo(97)2025 1272 y Fn(shishi_priv_build)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(102)2025 1360 y Fn(shishi_priv_done)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)35 b Fo(98)2025 1449 y Fn(shishi_priv_enc_part_etype)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(101)2025 1537 y Fn(shishi_priv_encprivpart)8 b Fb(:)18 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)34 b Fo(99)2025 1625 y Fn (shishi_priv_encprivpart_der)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)41 b Fo(99)2025 1714 y Fn(shishi_priv_encprivpart_der_se)q(t)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)46 b Fo(100)2025 1802 y Fn(shishi_priv_encprivpart_set) 15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)41 b Fo(99)2025 1891 y Fn(shishi_priv_from_file)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(101)2025 1979 y Fn(shishi_priv_key) 11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(98)2025 2068 y Fn(shishi_priv_key_set)18 b Fb(:)f(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)45 b Fo(98)2025 2156 y Fn(shishi_priv_parse)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(101)2025 2245 y Fn(shishi_priv_print)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) 48 b Fo(100)2025 2333 y Fn(shishi_priv_priv)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fo(98)2025 2421 y Fn(shishi_priv_priv_der)16 b Fb(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fo(98)2025 2510 y Fn(shishi_priv_priv_der_set)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(99)2025 2598 y Fn(shishi_priv_priv_set)16 b Fb(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fo(98)2025 2687 y Fn (shishi_priv_process)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(103)2025 2775 y Fn(shishi_priv_read)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fo(101)2025 2864 y Fn(shishi_priv_save)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)33 b Fo(100)2025 2952 y Fn(shishi_priv_set_enc_part)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(102)2025 3041 y Fn(shishi_priv_to_file)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(100)2025 3129 y Fn (shishi_prompt_password)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(208)2025 3217 y Fn(shishi_prompt_password_callbac)q(k_get)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)36 b Fo(208)2025 3306 y Fn(shishi_prompt_password_callbac)q(k_set)10 b Fb(:)19 b(:)13 b(:)g(:)h(:)f(:)36 b Fo(208)2025 3394 y Fn(shishi_random_to_key) 13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(185)2025 3483 y Fn(shishi_randomize)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) 33 b Fo(196)2025 3571 y Fn(shishi_realm_default)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(202)2025 3660 y Fn (shishi_realm_default_guess)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(202)2025 3748 y Fn(shishi_realm_default_set)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(202)2025 3836 y Fn(shishi_realm_for_server)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fo(203)2025 3925 y Fn(shishi_realm_for_server_dns)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(202)2025 4013 y Fn(shishi_realm_for_server_file)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(202)2025 4102 y Fn(shishi_resolv)14 b Fb(:)i(:)d(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fo(209)2025 4190 y Fn (shishi_resolv_free)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(209)2025 4279 y Fn(shishi_safe)24 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fo(92)2025 4367 y Fn(shishi_safe_build)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)33 b Fo(96)2025 4456 y Fn(shishi_safe_cksum)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(95)2025 4544 y Fn(shishi_safe_done)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)35 b Fo(93)2025 4632 y Fn(shishi_safe_from_file)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(95)2025 4721 y Fn(shishi_safe_key)11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)38 b Fo(93)2025 4809 y Fn(shishi_safe_key_set)18 b Fb(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(93)2025 4898 y Fn(shishi_safe_parse)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)33 b Fo(95)2025 4986 y Fn(shishi_safe_print)6 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fo(94)2025 5075 y Fn(shishi_safe_read)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)35 b Fo(95)2025 5163 y Fn(shishi_safe_safe)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fo(93)2025 5252 y Fn(shishi_safe_safe_der)16 b Fb(:)h(:)c(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)42 b Fo(93)2025 5340 y Fn(shishi_safe_safe_der_set)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(94)p eop end %%Page: 266 272 TeXDict begin 266 271 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(266)150 299 y Fn(shishi_safe_safe_set)16 b Fb(:)h(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(93)150 387 y Fn(shishi_safe_save)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(94)150 476 y Fn(shishi_safe_set_cksum)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)39 b Fo(96)150 564 y Fn(shishi_safe_set_user_data) 26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)46 b Fo(96)150 653 y Fn(shishi_safe_to_file)18 b Fb(:)g(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fo(94)150 741 y Fn(shishi_safe_user_data)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(96)150 830 y Fn(shishi_safe_verify)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(97)150 918 y Fn(shishi_server)16 b Fb(:)g(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(61)150 1006 y Fn(shishi_server_for_local_servi)q(ce)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(206)150 1095 y Fn(shishi_strerror)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)36 b Fo(224)150 1183 y Fn(shishi_string_to_key)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(184)150 1272 y Fn(shishi_tgs)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)49 b Fo(120)150 1360 y Fn(shishi_tgs_ap)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(121)150 1449 y Fn(shishi_tgs_done)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)36 b Fo(121)150 1537 y Fn(shishi_tgs_krberror)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(123)150 1625 y Fn (shishi_tgs_krberror_der)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(123)150 1714 y Fn(shishi_tgs_krberror_set)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(124)150 1802 y Fn(shishi_tgs_process)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(134)150 1891 y Fn(shishi_tgs_rep)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fo(122)150 1979 y Fn(shishi_tgs_rep_build)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)40 b Fo(123)150 2068 y Fn(shishi_tgs_rep_der)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(123)150 2156 y Fn(shishi_tgs_rep_process)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(123)150 2245 y Fn(shishi_tgs_req)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)38 b Fo(121)150 2333 y Fn(shishi_tgs_req_build) 13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(122)150 2421 y Fn(shishi_tgs_req_der)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(122)150 2510 y Fn(shishi_tgs_req_der_set)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(122)150 2598 y Fn(shishi_tgs_req_process)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)35 b Fo(122)150 2687 y Fn(shishi_tgs_req_set)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(121)150 2775 y Fn(shishi_tgs_sendrecv)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(124)150 2864 y Fn(shishi_tgs_sendrecv_hint)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(124)150 2952 y Fn(shishi_tgs_set_realm)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(125)150 3041 y Fn(shishi_tgs_set_realmserver)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(125)150 3129 y Fn(shishi_tgs_set_server)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(124)150 3217 y Fn(shishi_tgs_tgtkt)7 b Fb(:)16 b(:)d(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)33 b Fo(121)150 3306 y Fn(shishi_tgs_tgtkt_set)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(121)150 3394 y Fn(shishi_tgs_tkt)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)38 b Fo(124)150 3483 y Fn(shishi_tgs_tkt_set)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(124)150 3571 y Fn(shishi_tgsrep)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)41 b Fo(147)150 3660 y Fn(shishi_tgsreq)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(135)150 3748 y Fn(shishi_ticket)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(126)150 3836 y Fn (shishi_ticket_add_enc_part)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(127)150 3925 y Fn(shishi_ticket_get_enc_part_et)q(ype)18 b Fb(:)g(:)c(:)f(:)g(:)g(:)g (:)g(:)g(:)44 b Fo(127)150 4013 y Fn(shishi_ticket_realm_get)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(126)150 4102 y Fn(shishi_ticket_realm_set)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)50 b Fo(126)150 4190 y Fn(shishi_ticket_server)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(126)150 4279 y Fn(shishi_ticket_set_enc_part)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(127)150 4367 y Fn(shishi_ticket_sname_set)28 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fo(127)150 4456 y Fn(shishi_time)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)46 b Fo(207)150 4544 y Fn(shishi_tkt)24 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 49 b Fo(103)150 4632 y Fn(shishi_tkt_authctime)13 b Fb(:)18 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)40 b Fo(112)150 4721 y Fn(shishi_tkt_client)25 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(105)150 4809 y Fn(shishi_tkt_client_p)16 b Fb(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(105)150 4898 y Fn(shishi_tkt_clientrealm)8 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)35 b Fo(106)150 4986 y Fn(shishi_tkt_clientrealm_p)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(106)150 5075 y Fn(shishi_tkt_done)9 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(104)150 5163 y Fn(shishi_tkt_enckdcreppart)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(104)150 5252 y Fn(shishi_tkt_enckdcreppart_set)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(104)150 5340 y Fn(shishi_tkt_encticketpart)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)47 b Fo(104)2025 299 y Fn(shishi_tkt_encticketpart_set)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(105)2025 387 y Fn(shishi_tkt_endctime)16 b Fb(:)h(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)43 b Fo(112)2025 476 y Fn(shishi_tkt_expired_p)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(113)2025 564 y Fn(shishi_tkt_flags)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) 33 b Fo(107)2025 653 y Fn(shishi_tkt_flags_add)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)40 b Fo(107)2025 741 y Fn(shishi_tkt_flags_set)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(107)2025 830 y Fn(shishi_tkt_forwardable_p)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(107)2025 918 y Fn(shishi_tkt_forwarded_p)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(108)2025 1006 y Fn(shishi_tkt_hw_authent_p)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(110)2025 1095 y Fn(shishi_tkt_initial_p)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(110)2025 1183 y Fn(shishi_tkt_invalid_p)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(109)2025 1272 y Fn(shishi_tkt_kdcrep)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(104)2025 1360 y Fn(shishi_tkt_key)12 b Fb(:)k(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)39 b Fo(105)2025 1449 y Fn(shishi_tkt_key_set)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(105)2025 1537 y Fn(shishi_tkt_keytype)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(111)2025 1625 y Fn(shishi_tkt_keytype_fast)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(111)2025 1714 y Fn(shishi_tkt_keytype_p)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(112)2025 1802 y Fn(shishi_tkt_lastreq_pretty_prin)q(t)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)46 b Fo(113)2025 1891 y Fn(shishi_tkt_lastreqc)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(112)2025 1979 y Fn(shishi_tkt_match_p)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(68)2025 2068 y Fn(shishi_tkt_may_postdate_p)18 b Fb(:)g(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(108)2025 2156 y Fn(shishi_tkt_ok_as_delegate_p)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(111)2025 2245 y Fn(shishi_tkt_postdated_p)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)35 b Fo(109)2025 2333 y Fn(shishi_tkt_pre_authent_p)26 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)47 b Fo(110)2025 2421 y Fn(shishi_tkt_pretty_print)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)50 b Fo(113)2025 2510 y Fn(shishi_tkt_proxiable_p)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)35 b Fo(108)2025 2598 y Fn(shishi_tkt_proxy_p)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fo(108)2025 2687 y Fn(shishi_tkt_realm)7 b Fb(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) 33 b Fo(106)2025 2775 y Fn(shishi_tkt_renew_tillc)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)35 b Fo(113)2025 2864 y Fn(shishi_tkt_renewable_p)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)35 b Fo(109)2025 2952 y Fn(shishi_tkt_server)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(106)2025 3041 y Fn(shishi_tkt_server_p)16 b Fb(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fo(107)2025 3129 y Fn(shishi_tkt_startctime)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)38 b Fo(112)2025 3217 y Fn(shishi_tkt_ticket)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)48 b Fo(104)2025 3306 y Fn(shishi_tkt_ticket_set)11 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(104)2025 3394 y Fn(shishi_tkt_transited_policy_ch)q(ecked)q(_p)27 b Fb(:)14 b(:)f(:)48 b Fo(110)2025 3483 y Fn (shishi_tkt_valid_at_time_p)15 b Fb(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(113)2025 3571 y Fn(shishi_tkt_valid_now_p)8 b Fb(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(113)2025 3660 y Fn(shishi_tkt2)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(103)2025 3748 y Fn(shishi_tkts)24 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fo(66)2025 3836 y Fn(shishi_tkts_add)11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(67)2025 3925 y Fn(shishi_tkts_default)18 b Fb(:)f(:)c(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)45 b Fo(66)2025 4013 y Fn(shishi_tkts_default_file)28 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)49 b Fo(65)2025 4102 y Fn(shishi_tkts_default_file_guess)8 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fo(65)2025 4190 y Fn(shishi_tkts_default_file_set)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39 b Fo(65)2025 4279 y Fn(shishi_tkts_done)9 b Fb(:)16 b(:)d(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)35 b Fo(66)2025 4367 y Fn(shishi_tkts_expire)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fo(68)2025 4456 y Fn(shishi_tkts_find)9 b Fb(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)35 b Fo(69)2025 4544 y Fn(shishi_tkts_find_for_clientser)q (ver)17 b Fb(:)i(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fo(69)2025 4632 y Fn(shishi_tkts_find_for_server)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) 41 b Fo(69)2025 4721 y Fn(shishi_tkts_from_file)13 b Fb(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(67)2025 4809 y Fn(shishi_tkts_get) 11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(70)2025 4898 y Fn(shishi_tkts_get_for_clientserv)q(er)25 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)46 b Fo(71)2025 4986 y Fn(shishi_tkts_get_for_localservi)q(cepas)q(swd)27 b Fb(:)13 b(:)h(:)47 b Fo(71)2025 5075 y Fn(shishi_tkts_get_for_server) 17 b Fb(:)i(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)44 b Fo(71)2025 5163 y Fn(shishi_tkts_get_tgs)18 b Fb(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(70)2025 5252 y Fn(shishi_tkts_get_tgt)18 b Fb(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fo(70)2025 5340 y Fn(shishi_tkts_new)11 b Fb(:)17 b(:)c(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fo(67)p eop end %%Page: 267 273 TeXDict begin 267 272 bop 150 -116 a Fw(F)-8 b(unction)31 b(and)f(Data)i(Index)2458 b(267)150 299 y Fn(shishi_tkts_nth)11 b Fb(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fo(66)150 386 y Fn(shishi_tkts_print)6 b Fb(:)17 b(:)c(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)32 b Fo(68)150 474 y Fn (shishi_tkts_print_for_service)11 b Fb(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(68)150 562 y Fn(shishi_tkts_read)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fo(67)150 649 y Fn(shishi_tkts_remove)25 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(66)150 737 y Fn (shishi_tkts_size)9 b Fb(:)16 b(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) 35 b Fo(66)150 825 y Fn(shishi_tkts_to_file)18 b Fb(:)g(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)44 b Fo(68)150 912 y Fn(shishi_tkts_write)6 b Fb(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fo(67)150 1000 y Fn(shishi_verbose)12 b Fb(:)k(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)38 b Fo(226)150 1087 y Fn(shishi_verify)14 b Fb(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fo(186)150 1175 y Fn(shishi_warn)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)46 b Fo(226)150 1263 y Fn(shishi_x509ca_default_file)16 b Fb(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)42 b Fo(200)150 1350 y Fn(shishi_x509ca_default_file_gu)q(ess)18 b Fb(:)g(:)c(:)f(:)g(:)g(:) g(:)g(:)g(:)44 b Fo(200)150 1438 y Fn(shishi_x509ca_default_file_se)q (t)28 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fo(200)150 1525 y Fn(shishi_x509cert_default_file)11 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(201)150 1613 y Fn(shishi_x509cert_default_file_)q(gues)q(s)12 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)39 b Fo(200)150 1701 y Fn(shishi_x509cert_default_file_)q(set)18 b Fb(:)g(:)c(:)f(:)g (:)g(:)g(:)g(:)g(:)44 b Fo(201)150 1788 y Fn (shishi_x509key_default_file)13 b Fb(:)19 b(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(201)2025 299 y Fn(shishi_x509key_default_file_gu)q(ess)15 b Fb(:)k(:)13 b(:)g(:)g(:)g(:)h(:)f(:)41 b Fo(201)2025 388 y Fn (shishi_x509key_default_file_se)q(t)25 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)46 b Fo(201)2025 648 y Fv(T)2025 767 y Fn(this)26 b Fo(in)g(date)g(strings)7 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)33 b Fo(54)2025 856 y Fn(today)26 b Fo(in)g(date)g (strings)c Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(54)2025 945 y Fn(tomorrow)27 b Fo(in)f(date)f(strings)14 b Fb(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(54)2025 1203 y Fv(W)2025 1322 y Fn(week)26 b Fo(in)g(date)g(strings)7 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fo(54)2025 1580 y Fv(Y)2025 1699 y Fn(year)26 b Fo(in)g(date)g(strings)7 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fo(54)2025 1788 y Fn(yesterday)27 b Fo(in)f(date)g(strings)11 b Fb(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)38 b Fo(54)p eop end %%Page: 268 274 TeXDict begin 268 273 bop 150 -116 a Fw(Concept)31 b(Index)2882 b(268)150 299 y Ft(Concept)52 b(Index)150 638 y Fv(3)150 755 y Fo(3DES)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fo(5)150 991 y Fv(A)150 1108 y Fo(abbreviations)26 b(for)h(mon)n(ths)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)48 b Fo(52)150 1195 y(AES)9 b Fb(:)k(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)36 b Fo(5)150 1283 y(AIX)14 b Fb(:)e(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fo(9)150 1371 y(anon)n(ymous)25 b(tls)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fo(27)150 1459 y(Application)26 b(Programming)h(In)n(terface)g(\(API\))8 b Fb(:)k(:)h(:)g(:)g(:)g(:)34 b Fo(58)150 1546 y(AR)n(CF)n(OUR)11 b Fb(:)g(:)i(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)37 b Fo(5)150 1634 y(authen)n(ticated)25 b(tls)e Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 b Fo(28)150 1722 y(Authen)n(tication)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)46 b Fo(36)150 1809 y(Authen)n (tication)25 b(header)15 b Fb(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)42 b Fo(36)150 1897 y(Authen)n(tication)25 b(path)15 b Fb(:)e(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)42 b Fo(36)150 1985 y(Authen)n(ticator)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)46 b Fo(36)150 2073 y(Authorization)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(37)150 2160 y(authors)26 b(of)g Fn(parse_datetime)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(56)150 2248 y(Auto)r(conf)26 b(tests)10 b Fb(:)j(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fo(59)150 2484 y Fv(B)150 2601 y Fo(b)r(eginning)26 b(of)g(time,)h(for)f(POSIX)14 b Fb(:)e(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)40 b Fo(55)150 2688 y(Bello)n(vin,)27 b(Stev)n(en)d(M.)11 b Fb(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fo(56)150 2776 y(Berets,)27 b(Jim)11 b Fb(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(56)150 2864 y(Berry)-6 b(,)26 b(K.)14 b Fb(:)e(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)40 b Fo(56)150 3116 y Fv(C)150 3233 y Fo(calendar)26 b(date)g(item)9 b Fb(:)k(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)35 b Fo(52)150 3321 y(Capabilit)n(y)11 b Fb(:)j(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)37 b Fo(37)150 3409 y(case,)27 b(ignored)f(in)g(dates)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)39 b Fo(51)150 3496 y(certi\014cate)26 b(authorit)n(y)g(\(CA\))10 b Fb(:)i(:)h(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(28)150 3584 y(Ciphertext)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)49 b Fo(37)150 3672 y(Clien)n(t)16 b Fb(:)e(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fo(37)150 3759 y(clien)n(t)26 b(authen)n(tication)11 b Fb(:)i(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)37 b Fo(28)150 3847 y(com)n(bined)25 b(date)h(and)f(time)h (of)h(da)n(y)e(item)20 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)46 b Fo(53)150 3935 y(commen)n(ts,)26 b(in)g(dates)16 b Fb(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)42 b Fo(51)150 4023 y(Compiling)27 b(y)n(our)e(application)17 b Fb(:)e(:)e(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(59)150 4110 y(concurren)n(t)25 b(writers)16 b Fb(:)e(:)f(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fo(33)150 4198 y(con\014guration)26 b(\014le)7 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) 33 b Fo(42)150 4286 y(Con\014gure)26 b(tests)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)45 b Fo(59)150 4373 y(Con)n(tributing)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(12)150 4461 y(Creden)n(tials)14 b Fb(:)g(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)40 b Fo(37)150 4697 y Fv(D)150 4814 y Fo(database)26 b(de\014nition)c Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(45)150 4901 y(Database)26 b(in)n(terface)9 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)36 b Fo(227)150 4989 y(date)26 b(and)f(time)h(of)g(da)n(y)f (format,)j(ISO)c(8601)10 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fo(53)150 5077 y(date)26 b(format,)h(ISO)d(8601)15 b Fb(:)g(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)42 b Fo(52)150 5165 y(date)26 b(input)e(formats)8 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 34 b Fo(50)150 5252 y(da)n(y)25 b(of)i(w)n(eek)e(item)c Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fo(54)150 5340 y(Debian)9 b Fb(:)k(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fo(8,)26 b(9)2025 638 y(DES)9 b Fb(:)j(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fo(5)2025 726 y(Di\016e)26 b(Hellman)g(k)n(ey)e(exc)n(hange)18 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)44 b Fo(27)2025 813 y(displacemen)n(t)26 b(of)g(dates)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fo(54)2025 901 y(Do)n(wnload)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)46 b Fo(10)2025 1135 y Fv(E)2025 1252 y Fo(Eggert,)27 b(P)n(aul)9 b Fb(:)k(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fo(56)2025 1340 y(Encryption)25 b(T)n(yp)r(e)g(\(et)n(yp)r(e\))d Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)49 b Fo(37)2025 1427 y(End-user)25 b(Shishi)g(usage)f Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)49 b Fo(13)2025 1515 y(ep)r(o)r(c)n(h,)26 b(for)g(POSIX)6 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)33 b Fo(55)2025 1602 y(Error)26 b(Handling)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)40 b Fo(221)2025 1690 y(Examples)22 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)49 b Fo(226)2025 1941 y Fv(F)2025 2058 y Fo(fail)27 b(o)n(v)n(er)17 b Fb(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fo(34)2025 2145 y(FDL,)25 b(GNU)g(F)-6 b(ree)26 b(Do)r(cumen)n(tation)g(License)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)44 b Fo(253)2025 2233 y(F)-6 b(reeBSD)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)47 b Fo(10)2025 2467 y Fv(G)2025 2584 y Fo(general)27 b(date)e(syn)n(tax)12 b Fb(:)g(:)h(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)38 b Fo(50)2025 2672 y(Generic)26 b(Securit)n(y)f (Service)14 b Fb(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)41 b Fo(233)2025 2759 y(GNUTLS)8 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)35 b Fo(26)2025 2847 y(GSS-API)12 b Fb(:)g(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)39 b Fo(233)2025 2934 y(GSSLib)20 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)48 b Fo(233)2025 3169 y Fv(H)2025 3286 y Fo(Hac)n(king)16 b Fb(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)43 b Fo(12)2025 3373 y(High)25 b(Av)l(ailabilit)n(y) 19 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fo(34)2025 3461 y(HP-UX)12 b Fb(:)f(:)i(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39 b Fo(9)2025 3695 y Fv(I)2025 3812 y Fo(Installation)12 b Fb(:)i(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)38 b Fo(10)2025 3900 y(IPSEC)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(33)2025 3987 y(IRIX)18 b Fb(:)11 b(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fo(9)2025 4075 y(ISO)24 b(8601)k(date)d(and)h(time)g(of)g(da)n(y)f (format)d Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)47 b Fo(53)2025 4162 y(ISO)24 b(8601)k(date)d(format)9 b Fb(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fo(52)2025 4250 y(items)26 b(in)g(date)f(strings)12 b Fb(:)j(:)e(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)39 b Fo(50)2025 4501 y Fv(K)2025 4618 y Fo(KDC)14 b Fb(:)e(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(37)2025 4705 y(Kerb)r(eros)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)45 b Fo(37)2025 4793 y(Kerb)r(eros)26 b(Tic)n(k)n(et)19 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)46 b Fo(38)2025 4880 y(Key)25 b(V)-6 b(ersion)25 b(Num)n(b)r(er)g(\(kvno\))17 b Fb(:)12 b(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fo(37)2025 5136 y Fv(L)2025 5252 y Fo(language,)27 b(in)f(dates)19 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)46 b Fo(51)2025 5340 y(LD)n(AP)11 b Fb(:)h(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fo(33)p eop end %%Page: 269 275 TeXDict begin 269 274 bop 150 -116 a Fw(Concept)31 b(Index)2882 b(269)150 299 y Fo(leap)26 b(seconds)8 b Fb(:)14 b(:)g(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)35 b Fo(51,)27 b(53,)f(55)150 549 y Fv(M)150 665 y Fo(MacKenzie,)h(Da)n(vid)15 b Fb(:)d(:)i(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)41 b Fo(56)150 753 y(MacOS)26 b(X)21 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)48 b Fo(10)150 840 y(Mandrak)n(e)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)47 b Fo(9)150 927 y(master)26 b(serv)n(er)12 b Fb(:)i(:)f(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39 b Fo(33)150 1015 y(Mey)n(ering,)26 b(Jim)14 b Fb(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)40 b Fo(56)150 1102 y(min)n(utes,)26 b(time)g(zone)g(correction)g(b)n(y)12 b Fb(:)g(:)h(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)38 b Fo(53)150 1189 y(mon)n(th)25 b(names)h(in)g(date)f(strings)14 b Fb(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)40 b Fo(52)150 1277 y(mon)n(ths,)26 b(written-out)20 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)47 b Fo(51)150 1364 y(Motorola)28 b(Cold\014re)8 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fo(10)150 1597 y Fv(N)150 1714 y Fo(NetBSD)15 b Fb(:)e(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 42 b Fo(9)150 1801 y(NFS)8 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)35 b Fo(33)150 1888 y(n)n(um)n(b)r(ers,)25 b(written-out)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fo(51)150 2138 y Fv(O)150 2255 y Fo(Op)r(enBSD)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)44 b Fo(10)150 2342 y(ordinal)26 b(n)n(um)n(b)r(ers)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)42 b Fo(51)150 2576 y Fv(P)150 2692 y Fo(Pinard,)26 b(F.)13 b Fb(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)39 b Fo(56)150 2779 y(Plain)n(text)15 b Fb(:)e(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 b Fo(37)150 2866 y(Principal)17 b Fb(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)43 b Fo(37)150 2954 y(Principal)27 b(iden)n(ti\014er)9 b Fb(:)k(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)36 b Fo(37)150 3041 y(pure)25 b(n)n(um)n(b)r(ers)g (in)h(date)f(strings)9 b Fb(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fo(55)150 3291 y Fv(R)150 3408 y Fo(RedHat)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fo(9)150 3495 y(RedHat)25 b(Adv)l(anced)f(Serv)n(er)19 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)47 b Fo(9)150 3582 y(relativ)n(e)26 b(items)h(in)e(date)h(strings)12 b Fb(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fo(54)150 3670 y(remote)26 b(databases)15 b Fb(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)41 b Fo(33)150 3757 y(Rep)r(orting)26 b(Bugs)8 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)34 b Fo(11)2025 299 y(rsync)12 b Fb(:)g(:)i(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fo(33)2025 552 y Fv(S)2025 670 y Fo(Salz,)26 b(Ric)n(h)18 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)45 b Fo(56)2025 758 y(Seal)15 b Fb(:)f(:)f(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)42 b Fo(38)2025 846 y(secondary)26 b(serv)n(er)11 b Fb(:)i(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)38 b Fo(33)2025 934 y(Secret)25 b(k)n(ey)14 b Fb(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)41 b Fo(38)2025 1022 y(Serv)n(er)13 b Fb(:)f(:)h(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 b Fo(38)2025 1110 y(serv)n(er)25 b(authen)n(tication)c Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)47 b Fo(28)2025 1198 y(Service)16 b Fb(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)43 b Fo(38)2025 1286 y(Session)26 b(k)n(ey)14 b Fb(:)e(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fo(38)2025 1374 y(Shisa)26 b(API)15 b Fb(:)d(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)42 b Fo(227)2025 1462 y(Solaris)9 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fo(9)2025 1550 y(sp)r(ecifying)26 b(user)g(database)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)44 b Fo(45)2025 1638 y(SQL)8 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fo(33)2025 1726 y(ST)-6 b(AR)g(TTLS)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(26)2025 1814 y(Sub-session)25 b(k)n(ey)11 b Fb(:)i(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)38 b Fo(38)2025 1902 y(SuSE)13 b Fb(:)f(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)40 b Fo(9)2025 1990 y(SuSE)25 b(Lin)n(ux)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)50 b Fo(9)2025 2226 y Fv(T)2025 2344 y Fo(Tic)n(k)n(et)12 b Fb(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fo(38)2025 2432 y(time)26 b(of)g(da)n(y)f(item)10 b Fb(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fo(52)2025 2520 y(time)26 b(zone)g(correction)15 b Fb(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)42 b Fo(53)2025 2608 y(time)26 b(zone)g(item)11 b Fb(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)37 b Fo(51,)27 b(53)2025 2696 y(TLS)11 b Fb(:)i(:)g(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)37 b Fo(26)2025 2784 y(tls)26 b(resume)15 b Fb(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)41 b Fo(26)2025 2872 y(T)-6 b(ru64)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)48 b Fo(9)2025 3109 y Fv(U)2025 3226 y Fo(uClib)r(c)8 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)34 b Fo(10)2025 3314 y(uClin)n(ux)19 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fo(10)2025 3402 y(user)26 b(database)g(de\014nition)8 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fo(45)2025 3639 y Fv(X)2025 3757 y Fo(X.509)26 b(authen)n(tication)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)48 b Fo(28)p eop end %%Page: -5 276 TeXDict begin -5 275 bop 3699 -116 a Fa(v)150 299 y Ft(Short)53 b(Con)l(ten)l(ts)150 540 y Fa(1)146 b(In)m(tro)s(duction)31 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)62 b Fa(1)150 681 y(2)146 b(User)34 b(Man)m(ual)26 b Fs(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)58 b Fa(13)150 822 y(3)146 b(Administration)34 b(Man)m(ual)h Fs(:)19 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)66 b Fa(18)150 963 y(4)146 b(Reference)34 b(Man)m(ual)22 b Fs(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)54 b Fa(36)150 1104 y(5)146 b(Programming)33 b(Man)m(ual)15 b Fs(:)20 b(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)47 b Fa(58)150 1245 y(6)146 b(Ac)m(kno)m(wledgemen)m(ts)33 b Fs(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) 61 b Fa(235)150 1386 y(A)122 b(Criticism)34 b(of)e(Kerb)s(eros)25 b Fs(:)c(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)58 b Fa(236)150 1528 y(B)126 b(Proto)s(col)32 b(Extensions)h Fs(:)20 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)63 b Fa(237)150 1669 y(C)125 b(Cop)m(ying)34 b(Information)13 b Fs(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b Fa(253)150 1810 y(F)-8 b(unction)33 b(and)f(Data)g(Index)16 b Fs(:)21 b(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)48 b Fa(261)150 1951 y(Concept)34 b(Index)h Fs(:)20 b(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)66 b Fa(268)p eop end %%Page: -6 277 TeXDict begin -6 276 bop 3677 -116 a Fw(vi)150 299 y Ft(T)-13 b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fv(1)135 b(In)l(tro)t(duction)13 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)57 b Fv(1)275 778 y Fw(1.1)92 b(Getting)32 b(Started)21 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)51 b Fw(1)275 888 y(1.2)92 b(F)-8 b(eatures)31 b(and)f(Status)18 b Fr(:)d(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)48 b Fw(1)275 997 y(1.3)92 b(Ov)m(erview)28 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)58 b Fw(3)275 1107 y(1.4)92 b(Cryptographic)30 b(Ov)m(erview)8 b Fr(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fw(5)275 1216 y(1.5)92 b(Supp)s(orted)28 b(Platforms)20 b Fr(:)c(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)51 b Fw(8)275 1326 y(1.6)92 b(Getting)32 b(help)21 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(10)275 1435 y(1.7)92 b(Commercial)31 b(Supp)s(ort)20 b Fr(:)13 b(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)50 b Fw(10)275 1545 y(1.8)92 b(Do)m(wnloading)31 b(and)f(Installing)e Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)57 b Fw(10)275 1655 y(1.9)92 b(Bug)30 b(Rep)s(orts)20 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(11)275 1764 y(1.10)92 b(Con)m(tributing)13 b Fr(:)i(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)42 b Fw(12)150 2007 y Fv(2)135 b(User)45 b(Man)l(ual)22 b Fs(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)67 b Fv(13)275 2144 y Fw(2.1)92 b(Pro)m(xiable)31 b(and)f(Pro)m(xy)h(Tic)m(k)m(ets)e Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(15)275 2253 y(2.2)92 b(F)-8 b(orw)m(ardable)31 b(and)f(F)-8 b(orw)m(arded)31 b(Tic)m(k)m(ets)21 b Fr(:)c(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fw(16)150 2496 y Fv(3)135 b(Administration)46 b(Man)l(ual)26 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)70 b Fv(18)275 2633 y Fw(3.1)92 b(In)m(tro)s(duction)30 b(to)h(Shisa)10 b Fr(:)k(:)i(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 39 b Fw(18)275 2742 y(3.2)92 b(Con\014guring)29 b(Shisa)21 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(18)275 2852 y(3.3)92 b(Using)30 b(Shisa)20 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(19)275 2961 y(3.4)92 b(Starting)30 b(Shishid)11 b Fr(:)j(:)i(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)41 b Fw(23)275 3071 y(3.5)92 b(Con\014guring)29 b(DNS)h(for)g(KDC)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)55 b Fw(25)399 3181 y(3.5.1)93 b(DNS)30 b(vs.)41 b(Kerb)s(eros)29 b(-)i(Case)f(Sensitivit)m(y)i(of)e (Realm)i(Names)16 b Fr(:)f(:)h(:)f(:)h(:)45 b Fw(25)399 3290 y(3.5.2)93 b(Ov)m(erview)31 b(-)f(KDC)g(lo)s(cation)i(information) 27 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)56 b Fw(25)399 3400 y(3.5.3)93 b(Example)30 b(-)h(KDC)f(lo)s(cation)i(information)18 b Fr(:)e(:)g(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)48 b Fw(26)399 3509 y(3.5.4)93 b(Securit)m(y)31 b(considerations)19 b Fr(:)d(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)49 b Fw(26)275 3619 y(3.6)92 b(Kerb)s(eros)29 b(via)i(TLS)18 b Fr(:)c(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fw(26)399 3729 y(3.6.1)93 b(Setting)31 b(up)e(TLS)h(resume)14 b Fr(:)g(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 43 b Fw(26)399 3838 y(3.6.2)93 b(Setting)31 b(up)e(Anon)m(ymous)h(TLS) 20 b Fr(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(27)399 3948 y(3.6.3)93 b(Setting)31 b(up)e(X.509)j(authen)m (ticated)h(TLS)14 b Fr(:)g(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)44 b Fw(28)524 4057 y(3.6.3.1)93 b(Create)31 b(a)g(Kerb)s(eros)e(Certi\014cate)j (Authorit)m(y)c Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)57 b Fw(28)524 4167 y(3.6.3.2)93 b(Create)31 b(a)g(Kerb)s(eros)e (KDC)i(Certi\014cate)19 b Fr(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)49 b Fw(29)524 4276 y(3.6.3.3)93 b(Create)31 b(a)g(Kerb)s(eros)e(Clien)m(t)j(Certi\014cate)22 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)52 b Fw(31)524 4386 y(3.6.3.4)93 b(Starting)31 b(KDC)f(with)g(X.509) i(authen)m(tication)h(supp)s(ort)22 b Fr(:)13 b(:)j(:)f(:)52 b Fw(32)275 4496 y(3.7)92 b(Multiple)31 b(serv)m(ers)14 b Fr(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)44 b Fw(33)275 4605 y(3.8)92 b(Dev)m(elop)s(er)31 b(information)9 b Fr(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)39 b Fw(35)150 4848 y Fv(4)135 b(Reference)46 b(Man)l(ual)28 b Fs(:)20 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)73 b Fv(36)275 4985 y Fw(4.1)92 b(En)m(vironmen)m(tal)31 b(Assumptions)12 b Fr(:)j(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)42 b Fw(36)275 5094 y(4.2)92 b(Glossary)31 b(of)f(terms)23 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)52 b Fw(36)275 5204 y(4.3)92 b(Realm)31 b(and)e(Principal)i(Naming)14 b Fr(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)43 b Fw(38)399 5313 y(4.3.1)93 b(Realm)31 b(Names)20 b Fr(:)c(:)g(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)50 b Fw(38)p eop end %%Page: -7 278 TeXDict begin -7 277 bop 3652 -116 a Fw(vii)399 83 y(4.3.2)93 b(Principal)30 b(Names)f Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Fw(39)524 193 y(4.3.2.1)93 b(Name)31 b(of)g(serv)m(er)f(principals)15 b Fr(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)44 b Fw(40)524 302 y(4.3.2.2)93 b(Name)31 b(of)g(the)f(TGS)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)55 b Fw(41)399 412 y(4.3.3)93 b(Cho)s(osing)30 b(a)h(principal)f(with)g (whic)m(h)g(to)h(comm)m(unicate)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)55 b Fw(41)399 521 y(4.3.4)93 b(Principal)30 b(Name)h(F)-8 b(orm)28 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)57 b Fw(42)275 631 y(4.4)92 b(Shishi)29 b(Con\014guration)d Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)56 b Fw(42)399 741 y(4.4.1)93 b(`)p Fq(default-realm)p Fw(')20 b Fr(:)12 b(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(42)399 850 y(4.4.2)93 b(`)p Fq(default-principal)p Fw(')21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)55 b Fw(43)399 960 y(4.4.3)93 b(`)p Fq(client-kdc-etypes)p Fw(')21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)55 b Fw(43)399 1069 y(4.4.4)93 b(`)p Fq(verbose)p Fw(',)29 b(`)p Fq(verbose-asn1)p Fw(',)f(`)p Fq(verbose-noise)p Fw(',)581 1179 y(`)p Fq(verbose-crypto)p Fw(',)f(`)p Fq(verbose-crypto-noise)p Fw(')19 b Fr(:)11 b(:)k(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)49 b Fw(43)399 1289 y(4.4.5)93 b(`)p Fq(realm-kdc)p Fw(')15 b Fr(:)e(:)i(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)44 b Fw(43)399 1398 y(4.4.6)93 b(`)p Fq(server-realm)p Fw(')21 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)53 b Fw(43)399 1508 y(4.4.7)93 b(`)p Fq(kdc-timeout)p Fw(',)28 b(`)p Fq(kdc-retries)p Fw(')15 b Fr(:)e(:)i(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)45 b Fw(43)399 1617 y(4.4.8)93 b(`)p Fq(stringprocess)p Fw(')20 b Fr(:)12 b(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(44)399 1727 y(4.4.9)93 b(`)p Fq(ticket-life)p Fw(')25 b Fr(:)15 b(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)57 b Fw(44)399 1836 y(4.4.10)93 b(`)p Fq(renew-life)p Fw(')8 b Fr(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)38 b Fw(44)275 1946 y(4.5)92 b(Shisa)29 b(Con\014guration)21 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)51 b Fw(45)399 2056 y(4.5.1)93 b(`)p Fq(db)p Fw(')20 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)50 b Fw(45)275 2165 y(4.6)92 b(P)m(arameters)31 b(for)f(shishi)12 b Fr(:)j(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)42 b Fw(46)275 2275 y(4.7)92 b(P)m(arameters)31 b(for)f(shishid)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(47)275 2384 y(4.8)92 b(P)m(arameters)31 b(for)f(shisa)e Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fw(48)275 2494 y(4.9)92 b(En)m(vironmen)m(t)30 b(v)-5 b(ariables)29 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)58 b Fw(50)275 2604 y(4.10)92 b(Date)32 b(input)d(formats)g Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)58 b Fw(50)399 2713 y(4.10.1)93 b(General)32 b(date)f(syn)m(tax)13 b Fr(:)i(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)42 b Fw(50)399 2823 y(4.10.2)93 b(Calendar)30 b(date)h(items)12 b Fr(:)k(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)41 b Fw(52)399 2932 y(4.10.3)93 b(Time)31 b(of)f(da)m(y)h(items)11 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Fw(52)399 3042 y(4.10.4)93 b(Time)31 b(zone)g(items)25 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)54 b Fw(53)399 3152 y(4.10.5)93 b(Com)m(bined)30 b(date)h(and)f(time)h(of)g(da)m(y)f(items)25 b Fr(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)54 b Fw(53)399 3261 y(4.10.6)93 b(Da)m(y)32 b(of)e(w)m(eek)i(items)9 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fw(54)399 3371 y(4.10.7)93 b(Relativ)m(e)33 b(items)e(in)f(date)h(strings)11 b Fr(:)k(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Fw(54)399 3480 y(4.10.8)93 b(Pure)30 b(n)m(um)m(b)s(ers)f(in)h(date)h(strings)17 b Fr(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fw(55)399 3590 y(4.10.9)93 b(Seconds)30 b(since)h(the)g(Ep)s(o)s(c)m(h)26 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Fw(55)399 3699 y(4.10.10)94 b(Sp)s(ecifying)30 b(time)h(zone)g(rules) 13 b Fr(:)i(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)43 b Fw(56)399 3809 y(4.10.11)94 b(Authors)30 b(of)g Fq(parse_datetime)11 b Fr(:)h(:)j(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fw(56)150 4051 y Fv(5)135 b(Programming)46 b(Man)l(ual)18 b Fs(:)i(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)h(:)f(:)63 b Fv(58)275 4188 y Fw(5.1)92 b(Preparation)16 b Fr(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)45 b Fw(58)399 4298 y(5.1.1)93 b(Header)13 b Fr(:)j(:)g(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)43 b Fw(58)399 4408 y(5.1.2)93 b(Initialization)21 b Fr(:)d(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)51 b Fw(58)399 4517 y(5.1.3)93 b(V)-8 b(ersion)31 b(Chec)m(k)12 b Fr(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)41 b Fw(58)399 4627 y(5.1.4)93 b(Building)30 b(the)h(source)10 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)40 b Fw(59)399 4736 y(5.1.5)93 b(Auto)s(conf)30 b(tests)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 b Fw(59)524 4846 y(5.1.5.1)93 b(Auto)s(conf)31 b(test)g(via)g(`)p Fq(pkg-config)p Fw(')17 b Fr(:)c(:)i(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Fw(59)524 4956 y(5.1.5.2)93 b(Standalone)31 b(Auto)s(conf)f(test)i(using)d(Libto) s(ol)20 b Fr(:)c(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)49 b Fw(60)524 5065 y(5.1.5.3)93 b(Standalone)31 b(Auto)s(conf)f(test)14 b Fr(:)j(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)44 b Fw(60)275 5175 y(5.2)92 b(Initialization)32 b(F)-8 b(unctions)12 b Fr(:)k(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)41 b Fw(61)275 5284 y(5.3)92 b(Tic)m(k)m(et)32 b(Set)e(F)-8 b(unctions)22 b Fr(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)51 b Fw(65)p eop end %%Page: -8 279 TeXDict begin -8 278 bop 3626 -116 a Fw(viii)275 83 y(5.4)92 b(AP-REQ)30 b(and)g(AP-REP)g(F)-8 b(unctions)9 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fw(71)275 193 y(5.5)92 b(SAFE)30 b(and)g(PRIV)g(F)-8 b(unctions)28 b Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)58 b Fw(92)275 302 y(5.6)92 b(Tic)m(k)m(et)32 b(F)-8 b(unctions)17 b Fr(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)47 b Fw(103)275 412 y(5.7)92 b(AS)30 b(F)-8 b(unctions)22 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)52 b Fw(114)275 521 y(5.8)92 b(TGS)29 b(F)-8 b(unctions)29 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)58 b Fw(119)275 631 y(5.9)92 b(Tic)m(k)m(et)32 b(\(ASN.1\))f(F)-8 b(unctions)19 b Fr(:)e(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)49 b Fw(125)275 741 y(5.10)92 b(AS/TGS)30 b(F)-8 b(unctions)25 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)54 b Fw(130)275 850 y(5.11)92 b(Authen)m(ticator)32 b(F)-8 b(unctions)23 b Fr(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)53 b Fw(153)275 960 y(5.12)92 b(KRB-ERR)m(OR)30 b(F)-8 b(unctions)19 b Fr(:)e(:)e(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 b Fw(162)275 1069 y(5.13)92 b(Cryptographic)30 b(F)-8 b(unctions)14 b Fr(:)i(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)44 b Fw(173)275 1179 y(5.14)92 b(X.509)32 b(F)-8 b(unctions)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(200)275 1289 y(5.15)92 b(Utilit)m(y)32 b(F)-8 b(unctions)9 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fw(202)275 1398 y(5.16)92 b(ASN.1)31 b(F)-8 b(unctions)11 b Fr(:)k(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)41 b Fw(209)275 1508 y(5.17)92 b(Error)30 b(Handling)24 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(221)399 1617 y(5.17.1)93 b(Error)30 b(V)-8 b(alues)19 b Fr(:)d(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)49 b Fw(221)399 1727 y(5.17.2)93 b(Error)30 b(F)-8 b(unctions)15 b Fr(:)h(:)g(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)45 b Fw(224)275 1836 y(5.18)92 b(Examples)14 b Fr(:)i(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)44 b Fw(226)275 1946 y(5.19)92 b(Kerb)s(eros)29 b(Database)k(F)-8 b(unctions)25 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 b Fw(227)275 2056 y(5.20)92 b(Generic)31 b(Securit)m(y)g(Service)25 b Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)55 b Fw(233)150 2298 y Fv(6)135 b(Ac)l(kno)l(wledgemen)l(ts)20 b Fs(:)h(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)64 b Fv(235)150 2568 y(App)t(endix)44 b(A)160 b(Criticism)46 b(of)f(Kerb)t(eros)20 b Fs(:)g(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)64 b Fv(236)150 2838 y(App)t(endix)44 b(B)166 b(Proto)t(col)45 b(Extensions)16 b Fs(:)21 b(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)60 b Fv(237)275 2975 y Fw(B.1)92 b(ST)-8 b(AR)g(TTLS)29 b(protected)i(KDC)f(exc)m(hanges)15 b Fr(:)i(:)e(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(237)399 3084 y(B.1.1)93 b(TCP/IP)29 b(transp)s(ort)h(with)g(TLS)f (upgrade)h(\(ST)-8 b(AR)g(TTLS\))15 b Fr(:)g(:)h(:)f(:)h(:)45 b Fw(237)399 3194 y(B.1.2)93 b(Extensible)30 b(t)m(yp)s(ed)h(hole)f (based)g(on)h(reserv)m(ed)f(high)g(bit)21 b Fr(:)16 b(:)g(:)f(:)g(:)h (:)f(:)h(:)51 b Fw(238)399 3303 y(B.1.3)93 b(ST)-8 b(AR)g(TTLS)29 b(requested)h(b)m(y)g(clien)m(t)i(\(extension)g(mo)s(de)e(1\))e Fr(:)15 b(:)h(:)f(:)h(:)57 b Fw(238)399 3413 y(B.1.4)93 b(ST)-8 b(AR)g(TTLS)29 b(request)h(accepted)i(b)m(y)e(serv)m(er)h (\(extension)g(mo)s(de)f(2\))598 3523 y Fr(:)16 b(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 47 b Fw(238)399 3632 y(B.1.5)93 b(Pro)s(ceeding)30 b(after)h (successful)g(TLS)e(negotiation)17 b Fr(:)h(:)d(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)47 b Fw(238)399 3742 y(B.1.6)93 b(Pro)s(ceeding)30 b(after)h(failed)g(TLS)f(negotiation)20 b Fr(:)e(:)d(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)50 b Fw(239)399 3851 y(B.1.7)93 b(In)m(teraction)32 b(with)e(KDC)g(addresses)g(in)g (DNS)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)57 b Fw(239)399 3961 y(B.1.8)93 b(Using)30 b(TLS)g(authen)m (tication)i(logic)g(in)e(Kerb)s(eros)20 b Fr(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fw(239)399 4071 y(B.1.9)93 b(Securit)m(y)31 b(considerations)d Fr(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)57 b Fw(239)275 4180 y(B.2)92 b(T)-8 b(elnet)31 b(encryption)f(with)g(AES-CCM)21 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)51 b Fw(239)399 4290 y(B.2.1)93 b(Command)29 b(Names)i(and)f(Co)s(des)10 b Fr(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)40 b Fw(239)399 4399 y(B.2.2)93 b(Command)29 b(Meanings)16 b Fr(:)h(:)e(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)46 b Fw(240)399 4509 y(B.2.3)93 b(Implemen)m(tation)31 b(Rules)c Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) 57 b Fw(240)399 4619 y(B.2.4)93 b(In)m(tegration)32 b(with)e(the)g(A)m (UTHENTICA)-8 b(TION)31 b(telnet)g(option)598 4728 y Fr(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fw(241)399 4838 y(B.2.5)93 b(Securit)m(y)31 b(Considerations)15 b Fr(:)g(:)g(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(241)524 4947 y(B.2.5.1)93 b(T)-8 b(elnet)31 b(Encryption)f(Proto)s(col)i(Securit)m (y)f(Considerations)721 5057 y Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b Fw(242)524 5166 y(B.2.5.2)93 b(AES-CCM)30 b(Securit)m(y)h (Considerations)12 b Fr(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)42 b Fw(242)399 5276 y(B.2.6)93 b(Ac)m(kno)m (wledgmen)m(ts)9 b Fr(:)17 b(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)39 b Fw(242)p eop end %%Page: -9 280 TeXDict begin -9 279 bop 3677 -116 a Fw(ix)275 83 y(B.3)92 b(Kerb)s(erized)29 b(rsh)g(and)h(rlogin)13 b Fr(:)j(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)43 b Fw(242)399 193 y(B.3.1)93 b(Establish)30 b(connection)14 b Fr(:)j(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)44 b Fw(242)399 302 y(B.3.2)93 b(Kerb)s(eros)29 b(iden)m(ti\014cation)12 b Fr(:)18 b(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)42 b Fw(243)399 412 y(B.3.3)93 b(Kerb)s(eros)29 b(authen)m(tication)e Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)55 b Fw(243)399 521 y(B.3.4)93 b(Extended)30 b(authen)m(tication)15 b Fr(:)i(:)e(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 b Fw(243)399 631 y(B.3.5)93 b(Windo)m(w)30 b(size)13 b Fr(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)43 b Fw(244)399 741 y(B.3.6)93 b(End)29 b(of)i(authen)m(tication)10 b Fr(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)40 b Fw(244)399 850 y(B.3.7)93 b(Encryption)21 b Fr(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)51 b Fw(244)399 960 y(B.3.8)93 b(K)m(CMD)m(V0.3)8 b Fr(:)18 b(:)e(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)39 b Fw(245)399 1069 y(B.3.9)93 b(MIT/Heimdal)31 b(authorization)d Fr(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)57 b Fw(246)275 1179 y(B.4)92 b(Key)30 b(as)h(initialization)i(v)m(ector) 27 b Fr(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)56 b Fw(246)275 1289 y(B.5)92 b(The)29 b(Keytab)i(Binary)g(File)g (F)-8 b(ormat)27 b Fr(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 b Fw(247)275 1398 y(B.6)92 b(The)29 b(Creden)m(tial)j(Cac)m(he)f (Binary)f(File)i(F)-8 b(ormat)11 b Fr(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)41 b Fw(250)150 1641 y Fv(App)t(endix)j(C)165 b(Cop)l(ying)45 b(Information)18 b Fs(:)j(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)62 b Fv(253)275 1778 y Fw(C.1)91 b(GNU)31 b(F)-8 b(ree)31 b(Do)s(cumen)m(tation)h(License)20 b Fr(:)d(:)e(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)50 b Fw(253)150 2020 y Fv(F)-11 b(unction)44 b(and)h(Data)h(Index) 17 b Fs(:)i(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)61 b Fv(261)150 2290 y(Concept)45 b(Index)11 b Fs(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)55 b Fv(268)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF shishi-1.0.2/doc/fdl-1.3.texi0000644000000000000000000005561012126660051012402 00000000000000@c The GNU Free Documentation License. @center Version 1.3, 3 November 2008 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. @uref{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, La@TeX{} input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG@. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The ``publisher'' means any person or entity that distributes copies of the Document to the public. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. @item RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. @end enumerate @page @heading ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with@dots{}Texts.''@: line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: shishi-1.0.2/doc/components.png0000664000000000000000000031474712015626624013356 00000000000000‰PNG  IHDRy†6ã sBITÛáOà IDATxœìÝy|Õþ7ð Mw–¶tƒî,Vi(eÑ«EÄbAZ–/* ‚RZŠÊ* -n¸²*R(Ø^,‹H¡@¤€ÝB÷–î{š<ÌsÏon–É$™$“ôóþƒ×épæÌwΜIfNΜÉår O$QE,¤‘Fi¤‘Fi¤‘Fi¤‘rºÀ‘H$¢»@˜p€À¼ˆD"Œk:z €YËåèk"fÿÆ5€yA_ƒà £Ìž¡"ô/€YÃÔƒBÁ|;€ù¸AGXŒk0%Œe ƒùL ½ `y0®Á0œ,Æ5Ÿ0®Áx0œ,ækž¡¯Áàèá 4 jË&—Ëñ …a‘ŽÔ3tèk0‘u ]æk0æs] ~{>‰M€åÀÔ ÞCÁ#º‹ Еa¾ˆD"Œh Ð× /ô/r¹sCêˆË€ÚP€q ÀÌ× 5æÔ Ô  } Z#Ý  ó5p%¡¢8Á¸Íè Π‘H$›:3€ ÜáѵðVKà EÌg%ÐÑ -ŒkøÌWZš6s$‰0®áÐ] èhÐÆ5P¦fàÞC–ï)gŸÖÀhºô¸ g0kèYЮ„ÀD"Æ5€ùQ×Ë€›gÊ•†ßÞÀ@ºâ¸‘¨+î5€eÀÊy„ÊérwÝx«%€™Â± b€w]¥¯ÃÃÌ~124Ô0ðE$u3u à6ØHÝbÆMП…kÀÔ æ Æ„Ú^Xþ¸ô˘/ÜúF7/,³¯ÓÛXt4˜º@O–9_:, ®èŒuz²À¾|2X¼GÌ´èšÇÐÐ\.›:Þ0¿ðÄE[[Û/¿ürîܹ«W¯ÕÖÖ6559::öêÕ+ àÑG>|ø³Ï>;`Àör 1ÄhƒSÌ:xa²œ×4 ç›»ÖÖÖ¤¤¤O>ùäáÇ3ûûûO›6-**jðàÁ*3˜õíºY`Á,ìÒÎ|'ž°°Æ!2÷WBâ³OýõפI“îß¿¯íŠêêÙ¬o×Í:x f‘—yæxím‘ Íìç†ÄSdÚÊÍÍ}æ™gHGƒX,ž>>ééé<òˆ!÷@‚= Xfö ΀± º9xð I¯[·ŽcGEQ£GV×Ñ`Ù.]ºÖ½{w‘HäèèXUUE/?|øpzzúðáÃ}}}=JòÓ E988H¥Rî*--íׯ‘˜9k@—ªžú÷—G§KJJúôéÃK±f=4À¬ƒ°T‚ºêóññÙ¼yó‹/¾Ø«W¯†††^½z)vòäÉÙ³g—––RJ#ØÿTÞÆ5€Å0ƒq ¸äKyy9I»ººt[ÅÅÅñññO=õ”«««µµµ‹‹KPPÐ?ÿùÏóçÏó»¡ßÿ}ùòåÏ<󌗗W÷îÝ­¬¬\]]ƒ‚‚^xá…ØØØ¯¾úª  @˜Á€ðµ´´ØØØØÛÛÌŸ?Ÿ,ŒŒ¼}ûv{{»L&ëììÔ­pæ…nttôâÅ‹}úÅ_$öèÑcåÊ•óæÍsww×§XåÏ‹¸¸¸µk×*/ÿç?ÿ¹{÷n:moo_ZZªî]ìMkÖ¬IHH Ó!!!éééNNNê»páš5k222<°3ë_Ñ-’Ù\Œ M—" ûyf¿£i#±`'NLMMe.±²²=zô3Ï<3räÈÁƒûùùuë¦Ýh…Ûò%K–ìØ±Ceζ¶¶ÀÀÀÂÂBúÏ””æKêÊTnÆ »~ý:þí·ß´ X݆(£ìÌîÎÖâ™×Á=…ðáuÂz†BþßÙqLˆ%Û·oߨQ£˜K:;;/\¸˜˜øÊ+¯ôëׯ{÷î¡¡¡±±±?ýôSSS“¶å»»»oÚ´IÝÿÚÚÚÆÄÄ?Ï;§mù´üü|’æ>=¤FÆ  7±fùH…i#ƒ2}_ƒÂ“T¦ ÆâõìÙ333óßÿþ7óL---W¯^ýøã'Ožìéé9{öl­¦u˜={¶½½=K†gŸ}–¤ÉØm1§„¬®®Ö­eÆ  ÷fÝ O.—›¾¯ŸFfcc“˜˜˜———Ä’³±±ñ«¯¾4hÐêÕ«e2—Ÿ{î9ö $]QQÁ¥Ležžž$½aÃÝ QfœàÀät»½ÁM‘¡£Áì »Áâ™l¾ózîË‚ž;wîÒ¥K7oÞ¼uëVUU•ÊláááGޱ²²Rþ/æ§Cii)³#@Ykk+;`kkÛÚÚª2û”o¾ùæwß}Gþ {ûí·'L˜`ggDzi2NðÀÎW‰êæ gŸ›\·µô§í]4ïñÿº æ ÇÎR‰Lø®áfuMÅÅÅ.\øå—_~þùçúúzæ-_¾|óæÍÊ«0o­[[[mmmÙ7ÁåVœ=Ï•+WF¥0ÔÂÁÁá©§ž 9r¤Æ0L<°3a_ƒ!Öâ —­ÇÄÄlذÁ××·¨¨hÍš5{÷îåkÓ”°¯j„!°Àá³H&˜Rá%·FÞ:häåå5uêÔo¾ù¦¨¨hõêÕÌ ;vìÈËËc_㾞BCC?úè#……ÍÍͧOŸ~ÿý÷ÜÇÿõ×_3gvÐÈ8Á€1ûÌ´QË–-;vìXÿþýUþoKKKZZZLLÌ€öíÛgäØ@8fΜ×ÐЙ™™••E–§§§Ÿ?¾¶¶6""bîܹ¼¬¥,<<<66¶¢¢¢¢¢bРAË–-ã·|eô•6®· J$<¦®Œ4LôßA_"“Ž=üë_ÿúôÓOéôÈ‘#ÿøã… "-à’Ÿc™R©455uÿþýééé,“5nذáý÷ß×gCZå×¶L`ñú3µŸŸß²eË^}õU___æ&ªªªz÷îMQTsss¯^½:::(Æ•ªnk±knnö÷÷§¯X´*Ÿü/÷g( ×®]Ûž¡rl|ÑêÊ|ï¶„|(…y'¯‘i+Sdœg(DŒîUa¶`MÒùùù&ŒD™X,ž4iÒ?üP^^~ûöí”””éÓ§»»»+d[»v­r t‡NOO>|¸¯¯ïÑ£GÉrú–ž¢(©TÊËZÊ.]ºÖ½{w‘HäèèH&áæ«|{÷îõññ¡(Ê××—¯Ž0111‰„¢(‰Dcêp,„º!ráá¼ñ˜ºN@è˜3DZ[[+gж9qɯOíììÌÈÈxñÅ™…DEEñ²!CúMMMõôô$›PØ¢Êå:¯Ex{{ïß¿¿¦¦F&“ÕÕÕéV¾Æ­š`¯jX{{û²eË\]]œœ¶lÙB/¤(jÛ¶mtg««kee%ÉìææFxÙ´i“»»»ƒƒÃ¬Y³Z[[åª.,[ZZæÎÛ³gÏž={Λ7¯¥¥…^.‘H¦L™BQÔäÉ“% —„FP”ú_¦GkBˆß€ãLß|èÖíÿ‰³³³ #á¨[·ncÇŽ=uêÔœ9sÈÂóçÏ›0$0•ÈÈÈÛ·o···Ëd²ÎÎNƒ®¥¬¥¥ÅÆÆÆÞÞ¾  `þüù¼—ÂwóæÍììì¼¼¼¢¢"²üòåËÙÙÙr¹<22299™^˜‘‘1jÔ(777Š¢233srròóóKKK×®]KýwT8óîqõêÕ%%%÷îÝ»{÷nAAóIa‘úÙ:Ô…*‘:Twë.| a›æÆÜpÝ-Œ&;;›´–¡C‡*gж9qÉÏKe¾5ÃÖÖ–— -x€.‹ßïÐ}ûöŠÅâààà´´4² …-*$t[K=•µX,صk—Îå›öêB°W5‚ ÌÛÛ;77Wa!EQ%%%t://ÏÇǧ½½].—/X°àÀt†{÷îÑrss½¼¼ÈŠÌrúöí{÷î]:}çξ}ûÒéèèhº¡°°0::šKHB#jyWò&Ù#Š÷¹!™=@< ¼xõÕW?ùä///­Öz÷ÝwÉ &—.]ºuëV… ‚^±­­ÍÎÎŽN;99ÕÔÔè¿!Ì `h˜äKh{D˜X,nmm%os£)ÌÚøÆo„‡‡GEE 4èúõëvvv"‘H*•Ò¯œ—J¥ööö*'‹ÅmmmÊÙTn…=$¡ÂµÔûYãïÿsCÊÿÛñÆo±À‹£G>öØcüq{{;ÇU²²²vìØAþ¤Ÿ37nÜ iuoÇàWŸ>}˜lUZ±bÅŽ;.^¼øÔSO‘ŸÇÈDìyyyžžž*Wôðð`fóðð`þ¯º1.!éì°¼ûÙÿk`¬‡)ä|Í×ÀœšÁòŒ%ihhˆí×¯ßæÍ›Ø3ÿðÃÏ=÷é˜xýõןxâ ÃǨو#¾úꫦ¦&–<µµµ‹/&¾þúë† º.#¿îÞÈ›­DGG/^¼øÁƒµµµ±±±*󄆆:::®\¹òÍ7ß$ ß~ûíŠŠŠŠŠŠØØØéÓ§Ó œœrssIžÈÈÈeË–UVVÒÙ"##Õ…Ál\BêâºÎId´=5Æ;/AhŠ‹‹W¬XѧOŸ)S¦¤¤¤\½zõáÇ---eeegÏžMJJzüñǧOŸNú#?ùäÓ†M\¹reöìÙ½{÷~饗¶lÙò믿J$’ÆÆÆÎÎκºº«W¯&%%]¾|™Îð¯ýË´1€eSù¸²ÅlN€„0Þ^uëÖ=öØcC† éׯ_@@€ºlï¼óNqqqXXY6xðà€€OOϸ¸8’-44”Ü&$$xxx 0`àÀÞÞÞ6là1¤.«‹üpNöÎÝ "uÏóp_Ÿ²ôãaItnRO>ùä‘#GÜÝÝ5kœ)´Úooï´´´AƒéŒ¶ù1_€>p…)4Â<"ÂŒJ+»ví*..NLL¤ÿÔóÖ̘ð˜Z@sâÎ8;Ëÿ| dýõׯGŒÁ|%»Aƒ}ýõ×çÏŸW×Ñ d"‘hæÌ™YYYê:L¢®®nç΋-2u е:CmËåºtž¡ËÍÜÕÕÕýþûï—.]ºsçν{÷JJJZ[[zôèáææüøã?þñÇ×Xšñ‡”––^½zõƹ¹¹yyy¥¥¥ÕÕÕÍÍÍ2™ŒÄÿä“ON›6ÍÛÛ[hÁ;¯ûu»FÕÿÊÖ⯅y'&̨8‰DVVV;wî|ë­·˜ Ítwøbªcʾ]åãbGÊHC´Ý€@e±€ Êxïk`¿nÔm-ÝrÒNŸ>½yóæsçÎ988L˜0aëÖ­< ÕöZKð¼«fT “S§ 9G”&ÁËÖpS¯Ý3ÌW€à¬³ Û…«á.w·lÙ²téÒªªª¿þú«W¯^,ïÐ÷ õ˜˜‰DBQ”D"‰‰‰á1³Ã嬱¤[`ãì ×¾A½„FP!€ÑœøàGGÇÙ³g·µµÑ [ZZ¢££É'ÉßÑѱ|ùr777ggç­[·’Òè‘HäææVUUE2»»»WVVŠD"å­a•P*7d*r¹œk_Æ2€@Ìœ93..®¡¡!333++‹,OOO?þ|mmmDDÄܹsyYKÙš5k*++ nܸ‘‘‘A–oܸñÊ•+ÙÙÙååå¶¶¶+W®$ÿuùòåììl©TªPÔ™3gžxâ :QQQQ1hРeË–ñ¶2ü€§'ݪÎhŽ#k8™™™999ùùù¥¥¥k×®¥®Y³¦¦¦¦   '''33“dŽ‹‹»yófvvv^^^QQYN,ÈåòÈÈÈäädzaFFƨQ£ÜÜÜTn…¾%Wwo®nC&£ün^å÷ô²ç12­âóÂåÏ××wûöí……… +VUUÑ馦&±XL–ë³–2//¯{÷îÑéÜÜ\’ÓÏÏïæÍ›tº¬¬ÌÃÃURR¢\Ε+Wú÷ïOŠbjjjrssÓ!lÁÑÑÑôÝHaaatt4KNa^u !*u°¦ÛZ:äç¥~ŒYÉ&9¦7J1îíI‚ù àååE§½¼¼îß¿O§ïÝ»Gò{{{çææ*K>òòò|||ÚÛÛårù‚ 8À²–hUnˆe¿ ZÛ”º¹!2ï…J ýsB ô¤qЏ¬¬¬ 6üþûïöööüqDD¥táª|A«ÛZÊÄbq[[›••EQR©ÔÚÚšÎIr¹\&“‰D"™L¦®¨ÿüç?³fÍúñLJN/¹téһロM?|AV×*l•²ÀÜzÆ CF»ÃÒsC1116lðõõ-**Z³fÍÞ½{ù M5ΠɲQ•sCJ¥Rò `ooßÑÑA©ÿd‹Å­­­ô#TÊÅÒÞxãðð𨨨Aƒ]¿~ÝÎÎNÝVØ?š”7¤óŽëI$©èÉ ÿÿž >¨Ü S|â~—ššêééIÖR(Dår×"¼½½UŽkðññ‘H$Êù•‹Ú¿¿——×Õ«WŠÝ¿MML&«««Ó-lÁë@˜—ÜFŽ*555((ÈÚÚÚÏÏ/%%…İ{÷n???kkëaÆݸqƒ,×g-eíííË–-suuurrÚ²e‹B~Š¢6mÚDO2kÖ¬ÖÖVö I¥ÒU«V¹¹¹ÙÛÛGFF666’üÛ¶móññ±²²’Ëå‰dÊ”)EMž‡¯rúuâ>±ˆÅÏè!ÿï8mW|ûí·é©Ubcc§OŸN/œ6mýŠ™ÊÊJ2ß EQÑÑÑ‹/~ðàAmm-óƒ)44ÔÑÑqåÊ•o¾ù&ûVœœœè.N3x.2*cvlè‰Ë^€¹Óx·oß¾ÀÀ@±Xœ––FÖR(D!¡ÛZÊZZZbbbìííÝÝÝ?üðC’³³³sãÆôÏÈC‡=tèºM(hhhËåÇŽëß¿¿X,صk—Îaó~‘,Ìëm#GeÚ)BاÔ?دrC'á>£_LÒÒ4nTù3¢¨>ø€HÓÒÒB/ojjš1cýÉ””D?C!—ËÛÛÛccc]\\œ·mÛ¦Pqüøq???™Lƾ•„„„îÝ»«ü¤R¹!w\Os¾!<òÄŽ¥ÃIÈa€V„]Ú¥óp9*“OÂòÀ?ÇûÉŸZM,bÌùû„9_ƒnîܹóÒK/åååq_e×®]ÅÅʼn‰‰$0ƒV…ækèF^ÎÉìÞ ö‘-<°LkĈÇŽ«¬¬LIIyë­· º–²>}ú°ßµæççÓ‰¼¼,++[±bݵÄQ]]ÝÎ;-Zd¸ØŒL®r¾"¿Öš:J¤ÄÔéBŸ½æ ã3í!ŸÃWù`¿:'>öØcìÙ³g||<ǵD"QïÞ½—,YÒ·o_ƒ†gdb³øà`~ *LþK€¯ç³f——–±¦õÊ+¯¼öÚkÿý÷£>úÝwßt-eëÖ­[±bÅ!Cär9sêG",,lðàÁS§N‹‹c/mÕªU"‘hܸq%%%AAA«W¯Ö90‹Á×½ä¢E‹t› rÓFx€Â DærÎå­§ìÀ¼àÏä„|„›‘™Ë=F¦:¦]°-a—E"‘Ø,jVåXæBÇ`rÆy ó5€@ gÖ†®É,~’´<–1Eˆyéš5F8µÍc¾æ3èÆb†ˆ›‘®vß%:4uœ|é 5F;µE"Æ5€@‘ë~Üú©m‹¿ï u‘#ŸÚÝÌqdŽ9Æ :è"÷ÂŽ蚺Nƒ7Ξb¾:t7 :Ý_M”—rp¾h‹LÜ`yUGvʘ§v7¹\nv%æ3è Ý F€Ž.LÛ!L–´wùQc’Só5€y`ÞXÒm€0« ìt«K­Õ˜˜‰DBQ”D"‰‰‰1u8ü°¤îÓžÚ˜¯Ìsp+.y¡p+b©·ÄìNž<lccãïï¿gϲ<99Ùßß߯Æ&$$$''‡^HªK·µ”utt,_¾ÜÍÍÍÙÙyëÖ­ìåtvv¾÷Þ{îîîQQQMMMì…в²²¼½½?þøcua+„Gþ‰DIII...žžžGMJJêÝ»·§§çéÓ§é Ë—/§(jéÒ¥ ìõlF>gÌñ£F!lãŸÚ˜¯ÌŒrèL¹J» ™3gÆÅÅ544dfffee‘åéééçÏŸ¯­­ˆˆ˜;w./k)‹‹‹»yófvvv^^^QQ{97n¼råJvvvyy¹­­íÊ•+Ù ¡(ê§Ÿ~š8qbrrò’%KXÂV§¼¼\"‘$&&Θ1£¼¼¼¨¨(11‘î_ Ñ­Hd†wãìï_L IDATN SŸ©ZS·#ÆdùoK%²¸;#3ß{Ýùùù-[¶ìÕW_õõõe–_UUÕ»woŠ¢š››{õêÕÑÑA/§7ªÛZÊ|||ÒÓÓyä…½SYŽ¿¿ÿ‰'‚‚‚(Š*//2dHYYK!~øáŽ;Ž;¾³ ÷Õd–Äêêj—¶¶6;;;’vtt”J¥EÅÄÄlذÁ××·°°píÚµ{÷îÕ²îÿÇ”_fú9cÚš±4zaâñ¾4++kÆ ¿ÿþ»½½ýÇA±Þ~Ó ÝÖR&‹[[[Åb±ÂÞ©,ÇÚÚšNÈår™L&‰d2K!ýúõ‹ŒŒd>Ý sØêÒì{§Áö5ð®+ìéÿ ®0¯ýì ÇÔ1ÄÁÉ“'gÏž]ZZJiÓk ÛZ„º! *Ëñõõ½xñ¢··7ÇB$ÉØ±cçÏŸ¿bÅ –µ¶¶®¯¯···§(ªººÚÕÕU«¾¾t…»<‘IçP02Ì×EQ---?ÿüóòåËŸ}öÙ€€€=zˆÅâž={úùù…††Î›7ï³Ï>ËËË3u˜‚¦òù(å#ûóÏ?W¬XÖ§Oåc„#kÁ wà4¶+Е¼ˆŒŒ¼}ûv{{»L&ëìì4èZÊ¢££/^üàÁƒÚÚÚØØXöÌ .œ7oÞýû÷¥Ré­[·¢¢¢Ø ñööþí·ß¾øâ‹¤¤$–°‡ òÑG577/\¸Pç} ßVßÑ@Qÿ+º¬‚‚‚E‹uïÞ]cS‰DcÆŒùæ›o¤R©©£".§_yÀhšššØ_àDgѵ`†8pÛh„JèÊx<÷÷íÛ(‹ƒƒƒÓÒÒHù ›SHè¶–²öööØØXggçmÛ¶±—ÓÙÙ¹qãF???kkë¡C‡:tˆK!¥¥¥=öX||¼º°³³³‡ &‹}||>ùä•a«KóÈR?Ï»æw=…¹!»²ÎÎΤ¤¤ÄÄÄÖÖV­V Ú¼yóøñã ˜™âÒOÉW0š)S¦>|˜%ƒü¿# –(Ñ5S†8pÛUW£CUã´èʺÂxû®ÆòŽ)˰;KÚM•0_C×U__ÿꫯfdd%ÎÎÎãÇñŇ æêêêêêÚÑÑQZZš“““––vðàÁÚÚZf ¨èk°<Ï=÷¶±±Y³fÍÔ©SýüülmmrâÈZ0Þ÷vÕÕ ¯´‚;ËcIÇTãÃ}–±›ìÐ×Ð566Ž;öÊ•+ôŸo¿ýöÊ•+{öì©n•æææ”””„„„‡ÒKPÿ Ð×`ybbb¾þúk:””´jÕ*u9qd-ïŽ{»êjÐ×Z1Ç;åûOóŠßÐÌñ˜*ã8…¹ï&x†¢Ë‘Ëå“&Múå—_è?=<¥áÈš)Þ¿íÊ’à­XÆ})0YÒ1eïq°Œ}d'‰ðŠ.'%%…t4¸¹¹]¼x‘cGEQÇ÷Ýw €€Ðo¢ùøø˜0°$hW9Eb—%6ÇÞ#sŒY êêêV¯^MþLIIÑö'5‘HôÁ8::ò€à444´µµµ #K‚vÐuÈår‘HDÿkêXŒJ.—‹MÕ'Ÿ|B&\xõÕW_}õUÝÊY»v-{†œœœcÇŽ9s¦¨¨¨¢¢‚¢(www??¿çŸ~Ò¤IƒÖm»E:tèĉ‰¤¬¬¬±±ÑÆÆ¦­­M9gSSÓ©S§RSS¯\¹RQQñðáÞ={zzzŽ=:<<|âĉVVV:‡ad‰äÀ¿üò‹D")--µµµíӧϨQ£¦L™2~üønÝt ¤±&KJJ._¾|ýúõ;wîäçç—––ÖÔÔ´´´ØÙÙõîÝÛÏÏo̘1¯¼òJhh¨>»Æý€v5<6àßÿýðáÃW¯^½wï^]]]KK‹­­­ƒƒƒ‡‡‡——×c=6tèбcÇúûûë³qÚLqqñ_|qúôé;wîÔÕÕõèÑ£OŸ>cÆŒ‰ŠŠzê©§¸—#“ÉNž}úøøø¼üòËo¼ñ†···>Aš¾ª”¢(©Tú믿¦§§Ÿ?¾¬¬¬²²²­­ÍÞÞÞÕÕÕÇÇ'((høðáÏ>ûl@@€ö…á¾›x©C£ªÀ;úfÒ8kéiÿþý±±±øáÖèCÜu«Zçf‚Ù‘Éd~~~äÐÿç?ÿ1ÄVîß¿?yòdöV7eÊ”¼¼ýôS–‚‚‚222xÜq.§•yZ[[/^ÌÒ›0räÈk×®iÇšd©=¦‰'r9šÚ†B–ÄÅÅq)_.—¿ÿþûd­Žké°×d/Tî—ÝgÁc¾víÚÈ‘#µÝqÜÎmF*•®[·ÎÆÆF]É“'OnhhàRòµk×FŒ¡®++«ØØØÖÖVå Z3 [ÑvÓ\ò®J;;;¿úê+Žcåô¯m«ÈpßM¼Ô¡‘OUË ¨3B]$ìê¶–nH™>>>.\à˜ÙÈuLõ§ü¹Ý¥>É»Ê~¼x‚¢¨GyÄ›øí·ßzõêÅåRÉÙÙ™ËÇÑØØøÄO¨,ª[·n̵êêêÈûäØuëÖí³Ï>ãkß™%ó•§©©éé§ŸÖ¸#vvviiicã^“\êæîîž••¥Ui #%%…,ñññ‘J¥Ë—J¥^^^d­ääd«°©‘ʵ¸”Ì øÌ™3ööö:ìŽÎ¸oK‡6ÓÖÖ6iÒ$%=šî#`qòäI./˜ knn楊¸× eľ«´®®nâĉ:ì£Î•£U—:4þ©ÚEp¯Ò.ÅÔ‡…O‚Ú#Ý"1Iü"‘H&“©ûßèè袢"Š¢ŠŠŠ¢££—\.°cÊ JÍWž©â1&sýÜ1ǘ…àƒ> G|áÂ…¼—ñâE;;;²‰^½z­]»öúõëuuuõõõ×®][³f óµšöööüñK̯ÆÈÈH:1xðà={öüý÷ßÍÍÍ ¯¼ò Y¥¾¾þñÇ'kYYYEGGŸ8q¢´´´­­­¬¬ìÇ3f ³äï¿ÿž—ÝçòE®mžéÓ§Ó —õë×߸qƒ®Ì7nÄÇÇ»¸¸œvvv,×Ç:Ô$YË××÷í·ß>xðàÝ»wkjj:::*++322–,Yâàà@Šõòòª©©á^EÃhhhèÞ½;ÉüøqöÂårù±cÇH~GGÇúúz«°©‘ʵ¸”¬. ¸¢¢‚ÙBúöí›ðÇTWWwtt466¥¦¦®]»öÑGeŠ;ºµ™9sæÐ‰ÐÐн{÷æçç·´´<|ø0--í…^`æü÷¿ÿÍRæ… ˜ ½{÷Þ°aCNNN}}}]]Ýõë×ãââœéÿ1c—DZf8R¹–¶[á’‡¯*­««Sxú ,,,%%åÎ;µµµmmm%%%éééñññAAAÊáéV9ÜwÙ ßMúסINU‹¤UC&S:Ý™*þÔÔÔ   kkk??¿””ÌîÝ»ýüü¬­­‡ vãÆ ²\Ÿµ˜®_¿Þ¿ÒM “ÉúõëwãÆ ©TºjÕ*777{{ûÈÈÈÆÆFRȶmÛ|||¬¬¬H™ÌCïêêZYYIgnoowss«¨¨H$S¦L¡(jòäɉ„ïÊÓÀÜÛ$¿ƒLfù)cŽ1 ÁÔ©Sɇ˗_~ÉoáõõõÌ¡³!!!>~ܸq‰¤¾¾>&&fÑ¢E¤ÈÈHÒ›@Ê$‰Å‹oذNŸ:uо֒H$ô-˜Þµ¥óm ,fGô„*èB˜ï¶Tw£3æÕ’¯¯/=ߌJ¥¥¥}ûö%™×­[§.§Â·ào¼ÁÑ#GHæž={Þ»w%ó¼yóHæÙ³gkÚ?͸|ak›‡¢¨°\zVWW3§X‹çR¦ÆšäîîÝ»ä—j–»¸zõ*ÉleeUTTÄ’ùÁƒ̹/]º¤Ëþ¨XÿœóðÛ€™çûo¿ýÆ¿1éÓf–,Y¢.gkk+s>ò“‘‚õëדþøãÚî…Æ€õÏ©1¿ ˜ùtzKK {iF¦[›qwwW7r‡¶nÝ:’yÆŒÊè7MèvrqiñÛ®´ÍÏo•Êåræp€?üKœúįÕ*FønÒ¿…|ª ï'&˜c•š*ÚË—/‡‡‡Ó¯×9rä F!6…„nk)xøða¯^½ª«««ªªœœœès±XleeeeeEÏ·Í|ñÆÂ§Núí·ßvvv2?‚LÕ Ì«;óûL¡™cÌBÀ|D™ý·DmýôÓO¤äjÌ/“ɘ?=zTe6æ×žÆßÀ™3_zzzª»FdZ¼x1YEÿ‡J¸|Ik›'((ˆË¦ÉC¼EýòË/ìeò8¨vöìYRøüùóYrêÆž={È*ÞÞÞêfˆìììdþx¸sçN]ö„5`ýs²çá½3gÅW9hÜ„tk3«V­b/ö·ß~#™ƒƒƒ•30ût8¹46ŽømWÚæç·JÏ;G2¸¹¹qi·zƯÕ*FønÒ¿…|ª ¿§$0™WÝš<ÔÔÔTOOO ó¿(õ½º­EL:uûöíÛ¶m‹ŠŠ¢—øøø¨|ØKáYYY¡¡¡çÎãåáSý™ü˜êÏÜãç—Úéåioo'iæ¬{ú»páIO›6Mc~‘HD¦TX]3œ§§§“ô¤I“X^?FŒ7ޤÿýwù9Å f3/ýUÒj®x.ÈdoEeggs\‹c‘‘‘=zô Ó<8qâ„ÊlgΜ),,¤Óööö óù™Þ°§§'I3çwÝÚŒÆ×s’tEE…ræÙ¡ÃÉeyô¯ÒŒŒ ’ž1c—vkLFønÒ¿…|ª “H$¢rõS€ÎH­’ze‘‘‘·oßnoo—Éd]KÙìÙ³?ÿüó/¾øböìÙô’… Λ7ïþýûR©ôÖ­[̹Ÿ4 utt\¹rå›o¾©sHêüÿWÜ™: í˜cÌBÀ¼ lllä±ä?þøƒ¤™ãÀY0³]ºtIc~æ­*1ï"¸Ä0dÈ’fþª,Ì©Y0'±c •4Ö¤¶˜3¨—••q\‹cÝ»wg~e2_„ÉôÙgŸ‘ô”)SÈÃf„÷Ì,$%%e̘1GŽimmÕ/L~èÖf‚ƒƒÙ30Ç¢×ÕÕ)g`ž:œ\–Gÿ*ÍÌÌ$i./è52#|7é_‡B>U F€î^yå•×^{ÍÑÑqÕªUß}÷A×RöüóÏ×ÕÕ566>ûì³ô’U«V………7ÎÁÁaÆŒ¯½öšV¾óÎ;ÅÅů=@#|:"úyS‡FâææVUUE§ }}}ù*9    €N0G³«“ŸŸOæïׯßßÿ­œ‡ù%WUUÕ»wo–ïÞ½K§ÿøã.wÍÍÍŽŽŽtÚÛÛ["‘h\…3Zu§•¶yŠŠŠ|||4nº°°ÐßߟN«¬L­jRASSÓñãÇÏž={ëÖ­‚‚‚†††††™L¦2s=êëëÕ¥[×®] ¡ÓݺuËÏÏWhºååå>>>ôŸçÏŸÿÇ?þÁ¥d¸/î9ÙóðÞ€¯\¹2jÔ(…#åààðÔSO………………9’ù\ ÔfZ[[5Ì^ÉýúõËÏϧÓ:œ\*ËÔ¿íJÛüüVéÀïß¿O§ÿþûoæt íþj\ÅßMúס OU³ƒŽc2‹Ú¦ƒr„fa×®]ÅÅʼn‰‰¦„¢Ìù˜šoä†ó_VƒWæ³0IÎÎÎæ±d…ßm¸¬R[[KVqvvV™‡ÙXé9rY¸ºº’Ì666¶¶¶666666ÖÖÖÖÖÖb±˜ž8§[·nݺu‰D ½õŽŽŽZï¶úhùÊS__ÏeÓÌßÊTV¦V5I466®^½š¼2€ 2‘Æ]ã†\. %+®Y³Fá7mÚDþwРA܋ՈËñâž“=!ð–-[X–½½ý‹/¾¸wï^ö™í´bÐ6Ã%öüÌ/:œ\cÐ3HÝrrÏÏo™ÎÎÎäõŸH‡ªf_ÅßMú)7Å©jŽ´m ?á×¹ÀÃ3 µµµ>úhqq±©ùÿÌ÷˜šoä%ô•Ì1f!˜2e ùÚøê«¯x,™ù®Au³÷) ¿BSE^ð£@«ë9±XÌr­Æ…vû¬S´ÚæáX™R©”½2uØÍÒÒRæôò¼T£ÎµÍ|DBá]2™lÀ€ä·mÛ¦UÉ츬í‘Uþ_5àcÇŽõïߟ}ž}ûþðÃZÕŒJBh3ìùuø¤bž\cÐ3HÝrrÏÏo™Ìv˱JuÞ–«ỉc~cžªfJ«†|xµ <<ý)ð^¾••Õ®]»ø-VL»Ì×Ð…0_xùòeKfÎ4ÙÔÔÄef62ùŸ>´ú)Õ\477sÉÆœ}ƒ—Ê”Ëå“'OÎÉÉ!KÆŽ»uëÖß~û-//¯¾¾^a¶yý·ÈŽ9CdIIÉ/¿üBþëìÙ³d·­­­ùÎld ~çΟþ922ÒÝÝ]ež’’’¨¨¨„„}6$´6£óìÐáäe={ö$iÖ•¾›82Ú©j¦08ÙTè:ÇÄ ¦¢|çÆ{ùR©ô­·Þâ·Ø®'ˆ:"‘Hß_ÒÀŒ0§ËfN®?ggg2Ò¸¦¦†yõ©ÎÇ™«ëƒ««+yêûáǼ”ir555\.výê¿Ýýû÷_¼x‘N;88üôÓO/¾ø¢ºÌF¸Ápttœ>}zrr2ýçž={"""è4sÈÃk¯½¦ÕT‚b¸,‹'Mš4iÒ$Š¢þúë¯sçÎeffž9sFaJüµk×>ÿüógLT&´6£’³³39Yt8¹NŸYÍuæââB>Ì«««™Ï,¾›¸3Ω <¢;0¢:*žû>sŒY†NfÆÊÍÍe¾ô[OÞÞÞ$}ûöm.«ÜºuKåê¼Ä r6/s¤Ceò2åçHzÍš5,7E‘ G jÁ‚$––F¿á²ººú§Ÿ~"ËçÏŸo„H Ä8 ø±Ç›?þwß}WZZš‘‘Á<²r¹üã?Ö¹d¶e̳C‡“Ëø˜ßt Os(«©©1p8*0'μqã†ñ`'„ï&ÝîT5GÔ pEjy¨ÚÀ‚>AûeZr¹¼›©cã‰DóæÍ#îܹ“¯’™/ ãøt†¯"cÇ|Uó5lfMã ,iÌ:çåÇ®«W¯’ôo¼ÁžÙ8¯ :tèˆ#è´L&£‡3|óÍ7mmmôÂ>óÌ3FˆÄ@ŒÜ€»uë6vìØS§NÍ™3‡,<þ¼Î °Í(cž:œ\ÆgooOÒ ì™MÒÇÊl·Ì÷¶ „¾›ôÄû© ††[‹§[· :k,’À{B…ó5t-‹-"ƒBüñÇcÇŽéVÎúõë™>õÔS$½ÿ~.%ìÛ·¤yyCá¸qãHúàÁƒú(w„Y缼⾲²’¤5þ²wâÄ ý·Èsh×_~)•J?ÿüs²„ÙfŽLÕ€W¯^MÒååå:—#Ì6£€yc¬ÃÉe|žžž$Mæ%Q‡Ç¡jÜ1ÍûþûïÛÛÛõ)9•£º—¤jEßM|áëT5;&¼”oii‰ŽŽvttôôôüè£ÈHiÔÿŽ·e&’’’\\\<===š””Ô»woOOÏÓ§OÓ:;;ß{ï=www‡¨¨(•SŠttt,_¾ÜÍÍÍÙÙyëÖ­ÆØmU0´ ëƒP˜`£5 rú›:á‰D˜ç³ËÙµkiùùùZ­.“ÉV¬XAýït5mmm¤ØãdzrèÐ!’ÙÓÓSÝ뙕K`ƒ&ùOœ8Á}§xÁ%ZmóP•ššÊ¾]f‡‘Â;´Ú.ó¡ë²²2–œ<°³³ãX¾¶a(hlld>n½lÙ2’¶¶¶.//סLvÜÖÿ蛪·¶¶’:99é\Ž@Ú {þŽŽŽ¾}û’ Z\:·[mƒdš8q"ɹyóf–œR©Tá-úoc~æÛ”ÙƒÔˆÙŠõOßM:äW‰¯SÕìðxêikùòåáááååå/¿ü²BŸþyLLŒü¿Ã§ Šñ“XlllccãçŸîèèHÒÁÁÁt†øøøqãÆI$’úúú˜˜˜E‹)Çðïÿû…^(**zøðall¬Aö“&‰J·- °öØ)]TTDQTQQQtt´A·kFueF¡š_~&aŽ1 ‡L&£¿2i}úôÉÉÉá¸nYYÙ„ TÖÿÚµkI™ýúõ«®®VWHEE…ɼ~ýzu9µ½>cþPéááQXXÈq¿xÁ%ZmóP5`À€ššu™«««Hæøøx·Ëļyسgºl/¼ð‚BÀ,Åj†2uS%O™2E·Ùq˜—£o’Ì1>|øpËH›Ñ˜?>>ždÐêäÒ§Ýj$ñÑG‘œƒ byk#s¿ôl‡ÚægNÕaggwùòe.Ū4pà@RÔíÛ·y OßM¼4!¾NU³Ãã©§-//¯û÷ïÓé{÷î1øxñâÓO?ÝÚÚ*gík ÛÝODÒVVVt??¿›7oÒé²²2å¼½½sssùÝ/ݘð@°0tT©©©AAAÖÖÖ~~~)))d£»wïöóó³¶¶6lØ7Èr}ÖR&•JW­ZåææfooIz`ÕÕÞÞ¾lÙ2WWW''§-[¶ÌÛ¶m£?Ü\]]+++If777zêÙM›6ÑãkfÍšEZµÂ§–D"™2e EQ“'O–H$©ò‡â²²2æóçlnnÖy»Lï½÷Éïîî~ïÞ=å­[ì¸Ì×Ñ籇††~ùå—ì?×ÔÔŒ9’l1))‰}s,Òf4æonnf~RýãÿP9"¦´´”Y3ZÅ DQQ‘Xü¯‹Zµj•Êl»wïîÖMqö%ý·Î=?ó°öèÑãÈ‘#,ž;wnìØ±*ÿëõ×_'ålß¾—ð„ðÝÄžßȧªÙáñÔÓ–••éàëèè a6ìÁƒ$BæZäOær•i±XleeeeeEŸ¿ô<öÊ1¨®h|&<, •««ë¡C‡Z[[ çÎK6úúë¯K$’¦¦¦õëד¯`‰nk)S7òE]Q*GÁPIw1,^¼xÆ ôòS§N½üòËt†—^z©¬¬¬¼¼|üøñï¾û®ÊÀ$ÉÔ©Sɦu­QÍ„ÙÒ˜Ejê¢êêêÆŽ˼rvvž>}ú7ß|“““SZZÚÞÞÞÔÔtÿþýüqþüùʯþR.óÒ¥K̙̜ׯ_Ÿ““S__ßÐГ“çääD2888\¹r…%Hm¯çärySS™Aöì³Ï~öÙg·nݪ©©‘J¥uuu………gΜٲeËĉIÀºT¢öÑj›gÆŒt¢wïÞñññ¤2ÿüóÏ 6¸¸¸œvvv.\Ðg»L%%%d•?Lªò IDAT^½zmܸñöíÛ­­­·oßÞ²e y&æÌ™Ë×á€*S¾ìׯŸL&Ó¹@ÜæëèóØ€éå¶¶¶&Lؼyó™3gŠŠŠ¤Rimmí•+W6nÜÈ|   ¡¡{å(H›á’ÿÂ… ¶¶¶$›««kBBŸþÙÐÐP__Ÿ““³~ýzò‰GÎAî1ð$¡ðv•W^y%##£¶¶V*•û,77·¾¾¾­­~™B||ü AƒXŠÚ»w/)¡W¯^ÉÉÉ………êdàžÉ¿›ØóÓËvªšîõÌ»¾}û*khmm}úé§ÏŸ?ÏŒ¹ù“¹\eÚÇÇGã=Æ5°3tT¾¾¾Û·oWfHQTUUnjj‹Åd¹>k)S7òE]Q*[ EQ%%%t://ÏÇLJþP]°`Áè äçÜÜ\///•‘g( ñ …Y)¨¦.M*•®_¿^áÁi.|êÔ)•ež;wŽyÅÆÂÅÅåâÅ‹ì2ós߯¦¦&Óà+Ó¢âôˆVÛ<ÍÍÍÌÙìÔ±³³SwD¸oWÁ¾}û¸ÌvóÜsϵ´´p,Ÿ— ÿâ‹/bHLLÔ¹4vÜæ’“ci|5`­V÷öö¾uëÇjQGm†cþ“'O2»Ôyæ™gš››µ¯ iõõõ ·ñ*…‡‡+ÌËÈËֹ篭­U~:†…ÊBš››fи"ÇðLûÝÄžŸ[…ý¼œªæ…{=ónÙ²eááá•••ááát111ÉÉÉÌlNNNwîÜ!’h™a«L'&&Ž?þÞ½{7oÞŒŒŒTμzõê^xA"‘ÔÔÔ,Y²„ç=Ô†  CGuùòåððpWWW2bKa‹ÊG\·µ”©ù¢®(•£`2O:õÛo¿íìì lii¡30Çï°w‚¡ ³¥n´û²sŒY°òòòÞzë-GGG—8"‘hìØ±ßÿ}gg'Kÿý÷äɓًš:u*—9)™«h»_ärÎã)À¥4ò´¶¶.^¼Xy€41bĈk׮雲#GŽ0‡N(‹Åï¼óÝ;α|^*¼©©‰9C¤X,V9"šÜæëèú7`Ž+ŠD¢™3gòU‡&o3Üóggg3%S`eeÛÖÖ¦C <I«¨¨`¹·¶¶~ÿý÷é+E.%®J¥Rirr²———ºP¹uóæÍGy„ûŠÜÃ3áw{~.ÕEñ}ªš î•lMMM3f̰··wwwOJJ²¶¶–+/¹\žÐ½{w§rB]º³³sãÆôS÷C‡=tèræöööØØXggçmÛ¶po51í±PÇhQ¥¦¦zzz’*Ä r¹ÎkêF¾¨+JݸæŸYYY¡¡¡çΛ3gÉÀ×àíí­10ƒfK£ 96Á‘Zãøm'x—)ïZZZN:•™™yíÚµ‚‚‚ªªªÖÖV{{{gggww÷Q£F=ÿüó¾¾¾ üóÏ?=ú믿Ò/Ãsssóóó{þùç#""8ÞD1#ÕápËåòÌÌÌ_ýõ·ß~{ðàAUUUSS“½½=ýÞ©€€€GyäñÇ eŽPÕ —huÎSTTtàÀ'N•••ÙØØôéÓgÔ¨QS§N?~9mÚ4¯¨ÔŠiÛŒVùe2ÙÉ“'úè£ãÆ›;w.ùd6D;Ô6kkkZZZZZÚ¥K—****++e2™ƒƒýß AƒBCCÇŽ«<ï&ÑÖÖväÈ‘ãÇçää766ÒÊ«ŒAÛðLòÝÄžßT§ªYÎõÞ;w^z饼¼øàú=111ôƒr¥;F#Ì–º¡( }3`NvìØñöÛoÓi__ßüü|Ã:À™üÎO?ý4>>¾¹¹yÒ¤I)))ô­W×dòc¡’0£¸]»v'&&Ò í‡zaSaF%|"2®Ï¼êÇ kª©©8p`uu5ýç† Þÿ}Ó†‚ë=áæ±fTBVWW7zôèôôtæ#‚ª@aSaFeÄš³ÃÊ•+IGƒÝ‚ L€ž”ßâdˆÛZ‘HdeeµsçNý')ëjÐË 3±9Ö9Æ z:vìØgŸ}Fþœ5k–››› ãПqnmTnwUì„6îüˆP} |õõõßÿý;ï¼ÓÜÜL/qtt¼ÿ¾§§§iÃÑyܲn×·æ{Ul„È…9†\˜Q>uLÍt¶á‰DbAQŽÌ1fÐò¨BÚæÍ›ÑÑZ±ø>‹ßAc’Ëå8;ô!—Ë1;˜™+V,\¸ÐÔQ€™ÑížÁŒî4´ 5&&F"‘P%‘Hbbb “ÅQ÷+ˆ!Öâ·Ð ~ÛæE7òöK3bŽ1€>lll|||¦NzöìÙ?üÐÔဠœúˆäììì|ï½÷ÜÝÝ¢¢¢šššHQ*7Á’ûöí¾¾¾b±˜¢¨üüüˆˆˆ=zØÙÙM˜0¡¢¢B!:Ñÿb)?!!aùòåE-]º4!!A«š¦êƒ0• 6ZÞu=5(‘H„q \òÿjkk+**:pàÀ˜1cLÅÌ™3ãââ233³²²ÈòôôôóçÏ×ÖÖFDDÌ;——µ”­Y³¦¦¦¦   '''33“,߸qã•+W²³³ËËËmmmW®\ɾ –ü—/_ÎÎΖJ¥E…‡‡ÇÆÆVTTTTT 4hÙ²e*£"_Ÿþ9=Z¥|Ò=¡qgešéjC`Ì帘 ¹Y1ǘ€;.×{¾¾¾Û·o/,,TX±ªªŠN755‰Åb²\Ÿµ”yyyÝ¿ŸNß»wäôóó»yó&.++óðð`ßKþ’’•›njjrssSˆêÅ‹Ÿ~úéÖÖV–ò£££‹ŠŠ(Š*,,ŒŽŽV·›r¡^{:ªÔÔÔ   kkk??¿””²ÑÝ»wûùùY[[6ìÆd¹>k)kmm‰‰qppððð GtÒË¥RéªU«ÜÜÜìíí###éåíííË–-suuurrÚ²e )Û¶m>>>E¹ººVVV’ÌnnnôИM›6Ñc^fÍšE7å›D‰D2eÊŠ¢&Ož,‘Hx¨\5LÞÒØÎÍÆ5€Y:|øpzzúðáÃ}}}=J–÷îÝ›N888Ѓô_KYYY™¿¿?& ТЋ‹‡ "‹­¬¬<==™;¨ÜKþ>}úô¥K—ºwï.‰«ªªÔVRR²hÑ¢}ûöÙÚÚ²”¿wï^ú.Ô××wïÞ½÷·«1ù¨™ÊÊÊ‚‚‚7ndddåêF©ÄÅÅݼy3;;;//îB¢ÑCcärydddrr2½0##cÔ¨Qô»Ã333srròóóKKK×®]Ký÷W}ú^‘”Óu†Àt…}4Svt¨¢Õ•jjjª§§'YQ¡•Ëu^‹èÛ·¯Êq >>>*ûU· Žù½½½÷ïß_SS#“Éêêê”#¤­­­O?ýôùóçÉŠêÊçN˜w †ŽÊä£fîÝ»G§sss)M£f¼½½sss ¡Ccòòò|||ÚÛÛårù‚ 8@g`nÅËËKe`܇ÀèÉä-M€íÜ|Q…q `–"##oß¾ÝÞÞ.“É:;; º–²iÓ¦-]º´ªªª²²’9{ÂÂ… çÍ›wÿþ}©TzëÖ­¨¨(ör8æoii±±±±··/((˜?>KiÓ§OÿÇ?þ¡s<@3ù¨™€€:ݯ_?²\Ý(•ÒÒRf6‚ xâ‰'8 “ÉΞ=;iÒ$²œl¥¼¼\e0]gŒ35‚©{=´cŽ1w\®÷öíÛ(‹ƒƒƒÓÒÒÈŠ å($t[KYSSÓŒ3ìííÝÝÝ“’’¬­­éå7n¤Î:tè¡C‡Ø7Á1ÿ±cÇú÷ï/‹víÚ¥!¥êN‰¥|î„yím´¨L2jÆÛÛ[å¸u£TÔk`þ™••zîܹ9sæ Ì­x{{k Ì LÕÒ„ÙÂ-€ˆÔ,=Æ‚÷X6óºÞ»sçÎK/½”——gê@ B˜ÇÂÐQEFF®Y³fÀ€gΜ™5k=‚@$1·Hþ$ ÝÖR¶råÊ[·n}õÕWr¹<::úÔ©StÎ7ž;wnçÎþþþ¹¹¹‰‰‰?üðEQï¿ÿ~VVÖ_|ѽ{÷uëÖíØ±CeùÏ<óLGGÇÆé{‰D¢‰'~ùå—EEGG2dÓ¦ME9;;_ºt)00Ï åÀ„-åX€ÎºÑ]¦C;æ3X˜%K–<|ø°¬¬lÅŠ¦øôÊ+¯¼öÚkŽŽŽ«V­úî»ï º–²õë×»¹¹ùùù <øÙgŸ%ËW­Z6nÜ8‡3f¼öÚkôòuëÖ=öØcC† éׯy,BÙ;ï¼S\\F–„…… <8 ÀÓÓ3..Žd íR³$âî’w"ô߀ ê·tå›.:°O?ý4>>¾¹¹yÒ¤I)))Ý»w7Et'¨cA3*ÛµkWqqqbb"ý§ÐnLÑŠ GD>7Í«~Ñ&,®÷„C˜ÇB˜Q Y]]ÝèÑ£ÓÓÓûöíK/A_Z‘A‰M@¥nÔ ï[±²²Ú¹s'éh ½ &6Çú5ǘçÖFåVºò]•ÐÆtX‘HÔÍÔ1…nóáu©YôÌ}Ââ´5´n"‘ÈìjÙcóÅ{„Âáâ,žpnâè ×`Pr¹ã4Ðí¶„ûZ¸í1! faÇïžš¶ÞHÎ8#è&—ËÍ®¢Í1f”“'OÛØØøûûïÙ³‡,ONNö÷÷·±± ÉÉÉ¡’$ÝÖR@†p“ ÌDRR’‹‹‹§§çÑ£G“’’z÷îíééyúôi:Cggç{ï½çîîîààÕÔÔÄW…€ãôA°ççñÎÜä#äÎä‘€`¾è¢fΜ×ÐЙ™™••E–§§§Ÿ?¾¶¶6""bîܹ¼¬¥€ áVùûYyy¹D"ILLœ1cFyyyQQQbbâòåËéÿݸqã•+W²³³ËËËmmmW®\©ÛîƒF†ÌbüÒLÎäÝ øÑÚäfÅcîŒp½çëë»}ûöÂÂB…íVUUÑ馦&±XL–ë³–2…ÿ¢wAÕÕÕr¹¼µµ•™¶²²¢3øùùݼy“N—••yxxh³Óºæµ·nQ¥¦¦Y[[ûùù¥¤¤¢vïÞíççgmm=lذ7nåú¬ÅeëÊwdEmÛ¶ÍÇLJ>âÌå*7×ÜÜ22²±±ñáÇ®®®•••tæööv777ö`T.W†ž؆-Æ5€àÈårÊÀ?~>|8==}øðá¾¾¾G%Ë{÷îM'¤R)/kiÅÅÅ…¢([[[fº³³“þßâââ!C†ˆÅb+++OOÏŠŠ }¶ÕÕ˜p0‹ÊräªF¸\¾|9;;[¹©ÜÜš5kjjj rrr233ÕmZyC«W¯.))¹wïÞÝ»w Þÿ}öàú駉'&''/Y²„R5¾ÆÙÙ922299™ÎŸ‘‘1jÔ(–`(#ŽnÀ‹'LÃ4]¬Œv±šššêééI6ªƒÊå:¯¥œ‡e•i‰D²;¼æ]ƒnQ™v0‹ºrþ,))Qþ_u›óòòºÿ>¾wï÷&×·oß»wïÒé;wîôíÛ—eÅ?üÐËËëêÕ«d¡Êñ5yyy>>>ííír¹|Á‚PW&)™y ÚÒ؆-EQ×]QddäíÛ·ÛÛÛe25` µ”999åææê°âÂ… çÍ›wÿþ}©TzëÖ­¨¨(cè‚L;˜E]9 úôé£r¹ÊÍ•••ùûûÓi’ࢼ¼¼_¿~tºÿþìd’““cbbBBBÈ•ãkžxâ‰Èd²³gÏNš4‰=¹8È]ðÿØ»ÿ¸*ªÄügà¢"—"êšö ÔÚmße».¹¦ëCdÛê’%¹àÃ}÷P Tp1à ,|gj»ÅºÛ»ÝwöÈÖÍíÑVTïÅÔukWŒ-ßh…\0Å5ð"æûÇ|v¾³÷ÞæÎ_gîëù‡Þ;Ì9sæœ3¿Î9s®®Œnõði¿h}Ë÷Úk¯Íš5Ëf³Í;÷ý÷ßç7ê‘ÊBy«¬¬?~¼÷šd¬q ###UUUÜ{û7ÝtÓÁƒåï²2æ¼÷0U† fñ+éhù¯‰‰‰ŠÇ5´´´pŸ›šš’’’$vttdddTWWó ÅÆ×Ô××/X°à/ùËOúS±½ã×îÉÔœµ7H`\£ûï¿ÿ‹/¾þ¿ÿû¿Å‹s Y¯Yô<>( å­¬¬ìÊ•+Þk ƒøü²eË–¶¶¶k×®ýãÿ¸çž{äï2;˜Åg<ŠG¸pî¿ÿþÇ{ìÂ… }}}EEEkzlÈápõõõõöö:‰°v»ýèÑ£/½ôÒŽ;¸%bãk,X]RRòàƒÊ܉Ã$pšFÒB¸&£“áÓ ÆZ±bENNNtttiiéþýû5 %3ž7.X°@ñK111)))sçÎýîw¿&¶¦Ç†*++ããã322f̘a·Û+**¤7”˜˜xäÈ‘W^y…[³´´táÂ…YYYQQQ«V­ÊÉÉnèüùó .”¿hn°†ad=˜÷\Dûýª÷c$E{dÚ"0m ôÅ_,]º´µµÕØd¼ð çÏŸê©§ü È)ª+jˆ±† a†ºÿ 1Íœ¼_c6:E`)6l¸xñbOOϦM›²³³MÌåË—ŸþùGy$Hð¬g˜¯Ì‹{,ǃ‡QÐ3¬ãE»mÍš5köìÙ3f̸þúëŸ|òÉ@¶`²†™4iÒ† ýÞ ¯¨Œíz†Ã;`^xÜ5™3ßÌieø2 ðe L` Ã`\˜†6ó`¾Ö)8ðq®0Ì×ÀퟞÛ`,þ «"ZÇLó5€ÙÒÉ ¨ûsf£¬^÷ O€n‰á›äl‘_Í’õ–F!4ΙAcš@147èÆÚ (mƒ‰Ç±O)Ì×tÀ#‡‚¶¡(Ýå Ì(ýÉ<öÑ!m6˜¯è€æMY¯¡¡¶¶vîܹáááiiiûöíã—×ÔÔ¤¥¥…‡‡Ï›7ïÔ©SÜB~÷•…òÆ0ÌîÝ»SRRl6!äìÙ³ÙÙÙ×]wݸqãî¾ûîÞÞ^~5Ÿ1 =üðÃÑÑÑS§Nݹs'­Ëå*((ˆ‰‰‰‰‰Y»v­ËåâãÙ±cÇĉ§Núæ›oîØ±cÒ¤IS§NýàƒÄ’GþýÁJ,f õõõv»}ïÞ½„‘‘‘-[¶L™2%***77w``àÒ¥Kqqq.\àVž2eʘqú$}ìã„`B˜¯h"|äÀ†Z„™i™†BÈC=T^^~åÊ•cÇŽÕ××óËëêêŽ?ÞßߟŸŸ¯J(ŸNœ8ÑÐÐàv» !Ë—//,,ìííííí½á†ŠŠŠ¤c~üñÇûúúÚÚÚ>ûì³Ã‡ó+—••uuuµ´´477·µµmݺ•ÿ“Óéìèèxê©§V­Zåt:ÛÛÛŸzê©ââbŸiã Z8@"fŸ:´lÙ²ššš 6BªªªNž<ÙÐÐàt:#""JJJbccGMM ·þáÇ¿ýíoËÉ7‰¯–¾ÑDqÌ üô(ÐGøhZÅèÍF9³¦¦¦­\¹2%%EðÂ… “&M"„ ÆÄÄ s˹ؔ…ò™Â®®®„„ï? ¦¥¥qCÄb¶ÛíGŽÉÈÈ „477Ïš5‹ÛPRRÒ‘#Gf̘AijjZ´hÑùóç¹x¾þúë‰' 7ŽÿÍ5vøL¡0ñb1û X]]½gÏž·ÞzkÞ¼yÜ´´´wÞygΜ9„§Ó™™™ÙÓÓsöìÙ;ï¼ó«¯¾ [·nÝ¢E‹î½÷^Ÿqyeê³QL¢À( Jè…ÎLUÐøD ç¹´¾¾¾¢¢âã?ŽŒŒÜ»wovv6ñz.å¿ò”…ò™BáŸþö·¿mÞ¼¹¡¡a``€ûëèè¨DÌ6›mhh(44”âv»ÃÂÂ|.ŒŒônõû,B±˜}LOOw8•••üB>…,ËŽŽŽò;xß}÷-_¾<77÷†nøôÓOÇç3N"¯L‰Hs˜ Ã0˜¯h…Ùàdí ¼å–[Þzë­¾¾¾_ýêW?ûÙÏ4 5¦Ÿüä'<òHggçèèèåË—ÇÌö„„„³gÏrŸ[[[ùåñññÂåñññj¥Ð¯˜=úúë¯ '’HHHhkks»Ý###\s·|Ó¦M{öìùè£n¿ýv‰†ùð"0_P¥Œ.:m9Ž3gÎ\»vmtttddDÓPcºzõjxxxddd[[ÛÚµkÇ\?77÷ÑGíëëëíí-,,&¯¨¨ˆ_îp8'i„ MMMÊb¶ÛíG}饗vìØÁ-Y·n]AAÁ—_~év»OŸ>››Ë-_°`AtttIIɃ>¨8©,_u­!„Ƴ i=­X±"'''::º´´tÿþýš†ÓË/¿¼iÓ¦ñãÇÿà?¸óÎ;Ç\ûöíqqq©©©7Þxã¢E‹øå•••ñññ3f̰Û튓´qãÆ ðCü911ñÈ‘#¯¼ò ·fiiéÂ… ³²²¢¢¢V­Z•““#ÜÐùóç.\¨8©ÞXÁ裵`¾ ÌwûÁ ^xá…óçÏ?õÔSÒ«)+SÔs¢õ·mPŸ‚žhqùòåï|ç;uuu‰‰‰Òk*.SJŸj-Ïft(æ=Œßl½ŠSà®1 úüóÏÙЖe¹tbؾ© 0€2×`=–)F7˜ Ã0×t3jtƒI&§4a •m?hÅfx"°UÊTëÑ &iYÃð£#ÄØÍPMÙó§¦O­ˆ—Þ„Ø_)zœö¦Ýoa2 ã3NÖä'X7˜¯(cªq bƒö¥ó+ %SJJʾûÝïJ¬£iP±LÕÝàñÄn’Z'Íð43˜¨¨CE[ƒ¡d s\ƒUÛˆzÍ TO9)¬:§Ÿa˜ÃGV(@cš€vµµµsçÎ OKKÛ·o¿¼¦¦&---<<|Þ¼y§NâòÏ,ÊBycÆgïÕX– á¢r¹\111111k×®u¹\ë =üðÃÑÑÑS§Nݹs§ß™bJìX/SÈy¢¤º¡üëýî³ÎOÐ,Ëb¾Yzè¡òòò+W®;v¬¾¾ž_^WWwüøñþþþìììüü|UBù$'÷xÉ?g–••uuuµ´´477·µµmݺÕcýǼ¯¯¯­­í³Ï>;|ø°œdP!ÀÇlÚxF57à  ŒQïP¤¦¦­\¹2%%E˜˜ .Lš4‰2883<ʯ sòtãstƒX'¿%ˆ¾û"œš’4¦h·bÅŠœœœèèèÒÒÒýû÷kJ-•••ñññ3f̰Ûí+lß¾=...55õÆo\´h‘ÎÉÓÓ˜O‘†—ÑÖoR0Fýt*€bÁóL<ô)SŸÏØCŒªWº=žë°› Ä0 CÝÔ4¦ Áü‹ô::$Cç-JÐtë,ËÚ´‹ð~”þuF9k'Ÿ¨ƒ!÷„³cjó5˜ ë%ð5ƒ“œ}útnn.·|„ MMMüj_Ç .LÞêիׯ_ßÙÙÙßß_XX¨J²ÕBã•’Æ4èĺAV€·ÚÚÚ¹s熇‡§¥¥íÛ·_îó øó†²PÞ†††~øáèèè©S§îܹ“_Î0ÌîÝ»SRRºùJKK.\˜••µjÕªœœnùÆ,XÀŸÇ×1ƒ =ñijgÏÎÌÌLOOŸ6mš¦»£Ë²˜¯¤à¾Ùlô?õ¡¨NÛy˜DÊ M ÃŒbæ'‚¸¸¸_|qùòåN§³¢¢â׿þ5!„a˜{î¹ç¹çž›8qâý×½ýöÛ'Nœ ‚Wô•…ò¶yóæ3gμüòË£££yyyï½÷ßcïp8öîÝ;yòdݲÂ/†—©á Г;KÍL! ÌüX˜ššZTT´råÊ””~!#òƒ|«²PÞìvû‘#G222!ÍÍͳfÍâÛººº´Ûñ^¦†'@OZï,#QG ¨ kŽÚ•ê€nTÏj<Üš…‚–Aà ¢…™ ëëë+**>þøãÈÈȽ{÷fggñ_à?( åÍf³ …††BÜn7ÿ‹æô3¼L O€žôhkà>Ñ•¡AU ´†§Ú^‚¨† ¤(½” K- ÂÁeNT<ÔÖÖ®Y³¦»»›øÓj ,/99ùÃ?ô9®ÁäÙex™Ï%UŸ=ÅïPX™÷„U†@˜Ò„ÉÃOÉÒKXvþV9Ô“P\ˆLÐÜQJX¬Š#«,hC~ˆq8gΜ¹víÚèèèÈȈ¦¡¼åææ>úè£}}}½½½æüyÓòy°0­÷7Dì¬jf4¦Y¦}ÄÕ-aÈ¿à Ób„å(³Ž¡˜¿…ˆ†*ø{` y·J?ƒ*IJÚoÞ¼S§Nq GFF¶lÙ2eÊ”¨¨¨ÜÜÜ>ïõ½£å? ÇÅÅÅÆÆîÚµK"ÍÞ‘¸\®‚‚‚˜˜˜˜˜˜µk׺\.>òÝ»w§¤¤Øl6á>úÜ–º¼‡6˜ùðiúŒLk³ä.+Þ¥S4¾Þ#©†üòÆ5ÐǪ÷"ò÷ 9`m8ô·|ùòÂÂÂÞÞÞÞÞÞn¸¡¨¨Hbe®€<ÚýëêêŽ?ÞßߟŸŸÏ-¬ªª:yòdCCƒÓ錈ˆ())‘Xßg´œòòòÆÆÆ†††ÖÖÖööv‰4{GRVVÖÕÕÕÒÒÒÜÜÜÖÖ¶uëV>Ú'N444¸Ýî1· eW=\+õäqmbh –x°T¡1Í †½–®È£U7NµBž~úi®Ûóá‡v¹\ÜòÖÖÖ+VŒ?>""bÉ’%N§“[þî»ïΙ3',,,55õW¿ú•ØÂŒŒŒÏ?ÿœeÙsçÎ1 sþüy–e?ÿüóŒŒ –e¯^½šŸŸýõ×_ýõW¯^åóÜsÏ%''‡††²,ër¹òòò¢¢¢âãã«««}æáµk×ŠŠŠ&Ožcö«¾ «„ôES‡š Û%{`` ..Žß¨GÄ–_¸pn³Ù¸Ï©©©ÜçžžžøøxéõÅ6g·Û›šš”¥911±¹¹™ûüÅ_$&&ò«uuuyG5æ¶TáQ-M{Ц‹ÙˆB4„™³ÝçíŠØ•‘ß e¡¼‰ÝÀø¼€šŠ™Ë”GèatVa¾P„Ñfìù^vœgþбcÇN:uöìÙîîîmÛ¶q ÅzYzè¡òòò+W®;v¬¾¾^láÝwß}äÈBÈÛo¿ñöÛoB>üðÃ¥K—Ùýœ?þx___[[ÛgŸ}vøðaŸ‰G¨_×ÄWޱ~öfs:´lÙ²ššš 6ˆ%ÃgÌ~Õ7"¨é”N*þö·¿-\¸püøñ ÃDGG_¸pÁß&MšÄ}ˆŠŠâG œ?>33Óf³…††N:•5Cl}1ÝÝÝéééÊÒìt:ù°Ó§O¦!!!Aæ¶üâóv…ˆ\ åMúÆã þÒý]9£³ŠªÌ f”—*¡¤¿ªHlOMRcuH€{j†¬Ciiiá>755%%%y¯#ì±LIIÙ½{÷¹sç„+x/|÷Ýwï»ï>–e—.]ºyóæýèG,ËÞ{ï½µµµ¬ì~Τ¤$aÚ|æ¡>] Ó®øÛqí3ÇÄÎ0b+WWW'%%}òÉ'r’áÖ¯úæQ%$òP‡š éiÐn·8pàÒ¥K£££—/_æ·b³Ù¹ÏÜÃ<Ÿ´ùüšœœÜÑÑá½9±õýª biöˆ$11Ñg¡‹å¤Îã´+ÓÀDZ’C~|"ÿ>:L" bÁiy¤EÌ ÆÌyîóvEìÊÈï…²PÞÄn`|^@MÅÌe þBYR#®¶VdgMrêÑ' ÁÖÖÀõ³,;<<Ì_A?þøã;î¸#::šK<Ã0Üò'N,_¾|òäÉÉÉÉüãÅN›6m`` 66öÒ¥K'NHKKã^— õ¹Q\òXÍg†††«—ZÑ®p]Ö¡¡¡!!!Â’;iøÌ1WNOO/++S– ¿ê›üSŸ5AÓ¶†I“&:tÈårµ¶¶Þwß}üVæÏŸ¿}ûöÎÎÎ{_>a„/¾øB˜6¤ržzê©%K–´´´ 766:éõÅ¢-++[¼xqGGÇ¥K—6lØ fHŠ‹‹—/_ÞÛÛët:—,Y²qãFï4?ûÜ–êthkxòÉ'³²²:::þùÏæåå=òÈ#ü¦ï¹çžŽŽŽíÛ·ßrË-ÜòŸÿüç‹/noo¿xñbaa!·pΜ9‡¼|ùrQQÑ<ÀG²téÒžž.W7oÞÌ/w8}}}c¦A,¸ÏåÉnN"'}îºÌ|©µ*3ç¹ÏÛ±SÿAY(ob70>/ ¦bæ2ñ÷-”•(iÌ]ö~Ë‹ÏRVÐ9à ÿÁç{eB z|B'òzW|î‚ÄûüŸ~úéôéÓGGG¹%£££ééé|¿â½pguŽPEäßû™ív;÷Y¬Ç’÷î»ïN:Ubá’%Kª««³²²X–½ë®»ž~úé»ï¾›û“Ì~N»ÝŽq cò·ãZ•q ÕÕÕ ’áW}K˜7ÝÆ5hù[o½5}út›Í6mÚ´^xßPCCÃÍ7ßl³Ù’““ñ‹_ðË+++Ç?fFŒŒTUUq]è7ÝtÓÁƒ¥×‹öÚµk………'NŒ}î¹ç¤Óì‰ð|žŸŸ/<Ÿ{'@l[ªó¸Âj± UÆ y ù;‹ ‡I¤A,8í#4Ýx "Ï…w&b§>é›ù¡xb70>/ ¦BE™‚|„Æ¥1Í’¹Ë“'O>xð Ëå:wî\~~>V¸Ž²Î±¯>·(¤ 'AŶ9½+>w¡¨¨héÒ¥N§³§§ç®»î*..îøÍ7ß\WWÇ-ùóŸÿ<þüÀ÷:ÀÕ9BB–-[æt:¹^¬’’n¹Xåý÷ßúôé¡¡¡·ß~›¿Ýô¹pÏž=±±±Ï<ó ˲;w‰Ù»w/÷'9ýœ,ËnÞ¼yÙ²eüj>¯îútN»:àoǵÏó«7›ûëùóçgÍšUUU% ï˜ýªo{!Ñ™¯CM0ó þÒ¡­A•1GC~䌓HƒXpÚGiº ð`æ<÷yg2f«²PÞ¤o`<. ¦bæ2P–tyà‰½å%¶¾üα¯>·(¤ 'AŶ9½+>wAâ}~–eŸþyþIæþûïÿå/é±éûOÔ=Ïšü¬Myæ™g¸·sóòòø.G±Ë×^{mÖ¬Y6›mîܹï¿ÿ¾ÄÂææfB÷Fâ§Ÿ~JÝerú9¹Õòòò"##§L™âsgV¯.ÐÀiW üí¸ö™c~õfóíîîž={ö“O>)‘ ï˜ýªo{!Ñ™¯CM0ù± ~Ñ¡­A•1GC~|òˆ\" bÁ1òä3sžû¼3³Õ@Y(ocÞÀ/ ¦bæ2¡,©!óÀ“󖗲α¯>·(¤ 'AŶáW±ÞŸ» ý>ÿÅ‹cbb¾þúë .L˜0áÒ¥K›°ÿ$ØÚŒNBP0y5Ð Õ™€B´ÚTs$1äÇç!È%Ò #@>ä¹õ L­„ðŒN‰hLs ì¯Ä[^Ê:Æì:ðùò<«Ò¸e%îD¬w…'Ü…1ßç¿÷Þ{wïÞýÜsÏåææzG…q ò™9mVbòj ª3…h%D@£M¨2æHbÈÏ!B‘K¤A,8F|ÈsëA™Z Úè s—}¾ååÑ̯¬s@¬¯`Ì÷Êô$øÜY….³wÅç.Œù>ÿ{ï½7wîܹsçþùÏVe¯ÜYÝbS™Óf%&¯º¡:PˆV¢C[ƒ¦L¶XpJsƒCoiÒ yÎþûÉÄb]¡î?ïjjf4¦Y+V¬ÈÉÉ‰ŽŽ.--Ý¿?·pãÆ ,`†ûúòË/oÚ´iüøñ?øÁî¼óN±¨Ú'N444¸Ýnî«°%E;t=üPŠK¯³³ó¶Ûnã>?ûì³=öØ… >ÿü󘘇áé¦Ñ ¢üùé 0F0””t…D§ô:ï¾ûîœ9sÂÂÂRSSõ«_ñ_|ñEîwÑo¾ùæÏ>ûŒ_H(Ÿ)|úé§¹Nˇ~ØårñËŸ{î¹äääÐÐP–e¯^½šŸŸýõ×_ýõÂßc¯ªªŠÿãÿXUU5qâÄøøø÷ß_"~9'@±„µ¶¶®X±büøñK–,q:â½0##ãóÏ?gYöܹs Ü?žeÙÏ?ÿ<##Cz7…¹ár¹òòò¢¢¢âãã«««Ç,â1«±uÀív—––ÆÅÅEFF:Žo¾ùF:ªk×®Mžû,ë«@ùÞ+ ÿzâĉ¤¤¤={öˆ%ÃgÌ~U aÙyÇÖÑÑñ“Ÿü„òãÿ¸££C¢ŒäË)))»wï>wîœGÀ .pŸl6›G&( %m``Àç! ¿z/÷¹ÅÔÔÔÆÆFîsOOO||¼_)ä¿Úíö¦¦&eiNLLlnnæ>ñʼn‰‰üj]]]üj«W¯æZ1Î;·zõj‰mx&q¡T=T°ñ™r²(îRÌFqž›ö¶Gl9÷AxÁòy qbˆˆˆP%CÄ.vcî¸8Ž,FùuôgùÂs‘Å9yò䃺\®sçÎåççóï¹çžŽŽŽíÛ·ßrË-üò@BùLáÒ¥K{zzœNç’%K6oÞÌ/w8}}}Ü×¢¢¢¥K—:Ξžž»îº«¸¸˜_­°°ð›o¾ùÍo~Íž;wî˜ñ™u>Ι3çðá×/_.**zà$2Ä{áúõë_|ñE–eùË_Ž7Ž»¨¿ð 6lÞManlÚ´iÙ²e½½½===K–,‘³/Òë[ž|òɬ¬¬ŽŽŽþóŸyyy<òˆtT?ÿùÏ/^ÜÞÞ~ñâÅÂÂBŸñó_%V~ã7âââþô§?™ ˜ýªeç[GGǽ÷ÞËï©X±òÚ"Oœ8±|ùòÉ“''''sÃh%rFxÿª ”·?þøŽ;îˆŽŽæÒÉý¦€ü¨Ä¾Úl¶ÐÐÐÐÐÐ@¢ V–æÐÐP·ÛÍ}–ny‘ÿ\ªøœ¯g¨`ã‘K|ûQ{{»œö#mÿNqž›ö¶GâvÅã‚%v ¶Ý7ß|ó{ßûž*"v±sÇåÀqd1(Kšr_b~rö9 8ZéuŒí %„´´´pŸ›šš’’’øåÂC‰~ů¿þšeYî jþ3×ÿ/¿t¶ˆv„úÌï…ï¾ûî}÷ÝDzìÒ¥K7oÞü£ýˆeÙ{ï½·¶¶Vz7…¹‘””$L[àޱuÀߎkŸÔbO˜b+WWW'%%}òÉ'r’áÖ¯ŠáQvbO2ò{Â%Öá½ûî»S§NK¿ÏåŠCñìvû.]º4::zùòeacÁàà ÷ùÂ… c6 x|MNNöÙ #3…Ò5A,Í‘$&&*;ˆ‘ßÖ@û˜#VrÈœAmið«sØ #@]ŠóÜ´·=b˽/Xb·>·{òäÉéÓ§óë{ókׄ„;‰ȇãÈJŒ/K£ê“ÛÕh~ÝkRDþ~!G.±‚±}¡„9†rú}~–¿ü„‰u„úÌï…ƒƒƒÓ¦Mˆ½téÒĉÒÒÒ¸×%dvŸz¬&g_Ì\üí¸öÙAíïÊéééeeeÊ’áWÅKؘ ½×³ï¿ÿþÓ§O ½ýöÛò_aPÊÛ¤I“:är¹Z[[ï»ï>~Íùóçoß¾}`` ³³óž{îá—O˜0á‹/¾ðÞ„Ç×§žzjÉ’%---ÃÃÇCz}±hËÊÊ/^ÜÑÑqéÒ%n‘Dš=")..^¾|yoo/×߸qãÆ1sC^ÓcŽ$†üÈÔ&‘¿:‡õy$±hAY¶›ö¶Gl¹÷Kì6À{»‡NMM=yò¤XzüÝ5±‹Ý˜;.Ž#+‘{Ó:–Ü®v›°äAè×N!´‹Ü¾Pòï ùv»Ýg9ýŠ>?ËŒ_~ÂÄ:By ñ¹pÉ’%ÕÕÕYYY,ËÞu×]O?ýôÝwß-7¹4È×Àš¾øÛq­Ê¸†ŽŽŽŒŒŒêêjÉð«bˆ%Ì_r.Ù¯½öÚ¬Y³l6Ûܹs…S–øLÿAY(oo½õÖôéÓm6Û´iÓ^xá~͆††›o¾Ùf³%''ÿâ¿à—WVVŽ?~ÌŒ©ªªâºÐoºé¦ƒJ¯/íµk× 'NœûÜsÏI§Ù#áD*ùùù‰TÄrC^ÓcŽ„<†üÈÔ&‘¿:‡%’¡âÈ#‰@ f»Ùn{Ä–{_°Än<¶{àÀÒäìšô]P€GŽ#‹‘uÓzó–Ü®¦›yƒBeû‚P° ‰Œí %„,[¶Ìétr}P%%%>ƒÈéWôùY,~~Kù ëõ™!>îÙ³'66ö™gžaYvçÎ111{÷î•¿›,ËnÞ¼™{Q“[mÌúcò:àoǵÏj¿z³¹¿ž?~Ö¬YUUUÒÉðŽÙ¯Šá±cV<1V:ï_”c–©ÆI ù‘3ŒK" ~uë3òhÌÕ@]ʲݴ·=·C,±ÛávŸ}öÙ”””3gΨ›!b»1w\GcpYŽYŸ>øàƒÛo¿=22222ò?þã?øþ–eÓÓÓ ! Ü×;î¸cáÂ…ÜçO>ù„2}út™Û=vìXVVÖu×]1þüßÿþ÷Üò›o¾™Âw¡°,{ðàABÈÍ7ß,PήÈ7ìrÀß­H¬`l_(!ä™gžáÞ­ÍËËë0”Ó¯èó³Xüý–ò&Öê3C|.lnn&„pý Ÿ~ú)teÈì>½zõj^^^ddä”)STù c뀿×>;¨ýêÍæÿÚÝÝ={öì'Ÿ|R"Þ1ûU1<öbÌŠ'Æ'=àðE)¿Lés$1äGΠ3‰4øÕ9¬ÏÈ#eaA1eÙnÚÛéÛ!áKì6ÀãFÈÕ+Wω‹ØîKÃqd%Æ—¥t}zÿý÷CBB¾÷½ïuuuõôô|ÿûß á€uëÖBžþy–e/^¼j³Ù.^¼È²ìîÝ» !?ûÙÏäl÷Ã?´ÙlwÞyg{{ûç@Ü< IDAT?ÿùÏŸþô§„ßýîw,ËrC=—-[Æ\ºt)!ä—¿ü¥tÀ1wMTßw~2b‘~nKë­(¦Ã‘¢s@2y ‹Q9©çIïĘ$IæØ˜¹g1GC~ä j“Hƒ_ÃúŒ»zø¯(MZð%åý$Œ“vè5"Úá ²*‹Ì|ªóžPÓ¨”Ëbç>‰›]°ŸÅ:@éòBiÒbÌ’²Øµ&Ø øÌçCz¡ì¬Êìó5€ºÐ<Įܨóö ¥I9·Ñè•¥LçCJ¡¡ÁÚL=_Å»J ’X.ÆÁ@úÊ:@™·_(M“ó÷6åH”—©à|H44X›Yæk=áblmò;Q ê€Yùuû%,M¨y‹ÃßrÔ0Y <&™Ž#Šà ˜¯àQÄ_9„„»L/–…¡p-Ããej8HÔ‚¶°ŒÞ\ÀK Ãøü,ö×7Þxã»ßýnddäøñãøÃ¶´´ð+766:Ž„„„ðððÌÌ̃ÊßÖÿþïÿÞqÇQQQQQQ·ß~û|à‘±í¶µµÝwß}ñññ6›mêÔ©¹¹¹ùË_TÊ$€ †î\ëÁ ´Å ¡@-ÂK.@5†aBŒMYòhòóЪ®®þïÿþïþþþmÛ¶}ðÁ«V­â–×××ßzë­ÿûßßxão¾ùæÀü㥷Åûàƒ–,Yb³Ù¾úꫳgφ‡‡ß}÷ÝÂæ‰íÞ{ソÿýïýë_ üãÿøÑ~´uëV¿³Ãô<^¦0TKËÃcŒà‰ x?DÇç ¡¡¡n·Ûç:ÜçO?ý433“2000~üx~ý¬¬¬ººº÷Þ{ï‡?ü¡ÌmñKn¿ýö¿þõ¯õõõ , „œù„‹dæÌ™wÞyç¦M›’’’ÔÉ#ã ­!Øö—^()«BÉZ Ú¬­*B[XŒÁó5È122â½à׎ÏlÛî믿~ÿý÷O™2eppðÓO?ݳgOvv¶Æ 4^£ÝàTc%h\°0+@àÄ.y¸¥ŒŸ¯Á§ÐÐБ‘—ËÅ}mll”ö;ßù!DÙ¼ŒóæÍ#„œ:uŠûÊ}˜?¾œ°Ó§Oíµ×œNçåË—_}õUa<<ÆXZ®-íG !ÄûG Ç=óÿâ¿jjjZ»v­ü°UUUãÆûÏÿüÏ¿ýíoÃÃÃÍÍÍ«W¯æÿ:yòdBÈçŸî3ì¶mÛBBB6mÚÔÝÝít:KJJBBBüq9Û]¼xñŸþô§¯¿þ:22266–rë­·ÊO6÷»–„b03³Ý=PMú€Âá4bYÖŒã^}õÕÅ‹?ñÄ111>øà¦M›ä‡ýö·¿ý÷¿ÿ}þüùÙÙÙQQQ999Ë–-ãÿZ^^{à 7øüðÃ<ðÀä'›.茿 åȪP¦ †ÁE$ˆÝÏ]cðì)ÕPLÖƒ2µŸŠR¦¦„P‘°eYïitù?éŸ6ņ± ž|Täó€Âhb šçkóÉ´ƒîn‹+P\J(…#@]cþ, ù7À›Içkw½ºAÛÈ‚v2î9@]h<0?¡ aŒk…pŸcBã‘• ƒäÃ| `x.0?¡0&Ì×Á´^\G(‚¦@ð‹ ×  î}­¥i=(SË@{øó5€,h6ù0_Ã_@è0-\åÀ_˜¯4T‹AS ø%„eY\<À@Ô`ac+ÆÇ™OPó5€ p›FÁ0€¦pqÅ0_ mF–„[ +Áá þÂ|  &ÜY€žQ©†v@æk  €2x˜°Ì×ü?&„v@æk5¡.npl(D«BÉÒWs ó5›*ðÙzŸ…¤×çï) O3>Ïg‚ú†ÏølÊÏB2Ãú»>>ëð™à‹ÏølÄgò/&I>ùç@`¾0 .@æ„cÁ0‚îho\ƒ–üJâïúæg½=²  E¼¯5|c9JÐz”›8¢MÇ&€áp>k`ó5€æ|^hp#áº>azHCàxÕa¾Ð n\@#îK;4p[L¡M4…ù@'x0• –emF§,‹eY®% ÷1ÔѨ Z·¦mœv¤a( hÍ†Ë @³Þè6ï=ÂÅN;Ö«?–‡"­1 ƒq @ Ü«N,Ki2÷Þ/ôâjM­¼Å˜8Ý ‡@S6Ü~vpËZ@uR…ðiÜzYê½GÜþâ’€F[Ðæk:Öne#ü1E´8¨®”Bý­a¾€ Â?çÉߣÅ!83A ÈIZ ¡ ôÁ0LˆÑi‹ÞÙ€±‚¼¡Çï>NMTPá@O!ÜëôF'` 8S BhnP…F¹‡FjMá :`Yã@'¸kUà.Y44xCsƒZP©¨€·'@g!,ËâšB0Ä ¹@ ˜¯ X ¡Á'd  jýa¾Ðj€þðŒ1&Ì  ª-P·@˜¯t‚›Qžjè…çP •GE8€Î0_€eiÔFãñ¨â¡QÏ–Ú`6¸3Q jÀ˜¯ôƒ[y«ÂcLÂ,pÍa¾kÒtPƒðÚÁ...Ž‹‹‹Ýµk—GÀúúz»Ý¾wï^BÈÈÈÈ–-[¦L™•››;00à3f!éȇöP°*4 €þ0_ø‡{nñùþ]yyycccCCCkkk{{»ðO‡Z¶lYMM͆ !UUU'Ožlhhp:%%%Ò1KGÞÐpÆbÐÚ Tï¥nØ-u ¶$”‚2ÚåÃüÛµƒÿšœœ\WW7sæL•«««÷ìÙóÖ[oÍ›7[˜––öÎ;ïÌ™3‡ât:333{zz¼cò¹ºPÓdÒ'£øGe”ˆ2¨Ï”ÂÁ ÖÀHÜÕ´5P˜`KB)(£[ƒÍfs¹\6›Ícåôôt‡ÃQYYÉ/ ãG1ŒŽŽ2 3::ê³ÏÈÕ…š&“n…Q Y@/¿` Ã`¾PGBBBkk«÷ò£G¾þúë;wî®ÙÖÖæv»GFF¸æÅ‘€Ü×€á0_è ³¯XÀ„ ššš¼—¯^½zýúõýýý………ür»Ý~ôèÑ—^ziÇŽÜ’uëÖ|ùå—n·ûôéÓ¹¹¹>cž+Ä"¡Ã(#0VˆØ,\@/M7nܸ`ÁïFÃ'žxböìÙ™™™éééÓ¦Mþ)11ñÈ‘#¯¼òJEE!¤´´táÂ…YYYQQQ«V­ÊÉÉ‘ŽY:rà¡5Ìó5À´x\¡kº/ôàE  òMdšzæJDdípƒ5`¾0N”Òù¯Ýù (`˜¯À Ð(¦Bë| ¸ Z @]4ÞÔ€õ0 ƒq `Ü PãóÍ Í÷`6TÎ×À%˜ºd€¿ðl Ζ`˜¯ ƒ¿ÌIÙQ©õ±ŒsEÐÂÅB4Ë€ Ñ7_ƒð†7úP½ ÂãO*žÏ}F…ëE€¦…¢Â| ‹²Viù¡´kõÎËËëèè „tttäååi´• AWçDPAÑ€ÙP6_ƒwR)J_â+//olllhhhmmmooþéСCË–-«©©Ù°a!¤ªªêäÉ“ N§3""¢¤¤D,fÌ( dø‹¡è>^â^‡¢½ ‹Ö{æ˜4 - ™9¹—ššZTT´råÊ””aÀ .Lš4‰2883<<Ì-çbSÊg =š¸¯ÉÉÉuuu3gÎôX¹ººzÏž=o½õÖ¼yó¸…iiiï¼óΜ9s!N§333³§§Ç;æ¼¼¼ŠŠŠ”””sçÎmÛ¶í·¿ým ™œ ÏÃ`NÈK¡ ÖÀHÜšÚô§ÃÉÎäçS“'ÏÚù3ëëë+**>þøãÈÈȽ{÷fggñ&þƒ²P>“ç3ˆÍfs¹\6›Ícåôôt‡Ã!| ",,ŒÅ0::Ê0Ìèè¨ØFå\ïPåÄž3†'À„ø›"d €ÅàŒÖÀPt¡s§ùwFhk0yò¬ ™ ùX[[»fÍšîînâO«²PÞëx|×ÐÑÑñýïíÚµ›6m⦤¤|ôÑGv»]:fùPå|2íŠÆòÀªptƒe`¾0¼  ?‡ÃqæÌ™k×®ŽŽŽŒŒhÊÛ„ ššš¼—¯^½zýúõýýý………ür»Ý~ôèÑ—^ziÇŽÜ’uëÖ|ùå—n·ûôéÓ¹¹¹Ò1C p×k*xó³Qq¡>ˆz$X8‡9ûX–ECxôV¬X‘““óÕW_}ë[ßÚ¿¿¦¡¼mܸqÁ‚ß|óG)?ñÄ›6mÊÌÌdYvÛ¶mÂ?%&&9rdÑ¢En·ûñÇ/--e&++«««kΜ9eeeÒ1€>¨™¯a̧<–hDŸŒ5sñ™9mÖ†œòÐ_È1ŸL’-&I† +¬ Ç8XÃ06*j³Ï± Â…&O?ÈAKË@ð â&!¨`$ PeYÛØkh ¯Qh;²ÌЊç}€ž$ox¨Š ¢€ùÑ1_ƒÓ ´pÒPZÄ€ Ãàw(ÀøŸÇ3:!` ¸ŸV Ž,™På|B¶˜ d K7ÂÖèdø‡Æ4€bh8ã é¨À²,Æ5XžÐÆ„Þ{0?Â@–e©»Á¢1Í0&<h —OÈ1h‚1!Ђaü€Åñ?õb†ß¤0¾¡Ùf†v ‘%[rqøÅFãŒÆ4€L8Àµ€æohh*Xò ¬'H**?á `,Ëb\˜÷8„g!- ¹A ÒÌÙäÌ׈ Üe …X+ƒ%+­÷Κól `6 Ó `847pÐд’¾b ”°~ÉéÔ{7ù«ªÏ¿3Ì×&äBÚ67à»1 Â;c°ÔU0œKy©̓ó ó5€¹ðB ‘à¼1±|ÁS+Læ„¡aÞ<.¬È‚ùÀlpo­ï‡`€ª´ž£肆 xQÀC˲Ô 4¦ü…Û,Ïé4xöÔÚ„mdÁ•L câs&xNSb0_˜^£Ð™w>bÜžšN¿f€RBCƒLÝÀ á~>Êèdø‡Æ4 á)Úc4NÝ´Àý± À<ÐÐàŒn „°,bt|¶Q²ÀA‰Sùî«°•Á£¹ ÓÖ€i¡Zʇ¼ ˜¯ÌG7u<š$NÑèê19”‹áP`BhÿR=gä†Á¸PH~+ƒp>¬†)ƒ˜ü‰"nßM^r`¾0©`¸› —÷ëÒOGÂ#Í >¡÷LÕ2¸›…`Ʋ,~‡äò¸aR|÷‰iºMwà"Ìצ€ç“Sðº„4> U3\^‚Þc0!ݪåÈÈÈ–-[¦L™•››;00À'`÷îÝ)))6›Íû«Ëå*((ˆ‰‰‰‰‰Y»v­ËåòŠ7<<\\\»k×.­wŠƒ¡ ´0_˜ÎÎA÷Ù&¤V+ƒÏ#ïSÔzUUU'Ožlhhp:%%%üŸNœ8ÑÐÐàv»½¿–••uuuµ´´477·µµmݺU,§¼¼¼±±±¡¡¡µµµ½½]—=jTþX.ÚþucxV#ÁYmBM jEè~¹Ý è:éJí˜,¶;`ºÕÌ´´´wÞygΜ9„§Ó™™™ÙÓÓÃ% ««+!!OðkRRÒ‘#Gf̘AijjZ´hÑùóç½Wã%''×ÕÕÍœ9SëÝñào6â„–AåíŽ@ÝžÕ†?žÁYmjMÊ 3š̆ººK°Ò¾€ÅèV9ø­°,;::Ê0Ìèè(ñšÓÇã«Íf %„¸ÝîÈÈÈááaïÕ„ë»\.+t€¶Z˜¯L   'Õ'eð ›ðe Œ'* mmmn·{dd„kn*>>þìÙ³ÜçÖÖÖøøø1·ÒÚÚhZ@Ìצ€&|ÃiÝÊ ‡p£hn€ ³!dݺu_~ù¥Ûí>}útnn®œP‡£¨¨¨¯¯¯···°°Ðápx¯#¼š¬^½zýúõýýý………ª¥D„ÐØƒDcš!@(qϨì¿è°Q±?¡¹AxÜ5 *9˜™žg†ÒÒÒ… feeEEE­Zµ*''GN¨ÊÊÊøøøŒŒŒ3fØíöŠŠ éõŸxâ‰Ù³ggff¦§§O›6M„€(–e©|?wEº1IV˜ “ä€å!Ÿõ§Ý¤ 27-½ELß 'J@J“-d] CýT æk€ e£±Ó˜f“0°•A>–e¹tŠMñ@;fáפ¤¤#GŽÌ˜1ƒÒÔÔ´hÑ¢óçÏ{¯–——WQQ‘’’rîܹmÛ¶ýö·¿•Ÿ-þæ$N`TžÄqêÆ„Y¶‹A‹‘î9±LŽ^,Öø¢ËzTìž™@¦©"lTppÕ××WTT|üñÇ‘‘‘{÷îÍÎÎ&^­üWþƒ²PÞ¸?±,;::Ê0Ìèè¨DT›Í644Jq»Ý‘‘‘Šç³$hk€ „ÉTAŠ Ov:ß|˜0¬Ù+!x~×M•j€ÇYæè£bG¨H¤©àˆV‘âÌ ¤ÞÖÖÖ®Y³¦»»›øÓj ,/%%å£>²ÛíÞ;"ÑÖ””tôèÑŒŒ BHssó¢E‹:;;¥7ä/´5@pÂ| @œy!àuP™Œ˜/ IDATaú¿ —ô„ÜV W|U虇ãÌ™3×®]Ñ4”·uëÖ|ùå—n·ûôéÓ¹¹¹2·^TTÔ×××ÛÛ[XXèp8'<Øhl9£1Í2I?™¨ØÓb1,Ëòw!‹ä@.é ¹-nóTÇu87®X±"''端¾úÖ·¾µÿ~MCy+--e&++«««kΜ9eeerBUVV®_¿ž×pï½÷VTT(N±,Kå5\„tcÚ¬Ö-aúl(xz½T¬ z-E‡žfÞ3§Í´´È49ÙÖn¦T«¨½jÁ;´l4ÖcÓ À ž§Vo´ì;-éÔ‚÷¾ÓuÊŽn ´%^Á\½u†¬VG®FtÚÀaÆft‚HðÌö'Æg˜êÖ‡Š2Ò´ëÞ;¨»õþ8¨©j—© [tƒ¬PíÍâA"„kã4:þ¡1Í .᳄•–õblÚô$¶ïf8¨)*#MSeHiqDc¶H0utf C¦Õ××Ûíö½{÷r›Û½{wJJŠÍöÿúÞžyæ™øøøèèè5kÖ q GFF¶lÙ2eÊ”¨¨¨ÜÜÜ>µÂà_].WAAALLLLLÌÚµk].—ÏP¼áááââ⸸¸ØØØ]»vi±ïÔÝ;I0ùe!,Ëâw(´åýklzÌÆ -(#if(#eÐÜà YÁìСCË–-«©©Ù°a·äĉ n·›ûzìØ±S§N={¶»»{Û¶mܪªª“'O6448Έˆˆ’’>Bà¯eee]]]---ÍÍÍmmm[·n Å)//olllhhhmmmoo×,ôƒÁ¥ ÅÌÝ2zÎÚ¨x+˜¦Î/†dÊÈ/Úe1ÓÈÌgõ@˜m¿Ì–Zh—o ÃTWWïٳ筷ޚ7o¿°««+!!ÿÚÒÒÂýAssó¢E‹:;; !iiiï¼óΜ9s!N§333³§§Çgpáפ¤¤#GŽÌ˜1ƒÒÔÔ´hÑ¢óçÏ{¯ÆKNN®««›9s¦êûî‘Dv£«sCBp 10“ŸìtH^ ›ÀŽ:gÊH­4* ”5ÇäguÅLµ_¨lŠiÚÖžžîp8*++… …ÛbÆív‡††BÜnwddäðð0!$,,Œ[eÙÑÑQ†aFGG}~µÙlCCCÞ±‰Ý{Ûl6—Ëåñb…êôikPö|aá§´5@pbó5h÷šÊè9èe¤ ¥/&Pšl N,fsôèÑ×_}çÎëœ={–ûÐÚÚ:uêTîsBBB[[›Ûíášäl.>>^[||¼ôú ­­­rb¦—²Ó¯¿¡p’0 Ì×V`‹ b¡Ï3!Ê(•‘Öó–¡¹}e:@&›–Ýn?zôèK/½´cDZu}ôÑÞÞÞÞÞÞÂÂÂx€[¸nݺ‚‚‚/¿üÒívŸ>}:77WÎæGQQQ__›Ãáð^Gx.Z½zõúõë;;;ûûû ýÜ9:(;.p4Ð+„ƉÐhL3hÁœÕ±Óú™e8JŸÛ)M6Ðõ*:4Ó$&&9rä•W^©¨¨ð¹ÂÂ… o¼ñÆiÓ¦M:µ¼¼œ[XZZºpᬬ¬¨¨¨U«VåääÈÙVeee|||FFÆŒ3ìv»ØyO<ñÄìÙ³333ÓÓÓ§M›æÏn©¶¶vîܹáááiiiûöíã—×ÔÔ¤¥¥…‡‡Ï›7ïÔ©SÜBþQJÎÖ™ýÚ1Êã‡?ôùU Üñèý›1<®¢ )Z§PAüæÏ4Zh—“(#µ¨ž“ú ÔzCfcí½6ÃÞ™! ôBîéÀ¯L–³òäÉ“<èr¹Î;—ŸŸÏ¼çž{:::¶oß~Ë-·ðË %ë{áp8úúú¸¯O>ùdVVVGGÇ?ÿùϼ¼¼GyÄçj_‹ŠŠ–.]êt:{zzîºë®ââbŸ«‰ñ·nãXk „PÙ¹‡Šº1VkÝAé|Œ¥E~¢ŒÔ¥z~êV@Á6¼Åò5ßð ¶¥:ÃK0¨>7djjjQQÑÊ•+SRR„/\¸0iÒ$BÈàà`LLŒÇ¼˜ÊBÉߺp}þÐçWEäd ë˜ækºÕ‰XÎè\Œà5 ˆ.üÙ…* ª«Àþð‡ºººùó秤¤¼ùæ›ür®É€åv»U %ë„mçÏŸÏÌÌ´Ùl¡¡¡S§Níííõ¹šÇW§Ó™žžÎ}ž>}ºD(²ì¯Ë€*¨hXÕáwòTì01cFn½ŸŒR7Wµ®-AX@„ª2Ûœž[4 çó@»ƒ–Ï^ u Ý]Mmmíš5kº»»‰ø¯z_•…R¶uNJJÊG}d·Û½wV"TRRÒÑ£G322!ÍÍÍ‹-êìì”™6‚q ¬†Á¸ )2:! è Ý€;WMY»òHp8gΜ¹víÚèèèÈȈ¦¡dÆ3a„¦¦&± Úýªx ÎÔJ Ó –§ç­|}}½Ýnß»w/!dhhèá‡ŽŽŽž:uªðgLJ‡‹‹‹ãââbccwíÚÅ'RÎlÌqú<Ü|ƯŸ>>::zÍš5CCCÞiЭ€ýí}AÒÜ`y†×C4å@Z±bENNNtttiiéþýû5 %3ž7.X°@ìT Ï¯Š^™aR4¦™R´dµv锳yÅÅÿÆoÄÅÅýéOânÚ´iÙ²e½½½===K–,áÓðóŸÿ|ñâÅííí/^,,,äc3³XœB>ã×nÇUÉ[­ËH·"„,]º´§§Çét.Y²dóæÍމѳ€XµóVx•Ò“QÛÕU÷˪ Õg£n¡ä1yMð+“Q±ÕâoN"çÁ2PA E';’j¶¶†êêꤤ¤O>ù„_˜””ÔÒÒÂ}æ rŸív{SS“w ]]]ü×ÔÔÔÆÆFîsOOO||¼tœB>ã×Em ú!DgRR’wbô, Vƒ¼5êäcÉçFëí‘ÛtÞ¨%©ÞÖ ›‚P&ok™<´5èm œæ†i½â«QRåG«C^1 “žžîp8*++ù…6›mhh(44”âv»Ã¸4Øl6—ËÅ ÅÆ L!¿2˲£££ ÃŒŽŽJÄ)ä3~¨•·:LÞ©O1 ãv»ù8###¹Ò³€Í¿|)¶i£¶®ŠÎäÒOƒ'ou 83•͹« ”i'ÎËË«¨¨HIIiooüñÇûÛߊ­iª¯ýâýN„I&憄àÄ0 æk ÉÑ£G_ýuákÿ gÏžå>·¶¶ — ¿ú”ÐÖÖæv»GFF¸§Yé8=ÂŽÒ§€!Â8§Nê3¬ ÈS={‡ HC Ñ_mmíܹsÃÃÃÓÒÒöíÛÇ/¯©©IKK Ÿ7oÞ©S§¸…|) %A8)Ç<;„ŸóéHÌ¿# îñÕårÄÄÄÄÄĬ]»Öårù UYYY\\Lyì±Ç„ÝVâ³ËÌŒeYüXkô¬`ú°ÛíG}饗vìØÁ-ÉÍÍ}ôÑGù¹‘ù5W¯^½~ýúÎÎÎþþ~ár!±Ù˜Åâf¯œøƒ>DyôÑG{{{¹8xàn¡• ÈØûH+57Uÿ˜!‚ É[“x衇ÊË˯\¹rìØ±úúz~y]]ÝñãÇûûû³³³óóóU %æÐ¡CË–-«©©Ù°a·äĉ n·›ûzìØ±S§N={¶»»{Û¶mܪªª“'O6448Έˆˆ’’>Bà¯eee]]]---ÍÍÍmmm[·n ÅU{ œ²ÀRÔz,‰®J¢EjeÆ©OFñ›èîîž={ö“O>ɲìÕ«Wóòò"##§L™R]]ͯsíڵ‰'ÆÆÆ>÷Üs1pFFFªªªRSSÃÂÂnºé¦ƒrËÅâ÷¿FTÉ^ÊH·"„<óÌ3\ÿX^^ÞÕ«W½ƒëY@¬¡GŸ¦,p­¤=ýþÒm-P7ÌFN~¦¤¤ìÞ½ûܹs/\¸À}°Ùlüò@BùL¡÷¤<äßçÙ!"óéHÌ¿ã\ø511±¹¹™ûüÅ_$&&ú\mõêÕííí„sçέ^½Z,ý,æk0ˆ¿9‰œk ˜¯¤ÑÕ!¦Å[Ö2s€®Œò—!oŸz$€œ½V*#ÃKÄ›á¦h‡öé̇zÒmƒ-cõ1f®Ö××WTT|üñÇ‘‘‘{÷îÍþÿØ»ûð(ª<_à§’NBÒÑ€Òä=äQ`ã ÌîìÕà2¼ Kdu4%M6ð0׫‰ÉaD AÐÑèÎu×ÁydF]uVgƒ˜aÅM0;d€!Àæ…I:ÉhóÞIß?j§nÙÕ]]]]/§ª¾Ÿ?x*Eªs~§^O:—G§DîOnB^*¿ÙÊ#\ßñtDÆßñ› –ψ?ÜÚüfRâp„Žñ4e#¨·Þz«¤¤¤»»[½Ãã5€5a¼0œ”@q܉ň×ܰªÕËüùó=ÚÓÓóÊ+¯üà?P5•_ÂAy„üާ#2þŽˆ¤¤$þÚ’’’D6Ç)ïL+’*è ·lÙòÞ{ï™#zTñb¼q†nnÅa7ÐQ~~þ… FFFÆÇÇÇÆÆTMå—pP!¿ã鈌¿#žó²²2nÄŸüüüp2oòžùER]a{{ûw¾ó€ "¸¯) Ĉy-áFPY8Ühcáº4ë‘o47ÐD³}Æ:‡!UV­Zµzõj»Ý^QQqøðaUS’œœ|òäÉ7Þxc÷îÝ~ÈÍÍ;wnVV–Ãᨬ¬dgVTTäææ.^¼8..níÚµ«W¯–²­ªªª¤¤¤3fÌœ93555Ð)§ï¯‡pÿÅ0Œ0-ûQFDD»X þ ?úª±›¨²yÆx 4Àx ôS/¼´Uœ†o0PV•¥öGæì„Õ¢ª ÚŽwóÑe¼†ÄÄÄŸþô§+W®t»Ý»wï~õÕWÙ•?ðÀ/¼ðÂ-·ÜòÜsÏ}ðÁuuu„7"ƒ¼T~KÁ5AM[^^~ñâÅC‡y½ÞüÇü«¿ú«çž{.ÌâŒ×VÅô’‰#P3F 5ÚÌm ô³N[1ÎÓ&…¡Ó†m Œª6^µéÒÖ‘‘QVVvÿý÷§§§óWÞÛÛ;yòdBÈÀÀ@BB‚ϰ—òRù-×Ö4mJJÊÉ“'gΜIijjZ¸páµk×Â,>A[XÆk³¡§ÓµŠN£Mc¨#}QxDcøË€Úè9Þ½s¤½vàwÞy§¦¦æÎ;ïLOOÿý÷¹ùìc?!$..Îãñ(’J\дn·;;;›ž>}zwwwHëø†Äô¾JÁl«Ý¯!PK¼ø÷M2RIü),íëZbƈ~ýPGšÕ‘.+—òÞ ”gOU*í0V©–è<ÞÍA÷·ëÇ/**êìì$ìSxÅ‘—*è2~秤¤|òÉ'3fÌ „\ºtiáÂ…íííá\÷Èè‚aôk ‘âã0SÈétº\.BˆËår:zg'd¨#Ñö^Ñ£EkSŠªïÆ­R-ÑÓµÁdt||Õý×C¤³à¨*‚曤@Œ˜gÐw*úŽÃÌ©¯¯OMM}饗!ÃÃÃëׯ·Û퇃ÿkᣣ£åå剉‰“&Mzþù繕WWW§§§Ûl6BÈØØØ¶mÛ¦NWPPÐßßÏ.æ³N‘,UUU•——Büñªªª 9×€Eêˆa˜}ûö%%%Ùíö¢¢¢ááá@9¡¤Ž¨}ºãÿ(m'P^3ÈFï‡HdŽþ „×ëE¿¬[·®²²òƵµµõõõÜüšššS§Nõõõååå+’*wß}wÅŠxì±Ç!O>ùdOOOkkëÙ³gOœ8Á-VYYyîܹ†††æææ«W¯róëêêØO÷ìÙsæÌ™††·Û³uëVv™@ëô‹½}§ç!Í"uD©­­mllliiéììܱc‡H~h«# ¡¹@Yt¾004}Ë~øá‹/ŽŽŽþñ\²d ;Ó'3ÜŸÜ„¼TB–ñ;„ ¯¾úêõëׯ_¿þꫯN˜0!„r€ 0ãî$Jå\âz¤,–žž^]]ÝÖÖæ“°··—îïï·ÙlÜüpRùÍáþýûSRR>ÿüsnfJJÊåË—Ù馦&.yjjjSS“p ÜŸçÎc§»ºº’’’Ä×)TXXÈ>$·µµZÌ«Pm¢Ž¸:"„ð×™’’(Kב8ÊOGT]Uéɉ^”â©=ª(£“LTRB$"æ@06$ˆ3t¯Q-”²X}}ýîÝ»OŸ>ûÒK/ååå #ÉKå7‡ÙÙÙùùùüžð6›mxx822’âñx¢¢¢Øä6›mhhˆí‡/Ü ‹[ØëõŽ3 3>>.²N‘Ð)Þ PG\1 ãñx¸uÆÆÆ²¿û%:mêH÷M„‰ž±é•Ú!X©µtˆ¼" £áÎ$¾0”dcC‚51 ƒñ42þü£Göôô¼òÊ+?øÁTMå×'Ÿ|òöÛoó¿ùŸ6mZKK ;ÝÜÜÌŸÏÿÓ¯iÓ¦µ¶¶z<ž±±1öQV|Pu)µHBøët8â롪ŽhÆ )ÝqM{Ê®´Ä? ô͉qY­½ÆïkUЋã5€éÑs¢û8Ì©©©Ÿ|òÉk¯½¶wï^vNAAAii)7Þ2·daaá£>ÚÞÞÞ××ÇŸÏ·iÓ¦ 6\¹rÅãñœ?¾  @|†`‘:"„”––vww³ë\³fM8yÖŒâOjàßÝê•U¼S‚©/Ý&C³ZCP(ˆÍ~FÌ3h¶„†q˜“““Ož<ùÆo°C+ïܹ3111##cîܹ .ä{ê©§n»í¶œœœìì쬬,¿«ª¨¨ÈÍÍ]¼xq\\ÜÚµkW¯^ÍδNC°HBrssçΛ••åp8*++ÃÌ3øÀ’9 úh€£I44€î)_á‚•ý•NøùWp¼kRä$£åÐV Æ™_›ð«õº×7V”Ô£Ùù4Àoh@ˆS0Vjò.@F`Áx `M¯,{ €9â3 Ž.ïcq‡ª£ìfáóujÇ/~d ×X^bO ™×ëµ_ À°¼^¯¯CŽÃLa–ôEa@(Ì’ p§ 4h ~˜¯CQeTá·6Zðâ.‘AwZyÙ6ha¬ã5˜ Uã0{ÿò›‹ôd‰úÄïæŒUGzÌðy«of@"´ ÑŒþ”^h‹ÌñãÇçÌ™™™yðàAnþ233£££çÍ›×ØØÈÎäNòRù˜9sæÅ‹ !W¯^ˆˆèèè „\¼xqæÌ™„–––¼¼¼›nºi„ Ë–-ëîîæÖV]]žžÎþž4Ã0~7 1 ƒß¡“3V§kGÕ´tÚ47à Y¸^‚°yô®_ëÖ­«¬¬¼qãFmmm}}=7¿¦¦æÔ©S}}}yyyÅÅÅŠ¤ò±lÙ²“'OB>øàƒ˜˜˜>ø€òñÇ/_¾œ²råÊ’’öǘn¿ýö²²2.a]]]CCƒÇ㑱QÂ(µ Æw®á”cCÒcCÒOËð·*Õ-Ò¸‘Q‰¼€ Œ¬0…ŒŒŒ²²²ûï¿?==¿ÎÞÞÞÉ“'BFGG oôGy©|?~üç?ÿù[o½µbÅŠ9sæ\¸pá7¿ùÍC=´~ýú¥K—ò—ÈÌÌd»60 ÓÑÑ1mÚ4ñÊ€±!Á²Ð¯€^*‰~¨#íy ÛYÉ‹)¨‡ªà„y²}çwjjjî¼óÎôôô÷ߟ›Ï>½Bâââ¸a¦òqï½÷ÖÕÕ œ>}zÛ¶mŸ~úéÀÀ@]]ݽ÷ÞKùì³ÏrssããㆱÛí½½½\B®¡AÆF@ÈØ?!j3Mêì‚èÛ¯!Pƒ½øhgòRÑŒæ~ ¨#–Æç CŸšTúõ>CÇD=xEŽˆãÇuvvÁeŽûSxù“—гlÙ²… ~ôÑG¿ûÝï–,Y²hÑ¢O>ù䨱c„´´´çž{î»ßýnBBÂ7ü®MüÏàDÖ„ñ IÞå--¡Ž þ—Õx‹NÜß((??ÿÂ… ###ãããcccª¦Z¶lÙÞ½{ï»ï>BÈ’%KöîÝ»lÙ2ö¿£££ccc[[[7nÜ({T~¦€:×LÉìwý>5mÛ¶mêÔ©qqqýýýìbÃÃÃëׯ·Ûí‡ãÙgŸ5ÁyÆ|uÄ0̾}û’’’ìv{QQÑðð°"Ò€q?£à ¹6¨e­ZµjõêÕv»½¢¢âðáê¦Z¶lÙ—_~¹xñbBÈ}÷Ýwýúu®­áСC›7oŽ_´hÑ‚ doÄýÿ¶û0G¾³2Óî!¯,S…¨)S¦9rdhh¨­­­¸¸˜[í<àr¹úûûwîÜ9þ|n~8©„fÏž}âĉëׯ—••­Y³F|ýùùù===쟻víZ¼x±ËåúꫯœNç#<ÂÎß¼yóŠ+º»»»ººØ¡˜dG‘ýu$¬#BÈòåË»ººÜn÷Ò¥K·lÙ";8ÚŸ+Ìqvâ_CJåw=ÊåË<¤G1Âq¡ˆPȰƒiõÛ`І™:”ª: yøÒq¸fü1™­Ÿ?PsffæoûÛÙ³gBÜnwNNNWW!$55õäÉ“3fÌ „\ºtiÖ¬Y²ãCÉx æ«#†a._¾ÌÕÑÂ… ÛÛÛåGûs…iÎNœ‚¿oËnšh(.¤s¸”%,çE`¼°&*Ækõ#C|ôÁÏdH6Dé Úðê8\3 <&s õój¾víZNNŽÍf‹ŒŒt8\ßþ®®®¬¬,v:;;[Z¨f¾:"„ðëÈívK-¼ÆÿŒ‚Å6üYWCÕ2e6c…;{†8Ó2zçèÐpV¦C¾)›úø™ )ô•޶ü„IFq4ë×ÀÑe¸æ@c2KYzzú§Ÿ~ššš*\çÇl¦~ ÓÔ‘O¿†E‹¹\.!:+Ly‚"þJ$ü/þ¼“糟 &¢à0©wó @?ýû5˜÷Î @„¾Ã5“YÊú7mÚ´aÆ+W®x<žóçϰó JKK{zzº»»KJJdçæ«#BHiiiww7[GkÖ¬‘=Ñö K6áð~è|¹GaL%q†èÚ@-´€Õ…>ăÂ|²ÁþùÎ;ï|ç;ß™0a‚Ýn_²dÉ¥K—øÿ+Ì|mmíâÅ‹oºé¦˜˜˜;ï¼ó_ÿõ_}V888XRR’˜˜ÁŸðàÁ¬¬¬èèè9sæüú׿~â‰'’““£¢¢îºë®ÿú¯ÿâçSd^¯÷ðáÃÓ§OŠŠºýöÛþóŸó³ç“Õ7ß|“së­·nß¾}hhHvéÔFÉN¢»½ÄåÃÔ›o¾9kÖ,›Í6gΜ?ü[­ÏV|&ä¥:zôèôéÓm6[VVÖË/¿ÒúÇÆÆöìÙ“‘‘uÇw9r„?88èt:ccc§Nºÿþpâ£È~ˆ:Ö!dß¾}ìïS8ÎÁÁÁÐ"òÍ"èr®0Ù9Êà4%œI$Ð<ïT+ï7ƒ&ü_‡‰lòB‡€ƒ9P±û½êûÛßþÓŸþ444´oß>öÏ@Ë{½Þ?þØf³-X°àêÕ«_}õÕ?ýÓ?B~þóŸó—¯®®þÓŸþ4>>üüüëׯ9r„ýóá‡æþÌÉÉ‘¸‰ßüæ7„¿û»¿ëêêêìì¼÷Þ{ù™ôÉðöíÛ;öõ×_ýõ×Ï?ÿÏÃä›üÎÒ/ûú .Dˆ€D8Xd4DÌP8^ûçþð‡œœBH|||dd$7vš°3Ò‚ jkkçÎKùâ‹/&Ož|ë­·655qËÿñœ3gŽp»ÿýßÿ=88Ga?]·ÙlÜFÅ7q÷ÝwÿÇüG}}ý]wÝE9sæÌüùó¹LŠôžŒŒœ:u*7$[¨¥S›ùº~©4>ˆù¥8‰¿°(-¡i¼Ó§R„«"z„×ÄCê±Ì¿²b¾h„JJoï_†º@¸‚2ñÉV%áD §&0 ýO~Û<Odd¤Èü ÛíöŸÕrÍìòcccßœÂg¾ß?¹­ˆo"..nppphh(&&†2<<>â> cò IDATæZLÊ&¤x衇^ýõâââžžn Râþ¦X~;8i³]m6dšÕ*ňУA"Ù¡ ó¾@wA:…FÃ0føŠoûÛ„ÚÚZ½61oÞ¯×k¼~ •••“&Mºýö۹㙚qöìÙ‹-Šýë¿þëãÇ?ýôÓ nT|ßûÞ÷>|õêÕ´´´{ï½·°°0ÐzÞ~ûíûï¿ÿ©§žš4iRaaáöíÛi(ÐFÞõW}-¡Ž@ wõuň¤D­ !á77àºÆâ‡çŽbƒ)™upéåÒelÈ@#ö‰ä'#•‚CªŠÂ±!QG>t?Wèž•ˆ ‰ûZéD‡=ÙøG–e%5‚`Ö+X Ã06½ó ö6Ý(Oqy¹5Vu~)þê¿BÍÞ+šlG5Yq´Çÿ(Õâp>јY÷7óíHƯÀLŽ?>gΜèèèÌÌ̃ró8™™=oÞ¼ÆÆFv&w¨ÊK僻9à,,,´Ûí‡ãÙgŸßÃ0ÕÕÕééé6›266¶mÛ¶©S§ÆÅÅô÷÷³‹ ¯_¿^¸N1}1 ³oß¾¤¤$»Ý^TT4<<¬@Ô¬Ð;GÊ0n¹|îÞðÑ€‚,~@Y¼øÚ0îÕ'T&+©!ÇkPîÇðºuë*++oܸQ[[[__Ïͯ©©9uêT___^^^qq±"©|°—Fþ5òÉ'ŸüòË/[[[ù?}hsuuu ì/°îÙ³çÌ™3 n·;&&fëÖ­Ü:{zzZ[[Ïž={âÄ !ÒéëˆR[[ÛØØØÒÒÒÙÙ¹cÇŽPCDJÆ| tg üS#’^^¥"© UW.e£æ¦÷ùI7zÞäKõ®vµH€aèR š¹w)¥“ÙJOO¯®®nkkóY[oo/;Ýßßo³Ù¸ùá¤ò›mþŸ)))W®\a§/_¾tsÜŸçÎc§»ºº’’’¸u^¾|™njj’%EöCÔQ :"„ðë(%%%PfDÐp®Ð7Ö¼°*UêðndŒD©È€‰átáµêUUÈÐq „ _€¼rß©¾óÎ;555wÞygzzúûï¿ÏÍŸOE(ø†‚6JÕ‘¼J®„Ð[mr‚w/"D‚ƒ¸ù@@@ˆžKªfp2 ‰QÂÅ0L„î]ø{ì1—ËõÇ?þ‘ò`XÁc=öÅ_tuumÞ¼9//Oï쀨#Ýå¯.,>wˆ›P XX®¡2ʵÃëõê?^CWW!döìÙºl]ƒÎ`^¹?s  ‰?ü>kÖ¬Ûn»mæÌ™7ß|ó®]»4Τ_ ¶î£ŽTBÕÍj™’òÒ =¤3Ê-#€ªpu‰Q¡ïÃ6weåßX o²…ÿû«_ýêoÿöocccããã¿ûÝﲿ3Ï:wî\~~þ´iÓ¢££srrŽ9"}[¿ûÝïî¹çž¸¸¸¸¸¸»ï¾û£>òÉC í¶¶¶>ôÐCIII6›Íápüþ÷¿W(H .ÊŸ?•â÷*¡GyÄív߸qã¿ø;L€âÙP|¦¡W¡RBBUÃ Íø§V44ˆCsX®ª²ÑÿÃ0ŒÎý¸ËçÆ:hÔöïßÿ³Ÿý¬¯¯oÇŽ}ôÑÚµkÙùõõõßþö·ÿó?ÿóW¿úÕ×_ýÖ[o½÷Þ{âÛâ|ôÑGK—.µÙlÿýßÿÝÒÒ½lÙ2~sƒÈv¿ÿýïÿë¿þ뫯¾Úßßÿ_ÿõ_ßûÞ÷¶oßr8Ààè?æ Gñ+êHq¸K‰°“ˆ@pÔ&ñöw‰ ÒÿUƒßñ###=ßeØé?üá999„þþþøøxnùÅ‹×ÔÔüÛ¿ýÛw¿û]‰ÛâæÜ}÷ÝÿñÿQ__×]wBΜ93þü»ï¾›í¡ ¾Ý¨¨(Çsâĉ{ï½×L;¨Ež"DŠj,1ͨOÔ‘²èŒ§J¹¢³°4C†`b¥SÆ%åÃÛïÿŠ'Ñå{‹þ7òÚ<Odd¤ðívûÀÀÀÀÀ@ll¬Ämqsââ⇆†bbb!ÃÃÃ&LˆºÝ»îºëóÏ?gWrë­·.X°`óæÍ)))ÊÄH?”ï¾ TR°NÐÔ¦^$QGJ¡6’hk ÚB‚ ˆ•Nzµ5(²%(ß[t¯Aб±1áLî_=~Ãh»o¿ýöÃ?ýÍ7ßt»Ýׯ_ÿÅ/~Á_ˆ"*Fù ŸÚïBQGá£ü}5¹òkåÊ•%%%ÝÝÝÝÝÝ·ß~{YY÷_µµµ---;vìàæ×ÕÕ544°½ÿöìÙsæÌ™††·Û³uëVv™'Ÿ|²§§§µµõìÙ³'Nœð»éÊÊÊsçÎ544477_½zUÍRh-è¥pݺu•••7nܨ­­­¯¯çÿ׻ᄏbÅŠ<öØcüùO<ñDGGÇåË—/]ºÔÚÚêw„>\^} Ç?׌0óçÏ'„<ûì³CCC/^üö·¿Í_F¸<ÎgŸ}6a„éÓ§Ÿ>}zdd¤©©iݺuÜ’S¦L!„\¸pÁoÚ?ü0""bÁ‚]]]÷Þ{oDDć~(e»÷ÝwßÑ£G{{{GFFŽ;F¹ûî»ÃŽîtß=´ä·°²#@ÃÁePš…u$›!B§x5(rbb"·¹Ë—/³ÓMMM)))ÜüŽŽ.IFFƹsçØé®®®¤¤$v:%%…ŸÜoÎSSS›ššT(‡—˪Jknn^µjU|||LLÌÒ¥KÝn7·Ågžy†íå±~ýú¡¡!nþ /¼––éõz=OEEEbbblll~~þ×_-žœodd¤¬¬lÊ”)'Nüñ¬Féè?¸@U9 hPÌ@—Bn"==½ººº­­Í'cû÷ïOIIùüóÏù3Ù‰äääK—.±Ó/^LNNnWíË«šwýï…¸téÒ’%KâââbbbæÏŸÏýhe å}æœ={öûßÿ>ûó“³gÏ~ûí·¹ÿúÉO~2iÒ$‘µ}øá‡wß}wlllllìÿú_ÿ‹khºÝ“'O>øàƒ‰‰‰‘‘‘IIIkÖ¬ioo',”Ð}÷Ð’²m ^ƒ<ÑFã ¡Žd0JÐϧJ¥>}úô=÷Üc·ÛÙõ³Ÿ‰²›óx<ìôèè¨Ífãæó“Ûl¶ÈÈÈÈÈȈˆ~rvØ#.¹ßœGFFŽŽŽ*^"ŽzûÉìÙ³Oœ8100pýúõ²²²5kÖp[\¾|yWW—Ûí^ºté–-[¸ùùùù===쟻víZ¼x±ËåúꫯœNç#<"žœïG?úÑ’%K®^½úÅ_”””¨Q:C_ ‹œ4(f K!7QWW·råÊ)S¦¤¥¥½÷Þ{Üÿfgg?ñÄ>¹õ»Nîêì³]U/¯>hÞa(ÍP‚æ}W A[²ä­ÐR1 ‡.áB…ÄXá2D[Cjjê[o½õå—_Ž_¿~'Ä“ššÊÍç'OKKs¹\~Wkâ~ | v ”œOƒ·U:Ä@ 9 hPÌ@—Báv;æp8¸ÿu¹\3fÌØ¿??·ìDrr2 W >jwBã5˜†—7.†Á—÷@«Ô‘D:Ö‘¹ FGGÇÆÆ¶¶¶nܸ‘ÿ_¥¥¥ì8%%%kÖ¬ñ›|Ó¦M6l¸råŠÇã9þ|AA;¿   ´´´§§‡MÎ-ÏßÉ }ôÑööö¾¾>þ2ôûì³ÏrssããㆱÛí½½½Üeee±ÙÙÙn·››?mÚ4núÚµk999l—‡ÃÁÇ)’œÓÙÙ™­lq@ .…œüüü .ŒŒŒŒóŽ 55õ“O>yíµ×öîÝ+LRVVÆ­3??ŸoŽË«â"p{  *®aàiÖŸ'X]bQGâh¨#y¼Ê άÞpÙ‡Ú¼ys||ü¢E‹,XÀÿ¯ÜÜܹsçfee9ŽÊÊJ¿É+**rss/^·víÚÕ«W³ówîÜ™˜˜˜‘‘1wîÜ… úMûÔSOÝvÛm999ÙÙÙÜ3¶!<øàƒ<òH{{;Û„_/---ìDss³Ãáð›|Ú´i­­­gllÌëõŽKO>mÚ´ææfÅJ`IÚüRcÐKáªU«V¯^m·Û+**>Ìÿ¯äää“'O¾ñÆ»wïæÏ¯ªªJJJš1cÆÌ™3SSS}þ—eÜË«²¼^/^RʲU >EV6xˆ „ž} u=u¥aíO†Êþ¾·.¿®^ЦL™òꫯ._¾¼££cÛ¶mìÀLìW¬Xñ³ŸýŒRXX˜““óÌ3ÏAñ÷ìÙóûßÿþŸÿùŸ333›ššž~úé_þò—“oß¾½¾¾þµ×^‹ê©§^|ñEÅKgÁ+/ðYá$`…2j†æ`Fë%€¡áp¢-&´å‡ˆ È ê­JA¤$ÇÛ*)]^t€ÐÜN¦’@ýLp°ø¼±W¶8ÜU‡ªD‘À¢_ƒŒ-Í÷ç0‹IÉy§‹³ÂIÀ eÔ µÁdã5|ƒß¼ÍqŒø¼Æ±OÔøPö¦Â[01¯×‹ß¡ø† |FDG‹Íð@¨ìçZÂx þ ¿80Óc9Z¨‚à« ×8ë³®±«(…aôkøŸ'máÇNü'@þ´iîG•jq ö;1cAM)œc øÌqU}ë­·’’’LùɶŒ×ð‘ -x8 ƒ¾mÍPjsÜ-Ñ–°&•®ªâ ȾnÙ²å½÷Þó;Hœ™`¼€ÿ!ý•²Y_>£ÅA_fݯ(Aaxåe‰ž‚8N—ËEq¹\N§SÁ5›£´¤øUU½Ë!¤½½ý;ßùNÐ<˜Ækø8Z4‡ðšÉñãÇçÌ™™™yðàAnþ233£££çÍ›×ØØÈÎäª^^*¡–––¼¼¼›nºi„ Ë–-ëîîæ’ìÛ·/))Én· só«««ÓÓÓm6!dlllÛ¶mS§N‹‹+((èïïg^¿~½Ýnw8Ï>û,—ªªªòòrBÈã?^UUnì$0Gmù –¾WÕ —96-ÿVyhhhÆ 7nò»fö÷•#""¸5ø,èŠl8¯à‚67X¤=-³È~¥/ z*®[·®²²òƵµµõõõÜüšššS§Nõõõååå+’JhåÊ•%%%ÝÝÝÝÝÝ·ß~{YY÷_µµµ---;vìàæ×ÕÕ544x<BÈž={Μ9ÓÐÐàv»cbb¶nÝÊ.óä“Oöôô´¶¶ž={öĉü-ºIR z‚XоWUì2Ç^_ø÷ÌO<ñDGGÇåË—/]ºÔÚÚº}ûv‰ }º"˜Àkî8Rø‚FÀ²‘ Ÿ•÷+]„m)iÓÓÓ«««ÛÚÚ|ööö²Óýýý6››N*qýýý‰‰‰\’Ë—/³ÓMMM)))ÜüŽŽ.IFFƹsçØé®®®¤¤$v:%%…ŸœË@aaáÕ«W !mmm………Âø !äþá\.—HXpZ°8+œ迪½Ì “'''_ºt‰¾xñbrrr •ó^»;èŠ,²6jwÜé‚Ëîhhð! G6„NcaÛ’—JhöìÙ'Nœ¸~ýzYYÙš5k¸$Ë—/ïêêr»ÝK—.ݲe 7???¿§§‡ýs×®]‹/v¹\_}õ•Óé|ä‘GÄ“»\®ïÿû\>E‚3€ÅYá$ ¥Œú^U¥,àó¿>WLî‚+žP˜™@Wd‘µQ»ÃPš- Íû®ÚÐÖ ä7Ž<ˆ›. »ô´ÇŽs8\*Ÿ•ø/;'55õ­·ÞúòË/ÇÇǯ_¿ÎOÂšêwUiii~€SSSýökŠ —HÜLÙ$Pr)¯È¸5àä`eV8 „TF]®ªRø$ONNö{þO(ÌL +²ÈÚèÜa!¯À?¯àÑZ¯œÐƒ;q â ŸŸáÂ…‘‘‘ñññ±±1US FGGÇÆÆ¶¶¶nܸ‘ÿ_¥¥¥ì8%%%kÖ¬ñ›|Ó¦M6l¸råŠÇã9þ|AA;¿   ´´´§§‡M.=?Þ¿ Á?oøxçwjjjî¼óÎôôô÷ߟ›?yòdv"..ŽN"üTBŸ}öYnnn||<Ã0v»½··—û¯¬¬,v";;Ûívsó§M›ÆM_»v-''‡}ûäp8¸Á8%ýõ×ÓÒÒ!éé鯿þzÐìXœ¾WU)&NœÈ¶Âs›.++㮘ùùùòVèŠl`:5ví°{à çp hz 'òAÓ¾ù曳fͲÙlsæÌùðùT>+ñ™—JèèÑ£Ó§O·ÙlYYY/¿ü2?ɾ}ûØáœNçàà ßUíÙ³‡ïàŽ;î8rä;ppÐétÆÆÆN:uÿþý!EOz´ÍÔ$Prép~°8+œ¤”Qß«ªUUUñññÜJ‹‹‹o¾ùæ›o¾¹¸¸˜»à ñ·+ÌL +²ÈÚ¨Ýa.sR›%ÀJØ×Úïxa>mj_S8H§×‘$Œà´ÖØžº¬-hÄòóóŸ|òÉ3füîw¿[¿~=Û5ÀgÜŸÜ„¼TBS¦LyõÕW—/_ÞÑѱmÛ¶·ß~›K²bÅŠŸýìg„œœœgžyF¸ª={öüþ÷¿ÿçþçÌÌ̦¦¦§Ÿ~ú—¿ü¥Hré º§€R¬p°B5Cs0#Ø&½³tÞ6F@ï™öQEÝIDó%@K«V­Z½zµÝn¯¨¨8|ø°ª©„:´yóæøøøE‹-X°€ÿ_¹¹¹sçÎÍÊÊr8•••~“WTTäææ.^¼8..níÚµ«W¯)9€¹1ʾîÐ îÔ5£v¨Å±¡Mlù{ú8H„3˜¾¸Õ¸]„G·H–hî×@§0#~À 7PŠNT•QÊU5¤+¯" ¥£*˜| ÃØ¨ÍœcåüÂs©Ú%Õ;äù-F<±h‘Ñ×ë5zœöew6ìº`2R.m²/V¾nz½^›ÞyËA+ƒ^´i @‹˜ÛNaÐ.z¡!\¼VR N›`6#^Ïp%6®pz/ƒ"|ÚÂì*LT%ZüB((&«Ñ²'v*BÃ0zç, ôàª@ÕÎäü¡g1r$˜ƒptð+Ð`. Í‘ÒÉ»¸à’¤¥#>ñ·3 ´Ñ¦¹ Åá/ða2–Ý“¥@p@/*µA(riÓf+”ðz½è×Z@C4kn hqÊ„ó¾]ËLj|NøèÚ š#!ïD*’Êétº\.BˆËår:²3&¾SŠ0b<¨ h¦ñS“e[ða2hnDä„X‰@pD?~|Μ9ÑÑÑ™™™äæ8p 333::zÞ¼yìLîŒ*/•PUUUyy9!äñǯªªò» Ã0ûöíKJJ²ÛíEEEÃÃÃÜüêêêôôt›ÍÆß Ã0Âlp#™ã¢€ñ@;xÊ¢–¼ª çáÙ²-`&hn ÔЀX‰C‹<€¸uëÖUVVÞ¸q£¶¶¶¾¾ž›_SSsêÔ©¾¾¾¼¼¼ââbERùÅï<ÚÚÚÆÆÆ–––ÎÎÎ;vpóëêê<ÏòÂlpýMs9Àå Ä„ÿ2¯s"ÔšRªf­ð¨8 ¨¥Ô).Ì•˜CÐP V~!,àà · ¡–1##£¬¬ìþûïOOO篤··wòäÉ„„„„ÑÑQÂû5y©„œNçîÝ»ÓÓÓÛÚÚvìØñúë¯û-ÑåË—g̘A¹téÒÂ… ÛÛÛÙùÓ¦Mãã>- 5мÃà bÐÖ`zµ5ðׯ2ßÞ‚£€ZŠT¹÷^)¤GÏÕ>²ÂmC¨e¬¯¯ß½{÷éÓ§ccc_z饼¼<"x,ç?ƳòR‰äYd†a<Odd$!ÄãñÄÆÆúm;´9éÙð»iBëcÈ_§9 &f¨ÍTSÎfR}©Q¹¦|f3ÓQ`> >é™rï JF©ñtÍA(À/+Ü9È.ãñãÇ‹ŠŠ:;;I(ëòR…ħ_âE‹Øá$­ÜÖ€ñd¢ðx6ŒãSð@î½V ,»ô˜ó×`5>ÑÓ73ôËÏÏ¿páÂÈÈÈøøøØØ˜ª©d+--íîîîîî.))Y³f¼•Lœ8±©©IÙŒé(ˆ{3 ˜ab ­ml,Æß评±±±mÛ¶M:5..®   ¿¿Ÿø–›Ú°aCBBBBBÂÆ‡††„Û-//OLLœ4iÒóÏ?¯EñdáÚSƒ.©jåš©Åò£gµË“¼òšé•ì6+[µjÕêÕ«ív{EEÅáÇUM%[nnîܹs³²²Gee¥¼•üð‡?¼ë®»Ìqeôz½hV1á<)Qþ”Å0Ì<ð /ÜrË-Ï=÷Ü|PWWGÙ½{wmmí¡C‡{ì1»Ýþ“Ÿü„îéT^^~ñâÅC‡y½ÞüÇü«¿ú«çž{Îg[O<ñÄ™3gþå_þ%>>~çÎÕÕÕ44kM³Êe Þ/ò£ˆaû±›f×2ÇíT¨LPq ÓœáE˜¯ŒŒ~ŸWÓLC~sNs@MÆÜm ~GÍÌÌüío;{ölBˆÛíÎÉÉéêê"ÛRRRNž<9sæLBHSSÓÂ… ¯]»æ³­´´´ššš[o½U«ÂÉG[[s,j÷(!Ê஦ —á ¬Óâ`¦Z•˜ï$/d¾2¢­AˆÑ1(á 6 .êGñ IDATæcî¶¿mQQQì„×ëgf||\dy›Í6<<,u–Ïf³ Ùl6õ‹.:ÛøeQ»_ñQ~Çp5e¸ ëËp§°8+œä©-£°í[˜I¿Ë ­AˆaŒ×ð Ó¦MkmmõxÆÆŽAѶc a×’C£ÿz¾p14KeÔî0¯ Î>8GJ°k‰CC€É»ý šŠ’»JƒÂx `”´8àš*¡ö­=ðÝ€eÉ;틤r:.—‹âr¹œN§ìŒYÆk€PþÀCI‹µñÆú5 ðß›0™ãÇÏ™3':::33óàÁƒÜüdffFGGÏ›7¯±±‘É]䥪ªª*//'„<þøãUUU~—afß¾}IIIv»½¨¨hxx˜ßÒÒ’——wÓM7M˜0aÙ²eÝÝÝÜòÕÕÕééé6›-PVÇÆÆ¶mÛ6uêÔ¸¸¸‚‚‚þþþG †aЯ̆ÿ¤¡^‹ƒpµxL•PÞÆ§;tg0ŸuëÖUVVÞ¸q£¶¶¶¾¾ž›_SSsêÔ©¾¾¾¼¼¼ââbERùÅ^\ÄïîjkkZ:;;wìØÁÎ\¹reIIIwwwww÷í·ß^VVÆ-_WW×ÐÐàñxeuÏž=gΜihhp»Ý111[·n•’Ujáò b06¤Õ­8cÕ¬ÏåAÙl Ca¬à€¬t抴 >+ÜNH)cFFFYYÙý÷ߟžžÎOØÛÛ;yòdBÈÀÀ@BBÂèè(áþ(/•Óéܽ{wzzz[[ÛŽ;^ýu¿¥¸|ùòŒ3!—.]Z¸pa{{»Ï2™™™l׆a:::¦M›&RÀÌÌÌßþö·³gÏ&„¸Ýœ®®.‘(ºwÜÁ€íÛ4]VJ­Õ8&kk`©ÔâàóˆBs p§0K”ÀA¦d…Ó¾”2Ö××ïÞ½ûôéÓ±±±/½ôR^^ÜsròR‰äSü®ØãñDFFB<Oll,Û„ñÙgŸmÙ²¥¡¡ý‚a˜ññqáÚüf5**Š]ÆëõŽsiÅ3IhÝaô”’怚 =m AõPS¡­!ÐæHàŠ3ô½Œ‡ {U8/™mõhèƒN=èÎ&FÛ•H !•ñøñãEEE$”Vy©B-¿_âE‹Øá$ÓÒÒž{î¹ï~÷» 7nÜHHHß?«éééŸ~úijjjHÙ Tî0¯ CñÑeA6ƒFÕgÄ8‰ã8H\#5˜#Dô S †°‚üüü .ŒŒŒŒ©šJ¶ÒÒRv\†’’’5kÖ°3£££ccc[[[7nÜRV7mÚ´aÆ+W®x<žóçϨ]UEñ.·æ ï貜úúúÔÔÔ—^z‰2<<¼~ýz»Ýîp8ž}öYn™ÑÑÑòòòÄÄÄI“&=ÿüó!•(Ðp² ÃøÍs <ø ]hµ>Y={öìŒ3¸ãÅëõNŸ>=hLLLF‹CHgHF@fF(~S¡#tô°ˆU«V­^½Ún·WTT>|XÕT²åææÎ;7++ËápTVV²3:´yóæøøøE‹-X° ¤¬VTTäææ.^¼8..níÚµ«W¯V»êùÿWj/€?²w) §L™räÈ‘¡¡¡¶¶¶ââb.á<àr¹úûûwîÜ9þ|n~8©üæÐëõþêW¿JLLüÍo~ÃÎܼyóŠ+º»»»ºº–.]Ê%ÿÑ~´dÉ’«W¯~ñÅ%%%!•h×®]‹/v¹\_}õ•Óé|ä‘GÄó(„üüüžžñÕ ³ú­o}«¦¦†ýßÿ÷¿óÎ;E*E¼âLvºžEš<ÐI ‡’ºÃ^äGX„Ntæ(#%E 9˜úŽ.^õhFÕñô]–a˜ýû÷¿øâ‹G7o;355õäÉ“ÜgW³fÍb“§¥¥ÕÔÔÜzë­â¥i8Ù@y”Ÿ¡k­V˜ÕŸüä'Ÿ~úé/ùKBH~~þ=÷Üó¿ÿ÷ÿT)ã5˜ìÐÇAü›ð }L(K¡aW§!ô@w°+œÿÍQFFv#“¡$@¡¢6 æN¨ƒ¦ÕwtY†a²³³óó󫪪¸™6›mxx˜N– Öf³ ±/ˆi8Ù@y”Ÿå­V˜Õ/¿ü2++«¹¹ÙëõΘ1£¥¥eâĉРRkæ¾×÷Ûâ >œ¤x[ƒ)£dº_eÌ}¸… ÑKÑý¤ªÊ(¼£“ò†ÉëõRò(MU0ù\¿Aœªm ]F—eÆårýÝßýÝÆ7oÞÌÎLKKûøãe÷kð›·@ÃÉÊs <ø,hµ~³úÐCýíßþ­×ë­¯¯ÿÅ/~!’ó m æ>W„ÔU!ÐÂæ‘Eè¾·ëžJà÷&À‚¬p °B5Cs0ñ; ÝG—MMMýä“O^{íµ½{÷²s JKK{zzØád¹% }ôÑööö¾¾>þ|)y u8Ù@yðhµ~³ZTTô/ÿò/¯½öZQQ‘„ÀXûi™ÈønÂ"üvlÑ Í7 ZÂïMZ„/áÝÝh]699ùäÉ“o¼ñÆîÝ» !;wîLLLÌÈȘ;wîÂ… ¹Åžzê©Ûn»-''';;;+++¤¼…:œl <ø´Z¿Y½ï¾û®_¿þõ×_‹¬8²ÏІ;—P ý. ã5@Ú|Cô°ø7)c1 w·¹éõ¬k©Í/½Ž,£¿Ã0â>cô˜ËcÄšYáBfå=ÃôÉ7(jw†alÔfN„±r `FgΜèèèÌÌ̃ró8™™=oÞ¼ÆÆFv&wÉK%TUUU^^NyüñÇ«ªªü.Ã%g&Ðú÷íÛ—””d·Û‹ŠŠ†‡‡ýn—ý“û×'†að; "ïÔ!j¼W t¢Þi™Hß@ÈoÍMƒï&„O¼*mˆ*ü’j Z3æòè[S”[·n]eeå7jkkëëë¹ù555§NêëëËËË+..V$•_ü&€ ­¿¶¶¶±±±¥¥¥³³sÇŽ"k`Ϧ9mbœgþó'z…xM…Zšu‡C0îþ ñ‡EÆ Nø´Ù14hË ŸÆA@ÌeCè€X㊠½Œeee÷ßzz:?yooïäÉ“ ! £££„7Ò¼TBì7ééémmm;vìðû —\dý—/_ž1c!äÒ¥K .loon—¿žjŸæg4£È¾Kó,ŒûT j3辡ÍÌ‚çImž©ðäÆÑ,ˆy˜@°ÂAzëëëwïÞ}úôéØØØ—^z)//HxJ——J$·" Z¾Ç㉌Œ$„x<žØØX¿mælk 3[âh¨É(ØÖþz@%A+Hún€º†  ·“hpűàE ºÐæsµ7a£ÅYᢠ£ŒÇ/**êìì$¡<¥ËKjY‚¶5ðû5,Z´ÈårB¢¢¢¾úê«ØØXBÈŸÿüç)S¦˜¬­ã5€ø_!ê›Rð†÷F N>¬ŸÏøUÝ[1µ>Ä\)8Opòóó/\¸0222>>>66¦j*õ”––vwwwww—””¬Y³†™““óì³Ï \»vmÓ¦MÜÂ'NljjÒ)§ ‹0â 4¦-Ã:pÕ¤@Æ:!p/4ØŠéi6X ÎH¨wô!æÊ2Öy@=«V­Z½zµÝn¯¨¨8|ø°ª©Ô“››;wîܬ¬,‡ÃQYYÉÎ|õÕWßÿý„„„ï|ç;÷Þ{/·ðøÃ»îºËǾ×ëÅ…Ä(Û'7"T‘^AwÔ,È` ÝF½Þ‰ B˜4­ƒÚ¥”P#>ˆ¹Uk²B½[¡Œœ0¿Ñ²~Bk0#ŒØGÀˆ}1€ ‘ž&hhÝî„ ^>Mì ¡6Š÷ÖAÌU¢M¿*50 cÓ;`-^¯—áýJ-îK´§ÒM?ªdàN”S)Ÿ9 ¢9’¨ÿR ´z01á…^x¼KYølF¼×1VnÁ¿‘Þˆ»Ÿq©ÑÊ€„0±ñ¼ƒ7D#K˜4îÎÀߨÕv'<ôtŒ¹¼üë„cÙ“$€Æ¤bòC˼^¯ý@ÂІeÏw ’rχûBSR¼ZM¼“ ;h÷ý4Ãx  '#î~Æ¥x´ñþaˆ’Õ8vLL¯†UGñ¬®®NOO·Ùl„±±±mÛ¶M:5..®   ¿¿Ÿ]¬¥¥%//鍊nš0a²e˺»»…ëÙ»wï-·Üâp8Þÿý½{÷Nž<Ùáp|ôÑGÂŽŽŽ–——'&&Nš4éùçŸW¼PŠz*Åœa˜}ûö%%%Ùíö¢¢¢ááan>¿"¸Ì3 sàÀÌÌÌèèèyóæ566²óýÆŸÊïV‚Ö#ŸÚÕD r’ðÁ0L„ÞyøŸg`š(«"dT ZÔcÊ#‹ÿ2Àd¬««khhðx<„={öœ9s¦¡¡ÁívÇÄÄlݺ•]fåÊ•%%%ì¨ß~ûíeeeÂõ¸Ýn—ËõôÓO¯]»Öív_½zõé§Ÿ.//.YYYyîܹ†††æææ«W¯ªZ: ÕÖÖ666¶´´tvvîØ±ƒ›Ï¯¾šššS§Nõõõååå³3ƒÆÐïV¤Ô#ÇâÕ #y p†h¶3D&C ó3Ð »˲NjHy­ >®àuuu)))/¾ø¢×ër:qqqIIIû÷ïç–)++›2eÊĉüã ×t‹0Ä¥H& QRyt?Iª·uBHGG÷gFFƹsçØé®®®¤¤$a’þþþÄÄD.97ñç?ÿÙëõ ñ§###…kHMMmjjR´¾Â˜J1'„\¾|™njjJIIáæó+‚ØÞÞ^vº¿¿ßf³±Ó~cÈOåw+|~ë‘Oƒjòšú¼BV¨n¥®§!Í'•”Ò¶hÞaЯ 8ï7›ÌÖÖ²¼ûî»+V¬8pàÀc=FyòÉ'{zzZ[[Ïž={âÄ n± ¯¼ðN ÌÁ¬Ý8Ó¦M㦯]»–““c³Ù"##×Çþ³Ï>ËÍÍgÆn·÷öö ×sË-·BbbbøÓcccÂ%;;;³³³Õ(‹!dee±ÙÙÙn·››Ï¯¾É“'³qqq\¯‡ 1ô»)õȱx5PHÞeH$•Óét¹\„—Ëåt:egÌŠômêǸ97„šÃ…ÂÐÇN¨DJj Böïߟ’’òùçŸs3SRRøïǸà}å¥Í;1úb ?“†(f¨è¹©P/>«MKKs¹\ÂÅRSSßzë­/¿ür||üúõë„÷þ\¸ž@Óüµ¡_ƒ×ëmjjJMMåæû,&>?¤~ ÜV‚Ö#ú5€â¬PÝ¡–ñرc³gÏŽŠŠÊÈÈxå•W¸•üô§?ÍÈÈˆŠŠúÖ·¾uöìYn~8©„\.׃>Hù‡ø¿'6ù /¼––ÆöSóx<‰‰‰±±±ùùù_ý5»XssóªU«âããcbb–.]êv»ÙùºÇJAíCA¿€ÐxÿrHcŒR+;pà€Óéœ7o7§««‹ÿ~Œ›ô•Þ‰ˆ7¼ÚLyÆàwgð~³ÝÁÄ6mÚ´aÆ+W®x<žóçϰ󣣣ccc[[[7nÜ(cÍü¤°°ðÑGmooïëë+))Q&ëÆQZZÊŽ˜PRR²fÍy+ C¿[ Z¨&­[·®²²òƵµµõõõÜ|¿µ„™Ê/)¿ΰ>ºÇš„ž-@1ì|>Ñ0ýá#^:s—]!Äår͘1cÿþýÜÌÔÔTôk‡Qö¨pòi”2JDÛ]„ª9ñYóØØØž={Ø×bwÜqÇ‘#GØùG>}ºÍfËÊÊzùå—‰à}¸ÏED8ÍŸ922RRRrË-·Lš4é…^P¡XáM½˜BöíÛÇþÒ‡Óéäæû,&>ßo ù©ün%¤zÔ š¼¦;{€8+Tw¨eLOO¯®®nkkóY‰ßZ¸5ËK%TXXÈ~åÚÖÖVXX¨Dá ë¨{¬4ï0&ÿº„Ÿ!àFÃÜß'‹×¾•÷ †a¼^oGGÇÂ… ·mÛFÙºuëùóç:äõz ÿíßþ ÎöíÛëëë_{íµøøø§žzêÅ_äÖÀ®Íïd”=Jv>Mvº °8FÙ…¨fÐTý‘Q ªR›­(»·¥X¤ºC*f}}ýîÝ»OŸ>ûÒK/åååÁ!ÌýÉMÈK%’a‘|þ7**Êû—ö‹ññq†aÆÇÇ !Ÿ}öÙ–-[ØKææÛl¶áááÈÈHBˆÇãá’KAóÁ69èРï:舿ïqÇŽÕvHšOjšINN>yòäo¼±{÷nBÈÎ;322æÎ»páBn±§žzê¶ÛnËÉÉÉÎÎæ>²à ºP…»# '¹ÑQØÐ&6þü£Göôô¼òÊ+?øÁTMHH—¼iÓ¦µ¶¶z<ž±±1¶¹ÿàƒ>òÈ#íííìp0Ü:§M›ÖÒÒÂN777‡™UJ0 ƒñ¤ò{Šá77X­ÅÁ²¸Jw8.\xòÉ' !&L8tèÐÀÀ€ÛíÞ¼y3·LTTTuuõŸÿüç/¾ø¢´´Ôg “1MóÿDg‚â€!äçç_¸paddd||Üï÷(˜J¡ëSPPPZZÚÓÓãeVUaÄ$#öÅãï†;š@ ìÖt¡Í†ÝÀ(V­Zµzõj»Ý^QQqøðaUS)¢¢¢"77wñâÅqqqk×®]½z5;ÿСC›7oŽ_´hÑ‚ ¸åu54Œ×A˜æ]œRÄ_è™éukk§ )·Æ*Z ôŸßÌgQ;^ø@¨-Å"Õm‘bj€æHb¼€ˆ,øž|˜àT€ï& T¯@aøžÀ B!Ò¸èVønBÞ¹Zû3¼™®)F‰¹JLS€p„9Ö²JyËh†æN ã5„JÊ™Í @Œ°xw£?Ó“éôй¾umÄš0+¯€¼e€âõzѯ@hnðK÷{w)«B•²Œx‚ï&ˆÜ‚Ó.§Óér¹!.—Ëétêès½¶kÜšP] „òN ã5¨Ç¸Ã7hæR¯ ¢ººÚápDDÐÕ®Îþáp8^|ñEó2½C¢ÿ 7qüøñ9sæDGGgffb¨ªª*//'„<þøãUUUaLºÇ|ß¾}IIIv»½¨¨hxx˜›Ï¯ n ÃøÝÄèèhyyybbâ¤I“žþyŸíÚJЪ¤ª¦”…ñäÞ ‹á$RïÒ®]»~ýë_kü£Êª{ï½÷vîÜ©wF@ŒAwÓwgX·n]eeå7jkkëëë¹ù555§NêëëËËË+..V$•_uuu ‡²gÏž3gÎ444¸Ý˜­[·²Ë¬\¹²¤¤¤»»»»»ûöÛo/++®Çív»\®§Ÿ~zíÚµn·ûêÕ«O?ý4ûÔÊb둆ýP÷˜×ÖÖ666¶´´tvvîØ±ƒ›Ï¯ >¿›¨¬¬ûÃÀÀÀºuë„YIJ?óÌ3ì[Óõë× qó_xá…´´´ÈÈH¯×;88X\\|óÍ7ß|óÍ6l)¾Ç㩨¨HLLŒÍÏÏÿúë¯E²*¿a Z(ªˆäÙ¸Å1\¶9R2Ÿžž^]]ÝÖÖæ“°··—îïï·ÙlÜüpRùÍaGG÷gFFƹsçØé®®®¤¤$a’þþþÄÄDŸ5Bþüç?{½Þ¡¡!þ4{D{½ÞÂÂBöy¸­­­°°0p<ÂÝQ óË—/³ÓMMM)))Ü|~]ðcëw©©©MMM•‹o…ÏoUjVS`,V«n£_}ta” #— ìÈ8Â…O˜Ô šI)¥˜2eÊ‘#G†††ÚÚÚŠ‹‹¹„<ð€Ëåêïïß¹sçüùó¹ùᤠd||ÜgöÏ_ýêW‰‰‰¿ùÍoØ™›7o^±bEwwwWW×Ò¥K¹$?úÑ–,YrõêÕ/¾ø¢¤¤D¸þÙ³gŸ8qb``àúõëeeekÖ¬)…0œòòò•+Wvww»Ýîï}ï{âÑàÖ0>>.^|BÈòåË»ººÜn÷Ò¥K·lÙÂÍÏÏÏïééaÿ,++[¾|¹Ûíîêêºï¾ûÊËËEŠ¿k׮ŋ»\®¯¾úÊét>òÈ#"Y ŸÜÒhùͶQŽt>#æY(hêêêV®\9eÊ”´´´÷Þ{K峟 y©üfÿ§Íf‹ŒŒŒŒŒd?òb†úôé{î¹Çn·³ÅáæûÝD iñœð— ³Òé¹Çãa§GGG5OZ÷gddäèè¨påâ[ Z•AóÏ_Æè‡'HgÁê6Ç5H3 —²(d”àšB-B^p qvšC)EÐ÷]–×ëûõ¯œœì³ªýû÷§¤¤|þùçÜÌ””þ+)nµ~_dÂgå·>Ùàÿ™’’råÊvúòåËâÑ`9Ž£Gމd‰H{¡—œœ|éÒ%vúâÅ‹\Äü?ЛX¿Y ŸÜR~\øå7ÛÆ* áÑ;/á’^ŠcÇŽ9.•ÏJüΗJ¸ +--Íår KMM}ë­·¾üòËñññëׯ ×,±­A Ú8zÅœLMM iUâ—~*¿[ Z•ҙ㉬Yݦ¹©Í@"„`¼MyÿrŽ öË4¥¾þzçwjjjî¼óÎôôô÷ߟ›?yòdv"..Nø¡¬¼T~EFFæåå GÛ:pà€Óéœ7o7§««+++‹ÎÎÎææwvvòÿúì³ÏrssããㆱÛí½½½â¥¤««+33“æ&Ä×SUUµjÕªÈÈHñ5óËåv»¹ùÓ¦Mã¦Ýn7WÌéÓ§s£—ù-þµk×rrrØ÷±‡ƒ[ØoVCƒqñg#}?iêa ýÊÏÏ¿páÂÈÈÈøø¸ôa\ä¥ jÓ¦M6l¸råŠÇã9þ|AA;pp0:::66¶µµuãÆJmN/ºÇ¼´´”1¡¤¤dÍš5òVRXXøè£¶··÷õõ•””H܊ɪ@Uôß!ÓÀ¨c*éÖÜtÃî!Nv|h>ô¤d,¤Ìëò.Ëëõz<žwÞy‡{¿Ä%q¹\3fÌØ¿?7355U^¿†@ï¬ü–ÂoXÉÉÉ~û5ˆ¬'99ùÝwßåzíúE¤½ÐKNNöÛýÁoñ½‰Éj ™ÂÜÒyDå“s„æ‘Ýf³eee½üòËÂ5ûìoÖ/Eø;ý1ß·o;lÓé䯣‘¸*îÏ‘‘‘’’’[n¹eÒ¤I/¼ð‚0•ß­­JéLv¨‚8+W·ù.L 2bpŒ—cÐvqáćð(›«0)ÕÖððß?~xxøƒ>ˆåó'7!/U ìÛ0aÚk׮͚5kÏž=ìÌ-[¶°ã5°ãpIžxâ‰%K–¸\®/¿üò±ö–Þí IDATÇntòäÉï¾ûîÐÐPssóC=$½'N¼xñ"÷gYYÙÊ•+{zzº»»W®\)¾nmRÆkX±b…Ûíf˵uëV¿qã±téÒþð‡"Åúé§—.]zùòåÑÑÑsçÎåçç‹dU$ÿ~sKÛ± ?çF)µçŸ0™¯DjÓ ­A_ÚäMƒ­PgP–ū۬W¨p7&Ë.ˈ6(„ZœRwiTY©¶}ße öù³³³ó¶ÛnÛµk—×ët:±±±S§Nõù ‘YÞÀfl–¢ªª*>>ž›Óßß¿víZ6{÷YOHe—òBÿ;ÅÅÅüß¡?ЛX¿YÉ¿ßÜRu „„|“ÞÙ Â(ù”Á¬åRÚŒ²Êã ÊBu{üt­,CÇÂxõ±!Äh_ÃBTø!¢íË+)%2ÐŽ1iÒ¤>úè®»îRêó?v qõ^¼xqùòåÍÍÍðz½uuuË–-ûâ‹/Ù"% ´S ñ÷.Ê‹@Û Gq”ìHÂŽîYR*V4Ç\›Ó Ú[¡$ Ô8c7° º30 Á0Œáj‘k)0ng¦á`4ßåmûöíßûÞ÷‚Ž¡(ìàˆ'|ì±Ç¾øâ‹®®®Í›7çåå‰,ù÷ÿ÷Û·o—— °,þÆLÇ8ü¾ÞUù¹6‘Gý¨çOCGÀëõâ¶ĘïÉSq †ˆ†Ç‰Å¡jÇ0Äûàþïÿý¿»víøû¿ÿûW^y…ýÂB:_è)…ªJÊóOÃéE3”×%”b®ÄÖ‚Pé`FºåàÔ B-…™šŒØÖæ`èJ÷#W„¾ïPŠ¡÷%Í ­Á([ B¥ƒ90 ¡wàÿãO¡oNÀø Ö¹mýŸñ¨p Lñ'Ä\%xæCÃx ÊPê8Òqøà hÀ ê ¢¹·…6¨ªz¨Ä\A&š×ëE¿€p)~ÏoMÓþVò%2Ðù0€a ÑG,õv Ä\Y?„À"ŒØGÀˆ}1B…û6£à_Fu?`­ùÝ„N¡Bj?¾"æJAC˜ÆkP†Jݧqß@3Ÿ“†§<¢ðáʧ;˜‡G1˜Æk ··ñP°J®GønÂ/<ú²´Ü7ópà(Ó0Ìx AŸ²ðæ¦Á­Ž €ˆŒ¯ýÑ„ï&Dè8à. ti„²xÌåAs!˜Í@§3îÆŽÚA¿ÁÊØ=“aõ¾ƒe÷võ6Ap M Kwœê’¿ðo¬ó#‚ü]QûòZ3æòè[S*aƦw$áß½ '¸e´Î€¶øÍ D×}^í†CÐ}ÿÇ#JH„O¿V ïŽa͘˃CÌÇã5ÐLÕJߟÃìÐӬϾ›Ç:ᢧ¤ôä„Nˆ˜’×ë5F¿¬c*ÎÑ@ͺOkó=ÈÆ¯—@Ó`t:V%º3„O›¸éÞ*ÚÇ`ôÆT#R¶wnˆ$Òý`AwÁÀRzñé´‹ƒ@{ Ããw(X®¸~m4ëÝ€ŸÃ¤ÿ¤hLL½'L iP8Ek­ ôÀx JÒk¬o‚{Yõ騩¿‡gP8Ek­ Tñz½Fê×@üÝ`áB Ë½,úƒ‚tÿ0A ÷v|7ah¨2µ¡•€N¯@aº<„ó›ðü ‰WLÏèÎ`hœU Z¨e°ñXøøÀ/Ù?‡)û•2îžAèÔ ²Q44˜ N˜JA+ý0^€©àÛ`õÈx˜‘}$â» “ÁÉY)he0ã×Àb/*¸´µô}á¯å-º6@˜ Ô©!ÔL†S(tg0%Ôf˜ÐÊ`,¯À„´ÿ9L47€ Øm„ðÝ„¹¡}V6´2‹!Çk`á† ï ¥6Ð1ä1Êu8=/B}°ÄwÖ¦t> p84Œã5¨‚’›¡  Šô`Gs„ÊX ÚlÈ(10á„)ZŒË¨ã5€tÚü&îžA:Ã=T«Oj|%‹·¸”éw ´2XPÎøÚ í¹”ÿL…æ~˜§MÈç˜Â!¢œ he°&†aЯ@u†¸µBsƒ_¸E¶e;5ü?öÎ=¾Šâlü³9'‹!$„ÜÔ‰FkKß¾¢VR£UJ@IÞêá¦Ec^à*D T„­P(öƒD„HÅL%M,L ä H9—ýý±?·ëÙsöìÙ³—™ÙçûG>{&;³Ï<Ï3³3ÏÎΠP504“û5ðÿ† [@ò6hEQƒº¦„) jb¾e`¿Ð RÇ …øK«nß›pFÏT¢ŠY=9)ý` ¤w,ex¬pÀÝ>‡‰'ð½ ¢Öü¶ü‡ë‰ë~Áù!°_˜¯ï¥›ö} Ÿ ð˜š2üœ Áã\@]Hé[`-àدt‚¸y©ÙÞ§óÞ@%ªl )ÓyˆëC ¥ï…(à –e­~!¢Á1}Ç`kZõ)_—“ סÖ:ñÕFøØŽýl›Ì÷KÖýô¯å€ÏÀ1}‹äc8¦é˜yàØÌÇþÀ²¬ÿ¥ ñ( ÀÅ!Ø”\ü´ŸÝ×›)ø Ü\E( O0 i;:£VL àÁD¥ Ä r|©J¥0±) a¤@q^ÙÁg™øã¢ªCå]0î0 co³¡¬Õ —TѦÄjˆ?p@SX<¾ QÀWX–…ïP€à¶&V>ü(“Ü*p¨8W¿` b“©å<à3€ŒÛ3 £øE!ÀäÀ~  +47a¸ÄÉ’ËÐÙXaÃñõM"Uœ𠉀¦v0D`Ö5à3Âq'Yá:þlYÎ…KË¿^¡úUॠÀ}2 äBÍ’{â Ú-g Æ¦&A¥TwðÀ'ôéoÅQ4Ê€ýÀt¨»,)áxo#ÓÀyLpq?ù½®œ3!ÊâõÑ/<Å ÷üA¸M:Âr2E@ˆOÃ5p+¸þÖ§oRxux—ÀÕÀ(ÜŽ£ Ä‹ñû5xŠÒ ÓåGò|ùé#„0$àÊ–Oã¼}ƒnsEÊlJ=rüAkçŸ#\$ý_XË8 lzžf@Ð<±bû(²Àä;ðïSÀÒw@1à<VÈÜmAì®r¾‘ N˜À <ýWOa@-ð_2粂èÝwß5jTPPИ1cþøÇ?Š_RøË_þ2a„àààÐÐЇ~øÜ¹s2/ôÅ_<ôÐCaaa?~ü¾}û¸ôqãÆ1 ³ÿ~þÌýû÷3 3nÜ8éŒ !íN‡ïS5W„%ñ˜ãÕÿõß|ðвqšØ©à @OŒß¯ÁW>üðÃgžy&..îÂ… Ÿ}öÙ¶mÛÄç¬[·îí·ßîîî.,,üôÓOŸyæ9%=ztòäÉ6›­¶¶¶££ãî»ïž6mÚÿøG„ÐsÏ=‡ÚµkòÎ;ByyyÒÀ´n€Ož¿CÌÁ ñÉ-Ý”€nxj˜Ð`r1xP.=ø>ðáŽï¿ÿþ¿ÿýïÿøÇ?~ò“Ÿ „Nœ81a—3¿ùæ›ôôt„POOOhh¨Åb±ÛíâkñK•¸¼<ð@EEEuuõwÞ‰ºzõjTTÔí·ß~öìÙîîîaÆÙíö¦¦¦ØØØÖÖÖøøø   –––ððp‰Œƒ•ä~Bºüø£³† ¹œnWÄ!ÊMÄKÊ¥Mc óàà·Y¸;¹Ý[Nâ0Äkë²Àb]+ÂÓ™UUU!.”€;v¬øœ´´4î`РA!‡Ã!G†S§N!„îºë.î¹hTTBè»ï¾CEDDüêW¿²Ûíï¼óBh÷î݇㩧ž —Î&G¸ºA‡o¾¸\Ô`I<7 ¦x:ÙXçA$à+Ò#%è€\ÄMîѰ_ƒéû¨Åbq{šœpFww·ðnAúþu‰?üáü_.ÅkFÀC :lß`ø\ ±{À{¹¸8­8Ä&¾Ã èyû5pÛ1ÖÖÖr?¿ùæµJæ^ʨ¨¨pûßx`Ô¨Q555o¾ùfmmíí·ß>iÒ$9@ýƒûäVõšÂ\@zö…Oˆ –ÃŒï¸dW÷*ÚÔ)„·$ÃoOà'dÝN^|ñEîo{{{KKËÒ¥KÕ*¹¸¸8((hñâŧOŸ¶ÛíÍÍÍï¼óÎĉ¹ÿ2 “››‹Z´hú~·H9àÐâ} |æŠB`Þˆ?°ÀüçöøK` ˲Xì éi]«xoH„лï¾ûꫯ^¼x1%%eÙ²eÏ=÷œËîâ%…Ò›ñÿ=uêÔªU«¾øâ‹k×® :ô¿þ뿞þy~ýÂåË—G```SSSLL _ŽDFið‡tù‰@7%cbMUæxÂ!¯á5ƒ‰ªM‹ÌVŸ1ž\7 EN£€à‹ŠPæTxúeJöˆv»ºººÔÔÔÔÔÔ3gÎ- ÀðWôÑ3>Öô3Ü€ÿi|TmNä 0´¸ÀLèü èû *¨ `@蘥 œš':ë;t@¬d"Œ,ß TÉ~B–tF—°çd3gΜ;wnuuuppð¸qãÞÿýÌÌL£…ÐajŠOK†<Áè©ÆžARù¸D訔[ྣžÞ§ÆvžB¢o§d?!ÑF:£µK¿_€9´ö>¢µª±5¥Ì!8q#uln¼®âÁÖ.à6TB\÷%3T ÑX;‚ÀЊä'P#ÀŠÀ@ä|“Äá,|g`G}@7Hì¾ä£Ý÷ŒEh5* GBààfTúnJö*m¤3j¹Ã0*‰€_˜yj*ñ9La Ü0uÁ¶¹a+à+fè¾hš¢p˜Ájĉ›Ñí˜(ÙO趑Ψâðx¨ÿ…Ùn¨™ ÿކ¡Sa( ó y阢p˜ÇjÄa¸›™Á7 W²Ÿ˜ÁF:ã§KÀ~ €ðŸ£Ò„vÚ&Ȏ⾌±=A汓QŽ!†Ÿ¡³™’‚úÂDŒ²‘©|ƒÐÊ*6ø£[šwü‡‚¡Yh¤p²ìHÓŽ>diÞ(0‰,ÈASÂh‰ÌÙö‰®54=RÐßR&ô âªLœÀÄ¡LÃXì×°oß¾ÄÄÄ€€†›Òoƒ`8âj”$€xêYC:ºY011qÏž=&LÐúBò!Ô{ ÛÌèf23û)u'EN P jã‡òzúø¢¯€ÆôGuaDOS8  Dè_O2Ñ¡ à6D£›ùVëu]BÅ63DdžŒwØIiÊIЉ}Eª<­Õá†ón=ý÷/ùË„ ‚ƒƒCCC~øásçÎñ'×ÔÔdee 6,(((==}ß¾}ò¯õÙgŸMœ8qРAƒ ºÿþû?ýôS<]·±±ñ׿þuLLŒÕj1cÆ_|¡’’€r„—îˆÿIúëND ¯"¶&¡ð`YÀF½6›mñâÅÑÑÑ‘‘‘6l@ßeùWPûúú²³³CBBbccׯ_ïÖ3Å…¨ŽËª4"Àp¢¢dÂ'ôñ4Š}CD4gLl¤®–°Õ¹¯.aü~ ¼g¸Œ;½Öaݺuo¿ývwwwaaá§Ÿ~úÌ3Ïpé•••?ùÉOþñüå/¹qãÆž={Þÿ}ékñ|úé§<òˆÕjýî»ï‚‚‚}ôQa¸AâºÓ¦MûóŸÿüûßÿ¾§§çŸÿüçÔ©S_~ùeŸÕ߃m/£:^W.>¯3üþ‡¬RB´[ÄQTTTSSSUUU__ñâEô½ò=ä+¯¼ÒÕÕÕØØX]]]QQ!³€nèèlÀlPØr¥÷ÇÒ±!‹Åâéîø›o¾á~Þ¸qCxþƒ>ˆúä“Oä_‹OùùÏŽª¬¬ä~VVV"„î¿ÿ~9×µZ­¡#GŽ8NŸU€1†»‡9QWíØÑ×.‡þJ„Š­.äšOíêE¥ºÌ€F†‹?{ö¬øZüñðáÃÏŸ?Ïs‹.e¢:d¹.VÒŽ9’F:Δ””Ó§OÛíö_|1:::888++ëÆÜ ¡7&$$pcÑ?þx̘1IIIÛ¶mãÏáúúúòòòÂÂÂÂÂÂfÏžÝ××ÇŸðæ›o&%%Ž;öôéÓb©úûû † ñÚk¯iª_ÑÔ|ÚÎ{òäÉáÇ¿þúë,ËŠ }õêÕ!C†tttp'÷÷÷GGG···óåèc¬Úˆ ÚÉV__ÿøã‡††0à‘Gikkã¯è"ën@ë©eI´DasË¥xê „èà>©ÝøïP(#--; A9îç‰'B“&MRPfUUBèÎ;ïä~r_ýµœë¦§§#„&Ož:vìØ… ^ºtI `¬¥çO#ô12¡b«e+„î–)´´´¤¤¤HœÐÚÚšœœÌó¾KXXØçŸÎ9r$22ò®»îZ½zõ©S§ªªªÚÚÚ °|ùrþü“'OVUUÙív„ЬY³ŠŠŠ®_¿^QQÁ=-²bÅŠË—/Ÿ;w®®®®±±Q¸ö¶¼¼üøñãÝÝÝ™™™yyyb©`9ŒF8pà±Ç+++[°`BHlèÈÈȬ¬¬²²2îü#GŽÜwß}ÑÑÑ| `íÈÈÈÈÏÏoooooo¿ãŽ; $Nf¸ÊŒÃmË’h‰ÂæÌËñÖ[oåää wN";¯P/Æ¡±è‡ëx¥KœÏ§ 4!ÔÛÛ+ÿZ|Jpp0BèæÍ›ÜϾ¾>„Ppp°œ¼çÏŸŸ>}úСCyÅŽ?^® 0'1!jiO úÓÿ`Õ}ɇ8U„D{ùŠu¤^i´¢‘á¼®kˆ‹‹ƒu ÀJÚÍ›7geeqÇÓ§Oß²e ˲III555\bkkkLL wŒº|ù2Ÿ711±´´ôÂ… ÂùªÅÅÅÕÕÕqÇgΜ‰‹‹ãOèììäŽ{zz¬V«X*}ÜFššO»ÂBëÖ­>|ø×_Í'º5t}}}BBB?˲Ï?ÿüÞ½{…å@‹ÖG¶žžžèèhþŠ.xJwÛ²$Z¢°9 KûòË/'NœÈÍO=õBtð ùjÇÂuÄâZ,„¿ªä›o¾ž#=çŸí 犽téRjjêêÕ«¹DO†fYö˜0aÂÑ£GY#Lƒ[¢lQQQ¸yóf}}ý¯ýkþ*÷ÜsÏÿþïÿöôô477?õÔS|zDDÄ™3g„‚¹ÈÉøÔsrrÊÊÊ„érz¼Â'µcê:&àÜ¿P5±­#¤ÌLjR] Êhбöš?þ•+WZZZ¦NºhÑ"£Ä Èi1Õáp$$$$''ó¤p8«W¯æ6´¿ûî»÷íÛÇ¥»HþÞ{復¦Z­Ö´´4þQŽp÷û¼¼<áî÷ÂBÜÆúûûóóóo»í¶ÈÈÈ7ª\aÿÐzh¡Eɬ@½---£G^¹r%ëÙÐ,Ë~ðÁIIIœKèo › ‡¦‚î×ÛÛ›œœÌ-m`æÜ¹s£FBÕÕÕMž<¹¹¹Ùåü„„„òòòÛo¿];‘à5 3ÆBD) Q·˜ä cÁVØ F=¾½C¡½<˜çÓ8¿OwDUøê«¯&MšÊ0LHHHgg'ÿ/þ3~)))mmmâ¼---))): ªð…Pf_µ¼bÏž=111àc€ºÀ~ @'ú‡{õoÂ8‡ÿñôÕk„ð³Õ±±±â¼X}w¼¢O bÙ²eï¿ÿ¾Ì‡T äLì׸CÊ#Ma”‡§÷ÿùÖ–áT E"ˆ¾¾¾   àààÆÆÆ9sæÿµpáBn‡üüü™3gr‰BmgggÏŸ?¿¹¹¹»»;??_W¹Àw”u§¾æjnnþÙÏ~&}NNNNSSB „vR IDAT¨©©)''GT4aì:UÊÛFèæ`AÅÛ~q¾¢`21€\0YΠø©H#4]V³sçÎ¥K—†††>øàƒ<ð€ð_“&MºóÎ;GŒT$ÎûꫯŽ=:===%%…áH‰9r8tèPZZZPPPrròöíÛùô²²²äää   qãÆUWWs‰¼Ñ•å#þ Ã0,Ëp¹úúú²³³CBBbccׯ_ÏURR²xñb„ТE‹JJJTTM2‡1 óÔT ž¾af‹ˆ1ÜFêšÃðê Ø¯?Áç½ O`nü$##ãüùó6›­¾¾~Þ¼yBÇ[¶lY[[[OOÏÎ;È% O ,--½råÊÕ«W.\¨·è€Ð¬Y³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\bÄŸbáÿäé•W^éêêjll¬®®®¨¨æåzQèK%Ðg ¹˜§¦bpó X©$7ù‰¯‚ië,¸ÜBÛÔàÖÝá#‰FRALTªQݱr`Àrl”˜˜XZZzá—ŒÜqOOÕjåÓýÉ%&>>þìÙ³b±ùãáÇŸ?ž;>wîÿ¯ììl.6qáÂ…ììl‰ ä¨rDýøãÇŒ˜””´mÛ6>ã›o¾™””8vìØÓ§OóéþäÓßß_PP0dȈˆˆ×^{Mº»Ýþâ‹/FGGgeeݸqCºîàäɓÇýõ×].ýÍ7ߌ9Òétr?NgJJÊéÓ§=]!´qãÆ„„‹Å"¡î ¯¯////,,,,,löìÙ}}}ÒUó„vΆ¿o¸µ Ø:W¯^2dHGGwrttt{{{SSÓÓO?úÕ¯~ÕÔÔä§* Õ××?þøã¡¡¡ xä‘GÚÚÚÜfA¢¸€ô%š° Š‹åR<5a\Ö5…è°1$æË\vŽðP "ÀÊxÛeÿþýååå÷ÜsObbâ_ÿúW>=**Š;4hÝnW%—¯ŸbimmMNNæŽù„Ю]»B‰‰‰»víòz!jÀmŠD9«W¯>uêTUUU[[Û€–/_.]BèÀ=öXYYÙ‚ \.žžöùçŸs?9y×]wyº BèäÉ“UUUœzÒÇŠ+._¾|îܹºººÆÆÆ—_~Y±Š ÄXßàp± Ø:‘‘‘YYYeeeÜùG޹ï¾û¢££‘9V*k£ŒŒŒüü|n©;  @âda BúŠÍGØùb9Þzë-nµ‚DÖÄ%dÆ$sN‚ ¾6XM Gt‚‰ä8È )ÔWPíênf­„|3}üñDZ±±|.—Bܦ+ÎÅãu]C\\œÛu ò!ÈQ刊ç:·å$%%ÕÔÔpÇ­­­111Ò…¬[·nøðá_ýµ§«oÞ¼9++‹;ž>}ú–-[$®‚º|ù2Ÿ×“¸ƒ¸¸¸ºº:îøÌ™3qqqÒUó„±ý­±¾áÖ‚n­S__ŸÐßßϲìóÏ?¿wï^–Š•JøÛHHOOOtt´Û,žºnOW”h>Â6(,íË/¿œ8qâÍ›7YÏMX —ÀÔu|À¶1!˜Ä0™«û&UÀAí »vÒhZw3+–¼Úhúôéµµµ·nÝúðÃå=•å³bÅŠ)S¦455uuu-X°@|~AAAFFFGGG{{{FFݱV†´'OžÌÈÈ2dHBB÷ePV†æ•åc±Xl6›Xf·?­V«Åb±X,èû]?% IIIY±b…§K³,{õêÕððð+W®tvvFDDtuuI\ÅE*i X,»ÝÎÛl6OÓ6¯Ždlk¬o¸µ 'ëL›6m÷î݇#55•_r/]¾ðl[4æ6:qâÄĉCBB89=5‰XƒÛŸ¾6ŸK—.;¶¹¹™ûéÉI¼VGxޱœ0p|ðÉަÃðºP£I·Ð];iŒû†ãÕFï½÷^jjªÕjMKK;|ø0ŸË¥—e¹Äô÷÷çççßvÛm‘‘‘7nŸßÓÓóÌ3Ï:tÍš5Þjì Y^*_Z<ס&$$¸}ËÚS!MMM£FZ·n§«³,;mÚ´ÒÒÒ7Θ1Cú*žjáVqqqçÎãŽÏž=;|øpéªy“þÖßpkAOÖ©¬¬?~ü_|ñÜsÏÉ©‘Ë…°mјÛ(>>~Ïž=]]]N§óÚµkü™V«µ··—;îììô5ÖàSó¹yóæÄ‰?Χ{rùøä°_×¶z­ÿïMø _ ºßT$>Ñš2}úô3gÎØl¶ýë_S¦Lá]úUá`Ο\bÜ~ŠExþ AƒvïÞÝÛÛÛÖÖ–™™¯¸¦t••õí·ßö÷÷;N‡Ã¡i.1ÙÙÙóçÏonnîîîÎÏÏ—>yîܹ³gÏ>þ¼Ýn¯­­1c†t!ñññÇŽÛ±cÇš5k<•™››ûÖ[oíØ±#77Wú*.Hk ++«  €[>“ŸŸŸ••åUb¬o wôdñãLJ„„,_¾üÙgŸõçŠÄa¬úúú‚‚‚‚ƒƒç̙ç§§§¯_¿¾··÷Ò¥KsçÎåÓ#""Ξ=+G<ùÍgîܹ3gÎüùÏ.L‘Ó„Uߨ@=à$X!Óª[âîÂØªÑªUÖªyÊ%]š²\ 0¤ê\>à'hþüùW®\iii™:uê¢E‹|ÍN–¼J‹ù:áO‡Ã±zõjn×ú»ï¾{ß¾}r iii=zôÊ•+Ý àp8’““ùRxºŠ‹TÒn¤Ÿ——'ÜHßmÕ<¡©³aîn-èÉ:,Ë~ðÁIII¼åƒs‹ÆÜF9r¤Õj1bÄÖ­[ù3«ªªÆŽkµZÞxã >½¤¤$44ÔSÉÊšxâ/á$2‘ï!F,ðèð9@>2Í¡®Õ([Î FøH\ç:RܾW{oPŸ\>‘““S\\œ˜˜xñâÅW^yEb~­ÍJ±ÛP&6¯÷‘)Ò–-[V®\ÙÛÛûË_þrÛ¶mܨק‹^wù'0 DSóQæ[·n½téÒªU«|͈³p–bä«a˜áÒhp†Õ÷5 úÞ›p‹0F ¡ž:t(---(((99yûöí|zYYYrrrPPиq㪫«¹DÞ4Êr‰ihhÈÌÌËÚµkcbbBBBrssoݺť—””,^¼!´hÑ¢’’Õ´šáéa”W^xá…¶¶¶ëׯ¿ûî»>À“k×®mÞ¼ù…^0ZÀ\°°_‰0:¢ÿåc¬¨‡D(4ðnÐ9x„Ø~õº¢¢¢ººº¡¡¡¥¥¥°°Ogðø¹É݆Lk#†ÀgŒøËðqŽáøŠÖþFo0 µ`Á‚¸¸8—F7jjlD¾º‘ïP`î÷êB±³ªŽ\‚‘±ÐÀÿ"ç*T¢ÅiíÍäÔ+))©  à‰'žHLLfìì쌊ŠBõöö†‡‡Ûl6$xKBY.iz{{“““¹¥ Ü;wnÔ¨Q¡ºººÉ“'777#Á;.\(,,4ð }.ø‰9mDh­ €ÎVð×þR†O gdŽÃpÃ$^å)Ê@}ÅebZýHû¿Ÿ­C¨Uê5é =#÷f^«VYYY\\|âĉàààM›6eff"Qt€ÿÉ(Ë%櫯¾Z¶lYUUUOOw¦Óéäìv»ÅbAÙíöàà`.láR²?÷ÓFÉ‚âÖí¢ëK´ðæD7“™Ù7H©;)rR€Ï‹`¼‚'0ßS†Iô¦]¬:7øüz:t(77·¥¥ù5P–‹'!!áw¿ûÝÃ?~ýúõððp>‹p]Ã>ØÔÔ¤QÅýV·¡ Sõ¨¤Wq@¬AH©;)rR€UÃ~ x!|ÃÇ$ïÉ«ˆË&t¿~¢zíH)ª ì©x~õ!´páBn‡üüü™3g*¾`rÌÓPpûÀç­o@zÎ-MëMàMk#Qæ$NhiFB”A\"Æ £Ò+àáR(u˜'ne?þø“O>òâ‹/¾óÎ;šæ³sçÎ¥K—†††>øàƒ<ð€ð_“&MºóÎ;GŒT¤ø:ž‰9tߌ8(»}Pl)j0ÊF¦ò B+K¨ØD L·°_FPv·ÆŠUê¶ ({…„b-©…*¢¸O#®Rþßae/àÅÝ,eU£¬:Tb”Lå„V–P±‰@±n† ñ‘}ý¡yhÅ”øÕb|û…@ƒvPìHè­}}wZ-E ºœy|ƒÜvméŒ?.Á²,©þDä¶j" U½=©°·•óÂešÑM‰ÖÔ˜ÔKÜX$Dòs]ƒÎUÆDÀhêuiª‹Z‡ ¤ƒƒ]pAS(¨ UÀ ÿõ ïP 4  RÉ|+ÖÎ¥ixª8• ÑM‡×4ukK']~™À]7ð±>’¨5U£¦"†£B ök0šê‚3¤ëÙmk—¹H  ꢑIwQOÐZ/·è_YS©—&H_âk—3IT04†"ù ÔpA-ÂæóÃD=!]ۊǦn_`#W8 EÏIºz‚Öz¹ÅÊšJÔAbÄÁlž÷MÁ\ù˜‹':já ºk§ª+ b FBÊ‘Ðõ/.¢m ” Lù$…??ÑâF‹º…Öz¹`T5M¢^@pM!1*D ˜{5¾¹’ý„錊.@â7Hüv†ÒGÄ™ÀeÊM"þ¼.åg € ž“h§Ò ºµDwíÌ!}8?$•)€µ!¤¤Ë/3ÔQEÔUÃ0VµÊÌ´[Cn)4ho:ÖþhõZ2¶‰qê¥U·€W Î¥ÐÄOxò -š'ø¡2@oF@â Tx>…`fíÚµ111!!!¹¹¹·nÝr9¡²²2>>~Ó¦MÈCj³Ù/^¹aÃ=„ö –6 ¥Ÿ·ÅÍÙ¨AÅÕ tø§[(^±<À@ÀýÀXIÈ ðzEÿdÍaY6Àh¼¨¨¨¨®®nhhhii),,þëÀ=öXYYÙ‚ ÆâÏ›ìq[²×\â[›KFé]¼"}ßô$?¼d ì׸²páÂööööööüüü™3gòéñññÇŽÛ±cÇš5k\²û¯ìììùóç777wwwçççë$4ùHß#ý¹ƒús--jj\Æ ƒ-ž†e˜#ô‡e,€ùÓ9{Âm\€ïÉåå)¬àVB·•ÖÛµ(þZÒ§AÜÀ„ÇL¤·œG “&MºóÎ;GŒT$üW\\ÜÑ£GwïÞ]\\ì)û«¯¾:zôèôôô”””#Fh..™øz4 RäÄÅáÖL¨‰»'0@&é¢Q4AØiË,VNdA\¦Ûd×^.>.¼ÆT„0 ì×`ØÊO¨?ø„±Ê—¸«é,‰È’OÁ“p_sž%!™Vuà9f¬ ‹?“[_}^æµ”5%·…ëÙ*•.\òº½  :Œ?ž (ÛÄ´¾.¹J¦£:£@iØvÁ9€çP˜À=£ ®ëgÛ1<Äà‚ÿó8ˆ;Z±Àv¬±í®ÈA‡zé«‘ø: À¶—Ð .(܆nàù€FE|@Åf‚[ˆAˆŠÝÄ- rnIúpŠtù‰FgåS<4¤¸já“ÆLØK@pALè9&º\@7 &Ñ?² qi<[Ÿêµ`Æj´ @-t Y–å*h†å0ª Ô’qïçD¶!¸¾íP¬¢ <†¤eÀ¼Ý)]x-?*–µ  y.„-ðÜÉ@tS>Ý“TS]d*M쫤w\Ðh’TBzÛôÏh‚" <$†ÄhÝÿÃz@0(1Ńe4izê?úŒØL5Ü7UeÕ«ÒÄ'¨g.ÌK)ƒÄ¶èþѬ Bè1Ñ­» Ou€Fˆ¿¹Š?ðIX”iC±™§³,»lÙ²ÈÈÈÛn»í¥—^âýª««kÚ´i!!!ÑÑÑEEEÊ.*–Af¢þ˜m\(ž ^‘¯4áÂH„½Syê8Øbˆ„@(ÐdL#‰t^VÅ–)¡¦R¹Ï­0úˆ¡º ÉܪK¾&a˜£eT@YÏèOê¶SÞ¾}ûñãÇ¿ýöÛššš£GîØ±ƒKŸ7o^HHHssó™3gêëëwîÜ©øºžÈÉÉijjB555åää¨^¾H¿]ù„©*«ÂPp{“Æùž ÁlÁÙmù0°J…j&Á<² –Ó­T: £)âÑ…Ö—ƒ¸ A‰N@_¿ æÐ¡CiiiAAAÉÉÉÛ·oçÓËÊÊ’““ƒ‚‚ÆW]]Í%òT–K‚)S¦=z”;þÛßþ6uêT‰“ÿð‡?””” 6,..nÕªU»víâÒ?úè£ 6DFFFEE•––¾ýöÛ\ºÍf[¼xqtttddä† ¸D‡ÃñÒK/ :tРA3fÌèééá¥---MLL´Z­Â‰÷ß’’’Å‹#„-ZTRRâµ^ÚaÚq!Weâ:cve !ï:Ap@óÔ=*PMà‘YL¤å0OˆAˆËèBçëBÜàaYÖ5`ʬY³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\¬]»6??ßn·Ûl¶%K–lܸ‘KŠŠ JMM]³fÃáàkkkÇÏßsÏ=µµµÜ±KSSSÃÕÔÔTUUÕ××_¼x‘K\½zõ©S§ªªªÚÚÚ °|ùr>ãÉ“'«ªªìv;W K_Æ ä×p@ÅpƒþÁ0¾¹AËš¢ BdÖ7±9Ä2ã&¡n^]:î ¿H€!ñ$͆ðGÇräOJJ*((xâ‰'…;;;£¢¢B½½½ááá6› ¦(ÊrIóÌ3ÏŒ?Þét¶¶¶®[·ŽOw8µµµ .LOOçb‹Åf³ „œNgPPÝnG=õÔSáá᯽öšÓé\²dÉîÝ»9ÊËËo¿ýváå’““?úè£1cÆ „ÚÚÚÒÓÓ[[[9i/_¾ùä“°°°ùóç¿ñÆ---!«ÕzóæM«Õ*,000_¶àt:†q:µpQ¬×A¬AS@~"ç!˜tFʇà•@c$¬¦f€úh‚:" <bðŠËú%q3À0 ì×€)÷Þ{ïÁƒ;::¶mÛ6oÞ€3fÌ©S§¸ã¯¿þš[›€2dÈz{{[[[ããã'OžÌ¥6¬¾¾Þ¥ÀaÆ566Úív‡ÃÁ…ä‹j¬Wè0²ohhÈÌÌŒ¥Ý%1¾NK¤—Åb¸LTGê%Ã`Oï8àßIʬ,qõBf݈ABà3Bóälò&€?,ì×€-YYYß~ûm¿Óéä7DÐ(—åååW®\ÉÉÉ™7oÞ?ÿùÏýë_ÜUjjjìvûwß}—››ûôÓOs'Ïš5ëå—_nii¹|ùòŠ+øïAäåå577÷õõ—8wîÜÙ³gŸ?Þn·×ÖÖΘ1í`gÏžõ¿‚d‘‘‘‘ŸŸßÞÞÞÞÞ~Çwpéžöéàq»5€þÜVåä‚à‚ Àé@cô B ˆäh‚™§£‚|"‰1 à <^ãF ¨€t÷Š'äJÎ!Gþ÷Þ{/55Õjµ¦¥¥>|˜ÏèRŽË²\Lš4iÿþýÜñçŸþðó,»wïÞ´´4«Õ:|øð‚‚‚ÞÞ^în;†ˆˆˆˆˆˆåË—;N.}Û¶m±±±ƒ z衇ªªªøÂûûûóóóo»í¶ÈÈÈ7r‰‡cõêÕIIIwß}÷¾}ûÜJ[RRªÀ ´sݲ§§'::š;NLL,--½pá‚§“ãããÏž=«`¤7Oñ³Çöô_úº}@`n«yÂ×Þ’ú~Ï<§µ^†@)vió€`oHC ]~¢ÑNù:˜õ«¯¾Z¶lYUU÷)PæûXÜîÓ!ÄíÖî­ù1{VÑs 0‡9a`)>i˜Üd~>½¤Xi25C™<½î¡¿$”á²*Ä@Iä#±HGgIŸ`L~W3 ˜Œѱ†„„„ßýîw?üpxxøõë×ÃÃÃ].wèСÜÜ\nëM—ŒâO~h¸·ŸH)YÙ ãÁ‚öHÔÛËŸhÅjqÁœ‘·/ú" Ý;„¸YÀ~ fGÁk€Qôõõ766Ι3‡Ow»O‡Ð”n·ÆtCúEbŸ üFêÓE¡á€áÐhð§Ÿñº—>dj‰z…¸­>•5ÅeË$qÀS+€ñ žØŒÁ“T„î»—nè3FܹsçÒ¥KCCC|ðÁx€OüñÇŸ|òÉ_|ñwÞg|õÕWGžžž’’2bÄM…Æ*6 °&þd#ˆ&(F¦ºÌ£·z ¾Öø@n¸G:è@n½¨aدÁH—Ÿh4R>Ø”Ç̪8êp?/§ð€þ˜¹I’ßú01“?tLª`82uhNu¹UŽ9U.kI ”D-`<ƒ n·7“#?XƒÖ˜SÞªµ´Ñ7þ0'æl’d¡¿ š .Yð Ä0‡Ö)!Ä G}é-P¶&«•,X Ê0|B.^:¨nÉ\0_%–e¹¥¤`><Ñ4® pi ² 1w§@Ô Î…uz#­± ýhC™f|ÊåémC–e—-[yÛm·½ôÒK¼_uuuM›6-$$$::º¨¨HxjIê"¼WaÒ‘ª.‰°@hn .þ´)·Û%È|KÙäû&ÈG¦nA.¸Õhs¨¿×ÃæúÃ0 |‡‚6”uâ¾ær{7ݾ}ûñãÇ¿ýöÛššš£GîØ±ƒKŸ7o^HHHssó™3gêëëwîÜ©@B1999MMM¡¦¦¦œœUÊù˜*(NýÄœ€51ÁSÑ‘©dЧ'Ü>…-o)ºçÞžÜâZ@¢BÍÖg:t(---(((99yûöí|zYYYrrrPPиq㪫«¹DÞšÊr¹0eÊ”£GrÇûÛߦN*!çþð‡’’’aÆÅÅÅ­Zµj×®]\úG}´aÆÈÈȨ¨¨ÒÒÒ·ß~Û%ceee||ü¦M›B‡ã¥—^:tè Aƒf̘ÑÓÓÓÕÕÝÙÙÉl³Ù†ÚÑÑQRR²xñb„ТE‹JJJ¼(TÅT7 ?v&‚ ‡7DôG¦ÂA·^q«@ÐјêvqMaYÖ5À¬Y³ŠŠŠ®_¿^QQQYYɧ———?~¼»»;333//O•\.¬]»6??ßn·Ûl¶%K–lܸ‘KŠŠ JMM]³fÃáàkkkÇÏßsÏ=µµµÜ±Kë­©©þxð`¬¬««+..îŽ;î9rä!CøBÊÊÊrrrø@BèÒ¥KéééV«Õb±ÄÆÆ¶··#„FŒñ³ŸýlïÞ½N§óèÑ£¿üå/B»víJHH@%&&Ê 4„².L»ŽvÇpÁÌ÷3×Ü.iæÓ“‹T$Ö&xÕ§Ä’hJþ tÀ­zA™f@h_—ÆÅ¿²X&ž\]þ]ÀäÀ~ pï½÷>~òäÉ|öcÇŽíÝ»wýúõ|ʰaÃív»Ãá`Y–/|éÒ¥¯¿þú—_~yÿý÷8?Ÿ O0pß „PCCCffæàÁƒøè£rA‰ò]€Ý18¨_µ!_¦€ÎG‡0’ƒêщiØB2M#Ó ¦B™Ë¹U2¨Ô„x 7˜¯qµ.DªYد²²²¾ýöÛþþ~§ÓÉoŽ Q.ÊË˯\¹’““3oÞ¼þóŸÿú׿¸’kjjìvûwß}—››ûôÓOs'Ïš5ëå—_nii¹|ùòŠ+ø§ßyyyÍÍÍ}}},***,,äË?vìØŽ;Ö¬YÃ¥Ì;wöìÙçÏŸ·Ûíµµµ3fÌàÒDz|ùògŸ}VY] ÇÀ}7BùùùííííííwÜqGAAtùbÌà €É€ zF¤ÅàËTXƒÐ¹ó—i#+xÅWÃAˆ#n0í°P:èà¿ZèQ¬ôOÈ•œÇ§*¼÷Þ{©©©V«5--íðáÃ| .º(Ëå¤I“öïßÏþùç?ü0˲{÷îMKK³Z­Ã‡/((èííåNà¶cˆˆˆˆˆˆX¾|¹ÓéäÒ·mÛ;hР‡z¨ªªJ|õ–––Ñ£G¯\¹’eY‡Ã±zõꤤ¤ÀÀÀ»ï¾{ß¾}üù|ðARR_¬24r9Å&&&–––^¸pÁ%cgg'wÜÓÓcµZùtrIÓÓÓ-Q¾˜ììì‹/"„.\¸-q&ÍÓZW8½Qlkj o c!B5¯C™¨A¾ê@Û€W azE-Q£[{CUП­[·^ºtiÕªUþ¢æ½–\YYY\\|âĉàààM›6eff"ÑÎ:üOþ@Y.1_}õÕ²e˪ªªzzzàå·åKÔÑ«ê(öm­«&G½XA±­iBâ°œŒXÙןç<8TC•ÊAݵ2Hœ–0Ä«á<½„¢¡Lù€ÛÈDñÍ×%;ѺeökÈàÚµk›7o~á…ŒD9Æî»ñôÓO¿ð ÍÍÍN§óÚµk| ò©|3·; è‡[÷õõõegg‡„„ÄÆÆ®_¿žO÷ºÅ†Íf[¼xqtttddä† 4Á® „ Ìi2+&o:h¡-ÅÏñ.¼ aþoI€xêÐ|}É‚Ð{ û5žct_vºÁ0LTTÔ‚ âââü,7a6pß „P___PPPpppccãœ9sT/ðö‡ï4!„^yå•®®®ÆÆÆêêꊊ þL¯[lÕÔÔTUUÕ××so¾&ǧNOØùk´ŒÖh‚H‘ùþÕ™%×váVóbüAº—ÆgÊ€'ÒA¯Ú#Z½VûcgŒƒ­J±Ì'üñ'Ÿ|ò»ï¾ûñüÎ;ïhšKÌÎ;-Z4mÚ´„„„¥K—îÝ»WÝòÕÙ³gϱcÇ¢££B7nüðùôAƒ]ºt©­­-11ñ÷¿ÿ½8ãÿøÇòòrî‹°¥¥¥zÊ ` ˲ºfü)‡ŽÞ^ qãµ¼… *Ó§(ƒð'ð ¢'º¸!l}BŠݶPân" CÚëÁ„ª[ 5!­µ Öä U:ÔË¥C¶Z­·nݲX,!»ÝÈzÞÂCˆÕj½yó¦ÕjÕNT¡ÌˆFsÓŠÄhF<šôdV?Ç&ôM׉h2“R;Š‘6ð9Ýø˜bä÷ºd)™ýð$&&¦±±‘;æŒ-6† V__¯‹ŒaxzZ"½âÚ§×o:¨YùcB°,n@ Ðhìš"_½dMÛYدÁXX,wm ž¾âcMsµ²ÃSnˆˆˆ8{ö,ÿsúôé‹-êìììèè(((àÓÝn±!4Svvöüùó›››»»»óóóu“ÐO±iÄÙý—æœ^Q eöõ|ÄóU]Ä¡³Æ´+À µÜI™KèsuµÐÓ.>iÉÿTA­ú82PW8@YupÃlêõóq<­ÃèCY²dÉøñãyw-..OLLLKK›0aB`` —Îm±òâ‹/ºÝbãÕW_=ztzzzJJʈ#4•Ð íÆþƒ³lÆ"¿ëº@™Bˆ®ÑÂÓ ˜Æôѹ6REr†ý0€755 ÕK™súÅu7¼jgΜùÅ/~ᛆkÆ xºÁû¯v¯C™—ÐNB¢‘y÷ÁG{jùƒ*à£?1°"n/­l‰ÛtâlA`ÿÑZ‡ÊÊÇDzªHÂÀ~ 8À×…8CàÄq¢Y°`ÁÕ«W[[[—.]*Þ á Z‹GjåI6ª#¡^­íë+^¯®§5)p*ÃíëI~–C¢-hÂp¿¢í[±\®k¬eUÑ û5`‚?÷À†XlvmÐx¾­©©©£GþÑ~¶råJ£ÅôCÇ@3Z€CƒŽ!ü‡êèŒt•ÉU>ígâ,›˜­¾FzÖ 7•dV–aX×€$V—˜¢þ˜m•Š©úVÐL”ŠU K”ÿ_ÌÁçQ¶NE´}•­-h„~e8¾:¶Ùl$_?æÒ )¨ø@ÉT`¥7“t:¦ª&ÝuThF](nPW͉Fa%ènúÄM=1sݵtk òŸÞË9>äTܤª!ˆ+g¦¾ë¡¾‚<ŠgÔŒ¢oý(ËekPêõD’u4Cõõ­â#‰Q€´´j8^M`ry­~>+âäc’W H4±à¦1ºš¼oõe.!‘K £Òo±Å Šî.A Á0q*°/ÂÆ4~…ÒŽ 6òªدwX@6FÛÊ ¬ Rs÷5|G P¦7Ý´““ÓÔÔ„jjjÊÉÉÑç¢2Aƒ¢¾‚H²Žf¨¾þà£U|$1 Ѐ€V Ç« Ln#éê8Âvb b„îJbsâÏ·|¨çСCiiiAAAÉÉÉÛ·oçÓËÊÊ’““ƒ‚‚ÆW]]Í%òjT–Ë.]h¾¾¾ìììØØØõë×{½œ %%%‹/F-Z´¨¤¤D‘>0Õ«(,¥öºMƒIìkÆ:ØW­ \À¯°Â­cƒx<5|–ea]è8â@"âº<³fÍ***º~ýzEEEee%Ÿ^^^~üøñîîîÌÌ̼¼>~Ó¦Mç „l6ÛâÅ‹£££###7lØ ¢l<Ô¼Ô-]M£nwu¹yóæìÙ³ÃÃÃÃÃÃçÌ™sóæM.]¼W‹?A9Ž—^zièСƒ š1cFOOOWWWtttgg'w²Íf:thGG‡×í`´ö+ýJëÉ¡†@5pC0|ë†aÖ®]’››{ëÖ->½´´411Ñjµr?OŸ>=jÔ(¾.,ËŽ9’ï¯8tpHµà[#¹m¼ ™™™ƒ8pà£>ÚÞÞŽ¾Hp’ˆûqá†4|دè ƒ••õí·ßö÷÷;N‡Ã¡i.1gÏžåNŸ>}Ñ¢Eª_Àñþxì±ÇÊÊÊ,Xà鎢¢¢šššªªªúúú‹/ê#6‰» Ìí®.+V¬¸|ùò¹sçêêê_~ùe.]¼W‹?A­^½úÔ©SUUUmmm X¾|ydddVVVYYwþ‘#Gî»ï¾èèh¯ÛÁ€_ùÀ™ŠŠŠêêꆆ†–––ÂÂB>ýäÉ“UUUv»û™žžöùçŸs?9y×]w ‹‡äqÛx322òóóÛÛÛÛÛÛï¸ãnPçÒ‹ûqá†é™%r%­!ºiãŒW­¾÷Þ{©©©V«5--íðáÃ|.—B\”åSRRÊŸÐÓÓóÌ3Ï:tÍš5Ü;ž.çàl~¢‘Å.´nݺáÇýõמÎöìYÕ¥rçñZíêˆêììäŽ{zz¬V+wWWWÇŸ9s&..Ž;NLL,--½pá‚K!.?Å~’””TSS÷¶¶ÆÄİ,[__ŸÐßßϲìóÏ?¿wï^O—¢ƒ_éìTÚµ_Ò ÁRÑÀÕ!„Î;ÇŸ={vøðá|úåË—…§±,»y󿬬,.eúôé[¶lq)M‡T M'Ñ^oOOOtt4/ Ÿî¶pÁ†»+{ÿFÆÕ!WŸÿþ÷¿GŒ¡Qáäªt‹5¤¤¤¬X±Bâ!‹Åf³©.• ¤;ù55¸ýi±Xìv;wl³ÙøÄÉ“'322† ’ðþûï{*Dì'V«Õb±X,–€€ôýÂ]–e§M›¶{÷n‡Ã‘ššÚ××çéBtð+jb ¤‚%¿þªC¹ígÜöKW¯^ ¿råJgggDDDWW—Kiú8¤ZhkpÛxOœ81qâÄî¢|Û à©bHÃ×PY ´nu!N™óçÏ¿råJKKËÔ©S-Z¤ÑUˆS nèkhjj5jÔºuë<#{zEf«¬!..ÎíóFž?þ866ÖS!b?IHHhjj PYY9~üø/¾øâ¹çž“¸„X× ¿XÒ ÁÞÀÕ¡®kˆçÓ]Nã¦M›VZZºqãÆ3fˆKƒu b„7>>~Ïž=]]]N§óÚµküu…xê„Õða¿ ¾ÁÃö ªÀb³Ó#Âíi©©©£GþÑ~¶råJ?Kó”ὕiqÙ¿}ÿÔ;v¬Y³Æí9BÓgggÏŸ?¿¹¹¹»»;??_™ICçÏÊÊ*((èèèhooÏÏÏÏÊÊâÓÅ{µÈñ“¹sçΞ=ûüùóv»½¶¶vÆŒ\úøñãCBB–/_þì³ÏJ\üJ`s.\Èí ŸŸ?sæLé“sssßzë­;väæær)ànqÛxûúú‚‚‚‚ƒƒçÌ™ã6£§þ =kÞÐr%!º¥ãhÒPˆŸh§@—ý;øƒ–––Ñ£G¯\¹Râ–eûûûóóóo»í¶ÈÈÈ7j!!K²ÿÈ”\Ó "ÏûúúòòòÂÂÂÂÂÂòòò¸Eõ¬‡½Zäø‰ÃáX½zuRRR``àÝwß½oß>þ¢|ðARR’Ó锸„Î~¥§Siw- Á’ÜÀ…½!„Ö®]Ë}õ ''‡ïg<õK‡#!!!99™÷RýR-4W»m¼9r¤Õj1bÄÖ­[ÝÞµ=õ†7|„‘Ÿð…‡i cwJ§ è|x@þcrZ}ù=*¡”ÏÖ­[/]º´jÕ*£ùzêûbh„“~È‚½qÛ-…1À Zf@_` ¥«ƒ}UøÉuHbõ}êKI¬ |®]»öÓŸþ´¼¼<..ÎhYþƒ c xa£â Bok@ØÛÈ(Äl5Nt‚eY®ñ›ùö  œ&AD †@#Àó†±X,›7oÆm~k6À`Ž•Ä[& sÀW Ü .fV#d€þ€çó˜¶÷à 0`àx€L†ïP€YøÏ6->~n"| ÍXI Væ<|%€ÄY‡p£K|ÂäSeU0­aº˜ð| ˲°®L‡i§Ê*bBB ”yÿ¾jowAç77u³¯5­“ȇhûØbÔ}ž6Ú³gOLLŒvW q‰k1+L8UVSé D ú8FNnÏ¡©QàS<Ç©ºéChžöÅ碀2ò+1Ú‰ÕËX-[¶ìý÷ß—ÿq%Ÿ€ýÀ¼˜jª¬?ø€0¥jV  ˜£Ì@êš5''§©© !ÔÔÔ”““£bÉÆ‚ƒóã`_C Õ©\ ¾&±MáWžÐM cÛX577ÿìg?“>Gý°˜èTÊî”ÊJa…Ý~üñÇcÆŒ LJJÚ¶mŸñÍ7ßLJJ ;vìéÓ§ùtr¹O($pòäÉáÇ¿þúëâsšššž~úi„Я~õ«¦¦&?«o8þ‰¹}%²ôõõååå………………Íž=»¯¯ÏÓuå8 ˲v»ýÅ_ŒŽŽÎÊʺqãÆÕ«W‡ ÒÑÑÁÜßßÝÞÞî¶jx:ö娷MàïWb’.ª¿¿¿  `È!¯½öòÿýßÿ :tРAÿó?ÿsóæM>}ãÆ ‹…ûùÍ7ߌ9Òétr'8Δ””Ó§O{*¡¾¾þñÇ 0`À#<ÒÖÖ&.Ùÿ;æ6r[Ž[͸¨Â“qýiø°®L ß/ÐúX^„=,C âªú3kÖ¬¢¢¢ëׯWTTTVVòéåååÇïîîÎÌÌÌËËS%— ¡Œ0ýÀ=öXYYÙ‚ ÜžÃ|ÿy]…uƪ` }%²¬X±âòåËçΫ««kll|ùå—=]WŽ“ „V¯^}êÔ©ªªª¶¶¶,_¾<222++«¬¬Œ;ÿÈ‘#÷Ýw_tt´§ªêT†Û-hÄX¿»tQEEE555UUUõõõ/^äO®¨¨¨®®nhhhii),,äÓOžü믿ötNvv67š¼páBvv¶DÕ0w3ÿöu›%..®®®Ž;>sæL\\œôu]~Š$))©¦¦†;nmm‰‰aY¶¾¾>!!¡¿¿ŸeÙçŸ~ïÞ½ž.§Sa_“Ø‚&ð÷+·.$QT||üÙ³gÅÕ‡ÿÙÔÔ4jÔ¨uëÖy:G>8{µZ²g_î ..Nú¡ôuÅN’àößÊÊÊñãÇñÅÏ=÷œÄ%䣳Sáo_óØ‚|Ò›!~åÉ…<%g]C||¼t!Ó¦M+--ݸqãŒ3¤Kˆß³gOWW—Óé¼víš§ùyç¼í»-GŽf<W>bÍÀ~ ü¾›€W11o@˜›¬¬¬o¿ý¶¿¿ßét:Ms‰‰ˆˆ8{ö¬0%>>þرc;vìX³f§sHGÏÞÏXûJ”_PPÐÑÑÑÞÞžŸŸŸ••%q]9N2wîÜÙ³gŸ?Þn·×ÖÖΘ1ƒK?~|HHÈòåËŸ}öY}ª¦3†ÛlA%Æú•'òDvvöüùó›››»»»óóóùô… r{äççÏœ9SºÜÜÜ·ÞzkÇŽ¹¹¹Ò%ôõõ766Ι3ÇSZß¹Œµ‘ÛrähÆWãÊŸЅQ+9ÑýM€!¨Ç«}ß{ï½ÔÔT«Õš––vøða>—K!.Êr‰))) ŸÙÒÒ2zôè•+WŠÏ‘¶¾­¢`˜Û×Sáw(òòòøïP¸½®'q8«W¯æöQ¿ûî»÷íÛÇ_ôƒ>HJJâ7™w{ ùèìT¤Ø× ¶ 9z3Ö¯<¹§¢úûûóóóo»í¶ÈÈÈ7òÿ]»v-÷‰œœ¾“ñTˆÃáHHHHNNæýÓS 9r¤Õj1bÄÖ­[=ÕÈÏ;æmßm9r4#Ñ?ÈÄE3!†ý¡Öˆ€{æ@¢ä@ ð8 ¯£3›Ϻ«+žuÄŠ­[·^ºtiÕªUª”¦³Â)³/Ѷ “èÛÀØ_—?¦ÞL pq`¦xúc1É€Ãä˜ÙÊÖ]õNÃ:bŵk×~úÓŸ–——ÇÅÅ©R ÄCº-¨Á$zƒX­ˆØjœ0` ˲ü×t¡?Õ“Œ6®•áÐÄÄ›h*†®EtÕ´ö•Ã0‹eóæÍäNn©±/¶´Ã~¨iûêâ¶á[ ב  }€pƒ!ÀÆœ€þ@ç UÖ C‘ÈÅOe‚-·hçþ— N˹†ïP Å6wa˜뼺b6øöe´ úáíôoBû‚QNöƒaÕ¶ï‚§†@âüA¸Ñ%: ÜåÅXIè  ?Ðî@uX–…u È ZÓbªÇ#Ø>óÔzµ°IìkÆ:ØW¶ 2g6a€¶Ï#ÑðH\#@âZ  7hd‚–…aõœaX} ÀG«øHb º1*áµÃÏpŒE¢ú°_¾á-€@`†–…¡Ÿë¦m3Ø×0q*°/ÂÆ€v(³¬¦Û@æää455!„šššrrrü¼ í{mø°_¾«ºÀø à »eáìçúˆD·} +§2¹}±² ŸC‡¥¥¥%''oß¾O/++KNN 7n\uu5—È[YY.1 ì]»6&&&$$$77÷Ö­[|ziiibb¢Õjå~ž>}zÔ¨Q¼w±,;räÈêêê’’’Å‹#„-ZTRR¢–Z|ÂÌmßkÇýP‚™;Vuñ „Ö–…§Ÿëÿb9­ö5 Ê´öÅЀLfÍšUTTtýúõŠŠŠÊÊJ>½¼¼üøñãÝÝÝ™™™yyyªärKEEEuuuCCCKKKaa!Ÿ~òäɪª*»Ýήãß> IDATýLOO ûüóϹŸGމŒŒ¼ë®»Ð÷îgl£3gÛ—ÙðûØxp†~ ÜB™càY¥ÂS!d³q–M ÌV_­ÑyŽ“””TPPðÄO$&& eèì쌊ŠBõöö†‡‡Ûl6.LY.1 Ü;wnÔ¨Q¡ºººÉ“'777sé—/_6l˲o¼ñÆ—_~ù§?ý !”••5qâÄßüæ7999ÅÅʼn‰‰.\(,,ܵk—Zr‘y0©Ú‚Ü@ƒ„ùqb €¦ê[Õº2ÀÂg#äz¶µ0¼×ÂV3øC„êˆÒLRMýÑslPYYY\\|âĉàààM›6eff"Qt€ÿÉ(Ë%†a»Ýn±XBv»=88Ømx‚ûÙÕÕ5bĈúúz–eGÕÐÐár-¶Ž…Oud ¿Ý@Г( €Wȵ`.9&­s-áqê"N`ùP\50¤ƒ:tèPnnnKK ò%j ,—ðẆ|ÛèÑSQ¿þõ¯'L˜À²leeå»ï¾«Zå}AŽuhm ÊêeÕFL˲üûr4õªÚÉTÀá·»I| Oǧõ‘n_CÀÁp2¡Þ¾ÙðDVVÖ+¯¼2jÔ(§Óép84Íå–… ¾ýöÛ¡üüü™3gJŸœ››»dÉ„Pii©?ÕºÛ¾¯ ßJbOÏ@7Èz0À'„£RÀÖ½1T#‰ö5lJ*íK¨-1?þø“O>ùÝwßýøÇ?~çw4Íå–I“&Ýyç7nܘ6mZQQ‘ôÉ=ôеk×,ËäÉ“ý¹¨>Ð×ö4|د5—)¼*ôÁëøÆœã0Ç<݉óPóXG†±’¨2²¤ó«¤@ Y‰ –eaà €ÊÀŒÚ- @E ¸à+Ð ú£â{÷tЬ:Òg€ýPXÝ æ9€?@dÁ'$zP€þ¸í{¡C¦د­€Ù5¨ð.(Æmsƒad½n€Eû5 ü¼$v2*@\К¶R€ýÐ3O¶Í\w@ˆ,h‡P·üû\T i˜üQ V€-û5 -¦Ý¾&9ŒÔ ¡˜mì„!°8N1 ÃX–ú1m¸Á$Ç”@dàÉäbæ±>Às#?õ ¦ê¯a’c* ¸€` hÂTc'Üåûhý0I¯ ºÙ,ÎÈ\ì 6€L2v P»*¹&Æñ@.Ô÷ÝÐAÑŒ}P?v P¸*À~ è ÝïÂBtóU*«@(±‚ÞLK\>fd $t1Œ¾˜1}52 Y  ·Ö @0ÖЭÀÈàirNS]¨‚ ãb\0%ô‹(µîêBäfX>Ô@ÇŽZÐ DÌ<•À<@ÄA]஡: Ã-¦†ïÙɽeB 7˜">ý!úK¸À¨„eº-Ü >|xêÔ©ÑÑѱ±±O>ùägŸ}¦Ãuå¨Úslܸñ±Ç“>ç¿øEii©Ä _|ñÅÌ™3‡:`À€´´´7ÞxÃ¥?©««ËÈÈ}J>–––.\¸½üÂ… KJJÄÌ¥(J£Ñ|üñÇ™™™|k'† Fž˜à"2M=yòdoooŸY³f]¼x±¢¢bÆŒ¾¾¾¾¾¾‰‰‰L32¶²ÑÆÆWÚµk×âããýýý===ÕjuAA™uìØ±èèhOOO…B±oß>v4M»¹¹1Uã+A dëV øH$‡|Ô‡‰ÞÖQ€õ‘Ó­1ÍQât8&¿ºl ˜Çé·óU0 àáÇ|ssssÃÂÂΞ=«ÓéjkkÃÂÂòòò˜YE…‡‡×ÕÕétººº:¥RyäÈš¦KKKãââØ…¤¥¥-_¾œÉ2~üøšš½^O a&¾ùæ•JU__¯ÓéêëëÃÃÃ)ÖS´‘‘‘gΜÑét---K—.MHH0È.`Ò¤Iß}÷ùXTT\QQ¡Õjoܸ±páB2ëܹs111& düéOJNN&ýüü~ùåöOž<4h˜¹4M/Y²äóÏ?S©¢¢¢€€€¸¸¸ 6äææþøãì¹ìF›8qbuuµV«mmm]±bÅСC£¢¢Ø)‰‰‰ÌÂÂ[™¯ñ U ”6vìØŒŒŒ'Ož0[yÞ¼yLú‰'† rôèQ­V{þüy•JUXXÈ-Y ¾t«T Äp¶oGpöh²ó𠜘ëlDgª©T*íîîæ›«V«KJJÈÇâââÉ“'3ÓE•••‘Y¥¥¥Ó¦M#¹¾ÿþ{fº»»;88ø‡~`²444°Ë'm8uêÔòòr’^VVƾl¾zõ*™¥Ñh||| ² ö2===îîîbæ–——Ož<¹§§‡ùh²R………ùË_þõ_ÿuĈ³gÏ~ðàA^Š¢._¾L²<~ü˜¢¨+W®°SH3 oe¾Æ7@V-Pš\.onnææ‹‹c.444DFFrK(/Ý*U‘p0Ø#{~BA‚»Ûbî6GÛ:{Þ‹ûƒÓÔwøðá×®] 0:×ËËK£Ñ',ººº† Æ<; ‘HºººØ³ººº(Šúûßÿ~ôèÑPuðàÁŒŒŒÓ§O3Y˜klR>yÈŸ»"æÂY¦··—}0!¹Ä¼#@*•jµZ©TÊ|ôöönmmõööæ.ÙÛÛëééÙÝÝ-\`AAÁG}TUU¥T*Iâ AƒîÞ½ëççGR~ùå—'Ož˜œ;f̘C‡EFFÔNŒîîî>øàÇ,**¢þ¹e¸Æ×ŒÂ[™/—1¥­]»6//oîܹS¦L™5kVhh(³ŒÓsft†»F¾øÒ­R5 ïk{DŽKö¶³c Á\æ¾mmëœæÂ[<»=j™kêÔ©ÕÕÕÖ-3))éÒ¥K÷îÝ£(j×®]«V­"³Ø âõ¥‘™çÄ,ÙÑÑ1hÐ áeöïßÿᇖ——³(ŠR©T×®]c§\¿~]¥R‰™{óæÍ¨¨(öaSü©¯‡‡Gjjjee%w·˚ъ=|ÇŽ¥¥¥ …¢´´tÒ¤IiiiLzooo{{;û{ 4ˆ,/]˜£ï¼vE"‘¸Ù:ãìðÄÝ~"±gx•#¸à@ÃZøãÿ¸eË­Vkþé§ŸR5aÂöHDuuõ¯ýkò‘¹[ÌŠŠŠb¦%ɺuë222¾ûî»;wѨÈÈHö+^È&æ‡h…Bqûömò1::šïRüøã …B ¨ôôô¿þõ¯UUU¿úÕ¯ f½òÊ+ùùùì”üüüW^yEÌ\îARàh¹jÕ*ƒÌÙÒÒ2tèP°MÞÊÖ--&&æƒ>8xðà÷ß¿uëV&‘yèFdùFKàK·nÕ@³ž»0ös˜²ŸHì ¾_À6½´ÀúõëÕjuqqq[[ÛÓ§Oëëëß|óM¦F¹¹¹J¥²¶¶V¯××ÕÕ) ö«õ˜·9êõúúúz¥RyøðaRfww·Z­ž;wîæÍ›I"·•HJAAADDDcc£^¯ollŒˆˆ X—Ü|¹BBBªªªz{{j÷‡?üá‹/¾ ‹‹‹CCC+++u:]SSÓ¢E‹È¬;wþÛ¿ý_9[·nU©T?ýô“ѹ> ܹsg[[[[[Û®]»FE^º)<—¯v|s'MštüøñŽŽŽ§OŸž>}Z­V§¥¥äh4nŠðVž˜Òâã㫪ª:;;ÛÛÛ÷ìÙ3aÂ&ýäÉ“±±±555Z­¶££ãäÉ“ñññF×ÈW_ºUª"9ü×!8={8q·‡ì@ºíPRRòÊ+¯ 6L*•>÷Üs‰‰‰̬ݻw‡‡‡{xx¨Tª={ö,E1³¤R©B¡Ø»w¯A™_~ù¥L&#¯-¤M]ÝeffŽ=Z*•ªTªŒŒ ™Lf2W~~~pp0yدj3fÌ`§FGGËd²Ñ£G³Ã~þùçÙï§ä®”‹ýzÈëׯ¿úê«Ì”Œ¿ví;»ð\£µ3ª¦¦fÙ²eaaaR©ÔÏÏoÚ´iÙÙÙܼf5Ђ[YLx½½½nnn&Kc¶…§§§ŸŸ_||üõë×ɬS§NÍœ9ÓÇÇÇËË+..ŽýþNöùJ(¹Uñò•'x^ÀÕØö–l—½!œq+¸ ¶ À4á‚Maòù…´´´7näææZPøùóçßzë­«W¯ZÝ?ôôô(Š¢¢"òˆ‡QçÎKLL¼}û¶eo”pq=7n\kk«­›ÁûÀ1ó× ÚÕð¶è§OŸNOOOMMŸeñâÅMMM===.\X±bÅòåË­‰T*]»víúõë…Û¸qãÚµk1Ð`žžž¬¬¬éÓ§Û:°1×:‡G7ÀWþ®0Ѐ;ÀZúû—|“?››õ€«ÝÚ Ðì‰$00𫯾Š_àRSSoݺ”œœ¼~ýz77üHæÜÝÝ£¢¢òóóÇŽkëXÀ–œÿ4œÌ€]ÿ;å@F ÿØÏ¥5ÆlÎÍo‚ÿO†Àù ÌóN3Ѐg"`` Àu5éÀ‰„yk L&‹‰‰¹xñ"{ò×h‡ïîî~ÿý÷‡>dÈ;vô_´ÔÿµÎXÀá} àú{¸Áq$ p_l“8ú¨²²òÌ™3mmm ÉÉÉìYô?¿{ßÀ'Ÿ|rùòåsçÎݾ}û矠p\£žO˜ÿt·Ñ’âÀˆg"ÀN Ì} äNÖÖÖaÆQÕÕÕåïïßÝÝm°_$!!!•••¿úÕ¯ú/Nƒ˜)ì†à’0ÖLx¸Á²±;¿6Ààاk`¯ˆ›.°ïK¥R­V+•Jû/N6;?žô¼¯˜ÀÃì'·2º€½]à™ë5jÔíÛ·m€“ÃûÀáYñÝ ö0ˆ‰W9ôÝàÁƒoܸA>²w¥%K–¬ZµêþçÚÚÚÖ¬Yc‹èCYYÙk¯½6|øp‘#G&%%UTTX}-öpÔåû}¥V\¯µše ›·  `äÈ‘"4ù3€xöÙ…,cÅféWŽgÝÙýܺ•u¦¦cssÄ{p† lä˜Ð—šMÞ‰ÛÀ9ØÛ AëÖ­‹5z4øË_þ2nܸ¨¨(¥R©P(>6‡ðç?ÿyÆ +W®¼yófWWWQQ‘»»ûìÙ³m—€“mÛžÏðÁ‡6ú=åp6ç(-æô½šK Ÿ›ÅÞêÕOhšÆûÀy°Ç ØÇq@`2öß!o[§doc öÃ[¦¼¼üÃ?¬­­õòòb§oÛ¶í£>²UTIü·@,iîÂ}Ìe-nnnÏž=3úÇ Ì¶¡Ú?Gi±ˆÓ†7ºj~Þ÷ÂÞ×ÎCüó VŒ·-€ÃIOOß´i“Á@EQd !++K¥RÉd²ˆˆˆììl²€D"ÉÊÊŠˆˆÉdááá999Lú /¼PXXÈ.ªµµuèС†}—r~~~LLŒ\.÷÷÷Ÿ7oÞ£GÈòÙÙÙJ¥’YcVV–Àº¥¥%%%ÅÛÛ{Ĉï¾ûngg§˜òsrrÂÃÃIù÷$ éÚµkñññþþþžžžjµº  €Ì5ø"H$yyyS¦Lñõõuww§þù‹ÉhKRƾ¼HáFWÁ.o« ´ŒBhšvssÏàKo¥Â-ÉeО“'Oööööññ™5kÖÅ‹+**f̘áëëëë뛘˜È®_W¡ûÛ±cÇ¢££=== ž}ûøŠmûöísæÌ!;::BBB:::HJttt}}=%¸)ZŒK`3t¹ŽS 0ƒ`„Wa°¤YÛ/JÄÞmÐÏ :Fll¬\.W(û÷ï'éF»ÙÀì­ö@"‘9ÓµLô¶Žì÷`'fáå-^µµJ°gèÞ|±e>|È77777,,ììÙ³:®¶¶6,,,//™EQTxxx]]N§«««S*•GŽ¡iº´´4..Ž]HZZÚòåË™,$oddä™3gt:]KKËÒ¥K˜Yß|óJ¥ª¯¯×étõõõáááMœ““óôéÓ»wï.Y²$%%ÅdùGŽ!å×ÖÖ2OÖ-\`I21vìØŒŒŒ'Ož0ÑΛ7Ï`‚¢¨ñãÇ×ÔÔèõzƒeøZ’¯“³„·_Ë(ÄèÚf ¬ÔdK TâĉÕÕÕZ­¶µµuÅŠC‡ŠŠb§$&&’Œ|]E ¿8qbÈ!GÕjµçÏŸW©T………|µ&nß¾-—ËùåæcFF†——WFFóñÎ;½½½´©MÙ÷ÍÄír§p`Ürøfq—¿Ýb³wóMWTThµÚ7n,\¸,#pD⫲UöV;Ó_pBb.òM ˆ<0Z¥G‡ÞÎÇ[F*•vwwóÍU«Õ%%%äcqqñäÉ“™iŠ¢ÊÊÊȬÒÒÒiÓ¦‘\ßÿ=3ÝÝÝüÃ?Ðÿ|EqõêU’W£Ñøøø0ÓS§N-//'³ÊÊÊD6i{{ûÈ‘#M–?mÚ4ƒ°ùÊX’LÈåòææfn^£_C F—hI³®ÊHŠðVãk…]»À,•šlI¾Â)Šº|ù2Iüø1EQW®\a§ðUÝUú[\\{p¡¡¡!22Òd„4MÇÆÆ2—‹½½½ãÆ;xðàØ±c™ëöôôô•+Wrë­fß7·Ë dœÂqËá›Å]RüvˆAÌÞÍ7=}úôãÇ ÇIsŽHÜŠ˜ R|7°8'!þšßâ‹387ô>ŽØ2=â›+—Ë»ººÈÇÎÎN¹\ÎLSe0ËËË‹™>|øð[o½ÅLüö·¿%YÈsICP¬kNƒbùš´¥¥eÙ²eAAAäþp7·<,ÌW¾———Èò–$ï½÷Þˆ#V®\¹ÿþ;wîpWÇNééé1’@K \¢ÌÞj|-c@ \|ñ­ÔdKòn´L¾µtþæíímð¥Or ûôÓO™ßŸËËËgΜIÓô‹/¾È\Ù¾ôÒKäWxSö}3q»Ü@Æ)·áj ¯Ñ‚ÄìÝ|Ó^^^ÜØ„HÜŠ˜ R|7°x_8<ë؇Dá·-PÝ.`ϦNZ]]mÝ2“’’.]ºtïÞ=Š¢víÚµjÕ*î2}?Œ/X°À××÷Ô©S4MëõúÞÞ^+–/ÆŽ;JKK Eiié¤I“ÒÒÒæ>3o.«|ïØä¤ÚäJÍjI¾2ùÖ"ÜUøôöö¶··³¿ôŸ={f2EQóçÏ/++ëèèHOOOII¡(*%%%==ýÉ“'.\˜9s¦˜B¬²™„»œÄin¯¿Ý˜eÝL˜TM$¼¯œ‡ÉCžø%M–lVÙA,+ÁÎwLG5Hß¶mMÓjµúĉì…Å>Þ‚’8ššzëÖ­   äääõë×»¹á×2è/èoÖ‚±°6¿,7w°b 6¯@¿2÷Šº±±qË–-µµµ^^^»víJHH 8WªÜ ~ËrÖè2Üt£…”lt]özpIf|_Ú|s8r5n»v?d쪎Vdñ.SZZºlÙ²û÷ïSæŒX–Ëä2"ÇÌ‚3pM‰·xIDATw€íÙÛE¸È×:XP,3‡½ÁÅýþ÷¿¿zõª^¯ïíí}öìY¿æê‹Áƒ߸qcVà|¤Ž8âîXÑ€0{hèW4M“w˹B}Œzã7’’’nݺ5vìØôk®¾X·n]lllGGöV³Ð4í§ø&DqÄ(h \³ÖàÄð-Ì-.Ë­Ÿnîä_DZÿ‡þŸ€ãrÙKngÎò±££#$$¤££ƒ¤DGG×××SüÛš!°-²²²T*S¯ììlnð)|«0X’»§]‘ð¦äëñHÌê|û£Èà5ͰaÃZ[[ÙÅj4šáÇk4vËì;}Üã,ØÜ"WÌ’±±±r¹\¡Pìß¿Ÿ¤ t£M*°QŒßÈbÙÙÙJ¥’´€É Šé™L"‘¹½Ðž­†­ƒ³õÓÎkP¦ÑUØÛAÇ1pwãÌeÝįÈwðàààœœœ§OŸÞ½{wÉ’%)))L:EQãǯ©©ÑëõLʉ'† rôèQ­V{þüy•JUXXh´LŠ¢ÂÃÃëêêt:]]]R©<<\̱ÅÞ¾nïrc N ÿ  d¢¡¡!((è‹/¾à.SRR2a°°°¬¬,n±z½~íÚµƒþüóÏ­6Ýo 0`¬>Ö \še¹,[²œ`ïnoo9r$3MQTCC{n\\ûd½¡¡!22Òh9E•••‘¥¥¥Ó¦M3YwE]¾|™||üø1EQW®\a§øøø… &Øå¤„1mÚ4ƒàÅŒ5\½z•¤k4•0ƒç+D­Vÿý÷Ìtwwwppð?ü`4ñÍeY ˆk†ØØXær®··wܸq;v,3¾žž¾råJ1a4cII ™U\\ýøñãÜtáÃפ|Åèñ™˜:ujyy9I/++sl±Ã¯Ç»\Ç@€£ë¿× Xæãßÿþ÷áÇ“ï ƒe:¤Õjïܹ“œœÌ-sýúõ³gÏþùçŸ5Íš5kú)lÍÀ¡Y}¬¡?rY·ñ+r¸½»¥¥eÙ²eAAAäöi7·qâÄk¯½ftooï»wï¶´´„††~õÕWÜrssÓÓÓCBB† ²sçÎ~ŽÀi•––Nœ8Q&“=zÏž=$=33sôèÑ2™,&&æâÅ‹L"yÖÔ²\\:néÒ¥>>>#GŽÜ¾};I×jµï¼óŽ¿¿¿¿¿ÿþð­VKŠ2ºŠgÏž}üñÇ#FŒðöö^¸p¡ÁãÓÎaÁ‚¾¾¾§Nêèè iZ¯×÷öö’¹ä²‡ÑÛÛÛÞÞÎ>³|ö왹k.Ä`T¿ýS «ÔÅ‚¨„œ¯¤¤¤K—.Ý»w¢¨]»v­ZµJ||eZ· ®/,ÞjóçÏ/++ëèèHOOOII¡(*%%%==ýÉ“'.\˜9s¦˜BúÞC̽\âö[>|›R¸c˜[Z?¿zõjrÓèÎ;׬Y#~-Vßãˆéáâ lñMÍf'¯c0I"‘8Ìÿ¡ Ø»:FI@XffæÛo¿÷ÀáÇ+++Õjuhh¨ÁË{÷ïßW*•ý#€KX¼xñ'Ÿ|ÒÞÞ^]]ÝØØHÒ+++Ïœ9ÓÖÖ–œœl•\\›6mzôèÑO?ýtáÂ…ªª*’¾aÆ{÷î555ݼyó§Ÿ~Ú¸q£ð*¶nÝúÝwß;w®¥¥ÅÓÓóOú“e­aÏΜ9óé§ŸFDDÈårŠ¢¾ýö[…™{ƒE–|úôi2]]]eA!–‘H$ÜK_ƒ0¢¢¢ ‚·blf58!‘HÖ­[—‘‘ñÝwßݹs'))©ï‘ô±¼½½ÛÚÚÈÇk×®õ=$Š¢ ÅøñãÓÓÓ/\¸ðÆoP•páÂ…ŒŒŒ—_~ÙÃÃÃ`yî–0aÂv]ª««ýë_3ÓÕ1k&WÄ·)Åt £[dÇàÛÍ ~Μ9>¬©©©©©immåþ®#Ðs¬²Ç™µ-Äj¢££O:ÅMh Š¿I-Ø[###Ïž=K>²§XÐ3ˆ%·DØŽƒ† ŒþÛ Š¥(ª¹¹Y¥R}öÙg|Ë%%%äIH¶ààà7nX7N8 £Ó‡CCCwîÜyç΃Œ­­­Ìtgg§T*%é}ÉÅÔÔÔÄL߸qƒ,xóæMfúúõë« #?xðà¹çž®µ#îÝjµzÓ¦M¦««ëرc£F¢øoÐ=yòdlllMMV«íèè8yòd||¼Ñb)Šb^u¦×ëëëë•JåáÇMÂ]£Y)d"$$¤ªªŠ}ã17E ŒC‡‘àëêêD¾Òdœ ³œÒÝÝ­V«çλyóf£%‹ ƒ¤XÖdbΜ9ÉÉÉ=ÒëõgÏže.´,ƒkÛ¶mR©tË–-$eóæÍR©ôСCÜìÜ-+°®ÜÜ\¥RY[[KêE^õ'Pî*LÖE`E4ϦÓ1ŒF"²cðíæÿÙgŸÍŸ?þüù;vìà¶€@ϱÊgÖæ¼*.. ­¬¬ÔétMMM‹-2ÙMJólP """õz}cccDD„˜½ÉdÏxŽzÑîˆ1£ÿ;ƒ¾~ý:{E4Mß½{w̘1[·n5ºÌ‚ ®\¹¢ÓéŠŠŠ†ÎÎÈØ°aÃìÙ³›››?~¼zõêþÛAÃl&»qCCÃ믿rôèQ’Ë ƒ Ërq¹»»“Çb»»»É’é|Ãä£T*uwwwwwwss£þïG$ޏw755½üòËr¹\.—GEE}ýõ×Â-|êÔ©™3gúøøxyyÅÅÅ}¡“w÷îÝáááR©T¡PìÝ»WL!ÖkÈÏÏ&ÿnÙhŠp]²³³ …T*U©T™™™Vk0«Á R¾üòK™LöàÁ£%‹ £-@&|M!|ˆ£máP™çø˜ÈÈÈÉd&s™ì™Ï^â0—ý´ ˜¥_ϼSSS}}}¹ß7÷ïß7n3–l°Ìý×3F*•Nœ8‘ûŠ)š¦õzýš5k†:dÈÿøÿè°ñjÀ€øn̾‡Hü¨e¹ˆàà`¾ûØéAAA« inn¬ß?ÁÞM úCjj*ùÅšu7¥ÉÒ°?ZÉ&íË&>wîܸqã,ËkCøþ€†3o.´ 8“ÝØä=D´±QËrq}øá‡¯¾úêÇ[ZZ~÷»ß‘%ßÿý×_¤¯[·Nxiii¿ûÝïšššº»»/_¾üûßÿ^ Ê4ön´ƒÕUWW?÷ÜsO#²î¦SöG«nR 6ñ¢E‹nÞ¼ÙÝÝýÃ?Lž<ùoû[ŸchEIÉ]@ÿxã7’’’nݺ5vìØôk.®¿þõ¯+W® óóó[·n݉'˜ôÔÔÔU«V©T*Š¢Þ|óÍ-[¶—óÑGI$’—^zéÞ½{&LذaƒÅ!ô…D" Ü·o_hh¨­c>±î¦DǰC–m”Ù³g¿þúë·nÝ JNN~ï½÷ú/Â~BÓ´„LÙ6pßäB›€@76 Í.KŠï?°‰D"µu àðhš–H$öðϽ™[ ØlnjW†÷5€óÀ) €ÍÑ4ífëDáþVÙ¹¬[€‹`.ò±Ë0ð[¸87ò)‘ÕÇ Ä(~¥¸îW#‘Hp_86ËFK`Œõí·ßnnn¦(ª¹¹ùí·ßîïÕØÜÚÀÀM ”]v« Ûª^vØžNmÐGnÌ›œlÀ?”––Nœ8Q&“=zÏž=$=33sôèÑ2™,&&æâÅ‹L"9‚Y–Ë“nôÀØØØ¼k×.î2FWššúþûïSõÞ{復¦ö©E+ŸZ¸fݺÖv¼†`¼¯ìÑâÅ‹?ùä“öööêêêÆÆF’^YYyæÌ™¶¶¶„„„ääd«ä2ÀüÉ}¸ìÈ‘#¯¾újffæêÕ«¹Ë𭚌JXЊì®ÙóI­]ü¦Êy[ÀVõrÖö'†÷5€Ýñöö¾{÷nKKKhhèW_}EÒ333ƒƒƒ½½½×­[wþüy«äcûöí«W¯>qâÄk¯½&>à7þío£(êóÏ?߸q£ëpP.;Üà ‰$???&&F.—ûûûÏ›7ïÑ£GdnVV–J¥’ÉdÙÙÙ$ õw{‘F`oýcÇŽÅÆÆÊår…B±ÿ~vztt´§§§B¡Ø·oŸ@T---)))ÞÞÞ#FŒx÷Ýw;;;ÅD›““ÎD›••ÅW_nðEñK–¹víZ||¼¿¿¿§§§Z­.((pŽöÌËË›2eН¯¯»»»YÅJ$’¬¬¬ˆˆ™Lž““Þ%¾X†åËÂ._"‘ 6¬µµ•›F£>|¸F£®Ž˜"I$’ÿÿÓÀ€a@ 444¼þúë!!!G%¹ 1˜°,—Ñð >*•Ê 6,ctÕ&WÄ^FÌbŽ…œmØ:â4õ¥(*22òÌ™3:®¥¥eéÒ¥ ̬ÜÜܰ°°³gÏêtºÚÚÚ°°°¼¼<’‹[3QTT\QQ¡Õjoܸ±páB&ýĉC† 9zô¨V«=þ¼J¥*,,ä‹*888''çéÓ§wïÞ]²dIJJŠÉh9¢R©êëë™h ßÖ1<_±dá±cÇfddûì3¾eŒ®Z<‡ÁY¹Îi†3Õ”¢¨«W¯’ÆÇLJ™V«Õ%%%dVqqñäÉ“I.n9ÌÄôéÓ?Î]Q\\ûªµ¡¡!22RL„íííìƒ<_´Ó¦M+++#³JKKÍkà+–,,—Ë›››MFëpíÙÐÐ`Y±E4ø´iÓ,(–¯a²”ñâÅÀÀ@2®ÑÝÝ|éÒ%áBÄwÉy¾ÀQ˜<ì,X°àÊ•+:®¨¨høðá$—A!–åâ:pà@¿æâZ·n]ll¬Ásæß~ûíþçnÙ²…»ŒµV à|اNö¯¯ØÕq²³©ÙL½½½íííì³ÒgÏž]rÁ‚¾¾¾§Nêèè iZ¯×÷öööw´&‹Ý±cGii©B¡(--4iRZZšÅEY…µÚ“ @˜[¬0ñÅò5¬p$å¯^½ú‹/¾`¦wîܹfÍëVLÂûÀ˜­£°#hp¶;áéG¶nTëãVФ¨Õê'NôÒÒRrÏ¿D"áûõþùçŸ/**â®è7¿ùÍ·ß~+&$§OŸ’åååÿMj$Eü-ñÁsSŒrûömooo£…;z{Š/–|†Â²bÙ +…[~OOó.Œ³gÏ*•ÊgÏž™,ÏPX—3S€ÝÂaÇ\J?_û[7dáV¤äææ*•ÊÚÚZ½^_WW§P(È» CBBªªªØ—Ç$Wqqqhhhee¥N§kjjZ´h“~òäÉØØØšš­VÛÑÑqòäÉøøx£!©ÕêM›6i4š®®®cÇŽ5Š1ÖpèÐ!æU$Z¾­&<7…LÄÇÇWUUuvv¶··ïÙ³g„ F wôö_,EQ¤Áëëë•JåáÇ-(–¯a²ݲŸ}öÙüùóçÏŸ¿cÇ1ëî0N¼Ëô'ÿ¾ûd'G{¸x°“¦`\Ó4½{÷îððp•JµgÏ’žŸŸÌ<,ÀÍUXX-“ÉF½wï^’~êÔ©™3gúøøxyyÅÅÅ}å!MÓMMM/¿ü²\.—ËåQQQ_ýµ˜±𦳳³ …T*U©T™™™|[áà RÈDIIÉŒ3<==ýüüâããÙ/ñ዇›bÿí)¾XŠ¢˜êH¥R…BÁ̬b–/‹Ñò5Í AƒÜÖÖ&²:ßÔÐNô 8 rþdë@lMN@"ÁeüƒD"q³u àŠ˜ÓgzKœe0ÐNÉÍÉ^ 6DÓô?þW“mCäâ¿ê»xõÀ‰¹1¯m°uàº\óÖ*׬5¸¼¯l‰ tºÚ…7©/†zÀ)á|lÌÕ.¼]­¾à‚p_ؘKÝÝ€pøG¸`\á"Üê ‘H0Öö‚}_ƒ“šœ¸j$ø‘ ì“]–;YuÄÀXØ#'{wޱàRð Ø/'qÀ1\D"‘Ú:^¸PpDx†¬ÉÍÖ€SÁûÀj$ îkkÂû ±š¦1iLcÓ˜Æ4¦1iLcÓ˜Æ4¦-ž–’)€¾ûë1“hOðIEND®B`‚shishi-1.0.2/doc/parse-datetime.texi0000644000000000000000000005650712126660051014250 00000000000000@c GNU date syntax documentation @c Copyright (C) 1994-2006, 2009-2013 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 or @c any later version published by the Free Software Foundation; with no @c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover @c Texts. A copy of the license is included in the ``GNU Free @c Documentation License'' file as part of this distribution. @node Date input formats @chapter Date input formats @cindex date input formats @findex parse_datetime First, a quote: @quotation Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. @dots{} It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. @dots{} ---Robert Grudin, @cite{Time and the Art of Living}. @end quotation This section describes the textual date representations that GNU programs accept. These are the strings you, as a user, can supply as arguments to the various programs. The C interface (via the @code{parse_datetime} function) is not described here. @menu * General date syntax:: Common rules. * Calendar date items:: 19 Dec 1994. * Time of day items:: 9:20pm. * Time zone items:: EST, PDT, UTC, @dots{} * Combined date and time of day items:: 1972-09-24T20:02:00,000000-0500. * Day of week items:: Monday and others. * Relative items in date strings:: next tuesday, 2 years ago. * Pure numbers in date strings:: 19931219, 1440. * Seconds since the Epoch:: @@1078100502. * Specifying time zone rules:: TZ="America/New_York", TZ="UTC0". * Authors of parse_datetime:: Bellovin, Eggert, Salz, Berets, et al. @end menu @node General date syntax @section General date syntax @cindex general date syntax @cindex items in date strings A @dfn{date} is a string, possibly empty, containing many items separated by whitespace. The whitespace may be omitted when no ambiguity arises. The empty string means the beginning of today (i.e., midnight). Order of the items is immaterial. A date string may contain many flavors of items: @itemize @bullet @item calendar date items @item time of day items @item time zone items @item combined date and time of day items @item day of the week items @item relative items @item pure numbers. @end itemize @noindent We describe each of these item types in turn, below. @cindex numbers, written-out @cindex ordinal numbers @findex first @r{in date strings} @findex next @r{in date strings} @findex last @r{in date strings} A few ordinal numbers may be written out in words in some contexts. This is most useful for specifying day of the week items or relative items (see below). Among the most commonly used ordinal numbers, the word @samp{last} stands for @math{-1}, @samp{this} stands for 0, and @samp{first} and @samp{next} both stand for 1. Because the word @samp{second} stands for the unit of time there is no way to write the ordinal number 2, but for convenience @samp{third} stands for 3, @samp{fourth} for 4, @samp{fifth} for 5, @samp{sixth} for 6, @samp{seventh} for 7, @samp{eighth} for 8, @samp{ninth} for 9, @samp{tenth} for 10, @samp{eleventh} for 11 and @samp{twelfth} for 12. @cindex months, written-out When a month is written this way, it is still considered to be written numerically, instead of being ``spelled in full''; this changes the allowed strings. @cindex language, in dates In the current implementation, only English is supported for words and abbreviations like @samp{AM}, @samp{DST}, @samp{EST}, @samp{first}, @samp{January}, @samp{Sunday}, @samp{tomorrow}, and @samp{year}. @cindex language, in dates @cindex time zone item The output of the @command{date} command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like @samp{IST}@. When using @command{date} to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than @samp{UTC} and @samp{Z}@. Here are some ways to do this: @example $ LC_ALL=C TZ=UTC0 date Mon Mar 1 00:21:42 UTC 2004 $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ' 2004-03-01 00:21:42Z $ date --rfc-3339=ns # --rfc-3339 is a GNU extension. 2004-02-29 16:21:42.692722128-08:00 $ date --rfc-2822 # a GNU extension Sun, 29 Feb 2004 16:21:42 -0800 $ date +'%Y-%m-%d %H:%M:%S %z' # %z is a GNU extension. 2004-02-29 16:21:42 -0800 $ date +'@@%s.%N' # %s and %N are GNU extensions. @@1078100502.692722128 @end example @cindex case, ignored in dates @cindex comments, in dates Alphabetic case is completely ignored in dates. Comments may be introduced between round parentheses, as long as included parentheses are properly nested. Hyphens not followed by a digit are currently ignored. Leading zeros on numbers are ignored. @cindex leap seconds Invalid dates like @samp{2005-02-29} or times like @samp{24:00} are rejected. In the typical case of a host that does not support leap seconds, a time like @samp{23:59:60} is rejected even if it corresponds to a valid leap second. @node Calendar date items @section Calendar date items @cindex calendar date item A @dfn{calendar date item} specifies a day of the year. It is specified differently, depending on whether the month is specified numerically or literally. All these strings specify the same calendar date: @example 1972-09-24 # ISO 8601. 72-9-24 # Assume 19xx for 69 through 99, # 20xx for 00 through 68. 72-09-24 # Leading zeros are ignored. 9/24/72 # Common U.S. writing. 24 September 1972 24 Sept 72 # September has a special abbreviation. 24 Sep 72 # Three-letter abbreviations always allowed. Sep 24, 1972 24-sep-72 24sep72 @end example The year can also be omitted. In this case, the last specified year is used, or the current year if none. For example: @example 9/24 sep 24 @end example Here are the rules. @cindex ISO 8601 date format @cindex date format, ISO 8601 For numeric months, the ISO 8601 format @samp{@var{year}-@var{month}-@var{day}} is allowed, where @var{year} is any positive number, @var{month} is a number between 01 and 12, and @var{day} is a number between 01 and 31. A leading zero must be present if a number is less than ten. If @var{year} is 68 or smaller, then 2000 is added to it; otherwise, if @var{year} is less than 100, then 1900 is added to it. The construct @samp{@var{month}/@var{day}/@var{year}}, popular in the United States, is accepted. Also @samp{@var{month}/@var{day}}, omitting the year. @cindex month names in date strings @cindex abbreviations for months Literal months may be spelled out in full: @samp{January}, @samp{February}, @samp{March}, @samp{April}, @samp{May}, @samp{June}, @samp{July}, @samp{August}, @samp{September}, @samp{October}, @samp{November} or @samp{December}. Literal months may be abbreviated to their first three letters, possibly followed by an abbreviating dot. It is also permitted to write @samp{Sept} instead of @samp{September}. When months are written literally, the calendar date may be given as any of the following: @example @var{day} @var{month} @var{year} @var{day} @var{month} @var{month} @var{day} @var{year} @var{day}-@var{month}-@var{year} @end example Or, omitting the year: @example @var{month} @var{day} @end example @node Time of day items @section Time of day items @cindex time of day item A @dfn{time of day item} in date strings specifies the time on a given day. Here are some examples, all of which represent the same time: @example 20:02:00.000000 20:02 8:02pm 20:02-0500 # In EST (U.S. Eastern Standard Time). @end example @cindex leap seconds More generally, the time of day may be given as @samp{@var{hour}:@var{minute}:@var{second}}, where @var{hour} is a number between 0 and 23, @var{minute} is a number between 0 and 59, and @var{second} is a number between 0 and 59 possibly followed by @samp{.} or @samp{,} and a fraction containing one or more digits. Alternatively, @samp{:@var{second}} can be omitted, in which case it is taken to be zero. On the rare hosts that support leap seconds, @var{second} may be 60. @findex am @r{in date strings} @findex pm @r{in date strings} @findex midnight @r{in date strings} @findex noon @r{in date strings} If the time is followed by @samp{am} or @samp{pm} (or @samp{a.m.} or @samp{p.m.}), @var{hour} is restricted to run from 1 to 12, and @samp{:@var{minute}} may be omitted (taken to be zero). @samp{am} indicates the first half of the day, @samp{pm} indicates the second half of the day. In this notation, 12 is the predecessor of 1: midnight is @samp{12am} while noon is @samp{12pm}. (This is the zero-oriented interpretation of @samp{12am} and @samp{12pm}, as opposed to the old tradition derived from Latin which uses @samp{12m} for noon and @samp{12pm} for midnight.) @cindex time zone correction @cindex minutes, time zone correction by The time may alternatively be followed by a time zone correction, expressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+} or @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number of zone minutes. The zone minutes term, @var{mm}, may be omitted, in which case the one- or two-digit correction is interpreted as a number of hours. You can also separate @var{hh} from @var{mm} with a colon. When a time zone correction is given this way, it forces interpretation of the time relative to Coordinated Universal Time (UTC), overriding any previous specification for the time zone or the local time zone. For example, @samp{+0530} and @samp{+05:30} both stand for the time zone 5.5 hours ahead of UTC (e.g., India). This is the best way to specify a time zone correction by fractional parts of an hour. The maximum zone correction is 24 hours. Either @samp{am}/@samp{pm} or a time zone correction may be specified, but not both. @node Time zone items @section Time zone items @cindex time zone item A @dfn{time zone item} specifies an international time zone, indicated by a small set of letters, e.g., @samp{UTC} or @samp{Z} for Coordinated Universal Time. Any included periods are ignored. By following a non-daylight-saving time zone by the string @samp{DST} in a separate word (that is, separated by some white space), the corresponding daylight saving time zone may be specified. Alternatively, a non-daylight-saving time zone can be followed by a time zone correction, to add the two values. This is normally done only for @samp{UTC}; for example, @samp{UTC+05:30} is equivalent to @samp{+05:30}. Time zone items other than @samp{UTC} and @samp{Z} are obsolescent and are not recommended, because they are ambiguous; for example, @samp{EST} has a different meaning in Australia than in the United States. Instead, it's better to use unambiguous numeric time zone corrections like @samp{-0500}, as described in the previous section. If neither a time zone item nor a time zone correction is supplied, time stamps are interpreted using the rules of the default time zone (@pxref{Specifying time zone rules}). @node Combined date and time of day items @section Combined date and time of day items @cindex combined date and time of day item @cindex ISO 8601 date and time of day format @cindex date and time of day format, ISO 8601 The ISO 8601 date and time of day extended format consists of an ISO 8601 date, a @samp{T} character separator, and an ISO 8601 time of day. This format is also recognized if the @samp{T} is replaced by a space. In this format, the time of day should use 24-hour notation. Fractional seconds are allowed, with either comma or period preceding the fraction. ISO 8601 fractional minutes and hours are not supported. Typically, hosts support nanosecond timestamp resolution; excess precision is silently discarded. Here are some examples: @example 2012-09-24T20:02:00.052-0500 2012-12-31T23:59:59,999999999+1100 1970-01-01 00:00Z @end example @node Day of week items @section Day of week items @cindex day of week item The explicit mention of a day of the week will forward the date (only if necessary) to reach that day of the week in the future. Days of the week may be spelled out in full: @samp{Sunday}, @samp{Monday}, @samp{Tuesday}, @samp{Wednesday}, @samp{Thursday}, @samp{Friday} or @samp{Saturday}. Days may be abbreviated to their first three letters, optionally followed by a period. The special abbreviations @samp{Tues} for @samp{Tuesday}, @samp{Wednes} for @samp{Wednesday} and @samp{Thur} or @samp{Thurs} for @samp{Thursday} are also allowed. @findex next @var{day} @findex last @var{day} A number may precede a day of the week item to move forward supplementary weeks. It is best used in expression like @samp{third monday}. In this context, @samp{last @var{day}} or @samp{next @var{day}} is also acceptable; they move one week before or after the day that @var{day} by itself would represent. A comma following a day of the week item is ignored. @node Relative items in date strings @section Relative items in date strings @cindex relative items in date strings @cindex displacement of dates @dfn{Relative items} adjust a date (or the current date if none) forward or backward. The effects of relative items accumulate. Here are some examples: @example 1 year 1 year ago 3 years 2 days @end example @findex year @r{in date strings} @findex month @r{in date strings} @findex fortnight @r{in date strings} @findex week @r{in date strings} @findex day @r{in date strings} @findex hour @r{in date strings} @findex minute @r{in date strings} The unit of time displacement may be selected by the string @samp{year} or @samp{month} for moving by whole years or months. These are fuzzy units, as years and months are not all of equal duration. More precise units are @samp{fortnight} which is worth 14 days, @samp{week} worth 7 days, @samp{day} worth 24 hours, @samp{hour} worth 60 minutes, @samp{minute} or @samp{min} worth 60 seconds, and @samp{second} or @samp{sec} worth one second. An @samp{s} suffix on these units is accepted and ignored. @findex ago @r{in date strings} The unit of time may be preceded by a multiplier, given as an optionally signed number. Unsigned numbers are taken as positively signed. No number at all implies 1 for a multiplier. Following a relative item by the string @samp{ago} is equivalent to preceding the unit by a multiplier with value @math{-1}. @findex day @r{in date strings} @findex tomorrow @r{in date strings} @findex yesterday @r{in date strings} The string @samp{tomorrow} is worth one day in the future (equivalent to @samp{day}), the string @samp{yesterday} is worth one day in the past (equivalent to @samp{day ago}). @findex now @r{in date strings} @findex today @r{in date strings} @findex this @r{in date strings} The strings @samp{now} or @samp{today} are relative items corresponding to zero-valued time displacement, these strings come from the fact a zero-valued time displacement represents the current time when not otherwise changed by previous items. They may be used to stress other items, like in @samp{12:00 today}. The string @samp{this} also has the meaning of a zero-valued time displacement, but is preferred in date strings like @samp{this thursday}. When a relative item causes the resulting date to cross a boundary where the clocks were adjusted, typically for daylight saving time, the resulting date and time are adjusted accordingly. The fuzz in units can cause problems with relative items. For example, @samp{2003-07-31 -1 month} might evaluate to 2003-07-01, because 2003-06-31 is an invalid date. To determine the previous month more reliably, you can ask for the month before the 15th of the current month. For example: @example $ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June! @end example Also, take care when manipulating dates around clock changes such as daylight saving leaps. In a few cases these have added or subtracted as much as 24 hours from the clock, so it is often wise to adopt universal time by setting the @env{TZ} environment variable to @samp{UTC0} before embarking on calendrical calculations. @node Pure numbers in date strings @section Pure numbers in date strings @cindex pure numbers in date strings The precise interpretation of a pure decimal number depends on the context in the date string. If the decimal number is of the form @var{yyyy}@var{mm}@var{dd} and no other calendar date item (@pxref{Calendar date items}) appears before it in the date string, then @var{yyyy} is read as the year, @var{mm} as the month number and @var{dd} as the day of the month, for the specified calendar date. If the decimal number is of the form @var{hh}@var{mm} and no other time of day item appears before it in the date string, then @var{hh} is read as the hour of the day and @var{mm} as the minute of the hour, for the specified time of day. @var{mm} can also be omitted. If both a calendar date and a time of day appear to the left of a number in the date string, but no relative item, then the number overrides the year. @node Seconds since the Epoch @section Seconds since the Epoch If you precede a number with @samp{@@}, it represents an internal time stamp as a count of seconds. The number can contain an internal decimal point (either @samp{.} or @samp{,}); any excess precision not supported by the internal representation is truncated toward minus infinity. Such a number cannot be combined with any other date item, as it specifies a complete time stamp. @cindex beginning of time, for POSIX @cindex epoch, for POSIX Internally, computer times are represented as a count of seconds since an epoch---a well-defined point of time. On GNU and POSIX systems, the epoch is 1970-01-01 00:00:00 UTC, so @samp{@@0} represents this time, @samp{@@1} represents 1970-01-01 00:00:01 UTC, and so forth. GNU and most other POSIX-compliant systems support such times as an extension to POSIX, using negative counts, so that @samp{@@-1} represents 1969-12-31 23:59:59 UTC. Traditional Unix systems count seconds with 32-bit two's-complement integers and can represent times from 1901-12-13 20:45:52 through 2038-01-19 03:14:07 UTC@. More modern systems use 64-bit counts of seconds with nanosecond subcounts, and can represent all the times in the known lifetime of the universe to a resolution of 1 nanosecond. @cindex leap seconds On most hosts, these counts ignore the presence of leap seconds. For example, on most hosts @samp{@@915148799} represents 1998-12-31 23:59:59 UTC, @samp{@@915148800} represents 1999-01-01 00:00:00 UTC, and there is no way to represent the intervening leap second 1998-12-31 23:59:60 UTC. @node Specifying time zone rules @section Specifying time zone rules @vindex TZ Normally, dates are interpreted using the rules of the current time zone, which in turn are specified by the @env{TZ} environment variable, or by a system default if @env{TZ} is not set. To specify a different set of default time zone rules that apply just to one date, start the date with a string of the form @samp{TZ="@var{rule}"}. The two quote characters (@samp{"}) must be present in the date, and any quotes or backslashes within @var{rule} must be escaped by a backslash. For example, with the GNU @command{date} command you can answer the question ``What time is it in New York when a Paris clock shows 6:30am on October 31, 2004?'' by using a date beginning with @samp{TZ="Europe/Paris"} as shown in the following shell transcript: @example $ export TZ="America/New_York" $ date --date='TZ="Europe/Paris" 2004-10-31 06:30' Sun Oct 31 01:30:00 EDT 2004 @end example In this example, the @option{--date} operand begins with its own @env{TZ} setting, so the rest of that operand is processed according to @samp{Europe/Paris} rules, treating the string @samp{2004-10-31 06:30} as if it were in Paris. However, since the output of the @command{date} command is processed according to the overall time zone rules, it uses New York time. (Paris was normally six hours ahead of New York in 2004, but this example refers to a brief Halloween period when the gap was five hours.) A @env{TZ} value is a rule that typically names a location in the @uref{http://www.twinsun.com/tz/tz-link.htm, @samp{tz} database}. A recent catalog of location names appears in the @uref{http://twiki.org/cgi-bin/xtra/tzdate, TWiki Date and Time Gateway}. A few non-GNU hosts require a colon before a location name in a @env{TZ} setting, e.g., @samp{TZ=":America/New_York"}. The @samp{tz} database includes a wide variety of locations ranging from @samp{Arctic/Longyearbyen} to @samp{Antarctica/South_Pole}, but if you are at sea and have your own private time zone, or if you are using a non-GNU host that does not support the @samp{tz} database, you may need to use a POSIX rule instead. Simple POSIX rules like @samp{UTC0} specify a time zone without daylight saving time; other rules can specify simple daylight saving regimes. @xref{TZ Variable,, Specifying the Time Zone with @code{TZ}, libc, The GNU C Library}. @node Authors of parse_datetime @section Authors of @code{parse_datetime} @c the anchor keeps the old node name, to try to avoid breaking links @anchor{Authors of get_date} @cindex authors of @code{parse_datetime} @cindex Bellovin, Steven M. @cindex Salz, Rich @cindex Berets, Jim @cindex MacKenzie, David @cindex Meyering, Jim @cindex Eggert, Paul @code{parse_datetime} started life as @code{getdate}, as originally implemented by Steven M. Bellovin (@email{smb@@research.att.com}) while at the University of North Carolina at Chapel Hill. The code was later tweaked by a couple of people on Usenet, then completely overhauled by Rich $alz (@email{rsalz@@bbn.com}) and Jim Berets (@email{jberets@@bbn.com}) in August, 1990. Various revisions for the GNU system were made by David MacKenzie, Jim Meyering, Paul Eggert and others, including renaming it to @code{get_date} to avoid a conflict with the alternative Posix function @code{getdate}, and a later rename to @code{parse_datetime}. The Posix function @code{getdate} can parse more locale-specific dates using @code{strptime}, but relies on an environment variable and external file, and lacks the thread-safety of @code{parse_datetime}. @cindex Pinard, F. @cindex Berry, K. This chapter was originally produced by Fran@,{c}ois Pinard (@email{pinard@@iro.umontreal.ca}) from the @file{parse_datetime.y} source code, and then edited by K. Berry (@email{kb@@cs.umb.edu}). shishi-1.0.2/doc/gdoc0000775000000000000000000006067312015626624011321 00000000000000#!/usr/bin/perl ## Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Simon Josefsson ## added -texinfo, -listfunc ## man page revamp ## various improvements ## Copyright (c) 2001, 2002 Nikos Mavrogiannopoulos ## added -tex ## Copyright (c) 1998 Michael Zucchi # 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 . # This will read a C source code file and scan for embedded comments # in the style of gnome comments (+minor extensions - see below). # usage: # gdoc [ -docbook | -html | -text | -man | -tex | -texinfo | -listfunc ] # [ -sourceversion verno ] [ -include file | -includefuncprefix ] # [ -bugsto address ] # [ -seeinfo infonode ] [ -copyright notice ] [ -verbatimcopying ] # [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile # # Set output format using one of -docbook, -html, -text, -man, -tex, # -texinfo, or -listfunc. Default is man. # # -sourceversion # Version number for source code, e.g. '1.0.4'. Used in 'man' headers. # Defaults to using current date. # # -include FILE # For man pages, mention #include in the synopsis. # # -includefuncprefix # For man pages, mention a #include in the synopsis. # The FILE derived from the function prefix. For example, a # function gss_init_sec_context will generate an include # statement of #include . # # -bugsto address # For man pages, include a section about reporting bugs and mention # the given e-mail address, e.g 'bug-libidn@gnu.org'. # # -seeinfo infonode # For man pages, include a section that point to an info manual # for more information. # # -copyright notice # For man pages, include a copyright section with the given # notice after a preamble. Use, e.g., '2002, 2003 Simon Josefsson'. # # -verbatimcopying # For man pages, and when the -copyright parameter is used, # add a licensing statement that say verbatim copying is permitted. # # -function funcname # If set, then only generate documentation for the given function(s). All # other functions are ignored. # # c files - list of 'c' files to process # # All output goes to stdout, with errors to stderr. # # format of comments. # In the following table, (...)? signifies optional structure. # (...)* signifies 0 or more structure elements # /** # * function_name(:)? (- short description)? # (* @parameterx: (description of parameter x)?)* # (* a blank line)? # * (Description:)? (Description of function)? # * (Section header: (section description)? )* # (*)?*/ # # So .. the trivial example would be: # # /** # * my_function # **/ # # If the Description: header tag is ommitted, then there must be a blank line # after the last parameter specification. # e.g. # /** # * my_function - does my stuff # * @my_arg: its mine damnit # * # * Does my stuff explained. # */ # # or, could also use: # /** # * my_function - does my stuff # * @my_arg: its mine damnit # * Description: Does my stuff explained. # */ # etc. # # All descriptions can be multiline, apart from the short function description. # # All descriptive text is further processed, scanning for the following special # patterns, which are highlighted appropriately. # # 'funcname()' - function # '$ENVVAR' - environmental variable OBSOLETE (?) # '#struct_name' - name of a structure # '@parameter' - name of a parameter # '%CONST' - name of a constant. # # Extensions for LaTeX: # # 1. the symbol '->' will be replaced with a rightarrow # 2. x^y with ${x}^{y}$. # 3. xxx\: with xxx: use POSIX qw(strftime); # match expressions used to find embedded type information $type_constant = "\\\%(\\w+)"; $type_func = "(\\w+\\(\\))"; $type_param = "\\\@(\\w+)"; $type_struct = "\\\#(\\w+)"; $type_env = "(\\\$\\w+)"; # Output conversion substitutions. # One for each output format # these work fairly well %highlights_html = ( $type_constant, "\$1", $type_func, "\$1", $type_struct, "\$1", $type_param, "\$1" ); $blankline_html = "

      Function

      \n"; print "".$args{'functiontype'}."\n"; print "".$args{'function'}."\n"; print "("; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { print "".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; if ($count != $#{$args{'parameterlist'}}) { $count++; print ", "; } } print ")\n"; print "

      Arguments

      \n"; print "
      \n"; foreach $parameter (@{$args{'parameterlist'}}) { print "
      ".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; print "
      "; output_highlight($args{'parameters'}{$parameter}); } print "
      \n"; foreach $section (@{$args{'sectionlist'}}) { print "

      $section

      \n"; print "
        \n"; output_highlight($args{'sections'}{$section}); print "
      \n"; } print "
      \n"; } # output in tex sub output_tex { my %args = %{$_[0]}; my ($parameter, $section); my $count; my $func = $args{'function'}; my $param; my $param2; my $sec; my $check; my $type; $func =~ s/_/\\_/g; print "\n\n\\subsection{". $func . "}\n\\label{" . $args{'function'} . "}\n"; $type = $args{'functiontype'}; $type =~ s/_/\\_/g; print "{\\it ".$type."}\n"; print "{\\bf ".$func."}\n"; print "("; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { $param = $args{'parametertypes'}{$parameter}; $param2 = $parameter; $param =~ s/_/\\_/g; $param2 =~ s/_/\\_/g; print "{\\it ".$param."} {\\bf ".$param2."}"; if ($count != $#{$args{'parameterlist'}}) { $count++; print ", "; } } print ")\n"; print "\n{\\large{Arguments}}\n"; print "\\begin{itemize}\n"; $check=0; foreach $parameter (@{$args{'parameterlist'}}) { $param1 = $args{'parametertypes'}{$parameter}; $param1 =~ s/_/\\_/g; $param2 = $parameter; $param2 =~ s/_/\\_/g; $check = 1; print "\\item {\\it ".$param1."} {\\bf ".$param2."}: \n"; # print "\n"; $param3 = $args{'parameters'}{$parameter}; $param3 =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; $out = just_highlight($param3); $out =~ s/_/\\_/g; print $out; } if ($check==0) { print "\\item void\n"; } print "\\end{itemize}\n"; foreach $section (@{$args{'sectionlist'}}) { $sec = $section; $sec =~ s/_/\\_/g; $sec =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; print "\n{\\large{$sec}}\\\\\n"; print "\\begin{rmfamily}\n"; $sec = $args{'sections'}{$section}; $sec =~ s/\\:/:/g; $sec =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; $sec =~ s/->/\$\\rightarrow\$/g; $sec =~ s/([0-9]+)\^([0-9]+)/\$\{\1\}\^\{\2\}\$/g; $out = just_highlight($sec); $out =~ s/_/\\_/g; print $out; print "\\end{rmfamily}\n"; } print "\n"; } # output in sgml DocBook sub output_sgml { my %args = %{$_[0]}; my ($parameter, $section); my $count; my $id; $id = $args{'module'}."-".$args{'function'}; $id =~ s/[^A-Za-z0-9]/-/g; print "\n"; print "\n"; print "".$args{'function'}."\n"; print "\n"; print "\n"; print " ".$args{'function'}."\n"; print " \n"; print " ".$args{'purpose'}."\n"; print " \n"; print "\n"; print "\n"; print " Synopsis\n"; print " \n"; print " ".$args{'functiontype'}." "; print "".$args{'function'}." "; print "\n"; # print "\n"; # print " Synopsis\n"; # print " \n"; # print " ".$args{'functiontype'}." "; # print "".$args{'function'}." "; # print "\n"; $count = 0; if ($#{$args{'parameterlist'}} >= 0) { foreach $parameter (@{$args{'parameterlist'}}) { print " ".$args{'parametertypes'}{$parameter}; print " $parameter\n"; } } else { print " \n"; } print " \n"; print "\n"; # print "\n"; # print parameters print "\n Arguments\n"; # print "\nArguments\n"; if ($#{$args{'parameterlist'}} >= 0) { print " \n"; foreach $parameter (@{$args{'parameterlist'}}) { print " \n $parameter\n"; print " \n \n"; $lineprefix=" "; output_highlight($args{'parameters'}{$parameter}); print " \n \n \n"; } print " \n"; } else { print " \n None\n \n"; } print "\n"; # print out each section $lineprefix=" "; foreach $section (@{$args{'sectionlist'}}) { print "\n $section\n \n"; # print "\n$section\n"; if ($section =~ m/EXAMPLE/i) { print "\n"; } output_highlight($args{'sections'}{$section}); # print ""; if ($section =~ m/EXAMPLE/i) { print "\n"; } print " \n\n"; } print "\n\n"; } ## # output in man sub output_man { my %args = %{$_[0]}; my ($parameter, $section); my $count; print ".\\\" DO NOT MODIFY THIS FILE! It was generated by gdoc.\n"; print ".TH \"$args{'function'}\" 3 \"$args{'sourceversion'}\" \"". $args{'module'} . "\" \"". $args{'module'} . "\"\n"; print ".SH NAME\n"; print $args{'function'}; if ($args{'purpose'}) { print " \\- " . $args{'purpose'} . "\n"; } else { print " \\- API function\n"; } print ".SH SYNOPSIS\n"; print ".B #include <". $args{'include'} . ">\n" if $args{'include'}; print ".B #include <". lc((split /_/, $args{'function'})[0]) . ".h>\n" if $args{'includefuncprefix'}; print ".sp\n"; print ".BI \"".$args{'functiontype'}." ".$args{'function'}."("; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { print $args{'parametertypes'}{$parameter}." \" ".$parameter." \""; if ($count != $#{$args{'parameterlist'}}) { $count++; print ", "; } } print ");\"\n"; print ".SH ARGUMENTS\n"; foreach $parameter (@{$args{'parameterlist'}}) { print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\" 12\n"; $param = $args{'parameters'}{$parameter}; $param =~ s/-/\\-/g; output_highlight($param); } foreach $section (@{$args{'sectionlist'}}) { print ".SH \"" . uc($section) . "\"\n"; $sec = $args{'sections'}{$section}; $sec =~ s/-/\\-/g; output_highlight($sec); } if ($args{'bugsto'}) { print ".SH \"REPORTING BUGS\"\n"; print "Report bugs to <". $args{'bugsto'} . ">.\n"; } if ($args{'copyright'}) { print ".SH COPYRIGHT\n"; print "Copyright \\(co ". $args{'copyright'} . ".\n"; if ($args{'verbatimcopying'}) { print ".br\n"; print "Copying and distribution of this file, with or without modification,\n"; print "are permitted in any medium without royalty provided the copyright\n"; print "notice and this notice are preserved.\n"; } } if ($args{'seeinfo'}) { print ".SH \"SEE ALSO\"\n"; print "The full documentation for\n"; print ".B " . $args{'module'} . "\n"; print "is maintained as a Texinfo manual. If the\n"; print ".B info\n"; print "and\n"; print ".B " . $args{'module'} . "\n"; print "programs are properly installed at your site, the command\n"; print ".IP\n"; print ".B info " . $args{'seeinfo'} . "\n"; print ".PP\n"; print "should give you access to the complete manual.\n"; } } sub output_listfunc { my %args = %{$_[0]}; print $args{'function'} . "\n"; } ## # output in text sub output_text { my %args = %{$_[0]}; my ($parameter, $section); print "Function = ".$args{'function'}."\n"; print " return type: ".$args{'functiontype'}."\n\n"; foreach $parameter (@{$args{'parameterlist'}}) { print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; print " -> ".$args{'parameters'}{$parameter}."\n"; } foreach $section (@{$args{'sectionlist'}}) { print " $section:\n"; print " -> "; output_highlight($args{'sections'}{$section}); } } ## # generic output function - calls the right one based # on current output mode. sub output_function { # output_html(@_); eval "output_".$output_mode."(\@_);"; } ## # takes a function prototype and spits out all the details # stored in the global arrays/hsahes. sub dump_function { my $prototype = shift @_; if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/) { $return_type = $1; $function_name = $2; $args = $3; # print STDERR "ARGS = '$args'\n"; foreach $arg (split ',', $args) { # strip leading/trailing spaces $arg =~ s/^\s*//; $arg =~ s/\s*$//; # print STDERR "SCAN ARG: '$arg'\n"; @args = split('\s', $arg); # print STDERR " -> @args\n"; $param = pop @args; # print STDERR " -> @args\n"; if ($param =~ m/^(\*+)(.*)/) { $param = $2; push @args, $1; } if ($param =~ m/^(.*)(\[\])$/) { $param = $1; push @args, $2; } # print STDERR " :> @args\n"; $type = join " ", @args; if ($parameters{$param} eq "" && $param != "void") { $parameters{$param} = "-- undescribed --"; print STDERR "warning: $lineno: Function parameter '$param' not described in '$function_name'\n"; } push @parameterlist, $param; $parametertypes{$param} = $type; # print STDERR "param = '$param', type = '$type'\n"; } } else { print STDERR "warning: $lineno: Cannot understand prototype: '$prototype'\n"; return; } if ($function_only==0 || defined($function_table{$function_name})) { output_function({'function' => $function_name, 'module' => $modulename, 'sourceversion' => $sourceversion, 'include' => $include, 'includefuncprefix' => $includefuncprefix, 'bugsto' => $bugsto, 'copyright' => $copyright, 'verbatimcopying' => $verbatimcopying, 'seeinfo' => $seeinfo, 'functiontype' => $return_type, 'parameterlist' => \@parameterlist, 'parameters' => \%parameters, 'parametertypes' => \%parametertypes, 'sectionlist' => \@sectionlist, 'sections' => \%sections, 'purpose' => $function_purpose }); } } ###################################################################### # main # states # 0 - normal code # 1 - looking for function name # 2 - scanning field start. # 3 - scanning prototype. $state = 0; $section = ""; $doc_special = "\@\%\$\#"; $doc_start = "^/\\*\\*\$"; $doc_end = "\\*/"; $doc_com = "\\s*\\*\\s*"; $doc_func = $doc_com."(\\w+):?"; $doc_sect = $doc_com."([".$doc_special."[:upper:]][\\w ]+):\\s*(.*)"; $doc_content = $doc_com."(.*)"; %constants = (); %parameters = (); @parameterlist = (); %sections = (); @sectionlist = (); $contents = ""; $section_default = "Description"; # default section $section = $section_default; $lineno = 0; foreach $file (@ARGV) { if (!open(IN,"<$file")) { print STDERR "Error: Cannot open file $file\n"; next; } while () { $lineno++; if ($state == 0) { if (/$doc_start/o) { $state = 1; # next line is always the function name } } elsif ($state == 1) { # this line is the function name (always) if (/$doc_func/o) { $function = $1; $state = 2; if (/-\s*(.*)/) { $function_purpose = $1; } else { $function_purpose = ""; } if ($verbose) { print STDERR "Info($lineno): Scanning doc for $function\n"; } } else { print STDERR "warning: $lineno: Cannot understand $_ on line $lineno", " - I thought it was a doc line\n"; $state = 0; } } elsif ($state == 2) { # look for head: lines, and include content if (/$doc_sect/o) { $newsection = $1; $newcontents = $2; if ($contents ne "") { dump_section($section, $contents); $section = $section_default; } $contents = $newcontents; if ($contents ne "") { $contents .= "\n"; } $section = $newsection; } elsif (/$doc_end/) { if ($contents ne "") { dump_section($section, $contents); $section = $section_default; $contents = ""; } # print STDERR "end of doc comment, looking for prototype\n"; $prototype = ""; $state = 3; } elsif (/$doc_content/) { # miguel-style comment kludge, look for blank lines after # @parameter line to signify start of description if ($1 eq "" && $section =~ m/^@/) { dump_section($section, $contents); $section = $section_default; $contents = ""; } else { $contents .= $1."\n"; } } else { # i dont know - bad line? ignore. print STDERR "warning: $lineno: Bad line: $_"; } } elsif ($state == 3) { # scanning for function { (end of prototype) if (m#\s*/\*\s+MACDOC\s*#io) { # do nothing } elsif (/([^\{]*)/) { $prototype .= $1; } if (/\{/) { $prototype =~ s@/\*.*?\*/@@gos; # strip comments. $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. $prototype =~ s@^ +@@gos; # strip leading spaces dump_function($prototype); $function = ""; %constants = (); %parameters = (); %parametertypes = (); @parameterlist = (); %sections = (); @sectionlist = (); $prototype = ""; $state = 0; } } } } shishi-1.0.2/doc/shishi.info-10000644000000000000000000113042112126773203012744 00000000000000This is shishi.info, produced by makeinfo version 4.13 from shishi.texi. This manual is last updated 3 April 2013 for version 1.0.2 of Shishi. Copyright (C) 2002-2013 Simon Josefsson. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". INFO-DIR-SECTION GNU utilities START-INFO-DIR-ENTRY * shishi: (shishi). A Kerberos 5 implementation END-INFO-DIR-ENTRY INFO-DIR-SECTION GNU Libraries START-INFO-DIR-ENTRY * libshishi: (shishi). Library implementing Kerberos 5. END-INFO-DIR-ENTRY  File: shishi.info, Node: Top, Next: Introduction, Up: (dir) Shishi ****** This manual is last updated 3 April 2013 for version 1.0.2 of Shishi. Copyright (C) 2002-2013 Simon Josefsson. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". * Menu: * Introduction:: How to use this manual. * User Manual:: Using Shishi as end-user. * Administration Manual:: Administrating server aspects of Shishi. * Reference Manual:: Detailed description of config files, etc. * Programming Manual:: Calling Shishi from a programming language. * Acknowledgements:: Whom to blame. Appendices * Criticism of Kerberos:: Why you maybe shouldn't use Kerberos. * Protocol Extensions:: Description of protocol extensions used. * Copying Information:: How you can copy and share Shishi. Indices * Function and Data Index:: Index of functions, variables and data types. * Concept Index:: Index of concepts and programs.  File: shishi.info, Node: Introduction, Next: User Manual, Prev: Top, Up: Top 1 Introduction ************** Shishi is an implementation of the Kerberos 5 network authentication system, as specified in RFC 4120. Shishi can be used to authenticate users in distributed systems. Shishi contains a library ('libshishi') that can be used by application developers to add support for Kerberos 5. Shishi contains a command line utility ('shishi') that is used by users to acquire and manage tickets (and more). The server side, a Key Distribution Center, is implemented by 'shishid'. Of course, a manual documenting usage aspects as well as the programming API is included. Shishi currently supports AS/TGS exchanges for acquiring tickets, pre-authentication, the AP exchange for performing client and server authentication, and SAFE/PRIV for integrity/privacy protected application data exchanges. Shishi is internationalized; error and status messages can be translated into the users' language; user name and passwords can be converted into any available character set (normally including ISO-8859-1 and UTF-8) and also be processed using an experimental Stringprep profile. Most, if not all, of the widely used encryption and checksum types are supported, such as 3DES, AES, ARCFOUR and HMAC-SHA1. Shishi is developed for the GNU/Linux system, but runs on over 20 platforms including most major Unix platforms and Windows, and many kind of devices including iPAQ handhelds and S/390 mainframes. Shishi is free software licensed under the GNU General Public License version 3.0 or later. * Menu: * Getting Started:: * Features and Status:: * Overview:: * Cryptographic Overview:: * Supported Platforms:: * Getting help:: * Commercial Support:: * Downloading and Installing:: * Bug Reports:: * Contributing::  File: shishi.info, Node: Getting Started, Next: Features and Status, Up: Introduction 1.1 Getting Started =================== This manual documents the Shishi application and library programming interface. All commands, functions and data types provided by Shishi are explained. The reader is assumed to possess basic familiarity with network security and the Kerberos 5 security system. This manual can be used in several ways. If read from the beginning to the end, it gives a good introduction into the library and how it can be used in an application. Forward references are included where necessary. Later on, the manual can be used as a reference manual to get just the information needed about any particular interface of the library. Experienced programmers might want to start looking at the examples at the end of the manual, and then only read up on those parts of the interface which are unclear.  File: shishi.info, Node: Features and Status, Next: Overview, Prev: Getting Started, Up: Introduction 1.2 Features and Status ======================= Shishi might have a couple of advantages over other packages doing a similar job. It's Free Software Anybody can use, modify, and redistribute it under the terms of the GNU General Public License version 3.0 or later. It's thread-safe The library uses no global variables. It's internationalized It handles non-ASCII username and passwords, and user visible strings used in the library (error messages) can be translated into the users' language. It's portable It should work on all Unix like operating systems, including Windows. Shishi is far from feature complete, it is not even a full RFC 1510 implementation yet. However, some basic functionality is implemented. A few implemented feature are mentioned below. * Initial authentication (AS) from raw key or password. This step is typically used to acquire a ticket granting ticket and, less commonly, a server ticket. * Subsequent authentication (TGS). This step is typically used to acquire a server ticket, by authenticating yourself using the ticket granting ticket. * Client-Server authentication (AP). This step is used by clients and servers to prove to each other who they are, using negotiated tickets. * Integrity protected communication (SAFE). This step is used by clients and servers to exchange integrity protected data with each other. The key is typically agreed on using the Client-Server authentication step. * Ticket cache, supporting multiple principals and realms. As tickets have a life time of typically several hours, they are managed in disk files. There can be multiple ticket caches, and each ticket cache can store tickets for multiple clients (users), servers, encryption types, etc. Functionality is provided for locating the proper ticket for every use. * Most standard cryptographic primitives. The believed most secure algorithms are supported (*note Cryptographic Overview::). * Telnet client and server. This is used to remotely login to other machines, after authenticating yourself with a ticket. * PAM module. This is used to login locally on a machine. * KDC addresses located using DNS SRV RRs. * Modularized low-level crypto interface. Currently Gnulib and Libgcrypt are supported. If you wish to add support for another low-level cryptographic library, you only have to implement a few APIs for DES, AES, MD5, SHA1, HMAC, etc. Look at `gl/gc-gnulib.c' or `gl/gc-libgcrypt.c' as a starting pointer. The following table summarize what the current objectives are (i.e., the todo list) and an estimate on how long it will take to implement the feature, including some reasonable startup-time to get familiar with Shishi in general. If you like to start working on anything, please let me know so work duplication can be avoided. * Parse `/etc/krb5.keytab' to extract keys to use for telnetd etc (week) * Cross-realm support (week). * PKINIT (use libksba, weeks) * Finish GSSAPI support via GSSLib (weeks) Shishi will not support GSSLib natively, but a separate project "GSSLib" is under way to produce a generic GSS implementation, and it will use Shishi to implement the Kerberos 5 mechanism. * Port to cyclone (cyclone need to mature first) * Modularize ASN.1 library so it can be replaced (days). Almost done, all ASN.1 functionality is found in lib/asn1.c, although the interface is rather libtasn1 centric. * KDC (initiated, weeks) * LDAP backend for Shisa. * Set/Change password protocol (weeks?) * Port applications to use Shishi (indefinite) * Finish server-realm stuff * Improve documentation * Improve internationalization * Add AP-REQ replay cache (week). * Study benefits by introducing a PA-TGS-REP. This would provide mutual authentication of the KDC in a way that is easier to analyze. Currently the mutual authentication property is only implicit from successful decryption of the KDC-REP and the 4 byte nonce. * GUI applet for managing tickets. This is supported via the ticket-applet, of which a Shishi port is published on the Shishi home page. * Authorization library (months?) The shishi_authorized_p() is not a good solution, better would be to have a generic and flexible authorization library. Possibly based on S-EXP's in tickets? Should support non-Kerberos uses as well, of course. * Proof read manual. * X.500 support, including DOMAIN-X500-COMPRESS. I will accept patches that implement this, if it causes minimal changes to the current code.  File: shishi.info, Node: Overview, Next: Cryptographic Overview, Prev: Features and Status, Up: Introduction 1.3 Overview ============ This section describes RFC 1510 from a protocol point of view(1). Kerberos provides a means of verifying the identities of principals, (e.g., a workstation user or a network server) on an open (unprotected) network. This is accomplished without relying on authentication by the host operating system, without basing trust on host addresses, without requiring physical security of all the hosts on the network, and under the assumption that packets traveling along the network can be read, modified, and inserted at will. (Note, however, that many applications use Kerberos' functions only upon the initiation of a stream-based network connection, and assume the absence of any "hijackers" who might subvert such a connection. Such use implicitly trusts the host addresses involved.) Kerberos performs authentication under these conditions as a trusted third- party authentication service by using conventional cryptography, i.e., shared secret key. (shared secret key - Secret and private are often used interchangeably in the literature. In our usage, it takes two (or more) to share a secret, thus a shared DES key is a secret key. Something is only private when no one but its owner knows it. Thus, in public key cryptosystems, one has a public and a private key.) The authentication process proceeds as follows: A client sends a request to the authentication server (AS) requesting "credentials" for a given server. The AS responds with these credentials, encrypted in the client's key. The credentials consist of 1) a "ticket" for the server and 2) a temporary encryption key (often called a "session key"). The client transmits the ticket (which contains the client's identity and a copy of the session key, all encrypted in the server's key) to the server. The session key (now shared by the client and server) is used to authenticate the client, and may optionally be used to authenticate the server. It may also be used to encrypt further communication between the two parties or to exchange a separate sub-session key to be used to encrypt further communication. The implementation consists of one or more authentication servers running on physically secure hosts. The authentication servers maintain a database of principals (i.e., users and servers) and their secret keys. Code libraries provide encryption and implement the Kerberos protocol. In order to add authentication to its transactions, a typical network application adds one or two calls to the Kerberos library, which results in the transmission of the necessary messages to achieve authentication. The Kerberos protocol consists of several sub-protocols (or exchanges). There are two methods by which a client can ask a Kerberos server for credentials. In the first approach, the client sends a cleartext request for a ticket for the desired server to the AS. The reply is sent encrypted in the client's secret key. Usually this request is for a ticket-granting ticket (TGT) which can later be used with the ticket-granting server (TGS). In the second method, the client sends a request to the TGS. The client sends the TGT to the TGS in the same manner as if it were contacting any other application server which requires Kerberos credentials. The reply is encrypted in the session key from the TGT. Once obtained, credentials may be used to verify the identity of the principals in a transaction, to ensure the integrity of messages exchanged between them, or to preserve privacy of the messages. The application is free to choose whatever protection may be necessary. To verify the identities of the principals in a transaction, the client transmits the ticket to the server. Since the ticket is sent "in the clear" (parts of it are encrypted, but this encryption doesn't thwart replay) and might be intercepted and reused by an attacker, additional information is sent to prove that the message was originated by the principal to whom the ticket was issued. This information (called the authenticator) is encrypted in the session key, and includes a timestamp. The timestamp proves that the message was recently generated and is not a replay. Encrypting the authenticator in the session key proves that it was generated by a party possessing the session key. Since no one except the requesting principal and the server know the session key (it is never sent over the network in the clear) this guarantees the identity of the client. The integrity of the messages exchanged between principals can also be guaranteed using the session key (passed in the ticket and contained in the credentials). This approach provides detection of both replay attacks and message stream modification attacks. It is accomplished by generating and transmitting a collision-proof checksum (elsewhere called a hash or digest function) of the client's message, keyed with the session key. Privacy and integrity of the messages exchanged between principals can be secured by encrypting the data to be passed using the session key passed in the ticket, and contained in the credentials. ---------- Footnotes ---------- (1) The text is a lightly adapted version of the introduction section from RFC 1510 by J. Kohl and C. Neuman, September 1993, copyright likely owned by the RFC 1510 authors or some contributor.  File: shishi.info, Node: Cryptographic Overview, Next: Supported Platforms, Prev: Overview, Up: Introduction 1.4 Cryptographic Overview ========================== Shishi implements several of the standard cryptographic primitives. In this section we give the names of the supported encryption suites, and some notes about them, and their associated checksum suite. Statements such as "it is weak" should be read as meaning that there is no credible security analysis of the mechanism available, and/or that should an attack be published publicly, few people would likely be surprised. Also keep in mind that the key size mentioned is the actual key size, not the effective key space as far as a brute force attack is concerned. As you may infer from the descriptions, there is currently no encryption algorithm and only one checksum algorithm that inspire great confidence in its design. Hopefully this will change over time. `NULL' `NULL' is a dummy encryption suite for debugging. Encryption and decryption are identity functions. No integrity protection. It is weak. It is associated with the `NULL' checksum. `arcfour-hmac' `arcfour-hmac-exp' `arcfour-hmac-*' are a proprietary stream cipher with 56 bit (`arcfour-hmac-exp') or 128 bit (`arcfour-hmac') keys, used in a proprietary way described in an expired IETF draft `draft-brezak-win2k-krb-rc4-hmac-04.txt'. Deriving keys from passwords is supported, and is done by computing a message digest (MD4) of a 16-bit Unicode representation of the ASCII password, with no salt. Data is integrity protected with a keyed hash (HMAC-MD5), where the key is derived from the base key in a creative way. It is weak. It is associated with the `arcfour-hmac-md5' checksum. `des-cbc-none' `des-cbc-none' is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. It is weak, because it offers no integrity protection. This is typically only used by RFC 1964 GSS-API implementations (which try to protect integrity using an ad-hoc solution). It is associated with the `NULL' checksum. `des-cbc-crc' `des-cbc-crc' is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using the key as IV (*note Key as initialization vector::). The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted `CRC32'-like checksum. It is weak. It is associated with the `rsa-md5-des' checksum. `des-cbc-md4' `des-cbc-md4' is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD4 hash. It is weak. It is associated with the `rsa-md4-des' checksum. `des-cbc-md5' `des-cbc-md5' is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD5 hash. It is weak. It is associated with the `rsa-md5-des' checksum. This is the strongest RFC 1510 interoperable encryption mechanism. `des3-cbc-none' `des3-cbc-none' is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by the same algorithm as `des3-cbc-sha1-kd'. It is weak, because it offers no integrity protection. This is typically only used by GSS-API implementations (which try to protect integrity using an ad-hoc solution) for interoperability with some existing Kerberos GSS implementations. It is associated with the `NULL' checksum. `des3-cbc-sha1-kd' `des3-cbc-sha1-kd' is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by a algorithm based on the paper "A Better Key Schedule For DES-like Ciphers" (1) by Uri Blumenthal and Steven M. Bellovin (it is not clear if the algorithm, and the way it is used, is used by any other protocols, although it seems unlikely). Data is integrity protected with a keyed SHA1 hash in HMAC mode. It has no security proof, but is assumed to provide adequate security in the sense that knowledge on how to crack it is not known to the public. Note that the key derivation function is not widely used outside of Kerberos, hence not widely studied. It is associated with the `hmac-sha1-des3-kd' checksum. `aes128-cts-hmac-sha1-96' `aes256-cts-hmac-sha1-96' `aes128-cts-hmac-sha1-96' and `aes256-cts-hmac-sha1-96' is AES encryption and decryption with 128 bit and 256 bit key, respectively, and 16 byte blocks in CBC mode with Cipher Text Stealing. Cipher Text Stealing means data length of encrypted data is preserved (pure CBC add up to 7 pad characters). The keys can be derived from passwords with RSA Laboratories PKCS#5 Password Based Key Derivation Function 2(2), which is allegedly provably secure in a random oracle model. Data is integrity protected with a keyed SHA1 hash, in HMAC mode, truncated to 96 bits. There is no security proof, but the schemes are assumed to provide adequate security in the sense that knowledge on how to crack them is not known to the public. Note that AES has yet to receive the test of time, and the AES cipher encryption mode (CBC with Ciphertext Stealing, and a non-standard IV output) is not widely standardized (hence not widely studied). It is associated with the `hmac-sha1-96-aes128' and `hmac-sha1-96-aes256' checksums, respectively. The protocol do not include any way to negotiate which checksum mechanisms to use, so in most cases the associated checksum will be used. However, checksum mechanisms can be used with other encryption mechanisms, as long as they are compatible in terms of key format etc. Here are the names of the supported checksum mechanisms, with some notes on their status and the compatible encryption mechanisms. They are ordered by increased security as perceived by the author. `NULL' `NULL' is a dummy checksum suite for debugging. It provides no integrity. It is weak. It is compatible with the `NULL' encryption mechanism. `arcfour-hmac-md5' `arcfour-hmac-md5' is a keyed HMAC-MD5 checksum computed on a MD5 message digest, in turn computed on a four byte message type indicator concatenated with the application data. (The `arcfour' designation is thus somewhat misleading, but since this checksum mechanism is described in the same document as the `arcfour' encryption mechanisms, it is not a completely unnatural designation.) It is weak. It is compatible with all encryption mechanisms. `rsa-md4' `rsa-md4' is a unkeyed MD4 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms. `rsa-md4-des' `rsa-md4-des' is a DES CBC encryption of one block of random data and a unkeyed MD4 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the `des-cbc-crc', `des-cbc-md4', `des-cbc-md5' encryption mechanisms. `rsa-md5' `rsa-md5' is a unkeyed MD5 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms. `rsa-md5-des' `rsa-md5-des' is a DES CBC encryption of one block of random data and a unkeyed MD5 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the `des-cbc-crc', `des-cbc-md4', `des-cbc-md5' encryption mechanisms. `hmac-sha1-des3-kd' `hmac-sha1-des3-kd' is a keyed SHA1 hash in HMAC mode computed over the message. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of `des3-cbc-sha1-kd', which does not appear to be widely used outside Kerberos and hence not widely studied). It has no security proof, but is assumed to provide good security. The weakest part is likely the proprietary key derivation function. It is compatible with the `des3-cbc-sha1-kd' encryption mechanism. `hmac-sha1-96-aes128' `hmac-sha1-96-aes256' `hmac-sha1-96-aes*' are keyed SHA1 hashes in HMAC mode computed over the message and then truncated to 96 bits. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of `aes*-cts-hmac-sha1-96', i.e., PKCS#5). It has no security proof, but is assumed to provide good security. It is compatible with the `aes*-cts-hmac-sha1-96' encryption mechanisms. Several of the cipher suites have long names that can be hard to memorize. For your convenience, the following short-hand aliases exists. They can be used wherever the full encryption names are used. `arcfour' Alias for `arcfour-hmac'. `des-crc' Alias for `des-cbc-crc'. `des-md4' Alias for `des-cbc-md4'. `des-md5' `des' Alias for `des-cbc-md5'. `des3' `3des' Alias for `des3-cbc-sha1-kd'. `aes128' Alias for `aes128-cts-hmac-sha1-96'. `aes' `aes256' Alias for `aes256-cts-hmac-sha1-96'. ---------- Footnotes ---------- (1) `http://www.research.att.com/~smb/papers/ides.pdf' (2) `http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/'  File: shishi.info, Node: Supported Platforms, Next: Getting help, Prev: Cryptographic Overview, Up: Introduction 1.5 Supported Platforms ======================= Shishi has at some point in time been tested on the following platforms. Online build reports for each platforms and Shishi version is available at `http://autobuild.josefsson.org/shishi/'. 1. Debian GNU/Linux 3.0 (Woody) GCC 2.95.4 and GNU Make. This is the main development platform. `alphaev67-unknown-linux-gnu', `alphaev6-unknown-linux-gnu', `arm-unknown-linux-gnu', `armv4l-unknown-linux-gnu', `hppa-unknown-linux-gnu', `hppa64-unknown-linux-gnu', `i686-pc-linux-gnu', `ia64-unknown-linux-gnu', `m68k-unknown-linux-gnu', `mips-unknown-linux-gnu', `mipsel-unknown-linux-gnu', `powerpc-unknown-linux-gnu', `s390-ibm-linux-gnu', `sparc-unknown-linux-gnu', `sparc64-unknown-linux-gnu'. 2. Debian GNU/Linux 2.1 GCC 2.95.4 and GNU Make. `armv4l-unknown-linux-gnu'. 3. Tru64 UNIX Tru64 UNIX C compiler and Tru64 Make. `alphaev67-dec-osf5.1', `alphaev68-dec-osf5.1'. 4. SuSE Linux 7.1 GCC 2.96 and GNU Make. `alphaev6-unknown-linux-gnu', `alphaev67-unknown-linux-gnu'. 5. SuSE Linux 7.2a GCC 3.0 and GNU Make. `ia64-unknown-linux-gnu'. 6. SuSE Linux GCC 3.2.2 and GNU Make. `x86_64-unknown-linux-gnu' (AMD64 Opteron "Melody"). 7. RedHat Linux 7.2 GCC 2.96 and GNU Make. `alphaev6-unknown-linux-gnu', `alphaev67-unknown-linux-gnu', `ia64-unknown-linux-gnu'. 8. RedHat Linux 8.0 GCC 3.2 and GNU Make. `i686-pc-linux-gnu'. 9. RedHat Advanced Server 2.1 GCC 2.96 and GNU Make. `i686-pc-linux-gnu'. 10. Slackware Linux 8.0.01 GCC 2.95.3 and GNU Make. `i686-pc-linux-gnu'. 11. Mandrake Linux 9.0 GCC 3.2 and GNU Make. `i686-pc-linux-gnu'. 12. IRIX 6.5 MIPS C compiler, IRIX Make. `mips-sgi-irix6.5'. 13. AIX 4.3.2 IBM C for AIX compiler, AIX Make. `rs6000-ibm-aix4.3.2.0'. 14. HP-UX 11 HP-UX C compiler and HP Make. `ia64-hp-hpux11.22', `hppa2.0w-hp-hpux11.11'. 15. SUN Solaris 2.8 Sun WorkShop Compiler C 6.0 and SUN Make. `sparc-sun-solaris2.8'. 16. NetBSD 1.6 GCC 2.95.3 and GNU Make. `alpha-unknown-netbsd1.6', `i386-unknown-netbsdelf1.6'. 17. OpenBSD 3.1 and 3.2 GCC 2.95.3 and GNU Make. `alpha-unknown-openbsd3.1', `i386-unknown-openbsd3.1'. 18. FreeBSD 4.7 and 4.8 GCC 2.95.4 and GNU Make. `alpha-unknown-freebsd4.7', `alpha-unknown-freebsd4.8', `i386-unknown-freebsd4.7', `i386-unknown-freebsd4.8'. 19. MacOS X 10.2 Server Edition GCC 3.1 and GNU Make. `powerpc-apple-darwin6.5'. 20. Cross compiled to uClinux/uClibc on Motorola Coldfire. GCC 3.4 and GNU Make `m68k-uclinux-elf'. If you use Shishi on, or port Shishi to, a new platform please report it to the author (*note Bug Reports::).  File: shishi.info, Node: Getting help, Next: Commercial Support, Prev: Supported Platforms, Up: Introduction 1.6 Getting help ================ A mailing list where users of Shishi may help each other exists, and you can reach it by sending e-mail to . Archives of the mailing list discussions, and an interface to manage subscriptions, is available through the World Wide Web at `http://lists.gnu.org/mailman/listinfo/help-shishi'.  File: shishi.info, Node: Commercial Support, Next: Downloading and Installing, Prev: Getting help, Up: Introduction 1.7 Commercial Support ====================== Commercial support is available for users of Shishi. The kind of support that can be purchased may include: * Implement new features. Such as support for some optional part of the Kerberos standards, e.g. PKINIT, hardware token authentication. * Port Shishi to new platforms. This could include porting Shishi to an embedded platforms that may need memory or size optimization. * Integrate Kerberos 5 support in your existing project. * System design of components related to Kerberos 5. If you are interested, please write to: Simon Josefsson Datakonsult Hagagatan 24 113 47 Stockholm Sweden E-mail: simon@josefsson.org If your company provides support related to Shishi and would like to be mentioned here, contact the author (*note Bug Reports::).  File: shishi.info, Node: Downloading and Installing, Next: Bug Reports, Prev: Commercial Support, Up: Introduction 1.8 Downloading and Installing ============================== The package can be downloaded from several places, including: `ftp://alpha.gnu.org/pub/gnu/shishi/' The latest version is stored in a file, e.g., `shishi-1.0.2.tar.gz' where the `1.0.2' indicate the highest version number. The package is then extracted, configured and built like many other packages that use Autoconf. For detailed information on configuring and building it, refer to the `INSTALL' file that is part of the distribution archive. Here is an example terminal session that download, configure, build and install the package. You will need a few basic tools, such as `sh', `make' and `cc'. $ wget -q ftp://alpha.gnu.org/pub/gnu/shishi/shishi-1.0.2.tar.gz $ tar xfz shishi-1.0.2.tar.gz $ cd shishi-1.0.2/ $ ./configure ... $ make ... $ make install ... After this you should be prepared to continue with the user, administration or programming manual, depending on how you want to use Shishi. A few `configure' options may be relevant, summarized in the table. `--disable-des' `--disable-3des' `--disable-aes' `--disable-md' `--disable-null' `--disable-arcfour' Disable a cryptographic algorithm at compile time. Usually it is better to disable algorithms during run-time with the configuration file, but this allows you to reduce the code size slightly. `--disable-starttls' Disable the experimental TLS support for KDC connections. If you do not use a Shishi KDC, this support is of no use so you could safely disable it. `--without-stringprep' Disable internationalized string processing. For the complete list, refer to the output from `configure --help'.  File: shishi.info, Node: Bug Reports, Next: Contributing, Prev: Downloading and Installing, Up: Introduction 1.9 Bug Reports =============== If you think you have found a bug in Shishi, please investigate it and report it. * Please make sure that the bug is really in Shishi, and preferably also check that it hasn't already been fixed in the latest version. * You have to send us a test case that makes it possible for us to reproduce the bug. * You also have to explain what is wrong; if you get a crash, or if the results printed are not good and in that case, in what way. Make sure that the bug report includes all information you would need to fix this kind of bug for someone else. Please make an effort to produce a self-contained report, with something definite that can be tested or debugged. Vague queries or piecemeal messages are difficult to act on and don't help the development effort. If your bug report is good, we will do our best to help you to get a corrected version of the software; if the bug report is poor, we won't do anything about it (apart from asking you to send better bug reports). If you think something in this manual is unclear, or downright incorrect, or if the language needs to be improved, please also send a note. Send your bug report to: `bug-shishi@josefsson.org'  File: shishi.info, Node: Contributing, Prev: Bug Reports, Up: Introduction 1.10 Contributing ================= If you want to submit a patch for inclusion - from solve a typo you discovered, up to adding support for a new feature - you should submit it as a bug report (*note Bug Reports::). There are some things that you can do to increase the chances for it to be included in the official package. Unless your patch is very small (say, under 10 lines) we require that you assign the copyright of your work to the Free Software Foundation. This is to protect the freedom of the project. If you have not already signed papers, we will send you the necessary information when you submit your contribution. For contributions that doesn't consist of actual programming code, the only guidelines are common sense. Use it. For code contributions, a number of style guides will help you: * Coding Style. Follow the GNU Standards document (*note GNU Coding Standards: (standards)top.). If you normally code using another coding standard, there is no problem, but you should use `indent' to reformat the code (*note GNU Indent: (indent)top.) before submitting your work. * Use the unified diff format `diff -u'. * Return errors. The only valid reason for ever aborting the execution of the program is due to memory allocation errors, but for that you should call `shishi_xalloc_die' to allow the application to recover if it wants to. * Design with thread safety in mind. Don't use global variables. Don't even write to per-handle global variables unless the documented behaviour of the function you write is to write to the per-handle global variable. * Avoid using the C math library. It causes problems for embedded implementations, and in most situations it is very easy to avoid using it. * Document your functions. Use comments before each function headers, that, if properly formatted, are extracted into Texinfo manuals and GTK-DOC web pages. * Supply a ChangeLog and NEWS entries, where appropriate.  File: shishi.info, Node: User Manual, Next: Administration Manual, Prev: Introduction, Up: Top 2 User Manual ************* Usually Shishi interacts with you to get some initial authentication information like a password, and then contacts a server to receive a so called ticket granting ticket. From now on, you rarely interact with Shishi directly. Applications that need security services instruct the Shishi library to use the ticket granting ticket to get new tickets for various servers. An example could be if you log on to a host remotely via `telnet'. The host usually requires authentication before permitting you in. The `telnet' client uses the ticket granting ticket to get a ticket for the server, and then uses this ticket to authenticate you against the server (typically the server is also authenticated to you). You perform the initial authentication by typing `shishi' at the prompt. Sometimes it is necessary to supply options telling Shishi what your principal name (user name in the Kerberos realm) or your realm is. In the example, I specify the client name `simon@JOSEFSSON.ORG'. $ shishi simon@JOSEFSSON.ORG Enter password for `simon@JOSEFSSON.ORG': simon@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:44:49 2003 Endtime: Fri Aug 15 05:01:29 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: INITIAL (512) $ As you can see, Shishi also prints a short description of the ticket received. A logical next step is to display all tickets you have received. By the way, the tickets are usually stored as text in `~/.shishi/tickets'. This is achieved by typing `shishi --list'. $ shishi --list Tickets in `/home/jas/.shishi/tickets': jas@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: krbtgt/JOSEFSSON.ORG key des-cbc-md5 (3) Ticket key: des-cbc-md5 (3) protected by des-cbc-md5 (3) Ticket flags: INITIAL (512) jas@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Starttime: Fri Aug 15 04:49:49 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: host/latte.josefsson.org key des-cbc-md5 (3) Ticket key: des-cbc-md5 (3) protected by des-cbc-md5 (3) 2 tickets found. $ As you can see, I had a ticket for the server `host/latte.josefsson.org' which was generated by `telnet':ing to that host. If, for some reason, you want to manually get a ticket for a specific server, you can use the `shishi --server-name' command. Normally, however, the application that uses Shishi will take care of getting a ticket for the appropriate server, so you normally wouldn't need to issue this command. $ shishi --server-name=user/billg --encryption-type=des-cbc-md4 jas@JOSEFSSON.ORG: Authtime: Fri Aug 15 04:49:46 2003 Starttime: Fri Aug 15 04:54:33 2003 Endtime: Fri Aug 15 05:06:26 2003 Server: user/billg key des-cbc-md4 (2) Ticket key: des-cbc-md4 (2) protected by des-cbc-md5 (3) $ As you can see, I acquired a ticket for `user/billg' with a `des-cbc-md4' (*note Cryptographic Overview::) encryption key specified with the `--encryption-type' parameter. To wrap up this introduction, let us see how you can remove tickets. You may want to do this if you leave your terminal for lunch or similar, and don't want someone to be able to copy the file and then use your credentials. Note that this only destroys the tickets locally, it does not contact any server telling that these credentials are no longer valid. So, if someone stole your ticket file, you must still contact your administrator and have them reset your account. Simply using this switch is not sufficient. $ shishi --server-name=imap/latte.josefsson.org --destroy 1 ticket removed. $ shishi --server-name=foobar --destroy No tickets removed. $ shishi --destroy 3 tickets removed. $ Since the `--server-name' parameter takes a long string to type, it is possible to type the server name directly, after the client name. The following example demonstrates an AS-REQ followed by a TGS-REQ for a specific server (assuming you did not have any tickets to begin with). $ src/shishi simon@latte.josefsson.org imap/latte.josefsson.org Enter password for `simon@latte.josefsson.org': simon@latte.josefsson.org: Acquired: Wed Aug 27 17:21:06 2003 Expires: Wed Aug 27 17:37:46 2003 Server: imap/latte.josefsson.org key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (12) $ Refer to the reference manual for all available parameters (*note Parameters for shishi::). The rest of this section contains descriptions of more specialized usage modes that can be ignored by most users. 2.1 Proxiable and Proxy Tickets =============================== At times it may be necessary for a principal to allow a service to perform an operation on its behalf. The service must be able to take on the identity of the client, but only for a particular purpose. A principal can allow a service to take on the principal's identity for a particular purpose by granting it a proxy. The process of granting a proxy using the proxy and proxiable flags is used to provide credentials for use with specific services. Though conceptually also a proxy, users wishing to delegate their identity in a form usable for all purpose MUST use the ticket forwarding mechanism described in the next section to forward a ticket-granting ticket. The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket. This flag allows a client to pass a proxy to a server to perform a remote request on its behalf (e.g. a print service client can give the print server a proxy to access the client's files on a particular file server in order to satisfy a print request). In order to complicate the use of stolen credentials, Kerberos tickets are usually valid from only those network addresses specifically included in the ticket[4]. When granting a proxy, the client MUST specify the new network address from which the proxy is to be used, or indicate that the proxy is to be issued for use from any address. The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail. Here is how you would acquire a PROXY ticket for the service `imap/latte.josefsson.org': $ shishi jas@JOSEFSSON.ORG imap/latte.josefsson.org --proxy Enter password for `jas@JOSEFSSON.ORG': libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:02:35 2003 Starttime: Mon Sep 8 20:02:36 2003 Endtime: Tue Sep 9 04:02:35 2003 Server: imap/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXY (16) $ As you noticed, this asked for your password. The reason is that proxy tickets must be acquired using a proxiable ticket granting ticket, which was not present. If you often need to get proxy tickets, you may acquire a proxiable ticket granting ticket from the start: $ shishi --proxiable Enter password for `jas@JOSEFSSON.ORG': jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:04:27 2003 Endtime: Tue Sep 9 04:04:27 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXIABLE INITIAL (520) Then you should be able to acquire proxy tickets based on that ticket granting ticket, as follows: $ shishi jas@JOSEFSSON.ORG imap/latte.josefsson.org --proxy libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:04:27 2003 Starttime: Mon Sep 8 20:04:32 2003 Endtime: Tue Sep 9 04:04:27 2003 Server: imap/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: PROXY (16) $ 2.2 Forwardable and Forwarded Tickets ===================================== Authentication forwarding is an instance of a proxy where the service that is granted is complete use of the client's identity. An example where it might be used is when a user logs in to a remote system and wants authentication to work from that system as if the login were local. The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket. This flag allows for authentication forwarding without requiring the user to enter a password again. If the flag is not set, then authentication forwarding is not permitted, but the same result can still be achieved if the user engages in the AS exchange specifying the requested network addresses and supplies a password. The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets. If addressless tickets are forwarded from one system to another, clients SHOULD still use this option to obtain a new TGT in order to have different session keys on the different systems. Here is how you would acquire a FORWARDED ticket for the service `host/latte.josefsson.org': $ shishi jas@JOSEFSSON.ORG host/latte.josefsson.org --forwarded Enter password for `jas@JOSEFSSON.ORG': libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:07:11 2003 Starttime: Mon Sep 8 20:07:12 2003 Endtime: Tue Sep 9 04:07:11 2003 Server: host/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDED (4) $ As you noticed, this asked for your password. The reason is that forwarded tickets must be acquired using a forwardable ticket granting ticket, which was not present. If you often need to get forwarded tickets, you may acquire a forwardable ticket granting ticket from the start: $ shishi --forwardable Enter password for `jas@JOSEFSSON.ORG': jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:08:53 2003 Endtime: Tue Sep 9 04:08:53 2003 Server: krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDABLE INITIAL (514) $ Then you should be able to acquire forwarded tickets based on that ticket granting ticket, as follows: $ shishi jas@JOSEFSSON.ORG host/latte.josefsson.org --forwarded libshishi: warning: KDC bug: Reply encrypted using wrong key. jas@JOSEFSSON.ORG: Authtime: Mon Sep 8 20:08:53 2003 Starttime: Mon Sep 8 20:08:57 2003 Endtime: Tue Sep 9 04:08:53 2003 Server: host/latte.josefsson.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16) Ticket flags: FORWARDED (4) $  File: shishi.info, Node: Administration Manual, Next: Reference Manual, Prev: User Manual, Up: Top 3 Administration Manual *********************** Here you will learn how to set up, run and maintain the Shishi Kerberos server. Kerberos is incompatible with the standard Unix `/etc/passwd' password database(1), therefore the first step will be to create a Kerberos user database. Shishi's user database system is called Shisa. Once Shisa has been configured, you can then start the server and begin issuing Kerberos tickets to your users. The Shishi server is called `shishid'. After getting the server up and running, we discuss how you can set up multiple Kerberos servers, to increase availability or offer load-balancing. Finally, we include some information intended for developers, that will enable you to customize Shisa to use an external user database, such as a LDAP server or SQL database. * Menu: * Introduction to Shisa:: Explanation of the Shishi user database. * Configuring Shisa:: Define the user database in Shisa. * Using Shisa:: How to add realms and principals to database. * Starting Shishid:: Issue Kerberos tickets to your users. * Configuring DNS for KDC:: Placing the KDC address in DNS is useful. * Kerberos via TLS:: How to setup Shishi to use TLS. * Multiple servers:: High availability and load-balancing. * Developer information:: Writing your own Shisa database backend. ---------- Footnotes ---------- (1) And besides, Shishi is intended to work on non-Unix platforms as well.  File: shishi.info, Node: Introduction to Shisa, Next: Configuring Shisa, Up: Administration Manual 3.1 Introduction to Shisa ========================= The user database part of Shishi is called Shisa. The Shisa library is independent of the core Shishi library. Shisa is responsible for storing the name of your realms, the name of your principals (users), accounting information for the users (i.e., when each account starts to be valid and when it expires), and the cryptographic keys each user has. Some Kerberos internal data can also be stored, such as the key version number, the last dates for when various ticket requests were made, the cryptographic salt, string-to-key parameters and password for each user. Not all information need to be stored. For example, in some situations it is prudent to leave the password field empty, so that somebody who manages to steal the user database will only be able to compromise your system, and not any other systems were your user may have re-used the same password. On the other hand, you may already be storing the password in your customized database, in which case being able to change it via the Shisa interface can be useful. Shisa is a small (a few thousand lines of C code) standalone library. Shisa does not depend on the Shishi library. Because a user database with passwords may be useful for other applications as well (e.g., GNU SASL), it might be separated into its own project later on. You should keep this in mind, so that you don't consider writing a Shisa backend for your own database as a purely Shishi specific project. You can, for example, choose to use the Shisa interface in your own applications to have a simple interface to your user database. Your experience and feedback is appreciated if you have chosen to explore this. Note that the Shisa database does not expose everything you may want to know about a user, such as its full human name, telephone number or even the user's login account name or home directory. It only stores what is needed to authenticate a peer claiming to be an entity. Thus it does not make sense to replace your current user database or `/etc/passwd' with data derived from the Shisa database. Instead, it is intended that you write a Shisa backend that exports some of the information stored in your user database. You may be able to replace some existing functionality, such as the password field in `/etc/passwd' with a Kerberos PAM module, but there is no requirement for doing so.  File: shishi.info, Node: Configuring Shisa, Next: Using Shisa, Prev: Introduction to Shisa, Up: Administration Manual 3.2 Configuring Shisa ===================== The configuration file for Shisa is typically stored in `/usr/local/etc/shishi/shisa.conf'. You do not have to modify this file, the defaults should be acceptable to first-time users. The file is used to define where your user database resides, and some options such as making the database read-only, or whether errors detected when accessing the database should be ignored. (The latter could be useful if the server is a remote LDAP server that might be unavailable, and then you would want to fall back to a local copy of the database.) The default will store the user database using directories and files, rooted by default in `/usr/local/var/shishi'. You can use standard file permission settings to control access to the directory hierarchy. It is strongly recommended to restrict access to the directory. Storing the directory on local storage, i.e., hard disk or removable media, is recommended. We discourage placing the database on a network file system, but realize this can be useful in some situations (*note Multiple servers::). See the reference manual (*note Shisa Configuration::) for the details of the configuration file. Again, you are not expected to need to modify anything unless you are an experienced Shishi administrator.  File: shishi.info, Node: Using Shisa, Next: Starting Shishid, Prev: Configuring Shisa, Up: Administration Manual 3.3 Using Shisa =============== There is a command line interface to the Shisa library, aptly named `shisa'. You will use this tool to add, remove, and change information stored in the database about realms, principals, and keys. The tool can also be used to "dump" all information in the database, for backup or debugging purposes. (Currently the output format cannot be read by any tool, but functionality to do this will be added in the future, possibly as a read-only file-based Shisa database backend.) The reference manual (*note Parameters for shisa::) explains all parameters, but here we will give you a walk-through of the typical uses of the tool. Installing Shishi usually creates a realm with two principals: one ticket granting ticket for the realm, and one host key for the server. This is what you typically need to get started, but it doesn't serve our purposes, so we start by removing the principals and the realm. To do that, we need to figure out the name of the realm. The `--list' or `--dump' parameters can be used for this. (Most "long" parameters, like `--dump', have shorter names as well, in this case `-d', *note Parameters for shisa::). jas@latte:~$ shisa -d latte krbtgt/latte Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt lattekrbtgt/latte. host/latte Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt lattehost/latte. jas@latte:~$ The realm names are printed at column 0, the principal names are indented with one `TAB' character (aka `\t' or ASCII 0x09 Horizontal Tabulation), and the information about each principal is indented with two `TAB' characters. The above output means that there is one realm `latte' with two principals: `krbtgt/latte' (which is used to authenticate Kerberos ticket requests) and `host/latte' (used to authenticate host-based applications like Telnet). They were created during `make install' on a host called `latte'. If the installation did not create a default database for you, you might get an error similar to the following output. jas@latte:~$ shisa -d shisa: Cannot initialize `file' database backend. Location `/usr/local/var/shishi' and options `N/A'. shisa: Initialization failed: Shisa database could not be opened. jas@latte:~$ This indicates that the database does not exist. For a file database, you can create it simply by creating the directory, as follows. Note the access permission change with `chmod'. Typically the `root' user would own the files, but as these examples demonstrate, setting up a Kerberos server does not require root access. Indeed, it may be prudent to run all Shishi applications as a special non-`root' user, and have all Shishi related files owned by that user, so that any security vulnerabilities do not lead to a system compromise. (However, if the user database is ever stolen, system compromises of other systems may be inoccured, should you use, e.g., a kerberized Telnet.) jas@latte:~$ mkdir /usr/local/var/shishi jas@latte:~$ chmod go-rwx /usr/local/var/shishi Back to the first example, where you have a realm `latte' with some principals. We want to remove the realm to demonstrate how you create the realm from scratch. (Of course, you can have more than one realm in the database, but for this example we assume you want to set up a realm named the same as Shishi guessed you would name it, so the existing realm need to be removed first.) The `--remove' (short form `-r') parameter is used for this purpose, as follows. jas@latte:~$ shisa -r latte host/latte Removing principal `host/latte@latte'... Removing principal `host/latte@latte'...done jas@latte:~$ shisa -r latte krbtgt/latte Removing principal `krbtgt/latte@latte'... Removing principal `krbtgt/latte@latte'...done jas@latte:~$ shisa -r latte Removing realm `latte'... Removing realm `latte'...done jas@latte:~$ You may be asking yourself "What if the realm has many more principals?". If you fear manual labor (or a small `sed' script, recall the format of `--list'?), don't worry, there is a `--force' (short form `-f') flag. Use it with care. Here is a faster way to do the above: jas@latte:~$ shisa -r latte -f Removing principal `krbtgt/latte@latte'... Removing principal `krbtgt/latte@latte'...done Removing principal `host/latte@latte'... Removing principal `host/latte@latte'...done Removing realm `latte'... Removing realm `latte'...done jas@latte:~$ You should now have a working, but empty, Shisa database. Let's set up the realm manually, step by step. The first step is to decide on a name for your realm. The full story is explained elsewhere (*note Realm and Principal Naming::), but the short story is to take your DNS domain name and translate it to upper case. For example, if your organization uses `example.org' it is a good idea to use `EXAMPLE.ORG' as the name of your Kerberos realm. We'll use `EXAMPLE.ORG' as the realm name in these examples. Let's create the realm. jas@latte:~$ shisa -a EXAMPLE.ORG Adding realm `EXAMPLE.ORG'... Adding realm `EXAMPLE.ORG'...done jas@latte:~$ Currently, there are no properties associated with entire realms. In the future, it may be possible to set a default realm-wide password expiry policy or similar. Each realm normally has one principal that is used for authenticating against the "ticket granting service" on the Kerberos server with a ticket instead of using the password. This is used by the user when she acquire a ticket for a server. The principal must look like `krbtgt/REALM' (*note Name of the TGS: krbtgt.). Let's create it. jas@latte:~$ shisa -a EXAMPLE.ORG krbtgt/EXAMPLE.ORG Adding principal `krbtgt/EXAMPLE.ORG@EXAMPLE.ORG'... Adding principal `krbtgt/EXAMPLE.ORG@EXAMPLE.ORG'...done jas@latte:~$ Now that wasn't difficult, although not very satisfying either. What does adding a principal mean? The name is created, obviously, but it also means setting a few values in the database. Let's view the entry to find out which values. jas@latte:~$ shisa -d EXAMPLE.ORG krbtgt/EXAMPLE.ORG Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Salt EXAMPLE.ORGkrbtgt/EXAMPLE.ORG. jas@latte:~$ To use host based security services like SSH or Telnet with Kerberos, each host must have a key shared between the host and the KDC. The key is typically stored in `/usr/local/etc/shishi/shishi.keys'. We assume your server is called `mail.example.org' and we create the principal. To illustrate a new parameter, we also set the specific algorithm to use by using the `--encryption-type' (short form `-E') parameter. jas@latte:~$ shisa -a EXAMPLE.ORG host/mail.example.org -E des3 Adding principal `host/mail.example.org@EXAMPLE.ORG'... Adding principal `host/mail.example.org@EXAMPLE.ORG'...done jas@latte:~$ To export the key, there is another Shisa parameter `--keys' that will print the key in a format that is recognized by Shishi. Let's use it to print the host key. jas@latte:~$ shisa -d --keys EXAMPLE.ORG host/mail.example.org EXAMPLE.ORG host/mail.example.org Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des3-cbc-sha1-kd (0x10, 16). -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: host/mail.example.org Realm: EXAMPLE.ORG iQdA8hxdvOUHZNliZJv7noM02rXHV8gq -----END SHISHI KEY----- Salt EXAMPLE.ORGhost/mail.example.org. jas@latte:~$ So to set up the host, simply redirect output to the host key file. jas@latte:~$ shisa -d --keys EXAMPLE.ORG \ host/mail.example.org >> /usr/local/etc/shishi/shishi.keys jas@latte:~$ The next logical step is to create a principal for some user, so you can use your password to get a Ticket Granting Ticket via the Authentication Service (AS) from the KDC, and then use the Ticket Granting Service (TGS) from the KDC to get a ticket for a specific host, and then send that ticket to the host to authenticate yourself. Creating this end-user principle is slightly different from the earlier steps, because you want the key to be derived from a password instead of being a random key. The `--password' parameter indicate this. This make the tool ask you for the password. jas@latte:~$ shisa -a EXAMPLE.ORG simon --password Password for `simon@EXAMPLE.ORG': Adding principal `simon@EXAMPLE.ORG'... Adding principal `simon@EXAMPLE.ORG'...done jas@latte:~$ The only special thing about this principal now is that it has a `password' field set in the database. jas@latte:~$ shisa -d EXAMPLE.ORG simon --keys EXAMPLE.ORG simon Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). -----BEGIN SHISHI KEY----- Keytype: 18 (aes256-cts-hmac-sha1-96) Principal: simon Realm: EXAMPLE.ORG Ja7ciNtrAI3gtodLaVDQ5zhcH58ffk0kS5tGAM7ILvM= -----END SHISHI KEY----- Salt EXAMPLE.ORGsimon. Password foo. jas@latte:~$ You should now be ready to start the KDC, which is explained in the next section (*note Starting Shishid::), and get tickets as explained earlier (*note User Manual::).  File: shishi.info, Node: Starting Shishid, Next: Configuring DNS for KDC, Prev: Using Shisa, Up: Administration Manual 3.4 Starting Shishid ==================== The Shishi server, or Key Distribution Center (KDC), is called Shishid. Shishid is responsible for listening on UDP and TCP ports for Kerberos requests. Currently it can handle initial ticket requests (Authentication Service, or AS), typically authenticated with keys derived from passwords, and subsequent ticket requests (Ticket Granting Service, or TGS), typically authenticated with the key acquired during an AS exchange. Currently there is very little configuration available, the only variables are which ports the server should listen on and an optional user name to `setuid' into after successfully listening to the ports. By default, Shishid listens on the `kerberos' service port (typically translated to 88 via `/etc/services') on the UDP and TCP transports via IPv4 and (if your machine support it) IPv6 on all interfaces on your machine. Here is a typical startup. latte:/home/jas/src/shishi# /usr/local/sbin/shishid Initializing GNUTLS... Initializing GNUTLS...done Listening on IPv4:*:kerberos/udp...done Listening on IPv4:*:kerberos/tcp...done Listening on IPv6:*:kerberos/udp...failed socket: Address family not supported by protocol Listening on IPv6:*:kerberos/tcp...failed socket: Address family not supported by protocol Listening on 2 ports... Running as root is not recommended. Any security problem in shishid and your host may be compromised. Therefor, we recommend using the `--setuid' parameter, as follows. latte:/home/jas/src/shishi# /usr/local/sbin/shishid --setuid=jas Initializing GNUTLS... Initializing GNUTLS...done Listening on IPv4:*:kerberos/udp...done Listening on IPv4:*:kerberos/tcp...done Listening on IPv6:*:kerberos/udp...failed socket: Address family not supported by protocol Listening on IPv6:*:kerberos/tcp...failed socket: Address family not supported by protocol Listening on 2 ports... User identity set to `jas' (22541)... An alternative is to run shishid on an alternative port as a non-privileged user. To continue the example of setting up the `EXAMPLE.ORG' realm as a non-privileged user from the preceding section, we start the server listen on port 4711 via UDP on IPv4. jas@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/udp Initializing GNUTLS... Initializing GNUTLS...done Listening on *:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on *:4711/tcp socket 4 If you have set up the Shisa database as in the previous example, you can now acquire tickets as follows. jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \ simon@EXAMPLE.ORG Enter password for `simon@EXAMPLE.ORG': simon@EXAMPLE.ORG: Authtime: Fri Dec 12 01:41:01 2003 Endtime: Fri Dec 12 01:57:41 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE RENEWABLE INITIAL (12) jas@latte:~$ The output from Shishid on a successful invocation would look like: shishid: Has 131 bytes from *:4711/udp on socket 4 shishid: Processing 131 from *:4711/udp on socket 4 shishid: Trying AS-REQ shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for *:4711/udp on socket 4 shishid: Sending 511 bytes to *:4711/udp socket 4 via UDP shishid: Listening on *:4711/udp socket 4 You may use the '-v' parameter for Shishid and Shishi to generate more debugging information. To illustrate what an application, such as the Shishi patched versions of GNU lsh or Telnet from GNU InetUtils, would do when contacting the host `mail.example.org' we illustrate using the TGS service as well. jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \ simon@EXAMPLE.ORG host/mail.example.org simon@EXAMPLE.ORG: Authtime: Fri Dec 12 01:46:54 2003 Endtime: Fri Dec 12 02:03:34 2003 Server: host/mail.example.org key des3-cbc-sha1-kd (16) Ticket key: des3-cbc-sha1-kd (16) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (45398796) jas@latte:~$ This conclude our walk-through of setting up a new Kerberos realm using Shishi. It is quite likely that one or more steps failed, and if so we encourage you to debug it and submit a patch, or at least report it as a problem. Heck, even letting us know if you got this far would be of interest. *Note Bug Reports::.  File: shishi.info, Node: Configuring DNS for KDC, Next: Kerberos via TLS, Prev: Starting Shishid, Up: Administration Manual 3.5 Configuring DNS for KDC =========================== Making sure the configuration files on all hosts running Shishi clients include the addresses of your server is tedious. If the configuration files do not mention the KDC address for a realm, Shishi will try to look up the information from DNS. In order for Shishi to find that information, you need to add the information to DNS. For this to work well, you need to set up a DNS zone with the same name as your Kerberos realm. The easiest is if you own the publicly visible DNS name, such as `example.org' if your realm is `EXAMPLE.ORG', but you can set up an internal DNS server with the information for your realm only. If this is done, you do not need to keep configuration files updated for the KDC addressing information. 3.5.1 DNS vs. Kerberos - Case Sensitivity of Realm Names -------------------------------------------------------- In Kerberos, realm names are case sensitive. While it is strongly encouraged that all realm names be all upper case this recommendation has not been adopted by all sites. Some sites use all lower case names and other use mixed case. DNS on the other hand is case insensitive for queries but is case preserving for responses to TXT queries. Since "MYREALM", "myrealm", and "MyRealm" are all different it is necessary that only one of the possible combinations of upper and lower case characters be used. This restriction may be lifted in the future as the DNS naming scheme is expanded to support non-ASCII names. 3.5.2 Overview - KDC location information ----------------------------------------- KDC location information is to be stored using the DNS SRV RR [RFC 2052]. The format of this RR is as follows: Service.Proto.Realm TTL Class SRV Priority Weight Port Target The Service name for Kerberos is always "_kerberos". The Proto can be either "_udp", "_tcp", or "_tls._tcp". If these SRV records are to be used, a "_udp" record MUST be included. If the Kerberos implementation supports TCP transport, a "_tcp" record MUST be included. When using "_tcp" with "_kerberos", this indicates a "raw" TCP connection without any additional encapsulation. A "_tls._tcp" record MUST be specified for all Kerberos implementations that support communication with the KDC across TCP sockets encapsulated using TLS [RFC2246] (*note STARTTLS protected KDC exchanges::). The Realm is the Kerberos realm that this record corresponds to. TTL, Class, SRV, Priority, Weight, and Target have the standard meaning as defined in RFC 2052. As per RFC 2052 the Port number should be the value assigned to "kerberos" by the Internet Assigned Number Authority (88). 3.5.3 Example - KDC location information ---------------------------------------- These are DNS records for a Kerberos realm ASDF.COM. It has two Kerberos servers, kdc1.asdf.com and kdc2.asdf.com. Queries should be directed to kdc1.asdf.com first as per the specified priority. Weights are not used in these records. _kerberos._udp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._udp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. _kerberos._tcp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._tcp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. _kerberos._tls._tcp.ASDF.COM. IN SRV 0 0 88 kdc1.asdf.com. _kerberos._tls._tcp.ASDF.COM. IN SRV 1 0 88 kdc2.asdf.com. 3.5.4 Security considerations ----------------------------- As DNS is deployed today, it is an unsecure service. Thus the infor- mation returned by it cannot be trusted. Current practice for REALM to KDC mapping is to use hostnames to indicate KDC hosts (stored in some implementation-dependent location, but generally a local config file). These hostnames are vulnerable to the standard set of DNS attacks (denial of service, spoofed entries, etc). The design of the Kerberos protocol limits attacks of this sort to denial of service. However, the use of SRV records does not change this attack in any way. They have the same vulnerabilities that already exist in the common practice of using hostnames for KDC locations. Implementations SHOULD provide a way of specifying this information locally without the use of DNS. However, to make this feature worthwhile a lack of any configuration information on a client should be interpretted as permission to use DNS.  File: shishi.info, Node: Kerberos via TLS, Next: Multiple servers, Prev: Configuring DNS for KDC, Up: Administration Manual 3.6 Kerberos via TLS ==================== If Shishi is built with support for GNUTLS, the messages exchanged between clients and Shishid can be protected with TLS. TLS is only available over TCP connections. A full discussion of the features TLS have is out of scope here, but in short it means the communication is integrity and privacy protected, and that users can use OpenPGP, X.509 or SRP (i.e., any mechanism supported by TLS) to authenticate themselves to the Kerberos server. For details on the implementation, *Note STARTTLS protected KDC exchanges::. 3.6.1 Setting up TLS resume --------------------------- Resuming earlier TLS session is supported and enabled by default. This improves the speed of the TLS handshake, because results from earlier negotiations can be re-used. Currently the TLS resume database is stored in memory (in constract to storing it on disk), in both the client and in the server. Because the server typically runs for a long time, this is not a problem for that side. The client is typically not a long-running process though; the client usually is invoked as part of applications like `telnet' or `login'. However, because each use of the client library typically result in a ticket, which is stored on disk and re-used by later processes, this is likely not a serious problem because the number of different tickets required by a user is usually quite small. For the client, TLS resume is typically only useful when you perform an initial authentication (using a password) followed by a ticket request for a service, in the same process. You can configure the server, `shishid' to never use TLS resume, or to increase or decrease the number of distinct TLS connections that can be resumed before they are garbage collected, see the `--resume-limit' parameter (*note Parameters for shishid::). 3.6.2 Setting up Anonymous TLS ------------------------------ Anonymous TLS is the simplest to set up and use. In fact, only the client need to be informed that your KDC support TLS. This can be done in the configuration file with the `/tls' parameter for `kdc-realm' (*note Shishi Configuration: realm-kdc.), or by placing the KDC address in DNS using the `_tls' SRV record (*note Configuring DNS for KDC::). Let's start Shishid, listening on a TCP socket. TLS require TCP. TCP sockets are automatically upgraded to TLS if the client request it. jas@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/tcp Initializing GNUTLS...done Listening on IPv4:*:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on IPv4:*:4711/tcp socket 4 Let's use the client to talk with it, using TLS. jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls \ simon@EXAMPLE.ORG Enter password for `simon@EXAMPLE.ORG': simon@EXAMPLE.ORG: Authtime: Tue Dec 16 05:20:47 2003 Endtime: Tue Dec 16 05:37:27 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE (12) jas@latte:~$ On success, the server will print the following debug information. shishid: Accepted socket 6 from socket 4 as IPv4:*:4711/tcp peer 127.0.0.1 shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 4 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying STARTTLS shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `Anon DH', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed shishid: TLS anonymous authentication with 1024 bit Diffie-Hellman shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 131 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Processing 131 from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying AS-REQ shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for IPv4:*:4711/tcp peer 127.0.0.1 on socket 6 shishid: Sending 511 bytes to IPv4:*:4711/tcp peer 127.0.0.1 socket 6 via TLS shishid: Listening on IPv4:*:4711/tcp socket 4 shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Peer IPv4:*:4711/tcp peer 127.0.0.1 disconnected on socket 6 shishid: Closing IPv4:*:4711/tcp peer 127.0.0.1 socket 6 shishid: Listening on IPv4:*:4711/tcp socket 4 3.6.3 Setting up X.509 authenticated TLS ---------------------------------------- Setting up X.509 authentication is slightly more complicated than anonymous authentication. You need a X.509 certificate authority (CA) that can generate certificates for your Kerberos server and Kerberos clients. It is often easiest to setup the CA yourself. Managing a CA can be a daunting task, and we only give the bare essentials to get things up and running. We suggest that you study the relevant literature. As a first step beyond this introduction, you may wish to explore more secure forms of key storage than storing them unencrypted on disk. The following three sections describe how you create the CA, KDC certificate, and client certificates. You can use any tool you like for this task, as long as they generate X.509 (PKIX) certificates in PEM format and RSA keys in PKCS#1 format. Here we use `certtool' that come with GNUTLS, which is widely available. We conclude by discussing how you use these certificates in the KDC and in the Shishi client. 3.6.3.1 Create a Kerberos Certificate Authority ............................................... First create a CA key. jas@latte:~$ certtool --generate-privkey \ --outfile /usr/local/etc/shishi/shishi.key Generating a private key... Generating a 1024 bit RSA private key... jas@latte:~$ Then create the CA certificate. Use whatever details you prefer. jas@latte:~$ certtool --generate-self-signed \ --load-privkey /usr/local/etc/shishi/shishi.key \ --outfile /usr/local/etc/shishi/shishi.cert Generating a self signed certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example CA Organizational unit name: Locality name: State or province name: Common name: CA This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): y Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 10:59:00 2003 Not After: Fri Jun 18 11:59:00 2004 Subject: C=SE,O=Shishi Example CA,CN=CA Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:TRUE Is the above information ok? (Y/N): y Signing certificate... jas@latte:~$ 3.6.3.2 Create a Kerberos KDC Certificate ......................................... First create the key for the KDC. jas@latte:~$ certtool --generate-privkey \ --outfile /usr/local/etc/shishi/shishid.key Generating a private key... Generating a 1024 bit RSA private key... jas@latte:~$ Then create actual KDC certificate, signed by the CA certificate created in the previous step. jas@latte:~$ certtool --generate-certificate \ --load-ca-certificate /usr/local/etc/shishi/shishi.cert \ --load-ca-privkey /usr/local/etc/shishi/shishi.key \ --load-privkey /usr/local/etc/shishi/shishid.key \ --outfile /usr/local/etc/shishi/shishid.cert Generating a signed certificate... Loading CA's private key... Loading CA's certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example KDC Organizational unit name: Locality name: State or province name: Common name: KDC This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): n Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 11:02:00 2003 Not After: Fri Jun 18 12:02:00 2004 Subject: C=SE,O=Shishi Example KDC,CN=KDC Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:FALSE Is the above information ok? (Y/N): y Signing certificate... jas@latte:~$ 3.6.3.3 Create a Kerberos Client Certificate ............................................ First create the key for the client. jas@latte:~$ certtool --generate-privkey \ --outfile ~/.shishi/client.key Generating a private key... Generating a 1024 bit RSA private key... jas@latte:~$ Then create the client certificate, signed by the CA. An alternative would be to have the KDC sign the client certificates. jas@latte:~$ certtool --generate-certificate \ --load-ca-certificate /usr/local/etc/shishi/shishi.cert \ --load-ca-privkey /usr/local/etc/shishi/shishi.key \ --load-privkey ~/.shishi/client.key \ --outfile ~/.shishi/client.certs Generating a signed certificate... Loading CA's private key... Loading CA's certificate... Please enter the details of the certificate's distinguished name. \ Just press enter to ignore a field. Country name (2 chars): SE Organization name: Shishi Example Client Organizational unit name: Locality name: State or province name: Common name: Client This field should not be used in new certificates. E-mail: Enter the certificate's serial number (decimal): 0 Activation/Expiration time. The generated certificate will expire in (days): 180 Extensions. Does the certificate belong to an authority? (Y/N): n Is this a web server certificate? (Y/N): n Enter the e-mail of the subject of the certificate: X.509 certificate info: Version: 3 Serial Number (hex): 00 Validity: Not Before: Sun Dec 21 11:04:00 2003 Not After: Fri Jun 18 12:04:00 2004 Subject: C=SE,O=Shishi Example Client,CN=Client Subject Public Key Info: Public Key Algorithm: RSA X.509 Extensions: Basic Constraints: (critical) CA:FALSE Is the above information ok? (Y/N): y Signing certificate... jas@latte:~$ 3.6.3.4 Starting KDC with X.509 authentication support ...................................................... The KDC need the CA certificate (to verify client certificates) and the server certificate and key (to authenticate itself to the clients). See elsewhere (*note Parameters for shishid::) for the entire description of the parameters. jas@latte:~$ shishid -l *:4711/tcp \ --x509cafile /usr/local/etc/shishi/shishi.cert \ --x509certfile /usr/local/etc/shishi/shishid.cert \ --x509keyfile /usr/local/etc/shishi/shishid.key Initializing GNUTLS... Parsed 1 CAs... Loaded server certificate/key... Generating Diffie-Hellman parameters... Initializing GNUTLS...done Listening on *:4711/tcp... Listening on 1 ports... shishid: Starting (GNUTLS `1.0.4') shishid: Listening on *:4711/tcp socket 4 Then acquire tickets as usual. In case you wonder how shishi finds the client certificate and key, the filenames used above when generating the client certificates happen to be the default filenames for these files. So it pick them up automatically. jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls' \ simon@EXAMPLE.ORG Enter password for `simon@EXAMPLE.ORG': simon@EXAMPLE.ORG: Authtime: Sun Dec 21 11:15:47 2003 Endtime: Sun Dec 21 11:32:27 2003 Server: krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18) Ticket key: aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18) Ticket flags: FORWARDED PROXIABLE RENEWABLE HWAUTHENT TRANSITEDPOLICYCHECKED OKASDELEGATE (12) jas@latte:~$ Here is what the server would print. shishid: Accepted socket 6 from socket 4 as *:4711/tcp peer 127.0.0.1 shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 4 bytes from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying STARTTLS shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `RSA', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed shishid: TLS client certificate `C=SE,O=Shishi Example Client,CN=Client', issued by `C=SE,O=Shishi Example CA,CN=CA', serial number `00', MD5 fingerprint `a5:d3:1f:58:76:e3:58:cd:2d:eb:f7:45:a2:4b:52:f9:', activated `Sun Dec 21 11:04:00 2003', expires `Fri Jun 18 12:04:00 2004', version #3, key RSA modulus 1024 bits, currently EXPIRED shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Has 131 bytes from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Processing 131 from *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Trying AS-REQ shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG shishid: Matching client etype 18 against user key etype 18 shishid: Have 511 bytes for *:4711/tcp peer 127.0.0.1 on socket 6 shishid: Sending 511 bytes to *:4711/tcp peer 127.0.0.1 socket 6 via TLS shishid: Listening on *:4711/tcp socket 4 shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6 shishid: Peer *:4711/tcp peer 127.0.0.1 disconnected on socket 6 shishid: Closing *:4711/tcp peer 127.0.0.1 socket 6 shishid: Listening on *:4711/tcp socket 4  File: shishi.info, Node: Multiple servers, Next: Developer information, Prev: Kerberos via TLS, Up: Administration Manual 3.7 Multiple servers ==================== Setting up multiple servers is as easy as replicating the user database. Since the default `file' user database is stored in the normal file system, you can use any common tools to replicate a file system. Network file system like NFS (properly secured by, e.g., a point-to-point symmetrically encrypted IPSEC connection) and file synchronizing tools like `rsync' are typical choices. The secondary server should be configured just like the master server. If you use the `file' database over NFS you do not have to make any modifications. If you use, e.g., a cron job to `rsync' the directory every hour or so, you may want to add a `--read-only' flag to the Shisa `db' definition (*note Shisa Configuration::). That way, nobody will be lured into creating or changing information in the database on the secondary server, which only would be overwritten during the next synchronization. db --read-only file /usr/local/var/backup-shishi The `file' database is designed so it doesn't require file locking in the file system, which may be unreliable in some network file systems or implementations. It is also designed so that multiple concurrent readers and writers may access the database without causing corruption. *Warning:* The last paragraph is currently not completely accurate. There may be race conditions with concurrent writers. None should cause infinite loops or data loss. However, unexpected results might occur if two writers try to update information about a principal simultaneous. If you use a remote LDAP server or SQL database to store the user database, and access it via a Shisa backend, you have make sure your Shisa backend handle concurrent writers properly. If you use a modern SQL database, this probably is not a concern. If it is a problem, you may be able to work around it by implementing some kind of synchronization or semaphore mechanism. If all else sounds too complicated, you can set up the secondary servers as `--read-only' servers, although you will lose some functionality (like changing passwords via the secondary server, or updating timestamps when the last ticket request occurred). One function that is of particular use for users with remote databases (be it LDAP or SQL) is the "database override" feature. Using this you can have the security critical principals (such as the ticket granting ticket) stored on local file system storage, but use the remote database for user principals. Of course, you must keep the local file system storage synchronized between all servers, as before. Here is an example configuration. db --read-only file /var/local/master db ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem This instruct the Shisa library to access the two databases sequentially, for each query using the first database that know about the requested principal. If you put the `krbtgt/REALM' principal in the local `file' database, this will override the LDAP interface. Naturally, you can have as many `db' definition lines as you wish. Users with remote databases can also investigate a so called High Availability mode. This is useful if you wish to have your Kerberos servers be able to continue to operate even when the remote database is offline. This is achieved via the `--ignore-errors' flag in the database definition. Here is a sample configuration. db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --read-only file /var/cache/ldap-copy This instruct the Shisa library to try the LDAP backend first, but if it fails, instead of returning an error, continue to try the operation on a read only local `file' based database. Of course, write requests will still fail, but it may be better than halting the server completely. To make this work, you first need to set up a cron job on a, say, hourly basis, to make a copy of the remote database and store it in the local file database. That way, when the remote server goes away, fairly current information will still be available locally. If you also wish to experiment with read-write fail over, here is an idea for the configuration. db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --ignore-errors --read-only file /var/cache/ldap-copy db file /var/cache/local-updates This is similar to the previous, but it will ignore errors reading and writing from the first two databases, ultimately causing write attempts to end up in the final `file' based database. Of course, you would need to create tools to feed back any local updates made while the remote server was down. It may also be necessary to create a special backend for this purpose, which can auto create principals that are used. We finish with an example that demonstrate all the ideas presented. db --read-only file /var/local/master db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --ignore-errors --read-only file /var/cache/ldap-copy db file /var/cache/local-updates  File: shishi.info, Node: Developer information, Prev: Multiple servers, Up: Administration Manual 3.8 Developer information ========================= The Programming API for Shisa is described below (*note Kerberos Database Functions::); this section is about extending Shisa, and consequently Shishi, to use your own user database system. You may want to store your Kerberos user information on an LDAP database server, for example. Adding a new backend is straight forward. You need to implement the backend API function set, add the list of API functions to `db/db.c' and possibly also add any library dependencies to the Makefile. The simplest way to write a new backend is to start from the existing `file' based database, in `db/file.c', and modify the entry points as needed. Note that the current backend API will likely change before it is frozen. We may describe it in detail here when it has matured. However, currently it is similar to the external Shisa API (*note Kerberos Database Functions::). There should be no need to modify anything else in the Shisa library, and certainly not in the Shishi library or the `shishid' server. Naturally, we would appreciate if you would send us your new backend, if you believe it is generally useful (*note Bug Reports::).  File: shishi.info, Node: Reference Manual, Next: Programming Manual, Prev: Administration Manual, Up: Top 4 Reference Manual ****************** This chapter discuss the underlying assumptions of Kerberos, contain a glossary to Kerberos concepts, give you background information on choosing realm and principal names, and describe all parameters and configuration file syntaxes for the Shishi tools. * Menu: * Environmental Assumptions:: Kerberos 5 assumptions about your system. * Glossary of terms:: Glossary of Kerberos related terminology. * Realm and Principal Naming:: How to name your realm and principals. * Shishi Configuration:: Explains the Core Shishi configuration file. * Shisa Configuration:: Explains the Shisa database definition file. * Parameters for shishi:: Command line parameters for 'shishi'. * Parameters for shishid:: Command line parameters for 'shishid'. * Parameters for shisa:: Command line parameters for 'shisa'. * Environment variables:: Overriding compile-time defaults at run-time. * Date input formats:: Details of the understood date formats.  File: shishi.info, Node: Environmental Assumptions, Next: Glossary of terms, Up: Reference Manual 4.1 Environmental Assumptions ============================= Kerberos imposes a few assumptions on the environment in which it can properly function: * "Denial of service" attacks are not solved with Kerberos. There are places in the protocols where an intruder can prevent an application from participating in the proper authentication steps. Detection and solution of such attacks (some of which can appear to be not-uncommon "normal" failure modes for the system) is usually best left to the human administrators and users. * Principals MUST keep their secret keys secret. If an intruder somehow steals a principal's key, it will be able to masquerade as that principal or impersonate any server to the legitimate principal. * "Password guessing" attacks are not solved by Kerberos. If a user chooses a poor password, it is possible for an attacker to successfully mount an offline dictionary attack by repeatedly attempting to decrypt, with successive entries from a dictionary, messages obtained which are encrypted under a key derived from the user's password. * Each host on the network MUST have a clock which is "loosely synchronized" to the time of the other hosts; this synchronization is used to reduce the bookkeeping needs of application servers when they do replay detection. The degree of "looseness" can be configured on a per-server basis, but is typically on the order of 5 minutes. If the clocks are synchronized over the network, the clock synchronization protocol MUST itself be secured from network attackers. * Principal identifiers are not recycled on a short-term basis. A typical mode of access control will use access control lists (ACLs) to grant permissions to particular principals. If a stale ACL entry remains for a deleted principal and the principal identifier is reused, the new principal will inherit rights specified in the stale ACL entry. By not re-using principal identifiers, the danger of inadvertent access is removed.  File: shishi.info, Node: Glossary of terms, Next: Realm and Principal Naming, Prev: Environmental Assumptions, Up: Reference Manual 4.2 Glossary of terms ===================== Authentication Verifying the claimed identity of a principal. Authentication header A record containing a Ticket and an Authenticator to be presented to a server as part of the authentication process. Authentication path A sequence of intermediate realms transited in the authentication process when communicating from one realm to another. Authenticator A record containing information that can be shown to have been recently generated using the session key known only by the client and server. Authorization The process of determining whether a client may use a service, which objects the client is allowed to access, and the type of access allowed for each. Capability A token that grants the bearer permission to access an object or service. In Kerberos, this might be a ticket whose use is restricted by the contents of the authorization data field, but which lists no network addresses, together with the session key necessary to use the ticket. Ciphertext The output of an encryption function. Encryption transforms plaintext into ciphertext. Client A process that makes use of a network service on behalf of a user. Note that in some cases a Server may itself be a client of some other server (e.g. a print server may be a client of a file server). Credentials A ticket plus the secret session key necessary to successfully use that ticket in an authentication exchange. Encryption Type (etype) When associated with encrypted data, an encryption type identifies the algorithm used to encrypt the data and is used to select the appropriate algorithm for decrypting the data. Encryption type tags are communicated in other messages to enumerate algorithms that are desired, supported, preferred, or allowed to be used for encryption of data between parties. This preference is combined with local information and policy to select an algorithm to be used. KDC Key Distribution Center, a network service that supplies tickets and temporary session keys; or an instance of that service or the host on which it runs. The KDC services both initial ticket and ticket-granting ticket requests. The initial ticket portion is sometimes referred to as the Authentication Server (or service). The ticket-granting ticket portion is sometimes referred to as the ticket-granting server (or service). Kerberos The name given to the Project Athena's authentication service, the protocol used by that service, or the code used to implement the authentication service. The name is adopted from the three-headed dog which guards Hades. Key Version Number (kvno) A tag associated with encrypted data identifies which key was used for encryption when a long lived key associated with a principal changes over time. It is used during the transition to a new key so that the party decrypting a message can tell whether the data was encrypted using the old or the new key. Plaintext The input to an encryption function or the output of a decryption function. Decryption transforms ciphertext into plaintext. Principal A named client or server entity that participates in a network communication, with one name that is considered canonical. Principal identifier The canonical name used to uniquely identify each different principal. Seal To encipher a record containing several fields in such a way that the fields cannot be individually replaced without either knowledge of the encryption key or leaving evidence of tampering. Secret key An encryption key shared by a principal and the KDC, distributed outside the bounds of the system, with a long lifetime. In the case of a human user's principal, the secret key MAY be derived from a password. Server A particular Principal which provides a resource to network clients. The server is sometimes referred to as the Application Server. Service A resource provided to network clients; often provided by more than one server (for example, remote file service). Session key A temporary encryption key used between two principals, with a lifetime limited to the duration of a single login "session". In the Kerberos system, a session key is generated by the KDC. The session key is distinct from the sub-session key, described next.. Sub-session key A temporary encryption key used between two principals, selected and exchanged by the principals using the session key, and with a lifetime limited to the duration of a single association. The sub- session key is also referred to as the subkey. Ticket A record that helps a client authenticate itself to a server; it contains the client's identity, a session key, a timestamp, and other information, all sealed using the server's secret key. It only serves to authenticate a client when presented along with a fresh Authenticator.  File: shishi.info, Node: Realm and Principal Naming, Next: Shishi Configuration, Prev: Glossary of terms, Up: Reference Manual 4.3 Realm and Principal Naming ============================== This section contains the discussion on naming realms and principals from the Kerberos specification. 4.3.1 Realm Names ----------------- Although realm names are encoded as GeneralStrings and although a realm can technically select any name it chooses, interoperability across realm boundaries requires agreement on how realm names are to be assigned, and what information they imply. To enforce these conventions, each realm MUST conform to the conventions itself, and it MUST require that any realms with which inter-realm keys are shared also conform to the conventions and require the same from its neighbors. Kerberos realm names are case sensitive. Realm names that differ only in the case of the characters are not equivalent. There are presently three styles of realm names: domain, X500, and other. Examples of each style follow: domain: ATHENA.MIT.EDU X500: C=US/O=OSF other: NAMETYPE:rest/of.name=without-restrictions Domain syle realm names MUST look like domain names: they consist of components separated by periods (.) and they contain neither colons (:) nor slashes (/). Though domain names themselves are case insensitive, in order for realms to match, the case must match as well. When establishing a new realm name based on an internet domain name it is recommended by convention that the characters be converted to upper case. X.500 names contain an equal (=) and cannot contain a colon (:) before the equal. The realm names for X.500 names will be string representations of the names with components separated by slashes. Leading and trailing slashes will not be included. Note that the slash separator is consistent with Kerberos implementations based on RFC1510, but it is different from the separator recommended in RFC2253. Names that fall into the other category MUST begin with a prefix that contains no equal (=) or period (.) and the prefix MUST be followed by a colon (:) and the rest of the name. All prefixes must be assigned before they may be used. Presently none are assigned. The reserved category includes strings which do not fall into the first three categories. All names in this category are reserved. It is unlikely that names will be assigned to this category unless there is a very strong argument for not using the 'other' category. These rules guarantee that there will be no conflicts between the various name styles. The following additional constraints apply to the assignment of realm names in the domain and X.500 categories: the name of a realm for the domain or X.500 formats must either be used by the organization owning (to whom it was assigned) an Internet domain name or X.500 name, or in the case that no such names are registered, authority to use a realm name MAY be derived from the authority of the parent realm. For example, if there is no domain name for E40.MIT.EDU, then the administrator of the MIT.EDU realm can authorize the creation of a realm with that name. This is acceptable because the organization to which the parent is assigned is presumably the organization authorized to assign names to its children in the X.500 and domain name systems as well. If the parent assigns a realm name without also registering it in the domain name or X.500 hierarchy, it is the parent's responsibility to make sure that there will not in the future exist a name identical to the realm name of the child unless it is assigned to the same entity as the realm name. 4.3.2 Principal Names --------------------- As was the case for realm names, conventions are needed to ensure that all agree on what information is implied by a principal name. The name-type field that is part of the principal name indicates the kind of information implied by the name. The name-type SHOULD be treated only as a hint to interpreting the meaning of a name. It is not significant when checking for equivalence. Principal names that differ only in the name-type identify the same principal. The name type does not partition the name space. Ignoring the name type, no two names can be the same (i.e. at least one of the components, or the realm, MUST be different). The following name types are defined: name-type value meaning NT-UNKNOWN 0 Name type not known NT-PRINCIPAL 1 Just the name of the principal as in DCE, or for users NT-SRV-INST 2 Service and other unique instance (krbtgt) NT-SRV-HST 3 Service with host name as instance (telnet, rcommands) NT-SRV-XHST 4 Service with host as remaining components NT-UID 5 Unique ID NT-X500-PRINCIPAL 6 Encoded X.509 Distingished name [RFC 2253] NT-SMTP-NAME 7 Name in form of SMTP email name (e.g. user@foo.com) NT-ENTERPRISE 10 Enterprise name - may be mapped to principal name When a name implies no information other than its uniqueness at a particular time the name type PRINCIPAL SHOULD be used. The principal name type SHOULD be used for users, and it might also be used for a unique server. If the name is a unique machine generated ID that is guaranteed never to be reassigned then the name type of UID SHOULD be used (note that it is generally a bad idea to reassign names of any type since stale entries might remain in access control lists). If the first component of a name identifies a service and the remaining components identify an instance of the service in a server specified manner, then the name type of SRV-INST SHOULD be used. An example of this name type is the Kerberos ticket-granting service whose name has a first component of krbtgt and a second component identifying the realm for which the ticket is valid. If the first component of a name identifies a service and there is a single component following the service name identifying the instance as the host on which the server is running, then the name type SRV- HST SHOULD be used. This type is typically used for Internet services such as telnet and the Berkeley R commands. If the separate components of the host name appear as successive components following the name of the service, then the name type SRV-XHST SHOULD be used. This type might be used to identify servers on hosts with X.500 names where the slash (/) might otherwise be ambiguous. A name type of NT-X500-PRINCIPAL SHOULD be used when a name from an X.509 certificate is translated into a Kerberos name. The encoding of the X.509 name as a Kerberos principal shall conform to the encoding rules specified in RFC 2253. A name type of SMTP allows a name to be of a form that resembles a SMTP email name. This name, including an "@" and a domain name, is used as the one component of the principal name. A name type of UNKNOWN SHOULD be used when the form of the name is not known. When comparing names, a name of type UNKNOWN will match principals authenticated with names of any type. A principal authenticated with a name of type UNKNOWN, however, will only match other names of type UNKNOWN. Names of any type with an initial component of 'krbtgt' are reserved for the Kerberos ticket granting service. *Note Name of the TGS: krbtgt, for the form of such names. 4.3.2.1 Name of server principals ................................. The principal identifier for a server on a host will generally be composed of two parts: (1) the realm of the KDC with which the server is registered, and (2) a two-component name of type NT-SRV-HST if the host name is an Internet domain name or a multi-component name of type NT-SRV-XHST if the name of the host is of a form such as X.500 that allows slash (/) separators. The first component of the two- or multi-component name will identify the service and the latter components will identify the host. Where the name of the host is not case sensitive (for example, with Internet domain names) the name of the host MUST be lower case. If specified by the application protocol for services such as telnet and the Berkeley R commands which run with system privileges, the first component MAY be the string 'host' instead of a service specific identifier. 4.3.2.2 Name of the TGS ....................... The principal identifier of the ticket-granting service shall be composed of three parts: (1) the realm of the KDC issuing the TGS ticket (2) a two-part name of type NT-SRV-INST, with the first part "krbtgt" and the second part the name of the realm which will accept the ticket-granting ticket. For example, a ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the ATHENA.MIT.EDU KDC has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "ATHENA.MIT.EDU") (name). A ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the MIT.EDU realm has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "MIT.EDU") (name). 4.3.3 Choosing a principal with which to communicate ---------------------------------------------------- The Kerberos protocol provides the means for verifying (subject to the assumptions in *note Environmental Assumptions::) that the entity with which one communicates is the same entity that was registered with the KDC using the claimed identity (principal name). It is still necessary to determine whether that identity corresponds to the entity with which one intends to communicate. When appropriate data has been exchanged in advance, this determination may be performed syntactically by the application based on the application protocol specification, information provided by the user, and configuration files. For example, the server principal name (including realm) for a telnet server might be derived from the user specified host name (from the telnet command line), the "host/" prefix specified in the application protocol specification, and a mapping to a Kerberos realm derived syntactically from the domain part of the specified hostname and information from the local Kerberos realms database. One can also rely on trusted third parties to make this determination, but only when the data obtained from the third party is suitably integrity protected while resident on the third party server and when transmitted. Thus, for example, one should not rely on an unprotected domain name system record to map a host alias to the primary name of a server, accepting the primary name as the party one intends to contact, since an attacker can modify the mapping and impersonate the party with which one intended to communicate. Implementations of Kerberos and protocols based on Kerberos MUST NOT use insecure DNS queries to canonicalize the hostname components of the service principal names. In an environment without secure name service, application authors MAY append a statically configured domain name to unqualified hostnames before passing the name to the security mechanisms, but should do no more than that. Secure name service facilities, if available, might be trusted for hostname canonicalization, but such canonicalization by the client SHOULD NOT be required by KDC implementations. Implementation note: Many current implementations do some degree of canonicalization of the provided service name, often using DNS even though it creates security problems. However there is no consistency among implementations about whether the service name is case folded to lower case or whether reverse resolution is used. To maximize interoperability and security, applications SHOULD provide security mechanisms with names which result from folding the user-entered name to lower case, without performing any other modifications or canonicalization. 4.3.4 Principal Name Form ------------------------- Principal names consist of a sequence of strings, which is often tedious to parse. Therefor, Shishi often uses a "printed" form of principal which embed the entire principal name string sequence, and optionally also the realm, into one string. The format is taken from the Kerberos 5 GSS-API mechanism (RFC 1964). The elements included within this name representation are as follows, proceeding from the beginning of the string: 1. One or more principal name components; if more than one principal name component is included, the components are separated by `/`. Arbitrary octets may be included within principal name components, with the following constraints and special considerations: a. Any occurrence of the characters `@` or `/` within a name component must be immediately preceded by the `\` quoting character, to prevent interpretation as a component or realm separator. b. The ASCII newline, tab, backspace, and null characters may occur directly within the component or may be represented, respectively, by `\n`, `\t`, `\b`, or `\0`. c. If the `\` quoting character occurs outside the contexts described in (1a) and (1b) above, the following character is interpreted literally. As a special case, this allows the doubled representation `\\` to represent a single occurrence of the quoting character. d. An occurrence of the `\` quoting character as the last character of a component is illegal. 2. Optionally, a `@` character, signifying that a realm name immediately follows. If no realm name element is included, the local realm name is assumed. The `/` , `:`, and null characters may not occur within a realm name; the `@`, newline, tab, and backspace characters may be included using the quoting conventions described in (1a), (1b), and (1c) above.  File: shishi.info, Node: Shishi Configuration, Next: Shisa Configuration, Prev: Realm and Principal Naming, Up: Reference Manual 4.4 Shishi Configuration ======================== The valid configuration file tokens are described here. The user configuration file is typically located in `~/.shishi/shishi.conf' (compare `shishi --configuration-file') and the system configuration is typically located in `/usr/local/etc/shishi/shishi.conf' (compare `shishi --system-configuration-file'). If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored. All tokens are valid in both the system and the user configuration files, and have the same meaning. However, as the system file is supposed to apply to all users on a system, it would not make sense to use some tokens in that file. For example, the `default-principal' is rarely useful in a system configuration file. 4.4.1 `default-realm' --------------------- Specify the default realm, by default the hostname of the host is used. E.g., default-realm JOSEFSSON.ORG 4.4.2 `default-principal' ------------------------- Specify the default principal, by default the login username is used. E.g., default-principal jas 4.4.3 `client-kdc-etypes' ------------------------- Specify which encryption types client asks server to respond in during AS/TGS exchanges. List valid encryption types, in preference order. Supported algorithms include aes256-cts-hmac-sha1-96, aes128-cts-hmac-sha1-96, des3-cbc-sha1-kd, des-cbc-md5, des-cbc-md4, des-cbc-crc and null. This option also indicates which encryption types are accepted by the client when receiving the response. Note that the preference order is not cryptographically protected, so a man in the middle can modify the order without being detected. Thus, only specify encryption types you trust completely here. The default only includes aes256-cts-hmac-sha1-96, as suggested by RFC1510bis. E.g., client-kdc-etypes=aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5 4.4.4 `verbose', `verbose-asn1', `verbose-noise', `verbose-crypto', `verbose-crypto-noise' ------------------------------------------------------------------------------------------ Enable verbose library messages. E.g., verbose verbose-noise 4.4.5 `realm-kdc' ----------------- Specify KDC addresses for realms. Value is `REALM,KDCADDRESS[/TRANSPORT][,KDCADDRESS[/TRANSPORT]...]'. KDCADDRESS is the hostname or IP address of KDC. Optional TRANSPORT is "udp" for UDP, "tcp" for TCP, and "tls" for TLS connections. By default UDP is tried first, and TCP used as a fallback if the KRB_ERR_RESPONSE_TOO_BIG error is received. If not specified, Shishi tries to locate the KDC using SRV RRs, which is recommended. This option should normally only be used during experiments, or to access badly maintained realms. realm-kdc=JOSEFSSON.ORG,ristretto.josefsson.org 4.4.6 `server-realm' -------------------- Specify realm for servers. Value is `REALM,SERVERREGEXP[,SERVERREGEXP...]'. SERVERREGEXP is a regular expression matching servers in the realm. The first match is used. E.g., server-realm=JOSEFSSON.ORG,.josefsson.org Note: currently not used. 4.4.7 `kdc-timeout', `kdc-retries' ---------------------------------- How long shishi waits for a response from a KDC before continuing to next KDC for realm. The default is 5 seconds. E.g., kdc-timeout=10 How many times shishi sends a request to a KDC before giving up. The default is 3 times. E.g., kdc-retries=5 4.4.8 `stringprocess' --------------------- How username and passwords entered from the terminal, or taken from the command line, are processed. "none": no processing is used. "stringprep": convert from locale charset to UTF-8 and process using experimental RFC 1510 stringprep profile. It can also be a string indicating a character set supported by iconv via libstringprep, in which case data is converted from locale charset into the indicated character set. E.g., UTF-8, ISO-8859-1, KOI-8, EBCDIC-IS-FRISS are supported on GNU systems. On some systems you can use "locale -m" to list available character sets. By default, the "none" setting is used which is consistent with RFC 1510 that is silent on the issue. In practice, however, converting to UTF-8 improves interoperability. E.g., stringprocess=UTF-8 4.4.9 `ticket-life' ------------------- Specify default ticket life time. The string can be in almost any common format. It can contain month names, time zones, `am' and `pm', `yesterday', `ago', `next', etc. *Note Date input formats::, for the long story. As an extra feature, if the time specified by your string correspond to a time during the last 24 hours, an extra day is added to it. This allows you to specify relative times such as "17:00" to always mean the next 17:00, even if your system clock happens to be 17:30. The default is 8 hours. E.g., #ticket-life=8 hours #ticket-life=1 day ticket-life=17:00 4.4.10 `renew-life' ------------------- Specify how long a renewable ticket should remain renewable. See ticket-life for the syntax. The extra feature that handles negative values within the last 2 hours is not active here. The default is 7 days. E.g., #renew-life=1 week #renew-life=friday 17:00 renew-life=sunday  File: shishi.info, Node: Shisa Configuration, Next: Parameters for shishi, Prev: Shishi Configuration, Up: Reference Manual 4.5 Shisa Configuration ======================= The configuration file for Shisa is typically stored in `/usr/local/etc/shishi/shisa.conf'. If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored. 4.5.1 `db' ---------- Currently the only configuration options available is the `db' token that define the databases to use. The syntax is: db [OPTIONS] [LOCATION] [PARAMETERS ...] Specify the data sources for Kerberos 5 data. Multiple entries, even of the same data source type, are allowed. The data sources are accessed in the same sequence as they are defined here. If an entry is found in one data source, it will be used for the operations, without searching the remaining data sources. Valid OPTIONS include: --read-only No data is written to this data source. --ignore-errors Ignore failures in this backend. The default (when the configuration file is empty) uses one "file" data source (see below), but for a larger installation you may want to combine several data sources. Here is an example. db --read-only file /var/local/master db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem db --read-only file /var/cache/ldap-copy This demonstrate how you can store critical principals on local disk (the first entry, /var/local/master) that will always be found without looking in the LDAP directory. The critical principals could be, e.g., krbtgt/EXAMPLE.ORG. The second entry denote a LDAP server that could hold user principals. As you can see, Shisa will not let the caller know about errors with the LDAP source (they will be logged, however). Instead, if for instance the LDAP server has crashed, Shisa would continue and read from the /var/cache/ldap-copy file source. That file source may have been set up to contain a copy of the data in the LDAP server, perhaps made on an hourly basis, so that your server will be able to serve recent data even in case of a crash. Any updates or passwords change requests will however not be possible while the LDAP server is inaccessible, to reduce the problem of synchronizing data back into the LDAP server once it is online again. Currently only the "file" data source is supported, and denote a data source that use the standard file system for storage. Valid syntaxes for the "file" database: db file PATH Examples: db file /var/shishi db file /usr/share/shishi read-only If no `db' tokens are present, the default will be: db file /usr/local/var/shishi  File: shishi.info, Node: Parameters for shishi, Next: Parameters for shishid, Prev: Shisa Configuration, Up: Reference Manual 4.6 Parameters for shishi ========================= If no command is given, Shishi try to make sure you have a ticket granting ticket for the default realm, and then display it. Mandatory arguments to long options are mandatory for short options too. Usage: shishi [OPTIONS]... [CLIENT [SERVER]]... -h, --help Print help and exit -V, --version Print version and exit Commands: -d, --destroy Destroy tickets in local cache, limited by any --client-name or --server-name. (default=off) -l, --list List tickets in local cache, limited by any --client-name and --server-name. (default=off) -r, --renew Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm. (default=off) Flags: --forwardable Get a forwardable ticket, i.e., one that can be used to get forwarded tickets. (default=off) --forwarded Get a forwarded ticket. (default= off) --proxiable Get a proxiable ticket, i.e., one that can be used to get proxy tickets. (default=off) --proxy Get a proxy ticket. (default=off) --renewable Get a renewable ticket. (default= off) Options: --client-name=NAME Client name. Default is login username. -E, --encryption-type=ETYPE,[ETYPE...] Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. -e, --endtime=STRING Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time. --realm=STRING Set default realm. --renew-till=STRING Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time. --server-name=NAME Server name. Default is 'krbtgt/REALM' where REALM is client realm. -s, --starttime=STRING Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately. --ticket-granter=NAME Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm. Other options: --configuration-file=FILE Read user configuration from FILE. -c, --ticket-file=FILE Read tickets from FILE. -o, --library-options=STRING Parse STRING as a configuration file statement. -q, --quiet Don't produce any diagnostic output. (default=off) --system-configuration-file=FILE Read system configuration from FILE. --ticket-write-file=FILE Write tickets from FILE. Default is to write them back to where they were read from. -v, --verbose Produce verbose output. (default=off)  File: shishi.info, Node: Parameters for shishid, Next: Parameters for shisa, Prev: Parameters for shishi, Up: Reference Manual 4.7 Parameters for shishid ========================== If no parameters are specified, `shishid' listens on the defaults interfaces and answers incoming requests using the keys in the default key file. Mandatory arguments to long options are mandatory for short options too. Usage: shishid [OPTIONS]... -h, --help Print help and exit -V, --version Print version and exit Commands: -l, --listen=[FAMILY:]ADDR:PORT/TYPE Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'. -u, --setuid=NAME After binding socket, set user identity. TLS settings: --no-tls Disable TLS support (default=off) --x509cafile=FILE X.509 certificate authorities used to verify client certificates, in PEM format. --x509certfile=FILE X.509 server certificate, in PEM format. --x509crlfile=FILE X.509 certificate revocation list to check for revoked client certificates, in PEM format. --x509keyfile=FILE X.509 server certificate key, in PEM format. --resume-limit=SHORT Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). (default=`50') Other options: -c, --configuration-file=FILE Use specified configuration file. -v, --verbose Produce verbose output. Use multiple times to increase amount of information. -q, --quiet Don't produce any diagnostic output. (default=off)  File: shishi.info, Node: Parameters for shisa, Next: Environment variables, Prev: Parameters for shishid, Up: Reference Manual 4.8 Parameters for shisa ======================== The purpose of `shisa' is to manipulate information stored in the Kerberos 5 database used by Shishi. Mandatory arguments to long options are mandatory for short options too. Usage: shisa [OPTIONS]... [REALM [PRINCIPAL]]... -h, --help Print help and exit -V, --version Print version and exit Operations: -a, --add Add realm or principal to database. -d, --dump Dump entries in database. -n, --key-add Add new key to a principal in database. --key-remove Remove a key from a principal in database. -l, --list List entries in database. -m, --modify Modify principal entry in database. -r, --remove Remove realm or principal from database. Parameters: -f, --force Allow removal of non-empty realms. (default=off) --enabled Only dump or list enabled principals. (default=off) --disabled Only dump or list disabled principals. (default=off) --keys Print cryptographic key and password in hostkey format. (default=off) Values: -E, --encryption-type=STRING Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. --key-version=NUMBER Version of key. --password[=STRING] Derive key from this password. --random Use a random key. (default) --salt=STRING Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name. --string-to-key-parameter=HEX Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver. Other options: -c, --configuration-file=FILE Use specified configuration file. -o, --library-options=STRING Parse string as configuration file statement. -v, --verbose Produce verbose output. (default=off) -q, --quiet Don't produce any diagnostic output. (default=off)  File: shishi.info, Node: Environment variables, Next: Date input formats, Prev: Parameters for shisa, Up: Reference Manual 4.9 Environment variables ========================= A few of the compile-time defaults may be overridden at run-time by using environment variables. The following variables are supported. * `SHISHI_CONFIG' Specify the location of the default system configuration file. Used by the Shishi library. If not specified, the default is specified at compile-time and is usually `$prefix/etc/shishi.conf'. * `SHISHI_HOME' Specify the user specific directory for configuration files, ticket cache, etc. Used by the Shishi library. If not specified, it is computed as `$HOME/.shishi'. * `SHISHI_USER' Specify the default principal user name. Used by the Shishi library. If not specified, it is taken from the environment variable `USER'. * `SHISHI_TICKETS' Specify the file name of the ticket cache. Used by the Shishi library. If not specified, it will be `$SHISHI_HOME/tickets', or `$HOME/.shishi/tickets' if `$SHISHI_HOME' is not specified.  File: shishi.info, Node: Date input formats, Prev: Environment variables, Up: Reference Manual 4.10 Date input formats ======================= First, a quote: Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. ... It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. ... --Robert Grudin, `Time and the Art of Living'. This section describes the textual date representations that GNU programs accept. These are the strings you, as a user, can supply as arguments to the various programs. The C interface (via the `parse_datetime' function) is not described here. * Menu: * General date syntax:: Common rules. * Calendar date items:: 19 Dec 1994. * Time of day items:: 9:20pm. * Time zone items:: EST, PDT, UTC, ... * Combined date and time of day items:: 1972-09-24T20:02:00,000000-0500. * Day of week items:: Monday and others. * Relative items in date strings:: next tuesday, 2 years ago. * Pure numbers in date strings:: 19931219, 1440. * Seconds since the Epoch:: @1078100502. * Specifying time zone rules:: TZ="America/New_York", TZ="UTC0". * Authors of parse_datetime:: Bellovin, Eggert, Salz, Berets, et al.  File: shishi.info, Node: General date syntax, Next: Calendar date items, Up: Date input formats 4.10.1 General date syntax -------------------------- A "date" is a string, possibly empty, containing many items separated by whitespace. The whitespace may be omitted when no ambiguity arises. The empty string means the beginning of today (i.e., midnight). Order of the items is immaterial. A date string may contain many flavors of items: * calendar date items * time of day items * time zone items * combined date and time of day items * day of the week items * relative items * pure numbers. We describe each of these item types in turn, below. A few ordinal numbers may be written out in words in some contexts. This is most useful for specifying day of the week items or relative items (see below). Among the most commonly used ordinal numbers, the word `last' stands for -1, `this' stands for 0, and `first' and `next' both stand for 1. Because the word `second' stands for the unit of time there is no way to write the ordinal number 2, but for convenience `third' stands for 3, `fourth' for 4, `fifth' for 5, `sixth' for 6, `seventh' for 7, `eighth' for 8, `ninth' for 9, `tenth' for 10, `eleventh' for 11 and `twelfth' for 12. When a month is written this way, it is still considered to be written numerically, instead of being "spelled in full"; this changes the allowed strings. In the current implementation, only English is supported for words and abbreviations like `AM', `DST', `EST', `first', `January', `Sunday', `tomorrow', and `year'. The output of the `date' command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like `IST'. When using `date' to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than `UTC' and `Z'. Here are some ways to do this: $ LC_ALL=C TZ=UTC0 date Mon Mar 1 00:21:42 UTC 2004 $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ' 2004-03-01 00:21:42Z $ date --rfc-3339=ns # --rfc-3339 is a GNU extension. 2004-02-29 16:21:42.692722128-08:00 $ date --rfc-2822 # a GNU extension Sun, 29 Feb 2004 16:21:42 -0800 $ date +'%Y-%m-%d %H:%M:%S %z' # %z is a GNU extension. 2004-02-29 16:21:42 -0800 $ date +'@%s.%N' # %s and %N are GNU extensions. @1078100502.692722128 Alphabetic case is completely ignored in dates. Comments may be introduced between round parentheses, as long as included parentheses are properly nested. Hyphens not followed by a digit are currently ignored. Leading zeros on numbers are ignored. Invalid dates like `2005-02-29' or times like `24:00' are rejected. In the typical case of a host that does not support leap seconds, a time like `23:59:60' is rejected even if it corresponds to a valid leap second.  File: shishi.info, Node: Calendar date items, Next: Time of day items, Prev: General date syntax, Up: Date input formats 4.10.2 Calendar date items -------------------------- A "calendar date item" specifies a day of the year. It is specified differently, depending on whether the month is specified numerically or literally. All these strings specify the same calendar date: 1972-09-24 # ISO 8601. 72-9-24 # Assume 19xx for 69 through 99, # 20xx for 00 through 68. 72-09-24 # Leading zeros are ignored. 9/24/72 # Common U.S. writing. 24 September 1972 24 Sept 72 # September has a special abbreviation. 24 Sep 72 # Three-letter abbreviations always allowed. Sep 24, 1972 24-sep-72 24sep72 The year can also be omitted. In this case, the last specified year is used, or the current year if none. For example: 9/24 sep 24 Here are the rules. For numeric months, the ISO 8601 format `YEAR-MONTH-DAY' is allowed, where YEAR is any positive number, MONTH is a number between 01 and 12, and DAY is a number between 01 and 31. A leading zero must be present if a number is less than ten. If YEAR is 68 or smaller, then 2000 is added to it; otherwise, if YEAR is less than 100, then 1900 is added to it. The construct `MONTH/DAY/YEAR', popular in the United States, is accepted. Also `MONTH/DAY', omitting the year. Literal months may be spelled out in full: `January', `February', `March', `April', `May', `June', `July', `August', `September', `October', `November' or `December'. Literal months may be abbreviated to their first three letters, possibly followed by an abbreviating dot. It is also permitted to write `Sept' instead of `September'. When months are written literally, the calendar date may be given as any of the following: DAY MONTH YEAR DAY MONTH MONTH DAY YEAR DAY-MONTH-YEAR Or, omitting the year: MONTH DAY  File: shishi.info, Node: Time of day items, Next: Time zone items, Prev: Calendar date items, Up: Date input formats 4.10.3 Time of day items ------------------------ A "time of day item" in date strings specifies the time on a given day. Here are some examples, all of which represent the same time: 20:02:00.000000 20:02 8:02pm 20:02-0500 # In EST (U.S. Eastern Standard Time). More generally, the time of day may be given as `HOUR:MINUTE:SECOND', where HOUR is a number between 0 and 23, MINUTE is a number between 0 and 59, and SECOND is a number between 0 and 59 possibly followed by `.' or `,' and a fraction containing one or more digits. Alternatively, `:SECOND' can be omitted, in which case it is taken to be zero. On the rare hosts that support leap seconds, SECOND may be 60. If the time is followed by `am' or `pm' (or `a.m.' or `p.m.'), HOUR is restricted to run from 1 to 12, and `:MINUTE' may be omitted (taken to be zero). `am' indicates the first half of the day, `pm' indicates the second half of the day. In this notation, 12 is the predecessor of 1: midnight is `12am' while noon is `12pm'. (This is the zero-oriented interpretation of `12am' and `12pm', as opposed to the old tradition derived from Latin which uses `12m' for noon and `12pm' for midnight.) The time may alternatively be followed by a time zone correction, expressed as `SHHMM', where S is `+' or `-', HH is a number of zone hours and MM is a number of zone minutes. The zone minutes term, MM, may be omitted, in which case the one- or two-digit correction is interpreted as a number of hours. You can also separate HH from MM with a colon. When a time zone correction is given this way, it forces interpretation of the time relative to Coordinated Universal Time (UTC), overriding any previous specification for the time zone or the local time zone. For example, `+0530' and `+05:30' both stand for the time zone 5.5 hours ahead of UTC (e.g., India). This is the best way to specify a time zone correction by fractional parts of an hour. The maximum zone correction is 24 hours. Either `am'/`pm' or a time zone correction may be specified, but not both.  File: shishi.info, Node: Time zone items, Next: Combined date and time of day items, Prev: Time of day items, Up: Date input formats 4.10.4 Time zone items ---------------------- A "time zone item" specifies an international time zone, indicated by a small set of letters, e.g., `UTC' or `Z' for Coordinated Universal Time. Any included periods are ignored. By following a non-daylight-saving time zone by the string `DST' in a separate word (that is, separated by some white space), the corresponding daylight saving time zone may be specified. Alternatively, a non-daylight-saving time zone can be followed by a time zone correction, to add the two values. This is normally done only for `UTC'; for example, `UTC+05:30' is equivalent to `+05:30'. Time zone items other than `UTC' and `Z' are obsolescent and are not recommended, because they are ambiguous; for example, `EST' has a different meaning in Australia than in the United States. Instead, it's better to use unambiguous numeric time zone corrections like `-0500', as described in the previous section. If neither a time zone item nor a time zone correction is supplied, time stamps are interpreted using the rules of the default time zone (*note Specifying time zone rules::).  File: shishi.info, Node: Combined date and time of day items, Next: Day of week items, Prev: Time zone items, Up: Date input formats 4.10.5 Combined date and time of day items ------------------------------------------ The ISO 8601 date and time of day extended format consists of an ISO 8601 date, a `T' character separator, and an ISO 8601 time of day. This format is also recognized if the `T' is replaced by a space. In this format, the time of day should use 24-hour notation. Fractional seconds are allowed, with either comma or period preceding the fraction. ISO 8601 fractional minutes and hours are not supported. Typically, hosts support nanosecond timestamp resolution; excess precision is silently discarded. Here are some examples: 2012-09-24T20:02:00.052-0500 2012-12-31T23:59:59,999999999+1100 1970-01-01 00:00Z  File: shishi.info, Node: Day of week items, Next: Relative items in date strings, Prev: Combined date and time of day items, Up: Date input formats 4.10.6 Day of week items ------------------------ The explicit mention of a day of the week will forward the date (only if necessary) to reach that day of the week in the future. Days of the week may be spelled out in full: `Sunday', `Monday', `Tuesday', `Wednesday', `Thursday', `Friday' or `Saturday'. Days may be abbreviated to their first three letters, optionally followed by a period. The special abbreviations `Tues' for `Tuesday', `Wednes' for `Wednesday' and `Thur' or `Thurs' for `Thursday' are also allowed. A number may precede a day of the week item to move forward supplementary weeks. It is best used in expression like `third monday'. In this context, `last DAY' or `next DAY' is also acceptable; they move one week before or after the day that DAY by itself would represent. A comma following a day of the week item is ignored.  File: shishi.info, Node: Relative items in date strings, Next: Pure numbers in date strings, Prev: Day of week items, Up: Date input formats 4.10.7 Relative items in date strings ------------------------------------- "Relative items" adjust a date (or the current date if none) forward or backward. The effects of relative items accumulate. Here are some examples: 1 year 1 year ago 3 years 2 days The unit of time displacement may be selected by the string `year' or `month' for moving by whole years or months. These are fuzzy units, as years and months are not all of equal duration. More precise units are `fortnight' which is worth 14 days, `week' worth 7 days, `day' worth 24 hours, `hour' worth 60 minutes, `minute' or `min' worth 60 seconds, and `second' or `sec' worth one second. An `s' suffix on these units is accepted and ignored. The unit of time may be preceded by a multiplier, given as an optionally signed number. Unsigned numbers are taken as positively signed. No number at all implies 1 for a multiplier. Following a relative item by the string `ago' is equivalent to preceding the unit by a multiplier with value -1. The string `tomorrow' is worth one day in the future (equivalent to `day'), the string `yesterday' is worth one day in the past (equivalent to `day ago'). The strings `now' or `today' are relative items corresponding to zero-valued time displacement, these strings come from the fact a zero-valued time displacement represents the current time when not otherwise changed by previous items. They may be used to stress other items, like in `12:00 today'. The string `this' also has the meaning of a zero-valued time displacement, but is preferred in date strings like `this thursday'. When a relative item causes the resulting date to cross a boundary where the clocks were adjusted, typically for daylight saving time, the resulting date and time are adjusted accordingly. The fuzz in units can cause problems with relative items. For example, `2003-07-31 -1 month' might evaluate to 2003-07-01, because 2003-06-31 is an invalid date. To determine the previous month more reliably, you can ask for the month before the 15th of the current month. For example: $ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June! Also, take care when manipulating dates around clock changes such as daylight saving leaps. In a few cases these have added or subtracted as much as 24 hours from the clock, so it is often wise to adopt universal time by setting the `TZ' environment variable to `UTC0' before embarking on calendrical calculations.  File: shishi.info, Node: Pure numbers in date strings, Next: Seconds since the Epoch, Prev: Relative items in date strings, Up: Date input formats 4.10.8 Pure numbers in date strings ----------------------------------- The precise interpretation of a pure decimal number depends on the context in the date string. If the decimal number is of the form YYYYMMDD and no other calendar date item (*note Calendar date items::) appears before it in the date string, then YYYY is read as the year, MM as the month number and DD as the day of the month, for the specified calendar date. If the decimal number is of the form HHMM and no other time of day item appears before it in the date string, then HH is read as the hour of the day and MM as the minute of the hour, for the specified time of day. MM can also be omitted. If both a calendar date and a time of day appear to the left of a number in the date string, but no relative item, then the number overrides the year.  File: shishi.info, Node: Seconds since the Epoch, Next: Specifying time zone rules, Prev: Pure numbers in date strings, Up: Date input formats 4.10.9 Seconds since the Epoch ------------------------------ If you precede a number with `@', it represents an internal time stamp as a count of seconds. The number can contain an internal decimal point (either `.' or `,'); any excess precision not supported by the internal representation is truncated toward minus infinity. Such a number cannot be combined with any other date item, as it specifies a complete time stamp. Internally, computer times are represented as a count of seconds since an epoch--a well-defined point of time. On GNU and POSIX systems, the epoch is 1970-01-01 00:00:00 UTC, so `@0' represents this time, `@1' represents 1970-01-01 00:00:01 UTC, and so forth. GNU and most other POSIX-compliant systems support such times as an extension to POSIX, using negative counts, so that `@-1' represents 1969-12-31 23:59:59 UTC. Traditional Unix systems count seconds with 32-bit two's-complement integers and can represent times from 1901-12-13 20:45:52 through 2038-01-19 03:14:07 UTC. More modern systems use 64-bit counts of seconds with nanosecond subcounts, and can represent all the times in the known lifetime of the universe to a resolution of 1 nanosecond. On most hosts, these counts ignore the presence of leap seconds. For example, on most hosts `@915148799' represents 1998-12-31 23:59:59 UTC, `@915148800' represents 1999-01-01 00:00:00 UTC, and there is no way to represent the intervening leap second 1998-12-31 23:59:60 UTC.  File: shishi.info, Node: Specifying time zone rules, Next: Authors of parse_datetime, Prev: Seconds since the Epoch, Up: Date input formats 4.10.10 Specifying time zone rules ---------------------------------- Normally, dates are interpreted using the rules of the current time zone, which in turn are specified by the `TZ' environment variable, or by a system default if `TZ' is not set. To specify a different set of default time zone rules that apply just to one date, start the date with a string of the form `TZ="RULE"'. The two quote characters (`"') must be present in the date, and any quotes or backslashes within RULE must be escaped by a backslash. For example, with the GNU `date' command you can answer the question "What time is it in New York when a Paris clock shows 6:30am on October 31, 2004?" by using a date beginning with `TZ="Europe/Paris"' as shown in the following shell transcript: $ export TZ="America/New_York" $ date --date='TZ="Europe/Paris" 2004-10-31 06:30' Sun Oct 31 01:30:00 EDT 2004 In this example, the `--date' operand begins with its own `TZ' setting, so the rest of that operand is processed according to `Europe/Paris' rules, treating the string `2004-10-31 06:30' as if it were in Paris. However, since the output of the `date' command is processed according to the overall time zone rules, it uses New York time. (Paris was normally six hours ahead of New York in 2004, but this example refers to a brief Halloween period when the gap was five hours.) A `TZ' value is a rule that typically names a location in the `tz' database (http://www.twinsun.com/tz/tz-link.htm). A recent catalog of location names appears in the TWiki Date and Time Gateway (http://twiki.org/cgi-bin/xtra/tzdate). A few non-GNU hosts require a colon before a location name in a `TZ' setting, e.g., `TZ=":America/New_York"'. The `tz' database includes a wide variety of locations ranging from `Arctic/Longyearbyen' to `Antarctica/South_Pole', but if you are at sea and have your own private time zone, or if you are using a non-GNU host that does not support the `tz' database, you may need to use a POSIX rule instead. Simple POSIX rules like `UTC0' specify a time zone without daylight saving time; other rules can specify simple daylight saving regimes. *Note Specifying the Time Zone with `TZ': (libc)TZ Variable.  File: shishi.info, Node: Authors of parse_datetime, Prev: Specifying time zone rules, Up: Date input formats 4.10.11 Authors of `parse_datetime' ----------------------------------- `parse_datetime' started life as `getdate', as originally implemented by Steven M. Bellovin () while at the University of North Carolina at Chapel Hill. The code was later tweaked by a couple of people on Usenet, then completely overhauled by Rich $alz () and Jim Berets () in August, 1990. Various revisions for the GNU system were made by David MacKenzie, Jim Meyering, Paul Eggert and others, including renaming it to `get_date' to avoid a conflict with the alternative Posix function `getdate', and a later rename to `parse_datetime'. The Posix function `getdate' can parse more locale-specific dates using `strptime', but relies on an environment variable and external file, and lacks the thread-safety of `parse_datetime'. This chapter was originally produced by Franc,ois Pinard () from the `parse_datetime.y' source code, and then edited by K. Berry ().  File: shishi.info, Node: Programming Manual, Next: Acknowledgements, Prev: Reference Manual, Up: Top 5 Programming Manual ******************** This chapter describes all the publicly available functions in the library. * Menu: * Preparation:: What you should do before using the library. * Initialization Functions:: Creating library handle, configuration file. * Ticket Set Functions:: High-level ticket management functions. * AP-REQ and AP-REP Functions:: Client/Server authentication functions. * SAFE and PRIV Functions:: Client/Server session data functions. * Ticket Functions:: Medium-level ticket manipulation functions. * AS Functions:: Medium-level initial authentication functions. * TGS Functions:: Medium-level authentication functions. * Ticket (ASN.1) Functions:: Low-level Ticket functions. * AS/TGS Functions:: Low-level KDC functions; AS and TGS. * Authenticator Functions:: Low-level authenticator functions. * KRB-ERROR Functions:: Low-level KRB-ERROR functions. * Cryptographic Functions:: Low-level cryptographic functions. * X.509 Functions:: Utility functions for X.509 support. * Utility Functions:: Utilities for use in the global context. * ASN.1 Functions:: Perform low-level ASN.1 manipulations. * Error Handling:: Error codes and such. * Examples:: Example code. * Kerberos Database Functions:: The Shisa generic database interface. * Generic Security Service:: If you want to use the GSS API instead.  File: shishi.info, Node: Preparation, Next: Initialization Functions, Up: Programming Manual 5.1 Preparation =============== To use `Libshishi', you have to perform some changes to your sources and the build system. The necessary changes are small and explained in the following sections. At the end of this chapter, it is described how the library is initialized, and how the requirements of the library are verified. A faster way to find out how to adapt your application for use with `Libshishi' may be to look at the examples at the end of this manual (*note Examples::). * Menu: * Header:: * Initialization:: * Version Check:: * Building the source:: * Autoconf tests::  File: shishi.info, Node: Header, Next: Initialization, Up: Preparation 5.1.1 Header ------------ All interfaces (data types and functions) of the library are defined in the header file `shishi.h'. You must include this in all programs using the library, either directly or through some other header file, like this: #include The name space of `Libshishi' is `shishi_*' for function names, `Shishi*' for data types and `SHISHI_*' for other symbols. In addition the same name prefixes with one prepended underscore are reserved for internal use and should never be used by an application.  File: shishi.info, Node: Initialization, Next: Version Check, Prev: Header, Up: Preparation 5.1.2 Initialization -------------------- `Libshishi' must be initialized before it can be used. The library is initialized by calling `shishi_init' (*note Initialization Functions::). The resources allocated by the initialization process can be released if the application no longer has a need to call `Libshishi' functions, this is done by calling `shishi_done'. In order to take advantage of the internationalisation features in `Libshishi', such as translated error messages, the application must set the current locale using `setlocale' before initializing `Libshishi'.  File: shishi.info, Node: Version Check, Next: Building the source, Prev: Initialization, Up: Preparation 5.1.3 Version Check ------------------- It is often desirable to check that the version of `Libshishi' used is indeed one which fits all requirements. Even with binary compatibility new features may have been introduced but due to problem with the dynamic linker an old version is actually used. So you may want to check that the version is okay right after program startup. shishi_check_version -------------------- -- Function: const char * shishi_check_version (const char * REQ_VERSION) REQ_VERSION: version string to compare with, or NULL Check that the version of the library is at minimum the one given as a string in `req_version'. *Return value:* the actual version string of the library; NULL if the condition is not met. If `NULL' is passed to this function no check is done and only the version string is returned. The normal way to use the function is to put something similar to the following early in your `main': if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version failed:\n" "Header file incompatible with shared library.\n"); exit (EXIT_FAILURE); }  File: shishi.info, Node: Building the source, Next: Autoconf tests, Prev: Version Check, Up: Preparation 5.1.4 Building the source ------------------------- If you want to compile a source file including the `shishi.h' header file, you must make sure that the compiler can find it in the directory hierarchy. This is accomplished by adding the path to the directory in which the header file is located to the compilers include file search path (via the `-I' option). However, the path to the include file is determined at the time the source is configured. To solve this problem, `Libshishi' uses the external package `pkg-config' that knows the path to the include file and other configuration options. The options that need to be added to the compiler invocation at compile time are output by the `--cflags' option to `pkg-config shishi'. The following example shows how it can be used at the command line: gcc -c foo.c `pkg-config shishi --cflags` Adding the output of `pkg-config shishi --cflags' to the compilers command line will ensure that the compiler can find the `Libshishi' header file. A similar problem occurs when linking the program with the library. Again, the compiler has to find the library files. For this to work, the path to the library files has to be added to the library search path (via the `-L' option). For this, the option `--libs' to `pkg-config shishi' can be used. For convenience, this option also outputs all other options that are required to link the program with the `Libshishi' libararies (in particular, the `-lshishi' option). The example shows how to link `foo.o' with the `Libshishi' library to a program `foo'. gcc -o foo foo.o `pkg-config shishi --libs` Of course you can also combine both examples to a single command by specifying both options to `pkg-config': gcc -o foo foo.c `pkg-config shishi --cflags --libs`  File: shishi.info, Node: Autoconf tests, Prev: Building the source, Up: Preparation 5.1.5 Autoconf tests -------------------- If you work on a project that uses Autoconf (*note GNU Autoconf: (autoconf)top.) to help find installed libraries, the suggestions in the previous section are not the entire story. There are a few methods to detect and incorporate Shishi into your Autoconf based package. The preferred approach, is to use Libtool in your project, and use the normal Autoconf header file and library tests. 5.1.5.1 Autoconf test via `pkg-config' ...................................... If your audience is a typical GNU/Linux desktop, you can often assume they have the `pkg-config' tool installed, in which you can use its Autoconf M4 macro to find and set up your package for use with Shishi. The following illustrate this scenario. AC_ARG_ENABLE(kerberos_v5, AC_HELP_STRING([--disable-kerberos_v5], [don't use the KERBEROS_V5 mechanism]), kerberos_v5=$enableval) if test "$kerberos_v5" != "no" ; then PKG_CHECK_MODULES(SHISHI, shishi >= 0.0.0, [kerberos_v5=yes], [kerberos_v5=no]) if test "$kerberos_v5" != "yes" ; then kerberos_v5=no AC_MSG_WARN([shishi not found, disabling Kerberos 5]) else kerberos_v5=yes AC_DEFINE(USE_KERBEROS_V5, 1, [Define to 1 if you want Kerberos 5.]) fi fi AC_MSG_CHECKING([if Kerberos 5 should be used]) AC_MSG_RESULT($kerberos_v5) 5.1.5.2 Standalone Autoconf test using Libtool .............................................. If your package uses Libtool(*note GNU Libtool: (libtool)top.), you can use the normal Autoconf tests to find the Shishi library and rely on the Libtool dependency tracking to include the proper dependency libraries (e.g., Libidn). The following illustrate this scenario. AC_CHECK_HEADER(shishi.h, AC_CHECK_LIB(shishi, shishi_check_version, [kerberos5=yes AC_SUBST(SHISHI_LIBS, -lshishi)], kerberos5=no), kerberos5=no) AC_ARG_ENABLE(kerberos5, AC_HELP_STRING([--disable-kerberos5], [disable Kerberos 5 unconditionally]), kerberos5=$enableval) if test "$kerberos5" != "no" ; then AC_DEFINE(USE_KERBEROS_V5, 1, [Define to 1 if you want Kerberos 5.]) else AC_MSG_WARN([Shishi not found, disabling Kerberos 5]) fi AC_MSG_CHECKING([if Kerberos 5 should be used]) AC_MSG_RESULT($kerberos5) 5.1.5.3 Standalone Autoconf test ................................ If your package does not use Libtool, as well as detecting the Shishi library as in the previous case, you must also detect whatever dependencies Shishi requires to work (e.g., libidn). Since the dependencies are in a state of flux, we do not provide an example and we do not recommend this approach, unless you are experienced developer.  File: shishi.info, Node: Initialization Functions, Next: Ticket Set Functions, Prev: Preparation, Up: Programming Manual 5.2 Initialization Functions ============================ shishi ------ -- Function: Shishi * shishi ( VOID) Initializes the Shishi library, and set up, using `shishi_error_set_outputtype()', the library so that future warnings and informational messages are printed to stderr. If this function fails, it may print diagnostic errors to stderr. *Return value:* Returns Shishi library handle, or `NULL' on error. shishi_server ------------- -- Function: Shishi * shishi_server ( VOID) Initializes the Shishi library, and set up, using `shishi_error_set_outputtype()', the library so that future warnings and informational messages are printed to the syslog. If this function fails, it may print diagnostic errors to the syslog. *Return value:* Returns Shishi library handle, or `NULL' on error. shishi_done ----------- -- Function: void shishi_done (Shishi * HANDLE) HANDLE: shishi handle as allocated by `shishi_init()'. Deallocates the shishi library handle. The handle must not be used in any calls to shishi functions after this. If there is a default tkts, it is written to the default tkts file (call `shishi_tkts_default_file_set()' to change the default tkts file). If you do not wish to write the default tkts file, close the default tkts with shishi_tkts_done(handle, NULL) before calling this function. shishi_init ----------- -- Function: int shishi_init (Shishi ** HANDLE) HANDLE: pointer to handle to be created. Create a Shishi library handle, using `shishi()', and read the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) *Return value:* Returns SHISHI_OK iff successful. shishi_init_with_paths ---------------------- -- Function: int shishi_init_with_paths (Shishi ** HANDLE, const char * TKTSFILE, const char * SYSTEMCFGFILE, const char * USERCFGFILE) HANDLE: pointer to handle to be created. TKTSFILE: Filename of ticket file, or NULL. SYSTEMCFGFILE: Filename of system configuration, or NULL. USERCFGFILE: Filename of user configuration, or NULL. Create a Shishi library handle, using `shishi()', and read the system configuration file, user configuration file, and user tickets from the specified locations. If any of `usercfgfile' or `systemcfgfile' is NULL, the file is read from its default location, which for the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration file is $HOME/.shishi/config. If the ticket file is NULL, a ticket file is not read at all. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.) *Return value:* Returns SHISHI_OK iff successful. shishi_init_server ------------------ -- Function: int shishi_init_server (Shishi ** HANDLE) HANDLE: pointer to handle to be created. Create a Shishi library handle, using `shishi_server()', and read the system configuration file. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) *Return value:* Returns SHISHI_OK iff successful. shishi_init_server_with_paths ----------------------------- -- Function: int shishi_init_server_with_paths (Shishi ** HANDLE, const char * SYSTEMCFGFILE) HANDLE: pointer to handle to be created. SYSTEMCFGFILE: Filename of system configuration, or NULL. Create a Shishi library handle, using `shishi_server()', and read the system configuration file from specified location. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.) *Return value:* Returns SHISHI_OK iff successful. shishi_cfg ---------- -- Function: int shishi_cfg (Shishi * HANDLE, const char * OPTION) HANDLE: Shishi library handle create by `shishi_init()'. OPTION: string with shishi library option. Configure shishi library with given option. *Return Value:* Returns SHISHI_OK if option was valid. shishi_cfg_from_file -------------------- -- Function: int shishi_cfg_from_file (Shishi * HANDLE, const char * CFG) HANDLE: Shishi library handle create by `shishi_init()'. CFG: filename to read configuration from. Configure shishi library using configuration file. *Return Value:* Returns `SHISHI_OK' iff successful. shishi_cfg_print ---------------- -- Function: int shishi_cfg_print (Shishi * HANDLE, FILE * FH) HANDLE: Shishi library handle create by `shishi_init()'. FH: file descriptor opened for writing. Print library configuration status, mostly for debugging purposes. *Return Value:* Returns SHISHI_OK. shishi_cfg_default_systemfile ----------------------------- -- Function: const char * shishi_cfg_default_systemfile (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. The system configuration file name is decided at compile-time, but may be overridden by the environment variable SHISHI_CONFIG. *Return value:* Return system configuration file name. shishi_cfg_default_userdirectory -------------------------------- -- Function: const char * shishi_cfg_default_userdirectory (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. The default user directory (used for, e.g. Shishi ticket cache) is normally computed by appending BASE_DIR ("/.shishi") to the content of the environment variable $HOME, but can be overridden by specifying the complete path in the environment variable SHISHI_HOME. *Return value:* Return directory with configuration files etc. shishi_cfg_userdirectory_file ----------------------------- -- Function: char * shishi_cfg_userdirectory_file (Shishi * HANDLE, const char * FILE) HANDLE: Shishi library handle create by `shishi_init()'. FILE: basename of file to find in user directory. Get the full path to specified `file' in the users' configuration directory. *Return value:* Return full path to given relative filename, relative to the user specific Shishi configuration directory as returned by `shishi_cfg_default_userdirectory()' (typically $HOME/.shishi). shishi_cfg_default_userfile --------------------------- -- Function: const char * shishi_cfg_default_userfile (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. Get filename of default user configuration file, typically $HOME/shishi.conf. *Return value:* Return user configuration filename. shishi_cfg_clientkdcetype ------------------------- -- Function: int shishi_cfg_clientkdcetype (Shishi * HANDLE, int32_t ** ETYPES) HANDLE: Shishi library handle create by `shishi_init()'. ETYPES: output array with encryption types. Set the etypes variable to the array of preferred client etypes. *Return value:* Return the number of encryption types in the array, 0 means none. shishi_cfg_clientkdcetype_fast ------------------------------ -- Function: int32_t shishi_cfg_clientkdcetype_fast (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. Extract the default etype from the list of preferred client etypes. *Return value:* Return the default encryption types. shishi_cfg_clientkdcetype_set ----------------------------- -- Function: int shishi_cfg_clientkdcetype_set (Shishi * HANDLE, char * VALUE) HANDLE: Shishi library handle created by `shishi_init()'. VALUE: string with encryption types. Set the "client-kdc-etypes" configuration option from given string. The string contains encryption types (integer or names) separated by comma or whitespace, e.g. "aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5". *Return value:* Returns SHISHI_OK if successful. shishi_cfg_authorizationtype_set -------------------------------- -- Function: int shishi_cfg_authorizationtype_set (Shishi * HANDLE, char * VALUE) HANDLE: Shishi library handle created by `shishi_init()'. VALUE: string with authorization types. Set the "authorization-types" configuration option from given string. The string contains authorization types (integer or names) separated by comma or whitespace, e.g. "basic k5login". *Return value:* Returns SHISHI_OK if successful.  File: shishi.info, Node: Ticket Set Functions, Next: AP-REQ and AP-REP Functions, Prev: Initialization Functions, Up: Programming Manual 5.3 Ticket Set Functions ======================== A "ticket set" is, as the name implies, a collection of tickets. Functions are provided to read tickets from file into a ticket set, to query number of tickets in the set, to extract a given ticket from the set, to search the ticket set for tickets matching certain criterium, to write the ticket set to a file, etc. High level functions for performing a initial authentication (*note AS Functions::) or subsequent authentication (*note TGS Functions::) and storing the new ticket in the ticket set are also provided. *Note Ticket Functions::, to manipulate each individual ticket. *Note Ticket (ASN.1) Functions::, for low-level ASN.1 manipulation. shishi_tkts_default_file_guess ------------------------------ -- Function: char * shishi_tkts_default_file_guess (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets. *Return value:* Returns default tkts filename as a string that has to be deallocated with `free()' by the caller. shishi_tkts_default_file ------------------------ -- Function: const char * shishi_tkts_default_file (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. Get filename of default ticket set. *Return value:* Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it. shishi_tkts_default_file_set ---------------------------- -- Function: void shishi_tkts_default_file_set (Shishi * HANDLE, const char * TKTSFILE) HANDLE: Shishi library handle create by `shishi_init()'. TKTSFILE: string with new default tkts file name, or NULL to reset to default. Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function. shishi_tkts_default ------------------- -- Function: Shishi_tkts * shishi_tkts_default (Shishi * HANDLE) HANDLE: Shishi library handle create by `shishi_init()'. Get the default ticket set for library handle. *Return value:* Return the handle global ticket set. shishi_tkts ----------- -- Function: int shishi_tkts (Shishi * HANDLE, Shishi_tkts ** TKTS) HANDLE: shishi handle as allocated by `shishi_init()'. TKTS: output pointer to newly allocated tkts handle. Get a new ticket set handle. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_done ---------------- -- Function: void shishi_tkts_done (Shishi_tkts ** TKTS) TKTS: ticket set handle as allocated by `shishi_tkts()'. Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this. shishi_tkts_size ---------------- -- Function: int shishi_tkts_size (Shishi_tkts * TKTS) TKTS: ticket set handle as allocated by `shishi_tkts()'. Get size of ticket set. *Return value:* Returns number of tickets stored in ticket set. shishi_tkts_nth --------------- -- Function: Shishi_tkt * shishi_tkts_nth (Shishi_tkts * TKTS, int TICKETNO) TKTS: ticket set handle as allocated by `shishi_tkts()'. TICKETNO: integer indicating requested ticket in ticket set. *Get the n:* th ticket in ticket set. *Return value:* Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on. shishi_tkts_remove ------------------ -- Function: int shishi_tkts_remove (Shishi_tkts * TKTS, int TICKETNO) TKTS: ticket set handle as allocated by `shishi_tkts()'. TICKETNO: ticket number of ticket in the set to remove. The first ticket is ticket number 0. Remove a ticket, indexed by `ticketno', in ticket set. *Return value:* `SHISHI_OK' if successful or if `ticketno' larger than size of ticket set. shishi_tkts_add --------------- -- Function: int shishi_tkts_add (Shishi_tkts * TKTS, Shishi_tkt * TKT) TKTS: ticket set handle as allocated by `shishi_tkts()'. TKT: ticket to be added to ticket set. Add a ticket to the ticket set. Only the pointer is stored, so if you modify `tkt', the ticket in the ticket set will also be modified. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_new --------------- -- Function: int shishi_tkts_new (Shishi_tkts * TKTS, Shishi_asn1 TICKET, Shishi_asn1 ENCKDCREPPART, Shishi_asn1 KDCREP) TKTS: ticket set handle as allocated by `shishi_tkts()'. TICKET: input ticket variable. ENCKDCREPPART: input ticket detail variable. KDCREP: input KDC-REP variable. Allocate a new ticket and add it to the ticket set. Note that `ticket', `enckdcreppart' and `kdcrep' are stored by reference, so you must not de-allocate them before the ticket is removed from the ticket set and de-allocated. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_read ---------------- -- Function: int shishi_tkts_read (Shishi_tkts * TKTS, FILE * FH) TKTS: ticket set handle as allocated by `shishi_tkts()'. FH: file descriptor to read from. Read tickets from file descriptor and add them to the ticket set. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_from_file --------------------- -- Function: int shishi_tkts_from_file (Shishi_tkts * TKTS, const char * FILENAME) TKTS: ticket set handle as allocated by `shishi_tkts()'. FILENAME: filename to read tickets from. Read tickets from file and add them to the ticket set. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_write ----------------- -- Function: int shishi_tkts_write (Shishi_tkts * TKTS, FILE * FH) TKTS: ticket set handle as allocated by `shishi_tkts()'. FH: file descriptor to write tickets to. Write tickets in set to file descriptor. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_expire ------------------ -- Function: int shishi_tkts_expire (Shishi_tkts * TKTS) TKTS: ticket set handle as allocated by `shishi_tkts()'. Remove expired tickets from ticket set. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_to_file ------------------- -- Function: int shishi_tkts_to_file (Shishi_tkts * TKTS, const char * FILENAME) TKTS: ticket set handle as allocated by `shishi_tkts()'. FILENAME: filename to write tickets to. Write tickets in set to file. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_print_for_service ----------------------------- -- Function: int shishi_tkts_print_for_service (Shishi_tkts * TKTS, FILE * FH, const char * SERVICE) TKTS: ticket set handle as allocated by `shishi_tkts()'. FH: file descriptor to print to. SERVICE: service to limit tickets printed to, or NULL. Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkts_print ----------------- -- Function: int shishi_tkts_print (Shishi_tkts * TKTS, FILE * FH) TKTS: ticket set handle as allocated by `shishi_tkts()'. FH: file descriptor to print to. Print description of all tickets to file descriptor. *Return value:* Returns `SHISHI_OK' iff successful. shishi_tkt_match_p ------------------ -- Function: int shishi_tkt_match_p (Shishi_tkt * TKT, Shishi_tkts_hint * HINT) TKT: ticket to test hints on. HINT: structure with characteristics of ticket to be found. Test if a ticket matches specified hints. *Return value:* Returns 0 iff ticket fails to match given criteria. shishi_tkts_find ---------------- -- Function: Shishi_tkt * shishi_tkts_find (Shishi_tkts * TKTS, Shishi_tkts_hint * HINT) TKTS: ticket set handle as allocated by `shishi_tkts()'. HINT: structure with characteristics of ticket to be found. Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint->startpos field must be updated appropriately. *Here is how you would typically use this function:* Shishi_tkts_hint hint; Shishi_tkt tkt; memset(&hint, 0, sizeof(hint)); hint.server = "imap/mail.example.org"; tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint); if (!tkt) printf("No ticket found...\n"); else do_something_with_ticket (tkt); *Return value:* Returns a ticket if found, or NULL if no further matching tickets could be found. shishi_tkts_find_for_clientserver --------------------------------- -- Function: Shishi_tkt * shishi_tkts_find_for_clientserver (Shishi_tkts * TKTS, const char * CLIENT, const char * SERVER) TKTS: ticket set handle as allocated by `shishi_tkts()'. CLIENT: client name to find ticket for. SERVER: server name to find ticket for. Short-hand function for searching the ticket set for a ticket for the given client and server. See `shishi_tkts_find()'. *Return value:* Returns a ticket if found, or NULL. shishi_tkts_find_for_server --------------------------- -- Function: Shishi_tkt * shishi_tkts_find_for_server (Shishi_tkts * TKTS, const char * SERVER) TKTS: ticket set handle as allocated by `shishi_tkts()'. SERVER: server name to find ticket for. Short-hand function for searching the ticket set for a ticket for the given server using the default client principal. See `shishi_tkts_find_for_clientserver()' and `shishi_tkts_find()'. *Return value:* Returns a ticket if found, or NULL. shishi_tkts_get_tgt ------------------- -- Function: Shishi_tkt * shishi_tkts_get_tgt (Shishi_tkts * TKTS, Shishi_tkts_hint * HINT) TKTS: ticket set handle as allocated by `shishi_tkts()'. HINT: structure with characteristics of ticket to begot. Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange. Currently this function do not implement cross realm logic. This function is used by `shishi_tkts_get()', which is probably what you really want to use unless you have special needs. *Return value:* Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on. shishi_tkts_get_tgs ------------------- -- Function: Shishi_tkt * shishi_tkts_get_tgs (Shishi_tkts * TKTS, Shishi_tkts_hint * HINT, Shishi_tkt * TGT) TKTS: ticket set handle as allocated by `shishi_tkts()'. HINT: structure with characteristics of ticket to begot. TGT: ticket granting ticket to use. Get a ticket via TGS exchange using specified ticket granting ticket. This function is used by `shishi_tkts_get()', which is probably what you really want to use unless you have special needs. *Return value:* Returns a ticket if successful, or NULL if this function is unable to acquire on. shishi_tkts_get --------------- -- Function: Shishi_tkt * shishi_tkts_get (Shishi_tkts * TKTS, Shishi_tkts_hint * HINT) TKTS: ticket set handle as allocated by `shishi_tkts()'. HINT: structure with characteristics of ticket to be found. Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using `shishi_tkts_get_tgt()', and then uses that TGT in a TGS exchange to get the ticket. Currently this function does not implement cross realm logic. *Return value:* Returns a ticket if found, or NULL if this function is unable to get the ticket. shishi_tkts_get_for_clientserver -------------------------------- -- Function: Shishi_tkt * shishi_tkts_get_for_clientserver (Shishi_tkts * TKTS, const char * CLIENT, const char * SERVER) TKTS: ticket set handle as allocated by `shishi_tkts()'. CLIENT: client name to get ticket for. SERVER: server name to get ticket for. Short-hand function for getting a ticket for the given client and server. See `shishi_tkts_get()'. *Return value:* Returns a ticket if found, or NULL. shishi_tkts_get_for_server -------------------------- -- Function: Shishi_tkt * shishi_tkts_get_for_server (Shishi_tkts * TKTS, const char * SERVER) TKTS: ticket set handle as allocated by `shishi_tkts()'. SERVER: server name to get ticket for. Short-hand function for getting a ticket to the given server and for the default principal client. See `shishi_tkts_get()'. *Return value:* Returns a ticket if found, or NULL. shishi_tkts_get_for_localservicepasswd -------------------------------------- -- Function: Shishi_tkt * shishi_tkts_get_for_localservicepasswd (Shishi_tkts * TKTS, const char * SERVICE, const char * PASSWD) TKTS: ticket set handle as allocated by `shishi_tkts()'. SERVICE: service name to get ticket for. PASSWD: password for the default client principal. Short-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See `shishi_tkts_get()'. *Return value:* Returns a ticket if found, or NULL otherwise.  File: shishi.info, Node: AP-REQ and AP-REP Functions, Next: SAFE and PRIV Functions, Prev: Ticket Set Functions, Up: Programming Manual 5.4 AP-REQ and AP-REP Functions =============================== The "AP-REQ" and "AP-REP" are ASN.1 structures used by application client and servers to prove to each other who they are. The structures contain auxilliary information, together with an authenticator (*note Authenticator Functions::) which is the real cryptographic proof. The following illustrates the AP-REQ and AP-REP ASN.1 structures. AP-REQ ::= [APPLICATION 14] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (14), ap-options [2] APOptions, ticket [3] Ticket, authenticator [4] EncryptedData {Authenticator, { keyuse-pa-TGSReq-authenticator | keyuse-APReq-authenticator }} } AP-REP ::= [APPLICATION 15] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (15), enc-part [2] EncryptedData {EncAPRepPart, { keyuse-EncAPRepPart }} } EncAPRepPart ::= [APPLICATION 27] SEQUENCE { ctime [0] KerberosTime, cusec [1] Microseconds, subkey [2] EncryptionKey OPTIONAL, seq-number [3] UInt32 OPTIONAL } shishi_ap --------- -- Function: int shishi_ap (Shishi * HANDLE, Shishi_ap ** AP) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use `shishi_ap_etype()' or `shishi_ap_nosubkey()' instead. In the future, this function will likely behave as `shishi_ap_nosubkey()' and `shishi_ap_nosubkey()' will be removed. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_etype --------------- -- Function: int shishi_ap_etype (Shishi * HANDLE, Shishi_ap ** AP, int ETYPE) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange ETYPE: encryption type of newly generated random subkey. Create a new AP exchange with a random subkey of indicated encryption type. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_nosubkey ------------------ -- Function: int shishi_ap_nosubkey (Shishi * HANDLE, Shishi_ap ** AP) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange Create a new AP exchange without subkey in authenticator. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_done -------------- -- Function: void shishi_ap_done (Shishi_ap * AP) AP: structure that holds information about AP exchange Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle. shishi_ap_set_tktoptions ------------------------ -- Function: int shishi_ap_set_tktoptions (Shishi_ap * AP, Shishi_tkt * TKT, int OPTIONS) AP: structure that holds information about AP exchange TKT: ticket to set in AP. OPTIONS: AP-REQ options to set in AP. Set the ticket (see `shishi_ap_tkt_set()') and set the AP-REQ apoptions (see `shishi_apreq_options_set()'). *Return value:* Returns SHISHI_OK iff successful. shishi_ap_set_tktoptionsdata ---------------------------- -- Function: int shishi_ap_set_tktoptionsdata (Shishi_ap * AP, Shishi_tkt * TKT, int OPTIONS, const char * DATA, size_t LEN) AP: structure that holds information about AP exchange TKT: ticket to set in AP. OPTIONS: AP-REQ options to set in AP. DATA: input array with data to checksum in Authenticator. LEN: length of input array with data to checksum in Authenticator. Set the ticket (see `shishi_ap_tkt_set()') and set the AP-REQ apoptions (see `shishi_apreq_options_set()') and set the Authenticator checksum data. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_set_tktoptionsraw --------------------------- -- Function: int shishi_ap_set_tktoptionsraw (Shishi_ap * AP, Shishi_tkt * TKT, int OPTIONS, int32_t CKSUMTYPE, const char * DATA, size_t LEN) AP: structure that holds information about AP exchange TKT: ticket to set in AP. OPTIONS: AP-REQ options to set in AP. CKSUMTYPE: authenticator checksum type to set in AP. DATA: input array with data to store in checksum field in Authenticator. LEN: length of input array with data to store in checksum field in Authenticator. Set the ticket (see `shishi_ap_tkt_set()') and set the AP-REQ apoptions (see `shishi_apreq_options_set()') and set the raw Authenticator checksum data. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_set_tktoptionsasn1usage --------------------------------- -- Function: int shishi_ap_set_tktoptionsasn1usage (Shishi_ap * AP, Shishi_tkt * TKT, int OPTIONS, Shishi_asn1 NODE, const char * FIELD, int AUTHENTICATORCKSUMKEYUSAGE, int AUTHENTICATORKEYUSAGE) AP: structure that holds information about AP exchange TKT: ticket to set in AP. OPTIONS: AP-REQ options to set in AP. NODE: input ASN.1 structure to store as authenticator checksum data. FIELD: field in ASN.1 structure to use. AUTHENTICATORCKSUMKEYUSAGE: key usage for checksum in authenticator. AUTHENTICATORKEYUSAGE: key usage for authenticator. Set ticket, options and authenticator checksum data using `shishi_ap_set_tktoptionsdata()'. The authenticator checksum data is the DER encoding of the ASN.1 field provided. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_tktoptions -------------------- -- Function: int shishi_ap_tktoptions (Shishi * HANDLE, Shishi_ap ** AP, Shishi_tkt * TKT, int OPTIONS) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange TKT: ticket to set in newly created AP. OPTIONS: AP-REQ options to set in newly created AP. Create a new AP exchange using `shishi_ap()', and set the ticket and AP-REQ apoptions using `shishi_ap_set_tktoptions()'. A random session key is added to the authenticator, using the same keytype as the ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_tktoptionsdata ------------------------ -- Function: int shishi_ap_tktoptionsdata (Shishi * HANDLE, Shishi_ap ** AP, Shishi_tkt * TKT, int OPTIONS, const char * DATA, size_t LEN) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange TKT: ticket to set in newly created AP. OPTIONS: AP-REQ options to set in newly created AP. DATA: input array with data to checksum in Authenticator. LEN: length of input array with data to checksum in Authenticator. Create a new AP exchange using `shishi_ap()', and set the ticket, AP-REQ apoptions and the Authenticator checksum data using `shishi_ap_set_tktoptionsdata()'. A random session key is added to the authenticator, using the same keytype as the ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_tktoptionsraw ----------------------- -- Function: int shishi_ap_tktoptionsraw (Shishi * HANDLE, Shishi_ap ** AP, Shishi_tkt * TKT, int OPTIONS, int32_t CKSUMTYPE, const char * DATA, size_t LEN) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange TKT: ticket to set in newly created AP. OPTIONS: AP-REQ options to set in newly created AP. CKSUMTYPE: authenticator checksum type to set in AP. DATA: input array with data to store in checksum field in Authenticator. LEN: length of input array with data to store in checksum field in Authenticator. Create a new AP exchange using `shishi_ap()', and set the ticket, AP-REQ apoptions and the raw Authenticator checksum data field using `shishi_ap_set_tktoptionsraw()'. A random session key is added to the authenticator, using the same keytype as the ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_etype_tktoptionsdata ------------------------------ -- Function: int shishi_ap_etype_tktoptionsdata (Shishi * HANDLE, Shishi_ap ** AP, int32_t ETYPE, Shishi_tkt * TKT, int OPTIONS, const char * DATA, size_t LEN) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange ETYPE: encryption type of newly generated random subkey. TKT: ticket to set in newly created AP. OPTIONS: AP-REQ options to set in newly created AP. DATA: input array with data to checksum in Authenticator. LEN: length of input array with data to checksum in Authenticator. Create a new AP exchange using `shishi_ap()', and set the ticket, AP-REQ apoptions and the Authenticator checksum data using `shishi_ap_set_tktoptionsdata()'. A random session key is added to the authenticator, using the same keytype as the ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_tktoptionsasn1usage ----------------------------- -- Function: int shishi_ap_tktoptionsasn1usage (Shishi * HANDLE, Shishi_ap ** AP, Shishi_tkt * TKT, int OPTIONS, Shishi_asn1 NODE, const char * FIELD, int AUTHENTICATORCKSUMKEYUSAGE, int AUTHENTICATORKEYUSAGE) HANDLE: shishi handle as allocated by `shishi_init()'. AP: pointer to new structure that holds information about AP exchange TKT: ticket to set in newly created AP. OPTIONS: AP-REQ options to set in newly created AP. NODE: input ASN.1 structure to store as authenticator checksum data. FIELD: field in ASN.1 structure to use. AUTHENTICATORCKSUMKEYUSAGE: key usage for checksum in authenticator. AUTHENTICATORKEYUSAGE: key usage for authenticator. Create a new AP exchange using `shishi_ap()', and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using `shishi_ap_set_tktoptionsasn1usage()'. A random session key is added to the authenticator, using the same keytype as the ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_tkt ------------- -- Function: Shishi_tkt * shishi_ap_tkt (Shishi_ap * AP) AP: structure that holds information about AP exchange Get Ticket from AP exchange. *Return value:* Returns the ticket from the AP exchange, or NULL if not yet set or an error occured. shishi_ap_tkt_set ----------------- -- Function: void shishi_ap_tkt_set (Shishi_ap * AP, Shishi_tkt * TKT) AP: structure that holds information about AP exchange TKT: ticket to store in AP. Set the Ticket in the AP exchange. shishi_ap_authenticator_cksumdata --------------------------------- -- Function: int shishi_ap_authenticator_cksumdata (Shishi_ap * AP, char * OUT, size_t * LEN) AP: structure that holds information about AP exchange OUT: output array that holds authenticator checksum data. LEN: on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data. Get checksum data from Authenticator. *Return value:* Returns `SHISHI_OK' if successful, or `SHISHI_TOO_SMALL_BUFFER' if buffer provided was too small (then `len' will hold necessary buffer size). shishi_ap_authenticator_cksumdata_set ------------------------------------- -- Function: void shishi_ap_authenticator_cksumdata_set (Shishi_ap * AP, const char * AUTHENTICATORCKSUMDATA, size_t AUTHENTICATORCKSUMDATALEN) AP: structure that holds information about AP exchange AUTHENTICATORCKSUMDATA: input array with data to compute checksum on and store in Authenticator in AP-REQ. AUTHENTICATORCKSUMDATALEN: length of input array with data to compute checksum on and store in Authenticator in AP-REQ. Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set. shishi_ap_authenticator_cksumraw_set ------------------------------------ -- Function: void shishi_ap_authenticator_cksumraw_set (Shishi_ap * AP, int32_t AUTHENTICATORCKSUMTYPE, const char * AUTHENTICATORCKSUMRAW, size_t AUTHENTICATORCKSUMRAWLEN) AP: structure that holds information about AP exchange AUTHENTICATORCKSUMTYPE: authenticator checksum type to set in AP. AUTHENTICATORCKSUMRAW: input array with authenticator checksum field value to set in Authenticator in AP-REQ. AUTHENTICATORCKSUMRAWLEN: length of input array with authenticator checksum field value to set in Authenticator in AP-REQ. Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set. shishi_ap_authenticator_cksumtype --------------------------------- -- Function: int32_t shishi_ap_authenticator_cksumtype (Shishi_ap * AP) AP: structure that holds information about AP exchange Get the Authenticator Checksum Type in the AP exchange. *Return value:* Return the authenticator checksum type. shishi_ap_authenticator_cksumtype_set ------------------------------------- -- Function: void shishi_ap_authenticator_cksumtype_set (Shishi_ap * AP, int32_t CKSUMTYPE) AP: structure that holds information about AP exchange CKSUMTYPE: authenticator checksum type to set in AP. Set the Authenticator Checksum Type in the AP exchange. shishi_ap_authenticator ----------------------- -- Function: Shishi_asn1 shishi_ap_authenticator (Shishi_ap * AP) AP: structure that holds information about AP exchange Get ASN.1 Authenticator structure from AP exchange. *Return value:* Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured. shishi_ap_authenticator_set --------------------------- -- Function: void shishi_ap_authenticator_set (Shishi_ap * AP, Shishi_asn1 AUTHENTICATOR) AP: structure that holds information about AP exchange AUTHENTICATOR: authenticator to store in AP. Set the Authenticator in the AP exchange. shishi_ap_req ------------- -- Function: Shishi_asn1 shishi_ap_req (Shishi_ap * AP) AP: structure that holds information about AP exchange Get ASN.1 AP-REQ structure from AP exchange. *Return value:* Returns the AP-REQ from the AP exchange, or NULL if not yet set or an error occured. shishi_ap_req_set ----------------- -- Function: void shishi_ap_req_set (Shishi_ap * AP, Shishi_asn1 APREQ) AP: structure that holds information about AP exchange APREQ: apreq to store in AP. Set the AP-REQ in the AP exchange. shishi_ap_req_der ----------------- -- Function: int shishi_ap_req_der (Shishi_ap * AP, char ** OUT, size_t * OUTLEN) AP: structure that holds information about AP exchange OUT: pointer to output array with der encoding of AP-REQ. OUTLEN: pointer to length of output array with der encoding of AP-REQ. Build AP-REQ using `shishi_ap_req_build()' and DER encode it. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_req_der_set --------------------- -- Function: int shishi_ap_req_der_set (Shishi_ap * AP, char * DER, size_t DERLEN) AP: structure that holds information about AP exchange DER: input array with DER encoded AP-REQ. DERLEN: length of input array with DER encoded AP-REQ. DER decode AP-REQ and set it AP exchange. If decoding fails, the AP-REQ in the AP exchange is lost. *Return value:* Returns SHISHI_OK. shishi_ap_req_build ------------------- -- Function: int shishi_ap_req_build (Shishi_ap * AP) AP: structure that holds information about AP exchange Checksum data in authenticator and add ticket and authenticator to AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_req_decode -------------------- -- Function: int shishi_ap_req_decode (Shishi_ap * AP) AP: structure that holds information about AP exchange Decode ticket in AP-REQ and set the Ticket fields in the AP exchange. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_req_process_keyusage ------------------------------ -- Function: int shishi_ap_req_process_keyusage (Shishi_ap * AP, Shishi_key * KEY, int32_t KEYUSAGE) AP: structure that holds information about AP exchange KEY: cryptographic key used to decrypt ticket in AP-REQ. KEYUSAGE: key usage to use during decryption, for normal AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP-REQ's part of TGS-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR. Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_req_process --------------------- -- Function: int shishi_ap_req_process (Shishi_ap * AP, Shishi_key * KEY) AP: structure that holds information about AP exchange KEY: cryptographic key used to decrypt ticket in AP-REQ. Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_req_asn1 ------------------ -- Function: int shishi_ap_req_asn1 (Shishi_ap * AP, Shishi_asn1 * APREQ) AP: structure that holds information about AP exchange APREQ: output AP-REQ variable. Build AP-REQ using `shishi_ap_req_build()' and return it. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_key ------------- -- Function: Shishi_key * shishi_ap_key (Shishi_ap * AP) AP: structure that holds information about AP exchange Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used. *Return value:* Return application key from AP. shishi_ap_rep ------------- -- Function: Shishi_asn1 shishi_ap_rep (Shishi_ap * AP) AP: structure that holds information about AP exchange Get ASN.1 AP-REP structure from AP exchange. *Return value:* Returns the AP-REP from the AP exchange, or NULL if not yet set or an error occured. shishi_ap_rep_set ----------------- -- Function: void shishi_ap_rep_set (Shishi_ap * AP, Shishi_asn1 APREP) AP: structure that holds information about AP exchange APREP: aprep to store in AP. Set the AP-REP in the AP exchange. shishi_ap_rep_der ----------------- -- Function: int shishi_ap_rep_der (Shishi_ap * AP, char ** OUT, size_t * OUTLEN) AP: structure that holds information about AP exchange OUT: output array with newly allocated DER encoding of AP-REP. OUTLEN: length of output array with DER encoding of AP-REP. Build AP-REP using `shishi_ap_rep_build()' and DER encode it. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_rep_der_set --------------------- -- Function: int shishi_ap_rep_der_set (Shishi_ap * AP, char * DER, size_t DERLEN) AP: structure that holds information about AP exchange DER: input array with DER encoded AP-REP. DERLEN: length of input array with DER encoded AP-REP. DER decode AP-REP and set it AP exchange. If decoding fails, the AP-REP in the AP exchange remains. *Return value:* Returns SHISHI_OK. shishi_ap_rep_build ------------------- -- Function: int shishi_ap_rep_build (Shishi_ap * AP) AP: structure that holds information about AP exchange Checksum data in authenticator and add ticket and authenticator to AP-REP. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_rep_asn1 ------------------ -- Function: int shishi_ap_rep_asn1 (Shishi_ap * AP, Shishi_asn1 * APREP) AP: structure that holds information about AP exchange APREP: output AP-REP variable. Build AP-REP using `shishi_ap_rep_build()' and return it. *Return value:* Returns SHISHI_OK iff successful. shishi_ap_rep_verify -------------------- -- Function: int shishi_ap_rep_verify (Shishi_ap * AP) AP: structure that holds information about AP exchange Verify AP-REP compared to Authenticator. *Return value:* Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. shishi_ap_rep_verify_der ------------------------ -- Function: int shishi_ap_rep_verify_der (Shishi_ap * AP, char * DER, size_t DERLEN) AP: structure that holds information about AP exchange DER: input array with DER encoded AP-REP. DERLEN: length of input array with DER encoded AP-REP. DER decode AP-REP and set it in AP exchange using `shishi_ap_rep_der_set()' and verify it using `shishi_ap_rep_verify()'. *Return value:* Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. shishi_ap_rep_verify_asn1 ------------------------- -- Function: int shishi_ap_rep_verify_asn1 (Shishi_ap * AP, Shishi_asn1 APREP) AP: structure that holds information about AP exchange APREP: input AP-REP. Set the AP-REP in the AP exchange using `shishi_ap_rep_set()' and verify it using `shishi_ap_rep_verify()'. *Return value:* Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error. shishi_ap_encapreppart ---------------------- -- Function: Shishi_asn1 shishi_ap_encapreppart (Shishi_ap * AP) AP: structure that holds information about AP exchange Get ASN.1 EncAPRepPart structure from AP exchange. *Return value:* Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured. shishi_ap_encapreppart_set -------------------------- -- Function: void shishi_ap_encapreppart_set (Shishi_ap * AP, Shishi_asn1 ENCAPREPPART) AP: structure that holds information about AP exchange ENCAPREPPART: EncAPRepPart to store in AP. Set the EncAPRepPart in the AP exchange. shishi_ap_option2string ----------------------- -- Function: const char * shishi_ap_option2string (Shishi_apoptions OPTION) OPTION: enumerated AP-Option type, see Shishi_apoptions. Convert AP-Option type to AP-Option name string. Note that `option' must be just one of the AP-Option types, it cannot be an binary ORed indicating several AP-Options. *Return value:* Returns static string with name of AP-Option that must not be deallocated, or "unknown" if AP-Option was not understood. shishi_ap_string2option ----------------------- -- Function: Shishi_apoptions shishi_ap_string2option (const char * STR) STR: zero terminated character array with name of AP-Option, e.g. "use-session-key". Convert AP-Option name to AP-Option type. *Return value:* Returns enumerated type member corresponding to AP-Option, or 0 if string was not understood. shishi_apreq ------------ -- Function: Shishi_asn1 shishi_apreq (Shishi * HANDLE) HANDLE: shishi handle as allocated by `shishi_init()'. This function creates a new AP-REQ, populated with some default values. *Return value:* Returns the AP-REQ or NULL on failure. shishi_apreq_print ------------------ -- Function: int shishi_apreq_print (Shishi * HANDLE, FILE * FH, Shishi_asn1 APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. APREQ: AP-REQ to print. Print ASCII armored DER encoding of AP-REQ to file. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_save ----------------- -- Function: int shishi_apreq_save (Shishi * HANDLE, FILE * FH, Shishi_asn1 APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. APREQ: AP-REQ to save. Save DER encoding of AP-REQ to file. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_to_file -------------------- -- Function: int shishi_apreq_to_file (Shishi * HANDLE, Shishi_asn1 APREQ, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ to save. FILETYPE: input variable specifying type of file to be written, see Shishi_filetype. FILENAME: input variable with filename to write to. Write AP-REQ to file in specified TYPE. The file will be truncated if it exists. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_parse ------------------ -- Function: int shishi_apreq_parse (Shishi * HANDLE, FILE * FH, Shishi_asn1 * APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. APREQ: output variable with newly allocated AP-REQ. Read ASCII armored DER encoded AP-REQ from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_read ----------------- -- Function: int shishi_apreq_read (Shishi * HANDLE, FILE * FH, Shishi_asn1 * APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. APREQ: output variable with newly allocated AP-REQ. Read DER encoded AP-REQ from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_from_file ---------------------- -- Function: int shishi_apreq_from_file (Shishi * HANDLE, Shishi_asn1 * APREQ, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: output variable with newly allocated AP-REQ. FILETYPE: input variable specifying type of file to be read, see Shishi_filetype. FILENAME: input variable with filename to read from. Read AP-REQ from file in specified TYPE. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_set_authenticator ------------------------------ -- Function: int shishi_apreq_set_authenticator (Shishi * HANDLE, Shishi_asn1 APREQ, int32_t ETYPE, uint32_t KVNO, const char * BUF, size_t BUFLEN) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ to add authenticator field to. ETYPE: encryption type used to encrypt authenticator. KVNO: version of the key used to encrypt authenticator. BUF: input array with encrypted authenticator. BUFLEN: size of input array with encrypted authenticator. Set the encrypted authenticator field in the AP-REP. The encrypted data is usually created by calling `shishi_encrypt()' on the DER encoded authenticator. To save time, you may want to use `shishi_apreq_add_authenticator()' instead, which calculates the encrypted data and calls this function in one step. *Return value:* Returns SHISHI_OK on success. shishi_apreq_add_authenticator ------------------------------ -- Function: int shishi_apreq_add_authenticator (Shishi * HANDLE, Shishi_asn1 APREQ, Shishi_key * KEY, int KEYUSAGE, Shishi_asn1 AUTHENTICATOR) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ to add authenticator field to. KEY: key to to use for encryption. KEYUSAGE: cryptographic key usage value to use in encryption. AUTHENTICATOR: authenticator as allocated by `shishi_authenticator()'. Encrypts DER encoded authenticator using key and store it in the AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_set_ticket ----------------------- -- Function: int shishi_apreq_set_ticket (Shishi * HANDLE, Shishi_asn1 APREQ, Shishi_asn1 TICKET) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ to add ticket field to. TICKET: input ticket to copy into AP-REQ ticket field. Copy ticket into AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_options -------------------- -- Function: int shishi_apreq_options (Shishi * HANDLE, Shishi_asn1 APREQ, uint32_t * FLAGS) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ to get options from. FLAGS: Output integer containing options from AP-REQ. Extract the AP-Options from AP-REQ into output integer. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_use_session_key_p ------------------------------ -- Function: int shishi_apreq_use_session_key_p (Shishi * HANDLE, Shishi_asn1 APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ as allocated by `shishi_apreq()'. Return non-0 iff the "Use session key" option is set in the AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_mutual_required_p ------------------------------ -- Function: int shishi_apreq_mutual_required_p (Shishi * HANDLE, Shishi_asn1 APREQ) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ as allocated by `shishi_apreq()'. Return non-0 iff the "Mutual required" option is set in the AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_options_set ------------------------ -- Function: int shishi_apreq_options_set (Shishi * HANDLE, Shishi_asn1 APREQ, uint32_t OPTIONS) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ as allocated by `shishi_apreq()'. OPTIONS: Options to set in AP-REQ. Set the AP-Options in AP-REQ to indicate integer. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_options_add ------------------------ -- Function: int shishi_apreq_options_add (Shishi * HANDLE, Shishi_asn1 APREQ, uint32_t OPTION) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ as allocated by `shishi_apreq()'. OPTION: Options to add in AP-REQ. Add the AP-Options in AP-REQ. Options not set in input parameter `option' are preserved in the AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_options_remove --------------------------- -- Function: int shishi_apreq_options_remove (Shishi * HANDLE, Shishi_asn1 APREQ, uint32_t OPTION) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ as allocated by `shishi_apreq()'. OPTION: Options to remove from AP-REQ. Remove the AP-Options from AP-REQ. Options not set in input parameter `option' are preserved in the AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_get_authenticator_etype ------------------------------------ -- Function: int shishi_apreq_get_authenticator_etype (Shishi * HANDLE, Shishi_asn1 APREQ, int32_t * ETYPE) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ variable to get value from. ETYPE: output variable that holds the value. Extract AP-REQ.authenticator.etype. *Return value:* Returns SHISHI_OK iff successful. shishi_apreq_get_ticket ----------------------- -- Function: int shishi_apreq_get_ticket (Shishi * HANDLE, Shishi_asn1 APREQ, Shishi_asn1 * TICKET) HANDLE: shishi handle as allocated by `shishi_init()'. APREQ: AP-REQ variable to get ticket from. TICKET: output variable to hold extracted ticket. Extract ticket from AP-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep ------------ -- Function: Shishi_asn1 shishi_aprep (Shishi * HANDLE) HANDLE: shishi handle as allocated by `shishi_init()'. This function creates a new AP-REP, populated with some default values. *Return value:* Returns the authenticator or NULL on failure. shishi_aprep_print ------------------ -- Function: int shishi_aprep_print (Shishi * HANDLE, FILE * FH, Shishi_asn1 APREP) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. APREP: AP-REP to print. Print ASCII armored DER encoding of AP-REP to file. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_save ----------------- -- Function: int shishi_aprep_save (Shishi * HANDLE, FILE * FH, Shishi_asn1 APREP) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. APREP: AP-REP to save. Save DER encoding of AP-REP to file. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_to_file -------------------- -- Function: int shishi_aprep_to_file (Shishi * HANDLE, Shishi_asn1 APREP, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. APREP: AP-REP to save. FILETYPE: input variable specifying type of file to be written, see Shishi_filetype. FILENAME: input variable with filename to write to. Write AP-REP to file in specified TYPE. The file will be truncated if it exists. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_parse ------------------ -- Function: int shishi_aprep_parse (Shishi * HANDLE, FILE * FH, Shishi_asn1 * APREP) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. APREP: output variable with newly allocated AP-REP. Read ASCII armored DER encoded AP-REP from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_read ----------------- -- Function: int shishi_aprep_read (Shishi * HANDLE, FILE * FH, Shishi_asn1 * APREP) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. APREP: output variable with newly allocated AP-REP. Read DER encoded AP-REP from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_from_file ---------------------- -- Function: int shishi_aprep_from_file (Shishi * HANDLE, Shishi_asn1 * APREP, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. APREP: output variable with newly allocated AP-REP. FILETYPE: input variable specifying type of file to be read, see Shishi_filetype. FILENAME: input variable with filename to read from. Read AP-REP from file in specified TYPE. *Return value:* Returns SHISHI_OK iff successful. shishi_aprep_get_enc_part_etype ------------------------------- -- Function: int shishi_aprep_get_enc_part_etype (Shishi * HANDLE, Shishi_asn1 APREP, int32_t * ETYPE) HANDLE: shishi handle as allocated by `shishi_init()'. APREP: AP-REP variable to get value from. ETYPE: output variable that holds the value. Extract AP-REP.enc-part.etype. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart ------------------- -- Function: Shishi_asn1 shishi_encapreppart (Shishi * HANDLE) HANDLE: shishi handle as allocated by `shishi_init()'. This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. *Return value:* Returns the encapreppart or NULL on failure. shishi_encapreppart_print ------------------------- -- Function: int shishi_encapreppart_print (Shishi * HANDLE, FILE * FH, Shishi_asn1 ENCAPREPPART) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. ENCAPREPPART: EncAPRepPart to print. Print ASCII armored DER encoding of EncAPRepPart to file. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_save ------------------------ -- Function: int shishi_encapreppart_save (Shishi * HANDLE, FILE * FH, Shishi_asn1 ENCAPREPPART) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. ENCAPREPPART: EncAPRepPart to save. Save DER encoding of EncAPRepPart to file. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_to_file --------------------------- -- Function: int shishi_encapreppart_to_file (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart to save. FILETYPE: input variable specifying type of file to be written, see Shishi_filetype. FILENAME: input variable with filename to write to. Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_parse ------------------------- -- Function: int shishi_encapreppart_parse (Shishi * HANDLE, FILE * FH, Shishi_asn1 * ENCAPREPPART) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. ENCAPREPPART: output variable with newly allocated EncAPRepPart. Read ASCII armored DER encoded EncAPRepPart from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_read ------------------------ -- Function: int shishi_encapreppart_read (Shishi * HANDLE, FILE * FH, Shishi_asn1 * ENCAPREPPART) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. ENCAPREPPART: output variable with newly allocated EncAPRepPart. Read DER encoded EncAPRepPart from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_from_file ----------------------------- -- Function: int shishi_encapreppart_from_file (Shishi * HANDLE, Shishi_asn1 * ENCAPREPPART, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: output variable with newly allocated EncAPRepPart. FILETYPE: input variable specifying type of file to be read, see Shishi_filetype. FILENAME: input variable with filename to read from. Read EncAPRepPart from file in specified TYPE. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_get_key --------------------------- -- Function: int shishi_encapreppart_get_key (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, Shishi_key ** KEY) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: input EncAPRepPart variable. KEY: newly allocated key. Extract the subkey from the encrypted AP-REP part. *Return value:* Returns `SHISHI_OK' iff successful. shishi_encapreppart_ctime ------------------------- -- Function: int shishi_encapreppart_ctime (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, char ** T) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. T: newly allocated zero-terminated character array with client time. Extract client time from EncAPRepPart. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_ctime_set ----------------------------- -- Function: int shishi_encapreppart_ctime_set (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, const char * T) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. T: string with generalized time value to store in EncAPRepPart. Store client time in EncAPRepPart. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_cusec_get ----------------------------- -- Function: int shishi_encapreppart_cusec_get (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, uint32_t * CUSEC) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. CUSEC: output integer with client microseconds field. Extract client microseconds field from EncAPRepPart. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_cusec_set ----------------------------- -- Function: int shishi_encapreppart_cusec_set (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, uint32_t CUSEC) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. CUSEC: client microseconds to set in authenticator, 0-999999. Set the cusec field in the Authenticator. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_seqnumber_get --------------------------------- -- Function: int shishi_encapreppart_seqnumber_get (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, uint32_t * SEQNUMBER) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. SEQNUMBER: output integer with sequence number field. Extract sequence number field from EncAPRepPart. *Return value:* Returns SHISHI_OK iff successful. shishi_encapreppart_seqnumber_remove ------------------------------------ -- Function: int shishi_encapreppart_seqnumber_remove (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: encapreppart as allocated by `shishi_encapreppart()'. Remove sequence number field in EncAPRepPart. *Return value:* Returns `SHISHI_OK' iff successful. shishi_encapreppart_seqnumber_set --------------------------------- -- Function: int shishi_encapreppart_seqnumber_set (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, uint32_t SEQNUMBER) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: encapreppart as allocated by `shishi_encapreppart()'. SEQNUMBER: integer with sequence number field to store in encapreppart. Store sequence number field in EncAPRepPart. *Return value:* Returns `SHISHI_OK' iff successful. shishi_encapreppart_time_copy ----------------------------- -- Function: int shishi_encapreppart_time_copy (Shishi * HANDLE, Shishi_asn1 ENCAPREPPART, Shishi_asn1 AUTHENTICATOR) HANDLE: shishi handle as allocated by `shishi_init()'. ENCAPREPPART: EncAPRepPart as allocated by `shishi_encapreppart()'. AUTHENTICATOR: Authenticator to copy time fields from. Copy time fields from Authenticator into EncAPRepPart. *Return value:* Returns SHISHI_OK iff successful.  File: shishi.info, Node: SAFE and PRIV Functions, Next: Ticket Functions, Prev: AP-REQ and AP-REP Functions, Up: Programming Manual 5.5 SAFE and PRIV Functions =========================== The "KRB-SAFE" is an ASN.1 structure used by application client and servers to exchange integrity protected data. The integrity protection is keyed, usually with a key agreed on via the AP exchange (*note AP-REQ and AP-REP Functions::). The following illustrates the KRB-SAFE ASN.1 structure. KRB-SAFE ::= [APPLICATION 20] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (20), safe-body [2] KRB-SAFE-BODY, cksum [3] Checksum } KRB-SAFE-BODY ::= SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress, r-address [5] HostAddress OPTIONAL } shishi_safe ----------- -- Function: int shishi_safe (Shishi * HANDLE, Shishi_safe ** SAFE) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: pointer to new structure that holds information about SAFE exchange Create a new SAFE exchange. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_done ---------------- -- Function: void shishi_safe_done (Shishi_safe * SAFE) SAFE: structure that holds information about SAFE exchange Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle. shishi_safe_key --------------- -- Function: Shishi_key * shishi_safe_key (Shishi_safe * SAFE) SAFE: structure that holds information about SAFE exchange Get key structured from SAFE exchange. *Return value:* Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured. shishi_safe_key_set ------------------- -- Function: void shishi_safe_key_set (Shishi_safe * SAFE, Shishi_key * KEY) SAFE: structure that holds information about SAFE exchange KEY: key to store in SAFE. Set the Key in the SAFE exchange. shishi_safe_safe ---------------- -- Function: Shishi_asn1 shishi_safe_safe (Shishi_safe * SAFE) SAFE: structure that holds information about SAFE exchange Get ASN.1 SAFE structured from SAFE exchange. *Return value:* Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured. shishi_safe_safe_set -------------------- -- Function: void shishi_safe_safe_set (Shishi_safe * SAFE, Shishi_asn1 ASN1SAFE) SAFE: structure that holds information about SAFE exchange ASN1SAFE: KRB-SAFE to store in SAFE exchange. Set the KRB-SAFE in the SAFE exchange. shishi_safe_safe_der -------------------- -- Function: int shishi_safe_safe_der (Shishi_safe * SAFE, char ** OUT, size_t * OUTLEN) SAFE: safe as allocated by `shishi_safe()'. OUT: output array with newly allocated DER encoding of SAFE. OUTLEN: length of output array with DER encoding of SAFE. DER encode SAFE structure. Typically `shishi_safe_build()' is used to build the SAFE structure first. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_safe_der_set ------------------------ -- Function: int shishi_safe_safe_der_set (Shishi_safe * SAFE, char * DER, size_t DERLEN) SAFE: safe as allocated by `shishi_safe()'. DER: input array with DER encoded KRB-SAFE. DERLEN: length of input array with DER encoded KRB-SAFE. DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the KRB-SAFE in the SAFE exchange remains. *Return value:* Returns SHISHI_OK. shishi_safe_print ----------------- -- Function: int shishi_safe_print (Shishi * HANDLE, FILE * FH, Shishi_asn1 SAFE) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. SAFE: SAFE to print. Print ASCII armored DER encoding of SAFE to file. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_save ---------------- -- Function: int shishi_safe_save (Shishi * HANDLE, FILE * FH, Shishi_asn1 SAFE) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. SAFE: SAFE to save. Save DER encoding of SAFE to file. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_to_file ------------------- -- Function: int shishi_safe_to_file (Shishi * HANDLE, Shishi_asn1 SAFE, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: SAFE to save. FILETYPE: input variable specifying type of file to be written, see Shishi_filetype. FILENAME: input variable with filename to write to. Write SAFE to file in specified TYPE. The file will be truncated if it exists. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_parse ----------------- -- Function: int shishi_safe_parse (Shishi * HANDLE, FILE * FH, Shishi_asn1 * SAFE) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. SAFE: output variable with newly allocated SAFE. Read ASCII armored DER encoded SAFE from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_read ---------------- -- Function: int shishi_safe_read (Shishi * HANDLE, FILE * FH, Shishi_asn1 * SAFE) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. SAFE: output variable with newly allocated SAFE. Read DER encoded SAFE from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_from_file --------------------- -- Function: int shishi_safe_from_file (Shishi * HANDLE, Shishi_asn1 * SAFE, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: output variable with newly allocated SAFE. FILETYPE: input variable specifying type of file to be read, see Shishi_filetype. FILENAME: input variable with filename to read from. Read SAFE from file in specified TYPE. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_cksum ----------------- -- Function: int shishi_safe_cksum (Shishi * HANDLE, Shishi_asn1 SAFE, int32_t * CKSUMTYPE, char ** CKSUM, size_t * CKSUMLEN) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: safe as allocated by `shishi_safe()'. CKSUMTYPE: output checksum type. CKSUM: output array with newly allocated checksum data from SAFE. CKSUMLEN: output size of output checksum data buffer. Read checksum value from KRB-SAFE. `cksum' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_set_cksum --------------------- -- Function: int shishi_safe_set_cksum (Shishi * HANDLE, Shishi_asn1 SAFE, int32_t CKSUMTYPE, const char * CKSUM, size_t CKSUMLEN) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: safe as allocated by `shishi_safe()'. CKSUMTYPE: input checksum type to store in SAFE. CKSUM: input checksum data to store in SAFE. CKSUMLEN: size of input checksum data to store in SAFE. Store checksum value in SAFE. A checksum is usually created by calling `shishi_checksum()' on some application specific data using the key from the ticket that is being used. To save time, you may want to use `shishi_safe_build()' instead, which calculates the checksum and calls this function in one step. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_user_data --------------------- -- Function: int shishi_safe_user_data (Shishi * HANDLE, Shishi_asn1 SAFE, char ** USERDATA, size_t * USERDATALEN) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: safe as allocated by `shishi_safe()'. USERDATA: output array with newly allocated user data from KRB-SAFE. USERDATALEN: output size of output user data buffer. Read user data value from KRB-SAFE. `userdata' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_set_user_data ------------------------- -- Function: int shishi_safe_set_user_data (Shishi * HANDLE, Shishi_asn1 SAFE, const char * USERDATA, size_t USERDATALEN) HANDLE: shishi handle as allocated by `shishi_init()'. SAFE: safe as allocated by `shishi_safe()'. USERDATA: input user application to store in SAFE. USERDATALEN: size of input user application to store in SAFE. Set the application data in SAFE. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_build ----------------- -- Function: int shishi_safe_build (Shishi_safe * SAFE, Shishi_key * KEY) SAFE: safe as allocated by `shishi_safe()'. KEY: key for session, used to compute checksum. Build checksum and set it in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. *Return value:* Returns SHISHI_OK iff successful. shishi_safe_verify ------------------ -- Function: int shishi_safe_verify (Shishi_safe * SAFE, Shishi_key * KEY) SAFE: safe as allocated by `shishi_safe()'. KEY: key for session, used to verify checksum. Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. *Return value:* Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed. The "KRB-PRIV" is an ASN.1 structure used by application client and servers to exchange confidential data. The confidentiality is keyed, usually with a key agreed on via the AP exchange (*note AP-REQ and AP-REP Functions::). The following illustrates the KRB-PRIV ASN.1 structure. KRB-PRIV ::= [APPLICATION 21] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (21), -- NOTE: there is no [2] tag enc-part [3] EncryptedData -- EncKrbPrivPart } EncKrbPrivPart ::= [APPLICATION 28] SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress -- sender's addr --, r-address [5] HostAddress OPTIONAL -- recip's addr } shishi_priv ----------- -- Function: int shishi_priv (Shishi * HANDLE, Shishi_priv ** PRIV) HANDLE: shishi handle as allocated by `shishi_init()'. PRIV: pointer to new structure that holds information about PRIV exchange Create a new PRIV exchange. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_done ---------------- -- Function: void shishi_priv_done (Shishi_priv * PRIV) PRIV: structure that holds information about PRIV exchange Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle. shishi_priv_key --------------- -- Function: Shishi_key * shishi_priv_key (Shishi_priv * PRIV) PRIV: structure that holds information about PRIV exchange Get key from PRIV exchange. *Return value:* Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured. shishi_priv_key_set ------------------- -- Function: void shishi_priv_key_set (Shishi_priv * PRIV, Shishi_key * KEY) PRIV: structure that holds information about PRIV exchange KEY: key to store in PRIV. Set the Key in the PRIV exchange. shishi_priv_priv ---------------- -- Function: Shishi_asn1 shishi_priv_priv (Shishi_priv * PRIV) PRIV: structure that holds information about PRIV exchange Get ASN.1 PRIV structure in PRIV exchange. *Return value:* Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured. shishi_priv_priv_set -------------------- -- Function: void shishi_priv_priv_set (Shishi_priv * PRIV, Shishi_asn1 ASN1PRIV) PRIV: structure that holds information about PRIV exchange ASN1PRIV: KRB-PRIV to store in PRIV exchange. Set the KRB-PRIV in the PRIV exchange. shishi_priv_priv_der -------------------- -- Function: int shishi_priv_priv_der (Shishi_priv * PRIV, char ** OUT, size_t * OUTLEN) PRIV: priv as allocated by `shishi_priv()'. OUT: output array with newly allocated DER encoding of PRIV. OUTLEN: length of output array with DER encoding of PRIV. DER encode PRIV structure. Typically `shishi_priv_build()' is used to build the PRIV structure first. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_priv_der_set ------------------------ -- Function: int shishi_priv_priv_der_set (Shishi_priv * PRIV, char * DER, size_t DERLEN) PRIV: priv as allocated by `shishi_priv()'. DER: input array with DER encoded KRB-PRIV. DERLEN: length of input array with DER encoded KRB-PRIV. DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the KRB-PRIV in the PRIV exchange remains. *Return value:* Returns SHISHI_OK. shishi_priv_encprivpart ----------------------- -- Function: Shishi_asn1 shishi_priv_encprivpart (Shishi_priv * PRIV) PRIV: structure that holds information about PRIV exchange Get ASN.1 EncPrivPart structure from PRIV exchange. *Return value:* Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured. shishi_priv_encprivpart_set --------------------------- -- Function: void shishi_priv_encprivpart_set (Shishi_priv * PRIV, Shishi_asn1 ASN1ENCPRIVPART) PRIV: structure that holds information about PRIV exchange ASN1ENCPRIVPART: ENCPRIVPART to store in PRIV exchange. Set the ENCPRIVPART in the PRIV exchange. shishi_priv_encprivpart_der --------------------------- -- Function: int shishi_priv_encprivpart_der (Shishi_priv * PRIV, char ** OUT, size_t * OUTLEN) PRIV: priv as allocated by `shishi_priv()'. OUT: output array with newly allocated DER encoding of ENCPRIVPART. OUTLEN: length of output array with DER encoding of ENCPRIVPART. DER encode ENCPRIVPART structure. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_encprivpart_der_set ------------------------------- -- Function: int shishi_priv_encprivpart_der_set (Shishi_priv * PRIV, char * DER, size_t DERLEN) PRIV: priv as allocated by `shishi_priv()'. DER: input array with DER encoded ENCPRIVPART. DERLEN: length of input array with DER encoded ENCPRIVPART. DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains. *Return value:* Returns SHISHI_OK. shishi_priv_print ----------------- -- Function: int shishi_priv_print (Shishi * HANDLE, FILE * FH, Shishi_asn1 PRIV) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. PRIV: PRIV to print. Print ASCII armored DER encoding of PRIV to file. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_save ---------------- -- Function: int shishi_priv_save (Shishi * HANDLE, FILE * FH, Shishi_asn1 PRIV) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for writing. PRIV: PRIV to save. Save DER encoding of PRIV to file. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_to_file ------------------- -- Function: int shishi_priv_to_file (Shishi * HANDLE, Shishi_asn1 PRIV, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. PRIV: PRIV to save. FILETYPE: input variable specifying type of file to be written, see Shishi_filetype. FILENAME: input variable with filename to write to. Write PRIV to file in specified TYPE. The file will be truncated if it exists. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_parse ----------------- -- Function: int shishi_priv_parse (Shishi * HANDLE, FILE * FH, Shishi_asn1 * PRIV) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. PRIV: output variable with newly allocated PRIV. Read ASCII armored DER encoded PRIV from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_read ---------------- -- Function: int shishi_priv_read (Shishi * HANDLE, FILE * FH, Shishi_asn1 * PRIV) HANDLE: shishi handle as allocated by `shishi_init()'. FH: file handle open for reading. PRIV: output variable with newly allocated PRIV. Read DER encoded PRIV from file and populate given variable. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_from_file --------------------- -- Function: int shishi_priv_from_file (Shishi * HANDLE, Shishi_asn1 * PRIV, int FILETYPE, const char * FILENAME) HANDLE: shishi handle as allocated by `shishi_init()'. PRIV: output variable with newly allocated PRIV. FILETYPE: input variable specifying type of file to be read, see Shishi_filetype. FILENAME: input variable with filename to read from. Read PRIV from file in specified TYPE. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_enc_part_etype -------------------------- -- Function: int shishi_priv_enc_part_etype (Shishi * HANDLE, Shishi_asn1 PRIV, int32_t * ETYPE) HANDLE: shishi handle as allocated by `shishi_init()'. PRIV: PRIV variable to get value from. ETYPE: output variable that holds the value. Extract PRIV.enc-part.etype. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_set_enc_part ------------------------ -- Function: int shishi_priv_set_enc_part (Shishi * HANDLE, Shishi_asn1 PRIV, int32_t ETYPE, const char * ENCPART, size_t ENCPARTLEN) HANDLE: shishi handle as allocated by `shishi_init()'. PRIV: priv as allocated by `shishi_priv()'. ETYPE: input encryption type to store in PRIV. ENCPART: input encrypted data to store in PRIV. ENCPARTLEN: size of input encrypted data to store in PRIV. Store encrypted data in PRIV. The encrypted data is usually created by calling `shishi_encrypt()' on some application specific data using the key from the ticket that is being used. To save time, you may want to use `shishi_priv_build()' instead, which encryptes the data and calls this function in one step. *Return value:* Returns SHISHI_OK iff successful. shishi_encprivpart_user_data ---------------------------- -- Function: int shishi_encprivpart_user_data (Shishi * HANDLE, Shishi_asn1 ENCPRIVPART, char ** USERDATA, size_t * USERDATALEN) HANDLE: shishi handle as allocated by `shishi_init()'. ENCPRIVPART: encprivpart as allocated by `shishi_priv()'. USERDATA: output array with newly allocated user data from KRB-PRIV. USERDATALEN: output size of output user data buffer. Read user data value from KRB-PRIV. `userdata' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_encprivpart_set_user_data -------------------------------- -- Function: int shishi_encprivpart_set_user_data (Shishi * HANDLE, Shishi_asn1 ENCPRIVPART, const char * USERDATA, size_t USERDATALEN) HANDLE: shishi handle as allocated by `shishi_init()'. ENCPRIVPART: encprivpart as allocated by `shishi_priv()'. USERDATA: input user application to store in PRIV. USERDATALEN: size of input user application to store in PRIV. Set the application data in PRIV. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_build ----------------- -- Function: int shishi_priv_build (Shishi_priv * PRIV, Shishi_key * KEY) PRIV: priv as allocated by `shishi_priv()'. KEY: key for session, used to encrypt data. Build checksum and set it in KRB-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm. *Return value:* Returns SHISHI_OK iff successful. shishi_priv_process ------------------- -- Function: int shishi_priv_process (Shishi_priv * PRIV, Shishi_key * KEY) PRIV: priv as allocated by `shishi_priv()'. KEY: key to use to decrypt EncPrivPart. Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the PRIV exchange. *Return value:* Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed.  File: shishi.info, Node: Ticket Functions, Next: AS Functions, Prev: SAFE and PRIV Functions, Up: Programming Manual 5.6 Ticket Functions ==================== A Ticket is an ASN.1 structured that can be used to authenticate the holder to services. It contain an encrypted part, which the ticket holder cannot see, but can be encrypted by the service, and various information about the user and service, including an encryption key to use for the connection. *Note Ticket (ASN.1) Functions::, for more details on the ASN.1 structure of a ticket. shishi_tkt ---------- -- Function: int shishi_tkt (Shishi * HANDLE, Shishi_tkt ** TKT) HANDLE: shishi handle as allocated by `shishi_init()'. TKT: output variable with newly allocated ticket. Create a new ticket handle. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt2 ----------- -- Function: Shishi_tkt * shishi_tkt2 (Shishi * HANDLE, Shishi_asn1 TICKET, Shishi_asn1 ENCKDCREPPART, Shishi_asn1 KDCREP) HANDLE: shishi handle as allocated by `shishi_init()'. TICKET: input variable with ticket. ENCKDCREPPART: input variable with auxiliary ticket information. KDCREP: input variable with KDC-REP ticket information. Create a new ticket handle. *Return value:* Returns new ticket handle, or `NULL' on error. shishi_tkt_done --------------- -- Function: void shishi_tkt_done (Shishi_tkt * TKT) TKT: input variable with ticket info. Deallocate resources associated with ticket. The ticket must not be used again after this call. shishi_tkt_ticket ----------------- -- Function: Shishi_asn1 shishi_tkt_ticket (Shishi_tkt * TKT) TKT: input variable with ticket info. Get ASN.1 Ticket structure from ticket. *Return value:* Returns actual ticket. shishi_tkt_ticket_set --------------------- -- Function: void shishi_tkt_ticket_set (Shishi_tkt * TKT, Shishi_asn1 TICKET) TKT: input variable with ticket info. TICKET: ASN.1 Ticket to store in ticket. Set the ASN.1 Ticket in the Ticket. shishi_tkt_enckdcreppart ------------------------ -- Function: Shishi_asn1 shishi_tkt_enckdcreppart (Shishi_tkt * TKT) TKT: input variable with ticket info. Get ASN.1 EncKDCRepPart structure from ticket. *Return value:* Returns auxiliary ticket information. shishi_tkt_enckdcreppart_set ---------------------------- -- Function: void shishi_tkt_enckdcreppart_set (Shishi_tkt * TKT, Shishi_asn1 ENCKDCREPPART) TKT: structure that holds information about Ticket exchange ENCKDCREPPART: EncKDCRepPart to store in Ticket. Set the EncKDCRepPart in the Ticket. shishi_tkt_kdcrep ----------------- -- Function: Shishi_asn1 shishi_tkt_kdcrep (Shishi_tkt * TKT) TKT: input variable with ticket info. Get ASN.1 KDCRep structure from ticket. *Return value:* Returns KDC-REP information. shishi_tkt_encticketpart ------------------------ -- Function: Shishi_asn1 shishi_tkt_encticketpart (Shishi_tkt * TKT) TKT: input variable with ticket info. Get ASN.1 EncTicketPart structure from ticket. *Return value:* Returns EncTicketPart information. shishi_tkt_encticketpart_set ---------------------------- -- Function: void shishi_tkt_encticketpart_set (Shishi_tkt * TKT, Shishi_asn1 ENCTICKETPART) TKT: input variable with ticket info. ENCTICKETPART: encticketpart to store in ticket. Set the EncTicketPart in the Ticket. shishi_tkt_key -------------- -- Function: Shishi_key * shishi_tkt_key (Shishi_tkt * TKT) TKT: input variable with ticket info. Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again. *Return value:* Returns key extracted from EncKDCRepPart or EncTicketPart. shishi_tkt_key_set ------------------ -- Function: int shishi_tkt_key_set (Shishi_tkt * TKT, Shishi_key * KEY) TKT: input variable with ticket info. KEY: key to store in ticket. Set the key in the EncTicketPart. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_client ----------------- -- Function: int shishi_tkt_client (Shishi_tkt * TKT, char ** CLIENT, size_t * CLIENTLEN) TKT: input variable with ticket info. CLIENT: pointer to newly allocated zero terminated string containing principal name. May be `NULL' (to only populate `clientlen'). CLIENTLEN: pointer to length of `client' on output, excluding terminating zero. May be `NULL' (to only populate `client'). Represent client principal name in Ticket KDC-REP as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen' does not include the terminating zero. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_client_p ------------------- -- Function: int shishi_tkt_client_p (Shishi_tkt * TKT, const char * CLIENT) TKT: input variable with ticket info. CLIENT: client name of ticket. Determine if ticket is for specified client. *Return value:* Returns non-0 iff ticket is for specified client. shishi_tkt_clientrealm ---------------------- -- Function: int shishi_tkt_clientrealm (Shishi_tkt * TKT, char ** CLIENT, size_t * CLIENTLEN) TKT: input variable with ticket info. CLIENT: pointer to newly allocated zero terminated string containing principal name and realm. May be `NULL' (to only populate `clientlen'). CLIENTLEN: pointer to length of `client' on output, excluding terminating zero. May be `NULL' (to only populate `client'). Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen' does not include the terminating zero. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_clientrealm_p ------------------------ -- Function: int shishi_tkt_clientrealm_p (Shishi_tkt * TKT, const char * CLIENT) TKT: input variable with ticket info. CLIENT: principal name (client name and realm) of ticket. Determine if ticket is for specified client principal. *Return value:* Returns non-0 iff ticket is for specified client principal. shishi_tkt_realm ---------------- -- Function: int shishi_tkt_realm (Shishi_tkt * TKT, char ** REALM, size_t * REALMLEN) TKT: input variable with ticket info. REALM: pointer to newly allocated character array with realm name. REALMLEN: length of newly allocated character array with realm name. Extract realm of server in ticket. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_server ----------------- -- Function: int shishi_tkt_server (Shishi_tkt * TKT, char ** SERVER, size_t * SERVERLEN) TKT: input variable with ticket info. SERVER: pointer to newly allocated zero terminated string containing principal name. May be `NULL' (to only populate `serverlen'). SERVERLEN: pointer to length of `server' on output, excluding terminating zero. May be `NULL' (to only populate `server'). Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `serverlen' does not include the terminating zero. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_server_p ------------------- -- Function: int shishi_tkt_server_p (Shishi_tkt * TKT, const char * SERVER) TKT: input variable with ticket info. SERVER: server name of ticket. Determine if ticket is for specified server. *Return value:* Returns non-0 iff ticket is for specified server. shishi_tkt_flags ---------------- -- Function: int shishi_tkt_flags (Shishi_tkt * TKT, uint32_t * FLAGS) TKT: input variable with ticket info. FLAGS: pointer to output integer with flags. Extract flags in ticket (i.e., EncKDCRepPart). *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_flags_set -------------------- -- Function: int shishi_tkt_flags_set (Shishi_tkt * TKT, uint32_t FLAGS) TKT: input variable with ticket info. FLAGS: integer with flags to store in ticket. Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_flags_add -------------------- -- Function: int shishi_tkt_flags_add (Shishi_tkt * TKT, uint32_t FLAG) TKT: input variable with ticket info. FLAG: integer with flags to store in ticket. Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options. *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_forwardable_p ------------------------ -- Function: int shishi_tkt_forwardable_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is forwardable. The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket. *Return value:* Returns non-0 iff forwardable flag is set in ticket. shishi_tkt_forwarded_p ---------------------- -- Function: int shishi_tkt_forwarded_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is forwarded. The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets. *Return value:* Returns non-0 iff forwarded flag is set in ticket. shishi_tkt_proxiable_p ---------------------- -- Function: int shishi_tkt_proxiable_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is proxiable. The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket. *Return value:* Returns non-0 iff proxiable flag is set in ticket. shishi_tkt_proxy_p ------------------ -- Function: int shishi_tkt_proxy_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is proxy ticket. The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail. *Return value:* Returns non-0 iff proxy flag is set in ticket. shishi_tkt_may_postdate_p ------------------------- -- Function: int shishi_tkt_may_postdate_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket may be used to grant postdated tickets. The MAY-POSTDATE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. This flag MUST be set in a ticket-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket-granting ticket; postdated ticket-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime-starttime) of a postdated ticket will be the remaining life of the ticket-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime-starttime) of the ticket-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated. *Return value:* Returns non-0 iff may-postdate flag is set in ticket. shishi_tkt_postdated_p ---------------------- -- Function: int shishi_tkt_postdated_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is postdated. The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use. *Return value:* Returns non-0 iff postdated flag is set in ticket. shishi_tkt_invalid_p -------------------- -- Function: int shishi_tkt_invalid_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is invalid. The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot-list mechanism). *Return value:* Returns non-0 iff invalid flag is set in ticket. shishi_tkt_renewable_p ---------------------- -- Function: int shishi_tkt_renewable_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is renewable. The RENEWABLE flag in a ticket is normally only interpreted by the ticket-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets. *Return value:* Returns non-0 iff renewable flag is set in ticket. shishi_tkt_initial_p -------------------- -- Function: int shishi_tkt_initial_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket was issued using AS exchange. The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client. *Return value:* Returns non-0 iff initial flag is set in ticket. shishi_tkt_pre_authent_p ------------------------ -- Function: int shishi_tkt_pre_authent_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket was pre-authenticated. The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket). *Return value:* Returns non-0 iff pre-authent flag is set in ticket. shishi_tkt_hw_authent_p ----------------------- -- Function: int shishi_tkt_hw_authent_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is authenticated using a hardware token. The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket). *Return value:* Returns non-0 iff hw-authent flag is set in ticket. shishi_tkt_transited_policy_checked_p ------------------------------------- -- Function: int shishi_tkt_transited_policy_checked_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket has been policy checked for transit. The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list. While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross-realm authentication. When the KDC applies such checks and accepts such cross-realm authentication it will set the TRANSITED-POLICY-CHECKED flag in the service tickets it issues based on the cross-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required to honor this flag. Application servers MUST either do the transited-realm checks themselves, or reject cross-realm tickets without TRANSITED-POLICY- CHECKED set. *Return value:* Returns non-0 iff transited-policy-checked flag is set in ticket. shishi_tkt_ok_as_delegate_p --------------------------- -- Function: int shishi_tkt_ok_as_delegate_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is ok as delegated ticket. The copy of the ticket flags in the encrypted part of the KDC reply may have the OK-AS-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials. *Return value:* Returns non-0 iff ok-as-delegate flag is set in ticket. shishi_tkt_keytype ------------------ -- Function: int shishi_tkt_keytype (Shishi_tkt * TKT, int32_t * ETYPE) TKT: input variable with ticket info. ETYPE: pointer to encryption type that is set, see Shishi_etype. Extract encryption type of key in ticket (really EncKDCRepPart). *Return value:* Returns SHISHI_OK iff successful. shishi_tkt_keytype_fast ----------------------- -- Function: int32_t shishi_tkt_keytype_fast (Shishi_tkt * TKT) TKT: input variable with ticket info. Extract encryption type of key in ticket (really EncKDCRepPart). *Return value:* Returns encryption type of session key in ticket (really EncKDCRepPart), or -1 on error. shishi_tkt_keytype_p -------------------- -- Function: int shishi_tkt_keytype_p (Shishi_tkt * TKT, int32_t ETYPE) TKT: input variable with ticket info. ETYPE: encryption type, see Shishi_etype. Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type). *Return value:* Returns non-0 iff key in ticket is of specified encryption type. shishi_tkt_lastreqc ------------------- -- Function: time_t shishi_tkt_lastreqc (Shishi_tkt * TKT, Shishi_lrtype LRTYPE) TKT: input variable with ticket info. LRTYPE: lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST. Extract C time corresponding to given lastreq type field in the ticket. *Return value:* Returns C time interpretation of the specified lastreq field, or (time_t) -1. shishi_tkt_authctime -------------------- -- Function: time_t shishi_tkt_authctime (Shishi_tkt * TKT) TKT: input variable with ticket info. Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket. *Return value:* Returns C time interpretation of the endtime in ticket. shishi_tkt_startctime --------------------- -- Function: time_t shishi_tkt_startctime (Shishi_tkt * TKT) TKT: input variable with ticket info. Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past). *Return value:* Returns C time interpretation of the endtime in ticket. shishi_tkt_endctime ------------------- -- Function: time_t shishi_tkt_endctime (Shishi_tkt * TKT) TKT: input variable with ticket info. Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid. *Return value:* Returns C time interpretation of the endtime in ticket. shishi_tkt_renew_tillc ---------------------- -- Function: time_t shishi_tkt_renew_tillc (Shishi_tkt * TKT) TKT: input variable with ticket info. Extract C time corresponding to the renew-till field. The field holds the time where the ticket stop being valid for renewal. *Return value:* Returns C time interpretation of the renew-till in ticket. shishi_tkt_valid_at_time_p -------------------------- -- Function: int shishi_tkt_valid_at_time_p (Shishi_tkt * TKT, time_t NOW) TKT: input variable with ticket info. NOW: time to check for. Determine if ticket is valid at a specific point in time. *Return value:* Returns non-0 iff ticket is valid (not expired and after starttime) at specified time. shishi_tkt_valid_now_p ---------------------- -- Function: int shishi_tkt_valid_now_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket is valid now. *Return value:* Returns 0 iff ticket is invalid (expired or not yet valid). shishi_tkt_expired_p -------------------- -- Function: int shishi_tkt_expired_p (Shishi_tkt * TKT) TKT: input variable with ticket info. Determine if ticket has expired (i.e., endtime is in the past). *Return value:* Returns 0 iff ticket has expired. shishi_tkt_lastreq_pretty_print ------------------------------- -- Function: void shishi_tkt_lastreq_pretty_print (Shishi_tkt * TKT, FILE * FH) TKT: input variable with ticket info. FH: file handle open for writing. Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart). shishi_tkt_pretty_print ----------------------- -- Function: void shishi_tkt_pretty_print (Shishi_tkt * TKT, FILE * FH) TKT: input variable with ticket info. FH: file handle open for writing. Print a human readable representation of a ticket to file handle.  File: shishi.info, Node: AS Functions, Next: TGS Functions, Prev: Ticket Functions, Up: Programming Manual 5.7 AS Functions ================ The Authentication Service (AS) is used to get an initial ticket using e.g. your password. The following illustrates the AS-REQ and AS-REP ASN.1 structures. -- Request -- AS-REQ ::= KDC-REQ {10} KDC-REQ {INTEGER:tagnum} ::= [APPLICATION tagnum] SEQUENCE { pvno [1] INTEGER (5) -- first tag is [1], not [0] --, msg-type [2] INTEGER (tagnum), padata [3] SEQUENCE OF PA-DATA OPTIONAL, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData { AuthorizationData, { keyuse-TGSReqAuthData-sesskey | keyuse-TGSReqAuthData-subkey } } OPTIONAL, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL } -- Reply -- AS-REP ::= KDC-REP {11, EncASRepPart, {keyuse-EncASRepPart}} KDC-REP {INTEGER:tagnum, TypeToEncrypt, UInt32:KeyUsages} ::= [APPLICATION tagnum] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (tagnum), padata [2] SEQUENCE OF PA-DATA OPTIONAL, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData {TypeToEncrypt, KeyUsages} } EncASRepPart ::= [APPLICATION 25] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } shishi_as --------- -- Function: int shishi_as (Shishi * HANDLE, Shishi_as ** AS) HANDLE: shishi handle as allocated by `shishi_init()'. AS: holds pointer to newly allocate Shishi_as structure. Allocate a new AS exchange variable. *Return value:* Returns SHISHI_OK iff successful. shishi_as_done -------------- -- Function: void shishi_as_done (Shishi_as * AS) AS: structure that holds information about AS exchange Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle. shishi_as_req ------------- -- Function: Shishi_asn1 shishi_as_req (Shishi_as * AS) AS: structure that holds information about AS exchange Get ASN.1 AS-REQ structure from AS exchange. *Return value:* Returns the generated AS-REQ packet from the AS exchange, or NULL if not yet set or an error occured. shishi_as_req_build ------------------- -- Function: int shishi_as_req_build (Shishi_as * AS) AS: structure that holds information about AS exchange Possibly remove unset fields (e.g., rtime). *Return value:* Returns SHISHI_OK iff successful. shishi_as_req_set ----------------- -- Function: void shishi_as_req_set (Shishi_as * AS, Shishi_asn1 ASREQ) AS: structure that holds information about AS exchange ASREQ: asreq to store in AS. Set the AS-REQ in the AS exchange. shishi_as_req_der ----------------- -- Function: int shishi_as_req_der (Shishi_as * AS, char ** OUT, size_t * OUTLEN) AS: structure that holds information about AS exchange OUT: output array with newly allocated DER encoding of AS-REQ. OUTLEN: length of output array with DER encoding of AS-REQ. DER encode AS-REQ. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_as_req_der_set --------------------- -- Function: int shishi_as_req_der_set (Shishi_as * AS, char * DER, size_t DERLEN) AS: structure that holds information about AS exchange DER: input array with DER encoded AP-REQ. DERLEN: length of input array with DER encoded AP-REQ. DER decode AS-REQ and set it AS exchange. If decoding fails, the AS-REQ in the AS exchange remains. *Return value:* Returns SHISHI_OK. shishi_as_rep ------------- -- Function: Shishi_asn1 shishi_as_rep (Shishi_as * AS) AS: structure that holds information about AS exchange Get ASN.1 AS-REP structure from AS exchange. *Return value:* Returns the received AS-REP packet from the AS exchange, or NULL if not yet set or an error occured. shishi_as_rep_process --------------------- -- Function: int shishi_as_rep_process (Shishi_as * AS, Shishi_key * KEY, const char * PASSWORD) AS: structure that holds information about AS exchange KEY: user's key, used to encrypt the encrypted part of the AS-REP. PASSWORD: user's password, used if key is NULL. Process new AS-REP and set ticket. The key is used to decrypt the AP-REP. If both key and password is NULL, the user is queried for it. *Return value:* Returns SHISHI_OK iff successful. shishi_as_rep_build ------------------- -- Function: int shishi_as_rep_build (Shishi_as * AS, Shishi_key * KEY) AS: structure that holds information about AS exchange KEY: user's key, used to encrypt the encrypted part of the AS-REP. Build AS-REP. *Return value:* Returns SHISHI_OK iff successful. shishi_as_rep_der ----------------- -- Function: int shishi_as_rep_der (Shishi_as * AS, char ** OUT, size_t * OUTLEN) AS: structure that holds information about AS exchange OUT: output array with newly allocated DER encoding of AS-REP. OUTLEN: length of output array with DER encoding of AS-REP. DER encode AS-REP. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_as_rep_set ----------------- -- Function: void shishi_as_rep_set (Shishi_as * AS, Shishi_asn1 ASREP) AS: structure that holds information about AS exchange ASREP: asrep to store in AS. Set the AS-REP in the AS exchange. shishi_as_rep_der_set --------------------- -- Function: int shishi_as_rep_der_set (Shishi_as * AS, char * DER, size_t DERLEN) AS: structure that holds information about AS exchange DER: input array with DER encoded AP-REP. DERLEN: length of input array with DER encoded AP-REP. DER decode AS-REP and set it AS exchange. If decoding fails, the AS-REP in the AS exchange remains. *Return value:* Returns SHISHI_OK. shishi_as_krberror ------------------ -- Function: Shishi_asn1 shishi_as_krberror (Shishi_as * AS) AS: structure that holds information about AS exchange Get ASN.1 KRB-ERROR structure from AS exchange. *Return value:* Returns the received KRB-ERROR packet from the AS exchange, or NULL if not yet set or an error occured. shishi_as_krberror_der ---------------------- -- Function: int shishi_as_krberror_der (Shishi_as * AS, char ** OUT, size_t * OUTLEN) AS: structure that holds information about AS exchange OUT: output array with newly allocated DER encoding of KRB-ERROR. OUTLEN: length of output array with DER encoding of KRB-ERROR. DER encode KRB-ERROR. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_as_krberror_set ---------------------- -- Function: void shishi_as_krberror_set (Shishi_as * AS, Shishi_asn1 KRBERROR) AS: structure that holds information about AS exchange KRBERROR: krberror to store in AS. Set the KRB-ERROR in the AS exchange. shishi_as_tkt ------------- -- Function: Shishi_tkt * shishi_as_tkt (Shishi_as * AS) AS: structure that holds information about AS exchange Get Ticket in AS exchange. *Return value:* Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured. shishi_as_tkt_set ----------------- -- Function: void shishi_as_tkt_set (Shishi_as * AS, Shishi_tkt * TKT) AS: structure that holds information about AS exchange TKT: tkt to store in AS. Set the Tkt in the AS exchange. shishi_as_sendrecv_hint ----------------------- -- Function: int shishi_as_sendrecv_hint (Shishi_as * AS, Shishi_tkts_hint * HINT) AS: structure that holds information about AS exchange HINT: additional parameters that modify connection behaviour, or `NULL'. Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The `hint' structure can be used to set, e.g., parameters for TLS authentication. *Return value:* Returns SHISHI_OK iff successful. shishi_as_sendrecv ------------------ -- Function: int shishi_as_sendrecv (Shishi_as * AS) AS: structure that holds information about AS exchange Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. *Return value:* Returns SHISHI_OK iff successful.  File: shishi.info, Node: TGS Functions, Next: Ticket (ASN.1) Functions, Prev: AS Functions, Up: Programming Manual 5.8 TGS Functions ================= The Ticket Granting Service (TGS) is used to get subsequent tickets, authenticated by other tickets (so called ticket granting tickets). The following illustrates the TGS-REQ and TGS-REP ASN.1 structures. -- Request -- TGS-REQ ::= KDC-REQ {12} KDC-REQ {INTEGER:tagnum} ::= [APPLICATION tagnum] SEQUENCE { pvno [1] INTEGER (5) -- first tag is [1], not [0] --, msg-type [2] INTEGER (tagnum), padata [3] SEQUENCE OF PA-DATA OPTIONAL, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData { AuthorizationData, { keyuse-TGSReqAuthData-sesskey | keyuse-TGSReqAuthData-subkey } } OPTIONAL, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL } -- Reply -- TGS-REP ::= KDC-REP {13, EncTGSRepPart, { keyuse-EncTGSRepPart-sesskey | keyuse-EncTGSRepPart-subkey }} KDC-REP {INTEGER:tagnum, TypeToEncrypt, UInt32:KeyUsages} ::= [APPLICATION tagnum] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (tagnum), padata [2] SEQUENCE OF PA-DATA OPTIONAL, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData {TypeToEncrypt, KeyUsages} } EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } shishi_tgs ---------- -- Function: int shishi_tgs (Shishi * HANDLE, Shishi_tgs ** TGS) HANDLE: shishi handle as allocated by `shishi_init()'. TGS: holds pointer to newly allocate Shishi_tgs structure. Allocate a new TGS exchange variable. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_done --------------- -- Function: void shishi_tgs_done (Shishi_tgs * TGS) TGS: structure that holds information about AS exchange Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle. shishi_tgs_tgtkt ---------------- -- Function: Shishi_tkt * shishi_tgs_tgtkt (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get Ticket-granting-ticket from TGS exchange. *Return value:* Returns the ticket-granting-ticket used in the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_tgtkt_set -------------------- -- Function: void shishi_tgs_tgtkt_set (Shishi_tgs * TGS, Shishi_tkt * TGTKT) TGS: structure that holds information about TGS exchange TGTKT: ticket granting ticket to store in TGS. Set the Ticket in the TGS exchange. shishi_tgs_ap ------------- -- Function: Shishi_ap * shishi_tgs_ap (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get the AP from TGS exchange. *Return value:* Returns the AP exchange (part of TGS-REQ) from the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_req -------------- -- Function: Shishi_asn1 shishi_tgs_req (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get the TGS-REQ from TGS exchange. *Return value:* Returns the generated TGS-REQ from the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_req_set ------------------ -- Function: void shishi_tgs_req_set (Shishi_tgs * TGS, Shishi_asn1 TGSREQ) TGS: structure that holds information about TGS exchange TGSREQ: tgsreq to store in TGS. Set the TGS-REQ in the TGS exchange. shishi_tgs_req_der ------------------ -- Function: int shishi_tgs_req_der (Shishi_tgs * TGS, char ** OUT, size_t * OUTLEN) TGS: structure that holds information about TGS exchange OUT: output array with newly allocated DER encoding of TGS-REQ. OUTLEN: length of output array with DER encoding of TGS-REQ. DER encode TGS-REQ. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_req_der_set ---------------------- -- Function: int shishi_tgs_req_der_set (Shishi_tgs * TGS, char * DER, size_t DERLEN) TGS: structure that holds information about TGS exchange DER: input array with DER encoded AP-REQ. DERLEN: length of input array with DER encoded AP-REQ. DER decode TGS-REQ and set it TGS exchange. If decoding fails, the TGS-REQ in the TGS exchange remains. *Return value:* Returns SHISHI_OK. shishi_tgs_req_process ---------------------- -- Function: int shishi_tgs_req_process (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ is taken from the EncKDCReqPart of the TGS tgticket. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_req_build -------------------- -- Function: int shishi_tgs_req_build (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Checksum data in authenticator and add ticket and authenticator to TGS-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_rep -------------- -- Function: Shishi_asn1 shishi_tgs_rep (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get TGS-REP from TGS exchange. *Return value:* Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_rep_der ------------------ -- Function: int shishi_tgs_rep_der (Shishi_tgs * TGS, char ** OUT, size_t * OUTLEN) TGS: structure that holds information about TGS exchange OUT: output array with newly allocated DER encoding of TGS-REP. OUTLEN: length of output array with DER encoding of TGS-REP. DER encode TGS-REP. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_rep_process ---------------------- -- Function: int shishi_tgs_rep_process (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Process new TGS-REP and set ticket. The key to decrypt the TGS-REP is taken from the EncKDCRepPart of the TGS tgticket. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_rep_build -------------------- -- Function: int shishi_tgs_rep_build (Shishi_tgs * TGS, int KEYUSAGE, Shishi_key * KEY) TGS: structure that holds information about TGS exchange KEYUSAGE: keyusage integer. KEY: user's key, used to encrypt the encrypted part of the TGS-REP. Build TGS-REP. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_krberror ------------------- -- Function: Shishi_asn1 shishi_tgs_krberror (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get KRB-ERROR from TGS exchange. *Return value:* Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_krberror_der ----------------------- -- Function: int shishi_tgs_krberror_der (Shishi_tgs * TGS, char ** OUT, size_t * OUTLEN) TGS: structure that holds information about TGS exchange OUT: output array with newly allocated DER encoding of KRB-ERROR. OUTLEN: length of output array with DER encoding of KRB-ERROR. DER encode KRB-ERROR. `out' is allocated by this function, and it is the responsibility of caller to deallocate it. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_krberror_set ----------------------- -- Function: void shishi_tgs_krberror_set (Shishi_tgs * TGS, Shishi_asn1 KRBERROR) TGS: structure that holds information about TGS exchange KRBERROR: krberror to store in TGS. Set the KRB-ERROR in the TGS exchange. shishi_tgs_tkt -------------- -- Function: Shishi_tkt * shishi_tgs_tkt (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Get Ticket from TGS exchange. *Return value:* Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured. shishi_tgs_tkt_set ------------------ -- Function: void shishi_tgs_tkt_set (Shishi_tgs * TGS, Shishi_tkt * TKT) TGS: structure that holds information about TGS exchange TKT: ticket to store in TGS. Set the Ticket in the TGS exchange. shishi_tgs_sendrecv_hint ------------------------ -- Function: int shishi_tgs_sendrecv_hint (Shishi_tgs * TGS, Shishi_tkts_hint * HINT) TGS: structure that holds information about TGS exchange HINT: additional parameters that modify connection behaviour, or `NULL'. Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The `hint' structure can be used to set, e.g., parameters for TLS authentication. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_sendrecv ------------------- -- Function: int shishi_tgs_sendrecv (Shishi_tgs * TGS) TGS: structure that holds information about TGS exchange Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_set_server --------------------- -- Function: int shishi_tgs_set_server (Shishi_tgs * TGS, const char * SERVER) TGS: structure that holds information about TGS exchange SERVER: indicates the server to acquire ticket for. Set the server in the TGS-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_set_realm -------------------- -- Function: int shishi_tgs_set_realm (Shishi_tgs * TGS, const char * REALM) TGS: structure that holds information about TGS exchange REALM: indicates the realm to acquire ticket for. Set the server in the TGS-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi_tgs_set_realmserver -------------------------- -- Function: int shishi_tgs_set_realmserver (Shishi_tgs * TGS, const char * REALM, const char * SERVER) TGS: structure that holds information about TGS exchange REALM: indicates the realm to acquire ticket for. SERVER: indicates the server to acquire ticket for. Set the realm and server in the TGS-REQ. *Return value:* Returns SHISHI_OK iff successful. shishi-1.0.2/doc/shisa.10000644000000000000000000000666312126773203011644 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH SHISA "1" "April 2013" "shisa 1.0.2" "User Commands" .SH NAME shisa \- Shishi database interface .SH SYNOPSIS .B shisa [\fIOPTIONS\fR]... [\fIREALM \fR[\fIPRINCIPAL\fR]]... .SH DESCRIPTION shisa 1.0.2 .PP Manipulate information stored in the Shisa user database. .TP \fB\-h\fR, \fB\-\-help\fR Print help and exit .TP \fB\-V\fR, \fB\-\-version\fR Print version and exit .SS "Operations:" .TP \fB\-a\fR, \fB\-\-add\fR Add realm or principal to database. .TP \fB\-d\fR, \fB\-\-dump\fR Dump entries in database. .TP \fB\-n\fR, \fB\-\-key\-add\fR Add new key to a principal in database. .TP \fB\-\-key\-remove\fR Remove a key from a principal in database. .TP \fB\-l\fR, \fB\-\-list\fR List entries in database. .TP \fB\-m\fR, \fB\-\-modify\fR Modify principal entry in database. .TP \fB\-r\fR, \fB\-\-remove\fR Remove realm or principal from database. .SS "Parameters:" .TP \fB\-f\fR, \fB\-\-force\fR Allow removal of non\-empty realms. (default=off) .TP \fB\-\-enabled\fR Only dump or list enabled principals. (default=off) .TP \fB\-\-disabled\fR Only dump or list disabled principals. (default=off) .TP \fB\-\-keys\fR Print cryptographic key and password in hostkey format. (default=off) .SS "Values:" .TP \fB\-E\fR, \fB\-\-encryption\-type\fR=\fISTRING\fR Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des\-md5', \&'des\-md4', 'des\-crc', 'des' (same as \&'des\-md5'), and 'arcfour'. .TP \fB\-\-key\-version\fR=\fINUMBER\fR Version of key. .TP \fB\-\-password\fR[=\fISTRING\fR] Derive key from this password. .TP \fB\-\-priority\fR=\fINUMBER\fR Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. .IP (default is 0, which mean a random key of .IP the best etype is chosen) .TP \fB\-\-random\fR Use a random key. (default) .TP \fB\-\-salt\fR=\fISTRING\fR Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name. .TP \fB\-\-string\-to\-key\-parameter\fR=\fIHEX\fR Encryption algorithm specific parameter for .TP password derivation. Currently only the AES .IP algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver. .SS "Other options:" .HP \fB\-c\fR, \fB\-\-configuration\-file\fR=\fIFILE\fR Use specified configuration file. .TP \fB\-o\fR, \fB\-\-library\-options\fR=\fISTRING\fR Parse string as configuration file statement. .TP \fB\-v\fR, \fB\-\-verbose\fR Produce verbose output. (default=off) .TP \fB\-q\fR, \fB\-\-quiet\fR Don't produce any diagnostic output. (default=off) .PP Mandatory arguments to long options are mandatory for short options too. .SH AUTHOR Written by Simon Josefsson. .SH "REPORTING BUGS" Report bugs to: bug\-shishi@gnu.org .br GNU Shishi home page: .br General help using GNU software: .SH COPYRIGHT Copyright \(co 2013 Simon Josefsson. License GPLv3+: GNU GPL version 3 or later . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B shisa is maintained as a Texinfo manual. If the .B info and .B shisa programs are properly installed at your site, the command .IP .B info shishi .PP should give you access to the complete manual. shishi-1.0.2/doc/stamp-vti0000644000000000000000000000013612126773105012310 00000000000000@set UPDATED 3 April 2013 @set UPDATED-MONTH April 2013 @set EDITION 1.0.2 @set VERSION 1.0.2 shishi-1.0.2/doc/shishi.html0000644000000000000000000367015112126773314012635 00000000000000 GNU Shishi 1.0.2

      GNU Shishi 1.0.2

      Table of Contents


      Next: , Up: (dir)

      Shishi

      This manual is last updated 3 April 2013 for version 1.0.2 of Shishi.

      Copyright © 2002-2013 Simon Josefsson.

      Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.

      Appendices

      Indices


      Next: , Previous: Top, Up: Top

      1 Introduction

      Shishi is an implementation of the Kerberos 5 network authentication system, as specified in RFC 4120. Shishi can be used to authenticate users in distributed systems.

      Shishi contains a library ('libshishi') that can be used by application developers to add support for Kerberos 5. Shishi contains a command line utility ('shishi') that is used by users to acquire and manage tickets (and more). The server side, a Key Distribution Center, is implemented by 'shishid'. Of course, a manual documenting usage aspects as well as the programming API is included.

      Shishi currently supports AS/TGS exchanges for acquiring tickets, pre-authentication, the AP exchange for performing client and server authentication, and SAFE/PRIV for integrity/privacy protected application data exchanges.

      Shishi is internationalized; error and status messages can be translated into the users' language; user name and passwords can be converted into any available character set (normally including ISO-8859-1 and UTF-8) and also be processed using an experimental Stringprep profile.

      Most, if not all, of the widely used encryption and checksum types are supported, such as 3DES, AES, ARCFOUR and HMAC-SHA1.

      Shishi is developed for the GNU/Linux system, but runs on over 20 platforms including most major Unix platforms and Windows, and many kind of devices including iPAQ handhelds and S/390 mainframes.

      Shishi is free software licensed under the GNU General Public License version 3.0 or later.

      1.1 Getting Started

      This manual documents the Shishi application and library programming interface. All commands, functions and data types provided by Shishi are explained.

      The reader is assumed to possess basic familiarity with network security and the Kerberos 5 security system.

      This manual can be used in several ways. If read from the beginning to the end, it gives a good introduction into the library and how it can be used in an application. Forward references are included where necessary. Later on, the manual can be used as a reference manual to get just the information needed about any particular interface of the library. Experienced programmers might want to start looking at the examples at the end of the manual, and then only read up on those parts of the interface which are unclear.


      Next: , Previous: Getting Started, Up: Introduction

      1.2 Features and Status

      Shishi might have a couple of advantages over other packages doing a similar job.

      It's Free Software
      Anybody can use, modify, and redistribute it under the terms of the GNU General Public License version 3.0 or later.
      It's thread-safe
      The library uses no global variables.
      It's internationalized
      It handles non-ASCII username and passwords, and user visible strings used in the library (error messages) can be translated into the users' language.
      It's portable
      It should work on all Unix like operating systems, including Windows.

      Shishi is far from feature complete, it is not even a full RFC 1510 implementation yet. However, some basic functionality is implemented. A few implemented feature are mentioned below.

      • Initial authentication (AS) from raw key or password. This step is typically used to acquire a ticket granting ticket and, less commonly, a server ticket.
      • Subsequent authentication (TGS). This step is typically used to acquire a server ticket, by authenticating yourself using the ticket granting ticket.
      • Client-Server authentication (AP). This step is used by clients and servers to prove to each other who they are, using negotiated tickets.
      • Integrity protected communication (SAFE). This step is used by clients and servers to exchange integrity protected data with each other. The key is typically agreed on using the Client-Server authentication step.
      • Ticket cache, supporting multiple principals and realms. As tickets have a life time of typically several hours, they are managed in disk files. There can be multiple ticket caches, and each ticket cache can store tickets for multiple clients (users), servers, encryption types, etc. Functionality is provided for locating the proper ticket for every use.
      • Most standard cryptographic primitives. The believed most secure algorithms are supported (see Cryptographic Overview).
      • Telnet client and server. This is used to remotely login to other machines, after authenticating yourself with a ticket.
      • PAM module. This is used to login locally on a machine.
      • KDC addresses located using DNS SRV RRs.
      • Modularized low-level crypto interface. Currently Gnulib and Libgcrypt are supported. If you wish to add support for another low-level cryptographic library, you only have to implement a few APIs for DES, AES, MD5, SHA1, HMAC, etc. Look at gl/gc-gnulib.c or gl/gc-libgcrypt.c as a starting pointer.

      The following table summarize what the current objectives are (i.e., the todo list) and an estimate on how long it will take to implement the feature, including some reasonable startup-time to get familiar with Shishi in general. If you like to start working on anything, please let me know so work duplication can be avoided.

      • Parse /etc/krb5.keytab to extract keys to use for telnetd etc (week)
      • Cross-realm support (week).
      • PKINIT (use libksba, weeks)
      • Finish GSSAPI support via GSSLib (weeks) Shishi will not support GSSLib natively, but a separate project “GSSLib” is under way to produce a generic GSS implementation, and it will use Shishi to implement the Kerberos 5 mechanism.
      • Port to cyclone (cyclone need to mature first)
      • Modularize ASN.1 library so it can be replaced (days). Almost done, all ASN.1 functionality is found in lib/asn1.c, although the interface is rather libtasn1 centric.
      • KDC (initiated, weeks)
      • LDAP backend for Shisa.
      • Set/Change password protocol (weeks?)
      • Port applications to use Shishi (indefinite)
      • Finish server-realm stuff
      • Improve documentation
      • Improve internationalization
      • Add AP-REQ replay cache (week).
      • Study benefits by introducing a PA-TGS-REP. This would provide mutual authentication of the KDC in a way that is easier to analyze. Currently the mutual authentication property is only implicit from successful decryption of the KDC-REP and the 4 byte nonce.
      • GUI applet for managing tickets. This is supported via the ticket-applet, of which a Shishi port is published on the Shishi home page.
      • Authorization library (months?) The shishi_authorized_p() is not a good solution, better would be to have a generic and flexible authorization library. Possibly based on S-EXP's in tickets? Should support non-Kerberos uses as well, of course.
      • Proof read manual.
      • X.500 support, including DOMAIN-X500-COMPRESS. I will accept patches that implement this, if it causes minimal changes to the current code.

      1.3 Overview

      This section describes RFC 1510 from a protocol point of view1.

      Kerberos provides a means of verifying the identities of principals, (e.g., a workstation user or a network server) on an open (unprotected) network. This is accomplished without relying on authentication by the host operating system, without basing trust on host addresses, without requiring physical security of all the hosts on the network, and under the assumption that packets traveling along the network can be read, modified, and inserted at will. (Note, however, that many applications use Kerberos' functions only upon the initiation of a stream-based network connection, and assume the absence of any "hijackers" who might subvert such a connection. Such use implicitly trusts the host addresses involved.) Kerberos performs authentication under these conditions as a trusted third- party authentication service by using conventional cryptography, i.e., shared secret key. (shared secret key - Secret and private are often used interchangeably in the literature. In our usage, it takes two (or more) to share a secret, thus a shared DES key is a secret key. Something is only private when no one but its owner knows it. Thus, in public key cryptosystems, one has a public and a private key.)

      The authentication process proceeds as follows: A client sends a request to the authentication server (AS) requesting "credentials" for a given server. The AS responds with these credentials, encrypted in the client's key. The credentials consist of 1) a "ticket" for the server and 2) a temporary encryption key (often called a "session key"). The client transmits the ticket (which contains the client's identity and a copy of the session key, all encrypted in the server's key) to the server. The session key (now shared by the client and server) is used to authenticate the client, and may optionally be used to authenticate the server. It may also be used to encrypt further communication between the two parties or to exchange a separate sub-session key to be used to encrypt further communication.

      The implementation consists of one or more authentication servers running on physically secure hosts. The authentication servers maintain a database of principals (i.e., users and servers) and their secret keys. Code libraries provide encryption and implement the Kerberos protocol. In order to add authentication to its transactions, a typical network application adds one or two calls to the Kerberos library, which results in the transmission of the necessary messages to achieve authentication.

      The Kerberos protocol consists of several sub-protocols (or exchanges). There are two methods by which a client can ask a Kerberos server for credentials. In the first approach, the client sends a cleartext request for a ticket for the desired server to the AS. The reply is sent encrypted in the client's secret key. Usually this request is for a ticket-granting ticket (TGT) which can later be used with the ticket-granting server (TGS). In the second method, the client sends a request to the TGS. The client sends the TGT to the TGS in the same manner as if it were contacting any other application server which requires Kerberos credentials. The reply is encrypted in the session key from the TGT.

      Once obtained, credentials may be used to verify the identity of the principals in a transaction, to ensure the integrity of messages exchanged between them, or to preserve privacy of the messages. The application is free to choose whatever protection may be necessary.

      To verify the identities of the principals in a transaction, the client transmits the ticket to the server. Since the ticket is sent "in the clear" (parts of it are encrypted, but this encryption doesn't thwart replay) and might be intercepted and reused by an attacker, additional information is sent to prove that the message was originated by the principal to whom the ticket was issued. This information (called the authenticator) is encrypted in the session key, and includes a timestamp. The timestamp proves that the message was recently generated and is not a replay. Encrypting the authenticator in the session key proves that it was generated by a party possessing the session key. Since no one except the requesting principal and the server know the session key (it is never sent over the network in the clear) this guarantees the identity of the client.

      The integrity of the messages exchanged between principals can also be guaranteed using the session key (passed in the ticket and contained in the credentials). This approach provides detection of both replay attacks and message stream modification attacks. It is accomplished by generating and transmitting a collision-proof checksum (elsewhere called a hash or digest function) of the client's message, keyed with the session key. Privacy and integrity of the messages exchanged between principals can be secured by encrypting the data to be passed using the session key passed in the ticket, and contained in the credentials.


      Next: , Previous: Overview, Up: Introduction

      1.4 Cryptographic Overview

      Shishi implements several of the standard cryptographic primitives. In this section we give the names of the supported encryption suites, and some notes about them, and their associated checksum suite.

      Statements such as “it is weak” should be read as meaning that there is no credible security analysis of the mechanism available, and/or that should an attack be published publicly, few people would likely be surprised. Also keep in mind that the key size mentioned is the actual key size, not the effective key space as far as a brute force attack is concerned.

      As you may infer from the descriptions, there is currently no encryption algorithm and only one checksum algorithm that inspire great confidence in its design. Hopefully this will change over time.

      NULL
      NULL is a dummy encryption suite for debugging. Encryption and decryption are identity functions. No integrity protection. It is weak. It is associated with the NULL checksum.
      arcfour-hmac
      arcfour-hmac-exp
      arcfour-hmac-* are a proprietary stream cipher with 56 bit (arcfour-hmac-exp) or 128 bit (arcfour-hmac) keys, used in a proprietary way described in an expired IETF draft draft-brezak-win2k-krb-rc4-hmac-04.txt. Deriving keys from passwords is supported, and is done by computing a message digest (MD4) of a 16-bit Unicode representation of the ASCII password, with no salt. Data is integrity protected with a keyed hash (HMAC-MD5), where the key is derived from the base key in a creative way. It is weak. It is associated with the arcfour-hmac-md5 checksum.
      des-cbc-none
      des-cbc-none is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. It is weak, because it offers no integrity protection. This is typically only used by RFC 1964 GSS-API implementations (which try to protect integrity using an ad-hoc solution). It is associated with the NULL checksum.
      des-cbc-crc
      des-cbc-crc is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using the key as IV (see Key as initialization vector). The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted CRC32-like checksum. It is weak. It is associated with the rsa-md5-des checksum.
      des-cbc-md4
      des-cbc-md4 is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD4 hash. It is weak. It is associated with the rsa-md4-des checksum.
      des-cbc-md5
      des-cbc-md5 is DES encryption and decryption with 56 bit keys and 8 byte blocks in CBC mode, using a zero IV. The keys can be derived from passwords by an obscure application specific algorithm. Data is integrity protected with an unkeyed but encrypted MD5 hash. It is weak. It is associated with the rsa-md5-des checksum. This is the strongest RFC 1510 interoperable encryption mechanism.
      des3-cbc-none
      des3-cbc-none is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by the same algorithm as des3-cbc-sha1-kd. It is weak, because it offers no integrity protection. This is typically only used by GSS-API implementations (which try to protect integrity using an ad-hoc solution) for interoperability with some existing Kerberos GSS implementations. It is associated with the NULL checksum.
      des3-cbc-sha1-kd
      des3-cbc-sha1-kd is DES encryption and decryption with three 56 bit keys (effective key size 112 bits) and 8 byte blocks in CBC mode. The keys can be derived from passwords by a algorithm based on the paper "A Better Key Schedule For DES-like Ciphers" 2 by Uri Blumenthal and Steven M. Bellovin (it is not clear if the algorithm, and the way it is used, is used by any other protocols, although it seems unlikely). Data is integrity protected with a keyed SHA1 hash in HMAC mode. It has no security proof, but is assumed to provide adequate security in the sense that knowledge on how to crack it is not known to the public. Note that the key derivation function is not widely used outside of Kerberos, hence not widely studied. It is associated with the hmac-sha1-des3-kd checksum.
      aes128-cts-hmac-sha1-96
      aes256-cts-hmac-sha1-96
      aes128-cts-hmac-sha1-96 and aes256-cts-hmac-sha1-96 is AES encryption and decryption with 128 bit and 256 bit key, respectively, and 16 byte blocks in CBC mode with Cipher Text Stealing. Cipher Text Stealing means data length of encrypted data is preserved (pure CBC add up to 7 pad characters). The keys can be derived from passwords with RSA Laboratories PKCS#5 Password Based Key Derivation Function 23, which is allegedly provably secure in a random oracle model. Data is integrity protected with a keyed SHA1 hash, in HMAC mode, truncated to 96 bits. There is no security proof, but the schemes are assumed to provide adequate security in the sense that knowledge on how to crack them is not known to the public. Note that AES has yet to receive the test of time, and the AES cipher encryption mode (CBC with Ciphertext Stealing, and a non-standard IV output) is not widely standardized (hence not widely studied). It is associated with the hmac-sha1-96-aes128 and hmac-sha1-96-aes256 checksums, respectively.

      The protocol do not include any way to negotiate which checksum mechanisms to use, so in most cases the associated checksum will be used. However, checksum mechanisms can be used with other encryption mechanisms, as long as they are compatible in terms of key format etc. Here are the names of the supported checksum mechanisms, with some notes on their status and the compatible encryption mechanisms. They are ordered by increased security as perceived by the author.

      NULL
      NULL is a dummy checksum suite for debugging. It provides no integrity. It is weak. It is compatible with the NULL encryption mechanism.
      arcfour-hmac-md5
      arcfour-hmac-md5 is a keyed HMAC-MD5 checksum computed on a MD5 message digest, in turn computed on a four byte message type indicator concatenated with the application data. (The arcfour designation is thus somewhat misleading, but since this checksum mechanism is described in the same document as the arcfour encryption mechanisms, it is not a completely unnatural designation.) It is weak. It is compatible with all encryption mechanisms.
      rsa-md4
      rsa-md4 is a unkeyed MD4 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms.
      rsa-md4-des
      rsa-md4-des is a DES CBC encryption of one block of random data and a unkeyed MD4 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the des-cbc-crc, des-cbc-md4, des-cbc-md5 encryption mechanisms.
      rsa-md5
      rsa-md5 is a unkeyed MD5 hash computed over the message. It is weak, because it is unkeyed. However applications can, with care, use it non-weak ways (e.g., by including the hash in other messages that are protected by other means). It is compatible with all encryption mechanisms.
      rsa-md5-des
      rsa-md5-des is a DES CBC encryption of one block of random data and a unkeyed MD5 hash computed over the random data and the message to integrity protect. The key used is derived from the base protocol key by XOR with a constant. It is weak. It is compatible with the des-cbc-crc, des-cbc-md4, des-cbc-md5 encryption mechanisms.
      hmac-sha1-des3-kd
      hmac-sha1-des3-kd is a keyed SHA1 hash in HMAC mode computed over the message. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of des3-cbc-sha1-kd, which does not appear to be widely used outside Kerberos and hence not widely studied). It has no security proof, but is assumed to provide good security. The weakest part is likely the proprietary key derivation function. It is compatible with the des3-cbc-sha1-kd encryption mechanism.
      hmac-sha1-96-aes128
      hmac-sha1-96-aes256
      hmac-sha1-96-aes* are keyed SHA1 hashes in HMAC mode computed over the message and then truncated to 96 bits. The key is derived from the base protocol by the simplified key derivation function (similar to the password key derivation functions of aes*-cts-hmac-sha1-96, i.e., PKCS#5). It has no security proof, but is assumed to provide good security. It is compatible with the aes*-cts-hmac-sha1-96 encryption mechanisms.

      Several of the cipher suites have long names that can be hard to memorize. For your convenience, the following short-hand aliases exists. They can be used wherever the full encryption names are used.

      arcfour
      Alias for arcfour-hmac.
      des-crc
      Alias for des-cbc-crc.
      des-md4
      Alias for des-cbc-md4.
      des-md5
      des
      Alias for des-cbc-md5.
      des3
      3des
      Alias for des3-cbc-sha1-kd.
      aes128
      Alias for aes128-cts-hmac-sha1-96.
      aes
      aes256
      Alias for aes256-cts-hmac-sha1-96.

      1.5 Supported Platforms

      Shishi has at some point in time been tested on the following platforms. Online build reports for each platforms and Shishi version is available at http://autobuild.josefsson.org/shishi/.

      1. Debian GNU/Linux 3.0 (Woody) GCC 2.95.4 and GNU Make. This is the main development platform. alphaev67-unknown-linux-gnu, alphaev6-unknown-linux-gnu, arm-unknown-linux-gnu, armv4l-unknown-linux-gnu, hppa-unknown-linux-gnu, hppa64-unknown-linux-gnu, i686-pc-linux-gnu, ia64-unknown-linux-gnu, m68k-unknown-linux-gnu, mips-unknown-linux-gnu, mipsel-unknown-linux-gnu, powerpc-unknown-linux-gnu, s390-ibm-linux-gnu, sparc-unknown-linux-gnu, sparc64-unknown-linux-gnu.
      2. Debian GNU/Linux 2.1 GCC 2.95.4 and GNU Make. armv4l-unknown-linux-gnu.
      3. Tru64 UNIX Tru64 UNIX C compiler and Tru64 Make. alphaev67-dec-osf5.1, alphaev68-dec-osf5.1.
      4. SuSE Linux 7.1 GCC 2.96 and GNU Make. alphaev6-unknown-linux-gnu, alphaev67-unknown-linux-gnu.
      5. SuSE Linux 7.2a GCC 3.0 and GNU Make. ia64-unknown-linux-gnu.
      6. SuSE Linux GCC 3.2.2 and GNU Make. x86_64-unknown-linux-gnu (AMD64 Opteron “Melody”).
      7. RedHat Linux 7.2 GCC 2.96 and GNU Make. alphaev6-unknown-linux-gnu, alphaev67-unknown-linux-gnu, ia64-unknown-linux-gnu.
      8. RedHat Linux 8.0 GCC 3.2 and GNU Make. i686-pc-linux-gnu.
      9. RedHat Advanced Server 2.1 GCC 2.96 and GNU Make. i686-pc-linux-gnu.
      10. Slackware Linux 8.0.01 GCC 2.95.3 and GNU Make. i686-pc-linux-gnu.
      11. Mandrake Linux 9.0 GCC 3.2 and GNU Make. i686-pc-linux-gnu.
      12. IRIX 6.5 MIPS C compiler, IRIX Make. mips-sgi-irix6.5.
      13. AIX 4.3.2 IBM C for AIX compiler, AIX Make. rs6000-ibm-aix4.3.2.0.
      14. HP-UX 11 HP-UX C compiler and HP Make. ia64-hp-hpux11.22, hppa2.0w-hp-hpux11.11.
      15. SUN Solaris 2.8 Sun WorkShop Compiler C 6.0 and SUN Make. sparc-sun-solaris2.8.
      16. NetBSD 1.6 GCC 2.95.3 and GNU Make. alpha-unknown-netbsd1.6, i386-unknown-netbsdelf1.6.
      17. OpenBSD 3.1 and 3.2 GCC 2.95.3 and GNU Make. alpha-unknown-openbsd3.1, i386-unknown-openbsd3.1.
      18. FreeBSD 4.7 and 4.8 GCC 2.95.4 and GNU Make. alpha-unknown-freebsd4.7, alpha-unknown-freebsd4.8, i386-unknown-freebsd4.7, i386-unknown-freebsd4.8.
      19. MacOS X 10.2 Server Edition GCC 3.1 and GNU Make. powerpc-apple-darwin6.5.
      20. Cross compiled to uClinux/uClibc on Motorola Coldfire. GCC 3.4 and GNU Make m68k-uclinux-elf.

      If you use Shishi on, or port Shishi to, a new platform please report it to the author (see Bug Reports).

      1.6 Getting help

      A mailing list where users of Shishi may help each other exists, and you can reach it by sending e-mail to help-shishi@gnu.org. Archives of the mailing list discussions, and an interface to manage subscriptions, is available through the World Wide Web at http://lists.gnu.org/mailman/listinfo/help-shishi.

      1.7 Commercial Support

      Commercial support is available for users of Shishi. The kind of support that can be purchased may include:

      • Implement new features. Such as support for some optional part of the Kerberos standards, e.g. PKINIT, hardware token authentication.
      • Port Shishi to new platforms. This could include porting Shishi to an embedded platforms that may need memory or size optimization.
      • Integrate Kerberos 5 support in your existing project.
      • System design of components related to Kerberos 5.

      If you are interested, please write to:

      Simon Josefsson Datakonsult
      Hagagatan 24
      113 47 Stockholm
      Sweden
      
      E-mail: simon@josefsson.org
      

      If your company provides support related to Shishi and would like to be mentioned here, contact the author (see Bug Reports).


      Next: , Previous: Commercial Support, Up: Introduction

      1.8 Downloading and Installing

      The package can be downloaded from several places, including:

      ftp://alpha.gnu.org/pub/gnu/shishi/

      The latest version is stored in a file, e.g., ‘shishi-1.0.2.tar.gz’ where the ‘1.0.2’ indicate the highest version number.

      The package is then extracted, configured and built like many other packages that use Autoconf. For detailed information on configuring and building it, refer to the INSTALL file that is part of the distribution archive.

      Here is an example terminal session that download, configure, build and install the package. You will need a few basic tools, such as ‘sh’, ‘make’ and ‘cc’.

           $ wget -q ftp://alpha.gnu.org/pub/gnu/shishi/shishi-1.0.2.tar.gz
           $ tar xfz shishi-1.0.2.tar.gz
           $ cd shishi-1.0.2/
           $ ./configure
           ...
           $ make
           ...
           $ make install
           ...
      

      After this you should be prepared to continue with the user, administration or programming manual, depending on how you want to use Shishi.

      A few configure options may be relevant, summarized in the table.

      --disable-des
      --disable-3des
      --disable-aes
      --disable-md
      --disable-null
      --disable-arcfour
      Disable a cryptographic algorithm at compile time. Usually it is better to disable algorithms during run-time with the configuration file, but this allows you to reduce the code size slightly.
      --disable-starttls
      Disable the experimental TLS support for KDC connections. If you do not use a Shishi KDC, this support is of no use so you could safely disable it.
      --without-stringprep
      Disable internationalized string processing.

      For the complete list, refer to the output from configure --help.

      1.9 Bug Reports

      If you think you have found a bug in Shishi, please investigate it and report it.

      • Please make sure that the bug is really in Shishi, and preferably also check that it hasn't already been fixed in the latest version.
      • You have to send us a test case that makes it possible for us to reproduce the bug.
      • You also have to explain what is wrong; if you get a crash, or if the results printed are not good and in that case, in what way. Make sure that the bug report includes all information you would need to fix this kind of bug for someone else.

      Please make an effort to produce a self-contained report, with something definite that can be tested or debugged. Vague queries or piecemeal messages are difficult to act on and don't help the development effort.

      If your bug report is good, we will do our best to help you to get a corrected version of the software; if the bug report is poor, we won't do anything about it (apart from asking you to send better bug reports).

      If you think something in this manual is unclear, or downright incorrect, or if the language needs to be improved, please also send a note.

      Send your bug report to:

      bug-shishi@josefsson.org


      Previous: Bug Reports, Up: Introduction

      1.10 Contributing

      If you want to submit a patch for inclusion – from solve a typo you discovered, up to adding support for a new feature – you should submit it as a bug report (see Bug Reports). There are some things that you can do to increase the chances for it to be included in the official package.

      Unless your patch is very small (say, under 10 lines) we require that you assign the copyright of your work to the Free Software Foundation. This is to protect the freedom of the project. If you have not already signed papers, we will send you the necessary information when you submit your contribution.

      For contributions that doesn't consist of actual programming code, the only guidelines are common sense. Use it.

      For code contributions, a number of style guides will help you:

      • Coding Style. Follow the GNU Standards document (see GNU Coding Standards).

        If you normally code using another coding standard, there is no problem, but you should use ‘indent’ to reformat the code (see GNU Indent) before submitting your work.

      • Use the unified diff format ‘diff -u’.
      • Return errors. The only valid reason for ever aborting the execution of the program is due to memory allocation errors, but for that you should call ‘shishi_xalloc_die’ to allow the application to recover if it wants to.
      • Design with thread safety in mind. Don't use global variables. Don't even write to per-handle global variables unless the documented behaviour of the function you write is to write to the per-handle global variable.
      • Avoid using the C math library. It causes problems for embedded implementations, and in most situations it is very easy to avoid using it.
      • Document your functions. Use comments before each function headers, that, if properly formatted, are extracted into Texinfo manuals and GTK-DOC web pages.
      • Supply a ChangeLog and NEWS entries, where appropriate.


      Next: , Previous: Introduction, Up: Top

      2 User Manual

      Usually Shishi interacts with you to get some initial authentication information like a password, and then contacts a server to receive a so called ticket granting ticket. From now on, you rarely interact with Shishi directly. Applications that need security services instruct the Shishi library to use the ticket granting ticket to get new tickets for various servers. An example could be if you log on to a host remotely via ‘telnet’. The host usually requires authentication before permitting you in. The ‘telnet’ client uses the ticket granting ticket to get a ticket for the server, and then uses this ticket to authenticate you against the server (typically the server is also authenticated to you). You perform the initial authentication by typing shishi at the prompt. Sometimes it is necessary to supply options telling Shishi what your principal name (user name in the Kerberos realm) or your realm is. In the example, I specify the client name simon@JOSEFSSON.ORG.

           $ shishi simon@JOSEFSSON.ORG
           Enter password for `simon@JOSEFSSON.ORG':
           simon@JOSEFSSON.ORG:
           Authtime:       Fri Aug 15 04:44:49 2003
           Endtime:        Fri Aug 15 05:01:29 2003
           Server:         krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   INITIAL (512)
           $
      

      As you can see, Shishi also prints a short description of the ticket received.

      A logical next step is to display all tickets you have received. By the way, the tickets are usually stored as text in ~/.shishi/tickets. This is achieved by typing shishi --list.

           $ shishi --list
           Tickets in `/home/jas/.shishi/tickets':
           
           jas@JOSEFSSON.ORG:
           Authtime:       Fri Aug 15 04:49:46 2003
           Endtime:        Fri Aug 15 05:06:26 2003
           Server:         krbtgt/JOSEFSSON.ORG key des-cbc-md5 (3)
           Ticket key:     des-cbc-md5 (3) protected by des-cbc-md5 (3)
           Ticket flags:   INITIAL (512)
           
           jas@JOSEFSSON.ORG:
           Authtime:       Fri Aug 15 04:49:46 2003
           Starttime:      Fri Aug 15 04:49:49 2003
           Endtime:        Fri Aug 15 05:06:26 2003
           Server:         host/latte.josefsson.org key des-cbc-md5 (3)
           Ticket key:     des-cbc-md5 (3) protected by des-cbc-md5 (3)
           
           2 tickets found.
           $
      

      As you can see, I had a ticket for the server ‘host/latte.josefsson.org’ which was generated by ‘telnet’:ing to that host.

      If, for some reason, you want to manually get a ticket for a specific server, you can use the shishi --server-name command. Normally, however, the application that uses Shishi will take care of getting a ticket for the appropriate server, so you normally wouldn't need to issue this command.

           $ shishi --server-name=user/billg --encryption-type=des-cbc-md4
           jas@JOSEFSSON.ORG:
           Authtime:       Fri Aug 15 04:49:46 2003
           Starttime:      Fri Aug 15 04:54:33 2003
           Endtime:        Fri Aug 15 05:06:26 2003
           Server:         user/billg key des-cbc-md4 (2)
           Ticket key:     des-cbc-md4 (2) protected by des-cbc-md5 (3)
           $
      

      As you can see, I acquired a ticket for ‘user/billg’ with a ‘des-cbc-md4’ (see Cryptographic Overview) encryption key specified with the ‘--encryption-type’ parameter.

      To wrap up this introduction, let us see how you can remove tickets. You may want to do this if you leave your terminal for lunch or similar, and don't want someone to be able to copy the file and then use your credentials. Note that this only destroys the tickets locally, it does not contact any server telling that these credentials are no longer valid. So, if someone stole your ticket file, you must still contact your administrator and have them reset your account. Simply using this switch is not sufficient.

           $ shishi --server-name=imap/latte.josefsson.org --destroy
           1 ticket removed.
           $ shishi --server-name=foobar --destroy
           No tickets removed.
           $ shishi --destroy
           3 tickets removed.
           $
      

      Since the ‘--server-name’ parameter takes a long string to type, it is possible to type the server name directly, after the client name. The following example demonstrates an AS-REQ followed by a TGS-REQ for a specific server (assuming you did not have any tickets to begin with).

           $ src/shishi simon@latte.josefsson.org imap/latte.josefsson.org
           Enter password for `simon@latte.josefsson.org':
           simon@latte.josefsson.org:
           Acquired:       Wed Aug 27 17:21:06 2003
           Expires:        Wed Aug 27 17:37:46 2003
           Server:         imap/latte.josefsson.org key aes256-cts-hmac-sha1-96 (18)
           Ticket key:     aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18)
           Ticket flags:   FORWARDED PROXIABLE (12)
           $
      

      Refer to the reference manual for all available parameters (see Parameters for shishi). The rest of this section contains descriptions of more specialized usage modes that can be ignored by most users.

      2.1 Proxiable and Proxy Tickets

      At times it may be necessary for a principal to allow a service to perform an operation on its behalf. The service must be able to take on the identity of the client, but only for a particular purpose. A principal can allow a service to take on the principal's identity for a particular purpose by granting it a proxy.

      The process of granting a proxy using the proxy and proxiable flags is used to provide credentials for use with specific services. Though conceptually also a proxy, users wishing to delegate their identity in a form usable for all purpose MUST use the ticket forwarding mechanism described in the next section to forward a ticket-granting ticket.

      The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket.

      This flag allows a client to pass a proxy to a server to perform a remote request on its behalf (e.g. a print service client can give the print server a proxy to access the client's files on a particular file server in order to satisfy a print request).

      In order to complicate the use of stolen credentials, Kerberos tickets are usually valid from only those network addresses specifically included in the ticket[4]. When granting a proxy, the client MUST specify the new network address from which the proxy is to be used, or indicate that the proxy is to be issued for use from any address.

      The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail.

      Here is how you would acquire a PROXY ticket for the service ‘imap/latte.josefsson.org’:

           $ shishi jas@JOSEFSSON.ORG imap/latte.josefsson.org --proxy
           Enter password for `jas@JOSEFSSON.ORG':
           libshishi: warning: KDC bug: Reply encrypted using wrong key.
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:02:35 2003
           Starttime:      Mon Sep  8 20:02:36 2003
           Endtime:        Tue Sep  9 04:02:35 2003
           Server:         imap/latte.josefsson.org key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   PROXY (16)
           $
      

      As you noticed, this asked for your password. The reason is that proxy tickets must be acquired using a proxiable ticket granting ticket, which was not present. If you often need to get proxy tickets, you may acquire a proxiable ticket granting ticket from the start:

           $ shishi --proxiable
           Enter password for `jas@JOSEFSSON.ORG':
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:04:27 2003
           Endtime:        Tue Sep  9 04:04:27 2003
           Server:         krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   PROXIABLE INITIAL (520)
      

      Then you should be able to acquire proxy tickets based on that ticket granting ticket, as follows:

           $ shishi jas@JOSEFSSON.ORG imap/latte.josefsson.org --proxy
           libshishi: warning: KDC bug: Reply encrypted using wrong key.
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:04:27 2003
           Starttime:      Mon Sep  8 20:04:32 2003
           Endtime:        Tue Sep  9 04:04:27 2003
           Server:         imap/latte.josefsson.org key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   PROXY (16)
           $
      

      2.2 Forwardable and Forwarded Tickets

      Authentication forwarding is an instance of a proxy where the service that is granted is complete use of the client's identity. An example where it might be used is when a user logs in to a remote system and wants authentication to work from that system as if the login were local.

      The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket.

      This flag allows for authentication forwarding without requiring the user to enter a password again. If the flag is not set, then authentication forwarding is not permitted, but the same result can still be achieved if the user engages in the AS exchange specifying the requested network addresses and supplies a password.

      The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets.

      If addressless tickets are forwarded from one system to another, clients SHOULD still use this option to obtain a new TGT in order to have different session keys on the different systems.

      Here is how you would acquire a FORWARDED ticket for the service ‘host/latte.josefsson.org’:

           $ shishi jas@JOSEFSSON.ORG host/latte.josefsson.org --forwarded
           Enter password for `jas@JOSEFSSON.ORG':
           libshishi: warning: KDC bug: Reply encrypted using wrong key.
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:07:11 2003
           Starttime:      Mon Sep  8 20:07:12 2003
           Endtime:        Tue Sep  9 04:07:11 2003
           Server:         host/latte.josefsson.org key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   FORWARDED (4)
           $
      

      As you noticed, this asked for your password. The reason is that forwarded tickets must be acquired using a forwardable ticket granting ticket, which was not present. If you often need to get forwarded tickets, you may acquire a forwardable ticket granting ticket from the start:

           $ shishi --forwardable
           Enter password for `jas@JOSEFSSON.ORG':
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:08:53 2003
           Endtime:        Tue Sep  9 04:08:53 2003
           Server:         krbtgt/JOSEFSSON.ORG key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   FORWARDABLE INITIAL (514)
           $
      

      Then you should be able to acquire forwarded tickets based on that ticket granting ticket, as follows:

           $ shishi jas@JOSEFSSON.ORG host/latte.josefsson.org --forwarded
           libshishi: warning: KDC bug: Reply encrypted using wrong key.
           jas@JOSEFSSON.ORG:
           Authtime:       Mon Sep  8 20:08:53 2003
           Starttime:      Mon Sep  8 20:08:57 2003
           Endtime:        Tue Sep  9 04:08:53 2003
           Server:         host/latte.josefsson.org key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by des3-cbc-sha1-kd (16)
           Ticket flags:   FORWARDED (4)
           $
      


      Next: , Previous: User Manual, Up: Top

      3 Administration Manual

      Here you will learn how to set up, run and maintain the Shishi Kerberos server. Kerberos is incompatible with the standard Unix /etc/passwd password database4, therefore the first step will be to create a Kerberos user database. Shishi's user database system is called Shisa. Once Shisa has been configured, you can then start the server and begin issuing Kerberos tickets to your users. The Shishi server is called shishid. After getting the server up and running, we discuss how you can set up multiple Kerberos servers, to increase availability or offer load-balancing. Finally, we include some information intended for developers, that will enable you to customize Shisa to use an external user database, such as a LDAP server or SQL database.

      3.1 Introduction to Shisa

      The user database part of Shishi is called Shisa. The Shisa library is independent of the core Shishi library. Shisa is responsible for storing the name of your realms, the name of your principals (users), accounting information for the users (i.e., when each account starts to be valid and when it expires), and the cryptographic keys each user has. Some Kerberos internal data can also be stored, such as the key version number, the last dates for when various ticket requests were made, the cryptographic salt, string-to-key parameters and password for each user. Not all information need to be stored. For example, in some situations it is prudent to leave the password field empty, so that somebody who manages to steal the user database will only be able to compromise your system, and not any other systems were your user may have re-used the same password. On the other hand, you may already be storing the password in your customized database, in which case being able to change it via the Shisa interface can be useful.

      Shisa is a small (a few thousand lines of C code) standalone library. Shisa does not depend on the Shishi library. Because a user database with passwords may be useful for other applications as well (e.g., GNU SASL), it might be separated into its own project later on. You should keep this in mind, so that you don't consider writing a Shisa backend for your own database as a purely Shishi specific project. You can, for example, choose to use the Shisa interface in your own applications to have a simple interface to your user database. Your experience and feedback is appreciated if you have chosen to explore this.

      Note that the Shisa database does not expose everything you may want to know about a user, such as its full human name, telephone number or even the user's login account name or home directory. It only stores what is needed to authenticate a peer claiming to be an entity. Thus it does not make sense to replace your current user database or /etc/passwd with data derived from the Shisa database. Instead, it is intended that you write a Shisa backend that exports some of the information stored in your user database. You may be able to replace some existing functionality, such as the password field in /etc/passwd with a Kerberos PAM module, but there is no requirement for doing so.

      3.2 Configuring Shisa

      The configuration file for Shisa is typically stored in /usr/local/etc/shishi/shisa.conf. You do not have to modify this file, the defaults should be acceptable to first-time users. The file is used to define where your user database resides, and some options such as making the database read-only, or whether errors detected when accessing the database should be ignored. (The latter could be useful if the server is a remote LDAP server that might be unavailable, and then you would want to fall back to a local copy of the database.)

      The default will store the user database using directories and files, rooted by default in /usr/local/var/shishi. You can use standard file permission settings to control access to the directory hierarchy. It is strongly recommended to restrict access to the directory. Storing the directory on local storage, i.e., hard disk or removable media, is recommended. We discourage placing the database on a network file system, but realize this can be useful in some situations (see Multiple servers).

      See the reference manual (see Shisa Configuration) for the details of the configuration file. Again, you are not expected to need to modify anything unless you are an experienced Shishi administrator.

      3.3 Using Shisa

      There is a command line interface to the Shisa library, aptly named shisa. You will use this tool to add, remove, and change information stored in the database about realms, principals, and keys. The tool can also be used to “dump” all information in the database, for backup or debugging purposes. (Currently the output format cannot be read by any tool, but functionality to do this will be added in the future, possibly as a read-only file-based Shisa database backend.)

      The reference manual (see Parameters for shisa) explains all parameters, but here we will give you a walk-through of the typical uses of the tool.

      Installing Shishi usually creates a realm with two principals: one ticket granting ticket for the realm, and one host key for the server. This is what you typically need to get started, but it doesn't serve our purposes, so we start by removing the principals and the realm. To do that, we need to figure out the name of the realm. The ‘--list’ or ‘--dump’ parameters can be used for this. (Most “long” parameters, like ‘--dump’, have shorter names as well, in this case ‘-d’, Parameters for shisa).

           jas@latte:~$ shisa -d
           latte
                   krbtgt/latte
                           Account is enabled.
                           Current key version 0 (0x0).
                           Key 0 (0x0).
                                   Etype aes256-cts-hmac-sha1-96 (0x12, 18).
                                   Salt lattekrbtgt/latte.
                   host/latte
                           Account is enabled.
                           Current key version 0 (0x0).
                           Key 0 (0x0).
                                   Etype aes256-cts-hmac-sha1-96 (0x12, 18).
                                   Salt lattehost/latte.
           jas@latte:~$
      

      The realm names are printed at column 0, the principal names are indented with one ‘TAB’ character (aka ‘\t’ or ASCII 0x09 Horizontal Tabulation), and the information about each principal is indented with two ‘TAB’ characters. The above output means that there is one realm ‘latte’ with two principals: ‘krbtgt/latte’ (which is used to authenticate Kerberos ticket requests) and ‘host/latte’ (used to authenticate host-based applications like Telnet). They were created during ‘make install’ on a host called ‘latte’.

      If the installation did not create a default database for you, you might get an error similar to the following output.

           jas@latte:~$ shisa -d
           shisa: Cannot initialize `file' database backend.
           Location `/usr/local/var/shishi' and options `N/A'.
           shisa: Initialization failed:
           Shisa database could not be opened.
           jas@latte:~$
      

      This indicates that the database does not exist. For a file database, you can create it simply by creating the directory, as follows. Note the access permission change with ‘chmod’. Typically the ‘root’ user would own the files, but as these examples demonstrate, setting up a Kerberos server does not require root access. Indeed, it may be prudent to run all Shishi applications as a special non-‘root’ user, and have all Shishi related files owned by that user, so that any security vulnerabilities do not lead to a system compromise. (However, if the user database is ever stolen, system compromises of other systems may be inoccured, should you use, e.g., a kerberized Telnet.)

           jas@latte:~$ mkdir /usr/local/var/shishi
           jas@latte:~$ chmod go-rwx /usr/local/var/shishi
      

      Back to the first example, where you have a realm ‘latte’ with some principals. We want to remove the realm to demonstrate how you create the realm from scratch. (Of course, you can have more than one realm in the database, but for this example we assume you want to set up a realm named the same as Shishi guessed you would name it, so the existing realm need to be removed first.) The ‘--remove’ (short form ‘-r’) parameter is used for this purpose, as follows.

           jas@latte:~$ shisa -r latte host/latte
           Removing principal `host/latte@latte'...
           Removing principal `host/latte@latte'...done
           jas@latte:~$ shisa -r latte krbtgt/latte
           Removing principal `krbtgt/latte@latte'...
           Removing principal `krbtgt/latte@latte'...done
           jas@latte:~$ shisa -r latte
           Removing realm `latte'...
           Removing realm `latte'...done
           jas@latte:~$
      

      You may be asking yourself “What if the realm has many more principals?”. If you fear manual labor (or a small ‘sed’ script, recall the format of ‘--list’?), don't worry, there is a ‘--force’ (short form ‘-f’) flag. Use it with care. Here is a faster way to do the above:

           jas@latte:~$ shisa -r latte -f
           Removing principal `krbtgt/latte@latte'...
           Removing principal `krbtgt/latte@latte'...done
           Removing principal `host/latte@latte'...
           Removing principal `host/latte@latte'...done
           Removing realm `latte'...
           Removing realm `latte'...done
           jas@latte:~$
      

      You should now have a working, but empty, Shisa database. Let's set up the realm manually, step by step. The first step is to decide on a name for your realm. The full story is explained elsewhere (see Realm and Principal Naming), but the short story is to take your DNS domain name and translate it to upper case. For example, if your organization uses example.org it is a good idea to use EXAMPLE.ORG as the name of your Kerberos realm. We'll use EXAMPLE.ORG as the realm name in these examples. Let's create the realm.

           jas@latte:~$ shisa -a EXAMPLE.ORG
           Adding realm `EXAMPLE.ORG'...
           Adding realm `EXAMPLE.ORG'...done
           jas@latte:~$
      

      Currently, there are no properties associated with entire realms. In the future, it may be possible to set a default realm-wide password expiry policy or similar. Each realm normally has one principal that is used for authenticating against the “ticket granting service” on the Kerberos server with a ticket instead of using the password. This is used by the user when she acquire a ticket for a server. The principal must look like ‘krbtgt/REALM’ (see Name of the TGS). Let's create it.

           jas@latte:~$ shisa -a EXAMPLE.ORG krbtgt/EXAMPLE.ORG
           Adding principal `krbtgt/EXAMPLE.ORG@EXAMPLE.ORG'...
           Adding principal `krbtgt/EXAMPLE.ORG@EXAMPLE.ORG'...done
           jas@latte:~$
      

      Now that wasn't difficult, although not very satisfying either. What does adding a principal mean? The name is created, obviously, but it also means setting a few values in the database. Let's view the entry to find out which values.

           jas@latte:~$ shisa -d
           EXAMPLE.ORG
                   krbtgt/EXAMPLE.ORG
                           Account is enabled.
                           Current key version 0 (0x0).
                           Key 0 (0x0).
                                   Etype aes256-cts-hmac-sha1-96 (0x12, 18).
                                   Salt EXAMPLE.ORGkrbtgt/EXAMPLE.ORG.
           jas@latte:~$
      

      To use host based security services like SSH or Telnet with Kerberos, each host must have a key shared between the host and the KDC. The key is typically stored in /usr/local/etc/shishi/shishi.keys. We assume your server is called ‘mail.example.org’ and we create the principal. To illustrate a new parameter, we also set the specific algorithm to use by using the ‘--encryption-type’ (short form ‘-E’) parameter.

           jas@latte:~$ shisa -a EXAMPLE.ORG host/mail.example.org -E des3
           Adding principal `host/mail.example.org@EXAMPLE.ORG'...
           Adding principal `host/mail.example.org@EXAMPLE.ORG'...done
           jas@latte:~$
      

      To export the key, there is another Shisa parameter ‘--keys’ that will print the key in a format that is recognized by Shishi. Let's use it to print the host key.

           jas@latte:~$ shisa -d --keys EXAMPLE.ORG host/mail.example.org
           EXAMPLE.ORG
                   host/mail.example.org
                           Account is enabled.
                           Current key version 0 (0x0).
                           Key 0 (0x0).
                                   Etype des3-cbc-sha1-kd (0x10, 16).
           -----BEGIN SHISHI KEY-----
           Keytype: 16 (des3-cbc-sha1-kd)
           Principal: host/mail.example.org
           Realm: EXAMPLE.ORG
           
           iQdA8hxdvOUHZNliZJv7noM02rXHV8gq
           -----END SHISHI KEY-----
                                   Salt EXAMPLE.ORGhost/mail.example.org.
           jas@latte:~$
      

      So to set up the host, simply redirect output to the host key file.

           jas@latte:~$ shisa -d --keys EXAMPLE.ORG \
                host/mail.example.org >> /usr/local/etc/shishi/shishi.keys
           jas@latte:~$
      

      The next logical step is to create a principal for some user, so you can use your password to get a Ticket Granting Ticket via the Authentication Service (AS) from the KDC, and then use the Ticket Granting Service (TGS) from the KDC to get a ticket for a specific host, and then send that ticket to the host to authenticate yourself. Creating this end-user principle is slightly different from the earlier steps, because you want the key to be derived from a password instead of being a random key. The ‘--password’ parameter indicate this. This make the tool ask you for the password.

           jas@latte:~$ shisa -a EXAMPLE.ORG simon --password
           Password for `simon@EXAMPLE.ORG':
           Adding principal `simon@EXAMPLE.ORG'...
           Adding principal `simon@EXAMPLE.ORG'...done
           jas@latte:~$
      

      The only special thing about this principal now is that it has a password field set in the database.

           jas@latte:~$ shisa -d EXAMPLE.ORG simon --keys
           EXAMPLE.ORG
                   simon
                           Account is enabled.
                           Current key version 0 (0x0).
                           Key 0 (0x0).
                                   Etype aes256-cts-hmac-sha1-96 (0x12, 18).
           -----BEGIN SHISHI KEY-----
           Keytype: 18 (aes256-cts-hmac-sha1-96)
           Principal: simon
           Realm: EXAMPLE.ORG
           
           Ja7ciNtrAI3gtodLaVDQ5zhcH58ffk0kS5tGAM7ILvM=
           -----END SHISHI KEY-----
                                   Salt EXAMPLE.ORGsimon.
                                   Password foo.
           jas@latte:~$
      

      You should now be ready to start the KDC, which is explained in the next section (see Starting Shishid), and get tickets as explained earlier (see User Manual).

      3.4 Starting Shishid

      The Shishi server, or Key Distribution Center (KDC), is called Shishid. Shishid is responsible for listening on UDP and TCP ports for Kerberos requests. Currently it can handle initial ticket requests (Authentication Service, or AS), typically authenticated with keys derived from passwords, and subsequent ticket requests (Ticket Granting Service, or TGS), typically authenticated with the key acquired during an AS exchange.

      Currently there is very little configuration available, the only variables are which ports the server should listen on and an optional user name to setuid into after successfully listening to the ports.

      By default, Shishid listens on the ‘kerberos’ service port (typically translated to 88 via /etc/services) on the UDP and TCP transports via IPv4 and (if your machine support it) IPv6 on all interfaces on your machine. Here is a typical startup.

           latte:/home/jas/src/shishi# /usr/local/sbin/shishid
           Initializing GNUTLS...
           Initializing GNUTLS...done
           Listening on IPv4:*:kerberos/udp...done
           Listening on IPv4:*:kerberos/tcp...done
           Listening on IPv6:*:kerberos/udp...failed
           socket: Address family not supported by protocol
           Listening on IPv6:*:kerberos/tcp...failed
           socket: Address family not supported by protocol
           Listening on 2 ports...
      

      Running as root is not recommended. Any security problem in shishid and your host may be compromised. Therefor, we recommend using the ‘--setuid’ parameter, as follows.

           latte:/home/jas/src/shishi# /usr/local/sbin/shishid --setuid=jas
           Initializing GNUTLS...
           Initializing GNUTLS...done
           Listening on IPv4:*:kerberos/udp...done
           Listening on IPv4:*:kerberos/tcp...done
           Listening on IPv6:*:kerberos/udp...failed
           socket: Address family not supported by protocol
           Listening on IPv6:*:kerberos/tcp...failed
           socket: Address family not supported by protocol
           Listening on 2 ports...
           User identity set to `jas' (22541)...
      

      An alternative is to run shishid on an alternative port as a non-privileged user. To continue the example of setting up the EXAMPLE.ORG realm as a non-privileged user from the preceding section, we start the server listen on port 4711 via UDP on IPv4.

           jas@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/udp
           Initializing GNUTLS...
           Initializing GNUTLS...done
           Listening on *:4711/tcp...
           Listening on 1 ports...
           shishid: Starting (GNUTLS `1.0.4')
           shishid: Listening on *:4711/tcp socket 4
      

      If you have set up the Shisa database as in the previous example, you can now acquire tickets as follows.

           jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \
              simon@EXAMPLE.ORG
           Enter password for `simon@EXAMPLE.ORG':
           simon@EXAMPLE.ORG:
           Authtime:       Fri Dec 12 01:41:01 2003
           Endtime:        Fri Dec 12 01:57:41 2003
           Server:         krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18)
           Ticket key:     aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18)
           Ticket flags:   FORWARDED PROXIABLE RENEWABLE INITIAL (12)
           jas@latte:~$
      

      The output from Shishid on a successful invocation would look like:

           shishid: Has 131 bytes from *:4711/udp on socket 4
           shishid: Processing 131 from *:4711/udp on socket 4
           shishid: Trying AS-REQ
           shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
           shishid: Matching client etype 18 against user key etype 18
           shishid: Have 511 bytes for *:4711/udp on socket 4
           shishid: Sending 511 bytes to *:4711/udp socket 4 via UDP
           shishid: Listening on *:4711/udp socket 4
      

      You may use the '-v' parameter for Shishid and Shishi to generate more debugging information.

      To illustrate what an application, such as the Shishi patched versions of GNU lsh or Telnet from GNU InetUtils, would do when contacting the host ‘mail.example.org’ we illustrate using the TGS service as well.

           jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711' \
              simon@EXAMPLE.ORG host/mail.example.org
           simon@EXAMPLE.ORG:
           Authtime:       Fri Dec 12 01:46:54 2003
           Endtime:        Fri Dec 12 02:03:34 2003
           Server:         host/mail.example.org key des3-cbc-sha1-kd (16)
           Ticket key:     des3-cbc-sha1-kd (16) protected by aes256-cts-hmac-sha1-96 (18)
           Ticket flags:   FORWARDED PROXIABLE (45398796)
           jas@latte:~$
      

      This conclude our walk-through of setting up a new Kerberos realm using Shishi. It is quite likely that one or more steps failed, and if so we encourage you to debug it and submit a patch, or at least report it as a problem. Heck, even letting us know if you got this far would be of interest. See Bug Reports.

      3.5 Configuring DNS for KDC

      Making sure the configuration files on all hosts running Shishi clients include the addresses of your server is tedious. If the configuration files do not mention the KDC address for a realm, Shishi will try to look up the information from DNS. In order for Shishi to find that information, you need to add the information to DNS. For this to work well, you need to set up a DNS zone with the same name as your Kerberos realm. The easiest is if you own the publicly visible DNS name, such as ‘example.org’ if your realm is ‘EXAMPLE.ORG’, but you can set up an internal DNS server with the information for your realm only. If this is done, you do not need to keep configuration files updated for the KDC addressing information.

      3.5.1 DNS vs. Kerberos - Case Sensitivity of Realm Names

      In Kerberos, realm names are case sensitive. While it is strongly encouraged that all realm names be all upper case this recommendation has not been adopted by all sites. Some sites use all lower case names and other use mixed case. DNS on the other hand is case insensitive for queries but is case preserving for responses to TXT queries. Since "MYREALM", "myrealm", and "MyRealm" are all different it is necessary that only one of the possible combinations of upper and lower case characters be used. This restriction may be lifted in the future as the DNS naming scheme is expanded to support non-ASCII names.

      3.5.2 Overview - KDC location information

      KDC location information is to be stored using the DNS SRV RR [RFC 2052]. The format of this RR is as follows:

      Service.Proto.Realm TTL Class SRV Priority Weight Port Target

      The Service name for Kerberos is always "_kerberos".

      The Proto can be either "_udp", "_tcp", or "_tls._tcp". If these SRV records are to be used, a "_udp" record MUST be included. If the Kerberos implementation supports TCP transport, a "_tcp" record MUST be included. When using "_tcp" with "_kerberos", this indicates a "raw" TCP connection without any additional encapsulation. A "_tls._tcp" record MUST be specified for all Kerberos implementations that support communication with the KDC across TCP sockets encapsulated using TLS [RFC2246] (see STARTTLS protected KDC exchanges).

      The Realm is the Kerberos realm that this record corresponds to.

      TTL, Class, SRV, Priority, Weight, and Target have the standard meaning as defined in RFC 2052.

      As per RFC 2052 the Port number should be the value assigned to "kerberos" by the Internet Assigned Number Authority (88).

      3.5.3 Example - KDC location information

      These are DNS records for a Kerberos realm ASDF.COM. It has two Kerberos servers, kdc1.asdf.com and kdc2.asdf.com. Queries should be directed to kdc1.asdf.com first as per the specified priority. Weights are not used in these records.

           _kerberos._udp.ASDF.COM.        IN      SRV     0 0 88 kdc1.asdf.com.
           _kerberos._udp.ASDF.COM.        IN      SRV     1 0 88 kdc2.asdf.com.
           _kerberos._tcp.ASDF.COM.        IN      SRV     0 0 88 kdc1.asdf.com.
           _kerberos._tcp.ASDF.COM.        IN      SRV     1 0 88 kdc2.asdf.com.
           _kerberos._tls._tcp.ASDF.COM.   IN      SRV     0 0 88 kdc1.asdf.com.
           _kerberos._tls._tcp.ASDF.COM.   IN      SRV     1 0 88 kdc2.asdf.com.
      

      3.5.4 Security considerations

      As DNS is deployed today, it is an unsecure service. Thus the infor- mation returned by it cannot be trusted.

      Current practice for REALM to KDC mapping is to use hostnames to indicate KDC hosts (stored in some implementation-dependent location, but generally a local config file). These hostnames are vulnerable to the standard set of DNS attacks (denial of service, spoofed entries, etc). The design of the Kerberos protocol limits attacks of this sort to denial of service. However, the use of SRV records does not change this attack in any way. They have the same vulnerabilities that already exist in the common practice of using hostnames for KDC locations.

      Implementations SHOULD provide a way of specifying this information locally without the use of DNS. However, to make this feature worthwhile a lack of any configuration information on a client should be interpretted as permission to use DNS.

      3.6 Kerberos via TLS

      If Shishi is built with support for GNUTLS, the messages exchanged between clients and Shishid can be protected with TLS. TLS is only available over TCP connections. A full discussion of the features TLS have is out of scope here, but in short it means the communication is integrity and privacy protected, and that users can use OpenPGP, X.509 or SRP (i.e., any mechanism supported by TLS) to authenticate themselves to the Kerberos server. For details on the implementation, See STARTTLS protected KDC exchanges.

      3.6.1 Setting up TLS resume

      Resuming earlier TLS session is supported and enabled by default. This improves the speed of the TLS handshake, because results from earlier negotiations can be re-used. Currently the TLS resume database is stored in memory (in constract to storing it on disk), in both the client and in the server. Because the server typically runs for a long time, this is not a problem for that side. The client is typically not a long-running process though; the client usually is invoked as part of applications like ‘telnet’ or ‘login’. However, because each use of the client library typically result in a ticket, which is stored on disk and re-used by later processes, this is likely not a serious problem because the number of different tickets required by a user is usually quite small. For the client, TLS resume is typically only useful when you perform an initial authentication (using a password) followed by a ticket request for a service, in the same process.

      You can configure the server, ‘shishid’ to never use TLS resume, or to increase or decrease the number of distinct TLS connections that can be resumed before they are garbage collected, see the ‘--resume-limit’ parameter (see Parameters for shishid).

      3.6.2 Setting up Anonymous TLS

      Anonymous TLS is the simplest to set up and use. In fact, only the client need to be informed that your KDC support TLS. This can be done in the configuration file with the ‘/tls’ parameter for ‘kdc-realm’ (see Shishi Configuration), or by placing the KDC address in DNS using the ‘_tls’ SRV record (see Configuring DNS for KDC).

      Let's start Shishid, listening on a TCP socket. TLS require TCP. TCP sockets are automatically upgraded to TLS if the client request it.

           jas@latte:~$ /usr/local/sbin/shishid -l IPv4:*:4711/tcp
           Initializing GNUTLS...done
           Listening on IPv4:*:4711/tcp...
           Listening on 1 ports...
           shishid: Starting (GNUTLS `1.0.4')
           shishid: Listening on IPv4:*:4711/tcp socket 4
      

      Let's use the client to talk with it, using TLS.

           jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls \
               simon@EXAMPLE.ORG
           Enter password for `simon@EXAMPLE.ORG':
           simon@EXAMPLE.ORG:
           Authtime:       Tue Dec 16 05:20:47 2003
           Endtime:        Tue Dec 16 05:37:27 2003
           Server:         krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18)
           Ticket key:     aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18)
           Ticket flags:   FORWARDED PROXIABLE (12)
           jas@latte:~$
      

      On success, the server will print the following debug information.

           shishid: Accepted socket 6 from socket 4 as IPv4:*:4711/tcp peer 127.0.0.1
           shishid: Listening on IPv4:*:4711/tcp socket 4
           shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6
           shishid: Has 4 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Trying STARTTLS
           shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `Anon DH', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed
           shishid: TLS anonymous authentication with 1024 bit Diffie-Hellman
           shishid: Listening on IPv4:*:4711/tcp socket 4
           shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6
           shishid: Has 131 bytes from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Processing 131 from IPv4:*:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Trying AS-REQ
           shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
           shishid: Matching client etype 18 against user key etype 18
           shishid: Have 511 bytes for IPv4:*:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Sending 511 bytes to IPv4:*:4711/tcp peer 127.0.0.1 socket 6 via TLS
           shishid: Listening on IPv4:*:4711/tcp socket 4
           shishid: Listening on IPv4:*:4711/tcp peer 127.0.0.1 socket 6
           shishid: Peer IPv4:*:4711/tcp peer 127.0.0.1 disconnected on socket 6
           shishid: Closing IPv4:*:4711/tcp peer 127.0.0.1 socket 6
           shishid: Listening on IPv4:*:4711/tcp socket 4
      

      3.6.3 Setting up X.509 authenticated TLS

      Setting up X.509 authentication is slightly more complicated than anonymous authentication. You need a X.509 certificate authority (CA) that can generate certificates for your Kerberos server and Kerberos clients. It is often easiest to setup the CA yourself. Managing a CA can be a daunting task, and we only give the bare essentials to get things up and running. We suggest that you study the relevant literature. As a first step beyond this introduction, you may wish to explore more secure forms of key storage than storing them unencrypted on disk.

      The following three sections describe how you create the CA, KDC certificate, and client certificates. You can use any tool you like for this task, as long as they generate X.509 (PKIX) certificates in PEM format and RSA keys in PKCS#1 format. Here we use certtool that come with GNUTLS, which is widely available. We conclude by discussing how you use these certificates in the KDC and in the Shishi client.

      3.6.3.1 Create a Kerberos Certificate Authority

      First create a CA key.

           jas@latte:~$ certtool --generate-privkey \
              --outfile /usr/local/etc/shishi/shishi.key
           Generating a private key...
           Generating a 1024 bit RSA private key...
           jas@latte:~$
      

      Then create the CA certificate. Use whatever details you prefer.

           jas@latte:~$ certtool --generate-self-signed \
              --load-privkey /usr/local/etc/shishi/shishi.key \
              --outfile /usr/local/etc/shishi/shishi.cert
           Generating a self signed certificate...
           Please enter the details of the certificate's distinguished name. \
           Just press enter to ignore a field.
           Country name (2 chars): SE
           Organization name: Shishi Example CA
           Organizational unit name:
           Locality name:
           State or province name:
           Common name: CA
           This field should not be used in new certificates.
           E-mail:
           Enter the certificate's serial number (decimal): 0
           
           
           Activation/Expiration time.
           The generated certificate will expire in (days): 180
           
           
           Extensions.
           Does the certificate belong to an authority? (Y/N): y
           Is this a web server certificate? (Y/N): n
           Enter the e-mail of the subject of the certificate:
           
           
           X.509 certificate info:
           
           Version: 3
           Serial Number (hex): 00
           Validity:
                   Not Before: Sun Dec 21 10:59:00 2003
                   Not After: Fri Jun 18 11:59:00 2004
           Subject: C=SE,O=Shishi Example CA,CN=CA
           Subject Public Key Info:
                   Public Key Algorithm: RSA
           
           X.509 Extensions:
                   Basic Constraints: (critical)
                           CA:TRUE
           
           Is the above information ok? (Y/N): y
           
           
           Signing certificate...
           jas@latte:~$
      
      3.6.3.2 Create a Kerberos KDC Certificate

      First create the key for the KDC.

           jas@latte:~$ certtool --generate-privkey \
              --outfile /usr/local/etc/shishi/shishid.key
           Generating a private key...
           Generating a 1024 bit RSA private key...
           jas@latte:~$
      

      Then create actual KDC certificate, signed by the CA certificate created in the previous step.

           jas@latte:~$ certtool --generate-certificate \
              --load-ca-certificate /usr/local/etc/shishi/shishi.cert \
              --load-ca-privkey /usr/local/etc/shishi/shishi.key \
              --load-privkey /usr/local/etc/shishi/shishid.key \
              --outfile /usr/local/etc/shishi/shishid.cert
           Generating a signed certificate...
           Loading CA's private key...
           Loading CA's certificate...
           Please enter the details of the certificate's distinguished name. \
           Just press enter to ignore a field.
           Country name (2 chars): SE
           Organization name: Shishi Example KDC
           Organizational unit name:
           Locality name:
           State or province name:
           Common name: KDC
           This field should not be used in new certificates.
           E-mail:
           Enter the certificate's serial number (decimal): 0
           
           
           Activation/Expiration time.
           The generated certificate will expire in (days): 180
           
           
           Extensions.
           Does the certificate belong to an authority? (Y/N): n
           Is this a web server certificate? (Y/N): n
           Enter the e-mail of the subject of the certificate:
           
           
           X.509 certificate info:
           
           Version: 3
           Serial Number (hex): 00
           Validity:
                   Not Before: Sun Dec 21 11:02:00 2003
                   Not After: Fri Jun 18 12:02:00 2004
           Subject: C=SE,O=Shishi Example KDC,CN=KDC
           Subject Public Key Info:
                   Public Key Algorithm: RSA
           
           X.509 Extensions:
                   Basic Constraints: (critical)
                           CA:FALSE
           
           Is the above information ok? (Y/N): y
           
           
           Signing certificate...
           jas@latte:~$
      
      3.6.3.3 Create a Kerberos Client Certificate

      First create the key for the client.

           jas@latte:~$ certtool --generate-privkey \
              --outfile ~/.shishi/client.key
           Generating a private key...
           Generating a 1024 bit RSA private key...
           jas@latte:~$
      

      Then create the client certificate, signed by the CA. An alternative would be to have the KDC sign the client certificates.

           jas@latte:~$ certtool --generate-certificate \
              --load-ca-certificate /usr/local/etc/shishi/shishi.cert \
              --load-ca-privkey /usr/local/etc/shishi/shishi.key \
              --load-privkey ~/.shishi/client.key \
              --outfile ~/.shishi/client.certs
           Generating a signed certificate...
           Loading CA's private key...
           Loading CA's certificate...
           Please enter the details of the certificate's distinguished name. \
           Just press enter to ignore a field.
           Country name (2 chars): SE
           Organization name: Shishi Example Client
           Organizational unit name:
           Locality name:
           State or province name:
           Common name: Client
           This field should not be used in new certificates.
           E-mail:
           Enter the certificate's serial number (decimal): 0
           
           
           Activation/Expiration time.
           The generated certificate will expire in (days): 180
           
           
           Extensions.
           Does the certificate belong to an authority? (Y/N): n
           Is this a web server certificate? (Y/N): n
           Enter the e-mail of the subject of the certificate:
           
           
           X.509 certificate info:
           
           Version: 3
           Serial Number (hex): 00
           Validity:
                   Not Before: Sun Dec 21 11:04:00 2003
                   Not After: Fri Jun 18 12:04:00 2004
           Subject: C=SE,O=Shishi Example Client,CN=Client
           Subject Public Key Info:
                   Public Key Algorithm: RSA
           
           X.509 Extensions:
                   Basic Constraints: (critical)
                           CA:FALSE
           
           Is the above information ok? (Y/N): y
           
           
           Signing certificate...
           jas@latte:~$
      
      3.6.3.4 Starting KDC with X.509 authentication support

      The KDC need the CA certificate (to verify client certificates) and the server certificate and key (to authenticate itself to the clients). See elsewhere (see Parameters for shishid) for the entire description of the parameters.

           jas@latte:~$ shishid -l *:4711/tcp \
              --x509cafile /usr/local/etc/shishi/shishi.cert \
              --x509certfile /usr/local/etc/shishi/shishid.cert \
              --x509keyfile /usr/local/etc/shishi/shishid.key
           Initializing GNUTLS...
           Parsed 1 CAs...
           Loaded server certificate/key...
           Generating Diffie-Hellman parameters...
           Initializing GNUTLS...done
           Listening on *:4711/tcp...
           Listening on 1 ports...
           shishid: Starting (GNUTLS `1.0.4')
           shishid: Listening on *:4711/tcp socket 4
      

      Then acquire tickets as usual. In case you wonder how shishi finds the client certificate and key, the filenames used above when generating the client certificates happen to be the default filenames for these files. So it pick them up automatically.

           jas@latte:~$ shishi -o 'realm-kdc=EXAMPLE.ORG,localhost:4711/tls' \
              simon@EXAMPLE.ORG
           Enter password for `simon@EXAMPLE.ORG':
           simon@EXAMPLE.ORG:
           Authtime:       Sun Dec 21 11:15:47 2003
           Endtime:        Sun Dec 21 11:32:27 2003
           Server:         krbtgt/EXAMPLE.ORG key aes256-cts-hmac-sha1-96 (18)
           Ticket key:     aes256-cts-hmac-sha1-96 (18) protected by aes256-cts-hmac-sha1-96 (18)
           Ticket flags:   FORWARDED PROXIABLE RENEWABLE HWAUTHENT TRANSITEDPOLICYCHECKED OKASDELEGATE (12)
           jas@latte:~$
      

      Here is what the server would print.

           shishid: Accepted socket 6 from socket 4 as *:4711/tcp peer 127.0.0.1
           shishid: Listening on *:4711/tcp socket 4
           shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6
           shishid: Has 4 bytes from *:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Trying STARTTLS
           shishid: TLS handshake negotiated protocol `TLS 1.0', key exchange `RSA', certficate type `X.509', cipher `AES 256 CBC', mac `SHA', compression `NULL', session not resumed
           shishid: TLS client certificate `C=SE,O=Shishi Example Client,CN=Client', issued by `C=SE,O=Shishi Example CA,CN=CA', serial number `00', MD5 fingerprint `a5:d3:1f:58:76:e3:58:cd:2d:eb:f7:45:a2:4b:52:f9:', activated `Sun Dec 21 11:04:00 2003', expires `Fri Jun 18 12:04:00 2004', version #3, key RSA modulus 1024 bits, currently EXPIRED
           shishid: Listening on *:4711/tcp socket 4
           shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6
           shishid: Has 131 bytes from *:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Processing 131 from *:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Trying AS-REQ
           shishid: AS-REQ from simon@EXAMPLE.ORG for krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
           shishid: Matching client etype 18 against user key etype 18
           shishid: Have 511 bytes for *:4711/tcp peer 127.0.0.1 on socket 6
           shishid: Sending 511 bytes to *:4711/tcp peer 127.0.0.1 socket 6 via TLS
           shishid: Listening on *:4711/tcp socket 4
           shishid: Listening on *:4711/tcp peer 127.0.0.1 socket 6
           shishid: Peer *:4711/tcp peer 127.0.0.1 disconnected on socket 6
           shishid: Closing *:4711/tcp peer 127.0.0.1 socket 6
           shishid: Listening on *:4711/tcp socket 4
      

      3.7 Multiple servers

      Setting up multiple servers is as easy as replicating the user database. Since the default ‘file’ user database is stored in the normal file system, you can use any common tools to replicate a file system. Network file system like NFS (properly secured by, e.g., a point-to-point symmetrically encrypted IPSEC connection) and file synchronizing tools like ‘rsync’ are typical choices.

      The secondary server should be configured just like the master server. If you use the ‘file’ database over NFS you do not have to make any modifications. If you use, e.g., a cron job to ‘rsync’ the directory every hour or so, you may want to add a ‘--read-only’ flag to the Shisa ‘db’ definition (see Shisa Configuration). That way, nobody will be lured into creating or changing information in the database on the secondary server, which only would be overwritten during the next synchronization.

           db --read-only file /usr/local/var/backup-shishi
      

      The ‘file’ database is designed so it doesn't require file locking in the file system, which may be unreliable in some network file systems or implementations. It is also designed so that multiple concurrent readers and writers may access the database without causing corruption.

      Warning: The last paragraph is currently not completely accurate. There may be race conditions with concurrent writers. None should cause infinite loops or data loss. However, unexpected results might occur if two writers try to update information about a principal simultaneous.

      If you use a remote LDAP server or SQL database to store the user database, and access it via a Shisa backend, you have make sure your Shisa backend handle concurrent writers properly. If you use a modern SQL database, this probably is not a concern. If it is a problem, you may be able to work around it by implementing some kind of synchronization or semaphore mechanism. If all else sounds too complicated, you can set up the secondary servers as ‘--read-only’ servers, although you will lose some functionality (like changing passwords via the secondary server, or updating timestamps when the last ticket request occurred).

      One function that is of particular use for users with remote databases (be it LDAP or SQL) is the “database override” feature. Using this you can have the security critical principals (such as the ticket granting ticket) stored on local file system storage, but use the remote database for user principals. Of course, you must keep the local file system storage synchronized between all servers, as before. Here is an example configuration.

           db --read-only file /var/local/master
           db ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem
      

      This instruct the Shisa library to access the two databases sequentially, for each query using the first database that know about the requested principal. If you put the ‘krbtgt/REALM’ principal in the local ‘file’ database, this will override the LDAP interface. Naturally, you can have as many ‘db’ definition lines as you wish.

      Users with remote databases can also investigate a so called High Availability mode. This is useful if you wish to have your Kerberos servers be able to continue to operate even when the remote database is offline. This is achieved via the ‘--ignore-errors’ flag in the database definition. Here is a sample configuration.

           db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem
           db --read-only file /var/cache/ldap-copy
      

      This instruct the Shisa library to try the LDAP backend first, but if it fails, instead of returning an error, continue to try the operation on a read only local ‘file’ based database. Of course, write requests will still fail, but it may be better than halting the server completely. To make this work, you first need to set up a cron job on a, say, hourly basis, to make a copy of the remote database and store it in the local file database. That way, when the remote server goes away, fairly current information will still be available locally.

      If you also wish to experiment with read-write fail over, here is an idea for the configuration.

           db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem
           db --ignore-errors --read-only file /var/cache/ldap-copy
           db file /var/cache/local-updates
      

      This is similar to the previous, but it will ignore errors reading and writing from the first two databases, ultimately causing write attempts to end up in the final ‘file’ based database. Of course, you would need to create tools to feed back any local updates made while the remote server was down. It may also be necessary to create a special backend for this purpose, which can auto create principals that are used.

      We finish with an example that demonstrate all the ideas presented.

           db --read-only file /var/local/master
           db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem
           db --ignore-errors --read-only file /var/cache/ldap-copy
           db file /var/cache/local-updates
      

      3.8 Developer information

      The Programming API for Shisa is described below (see Kerberos Database Functions); this section is about extending Shisa, and consequently Shishi, to use your own user database system. You may want to store your Kerberos user information on an LDAP database server, for example.

      Adding a new backend is straight forward. You need to implement the backend API function set, add the list of API functions to db/db.c and possibly also add any library dependencies to the Makefile.

      The simplest way to write a new backend is to start from the existing ‘file’ based database, in db/file.c, and modify the entry points as needed.

      Note that the current backend API will likely change before it is frozen. We may describe it in detail here when it has matured. However, currently it is similar to the external Shisa API (see Kerberos Database Functions).

      There should be no need to modify anything else in the Shisa library, and certainly not in the Shishi library or the shishid server.

      Naturally, we would appreciate if you would send us your new backend, if you believe it is generally useful (see Bug Reports).


      Next: , Previous: Administration Manual, Up: Top

      4 Reference Manual

      This chapter discuss the underlying assumptions of Kerberos, contain a glossary to Kerberos concepts, give you background information on choosing realm and principal names, and describe all parameters and configuration file syntaxes for the Shishi tools.

      4.1 Environmental Assumptions

      Kerberos imposes a few assumptions on the environment in which it can properly function:

      • "Denial of service" attacks are not solved with Kerberos. There are places in the protocols where an intruder can prevent an application from participating in the proper authentication steps. Detection and solution of such attacks (some of which can appear to be not-uncommon "normal" failure modes for the system) is usually best left to the human administrators and users.
      • Principals MUST keep their secret keys secret. If an intruder somehow steals a principal's key, it will be able to masquerade as that principal or impersonate any server to the legitimate principal.
      • "Password guessing" attacks are not solved by Kerberos. If a user chooses a poor password, it is possible for an attacker to successfully mount an offline dictionary attack by repeatedly attempting to decrypt, with successive entries from a dictionary, messages obtained which are encrypted under a key derived from the user's password.
      • Each host on the network MUST have a clock which is "loosely synchronized" to the time of the other hosts; this synchronization is used to reduce the bookkeeping needs of application servers when they do replay detection. The degree of "looseness" can be configured on a per-server basis, but is typically on the order of 5 minutes. If the clocks are synchronized over the network, the clock synchronization protocol MUST itself be secured from network attackers.
      • Principal identifiers are not recycled on a short-term basis. A typical mode of access control will use access control lists (ACLs) to grant permissions to particular principals. If a stale ACL entry remains for a deleted principal and the principal identifier is reused, the new principal will inherit rights specified in the stale ACL entry. By not re-using principal identifiers, the danger of inadvertent access is removed.

      4.2 Glossary of terms

      Authentication
      Verifying the claimed identity of a principal.
      Authentication header
      A record containing a Ticket and an Authenticator to be presented to a server as part of the authentication process.
      Authentication path
      A sequence of intermediate realms transited in the authentication process when communicating from one realm to another.
      Authenticator
      A record containing information that can be shown to have been recently generated using the session key known only by the client and server.
      Authorization
      The process of determining whether a client may use a service, which objects the client is allowed to access, and the type of access allowed for each.
      Capability
      A token that grants the bearer permission to access an object or service. In Kerberos, this might be a ticket whose use is restricted by the contents of the authorization data field, but which lists no network addresses, together with the session key necessary to use the ticket.
      Ciphertext
      The output of an encryption function. Encryption transforms plaintext into ciphertext.
      Client
      A process that makes use of a network service on behalf of a user. Note that in some cases a Server may itself be a client of some other server (e.g. a print server may be a client of a file server).
      Credentials
      A ticket plus the secret session key necessary to successfully use that ticket in an authentication exchange.
      Encryption Type (etype)
      When associated with encrypted data, an encryption type identifies the algorithm used to encrypt the data and is used to select the appropriate algorithm for decrypting the data. Encryption type tags are communicated in other messages to enumerate algorithms that are desired, supported, preferred, or allowed to be used for encryption of data between parties. This preference is combined with local information and policy to select an algorithm to be used.
      KDC
      Key Distribution Center, a network service that supplies tickets and temporary session keys; or an instance of that service or the host on which it runs. The KDC services both initial ticket and ticket-granting ticket requests. The initial ticket portion is sometimes referred to as the Authentication Server (or service). The ticket-granting ticket portion is sometimes referred to as the ticket-granting server (or service).
      Kerberos
      The name given to the Project Athena's authentication service, the protocol used by that service, or the code used to implement the authentication service. The name is adopted from the three-headed dog which guards Hades.
      Key Version Number (kvno)
      A tag associated with encrypted data identifies which key was used for encryption when a long lived key associated with a principal changes over time. It is used during the transition to a new key so that the party decrypting a message can tell whether the data was encrypted using the old or the new key.
      Plaintext
      The input to an encryption function or the output of a decryption function. Decryption transforms ciphertext into plaintext.
      Principal
      A named client or server entity that participates in a network communication, with one name that is considered canonical.
      Principal identifier
      The canonical name used to uniquely identify each different principal.
      Seal
      To encipher a record containing several fields in such a way that the fields cannot be individually replaced without either knowledge of the encryption key or leaving evidence of tampering.
      Secret key
      An encryption key shared by a principal and the KDC, distributed outside the bounds of the system, with a long lifetime. In the case of a human user's principal, the secret key MAY be derived from a password.
      Server
      A particular Principal which provides a resource to network clients. The server is sometimes referred to as the Application Server.
      Service
      A resource provided to network clients; often provided by more than one server (for example, remote file service).
      Session key
      A temporary encryption key used between two principals, with a lifetime limited to the duration of a single login "session". In the Kerberos system, a session key is generated by the KDC. The session key is distinct from the sub-session key, described next..
      Sub-session key
      A temporary encryption key used between two principals, selected and exchanged by the principals using the session key, and with a lifetime limited to the duration of a single association. The sub- session key is also referred to as the subkey.
      Ticket
      A record that helps a client authenticate itself to a server; it contains the client's identity, a session key, a timestamp, and other information, all sealed using the server's secret key. It only serves to authenticate a client when presented along with a fresh Authenticator.

      4.3 Realm and Principal Naming

      This section contains the discussion on naming realms and principals from the Kerberos specification.

      4.3.1 Realm Names

      Although realm names are encoded as GeneralStrings and although a realm can technically select any name it chooses, interoperability across realm boundaries requires agreement on how realm names are to be assigned, and what information they imply.

      To enforce these conventions, each realm MUST conform to the conventions itself, and it MUST require that any realms with which inter-realm keys are shared also conform to the conventions and require the same from its neighbors.

      Kerberos realm names are case sensitive. Realm names that differ only in the case of the characters are not equivalent. There are presently three styles of realm names: domain, X500, and other. Examples of each style follow:

                domain:   ATHENA.MIT.EDU
                  X500:   C=US/O=OSF
                 other:   NAMETYPE:rest/of.name=without-restrictions
      

      Domain syle realm names MUST look like domain names: they consist of components separated by periods (.) and they contain neither colons (:) nor slashes (/). Though domain names themselves are case insensitive, in order for realms to match, the case must match as well. When establishing a new realm name based on an internet domain name it is recommended by convention that the characters be converted to upper case.

      X.500 names contain an equal (=) and cannot contain a colon (:) before the equal. The realm names for X.500 names will be string representations of the names with components separated by slashes. Leading and trailing slashes will not be included. Note that the slash separator is consistent with Kerberos implementations based on RFC1510, but it is different from the separator recommended in RFC2253.

      Names that fall into the other category MUST begin with a prefix that contains no equal (=) or period (.) and the prefix MUST be followed by a colon (:) and the rest of the name. All prefixes must be assigned before they may be used. Presently none are assigned.

      The reserved category includes strings which do not fall into the first three categories. All names in this category are reserved. It is unlikely that names will be assigned to this category unless there is a very strong argument for not using the 'other' category.

      These rules guarantee that there will be no conflicts between the various name styles. The following additional constraints apply to the assignment of realm names in the domain and X.500 categories: the name of a realm for the domain or X.500 formats must either be used by the organization owning (to whom it was assigned) an Internet domain name or X.500 name, or in the case that no such names are registered, authority to use a realm name MAY be derived from the authority of the parent realm. For example, if there is no domain name for E40.MIT.EDU, then the administrator of the MIT.EDU realm can authorize the creation of a realm with that name.

      This is acceptable because the organization to which the parent is assigned is presumably the organization authorized to assign names to its children in the X.500 and domain name systems as well. If the parent assigns a realm name without also registering it in the domain name or X.500 hierarchy, it is the parent's responsibility to make sure that there will not in the future exist a name identical to the realm name of the child unless it is assigned to the same entity as the realm name.

      4.3.2 Principal Names

      As was the case for realm names, conventions are needed to ensure that all agree on what information is implied by a principal name. The name-type field that is part of the principal name indicates the kind of information implied by the name. The name-type SHOULD be treated only as a hint to interpreting the meaning of a name. It is not significant when checking for equivalence. Principal names that differ only in the name-type identify the same principal. The name type does not partition the name space. Ignoring the name type, no two names can be the same (i.e. at least one of the components, or the realm, MUST be different). The following name types are defined:

           name-type      value   meaning
           
           NT-UNKNOWN        0  Name type not known
           NT-PRINCIPAL      1  Just the name of the principal as in DCE, or for users
           NT-SRV-INST       2  Service and other unique instance (krbtgt)
           NT-SRV-HST        3  Service with host name as instance (telnet, rcommands)
           NT-SRV-XHST       4  Service with host as remaining components
           NT-UID            5  Unique ID
           NT-X500-PRINCIPAL 6  Encoded X.509 Distingished name [RFC 2253]
           NT-SMTP-NAME      7  Name in form of SMTP email name (e.g. user@foo.com)
           NT-ENTERPRISE    10   Enterprise name - may be mapped to principal name
      

      When a name implies no information other than its uniqueness at a particular time the name type PRINCIPAL SHOULD be used. The principal name type SHOULD be used for users, and it might also be used for a unique server. If the name is a unique machine generated ID that is guaranteed never to be reassigned then the name type of UID SHOULD be used (note that it is generally a bad idea to reassign names of any type since stale entries might remain in access control lists).

      If the first component of a name identifies a service and the remaining components identify an instance of the service in a server specified manner, then the name type of SRV-INST SHOULD be used. An example of this name type is the Kerberos ticket-granting service whose name has a first component of krbtgt and a second component identifying the realm for which the ticket is valid.

      If the first component of a name identifies a service and there is a single component following the service name identifying the instance as the host on which the server is running, then the name type SRV- HST SHOULD be used. This type is typically used for Internet services such as telnet and the Berkeley R commands. If the separate components of the host name appear as successive components following the name of the service, then the name type SRV-XHST SHOULD be used. This type might be used to identify servers on hosts with X.500 names where the slash (/) might otherwise be ambiguous.

      A name type of NT-X500-PRINCIPAL SHOULD be used when a name from an X.509 certificate is translated into a Kerberos name. The encoding of the X.509 name as a Kerberos principal shall conform to the encoding rules specified in RFC 2253.

      A name type of SMTP allows a name to be of a form that resembles a SMTP email name. This name, including an "@" and a domain name, is used as the one component of the principal name.

      A name type of UNKNOWN SHOULD be used when the form of the name is not known. When comparing names, a name of type UNKNOWN will match principals authenticated with names of any type. A principal authenticated with a name of type UNKNOWN, however, will only match other names of type UNKNOWN.

      Names of any type with an initial component of 'krbtgt' are reserved for the Kerberos ticket granting service. See Name of the TGS, for the form of such names.

      4.3.2.1 Name of server principals

      The principal identifier for a server on a host will generally be composed of two parts: (1) the realm of the KDC with which the server is registered, and (2) a two-component name of type NT-SRV-HST if the host name is an Internet domain name or a multi-component name of type NT-SRV-XHST if the name of the host is of a form such as X.500 that allows slash (/) separators. The first component of the two- or multi-component name will identify the service and the latter components will identify the host. Where the name of the host is not case sensitive (for example, with Internet domain names) the name of the host MUST be lower case. If specified by the application protocol for services such as telnet and the Berkeley R commands which run with system privileges, the first component MAY be the string 'host' instead of a service specific identifier.

      4.3.2.2 Name of the TGS

      The principal identifier of the ticket-granting service shall be composed of three parts: (1) the realm of the KDC issuing the TGS ticket (2) a two-part name of type NT-SRV-INST, with the first part "krbtgt" and the second part the name of the realm which will accept the ticket-granting ticket. For example, a ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the ATHENA.MIT.EDU KDC has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "ATHENA.MIT.EDU") (name). A ticket-granting ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets from the MIT.EDU realm has a principal identifier of "ATHENA.MIT.EDU" (realm), ("krbtgt", "MIT.EDU") (name).

      4.3.3 Choosing a principal with which to communicate

      The Kerberos protocol provides the means for verifying (subject to the assumptions in Environmental Assumptions) that the entity with which one communicates is the same entity that was registered with the KDC using the claimed identity (principal name). It is still necessary to determine whether that identity corresponds to the entity with which one intends to communicate.

      When appropriate data has been exchanged in advance, this determination may be performed syntactically by the application based on the application protocol specification, information provided by the user, and configuration files. For example, the server principal name (including realm) for a telnet server might be derived from the user specified host name (from the telnet command line), the "host/" prefix specified in the application protocol specification, and a mapping to a Kerberos realm derived syntactically from the domain part of the specified hostname and information from the local Kerberos realms database.

      One can also rely on trusted third parties to make this determination, but only when the data obtained from the third party is suitably integrity protected while resident on the third party server and when transmitted. Thus, for example, one should not rely on an unprotected domain name system record to map a host alias to the primary name of a server, accepting the primary name as the party one intends to contact, since an attacker can modify the mapping and impersonate the party with which one intended to communicate.

      Implementations of Kerberos and protocols based on Kerberos MUST NOT use insecure DNS queries to canonicalize the hostname components of the service principal names. In an environment without secure name service, application authors MAY append a statically configured domain name to unqualified hostnames before passing the name to the security mechanisms, but should do no more than that. Secure name service facilities, if available, might be trusted for hostname canonicalization, but such canonicalization by the client SHOULD NOT be required by KDC implementations.

      Implementation note: Many current implementations do some degree of canonicalization of the provided service name, often using DNS even though it creates security problems. However there is no consistency among implementations about whether the service name is case folded to lower case or whether reverse resolution is used. To maximize interoperability and security, applications SHOULD provide security mechanisms with names which result from folding the user-entered name to lower case, without performing any other modifications or canonicalization.

      4.3.4 Principal Name Form

      Principal names consist of a sequence of strings, which is often tedious to parse. Therefor, Shishi often uses a “printed” form of principal which embed the entire principal name string sequence, and optionally also the realm, into one string. The format is taken from the Kerberos 5 GSS-API mechanism (RFC 1964).

      The elements included within this name representation are as follows, proceeding from the beginning of the string:

      1. One or more principal name components; if more than one principal name component is included, the components are separated by `/`. Arbitrary octets may be included within principal name components, with the following constraints and special considerations:
        1. Any occurrence of the characters `@` or `/` within a name component must be immediately preceded by the `\` quoting character, to prevent interpretation as a component or realm separator.
        2. The ASCII newline, tab, backspace, and null characters may occur directly within the component or may be represented, respectively, by `\n`, `\t`, `\b`, or `\0`.
        3. If the `\` quoting character occurs outside the contexts described in (1a) and (1b) above, the following character is interpreted literally. As a special case, this allows the doubled representation `\\` to represent a single occurrence of the quoting character.
        4. An occurrence of the `\` quoting character as the last character of a component is illegal.
      2. Optionally, a `@` character, signifying that a realm name immediately follows. If no realm name element is included, the local realm name is assumed. The `/` , `:`, and null characters may not occur within a realm name; the `@`, newline, tab, and backspace characters may be included using the quoting conventions described in (1a), (1b), and (1c) above.

      4.4 Shishi Configuration

      The valid configuration file tokens are described here. The user configuration file is typically located in ~/.shishi/shishi.conf (compare ‘shishi --configuration-file’) and the system configuration is typically located in /usr/local/etc/shishi/shishi.conf (compare ‘shishi --system-configuration-file’). If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored.

      All tokens are valid in both the system and the user configuration files, and have the same meaning. However, as the system file is supposed to apply to all users on a system, it would not make sense to use some tokens in that file. For example, the ‘default-principal’ is rarely useful in a system configuration file.

      4.4.1 ‘default-realm

      Specify the default realm, by default the hostname of the host is used. E.g.,

           default-realm JOSEFSSON.ORG
      

      4.4.2 ‘default-principal

      Specify the default principal, by default the login username is used. E.g.,

           default-principal jas
      

      4.4.3 ‘client-kdc-etypes

      Specify which encryption types client asks server to respond in during AS/TGS exchanges. List valid encryption types, in preference order. Supported algorithms include aes256-cts-hmac-sha1-96, aes128-cts-hmac-sha1-96, des3-cbc-sha1-kd, des-cbc-md5, des-cbc-md4, des-cbc-crc and null. This option also indicates which encryption types are accepted by the client when receiving the response. Note that the preference order is not cryptographically protected, so a man in the middle can modify the order without being detected. Thus, only specify encryption types you trust completely here. The default only includes aes256-cts-hmac-sha1-96, as suggested by RFC1510bis. E.g.,

           client-kdc-etypes=aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5
      

      4.4.4 ‘verbose’, ‘verbose-asn1’, ‘verbose-noise’, ‘verbose-crypto’, ‘verbose-crypto-noise

      Enable verbose library messages. E.g.,

           verbose
           verbose-noise
      

      4.4.5 ‘realm-kdc

      Specify KDC addresses for realms. Value is ‘REALM,KDCADDRESS[/TRANSPORT][,KDCADDRESS[/TRANSPORT]...]’.

      KDCADDRESS is the hostname or IP address of KDC.

      Optional TRANSPORT is “udp” for UDP, “tcp” for TCP, and “tls” for TLS connections. By default UDP is tried first, and TCP used as a fallback if the KRB_ERR_RESPONSE_TOO_BIG error is received.

      If not specified, Shishi tries to locate the KDC using SRV RRs, which is recommended. This option should normally only be used during experiments, or to access badly maintained realms.

           realm-kdc=JOSEFSSON.ORG,ristretto.josefsson.org
      

      4.4.6 ‘server-realm

      Specify realm for servers. Value is ‘REALM,SERVERREGEXP[,SERVERREGEXP...]’.

      SERVERREGEXP is a regular expression matching servers in the realm. The first match is used. E.g.,

           server-realm=JOSEFSSON.ORG,.josefsson.org
      

      Note: currently not used.

      4.4.7 ‘kdc-timeout’, ‘kdc-retries

      How long shishi waits for a response from a KDC before continuing to next KDC for realm. The default is 5 seconds. E.g.,

           kdc-timeout=10
      

      How many times shishi sends a request to a KDC before giving up. The default is 3 times. E.g.,

           kdc-retries=5
      

      4.4.8 ‘stringprocess

      How username and passwords entered from the terminal, or taken from the command line, are processed.

      "none": no processing is used.

      "stringprep": convert from locale charset to UTF-8 and process using experimental RFC 1510 stringprep profile.

      It can also be a string indicating a character set supported by iconv via libstringprep, in which case data is converted from locale charset into the indicated character set. E.g., UTF-8, ISO-8859-1, KOI-8, EBCDIC-IS-FRISS are supported on GNU systems. On some systems you can use "locale -m" to list available character sets. By default, the "none" setting is used which is consistent with RFC 1510 that is silent on the issue. In practice, however, converting to UTF-8 improves interoperability.

      E.g.,

           stringprocess=UTF-8
      

      4.4.9 ‘ticket-life

      Specify default ticket life time.

      The string can be in almost any common format. It can contain month names, time zones, `am' and `pm', `yesterday', `ago', `next', etc. See Date input formats, for the long story.

      As an extra feature, if the time specified by your string correspond to a time during the last 24 hours, an extra day is added to it. This allows you to specify relative times such as "17:00" to always mean the next 17:00, even if your system clock happens to be 17:30.

      The default is 8 hours.

      E.g.,

           #ticket-life=8 hours
           #ticket-life=1 day
           ticket-life=17:00
      

      4.4.10 ‘renew-life

      Specify how long a renewable ticket should remain renewable.

      See ticket-life for the syntax. The extra feature that handles negative values within the last 2 hours is not active here.

      The default is 7 days.

      E.g.,

           #renew-life=1 week
           #renew-life=friday 17:00
           renew-life=sunday
      

      4.5 Shisa Configuration

      The configuration file for Shisa is typically stored in /usr/local/etc/shishi/shisa.conf. If the first non white space character of a line is a '#', the line is ignored. Empty lines are also ignored.

      4.5.1 ‘db

      Currently the only configuration options available is the db token that define the databases to use. The syntax is:

           db [OPTIONS] <TYPE> [LOCATION] [PARAMETERS ...]
      

      Specify the data sources for Kerberos 5 data. Multiple entries, even of the same data source type, are allowed. The data sources are accessed in the same sequence as they are defined here. If an entry is found in one data source, it will be used for the operations, without searching the remaining data sources. Valid OPTIONS include:

           --read-only       No data is written to this data source.
           --ignore-errors   Ignore failures in this backend.
      

      The default (when the configuration file is empty) uses one "file" data source (see below), but for a larger installation you may want to combine several data sources. Here is an example.

           db --read-only file /var/local/master
           db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem
           db --read-only file /var/cache/ldap-copy
      

      This demonstrate how you can store critical principals on local disk (the first entry, /var/local/master) that will always be found without looking in the LDAP directory. The critical principals could be, e.g., krbtgt/EXAMPLE.ORG. The second entry denote a LDAP server that could hold user principals. As you can see, Shisa will not let the caller know about errors with the LDAP source (they will be logged, however). Instead, if for instance the LDAP server has crashed, Shisa would continue and read from the /var/cache/ldap-copy file source. That file source may have been set up to contain a copy of the data in the LDAP server, perhaps made on an hourly basis, so that your server will be able to serve recent data even in case of a crash. Any updates or passwords change requests will however not be possible while the LDAP server is inaccessible, to reduce the problem of synchronizing data back into the LDAP server once it is online again.

      Currently only the "file" data source is supported, and denote a data source that use the standard file system for storage.

      Valid syntaxes for the "file" database:

           db file PATH
      

      Examples:

           db file /var/shishi
           db file /usr/share/shishi read-only
      

      If no ‘db’ tokens are present, the default will be:

           db file /usr/local/var/shishi
      

      4.6 Parameters for shishi

      If no command is given, Shishi try to make sure you have a ticket granting ticket for the default realm, and then display it.

      Mandatory arguments to long options are mandatory for short options too.

           Usage: shishi [OPTIONS]... [CLIENT [SERVER]]...
           
             -h, --help                              Print help and exit
             -V, --version                           Print version and exit
           
           Commands:
             -d, --destroy                           Destroy tickets in local cache,
                                                       limited by any --client-name or
                                                       --server-name.  (default=off)
             -l, --list                              List tickets in local cache, limited
                                                       by any --client-name and
                                                       --server-name.  (default=off)
             -r, --renew                             Renew ticket.  Use --server-name to
                                                       specify ticket, default is the
                                                       most recent renewable ticket
                                                       granting ticket for the default
                                                       realm.  (default=off)
           
           Flags:
                 --forwardable                       Get a forwardable ticket, i.e., one
                                                       that can be used to get forwarded
                                                       tickets.  (default=off)
                 --forwarded                         Get a forwarded ticket.  (default=
                                                       off)
                 --proxiable                         Get a proxiable ticket, i.e., one
                                                       that can be used to get proxy
                                                       tickets.  (default=off)
                 --proxy                             Get a proxy ticket.  (default=off)
                 --renewable                         Get a renewable ticket.  (default=
                                                       off)
           
           Options:
                 --client-name=NAME                  Client name. Default is login
                                                       username.
             -E, --encryption-type=ETYPE,[ETYPE...]  Encryption types to use.  ETYPE is
                                                       either registered name or integer.
                                                        Valid values include 'aes128',
                                                       'aes256', 'aes' (same as
                                                       'aes256'), '3des', 'des-md5',
                                                       'des-md4', 'des-crc', 'des' (same
                                                       as 'des-md5'), and 'arcfour'.
             -e, --endtime=STRING                    Specify when ticket validity should
                                                       expire.  The time syntax may be
                                                       relative (to the start time), such
                                                       as '20 hours', or absolute, such
                                                       as '2001-02-03 04:05:06 CET'. The
                                                       default is 8 hours after the start
                                                       time.
                 --realm=STRING                      Set default realm.
                 --renew-till=STRING                 Specify renewable life of ticket.
                                                       Implies --renewable.  Accepts same
                                                       time syntax as --endtime.  If
                                                       --renewable is specified, the
                                                       default is 1 week after the start
                                                       time.
                 --server-name=NAME                  Server name. Default is
                                                       'krbtgt/REALM' where REALM is
                                                       client realm.
             -s, --starttime=STRING                  Specify when ticket should start to
                                                       be valid.  Accepts same time
                                                       syntax as --endtime. The default
                                                       is to become valid immediately.
                 --ticket-granter=NAME               Service name in ticket to use for
                                                       authenticating request. Only for
                                                       TGS. Defaults to
                                                       'krbtgt/REALM@REALM' where REALM
                                                       is client realm.
           
           Other options:
                 --configuration-file=FILE           Read user configuration from FILE.
             -c, --ticket-file=FILE                  Read tickets from FILE.
             -o, --library-options=STRING            Parse STRING as a configuration file
                                                       statement.
             -q, --quiet                             Don't produce any diagnostic output.
                                                         (default=off)
                 --system-configuration-file=FILE    Read system configuration from FILE.
                 --ticket-write-file=FILE            Write tickets from FILE.  Default is
                                                       to write them back to where they
                                                       were read from.
             -v, --verbose                           Produce verbose output.
                                                         (default=off)
      

      4.7 Parameters for shishid

      If no parameters are specified, ‘shishid’ listens on the defaults interfaces and answers incoming requests using the keys in the default key file.

      Mandatory arguments to long options are mandatory for short options too.

           Usage: shishid [OPTIONS]...
           
             -h, --help                    Print help and exit
             -V, --version                 Print version and exit
           
           Commands:
             -l, --listen=[FAMILY:]ADDR:PORT/TYPE
                                           Sockets to listen for queries on.  Family is
                                             `IPv4' or `IPv6', if absent the family is
                                             decided by gethostbyname(ADDR). An address of
                                             `*' indicates all addresses on the local
                                             host. The default is `*:kerberos/udp,
                                             *:kerberos/tcp'.
             -u, --setuid=NAME             After binding socket, set user identity.
           
           TLS settings:
                 --no-tls                  Disable TLS support  (default=off)
                 --x509cafile=FILE         X.509 certificate authorities used to verify
                                             client certificates, in PEM format.
                 --x509certfile=FILE       X.509 server certificate, in PEM format.
                 --x509crlfile=FILE        X.509 certificate revocation list to check for
                                             revoked client certificates, in PEM format.
                 --x509keyfile=FILE        X.509 server certificate key, in PEM format.
                 --resume-limit=SHORT      Keep track of up to this many TLS sessions for
                                             resume purposes (0 to disable TLS resume).
                                             (default=`50')
           
           Other options:
             -c, --configuration-file=FILE Use specified configuration file.
             -v, --verbose                 Produce verbose output.
                                             Use multiple times to increase amount of
                                             information.
             -q, --quiet                   Don't produce any diagnostic output.
                                               (default=off)
      

      4.8 Parameters for shisa

      The purpose of ‘shisa’ is to manipulate information stored in the Kerberos 5 database used by Shishi.

      Mandatory arguments to long options are mandatory for short options too.

           Usage: shisa [OPTIONS]... [REALM [PRINCIPAL]]...
           
             -h, --help                         Print help and exit
             -V, --version                      Print version and exit
           
           Operations:
             -a, --add                          Add realm or principal to database.
             -d, --dump                         Dump entries in database.
             -n, --key-add                      Add new key to a principal in database.
                 --key-remove                   Remove a key from a principal in
                                                  database.
             -l, --list                         List entries in database.
             -m, --modify                       Modify principal entry in database.
             -r, --remove                       Remove realm or principal from database.
           
           Parameters:
             -f, --force                        Allow removal of non-empty realms.
                                                    (default=off)
                 --enabled                      Only dump or list enabled principals.
                                                    (default=off)
                 --disabled                     Only dump or list disabled principals.
                                                    (default=off)
                 --keys                         Print cryptographic key and password in
                                                  hostkey format.  (default=off)
           
           Values:
             -E, --encryption-type=STRING       Override default key encryption type.
                                                  Valid values include 'aes128',
                                                  'aes256', 'aes' (same as 'aes256'),
                                                  '3des', 'des-md5', 'des-md4',
                                                  'des-crc', 'des' (same as 'des-md5'),
                                                  and 'arcfour'.
                 --key-version=NUMBER           Version of key.
                 --password[=STRING]            Derive key from this password.
                 --random                       Use a random key.  (default)
                 --salt=STRING                  Use specified salt for deriving key.
                                                  Defaults to concatenation of realm and
                                                  (unwrapped) principal name.
                 --string-to-key-parameter=HEX  Encryption algorithm specific parameter
                                                  for password derivation.  Currently
                                                  only the AES algorithm can utilize
                                                  this, where it is interpreted as the
                                                  iteration count of the PKCS#5 PBKDF2
                                                  key deriver.
           
           Other options:
             -c, --configuration-file=FILE      Use specified configuration file.
             -o, --library-options=STRING       Parse string as configuration file
                                                  statement.
             -v, --verbose                      Produce verbose output.
                                                    (default=off)
             -q, --quiet                        Don't produce any diagnostic output.
                                                    (default=off)
      

      4.9 Environment variables

      A few of the compile-time defaults may be overridden at run-time by using environment variables. The following variables are supported.

      • SHISHI_CONFIG Specify the location of the default system configuration file. Used by the Shishi library. If not specified, the default is specified at compile-time and is usually $prefix/etc/shishi.conf.
      • SHISHI_HOME Specify the user specific directory for configuration files, ticket cache, etc. Used by the Shishi library. If not specified, it is computed as $HOME/.shishi.
      • SHISHI_USER Specify the default principal user name. Used by the Shishi library. If not specified, it is taken from the environment variable USER.
      • SHISHI_TICKETS Specify the file name of the ticket cache. Used by the Shishi library. If not specified, it will be $SHISHI_HOME/tickets, or $HOME/.shishi/tickets if $SHISHI_HOME is not specified.

      4.10 Date input formats

      First, a quote:

      Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. ...

      It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. ...

      —Robert Grudin, Time and the Art of Living.

      This section describes the textual date representations that GNU programs accept. These are the strings you, as a user, can supply as arguments to the various programs. The C interface (via the parse_datetime function) is not described here.

      4.10.1 General date syntax

      A date is a string, possibly empty, containing many items separated by whitespace. The whitespace may be omitted when no ambiguity arises. The empty string means the beginning of today (i.e., midnight). Order of the items is immaterial. A date string may contain many flavors of items:

      • calendar date items
      • time of day items
      • time zone items
      • combined date and time of day items
      • day of the week items
      • relative items
      • pure numbers.

      We describe each of these item types in turn, below.

      A few ordinal numbers may be written out in words in some contexts. This is most useful for specifying day of the week items or relative items (see below). Among the most commonly used ordinal numbers, the word ‘last’ stands for -1, ‘this’ stands for 0, and ‘first’ and ‘next’ both stand for 1. Because the word ‘second’ stands for the unit of time there is no way to write the ordinal number 2, but for convenience ‘third’ stands for 3, ‘fourth’ for 4, ‘fifth’ for 5, ‘sixth’ for 6, ‘seventh’ for 7, ‘eighth’ for 8, ‘ninth’ for 9, ‘tenth’ for 10, ‘eleventh’ for 11 and ‘twelfth’ for 12.

      When a month is written this way, it is still considered to be written numerically, instead of being “spelled in full”; this changes the allowed strings.

      In the current implementation, only English is supported for words and abbreviations like ‘AM’, ‘DST’, ‘EST’, ‘first’, ‘January’, ‘Sunday’, ‘tomorrow’, and ‘year’.

      The output of the date command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like ‘IST’. When using date to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than ‘UTC’ and ‘Z’. Here are some ways to do this:

           $ LC_ALL=C TZ=UTC0 date
           Mon Mar  1 00:21:42 UTC 2004
           $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
           2004-03-01 00:21:42Z
           $ date --rfc-3339=ns  # --rfc-3339 is a GNU extension.
           2004-02-29 16:21:42.692722128-08:00
           $ date --rfc-2822  # a GNU extension
           Sun, 29 Feb 2004 16:21:42 -0800
           $ date +'%Y-%m-%d %H:%M:%S %z'  # %z is a GNU extension.
           2004-02-29 16:21:42 -0800
           $ date +'@%s.%N'  # %s and %N are GNU extensions.
           @1078100502.692722128
      

      Alphabetic case is completely ignored in dates. Comments may be introduced between round parentheses, as long as included parentheses are properly nested. Hyphens not followed by a digit are currently ignored. Leading zeros on numbers are ignored.

      Invalid dates like ‘2005-02-29’ or times like ‘24:00’ are rejected. In the typical case of a host that does not support leap seconds, a time like ‘23:59:60’ is rejected even if it corresponds to a valid leap second.

      4.10.2 Calendar date items

      A calendar date item specifies a day of the year. It is specified differently, depending on whether the month is specified numerically or literally. All these strings specify the same calendar date:

           1972-09-24     # ISO 8601.
           72-9-24        # Assume 19xx for 69 through 99,
                          # 20xx for 00 through 68.
           72-09-24       # Leading zeros are ignored.
           9/24/72        # Common U.S. writing.
           24 September 1972
           24 Sept 72     # September has a special abbreviation.
           24 Sep 72      # Three-letter abbreviations always allowed.
           Sep 24, 1972
           24-sep-72
           24sep72
      

      The year can also be omitted. In this case, the last specified year is used, or the current year if none. For example:

           9/24
           sep 24
      

      Here are the rules.

      For numeric months, the ISO 8601 format ‘year-month-day’ is allowed, where year is any positive number, month is a number between 01 and 12, and day is a number between 01 and 31. A leading zero must be present if a number is less than ten. If year is 68 or smaller, then 2000 is added to it; otherwise, if year is less than 100, then 1900 is added to it. The construct ‘month/day/year’, popular in the United States, is accepted. Also ‘month/day’, omitting the year.

      Literal months may be spelled out in full: ‘January’, ‘February’, ‘March’, ‘April’, ‘May’, ‘June’, ‘July’, ‘August’, ‘September’, ‘October’, ‘November’ or ‘December’. Literal months may be abbreviated to their first three letters, possibly followed by an abbreviating dot. It is also permitted to write ‘Sept’ instead of ‘September’.

      When months are written literally, the calendar date may be given as any of the following:

           day month year
           day month
           month day year
           day-month-year
      

      Or, omitting the year:

           month day
      

      4.10.3 Time of day items

      A time of day item in date strings specifies the time on a given day. Here are some examples, all of which represent the same time:

           20:02:00.000000
           20:02
           8:02pm
           20:02-0500      # In EST (U.S. Eastern Standard Time).
      

      More generally, the time of day may be given as ‘hour:minute:second’, where hour is a number between 0 and 23, minute is a number between 0 and 59, and second is a number between 0 and 59 possibly followed by ‘.’ or ‘,’ and a fraction containing one or more digits. Alternatively, ‘:second’ can be omitted, in which case it is taken to be zero. On the rare hosts that support leap seconds, second may be 60.

      If the time is followed by ‘am’ or ‘pm’ (or ‘a.m.’ or ‘p.m.’), hour is restricted to run from 1 to 12, and ‘:minute’ may be omitted (taken to be zero). ‘am’ indicates the first half of the day, ‘pm’ indicates the second half of the day. In this notation, 12 is the predecessor of 1: midnight is ‘12am’ while noon is ‘12pm’. (This is the zero-oriented interpretation of ‘12am’ and ‘12pm’, as opposed to the old tradition derived from Latin which uses ‘12m’ for noon and ‘12pm’ for midnight.)

      The time may alternatively be followed by a time zone correction, expressed as ‘shhmm’, where s is ‘+’ or ‘-’, hh is a number of zone hours and mm is a number of zone minutes. The zone minutes term, mm, may be omitted, in which case the one- or two-digit correction is interpreted as a number of hours. You can also separate hh from mm with a colon. When a time zone correction is given this way, it forces interpretation of the time relative to Coordinated Universal Time (UTC), overriding any previous specification for the time zone or the local time zone. For example, ‘+0530’ and ‘+05:30’ both stand for the time zone 5.5 hours ahead of UTC (e.g., India). This is the best way to specify a time zone correction by fractional parts of an hour. The maximum zone correction is 24 hours.

      Either ‘am’/‘pm’ or a time zone correction may be specified, but not both.

      4.10.4 Time zone items

      A time zone item specifies an international time zone, indicated by a small set of letters, e.g., ‘UTC’ or ‘Z’ for Coordinated Universal Time. Any included periods are ignored. By following a non-daylight-saving time zone by the string ‘DST’ in a separate word (that is, separated by some white space), the corresponding daylight saving time zone may be specified. Alternatively, a non-daylight-saving time zone can be followed by a time zone correction, to add the two values. This is normally done only for ‘UTC’; for example, ‘UTC+05:30’ is equivalent to ‘+05:30’.

      Time zone items other than ‘UTC’ and ‘Z’ are obsolescent and are not recommended, because they are ambiguous; for example, ‘EST’ has a different meaning in Australia than in the United States. Instead, it's better to use unambiguous numeric time zone corrections like ‘-0500’, as described in the previous section.

      If neither a time zone item nor a time zone correction is supplied, time stamps are interpreted using the rules of the default time zone (see Specifying time zone rules).

      4.10.5 Combined date and time of day items

      The ISO 8601 date and time of day extended format consists of an ISO 8601 date, a ‘T’ character separator, and an ISO 8601 time of day. This format is also recognized if the ‘T’ is replaced by a space.

      In this format, the time of day should use 24-hour notation. Fractional seconds are allowed, with either comma or period preceding the fraction. ISO 8601 fractional minutes and hours are not supported. Typically, hosts support nanosecond timestamp resolution; excess precision is silently discarded.

      Here are some examples:

           2012-09-24T20:02:00.052-0500
           2012-12-31T23:59:59,999999999+1100
           1970-01-01 00:00Z
      

      4.10.6 Day of week items

      The explicit mention of a day of the week will forward the date (only if necessary) to reach that day of the week in the future.

      Days of the week may be spelled out in full: ‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’ or ‘Saturday’. Days may be abbreviated to their first three letters, optionally followed by a period. The special abbreviations ‘Tues’ for ‘Tuesday’, ‘Wednes’ for ‘Wednesday’ and ‘Thur’ or ‘Thurs’ for ‘Thursday’ are also allowed.

      A number may precede a day of the week item to move forward supplementary weeks. It is best used in expression like ‘third monday’. In this context, ‘last day’ or ‘next day’ is also acceptable; they move one week before or after the day that day by itself would represent.

      A comma following a day of the week item is ignored.

      4.10.7 Relative items in date strings

      Relative items adjust a date (or the current date if none) forward or backward. The effects of relative items accumulate. Here are some examples:

           1 year
           1 year ago
           3 years
           2 days
      

      The unit of time displacement may be selected by the string ‘year’ or ‘month’ for moving by whole years or months. These are fuzzy units, as years and months are not all of equal duration. More precise units are ‘fortnight’ which is worth 14 days, ‘week’ worth 7 days, ‘day’ worth 24 hours, ‘hour’ worth 60 minutes, ‘minute’ or ‘min’ worth 60 seconds, and ‘second’ or ‘sec’ worth one second. An ‘s’ suffix on these units is accepted and ignored.

      The unit of time may be preceded by a multiplier, given as an optionally signed number. Unsigned numbers are taken as positively signed. No number at all implies 1 for a multiplier. Following a relative item by the string ‘ago’ is equivalent to preceding the unit by a multiplier with value -1.

      The string ‘tomorrow’ is worth one day in the future (equivalent to ‘day’), the string ‘yesterday’ is worth one day in the past (equivalent to ‘day ago’).

      The strings ‘now’ or ‘today’ are relative items corresponding to zero-valued time displacement, these strings come from the fact a zero-valued time displacement represents the current time when not otherwise changed by previous items. They may be used to stress other items, like in ‘12:00 today’. The string ‘this’ also has the meaning of a zero-valued time displacement, but is preferred in date strings like ‘this thursday’.

      When a relative item causes the resulting date to cross a boundary where the clocks were adjusted, typically for daylight saving time, the resulting date and time are adjusted accordingly.

      The fuzz in units can cause problems with relative items. For example, ‘2003-07-31 -1 month’ might evaluate to 2003-07-01, because 2003-06-31 is an invalid date. To determine the previous month more reliably, you can ask for the month before the 15th of the current month. For example:

           $ date -R
           Thu, 31 Jul 2003 13:02:39 -0700
           $ date --date='-1 month' +'Last month was %B?'
           Last month was July?
           $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
           Last month was June!
      

      Also, take care when manipulating dates around clock changes such as daylight saving leaps. In a few cases these have added or subtracted as much as 24 hours from the clock, so it is often wise to adopt universal time by setting the TZ environment variable to ‘UTC0’ before embarking on calendrical calculations.

      4.10.8 Pure numbers in date strings

      The precise interpretation of a pure decimal number depends on the context in the date string.

      If the decimal number is of the form yyyymmdd and no other calendar date item (see Calendar date items) appears before it in the date string, then yyyy is read as the year, mm as the month number and dd as the day of the month, for the specified calendar date.

      If the decimal number is of the form hhmm and no other time of day item appears before it in the date string, then hh is read as the hour of the day and mm as the minute of the hour, for the specified time of day. mm can also be omitted.

      If both a calendar date and a time of day appear to the left of a number in the date string, but no relative item, then the number overrides the year.

      4.10.9 Seconds since the Epoch

      If you precede a number with ‘@’, it represents an internal time stamp as a count of seconds. The number can contain an internal decimal point (either ‘.’ or ‘,’); any excess precision not supported by the internal representation is truncated toward minus infinity. Such a number cannot be combined with any other date item, as it specifies a complete time stamp.

      Internally, computer times are represented as a count of seconds since an epoch—a well-defined point of time. On GNU and POSIX systems, the epoch is 1970-01-01 00:00:00 UTC, so ‘@0’ represents this time, ‘@1’ represents 1970-01-01 00:00:01 UTC, and so forth. GNU and most other POSIX-compliant systems support such times as an extension to POSIX, using negative counts, so that ‘@-1’ represents 1969-12-31 23:59:59 UTC.

      Traditional Unix systems count seconds with 32-bit two's-complement integers and can represent times from 1901-12-13 20:45:52 through 2038-01-19 03:14:07 UTC. More modern systems use 64-bit counts of seconds with nanosecond subcounts, and can represent all the times in the known lifetime of the universe to a resolution of 1 nanosecond.

      On most hosts, these counts ignore the presence of leap seconds. For example, on most hosts ‘@915148799’ represents 1998-12-31 23:59:59 UTC, ‘@915148800’ represents 1999-01-01 00:00:00 UTC, and there is no way to represent the intervening leap second 1998-12-31 23:59:60 UTC.

      4.10.10 Specifying time zone rules

      Normally, dates are interpreted using the rules of the current time zone, which in turn are specified by the TZ environment variable, or by a system default if TZ is not set. To specify a different set of default time zone rules that apply just to one date, start the date with a string of the form ‘TZ="rule"’. The two quote characters (‘"’) must be present in the date, and any quotes or backslashes within rule must be escaped by a backslash.

      For example, with the GNU date command you can answer the question “What time is it in New York when a Paris clock shows 6:30am on October 31, 2004?” by using a date beginning with ‘TZ="Europe/Paris"’ as shown in the following shell transcript:

           $ export TZ="America/New_York"
           $ date --date='TZ="Europe/Paris" 2004-10-31 06:30'
           Sun Oct 31 01:30:00 EDT 2004
      

      In this example, the --date operand begins with its own TZ setting, so the rest of that operand is processed according to ‘Europe/Paris’ rules, treating the string ‘2004-10-31 06:30’ as if it were in Paris. However, since the output of the date command is processed according to the overall time zone rules, it uses New York time. (Paris was normally six hours ahead of New York in 2004, but this example refers to a brief Halloween period when the gap was five hours.)

      A TZ value is a rule that typically names a location in the tz’ database. A recent catalog of location names appears in the TWiki Date and Time Gateway. A few non-GNU hosts require a colon before a location name in a TZ setting, e.g., ‘TZ=":America/New_York"’.

      The ‘tz’ database includes a wide variety of locations ranging from ‘Arctic/Longyearbyen’ to ‘Antarctica/South_Pole’, but if you are at sea and have your own private time zone, or if you are using a non-GNU host that does not support the ‘tz’ database, you may need to use a POSIX rule instead. Simple POSIX rules like ‘UTC0’ specify a time zone without daylight saving time; other rules can specify simple daylight saving regimes. See Specifying the Time Zone with TZ.

      4.10.11 Authors of parse_datetime

      parse_datetime started life as getdate, as originally implemented by Steven M. Bellovin (smb@research.att.com) while at the University of North Carolina at Chapel Hill. The code was later tweaked by a couple of people on Usenet, then completely overhauled by Rich $alz (rsalz@bbn.com) and Jim Berets (jberets@bbn.com) in August, 1990. Various revisions for the GNU system were made by David MacKenzie, Jim Meyering, Paul Eggert and others, including renaming it to get_date to avoid a conflict with the alternative Posix function getdate, and a later rename to parse_datetime. The Posix function getdate can parse more locale-specific dates using strptime, but relies on an environment variable and external file, and lacks the thread-safety of parse_datetime.

      This chapter was originally produced by François Pinard (pinard@iro.umontreal.ca) from the parse_datetime.y source code, and then edited by K. Berry (kb@cs.umb.edu).


      Next: , Previous: Reference Manual, Up: Top

      5 Programming Manual

      This chapter describes all the publicly available functions in the library.

      5.1 Preparation

      To use `Libshishi', you have to perform some changes to your sources and the build system. The necessary changes are small and explained in the following sections. At the end of this chapter, it is described how the library is initialized, and how the requirements of the library are verified.

      A faster way to find out how to adapt your application for use with `Libshishi' may be to look at the examples at the end of this manual (see Examples).

      5.1.1 Header

      All interfaces (data types and functions) of the library are defined in the header file `shishi.h'. You must include this in all programs using the library, either directly or through some other header file, like this:

           #include <shishi.h>
      

      The name space of `Libshishi' is shishi_* for function names, Shishi* for data types and SHISHI_* for other symbols. In addition the same name prefixes with one prepended underscore are reserved for internal use and should never be used by an application.


      Next: , Previous: Header, Up: Preparation

      5.1.2 Initialization

      `Libshishi' must be initialized before it can be used. The library is initialized by calling shishi_init (see Initialization Functions). The resources allocated by the initialization process can be released if the application no longer has a need to call `Libshishi' functions, this is done by calling shishi_done.

      In order to take advantage of the internationalisation features in `Libshishi', such as translated error messages, the application must set the current locale using setlocale before initializing `Libshishi'.

      5.1.3 Version Check

      It is often desirable to check that the version of `Libshishi' used is indeed one which fits all requirements. Even with binary compatibility new features may have been introduced but due to problem with the dynamic linker an old version is actually used. So you may want to check that the version is okay right after program startup.

      shishi_check_version

      — Function: const char * shishi_check_version (const char * req_version)

      req_version: version string to compare with, or NULL

      Check that the version of the library is at minimum the one given as a string in req_version.

      Return value: the actual version string of the library; NULL if the condition is not met. If NULL is passed to this function no check is done and only the version string is returned.

      The normal way to use the function is to put something similar to the following early in your main:

             if (!shishi_check_version (SHISHI_VERSION))
               {
                 printf ("shishi_check_version failed:\n"
                         "Header file incompatible with shared library.\n");
                 exit (EXIT_FAILURE);
               }
      


      Next: , Previous: Version Check, Up: Preparation

      5.1.4 Building the source

      If you want to compile a source file including the `shishi.h' header file, you must make sure that the compiler can find it in the directory hierarchy. This is accomplished by adding the path to the directory in which the header file is located to the compilers include file search path (via the -I option).

      However, the path to the include file is determined at the time the source is configured. To solve this problem, `Libshishi' uses the external package pkg-config that knows the path to the include file and other configuration options. The options that need to be added to the compiler invocation at compile time are output by the --cflags option to pkg-config shishi. The following example shows how it can be used at the command line:

           gcc -c foo.c `pkg-config shishi --cflags`
      

      Adding the output of ‘pkg-config shishi --cflags’ to the compilers command line will ensure that the compiler can find the `Libshishi' header file.

      A similar problem occurs when linking the program with the library. Again, the compiler has to find the library files. For this to work, the path to the library files has to be added to the library search path (via the -L option). For this, the option --libs to pkg-config shishi can be used. For convenience, this option also outputs all other options that are required to link the program with the `Libshishi' libararies (in particular, the ‘-lshishi’ option). The example shows how to link foo.o with the `Libshishi' library to a program foo.

           gcc -o foo foo.o `pkg-config shishi --libs`
      

      Of course you can also combine both examples to a single command by specifying both options to pkg-config:

           gcc -o foo foo.c `pkg-config shishi --cflags --libs`
      


      Previous: Building the source, Up: Preparation

      5.1.5 Autoconf tests

      If you work on a project that uses Autoconf (see GNU Autoconf) to help find installed libraries, the suggestions in the previous section are not the entire story. There are a few methods to detect and incorporate Shishi into your Autoconf based package. The preferred approach, is to use Libtool in your project, and use the normal Autoconf header file and library tests.

      5.1.5.1 Autoconf test via ‘pkg-config

      If your audience is a typical GNU/Linux desktop, you can often assume they have the ‘pkg-config’ tool installed, in which you can use its Autoconf M4 macro to find and set up your package for use with Shishi. The following illustrate this scenario.

           AC_ARG_ENABLE(kerberos_v5,
           	AC_HELP_STRING([--disable-kerberos_v5],
                                  [don't use the KERBEROS_V5 mechanism]),
           	kerberos_v5=$enableval)
           if test "$kerberos_v5" != "no" ; then
           	PKG_CHECK_MODULES(SHISHI, shishi >= 0.0.0,
           			[kerberos_v5=yes],
                                   [kerberos_v5=no])
           	if test "$kerberos_v5" != "yes" ; then
           		kerberos_v5=no
           		AC_MSG_WARN([shishi not found, disabling Kerberos 5])
           	else
           		kerberos_v5=yes
           		AC_DEFINE(USE_KERBEROS_V5, 1,
                                     [Define to 1 if you want Kerberos 5.])
           	fi
           fi
           AC_MSG_CHECKING([if Kerberos 5 should be used])
           AC_MSG_RESULT($kerberos_v5)
      
      5.1.5.2 Standalone Autoconf test using Libtool

      If your package uses Libtool(see GNU Libtool), you can use the normal Autoconf tests to find the Shishi library and rely on the Libtool dependency tracking to include the proper dependency libraries (e.g., Libidn). The following illustrate this scenario.

           AC_CHECK_HEADER(shishi.h,
           	AC_CHECK_LIB(shishi, shishi_check_version,
           		[kerberos5=yes AC_SUBST(SHISHI_LIBS, -lshishi)],
           		kerberos5=no),
           	kerberos5=no)
           AC_ARG_ENABLE(kerberos5,
           	AC_HELP_STRING([--disable-kerberos5],
                                  [disable Kerberos 5 unconditionally]),
           	kerberos5=$enableval)
           if test "$kerberos5" != "no" ; then
           	AC_DEFINE(USE_KERBEROS_V5, 1,
           		  [Define to 1 if you want Kerberos 5.])
           else
           	AC_MSG_WARN([Shishi not found, disabling Kerberos 5])
           fi
           AC_MSG_CHECKING([if Kerberos 5 should be used])
           AC_MSG_RESULT($kerberos5)
      
      5.1.5.3 Standalone Autoconf test

      If your package does not use Libtool, as well as detecting the Shishi library as in the previous case, you must also detect whatever dependencies Shishi requires to work (e.g., libidn). Since the dependencies are in a state of flux, we do not provide an example and we do not recommend this approach, unless you are experienced developer.

      5.2 Initialization Functions

      shishi

      — Function: Shishi * shishi ( void)

      Initializes the Shishi library, and set up, using shishi_error_set_outputtype(), the library so that future warnings and informational messages are printed to stderr. If this function fails, it may print diagnostic errors to stderr.

      Return value: Returns Shishi library handle, or NULL on error.

      shishi_server

      — Function: Shishi * shishi_server ( void)

      Initializes the Shishi library, and set up, using shishi_error_set_outputtype(), the library so that future warnings and informational messages are printed to the syslog. If this function fails, it may print diagnostic errors to the syslog.

      Return value: Returns Shishi library handle, or NULL on error.

      shishi_done

      — Function: void shishi_done (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Deallocates the shishi library handle. The handle must not be used in any calls to shishi functions after this.

      If there is a default tkts, it is written to the default tkts file (call shishi_tkts_default_file_set() to change the default tkts file). If you do not wish to write the default tkts file, close the default tkts with shishi_tkts_done(handle, NULL) before calling this function.

      shishi_init

      — Function: int shishi_init (Shishi ** handle)

      handle: pointer to handle to be created.

      Create a Shishi library handle, using shishi(), and read the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket.

      The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_init_with_paths

      — Function: int shishi_init_with_paths (Shishi ** handle, const char * tktsfile, const char * systemcfgfile, const char * usercfgfile)

      handle: pointer to handle to be created.

      tktsfile: Filename of ticket file, or NULL.

      systemcfgfile: Filename of system configuration, or NULL.

      usercfgfile: Filename of user configuration, or NULL.

      Create a Shishi library handle, using shishi(), and read the system configuration file, user configuration file, and user tickets from the specified locations. If any of usercfgfile or systemcfgfile is NULL, the file is read from its default location, which for the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration file is $HOME/.shishi/config. If the ticket file is NULL, a ticket file is not read at all.

      The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_init_server

      — Function: int shishi_init_server (Shishi ** handle)

      handle: pointer to handle to be created.

      Create a Shishi library handle, using shishi_server(), and read the system configuration file. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf.

      The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_init_server_with_paths

      — Function: int shishi_init_server_with_paths (Shishi ** handle, const char * systemcfgfile)

      handle: pointer to handle to be created.

      systemcfgfile: Filename of system configuration, or NULL.

      Create a Shishi library handle, using shishi_server(), and read the system configuration file from specified location. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The handle is allocated regardless of return values, except for SHISHI_HANDLE_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the file.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_cfg

      — Function: int shishi_cfg (Shishi * handle, const char * option)

      handle: Shishi library handle create by shishi_init().

      option: string with shishi library option.

      Configure shishi library with given option.

      Return Value: Returns SHISHI_OK if option was valid.

      shishi_cfg_from_file

      — Function: int shishi_cfg_from_file (Shishi * handle, const char * cfg)

      handle: Shishi library handle create by shishi_init().

      cfg: filename to read configuration from.

      Configure shishi library using configuration file.

      Return Value: Returns SHISHI_OK iff successful.

      shishi_cfg_print

      — Function: int shishi_cfg_print (Shishi * handle, FILE * fh)

      handle: Shishi library handle create by shishi_init().

      fh: file descriptor opened for writing.

      Print library configuration status, mostly for debugging purposes.

      Return Value: Returns SHISHI_OK.

      shishi_cfg_default_systemfile

      — Function: const char * shishi_cfg_default_systemfile (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      The system configuration file name is decided at compile-time, but may be overridden by the environment variable SHISHI_CONFIG.

      Return value: Return system configuration file name.

      shishi_cfg_default_userdirectory

      — Function: const char * shishi_cfg_default_userdirectory (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      The default user directory (used for, e.g. Shishi ticket cache) is normally computed by appending BASE_DIR ("/.shishi") to the content of the environment variable $HOME, but can be overridden by specifying the complete path in the environment variable SHISHI_HOME.

      Return value: Return directory with configuration files etc.

      shishi_cfg_userdirectory_file

      — Function: char * shishi_cfg_userdirectory_file (Shishi * handle, const char * file)

      handle: Shishi library handle create by shishi_init().

      file: basename of file to find in user directory.

      Get the full path to specified file in the users' configuration directory.

      Return value: Return full path to given relative filename, relative to the user specific Shishi configuration directory as returned by shishi_cfg_default_userdirectory() (typically $HOME/.shishi).

      shishi_cfg_default_userfile

      — Function: const char * shishi_cfg_default_userfile (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get filename of default user configuration file, typically $HOME/shishi.conf.

      Return value: Return user configuration filename.

      shishi_cfg_clientkdcetype

      — Function: int shishi_cfg_clientkdcetype (Shishi * handle, int32_t ** etypes)

      handle: Shishi library handle create by shishi_init().

      etypes: output array with encryption types.

      Set the etypes variable to the array of preferred client etypes.

      Return value: Return the number of encryption types in the array, 0 means none.

      shishi_cfg_clientkdcetype_fast

      — Function: int32_t shishi_cfg_clientkdcetype_fast (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Extract the default etype from the list of preferred client etypes.

      Return value: Return the default encryption types.

      shishi_cfg_clientkdcetype_set

      — Function: int shishi_cfg_clientkdcetype_set (Shishi * handle, char * value)

      handle: Shishi library handle created by shishi_init().

      value: string with encryption types.

      Set the "client-kdc-etypes" configuration option from given string. The string contains encryption types (integer or names) separated by comma or whitespace, e.g. "aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5".

      Return value: Returns SHISHI_OK if successful.

      shishi_cfg_authorizationtype_set

      — Function: int shishi_cfg_authorizationtype_set (Shishi * handle, char * value)

      handle: Shishi library handle created by shishi_init().

      value: string with authorization types.

      Set the "authorization-types" configuration option from given string. The string contains authorization types (integer or names) separated by comma or whitespace, e.g. "basic k5login".

      Return value: Returns SHISHI_OK if successful.

      5.3 Ticket Set Functions

      A “ticket set” is, as the name implies, a collection of tickets. Functions are provided to read tickets from file into a ticket set, to query number of tickets in the set, to extract a given ticket from the set, to search the ticket set for tickets matching certain criterium, to write the ticket set to a file, etc. High level functions for performing a initial authentication (see AS Functions) or subsequent authentication (see TGS Functions) and storing the new ticket in the ticket set are also provided.

      See Ticket Functions, to manipulate each individual ticket. See Ticket (ASN.1) Functions, for low-level ASN.1 manipulation.

      shishi_tkts_default_file_guess

      — Function: char * shishi_tkts_default_file_guess (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets.

      Return value: Returns default tkts filename as a string that has to be deallocated with free() by the caller.

      shishi_tkts_default_file

      — Function: const char * shishi_tkts_default_file (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get filename of default ticket set.

      Return value: Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it.

      shishi_tkts_default_file_set

      — Function: void shishi_tkts_default_file_set (Shishi * handle, const char * tktsfile)

      handle: Shishi library handle create by shishi_init().

      tktsfile: string with new default tkts file name, or NULL to reset to default.

      Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_tkts_default

      — Function: Shishi_tkts * shishi_tkts_default (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get the default ticket set for library handle.

      Return value: Return the handle global ticket set.

      shishi_tkts

      — Function: int shishi_tkts (Shishi * handle, Shishi_tkts ** tkts)

      handle: shishi handle as allocated by shishi_init().

      tkts: output pointer to newly allocated tkts handle.

      Get a new ticket set handle.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_done

      — Function: void shishi_tkts_done (Shishi_tkts ** tkts)

      tkts: ticket set handle as allocated by shishi_tkts().

      Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this.

      shishi_tkts_size

      — Function: int shishi_tkts_size (Shishi_tkts * tkts)

      tkts: ticket set handle as allocated by shishi_tkts().

      Get size of ticket set.

      Return value: Returns number of tickets stored in ticket set.

      shishi_tkts_nth

      — Function: Shishi_tkt * shishi_tkts_nth (Shishi_tkts * tkts, int ticketno)

      tkts: ticket set handle as allocated by shishi_tkts().

      ticketno: integer indicating requested ticket in ticket set.

      Get the n: th ticket in ticket set.

      Return value: Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on.

      shishi_tkts_remove

      — Function: int shishi_tkts_remove (Shishi_tkts * tkts, int ticketno)

      tkts: ticket set handle as allocated by shishi_tkts().

      ticketno: ticket number of ticket in the set to remove. The first ticket is ticket number 0.

      Remove a ticket, indexed by ticketno, in ticket set.

      Return value: SHISHI_OK if successful or if ticketno larger than size of ticket set.

      shishi_tkts_add

      — Function: int shishi_tkts_add (Shishi_tkts * tkts, Shishi_tkt * tkt)

      tkts: ticket set handle as allocated by shishi_tkts().

      tkt: ticket to be added to ticket set.

      Add a ticket to the ticket set. Only the pointer is stored, so if you modify tkt, the ticket in the ticket set will also be modified.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_new

      — Function: int shishi_tkts_new (Shishi_tkts * tkts, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep)

      tkts: ticket set handle as allocated by shishi_tkts().

      ticket: input ticket variable.

      enckdcreppart: input ticket detail variable.

      kdcrep: input KDC-REP variable.

      Allocate a new ticket and add it to the ticket set.

      Note that ticket, enckdcreppart and kdcrep are stored by reference, so you must not de-allocate them before the ticket is removed from the ticket set and de-allocated.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_read

      — Function: int shishi_tkts_read (Shishi_tkts * tkts, FILE * fh)

      tkts: ticket set handle as allocated by shishi_tkts().

      fh: file descriptor to read from.

      Read tickets from file descriptor and add them to the ticket set.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_from_file

      — Function: int shishi_tkts_from_file (Shishi_tkts * tkts, const char * filename)

      tkts: ticket set handle as allocated by shishi_tkts().

      filename: filename to read tickets from.

      Read tickets from file and add them to the ticket set.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_write

      — Function: int shishi_tkts_write (Shishi_tkts * tkts, FILE * fh)

      tkts: ticket set handle as allocated by shishi_tkts().

      fh: file descriptor to write tickets to.

      Write tickets in set to file descriptor.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_expire

      — Function: int shishi_tkts_expire (Shishi_tkts * tkts)

      tkts: ticket set handle as allocated by shishi_tkts().

      Remove expired tickets from ticket set.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_to_file

      — Function: int shishi_tkts_to_file (Shishi_tkts * tkts, const char * filename)

      tkts: ticket set handle as allocated by shishi_tkts().

      filename: filename to write tickets to.

      Write tickets in set to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_print_for_service

      — Function: int shishi_tkts_print_for_service (Shishi_tkts * tkts, FILE * fh, const char * service)

      tkts: ticket set handle as allocated by shishi_tkts().

      fh: file descriptor to print to.

      service: service to limit tickets printed to, or NULL.

      Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkts_print

      — Function: int shishi_tkts_print (Shishi_tkts * tkts, FILE * fh)

      tkts: ticket set handle as allocated by shishi_tkts().

      fh: file descriptor to print to.

      Print description of all tickets to file descriptor.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_match_p

      — Function: int shishi_tkt_match_p (Shishi_tkt * tkt, Shishi_tkts_hint * hint)

      tkt: ticket to test hints on.

      hint: structure with characteristics of ticket to be found.

      Test if a ticket matches specified hints.

      Return value: Returns 0 iff ticket fails to match given criteria.

      shishi_tkts_find

      — Function: Shishi_tkt * shishi_tkts_find (Shishi_tkts * tkts, Shishi_tkts_hint * hint)

      tkts: ticket set handle as allocated by shishi_tkts().

      hint: structure with characteristics of ticket to be found.

      Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint->startpos field must be updated appropriately.

      Here is how you would typically use this function: Shishi_tkts_hint hint;

      Shishi_tkt tkt;

      memset(&hint, 0, sizeof(hint));

      hint.server = "imap/mail.example.org";

      tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint);

      if (!tkt)

      printf("No ticket found...\n");

      else

      do_something_with_ticket (tkt);

      Return value: Returns a ticket if found, or NULL if no further matching tickets could be found.

      shishi_tkts_find_for_clientserver

      — Function: Shishi_tkt * shishi_tkts_find_for_clientserver (Shishi_tkts * tkts, const char * client, const char * server)

      tkts: ticket set handle as allocated by shishi_tkts().

      client: client name to find ticket for.

      server: server name to find ticket for.

      Short-hand function for searching the ticket set for a ticket for the given client and server. See shishi_tkts_find().

      Return value: Returns a ticket if found, or NULL.

      shishi_tkts_find_for_server

      — Function: Shishi_tkt * shishi_tkts_find_for_server (Shishi_tkts * tkts, const char * server)

      tkts: ticket set handle as allocated by shishi_tkts().

      server: server name to find ticket for.

      Short-hand function for searching the ticket set for a ticket for the given server using the default client principal. See shishi_tkts_find_for_clientserver() and shishi_tkts_find().

      Return value: Returns a ticket if found, or NULL.

      shishi_tkts_get_tgt

      — Function: Shishi_tkt * shishi_tkts_get_tgt (Shishi_tkts * tkts, Shishi_tkts_hint * hint)

      tkts: ticket set handle as allocated by shishi_tkts().

      hint: structure with characteristics of ticket to begot.

      Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange.

      Currently this function do not implement cross realm logic.

      This function is used by shishi_tkts_get(), which is probably what you really want to use unless you have special needs.

      Return value: Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on.

      shishi_tkts_get_tgs

      — Function: Shishi_tkt * shishi_tkts_get_tgs (Shishi_tkts * tkts, Shishi_tkts_hint * hint, Shishi_tkt * tgt)

      tkts: ticket set handle as allocated by shishi_tkts().

      hint: structure with characteristics of ticket to begot.

      tgt: ticket granting ticket to use.

      Get a ticket via TGS exchange using specified ticket granting ticket.

      This function is used by shishi_tkts_get(), which is probably what you really want to use unless you have special needs.

      Return value: Returns a ticket if successful, or NULL if this function is unable to acquire on.

      shishi_tkts_get

      — Function: Shishi_tkt * shishi_tkts_get (Shishi_tkts * tkts, Shishi_tkts_hint * hint)

      tkts: ticket set handle as allocated by shishi_tkts().

      hint: structure with characteristics of ticket to be found.

      Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using shishi_tkts_get_tgt(), and then uses that TGT in a TGS exchange to get the ticket.

      Currently this function does not implement cross realm logic.

      Return value: Returns a ticket if found, or NULL if this function is unable to get the ticket.

      shishi_tkts_get_for_clientserver

      — Function: Shishi_tkt * shishi_tkts_get_for_clientserver (Shishi_tkts * tkts, const char * client, const char * server)

      tkts: ticket set handle as allocated by shishi_tkts().

      client: client name to get ticket for.

      server: server name to get ticket for.

      Short-hand function for getting a ticket for the given client and server. See shishi_tkts_get().

      Return value: Returns a ticket if found, or NULL.

      shishi_tkts_get_for_server

      — Function: Shishi_tkt * shishi_tkts_get_for_server (Shishi_tkts * tkts, const char * server)

      tkts: ticket set handle as allocated by shishi_tkts().

      server: server name to get ticket for.

      Short-hand function for getting a ticket to the given server and for the default principal client. See shishi_tkts_get().

      Return value: Returns a ticket if found, or NULL.

      shishi_tkts_get_for_localservicepasswd

      — Function: Shishi_tkt * shishi_tkts_get_for_localservicepasswd (Shishi_tkts * tkts, const char * service, const char * passwd)

      tkts: ticket set handle as allocated by shishi_tkts().

      service: service name to get ticket for.

      passwd: password for the default client principal.

      Short-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See shishi_tkts_get().

      Return value: Returns a ticket if found, or NULL otherwise.

      5.4 AP-REQ and AP-REP Functions

      The “AP-REQ” and “AP-REP” are ASN.1 structures used by application client and servers to prove to each other who they are. The structures contain auxilliary information, together with an authenticator (see Authenticator Functions) which is the real cryptographic proof. The following illustrates the AP-REQ and AP-REP ASN.1 structures.

      AP-REQ		::= [APPLICATION 14] SEQUENCE {
      	pvno		[0] INTEGER (5),
      	msg-type	[1] INTEGER (14),
      	ap-options	[2] APOptions,
      	ticket		[3] Ticket,
      	authenticator	[4] EncryptedData {Authenticator,
      				{ keyuse-pa-TGSReq-authenticator
      				  | keyuse-APReq-authenticator }}
      }
      
      AP-REP		::= [APPLICATION 15] SEQUENCE {
      	pvno		[0] INTEGER (5),
      	msg-type	[1] INTEGER (15),
      	enc-part	[2] EncryptedData {EncAPRepPart,
      				{ keyuse-EncAPRepPart }}
      }
      
      EncAPRepPart	::= [APPLICATION 27] SEQUENCE {
      	ctime		[0] KerberosTime,
      	cusec		[1] Microseconds,
      	subkey		[2] EncryptionKey OPTIONAL,
      	seq-number	[3] UInt32 OPTIONAL
      }
      

      shishi_ap

      — Function: int shishi_ap (Shishi * handle, Shishi_ap ** ap)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use shishi_ap_etype() or shishi_ap_nosubkey() instead. In the future, this function will likely behave as shishi_ap_nosubkey() and shishi_ap_nosubkey() will be removed.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_etype

      — Function: int shishi_ap_etype (Shishi * handle, Shishi_ap ** ap, int etype)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      etype: encryption type of newly generated random subkey.

      Create a new AP exchange with a random subkey of indicated encryption type.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_nosubkey

      — Function: int shishi_ap_nosubkey (Shishi * handle, Shishi_ap ** ap)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      Create a new AP exchange without subkey in authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_done

      — Function: void shishi_ap_done (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle.

      shishi_ap_set_tktoptions

      — Function: int shishi_ap_set_tktoptions (Shishi_ap * ap, Shishi_tkt * tkt, int options)

      ap: structure that holds information about AP exchange

      tkt: ticket to set in AP.

      options: AP-REQ options to set in AP.

      Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()).

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_set_tktoptionsdata

      — Function: int shishi_ap_set_tktoptionsdata (Shishi_ap * ap, Shishi_tkt * tkt, int options, const char * data, size_t len)

      ap: structure that holds information about AP exchange

      tkt: ticket to set in AP.

      options: AP-REQ options to set in AP.

      data: input array with data to checksum in Authenticator.

      len: length of input array with data to checksum in Authenticator.

      Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()) and set the Authenticator checksum data.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_set_tktoptionsraw

      — Function: int shishi_ap_set_tktoptionsraw (Shishi_ap * ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char * data, size_t len)

      ap: structure that holds information about AP exchange

      tkt: ticket to set in AP.

      options: AP-REQ options to set in AP.

      cksumtype: authenticator checksum type to set in AP.

      data: input array with data to store in checksum field in Authenticator.

      len: length of input array with data to store in checksum field in Authenticator.

      Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ apoptions (see shishi_apreq_options_set()) and set the raw Authenticator checksum data.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_set_tktoptionsasn1usage

      — Function: int shishi_ap_set_tktoptionsasn1usage (Shishi_ap * ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char * field, int authenticatorcksumkeyusage, int authenticatorkeyusage)

      ap: structure that holds information about AP exchange

      tkt: ticket to set in AP.

      options: AP-REQ options to set in AP.

      node: input ASN.1 structure to store as authenticator checksum data.

      field: field in ASN.1 structure to use.

      authenticatorcksumkeyusage: key usage for checksum in authenticator.

      authenticatorkeyusage: key usage for authenticator.

      Set ticket, options and authenticator checksum data using shishi_ap_set_tktoptionsdata(). The authenticator checksum data is the DER encoding of the ASN.1 field provided.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_tktoptions

      — Function: int shishi_ap_tktoptions (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      tkt: ticket to set in newly created AP.

      options: AP-REQ options to set in newly created AP.

      Create a new AP exchange using shishi_ap(), and set the ticket and AP-REQ apoptions using shishi_ap_set_tktoptions(). A random session key is added to the authenticator, using the same keytype as the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_tktoptionsdata

      — Function: int shishi_ap_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, const char * data, size_t len)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      tkt: ticket to set in newly created AP.

      options: AP-REQ options to set in newly created AP.

      data: input array with data to checksum in Authenticator.

      len: length of input array with data to checksum in Authenticator.

      Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the Authenticator checksum data using shishi_ap_set_tktoptionsdata(). A random session key is added to the authenticator, using the same keytype as the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_tktoptionsraw

      — Function: int shishi_ap_tktoptionsraw (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char * data, size_t len)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      tkt: ticket to set in newly created AP.

      options: AP-REQ options to set in newly created AP.

      cksumtype: authenticator checksum type to set in AP.

      data: input array with data to store in checksum field in Authenticator.

      len: length of input array with data to store in checksum field in Authenticator.

      Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the raw Authenticator checksum data field using shishi_ap_set_tktoptionsraw(). A random session key is added to the authenticator, using the same keytype as the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_etype_tktoptionsdata

      — Function: int shishi_ap_etype_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, int32_t etype, Shishi_tkt * tkt, int options, const char * data, size_t len)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      etype: encryption type of newly generated random subkey.

      tkt: ticket to set in newly created AP.

      options: AP-REQ options to set in newly created AP.

      data: input array with data to checksum in Authenticator.

      len: length of input array with data to checksum in Authenticator.

      Create a new AP exchange using shishi_ap(), and set the ticket, AP-REQ apoptions and the Authenticator checksum data using shishi_ap_set_tktoptionsdata(). A random session key is added to the authenticator, using the same keytype as the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_tktoptionsasn1usage

      — Function: int shishi_ap_tktoptionsasn1usage (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char * field, int authenticatorcksumkeyusage, int authenticatorkeyusage)

      handle: shishi handle as allocated by shishi_init().

      ap: pointer to new structure that holds information about AP exchange

      tkt: ticket to set in newly created AP.

      options: AP-REQ options to set in newly created AP.

      node: input ASN.1 structure to store as authenticator checksum data.

      field: field in ASN.1 structure to use.

      authenticatorcksumkeyusage: key usage for checksum in authenticator.

      authenticatorkeyusage: key usage for authenticator.

      Create a new AP exchange using shishi_ap(), and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using shishi_ap_set_tktoptionsasn1usage(). A random session key is added to the authenticator, using the same keytype as the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_tkt

      — Function: Shishi_tkt * shishi_ap_tkt (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get Ticket from AP exchange.

      Return value: Returns the ticket from the AP exchange, or NULL if not yet set or an error occured.

      shishi_ap_tkt_set

      — Function: void shishi_ap_tkt_set (Shishi_ap * ap, Shishi_tkt * tkt)

      ap: structure that holds information about AP exchange

      tkt: ticket to store in AP.

      Set the Ticket in the AP exchange.

      shishi_ap_authenticator_cksumdata

      — Function: int shishi_ap_authenticator_cksumdata (Shishi_ap * ap, char * out, size_t * len)

      ap: structure that holds information about AP exchange

      out: output array that holds authenticator checksum data.

      len: on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data.

      Get checksum data from Authenticator.

      Return value: Returns SHISHI_OK if successful, or SHISHI_TOO_SMALL_BUFFER if buffer provided was too small (then len will hold necessary buffer size).

      shishi_ap_authenticator_cksumdata_set

      — Function: void shishi_ap_authenticator_cksumdata_set (Shishi_ap * ap, const char * authenticatorcksumdata, size_t authenticatorcksumdatalen)

      ap: structure that holds information about AP exchange

      authenticatorcksumdata: input array with data to compute checksum on and store in Authenticator in AP-REQ.

      authenticatorcksumdatalen: length of input array with data to compute checksum on and store in Authenticator in AP-REQ.

      Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set.

      shishi_ap_authenticator_cksumraw_set

      — Function: void shishi_ap_authenticator_cksumraw_set (Shishi_ap * ap, int32_t authenticatorcksumtype, const char * authenticatorcksumraw, size_t authenticatorcksumrawlen)

      ap: structure that holds information about AP exchange

      authenticatorcksumtype: authenticator checksum type to set in AP.

      authenticatorcksumraw: input array with authenticator checksum field value to set in Authenticator in AP-REQ.

      authenticatorcksumrawlen: length of input array with authenticator checksum field value to set in Authenticator in AP-REQ.

      Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set.

      shishi_ap_authenticator_cksumtype

      — Function: int32_t shishi_ap_authenticator_cksumtype (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get the Authenticator Checksum Type in the AP exchange.

      Return value: Return the authenticator checksum type.

      shishi_ap_authenticator_cksumtype_set

      — Function: void shishi_ap_authenticator_cksumtype_set (Shishi_ap * ap, int32_t cksumtype)

      ap: structure that holds information about AP exchange

      cksumtype: authenticator checksum type to set in AP.

      Set the Authenticator Checksum Type in the AP exchange.

      shishi_ap_authenticator

      — Function: Shishi_asn1 shishi_ap_authenticator (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get ASN.1 Authenticator structure from AP exchange.

      Return value: Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured.

      shishi_ap_authenticator_set

      — Function: void shishi_ap_authenticator_set (Shishi_ap * ap, Shishi_asn1 authenticator)

      ap: structure that holds information about AP exchange

      authenticator: authenticator to store in AP.

      Set the Authenticator in the AP exchange.

      shishi_ap_req

      — Function: Shishi_asn1 shishi_ap_req (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get ASN.1 AP-REQ structure from AP exchange.

      Return value: Returns the AP-REQ from the AP exchange, or NULL if not yet set or an error occured.

      shishi_ap_req_set

      — Function: void shishi_ap_req_set (Shishi_ap * ap, Shishi_asn1 apreq)

      ap: structure that holds information about AP exchange

      apreq: apreq to store in AP.

      Set the AP-REQ in the AP exchange.

      shishi_ap_req_der

      — Function: int shishi_ap_req_der (Shishi_ap * ap, char ** out, size_t * outlen)

      ap: structure that holds information about AP exchange

      out: pointer to output array with der encoding of AP-REQ.

      outlen: pointer to length of output array with der encoding of AP-REQ.

      Build AP-REQ using shishi_ap_req_build() and DER encode it. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_req_der_set

      — Function: int shishi_ap_req_der_set (Shishi_ap * ap, char * der, size_t derlen)

      ap: structure that holds information about AP exchange

      der: input array with DER encoded AP-REQ.

      derlen: length of input array with DER encoded AP-REQ.

      DER decode AP-REQ and set it AP exchange. If decoding fails, the AP-REQ in the AP exchange is lost.

      Return value: Returns SHISHI_OK.

      shishi_ap_req_build

      — Function: int shishi_ap_req_build (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Checksum data in authenticator and add ticket and authenticator to AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_req_decode

      — Function: int shishi_ap_req_decode (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Decode ticket in AP-REQ and set the Ticket fields in the AP exchange.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_req_process_keyusage

      — Function: int shishi_ap_req_process_keyusage (Shishi_ap * ap, Shishi_key * key, int32_t keyusage)

      ap: structure that holds information about AP exchange

      key: cryptographic key used to decrypt ticket in AP-REQ.

      keyusage: key usage to use during decryption, for normal AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP-REQ's part of TGS-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR.

      Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_req_process

      — Function: int shishi_ap_req_process (Shishi_ap * ap, Shishi_key * key)

      ap: structure that holds information about AP exchange

      key: cryptographic key used to decrypt ticket in AP-REQ.

      Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_req_asn1

      — Function: int shishi_ap_req_asn1 (Shishi_ap * ap, Shishi_asn1 * apreq)

      ap: structure that holds information about AP exchange

      apreq: output AP-REQ variable.

      Build AP-REQ using shishi_ap_req_build() and return it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_key

      — Function: Shishi_key * shishi_ap_key (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used.

      Return value: Return application key from AP.

      shishi_ap_rep

      — Function: Shishi_asn1 shishi_ap_rep (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get ASN.1 AP-REP structure from AP exchange.

      Return value: Returns the AP-REP from the AP exchange, or NULL if not yet set or an error occured.

      shishi_ap_rep_set

      — Function: void shishi_ap_rep_set (Shishi_ap * ap, Shishi_asn1 aprep)

      ap: structure that holds information about AP exchange

      aprep: aprep to store in AP.

      Set the AP-REP in the AP exchange.

      shishi_ap_rep_der

      — Function: int shishi_ap_rep_der (Shishi_ap * ap, char ** out, size_t * outlen)

      ap: structure that holds information about AP exchange

      out: output array with newly allocated DER encoding of AP-REP.

      outlen: length of output array with DER encoding of AP-REP.

      Build AP-REP using shishi_ap_rep_build() and DER encode it. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_rep_der_set

      — Function: int shishi_ap_rep_der_set (Shishi_ap * ap, char * der, size_t derlen)

      ap: structure that holds information about AP exchange

      der: input array with DER encoded AP-REP.

      derlen: length of input array with DER encoded AP-REP.

      DER decode AP-REP and set it AP exchange. If decoding fails, the AP-REP in the AP exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_ap_rep_build

      — Function: int shishi_ap_rep_build (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Checksum data in authenticator and add ticket and authenticator to AP-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_rep_asn1

      — Function: int shishi_ap_rep_asn1 (Shishi_ap * ap, Shishi_asn1 * aprep)

      ap: structure that holds information about AP exchange

      aprep: output AP-REP variable.

      Build AP-REP using shishi_ap_rep_build() and return it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ap_rep_verify

      — Function: int shishi_ap_rep_verify (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Verify AP-REP compared to Authenticator.

      Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

      shishi_ap_rep_verify_der

      — Function: int shishi_ap_rep_verify_der (Shishi_ap * ap, char * der, size_t derlen)

      ap: structure that holds information about AP exchange

      der: input array with DER encoded AP-REP.

      derlen: length of input array with DER encoded AP-REP.

      DER decode AP-REP and set it in AP exchange using shishi_ap_rep_der_set() and verify it using shishi_ap_rep_verify().

      Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

      shishi_ap_rep_verify_asn1

      — Function: int shishi_ap_rep_verify_asn1 (Shishi_ap * ap, Shishi_asn1 aprep)

      ap: structure that holds information about AP exchange

      aprep: input AP-REP.

      Set the AP-REP in the AP exchange using shishi_ap_rep_set() and verify it using shishi_ap_rep_verify().

      Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

      shishi_ap_encapreppart

      — Function: Shishi_asn1 shishi_ap_encapreppart (Shishi_ap * ap)

      ap: structure that holds information about AP exchange

      Get ASN.1 EncAPRepPart structure from AP exchange.

      Return value: Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured.

      shishi_ap_encapreppart_set

      — Function: void shishi_ap_encapreppart_set (Shishi_ap * ap, Shishi_asn1 encapreppart)

      ap: structure that holds information about AP exchange

      encapreppart: EncAPRepPart to store in AP.

      Set the EncAPRepPart in the AP exchange.

      shishi_ap_option2string

      — Function: const char * shishi_ap_option2string (Shishi_apoptions option)

      option: enumerated AP-Option type, see Shishi_apoptions.

      Convert AP-Option type to AP-Option name string. Note that option must be just one of the AP-Option types, it cannot be an binary ORed indicating several AP-Options.

      Return value: Returns static string with name of AP-Option that must not be deallocated, or "unknown" if AP-Option was not understood.

      shishi_ap_string2option

      — Function: Shishi_apoptions shishi_ap_string2option (const char * str)

      str: zero terminated character array with name of AP-Option, e.g. "use-session-key".

      Convert AP-Option name to AP-Option type.

      Return value: Returns enumerated type member corresponding to AP-Option, or 0 if string was not understood.

      shishi_apreq

      — Function: Shishi_asn1 shishi_apreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new AP-REQ, populated with some default values.

      Return value: Returns the AP-REQ or NULL on failure.

      shishi_apreq_print

      — Function: int shishi_apreq_print (Shishi * handle, FILE * fh, Shishi_asn1 apreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      apreq: AP-REQ to print.

      Print ASCII armored DER encoding of AP-REQ to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_save

      — Function: int shishi_apreq_save (Shishi * handle, FILE * fh, Shishi_asn1 apreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      apreq: AP-REQ to save.

      Save DER encoding of AP-REQ to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_to_file

      — Function: int shishi_apreq_to_file (Shishi * handle, Shishi_asn1 apreq, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write AP-REQ to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_parse

      — Function: int shishi_apreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * apreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      apreq: output variable with newly allocated AP-REQ.

      Read ASCII armored DER encoded AP-REQ from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_read

      — Function: int shishi_apreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * apreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      apreq: output variable with newly allocated AP-REQ.

      Read DER encoded AP-REQ from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_from_file

      — Function: int shishi_apreq_from_file (Shishi * handle, Shishi_asn1 * apreq, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      apreq: output variable with newly allocated AP-REQ.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read AP-REQ from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_set_authenticator

      — Function: int shishi_apreq_set_authenticator (Shishi * handle, Shishi_asn1 apreq, int32_t etype, uint32_t kvno, const char * buf, size_t buflen)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ to add authenticator field to.

      etype: encryption type used to encrypt authenticator.

      kvno: version of the key used to encrypt authenticator.

      buf: input array with encrypted authenticator.

      buflen: size of input array with encrypted authenticator.

      Set the encrypted authenticator field in the AP-REP. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded authenticator. To save time, you may want to use shishi_apreq_add_authenticator() instead, which calculates the encrypted data and calls this function in one step.

      Return value: Returns SHISHI_OK on success.

      shishi_apreq_add_authenticator

      — Function: int shishi_apreq_add_authenticator (Shishi * handle, Shishi_asn1 apreq, Shishi_key * key, int keyusage, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ to add authenticator field to.

      key: key to to use for encryption.

      keyusage: cryptographic key usage value to use in encryption.

      authenticator: authenticator as allocated by shishi_authenticator().

      Encrypts DER encoded authenticator using key and store it in the AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_set_ticket

      — Function: int shishi_apreq_set_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 ticket)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ to add ticket field to.

      ticket: input ticket to copy into AP-REQ ticket field.

      Copy ticket into AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_options

      — Function: int shishi_apreq_options (Shishi * handle, Shishi_asn1 apreq, uint32_t * flags)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ to get options from.

      flags: Output integer containing options from AP-REQ.

      Extract the AP-Options from AP-REQ into output integer.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_use_session_key_p

      — Function: int shishi_apreq_use_session_key_p (Shishi * handle, Shishi_asn1 apreq)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ as allocated by shishi_apreq().

      Return non-0 iff the "Use session key" option is set in the AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_mutual_required_p

      — Function: int shishi_apreq_mutual_required_p (Shishi * handle, Shishi_asn1 apreq)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ as allocated by shishi_apreq().

      Return non-0 iff the "Mutual required" option is set in the AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_options_set

      — Function: int shishi_apreq_options_set (Shishi * handle, Shishi_asn1 apreq, uint32_t options)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ as allocated by shishi_apreq().

      options: Options to set in AP-REQ.

      Set the AP-Options in AP-REQ to indicate integer.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_options_add

      — Function: int shishi_apreq_options_add (Shishi * handle, Shishi_asn1 apreq, uint32_t option)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ as allocated by shishi_apreq().

      option: Options to add in AP-REQ.

      Add the AP-Options in AP-REQ. Options not set in input parameter option are preserved in the AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_options_remove

      — Function: int shishi_apreq_options_remove (Shishi * handle, Shishi_asn1 apreq, uint32_t option)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ as allocated by shishi_apreq().

      option: Options to remove from AP-REQ.

      Remove the AP-Options from AP-REQ. Options not set in input parameter option are preserved in the AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_get_authenticator_etype

      — Function: int shishi_apreq_get_authenticator_etype (Shishi * handle, Shishi_asn1 apreq, int32_t * etype)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ variable to get value from.

      etype: output variable that holds the value.

      Extract AP-REQ.authenticator.etype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_apreq_get_ticket

      — Function: int shishi_apreq_get_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 * ticket)

      handle: shishi handle as allocated by shishi_init().

      apreq: AP-REQ variable to get ticket from.

      ticket: output variable to hold extracted ticket.

      Extract ticket from AP-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep

      — Function: Shishi_asn1 shishi_aprep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new AP-REP, populated with some default values.

      Return value: Returns the authenticator or NULL on failure.

      shishi_aprep_print

      — Function: int shishi_aprep_print (Shishi * handle, FILE * fh, Shishi_asn1 aprep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      aprep: AP-REP to print.

      Print ASCII armored DER encoding of AP-REP to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_save

      — Function: int shishi_aprep_save (Shishi * handle, FILE * fh, Shishi_asn1 aprep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      aprep: AP-REP to save.

      Save DER encoding of AP-REP to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_to_file

      — Function: int shishi_aprep_to_file (Shishi * handle, Shishi_asn1 aprep, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      aprep: AP-REP to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write AP-REP to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_parse

      — Function: int shishi_aprep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * aprep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      aprep: output variable with newly allocated AP-REP.

      Read ASCII armored DER encoded AP-REP from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_read

      — Function: int shishi_aprep_read (Shishi * handle, FILE * fh, Shishi_asn1 * aprep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      aprep: output variable with newly allocated AP-REP.

      Read DER encoded AP-REP from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_from_file

      — Function: int shishi_aprep_from_file (Shishi * handle, Shishi_asn1 * aprep, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      aprep: output variable with newly allocated AP-REP.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read AP-REP from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aprep_get_enc_part_etype

      — Function: int shishi_aprep_get_enc_part_etype (Shishi * handle, Shishi_asn1 aprep, int32_t * etype)

      handle: shishi handle as allocated by shishi_init().

      aprep: AP-REP variable to get value from.

      etype: output variable that holds the value.

      Extract AP-REP.enc-part.etype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart

      — Function: Shishi_asn1 shishi_encapreppart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

      Return value: Returns the encapreppart or NULL on failure.

      shishi_encapreppart_print

      — Function: int shishi_encapreppart_print (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      encapreppart: EncAPRepPart to print.

      Print ASCII armored DER encoding of EncAPRepPart to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_save

      — Function: int shishi_encapreppart_save (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      encapreppart: EncAPRepPart to save.

      Save DER encoding of EncAPRepPart to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_to_file

      — Function: int shishi_encapreppart_to_file (Shishi * handle, Shishi_asn1 encapreppart, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_parse

      — Function: int shishi_encapreppart_parse (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      encapreppart: output variable with newly allocated EncAPRepPart.

      Read ASCII armored DER encoded EncAPRepPart from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_read

      — Function: int shishi_encapreppart_read (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      encapreppart: output variable with newly allocated EncAPRepPart.

      Read DER encoded EncAPRepPart from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_from_file

      — Function: int shishi_encapreppart_from_file (Shishi * handle, Shishi_asn1 * encapreppart, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: output variable with newly allocated EncAPRepPart.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read EncAPRepPart from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_get_key

      — Function: int shishi_encapreppart_get_key (Shishi * handle, Shishi_asn1 encapreppart, Shishi_key ** key)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: input EncAPRepPart variable.

      key: newly allocated key.

      Extract the subkey from the encrypted AP-REP part.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_ctime

      — Function: int shishi_encapreppart_ctime (Shishi * handle, Shishi_asn1 encapreppart, char ** t)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      t: newly allocated zero-terminated character array with client time.

      Extract client time from EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_ctime_set

      — Function: int shishi_encapreppart_ctime_set (Shishi * handle, Shishi_asn1 encapreppart, const char * t)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      t: string with generalized time value to store in EncAPRepPart.

      Store client time in EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_cusec_get

      — Function: int shishi_encapreppart_cusec_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * cusec)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      cusec: output integer with client microseconds field.

      Extract client microseconds field from EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_cusec_set

      — Function: int shishi_encapreppart_cusec_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t cusec)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      cusec: client microseconds to set in authenticator, 0-999999.

      Set the cusec field in the Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_seqnumber_get

      — Function: int shishi_encapreppart_seqnumber_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * seqnumber)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      seqnumber: output integer with sequence number field.

      Extract sequence number field from EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_seqnumber_remove

      — Function: int shishi_encapreppart_seqnumber_remove (Shishi * handle, Shishi_asn1 encapreppart)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: encapreppart as allocated by shishi_encapreppart().

      Remove sequence number field in EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_seqnumber_set

      — Function: int shishi_encapreppart_seqnumber_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t seqnumber)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: encapreppart as allocated by shishi_encapreppart().

      seqnumber: integer with sequence number field to store in encapreppart.

      Store sequence number field in EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encapreppart_time_copy

      — Function: int shishi_encapreppart_time_copy (Shishi * handle, Shishi_asn1 encapreppart, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      encapreppart: EncAPRepPart as allocated by shishi_encapreppart().

      authenticator: Authenticator to copy time fields from.

      Copy time fields from Authenticator into EncAPRepPart.

      Return value: Returns SHISHI_OK iff successful.

      5.5 SAFE and PRIV Functions

      The “KRB-SAFE” is an ASN.1 structure used by application client and servers to exchange integrity protected data. The integrity protection is keyed, usually with a key agreed on via the AP exchange (see AP-REQ and AP-REP Functions). The following illustrates the KRB-SAFE ASN.1 structure.

         KRB-SAFE        ::= [APPLICATION 20] SEQUENCE {
                 pvno            [0] INTEGER (5),
                 msg-type        [1] INTEGER (20),
                 safe-body       [2] KRB-SAFE-BODY,
                 cksum           [3] Checksum
         }
      
         KRB-SAFE-BODY   ::= SEQUENCE {
                 user-data       [0] OCTET STRING,
                 timestamp       [1] KerberosTime OPTIONAL,
                 usec            [2] Microseconds OPTIONAL,
                 seq-number      [3] UInt32 OPTIONAL,
                 s-address       [4] HostAddress,
                 r-address       [5] HostAddress OPTIONAL
         }
      

      shishi_safe

      — Function: int shishi_safe (Shishi * handle, Shishi_safe ** safe)

      handle: shishi handle as allocated by shishi_init().

      safe: pointer to new structure that holds information about SAFE exchange

      Create a new SAFE exchange.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_done

      — Function: void shishi_safe_done (Shishi_safe * safe)

      safe: structure that holds information about SAFE exchange

      Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle.

      shishi_safe_key

      — Function: Shishi_key * shishi_safe_key (Shishi_safe * safe)

      safe: structure that holds information about SAFE exchange

      Get key structured from SAFE exchange.

      Return value: Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured.

      shishi_safe_key_set

      — Function: void shishi_safe_key_set (Shishi_safe * safe, Shishi_key * key)

      safe: structure that holds information about SAFE exchange

      key: key to store in SAFE.

      Set the Key in the SAFE exchange.

      shishi_safe_safe

      — Function: Shishi_asn1 shishi_safe_safe (Shishi_safe * safe)

      safe: structure that holds information about SAFE exchange

      Get ASN.1 SAFE structured from SAFE exchange.

      Return value: Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured.

      shishi_safe_safe_set

      — Function: void shishi_safe_safe_set (Shishi_safe * safe, Shishi_asn1 asn1safe)

      safe: structure that holds information about SAFE exchange

      asn1safe: KRB-SAFE to store in SAFE exchange.

      Set the KRB-SAFE in the SAFE exchange.

      shishi_safe_safe_der

      — Function: int shishi_safe_safe_der (Shishi_safe * safe, char ** out, size_t * outlen)

      safe: safe as allocated by shishi_safe().

      out: output array with newly allocated DER encoding of SAFE.

      outlen: length of output array with DER encoding of SAFE.

      DER encode SAFE structure. Typically shishi_safe_build() is used to build the SAFE structure first. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_safe_der_set

      — Function: int shishi_safe_safe_der_set (Shishi_safe * safe, char * der, size_t derlen)

      safe: safe as allocated by shishi_safe().

      der: input array with DER encoded KRB-SAFE.

      derlen: length of input array with DER encoded KRB-SAFE.

      DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the KRB-SAFE in the SAFE exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_safe_print

      — Function: int shishi_safe_print (Shishi * handle, FILE * fh, Shishi_asn1 safe)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      safe: SAFE to print.

      Print ASCII armored DER encoding of SAFE to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_save

      — Function: int shishi_safe_save (Shishi * handle, FILE * fh, Shishi_asn1 safe)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      safe: SAFE to save.

      Save DER encoding of SAFE to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_to_file

      — Function: int shishi_safe_to_file (Shishi * handle, Shishi_asn1 safe, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      safe: SAFE to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write SAFE to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_parse

      — Function: int shishi_safe_parse (Shishi * handle, FILE * fh, Shishi_asn1 * safe)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      safe: output variable with newly allocated SAFE.

      Read ASCII armored DER encoded SAFE from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_read

      — Function: int shishi_safe_read (Shishi * handle, FILE * fh, Shishi_asn1 * safe)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      safe: output variable with newly allocated SAFE.

      Read DER encoded SAFE from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_from_file

      — Function: int shishi_safe_from_file (Shishi * handle, Shishi_asn1 * safe, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      safe: output variable with newly allocated SAFE.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read SAFE from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_cksum

      — Function: int shishi_safe_cksum (Shishi * handle, Shishi_asn1 safe, int32_t * cksumtype, char ** cksum, size_t * cksumlen)

      handle: shishi handle as allocated by shishi_init().

      safe: safe as allocated by shishi_safe().

      cksumtype: output checksum type.

      cksum: output array with newly allocated checksum data from SAFE.

      cksumlen: output size of output checksum data buffer.

      Read checksum value from KRB-SAFE. cksum is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_set_cksum

      — Function: int shishi_safe_set_cksum (Shishi * handle, Shishi_asn1 safe, int32_t cksumtype, const char * cksum, size_t cksumlen)

      handle: shishi handle as allocated by shishi_init().

      safe: safe as allocated by shishi_safe().

      cksumtype: input checksum type to store in SAFE.

      cksum: input checksum data to store in SAFE.

      cksumlen: size of input checksum data to store in SAFE.

      Store checksum value in SAFE. A checksum is usually created by calling shishi_checksum() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_safe_build() instead, which calculates the checksum and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_user_data

      — Function: int shishi_safe_user_data (Shishi * handle, Shishi_asn1 safe, char ** userdata, size_t * userdatalen)

      handle: shishi handle as allocated by shishi_init().

      safe: safe as allocated by shishi_safe().

      userdata: output array with newly allocated user data from KRB-SAFE.

      userdatalen: output size of output user data buffer.

      Read user data value from KRB-SAFE. userdata is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_set_user_data

      — Function: int shishi_safe_set_user_data (Shishi * handle, Shishi_asn1 safe, const char * userdata, size_t userdatalen)

      handle: shishi handle as allocated by shishi_init().

      safe: safe as allocated by shishi_safe().

      userdata: input user application to store in SAFE.

      userdatalen: size of input user application to store in SAFE.

      Set the application data in SAFE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_build

      — Function: int shishi_safe_build (Shishi_safe * safe, Shishi_key * key)

      safe: safe as allocated by shishi_safe().

      key: key for session, used to compute checksum.

      Build checksum and set it in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

      Return value: Returns SHISHI_OK iff successful.

      shishi_safe_verify

      — Function: int shishi_safe_verify (Shishi_safe * safe, Shishi_key * key)

      safe: safe as allocated by shishi_safe().

      key: key for session, used to verify checksum.

      Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

      Return value: Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed.

      The “KRB-PRIV” is an ASN.1 structure used by application client and servers to exchange confidential data. The confidentiality is keyed, usually with a key agreed on via the AP exchange (see AP-REQ and AP-REP Functions). The following illustrates the KRB-PRIV ASN.1 structure.

         KRB-PRIV        ::= [APPLICATION 21] SEQUENCE {
                 pvno            [0] INTEGER (5),
                 msg-type        [1] INTEGER (21),
                                 -- NOTE: there is no [2] tag
                 enc-part        [3] EncryptedData -- EncKrbPrivPart
         }
      
         EncKrbPrivPart  ::= [APPLICATION 28] SEQUENCE {
                 user-data       [0] OCTET STRING,
                 timestamp       [1] KerberosTime OPTIONAL,
                 usec            [2] Microseconds OPTIONAL,
                 seq-number      [3] UInt32 OPTIONAL,
                 s-address       [4] HostAddress -- sender's addr --,
                 r-address       [5] HostAddress OPTIONAL -- recip's addr
         }
      

      shishi_priv

      — Function: int shishi_priv (Shishi * handle, Shishi_priv ** priv)

      handle: shishi handle as allocated by shishi_init().

      priv: pointer to new structure that holds information about PRIV exchange

      Create a new PRIV exchange.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_done

      — Function: void shishi_priv_done (Shishi_priv * priv)

      priv: structure that holds information about PRIV exchange

      Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle.

      shishi_priv_key

      — Function: Shishi_key * shishi_priv_key (Shishi_priv * priv)

      priv: structure that holds information about PRIV exchange

      Get key from PRIV exchange.

      Return value: Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured.

      shishi_priv_key_set

      — Function: void shishi_priv_key_set (Shishi_priv * priv, Shishi_key * key)

      priv: structure that holds information about PRIV exchange

      key: key to store in PRIV.

      Set the Key in the PRIV exchange.

      shishi_priv_priv

      — Function: Shishi_asn1 shishi_priv_priv (Shishi_priv * priv)

      priv: structure that holds information about PRIV exchange

      Get ASN.1 PRIV structure in PRIV exchange.

      Return value: Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured.

      shishi_priv_priv_set

      — Function: void shishi_priv_priv_set (Shishi_priv * priv, Shishi_asn1 asn1priv)

      priv: structure that holds information about PRIV exchange

      asn1priv: KRB-PRIV to store in PRIV exchange.

      Set the KRB-PRIV in the PRIV exchange.

      shishi_priv_priv_der

      — Function: int shishi_priv_priv_der (Shishi_priv * priv, char ** out, size_t * outlen)

      priv: priv as allocated by shishi_priv().

      out: output array with newly allocated DER encoding of PRIV.

      outlen: length of output array with DER encoding of PRIV.

      DER encode PRIV structure. Typically shishi_priv_build() is used to build the PRIV structure first. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_priv_der_set

      — Function: int shishi_priv_priv_der_set (Shishi_priv * priv, char * der, size_t derlen)

      priv: priv as allocated by shishi_priv().

      der: input array with DER encoded KRB-PRIV.

      derlen: length of input array with DER encoded KRB-PRIV.

      DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the KRB-PRIV in the PRIV exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_priv_encprivpart

      — Function: Shishi_asn1 shishi_priv_encprivpart (Shishi_priv * priv)

      priv: structure that holds information about PRIV exchange

      Get ASN.1 EncPrivPart structure from PRIV exchange.

      Return value: Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured.

      shishi_priv_encprivpart_set

      — Function: void shishi_priv_encprivpart_set (Shishi_priv * priv, Shishi_asn1 asn1encprivpart)

      priv: structure that holds information about PRIV exchange

      asn1encprivpart: ENCPRIVPART to store in PRIV exchange.

      Set the ENCPRIVPART in the PRIV exchange.

      shishi_priv_encprivpart_der

      — Function: int shishi_priv_encprivpart_der (Shishi_priv * priv, char ** out, size_t * outlen)

      priv: priv as allocated by shishi_priv().

      out: output array with newly allocated DER encoding of ENCPRIVPART.

      outlen: length of output array with DER encoding of ENCPRIVPART.

      DER encode ENCPRIVPART structure. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_encprivpart_der_set

      — Function: int shishi_priv_encprivpart_der_set (Shishi_priv * priv, char * der, size_t derlen)

      priv: priv as allocated by shishi_priv().

      der: input array with DER encoded ENCPRIVPART.

      derlen: length of input array with DER encoded ENCPRIVPART.

      DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_priv_print

      — Function: int shishi_priv_print (Shishi * handle, FILE * fh, Shishi_asn1 priv)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      priv: PRIV to print.

      Print ASCII armored DER encoding of PRIV to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_save

      — Function: int shishi_priv_save (Shishi * handle, FILE * fh, Shishi_asn1 priv)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      priv: PRIV to save.

      Save DER encoding of PRIV to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_to_file

      — Function: int shishi_priv_to_file (Shishi * handle, Shishi_asn1 priv, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      priv: PRIV to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write PRIV to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_parse

      — Function: int shishi_priv_parse (Shishi * handle, FILE * fh, Shishi_asn1 * priv)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      priv: output variable with newly allocated PRIV.

      Read ASCII armored DER encoded PRIV from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_read

      — Function: int shishi_priv_read (Shishi * handle, FILE * fh, Shishi_asn1 * priv)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      priv: output variable with newly allocated PRIV.

      Read DER encoded PRIV from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_from_file

      — Function: int shishi_priv_from_file (Shishi * handle, Shishi_asn1 * priv, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      priv: output variable with newly allocated PRIV.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read PRIV from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_enc_part_etype

      — Function: int shishi_priv_enc_part_etype (Shishi * handle, Shishi_asn1 priv, int32_t * etype)

      handle: shishi handle as allocated by shishi_init().

      priv: PRIV variable to get value from.

      etype: output variable that holds the value.

      Extract PRIV.enc-part.etype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_set_enc_part

      — Function: int shishi_priv_set_enc_part (Shishi * handle, Shishi_asn1 priv, int32_t etype, const char * encpart, size_t encpartlen)

      handle: shishi handle as allocated by shishi_init().

      priv: priv as allocated by shishi_priv().

      etype: input encryption type to store in PRIV.

      encpart: input encrypted data to store in PRIV.

      encpartlen: size of input encrypted data to store in PRIV.

      Store encrypted data in PRIV. The encrypted data is usually created by calling shishi_encrypt() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_priv_build() instead, which encryptes the data and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encprivpart_user_data

      — Function: int shishi_encprivpart_user_data (Shishi * handle, Shishi_asn1 encprivpart, char ** userdata, size_t * userdatalen)

      handle: shishi handle as allocated by shishi_init().

      encprivpart: encprivpart as allocated by shishi_priv().

      userdata: output array with newly allocated user data from KRB-PRIV.

      userdatalen: output size of output user data buffer.

      Read user data value from KRB-PRIV. userdata is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encprivpart_set_user_data

      — Function: int shishi_encprivpart_set_user_data (Shishi * handle, Shishi_asn1 encprivpart, const char * userdata, size_t userdatalen)

      handle: shishi handle as allocated by shishi_init().

      encprivpart: encprivpart as allocated by shishi_priv().

      userdata: input user application to store in PRIV.

      userdatalen: size of input user application to store in PRIV.

      Set the application data in PRIV.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_build

      — Function: int shishi_priv_build (Shishi_priv * priv, Shishi_key * key)

      priv: priv as allocated by shishi_priv().

      key: key for session, used to encrypt data.

      Build checksum and set it in KRB-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

      Return value: Returns SHISHI_OK iff successful.

      shishi_priv_process

      — Function: int shishi_priv_process (Shishi_priv * priv, Shishi_key * key)

      priv: priv as allocated by shishi_priv().

      key: key to use to decrypt EncPrivPart.

      Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the PRIV exchange.

      Return value: Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed.

      5.6 Ticket Functions

      A Ticket is an ASN.1 structured that can be used to authenticate the holder to services. It contain an encrypted part, which the ticket holder cannot see, but can be encrypted by the service, and various information about the user and service, including an encryption key to use for the connection. See Ticket (ASN.1) Functions, for more details on the ASN.1 structure of a ticket.

      shishi_tkt

      — Function: int shishi_tkt (Shishi * handle, Shishi_tkt ** tkt)

      handle: shishi handle as allocated by shishi_init().

      tkt: output variable with newly allocated ticket.

      Create a new ticket handle.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt2

      — Function: Shishi_tkt * shishi_tkt2 (Shishi * handle, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep)

      handle: shishi handle as allocated by shishi_init().

      ticket: input variable with ticket.

      enckdcreppart: input variable with auxiliary ticket information.

      kdcrep: input variable with KDC-REP ticket information.

      Create a new ticket handle.

      Return value: Returns new ticket handle, or NULL on error.

      shishi_tkt_done

      — Function: void shishi_tkt_done (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Deallocate resources associated with ticket. The ticket must not be used again after this call.

      shishi_tkt_ticket

      — Function: Shishi_asn1 shishi_tkt_ticket (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Get ASN.1 Ticket structure from ticket.

      Return value: Returns actual ticket.

      shishi_tkt_ticket_set

      — Function: void shishi_tkt_ticket_set (Shishi_tkt * tkt, Shishi_asn1 ticket)

      tkt: input variable with ticket info.

      ticket: ASN.1 Ticket to store in ticket.

      Set the ASN.1 Ticket in the Ticket.

      shishi_tkt_enckdcreppart

      — Function: Shishi_asn1 shishi_tkt_enckdcreppart (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Get ASN.1 EncKDCRepPart structure from ticket.

      Return value: Returns auxiliary ticket information.

      shishi_tkt_enckdcreppart_set

      — Function: void shishi_tkt_enckdcreppart_set (Shishi_tkt * tkt, Shishi_asn1 enckdcreppart)

      tkt: structure that holds information about Ticket exchange

      enckdcreppart: EncKDCRepPart to store in Ticket.

      Set the EncKDCRepPart in the Ticket.

      shishi_tkt_kdcrep

      — Function: Shishi_asn1 shishi_tkt_kdcrep (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Get ASN.1 KDCRep structure from ticket.

      Return value: Returns KDC-REP information.

      shishi_tkt_encticketpart

      — Function: Shishi_asn1 shishi_tkt_encticketpart (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Get ASN.1 EncTicketPart structure from ticket.

      Return value: Returns EncTicketPart information.

      shishi_tkt_encticketpart_set

      — Function: void shishi_tkt_encticketpart_set (Shishi_tkt * tkt, Shishi_asn1 encticketpart)

      tkt: input variable with ticket info.

      encticketpart: encticketpart to store in ticket.

      Set the EncTicketPart in the Ticket.

      shishi_tkt_key

      — Function: Shishi_key * shishi_tkt_key (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again.

      Return value: Returns key extracted from EncKDCRepPart or EncTicketPart.

      shishi_tkt_key_set

      — Function: int shishi_tkt_key_set (Shishi_tkt * tkt, Shishi_key * key)

      tkt: input variable with ticket info.

      key: key to store in ticket.

      Set the key in the EncTicketPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_client

      — Function: int shishi_tkt_client (Shishi_tkt * tkt, char ** client, size_t * clientlen)

      tkt: input variable with ticket info.

      client: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Represent client principal name in Ticket KDC-REP as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_client_p

      — Function: int shishi_tkt_client_p (Shishi_tkt * tkt, const char * client)

      tkt: input variable with ticket info.

      client: client name of ticket.

      Determine if ticket is for specified client.

      Return value: Returns non-0 iff ticket is for specified client.

      shishi_tkt_clientrealm

      — Function: int shishi_tkt_clientrealm (Shishi_tkt * tkt, char ** client, size_t * clientlen)

      tkt: input variable with ticket info.

      client: pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_clientrealm_p

      — Function: int shishi_tkt_clientrealm_p (Shishi_tkt * tkt, const char * client)

      tkt: input variable with ticket info.

      client: principal name (client name and realm) of ticket.

      Determine if ticket is for specified client principal.

      Return value: Returns non-0 iff ticket is for specified client principal.

      shishi_tkt_realm

      — Function: int shishi_tkt_realm (Shishi_tkt * tkt, char ** realm, size_t * realmlen)

      tkt: input variable with ticket info.

      realm: pointer to newly allocated character array with realm name.

      realmlen: length of newly allocated character array with realm name.

      Extract realm of server in ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_server

      — Function: int shishi_tkt_server (Shishi_tkt * tkt, char ** server, size_t * serverlen)

      tkt: input variable with ticket info.

      server: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

      serverlen: pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

      Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_server_p

      — Function: int shishi_tkt_server_p (Shishi_tkt * tkt, const char * server)

      tkt: input variable with ticket info.

      server: server name of ticket.

      Determine if ticket is for specified server.

      Return value: Returns non-0 iff ticket is for specified server.

      shishi_tkt_flags

      — Function: int shishi_tkt_flags (Shishi_tkt * tkt, uint32_t * flags)

      tkt: input variable with ticket info.

      flags: pointer to output integer with flags.

      Extract flags in ticket (i.e., EncKDCRepPart).

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_flags_set

      — Function: int shishi_tkt_flags_set (Shishi_tkt * tkt, uint32_t flags)

      tkt: input variable with ticket info.

      flags: integer with flags to store in ticket.

      Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_flags_add

      — Function: int shishi_tkt_flags_add (Shishi_tkt * tkt, uint32_t flag)

      tkt: input variable with ticket info.

      flag: integer with flags to store in ticket.

      Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_forwardable_p

      — Function: int shishi_tkt_forwardable_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is forwardable.

      The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket.

      Return value: Returns non-0 iff forwardable flag is set in ticket.

      shishi_tkt_forwarded_p

      — Function: int shishi_tkt_forwarded_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is forwarded.

      The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets.

      Return value: Returns non-0 iff forwarded flag is set in ticket.

      shishi_tkt_proxiable_p

      — Function: int shishi_tkt_proxiable_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is proxiable.

      The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket.

      Return value: Returns non-0 iff proxiable flag is set in ticket.

      shishi_tkt_proxy_p

      — Function: int shishi_tkt_proxy_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is proxy ticket.

      The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail.

      Return value: Returns non-0 iff proxy flag is set in ticket.

      shishi_tkt_may_postdate_p

      — Function: int shishi_tkt_may_postdate_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket may be used to grant postdated tickets.

      The MAY-POSTDATE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. This flag MUST be set in a ticket-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket-granting ticket; postdated ticket-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime-starttime) of a postdated ticket will be the remaining life of the ticket-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime-starttime) of the ticket-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated.

      Return value: Returns non-0 iff may-postdate flag is set in ticket.

      shishi_tkt_postdated_p

      — Function: int shishi_tkt_postdated_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is postdated.

      The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use.

      Return value: Returns non-0 iff postdated flag is set in ticket.

      shishi_tkt_invalid_p

      — Function: int shishi_tkt_invalid_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is invalid.

      The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot-list mechanism).

      Return value: Returns non-0 iff invalid flag is set in ticket.

      shishi_tkt_renewable_p

      — Function: int shishi_tkt_renewable_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is renewable.

      The RENEWABLE flag in a ticket is normally only interpreted by the ticket-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets.

      Return value: Returns non-0 iff renewable flag is set in ticket.

      shishi_tkt_initial_p

      — Function: int shishi_tkt_initial_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket was issued using AS exchange.

      The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client.

      Return value: Returns non-0 iff initial flag is set in ticket.

      shishi_tkt_pre_authent_p

      — Function: int shishi_tkt_pre_authent_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket was pre-authenticated.

      The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

      Return value: Returns non-0 iff pre-authent flag is set in ticket.

      shishi_tkt_hw_authent_p

      — Function: int shishi_tkt_hw_authent_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is authenticated using a hardware token.

      The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

      Return value: Returns non-0 iff hw-authent flag is set in ticket.

      shishi_tkt_transited_policy_checked_p

      — Function: int shishi_tkt_transited_policy_checked_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket has been policy checked for transit.

      The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list.

      While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross-realm authentication. When the KDC applies such checks and accepts such cross-realm authentication it will set the TRANSITED-POLICY-CHECKED flag in the service tickets it issues based on the cross-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required to honor this flag.

      Application servers MUST either do the transited-realm checks themselves, or reject cross-realm tickets without TRANSITED-POLICY- CHECKED set.

      Return value: Returns non-0 iff transited-policy-checked flag is set in ticket.

      shishi_tkt_ok_as_delegate_p

      — Function: int shishi_tkt_ok_as_delegate_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is ok as delegated ticket.

      The copy of the ticket flags in the encrypted part of the KDC reply may have the OK-AS-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials.

      Return value: Returns non-0 iff ok-as-delegate flag is set in ticket.

      shishi_tkt_keytype

      — Function: int shishi_tkt_keytype (Shishi_tkt * tkt, int32_t * etype)

      tkt: input variable with ticket info.

      etype: pointer to encryption type that is set, see Shishi_etype.

      Extract encryption type of key in ticket (really EncKDCRepPart).

      Return value: Returns SHISHI_OK iff successful.

      shishi_tkt_keytype_fast

      — Function: int32_t shishi_tkt_keytype_fast (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Extract encryption type of key in ticket (really EncKDCRepPart).

      Return value: Returns encryption type of session key in ticket (really EncKDCRepPart), or -1 on error.

      shishi_tkt_keytype_p

      — Function: int shishi_tkt_keytype_p (Shishi_tkt * tkt, int32_t etype)

      tkt: input variable with ticket info.

      etype: encryption type, see Shishi_etype.

      Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type).

      Return value: Returns non-0 iff key in ticket is of specified encryption type.

      shishi_tkt_lastreqc

      — Function: time_t shishi_tkt_lastreqc (Shishi_tkt * tkt, Shishi_lrtype lrtype)

      tkt: input variable with ticket info.

      lrtype: lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST.

      Extract C time corresponding to given lastreq type field in the ticket.

      Return value: Returns C time interpretation of the specified lastreq field, or (time_t) -1.

      shishi_tkt_authctime

      — Function: time_t shishi_tkt_authctime (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket.

      Return value: Returns C time interpretation of the endtime in ticket.

      shishi_tkt_startctime

      — Function: time_t shishi_tkt_startctime (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past).

      Return value: Returns C time interpretation of the endtime in ticket.

      shishi_tkt_endctime

      — Function: time_t shishi_tkt_endctime (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid.

      Return value: Returns C time interpretation of the endtime in ticket.

      shishi_tkt_renew_tillc

      — Function: time_t shishi_tkt_renew_tillc (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Extract C time corresponding to the renew-till field. The field holds the time where the ticket stop being valid for renewal.

      Return value: Returns C time interpretation of the renew-till in ticket.

      shishi_tkt_valid_at_time_p

      — Function: int shishi_tkt_valid_at_time_p (Shishi_tkt * tkt, time_t now)

      tkt: input variable with ticket info.

      now: time to check for.

      Determine if ticket is valid at a specific point in time.

      Return value: Returns non-0 iff ticket is valid (not expired and after starttime) at specified time.

      shishi_tkt_valid_now_p

      — Function: int shishi_tkt_valid_now_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket is valid now.

      Return value: Returns 0 iff ticket is invalid (expired or not yet valid).

      shishi_tkt_expired_p

      — Function: int shishi_tkt_expired_p (Shishi_tkt * tkt)

      tkt: input variable with ticket info.

      Determine if ticket has expired (i.e., endtime is in the past).

      Return value: Returns 0 iff ticket has expired.

      shishi_tkt_lastreq_pretty_print

      — Function: void shishi_tkt_lastreq_pretty_print (Shishi_tkt * tkt, FILE * fh)

      tkt: input variable with ticket info.

      fh: file handle open for writing.

      Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart).

      shishi_tkt_pretty_print

      — Function: void shishi_tkt_pretty_print (Shishi_tkt * tkt, FILE * fh)

      tkt: input variable with ticket info.

      fh: file handle open for writing.

      Print a human readable representation of a ticket to file handle.

      5.7 AS Functions

      The Authentication Service (AS) is used to get an initial ticket using e.g. your password. The following illustrates the AS-REQ and AS-REP ASN.1 structures.

      -- Request --
      
      AS-REQ		::= KDC-REQ {10}
      
      KDC-REQ {INTEGER:tagnum}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[1] INTEGER (5) -- first tag is [1], not [0] --,
      	msg-type	[2] INTEGER (tagnum),
      	padata		[3] SEQUENCE OF PA-DATA OPTIONAL,
      	req-body	[4] KDC-REQ-BODY
      }
      
      KDC-REQ-BODY	::= SEQUENCE {
      	kdc-options		[0] KDCOptions,
      	cname			[1] PrincipalName OPTIONAL
      				    -- Used only in AS-REQ --,
      	realm			[2] Realm
      				    -- Server's realm
      				    -- Also client's in AS-REQ --,
      	sname			[3] PrincipalName OPTIONAL,
      	from			[4] KerberosTime OPTIONAL,
      	till			[5] KerberosTime,
      	rtime			[6] KerberosTime OPTIONAL,
      	nonce			[7] UInt32,
      	etype			[8] SEQUENCE OF Int32 -- EncryptionType
      				    -- in preference order --,
      	addresses		[9] HostAddresses OPTIONAL,
      	enc-authorization-data	[10] EncryptedData {
      					AuthorizationData,
      					{ keyuse-TGSReqAuthData-sesskey
      					  | keyuse-TGSReqAuthData-subkey }
      				     } OPTIONAL,
      	additional-tickets	[11] SEQUENCE OF Ticket OPTIONAL
      }
      
      -- Reply --
      
      AS-REP		::= KDC-REP {11, EncASRepPart, {keyuse-EncASRepPart}}
      
      KDC-REP {INTEGER:tagnum,
      	 TypeToEncrypt,
      	 UInt32:KeyUsages}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[0] INTEGER (5),
      	msg-type	[1] INTEGER (tagnum),
      	padata		[2] SEQUENCE OF PA-DATA OPTIONAL,
      	crealm		[3] Realm,
      	cname		[4] PrincipalName,
      	ticket		[5] Ticket,
      	enc-part	[6] EncryptedData {TypeToEncrypt, KeyUsages}
      }
      
      EncASRepPart	::= [APPLICATION 25] EncKDCRepPart
      
      EncKDCRepPart	::= SEQUENCE {
      	key		[0] EncryptionKey,
      	last-req	[1] LastReq,
      	nonce		[2] UInt32,
      	key-expiration	[3] KerberosTime OPTIONAL,
      	flags		[4] TicketFlags,
      	authtime	[5] KerberosTime,
      	starttime	[6] KerberosTime OPTIONAL,
      	endtime		[7] KerberosTime,
      	renew-till	[8] KerberosTime OPTIONAL,
      	srealm		[9] Realm,
      	sname		[10] PrincipalName,
      	caddr		[11] HostAddresses OPTIONAL
      }
      

      shishi_as

      — Function: int shishi_as (Shishi * handle, Shishi_as ** as)

      handle: shishi handle as allocated by shishi_init().

      as: holds pointer to newly allocate Shishi_as structure.

      Allocate a new AS exchange variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_done

      — Function: void shishi_as_done (Shishi_as * as)

      as: structure that holds information about AS exchange

      Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle.

      shishi_as_req

      — Function: Shishi_asn1 shishi_as_req (Shishi_as * as)

      as: structure that holds information about AS exchange

      Get ASN.1 AS-REQ structure from AS exchange.

      Return value: Returns the generated AS-REQ packet from the AS exchange, or NULL if not yet set or an error occured.

      shishi_as_req_build

      — Function: int shishi_as_req_build (Shishi_as * as)

      as: structure that holds information about AS exchange

      Possibly remove unset fields (e.g., rtime).

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_req_set

      — Function: void shishi_as_req_set (Shishi_as * as, Shishi_asn1 asreq)

      as: structure that holds information about AS exchange

      asreq: asreq to store in AS.

      Set the AS-REQ in the AS exchange.

      shishi_as_req_der

      — Function: int shishi_as_req_der (Shishi_as * as, char ** out, size_t * outlen)

      as: structure that holds information about AS exchange

      out: output array with newly allocated DER encoding of AS-REQ.

      outlen: length of output array with DER encoding of AS-REQ.

      DER encode AS-REQ. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_req_der_set

      — Function: int shishi_as_req_der_set (Shishi_as * as, char * der, size_t derlen)

      as: structure that holds information about AS exchange

      der: input array with DER encoded AP-REQ.

      derlen: length of input array with DER encoded AP-REQ.

      DER decode AS-REQ and set it AS exchange. If decoding fails, the AS-REQ in the AS exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_as_rep

      — Function: Shishi_asn1 shishi_as_rep (Shishi_as * as)

      as: structure that holds information about AS exchange

      Get ASN.1 AS-REP structure from AS exchange.

      Return value: Returns the received AS-REP packet from the AS exchange, or NULL if not yet set or an error occured.

      shishi_as_rep_process

      — Function: int shishi_as_rep_process (Shishi_as * as, Shishi_key * key, const char * password)

      as: structure that holds information about AS exchange

      key: user's key, used to encrypt the encrypted part of the AS-REP.

      password: user's password, used if key is NULL.

      Process new AS-REP and set ticket. The key is used to decrypt the AP-REP. If both key and password is NULL, the user is queried for it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_rep_build

      — Function: int shishi_as_rep_build (Shishi_as * as, Shishi_key * key)

      as: structure that holds information about AS exchange

      key: user's key, used to encrypt the encrypted part of the AS-REP.

      Build AS-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_rep_der

      — Function: int shishi_as_rep_der (Shishi_as * as, char ** out, size_t * outlen)

      as: structure that holds information about AS exchange

      out: output array with newly allocated DER encoding of AS-REP.

      outlen: length of output array with DER encoding of AS-REP.

      DER encode AS-REP. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_rep_set

      — Function: void shishi_as_rep_set (Shishi_as * as, Shishi_asn1 asrep)

      as: structure that holds information about AS exchange

      asrep: asrep to store in AS.

      Set the AS-REP in the AS exchange.

      shishi_as_rep_der_set

      — Function: int shishi_as_rep_der_set (Shishi_as * as, char * der, size_t derlen)

      as: structure that holds information about AS exchange

      der: input array with DER encoded AP-REP.

      derlen: length of input array with DER encoded AP-REP.

      DER decode AS-REP and set it AS exchange. If decoding fails, the AS-REP in the AS exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_as_krberror

      — Function: Shishi_asn1 shishi_as_krberror (Shishi_as * as)

      as: structure that holds information about AS exchange

      Get ASN.1 KRB-ERROR structure from AS exchange.

      Return value: Returns the received KRB-ERROR packet from the AS exchange, or NULL if not yet set or an error occured.

      shishi_as_krberror_der

      — Function: int shishi_as_krberror_der (Shishi_as * as, char ** out, size_t * outlen)

      as: structure that holds information about AS exchange

      out: output array with newly allocated DER encoding of KRB-ERROR.

      outlen: length of output array with DER encoding of KRB-ERROR.

      DER encode KRB-ERROR. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_krberror_set

      — Function: void shishi_as_krberror_set (Shishi_as * as, Shishi_asn1 krberror)

      as: structure that holds information about AS exchange

      krberror: krberror to store in AS.

      Set the KRB-ERROR in the AS exchange.

      shishi_as_tkt

      — Function: Shishi_tkt * shishi_as_tkt (Shishi_as * as)

      as: structure that holds information about AS exchange

      Get Ticket in AS exchange.

      Return value: Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured.

      shishi_as_tkt_set

      — Function: void shishi_as_tkt_set (Shishi_as * as, Shishi_tkt * tkt)

      as: structure that holds information about AS exchange

      tkt: tkt to store in AS.

      Set the Tkt in the AS exchange.

      shishi_as_sendrecv_hint

      — Function: int shishi_as_sendrecv_hint (Shishi_as * as, Shishi_tkts_hint * hint)

      as: structure that holds information about AS exchange

      hint: additional parameters that modify connection behaviour, or NULL.

      Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The hint structure can be used to set, e.g., parameters for TLS authentication.

      Return value: Returns SHISHI_OK iff successful.

      shishi_as_sendrecv

      — Function: int shishi_as_sendrecv (Shishi_as * as)

      as: structure that holds information about AS exchange

      Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket.

      Return value: Returns SHISHI_OK iff successful.

      5.8 TGS Functions

      The Ticket Granting Service (TGS) is used to get subsequent tickets, authenticated by other tickets (so called ticket granting tickets). The following illustrates the TGS-REQ and TGS-REP ASN.1 structures.

      -- Request --
      
      TGS-REQ		::= KDC-REQ {12}
      
      KDC-REQ {INTEGER:tagnum}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[1] INTEGER (5) -- first tag is [1], not [0] --,
      	msg-type	[2] INTEGER (tagnum),
      	padata		[3] SEQUENCE OF PA-DATA OPTIONAL,
      	req-body	[4] KDC-REQ-BODY
      }
      
      KDC-REQ-BODY	::= SEQUENCE {
      	kdc-options		[0] KDCOptions,
      	cname			[1] PrincipalName OPTIONAL
      				    -- Used only in AS-REQ --,
      	realm			[2] Realm
      				    -- Server's realm
      				    -- Also client's in AS-REQ --,
      	sname			[3] PrincipalName OPTIONAL,
      	from			[4] KerberosTime OPTIONAL,
      	till			[5] KerberosTime,
      	rtime			[6] KerberosTime OPTIONAL,
      	nonce			[7] UInt32,
      	etype			[8] SEQUENCE OF Int32 -- EncryptionType
      				    -- in preference order --,
      	addresses		[9] HostAddresses OPTIONAL,
      	enc-authorization-data	[10] EncryptedData {
      					AuthorizationData,
      					{ keyuse-TGSReqAuthData-sesskey
      					  | keyuse-TGSReqAuthData-subkey }
      				     } OPTIONAL,
      	additional-tickets	[11] SEQUENCE OF Ticket OPTIONAL
      }
      
      -- Reply --
      
      TGS-REP		::= KDC-REP {13, EncTGSRepPart,
      			{ keyuse-EncTGSRepPart-sesskey
      			  | keyuse-EncTGSRepPart-subkey }}
      
      KDC-REP {INTEGER:tagnum,
      	 TypeToEncrypt,
      	 UInt32:KeyUsages}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[0] INTEGER (5),
      	msg-type	[1] INTEGER (tagnum),
      	padata		[2] SEQUENCE OF PA-DATA OPTIONAL,
      	crealm		[3] Realm,
      	cname		[4] PrincipalName,
      	ticket		[5] Ticket,
      	enc-part	[6] EncryptedData {TypeToEncrypt, KeyUsages}
      }
      
      EncTGSRepPart	::= [APPLICATION 26] EncKDCRepPart
      
      EncKDCRepPart	::= SEQUENCE {
      	key		[0] EncryptionKey,
      	last-req	[1] LastReq,
      	nonce		[2] UInt32,
      	key-expiration	[3] KerberosTime OPTIONAL,
      	flags		[4] TicketFlags,
      	authtime	[5] KerberosTime,
      	starttime	[6] KerberosTime OPTIONAL,
      	endtime		[7] KerberosTime,
      	renew-till	[8] KerberosTime OPTIONAL,
      	srealm		[9] Realm,
      	sname		[10] PrincipalName,
      	caddr		[11] HostAddresses OPTIONAL
      }
      

      shishi_tgs

      — Function: int shishi_tgs (Shishi * handle, Shishi_tgs ** tgs)

      handle: shishi handle as allocated by shishi_init().

      tgs: holds pointer to newly allocate Shishi_tgs structure.

      Allocate a new TGS exchange variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_done

      — Function: void shishi_tgs_done (Shishi_tgs * tgs)

      tgs: structure that holds information about AS exchange

      Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle.

      shishi_tgs_tgtkt

      — Function: Shishi_tkt * shishi_tgs_tgtkt (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get Ticket-granting-ticket from TGS exchange.

      Return value: Returns the ticket-granting-ticket used in the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_tgtkt_set

      — Function: void shishi_tgs_tgtkt_set (Shishi_tgs * tgs, Shishi_tkt * tgtkt)

      tgs: structure that holds information about TGS exchange

      tgtkt: ticket granting ticket to store in TGS.

      Set the Ticket in the TGS exchange.

      shishi_tgs_ap

      — Function: Shishi_ap * shishi_tgs_ap (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get the AP from TGS exchange.

      Return value: Returns the AP exchange (part of TGS-REQ) from the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_req

      — Function: Shishi_asn1 shishi_tgs_req (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get the TGS-REQ from TGS exchange.

      Return value: Returns the generated TGS-REQ from the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_req_set

      — Function: void shishi_tgs_req_set (Shishi_tgs * tgs, Shishi_asn1 tgsreq)

      tgs: structure that holds information about TGS exchange

      tgsreq: tgsreq to store in TGS.

      Set the TGS-REQ in the TGS exchange.

      shishi_tgs_req_der

      — Function: int shishi_tgs_req_der (Shishi_tgs * tgs, char ** out, size_t * outlen)

      tgs: structure that holds information about TGS exchange

      out: output array with newly allocated DER encoding of TGS-REQ.

      outlen: length of output array with DER encoding of TGS-REQ.

      DER encode TGS-REQ. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_req_der_set

      — Function: int shishi_tgs_req_der_set (Shishi_tgs * tgs, char * der, size_t derlen)

      tgs: structure that holds information about TGS exchange

      der: input array with DER encoded AP-REQ.

      derlen: length of input array with DER encoded AP-REQ.

      DER decode TGS-REQ and set it TGS exchange. If decoding fails, the TGS-REQ in the TGS exchange remains.

      Return value: Returns SHISHI_OK.

      shishi_tgs_req_process

      — Function: int shishi_tgs_req_process (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ is taken from the EncKDCReqPart of the TGS tgticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_req_build

      — Function: int shishi_tgs_req_build (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Checksum data in authenticator and add ticket and authenticator to TGS-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_rep

      — Function: Shishi_asn1 shishi_tgs_rep (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get TGS-REP from TGS exchange.

      Return value: Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_rep_der

      — Function: int shishi_tgs_rep_der (Shishi_tgs * tgs, char ** out, size_t * outlen)

      tgs: structure that holds information about TGS exchange

      out: output array with newly allocated DER encoding of TGS-REP.

      outlen: length of output array with DER encoding of TGS-REP.

      DER encode TGS-REP. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_rep_process

      — Function: int shishi_tgs_rep_process (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Process new TGS-REP and set ticket. The key to decrypt the TGS-REP is taken from the EncKDCRepPart of the TGS tgticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_rep_build

      — Function: int shishi_tgs_rep_build (Shishi_tgs * tgs, int keyusage, Shishi_key * key)

      tgs: structure that holds information about TGS exchange

      keyusage: keyusage integer.

      key: user's key, used to encrypt the encrypted part of the TGS-REP.

      Build TGS-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_krberror

      — Function: Shishi_asn1 shishi_tgs_krberror (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get KRB-ERROR from TGS exchange.

      Return value: Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_krberror_der

      — Function: int shishi_tgs_krberror_der (Shishi_tgs * tgs, char ** out, size_t * outlen)

      tgs: structure that holds information about TGS exchange

      out: output array with newly allocated DER encoding of KRB-ERROR.

      outlen: length of output array with DER encoding of KRB-ERROR.

      DER encode KRB-ERROR. out is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_krberror_set

      — Function: void shishi_tgs_krberror_set (Shishi_tgs * tgs, Shishi_asn1 krberror)

      tgs: structure that holds information about TGS exchange

      krberror: krberror to store in TGS.

      Set the KRB-ERROR in the TGS exchange.

      shishi_tgs_tkt

      — Function: Shishi_tkt * shishi_tgs_tkt (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Get Ticket from TGS exchange.

      Return value: Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured.

      shishi_tgs_tkt_set

      — Function: void shishi_tgs_tkt_set (Shishi_tgs * tgs, Shishi_tkt * tkt)

      tgs: structure that holds information about TGS exchange

      tkt: ticket to store in TGS.

      Set the Ticket in the TGS exchange.

      shishi_tgs_sendrecv_hint

      — Function: int shishi_tgs_sendrecv_hint (Shishi_tgs * tgs, Shishi_tkts_hint * hint)

      tgs: structure that holds information about TGS exchange

      hint: additional parameters that modify connection behaviour, or NULL.

      Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The hint structure can be used to set, e.g., parameters for TLS authentication.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_sendrecv

      — Function: int shishi_tgs_sendrecv (Shishi_tgs * tgs)

      tgs: structure that holds information about TGS exchange

      Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_set_server

      — Function: int shishi_tgs_set_server (Shishi_tgs * tgs, const char * server)

      tgs: structure that holds information about TGS exchange

      server: indicates the server to acquire ticket for.

      Set the server in the TGS-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_set_realm

      — Function: int shishi_tgs_set_realm (Shishi_tgs * tgs, const char * realm)

      tgs: structure that holds information about TGS exchange

      realm: indicates the realm to acquire ticket for.

      Set the server in the TGS-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_tgs_set_realmserver

      — Function: int shishi_tgs_set_realmserver (Shishi_tgs * tgs, const char * realm, const char * server)

      tgs: structure that holds information about TGS exchange

      realm: indicates the realm to acquire ticket for.

      server: indicates the server to acquire ticket for.

      Set the realm and server in the TGS-REQ.

      Return value: Returns SHISHI_OK iff successful.

      5.9 Ticket (ASN.1) Functions

      See Ticket Functions, for an high-level overview of tickets. The following illustrates the Ticket and EncTicketPart ASN.1 structures.

      Ticket          ::= [APPLICATION 1] SEQUENCE {
              tkt-vno         [0] INTEGER (5),
              realm           [1] Realm,
              sname           [2] PrincipalName,
              enc-part        [3] EncryptedData -- EncTicketPart
      }
      
      -- Encrypted part of ticket
      EncTicketPart   ::= [APPLICATION 3] SEQUENCE {
              flags                   [0] TicketFlags,
              key                     [1] EncryptionKey,
              crealm                  [2] Realm,
              cname                   [3] PrincipalName,
              transited               [4] TransitedEncoding,
              authtime                [5] KerberosTime,
              starttime               [6] KerberosTime OPTIONAL,
              endtime                 [7] KerberosTime,
              renew-till              [8] KerberosTime OPTIONAL,
              caddr                   [9] HostAddresses OPTIONAL,
              authorization-data      [10] AuthorizationData OPTIONAL
      }
      

      shishi_ticket

      — Function: Shishi_asn1 shishi_ticket (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new ASN.1 Ticket, populated with some default values.

      Return value: Returns the ticket or NULL on failure.

      shishi_ticket_realm_get

      — Function: int shishi_ticket_realm_get (Shishi * handle, Shishi_asn1 ticket, char ** realm, size_t * realmlen)

      handle: shishi handle as allocated by shishi_init().

      ticket: input variable with ticket info.

      realm: output array with newly allocated name of realm in ticket.

      realmlen: size of output array.

      Extract realm from ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_realm_set

      — Function: int shishi_ticket_realm_set (Shishi * handle, Shishi_asn1 ticket, const char * realm)

      handle: shishi handle as allocated by shishi_init().

      ticket: input variable with ticket info.

      realm: input array with name of realm.

      Set the realm field in the Ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_server

      — Function: int shishi_ticket_server (Shishi * handle, Shishi_asn1 ticket, char ** server, size_t * serverlen)

      handle: Shishi library handle create by shishi_init().

      ticket: ASN.1 Ticket variable to get server name from.

      server: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

      serverlen: pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

      Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_sname_set

      — Function: int shishi_ticket_sname_set (Shishi * handle, Shishi_asn1 ticket, Shishi_name_type name_type, char * [] sname)

      handle: shishi handle as allocated by shishi_init().

      ticket: Ticket variable to set server name field in.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      sname: input array with principal name.

      Set the server name field in the Ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_get_enc_part_etype

      — Function: int shishi_ticket_get_enc_part_etype (Shishi * handle, Shishi_asn1 ticket, int32_t * etype)

      handle: shishi handle as allocated by shishi_init().

      ticket: Ticket variable to get value from.

      etype: output variable that holds the value.

      Extract Ticket.enc-part.etype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_set_enc_part

      — Function: int shishi_ticket_set_enc_part (Shishi * handle, Shishi_asn1 ticket, int32_t etype, uint32_t kvno, const char * buf, size_t buflen)

      handle: shishi handle as allocated by shishi_init().

      ticket: Ticket to add enc-part field to.

      etype: encryption type used to encrypt enc-part.

      kvno: key version number.

      buf: input array with encrypted enc-part.

      buflen: size of input array with encrypted enc-part.

      Set the encrypted enc-part field in the Ticket. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded enc-part. To save time, you may want to use shishi_ticket_add_enc_part() instead, which calculates the encrypted data and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ticket_add_enc_part

      — Function: int shishi_ticket_add_enc_part (Shishi * handle, Shishi_asn1 ticket, Shishi_key * key, Shishi_asn1 encticketpart)

      handle: shishi handle as allocated by shishi_init().

      ticket: Ticket to add enc-part field to.

      key: key used to encrypt enc-part.

      encticketpart: EncTicketPart to add.

      Encrypts DER encoded EncTicketPart using key and stores it in the Ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_get_key

      — Function: int shishi_encticketpart_get_key (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key ** key)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      key: newly allocated key.

      Extract the session key in the Ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_key_set

      — Function: int shishi_encticketpart_key_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key * key)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      key: key handle with information to store in encticketpart.

      Set the EncTicketPart.key field to key type and value of supplied key.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_flags_set

      — Function: int shishi_encticketpart_flags_set (Shishi * handle, Shishi_asn1 encticketpart, int flags)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      flags: flags to set in encticketpart.

      Set the EncTicketPart.flags to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_crealm_set

      — Function: int shishi_encticketpart_crealm_set (Shishi * handle, Shishi_asn1 encticketpart, const char * realm)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      realm: input array with name of realm.

      Set the realm field in the KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_cname_set

      — Function: int shishi_encticketpart_cname_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_name_type name_type, const char * principal)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      principal: input array with principal name.

      Set the client name field in the EncTicketPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_transited_set

      — Function: int shishi_encticketpart_transited_set (Shishi * handle, Shishi_asn1 encticketpart, int32_t trtype, const char * trdata, size_t trdatalen)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      trtype: transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS.

      trdata: actual transited realm data.

      trdatalen: length of actual transited realm data.

      Set the EncTicketPart.transited field to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_authtime_set

      — Function: int shishi_encticketpart_authtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char * authtime)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      authtime: character buffer containing a generalized time string.

      Set the EncTicketPart.authtime to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_endtime_set

      — Function: int shishi_encticketpart_endtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char * endtime)

      handle: shishi handle as allocated by shishi_init().

      encticketpart: input EncTicketPart variable.

      endtime: character buffer containing a generalized time string.

      Set the EncTicketPart.endtime to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_client

      — Function: int shishi_encticketpart_client (Shishi * handle, Shishi_asn1 encticketpart, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      encticketpart: EncTicketPart variable to get client name from.

      client: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Represent client principal name in EncTicketPart as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encticketpart_clientrealm

      — Function: int shishi_encticketpart_clientrealm (Shishi * handle, Shishi_asn1 encticketpart, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      encticketpart: EncTicketPart variable to get client name and realm from.

      client: pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Convert cname and realm fields from EncTicketPart to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      5.10 AS/TGS Functions

      The Authentication Service (AS) is used to get an initial ticket using e.g. your password. The Ticket Granting Service (TGS) is used to get subsequent tickets using other tickets. Protocol wise the procedures are very similar, which is the reason they are described together. The following illustrates the AS-REQ, TGS-REQ and AS-REP, TGS-REP ASN.1 structures. Most of the functions use the mnemonic “KDC” instead of either AS or TGS, which means the function operates on both AS and TGS types. Only where the distinction between AS and TGS is important are the AS and TGS names used. Remember, these are low-level functions, and normal applications will likely be satisfied with the AS (see AS Functions) and TGS (see TGS Functions) interfaces, or the even more high-level Ticket Set (see Ticket Set Functions) interface.

      -- Request --
      
      AS-REQ		::= KDC-REQ {10}
      TGS-REQ		::= KDC-REQ {12}
      
      KDC-REQ {INTEGER:tagnum}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[1] INTEGER (5) -- first tag is [1], not [0] --,
      	msg-type	[2] INTEGER (tagnum),
      	padata		[3] SEQUENCE OF PA-DATA OPTIONAL,
      	req-body	[4] KDC-REQ-BODY
      }
      
      KDC-REQ-BODY	::= SEQUENCE {
      	kdc-options		[0] KDCOptions,
      	cname			[1] PrincipalName OPTIONAL
      				    -- Used only in AS-REQ --,
      	realm			[2] Realm
      				    -- Server's realm
      				    -- Also client's in AS-REQ --,
      	sname			[3] PrincipalName OPTIONAL,
      	from			[4] KerberosTime OPTIONAL,
      	till			[5] KerberosTime,
      	rtime			[6] KerberosTime OPTIONAL,
      	nonce			[7] UInt32,
      	etype			[8] SEQUENCE OF Int32 -- EncryptionType
      				    -- in preference order --,
      	addresses		[9] HostAddresses OPTIONAL,
      	enc-authorization-data	[10] EncryptedData {
      					AuthorizationData,
      					{ keyuse-TGSReqAuthData-sesskey
      					  | keyuse-TGSReqAuthData-subkey }
      				     } OPTIONAL,
      	additional-tickets	[11] SEQUENCE OF Ticket OPTIONAL
      }
      
      -- Reply --
      
      AS-REP		::= KDC-REP {11, EncASRepPart, {keyuse-EncASRepPart}}
      TGS-REP		::= KDC-REP {13, EncTGSRepPart,
      			{ keyuse-EncTGSRepPart-sesskey
      			  | keyuse-EncTGSRepPart-subkey }}
      
      KDC-REP {INTEGER:tagnum,
      	 TypeToEncrypt,
      	 UInt32:KeyUsages}	::= [APPLICATION tagnum] SEQUENCE {
      	pvno		[0] INTEGER (5),
      	msg-type	[1] INTEGER (tagnum),
      	padata		[2] SEQUENCE OF PA-DATA OPTIONAL,
      	crealm		[3] Realm,
      	cname		[4] PrincipalName,
      	ticket		[5] Ticket,
      	enc-part	[6] EncryptedData {TypeToEncrypt, KeyUsages}
      }
      
      EncASRepPart	::= [APPLICATION 25] EncKDCRepPart
      EncTGSRepPart	::= [APPLICATION 26] EncKDCRepPart
      
      EncKDCRepPart	::= SEQUENCE {
      	key		[0] EncryptionKey,
      	last-req	[1] LastReq,
      	nonce		[2] UInt32,
      	key-expiration	[3] KerberosTime OPTIONAL,
      	flags		[4] TicketFlags,
      	authtime	[5] KerberosTime,
      	starttime	[6] KerberosTime OPTIONAL,
      	endtime		[7] KerberosTime,
      	renew-till	[8] KerberosTime OPTIONAL,
      	srealm		[9] Realm,
      	sname		[10] PrincipalName,
      	caddr		[11] HostAddresses OPTIONAL
      }
      

      shishi_as_derive_salt

      — Function: int shishi_as_derive_salt (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, char ** salt, size_t * saltlen)

      handle: shishi handle as allocated by shishi_init().

      asreq: input AS-REQ variable.

      asrep: input AS-REP variable.

      salt: newly allocated output array with salt.

      saltlen: holds actual size of output array with salt.

      Derive the salt that should be used when deriving a key via shishi_string_to_key() for an AS exchange. Currently this searches for PA-DATA of type SHISHI_PA_PW_SALT in the AS-REP and returns it if found, otherwise the salt is derived from the client name and realm in AS-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdc_copy_crealm

      — Function: int shishi_kdc_copy_crealm (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to read crealm from.

      encticketpart: EncTicketPart to set crealm in.

      Set crealm in KDC-REP to value in EncTicketPart.

      Return value: Returns SHISHI_OK if successful.

      shishi_as_check_crealm

      — Function: int shishi_as_check_crealm (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep)

      handle: shishi handle as allocated by shishi_init().

      asreq: AS-REQ to compare realm field in.

      asrep: AS-REP to compare realm field in.

      Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see shishi_kdc_process().

      Return value: Returns SHISHI_OK if successful, SHISHI_REALM_MISMATCH if the values differ, or an error code.

      shishi_kdc_copy_cname

      — Function: int shishi_kdc_copy_cname (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REQ to read cname from.

      encticketpart: EncTicketPart to set cname in.

      Set cname in KDC-REP to value in EncTicketPart.

      Return value: Returns SHISHI_OK if successful.

      shishi_as_check_cname

      — Function: int shishi_as_check_cname (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep)

      handle: shishi handle as allocated by shishi_init().

      asreq: AS-REQ to compare client name field in.

      asrep: AS-REP to compare client name field in.

      Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. This is one of the steps that has to be performed when processing a AS-REQ and AS-REP exchange, see shishi_kdc_process().

      Return value: Returns SHISHI_OK if successful, SHISHI_CNAME_MISMATCH if the values differ, or an error code.

      shishi_kdc_copy_nonce

      — Function: int shishi_kdc_copy_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to read nonce from.

      enckdcreppart: EncKDCRepPart to set nonce in.

      Set nonce in EncKDCRepPart to value in KDC-REQ.

      Return value: Returns SHISHI_OK if successful.

      shishi_kdc_check_nonce

      — Function: int shishi_kdc_check_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to compare nonce field in.

      enckdcreppart: Encrypted KDC-REP part to compare nonce field in.

      Verify that KDC-REQ.req-body.nonce and EncKDCRepPart.nonce fields matches. This is one of the steps that has to be performed when processing a KDC-REQ and KDC-REP exchange.

      Return value: Returns SHISHI_OK if successful, SHISHI_NONCE_LENGTH_MISMATCH if the nonces have different lengths (usually indicates that buggy server truncated nonce to 4 bytes), SHISHI_NONCE_MISMATCH if the values differ, or an error code.

      shishi_tgs_process

      — Function: int shishi_tgs_process (Shishi * handle, Shishi_asn1 tgsreq, Shishi_asn1 tgsrep, Shishi_asn1 authenticator, Shishi_asn1 oldenckdcreppart, Shishi_asn1 * enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      tgsreq: input variable that holds the sent KDC-REQ.

      tgsrep: input variable that holds the received KDC-REP.

      authenticator: input variable with Authenticator from AP-REQ in KDC-REQ.

      oldenckdcreppart: input variable with EncKDCRepPart used in request.

      enckdcreppart: output variable that holds new EncKDCRepPart.

      Process a TGS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the ticket used to construct the TGS request and calls shishi_kdc_process(), which see.

      Return value: Returns SHISHI_OK iff the TGS client exchange was successful.

      shishi_as_process

      — Function: int shishi_as_process (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, const char * string, Shishi_asn1 * enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      asreq: input variable that holds the sent KDC-REQ.

      asrep: input variable that holds the received KDC-REP.

      string: input variable with zero terminated password.

      enckdcreppart: output variable that holds new EncKDCRepPart.

      Process an AS client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. This function simply derives the encryption key from the password and calls shishi_kdc_process(), which see.

      Return value: Returns SHISHI_OK iff the AS client exchange was successful.

      shishi_kdc_process

      — Function: int shishi_kdc_process (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 * enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: input variable that holds the sent KDC-REQ.

      kdcrep: input variable that holds the received KDC-REP.

      key: input array with key to decrypt encrypted part of KDC-REP with.

      keyusage: kereros key usage value.

      enckdcreppart: output variable that holds new EncKDCRepPart.

      Process a KDC client exchange and output decrypted EncKDCRepPart which holds details for the new ticket received. Use shishi_kdcrep_get_ticket() to extract the ticket. This function verifies the various conditions that must hold if the response is to be considered valid, specifically it compares nonces (shishi_kdc_check_nonce()) and if the exchange was a AS exchange, it also compares cname and crealm (shishi_as_check_cname() and shishi_as_check_crealm()).

      Usually the shishi_as_process() and shishi_tgs_process() functions should be used instead, since they simplify the decryption key computation.

      Return value: Returns SHISHI_OK iff the KDC client exchange was successful.

      shishi_asreq

      — Function: Shishi_asn1 shishi_asreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new AS-REQ, populated with some default values.

      Return value: Returns the AS-REQ or NULL on failure.

      shishi_tgsreq

      — Function: Shishi_asn1 shishi_tgsreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new TGS-REQ, populated with some default values.

      Return value: Returns the TGS-REQ or NULL on failure.

      shishi_kdcreq_print

      — Function: int shishi_kdcreq_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      kdcreq: KDC-REQ to print.

      Print ASCII armored DER encoding of KDC-REQ to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_save

      — Function: int shishi_kdcreq_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      kdcreq: KDC-REQ to save.

      Print DER encoding of KDC-REQ to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_to_file

      — Function: int shishi_kdcreq_to_file (Shishi * handle, Shishi_asn1 kdcreq, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write KDC-REQ to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_parse

      — Function: int shishi_kdcreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      kdcreq: output variable with newly allocated KDC-REQ.

      Read ASCII armored DER encoded KDC-REQ from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_read

      — Function: int shishi_kdcreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      kdcreq: output variable with newly allocated KDC-REQ.

      Read DER encoded KDC-REQ from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_from_file

      — Function: int shishi_kdcreq_from_file (Shishi * handle, Shishi_asn1 * kdcreq, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: output variable with newly allocated KDC-REQ.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read KDC-REQ from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_nonce_set

      — Function: int shishi_kdcreq_nonce_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t nonce)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set client name field in.

      nonce: integer nonce to store in KDC-REQ.

      Store nonce number field in KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_set_cname

      — Function: int shishi_kdcreq_set_cname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char * principal)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set client name field in.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      principal: input array with principal name.

      Set the client name field in the KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_client

      — Function: int shishi_kdcreq_client (Shishi * handle, Shishi_asn1 kdcreq, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      kdcreq: KDC-REQ variable to get client name from.

      client: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Represent client principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_asreq_clientrealm

      — Function: int shishi_asreq_clientrealm (Shishi * handle, Shishi_asn1 asreq, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      asreq: AS-REQ variable to get client name and realm from.

      client: pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_realm

      — Function: int shishi_kdcreq_realm (Shishi * handle, Shishi_asn1 kdcreq, char ** realm, size_t * realmlen)

      handle: Shishi library handle create by shishi_init().

      kdcreq: KDC-REQ variable to get client name from.

      realm: pointer to newly allocated zero terminated string containing realm. May be NULL (to only populate realmlen).

      realmlen: pointer to length of realm on output, excluding terminating zero. May be NULL (to only populate realmlen).

      Get realm field in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length realmlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_set_realm

      — Function: int shishi_kdcreq_set_realm (Shishi * handle, Shishi_asn1 kdcreq, const char * realm)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set realm field in.

      realm: input array with name of realm.

      Set the realm field in the KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_server

      — Function: int shishi_kdcreq_server (Shishi * handle, Shishi_asn1 kdcreq, char ** server, size_t * serverlen)

      handle: Shishi library handle create by shishi_init().

      kdcreq: KDC-REQ variable to get server name from.

      server: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate serverlen).

      serverlen: pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

      Represent server principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length serverlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_set_sname

      — Function: int shishi_kdcreq_set_sname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char * [] sname)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set server name field in.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      sname: input array with principal name.

      Set the server name field in the KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_till

      — Function: int shishi_kdcreq_till (Shishi * handle, Shishi_asn1 kdcreq, char ** till, size_t * tilllen)

      handle: Shishi library handle create by shishi_init().

      kdcreq: KDC-REQ variable to get client name from.

      till: pointer to newly allocated zero terminated string containing "till" field with generalized time. May be NULL (to only populate realmlen).

      tilllen: pointer to length of till on output, excluding terminating zero. May be NULL (to only populate tilllen).

      Get "till" field (i.e. "endtime") in KDC-REQ, as zero-terminated string. The string is typically 15 characters long. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length realmlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_tillc

      — Function: time_t shishi_kdcreq_tillc (Shishi * handle, Shishi_asn1 kdcreq)

      handle: Shishi library handle create by shishi_init().

      kdcreq: KDC-REQ variable to get till field from.

      Extract C time corresponding to the "till" field.

      Return value: Returns C time interpretation of the "till" field in KDC-REQ.

      shishi_kdcreq_etype

      — Function: int shishi_kdcreq_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get etype field from.

      etype: output encryption type.

      netype: element number to return.

      Return the netype: th encryption type from KDC-REQ. The first etype is number 1.

      Return value: Returns SHISHI_OK iff etype successful set.

      shishi_kdcreq_set_etype

      — Function: int shishi_kdcreq_set_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set etype field in.

      etype: input array with encryption types.

      netype: number of elements in input array with encryption types.

      Set the list of supported or wanted encryption types in the request. The list should be sorted in priority order.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_options

      — Function: int shishi_kdcreq_options (Shishi * handle, Shishi_asn1 kdcreq, uint32_t * flags)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      flags: pointer to output integer with flags.

      Extract KDC-Options from KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_forwardable_p

      — Function: int shishi_kdcreq_forwardable_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option forwardable flag is set.

      The FORWARDABLE option indicates that the ticket to be issued is to have its forwardable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also forwardable.

      Return value: Returns non-0 iff forwardable flag is set in KDC-REQ.

      shishi_kdcreq_forwarded_p

      — Function: int shishi_kdcreq_forwarded_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option forwarded flag is set.

      The FORWARDED option is only specified in a request to the ticket-granting server and will only be honored if the ticket-granting ticket in the request has its FORWARDABLE bit set. This option indicates that this is a request for forwarding. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

      Return value: Returns non-0 iff forwarded flag is set in KDC-REQ.

      shishi_kdcreq_proxiable_p

      — Function: int shishi_kdcreq_proxiable_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option proxiable flag is set.

      The PROXIABLE option indicates that the ticket to be issued is to have its proxiable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also proxiable.

      Return value: Returns non-0 iff proxiable flag is set in KDC-REQ.

      shishi_kdcreq_proxy_p

      — Function: int shishi_kdcreq_proxy_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option proxy flag is set.

      The PROXY option indicates that this is a request for a proxy. This option will only be honored if the ticket-granting ticket in the request has its PROXIABLE bit set. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

      Return value: Returns non-0 iff proxy flag is set in KDC-REQ.

      shishi_kdcreq_allow_postdate_p

      — Function: int shishi_kdcreq_allow_postdate_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option allow-postdate flag is set.

      The ALLOW-POSTDATE option indicates that the ticket to be issued is to have its MAY-POSTDATE flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based also has its MAY-POSTDATE flag set.

      Return value: Returns non-0 iff allow-postdate flag is set in KDC-REQ.

      shishi_kdcreq_postdated_p

      — Function: int shishi_kdcreq_postdated_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option postdated flag is set.

      The POSTDATED option indicates that this is a request for a postdated ticket. This option will only be honored if the ticket-granting ticket on which it is based has its MAY-POSTDATE flag set. The resulting ticket will also have its INVALID flag set, and that flag may be reset by a subsequent request to the KDC after the starttime in the ticket has been reached.

      Return value: Returns non-0 iff postdated flag is set in KDC-REQ.

      shishi_kdcreq_renewable_p

      — Function: int shishi_kdcreq_renewable_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option renewable flag is set.

      The RENEWABLE option indicates that the ticket to be issued is to have its RENEWABLE flag set. It may only be set on the initial request, or when the ticket-granting ticket on which the request is based is also renewable. If this option is requested, then the rtime field in the request contains the desired absolute expiration time for the ticket.

      Return value: Returns non-0 iff renewable flag is set in KDC-REQ.

      shishi_kdcreq_disable_transited_check_p

      — Function: int shishi_kdcreq_disable_transited_check_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option disable-transited-check flag is set.

      By default the KDC will check the transited field of a ticket-granting-ticket against the policy of the local realm before it will issue derivative tickets based on the ticket-granting ticket. If this flag is set in the request, checking of the transited field is disabled. Tickets issued without the performance of this check will be noted by the reset (0) value of the TRANSITED-POLICY-CHECKED flag, indicating to the application server that the tranisted field must be checked locally. KDCs are encouraged but not required to honor the DISABLE-TRANSITED-CHECK option.

      This flag is new since RFC 1510

      Return value: Returns non-0 iff disable-transited-check flag is set in KDC-REQ.

      shishi_kdcreq_renewable_ok_p

      — Function: int shishi_kdcreq_renewable_ok_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option renewable-ok flag is set.

      The RENEWABLE-OK option indicates that a renewable ticket will be acceptable if a ticket with the requested life cannot otherwise be provided. If a ticket with the requested life cannot be provided, then a renewable ticket may be issued with a renew-till equal to the requested endtime. The value of the renew-till field may still be limited by local limits, or limits selected by the individual principal or server.

      Return value: Returns non-0 iff renewable-ok flag is set in KDC-REQ.

      shishi_kdcreq_enc_tkt_in_skey_p

      — Function: int shishi_kdcreq_enc_tkt_in_skey_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option enc-tkt-in-skey flag is set.

      This option is used only by the ticket-granting service. The ENC-TKT-IN-SKEY option indicates that the ticket for the end server is to be encrypted in the session key from the additional ticket-granting ticket provided.

      Return value: Returns non-0 iff enc-tkt-in-skey flag is set in KDC-REQ.

      shishi_kdcreq_renew_p

      — Function: int shishi_kdcreq_renew_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option renew flag is set.

      This option is used only by the ticket-granting service. The RENEW option indicates that the present request is for a renewal. The ticket provided is encrypted in the secret key for the server on which it is valid. This option will only be honored if the ticket to be renewed has its RENEWABLE flag set and if the time in its renew-till field has not passed. The ticket to be renewed is passed in the padata field as part of the authentication header.

      Return value: Returns non-0 iff renew flag is set in KDC-REQ.

      shishi_kdcreq_validate_p

      — Function: int shishi_kdcreq_validate_p (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to get kdc-options field from.

      Determine if KDC-Option validate flag is set.

      This option is used only by the ticket-granting service. The VALIDATE option indicates that the request is to validate a postdated ticket. It will only be honored if the ticket presented is postdated, presently has its INVALID flag set, and would be otherwise usable at this time. A ticket cannot be validated before its starttime. The ticket presented for validation is encrypted in the key of the server for which it is valid and is passed in the padata field as part of the authentication header.

      Return value: Returns non-0 iff validate flag is set in KDC-REQ.

      shishi_kdcreq_options_set

      — Function: int shishi_kdcreq_options_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t options)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set etype field in.

      options: integer with flags to store in KDC-REQ.

      Set options in KDC-REQ. Note that this reset any already existing flags.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_options_add

      — Function: int shishi_kdcreq_options_add (Shishi * handle, Shishi_asn1 kdcreq, uint32_t option)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ variable to set etype field in.

      option: integer with options to add in KDC-REQ.

      Add KDC-Option to KDC-REQ. This preserves all existing options.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_clear_padata

      — Function: int shishi_kdcreq_clear_padata (Shishi * handle, Shishi_asn1 kdcreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to remove PA-DATA from.

      Remove the padata field from KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_get_padata

      — Function: int shishi_kdcreq_get_padata (Shishi * handle, Shishi_asn1 kdcreq, Shishi_padata_type padatatype, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to get PA-DATA from.

      padatatype: type of PA-DATA, see Shishi_padata_type.

      out: output array with newly allocated PA-DATA value.

      outlen: size of output array with PA-DATA value.

      Get pre authentication data (PA-DATA) from KDC-REQ. Pre authentication data is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_get_padata_tgs

      — Function: int shishi_kdcreq_get_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * apreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to get PA-TGS-REQ from.

      apreq: Output variable with newly allocated AP-REQ.

      Extract TGS pre-authentication data from KDC-REQ. The data is an AP-REQ that authenticates the request. This function call shishi_kdcreq_get_padata() with a SHISHI_PA_TGS_REQ padatatype and DER decode the result (if any).

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_add_padata

      — Function: int shishi_kdcreq_add_padata (Shishi * handle, Shishi_asn1 kdcreq, int padatatype, const char * data, size_t datalen)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to add PA-DATA to.

      padatatype: type of PA-DATA, see Shishi_padata_type.

      data: input array with PA-DATA value.

      datalen: size of input array with PA-DATA value.

      Add new pre authentication data (PA-DATA) to KDC-REQ. This is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket. (But also see shishi_kdcreq_add_padata_tgs() which takes an AP-REQ directly.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_add_padata_tgs

      — Function: int shishi_kdcreq_add_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 apreq)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to add PA-DATA to.

      apreq: AP-REQ to add as PA-DATA.

      Add TGS pre-authentication data to KDC-REQ. The data is an AP-REQ that authenticates the request. This functions simply DER encodes the AP-REQ and calls shishi_kdcreq_add_padata() with a SHISHI_PA_TGS_REQ padatatype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcreq_add_padata_preauth

      — Function: int shishi_kdcreq_add_padata_preauth (Shishi * handle, Shishi_asn1 kdcreq, Shishi_key * key)

      handle: shishi handle as allocated by shishi_init().

      kdcreq: KDC-REQ to add pre-authentication data to.

      key: Key used to encrypt pre-auth data.

      Add pre-authentication data to KDC-REQ.

      Return value: Returns SHISHI_OK iff successful.

      shishi_asrep

      — Function: Shishi_asn1 shishi_asrep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new AS-REP, populated with some default values.

      Return value: Returns the AS-REP or NULL on failure.

      shishi_tgsrep

      — Function: Shishi_asn1 shishi_tgsrep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new TGS-REP, populated with some default values.

      Return value: Returns the TGS-REP or NULL on failure.

      shishi_kdcrep_print

      — Function: int shishi_kdcrep_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      kdcrep: KDC-REP to print.

      Print ASCII armored DER encoding of KDC-REP to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_save

      — Function: int shishi_kdcrep_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      kdcrep: KDC-REP to save.

      Print DER encoding of KDC-REP to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_to_file

      — Function: int shishi_kdcrep_to_file (Shishi * handle, Shishi_asn1 kdcrep, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write KDC-REP to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_parse

      — Function: int shishi_kdcrep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      kdcrep: output variable with newly allocated KDC-REP.

      Read ASCII armored DER encoded KDC-REP from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_read

      — Function: int shishi_kdcrep_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      kdcrep: output variable with newly allocated KDC-REP.

      Read DER encoded KDC-REP from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_from_file

      — Function: int shishi_kdcrep_from_file (Shishi * handle, Shishi_asn1 * kdcrep, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: output variable with newly allocated KDC-REP.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read KDC-REP from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_crealm_set

      — Function: int shishi_kdcrep_crealm_set (Shishi * handle, Shishi_asn1 kdcrep, const char * crealm)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: Kdcrep variable to set realm field in.

      crealm: input array with name of realm.

      Set the client realm field in the KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_cname_set

      — Function: int shishi_kdcrep_cname_set (Shishi * handle, Shishi_asn1 kdcrep, Shishi_name_type name_type, const char * [] cname)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: Kdcrep variable to set server name field in.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      cname: input array with principal name.

      Set the client name field in the KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_client_set

      — Function: int shishi_kdcrep_client_set (Shishi * handle, Shishi_asn1 kdcrep, const char * client)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: Kdcrep variable to set server name field in.

      client: zero-terminated string with principal name on RFC 1964 form.

      Set the client name field in the KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_get_enc_part_etype

      — Function: int shishi_kdcrep_get_enc_part_etype (Shishi * handle, Shishi_asn1 kdcrep, int32_t * etype)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP variable to get value from.

      etype: output variable that holds the value.

      Extract KDC-REP.enc-part.etype.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_get_ticket

      — Function: int shishi_kdcrep_get_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 * ticket)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP variable to get ticket from.

      ticket: output variable to hold extracted ticket.

      Extract ticket from KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_set_ticket

      — Function: int shishi_kdcrep_set_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 ticket)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to add ticket field to.

      ticket: input ticket to copy into KDC-REP ticket field.

      Copy ticket into KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_set_enc_part

      — Function: int shishi_kdcrep_set_enc_part (Shishi * handle, Shishi_asn1 kdcrep, int32_t etype, uint32_t kvno, const char * buf, size_t buflen)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to add enc-part field to.

      etype: encryption type used to encrypt enc-part.

      kvno: key version number.

      buf: input array with encrypted enc-part.

      buflen: size of input array with encrypted enc-part.

      Set the encrypted enc-part field in the KDC-REP. The encrypted data is usually created by calling shishi_encrypt() on the DER encoded enc-part. To save time, you may want to use shishi_kdcrep_add_enc_part() instead, which calculates the encrypted data and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_add_enc_part

      — Function: int shishi_kdcrep_add_enc_part (Shishi * handle, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 enckdcreppart)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to add enc-part field to.

      key: key used to encrypt enc-part.

      keyusage: key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY.

      enckdcreppart: EncKDCRepPart to add.

      Encrypts DER encoded EncKDCRepPart using key and stores it in the KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_kdcrep_clear_padata

      — Function: int shishi_kdcrep_clear_padata (Shishi * handle, Shishi_asn1 kdcrep)

      handle: shishi handle as allocated by shishi_init().

      kdcrep: KDC-REP to remove PA-DATA from.

      Remove the padata field from KDC-REP.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_get_key

      — Function: int shishi_enckdcreppart_get_key (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key ** key)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      key: newly allocated encryption key handle.

      Extract the key to use with the ticket sent in the KDC-REP associated with the EncKDCRepPart input variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_key_set

      — Function: int shishi_enckdcreppart_key_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key * key)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      key: key handle with information to store in enckdcreppart.

      Set the EncKDCRepPart.key field to key type and value of supplied key.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_nonce_set

      — Function: int shishi_enckdcreppart_nonce_set (Shishi * handle, Shishi_asn1 enckdcreppart, uint32_t nonce)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      nonce: nonce to set in EncKDCRepPart.

      Set the EncKDCRepPart.nonce field.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_flags_set

      — Function: int shishi_enckdcreppart_flags_set (Shishi * handle, Shishi_asn1 enckdcreppart, int flags)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      flags: flags to set in EncKDCRepPart.

      Set the EncKDCRepPart.flags field.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_authtime_set

      — Function: int shishi_enckdcreppart_authtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char * authtime)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      authtime: character buffer containing a generalized time string.

      Set the EncTicketPart.authtime to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_starttime_set

      — Function: int shishi_enckdcreppart_starttime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char * starttime)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      starttime: character buffer containing a generalized time string.

      Set the EncTicketPart.starttime to supplied value. Use a NULL value for starttime to remove the field.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_endtime_set

      — Function: int shishi_enckdcreppart_endtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char * endtime)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      endtime: character buffer containing a generalized time string.

      Set the EncTicketPart.endtime to supplied value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_renew_till_set

      — Function: int shishi_enckdcreppart_renew_till_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char * renew_till)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      renew_till: character buffer containing a generalized time string.

      Set the EncTicketPart.renew-till to supplied value. Use a NULL value for renew_till to remove the field.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_srealm_set

      — Function: int shishi_enckdcreppart_srealm_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char * srealm)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: EncKDCRepPart variable to set realm field in.

      srealm: input array with name of realm.

      Set the server realm field in the EncKDCRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_sname_set

      — Function: int shishi_enckdcreppart_sname_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_name_type name_type, char * [] sname)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: EncKDCRepPart variable to set server name field in.

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      sname: input array with principal name.

      Set the server name field in the EncKDCRepPart.

      Return value: Returns SHISHI_OK iff successful.

      shishi_enckdcreppart_populate_encticketpart

      — Function: int shishi_enckdcreppart_populate_encticketpart (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_asn1 encticketpart)

      handle: shishi handle as allocated by shishi_init().

      enckdcreppart: input EncKDCRepPart variable.

      encticketpart: input EncTicketPart variable.

      Set the flags, authtime, starttime, endtime, renew-till and caddr fields of the EncKDCRepPart to the corresponding values in the EncTicketPart.

      Return value: Returns SHISHI_OK iff successful.

      5.11 Authenticator Functions

      An “Authenticator” is an ASN.1 structure that work as a proof that an entity owns a ticket. It is usually embedded in the AP-REQ structure (see AP-REQ and AP-REP Functions), and you most likely want to use an AP-REQ instead of a Authenticator in normal applications. The following illustrates the Authenticator ASN.1 structure.

      Authenticator	::= [APPLICATION 2] SEQUENCE  {
      	authenticator-vno	[0] INTEGER (5),
      	crealm			[1] Realm,
      	cname			[2] PrincipalName,
      	cksum			[3] Checksum OPTIONAL,
      	cusec			[4] Microseconds,
      	ctime			[5] KerberosTime,
      	subkey			[6] EncryptionKey OPTIONAL,
      	seq-number		[7] UInt32 OPTIONAL,
      	authorization-data	[8] AuthorizationData OPTIONAL
      }
      

      shishi_authenticator

      — Function: Shishi_asn1 shishi_authenticator (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

      Return value: Returns the authenticator or NULL on failure.

      shishi_authenticator_subkey

      — Function: Shishi_asn1 shishi_authenticator_subkey (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. It adds a random subkey.

      Return value: Returns the authenticator or NULL on failure.

      shishi_authenticator_print

      — Function: int shishi_authenticator_print (Shishi * handle, FILE * fh, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      authenticator: authenticator as allocated by shishi_authenticator().

      Print ASCII armored DER encoding of authenticator to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_save

      — Function: int shishi_authenticator_save (Shishi * handle, FILE * fh, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      authenticator: authenticator as allocated by shishi_authenticator().

      Save DER encoding of authenticator to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_to_file

      — Function: int shishi_authenticator_to_file (Shishi * handle, Shishi_asn1 authenticator, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write Authenticator to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_parse

      — Function: int shishi_authenticator_parse (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      authenticator: output variable with newly allocated authenticator.

      Read ASCII armored DER encoded authenticator from file and populate given authenticator variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_read

      — Function: int shishi_authenticator_read (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      authenticator: output variable with newly allocated authenticator.

      Read DER encoded authenticator from file and populate given authenticator variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_from_file

      — Function: int shishi_authenticator_from_file (Shishi * handle, Shishi_asn1 * authenticator, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      authenticator: output variable with newly allocated Authenticator.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read Authenticator from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_set_crealm

      — Function: int shishi_authenticator_set_crealm (Shishi * handle, Shishi_asn1 authenticator, const char * crealm)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      crealm: input array with realm.

      Set realm field in authenticator to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_set_cname

      — Function: int shishi_authenticator_set_cname (Shishi * handle, Shishi_asn1 authenticator, Shishi_name_type name_type, const char * [] cname)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      cname: input array with principal name.

      Set principal field in authenticator to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_client_set

      — Function: int shishi_authenticator_client_set (Shishi * handle, Shishi_asn1 authenticator, const char * client)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator to set client name field in.

      client: zero-terminated string with principal name on RFC 1964 form.

      Set the client name field in the Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_ctime

      — Function: int shishi_authenticator_ctime (Shishi * handle, Shishi_asn1 authenticator, char ** t)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator as allocated by shishi_authenticator().

      t: newly allocated zero-terminated character array with client time.

      Extract client time from Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_ctime_set

      — Function: int shishi_authenticator_ctime_set (Shishi * handle, Shishi_asn1 authenticator, const char * t)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator as allocated by shishi_authenticator().

      t: string with generalized time value to store in Authenticator.

      Store client time in Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_cusec_get

      — Function: int shishi_authenticator_cusec_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * cusec)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator as allocated by shishi_authenticator().

      cusec: output integer with client microseconds field.

      Extract client microseconds field from Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_cusec_set

      — Function: int shishi_authenticator_cusec_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t cusec)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      cusec: client microseconds to set in authenticator, 0-999999.

      Set the cusec field in the Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_seqnumber_get

      — Function: int shishi_authenticator_seqnumber_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * seqnumber)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      seqnumber: output integer with sequence number field.

      Extract sequence number field from Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_seqnumber_remove

      — Function: int shishi_authenticator_seqnumber_remove (Shishi * handle, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      Remove sequence number field in Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_seqnumber_set

      — Function: int shishi_authenticator_seqnumber_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t seqnumber)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      seqnumber: integer with sequence number field to store in Authenticator.

      Store sequence number field in Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_client

      — Function: int shishi_authenticator_client (Shishi * handle, Shishi_asn1 authenticator, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      authenticator: Authenticator variable to get client name from.

      client: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Represent client principal name in Authenticator as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_clientrealm

      — Function: int shishi_authenticator_clientrealm (Shishi * handle, Shishi_asn1 authenticator, char ** client, size_t * clientlen)

      handle: Shishi library handle create by shishi_init().

      authenticator: Authenticator variable to get client name and realm from.

      client: pointer to newly allocated zero terminated string containing principal name and realm. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Convert cname and realm fields from Authenticator to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length clientlen does not include the terminating zero.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_cksum

      — Function: int shishi_authenticator_cksum (Shishi * handle, Shishi_asn1 authenticator, int32_t * cksumtype, char ** cksum, size_t * cksumlen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      cksumtype: output checksum type.

      cksum: newly allocated output checksum data from authenticator.

      cksumlen: on output, actual size of allocated output checksum data buffer.

      Read checksum value from authenticator. cksum is allocated by this function, and it is the responsibility of caller to deallocate it.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_set_cksum

      — Function: int shishi_authenticator_set_cksum (Shishi * handle, Shishi_asn1 authenticator, int32_t cksumtype, char * cksum, size_t cksumlen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      cksumtype: input checksum type to store in authenticator.

      cksum: input checksum data to store in authenticator.

      cksumlen: size of input checksum data to store in authenticator.

      Store checksum value in authenticator. A checksum is usually created by calling shishi_checksum() on some application specific data using the key from the ticket that is being used. To save time, you may want to use shishi_authenticator_add_cksum() instead, which calculates the checksum and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_cksum

      — Function: int shishi_authenticator_add_cksum (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, char * data, size_t datalen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      key: key to to use for encryption.

      keyusage: cryptographic key usage value to use in encryption.

      data: input array with data to calculate checksum on.

      datalen: size of input array with data to calculate checksum on.

      Calculate checksum for data and store it in the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_cksum_type

      — Function: int shishi_authenticator_add_cksum_type (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, int cksumtype, char * data, size_t datalen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      key: key to to use for encryption.

      keyusage: cryptographic key usage value to use in encryption.

      cksumtype: checksum to type to calculate checksum.

      data: input array with data to calculate checksum on.

      datalen: size of input array with data to calculate checksum on.

      Calculate checksum for data and store it in the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_clear_authorizationdata

      — Function: int shishi_authenticator_clear_authorizationdata (Shishi * handle, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      authenticator: Authenticator as allocated by shishi_authenticator().

      Remove the authorization-data field from Authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_authorizationdata

      — Function: int shishi_authenticator_add_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t adtype, const char * addata, size_t addatalen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      adtype: input authorization data type to add.

      addata: input authorization data to add.

      addatalen: size of input authorization data to add.

      Add authorization data to authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_authorizationdata

      — Function: int shishi_authenticator_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t * adtype, char ** addata, size_t * addatalen, size_t nth)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      adtype: output authorization data type.

      addata: newly allocated output authorization data.

      addatalen: on output, actual size of newly allocated authorization data.

      nth: element number of authorization-data to extract.

      Extract n: th authorization data from authenticator. The first field is 1.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_remove_subkey

      — Function: int shishi_authenticator_remove_subkey (Shishi * handle, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      Remove subkey from the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_get_subkey

      — Function: int shishi_authenticator_get_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key ** subkey)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      subkey: output newly allocated subkey from authenticator.

      Read subkey value from authenticator.

      Return value: Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT if subkey is not present.

      shishi_authenticator_set_subkey

      — Function: int shishi_authenticator_set_subkey (Shishi * handle, Shishi_asn1 authenticator, int32_t subkeytype, const char * subkey, size_t subkeylen)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      subkeytype: input subkey type to store in authenticator.

      subkey: input subkey data to store in authenticator.

      subkeylen: size of input subkey data to store in authenticator.

      Store subkey value in authenticator. A subkey is usually created by calling shishi_key_random() using the default encryption type of the key from the ticket that is being used. To save time, you may want to use shishi_authenticator_add_subkey() instead, which calculates the subkey and calls this function in one step.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_random_subkey

      — Function: int shishi_authenticator_add_random_subkey (Shishi * handle, Shishi_asn1 authenticator)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      Generate random subkey, of the default encryption type from configuration, and store it in the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_random_subkey_etype

      — Function: int shishi_authenticator_add_random_subkey_etype (Shishi * handle, Shishi_asn1 authenticator, int etype)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      etype: encryption type of random key to generate.

      Generate random subkey of indicated encryption type, and store it in the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      shishi_authenticator_add_subkey

      — Function: int shishi_authenticator_add_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * subkey)

      handle: shishi handle as allocated by shishi_init().

      authenticator: authenticator as allocated by shishi_authenticator().

      subkey: subkey to add to authenticator.

      Store subkey in the authenticator.

      Return value: Returns SHISHI_OK iff successful.

      5.12 KRB-ERROR Functions

      The “KRB-ERROR” is an ASN.1 structure that can be returned, instead of, e.g., KDC-REP or AP-REP, to indicate various error conditions. Unfortunately, the semantics of several of the fields are ill specified, so the typically procedure is to extract “e-text” and/or “e-data” and show it to the user. The following illustrates the KRB-ERROR ASN.1 structure.

      KRB-ERROR       ::= [APPLICATION 30] SEQUENCE {
              pvno            [0] INTEGER (5),
              msg-type        [1] INTEGER (30),
              ctime           [2] KerberosTime OPTIONAL,
              cusec           [3] Microseconds OPTIONAL,
              stime           [4] KerberosTime,
              susec           [5] Microseconds,
              error-code      [6] Int32,
              crealm          [7] Realm OPTIONAL,
              cname           [8] PrincipalName OPTIONAL,
              realm           [9] Realm -- service realm --,
              sname           [10] PrincipalName -- service name --,
              e-text          [11] KerberosString OPTIONAL,
              e-data          [12] OCTET STRING OPTIONAL
      }
      

      shishi_krberror

      — Function: Shishi_asn1 shishi_krberror (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      This function creates a new KRB-ERROR, populated with some default values.

      Return value: Returns the KRB-ERROR or NULL on failure.

      shishi_krberror_print

      — Function: int shishi_krberror_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      krberror: KRB-ERROR to print.

      Print ASCII armored DER encoding of KRB-ERROR to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_save

      — Function: int shishi_krberror_save (Shishi * handle, FILE * fh, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for writing.

      krberror: KRB-ERROR to save.

      Save DER encoding of KRB-ERROR to file.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_to_file

      — Function: int shishi_krberror_to_file (Shishi * handle, Shishi_asn1 krberror, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR to save.

      filetype: input variable specifying type of file to be written, see Shishi_filetype.

      filename: input variable with filename to write to.

      Write KRB-ERROR to file in specified TYPE. The file will be truncated if it exists.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_parse

      — Function: int shishi_krberror_parse (Shishi * handle, FILE * fh, Shishi_asn1 * krberror)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      krberror: output variable with newly allocated KRB-ERROR.

      Read ASCII armored DER encoded KRB-ERROR from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_read

      — Function: int shishi_krberror_read (Shishi * handle, FILE * fh, Shishi_asn1 * krberror)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle open for reading.

      krberror: output variable with newly allocated KRB-ERROR.

      Read DER encoded KRB-ERROR from file and populate given variable.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_from_file

      — Function: int shishi_krberror_from_file (Shishi * handle, Shishi_asn1 * krberror, int filetype, const char * filename)

      handle: shishi handle as allocated by shishi_init().

      krberror: output variable with newly allocated KRB-ERROR.

      filetype: input variable specifying type of file to be read, see Shishi_filetype.

      filename: input variable with filename to read from.

      Read KRB-ERROR from file in specified TYPE.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_build

      — Function: int shishi_krberror_build (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      Finish KRB-ERROR, called before e.g. shishi_krberror_der. This function removes empty but OPTIONAL fields (such as cname), and

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_der

      — Function: int shishi_krberror_der (Shishi * handle, Shishi_asn1 krberror, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      out: output array with newly allocated DER encoding of KRB-ERROR.

      outlen: length of output array with DER encoding of KRB-ERROR.

      DER encode KRB-ERROR. The caller must deallocate the OUT buffer.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_crealm

      — Function: int shishi_krberror_crealm (Shishi * handle, Shishi_asn1 krberror, char ** realm, size_t * realmlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      realm: output array with newly allocated name of realm in KRB-ERROR.

      realmlen: size of output array.

      Extract client realm from KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_crealm

      — Function: int shishi_krberror_remove_crealm (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      Remove client realm field in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_crealm

      — Function: int shishi_krberror_set_crealm (Shishi * handle, Shishi_asn1 krberror, const char * crealm)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      crealm: input array with realm.

      Set realm field in krberror to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_client

      — Function: int shishi_krberror_client (Shishi * handle, Shishi_asn1 krberror, char ** client, size_t * clientlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      client: pointer to newly allocated zero terminated string containing principal name. May be NULL (to only populate clientlen).

      clientlen: pointer to length of client on output, excluding terminating zero. May be NULL (to only populate client).

      Return client principal name in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_cname

      — Function: int shishi_krberror_set_cname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char * [] cname)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      cname: input array with principal name.

      Set principal field in krberror to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_cname

      — Function: int shishi_krberror_remove_cname (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      Remove client realm field in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_client_set

      — Function: int shishi_krberror_client_set (Shishi * handle, Shishi_asn1 krberror, const char * client)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror to set client name field in.

      client: zero-terminated string with principal name on RFC 1964 form.

      Set the client name field in the Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_realm

      — Function: int shishi_krberror_realm (Shishi * handle, Shishi_asn1 krberror, char ** realm, size_t * realmlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      realm: output array with newly allocated name of realm in KRB-ERROR.

      realmlen: size of output array.

      Extract (server) realm from KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_realm

      — Function: int shishi_krberror_set_realm (Shishi * handle, Shishi_asn1 krberror, const char * realm)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      realm: input array with (server) realm.

      Set (server) realm field in krberror to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_server

      — Function: int shishi_krberror_server (Shishi * handle, Shishi_asn1 krberror, char ** server, size_t * serverlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      server: pointer to newly allocated zero terminated string containing server name. May be NULL (to only populate serverlen).

      serverlen: pointer to length of server on output, excluding terminating zero. May be NULL (to only populate server).

      Return server principal name in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_sname

      — Function: int shishi_krberror_remove_sname (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror to set server name field in.

      Remove server name field in KRB-ERROR. (Since it is not marked OPTIONAL in the ASN.1 profile, what is done is to set the name-type to UNKNOWN and make sure the name-string sequence is empty.)

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_sname

      — Function: int shishi_krberror_set_sname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char * [] sname)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      name_type: type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      sname: input array with principal name.

      Set principal field in krberror to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_server_set

      — Function: int shishi_krberror_server_set (Shishi * handle, Shishi_asn1 krberror, const char * server)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror to set server name field in.

      server: zero-terminated string with principal name on RFC 1964 form.

      Set the server name field in the Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_ctime

      — Function: int shishi_krberror_ctime (Shishi * handle, Shishi_asn1 krberror, char ** t)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror to set client name field in.

      t: newly allocated zero-terminated output array with client time.

      Extract client time from KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_ctime_set

      — Function: int shishi_krberror_ctime_set (Shishi * handle, Shishi_asn1 krberror, const char * t)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      t: string with generalized time value to store in Krberror.

      Store client time in Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_ctime

      — Function: int shishi_krberror_remove_ctime (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      Remove client time field in Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_cusec

      — Function: int shishi_krberror_cusec (Shishi * handle, Shishi_asn1 krberror, uint32_t * cusec)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      cusec: output integer with client microseconds field.

      Extract client microseconds field from Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_cusec_set

      — Function: int shishi_krberror_cusec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t cusec)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      cusec: client microseconds to set in krberror, 0-999999.

      Set the cusec field in the Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_cusec

      — Function: int shishi_krberror_remove_cusec (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      Remove client usec field in Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_stime

      — Function: int shishi_krberror_stime (Shishi * handle, Shishi_asn1 krberror, char ** t)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror to set client name field in.

      t: newly allocated zero-terminated output array with server time.

      Extract server time from KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_stime_set

      — Function: int shishi_krberror_stime_set (Shishi * handle, Shishi_asn1 krberror, const char * t)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      t: string with generalized time value to store in Krberror.

      Store server time in Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_susec

      — Function: int shishi_krberror_susec (Shishi * handle, Shishi_asn1 krberror, uint32_t * susec)

      handle: shishi handle as allocated by shishi_init().

      krberror: Krberror as allocated by shishi_krberror().

      susec: output integer with server microseconds field.

      Extract server microseconds field from Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_susec_set

      — Function: int shishi_krberror_susec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t susec)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      susec: server microseconds to set in krberror, 0-999999.

      Set the susec field in the Krberror.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_errorcode

      — Function: int shishi_krberror_errorcode (Shishi * handle, Shishi_asn1 krberror, int32_t * errorcode)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      errorcode: output integer KRB-ERROR error code.

      Extract error code from KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_errorcode_fast

      — Function: int shishi_krberror_errorcode_fast (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      Get error code from KRB-ERROR, without error checking.

      Return value: Return error code (see shishi_krberror_errorcode()) directly, or -1 on error.

      shishi_krberror_errorcode_set

      — Function: int shishi_krberror_errorcode_set (Shishi * handle, Shishi_asn1 krberror, int errorcode)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code to set.

      errorcode: new error code to set in krberror.

      Set the error-code field to a new error code.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_etext

      — Function: int shishi_krberror_etext (Shishi * handle, Shishi_asn1 krberror, char ** etext, size_t * etextlen)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      etext: output array with newly allocated error text.

      etextlen: output length of error text.

      Extract additional error text from server (possibly empty).

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_etext

      — Function: int shishi_krberror_set_etext (Shishi * handle, Shishi_asn1 krberror, const char * etext)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      etext: input array with error text to set.

      Set error text (e-text) field in KRB-ERROR to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_etext

      — Function: int shishi_krberror_remove_etext (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      Remove error text (e-text) field in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_edata

      — Function: int shishi_krberror_edata (Shishi * handle, Shishi_asn1 krberror, char ** edata, size_t * edatalen)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      edata: output array with newly allocated error data.

      edatalen: output length of error data.

      Extract additional error data from server (possibly empty).

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_methoddata

      — Function: int shishi_krberror_methoddata (Shishi * handle, Shishi_asn1 krberror, Shishi_asn1 * methoddata)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      methoddata: output ASN.1 METHOD-DATA.

      Extract METHOD-DATA ASN.1 object from the e-data field. The e-data field will only contain a METHOD-DATA if the krberror error code is SHISHI_KDC_ERR_PREAUTH_REQUIRED.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_set_edata

      — Function: int shishi_krberror_set_edata (Shishi * handle, Shishi_asn1 krberror, const char * edata)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      edata: input array with error text to set.

      Set error text (e-data) field in KRB-ERROR to specified value.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_remove_edata

      — Function: int shishi_krberror_remove_edata (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: krberror as allocated by shishi_krberror().

      Remove error text (e-data) field in KRB-ERROR.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_pretty_print

      — Function: int shishi_krberror_pretty_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      fh: file handle opened for writing.

      krberror: KRB-ERROR structure with error code.

      Print KRB-ERROR error condition and some explanatory text to file descriptor.

      Return value: Returns SHISHI_OK iff successful.

      shishi_krberror_errorcode_message

      — Function: const char * shishi_krberror_errorcode_message (Shishi * handle, int errorcode)

      handle: shishi handle as allocated by shishi_init().

      errorcode: integer KRB-ERROR error code.

      Get human readable string describing KRB-ERROR code.

      Return value: Return a string describing error code. This function will always return a string even if the error code isn't known.

      shishi_krberror_message

      — Function: const char * shishi_krberror_message (Shishi * handle, Shishi_asn1 krberror)

      handle: shishi handle as allocated by shishi_init().

      krberror: KRB-ERROR structure with error code.

      Extract error code (see shishi_krberror_errorcode_fast()) and return error message (see shishi_krberror_errorcode_message()).

      Return value: Return a string describing error code. This function will always return a string even if the error code isn't known.

      5.13 Cryptographic Functions

      Underneath the high-level functions described earlier, cryptographic operations are happening. If you need to access these cryptographic primitives directly, this section describes the functions available.

      Most cryptographic operations need keying material, and cryptographic keys have been isolated into it's own data structure Shishi_key. The following illustrates it's contents, but note that you cannot access it's elements directly but must use the accessor functions described below.

      struct Shishi_key
      {
        int type;    /* RFC 1510 encryption integer type */
        char *value; /* Cryptographic key data */
        int version; /* RFC 1510 ``kvno'' */
      };
      

      All functions that operate on this data structure are described now.

      shishi_key_principal

      — Function: const char * shishi_key_principal (const Shishi_key * key)

      key: structure that holds key information

      Get the principal part of the key owner principal name, i.e., except the realm.

      Return value: Returns the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

      shishi_key_principal_set

      — Function: void shishi_key_principal_set (Shishi_key * key, const char * principal)

      key: structure that holds key information

      principal: string with new principal name.

      Set the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

      shishi_key_realm

      — Function: const char * shishi_key_realm (const Shishi_key * key)

      key: structure that holds key information

      Get the realm part of the key owner principal name.

      Return value: Returns the realm for the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

      shishi_key_realm_set

      — Function: void shishi_key_realm_set (Shishi_key * key, const char * realm)

      key: structure that holds key information

      realm: string with new realm name.

      Set the realm for the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

      shishi_key_type

      — Function: int shishi_key_type (const Shishi_key * key)

      key: structure that holds key information

      Get key type.

      Return value: Returns the type of key as an integer as described in the standard.

      shishi_key_type_set

      — Function: void shishi_key_type_set (Shishi_key * key, int32_t type)

      key: structure that holds key information

      type: type to set in key.

      Set the type of key in key structure.

      shishi_key_value

      — Function: const char * shishi_key_value (const Shishi_key * key)

      key: structure that holds key information

      Get the raw key bytes.

      Return value: Returns the key value as a pointer which is valid throughout the lifetime of the key structure.

      shishi_key_value_set

      — Function: void shishi_key_value_set (Shishi_key * key, const char * value)

      key: structure that holds key information

      value: input array with key data.

      Set the key value and length in key structure. The value is copied into the key (in other words, you can deallocate value right after calling this function without modifying the value inside the key).

      shishi_key_version

      — Function: uint32_t shishi_key_version (const Shishi_key * key)

      key: structure that holds key information

      Get the "kvno" (key version) of key. It will be UINT32_MAX if the key is not long-lived.

      Return value: Returns the version of key ("kvno").

      shishi_key_version_set

      — Function: void shishi_key_version_set (Shishi_key * key, uint32_t kvno)

      key: structure that holds key information

      kvno: new version integer.

      Set the version of key ("kvno") in key structure. Use UINT32_MAX for non-ptermanent keys.

      shishi_key_timestamp

      — Function: time_t shishi_key_timestamp (const Shishi_key * key)

      key: structure that holds key information

      Get the time the key was established. Typically only present when the key was imported from a keytab format.

      Return value: Returns the time the key was established, or (time_t)-1 if not available.

      Since: 0.0.42

      shishi_key_timestamp_set

      — Function: void shishi_key_timestamp_set (Shishi_key * key, time_t timestamp)

      key: structure that holds key information

      timestamp: new timestamp.

      Set the time the key was established. Typically only relevant when exporting the key to keytab format.

      Since: 0.0.42

      shishi_key_name

      — Function: const char * shishi_key_name (Shishi_key * key)

      key: structure that holds key information

      Calls shishi_cipher_name for key type.

      Return value: Return name of key.

      shishi_key_length

      — Function: size_t shishi_key_length (const Shishi_key * key)

      key: structure that holds key information

      Calls shishi_cipher_keylen for key type.

      Return value: Returns the length of the key value.

      shishi_key

      — Function: int shishi_key (Shishi * handle, Shishi_key ** key)

      handle: Shishi library handle create by shishi_init().

      key: pointer to structure that will hold newly created key information

      Create a new Key information structure.

      Return value: Returns SHISHI_OK iff successful.

      shishi_key_done

      — Function: void shishi_key_done (Shishi_key * key)

      key: pointer to structure that holds key information.

      Deallocates key information structure.

      shishi_key_copy

      — Function: void shishi_key_copy (Shishi_key * dstkey, Shishi_key * srckey)

      dstkey: structure that holds destination key information

      srckey: structure that holds source key information

      Copies source key into existing allocated destination key.

      shishi_key_from_value

      — Function: int shishi_key_from_value (Shishi * handle, int32_t type, const char * value, Shishi_key ** key)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      value: input array with key value, or NULL.

      key: pointer to structure that will hold newly created key information

      Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

      Return value: Returns SHISHI_OK iff successful.

      shishi_key_from_base64

      — Function: int shishi_key_from_base64 (Shishi * handle, int32_t type, const char * value, Shishi_key ** key)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      value: input string with base64 encoded key value, or NULL.

      key: pointer to structure that will hold newly created key information

      Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

      Return value: Returns SHISHI_INVALID_KEY if the base64 encoded key length doesn't match the key type, and SHISHI_OK on success.

      shishi_key_random

      — Function: int shishi_key_random (Shishi * handle, int32_t type, Shishi_key ** key)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      key: pointer to structure that will hold newly created key information

      Create a new Key information structure for the key type and some random data. KEY contains a newly allocated structure only if this function is successful.

      Return value: Returns SHISHI_OK iff successful.

      shishi_key_from_random

      — Function: int shishi_key_from_random (Shishi * handle, int32_t type, const char * rnd, size_t rndlen, Shishi_key ** outkey)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      rnd: random data.

      rndlen: length of random data.

      outkey: pointer to structure that will hold newly created key information

      Create a new Key information structure, and set the key type and key value using shishi_random_to_key(). KEY contains a newly allocated structure only if this function is successful.

      Return value: Returns SHISHI_OK iff successful.

      shishi_key_from_string

      — Function: int shishi_key_from_string (Shishi * handle, int32_t type, const char * password, size_t passwordlen, const char * salt, size_t saltlen, const char * parameter, Shishi_key ** outkey)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      password: input array containing password.

      passwordlen: length of input array containing password.

      salt: input array containing salt.

      saltlen: length of input array containing salt.

      parameter: input array with opaque encryption type specific information.

      outkey: pointer to structure that will hold newly created key information

      Create a new Key information structure, and set the key type and key value using shishi_string_to_key(). KEY contains a newly allocated structure only if this function is successful.

      Return value: Returns SHISHI_OK iff successful.

      shishi_key_from_name

      — Function: int shishi_key_from_name (Shishi * handle, int32_t type, const char * name, const char * password, size_t passwordlen, const char * parameter, Shishi_key ** outkey)

      handle: Shishi library handle create by shishi_init().

      type: type of key.

      name: principal name of user.

      password: input array containing password.

      passwordlen: length of input array containing password.

      parameter: input array with opaque encryption type specific information.

      outkey: pointer to structure that will hold newly created key information

      Create a new Key information structure, and derive the key from principal name and password using shishi_key_from_name(). The salt is derived from the principal name by concatenating the decoded realm and principal.

      Return value: Returns SHISHI_OK iff successful.

      Applications that run uninteractively may need keying material. In these cases, the keys are stored in a file, a file that is normally stored on the local host. The file should be protected from unauthorized access. The file is in ASCII format and contains keys as outputed by shishi_key_print. All functions that handle these keys sets are described now.

      shishi_keys

      — Function: int shishi_keys (Shishi * handle, Shishi_keys ** keys)

      handle: shishi handle as allocated by shishi_init().

      keys: output pointer to newly allocated keys handle.

      Get a new key set handle.

      Return value: Returns SHISHI_OK iff successful.

      shishi_keys_done

      — Function: void shishi_keys_done (Shishi_keys ** keys)

      keys: key set handle as allocated by shishi_keys().

      Deallocates all resources associated with key set. The key set handle must not be used in calls to other shishi_keys_*() functions after this.

      shishi_keys_size

      — Function: int shishi_keys_size (Shishi_keys * keys)

      keys: key set handle as allocated by shishi_keys().

      Get size of key set.

      Return value: Returns number of keys stored in key set.

      shishi_keys_nth

      — Function: const Shishi_key * shishi_keys_nth (Shishi_keys * keys, int keyno)

      keys: key set handle as allocated by shishi_keys().

      keyno: integer indicating requested key in key set.

      Get the n: th ticket in key set.

      Return value: Returns a key handle to the keyno:th key in the key set, or NULL if keys is invalid or keyno is out of bounds. The first key is keyno 0, the second key keyno 1, and so on.

      shishi_keys_remove

      — Function: void shishi_keys_remove (Shishi_keys * keys, int keyno)

      keys: key set handle as allocated by shishi_keys().

      keyno: key number of key in the set to remove. The first key is key number 0.

      Remove a key, indexed by keyno, in given key set.

      shishi_keys_add

      — Function: int shishi_keys_add (Shishi_keys * keys, Shishi_key * key)

      keys: key set handle as allocated by shishi_keys().

      key: key to be added to key set.

      Add a key to the key set. A deep copy of the key is stored, so changing key, or deallocating it, will not modify the value stored in the key set.

      Return value: Returns SHISHI_OK iff successful.

      shishi_keys_print

      — Function: int shishi_keys_print (Shishi_keys * keys, FILE * fh)

      keys: key set to print.

      fh: file handle, open for writing, to print keys to.

      Print all keys in set using shishi_key_print.

      Returns: Returns SHISHI_OK on success.

      shishi_keys_to_file

      — Function: int shishi_keys_to_file (Shishi * handle, const char * filename, Shishi_keys * keys)

      handle: shishi handle as allocated by shishi_init().

      filename: filename to append key to.

      keys: set of keys to print.

      Print an ASCII representation of a key structure to a file, for each key in the key set. The file is appended to if it exists. See shishi_key_print() for the format of the output.

      Return value: Returns SHISHI_OK iff successful.

      shishi_keys_from_file

      — Function: int shishi_keys_from_file (Shishi_keys * keys, const char * filename)

      keys: key set handle as allocated by shishi_keys().

      filename: filename to read keys from.

      Read zero or more keys from file filename and append them to the keyset keys. See shishi_key_print() for the format of the input.

      Return value: Returns SHISHI_OK iff successful.

      Since: 0.0.42

      shishi_keys_for_serverrealm_in_file

      — Function: Shishi_key * shishi_keys_for_serverrealm_in_file (Shishi * handle, const char * filename, const char * server, const char * realm)

      handle: Shishi library handle create by shishi_init().

      filename: file to read keys from.

      server: server name to get key for.

      realm: realm of server to get key for.

      Get keys that match specified server and realm from the key set file filename.

      Return value: Returns the key for specific server and realm, read from the indicated file, or NULL if no key could be found or an error encountered.

      shishi_keys_for_server_in_file

      — Function: Shishi_key * shishi_keys_for_server_in_file (Shishi * handle, const char * filename, const char * server)

      handle: Shishi library handle create by shishi_init().

      filename: file to read keys from.

      server: server name to get key for.

      Get key for specified server from filename.

      Return value: Returns the key for specific server, read from the indicated file, or NULL if no key could be found or an error encountered.

      shishi_keys_for_localservicerealm_in_file

      — Function: Shishi_key * shishi_keys_for_localservicerealm_in_file (Shishi * handle, const char * filename, const char * service, const char * realm)

      handle: Shishi library handle create by shishi_init().

      filename: file to read keys from.

      service: service to get key for.

      realm: realm of server to get key for, or NULL for default realm.

      Get key for specified service and realm from filename.

      Return value: Returns the key for the server "SERVICE/HOSTNAMEREALM" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

      The previous functions require that the filename is known. For some applications, servers, it makes sense to provide a system default. These key sets used by server applications are known as “hostkeys”. Here are the functions that operate on hostkeys (they are mostly wrappers around generic key sets).

      shishi_hostkeys_default_file

      — Function: const char * shishi_hostkeys_default_file (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get file name of default host key file.

      Return value: Returns the default host key filename used in the library. (Not a copy of it, so don't modify or deallocate it.)

      shishi_hostkeys_default_file_set

      — Function: void shishi_hostkeys_default_file_set (Shishi * handle, const char * hostkeysfile)

      handle: Shishi library handle create by shishi_init().

      hostkeysfile: string with new default hostkeys file name, or NULL to reset to default.

      Set the default host key filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_hostkeys_for_server

      — Function: Shishi_key * shishi_hostkeys_for_server (Shishi * handle, const char * server)

      handle: Shishi library handle create by shishi_init().

      server: server name to get key for

      Get host key for server.

      Return value: Returns the key for specific server, read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

      shishi_hostkeys_for_serverrealm

      — Function: Shishi_key * shishi_hostkeys_for_serverrealm (Shishi * handle, const char * server, const char * realm)

      handle: Shishi library handle create by shishi_init().

      server: server name to get key for

      realm: realm of server to get key for.

      Get host key for server in realm.

      Return value: Returns the key for specific server and realm, read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

      shishi_hostkeys_for_localservicerealm

      — Function: Shishi_key * shishi_hostkeys_for_localservicerealm (Shishi * handle, const char * service, const char * realm)

      handle: Shishi library handle create by shishi_init().

      service: service to get key for.

      realm: realm of server to get key for, or NULL for default realm.

      Get host key for service on current host in realm.

      Return value: Returns the key for the server "SERVICE/HOSTNAMEREALM" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

      shishi_hostkeys_for_localservice

      — Function: Shishi_key * shishi_hostkeys_for_localservice (Shishi * handle, const char * service)

      handle: Shishi library handle create by shishi_init().

      service: service to get key for.

      Get host key for service on current host in default realm.

      Return value: Returns the key for the server "SERVICE/HOSTNAME" (where HOSTNAME is the current system's hostname), read from the default host keys file (see shishi_hostkeys_default_file()), or NULL if no key could be found or an error encountered.

      After creating the key structure, it can be used to encrypt and decrypt data, calculate checksum on data etc. All available functions are described now.

      shishi_cipher_supported_p

      — Function: int shishi_cipher_supported_p (int32_t type)

      type: encryption type, see Shishi_etype.

      Find out if cipher is supported.

      Return value: Return 0 iff cipher is unsupported.

      shishi_cipher_name

      — Function: const char * shishi_cipher_name (int32_t type)

      type: encryption type, see Shishi_etype.

      Read humanly readable string for cipher.

      Return value: Return name of encryption type, e.g. "des3-cbc-sha1-kd", as defined in the standards.

      shishi_cipher_blocksize

      — Function: int shishi_cipher_blocksize (int32_t type)

      type: encryption type, see Shishi_etype.

      Get block size for cipher.

      Return value: Return block size for encryption type, as defined in the standards.

      shishi_cipher_confoundersize

      — Function: int shishi_cipher_confoundersize (int32_t type)

      type: encryption type, see Shishi_etype.

      Get length of confounder for cipher.

      Return value: Returns the size of the confounder (random data) for encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

      shishi_cipher_keylen

      — Function: size_t shishi_cipher_keylen (int32_t type)

      type: encryption type, see Shishi_etype.

      Get key length for cipher.

      Return value: Return length of key used for the encryption type, as defined in the standards.

      shishi_cipher_randomlen

      — Function: size_t shishi_cipher_randomlen (int32_t type)

      type: encryption type, see Shishi_etype.

      Get length of random data for cipher.

      Return value: Return length of random used for the encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

      shishi_cipher_defaultcksumtype

      — Function: int shishi_cipher_defaultcksumtype (int32_t type)

      type: encryption type, see Shishi_etype.

      Get the default checksum associated with cipher.

      Return value: Return associated checksum mechanism for the encryption type, as defined in the standards.

      shishi_cipher_parse

      — Function: int shishi_cipher_parse (const char * cipher)

      cipher: name of encryption type, e.g. "des3-cbc-sha1-kd".

      Get cipher number by parsing string.

      Return value: Return encryption type corresponding to a string.

      shishi_checksum_supported_p

      — Function: int shishi_checksum_supported_p (int32_t type)

      type: checksum type, see Shishi_cksumtype.

      Find out whether checksum is supported.

      Return value: Return 0 iff checksum is unsupported.

      shishi_checksum_name

      — Function: const char * shishi_checksum_name (int32_t type)

      type: checksum type, see Shishi_cksumtype.

      Get name of checksum.

      Return value: Return name of checksum type, e.g. "hmac-sha1-96-aes256", as defined in the standards.

      shishi_checksum_cksumlen

      — Function: size_t shishi_checksum_cksumlen (int32_t type)

      type: checksum type, see Shishi_cksumtype.

      Get length of checksum output.

      Return value: Return length of checksum used for the checksum type, as defined in the standards.

      shishi_checksum_parse

      — Function: int shishi_checksum_parse (const char * checksum)

      checksum: name of checksum type, e.g. "hmac-sha1-96-aes256".

      Get checksum number by parsing a string.

      Return value: Return checksum type, see Shishi_cksumtype, corresponding to a string.

      shishi_string_to_key

      — Function: int shishi_string_to_key (Shishi * handle, int32_t keytype, const char * password, size_t passwordlen, const char * salt, size_t saltlen, const char * parameter, Shishi_key * outkey)

      handle: shishi handle as allocated by shishi_init().

      keytype: cryptographic encryption type, see Shishi_etype.

      password: input array with password.

      passwordlen: length of input array with password.

      salt: input array with salt.

      saltlen: length of input array with salt.

      parameter: input array with opaque encryption type specific information.

      outkey: allocated key handle that will contain new key.

      Derive key from a string (password) and salt (commonly concatenation of realm and principal) for specified key type, and set the type and value in the given key to the computed values. The parameter value is specific for each keytype, and can be set if the parameter information is not available.

      Return value: Returns SHISHI_OK iff successful.

      shishi_random_to_key

      — Function: int shishi_random_to_key (Shishi * handle, int32_t keytype, const char * rnd, size_t rndlen, Shishi_key * outkey)

      handle: shishi handle as allocated by shishi_init().

      keytype: cryptographic encryption type, see Shishi_etype.

      rnd: input array with random data.

      rndlen: length of input array with random data.

      outkey: allocated key handle that will contain new key.

      Derive key from random data for specified key type, and set the type and value in the given key to the computed values.

      Return value: Returns SHISHI_OK iff successful.

      shishi_checksum

      — Function: int shishi_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to compute checksum with.

      keyusage: integer specifying what this key is used for.

      cksumtype: the checksum algorithm to use.

      in: input array with data to integrity protect.

      inlen: size of input array with data to integrity protect.

      out: output array with newly allocated integrity protected data.

      outlen: output variable with length of output array with checksum.

      Integrity protect data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_verify

      — Function: int shishi_verify (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char * in, size_t inlen, const char * cksum, size_t cksumlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to verify checksum with.

      keyusage: integer specifying what this key is used for.

      cksumtype: the checksum algorithm to use.

      in: input array with data that was integrity protected.

      inlen: size of input array with data that was integrity protected.

      cksum: input array with alleged checksum of data.

      cksumlen: size of input array with alleged checksum of data.

      Verify checksum of data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt_ivupdate_etype

      — Function: int shishi_encrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * iv, size_t ivlen, char ** ivout, size_t * ivoutlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      etype: integer specifying what cipher to use.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      ivout: output array with newly allocated updated initialization vector.

      ivoutlen: size of output array with updated initialization vector.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt_iv_etype

      — Function: int shishi_encrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * iv, size_t ivlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      etype: integer specifying what cipher to use.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt_etype

      — Function: int shishi_encrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      etype: integer specifying what cipher to use.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt_ivupdate

      — Function: int shishi_encrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char * iv, size_t ivlen, char ** ivout, size_t * ivoutlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      ivout: output array with newly allocated updated initialization vector.

      ivoutlen: size of output array with updated initialization vector.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt_iv

      — Function: int shishi_encrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char * iv, size_t ivlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_encrypt

      — Function: int shishi_encrypt (Shishi * handle, Shishi_key * key, int keyusage, char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key is encrypting.

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypts data using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt_ivupdate_etype

      — Function: int shishi_decrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * iv, size_t ivlen, char ** ivout, size_t * ivoutlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      etype: integer specifying what cipher to use.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      ivout: output array with newly allocated updated initialization vector.

      ivoutlen: size of output array with updated initialization vector.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt_iv_etype

      — Function: int shishi_decrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * iv, size_t ivlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      etype: integer specifying what cipher to use.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt_etype

      — Function: int shishi_decrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      etype: integer specifying what cipher to use.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data as per encryption method using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt_ivupdate

      — Function: int shishi_decrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char * iv, size_t ivlen, char ** ivout, size_t * ivoutlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      ivout: output array with newly allocated updated initialization vector.

      ivoutlen: size of output array with updated initialization vector.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt_iv

      — Function: int shishi_decrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char * iv, size_t ivlen, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_decrypt

      — Function: int shishi_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char * in, size_t inlen, char ** out, size_t * outlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to decrypt with.

      keyusage: integer specifying what this key is decrypting.

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypts data specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate if you need it.

      Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

      Return value: Returns SHISHI_OK iff successful.

      shishi_n_fold

      — Function: int shishi_n_fold (Shishi * handle, const char * in, size_t inlen, char * out, size_t outlen)

      handle: shishi handle as allocated by shishi_init().

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt ("M").

      out: output array with decrypted data.

      outlen: size of output array ("N").

      Fold data into a fixed length output array, with the intent to give each input bit approximately equal weight in determining the value of each output bit.

      The algorithm is from "A Better Key Schedule For DES-like Ciphers" by Uri Blumenthal and Steven M. Bellovin, http://www.research.att.com/~smb/papers/ides.pdf, although the sample vectors provided by the paper are incorrect.

      Return value: Returns SHISHI_OK iff successful.

      shishi_dr

      — Function: int shishi_dr (Shishi * handle, Shishi_key * key, const char * prfconstant, size_t prfconstantlen, char * derivedrandom, size_t derivedrandomlen)

      handle: shishi handle as allocated by shishi_init().

      key: input array with cryptographic key to use.

      prfconstant: input array with the constant string.

      prfconstantlen: size of input array with the constant string.

      derivedrandom: output array with derived random data.

      derivedrandomlen: size of output array with derived random data.

      Derive "random" data from a key and a constant thusly: DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, SHISHI_ENCRYPT(KEY, PRFCONSTANT)).

      Return value: Returns SHISHI_OK iff successful.

      shishi_dk

      — Function: int shishi_dk (Shishi * handle, Shishi_key * key, const char * prfconstant, size_t prfconstantlen, Shishi_key * derivedkey)

      handle: shishi handle as allocated by shishi_init().

      key: input cryptographic key to use.

      prfconstant: input array with the constant string.

      prfconstantlen: size of input array with the constant string.

      derivedkey: pointer to derived key (allocated by caller).

      Derive a key from a key and a constant thusly: DK(KEY, PRFCONSTANT) = SHISHI_RANDOM-TO-KEY(SHISHI_DR(KEY, PRFCONSTANT)).

      Return value: Returns SHISHI_OK iff successful.

      An easier way to use encryption and decryption if your application repeatedly calls, e.g., shishi_encrypt_ivupdate, is to use the following functions. They store the key, initialization vector, etc, in a context, and the encryption and decryption operations update the IV within the context automatically.

      shishi_crypto

      — Function: Shishi_crypto * shishi_crypto (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char * iv, size_t ivlen)

      handle: shishi handle as allocated by shishi_init().

      key: key to encrypt with.

      keyusage: integer specifying what this key will encrypt/decrypt.

      etype: integer specifying what cipher to use.

      iv: input array with initialization vector

      ivlen: size of input array with initialization vector.

      Initialize a crypto context. This store a key, keyusage, encryption type and initialization vector in a "context", and the caller can then use this context to perform encryption via shishi_crypto_encrypt() and decryption via shishi_crypto_encrypt() without supplying all those details again. The functions also takes care of propagating the IV between calls.

      When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

      Return value: Return a newly allocated crypto context.

      shishi_crypto_encrypt

      — Function: int shishi_crypto_encrypt (Shishi_crypto * ctx, const char * in, size_t inlen, char ** out, size_t * outlen)

      ctx: crypto context as returned by shishi_crypto().

      in: input array with data to encrypt.

      inlen: size of input array with data to encrypt.

      out: output array with newly allocated encrypted data.

      outlen: output variable with size of newly allocated output array.

      Encrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

      When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

      Return value: Returns SHISHI_OK iff successful.

      shishi_crypto_decrypt

      — Function: int shishi_crypto_decrypt (Shishi_crypto * ctx, const char * in, size_t inlen, char ** out, size_t * outlen)

      ctx: crypto context as returned by shishi_crypto().

      in: input array with data to decrypt.

      inlen: size of input array with data to decrypt.

      out: output array with newly allocated decrypted data.

      outlen: output variable with size of newly allocated output array.

      Decrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

      When the application no longer need to use the context, it should deallocate resources associated with it by calling shishi_crypto_close().

      Return value: Returns SHISHI_OK iff successful.

      shishi_crypto_close

      — Function: void shishi_crypto_close (Shishi_crypto * ctx)

      ctx: crypto context as returned by shishi_crypto().

      Deallocate resources associated with the crypto context.

      Also included in Shishi is an interface to the really low-level cryptographic primitives. They map directly on the underlying cryptographic library used (i.e., Gnulib or Libgcrypt) and is used internally by Shishi.

      shishi_randomize

      — Function: int shishi_randomize (Shishi * handle, int strong, void * data, size_t datalen)

      handle: shishi handle as allocated by shishi_init().

      strong: 0 iff operation should not block, non-0 for very strong randomness.

      data: output array to be filled with random data.

      datalen: size of output array.

      Store cryptographically random data of given size in the provided buffer.

      Return value: Returns SHISHI_OK iff successful.

      shishi_crc

      — Function: int shishi_crc (Shishi * handle, const char * in, size_t inlen, char * out[4])

      handle: shishi handle as allocated by shishi_init().

      in: input character array of data to checksum.

      inlen: length of input character array of data to checksum.

      Compute checksum of data using CRC32 modified according to RFC 1510. The out buffer must be deallocated by the caller.

      The modifications compared to standard CRC32 is that no initial and final XOR is performed, and that the output is returned in LSB-first order.

      Return value: Returns SHISHI_OK iff successful.

      shishi_md4

      — Function: int shishi_md4 (Shishi * handle, const char * in, size_t inlen, char * out[16])

      handle: shishi handle as allocated by shishi_init().

      in: input character array of data to hash.

      inlen: length of input character array of data to hash.

      Compute hash of data using MD4. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_md5

      — Function: int shishi_md5 (Shishi * handle, const char * in, size_t inlen, char * out[16])

      handle: shishi handle as allocated by shishi_init().

      in: input character array of data to hash.

      inlen: length of input character array of data to hash.

      Compute hash of data using MD5. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_hmac_md5

      — Function: int shishi_hmac_md5 (Shishi * handle, const char * key, size_t keylen, const char * in, size_t inlen, char * outhash[16])

      handle: shishi handle as allocated by shishi_init().

      key: input character array with key to use.

      keylen: length of input character array with key to use.

      in: input character array of data to hash.

      inlen: length of input character array of data to hash.

      Compute keyed checksum of data using HMAC-MD5. The outhash buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_hmac_sha1

      — Function: int shishi_hmac_sha1 (Shishi * handle, const char * key, size_t keylen, const char * in, size_t inlen, char * outhash[20])

      handle: shishi handle as allocated by shishi_init().

      key: input character array with key to use.

      keylen: length of input character array with key to use.

      in: input character array of data to hash.

      inlen: length of input character array of data to hash.

      Compute keyed checksum of data using HMAC-SHA1. The outhash buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_des_cbc_mac

      — Function: int shishi_des_cbc_mac (Shishi * handle, const char key[8], const char iv[8], const char * in, size_t inlen, char * out[8])

      handle: shishi handle as allocated by shishi_init().

      in: input character array of data to hash.

      inlen: length of input character array of data to hash.

      Computed keyed checksum of data using DES-CBC-MAC. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_arcfour

      — Function: int shishi_arcfour (Shishi * handle, int decryptp, const char * key, size_t keylen, const char iv[258], char * ivout[258], const char * in, size_t inlen, char ** out)

      handle: shishi handle as allocated by shishi_init().

      decryptp: 0 to indicate encryption, non-0 to indicate decryption.

      key: input character array with key to use.

      keylen: length of input key array.

      in: input character array of data to encrypt/decrypt.

      inlen: length of input character array of data to encrypt/decrypt.

      out: newly allocated character array with encrypted/decrypted data.

      Encrypt or decrypt data (depending on decryptp) using ARCFOUR. The out buffer must be deallocated by the caller.

      The "initialization vector" used here is the concatenation of the sbox and i and j, and is thus always of size 256 + 1 + 1. This is a slight abuse of terminology, and assumes you know what you are doing. Don't use it if you can avoid to.

      Return value: Returns SHISHI_OK iff successful.

      shishi_des

      — Function: int shishi_des (Shishi * handle, int decryptp, const char key[8], const char iv[8], char * ivout[8], const char * in, size_t inlen, char ** out)

      handle: shishi handle as allocated by shishi_init().

      decryptp: 0 to indicate encryption, non-0 to indicate decryption.

      in: input character array of data to encrypt/decrypt.

      inlen: length of input character array of data to encrypt/decrypt.

      out: newly allocated character array with encrypted/decrypted data.

      Encrypt or decrypt data (depending on decryptp) using DES in CBC mode. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_3des

      — Function: int shishi_3des (Shishi * handle, int decryptp, const char key[8], const char iv[8], char * ivout[8], const char * in, size_t inlen, char ** out)

      handle: shishi handle as allocated by shishi_init().

      decryptp: 0 to indicate encryption, non-0 to indicate decryption.

      in: input character array of data to encrypt/decrypt.

      inlen: length of input character array of data to encrypt/decrypt.

      out: newly allocated character array with encrypted/decrypted data.

      Encrypt or decrypt data (depending on decryptp) using 3DES in CBC mode. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_aes_cts

      — Function: int shishi_aes_cts (Shishi * handle, int decryptp, const char * key, size_t keylen, const char iv[16], char * ivout[16], const char * in, size_t inlen, char ** out)

      handle: shishi handle as allocated by shishi_init().

      decryptp: 0 to indicate encryption, non-0 to indicate decryption.

      key: input character array with key to use.

      keylen: length of input character array with key to use.

      in: input character array of data to encrypt/decrypt.

      inlen: length of input character array of data to encrypt/decrypt.

      out: newly allocated character array with encrypted/decrypted data.

      Encrypt or decrypt data (depending on decryptp) using AES in CBC-CTS mode. The length of the key, keylen, decide if AES 128 or AES 256 should be used. The out buffer must be deallocated by the caller.

      Return value: Returns SHISHI_OK iff successful.

      shishi_pbkdf2_sha1

      — Function: int shishi_pbkdf2_sha1 (Shishi * handle, const char * P, size_t Plen, const char * S, size_t Slen, unsigned int c, unsigned int dkLen, char * DK)

      handle: shishi handle as allocated by shishi_init().

      P: input password, an octet string

      Plen: length of password, an octet string

      S: input salt, an octet string

      Slen: length of salt, an octet string

      c: iteration count, a positive integer

      dkLen: intended length in octets of the derived key, a positive integer, at most (2^32 - 1) * hLen. The DK array must have room for this many characters.

      DK: output derived key, a dkLen-octet string

      Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a pseudorandom function to derive keys. The length of the derived key is essentially unbounded. (However, the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function, which is this function is always SHA1.)

      Return value: Returns SHISHI_OK iff successful.

      5.14 X.509 Functions

      The functions described in this section are used by the STARTTLS functionality, see Kerberos via TLS.

      shishi_x509ca_default_file_guess

      — Function: char * shishi_x509ca_default_file_guess (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Guesses the default X.509 CA certificate filename; it is $HOME/.shishi/client.ca.

      Return value: Returns default X.509 client certificate filename as a string that has to be deallocated with free() by the caller.

      shishi_x509ca_default_file_set

      — Function: void shishi_x509ca_default_file_set (Shishi * handle, const char * x509cafile)

      handle: Shishi library handle create by shishi_init().

      x509cafile: string with new default x509 client certificate file name, or NULL to reset to default.

      Set the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_x509ca_default_file

      — Function: const char * shishi_x509ca_default_file (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get filename for default X.509 CA certificate.

      Return value: Returns the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is not a copy, so don't modify or deallocate it.

      shishi_x509cert_default_file_guess

      — Function: char * shishi_x509cert_default_file_guess (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Guesses the default X.509 client certificate filename; it is $HOME/.shishi/client.certs.

      Return value: Returns default X.509 client certificate filename as a string that has to be deallocated with free() by the caller.

      shishi_x509cert_default_file_set

      — Function: void shishi_x509cert_default_file_set (Shishi * handle, const char * x509certfile)

      handle: Shishi library handle create by shishi_init().

      x509certfile: string with new default x509 client certificate file name, or NULL to reset to default.

      Set the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_x509cert_default_file

      — Function: const char * shishi_x509cert_default_file (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get filename for default X.509 certificate.

      Return value: Returns the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

      shishi_x509key_default_file_guess

      — Function: char * shishi_x509key_default_file_guess (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Guesses the default X.509 client key filename; it is $HOME/.shishi/client.key.

      Return value: Returns default X.509 client key filename as a string that has to be deallocated with free() by the caller.

      shishi_x509key_default_file_set

      — Function: void shishi_x509key_default_file_set (Shishi * handle, const char * x509keyfile)

      handle: Shishi library handle create by shishi_init().

      x509keyfile: string with new default x509 client key file name, or NULL to reset to default.

      Set the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_x509key_default_file

      — Function: const char * shishi_x509key_default_file (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get filename for default X.509 key.

      Return value: Returns the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

      5.15 Utility Functions

      shishi_realm_default_guess

      — Function: char * shishi_realm_default_guess ( void)

      Guesses a realm based on getdomainname() (which really is NIS/YP domain, but if it is set it might be a good guess), or if it fails, based on gethostname(), or if it fails, the string "could-not-guess-default-realm". Note that the hostname is not trimmed off of the data returned by gethostname() to get the domain name and use that as the realm.

      Return value: Returns guessed realm for host as a string that has to be deallocated with free() by the caller.

      shishi_realm_default

      — Function: const char * shishi_realm_default (Shishi * handle)

      handle: Shishi library handle create by shishi_init().

      Get name of default realm.

      Return value: Returns the default realm used in the library. (Not a copy of it, so don't modify or deallocate it.)

      shishi_realm_default_set

      — Function: void shishi_realm_default_set (Shishi * handle, const char * realm)

      handle: Shishi library handle create by shishi_init().

      realm: string with new default realm name, or NULL to reset to default.

      Set the default realm used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_realm_for_server_file

      — Function: char * shishi_realm_for_server_file (Shishi * handle, char * server)

      handle: Shishi library handle create by shishi_init().

      server: hostname to find realm for.

      Find realm for a host using configuration file.

      Return value: Returns realm for host, or NULL if not found.

      shishi_realm_for_server_dns

      — Function: char * shishi_realm_for_server_dns (Shishi * handle, char * server)

      handle: Shishi library handle create by shishi_init().

      server: hostname to find realm for.

      Find realm for a host using DNS lookups, according to draft-ietf-krb-wg-krb-dns-locate-03.txt. Since DNS lookups may be spoofed, relying on the realm information may result in a redirection attack. In a single-realm scenario, this only achieves a denial of service, but with cross-realm trust it may redirect you to a compromised realm. For this reason, Shishi prints a warning, suggesting that the user should add the proper 'server-realm' configuration tokens instead.

      To illustrate the DNS information used, here is an extract from a zone file for the domain ASDF.COM:

      _kerberos.asdf.com. IN TXT "ASDF.COM" _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM"

      Let us suppose that in this case, a client wishes to use a service on the host foo.asdf.com. It would first query:

      _kerberos.foo.asdf.com. IN TXT

      Finding no match, it would then query:

      _kerberos.asdf.com. IN TXT

      Return value: Returns realm for host, or NULL if not found.

      shishi_realm_for_server

      — Function: char * shishi_realm_for_server (Shishi * handle, char * server)

      handle: Shishi library handle create by shishi_init().

      server: hostname to find realm for.

      Find realm for a host, using various methods. Currently this includes static configuration files (see shishi_realm_for_server_file()) and DNS (see shishi_realm_for_server_dns()).

      Return value: Returns realm for host, or NULL if not found.

      shishi_principal_default_guess

      — Function: char * shishi_principal_default_guess ( void)

      Guesses the principal name for the user, looking at environment variables SHISHI_USER, USER and LOGNAME, or if that fails, returns the string "user".

      Return value: Returns guessed default principal for user as a string that has to be deallocated by the caller with free().

      shishi_principal_default

      — Function: const char * shishi_principal_default (Shishi * handle)

      handle: Shishi library handle created by shishi_init().

      The default principal name is the name in the environment variable USER, or LOGNAME for some systems, but it can be overridden by specifying the environment variable SHISHI_USER.

      Return value: Returns the default principal name used by the library. (Not a copy of it, so don't modify or deallocate it.)

      shishi_principal_default_set

      — Function: void shishi_principal_default_set (Shishi * handle, const char * principal)

      handle: Shishi library handle created by shishi_init().

      principal: string with new default principal name, or NULL to reset to default.

      Set the default principal used by the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

      shishi_parse_name

      — Function: int shishi_parse_name (Shishi * handle, const char * name, char ** principal, char ** realm)

      handle: Shishi library handle created by shishi_init().

      name: input principal name string, e.g. imap/mail.gnu.org\GNU.ORG.

      principal: newly allocated output string with principal name.

      realm: newly allocated output string with realm name.

      Split principal name (e.g., "simon\JOSEFSSON.ORG") into two newly allocated strings, the principal ("simon"), and the realm ("JOSEFSSON.ORG"). If there is no realm part in name, realm is set to NULL.

      Return value: Returns SHISHI_INVALID_PRINCIPAL_NAME if name is NULL or ends with the escape character "\", and SHISHI_OK if successful.

      shishi_principal_name

      — Function: int shishi_principal_name (Shishi * handle, Shishi_asn1 namenode, const char * namefield, char ** out, size_t * outlen)

      handle: Shishi library handle created by shishi_init().

      namenode: ASN.1 structure with principal in namefield.

      namefield: name of field in namenode containing principal name.

      out: pointer to newly allocated, null terminated, string containing principal name. May be NULL (to only populate outlen).

      outlen: pointer to length of out on output, excluding terminating null. May be NULL (to only populate out).

      Represent principal name in ASN.1 structure as null-terminated string. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length outlen does not include the terminating null.

      Return value: Returns SHISHI_OK if successful.

      shishi_principal_name_realm

      — Function: int shishi_principal_name_realm (Shishi * handle, Shishi_asn1 namenode, const char * namefield, Shishi_asn1 realmnode, const char * realmfield, char ** out, size_t * outlen)

      handle: Shishi library handle created by shishi_init().

      namenode: ASN.1 structure with principal name in namefield.

      namefield: name of field in namenode containing principal name.

      realmnode: ASN.1 structure with principal realm in realmfield.

      realmfield: name of field in realmnode containing principal realm.

      out: pointer to newly allocated null terminated string containing principal name. May be NULL (to only populate outlen).

      outlen: pointer to length of out on output, excluding terminating null. May be NULL (to only populate out).

      Represent principal name and realm in ASN.1 structure as null-terminated string. The string is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length outlen does not include the terminating null character.

      Return value: Returns SHISHI_OK if successful.

      shishi_principal_name_set

      — Function: int shishi_principal_name_set (Shishi * handle, Shishi_asn1 namenode, const char * namefield, Shishi_name_type name_type, const char * [] name)

      handle: shishi handle as allocated by shishi_init().

      namenode: ASN.1 structure with principal in namefield.

      namefield: name of field in namenode containing principal name.

      name_type: type of principal, see Shishi_name_type, usually SHISHI_NT_UNKNOWN.

      name: null-terminated input array with principal name.

      Set the given principal name field to the given name.

      Return value: Returns SHISHI_OK if successful.

      shishi_principal_set

      — Function: int shishi_principal_set (Shishi * handle, Shishi_asn1 namenode, const char * namefield, const char * name)

      handle: shishi handle as allocated by shishi_init().

      namenode: ASN.1 structure with principal in namefield.

      namefield: name of field in namenode containing principal name.

      name: null-terminated string with principal name in RFC 1964 form.

      Set principal name field in an ASN.1 structure to the given name.

      Return value: Returns SHISHI_OK if successful.

      shishi_derive_default_salt

      — Function: int shishi_derive_default_salt (Shishi * handle, const char * name, char ** salt)

      handle: shishi handle as allocated by shishi_init().

      name: principal name of user.

      salt: output variable with newly allocated salt string.

      Derive the default salt from a principal. The default salt is the concatenation of the decoded realm and the principal.

      Return value: Return SHISHI_OK if successful.

      shishi_server_for_local_service

      — Function: char * shishi_server_for_local_service (Shishi * handle, const char * service)

      handle: shishi handle as allocated by shishi_init().

      service: null terminated string with name of service, e.g., "host".

      Construct a service principal (e.g., "imap/yxa.extuno.com") based on supplied service name (i.e., "imap") and the system's hostname as returned by hostname() (i.e., "yxa.extundo.com"). The string must be deallocated by the caller.

      Return value: Return newly allocated service name string.

      shishi_authorize_strcmp

      — Function: int shishi_authorize_strcmp (Shishi * handle, const char * principal, const char * authzname)

      handle: shishi handle allocated by shishi_init().

      principal: string with desired principal name.

      authzname: authorization name.

      Authorization of authzname against desired principal according to "basic" authentication, i.e., testing for identical strings.

      Return value: Returns 1 if authzname is authorized for services by the encrypted principal, and 0 otherwise.

      shishi_authorize_k5login

      — Function: int shishi_authorize_k5login (Shishi * handle, const char * principal, const char * authzname)

      handle: shishi handle allocated by shishi_init().

      principal: string with desired principal name and realm.

      authzname: authorization name.

      Authorization of authzname against desired principal in accordance with the MIT/Heimdal authorization method.

      Return value: Returns 1 if authzname is authorized for services by principal, and returns 0 otherwise.

      shishi_authorization_parse

      — Function: int shishi_authorization_parse (const char * authorization)

      authorization: name of authorization type, "basic" or "k5login".

      Parse authorization type name.

      Return value: Returns authorization type corresponding to a string.

      shishi_authorized_p

      — Function: int shishi_authorized_p (Shishi * handle, Shishi_tkt * tkt, const char * authzname)

      handle: shishi handle allocated by shishi_init().

      tkt: input variable with ticket info.

      authzname: authorization name.

      Simplistic authorization of authzname against encrypted client principal name inside ticket. For "basic" authentication type, the principal name must coincide with authzname. The "k5login" authentication type attempts the MIT/Heimdal method of parsing the file "~/.k5login" for additional equivalence names.

      Return value: Returns 1 if authzname is authorized for services by the encrypted principal, and 0 otherwise.

      shishi_generalize_time

      — Function: const char * shishi_generalize_time (Shishi * handle, time_t t)

      handle: shishi handle as allocated by shishi_init().

      t: C time to convert.

      Convert C time to KerberosTime. The string must not be deallocate by caller.

      Return value: Return a KerberosTime time string corresponding to C time t.

      shishi_generalize_now

      — Function: const char * shishi_generalize_now (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Convert current time to KerberosTime. The string must not be deallocate by caller.

      Return value: Return a KerberosTime time string corresponding to current time.

      shishi_generalize_ctime

      — Function: time_t shishi_generalize_ctime (Shishi * handle, const char * t)

      handle: shishi handle as allocated by shishi_init().

      t: KerberosTime to convert.

      Convert KerberosTime to C time.

      Return value: Returns C time corresponding to KerberosTime t.

      shishi_time

      — Function: int shishi_time (Shishi * handle, Shishi_asn1 node, const char * field, char ** t)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 node to get time from.

      field: Name of field in ASN.1 node to get time from.

      t: newly allocated output array with zero terminated time string.

      Extract time from ASN.1 structure.

      Return value: Returns SHISHI_OK iff successful.

      shishi_ctime

      — Function: int shishi_ctime (Shishi * handle, Shishi_asn1 node, const char * field, time_t * t)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 variable to read field from.

      field: name of field in node to read.

      t: pointer to time field to set.

      Extract time from ASN.1 structure.

      Return value: Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

      shishi_prompt_password_callback_set

      — Function: void shishi_prompt_password_callback_set (Shishi * handle, shishi_prompt_password_func cb)

      handle: shishi handle as allocated by shishi_init().

      cb: function pointer to application password callback, a shishi_prompt_password_func type.

      Set a callback function that will be used by shishi_prompt_password() to query the user for a password. The function pointer can be retrieved using shishi_prompt_password_callback_get().

      The cb function should follow the shishi_prompt_password_func prototype:

      int prompt_password (Shishi * handle, char **s, const char *format, va_list ap);

      If the function returns 0, the s variable should contain a newly allocated string with the password read from the user.

      shishi_prompt_password_callback_get

      — Function: shishi_prompt_password_func shishi_prompt_password_callback_get (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Get the application password prompt function callback as set by shishi_prompt_password_callback_set().

      Returns: Returns the callback, a shishi_prompt_password_func type, or NULL.

      shishi_prompt_password

      — Function: int shishi_prompt_password (Shishi * handle, char ** s, const char * format, ...)

      handle: shishi handle as allocated by shishi_init().

      s: pointer to newly allocated output string with read password.

      format: printf(3) style format string. ...: printf(3) style arguments.

      Format and print a prompt, and read a password from user. The password is possibly converted (e.g., converted from Latin-1 to UTF-8, or processed using Stringprep profile) following any "stringprocess" keywords in configuration files.

      Return value: Returns SHISHI_OK iff successful.

      shishi_resolv

      — Function: Shishi_dns shishi_resolv (const char * zone, uint16_t querytype)

      zone: owner name of data, e.g. "EXAMPLE.ORG"

      querytype: type of data to query for, e.g., SHISHI_DNS_TXT.

      Query DNS resolver for data of type querytype at owner name zone. Currently TXT and SRV types are supported.

      Return value: Returns linked list of DNS records, or NULL if query failed.

      shishi_resolv_free

      — Function: void shishi_resolv_free (Shishi_dns rrs)

      rrs: list of DNS RR as returned by shishi_resolv().

      Deallocate list of DNS RR as returned by shishi_resolv().

      5.16 ASN.1 Functions

      shishi_asn1_read_inline

      — Function: int shishi_asn1_read_inline (Shishi * handle, Shishi_asn1 node, const char * field, char * data, size_t * datalen)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 variable to read field from.

      field: name of field in node to read.

      data: pre-allocated output buffer that will hold ASN.1 field data.

      datalen: on input, maximum size of output buffer, on output, actual size of output buffer.

      Extract data stored in a ASN.1 field into a fixed size buffer allocated by caller.

      Note that since it is difficult to predict the length of the field, it is often better to use shishi_asn1_read() instead.

      Return value: Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

      shishi_asn1_read

      — Function: int shishi_asn1_read (Shishi * handle, Shishi_asn1 node, const char * field, char ** data, size_t * datalen)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 variable to read field from.

      field: name of field in node to read.

      data: newly allocated output buffer that will hold ASN.1 field data.

      datalen: actual size of output buffer.

      Extract data stored in a ASN.1 field into a newly allocated buffer. The buffer will always be zero terminated, even though datalen will not include the added zero.

      Return value: Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

      shishi_asn1_read_optional

      — Function: int shishi_asn1_read_optional (Shishi * handle, Shishi_asn1 node, const char * field, char ** data, size_t * datalen)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 variable to read field from.

      field: name of field in node to read.

      data: newly allocated output buffer that will hold ASN.1 field data.

      datalen: actual size of output buffer.

      Extract data stored in a ASN.1 field into a newly allocated buffer. If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this function set datalen to 0 and succeeds. Can be useful to read ASN.1 fields which are marked OPTIONAL in the grammar, if you want to avoid special error handling in your code.

      Return value: Returns SHISHI_OK if successful, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

      shishi_asn1_done

      — Function: void shishi_asn1_done (Shishi * handle, Shishi_asn1 node)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 node to dellocate.

      Deallocate resources associated with ASN.1 structure. Note that the node must not be used after this call.

      shishi_asn1_pa_enc_ts_enc

      — Function: Shishi_asn1 shishi_asn1_pa_enc_ts_enc (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for PA-ENC-TS-ENC.

      Return value: Returns ASN.1 structure.

      shishi_asn1_encrypteddata

      — Function: Shishi_asn1 shishi_asn1_encrypteddata (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for EncryptedData

      Return value: Returns ASN.1 structure.

      shishi_asn1_padata

      — Function: Shishi_asn1 shishi_asn1_padata (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for PA-DATA.

      Return value: Returns ASN.1 structure.

      shishi_asn1_methoddata

      — Function: Shishi_asn1 shishi_asn1_methoddata (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for METHOD-DATA.

      Return value: Returns ASN.1 structure.

      shishi_asn1_etype_info

      — Function: Shishi_asn1 shishi_asn1_etype_info (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for ETYPE-INFO.

      Return value: Returns ASN.1 structure.

      shishi_asn1_etype_info2

      — Function: Shishi_asn1 shishi_asn1_etype_info2 (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for ETYPE-INFO2.

      Return value: Returns ASN.1 structure.

      shishi_asn1_asreq

      — Function: Shishi_asn1 shishi_asn1_asreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for AS-REQ.

      Return value: Returns ASN.1 structure.

      shishi_asn1_asrep

      — Function: Shishi_asn1 shishi_asn1_asrep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for AS-REP.

      Return value: Returns ASN.1 structure.

      shishi_asn1_tgsreq

      — Function: Shishi_asn1 shishi_asn1_tgsreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for TGS-REQ.

      Return value: Returns ASN.1 structure.

      shishi_asn1_tgsrep

      — Function: Shishi_asn1 shishi_asn1_tgsrep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for TGS-REP.

      Return value: Returns ASN.1 structure.

      shishi_asn1_apreq

      — Function: Shishi_asn1 shishi_asn1_apreq (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for AP-REQ.

      Return value: Returns ASN.1 structure.

      shishi_asn1_aprep

      — Function: Shishi_asn1 shishi_asn1_aprep (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for AP-REP.

      Return value: Returns ASN.1 structure.

      shishi_asn1_encapreppart

      — Function: Shishi_asn1 shishi_asn1_encapreppart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for AP-REP.

      Return value: Returns ASN.1 structure.

      shishi_asn1_ticket

      — Function: Shishi_asn1 shishi_asn1_ticket (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for Ticket.

      Return value: Returns ASN.1 structure.

      shishi_asn1_encticketpart

      — Function: Shishi_asn1 shishi_asn1_encticketpart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for EncTicketPart.

      Return value: Returns ASN.1 structure.

      shishi_asn1_authenticator

      — Function: Shishi_asn1 shishi_asn1_authenticator (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for Authenticator.

      Return value: Returns ASN.1 structure.

      shishi_asn1_enckdcreppart

      — Function: Shishi_asn1 shishi_asn1_enckdcreppart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for EncKDCRepPart.

      Return value: Returns ASN.1 structure.

      shishi_asn1_encasreppart

      — Function: Shishi_asn1 shishi_asn1_encasreppart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for EncASRepPart.

      Return value: Returns ASN.1 structure.

      shishi_asn1_krberror

      — Function: Shishi_asn1 shishi_asn1_krberror (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for KRB-ERROR.

      Return value: Returns ASN.1 structure.

      shishi_asn1_krbsafe

      — Function: Shishi_asn1 shishi_asn1_krbsafe (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for KRB-SAFE.

      Return value: Returns ASN.1 structure.

      shishi_asn1_priv

      — Function: Shishi_asn1 shishi_asn1_priv (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for KRB-PRIV.

      Return value: Returns ASN.1 structure.

      shishi_asn1_encprivpart

      — Function: Shishi_asn1 shishi_asn1_encprivpart (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Create new ASN.1 structure for EncKrbPrivPart.

      Return value: Returns ASN.1 structure.

      shishi_asn1_to_der_field

      — Function: int shishi_asn1_to_der_field (Shishi * handle, Shishi_asn1 node, const char * field, char ** der, size_t * len)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 data that have field to extract.

      field: name of field in node to extract.

      der: output array that holds DER encoding of field in node.

      len: output variable with length of der output array.

      Extract newly allocated DER representation of specified ASN.1 field.

      Return value: Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

      shishi_asn1_to_der

      — Function: int shishi_asn1_to_der (Shishi * handle, Shishi_asn1 node, char ** der, size_t * len)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 data to convert to DER.

      der: output array that holds DER encoding of node.

      len: output variable with length of der output array.

      Extract newly allocated DER representation of specified ASN.1 data.

      Return value: Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

      shishi_asn1_msgtype

      — Function: Shishi_msgtype shishi_asn1_msgtype (Shishi * handle, Shishi_asn1 node)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 type to get msg type for.

      Determine msg-type of ASN.1 type of a packet. Currently this uses the msg-type field instead of the APPLICATION tag, but this may be changed in the future.

      Return value: Returns msg-type of ASN.1 type, 0 on failure.

      shishi_der_msgtype

      — Function: Shishi_msgtype shishi_der_msgtype (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Determine msg-type of DER coded data of a packet.

      Return value: Returns msg-type of DER data, 0 on failure.

      shishi_der2asn1

      — Function: Shishi_asn1 shishi_der2asn1 (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Convert arbitrary DER data of a packet to a ASN.1 type.

      Return value: Returns newly allocate ASN.1 corresponding to DER data, or NULL on failure.

      shishi_der2asn1_padata

      — Function: Shishi_asn1 shishi_der2asn1_padata (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of PA-DATA and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_methoddata

      — Function: Shishi_asn1 shishi_der2asn1_methoddata (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of METHOD-DATA and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_etype_info

      — Function: Shishi_asn1 shishi_der2asn1_etype_info (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of ETYPE-INFO and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_etype_info2

      — Function: Shishi_asn1 shishi_der2asn1_etype_info2 (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of ETYPE-INFO2 and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_ticket

      — Function: Shishi_asn1 shishi_der2asn1_ticket (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of Ticket and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_encticketpart

      — Function: Shishi_asn1 shishi_der2asn1_encticketpart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncTicketPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_asreq

      — Function: Shishi_asn1 shishi_der2asn1_asreq (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of AS-REQ and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_tgsreq

      — Function: Shishi_asn1 shishi_der2asn1_tgsreq (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of TGS-REQ and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_asrep

      — Function: Shishi_asn1 shishi_der2asn1_asrep (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of AS-REP and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_tgsrep

      — Function: Shishi_asn1 shishi_der2asn1_tgsrep (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of TGS-REP and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_kdcrep

      — Function: Shishi_asn1 shishi_der2asn1_kdcrep (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of KDC-REP and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_encasreppart

      — Function: Shishi_asn1 shishi_der2asn1_encasreppart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncASRepPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_enctgsreppart

      — Function: Shishi_asn1 shishi_der2asn1_enctgsreppart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncTGSRepPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_enckdcreppart

      — Function: Shishi_asn1 shishi_der2asn1_enckdcreppart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncKDCRepPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_authenticator

      — Function: Shishi_asn1 shishi_der2asn1_authenticator (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of Authenticator and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_krberror

      — Function: Shishi_asn1 shishi_der2asn1_krberror (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of KRB-ERROR and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_krbsafe

      — Function: Shishi_asn1 shishi_der2asn1_krbsafe (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of KRB-SAFE and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_priv

      — Function: Shishi_asn1 shishi_der2asn1_priv (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of KRB-PRIV and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_encprivpart

      — Function: Shishi_asn1 shishi_der2asn1_encprivpart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_apreq

      — Function: Shishi_asn1 shishi_der2asn1_apreq (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of AP-REQ and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_aprep

      — Function: Shishi_asn1 shishi_der2asn1_aprep (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of AP-REP and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_encapreppart

      — Function: Shishi_asn1 shishi_der2asn1_encapreppart (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of EncAPRepPart and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_der2asn1_kdcreq

      — Function: Shishi_asn1 shishi_der2asn1_kdcreq (Shishi * handle, const char * der, size_t derlen)

      handle: shishi handle as allocated by shishi_init().

      der: input character array with DER encoding.

      derlen: length of input character array with DER encoding.

      Decode DER encoding of AS-REQ, TGS-REQ or KDC-REQ and create a ASN.1 structure.

      Return value: Returns ASN.1 structure corresponding to DER data.

      shishi_asn1_print

      — Function: void shishi_asn1_print (Shishi * handle, Shishi_asn1 node, FILE * fh)

      handle: shishi handle as allocated by shishi_init().

      node: ASN.1 data that have field to extract.

      fh: file descriptor to print to, e.g. stdout.

      Print ASN.1 structure in human readable form, typically for debugging purposes.


      Next: , Previous: ASN.1 Functions, Up: Programming Manual

      5.17 Error Handling

      Most functions in `Libshishi' are returning an error if they fail. For this reason, the application should always catch the error condition and take appropriate measures, for example by releasing the resources and passing the error up to the caller, or by displaying a descriptive message to the user and cancelling the operation.

      Some error values do not indicate a system error or an error in the operation, but the result of an operation that failed properly.

      5.17.1 Error Values

      Errors are returned as an int. Except for the SHISHI_OK case, an application should always use the constants instead of their numeric value. Applications are encouraged to use the constants even for SHISHI_OK as it improves readability. Possible values are:

      SHISHI_OK
      This value indicates success. The value of this error is guaranteed to always be 0 so you may use it in boolean constructs.
      SHISHI_ASN1_ERROR
      Error in ASN.1 function (corrupt data?)
      SHISHI_FOPEN_ERROR
      Could not open file
      SHISHI_IO_ERROR
      File input/output error
      SHISHI_MALLOC_ERROR
      Memory allocation error in shishi library.
      SHISHI_BASE64_ERROR
      Base64 encoding or decoding failed. Data corrupt?
      SHISHI_REALM_MISMATCH
      Client realm value differ between request and reply.
      SHISHI_CNAME_MISMATCH
      Client name value differ between request and reply.
      SHISHI_NONCE_MISMATCH
      Replay protection value (nonce) differ between request and reply.
      SHISHI_TGSREP_BAD_KEYTYPE
      Incorrect key type used in TGS reply.
      SHISHI_KDCREP_BAD_KEYTYPE
      Incorrect key type used in reply from KDC.
      SHISHI_APREP_BAD_KEYTYPE
      Incorrect key type used in AP reply.
      SHISHI_APREP_VERIFY_FAILED
      Failed verification of AP reply.
      SHISHI_APREQ_BAD_KEYTYPE
      Incorrect key type used in AP request.
      SHISHI_TOO_SMALL_BUFFER
      Provided buffer was too small.
      SHISHI_DERIVEDKEY_TOO_SMALL
      Derived key material is too short to be applicable.
      SHISHI_KEY_TOO_LARGE
      The key is too large to be usable.
      SHISHI_CRYPTO_ERROR
      Low-level cryptographic primitive failed. This usually indicates bad password or data corruption.
      SHISHI_CRYPTO_INTERNAL_ERROR
      Internal error in low-level crypto routines.
      SHISHI_SOCKET_ERROR
      The system call socket() failed. This usually indicates that your system does not support the socket type.
      SHISHI_BIND_ERROR
      The system call bind() failed. This usually indicates insufficient permissions.
      SHISHI_SENDTO_ERROR
      The system call sendto() failed.
      SHISHI_RECVFROM_ERROR
      Error receiving data from server
      SHISHI_CLOSE_ERROR
      The system call close() failed.
      SHISHI_KDC_TIMEOUT
      Timed out talking to KDC. This usually indicates a network or KDC address problem.
      SHISHI_KDC_NOT_KNOWN_FOR_REALM
      No KDC known for given realm.
      SHISHI_TTY_ERROR
      No TTY assigned to process.
      SHISHI_GOT_KRBERROR
      Server replied to the request with an error message.
      SHISHI_HANDLE_ERROR
      Failure to use handle. Missing handle, or misconfigured.
      SHISHI_INVALID_TKTS
      Ticket set not initialized. This usually indicates an internal application error.
      SHISHI_TICKET_BAD_KEYTYPE
      Key type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error.
      SHISHI_INVALID_KEY
      Reference to invalid encryption key.
      SHISHI_APREQ_DECRYPT_FAILED
      Could not decrypt AP-REQ using provided key. This usually indicates an internal application error.
      SHISHI_TICKET_DECRYPT_FAILED
      Could not decrypt Ticket using provided key. This usually indicates an internal application error.
      SHISHI_INVALID_TICKET
      Invalid ticked passed in call.
      SHISHI_OUT_OF_RANGE
      Argument lies outside of valid range.
      SHISHI_ASN1_NO_ELEMENT
      The ASN.1 structure does not contain the indicated element.
      SHISHI_SAFE_BAD_KEYTYPE
      Attempted access to non-existent key type.
      SHISHI_SAFE_VERIFY_FAILED
      Verification failed on either side.
      SHISHI_PKCS5_INVALID_PRF
      Invalid PKCS5 descriptor.
      SHISHI_PKCS5_INVALID_ITERATION_COUNT
      Invalid claim of iteration count in PKCS5 descriptor.
      SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH
      Derived key length is incorrect for PKCS5 descriptor.
      SHISHI_PKCS5_DERIVED_KEY_TOO_LONG
      Derived key is too long for PKCS5 descriptor.
      SHISHI_INVALID_PRINCIPAL_NAME
      Principal name syntax error.
      SHISHI_INVALID_ARGUMENT
      Invalid argument passed in call. Wrong or unknown value.
      SHISHI_ASN1_NO_VALUE
      The indicated ASN.1 element does not carry a value.
      SHISHI_CONNECT_ERROR
      Connection attempt failed. Try again, or check availability.
      SHISHI_VERIFY_FAILED
      Verification failed on either side.
      SHISHI_PRIV_BAD_KEYTYPE
      The private key uses an incompatible encryption type.
      SHISHI_FILE_ERROR
      The desired file could not be accessed. Check permissions.
      SHISHI_ENCAPREPPART_BAD_KEYTYPE
      The present AP reply specifies an inpermissible key type.
      SHISHI_GETTIMEOFDAY_ERROR
      A request for present time of day has failed. This is usually internal, but a valid time is imperative for us.
      SHISHI_KEYTAB_ERROR
      Failed to parse keytab file
      SHISHI_CCACHE_ERROR
      Failed to parse credential cache file


      Previous: Error Values, Up: Error Handling

      5.17.2 Error Functions

      shishi_strerror

      — Function: const char * shishi_strerror (int err)

      err: shishi error code.

      Convert return code to human readable string.

      Return value: Returns a pointer to a statically allocated string containing a description of the error with the error value err. This string can be used to output a diagnostic message to the user.

      shishi_error

      — Function: const char * shishi_error (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Extract detailed error information string. Note that the memory is managed by the Shishi library, so you must not deallocate the string.

      Return value: Returns pointer to error information string, that must not be deallocate by caller.

      shishi_error_clear

      — Function: void shishi_error_clear (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Clear the detailed error information string. See shishi_error() for how to access the error string, and shishi_error_set() and shishi_error_printf() for how to set the error string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

      shishi_error_set

      — Function: void shishi_error_set (Shishi * handle, const char * errstr)

      handle: shishi handle as allocated by shishi_init().

      errstr: Zero terminated character array containing error description, or NULL to clear the error description string.

      Set the detailed error information string to specified string. The string is copied into the Shishi internal structure, so you can deallocate the string passed to this function after the call. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

      shishi_error_printf

      — Function: void shishi_error_printf (Shishi * handle, const char * format, ...)

      handle: shishi handle as allocated by shishi_init().

      format: printf style format string. ...: print style arguments.

      Set the detailed error information string to a printf formatted string. This function is mostly for Shishi internal use, but if you develop an extension of Shishi, it may be useful to use the same error handling infrastructure.

      shishi_error_outputtype

      — Function: int shishi_error_outputtype (Shishi * handle)

      handle: shishi handle as allocated by shishi_init().

      Get the current output type for logging messages.

      Return value: Return output type (NULL, stderr or syslog) for informational and warning messages.

      shishi_error_set_outputtype

      — Function: void shishi_error_set_outputtype (Shishi * handle, int type)

      handle: shishi handle as allocated by shishi_init().

      type: output type.

      Set output type (NULL, stderr or syslog) for informational and warning messages.

      shishi_info

      — Function: void shishi_info (Shishi * handle, const char * format, ...)

      handle: shishi handle as allocated by shishi_init().

      format: printf style format string. ...: print style arguments.

      Print informational message to output as defined in handle.

      shishi_warn

      — Function: void shishi_warn (Shishi * handle, const char * format, ...)

      handle: shishi handle as allocated by shishi_init().

      format: printf style format string. ...: print style arguments.

      Print a warning to output as defined in handle.

      shishi_verbose

      — Function: void shishi_verbose (Shishi * handle, const char * format, ...)

      handle: shishi handle as allocated by shishi_init().

      format: printf style format string. ...: print style arguments.

      Print a diagnostic message to output as defined in handle.

      5.18 Examples

      This section will be extended to contain walk-throughs of example code that demonstrate how `Shishi' is used to write your own applications that support Kerberos 5. The rest of the current section consists of some crude hints for the example client/server applications that is part of Shishi, taken from an email but saved here for lack of a better place to put it.

      There are two programs: 'client' and 'server' in src/.

      The client output an AP-REQ, waits for an AP-REP, and then simply reads data from stdin.

      The server waits for an AP-REQ, parses it and prints an AP-REP, and then read data from stdin.

      Both programs accept a Kerberos server name as the first command line argument. Your KDC must know this server, since the client tries to get a ticket for it (first it gets a ticket granting ticket for the default username), and you must write the key for the server into /usr/local/etc/shishi.keys on the Shishi format, e.g.:

           -----BEGIN SHISHI KEY-----
           Keytype: 16 (des3-cbc-sha1-kd)
           Principal: sample/latte.josefsson.org
           Realm: JOSEFSSON.ORG
           
           8W0VrQQBpxlACPQEqN91EHxbvFFo2ltt
           -----END SHISHI KEY-----
      

      You must extract the proper encryption key from the KDC in some way. (This part will be easier when Shishi include a KDC, a basic one isn't far away, give me a week or to.)

      The intention is that the data read, after the authentication phase, should be protected using KRB_SAFE (see RFC) but I haven't added this yet.

      5.19 Kerberos Database Functions

      Shisa is a separate and standalone library from Shishi (see Introduction to Shisa). If you only wish to manipulate the information stored in the Kerberos user database used by Shishi, you do not need to link or use the Shishi library at all. However, you may find it useful to combine the two libraries.

      For two real world examples on using the Shisa library, refer to src/shisa.c (Shisa command line tool) and src/kdc.c (part of Shishid server).

      Shisa uses two ‘struct’s to carry information. The first, Shisa_principal, is used to hold information about principals. The struct does not contain pointers to strings etc, so the library assumes the caller is responsible for allocating and deallocating the struct itself. Each such struct is (uniquely) identified by the combination of principal name and realm name.

           struct Shisa_principal
           {
             int isdisabled;
             uint32_t kvno;
             time_t notusedbefore;
             time_t lastinitialtgt;      /* time of last initial request for a TGT */
             time_t lastinitialrequest;  /* time of last initial request */
             time_t lasttgt;             /* time of issue for the newest TGT used */
             time_t lastrenewal;         /* time of the last renewal */
             time_t passwordexpire;      /* time when the password will expire */
             time_t accountexpire;       /* time when the account will expire. */
           };
           typedef struct Shisa_principal Shisa_principal;
      

      The second structure is called Shisa_key and hold information about cryptographic keys. Because the struct contain pointers, and the caller cannot know how many keys a principal have, the Shisa library manages memory for the struct. The library allocate the structs, and the pointers within them. The caller may deallocate them, but it is recommended to use shisa_key_free or shisa_keys_free instead. Note that each principal may have multiple keys.

           struct Shisa_key
           {
             uint32_t kvno;
             int32_t etype;
             int priority;
             char *key;
             size_t keylen;
             char *salt;
             size_t saltlen;
             char *str2keyparam;
             size_t str2keyparamlen;
             char *password;
           };
           typedef struct Shisa_key Shisa_key;
      

      Shisa is typically initialized by calling shisa_init, and deinitialized (when the application no longer need to use Shisa, typically when it shuts down) by calling shisa_done, but here are the complete (de)initialization interface functions.

      shisa

      — Function: Shisa * shisa ( void)

      Initializes the Shisa library. If this function fails, it may print diagnostic errors to stderr.

      Return value: Returns Shisa library handle, or NULL on error.

      shisa_done

      — Function: void shisa_done (Shisa * dbh)

      Deallocates the shisa library handle. The handle must not be used in any calls to shisa functions after this.

      shisa_init

      — Function: int shisa_init (Shisa ** dbh)

      dbh: pointer to library handle to be created.

      Create a Shisa library handle, using shisa(), and read the system configuration file from their default locations. The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf).

      The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

      Return value: Returns SHISA_OK iff successful.

      shisa_init_with_paths

      — Function: int shisa_init_with_paths (Shisa ** dbh, const char * file)

      dbh: pointer to library handle to be created.

      file: Filename of system configuration, or NULL.

      Create a Shisa library handle, using shisa(), and read the system configuration file indicated location (or the default location, if NULL). The paths to the default system configuration file is decided at compile time ($sysconfdir/shisa.conf).

      The handle is allocated regardless of return values, except for SHISA_INIT_ERROR which indicates a problem allocating the handle. (The other error conditions comes from reading the files.)

      Return value: Returns SHISA_OK iff successful.

      The default configuration file is typically read automatically by calling shisa_init, but if you wish to manually access the Shisa configuration file functions, here is the complete interface.

      shisa_cfg_db

      — Function: int shisa_cfg_db (Shisa * dbh, const char * value)

      dbh: Shisa library handle created by shisa().

      value: string with database definition.

      Setup and open a new database. The syntax of the value parameter is "TYPE[ LOCATION[ PARAMETER]]", where TYPE is one of the supported database types (e.g., "file") and LOCATION and PARAMETER are optional strings passed to the database during initialization. Neither TYPE nor LOCATION can contain " " (SPC), but PARAMETER may.

      Return Value: Returns SHISA_OK if database was parsed and open successfully.

      shisa_cfg

      — Function: int shisa_cfg (Shisa * dbh, const char * option)

      dbh: Shisa library handle created by shisa().

      option: string with shisa library option.

      Configure shisa library with given option.

      Return Value: Returns SHISA_OK if option was valid.

      shisa_cfg_from_file

      — Function: int shisa_cfg_from_file (Shisa * dbh, const char * cfg)

      dbh: Shisa library handle created by shisa().

      cfg: filename to read configuration from.

      Configure shisa library using configuration file.

      Return Value: Returns SHISA_OK iff successful.

      shisa_cfg_default_systemfile

      — Function: const char * shisa_cfg_default_systemfile (Shisa * dbh)

      dbh: Shisa library handle created by shisa().

      Return value: Return system configuration filename.

      The core part of the Shisa interface follows. The typical procedure is to use shisa_principal_find to verify that a specific principal exists, and to extract some information about it, and then use shisa_keys_find to get the cryptographic keys for the principal, usually suppliying some hints as to which of all keys you are interested in (e.g., key version number and encryption algorithm number).

      shisa_enumerate_realms

      — Function: int shisa_enumerate_realms (Shisa * dbh, char *** realms, size_t * nrealms)

      dbh: Shisa library handle created by shisa().

      realms: Pointer to newly allocated array of newly allocated zero-terminated UTF-8 strings indicating name of realm.

      nrealms: Pointer to number indicating number of allocated realm strings.

      Extract a list of all realm names in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings.

      Return value: Returns SHISA_OK on success, or error code.

      shisa_enumerate_principals

      — Function: int shisa_enumerate_principals (Shisa * dbh, const char * realm, char *** principals, size_t * nprincipals)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm, as zero-terminated UTF-8 string.

      nprincipals: Pointer to number indicating number of allocated realm strings.

      Extract a list of all principal names in realm in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings.

      Return value: Returns SHISA_OK on success, SHISA_NO_REALM if the specified realm does not exist, or error code.

      shisa_principal_find

      — Function: int shisa_principal_find (Shisa * dbh, const char * realm, const char * principal, Shisa_principal * ph)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to get information on.

      ph: Pointer to previously allocated principal structure to fill out with information about principal.

      Extract information about given PRINCIPALREALM.

      Return value: Returns SHISA_OK iff successful, SHISA_NO_REALM if the indicated realm does not exist, SHISA_NO_PRINCIPAL if the indicated principal does not exist, or an error code.

      shisa_principal_update

      — Function: int shisa_principal_update (Shisa * dbh, const char * realm, const char * principal, const Shisa_principal * ph)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to get information on.

      ph: Pointer to principal structure with information to store in database.

      Modify information stored for given PRINCIPALREALM. Note that it is usually a good idea to only set the fields in ph that you actually want to update. Specifically, first calling shisa_principal_find() to get the current information, then modifying one field, and calling shisa_principal_update() is not recommended in general, as this will 1) overwrite any modifications made to other fields between the two calls (by other processes) and 2) will cause all values to be written again, which may generate more overhead.

      Return value: Returns SHISA_OK if successful, SHISA_NO_REALM if the indicated realm does not exist, SHISA_NO_PRINCIPAL if the indicated principal does not exist, or an error code.

      shisa_principal_add

      — Function: int shisa_principal_add (Shisa * dbh, const char * realm, const char * principal, const Shisa_principal * ph, const Shisa_key * key)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to add, may be NULL to indicate that the realm should be created, in which case ph and key are not used.

      ph: Pointer to principal structure with information to store in database.

      key: Pointer to key structure with information to store in database.

      Add given information to database as PRINCIPALREALM.

      Return value: Returns SHISA_OK iff successfully added, or an error code.

      shisa_principal_remove

      — Function: int shisa_principal_remove (Shisa * dbh, const char * realm, const char * principal)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to remove, may be NULL to indicate that the realm itself should be removed (requires that the realm to be empty).

      Remove all information stored in the database for given PRINCIPALREALM.

      Return value: Returns SHISA_OK if successful, or an error code.

      shisa_keys_find

      — Function: int shisa_keys_find (Shisa * dbh, const char * realm, const char * principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to add key for.

      hint: Pointer to Shisa key structure with hints on matching the key to modify, may be NULL to match all keys.

      keys: pointer to newly allocated array with Shisa key structures.

      nkeys: pointer to number of newly allocated Shisa key structures in keys.

      Iterate through keys for given PRINCIPALREALM and extract any keys that match hint. Not all elements of hint need to be filled out, only use the fields you are interested in. For example, if you want to extract all keys with an etype of 3 (DES-CBC-MD5), set the key->etype field to 3, and set all other fields to 0.

      Return value: Returns SHISA_OK iff successful, or an error code.

      shisa_key_add

      — Function: int shisa_key_add (Shisa * dbh, const char * realm, const char * principal, const Shisa_key * key)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to add key for.

      key: Pointer to Shisa key structure with key to add.

      Add key to database for given PRINCIPALREALM.

      Return value: Returns SHISA_OK iff successful, or an error code.

      shisa_key_update

      — Function: int shisa_key_update (Shisa * dbh, const char * realm, const char * principal, const Shisa_key * oldkey, const Shisa_key * newkey)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to remove key for.

      oldkey: Pointer to Shisa key structure with hints on matching the key to modify.

      newkey: Pointer to Shisa key structure with new values for the key, note that all fields are used (and not just the ones specified by oldkey).

      Modify data about a key in the database, for the given PRINCIPALREALM. First the oldkey is used to locate the key to update (similar to shisa_keys_find()), then that key is modified to contain whatever information is stored in newkey. Not all elements of oldkey need to be filled out, only enough as to identify the key uniquely. For example, if you want to modify the information stored for the only key with an etype of 3 (DES-CBC-MD5), set the key->etype field to 3, and set all other fields to 0.

      Return value: Returns SHISA_OK on success, SHISA_NO_KEY if no key could be identified, and SHISA_MULTIPLE_KEY_MATCH if more than one key matched the given criteria, or an error code.

      shisa_key_remove

      — Function: int shisa_key_remove (Shisa * dbh, const char * realm, const char * principal, const Shisa_key * key)

      dbh: Shisa library handle created by shisa().

      realm: Name of realm the principal belongs in.

      principal: Name of principal to remove key for.

      key: Pointer to Shisa key structure with hints on matching the key to remove.

      Remove a key, matching the hints in key, from the Shisa database for the user PRINCIPALREALM. Not all elements of key need to be filled out, only those you are interested in. For example, if you want to remove the only key with an etype of 3 (DES-CBC-MD5), set the key->etype field to 3, and set all other fields to 0.

      Return value: Returns SHISA_OK on success, SHISA_NO_KEY if no key could be identified, and SHISA_MULTIPLE_KEY_MATCH if more than one key matched the given criteria, or an error code.

      shisa_key_free

      — Function: void shisa_key_free (Shisa * dbh, Shisa_key * key)

      dbh: Shisa library handle created by shisa().

      key: Pointer to Shisa key structure to deallocate.

      Deallocate the fields of a Shisa key structure, and the structure itself.

      shisa_keys_free

      — Function: void shisa_keys_free (Shisa * dbh, Shisa_key ** keys, size_t nkeys)

      dbh: Shisa library handle created by shisa().

      keys: Pointer to array with nkeys elements of keys.

      nkeys: Number of key elements in keys array.

      Deallocate each element of an array with Shisa database keys, using shisa_key_free().

      Error handling is similar to that for Shishi in general (see Error Handling), i.e., you invoke shisa_strerror on the integer return value received by some function, if the return value is non-zero. Below is the complete interface.

      shisa_strerror

      — Function: const char * shisa_strerror (int err)

      err: shisa error code

      Return value: Returns a pointer to a statically allocated string containing a description of the error with the error value err. This string can be used to output a diagnostic message to the user.

      shisa_info

      — Function: void shisa_info (Shisa * dbh, const char * format, ...)

      dbh: Shisa library handle created by shisa().

      format: printf style format string. ...: print style arguments.

      Print informational message to standard error.

      5.20 Generic Security Service

      As an alternative to the native Shishi programming API, it is possible to program Shishi through the Generic Security Services (GSS) API. The advantage of using GSS-API in your security application, instead of the native Shishi API, is that it will be easier to port your application between different Kerberos 5 implementations, and even beyond Kerberos 5 to different security systems, that support GSS-API. In the free software world, however, almost the only widely used security system that supports GSS-API is Kerberos 5, so the last advantage is somewhat academic. But if you are porting applications using GSS-API for other Kerberos 5 implementations, or want a more mature and stable API than the native Shishi API, you may find using Shishi's GSS-API interface compelling. Note that GSS-API only offer basic services, for more advanced uses you must use the native API.

      Since the GSS-API is not specific to Shishi, it is distributed independently from Shishi. Further information on the GSS project can be found at http://www.gnu.org/software/gss/.


      Next: , Previous: Programming Manual, Up: Top

      6 Acknowledgements

      Shishi uses Libtasn1 by Fabio Fiorina, Libgcrypt and Libgpg-error by Werner Koch, Libidn by Simon Josefsson, cvs2cl by Karl Fogel, and gdoc by Michael Zucchi.

      Several GNU packages simplified development considerably, those packages include Autoconf, Automake, Libtool, Gnulib, Gettext, Indent, CVS, Texinfo, Help2man and Emacs.

      Several people reported bugs, sent patches or suggested improvements, see the file THANKS.

      Nicolas Pouvesle wrote the section about the Kerberos rsh/rlogin protocol.

      This manual borrows text from the Kerberos 5 specification.


      Next: , Previous: Acknowledgements, Up: Top

      Appendix A Criticism of Kerberos

      The intention with this section is to discuss various problems with Kerberos 5, so you can form a conscious decision how to deploy and use Shishi correctly in your organization. Currently the issues below are condensed, and mostly serve as a reminder for the author to elaborate on them.

      No encryption scheme with security proof.

      No standardized API, and GSS mechanism lack important functionality.

      Lack of authorization system. (krb5_kuserok())

      Host to realm mapping relies on insecure DNS or static configuration files.

      Informational model and user database administration.

      Non-formal specification. Unclear on the etype to use for session keys (etype in request or database?). Unclear on how to populate some “evident” fields (e.g., cname in tickets for AS-REQ, or crealm, cname, realm, sname, ctime and cusec in KRB-ERROR). Unclear error code semantics (e.g., logic for when to use S_PRINCIPAL_UNKNOWN absent). Some KRB-ERROR fields are required, but can't be usefully populated in some situations, and no guidance is given on what they should contain.

      RFC 1510/1510bis incompatibilities. NULL enctype removed without discussion, and it is still used by some 1964 GSSAPI implementations. KRB_SAFE text (3.4.1) says the checksum is generated using the session or sub-session key, which contradicts itself (compare section 3.2.6) and also RFC 1510, which both allow the application to define the key. Verification of KRB_SAFE now require the key to be compatible with the (sub-)session key, in 1510 the only requirement was that it was collision proof.

      Problems with RFC 1510bis. Uses bignum INTEGER for TYPED-DATA and AD-AND-OR.

      Problems with crypto specification. It uses the word “random” many times, but there is no discussion on the randomness requirements. Practical experience indicate it is impossible to use true randomness for all “random” fields, and no implementation does this. A post by Don Davis on the ietf-krb-wg list tried to provide insight, but the information was never added to the specification.


      Next: , Previous: Criticism of Kerberos, Up: Top

      Appendix B Protocol Extensions

      This appendix specifies the non-standard protocol elements implemented by Shishi. By nature of being non-standard, everything described here is experimental. Comments and feedback is appreciated.

      B.1 STARTTLS protected KDC exchanges

      Shishi is able to “upgrade” TCP communications with the KDC to use the Transport Layer Security (TLS) protocol. The TLS protocol offers integrity and privacy protected exchanges. TLS also offers authentication using username and passwords, X.509 certificates, or OpenPGP certificates. Kerberos 5 claims to offer some of these features, although it is not as rich as the TLS protocol. An inconclusive list of the motivation for using TLS is given below.

      • Server authentication of the KDC to the client. In traditional Kerberos 5, KDC authentication is only proved as a side effect that the KDC knows your encryption key (i.e., your password).
      • Client authentication against KDC. Kerberos 5 assume the user knows a key (usually in the form of a password). Sometimes external factors make this hard to fulfill. In some situations, users are equipped with smart cards with a RSA authentication key. In others, users have a OpenPGP client on their desktop, with a public OpenPGP key known to the server. In some situations, the policy may be that password authentication may only be done through SRP.
      • Kerberos exchanges are privacy protected. Part of many Kerberos packets are transfered without privacy protection (i.e., encryption). That part contains information, such as the client principal name, the server principal name, the encryption types supported by the client, the lifetime of tickets, etc. Revealing such information is, in some threat models, considered a problem. Thus, this enables “anonymity”.
      • Prevents downgrade attacks affecting encryption types. The encryption type of the ticket in KDC-REQ are sent in the clear in Kerberos 5. This allows an attacker to replace the encryption type with a compromised mechanisms, e.g. 56-bit DES. Since clients in general cannot know the encryption types other servers support, it is difficult for the client to detect if there was a man-in-the-middle or if the remote server simply did not support a stronger mechanism. Clients may chose to refuse 56-bit DES altogether, but in some environments this leads to operational difficulties.
      • TLS is well-proved and the protocol is studied by many parties. This is an advantage in network design, where TLS is often already assumed as part of the solution since it is used to protect HTTP, IMAP, SMTP etc. In some threat models, the designer prefer to reduce the number of protocols that can hurt the overall system security if they are compromised.

      Other reasons for using TLS exists.

      B.1.1 TCP/IP transport with TLS upgrade (STARTTLS)

      RFC 1510bis requires Kerberos servers (KDCs) to accept TCP requests. Each request and response is prefixed by a 4 octet integer in network byte order, indicating the length of the packet. The high bit of the length was reserved for future expansion, and servers that do not understand how to interpret a set high bit must return a KRB-ERROR with a KRB_ERR_FIELD_TOOLONG and close the TCP stream.

      The TCP/IP transport with TLS upgrade (STARTTLS) uses this reserved bit as follows. First we define a new extensible typed hole for Kerberos 5 messages, because we used the only reserved bit. It is thus prudent to offer future extensions on our proposal. Secondly we reserve two values in this new typed hole, and described how they are used to implement STARTTLS.

      B.1.2 Extensible typed hole based on reserved high bit

      When the high bit is set, the remaining 31 bits of the 4 octets are treated as an extensible typed hole, and thus form a 31 bit integer enumerating various extensions. Each of the values indicate a specific extended operation mode, two of which are used and defined here, and the rest are left for others to use. If the KDC do not understand a requested extension, it MUST return a KRB-ERROR with a KRB_ERR_FIELD_TOOLONG value (prefixed by the 4 octet length integer, with the high bit clear, as usual) and close the TCP stream.

      Meaning of the 31 lower bits in the 4 octet field, when the high bit is set:

       0               RESERVED.
       1               STARTTLS requested by client.
       2               STARTTLS request accepted by server.
       3...2147483647  AVAILABLE for registration (via bug-shishi@josefsson.org).
       2147483648      RESERVED.
      

      B.1.3 STARTTLS requested by client (extension mode 1)

      When this is sent by the client, the client is requesting the server to start TLS negotiation on the TCP stream. The client MUST NOT start TLS negotiation immediately. Instead, the client wait for either a KRB-ERROR (sent normally, prefixed by a 4 octet length integer) indicating the server do not understand the set high bit, or 4 octet which is to interpreted as an integer in network byte order, where the high bit is set and the remaining 31 bit are interpreted as an integer specifying the “STARTTLS request accepted by server”. In the first case, the client infer that the server do not understand (or wish to support) STARTTLS, and can re-try using normal TCP, if unprotected Kerberos 5 exchanges are acceptable to the client policy. In the latter case, it should invoke TLS negotiation on the stream. If any other data is received, the client MUST close the TCP stream.

      B.1.4 STARTTLS request accepted by server (extension mode 2)

      This 4 octet message should be sent by the server when it has received the previous 4 octet message. The message is an acknowledgment of the client's request to initiate STARTTLS on the channel. The server MUST then invoke a TLS negotiation.

      B.1.5 Proceeding after successful TLS negotiation

      If the TLS negotiation ended successfully, possibly also considering client or server policies, the exchange within the TLS protected stream is performed like normal UDP Kerberos 5 exchanges, i.e., there is no TCP 4 octet length field before each packet. Instead each Kerberos packet MUST be sent within one TLS record, so the application can use the TLS record length as the Kerberos 5 packet length.

      B.1.6 Proceeding after failed TLS negotiation

      If the TLS negotiation fails, possibly due to client or server policy (e.g., inadequate support of encryption types in TLS, or lack of client or server authentication) the entity that detect the failure MUST disconnected the connection. It is expected that any error messages that explain the error condition is transfered by TLS.

      B.1.7 Interaction with KDC addresses in DNS

      Administrators for a KDC may announce the KDC address by placing SRV records in DNS for the realm, as described in draft-ietf-krb-wg-krb-dns-locate-03.txt. That document mention TLS, but do not reference any work that describe how KDCs uses TLS. Until further clarified, consider the TLS field in that document to refer to implementation supporting this STARTTLS protocol.

      B.1.8 Using TLS authentication logic in Kerberos

      The server MAY consider the authentication performed by the TLS exchange as sufficient to issue Kerberos 5 tickets to the client, without requiring, e.g., pre-authentication. However, it is not an error to require or use pre-authentication as well.

      The client may also indicate that it wishes to use TLS both for authentication and data protection by using the ‘NULL’ encryption type in its request. The server can decide from its local policy whether or not issuing tickets based solely on TLS authentication, and whether ‘NULL’ encryption within TLS, is acceptable or not. This mode is currently under investigation.

      B.1.9 Security considerations

      Because the initial token is not protected, it is possible for an active attacker to make it appear to the client that the server do not support this extension. It is up to client configuration to disallow non-TLS connections, if this vulnerability is deemed unacceptable. For interoperability, we suggest the default behaviour should be to allow automatic fallback to TCP or UDP.

      The security considerations of both TLS and Kerberos 5 are inherited. Using TLS for authentication and/or data protection together with Kerberos alter the authentication logic fundamentally. Thus, it may be that even if the TLS and Kerberos 5 protocols and implementations were secure, the combination of TLS and Kerberos 5 described here could be insecure.

      No channel bindings are provided in the Kerberos messages. It is an open question whether, and how, this should be fixed.

      B.2 Telnet encryption with AES-CCM

      This appendix describe how Shishi use the Advanced Encryption Standard (AES) encryption algorithm in Counter with CBC-MAC mode (RFC 3610) with the telnet encryption option (RFC 2946).

      B.2.1 Command Names and Codes

      Encryption Type
      
            AES_CCM             12
      
      Suboption Commands
      
            AES_CCM_INFO         1
            AES_CCM_INFO_OK      2
            AES_CCM_INFO_BAD     3
      

      B.2.2 Command Meanings

         IAC SB ENCRYPT IS AES_CCM AES_CCM_INFO <M> <L> <nonce> IAC SE
      

      The sender of this command select desired M and L parameters, and nonce, as described in RFC 3610, and sends it to the other side of the connection. The parameters and the nonce are sent in clear text. Only the side of the connection that is WILL ENCRYPT may send the AES_CCM_INFO command.

         IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_BAD IAC SE
      

      The sender of this command reject the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST be sent if the nonce field length does not match the selected value for L. The command MAY be sent if the receiver do not accept the parameters for reason such as policy. No capability is provided to negotiate these parameters.

         IAC SB ENCRYPT REPLY AES_CCM AES_CCM_INFO_OK IAC SE
      

      The sender of this command accepts the parameters received in the AES_CCM_INFO command. Only the side of the connection that is DO ENCRYPT may send the AES_CCM_INFO_BAD command. The command MUST NOT be sent if the nonce field length does not match the selected value for L.

      B.2.3 Implementation Rules

      Once a AES_CCM_INFO_OK command has been received, the WILL ENCRYPT side of the connection should do keyid negotiation using the ENC_KEYID command. Once the keyid negotiation has successfully identified a common keyid, then START and END commands may be sent by the side of the connection that is WILL ENCRYPT. Data will be encrypted using the AES-CCM algorithm, with the negotiated nonce and parameters M and L. After each successful encryption and decryption, the nonce is treated as an integer in network byte order, and incremented by one.

      If encryption (decryption) is turned off and back on again, and the same keyid is used when re-starting the encryption (decryption), the intervening clear text must not change the state of the encryption (decryption) machine. In particular, the AES-CCM nonce must not be re-set.

      If a START command is sent (received) with a different keyid, the encryption (decryption) machine must be re-initialized immediately following the end of the START command with the new key and the parameters sent (received) in the last AES_CCM_INFO command.

      If a new AES_CCM_INFO command is sent (received), and encryption (decryption) is enabled, the encryption (decryption) machine must be re-initialized immediately following the end of the AES_CCM_INFO command with the new nonce and parameters, and the keyid sent (received) in the last START command.

      If encryption (decryption) is not enabled when a AES_CCM_INFO command is sent (received), the encryption (decryption) machine must be re- initialized after the next START command, with the keyid sent (received) in that START command, and the nonce and parameters sent (received) in this AES_CCM_INFO command.

      At all times MUST each end make sure that a AES-CCM nonce is not used twice under the same encryption key. The rules above help accomplish this in an interoperable way.

      B.2.4 Integration with the AUTHENTICATION telnet option

      <<This section is slightly complicated. Can't we simplify this?>>

      As noted in the telnet ENCRYPTION option specifications, a keyid value of zero indicates the default encryption key, as might be derived from the telnet AUTHENTICATION option. If the default encryption key negotiated as a result of the telnet AUTHENTICATION option contains less than 32 bytes (corresponding to two 128 bit keys), then the AES_CCM option MUST NOT be offered or used as a valid telnet encryption option. Furthermore, depending on policy for key lengths, the AES_CCM option MAY be disabled if the default encryption key contain less than 48 bytes (for two 192 bit keys), or less than 64 bytes (for two 256 bit keys), as well.

      The available encrypt key data is divided on two halves, where the first half is used to encrypt data sent from the server (decrypt data received by the client), and the second half is used to encrypt data sent from the client (decrypt data received by the server).

      Note that the above algorithm assumes that the AUTHENTICATION mechanism generate keying material suitable for AES-CCM as used in this specification. This is not necessarily true in general, but we specify this behaviour as the default since it is true for most authentication systems in popular use today. New telnet AUTHENTICATION mechanisms may specify alternative methods for determining the keys to be used for this cipher suite in their specification, if the session key negotiated by that authentication mechanism is not a DES key and where this algorithm may not be safely used.

      Kerberos 5 authentication clarification: The key used to encrypt data from the client to the server is taken from the sub-session key in the AP-REQ. The key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REP. If mutual authentication is not negotiated, the key used to encrypt data from the client to the server is taken from the session key in the ticket, and the key used to decrypt data from the server to the client is taken from the sub-session key in the AP-REQ. Leaving the AP-REQ sub-key field empty MUST disable the AES_CCM option.

      B.2.5 Security Considerations

      The protocol must be properly and securely implemented. For example, an implementation should not be vulnerable to various implementation-specific attacks such as buffer overflows or side-channel analysis.

      We wish to repeat the suggestion from RFC 2946, to investigate in a STARTTLS approach for Telnet encryption (and also authentication), when the security level provided by this specification is not adequate.

      B.2.5.1 Telnet Encryption Protocol Security Considerations

      The security consideration of the Telnet encryption protocol are inherited.

      It should be noted that the it is up to the authentication protocol used, if any, to bind the authenticity of the peers to a specific session.

      The Telnet encryption protocol does not, in general, protect against possibly malicious downgrading to any mutually acceptable, but not preferred, encryption type. This places a requirement on each peer to only accept encryption types it trust fully. In other words, the Telnet encryption protocol do not guarantee that the strongest mutually acceptable encryption type is always selected.

      B.2.5.2 AES-CCM Security Considerations

      The integrity and privacy claims are inherited from AES-CCM. In particular, the implementation must make sure a nonce is not used more than once together with the same key.

      Furthermore, the encryption key is assumed to be random, i.e., it should not be possible to guess it with probability of success higher than guessing any uniformly selected random key. RFC 1750 gives an overview of issues and recommendations related to randomness.

      B.2.6 Acknowledgments

      This document is based on the various Telnet Encryption RFCs (RFC 2946, RFC 2947, RFC 2948, RFC 2952 and RFC 2953).

      B.3 Kerberized rsh and rlogin

      This appendix describe the KCMDV0.2 protocol used in shishi patched version of inetutils. The KCMD protocol was developped by the MIT Kerberos team for kerberized rsh an rlogin programs. Differences between rlogin an rsh will be explained, like those between v0.1 and v0.2 of the protocol for compatibility reasons. It is possible that some parts of this document are not in conformity with original KCMD protocol because there is no official specification about it. However, it seems that shishi implementation is compatible with MIT's one.

      Warning: If you are seriously considering using Kerberos rsh or rlogin, instead of more robust remote access protocols such as SSH, you may first want to explore http://www.cs.berkeley.edu/~hildrum/kerberos/ and the full paper at http://www.cs.berkeley.edu/~hildrum/043.pdf.

      B.3.1 Establish connection

      First the client should establish a TCP connection with the server. Default ports are 543 (klogin), 544 (kshell), 2105 (eklogin). eklogin is the same as klogin but with encryption. Their is no longer ekshell port because encrypted and normal connection use the same port (kshell). Kshell need a second connection for stderr. The client should send a null terminated string that represent the port of this second connection. Klogin and eklogin does not use a second connection for stderr so the client must send a null byte to the server. Contrary to classic rsh/rlogin, server must not check if the client port is in the range 0-1023.

      B.3.2 Kerberos identification

      When connections are established, first thing to do is to indicate kerberos authentication must be used. So the client will send a string to indicate it will used kerberos 5. It will call a length-string "strl" the couple (lenght of the string strl, null terminated string strl). Length of the string is an int32 (32bits int) in MSB order (for the network). So the client send this length-string strl :

         KRB5_SENDAUTH_V1.0
      

      After that the client must indicate which version of the protocol it will used by sending this length-string strl :

         KCMDV0.2
      

      It can be V0.1 for older versions. If indentification from client is good, server will send a null byte (0x00). Else if authentication message is wrong, server send byte 0x01, else if protocol version message is wrong server send byte 0x02.

      B.3.3 Kerberos authentication

      When client is indentified, kerberos authentication can begin. The client must send an AP-REQ to the server. AP-REQ authenticator must have a subkey (only for KCMDV0.2) and a checksum. Authenticator checksum is created on following string :

           "serverport:""terminaltype""remoteusername"
      

      for example :

           543:linux/38400user
      

      remoteusername corresponds to the identity of the client on remote machine.

      AP-REQ is sended in der encoded format. The length (int32) of der encoded AP-REQ is sended in network format (MSB), following by the der encoded AP-REQ. If all is correct, server send a null int32 (MSB format but like it is null it is not important). KCMD protocol use mutual authentication, so server must now send and AP-REP : (in32 lenght in MSB of der encoded AP-REP)(der encoded AP-REP).

      Now server and client are partially authenticated.

      B.3.4 Extended authentication

      Client must now send 3 different null terminated strings (without lenght) :

      • remote user name (user identity on remote machine)
      • terminal type for rlogin or command for rsh
      • local user name (user identity on client machine)

      example for rsh :

           "rname\0"
           "cat /usr/local/etc/shishi.conf"
           "lname\0"
      

      Server must verify that checksum in AP-REQ authenticator is correct by computing a new hash like client has done.

      Server must verify that principal (in AP-REQ) has right to log in on the remote user account. For the moment shishi only check if remote user name is equal to principal. A more complex authorization code is planned. Look at the end to know how MIT/Heimdal do to check authorization.

      If all is correct server send a null byte, else an error message string (null terminated string) is sent. User read the first byte. If it is equal to zero, authentication is correct and is logged on the remote host. Else user can read the error messsage send by the server.

      B.3.5 Window size

      For rlogin protocol, when authentication is complete, the server can optionnaly send a message to ask for window terminal size of user. Then the user can respond but it is not an obligation.

      In KCMDV0.1 server send an urgent TCP message (MSG_OOB) with one byte :

           TIOCPKT_WINDOW = 0x80
      

      In KCMDV0.2 server does not send an urgent message but write on the socket 5 bytes :

           '\377', '\377', 'o', 'o', TIOCPKT_WINDOW
      

      If encryption is enabled (eklogin) server must send this 5 bytes encrypted.

      Client can answer in both protocol version with :

           '\377', '\377', 's', 's', "struct winsize"
      

      The winsize structure is filled with corresponding setting to client's terminal. If encryption is enabled this answer must be send encrypted.

      B.3.6 End of authentication

      The "classic" rsh/rlogin can be used now.

      B.3.7 Encryption

      Encryption mode is used when a connection with eklogin is established. Encryption with krsh can be used too. Before, there was a specific port for that (ekshell), but now to indicate that encryption must be used with krsh, client must add "-x " before the command when it send it between remote user name and local user name. When the client compute the checksum for AP-REQ authenticator the "- x" must not be included.

      Encryption in KCMDV0.2 is not the same as in KCMDV0.1. KCMDV0.1 uses ticket session key as encryption key, and use standard Kerberos encryption functions. This protocol only supports des-cbc-crc, des-cbc-md4, des-cbc-md5 and does not use initialisation vectors.

      For example on each encryption/decryption calls, the following prototype kerberos function should be used :

           kerberos_encrypt (key, keyusage, in, out)  (or decrypt)
      

      KCMDV0.2 can be used with all kerberos encryption modes (des, 3des, aes, arcfour) and use AP-REQ authenticator subkey. In opposite to KCMDV0.1 initialisation vectors are used. All encryptions/descryptions must be made using a cryptographic context (for example to use the updated iv, or sbox) :

           kerberos_init(ctx, iv, key, keyusage)
           kerberos_encrypt (ctx, in, out)
      

      For both protocols, keyusage id for des-cbc-md5, des-cbc-md4, des-cbc-crc and des3-cbc-sha1 (for KCMDV0.2) :

           keyusage = 1026
      

      For other KCMDV0.2 modes keyusage is different for each encryption/decryption usage. To understand, eklogin use 1 socket. It encrypts data (output 1) to send and decrypts (input 1) received data. Kshell use 2 sockets (1 for transmit data, 1 for stderr). So there are four modes :

         transmit  : input  1 
      	       output 1
      
         stderr    : input  2
      	       output 2
      

      There is a keyusage for each modes. The keyusage must correspond on client and server side. For example in klogin client input 1 keyusage will be server output 1 keyusage.

      I/O Client Server
      intput 1 1028 1030
      output 1 1030 1028
      intput 2 1032 1034
      output 2 1034 1032

      Those keyusages must be used with AES and ARCFOUR modes.

      KCMDV0.2 uses IV (initialisation vector). Like for keyusage, client IV must correspond to server IV. IV size is equal to key type, blocksize. All bytes of IV must be initialised to :

      I/O Client Server
      intput 1 0 1
      output 1 1 0
      intput 2 2 3
      output 2 3 2

      ARCFOUR mode does not use IV. However, like it is said before, a context must be used to keep the updated sbox.

      Normal message with klogin and kshell are sent like that :

           (int 32 lenght of message in MSB order)
           (message)
      

      In encrypted mode it is a bit different :

           (int 32 length of unencrypted message in MSB order)
           (encrypted message)
      

      In KCMDV0.2 encrypted message is create like that :

           encrypt (
           (int 32 length of message in MSB order)
           (message)
           )
      

      A check on message size can be made in second version of the protocol.

      B.3.8 KCMDV0.3

      This part only gives possible ways to extend KCMD protocol. Does not take that as must have in KCMD implementation.

      Extensions of KCMV0.2 could be made. For example kshell supposes there are no files with name "-x *". I think the same thing can be supposed with terminal name for klogin. So client could add "-x " to terminal type it sends to server to indicate it will use encryption. Like that there will be only one port for klogin/eklogin : 543.

      In encrypted mode kshell send command in clear on the network, this could be considered as insecure as user have decided to use encryption. This is not really a problem for klogin because it just sends terminal type.

      In encrypted mode, klogin and kshell clients could only send "-x" as command or terminal type. After that encryption is activated, and the client could send terminal type or command encrypted. The server will send the null byte to say that all is correct, or error message in encrypted form.

      B.3.9 MIT/Heimdal authorization

      This part describes how MIT/Heimdal version check authorization of the user to log in on the remote machine.

      Authorization check is made by looking if the file .k5login exists on the account of the remote user. If this file does not exist, remote user name must be the same as principal in AP-REQ to valid authorization. Else if this file exists, check first verify that remote user or root are the owner of .k5login. If it is not the case, the check fails. If it is good, check reads each line of that file and compare each readed name to principal. If principal is found in .k5login, authorization is valid, else user is not allowed to connect on remote host with the specified remote user name (that can be the same as principal).

      So someone (for example user "user1") can remote log into "user2" account if .k5login is present in user2 home dir and this file is owned by user2 or root and user1 name is present in this file.

      B.4 Key as initialization vector

      The des-cbc-crc algorithm (see Cryptographic Overview) uses the DES key as the initialization vector. This is problematic in general (see below5), but may be mitigated in Kerberos by the CRC checksum that is also included.

      From daw@espresso.CS.Berkeley.EDU Fri Mar  1 13:32:34 PST 1996
      Article: 50440 of sci.crypt
      Path: agate!daw
      From: daw@espresso.CS.Berkeley.EDU (David A Wagner)
      Newsgroups: sci.crypt
      Subject: Re: DES-CBC and Initialization Vectors
      Date: 29 Feb 1996 21:48:16 GMT
      Organization: University of California, Berkeley
      Lines: 31
      Message-ID: <4h56v0$3no@agate.berkeley.edu>
      References: <4h39li$33o@gaia.ns.utk.edu>
      NNTP-Posting-Host: espresso.cs.berkeley.edu
      
      In article <4h39li$33o@gaia.ns.utk.edu>,
      Nair Venugopal <venu@mars.utcc.utk.edu> wrote:
      > Is there anything wrong in using the key as the I.V. in DES-CBC mode?
      
      Yes, you're open to a chosen-ciphertext attack which recovers the key.
      
      Alice is sending stuff DES-CBC encrypted with key K to Bob.  Mary is an
      active adversary in the middle.  Suppose Alice encrypts some plaintext
      blocks P_1, P_2, P_3, ... in DES-CBC mode with K as the IV, and sends off
      the resulting ciphertext
      	A->B: C_1, C_2, C_3, ...
      where each C_j is a 8-byte DES ciphertext block.  Mary wants to discover
      the key K, but doesn't even know any of the P_j's.  She replaces the above
      message by
      	M->B: C_1, 0, C_1
      where 0 is the 8-byte all-zeros block.  Bob will decrypt under DES-CBC,
      recovering the blocks
      	Q_1, Q_2, Q_3
      where
      	Q_1 = DES-decrypt(K, C_1) xor K = P_1
      	Q_2 = DES-decrypt(K, C_2) xor C_1 = (some unimportant junk)
      	Q_3 = DES-decrypt(K, C_1) xor 0 = P_1 xor K
      Bob gets this garbage-looking message Q_1,Q_2,Q_3 which Mary recovers
      (under the chosen-ciphertext assumption: this is like a known-plaintext
      attack, which isn't too implausible).  Notice that Mary can recover K by
      	K = Q_1 xor Q_3;
      so after this one simple active attack, Mary gets the key back!
      
      So, if you must use a fixed IV, don't use the key-- use 0 or something
      like that.  Even better, don't use a fixed IV-- use the DES encryption
      of a counter, or something like that.
      

      B.5 The Keytab Binary File Format

      The keytab file format is described in the file keytab.txt, included in verbatim below.

      The Kerberos Keytab Binary File Format
      Copyright (C) 2006 Michael B Allen <mba2000 ioplex.com>
      http://www.ioplex.com/utilities/keytab.txt
      Last updated: Fri May  5 13:39:40 EDT 2006
      
      The MIT keytab binary format is not a standard format, nor is it
      documented anywhere in detail. The format has evolved and may continue
      to. It is however understood by several Kerberos implementations including
      Heimdal and of course MIT and keytab files are created by the ktpass.exe
      utility from Windows. So it has established itself as the defacto format
      for storing Kerberos keys.
      
      The following C-like structure definitions illustrate the MIT keytab
      file format. All values are in network byte order. All text is ASCII.
      
        keytab {
            uint16_t file_format_version;                    /* 0x502 */
            keytab_entry entries[*];
        };
      
        keytab_entry {
            int32_t size;
            uint16_t num_components;    /* sub 1 if version 0x501 */
            counted_octet_string realm;
            counted_octet_string components[num_components];
            uint32_t name_type;   /* not present if version 0x501 */
            uint32_t timestamp;
            uint8_t vno8;
            keyblock key;
            uint32_t vno; /* only present if >= 4 bytes left in entry */
        };
      
        counted_octet_string {
            uint16_t length;
            uint8_t data[length];
        };
      
        keyblock {
            uint16_t type;
            counted_octet_string;
        };
      
      The keytab file format begins with the 16 bit file_format_version which
      at the time this document was authored is 0x502. The format of older
      keytabs is described at the end of this document.
      
      The file_format_version is immediately followed by an array of
      keytab_entry structures which are prefixed with a 32 bit size indicating
      the number of bytes that follow in the entry. Note that the size should be
      evaluated as signed. This is because a negative value indicates that the
      entry is in fact empty (e.g. it has been deleted) and that the negative
      value of that negative value (which is of course a positive value) is
      the offset to the next keytab_entry. Based on these size values alone
      the entire keytab file can be traversed.
      
      The size is followed by a 16 bit num_components field indicating the
      number of counted_octet_string components in the components array.
      
      The num_components field is followed by a counted_octet_string
      representing the realm of the principal.
      
      A counted_octet_string is simply an array of bytes prefixed with a 16
      bit length. For the realm and name components, the counted_octet_string
      bytes are ASCII encoded text with no zero terminator.
      
      Following the realm is the components array that represents the name of
      the principal. The text of these components may be joined with slashs
      to construct the typical SPN representation. For example, the service
      principal HTTP/www.foo.net@FOO.NET would consist of name components
      "HTTP" followed by "www.foo.net".
      
      Following the components array is the 32 bit name_type (e.g. 1 is
      KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In
      practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL.
      
      The 32 bit timestamp indicates the time the key was established for that
      principal. The value represents the number of seconds since Jan 1, 1970.
      
      The 8 bit vno8 field is the version number of the key. This value is
      overridden by the 32 bit vno field if it is present.
      
      The keyblock structure consists of a 16 bit value indicating the keytype
      (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, 16 is des3-cbc-sha1,
      etc). This is followed by a counted_octet_string containing the key.
      
      The last field of the keytab_entry structure is optional. If the size of
      the keytab_entry indicates that there are at least 4 bytes remaining,
      a 32 bit value representing the key version number is present. This
      value supersedes the 8 bit vno8 value preceeding the keyblock.
      
      Older keytabs with a file_format_version of 0x501 are different in
      three ways:
      
        1) All integers are in host byte order [1].
        2) The num_components field is 1 too large (i.e. after decoding,
           decrement by 1).
        3) The 32 bit name_type field is not present.
      
      [1] The file_format_version field should really be treated as two
          separate 8 bit quantities representing the major and minor version
          number respectively.
      
      Permission to copy, modify, and distribute this document, with or
      without modification, for any purpose and without fee or royalty is
      hereby granted, provided that you include this copyright notice in ALL
      copies of the document or portions thereof, including modifications.
      

      B.6 The Credential Cache Binary File Format

      The credential cache file format is described in the file keytab.txt, included in verbatim below.

      The Kerberos Credential Cache Binary File Format
      Copyright (C) 2006-2013 Simon Josefsson <simon josefsson.org>
      http://josefsson.org/shishi/ccache.txt
      Last updated: Sat Sep 23 12:04:11 CEST 2006
      
      Like the MIT keytab binary format (see Michael B Allen's reverse
      engineered description in keytab.txt), the credential cache format is
      not standard nor documented anywhere.
      
      In C style notation, the MIT credential cache file format is as
      follows.  All values are in network byte order.  All text is ASCII.
      
      ccache {
                uint16_t file_format_version; /* 0x0504 */
                uint16_t headerlen;           /* only if version is 0x0504 */
                header headers[];             /* only if version is 0x0504 */
                principal primary_principal;
                credential credentials[*];
      };
      
      header {
             uint16_t tag;                    /* 1 = DeltaTime */
             uint16_t taglen;
             uint8_t tagdata[taglen]
      };
      
      The ccache.taglen and ccache.tags fields are only present in 0x0504
      versions, not in earlier.  Both MIT and Heimdal appear to correctly
      ignore unknown tags, so it appears safe to add them (although there is
      no central place to "register" tags).
      
      Currently only one tag is widely implemented, DeltaTime (0x0001).  Its
      taglen is always 8, and tagdata will contain:
      
      DeltaTime {
             uint32_t time_offset;
             uint32_t usec_offset;
      };
      
      After reading the file_format_version, header tags, and default
      principal, a list of credentials follow.  You deduce from the file
      length when there are no more credentials.
      
      credential {
                 principal client;
                 principal server;
                 keyblock key;
                 times    time;
                 uint8_t  is_skey;            /* 1 if skey, 0 otherwise */
                 uint32_t tktflags;           /* stored in reversed byte order */
                 uint32_t num_address;
                 address  addrs[num_address];
                 uint32_t num_authdata;
                 authdata authdata[num_authdata];
                 countet_octet_string ticket;
                 countet_octet_string second_ticket;
      };
      
      keyblock {
               uint16_t keytype;
               uint16_t etype;                /* only present if version 0x0503 */
               uint16_t keylen;
               uint8_t keyvalue[keylen];
      };
      
      times {
            uint32_t  authtime;
            uint32_t  starttime;
            uint32_t  endtime;
            uint32_t  renew_till;
      };
      
      address {
              uint16_t addrtype;
              counted_octet_string addrdata;
      };
      
      authdata {
               uint16_t authtype;
               counted_octet_string authdata;
      };
      
      principal {
                uint32_t name_type;           /* not present if version 0x0501 */
                uint32_t num_components;      /* sub 1 if version 0x501 */
                counted_octet_string realm;
                counted_octet_string components[num_components];
      };
      
      counted_octet_string {
          uint32_t length;
          uint8_t data[length];
      };
      
      Permission to copy, modify, and distribute this document, with or
      without modification, for any purpose and without fee or royalty is
      hereby granted, provided that you include this copyright notice in ALL
      copies of the document or portions thereof, including modifications.
      

      Appendix C Copying Information

      C.1 GNU Free Documentation License

      Version 1.3, 3 November 2008
           Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
           http://fsf.org/
           
           Everyone is permitted to copy and distribute verbatim copies
           of this license document, but changing it is not allowed.
      
      1. PREAMBLE

        The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

        This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

        We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

      2. APPLICABILITY AND DEFINITIONS

        This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

        A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

        A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

        The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

        The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

        A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

        Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

        The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

        The “publisher” means any person or entity that distributes copies of the Document to the public.

        A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

        The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

      3. VERBATIM COPYING

        You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

        You may also lend copies, under the same conditions stated above, and you may publicly display copies.

      4. COPYING IN QUANTITY

        If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

        If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

        If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

        It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

      5. MODIFICATIONS

        You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

        1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
        2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
        3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
        4. Preserve all the copyright notices of the Document.
        5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
        6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
        7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
        8. Include an unaltered copy of this License.
        9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
        10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
        11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
        12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
        13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
        14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
        15. Preserve any Warranty Disclaimers.

        If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

        You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

        You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

        The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

      6. COMBINING DOCUMENTS

        You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

        The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

        In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

      7. COLLECTIONS OF DOCUMENTS

        You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

        You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

      8. AGGREGATION WITH INDEPENDENT WORKS

        A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

        If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

      9. TRANSLATION

        Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

        If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

      10. TERMINATION

        You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

        However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

        Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

        Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

      11. FUTURE REVISIONS OF THIS LICENSE

        The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

        Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

      12. RELICENSING

        “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

        “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

        “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

        An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

        The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

      ADDENDUM: How to use this License for your documents

      To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

             Copyright (C)  year  your name.
             Permission is granted to copy, distribute and/or modify this document
             under the terms of the GNU Free Documentation License, Version 1.3
             or any later version published by the Free Software Foundation;
             with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
             Texts.  A copy of the license is included in the section entitled ``GNU
             Free Documentation License''.
      

      If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this:

               with the Invariant Sections being list their titles, with
               the Front-Cover Texts being list, and with the Back-Cover Texts
               being list.
      

      If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

      If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


      Next: , Previous: Copying Information, Up: Top

      Function and Data Index


      Previous: Function and Data Index, Up: Top

      Concept Index

      Table of Contents


      Footnotes

      [1] The text is a lightly adapted version of the introduction section from RFC 1510 by J. Kohl and C. Neuman, September 1993, copyright likely owned by the RFC 1510 authors or some contributor.

      [2] http://www.research.att.com/~smb/papers/ides.pdf

      [3] http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/

      [4] And besides, Shishi is intended to work on non-Unix platforms as well.

      [5] The post is copyrighted by David Wagner, included here with permission, the canonical location is http://www.cs.berkeley.edu/~daw/my-posts/key-as-iv-broken


      shishi-1.0.2/doc/version.texi0000644000000000000000000000013612126773105013021 00000000000000@set UPDATED 3 April 2013 @set UPDATED-MONTH April 2013 @set EDITION 1.0.2 @set VERSION 1.0.2 shishi-1.0.2/aclocal.m40000644000000000000000000012514012126772720011541 00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) ]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([db/gl/m4/gnulib-comp.m4]) m4_include([db/gl/m4/readlink.m4]) m4_include([src/gl/m4/error.m4]) m4_include([src/gl/m4/getopt.m4]) m4_include([src/gl/m4/gnulib-comp.m4]) m4_include([src/gl/m4/locale_h.m4]) m4_include([src/gl/m4/nocrash.m4]) m4_include([src/gl/m4/version-etc.m4]) m4_include([gl/m4/00gnulib.m4]) m4_include([gl/m4/alloca.m4]) m4_include([gl/m4/arpa_inet_h.m4]) m4_include([gl/m4/autobuild.m4]) m4_include([gl/m4/base64.m4]) m4_include([gl/m4/bison.m4]) m4_include([gl/m4/clock_time.m4]) m4_include([gl/m4/close.m4]) m4_include([gl/m4/dup2.m4]) m4_include([gl/m4/eealloc.m4]) m4_include([gl/m4/environ.m4]) m4_include([gl/m4/errno_h.m4]) m4_include([gl/m4/exponentd.m4]) m4_include([gl/m4/extensions.m4]) m4_include([gl/m4/extern-inline.m4]) m4_include([gl/m4/fcntl.m4]) m4_include([gl/m4/fcntl_h.m4]) m4_include([gl/m4/float_h.m4]) m4_include([gl/m4/fseek.m4]) m4_include([gl/m4/fseeko.m4]) m4_include([gl/m4/fstat.m4]) m4_include([gl/m4/ftell.m4]) m4_include([gl/m4/ftello.m4]) m4_include([gl/m4/gc-des.m4]) m4_include([gl/m4/gc-hmac-md5.m4]) m4_include([gl/m4/gc-hmac-sha1.m4]) m4_include([gl/m4/gc-md4.m4]) m4_include([gl/m4/gc-md5.m4]) m4_include([gl/m4/gc-random.m4]) m4_include([gl/m4/gc.m4]) m4_include([gl/m4/getaddrinfo.m4]) m4_include([gl/m4/getdelim.m4]) m4_include([gl/m4/getdomainname.m4]) m4_include([gl/m4/getdtablesize.m4]) m4_include([gl/m4/gethostname.m4]) m4_include([gl/m4/getline.m4]) m4_include([gl/m4/getpass.m4]) m4_include([gl/m4/getsubopt.m4]) m4_include([gl/m4/gettime.m4]) m4_include([gl/m4/gettimeofday.m4]) m4_include([gl/m4/gnulib-common.m4]) m4_include([gl/m4/gnulib-comp.m4]) m4_include([gl/m4/hostent.m4]) m4_include([gl/m4/include_next.m4]) m4_include([gl/m4/inet_ntop.m4]) m4_include([gl/m4/intmax_t.m4]) m4_include([gl/m4/largefile.m4]) m4_include([gl/m4/ld-output-def.m4]) m4_include([gl/m4/ld-version-script.m4]) m4_include([gl/m4/lseek.m4]) m4_include([gl/m4/malloc.m4]) m4_include([gl/m4/malloca.m4]) m4_include([gl/m4/manywarnings.m4]) m4_include([gl/m4/md4.m4]) m4_include([gl/m4/md5.m4]) m4_include([gl/m4/memchr.m4]) m4_include([gl/m4/memxor.m4]) m4_include([gl/m4/minmax.m4]) m4_include([gl/m4/mktime.m4]) m4_include([gl/m4/mmap-anon.m4]) m4_include([gl/m4/msvc-inval.m4]) m4_include([gl/m4/msvc-nothrow.m4]) m4_include([gl/m4/multiarch.m4]) m4_include([gl/m4/netdb_h.m4]) m4_include([gl/m4/netinet_in_h.m4]) m4_include([gl/m4/off_t.m4]) m4_include([gl/m4/parse-datetime.m4]) m4_include([gl/m4/pathmax.m4]) m4_include([gl/m4/printf.m4]) m4_include([gl/m4/rawmemchr.m4]) m4_include([gl/m4/read-file.m4]) m4_include([gl/m4/realloc.m4]) m4_include([gl/m4/select.m4]) m4_include([gl/m4/servent.m4]) m4_include([gl/m4/setenv.m4]) m4_include([gl/m4/sha1.m4]) m4_include([gl/m4/signal_h.m4]) m4_include([gl/m4/snprintf.m4]) m4_include([gl/m4/socketlib.m4]) m4_include([gl/m4/sockets.m4]) m4_include([gl/m4/socklen.m4]) m4_include([gl/m4/sockpfaf.m4]) m4_include([gl/m4/ssize_t.m4]) m4_include([gl/m4/stat.m4]) m4_include([gl/m4/stdalign.m4]) m4_include([gl/m4/stdarg.m4]) m4_include([gl/m4/stdbool.m4]) m4_include([gl/m4/stddef_h.m4]) m4_include([gl/m4/stdint.m4]) m4_include([gl/m4/stdio_h.m4]) m4_include([gl/m4/stdlib_h.m4]) m4_include([gl/m4/strcase.m4]) m4_include([gl/m4/strchrnul.m4]) m4_include([gl/m4/strdup.m4]) m4_include([gl/m4/strerror.m4]) m4_include([gl/m4/string_h.m4]) m4_include([gl/m4/strings_h.m4]) m4_include([gl/m4/strndup.m4]) m4_include([gl/m4/strnlen.m4]) m4_include([gl/m4/strtok_r.m4]) m4_include([gl/m4/strverscmp.m4]) m4_include([gl/m4/sys_select_h.m4]) m4_include([gl/m4/sys_socket_h.m4]) m4_include([gl/m4/sys_stat_h.m4]) m4_include([gl/m4/sys_time_h.m4]) m4_include([gl/m4/sys_types_h.m4]) m4_include([gl/m4/sys_uio_h.m4]) m4_include([gl/m4/time_h.m4]) m4_include([gl/m4/time_r.m4]) m4_include([gl/m4/timegm.m4]) m4_include([gl/m4/timespec.m4]) m4_include([gl/m4/tm_gmtoff.m4]) m4_include([gl/m4/unistd_h.m4]) m4_include([gl/m4/valgrind-tests.m4]) m4_include([gl/m4/vasnprintf.m4]) m4_include([gl/m4/vasprintf.m4]) m4_include([gl/m4/warn-on-use.m4]) m4_include([gl/m4/warnings.m4]) m4_include([gl/m4/wchar_h.m4]) m4_include([gl/m4/xalloc.m4]) m4_include([gl/m4/xstrndup.m4]) m4_include([gl/m4/xvasprintf.m4]) m4_include([m4/fcntl-o.m4]) m4_include([m4/gettext.m4]) m4_include([m4/gtk-doc.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intlmacosx.m4]) m4_include([m4/inttypes_h.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libtool.m4]) m4_include([m4/longlong.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/nls.m4]) m4_include([m4/pkg.m4]) m4_include([m4/po.m4]) m4_include([m4/progtest.m4]) m4_include([m4/size_max.m4]) m4_include([m4/stdint_h.m4]) m4_include([m4/update-header-version.m4]) m4_include([m4/wchar_t.m4]) m4_include([m4/wint_t.m4]) m4_include([m4/xsize.m4]) shishi-1.0.2/lib/0000755000000000000000000000000012126773313010523 500000000000000shishi-1.0.2/lib/crypto-3des.c0000664000000000000000000001742712126660507013000 00000000000000/* crypto-3des.c --- 3DES crypto functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "crypto.h" /* Get _shishi_escapeprint, etc. */ #include "utils.h" static int _des3_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_encrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int _des3_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_decrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int des3none_dencrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen, int direction) { int res; if (keyusage != 0) { Shishi_key *derivedkey; res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_PRIVACY, &derivedkey); if (res != SHISHI_OK) return res; res = _shishi_simplified_dencrypt (handle, derivedkey, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, direction); shishi_key_done (derivedkey); if (res != SHISHI_OK) return res; } else { res = _shishi_simplified_dencrypt (handle, key, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, direction); if (res != SHISHI_OK) return res; } return SHISHI_OK; } static int des3none_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des3none_dencrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, 0); } static int des3none_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des3none_dencrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, 1); } static void des_set_odd_key_parity (char key[8]) { int i, j; for (i = 0; i < 8; i++) { int n_set_bits = 0; for (j = 1; j < 8; j++) if (key[i] & (1 << j)) n_set_bits++; key[i] &= ~1; if ((n_set_bits % 2) == 0) key[i] |= 1; } } /* The 168 bits of random key data are converted to a protocol key * value as follows. First, the 168 bits are divided into three * groups of 56 bits, which are expanded individually into 64 bits as * follows: * * 1 2 3 4 5 6 7 p * 9 10 11 12 13 14 15 p * 17 18 19 20 21 22 23 p * 25 26 27 28 29 30 31 p * 33 34 35 36 37 38 39 p * 41 42 43 44 45 46 47 p * 49 50 51 52 53 54 55 p * 56 48 40 32 24 16 8 p * * The "p" bits are parity bits computed over the data bits. The * output of the three expansions are concatenated to form the * protocol key value. * */ static int des3_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { char tmpkey[3 * 8]; int i; if (rndlen < 168 / 8) return !SHISHI_OK; if (VERBOSECRYPTO (handle)) { printf ("des3_random_to_key (random)\n"); printf ("\t ;; random (length %d):\n", 168 / 8); _shishi_hexprint (rnd, 168 / 8); _shishi_binprint (rnd, 168 / 8); } memcpy (tmpkey, rnd, 7); memcpy (tmpkey + 8, rnd + 7, 7); memcpy (tmpkey + 16, rnd + 14, 7); for (i = 0; i < 3; i++) { tmpkey[i * 8 + 7] = ((tmpkey[i * 8 + 0] & 0x01) << 1) | ((tmpkey[i * 8 + 1] & 0x01) << 2) | ((tmpkey[i * 8 + 2] & 0x01) << 3) | ((tmpkey[i * 8 + 3] & 0x01) << 4) | ((tmpkey[i * 8 + 4] & 0x01) << 5) | ((tmpkey[i * 8 + 5] & 0x01) << 6) | ((tmpkey[i * 8 + 6] & 0x01) << 7); des_set_odd_key_parity (tmpkey + i * 8); } shishi_key_value_set (outkey, tmpkey); if (VERBOSECRYPTO (handle)) { printf ("key = des3_random_to_key (random)\n"); printf ("\t ;; key:\n"); _shishi_hexprint (tmpkey, 3 * 8); _shishi_binprint (tmpkey, 3 * 8); } return SHISHI_OK; } static int des3_string_to_key (Shishi * handle, const char *string, size_t stringlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { char *s; int n_s; Shishi_key *key; char nfold[168 / 8]; int nfoldlen = 168 / 8; int res; if (VERBOSECRYPTO (handle)) { printf ("des3_string_to_key (string, salt)\n"); printf ("\t ;; String:\n"); _shishi_escapeprint (string, stringlen); _shishi_hexprint (string, stringlen); printf ("\t ;; Salt:\n"); _shishi_escapeprint (salt, saltlen); _shishi_hexprint (salt, saltlen); } /* s = passwordString + salt */ n_s = stringlen + saltlen; s = xmalloc (n_s); memcpy (s, string, stringlen); memcpy (s + stringlen, salt, saltlen); /* tmpKey = random-to-key(168-fold(s)) */ res = shishi_n_fold (handle, s, n_s, nfold, nfoldlen); free (s); if (res != SHISHI_OK) return res; res = shishi_key_from_value (handle, shishi_key_type (outkey), NULL, &key); if (res != SHISHI_OK) return res; res = des3_random_to_key (handle, nfold, nfoldlen, key); if (res == SHISHI_OK) /* key = DK (tmpKey, Constant) */ res = shishi_dk (handle, key, SHISHI_DK_CONSTANT, strlen (SHISHI_DK_CONSTANT), outkey); shishi_key_done (key); if (res != SHISHI_OK) return res; if (VERBOSECRYPTO (handle)) { printf ("des3_string_to_key (string, salt)\n"); printf ("\t ;; Key:\n"); _shishi_hexprint (shishi_key_value (outkey), shishi_key_length (outkey)); _shishi_binprint (shishi_key_value (outkey), shishi_key_length (outkey)); } return SHISHI_OK; } static int des3_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen); } cipherinfo des3_cbc_none_info = { SHISHI_DES3_CBC_NONE, "des3-cbc-none", 8, 8, 3 * 8, 3 * 8, SHISHI_HMAC_SHA1_DES3_KD, des3_random_to_key, des3_string_to_key, des3none_encrypt, des3none_decrypt }; cipherinfo des3_cbc_sha1_kd_info = { SHISHI_DES3_CBC_HMAC_SHA1_KD, "des3-cbc-sha1-kd", 8, 8, 3 * 8, 3 * 8, SHISHI_HMAC_SHA1_DES3_KD, des3_random_to_key, des3_string_to_key, _des3_encrypt, _des3_decrypt }; checksuminfo hmac_sha1_des3_kd_info = { SHISHI_HMAC_SHA1_DES3_KD, "hmac-sha1-des3-kd", 20, des3_checksum, NULL }; shishi-1.0.2/lib/asn1.c0000664000000000000000000011127612126663132011460 00000000000000/* asn1.c --- Utilities to manipulate RFC 1510 ASN.1 types. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi is distributed in the hope that it will be useful, but 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Normally internal.h pulls in config.h, but since internal.h also pulls in shishi.h, and we need to pull in libtasn1.h before shishi.h to get Shishi_asn1 definition correct, we need to pull in config.h here to avoid libtasn1.h pulling in system header files without having parsed config.h first. */ #include #include #include "internal.h" #include "asn1.h" #define ASN1NAME "KerberosV5Spec2." /* Generated by asn1Parser from ASN.1 module. */ extern const ASN1_ARRAY_TYPE shishi_asn1_tab[]; /* Prototype in asn1.h, used by init.c. */ int _shishi_asn1_init (Shishi * handle) { char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE] = ""; int asn1_result; if (!asn1_check_version (ASN1_VERSION)) { shishi_warn (handle, "asn1_check-version(%s) failed: %s", ASN1_VERSION, asn1_check_version (NULL)); return SHISHI_ASN1_ERROR; } if (!asn1_check_version ("0.2.5")) shishi_warn (handle, "libtasn1 >= 0.2.5 preferred, you may see bugs."); asn1_result = asn1_array2tree (shishi_asn1_tab, &handle->asn1, errorDescription); if (asn1_result != ASN1_SUCCESS) { shishi_warn (handle, "asn1_array2tree() failed: %s\n", asn1_strerror (asn1_result)); shishi_warn (handle, "%s", errorDescription); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } int shishi_asn1_number_of_elements (Shishi * handle, Shishi_asn1 node, const char *field, size_t * n) { int rc; int tmp; rc = asn1_number_of_elements (node, field, &tmp); *n = tmp; if (rc != ASN1_SUCCESS) { if (rc == ASN1_ELEMENT_NOT_FOUND) return SHISHI_ASN1_NO_ELEMENT; else return SHISHI_ASN1_ERROR; } return SHISHI_OK; } int shishi_asn1_empty_p (Shishi * handle, Shishi_asn1 node, const char *field) { int rc; int datalen; datalen = 0; rc = asn1_read_value (node, field, NULL, &datalen); if (rc == ASN1_VALUE_NOT_FOUND) return 1; return 0; } /** * shishi_asn1_read_inline: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 variable to read field from. * @field: name of field in @node to read. * @data: pre-allocated output buffer that will hold ASN.1 field data. * @datalen: on input, maximum size of output buffer, * on output, actual size of output buffer. * * Extract data stored in a ASN.1 field into a fixed size buffer * allocated by caller. * * Note that since it is difficult to predict the length of the field, * it is often better to use shishi_asn1_read() instead. * * Return value: Returns SHISHI_OK if successful, * SHISHI_ASN1_NO_ELEMENT if the element do not exist, * SHISHI_ASN1_NO_VALUE if the field has no value, ot * SHISHI_ASN1_ERROR otherwise. **/ int shishi_asn1_read_inline (Shishi * handle, Shishi_asn1 node, const char *field, char *data, size_t * datalen) { int rc; rc = asn1_read_value (node, field, (unsigned char *) data, (int *) datalen); if (rc != ASN1_SUCCESS) { shishi_error_set (handle, asn1_strerror (rc)); if (rc == ASN1_ELEMENT_NOT_FOUND) return SHISHI_ASN1_NO_ELEMENT; else if (rc == ASN1_VALUE_NOT_FOUND) return SHISHI_ASN1_NO_VALUE; else return SHISHI_ASN1_ERROR; } return SHISHI_OK; } /** * shishi_asn1_read: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 variable to read field from. * @field: name of field in @node to read. * @data: newly allocated output buffer that will hold ASN.1 field data. * @datalen: actual size of output buffer. * * Extract data stored in a ASN.1 field into a newly allocated buffer. * The buffer will always be zero terminated, even though @datalen * will not include the added zero. * * Return value: Returns SHISHI_OK if successful, * SHISHI_ASN1_NO_ELEMENT if the element do not exist, * SHISHI_ASN1_NO_VALUE if the field has no value, ot * SHISHI_ASN1_ERROR otherwise. **/ int shishi_asn1_read (Shishi * handle, Shishi_asn1 node, const char *field, char **data, size_t * datalen) { int rc; int len = 0; rc = asn1_read_value (node, field, NULL, &len); if (rc != ASN1_SUCCESS && rc != ASN1_MEM_ERROR) { shishi_error_set (handle, asn1_strerror (rc)); if (rc == ASN1_ELEMENT_NOT_FOUND) return SHISHI_ASN1_NO_ELEMENT; else if (rc == ASN1_VALUE_NOT_FOUND) return SHISHI_ASN1_NO_VALUE; else return SHISHI_ASN1_ERROR; } if (data) { size_t dlen = (size_t) len; *data = xmalloc (len + 1); if (len > 0) { rc = shishi_asn1_read_inline (handle, node, field, *data, &dlen); if (rc != SHISHI_OK) return rc; } (*data)[len] = '\0'; } if (datalen) *datalen = (size_t) len; return SHISHI_OK; } /** * shishi_asn1_read_optional: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 variable to read field from. * @field: name of field in @node to read. * @data: newly allocated output buffer that will hold ASN.1 field data. * @datalen: actual size of output buffer. * * Extract data stored in a ASN.1 field into a newly allocated buffer. * If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this * function set datalen to 0 and succeeds. Can be useful to read * ASN.1 fields which are marked OPTIONAL in the grammar, if you want * to avoid special error handling in your code. * * Return value: Returns SHISHI_OK if successful, * SHISHI_ASN1_NO_VALUE if the field has no value, ot * SHISHI_ASN1_ERROR otherwise. **/ int shishi_asn1_read_optional (Shishi * handle, Shishi_asn1 node, const char *field, char **data, size_t * datalen) { int rc; rc = shishi_asn1_read (handle, node, field, data, datalen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT) return rc; if (rc == SHISHI_ASN1_NO_ELEMENT) if (datalen) *datalen = 0; return SHISHI_OK; } #define C2I(buf) ((buf[3] & 0xFF) | \ ((buf[2] & 0xFF) << 8) | \ ((buf[1] & 0xFF) << 16) | \ ((buf[0] & 0xFF) << 24)) int shishi_asn1_read_int32 (Shishi * handle, Shishi_asn1 node, const char *field, int32_t * i) { char buf[4]; size_t buflen; int rc; memset (buf, 0, sizeof (buf)); buflen = sizeof (buf); rc = shishi_asn1_read_inline (handle, node, field, buf, &buflen); if (rc != SHISHI_OK) return rc; if (buflen < 4) { memset (buf, 0, sizeof (buf)); rc = shishi_asn1_read_inline (handle, node, field, &buf[4 - buflen], &buflen); if (rc != SHISHI_OK) return rc; } *i = C2I (buf); return SHISHI_OK; } int shishi_asn1_read_uint32 (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t * i) { return shishi_asn1_read_int32 (handle, node, field, (int32_t *) i); } int shishi_asn1_read_integer (Shishi * handle, Shishi_asn1 node, const char *field, int *i) { return shishi_asn1_read_int32 (handle, node, field, (int32_t *) i); } int shishi_asn1_read_bitstring (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t * flags) { char *buf; size_t buflen; size_t i; int res; res = shishi_asn1_read (handle, node, field, &buf, &buflen); if (res != SHISHI_OK) return res; if (buflen < 4) return SHISHI_ASN1_ERROR; *flags = 0; for (i = 0; i < 4; i++) { *flags |= (((buf[i] >> 7) & 0x01) | ((buf[i] >> 5) & 0x02) | ((buf[i] >> 3) & 0x04) | ((buf[i] >> 1) & 0x08) | ((buf[i] << 1) & 0x10) | ((buf[i] << 3) & 0x20) | ((buf[i] << 5) & 0x40) | ((buf[i] << 7) & 0x80)) << (8 * i); } return SHISHI_OK; } int shishi_asn1_write (Shishi * handle, Shishi_asn1 node, const char *field, const char *data, size_t datalen) { int rc; rc = asn1_write_value (node, field, (const unsigned char *) data, (int) datalen); if (rc != ASN1_SUCCESS) { shishi_error_set (handle, asn1_strerror (rc)); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } int shishi_asn1_write_uint32 (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t n) { char *buf; int res; asprintf (&buf, "%lu", (unsigned long) n); res = shishi_asn1_write (handle, node, field, buf, 0); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_asn1_write_int32 (Shishi * handle, Shishi_asn1 node, const char *field, int32_t n) { char *buf; int res; asprintf (&buf, "%ld", (signed long) n); res = shishi_asn1_write (handle, node, field, buf, 0); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_asn1_write_integer (Shishi * handle, Shishi_asn1 node, const char *field, int n) { return shishi_asn1_write_int32 (handle, node, field, (int32_t) n); } int shishi_asn1_write_bitstring (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t flags) { char buf[4]; size_t i; int res; /* XXX Cannot handle bit strings longer than 32 bits. Currently not needed though. */ for (i = 0; i < 4; i++) { buf[i] = ((((flags >> (8 * i)) >> 7) & 0x01) | (((flags >> (8 * i)) >> 5) & 0x02) | (((flags >> (8 * i)) >> 3) & 0x04) | (((flags >> (8 * i)) >> 1) & 0x08) | (((flags >> (8 * i)) << 1) & 0x10) | (((flags >> (8 * i)) << 3) & 0x20) | (((flags >> (8 * i)) << 5) & 0x40) | (((flags >> (8 * i)) << 7) & 0x80)); } res = shishi_asn1_write (handle, node, field, buf, 32); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_asn1_done: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 node to dellocate. * * Deallocate resources associated with ASN.1 structure. Note that * the node must not be used after this call. **/ void shishi_asn1_done (Shishi * handle, Shishi_asn1 node) { int rc; if (node) { rc = asn1_delete_structure (&node); if (rc != ASN1_SUCCESS) shishi_error_printf (handle, "Cannot dellocate ASN.1 structure: %s", asn1_strerror (rc)); } } static Shishi_asn1 asn1_new (Shishi * handle, const char *field, const char *name) { ASN1_TYPE node = ASN1_TYPE_EMPTY; int res; res = asn1_create_element (handle->asn1, field, &node); if (res != ASN1_SUCCESS) { shishi_error_set (handle, asn1_strerror (res)); return NULL; } return (Shishi_asn1) node; } /** * shishi_asn1_pa_enc_ts_enc: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for PA-ENC-TS-ENC. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_pa_enc_ts_enc (Shishi * handle) { return asn1_new (handle, ASN1NAME "PA-ENC-TS-ENC", "PA-ENC-TS-ENC"); } /** * shishi_asn1_encrypteddata: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for EncryptedData * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_encrypteddata (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncryptedData", "EncryptedData"); } /** * shishi_asn1_padata: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for PA-DATA. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_padata (Shishi * handle) { return asn1_new (handle, ASN1NAME "PA-DATA", "PA-DATA"); } /** * shishi_asn1_methoddata: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for METHOD-DATA. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_methoddata (Shishi * handle) { return asn1_new (handle, ASN1NAME "METHOD-DATA", "METHOD-DATA"); } /** * shishi_asn1_etype_info: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for ETYPE-INFO. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_etype_info (Shishi * handle) { return asn1_new (handle, ASN1NAME "ETYPE-INFO", "ETYPE-INFO"); } /** * shishi_asn1_etype_info2: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for ETYPE-INFO2. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_etype_info2 (Shishi * handle) { return asn1_new (handle, ASN1NAME "ETYPE-INFO2", "ETYPE-INFO2"); } /** * shishi_asn1_asreq: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for AS-REQ. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_asreq (Shishi * handle) { return asn1_new (handle, ASN1NAME "AS-REQ", "KDC-REQ"); } /** * shishi_asn1_asrep: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for AS-REP. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_asrep (Shishi * handle) { return asn1_new (handle, ASN1NAME "AS-REP", "KDC-REP"); } /** * shishi_asn1_tgsreq: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for TGS-REQ. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_tgsreq (Shishi * handle) { return asn1_new (handle, ASN1NAME "TGS-REQ", "KDC-REQ"); } /** * shishi_asn1_tgsrep: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for TGS-REP. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_tgsrep (Shishi * handle) { return asn1_new (handle, ASN1NAME "TGS-REP", "KDC-REP"); } /** * shishi_asn1_apreq: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for AP-REQ. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_apreq (Shishi * handle) { return asn1_new (handle, ASN1NAME "AP-REQ", "AP-REQ"); } /** * shishi_asn1_aprep: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for AP-REP. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_aprep (Shishi * handle) { return asn1_new (handle, ASN1NAME "AP-REP", "AP-REP"); } /** * shishi_asn1_encapreppart: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for AP-REP. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_encapreppart (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncAPRepPart", "EncAPRepPart"); } /** * shishi_asn1_ticket: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for Ticket. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_ticket (Shishi * handle) { return asn1_new (handle, ASN1NAME "Ticket", "Ticket"); } /** * shishi_asn1_encticketpart: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for EncTicketPart. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_encticketpart (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncTicketPart", "EncTicketPart"); } /** * shishi_asn1_authenticator: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for Authenticator. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_authenticator (Shishi * handle) { return asn1_new (handle, ASN1NAME "Authenticator", "Authenticator"); } /** * shishi_asn1_enckdcreppart: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for EncKDCRepPart. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_enckdcreppart (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncKDCRepPart", "EncKDCRepPart"); } /** * shishi_asn1_encasreppart: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for EncASRepPart. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_encasreppart (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncASRepPart", "EncKDCRepPart"); } /** * shishi_asn1_krberror: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for KRB-ERROR. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_krberror (Shishi * handle) { return asn1_new (handle, ASN1NAME "KRB-ERROR", "KRB-ERROR"); } /** * shishi_asn1_krbsafe: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for KRB-SAFE. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_krbsafe (Shishi * handle) { return asn1_new (handle, ASN1NAME "KRB-SAFE", "KRB-SAFE"); } /** * shishi_asn1_priv: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for KRB-PRIV. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_priv (Shishi * handle) { return asn1_new (handle, ASN1NAME "KRB-PRIV", "KRB-PRIV"); } /** * shishi_asn1_encprivpart: * @handle: shishi handle as allocated by shishi_init(). * * Create new ASN.1 structure for EncKrbPrivPart. * * Return value: Returns ASN.1 structure. **/ Shishi_asn1 shishi_asn1_encprivpart (Shishi * handle) { return asn1_new (handle, ASN1NAME "EncKrbPrivPart", "EncKrbPrivPart"); } /** * shishi_asn1_to_der_field: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 data that have field to extract. * @field: name of field in @node to extract. * @der: output array that holds DER encoding of @field in @node. * @len: output variable with length of @der output array. * * Extract newly allocated DER representation of specified ASN.1 field. * * Return value: Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR * if DER encoding fails (common reasons for this is that the ASN.1 * is missing required values). **/ int shishi_asn1_to_der_field (Shishi * handle, Shishi_asn1 node, const char *field, char **der, size_t * len) { char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE] = ""; int mylen = 0; int rc; rc = asn1_der_coding (node, field, NULL, &mylen, errorDescription); if (rc != ASN1_MEM_ERROR) { shishi_error_set (handle, errorDescription); return SHISHI_ASN1_ERROR; } *der = xmalloc (mylen); rc = asn1_der_coding (node, field, *der, &mylen, errorDescription); if (rc != ASN1_SUCCESS) { shishi_error_set (handle, errorDescription); return SHISHI_ASN1_ERROR; } if (strcmp (field, "req-body") == 0) { unsigned char class; int derlen, derlen2; unsigned long tag; signed long lenlen; /* XXX when encoding a field inside a SEQUENCE, libtasn1 appear to include the tag from the SEQUENCE in the encoding of a particular field. This appear wrong, so we frob it here. This typically happens when encoding req-body in KDC-REQ for TGS checksums. */ rc = asn1_get_tag_der ((unsigned char *) *der, mylen, &class, &derlen, &tag); if (rc != ASN1_SUCCESS) { shishi_error_set (handle, errorDescription); return SHISHI_ASN1_ERROR; } lenlen = asn1_get_length_der ((unsigned char *) *der + derlen, mylen - derlen, &derlen2); if (lenlen < 0) return SHISHI_ASN1_ERROR; if (derlen + derlen2 < mylen) { mylen -= derlen + derlen2; memmove (*der, *der + derlen + derlen2, mylen); } } *len = mylen; return SHISHI_OK; } /** * shishi_asn1_to_der: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 data to convert to DER. * @der: output array that holds DER encoding of @node. * @len: output variable with length of @der output array. * * Extract newly allocated DER representation of specified ASN.1 data. * * Return value: Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR * if DER encoding fails (common reasons for this is that the ASN.1 * is missing required values). **/ int shishi_asn1_to_der (Shishi * handle, Shishi_asn1 node, char **der, size_t * len) { return shishi_asn1_to_der_field (handle, node, "", der, len); } static Shishi_asn1 der2asn1 (Shishi * handle, const char *fieldname, const char *nodename, const char *der, size_t derlen) { char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE] = ""; Shishi_asn1 structure = NULL; int asn1_result = ASN1_SUCCESS; asn1_result = asn1_create_element (handle->asn1, fieldname, &structure); if (asn1_result != ASN1_SUCCESS) { shishi_error_set (handle, asn1_strerror (asn1_result)); return NULL; } asn1_result = asn1_der_decoding (&structure, (const unsigned char *) der, (int) derlen, errorDescription); if (asn1_result != ASN1_SUCCESS) { asn1_delete_structure (&structure); shishi_error_set (handle, errorDescription); return NULL; } return structure; } /** * shishi_asn1_msgtype: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 type to get msg type for. * * Determine msg-type of ASN.1 type of a packet. Currently this uses * the msg-type field instead of the APPLICATION tag, but this may be * changed in the future. * * Return value: Returns msg-type of ASN.1 type, 0 on failure. **/ Shishi_msgtype shishi_asn1_msgtype (Shishi * handle, Shishi_asn1 node) { asn1_retCode rc; uint32_t msgtype; /* XXX Use APPLICATION tag instead. */ rc = shishi_asn1_read_uint32 (handle, node, "msg-type", &msgtype); if (rc != SHISHI_OK) return 0; return msgtype; } /** * shishi_der_msgtype: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Determine msg-type of DER coded data of a packet. * * Return value: Returns msg-type of DER data, 0 on failure. **/ Shishi_msgtype shishi_der_msgtype (Shishi * handle, const char *der, size_t derlen) { /* XXX Doesn't handle APPLICATION TAGS > 31. */ if (derlen > 1 && *der >= 0x60 && (unsigned char) *der <= 0x7F) return *der - 0x60; else return 0; } /** * shishi_der2asn1: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Convert arbitrary DER data of a packet to a ASN.1 type. * * Return value: Returns newly allocate ASN.1 corresponding to DER * data, or %NULL on failure. **/ Shishi_asn1 shishi_der2asn1 (Shishi * handle, const char *der, size_t derlen) { Shishi_asn1 node = NULL; switch (shishi_der_msgtype (handle, der, derlen)) { case SHISHI_MSGTYPE_AS_REQ: node = shishi_der2asn1_asreq (handle, der, derlen); break; case SHISHI_MSGTYPE_AS_REP: node = shishi_der2asn1_asrep (handle, der, derlen); break; case SHISHI_MSGTYPE_TGS_REQ: node = shishi_der2asn1_tgsreq (handle, der, derlen); break; case SHISHI_MSGTYPE_TGS_REP: node = shishi_der2asn1_tgsrep (handle, der, derlen); break; case SHISHI_MSGTYPE_AP_REQ: node = shishi_der2asn1_apreq (handle, der, derlen); break; case SHISHI_MSGTYPE_AP_REP: node = shishi_der2asn1_aprep (handle, der, derlen); break; case SHISHI_MSGTYPE_SAFE: node = shishi_der2asn1_krbsafe (handle, der, derlen); break; case SHISHI_MSGTYPE_PRIV: node = shishi_der2asn1_priv (handle, der, derlen); break; case SHISHI_MSGTYPE_CRED: /* node = shishi_der2asn1_cred (handle, der, derlen); */ break; case SHISHI_MSGTYPE_ERROR: node = shishi_der2asn1_krberror (handle, der, derlen); break; case SHISHI_MSGTYPE_RESERVED16: case SHISHI_MSGTYPE_RESERVED17: default: node = NULL; break; } return node; } /** * shishi_der2asn1_padata: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of PA-DATA and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_padata (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "PA-DATA", "PA-DATA", der, derlen); } /** * shishi_der2asn1_methoddata: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of METHOD-DATA and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_methoddata (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "METHOD-DATA", "METHOD-DATA", der, derlen); } /** * shishi_der2asn1_etype_info: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of ETYPE-INFO and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_etype_info (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "ETYPE-INFO", "ETYPE-INFO", der, derlen); } /** * shishi_der2asn1_etype_info2: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of ETYPE-INFO2 and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_etype_info2 (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "ETYPE-INFO2", "ETYPE-INFO2", der, derlen); } /** * shishi_der2asn1_ticket: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of Ticket and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_ticket (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "Ticket", "Ticket", der, derlen); } /** * shishi_der2asn1_encticketpart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncTicketPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_encticketpart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncTicketPart", "EncTicketPart", der, derlen); } /** * shishi_der2asn1_asreq: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of AS-REQ and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_asreq (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "AS-REQ", "KDC-REQ", der, derlen); } /** * shishi_der2asn1_tgsreq: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of TGS-REQ and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_tgsreq (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "TGS-REQ", "KDC-REQ", der, derlen); } /** * shishi_der2asn1_asrep: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of AS-REP and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_asrep (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "AS-REP", "KDC-REP", der, derlen); } /** * shishi_der2asn1_tgsrep: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of TGS-REP and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_tgsrep (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "TGS-REP", "KDC-REP", der, derlen); } /** * shishi_der2asn1_kdcrep: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of KDC-REP and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_kdcrep (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "KDC-REP", "KDC-REP", der, derlen); } /** * shishi_der2asn1_encasreppart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncASRepPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_encasreppart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncASRepPart", "EncKDCRepPart", der, derlen); } /** * shishi_der2asn1_enctgsreppart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncTGSRepPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_enctgsreppart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncTGSRepPart", "EncKDCRepPart", der, derlen); } /** * shishi_der2asn1_enckdcreppart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncKDCRepPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_enckdcreppart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncKDCRepPart", "EncKDCRepPart", der, derlen); } /** * shishi_der2asn1_authenticator: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of Authenticator and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_authenticator (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "Authenticator", "Authenticator", der, derlen); } /** * shishi_der2asn1_krberror: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of KRB-ERROR and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_krberror (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "KRB-ERROR", "KRB-ERROR", der, derlen); } /** * shishi_der2asn1_krbsafe: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of KRB-SAFE and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_krbsafe (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "KRB-SAFE", "KRB-SAFE", der, derlen); } /** * shishi_der2asn1_priv: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of KRB-PRIV and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_priv (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "KRB-PRIV", "KRB-PRIV", der, derlen); } /** * shishi_der2asn1_encprivpart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_encprivpart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncKrbPrivPart", "EncKrbPrivPart", der, derlen); } /** * shishi_der2asn1_apreq: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of AP-REQ and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_apreq (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "AP-REQ", "AP-REQ", der, derlen); } /** * shishi_der2asn1_aprep: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of AP-REP and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_aprep (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "AP-REP", "AP-REP", der, derlen); } /** * shishi_der2asn1_encapreppart: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of EncAPRepPart and create a ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_encapreppart (Shishi * handle, const char *der, size_t derlen) { return der2asn1 (handle, ASN1NAME "EncAPRepPart", "EncAPRepPart", der, derlen); } /** * shishi_der2asn1_kdcreq: * @handle: shishi handle as allocated by shishi_init(). * @der: input character array with DER encoding. * @derlen: length of input character array with DER encoding. * * Decode DER encoding of AS-REQ, TGS-REQ or KDC-REQ and create a * ASN.1 structure. * * Return value: Returns ASN.1 structure corresponding to DER data. **/ Shishi_asn1 shishi_der2asn1_kdcreq (Shishi * handle, const char *der, size_t derlen) { Shishi_asn1 structure = NULL; structure = shishi_der2asn1_asreq (handle, der, derlen); if (structure == NULL) { printf ("der2asn1_kdcreq: not asreq\n"); shishi_error_printf (handle, "Could not DER decode AS-REQ\n"); structure = shishi_der2asn1_tgsreq (handle, der, derlen); if (structure == NULL) { printf ("der2asn1_kdcreq: not tgsreq\n"); shishi_error_printf (handle, "Could not DER decode TGS-REQ\n"); structure = shishi_der2asn1_kdcreq (handle, der, derlen); if (structure == NULL) { printf ("der2asn1_kdcreq: not kdcreq\n"); shishi_error_printf (handle, "Could not DER decode KDC-REQ\n"); return NULL; } else printf ("der2asn1_kdcreq: kdcreq!!\n"); } } return structure; } /** * shishi_asn1_print: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 data that have field to extract. * @fh: file descriptor to print to, e.g. stdout. * * Print ASN.1 structure in human readable form, typically for * debugging purposes. **/ void shishi_asn1_print (Shishi * handle, Shishi_asn1 node, FILE * fh) { asn1_print_structure (fh, node, "", ASN1_PRINT_NAME_TYPE_VALUE); } shishi-1.0.2/lib/apreq.c0000664000000000000000000005534312126660507011733 00000000000000/* apreq.c --- AP-REQ functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi is distributed in the hope that it will be useful, but 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" #define SHISHI_APREQ_DEFAULT_PVNO "5" #define SHISHI_APREQ_DEFAULT_PVNO_LEN 0 #define SHISHI_APREQ_DEFAULT_MSG_TYPE "14" /* KRB_AP_REQ */ #define SHISHI_APREQ_DEFAULT_MSG_TYPE_LEN 0 #define SHISHI_APREQ_DEFAULT_AP_OPTIONS "\x00\x00\x00\x00" #define SHISHI_APREQ_DEFAULT_AP_OPTIONS_LEN 32 #define SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO "5" #define SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO_LEN 0 #define SHISHI_APREQ_DEFAULT_TICKET_REALM "" #define SHISHI_APREQ_DEFAULT_TICKET_REALM_LEN 0 #define SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE "1" /* SHISHI_NT_PRINCIPAL */ #define SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE_LEN 0 #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE "0" #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE_LEN 0 #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO "0" #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO_LEN 0 #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER "" #define SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER_LEN 0 #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE "0" #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE_LEN 0 #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO "1" #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO_LEN 0 #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER "" #define SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER_LEN 0 /** * shishi_apreq: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new AP-REQ, populated with some default * values. * * Return value: Returns the AP-REQ or NULL on failure. **/ Shishi_asn1 shishi_apreq (Shishi * handle) { Shishi_asn1 node; int res; node = shishi_asn1_apreq (handle); if (!node) goto error; res = shishi_asn1_write (handle, node, "pvno", SHISHI_APREQ_DEFAULT_PVNO, SHISHI_APREQ_DEFAULT_PVNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "msg-type", SHISHI_APREQ_DEFAULT_MSG_TYPE, SHISHI_APREQ_DEFAULT_MSG_TYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ap-options", SHISHI_APREQ_DEFAULT_AP_OPTIONS, SHISHI_APREQ_DEFAULT_AP_OPTIONS_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.tkt-vno", SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO, SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.realm", SHISHI_APREQ_DEFAULT_TICKET_REALM, SHISHI_APREQ_DEFAULT_TICKET_REALM_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.realm", SHISHI_APREQ_DEFAULT_TICKET_REALM, SHISHI_APREQ_DEFAULT_TICKET_REALM_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.sname.name-type", SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE, SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.enc-part.etype", SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE, SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.enc-part.kvno", SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO, SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ticket.enc-part.cipher", SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER, SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "authenticator.etype", SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE, SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "authenticator.kvno", SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO, SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "authenticator.cipher", SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER, SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER_LEN); if (res != SHISHI_OK) goto error; return node; error: if (node) shishi_asn1_done (handle, node); return NULL; } /** * shishi_apreq_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @apreq: AP-REQ to print. * * Print ASCII armored DER encoding of AP-REQ to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_print (Shishi * handle, FILE * fh, Shishi_asn1 apreq) { return _shishi_print_armored_data (handle, fh, apreq, "AP-REQ", NULL); } /** * shishi_apreq_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @apreq: AP-REQ to save. * * Save DER encoding of AP-REQ to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_save (Shishi * handle, FILE * fh, Shishi_asn1 apreq) { return _shishi_save_data (handle, fh, apreq, "AP-REQ"); } /** * shishi_apreq_to_file: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write AP-REQ to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_to_file (Shishi * handle, Shishi_asn1 apreq, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing AP-REQ to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing AP-REQ in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_apreq_print (handle, fh, apreq); else res = shishi_apreq_save (handle, fh, apreq); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing AP-REQ to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_apreq_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @apreq: output variable with newly allocated AP-REQ. * * Read ASCII armored DER encoded AP-REQ from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * apreq) { return _shishi_apreq_input (handle, fh, apreq, 0); } /** * shishi_apreq_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @apreq: output variable with newly allocated AP-REQ. * * Read DER encoded AP-REQ from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * apreq) { return _shishi_apreq_input (handle, fh, apreq, 1); } /** * shishi_apreq_from_file: * @handle: shishi handle as allocated by shishi_init(). * @apreq: output variable with newly allocated AP-REQ. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read AP-REQ from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_from_file (Shishi * handle, Shishi_asn1 * apreq, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading AP-REQ from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading AP-REQ in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_apreq_parse (handle, fh, apreq); else res = shishi_apreq_read (handle, fh, apreq); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading AP-REQ from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_apreq_set_authenticator: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ to add authenticator field to. * @etype: encryption type used to encrypt authenticator. * @kvno: version of the key used to encrypt authenticator. * @buf: input array with encrypted authenticator. * @buflen: size of input array with encrypted authenticator. * * Set the encrypted authenticator field in the AP-REP. The encrypted * data is usually created by calling shishi_encrypt() on the DER * encoded authenticator. To save time, you may want to use * shishi_apreq_add_authenticator() instead, which calculates the * encrypted data and calls this function in one step. * * Return value: Returns SHISHI_OK on success. **/ int shishi_apreq_set_authenticator (Shishi * handle, Shishi_asn1 apreq, int32_t etype, uint32_t kvno, const char *buf, size_t buflen) { int res; res = shishi_asn1_write (handle, apreq, "authenticator.cipher", buf, buflen); if (res != SHISHI_OK) return res; if (kvno == UINT32_MAX) res = shishi_asn1_write (handle, apreq, "authenticator.kvno", NULL, 0); else res = shishi_asn1_write_int32 (handle, apreq, "authenticator.kvno", kvno); if (res != SHISHI_OK) return res; res = shishi_asn1_write_int32 (handle, apreq, "authenticator.etype", etype); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_apreq_add_authenticator: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ to add authenticator field to. * @key: key to to use for encryption. * @keyusage: cryptographic key usage value to use in encryption. * @authenticator: authenticator as allocated by shishi_authenticator(). * * Encrypts DER encoded authenticator using key and store it in the * AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_add_authenticator (Shishi * handle, Shishi_asn1 apreq, Shishi_key * key, int keyusage, Shishi_asn1 authenticator) { int res; char *buf; size_t buflen; char *der; size_t derlen; res = shishi_asn1_to_der (handle, authenticator, &der, &derlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode authenticator: %s\n", shishi_strerror (res)); return res; } res = shishi_encrypt (handle, key, keyusage, der, derlen, &buf, &buflen); free (der); if (res != SHISHI_OK) { shishi_error_printf (handle, "Cannot encrypt authenticator.\n"); return res; } res = shishi_apreq_set_authenticator (handle, apreq, shishi_key_type (key), shishi_key_version (key), buf, buflen); return res; } /** * shishi_apreq_set_ticket: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ to add ticket field to. * @ticket: input ticket to copy into AP-REQ ticket field. * * Copy ticket into AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_set_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 ticket) { int res; char *format; char *buf; size_t buflen, i, n; res = shishi_asn1_read (handle, ticket, "tkt-vno", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, apreq, "ticket.tkt-vno", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "realm", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, apreq, "ticket.realm", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "sname.name-type", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, apreq, "ticket.sname.name-type", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, ticket, "sname.name-string", &n); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { res = shishi_asn1_write (handle, apreq, "ticket.sname.name-string", "NEW", 1); if (res != SHISHI_OK) return res; asprintf (&format, "sname.name-string.?%d", i); res = shishi_asn1_read (handle, ticket, format, &buf, &buflen); free (format); if (res != SHISHI_OK) return res; asprintf (&format, "ticket.sname.name-string.?%d", i); res = shishi_asn1_write (handle, apreq, format, buf, buflen); free (format); free (buf); if (res != SHISHI_OK) return res; } res = shishi_asn1_read (handle, ticket, "enc-part.etype", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, apreq, "ticket.enc-part.etype", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "enc-part.kvno", &buf, &buflen); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) return res; if (res == SHISHI_ASN1_NO_ELEMENT) res = shishi_asn1_write (handle, apreq, "ticket.enc-part.kvno", NULL, 0); else { res = shishi_asn1_write (handle, apreq, "ticket.enc-part.kvno", buf, buflen); free (buf); } if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "enc-part.cipher", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, apreq, "ticket.enc-part.cipher", buf, buflen); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_apreq_options: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ to get options from. * @flags: Output integer containing options from AP-REQ. * * Extract the AP-Options from AP-REQ into output integer. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_options (Shishi * handle, Shishi_asn1 apreq, uint32_t * flags) { return shishi_asn1_read_bitstring (handle, apreq, "ap-options", flags); } /** * shishi_apreq_use_session_key_p: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ as allocated by shishi_apreq(). * * Return non-0 iff the "Use session key" option is set in the AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_use_session_key_p (Shishi * handle, Shishi_asn1 apreq) { uint32_t options = 0; shishi_apreq_options (handle, apreq, &options); return options & SHISHI_APOPTIONS_USE_SESSION_KEY; } /** * shishi_apreq_mutual_required_p: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ as allocated by shishi_apreq(). * * Return non-0 iff the "Mutual required" option is set in the AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_mutual_required_p (Shishi * handle, Shishi_asn1 apreq) { uint32_t options = 0; shishi_apreq_options (handle, apreq, &options); return options & SHISHI_APOPTIONS_MUTUAL_REQUIRED; } /** * shishi_apreq_options_set: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ as allocated by shishi_apreq(). * @options: Options to set in AP-REQ. * * Set the AP-Options in AP-REQ to indicate integer. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_options_set (Shishi * handle, Shishi_asn1 apreq, uint32_t options) { int res; res = shishi_asn1_write_bitstring (handle, apreq, "ap-options", options); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_apreq_options_add: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ as allocated by shishi_apreq(). * @option: Options to add in AP-REQ. * * Add the AP-Options in AP-REQ. Options not set in input parameter * @option are preserved in the AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_options_add (Shishi * handle, Shishi_asn1 apreq, uint32_t option) { uint32_t options; int res; res = shishi_apreq_options (handle, apreq, &options); if (res != SHISHI_OK) return res; options |= option; res = shishi_apreq_options_set (handle, apreq, options); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_apreq_options_remove: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ as allocated by shishi_apreq(). * @option: Options to remove from AP-REQ. * * Remove the AP-Options from AP-REQ. Options not set in input * parameter @option are preserved in the AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_options_remove (Shishi * handle, Shishi_asn1 apreq, uint32_t option) { uint32_t options; int res; res = shishi_apreq_options (handle, apreq, &options); if (res != SHISHI_OK) return res; options &= ~(options & option); res = shishi_apreq_options_set (handle, apreq, options); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_apreq_get_authenticator_etype: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ variable to get value from. * @etype: output variable that holds the value. * * Extract AP-REQ.authenticator.etype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_get_authenticator_etype (Shishi * handle, Shishi_asn1 apreq, int32_t * etype) { return shishi_asn1_read_int32 (handle, apreq, "authenticator.etype", etype); } /** * shishi_apreq_get_ticket: * @handle: shishi handle as allocated by shishi_init(). * @apreq: AP-REQ variable to get ticket from. * @ticket: output variable to hold extracted ticket. * * Extract ticket from AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_apreq_get_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 * ticket) { char *buf; char *format; size_t buflen, i, n; int res; /* there's GOT to be an easier way to do this */ *ticket = shishi_ticket (handle); if (!*ticket) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, apreq, "ticket.tkt-vno", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "tkt-vno", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, apreq, "ticket.realm", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "realm", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, apreq, "ticket.sname.name-type", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "sname.name-type", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_number_of_elements (handle, apreq, "ticket.sname.name-string", &n); if (res != SHISHI_OK) goto error; for (i = 1; i <= n; i++) { res = shishi_asn1_write (handle, *ticket, "sname.name-string", "NEW", 1); if (res != SHISHI_OK) goto error; asprintf (&format, "ticket.sname.name-string.?%d", i); res = shishi_asn1_read (handle, apreq, format, &buf, &buflen); free (format); if (res != SHISHI_OK) goto error; asprintf (&format, "sname.name-string.?%d", i); res = shishi_asn1_write (handle, *ticket, format, buf, buflen); free (format); free (buf); if (res != SHISHI_OK) goto error; } res = shishi_asn1_read (handle, apreq, "ticket.enc-part.etype", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "enc-part.etype", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, apreq, "ticket.enc-part.kvno", &buf, &buflen); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) goto error; if (res == SHISHI_ASN1_NO_ELEMENT) res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", NULL, 0); else { res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", buf, buflen); free (buf); } if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, apreq, "ticket.enc-part.cipher", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "enc-part.cipher", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; return SHISHI_OK; error: shishi_asn1_done (handle, *ticket); return res; } int shishi_apreq_decrypt (Shishi * handle, Shishi_asn1 apreq, Shishi_key * key, int keyusage, Shishi_asn1 * authenticator) { int res; int i; char *buf; size_t buflen; char *cipher; size_t cipherlen; int etype; res = shishi_apreq_get_authenticator_etype (handle, apreq, &etype); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (key)) return SHISHI_APREQ_BAD_KEYTYPE; res = shishi_asn1_read (handle, apreq, "authenticator.cipher", &cipher, &cipherlen); if (res != SHISHI_OK) return res; res = shishi_decrypt (handle, key, keyusage, cipher, cipherlen, &buf, &buflen); free (cipher); if (res != SHISHI_OK) { shishi_error_printf (handle, "decrypt fail, most likely wrong password\n"); return SHISHI_APREQ_DECRYPT_FAILED; } /* The crypto is so 1980; no length indicator. Trim off pad bytes until we can parse it. */ for (i = 0; i < 8; i++) { if (VERBOSEASN1 (handle)) printf ("Trying with %d pad in enckdcrep...\n", i); *authenticator = shishi_der2asn1_authenticator (handle, &buf[0], buflen - i); if (*authenticator != NULL) break; } if (*authenticator == NULL) { shishi_error_printf (handle, "Could not DER decode Authenticator. " "Password probably correct (decrypt ok) though\n"); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } shishi-1.0.2/lib/asn1.h0000664000000000000000000000164612126660507011467 00000000000000/* asn1.h --- Utilities to manipulate RFC 1510 ASN.1 types. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ extern int _shishi_asn1_init (Shishi * handle); shishi-1.0.2/lib/priv.c0000664000000000000000000004372212126660507011601 00000000000000/* priv.c --- Application data privacy protection. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" struct Shishi_priv { Shishi *handle; Shishi_key *key; Shishi_asn1 priv; Shishi_asn1 encprivpart; unsigned long seqnumber; }; /** * shishi_priv: * @handle: shishi handle as allocated by shishi_init(). * @priv: pointer to new structure that holds information about PRIV exchange * * Create a new PRIV exchange. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv (Shishi * handle, Shishi_priv ** priv) { Shishi_priv *lpriv; struct timeval tv; char *usec; int rc; *priv = xcalloc (1, sizeof (**priv)); lpriv = *priv; lpriv->handle = handle; rc = shishi_key (handle, &lpriv->key); if (rc != SHISHI_OK) return rc; lpriv->priv = shishi_asn1_priv (handle); if (lpriv->priv == NULL) return SHISHI_ASN1_ERROR; rc = shishi_asn1_write (handle, lpriv->priv, "pvno", "5", 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->priv, "msg-type", "21", 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->priv, "enc-part.kvno", "0", 0); if (rc != SHISHI_OK) return rc; lpriv->encprivpart = shishi_asn1_encprivpart (handle); if (lpriv->priv == NULL) return SHISHI_ASN1_ERROR; rc = shishi_asn1_write (handle, lpriv->encprivpart, "timestamp", shishi_generalize_time (handle, time (NULL)), 0); if (rc != SHISHI_OK) return rc; rc = gettimeofday (&tv, NULL); if (rc != 0) return SHISHI_GETTIMEOFDAY_ERROR; usec = xasprintf ("%ld", tv.tv_usec % 1000000); rc = shishi_asn1_write (handle, lpriv->encprivpart, "usec", usec, 0); free (usec); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->encprivpart, "seq-number", NULL, 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->encprivpart, "s-address.addr-type", /* directional */ "3", 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->encprivpart, "s-address.address", /* sender */ "\x00\x00\x00\x00", 4); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lpriv->encprivpart, "r-address", NULL, 0); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_priv_done: * @priv: structure that holds information about PRIV exchange * * Deallocate resources associated with PRIV exchange. This should be * called by the application when it no longer need to utilize the * PRIV exchange handle. **/ void shishi_priv_done (Shishi_priv * priv) { shishi_asn1_done (priv->handle, priv->priv); shishi_asn1_done (priv->handle, priv->encprivpart); shishi_key_done (priv->key); free (priv); } /** * shishi_priv_key: * @priv: structure that holds information about PRIV exchange * * Get key from PRIV exchange. * * Return value: Returns the key used in the PRIV exchange, or NULL if * not yet set or an error occured. **/ Shishi_key * shishi_priv_key (Shishi_priv * priv) { return priv->key; } /** * shishi_priv_key_set: * @priv: structure that holds information about PRIV exchange * @key: key to store in PRIV. * * Set the Key in the PRIV exchange. **/ void shishi_priv_key_set (Shishi_priv * priv, Shishi_key * key) { shishi_key_copy (priv->key, key); } /** * shishi_priv_priv: * @priv: structure that holds information about PRIV exchange * * Get ASN.1 PRIV structure in PRIV exchange. * * Return value: Returns the ASN.1 priv in the PRIV exchange, or NULL if * not yet set or an error occured. **/ Shishi_asn1 shishi_priv_priv (Shishi_priv * priv) { return priv->priv; } /** * shishi_priv_priv_set: * @priv: structure that holds information about PRIV exchange * @asn1priv: KRB-PRIV to store in PRIV exchange. * * Set the KRB-PRIV in the PRIV exchange. **/ void shishi_priv_priv_set (Shishi_priv * priv, Shishi_asn1 asn1priv) { if (priv->priv) shishi_asn1_done (priv->handle, priv->priv); priv->priv = asn1priv; } /** * shishi_priv_priv_der: * @priv: priv as allocated by shishi_priv(). * @out: output array with newly allocated DER encoding of PRIV. * @outlen: length of output array with DER encoding of PRIV. * * DER encode PRIV structure. Typically shishi_priv_build() is used * to build the PRIV structure first. @out is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_priv_der (Shishi_priv * priv, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (priv->handle, priv->priv, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_priv_priv_der_set: * @priv: priv as allocated by shishi_priv(). * @der: input array with DER encoded KRB-PRIV. * @derlen: length of input array with DER encoded KRB-PRIV. * * DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the * KRB-PRIV in the PRIV exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_priv_priv_der_set (Shishi_priv * priv, char *der, size_t derlen) { Shishi_asn1 asn1priv; asn1priv = shishi_der2asn1_priv (priv->handle, der, derlen); if (asn1priv == NULL) return SHISHI_ASN1_ERROR; shishi_priv_priv_set (priv, asn1priv); return SHISHI_OK; } /** * shishi_priv_encprivpart: * @priv: structure that holds information about PRIV exchange * * Get ASN.1 EncPrivPart structure from PRIV exchange. * * Return value: Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if * not yet set or an error occured. **/ Shishi_asn1 shishi_priv_encprivpart (Shishi_priv * priv) { return priv->encprivpart; } /** * shishi_priv_encprivpart_set: * @priv: structure that holds information about PRIV exchange * @asn1encprivpart: ENCPRIVPART to store in PRIV exchange. * * Set the ENCPRIVPART in the PRIV exchange. **/ void shishi_priv_encprivpart_set (Shishi_priv * priv, Shishi_asn1 asn1encprivpart) { if (priv->encprivpart) shishi_asn1_done (priv->handle, priv->encprivpart); priv->encprivpart = asn1encprivpart; } /** * shishi_priv_encprivpart_der: * @priv: priv as allocated by shishi_priv(). * @out: output array with newly allocated DER encoding of ENCPRIVPART. * @outlen: length of output array with DER encoding of ENCPRIVPART. * * DER encode ENCPRIVPART structure. @out is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_encprivpart_der (Shishi_priv * priv, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (priv->handle, priv->encprivpart, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_priv_encprivpart_der_set: * @priv: priv as allocated by shishi_priv(). * @der: input array with DER encoded ENCPRIVPART. * @derlen: length of input array with DER encoded ENCPRIVPART. * * DER decode ENCPRIVPART and set it PRIV exchange. If decoding * fails, the ENCPRIVPART in the PRIV exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_priv_encprivpart_der_set (Shishi_priv * priv, char *der, size_t derlen) { Shishi_asn1 asn1encprivpart; asn1encprivpart = shishi_der2asn1_encprivpart (priv->handle, der, derlen); if (asn1encprivpart == NULL) return SHISHI_ASN1_ERROR; shishi_priv_encprivpart_set (priv, asn1encprivpart); return SHISHI_OK; } /** * shishi_priv_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @priv: PRIV to print. * * Print ASCII armored DER encoding of PRIV to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_print (Shishi * handle, FILE * fh, Shishi_asn1 priv) { return _shishi_print_armored_data (handle, fh, priv, "KRB-PRIV", NULL); } /** * shishi_priv_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @priv: PRIV to save. * * Save DER encoding of PRIV to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_save (Shishi * handle, FILE * fh, Shishi_asn1 priv) { return _shishi_save_data (handle, fh, priv, "PRIV"); } /** * shishi_priv_to_file: * @handle: shishi handle as allocated by shishi_init(). * @priv: PRIV to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write PRIV to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_to_file (Shishi * handle, Shishi_asn1 priv, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing PRIV to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing PRIV in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_priv_print (handle, fh, priv); else res = shishi_priv_save (handle, fh, priv); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing PRIV to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_priv_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @priv: output variable with newly allocated PRIV. * * Read ASCII armored DER encoded PRIV from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_parse (Shishi * handle, FILE * fh, Shishi_asn1 * priv) { return _shishi_priv_input (handle, fh, priv, 0); } /** * shishi_priv_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @priv: output variable with newly allocated PRIV. * * Read DER encoded PRIV from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_read (Shishi * handle, FILE * fh, Shishi_asn1 * priv) { return _shishi_priv_input (handle, fh, priv, 1); } /** * shishi_priv_from_file: * @handle: shishi handle as allocated by shishi_init(). * @priv: output variable with newly allocated PRIV. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read PRIV from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_from_file (Shishi * handle, Shishi_asn1 * priv, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading PRIV from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading PRIV in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_priv_parse (handle, fh, priv); else res = shishi_priv_read (handle, fh, priv); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading PRIV from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_priv_enc_part_etype: * @handle: shishi handle as allocated by shishi_init(). * @priv: PRIV variable to get value from. * @etype: output variable that holds the value. * * Extract PRIV.enc-part.etype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_enc_part_etype (Shishi * handle, Shishi_asn1 priv, int32_t * etype) { return shishi_asn1_read_int32 (handle, priv, "enc-part.etype", etype); } /** * shishi_priv_set_enc_part: * @handle: shishi handle as allocated by shishi_init(). * @priv: priv as allocated by shishi_priv(). * @etype: input encryption type to store in PRIV. * @encpart: input encrypted data to store in PRIV. * @encpartlen: size of input encrypted data to store in PRIV. * * Store encrypted data in PRIV. The encrypted data is usually * created by calling shishi_encrypt() on some application specific * data using the key from the ticket that is being used. To save * time, you may want to use shishi_priv_build() instead, which * encryptes the data and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_set_enc_part (Shishi * handle, Shishi_asn1 priv, int32_t etype, const char *encpart, size_t encpartlen) { int res; res = shishi_asn1_write_integer (handle, priv, "enc-part.etype", etype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, priv, "enc-part.cipher", encpart, encpartlen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encprivpart_user_data: * @handle: shishi handle as allocated by shishi_init(). * @encprivpart: encprivpart as allocated by shishi_priv(). * @userdata: output array with newly allocated user data from KRB-PRIV. * @userdatalen: output size of output user data buffer. * * Read user data value from KRB-PRIV. @userdata is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encprivpart_user_data (Shishi * handle, Shishi_asn1 encprivpart, char **userdata, size_t * userdatalen) { int res; res = shishi_asn1_read (handle, encprivpart, "user-data", userdata, userdatalen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encprivpart_set_user_data: * @handle: shishi handle as allocated by shishi_init(). * @encprivpart: encprivpart as allocated by shishi_priv(). * @userdata: input user application to store in PRIV. * @userdatalen: size of input user application to store in PRIV. * * Set the application data in PRIV. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encprivpart_set_user_data (Shishi * handle, Shishi_asn1 encprivpart, const char *userdata, size_t userdatalen) { int res; res = shishi_asn1_write (handle, encprivpart, "user-data", userdata, userdatalen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_priv_build: * @priv: priv as allocated by shishi_priv(). * @key: key for session, used to encrypt data. * * Build checksum and set it in KRB-PRIV. Note that this follows RFC * 1510bis and is incompatible with RFC 1510, although presumably few * implementations use the RFC1510 algorithm. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_priv_build (Shishi_priv * priv, Shishi_key * key) { int res; char *buf; size_t buflen; char *der; size_t derlen; res = shishi_asn1_to_der (priv->handle, priv->encprivpart, &der, &derlen); if (res != SHISHI_OK) { shishi_error_printf (priv->handle, "Could not DER encode EncPrivPart: %s\n", shishi_strerror (res)); return res; } res = shishi_encrypt (priv->handle, key, SHISHI_KEYUSAGE_KRB_PRIV, der, derlen, &buf, &buflen); free (der); if (res != SHISHI_OK) { shishi_error_printf (priv->handle, "Cannot encrypt EncPrivPart.\n"); return res; } res = shishi_priv_set_enc_part (priv->handle, priv->priv, shishi_key_type (key), buf, buflen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_priv_process: * @priv: priv as allocated by shishi_priv(). * @key: key to use to decrypt EncPrivPart. * * Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the * PRIV exchange. * * Return value: Returns SHISHI_OK iff successful, * SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or * SHISHI_CRYPTO_ERROR if the actual decryption failed. **/ int shishi_priv_process (Shishi_priv * priv, Shishi_key * key) { int res; int i; char *buf; size_t buflen; char *cipher; size_t cipherlen; int32_t etype; res = shishi_priv_enc_part_etype (priv->handle, priv->priv, &etype); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (key)) return SHISHI_PRIV_BAD_KEYTYPE; res = shishi_asn1_read (priv->handle, priv->priv, "enc-part.cipher", &cipher, &cipherlen); if (res != SHISHI_OK) return res; res = shishi_decrypt (priv->handle, key, SHISHI_KEYUSAGE_KRB_PRIV, cipher, cipherlen, &buf, &buflen); free (cipher); if (res != SHISHI_OK) { shishi_error_printf (priv->handle, "PRIV decryption failed, bad key?\n"); return res; } /* The crypto is so 1980; no length indicator. Trim off pad bytes until we can parse it. */ for (i = 0; i < 8; i++) { if (VERBOSEASN1 (priv->handle)) printf ("Trying with %d pad in enckdcrep...\n", i); priv->encprivpart = shishi_der2asn1_encprivpart (priv->handle, &buf[0], buflen - i); if (priv->encprivpart != NULL) break; } free (buf); if (priv->encprivpart == NULL) { shishi_error_printf (priv->handle, "Could not DER decode EncPrivPart. " "Key probably correct (decrypt ok) though\n"); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } shishi-1.0.2/lib/libshishi.map0000664000000000000000000005214512126660507013131 00000000000000# libshishi.maps -- versioning script to control what symbols to export # Copyright (C) 2005-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SHISHI_0.0 { global: # Variables: shishi_alloc_fail_function; # Functions: shishi; shishi_3des; shishi_aes_cts; shishi_ap; shishi_ap_authenticator; shishi_ap_authenticator_cksumdata; shishi_ap_authenticator_cksumdata_set; shishi_ap_authenticator_cksumraw_set; shishi_ap_authenticator_cksumtype; shishi_ap_authenticator_cksumtype_set; shishi_ap_authenticator_set; shishi_ap_done; shishi_ap_encapreppart; shishi_ap_encapreppart_set; shishi_ap_etype; shishi_ap_etype_tktoptionsdata; shishi_ap_key; shishi_ap_nosubkey; shishi_ap_option2string; shishi_ap_rep; shishi_ap_rep_asn1; shishi_ap_rep_build; shishi_ap_rep_der; shishi_ap_rep_der_set; shishi_ap_rep_set; shishi_ap_rep_verify; shishi_ap_rep_verify_asn1; shishi_ap_rep_verify_der; shishi_ap_req; shishi_ap_req_asn1; shishi_ap_req_build; shishi_ap_req_decode; shishi_ap_req_der; shishi_ap_req_der_set; shishi_ap_req_process; shishi_ap_req_process_keyusage; shishi_ap_req_set; shishi_ap_set_tktoptions; shishi_ap_set_tktoptionsasn1usage; shishi_ap_set_tktoptionsdata; shishi_ap_set_tktoptionsraw; shishi_ap_string2option; shishi_ap_tkt; shishi_ap_tkt_set; shishi_ap_tktoptions; shishi_ap_tktoptionsasn1usage; shishi_ap_tktoptionsdata; shishi_ap_tktoptionsraw; shishi_aprep; shishi_aprep_decrypt; shishi_aprep_enc_part_add; shishi_aprep_enc_part_make; shishi_aprep_enc_part_set; shishi_aprep_from_file; shishi_aprep_get_enc_part_etype; shishi_aprep_parse; shishi_aprep_print; shishi_aprep_read; shishi_aprep_save; shishi_aprep_to_file; shishi_aprep_verify; shishi_apreq; shishi_apreq_add_authenticator; shishi_apreq_decrypt; shishi_apreq_from_file; shishi_apreq_get_authenticator_etype; shishi_apreq_get_ticket; shishi_apreq_mutual_required_p; shishi_apreq_options; shishi_apreq_options_add; shishi_apreq_options_remove; shishi_apreq_options_set; shishi_apreq_parse; shishi_apreq_print; shishi_apreq_read; shishi_apreq_save; shishi_apreq_set_authenticator; shishi_apreq_set_ticket; shishi_apreq_to_file; shishi_apreq_use_session_key_p; shishi_arcfour; shishi_as; shishi_as_check_cname; shishi_as_check_crealm; shishi_as_derive_salt; shishi_as_done; shishi_as_krberror; shishi_as_krberror_der; shishi_as_krberror_set; shishi_as_process; shishi_as_rep; shishi_as_rep_build; shishi_as_rep_der; shishi_as_rep_der_set; shishi_as_rep_process; shishi_as_rep_set; shishi_as_req; shishi_as_req_build; shishi_as_req_der; shishi_as_req_der_set; shishi_as_req_set; shishi_as_sendrecv; shishi_as_sendrecv_hint; shishi_as_tkt; shishi_as_tkt_set; shishi_asn1_aprep; shishi_asn1_apreq; shishi_asn1_asrep; shishi_asn1_asreq; shishi_asn1_authenticator; shishi_asn1_done; shishi_asn1_empty_p; shishi_asn1_encapreppart; shishi_asn1_encasreppart; shishi_asn1_enckdcreppart; shishi_asn1_encprivpart; shishi_asn1_encrypteddata; shishi_asn1_encticketpart; shishi_asn1_etype_info; shishi_asn1_etype_info2; shishi_asn1_krberror; shishi_asn1_krbsafe; shishi_asn1_methoddata; shishi_asn1_msgtype; shishi_asn1_number_of_elements; shishi_asn1_pa_enc_ts_enc; shishi_asn1_padata; shishi_asn1_print; shishi_asn1_priv; shishi_asn1_read; shishi_asn1_read_bitstring; shishi_asn1_read_inline; shishi_asn1_read_int32; shishi_asn1_read_integer; shishi_asn1_read_optional; shishi_asn1_read_uint32; shishi_asn1_tgsrep; shishi_asn1_tgsreq; shishi_asn1_ticket; shishi_asn1_to_der; shishi_asn1_to_der_field; shishi_asn1_write; shishi_asn1_write_bitstring; shishi_asn1_write_int32; shishi_asn1_write_integer; shishi_asn1_write_uint32; shishi_asrep; shishi_asreq; shishi_asreq_clientrealm; shishi_authenticator; shishi_authenticator_add_authorizationdata; shishi_authenticator_add_cksum; shishi_authenticator_add_cksum_type; shishi_authenticator_add_random_subkey; shishi_authenticator_add_random_subkey_etype; shishi_authenticator_add_subkey; shishi_authenticator_authorizationdata; shishi_authenticator_cksum; shishi_authenticator_clear_authorizationdata; shishi_authenticator_client; shishi_authenticator_client_set; shishi_authenticator_clientrealm; shishi_authenticator_ctime; shishi_authenticator_ctime_set; shishi_authenticator_cusec_get; shishi_authenticator_cusec_set; shishi_authenticator_from_file; shishi_authenticator_get_subkey; shishi_authenticator_parse; shishi_authenticator_print; shishi_authenticator_read; shishi_authenticator_remove_cksum; shishi_authenticator_remove_subkey; shishi_authenticator_save; shishi_authenticator_seqnumber_get; shishi_authenticator_seqnumber_remove; shishi_authenticator_seqnumber_set; shishi_authenticator_set_cksum; shishi_authenticator_set_cname; shishi_authenticator_set_crealm; shishi_authenticator_set_subkey; shishi_authenticator_subkey; shishi_authenticator_to_file; shishi_authorization_parse; shishi_authorize_k5login; shishi_authorize_strcmp; shishi_authorized_p; shishi_cfg; shishi_cfg_authorizationtype_set; shishi_cfg_clientkdcetype; shishi_cfg_clientkdcetype_fast; shishi_cfg_clientkdcetype_set; shishi_cfg_default_systemfile; shishi_cfg_default_userdirectory; shishi_cfg_default_userfile; shishi_cfg_from_file; shishi_cfg_print; shishi_cfg_userdirectory_file; shishi_check_version; shishi_checksum; shishi_checksum_cksumlen; shishi_checksum_name; shishi_checksum_parse; shishi_checksum_supported_p; shishi_cipher_blocksize; shishi_cipher_confoundersize; shishi_cipher_defaultcksumtype; shishi_cipher_keylen; shishi_cipher_name; shishi_cipher_parse; shishi_cipher_randomlen; shishi_cipher_supported_p; shishi_crc; shishi_crypto; shishi_crypto_close; shishi_crypto_decrypt; shishi_crypto_encrypt; shishi_ctime; shishi_decrypt; shishi_decrypt_etype; shishi_decrypt_iv; shishi_decrypt_iv_etype; shishi_decrypt_ivupdate; shishi_decrypt_ivupdate_etype; shishi_der2asn1; shishi_der2asn1_aprep; shishi_der2asn1_apreq; shishi_der2asn1_asrep; shishi_der2asn1_asreq; shishi_der2asn1_authenticator; shishi_der2asn1_encapreppart; shishi_der2asn1_encasreppart; shishi_der2asn1_enckdcreppart; shishi_der2asn1_encprivpart; shishi_der2asn1_enctgsreppart; shishi_der2asn1_encticketpart; shishi_der2asn1_etype_info; shishi_der2asn1_etype_info2; shishi_der2asn1_kdcrep; shishi_der2asn1_kdcreq; shishi_der2asn1_krberror; shishi_der2asn1_krbsafe; shishi_der2asn1_methoddata; shishi_der2asn1_padata; shishi_der2asn1_priv; shishi_der2asn1_tgsrep; shishi_der2asn1_tgsreq; shishi_der2asn1_ticket; shishi_der_msgtype; shishi_derive_default_salt; shishi_des; shishi_des_cbc_mac; shishi_dk; shishi_done; shishi_dr; shishi_encapreppart; shishi_encapreppart_ctime; shishi_encapreppart_ctime_set; shishi_encapreppart_cusec_get; shishi_encapreppart_cusec_set; shishi_encapreppart_from_file; shishi_encapreppart_get_key; shishi_encapreppart_parse; shishi_encapreppart_print; shishi_encapreppart_read; shishi_encapreppart_save; shishi_encapreppart_seqnumber_get; shishi_encapreppart_seqnumber_remove; shishi_encapreppart_seqnumber_set; shishi_encapreppart_time_copy; shishi_encapreppart_to_file; shishi_encasreppart; shishi_enckdcreppart; shishi_enckdcreppart_authtime_set; shishi_enckdcreppart_endtime_set; shishi_enckdcreppart_flags_set; shishi_enckdcreppart_get_key; shishi_enckdcreppart_key_set; shishi_enckdcreppart_nonce_set; shishi_enckdcreppart_parse; shishi_enckdcreppart_populate_encticketpart; shishi_enckdcreppart_print; shishi_enckdcreppart_read; shishi_enckdcreppart_renew_till_set; shishi_enckdcreppart_save; shishi_enckdcreppart_server_set; shishi_enckdcreppart_sname_set; shishi_enckdcreppart_srealm_set; shishi_enckdcreppart_srealmserver_set; shishi_enckdcreppart_starttime_set; shishi_encprivpart_set_user_data; shishi_encprivpart_user_data; shishi_encrypt; shishi_encrypt_etype; shishi_encrypt_iv; shishi_encrypt_iv_etype; shishi_encrypt_ivupdate; shishi_encrypt_ivupdate_etype; shishi_encticketpart; shishi_encticketpart_authctime; shishi_encticketpart_authtime; shishi_encticketpart_authtime_set; shishi_encticketpart_client; shishi_encticketpart_clientrealm; shishi_encticketpart_cname_set; shishi_encticketpart_crealm; shishi_encticketpart_crealm_set; shishi_encticketpart_endtime_set; shishi_encticketpart_flags_set; shishi_encticketpart_get_key; shishi_encticketpart_key_set; shishi_encticketpart_print; shishi_encticketpart_transited_set; shishi_error; shishi_error_clear; shishi_error_outputtype; shishi_error_printf; shishi_error_set; shishi_error_set_outputtype; shishi_etype_info2_print; shishi_etype_info_print; shishi_generalize_ctime; shishi_generalize_now; shishi_generalize_time; shishi_get_date; shishi_hmac_md5; shishi_hmac_sha1; shishi_hostkeys_default_file; shishi_hostkeys_default_file_set; shishi_hostkeys_for_localservice; shishi_hostkeys_for_localservicerealm; shishi_hostkeys_for_server; shishi_hostkeys_for_serverrealm; shishi_info; shishi_init; shishi_init_server; shishi_init_server_with_paths; shishi_init_with_paths; shishi_kdc_check_nonce; shishi_kdc_copy_cname; shishi_kdc_copy_crealm; shishi_kdc_copy_nonce; shishi_kdc_process; shishi_kdc_sendrecv; shishi_kdc_sendrecv_hint; shishi_kdcrep_add_enc_part; shishi_kdcrep_clear_padata; shishi_kdcrep_client_set; shishi_kdcrep_cname_set; shishi_kdcrep_crealm_set; shishi_kdcrep_crealmserver_set; shishi_kdcrep_decrypt; shishi_kdcrep_from_file; shishi_kdcrep_get_enc_part_etype; shishi_kdcrep_get_ticket; shishi_kdcrep_parse; shishi_kdcrep_print; shishi_kdcrep_read; shishi_kdcrep_save; shishi_kdcrep_set_enc_part; shishi_kdcrep_set_ticket; shishi_kdcrep_to_file; shishi_kdcreq_add_padata; shishi_kdcreq_add_padata_preauth; shishi_kdcreq_add_padata_tgs; shishi_kdcreq_allow_postdate_p; shishi_kdcreq_build; shishi_kdcreq_clear_padata; shishi_kdcreq_client; shishi_kdcreq_disable_transited_check_p; shishi_kdcreq_enc_tkt_in_skey_p; shishi_kdcreq_etype; shishi_kdcreq_forwardable_p; shishi_kdcreq_forwarded_p; shishi_kdcreq_from_file; shishi_kdcreq_get_padata; shishi_kdcreq_get_padata_tgs; shishi_kdcreq_nonce; shishi_kdcreq_nonce_set; shishi_kdcreq_options; shishi_kdcreq_options_add; shishi_kdcreq_options_set; shishi_kdcreq_parse; shishi_kdcreq_postdated_p; shishi_kdcreq_print; shishi_kdcreq_proxiable_p; shishi_kdcreq_proxy_p; shishi_kdcreq_read; shishi_kdcreq_realm; shishi_kdcreq_realm_get; shishi_kdcreq_renew_p; shishi_kdcreq_renewable_ok_p; shishi_kdcreq_renewable_p; shishi_kdcreq_save; shishi_kdcreq_sendrecv; shishi_kdcreq_sendrecv_hint; shishi_kdcreq_server; shishi_kdcreq_set_cname; shishi_kdcreq_set_etype; shishi_kdcreq_set_realm; shishi_kdcreq_set_realmserver; shishi_kdcreq_set_server; shishi_kdcreq_set_sname; shishi_kdcreq_till; shishi_kdcreq_tillc; shishi_kdcreq_to_file; shishi_kdcreq_validate_p; shishi_key; shishi_key_copy; shishi_key_done; shishi_key_from_base64; shishi_key_from_name; shishi_key_from_random; shishi_key_from_string; shishi_key_from_value; shishi_key_length; shishi_key_name; shishi_key_parse; shishi_key_principal; shishi_key_principal_set; shishi_key_print; shishi_key_random; shishi_key_realm; shishi_key_realm_set; shishi_key_to_file; shishi_key_type; shishi_key_type_set; shishi_key_value; shishi_key_value_set; shishi_key_version; shishi_key_version_set; shishi_keys; shishi_keys_add; shishi_keys_add_keytab_file; shishi_keys_add_keytab_mem; shishi_keys_done; shishi_keys_for_localservicerealm_in_file; shishi_keys_for_server_in_file; shishi_keys_for_serverrealm_in_file; shishi_keys_from_keytab_file; shishi_keys_from_keytab_mem; shishi_keys_nth; shishi_keys_print; shishi_keys_remove; shishi_keys_size; shishi_keys_to_file; shishi_krberror; shishi_krberror_build; shishi_krberror_client; shishi_krberror_client_set; shishi_krberror_crealm; shishi_krberror_ctime; shishi_krberror_ctime_set; shishi_krberror_cusec; shishi_krberror_cusec_set; shishi_krberror_der; shishi_krberror_edata; shishi_krberror_errorcode; shishi_krberror_errorcode_fast; shishi_krberror_errorcode_message; shishi_krberror_errorcode_set; shishi_krberror_etext; shishi_krberror_from_file; shishi_krberror_message; shishi_krberror_methoddata; shishi_krberror_parse; shishi_krberror_pretty_print; shishi_krberror_print; shishi_krberror_read; shishi_krberror_realm; shishi_krberror_remove_cname; shishi_krberror_remove_crealm; shishi_krberror_remove_ctime; shishi_krberror_remove_cusec; shishi_krberror_remove_edata; shishi_krberror_remove_etext; shishi_krberror_remove_sname; shishi_krberror_save; shishi_krberror_server; shishi_krberror_server_set; shishi_krberror_set_cname; shishi_krberror_set_crealm; shishi_krberror_set_edata; shishi_krberror_set_etext; shishi_krberror_set_realm; shishi_krberror_set_sname; shishi_krberror_stime; shishi_krberror_stime_set; shishi_krberror_susec; shishi_krberror_susec_set; shishi_krberror_to_file; shishi_md4; shishi_md5; shishi_methoddata_print; shishi_n_fold; shishi_padata_print; shishi_parse_name; shishi_pbkdf2_sha1; shishi_principal_default; shishi_principal_default_guess; shishi_principal_default_set; shishi_principal_name; shishi_principal_name_realm; shishi_principal_name_set; shishi_principal_set; shishi_priv; shishi_priv_build; shishi_priv_done; shishi_priv_enc_part_etype; shishi_priv_encprivpart; shishi_priv_encprivpart_der; shishi_priv_encprivpart_der_set; shishi_priv_encprivpart_set; shishi_priv_from_file; shishi_priv_key; shishi_priv_key_set; shishi_priv_parse; shishi_priv_print; shishi_priv_priv; shishi_priv_priv_der; shishi_priv_priv_der_set; shishi_priv_priv_set; shishi_priv_process; shishi_priv_read; shishi_priv_save; shishi_priv_set_enc_part; shishi_priv_to_file; shishi_prompt_password; shishi_prompt_password_callback_get; shishi_prompt_password_callback_set; shishi_random_to_key; shishi_randomize; shishi_realm_default; shishi_realm_default_guess; shishi_realm_default_set; shishi_realm_for_server; shishi_realm_for_server_dns; shishi_realm_for_server_file; shishi_resolv; shishi_resolv_free; shishi_safe; shishi_safe_build; shishi_safe_cksum; shishi_safe_done; shishi_safe_from_file; shishi_safe_key; shishi_safe_key_set; shishi_safe_parse; shishi_safe_print; shishi_safe_read; shishi_safe_safe; shishi_safe_safe_der; shishi_safe_safe_der_set; shishi_safe_safe_set; shishi_safe_save; shishi_safe_set_cksum; shishi_safe_set_user_data; shishi_safe_to_file; shishi_safe_user_data; shishi_safe_verify; shishi_server; shishi_server_for_local_service; shishi_strerror; shishi_string_to_key; shishi_tgs; shishi_tgs_ap; shishi_tgs_done; shishi_tgs_krberror; shishi_tgs_krberror_der; shishi_tgs_krberror_set; shishi_tgs_process; shishi_tgs_rep; shishi_tgs_rep_build; shishi_tgs_rep_der; shishi_tgs_rep_process; shishi_tgs_req; shishi_tgs_req_build; shishi_tgs_req_der; shishi_tgs_req_der_set; shishi_tgs_req_process; shishi_tgs_req_set; shishi_tgs_sendrecv; shishi_tgs_sendrecv_hint; shishi_tgs_set_realm; shishi_tgs_set_realmserver; shishi_tgs_set_server; shishi_tgs_tgtkt; shishi_tgs_tgtkt_set; shishi_tgs_tkt; shishi_tgs_tkt_set; shishi_tgsrep; shishi_tgsreq; shishi_ticket; shishi_ticket_add_enc_part; shishi_ticket_decrypt; shishi_ticket_get_enc_part_etype; shishi_ticket_parse; shishi_ticket_print; shishi_ticket_read; shishi_ticket_realm_get; shishi_ticket_realm_set; shishi_ticket_save; shishi_ticket_server; shishi_ticket_set_enc_part; shishi_ticket_set_server; shishi_ticket_sname_set; shishi_ticket_srealmserver_set; shishi_time; shishi_tkt; shishi_tkt2; shishi_tkt_authctime; shishi_tkt_authtime; shishi_tkt_build; shishi_tkt_client; shishi_tkt_client_p; shishi_tkt_clientrealm; shishi_tkt_clientrealm_p; shishi_tkt_clientrealm_set; shishi_tkt_decrypt; shishi_tkt_done; shishi_tkt_enckdcreppart; shishi_tkt_enckdcreppart_set; shishi_tkt_encticketpart; shishi_tkt_encticketpart_set; shishi_tkt_endctime; shishi_tkt_endtime; shishi_tkt_expired_p; shishi_tkt_flags; shishi_tkt_flags_add; shishi_tkt_flags_set; shishi_tkt_forwardable_p; shishi_tkt_forwarded_p; shishi_tkt_hw_authent_p; shishi_tkt_initial_p; shishi_tkt_invalid_p; shishi_tkt_kdcrep; shishi_tkt_key; shishi_tkt_key_set; shishi_tkt_keytype; shishi_tkt_keytype_fast; shishi_tkt_keytype_p; shishi_tkt_lastreq; shishi_tkt_lastreq_pretty_print; shishi_tkt_lastreqc; shishi_tkt_match_p; shishi_tkt_may_postdate_p; shishi_tkt_ok_as_delegate_p; shishi_tkt_postdated_p; shishi_tkt_pre_authent_p; shishi_tkt_pretty_print; shishi_tkt_proxiable_p; shishi_tkt_proxy_p; shishi_tkt_realm; shishi_tkt_renew_till; shishi_tkt_renew_tillc; shishi_tkt_renewable_p; shishi_tkt_server; shishi_tkt_server_p; shishi_tkt_serverrealm_set; shishi_tkt_startctime; shishi_tkt_starttime; shishi_tkt_ticket; shishi_tkt_ticket_set; shishi_tkt_to_ccache_mem; shishi_tkt_transited_policy_checked_p; shishi_tkt_valid_at_time_p; shishi_tkt_valid_now_p; shishi_tkts; shishi_tkts_add; shishi_tkts_add_ccache_file; shishi_tkts_add_ccache_mem; shishi_tkts_default; shishi_tkts_default_ccache; shishi_tkts_default_ccache_guess; shishi_tkts_default_ccache_set; shishi_tkts_default_file; shishi_tkts_default_file_guess; shishi_tkts_default_file_set; shishi_tkts_default_to_file; shishi_tkts_done; shishi_tkts_expire; shishi_tkts_find; shishi_tkts_find_for_clientserver; shishi_tkts_find_for_server; shishi_tkts_from_ccache_file; shishi_tkts_from_ccache_mem; shishi_tkts_from_file; shishi_tkts_get; shishi_tkts_get_for_clientserver; shishi_tkts_get_for_localservicepasswd; shishi_tkts_get_for_server; shishi_tkts_get_tgs; shishi_tkts_get_tgt; shishi_tkts_new; shishi_tkts_nth; shishi_tkts_print; shishi_tkts_print_for_service; shishi_tkts_read; shishi_tkts_remove; shishi_tkts_size; shishi_tkts_to_ccache_mem; shishi_tkts_to_file; shishi_tkts_write; shishi_verbose; shishi_verify; shishi_warn; shishi_x509ca_default_file; shishi_x509ca_default_file_guess; shishi_x509ca_default_file_set; shishi_x509cert_default_file; shishi_x509cert_default_file_guess; shishi_x509cert_default_file_set; shishi_x509key_default_file; shishi_x509key_default_file_guess; shishi_x509key_default_file_set; shishi_xalloc_die; local: *; }; SHISHI_0.0.42 { global: shishi_key_timestamp; shishi_key_timestamp_set; shishi_keys_from_file; shishi_keys_to_keytab_file; shishi_keys_to_keytab_mem; } SHISHI_0.0; shishi-1.0.2/lib/low-crypto.h0000664000000000000000000000176012126660507012741 00000000000000/* low-crypto.h --- Crypto initialization prototypes. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef LOW_CRYPTO_H #define LOW_CRYPTO_H int _shishi_crypto_init (Shishi * handle); void _shishi_quick_random (void); #endif shishi-1.0.2/lib/authorize.c0000664000000000000000000001343012126660507012624 00000000000000/* authorize.c --- Authorization to services of authenticated principals. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #ifdef HAVE_PWD_H # include #endif /** * shishi_authorize_strcmp: * @handle: shishi handle allocated by shishi_init(). * @principal: string with desired principal name. * @authzname: authorization name. * * Authorization of @authzname against desired @principal * according to "basic" authentication, i.e., testing for * identical strings. * * Return value: Returns 1 if @authzname is authorized for services * by the encrypted principal, and 0 otherwise. **/ int shishi_authorize_strcmp (Shishi * handle, const char *principal, const char *authzname) { if (strcmp (principal, authzname) == 0) return 1; return 0; } /* MIT/Heimdal authorization method */ /** * shishi_authorize_k5login: * @handle: shishi handle allocated by shishi_init(). * @principal: string with desired principal name and realm. * @authzname: authorization name. * * Authorization of @authzname against desired @principal * in accordance with the MIT/Heimdal authorization method. * * Return value: Returns 1 if @authzname is authorized for services * by @principal, and returns 0 otherwise. **/ int shishi_authorize_k5login (Shishi * handle, const char *principal, const char *authzname) { #if HAVE_PWD_H && HAVE_GETPWNAM struct passwd *pwd; struct stat sta; FILE *fic; char *ficname; char *line = NULL; size_t linelength = 0; int authorized = 0; pwd = getpwnam (authzname); if (pwd == NULL || pwd->pw_dir == NULL) return 0; asprintf (&ficname, "%s/%s", pwd->pw_dir, ".k5login"); if (stat (ficname, &sta) != 0) { /* File .k5login does not exist. */ free (ficname); return 0; } /* Owner should be acting user, or root. */ if ((sta.st_uid != pwd->pw_uid) && (sta.st_uid != 0)) { free (ficname); return 0; } /* Write access is forbidden for group and world. */ if ((sta.st_mode & S_IWGRP) || (sta.st_mode & S_IWOTH)) { free (ficname); return 0; } fic = fopen (ficname, "r"); if (fic == NULL) { free (ficname); return 0; } while (!feof (fic)) { char *p; if (getline (&line, &linelength, fic) == -1) break; p = strchr (line, '\n'); if (p) *p = '\0'; if (strcmp (principal, line) == 0) { authorized = 1; break; } } fclose (fic); free (ficname); free (line); return authorized; #else return 0; #endif } struct Authorization_aliases { const char *name; int type; }; static const struct Authorization_aliases authorization_aliases[] = { {"basic", SHISHI_AUTHORIZATION_BASIC}, {"k5login", SHISHI_AUTHORIZATION_K5LOGIN} }; /** * shishi_authorization_parse: * @authorization: name of authorization type, "basic" or "k5login". * * Parse authorization type name. * * Return value: Returns authorization type corresponding to a string. **/ int shishi_authorization_parse (const char *authorization) { size_t i; char *endptr; i = strtol (authorization, &endptr, 0); if (endptr != authorization) return i; for (i = 0; i < sizeof (authorization_aliases) / sizeof (authorization_aliases[0]); i++) if (strcasecmp (authorization, authorization_aliases[i].name) == 0) return authorization_aliases[i].type; return -1; } /** * shishi_authorized_p: * @handle: shishi handle allocated by shishi_init(). * @tkt: input variable with ticket info. * @authzname: authorization name. * * Simplistic authorization of @authzname against encrypted client * principal name inside ticket. For "basic" authentication type, * the principal name must coincide with @authzname. The "k5login" * authentication type attempts the MIT/Heimdal method of parsing * the file "~/.k5login" for additional equivalence names. * * Return value: Returns 1 if @authzname is authorized for services * by the encrypted principal, and 0 otherwise. **/ int shishi_authorized_p (Shishi * handle, Shishi_tkt * tkt, const char *authzname) { char *client = NULL, *clientrealm = NULL; size_t i; int rc; rc = shishi_encticketpart_client (handle, shishi_tkt_encticketpart (tkt), &client, NULL); if (rc != SHISHI_OK) return 0; rc = shishi_encticketpart_clientrealm (handle, shishi_tkt_encticketpart (tkt), &clientrealm, NULL); if (rc != SHISHI_OK) { free (client); return 0; } for (i = 0; i < handle->nauthorizationtypes; i++) { switch (handle->authorizationtypes[i]) { case SHISHI_AUTHORIZATION_BASIC: if (shishi_authorize_strcmp (handle, client, authzname)) { free (client); free (clientrealm); return 1; } break; case SHISHI_AUTHORIZATION_K5LOGIN: if (shishi_authorize_k5login (handle, clientrealm, authzname)) { free (client); free (clientrealm); return 1; } break; default: break; /* Ignore unknown types. Continue searching. */ } } free (client); free (clientrealm); return 0; } shishi-1.0.2/lib/internal.h0000664000000000000000000000735012126660573012442 00000000000000/* internal.h --- Internal header file for Shishi. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef _INTERNAL_H #define _INTERNAL_H #if HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #if !HAVE_DECL_H_ERRNO /*extern int h_errno;*/ #endif #include #include #include #ifdef HAVE_NETINET_IN6_H #include #endif #include #ifdef HAVE_SYSLOG_H #include #endif #include "gettext.h" #include "xvasprintf.h" #include "base64.h" #include "parse-datetime.h" #include "read-file.h" #include "timespec.h" #include "xalloc.h" #include "xgethostname.h" #include "xgetdomainname.h" #include "xstrndup.h" #include "shishi.h" #define _(String) dgettext (PACKAGE, String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #define MAX_KEY_LEN 32 #define MAX_RANDOM_LEN 32 #define MAX_HASH_LEN 32 #define MAX_CKSUM_LEN 32 #define SHISHI_VERBOSE_NOISE (1<<1) #define SHISHI_VERBOSE_ASN1 (1<<2) #define SHISHI_VERBOSE_CRYPTO (1<<3) #define SHISHI_VERBOSE_CRYPTO_NOISE (1<<4) #define KRBTGT "krbtgt" #define PRINCIPAL_DELIMITER "/" #define VERBOSENOISE(h) (h->verbose & SHISHI_VERBOSE_NOISE) #define VERBOSEASN1(h) (h->verbose & SHISHI_VERBOSE_ASN1) #define VERBOSECRYPTO(h) (h->verbose & SHISHI_VERBOSE_CRYPTO) #define VERBOSECRYPTONOISE(h) (h->verbose & SHISHI_VERBOSE_CRYPTO_NOISE) #define VERBOSES (SHISHI_VERBOSE_ASN1 | \ SHISHI_VERBOSE_CRYPTO | \ SHISHI_VERBOSE_NOISE | \ SHISHI_VERBOSE_CRYPTO_NOISE) #define VERBOSE(h) (h->verbose & ~VERBOSES) /* Transports */ enum { UDP, TCP, TLS }; struct Shishi_kdcinfo { int transport; char *hostname; char *port; }; struct Shishi_realminfo { char *name; struct Shishi_kdcinfo *kdcaddresses; size_t nkdcaddresses; char **serverwildcards; size_t nserverwildcards; }; struct Shishi { Shishi_asn1 asn1; int verbose; int outputtype; char *default_realm; char *default_principal; size_t kdctimeout; size_t kdcretries; int ticketlife; int renewlife; int32_t *clientkdcetypes; size_t nclientkdcetypes; int32_t *authorizationtypes; size_t nauthorizationtypes; struct Shishi_realminfo *realminfos; size_t nrealminfos; char error[1024]; char gztime_buf[40]; char *userdirectory; char *usercfgfile; char *tktsdefaultfile; char *ccachedefault; char *hostkeysdefaultfile; char *x509cafile; char *x509certfile; char *x509keyfile; char *stringprocess; Shishi_tkts *tkts; shishi_prompt_password_func prompt_passwd; }; #define TICKETLIFE (60*60*8) /* Work day */ #define RENEWLIFE (60*60*24*7) /* Week */ #endif /* _INTERNAL_H */ shishi-1.0.2/lib/starttls.h0000664000000000000000000000215712126660507012503 00000000000000/* starttls.h --- Network I/O functions for Shishi over TLS. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ extern int _shishi_tls_init (Shishi * handle); extern int _shishi_tls_done (Shishi * handle); extern int _shishi_sendrecv_tls (Shishi * handle, struct addrinfo *ai, const char *indata, size_t inlen, char **outdata, size_t * outlen); shishi-1.0.2/lib/keys.c0000664000000000000000000002234212126660507011567 00000000000000/* keys.c --- Functions for managing keys sets, and keys stored in files. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_keys { Shishi *handle; Shishi_key **keys; int nkeys; }; /** * shishi_keys: * @handle: shishi handle as allocated by shishi_init(). * @keys: output pointer to newly allocated keys handle. * * Get a new key set handle. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_keys (Shishi * handle, Shishi_keys ** keys) { *keys = xmalloc (sizeof (**keys)); (*keys)->handle = handle; (*keys)->keys = NULL; (*keys)->nkeys = 0; return SHISHI_OK; } /** * shishi_keys_done: * @keys: key set handle as allocated by shishi_keys(). * * Deallocates all resources associated with key set. The key set * handle must not be used in calls to other shishi_keys_*() functions * after this. **/ void shishi_keys_done (Shishi_keys ** keys) { size_t i; if (!keys || !*keys) return; if ((*keys)->nkeys > 0) for (i = (*keys)->nkeys; i > 0; i--) shishi_key_done ((*keys)->keys[i - 1]); free ((*keys)->keys); free (*keys); *keys = NULL; return; } /** * shishi_keys_size: * @keys: key set handle as allocated by shishi_keys(). * * Get size of key set. * * Return value: Returns number of keys stored in key set. **/ int shishi_keys_size (Shishi_keys * keys) { return keys->nkeys; } /** * shishi_keys_nth: * @keys: key set handle as allocated by shishi_keys(). * @keyno: integer indicating requested key in key set. * * Get the n:th ticket in key set. * * Return value: Returns a key handle to the keyno:th key in the key * set, or NULL if @keys is invalid or @keyno is out of bounds. The * first key is @keyno 0, the second key @keyno 1, and so on. **/ const Shishi_key * shishi_keys_nth (Shishi_keys * keys, int keyno) { if (keys == NULL || keyno >= keys->nkeys) return NULL; return keys->keys[keyno]; } /** * shishi_keys_remove: * @keys: key set handle as allocated by shishi_keys(). * @keyno: key number of key in the set to remove. The first * key is key number 0. * * Remove a key, indexed by @keyno, in given key set. **/ void shishi_keys_remove (Shishi_keys * keys, int keyno) { shishi_key_done (keys->keys[keyno]); if (keyno < keys->nkeys) memmove (&keys->keys[keyno], &keys->keys[keyno + 1], sizeof (*keys->keys) * (keys->nkeys - keyno - 1)); --keys->nkeys; keys->keys = xrealloc (keys->keys, sizeof (*keys->keys) * keys->nkeys); } /** * shishi_keys_add: * @keys: key set handle as allocated by shishi_keys(). * @key: key to be added to key set. * * Add a key to the key set. A deep copy of the key is stored, so * changing @key, or deallocating it, will not modify the value stored * in the key set. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_keys_add (Shishi_keys * keys, Shishi_key * key) { int rc; if (!key) return SHISHI_INVALID_KEY; keys->nkeys++; keys->keys = xrealloc (keys->keys, sizeof (*keys->keys) * keys->nkeys); rc = shishi_key (keys->handle, &(keys->keys[keys->nkeys - 1])); if (rc != SHISHI_OK) return rc; shishi_key_copy (keys->keys[keys->nkeys - 1], key); return SHISHI_OK; } /** * shishi_keys_print: * @keys: key set to print. * @fh: file handle, open for writing, to print keys to. * * Print all keys in set using shishi_key_print. * * Returns: Returns %SHISHI_OK on success. **/ int shishi_keys_print (Shishi_keys * keys, FILE * fh) { int rc; int i; for (i = 0; i < keys->nkeys; i++) { rc = shishi_key_print (keys->handle, fh, shishi_keys_nth (keys, i)); if (rc != SHISHI_OK) return rc; fprintf (fh, "\n"); } return SHISHI_OK; } /** * shishi_keys_to_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: filename to append key to. * @keys: set of keys to print. * * Print an ASCII representation of a key structure to a file, for * each key in the key set. The file is appended to if it exists. * See shishi_key_print() for the format of the output. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_keys_to_file (Shishi * handle, const char *filename, Shishi_keys * keys) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing KEYS to %s...\n"), filename); fh = fopen (filename, "a"); if (fh == NULL) return SHISHI_FOPEN_ERROR; res = shishi_keys_print (keys, fh); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing KEYS to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_keys_from_file: * @keys: key set handle as allocated by shishi_keys(). * @filename: filename to read keys from. * * Read zero or more keys from file @filename and append them to the * keyset @keys. See shishi_key_print() for the format of the input. * * Return value: Returns %SHISHI_OK iff successful. * * Since: 0.0.42 **/ int shishi_keys_from_file (Shishi_keys * keys, const char *filename) { FILE *fh; int res; fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; res = SHISHI_OK; while (!feof (fh)) { Shishi_key *key = NULL; res = shishi_key_parse (keys->handle, fh, &key); if (res != SHISHI_OK || key == NULL) break; if (VERBOSENOISE (keys->handle)) { printf ("Read key:\n"); shishi_key_print (keys->handle, stdout, key); } res = shishi_keys_add (keys, key); shishi_key_done (key); key = NULL; } res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; return SHISHI_OK; } /** * shishi_keys_for_serverrealm_in_file * @handle: Shishi library handle create by shishi_init(). * @filename: file to read keys from. * @server: server name to get key for. * @realm: realm of server to get key for. * * Get keys that match specified @server and @realm from the key set * file @filename. * * Return value: Returns the key for specific server and realm, read * from the indicated file, or NULL if no key could be found or an * error encountered. **/ Shishi_key * shishi_keys_for_serverrealm_in_file (Shishi * handle, const char *filename, const char *server, const char *realm) { Shishi_key *key = NULL; FILE *fh; int res; fh = fopen (filename, "r"); if (fh == NULL) return NULL; res = SHISHI_OK; while (!feof (fh)) { res = shishi_key_parse (handle, fh, &key); if (res != SHISHI_OK || key == NULL) break; if (VERBOSENOISE (handle)) { printf ("Read key:\n"); shishi_key_print (handle, stdout, key); } if ((!server || (shishi_key_principal (key) && strcmp (server, shishi_key_principal (key)) == 0)) && (!realm || (shishi_key_realm (key) && strcmp (realm, shishi_key_realm (key)) == 0))) break; shishi_key_done (key); key = NULL; } res = fclose (fh); if (res != 0) return NULL; return key; } /** * shishi_keys_for_server_in_file * @handle: Shishi library handle create by shishi_init(). * @filename: file to read keys from. * @server: server name to get key for. * * Get key for specified @server from @filename. * * Return value: Returns the key for specific server, read from the * indicated file, or NULL if no key could be found or an error * encountered. **/ Shishi_key * shishi_keys_for_server_in_file (Shishi * handle, const char *filename, const char *server) { return shishi_keys_for_serverrealm_in_file (handle, filename, server, NULL); } /** * shishi_keys_for_localservicerealm_in_file: * @handle: Shishi library handle create by shishi_init(). * @filename: file to read keys from. * @service: service to get key for. * @realm: realm of server to get key for, or NULL for default realm. * * Get key for specified @service and @realm from @filename. * * Return value: Returns the key for the server * "SERVICE/HOSTNAME@REALM" (where HOSTNAME is the current system's * hostname), read from the default host keys file (see * shishi_hostkeys_default_file()), or NULL if no key could be found * or an error encountered. **/ Shishi_key * shishi_keys_for_localservicerealm_in_file (Shishi * handle, const char *filename, const char *service, const char *realm) { char *hostname; char *server; Shishi_key *key; hostname = xgethostname (); asprintf (&server, "%s/%s", service, hostname); key = shishi_keys_for_serverrealm_in_file (handle, filename, server, realm); free (server); free (hostname); return key; } shishi-1.0.2/lib/kdcrep.c0000664000000000000000000004733512126660507012075 00000000000000/* kdcrep.c --- Key distribution (AS/TGS) Reply functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" #define SHISHI_KDCREP_DEFAULT_PVNO "5" #define SHISHI_KDCREP_DEFAULT_PVNO_LEN 0 #define SHISHI_AS_REP_DEFAULT_MSG_TYPE "11" #define SHISHI_AS_REP_DEFAULT_MSG_TYPE_LEN 0 #define SHISHI_TGS_REP_DEFAULT_MSG_TYPE "13" #define SHISHI_TGS_REP_DEFAULT_MSG_TYPE_LEN 0 static Shishi_asn1 _shishi_kdcrep (Shishi * handle, int as) { int res; Shishi_asn1 node; if (as) node = shishi_asn1_asrep (handle); else node = shishi_asn1_tgsrep (handle); if (!node) return NULL; res = shishi_asn1_write (handle, node, "pvno", SHISHI_KDCREP_DEFAULT_PVNO, SHISHI_KDCREP_DEFAULT_PVNO_LEN); if (res != SHISHI_OK) goto error; if (as) res = shishi_asn1_write (handle, node, "msg-type", SHISHI_AS_REP_DEFAULT_MSG_TYPE, SHISHI_AS_REP_DEFAULT_MSG_TYPE_LEN); else res = shishi_asn1_write (handle, node, "msg-type", SHISHI_TGS_REP_DEFAULT_MSG_TYPE, SHISHI_TGS_REP_DEFAULT_MSG_TYPE_LEN); if (res != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_asrep: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new AS-REP, populated with some default * values. * * Return value: Returns the AS-REP or NULL on failure. **/ Shishi_asn1 shishi_asrep (Shishi * handle) { return _shishi_kdcrep (handle, 1); } /** * shishi_tgsrep: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new TGS-REP, populated with some default * values. * * Return value: Returns the TGS-REP or NULL on failure. **/ Shishi_asn1 shishi_tgsrep (Shishi * handle) { return _shishi_kdcrep (handle, 0); } /** * shishi_kdcrep_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @kdcrep: KDC-REP to print. * * Print ASCII armored DER encoding of KDC-REP to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep) { return _shishi_print_armored_data (handle, fh, kdcrep, "KDC-REP", NULL); } /** * shishi_kdcrep_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @kdcrep: KDC-REP to save. * * Print DER encoding of KDC-REP to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep) { return _shishi_save_data (handle, fh, kdcrep, "KDC-REP"); } /** * shishi_kdcrep_to_file: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write KDC-REP to file in specified TYPE. The file will be truncated * if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_to_file (Shishi * handle, Shishi_asn1 kdcrep, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing KDC-REP to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing KDC-REP in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_kdcrep_print (handle, fh, kdcrep); else res = shishi_kdcrep_save (handle, fh, kdcrep); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing KDC-REP to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_kdcrep_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @kdcrep: output variable with newly allocated KDC-REP. * * Read ASCII armored DER encoded KDC-REP from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep) { return _shishi_kdcrep_input (handle, fh, kdcrep, 0); } /** * shishi_kdcrep_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @kdcrep: output variable with newly allocated KDC-REP. * * Read DER encoded KDC-REP from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep) { return _shishi_kdcrep_input (handle, fh, kdcrep, 1); } /** * shishi_kdcrep_from_file: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: output variable with newly allocated KDC-REP. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read KDC-REP from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_from_file (Shishi * handle, Shishi_asn1 * kdcrep, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading KDC-REP from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading KDC-REP in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_kdcrep_parse (handle, fh, kdcrep); else res = shishi_kdcrep_read (handle, fh, kdcrep); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading KDC-REP from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_kdcrep_crealm_set: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: Kdcrep variable to set realm field in. * @crealm: input array with name of realm. * * Set the client realm field in the KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_crealm_set (Shishi * handle, Shishi_asn1 kdcrep, const char *crealm) { int res; res = shishi_asn1_write (handle, kdcrep, "crealm", crealm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcrep_cname_set: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: Kdcrep variable to set server name field in. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @cname: input array with principal name. * * Set the client name field in the KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_cname_set (Shishi * handle, Shishi_asn1 kdcrep, Shishi_name_type name_type, const char *cname[]) { int res; res = shishi_principal_name_set (handle, kdcrep, "cname", name_type, cname); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcrep_client_set: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: Kdcrep variable to set server name field in. * @client: zero-terminated string with principal name on RFC 1964 form. * * Set the client name field in the KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_client_set (Shishi * handle, Shishi_asn1 kdcrep, const char *client) { int res; res = shishi_principal_set (handle, kdcrep, "cname", client); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_kdcrep_crealmserver_set (Shishi * handle, Shishi_asn1 kdcrep, const char *crealm, const char *client) { int res; res = shishi_kdcrep_crealm_set (handle, kdcrep, crealm); if (res != SHISHI_OK) return res; res = shishi_kdcrep_client_set (handle, kdcrep, client); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcrep_get_enc_part_etype: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP variable to get value from. * @etype: output variable that holds the value. * * Extract KDC-REP.enc-part.etype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_get_enc_part_etype (Shishi * handle, Shishi_asn1 kdcrep, int32_t * etype) { return shishi_asn1_read_int32 (handle, kdcrep, "enc-part.etype", etype); } /** * shishi_kdcrep_get_ticket: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP variable to get ticket from. * @ticket: output variable to hold extracted ticket. * * Extract ticket from KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_get_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 * ticket) { char *buf; char *format; size_t buflen; int res; size_t i, n; /* there's GOT to be an easier way to do this */ *ticket = shishi_ticket (handle); if (!*ticket) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, kdcrep, "ticket.tkt-vno", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "tkt-vno", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, kdcrep, "ticket.realm", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "realm", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, kdcrep, "ticket.sname.name-type", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "sname.name-type", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_number_of_elements (handle, kdcrep, "ticket.sname.name-string", &n); if (res != SHISHI_OK) goto error; for (i = 1; i <= n; i++) { res = shishi_asn1_write (handle, *ticket, "sname.name-string", "NEW", 1); if (res != SHISHI_OK) goto error; format = xasprintf ("ticket.sname.name-string.?%d", i); res = shishi_asn1_read (handle, kdcrep, format, &buf, &buflen); free (format); if (res != SHISHI_OK) goto error; format = xasprintf ("sname.name-string.?%d", i); res = shishi_asn1_write (handle, *ticket, format, buf, buflen); free (format); free (buf); if (res != SHISHI_OK) goto error; } res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.etype", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "enc-part.etype", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.kvno", &buf, &buflen); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) goto error; if (res == SHISHI_ASN1_NO_ELEMENT) res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", NULL, 0); else { res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", buf, buflen); free (buf); } if (res != SHISHI_OK) goto error; res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.cipher", &buf, &buflen); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, *ticket, "enc-part.cipher", buf, buflen); free (buf); if (res != SHISHI_OK) goto error; return SHISHI_OK; error: shishi_asn1_done (handle, *ticket); return res; } /** * shishi_kdcrep_set_ticket: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to add ticket field to. * @ticket: input ticket to copy into KDC-REP ticket field. * * Copy ticket into KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_set_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 ticket) { int res = SHISHI_OK; char *format; char *buf; size_t buflen; size_t i, n; res = shishi_asn1_read (handle, ticket, "tkt-vno", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "ticket.tkt-vno", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "realm", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "ticket.realm", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "sname.name-type", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "ticket.sname.name-type", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, ticket, "sname.name-string", &n); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { res = shishi_asn1_write (handle, kdcrep, "ticket.sname.name-string", "NEW", 1); if (res != SHISHI_OK) return res; format = xasprintf ("sname.name-string.?%d", i); res = shishi_asn1_read (handle, ticket, format, &buf, &buflen); free (format); if (res != SHISHI_OK) return res; format = xasprintf ("ticket.sname.name-string.?%d", i); res = shishi_asn1_write (handle, kdcrep, format, buf, buflen); free (format); free (buf); if (res != SHISHI_OK) return res; } res = shishi_asn1_read (handle, ticket, "enc-part.etype", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.etype", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "enc-part.kvno", &buf, &buflen); if (res != SHISHI_OK) res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.kvno", NULL, 0); else { res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.kvno", buf, buflen); free (buf); } if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, ticket, "enc-part.cipher", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.cipher", buf, buflen); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcrep_set_enc_part: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to add enc-part field to. * @etype: encryption type used to encrypt enc-part. * @kvno: key version number. * @buf: input array with encrypted enc-part. * @buflen: size of input array with encrypted enc-part. * * Set the encrypted enc-part field in the KDC-REP. The encrypted * data is usually created by calling shishi_encrypt() on the DER * encoded enc-part. To save time, you may want to use * shishi_kdcrep_add_enc_part() instead, which calculates the * encrypted data and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_set_enc_part (Shishi * handle, Shishi_asn1 kdcrep, int32_t etype, uint32_t kvno, const char *buf, size_t buflen) { int res = SHISHI_OK; res = shishi_asn1_write (handle, kdcrep, "enc-part.cipher", buf, buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write_int32 (handle, kdcrep, "enc-part.etype", etype); if (res != SHISHI_OK) return res; if (kvno == UINT32_MAX) res = shishi_asn1_write (handle, kdcrep, "enc-part.kvno", NULL, 0); else res = shishi_asn1_write_uint32 (handle, kdcrep, "enc-part.kvno", kvno); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcrep_add_enc_part: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to add enc-part field to. * @key: key used to encrypt enc-part. * @keyusage: key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, * SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or * SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY. * @enckdcreppart: EncKDCRepPart to add. * * Encrypts DER encoded EncKDCRepPart using key and stores it in the * KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_add_enc_part (Shishi * handle, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 enckdcreppart) { int res = SHISHI_OK; char *buf; size_t buflen; char *der; size_t derlen; res = shishi_asn1_to_der (handle, enckdcreppart, &der, &derlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode enckdcreppart: %s\n", shishi_strerror (res)); return SHISHI_ASN1_ERROR; } res = shishi_encrypt (handle, key, keyusage, der, derlen, &buf, &buflen); free (der); if (res != SHISHI_OK) { shishi_error_printf (handle, "Cannot encrypt EncKDCRepPart\n"); return res; } res = shishi_kdcrep_set_enc_part (handle, kdcrep, shishi_key_type (key), shishi_key_version (key), buf, buflen); free (buf); return res; } int shishi_kdcrep_decrypt (Shishi * handle, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 * enckdcreppart) { int res; int i; char *buf; size_t buflen; char *cipher; size_t cipherlen; int etype; res = shishi_kdcrep_get_enc_part_etype (handle, kdcrep, &etype); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (key)) return SHISHI_KDCREP_BAD_KEYTYPE; res = shishi_asn1_read (handle, kdcrep, "enc-part.cipher", &cipher, &cipherlen); if (res != SHISHI_OK) return res; res = shishi_decrypt (handle, key, keyusage, cipher, cipherlen, &buf, &buflen); free (cipher); if (res != SHISHI_OK) { shishi_error_printf (handle, "KDCRep decryption failed, wrong password?"); return res; } /* The crypto is so 1980; no length indicator. Trim off pad bytes until we can parse it. */ for (i = 0; i < 8; i++) { if (VERBOSEASN1 (handle)) printf ("Trying with %d pad in enckdcrep...\n", i); *enckdcreppart = shishi_der2asn1_encasreppart (handle, &buf[0], buflen - i); if (*enckdcreppart != NULL) break; *enckdcreppart = shishi_der2asn1_enctgsreppart (handle, &buf[0], buflen - i); if (*enckdcreppart != NULL) break; *enckdcreppart = shishi_der2asn1_enckdcreppart (handle, &buf[0], buflen - i); if (*enckdcreppart != NULL) break; } free (buf); if (*enckdcreppart == NULL) { shishi_error_printf (handle, "Could not DER decode EncKDCRepPart. " "Password probably correct (decrypt ok) though\n"); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } /** * shishi_kdcrep_clear_padata: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to remove PA-DATA from. * * Remove the padata field from KDC-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcrep_clear_padata (Shishi * handle, Shishi_asn1 kdcrep) { int res; res = shishi_asn1_write (handle, kdcrep, "padata", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/ap.c0000664000000000000000000011276012126660507011220 00000000000000/* ap.c --- AP functions * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi is distributed in the hope that it will be useful, but 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_ap { Shishi *handle; Shishi_tkt *tkt; Shishi_key *key; Shishi_asn1 authenticator; Shishi_asn1 apreq; Shishi_asn1 aprep; Shishi_asn1 encapreppart; /* Key usage for encryption entire Authenticator ASN.1 blob, stored in AP-REQ. */ int authenticatorkeyusage; /* Key usage for computing checksum of authenticatorcksumdata in the Authenticator, in AP-REQ. */ int authenticatorcksumkeyusage; /* Sets the checksum algorithm type in Authenticator, in AP-REQ. If there is data in authenticatorcksumdata to compute a checksum on, this also indicate the algorithm to use for this computation. */ int32_t authenticatorcksumtype; /* Auxilliary application data to compute checksum on and store in Authenticator, in AP-REQ. Note that data is not stored in AP-REQ, only a checksum of it. */ char *authenticatorcksumdata; size_t authenticatorcksumdatalen; /* Raw checksum data to store in Authenticator, in AP-REQ. Normally, this is the output of the checksum algorithm computed on the data in authenticatorcksumdata, but some applications (e.g., GSS-API) put something weird in the checksum field. */ char *authenticatorcksumraw; size_t authenticatorcksumrawlen; }; /** * shishi_ap: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * * Create a new AP exchange with a random subkey of the default * encryption type from configuration. Note that there is no * guarantee that the receiver will understand that key type, you * should probably use shishi_ap_etype() or shishi_ap_nosubkey() * instead. In the future, this function will likely behave as * shishi_ap_nosubkey() and shishi_ap_nosubkey() will be removed. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap (Shishi * handle, Shishi_ap ** ap) { int res; res = shishi_ap_nosubkey (handle, ap); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not create Authenticator: %s\n", shishi_error (handle)); return res; } res = shishi_authenticator_add_random_subkey (handle, (*ap)->authenticator); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not add random subkey in AP: %s\n", shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_ap_etype: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @etype: encryption type of newly generated random subkey. * * Create a new AP exchange with a random subkey of indicated * encryption type. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_etype (Shishi * handle, Shishi_ap ** ap, int etype) { int res; res = shishi_ap_nosubkey (handle, ap); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not create Authenticator: %s\n", shishi_error (handle)); return res; } res = shishi_authenticator_add_random_subkey_etype (handle, (*ap)->authenticator, etype); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not add random subkey in AP: %s\n", shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_ap_nosubkey: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * * Create a new AP exchange without subkey in authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_nosubkey (Shishi * handle, Shishi_ap ** ap) { Shishi_ap *lap; *ap = xcalloc (1, sizeof (**ap)); lap = *ap; lap->handle = handle; lap->authenticatorcksumtype = SHISHI_NO_CKSUMTYPE; lap->authenticatorcksumkeyusage = SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR_CKSUM; lap->authenticatorkeyusage = SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR; lap->authenticator = shishi_authenticator (handle); if (lap->authenticator == NULL) { shishi_error_printf (handle, "Could not create Authenticator: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } lap->apreq = shishi_apreq (handle); if (lap->apreq == NULL) { shishi_error_printf (handle, "Could not create AP-REQ: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } lap->aprep = shishi_aprep (handle); if (lap->aprep == NULL) { shishi_error_printf (handle, "Could not create AP-REP: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } lap->encapreppart = shishi_encapreppart (handle); if (lap->encapreppart == NULL) { shishi_error_printf (handle, "Could not create EncAPRepPart: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } /** * shishi_ap_done: * @ap: structure that holds information about AP exchange * * Deallocate resources associated with AP exchange. This should be * called by the application when it no longer need to utilize the AP * exchange handle. **/ void shishi_ap_done (Shishi_ap * ap) { free (ap->authenticatorcksumdata); free (ap->authenticatorcksumraw); shishi_asn1_done (ap->handle, ap->authenticator); shishi_asn1_done (ap->handle, ap->apreq); shishi_asn1_done (ap->handle, ap->aprep); shishi_asn1_done (ap->handle, ap->encapreppart); free (ap); } /** * shishi_ap_set_tktoptions: * @ap: structure that holds information about AP exchange * @tkt: ticket to set in AP. * @options: AP-REQ options to set in AP. * * Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ * apoptions (see shishi_apreq_options_set()). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_set_tktoptions (Shishi_ap * ap, Shishi_tkt * tkt, int options) { int rc; shishi_ap_tkt_set (ap, tkt); rc = shishi_apreq_options_set (ap->handle, shishi_ap_req (ap), options); if (rc != SHISHI_OK) { printf ("Could not set AP-Options: %s", shishi_strerror (rc)); return rc; } return SHISHI_OK; } /** * shishi_ap_set_tktoptionsdata: * @ap: structure that holds information about AP exchange * @tkt: ticket to set in AP. * @options: AP-REQ options to set in AP. * @data: input array with data to checksum in Authenticator. * @len: length of input array with data to checksum in Authenticator. * * Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ * apoptions (see shishi_apreq_options_set()) and set the * Authenticator checksum data. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_set_tktoptionsdata (Shishi_ap * ap, Shishi_tkt * tkt, int options, const char *data, size_t len) { int rc; shishi_ap_tkt_set (ap, tkt); rc = shishi_apreq_options_set (ap->handle, shishi_ap_req (ap), options); if (rc != SHISHI_OK) { printf ("Could not set AP-Options: %s", shishi_strerror (rc)); return rc; } shishi_ap_authenticator_cksumdata_set (ap, data, len); return SHISHI_OK; } /** * shishi_ap_set_tktoptionsraw: * @ap: structure that holds information about AP exchange * @tkt: ticket to set in AP. * @options: AP-REQ options to set in AP. * @cksumtype: authenticator checksum type to set in AP. * @data: input array with data to store in checksum field in Authenticator. * @len: length of input array with data to store in checksum field in * Authenticator. * * Set the ticket (see shishi_ap_tkt_set()) and set the AP-REQ * apoptions (see shishi_apreq_options_set()) and set the raw * Authenticator checksum data. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_set_tktoptionsraw (Shishi_ap * ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char *data, size_t len) { int rc; shishi_ap_tkt_set (ap, tkt); rc = shishi_apreq_options_set (ap->handle, shishi_ap_req (ap), options); if (rc != SHISHI_OK) { printf ("Could not set AP-Options: %s", shishi_strerror (rc)); return rc; } shishi_ap_authenticator_cksumraw_set (ap, cksumtype, data, len); return SHISHI_OK; } /** * shishi_ap_set_tktoptionsasn1usage: * @ap: structure that holds information about AP exchange * @tkt: ticket to set in AP. * @options: AP-REQ options to set in AP. * @node: input ASN.1 structure to store as authenticator checksum data. * @field: field in ASN.1 structure to use. * @authenticatorcksumkeyusage: key usage for checksum in authenticator. * @authenticatorkeyusage: key usage for authenticator. * * Set ticket, options and authenticator checksum data using * shishi_ap_set_tktoptionsdata(). The authenticator checksum data is * the DER encoding of the ASN.1 field provided. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_set_tktoptionsasn1usage (Shishi_ap * ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char *field, int authenticatorcksumkeyusage, int authenticatorkeyusage) { char *buf; size_t buflen; int res; res = shishi_asn1_to_der_field (ap->handle, node, field, &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_ap_set_tktoptionsdata (ap, tkt, options, buf, buflen); if (res != SHISHI_OK) return res; ap->authenticatorcksumkeyusage = authenticatorcksumkeyusage; ap->authenticatorkeyusage = authenticatorkeyusage; return SHISHI_OK; } /** * shishi_ap_tktoptions: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @tkt: ticket to set in newly created AP. * @options: AP-REQ options to set in newly created AP. * * Create a new AP exchange using shishi_ap(), and set the ticket and * AP-REQ apoptions using shishi_ap_set_tktoptions(). A random * session key is added to the authenticator, using the same keytype * as the ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_tktoptions (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options) { int rc; rc = shishi_ap_etype (handle, ap, shishi_tkt_keytype_fast (tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_ap_set_tktoptions (*ap, tkt, options); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_tktoptionsdata: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @tkt: ticket to set in newly created AP. * @options: AP-REQ options to set in newly created AP. * @data: input array with data to checksum in Authenticator. * @len: length of input array with data to checksum in Authenticator. * * Create a new AP exchange using shishi_ap(), and set the ticket, * AP-REQ apoptions and the Authenticator checksum data using * shishi_ap_set_tktoptionsdata(). A random session key is added to * the authenticator, using the same keytype as the ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, const char *data, size_t len) { int rc; rc = shishi_ap_etype (handle, ap, shishi_tkt_keytype_fast (tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_ap_set_tktoptionsdata (*ap, tkt, options, data, len); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_tktoptionsraw: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @tkt: ticket to set in newly created AP. * @options: AP-REQ options to set in newly created AP. * @cksumtype: authenticator checksum type to set in AP. * @data: input array with data to store in checksum field in Authenticator. * @len: length of input array with data to store in checksum field in * Authenticator. * * Create a new AP exchange using shishi_ap(), and set the ticket, * AP-REQ apoptions and the raw Authenticator checksum data field * using shishi_ap_set_tktoptionsraw(). A random session key is added * to the authenticator, using the same keytype as the ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_tktoptionsraw (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char *data, size_t len) { int rc; rc = shishi_ap_etype (handle, ap, shishi_tkt_keytype_fast (tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_ap_set_tktoptionsraw (*ap, tkt, options, cksumtype, data, len); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_etype_tktoptionsdata: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @etype: encryption type of newly generated random subkey. * @tkt: ticket to set in newly created AP. * @options: AP-REQ options to set in newly created AP. * @data: input array with data to checksum in Authenticator. * @len: length of input array with data to checksum in Authenticator. * * Create a new AP exchange using shishi_ap(), and set the ticket, * AP-REQ apoptions and the Authenticator checksum data using * shishi_ap_set_tktoptionsdata(). A random session key is added to * the authenticator, using the same keytype as the ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_etype_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, int32_t etype, Shishi_tkt * tkt, int options, const char *data, size_t len) { int rc; rc = shishi_ap_etype (handle, ap, etype); if (rc != SHISHI_OK) return rc; rc = shishi_ap_set_tktoptionsdata (*ap, tkt, options, data, len); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_tktoptionsasn1usage: * @handle: shishi handle as allocated by shishi_init(). * @ap: pointer to new structure that holds information about AP exchange * @tkt: ticket to set in newly created AP. * @options: AP-REQ options to set in newly created AP. * @node: input ASN.1 structure to store as authenticator checksum data. * @field: field in ASN.1 structure to use. * @authenticatorcksumkeyusage: key usage for checksum in authenticator. * @authenticatorkeyusage: key usage for authenticator. * * Create a new AP exchange using shishi_ap(), and set ticket, options * and authenticator checksum data from the DER encoding of the ASN.1 * field using shishi_ap_set_tktoptionsasn1usage(). A random session * key is added to the authenticator, using the same keytype as the * ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_tktoptionsasn1usage (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char *field, int authenticatorcksumkeyusage, int authenticatorkeyusage) { int rc; rc = shishi_ap_etype (handle, ap, shishi_tkt_keytype_fast (tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_ap_set_tktoptionsasn1usage (*ap, tkt, options, node, field, authenticatorcksumkeyusage, authenticatorkeyusage); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_tkt: * @ap: structure that holds information about AP exchange * * Get Ticket from AP exchange. * * Return value: Returns the ticket from the AP exchange, or NULL if * not yet set or an error occured. **/ Shishi_tkt * shishi_ap_tkt (Shishi_ap * ap) { return ap->tkt; } /** * shishi_ap_tkt_set: * @ap: structure that holds information about AP exchange * @tkt: ticket to store in AP. * * Set the Ticket in the AP exchange. **/ void shishi_ap_tkt_set (Shishi_ap * ap, Shishi_tkt * tkt) { ap->tkt = tkt; } /** * shishi_ap_authenticator_cksumdata: * @ap: structure that holds information about AP exchange * @out: output array that holds authenticator checksum data. * @len: on input, maximum length of output array that holds * authenticator checksum data, on output actual length of * output array that holds authenticator checksum data. * * Get checksum data from Authenticator. * * Return value: Returns %SHISHI_OK if successful, or * %SHISHI_TOO_SMALL_BUFFER if buffer provided was too small (then @len * will hold necessary buffer size). **/ int shishi_ap_authenticator_cksumdata (Shishi_ap * ap, char *out, size_t * len) { if (*len < ap->authenticatorcksumdatalen) { *len = ap->authenticatorcksumdatalen; return SHISHI_TOO_SMALL_BUFFER; } if (out && ap->authenticatorcksumdata) memcpy (out, ap->authenticatorcksumdata, ap->authenticatorcksumdatalen); *len = ap->authenticatorcksumdatalen; return SHISHI_OK; } /** * shishi_ap_authenticator_cksumdata_set: * @ap: structure that holds information about AP exchange * @authenticatorcksumdata: input array with data to compute checksum * on and store in Authenticator in AP-REQ. * @authenticatorcksumdatalen: length of input array with data to * compute checksum on and store in Authenticator in AP-REQ. * * Set the Authenticator Checksum Data in the AP exchange. This is * the data that will be checksumed, and the checksum placed in the * checksum field. It is not the actual checksum field. See also * shishi_ap_authenticator_cksumraw_set. **/ void shishi_ap_authenticator_cksumdata_set (Shishi_ap * ap, const char *authenticatorcksumdata, size_t authenticatorcksumdatalen) { ap->authenticatorcksumdata = xmemdup (authenticatorcksumdata, authenticatorcksumdatalen); ap->authenticatorcksumdatalen = authenticatorcksumdatalen; } /** * shishi_ap_authenticator_cksumraw_set: * @ap: structure that holds information about AP exchange * @authenticatorcksumtype: authenticator checksum type to set in AP. * @authenticatorcksumraw: input array with authenticator checksum * field value to set in Authenticator in AP-REQ. * @authenticatorcksumrawlen: length of input array with * authenticator checksum field value to set in Authenticator in AP-REQ. * * Set the Authenticator Checksum Data in the AP exchange. This is * the actual checksum field, not data to compute checksum on and then * store in the checksum field. See also * shishi_ap_authenticator_cksumdata_set. **/ void shishi_ap_authenticator_cksumraw_set (Shishi_ap * ap, int32_t authenticatorcksumtype, const char *authenticatorcksumraw, size_t authenticatorcksumrawlen) { shishi_ap_authenticator_cksumtype_set (ap, authenticatorcksumtype); ap->authenticatorcksumraw = xmemdup (authenticatorcksumraw, authenticatorcksumrawlen); ap->authenticatorcksumrawlen = authenticatorcksumrawlen; } /** * shishi_ap_authenticator_cksumtype: * @ap: structure that holds information about AP exchange * * Get the Authenticator Checksum Type in the AP exchange. * * Return value: Return the authenticator checksum type. **/ int32_t shishi_ap_authenticator_cksumtype (Shishi_ap * ap) { return ap->authenticatorcksumtype; } /** * shishi_ap_authenticator_cksumtype_set: * @ap: structure that holds information about AP exchange * @cksumtype: authenticator checksum type to set in AP. * * Set the Authenticator Checksum Type in the AP exchange. **/ void shishi_ap_authenticator_cksumtype_set (Shishi_ap * ap, int32_t cksumtype) { ap->authenticatorcksumtype = cksumtype; } /** * shishi_ap_authenticator: * @ap: structure that holds information about AP exchange * * Get ASN.1 Authenticator structure from AP exchange. * * Return value: Returns the Authenticator from the AP exchange, or * NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_ap_authenticator (Shishi_ap * ap) { return ap->authenticator; } /** * shishi_ap_authenticator_set: * @ap: structure that holds information about AP exchange * @authenticator: authenticator to store in AP. * * Set the Authenticator in the AP exchange. **/ void shishi_ap_authenticator_set (Shishi_ap * ap, Shishi_asn1 authenticator) { if (ap->authenticator) shishi_asn1_done (ap->handle, ap->authenticator); ap->authenticator = authenticator; } /** * shishi_ap_req: * @ap: structure that holds information about AP exchange * * Get ASN.1 AP-REQ structure from AP exchange. * * Return value: Returns the AP-REQ from the AP exchange, or NULL if * not yet set or an error occured. **/ Shishi_asn1 shishi_ap_req (Shishi_ap * ap) { return ap->apreq; } /** * shishi_ap_req_set: * @ap: structure that holds information about AP exchange * @apreq: apreq to store in AP. * * Set the AP-REQ in the AP exchange. **/ void shishi_ap_req_set (Shishi_ap * ap, Shishi_asn1 apreq) { if (ap->apreq) shishi_asn1_done (ap->handle, ap->apreq); ap->apreq = apreq; } /** * shishi_ap_req_der: * @ap: structure that holds information about AP exchange * @out: pointer to output array with der encoding of AP-REQ. * @outlen: pointer to length of output array with der encoding of AP-REQ. * * Build AP-REQ using shishi_ap_req_build() and DER encode it. @out * is allocated by this function, and it is the responsibility of * caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_der (Shishi_ap * ap, char **out, size_t * outlen) { int rc; rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_to_der (ap->handle, ap->apreq, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_req_der_set: * @ap: structure that holds information about AP exchange * @der: input array with DER encoded AP-REQ. * @derlen: length of input array with DER encoded AP-REQ. * * DER decode AP-REQ and set it AP exchange. If decoding fails, the * AP-REQ in the AP exchange is lost. * * Return value: Returns SHISHI_OK. **/ int shishi_ap_req_der_set (Shishi_ap * ap, char *der, size_t derlen) { ap->apreq = shishi_der2asn1_apreq (ap->handle, der, derlen); if (ap->apreq) return SHISHI_OK; else return SHISHI_ASN1_ERROR; } /** * shishi_ap_req_build: * @ap: structure that holds information about AP exchange * * Checksum data in authenticator and add ticket and authenticator to * AP-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_build (Shishi_ap * ap) { int res; int cksumtype; if (VERBOSE (ap->handle)) printf ("Building AP-REQ...\n"); if (VERBOSEASN1 (ap->handle)) { shishi_ticket_print (ap->handle, stdout, shishi_tkt_ticket (ap->tkt)); shishi_key_print (ap->handle, stdout, shishi_tkt_key (ap->tkt)); } res = shishi_apreq_set_ticket (ap->handle, ap->apreq, shishi_tkt_ticket (ap->tkt)); if (res != SHISHI_OK) { shishi_error_printf (ap->handle, "Could not set ticket in AP-REQ: %s\n", shishi_error (ap->handle)); return res; } cksumtype = shishi_ap_authenticator_cksumtype (ap); if (ap->authenticatorcksumraw && ap->authenticatorcksumrawlen > 0) res = shishi_authenticator_set_cksum (ap->handle, ap->authenticator, cksumtype, ap->authenticatorcksumraw, ap->authenticatorcksumrawlen); else if (cksumtype == SHISHI_NO_CKSUMTYPE) res = shishi_authenticator_add_cksum (ap->handle, ap->authenticator, shishi_tkt_key (ap->tkt), ap->authenticatorcksumkeyusage, ap->authenticatorcksumdata, ap->authenticatorcksumdatalen); else res = shishi_authenticator_add_cksum_type (ap->handle, ap->authenticator, shishi_tkt_key (ap->tkt), ap->authenticatorcksumkeyusage, cksumtype, ap->authenticatorcksumdata, ap->authenticatorcksumdatalen); if (res != SHISHI_OK) { shishi_error_printf (ap->handle, "Could not add checksum to authenticator: %s\n", shishi_error (ap->handle)); return res; } if (VERBOSE (ap->handle)) printf ("Got Authenticator...\n"); if (VERBOSEASN1 (ap->handle)) shishi_authenticator_print (ap->handle, stdout, ap->authenticator); res = shishi_apreq_add_authenticator (ap->handle, ap->apreq, shishi_tkt_key (ap->tkt), ap->authenticatorkeyusage, ap->authenticator); if (res != SHISHI_OK) { shishi_error_printf (ap->handle, "Could not set authenticator: %s\n", shishi_error (ap->handle)); return res; } if (VERBOSEASN1 (ap->handle)) shishi_apreq_print (ap->handle, stdout, ap->apreq); return SHISHI_OK; } /** * shishi_ap_req_decode: * @ap: structure that holds information about AP exchange * * Decode ticket in AP-REQ and set the Ticket fields in the AP * exchange. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_decode (Shishi_ap * ap) { Shishi_asn1 ticket; int rc; if (VERBOSEASN1 (ap->handle)) shishi_apreq_print (ap->handle, stdout, ap->apreq); rc = shishi_apreq_get_ticket (ap->handle, ap->apreq, &ticket); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Could not extract ticket from AP-REQ: %s\n", shishi_strerror (rc)); return rc; } if (VERBOSEASN1 (ap->handle)) shishi_ticket_print (ap->handle, stdout, ticket); rc = shishi_tkt (ap->handle, &ap->tkt); if (rc != SHISHI_OK) return rc; shishi_tkt_ticket_set (ap->tkt, ticket); return SHISHI_OK; } /** * shishi_ap_req_process_keyusage: * @ap: structure that holds information about AP exchange * @key: cryptographic key used to decrypt ticket in AP-REQ. * @keyusage: key usage to use during decryption, for normal * AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, * for AP-REQ's part of TGS-REQ's, this is normally * SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR. * * Decrypt ticket in AP-REQ using supplied key and decrypt * Authenticator in AP-REQ using key in decrypted ticket, and on * success set the Ticket and Authenticator fields in the AP exchange. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_process_keyusage (Shishi_ap * ap, Shishi_key * key, int32_t keyusage) { Shishi_asn1 authenticator; Shishi_key *tktkey; int rc; rc = shishi_ap_req_decode (ap); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Error decoding ticket: %s\n", shishi_strerror (rc)); return rc; } rc = shishi_tkt_decrypt (ap->tkt, key); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Error decrypting ticket: %s\n", shishi_strerror (rc)); return rc; } rc = shishi_encticketpart_get_key (ap->handle, shishi_tkt_encticketpart (ap->tkt), &tktkey); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Could not get key from ticket: %s\n", shishi_strerror (rc)); return rc; } if (VERBOSEASN1 (ap->handle)) shishi_encticketpart_print (ap->handle, stdout, shishi_tkt_encticketpart (ap->tkt)); rc = shishi_apreq_decrypt (ap->handle, ap->apreq, tktkey, keyusage, &authenticator); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Error decrypting apreq: %s\n", shishi_strerror (rc)); return rc; } /* XXX? verify checksum in authenticator. */ if (VERBOSEASN1 (ap->handle)) shishi_authenticator_print (ap->handle, stdout, authenticator); free (ap->authenticatorcksumdata); rc = shishi_authenticator_cksum (ap->handle, authenticator, &ap->authenticatorcksumtype, &ap->authenticatorcksumdata, &ap->authenticatorcksumdatalen); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Error extracting authenticator checksum: %s\n", shishi_strerror (rc)); return rc; } ap->authenticator = authenticator; return SHISHI_OK; } /** * shishi_ap_req_process: * @ap: structure that holds information about AP exchange * @key: cryptographic key used to decrypt ticket in AP-REQ. * * Decrypt ticket in AP-REQ using supplied key and decrypt * Authenticator in AP-REQ using key in decrypted ticket, and on * success set the Ticket and Authenticator fields in the AP exchange. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_process (Shishi_ap * ap, Shishi_key * key) { return shishi_ap_req_process_keyusage (ap, key, SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR); } /** * shishi_ap_req_asn1: * @ap: structure that holds information about AP exchange * @apreq: output AP-REQ variable. * * Build AP-REQ using shishi_ap_req_build() and return it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_req_asn1 (Shishi_ap * ap, Shishi_asn1 * apreq) { int rc; rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) return rc; *apreq = ap->apreq; return SHISHI_OK; } /** * shishi_ap_key: * @ap: structure that holds information about AP exchange * * Extract the application key from AP. If subkeys are used, it is * taken from the Authenticator, otherwise the session key is used. * * Return value: Return application key from AP. **/ Shishi_key * shishi_ap_key (Shishi_ap * ap) { int rc; /* XXX do real check if subkey is present, don't just assume error means no subkey */ rc = shishi_authenticator_get_subkey (ap->handle, ap->authenticator, &ap->key); if (rc != SHISHI_OK) ap->key = shishi_tkt_key (ap->tkt); return ap->key; } /** * shishi_ap_rep: * @ap: structure that holds information about AP exchange * * Get ASN.1 AP-REP structure from AP exchange. * * Return value: Returns the AP-REP from the AP exchange, or NULL if * not yet set or an error occured. **/ Shishi_asn1 shishi_ap_rep (Shishi_ap * ap) { return ap->aprep; } /** * shishi_ap_rep_set: * @ap: structure that holds information about AP exchange * @aprep: aprep to store in AP. * * Set the AP-REP in the AP exchange. **/ void shishi_ap_rep_set (Shishi_ap * ap, Shishi_asn1 aprep) { if (ap->aprep) shishi_asn1_done (ap->handle, ap->aprep); ap->aprep = aprep; } /** * shishi_ap_rep_der: * @ap: structure that holds information about AP exchange * @out: output array with newly allocated DER encoding of AP-REP. * @outlen: length of output array with DER encoding of AP-REP. * * Build AP-REP using shishi_ap_rep_build() and DER encode it. @out * is allocated by this function, and it is the responsibility of * caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_rep_der (Shishi_ap * ap, char **out, size_t * outlen) { int rc; rc = shishi_ap_rep_build (ap); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_to_der (ap->handle, ap->aprep, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_ap_rep_der_set: * @ap: structure that holds information about AP exchange * @der: input array with DER encoded AP-REP. * @derlen: length of input array with DER encoded AP-REP. * * DER decode AP-REP and set it AP exchange. If decoding fails, the * AP-REP in the AP exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_ap_rep_der_set (Shishi_ap * ap, char *der, size_t derlen) { Shishi_asn1 aprep; aprep = shishi_der2asn1_aprep (ap->handle, der, derlen); if (!aprep) return SHISHI_ASN1_ERROR; ap->aprep = aprep; return SHISHI_OK; } /** * shishi_ap_rep_build: * @ap: structure that holds information about AP exchange * * Checksum data in authenticator and add ticket and authenticator to * AP-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_rep_build (Shishi_ap * ap) { Shishi_asn1 aprep; int rc; if (VERBOSE (ap->handle)) printf ("Building AP-REP...\n"); aprep = shishi_aprep (ap->handle); rc = shishi_aprep_enc_part_make (ap->handle, aprep, ap->encapreppart, ap->authenticator, shishi_tkt_encticketpart (ap->tkt)); if (rc != SHISHI_OK) { shishi_error_printf (ap->handle, "Error creating AP-REP: %s\n", shishi_strerror (rc)); return rc; } if (VERBOSEASN1 (ap->handle)) shishi_aprep_print (ap->handle, stdout, aprep); shishi_ap_rep_set (ap, aprep); return SHISHI_OK; } /** * shishi_ap_rep_asn1: * @ap: structure that holds information about AP exchange * @aprep: output AP-REP variable. * * Build AP-REP using shishi_ap_rep_build() and return it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ap_rep_asn1 (Shishi_ap * ap, Shishi_asn1 * aprep) { int rc; rc = shishi_ap_rep_build (ap); if (rc != SHISHI_OK) return rc; *aprep = ap->aprep; return SHISHI_OK; } /** * shishi_ap_rep_verify: * @ap: structure that holds information about AP exchange * * Verify AP-REP compared to Authenticator. * * Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an * error. **/ int shishi_ap_rep_verify (Shishi_ap * ap) { int res; if (VERBOSE (ap->handle)) printf ("Decrypting AP-REP...\n"); if (VERBOSEASN1 (ap->handle)) shishi_aprep_print (ap->handle, stdout, ap->aprep); res = shishi_aprep_decrypt (ap->handle, ap->aprep, shishi_tkt_key (ap->tkt), SHISHI_KEYUSAGE_ENCAPREPPART, &ap->encapreppart); if (res != SHISHI_OK) return res; if (VERBOSEASN1 (ap->handle)) shishi_encapreppart_print (ap->handle, stdout, ap->encapreppart); res = shishi_aprep_verify (ap->handle, ap->authenticator, ap->encapreppart); if (res != SHISHI_OK) return res; if (VERBOSE (ap->handle)) printf ("Verified AP-REP successfully...\n"); return SHISHI_OK; } /** * shishi_ap_rep_verify_der: * @ap: structure that holds information about AP exchange * @der: input array with DER encoded AP-REP. * @derlen: length of input array with DER encoded AP-REP. * * DER decode AP-REP and set it in AP exchange using * shishi_ap_rep_der_set() and verify it using shishi_ap_rep_verify(). * * Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an * error. **/ int shishi_ap_rep_verify_der (Shishi_ap * ap, char *der, size_t derlen) { int res; res = shishi_ap_rep_der_set (ap, der, derlen); if (res != SHISHI_OK) return res; res = shishi_ap_rep_verify (ap); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_ap_rep_verify_asn1: * @ap: structure that holds information about AP exchange * @aprep: input AP-REP. * * Set the AP-REP in the AP exchange using shishi_ap_rep_set() and * verify it using shishi_ap_rep_verify(). * * Return value: Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an * error. **/ int shishi_ap_rep_verify_asn1 (Shishi_ap * ap, Shishi_asn1 aprep) { int res; shishi_ap_rep_set (ap, aprep); res = shishi_ap_rep_verify (ap); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_ap_encapreppart: * @ap: structure that holds information about AP exchange * * Get ASN.1 EncAPRepPart structure from AP exchange. * * Return value: Returns the EncAPREPPart from the AP exchange, or * NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_ap_encapreppart (Shishi_ap * ap) { return ap->encapreppart; } /** * shishi_ap_encapreppart_set: * @ap: structure that holds information about AP exchange * @encapreppart: EncAPRepPart to store in AP. * * Set the EncAPRepPart in the AP exchange. **/ void shishi_ap_encapreppart_set (Shishi_ap * ap, Shishi_asn1 encapreppart) { if (ap->encapreppart) shishi_asn1_done (ap->handle, ap->encapreppart); ap->encapreppart = encapreppart; } #define APOPTION_RESERVED "reserved" #define APOPTION_USE_SESSION_KEY "use-session-key" #define APOPTION_MUTUAL_REQUIRED "mutual-required" #define APOPTION_UNKNOWN "unknown" /** * shishi_ap_option2string: * @option: enumerated AP-Option type, see Shishi_apoptions. * * Convert AP-Option type to AP-Option name string. Note that @option * must be just one of the AP-Option types, it cannot be an binary * ORed indicating several AP-Options. * * Return value: Returns static string with name of AP-Option that * must not be deallocated, or "unknown" if AP-Option was not understood. **/ const char * shishi_ap_option2string (Shishi_apoptions option) { const char *str; switch (option) { case SHISHI_APOPTIONS_RESERVED: str = APOPTION_RESERVED; break; case SHISHI_APOPTIONS_USE_SESSION_KEY: str = APOPTION_USE_SESSION_KEY; break; case SHISHI_APOPTIONS_MUTUAL_REQUIRED: str = APOPTION_MUTUAL_REQUIRED; break; default: str = APOPTION_UNKNOWN; break; } return str; } /** * shishi_ap_string2option: * @str: zero terminated character array with name of AP-Option, * e.g. "use-session-key". * * Convert AP-Option name to AP-Option type. * * Return value: Returns enumerated type member corresponding to AP-Option, * or 0 if string was not understood. **/ Shishi_apoptions shishi_ap_string2option (const char *str) { int option; if (strcasecmp (str, APOPTION_RESERVED) == 0) option = SHISHI_APOPTIONS_RESERVED; else if (strcasecmp (str, APOPTION_USE_SESSION_KEY) == 0) option = SHISHI_APOPTIONS_USE_SESSION_KEY; else if (strcasecmp (str, APOPTION_MUTUAL_REQUIRED) == 0) option = SHISHI_APOPTIONS_MUTUAL_REQUIRED; else option = strtol (str, (char **) NULL, 0); return option; } shishi-1.0.2/lib/kdcreq.c0000664000000000000000000011664412126660507012076 00000000000000/* kdcreq.c --- Key distribution (AS/TGS) request functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" #define SHISHI_KDCREQ_DEFAULT_PVNO "5" #define SHISHI_KDCREQ_DEFAULT_PVNO_LEN 0 #define SHISHI_AS_REQ_DEFAULT_MSG_TYPE "10" #define SHISHI_AS_REQ_DEFAULT_MSG_TYPE_LEN 0 #define SHISHI_TGS_REQ_DEFAULT_MSG_TYPE "12" #define SHISHI_TGS_REQ_DEFAULT_MSG_TYPE_LEN 0 #define SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS "\x00\x00\x00\x00" #define SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS_LEN 32 #define SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE "1" /* SHISHI_NT_PRINCIPAL */ #define SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE_LEN 0 static Shishi_asn1 _shishi_kdcreq (Shishi * handle, int as) { int res; Shishi_asn1 node; const char *servicebuf[3]; uint32_t nonce; if (as) node = shishi_asn1_asreq (handle); else node = shishi_asn1_tgsreq (handle); if (!node) return NULL; res = shishi_asn1_write (handle, node, "pvno", SHISHI_KDCREQ_DEFAULT_PVNO, SHISHI_KDCREQ_DEFAULT_PVNO_LEN); if (res != SHISHI_OK) goto error; if (as) res = shishi_asn1_write (handle, node, "msg-type", SHISHI_AS_REQ_DEFAULT_MSG_TYPE, SHISHI_AS_REQ_DEFAULT_MSG_TYPE_LEN); else res = shishi_asn1_write (handle, node, "msg-type", SHISHI_TGS_REQ_DEFAULT_MSG_TYPE, SHISHI_TGS_REQ_DEFAULT_MSG_TYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.kdc-options", SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS, SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS_LEN); if (res != SHISHI_OK) goto error; if (as) res = shishi_kdcreq_set_cname (handle, node, SHISHI_NT_PRINCIPAL, shishi_principal_default (handle)); else res = shishi_asn1_write (handle, node, "req-body.cname", NULL, 0); if (res != SHISHI_OK) goto error; res = shishi_kdcreq_set_realm (handle, node, shishi_realm_default (handle)); if (res != SHISHI_OK) goto error; servicebuf[0] = "krbtgt"; servicebuf[1] = shishi_realm_default (handle); servicebuf[2] = NULL; res = shishi_kdcreq_set_sname (handle, node, SHISHI_NT_PRINCIPAL, servicebuf); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.sname.name-type", SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE, SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.till", shishi_generalize_time (handle, time (NULL) + handle->ticketlife), 0); if (res != SHISHI_OK) goto error; shishi_randomize (handle, 0, &nonce, sizeof (nonce)); nonce &= 0x7FFFFFFF; /* XXX fix _libtasn1_convert_integer. */ res = shishi_kdcreq_nonce_set (handle, node, nonce); if (res != SHISHI_OK) goto error; res = shishi_kdcreq_set_etype (handle, node, handle->clientkdcetypes, handle->nclientkdcetypes); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.addresses", NULL, 0); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.enc-authorization-data", NULL, 0); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "req-body.additional-tickets", NULL, 0); if (res != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_asreq: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new AS-REQ, populated with some default * values. * * Return value: Returns the AS-REQ or NULL on failure. **/ Shishi_asn1 shishi_asreq (Shishi * handle) { return _shishi_kdcreq (handle, 1); } /** * shishi_tgsreq: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new TGS-REQ, populated with some default * values. * * Return value: Returns the TGS-REQ or NULL on failure. **/ Shishi_asn1 shishi_tgsreq (Shishi * handle) { return _shishi_kdcreq (handle, 0); } /** * shishi_kdcreq_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @kdcreq: KDC-REQ to print. * * Print ASCII armored DER encoding of KDC-REQ to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq) { return _shishi_print_armored_data (handle, fh, kdcreq, "KDC-REQ", NULL); } /** * shishi_kdcreq_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @kdcreq: KDC-REQ to save. * * Print DER encoding of KDC-REQ to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq) { return _shishi_save_data (handle, fh, kdcreq, "KDC-REQ"); } /** * shishi_kdcreq_to_file: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write KDC-REQ to file in specified TYPE. The file will be truncated * if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_to_file (Shishi * handle, Shishi_asn1 kdcreq, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing KDC-REQ to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing KDC-REQ in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_kdcreq_print (handle, fh, kdcreq); else res = shishi_kdcreq_save (handle, fh, kdcreq); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing KDC-REQ to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_kdcreq_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @kdcreq: output variable with newly allocated KDC-REQ. * * Read ASCII armored DER encoded KDC-REQ from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq) { return _shishi_kdcreq_input (handle, fh, kdcreq, 0); } /** * shishi_kdcreq_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @kdcreq: output variable with newly allocated KDC-REQ. * * Read DER encoded KDC-REQ from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq) { return _shishi_kdcreq_input (handle, fh, kdcreq, 1); } /** * shishi_kdcreq_from_file: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: output variable with newly allocated KDC-REQ. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read KDC-REQ from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_from_file (Shishi * handle, Shishi_asn1 * kdcreq, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading KDC-REQ from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading KDC-REQ in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_kdcreq_parse (handle, fh, kdcreq); else res = shishi_kdcreq_read (handle, fh, kdcreq); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading KDC-REQ from %s...done\n"), filename); return SHISHI_OK; } int shishi_kdcreq_nonce (Shishi * handle, Shishi_asn1 kdcreq, uint32_t * nonce) { int res; res = shishi_asn1_read_uint32 (handle, kdcreq, "req-body.nonce", nonce); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_nonce_set: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set client name field in. * @nonce: integer nonce to store in KDC-REQ. * * Store nonce number field in KDC-REQ. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_kdcreq_nonce_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t nonce) { int res; res = shishi_asn1_write_uint32 (handle, kdcreq, "req-body.nonce", nonce); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_set_cname: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set client name field in. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @principal: input array with principal name. * * Set the client name field in the KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_set_cname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char *principal) { int res; res = shishi_principal_set (handle, kdcreq, "req-body.cname", principal); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_client: * @handle: Shishi library handle create by shishi_init(). * @kdcreq: KDC-REQ variable to get client name from. * @client: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Represent client principal name in KDC-REQ as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @clientlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_client (Shishi * handle, Shishi_asn1 kdcreq, char **client, size_t * clientlen) { return shishi_principal_name (handle, kdcreq, "req-body.cname", client, clientlen); } /** * shishi_asreq_clientrealm: * @handle: Shishi library handle create by shishi_init(). * @asreq: AS-REQ variable to get client name and realm from. * @client: pointer to newly allocated zero terminated string containing * principal name and realm. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Convert cname and realm fields from AS-REQ to printable principal * name format. The string is allocate by this function, and it is * the responsibility of the caller to deallocate it. Note that the * output length @clientlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_asreq_clientrealm (Shishi * handle, Shishi_asn1 asreq, char **client, size_t * clientlen) { return shishi_principal_name_realm (handle, asreq, "req-body.cname", asreq, "req-body.realm", client, clientlen); } /** * shishi_kdcreq_realm: * @handle: Shishi library handle create by shishi_init(). * @kdcreq: KDC-REQ variable to get client name from. * @realm: pointer to newly allocated zero terminated string containing * realm. May be %NULL (to only populate @realmlen). * @realmlen: pointer to length of @realm on output, excluding terminating * zero. May be %NULL (to only populate @realmlen). * * Get realm field in KDC-REQ as zero-terminated string. The string * is allocate by this function, and it is the responsibility of the * caller to deallocate it. Note that the output length @realmlen * does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_realm (Shishi * handle, Shishi_asn1 kdcreq, char **realm, size_t * realmlen) { return shishi_asn1_read_optional (handle, kdcreq, "req-body.realm", realm, realmlen); } int shishi_kdcreq_realm_get (Shishi * handle, Shishi_asn1 kdcreq, char **realm, size_t * realmlen) { return shishi_asn1_read_optional (handle, kdcreq, "req-body.realm", realm, realmlen); } /** * shishi_kdcreq_set_realm: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set realm field in. * @realm: input array with name of realm. * * Set the realm field in the KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_set_realm (Shishi * handle, Shishi_asn1 kdcreq, const char *realm) { int res; res = shishi_asn1_write (handle, kdcreq, "req-body.realm", realm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_server: * @handle: Shishi library handle create by shishi_init(). * @kdcreq: KDC-REQ variable to get server name from. * @server: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @serverlen). * @serverlen: pointer to length of @server on output, excluding terminating * zero. May be %NULL (to only populate @server). * * Represent server principal name in KDC-REQ as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @serverlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_server (Shishi * handle, Shishi_asn1 kdcreq, char **server, size_t * serverlen) { return shishi_principal_name (handle, kdcreq, "req-body.sname", server, serverlen); } /** * shishi_kdcreq_set_sname: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set server name field in. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @sname: input array with principal name. * * Set the server name field in the KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_set_sname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char *sname[]) { int res; res = shishi_principal_name_set (handle, kdcreq, "req-body.sname", name_type, sname); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_kdcreq_set_server (Shishi * handle, Shishi_asn1 req, const char *server) { int res; res = shishi_principal_set (handle, req, "req-body.sname", server); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_kdcreq_set_realmserver (Shishi * handle, Shishi_asn1 req, char *realm, char *server) { int res; res = shishi_kdcreq_set_realm (handle, req, realm); if (res != SHISHI_OK) return res; res = shishi_kdcreq_set_server (handle, req, server); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_till: * @handle: Shishi library handle create by shishi_init(). * @kdcreq: KDC-REQ variable to get client name from. * @till: pointer to newly allocated zero terminated string containing * "till" field with generalized time. May be %NULL (to only * populate @realmlen). * @tilllen: pointer to length of @till on output, excluding * terminating zero. May be %NULL (to only populate @tilllen). * * Get "till" field (i.e. "endtime") in KDC-REQ, as zero-terminated * string. The string is typically 15 characters long. The string is * allocated by this function, and it is the responsibility of the * caller to deallocate it. Note that the output length @realmlen * does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_till (Shishi * handle, Shishi_asn1 kdcreq, char **till, size_t * tilllen) { return shishi_asn1_read (handle, kdcreq, "req-body.till", till, tilllen); } /** * shishi_kdcreq_tillc: * @handle: Shishi library handle create by shishi_init(). * @kdcreq: KDC-REQ variable to get till field from. * * Extract C time corresponding to the "till" field. * * Return value: Returns C time interpretation of the "till" field in * KDC-REQ. **/ time_t shishi_kdcreq_tillc (Shishi * handle, Shishi_asn1 kdcreq) { char *till; size_t tilllen; time_t t = (time_t) - 1; int res; res = shishi_kdcreq_till (handle, kdcreq, &till, &tilllen); if (res != SHISHI_OK) return t; if (tilllen == SHISHI_GENERALIZEDTIME_LENGTH + 1) /* XXX why +1 ? */ t = shishi_generalize_ctime (handle, till); free (till); return t; } /** * shishi_kdcreq_etype: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get etype field from. * @etype: output encryption type. * @netype: element number to return. * * Return the netype:th encryption type from KDC-REQ. The first etype * is number 1. * * Return value: Returns SHISHI_OK iff etype successful set. **/ int shishi_kdcreq_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype) { char *buf; int res; asprintf (&buf, "req-body.etype.?%d", netype); res = shishi_asn1_read_int32 (handle, kdcreq, buf, etype); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_set_etype: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set etype field in. * @etype: input array with encryption types. * @netype: number of elements in input array with encryption types. * * Set the list of supported or wanted encryption types in the * request. The list should be sorted in priority order. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_set_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype) { int res; char *buf; int i; res = shishi_asn1_write (handle, kdcreq, "req-body.etype", NULL, 0); if (res != SHISHI_OK) return res; for (i = 1; i <= netype; i++) { res = shishi_asn1_write (handle, kdcreq, "req-body.etype", "NEW", 1); if (res != SHISHI_OK) return res; asprintf (&buf, "req-body.etype.?%d", i); res = shishi_asn1_write_int32 (handle, kdcreq, buf, etype[i - 1]); free (buf); if (res != SHISHI_OK) return res; } return SHISHI_OK; } /** * shishi_kdcreq_options: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * @flags: pointer to output integer with flags. * * Extract KDC-Options from KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_options (Shishi * handle, Shishi_asn1 kdcreq, uint32_t * flags) { return shishi_asn1_read_bitstring (handle, kdcreq, "req-body.kdc-options", flags); } /** * shishi_kdcreq_forwardable_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option forwardable flag is set. * * The FORWARDABLE option indicates that the ticket to be issued is to * have its forwardable flag set. It may only be set on the initial * request, or in a subsequent request if the ticket-granting ticket * on which it is based is also forwardable. * * Return value: Returns non-0 iff forwardable flag is set in KDC-REQ. **/ int shishi_kdcreq_forwardable_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_FORWARDABLE; } /** * shishi_kdcreq_forwarded_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option forwarded flag is set. * * The FORWARDED option is only specified in a request to the * ticket-granting server and will only be honored if the * ticket-granting ticket in the request has its FORWARDABLE bit * set. This option indicates that this is a request for * forwarding. The address(es) of the host from which the resulting * ticket is to be valid are included in the addresses field of the * request. * * Return value: Returns non-0 iff forwarded flag is set in KDC-REQ. **/ int shishi_kdcreq_forwarded_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_FORWARDED; } /** * shishi_kdcreq_proxiable_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option proxiable flag is set. * * The PROXIABLE option indicates that the ticket to be issued is to * have its proxiable flag set. It may only be set on the initial * request, or in a subsequent request if the ticket-granting ticket * on which it is based is also proxiable. * * Return value: Returns non-0 iff proxiable flag is set in KDC-REQ. **/ int shishi_kdcreq_proxiable_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_PROXIABLE; } /** * shishi_kdcreq_proxy_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option proxy flag is set. * * The PROXY option indicates that this is a request for a proxy. This * option will only be honored if the ticket-granting ticket in the * request has its PROXIABLE bit set. The address(es) of the host * from which the resulting ticket is to be valid are included in the * addresses field of the request. * * Return value: Returns non-0 iff proxy flag is set in KDC-REQ. **/ int shishi_kdcreq_proxy_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_PROXY; } /** * shishi_kdcreq_allow_postdate_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option allow-postdate flag is set. * * The ALLOW-POSTDATE option indicates that the ticket to be issued is * to have its MAY-POSTDATE flag set. It may only be set on the * initial request, or in a subsequent request if the ticket-granting * ticket on which it is based also has its MAY-POSTDATE flag set. * * Return value: Returns non-0 iff allow-postdate flag is set in KDC-REQ. **/ int shishi_kdcreq_allow_postdate_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_ALLOW_POSTDATE; } /** * shishi_kdcreq_postdated_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option postdated flag is set. * * The POSTDATED option indicates that this is a request for a * postdated ticket. This option will only be honored if the * ticket-granting ticket on which it is based has its MAY-POSTDATE * flag set. The resulting ticket will also have its INVALID flag set, * and that flag may be reset by a subsequent request to the KDC after * the starttime in the ticket has been reached. * * Return value: Returns non-0 iff postdated flag is set in KDC-REQ. **/ int shishi_kdcreq_postdated_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_POSTDATED; } /** * shishi_kdcreq_renewable_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option renewable flag is set. * * The RENEWABLE option indicates that the ticket to be issued is to * have its RENEWABLE flag set. It may only be set on the initial * request, or when the ticket-granting ticket on which the request is * based is also renewable. If this option is requested, then the * rtime field in the request contains the desired absolute expiration * time for the ticket. * * Return value: Returns non-0 iff renewable flag is set in KDC-REQ. **/ int shishi_kdcreq_renewable_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_RENEWABLE; } /** * shishi_kdcreq_disable_transited_check_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option disable-transited-check flag is set. * * By default the KDC will check the transited field of a * ticket-granting-ticket against the policy of the local realm before * it will issue derivative tickets based on the ticket-granting * ticket. If this flag is set in the request, checking of the * transited field is disabled. Tickets issued without the performance * of this check will be noted by the reset (0) value of the * TRANSITED-POLICY-CHECKED flag, indicating to the application server * that the tranisted field must be checked locally. KDCs are * encouraged but not required to honor the DISABLE-TRANSITED-CHECK * option. * * This flag is new since RFC 1510 * * Return value: Returns non-0 iff disable-transited-check flag is set * in KDC-REQ. **/ int shishi_kdcreq_disable_transited_check_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_DISABLE_TRANSITED_CHECK; } /** * shishi_kdcreq_renewable_ok_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option renewable-ok flag is set. * * The RENEWABLE-OK option indicates that a renewable ticket will be * acceptable if a ticket with the requested life cannot otherwise be * provided. If a ticket with the requested life cannot be provided, * then a renewable ticket may be issued with a renew-till equal to * the requested endtime. The value of the renew-till field may still * be limited by local limits, or limits selected by the individual * principal or server. * * Return value: Returns non-0 iff renewable-ok flag is set in KDC-REQ. **/ int shishi_kdcreq_renewable_ok_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_RENEWABLE_OK; } /** * shishi_kdcreq_enc_tkt_in_skey_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option enc-tkt-in-skey flag is set. * * This option is used only by the ticket-granting service. The * ENC-TKT-IN-SKEY option indicates that the ticket for the end server * is to be encrypted in the session key from the additional * ticket-granting ticket provided. * * Return value: Returns non-0 iff enc-tkt-in-skey flag is set in KDC-REQ. **/ int shishi_kdcreq_enc_tkt_in_skey_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_ENC_TKT_IN_SKEY; } /** * shishi_kdcreq_renew_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option renew flag is set. * * This option is used only by the ticket-granting service. The RENEW * option indicates that the present request is for a renewal. The * ticket provided is encrypted in the secret key for the server on * which it is valid. This option will only be honored if the ticket * to be renewed has its RENEWABLE flag set and if the time in its * renew-till field has not passed. The ticket to be renewed is passed * in the padata field as part of the authentication header. * * Return value: Returns non-0 iff renew flag is set in KDC-REQ. **/ int shishi_kdcreq_renew_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_RENEW; } /** * shishi_kdcreq_validate_p: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to get kdc-options field from. * * Determine if KDC-Option validate flag is set. * * This option is used only by the ticket-granting service. The * VALIDATE option indicates that the request is to validate a * postdated ticket. It will only be honored if the ticket presented * is postdated, presently has its INVALID flag set, and would be * otherwise usable at this time. A ticket cannot be validated before * its starttime. The ticket presented for validation is encrypted in * the key of the server for which it is valid and is passed in the * padata field as part of the authentication header. * * Return value: Returns non-0 iff validate flag is set in KDC-REQ. **/ int shishi_kdcreq_validate_p (Shishi * handle, Shishi_asn1 kdcreq) { uint32_t options = 0; shishi_kdcreq_options (handle, kdcreq, &options); return options & SHISHI_KDCOPTIONS_VALIDATE; } /** * shishi_kdcreq_options_set: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set etype field in. * @options: integer with flags to store in KDC-REQ. * * Set options in KDC-REQ. Note that this reset any already existing * flags. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_options_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t options) { int res; res = shishi_asn1_write_bitstring (handle, kdcreq, "req-body.kdc-options", options); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_options_add: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ variable to set etype field in. * @option: integer with options to add in KDC-REQ. * * Add KDC-Option to KDC-REQ. This preserves all existing options. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_options_add (Shishi * handle, Shishi_asn1 kdcreq, uint32_t option) { uint32_t options; int res; res = shishi_kdcreq_options (handle, kdcreq, &options); if (res != SHISHI_OK) return res; options |= option; res = shishi_kdcreq_options_set (handle, kdcreq, options); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_clear_padata: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to remove PA-DATA from. * * Remove the padata field from KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_clear_padata (Shishi * handle, Shishi_asn1 kdcreq) { int res; res = shishi_asn1_write (handle, kdcreq, "padata", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_get_padata: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to get PA-DATA from. * @padatatype: type of PA-DATA, see Shishi_padata_type. * @out: output array with newly allocated PA-DATA value. * @outlen: size of output array with PA-DATA value. * * Get pre authentication data (PA-DATA) from KDC-REQ. Pre * authentication data is used to pass various information to KDC, * such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that * authenticates the user to get the ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_get_padata (Shishi * handle, Shishi_asn1 kdcreq, Shishi_padata_type padatatype, char **out, size_t * outlen) { char *format; int res; size_t i, n; res = shishi_asn1_number_of_elements (handle, kdcreq, "padata", &n); if (res != SHISHI_OK) return res; *out = NULL; *outlen = 0; for (i = 1; i <= n; i++) { int32_t patype; asprintf (&format, "padata.?%d.padata-type", i); res = shishi_asn1_read_int32 (handle, kdcreq, format, &patype); free (format); if (res != SHISHI_OK) return res; if (patype == (int32_t) padatatype) { asprintf (&format, "padata.?%d.padata-value", i); res = shishi_asn1_read (handle, kdcreq, format, out, outlen); free (format); if (res != SHISHI_OK) return res; break; } } return SHISHI_OK; } /** * shishi_kdcreq_get_padata_tgs: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to get PA-TGS-REQ from. * @apreq: Output variable with newly allocated AP-REQ. * * Extract TGS pre-authentication data from KDC-REQ. The data is an * AP-REQ that authenticates the request. This function call * shishi_kdcreq_get_padata() with a SHISHI_PA_TGS_REQ padatatype and * DER decode the result (if any). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_get_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * apreq) { char *der; size_t derlen; int rc; if (VERBOSE (handle)) printf ("Extracting AP-REQ from KDC-REQ...\n"); rc = shishi_kdcreq_get_padata (handle, kdcreq, SHISHI_PA_TGS_REQ, &der, &derlen); if (rc != SHISHI_OK) return rc; *apreq = shishi_der2asn1_apreq (handle, der, derlen); if (!*apreq) return SHISHI_ASN1_ERROR; if (VERBOSEASN1 (handle)) shishi_apreq_print (handle, stdout, *apreq); return SHISHI_OK; } /** * shishi_kdcreq_add_padata: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to add PA-DATA to. * @padatatype: type of PA-DATA, see Shishi_padata_type. * @data: input array with PA-DATA value. * @datalen: size of input array with PA-DATA value. * * Add new pre authentication data (PA-DATA) to KDC-REQ. This is used * to pass various information to KDC, such as in case of a * SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user * to get the ticket. (But also see shishi_kdcreq_add_padata_tgs() * which takes an AP-REQ directly.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_add_padata (Shishi * handle, Shishi_asn1 kdcreq, int padatatype, const char *data, size_t datalen) { char *format; int res; size_t i; res = shishi_asn1_write (handle, kdcreq, "padata", "NEW", 1); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, kdcreq, "padata", &i); if (res != SHISHI_OK) return res; asprintf (&format, "padata.?%d.padata-value", i); res = shishi_asn1_write (handle, kdcreq, format, data, datalen); free (format); if (res != SHISHI_OK) return res; asprintf (&format, "padata.?%d.padata-type", i); res = shishi_asn1_write_uint32 (handle, kdcreq, format, padatatype); free (format); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_kdcreq_add_padata_tgs: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to add PA-DATA to. * @apreq: AP-REQ to add as PA-DATA. * * Add TGS pre-authentication data to KDC-REQ. The data is an AP-REQ * that authenticates the request. This functions simply DER encodes * the AP-REQ and calls shishi_kdcreq_add_padata() with a * SHISHI_PA_TGS_REQ padatatype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_add_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 apreq) { int res; char *data; size_t datalen; res = shishi_asn1_to_der (handle, apreq, &data, &datalen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode AP-REQ: %s\n", shishi_strerror (res)); return res; } res = shishi_kdcreq_add_padata (handle, kdcreq, SHISHI_PA_TGS_REQ, data, datalen); free (data); if (res != SHISHI_OK) return res; return res; } /** * shishi_kdcreq_add_padata_preauth: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to add pre-authentication data to. * @key: Key used to encrypt pre-auth data. * * Add pre-authentication data to KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_kdcreq_add_padata_preauth (Shishi * handle, Shishi_asn1 kdcreq, Shishi_key * key) { char *der, *data; size_t derlen, datalen; Shishi_asn1 pa; struct timeval tv; int rc; Shishi_asn1 ed; pa = shishi_asn1_pa_enc_ts_enc (handle); if (!pa) return SHISHI_ASN1_ERROR; rc = gettimeofday (&tv, NULL); if (rc != 0) return SHISHI_GETTIMEOFDAY_ERROR; rc = shishi_asn1_write (handle, pa, "patimestamp", shishi_generalize_time (handle, tv.tv_sec), SHISHI_GENERALIZEDTIME_LENGTH); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write_integer (handle, pa, "pausec", tv.tv_usec); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_to_der (handle, pa, &der, &derlen); if (rc != SHISHI_OK) return rc; rc = shishi_encrypt (handle, key, SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP, der, derlen, &data, &datalen); free (der); if (rc != SHISHI_OK) return rc; ed = shishi_asn1_encrypteddata (handle); if (!ed) return SHISHI_ASN1_ERROR; rc = shishi_asn1_write_integer (handle, ed, "etype", shishi_key_type (key)); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, ed, "cipher", data, datalen); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, ed, "kvno", NULL, 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_to_der (handle, ed, &der, &derlen); free (data); if (rc != SHISHI_OK) return rc; rc = shishi_kdcreq_add_padata (handle, kdcreq, SHISHI_PA_ENC_TIMESTAMP, der, derlen); free (der); if (rc != SHISHI_OK) return rc; return rc; } int shishi_kdcreq_build (Shishi * handle, Shishi_asn1 kdcreq) { int res; size_t n; int msgtype; shishi_verbose (handle, "Building KDC-REQ..."); if (shishi_asn1_empty_p (handle, kdcreq, "req-body.rtime")) { res = shishi_asn1_write (handle, kdcreq, "req-body.rtime", NULL, 0); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not write rtime\n"); return res; } } if (shishi_asn1_empty_p (handle, kdcreq, "req-body.from")) { res = shishi_asn1_write (handle, kdcreq, "req-body.from", NULL, 0); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not write from\n"); return res; } } res = shishi_asn1_read_integer (handle, kdcreq, "msg-type", &msgtype); if (res != SHISHI_OK) return res; if (msgtype == SHISHI_MSGTYPE_AS_REQ) { res = shishi_asn1_number_of_elements (handle, kdcreq, "padata", &n); if (res == SHISHI_OK && n == 0) { res = shishi_kdcreq_clear_padata (handle, kdcreq); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not write padata\n"); return res; } } } return SHISHI_OK; } shishi-1.0.2/lib/utils.h0000664000000000000000000000215712126660507011763 00000000000000/* utils.h --- Auxilliary help prototypes. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ extern void _shishi_escapeprint (const char *str, int len); extern void _shishi_hexprint (const char *str, int len); extern void _shishi_binprint (const char *str, int len); extern void _shishi_bin7print (const char *str, int len); extern time_t xtime (time_t * t); shishi-1.0.2/lib/password.c0000664000000000000000000001163712126660507012463 00000000000000/* password.c --- Get passwords from user. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* XXX? zeroize password */ #include "internal.h" #include "getpass.h" #ifdef HAVE_LIBIDN # include #endif /** * shishi_prompt_password_callback_set: * @handle: shishi handle as allocated by shishi_init(). * @cb: function pointer to application password callback, a * #shishi_prompt_password_func type. * * Set a callback function that will be used by * shishi_prompt_password() to query the user for a password. The * function pointer can be retrieved using * shishi_prompt_password_callback_get(). * * The @cb function should follow the %shishi_prompt_password_func prototype: * * int prompt_password (Shishi * @handle, char **@s, * const char *@format, va_list @ap); * * If the function returns 0, the @s variable should contain a newly * allocated string with the password read from the user. **/ void shishi_prompt_password_callback_set (Shishi * handle, shishi_prompt_password_func cb) { handle->prompt_passwd = cb; } /** * shishi_prompt_password_callback_get: * @handle: shishi handle as allocated by shishi_init(). * * Get the application password prompt function callback as set by * shishi_prompt_password_callback_set(). * * Returns: Returns the callback, a #shishi_prompt_password_func type, * or %NULL. **/ shishi_prompt_password_func shishi_prompt_password_callback_get (Shishi * handle) { return handle->prompt_passwd; } /** * shishi_prompt_password: * @handle: shishi handle as allocated by shishi_init(). * @s: pointer to newly allocated output string with read password. * @format: printf(3) style format string. * @...: printf(3) style arguments. * * Format and print a prompt, and read a password from user. The * password is possibly converted (e.g., converted from Latin-1 to * UTF-8, or processed using Stringprep profile) following any * "stringprocess" keywords in configuration files. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_prompt_password (Shishi * handle, char **s, const char *format, ...) { char *p; va_list ap; if (handle->prompt_passwd) { int ret; va_start (ap, format); ret = handle->prompt_passwd (handle, s, format, ap); va_end (ap); return ret; } #ifdef HAVE_LIBIDN if (VERBOSE (handle)) { printf ("Libstringprep thinks your locale is `%s'.\n", stringprep_locale_charset ()); } #endif va_start (ap, format); vprintf (format, ap); fflush (stdout); va_end (ap); p = getpass (""); *s = xstrdup (p); printf ("\n"); if (VERBOSENOISE (handle)) { size_t i; printf ("Read password (length %d): ", strlen (*s)); for (i = 0; i < strlen (*s); i++) printf ("%02x ", (*s)[i] & 0xFF); printf ("\n"); } if (handle->stringprocess && strcasecmp (handle->stringprocess, "none") != 0) #ifdef HAVE_LIBIDN { if (strcasecmp (handle->stringprocess, "stringprep") == 0) p = stringprep_locale_to_utf8 (*s); else p = stringprep_convert (*s, handle->stringprocess, stringprep_locale_charset ()); if (p) { free (*s); *s = p; } else shishi_warn (handle, "Charset conversion of password failed"); if (VERBOSENOISE (handle)) { size_t i; printf ("Password converted to %s (length %d): ", strcasecmp (handle->stringprocess, "stringprep") == 0 ? "UTF-8" : handle->stringprocess, strlen (*s)); for (i = 0; i < strlen (*s); i++) printf ("%02x ", (*s)[i] & 0xFF); printf ("\n"); } if (strcasecmp (handle->stringprocess, "stringprep") == 0) { int rc; rc = stringprep_profile (*s, &p, "SASLprep", 0); if (rc == SHISHI_OK) { free (*s); *s = p; } else shishi_warn (handle, "Stringprep conversion of password failed"); if (VERBOSENOISE (handle)) { size_t i; printf ("Stringprep'ed password (length %d): ", strlen (*s)); for (i = 0; i < strlen (*s); i++) printf ("%02x ", (*s)[i] & 0xFF); printf ("\n"); } } } #else shishi_warn (handle, "Password string processing (%s) disabled", handle->stringprocess); #endif return SHISHI_OK; } shishi-1.0.2/lib/kerberos5.c0000644000000000000000000003315212126664015012512 00000000000000#if HAVE_CONFIG_H # include "config.h" #endif #include const ASN1_ARRAY_TYPE shishi_asn1_tab[] = { { "KerberosV5Spec2", 536872976, NULL }, { NULL, 1610612748, NULL }, { "iso", 1073741825, "1"}, { "identified-organization", 1073741825, "3"}, { "dod", 1073741825, "6"}, { "internet", 1073741825, "1"}, { "security", 1073741825, "5"}, { "kerberosV5", 1073741825, "2"}, { "modules", 1073741825, "4"}, { "krb5spec2", 1, "2"}, { "id-krb5", 1879048204, NULL }, { "iso", 1073741825, "1"}, { "identified-organization", 1073741825, "3"}, { "dod", 1073741825, "6"}, { "internet", 1073741825, "1"}, { "security", 1073741825, "5"}, { "kerberosV5", 1, "2"}, { "Int32", 1073741827, NULL }, { "UInt32", 1611137027, NULL }, { "0", 10, "4294967295"}, { "Microseconds", 1611137027, NULL }, { "0", 10, "999999"}, { "KerberosString", 1073741851, NULL }, { "Realm", 1073741826, "KerberosString"}, { "PrincipalName", 1610612741, NULL }, { "name-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "name-string", 536879115, NULL }, { NULL, 1073743880, "1"}, { NULL, 2, "KerberosString"}, { "KerberosTime", 1082130449, NULL }, { "HostAddress", 1610612741, NULL }, { "addr-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "address", 536879111, NULL }, { NULL, 2056, "1"}, { "HostAddresses", 1610612747, NULL }, { NULL, 2, "HostAddress"}, { "AuthorizationData", 1610612747, NULL }, { NULL, 536870917, NULL }, { "ad-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "ad-data", 536879111, NULL }, { NULL, 2056, "1"}, { "PA-DATA", 1610612741, NULL }, { "padata-type", 1610620930, "Int32"}, { NULL, 2056, "1"}, { "padata-value", 536879111, NULL }, { NULL, 2056, "2"}, { "KerberosFlags", 1075838982, NULL }, { "EncryptedData", 1610612741, NULL }, { "etype", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "kvno", 1610637314, "UInt32"}, { NULL, 2056, "1"}, { "cipher", 536879111, NULL }, { NULL, 2056, "2"}, { "EncryptionKey", 1610612741, NULL }, { "keytype", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "keyvalue", 536879111, NULL }, { NULL, 2056, "1"}, { "Checksum", 1610612741, NULL }, { "cksumtype", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "checksum", 536879111, NULL }, { NULL, 2056, "1"}, { "Ticket", 1610620933, NULL }, { NULL, 1073744904, "1"}, { "tkt-vno", 1610620931, NULL }, { NULL, 2056, "0"}, { "realm", 1610620930, "Realm"}, { NULL, 2056, "1"}, { "sname", 1610620930, "PrincipalName"}, { NULL, 2056, "2"}, { "enc-part", 536879106, "EncryptedData"}, { NULL, 2056, "3"}, { "EncTicketPart", 1610620933, NULL }, { NULL, 1073744904, "3"}, { "flags", 1610620930, "TicketFlags"}, { NULL, 2056, "0"}, { "key", 1610620930, "EncryptionKey"}, { NULL, 2056, "1"}, { "crealm", 1610620930, "Realm"}, { NULL, 2056, "2"}, { "cname", 1610620930, "PrincipalName"}, { NULL, 2056, "3"}, { "transited", 1610620930, "TransitedEncoding"}, { NULL, 2056, "4"}, { "authtime", 1610620930, "KerberosTime"}, { NULL, 2056, "5"}, { "starttime", 1610637314, "KerberosTime"}, { NULL, 2056, "6"}, { "endtime", 1610620930, "KerberosTime"}, { NULL, 2056, "7"}, { "renew-till", 1610637314, "KerberosTime"}, { NULL, 2056, "8"}, { "caddr", 1610637314, "HostAddresses"}, { NULL, 2056, "9"}, { "authorization-data", 536895490, "AuthorizationData"}, { NULL, 2056, "10"}, { "TransitedEncoding", 1610612741, NULL }, { "tr-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "contents", 536879111, NULL }, { NULL, 2056, "1"}, { "TicketFlags", 1073741826, "KerberosFlags"}, { "AS-REQ", 1610620930, "KDC-REQ"}, { NULL, 3080, "10"}, { "TGS-REQ", 1610620930, "KDC-REQ"}, { NULL, 3080, "12"}, { "KDC-REQ", 1610612741, NULL }, { "pvno", 1610620931, NULL }, { NULL, 2056, "1"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "2"}, { "padata", 1610637323, NULL }, { NULL, 1073743880, "3"}, { NULL, 2, "PA-DATA"}, { "req-body", 536879106, "KDC-REQ-BODY"}, { NULL, 2056, "4"}, { "KDC-REQ-BODY", 1610612741, NULL }, { "kdc-options", 1610620930, "KDCOptions"}, { NULL, 2056, "0"}, { "cname", 1610637314, "PrincipalName"}, { NULL, 2056, "1"}, { "realm", 1610620930, "Realm"}, { NULL, 2056, "2"}, { "sname", 1610637314, "PrincipalName"}, { NULL, 2056, "3"}, { "from", 1610637314, "KerberosTime"}, { NULL, 2056, "4"}, { "till", 1610620930, "KerberosTime"}, { NULL, 2056, "5"}, { "rtime", 1610637314, "KerberosTime"}, { NULL, 2056, "6"}, { "nonce", 1610620930, "UInt32"}, { NULL, 2056, "7"}, { "etype", 1610620939, NULL }, { NULL, 1073743880, "8"}, { NULL, 2, "Int32"}, { "addresses", 1610637314, "HostAddresses"}, { NULL, 2056, "9"}, { "enc-authorization-data", 1610637314, "EncryptedData"}, { NULL, 2056, "10"}, { "additional-tickets", 536895499, NULL }, { NULL, 1073743880, "11"}, { NULL, 2, "Ticket"}, { "KDCOptions", 1073741826, "KerberosFlags"}, { "AS-REP", 1610620930, "KDC-REP"}, { NULL, 3080, "11"}, { "TGS-REP", 1610620930, "KDC-REP"}, { NULL, 3080, "13"}, { "KDC-REP", 1610612741, NULL }, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "padata", 1610637323, NULL }, { NULL, 1073743880, "2"}, { NULL, 2, "PA-DATA"}, { "crealm", 1610620930, "Realm"}, { NULL, 2056, "3"}, { "cname", 1610620930, "PrincipalName"}, { NULL, 2056, "4"}, { "ticket", 1610620930, "Ticket"}, { NULL, 2056, "5"}, { "enc-part", 536879106, "EncryptedData"}, { NULL, 2056, "6"}, { "EncASRepPart", 1610620930, "EncKDCRepPart"}, { NULL, 3080, "25"}, { "EncTGSRepPart", 1610620930, "EncKDCRepPart"}, { NULL, 3080, "26"}, { "EncKDCRepPart", 1610612741, NULL }, { "key", 1610620930, "EncryptionKey"}, { NULL, 2056, "0"}, { "last-req", 1610620930, "LastReq"}, { NULL, 2056, "1"}, { "nonce", 1610620930, "UInt32"}, { NULL, 2056, "2"}, { "key-expiration", 1610637314, "KerberosTime"}, { NULL, 2056, "3"}, { "flags", 1610620930, "TicketFlags"}, { NULL, 2056, "4"}, { "authtime", 1610620930, "KerberosTime"}, { NULL, 2056, "5"}, { "starttime", 1610637314, "KerberosTime"}, { NULL, 2056, "6"}, { "endtime", 1610620930, "KerberosTime"}, { NULL, 2056, "7"}, { "renew-till", 1610637314, "KerberosTime"}, { NULL, 2056, "8"}, { "srealm", 1610620930, "Realm"}, { NULL, 2056, "9"}, { "sname", 1610620930, "PrincipalName"}, { NULL, 2056, "10"}, { "caddr", 536895490, "HostAddresses"}, { NULL, 2056, "11"}, { "LastReq", 1610612747, NULL }, { NULL, 536870917, NULL }, { "lr-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "lr-value", 536879106, "KerberosTime"}, { NULL, 2056, "1"}, { "AP-REQ", 1610620933, NULL }, { NULL, 1073744904, "14"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "ap-options", 1610620930, "APOptions"}, { NULL, 2056, "2"}, { "ticket", 1610620930, "Ticket"}, { NULL, 2056, "3"}, { "authenticator", 536879106, "EncryptedData"}, { NULL, 2056, "4"}, { "APOptions", 1073741826, "KerberosFlags"}, { "Authenticator", 1610620933, NULL }, { NULL, 1073744904, "2"}, { "authenticator-vno", 1610620931, NULL }, { NULL, 2056, "0"}, { "crealm", 1610620930, "Realm"}, { NULL, 2056, "1"}, { "cname", 1610620930, "PrincipalName"}, { NULL, 2056, "2"}, { "cksum", 1610637314, "Checksum"}, { NULL, 2056, "3"}, { "cusec", 1610620930, "Microseconds"}, { NULL, 2056, "4"}, { "ctime", 1610620930, "KerberosTime"}, { NULL, 2056, "5"}, { "subkey", 1610637314, "EncryptionKey"}, { NULL, 2056, "6"}, { "seq-number", 1610637314, "UInt32"}, { NULL, 2056, "7"}, { "authorization-data", 536895490, "AuthorizationData"}, { NULL, 2056, "8"}, { "AP-REP", 1610620933, NULL }, { NULL, 1073744904, "15"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "enc-part", 536879106, "EncryptedData"}, { NULL, 2056, "2"}, { "EncAPRepPart", 1610620933, NULL }, { NULL, 1073744904, "27"}, { "ctime", 1610620930, "KerberosTime"}, { NULL, 2056, "0"}, { "cusec", 1610620930, "Microseconds"}, { NULL, 2056, "1"}, { "subkey", 1610637314, "EncryptionKey"}, { NULL, 2056, "2"}, { "seq-number", 536895490, "UInt32"}, { NULL, 2056, "3"}, { "KRB-SAFE", 1610620933, NULL }, { NULL, 1073744904, "20"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "safe-body", 1610620930, "KRB-SAFE-BODY"}, { NULL, 2056, "2"}, { "cksum", 536879106, "Checksum"}, { NULL, 2056, "3"}, { "KRB-SAFE-BODY", 1610612741, NULL }, { "user-data", 1610620935, NULL }, { NULL, 2056, "0"}, { "timestamp", 1610637314, "KerberosTime"}, { NULL, 2056, "1"}, { "usec", 1610637314, "Microseconds"}, { NULL, 2056, "2"}, { "seq-number", 1610637314, "UInt32"}, { NULL, 2056, "3"}, { "s-address", 1610620930, "HostAddress"}, { NULL, 2056, "4"}, { "r-address", 536895490, "HostAddress"}, { NULL, 2056, "5"}, { "KRB-PRIV", 1610620933, NULL }, { NULL, 1073744904, "21"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "enc-part", 536879106, "EncryptedData"}, { NULL, 2056, "3"}, { "EncKrbPrivPart", 1610620933, NULL }, { NULL, 1073744904, "28"}, { "user-data", 1610620935, NULL }, { NULL, 2056, "0"}, { "timestamp", 1610637314, "KerberosTime"}, { NULL, 2056, "1"}, { "usec", 1610637314, "Microseconds"}, { NULL, 2056, "2"}, { "seq-number", 1610637314, "UInt32"}, { NULL, 2056, "3"}, { "s-address", 1610620930, "HostAddress"}, { NULL, 2056, "4"}, { "r-address", 536895490, "HostAddress"}, { NULL, 2056, "5"}, { "KRB-CRED", 1610620933, NULL }, { NULL, 1073744904, "22"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "tickets", 1610620939, NULL }, { NULL, 1073743880, "2"}, { NULL, 2, "Ticket"}, { "enc-part", 536879106, "EncryptedData"}, { NULL, 2056, "3"}, { "EncKrbCredPart", 1610620933, NULL }, { NULL, 1073744904, "29"}, { "ticket-info", 1610620939, NULL }, { NULL, 1073743880, "0"}, { NULL, 2, "KrbCredInfo"}, { "nonce", 1610637314, "UInt32"}, { NULL, 2056, "1"}, { "timestamp", 1610637314, "KerberosTime"}, { NULL, 2056, "2"}, { "usec", 1610637314, "Microseconds"}, { NULL, 2056, "3"}, { "s-address", 1610637314, "HostAddress"}, { NULL, 2056, "4"}, { "r-address", 536895490, "HostAddress"}, { NULL, 2056, "5"}, { "KrbCredInfo", 1610612741, NULL }, { "key", 1610620930, "EncryptionKey"}, { NULL, 2056, "0"}, { "prealm", 1610637314, "Realm"}, { NULL, 2056, "1"}, { "pname", 1610637314, "PrincipalName"}, { NULL, 2056, "2"}, { "flags", 1610637314, "TicketFlags"}, { NULL, 2056, "3"}, { "authtime", 1610637314, "KerberosTime"}, { NULL, 2056, "4"}, { "starttime", 1610637314, "KerberosTime"}, { NULL, 2056, "5"}, { "endtime", 1610637314, "KerberosTime"}, { NULL, 2056, "6"}, { "renew-till", 1610637314, "KerberosTime"}, { NULL, 2056, "7"}, { "srealm", 1610637314, "Realm"}, { NULL, 2056, "8"}, { "sname", 1610637314, "PrincipalName"}, { NULL, 2056, "9"}, { "caddr", 536895490, "HostAddresses"}, { NULL, 2056, "10"}, { "KRB-ERROR", 1610620933, NULL }, { NULL, 1073744904, "30"}, { "pvno", 1610620931, NULL }, { NULL, 2056, "0"}, { "msg-type", 1610620931, NULL }, { NULL, 2056, "1"}, { "ctime", 1610637314, "KerberosTime"}, { NULL, 2056, "2"}, { "cusec", 1610637314, "Microseconds"}, { NULL, 2056, "3"}, { "stime", 1610620930, "KerberosTime"}, { NULL, 2056, "4"}, { "susec", 1610620930, "Microseconds"}, { NULL, 2056, "5"}, { "error-code", 1610620930, "Int32"}, { NULL, 2056, "6"}, { "crealm", 1610637314, "Realm"}, { NULL, 2056, "7"}, { "cname", 1610637314, "PrincipalName"}, { NULL, 2056, "8"}, { "realm", 1610620930, "Realm"}, { NULL, 2056, "9"}, { "sname", 1610620930, "PrincipalName"}, { NULL, 2056, "10"}, { "e-text", 1610637314, "KerberosString"}, { NULL, 2056, "11"}, { "e-data", 536895495, NULL }, { NULL, 2056, "12"}, { "METHOD-DATA", 1610612747, NULL }, { NULL, 2, "PA-DATA"}, { "TYPED-DATA", 1612709899, NULL }, { "MAX", 1074266122, "1"}, { NULL, 536870917, NULL }, { "data-type", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "data-value", 536895495, NULL }, { NULL, 2056, "1"}, { "PA-ENC-TIMESTAMP", 1073741826, "EncryptedData"}, { "PA-ENC-TS-ENC", 1610612741, NULL }, { "patimestamp", 1610620930, "KerberosTime"}, { NULL, 2056, "0"}, { "pausec", 536895490, "Microseconds"}, { NULL, 2056, "1"}, { "ETYPE-INFO-ENTRY", 1610612741, NULL }, { "etype", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "salt", 536895495, NULL }, { NULL, 2056, "1"}, { "ETYPE-INFO", 1610612747, NULL }, { NULL, 2, "ETYPE-INFO-ENTRY"}, { "ETYPE-INFO2-ENTRY", 1610612741, NULL }, { "etype", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "salt", 1610637314, "KerberosString"}, { NULL, 2056, "1"}, { "s2kparams", 536895495, NULL }, { NULL, 2056, "2"}, { "ETYPE-INFO2", 1612709899, NULL }, { "MAX", 1074266122, "1"}, { NULL, 2, "ETYPE-INFO2-ENTRY"}, { "AD-IF-RELEVANT", 1073741826, "AuthorizationData"}, { "AD-KDCIssued", 1610612741, NULL }, { "ad-checksum", 1610620930, "Checksum"}, { NULL, 2056, "0"}, { "i-realm", 1610637314, "Realm"}, { NULL, 2056, "1"}, { "i-sname", 1610637314, "PrincipalName"}, { NULL, 2056, "2"}, { "elements", 536879106, "AuthorizationData"}, { NULL, 2056, "3"}, { "AD-AND-OR", 1610612741, NULL }, { "condition-count", 1610620930, "Int32"}, { NULL, 2056, "0"}, { "elements", 536879106, "AuthorizationData"}, { NULL, 2056, "1"}, { "AD-MANDATORY-FOR-KDC", 2, "AuthorizationData"}, { NULL, 0, NULL } }; shishi-1.0.2/lib/safe.c0000664000000000000000000003700012126660507011527 00000000000000/* safe.c --- Application data integrity protection. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" struct Shishi_safe { Shishi *handle; Shishi_key *key; Shishi_asn1 safe; unsigned long seqnumber; }; /** * shishi_safe: * @handle: shishi handle as allocated by shishi_init(). * @safe: pointer to new structure that holds information about SAFE exchange * * Create a new SAFE exchange. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe (Shishi * handle, Shishi_safe ** safe) { Shishi_safe *lsafe; struct timeval tv; char *usec; int rc; *safe = xcalloc (1, sizeof (**safe)); lsafe = *safe; lsafe->handle = handle; rc = shishi_key (handle, &lsafe->key); if (rc != SHISHI_OK) return rc; lsafe->safe = shishi_asn1_krbsafe (handle); if (lsafe->safe == NULL) return SHISHI_ASN1_ERROR; rc = shishi_asn1_write (handle, lsafe->safe, "pvno", "5", 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "msg-type", "20", 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.seq-number", NULL, 0); if (rc != SHISHI_OK) return rc; rc = gettimeofday (&tv, NULL); if (rc != 0) return SHISHI_GETTIMEOFDAY_ERROR; asprintf (&usec, "%ld", tv.tv_usec % 1000000); rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.usec", usec, 0); free (usec); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.timestamp", shishi_generalize_time (handle, time (NULL)), 0); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.s-address.addr-type", "3", 0); /* directional */ if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.s-address.address", "\x00\x00\x00\x00", 4); /* sender */ if (rc != SHISHI_OK) return rc; rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.r-address", NULL, 0); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_safe_done: * @safe: structure that holds information about SAFE exchange * * Deallocate resources associated with SAFE exchange. This should be * called by the application when it no longer need to utilize the * SAFE exchange handle. **/ void shishi_safe_done (Shishi_safe * safe) { shishi_asn1_done (safe->handle, safe->safe); shishi_key_done (safe->key); free (safe); } /** * shishi_safe_key: * @safe: structure that holds information about SAFE exchange * * Get key structured from SAFE exchange. * * Return value: Returns the key used in the SAFE exchange, or NULL if * not yet set or an error occured. **/ Shishi_key * shishi_safe_key (Shishi_safe * safe) { return safe->key; } /** * shishi_safe_key_set: * @safe: structure that holds information about SAFE exchange * @key: key to store in SAFE. * * Set the Key in the SAFE exchange. **/ void shishi_safe_key_set (Shishi_safe * safe, Shishi_key * key) { shishi_key_copy (safe->key, key); } /** * shishi_safe_safe: * @safe: structure that holds information about SAFE exchange * * Get ASN.1 SAFE structured from SAFE exchange. * * Return value: Returns the ASN.1 safe in the SAFE exchange, or NULL if * not yet set or an error occured. **/ Shishi_asn1 shishi_safe_safe (Shishi_safe * safe) { return safe->safe; } /** * shishi_safe_safe_set: * @safe: structure that holds information about SAFE exchange * @asn1safe: KRB-SAFE to store in SAFE exchange. * * Set the KRB-SAFE in the SAFE exchange. **/ void shishi_safe_safe_set (Shishi_safe * safe, Shishi_asn1 asn1safe) { if (safe->safe) shishi_asn1_done (safe->handle, safe->safe); safe->safe = asn1safe; } /** * shishi_safe_safe_der: * @safe: safe as allocated by shishi_safe(). * @out: output array with newly allocated DER encoding of SAFE. * @outlen: length of output array with DER encoding of SAFE. * * DER encode SAFE structure. Typically shishi_safe_build() is used * to build the SAFE structure first. @out is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_safe_der (Shishi_safe * safe, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (safe->handle, safe->safe, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_safe_safe_der_set: * @safe: safe as allocated by shishi_safe(). * @der: input array with DER encoded KRB-SAFE. * @derlen: length of input array with DER encoded KRB-SAFE. * * DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the * KRB-SAFE in the SAFE exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_safe_safe_der_set (Shishi_safe * safe, char *der, size_t derlen) { Shishi_asn1 asn1safe; asn1safe = shishi_der2asn1_krbsafe (safe->handle, der, derlen); if (asn1safe == NULL) return SHISHI_ASN1_ERROR; shishi_safe_safe_set (safe, asn1safe); return SHISHI_OK; } /** * shishi_safe_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @safe: SAFE to print. * * Print ASCII armored DER encoding of SAFE to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_print (Shishi * handle, FILE * fh, Shishi_asn1 safe) { return _shishi_print_armored_data (handle, fh, safe, "KRB-SAFE", NULL); } /** * shishi_safe_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @safe: SAFE to save. * * Save DER encoding of SAFE to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_save (Shishi * handle, FILE * fh, Shishi_asn1 safe) { return _shishi_save_data (handle, fh, safe, "SAFE"); } /** * shishi_safe_to_file: * @handle: shishi handle as allocated by shishi_init(). * @safe: SAFE to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write SAFE to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_to_file (Shishi * handle, Shishi_asn1 safe, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing SAFE to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing SAFE in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_safe_print (handle, fh, safe); else res = shishi_safe_save (handle, fh, safe); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing SAFE to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_safe_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @safe: output variable with newly allocated SAFE. * * Read ASCII armored DER encoded SAFE from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_parse (Shishi * handle, FILE * fh, Shishi_asn1 * safe) { return _shishi_safe_input (handle, fh, safe, 0); } /** * shishi_safe_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @safe: output variable with newly allocated SAFE. * * Read DER encoded SAFE from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_read (Shishi * handle, FILE * fh, Shishi_asn1 * safe) { return _shishi_safe_input (handle, fh, safe, 1); } /** * shishi_safe_from_file: * @handle: shishi handle as allocated by shishi_init(). * @safe: output variable with newly allocated SAFE. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read SAFE from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_from_file (Shishi * handle, Shishi_asn1 * safe, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading SAFE from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading SAFE in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_safe_parse (handle, fh, safe); else res = shishi_safe_read (handle, fh, safe); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading SAFE from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_safe_cksum: * @handle: shishi handle as allocated by shishi_init(). * @safe: safe as allocated by shishi_safe(). * @cksumtype: output checksum type. * @cksum: output array with newly allocated checksum data from SAFE. * @cksumlen: output size of output checksum data buffer. * * Read checksum value from KRB-SAFE. @cksum is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_cksum (Shishi * handle, Shishi_asn1 safe, int32_t * cksumtype, char **cksum, size_t * cksumlen) { int res; res = shishi_asn1_read_int32 (handle, safe, "cksum.cksumtype", cksumtype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, safe, "cksum.checksum", cksum, cksumlen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_safe_set_cksum: * @handle: shishi handle as allocated by shishi_init(). * @safe: safe as allocated by shishi_safe(). * @cksumtype: input checksum type to store in SAFE. * @cksum: input checksum data to store in SAFE. * @cksumlen: size of input checksum data to store in SAFE. * * Store checksum value in SAFE. A checksum is usually created by * calling shishi_checksum() on some application specific data using * the key from the ticket that is being used. To save time, you may * want to use shishi_safe_build() instead, which calculates the * checksum and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_set_cksum (Shishi * handle, Shishi_asn1 safe, int32_t cksumtype, const char *cksum, size_t cksumlen) { int res; res = shishi_asn1_write_int32 (handle, safe, "cksum.cksumtype", cksumtype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, safe, "cksum.checksum", cksum, cksumlen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_safe_user_data: * @handle: shishi handle as allocated by shishi_init(). * @safe: safe as allocated by shishi_safe(). * @userdata: output array with newly allocated user data from KRB-SAFE. * @userdatalen: output size of output user data buffer. * * Read user data value from KRB-SAFE. @userdata is allocated by this * function, and it is the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_user_data (Shishi * handle, Shishi_asn1 safe, char **userdata, size_t * userdatalen) { int res; res = shishi_asn1_read (handle, safe, "safe-body.user-data", userdata, userdatalen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_safe_set_user_data: * @handle: shishi handle as allocated by shishi_init(). * @safe: safe as allocated by shishi_safe(). * @userdata: input user application to store in SAFE. * @userdatalen: size of input user application to store in SAFE. * * Set the application data in SAFE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_set_user_data (Shishi * handle, Shishi_asn1 safe, const char *userdata, size_t userdatalen) { int res; res = shishi_asn1_write (handle, safe, "safe-body.user-data", userdata, userdatalen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_safe_build: * @safe: safe as allocated by shishi_safe(). * @key: key for session, used to compute checksum. * * Build checksum and set it in KRB-SAFE. Note that this follows RFC * 1510bis and is incompatible with RFC 1510, although presumably few * implementations use the RFC1510 algorithm. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_safe_build (Shishi_safe * safe, Shishi_key * key) { int rc; char *buffer; size_t buflen; char *cksum; size_t cksumlen; int cksumtype = shishi_cipher_defaultcksumtype (shishi_key_type (key)); rc = shishi_safe_set_cksum (safe->handle, safe->safe, 0, "", 0); if (rc != SHISHI_OK) return rc; rc = shishi_safe_safe_der (safe, &buffer, &buflen); if (rc != SHISHI_OK) return rc; /* XXX check if keytype/cksumtype is suitable for SAFE */ if (VERBOSEASN1 (safe->handle)) shishi_key_print (safe->handle, stdout, key); rc = shishi_checksum (safe->handle, key, SHISHI_KEYUSAGE_KRB_SAFE, cksumtype, buffer, buflen, &cksum, &cksumlen); free (buffer); if (rc != SHISHI_OK) return rc; rc = shishi_safe_set_cksum (safe->handle, safe->safe, cksumtype, cksum, cksumlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_safe_verify: * @safe: safe as allocated by shishi_safe(). * @key: key for session, used to verify checksum. * * Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis * and is incompatible with RFC 1510, although presumably few * implementations use the RFC1510 algorithm. * * Return value: Returns SHISHI_OK iff successful, * SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or * SHISHI_SAFE_VERIFY_FAILED if the actual verification failed. **/ int shishi_safe_verify (Shishi_safe * safe, Shishi_key * key) { char *cksum = NULL; size_t cksumlen; int cksumtype; char *safeder = NULL; size_t safederlen; int rc; rc = shishi_safe_cksum (safe->handle, safe->safe, &cksumtype, &cksum, &cksumlen); if (rc != SHISHI_OK) goto done; rc = shishi_safe_set_cksum (safe->handle, safe->safe, 0, "", 0); if (rc != SHISHI_OK) goto done; rc = shishi_safe_safe_der (safe, &safeder, &safederlen); if (rc != SHISHI_OK) goto done; rc = shishi_verify (safe->handle, key, SHISHI_KEYUSAGE_KRB_SAFE, cksumtype, safeder, safederlen, cksum, cksumlen); if (rc != SHISHI_OK) goto done; rc = SHISHI_OK; done: free (cksum); free (safeder); return rc; } shishi-1.0.2/lib/starttls.c0000664000000000000000000002474512126660507012505 00000000000000/* starttls.c --- Network I/O functions for Shishi over TLS. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include #include "starttls.h" /* Initialize TLS subsystem. Typically invoked by shishi_init. */ int _shishi_tls_init (Shishi * handle) { int rc; rc = gnutls_global_init (); if (rc != GNUTLS_E_SUCCESS) { shishi_warn (handle, "TLS initialization failed: %s", gnutls_strerror (rc)); return SHISHI_CRYPTO_INTERNAL_ERROR; } return SHISHI_OK; } /* Deinitialize TLS subsystem. Typically invoked by shishi_done. */ int _shishi_tls_done (Shishi * handle) { /* XXX call gnutls_global_deinit here. But what if application uses tls? what if more than one shishi handle is allocated? */ return SHISHI_OK; } /* * Alternative approach: First send KDC-REQ in clear with PA-STARTTLS * preauth data, and have server respond with something saying it is * ready to go on (what should that packet look like??), and then * start tls on that session. If server doesn't support PA-STARTTLS, * it will simply complain. For udp we shouldn't do anything at all. * * Simpler: Use leading reserved bit in TCP length field to mean * STARTTLS. (Probably better to have it mean that a new octet is * present, and that a 0 in that field means STARTTLS, and all other * fields are reserved, for future extensions.) Yup, see complete * writeup in manual. * * Also need to add code to map client certificate X.509 into pre * authenticated principal? * * Derive EncKDCRepPart key from TLS PRF? Hm. * * The code currently implements rfc5021.txt and * draft-josefsson-kerberos5-starttls-02.txt. */ #define STARTTLS_CLIENT_REQUEST "\x80\x00\x00\x01" #define STARTTLS_SERVER_ACCEPT "\x00\x00\x00\x00" #define STARTTLS_LEN 4 #define C2I(buf) ((buf[3] & 0xFF) | \ ((buf[2] & 0xFF) << 8) | \ ((buf[1] & 0xFF) << 16) | \ ((buf[0] & 0xFF) << 24)) /* Negotiate TLS and send and receive packets on an open socket. */ static int _shishi_sendrecv_tls1 (Shishi * handle, int sockfd, gnutls_session session, const char *indata, size_t inlen, char **outdata, size_t * outlen, size_t timeout, bool have_cas) { int ret; ssize_t bytes_sent, bytes_read; char extbuf[STARTTLS_LEN + 1]; static size_t session_data_size = 0; static void *session_data = NULL; char tmpbuf[4]; unsigned int status; bytes_sent = write (sockfd, STARTTLS_CLIENT_REQUEST, STARTTLS_LEN); if (bytes_sent != STARTTLS_LEN) return SHISHI_SENDTO_ERROR; bytes_read = read (sockfd, extbuf, sizeof (extbuf)); if (bytes_read != STARTTLS_LEN || memcmp (extbuf, STARTTLS_SERVER_ACCEPT, STARTTLS_LEN) != 0) return SHISHI_RECVFROM_ERROR; gnutls_transport_set_ptr (session, (gnutls_transport_ptr) (unsigned long) sockfd); if (session_data_size > 0) gnutls_session_set_data (session, session_data, session_data_size); ret = gnutls_handshake (session); if (ret < 0) { shishi_error_printf (handle, "TLS handshake failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_RECVFROM_ERROR; } if (gnutls_session_is_resumed (session) != 0) shishi_error_printf (handle, "TLS handshake completed (resumed)"); else shishi_error_printf (handle, "TLS handshake completed (not resumed)"); if (have_cas) { ret = gnutls_certificate_verify_peers2 (session, &status); if (ret != 0 || status != 0) { shishi_error_printf (handle, "TLS verification of CA failed (%d/%d)", ret, status); return SHISHI_RECVFROM_ERROR; } /* XXX: We need to verify the CA cert further here. */ } if (session_data_size == 0) { ret = gnutls_session_get_data (session, NULL, &session_data_size); if (ret < 0) { shishi_error_printf (handle, "TLS gsgd(1) failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_RECVFROM_ERROR; } session_data = xmalloc (session_data_size); ret = gnutls_session_get_data (session, session_data, &session_data_size); if (ret < 0) { shishi_error_printf (handle, "TLS gsgd(2) failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_RECVFROM_ERROR; } } tmpbuf[3] = inlen & 0xFF; tmpbuf[2] = (inlen >> 8) & 0xFF; tmpbuf[1] = (inlen >> 16) & 0xFF; tmpbuf[0] = (inlen >> 24) & 0xFF; bytes_sent = gnutls_record_send (session, tmpbuf, 4); if (bytes_sent != 4) { shishi_error_printf (handle, "Bad TLS write (%d < 4)", bytes_sent); return SHISHI_SENDTO_ERROR; } bytes_sent = gnutls_record_send (session, indata, inlen); if (bytes_sent != (ssize_t) inlen) { shishi_error_printf (handle, "Bad TLS write (%d < %d)", bytes_sent, inlen); return SHISHI_SENDTO_ERROR; } bytes_read = gnutls_record_recv (session, tmpbuf, 4); if (bytes_read != 4) { shishi_error_printf (handle, "Bad TLS read (%d < 4)", bytes_read); return SHISHI_SENDTO_ERROR; } /* XXX sanities input. */ *outlen = C2I (tmpbuf); *outdata = xmalloc (*outlen); bytes_read = gnutls_record_recv (session, *outdata, *outlen); if (bytes_read == 0) { shishi_error_printf (handle, "Peer has closed the TLS connection"); free (*outdata); return SHISHI_RECVFROM_ERROR; } else if (bytes_read < 0) { shishi_error_printf (handle, "TLS Error (%d): %s", ret, gnutls_strerror (ret)); free (*outdata); return SHISHI_RECVFROM_ERROR; } else if (bytes_read != (ssize_t) * outlen) { shishi_error_printf (handle, "TLS Read error (%d != %d)", *outlen, bytes_read); free (*outdata); return SHISHI_RECVFROM_ERROR; } do ret = gnutls_bye (session, GNUTLS_SHUT_RDWR); while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN); if (ret != GNUTLS_E_SUCCESS) shishi_error_printf (handle, "TLS Disconnected failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_OK; } /* Send request to KDC over TLS, receive reply, and disconnect. */ int _shishi_sendrecv_tls (Shishi * handle, struct addrinfo *ai, const char *indata, size_t inlen, char **outdata, size_t * outlen) { gnutls_session session; gnutls_anon_client_credentials anoncred; gnutls_certificate_credentials x509cred; int sockfd; int ret, outerr; const char *cafile = shishi_x509ca_default_file (handle); const char *certfile = shishi_x509cert_default_file (handle); const char *keyfile = shishi_x509key_default_file (handle); bool have_cas = false; sockfd = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sockfd < 0) { shishi_error_set (handle, strerror (errno)); return SHISHI_SOCKET_ERROR; } if (connect (sockfd, ai->ai_addr, ai->ai_addrlen) != 0) { shishi_error_set (handle, strerror (errno)); close (sockfd); return SHISHI_BIND_ERROR; } ret = gnutls_init (&session, GNUTLS_CLIENT); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS init failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } ret = gnutls_priority_set_direct (session, "NORMAL:+ANON-DH", NULL); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS psd failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } ret = gnutls_anon_allocate_client_credentials (&anoncred); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS aacs failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } ret = gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS cs failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } ret = gnutls_certificate_allocate_credentials (&x509cred); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS cac failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } ret = gnutls_certificate_set_x509_trust_file (x509cred, cafile, GNUTLS_X509_FMT_PEM); if (ret != GNUTLS_E_SUCCESS && ret != GNUTLS_E_FILE_ERROR) { shishi_error_printf (handle, "TLS csxtf failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } else if (ret == GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "Loaded CA certificate"); have_cas = true; } ret = gnutls_certificate_set_x509_key_file (x509cred, certfile, keyfile, GNUTLS_X509_FMT_PEM); if (ret != GNUTLS_E_SUCCESS && ret != GNUTLS_E_FILE_ERROR) { shishi_error_printf (handle, "TLS csxkf failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } else if (ret == GNUTLS_E_SUCCESS) shishi_error_printf (handle, "Loaded client certificate"); ret = gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, x509cred); if (ret != GNUTLS_E_SUCCESS) { shishi_error_printf (handle, "TLS cs X.509 failed (%d): %s", ret, gnutls_strerror (ret)); return SHISHI_CRYPTO_ERROR; } /* Core part. */ outerr = _shishi_sendrecv_tls1 (handle, sockfd, session, indata, inlen, outdata, outlen, handle->kdctimeout, have_cas); ret = shutdown (sockfd, SHUT_RDWR); if (ret != 0) { shishi_error_printf (handle, "Shutdown failed (%d): %s", ret, strerror (errno)); if (outerr == SHISHI_OK) outerr = SHISHI_CLOSE_ERROR; } ret = close (sockfd); if (ret != 0) { shishi_error_printf (handle, "Close failed (%d): %s", ret, strerror (errno)); if (outerr == SHISHI_OK) outerr = SHISHI_CLOSE_ERROR; } gnutls_deinit (session); gnutls_anon_free_client_credentials (anoncred); return outerr; } shishi-1.0.2/lib/pki.c0000664000000000000000000001441012126660507011374 00000000000000/* pki.c --- Public Key Infrastructure support functions for Shishi. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #define X509CA_FILE "client.ca" #define X509KEY_FILE "client.key" #define X509CERT_FILE "client.certs" /** * shishi_x509ca_default_file_guess: * @handle: Shishi library handle create by shishi_init(). * * Guesses the default X.509 CA certificate filename; it is * $HOME/.shishi/client.ca. * * Return value: Returns default X.509 client certificate filename as * a string that has to be deallocated with free() by the caller. **/ char * shishi_x509ca_default_file_guess (Shishi * handle) { return shishi_cfg_userdirectory_file (handle, X509CA_FILE); } /** * shishi_x509ca_default_file_set: * @handle: Shishi library handle create by shishi_init(). * @x509cafile: string with new default x509 client certificate file name, * or NULL to reset to default. * * Set the default X.509 CA certificate filename used in the library. * The certificate is used during TLS connections with the KDC to * authenticate the KDC. The string is copied into the library, so * you can dispose of the variable immediately after calling this * function. **/ void shishi_x509ca_default_file_set (Shishi * handle, const char *x509cafile) { free (handle->x509cafile); if (x509cafile) handle->x509cafile = xstrdup (x509cafile); else handle->x509cafile = shishi_x509ca_default_file_guess (handle); } /** * shishi_x509ca_default_file: * @handle: Shishi library handle create by shishi_init(). * * Get filename for default X.509 CA certificate. * * Return value: Returns the default X.509 CA certificate filename * used in the library. The certificate is used during TLS * connections with the KDC to authenticate the KDC. The string is * not a copy, so don't modify or deallocate it. **/ const char * shishi_x509ca_default_file (Shishi * handle) { if (!handle->x509cafile) shishi_x509ca_default_file_set (handle, NULL); return handle->x509cafile; } /** * shishi_x509cert_default_file_guess: * @handle: Shishi library handle create by shishi_init(). * * Guesses the default X.509 client certificate filename; it is * $HOME/.shishi/client.certs. * * Return value: Returns default X.509 client certificate filename as * a string that has to be deallocated with free() by the caller. **/ char * shishi_x509cert_default_file_guess (Shishi * handle) { return shishi_cfg_userdirectory_file (handle, X509CERT_FILE); } /** * shishi_x509cert_default_file_set: * @handle: Shishi library handle create by shishi_init(). * @x509certfile: string with new default x509 client certificate file name, * or NULL to reset to default. * * Set the default X.509 client certificate filename used in the * library. The certificate is used during TLS connections with the * KDC to authenticate the client. The string is copied into the * library, so you can dispose of the variable immediately after * calling this function. **/ void shishi_x509cert_default_file_set (Shishi * handle, const char *x509certfile) { free (handle->x509certfile); if (x509certfile) handle->x509certfile = xstrdup (x509certfile); else handle->x509certfile = shishi_x509cert_default_file_guess (handle); } /** * shishi_x509cert_default_file: * @handle: Shishi library handle create by shishi_init(). * * Get filename for default X.509 certificate. * * Return value: Returns the default X.509 client certificate filename * used in the library. The certificate is used during TLS * connections with the KDC to authenticate the client. The string is * not a copy, so don't modify or deallocate it. **/ const char * shishi_x509cert_default_file (Shishi * handle) { if (!handle->x509certfile) shishi_x509cert_default_file_set (handle, NULL); return handle->x509certfile; } /** * shishi_x509key_default_file_guess: * @handle: Shishi library handle create by shishi_init(). * * Guesses the default X.509 client key filename; it is * $HOME/.shishi/client.key. * * Return value: Returns default X.509 client key filename as * a string that has to be deallocated with free() by the caller. **/ char * shishi_x509key_default_file_guess (Shishi * handle) { return shishi_cfg_userdirectory_file (handle, X509KEY_FILE); } /** * shishi_x509key_default_file_set: * @handle: Shishi library handle create by shishi_init(). * @x509keyfile: string with new default x509 client key file name, or * NULL to reset to default. * * Set the default X.509 client key filename used in the library. The * key is used during TLS connections with the KDC to authenticate the * client. The string is copied into the library, so you can dispose * of the variable immediately after calling this function. **/ void shishi_x509key_default_file_set (Shishi * handle, const char *x509keyfile) { free (handle->x509keyfile); if (x509keyfile) handle->x509keyfile = xstrdup (x509keyfile); else handle->x509keyfile = shishi_x509key_default_file_guess (handle); } /** * shishi_x509key_default_file: * @handle: Shishi library handle create by shishi_init(). * * Get filename for default X.509 key. * * Return value: Returns the default X.509 client key filename * used in the library. The key is used during TLS * connections with the KDC to authenticate the client. The string is * not a copy, so don't modify or deallocate it. **/ const char * shishi_x509key_default_file (Shishi * handle) { if (!handle->x509keyfile) shishi_x509key_default_file_set (handle, NULL); return handle->x509keyfile; } shishi-1.0.2/lib/principal.c0000644000000000000000000003167212126663607012605 00000000000000/* principal.c --- Get and set default principal. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /** * shishi_principal_default_guess: * * Guesses the principal name for the user, looking at environment * variables SHISHI_USER, USER and LOGNAME, or if that fails, returns * the string "user". * * Return value: Returns guessed default principal for user as a * string that has to be deallocated by the caller with free(). **/ char * shishi_principal_default_guess (void) { const char *envuser; envuser = getenv ("SHISHI_USER"); if (!envuser) envuser = getenv ("USER"); if (!envuser) envuser = getenv ("LOGNAME"); if (!envuser) envuser = "user"; return xstrdup (envuser); } /** * shishi_principal_default: * @handle: Shishi library handle created by shishi_init(). * * The default principal name is the name in the environment variable * USER, or LOGNAME for some systems, but it can be overridden by * specifying the environment variable SHISHI_USER. * * Return value: Returns the default principal name used by the * library. (Not a copy of it, so don't modify or deallocate it.) **/ const char * shishi_principal_default (Shishi * handle) { if (!handle->default_principal) { char *p; p = shishi_principal_default_guess (); shishi_principal_default_set (handle, p); free (p); } return handle->default_principal; } /** * shishi_principal_default_set: * @handle: Shishi library handle created by shishi_init(). * @principal: string with new default principal name, or NULL to * reset to default. * * Set the default principal used by the library. The string is copied * into the library, so you can dispose of the variable immediately * after calling this function. **/ void shishi_principal_default_set (Shishi * handle, const char *principal) { free (handle->default_principal); if (principal) handle->default_principal = xstrdup (principal); else handle->default_principal = NULL; } /** * shishi_parse_name: * @handle: Shishi library handle created by shishi_init(). * @name: input principal name string, e.g. imap/mail.gnu.org\@GNU.ORG. * @principal: newly allocated output string with principal name. * @realm: newly allocated output string with realm name. * * Split principal name (e.g., "simon\@JOSEFSSON.ORG") into two * newly allocated strings, the @principal ("simon"), and the @realm * ("JOSEFSSON.ORG"). If there is no realm part in @name, @realm is set * to NULL. * * Return value: Returns SHISHI_INVALID_PRINCIPAL_NAME if @name is NULL * or ends with the escape character "\", and SHISHI_OK if * successful. **/ int shishi_parse_name (Shishi * handle, const char *name, char **principal, char **realm) { const char *p = name; const char *q; int escaped = 0; if (!name) { shishi_error_printf (handle, "Name is NULL\n"); return SHISHI_INVALID_PRINCIPAL_NAME; } while (*p && (*p != '@' || escaped)) if (escaped) escaped = 0; else if (*p++ == '\\') escaped = 1; if (escaped) { shishi_error_printf (handle, "Principal ended with escape character: %s\n", name); return SHISHI_INVALID_PRINCIPAL_NAME; } if (principal) { *principal = xstrndup (name, p - name + 1); (*principal)[p - name] = '\0'; } if (*p) { q = ++p; while (*q) if (escaped) escaped = 0; else if (*q++ == '\\') escaped = 1; if (escaped) { shishi_error_printf (handle, "Realm ended with escape character: %s\n", name); return SHISHI_INVALID_PRINCIPAL_NAME; } if (realm) *realm = xstrdup (p); } else if (realm) *realm = NULL; return SHISHI_OK; } /** * shishi_principal_name: * @handle: Shishi library handle created by shishi_init(). * @namenode: ASN.1 structure with principal in @namefield. * @namefield: name of field in @namenode containing principal name. * @out: pointer to newly allocated, null terminated, string containing * principal name. May be %NULL (to only populate @outlen). * @outlen: pointer to length of @out on output, excluding terminating * null. May be %NULL (to only populate @out). * * Represent principal name in ASN.1 structure as null-terminated * string. The string is allocated by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @outlen does not include the terminating null. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_principal_name (Shishi * handle, Shishi_asn1 namenode, const char *namefield, char **out, size_t * outlen) { char *format; size_t i, j, n; char *name = NULL; size_t namelen = 0; int res; asprintf (&format, "%s.name-string", namefield); res = shishi_asn1_number_of_elements (handle, namenode, format, &n); free (format); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { char *tmp; size_t tmplen; size_t safetmplen; asprintf (&format, "%s.name-string.?%ld", namefield, i); res = shishi_asn1_read (handle, namenode, format, &tmp, &tmplen); free (format); if (res != SHISHI_OK) return res; safetmplen = tmplen; for (j = 0; j < tmplen; j++) if (tmp[j] == '@' || tmp[j] == '/' || tmp[j] == '\\') safetmplen++; if (i < n) safetmplen++; name = xrealloc (name, namelen + safetmplen); for (j = 0; j < tmplen; j++) { if (tmp[j] == '@' || tmp[j] == '/' || tmp[j] == '\\') name[namelen++] = '\\'; name[namelen++] = tmp[j]; } if (i < n) name[namelen++] = '/'; free (tmp); } name = xrealloc (name, namelen + 1); name[namelen] = '\0'; if (out) *out = name; else free (name); if (outlen) *outlen = namelen; return SHISHI_OK; } /** * shishi_principal_name_realm: * @handle: Shishi library handle created by shishi_init(). * @namenode: ASN.1 structure with principal name in @namefield. * @namefield: name of field in @namenode containing principal name. * @realmnode: ASN.1 structure with principal realm in @realmfield. * @realmfield: name of field in @realmnode containing principal realm. * @out: pointer to newly allocated null terminated string containing * principal name. May be %NULL (to only populate @outlen). * @outlen: pointer to length of @out on output, excluding terminating * null. May be %NULL (to only populate @out). * * Represent principal name and realm in ASN.1 structure as * null-terminated string. The string is allocated by this function. * It is the responsibility of the caller to deallocate it. Note * that the output length @outlen does not include the terminating * null character. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_principal_name_realm (Shishi * handle, Shishi_asn1 namenode, const char *namefield, Shishi_asn1 realmnode, const char *realmfield, char **out, size_t * outlen) { char *tmp; size_t tmplen; int rc; rc = shishi_principal_name (handle, namenode, namefield, &tmp, &tmplen); if (rc != SHISHI_OK) return rc; if (realmnode == NULL && realmfield) { size_t realmfieldlen = strlen (realmfield); tmp = xrealloc (tmp, tmplen + 1 + realmfieldlen + 1); tmp[tmplen] = '@'; memcpy (tmp + tmplen + 1, realmfield, realmfieldlen); tmplen += 1 + realmfieldlen; tmp[tmplen] = '\0'; } else if (realmnode != NULL) { char *realm; size_t realmlen; rc = shishi_asn1_read (handle, realmnode, realmfield, &realm, &realmlen); if (rc != SHISHI_OK) { free (tmp); return rc; } tmp = xrealloc (tmp, tmplen + 1 + realmlen + 1); tmp[tmplen] = '@'; memcpy (tmp + tmplen + 1, realm, realmlen); tmplen += 1 + realmlen; tmp[tmplen] = '\0'; free (realm); } *out = tmp; if (outlen) *outlen = tmplen; return SHISHI_OK; } /** * shishi_principal_name_set: * @handle: shishi handle as allocated by shishi_init(). * @namenode: ASN.1 structure with principal in @namefield. * @namefield: name of field in @namenode containing principal name. * @name_type: type of principal, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @name: null-terminated input array with principal name. * * Set the given principal name field to the given name. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_principal_name_set (Shishi * handle, Shishi_asn1 namenode, const char *namefield, Shishi_name_type name_type, const char *name[]) { int res; char *asn1name; int i; asprintf (&asn1name, "%s.name-type", namefield); res = shishi_asn1_write_int32 (handle, namenode, asn1name, name_type); free (asn1name); if (res != SHISHI_OK) return res; asprintf (&asn1name, "%s.name-string", namefield); res = shishi_asn1_write (handle, namenode, asn1name, NULL, 0); free (asn1name); if (res != SHISHI_OK) return res; i = 1; while (name[i - 1]) { asprintf (&asn1name, "%s.name-string", namefield); res = shishi_asn1_write (handle, namenode, asn1name, "NEW", 1); free (asn1name); if (res != SHISHI_OK) return res; asprintf (&asn1name, "%s.name-string.?%d", namefield, i); res = shishi_asn1_write (handle, namenode, asn1name, name[i - 1], 0); free (asn1name); if (res != SHISHI_OK) return res; i++; } return SHISHI_OK; } /** * shishi_principal_set: * @handle: shishi handle as allocated by shishi_init(). * @namenode: ASN.1 structure with principal in @namefield. * @namefield: name of field in @namenode containing principal name. * @name: null-terminated string with principal name in RFC 1964 form. * * Set principal name field in an ASN.1 structure to the given name. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_principal_set (Shishi * handle, Shishi_asn1 namenode, const char *namefield, const char *name) { char *tmpname; const char **namebuf; char *tokptr = NULL; int res; int i; tmpname = xstrdup (name); namebuf = xmalloc (sizeof (*namebuf)); for (i = 0; (namebuf[i] = strtok_r (i == 0 ? tmpname : NULL, "/", &tokptr)); i++) { namebuf = xrealloc (namebuf, (i + 2) * sizeof (*namebuf)); } res = shishi_principal_name_set (handle, namenode, namefield, SHISHI_NT_UNKNOWN, namebuf); free (namebuf); free (tmpname); if (res != SHISHI_OK) { shishi_error_printf (handle, _("Could not set principal name: %s\n"), shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_derive_default_salt: * @handle: shishi handle as allocated by shishi_init(). * @name: principal name of user. * @salt: output variable with newly allocated salt string. * * Derive the default salt from a principal. The default salt is the * concatenation of the decoded realm and the principal. * * Return value: Return SHISHI_OK if successful. **/ int shishi_derive_default_salt (Shishi * handle, const char *name, char **salt) { char *principal; char *realm; char *p; int rc; /* XXX also deal with escaped /'s. */ rc = shishi_parse_name (handle, name, &principal, &realm); if (rc != SHISHI_OK) return rc; if (!principal || !realm) { free (realm); free (principal); return SHISHI_INVALID_PRINCIPAL_NAME; } while ((p = strchr (principal, '/'))) memmove (p, p + 1, strlen (p)); *salt = xasprintf ("%s%s", realm, principal); free (realm); free (principal); return SHISHI_OK; } /** * shishi_server_for_local_service: * @handle: shishi handle as allocated by shishi_init(). * @service: null terminated string with name of service, e.g., "host". * * Construct a service principal (e.g., "imap/yxa.extuno.com") based * on supplied service name (i.e., "imap") and the system's hostname as * returned by hostname() (i.e., "yxa.extundo.com"). The string must * be deallocated by the caller. * * Return value: Return newly allocated service name string. **/ char * shishi_server_for_local_service (Shishi * handle, const char *service) { char *hostname; char *server; hostname = xgethostname (); asprintf (&server, "%s/%s", service, hostname); free (hostname); return server; } shishi-1.0.2/lib/crypto-md.c0000664000000000000000000000317512126660507012535 00000000000000/* crypto-md.c --- DES crypto functions * Copyright (C) 2002-2013 Simon Josefsson * Copyright (C) 2003 Free Software Foundation, Inc. * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include "crypto.h" static int md4_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { if (outlen) *outlen = 16; return shishi_md4 (handle, in, inlen, out); } static int md5_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { if (outlen) *outlen = 16; return shishi_md5 (handle, in, inlen, out); } checksuminfo md4_info = { SHISHI_RSA_MD4, "rsa-md4", 16, md4_checksum, NULL }; checksuminfo md5_info = { SHISHI_RSA_MD5, "rsa-md5", 16, md5_checksum, NULL }; shishi-1.0.2/lib/error.c0000664000000000000000000002760712126660507011756 00000000000000/* error.c --- Error handling functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct shishi_error_msgs { int errorcode; const char *message; }; static const struct shishi_error_msgs _shishi_error_messages[] = { {SHISHI_OK, N_("Shishi success")}, {SHISHI_ASN1_ERROR, N_("Error in ASN.1 function (corrupt data?)")}, {SHISHI_FOPEN_ERROR, N_("Could not open file")}, {SHISHI_IO_ERROR, N_("File input/output error")}, {SHISHI_MALLOC_ERROR, N_("Memory allocation error in shishi library.")}, {SHISHI_BASE64_ERROR, N_("Base64 encoding or decoding failed. Data corrupt?")}, {SHISHI_REALM_MISMATCH, N_("Client realm value differ between request and reply.")}, {SHISHI_CNAME_MISMATCH, N_("Client name value differ between request and reply.")}, {SHISHI_NONCE_MISMATCH, N_("Replay protection value (nonce) differ between request and reply.")}, {SHISHI_TGSREP_BAD_KEYTYPE, N_("Incorrect key type used in TGS reply.")}, {SHISHI_KDCREP_BAD_KEYTYPE, N_("Incorrect key type used in reply from KDC.")}, {SHISHI_APREP_BAD_KEYTYPE, N_("Incorrect key type used in AP reply.")}, {SHISHI_APREP_VERIFY_FAILED, N_("Failed verification of AP reply.")}, {SHISHI_APREQ_BAD_KEYTYPE, N_("Incorrect key type used in AP request.")}, {SHISHI_TOO_SMALL_BUFFER, N_("Provided buffer was too small.")}, {SHISHI_DERIVEDKEY_TOO_SMALL, N_("Derived key material is too short to be applicable.")}, {SHISHI_KEY_TOO_LARGE, N_("The key is too large to be usable.")}, {SHISHI_CRYPTO_ERROR, N_("Low-level cryptographic primitive failed. This usually indicates " "bad password or data corruption.")}, {SHISHI_CRYPTO_INTERNAL_ERROR, N_("Internal error in low-level crypto routines.")}, {SHISHI_SOCKET_ERROR, N_("The system call socket() failed. This usually indicates that " "your system does not support the socket type.")}, {SHISHI_BIND_ERROR, N_("The system call bind() failed. This usually indicates " "insufficient permissions.")}, {SHISHI_SENDTO_ERROR, N_("The system call sendto() failed.")}, {SHISHI_RECVFROM_ERROR, N_("Error receiving data from server")}, {SHISHI_CLOSE_ERROR, N_("The system call close() failed.")}, {SHISHI_KDC_TIMEOUT, N_("Timed out talking to KDC. This usually indicates a network " "or KDC address problem.")}, {SHISHI_KDC_NOT_KNOWN_FOR_REALM, N_("No KDC known for given realm.")}, {SHISHI_TTY_ERROR, N_("No TTY assigned to process.")}, {SHISHI_GOT_KRBERROR, N_("Server replied to the request with an error message.")}, {SHISHI_HANDLE_ERROR, N_("Failure to use handle. Missing handle, or misconfigured.")}, {SHISHI_INVALID_TKTS, N_("Ticket set not initialized. This usually indicates an internal " "application error.")}, {SHISHI_TICKET_BAD_KEYTYPE, N_("Key type used to encrypt ticket doesn't match provided key. " "This usually indicates an internal application error.")}, {SHISHI_INVALID_KEY, N_("Reference to invalid encryption key.")}, {SHISHI_APREQ_DECRYPT_FAILED, N_("Could not decrypt AP-REQ using provided key. " "This usually indicates an internal application error.")}, {SHISHI_TICKET_DECRYPT_FAILED, N_("Could not decrypt Ticket using provided key. " "This usually indicates an internal application error.")}, {SHISHI_INVALID_TICKET, N_("Invalid ticked passed in call.")}, {SHISHI_OUT_OF_RANGE, N_("Argument lies outside of valid range.")}, {SHISHI_ASN1_NO_ELEMENT, N_("The ASN.1 structure does not contain the indicated element.")}, {SHISHI_SAFE_BAD_KEYTYPE, N_("Attempted access to non-existent key type.")}, {SHISHI_SAFE_VERIFY_FAILED, N_("Verification failed on either side.")}, {SHISHI_PKCS5_INVALID_PRF, N_("Invalid PKCS5 descriptor.")}, {SHISHI_PKCS5_INVALID_ITERATION_COUNT, N_("Invalid claim of iteration count in PKCS5 descriptor.")}, {SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH, N_("Derived key length is incorrect for PKCS5 descriptor.")}, {SHISHI_PKCS5_DERIVED_KEY_TOO_LONG, N_("Derived key is too long for PKCS5 descriptor.")}, {SHISHI_INVALID_PRINCIPAL_NAME, N_("Principal name syntax error.")}, {SHISHI_INVALID_ARGUMENT, N_("Invalid argument passed in call. Wrong or unknown value.")}, {SHISHI_ASN1_NO_VALUE, N_("The indicated ASN.1 element does not carry a value.")}, {SHISHI_CONNECT_ERROR, N_("Connection attempt failed. Try again, or check availability.")}, {SHISHI_VERIFY_FAILED, N_("Verification failed on either side.")}, {SHISHI_PRIV_BAD_KEYTYPE, N_("The private key uses an incompatible encryption type.")}, {SHISHI_FILE_ERROR, N_("The desired file could not be accessed. Check permissions.")}, {SHISHI_ENCAPREPPART_BAD_KEYTYPE, N_("The present AP reply specifies an inpermissible key type.")}, {SHISHI_GETTIMEOFDAY_ERROR, N_("A request for present time of day has failed. " "This is usually internal, but a valid time is imperative for us.")}, {SHISHI_KEYTAB_ERROR, N_("Failed to parse keytab file")}, {SHISHI_CCACHE_ERROR, N_("Failed to parse credential cache file")}, {-1, NULL} }; /** * shishi_strerror: * @err: shishi error code. * * Convert return code to human readable string. * * Return value: Returns a pointer to a statically allocated string * containing a description of the error with the error value @err. * This string can be used to output a diagnostic message to the user. **/ const char * shishi_strerror (int err) { const char *p = _("Unknown error"); size_t i; for (i = 0; _shishi_error_messages[i].errorcode != -1; i++) if (_shishi_error_messages[i].errorcode == err) { p = _(_shishi_error_messages[i].message); break; } return p; } /** * shishi_error: * @handle: shishi handle as allocated by shishi_init(). * * Extract detailed error information string. Note that the memory is * managed by the Shishi library, so you must not deallocate the * string. * * Return value: Returns pointer to error information string, that must * not be deallocate by caller. **/ const char * shishi_error (Shishi * handle) { if (handle->error) return handle->error; return _("No error"); } /** * shishi_error_clear: * @handle: shishi handle as allocated by shishi_init(). * * Clear the detailed error information string. See shishi_error() * for how to access the error string, and shishi_error_set() and * shishi_error_printf() for how to set the error string. This * function is mostly for Shishi internal use, but if you develop an * extension of Shishi, it may be useful to use the same error * handling infrastructure. **/ void shishi_error_clear (Shishi * handle) { handle->error[0] = '\0'; } /** * shishi_error_set: * @handle: shishi handle as allocated by shishi_init(). * @errstr: Zero terminated character array containing error description, * or NULL to clear the error description string. * * Set the detailed error information string to specified string. The * string is copied into the Shishi internal structure, so you can * deallocate the string passed to this function after the call. This * function is mostly for Shishi internal use, but if you develop an * extension of Shishi, it may be useful to use the same error * handling infrastructure. **/ void shishi_error_set (Shishi * handle, const char *errstr) { if (errstr) { strncpy (handle->error, errstr, sizeof (handle->error)); if (VERBOSENOISE (handle)) puts (handle->error); } else shishi_error_clear (handle); } /** * shishi_error_printf: * @handle: shishi handle as allocated by shishi_init(). * @format: printf style format string. * @...: print style arguments. * * Set the detailed error information string to a printf formatted * string. This function is mostly for Shishi internal use, but if * you develop an extension of Shishi, it may be useful to use the * same error handling infrastructure. **/ void shishi_error_printf (Shishi * handle, const char *format, ...) { va_list ap; char *s; va_start (ap, format); vasprintf (&s, format, ap); strncpy (handle->error, s, sizeof (handle->error)); handle->error[sizeof (handle->error) - 1] = '\0'; free (s); if (VERBOSE (handle)) puts (handle->error); va_end (ap); } /** * shishi_error_outputtype: * @handle: shishi handle as allocated by shishi_init(). * * Get the current output type for logging messages. * * Return value: Return output type (NULL, stderr or syslog) for * informational and warning messages. **/ int shishi_error_outputtype (Shishi * handle) { return handle->outputtype; } /** * shishi_error_set_outputtype: * @handle: shishi handle as allocated by shishi_init(). * @type: output type. * * Set output type (NULL, stderr or syslog) for informational * and warning messages. **/ void shishi_error_set_outputtype (Shishi * handle, int type) { handle->outputtype = type; } /** * shishi_info: * @handle: shishi handle as allocated by shishi_init(). * @format: printf style format string. * @...: print style arguments. * * Print informational message to output as defined in handle. **/ void shishi_info (Shishi * handle, const char *format, ...) { va_list ap; char *out; int type; va_start (ap, format); vasprintf (&out, format, ap); type = shishi_error_outputtype (handle); switch (type) { case SHISHI_OUTPUTTYPE_SYSLOG: /* If we don't have syslog, log to stderr... */ #ifdef HAVE_SYSLOG syslog (LOG_ERR, _("libshishi: info: %s"), out); break; #endif case SHISHI_OUTPUTTYPE_STDERR: fprintf (stderr, _("libshishi: info: %s\n"), out); break; default: break; } free (out); va_end (ap); } /** * shishi_warn: * @handle: shishi handle as allocated by shishi_init(). * @format: printf style format string. * @...: print style arguments. * * Print a warning to output as defined in handle. **/ void shishi_warn (Shishi * handle, const char *format, ...) { va_list ap; char *out; int type; va_start (ap, format); vasprintf (&out, format, ap); type = shishi_error_outputtype (handle); switch (type) { case SHISHI_OUTPUTTYPE_SYSLOG: /* If we don't have syslog, log to stderr... */ #ifdef HAVE_SYSLOG syslog (LOG_ERR, _("libshishi: warning: %s"), out); break; #endif case SHISHI_OUTPUTTYPE_STDERR: fprintf (stderr, _("libshishi: warning: %s\n"), out); break; default: break; } free (out); va_end (ap); } /** * shishi_verbose: * @handle: shishi handle as allocated by shishi_init(). * @format: printf style format string. * @...: print style arguments. * * Print a diagnostic message to output as defined in handle. **/ void shishi_verbose (Shishi * handle, const char *format, ...) { va_list ap; char *out; int type; if (!VERBOSE (handle)) return; va_start (ap, format); vasprintf (&out, format, ap); type = shishi_error_outputtype (handle); switch (type) { case SHISHI_OUTPUTTYPE_SYSLOG: /* If we don't have syslog, log to stderr... */ #ifdef HAVE_SYSLOG syslog (LOG_DEBUG, "%s", out); break; #endif case SHISHI_OUTPUTTYPE_STDERR: fprintf (stderr, "%s\n", out); break; default: break; } free (out); va_end (ap); } shishi-1.0.2/lib/aprep.c0000664000000000000000000003046012126660507011723 00000000000000/* aprep.c --- AP-REP functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi is distributed in the hope that it will be useful, but 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" #define SHISHI_APREP_DEFAULT_PVNO "5" #define SHISHI_APREP_DEFAULT_PVNO_LEN 0 #define SHISHI_APREP_DEFAULT_MSG_TYPE "15" /* KRB_AP_REP */ #define SHISHI_APREP_DEFAULT_MSG_TYPE_LEN 0 #define SHISHI_APREP_DEFAULT_ENC_PART_ETYPE "0" #define SHISHI_APREP_DEFAULT_ENC_PART_ETYPE_LEN 0 #define SHISHI_APREP_DEFAULT_ENC_PART_KVNO "0" #define SHISHI_APREP_DEFAULT_ENC_PART_KVNO_LEN 0 #define SHISHI_APREP_DEFAULT_ENC_PART_CIPHER "" #define SHISHI_APREP_DEFAULT_ENC_PART_CIPHER_LEN 0 /** * shishi_aprep: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new AP-REP, populated with some default * values. * * Return value: Returns the authenticator or NULL on * failure. **/ Shishi_asn1 shishi_aprep (Shishi * handle) { Shishi_asn1 node; int res; node = shishi_asn1_aprep (handle); if (!node) return NULL; res = shishi_asn1_write (handle, node, "pvno", SHISHI_APREP_DEFAULT_PVNO, SHISHI_APREP_DEFAULT_PVNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "msg-type", SHISHI_APREP_DEFAULT_MSG_TYPE, SHISHI_APREP_DEFAULT_MSG_TYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "enc-part.etype", SHISHI_APREP_DEFAULT_ENC_PART_ETYPE, SHISHI_APREP_DEFAULT_ENC_PART_ETYPE_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "enc-part.kvno", SHISHI_APREP_DEFAULT_ENC_PART_KVNO, SHISHI_APREP_DEFAULT_ENC_PART_KVNO_LEN); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "enc-part.cipher", SHISHI_APREP_DEFAULT_ENC_PART_CIPHER, SHISHI_APREP_DEFAULT_ENC_PART_CIPHER_LEN); if (res != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_aprep_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @aprep: AP-REP to print. * * Print ASCII armored DER encoding of AP-REP to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_print (Shishi * handle, FILE * fh, Shishi_asn1 aprep) { return _shishi_print_armored_data (handle, fh, aprep, "AP-REP", NULL); } /** * shishi_aprep_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @aprep: AP-REP to save. * * Save DER encoding of AP-REP to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_save (Shishi * handle, FILE * fh, Shishi_asn1 aprep) { return _shishi_save_data (handle, fh, aprep, "AP-REP"); } /** * shishi_aprep_to_file: * @handle: shishi handle as allocated by shishi_init(). * @aprep: AP-REP to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write AP-REP to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_to_file (Shishi * handle, Shishi_asn1 aprep, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing AP-REP to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing AP-REP in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_aprep_print (handle, fh, aprep); else res = shishi_aprep_save (handle, fh, aprep); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing AP-REP to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_aprep_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @aprep: output variable with newly allocated AP-REP. * * Read ASCII armored DER encoded AP-REP from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * aprep) { return _shishi_aprep_input (handle, fh, aprep, 0); } /** * shishi_aprep_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @aprep: output variable with newly allocated AP-REP. * * Read DER encoded AP-REP from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_read (Shishi * handle, FILE * fh, Shishi_asn1 * aprep) { return _shishi_aprep_input (handle, fh, aprep, 1); } /** * shishi_aprep_from_file: * @handle: shishi handle as allocated by shishi_init(). * @aprep: output variable with newly allocated AP-REP. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read AP-REP from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_from_file (Shishi * handle, Shishi_asn1 * aprep, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading AP-REP from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading AP-REP in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_aprep_parse (handle, fh, aprep); else res = shishi_aprep_read (handle, fh, aprep); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading AP-REP from %s...done\n"), filename); return SHISHI_OK; } int shishi_aprep_enc_part_set (Shishi * handle, Shishi_asn1 aprep, int etype, const char *buf, size_t buflen) { int res; res = shishi_asn1_write (handle, aprep, "enc-part.cipher", buf, buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write_integer (handle, aprep, "enc-part.etype", etype); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_aprep_enc_part_add (Shishi * handle, Shishi_asn1 aprep, Shishi_asn1 encticketpart, Shishi_asn1 encapreppart) { int res; char *buf; size_t buflen; char *der; size_t derlen; Shishi_key *key; res = shishi_encticketpart_get_key (handle, encticketpart, &key); if (res != SHISHI_OK) return res; res = shishi_asn1_to_der (handle, encapreppart, &der, &derlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode authenticator: %s\n", shishi_strerror (res)); return !SHISHI_OK; } der = xrealloc (der, derlen + 8); while ((derlen % 8) != 0) { der[derlen] = '\0'; derlen++; } res = shishi_encrypt (handle, key, SHISHI_KEYUSAGE_ENCAPREPPART, der, derlen, &buf, &buflen); free (der); if (res != SHISHI_OK) { shishi_error_printf (handle, "APRep encryption failed\n"); return res; } res = shishi_aprep_enc_part_set (handle, aprep, shishi_key_type (key), buf, buflen); free (buf); return res; } int shishi_aprep_enc_part_make (Shishi * handle, Shishi_asn1 aprep, Shishi_asn1 encapreppart, Shishi_asn1 authenticator, Shishi_asn1 encticketpart) { int res; res = shishi_encapreppart_time_copy (handle, encapreppart, authenticator); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not copy time: %s\n", shishi_error (handle)); return res; } res = shishi_aprep_enc_part_add (handle, aprep, encticketpart, encapreppart); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not add encapreppart: %s\n", shishi_error (handle)); return res; } return SHISHI_OK; } /** * shishi_aprep_get_enc_part_etype: * @handle: shishi handle as allocated by shishi_init(). * @aprep: AP-REP variable to get value from. * @etype: output variable that holds the value. * * Extract AP-REP.enc-part.etype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aprep_get_enc_part_etype (Shishi * handle, Shishi_asn1 aprep, int32_t * etype) { return shishi_asn1_read_int32 (handle, aprep, "enc-part.etype", etype); } int shishi_aprep_decrypt (Shishi * handle, Shishi_asn1 aprep, Shishi_key * key, int keyusage, Shishi_asn1 * encapreppart) { int res; int i; char *buf; size_t buflen; char *cipher; size_t cipherlen; int etype; res = shishi_aprep_get_enc_part_etype (handle, aprep, &etype); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (key)) return SHISHI_APREP_BAD_KEYTYPE; res = shishi_asn1_read (handle, aprep, "enc-part.cipher", &cipher, &cipherlen); if (res != SHISHI_OK) return res; res = shishi_decrypt (handle, key, keyusage, cipher, cipherlen, &buf, &buflen); free (cipher); if (res != SHISHI_OK) { shishi_error_printf (handle, "APRep decryption failed, wrong password?\n"); return res; } /* The crypto is so 1980; no length indicator. Trim off pad bytes until we can parse it. */ for (i = 0; i < 8; i++) { if (VERBOSEASN1 (handle)) printf ("Trying with %d pad in enckdcrep...\n", i); *encapreppart = shishi_der2asn1_encapreppart (handle, &buf[0], buflen - i); if (*encapreppart != NULL) break; } if (*encapreppart == NULL) { shishi_error_printf (handle, "Could not DER decode EncAPRepPart. " "Password probably correct (decrypt ok) though\n"); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } int shishi_aprep_verify (Shishi * handle, Shishi_asn1 authenticator, Shishi_asn1 encapreppart) { char *authenticatorctime; char *encapreppartctime; uint32_t authenticatorcusec, encapreppartcusec; int res; int different; /* 3.2.5. Receipt of KRB_AP_REP message If a KRB_AP_REP message is returned, the client uses the session key from the credentials obtained for the server[3.10] to decrypt the message, and verifies that the timestamp and microsecond fields match those in the Authenticator it sent to the server. If they match, then the client is assured that the server is genuine. The sequence number and subkey (if present) are retained for later use. */ res = shishi_authenticator_ctime (handle, authenticator, &authenticatorctime); if (res != SHISHI_OK) return res; res = shishi_authenticator_cusec_get (handle, authenticator, &authenticatorcusec); if (res != SHISHI_OK) return res; res = shishi_encapreppart_ctime (handle, encapreppart, &encapreppartctime); if (res != SHISHI_OK) return res; res = shishi_encapreppart_cusec_get (handle, encapreppart, &encapreppartcusec); if (res != SHISHI_OK) return res; if (VERBOSE (handle)) { printf ("authenticator cusec %08x ctime %s\n", authenticatorcusec, authenticatorctime); printf ("encapreppart cusec %08x ctime %s\n", encapreppartcusec, encapreppartctime); } different = authenticatorcusec != encapreppartcusec || strcmp (authenticatorctime, encapreppartctime) != 0; free (authenticatorctime); free (encapreppartctime); if (different) return SHISHI_APREP_VERIFY_FAILED; return SHISHI_OK; } shishi-1.0.2/lib/crypto.h0000664000000000000000000001140212126660507012134 00000000000000/* crypto.h --- Crypto prototypes. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef _CRYPTO_H #define _CRYPTO_H #define SHISHI_DK_CONSTANT "\x6b\x65\x72\x62\x65\x72\x6f\x73" int _shishi_simplified_derivekey (Shishi * handle, Shishi_key * key, int keyusage, int derivekeymode, Shishi_key ** outkey); int _shishi_simplified_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen); int _shishi_simplified_dencrypt (Shishi * handle, Shishi_key * key, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen, int decryptp); int _shishi_simplified_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); int _shishi_simplified_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); typedef enum { SHISHI_DERIVEKEYMODE_CHECKSUM, SHISHI_DERIVEKEYMODE_PRIVACY, SHISHI_DERIVEKEYMODE_INTEGRITY } Shishi_derivekeymode; typedef int (*Shishi_random_to_key_function) (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey); typedef int (*Shishi_string_to_key_function) (Shishi * handle, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey); typedef int (*Shishi_encrypt_function) (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); typedef int (*Shishi_decrypt_function) (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); typedef int (*Shishi_checksum_function) (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen); typedef int (*Shishi_verify_function) (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, const char *cksum, size_t cksumlen); struct cipherinfo { int32_t type; const char *name; size_t blocksize; size_t confoundersize; size_t keylen; size_t randomlen; uint32_t defaultcksumtype; Shishi_random_to_key_function random2key; Shishi_string_to_key_function string2key; Shishi_encrypt_function encrypt; Shishi_decrypt_function decrypt; }; typedef struct cipherinfo cipherinfo; struct checksuminfo { int32_t type; const char *name; int cksumlen; Shishi_checksum_function checksum; Shishi_verify_function verify; }; typedef struct checksuminfo checksuminfo; extern cipherinfo null_info; extern checksuminfo crc32_info; extern checksuminfo md4_info; extern checksuminfo md5_info; extern cipherinfo des_cbc_crc_info; extern cipherinfo des_cbc_md4_info; extern cipherinfo des_cbc_md5_info; extern cipherinfo des_cbc_none_info; extern checksuminfo md4_des_info; extern checksuminfo md5_des_info; extern checksuminfo md5_gss_info; extern cipherinfo des3_cbc_none_info; extern cipherinfo des3_cbc_sha1_kd_info; extern checksuminfo hmac_sha1_des3_kd_info; extern cipherinfo aes128_cts_hmac_sha1_96_info; extern cipherinfo aes256_cts_hmac_sha1_96_info; extern checksuminfo hmac_sha1_96_aes128_info; extern checksuminfo hmac_sha1_96_aes256_info; extern cipherinfo arcfour_hmac_info; extern cipherinfo arcfour_hmac_exp_info; extern checksuminfo arcfour_hmac_md5_info; #endif shishi-1.0.2/lib/kdc.c0000664000000000000000000005167212126660507011365 00000000000000/* kdc.c --- Key distribution (AS/TGS) functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /** * shishi_as_derive_salt: * @handle: shishi handle as allocated by shishi_init(). * @asreq: input AS-REQ variable. * @asrep: input AS-REP variable. * @salt: newly allocated output array with salt. * @saltlen: holds actual size of output array with salt. * * Derive the salt that should be used when deriving a key via * shishi_string_to_key() for an AS exchange. Currently this searches * for PA-DATA of type SHISHI_PA_PW_SALT in the AS-REP and returns it * if found, otherwise the salt is derived from the client name and * realm in AS-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_derive_salt (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, char **salt, size_t * saltlen) { size_t i, n; char *format; int res; res = shishi_asn1_number_of_elements (handle, asrep, "padata", &n); if (res == SHISHI_ASN1_NO_ELEMENT) n = 0; else if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { int patype; asprintf (&format, "padata.?%ld.padata-type", i); res = shishi_asn1_read_int32 (handle, asrep, format, &patype); free (format); if (res != SHISHI_OK) return res; if (patype == SHISHI_PA_PW_SALT) { asprintf (&format, "padata.?%ld.padata-value", i); res = shishi_asn1_read (handle, asrep, format, salt, saltlen); free (format); if (res != SHISHI_OK) return res; return SHISHI_OK; } } res = shishi_kdcreq_realm (handle, asreq, salt, saltlen); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, asreq, "req-body.cname.name-string", &n); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { char *tmp; size_t tmplen; asprintf (&format, "req-body.cname.name-string.?%ld", i); res = shishi_asn1_read (handle, asreq, format, &tmp, &tmplen); free (format); if (res != SHISHI_OK) return res; *saltlen += tmplen; *salt = xrealloc (*salt, *saltlen + 1); memcpy (*salt + *saltlen - tmplen, tmp, tmplen); (*salt)[*saltlen] = '\0'; free (tmp); } return SHISHI_OK; } int shishi_kdcreq_sendrecv_hint (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * kdcrep, Shishi_tkts_hint * hint) { char *der; size_t der_len; size_t buflen; char *buffer; char *realm; size_t realmlen; int res; res = shishi_asn1_to_der (handle, kdcreq, &der, &der_len); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode AS-REQ: %s\n", shishi_strerror (res)); return res; } res = shishi_asn1_read (handle, kdcreq, "req-body.realm", &realm, &realmlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not get realm: %s\n", shishi_error (handle)); return res; } realm = xrealloc (realm, realmlen + 1); realm[realmlen] = '\0'; res = shishi_kdc_sendrecv_hint (handle, realm, der, der_len, &buffer, &buflen, hint); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not send to KDC: %s\n", shishi_error (handle)); return res; } free (realm); free (der); if (VERBOSEASN1 (handle)) printf ("received %ld bytes\n", buflen); *kdcrep = shishi_der2asn1_asrep (handle, buffer, buflen); if (*kdcrep == NULL) { *kdcrep = shishi_der2asn1_tgsrep (handle, buffer, buflen); if (*kdcrep == NULL) { *kdcrep = shishi_der2asn1_kdcrep (handle, buffer, buflen); if (*kdcrep == NULL) { *kdcrep = shishi_der2asn1_krberror (handle, buffer, buflen); if (*kdcrep == NULL) { shishi_error_printf (handle, "Could not DER decode AS-REP/KRB-ERROR: %s", shishi_error (handle)); return SHISHI_ASN1_ERROR; } shishi_error_clear (handle); return SHISHI_GOT_KRBERROR; } else { printf ("Buggy server replied with KDC-REP instead of AS-REP\n"); } } } free (buffer); return SHISHI_OK; } int shishi_kdcreq_sendrecv (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * kdcrep) { return shishi_kdcreq_sendrecv_hint (handle, kdcreq, kdcrep, NULL); } /** * shishi_kdc_copy_crealm: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REP to read crealm from. * @encticketpart: EncTicketPart to set crealm in. * * Set crealm in KDC-REP to value in EncTicketPart. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_kdc_copy_crealm (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart) { char *buf; size_t buflen; int res; res = shishi_asn1_read (handle, encticketpart, "crealm", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "crealm", buf, buflen); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_as_check_crealm: * @handle: shishi handle as allocated by shishi_init(). * @asreq: AS-REQ to compare realm field in. * @asrep: AS-REP to compare realm field in. * * Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. * This is one of the steps that has to be performed when processing a * AS-REQ and AS-REP exchange, see shishi_kdc_process(). * * Return value: Returns SHISHI_OK if successful, * SHISHI_REALM_MISMATCH if the values differ, or an error code. **/ int shishi_as_check_crealm (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep) { char *reqrealm, *reprealm; size_t reqrealmlen, reprealmlen; int res; res = shishi_asn1_read (handle, asreq, "req-body.realm", &reqrealm, &reqrealmlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not read request realm: %s\n", shishi_strerror (res)); return res; } res = shishi_asn1_read (handle, asrep, "crealm", &reprealm, &reprealmlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not read reply realm: %s\n", shishi_strerror (res)); return res; } reqrealm[reqrealmlen] = '\0'; reprealm[reprealmlen] = '\0'; if (VERBOSEASN1 (handle)) { printf ("request realm: %s\n", reqrealm); printf ("reply realm: %s\n", reprealm); } res = strcmp (reqrealm, reprealm) != 0; free (reqrealm); free (reprealm); if (res) return SHISHI_REALM_MISMATCH; return SHISHI_OK; } /** * shishi_kdc_copy_cname: * @handle: shishi handle as allocated by shishi_init(). * @kdcrep: KDC-REQ to read cname from. * @encticketpart: EncTicketPart to set cname in. * * Set cname in KDC-REP to value in EncTicketPart. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_kdc_copy_cname (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart) { char *buf; char *format; size_t buflen, i, n; int res; res = shishi_asn1_read (handle, encticketpart, "cname.name-type", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "cname.name-type", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, encticketpart, "cname.name-string", &n); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, kdcrep, "cname.name-string", NULL, 0); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { res = shishi_asn1_write (handle, kdcrep, "cname.name-string", "NEW", 1); if (res != SHISHI_OK) return res; asprintf (&format, "cname.name-string.?%ld", i); res = shishi_asn1_read (handle, encticketpart, format, &buf, &buflen); free (format); if (res != SHISHI_OK) return res; asprintf (&format, "cname.name-string.?%ld", i); res = shishi_asn1_write (handle, kdcrep, format, buf, buflen); free (format); free (buf); if (res != SHISHI_OK) return res; } return SHISHI_OK; } /** * shishi_as_check_cname: * @handle: shishi handle as allocated by shishi_init(). * @asreq: AS-REQ to compare client name field in. * @asrep: AS-REP to compare client name field in. * * Verify that AS-REQ.req-body.realm and AS-REP.crealm fields matches. * This is one of the steps that has to be performed when processing a * AS-REQ and AS-REP exchange, see shishi_kdc_process(). * * Return value: Returns SHISHI_OK if successful, * SHISHI_CNAME_MISMATCH if the values differ, or an error code. **/ int shishi_as_check_cname (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep) { char *reqcname, *repcname; size_t reqcnamelen, repcnamelen, i, j; char *format; int res; /* We do not compare msg-type as recommended on the ietf-krb-wg list */ res = shishi_asn1_number_of_elements (handle, asreq, "req-body.cname.name-string", &i); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, asrep, "cname.name-string", &j); if (res != SHISHI_OK) return res; if (i != j) return SHISHI_CNAME_MISMATCH; for (i = 1; i <= j; i++) { asprintf (&format, "req-body.cname.name-string.?%ld", i); res = shishi_asn1_read (handle, asreq, format, &reqcname, &reqcnamelen); free (format); if (res != SHISHI_OK) return res; asprintf (&format, "cname.name-string.?%ld", i); res = shishi_asn1_read (handle, asrep, format, &repcname, &repcnamelen); free (format); if (res != SHISHI_OK) return res; if (VERBOSEASN1 (handle)) { reqcname[reqcnamelen] = '\0'; repcname[repcnamelen] = '\0'; printf ("request cname %ld: %s\n", i, reqcname); printf ("reply cname %ld: %s\n", i, repcname); } res = (reqcnamelen != repcnamelen) || (memcmp (reqcname, repcname, reqcnamelen) != 0); free (reqcname); free (repcname); if (res) return SHISHI_CNAME_MISMATCH; } return SHISHI_OK; } /** * shishi_kdc_copy_nonce: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to read nonce from. * @enckdcreppart: EncKDCRepPart to set nonce in. * * Set nonce in EncKDCRepPart to value in KDC-REQ. * * Return value: Returns SHISHI_OK if successful. **/ int shishi_kdc_copy_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart) { int res; uint32_t nonce; res = shishi_kdcreq_nonce (handle, kdcreq, &nonce); if (res != SHISHI_OK) return res; res = shishi_enckdcreppart_nonce_set (handle, enckdcreppart, nonce); if (res != SHISHI_OK) return res; return SHISHI_OK; } static int shishi_kdc_check_nonce_1 (Shishi * handle, char *reqnonce, size_t reqnoncelen, char *repnonce, size_t repnoncelen) { if (VERBOSENOISE (handle)) { size_t i; printf ("request nonce (len=%ld) ", reqnoncelen); for (i = 0; i < reqnoncelen; i++) printf ("%02x", reqnonce[i] & 0xFF); printf ("\n"); printf ("reply nonce (len=%ld) ", repnoncelen); for (i = 0; i < repnoncelen; i++) printf ("%02x", repnonce[i] & 0xFF); printf ("\n"); } if (reqnoncelen > 4 && repnoncelen == 4) { /* This case warrants some explanation. * * RFC 1510 didn't restrict nonce to 4 bytes, so the nonce field * may be longer. There are KDCs that will accept longer nonces * but truncated them to 4 bytes in the response. If we happen * to parse such a KDC request, we consider it OK even though it * isn't. I doubt this is a security problem, because you need * to break the integrity protection of the encryption system * as well as guess the nonce correctly. The nonce doesn't seem * to serve any purpose at all, really. * */ if (memcmp (reqnonce + reqnoncelen - 4, repnonce, 4) != 0) return SHISHI_NONCE_MISMATCH; shishi_warn (handle, "server truncated long nonce to 4 bytes"); return SHISHI_OK; } if (reqnoncelen != repnoncelen || memcmp (reqnonce, repnonce, repnoncelen) != 0) return SHISHI_NONCE_MISMATCH; return SHISHI_OK; } /** * shishi_kdc_check_nonce: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: KDC-REQ to compare nonce field in. * @enckdcreppart: Encrypted KDC-REP part to compare nonce field in. * * Verify that KDC-REQ.req-body.nonce and EncKDCRepPart.nonce fields * matches. This is one of the steps that has to be performed when * processing a KDC-REQ and KDC-REP exchange. * * Return value: Returns SHISHI_OK if successful, * SHISHI_NONCE_LENGTH_MISMATCH if the nonces have different lengths * (usually indicates that buggy server truncated nonce to 4 bytes), * SHISHI_NONCE_MISMATCH if the values differ, or an error code. **/ int shishi_kdc_check_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart) { char *reqnonce; char *repnonce; size_t reqnoncelen, repnoncelen; int res; res = shishi_asn1_read (handle, kdcreq, "req-body.nonce", &reqnonce, &reqnoncelen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not read request nonce: %s\n", shishi_strerror (res)); return res; } res = shishi_asn1_read (handle, enckdcreppart, "nonce", &repnonce, &repnoncelen); if (res != SHISHI_OK) { free (reqnonce); shishi_error_printf (handle, "Could not read reply nonce: %s\n", shishi_strerror (res)); return res; } res = shishi_kdc_check_nonce_1 (handle, reqnonce, reqnoncelen, repnonce, repnoncelen); free (reqnonce); free (repnonce); return res; } /** * shishi_tgs_process: * @handle: shishi handle as allocated by shishi_init(). * @tgsreq: input variable that holds the sent KDC-REQ. * @tgsrep: input variable that holds the received KDC-REP. * @authenticator: input variable with Authenticator from AP-REQ in KDC-REQ. * @oldenckdcreppart: input variable with EncKDCRepPart used in request. * @enckdcreppart: output variable that holds new EncKDCRepPart. * * Process a TGS client exchange and output decrypted EncKDCRepPart * which holds details for the new ticket received. This function * simply derives the encryption key from the ticket used to construct * the TGS request and calls shishi_kdc_process(), which see. * * Return value: Returns SHISHI_OK iff the TGS client exchange was * successful. **/ int shishi_tgs_process (Shishi * handle, Shishi_asn1 tgsreq, Shishi_asn1 tgsrep, Shishi_asn1 authenticator, Shishi_asn1 oldenckdcreppart, Shishi_asn1 * enckdcreppart) { Shishi_key *tktkey; Shishi_key *subkey; int use_subkey; int etype; int res; res = shishi_kdcrep_get_enc_part_etype (handle, tgsrep, &etype); if (res != SHISHI_OK) return res; res = shishi_authenticator_get_subkey (handle, authenticator, &subkey); use_subkey = (res != SHISHI_ASN1_NO_ELEMENT); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) return res; res = shishi_enckdcreppart_get_key (handle, oldenckdcreppart, &tktkey); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (use_subkey ? subkey : tktkey)) res = SHISHI_TGSREP_BAD_KEYTYPE; else res = shishi_kdc_process (handle, tgsreq, tgsrep, use_subkey ? subkey : tktkey, use_subkey ? SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY : SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY, enckdcreppart); /* Entire if statement to work around buggy KDCs. */ if (use_subkey && (res == SHISHI_CRYPTO_ERROR || res == SHISHI_TGSREP_BAD_KEYTYPE)) { int tmpres; /* Try again using key from ticket instead of subkey */ if (etype != shishi_key_type (tktkey)) tmpres = SHISHI_TGSREP_BAD_KEYTYPE; else tmpres = shishi_kdc_process (handle, tgsreq, tgsrep, tktkey, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY, enckdcreppart); /* if bug workaround code didn't help, return original error. */ if (tmpres != SHISHI_OK) return res; shishi_warn (handle, "KDC bug: Reply encrypted using wrong key."); res = tmpres; } if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_as_process: * @handle: shishi handle as allocated by shishi_init(). * @asreq: input variable that holds the sent KDC-REQ. * @asrep: input variable that holds the received KDC-REP. * @string: input variable with zero terminated password. * @enckdcreppart: output variable that holds new EncKDCRepPart. * * Process an AS client exchange and output decrypted EncKDCRepPart * which holds details for the new ticket received. This function * simply derives the encryption key from the password and calls * shishi_kdc_process(), which see. * * Return value: Returns SHISHI_OK iff the AS client exchange was * successful. **/ int shishi_as_process (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, const char *string, Shishi_asn1 * enckdcreppart) { char *salt; size_t saltlen; int res; Shishi_key *key; int keytype; res = shishi_as_derive_salt (handle, asreq, asrep, &salt, &saltlen); if (res != SHISHI_OK) return res; res = shishi_kdcrep_get_enc_part_etype (handle, asrep, &keytype); if (res != SHISHI_OK) return res; res = shishi_key_from_string (handle, keytype, string, strlen (string), salt, saltlen, NULL, &key); if (res != SHISHI_OK) return res; if (VERBOSENOISE (handle)) shishi_key_print (handle, stderr, key); res = shishi_kdc_process (handle, asreq, asrep, key, SHISHI_KEYUSAGE_ENCASREPPART, enckdcreppart); return res; } /** * shishi_kdc_process: * @handle: shishi handle as allocated by shishi_init(). * @kdcreq: input variable that holds the sent KDC-REQ. * @kdcrep: input variable that holds the received KDC-REP. * @key: input array with key to decrypt encrypted part of KDC-REP with. * @keyusage: kereros key usage value. * @enckdcreppart: output variable that holds new EncKDCRepPart. * * Process a KDC client exchange and output decrypted EncKDCRepPart * which holds details for the new ticket received. Use * shishi_kdcrep_get_ticket() to extract the ticket. This function * verifies the various conditions that must hold if the response is * to be considered valid, specifically it compares nonces * (shishi_kdc_check_nonce()) and if the exchange was a AS exchange, * it also compares cname and crealm (shishi_as_check_cname() and * shishi_as_check_crealm()). * * Usually the shishi_as_process() and shishi_tgs_process() functions * should be used instead, since they simplify the decryption key * computation. * * Return value: Returns SHISHI_OK iff the KDC client exchange was * successful. **/ int shishi_kdc_process (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 * enckdcreppart) { int res; int msgtype; /* If the reply message type is KRB_AS_REP, then the client verifies that the cname and crealm fields in the cleartext portion of the reply match what it requested. If any padata fields are present, they may be used to derive the proper secret key to decrypt the message. The client decrypts the encrypted part of the response using its secret key, verifies that the nonce in the encrypted part matches the nonce it supplied in its request (to detect replays). It also verifies that the sname and srealm in the response match those in the request (or are otherwise expected values), and that the host address field is also correct. It then stores the ticket, session key, start and expiration times, and other information for later use. The key-expiration field from the encrypted part of the response may be checked to notify the user of impending key expiration (the client program could then suggest remedial action, such as a password change). */ msgtype = 0; res = shishi_asn1_read_integer (handle, kdcrep, "msg-type", &msgtype); if (res != SHISHI_OK) return res; if (msgtype == SHISHI_MSGTYPE_AS_REP) { res = shishi_as_check_crealm (handle, kdcreq, kdcrep); if (res != SHISHI_OK) return res; res = shishi_as_check_cname (handle, kdcreq, kdcrep); if (res != SHISHI_OK) return res; } res = shishi_kdcrep_decrypt (handle, kdcrep, key, keyusage, enckdcreppart); if (res != SHISHI_OK) return res; res = shishi_kdc_check_nonce (handle, kdcreq, *enckdcreppart); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/encapreppart.c0000664000000000000000000003231412126660507013300 00000000000000/* encapreppart.c --- Encrypted authentication reply part functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" /** * shishi_encapreppart: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new EncAPRepPart, populated with some * default values. It uses the current time as returned by the system * for the ctime and cusec fields. * * Return value: Returns the encapreppart or NULL on failure. **/ Shishi_asn1 shishi_encapreppart (Shishi * handle) { int res; Shishi_asn1 node = NULL; struct timeval tv; uint32_t seqnr; res = gettimeofday (&tv, NULL); if (res) return NULL; node = shishi_asn1_encapreppart (handle); if (!node) return NULL; res = shishi_asn1_write (handle, node, "ctime", shishi_generalize_time (handle, time (NULL)), 0); if (res != SHISHI_OK) goto error; res = shishi_encapreppart_cusec_set (handle, node, tv.tv_usec % 1000000); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "subkey", NULL, 0); if (res != SHISHI_OK) goto error; /* * For sequence numbers to adequately support the detection of * replays they SHOULD be non-repeating, even across connection * boundaries. The initial sequence number SHOULD be random and * uniformly distributed across the full space of possible sequence * numbers, so that it cannot be guessed by an attacker and so that * it and the successive sequence numbers do not repeat other * sequences. */ shishi_randomize (handle, 0, &seqnr, sizeof (seqnr)); /* * Implementation note: as noted before, some implementations omit * the optional sequence number when its value would be zero. * Implementations MAY accept an omitted sequence number when * expecting a value of zero, and SHOULD NOT transmit an * Authenticator with a initial sequence number of zero. */ if (seqnr == 0) seqnr++; res = shishi_encapreppart_seqnumber_set (handle, node, seqnr); if (res != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_encapreppart_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @encapreppart: EncAPRepPart to print. * * Print ASCII armored DER encoding of EncAPRepPart to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_print (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart) { return _shishi_print_armored_data (handle, fh, encapreppart, "EncAPRepPart", NULL); } /** * shishi_encapreppart_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @encapreppart: EncAPRepPart to save. * * Save DER encoding of EncAPRepPart to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_save (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart) { return _shishi_save_data (handle, fh, encapreppart, "EncAPRepPart"); } /** * shishi_encapreppart_to_file: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write EncAPRepPart to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_to_file (Shishi * handle, Shishi_asn1 encapreppart, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing EncAPRepPart to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing EncAPRepPart in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_encapreppart_print (handle, fh, encapreppart); else res = shishi_encapreppart_save (handle, fh, encapreppart); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing EncAPRepPart to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_encapreppart_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @encapreppart: output variable with newly allocated EncAPRepPart. * * Read ASCII armored DER encoded EncAPRepPart from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_parse (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart) { return _shishi_encapreppart_input (handle, fh, encapreppart, 0); } /** * shishi_encapreppart_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @encapreppart: output variable with newly allocated EncAPRepPart. * * Read DER encoded EncAPRepPart from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_read (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart) { return _shishi_encapreppart_input (handle, fh, encapreppart, 1); } /** * shishi_encapreppart_from_file: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: output variable with newly allocated EncAPRepPart. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read EncAPRepPart from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_from_file (Shishi * handle, Shishi_asn1 * encapreppart, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading EncAPRepPart from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading EncAPRepPart in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_encapreppart_parse (handle, fh, encapreppart); else res = shishi_encapreppart_read (handle, fh, encapreppart); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading EncAPRepPart from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_encapreppart_get_key: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: input EncAPRepPart variable. * @key: newly allocated key. * * Extract the subkey from the encrypted AP-REP part. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encapreppart_get_key (Shishi * handle, Shishi_asn1 encapreppart, Shishi_key ** key) { int res; char *buf; size_t buflen; int32_t keytype; res = shishi_asn1_read_int32 (handle, encapreppart, "subkey.keytype", &keytype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, encapreppart, "subkey.keyvalue", &buf, &buflen); if (res != SHISHI_OK) return res; if (shishi_cipher_keylen (keytype) != buflen) return SHISHI_ENCAPREPPART_BAD_KEYTYPE; res = shishi_key_from_value (handle, keytype, buf, key); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encapreppart_ctime: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @t: newly allocated zero-terminated character array with client time. * * Extract client time from EncAPRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_ctime (Shishi * handle, Shishi_asn1 encapreppart, char **t) { return shishi_time (handle, encapreppart, "ctime", t); } /** * shishi_encapreppart_ctime_set: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @t: string with generalized time value to store in EncAPRepPart. * * Store client time in EncAPRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_ctime_set (Shishi * handle, Shishi_asn1 encapreppart, const char *t) { int res; res = shishi_asn1_write (handle, encapreppart, "ctime", t, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encapreppart_cusec_get: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @cusec: output integer with client microseconds field. * * Extract client microseconds field from EncAPRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_cusec_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * cusec) { int res; res = shishi_asn1_read_uint32 (handle, encapreppart, "cusec", cusec); if (res != SHISHI_OK) return res; return res; } /** * shishi_encapreppart_cusec_set: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @cusec: client microseconds to set in authenticator, 0-999999. * * Set the cusec field in the Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_cusec_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t cusec) { int res; res = shishi_asn1_write_integer (handle, encapreppart, "cusec", cusec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encapreppart_seqnumber_get: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @seqnumber: output integer with sequence number field. * * Extract sequence number field from EncAPRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_seqnumber_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * seqnumber) { int res; res = shishi_asn1_read_uint32 (handle, encapreppart, "seq-number", seqnumber); if (res != SHISHI_OK) return res; return res; } /** * shishi_encapreppart_seqnumber_remove: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: encapreppart as allocated by shishi_encapreppart(). * * Remove sequence number field in EncAPRepPart. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encapreppart_seqnumber_remove (Shishi * handle, Shishi_asn1 encapreppart) { int res; res = shishi_asn1_write (handle, encapreppart, "seq-number", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encapreppart_seqnumber_set: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: encapreppart as allocated by shishi_encapreppart(). * @seqnumber: integer with sequence number field to store in encapreppart. * * Store sequence number field in EncAPRepPart. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encapreppart_seqnumber_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t seqnumber) { int res; res = shishi_asn1_write_uint32 (handle, encapreppart, "seq-number", seqnumber); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encapreppart_time_copy: * @handle: shishi handle as allocated by shishi_init(). * @encapreppart: EncAPRepPart as allocated by shishi_encapreppart(). * @authenticator: Authenticator to copy time fields from. * * Copy time fields from Authenticator into EncAPRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encapreppart_time_copy (Shishi * handle, Shishi_asn1 encapreppart, Shishi_asn1 authenticator) { char *buf; size_t buflen; int res; res = shishi_asn1_read (handle, authenticator, "cusec", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, encapreppart, "cusec", buf, buflen); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, authenticator, "ctime", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, encapreppart, "ctime", buf, buflen); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/cfg.c0000664000000000000000000004330612126660507011356 00000000000000/* cfg.h --- Configuration file functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "cfg.h" #include "low-crypto.h" enum { DEFAULT_REALM_OPTION = 0, DEFAULT_PRINCIPAL_OPTION, CLIENT_KDC_ETYPES_OPTION, REALM_KDC_OPTION, SERVER_REALM_OPTION, KDC_TIMEOUT_OPTION, KDC_RETRIES_OPTION, TICKET_LIFE_OPTION, RENEW_LIFE_OPTION, AUTHORIZATION_TYPES_OPTION, VERBOSE_CRYPTO_NOISE_OPTION, VERBOSE_CRYPTO_OPTION, VERBOSE_ASN1_OPTION, VERBOSE_NOISE_OPTION, VERBOSE_OPTION, STRINGPROCESS_OPTION, QUICK_RANDOM, THE_END }; static const char *const _shishi_opts[] = { /* [DEFAULT_REALM_OPTION] = */ "default-realm", /* [DEFAULT_PRINCIPAL_OPTION] = */ "default-principal", /* [CLIENT_KDC_ETYPES_OPTION] = */ "client-kdc-etypes", /* [REALM_KDC_OPTION] = */ "realm-kdc", /* [SERVER_REALM_OPTION] = */ "server-realm", /* [KDC_TIMEOUT_OPTION] = */ "kdc-timeout", /* [KDC_RETRIES_OPTION] = */ "kdc-retries", /* [TICKET_LIFE_OPTION] = */ "ticket-life", /* [RENEW_LIFE_OPTION] = */ "renew-life", /* [AUTHORIZATION_TYPES_OPTION] = */ "authorization-types", /* [VERBOSE_CRYPTO_NOISE_OPTION] = */ "verbose-crypto-noise", /* [VERBOSE_CRYPTO_OPTION] = */ "verbose-crypto", /* [VERBOSE_ASN1_OPTION] = */ "verbose-asn1", /* [VERBOSE_NOISE_OPTION] = */ "verbose-noise", /* [VERBOSE_OPTION] = */ "verbose", /* [STRINGPROCESS_OPTION] = */ "stringprocess", /* [QUICK_RANDOM] = */ "quick-random", /* [THE_END] = */ NULL }; struct Shishi_realminfo * _shishi_realminfo (Shishi * handle, const char *realm) { size_t i; for (i = 0; i < handle->nrealminfos; i++) if (strcmp (realm, handle->realminfos[i].name) == 0) return &handle->realminfos[i]; return NULL; } struct Shishi_realminfo * _shishi_realminfo_new (Shishi * handle, char *realm) { struct Shishi_realminfo *ri; ri = _shishi_realminfo (handle, realm); if (ri) return ri; handle->realminfos = xrealloc (handle->realminfos, (++handle->nrealminfos) * sizeof (*handle->realminfos)); ri = &handle->realminfos[handle->nrealminfos - 1]; memset (ri, 0, sizeof (*ri)); ri->name = realm; return ri; } /** * shishi_cfg: * @handle: Shishi library handle create by shishi_init(). * @option: string with shishi library option. * * Configure shishi library with given option. * * Return Value: Returns SHISHI_OK if option was valid. **/ int shishi_cfg (Shishi * handle, const char *option) { char *opt = option ? xstrdup (option) : NULL; char *p = opt; char *value; int res; size_t i; while (p != NULL && *p != '\0') { switch (getsubopt (&p, (char *const *) _shishi_opts, &value)) { case KDC_TIMEOUT_OPTION: if (value && atoi (value) > 0) handle->kdctimeout = atoi (value); else if (value) shishi_warn (handle, "Invalid KDC timeout value: `%s'", value); else shishi_warn (handle, "Missing KDC timeout value"); break; case KDC_RETRIES_OPTION: if (value && atoi (value) > 0) handle->kdcretries = atoi (value); else if (value) shishi_warn (handle, "Invalid KDC retries value: `%s'", value); else shishi_warn (handle, "Missing KDC retries value"); break; case TICKET_LIFE_OPTION: { time_t now = time (NULL); time_t then = shishi_get_date (value, &now); int diff = difftime (then, now); if (value && then != -1 && diff > 0) handle->ticketlife = diff; else if (diff <= 0 && diff + 60 * 60 * 24 > 0) /* Hack to support "17:00" as always meaning the next 17:00. */ handle->ticketlife = 60 * 60 * 24 + diff; else if (diff <= 0) shishi_warn (handle, "Negative ticket life date: `%s'", value); else if (then == -1) shishi_warn (handle, "Invalid ticket life date: `%s'", value); else shishi_warn (handle, "Missing ticket life value"); } break; case RENEW_LIFE_OPTION: { time_t now = time (NULL); time_t then = shishi_get_date (value, &now); int diff = difftime (then, now); if (value && then != -1 && diff > 0) handle->renewlife = diff; else if (diff <= 0) shishi_warn (handle, "Negative renew life date: `%s'", value); else if (then == -1) shishi_warn (handle, "Invalid renew life date: `%s'", value); else shishi_warn (handle, "Missing renew life value"); } break; case REALM_KDC_OPTION: { struct Shishi_realminfo *ri; char *realm = NULL; char *protstr; int transport = UDP; int add_realm = 1; realm = xstrdup (value); for (i = 0; i < handle->nrealminfos; i++) if (strcmp (realm, handle->realminfos[i].name) == 0) { if (handle->realminfos[i].nkdcaddresses > 0 || handle->realminfos[i].kdcaddresses) { free (handle->realminfos[i].kdcaddresses); handle->realminfos[i].kdcaddresses = NULL; handle->realminfos[i].nkdcaddresses = 0; ri = &handle->realminfos[i]; add_realm = 0; } break; } if (add_realm) { handle->realminfos = xrealloc (handle->realminfos, (handle->nrealminfos + 1) * sizeof (*handle->realminfos)); memset (&handle->realminfos[handle->nrealminfos], 0, sizeof (handle->realminfos[handle->nrealminfos])); handle->realminfos[handle->nrealminfos].name = realm; ri = &handle->realminfos[handle->nrealminfos]; handle->nrealminfos++; } if ((protstr = strchr (p, '/'))) { *protstr = '\0'; protstr++; if (strcasecmp (protstr, "udp") == 0) transport = UDP; else if (strcasecmp (protstr, "tcp") == 0) transport = TCP; else if (strcasecmp (protstr, "tls") == 0) transport = TLS; else shishi_warn (handle, "Ignoring unknown KDC transport: %s", protstr); } ri->kdcaddresses = xrealloc (ri->kdcaddresses, (ri->nkdcaddresses + 1) * sizeof (*ri->kdcaddresses)); ri->kdcaddresses[ri->nkdcaddresses].transport = transport; ri->kdcaddresses[ri->nkdcaddresses].hostname = xstrdup (p); if ((protstr = strchr (value, ':'))) { *protstr = '\0'; protstr++; ri->kdcaddresses[ri->nkdcaddresses].port = protstr; } else ri->kdcaddresses[ri->nkdcaddresses].port = NULL; ri->nkdcaddresses++; p = NULL; /* Done with suboptions. */ } break; case SERVER_REALM_OPTION: { struct Shishi_realminfo *ri; char *subopts, *part, *next; if (!p || (*p == 0)) { shishi_warn (handle, "Empty server-realm for '%s'.", value); break; } ri = _shishi_realminfo_new (handle, xstrdup (value)); part = subopts = xstrdup (p); /* List of patterns. */ while (part && *part) { next = strchr (part, ','); if (next) *(next++) = '\0'; ri->serverwildcards = xrealloc (ri->serverwildcards, ++ri->nserverwildcards * sizeof (*ri->serverwildcards)); ri->serverwildcards[ri->nserverwildcards - 1] = xstrdup (part); part = next; } p = NULL; /* Done with suboptions. */ } break; case DEFAULT_REALM_OPTION: handle->default_realm = xstrdup (value); break; case DEFAULT_PRINCIPAL_OPTION: handle->default_principal = xstrdup (value); break; case CLIENT_KDC_ETYPES_OPTION: res = shishi_cfg_clientkdcetype_set (handle, value); if (res != SHISHI_OK) goto out; break; case AUTHORIZATION_TYPES_OPTION: res = shishi_cfg_authorizationtype_set (handle, value); if (res != SHISHI_OK) goto out; break; case STRINGPROCESS_OPTION: free (handle->stringprocess); handle->stringprocess = xstrdup (value); break; case QUICK_RANDOM: _shishi_quick_random (); break; case VERBOSE_OPTION: handle->verbose = value && atoi (value) ? atoi (value) : ~0 & ~VERBOSES; break; case VERBOSE_CRYPTO_NOISE_OPTION: handle->verbose |= SHISHI_VERBOSE_CRYPTO_NOISE; break; case VERBOSE_CRYPTO_OPTION: handle->verbose |= SHISHI_VERBOSE_CRYPTO; break; case VERBOSE_ASN1_OPTION: handle->verbose |= SHISHI_VERBOSE_ASN1; break; case VERBOSE_NOISE_OPTION: handle->verbose |= SHISHI_VERBOSE_NOISE; break; case -1: if (!value) break; /* fall through */ default: shishi_warn (handle, "Unknown option: `%s'", value); break; } } res = SHISHI_OK; out: free (opt); return res; } /** * shishi_cfg_from_file: * @handle: Shishi library handle create by shishi_init(). * @cfg: filename to read configuration from. * * Configure shishi library using configuration file. * * Return Value: Returns %SHISHI_OK iff successful. **/ int shishi_cfg_from_file (Shishi * handle, const char *cfg) { char *line = NULL; size_t len = 0; FILE *fh; if (cfg == NULL) return SHISHI_OK; fh = fopen (cfg, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; while (!feof (fh)) { ssize_t n = getline (&line, &len, fh); char *p = line; char *q; if (n <= 0) /* End of file or error. */ break; while (strlen (p) > 0 && (p[strlen (p) - 1] == '\n' || p[strlen (p) - 1] == '\r')) p[strlen (p) - 1] = '\0'; while (*p && strchr (" \t\r\n", *p)) p++; if (*p == '\0' || *p == '#') continue; q = strchr (p, ' '); if (q && (strchr (p, '=') == NULL || q < strchr (p, '='))) *q = '='; shishi_cfg (handle, p); } free (line); if (ferror (fh)) shishi_error_printf (handle, "Error reading configuration file"); if (fclose (fh) != 0) return SHISHI_IO_ERROR; return SHISHI_OK; } const char * _shishi_transport2string (int transport) { if (transport == UDP) return "UDP"; else if (transport == TCP) return "TCP"; else if (transport == TLS) return "TLS"; else return "UNKNOWN"; } /** * shishi_cfg_print: * @handle: Shishi library handle create by shishi_init(). * @fh: file descriptor opened for writing. * * Print library configuration status, mostly for debugging purposes. * * Return Value: Returns SHISHI_OK. **/ int shishi_cfg_print (Shishi * handle, FILE * fh) { size_t i, j; time_t tmp, now = time (NULL); fprintf (fh, "Shishi initial library configuration:\n"); fprintf (fh, "\tDefault realm: %s\n", handle->default_realm ? handle->default_realm : "(NULL)"); fprintf (fh, "\tDefault principal: %s\n", handle->default_principal ? handle->default_principal : "(NULL)"); fprintf (fh, "\tClient KDC etypes:"); for (i = 0; i < handle->nclientkdcetypes; i++) fprintf (fh, " %s", shishi_cipher_name (handle->clientkdcetypes[i])); fprintf (fh, "\n"); fprintf (fh, "\tVerbose: %d\n", handle->verbose); tmp = now + handle->ticketlife; fprintf (fh, "\tTicket life: %d seconds. %s", handle->ticketlife, ctime (&tmp)); tmp = now + handle->renewlife; fprintf (fh, "\tRenew life: %d seconds. %s", handle->renewlife, ctime (&tmp)); for (i = 0; i < handle->nrealminfos; i++) { fprintf (fh, "\tKDCs for realm %s:\n", handle->realminfos[i].name); for (j = 0; j < handle->realminfos[i].nkdcaddresses; j++) fprintf (fh, "\t\tTransport %s host %s port %s\n", _shishi_transport2string (handle->realminfos[i]. kdcaddresses[j].transport), handle->realminfos[i].kdcaddresses[j].hostname, handle->realminfos[i].kdcaddresses[j].port); } return SHISHI_OK; } /** * shishi_cfg_default_systemfile: * @handle: Shishi library handle create by shishi_init(). * * The system configuration file name is decided at compile-time, but * may be overridden by the environment variable SHISHI_CONFIG. * * Return value: Return system configuration file name. **/ const char * shishi_cfg_default_systemfile (Shishi * handle) { char *file; file = getenv ("SHISHI_CONFIG"); if (file) return file; return SYSTEMCFGFILE; } #define BASE_DIR "/.shishi" /** * shishi_cfg_default_userdirectory: * @handle: Shishi library handle create by shishi_init(). * * The default user directory (used for, e.g. Shishi ticket cache) is * normally computed by appending BASE_DIR ("/.shishi") to the content * of the environment variable $HOME, but can be overridden by * specifying the complete path in the environment variable * SHISHI_HOME. * * Return value: Return directory with configuration files etc. **/ const char * shishi_cfg_default_userdirectory (Shishi * handle) { char *home; char *envdir; envdir = getenv ("SHISHI_HOME"); if (envdir) return envdir; if (!handle->userdirectory) { home = getenv ("HOME"); asprintf (&handle->userdirectory, "%s%s", home ? home : "", BASE_DIR); } return handle->userdirectory; } /** * shishi_cfg_userdirectory_file: * @handle: Shishi library handle create by shishi_init(). * @file: basename of file to find in user directory. * * Get the full path to specified @file in the users' configuration * directory. * * Return value: Return full path to given relative filename, relative * to the user specific Shishi configuration directory as returned * by shishi_cfg_default_userdirectory() (typically $HOME/.shishi). **/ char * shishi_cfg_userdirectory_file (Shishi * handle, const char *file) { char *out; asprintf (&out, "%s/%s", shishi_cfg_default_userdirectory (handle), file); return out; } #define USERCFG_FILE "shishi.conf" /** * shishi_cfg_default_userfile: * @handle: Shishi library handle create by shishi_init(). * * Get filename of default user configuration file, typically * $HOME/shishi.conf. * * Return value: Return user configuration filename. **/ const char * shishi_cfg_default_userfile (Shishi * handle) { if (!handle->usercfgfile) handle->usercfgfile = shishi_cfg_userdirectory_file (handle, USERCFG_FILE); return handle->usercfgfile; } /** * shishi_cfg_clientkdcetype: * @handle: Shishi library handle create by shishi_init(). * @etypes: output array with encryption types. * * Set the etypes variable to the array of preferred client etypes. * * Return value: Return the number of encryption types in the array, * 0 means none. **/ int shishi_cfg_clientkdcetype (Shishi * handle, int32_t ** etypes) { *etypes = handle->clientkdcetypes; return handle->nclientkdcetypes; } /** * shishi_cfg_clientkdcetype_fast: * @handle: Shishi library handle create by shishi_init(). * * Extract the default etype from the list of preferred client etypes. * * Return value: Return the default encryption types. **/ int32_t shishi_cfg_clientkdcetype_fast (Shishi * handle) { if (handle->nclientkdcetypes > 0) return handle->clientkdcetypes[0]; else return SHISHI_AES256_CTS_HMAC_SHA1_96; } /** * shishi_cfg_clientkdcetype_set: * @handle: Shishi library handle created by shishi_init(). * @value: string with encryption types. * * Set the "client-kdc-etypes" configuration option from given string. * The string contains encryption types (integer or names) separated * by comma or whitespace, e.g. "aes256-cts-hmac-sha1-96 * des3-cbc-sha1-kd des-cbc-md5". * * Return value: Returns SHISHI_OK if successful. **/ int shishi_cfg_clientkdcetype_set (Shishi * handle, char *value) { char *ptrptr; char *val, *tmpvalue; int i; int tot = 0; int rc = SHISHI_INVALID_ARGUMENT; if (value == NULL || *value == '\0') return SHISHI_OK; tmpvalue = xstrdup (value); for (i = 0; (val = strtok_r (i == 0 ? tmpvalue : NULL, ", \t", &ptrptr)); i++) { int etype = shishi_cipher_parse (val); if (etype == -1) shishi_warn (handle, "Ignoring unknown encryption type: `%s'", val); else { int *new; tot++; new = xrealloc (handle->clientkdcetypes, tot * sizeof (*handle->clientkdcetypes)); handle->clientkdcetypes = new; handle->clientkdcetypes[tot - 1] = etype; handle->nclientkdcetypes = tot; rc = SHISHI_OK; /* At least one valid type. */ } } free (tmpvalue); return rc; } /** * shishi_cfg_authorizationtype_set: * @handle: Shishi library handle created by shishi_init(). * @value: string with authorization types. * * Set the "authorization-types" configuration option from given string. * The string contains authorization types (integer or names) separated * by comma or whitespace, e.g. "basic k5login". * * Return value: Returns SHISHI_OK if successful. **/ int shishi_cfg_authorizationtype_set (Shishi * handle, char *value) { char *ptrptr; char *val, *tmpvalue; int i; int tot = 0; int rc = SHISHI_INVALID_ARGUMENT; if (value == NULL || *value == '\0') return SHISHI_OK; tmpvalue = xstrdup (value); for (i = 0; (val = strtok_r (i == 0 ? tmpvalue : NULL, ", \t", &ptrptr)); i++) { int atype = shishi_authorization_parse (val); if (atype == -1) shishi_warn (handle, "Ignoring unknown authorization type: `%s'", val); else { int *new; tot++; new = xrealloc (handle->authorizationtypes, tot * sizeof (*handle->authorizationtypes)); handle->authorizationtypes = new; handle->authorizationtypes[tot - 1] = atype; handle->nauthorizationtypes = tot; rc = SHISHI_OK; /* At least one valid type. */ } } free (tmpvalue); return rc; } shishi-1.0.2/lib/tktccache.c0000664000000000000000000003624412126660507012553 00000000000000/* ccache.c --- Credential Cache compatibility ticket set handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include "ccache.h" #include "utils.h" /** * shishi_tkts_default_ccache_guess: * @handle: Shishi library handle create by shishi_init(). * * Guesses the default ccache ticket filename; it is the contents of * the environment variable KRB5CCNAME or /tmp/krb5cc_UID where UID is * the user's identity in decimal, as returned by getuid(). * * Return value: Returns default ccache filename as a string that has * to be deallocated with free() by the caller. **/ char * shishi_tkts_default_ccache_guess (Shishi * handle) { char *envfile; envfile = getenv ("KRB5CCNAME"); if (envfile) return xstrdup (envfile); #if HAVE_GETUID return xasprintf ("/tmp/krb5cc_%lu", (unsigned long) getuid ()); #else return xasprintf ("/tmp/krb5cc_0"); #endif } /** * shishi_tkts_default_ccache: * @handle: Shishi library handle create by shishi_init(). * * Get filename of default ccache filename. * * Return value: Returns the default ccache filename used in the * library. The string is not a copy, so don't modify or deallocate * it. **/ const char * shishi_tkts_default_ccache (Shishi * handle) { if (!handle->ccachedefault) { char *p; p = shishi_tkts_default_ccache_guess (handle); shishi_tkts_default_ccache_set (handle, p); free (p); } return handle->ccachedefault; } /** * shishi_tkts_default_ccache_set: * @handle: Shishi library handle create by shishi_init(). * @ccache: string with new default ccache filename, or * NULL to reset to default. * * Set the default ccache filename used in the library. The string is * copied into the library, so you can dispose of the variable * immediately after calling this function. **/ void shishi_tkts_default_ccache_set (Shishi * handle, const char *ccache) { free (handle->ccachedefault); if (ccache) handle->ccachedefault = xstrdup (ccache); else handle->ccachedefault = NULL; } /** * shishi_tkts_add_ccache_mem: * @handle: shishi handle as allocated by shishi_init(). * @data: constant memory buffer with ccache of @len size. * @len: size of memory buffer with ccache data. * @tkts: allocated key set to store tickets in. * * Read tickets from a ccache data structure, and add them to the * ticket set. * * The ccache format is proprietary, and this function support (at * least) the 0x0504 format. See the section The Credential Cache * Binary File Format in the Shishi manual for a description of the * file format. * * Returns: Returns %SHISHI_CCACHE_ERROR if the data does not * represent a valid ccache structure, and %SHISHI_OK on success. **/ int shishi_tkts_add_ccache_mem (Shishi * handle, const char *data, size_t len, Shishi_tkts * tkts) { int rc = SHISHI_OK; struct ccache ccache; if (VERBOSENOISE (handle)) { printf ("ccache len %d (0x%x)\n", len, len); _shishi_hexprint (data, len); } rc = ccache_parse (data, len, &ccache); if (rc < 0) return SHISHI_CCACHE_ERROR; if (VERBOSENOISE (handle)) ccache_print (&ccache); while (ccache.credentialslen) { struct ccache_credential cred; Shishi_tkt *tkt; Shishi_asn1 ticket; size_t n; rc = ccache_parse_credential (ccache.credentials, ccache.credentialslen, &cred, &n); if (rc < 0) return SHISHI_CCACHE_ERROR; if (VERBOSENOISE (handle)) ccache_print_credential (&cred); /* Sanity check credential first. */ if (shishi_cipher_keylen (cred.key.keytype) != cred.key.keylen) continue; ticket = shishi_der2asn1_ticket (handle, cred.ticket.data, cred.ticket.length); if (!ticket) continue; /* Let's create a new ticket... */ rc = shishi_tkt (handle, &tkt); if (rc != SHISHI_OK) return rc; shishi_tkt_ticket_set (tkt, ticket); { const char *cname[CCACHE_MAX_COMPONENTS + 1]; size_t i; for (i = 0; i < cred.client.num_components && i < CCACHE_MAX_COMPONENTS; i++) cname[i] = cred.client.components[i].data; cname[i] = NULL; rc = shishi_kdcrep_crealm_set (handle, shishi_tkt_kdcrep (tkt), cred.client.realm.data); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_cname_set (handle, shishi_tkt_kdcrep (tkt), cred.client.name_type, cname); if (rc != SHISHI_OK) return rc; } { char *sname[CCACHE_MAX_COMPONENTS + 1]; size_t i; for (i = 0; i < cred.server.num_components && i < CCACHE_MAX_COMPONENTS; i++) sname[i] = cred.server.components[i].data; sname[i] = NULL; rc = shishi_enckdcreppart_srealm_set (handle, shishi_tkt_enckdcreppart (tkt), cred.server.realm.data); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_sname_set (handle, shishi_tkt_enckdcreppart (tkt), cred.server.name_type, sname); if (rc != SHISHI_OK) return rc; } rc = shishi_tkt_flags_set (tkt, cred.tktflags); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_authtime_set (handle, shishi_tkt_enckdcreppart (tkt), shishi_generalize_time (handle, cred.authtime)); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_starttime_set (handle, shishi_tkt_enckdcreppart (tkt), cred.starttime ? shishi_generalize_time (handle, cred.starttime) : NULL); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_endtime_set (handle, shishi_tkt_enckdcreppart (tkt), shishi_generalize_time (handle, cred.endtime)); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_renew_till_set (handle, shishi_tkt_enckdcreppart (tkt), cred.renew_till ? shishi_generalize_time (handle, cred.renew_till) : NULL); if (rc != SHISHI_OK) return rc; { uint32_t nonce = 0; rc = shishi_enckdcreppart_nonce_set (handle, shishi_tkt_enckdcreppart (tkt), nonce); if (rc != SHISHI_OK) return rc; } rc = shishi_kdcrep_set_ticket (handle, shishi_tkt_kdcrep (tkt), shishi_tkt_ticket (tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_set_enc_part (handle, shishi_tkt_kdcrep (tkt), 0, 0, "", 0); if (rc != SHISHI_OK) return rc; /* Add key. */ { Shishi_key *key; rc = shishi_key (handle, &key); if (rc != SHISHI_OK) return rc; shishi_key_type_set (key, cred.key.keytype); shishi_key_value_set (key, cred.key.keyvalue); rc = shishi_tkt_key_set (tkt, key); if (rc != SHISHI_OK) return rc; shishi_key_done (key); } /* Add new ticket to the set... */ rc = shishi_tkts_add (tkts, tkt); if (rc != SHISHI_OK) return rc; ccache.credentials += n; ccache.credentialslen -= n; } #if 0 { char *data; size_t len; rc = shishi_tkts_to_ccache_mem (handle, tkts, &data, &len); printf ("gaah res %d\n", rc); } #endif return rc; } /** * shishi_tkts_add_ccache_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: name of file to read. * @tkts: allocated ticket set to store tickets in. * * Read tickets from a ccache data structure, and add them to the * ticket set. * * The ccache format is proprietary, and this function support (at * least) the 0x0504 format. See the section The Credential Cache * Binary File Format in the Shishi manual for a description of the * file format. * * Returns: Returns %SHISHI_IO_ERROR if the file cannot be read, * %SHISHI_CCACHE_ERROR if the data cannot be parsed as a valid ccache * structure, and %SHISHI_OK on success. **/ int shishi_tkts_add_ccache_file (Shishi * handle, const char *filename, Shishi_tkts * tkts) { size_t len; char *ccache = read_binary_file (filename, &len); int rc; if (!ccache) return SHISHI_IO_ERROR; rc = shishi_tkts_add_ccache_mem (handle, ccache, len, tkts); free (ccache); return rc; } /** * shishi_tkts_from_ccache_mem: * @handle: shishi handle as allocated by shishi_init(). * @data: constant memory buffer with ccache of @len size. * @len: size of memory buffer with ccache data. * @outtkts: pointer to ticket set that will be allocated and populated, * must be deallocated by caller on succes. * * Read tickets from a ccache data structure, and add them to the * ticket set. * * The ccache format is proprietary, and this function support (at * least) the 0x0504 format. See the section The Credential Cache * Binary File Format in the Shishi manual for a description of the * file format. * * Returns: Returns %SHISHI_CCACHE_ERROR if the data does not * represent a valid ccache structure, and %SHISHI_OK on success. **/ int shishi_tkts_from_ccache_mem (Shishi * handle, const char *data, size_t len, Shishi_tkts ** outtkts) { int rc; rc = shishi_tkts (handle, outtkts); if (rc != SHISHI_OK) return rc; rc = shishi_tkts_add_ccache_mem (handle, data, len, *outtkts); if (rc != SHISHI_OK) { shishi_tkts_done (outtkts); return rc; } return SHISHI_OK; } /** * shishi_tkts_from_ccache_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: name of file to read. * @outtkts: pointer to ticket set that will be allocated and populated, * must be deallocated by caller on succes. * * Read tickets from a ccache data structure, and add them to the * ticket set. * * The ccache format is proprietary, and this function support (at * least) the 0x0504 format. See the section The Credential Cache * Binary File Format in the Shishi manual for a description of the * file format. * * Returns: Returns %SHISHI_IO_ERROR if the file cannot be read, * %SHISHI_CCACHE_ERROR if the data cannot be parsed as a valid ccache * structure, and %SHISHI_OK on success. **/ int shishi_tkts_from_ccache_file (Shishi * handle, const char *filename, Shishi_tkts ** outtkts) { int rc; rc = shishi_tkts (handle, outtkts); if (rc != SHISHI_OK) return rc; rc = shishi_tkts_add_ccache_file (handle, filename, *outtkts); if (rc != SHISHI_OK) { shishi_tkts_done (outtkts); return rc; } return SHISHI_OK; } extern int shishi_tkt_to_ccache_mem (Shishi * handle, Shishi_tkt * tkt, char **data, size_t * len); int shishi_tkt_to_ccache_mem (Shishi * handle, Shishi_tkt * tkt, char **data, size_t * len) { #if 0 struct ccache_credential cred; char tmp[1024]; size_t i; int rc; memset (&cred, 0, sizeof (cred)); rc = shishi_asn1_to_der (handle, shishi_tkt_ticket (tkt), &cred.ticket.data, &cred.ticket.length); if (rc != SHISHI_OK) return rc; /* Sanity check credential first. */ if (shishi_key_length (shishi_tkt_key (tkt)) > CCACHE_MAX_KEYLEN) return SHISHI_CCACHE_ERROR; rc = shishi_asn1_read (handle, shishi_tkt_kdcrep (tkt), "crealm", &cred.client.realm.data, &cred.client.realm.length); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_read (handle, shishi_tkt_enckdcreppart (tkt), "srealm", &cred.server.realm.data, &cred.server.realm.length); if (rc != SHISHI_OK) return rc; return SHISHI_OK; #if 0 { char *cname[CCACHE_MAX_COMPONENTS + 1]; size_t i; for (i = 0; i < cred.client.num_components && i < CCACHE_MAX_COMPONENTS; i++) cname[i] = cred.client.components[i].data; cname[i] = NULL; rc = shishi_kdcrep_crealm_set (handle, shishi_tkt_kdcrep (tkt), cred.client.realm.data); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_cname_set (handle, shishi_tkt_kdcrep (tkt), cred.client.name_type, cname); if (rc != SHISHI_OK) return rc; } { char *sname[CCACHE_MAX_COMPONENTS + 1]; size_t i; for (i = 0; i < cred.server.num_components && i < CCACHE_MAX_COMPONENTS; i++) sname[i] = cred.server.components[i].data; sname[i] = NULL; rc = shishi_enckdcreppart_srealm_set (handle, shishi_tkt_enckdcreppart (tkt), cred.server.realm.data); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_sname_set (handle, shishi_tkt_enckdcreppart (tkt), cred.server.name_type, sname); if (rc != SHISHI_OK) return rc; } #endif rc = shishi_tkt_flags (tkt, &cred.tktflags); if (rc != SHISHI_OK) return rc; { time_t t; rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt), "authtime", &t); if (rc != SHISHI_OK) return rc; cred.authtime = t; } { time_t t; rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt), "starttime", &t); if (rc == SHISHI_ASN1_NO_ELEMENT) cred.starttime = 0; else if (rc != SHISHI_OK) return rc; cred.starttime = t; } { time_t t; rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt), "endtime", &t); if (rc != SHISHI_OK) return rc; cred.endtime = t; } { time_t t; rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt), "renew-till", &t); if (rc == SHISHI_ASN1_NO_ELEMENT) cred.renew_till = 0; else if (rc != SHISHI_OK) return rc; cred.renew_till = t; } cred.key.keylen = shishi_key_length (shishi_tkt_key (tkt)); cred.key.keytype = shishi_key_type (shishi_tkt_key (tkt)); memcpy (cred.key.storage, shishi_key_value (shishi_tkt_key (tkt)), shishi_key_length (shishi_tkt_key (tkt))); cred.key.keyvalue = &cred.key.storage[0]; i = 1024; rc = ccache_pack_credential (&cred, tmp, &i); printf ("rc %d len %d\n", rc, i); { struct ccache_credential foo; size_t n; rc = ccache_parse_credential (tmp, i, &foo, &n); if (rc < 0) return SHISHI_CCACHE_ERROR; printf ("packed:"); ccache_print_credential (&foo); } _shishi_escapeprint (tmp, i); #endif return SHISHI_CCACHE_ERROR; } extern int shishi_tkts_to_ccache_mem (Shishi * handle, Shishi_tkts * tkts, char **data, size_t * len); int shishi_tkts_to_ccache_mem (Shishi * handle, Shishi_tkts * tkts, char **data, size_t * len) { return SHISHI_CCACHE_ERROR; #if 0 struct ccache info; int rc = SHISHI_OK; size_t i; for (i = 0; i < shishi_tkts_size (tkts); i++) { Shishi_tkt *tkt = shishi_tkts_nth (tkts, i); struct ccache_credential cred; printf ("ccache %d\n", i); if (!tkt) return SHISHI_INVALID_TKTS; rc = shishi_tkt_to_ccache_mem (handle, tkt, data, len); printf ("f %d\n", rc); } memset (&info, 0, sizeof (info)); rc = ccache_pack (&info, *data, *len); printf ("pack res %d len %d\n", rc, *len); return rc; #endif } shishi-1.0.2/lib/tkts.c0000644000000000000000000010621312126663607011603 00000000000000/* tkts.c --- Ticket set handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include struct Shishi_tkts { Shishi *handle; Shishi_tkt **tkts; int ntkts; }; #define TICKET_FILE "tickets" /** * shishi_tkts_default_file_guess: * @handle: Shishi library handle create by shishi_init(). * * Guesses the default ticket filename; it is $SHISHI_TICKETS, * $SHISHI_HOME/tickets, or $HOME/.shishi/tickets. * * Return value: Returns default tkts filename as a string that * has to be deallocated with free() by the caller. **/ char * shishi_tkts_default_file_guess (Shishi * handle) { char *envfile; envfile = getenv ("SHISHI_TICKETS"); if (envfile) return xstrdup (envfile); return shishi_cfg_userdirectory_file (handle, TICKET_FILE); } /** * shishi_tkts_default_file: * @handle: Shishi library handle create by shishi_init(). * * Get filename of default ticket set. * * Return value: Returns the default ticket set filename used in the * library. The string is not a copy, so don't modify or deallocate * it. **/ const char * shishi_tkts_default_file (Shishi * handle) { if (!handle->tktsdefaultfile) { char *p; p = shishi_tkts_default_file_guess (handle); shishi_tkts_default_file_set (handle, p); free (p); } return handle->tktsdefaultfile; } /** * shishi_tkts_default_file_set: * @handle: Shishi library handle create by shishi_init(). * @tktsfile: string with new default tkts file name, or * NULL to reset to default. * * Set the default ticket set filename used in the library. The * string is copied into the library, so you can dispose of the * variable immediately after calling this function. **/ void shishi_tkts_default_file_set (Shishi * handle, const char *tktsfile) { free (handle->tktsdefaultfile); if (tktsfile) handle->tktsdefaultfile = xstrdup (tktsfile); else handle->tktsdefaultfile = NULL; } /** * shishi_tkts_default: * @handle: Shishi library handle create by shishi_init(). * * Get the default ticket set for library handle. * * Return value: Return the handle global ticket set. **/ Shishi_tkts * shishi_tkts_default (Shishi * handle) { if (handle->tkts == NULL && (shishi_tkts (handle, &handle->tkts) != SHISHI_OK)) handle->tkts = NULL; return handle->tkts; } int shishi_tkts_default_to_file (Shishi_tkts * tkts) { return shishi_tkts_to_file (tkts, shishi_tkts_default_file (tkts->handle)); } /** * shishi_tkts: * @handle: shishi handle as allocated by shishi_init(). * @tkts: output pointer to newly allocated tkts handle. * * Get a new ticket set handle. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts (Shishi * handle, Shishi_tkts ** tkts) { *tkts = xcalloc (1, sizeof (**tkts)); (*tkts)->handle = handle; return SHISHI_OK; } /** * shishi_tkts_done: * @tkts: ticket set handle as allocated by shishi_tkts(). * * Deallocates all resources associated with ticket set. The ticket * set handle must not be used in calls to other shishi_tkts_*() * functions after this. **/ void shishi_tkts_done (Shishi_tkts ** tkts) { if (!tkts || !*tkts) return; if ((*tkts)->tkts) free ((*tkts)->tkts); free (*tkts); *tkts = NULL; return; } /** * shishi_tkts_size: * @tkts: ticket set handle as allocated by shishi_tkts(). * * Get size of ticket set. * * Return value: Returns number of tickets stored in ticket set. **/ int shishi_tkts_size (Shishi_tkts * tkts) { return tkts ? tkts->ntkts : -1; } /** * shishi_tkts_nth: * @tkts: ticket set handle as allocated by shishi_tkts(). * @ticketno: integer indicating requested ticket in ticket set. * * Get the n:th ticket in ticket set. * * Return value: Returns a ticket handle to the ticketno:th ticket in * the ticket set, or NULL if ticket set is invalid or ticketno is * out of bounds. The first ticket is ticketno 0, the second * ticketno 1, and so on. **/ Shishi_tkt * shishi_tkts_nth (Shishi_tkts * tkts, int ticketno) { if (tkts == NULL || ticketno >= tkts->ntkts) return NULL; return tkts->tkts[ticketno]; } /** * shishi_tkts_remove: * @tkts: ticket set handle as allocated by shishi_tkts(). * @ticketno: ticket number of ticket in the set to remove. The first * ticket is ticket number 0. * * Remove a ticket, indexed by @ticketno, in ticket set. * * Return value: %SHISHI_OK if successful or if @ticketno larger than * size of ticket set. **/ int shishi_tkts_remove (Shishi_tkts * tkts, int ticketno) { if (!tkts) return SHISHI_INVALID_TKTS; if (ticketno >= tkts->ntkts) return SHISHI_OK; if (ticketno < tkts->ntkts) memmove (&tkts->tkts[ticketno], &tkts->tkts[ticketno + 1], sizeof (*tkts->tkts) * (tkts->ntkts - ticketno - 1)); --tkts->ntkts; if (tkts->ntkts > 0) { tkts->tkts = xrealloc (tkts->tkts, sizeof (*tkts->tkts) * tkts->ntkts); } else { free (tkts->tkts); tkts->tkts = NULL; } return SHISHI_OK; } /** * shishi_tkts_add: * @tkts: ticket set handle as allocated by shishi_tkts(). * @tkt: ticket to be added to ticket set. * * Add a ticket to the ticket set. Only the pointer is stored, so if * you modify @tkt, the ticket in the ticket set will also be * modified. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_add (Shishi_tkts * tkts, Shishi_tkt * tkt) { if (!tkt) return SHISHI_INVALID_TICKET; if (tkts->ntkts++ == 0) tkts->tkts = xmalloc (sizeof (*tkts->tkts)); else tkts->tkts = xrealloc (tkts->tkts, sizeof (*tkts->tkts) * tkts->ntkts); tkts->tkts[tkts->ntkts - 1] = tkt; return SHISHI_OK; } /** * shishi_tkts_new: * @tkts: ticket set handle as allocated by shishi_tkts(). * @ticket: input ticket variable. * @enckdcreppart: input ticket detail variable. * @kdcrep: input KDC-REP variable. * * Allocate a new ticket and add it to the ticket set. * * Note that @ticket, @enckdcreppart and @kdcrep are stored by * reference, so you must not de-allocate them before the ticket is * removed from the ticket set and de-allocated. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_new (Shishi_tkts * tkts, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep) { Shishi_tkt *tkt; int res; /* XXX Who will de-allocate these? */ tkt = shishi_tkt2 (tkts->handle, ticket, enckdcreppart, kdcrep); res = shishi_tkts_add (tkts, tkt); if (res != SHISHI_OK) { free (tkt); return res; } return SHISHI_OK; } /** * shishi_tkts_read: * @tkts: ticket set handle as allocated by shishi_tkts(). * @fh: file descriptor to read from. * * Read tickets from file descriptor and add them to the ticket set. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_read (Shishi_tkts * tkts, FILE * fh) { int res; res = SHISHI_OK; while (!feof (fh)) { Shishi_asn1 ticket; Shishi_asn1 enckdcreppart; Shishi_asn1 kdcrep; res = shishi_kdcrep_parse (tkts->handle, fh, &kdcrep); if (res != SHISHI_OK) { res = SHISHI_OK; break; } res = shishi_enckdcreppart_parse (tkts->handle, fh, &enckdcreppart); if (res != SHISHI_OK) break; res = shishi_ticket_parse (tkts->handle, fh, &ticket); if (res != SHISHI_OK) break; /* XXX Who will de-allocate these? */ res = shishi_tkts_new (tkts, ticket, enckdcreppart, kdcrep); if (res != SHISHI_OK) break; if (VERBOSEASN1 (tkts->handle)) { printf ("Read ticket for principal `':\n"); shishi_kdcrep_print (tkts->handle, stdout, kdcrep); shishi_enckdcreppart_print (tkts->handle, stdout, enckdcreppart); shishi_ticket_print (tkts->handle, stdout, ticket); } } return res; } /** * shishi_tkts_from_file: * @tkts: ticket set handle as allocated by shishi_tkts(). * @filename: filename to read tickets from. * * Read tickets from file and add them to the ticket set. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_from_file (Shishi_tkts * tkts, const char *filename) { FILE *fh; int res; fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; res = shishi_tkts_read (tkts, fh); if (res != SHISHI_OK) { fclose (fh); return res; } res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; return SHISHI_OK; } /** * shishi_tkts_write: * @tkts: ticket set handle as allocated by shishi_tkts(). * @fh: file descriptor to write tickets to. * * Write tickets in set to file descriptor. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_write (Shishi_tkts * tkts, FILE * fh) { int res; int i; if (!tkts) return SHISHI_INVALID_TKTS; for (i = 0; i < tkts->ntkts; i++) { res = shishi_kdcrep_print (tkts->handle, fh, shishi_tkt_kdcrep (tkts->tkts[i])); if (res != SHISHI_OK) { shishi_error_printf (tkts->handle, "Could not print ticket: %s", shishi_error (tkts->handle)); return res; } res = shishi_enckdcreppart_print (tkts->handle, fh, shishi_tkt_enckdcreppart (tkts->tkts[i])); if (res != SHISHI_OK) { shishi_error_printf (tkts->handle, "Could not print ticket: %s", shishi_error (tkts->handle)); return res; } res = shishi_ticket_print (tkts->handle, fh, shishi_tkt_ticket (tkts->tkts[i])); if (res != SHISHI_OK) { shishi_error_printf (tkts->handle, "Could not print ticket: %s", shishi_error (tkts->handle)); return res; } fprintf (fh, "\n\n"); } return SHISHI_OK; } /** * shishi_tkts_expire: * @tkts: ticket set handle as allocated by shishi_tkts(). * * Remove expired tickets from ticket set. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_expire (Shishi_tkts * tkts) { int warn = 0; int i = 0; if (!tkts) return SHISHI_INVALID_TKTS; while (i < tkts->ntkts) { if (shishi_tkt_expired_p (tkts->tkts[i])) { warn++; shishi_tkts_remove (tkts, i); } else i++; } if (VERBOSE (tkts->handle) && warn) shishi_warn (tkts->handle, ngettext ("removed %d expired ticket\n", "removed %d expired tickets\n", warn), warn); return SHISHI_OK; } /** * shishi_tkts_to_file: * @tkts: ticket set handle as allocated by shishi_tkts(). * @filename: filename to write tickets to. * * Write tickets in set to file. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_to_file (Shishi_tkts * tkts, const char *filename) { FILE *fh; int res; fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; res = shishi_tkts_write (tkts, fh); if (res != SHISHI_OK) { fclose (fh); return res; } res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; return SHISHI_OK; } /** * shishi_tkts_print_for_service: * @tkts: ticket set handle as allocated by shishi_tkts(). * @fh: file descriptor to print to. * @service: service to limit tickets printed to, or NULL. * * Print description of tickets for specified service to file * descriptor. If service is NULL, all tickets are printed. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_print_for_service (Shishi_tkts * tkts, FILE * fh, const char *service) { int res; int found; int i; found = 0; for (i = 0; i < shishi_tkts_size (tkts); i++) { Shishi_tkt *tkt = shishi_tkts_nth (tkts, i); if (service) { char *buf; res = shishi_tkt_server (tkt, &buf, NULL); if (res != SHISHI_OK) continue; if (strcmp (service, buf) != 0) { free (buf); continue; } free (buf); } printf ("\n"); shishi_tkt_pretty_print (shishi_tkts_nth (tkts, i), fh); found++; } if (found) { printf (ngettext ("\n%d ticket found.\n", "\n%d tickets found.\n", found), found); } else { if (service) printf ("\nNo matching tickets found.\n"); else printf ("\nNo tickets found.\n"); } return SHISHI_OK; } /** * shishi_tkts_print: * @tkts: ticket set handle as allocated by shishi_tkts(). * @fh: file descriptor to print to. * * Print description of all tickets to file descriptor. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_tkts_print (Shishi_tkts * tkts, FILE * fh) { return shishi_tkts_print_for_service (tkts, fh, NULL); } /** * shishi_tkt_match_p: * @tkt: ticket to test hints on. * @hint: structure with characteristics of ticket to be found. * * Test if a ticket matches specified hints. * * Return value: Returns 0 iff ticket fails to match given criteria. **/ int shishi_tkt_match_p (Shishi_tkt * tkt, Shishi_tkts_hint * hint) { if (hint->server && !shishi_tkt_server_p (tkt, hint->server)) return 0; if (hint->client && !shishi_tkt_client_p (tkt, hint->client)) return 0; if (!(hint->flags & SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED) && !shishi_tkt_valid_now_p (tkt)) return 0; if ((hint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE) && !shishi_tkt_forwardable_p (tkt)) return 0; if ((hint->tktflags & SHISHI_TICKETFLAGS_FORWARDED) && !shishi_tkt_forwarded_p (tkt)) return 0; if ((hint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE) && !shishi_tkt_renewable_p (tkt)) return 0; if ((hint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE) && !shishi_tkt_proxiable_p (tkt)) return 0; if ((hint->tktflags & SHISHI_TICKETFLAGS_PROXY) && !shishi_tkt_proxy_p (tkt)) return 0; if (hint->etype && !shishi_tkt_keytype_p (tkt, hint->etype)) return 0; return 1; } /** * shishi_tkts_find: * @tkts: ticket set handle as allocated by shishi_tkts(). * @hint: structure with characteristics of ticket to be found. * * Search the ticketset sequentially (from ticket number 0 through all * tickets in the set) for a ticket that fits the given * characteristics. If a ticket is found, the hint->startpos field is * updated to point to the next ticket in the set, so this function * can be called repeatedly with the same hint argument in order to * find all tickets matching a certain criterium. Note that if * tickets are added to, or removed from, the ticketset during a query * with the same hint argument, the hint->startpos field must be * updated appropriately. * * Here is how you would typically use this function: * * Shishi_tkts_hint hint; * * Shishi_tkt tkt; * * * memset(&hint, 0, sizeof(hint)); * * hint.server = "imap/mail.example.org"; * * tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint); * * if (!tkt) * * printf("No ticket found...\n"); * * else * * do_something_with_ticket (tkt); * * Return value: Returns a ticket if found, or NULL if no further * matching tickets could be found. **/ Shishi_tkt * shishi_tkts_find (Shishi_tkts * tkts, Shishi_tkts_hint * hint) { int i; if (!tkts) return NULL; if (VERBOSENOISE (tkts->handle)) { fprintf (stderr, "Searching tickets... "); if (hint->server) fprintf (stderr, "server=`%s' ", hint->server); if (hint->client) fprintf (stderr, "client=`%s' ", hint->client); fprintf (stderr, "\n"); } for (i = hint->startpos; i < tkts->ntkts; i++) { if (!shishi_tkt_match_p (tkts->tkts[i], hint)) continue; hint->startpos = i + 1; return tkts->tkts[i]; } hint->startpos = i; return NULL; } /** * shishi_tkts_find_for_clientserver: * @tkts: ticket set handle as allocated by shishi_tkts(). * @client: client name to find ticket for. * @server: server name to find ticket for. * * Short-hand function for searching the ticket set for a ticket for * the given client and server. See shishi_tkts_find(). * * Return value: Returns a ticket if found, or NULL. **/ Shishi_tkt * shishi_tkts_find_for_clientserver (Shishi_tkts * tkts, const char *client, const char *server) { Shishi_tkts_hint hint; Shishi_tkt *tkt; memset (&hint, 0, sizeof (hint)); hint.server = (char *) server; hint.client = (char *) client; tkt = shishi_tkts_find (tkts, &hint); return tkt; } /** * shishi_tkts_find_for_server: * @tkts: ticket set handle as allocated by shishi_tkts(). * @server: server name to find ticket for. * * Short-hand function for searching the ticket set for a ticket for * the given server using the default client principal. See * shishi_tkts_find_for_clientserver() and shishi_tkts_find(). * * Return value: Returns a ticket if found, or NULL. **/ Shishi_tkt * shishi_tkts_find_for_server (Shishi_tkts * tkts, const char *server) { return shishi_tkts_find_for_clientserver (tkts, shishi_principal_default (tkts->handle), server); } /* Set flags and times in KDC-REQ based on hint. */ static int act_hint_on_kdcreq (Shishi * handle, Shishi_tkts_hint * hint, Shishi_asn1 kdcreq) { time_t starttime = hint->starttime ? hint->starttime : time (NULL); time_t endtime = hint->endtime ? hint->endtime : starttime + handle->ticketlife; time_t renew_till = hint->renew_till ? hint->renew_till : starttime + handle->renewlife; int rc; if (hint->starttime) { rc = shishi_asn1_write (handle, kdcreq, "req-body.from", shishi_generalize_time (handle, starttime), 0); if (rc != SHISHI_OK) { shishi_error_printf (handle, "Cannot set starttime: %s", shishi_strerror (rc)); return rc; } } if (hint->endtime) { rc = shishi_asn1_write (handle, kdcreq, "req-body.till", shishi_generalize_time (handle, endtime), 0); if (rc != SHISHI_OK) { shishi_error_printf (handle, "Cannot set endtime: %s", shishi_strerror (rc)); return rc; } } if (hint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE) { rc = shishi_kdcreq_options_add (handle, kdcreq, SHISHI_KDCOPTIONS_FORWARDABLE); if (rc != SHISHI_OK) goto done; } if (hint->tktflags & SHISHI_TICKETFLAGS_FORWARDED) { rc = shishi_kdcreq_options_add (handle, kdcreq, SHISHI_KDCOPTIONS_FORWARDED); if (rc != SHISHI_OK) goto done; } if (hint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE) { rc = shishi_kdcreq_options_add (handle, kdcreq, SHISHI_KDCOPTIONS_RENEWABLE); if (rc != SHISHI_OK) goto done; rc = shishi_asn1_write (handle, kdcreq, "req-body.rtime", shishi_generalize_time (handle, renew_till), 0); if (rc != SHISHI_OK) { shishi_error_printf (handle, "Cannot set renewtill: %s", shishi_strerror (rc)); return rc; } } if (hint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE) { rc = shishi_kdcreq_options_add (handle, kdcreq, SHISHI_KDCOPTIONS_PROXIABLE); if (rc != SHISHI_OK) goto done; } if (hint->tktflags & SHISHI_TICKETFLAGS_PROXY) { rc = shishi_kdcreq_options_add (handle, kdcreq, SHISHI_KDCOPTIONS_PROXY); if (rc != SHISHI_OK) goto done; } if (hint->etype) { rc = shishi_kdcreq_set_etype (handle, kdcreq, &hint->etype, 1); if (rc != SHISHI_OK) goto done; } return SHISHI_OK; done: shishi_error_printf (handle, "Cannot set KDC Options: %s", shishi_strerror (rc)); return rc; } /* Make sure the ticket granting ticket is suitable for the wanted ticket. E.g., if the wanted ticket should be a PROXY ticket, the ticket granting ticket must be a PROXIABLE ticket for things to work. */ static void set_tgtflags_based_on_hint (Shishi_tkts_hint * tkthint, Shishi_tkts_hint * tgthint) { if (tkthint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE) tgthint->tktflags |= SHISHI_TICKETFLAGS_FORWARDABLE; if (tkthint->tktflags & SHISHI_TICKETFLAGS_FORWARDED) tgthint->tktflags |= SHISHI_TICKETFLAGS_FORWARDABLE; if (tkthint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE) tgthint->tktflags |= SHISHI_TICKETFLAGS_PROXIABLE; if (tkthint->tktflags & SHISHI_TICKETFLAGS_PROXY) tgthint->tktflags |= SHISHI_TICKETFLAGS_PROXIABLE; if (tkthint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE) tgthint->tktflags |= SHISHI_TICKETFLAGS_RENEWABLE; if (tkthint->kdcoptions & SHISHI_KDCOPTIONS_RENEW) tgthint->tktflags |= SHISHI_TICKETFLAGS_RENEWABLE; if (tkthint->endtime) tgthint->endtime = tkthint->endtime; if (tkthint->passwd) tgthint->passwd = tkthint->passwd; if (tkthint->preauthetype) tgthint->preauthetype = tkthint->preauthetype; if (tkthint->preauthsalt) { tgthint->preauthsalt = tkthint->preauthsalt; tgthint->preauthsaltlen = tkthint->preauthsaltlen; } if (tkthint->preauths2kparams) { tgthint->preauths2kparams = tkthint->preauths2kparams; tgthint->preauths2kparamslen = tkthint->preauths2kparamslen; } } /* Pre-authenticate request, based on LOCHINT. Currently only PA-ENC-TIMESTAMP is supported. */ static int do_preauth (Shishi_tkts * tkts, Shishi_tkts_hint * lochint, Shishi_as * as) { int rc = SHISHI_OK; if (lochint->preauthetype) { Shishi_key *key; char *user; /* XXX Don't prompt for password here? */ rc = shishi_asreq_clientrealm (tkts->handle, shishi_as_req (as), &user, NULL); if (rc != SHISHI_OK) return rc; if (lochint->passwd == NULL) { rc = shishi_prompt_password (tkts->handle, &lochint->passwd, "Enter password for `%s': ", user); if (rc != SHISHI_OK) return rc; } if (!lochint->preauthsalt) { rc = shishi_derive_default_salt (tkts->handle, user, &lochint->preauthsalt); if (rc != SHISHI_OK) return rc; lochint->preauthsaltlen = strlen (lochint->preauthsalt); } rc = shishi_key_from_string (tkts->handle, lochint->preauthetype, lochint->passwd, strlen (lochint->passwd), lochint->preauthsalt, lochint->preauthsaltlen, lochint->preauths2kparams, &key); if (rc != SHISHI_OK) return rc; rc = shishi_kdcreq_add_padata_preauth (tkts->handle, shishi_as_req (as), key); } return rc; } /* Handle ETYPE-INFO and ETYPE-INFO2 pre-auth data. */ static int recover_preauth_info (Shishi_tkts * tkts, Shishi_as * as, Shishi_tkts_hint * lochint, Shishi_asn1 einfos, bool isinfo2, bool * retry) { size_t foundpos = SIZE_MAX; size_t i, n; int rc; shishi_verbose (tkts->handle, "Found INFO-ETYPE(2) pre-auth hints"); if (VERBOSEASN1 (tkts->handle)) { if (isinfo2) shishi_etype_info2_print (tkts->handle, stdout, einfos); else shishi_etype_info_print (tkts->handle, stdout, einfos); } if (lochint->preauthetype) { shishi_verbose (tkts->handle, "Pre-auth data already specified"); return SHISHI_OK; } rc = shishi_asn1_number_of_elements (tkts->handle, einfos, "", &n); if (rc != SHISHI_OK) return rc; for (i = 1; i <= n; i++) { char *format; int32_t etype; format = xasprintf ("?%d.etype", i); rc = shishi_asn1_read_int32 (tkts->handle, einfos, format, &etype); free (format); if (rc == SHISHI_OK) { size_t j; shishi_verbose (tkts->handle, "Server has etype %d", etype); for (j = 0; j < tkts->handle->nclientkdcetypes; j++) { if (etype == tkts->handle->clientkdcetypes[j]) { if (j < foundpos && VERBOSENOISE (tkts->handle)) { shishi_verbose (tkts->handle, "New best etype %d", etype); /* XXX mem leak. */ format = xasprintf ("?%d.salt", i); rc = shishi_asn1_read (tkts->handle, einfos, format, &lochint->preauthsalt, &lochint->preauthsaltlen); free (format); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT) return rc; if (isinfo2) { format = xasprintf ("?%d.s2kparams", i); rc = shishi_asn1_read (tkts->handle, einfos, format, &lochint->preauths2kparams, &lochint->preauths2kparamslen); free (format); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT) return rc; } } foundpos = MIN (foundpos, j); } } } } if (foundpos != SIZE_MAX) { lochint->preauthetype = tkts->handle->clientkdcetypes[foundpos]; shishi_verbose (tkts->handle, "Best pre-auth etype was %d", lochint->preauthetype); *retry = true; } return SHISHI_OK; } /* Called when KDC refused with a NEED_PREAUTH error. This function should look at the METHOD-DATA, figure out what kind of pre-auth is requested, and if it is able to figure out how to recover from the error, set *RETRY to true and set any hints in LOCHINT that help do_preauth() compute the proper pre-auth data. */ static int recover_preauth (Shishi_tkts * tkts, Shishi_as * as, Shishi_tkts_hint * lochint, bool * retry) { Shishi_asn1 krberror = shishi_as_krberror (as); Shishi_asn1 pas; size_t i, n; int rc; *retry = false; shishi_verbose (tkts->handle, "Server requests pre-auth data"); rc = shishi_krberror_methoddata (tkts->handle, krberror, &pas); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_number_of_elements (tkts->handle, pas, "", &n); if (rc == SHISHI_OK) { for (i = 1; i <= n; i++) { char *format = xasprintf ("?%d.padata-type", i); int32_t padatatype; rc = shishi_asn1_read_int32 (tkts->handle, pas, format, &padatatype); free (format); if (rc == SHISHI_OK) { shishi_verbose (tkts->handle, "Looking at pa-type %d", padatatype); switch (padatatype) { /* XXX Don't parse INFO structures if there is a INFO2. */ case SHISHI_PA_ETYPE_INFO: case SHISHI_PA_ETYPE_INFO2: { char *der; size_t len; Shishi_asn1 einfos; format = xasprintf ("?%d.padata-value", i); rc = shishi_asn1_read (tkts->handle, pas, format, &der, &len); free (format); if (rc != SHISHI_OK) { shishi_error_printf (tkts->handle, "Can't extract PA-DATA value"); continue; } if (padatatype == SHISHI_PA_ETYPE_INFO) einfos = shishi_der2asn1_etype_info (tkts->handle, der, len); else einfos = shishi_der2asn1_etype_info2 (tkts->handle, der, len); free (der); if (!einfos) { shishi_error_printf (tkts->handle, "Can't DER decode PA-DATA"); continue; } rc = recover_preauth_info (tkts, as, lochint, einfos, padatatype == SHISHI_PA_ETYPE_INFO2, retry); if (rc != SHISHI_OK) { shishi_error_printf (tkts->handle, "Could not use pre-auth data: %s", shishi_strerror (rc)); continue; } shishi_asn1_done (tkts->handle, einfos); } break; default: break; } } } } shishi_asn1_done (tkts->handle, pas); return SHISHI_OK; } /** * shishi_tkts_get_tgt: * @tkts: ticket set handle as allocated by shishi_tkts(). * @hint: structure with characteristics of ticket to begot. * * Get a ticket granting ticket (TGT) suitable for acquiring ticket * matching the hint. I.e., get a TGT for the server realm in the * hint structure (hint->serverrealm), or the default realm if the * serverrealm field is NULL. Can result in AS exchange. * * Currently this function do not implement cross realm logic. * * This function is used by shishi_tkts_get(), which is probably what * you really want to use unless you have special needs. * * Return value: Returns a ticket granting ticket if successful, or * NULL if this function is unable to acquire on. **/ Shishi_tkt * shishi_tkts_get_tgt (Shishi_tkts * tkts, Shishi_tkts_hint * hint) { Shishi_tkts_hint lochint; Shishi_as *as; Shishi_tkt *tgt; int rc; /* XXX cross-realm operation */ memset (&lochint, 0, sizeof (lochint)); asprintf (&lochint.server, "krbtgt/%s", hint->serverrealm ? hint->serverrealm : shishi_realm_default (tkts->handle)); set_tgtflags_based_on_hint (hint, &lochint); tgt = shishi_tkts_find (tkts, &lochint); free (lochint.server); lochint.server = NULL; if (tgt) return tgt; if (hint->flags & SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE) return NULL; again: rc = shishi_as (tkts->handle, &as); if (rc == SHISHI_OK) rc = act_hint_on_kdcreq (tkts->handle, &lochint, shishi_as_req (as)); if (rc == SHISHI_OK) rc = do_preauth (tkts, &lochint, as); if (rc == SHISHI_OK) rc = shishi_as_req_build (as); if (rc == SHISHI_OK) rc = shishi_as_sendrecv_hint (as, &lochint); if (rc == SHISHI_OK) rc = shishi_as_rep_process (as, NULL, lochint.passwd); if (rc == SHISHI_GOT_KRBERROR && shishi_krberror_errorcode_fast (tkts->handle, shishi_as_krberror (as)) == SHISHI_KDC_ERR_PREAUTH_REQUIRED) { bool retry = false; rc = recover_preauth (tkts, as, &lochint, &retry); if (rc != SHISHI_OK) return NULL; if (retry) { shishi_as_done (as); goto again; } shishi_error_printf (tkts->handle, "Unsupported pre-auth required"); return NULL; } if (rc != SHISHI_OK) { shishi_error_printf (tkts->handle, "AS exchange failed: %s\n%s\n", shishi_strerror (rc), shishi_error (tkts->handle)); return NULL; } /* XXX free lochint members */ tgt = shishi_as_tkt (as); if (!tgt) { shishi_error_printf (tkts->handle, "No ticket in AS-REP"); return NULL; } if (VERBOSENOISE (tkts->handle)) { printf ("Received ticket granting ticket:\n"); shishi_tkt_pretty_print (tgt, stdout); } rc = shishi_tkts_add (tkts, tgt); if (rc != SHISHI_OK) printf ("Could not add ticket: %s", shishi_strerror (rc)); return tgt; } /** * shishi_tkts_get_tgs: * @tkts: ticket set handle as allocated by shishi_tkts(). * @hint: structure with characteristics of ticket to begot. * @tgt: ticket granting ticket to use. * * Get a ticket via TGS exchange using specified ticket granting * ticket. * * This function is used by shishi_tkts_get(), which is probably what * you really want to use unless you have special needs. * * Return value: Returns a ticket if successful, or NULL if this * function is unable to acquire on. **/ Shishi_tkt * shishi_tkts_get_tgs (Shishi_tkts * tkts, Shishi_tkts_hint * hint, Shishi_tkt * tgt) { Shishi_tgs *tgs; Shishi_tkt *tkt; int rc; rc = shishi_tgs (tkts->handle, &tgs); shishi_tgs_tgtkt_set (tgs, tgt); if (rc == SHISHI_OK) rc = act_hint_on_kdcreq (tkts->handle, hint, shishi_tgs_req (tgs)); if (rc == SHISHI_OK) rc = shishi_tgs_set_server (tgs, hint->server); if (rc == SHISHI_OK) rc = shishi_tgs_req_build (tgs); if (rc == SHISHI_OK) rc = shishi_tgs_sendrecv_hint (tgs, hint); if (rc == SHISHI_OK) rc = shishi_tgs_rep_process (tgs); if (rc != SHISHI_OK) { shishi_error_printf (tkts->handle, "TGS exchange failed: %s\n%s\n", shishi_strerror (rc), shishi_error (tkts->handle)); if (rc == SHISHI_GOT_KRBERROR) shishi_krberror_pretty_print (tkts->handle, stdout, shishi_tgs_krberror (tgs)); return NULL; } tkt = shishi_tgs_tkt (tgs); if (!tkt) { shishi_error_printf (tkts->handle, "No ticket in TGS-REP?!: %s", shishi_error (tkts->handle)); return NULL; } if (VERBOSENOISE (tkts->handle)) { printf ("Received ticket:\n"); shishi_tkt_pretty_print (tkt, stdout); } rc = shishi_tkts_add (tkts, tkt); if (rc != SHISHI_OK) printf ("Could not add ticket: %s", shishi_strerror (rc)); return tkt; } /** * shishi_tkts_get: * @tkts: ticket set handle as allocated by shishi_tkts(). * @hint: structure with characteristics of ticket to be found. * * Get a ticket matching given characteristics. This function first * looks in the ticket set for a ticket, then tries to find a * suitable TGT, possibly via an AS exchange, using * shishi_tkts_get_tgt(), and then uses that TGT in a TGS exchange to * get the ticket. * * Currently this function does not implement cross realm logic. * * Return value: Returns a ticket if found, or NULL if this function * is unable to get the ticket. **/ Shishi_tkt * shishi_tkts_get (Shishi_tkts * tkts, Shishi_tkts_hint * hint) { Shishi_tkt *tkt, *tgt; /* If we already have a matching ticket, avoid getting a new one. */ hint->startpos = 0; tkt = shishi_tkts_find (tkts, hint); if (tkt) return tkt; tgt = shishi_tkts_get_tgt (tkts, hint); if (!tgt) { shishi_error_printf (tkts->handle, "Could not get TGT for ticket."); return NULL; } if (shishi_tkt_match_p (tgt, hint)) return tgt; tkt = shishi_tkts_get_tgs (tkts, hint, tgt); if (!tkt) { shishi_error_printf (tkts->handle, "Could not get ticket using TGT."); return NULL; } return tkt; } /** * shishi_tkts_get_for_clientserver: * @tkts: ticket set handle as allocated by shishi_tkts(). * @client: client name to get ticket for. * @server: server name to get ticket for. * * Short-hand function for getting a ticket for the given client and * server. See shishi_tkts_get(). * * Return value: Returns a ticket if found, or NULL. **/ Shishi_tkt * shishi_tkts_get_for_clientserver (Shishi_tkts * tkts, const char *client, const char *server) { Shishi_tkts_hint hint; Shishi_tkt *tkt; memset (&hint, 0, sizeof (hint)); hint.client = (char *) client; hint.server = (char *) server; tkt = shishi_tkts_get (tkts, &hint); return tkt; } /** * shishi_tkts_get_for_server: * @tkts: ticket set handle as allocated by shishi_tkts(). * @server: server name to get ticket for. * * Short-hand function for getting a ticket to the given server and * for the default principal client. See shishi_tkts_get(). * * Return value: Returns a ticket if found, or NULL. **/ Shishi_tkt * shishi_tkts_get_for_server (Shishi_tkts * tkts, const char *server) { return shishi_tkts_get_for_clientserver (tkts, shishi_principal_default (tkts->handle), server); } /** * shishi_tkts_get_for_localservicepasswd: * @tkts: ticket set handle as allocated by shishi_tkts(). * @service: service name to get ticket for. * @passwd: password for the default client principal. * * Short-hand function for getting a ticket to the given * local service, and for the default principal client. * The latter's password is given as argument. * See shishi_tkts_get(). * * Return value: Returns a ticket if found, or NULL otherwise. **/ Shishi_tkt * shishi_tkts_get_for_localservicepasswd (Shishi_tkts * tkts, const char *service, const char *passwd) { Shishi_tkt *tkt; Shishi_tkts_hint hint; memset (&hint, 0, sizeof (hint)); hint.client = (char *) shishi_principal_default (tkts->handle); hint.server = shishi_server_for_local_service (tkts->handle, service); hint.passwd = (char *) passwd; tkt = shishi_tkts_get (tkts, &hint); free (hint.server); return tkt; } shishi-1.0.2/lib/realm.c0000664000000000000000000001440112126660507011711 00000000000000/* realm.c --- Realm related functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /** * shishi_realm_default_guess: * * Guesses a realm based on getdomainname() (which really is NIS/YP * domain, but if it is set it might be a good guess), or if it fails, * based on gethostname(), or if it fails, the string * "could-not-guess-default-realm". Note that the hostname is not * trimmed off of the data returned by gethostname() to get the domain * name and use that as the realm. * * Return value: Returns guessed realm for host as a string that has * to be deallocated with free() by the caller. **/ char * shishi_realm_default_guess (void) { char *realm; realm = xgetdomainname (); if (realm && strlen (realm) > 0 && strcmp (realm, "(none)") != 0) return realm; free (realm); realm = xgethostname (); if (realm && strlen (realm) > 0 && strcmp (realm, "(none)") != 0) return realm; free (realm); realm = strdup ("could-not-guess-default-realm"); return realm; } /** * shishi_realm_default: * @handle: Shishi library handle create by shishi_init(). * * Get name of default realm. * * Return value: Returns the default realm used in the library. (Not * a copy of it, so don't modify or deallocate it.) **/ const char * shishi_realm_default (Shishi * handle) { if (!handle->default_realm) { char *p; p = shishi_realm_default_guess (); shishi_realm_default_set (handle, p); free (p); } return handle->default_realm; } /** * shishi_realm_default_set: * @handle: Shishi library handle create by shishi_init(). * @realm: string with new default realm name, or NULL to reset to default. * * Set the default realm used in the library. The string is copied * into the library, so you can dispose of the variable immediately * after calling this function. **/ void shishi_realm_default_set (Shishi * handle, const char *realm) { free (handle->default_realm); if (realm) handle->default_realm = xstrdup (realm); else handle->default_realm = NULL; } /** * shishi_realm_for_server_file: * @handle: Shishi library handle create by shishi_init(). * @server: hostname to find realm for. * * Find realm for a host using configuration file. * * Return value: Returns realm for host, or NULL if not found. **/ char * shishi_realm_for_server_file (Shishi * handle, char *server) { struct Shishi_realminfo *ri; size_t i, j; char *p; for (i = 0; i < handle->nrealminfos; i++) { ri = &handle->realminfos[i]; if (!ri->nserverwildcards) continue; for (j = 0; j < ri->nserverwildcards; j++) { /* Exact server name match. */ if (strcmp (server, ri->serverwildcards[j]) == 0) return ri->name; /* Is this a tail pattern? */ if (*(ri->serverwildcards[j]) != '.') continue; /* Domain part matching. */ p = server; while ((p = strchr (p, '.'))) if (strcmp (p++, ri->serverwildcards[j]) == 0) return ri->name; } } return NULL; } /** * shishi_realm_for_server_dns: * @handle: Shishi library handle create by shishi_init(). * @server: hostname to find realm for. * * Find realm for a host using DNS lookups, according to * draft-ietf-krb-wg-krb-dns-locate-03.txt. Since DNS lookups may be * spoofed, relying on the realm information may result in a * redirection attack. In a single-realm scenario, this only achieves * a denial of service, but with cross-realm trust it may redirect you * to a compromised realm. For this reason, Shishi prints a warning, * suggesting that the user should add the proper 'server-realm' * configuration tokens instead. * * To illustrate the DNS information used, here is an extract from a * zone file for the domain ASDF.COM: * * _kerberos.asdf.com. IN TXT "ASDF.COM" * _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" * _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM" * * Let us suppose that in this case, a client wishes to use a service * on the host foo.asdf.com. It would first query: * * _kerberos.foo.asdf.com. IN TXT * * Finding no match, it would then query: * * _kerberos.asdf.com. IN TXT * * Return value: Returns realm for host, or NULL if not found. **/ char * shishi_realm_for_server_dns (Shishi * handle, char *server) { Shishi_dns rrs; char *tmp = NULL; char *p = server; do { asprintf (&tmp, "_kerberos.%s", p); rrs = shishi_resolv (tmp, SHISHI_DNS_TXT); free (tmp); p = strchr (p, '.'); if (p) p++; } while (!rrs && p && *p); if (!rrs) return NULL; if (rrs->class != SHISHI_DNS_IN || rrs->type != SHISHI_DNS_TXT) { shishi_warn (handle, "Got non-TXT response to TXT query from DNS?"); return NULL; } shishi_warn (handle, "DNS maps '%s' to '%s'.", server, (char *) rrs->rr); shishi_warn (handle, "Consider using a 'server-realm' configuration token."); return rrs->rr; } /** * shishi_realm_for_server: * @handle: Shishi library handle create by shishi_init(). * @server: hostname to find realm for. * * Find realm for a host, using various methods. Currently this * includes static configuration files (see * shishi_realm_for_server_file()) and DNS (see * shishi_realm_for_server_dns()). * * Return value: Returns realm for host, or NULL if not found. **/ char * shishi_realm_for_server (Shishi * handle, char *server) { char *p; p = shishi_realm_for_server_file (handle, server); if (!p) p = shishi_realm_for_server_dns (handle, server); return p; } shishi-1.0.2/lib/crypto-des.c0000664000000000000000000005050712126660507012711 00000000000000/* crypto-des.c --- DES crypto functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "crypto.h" /* Get _shishi_escapeprint, etc. */ #include "utils.h" static int raw_des_checksum0 (Shishi * handle, int algo, const char *in, size_t inlen, char *out, size_t * outlen) { char *tmp; size_t tmplen; char *p; int blen = 8; int hlen = (algo == SHISHI_DES_CBC_CRC) ? 4 : 16; int rc; rc = shishi_randomize (handle, 0, out, blen); if (rc != SHISHI_OK) return rc; tmplen = blen + inlen; tmp = xmalloc (tmplen); memcpy (tmp, out, blen); memcpy (tmp + blen, in, inlen); switch (algo) { case SHISHI_DES_CBC_CRC: rc = shishi_crc (handle, tmp, tmplen, &p); break; case SHISHI_DES_CBC_MD4: rc = shishi_md4 (handle, tmp, tmplen, &p); break; case SHISHI_DES_CBC_MD5: rc = shishi_md5 (handle, tmp, tmplen, &p); break; default: shishi_error_printf (handle, "MD %d unknown in raw des checksum", algo); return SHISHI_CRYPTO_INTERNAL_ERROR; break; } memcpy (out + blen, p, hlen); *outlen = blen + hlen; return SHISHI_OK; } static int raw_des_checksum1 (Shishi * handle, int algo, const char *in, size_t inlen, char *out, size_t * outlen) { char *tmp; size_t tmplen; char *p; int blen = 8; int hlen = (algo == SHISHI_DES_CBC_CRC) ? 4 : 16; int rc; rc = shishi_randomize (handle, 0, out, blen); if (rc != SHISHI_OK) return rc; memset (out + blen, 0, hlen); tmplen = blen + hlen + inlen; tmp = xmalloc (tmplen); memcpy (tmp, out, blen + hlen); memcpy (tmp + blen + hlen, in, inlen); switch (algo) { case SHISHI_DES_CBC_CRC: rc = shishi_crc (handle, tmp, tmplen, &p); break; case SHISHI_DES_CBC_MD4: rc = shishi_md4 (handle, tmp, tmplen, &p); break; case SHISHI_DES_CBC_MD5: rc = shishi_md5 (handle, tmp, tmplen, &p); break; default: shishi_error_printf (handle, "MD %d unknown in raw des checksum", algo); return SHISHI_CRYPTO_INTERNAL_ERROR; break; } free (tmp); memcpy (out + blen, p, hlen); free (p); *outlen = blen + hlen; return SHISHI_OK; } static int des_encrypt_checksum (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen, int algo) { char cksum[8 + MAX_HASH_LEN]; char *inpad; char *pt; size_t inpadlen, padzerolen = 0, ptlen, cksumlen; int hlen = (algo == SHISHI_DES_CBC_CRC) ? 4 : 16; int res; if ((inlen + hlen) % 8) padzerolen = 8 - ((inlen + hlen) % 8); inpadlen = inlen + padzerolen; inpad = xmalloc (inpadlen); memcpy (inpad, in, inlen); memset (inpad + inlen, 0, padzerolen); res = raw_des_checksum1 (handle, algo, inpad, inpadlen, cksum, &cksumlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "DES checksum failed"); return res; } ptlen = inpadlen + cksumlen; pt = xmalloc (ptlen); memcpy (pt, cksum, cksumlen); memcpy (pt + cksumlen, inpad, inpadlen); free (inpad); res = _shishi_simplified_encrypt (handle, key, 0, iv, ivlen, ivout, ivoutlen, pt, ptlen, out, outlen); free (pt); if (res != SHISHI_OK) { shishi_error_printf (handle, "DES encrypt failed"); return res; } return SHISHI_OK; } static int des_crc_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_encrypt_checksum (handle, key, keyusage, shishi_key_value (key), shishi_key_length (key), ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_CRC); } static int des_md4_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_encrypt_checksum (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_MD4); } static int des_md5_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_encrypt_checksum (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_MD5); } static int des_none_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_encrypt (handle, key, 0, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int des_decrypt_verify (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen, int algo) { int res; char incoming[16]; char *computed; size_t hlen = (algo == SHISHI_DES_CBC_CRC) ? 4 : 16; res = _shishi_simplified_decrypt (handle, key, 0, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "decrypt failed"); return res; } if (VERBOSECRYPTONOISE (handle)) { puts ("verify decrypted:"); _shishi_escapeprint (*out, *outlen); _shishi_hexprint (*out, *outlen); } memcpy (incoming, *out + 8, hlen); memset (*out + 8, 0, hlen); if (VERBOSECRYPTONOISE (handle)) { puts ("cksum pt:"); _shishi_hexprint (*out, *outlen); } switch (algo) { case SHISHI_DES_CBC_CRC: shishi_crc (handle, *out, *outlen, &computed); break; case SHISHI_DES_CBC_MD4: shishi_md4 (handle, *out, *outlen, &computed); break; case SHISHI_DES_CBC_MD5: shishi_md5 (handle, *out, *outlen, &computed); break; default: shishi_error_printf (handle, "MD %d unknown in raw des verify", algo); return SHISHI_CRYPTO_ERROR; break; } if (VERBOSECRYPTONOISE (handle)) { puts ("DES verify:"); _shishi_hexprint (incoming, hlen); _shishi_hexprint (computed, hlen); } if (memcmp (computed, incoming, hlen) != 0) { shishi_error_printf (handle, "DES hash verify failed"); return SHISHI_CRYPTO_ERROR; } free (computed); memmove (*out, *out + 8 + hlen, *outlen - 8 - hlen); *outlen -= 8 + hlen; return SHISHI_OK; } static int des_crc_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_decrypt_verify (handle, key, keyusage, shishi_key_value (key), shishi_key_length (key), ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_CRC); } static int des_md4_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_decrypt_verify (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_MD4); } static int des_md5_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return des_decrypt_verify (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, SHISHI_DES_CBC_MD5); } static int des_none_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_decrypt (handle, key, 0, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static void des_set_odd_key_parity (char key[8]) { int i, j; for (i = 0; i < 8; i++) { int n_set_bits = 0; for (j = 1; j < 8; j++) if (key[i] & (1 << j)) n_set_bits++; key[i] &= ~1; if ((n_set_bits % 2) == 0) key[i] |= 1; } } static char weak_des_keys[16][8] = { /* Weak keys */ "\x01\x01\x01\x01\x01\x01\x01\x01", "\x1F\x1F\x1F\x1F\x0E\x0E\x0E\x0E", "\xE0\xE0\xE0\xE0\xF1\xF1\xF1\xF1", "\xFE\xFE\xFE\xFE\xFE\xFE\xFE\xFE", /* Semiweak keys */ "\x01\xFE\x01\xFE\x01\xFE\x01\xFE", "\x1F\xE0\x1F\xE0\x0E\xF1\x0E\xF1", "\x01\xE0\x01\xE0\x01\xF1\x01\xF1", "\x1F\xFE\x1F\xFE\x0E\xFE\x0E\xFE", "\x01\x1F\x01\x1F\x01\x0E\x01\x0E", "\xE0\xFE\xE0\xFE\xF1\xFE\xF1\xFE", "\xFE\x01\xFE\x01\xFE\x01\xFE\x01", "\xE0\x1F\xE1\x0F\xF1\x0E\xF1\x0E", "\xE0\x01\xE0\x01\xF1\x01\xF1\x01", "\xFE\x1F\xFE\x1F\xFE\x0E\xFE\x0E", "\x1F\x01\x1F\x01\x0E\x01\x0E\x01", "\xFE\xE0\xFE\xE0\xFE\xF1\xFE\xF1" }; static void des_key_correction (Shishi * handle, char key[8]) { size_t i; /* fixparity(key); */ des_set_odd_key_parity (key); /* This loop could be replaced by optimized code (compare nettle), but let's not do that. */ for (i = 0; i < 16; i++) if (memcmp (key, weak_des_keys[i], 8) == 0) { if (VERBOSECRYPTONOISE (handle)) printf ("\t ;; WEAK KEY (corrected)\n"); key[7] ^= 0xF0; break; } } static int des_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { char tmp[MAX_RANDOM_LEN]; int keylen = shishi_cipher_keylen (shishi_key_type (outkey)); if (rndlen != shishi_key_length (outkey)) { shishi_error_printf (handle, "DES random to key caller error"); return SHISHI_CRYPTO_ERROR; } memcpy (tmp, rnd, keylen); des_set_odd_key_parity (tmp); shishi_key_value_set (outkey, tmp); return SHISHI_OK; } static int des_string_to_key (Shishi * handle, const char *string, size_t stringlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { char *s; int n_s; int odd; char tempkey[8]; char *p; int i, j; char temp, temp2; int res; if (VERBOSECRYPTO (handle)) { printf ("des_string_to_key (string, salt)\n"); printf ("\t ;; String:\n"); _shishi_escapeprint (string, stringlen); _shishi_hexprint (string, stringlen); printf ("\t ;; Salt:\n"); _shishi_escapeprint (salt, saltlen); _shishi_hexprint (salt, saltlen); } if (VERBOSECRYPTONOISE (handle)) { printf ("odd = 1;\n"); printf ("s = string | salt;\n"); printf ("tempstring = 0; /* 56-bit string */\n"); printf ("pad(s); /* with nulls to 8 byte boundary */\n"); } odd = 1; n_s = stringlen + saltlen; if ((n_s % 8) != 0) n_s += 8 - n_s % 8; s = xmalloc (n_s); memcpy (s, string, stringlen); if (saltlen > 0) memcpy (s + stringlen, salt, saltlen); memset (s + stringlen + saltlen, 0, n_s - stringlen - saltlen); memset (tempkey, 0, sizeof (tempkey)); /* tempkey = NULL; */ if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; s = pad(string|salt):\n"); _shishi_escapeprint (s, n_s); _shishi_hexprint (s, n_s); } for (i = 0; i < n_s / 8; i++) { if (VERBOSECRYPTONOISE (handle)) { printf ("for (8byteblock in s) {\n"); printf ("\t ;; loop iteration %d\n", i); printf ("\t ;; 8byteblock:\n"); _shishi_escapeprint (&s[i * 8], 8); _shishi_hexprint (&s[i * 8], 8); _shishi_binprint (&s[i * 8], 8); printf ("56bitstring = removeMSBits(8byteblock);\n"); } for (j = 0; j < 8; j++) s[i * 8 + j] = s[i * 8 + j] & ~0x80; if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; 56bitstring:\n"); _shishi_bin7print (&s[i * 8], 8); printf ("if (odd == 0) reverse(56bitstring);\t ;; odd=%d\n", odd); } if (odd == 0) { for (j = 0; j < 4; j++) { temp = s[i * 8 + j]; temp = ((temp >> 6) & 0x01) | ((temp >> 4) & 0x02) | ((temp >> 2) & 0x04) | ((temp) & 0x08) | ((temp << 2) & 0x10) | ((temp << 4) & 0x20) | ((temp << 6) & 0x40); temp2 = s[i * 8 + 7 - j]; temp2 = ((temp2 >> 6) & 0x01) | ((temp2 >> 4) & 0x02) | ((temp2 >> 2) & 0x04) | ((temp2) & 0x08) | ((temp2 << 2) & 0x10) | ((temp2 << 4) & 0x20) | ((temp2 << 6) & 0x40); s[i * 8 + j] = temp2; s[i * 8 + 7 - j] = temp; } if (VERBOSECRYPTONOISE (handle)) { printf ("reverse(56bitstring)\n"); printf ("\t ;; 56bitstring after reverse\n"); _shishi_bin7print (&s[i * 8], 8); } } odd = !odd; if (VERBOSECRYPTONOISE (handle)) { printf ("odd = ! odd\n"); printf ("tempstring = tempstring XOR 56bitstring;\n"); } /* tempkey = tempkey XOR 8byteblock; */ for (j = 0; j < 8; j++) tempkey[j] ^= s[i * 8 + j]; if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; tempstring\n"); _shishi_bin7print (tempkey, 8); } } for (j = 0; j < 8; j++) tempkey[j] = tempkey[j] << 1; if (VERBOSECRYPTONOISE (handle)) { printf ("for (8byteblock in s) {\n"); printf ("}\n"); printf ("\t ;; for loop terminated\n"); printf ("\t ;; tempstring as 64bitblock\n"); _shishi_hexprint (tempkey, 8); _shishi_binprint (tempkey, 8); printf ("/* add parity as low bit of each byte */\n"); printf ("tempkey = key_correction(add_parity_bits(tempstring));\n"); } des_key_correction (handle, tempkey); if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; tempkey\n"); _shishi_escapeprint (tempkey, 8); _shishi_hexprint (tempkey, 8); _shishi_binprint (tempkey, 8); printf ("key = key_correction(DES-CBC-check(s,tempkey));\n"); } memcpy (s, string, stringlen); if (saltlen > 0) memcpy (s + stringlen, salt, saltlen); memset (s + stringlen + saltlen, 0, n_s - stringlen - saltlen); res = shishi_des_cbc_mac (handle, tempkey, tempkey, s, n_s, &p); if (res != SHISHI_OK) return res; free (s); memcpy (tempkey, p, 8); free (p); des_key_correction (handle, tempkey); if (VERBOSECRYPTO (handle)) { printf ("\t ;; key\n"); _shishi_escapeprint (tempkey, 8); _shishi_hexprint (tempkey, 8); _shishi_binprint (tempkey, 8); } shishi_key_value_set (outkey, tempkey); return SHISHI_OK; } static int des_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen, int algo) { char cksum[8 + MAX_HASH_LEN]; size_t cksumlen; char *keyp; int i; int res; res = raw_des_checksum0 (handle, algo, in, inlen, cksum, &cksumlen); if (res != SHISHI_OK) { shishi_error_set (handle, "raw des checksum failed"); return res; } keyp = (char *) shishi_key_value (key); for (i = 0; i < 8; i++) keyp[i] ^= 0xF0; res = _shishi_simplified_dencrypt (handle, key, NULL, 0, NULL, NULL, cksum, cksumlen, out, outlen, 0); for (i = 0; i < 8; i++) keyp[i] ^= 0xF0; if (res != SHISHI_OK) { shishi_error_set (handle, "encrypt failed"); return res; } return SHISHI_OK; } static int des_crc_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return des_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen, SHISHI_DES_CBC_CRC); } static int des_md4_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return des_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen, SHISHI_DES_CBC_MD4); } static int des_md5_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return des_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen, SHISHI_DES_CBC_MD5); } static int gss_des_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { char *p; int rc; rc = shishi_md5 (handle, in, inlen, &p); if (rc != SHISHI_OK) return rc; *outlen = 8; rc = shishi_des_cbc_mac (handle, shishi_key_value (key), NULL, p, 16, out); free (p); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } static int des_verify (Shishi * handle, int algo, Shishi_key * key, const char *in, size_t inlen, const char *cksum, size_t cksumlen) { char *out; size_t outlen; char *md; size_t tmplen; char *tmp; char *keyp; size_t i; int res; if (cksumlen != 8 + 16) return SHISHI_VERIFY_FAILED; /* * get_mic des-cbc(key XOR 0xF0F0F0F0F0F0F0F0, * conf | rsa-md5(conf | msg)) * verify_mic decrypt and verify rsa-md5 checksum */ keyp = (char *) shishi_key_value (key); for (i = 0; i < 8; i++) keyp[i] ^= 0xF0; res = _shishi_simplified_decrypt (handle, key, 0, NULL, 0, NULL, NULL, cksum, cksumlen, &out, &outlen); for (i = 0; i < 8; i++) keyp[i] ^= 0xF0; if (res != SHISHI_OK) { shishi_error_set (handle, "decrypt failed"); return res; } tmplen = 8 + inlen; tmp = xmalloc (tmplen); memcpy (tmp, out, 8); memcpy (tmp + 8, in, inlen); switch (algo) { case SHISHI_RSA_MD4_DES: res = shishi_md4 (handle, tmp, tmplen, &md); break; case SHISHI_RSA_MD5_DES: res = shishi_md5 (handle, tmp, tmplen, &md); break; default: res = SHISHI_CRYPTO_ERROR; } if (res != SHISHI_OK) { shishi_error_printf (handle, "DES verify MD error"); return res; } if (memcmp (out + 8, md, 16) != 0) return SHISHI_VERIFY_FAILED; return SHISHI_OK; } static int des_md4_verify (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, const char *cksum, size_t cksumlen) { return des_verify (handle, SHISHI_RSA_MD4_DES, key, in, inlen, cksum, cksumlen); } static int des_md5_verify (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, const char *cksum, size_t cksumlen) { return des_verify (handle, SHISHI_RSA_MD5_DES, key, in, inlen, cksum, cksumlen); } cipherinfo des_cbc_crc_info = { SHISHI_DES_CBC_CRC, "des-cbc-crc", 8, 8, 8, 8, SHISHI_CRC32, des_random_to_key, des_string_to_key, des_crc_encrypt, des_crc_decrypt }; cipherinfo des_cbc_md4_info = { SHISHI_DES_CBC_MD4, "des-cbc-md4", 8, 8, 8, 8, SHISHI_RSA_MD4_DES, des_random_to_key, des_string_to_key, des_md4_encrypt, des_md4_decrypt }; cipherinfo des_cbc_md5_info = { SHISHI_DES_CBC_MD5, "des-cbc-md5", 8, 8, 8, 8, SHISHI_RSA_MD5_DES, des_random_to_key, des_string_to_key, des_md5_encrypt, des_md5_decrypt }; cipherinfo des_cbc_none_info = { SHISHI_DES_CBC_NONE, "des-cbc-none", 8, 8, 8, 8, SHISHI_RSA_MD5_DES, des_random_to_key, des_string_to_key, des_none_encrypt, des_none_decrypt }; checksuminfo crc32_info = { SHISHI_CRC32, "crc32", 4, des_crc_checksum, NULL }; checksuminfo md4_des_info = { SHISHI_RSA_MD4_DES, "rsa-md4-des", 24, des_md4_checksum, des_md4_verify }; checksuminfo md5_des_info = { SHISHI_RSA_MD5_DES, "rsa-md5-des", 24, des_md5_checksum, des_md5_verify }; checksuminfo md5_gss_info = { SHISHI_RSA_MD5_DES_GSS, "rsa-md5-des-gss", 8, gss_des_checksum, NULL }; shishi-1.0.2/lib/Makefile.am0000664000000000000000000000617312126660507012510 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) $(CFLAG_VISIBILITY) AM_CPPFLAGS = $(LIBTASN1_CFLAGS) -I$(top_srcdir)/gl -I$(top_builddir)/gl DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shishi.conf\" \ -DSKELCFGFILE=\"$(SKELDIR)/shishi.skel\" \ -DHOSTKEYSFILE=\"$(KEYDIR)/shishi.keys\" BUILT_SOURCES = shishi-int.h kerberos5.c DISTCLEANFILES = shishi-int.h MAINTAINERCLEANFILES = kerberos5.c nodist_include_HEADERS = shishi-int.h shishi-int.h: if test -n "$(STDINT_H)"; then \ cp ../gl/stdint.h shishi-int.h; \ else \ echo '#include ' > shishi-int.h; \ fi include_HEADERS = shishi.h lib_LTLIBRARIES = libshishi.la libshishi_la_SOURCES = libshishi.map \ shishi.h internal.h \ init.c cfg.c cfg.h realm.c principal.c error.c krberror.c \ gztime.c diskio.c diskio.h authorize.c pki.c \ authenticator.c \ kdc.c kdcreq.c kdcrep.c enckdcreppart.c as.c tgs.c \ ap.c apreq.c aprep.c encapreppart.c \ safe.c priv.c \ ticket.c encticketpart.c tkt.c tkts.c tktccache.c \ ccache.c ccache.h \ netio.c \ key.c keys.c keytab.c hostkeys.c \ crypto.c crypto.h crypto-ctx.c \ asn1.c asn1.h kerberos5.c \ version.c password.c \ utils.c utils.h resolv.c \ kerberos5.asn1 \ low-crypto.c low-crypto.h if NULL libshishi_la_SOURCES += crypto-null.c endif if MD libshishi_la_SOURCES += crypto-md.c endif if DES libshishi_la_SOURCES += crypto-des.c endif if DES3 libshishi_la_SOURCES += crypto-3des.c endif if AES libshishi_la_SOURCES += crypto-aes.c endif if ARCFOUR libshishi_la_SOURCES += crypto-rc4.c endif if STARTTLS libshishi_la_SOURCES += starttls.c starttls.h endif libshishi_la_LIBADD = ../gl/libgnu.la $(LIB_CLOCK_GETTIME) \ $(LTLIBTASN1) $(LTLIBGNUTLS) $(LTLIBGCRYPT) $(LTLIBIDN) \ $(LTLIBINTL) $(LTLIBRESOLV) $(LIBSOCKET) libshishi_la_LDFLAGS = -no-undefined \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) if HAVE_LD_VERSION_SCRIPT libshishi_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libshishi.map else libshishi_la_LDFLAGS += -export-symbols-regex '^shishi.*' endif if HAVE_LD_OUTPUT_DEF libshishi_la_LDFLAGS += -Wl,--output-def,libshishi-$(SOVERSION).def defexecdir = $(bindir) defexec_DATA = libshishi-$(SOVERSION).def DISTCLEANFILES += $(defexec_DATA) endif kerberos5.c: $(srcdir)/kerberos5.asn1 -@ASN1PARSER@ -o $@ -n shishi_asn1_tab $(srcdir)/kerberos5.asn1 shishi-1.0.2/lib/krberror.c0000664000000000000000000011361212126660507012445 00000000000000/* krberror.c --- Functions related to KRB-ERROR packet. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" #define SHISHI_KRB_ERROR_DEFAULT_PVNO "5" #define SHISHI_KRB_ERROR_DEFAULT_PVNO_LEN 0 #define SHISHI_KRB_ERROR_DEFAULT_MSG_TYPE "30" #define SHISHI_KRB_ERROR_DEFAULT_MSG_TYPE_LEN 0 /** * shishi_krberror: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new KRB-ERROR, populated with some default * values. * * Return value: Returns the KRB-ERROR or NULL on failure. **/ Shishi_asn1 shishi_krberror (Shishi * handle) { Shishi_asn1 krberror; struct timeval tv; int rc; rc = gettimeofday (&tv, NULL); if (rc != 0) return NULL; krberror = shishi_asn1_krberror (handle); if (!krberror) return NULL; rc = shishi_asn1_write (handle, krberror, "pvno", SHISHI_KRB_ERROR_DEFAULT_PVNO, SHISHI_KRB_ERROR_DEFAULT_PVNO_LEN); if (rc == SHISHI_OK) rc = shishi_asn1_write (handle, krberror, "msg-type", SHISHI_KRB_ERROR_DEFAULT_MSG_TYPE, SHISHI_KRB_ERROR_DEFAULT_MSG_TYPE_LEN); if (rc == SHISHI_OK) rc = shishi_krberror_susec_set (handle, krberror, tv.tv_usec % 1000000); if (rc == SHISHI_OK) rc = shishi_asn1_write (handle, krberror, "stime", shishi_generalize_now (handle), 0); if (rc != SHISHI_OK) { shishi_error_printf (handle, "shishi_krberror() failed"); shishi_asn1_done (handle, krberror); krberror = NULL; } return krberror; } /** * shishi_krberror_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @krberror: KRB-ERROR to print. * * Print ASCII armored DER encoding of KRB-ERROR to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror) { return _shishi_print_armored_data (handle, fh, krberror, "KRB-ERROR", NULL); } /** * shishi_krberror_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @krberror: KRB-ERROR to save. * * Save DER encoding of KRB-ERROR to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_save (Shishi * handle, FILE * fh, Shishi_asn1 krberror) { return _shishi_save_data (handle, fh, krberror, "KRB-ERROR"); } /** * shishi_krberror_to_file: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write KRB-ERROR to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_to_file (Shishi * handle, Shishi_asn1 krberror, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing KRB-ERROR to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing KRB-ERROR in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_krberror_print (handle, fh, krberror); else res = shishi_krberror_save (handle, fh, krberror); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing KRB-ERROR to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_krberror_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @krberror: output variable with newly allocated KRB-ERROR. * * Read ASCII armored DER encoded KRB-ERROR from file and populate given * variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_parse (Shishi * handle, FILE * fh, Shishi_asn1 * krberror) { return _shishi_krberror_input (handle, fh, krberror, 0); } /** * shishi_krberror_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @krberror: output variable with newly allocated KRB-ERROR. * * Read DER encoded KRB-ERROR from file and populate given variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_read (Shishi * handle, FILE * fh, Shishi_asn1 * krberror) { return _shishi_krberror_input (handle, fh, krberror, 1); } /** * shishi_krberror_from_file: * @handle: shishi handle as allocated by shishi_init(). * @krberror: output variable with newly allocated KRB-ERROR. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read KRB-ERROR from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_from_file (Shishi * handle, Shishi_asn1 * krberror, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading KRB-ERROR from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading KRB-ERROR in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_krberror_parse (handle, fh, krberror); else res = shishi_krberror_read (handle, fh, krberror); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading KRB-ERROR from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_krberror_build: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * * Finish KRB-ERROR, called before e.g. shishi_krberror_der. This * function removes empty but OPTIONAL fields (such as cname), and * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_build (Shishi * handle, Shishi_asn1 krberror) { char *t; size_t tmplen = sizeof (t); char *tmp; int32_t errc; uint32_t usec; int rc; rc = shishi_krberror_ctime (handle, krberror, &t); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; free (t); if (rc == SHISHI_ASN1_NO_VALUE) { rc = shishi_krberror_remove_ctime (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_cusec (handle, krberror, &usec); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_ASN1_NO_VALUE) { rc = shishi_krberror_remove_cusec (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_crealm (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE) { rc = shishi_krberror_remove_crealm (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_client (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0)) { rc = shishi_krberror_remove_cname (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_realm (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE) { rc = shishi_krberror_set_realm (handle, krberror, ""); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_server (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE || tmplen == 0) { rc = shishi_krberror_remove_sname (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_edata (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0)) { rc = shishi_krberror_remove_edata (handle, krberror); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_errorcode (handle, krberror, &errc); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_ASN1_NO_VALUE) { rc = shishi_krberror_errorcode_set (handle, krberror, SHISHI_KRB_ERR_GENERIC); if (rc != SHISHI_OK) return rc; } rc = shishi_krberror_etext (handle, krberror, &tmp, &tmplen); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE) return rc; if (rc == SHISHI_OK) free (tmp); if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0)) { if (shishi_krberror_errorcode_fast (handle, krberror) == SHISHI_KRB_ERR_GENERIC) rc = shishi_krberror_set_etext (handle, krberror, "Uninitialized error"); else rc = shishi_krberror_remove_etext (handle, krberror); if (rc != SHISHI_OK) return rc; } return SHISHI_OK; } /** * shishi_krberror_der: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @out: output array with newly allocated DER encoding of KRB-ERROR. * @outlen: length of output array with DER encoding of KRB-ERROR. * * DER encode KRB-ERROR. The caller must deallocate the OUT buffer. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_der (Shishi * handle, Shishi_asn1 krberror, char **out, size_t * outlen) { int rc; rc = shishi_krberror_build (handle, krberror); if (rc != SHISHI_OK) return rc; rc = shishi_asn1_to_der (handle, krberror, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_krberror_crealm: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @realm: output array with newly allocated name of realm in KRB-ERROR. * @realmlen: size of output array. * * Extract client realm from KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_crealm (Shishi * handle, Shishi_asn1 krberror, char **realm, size_t * realmlen) { return shishi_asn1_read (handle, krberror, "crealm", realm, realmlen); } /** * shishi_krberror_remove_crealm: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * * Remove client realm field in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_crealm (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "crealm", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_set_crealm: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @crealm: input array with realm. * * Set realm field in krberror to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_crealm (Shishi * handle, Shishi_asn1 krberror, const char *crealm) { int res; res = shishi_asn1_write (handle, krberror, "crealm", crealm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_client: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @client: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Return client principal name in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_client (Shishi * handle, Shishi_asn1 krberror, char **client, size_t * clientlen) { int rc; rc = shishi_principal_name (handle, krberror, "cname", client, clientlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_krberror_set_cname: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @cname: input array with principal name. * * Set principal field in krberror to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_cname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char *cname[]) { int res; res = shishi_principal_name_set (handle, krberror, "cname", name_type, cname); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_remove_cname: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * * Remove client realm field in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_cname (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "cname", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_client_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror to set client name field in. * @client: zero-terminated string with principal name on RFC 1964 form. * * Set the client name field in the Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_client_set (Shishi * handle, Shishi_asn1 krberror, const char *client) { int res; res = shishi_principal_set (handle, krberror, "cname", client); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_realm: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @realm: output array with newly allocated name of realm in KRB-ERROR. * @realmlen: size of output array. * * Extract (server) realm from KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_realm (Shishi * handle, Shishi_asn1 krberror, char **realm, size_t * realmlen) { return shishi_asn1_read (handle, krberror, "realm", realm, realmlen); } /** * shishi_krberror_set_realm: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @realm: input array with (server) realm. * * Set (server) realm field in krberror to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_realm (Shishi * handle, Shishi_asn1 krberror, const char *realm) { int res; res = shishi_asn1_write (handle, krberror, "realm", realm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_server: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @server: pointer to newly allocated zero terminated string containing * server name. May be %NULL (to only populate @serverlen). * @serverlen: pointer to length of @server on output, excluding terminating * zero. May be %NULL (to only populate @server). * * Return server principal name in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_server (Shishi * handle, Shishi_asn1 krberror, char **server, size_t * serverlen) { int rc; rc = shishi_principal_name (handle, krberror, "sname", server, serverlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_krberror_remove_sname: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror to set server name field in. * * Remove server name field in KRB-ERROR. (Since it is not marked * OPTIONAL in the ASN.1 profile, what is done is to set the name-type * to UNKNOWN and make sure the name-string sequence is empty.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_sname (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write_int32 (handle, krberror, "sname.name-type", SHISHI_NT_UNKNOWN); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, krberror, "sname.name-string", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_set_sname: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @sname: input array with principal name. * * Set principal field in krberror to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_sname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char *sname[]) { int res; res = shishi_principal_name_set (handle, krberror, "sname", name_type, sname); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_server_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror to set server name field in. * @server: zero-terminated string with principal name on RFC 1964 form. * * Set the server name field in the Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_server_set (Shishi * handle, Shishi_asn1 krberror, const char *server) { int res; res = shishi_principal_set (handle, krberror, "sname", server); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_ctime: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror to set client name field in. * @t: newly allocated zero-terminated output array with client time. * * Extract client time from KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_ctime (Shishi * handle, Shishi_asn1 krberror, char **t) { return shishi_time (handle, krberror, "ctime", t); } /** * shishi_krberror_ctime_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * @t: string with generalized time value to store in Krberror. * * Store client time in Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_ctime_set (Shishi * handle, Shishi_asn1 krberror, const char *t) { int res; if (t) res = shishi_asn1_write (handle, krberror, "ctime", t, SHISHI_GENERALIZEDTIME_LENGTH); else res = shishi_asn1_write (handle, krberror, "ctime", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_remove_ctime: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * * Remove client time field in Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_ctime (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "ctime", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_cusec: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * @cusec: output integer with client microseconds field. * * Extract client microseconds field from Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_cusec (Shishi * handle, Shishi_asn1 krberror, uint32_t * cusec) { int res; res = shishi_asn1_read_uint32 (handle, krberror, "cusec", cusec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_cusec_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @cusec: client microseconds to set in krberror, 0-999999. * * Set the cusec field in the Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_cusec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t cusec) { int res; res = shishi_asn1_write_uint32 (handle, krberror, "cusec", cusec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_remove_cusec: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * * Remove client usec field in Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_cusec (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "cusec", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_stime: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror to set client name field in. * @t: newly allocated zero-terminated output array with server time. * * Extract server time from KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_stime (Shishi * handle, Shishi_asn1 krberror, char **t) { return shishi_time (handle, krberror, "stime", t); } /** * shishi_krberror_stime_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * @t: string with generalized time value to store in Krberror. * * Store server time in Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_stime_set (Shishi * handle, Shishi_asn1 krberror, const char *t) { int res; res = shishi_asn1_write (handle, krberror, "stime", t, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_susec: * @handle: shishi handle as allocated by shishi_init(). * @krberror: Krberror as allocated by shishi_krberror(). * @susec: output integer with server microseconds field. * * Extract server microseconds field from Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_susec (Shishi * handle, Shishi_asn1 krberror, uint32_t * susec) { int res; res = shishi_asn1_read_uint32 (handle, krberror, "susec", susec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_susec_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @susec: server microseconds to set in krberror, 0-999999. * * Set the susec field in the Krberror. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_susec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t susec) { int res; res = shishi_asn1_write_uint32 (handle, krberror, "susec", susec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_errorcode: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * @errorcode: output integer KRB-ERROR error code. * * Extract error code from KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_errorcode (Shishi * handle, Shishi_asn1 krberror, int32_t * errorcode) { return shishi_asn1_read_int32 (handle, krberror, "error-code", errorcode); } /** * shishi_krberror_errorcode_fast: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * * Get error code from KRB-ERROR, without error checking. * * Return value: Return error code (see shishi_krberror_errorcode()) * directly, or -1 on error. **/ int shishi_krberror_errorcode_fast (Shishi * handle, Shishi_asn1 krberror) { int i; if (shishi_krberror_errorcode (handle, krberror, &i) != SHISHI_OK) i = -1; return i; } /** * shishi_krberror_errorcode_set: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code to set. * @errorcode: new error code to set in krberror. * * Set the error-code field to a new error code. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_errorcode_set (Shishi * handle, Shishi_asn1 krberror, int errorcode) { int res; res = shishi_asn1_write_int32 (handle, krberror, "error-code", errorcode); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_etext: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * @etext: output array with newly allocated error text. * @etextlen: output length of error text. * * Extract additional error text from server (possibly empty). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_etext (Shishi * handle, Shishi_asn1 krberror, char **etext, size_t * etextlen) { return shishi_asn1_read (handle, krberror, "e-text", etext, etextlen); } /** * shishi_krberror_set_etext: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @etext: input array with error text to set. * * Set error text (e-text) field in KRB-ERROR to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_etext (Shishi * handle, Shishi_asn1 krberror, const char *etext) { int res; res = shishi_asn1_write (handle, krberror, "e-text", etext, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_remove_etext: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * * Remove error text (e-text) field in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_etext (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "e-text", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_edata: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * @edata: output array with newly allocated error data. * @edatalen: output length of error data. * * Extract additional error data from server (possibly empty). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_edata (Shishi * handle, Shishi_asn1 krberror, char **edata, size_t * edatalen) { return shishi_asn1_read (handle, krberror, "e-data", edata, edatalen); } /** * shishi_krberror_methoddata: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * @methoddata: output ASN.1 METHOD-DATA. * * Extract METHOD-DATA ASN.1 object from the e-data field. The e-data * field will only contain a METHOD-DATA if the krberror error code is * %SHISHI_KDC_ERR_PREAUTH_REQUIRED. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_methoddata (Shishi * handle, Shishi_asn1 krberror, Shishi_asn1 * methoddata) { int rc; *methoddata = NULL; if (shishi_krberror_errorcode_fast (handle, krberror) == SHISHI_KDC_ERR_PREAUTH_REQUIRED) { char *buf; size_t len; rc = shishi_krberror_edata (handle, krberror, &buf, &len); if (rc != SHISHI_OK) return rc; *methoddata = shishi_der2asn1_methoddata (handle, buf, len); free (buf); if (!*methoddata) return SHISHI_ASN1_ERROR; } return SHISHI_OK; } /** * shishi_krberror_set_edata: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * @edata: input array with error text to set. * * Set error text (e-data) field in KRB-ERROR to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_set_edata (Shishi * handle, Shishi_asn1 krberror, const char *edata) { int res; res = shishi_asn1_write (handle, krberror, "e-data", edata, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_remove_edata: * @handle: shishi handle as allocated by shishi_init(). * @krberror: krberror as allocated by shishi_krberror(). * * Remove error text (e-data) field in KRB-ERROR. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_remove_edata (Shishi * handle, Shishi_asn1 krberror) { int res; res = shishi_asn1_write (handle, krberror, "e-data", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_krberror_pretty_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle opened for writing. * @krberror: KRB-ERROR structure with error code. * * Print KRB-ERROR error condition and some explanatory text to file * descriptor. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_krberror_pretty_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror) { char *buf; size_t len; int res; if (VERBOSEASN1 (handle)) shishi_krberror_print (handle, fh, krberror); if (shishi_krberror_errorcode_fast (handle, krberror) == SHISHI_KRB_ERR_GENERIC) { fprintf (fh, "Generic error from server:\n"); res = shishi_krberror_etext (handle, krberror, &buf, &len); if (res == SHISHI_OK && len > 0) { buf[len] = '\0'; fprintf (fh, "%s\n", buf); free (buf); } } else { fprintf (fh, "Error code from server:\n%s\n", shishi_krberror_message (handle, krberror)); res = shishi_krberror_etext (handle, krberror, &buf, &len); if (res == SHISHI_OK && len > 0) { buf[len] = '\0'; fprintf (fh, "Additional error message from server:\n%s\n", buf); free (buf); } if (shishi_krberror_errorcode_fast (handle, krberror) == SHISHI_KDC_ERR_PREAUTH_REQUIRED) { Shishi_asn1 pas; size_t i, n; res = shishi_krberror_methoddata (handle, krberror, &pas); if (res != SHISHI_OK) return res; if (VERBOSEASN1 (handle)) shishi_methoddata_print (handle, stdout, pas); res = shishi_asn1_number_of_elements (handle, pas, "", &n); if (res == SHISHI_OK) { fprintf (fh, "Types of PA-DATA in KRB-ERROR: "); for (i = 1; i <= n; i++) { char *format = xasprintf ("?%ld.padata-type", i); int32_t padatatype; if (i > 1) fprintf (fh, ", "); res = shishi_asn1_read_int32 (handle, pas, format, &padatatype); if (res == SHISHI_OK) printf ("%d", padatatype); free (format); } fprintf (fh, ".\n"); } shishi_asn1_done (handle, pas); } } return SHISHI_OK; } struct krb_error_msgs { int errorcode; const char *message; }; static const struct krb_error_msgs _shishi_krberror_messages[SHISHI_LAST_ERROR_CODE] = { {SHISHI_KDC_ERR_NONE, N_("No error")}, {SHISHI_KDC_ERR_NAME_EXP, N_("Client's entry in database has expired")}, {SHISHI_KDC_ERR_SERVICE_EXP, N_("Server's entry in database has expired")}, {SHISHI_KDC_ERR_BAD_PVNO, N_("Requested protocol version number not supported")}, {SHISHI_KDC_ERR_C_OLD_MAST_KVNO, N_("Client's key encrypted in old master key")}, {SHISHI_KDC_ERR_S_OLD_MAST_KVNO, N_("Server's key encrypted in old master key")}, {SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN, N_("Client not found in database")}, {SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN, N_("Server not found in database")}, {SHISHI_KDC_ERR_PRINCIPAL_NOT_UNIQUE, N_("Multiple principal entries in database")}, {SHISHI_KDC_ERR_NULL_KEY, N_("The client or server has a null key")}, {SHISHI_KDC_ERR_CANNOT_POSTDATE, N_("Ticket not eligible for postdating")}, {SHISHI_KDC_ERR_NEVER_VALID, N_("Requested start time is later than end time")}, {SHISHI_KDC_ERR_POLICY, N_("KDC policy rejects request")}, {SHISHI_KDC_ERR_BADOPTION, N_("KDC cannot accommodate requested option")}, {SHISHI_KDC_ERR_ETYPE_NOSUPP, N_("KDC has no support for encryption type")}, {SHISHI_KDC_ERR_SUMTYPE_NOSUPP, N_("KDC has no support for checksum type")}, {SHISHI_KDC_ERR_PADATA_TYPE_NOSUPP, N_("KDC has no support for padata type")}, {SHISHI_KDC_ERR_TRTYPE_NOSUPP, N_("KDC has no support for transited type")}, {SHISHI_KDC_ERR_CLIENT_REVOKED, N_("Clients credentials have been revoked")}, {SHISHI_KDC_ERR_SERVICE_REVOKED, N_("Credentials for server have been revoked")}, {SHISHI_KDC_ERR_TGT_REVOKED, N_("TGT has been revoked")}, {SHISHI_KDC_ERR_CLIENT_NOTYET, N_("Client not yet valid - try again later")}, {SHISHI_KDC_ERR_SERVICE_NOTYET, N_("Server not yet valid - try again later")}, {SHISHI_KDC_ERR_KEY_EXPIRED, N_("Password has expired ")}, {SHISHI_KDC_ERR_PREAUTH_FAILED, N_("Pre-authentication information was invalid")}, {SHISHI_KDC_ERR_PREAUTH_REQUIRED, N_("Additional pre-authentication required")}, {SHISHI_KDC_ERR_SERVER_NOMATCH, N_("Requested server and ticket don't match")}, {SHISHI_KDC_ERR_MUST_USE_USER2USER, N_("Server principal valid for user2user only")}, {SHISHI_KDC_ERR_PATH_NOT_ACCPETED, N_("KDC Policy rejects transited path")}, {SHISHI_KDC_ERR_SVC_UNAVAILABLE, N_("A service is not available")}, {SHISHI_KRB_AP_ERR_BAD_INTEGRITY, N_("Integrity check on decrypted field failed")}, {SHISHI_KRB_AP_ERR_TKT_EXPIRED, N_("Ticket expired")}, {SHISHI_KRB_AP_ERR_TKT_NYV, N_("Ticket not yet valid")}, {SHISHI_KRB_AP_ERR_REPEAT, N_("Request is a replay")}, {SHISHI_KRB_AP_ERR_NOT_US, N_("The ticket isn't for us")}, {SHISHI_KRB_AP_ERR_BADMATCH, N_("Ticket and authenticator don't match")}, {SHISHI_KRB_AP_ERR_SKEW, N_("Clock skew too great")}, {SHISHI_KRB_AP_ERR_BADADDR, N_("Incorrect net address")}, {SHISHI_KRB_AP_ERR_BADVERSION, N_("Protocol version mismatch")}, {SHISHI_KRB_AP_ERR_MSG_TYPE, N_("Invalid msg type")}, {SHISHI_KRB_AP_ERR_MODIFIED, N_("Message stream modified")}, {SHISHI_KRB_AP_ERR_BADORDER, N_("Message out of order")}, {SHISHI_KRB_AP_ERR_BADKEYVER, N_("Specified version of key is not available")}, {SHISHI_KRB_AP_ERR_NOKEY, N_("Service key not available")}, {SHISHI_KRB_AP_ERR_MUT_FAIL, N_("Mutual authentication failed")}, {SHISHI_KRB_AP_ERR_BADDIRECTION, N_("Incorrect message direction")}, {SHISHI_KRB_AP_ERR_METHOD, N_("Alternative authentication method required")}, {SHISHI_KRB_AP_ERR_BADSEQ, N_("Incorrect sequence number in message")}, {SHISHI_KRB_AP_ERR_INAPP_CKSUM, N_("Inappropriate type of checksum in message")}, {SHISHI_KRB_AP_PATH_NOT_ACCEPTED, N_("Policy rejects transited path")}, {SHISHI_KRB_ERR_RESPONSE_TOO_BIG, N_("Response too big for UDP, retry with TCP")}, {SHISHI_KRB_ERR_GENERIC, N_("Generic error (description in e-text)")}, {SHISHI_KRB_ERR_FIELD_TOOLONG, N_("Field is too long for this implementation")}, {SHISHI_KDC_ERROR_CLIENT_NOT_TRUSTED, N_("(pkinit)")}, {SHISHI_KDC_ERROR_KDC_NOT_TRUSTED, N_("(pkinit)")}, {SHISHI_KDC_ERROR_INVALID_SIG, N_("(pkinit)")}, {SHISHI_KDC_ERR_KEY_TOO_WEAK, N_("(pkinit)")}, {SHISHI_KDC_ERR_CERTIFICATE_MISMATCH, N_("(pkinit)")}, {SHISHI_KRB_AP_ERR_NO_TGT, N_("(user-to-user)")}, {SHISHI_KDC_ERR_WRONG_REALM, N_("(user-to-user)")}, {SHISHI_KRB_AP_ERR_USER_TO_USER_REQUIRED, N_("(user-to-user)")}, {SHISHI_KDC_ERR_CANT_VERIFY_CERTIFICATE, N_("(pkinit)")}, {SHISHI_KDC_ERR_INVALID_CERTIFICATE, N_("(pkinit)")}, {SHISHI_KDC_ERR_REVOKED_CERTIFICATE, N_("(pkinit)")}, {SHISHI_KDC_ERR_REVOCATION_STATUS_UNKNOWN, N_("(pkinit)")}, {SHISHI_KDC_ERR_REVOCATION_STATUS_UNAVAILABLE, N_("(pkinit)")}, {SHISHI_KDC_ERR_CLIENT_NAME_MISMATCH, N_("(pkinit)")}, {SHISHI_KDC_ERR_KDC_NAME_MISMATCH, N_("(pkinit)")} }; /** * shishi_krberror_errorcode_message: * @handle: shishi handle as allocated by shishi_init(). * @errorcode: integer KRB-ERROR error code. * * Get human readable string describing KRB-ERROR code. * * Return value: Return a string describing error code. This function * will always return a string even if the error code * isn't known. **/ const char * shishi_krberror_errorcode_message (Shishi * handle, int errorcode) { int i; char *p; for (i = 0; i < SHISHI_LAST_ERROR_CODE; i++) { if (errorcode == _shishi_krberror_messages[i].errorcode) return _(_shishi_krberror_messages[i].message); } /* XXX memory leak */ asprintf (&p, _("Unknown KRB-ERROR error code %d."), errorcode); return p; } /** * shishi_krberror_message: * @handle: shishi handle as allocated by shishi_init(). * @krberror: KRB-ERROR structure with error code. * * Extract error code (see shishi_krberror_errorcode_fast()) and * return error message (see shishi_krberror_errorcode_message()). * * Return value: Return a string describing error code. This function * will always return a string even if the error code * isn't known. **/ const char * shishi_krberror_message (Shishi * handle, Shishi_asn1 krberror) { return shishi_krberror_errorcode_message (handle, shishi_krberror_errorcode_fast (handle, krberror)); } shishi-1.0.2/lib/tgs.c0000664000000000000000000004212412126660507011411 00000000000000/* tgs.c --- High level client TGS functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* TODO: make shishi_tgs_realmsname() take real sname pointer array. */ #include "internal.h" struct Shishi_tgs { Shishi *handle; Shishi_asn1 tgsreq; Shishi_tkt *tgtkt; Shishi_ap *ap; Shishi_asn1 tgsrep; Shishi_asn1 krberror; Shishi_tkt *tkt; }; /** * shishi_tgs: * @handle: shishi handle as allocated by shishi_init(). * @tgs: holds pointer to newly allocate Shishi_tgs structure. * * Allocate a new TGS exchange variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs (Shishi * handle, Shishi_tgs ** tgs) { Shishi_tgs *ltgs; int res; *tgs = xcalloc (1, sizeof (**tgs)); ltgs = *tgs; ltgs->handle = handle; ltgs->tgsreq = shishi_tgsreq (handle); if (ltgs->tgsreq == NULL) { shishi_error_printf (handle, "Could not create TGS-REQ: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } ltgs->tgsrep = shishi_tgsrep (handle); if (ltgs->tgsreq == NULL) { shishi_error_printf (handle, "Could not create TGS-REP: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } ltgs->krberror = shishi_krberror (handle); if (ltgs->krberror == NULL) { shishi_error_printf (handle, "Could not create KRB-ERROR: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } res = shishi_ap_nosubkey (handle, <gs->ap); if (res != SHISHI_OK) return res; res = shishi_authenticator_remove_subkey (handle, shishi_ap_authenticator (ltgs->ap)); if (res != SHISHI_OK) return res; res = shishi_tkt (handle, <gs->tkt); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_tgs_done: * @tgs: structure that holds information about AS exchange * * Deallocate resources associated with TGS exchange. This should be * called by the application when it no longer need to utilize the TGS * exchange handle. **/ void shishi_tgs_done (Shishi_tgs * tgs) { shishi_asn1_done (tgs->handle, tgs->tgsreq); shishi_asn1_done (tgs->handle, tgs->tgsrep); shishi_asn1_done (tgs->handle, tgs->krberror); shishi_ap_done (tgs->ap); shishi_tkt_done (tgs->tkt); free (tgs); } /** * shishi_tgs_tgtkt: * @tgs: structure that holds information about TGS exchange * * Get Ticket-granting-ticket from TGS exchange. * * Return value: Returns the ticket-granting-ticket used in the TGS * exchange, or NULL if not yet set or an error occured. **/ Shishi_tkt * shishi_tgs_tgtkt (Shishi_tgs * tgs) { return tgs->tgtkt; } /** * shishi_tgs_tgtkt_set: * @tgs: structure that holds information about TGS exchange * @tgtkt: ticket granting ticket to store in TGS. * * Set the Ticket in the TGS exchange. **/ void shishi_tgs_tgtkt_set (Shishi_tgs * tgs, Shishi_tkt * tgtkt) { tgs->tgtkt = tgtkt; } /** * shishi_tgs_ap: * @tgs: structure that holds information about TGS exchange * * Get the AP from TGS exchange. * * Return value: Returns the AP exchange (part of TGS-REQ) from the * TGS exchange, or NULL if not yet set or an error * occured. **/ Shishi_ap * shishi_tgs_ap (Shishi_tgs * tgs) { return tgs->ap; } /** * shishi_tgs_req: * @tgs: structure that holds information about TGS exchange * * Get the TGS-REQ from TGS exchange. * * Return value: Returns the generated TGS-REQ from the TGS exchange, * or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_tgs_req (Shishi_tgs * tgs) { return tgs->tgsreq; } /** * shishi_tgs_req_set: * @tgs: structure that holds information about TGS exchange * @tgsreq: tgsreq to store in TGS. * * Set the TGS-REQ in the TGS exchange. **/ void shishi_tgs_req_set (Shishi_tgs * tgs, Shishi_asn1 tgsreq) { if (tgs->tgsreq) shishi_asn1_done (tgs->handle, tgs->tgsreq); tgs->tgsreq = tgsreq; } /** * shishi_tgs_req_der: * @tgs: structure that holds information about TGS exchange * @out: output array with newly allocated DER encoding of TGS-REQ. * @outlen: length of output array with DER encoding of TGS-REQ. * * DER encode TGS-REQ. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_req_der (Shishi_tgs * tgs, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (tgs->handle, tgs->tgsreq, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_tgs_req_der_set: * @tgs: structure that holds information about TGS exchange * @der: input array with DER encoded AP-REQ. * @derlen: length of input array with DER encoded AP-REQ. * * DER decode TGS-REQ and set it TGS exchange. If decoding fails, the * TGS-REQ in the TGS exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_tgs_req_der_set (Shishi_tgs * tgs, char *der, size_t derlen) { Shishi_asn1 tgsreq; tgsreq = shishi_der2asn1_tgsreq (tgs->handle, der, derlen); if (tgsreq == NULL) return SHISHI_ASN1_ERROR; tgs->tgsreq = tgsreq; return SHISHI_OK; } /** * shishi_tgs_req_process: * @tgs: structure that holds information about TGS exchange * * Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ * is taken from the EncKDCReqPart of the TGS tgticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_req_process (Shishi_tgs * tgs) { Shishi_asn1 apreq; int rc; if (VERBOSE (tgs->handle)) printf ("Processing TGS-REQ...\n"); rc = shishi_kdcreq_get_padata_tgs (tgs->handle, tgs->tgsreq, &apreq); if (rc != SHISHI_OK) return rc; shishi_ap_req_set (tgs->ap, apreq); rc = shishi_ap_req_decode (tgs->ap); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_tgs_req_build: * @tgs: structure that holds information about TGS exchange * * Checksum data in authenticator and add ticket and authenticator to * TGS-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_req_build (Shishi_tgs * tgs) { uint32_t apoptions; int res; if (VERBOSE (tgs->handle)) printf ("Building TGS-REQ...\n"); res = shishi_kdcreq_build (tgs->handle, tgs->tgsreq); if (res != SHISHI_OK) return res; res = shishi_apreq_options (tgs->handle, shishi_ap_req (tgs->ap), &apoptions); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not get AP-REQ AP-Options: %s\n", shishi_strerror (res)); return res; } res = shishi_ap_set_tktoptionsasn1usage (tgs->ap, tgs->tgtkt, apoptions, tgs->tgsreq, "req-body", SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR_CKSUM, SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR); if (res == SHISHI_OK) res = shishi_ap_req_build (tgs->ap); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not make AP-REQ: %s\n", shishi_strerror (res)); return res; } if (VERBOSE (tgs->handle)) printf ("Got AP-REQ...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_apreq_print (tgs->handle, stdout, shishi_ap_req (tgs->ap)); res = shishi_kdcreq_add_padata_tgs (tgs->handle, tgs->tgsreq, shishi_ap_req (tgs->ap)); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not add AP-REQ to TGS: %s\n", shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_tgs_rep: * @tgs: structure that holds information about TGS exchange * * Get TGS-REP from TGS exchange. * * Return value: Returns the received TGS-REP from the TGS exchange, * or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_tgs_rep (Shishi_tgs * tgs) { return tgs->tgsrep; } /** * shishi_tgs_rep_der: * @tgs: structure that holds information about TGS exchange * @out: output array with newly allocated DER encoding of TGS-REP. * @outlen: length of output array with DER encoding of TGS-REP. * * DER encode TGS-REP. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_rep_der (Shishi_tgs * tgs, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (tgs->handle, tgs->tgsrep, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_tgs_rep_process: * @tgs: structure that holds information about TGS exchange * * Process new TGS-REP and set ticket. The key to decrypt the TGS-REP * is taken from the EncKDCRepPart of the TGS tgticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_rep_process (Shishi_tgs * tgs) { Shishi_asn1 kdcreppart, ticket; int res; if (VERBOSE (tgs->handle)) printf ("Processing TGS-REQ and TGS-REP...\n"); res = shishi_tgs_process (tgs->handle, tgs->tgsreq, tgs->tgsrep, shishi_ap_authenticator (tgs->ap), shishi_tkt_enckdcreppart (tgs->tgtkt), &kdcreppart); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not process TGS: %s", shishi_strerror (res)); return res; } if (VERBOSE (tgs->handle)) printf ("Got EncKDCRepPart...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_enckdcreppart_print (tgs->handle, stdout, kdcreppart); res = shishi_kdcrep_get_ticket (tgs->handle, tgs->tgsrep, &ticket); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not extract ticket from TGS-REP: %s", shishi_strerror (res)); return res; } if (VERBOSE (tgs->handle)) printf ("Got Ticket...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_ticket_print (tgs->handle, stdout, ticket); /* XXX */ tgs->tkt = shishi_tkt2 (tgs->handle, ticket, kdcreppart, tgs->tgsrep); return SHISHI_OK; } /** * shishi_tgs_rep_build: * @tgs: structure that holds information about TGS exchange * @keyusage: keyusage integer. * @key: user's key, used to encrypt the encrypted part of the TGS-REP. * * Build TGS-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_rep_build (Shishi_tgs * tgs, int keyusage, Shishi_key * key) { int rc; /* XXX there are reasons for having padata in TGS-REP */ rc = shishi_kdcrep_clear_padata (tgs->handle, tgs->tgsrep); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_populate_encticketpart (tgs->handle, shishi_tkt_enckdcreppart (tgs->tkt), shishi_tkt_encticketpart (tgs->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_nonce (tgs->handle, tgs->tgsreq, shishi_tkt_enckdcreppart (tgs->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_add_enc_part (tgs->handle, tgs->tgsrep, key, keyusage, shishi_tkt_enckdcreppart (tgs->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_set_ticket (tgs->handle, tgs->tgsrep, shishi_tkt_ticket (tgs->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_crealm (tgs->handle, tgs->tgsrep, shishi_tkt_encticketpart (tgs->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_cname (tgs->handle, tgs->tgsrep, shishi_tkt_encticketpart (tgs->tkt)); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_tgs_krberror: * @tgs: structure that holds information about TGS exchange * * Get KRB-ERROR from TGS exchange. * * Return value: Returns the received TGS-REP from the TGS exchange, * or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_tgs_krberror (Shishi_tgs * tgs) { return tgs->krberror; } /** * shishi_tgs_krberror_der: * @tgs: structure that holds information about TGS exchange * @out: output array with newly allocated DER encoding of KRB-ERROR. * @outlen: length of output array with DER encoding of KRB-ERROR. * * DER encode KRB-ERROR. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_krberror_der (Shishi_tgs * tgs, char **out, size_t * outlen) { int rc; rc = shishi_krberror_der (tgs->handle, tgs->krberror, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_tgs_krberror_set: * @tgs: structure that holds information about TGS exchange * @krberror: krberror to store in TGS. * * Set the KRB-ERROR in the TGS exchange. **/ void shishi_tgs_krberror_set (Shishi_tgs * tgs, Shishi_asn1 krberror) { if (tgs->krberror) shishi_asn1_done (tgs->handle, tgs->krberror); tgs->krberror = krberror; } /** * shishi_tgs_tkt: * @tgs: structure that holds information about TGS exchange * * Get Ticket from TGS exchange. * * Return value: Returns the newly acquired ticket from the TGS * exchange, or NULL if not yet set or an error occured. **/ Shishi_tkt * shishi_tgs_tkt (Shishi_tgs * tgs) { return tgs->tkt; } /** * shishi_tgs_tkt_set: * @tgs: structure that holds information about TGS exchange * @tkt: ticket to store in TGS. * * Set the Ticket in the TGS exchange. **/ void shishi_tgs_tkt_set (Shishi_tgs * tgs, Shishi_tkt * tkt) { tgs->tkt = tkt; } /** * shishi_tgs_sendrecv_hint: * @tgs: structure that holds information about TGS exchange * @hint: additional parameters that modify connection behaviour, or %NULL. * * Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the * subsequent authentication, usually used to acquire server tickets. * The @hint structure can be used to set, e.g., parameters for TLS * authentication. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_sendrecv_hint (Shishi_tgs * tgs, Shishi_tkts_hint * hint) { int res; if (VERBOSE (tgs->handle)) printf ("Sending TGS-REQ...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_kdcreq_print (tgs->handle, stdout, tgs->tgsreq); res = shishi_kdcreq_sendrecv_hint (tgs->handle, tgs->tgsreq, &tgs->tgsrep, hint); if (res == SHISHI_GOT_KRBERROR) { tgs->krberror = tgs->tgsrep; tgs->tgsrep = NULL; if (VERBOSE (tgs->handle)) printf ("Received KRB-ERROR...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_krberror_print (tgs->handle, stdout, tgs->krberror); } if (res != SHISHI_OK) return res; if (VERBOSE (tgs->handle)) printf ("Received TGS-REP...\n"); if (VERBOSEASN1 (tgs->handle)) shishi_kdcrep_print (tgs->handle, stdout, tgs->tgsrep); return SHISHI_OK; } /** * shishi_tgs_sendrecv: * @tgs: structure that holds information about TGS exchange * * Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the * subsequent authentication, usually used to acquire server tickets. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_sendrecv (Shishi_tgs * tgs) { return shishi_tgs_sendrecv_hint (tgs, NULL); } /** * shishi_tgs_set_server: * @tgs: structure that holds information about TGS exchange * @server: indicates the server to acquire ticket for. * * Set the server in the TGS-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_set_server (Shishi_tgs * tgs, const char *server) { int res; res = shishi_kdcreq_set_server (tgs->handle, tgs->tgsreq, server); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not set server in KDC-REQ: %s\n", shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_tgs_set_realm: * @tgs: structure that holds information about TGS exchange * @realm: indicates the realm to acquire ticket for. * * Set the server in the TGS-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_set_realm (Shishi_tgs * tgs, const char *realm) { int res; res = shishi_kdcreq_set_realm (tgs->handle, tgs->tgsreq, realm); if (res != SHISHI_OK) { shishi_error_printf (tgs->handle, "Could not set realm in KDC-REQ: %s\n", shishi_strerror (res)); return res; } return SHISHI_OK; } /** * shishi_tgs_set_realmserver: * @tgs: structure that holds information about TGS exchange * @realm: indicates the realm to acquire ticket for. * @server: indicates the server to acquire ticket for. * * Set the realm and server in the TGS-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tgs_set_realmserver (Shishi_tgs * tgs, const char *realm, const char *server) { int res; res = shishi_tgs_set_server (tgs, server); if (res != SHISHI_OK) return res; res = shishi_tgs_set_realm (tgs, realm); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/low-crypto.c0000664000000000000000000003756412126660507012747 00000000000000/* low-crypto.c --- Shishi crypto wrappers around generic crypto. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include "gc.h" #include "arcfour.h" #include #include "crc.h" #include "low-crypto.h" int _shishi_crypto_init (Shishi * handle) { int rc = gc_init (); if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } void _shishi_quick_random (void) { gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0); } /** * shishi_randomize: * @handle: shishi handle as allocated by shishi_init(). * @strong: 0 iff operation should not block, non-0 for very strong randomness. * @data: output array to be filled with random data. * @datalen: size of output array. * * Store cryptographically random data of given size in the provided * buffer. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_randomize (Shishi * handle, int strong, void *data, size_t datalen) { Gc_rc rc; if (strong) rc = gc_random (data, datalen); else rc = gc_pseudo_random (data, datalen); if (rc != GC_OK) return SHISHI_FILE_ERROR; return SHISHI_OK; } /** * shishi_crc: * @handle: shishi handle as allocated by shishi_init(). * @in: input character array of data to checksum. * @inlen: length of input character array of data to checksum. * @out: newly allocated character array with checksum of data. * * Compute checksum of data using CRC32 modified according to RFC * 1510. The @out buffer must be deallocated by the caller. * * The modifications compared to standard CRC32 is that no initial and * final XOR is performed, and that the output is returned in * LSB-first order. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_crc (Shishi * handle, const char *in, size_t inlen, char *out[4]) { uint32_t crc = crc32_update_no_xor (0, in, inlen); *out = xmalloc (4); (*out)[0] = crc & 0xFF; (*out)[1] = (crc >> 8) & 0xFF; (*out)[2] = (crc >> 16) & 0xFF; (*out)[3] = (crc >> 24) & 0xFF; return SHISHI_OK; } /** * shishi_md4: * @handle: shishi handle as allocated by shishi_init(). * @in: input character array of data to hash. * @inlen: length of input character array of data to hash. * @out: newly allocated character array with hash of data. * * Compute hash of data using MD4. The @out buffer must be * deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_md4 (Shishi * handle, const char *in, size_t inlen, char *out[16]) { Gc_rc rc; *out = xmalloc (GC_MD4_DIGEST_SIZE); rc = gc_md4 (in, inlen, *out); if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } /** * shishi_md5: * @handle: shishi handle as allocated by shishi_init(). * @in: input character array of data to hash. * @inlen: length of input character array of data to hash. * @out: newly allocated character array with hash of data. * * Compute hash of data using MD5. The @out buffer must be * deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_md5 (Shishi * handle, const char *in, size_t inlen, char *out[16]) { Gc_rc rc; *out = xmalloc (GC_MD5_DIGEST_SIZE); rc = gc_md5 (in, inlen, *out); if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } /** * shishi_hmac_md5: * @handle: shishi handle as allocated by shishi_init(). * @key: input character array with key to use. * @keylen: length of input character array with key to use. * @in: input character array of data to hash. * @inlen: length of input character array of data to hash. * @outhash: newly allocated character array with keyed hash of data. * * Compute keyed checksum of data using HMAC-MD5. The @outhash buffer * must be deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_hmac_md5 (Shishi * handle, const char *key, size_t keylen, const char *in, size_t inlen, char *outhash[16]) { Gc_rc rc; *outhash = xmalloc (GC_MD5_DIGEST_SIZE); rc = gc_hmac_md5 (key, keylen, in, inlen, *outhash); if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } /** * shishi_hmac_sha1: * @handle: shishi handle as allocated by shishi_init(). * @key: input character array with key to use. * @keylen: length of input character array with key to use. * @in: input character array of data to hash. * @inlen: length of input character array of data to hash. * @outhash: newly allocated character array with keyed hash of data. * * Compute keyed checksum of data using HMAC-SHA1. The @outhash * buffer must be deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_hmac_sha1 (Shishi * handle, const char *key, size_t keylen, const char *in, size_t inlen, char *outhash[20]) { Gc_rc rc; *outhash = xmalloc (GC_SHA1_DIGEST_SIZE); rc = gc_hmac_sha1 (key, keylen, in, inlen, *outhash); if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } /** * shishi_des_cbc_mac: * @handle: shishi handle as allocated by shishi_init(). * @key: input character array with key to use. * @iv: input character array with initialization vector to use, can be NULL. * @in: input character array of data to hash. * @inlen: length of input character array of data to hash. * @out: newly allocated character array with keyed hash of data. * * Computed keyed checksum of data using DES-CBC-MAC. The @out buffer * must be deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_des_cbc_mac (Shishi * handle, const char key[8], const char iv[8], const char *in, size_t inlen, char *out[8]) { gcry_cipher_hd_t ch; gpg_error_t err; int res = SHISHI_CRYPTO_INTERNAL_ERROR; err = gcry_cipher_open (&ch, GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_MAC); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "DES-CBC-MAC not available in libgcrypt"); return SHISHI_CRYPTO_INTERNAL_ERROR; } err = gcry_cipher_setkey (ch, key, 8); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "DES setkey failed"); shishi_error_set (handle, gpg_strerror (err)); goto done; } err = gcry_cipher_setiv (ch, iv, 8); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "DES setiv failed"); shishi_error_set (handle, gpg_strerror (err)); goto done; } *out = xmalloc (8); err = gcry_cipher_encrypt (ch, *out, 8, in, inlen); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "DES encrypt failed"); shishi_error_set (handle, gpg_strerror (err)); goto done; } res = SHISHI_OK; done: gcry_cipher_close (ch); return res; } static int libgcrypt_dencrypt (Shishi * handle, int algo, int flags, int mode, int decryptp, const char *key, size_t keylen, const char *iv, char **ivout, const char *in, size_t inlen, char **out) { size_t ivlen = gcry_cipher_get_algo_blklen (algo); gcry_cipher_hd_t ch; gpg_error_t err; err = gcry_cipher_open (&ch, algo, mode, flags); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "Libgcrypt cipher open failed"); shishi_error_set (handle, gpg_strerror (err)); return SHISHI_CRYPTO_INTERNAL_ERROR; } err = gcry_cipher_setkey (ch, key, keylen); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "Libgcrypt setkey failed"); shishi_error_set (handle, gpg_strerror (err)); return SHISHI_CRYPTO_INTERNAL_ERROR; } err = gcry_cipher_setiv (ch, iv, ivlen); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "Libgcrypt setiv failed"); shishi_error_set (handle, gpg_strerror (err)); return SHISHI_CRYPTO_INTERNAL_ERROR; } *out = xmalloc (inlen); if (decryptp) err = gcry_cipher_decrypt (ch, (unsigned char *) *out, inlen, (const unsigned char *) in, inlen); else err = gcry_cipher_encrypt (ch, (unsigned char *) *out, inlen, (const unsigned char *) in, inlen); if (err != GPG_ERR_NO_ERROR) { shishi_error_printf (handle, "Libgcrypt ciphering failed"); shishi_error_set (handle, gpg_strerror (err)); return SHISHI_CRYPTO_INTERNAL_ERROR; } if (ivout) { size_t ivdiff, ivpos = 0; *ivout = xmalloc (ivlen); if (flags & GCRY_CIPHER_CBC_CTS) { /* XXX what is the output iv for CBC-CTS mode? but is this value useful at all for that mode anyway? Mostly it is DES apps that want the updated iv, so this is ok. */ if (inlen % ivlen) ivdiff = ivlen + inlen % ivlen; else ivdiff = ivlen + ivlen; if (inlen >= ivdiff) ivpos = inlen - ivdiff; } else ivpos = inlen - ivlen; if (decryptp) memcpy (*ivout, in + ivpos, inlen >= ivlen ? ivlen : inlen); else memcpy (*ivout, *out + ivpos, inlen >= ivlen ? ivlen : inlen); } gcry_cipher_close (ch); return SHISHI_OK; } /** * shishi_arcfour: * @handle: shishi handle as allocated by shishi_init(). * @decryptp: 0 to indicate encryption, non-0 to indicate decryption. * @key: input character array with key to use. * @keylen: length of input key array. * @iv: input character array with initialization vector to use, or NULL. * @ivout: output character array with updated initialization vector, or NULL. * @in: input character array of data to encrypt/decrypt. * @inlen: length of input character array of data to encrypt/decrypt. * @out: newly allocated character array with encrypted/decrypted data. * * Encrypt or decrypt data (depending on @decryptp) using ARCFOUR. * The @out buffer must be deallocated by the caller. * * The "initialization vector" used here is the concatenation of the * sbox and i and j, and is thus always of size 256 + 1 + 1. This is * a slight abuse of terminology, and assumes you know what you are * doing. Don't use it if you can avoid to. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_arcfour (Shishi * handle, int decryptp, const char *key, size_t keylen, const char iv[258], char *ivout[258], const char *in, size_t inlen, char **out) { arcfour_context ctx; *out = xmalloc (inlen); if (iv) memcpy (&ctx, iv, sizeof (ctx)); else arcfour_setkey (&ctx, key, keylen); arcfour_stream (&ctx, in, *out, inlen); if (ivout) { *ivout = xmalloc (sizeof (ctx)); memcpy (*ivout, &ctx, sizeof (ctx)); } return SHISHI_OK; } /** * shishi_des: * @handle: shishi handle as allocated by shishi_init(). * @decryptp: 0 to indicate encryption, non-0 to indicate decryption. * @key: input character array with key to use. * @iv: input character array with initialization vector to use, or NULL. * @ivout: output character array with updated initialization vector, or NULL. * @in: input character array of data to encrypt/decrypt. * @inlen: length of input character array of data to encrypt/decrypt. * @out: newly allocated character array with encrypted/decrypted data. * * Encrypt or decrypt data (depending on @decryptp) using DES in CBC * mode. The @out buffer must be deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_des (Shishi * handle, int decryptp, const char key[8], const char iv[8], char *ivout[8], const char *in, size_t inlen, char **out) { return libgcrypt_dencrypt (handle, GCRY_CIPHER_DES, 0, GCRY_CIPHER_MODE_CBC, decryptp, key, 8, iv, ivout, in, inlen, out); } /** * shishi_3des: * @handle: shishi handle as allocated by shishi_init(). * @decryptp: 0 to indicate encryption, non-0 to indicate decryption. * @key: input character array with key to use. * @iv: input character array with initialization vector to use, or NULL. * @ivout: output character array with updated initialization vector, or NULL. * @in: input character array of data to encrypt/decrypt. * @inlen: length of input character array of data to encrypt/decrypt. * @out: newly allocated character array with encrypted/decrypted data. * * Encrypt or decrypt data (depending on @decryptp) using 3DES in CBC * mode. The @out buffer must be deallocated by the caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_3des (Shishi * handle, int decryptp, const char key[8], const char iv[8], char *ivout[8], const char *in, size_t inlen, char **out) { return libgcrypt_dencrypt (handle, GCRY_CIPHER_3DES, 0, GCRY_CIPHER_MODE_CBC, decryptp, key, 24, iv, ivout, in, inlen, out); } /** * shishi_aes_cts: * @handle: shishi handle as allocated by shishi_init(). * @decryptp: 0 to indicate encryption, non-0 to indicate decryption. * @key: input character array with key to use. * @keylen: length of input character array with key to use. * @iv: input character array with initialization vector to use, or NULL. * @ivout: output character array with updated initialization vector, or NULL. * @in: input character array of data to encrypt/decrypt. * @inlen: length of input character array of data to encrypt/decrypt. * @out: newly allocated character array with encrypted/decrypted data. * * Encrypt or decrypt data (depending on @decryptp) using AES in * CBC-CTS mode. The length of the key, @keylen, decide if AES 128 or * AES 256 should be used. The @out buffer must be deallocated by the * caller. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_aes_cts (Shishi * handle, int decryptp, const char *key, size_t keylen, const char iv[16], char *ivout[16], const char *in, size_t inlen, char **out) { return libgcrypt_dencrypt (handle, GCRY_CIPHER_AES, GCRY_CIPHER_CBC_CTS, GCRY_CIPHER_MODE_CBC, decryptp, key, keylen, iv, ivout, in, inlen, out); } /** * shishi_pbkdf2_sha1: * @handle: shishi handle as allocated by shishi_init(). * @P: input password, an octet string * @Plen: length of password, an octet string * @S: input salt, an octet string * @Slen: length of salt, an octet string * @c: iteration count, a positive integer * @dkLen: intended length in octets of the derived key, a positive integer, * at most (2^32 - 1) * hLen. The DK array must have room for this many * characters. * @DK: output derived key, a dkLen-octet string * * Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a * pseudorandom function to derive keys. The length of the derived key * is essentially unbounded. (However, the maximum effective search * space for the derived key may be limited by the structure of the * underlying pseudorandom function, which is this function is always * SHA1.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_pbkdf2_sha1 (Shishi * handle, const char *P, size_t Plen, const char *S, size_t Slen, unsigned int c, unsigned int dkLen, char *DK) { Gc_rc rc; rc = gc_pbkdf2_sha1 (P, Plen, S, Slen, c, DK, dkLen); if (rc == GC_PKCS5_INVALID_ITERATION_COUNT) return SHISHI_PKCS5_INVALID_ITERATION_COUNT; if (rc == GC_PKCS5_INVALID_DERIVED_KEY_LENGTH) return SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH; if (rc == GC_PKCS5_DERIVED_KEY_TOO_LONG) return SHISHI_PKCS5_DERIVED_KEY_TOO_LONG; if (rc != GC_OK) return SHISHI_CRYPTO_INTERNAL_ERROR; return SHISHI_OK; } shishi-1.0.2/lib/tkt.c0000664000000000000000000011521412126660507011417 00000000000000/* tkt.c --- Ticket handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_tkt { Shishi *handle; Shishi_asn1 ticket; Shishi_asn1 kdcrep; Shishi_asn1 enckdcreppart; Shishi_asn1 encticketpart; Shishi_key *key; }; /** * shishi_tkt: * @handle: shishi handle as allocated by shishi_init(). * @tkt: output variable with newly allocated ticket. * * Create a new ticket handle. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt (Shishi * handle, Shishi_tkt ** tkt) { Shishi_tkt *t; int res; t = xcalloc (1, sizeof (*t)); t->handle = handle; t->ticket = shishi_ticket (handle); if (t->ticket == NULL) { shishi_error_printf (handle, "Could not create Ticket: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } /* XXX what about tgs's? */ t->enckdcreppart = shishi_encasreppart (handle); if (t->enckdcreppart == NULL) { shishi_error_printf (handle, "Could not create EncKDCRepPart: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } t->encticketpart = shishi_encticketpart (handle); if (t->encticketpart == NULL) { shishi_error_printf (handle, "Could not create EncTicketPart: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } res = shishi_encticketpart_transited_set (handle, t->encticketpart, SHISHI_TR_DOMAIN_X500_COMPRESS, "", 0); if (res != SHISHI_OK) return res; res = shishi_encticketpart_authtime_set (handle, t->encticketpart, shishi_generalize_time (handle, time (NULL))); if (res != SHISHI_OK) return res; res = shishi_encticketpart_endtime_set (handle, t->encticketpart, shishi_generalize_time (handle, time (NULL) + 1000)); if (res != SHISHI_OK) return res; t->kdcrep = shishi_asrep (handle); if (t->kdcrep == NULL) { shishi_error_printf (handle, "Could not create AS-REP: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } /* XXX We don't allocate t->key here, because shishi_tkt_key() relies on it being NULL. Possibly, we should allocate it here instead, and simplify shishi_tkt_key(). */ *tkt = t; return SHISHI_OK; } /** * shishi_tkt2: * @handle: shishi handle as allocated by shishi_init(). * @ticket: input variable with ticket. * @enckdcreppart: input variable with auxiliary ticket information. * @kdcrep: input variable with KDC-REP ticket information. * * Create a new ticket handle. * * Return value: Returns new ticket handle, or %NULL on error. **/ Shishi_tkt * shishi_tkt2 (Shishi * handle, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep) { Shishi_tkt *tkt; tkt = xcalloc (1, sizeof (*tkt)); tkt->handle = handle; tkt->ticket = ticket; tkt->enckdcreppart = enckdcreppart; tkt->kdcrep = kdcrep; return tkt; } /** * shishi_tkt_done: * @tkt: input variable with ticket info. * * Deallocate resources associated with ticket. The ticket must not * be used again after this call. **/ void shishi_tkt_done (Shishi_tkt * tkt) { if (tkt->key) shishi_key_done (tkt->key); free (tkt); } int shishi_tkt_build (Shishi_tkt * tkt, Shishi_key * key) { int res; res = shishi_ticket_add_enc_part (tkt->handle, tkt->ticket, key, tkt->encticketpart); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_tkt_ticket: * @tkt: input variable with ticket info. * * Get ASN.1 Ticket structure from ticket. * * Return value: Returns actual ticket. **/ Shishi_asn1 shishi_tkt_ticket (Shishi_tkt * tkt) { return tkt->ticket; } /** * shishi_tkt_ticket_set: * @tkt: input variable with ticket info. * @ticket: ASN.1 Ticket to store in ticket. * * Set the ASN.1 Ticket in the Ticket. **/ void shishi_tkt_ticket_set (Shishi_tkt * tkt, Shishi_asn1 ticket) { if (tkt->ticket) shishi_asn1_done (tkt->handle, tkt->ticket); tkt->ticket = ticket; } /** * shishi_tkt_enckdcreppart: * @tkt: input variable with ticket info. * * Get ASN.1 EncKDCRepPart structure from ticket. * * Return value: Returns auxiliary ticket information. **/ Shishi_asn1 shishi_tkt_enckdcreppart (Shishi_tkt * tkt) { return tkt->enckdcreppart; } /** * shishi_tkt_enckdcreppart_set: * @tkt: structure that holds information about Ticket exchange * @enckdcreppart: EncKDCRepPart to store in Ticket. * * Set the EncKDCRepPart in the Ticket. **/ void shishi_tkt_enckdcreppart_set (Shishi_tkt * tkt, Shishi_asn1 enckdcreppart) { if (tkt->enckdcreppart) shishi_asn1_done (tkt->handle, tkt->enckdcreppart); tkt->enckdcreppart = enckdcreppart; } /** * shishi_tkt_kdcrep: * @tkt: input variable with ticket info. * * Get ASN.1 KDCRep structure from ticket. * * Return value: Returns KDC-REP information. **/ Shishi_asn1 shishi_tkt_kdcrep (Shishi_tkt * tkt) { return tkt->kdcrep; } /** * shishi_tkt_encticketpart: * @tkt: input variable with ticket info. * * Get ASN.1 EncTicketPart structure from ticket. * * Return value: Returns EncTicketPart information. **/ Shishi_asn1 shishi_tkt_encticketpart (Shishi_tkt * tkt) { return tkt->encticketpart; } /** * shishi_tkt_encticketpart_set: * @tkt: input variable with ticket info. * @encticketpart: encticketpart to store in ticket. * * Set the EncTicketPart in the Ticket. **/ void shishi_tkt_encticketpart_set (Shishi_tkt * tkt, Shishi_asn1 encticketpart) { if (tkt->encticketpart) shishi_asn1_done (tkt->handle, tkt->encticketpart); tkt->encticketpart = encticketpart; } /** * shishi_tkt_key: * @tkt: input variable with ticket info. * * Get key used in ticket, by looking first in EncKDCRepPart and then * in EncTicketPart. If key is already populated, it is not extracted * again. * * Return value: Returns key extracted from EncKDCRepPart or * EncTicketPart. **/ Shishi_key * shishi_tkt_key (Shishi_tkt * tkt) { int rc; /* XXX We probably shouldn't extract the keys here. Where is this extraction actually needed? */ if (!tkt->key && tkt->enckdcreppart) { rc = shishi_enckdcreppart_get_key (tkt->handle, tkt->enckdcreppart, &tkt->key); if (rc != SHISHI_OK) return NULL; } else if (!tkt->key && tkt->encticketpart) { rc = shishi_encticketpart_get_key (tkt->handle, tkt->encticketpart, &tkt->key); if (rc != SHISHI_OK) return NULL; } return tkt->key; } /** * shishi_tkt_key_set: * @tkt: input variable with ticket info. * @key: key to store in ticket. * * Set the key in the EncTicketPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_key_set (Shishi_tkt * tkt, Shishi_key * key) { int res; res = shishi_encticketpart_key_set (tkt->handle, tkt->encticketpart, key); if (res != SHISHI_OK) return res; res = shishi_enckdcreppart_key_set (tkt->handle, tkt->enckdcreppart, key); if (res != SHISHI_OK) return res; if (!tkt->key) { res = shishi_key (tkt->handle, &tkt->key); if (res != SHISHI_OK) return res; } shishi_key_copy (tkt->key, key); return SHISHI_OK; } int shishi_tkt_clientrealm_set (Shishi_tkt * tkt, const char *realm, const char *client) { int res; res = shishi_encticketpart_crealm_set (tkt->handle, tkt->encticketpart, realm); if (res != SHISHI_OK) return res; res = shishi_encticketpart_cname_set (tkt->handle, tkt->encticketpart, SHISHI_NT_UNKNOWN, client); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_tkt_serverrealm_set (Shishi_tkt * tkt, const char *realm, const char *server) { int res; res = shishi_ticket_srealmserver_set (tkt->handle, tkt->ticket, realm, server); if (res != SHISHI_OK) return res; res = shishi_enckdcreppart_srealmserver_set (tkt->handle, tkt->enckdcreppart, realm, server); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_tkt_client: * @tkt: input variable with ticket info. * @client: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Represent client principal name in Ticket KDC-REP as * zero-terminated string. The string is allocate by this function, * and it is the responsibility of the caller to deallocate it. Note * that the output length @clientlen does not include the terminating * zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_client (Shishi_tkt * tkt, char **client, size_t * clientlen) { return shishi_principal_name (tkt->handle, tkt->kdcrep, "cname", client, clientlen); } /** * shishi_tkt_client_p: * @tkt: input variable with ticket info. * @client: client name of ticket. * * Determine if ticket is for specified client. * * Return value: Returns non-0 iff ticket is for specified client. **/ int shishi_tkt_client_p (Shishi_tkt * tkt, const char *client) { char *buf; size_t buflen; int res; res = shishi_tkt_client (tkt, &buf, &buflen); if (res != SHISHI_OK) return 0; res = strcmp (client, buf) == 0; free (buf); return res; } /** * shishi_tkt_clientrealm: * @tkt: input variable with ticket info. * @client: pointer to newly allocated zero terminated string containing * principal name and realm. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Convert cname and realm fields from AS-REQ to printable principal * name format. The string is allocate by this function, and it is * the responsibility of the caller to deallocate it. Note that the * output length @clientlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_clientrealm (Shishi_tkt * tkt, char **client, size_t * clientlen) { return shishi_principal_name_realm (tkt->handle, tkt->kdcrep, "cname", tkt->kdcrep, "crealm", client, clientlen); } /** * shishi_tkt_clientrealm_p: * @tkt: input variable with ticket info. * @client: principal name (client name and realm) of ticket. * * Determine if ticket is for specified client principal. * * Return value: Returns non-0 iff ticket is for specified client principal. **/ int shishi_tkt_clientrealm_p (Shishi_tkt * tkt, const char *client) { char *buf; size_t buflen; int res; res = shishi_tkt_clientrealm (tkt, &buf, &buflen); if (res != SHISHI_OK) return 0; res = strcmp (client, buf) == 0; free (buf); return res; } /** * shishi_tkt_realm: * @tkt: input variable with ticket info. * @realm: pointer to newly allocated character array with realm name. * @realmlen: length of newly allocated character array with realm name. * * Extract realm of server in ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_realm (Shishi_tkt * tkt, char **realm, size_t * realmlen) { return shishi_ticket_realm_get (tkt->handle, tkt->ticket, realm, realmlen); } /** * shishi_tkt_server: * @tkt: input variable with ticket info. * @server: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @serverlen). * @serverlen: pointer to length of @server on output, excluding terminating * zero. May be %NULL (to only populate @server). * * Represent server principal name in Ticket as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @serverlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_server (Shishi_tkt * tkt, char **server, size_t * serverlen) { return shishi_ticket_server (tkt->handle, tkt->ticket, server, serverlen); } /** * shishi_tkt_server_p: * @tkt: input variable with ticket info. * @server: server name of ticket. * * Determine if ticket is for specified server. * * Return value: Returns non-0 iff ticket is for specified server. **/ int shishi_tkt_server_p (Shishi_tkt * tkt, const char *server) { char *buf; int res; res = shishi_tkt_server (tkt, &buf, NULL); if (res != SHISHI_OK) return 0; res = strcmp (server, buf) == 0; free (buf); return res; } /** * shishi_tkt_flags: * @tkt: input variable with ticket info. * @flags: pointer to output integer with flags. * * Extract flags in ticket (i.e., EncKDCRepPart). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_flags (Shishi_tkt * tkt, uint32_t * flags) { return shishi_asn1_read_bitstring (tkt->handle, tkt->enckdcreppart, "flags", flags); } /** * shishi_tkt_flags_set: * @tkt: input variable with ticket info. * @flags: integer with flags to store in ticket. * * Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. * Note that this reset any already existing flags. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_flags_set (Shishi_tkt * tkt, uint32_t flags) { int res; res = shishi_encticketpart_flags_set (tkt->handle, tkt->encticketpart, flags); if (res != SHISHI_OK) return res; res = shishi_enckdcreppart_flags_set (tkt->handle, tkt->enckdcreppart, flags); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_tkt_flags_add: * @tkt: input variable with ticket info. * @flag: integer with flags to store in ticket. * * Add ticket flags to Ticket and EncKDCRepPart. This preserves all * existing options. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_flags_add (Shishi_tkt * tkt, uint32_t flag) { uint32_t flags; int res; res = shishi_tkt_flags (tkt, &flags); if (res != SHISHI_OK) return res; flags |= flag; res = shishi_tkt_flags_set (tkt, flags); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_tkt_forwardable_p: * @tkt: input variable with ticket info. * * Determine if ticket is forwardable. * * The FORWARDABLE flag in a ticket is normally only interpreted by * the ticket-granting service. It can be ignored by application * servers. The FORWARDABLE flag has an interpretation similar to * that of the PROXIABLE flag, except ticket-granting tickets may also * be issued with different network addresses. This flag is reset by * default, but users MAY request that it be set by setting the * FORWARDABLE option in the AS request when they request their * initial ticket-granting ticket. * * Return value: Returns non-0 iff forwardable flag is set in ticket. **/ int shishi_tkt_forwardable_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_FORWARDABLE; } /** * shishi_tkt_forwarded_p: * @tkt: input variable with ticket info. * * Determine if ticket is forwarded. * * The FORWARDED flag is set by the TGS when a client presents a * ticket with the FORWARDABLE flag set and requests a forwarded * ticket by specifying the FORWARDED KDC option and supplying a set * of addresses for the new ticket. It is also set in all tickets * issued based on tickets with the FORWARDED flag set. Application * servers may choose to process FORWARDED tickets differently than * non-FORWARDED tickets. * * Return value: Returns non-0 iff forwarded flag is set in ticket. **/ int shishi_tkt_forwarded_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_FORWARDED; } /** * shishi_tkt_proxiable_p: * @tkt: input variable with ticket info. * * Determine if ticket is proxiable. * * The PROXIABLE flag in a ticket is normally only interpreted by the * ticket-granting service. It can be ignored by application servers. * When set, this flag tells the ticket-granting server that it is OK * to issue a new ticket (but not a ticket-granting ticket) with a * different network address based on this ticket. This flag is set if * requested by the client on initial authentication. By default, the * client will request that it be set when requesting a * ticket-granting ticket, and reset when requesting any other ticket. * * Return value: Returns non-0 iff proxiable flag is set in ticket. **/ int shishi_tkt_proxiable_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_PROXIABLE; } /** * shishi_tkt_proxy_p: * @tkt: input variable with ticket info. * * Determine if ticket is proxy ticket. * * The PROXY flag is set in a ticket by the TGS when it issues a proxy * ticket. Application servers MAY check this flag and at their * option they MAY require additional authentication from the agent * presenting the proxy in order to provide an audit trail. * * Return value: Returns non-0 iff proxy flag is set in ticket. **/ int shishi_tkt_proxy_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_PROXY; } /** * shishi_tkt_may_postdate_p: * @tkt: input variable with ticket info. * * Determine if ticket may be used to grant postdated tickets. * * The MAY-POSTDATE flag in a ticket is normally only interpreted by * the ticket-granting service. It can be ignored by application * servers. This flag MUST be set in a ticket-granting ticket in * order to issue a postdated ticket based on the presented ticket. It * is reset by default; it MAY be requested by a client by setting the * ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does * not allow a client to obtain a postdated ticket-granting ticket; * postdated ticket-granting tickets can only by obtained by * requesting the postdating in the KRB_AS_REQ message. The life * (endtime-starttime) of a postdated ticket will be the remaining * life of the ticket-granting ticket at the time of the request, * unless the RENEWABLE option is also set, in which case it can be * the full life (endtime-starttime) of the ticket-granting * ticket. The KDC MAY limit how far in the future a ticket may be * postdated. * * Return value: Returns non-0 iff may-postdate flag is set in ticket. **/ int shishi_tkt_may_postdate_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_MAY_POSTDATE; } /** * shishi_tkt_postdated_p: * @tkt: input variable with ticket info. * * Determine if ticket is postdated. * * The POSTDATED flag indicates that a ticket has been postdated. The * application server can check the authtime field in the ticket to * see when the original authentication occurred. Some services MAY * choose to reject postdated tickets, or they may only accept them * within a certain period after the original authentication. When the * KDC issues a POSTDATED ticket, it will also be marked as INVALID, * so that the application client MUST present the ticket to the KDC * to be validated before use. * * Return value: Returns non-0 iff postdated flag is set in ticket. **/ int shishi_tkt_postdated_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_POSTDATED; } /** * shishi_tkt_invalid_p: * @tkt: input variable with ticket info. * * Determine if ticket is invalid. * * The INVALID flag indicates that a ticket is invalid. Application * servers MUST reject tickets which have this flag set. A postdated * ticket will be issued in this form. Invalid tickets MUST be * validated by the KDC before use, by presenting them to the KDC in a * TGS request with the VALIDATE option specified. The KDC will only * validate tickets after their starttime has passed. The validation * is required so that postdated tickets which have been stolen before * their starttime can be rendered permanently invalid (through a * hot-list mechanism). * * Return value: Returns non-0 iff invalid flag is set in ticket. **/ int shishi_tkt_invalid_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_INVALID; } /** * shishi_tkt_renewable_p: * @tkt: input variable with ticket info. * * Determine if ticket is renewable. * * The RENEWABLE flag in a ticket is normally only interpreted by the * ticket-granting service (discussed below in section 3.3). It can * usually be ignored by application servers. However, some * particularly careful application servers MAY disallow renewable * tickets. * * Return value: Returns non-0 iff renewable flag is set in ticket. **/ int shishi_tkt_renewable_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_RENEWABLE; } /** * shishi_tkt_initial_p: * @tkt: input variable with ticket info. * * Determine if ticket was issued using AS exchange. * * The INITIAL flag indicates that a ticket was issued using the AS * protocol, rather than issued based on a ticket-granting ticket. * Application servers that want to require the demonstrated knowledge * of a client's secret key (e.g. a password-changing program) can * insist that this flag be set in any tickets they accept, and thus * be assured that the client's key was recently presented to the * application client. * * Return value: Returns non-0 iff initial flag is set in ticket. **/ int shishi_tkt_initial_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_INITIAL; } /** * shishi_tkt_pre_authent_p: * @tkt: input variable with ticket info. * * Determine if ticket was pre-authenticated. * * The PRE-AUTHENT and HW-AUTHENT flags provide additional information * about the initial authentication, regardless of whether the current * ticket was issued directly (in which case INITIAL will also be set) * or issued on the basis of a ticket-granting ticket (in which case * the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags * are carried forward from the ticket-granting ticket). * * Return value: Returns non-0 iff pre-authent flag is set in ticket. **/ int shishi_tkt_pre_authent_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_PRE_AUTHENT; } /** * shishi_tkt_hw_authent_p: * @tkt: input variable with ticket info. * * Determine if ticket is authenticated using a hardware token. * * The PRE-AUTHENT and HW-AUTHENT flags provide additional information * about the initial authentication, regardless of whether the current * ticket was issued directly (in which case INITIAL will also be set) * or issued on the basis of a ticket-granting ticket (in which case * the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags * are carried forward from the ticket-granting ticket). * * Return value: Returns non-0 iff hw-authent flag is set in ticket. **/ int shishi_tkt_hw_authent_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_HW_AUTHENT; } /** * shishi_tkt_transited_policy_checked_p: * @tkt: input variable with ticket info. * * Determine if ticket has been policy checked for transit. * * The application server is ultimately responsible for accepting or * rejecting authentication and SHOULD check that only suitably * trusted KDCs are relied upon to authenticate a principal. The * transited field in the ticket identifies which realms (and thus * which KDCs) were involved in the authentication process and an * application server would normally check this field. If any of these * are untrusted to authenticate the indicated client principal * (probably determined by a realm-based policy), the authentication * attempt MUST be rejected. The presence of trusted KDCs in this list * does not provide any guarantee; an untrusted KDC may have * fabricated the list. * * While the end server ultimately decides whether authentication is * valid, the KDC for the end server's realm MAY apply a realm * specific policy for validating the transited field and accepting * credentials for cross-realm authentication. When the KDC applies * such checks and accepts such cross-realm authentication it will set * the TRANSITED-POLICY-CHECKED flag in the service tickets it issues * based on the cross-realm TGT. A client MAY request that the KDCs * not check the transited field by setting the * DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required * to honor this flag. * * Application servers MUST either do the transited-realm checks * themselves, or reject cross-realm tickets without TRANSITED-POLICY- * CHECKED set. * * Return value: Returns non-0 iff transited-policy-checked flag is * set in ticket. **/ int shishi_tkt_transited_policy_checked_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_TRANSITED_POLICY_CHECKED; } /** * shishi_tkt_ok_as_delegate_p: * @tkt: input variable with ticket info. * * Determine if ticket is ok as delegated ticket. * * The copy of the ticket flags in the encrypted part of the KDC reply * may have the OK-AS-DELEGATE flag set to indicates to the client * that the server specified in the ticket has been determined by * policy of the realm to be a suitable recipient of delegation. A * client can use the presence of this flag to help it make a decision * whether to delegate credentials (either grant a proxy or a * forwarded ticket- granting ticket) to this server. It is * acceptable to ignore the value of this flag. When setting this * flag, an administrator should consider the security and placement * of the server on which the service will run, as well as whether the * service requires the use of delegated credentials. * * Return value: Returns non-0 iff ok-as-delegate flag is set in ticket. **/ int shishi_tkt_ok_as_delegate_p (Shishi_tkt * tkt) { uint32_t flags = 0; shishi_tkt_flags (tkt, &flags); return flags & SHISHI_TICKETFLAGS_OK_AS_DELEGATE; } /** * shishi_tkt_keytype: * @tkt: input variable with ticket info. * @etype: pointer to encryption type that is set, see Shishi_etype. * * Extract encryption type of key in ticket (really EncKDCRepPart). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_tkt_keytype (Shishi_tkt * tkt, int32_t * etype) { return shishi_asn1_read_int32 (tkt->handle, tkt->enckdcreppart, "key.keytype", etype); } /** * shishi_tkt_keytype_fast: * @tkt: input variable with ticket info. * * Extract encryption type of key in ticket (really EncKDCRepPart). * * Return value: Returns encryption type of session key in ticket * (really EncKDCRepPart), or -1 on error. **/ int32_t shishi_tkt_keytype_fast (Shishi_tkt * tkt) { int32_t etype = -1; int res; res = shishi_asn1_read_int32 (tkt->handle, tkt->enckdcreppart, "key.keytype", &etype); if (res != SHISHI_OK) return -1; return etype; } /** * shishi_tkt_keytype_p: * @tkt: input variable with ticket info. * @etype: encryption type, see Shishi_etype. * * Determine if key in ticket (really EncKDCRepPart) is of specified * key type (really encryption type). * * Return value: Returns non-0 iff key in ticket is of specified * encryption type. **/ int shishi_tkt_keytype_p (Shishi_tkt * tkt, int32_t etype) { int32_t tktetype; int rc; rc = shishi_asn1_read_int32 (tkt->handle, tkt->enckdcreppart, "key.keytype", &tktetype); if (rc != SHISHI_OK) return 0; return etype == tktetype; } int shishi_tkt_lastreq (Shishi_tkt * tkt, char **lrtime, size_t * lrtimelen, int32_t lrtype) { char *format; int32_t tmplrtype; size_t i, n; int res; res = shishi_asn1_number_of_elements (tkt->handle, tkt->enckdcreppart, "last-req", &n); if (res != SHISHI_OK) return res; for (i = 1; i <= n; i++) { asprintf (&format, "last-req.?%d.lr-type", i); res = shishi_asn1_read_int32 (tkt->handle, tkt->enckdcreppart, format, &tmplrtype); free (format); if (res != SHISHI_OK) return res; if (lrtype == tmplrtype) { asprintf (&format, "last-req.?%d.lr-value", i); res = shishi_asn1_read (tkt->handle, tkt->enckdcreppart, format, lrtime, lrtimelen); free (format); if (res != SHISHI_OK) return res; return SHISHI_OK; } } return !SHISHI_OK; } /** * shishi_tkt_lastreqc: * @tkt: input variable with ticket info. * @lrtype: lastreq type to extract, see Shishi_lrtype. E.g., * SHISHI_LRTYPE_LAST_REQUEST. * * Extract C time corresponding to given lastreq type field in the * ticket. * * Return value: Returns C time interpretation of the specified * lastreq field, or (time_t) -1. **/ time_t shishi_tkt_lastreqc (Shishi_tkt * tkt, Shishi_lrtype lrtype) { char *lrtime; size_t lrtimelen; time_t t = (time_t) - 1; int res; res = shishi_tkt_lastreq (tkt, &lrtime, &lrtimelen, lrtype); if (res != SHISHI_OK) return t; if (lrtimelen == SHISHI_GENERALIZEDTIME_LENGTH) t = shishi_generalize_ctime (tkt->handle, lrtime); free (lrtime); return t; } int shishi_tkt_authtime (Shishi_tkt * tkt, char **authtime, size_t * authtimelen) { return shishi_asn1_read (tkt->handle, tkt->enckdcreppart, "authtime", authtime, authtimelen); } /** * shishi_tkt_authctime: * @tkt: input variable with ticket info. * * Extract C time corresponding to the authtime field. The field * holds the time when the original authentication took place that * later resulted in this ticket. * * Return value: Returns C time interpretation of the endtime in ticket. **/ time_t shishi_tkt_authctime (Shishi_tkt * tkt) { char *authtime; size_t authtimelen; time_t t = (time_t) - 1; int res; res = shishi_tkt_authtime (tkt, &authtime, &authtimelen); if (res != SHISHI_OK) return t; if (authtimelen == SHISHI_GENERALIZEDTIME_LENGTH + 1) /* XXX why +1 ? */ t = shishi_generalize_ctime (tkt->handle, authtime); free (authtime); return t; } int shishi_tkt_starttime (Shishi_tkt * tkt, char **starttime, size_t * starttimelen) { return shishi_asn1_read_optional (tkt->handle, tkt->enckdcreppart, "starttime", starttime, starttimelen); } /** * shishi_tkt_startctime: * @tkt: input variable with ticket info. * * Extract C time corresponding to the starttime field. The field * holds the time where the ticket start to be valid (typically in the * past). * * Return value: Returns C time interpretation of the endtime in ticket. **/ time_t shishi_tkt_startctime (Shishi_tkt * tkt) { char *starttime; size_t starttimelen; time_t t = (time_t) - 1; int res; res = shishi_tkt_starttime (tkt, &starttime, &starttimelen); if (res != SHISHI_OK || starttimelen == 0) return t; if (starttimelen == SHISHI_GENERALIZEDTIME_LENGTH + 1) /* XXX why +1 ? */ t = shishi_generalize_ctime (tkt->handle, starttime); free (starttime); return t; } int shishi_tkt_endtime (Shishi_tkt * tkt, char **endtime, size_t * endtimelen) { return shishi_asn1_read (tkt->handle, tkt->enckdcreppart, "endtime", endtime, endtimelen); } /** * shishi_tkt_endctime: * @tkt: input variable with ticket info. * * Extract C time corresponding to the endtime field. The field holds * the time where the ticket stop being valid. * * Return value: Returns C time interpretation of the endtime in ticket. **/ time_t shishi_tkt_endctime (Shishi_tkt * tkt) { char *endtime; size_t endtimelen; time_t t = (time_t) - 1; int res; res = shishi_tkt_endtime (tkt, &endtime, &endtimelen); if (res != SHISHI_OK) return t; if (endtimelen == SHISHI_GENERALIZEDTIME_LENGTH + 1) /* XXX why +1 ? */ t = shishi_generalize_ctime (tkt->handle, endtime); free (endtime); return t; } int shishi_tkt_renew_till (Shishi_tkt * tkt, char **renewtill, size_t * renewtilllen) { return shishi_asn1_read_optional (tkt->handle, tkt->enckdcreppart, "renew-till", renewtill, renewtilllen); } /** * shishi_tkt_renew_tillc: * @tkt: input variable with ticket info. * * Extract C time corresponding to the renew-till field. The field * holds the time where the ticket stop being valid for renewal. * * Return value: Returns C time interpretation of the renew-till in ticket. **/ time_t shishi_tkt_renew_tillc (Shishi_tkt * tkt) { char *renewtill; size_t renewtilllen; time_t t = (time_t) - 1; int res; res = shishi_tkt_renew_till (tkt, &renewtill, &renewtilllen); if (res != SHISHI_OK || renewtilllen == 0) return t; if (renewtilllen == SHISHI_GENERALIZEDTIME_LENGTH + 1) /* XXX why +1 ? */ t = shishi_generalize_ctime (tkt->handle, renewtill); free (renewtill); return t; } /** * shishi_tkt_valid_at_time_p: * @tkt: input variable with ticket info. * @now: time to check for. * * Determine if ticket is valid at a specific point in time. * * Return value: Returns non-0 iff ticket is valid (not expired and * after starttime) at specified time. **/ int shishi_tkt_valid_at_time_p (Shishi_tkt * tkt, time_t now) { time_t starttime, endtime; starttime = shishi_tkt_startctime (tkt); if (starttime == (time_t) - 1) starttime = shishi_tkt_authctime (tkt); endtime = shishi_tkt_endctime (tkt); return starttime <= now && now <= endtime; } /** * shishi_tkt_valid_now_p: * @tkt: input variable with ticket info. * * Determine if ticket is valid now. * * Return value: Returns 0 iff ticket is invalid (expired or not yet * valid). **/ int shishi_tkt_valid_now_p (Shishi_tkt * tkt) { return shishi_tkt_valid_at_time_p (tkt, time (NULL)); } /** * shishi_tkt_expired_p: * @tkt: input variable with ticket info. * * Determine if ticket has expired (i.e., endtime is in the past). * * Return value: Returns 0 iff ticket has expired. **/ int shishi_tkt_expired_p (Shishi_tkt * tkt) { time_t endtime = shishi_tkt_endctime (tkt); time_t now = time (NULL); return endtime < now; } /** * shishi_tkt_lastreq_pretty_print: * @tkt: input variable with ticket info. * @fh: file handle open for writing. * * Print a human readable representation of the various lastreq fields * in the ticket (really EncKDCRepPart). **/ void shishi_tkt_lastreq_pretty_print (Shishi_tkt * tkt, FILE * fh) { time_t t; t = shishi_tkt_lastreqc (tkt, SHISHI_LRTYPE_LAST_INITIAL_TGT_REQUEST); if (t != (time_t) - 1) fprintf (fh, _("Time of last initial request for a TGT:\t%s"), ctime (&t)); t = shishi_tkt_lastreqc (tkt, SHISHI_LRTYPE_LAST_INITIAL_REQUEST); if (t != (time_t) - 1) fprintf (fh, "Time of last initial request:\t%s", ctime (&t)); t = shishi_tkt_lastreqc (tkt, SHISHI_LRTYPE_NEWEST_TGT_ISSUE); if (t != (time_t) - 1) fprintf (fh, "Time of issue for the newest ticket-granting ticket used:\t%s", ctime (&t)); t = shishi_tkt_lastreqc (tkt, SHISHI_LRTYPE_LAST_RENEWAL); if (t != (time_t) - 1) fprintf (fh, "Time of the last renewal:\t%s", ctime (&t)); t = shishi_tkt_lastreqc (tkt, SHISHI_LRTYPE_LAST_REQUEST); if (t != (time_t) - 1) fprintf (fh, "Time of last request:\t%s", ctime (&t)); } /** * shishi_tkt_pretty_print: * @tkt: input variable with ticket info. * @fh: file handle open for writing. * * Print a human readable representation of a ticket to file handle. **/ void shishi_tkt_pretty_print (Shishi_tkt * tkt, FILE * fh) { char *buf; char *p; size_t buflen; int keytype, etype; uint32_t flags; int res; time_t t; time_t now = time (NULL); res = shishi_tkt_clientrealm (tkt, &buf, &buflen); if (res == SHISHI_OK) { fprintf (fh, "%s:\n", buf); free (buf); } else fprintf (fh, ":\n"); t = shishi_tkt_authctime (tkt); fprintf (fh, _("Authtime:\t%s"), ctime (&t)); t = shishi_tkt_startctime (tkt); if (t != (time_t) - 1) { p = ctime (&t); p[strlen (p) - 1] = '\0'; fprintf (fh, _("Starttime:\t%s"), p); if (t > now) fprintf (fh, " NOT YET VALID"); fprintf (fh, "\n"); } t = shishi_tkt_endctime (tkt); if (t != (time_t) - 1) { p = ctime (&t); p[strlen (p) - 1] = '\0'; fprintf (fh, _("Endtime:\t%s"), p); if (t < now) fprintf (fh, " EXPIRED"); fprintf (fh, "\n"); } t = shishi_tkt_renew_tillc (tkt); if (t != (time_t) - 1) fprintf (fh, _("Renewable till:\t%s"), ctime (&t)); res = shishi_tkt_server (tkt, &buf, NULL); if (res == SHISHI_OK) { res = shishi_ticket_get_enc_part_etype (tkt->handle, tkt->ticket, &keytype); if (res == SHISHI_OK) fprintf (fh, _("Server:\t\t%s key %s (%d)\n"), buf, shishi_cipher_name (keytype), keytype); free (buf); } res = shishi_tkt_keytype (tkt, &keytype); if (res == SHISHI_OK) res = shishi_kdcrep_get_enc_part_etype (tkt->handle, tkt->kdcrep, &etype); if (res == SHISHI_OK) fprintf (fh, _("Ticket key:\t%s (%d) protected by %s (%d)\n"), shishi_cipher_name (keytype), keytype, shishi_cipher_name (etype), etype); res = shishi_tkt_flags (tkt, &flags); if (res == SHISHI_OK && flags) { fprintf (fh, _("Ticket flags:\t")); if (shishi_tkt_forwardable_p (tkt)) fprintf (fh, "FORWARDABLE "); if (shishi_tkt_forwarded_p (tkt)) fprintf (fh, "FORWARDED "); if (shishi_tkt_proxiable_p (tkt)) fprintf (fh, "PROXIABLE "); if (shishi_tkt_proxy_p (tkt)) fprintf (fh, "PROXY "); if (shishi_tkt_may_postdate_p (tkt)) fprintf (fh, "MAYPOSTDATE "); if (shishi_tkt_postdated_p (tkt)) fprintf (fh, "POSTDATED "); if (shishi_tkt_invalid_p (tkt)) fprintf (fh, "INVALID "); if (shishi_tkt_renewable_p (tkt)) fprintf (fh, "RENEWABLE "); if (shishi_tkt_initial_p (tkt)) fprintf (fh, "INITIAL "); if (shishi_tkt_pre_authent_p (tkt)) fprintf (fh, "PREAUTHENT "); if (shishi_tkt_hw_authent_p (tkt)) fprintf (fh, "HWAUTHENT "); if (shishi_tkt_transited_policy_checked_p (tkt)) fprintf (fh, "TRANSITEDPOLICYCHECKED "); if (shishi_tkt_ok_as_delegate_p (tkt)) fprintf (fh, "OKASDELEGATE "); fprintf (fh, "(%d)\n", flags); } } int shishi_tkt_decrypt (Shishi_tkt * tkt, Shishi_key * key) { int rc; Shishi_asn1 encticketpart; rc = shishi_ticket_decrypt (tkt->handle, tkt->ticket, key, &encticketpart); if (rc != SHISHI_OK) return rc; tkt->encticketpart = encticketpart; return SHISHI_OK; } shishi-1.0.2/lib/crypto-ctx.c0000664000000000000000000001174012126660507012730 00000000000000/* crypto-ctx.c high-level crypto functions * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_crypto { Shishi *handle; Shishi_key *key; int keyusage; int32_t etype; char *iv; size_t ivlen; }; /** * shishi_crypto: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key will encrypt/decrypt. * @etype: integer specifying what cipher to use. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * * Initialize a crypto context. This store a key, keyusage, * encryption type and initialization vector in a "context", and the * caller can then use this context to perform encryption via * shishi_crypto_encrypt() and decryption via shishi_crypto_encrypt() * without supplying all those details again. The functions also * takes care of propagating the IV between calls. * * When the application no longer need to use the context, it should * deallocate resources associated with it by calling * shishi_crypto_close(). * * Return value: Return a newly allocated crypto context. **/ Shishi_crypto * shishi_crypto (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen) { Shishi_crypto *ctx; ctx = xmalloc (sizeof (*ctx)); shishi_key (handle, &ctx->key); /* XXX handle rc, or rather: change shishi_key() to return key instead of int. */ shishi_key_copy (ctx->key, key); ctx->handle = handle; ctx->keyusage = keyusage; ctx->etype = etype; if (iv) ctx->iv = xmemdup (iv, ivlen); else ctx->iv = NULL; ctx->ivlen = ivlen; return ctx; } /** * shishi_crypto_encrypt: * @ctx: crypto context as returned by shishi_crypto(). * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypt data, using information (e.g., key and initialization * vector) from context. The IV is updated inside the context after * this call. * * When the application no longer need to use the context, it should * deallocate resources associated with it by calling * shishi_crypto_close(). * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_crypto_encrypt (Shishi_crypto * ctx, const char *in, size_t inlen, char **out, size_t * outlen) { char *ivout = NULL; size_t ivoutlen; int rc; rc = shishi_encrypt_ivupdate_etype (ctx->handle, ctx->key, ctx->keyusage, ctx->etype, ctx->iv, ctx->ivlen, &ivout, &ivoutlen, in, inlen, out, outlen); if (rc == SHISHI_OK) { free (ctx->iv); ctx->iv = ivout; ctx->ivlen = ivoutlen; } return rc; } /** * shishi_crypto_decrypt: * @ctx: crypto context as returned by shishi_crypto(). * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypt data, using information (e.g., key and initialization * vector) from context. The IV is updated inside the context after * this call. * * When the application no longer need to use the context, it should * deallocate resources associated with it by calling * shishi_crypto_close(). * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_crypto_decrypt (Shishi_crypto * ctx, const char *in, size_t inlen, char **out, size_t * outlen) { char *ivout = NULL; size_t ivoutlen; int rc; rc = shishi_decrypt_ivupdate_etype (ctx->handle, ctx->key, ctx->keyusage, ctx->etype, ctx->iv, ctx->ivlen, &ivout, &ivoutlen, in, inlen, out, outlen); if (rc == SHISHI_OK) { free (ctx->iv); ctx->iv = ivout; ctx->ivlen = ivoutlen; } return rc; } /** * shishi_crypto_close: * @ctx: crypto context as returned by shishi_crypto(). * * Deallocate resources associated with the crypto context. **/ void shishi_crypto_close (Shishi_crypto * ctx) { shishi_key_done (ctx->key); free (ctx->iv); free (ctx); } shishi-1.0.2/lib/crypto-aes.c0000664000000000000000000001475412126660507012712 00000000000000/* crypto-aes.c --- AES crypto functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "crypto.h" /* Get _shishi_escapeprint, etc. */ #include "utils.h" static int aes128_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_encrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int aes128_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_decrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int aes256_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_encrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int aes256_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_decrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int aes_string_to_key (Shishi * handle, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { char key[256 / 8]; int keylen = shishi_key_length (outkey); Shishi_key *tmpkey; int iterations = 0x00001000; int res; if (parameter) { iterations = (parameter[0] & 0xFF) << 24; iterations |= (parameter[1] & 0xFF) << 16; iterations |= (parameter[2] & 0xFF) << 8; iterations |= parameter[3] & 0xFF; } if (VERBOSECRYPTO (handle)) { printf ("aes_string_to_key (password, salt)\n"); printf ("\t ;; Password:\n"); _shishi_escapeprint (password, passwordlen); _shishi_hexprint (password, passwordlen); printf ("\t ;; Salt:\n"); _shishi_escapeprint (salt, saltlen); _shishi_hexprint (salt, saltlen); printf ("\t ;; Iteration count %d (%08x):\n", iterations, iterations); } /* tkey = random2key(PBKDF2(passphrase, salt, iter_count, keylength)) */ res = shishi_pbkdf2_sha1 (handle, password, passwordlen, salt, saltlen, iterations, keylen, key); if (res != SHISHI_OK) return res; res = shishi_key_from_value (handle, shishi_key_type (outkey), key, &tmpkey); if (res != SHISHI_OK) return res; /* key = DK(tkey, Constant) */ res = shishi_dk (handle, tmpkey, SHISHI_DK_CONSTANT, strlen (SHISHI_DK_CONSTANT), outkey); shishi_key_done (tmpkey); if (res != SHISHI_OK) return res; if (VERBOSECRYPTO (handle)) { printf ("aes_string_to_key (password, salt)\n"); printf ("\t ;; Key:\n"); _shishi_hexprint (shishi_key_value (outkey), shishi_key_length (outkey)); _shishi_binprint (shishi_key_value (outkey), shishi_key_length (outkey)); } return SHISHI_OK; } static int aes128_string_to_key (Shishi * handle, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { return aes_string_to_key (handle, password, passwordlen, salt, saltlen, parameter, outkey); } static int aes256_string_to_key (Shishi * handle, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { return aes_string_to_key (handle, password, passwordlen, salt, saltlen, parameter, outkey); } static int aes128_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { if (rndlen < shishi_key_length (outkey)) return SHISHI_CRYPTO_ERROR; shishi_key_value_set (outkey, rnd); return SHISHI_OK; } static int aes256_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { if (rndlen < shishi_key_length (outkey)) return SHISHI_CRYPTO_ERROR; shishi_key_value_set (outkey, rnd); return SHISHI_OK; } static int aes128_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen); } static int aes256_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { return _shishi_simplified_checksum (handle, key, keyusage, cksumtype, in, inlen, out, outlen); } cipherinfo aes128_cts_hmac_sha1_96_info = { SHISHI_AES128_CTS_HMAC_SHA1_96, "aes128-cts-hmac-sha1-96", 16, 16, 128 / 8, 128 / 8, SHISHI_HMAC_SHA1_96_AES128, aes128_random_to_key, aes128_string_to_key, aes128_encrypt, aes128_decrypt }; cipherinfo aes256_cts_hmac_sha1_96_info = { SHISHI_AES256_CTS_HMAC_SHA1_96, "aes256-cts-hmac-sha1-96", 16, 16, 256 / 8, 256 / 8, SHISHI_HMAC_SHA1_96_AES256, aes256_random_to_key, aes256_string_to_key, aes256_encrypt, aes256_decrypt }; checksuminfo hmac_sha1_96_aes128_info = { SHISHI_HMAC_SHA1_96_AES128, "hmac-sha1-96-aes128", 96 / 8, aes128_checksum, NULL }; checksuminfo hmac_sha1_96_aes256_info = { SHISHI_HMAC_SHA1_96_AES256, "hmac-sha1-96-aes256", 96 / 8, aes256_checksum, NULL }; shishi-1.0.2/lib/kerberos5.asn10000664000000000000000000003547712126660507013152 00000000000000-- kerberos.asn1 - Kerberos ASN.1 schema -- Copyright (C) 2002-2013 Simon Josefsson -- -- This file is part of Shishi. -- Shishi 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. -- Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write -- to the Free Software Foundation, Inc., 51 Franklin Street, Fifth -- Floor, Boston, MA 02110-1301, USA -- This rest of this file is taken from appendix A of RFC 4120, -- http://www.ietf.org/rfc/rfc4120.txt (MD5 -- f95332f70f18eb9252756c7e2accc141), with two minor modifications -- marked with "libtasn1 bug" below. RFC 4120 exhibit the ISOC -- copyright, althought it does not cover the ASN.1 schema, see -- discussions in the IETF IPR WG. I have acquired permission to use -- the ASN.1 schema from RFC 4120 under the MIT/X11 license from all -- authors but Tom Yu (as of April 2006). For prudence, asking the -- Kerberos WG whether anyone else contributed significantly to the -- ASN.1 schema also remains. Further, it seems the IETF IPR WG tend -- to believe that code extracted from RFCs was intended to be -- modifiable under RFC 3978, which would be sufficient for an ASN.1 -- schema such as this file, compare ipr-rules-update-07 and -- <50E312B117033946BA23AA102C8134C62AB176@SDCPEXCCL2MX.wilmerhale.com>. -- The IETF lawyer Jorge Contreras has said the following on this -- topic: "Under RFC 3978, it is currently OK to modify code extracts -- from RFCs.", see <44A91390.2030908@dial.pipex.com>. KerberosV5Spec2 { iso(1) identified-organization(3) dod(6) internet(1) security(5) kerberosV5(2) modules(4) krb5spec2(2) } DEFINITIONS EXPLICIT TAGS ::= BEGIN -- OID arc for KerberosV5 -- -- This OID may be used to identify Kerberos protocol messages -- encapsulated in other protocols. -- -- This OID also designates the OID arc for KerberosV5-related OIDs. -- -- NOTE: RFC 1510 had an incorrect value (5) for "dod" in its OID. id-krb5 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) dod(6) internet(1) security(5) kerberosV5(2) } Int32 ::= INTEGER -- libtasn1 bug: (-2147483648..2147483647) -- signed values representable in 32 bits UInt32 ::= INTEGER (0..4294967295) -- unsigned 32 bit values Microseconds ::= INTEGER (0..999999) -- microseconds KerberosString ::= GeneralString -- libtasn1 bug: (IA5String) Realm ::= KerberosString PrincipalName ::= SEQUENCE { name-type [0] Int32, name-string [1] SEQUENCE OF KerberosString } KerberosTime ::= GeneralizedTime -- with no fractional seconds HostAddress ::= SEQUENCE { addr-type [0] Int32, address [1] OCTET STRING } -- NOTE: HostAddresses is always used as an OPTIONAL field and -- should not be empty. HostAddresses -- NOTE: subtly different from rfc1510, -- but has a value mapping and encodes the same ::= SEQUENCE OF HostAddress -- NOTE: AuthorizationData is always used as an OPTIONAL field and -- should not be empty. AuthorizationData ::= SEQUENCE OF SEQUENCE { ad-type [0] Int32, ad-data [1] OCTET STRING } PA-DATA ::= SEQUENCE { -- NOTE: first tag is [1], not [0] padata-type [1] Int32, padata-value [2] OCTET STRING -- might be encoded AP-REQ } KerberosFlags ::= BIT STRING (SIZE (32..MAX)) -- minimum number of bits shall be sent, -- but no fewer than 32 EncryptedData ::= SEQUENCE { etype [0] Int32 -- EncryptionType --, kvno [1] UInt32 OPTIONAL, cipher [2] OCTET STRING -- ciphertext } EncryptionKey ::= SEQUENCE { keytype [0] Int32 -- actually encryption type --, keyvalue [1] OCTET STRING } Checksum ::= SEQUENCE { cksumtype [0] Int32, checksum [1] OCTET STRING } Ticket ::= [APPLICATION 1] SEQUENCE { tkt-vno [0] INTEGER (5), realm [1] Realm, sname [2] PrincipalName, enc-part [3] EncryptedData -- EncTicketPart } -- Encrypted part of ticket EncTicketPart ::= [APPLICATION 3] SEQUENCE { flags [0] TicketFlags, key [1] EncryptionKey, crealm [2] Realm, cname [3] PrincipalName, transited [4] TransitedEncoding, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, caddr [9] HostAddresses OPTIONAL, authorization-data [10] AuthorizationData OPTIONAL } -- encoded Transited field TransitedEncoding ::= SEQUENCE { tr-type [0] Int32 -- must be registered --, contents [1] OCTET STRING } TicketFlags ::= KerberosFlags -- reserved(0), -- forwardable(1), -- forwarded(2), -- proxiable(3), -- proxy(4), -- may-postdate(5), -- postdated(6), -- invalid(7), -- renewable(8), -- initial(9), -- pre-authent(10), -- hw-authent(11), -- the following are new since 1510 -- transited-policy-checked(12), -- ok-as-delegate(13) AS-REQ ::= [APPLICATION 10] KDC-REQ TGS-REQ ::= [APPLICATION 12] KDC-REQ KDC-REQ ::= SEQUENCE { -- NOTE: first tag is [1], not [0] pvno [1] INTEGER (5) , msg-type [2] INTEGER (10 -- AS -- | 12 -- TGS --), padata [3] SEQUENCE OF PA-DATA OPTIONAL -- NOTE: not empty --, req-body [4] KDC-REQ-BODY } KDC-REQ-BODY ::= SEQUENCE { kdc-options [0] KDCOptions, cname [1] PrincipalName OPTIONAL -- Used only in AS-REQ --, realm [2] Realm -- Server's realm -- Also client's in AS-REQ --, sname [3] PrincipalName OPTIONAL, from [4] KerberosTime OPTIONAL, till [5] KerberosTime, rtime [6] KerberosTime OPTIONAL, nonce [7] UInt32, etype [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --, addresses [9] HostAddresses OPTIONAL, enc-authorization-data [10] EncryptedData OPTIONAL -- AuthorizationData --, additional-tickets [11] SEQUENCE OF Ticket OPTIONAL -- NOTE: not empty } KDCOptions ::= KerberosFlags -- reserved(0), -- forwardable(1), -- forwarded(2), -- proxiable(3), -- proxy(4), -- allow-postdate(5), -- postdated(6), -- unused7(7), -- renewable(8), -- unused9(9), -- unused10(10), -- opt-hardware-auth(11), -- unused12(12), -- unused13(13), -- 15 is reserved for canonicalize -- unused15(15), -- 26 was unused in 1510 -- disable-transited-check(26), -- -- renewable-ok(27), -- enc-tkt-in-skey(28), -- renew(30), -- validate(31) AS-REP ::= [APPLICATION 11] KDC-REP TGS-REP ::= [APPLICATION 13] KDC-REP KDC-REP ::= SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (11 -- AS -- | 13 -- TGS --), padata [2] SEQUENCE OF PA-DATA OPTIONAL -- NOTE: not empty --, crealm [3] Realm, cname [4] PrincipalName, ticket [5] Ticket, enc-part [6] EncryptedData -- EncASRepPart or EncTGSRepPart, -- as appropriate } EncASRepPart ::= [APPLICATION 25] EncKDCRepPart EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart EncKDCRepPart ::= SEQUENCE { key [0] EncryptionKey, last-req [1] LastReq, nonce [2] UInt32, key-expiration [3] KerberosTime OPTIONAL, flags [4] TicketFlags, authtime [5] KerberosTime, starttime [6] KerberosTime OPTIONAL, endtime [7] KerberosTime, renew-till [8] KerberosTime OPTIONAL, srealm [9] Realm, sname [10] PrincipalName, caddr [11] HostAddresses OPTIONAL } LastReq ::= SEQUENCE OF SEQUENCE { lr-type [0] Int32, lr-value [1] KerberosTime } AP-REQ ::= [APPLICATION 14] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (14), ap-options [2] APOptions, ticket [3] Ticket, authenticator [4] EncryptedData -- Authenticator } APOptions ::= KerberosFlags -- reserved(0), -- use-session-key(1), -- mutual-required(2) -- Unencrypted authenticator Authenticator ::= [APPLICATION 2] SEQUENCE { authenticator-vno [0] INTEGER (5), crealm [1] Realm, cname [2] PrincipalName, cksum [3] Checksum OPTIONAL, cusec [4] Microseconds, ctime [5] KerberosTime, subkey [6] EncryptionKey OPTIONAL, seq-number [7] UInt32 OPTIONAL, authorization-data [8] AuthorizationData OPTIONAL } AP-REP ::= [APPLICATION 15] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (15), enc-part [2] EncryptedData -- EncAPRepPart } EncAPRepPart ::= [APPLICATION 27] SEQUENCE { ctime [0] KerberosTime, cusec [1] Microseconds, subkey [2] EncryptionKey OPTIONAL, seq-number [3] UInt32 OPTIONAL } KRB-SAFE ::= [APPLICATION 20] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (20), safe-body [2] KRB-SAFE-BODY, cksum [3] Checksum } KRB-SAFE-BODY ::= SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress, r-address [5] HostAddress OPTIONAL } KRB-PRIV ::= [APPLICATION 21] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (21), -- NOTE: there is no [2] tag enc-part [3] EncryptedData -- EncKrbPrivPart } EncKrbPrivPart ::= [APPLICATION 28] SEQUENCE { user-data [0] OCTET STRING, timestamp [1] KerberosTime OPTIONAL, usec [2] Microseconds OPTIONAL, seq-number [3] UInt32 OPTIONAL, s-address [4] HostAddress -- sender's addr --, r-address [5] HostAddress OPTIONAL -- recip's addr } KRB-CRED ::= [APPLICATION 22] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (22), tickets [2] SEQUENCE OF Ticket, enc-part [3] EncryptedData -- EncKrbCredPart } EncKrbCredPart ::= [APPLICATION 29] SEQUENCE { ticket-info [0] SEQUENCE OF KrbCredInfo, nonce [1] UInt32 OPTIONAL, timestamp [2] KerberosTime OPTIONAL, usec [3] Microseconds OPTIONAL, s-address [4] HostAddress OPTIONAL, r-address [5] HostAddress OPTIONAL } KrbCredInfo ::= SEQUENCE { key [0] EncryptionKey, prealm [1] Realm OPTIONAL, pname [2] PrincipalName OPTIONAL, flags [3] TicketFlags OPTIONAL, authtime [4] KerberosTime OPTIONAL, starttime [5] KerberosTime OPTIONAL, endtime [6] KerberosTime OPTIONAL, renew-till [7] KerberosTime OPTIONAL, srealm [8] Realm OPTIONAL, sname [9] PrincipalName OPTIONAL, caddr [10] HostAddresses OPTIONAL } KRB-ERROR ::= [APPLICATION 30] SEQUENCE { pvno [0] INTEGER (5), msg-type [1] INTEGER (30), ctime [2] KerberosTime OPTIONAL, cusec [3] Microseconds OPTIONAL, stime [4] KerberosTime, susec [5] Microseconds, error-code [6] Int32, crealm [7] Realm OPTIONAL, cname [8] PrincipalName OPTIONAL, realm [9] Realm -- service realm --, sname [10] PrincipalName -- service name --, e-text [11] KerberosString OPTIONAL, e-data [12] OCTET STRING OPTIONAL } METHOD-DATA ::= SEQUENCE OF PA-DATA TYPED-DATA ::= SEQUENCE SIZE (1..MAX) OF SEQUENCE { data-type [0] Int32, data-value [1] OCTET STRING OPTIONAL } -- preauth stuff follows PA-ENC-TIMESTAMP ::= EncryptedData -- PA-ENC-TS-ENC PA-ENC-TS-ENC ::= SEQUENCE { patimestamp [0] KerberosTime -- client's time --, pausec [1] Microseconds OPTIONAL } ETYPE-INFO-ENTRY ::= SEQUENCE { etype [0] Int32, salt [1] OCTET STRING OPTIONAL } ETYPE-INFO ::= SEQUENCE OF ETYPE-INFO-ENTRY ETYPE-INFO2-ENTRY ::= SEQUENCE { etype [0] Int32, salt [1] KerberosString OPTIONAL, s2kparams [2] OCTET STRING OPTIONAL } ETYPE-INFO2 ::= SEQUENCE SIZE (1..MAX) OF ETYPE-INFO2-ENTRY AD-IF-RELEVANT ::= AuthorizationData AD-KDCIssued ::= SEQUENCE { ad-checksum [0] Checksum, i-realm [1] Realm OPTIONAL, i-sname [2] PrincipalName OPTIONAL, elements [3] AuthorizationData } AD-AND-OR ::= SEQUENCE { condition-count [0] Int32, elements [1] AuthorizationData } AD-MANDATORY-FOR-KDC ::= AuthorizationData END shishi-1.0.2/lib/as.c0000664000000000000000000003436112126660507011223 00000000000000/* as.c --- High level client AS functions * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi is distributed in the hope that it will be useful, but 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_as { Shishi *handle; Shishi_asn1 asreq; Shishi_asn1 asrep; Shishi_asn1 krberror; Shishi_tkt *tkt; }; /** * shishi_as: * @handle: shishi handle as allocated by shishi_init(). * @as: holds pointer to newly allocate Shishi_as structure. * * Allocate a new AS exchange variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as (Shishi * handle, Shishi_as ** as) { Shishi_as *las; int res; *as = xmalloc (sizeof (**as)); las = *as; memset (las, 0, sizeof (*las)); las->handle = handle; las->asreq = shishi_asreq (handle); if (las->asreq == NULL) { shishi_error_printf (handle, "Could not create AS-REQ: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } las->asrep = shishi_asrep (handle); if (las->asrep == NULL) { shishi_error_printf (handle, "Could not create AS-REP: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } las->krberror = shishi_krberror (handle); if (las->krberror == NULL) { shishi_error_printf (handle, "Could not create KRB-ERROR: %s\n", shishi_error (handle)); return SHISHI_ASN1_ERROR; } res = shishi_tkt (handle, &las->tkt); if (res != SHISHI_OK) return res; res = shishi_tkt_flags_set (las->tkt, SHISHI_TICKETFLAGS_INITIAL); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_as_done: * @as: structure that holds information about AS exchange * * Deallocate resources associated with AS exchange. This should be * called by the application when it no longer need to utilize the AS * exchange handle. **/ void shishi_as_done (Shishi_as * as) { shishi_asn1_done (as->handle, as->asreq); shishi_asn1_done (as->handle, as->asrep); shishi_asn1_done (as->handle, as->krberror); shishi_tkt_done (as->tkt); free (as); } /* TODO: add shishi_as_clientserver(h,p,a,client,server) and make the shishi_as_cnamerealmsname function take real cname/sname pointer arrays. */ /** * shishi_as_req: * @as: structure that holds information about AS exchange * * Get ASN.1 AS-REQ structure from AS exchange. * * Return value: Returns the generated AS-REQ packet from the AS * exchange, or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_as_req (Shishi_as * as) { return as->asreq; } /** * shishi_as_req_build: * @as: structure that holds information about AS exchange * * Possibly remove unset fields (e.g., rtime). * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_req_build (Shishi_as * as) { int res; res = shishi_kdcreq_build (as->handle, as->asreq); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_as_req_set: * @as: structure that holds information about AS exchange * @asreq: asreq to store in AS. * * Set the AS-REQ in the AS exchange. **/ void shishi_as_req_set (Shishi_as * as, Shishi_asn1 asreq) { if (as->asreq) shishi_asn1_done (as->handle, as->asreq); as->asreq = asreq; } /** * shishi_as_req_der: * @as: structure that holds information about AS exchange * @out: output array with newly allocated DER encoding of AS-REQ. * @outlen: length of output array with DER encoding of AS-REQ. * * DER encode AS-REQ. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_req_der (Shishi_as * as, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (as->handle, as->asreq, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_as_req_der_set: * @as: structure that holds information about AS exchange * @der: input array with DER encoded AP-REQ. * @derlen: length of input array with DER encoded AP-REQ. * * DER decode AS-REQ and set it AS exchange. If decoding fails, the * AS-REQ in the AS exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_as_req_der_set (Shishi_as * as, char *der, size_t derlen) { Shishi_asn1 asreq; asreq = shishi_der2asn1_asreq (as->handle, der, derlen); if (asreq == NULL) return SHISHI_ASN1_ERROR; as->asreq = asreq; return SHISHI_OK; } /** * shishi_as_rep: * @as: structure that holds information about AS exchange * * Get ASN.1 AS-REP structure from AS exchange. * * Return value: Returns the received AS-REP packet from the AS * exchange, or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_as_rep (Shishi_as * as) { return as->asrep; } /** * shishi_as_rep_process: * @as: structure that holds information about AS exchange * @key: user's key, used to encrypt the encrypted part of the AS-REP. * @password: user's password, used if key is NULL. * * Process new AS-REP and set ticket. The key is used to decrypt the * AP-REP. If both key and password is NULL, the user is queried for * it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_rep_process (Shishi_as * as, Shishi_key * key, const char *password) { Shishi_asn1 ticket, kdcreppart; int res; if (VERBOSE (as->handle)) printf ("Processing AS-REQ and AS-REP...\n"); if (VERBOSEASN1 (as->handle)) shishi_kdcreq_print (as->handle, stdout, as->asreq); if (VERBOSEASN1 (as->handle)) shishi_kdcrep_print (as->handle, stdout, as->asrep); if (key == NULL && password == NULL) { char *passwd; char *user; size_t userlen; res = shishi_asreq_clientrealm (as->handle, as->asreq, &user, &userlen); if (res != SHISHI_OK) { shishi_error_printf (as->handle, "Could not extract cname and " "realm from AS-REQ: %s\n", shishi_strerror (res)); return res; } res = shishi_prompt_password (as->handle, &passwd, "Enter password for `%s': ", user); free (user); if (res != SHISHI_OK) { shishi_error_printf (as->handle, "Reading password failed: %s\n", shishi_strerror (res)); return res; } res = shishi_as_process (as->handle, as->asreq, as->asrep, passwd, &kdcreppart); free (passwd); } else if (key == NULL) res = shishi_as_process (as->handle, as->asreq, as->asrep, password, &kdcreppart); else res = shishi_kdc_process (as->handle, as->asreq, as->asrep, key, SHISHI_KEYUSAGE_ENCASREPPART, &kdcreppart); if (res != SHISHI_OK) return res; if (VERBOSE (as->handle)) printf ("Got EncKDCRepPart...\n"); if (VERBOSEASN1 (as->handle)) shishi_enckdcreppart_print (as->handle, stdout, kdcreppart); res = shishi_kdcrep_get_ticket (as->handle, as->asrep, &ticket); if (res != SHISHI_OK) { shishi_error_printf (as->handle, "Could not extract ticket from AS-REP: %s", shishi_error (as->handle)); return res; } if (VERBOSE (as->handle)) printf ("Got Ticket...\n"); if (VERBOSEASN1 (as->handle)) shishi_ticket_print (as->handle, stdout, ticket); /* XXX */ as->tkt = shishi_tkt2 (as->handle, ticket, kdcreppart, as->asrep); return SHISHI_OK; } /** * shishi_as_rep_build: * @as: structure that holds information about AS exchange * @key: user's key, used to encrypt the encrypted part of the AS-REP. * * Build AS-REP. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_rep_build (Shishi_as * as, Shishi_key * key) { int rc; /* XXX there are reasons for having padata in AS-REP */ rc = shishi_kdcrep_clear_padata (as->handle, as->asrep); if (rc != SHISHI_OK) return rc; rc = shishi_enckdcreppart_populate_encticketpart (as->handle, shishi_tkt_enckdcreppart (as->tkt), shishi_tkt_encticketpart (as->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_nonce (as->handle, as->asreq, shishi_tkt_enckdcreppart (as->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_add_enc_part (as->handle, as->asrep, key, SHISHI_KEYUSAGE_ENCASREPPART, shishi_tkt_enckdcreppart (as->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdcrep_set_ticket (as->handle, as->asrep, shishi_tkt_ticket (as->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_crealm (as->handle, as->asrep, shishi_tkt_encticketpart (as->tkt)); if (rc != SHISHI_OK) return rc; rc = shishi_kdc_copy_cname (as->handle, as->asrep, shishi_tkt_encticketpart (as->tkt)); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_as_rep_der: * @as: structure that holds information about AS exchange * @out: output array with newly allocated DER encoding of AS-REP. * @outlen: length of output array with DER encoding of AS-REP. * * DER encode AS-REP. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_rep_der (Shishi_as * as, char **out, size_t * outlen) { int rc; rc = shishi_asn1_to_der (as->handle, as->asrep, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_as_rep_set: * @as: structure that holds information about AS exchange * @asrep: asrep to store in AS. * * Set the AS-REP in the AS exchange. **/ void shishi_as_rep_set (Shishi_as * as, Shishi_asn1 asrep) { if (as->asrep) shishi_asn1_done (as->handle, as->asrep); as->asrep = asrep; } /** * shishi_as_rep_der_set: * @as: structure that holds information about AS exchange * @der: input array with DER encoded AP-REP. * @derlen: length of input array with DER encoded AP-REP. * * DER decode AS-REP and set it AS exchange. If decoding fails, the * AS-REP in the AS exchange remains. * * Return value: Returns SHISHI_OK. **/ int shishi_as_rep_der_set (Shishi_as * as, char *der, size_t derlen) { Shishi_asn1 asrep; asrep = shishi_der2asn1_asrep (as->handle, der, derlen); if (asrep == NULL) return SHISHI_ASN1_ERROR; as->asrep = asrep; return SHISHI_OK; } /** * shishi_as_krberror: * @as: structure that holds information about AS exchange * * Get ASN.1 KRB-ERROR structure from AS exchange. * * Return value: Returns the received KRB-ERROR packet from the AS * exchange, or NULL if not yet set or an error occured. **/ Shishi_asn1 shishi_as_krberror (Shishi_as * as) { return as->krberror; } /** * shishi_as_krberror_der: * @as: structure that holds information about AS exchange * @out: output array with newly allocated DER encoding of KRB-ERROR. * @outlen: length of output array with DER encoding of KRB-ERROR. * * DER encode KRB-ERROR. @out is allocated by this function, and it is * the responsibility of caller to deallocate it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_krberror_der (Shishi_as * as, char **out, size_t * outlen) { int rc; rc = shishi_krberror_der (as->handle, as->krberror, out, outlen); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /** * shishi_as_krberror_set: * @as: structure that holds information about AS exchange * @krberror: krberror to store in AS. * * Set the KRB-ERROR in the AS exchange. **/ void shishi_as_krberror_set (Shishi_as * as, Shishi_asn1 krberror) { if (as->krberror) shishi_asn1_done (as->handle, as->krberror); as->krberror = krberror; } /** * shishi_as_tkt: * @as: structure that holds information about AS exchange * * Get Ticket in AS exchange. * * Return value: Returns the newly acquired tkt from the AS * exchange, or NULL if not yet set or an error occured. **/ Shishi_tkt * shishi_as_tkt (Shishi_as * as) { return as->tkt; } /** * shishi_as_tkt_set: * @as: structure that holds information about AS exchange * @tkt: tkt to store in AS. * * Set the Tkt in the AS exchange. **/ void shishi_as_tkt_set (Shishi_as * as, Shishi_tkt * tkt) { as->tkt = tkt; } /** * shishi_as_sendrecv_hint: * @as: structure that holds information about AS exchange * @hint: additional parameters that modify connection behaviour, or %NULL. * * Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial * authentication, usually used to acquire a Ticket Granting Ticket. * The @hint structure can be used to set, e.g., parameters for TLS * authentication. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_sendrecv_hint (Shishi_as * as, Shishi_tkts_hint * hint) { int res; if (VERBOSE (as->handle)) printf ("Sending AS-REQ...\n"); if (VERBOSEASN1 (as->handle)) shishi_kdcreq_print (as->handle, stdout, as->asreq); res = shishi_kdcreq_sendrecv_hint (as->handle, as->asreq, &as->asrep, hint); if (res == SHISHI_GOT_KRBERROR) { as->krberror = as->asrep; as->asrep = NULL; if (VERBOSE (as->handle)) printf ("Received KRB-ERROR...\n"); if (VERBOSEASN1 (as->handle)) shishi_krberror_print (as->handle, stdout, as->krberror); if (VERBOSEASN1 (as->handle)) shishi_krberror_pretty_print (as->handle, stdout, as->krberror); } if (res != SHISHI_OK) return res; if (VERBOSE (as->handle)) printf ("Received AS-REP...\n"); if (VERBOSEASN1 (as->handle)) shishi_kdcrep_print (as->handle, stdout, as->asrep); return SHISHI_OK; } /** * shishi_as_sendrecv: * @as: structure that holds information about AS exchange * * Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial * authentication, usually used to acquire a Ticket Granting Ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_as_sendrecv (Shishi_as * as) { return shishi_as_sendrecv_hint (as, NULL); } shishi-1.0.2/lib/version.c0000664000000000000000000000264012126660507012300 00000000000000/* version.c --- Version handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi is free software; you can redistribute it and/or modify it 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA * */ #include "internal.h" /** * shishi_check_version: * @req_version: version string to compare with, or NULL * * Check that the version of the library is at minimum the one given * as a string in @req_version. * * Return value: the actual version string of the library; NULL if the * condition is not met. If %NULL is passed to this function no * check is done and only the version string is returned. **/ const char * shishi_check_version (const char *req_version) { if (!req_version || strverscmp (req_version, PACKAGE_VERSION) <= 0) return PACKAGE_VERSION; return NULL; } shishi-1.0.2/lib/key.c0000664000000000000000000003267112126660507011412 00000000000000/* key.c --- Key related functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" struct Shishi_key { Shishi *handle; char *principal; char *realm; int type; char value[MAX_KEY_LEN]; uint32_t kvno; /* UINT32_MAX means undefined kvno */ time_t timestamp; /* Only used by keytab code. */ /* If you add anything here, check the functions shishi_key, shishi_key_done and shishi_key_copy. */ }; /** * shishi_key_principal: * @key: structure that holds key information * * Get the principal part of the key owner principal name, i.e., * except the realm. * * Return value: Returns the principal owning the key. (Not a copy of * it, so don't modify or deallocate it.) **/ const char * shishi_key_principal (const Shishi_key * key) { return key->principal; } /** * shishi_key_principal_set: * @key: structure that holds key information * @principal: string with new principal name. * * Set the principal owning the key. The string is copied into the * key, so you can dispose of the variable immediately after calling * this function. **/ void shishi_key_principal_set (Shishi_key * key, const char *principal) { free (key->principal); if (principal) key->principal = xstrdup (principal); else key->principal = NULL; } /** * shishi_key_realm: * @key: structure that holds key information * * Get the realm part of the key owner principal name. * * Return value: Returns the realm for the principal owning the key. * (Not a copy of it, so don't modify or deallocate it.) **/ const char * shishi_key_realm (const Shishi_key * key) { return key->realm; } /** * shishi_key_realm_set: * @key: structure that holds key information * @realm: string with new realm name. * * Set the realm for the principal owning the key. The string is * copied into the key, so you can dispose of the variable immediately * after calling this function. **/ void shishi_key_realm_set (Shishi_key * key, const char *realm) { free (key->realm); if (realm) key->realm = xstrdup (realm); else key->realm = NULL; } /** * shishi_key_type: * @key: structure that holds key information * * Get key type. * * Return value: Returns the type of key as an integer as described in * the standard. **/ int shishi_key_type (const Shishi_key * key) { return key->type; } /** * shishi_key_type_set: * @key: structure that holds key information * @type: type to set in key. * * Set the type of key in key structure. **/ void shishi_key_type_set (Shishi_key * key, int32_t type) { key->type = type; } /** * shishi_key_value: * @key: structure that holds key information * * Get the raw key bytes. * * Return value: Returns the key value as a pointer which is valid * throughout the lifetime of the key structure. **/ const char * shishi_key_value (const Shishi_key * key) { return key->value; } /** * shishi_key_value_set: * @key: structure that holds key information * @value: input array with key data. * * Set the key value and length in key structure. The value is copied * into the key (in other words, you can deallocate @value right after * calling this function without modifying the value inside the key). **/ void shishi_key_value_set (Shishi_key * key, const char *value) { if (value && shishi_cipher_keylen (key->type) > 0 && shishi_cipher_keylen (key->type) <= MAX_KEY_LEN) memcpy (key->value, value, shishi_cipher_keylen (key->type)); } /** * shishi_key_version: * @key: structure that holds key information * * Get the "kvno" (key version) of key. It will be UINT32_MAX if the * key is not long-lived. * * Return value: Returns the version of key ("kvno"). **/ uint32_t shishi_key_version (const Shishi_key * key) { return key->kvno; } /** * shishi_key_version_set: * @key: structure that holds key information * @kvno: new version integer. * * Set the version of key ("kvno") in key structure. Use UINT32_MAX * for non-ptermanent keys. **/ void shishi_key_version_set (Shishi_key * key, uint32_t kvno) { key->kvno = kvno; } /** * shishi_key_timestamp: * @key: structure that holds key information * * Get the time the key was established. Typically only present when * the key was imported from a keytab format. * * Return value: Returns the time the key was established, or * (time_t)-1 if not available. * * Since: 0.0.42 **/ time_t shishi_key_timestamp (const Shishi_key * key) { return key->timestamp; } /** * shishi_key_timestamp_set: * @key: structure that holds key information * @timestamp: new timestamp. * * Set the time the key was established. Typically only relevant when * exporting the key to keytab format. * * Since: 0.0.42 **/ void shishi_key_timestamp_set (Shishi_key * key, time_t timestamp) { key->timestamp = timestamp; } /** * shishi_key_name: * @key: structure that holds key information * * Calls shishi_cipher_name for key type. * * Return value: Return name of key. **/ const char * shishi_key_name (Shishi_key * key) { return shishi_cipher_name (key->type); } /** * shishi_key_length: * @key: structure that holds key information * * Calls shishi_cipher_keylen for key type. * * Return value: Returns the length of the key value. **/ size_t shishi_key_length (const Shishi_key * key) { return shishi_cipher_keylen (key->type); } /** * shishi_key: * @handle: Shishi library handle create by shishi_init(). * @key: pointer to structure that will hold newly created key information * * Create a new Key information structure. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key (Shishi * handle, Shishi_key ** key) { *key = xcalloc (1, sizeof (**key)); (*key)->handle = handle; (*key)->kvno = UINT32_MAX; return SHISHI_OK; } /** * shishi_key_done: * @key: pointer to structure that holds key information. * * Deallocates key information structure. **/ void shishi_key_done (Shishi_key * key) { free (key->realm); free (key->principal); free (key); } /** * shishi_key_copy: * @dstkey: structure that holds destination key information * @srckey: structure that holds source key information * * Copies source key into existing allocated destination key. **/ void shishi_key_copy (Shishi_key * dstkey, Shishi_key * srckey) { shishi_key_principal_set (dstkey, shishi_key_principal (srckey)); shishi_key_realm_set (dstkey, shishi_key_realm (srckey)); shishi_key_type_set (dstkey, shishi_key_type (srckey)); shishi_key_value_set (dstkey, shishi_key_value (srckey)); shishi_key_version_set (dstkey, shishi_key_version (srckey)); shishi_key_timestamp_set (dstkey, shishi_key_timestamp (srckey)); } /** * shishi_key_from_value: * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @value: input array with key value, or NULL. * @key: pointer to structure that will hold newly created key information * * Create a new Key information structure, and set the key type and * key value. KEY contains a newly allocated structure only if this * function is successful. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_from_value (Shishi * handle, int32_t type, const char *value, Shishi_key ** key) { int rc; rc = shishi_key (handle, key); if (rc != SHISHI_OK) return rc; shishi_key_type_set (*key, type); if (value) shishi_key_value_set (*key, value); return SHISHI_OK; } /** * shishi_key_from_base64: * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @value: input string with base64 encoded key value, or NULL. * @key: pointer to structure that will hold newly created key information * * Create a new Key information structure, and set the key type and * key value. KEY contains a newly allocated structure only if this * function is successful. * * Return value: Returns SHISHI_INVALID_KEY if the base64 encoded key * length doesn't match the key type, and SHISHI_OK on * success. **/ int shishi_key_from_base64 (Shishi * handle, int32_t type, const char *value, Shishi_key ** key) { int rc; rc = shishi_key (handle, key); if (rc != SHISHI_OK) return rc; shishi_key_type_set (*key, type); if (value) { size_t len = MAX_KEY_LEN; if (!base64_decode (value, strlen (value), (*key)->value, &len)) { shishi_key_done (*key); return SHISHI_BASE64_ERROR; } if (len != shishi_key_length (*key)) { shishi_key_done (*key); return SHISHI_INVALID_KEY; } } return SHISHI_OK; } /** * shishi_key_random * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @key: pointer to structure that will hold newly created key information * * Create a new Key information structure for the key type and some * random data. KEY contains a newly allocated structure only if this * function is successful. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_random (Shishi * handle, int32_t type, Shishi_key ** key) { char buf[MAX_RANDOM_LEN]; int len = shishi_cipher_randomlen (type); int rc; rc = shishi_randomize (handle, 1, buf, len); if (rc != SHISHI_OK) return rc; rc = shishi_key (handle, key); if (rc != SHISHI_OK) return rc; rc = shishi_random_to_key (handle, type, buf, len, *key); if (rc != SHISHI_OK) { shishi_key_done (*key); return rc; } return SHISHI_OK; } /** * shishi_key_from_random * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @rnd: random data. * @rndlen: length of random data. * @outkey: pointer to structure that will hold newly created key information * * Create a new Key information structure, and set the key type and * key value using shishi_random_to_key(). KEY contains a newly * allocated structure only if this function is successful. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_from_random (Shishi * handle, int32_t type, const char *rnd, size_t rndlen, Shishi_key ** outkey) { int rc; rc = shishi_key (handle, outkey); if (rc != SHISHI_OK) return rc; rc = shishi_random_to_key (handle, type, rnd, rndlen, *outkey); return rc; } /** * shishi_key_from_string * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @password: input array containing password. * @passwordlen: length of input array containing password. * @salt: input array containing salt. * @saltlen: length of input array containing salt. * @parameter: input array with opaque encryption type specific information. * @outkey: pointer to structure that will hold newly created key information * * Create a new Key information structure, and set the key type and * key value using shishi_string_to_key(). KEY contains a newly * allocated structure only if this function is successful. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_from_string (Shishi * handle, int32_t type, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key ** outkey) { int rc; rc = shishi_key (handle, outkey); if (rc != SHISHI_OK) return rc; rc = shishi_string_to_key (handle, type, password, passwordlen, salt, saltlen, parameter, *outkey); if (rc != SHISHI_OK) { shishi_key_done (*outkey); return rc; } return SHISHI_OK; } /** * shishi_key_from_name: * @handle: Shishi library handle create by shishi_init(). * @type: type of key. * @name: principal name of user. * @password: input array containing password. * @passwordlen: length of input array containing password. * @parameter: input array with opaque encryption type specific information. * @outkey: pointer to structure that will hold newly created key information * * Create a new Key information structure, and derive the key from * principal name and password using shishi_key_from_name(). The salt * is derived from the principal name by concatenating the decoded * realm and principal. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_from_name (Shishi * handle, int32_t type, const char *name, const char *password, size_t passwordlen, const char *parameter, Shishi_key ** outkey) { int rc; char *salt; rc = shishi_derive_default_salt (handle, name, &salt); if (rc != SHISHI_OK) return rc; rc = shishi_key_from_string (handle, type, password, passwordlen, salt, strlen (salt), parameter, outkey); if (rc == SHISHI_OK) { char *principal; char *realm; rc = shishi_parse_name (handle, name, &principal, &realm); if (rc == SHISHI_OK) { shishi_key_principal_set (*outkey, principal); shishi_key_realm_set (*outkey, realm); free (realm); free (principal); } } free (salt); return rc; } shishi-1.0.2/lib/netio.c0000664000000000000000000002670012126660507011734 00000000000000/* netio.c --- Network I/O functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_sendrecv_tls, etc. */ #include "starttls.h" /* Get _shishi_realminfo, etc. */ #include "diskio.h" /* Get _shishi_realminfo. */ #include "cfg.h" static int sendrecv_udp (Shishi * handle, struct addrinfo *ai, const char *indata, int inlen, char **outdata, size_t * outlen) { char tmpbuf[BUFSIZ]; /* XXX can we do without it? MSG_PEEK|MSG_TRUNC doesn't work for udp.. */ int sockfd; int bytes_sent; fd_set readfds; struct timeval tout; ssize_t slen; int rc; sockfd = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sockfd < 0) { shishi_error_set (handle, strerror (errno)); return SHISHI_SOCKET_ERROR; } if (connect (sockfd, ai->ai_addr, ai->ai_addrlen) != 0) { shishi_error_set (handle, strerror (errno)); close (sockfd); return SHISHI_BIND_ERROR; } bytes_sent = write (sockfd, indata, inlen); if (bytes_sent != inlen) { shishi_error_set (handle, strerror (errno)); close (sockfd); return SHISHI_SENDTO_ERROR; } FD_ZERO (&readfds); FD_SET (sockfd, &readfds); tout.tv_sec = handle->kdctimeout; tout.tv_usec = 0; if ((rc = select (sockfd + 1, &readfds, NULL, NULL, &tout)) != 1) { if (rc == -1) shishi_error_set (handle, strerror (errno)); else shishi_error_clear (handle); close (sockfd); return SHISHI_KDC_TIMEOUT; } *outlen = sizeof (tmpbuf); slen = read (sockfd, tmpbuf, *outlen); if (slen == -1) { shishi_error_set (handle, strerror (errno)); close (sockfd); return SHISHI_RECVFROM_ERROR; } *outdata = xmalloc (slen); *outlen = slen; memcpy (*outdata, tmpbuf, slen); if (close (sockfd) != 0) { shishi_error_set (handle, strerror (errno)); return SHISHI_CLOSE_ERROR; } return SHISHI_OK; } static int sendrecv_tcp (Shishi * handle, struct addrinfo *ai, const char *indata, int inlen, char **outdata, size_t * outlen) { char tmpbuf[BUFSIZ]; /* XXX can we do without it? MSG_PEEK|MSG_TRUNC doesn't work for udp.. */ int sockfd; int bytes_sent; struct sockaddr_storage from_sa; socklen_t length = sizeof (struct sockaddr_storage); fd_set readfds; struct timeval tout; int rc; ssize_t slen; sockfd = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sockfd < 0) { shishi_error_set (handle, strerror (errno)); return SHISHI_SOCKET_ERROR; } if (connect (sockfd, ai->ai_addr, ai->ai_addrlen) != 0) { shishi_error_set (handle, strerror (errno)); close (sockfd); return SHISHI_BIND_ERROR; } tmpbuf[3] = inlen & 0xFF; tmpbuf[2] = (inlen >> 8) & 0xFF; tmpbuf[1] = (inlen >> 16) & 0xFF; tmpbuf[0] = (inlen >> 24) & 0xFF; bytes_sent = write (sockfd, tmpbuf, 4); if (bytes_sent != 4) { shishi_error_set (handle, strerror (errno)); return SHISHI_SENDTO_ERROR; } bytes_sent = write (sockfd, (const void *) indata, inlen); if (bytes_sent != inlen) { shishi_error_set (handle, strerror (errno)); return SHISHI_SENDTO_ERROR; } FD_ZERO (&readfds); FD_SET (sockfd, &readfds); tout.tv_sec = handle->kdctimeout; tout.tv_usec = 0; if ((rc = select (sockfd + 1, &readfds, NULL, NULL, &tout)) != 1) { if (rc == -1) shishi_error_set (handle, strerror (errno)); else shishi_error_clear (handle); return SHISHI_KDC_TIMEOUT; } *outlen = 4; slen = recvfrom (sockfd, tmpbuf, *outlen, 0, (struct sockaddr *) &from_sa, &length); if (slen == -1) { shishi_error_set (handle, strerror (errno)); return SHISHI_RECVFROM_ERROR; } *outlen = sizeof (tmpbuf); slen = recvfrom (sockfd, tmpbuf, *outlen, 0, (struct sockaddr *) &from_sa, &length); if (slen == -1) { shishi_error_set (handle, strerror (errno)); return SHISHI_RECVFROM_ERROR; } *outdata = xmalloc (slen); *outlen = slen; memcpy (*outdata, tmpbuf, slen); if (close (sockfd) != 0) { shishi_error_set (handle, strerror (errno)); return SHISHI_CLOSE_ERROR; } return SHISHI_OK; } static int sendrecv_host (Shishi * handle, int transport, const char *host, const char *port, const char *indata, size_t inlen, char **outdata, size_t * outlen) { struct addrinfo hints; struct addrinfo *ai; int rc; memset (&hints, 0, sizeof (hints)); if (transport == TCP || transport == TLS) hints.ai_socktype = SOCK_STREAM; else hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_ADDRCONFIG; if (port == NULL) port = "88"; rc = getaddrinfo (host, port, &hints, &ai); if (rc != 0) { shishi_error_printf (handle, "Cannot find host %s", host); return SHISHI_KDC_NOT_KNOWN_FOR_REALM; } do { char nodename[NI_MAXHOST]; size_t j = 0; rc = getnameinfo (ai->ai_addr, ai->ai_addrlen, nodename, sizeof (nodename), NULL, 0, NI_NUMERICHOST); shishi_verbose (handle, "Sending to %s (%s) port %s transport %s", host, rc == 0 ? nodename : "unknown address", port, _shishi_transport2string (transport)); do { if (transport == TCP) rc = sendrecv_tcp (handle, ai, indata, inlen, outdata, outlen); #ifdef USE_STARTTLS else if (transport == TLS) rc = _shishi_sendrecv_tls (handle, ai, indata, inlen, outdata, outlen); #endif else rc = sendrecv_udp (handle, ai, indata, inlen, outdata, outlen); if (rc != SHISHI_OK) shishi_verbose (handle, "Error sending to KDC: %s", shishi_strerror (rc)); } while (rc == SHISHI_KDC_TIMEOUT && ++j < handle->kdcretries); } while (rc != SHISHI_OK && (ai = ai->ai_next)); return rc; } static int sendrecv_srv3 (Shishi * handle, int transport, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen, Shishi_dns rrs, bool * found_srv_records) { int rc = SHISHI_KDC_NOT_KNOWN_FOR_REALM; for (; rrs; rrs = rrs->next) { Shishi_dns_srv srv = rrs->rr; char *port; if (rrs->class != SHISHI_DNS_IN) continue; if (rrs->type != SHISHI_DNS_SRV) continue; shishi_verbose (handle, "Found SRV host %s port %d", srv->name, srv->port); *found_srv_records = true; port = xasprintf ("%d", srv->port); rc = sendrecv_host (handle, transport, srv->name, port, indata, inlen, outdata, outlen); free (port); if (rc == SHISHI_OK) return rc; } return rc; } static int sendrecv_srv2 (Shishi * handle, int transport, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen, bool * found_srv_records) { Shishi_dns rrs; char *tmp; int rc; if (transport != UDP && transport != TCP) return SHISHI_KDC_NOT_KNOWN_FOR_REALM; tmp = xasprintf ("_kerberos._%s.%s", transport == UDP ? "udp" : "tcp", realm); shishi_verbose (handle, "Looking up SRV for %s", tmp); rrs = shishi_resolv (tmp, SHISHI_DNS_SRV); free (tmp); if (rrs) rc = sendrecv_srv3 (handle, transport, realm, indata, inlen, outdata, outlen, rrs, found_srv_records); else rc = SHISHI_KDC_NOT_KNOWN_FOR_REALM; shishi_resolv_free (rrs); return rc; } static int sendrecv_srv (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen, bool * found_srv_records) { int rc = sendrecv_srv2 (handle, UDP, realm, indata, inlen, outdata, outlen, found_srv_records); if (rc == SHISHI_OK) return rc; return sendrecv_srv2 (handle, TCP, realm, indata, inlen, outdata, outlen, found_srv_records); } static int sendrecv_static (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen) { struct Shishi_realminfo *ri; size_t k; int rc; ri = _shishi_realminfo (handle, realm); if (!ri || ri->nkdcaddresses == 0) { shishi_error_printf (handle, "No KDC configured for %s", realm); return SHISHI_KDC_NOT_KNOWN_FOR_REALM; } rc = SHISHI_KDC_NOT_KNOWN_FOR_REALM; for (k = 0; k < ri->nkdcaddresses; k++) { rc = sendrecv_host (handle, ri->kdcaddresses[k].transport, ri->kdcaddresses[k].hostname, ri->kdcaddresses[k].port, indata, inlen, outdata, outlen); if (rc == SHISHI_OK) return rc; } return rc; } /** * shishi_kdc_sendrecv_hint: * @handle: Shishi library handle create by shishi_init(). * @realm: string with realm name. * @indata: Packet to send to KDC. * @inlen: Length of @indata. * @outdata: Newly allocated string with data returned from KDC. * @outlen: Length of @outdata. * @hint: a #Shishi_tkts_hint structure with flags. * * Send packet to KDC for realm and receive response. The code finds * KDC addresses from configuration file, then by querying for SRV * records for the realm, and finally by using the realm name as a * hostname. * * Returns: %SHISHI_OK on success, %SHISHI_KDC_TIMEOUT if a timeout * was reached, or other errors. **/ int shishi_kdc_sendrecv_hint (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen, Shishi_tkts_hint * hint) { struct Shishi_realminfo *ri; bool found_srv_records = false; int rc; ri = _shishi_realminfo (handle, realm); if (ri && ri->nkdcaddresses > 0) /* If we have configured KDCs, never use DNS or direct method. */ return sendrecv_static (handle, realm, indata, inlen, outdata, outlen); rc = sendrecv_srv (handle, realm, indata, inlen, outdata, outlen, &found_srv_records); if (rc != SHISHI_OK && !found_srv_records) { shishi_verbose (handle, "No SRV RRs, trying realm host mapping for %s", realm); rc = sendrecv_host (handle, UDP, realm, NULL, indata, inlen, outdata, outlen); } return rc; } /** * shishi_kdc_sendrecv: * @handle: Shishi library handle create by shishi_init(). * @realm: string with realm name. * @indata: Packet to send to KDC. * @inlen: Length of @indata. * @outdata: Newly allocated string with data returned from KDC. * @outlen: Length of @outdata. * * Send packet to KDC for realm and receive response. The code finds * KDC addresses from configuration file, then by querying for SRV * records for the realm, and finally by using the realm name as a * hostname. * * Returns: %SHISHI_OK on success, %SHISHI_KDC_TIMEOUT if a timeout * was reached, or other errors. **/ int shishi_kdc_sendrecv (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen) { return shishi_kdc_sendrecv_hint (handle, realm, indata, inlen, outdata, outlen, NULL); } shishi-1.0.2/lib/crypto-null.c0000664000000000000000000000425612126660507013110 00000000000000/* crypto-null.c --- NULL crypto functions * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #include "crypto.h" static int null_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { *outlen = inlen; *out = xmalloc (*outlen); memcpy (*out, in, inlen); if (ivout) *ivout = NULL; if (ivoutlen) *ivoutlen = 0; return SHISHI_OK; } static int null_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { *outlen = inlen; *out = xmalloc (*outlen); memcpy (*out, in, inlen); if (ivout) *ivout = NULL; if (ivoutlen) *ivoutlen = 0; return SHISHI_OK; } static int null_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { return SHISHI_OK; } static int null_string_to_key (Shishi * handle, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { return SHISHI_OK; } cipherinfo null_info = { SHISHI_NULL, "NULL", 1, 0, 0, 0, SHISHI_RSA_MD5, null_random_to_key, null_string_to_key, null_encrypt, null_decrypt }; shishi-1.0.2/lib/enckdcreppart.c0000664000000000000000000003122612126660507013442 00000000000000/* enckdcreppart.c --- Key distribution encrypted reply part functions * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" Shishi_asn1 shishi_enckdcreppart (Shishi * handle) { int res; Shishi_asn1 node; node = shishi_asn1_enckdcreppart (handle); if (!node) return NULL; /* XXX remove these two: */ res = shishi_asn1_write (handle, node, "key-expiration", NULL, 0); if (res != SHISHI_OK) return NULL; res = shishi_asn1_write (handle, node, "caddr", NULL, 0); if (res != SHISHI_OK) return NULL; res = shishi_enckdcreppart_flags_set (handle, node, 0); if (res != SHISHI_OK) return NULL; return node; } Shishi_asn1 shishi_encasreppart (Shishi * handle) { int res; Shishi_asn1 node; node = shishi_asn1_encasreppart (handle); if (!node) return NULL; /* XXX remove these two: */ res = shishi_asn1_write (handle, node, "key-expiration", NULL, 0); if (res != SHISHI_OK) puts ("urk"); res = shishi_asn1_write (handle, node, "caddr", NULL, 0); if (res != SHISHI_OK) puts ("urk2"); return node; } /** * shishi_enckdcreppart_get_key: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @key: newly allocated encryption key handle. * * Extract the key to use with the ticket sent in the KDC-REP * associated with the EncKDCRepPart input variable. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_get_key (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key ** key) { int res; char *buf; size_t buflen; int32_t keytype; res = shishi_asn1_read_int32 (handle, enckdcreppart, "key.keytype", &keytype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, enckdcreppart, "key.keyvalue", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_key_from_value (handle, keytype, buf, key); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_key_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @key: key handle with information to store in enckdcreppart. * * Set the EncKDCRepPart.key field to key type and value of supplied * key. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_key_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key * key) { int res; res = shishi_asn1_write_integer (handle, enckdcreppart, "key.keytype", shishi_key_type (key)); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_write (handle, enckdcreppart, "key.keyvalue", shishi_key_value (key), shishi_key_length (key)); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; return SHISHI_OK; } /** * shishi_enckdcreppart_nonce_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @nonce: nonce to set in EncKDCRepPart. * * Set the EncKDCRepPart.nonce field. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_nonce_set (Shishi * handle, Shishi_asn1 enckdcreppart, uint32_t nonce) { int res; res = shishi_asn1_write_uint32 (handle, enckdcreppart, "nonce", nonce); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_flags_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @flags: flags to set in EncKDCRepPart. * * Set the EncKDCRepPart.flags field. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_flags_set (Shishi * handle, Shishi_asn1 enckdcreppart, int flags) { int res; res = shishi_asn1_write_bitstring (handle, enckdcreppart, "flags", flags); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_authtime_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @authtime: character buffer containing a generalized time string. * * Set the EncTicketPart.authtime to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_authtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *authtime) { int res; res = shishi_asn1_write (handle, enckdcreppart, "authtime", authtime, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_starttime_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @starttime: character buffer containing a generalized time string. * * Set the EncTicketPart.starttime to supplied value. Use a NULL * value for @starttime to remove the field. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_starttime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *starttime) { int res; if (!starttime) res = shishi_asn1_write (handle, enckdcreppart, "starttime", NULL, 0); else res = shishi_asn1_write (handle, enckdcreppart, "starttime", starttime, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_endtime_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @endtime: character buffer containing a generalized time string. * * Set the EncTicketPart.endtime to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_endtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *endtime) { int res; res = shishi_asn1_write (handle, enckdcreppart, "endtime", endtime, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_renew_till_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @renew_till: character buffer containing a generalized time string. * * Set the EncTicketPart.renew-till to supplied value. Use a NULL * value for @renew_till to remove the field. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_renew_till_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *renew_till) { int res; if (!renew_till) res = shishi_asn1_write (handle, enckdcreppart, "renew-till", NULL, 0); else res = shishi_asn1_write (handle, enckdcreppart, "renew-till", renew_till, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_srealm_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: EncKDCRepPart variable to set realm field in. * @srealm: input array with name of realm. * * Set the server realm field in the EncKDCRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_enckdcreppart_srealm_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *srealm) { int res = SHISHI_OK; res = shishi_asn1_write (handle, enckdcreppart, "srealm", srealm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_sname_set: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: EncKDCRepPart variable to set server name field in. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @sname: input array with principal name. * * Set the server name field in the EncKDCRepPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_enckdcreppart_sname_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_name_type name_type, char *sname[]) { int res = SHISHI_OK; int i; char *buf; res = shishi_asn1_write_integer (handle, enckdcreppart, "sname.name-type", name_type); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, enckdcreppart, "sname.name-string", NULL, 0); if (res != SHISHI_OK) return res; i = 1; while (sname[i - 1]) { res = shishi_asn1_write (handle, enckdcreppart, "sname.name-string", "NEW", 1); if (res != SHISHI_OK) return res; asprintf (&buf, "sname.name-string.?%d", i); res = shishi_asn1_write (handle, enckdcreppart, buf, sname[i - 1], 0); free (buf); if (res != SHISHI_OK) return res; i++; } return SHISHI_OK; } int shishi_enckdcreppart_server_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *server) { char *tmpserver; char **serverbuf; char *tokptr = NULL; int res; int i; tmpserver = xstrdup (server); serverbuf = xmalloc (sizeof (*serverbuf)); for (i = 0; (serverbuf[i] = strtok_r (i == 0 ? tmpserver : NULL, "/", &tokptr)); i++) { serverbuf = xrealloc (serverbuf, (i + 2) * sizeof (*serverbuf)); } res = shishi_enckdcreppart_sname_set (handle, enckdcreppart, SHISHI_NT_PRINCIPAL, serverbuf); if (res != SHISHI_OK) return res; free (serverbuf); free (tmpserver); return SHISHI_OK; } int shishi_enckdcreppart_srealmserver_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *srealm, const char *server) { int res; res = shishi_enckdcreppart_srealm_set (handle, enckdcreppart, srealm); if (res != SHISHI_OK) return res; res = shishi_enckdcreppart_server_set (handle, enckdcreppart, server); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_enckdcreppart_populate_encticketpart: * @handle: shishi handle as allocated by shishi_init(). * @enckdcreppart: input EncKDCRepPart variable. * @encticketpart: input EncTicketPart variable. * * Set the flags, authtime, starttime, endtime, renew-till and caddr * fields of the EncKDCRepPart to the corresponding values in the * EncTicketPart. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_enckdcreppart_populate_encticketpart (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_asn1 encticketpart) { char *buf; size_t buflen; int res; res = shishi_asn1_read (handle, encticketpart, "flags", &buf, &buflen); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_write (handle, enckdcreppart, "flags", buf, buflen); free (buf); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, encticketpart, "authtime", &buf, &buflen); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_write (handle, enckdcreppart, "authtime", buf, buflen); free (buf); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, encticketpart, "starttime", &buf, &buflen); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) return SHISHI_ASN1_ERROR; if (res == SHISHI_ASN1_NO_ELEMENT) res = shishi_asn1_write (handle, enckdcreppart, "starttime", NULL, 0); else { res = shishi_asn1_write (handle, enckdcreppart, "starttime", buf, buflen); free (buf); } if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, encticketpart, "endtime", &buf, &buflen); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_write (handle, enckdcreppart, "endtime", buf, buflen); free (buf); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; res = shishi_asn1_read (handle, encticketpart, "renew-till", &buf, &buflen); if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT) return SHISHI_ASN1_ERROR; if (res == SHISHI_ASN1_NO_ELEMENT) res = shishi_asn1_write (handle, enckdcreppart, "renew-till", NULL, 0); else { res = shishi_asn1_write (handle, enckdcreppart, "renew-till", buf, buflen); free (buf); } if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; /* XXX copy caddr too */ return SHISHI_OK; } shishi-1.0.2/lib/cfg.h0000664000000000000000000000214712126660507011361 00000000000000/* cfg.h --- Configuration file prototypes. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ extern struct Shishi_realminfo *_shishi_realminfo (Shishi * handle, const char *realm); extern struct Shishi_realminfo *_shishi_realminfo_new (Shishi * handle, char *realm); extern const char *_shishi_transport2string (int transport); shishi-1.0.2/lib/resolv.c0000644000000000000000000001474212126665126012133 00000000000000/* resolv.c --- Resolver glue. * Copyright (C) 2003-2013 Simon Josefsson * Copyright (C) 2002 Jeremie Miller, Thomas Muldowney, * Ryan Eatmon, Robert Norris * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* This file is based on resolver.h from jabberd - Jabber Open Source * Server, licensed under GPL. See: * * http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/resolver/ */ #include "internal.h" #ifdef HAVE_RES_QUERY #include # ifdef HAVE_ARPA_NAMESER_H # include # endif # ifdef HAVE_RESOLV_H # include # endif /* the largest packet we'll send and receive */ #if PACKETSZ > 1024 # define MAX_PACKET PACKETSZ #else # define MAX_PACKET (1024) #endif typedef union { HEADER hdr; unsigned char buf[MAX_PACKET]; } dns_packet_t; static void * txt_rr (dns_packet_t packet, unsigned char *eom, unsigned char **scan) { size_t len = (size_t) ** scan; char *p; p = xmalloc (len + 1); memcpy (p, *scan + 1, len); p[len] = '\0'; *scan += (unsigned char) (len + 1); return p; } static void * srv_rr (dns_packet_t packet, unsigned char *eom, unsigned char **scan) { unsigned int priority, weight, port; int len; char host[256]; Shishi_dns_srv srv; GETSHORT (priority, *scan); GETSHORT (weight, *scan); GETSHORT (port, *scan); len = dn_expand (packet.buf, eom, *scan, host, 256); if (len < 0) return NULL; *scan = (unsigned char *) (*scan + len); srv = xmalloc (sizeof (*srv)); srv->priority = priority; srv->weight = weight; srv->port = port; strcpy (srv->name, host); return (void *) srv; } /* compare two srv structures, order by priority then by randomised weight */ static int srv_compare (const void *a, const void *b) { Shishi_dns_srv aa, bb; if (a == NULL) return 1; if (b == NULL) return -1; aa = (*((Shishi_dns *) a))->rr; bb = (*((Shishi_dns *) b))->rr; if (aa->priority > bb->priority) return 1; if (aa->priority < bb->priority) return -1; if (aa->weight > bb->weight) return -1; if (aa->weight < bb->weight) return 1; return 0; } /** * shishi_resolv: * @zone: owner name of data, e.g. "EXAMPLE.ORG" * @querytype: type of data to query for, e.g., SHISHI_DNS_TXT. * * Query DNS resolver for data of type @querytype at owner name @zone. * Currently TXT and SRV types are supported. * * Return value: Returns linked list of DNS records, or NULL if query * failed. **/ Shishi_dns shishi_resolv (const char *zone, uint16_t querytype) { char host[256]; dns_packet_t packet; int len, qdcount, ancount, an, n; unsigned char *eom, *scan; Shishi_dns *reply, first; uint16_t type, class, ttl; if (zone == NULL || *zone == '\0') return NULL; switch (querytype) { case SHISHI_DNS_TXT: case SHISHI_DNS_SRV: break; default: return NULL; } /* do the actual query */ if ((len = res_query (zone, C_IN, querytype, packet.buf, MAX_PACKET)) < 0 || len < (int) sizeof (HEADER)) return NULL; /* we got a valid result, containing two types of records - packet * and answer .. we have to skip over the packet records */ /* no. of packets, no. of answers */ qdcount = ntohs (packet.hdr.qdcount); ancount = ntohs (packet.hdr.ancount); /* end of the returned message */ eom = (unsigned char *) (packet.buf + len); /* our current location */ scan = (unsigned char *) (packet.buf + sizeof (HEADER)); /* skip over the packet records */ while (qdcount > 0 && scan < eom) { qdcount--; if ((len = dn_expand (packet.buf, eom, scan, host, 256)) < 0) return NULL; scan = (unsigned char *) (scan + len + QFIXEDSZ); } /* create an array to store the replies in */ reply = xcalloc (ancount, sizeof (Shishi_dns)); an = 0; /* loop through the answer buffer and extract SRV records */ while (ancount > 0 && scan < eom) { ancount--; len = dn_expand (packet.buf, eom, scan, host, 256); if (len < 0) { for (n = 0; n < an; n++) free (reply[n]); free (reply); return NULL; } scan += len; /* extract the various parts of the record */ GETSHORT (type, scan); GETSHORT (class, scan); GETLONG (ttl, scan); GETSHORT (len, scan); /* skip records we're not interested in */ if (type != querytype) { scan = (unsigned char *) (scan + len); continue; } /* create a new reply structure to save it in */ reply[an] = xmalloc (sizeof (*reply[0])); reply[an]->type = type; reply[an]->class = class; reply[an]->ttl = ttl; reply[an]->next = NULL; /* type-specific processing */ switch (type) { case SHISHI_DNS_TXT: reply[an]->rr = txt_rr (packet, eom, &scan); break; case SHISHI_DNS_SRV: reply[an]->rr = srv_rr (packet, eom, &scan); break; default: scan = (unsigned char *) (scan + len); continue; } /* fell short, we're done */ if (reply[an]->rr == NULL) { free (reply[an]); reply[an] = NULL; break; } /* on to the next one */ an++; } /* sort srv records them */ if (querytype == SHISHI_DNS_SRV) qsort (reply, an, sizeof (Shishi_dns), srv_compare); /* build a linked list out of the array elements */ for (n = 0; n < an - 1; n++) reply[n]->next = reply[n + 1]; first = reply[0]; free (reply); return first; } #else /* !HAVE_RES_QUERY */ Shishi_dns shishi_resolv (const char *zone, uint16_t querytype) { return NULL; } #endif /** * shishi_resolv_free: * @rrs: list of DNS RR as returned by shishi_resolv(). * * Deallocate list of DNS RR as returned by shishi_resolv(). **/ void shishi_resolv_free (Shishi_dns rrs) { Shishi_dns next; while (rrs != NULL) { next = rrs->next; free (rrs->rr); free (rrs); rrs = next; } } shishi-1.0.2/lib/ccache.c0000664000000000000000000003461212126660507012025 00000000000000/* ccache.c --- Read MIT style Kerberos Credential Cache file. * Copyright (C) 2006-2013 Simon Josefsson * * This file 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 file 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 file; if not, see http://www.gnu.org/licenses or * write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA * */ #include "ccache.h" #include /* See ccache.txt for a description of the file format. Currently this implementation do not support addresses nor auth-data. */ static int get_uint8 (const char **data, size_t * len, uint8_t * i) { const char *p = *data; if (*len < 1) return -1; *i = p[0]; *data += 1; *len -= 1; return 0; } static int get_uint16 (const char **data, size_t * len, uint16_t * i) { const char *p = *data; if (*len < 2) return -1; *i = p[0] << 8 | p[1]; *data += 2; *len -= 2; return 0; } static int get_uint32 (const char **data, size_t * len, uint32_t * i) { const char *p = *data; if (*len < 4) return -1; *i = ((p[0] << 24) & 0xFF000000) | ((p[1] << 16) & 0xFF0000) | ((p[2] << 8) & 0xFF00) | (p[3] & 0xFF); *data += 4; *len -= 4; return 0; } static int get_uint32_swapped (const char **data, size_t * len, uint32_t * i) { const char *p = *data; if (*len < 4) return -1; *i = ((p[3] << 24) & 0xFF000000) | ((p[2] << 16) & 0xFF0000) | ((p[1] << 8) & 0xFF00) | (p[0] & 0xFF); *data += 4; *len -= 4; return 0; } static int put_uint8 (uint8_t i, char **data, size_t * len) { if (*len < 1) return -1; *(*data)++ = i; *len -= 1; return 0; } static int put_uint16 (uint16_t i, char **data, size_t * len) { if (*len < 2) return -1; *(*data)++ = (i >> 8) & 0xFF; *(*data)++ = i; *len -= 2; return 0; } static int put_uint32 (uint32_t i, char **data, size_t * len) { if (*len < 4) return -1; *(*data)++ = (i >> 24) & 0xFF; *(*data)++ = (i >> 16) & 0xFF; *(*data)++ = (i >> 8) & 0xFF; *(*data)++ = i; *len -= 4; return 0; } static int put_uint32_swapped (uint32_t i, char **data, size_t * len) { if (*len < 4) return -1; *(*data)++ = i; *(*data)++ = (i >> 8) & 0xFF; *(*data)++ = (i >> 16) & 0xFF; *(*data)++ = (i >> 24) & 0xFF; *len -= 4; return 0; } static int parse_principal (const char **data, size_t * len, struct ccache_principal *out) { size_t n; int rc; rc = get_uint32 (data, len, &out->name_type); if (rc < 0) return rc; rc = get_uint32 (data, len, &out->num_components); if (rc < 0) return rc; if (out->num_components >= CCACHE_MAX_COMPONENTS) return -1; rc = get_uint32 (data, len, &out->realm.length); if (rc < 0) return rc; if (*len < out->realm.length) return -1; out->realm.data = (char *) *data; *data += out->realm.length; *len -= out->realm.length; /* Make sure realm will be zero terminated. This limits component lengths to 2^24 bytes. */ if (**(char **) data != '\0') return -1; for (n = 0; n < out->num_components; n++) { rc = get_uint32 (data, len, &out->components[n].length); if (rc < 0) return rc; if (*len < out->components[n].length) return -1; out->components[n].data = (char *) *data; *data += out->components[n].length; *len -= out->components[n].length; /* Make sure component is zero terminated. This limits the length of the next component to 2^24 bytes. Note that you'll have to test after the last component elsewhere. */ if (*len > 0 && **(char **) data != '\0') return -1; } return 0; } static int skip_address (const char **data, size_t * len) { uint16_t addrtype; uint32_t addrlen; int rc; rc = get_uint16 (data, len, &addrtype); if (rc < 0) return rc; rc = get_uint32 (data, len, &addrlen); if (rc < 0) return rc; if (*len < addrlen) return -1; *data += addrlen; *len -= addrlen; return 0; } static int skip_authdata (const char **data, size_t * len) { uint16_t authdatatype; uint32_t authdatalen; int rc; rc = get_uint16 (data, len, &authdatatype); if (rc < 0) return rc; rc = get_uint32 (data, len, &authdatalen); if (rc < 0) return rc; if (*len < authdatalen) return -1; *data += authdatalen; *len -= authdatalen; return 0; } static int parse_credential (const char **data, size_t * len, struct ccache_credential *out) { uint32_t num_address; uint32_t num_authdata; int rc; rc = parse_principal (data, len, &out->client); if (rc < 0) return rc; /* Make sure the last component is zero terminated. This limits the next name-type to 2^24 bytes. */ if (*len > 0 && **(char **) data != '\0') return -1; rc = parse_principal (data, len, &out->server); if (rc < 0) return rc; /* Make sure the last component is zero terminated. This limits the next key-type to lower 1 byte. */ if (*len > 0 && **(char **) data != '\0') return -1; rc = get_uint16 (data, len, &out->key.keytype); if (rc < 0) return rc; rc = get_uint16 (data, len, &out->key.etype); if (rc < 0) return rc; rc = get_uint16 (data, len, &out->key.keylen); if (rc < 0) return rc; if (*len < out->key.keylen) return -1; out->key.keyvalue = (char *) *data; *data += out->key.keylen; *len -= out->key.keylen; rc = get_uint32 (data, len, &out->authtime); if (rc < 0) return rc; rc = get_uint32 (data, len, &out->starttime); if (rc < 0) return rc; rc = get_uint32 (data, len, &out->endtime); if (rc < 0) return rc; rc = get_uint32 (data, len, &out->renew_till); if (rc < 0) return rc; rc = get_uint8 (data, len, &out->is_skey); if (rc < 0) return rc; rc = get_uint32_swapped (data, len, &out->tktflags); if (rc < 0) return rc; rc = get_uint32 (data, len, &num_address); if (rc < 0) return rc; for (; num_address; num_address--) { /* XXX Don't just skip data. */ rc = skip_address (data, len); if (rc < 0) return rc; } rc = get_uint32 (data, len, &num_authdata); if (rc < 0) return rc; for (; num_authdata; num_authdata--) { /* XXX Don't just skip data. */ rc = skip_authdata (data, len); if (rc < 0) return rc; } rc = get_uint32 (data, len, &out->ticket.length); if (rc < 0) return rc; if (*len < out->ticket.length) return -1; out->ticket.data = (char *) *data; *data += out->ticket.length; *len -= out->ticket.length; rc = get_uint32 (data, len, &out->second_ticket.length); if (rc < 0) return rc; if (*len < out->second_ticket.length) return -1; out->second_ticket.data = (char *) *data; *data += out->second_ticket.length; *len -= out->second_ticket.length; return 0; } int ccache_parse (const char *data, size_t len, struct ccache *out) { int rc; rc = get_uint16 (&data, &len, &out->file_format_version); if (rc < 0) return rc; rc = get_uint16 (&data, &len, &out->headerlen); if (rc < 0) return rc; if (len < out->headerlen) return -1; out->header = (char *) data; data += out->headerlen; len -= out->headerlen; rc = parse_principal (&data, &len, &out->default_principal); if (rc < 0) return rc; out->credentials = (char *) data; out->credentialslen = len; return 0; } int ccache_parse_credential (const char *data, size_t len, struct ccache_credential *out, size_t * n) { size_t savelen = len; int rc = parse_credential (&data, &len, out); if (rc < 0) return rc; *n = savelen - len; return 0; } static int pack_principal (struct ccache_principal *princ, char **out, size_t * len) { size_t n; int rc; rc = put_uint32 (princ->name_type, out, len); if (rc < 0) return rc; rc = put_uint32 (princ->num_components, out, len); if (rc < 0) return rc; if (princ->num_components >= CCACHE_MAX_COMPONENTS) return -1; rc = put_uint32 (princ->realm.length, out, len); if (rc < 0) return rc; if (*len < princ->realm.length) return -1; memcpy (*out, princ->realm.data, princ->realm.length); *out += princ->realm.length; *len -= princ->realm.length; for (n = 0; n < princ->num_components; n++) { rc = put_uint32 (princ->components[n].length, out, len); if (rc < 0) return rc; if (*len < princ->components[n].length) return -1; memcpy (*out, princ->components[n].data, princ->components[n].length); *out += princ->components[n].length; *len -= princ->components[n].length; } return 0; } static int pack_credential (struct ccache_credential *cred, char **out, size_t * len) { int rc; rc = pack_principal (&cred->client, out, len); if (rc < 0) return rc; rc = pack_principal (&cred->server, out, len); if (rc < 0) return rc; rc = put_uint16 (cred->key.keytype, out, len); if (rc < 0) return rc; rc = put_uint16 (cred->key.etype, out, len); if (rc < 0) return rc; rc = put_uint16 (cred->key.keylen, out, len); if (rc < 0) return rc; if (*len < cred->key.keylen) return -1; memcpy (*out, cred->key.keyvalue, cred->key.keylen); *out += cred->key.keylen; *len -= cred->key.keylen; rc = put_uint32 (cred->authtime, out, len); if (rc < 0) return rc; rc = put_uint32 (cred->starttime, out, len); if (rc < 0) return rc; rc = put_uint32 (cred->endtime, out, len); if (rc < 0) return rc; rc = put_uint32 (cred->renew_till, out, len); if (rc < 0) return rc; rc = put_uint8 (0, out, len); if (rc < 0) return rc; rc = put_uint32_swapped (cred->tktflags, out, len); if (rc < 0) return rc; /* XXX Write addresses. */ rc = put_uint32 (0, out, len); if (rc < 0) return rc; /* XXX Write auth-data. */ rc = put_uint32 (0, out, len); if (rc < 0) return rc; rc = put_uint32 (cred->ticket.length, out, len); if (rc < 0) return rc; if (*len < cred->ticket.length) return -1; memcpy (*out, cred->ticket.data, cred->ticket.length); *out += cred->ticket.length; *len -= cred->ticket.length; rc = put_uint32 (cred->second_ticket.length, out, len); if (rc < 0) return rc; if (*len < cred->second_ticket.length) return -1; memcpy (*out, cred->second_ticket.data, cred->second_ticket.length); *out += cred->second_ticket.length; *len -= cred->second_ticket.length; return 0; } int ccache_pack_credential (struct ccache_credential *cred, char *out, size_t * len) { size_t savelen = *len; int rc = pack_credential (cred, &out, len); if (rc < 0) return rc; *len = savelen - *len; return 0; } int ccache_pack (struct ccache *info, char *data, size_t * len) { size_t savelen = *len; int rc; rc = put_uint16 (info->file_format_version ? info->file_format_version : 0x0504, &data, len); if (rc < 0) return rc; rc = put_uint16 (info->headerlen, &data, len); if (rc < 0) return rc; if (*len < info->headerlen) return -1; memcpy (data, info->header, info->headerlen); data += info->headerlen; *len -= info->headerlen; rc = pack_principal (&info->default_principal, &data, len); if (rc < 0) return rc; *len = savelen - *len; return 0; } void ccache_print (struct ccache *ccache) { printf ("file_format_version %04x\n", ccache->file_format_version); printf ("headerlen %04x\n", ccache->headerlen); printf ("default_principal\n"); ccache_print_principal (&ccache->default_principal); } void ccache_print_principal (struct ccache_principal *princ) { size_t n; printf ("\tname_type %04x\n", princ->name_type); printf ("\tnum_components %04x\n", princ->num_components); printf ("\trealmlen %04x\n", princ->realm.length); printf ("\trealm %.*s\n", princ->realm.length, princ->realm.data); for (n = 0; n < princ->num_components; n++) { printf ("\t\tcomponentlen %04x\n", princ->components[n].length); printf ("\t\tcomponent %.*s\n", princ->components[n].length, princ->components[n].data); } } void ccache_print_credential (struct ccache_credential *cred) { size_t i; printf ("\tclient:\n"); ccache_print_principal (&cred->client); printf ("\tserver:\n"); ccache_print_principal (&cred->server); printf ("\tkey:\n"); printf ("\t\tkeytype %04x\n", cred->key.keytype); printf ("\t\tetype %04x\n", cred->key.etype); printf ("\t\tkeylen %04x\n", cred->key.keylen); printf ("\t\tkey value: "); for (i = 0; i < cred->key.keylen; i++) printf ("%02x", ((char *) cred->key.keyvalue)[i] & 0xFF); printf ("\n"); printf ("\ttimes:\n"); printf ("\t\tauthtime %04x\n", cred->authtime); printf ("\t\tstarttime %04x\n", cred->starttime); printf ("\t\tendtime %04x\n", cred->endtime); printf ("\t\trenew_till %04x\n", cred->renew_till); printf ("\tis_skey %04x\n", cred->is_skey); printf ("\ttktflags %04x\n", cred->tktflags); printf ("\tticketlen %04x\n", cred->ticket.length); printf ("\tsecond_ticketlen %04x\n", cred->second_ticket.length); } #ifdef TEST int main (int argc, char *argv[]) { char buf[10240]; size_t len; FILE *fh; int rc; struct ccache ccache; struct ccache_credential cred; size_t i = 0; if (argc <= 1) { printf ("Usage: %s \n", argv[0]); return 1; } fh = fopen (argv[1], "rb"); if (!fh) { puts ("Error: cannot open file"); return 1; } len = fread (buf, 1, sizeof (buf), fh); if (len >= sizeof (buf)) { puts ("Error: file too large"); return 1; } rc = ccache_parse (buf, len, &ccache); if (rc < 0) { puts ("Error: syntax error"); return 1; } ccache_print (&ccache); while (ccache.credentialslen) { size_t n; rc = ccache_parse_credential (ccache.credentials, ccache.credentialslen, &cred, &n); if (rc < 0) { printf ("Error: cannot parse credential %d\n", i); return rc; } printf ("\nCredential %d:\n", i++); ccache_print_credential (&cred); ccache.credentials += n; ccache.credentialslen -= n; } if (fclose (fh)) { puts ("Error: cannot close file"); return 1; } return 0; } #endif shishi-1.0.2/lib/crypto.c0000664000000000000000000016352112126660507012141 00000000000000/* crypto.c --- Crypto functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "crypto.h" /* Get _shishi_escapeprint, etc. */ #include "utils.h" static int gcd (int a, int b) { if (b == 0) return a; else return gcd (b, a % b); } static int lcm (int a, int b) { return a * b / gcd (a, b); } static void rot13 (Shishi * handle, char *in, char *out, int len) { if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; rot 13 in:\n"); _shishi_escapeprint (in, len); _shishi_hexprint (in, len); _shishi_binprint (in, len); } if (len == 1) { out[0] = ((in[0] >> 5) & 0x01) | ((in[0] >> 5) & 0x02) | ((in[0] >> 5) & 0x04) | ((in[0] << 3) & 0x08) | ((in[0] << 3) & 0x10) | ((in[0] << 3) & 0x20) | ((in[0] << 3) & 0x40) | ((in[0] << 3) & 0x80); } else if (len > 1) { char nexttolast, last; int i; nexttolast = in[len - 2]; last = in[len - 1]; for (i = len * 8 - 1; i >= 13; i--) { int pos = i / 8; char mask = ~(1 << (7 - i % 8)); int pos2 = (i - 13) / 8; char mask2 = (1 << (7 - (i - 13) % 8)); out[pos] = (out[pos] & mask) | (((in[pos2] & mask2) ? 0xFF : 0x00) & ~mask); } out[0] = ((nexttolast & 0xFF) << 3) | ((last & 0xFF) >> 5); out[1] = (in[1] & ~(0xFF & (0xFF << 3))) | (0xFF & (last << 3)); } if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; rot13 out:\n"); _shishi_escapeprint (out, len); _shishi_hexprint (out, len); _shishi_binprint (out, len); } } static void ocadd (char *add1, char *add2, char *sum, int len) { int i; int carry = 0; for (i = len - 1; i >= 0; i--) { int tmpsum = (unsigned char) add1[i] + (unsigned char) add2[i]; sum[i] = (tmpsum + carry) & 0xFF; if (tmpsum + carry > 0xFF) carry = 1; else carry = 0; } if (carry) { int done = 0; for (i = len - 1; i >= 0; i--) if ((unsigned char) sum[i] != 0xFF) { sum[i]++; done = 1; break; } if (!done) memset (sum, 0, len); } } static int simplified_hmac (Shishi * handle, Shishi_key * key, const char *in, size_t inlen, char **outhash, size_t * outhashlen) { *outhashlen = shishi_checksum_cksumlen (shishi_cipher_defaultcksumtype (shishi_key_type (key))); return shishi_hmac_sha1 (handle, shishi_key_value (key), shishi_key_length (key), in, inlen, outhash); } static int simplified_hmac_verify (Shishi * handle, Shishi_key * key, const char *in, size_t inlen, const char *hmac, size_t hmaclen) { char *hash; size_t hlen; int same; int res; res = simplified_hmac (handle, key, in, inlen, &hash, &hlen); if (res != SHISHI_OK || hash == NULL) return res; if (VERBOSECRYPTO (handle)) { printf ("\t ;; HMAC verify:\n"); _shishi_escapeprint (hash, hlen); _shishi_hexprint (hash, hlen); _shishi_binprint (hash, hlen); _shishi_escapeprint (hmac, hmaclen); _shishi_hexprint (hmac, hmaclen); _shishi_binprint (hmac, hmaclen); } same = (hlen == hmaclen) && memcmp (hash, hmac, hmaclen) == 0; free (hash); if (!same) { shishi_error_printf (handle, "HMAC verify failed"); return SHISHI_CRYPTO_ERROR; } return SHISHI_OK; } int _shishi_simplified_derivekey (Shishi * handle, Shishi_key * key, int keyusage, int derivekeymode, Shishi_key ** outkey) { char prfconstant[5]; int res = SHISHI_OK; Shishi_key *derivedkey; if (VERBOSECRYPTO (handle)) { printf ("simplified_derivekey\n"); printf ("\t ;; mode %d (%s)\n", derivekeymode, derivekeymode == SHISHI_DERIVEKEYMODE_CHECKSUM ? "checksum" : derivekeymode == SHISHI_DERIVEKEYMODE_INTEGRITY ? "integrity" : derivekeymode == SHISHI_DERIVEKEYMODE_PRIVACY ? "privacy" : "base-key"); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); } res = shishi_key_from_value (handle, shishi_key_type (key), NULL, &derivedkey); if (res != SHISHI_OK) return res; *outkey = derivedkey; if (keyusage) { uint32_t tmp = htonl (keyusage); memcpy (prfconstant, &tmp, 4); if (derivekeymode == SHISHI_DERIVEKEYMODE_CHECKSUM) prfconstant[4] = '\x99'; else if (derivekeymode == SHISHI_DERIVEKEYMODE_INTEGRITY) prfconstant[4] = '\x55'; else /* if (derivekeymode == SHISHI_DERIVEKEYMODE_PRIVACY) */ prfconstant[4] = '\xAA'; res = shishi_dk (handle, key, prfconstant, 5, derivedkey); } else { shishi_key_copy (derivedkey, key); } if (VERBOSECRYPTO (handle)) { printf ("\t ;; simplified_derivekey out (%d):\n", shishi_key_length (derivedkey)); _shishi_hexprint (shishi_key_value (derivedkey), shishi_key_length (derivedkey)); } return res; } int _shishi_simplified_dencrypt (Shishi * handle, Shishi_key * key, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen, int decryptp) { int rc; char *pt; size_t ptlen; size_t padzerolen = 0; if ((inlen % 8) != 0) while (((inlen + padzerolen) % 8) != 0) padzerolen++; ptlen = inlen + padzerolen; if (padzerolen) { pt = xmalloc (ptlen); memcpy (pt, in, inlen); memset (pt + inlen, 0, padzerolen); } else pt = (char *) in; switch (shishi_key_type (key)) { case SHISHI_DES_CBC_CRC: case SHISHI_DES_CBC_MD4: case SHISHI_DES_CBC_MD5: case SHISHI_DES_CBC_NONE: rc = shishi_des (handle, decryptp, shishi_key_value (key), iv, ivout, pt, ptlen, out); if (ivoutlen) *ivoutlen = 8; if (outlen) *outlen = ptlen; break; case SHISHI_DES3_CBC_HMAC_SHA1_KD: case SHISHI_DES3_CBC_NONE: rc = shishi_3des (handle, decryptp, shishi_key_value (key), iv, ivout, pt, inlen + padzerolen, out); if (ivoutlen) *ivoutlen = 8; if (outlen) *outlen = ptlen; break; case SHISHI_AES128_CTS_HMAC_SHA1_96: case SHISHI_AES256_CTS_HMAC_SHA1_96: rc = shishi_aes_cts (handle, decryptp, shishi_key_value (key), shishi_key_length (key), iv, ivout, in, inlen, out); if (ivoutlen) *ivoutlen = 16; if (outlen) *outlen = inlen; break; default: rc = SHISHI_CRYPTO_ERROR; } if (padzerolen) free (pt); return rc; } int _shishi_simplified_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { int res; int padzerolen = 0; if ((shishi_key_type (key) == SHISHI_DES3_CBC_HMAC_SHA1_KD || shishi_key_type (key) == SHISHI_DES_CBC_CRC || shishi_key_type (key) == SHISHI_DES_CBC_MD4 || shishi_key_type (key) == SHISHI_DES_CBC_MD5) && (inlen % 8) != 0) while (((inlen + padzerolen) % 8) != 0) padzerolen++; if (keyusage != 0) { char *pt = NULL, *ct = NULL, *hmac = NULL; int blen = shishi_cipher_blocksize (shishi_key_type (key)); size_t ctlen, ptlen, hmaclen; Shishi_key *privacykey = NULL, *integritykey = NULL; ptlen = inlen + blen + padzerolen; pt = xmalloc (ptlen); res = shishi_randomize (handle, 0, pt, blen); if (res != SHISHI_OK) goto done; memcpy (pt + blen, in, inlen); memset (pt + blen + inlen, 0, padzerolen); res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_PRIVACY, &privacykey); if (res != SHISHI_OK) goto done; res = _shishi_simplified_dencrypt (handle, privacykey, iv, ivlen, ivout, ivoutlen, pt, ptlen, &ct, &ctlen, 0); if (res != SHISHI_OK) goto done; res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_INTEGRITY, &integritykey); if (res != SHISHI_OK) goto done; res = simplified_hmac (handle, integritykey, pt, ptlen, &hmac, &hmaclen); if (res != SHISHI_OK) goto done; *outlen = ctlen + hmaclen; *out = xmalloc (*outlen); memcpy (*out, ct, ctlen); memcpy (*out + ctlen, hmac, hmaclen); done: if (privacykey) shishi_key_done (privacykey); if (integritykey) shishi_key_done (integritykey); free (hmac); free (ct); free (pt); } else { res = _shishi_simplified_dencrypt (handle, key, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, 0); } return res; } int _shishi_simplified_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { int res; if (keyusage) { Shishi_key *privacykey = NULL, *integritykey = NULL; int blen = shishi_cipher_blocksize (shishi_key_type (key)); size_t hlen = shishi_checksum_cksumlen (shishi_cipher_defaultcksumtype (shishi_key_type (key))); res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_PRIVACY, &privacykey); if (res != SHISHI_OK) goto done; res = _shishi_simplified_dencrypt (handle, privacykey, iv, ivlen, ivout, ivoutlen, in, inlen - hlen, out, outlen, 1); if (res != SHISHI_OK) goto done; res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_INTEGRITY, &integritykey); if (res != SHISHI_OK) goto done; res = simplified_hmac_verify (handle, integritykey, *out, *outlen, in + inlen - hlen, hlen); if (res != SHISHI_OK) goto done; memmove (*out, *out + blen, *outlen - blen); *outlen = *outlen - blen; *out = xrealloc (*out, *outlen); done: if (privacykey) shishi_key_done (privacykey); if (integritykey) shishi_key_done (integritykey); } else { res = _shishi_simplified_dencrypt (handle, key, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen, 1); } return res; } int _shishi_simplified_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { Shishi_key *checksumkey; int cksumlen = shishi_checksum_cksumlen (cksumtype); int res; res = _shishi_simplified_derivekey (handle, key, keyusage, SHISHI_DERIVEKEYMODE_CHECKSUM, &checksumkey); if (res != SHISHI_OK) return res; res = simplified_hmac (handle, checksumkey, in, inlen, out, outlen); shishi_key_done (checksumkey); if (res != SHISHI_OK) return res; *outlen = cksumlen; return SHISHI_OK; } static cipherinfo *ciphers[] = { #if WITH_NULL &null_info, #endif #if WITH_DES &des_cbc_crc_info, &des_cbc_md4_info, &des_cbc_md5_info, &des_cbc_none_info, #endif #if WITH_3DES &des3_cbc_none_info, &des3_cbc_sha1_kd_info, #endif #if WITH_AES &aes128_cts_hmac_sha1_96_info, &aes256_cts_hmac_sha1_96_info, #endif #if WITH_ARCFOUR &arcfour_hmac_info, &arcfour_hmac_exp_info #endif }; /** * shishi_cipher_supported_p: * @type: encryption type, see Shishi_etype. * * Find out if cipher is supported. * * Return value: Return 0 iff cipher is unsupported. **/ int shishi_cipher_supported_p (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return 1; return 0; } /** * shishi_cipher_name: * @type: encryption type, see Shishi_etype. * * Read humanly readable string for cipher. * * Return value: Return name of encryption type, * e.g. "des3-cbc-sha1-kd", as defined in the standards. **/ const char * shishi_cipher_name (int32_t type) { size_t i; char *p; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) { if (type == ciphers[i]->type) return ciphers[i]->name; } asprintf (&p, "unknown cipher %d", type); return p; } /** * shishi_cipher_blocksize: * @type: encryption type, see Shishi_etype. * * Get block size for cipher. * * Return value: Return block size for encryption type, as defined in * the standards. **/ int shishi_cipher_blocksize (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->blocksize; return -1; } /** * shishi_cipher_confoundersize: * @type: encryption type, see Shishi_etype. * * Get length of confounder for cipher. * * Return value: Returns the size of the confounder (random data) for * encryption type, as defined in the standards, or (size_t)-1 on * error (e.g., unsupported encryption type). **/ int shishi_cipher_confoundersize (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->confoundersize; return -1; } /** * shishi_cipher_keylen: * @type: encryption type, see Shishi_etype. * * Get key length for cipher. * * Return value: Return length of key used for the encryption type, as * defined in the standards. **/ size_t shishi_cipher_keylen (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->keylen; return -1; } /** * shishi_cipher_randomlen: * @type: encryption type, see Shishi_etype. * * Get length of random data for cipher. * * Return value: Return length of random used for the encryption type, * as defined in the standards, or (size_t)-1 on error (e.g., * unsupported encryption type). **/ size_t shishi_cipher_randomlen (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->randomlen; return -1; } /** * shishi_cipher_defaultcksumtype: * @type: encryption type, see Shishi_etype. * * Get the default checksum associated with cipher. * * Return value: Return associated checksum mechanism for the * encryption type, as defined in the standards. **/ int shishi_cipher_defaultcksumtype (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->defaultcksumtype; return -1; } struct Cipher_aliases { const char *name; int type; }; static struct Cipher_aliases cipher_aliases[] = { {"des-crc", SHISHI_DES_CBC_CRC}, {"des-md4", SHISHI_DES_CBC_MD4}, {"des-md5", SHISHI_DES_CBC_MD5}, {"des", SHISHI_DES_CBC_MD5}, {"des3", SHISHI_DES3_CBC_HMAC_SHA1_KD}, {"3des", SHISHI_DES3_CBC_HMAC_SHA1_KD}, {"aes128", SHISHI_AES128_CTS_HMAC_SHA1_96}, {"aes256", SHISHI_AES256_CTS_HMAC_SHA1_96}, {"aes", SHISHI_AES256_CTS_HMAC_SHA1_96}, {"arcfour", SHISHI_ARCFOUR_HMAC} }; /** * shishi_cipher_parse: * @cipher: name of encryption type, e.g. "des3-cbc-sha1-kd". * * Get cipher number by parsing string. * * Return value: Return encryption type corresponding to a string. **/ int shishi_cipher_parse (const char *cipher) { size_t i; char *endptr; i = strtol (cipher, &endptr, 0); if (*cipher && *endptr == '\0') return i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (strcasecmp (cipher, ciphers[i]->name) == 0) return ciphers[i]->type; for (i = 0; i < sizeof (cipher_aliases) / sizeof (cipher_aliases[0]); i++) if (strcasecmp (cipher, cipher_aliases[i].name) == 0) return cipher_aliases[i].type; return -1; } static Shishi_random_to_key_function _shishi_cipher_random_to_key (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->random2key; return NULL; } static Shishi_string_to_key_function _shishi_cipher_string_to_key (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->string2key; return NULL; } static Shishi_encrypt_function _shishi_cipher_encrypt (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->encrypt; return NULL; } static Shishi_decrypt_function _shishi_cipher_decrypt (int32_t type) { size_t i; for (i = 0; i < sizeof (ciphers) / sizeof (ciphers[0]); i++) if (type == ciphers[i]->type) return ciphers[i]->decrypt; return NULL; } static checksuminfo *checksums[] = { #if WITH_DES &crc32_info, #endif #if WITH_MD &md4_info, #endif #if WITH_DES &md4_des_info, #endif #if WITH_MD &md5_info, #endif #if WITH_DES &md5_des_info, &md5_gss_info, #endif #if WITH_3DES &hmac_sha1_des3_kd_info, #endif #if WITH_AES &hmac_sha1_96_aes128_info, &hmac_sha1_96_aes256_info, #endif #if WITH_ARCFOUR &arcfour_hmac_md5_info #endif }; /** * shishi_checksum_supported_p: * @type: checksum type, see Shishi_cksumtype. * * Find out whether checksum is supported. * * Return value: Return 0 iff checksum is unsupported. **/ int shishi_checksum_supported_p (int32_t type) { size_t i; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) if (type == checksums[i]->type) return 1; return 0; } /** * shishi_checksum_name: * @type: checksum type, see Shishi_cksumtype. * * Get name of checksum. * * Return value: Return name of checksum type, * e.g. "hmac-sha1-96-aes256", as defined in the standards. **/ const char * shishi_checksum_name (int32_t type) { size_t i; char *p; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) { if (type == checksums[i]->type) return checksums[i]->name; } asprintf (&p, "unknown checksum %d", type); return p; } /** * shishi_checksum_cksumlen: * @type: checksum type, see Shishi_cksumtype. * * Get length of checksum output. * * Return value: Return length of checksum used for the checksum type, * as defined in the standards. **/ size_t shishi_checksum_cksumlen (int32_t type) { size_t i; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) if (type == checksums[i]->type) return checksums[i]->cksumlen; return -1; } /** * shishi_checksum_parse: * @checksum: name of checksum type, e.g. "hmac-sha1-96-aes256". * * Get checksum number by parsing a string. * * Return value: Return checksum type, see Shishi_cksumtype, * corresponding to a string. **/ int shishi_checksum_parse (const char *checksum) { size_t i; char *endptr; i = strtol (checksum, &endptr, 0); if (endptr != checksum) return i; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) if (strcasecmp (checksum, checksums[i]->name) == 0) return checksums[i]->type; return -1; } static Shishi_checksum_function _shishi_checksum (int32_t type) { size_t i; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) if (type == checksums[i]->type) return checksums[i]->checksum; return NULL; } static Shishi_verify_function _shishi_verify (int32_t type) { size_t i; for (i = 0; i < sizeof (checksums) / sizeof (checksums[0]); i++) if (type == checksums[i]->type) return checksums[i]->verify; return NULL; } /** * shishi_string_to_key: * @handle: shishi handle as allocated by shishi_init(). * @keytype: cryptographic encryption type, see Shishi_etype. * @password: input array with password. * @passwordlen: length of input array with password. * @salt: input array with salt. * @saltlen: length of input array with salt. * @parameter: input array with opaque encryption type specific information. * @outkey: allocated key handle that will contain new key. * * Derive key from a string (password) and salt (commonly * concatenation of realm and principal) for specified key type, and * set the type and value in the given key to the computed values. * The parameter value is specific for each keytype, and can be set if * the parameter information is not available. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_string_to_key (Shishi * handle, int32_t keytype, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { Shishi_string_to_key_function string2key; int res; shishi_key_type_set (outkey, keytype); if (VERBOSECRYPTO (handle)) { printf ("string_to_key (%s, password, salt)\n", shishi_key_name (outkey)); printf ("\t ;; password:\n"); _shishi_escapeprint (password, passwordlen); _shishi_hexprint (password, passwordlen); printf ("\t ;; salt:\n"); _shishi_escapeprint (salt, saltlen); _shishi_hexprint (salt, saltlen); } string2key = _shishi_cipher_string_to_key (shishi_key_type (outkey)); if (string2key == NULL) { shishi_error_printf (handle, "Unsupported keytype %d", shishi_key_type (outkey)); return SHISHI_CRYPTO_ERROR; } res = (*string2key) (handle, password, passwordlen, salt, saltlen, parameter, outkey); if (VERBOSECRYPTO (handle)) { printf ("\t ;; string_to_key key:\n"); _shishi_hexprint (shishi_key_value (outkey), shishi_key_length (outkey)); _shishi_binprint (shishi_key_value (outkey), shishi_key_length (outkey)); } return res; } /** * shishi_random_to_key: * @handle: shishi handle as allocated by shishi_init(). * @keytype: cryptographic encryption type, see Shishi_etype. * @rnd: input array with random data. * @rndlen: length of input array with random data. * @outkey: allocated key handle that will contain new key. * * Derive key from random data for specified key type, and set the * type and value in the given key to the computed values. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_random_to_key (Shishi * handle, int32_t keytype, const char *rnd, size_t rndlen, Shishi_key * outkey) { Shishi_random_to_key_function random2key; int res; shishi_key_type_set (outkey, keytype); if (VERBOSECRYPTO (handle)) { printf ("random_to_key (%s, random)\n", shishi_key_name (outkey)); printf ("\t ;; random:\n"); _shishi_hexprint (rnd, rndlen); _shishi_binprint (rnd, rndlen); } random2key = _shishi_cipher_random_to_key (keytype); if (random2key == NULL) { shishi_error_printf (handle, "Unsupported random_to_key() ekeytype %d", keytype); return SHISHI_CRYPTO_ERROR; } res = (*random2key) (handle, rnd, rndlen, outkey); if (VERBOSECRYPTO (handle)) { printf ("\t ;; random_to_key key:\n"); _shishi_hexprint (shishi_key_value (outkey), shishi_key_length (outkey)); _shishi_binprint (shishi_key_value (outkey), shishi_key_length (outkey)); } return res; } /** * shishi_checksum: * @handle: shishi handle as allocated by shishi_init(). * @key: key to compute checksum with. * @keyusage: integer specifying what this key is used for. * @cksumtype: the checksum algorithm to use. * @in: input array with data to integrity protect. * @inlen: size of input array with data to integrity protect. * @out: output array with newly allocated integrity protected data. * @outlen: output variable with length of output array with checksum. * * Integrity protect data using key, possibly altered by supplied key * usage. If key usage is 0, no key derivation is used. The OUT * buffer must be deallocated by the caller. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { Shishi_checksum_function checksum; int res; if (VERBOSECRYPTO (handle)) { printf ("checksum (%s, %d, in, out)\n", shishi_key_name (key), cksumtype); printf ("\t ;; key (%d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; in:\n"); _shishi_escapeprint (in, inlen); _shishi_hexprint (in, inlen); } if (cksumtype == 0) cksumtype = shishi_cipher_defaultcksumtype (shishi_key_type (key)); checksum = _shishi_checksum (cksumtype); if (checksum == NULL) { shishi_error_printf (handle, "Unsupported checksum type %d", cksumtype); return SHISHI_CRYPTO_ERROR; } /* XXX? check if etype and cksumtype are compatible? */ res = (*checksum) (handle, key, keyusage, cksumtype, in, inlen, out, outlen); if (VERBOSECRYPTO (handle)) { printf ("\t ;; checksum out:\n"); _shishi_escapeprint (*out, *outlen); _shishi_hexprint (*out, *outlen); } return res; } /** * shishi_verify: * @handle: shishi handle as allocated by shishi_init(). * @key: key to verify checksum with. * @keyusage: integer specifying what this key is used for. * @cksumtype: the checksum algorithm to use. * @in: input array with data that was integrity protected. * @inlen: size of input array with data that was integrity protected. * @cksum: input array with alleged checksum of data. * @cksumlen: size of input array with alleged checksum of data. * * Verify checksum of data using key, possibly altered by supplied key * usage. If key usage is 0, no key derivation is used. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_verify (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, const char *cksum, size_t cksumlen) { Shishi_verify_function verify; int res; if (VERBOSECRYPTO (handle)) { printf ("verify (%s, %d, in, out)\n", shishi_key_name (key), cksumtype); printf ("\t ;; key (%d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; data:\n"); _shishi_escapeprint (in, inlen); _shishi_hexprint (in, inlen); printf ("\t ;; mic:\n"); _shishi_escapeprint (cksum, cksumlen); _shishi_hexprint (cksum, cksumlen); } if (cksumtype == 0) cksumtype = shishi_cipher_defaultcksumtype (shishi_key_type (key)); verify = _shishi_verify (cksumtype); if (verify == NULL) { shishi_error_printf (handle, "Unsupported checksum type %d", cksumtype); return SHISHI_CRYPTO_ERROR; } /* XXX? check if etype and cksumtype are compatible? */ res = (*verify) (handle, key, keyusage, cksumtype, in, inlen, cksum, cksumlen); if (VERBOSECRYPTO (handle)) printf ("\t ;; verify return: %d\n", res); return res; } /** * shishi_encrypt_ivupdate_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @etype: integer specifying what cipher to use. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @ivout: output array with newly allocated updated initialization vector. * @ivoutlen: size of output array with updated initialization vector. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data as per encryption method using specified * initialization vector and key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. If IVOUT or * IVOUTLEN is NULL, the updated IV is not saved anywhere. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { Shishi_encrypt_function enc; int res; if (VERBOSECRYPTO (handle)) { printf ("encrypt (type=%s, usage=%d, key, in)\n", shishi_key_name (key), keyusage); printf ("\t ;; key (%d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; in (%d):\n", inlen); _shishi_escapeprint (in, inlen); _shishi_hexprint (in, inlen); if (iv) { printf ("\t ;; iv (%d):\n", ivlen); _shishi_escapeprint (iv, ivlen); _shishi_hexprint (iv, ivlen); } } enc = _shishi_cipher_encrypt (etype); if (enc == NULL) { shishi_error_printf (handle, "Unsupported keytype %d", shishi_key_type (key)); return SHISHI_CRYPTO_ERROR; } res = (*enc) (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); if (VERBOSECRYPTO (handle)) { if (res == SHISHI_OK) { printf ("\t ;; encrypt out:\n"); _shishi_escapeprint (*out, *outlen); _shishi_hexprint (*out, *outlen); if (ivout && ivoutlen) { printf ("\t ;; iv out:\n"); _shishi_escapeprint (*ivout, *ivoutlen); _shishi_hexprint (*ivout, *ivoutlen); } } else { printf ("\t ;; encrypt out failed %d\n", res); } } return res; } /** * shishi_encrypt_iv_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @etype: integer specifying what cipher to use. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data as per encryption method using specified * initialization vector and key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. The next IV is * lost, see shishi_encrypt_ivupdate_etype if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_encrypt_ivupdate_etype (handle, key, keyusage, etype, iv, ivlen, NULL, NULL, in, inlen, out, outlen); } /** * shishi_encrypt_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @etype: integer specifying what cipher to use. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data as per encryption method using specified * initialization vector and key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. The default IV * is used, see shishi_encrypt_iv_etype if you need to alter it. The * next IV is lost, see shishi_encrypt_ivupdate_etype if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_encrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), NULL, 0, NULL, NULL, in, inlen, out, outlen); } /** * shishi_encrypt_ivupdate: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @ivout: output array with newly allocated updated initialization vector. * @ivoutlen: size of output array with updated initialization vector. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data using specified initialization vector and key. The * key actually used is derived using the key usage. If key usage is * 0, no key derivation is used. The OUT buffer must be deallocated * by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not * saved anywhere. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_encrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } /** * shishi_encrypt_iv: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data using specified initialization vector and key. The * key actually used is derived using the key usage. If key usage is * 0, no key derivation is used. The OUT buffer must be deallocated * by the caller. The next IV is lost, see shishi_encrypt_ivupdate if * you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_encrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), iv, ivlen, NULL, NULL, in, inlen, out, outlen); } /** * shishi_encrypt: * @handle: shishi handle as allocated by shishi_init(). * @key: key to encrypt with. * @keyusage: integer specifying what this key is encrypting. * @in: input array with data to encrypt. * @inlen: size of input array with data to encrypt. * @out: output array with newly allocated encrypted data. * @outlen: output variable with size of newly allocated output array. * * Encrypts data using specified key. The key actually used is * derived using the key usage. If key usage is 0, no key derivation * is used. The OUT buffer must be deallocated by the caller. The * default IV is used, see shishi_encrypt_iv if you need to alter it. * The next IV is lost, see shishi_encrypt_ivupdate if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encrypt (Shishi * handle, Shishi_key * key, int keyusage, char *in, size_t inlen, char **out, size_t * outlen) { return shishi_encrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), NULL, 0, NULL, NULL, in, inlen, out, outlen); } /** * shishi_decrypt_ivupdate_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @etype: integer specifying what cipher to use. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @ivout: output array with newly allocated updated initialization vector. * @ivoutlen: size of output array with updated initialization vector. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data as per encryption method using specified * initialization vector and key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. If IVOUT or * IVOUTLEN is NULL, the updated IV is not saved anywhere. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { Shishi_decrypt_function decrypt; int res; if (VERBOSECRYPTO (handle)) { printf ("decrypt (type=%s, usage=%d, key, in, out)\n", shishi_key_name (key), keyusage); printf ("\t ;; key (%d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; in (%d):\n", inlen); _shishi_escapeprint (in, inlen); _shishi_hexprint (in, inlen); if (iv) { printf ("\t ;; iv (%d):\n", ivlen); _shishi_escapeprint (iv, ivlen); _shishi_hexprint (iv, ivlen); } } decrypt = _shishi_cipher_decrypt (etype); if (decrypt == NULL) { shishi_error_printf (handle, "Unsupported keytype %d", shishi_key_type (key)); return SHISHI_CRYPTO_ERROR; } res = (*decrypt) (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); if (VERBOSECRYPTO (handle)) { if (res == SHISHI_OK) { printf ("\t ;; decrypt out:\n"); _shishi_escapeprint (*out, *outlen); _shishi_hexprint (*out, *outlen); } else { printf ("\t ;; decrypt out failed %d\n", res); } } return res; } /** * shishi_decrypt_iv_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @etype: integer specifying what cipher to use. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data as per encryption method using specified * initialization vector and key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. The next IV is * lost, see shishi_decrypt_ivupdate_etype if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_decrypt_ivupdate_etype (handle, key, keyusage, etype, iv, ivlen, NULL, NULL, in, inlen, out, outlen); } /** * shishi_decrypt_etype: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @etype: integer specifying what cipher to use. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data as per encryption method using specified key. The * key actually used is derived using the key usage. If key usage is * 0, no key derivation is used. The OUT buffer must be deallocated * by the caller. The default IV is used, see shishi_decrypt_iv_etype * if you need to alter it. The next IV is lost, see * shishi_decrypt_ivupdate_etype if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_decrypt_ivupdate_etype (handle, key, keyusage, etype, NULL, 0, NULL, NULL, in, inlen, out, outlen); } /** * shishi_decrypt_ivupdate: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @ivout: output array with newly allocated updated initialization vector. * @ivoutlen: size of output array with updated initialization vector. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data using specified initialization vector and key. The * key actually used is derived using the key usage. If key usage is * 0, no key derivation is used. The OUT buffer must be deallocated * by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not * saved anywhere. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_decrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } /** * shishi_decrypt_iv: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @iv: input array with initialization vector * @ivlen: size of input array with initialization vector. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data using specified initialization vector and key. The * key actually used is derived using the key usage. If key usage is * 0, no key derivation is used. The OUT buffer must be deallocated * by the caller. The next IV is lost, see * shishi_decrypt_ivupdate_etype if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_decrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), iv, ivlen, NULL, NULL, in, inlen, out, outlen); } /** * shishi_decrypt: * @handle: shishi handle as allocated by shishi_init(). * @key: key to decrypt with. * @keyusage: integer specifying what this key is decrypting. * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt. * @out: output array with newly allocated decrypted data. * @outlen: output variable with size of newly allocated output array. * * Decrypts data specified key. The key actually used is derived * using the key usage. If key usage is 0, no key derivation is used. * The OUT buffer must be deallocated by the caller. The default IV * is used, see shishi_decrypt_iv if you need to alter it. The next * IV is lost, see shishi_decrypt_ivupdate if you need it. * * Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data * exactly. Some encryption types add pad to make the data fit into * the block size of the encryption algorithm. Furthermore, the pad * is not guaranteed to look in any special way, although existing * implementations often pad with the zero byte. This means that you * may have to "frame" data, so it is possible to infer the original * length after decryption. Compare ASN.1 DER which contains such * information. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *in, size_t inlen, char **out, size_t * outlen) { return shishi_decrypt_ivupdate_etype (handle, key, keyusage, shishi_key_type (key), NULL, 0, NULL, NULL, in, inlen, out, outlen); } /** * shishi_n_fold: * @handle: shishi handle as allocated by shishi_init(). * @in: input array with data to decrypt. * @inlen: size of input array with data to decrypt ("M"). * @out: output array with decrypted data. * @outlen: size of output array ("N"). * * Fold data into a fixed length output array, with the intent to give * each input bit approximately equal weight in determining the value * of each output bit. * * The algorithm is from "A Better Key Schedule For DES-like Ciphers" * by Uri Blumenthal and Steven M. Bellovin, * http://www.research.att.com/~smb/papers/ides.pdf, although the * sample vectors provided by the paper are incorrect. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_n_fold (Shishi * handle, const char *in, size_t inlen, char *out, size_t outlen) { int m = inlen; int n = outlen; char *buf = NULL; char *a = NULL; int lcmmn = 0; int i = 0; /* To n-fold a number X, replicate the input value to a length that is the least common multiple of n and the length of X. Before each repetition, the input is rotated to the right by 13 bit positions. The successive n-bit chunks are added together using 1's-complement addition (that is, addition with end-around carry) to yield a n-bit result denoted _n. */ a = xmemdup (in, m); lcmmn = lcm (m, n); if (VERBOSECRYPTONOISE (handle)) { printf ("%d-fold (string)\n", n * 8); printf ("\t ;; string length %d bytes %d bits\n", m, m * 8); _shishi_escapeprint (a, m); _shishi_hexprint (a, m); printf ("\t ;; lcm(%d, %d) = lcm(%d, %d) = %d\n", 8 * m, 8 * n, m, n, lcmmn); } buf = xmalloc (lcmmn); /* Replicate the input th the LCMMN length */ for (i = 0; i < (lcmmn / m); i++) { if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; %d-th replication\n", i + 1); printf ("string = rot13(string)\n"); } memcpy ((char *) &buf[i * m], a, m); rot13 (handle, a, a, m); } memset (out, 0, n); /* just in case */ if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; replicated string (length %d):\n", lcmmn); _shishi_hexprint (buf, lcmmn); _shishi_binprint (buf, lcmmn); printf ("sum = 0\n"); } /* Now we view the buf as set of n-byte strings Add the n-byte long chunks together, using one's complement addition, storing the result in the output string. */ for (i = 0; i < (lcmmn / n); i++) { if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; %d-th one's complement addition sum\n", i + 1); printf ("\t ;; sum:\n"); _shishi_hexprint (out, n); _shishi_binprint (out, n); printf ("\t ;; A (offset %d):\n", i * n); _shishi_hexprint (&buf[i * n], n); _shishi_binprint (&buf[i * n], n); printf ("sum = ocadd(sum, A);\n"); } ocadd (out, (char *) &buf[i * n], out, n); if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; sum:\n"); _shishi_hexprint (out, n); _shishi_binprint (out, n); } } if (VERBOSECRYPTONOISE (handle)) { printf ("\t ;; nfold\n"); _shishi_hexprint (out, n); _shishi_binprint (out, n); } free (buf); free (a); return SHISHI_OK; } #define MAX_DR_PRFCONSTANT 1024 /** * shishi_dr: * @handle: shishi handle as allocated by shishi_init(). * @key: input array with cryptographic key to use. * @prfconstant: input array with the constant string. * @prfconstantlen: size of input array with the constant string. * @derivedrandom: output array with derived random data. * @derivedrandomlen: size of output array with derived random data. * * Derive "random" data from a key and a constant thusly: * DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, * SHISHI_ENCRYPT(KEY, PRFCONSTANT)). * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_dr (Shishi * handle, Shishi_key * key, const char *prfconstant, size_t prfconstantlen, char *derivedrandom, size_t derivedrandomlen) { char *cipher; char plaintext[MAX_DR_PRFCONSTANT]; char nfoldprfconstant[MAX_DR_PRFCONSTANT]; size_t blocksize = shishi_cipher_blocksize (shishi_key_type (key)); size_t totlen, cipherlen; int res; if (VERBOSECRYPTO (handle)) { printf ("dr (%s, key, prfconstant, %d)\n", shishi_cipher_name (shishi_key_type (key)), derivedrandomlen); printf ("\t ;; key (length %d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); _shishi_binprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; prfconstant %s':\n", prfconstant); _shishi_escapeprint (prfconstant, prfconstantlen); _shishi_hexprint (prfconstant, prfconstantlen); _shishi_binprint (prfconstant, prfconstantlen); } if (prfconstantlen > MAX_DR_PRFCONSTANT) return SHISHI_TOO_SMALL_BUFFER; if (prfconstantlen == blocksize) memcpy (nfoldprfconstant, prfconstant, prfconstantlen); else { res = shishi_n_fold (handle, prfconstant, prfconstantlen, nfoldprfconstant, blocksize); if (res != SHISHI_OK) return res; } if (VERBOSECRYPTO (handle)) { printf ("\t ;; possibly nfolded prfconstant (length %d):\n", blocksize); _shishi_escapeprint (nfoldprfconstant, blocksize); _shishi_hexprint (nfoldprfconstant, blocksize); _shishi_binprint (nfoldprfconstant, blocksize); } memcpy (plaintext, nfoldprfconstant, blocksize); totlen = 0; do { res = shishi_encrypt (handle, key, 0, plaintext, blocksize, &cipher, &cipherlen); if (res != SHISHI_OK) return res; if (cipherlen != blocksize) return SHISHI_CRYPTO_ERROR; memcpy (derivedrandom + totlen, cipher, cipherlen); memcpy (plaintext, cipher, cipherlen); free (cipher); totlen += cipherlen; } while (totlen < derivedrandomlen); if (VERBOSECRYPTO (handle)) { printf ("\t ;; derived random (length %d):\n", derivedrandomlen); _shishi_hexprint (derivedrandom, derivedrandomlen); _shishi_binprint (derivedrandom, derivedrandomlen); } return SHISHI_OK; } /** * shishi_dk: * @handle: shishi handle as allocated by shishi_init(). * @key: input cryptographic key to use. * @prfconstant: input array with the constant string. * @prfconstantlen: size of input array with the constant string. * @derivedkey: pointer to derived key (allocated by caller). * * Derive a key from a key and a constant thusly: * DK(KEY, PRFCONSTANT) = SHISHI_RANDOM-TO-KEY(SHISHI_DR(KEY, PRFCONSTANT)). * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_dk (Shishi * handle, Shishi_key * key, const char *prfconstant, size_t prfconstantlen, Shishi_key * derivedkey) { char rnd[MAX_RANDOM_LEN]; int res; if (VERBOSECRYPTO (handle)) { printf ("dk (%s, key, prfconstant)\n", shishi_key_name (key)); printf ("\t ;; key (length %d):\n", shishi_key_length (key)); _shishi_hexprint (shishi_key_value (key), shishi_key_length (key)); _shishi_binprint (shishi_key_value (key), shishi_key_length (key)); printf ("\t ;; prfconstant:\n"); _shishi_escapeprint (prfconstant, prfconstantlen); _shishi_hexprint (prfconstant, prfconstantlen); _shishi_binprint (prfconstant, prfconstantlen); } shishi_key_type_set (derivedkey, shishi_key_type (key)); res = shishi_dr (handle, key, prfconstant, prfconstantlen, rnd, shishi_key_length (derivedkey)); if (res != SHISHI_OK) return res; res = shishi_random_to_key (handle, shishi_key_type (derivedkey), rnd, shishi_key_length (derivedkey), derivedkey); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/gztime.c0000664000000000000000000000774612126660507012126 00000000000000/* gztime.c --- Convertion functions for GeneralizedTime. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get xtime. */ #include "utils.h" /** * shishi_generalize_time: * @handle: shishi handle as allocated by shishi_init(). * @t: C time to convert. * * Convert C time to KerberosTime. The string must not be deallocate * by caller. * * Return value: Return a KerberosTime time string corresponding to C time t. **/ const char * shishi_generalize_time (Shishi * handle, time_t t) { struct tm *tm; tm = gmtime (&t); strftime (handle->gztime_buf, sizeof (handle->gztime_buf), "%Y%m%d%H%M%SZ", tm); return handle->gztime_buf; } /** * shishi_generalize_now: * @handle: shishi handle as allocated by shishi_init(). * * Convert current time to KerberosTime. The string must not be * deallocate by caller. * * Return value: Return a KerberosTime time string corresponding to * current time. **/ const char * shishi_generalize_now (Shishi * handle) { time_t t = xtime (NULL); return shishi_generalize_time (handle, t); } /** * shishi_generalize_ctime: * @handle: shishi handle as allocated by shishi_init(). * @t: KerberosTime to convert. * * Convert KerberosTime to C time. * * Return value: Returns C time corresponding to KerberosTime t. **/ time_t shishi_generalize_ctime (Shishi * handle, const char *t) { struct tm tm; time_t ct; memset (&tm, 0, sizeof (tm)); sscanf (t, "%4u%2u%2u%2u%2u%2uZ", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); tm.tm_year -= 1900; tm.tm_mon--; ct = timegm (&tm); return ct; } /** * shishi_time: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 node to get time from. * @field: Name of field in ASN.1 node to get time from. * @t: newly allocated output array with zero terminated time string. * * Extract time from ASN.1 structure. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_time (Shishi * handle, Shishi_asn1 node, const char *field, char **t) { size_t len; int res; len = SHISHI_GENERALIZEDTIME_LENGTH + 1; *t = xmalloc (len); res = shishi_asn1_read_inline (handle, node, field, *t, &len); if (res != SHISHI_OK) return res; if (len <= SHISHI_GENERALIZEDTIME_LENGTH) { shishi_error_printf (handle, "Read time too short (%s)", *t); return SHISHI_ASN1_ERROR; } (*t)[SHISHI_GENERALIZEDTIME_LENGTH] = '\0'; return SHISHI_OK; } /** * shishi_ctime: * @handle: shishi handle as allocated by shishi_init(). * @node: ASN.1 variable to read field from. * @field: name of field in @node to read. * @t: pointer to time field to set. * * Extract time from ASN.1 structure. * * Return value: Returns SHISHI_OK if successful, * SHISHI_ASN1_NO_ELEMENT if the element do not exist, * SHISHI_ASN1_NO_VALUE if the field has no value, ot * SHISHI_ASN1_ERROR otherwise. **/ int shishi_ctime (Shishi * handle, Shishi_asn1 node, const char *field, time_t * t) { char str[SHISHI_GENERALIZEDTIME_LENGTH + 1]; size_t len = sizeof (str); int rc; rc = shishi_asn1_read_inline (handle, node, field, str, &len); if (rc != SHISHI_OK) return rc; *t = shishi_generalize_ctime (handle, str); return SHISHI_OK; } shishi-1.0.2/lib/Makefile.in0000644000000000000000000017451412126772725012532 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @NULL_TRUE@am__append_1 = crypto-null.c @MD_TRUE@am__append_2 = crypto-md.c @DES_TRUE@am__append_3 = crypto-des.c @DES3_TRUE@am__append_4 = crypto-3des.c @AES_TRUE@am__append_5 = crypto-aes.c @ARCFOUR_TRUE@am__append_6 = crypto-rc4.c @STARTTLS_TRUE@am__append_7 = starttls.c starttls.h @HAVE_LD_VERSION_SCRIPT_TRUE@am__append_8 = -Wl,--version-script=$(srcdir)/libshishi.map @HAVE_LD_VERSION_SCRIPT_FALSE@am__append_9 = -export-symbols-regex '^shishi.*' @HAVE_LD_OUTPUT_DEF_TRUE@am__append_10 = -Wl,--output-def,libshishi-$(SOVERSION).def @HAVE_LD_OUTPUT_DEF_TRUE@am__append_11 = $(defexec_DATA) subdir = lib DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(defexecdir)" \ "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libshishi_la_DEPENDENCIES = ../gl/libgnu.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libshishi_la_SOURCES_DIST = libshishi.map shishi.h internal.h \ init.c cfg.c cfg.h realm.c principal.c error.c krberror.c \ gztime.c diskio.c diskio.h authorize.c pki.c authenticator.c \ kdc.c kdcreq.c kdcrep.c enckdcreppart.c as.c tgs.c ap.c \ apreq.c aprep.c encapreppart.c safe.c priv.c ticket.c \ encticketpart.c tkt.c tkts.c tktccache.c ccache.c ccache.h \ netio.c key.c keys.c keytab.c hostkeys.c crypto.c crypto.h \ crypto-ctx.c asn1.c asn1.h kerberos5.c version.c password.c \ utils.c utils.h resolv.c kerberos5.asn1 low-crypto.c \ low-crypto.h crypto-null.c crypto-md.c crypto-des.c \ crypto-3des.c crypto-aes.c crypto-rc4.c starttls.c starttls.h @NULL_TRUE@am__objects_1 = crypto-null.lo @MD_TRUE@am__objects_2 = crypto-md.lo @DES_TRUE@am__objects_3 = crypto-des.lo @DES3_TRUE@am__objects_4 = crypto-3des.lo @AES_TRUE@am__objects_5 = crypto-aes.lo @ARCFOUR_TRUE@am__objects_6 = crypto-rc4.lo @STARTTLS_TRUE@am__objects_7 = starttls.lo am_libshishi_la_OBJECTS = init.lo cfg.lo realm.lo principal.lo \ error.lo krberror.lo gztime.lo diskio.lo authorize.lo pki.lo \ authenticator.lo kdc.lo kdcreq.lo kdcrep.lo enckdcreppart.lo \ as.lo tgs.lo ap.lo apreq.lo aprep.lo encapreppart.lo safe.lo \ priv.lo ticket.lo encticketpart.lo tkt.lo tkts.lo tktccache.lo \ ccache.lo netio.lo key.lo keys.lo keytab.lo hostkeys.lo \ crypto.lo crypto-ctx.lo asn1.lo kerberos5.lo version.lo \ password.lo utils.lo resolv.lo low-crypto.lo $(am__objects_1) \ $(am__objects_2) $(am__objects_3) $(am__objects_4) \ $(am__objects_5) $(am__objects_6) $(am__objects_7) libshishi_la_OBJECTS = $(am_libshishi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libshishi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libshishi_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libshishi_la_SOURCES) DIST_SOURCES = $(am__libshishi_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(defexec_DATA) HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shishi.conf\" \ -DSKELCFGFILE=\"$(SKELDIR)/shishi.skel\" \ -DHOSTKEYSFILE=\"$(KEYDIR)/shishi.keys\" DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) $(CFLAG_VISIBILITY) AM_CPPFLAGS = $(LIBTASN1_CFLAGS) -I$(top_srcdir)/gl -I$(top_builddir)/gl BUILT_SOURCES = shishi-int.h kerberos5.c DISTCLEANFILES = shishi-int.h $(am__append_11) MAINTAINERCLEANFILES = kerberos5.c nodist_include_HEADERS = shishi-int.h include_HEADERS = shishi.h lib_LTLIBRARIES = libshishi.la libshishi_la_SOURCES = libshishi.map shishi.h internal.h init.c cfg.c \ cfg.h realm.c principal.c error.c krberror.c gztime.c diskio.c \ diskio.h authorize.c pki.c authenticator.c kdc.c kdcreq.c \ kdcrep.c enckdcreppart.c as.c tgs.c ap.c apreq.c aprep.c \ encapreppart.c safe.c priv.c ticket.c encticketpart.c tkt.c \ tkts.c tktccache.c ccache.c ccache.h netio.c key.c keys.c \ keytab.c hostkeys.c crypto.c crypto.h crypto-ctx.c asn1.c \ asn1.h kerberos5.c version.c password.c utils.c utils.h \ resolv.c kerberos5.asn1 low-crypto.c low-crypto.h \ $(am__append_1) $(am__append_2) $(am__append_3) \ $(am__append_4) $(am__append_5) $(am__append_6) \ $(am__append_7) libshishi_la_LIBADD = ../gl/libgnu.la $(LIB_CLOCK_GETTIME) \ $(LTLIBTASN1) $(LTLIBGNUTLS) $(LTLIBGCRYPT) $(LTLIBIDN) \ $(LTLIBINTL) $(LTLIBRESOLV) $(LIBSOCKET) libshishi_la_LDFLAGS = -no-undefined -version-info \ $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) $(am__append_8) \ $(am__append_9) $(am__append_10) @HAVE_LD_OUTPUT_DEF_TRUE@defexecdir = $(bindir) @HAVE_LD_OUTPUT_DEF_TRUE@defexec_DATA = libshishi-$(SOVERSION).def all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libshishi.la: $(libshishi_la_OBJECTS) $(libshishi_la_DEPENDENCIES) $(EXTRA_libshishi_la_DEPENDENCIES) $(AM_V_CCLD)$(libshishi_la_LINK) -rpath $(libdir) $(libshishi_la_OBJECTS) $(libshishi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aprep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apreq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/as.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authenticator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authorize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-3des.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-aes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-ctx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-des.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-md.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-null.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-rc4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encapreppart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enckdcreppart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encticketpart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gztime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hostkeys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdcrep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdcreq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kerberos5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krberror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/low-crypto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/password.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pki.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/principal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/priv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starttls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tgs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ticket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tkt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tktccache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tkts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-defexecDATA: $(defexec_DATA) @$(NORMAL_INSTALL) @list='$(defexec_DATA)'; test -n "$(defexecdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(defexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(defexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(defexecdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(defexecdir)" || exit $$?; \ done uninstall-defexecDATA: @$(NORMAL_UNINSTALL) @list='$(defexec_DATA)'; test -n "$(defexecdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(defexecdir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-nodist_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(defexecdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-nodist_includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-defexecDATA install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-defexecDATA uninstall-includeHEADERS \ uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-defexecDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man \ install-nodist_includeHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-defexecDATA \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-nodist_includeHEADERS shishi-int.h: if test -n "$(STDINT_H)"; then \ cp ../gl/stdint.h shishi-int.h; \ else \ echo '#include ' > shishi-int.h; \ fi kerberos5.c: $(srcdir)/kerberos5.asn1 -@ASN1PARSER@ -o $@ -n shishi_asn1_tab $(srcdir)/kerberos5.asn1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/lib/utils.c0000664000000000000000000000654712126660507011765 00000000000000/* utils.c --- Auxilliary help functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "utils.h" void _shishi_escapeprint (const char *str, int len) { int i; printf ("\t ;; `"); for (i = 0; i < len; i++) if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= '0' && str[i] <= '9') || str[i] == '.') printf ("%c", str[i] & 0xFF); else printf ("\\x%02x", str[i] & 0xFF); printf ("' (length %d bytes)\n", len); } void _shishi_hexprint (const char *str, int len) { int i; printf ("\t ;; "); for (i = 0; i < len; i++) { printf ("%02x ", str[i] & 0xFF); if ((i + 1) % 8 == 0) printf (" "); if ((i + 1) % 16 == 0 && i + 1 < len) printf ("\n\t ;; "); } puts (""); } void _shishi_binprint (const char *str, int len) { int i; printf ("\t ;; "); for (i = 0; i < len; i++) { printf ("%d%d%d%d%d%d%d%d ", str[i] & 0x80 ? 1 : 0, str[i] & 0x40 ? 1 : 0, str[i] & 0x20 ? 1 : 0, str[i] & 0x10 ? 1 : 0, str[i] & 0x08 ? 1 : 0, str[i] & 0x04 ? 1 : 0, str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0); if ((i + 1) % 3 == 0) printf (" "); if ((i + 1) % 6 == 0 && i + 1 < len) printf ("\n\t ;; "); } puts (""); } void _shishi_bin7print (const char *str, int len) { int i; printf ("\t ;; "); for (i = 0; i < len; i++) { printf ("%d%d%d%d%d%d%d ", str[i] & 0x40 ? 1 : 0, str[i] & 0x20 ? 1 : 0, str[i] & 0x10 ? 1 : 0, str[i] & 0x08 ? 1 : 0, str[i] & 0x04 ? 1 : 0, str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0); if ((i + 1) % 3 == 0) printf (" "); if ((i + 1) % 6 == 0 && i + 1 < len) printf ("\n\t ;; "); } puts (""); } time_t xtime (time_t * t) { time_t now; now = time (t); if (now == (time_t) - 1) { perror ("time"); abort (); } return now; } time_t shishi_get_date (const char *p, const time_t * now) { struct timespec nowspec = { 0, 0 }; struct timespec thenspec; if (now) nowspec.tv_sec = *now; else nowspec.tv_sec = time (NULL); if (!parse_datetime (&thenspec, p, &nowspec)) { thenspec.tv_sec = (time_t) - 1; thenspec.tv_nsec = 0; } return thenspec.tv_sec; } /* If non-NULL, call this function when memory is exhausted. */ void (*shishi_alloc_fail_function) (void) = 0; void shishi_xalloc_die (void) { if (shishi_alloc_fail_function) (*shishi_alloc_fail_function) (); fflush (stdout); fprintf (stderr, _("%s: Memory allocation failed\n"), PACKAGE); abort (); } shishi-1.0.2/lib/crypto-rc4.c0000664000000000000000000003154312126660507012625 00000000000000/* crypto-rc4.c --- draft-brezak-win2k-krb-rc4-hmac-04 crypto functions. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get prototypes. */ #include "crypto.h" /* Get _shishi_escapeprint, etc. */ #include "utils.h" static int arcfour_keyusage (int keyusage) { /* From draft-brezak-win2k-krb-rc4-hmac-04.txt: * * 1. AS-REQ PA-ENC-TIMESTAMP padata timestamp, encrypted with * the client key (T=1) * 2. AS-REP Ticket and TGS-REP Ticket (includes TGS session key * or application session key), encrypted with the service key * (T=2) * 3. AS-REP encrypted part (includes TGS session key or * application session key), encrypted with the client key (T=8) * 4. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the * TGS session key (T=4) * 5. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the * TGS authenticator subkey (T=5) * 6. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator cksum, keyed * with the TGS session key (T=6) * 7. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator (includes * TGS authenticator subkey), encrypted with the TGS session key * (T=7) * 8. TGS-REP encrypted part (includes application session key), * encrypted with the TGS session key (T=8) * 9. TGS-REP encrypted part (includes application session key), * encrypted with the TGS authenticator subkey (T=8) * 10. AP-REQ Authenticator cksum, keyed with the application * session key (T=10) * 11. AP-REQ Authenticator (includes application authenticator * subkey), encrypted with the application session key (T=11) * 12. AP-REP encrypted part (includes application session * subkey), encrypted with the application session key (T=12) * 13. KRB-PRIV encrypted part, encrypted with a key chosen by * the application. Also for data encrypted with GSS Wrap (T=13) * 14. KRB-CRED encrypted part, encrypted with a key chosen by * the application (T=14) * 15. KRB-SAFE cksum, keyed with a key chosen by the * application. Also for data signed in GSS MIC (T=15) */ if (keyusage == SHISHI_KEYUSAGE_ENCASREPPART) return SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY; else if (keyusage == SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY) return SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY; /* Continued, this probably refer to the non-standard 3DES GSSAPI * keyusages; RFC 1964 does not discuss key uses at all. When this * comment was written, GSSLib did not support ARCFOUR though. * * Relative to RFC-1964 key uses: * * T = 0 in the generation of sequence number for the MIC token * T = 0 in the generation of sequence number for the WRAP token * T = 0 in the generation of encrypted data for the WRAPPED token * */ if (keyusage == SHISHI_KEYUSAGE_GSS_R1 || keyusage == SHISHI_KEYUSAGE_GSS_R2 || keyusage == SHISHI_KEYUSAGE_GSS_R3) return 0; return keyusage; } static int arcfour_hmac_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { int export = shishi_key_type (key) == SHISHI_ARCFOUR_HMAC_EXP; int arcfourkeyusage = arcfour_keyusage (keyusage); char L40[14] = "fortybits"; uint8_t T[4]; char *K1 = NULL; char K2[16]; char *K3 = NULL; char *pt = NULL; size_t ptlen; char *ct = NULL; char *cksum = NULL; int offset; int err; T[0] = arcfourkeyusage & 0xFF; T[1] = (arcfourkeyusage >> 8) & 0xFF; T[2] = (arcfourkeyusage >> 16) & 0xFF; T[3] = (arcfourkeyusage >> 24) & 0xFF; memcpy (L40 + 10, T, 4); if (export) offset = 0; else offset = 10; if (VERBOSECRYPTONOISE (handle)) { puts ("k1pt"); _shishi_hexprint (L40 + offset, 14 - offset); } err = shishi_hmac_md5 (handle, shishi_key_value (key), shishi_key_length (key), L40 + offset, 14 - offset, &K1); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("k1"); _shishi_hexprint (K1, 16); } memcpy (K2, K1, 16); if (export) memset (K1 + 7, 0xAB, 9); if (VERBOSECRYPTONOISE (handle)) { puts ("k1"); _shishi_hexprint (K1, 16); puts ("k2"); _shishi_hexprint (K2, 16); } /* Note that in ENCRYPT of draft-brezak-win2k-krb-rc4-hmac-04.txt change: * * edata.Checksum = HMAC (K2, edata); * * into * * edata.Checksum = HMAC (K2, concat(edata.Confounder, edata.Data)); * * otherwise it will not work. Compare DECRYPT where the later is * taken from. Another interpretation would be to HMAC a zeroized * checksum field, like certain other cipher suites do, but that * does not interoperate. * */ ptlen = 8 + inlen; pt = xmalloc (ptlen); err = shishi_randomize (handle, 0, pt, 8); if (err) goto done; memcpy (pt + 8, in, inlen); if (VERBOSECRYPTONOISE (handle)) { puts ("random"); _shishi_hexprint (pt, 8); } err = shishi_hmac_md5 (handle, K2, 16, pt, ptlen, &cksum); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("cksum"); _shishi_hexprint (cksum, 16); } err = shishi_hmac_md5 (handle, K1, 16, cksum, 16, &K3); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("k3"); _shishi_hexprint (K3, 16); } err = shishi_arcfour (handle, 0, K3, 16, iv, ivout, pt, ptlen, &ct); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("ct"); _shishi_hexprint (ct, ptlen); } *outlen = 16 + ptlen; *out = xmalloc (*outlen); memcpy (*out, cksum, 16); memcpy (*out + 16, ct, ptlen); if (ivoutlen) /* size = sbox[256] + int8_t i + int8_t j */ *ivoutlen = 256 + 2 * 8; err = SHISHI_OK; done: free (cksum); free (K3); free (pt); free (ct); free (K1); return err; } static int arcfour_hmac_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { int export = shishi_key_type (key) == SHISHI_ARCFOUR_HMAC_EXP; int arcfourkeyusage = arcfour_keyusage (keyusage); char L40[14] = "fortybits"; uint8_t T[4]; char *K1 = NULL; char K2[16]; char *K3 = NULL; char *cksum = NULL; char *pt = NULL; int offset; int err; T[0] = arcfourkeyusage & 0xFF; T[1] = (arcfourkeyusage >> 8) & 0xFF; T[2] = (arcfourkeyusage >> 16) & 0xFF; T[3] = (arcfourkeyusage >> 24) & 0xFF; memcpy (L40 + 10, T, 4); if (export) offset = 0; else offset = 10; if (VERBOSECRYPTONOISE (handle)) { puts ("k1pt"); _shishi_hexprint (L40 + offset, 14 - offset); } err = shishi_hmac_md5 (handle, shishi_key_value (key), shishi_key_length (key), L40 + offset, 14 - offset, &K1); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("k1"); _shishi_hexprint (K1, 16); } memcpy (K2, K1, 16); if (export) memset (K1 + 7, 0xAB, 9); if (VERBOSECRYPTONOISE (handle)) { puts ("k1"); _shishi_hexprint (K1, 16); puts ("k2"); _shishi_hexprint (K2, 16); } err = shishi_hmac_md5 (handle, K1, 16, in, 16, &K3); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("k3"); _shishi_hexprint (K3, 16); } err = shishi_arcfour (handle, 1, K3, 16, iv, ivout, in + 16, inlen - 16, &pt); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("cksum pt"); _shishi_hexprint (pt, inlen - 16); } err = shishi_hmac_md5 (handle, K2, 16, pt, inlen - 16, &cksum); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("cksum"); _shishi_hexprint (cksum, 16); puts ("cksumin"); _shishi_hexprint (in, 16); } if (memcmp (cksum, in, 16) != 0) { err = SHISHI_CRYPTO_ERROR; goto done; } *outlen = inlen - 16 - 8; *out = xmalloc (*outlen); memcpy (*out, pt + 8, inlen - 16 - 8); if (ivoutlen) /* size = sbox[256] + int8_t i + int8_t j */ *ivoutlen = 256 + 2 * 8; err = SHISHI_OK; done: free (cksum); free (K3); free (K1); free (pt); return err; } static int arcfour_hmac_exp_encrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return arcfour_hmac_encrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } static int arcfour_hmac_exp_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen) { return arcfour_hmac_decrypt (handle, key, keyusage, iv, ivlen, ivout, ivoutlen, in, inlen, out, outlen); } #define ARCFOUR_HMAC_CKSUM_KEY_DERIVE_CONSTANT "signaturekey" static int arcfour_hmac_md5_checksum (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, char **out, size_t * outlen) { int arcfourkeyusage = arcfour_keyusage (keyusage); char *Ksign = NULL; char *pt = NULL; size_t ptlen; char *tmp = NULL; char T[4]; int err; T[0] = arcfourkeyusage & 0xFF; T[1] = (arcfourkeyusage >> 8) & 0xFF; T[2] = (arcfourkeyusage >> 16) & 0xFF; T[3] = (arcfourkeyusage >> 24) & 0xFF; err = shishi_hmac_md5 (handle, shishi_key_value (key), shishi_key_length (key), ARCFOUR_HMAC_CKSUM_KEY_DERIVE_CONSTANT, strlen (ARCFOUR_HMAC_CKSUM_KEY_DERIVE_CONSTANT) + 1, &Ksign); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("Ksign"); _shishi_hexprint (Ksign, 16); } ptlen = 4 + inlen; pt = xmalloc (ptlen); memcpy (pt, T, 4); memcpy (pt + 4, in, inlen); if (VERBOSECRYPTONOISE (handle)) { puts ("pt"); _shishi_hexprint (pt, ptlen); } err = shishi_md5 (handle, pt, ptlen, &tmp); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("md"); _shishi_hexprint (tmp, 16); } *outlen = 16; err = shishi_hmac_md5 (handle, Ksign, 16, tmp, 16, out); if (err) goto done; if (VERBOSECRYPTONOISE (handle)) { puts ("hmac"); _shishi_hexprint (*out, 16); } err = SHISHI_OK; done: free (Ksign); free (pt); free (tmp); return err; } static int arcfour_hmac_random_to_key (Shishi * handle, const char *rnd, size_t rndlen, Shishi_key * outkey) { if (rndlen != shishi_key_length (outkey)) { shishi_error_printf (handle, "ARCFOUR random to key caller error"); return SHISHI_CRYPTO_ERROR; } shishi_key_value_set (outkey, rnd); return SHISHI_OK; } static int arcfour_hmac_string_to_key (Shishi * handle, const char *string, size_t stringlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey) { char *tmp, *md; size_t tmplen, i; int rc; tmplen = 2 * stringlen; tmp = xmalloc (tmplen); for (i = 0; i < stringlen; i++) { tmp[2 * i] = string[i]; tmp[2 * i + 1] = '\x0'; } rc = shishi_md4 (handle, tmp, tmplen, &md); free (tmp); if (rc != SHISHI_OK) return rc; shishi_key_value_set (outkey, md); free (md); return SHISHI_OK; } cipherinfo arcfour_hmac_info = { SHISHI_ARCFOUR_HMAC, "arcfour-hmac", 1, 16, 16, 16, SHISHI_ARCFOUR_HMAC_MD5, arcfour_hmac_random_to_key, arcfour_hmac_string_to_key, arcfour_hmac_encrypt, arcfour_hmac_decrypt }; cipherinfo arcfour_hmac_exp_info = { SHISHI_ARCFOUR_HMAC_EXP, "arcfour-hmac-exp", 1, 16, 16, 16, SHISHI_ARCFOUR_HMAC_MD5, arcfour_hmac_random_to_key, arcfour_hmac_string_to_key, arcfour_hmac_exp_encrypt, arcfour_hmac_exp_decrypt }; checksuminfo arcfour_hmac_md5_info = { SHISHI_ARCFOUR_HMAC_MD5, "arcfour-hmac-md5", 16, arcfour_hmac_md5_checksum, NULL }; shishi-1.0.2/lib/init.c0000664000000000000000000003007312126660507011557 00000000000000/* init.c --- Initialization functions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get gl_sockets_startup. */ #include "sockets.h" /* Get _shishi_tls_init. */ #include "starttls.h" /* Get _shishi_crypto_init. */ #include "low-crypto.h" /* Get _shishi_asn1_init. */ #include "asn1.h" static Shishi * init_handle (int outputtype) { Shishi *handle; int rc; handle = xcalloc (1, sizeof (*handle)); shishi_error_set_outputtype (handle, outputtype); if (!shishi_check_version (SHISHI_VERSION)) { shishi_warn (handle, "Library and header version missmatch (%s vs %s).", shishi_check_version (NULL), SHISHI_VERSION); free (handle); return NULL; } rc = gl_sockets_startup (SOCKETS_2_1); if (rc) { shishi_warn (handle, "Failed to initialized Windows sockets (%d)", rc); free (handle); return NULL; } rc = _shishi_crypto_init (handle); if (rc != SHISHI_OK) { shishi_warn (handle, "Cannot initialize crypto library"); free (handle); return NULL; } #ifdef USE_STARTTLS rc = _shishi_tls_init (handle); if (rc != SHISHI_OK) { shishi_warn (handle, "Cannot initialize TLS library"); free (handle); return NULL; } #endif rc = _shishi_asn1_init (handle); if (rc != SHISHI_OK) { shishi_warn (handle, "%s", shishi_strerror (SHISHI_ASN1_ERROR)); free (handle); return NULL; } bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); handle->kdctimeout = 5; handle->kdcretries = 3; handle->ticketlife = TICKETLIFE; handle->renewlife = RENEWLIFE; handle->nclientkdcetypes = 1; handle->clientkdcetypes = xmalloc (sizeof (*handle->clientkdcetypes) * handle->nclientkdcetypes); handle->clientkdcetypes[0] = SHISHI_AES256_CTS_HMAC_SHA1_96; handle->nauthorizationtypes = 1; handle->authorizationtypes = xmalloc (sizeof (*handle->authorizationtypes) * handle->nauthorizationtypes); handle->authorizationtypes[0] = SHISHI_AUTHORIZATION_BASIC; return handle; } /** * shishi: * * Initializes the Shishi library, and set up, using * shishi_error_set_outputtype(), the library so that future warnings * and informational messages are printed to stderr. If this function * fails, it may print diagnostic errors to stderr. * * Return value: Returns Shishi library handle, or %NULL on error. **/ Shishi * shishi (void) { return init_handle (SHISHI_OUTPUTTYPE_STDERR); } /** * shishi_server: * * Initializes the Shishi library, and set up, using * shishi_error_set_outputtype(), the library so that future warnings * and informational messages are printed to the syslog. If this * function fails, it may print diagnostic errors to the syslog. * * Return value: Returns Shishi library handle, or %NULL on error. **/ Shishi * shishi_server (void) { return init_handle (SHISHI_OUTPUTTYPE_SYSLOG); } /** * shishi_done: * @handle: shishi handle as allocated by shishi_init(). * * Deallocates the shishi library handle. The handle must not be used * in any calls to shishi functions after this. * * If there is a default tkts, it is written to the default tkts file * (call shishi_tkts_default_file_set() to change the default tkts * file). If you do not wish to write the default tkts file, close the * default tkts with shishi_tkts_done(handle, NULL) before calling * this function. **/ void shishi_done (Shishi * handle) { int rc; if (handle->tkts) { shishi_tkts_to_file (handle->tkts, shishi_tkts_default_file (handle)); shishi_tkts_done (&handle->tkts); } shishi_principal_default_set (handle, NULL); shishi_tkts_default_file_set (handle, NULL); #ifdef USE_STARTTLS rc = _shishi_tls_done (handle); if (rc != SHISHI_OK) shishi_warn (handle, "Cannot deinitialize TLS library"); #endif if (handle->realminfos) { size_t i, j; for (i = 0; i < handle->nrealminfos; i++) { /* XXX free each address */ free (handle->realminfos[i].kdcaddresses); free (handle->realminfos[i].name); for (j = 0; j < handle->realminfos[i].nserverwildcards; j++) free (handle->realminfos[i].serverwildcards[j]); } } free (handle->default_realm); free (handle->usercfgfile); free (handle->hostkeysdefaultfile); free (handle->clientkdcetypes); free (handle->authorizationtypes); free (handle->stringprocess); free (handle->userdirectory); if (handle->asn1) shishi_asn1_done (handle, handle->asn1); free (handle); } static void maybe_install_usercfg (Shishi * handle) { const char *usercfg = shishi_cfg_default_userfile (handle); const char *userdir = shishi_cfg_default_userdirectory (handle); struct stat buf; FILE *fh; FILE *src, *dst; int rc; int c; /* Don't create anything if non-standard home is used. */ if (getenv ("SHISHI_HOME")) return; fh = fopen (usercfg, "r"); if (fh) { fclose (fh); return; } rc = stat (userdir, &buf); if (rc == -1 && errno == ENOENT) { rc = mkdir (userdir, S_IRUSR | S_IWUSR | S_IXUSR); if (rc != 0) shishi_warn (handle, "`%s': %s", userdir, strerror (errno)); } else if (rc != 0) shishi_warn (handle, "`%s': %s", userdir, strerror (errno)); src = fopen (SKELCFGFILE, "r"); if (!src) { shishi_warn (handle, "`%s': %s", SKELCFGFILE, strerror (errno)); return; } dst = fopen (usercfg, "w"); if (!dst) { fclose (src); shishi_warn (handle, "`%s': %s", usercfg, strerror (errno)); return; } while ((c = getc (src)) != EOF) putc (c, dst); fclose (dst); fclose (src); shishi_info (handle, "created `%s'", usercfg); } static int init_read (Shishi * handle, const char *tktsfile, const char *systemcfgfile, const char *usercfgfile) { int rc = SHISHI_OK; /* XXX Is this the correct place for this? */ maybe_install_usercfg (handle); if (!systemcfgfile) systemcfgfile = shishi_cfg_default_systemfile (handle); if (*systemcfgfile) rc = shishi_cfg_from_file (handle, systemcfgfile); if (rc == SHISHI_FOPEN_ERROR) shishi_warn (handle, "%s: %s", systemcfgfile, strerror (errno)); if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR) return rc; if (!usercfgfile) usercfgfile = shishi_cfg_default_userfile (handle); if (*usercfgfile) rc = shishi_cfg_from_file (handle, usercfgfile); if (rc == SHISHI_FOPEN_ERROR) shishi_warn (handle, "%s: %s", usercfgfile, strerror (errno)); if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR) return rc; if (!tktsfile) tktsfile = shishi_tkts_default_file (handle); if (!handle->tkts) rc = shishi_tkts (handle, &handle->tkts); if (rc != SHISHI_OK) return rc; if (*tktsfile) rc = shishi_tkts_from_file (handle->tkts, tktsfile); if (rc == SHISHI_FOPEN_ERROR) shishi_verbose (handle, "%s: %s", tktsfile, strerror (errno)); if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR) return rc; if (VERBOSENOISE (handle)) shishi_cfg_print (handle, stderr); return SHISHI_OK; } /** * shishi_init: * @handle: pointer to handle to be created. * * Create a Shishi library handle, using shishi(), and read the system * configuration file, user configuration file and user tickets from * their default locations. The paths to the system configuration * file is decided at compile time, and is $sysconfdir/shishi.conf. * The user configuration file is $HOME/.shishi/config, and the user * ticket file is $HOME/.shishi/ticket. * * The handle is allocated regardless of return values, except for * SHISHI_HANDLE_ERROR which indicates a problem allocating the * handle. (The other error conditions comes from reading the files.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_init (Shishi ** handle) { if (!handle || !(*handle = shishi ())) return SHISHI_HANDLE_ERROR; return init_read (*handle, shishi_tkts_default_file (*handle), shishi_cfg_default_systemfile (*handle), shishi_cfg_default_userfile (*handle)); } /** * shishi_init_with_paths: * @handle: pointer to handle to be created. * @tktsfile: Filename of ticket file, or NULL. * @systemcfgfile: Filename of system configuration, or NULL. * @usercfgfile: Filename of user configuration, or NULL. * * Create a Shishi library handle, using shishi(), and read the system * configuration file, user configuration file, and user tickets from * the specified locations. If any of @usercfgfile or @systemcfgfile * is NULL, the file is read from its default location, which for the * system configuration file is decided at compile time, and is * $sysconfdir/shishi.conf, and for the user configuration file is * $HOME/.shishi/config. If the ticket file is NULL, a ticket file is * not read at all. * * The handle is allocated regardless of return values, except for * SHISHI_HANDLE_ERROR which indicates a problem allocating the * handle. (The other error conditions comes from reading the files.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_init_with_paths (Shishi ** handle, const char *tktsfile, const char *systemcfgfile, const char *usercfgfile) { if (!handle || !(*handle = shishi ())) return SHISHI_HANDLE_ERROR; shishi_tkts_default_file_set (*handle, tktsfile); return init_read (*handle, tktsfile, systemcfgfile, usercfgfile); } /** * shishi_init_server: * @handle: pointer to handle to be created. * * Create a Shishi library handle, using shishi_server(), and read the * system configuration file. The paths to the system configuration * file is decided at compile time, and is $sysconfdir/shishi.conf. * * The handle is allocated regardless of return values, except for * SHISHI_HANDLE_ERROR which indicates a problem allocating the * handle. (The other error conditions comes from reading the file.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_init_server (Shishi ** handle) { int rc; if (!handle || !(*handle = shishi_server ())) return SHISHI_HANDLE_ERROR; rc = shishi_cfg_from_file (*handle, shishi_cfg_default_systemfile (*handle)); if (rc == SHISHI_FOPEN_ERROR) shishi_warn (*handle, "%s: %s", shishi_cfg_default_systemfile (*handle), strerror (errno)); if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR) return rc; return SHISHI_OK; } /** * shishi_init_server_with_paths: * @handle: pointer to handle to be created. * @systemcfgfile: Filename of system configuration, or NULL. * * Create a Shishi library handle, using shishi_server(), and read the * system configuration file from specified location. The paths to * the system configuration file is decided at compile time, and is * $sysconfdir/shishi.conf. The handle is allocated regardless of * return values, except for SHISHI_HANDLE_ERROR which indicates a * problem allocating the handle. (The other error conditions comes * from reading the file.) * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_init_server_with_paths (Shishi ** handle, const char *systemcfgfile) { int rc; if (!handle || !(*handle = shishi_server ())) return SHISHI_HANDLE_ERROR; if (!systemcfgfile) systemcfgfile = shishi_cfg_default_systemfile (*handle); rc = shishi_cfg_from_file (*handle, systemcfgfile); if (rc == SHISHI_FOPEN_ERROR) shishi_warn (*handle, "%s: %s", systemcfgfile, strerror (errno)); if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR) return rc; return SHISHI_OK; } shishi-1.0.2/lib/keytab.c0000664000000000000000000003605012126660507012074 00000000000000/* keys.c --- Functions for reading /etc/krb5.keytab style key files. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_hexprint, etc. */ #include "utils.h" /** * shishi_keys_add_keytab_mem: * @handle: shishi handle as allocated by shishi_init(). * @data: constant memory buffer with keytab of @len size. * @len: size of memory buffer with keytab data. * @keys: allocated key set to store keys in. * * Read keys from a MIT keytab data structure, and add them to the key * set. * * The format of keytab's is proprietary, and this function support * the 0x0501 and 0x0502 formats. See the section The MIT Kerberos * Keytab Binary File Format in the Shishi manual for a description of * the reverse-engineered format. * * Returns: Returns %SHISHI_KEYTAB_ERROR if the data does not * represent a valid keytab structure, and %SHISHI_OK on success. **/ int shishi_keys_add_keytab_mem (Shishi * handle, const char *data, size_t len, Shishi_keys * keys) { int rc; uint16_t file_format_version; size_t entrystartpos; uint16_t num_components; /* sub 1 if version 0x501 */ size_t i; Shishi_key *key; if (VERBOSENOISE (handle)) { printf ("keytab len %d (0x%x)\n", len, len); _shishi_hexprint (data, len); } /* Check file format. */ file_format_version = (data[0] << 8) | data[1]; if (VERBOSENOISE (handle)) printf ("keytab file_format_version %04X\n", file_format_version); if (file_format_version != 0x0501 && file_format_version != 0x0502) return SHISHI_KEYTAB_ERROR; /* Check file integrity first, to avoid error-checking below. */ entrystartpos = 2; while (entrystartpos < len) { int32_t size = data[entrystartpos] << 24 | data[entrystartpos + 1] << 16 | data[entrystartpos + 2] << 8 | data[entrystartpos + 3]; entrystartpos += 4; if (VERBOSENOISE (handle)) { printf ("keytab size %d (%x)\n", size, size); printf ("keytab pos %d < %d\n", entrystartpos + size, len); } if (entrystartpos + size > len) return SHISHI_KEYTAB_ERROR; /* Go to next entry... */ entrystartpos += size; } if (entrystartpos != len) return SHISHI_KEYTAB_ERROR; rc = shishi_key (handle, &key); if (rc != SHISHI_OK) return rc; entrystartpos = 2; while (entrystartpos < len) { size_t pos = entrystartpos; uint16_t size = data[pos] << 24 | data[pos + 1] << 16 | data[pos + 2] << 8 | data[pos + 3]; pos += 4; if (VERBOSENOISE (handle)) printf ("keytab size %d (%x)\n", size, size); /* Num_components */ num_components = data[pos] << 8 | data[pos + 1]; pos += 2; if (file_format_version == 0x0501) num_components--; /* Realm */ { uint16_t realmlen = data[pos] << 8 | data[pos + 1]; char *realm = xstrndup (&data[pos + 2], realmlen);; pos += 2 + realmlen; shishi_key_realm_set (key, realm); free (realm); } /* Principal components. */ { char *name = NULL; size_t namelen = 0; for (i = 0; i < num_components; i++) { size_t l; l = data[pos] << 8 | data[pos + 1]; pos += 2; name = xrealloc (name, namelen + l + 1); memcpy (name + namelen, &data[pos], l); name[namelen + l] = '/'; namelen += l + 1; pos += l; } name[namelen - 1] = '\0'; shishi_key_principal_set (key, name); free (name); } /* Name_type */ { uint32_t name_type /* not present if version 0x501 */ = data[pos] << 24 | data[pos + 1] << 16 | data[pos + 2] << 8 | data[pos + 3]; pos += 4; if (VERBOSENOISE (handle)) printf ("keytab nametype %d (0x%08x)\n", name_type, name_type); } /* Timestamp */ { uint32_t timestamp = ((data[pos] << 24) & 0xFF000000) | ((data[pos + 1] << 16) & 0xFF0000) | ((data[pos + 2] << 8) & 0xFF00) | ((data[pos + 3] & 0xFF)); time_t t = timestamp; pos += 4; if (VERBOSENOISE (handle)) printf ("keytab timestamp %u (0x%08ux)\n", timestamp, timestamp); shishi_key_timestamp_set (key, t); } /* keyvno8 */ { uint8_t vno8 = data[pos++]; if (VERBOSENOISE (handle)) printf ("keytab kvno8 %d (0x%02x)\n", vno8, vno8); shishi_key_version_set (key, vno8); } /* key, keytype */ { uint32_t keytype = data[pos] << 8 | data[pos + 1]; pos += 2; if (VERBOSENOISE (handle)) printf ("keytab keytype %d (0x%x)\n", keytype, keytype); shishi_key_type_set (key, keytype); } /* key, length and data */ { uint16_t keylen = data[pos] << 8 | data[pos + 1]; pos += 2; if (VERBOSENOISE (handle)) printf ("keytab keylen %d (0x%x) eq? %d\n", keylen, keylen, shishi_key_length (key)); if (VERBOSENOISE (handle)) _shishi_hexprint (data + pos, keylen); shishi_key_value_set (key, data + pos); pos += keylen; } if (pos - entrystartpos < (size_t) size + 4) { uint32_t vno /* only present if >= 4 bytes left in entry */ = data[pos] << 24 | data[pos + 1] << 16 | data[pos + 2] << 8 | data[pos + 3]; pos += 4; if (VERBOSENOISE (handle)) printf ("keytab kvno %d (0x%08x)\n", vno, vno); shishi_key_version_set (key, vno); } if (VERBOSECRYPTONOISE (handle)) shishi_key_print (handle, stdout, key); rc = shishi_keys_add (keys, key); if (rc != SHISHI_OK) goto done; /* Go to next entry... */ entrystartpos += size + 4; } rc = SHISHI_OK; done: shishi_key_done (key); return rc; } /** * shishi_keys_add_keytab_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: name of file to read. * @keys: allocated key set to store keys in. * * Read keys from a MIT keytab data structure from a file, and add the * keys to the key set. * * The format of keytab's is proprietary, and this function support * the 0x0501 and 0x0502 formats. See the section The MIT Kerberos * Keytab Binary File Format in the Shishi manual for a description of * the reverse-engineered format. * * Returns: Returns %SHISHI_IO_ERROR if the file cannot be read, * %SHISHI_KEYTAB_ERROR if the data cannot be parsed as a valid keytab * structure, and %SHISHI_OK on success. **/ int shishi_keys_add_keytab_file (Shishi * handle, const char *filename, Shishi_keys * keys) { size_t len; char *keytab = read_binary_file (filename, &len); int rc; if (!keytab) return SHISHI_IO_ERROR; rc = shishi_keys_add_keytab_mem (handle, keytab, len, keys); free (keytab); return rc; } /** * shishi_keys_from_keytab_mem: * @handle: shishi handle as allocated by shishi_init(). * @data: constant memory buffer with keytab of @len size. * @len: size of memory buffer with keytab data. * @outkeys: pointer to key set that will be allocated and populated, * must be deallocated by caller on succes. * * Create a new key set populated with keys from a MIT keytab data * structure read from a memory block. * * The format of keytab's is proprietary, and this function support * the 0x0501 and 0x0502 formats. See the section The MIT Kerberos * Keytab Binary File Format in the Shishi manual for a description of * the reverse-engineered format. * * Returns: Returns %SHISHI_KEYTAB_ERROR if the data does not * represent a valid keytab structure, and %SHISHI_OK on success. **/ int shishi_keys_from_keytab_mem (Shishi * handle, const char *data, size_t len, Shishi_keys ** outkeys) { int rc; rc = shishi_keys (handle, outkeys); if (rc != SHISHI_OK) return rc; rc = shishi_keys_add_keytab_mem (handle, data, len, *outkeys); if (rc != SHISHI_OK) { shishi_keys_done (outkeys); return rc; } return SHISHI_OK; } /** * shishi_keys_from_keytab_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: name of file to read. * @outkeys: pointer to key set that will be allocated and populated, * must be deallocated by caller on succes. * * Create a new key set populated with keys from a MIT keytab data * structure read from a file. * * The format of keytab's is proprietary, and this function support * the 0x0501 and 0x0502 formats. See the section The MIT Kerberos * Keytab Binary File Format in the Shishi manual for a description of * the reverse-engineered format. * * Returns: Returns %SHISHI_IO_ERROR if the file cannot be read, * %SHISHI_KEYTAB_ERROR if the data cannot be parsed as a valid keytab * structure, and %SHISHI_OK on success. **/ int shishi_keys_from_keytab_file (Shishi * handle, const char *filename, Shishi_keys ** outkeys) { int rc; rc = shishi_keys (handle, outkeys); if (rc != SHISHI_OK) return rc; rc = shishi_keys_add_keytab_file (handle, filename, *outkeys); if (rc != SHISHI_OK) { shishi_keys_done (outkeys); return rc; } return SHISHI_OK; } static int key_to_keytab_entry (Shishi * handle, const Shishi_key * key, char **out, size_t * len) { uint16_t num_components = 0; const char *realm = shishi_key_realm (key); size_t realmlen = strlen (realm); const char *principal = shishi_key_principal (key); uint32_t name_type = SHISHI_NT_PRINCIPAL; time_t timestamp = shishi_key_timestamp (key); uint32_t version = shishi_key_version (key); uint16_t key_type = shishi_key_type (key); size_t key_length = shishi_key_length (key); const char *key_value = shishi_key_value (key); char *tmpname; const char **namebuf; char *tokptr = NULL; char *p; size_t i; if (realmlen > UINT16_MAX) return SHISHI_KEYTAB_ERROR; if (key_length > UINT16_MAX) return SHISHI_KEYTAB_ERROR; /* Reserve room for size, num_components, realm.length, realm, name_type, timestamp, vno8, keyblock.type, keyblock.data.length, keyblock.data, and version. */ *len = 4 + 2 + 2 + realmlen + 4 + 4 + 1 + 2 + 2 + key_length + 4; tmpname = xstrdup (principal); namebuf = xmalloc (sizeof (*namebuf)); for (num_components = 0; (namebuf[num_components] = strtok_r (num_components == 0 ? tmpname : NULL, "/", &tokptr)); num_components++) { size_t length = strlen (namebuf[num_components]); if (length > UINT16_MAX) return SHISHI_KEYTAB_ERROR; *len += 2 + length; namebuf = xrealloc (namebuf, (num_components + 2) * sizeof (*namebuf)); } *out = xmalloc (*len); p = *out; /* Write size. */ p[0] = ((*len - 4) >> 24) & 0xFF; p[1] = ((*len - 4) >> 16) & 0xFF; p[2] = ((*len - 4) >> 8) & 0xFF; p[3] = (*len - 4) & 0xFF; p += 4; /* Write num_components. */ p[0] = (num_components >> 8) & 0xFF; p[1] = num_components & 0xFF; p += 2; /* Write realm.length and realm.data. */ p[0] = (realmlen >> 8) & 0xFF; p[1] = realmlen & 0xFF; p += 2; memcpy (p, realm, realmlen); p += realmlen; for (i = 0; i < num_components; i++) { uint16_t length = strlen (namebuf[i]); p[0] = (length >> 8) & 0xFF; p[1] = length & 0xFF; p += 2; memcpy (p, namebuf[i], length); p += length; } /* Name type */ p[0] = (name_type >> 24) & 0xFF; p[1] = (name_type >> 16) & 0xFF; p[2] = (name_type >> 8) & 0xFF; p[3] = name_type & 0xFF; p += 4; /* Timestamp */ p[0] = (timestamp >> 24) & 0xFF; p[1] = (timestamp >> 16) & 0xFF; p[2] = (timestamp >> 8) & 0xFF; p[3] = timestamp & 0xFF; p += 4; /* Version */ if (version < 256) p[0] = version & 0xFF; else p[0] = 0; /* use vno */ p += 1; /* Key */ p[0] = (key_type >> 8) & 0xFF; p[1] = key_type & 0xFF; p += 2; p[0] = (key_length >> 8) & 0xFF; p[1] = key_length & 0xFF; p += 2; memcpy (p, key_value, key_length); p += key_length; /* Version */ p[0] = (version >> 24) & 0xFF; p[1] = (version >> 16) & 0xFF; p[2] = (version >> 8) & 0xFF; p[3] = version & 0xFF; free (tmpname); free (namebuf); return SHISHI_OK; } /** * shishi_keys_to_keytab_mem: * @handle: shishi handle as allocated by shishi_init(). * @keys: key set to convert to keytab format. * @out: constant memory buffer with keytab of @len size. * @len: size of memory buffer with keytab data. * * Write keys to a MIT keytab data structure. * * The format of keytab's is proprietary, and this function writes the * 0x0502 format. See the section The MIT Kerberos Keytab Binary File * Format in the Shishi manual for a description of the * reverse-engineered format. * * Returns: On success %SHISHI_OK is returned, otherwise an error * code. * * Since: 0.0.42 **/ int shishi_keys_to_keytab_mem (Shishi * handle, Shishi_keys * keys, char **out, size_t * len) { int rc; const Shishi_key *key; int keyno = 0; *out = xmalloc (2); *len = 2; /* Write file format version. */ (*out)[0] = '\x05'; (*out)[1] = '\x02'; while ((key = shishi_keys_nth (keys, keyno++)) != NULL) { char *tmp = NULL; size_t tmplen = 0; rc = key_to_keytab_entry (handle, key, &tmp, &tmplen); if (rc != SHISHI_OK) { free (*out); return rc; } *out = xrealloc (*out, *len + tmplen); memcpy (*out + *len, tmp, tmplen); *len += tmplen; free (tmp); } if (VERBOSENOISE (handle)) { printf ("keys_to_keytab len %d (0x%x)\n", *len, *len); _shishi_hexprint (*out, *len); } return rc; } static int write_binary_file (const char *filename, const char *data, size_t length) { FILE *fh; size_t written; fh = fopen (filename, "wb"); if (!fh) return SHISHI_FOPEN_ERROR; written = fwrite (data, 1, length, fh); if (written != length) return SHISHI_IO_ERROR; return SHISHI_OK; } /** * shishi_keys_to_keytab_file: * @handle: shishi handle as allocated by shishi_init(). * @keys: keyset to write. * @filename: name of file to write. * * Write keys to a MIT keytab data structure. * * The format of keytab's is proprietary, and this function writes the * 0x0502 format. See the section The MIT Kerberos Keytab Binary File * Format in the Shishi manual for a description of the * reverse-engineered format. * * Returns: %SHISHI_FOPEN_ERROR if there is a problem opening * @filename for writing, %SHISHI_IO_ERROR if there is problem * writing the file, and %SHISHI_OK on success. * * Since: 0.0.42 **/ int shishi_keys_to_keytab_file (Shishi * handle, Shishi_keys * keys, const char *filename) { int rc; char *data; size_t len; rc = shishi_keys_to_keytab_mem (handle, keys, &data, &len); if (rc != SHISHI_OK) return rc; rc = write_binary_file (filename, data, len); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } shishi-1.0.2/lib/encticketpart.c0000664000000000000000000002462612126660507013463 00000000000000/* encticketpart.c --- Encrypted ticket part handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" Shishi_asn1 shishi_encticketpart (Shishi * handle) { Shishi_asn1 node; int res; node = shishi_asn1_encticketpart (handle); res = shishi_asn1_write (handle, node, "starttime", NULL, 0); if (res != SHISHI_OK) { shishi_asn1_done (handle, node); return NULL; } res = shishi_asn1_write (handle, node, "renew-till", NULL, 0); if (res != SHISHI_OK) { shishi_asn1_done (handle, node); return NULL; } res = shishi_asn1_write (handle, node, "caddr", NULL, 0); if (res != SHISHI_OK) { shishi_asn1_done (handle, node); return NULL; } res = shishi_asn1_write (handle, node, "authorization-data", NULL, 0); if (res != SHISHI_OK) { shishi_asn1_done (handle, node); return NULL; } res = shishi_encticketpart_flags_set (handle, node, 0); if (res != SHISHI_OK) { shishi_asn1_done (handle, node); return NULL; } return node; } /** * shishi_encticketpart_get_key: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @key: newly allocated key. * * Extract the session key in the Ticket. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_get_key (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key ** key) { int res; char *buf; size_t buflen; int32_t keytype; res = shishi_asn1_read_int32 (handle, encticketpart, "key.keytype", &keytype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, encticketpart, "key.keyvalue", &buf, &buflen); if (res != SHISHI_OK) return res; res = shishi_key_from_value (handle, keytype, buf, key); free (buf); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encticketpart_key_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @key: key handle with information to store in encticketpart. * * Set the EncTicketPart.key field to key type and value of supplied * key. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_key_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key * key) { int res; int keytype; keytype = shishi_key_type (key); res = shishi_asn1_write_uint32 (handle, encticketpart, "key.keytype", keytype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, encticketpart, "key.keyvalue", shishi_key_value (key), shishi_key_length (key)); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encticketpart_flags_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @flags: flags to set in encticketpart. * * Set the EncTicketPart.flags to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_flags_set (Shishi * handle, Shishi_asn1 encticketpart, int flags) { int res; res = shishi_asn1_write_bitstring (handle, encticketpart, "flags", flags); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_encticketpart_crealm (Shishi * handle, Shishi_asn1 encticketpart, char **crealm, size_t * crealmlen) { return shishi_asn1_read (handle, encticketpart, "crealm", crealm, crealmlen); } /** * shishi_encticketpart_crealm_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @realm: input array with name of realm. * * Set the realm field in the KDC-REQ. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encticketpart_crealm_set (Shishi * handle, Shishi_asn1 encticketpart, const char *realm) { int res; res = shishi_asn1_write (handle, encticketpart, "crealm", realm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encticketpart_cname_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @principal: input array with principal name. * * Set the client name field in the EncTicketPart. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encticketpart_cname_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_name_type name_type, const char *principal) { int res; res = shishi_principal_set (handle, encticketpart, "cname", principal); if (res != SHISHI_OK) return res; res = shishi_asn1_write_uint32 (handle, encticketpart, "cname.name-type", name_type); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encticketpart_transited_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @trtype: transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS. * @trdata: actual transited realm data. * @trdatalen: length of actual transited realm data. * * Set the EncTicketPart.transited field to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_transited_set (Shishi * handle, Shishi_asn1 encticketpart, int32_t trtype, const char *trdata, size_t trdatalen) { int res; res = shishi_asn1_write_int32 (handle, encticketpart, "transited.tr-type", trtype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, encticketpart, "transited.contents", trdata, trdatalen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_encticketpart_authtime_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @authtime: character buffer containing a generalized time string. * * Set the EncTicketPart.authtime to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_authtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char *authtime) { int res; res = shishi_asn1_write (handle, encticketpart, "authtime", authtime, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; return SHISHI_OK; } /** * shishi_encticketpart_endtime_set: * @handle: shishi handle as allocated by shishi_init(). * @encticketpart: input EncTicketPart variable. * @endtime: character buffer containing a generalized time string. * * Set the EncTicketPart.endtime to supplied value. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_encticketpart_endtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char *endtime) { int res; res = shishi_asn1_write (handle, encticketpart, "endtime", endtime, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } int shishi_encticketpart_authtime (Shishi * handle, Shishi_asn1 encticketpart, char *authtime, size_t * authtimelen) { return shishi_asn1_read_inline (handle, encticketpart, "authtime", authtime, authtimelen); } time_t shishi_encticketpart_authctime (Shishi * handle, Shishi_asn1 encticketpart) { char authtime[SHISHI_GENERALIZEDTIME_LENGTH + 1]; size_t authtimelen; time_t t; int res; authtimelen = sizeof (authtime); res = shishi_encticketpart_authtime (handle, encticketpart, authtime, &authtimelen); if (res != SHISHI_OK) return (time_t) - 1; authtime[SHISHI_GENERALIZEDTIME_LENGTH] = '\0'; t = shishi_generalize_ctime (handle, authtime); return t; } /** * shishi_encticketpart_client: * @handle: Shishi library handle create by shishi_init(). * @encticketpart: EncTicketPart variable to get client name from. * @client: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Represent client principal name in EncTicketPart as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @clientlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encticketpart_client (Shishi * handle, Shishi_asn1 encticketpart, char **client, size_t * clientlen) { return shishi_principal_name (handle, encticketpart, "cname", client, clientlen); } /** * shishi_encticketpart_clientrealm: * @handle: Shishi library handle create by shishi_init(). * @encticketpart: EncTicketPart variable to get client name and realm from. * @client: pointer to newly allocated zero terminated string containing * principal name and realm. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Convert cname and realm fields from EncTicketPart to printable * principal name format. The string is allocate by this function, * and it is the responsibility of the caller to deallocate it. Note * that the output length @clientlen does not include the terminating * zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_encticketpart_clientrealm (Shishi * handle, Shishi_asn1 encticketpart, char **client, size_t * clientlen) { return shishi_principal_name_realm (handle, encticketpart, "cname", encticketpart, "crealm", client, clientlen); } shishi-1.0.2/lib/diskio.c0000664000000000000000000006104412126660507012100 00000000000000/* diskio.c --- Read and write data structures from disk. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* XXX oh, please, rewrite this file. */ #include "internal.h" #include "diskio.h" #define HEADERBEG "-----BEGIN SHISHI %s-----" #define HEADEREND "-----END SHISHI %s-----" #define BUFSIZE 5000 /* * Note to self: if you change any *print* function, remember to change * the corresponding *parse* function too. * */ static char * armor_data (const char *data, size_t len, const char *armortype, const char *armorheaders) { /* Must be a multiple of 4. */ #define WRAP_COL 64 char *armorbegin, *armorend; char *b64data, *out; size_t wrapb64len = BASE64_LENGTH (len) + BASE64_LENGTH (len) / WRAP_COL + 1; size_t i; b64data = xmalloc (wrapb64len + 1); for (i = 0; i <= BASE64_LENGTH (len) / WRAP_COL; i++) { size_t readpos = i * WRAP_COL * 3 / 4; size_t nread = WRAP_COL * 3 / 4; size_t storepos = i * WRAP_COL + i; size_t nstore = WRAP_COL; if (readpos >= len) break; if (readpos + nread >= len) { nread = len - readpos; nstore = BASE64_LENGTH (nread); } base64_encode (data + readpos, nread, b64data + storepos, nstore); b64data[storepos + nstore] = '\n'; b64data[storepos + nstore + 1] = '\0'; #if 0 printf ("alloc %d len %d curlen %d " "readpos %d nread %d storepos %d nstore %d\n", wrapb64len + 1, len, strlen (b64data), readpos, nread, storepos, nstore); #endif } armorbegin = xasprintf (HEADERBEG, armortype); armorend = xasprintf (HEADEREND, armortype); out = xasprintf ("%s\n%s%s%s%s\n", armorbegin, armorheaders ? armorheaders : "", armorheaders ? "\n" : "", b64data, armorend); free (b64data); free (armorend); free (armorbegin); return out; } static char * armor_asn1 (Shishi * handle, Shishi_asn1 asn1, const char *armortype, const char *armorheaders) { char *der; size_t derlen; char *out; int rc; rc = shishi_asn1_to_der (handle, asn1, &der, &derlen); if (rc != SHISHI_OK) return NULL; out = armor_data (der, derlen, armortype, armorheaders); free (der); return out; } int _shishi_print_armored_data (Shishi * handle, FILE * fh, Shishi_asn1 asn1, const char *asn1type, char *headers) { char *data = armor_asn1 (handle, asn1, asn1type, headers); shishi_asn1_print (handle, asn1, fh); fprintf (fh, "%s\n", data); free (data); return SHISHI_OK; } int _shishi_save_data (Shishi * handle, FILE * fh, Shishi_asn1 asn1, const char *asn1type) { char *der; size_t derlen; size_t i; int res; res = shishi_asn1_to_der_field (handle, asn1, asn1type, &der, &derlen); if (res != SHISHI_OK) return res; i = fwrite (der, sizeof (der[0]), derlen, fh); if (i != derlen) return SHISHI_IO_ERROR; return SHISHI_OK; } int shishi_padata_print (Shishi * handle, FILE * fh, Shishi_asn1 padata) { return _shishi_print_armored_data (handle, fh, padata, "PA-DATA", NULL); } int shishi_methoddata_print (Shishi * handle, FILE * fh, Shishi_asn1 methoddata) { return _shishi_print_armored_data (handle, fh, methoddata, "METHOD-DATA", NULL); } int shishi_etype_info_print (Shishi * handle, FILE * fh, Shishi_asn1 etypeinfo) { return _shishi_print_armored_data (handle, fh, etypeinfo, "ETYPE-INFO", NULL); } int shishi_etype_info2_print (Shishi * handle, FILE * fh, Shishi_asn1 etypeinfo2) { return _shishi_print_armored_data (handle, fh, etypeinfo2, "ETYPE-INFO2", NULL); } int shishi_enckdcreppart_print (Shishi * handle, FILE * fh, Shishi_asn1 enckdcreppart) { return _shishi_print_armored_data (handle, fh, enckdcreppart, "EncKDCRepPart", NULL); } int shishi_enckdcreppart_save (Shishi * handle, FILE * fh, Shishi_asn1 enckdcreppart) { return _shishi_save_data (handle, fh, enckdcreppart, "EncKDCRepPart"); } int shishi_ticket_save (Shishi * handle, FILE * fh, Shishi_asn1 ticket) { return _shishi_save_data (handle, fh, ticket, "Ticket"); } int shishi_ticket_print (Shishi * handle, FILE * fh, Shishi_asn1 ticket) { return _shishi_print_armored_data (handle, fh, ticket, "Ticket", NULL); } int shishi_encticketpart_print (Shishi * handle, FILE * fh, Shishi_asn1 encticketpart) { return _shishi_print_armored_data (handle, fh, encticketpart, "EncTicketPart", NULL); } static int _shishi_read_armored_data (Shishi * handle, FILE * fh, char *buffer, size_t len, const char *tag) { char *line = NULL; size_t linelen = 0; char *armorbegin, *armorend; int phase = 0; int res = SHISHI_OK; armorbegin = xasprintf (HEADERBEG, tag); armorend = xasprintf (HEADEREND, tag); while (getline (&line, &linelen, fh) > 0) { while (*line && strchr ("\n\r\t ", line[strlen (line) - 1])) line[strlen (line) - 1] = '\0'; if (phase == 1) { if (strcmp (line, armorend) == 0) { phase = 2; break; } } else { if (strcmp (line, armorbegin) == 0) phase = 1; continue; } if (len <= strlen (line)) { res = SHISHI_TOO_SMALL_BUFFER; goto done; } memcpy (buffer, line, strlen (line)); buffer += strlen (line); len -= strlen (line); } if (len == 0) res = SHISHI_TOO_SMALL_BUFFER; else *buffer = '\0'; if (phase != 2) res = SHISHI_IO_ERROR; done: free (armorbegin); free (armorend); free (line); return res; } static int _shishi_ticket_input (Shishi * handle, FILE * fh, Shishi_asn1 * ticket, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "Ticket"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *ticket = shishi_der2asn1_ticket (handle, der, derlen); if (*ticket == NULL) return SHISHI_ASN1_ERROR; return SHISHI_OK; } int shishi_ticket_parse (Shishi * handle, FILE * fh, Shishi_asn1 * ticket) { return _shishi_ticket_input (handle, fh, ticket, 0); } int shishi_ticket_read (Shishi * handle, FILE * fh, Shishi_asn1 * ticket) { return _shishi_ticket_input (handle, fh, ticket, 1); } static int _shishi_enckdcreppart_input (Shishi * handle, FILE * fh, Shishi_asn1 * enckdcreppart, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "EncKDCRepPart"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *enckdcreppart = shishi_der2asn1_encasreppart (handle, der, derlen); if (*enckdcreppart == NULL) { shishi_error_printf (handle, "Could not DER decode Encasreppart: %s", shishi_error (handle)); *enckdcreppart = shishi_der2asn1_enctgsreppart (handle, der, derlen); if (*enckdcreppart == NULL) { shishi_error_printf (handle, "Could not DER decode Enctgsreppart: %s", shishi_error (handle)); *enckdcreppart = shishi_der2asn1_enckdcreppart (handle, der, derlen); if (*enckdcreppart == NULL) { shishi_error_printf (handle, "Could not DER decode Enckdcreppart: %s", shishi_error (handle)); return !SHISHI_OK; } } } return SHISHI_OK; } int shishi_enckdcreppart_parse (Shishi * handle, FILE * fh, Shishi_asn1 * enckdcreppart) { return _shishi_enckdcreppart_input (handle, fh, enckdcreppart, 0); } int shishi_enckdcreppart_read (Shishi * handle, FILE * fh, Shishi_asn1 * enckdcreppart) { return _shishi_enckdcreppart_input (handle, fh, enckdcreppart, 1); } int _shishi_kdcreq_input (Shishi * handle, FILE * fh, Shishi_asn1 * asreq, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "KDC-REQ"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *asreq = shishi_der2asn1_asreq (handle, der, derlen); if (*asreq == NULL) { printf ("bad asreq magic\n"); shishi_error_printf (handle, "Could not DER decode AS-REQ\n"); *asreq = shishi_der2asn1_tgsreq (handle, der, derlen); if (*asreq == NULL) { printf ("bad tgsreq magic\n"); shishi_error_printf (handle, "Could not DER decode TGS-REQ\n"); *asreq = shishi_der2asn1_kdcreq (handle, der, derlen); if (*asreq == NULL) { printf ("bad kdcreq magic\n"); shishi_error_printf (handle, "Could not DER decode KDC-REQ\n"); return !SHISHI_OK; } } } return SHISHI_OK; } int _shishi_kdcrep_input (Shishi * handle, FILE * fh, Shishi_asn1 * asrep, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "KDC-REP"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *asrep = shishi_der2asn1_asrep (handle, der, derlen); if (*asrep == NULL) { *asrep = shishi_der2asn1_tgsrep (handle, der, derlen); if (*asrep == NULL) { printf ("Could not DER decode KDC-REP: %s\n", shishi_error (handle)); printf ("Parsing AS/TGS-REP as KDC-REP (bug work around)\n"); *asrep = shishi_der2asn1_kdcrep (handle, der, derlen); if (*asrep == NULL) { fprintf (stderr, "Could not DER decode KDC-REP: %s\n", shishi_error (handle)); return !SHISHI_OK; } fprintf (stderr, "Bug workaround code successful...\n"); } } return SHISHI_OK; } int _shishi_apreq_input (Shishi * handle, FILE * fh, Shishi_asn1 * apreq, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "AP-REQ"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *apreq = shishi_der2asn1_apreq (handle, der, derlen); if (*apreq == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode AP-REQ\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_aprep_input (Shishi * handle, FILE * fh, Shishi_asn1 * aprep, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "AP-REP"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *aprep = shishi_der2asn1_aprep (handle, der, derlen); if (*aprep == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode AP-REP\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_encapreppart_input (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "EncAPRepPart"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *encapreppart = shishi_der2asn1_encapreppart (handle, der, derlen); if (*encapreppart == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode EncAPRepPart\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_authenticator_input (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "Authenticator"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *authenticator = shishi_der2asn1_authenticator (handle, der, derlen); if (*authenticator == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode AP-REQ\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_krberror_input (Shishi * handle, FILE * fh, Shishi_asn1 * krberror, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "KRB-ERROR"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *krberror = shishi_der2asn1_krberror (handle, der, derlen); if (*krberror == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode AP-REQ\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_safe_input (Shishi * handle, FILE * fh, Shishi_asn1 * safe, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "KRB-SAFE"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *safe = shishi_der2asn1_krbsafe (handle, der, derlen); if (*safe == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode KRB-SAFE\n"); return !SHISHI_OK; } return SHISHI_OK; } int _shishi_priv_input (Shishi * handle, FILE * fh, Shishi_asn1 * priv, int type) { char der[BUFSIZE]; size_t derlen; char b64der[BUFSIZE]; size_t b64len = 0; int res; if (type == 0) { b64len = sizeof (b64der); res = _shishi_read_armored_data (handle, fh, b64der, b64len, "KRB-PRIV"); if (res != SHISHI_OK) { shishi_error_printf (handle, "armor data read fail\n"); return res; } derlen = sizeof (der); if (!base64_decode (b64der, strlen (b64der), der, &derlen)) return SHISHI_BASE64_ERROR; } else { derlen = fread (der, sizeof (der[0]), sizeof (der) / sizeof (der[0]), fh); if (derlen <= 0 || !feof (fh) || ferror (fh)) { shishi_error_printf (handle, "Error reading from file (got %ld bytes)...", derlen); return !SHISHI_OK; } } *priv = shishi_der2asn1_priv (handle, der, derlen); if (*priv == NULL) { printf ("bad magic %s\n", shishi_error (handle)); shishi_error_printf (handle, "Could not DER decode KRB-PRIV\n"); return !SHISHI_OK; } return SHISHI_OK; } int shishi_key_parse (Shishi * handle, FILE * fh, Shishi_key ** key) { int lno = 0; char line[BUFSIZE]; char *b64buffer; char armorbegin[BUFSIZE]; char armorend[BUFSIZE]; int in_key = 0, in_body = 0; int res; Shishi_key *lkey = NULL; sprintf (armorbegin, HEADERBEG, "KEY"); sprintf (armorend, HEADEREND, "KEY"); while (fgets (line, sizeof (line), fh)) { lno++; line[sizeof (line) - 1] = '\0'; if (!*line || line[strlen (line) - 1] != '\n') { fprintf (stderr, "input line %u too long or missing LF\n", lno); continue; } line[strlen (line) - 1] = '\0'; if (VERBOSENOISE (handle)) printf ("line %d read %ld bytes: %s\n", lno, strlen (line), line); if (!in_key) { in_key = strncmp (line, armorbegin, strlen (armorbegin)) == 0; if (in_key) { res = shishi_key (handle, &lkey); if (res != SHISHI_OK) return res; } continue; } if (strcmp (line, armorend) == 0) break; if (in_body) { int ok = base64_decode_alloc (line, strlen (line), &b64buffer, NULL); if (!ok) return SHISHI_BASE64_ERROR; shishi_key_value_set (lkey, b64buffer); } else { if (strcmp (line, "") == 0 || strcmp (line, " ") == 0) in_body = 1; if (strncmp (line, "Keytype: ", strlen ("Keytype: ")) == 0) { int type; if (sscanf (line, "Keytype: %d (", &type) == 1) shishi_key_type_set (lkey, type); } else if (strncmp (line, "Key-Version-Number: ", strlen ("Key-Version-Number: ")) == 0) { int type; if (sscanf (line, "Key-Version-Number: %d", &type) == 1) shishi_key_version_set (lkey, type); } else if (strncmp (line, "Realm: ", strlen ("Realm: ")) == 0) { shishi_key_realm_set (lkey, line + strlen ("Realm: ")); } else if (strncmp (line, "Principal: ", strlen ("Principal: ")) == 0) { shishi_key_principal_set (lkey, line + strlen ("Principal: ")); } } } if (!lkey) return SHISHI_OK; *key = lkey; return SHISHI_OK; } /** * shishi_key_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle opened for writing. * @key: key to print. * * Print an ASCII representation of a key structure to file * descriptor. Example output: * * -----BEGIN SHISHI KEY----- * Keytype: 18 (aes256-cts-hmac-sha1-96) * Principal: host/latte.josefsson.org * Realm: JOSEFSSON.ORG * Key-Version-Number: 1 * * P1QdeW/oSiag/bTyVEBAY2msiGSTmgLXlopuCKoppDs= * -----END SHISHI KEY----- * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_print (Shishi * handle, FILE * fh, const Shishi_key * key) { char *b64key; size_t i; base64_encode_alloc (shishi_key_value (key), shishi_key_length (key), &b64key); if (!b64key) return SHISHI_MALLOC_ERROR; fprintf (fh, HEADERBEG "\n", "KEY"); fprintf (fh, "Keytype: %d (%s)\n", shishi_key_type (key), shishi_cipher_name (shishi_key_type (key))); if (shishi_key_principal (key)) fprintf (fh, "Principal: %s\n", shishi_key_principal (key)); if (shishi_key_realm (key)) fprintf (fh, "Realm: %s\n", shishi_key_realm (key)); if (shishi_key_version (key) != UINT32_MAX) fprintf (fh, "Key-Version-Number: %d\n", shishi_key_version (key)); fprintf (fh, "\n"); for (i = 0; i < strlen (b64key); i++) { fprintf (fh, "%c", b64key[i]); if ((i + 1) % 64 == 0) fprintf (fh, "\n"); } if ((i + 1) % 64 != 0) fprintf (fh, "\n"); free (b64key); #if 0 if (VERBOSENOISE (handle)) { for (i = 0; i < shishi_key_length (key); i++) fprintf (stdout, "%02x", shishi_key_value (key)[i] & 0xFF); fprintf (stdout, "\n"); } #endif fprintf (fh, HEADEREND "\n", "KEY"); return SHISHI_OK; } /** * shishi_key_to_file: * @handle: shishi handle as allocated by shishi_init(). * @filename: filename to append key to. * @key: key to print. * * Print an ASCII representation of a key structure to a file. The * file is appended to if it exists. See shishi_key_print() for * format of output. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_key_to_file (Shishi * handle, const char *filename, Shishi_key * key) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing KEY to %s...\n"), filename); fh = fopen (filename, "a"); if (fh == NULL) return SHISHI_FOPEN_ERROR; res = shishi_key_print (handle, fh, key); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing KEY to %s...done\n"), filename); return SHISHI_OK; } shishi-1.0.2/lib/hostkeys.c0000664000000000000000000001131412126660507012462 00000000000000/* hostkeys.c --- Functions for managing hostkeys stored in files. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /** * shishi_hostkeys_default_file: * @handle: Shishi library handle create by shishi_init(). * * Get file name of default host key file. * * Return value: Returns the default host key filename used in the * library. (Not a copy of it, so don't modify or deallocate it.) **/ const char * shishi_hostkeys_default_file (Shishi * handle) { char *envfile; envfile = getenv ("SHISHI_KEYS"); if (envfile) shishi_hostkeys_default_file_set (handle, envfile); if (!handle->hostkeysdefaultfile) handle->hostkeysdefaultfile = xstrdup (HOSTKEYSFILE); return handle->hostkeysdefaultfile; } /** * shishi_hostkeys_default_file_set: * @handle: Shishi library handle create by shishi_init(). * @hostkeysfile: string with new default hostkeys file name, or * NULL to reset to default. * * Set the default host key filename used in the library. The * string is copied into the library, so you can dispose of the * variable immediately after calling this function. **/ void shishi_hostkeys_default_file_set (Shishi * handle, const char *hostkeysfile) { free (handle->hostkeysdefaultfile); if (hostkeysfile) handle->hostkeysdefaultfile = xstrdup (hostkeysfile); else handle->hostkeysdefaultfile = NULL; } /** * shishi_hostkeys_for_server * @handle: Shishi library handle create by shishi_init(). * @server: server name to get key for * * Get host key for @server. * * Return value: Returns the key for specific server, read from the * default host keys file (see shishi_hostkeys_default_file()), or * NULL if no key could be found or an error encountered. **/ Shishi_key * shishi_hostkeys_for_server (Shishi * handle, const char *server) { return shishi_keys_for_server_in_file (handle, shishi_hostkeys_default_file (handle), server); } /** * shishi_hostkeys_for_serverrealm * @handle: Shishi library handle create by shishi_init(). * @server: server name to get key for * @realm: realm of server to get key for. * * Get host key for @server in @realm. * * Return value: Returns the key for specific server and realm, read * from the default host keys file (see * shishi_hostkeys_default_file()), or NULL if no key could be found * or an error encountered. **/ Shishi_key * shishi_hostkeys_for_serverrealm (Shishi * handle, const char *server, const char *realm) { return shishi_keys_for_serverrealm_in_file (handle, shishi_hostkeys_default_file (handle), server, realm); } /** * shishi_hostkeys_for_localservicerealm * @handle: Shishi library handle create by shishi_init(). * @service: service to get key for. * @realm: realm of server to get key for, or NULL for default realm. * * Get host key for @service on current host in @realm. * * Return value: Returns the key for the server * "SERVICE/HOSTNAME@REALM" (where HOSTNAME is the current system's * hostname), read from the default host keys file (see * shishi_hostkeys_default_file()), or NULL if no key could be found * or an error encountered. **/ Shishi_key * shishi_hostkeys_for_localservicerealm (Shishi * handle, const char *service, const char *realm) { return shishi_keys_for_localservicerealm_in_file (handle, shishi_hostkeys_default_file (handle), service, realm); } /** * shishi_hostkeys_for_localservice * @handle: Shishi library handle create by shishi_init(). * @service: service to get key for. * * Get host key for @service on current host in default realm. * * Return value: Returns the key for the server "SERVICE/HOSTNAME" * (where HOSTNAME is the current system's hostname), read from the * default host keys file (see shishi_hostkeys_default_file()), or * NULL if no key could be found or an error encountered. **/ Shishi_key * shishi_hostkeys_for_localservice (Shishi * handle, const char *service) { return shishi_hostkeys_for_localservicerealm (handle, service, NULL); } shishi-1.0.2/lib/ccache.h0000664000000000000000000000507112126660507012027 00000000000000/* ccache.h --- Read MIT style Kerberos Credential Cache file. * Copyright (C) 2006-2013 Simon Josefsson * * This file 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 file 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 file; if not, see http://www.gnu.org/licenses or * write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA * */ #ifndef CCACHE_H #define CCACHE_H 1 #include #include #define CCACHE_MAX_COMPONENTS 5 #define CCACHE_MAX_KEYLEN 32 struct ccache_header { uint16_t tag; uint16_t taglen; char *tagdata; }; struct ccache_buffer { uint32_t length; char *data; }; struct ccache_principal { uint32_t name_type; uint32_t num_components; struct ccache_buffer realm; struct ccache_buffer components[CCACHE_MAX_COMPONENTS]; }; struct ccache_keyblock { uint16_t keytype; uint16_t etype; uint16_t keylen; char *keyvalue; char storage[CCACHE_MAX_KEYLEN]; /* usable by caller for storing keys that keyvalue point to. */ }; struct ccache_credential { struct ccache_principal client; struct ccache_principal server; struct ccache_keyblock key; uint32_t authtime; uint32_t starttime; uint32_t endtime; uint32_t renew_till; uint8_t is_skey; uint32_t tktflags; struct ccache_buffer ticket; struct ccache_buffer second_ticket; }; struct ccache { uint16_t file_format_version; uint16_t headerlen; char *header; struct ccache_principal default_principal; size_t credentialslen; char *credentials; }; extern int ccache_parse (const char *data, size_t length, struct ccache *out); extern int ccache_parse_credential (const char *data, size_t len, struct ccache_credential *out, size_t * n); extern int ccache_pack (struct ccache *info, char *data, size_t * len); extern int ccache_pack_credential (struct ccache_credential *cred, char *out, size_t * len); extern void ccache_print (struct ccache *ccache); extern void ccache_print_principal (struct ccache_principal *princ); extern void ccache_print_credential (struct ccache_credential *cred); #endif /* CCACHE_H */ shishi-1.0.2/lib/authenticator.c0000664000000000000000000007200312126660507013465 00000000000000/* authenticator.c --- Functions for authenticators. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" /* Get _shishi_print_armored_data, etc. */ #include "diskio.h" /** * shishi_authenticator: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new Authenticator, populated with some * default values. It uses the current time as returned by the system * for the ctime and cusec fields. * * Return value: Returns the authenticator or NULL on * failure. **/ Shishi_asn1 shishi_authenticator (Shishi * handle) { int res; Shishi_asn1 node = NULL; struct timeval tv; uint32_t seqnr; res = gettimeofday (&tv, NULL); if (res != 0) return NULL; node = shishi_asn1_authenticator (handle); if (!node) return NULL; res = shishi_asn1_write (handle, node, "authenticator-vno", "5", 0); if (res != SHISHI_OK) goto error; res = shishi_authenticator_set_crealm (handle, node, shishi_realm_default (handle)); if (res != SHISHI_OK) goto error; res = shishi_authenticator_client_set (handle, node, shishi_principal_default (handle)); if (res != SHISHI_OK) goto error; res = shishi_authenticator_cusec_set (handle, node, tv.tv_usec % 1000000); if (res != SHISHI_OK) goto error; res = shishi_asn1_write (handle, node, "ctime", shishi_generalize_time (handle, time (NULL)), 0); if (res != SHISHI_OK) goto error; /* * For sequence numbers to adequately support the detection of * replays they SHOULD be non-repeating, even across connection * boundaries. The initial sequence number SHOULD be random and * uniformly distributed across the full space of possible sequence * numbers, so that it cannot be guessed by an attacker and so that * it and the successive sequence numbers do not repeat other * sequences. */ shishi_randomize (handle, 0, &seqnr, sizeof (seqnr)); /* XXX remove once libtasn1 _asn1_convert_integer is fixed. */ seqnr &= 0x7FFFFFFF; /* * Implementation note: as noted before, some implementations omit * the optional sequence number when its value would be zero. * Implementations MAY accept an omitted sequence number when * expecting a value of zero, and SHOULD NOT transmit an * Authenticator with a initial sequence number of zero. */ if (seqnr == 0) seqnr++; res = shishi_authenticator_seqnumber_set (handle, node, seqnr); if (res != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_authenticator_subkey: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new Authenticator, populated with some * default values. It uses the current time as returned by the system * for the ctime and cusec fields. It adds a random subkey. * * Return value: Returns the authenticator or NULL on * failure. **/ Shishi_asn1 shishi_authenticator_subkey (Shishi * handle) { Shishi_asn1 node; int res; node = shishi_authenticator (handle); if (node == NULL) return NULL; res = shishi_authenticator_add_random_subkey (handle, node); if (res != SHISHI_OK) return NULL; return node; } /** * shishi_authenticator_print: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @authenticator: authenticator as allocated by shishi_authenticator(). * * Print ASCII armored DER encoding of authenticator to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_print (Shishi * handle, FILE * fh, Shishi_asn1 authenticator) { return _shishi_print_armored_data (handle, fh, authenticator, "Authenticator", NULL); } /** * shishi_authenticator_save: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for writing. * @authenticator: authenticator as allocated by shishi_authenticator(). * * Save DER encoding of authenticator to file. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_save (Shishi * handle, FILE * fh, Shishi_asn1 authenticator) { return _shishi_save_data (handle, fh, authenticator, "Authenticator"); } /** * shishi_authenticator_to_file: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator to save. * @filetype: input variable specifying type of file to be written, * see Shishi_filetype. * @filename: input variable with filename to write to. * * Write Authenticator to file in specified TYPE. The file will be * truncated if it exists. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_to_file (Shishi * handle, Shishi_asn1 authenticator, int filetype, const char *filename) { FILE *fh; int res; if (VERBOSE (handle)) printf (_("Writing Authenticator to %s...\n"), filename); fh = fopen (filename, "w"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Writing Authenticator in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_authenticator_print (handle, fh, authenticator); else res = shishi_authenticator_save (handle, fh, authenticator); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Writing Authenticator to %s...done\n"), filename); return SHISHI_OK; } /** * shishi_authenticator_parse: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @authenticator: output variable with newly allocated authenticator. * * Read ASCII armored DER encoded authenticator from file and populate * given authenticator variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_parse (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator) { return _shishi_authenticator_input (handle, fh, authenticator, 0); } /** * shishi_authenticator_read: * @handle: shishi handle as allocated by shishi_init(). * @fh: file handle open for reading. * @authenticator: output variable with newly allocated authenticator. * * Read DER encoded authenticator from file and populate given * authenticator variable. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_read (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator) { return _shishi_authenticator_input (handle, fh, authenticator, 1); } /** * shishi_authenticator_from_file: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: output variable with newly allocated Authenticator. * @filetype: input variable specifying type of file to be read, * see Shishi_filetype. * @filename: input variable with filename to read from. * * Read Authenticator from file in specified TYPE. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_from_file (Shishi * handle, Shishi_asn1 * authenticator, int filetype, const char *filename) { int res; FILE *fh; if (VERBOSE (handle)) printf (_("Reading Authenticator from %s...\n"), filename); fh = fopen (filename, "r"); if (fh == NULL) return SHISHI_FOPEN_ERROR; if (VERBOSE (handle)) printf (_("Reading Authenticator in %s format...\n"), filetype == SHISHI_FILETYPE_TEXT ? "TEXT" : "DER"); if (filetype == SHISHI_FILETYPE_TEXT) res = shishi_authenticator_parse (handle, fh, authenticator); else res = shishi_authenticator_read (handle, fh, authenticator); if (res != SHISHI_OK) return res; res = fclose (fh); if (res != 0) return SHISHI_IO_ERROR; if (VERBOSE (handle)) printf (_("Reading Authenticator from %s...done\n"), filename); return SHISHI_OK; } /** * shishi_authenticator_set_crealm: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @crealm: input array with realm. * * Set realm field in authenticator to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_set_crealm (Shishi * handle, Shishi_asn1 authenticator, const char *crealm) { int res; res = shishi_asn1_write (handle, authenticator, "crealm", crealm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_set_cname: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @cname: input array with principal name. * * Set principal field in authenticator to specified value. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_set_cname (Shishi * handle, Shishi_asn1 authenticator, Shishi_name_type name_type, const char *cname[]) { int res; res = shishi_principal_name_set (handle, authenticator, "cname", name_type, cname); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_client_set: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator to set client name field in. * @client: zero-terminated string with principal name on RFC 1964 form. * * Set the client name field in the Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_client_set (Shishi * handle, Shishi_asn1 authenticator, const char *client) { int res; res = shishi_principal_set (handle, authenticator, "cname", client); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_ctime: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator as allocated by shishi_authenticator(). * @t: newly allocated zero-terminated character array with client time. * * Extract client time from Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_ctime (Shishi * handle, Shishi_asn1 authenticator, char **t) { return shishi_time (handle, authenticator, "ctime", t); } /** * shishi_authenticator_ctime_set: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator as allocated by shishi_authenticator(). * @t: string with generalized time value to store in Authenticator. * * Store client time in Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_ctime_set (Shishi * handle, Shishi_asn1 authenticator, const char *t) { int res; res = shishi_asn1_write (handle, authenticator, "ctime", t, SHISHI_GENERALIZEDTIME_LENGTH); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_cusec_get: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator as allocated by shishi_authenticator(). * @cusec: output integer with client microseconds field. * * Extract client microseconds field from Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_cusec_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * cusec) { int res; res = shishi_asn1_read_uint32 (handle, authenticator, "cusec", cusec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_cusec_set: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @cusec: client microseconds to set in authenticator, 0-999999. * * Set the cusec field in the Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_cusec_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t cusec) { int res; res = shishi_asn1_write_uint32 (handle, authenticator, "cusec", cusec); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_seqnumber_get: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @seqnumber: output integer with sequence number field. * * Extract sequence number field from Authenticator. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_authenticator_seqnumber_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * seqnumber) { int res; res = shishi_asn1_read_uint32 (handle, authenticator, "seq-number", seqnumber); if (res != SHISHI_OK) return res; return res; } /** * shishi_authenticator_seqnumber_remove: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * * Remove sequence number field in Authenticator. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_authenticator_seqnumber_remove (Shishi * handle, Shishi_asn1 authenticator) { int res; res = shishi_asn1_write (handle, authenticator, "seq-number", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_seqnumber_set: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @seqnumber: integer with sequence number field to store in Authenticator. * * Store sequence number field in Authenticator. * * Return value: Returns %SHISHI_OK iff successful. **/ int shishi_authenticator_seqnumber_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t seqnumber) { int res; res = shishi_asn1_write_uint32 (handle, authenticator, "seq-number", seqnumber); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_client: * @handle: Shishi library handle create by shishi_init(). * @authenticator: Authenticator variable to get client name from. * @client: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Represent client principal name in Authenticator as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @clientlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_client (Shishi * handle, Shishi_asn1 authenticator, char **client, size_t * clientlen) { return shishi_principal_name (handle, authenticator, "cname", client, clientlen); } /** * shishi_authenticator_clientrealm: * @handle: Shishi library handle create by shishi_init(). * @authenticator: Authenticator variable to get client name and realm from. * @client: pointer to newly allocated zero terminated string containing * principal name and realm. May be %NULL (to only populate @clientlen). * @clientlen: pointer to length of @client on output, excluding terminating * zero. May be %NULL (to only populate @client). * * Convert cname and realm fields from Authenticator to printable * principal name format. The string is allocate by this function, * and it is the responsibility of the caller to deallocate it. Note * that the output length @clientlen does not include the terminating * zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_clientrealm (Shishi * handle, Shishi_asn1 authenticator, char **client, size_t * clientlen) { return shishi_principal_name_realm (handle, authenticator, "cname", authenticator, "crealm", client, clientlen); } int shishi_authenticator_remove_cksum (Shishi * handle, Shishi_asn1 authenticator) { int res; /* XXX remove this function */ res = shishi_asn1_write (handle, authenticator, "cksum", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_cksum: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @cksumtype: output checksum type. * @cksum: newly allocated output checksum data from authenticator. * @cksumlen: on output, actual size of allocated output checksum data buffer. * * Read checksum value from authenticator. @cksum is allocated by * this function, and it is the responsibility of caller to deallocate * it. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_cksum (Shishi * handle, Shishi_asn1 authenticator, int32_t * cksumtype, char **cksum, size_t * cksumlen) { int res; res = shishi_asn1_read_int32 (handle, authenticator, "cksum.cksumtype", cksumtype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, authenticator, "cksum.checksum", cksum, cksumlen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_set_cksum: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @cksumtype: input checksum type to store in authenticator. * @cksum: input checksum data to store in authenticator. * @cksumlen: size of input checksum data to store in authenticator. * * Store checksum value in authenticator. A checksum is usually created * by calling shishi_checksum() on some application specific data using * the key from the ticket that is being used. To save time, you may * want to use shishi_authenticator_add_cksum() instead, which calculates * the checksum and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_set_cksum (Shishi * handle, Shishi_asn1 authenticator, int32_t cksumtype, char *cksum, size_t cksumlen) { int res; res = shishi_asn1_write_int32 (handle, authenticator, "cksum.cksumtype", cksumtype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, authenticator, "cksum.checksum", cksum, cksumlen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_add_cksum: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @key: key to to use for encryption. * @keyusage: cryptographic key usage value to use in encryption. * @data: input array with data to calculate checksum on. * @datalen: size of input array with data to calculate checksum on. * * Calculate checksum for data and store it in the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_cksum (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, char *data, size_t datalen) { return shishi_authenticator_add_cksum_type (handle, authenticator, key, keyusage, shishi_cipher_defaultcksumtype (shishi_key_type (key)), data, datalen); } /** * shishi_authenticator_add_cksum_type: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @key: key to to use for encryption. * @keyusage: cryptographic key usage value to use in encryption. * @cksumtype: checksum to type to calculate checksum. * @data: input array with data to calculate checksum on. * @datalen: size of input array with data to calculate checksum on. * * Calculate checksum for data and store it in the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_cksum_type (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, int cksumtype, char *data, size_t datalen) { int res; if (data && datalen > 0) { char *cksum; size_t cksumlen; res = shishi_checksum (handle, key, keyusage, cksumtype, data, datalen, &cksum, &cksumlen); if (res != SHISHI_OK) return res; res = shishi_authenticator_set_cksum (handle, authenticator, cksumtype, cksum, cksumlen); free (cksum); } else res = shishi_authenticator_remove_cksum (handle, authenticator); return res; } /** * shishi_authenticator_clear_authorizationdata: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: Authenticator as allocated by shishi_authenticator(). * * Remove the authorization-data field from Authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_clear_authorizationdata (Shishi * handle, Shishi_asn1 authenticator) { int res; res = shishi_asn1_write (handle, authenticator, "authorization-data", NULL, 0); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; return SHISHI_OK; } /** * shishi_authenticator_add_authorizationdata: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @adtype: input authorization data type to add. * @addata: input authorization data to add. * @addatalen: size of input authorization data to add. * * Add authorization data to authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t adtype, const char *addata, size_t addatalen) { char *format; int res; size_t i; res = shishi_asn1_write (handle, authenticator, "authorization-data", "NEW", 1); if (res != SHISHI_OK) return res; res = shishi_asn1_number_of_elements (handle, authenticator, "authorization-data", &i); if (res != SHISHI_OK) return res; asprintf (&format, "authorization-data.?%ld.ad-type", i); res = shishi_asn1_write_integer (handle, authenticator, format, adtype); if (res != SHISHI_OK) { free (format); return res; } sprintf (format, "authorization-data.?%ld.ad-data", i); res = shishi_asn1_write (handle, authenticator, format, addata, addatalen); free (format); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_authorizationdata: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @adtype: output authorization data type. * @addata: newly allocated output authorization data. * @addatalen: on output, actual size of newly allocated authorization data. * @nth: element number of authorization-data to extract. * * Extract n:th authorization data from authenticator. The first * field is 1. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t * adtype, char **addata, size_t * addatalen, size_t nth) { char *format; int res; size_t i; res = shishi_asn1_number_of_elements (handle, authenticator, "authorization-data", &i); if (res != SHISHI_OK) return SHISHI_ASN1_ERROR; if (nth > i) return SHISHI_OUT_OF_RANGE; asprintf (&format, "authorization-data.?%ld.ad-type", nth); res = shishi_asn1_read_int32 (handle, authenticator, format, adtype); free (format); if (res != SHISHI_OK) return res; asprintf (&format, "authorization-data.?%ld.ad-data", i); res = shishi_asn1_read (handle, authenticator, format, addata, addatalen); free (format); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_remove_subkey: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * * Remove subkey from the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_remove_subkey (Shishi * handle, Shishi_asn1 authenticator) { int res; res = shishi_asn1_write (handle, authenticator, "subkey", NULL, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_get_subkey: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @subkey: output newly allocated subkey from authenticator. * * Read subkey value from authenticator. * * Return value: Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT * if subkey is not present. **/ int shishi_authenticator_get_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key ** subkey) { int res; int subkeytype; char *subkeyvalue; size_t subkeylen; res = shishi_asn1_read_int32 (handle, authenticator, "subkey.keytype", &subkeytype); if (res != SHISHI_OK) return res; res = shishi_asn1_read (handle, authenticator, "subkey.keyvalue", &subkeyvalue, &subkeylen); if (res != SHISHI_OK) return res; res = shishi_key (handle, subkey); if (res != SHISHI_OK) return res; shishi_key_type_set (*subkey, subkeytype); shishi_key_value_set (*subkey, subkeyvalue); return SHISHI_OK; } /** * shishi_authenticator_set_subkey: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @subkeytype: input subkey type to store in authenticator. * @subkey: input subkey data to store in authenticator. * @subkeylen: size of input subkey data to store in authenticator. * * Store subkey value in authenticator. A subkey is usually created * by calling shishi_key_random() using the default encryption type of * the key from the ticket that is being used. To save time, you may * want to use shishi_authenticator_add_subkey() instead, which calculates * the subkey and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_set_subkey (Shishi * handle, Shishi_asn1 authenticator, int32_t subkeytype, const char *subkey, size_t subkeylen) { int res; res = shishi_asn1_write_int32 (handle, authenticator, "subkey.keytype", subkeytype); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, authenticator, "subkey.keyvalue", subkey, subkeylen); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_authenticator_add_random_subkey: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * * Generate random subkey, of the default encryption type from * configuration, and store it in the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_random_subkey (Shishi * handle, Shishi_asn1 authenticator) { int n; int res; int *etypes; n = shishi_cfg_clientkdcetype (handle, &etypes); if (n <= 0) return SHISHI_TICKET_BAD_KEYTYPE; /* XXX */ res = shishi_authenticator_add_random_subkey_etype (handle, authenticator, etypes[0]); if (res != SHISHI_OK) return res; return res; } /** * shishi_authenticator_add_random_subkey_etype: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @etype: encryption type of random key to generate. * * Generate random subkey of indicated encryption type, and store it * in the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_random_subkey_etype (Shishi * handle, Shishi_asn1 authenticator, int etype) { int res; Shishi_key *subkey; res = shishi_key_random (handle, etype, &subkey); if (res != SHISHI_OK) return res; res = shishi_authenticator_add_subkey (handle, authenticator, subkey); shishi_key_done (subkey); return res; } /** * shishi_authenticator_add_subkey: * @handle: shishi handle as allocated by shishi_init(). * @authenticator: authenticator as allocated by shishi_authenticator(). * @subkey: subkey to add to authenticator. * * Store subkey in the authenticator. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_authenticator_add_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * subkey) { int res; res = shishi_authenticator_set_subkey (handle, authenticator, shishi_key_type (subkey), shishi_key_value (subkey), shishi_key_length (subkey)); if (res != SHISHI_OK) return res; return SHISHI_OK; } shishi-1.0.2/lib/shishi.h0000664000000000000000000027320612126660507012117 00000000000000/* shishi.h --- Header file for Shishi library. -*- c -*- * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef SHISHI_H #define SHISHI_H #include /* size_t */ #include /* FILE */ #include /* va_list */ #include /* time_t */ #include /* uint32_t */ #define SHISHI_VERSION "1.0.2" # ifdef __cplusplus extern "C" { # endif #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif #endif /* Error codes */ typedef enum { SHISHI_OK = 0, SHISHI_ASN1_ERROR = 1, SHISHI_FOPEN_ERROR = 2, SHISHI_IO_ERROR = 3, SHISHI_MALLOC_ERROR = 4, SHISHI_BASE64_ERROR = 5, SHISHI_REALM_MISMATCH = 6, SHISHI_CNAME_MISMATCH = 7, SHISHI_NONCE_MISMATCH = 8, SHISHI_TGSREP_BAD_KEYTYPE = 9, SHISHI_KDCREP_BAD_KEYTYPE = 10, SHISHI_APREP_BAD_KEYTYPE = 11, SHISHI_APREP_VERIFY_FAILED = 12, SHISHI_APREQ_BAD_KEYTYPE = 13, SHISHI_TOO_SMALL_BUFFER = 14, SHISHI_DERIVEDKEY_TOO_SMALL = 15, SHISHI_KEY_TOO_LARGE = 16, SHISHI_CRYPTO_ERROR = 17, SHISHI_CRYPTO_INTERNAL_ERROR = 18, SHISHI_SOCKET_ERROR = 19, SHISHI_BIND_ERROR = 20, SHISHI_SENDTO_ERROR = 21, SHISHI_RECVFROM_ERROR = 22, SHISHI_CLOSE_ERROR = 23, SHISHI_KDC_TIMEOUT = 24, SHISHI_KDC_NOT_KNOWN_FOR_REALM = 25, SHISHI_TTY_ERROR = 26, SHISHI_GOT_KRBERROR = 27, SHISHI_HANDLE_ERROR = 28, SHISHI_INVALID_TKTS = 29, SHISHI_TICKET_BAD_KEYTYPE = 30, SHISHI_INVALID_KEY = 31, SHISHI_APREQ_DECRYPT_FAILED = 32, SHISHI_TICKET_DECRYPT_FAILED = 33, SHISHI_INVALID_TICKET = 34, SHISHI_OUT_OF_RANGE = 35, SHISHI_ASN1_NO_ELEMENT = 36, SHISHI_SAFE_BAD_KEYTYPE = 37, SHISHI_SAFE_VERIFY_FAILED = 38, SHISHI_PKCS5_INVALID_PRF = 39, SHISHI_PKCS5_INVALID_ITERATION_COUNT = 40, SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH = 41, SHISHI_PKCS5_DERIVED_KEY_TOO_LONG = 42, SHISHI_INVALID_PRINCIPAL_NAME = 43, SHISHI_INVALID_ARGUMENT = 44, SHISHI_ASN1_NO_VALUE = 45, SHISHI_CONNECT_ERROR = 46, SHISHI_VERIFY_FAILED = 47, SHISHI_PRIV_BAD_KEYTYPE = 48, SHISHI_FILE_ERROR = 49, SHISHI_ENCAPREPPART_BAD_KEYTYPE = 50, SHISHI_GETTIMEOFDAY_ERROR = 51, SHISHI_KEYTAB_ERROR = 52, SHISHI_CCACHE_ERROR = 53, SHISHI_LAST_ERROR = 53 } Shishi_rc; typedef enum { /* Name type not known */ SHISHI_NT_UNKNOWN = 0, /* Just the name of the principal as in DCE, or for users */ SHISHI_NT_PRINCIPAL = 1, /* Service and other unique instance (krbtgt) */ SHISHI_NT_SRV_INST = 2, /* Service with host name as instance (telnet, rcommands) */ SHISHI_NT_SRV_HST = 3, /* Service with host as remaining components */ SHISHI_NT_SRV_XHST = 4, /* Unique ID */ SHISHI_NT_UID = 5, /* Encoded X.509 Distingished name [RFC 2253] */ SHISHI_NT_X500_PRINCIPAL = 6, /* Name in form of SMTP email name (e.g. user@foo.com) */ SHISHI_NT_SMTP_NAME = 7, /* Enterprise name - may be mapped to principal name */ SHISHI_NT_ENTERPRISE = 10 } Shishi_name_type; typedef enum { SHISHI_PA_TGS_REQ = 1, SHISHI_PA_ENC_TIMESTAMP = 2, SHISHI_PA_PW_SALT = 3, SHISHI_PA_RESERVED = 4, SHISHI_PA_ENC_UNIX_TIME = 5, /* (deprecated) */ SHISHI_PA_SANDIA_SECUREID = 6, SHISHI_PA_SESAME = 7, SHISHI_PA_OSF_DCE = 8, SHISHI_PA_CYBERSAFE_SECUREID = 9, SHISHI_PA_AFS3_SALT = 10, SHISHI_PA_ETYPE_INFO = 11, SHISHI_PA_SAM_CHALLENGE = 12, /* (sam/otp) */ SHISHI_PA_SAM_RESPONSE = 13, /* (sam/otp) */ SHISHI_PA_PK_AS_REQ = 14, /* (pkinit) */ SHISHI_PA_PK_AS_REP = 15, /* (pkinit) */ SHISHI_PA_ETYPE_INFO2 = 19, /* (replaces pa_etype_info) */ SHISHI_PA_USE_SPECIFIED_KVNO = 20, SHISHI_PA_SAM_REDIRECT = 21, /* (sam/otp) */ SHISHI_PA_GET_FROM_TYPED_DATA = 22, /* (embedded in typed data) */ SHISHI_TD_PADATA = 22, /* (embeds padata) */ SHISHI_PA_SAM_ETYPE_INFO = 23, /* (sam/otp) */ SHISHI_PA_ALT_PRINC = 24, /* (crawdad@fnal.gov) */ SHISHI_PA_SAM_CHALLENGE2 = 30, /* (kenh@pobox.com) */ SHISHI_PA_SAM_RESPONSE2 = 31, /* (kenh@pobox.com) */ SHISHI_PA_EXTRA_TGT = 41, /* Reserved extra TGT */ SHISHI_TD_PKINIT_CMS_CERTIFICATES = 101, /* CertificateSet from CMS */ SHISHI_TD_KRB_PRINCIPAL = 102, /* PrincipalName */ SHISHI_TD_KRB_REALM = 103, /* Realm */ SHISHI_TD_TRUSTED_CERTIFIERS = 104, /* from PKINIT */ SHISHI_TD_CERTIFICATE_INDEX = 105, /* from PKINIT */ SHISHI_TD_APP_DEFINED_ERROR = 106, /* application specific */ SHISHI_TD_REQ_NONCE = 107, /* INTEGER */ SHISHI_TD_REQ_SEQ = 108, /* INTEGER */ SHISHI_PA_PAC_REQUEST = 128 /* (jbrezak@exchange.microsoft.com) */ } Shishi_padata_type; typedef enum { SHISHI_TR_DOMAIN_X500_COMPRESS = 1 } Shishi_tr_type; typedef enum { SHISHI_APOPTIONS_RESERVED = 0x1, /* bit 0 */ SHISHI_APOPTIONS_USE_SESSION_KEY = 0x2, /* bit 1 */ SHISHI_APOPTIONS_MUTUAL_REQUIRED = 0x4 /* bit 2 */ } Shishi_apoptions; typedef enum { SHISHI_TICKETFLAGS_RESERVED = 0x1, /* bit 0 */ SHISHI_TICKETFLAGS_FORWARDABLE = 0x2, /* bit 1 */ SHISHI_TICKETFLAGS_FORWARDED = 0x4, /* bit 2 */ SHISHI_TICKETFLAGS_PROXIABLE = 0x8, /* bit 3 */ SHISHI_TICKETFLAGS_PROXY = 0x10, /* bit 4 */ SHISHI_TICKETFLAGS_MAY_POSTDATE = 0x20, /* bit 5 */ SHISHI_TICKETFLAGS_POSTDATED = 0x40, /* bit 6 */ SHISHI_TICKETFLAGS_INVALID = 0x80, /* bit 7 */ SHISHI_TICKETFLAGS_RENEWABLE = 0x100, /* bit 8 */ SHISHI_TICKETFLAGS_INITIAL = 0x200, /* bit 9 */ SHISHI_TICKETFLAGS_PRE_AUTHENT = 0x400, /* bit 10 */ SHISHI_TICKETFLAGS_HW_AUTHENT = 0x800, /* bit 11 */ SHISHI_TICKETFLAGS_TRANSITED_POLICY_CHECKED = 0x1000, /* bit 12 */ SHISHI_TICKETFLAGS_OK_AS_DELEGATE = 0x2000 /* bit 13 */ } Shishi_ticketflags; typedef enum { SHISHI_KDCOPTIONS_RESERVED = 0x1, /* bit 0 */ SHISHI_KDCOPTIONS_FORWARDABLE = 0x2, /* bit 1 */ SHISHI_KDCOPTIONS_FORWARDED = 0x4, /* bit 2 */ SHISHI_KDCOPTIONS_PROXIABLE = 0x8, /* bit 3 */ SHISHI_KDCOPTIONS_PROXY = 0x10, /* bit 4 */ SHISHI_KDCOPTIONS_ALLOW_POSTDATE = 0x20, /* bit 5 */ SHISHI_KDCOPTIONS_POSTDATED = 0x40, /* bit 6 */ SHISHI_KDCOPTIONS_UNUSED7 = 0x80, /* bit 7 */ SHISHI_KDCOPTIONS_RENEWABLE = 0x100, /* bit 8 */ SHISHI_KDCOPTIONS_UNUSED9 = 0x200, /* bit 9 */ SHISHI_KDCOPTIONS_UNUSED10 = 0x400, /* bit 10 */ SHISHI_KDCOPTIONS_UNUSED11 = 0x800 /* bit 11 */ #define SHISHI_KDCOPTIONS_DISABLE_TRANSITED_CHECK 0x4000000 /* bit 26 */ #define SHISHI_KDCOPTIONS_RENEWABLE_OK 0x8000000 /* bit 27 */ #define SHISHI_KDCOPTIONS_ENC_TKT_IN_SKEY 0x10000000 /* bit 28 */ #define SHISHI_KDCOPTIONS_RENEW 0x40000000 /* bit 30 */ #define SHISHI_KDCOPTIONS_VALIDATE 0x80000000 /* bit 31 */ } Shishi_KDCOptions; typedef enum { /* 0 unused */ /* 1 Ticket PDU */ /* 2 Authenticator non-PDU */ /* 3 EncTicketPart non-PDU */ /* 4-9 unused */ /* Request for initial authentication */ SHISHI_MSGTYPE_AS_REQ = 10, /* Response to SHISHI_MSGTYPE_AS_REQ request */ SHISHI_MSGTYPE_AS_REP = 11, /* Request for authentication based on TGT */ SHISHI_MSGTYPE_TGS_REQ = 12, /* Response to SHISHI_MSGTYPE_TGS_REQ request */ SHISHI_MSGTYPE_TGS_REP = 13, /* application request to server */ SHISHI_MSGTYPE_AP_REQ = 14, /* Response to SHISHI_MSGTYPE_AP_REQ_MUTUAL */ SHISHI_MSGTYPE_AP_REP = 15, /* Reserved for user-to-user krb_tgt_request */ SHISHI_MSGTYPE_RESERVED16 = 16, /* Reserved for user-to-user krb_tgt_reply */ SHISHI_MSGTYPE_RESERVED17 = 17, /* 18-19 unused */ /* Safe (checksummed) application message */ SHISHI_MSGTYPE_SAFE = 20, /* Private (encrypted) application message */ SHISHI_MSGTYPE_PRIV = 21, /* Private (encrypted) message to forward credentials */ SHISHI_MSGTYPE_CRED = 22, /* 23-24 unused */ /* 25 EncASRepPart non-PDU */ /* 26 EncTGSRepPart non-PDU */ /* 27 EncApRepPart non-PDU */ /* 28 EncKrbPrivPart non-PDU */ /* 29 EncKrbCredPart non-PDU */ /* Error response */ SHISHI_MSGTYPE_ERROR = 30 } Shishi_msgtype; typedef enum { SHISHI_LRTYPE_LAST_INITIAL_TGT_REQUEST = 1, SHISHI_LRTYPE_LAST_INITIAL_REQUEST = 2, SHISHI_LRTYPE_NEWEST_TGT_ISSUE = 3, SHISHI_LRTYPE_LAST_RENEWAL = 4, SHISHI_LRTYPE_LAST_REQUEST = 5 } Shishi_lrtype; typedef enum { SHISHI_NULL = 0, SHISHI_DES_CBC_CRC = 1, SHISHI_DES_CBC_MD4 = 2, SHISHI_DES_CBC_MD5 = 3, SHISHI_DES_CBC_NONE = 4, SHISHI_DES3_CBC_NONE = 6, SHISHI_DES3_CBC_HMAC_SHA1_KD = 16, SHISHI_AES128_CTS_HMAC_SHA1_96 = 17, SHISHI_AES256_CTS_HMAC_SHA1_96 = 18, SHISHI_ARCFOUR_HMAC = 23, SHISHI_ARCFOUR_HMAC_EXP = 24 } Shishi_etype; typedef enum { SHISHI_CRC32 = 1, SHISHI_RSA_MD4 = 2, SHISHI_RSA_MD4_DES = 3, SHISHI_DES_MAC = 4, SHISHI_DES_MAC_K = 5, SHISHI_RSA_MD4_DES_K = 6, SHISHI_RSA_MD5 = 7, SHISHI_RSA_MD5_DES = 8, SHISHI_RSA_MD5_DES_GSS = 9, /* XXX */ SHISHI_HMAC_SHA1_DES3_KD = 12, SHISHI_HMAC_SHA1_96_AES128 = 15, SHISHI_HMAC_SHA1_96_AES256 = 16, SHISHI_ARCFOUR_HMAC_MD5 = -138, SHISHI_KRB5_GSSAPI_CKSUM = 8003, SHISHI_NO_CKSUMTYPE = -1 } Shishi_cksumtype; typedef enum { SHISHI_FILETYPE_TEXT = 0, SHISHI_FILETYPE_DER, SHISHI_FILETYPE_HEX, SHISHI_FILETYPE_BASE64, SHISHI_FILETYPE_BINARY } Shishi_filetype; typedef enum { SHISHI_OUTPUTTYPE_NULL = 0, SHISHI_OUTPUTTYPE_STDERR, SHISHI_OUTPUTTYPE_SYSLOG } Shishi_outputtype; typedef enum { SHISHI_AUTHORIZATION_BASIC = 0, SHISHI_AUTHORIZATION_K5LOGIN } Shishi_authorization; typedef enum { /* 1. AS-REQ PA-ENC-TIMESTAMP padata timestamp, encrypted with the client key */ SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP = 1, /* 2. AS-REP Ticket and TGS-REP Ticket (includes TGS session key or application session key), encrypted with the service key */ SHISHI_KEYUSAGE_ENCTICKETPART = 2, /* 3. AS-REP encrypted part (includes TGS session key or application session key), encrypted with the client key */ SHISHI_KEYUSAGE_ENCASREPPART = 3, /* 4. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the TGS session key */ SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_SESSION_KEY = 4, /* 5. TGS-REQ KDC-REQ-BODY AuthorizationData, encrypted with the TGS authenticator subkey (section 5.4.1) */ SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_AUTHENTICATOR_KEY = 5, /* 6. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator cksum, keyed with the TGS session key */ SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR_CKSUM = 6, /* 7. TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator (includes TGS authenticator subkey), encrypted with the TGS session key */ SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR = 7, /* 8. TGS-REP encrypted part (includes application session key), encrypted with the TGS session key */ SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY = 8, /* 9. TGS-REP encrypted part (includes application session key), encrypted with the TGS authenticator subkey */ SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY = 9, /* 10. AP-REQ Authenticator cksum, keyed with the application session key */ SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR_CKSUM = 10, /* 11. AP-REQ Authenticator (includes application authenticator subkey), encrypted with the application session key */ SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR = 11, /* 12. AP-REP encrypted part (includes application session subkey), encrypted with the application session key */ SHISHI_KEYUSAGE_ENCAPREPPART = 12, /* 13. KRB-PRIV encrypted part, encrypted with a key chosen by the application */ SHISHI_KEYUSAGE_KRB_PRIV = 13, /* 14. KRB-CRED encrypted part, encrypted with a key chosen by the application */ SHISHI_KEYUSAGE_KRB_CRED = 14, /* 15. KRB-SAFE cksum, keyed with a key chosen by the application */ SHISHI_KEYUSAGE_KRB_SAFE = 15, /* 18. KRB-ERROR checksum (e-cksum) */ SHISHI_KEYUSAGE_KRB_ERROR = 18, /* 19. AD-KDCIssued checksum (ad-checksum) */ SHISHI_KEYUSAGE_AD_KDCISSUED = 19, /* 20. Checksum for Mandatory Ticket Extensions */ SHISHI_KEYUSAGE_TICKET_EXTENSION = 20, /* 21. Checksum in Authorization Data in Ticket Extensions */ SHISHI_KEYUSAGE_TICKET_EXTENSION_AUTHORIZATION = 21, /* 22-24. Reserved for use in GSSAPI mechanisms derived from RFC 1964. (raeburn/MIT) */ SHISHI_KEYUSAGE_GSS_R1 = 22, SHISHI_KEYUSAGE_GSS_R2 = 23, SHISHI_KEYUSAGE_GSS_R3 = 24, /* draft-ietf-krb-wg-gssapi-cfx */ SHISHI_KEYUSAGE_ACCEPTOR_SEAL = 22, SHISHI_KEYUSAGE_ACCEPTOR_SIGN = 23, SHISHI_KEYUSAGE_INITIATOR_SEAL = 24, SHISHI_KEYUSAGE_INITIATOR_SIGN = 25, /* 16-18,20-21,25-511. Reserved for future use. */ /* 512-1023. Reserved for uses internal implementations. */ /* 1024. Encryption for application use in protocols that do not specify key usage values */ /* 1025. Checksums for application use in protocols that do not specify key usage values */ /* 1026-2047. Reserved for application use. 1026,1028,1030,1032,1034 used in KCMD protocol */ SHISHI_KEYUSAGE_KCMD_DES = 1026, SHISHI_KEYUSAGE_KCMD_INPUT = 1028, SHISHI_KEYUSAGE_KCMD_OUTPUT = 1030, SHISHI_KEYUSAGE_KCMD_STDERR_INPUT = 1032, SHISHI_KEYUSAGE_KCMD_STDERR_OUTPUT = 1034 } Shishi_keyusage; typedef enum { /* No error */ SHISHI_KDC_ERR_NONE = 0, /* Client's entry in database has expired */ SHISHI_KDC_ERR_NAME_EXP = 1, /* Server's entry in database has expired */ SHISHI_KDC_ERR_SERVICE_EXP = 2, /* Requested protocol version number - not supported */ SHISHI_KDC_ERR_BAD_PVNO = 3, /* Client's key encrypted in old master key */ SHISHI_KDC_ERR_C_OLD_MAST_KVNO = 4, /* Server's key encrypted in old master key */ SHISHI_KDC_ERR_S_OLD_MAST_KVNO = 5, /* Client not found in database */ SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN = 6, /* Server not found in database */ SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN = 7, /* Multiple principal entries in database */ SHISHI_KDC_ERR_PRINCIPAL_NOT_UNIQUE = 8, /* The client or server has a null key */ SHISHI_KDC_ERR_NULL_KEY = 9, /* Ticket not eligible for postdating */ SHISHI_KDC_ERR_CANNOT_POSTDATE = 10, /* Requested start time is later than end time */ SHISHI_KDC_ERR_NEVER_VALID = 11, /* KDC policy rejects request */ SHISHI_KDC_ERR_POLICY = 12, /* KDC cannot accommodate requested option */ SHISHI_KDC_ERR_BADOPTION = 13, /* KDC has no support for encryption type */ SHISHI_KDC_ERR_ETYPE_NOSUPP = 14, /* KDC has no support for checksum type */ SHISHI_KDC_ERR_SUMTYPE_NOSUPP = 15, /* KDC has no support for padata type */ SHISHI_KDC_ERR_PADATA_TYPE_NOSUPP = 16, /* KDC has no support for transited type */ SHISHI_KDC_ERR_TRTYPE_NOSUPP = 17, /* Clients credentials have been revoked */ SHISHI_KDC_ERR_CLIENT_REVOKED = 18, /* Credentials for server have been revoked */ SHISHI_KDC_ERR_SERVICE_REVOKED = 19, /* TGT has been revoked */ SHISHI_KDC_ERR_TGT_REVOKED = 20, /* Client not yet valid - try again later */ SHISHI_KDC_ERR_CLIENT_NOTYET = 21, /* Server not yet valid - try again later */ SHISHI_KDC_ERR_SERVICE_NOTYET = 22, /* Password has expired - change password to reset */ SHISHI_KDC_ERR_KEY_EXPIRED = 23, /* Pre-authentication information was invalid */ SHISHI_KDC_ERR_PREAUTH_FAILED = 24, /* Additional pre-authenticationrequired */ SHISHI_KDC_ERR_PREAUTH_REQUIRED = 25, /* Requested server and ticket don't match */ SHISHI_KDC_ERR_SERVER_NOMATCH = 26, /* Server principal valid for user = 2,user only */ SHISHI_KDC_ERR_MUST_USE_USER2USER = 27, /* KDC Policy rejects transited path */ SHISHI_KDC_ERR_PATH_NOT_ACCPETED = 28, /* A service is not available */ SHISHI_KDC_ERR_SVC_UNAVAILABLE = 29, /* Integrity check on decrypted field failed */ SHISHI_KRB_AP_ERR_BAD_INTEGRITY = 31, /* Ticket expired */ SHISHI_KRB_AP_ERR_TKT_EXPIRED = 32, /* Ticket not yet valid */ SHISHI_KRB_AP_ERR_TKT_NYV = 33, /* Request is a replay */ SHISHI_KRB_AP_ERR_REPEAT = 34, /* The ticket isn't for us */ SHISHI_KRB_AP_ERR_NOT_US = 35, /* Ticket and authenticator don't match */ SHISHI_KRB_AP_ERR_BADMATCH = 36, /* Clock skew too great */ SHISHI_KRB_AP_ERR_SKEW = 37, /* Incorrect net address */ SHISHI_KRB_AP_ERR_BADADDR = 38, /* Protocol version mismatch */ SHISHI_KRB_AP_ERR_BADVERSION = 39, /* Invalid msg type */ SHISHI_KRB_AP_ERR_MSG_TYPE = 40, /* Message stream modified */ SHISHI_KRB_AP_ERR_MODIFIED = 41, /* Message out of order */ SHISHI_KRB_AP_ERR_BADORDER = 42, /* Specified version of key is not available */ SHISHI_KRB_AP_ERR_BADKEYVER = 44, /* Service key not available */ SHISHI_KRB_AP_ERR_NOKEY = 45, /* Mutual authentication failed */ SHISHI_KRB_AP_ERR_MUT_FAIL = 46, /* Incorrect message direction */ SHISHI_KRB_AP_ERR_BADDIRECTION = 47, /* Alternative authentication method required */ SHISHI_KRB_AP_ERR_METHOD = 48, /* Incorrect sequence number in message */ SHISHI_KRB_AP_ERR_BADSEQ = 49, /* Inappropriate type of checksum in message */ SHISHI_KRB_AP_ERR_INAPP_CKSUM = 50, /* Policy rejects transited path */ SHISHI_KRB_AP_PATH_NOT_ACCEPTED = 51, /* Response too big for UDP, retry with TCP */ SHISHI_KRB_ERR_RESPONSE_TOO_BIG = 52, /* Generic error (description in e-text) */ SHISHI_KRB_ERR_GENERIC = 60, /* Field is too long for this implementation */ SHISHI_KRB_ERR_FIELD_TOOLONG = 61, /* Reserved for PKINIT */ SHISHI_KDC_ERROR_CLIENT_NOT_TRUSTED = 62, /* Reserved for PKINIT */ SHISHI_KDC_ERROR_KDC_NOT_TRUSTED = 63, /* Reserved for PKINIT */ SHISHI_KDC_ERROR_INVALID_SIG = 64, /* Reserved for PKINIT */ SHISHI_KDC_ERR_KEY_TOO_WEAK = 65, /* Reserved for PKINIT */ SHISHI_KDC_ERR_CERTIFICATE_MISMATCH = 66, /* No TGT available to validate USER-TO-USER */ SHISHI_KRB_AP_ERR_NO_TGT = 67, /* USER-TO-USER TGT issued different KDC */ SHISHI_KDC_ERR_WRONG_REALM = 68, /* Ticket must be for USER-TO-USER */ SHISHI_KRB_AP_ERR_USER_TO_USER_REQUIRED = 69, /* Reserved for PKINIT */ SHISHI_KDC_ERR_CANT_VERIFY_CERTIFICATE = 70, /* Reserved for PKINIT */ SHISHI_KDC_ERR_INVALID_CERTIFICATE = 71, /* Reserved for PKINIT */ SHISHI_KDC_ERR_REVOKED_CERTIFICATE = 72, /* Reserved for PKINIT */ SHISHI_KDC_ERR_REVOCATION_STATUS_UNKNOWN = 73, /* Reserved for PKINIT */ SHISHI_KDC_ERR_REVOCATION_STATUS_UNAVAILABLE = 74, /* Reserved for PKINIT */ SHISHI_KDC_ERR_CLIENT_NAME_MISMATCH = 75, /* Reserved for PKINIT */ SHISHI_KDC_ERR_KDC_NAME_MISMATCH = 76, SHISHI_LAST_ERROR_CODE = 76 } Shishi_krb_error; typedef enum { SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED = 1, SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE = 2 } Shishi_tkts_hintflags; struct Shishi_tkts_hint { int startpos; char *server; char *serverrealm; char *client; char *clientrealm; int flags; Shishi_ticketflags tktflags; Shishi_KDCOptions kdcoptions; int32_t etype; char *passwd; time_t starttime; time_t endtime; time_t renew_till; int32_t preauthetype; char *preauthsalt; size_t preauthsaltlen; char *preauths2kparams; size_t preauths2kparamslen; }; typedef struct Shishi_tkts_hint Shishi_tkts_hint; /* resolv.c */ #define SHISHI_DNS_IN 1 #define SHISHI_DNS_TXT 16 #define SHISHI_DNS_SRV 33 struct Shishi_dns_st { struct Shishi_dns_st *next; uint16_t class; uint16_t type; uint32_t ttl; void *rr; }; typedef struct Shishi_dns_st *Shishi_dns; struct Shishi_dns_srv_st { uint16_t priority; uint16_t weight; uint16_t port; char name[256]; }; typedef struct Shishi_dns_srv_st *Shishi_dns_srv; typedef struct Shishi Shishi; typedef struct Shishi_tkt Shishi_tkt; typedef struct Shishi_tkts Shishi_tkts; typedef struct Shishi_as Shishi_as; typedef struct Shishi_tgs Shishi_tgs; typedef struct Shishi_ap Shishi_ap; typedef struct Shishi_key Shishi_key; typedef struct Shishi_keys Shishi_keys; typedef struct Shishi_safe Shishi_safe; typedef struct Shishi_priv Shishi_priv; #ifdef LIBTASN1_H typedef ASN1_TYPE Shishi_asn1; #else typedef void *Shishi_asn1; #endif typedef struct Shishi_crypto Shishi_crypto; #define SHISHI_GENERALIZEDTIME_LENGTH 15 #define SHISHI_GENERALIZEDTIMEZ_LENGTH (SHISHI_GENERALIZEDTIME_LENGTH + 1) /* If non-NULL, call this function when memory is exhausted. */ extern void (*shishi_alloc_fail_function) (void); /* init.c */ extern Shishi *shishi (void); extern Shishi *shishi_server (void); extern void shishi_done (Shishi * handle); extern int shishi_init (Shishi ** handle); extern int shishi_init_with_paths (Shishi ** handle, const char *tktsfile, const char *systemcfgfile, const char *usercfgfile); extern int shishi_init_server (Shishi ** handle); extern int shishi_init_server_with_paths (Shishi ** handle, const char *systemcfgfile); /* cfg.c */ extern int shishi_cfg (Shishi * handle, const char *option); extern int shishi_cfg_from_file (Shishi * handle, const char *cfg); extern int shishi_cfg_print (Shishi * handle, FILE * fh); extern const char *shishi_cfg_default_systemfile (Shishi * handle); extern const char *shishi_cfg_default_userdirectory (Shishi * handle); extern const char *shishi_cfg_default_userfile (Shishi * handle); extern char *shishi_cfg_userdirectory_file (Shishi * handle, const char *file); extern int shishi_cfg_clientkdcetype (Shishi * handle, int32_t ** etypes); extern int32_t shishi_cfg_clientkdcetype_fast (Shishi * handle); extern int shishi_cfg_clientkdcetype_set (Shishi * handle, char *value); extern int shishi_cfg_authorizationtype_set (Shishi * handle, char *value); /* error.c */ extern const char *shishi_strerror (int err); extern const char *shishi_error (Shishi * handle); extern void shishi_error_clear (Shishi * handle); extern void shishi_error_set (Shishi * handle, const char *errstr); extern void shishi_error_printf (Shishi * handle, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern int shishi_error_outputtype (Shishi * handle); extern void shishi_error_set_outputtype (Shishi * handle, int type); extern void shishi_info (Shishi * handle, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern void shishi_warn (Shishi * handle, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern void shishi_verbose (Shishi * handle, const char *format, ...) __attribute__ ((format (printf, 2, 3))); /* realm.c */ extern char *shishi_realm_default_guess (void); extern const char *shishi_realm_default (Shishi * handle); extern void shishi_realm_default_set (Shishi * handle, const char *realm); extern char *shishi_realm_for_server_file (Shishi * handle, char *server); extern char *shishi_realm_for_server_dns (Shishi * handle, char *server); extern char *shishi_realm_for_server (Shishi * handle, char *server); /* principal.c */ extern char *shishi_principal_default_guess (void); extern const char *shishi_principal_default (Shishi * handle); extern void shishi_principal_default_set (Shishi * handle, const char *principal); extern int shishi_principal_name (Shishi * handle, Shishi_asn1 namenode, const char *namefield, char **out, size_t * outlen); extern int shishi_principal_name_realm (Shishi * handle, Shishi_asn1 namenode, const char *namefield, Shishi_asn1 realmnode, const char *realmfield, char **out, size_t * outlen); extern int shishi_principal_name_set (Shishi * handle, Shishi_asn1 namenode, const char *namefield, Shishi_name_type name_type, const char *name[]); extern int shishi_principal_set (Shishi * handle, Shishi_asn1 namenode, const char *namefield, const char *name); extern int shishi_parse_name (Shishi * handle, const char *name, char **principal, char **realm); extern int shishi_derive_default_salt (Shishi * handle, const char *name, char **salt); extern char *shishi_server_for_local_service (Shishi * handle, const char *service); /* ticket.c */ extern Shishi_asn1 shishi_ticket (Shishi * handle); extern int shishi_ticket_server (Shishi * handle, Shishi_asn1 ticket, char **server, size_t * serverlen); extern int shishi_ticket_sname_set (Shishi * handle, Shishi_asn1 ticket, Shishi_name_type name_type, char *sname[]); extern int shishi_ticket_srealmserver_set (Shishi * handle, Shishi_asn1 ticket, const char *realm, const char *server); extern int shishi_ticket_set_server (Shishi * handle, Shishi_asn1 ticket, const char *server); extern int shishi_ticket_realm_get (Shishi * handle, Shishi_asn1 ticket, char **realm, size_t * realmlen); extern int shishi_ticket_realm_set (Shishi * handle, Shishi_asn1 ticket, const char *realm); extern int shishi_ticket_get_enc_part_etype (Shishi * handle, Shishi_asn1 ticket, int32_t * etype); extern int shishi_ticket_set_enc_part (Shishi * handle, Shishi_asn1 ticket, int32_t etype, uint32_t kvno, const char *buf, size_t buflen); extern int shishi_ticket_add_enc_part (Shishi * handle, Shishi_asn1 ticket, Shishi_key * key, Shishi_asn1 encticketpart); extern int shishi_ticket_decrypt (Shishi * handle, Shishi_asn1 ticket, Shishi_key * key, Shishi_asn1 * encticketpart); /* tkt.c */ extern Shishi_asn1 shishi_tkt_ticket (Shishi_tkt * tkt); extern void shishi_tkt_ticket_set (Shishi_tkt * tkt, Shishi_asn1 ticket); extern Shishi_asn1 shishi_tkt_kdcrep (Shishi_tkt * tkt); extern Shishi_asn1 shishi_tkt_enckdcreppart (Shishi_tkt * tkt); extern void shishi_tkt_enckdcreppart_set (Shishi_tkt * tkt, Shishi_asn1 enckdcreppart); extern Shishi_asn1 shishi_tkt_encticketpart (Shishi_tkt * tkt); extern void shishi_tkt_encticketpart_set (Shishi_tkt * tkt, Shishi_asn1 encticketpart); extern Shishi_key *shishi_tkt_key (Shishi_tkt * tkt); extern int shishi_tkt_key_set (Shishi_tkt * tkt, Shishi_key * key); extern int shishi_tkt (Shishi * handle, Shishi_tkt ** tkt); extern Shishi_tkt *shishi_tkt2 (Shishi * handle, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep); extern void shishi_tkt_pretty_print (Shishi_tkt * tkt, FILE * fh); extern int shishi_tkt_realm (Shishi_tkt * tkt, char **realm, size_t * realmlen); extern int shishi_tkt_client (Shishi_tkt * tkt, char **client, size_t * clientlen); extern int shishi_tkt_client_p (Shishi_tkt * tkt, const char *client); extern int shishi_tkt_clientrealm (Shishi_tkt * tkt, char **client, size_t * clientlen); extern int shishi_tkt_clientrealm_p (Shishi_tkt * tkt, const char *client); extern int shishi_tkt_clientrealm_set (Shishi_tkt * tkt, const char *realm, const char *client); extern int shishi_tkt_serverrealm_set (Shishi_tkt * tkt, const char *realm, const char *server); extern int shishi_tkt_build (Shishi_tkt * tkt, Shishi_key * key); extern int shishi_tkt_lastreq (Shishi_tkt * tkt, char **lrtime, size_t * lrtimelen, int32_t lrtype); extern time_t shishi_tkt_lastreqc (Shishi_tkt * tkt, Shishi_lrtype lrtype); extern void shishi_tkt_lastreq_pretty_print (Shishi_tkt * tkt, FILE * fh); extern int shishi_tkt_authtime (Shishi_tkt * tkt, char **authtime, size_t * authtimelen); extern time_t shishi_tkt_authctime (Shishi_tkt * tkt); extern int shishi_tkt_starttime (Shishi_tkt * tkt, char **starttime, size_t * starttimelen); extern time_t shishi_tkt_startctime (Shishi_tkt * tkt); extern int shishi_tkt_endtime (Shishi_tkt * tkt, char **endtime, size_t * endtimelen); extern time_t shishi_tkt_endctime (Shishi_tkt * tkt); extern int shishi_tkt_renew_till (Shishi_tkt * tkt, char **renewtilltime, size_t * renewtilllen); extern time_t shishi_tkt_renew_tillc (Shishi_tkt * tkt); extern int shishi_tkt_keytype (Shishi_tkt * tkt, int32_t * etype); extern int32_t shishi_tkt_keytype_fast (Shishi_tkt * tkt); extern int shishi_tkt_keytype_p (Shishi_tkt * tkt, int32_t etype); extern int shishi_tkt_server (Shishi_tkt * tkt, char **server, size_t * serverlen); extern int shishi_tkt_server_p (Shishi_tkt * tkt, const char *server); extern int shishi_tkt_valid_at_time_p (Shishi_tkt * tkt, time_t now); extern int shishi_tkt_valid_now_p (Shishi_tkt * tkt); extern int shishi_tkt_expired_p (Shishi_tkt * tkt); extern int shishi_tkt_decrypt (Shishi_tkt * tkt, Shishi_key * key); extern void shishi_tkt_done (Shishi_tkt * tkt); extern int shishi_tkt_flags (Shishi_tkt * tkt, uint32_t * flags); extern int shishi_tkt_flags_set (Shishi_tkt * tkt, uint32_t flags); extern int shishi_tkt_flags_add (Shishi_tkt * tkt, uint32_t flag); extern int shishi_tkt_forwardable_p (Shishi_tkt * tkt); extern int shishi_tkt_forwarded_p (Shishi_tkt * tkt); extern int shishi_tkt_proxiable_p (Shishi_tkt * tkt); extern int shishi_tkt_proxy_p (Shishi_tkt * tkt); extern int shishi_tkt_may_postdate_p (Shishi_tkt * tkt); extern int shishi_tkt_postdated_p (Shishi_tkt * tkt); extern int shishi_tkt_invalid_p (Shishi_tkt * tkt); extern int shishi_tkt_renewable_p (Shishi_tkt * tkt); extern int shishi_tkt_initial_p (Shishi_tkt * tkt); extern int shishi_tkt_pre_authent_p (Shishi_tkt * tkt); extern int shishi_tkt_hw_authent_p (Shishi_tkt * tkt); extern int shishi_tkt_transited_policy_checked_p (Shishi_tkt * tkt); extern int shishi_tkt_ok_as_delegate_p (Shishi_tkt * tkt); /* tkts.c */ extern char *shishi_tkts_default_file_guess (Shishi * handle); extern const char *shishi_tkts_default_file (Shishi * handle); extern void shishi_tkts_default_file_set (Shishi * handle, const char *tktsfile); extern Shishi_tkts *shishi_tkts_default (Shishi * handle); extern int shishi_tkts_default_to_file (Shishi_tkts * tkts); extern int shishi_tkts (Shishi * handle, Shishi_tkts ** tkts); extern Shishi_tkt *shishi_tkts_nth (Shishi_tkts * tkts, int ticketno); extern int shishi_tkts_size (Shishi_tkts * tkts); extern int shishi_tkts_add (Shishi_tkts * tkts, Shishi_tkt * tkt); extern int shishi_tkts_new (Shishi_tkts * tkts, Shishi_asn1 ticket, Shishi_asn1 enckdcreppart, Shishi_asn1 kdcrep); extern int shishi_tkts_remove (Shishi_tkts * tkts, int ticketno); extern int shishi_tkts_expire (Shishi_tkts * tkts); extern int shishi_tkts_print_for_service (Shishi_tkts * tkts, FILE * fh, const char *service); extern int shishi_tkts_print (Shishi_tkts * tkts, FILE * fh); extern int shishi_tkts_write (Shishi_tkts * tkts, FILE * fh); extern int shishi_tkts_to_file (Shishi_tkts * tkts, const char *filename); extern int shishi_tkts_read (Shishi_tkts * tkts, FILE * fh); extern int shishi_tkts_from_file (Shishi_tkts * tkts, const char *filename); extern void shishi_tkts_done (Shishi_tkts ** tkts); extern int shishi_tkt_match_p (Shishi_tkt * tkt, Shishi_tkts_hint * hint); extern Shishi_tkt *shishi_tkts_find (Shishi_tkts * tkts, Shishi_tkts_hint * hint); extern Shishi_tkt *shishi_tkts_find_for_clientserver (Shishi_tkts * tkts, const char *client, const char *server); extern Shishi_tkt *shishi_tkts_find_for_server (Shishi_tkts * tkts, const char *server); extern Shishi_tkt *shishi_tkts_get (Shishi_tkts * tkts, Shishi_tkts_hint * hint); extern Shishi_tkt *shishi_tkts_get_tgt (Shishi_tkts * tkts, Shishi_tkts_hint * hint); extern Shishi_tkt *shishi_tkts_get_tgs (Shishi_tkts * tkts, Shishi_tkts_hint * hint, Shishi_tkt * tgt); extern Shishi_tkt *shishi_tkts_get_for_clientserver (Shishi_tkts * tkts, const char *client, const char *server); extern Shishi_tkt *shishi_tkts_get_for_server (Shishi_tkts * tkts, const char *server); extern Shishi_tkt *shishi_tkts_get_for_localservicepasswd (Shishi_tkts * tkts, const char *service, const char *passwd); /* tktccache.c */ extern char *shishi_tkts_default_ccache_guess (Shishi * handle); extern const char *shishi_tkts_default_ccache (Shishi * handle); extern void shishi_tkts_default_ccache_set (Shishi * handle, const char *ccache); extern int shishi_tkts_add_ccache_mem (Shishi * handle, const char *data, size_t len, Shishi_tkts * tkts); extern int shishi_tkts_add_ccache_file (Shishi * handle, const char *filename, Shishi_tkts * tkts); extern int shishi_tkts_from_ccache_mem (Shishi * handle, const char *data, size_t len, Shishi_tkts ** outtkts); extern int shishi_tkts_from_ccache_file (Shishi * handle, const char *filename, Shishi_tkts ** outtkts); /* diskio.c */ extern int shishi_enckdcreppart_print (Shishi * handle, FILE * fh, Shishi_asn1 enckdcreppart); extern int shishi_enckdcreppart_save (Shishi * handle, FILE * fh, Shishi_asn1 enckdcreppart); extern int shishi_enckdcreppart_parse (Shishi * handle, FILE * fh, Shishi_asn1 * enckdcreppart); extern int shishi_enckdcreppart_read (Shishi * handle, FILE * fh, Shishi_asn1 * enckdcreppart); extern int shishi_ticket_save (Shishi * handle, FILE * fh, Shishi_asn1 ticket); extern int shishi_ticket_print (Shishi * handle, FILE * fh, Shishi_asn1 ticket); extern int shishi_kdc_print (Shishi * handle, FILE * fh, Shishi_asn1 asreq, Shishi_asn1 asrep, Shishi_asn1 encasreppart); extern int shishi_ticket_parse (Shishi * handle, FILE * fh, Shishi_asn1 * ticket); extern int shishi_ticket_read (Shishi * handle, FILE * fh, Shishi_asn1 * ticket); extern int shishi_etype_info_print (Shishi * handle, FILE * fh, Shishi_asn1 etypeinfo); extern int shishi_etype_info2_print (Shishi * handle, FILE * fh, Shishi_asn1 etypeinfo2); extern int shishi_padata_print (Shishi * handle, FILE * fh, Shishi_asn1 padata); extern int shishi_methoddata_print (Shishi * handle, FILE * fh, Shishi_asn1 methoddata); /* authenticator.c */ extern Shishi_asn1 shishi_authenticator (Shishi * handle); extern int shishi_authenticator_set_crealm (Shishi * handle, Shishi_asn1 authenticator, const char *crealm); extern int shishi_authenticator_set_cname (Shishi * handle, Shishi_asn1 authenticator, Shishi_name_type name_type, const char *cname[]); extern int shishi_authenticator_client_set (Shishi * handle, Shishi_asn1 authenticator, const char *client); extern int shishi_authenticator_ctime (Shishi * handle, Shishi_asn1 authenticator, char **t); extern int shishi_authenticator_ctime_set (Shishi * handle, Shishi_asn1 authenticator, const char *t); extern int shishi_authenticator_cusec_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * cusec); extern int shishi_authenticator_cusec_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t cusec); extern int shishi_authenticator_seqnumber_get (Shishi * handle, Shishi_asn1 authenticator, uint32_t * seqnumber); extern int shishi_authenticator_seqnumber_remove (Shishi * handle, Shishi_asn1 authenticator); extern int shishi_authenticator_seqnumber_set (Shishi * handle, Shishi_asn1 authenticator, uint32_t seqnumber); extern int shishi_authenticator_client (Shishi * handle, Shishi_asn1 authenticator, char **client, size_t * clientlen); extern int shishi_authenticator_clientrealm (Shishi * handle, Shishi_asn1 authenticator, char **client, size_t * clientlen); extern int shishi_authenticator_remove_cksum (Shishi * handle, Shishi_asn1 authenticator); extern int shishi_authenticator_cksum (Shishi * handle, Shishi_asn1 authenticator, int32_t * cksumtype, char **cksum, size_t * cksumlen); extern int shishi_authenticator_set_cksum (Shishi * handle, Shishi_asn1 authenticator, int cksumtype, char *cksum, size_t cksumlen); extern int shishi_authenticator_add_cksum (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, char *data, size_t datalen); extern int shishi_authenticator_add_cksum_type (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * key, int keyusage, int cksumtype, char *data, size_t datalen); extern int shishi_authenticator_remove_subkey (Shishi * handle, Shishi_asn1 authenticator); extern Shishi_asn1 shishi_authenticator_subkey (Shishi * handle); extern int shishi_authenticator_get_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key ** subkey); extern int shishi_authenticator_set_subkey (Shishi * handle, Shishi_asn1 authenticator, int32_t subkeytype, const char *subkey, size_t subkeylen); extern int shishi_authenticator_add_random_subkey (Shishi * handle, Shishi_asn1 authenticator); extern int shishi_authenticator_add_random_subkey_etype (Shishi * handle, Shishi_asn1 authenticator, int etype); extern int shishi_authenticator_add_subkey (Shishi * handle, Shishi_asn1 authenticator, Shishi_key * subkey); extern int shishi_authenticator_clear_authorizationdata (Shishi * handle, Shishi_asn1 authenticator); extern int shishi_authenticator_add_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t adtype, const char *addata, size_t addatalen); extern int shishi_authenticator_authorizationdata (Shishi * handle, Shishi_asn1 authenticator, int32_t * adtype, char **addata, size_t * addatalen, size_t nth); extern int shishi_authenticator_read (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator); extern int shishi_authenticator_parse (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator); extern int shishi_authenticator_from_file (Shishi * handle, Shishi_asn1 * authenticator, int filetype, const char *filename); extern int shishi_authenticator_print (Shishi * handle, FILE * fh, Shishi_asn1 authenticator); extern int shishi_authenticator_to_file (Shishi * handle, Shishi_asn1 authenticator, int filetype, const char *filename); extern int shishi_authenticator_save (Shishi * handle, FILE * fh, Shishi_asn1 authenticator); /* as.c */ extern int shishi_as (Shishi * handle, Shishi_as ** as); extern void shishi_as_done (Shishi_as * as); extern Shishi_asn1 shishi_as_req (Shishi_as * as); extern int shishi_as_req_build (Shishi_as * as); extern void shishi_as_req_set (Shishi_as * as, Shishi_asn1 asreq); extern int shishi_as_req_der (Shishi_as * as, char **out, size_t * outlen); extern int shishi_as_req_der_set (Shishi_as * as, char *der, size_t derlen); extern Shishi_asn1 shishi_as_rep (Shishi_as * as); extern void shishi_as_rep_set (Shishi_as * as, Shishi_asn1 asrep); extern int shishi_as_rep_build (Shishi_as * as, Shishi_key * key); extern int shishi_as_rep_der (Shishi_as * as, char **out, size_t * outlen); extern int shishi_as_rep_der_set (Shishi_as * as, char *der, size_t derlen); extern Shishi_asn1 shishi_as_krberror (Shishi_as * as); extern int shishi_as_krberror_der (Shishi_as * as, char **out, size_t * outlen); extern void shishi_as_krberror_set (Shishi_as * as, Shishi_asn1 krberror); extern Shishi_tkt *shishi_as_tkt (Shishi_as * as); extern void shishi_as_tkt_set (Shishi_as * as, Shishi_tkt * tkt); extern int shishi_as_sendrecv (Shishi_as * as); extern int shishi_as_sendrecv_hint (Shishi_as * as, Shishi_tkts_hint * hint); extern int shishi_as_rep_process (Shishi_as * as, Shishi_key * key, const char *password); /* tgs.c */ extern int shishi_tgs (Shishi * handle, Shishi_tgs ** tgs); extern void shishi_tgs_done (Shishi_tgs * tgs); extern Shishi_tkt *shishi_tgs_tgtkt (Shishi_tgs * tgs); extern void shishi_tgs_tgtkt_set (Shishi_tgs * tgs, Shishi_tkt * tgtkt); extern Shishi_ap *shishi_tgs_ap (Shishi_tgs * tgs); extern Shishi_asn1 shishi_tgs_req (Shishi_tgs * tgs); extern int shishi_tgs_req_der (Shishi_tgs * tgs, char **out, size_t * outlen); extern int shishi_tgs_req_der_set (Shishi_tgs * tgs, char *der, size_t derlen); extern void shishi_tgs_req_set (Shishi_tgs * tgs, Shishi_asn1 tgsreq); extern int shishi_tgs_req_build (Shishi_tgs * tgs); extern int shishi_tgs_req_process (Shishi_tgs * tgs); extern Shishi_asn1 shishi_tgs_rep (Shishi_tgs * tgs); extern int shishi_tgs_rep_der (Shishi_tgs * tgs, char **out, size_t * outlen); extern int shishi_tgs_rep_build (Shishi_tgs * tgs, int keyusage, Shishi_key * key); extern int shishi_tgs_rep_process (Shishi_tgs * tgs); extern Shishi_asn1 shishi_tgs_krberror (Shishi_tgs * tgs); extern int shishi_tgs_krberror_der (Shishi_tgs * tgs, char **out, size_t * outlen); extern void shishi_tgs_krberror_set (Shishi_tgs * tgs, Shishi_asn1 krberror); extern Shishi_tkt *shishi_tgs_tkt (Shishi_tgs * tgs); extern void shishi_tgs_tkt_set (Shishi_tgs * tgs, Shishi_tkt * tkt); extern int shishi_tgs_sendrecv (Shishi_tgs * tgs); extern int shishi_tgs_sendrecv_hint (Shishi_tgs * tgs, Shishi_tkts_hint * hint); extern int shishi_tgs_set_server (Shishi_tgs * tgs, const char *server); extern int shishi_tgs_set_realm (Shishi_tgs * tgs, const char *realm); extern int shishi_tgs_set_realmserver (Shishi_tgs * tgs, const char *realm, const char *server); /* kdcreq.c */ extern int shishi_kdcreq (Shishi * handle, char *realm, char *service, Shishi_asn1 * req); extern Shishi_asn1 shishi_asreq (Shishi * handle); extern Shishi_asn1 shishi_asreq_rsc (Shishi * handle, char *realm, char *server, char *client); extern Shishi_asn1 shishi_tgsreq (Shishi * handle); extern Shishi_asn1 shishi_tgsreq_rst (Shishi * handle, char *realm, char *server, Shishi_tkt * tkt); extern int shishi_kdcreq_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq); extern int shishi_kdcreq_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcreq); extern int shishi_kdcreq_to_file (Shishi * handle, Shishi_asn1 kdcreq, int filetype, const char *filename); extern int shishi_kdcreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq); extern int shishi_kdcreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcreq); extern int shishi_kdcreq_from_file (Shishi * handle, Shishi_asn1 * kdcreq, int filetype, const char *filename); extern int shishi_asreq_clientrealm (Shishi * handle, Shishi_asn1 asreq, char **client, size_t * clientlen); extern int shishi_kdcreq_nonce (Shishi * handle, Shishi_asn1 kdcreq, uint32_t * nonce); extern int shishi_kdcreq_nonce_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t nonce); extern int shishi_kdcreq_client (Shishi * handle, Shishi_asn1 kdcreq, char **client, size_t * clientlen); extern int shishi_kdcreq_set_cname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char *principal); extern int shishi_kdcreq_server (Shishi * handle, Shishi_asn1 kdcreq, char **server, size_t * serverlen); extern int shishi_kdcreq_set_sname (Shishi * handle, Shishi_asn1 kdcreq, Shishi_name_type name_type, const char *sname[]); extern int shishi_kdcreq_realm (Shishi * handle, Shishi_asn1 kdcreq, char **realm, size_t * realmlen); extern int shishi_kdcreq_realm_get (Shishi * handle, Shishi_asn1 kdcreq, char **realm, size_t * realmlen); extern int shishi_kdcreq_set_realm (Shishi * handle, Shishi_asn1 kdcreq, const char *realm); extern int shishi_kdcreq_set_server (Shishi * handle, Shishi_asn1 req, const char *service); extern int shishi_kdcreq_set_realmserver (Shishi * handle, Shishi_asn1 req, char *realm, char *service); extern int shishi_kdcreq_till (Shishi * handle, Shishi_asn1 kdcreq, char **till, size_t * tilllen); extern time_t shishi_kdcreq_tillc (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype); extern int shishi_kdcreq_set_etype (Shishi * handle, Shishi_asn1 kdcreq, int32_t * etype, int netype); extern int shishi_kdcreq_options (Shishi * handle, Shishi_asn1 kdcreq, uint32_t * flags); extern int shishi_kdcreq_forwardable_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_forwarded_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_proxiable_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_proxy_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_allow_postdate_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_postdated_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_renewable_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_disable_transited_check_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_renewable_ok_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_enc_tkt_in_skey_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_renew_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_validate_p (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_options_set (Shishi * handle, Shishi_asn1 kdcreq, uint32_t options); extern int shishi_kdcreq_options_add (Shishi * handle, Shishi_asn1 kdcreq, uint32_t option); extern int shishi_kdcreq_clear_padata (Shishi * handle, Shishi_asn1 kdcreq); extern int shishi_kdcreq_get_padata (Shishi * handle, Shishi_asn1 kdcreq, Shishi_padata_type padatatype, char **out, size_t * outlen); extern int shishi_kdcreq_get_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * apreq); extern int shishi_kdcreq_add_padata (Shishi * handle, Shishi_asn1 kdcreq, int padatatype, const char *data, size_t datalen); extern int shishi_kdcreq_add_padata_tgs (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 apreq); extern int shishi_kdcreq_add_padata_preauth (Shishi * handle, Shishi_asn1 kdcreq, Shishi_key * key); extern int shishi_kdcreq_build (Shishi * handle, Shishi_asn1 kdcreq); /* kdc.c */ extern int shishi_as_derive_salt (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, char **salt, size_t * saltlen); extern int shishi_tgs_process (Shishi * handle, Shishi_asn1 tgsreq, Shishi_asn1 tgsrep, Shishi_asn1 authenticator, Shishi_asn1 oldenckdcreppart, Shishi_asn1 * enckdcreppart); extern int shishi_as_process (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep, const char *string, Shishi_asn1 * enckdcreppart); extern int shishi_kdc_process (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 * enckdcreppart); extern int shishi_kdcreq_sendrecv (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * kdcrep); extern int shishi_kdcreq_sendrecv_hint (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 * kdcrep, Shishi_tkts_hint * hint); extern int shishi_kdc_copy_crealm (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart); extern int shishi_as_check_crealm (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep); extern int shishi_kdc_copy_cname (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 encticketpart); extern int shishi_as_check_cname (Shishi * handle, Shishi_asn1 asreq, Shishi_asn1 asrep); extern int shishi_kdc_copy_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart); extern int shishi_kdc_check_nonce (Shishi * handle, Shishi_asn1 kdcreq, Shishi_asn1 enckdcreppart); /* kdcrep.c */ extern Shishi_asn1 shishi_asrep (Shishi * handle); extern Shishi_asn1 shishi_tgsrep (Shishi * handle); extern int shishi_kdcrep_save (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep); extern int shishi_kdcrep_print (Shishi * handle, FILE * fh, Shishi_asn1 kdcrep); extern int shishi_kdcrep_to_file (Shishi * handle, Shishi_asn1 kdcrep, int filetype, const char *filename); extern int shishi_kdcrep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep); extern int shishi_kdcrep_read (Shishi * handle, FILE * fh, Shishi_asn1 * kdcrep); extern int shishi_kdcrep_from_file (Shishi * handle, Shishi_asn1 * kdcrep, int filetype, const char *filename); extern int shishi_kdcrep_clear_padata (Shishi * handle, Shishi_asn1 kdcrep); extern int shishi_kdcrep_get_enc_part_etype (Shishi * handle, Shishi_asn1 kdcrep, int32_t * etype); extern int shishi_kdcrep_add_enc_part (Shishi * handle, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 enckdcreppart); extern int shishi_kdcrep_get_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 * ticket); extern int shishi_kdcrep_set_ticket (Shishi * handle, Shishi_asn1 kdcrep, Shishi_asn1 ticket); extern int shishi_kdcrep_crealm_set (Shishi * handle, Shishi_asn1 kdcrep, const char *crealm); extern int shishi_kdcrep_cname_set (Shishi * handle, Shishi_asn1 kdcrep, Shishi_name_type name_type, const char *cname[]); extern int shishi_kdcrep_client_set (Shishi * handle, Shishi_asn1 kdcrep, const char *client); extern int shishi_kdcrep_crealmserver_set (Shishi * handle, Shishi_asn1 kdcrep, const char *crealm, const char *client); extern int shishi_kdcrep_set_enc_part (Shishi * handle, Shishi_asn1 kdcrep, int32_t etype, uint32_t kvno, const char *buf, size_t buflen); extern int shishi_kdcrep_decrypt (Shishi * handle, Shishi_asn1 kdcrep, Shishi_key * key, int keyusage, Shishi_asn1 * enckdcreppart); /* enckdcreppart.c */ extern Shishi_asn1 shishi_enckdcreppart (Shishi * handle); extern Shishi_asn1 shishi_encasreppart (Shishi * handle); extern int shishi_enckdcreppart_get_key (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key ** key); extern int shishi_enckdcreppart_key_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_key * key); extern int shishi_enckdcreppart_nonce_set (Shishi * handle, Shishi_asn1 enckdcreppart, uint32_t nonce); extern int shishi_enckdcreppart_flags_set (Shishi * handle, Shishi_asn1 enckdcreppart, int flags); extern int shishi_enckdcreppart_authtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *authtime); extern int shishi_enckdcreppart_starttime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *starttime); extern int shishi_enckdcreppart_endtime_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *endtime); extern int shishi_enckdcreppart_renew_till_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *renew_till); extern int shishi_enckdcreppart_srealm_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *srealm); extern int shishi_enckdcreppart_sname_set (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_name_type name_type, char *sname[]); extern int shishi_enckdcreppart_server_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *server); extern int shishi_enckdcreppart_srealmserver_set (Shishi * handle, Shishi_asn1 enckdcreppart, const char *srealm, const char *server); extern int shishi_enckdcreppart_populate_encticketpart (Shishi * handle, Shishi_asn1 enckdcreppart, Shishi_asn1 encticketpart); /* krberror.c */ extern Shishi_asn1 shishi_krberror (Shishi * handle); extern int shishi_krberror_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror); extern int shishi_krberror_save (Shishi * handle, FILE * fh, Shishi_asn1 krberror); extern int shishi_krberror_to_file (Shishi * handle, Shishi_asn1 krberror, int filetype, const char *filename); extern int shishi_krberror_parse (Shishi * handle, FILE * fh, Shishi_asn1 * krberror); extern int shishi_krberror_read (Shishi * handle, FILE * fh, Shishi_asn1 * krberror); extern int shishi_krberror_from_file (Shishi * handle, Shishi_asn1 * krberror, int filetype, const char *filename); extern int shishi_krberror_build (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_der (Shishi * handle, Shishi_asn1 krberror, char **out, size_t * outlen); extern int shishi_krberror_crealm (Shishi * handle, Shishi_asn1 krberror, char **realm, size_t * realmlen); extern int shishi_krberror_remove_crealm (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_set_crealm (Shishi * handle, Shishi_asn1 krberror, const char *crealm); extern int shishi_krberror_client (Shishi * handle, Shishi_asn1 krberror, char **client, size_t * clientlen); extern int shishi_krberror_set_cname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char *cname[]); extern int shishi_krberror_remove_cname (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_client_set (Shishi * handle, Shishi_asn1 krberror, const char *client); extern int shishi_krberror_realm (Shishi * handle, Shishi_asn1 krberror, char **realm, size_t * realmlen); extern int shishi_krberror_set_realm (Shishi * handle, Shishi_asn1 krberror, const char *realm); extern int shishi_krberror_server (Shishi * handle, Shishi_asn1 krberror, char **server, size_t * serverlen); extern int shishi_krberror_remove_sname (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_set_sname (Shishi * handle, Shishi_asn1 krberror, Shishi_name_type name_type, const char *sname[]); extern int shishi_krberror_server_set (Shishi * handle, Shishi_asn1 krberror, const char *server); extern int shishi_krberror_ctime (Shishi * handle, Shishi_asn1 krberror, char **t); extern int shishi_krberror_ctime_set (Shishi * handle, Shishi_asn1 krberror, const char *t); extern int shishi_krberror_remove_ctime (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_cusec (Shishi * handle, Shishi_asn1 krberror, uint32_t * cusec); extern int shishi_krberror_cusec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t cusec); extern int shishi_krberror_remove_cusec (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_stime (Shishi * handle, Shishi_asn1 krberror, char **t); extern int shishi_krberror_stime_set (Shishi * handle, Shishi_asn1 krberror, const char *t); extern int shishi_krberror_susec (Shishi * handle, Shishi_asn1 krberror, uint32_t * susec); extern int shishi_krberror_susec_set (Shishi * handle, Shishi_asn1 krberror, uint32_t susec); extern int shishi_krberror_errorcode_set (Shishi * handle, Shishi_asn1 krberror, int errorcode); extern int shishi_krberror_etext (Shishi * handle, Shishi_asn1 krberror, char **etext, size_t * etextlen); extern int shishi_krberror_set_etext (Shishi * handle, Shishi_asn1 krberror, const char *etext); extern int shishi_krberror_remove_etext (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_edata (Shishi * handle, Shishi_asn1 krberror, char **edata, size_t * edatalen); extern int shishi_krberror_set_edata (Shishi * handle, Shishi_asn1 krberror, const char *edata); extern int shishi_krberror_remove_edata (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_errorcode (Shishi * handle, Shishi_asn1 krberror, int *errorcode); extern int shishi_krberror_errorcode_fast (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_pretty_print (Shishi * handle, FILE * fh, Shishi_asn1 krberror); extern const char *shishi_krberror_errorcode_message (Shishi * handle, int errorcode); extern const char *shishi_krberror_message (Shishi * handle, Shishi_asn1 krberror); extern int shishi_krberror_methoddata (Shishi * handle, Shishi_asn1 krberror, Shishi_asn1 * methoddata); /* gztime.c */ extern const char *shishi_generalize_time (Shishi * handle, time_t t); extern const char *shishi_generalize_now (Shishi * handle); extern time_t shishi_generalize_ctime (Shishi * handle, const char *t); extern int shishi_time (Shishi * handle, Shishi_asn1 node, const char *field, char **t); extern int shishi_ctime (Shishi * handle, Shishi_asn1 node, const char *field, time_t * t); /* nettle.c, libgcrypt.c, ... */ extern int shishi_randomize (Shishi * handle, int strong, void *data, size_t datalen); extern int shishi_crc (Shishi * handle, const char *in, size_t inlen, char *out[4]); extern int shishi_md4 (Shishi * handle, const char *in, size_t inlen, char *out[16]); extern int shishi_md5 (Shishi * handle, const char *in, size_t inlen, char *out[16]); extern int shishi_hmac_md5 (Shishi * handle, const char *key, size_t keylen, const char *in, size_t inlen, char *outhash[16]); extern int shishi_hmac_sha1 (Shishi * handle, const char *key, size_t keylen, const char *in, size_t inlen, char *outhash[20]); extern int shishi_des_cbc_mac (Shishi * handle, const char key[8], const char iv[8], const char *in, size_t inlen, char *out[8]); extern int shishi_arcfour (Shishi * handle, int decryptp, const char *key, size_t keylen, const char iv[258], char *ivout[258], const char *in, size_t inlen, char **out); extern int shishi_des (Shishi * handle, int decryptp, const char key[8], const char iv[8], char *ivout[8], const char *in, size_t inlen, char **out); extern int shishi_3des (Shishi * handle, int decryptp, const char key[24], const char iv[8], char *ivout[8], const char *in, size_t inlen, char **out); extern int shishi_aes_cts (Shishi * handle, int decryptp, const char *key, size_t keylen, const char iv[16], char *ivout[16], const char *in, size_t inlen, char **out); /* crypto.c */ extern int shishi_cipher_supported_p (int type); extern const char *shishi_cipher_name (int type); extern int shishi_cipher_blocksize (int type); extern int shishi_cipher_confoundersize (int type); extern size_t shishi_cipher_keylen (int type); extern size_t shishi_cipher_randomlen (int type); extern int shishi_cipher_defaultcksumtype (int32_t type); extern int shishi_cipher_parse (const char *cipher); extern int shishi_checksum_supported_p (int32_t type); extern const char *shishi_checksum_name (int32_t type); extern size_t shishi_checksum_cksumlen (int32_t type); extern int shishi_checksum_parse (const char *checksum); extern int shishi_string_to_key (Shishi * handle, int32_t keytype, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key * outkey); extern int shishi_random_to_key (Shishi * handle, int32_t keytype, const char *rnd, size_t rndlen, Shishi_key * outkey); extern int shishi_encrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_encrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_encrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_encrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_encrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_encrypt (Shishi * handle, Shishi_key * key, int keyusage, char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt_ivupdate_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt_iv_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt_etype (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt_ivupdate (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, char **ivout, size_t * ivoutlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt_iv (Shishi * handle, Shishi_key * key, int keyusage, const char *iv, size_t ivlen, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_decrypt (Shishi * handle, Shishi_key * key, int keyusage, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_checksum (Shishi * handle, Shishi_key * key, int keyusage, int32_t cksumtype, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_verify (Shishi * handle, Shishi_key * key, int keyusage, int cksumtype, const char *in, size_t inlen, const char *cksum, size_t cksumlen); extern int shishi_dk (Shishi * handle, Shishi_key * key, const char *prfconstant, size_t prfconstantlen, Shishi_key * derivedkey); extern int shishi_dr (Shishi * handle, Shishi_key * key, const char *prfconstant, size_t prfconstantlen, char *derivedrandom, size_t derivedrandomlen); extern int shishi_n_fold (Shishi * handle, const char *in, size_t inlen, char *out, size_t outlen); extern int shishi_pbkdf2_sha1 (Shishi * handle, const char *P, size_t Plen, const char *S, size_t Slen, unsigned int c, unsigned int dkLen, char *DK); /* crypto-ctx.c */ extern Shishi_crypto *shishi_crypto (Shishi * handle, Shishi_key * key, int keyusage, int32_t etype, const char *iv, size_t ivlen); extern void shishi_crypto_close (Shishi_crypto * ctx); extern int shishi_crypto_encrypt (Shishi_crypto * ctx, const char *in, size_t inlen, char **out, size_t * outlen); extern int shishi_crypto_decrypt (Shishi_crypto * ctx, const char *in, size_t inlen, char **out, size_t * outlen); /* version.c */ extern const char *shishi_check_version (const char *req_version); /* password.c */ typedef int (*shishi_prompt_password_func) (Shishi * handle, char **s, const char *format, va_list ap); extern void shishi_prompt_password_callback_set (Shishi * handle, shishi_prompt_password_func cb); extern shishi_prompt_password_func shishi_prompt_password_callback_get (Shishi * handle); extern int shishi_prompt_password (Shishi * handle, char **s, const char *format, ...); /* asn1.c */ extern int shishi_asn1_number_of_elements (Shishi * handle, Shishi_asn1 node, const char *field, size_t * n); extern int shishi_asn1_empty_p (Shishi * handle, Shishi_asn1 node, const char *field); extern int shishi_asn1_read (Shishi * handle, Shishi_asn1 node, const char *field, char **data, size_t * datalen); extern int shishi_asn1_read_inline (Shishi * handle, Shishi_asn1 node, const char *field, char *data, size_t * datalen); extern int shishi_asn1_read_integer (Shishi * handle, Shishi_asn1 node, const char *field, int *i); extern int shishi_asn1_read_int32 (Shishi * handle, Shishi_asn1 node, const char *field, int32_t * i); extern int shishi_asn1_read_uint32 (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t * i); extern int shishi_asn1_read_bitstring (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t * flags); extern int shishi_asn1_read_optional (Shishi * handle, Shishi_asn1 node, const char *field, char **data, size_t * datalen); extern int shishi_asn1_write (Shishi * handle, Shishi_asn1 node, const char *field, const char *data, size_t datalen); extern int shishi_asn1_write_integer (Shishi * handle, Shishi_asn1 node, const char *field, int n); extern int shishi_asn1_write_int32 (Shishi * handle, Shishi_asn1 node, const char *field, int32_t n); extern int shishi_asn1_write_uint32 (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t n); extern int shishi_asn1_write_bitstring (Shishi * handle, Shishi_asn1 node, const char *field, uint32_t flags); extern void shishi_asn1_done (Shishi * handle, Shishi_asn1 node); extern Shishi_asn1 shishi_asn1_pa_enc_ts_enc (Shishi * handle); extern Shishi_asn1 shishi_asn1_encrypteddata (Shishi * handle); extern Shishi_asn1 shishi_asn1_padata (Shishi * handle); extern Shishi_asn1 shishi_asn1_methoddata (Shishi * handle); extern Shishi_asn1 shishi_asn1_etype_info (Shishi * handle); extern Shishi_asn1 shishi_asn1_etype_info2 (Shishi * handle); extern Shishi_asn1 shishi_asn1_asreq (Shishi * handle); extern Shishi_asn1 shishi_asn1_asrep (Shishi * handle); extern Shishi_asn1 shishi_asn1_tgsreq (Shishi * handle); extern Shishi_asn1 shishi_asn1_tgsrep (Shishi * handle); extern Shishi_asn1 shishi_asn1_apreq (Shishi * handle); extern Shishi_asn1 shishi_asn1_aprep (Shishi * handle); extern Shishi_asn1 shishi_asn1_ticket (Shishi * handle); extern Shishi_asn1 shishi_asn1_encapreppart (Shishi * handle); extern Shishi_asn1 shishi_asn1_encticketpart (Shishi * handle); extern Shishi_asn1 shishi_asn1_authenticator (Shishi * handle); extern Shishi_asn1 shishi_asn1_enckdcreppart (Shishi * handle); extern Shishi_asn1 shishi_asn1_encasreppart (Shishi * handle); extern Shishi_asn1 shishi_asn1_krberror (Shishi * handle); extern Shishi_asn1 shishi_asn1_krbsafe (Shishi * handle); extern Shishi_asn1 shishi_asn1_priv (Shishi * handle); extern Shishi_asn1 shishi_asn1_encprivpart (Shishi * handle); extern int shishi_asn1_to_der (Shishi * handle, Shishi_asn1 node, char **der, size_t * len); extern int shishi_asn1_to_der_field (Shishi * handle, Shishi_asn1 node, const char *field, char **der, size_t * len); extern Shishi_msgtype shishi_asn1_msgtype (Shishi * handle, Shishi_asn1 node); extern Shishi_msgtype shishi_der_msgtype (Shishi * handle, const char *der, size_t derlen); extern void shishi_asn1_print (Shishi * handle, Shishi_asn1 node, FILE * fh); extern Shishi_asn1 shishi_der2asn1 (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_padata (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_methoddata (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_etype_info (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_etype_info2 (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_ticket (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_encticketpart (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_asreq (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_tgsreq (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_asrep (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_tgsrep (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_kdcrep (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_kdcreq (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_apreq (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_aprep (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_authenticator (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_krberror (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_krbsafe (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_priv (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_encasreppart (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_enctgsreppart (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_enckdcreppart (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_encapreppart (Shishi * handle, const char *der, size_t derlen); extern Shishi_asn1 shishi_der2asn1_encprivpart (Shishi * handle, const char *der, size_t derlen); /* ap.c */ extern int shishi_ap (Shishi * handle, Shishi_ap ** ap); extern int shishi_ap_etype (Shishi * handle, Shishi_ap ** ap, int etype); extern int shishi_ap_nosubkey (Shishi * handle, Shishi_ap ** ap); extern void shishi_ap_done (Shishi_ap * ap); extern int shishi_ap_set_tktoptions (Shishi_ap * ap, Shishi_tkt * tkt, int options); extern int shishi_ap_tktoptions (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options); extern int shishi_ap_etype_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, int32_t etype, Shishi_tkt * tkt, int options, const char *data, size_t len); extern int shishi_ap_set_tktoptionsdata (Shishi_ap * ap, Shishi_tkt * tkt, int options, const char *data, size_t len); extern int shishi_ap_tktoptionsdata (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, const char *data, size_t len); extern int shishi_ap_set_tktoptionsraw (Shishi_ap * ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char *data, size_t len); extern int shishi_ap_tktoptionsraw (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, int32_t cksumtype, const char *data, size_t len); extern int shishi_ap_set_tktoptionsasn1usage (Shishi_ap * ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char *field, int authenticatorcksumkeyusage, int authenticatorkeyusage); extern int shishi_ap_tktoptionsasn1usage (Shishi * handle, Shishi_ap ** ap, Shishi_tkt * tkt, int options, Shishi_asn1 node, const char *field, int authenticatorcksumkeyusage, int authenticatorkeyusage); extern Shishi_tkt *shishi_ap_tkt (Shishi_ap * ap); extern void shishi_ap_tkt_set (Shishi_ap * ap, Shishi_tkt * tkt); extern int shishi_ap_authenticator_cksumdata (Shishi_ap * ap, char *out, size_t * len); extern void shishi_ap_authenticator_cksumdata_set (Shishi_ap * ap, const char *authenticatorcksumdata, size_t authenticatorcksumdatalen); extern void shishi_ap_authenticator_cksumraw_set (Shishi_ap * ap, int32_t authenticatorcksumtype, const char *authenticatorcksumraw, size_t authenticatorcksumrawlen); extern int32_t shishi_ap_authenticator_cksumtype (Shishi_ap * ap); extern void shishi_ap_authenticator_cksumtype_set (Shishi_ap * ap, int32_t cksumtype); extern Shishi_asn1 shishi_ap_authenticator (Shishi_ap * ap); extern void shishi_ap_authenticator_set (Shishi_ap * ap, Shishi_asn1 authenticator); extern Shishi_asn1 shishi_ap_req (Shishi_ap * ap); extern void shishi_ap_req_set (Shishi_ap * ap, Shishi_asn1 apreq); extern int shishi_ap_req_der (Shishi_ap * ap, char **out, size_t * outlen); extern int shishi_ap_req_der_set (Shishi_ap * ap, char *der, size_t derlen); extern int shishi_ap_req_build (Shishi_ap * ap); extern int shishi_ap_req_asn1 (Shishi_ap * ap, Shishi_asn1 * apreq); extern Shishi_key *shishi_ap_key (Shishi_ap * ap); extern int shishi_ap_req_decode (Shishi_ap * ap); extern int shishi_ap_req_process (Shishi_ap * ap, Shishi_key * key); extern int shishi_ap_req_process_keyusage (Shishi_ap * ap, Shishi_key * key, int32_t keyusage); extern Shishi_asn1 shishi_ap_rep (Shishi_ap * ap); extern void shishi_ap_rep_set (Shishi_ap * ap, Shishi_asn1 aprep); extern int shishi_ap_rep_der (Shishi_ap * ap, char **out, size_t * outlen); extern int shishi_ap_rep_der_set (Shishi_ap * ap, char *der, size_t derlen); extern int shishi_ap_rep_verify (Shishi_ap * ap); extern int shishi_ap_rep_verify_der (Shishi_ap * ap, char *der, size_t derlen); extern int shishi_ap_rep_verify_asn1 (Shishi_ap * ap, Shishi_asn1 aprep); extern int shishi_ap_rep_asn1 (Shishi_ap * ap, Shishi_asn1 * aprep); extern int shishi_ap_rep_build (Shishi_ap * ap); extern Shishi_asn1 shishi_ap_encapreppart (Shishi_ap * ap); extern void shishi_ap_encapreppart_set (Shishi_ap * ap, Shishi_asn1 encapreppart); extern const char *shishi_ap_option2string (Shishi_apoptions option); extern Shishi_apoptions shishi_ap_string2option (const char *str); /* key.c */ extern const char *shishi_key_principal (const Shishi_key * key); extern void shishi_key_principal_set (Shishi_key * key, const char *principal); extern const char *shishi_key_realm (const Shishi_key * key); extern void shishi_key_realm_set (Shishi_key * key, const char *realm); extern int shishi_key_type (const Shishi_key * key); extern void shishi_key_type_set (Shishi_key * key, int32_t type); extern const char *shishi_key_value (const Shishi_key * key); extern void shishi_key_value_set (Shishi_key * key, const char *value); extern const char *shishi_key_name (Shishi_key * key); extern size_t shishi_key_length (const Shishi_key * key); extern uint32_t shishi_key_version (const Shishi_key * key); extern void shishi_key_version_set (Shishi_key * key, uint32_t kvno); extern time_t shishi_key_timestamp (const Shishi_key * key); extern void shishi_key_timestamp_set (Shishi_key * key, time_t timestamp); extern int shishi_key (Shishi * handle, Shishi_key ** key); extern void shishi_key_done (Shishi_key * key); extern void shishi_key_copy (Shishi_key * dstkey, Shishi_key * srckey); extern int shishi_key_print (Shishi * handle, FILE * fh, const Shishi_key * key); extern int shishi_key_to_file (Shishi * handle, const char *filename, Shishi_key * key); extern int shishi_key_parse (Shishi * handle, FILE * fh, Shishi_key ** key); extern int shishi_key_random (Shishi * handle, int32_t type, Shishi_key ** key); extern int shishi_key_from_value (Shishi * handle, int32_t type, const char *value, Shishi_key ** key); extern int shishi_key_from_base64 (Shishi * handle, int32_t type, const char *value, Shishi_key ** key); extern int shishi_key_from_random (Shishi * handle, int32_t type, const char *rnd, size_t rndlen, Shishi_key ** outkey); extern int shishi_key_from_string (Shishi * handle, int32_t type, const char *password, size_t passwordlen, const char *salt, size_t saltlen, const char *parameter, Shishi_key ** outkey); extern int shishi_key_from_name (Shishi * handle, int32_t type, const char *name, const char *password, size_t passwordlen, const char *parameter, Shishi_key ** outkey); /* keys.c */ extern int shishi_keys (Shishi * handle, Shishi_keys ** keys); extern void shishi_keys_done (Shishi_keys ** keys); extern int shishi_keys_size (Shishi_keys * keys); extern const Shishi_key *shishi_keys_nth (Shishi_keys * keys, int keyno); extern void shishi_keys_remove (Shishi_keys * keys, int keyno); extern int shishi_keys_add (Shishi_keys * keys, Shishi_key * key); extern int shishi_keys_print (Shishi_keys * keys, FILE * fh); extern int shishi_keys_from_file (Shishi_keys * keys, const char *filename); extern int shishi_keys_to_file (Shishi * handle, const char *filename, Shishi_keys * keys); extern Shishi_key *shishi_keys_for_serverrealm_in_file (Shishi * handle, const char *filename, const char *server, const char *realm); extern Shishi_key *shishi_keys_for_server_in_file (Shishi * handle, const char *filename, const char *server); extern Shishi_key *shishi_keys_for_localservicerealm_in_file (Shishi * handle, const char *filename, const char *service, const char *realm); /* keytab.c */ extern int shishi_keys_add_keytab_mem (Shishi * handle, const char *data, size_t len, Shishi_keys * keys); extern int shishi_keys_add_keytab_file (Shishi * handle, const char *filename, Shishi_keys * keys); extern int shishi_keys_from_keytab_mem (Shishi * handle, const char *data, size_t len, Shishi_keys ** outkeys); extern int shishi_keys_from_keytab_file (Shishi * handle, const char *filename, Shishi_keys ** outkeys); extern int shishi_keys_to_keytab_mem (Shishi * handle, Shishi_keys * keys, char **out, size_t * len); extern int shishi_keys_to_keytab_file (Shishi * handle, Shishi_keys * keys, const char *filename); /* hostkeys.c */ extern const char *shishi_hostkeys_default_file (Shishi * handle); extern void shishi_hostkeys_default_file_set (Shishi * handle, const char *hostkeysfile); extern Shishi_key *shishi_hostkeys_for_server (Shishi * handle, const char *server); extern Shishi_key *shishi_hostkeys_for_serverrealm (Shishi * handle, const char *server, const char *realm); extern Shishi_key *shishi_hostkeys_for_localservicerealm (Shishi * handle, const char *service, const char *realm); extern Shishi_key *shishi_hostkeys_for_localservice (Shishi * handle, const char *service); /* encapreppart.c */ extern Shishi_asn1 shishi_encapreppart (Shishi * handle); extern int shishi_encapreppart_time_copy (Shishi * handle, Shishi_asn1 encapreppart, Shishi_asn1 authenticator); extern int shishi_encapreppart_ctime (Shishi * handle, Shishi_asn1 encapreppart, char **t); extern int shishi_encapreppart_ctime_set (Shishi * handle, Shishi_asn1 encapreppart, const char *t); extern int shishi_encapreppart_cusec_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * cusec); extern int shishi_encapreppart_cusec_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t cusec); extern int shishi_encapreppart_print (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart); extern int shishi_encapreppart_save (Shishi * handle, FILE * fh, Shishi_asn1 encapreppart); extern int shishi_encapreppart_to_file (Shishi * handle, Shishi_asn1 encapreppart, int filetype, const char *filename); extern int shishi_encapreppart_read (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart); extern int shishi_encapreppart_parse (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart); extern int shishi_encapreppart_from_file (Shishi * handle, Shishi_asn1 * encapreppart, int filetype, const char *filename); extern int shishi_encapreppart_get_key (Shishi * handle, Shishi_asn1 encapreppart, Shishi_key ** key); extern int shishi_encapreppart_seqnumber_get (Shishi * handle, Shishi_asn1 encapreppart, uint32_t * seqnumber); extern int shishi_encapreppart_seqnumber_remove (Shishi * handle, Shishi_asn1 encapreppart); extern int shishi_encapreppart_seqnumber_set (Shishi * handle, Shishi_asn1 encapreppart, uint32_t seqnumber); /* apreq.c */ extern Shishi_asn1 shishi_apreq (Shishi * handle); extern int shishi_apreq_parse (Shishi * handle, FILE * fh, Shishi_asn1 * apreq); extern int shishi_apreq_from_file (Shishi * handle, Shishi_asn1 * apreq, int filetype, const char *filename); extern int shishi_apreq_print (Shishi * handle, FILE * fh, Shishi_asn1 apreq); extern int shishi_apreq_to_file (Shishi * handle, Shishi_asn1 apreq, int filetype, const char *filename); extern int shishi_apreq_read (Shishi * handle, FILE * fh, Shishi_asn1 * apreq); extern int shishi_apreq_save (Shishi * handle, FILE * fh, Shishi_asn1 apreq); extern int shishi_apreq_set_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 ticket); extern int shishi_apreq_set_authenticator (Shishi * handle, Shishi_asn1 apreq, int32_t etype, uint32_t kvno, const char *buf, size_t buflen); extern int shishi_apreq_add_authenticator (Shishi * handle, Shishi_asn1 apreq, Shishi_key * key, int keyusage, Shishi_asn1 authenticator); extern int shishi_apreq_options (Shishi * handle, Shishi_asn1 apreq, uint32_t * flags); extern int shishi_apreq_use_session_key_p (Shishi * handle, Shishi_asn1 apreq); extern int shishi_apreq_mutual_required_p (Shishi * handle, Shishi_asn1 apreq); extern int shishi_apreq_options_set (Shishi * handle, Shishi_asn1 apreq, uint32_t options); extern int shishi_apreq_options_add (Shishi * handle, Shishi_asn1 apreq, uint32_t option); extern int shishi_apreq_options_remove (Shishi * handle, Shishi_asn1 apreq, uint32_t option); extern int shishi_apreq_get_ticket (Shishi * handle, Shishi_asn1 apreq, Shishi_asn1 * ticket); extern int shishi_apreq_get_authenticator_etype (Shishi * handle, Shishi_asn1 apreq, int32_t * etype); extern int shishi_apreq_decrypt (Shishi * handle, Shishi_asn1 apreq, Shishi_key * key, int keyusage, Shishi_asn1 * authenticator); /* aprep.c */ extern Shishi_asn1 shishi_aprep (Shishi * handle); extern int shishi_aprep_print (Shishi * handle, FILE * fh, Shishi_asn1 aprep); extern int shishi_aprep_save (Shishi * handle, FILE * fh, Shishi_asn1 aprep); extern int shishi_aprep_to_file (Shishi * handle, Shishi_asn1 aprep, int filetype, const char *filename); extern int shishi_aprep_read (Shishi * handle, FILE * fh, Shishi_asn1 * aprep); extern int shishi_aprep_parse (Shishi * handle, FILE * fh, Shishi_asn1 * aprep); extern int shishi_aprep_from_file (Shishi * handle, Shishi_asn1 * aprep, int filetype, const char *filename); extern int shishi_aprep_decrypt (Shishi * handle, Shishi_asn1 aprep, Shishi_key * key, int keyusage, Shishi_asn1 * encapreppart); extern int shishi_aprep_verify (Shishi * handle, Shishi_asn1 authenticator, Shishi_asn1 encapreppart); extern int shishi_aprep_enc_part_set (Shishi * handle, Shishi_asn1 aprep, int etype, const char *buf, size_t buflen); extern int shishi_aprep_enc_part_add (Shishi * handle, Shishi_asn1 aprep, Shishi_asn1 encticketpart, Shishi_asn1 encapreppart); extern int shishi_aprep_enc_part_make (Shishi * handle, Shishi_asn1 aprep, Shishi_asn1 encapreppart, Shishi_asn1 authenticator, Shishi_asn1 encticketpart); extern int shishi_aprep_get_enc_part_etype (Shishi * handle, Shishi_asn1 aprep, int32_t * etype); /* netio.c */ extern int shishi_kdc_sendrecv (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen); extern int shishi_kdc_sendrecv_hint (Shishi * handle, const char *realm, const char *indata, size_t inlen, char **outdata, size_t * outlen, Shishi_tkts_hint * hint); /* encticketpart.c */ extern Shishi_asn1 shishi_encticketpart (Shishi * handle); extern int shishi_encticketpart_key_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key * key); extern int shishi_encticketpart_get_key (Shishi * handle, Shishi_asn1 encticketpart, Shishi_key ** key); extern int shishi_encticketpart_crealm (Shishi * handle, Shishi_asn1 encticketpart, char **crealm, size_t * crealmlen); extern int shishi_encticketpart_crealm_set (Shishi * handle, Shishi_asn1 encticketpart, const char *realm); extern int shishi_encticketpart_client (Shishi * handle, Shishi_asn1 encticketpart, char **client, size_t * clientlen); extern int shishi_encticketpart_clientrealm (Shishi * handle, Shishi_asn1 encticketpart, char **client, size_t * clientlen); extern int shishi_encticketpart_cname_set (Shishi * handle, Shishi_asn1 encticketpart, Shishi_name_type name_type, const char *principal); extern int shishi_encticketpart_print (Shishi * handle, FILE * fh, Shishi_asn1 encticketpart); extern int shishi_encticketpart_flags_set (Shishi * handle, Shishi_asn1 encticketpart, int flags); extern int shishi_encticketpart_transited_set (Shishi * handle, Shishi_asn1 encticketpart, int32_t trtype, const char *trdata, size_t trdatalen); extern int shishi_encticketpart_authtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char *authtime); extern int shishi_encticketpart_endtime_set (Shishi * handle, Shishi_asn1 encticketpart, const char *endtime); extern int shishi_encticketpart_authtime (Shishi * handle, Shishi_asn1 encticketpart, char *authtime, size_t * authtimelen); extern time_t shishi_encticketpart_authctime (Shishi * handle, Shishi_asn1 encticketpart); /* safe.c */ extern int shishi_safe (Shishi * handle, Shishi_safe ** safe); extern void shishi_safe_done (Shishi_safe * safe); extern Shishi_key *shishi_safe_key (Shishi_safe * safe); extern void shishi_safe_key_set (Shishi_safe * safe, Shishi_key * key); extern Shishi_asn1 shishi_safe_safe (Shishi_safe * safe); extern void shishi_safe_safe_set (Shishi_safe * safe, Shishi_asn1 asn1safe); extern int shishi_safe_safe_der (Shishi_safe * safe, char **out, size_t * outlen); extern int shishi_safe_safe_der_set (Shishi_safe * safe, char *der, size_t derlen); extern int shishi_safe_print (Shishi * handle, FILE * fh, Shishi_asn1 safe); extern int shishi_safe_save (Shishi * handle, FILE * fh, Shishi_asn1 safe); extern int shishi_safe_to_file (Shishi * handle, Shishi_asn1 safe, int filetype, const char *filename); extern int shishi_safe_parse (Shishi * handle, FILE * fh, Shishi_asn1 * safe); extern int shishi_safe_read (Shishi * handle, FILE * fh, Shishi_asn1 * safe); extern int shishi_safe_from_file (Shishi * handle, Shishi_asn1 * safe, int filetype, const char *filename); extern int shishi_safe_cksum (Shishi * handle, Shishi_asn1 safe, int32_t * cksumtype, char **cksum, size_t * cksumlen); extern int shishi_safe_set_cksum (Shishi * handle, Shishi_asn1 safe, int32_t cksumtype, const char *cksum, size_t cksumlen); extern int shishi_safe_user_data (Shishi * handle, Shishi_asn1 safe, char **userdata, size_t * userdatalen); extern int shishi_safe_set_user_data (Shishi * handle, Shishi_asn1 safe, const char *userdata, size_t userdatalen); extern int shishi_safe_build (Shishi_safe * safe, Shishi_key * key); extern int shishi_safe_verify (Shishi_safe * safe, Shishi_key * key); /* priv.c */ extern int shishi_priv (Shishi * handle, Shishi_priv ** priv); extern void shishi_priv_done (Shishi_priv * priv); extern Shishi_key *shishi_priv_key (Shishi_priv * priv); extern void shishi_priv_key_set (Shishi_priv * priv, Shishi_key * key); extern Shishi_asn1 shishi_priv_priv (Shishi_priv * priv); extern void shishi_priv_priv_set (Shishi_priv * priv, Shishi_asn1 asn1priv); extern int shishi_priv_priv_der (Shishi_priv * priv, char **out, size_t * outlen); extern int shishi_priv_priv_der_set (Shishi_priv * priv, char *der, size_t derlen); extern Shishi_asn1 shishi_priv_encprivpart (Shishi_priv * priv); extern void shishi_priv_encprivpart_set (Shishi_priv * priv, Shishi_asn1 asn1encprivpart); extern int shishi_priv_encprivpart_der (Shishi_priv * priv, char **out, size_t * outlen); extern int shishi_priv_encprivpart_der_set (Shishi_priv * priv, char *der, size_t derlen); extern int shishi_priv_print (Shishi * handle, FILE * fh, Shishi_asn1 priv); extern int shishi_priv_save (Shishi * handle, FILE * fh, Shishi_asn1 priv); extern int shishi_priv_to_file (Shishi * handle, Shishi_asn1 priv, int filetype, const char *filename); extern int shishi_priv_parse (Shishi * handle, FILE * fh, Shishi_asn1 * priv); extern int shishi_priv_read (Shishi * handle, FILE * fh, Shishi_asn1 * priv); extern int shishi_priv_from_file (Shishi * handle, Shishi_asn1 * priv, int filetype, const char *filename); extern int shishi_priv_enc_part_etype (Shishi * handle, Shishi_asn1 priv, int32_t * etype); extern int shishi_priv_set_enc_part (Shishi * handle, Shishi_asn1 priv, int32_t etype, const char *encpart, size_t encpartlen); extern int shishi_encprivpart_user_data (Shishi * handle, Shishi_asn1 encprivpart, char **userdata, size_t * userdatalen); extern int shishi_encprivpart_set_user_data (Shishi * handle, Shishi_asn1 encprivpart, const char *userdata, size_t userdatalen); extern int shishi_priv_build (Shishi_priv * priv, Shishi_key * key); extern int shishi_priv_process (Shishi_priv * priv, Shishi_key * key); /* authorize.c */ extern int shishi_authorized_p (Shishi * handle, Shishi_tkt * tkt, const char *authzname); extern int shishi_authorization_parse (const char *authorization); extern int shishi_authorize_strcmp (Shishi * handle, const char *principal, const char *authzname); extern int shishi_authorize_k5login (Shishi * handle, const char *principal, const char *authzname); /* pki.c */ extern char *shishi_x509ca_default_file_guess (Shishi * handle); extern void shishi_x509ca_default_file_set (Shishi * handle, const char *x509cafile); extern const char *shishi_x509ca_default_file (Shishi * handle); extern char *shishi_x509cert_default_file_guess (Shishi * handle); extern void shishi_x509cert_default_file_set (Shishi * handle, const char *x509certfile); extern const char *shishi_x509cert_default_file (Shishi * handle); extern char *shishi_x509key_default_file_guess (Shishi * handle); extern void shishi_x509key_default_file_set (Shishi * handle, const char *x509keyfile); extern const char *shishi_x509key_default_file (Shishi * handle); /* utils.c */ extern time_t shishi_get_date (const char *p, const time_t * now); /* Ugly hack to avoid re-declaring shishi_xalloc_die twice. It is already declared in xalloc.h internally in Shishi.h. This is to keep being able to use -Wredundant-decls. */ #if defined SYSTEMCFGFILE && !defined XALLOC_H_ extern void shishi_xalloc_die (void) __attribute__ ((__noreturn__)); #endif /* resolv.c */ extern Shishi_dns shishi_resolv (const char *zone, uint16_t querytype); extern void shishi_resolv_free (Shishi_dns rrs); # ifdef __cplusplus } # endif #endif shishi-1.0.2/lib/diskio.h0000664000000000000000000000402612126660507012102 00000000000000/* diskio.h --- Read and write data structures from disk. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ extern int _shishi_print_armored_data (Shishi * handle, FILE * fh, Shishi_asn1 asn1, const char *asn1type, char *headers); extern int _shishi_save_data (Shishi * handle, FILE * fh, Shishi_asn1 asn1, const char *asn1type); extern int _shishi_authenticator_input (Shishi * handle, FILE * fh, Shishi_asn1 * authenticator, int type); extern int _shishi_apreq_input (Shishi * handle, FILE * fh, Shishi_asn1 * apreq, int type); extern int _shishi_aprep_input (Shishi * handle, FILE * fh, Shishi_asn1 * aprep, int type); extern int _shishi_kdcreq_input (Shishi * handle, FILE * fh, Shishi_asn1 * asreq, int type); extern int _shishi_kdcrep_input (Shishi * handle, FILE * fh, Shishi_asn1 * asrep, int type); extern int _shishi_krberror_input (Shishi * handle, FILE * fh, Shishi_asn1 * krberror, int type); extern int _shishi_encapreppart_input (Shishi * handle, FILE * fh, Shishi_asn1 * encapreppart, int type); extern int _shishi_safe_input (Shishi * handle, FILE * fh, Shishi_asn1 * safe, int type); extern int _shishi_priv_input (Shishi * handle, FILE * fh, Shishi_asn1 * priv, int type); shishi-1.0.2/lib/ticket.c0000664000000000000000000002413612126660507012102 00000000000000/* ticket.c --- Low-level ASN.1 Ticket handling. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "internal.h" #define SHISHI_TICKET_DEFAULT_TKTVNO "5" #define SHISHI_TICKET_DEFAULT_TKTVNO_LEN 0 /** * shishi_ticket: * @handle: shishi handle as allocated by shishi_init(). * * This function creates a new ASN.1 Ticket, populated with some * default values. * * Return value: Returns the ticket or NULL on failure. **/ Shishi_asn1 shishi_ticket (Shishi * handle) { Shishi_asn1 node = NULL; int rc; node = shishi_asn1_ticket (handle); if (!node) return NULL; rc = shishi_asn1_write (handle, node, "tkt-vno", SHISHI_TICKET_DEFAULT_TKTVNO, SHISHI_TICKET_DEFAULT_TKTVNO_LEN); if (rc != SHISHI_OK) goto error; return node; error: shishi_asn1_done (handle, node); return NULL; } /** * shishi_ticket_realm_get: * @handle: shishi handle as allocated by shishi_init(). * @ticket: input variable with ticket info. * @realm: output array with newly allocated name of realm in ticket. * @realmlen: size of output array. * * Extract realm from ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_realm_get (Shishi * handle, Shishi_asn1 ticket, char **realm, size_t * realmlen) { return shishi_asn1_read (handle, ticket, "realm", realm, realmlen); } /** * shishi_ticket_realm_set: * @handle: shishi handle as allocated by shishi_init(). * @ticket: input variable with ticket info. * @realm: input array with name of realm. * * Set the realm field in the Ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_realm_set (Shishi * handle, Shishi_asn1 ticket, const char *realm) { int res; res = shishi_asn1_write (handle, ticket, "realm", realm, 0); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_ticket_server: * @handle: Shishi library handle create by shishi_init(). * @ticket: ASN.1 Ticket variable to get server name from. * @server: pointer to newly allocated zero terminated string containing * principal name. May be %NULL (to only populate @serverlen). * @serverlen: pointer to length of @server on output, excluding terminating * zero. May be %NULL (to only populate @server). * * Represent server principal name in Ticket as zero-terminated * string. The string is allocate by this function, and it is the * responsibility of the caller to deallocate it. Note that the * output length @serverlen does not include the terminating zero. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_server (Shishi * handle, Shishi_asn1 ticket, char **server, size_t * serverlen) { return shishi_principal_name (handle, ticket, "sname", server, serverlen); } /** * shishi_ticket_sname_set: * @handle: shishi handle as allocated by shishi_init(). * @ticket: Ticket variable to set server name field in. * @name_type: type of principial, see Shishi_name_type, usually * SHISHI_NT_UNKNOWN. * @sname: input array with principal name. * * Set the server name field in the Ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_sname_set (Shishi * handle, Shishi_asn1 ticket, Shishi_name_type name_type, char *sname[]) { int res = SHISHI_OK; char *buf; int i; asprintf (&buf, "%d", name_type); res = shishi_asn1_write (handle, ticket, "sname.name-type", buf, 0); free (buf); if (res != SHISHI_OK) return res; res = shishi_asn1_write (handle, ticket, "sname.name-string", NULL, 0); if (res != SHISHI_OK) return res; i = 1; while (sname[i - 1]) { res = shishi_asn1_write (handle, ticket, "sname.name-string", "NEW", 1); if (res != SHISHI_OK) return res; asprintf (&buf, "sname.name-string.?%d", i); res = shishi_asn1_write (handle, ticket, buf, sname[i - 1], 0); free (buf); if (res != SHISHI_OK) return res; i++; } return SHISHI_OK; } int shishi_ticket_set_server (Shishi * handle, Shishi_asn1 ticket, const char *server) { char *tmpserver; char **serverbuf; char *tokptr = NULL; int res; int i; tmpserver = xstrdup (server); serverbuf = xmalloc (sizeof (*serverbuf)); for (i = 0; (serverbuf[i] = strtok_r (i == 0 ? tmpserver : NULL, "/", &tokptr)); i++) { serverbuf = xrealloc (serverbuf, (i + 2) * sizeof (*serverbuf)); } res = shishi_ticket_sname_set (handle, ticket, SHISHI_NT_PRINCIPAL, serverbuf); if (res != SHISHI_OK) { fprintf (stderr, _("Could not set sname: %s\n"), shishi_error (handle)); return res; } free (serverbuf); free (tmpserver); return SHISHI_OK; } int shishi_ticket_srealmserver_set (Shishi * handle, Shishi_asn1 ticket, const char *realm, const char *server) { int res; res = shishi_ticket_realm_set (handle, ticket, realm); if (res != SHISHI_OK) return res; res = shishi_ticket_set_server (handle, ticket, server); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_ticket_get_enc_part_etype: * @handle: shishi handle as allocated by shishi_init(). * @ticket: Ticket variable to get value from. * @etype: output variable that holds the value. * * Extract Ticket.enc-part.etype. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_get_enc_part_etype (Shishi * handle, Shishi_asn1 ticket, int32_t * etype) { int res; res = shishi_asn1_read_int32 (handle, ticket, "enc-part.etype", etype); return res; } int shishi_ticket_decrypt (Shishi * handle, Shishi_asn1 ticket, Shishi_key * key, Shishi_asn1 * encticketpart) { int res; int i; char *buf; size_t buflen; char *cipher; size_t cipherlen; int etype; res = shishi_ticket_get_enc_part_etype (handle, ticket, &etype); if (res != SHISHI_OK) return res; if (etype != shishi_key_type (key)) return SHISHI_TICKET_BAD_KEYTYPE; res = shishi_asn1_read (handle, ticket, "enc-part.cipher", &cipher, &cipherlen); if (res != SHISHI_OK) return res; res = shishi_decrypt (handle, key, SHISHI_KEYUSAGE_ENCTICKETPART, cipher, cipherlen, &buf, &buflen); free (cipher); if (res != SHISHI_OK) { shishi_error_printf (handle, "Ticket decrypt failed, wrong password?\n"); return SHISHI_TICKET_DECRYPT_FAILED; } /* The crypto is so 1980; no length indicator. Trim off pad bytes until we can parse it. */ for (i = 0; i < 8; i++) { if (VERBOSEASN1 (handle)) printf ("Trying with %d pad in enckdcrep...\n", i); *encticketpart = shishi_der2asn1_encticketpart (handle, &buf[0], buflen - i); if (*encticketpart != NULL) break; } if (*encticketpart == NULL) { shishi_error_printf (handle, "Could not DER decode EncTicketPart. " "Password probably correct (decrypt ok) though\n"); return SHISHI_ASN1_ERROR; } return SHISHI_OK; } /** * shishi_ticket_set_enc_part: * @handle: shishi handle as allocated by shishi_init(). * @ticket: Ticket to add enc-part field to. * @etype: encryption type used to encrypt enc-part. * @kvno: key version number. * @buf: input array with encrypted enc-part. * @buflen: size of input array with encrypted enc-part. * * Set the encrypted enc-part field in the Ticket. The encrypted data * is usually created by calling shishi_encrypt() on the DER encoded * enc-part. To save time, you may want to use * shishi_ticket_add_enc_part() instead, which calculates the * encrypted data and calls this function in one step. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_set_enc_part (Shishi * handle, Shishi_asn1 ticket, int32_t etype, uint32_t kvno, const char *buf, size_t buflen) { int res = SHISHI_OK; res = shishi_asn1_write (handle, ticket, "enc-part.cipher", buf, buflen); if (res != SHISHI_OK) return res; res = shishi_asn1_write_int32 (handle, ticket, "enc-part.etype", etype); if (res != SHISHI_OK) return res; if (kvno == UINT32_MAX) res = shishi_asn1_write (handle, ticket, "enc-part.kvno", NULL, 0); else res = shishi_asn1_write_uint32 (handle, ticket, "enc-part.kvno", kvno); if (res != SHISHI_OK) return res; return SHISHI_OK; } /** * shishi_ticket_add_enc_part: * @handle: shishi handle as allocated by shishi_init(). * @ticket: Ticket to add enc-part field to. * @key: key used to encrypt enc-part. * @encticketpart: EncTicketPart to add. * * Encrypts DER encoded EncTicketPart using key and stores it in the * Ticket. * * Return value: Returns SHISHI_OK iff successful. **/ int shishi_ticket_add_enc_part (Shishi * handle, Shishi_asn1 ticket, Shishi_key * key, Shishi_asn1 encticketpart) { int res = SHISHI_OK; char *buf; size_t buflen; char *der; size_t derlen; res = shishi_asn1_to_der (handle, encticketpart, &der, &derlen); if (res != SHISHI_OK) { shishi_error_printf (handle, "Could not DER encode encticketpart: %s\n", shishi_strerror (res)); return res; } res = shishi_encrypt (handle, key, SHISHI_KEYUSAGE_ENCTICKETPART, der, derlen, &buf, &buflen); free (der); if (res != SHISHI_OK) { shishi_error_printf (handle, "Cannot encrypt encrypted part of ticket\n"); return res; } res = shishi_ticket_set_enc_part (handle, ticket, shishi_key_type (key), shishi_key_version (key), buf, buflen); free (buf); return res; } shishi-1.0.2/config.h.in0000644000000000000000000016225312126772723011735 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to the number of bits in type 'ptrdiff_t'. */ #undef BITSIZEOF_PTRDIFF_T /* Define to the number of bits in type 'sig_atomic_t'. */ #undef BITSIZEOF_SIG_ATOMIC_T /* Define to the number of bits in type 'size_t'. */ #undef BITSIZEOF_SIZE_T /* Define to the number of bits in type 'wchar_t'. */ #undef BITSIZEOF_WCHAR_T /* Define to the number of bits in type 'wint_t'. */ #undef BITSIZEOF_WINT_T /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define as the bit index in the word where to find bit 0 of the exponent of 'double'. */ #undef DBL_EXPBIT0_BIT /* Define as the word index where to find the exponent of 'double'. */ #undef DBL_EXPBIT0_WORD /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define this to 1 if F_DUPFD behavior does not match POSIX */ #undef FCNTL_DUPFD_BUGGY /* Define to 1 if the system's ftello function has the Solaris bug. */ #undef FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Define if gettimeofday clobbers the localtime buffer. */ #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME /* Define this to 'void' or 'struct timezone' to match the system's declaration of the second argument to gettimeofday. */ #undef GETTIMEOFDAY_TIMEZONE /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module fscanf shall be considered present. */ #undef GNULIB_FSCANF /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-des shall be considered present. */ #undef GNULIB_GC_DES /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-hmac-md5 shall be considered present. */ #undef GNULIB_GC_HMAC_MD5 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-hmac-sha1 shall be considered present. */ #undef GNULIB_GC_HMAC_SHA1 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-md4 shall be considered present. */ #undef GNULIB_GC_MD4 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-md5 shall be considered present. */ #undef GNULIB_GC_MD5 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module gc-random shall be considered present. */ #undef GNULIB_GC_RANDOM /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module scanf shall be considered present. */ #undef GNULIB_SCANF /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module snprintf shall be considered present. */ #undef GNULIB_SNPRINTF /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module strerror shall be considered present. */ #undef GNULIB_STRERROR /* Define to 1 when the gnulib module bind should be tested. */ #undef GNULIB_TEST_BIND /* Define to 1 when the gnulib module close should be tested. */ #undef GNULIB_TEST_CLOSE /* Define to 1 when the gnulib module connect should be tested. */ #undef GNULIB_TEST_CONNECT /* Define to 1 when the gnulib module dup2 should be tested. */ #undef GNULIB_TEST_DUP2 /* Define to 1 when the gnulib module environ should be tested. */ #undef GNULIB_TEST_ENVIRON /* Define to 1 when the gnulib module fcntl should be tested. */ #undef GNULIB_TEST_FCNTL /* Define to 1 when the gnulib module fseek should be tested. */ #undef GNULIB_TEST_FSEEK /* Define to 1 when the gnulib module fseeko should be tested. */ #undef GNULIB_TEST_FSEEKO /* Define to 1 when the gnulib module fstat should be tested. */ #undef GNULIB_TEST_FSTAT /* Define to 1 when the gnulib module ftell should be tested. */ #undef GNULIB_TEST_FTELL /* Define to 1 when the gnulib module ftello should be tested. */ #undef GNULIB_TEST_FTELLO /* Define to 1 when the gnulib module getaddrinfo should be tested. */ #undef GNULIB_TEST_GETADDRINFO /* Define to 1 when the gnulib module getdelim should be tested. */ #undef GNULIB_TEST_GETDELIM /* Define to 1 when the gnulib module getdomainname should be tested. */ #undef GNULIB_TEST_GETDOMAINNAME /* Define to 1 when the gnulib module getdtablesize should be tested. */ #undef GNULIB_TEST_GETDTABLESIZE /* Define to 1 when the gnulib module gethostname should be tested. */ #undef GNULIB_TEST_GETHOSTNAME /* Define to 1 when the gnulib module getline should be tested. */ #undef GNULIB_TEST_GETLINE /* Define to 1 when the gnulib module getopt-gnu should be tested. */ #undef GNULIB_TEST_GETOPT_GNU /* Define to 1 when the gnulib module getpeername should be tested. */ #undef GNULIB_TEST_GETPEERNAME /* Define to 1 when the gnulib module getsubopt should be tested. */ #undef GNULIB_TEST_GETSUBOPT /* Define to 1 when the gnulib module gettimeofday should be tested. */ #undef GNULIB_TEST_GETTIMEOFDAY /* Define to 1 when the gnulib module lseek should be tested. */ #undef GNULIB_TEST_LSEEK /* Define to 1 when the gnulib module malloc-posix should be tested. */ #undef GNULIB_TEST_MALLOC_POSIX /* Define to 1 when the gnulib module memchr should be tested. */ #undef GNULIB_TEST_MEMCHR /* Define to 1 when the gnulib module mktime should be tested. */ #undef GNULIB_TEST_MKTIME /* Define to 1 when the gnulib module rawmemchr should be tested. */ #undef GNULIB_TEST_RAWMEMCHR /* Define to 1 when the gnulib module readlink should be tested. */ #undef GNULIB_TEST_READLINK /* Define to 1 when the gnulib module realloc-posix should be tested. */ #undef GNULIB_TEST_REALLOC_POSIX /* Define to 1 when the gnulib module recvfrom should be tested. */ #undef GNULIB_TEST_RECVFROM /* Define to 1 when the gnulib module select should be tested. */ #undef GNULIB_TEST_SELECT /* Define to 1 when the gnulib module sendto should be tested. */ #undef GNULIB_TEST_SENDTO /* Define to 1 when the gnulib module setenv should be tested. */ #undef GNULIB_TEST_SETENV /* Define to 1 when the gnulib module shutdown should be tested. */ #undef GNULIB_TEST_SHUTDOWN /* Define to 1 when the gnulib module snprintf should be tested. */ #undef GNULIB_TEST_SNPRINTF /* Define to 1 when the gnulib module socket should be tested. */ #undef GNULIB_TEST_SOCKET /* Define to 1 when the gnulib module stat should be tested. */ #undef GNULIB_TEST_STAT /* Define to 1 when the gnulib module strchrnul should be tested. */ #undef GNULIB_TEST_STRCHRNUL /* Define to 1 when the gnulib module strdup should be tested. */ #undef GNULIB_TEST_STRDUP /* Define to 1 when the gnulib module strerror should be tested. */ #undef GNULIB_TEST_STRERROR /* Define to 1 when the gnulib module strndup should be tested. */ #undef GNULIB_TEST_STRNDUP /* Define to 1 when the gnulib module strnlen should be tested. */ #undef GNULIB_TEST_STRNLEN /* Define to 1 when the gnulib module strtok_r should be tested. */ #undef GNULIB_TEST_STRTOK_R /* Define to 1 when the gnulib module strverscmp should be tested. */ #undef GNULIB_TEST_STRVERSCMP /* Define to 1 when the gnulib module timegm should be tested. */ #undef GNULIB_TEST_TIMEGM /* Define to 1 when the gnulib module time_r should be tested. */ #undef GNULIB_TEST_TIME_R /* Define to 1 when the gnulib module unsetenv should be tested. */ #undef GNULIB_TEST_UNSETENV /* Define to 1 when the gnulib module vasprintf should be tested. */ #undef GNULIB_TEST_VASPRINTF /* Define to 1 if you have 'alloca' after including , a header that may be supplied by this distribution. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_NAMESER_H /* Define to 1 if you have the header file. */ #undef HAVE_BP_SYM_H /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the `clock_settime' function. */ #undef HAVE_CLOCK_SETTIME /* Define if you have compound literals. */ #undef HAVE_COMPOUND_LITERALS /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `alarm', and to 0 if you don't. */ #undef HAVE_DECL_ALARM /* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FFLUSH_UNLOCKED /* Define to 1 if you have the declaration of `flockfile', and to 0 if you don't. */ #undef HAVE_DECL_FLOCKFILE /* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTS_UNLOCKED /* Define to 1 if you have the declaration of `freeaddrinfo', and to 0 if you don't. */ #undef HAVE_DECL_FREEADDRINFO /* Define to 1 if you have the declaration of `fseeko', and to 0 if you don't. */ #undef HAVE_DECL_FSEEKO /* Define to 1 if you have the declaration of `ftello', and to 0 if you don't. */ #undef HAVE_DECL_FTELLO /* Define to 1 if you have the declaration of `funlockfile', and to 0 if you don't. */ #undef HAVE_DECL_FUNLOCKFILE /* Define to 1 if you have the declaration of `gai_strerror', and to 0 if you don't. */ #undef HAVE_DECL_GAI_STRERROR /* Define to 1 if you have the declaration of `gai_strerrorA', and to 0 if you don't. */ #undef HAVE_DECL_GAI_STRERRORA /* Define to 1 if you have the declaration of `getaddrinfo', and to 0 if you don't. */ #undef HAVE_DECL_GETADDRINFO /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `getdelim', and to 0 if you don't. */ #undef HAVE_DECL_GETDELIM /* Define to 1 if you have the declaration of `getdomainname', and to 0 if you don't. */ #undef HAVE_DECL_GETDOMAINNAME /* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. */ #undef HAVE_DECL_GETENV /* Define to 1 if you have the declaration of `getline', and to 0 if you don't. */ #undef HAVE_DECL_GETLINE /* Define to 1 if you have the declaration of `getnameinfo', and to 0 if you don't. */ #undef HAVE_DECL_GETNAMEINFO /* Define to 1 if you have the declaration of `getpass', and to 0 if you don't. */ #undef HAVE_DECL_GETPASS /* Define to 1 if you have the declaration of `h_errno', and to 0 if you don't. */ #undef HAVE_DECL_H_ERRNO /* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you don't. */ #undef HAVE_DECL_INET_NTOP /* Define to 1 if you have the declaration of `localtime_r', and to 0 if you don't. */ #undef HAVE_DECL_LOCALTIME_R /* Define to 1 if you have the declaration of `program_invocation_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_NAME /* Define to 1 if you have the declaration of `program_invocation_short_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME /* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTC_UNLOCKED /* Define to 1 if you have the declaration of `setenv', and to 0 if you don't. */ #undef HAVE_DECL_SETENV /* Define to 1 if you have the declaration of `snprintf', and to 0 if you don't. */ #undef HAVE_DECL_SNPRINTF /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't. */ #undef HAVE_DECL_STRDUP /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRNCASECMP /* Define to 1 if you have the declaration of `strndup', and to 0 if you don't. */ #undef HAVE_DECL_STRNDUP /* Define to 1 if you have the declaration of `strnlen', and to 0 if you don't. */ #undef HAVE_DECL_STRNLEN /* Define to 1 if you have the declaration of `strtok_r', and to 0 if you don't. */ #undef HAVE_DECL_STRTOK_R /* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. */ #undef HAVE_DECL_TZNAME /* Define to 1 if you have the declaration of `unsetenv', and to 0 if you don't. */ #undef HAVE_DECL_UNSETENV /* Define to 1 if you have the declaration of `_snprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNPRINTF /* Define to 1 if you have the declaration of `__fsetlocking', and to 0 if you don't. */ #undef HAVE_DECL___FSETLOCKING /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the 'dup2' function. */ #undef HAVE_DUP2 /* Define if you have the declaration of environ. */ #undef HAVE_ENVIRON_DECL /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL /* Define to 1 if you have the header file. */ #undef HAVE_FEATURES_H /* Define to 1 if you have the `flockfile' function. */ #undef HAVE_FLOCKFILE /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `funlockfile' function. */ #undef HAVE_FUNLOCKFILE /* Define to 1 if you have the `getdelim' function. */ #undef HAVE_GETDELIM /* Define if the getdomainname() function is present and can be used. */ #undef HAVE_GETDOMAINNAME /* Define to 1 if you have the `getdtablesize' function. */ #undef HAVE_GETDTABLESIZE /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `getopt_long_only' function. */ #undef HAVE_GETOPT_LONG_ONLY /* Define to 1 if you have the `getpass' function. */ #undef HAVE_GETPASS /* Define to 1 if you have the `getpwnam' function. */ #undef HAVE_GETPWNAM /* Define to 1 if you have the `getservbyname' function. */ #undef HAVE_GETSERVBYNAME /* Define to 1 if you have the `getsubopt' function. */ #undef HAVE_GETSUBOPT /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the `inet_ntop' function. */ #undef HAVE_INET_NTOP /* Define if you have the 'intmax_t' type in or . */ #undef HAVE_INTMAX_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_INTTYPES_H_WITH_UINTMAX /* Define to 1 if defines AF_INET. */ #undef HAVE_IPV4 /* Define to 1 if defines AF_INET6. */ #undef HAVE_IPV6 /* Define if you have the libgcrypt library. */ #undef HAVE_LIBGCRYPT /* Define if you have the libgnutls library. */ #undef HAVE_LIBGNUTLS /* Define if you have the libidn library. */ #undef HAVE_LIBIDN /* Define if you have the libresolv library. */ #undef HAVE_LIBRESOLV /* Define if you have the libtasn1 library. */ #undef HAVE_LIBTASN1 /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if the system has the type `long long int'. */ #undef HAVE_LONG_LONG_INT /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define if the 'malloc' function is POSIX compliant. */ #undef HAVE_MALLOC_POSIX /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including config.h and . */ #undef HAVE_MAP_ANONYMOUS /* Define to 1 if you have the `mbrtowc' function. */ #undef HAVE_MBRTOWC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if defines the MIN and MAX macros. */ #undef HAVE_MINMAX_IN_LIMITS_H /* Define to 1 if defines the MIN and MAX macros. */ #undef HAVE_MINMAX_IN_SYS_PARAM_H /* Define to 1 if you have the `mprotect' function. */ #undef HAVE_MPROTECT /* Define to 1 on MSVC platforms that have the "invalid parameter handler" concept. */ #undef HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Define to 1 if you have the `nanotime' function. */ #undef HAVE_NANOTIME /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN6_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the `ngettext' function. */ #undef HAVE_NGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the `rawmemchr' function. */ #undef HAVE_RAWMEMCHR /* Define to 1 if accept is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ACCEPT /* Define to 1 if accept4 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ACCEPT4 /* Define to 1 if atoll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ATOLL /* Define to 1 if bind is declared even after undefining macros. */ #undef HAVE_RAW_DECL_BIND /* Define to 1 if btowc is declared even after undefining macros. */ #undef HAVE_RAW_DECL_BTOWC /* Define to 1 if canonicalize_file_name is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CANONICALIZE_FILE_NAME /* Define to 1 if chdir is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CHDIR /* Define to 1 if chown is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CHOWN /* Define to 1 if connect is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CONNECT /* Define to 1 if dprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DPRINTF /* Define to 1 if dup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUP /* Define to 1 if dup2 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUP2 /* Define to 1 if dup3 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUP3 /* Define to 1 if duplocale is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUPLOCALE /* Define to 1 if endusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ENDUSERSHELL /* Define to 1 if environ is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ENVIRON /* Define to 1 if euidaccess is declared even after undefining macros. */ #undef HAVE_RAW_DECL_EUIDACCESS /* Define to 1 if faccessat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FACCESSAT /* Define to 1 if fchdir is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHDIR /* Define to 1 if fchmodat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHMODAT /* Define to 1 if fchownat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHOWNAT /* Define to 1 if fcntl is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCNTL /* Define to 1 if fdatasync is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FDATASYNC /* Define to 1 if ffs is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FFS /* Define to 1 if ffsl is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FFSL /* Define to 1 if ffsll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FFSLL /* Define to 1 if fpurge is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FPURGE /* Define to 1 if freeaddrinfo is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FREEADDRINFO /* Define to 1 if fseeko is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSEEKO /* Define to 1 if fstat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSTAT /* Define to 1 if fstatat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSTATAT /* Define to 1 if fsync is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSYNC /* Define to 1 if ftello is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FTELLO /* Define to 1 if ftruncate is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FTRUNCATE /* Define to 1 if futimens is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FUTIMENS /* Define to 1 if gai_strerror is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GAI_STRERROR /* Define to 1 if getaddrinfo is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETADDRINFO /* Define to 1 if getcwd is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETCWD /* Define to 1 if getdelim is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDELIM /* Define to 1 if getdomainname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDOMAINNAME /* Define to 1 if getdtablesize is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDTABLESIZE /* Define to 1 if getgroups is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETGROUPS /* Define to 1 if gethostname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETHOSTNAME /* Define to 1 if getline is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLINE /* Define to 1 if getloadavg is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOADAVG /* Define to 1 if getlogin is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOGIN /* Define to 1 if getlogin_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOGIN_R /* Define to 1 if getnameinfo is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETNAMEINFO /* Define to 1 if getpagesize is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETPAGESIZE /* Define to 1 if getpeername is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETPEERNAME /* Define to 1 if gets is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETS /* Define to 1 if getsockname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETSOCKNAME /* Define to 1 if getsockopt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETSOCKOPT /* Define to 1 if getsubopt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETSUBOPT /* Define to 1 if gettimeofday is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETTIMEOFDAY /* Define to 1 if getusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETUSERSHELL /* Define to 1 if grantpt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GRANTPT /* Define to 1 if group_member is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GROUP_MEMBER /* Define to 1 if inet_ntop is declared even after undefining macros. */ #undef HAVE_RAW_DECL_INET_NTOP /* Define to 1 if inet_pton is declared even after undefining macros. */ #undef HAVE_RAW_DECL_INET_PTON /* Define to 1 if initstate is declared even after undefining macros. */ #undef HAVE_RAW_DECL_INITSTATE /* Define to 1 if initstate_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_INITSTATE_R /* Define to 1 if isatty is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ISATTY /* Define to 1 if lchmod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LCHMOD /* Define to 1 if lchown is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LCHOWN /* Define to 1 if link is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LINK /* Define to 1 if linkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LINKAT /* Define to 1 if listen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LISTEN /* Define to 1 if lseek is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LSEEK /* Define to 1 if lstat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LSTAT /* Define to 1 if mbrlen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MBRLEN /* Define to 1 if mbrtowc is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MBRTOWC /* Define to 1 if mbsinit is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MBSINIT /* Define to 1 if mbsnrtowcs is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MBSNRTOWCS /* Define to 1 if mbsrtowcs is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MBSRTOWCS /* Define to 1 if memmem is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMMEM /* Define to 1 if mempcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMPCPY /* Define to 1 if memrchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMRCHR /* Define to 1 if mkdirat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKDIRAT /* Define to 1 if mkdtemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKDTEMP /* Define to 1 if mkfifo is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKFIFO /* Define to 1 if mkfifoat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKFIFOAT /* Define to 1 if mknod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKNOD /* Define to 1 if mknodat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKNODAT /* Define to 1 if mkostemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKOSTEMP /* Define to 1 if mkostemps is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKOSTEMPS /* Define to 1 if mkstemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKSTEMP /* Define to 1 if mkstemps is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKSTEMPS /* Define to 1 if openat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_OPENAT /* Define to 1 if pclose is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PCLOSE /* Define to 1 if pipe is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PIPE /* Define to 1 if pipe2 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PIPE2 /* Define to 1 if popen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_POPEN /* Define to 1 if posix_openpt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_POSIX_OPENPT /* Define to 1 if pread is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PREAD /* Define to 1 if pselect is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PSELECT /* Define to 1 if pthread_sigmask is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PTHREAD_SIGMASK /* Define to 1 if ptsname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PTSNAME /* Define to 1 if ptsname_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PTSNAME_R /* Define to 1 if pwrite is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PWRITE /* Define to 1 if random is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RANDOM /* Define to 1 if random_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RANDOM_R /* Define to 1 if rawmemchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RAWMEMCHR /* Define to 1 if readlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_READLINK /* Define to 1 if readlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_READLINKAT /* Define to 1 if realpath is declared even after undefining macros. */ #undef HAVE_RAW_DECL_REALPATH /* Define to 1 if recv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RECV /* Define to 1 if recvfrom is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RECVFROM /* Define to 1 if renameat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RENAMEAT /* Define to 1 if rmdir is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RMDIR /* Define to 1 if rpmatch is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RPMATCH /* Define to 1 if secure_getenv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SECURE_GETENV /* Define to 1 if select is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SELECT /* Define to 1 if send is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SEND /* Define to 1 if sendto is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SENDTO /* Define to 1 if setenv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETENV /* Define to 1 if sethostname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETHOSTNAME /* Define to 1 if setlocale is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETLOCALE /* Define to 1 if setsockopt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETSOCKOPT /* Define to 1 if setstate is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETSTATE /* Define to 1 if setstate_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETSTATE_R /* Define to 1 if setusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETUSERSHELL /* Define to 1 if shutdown is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SHUTDOWN /* Define to 1 if sigaction is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGACTION /* Define to 1 if sigaddset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGADDSET /* Define to 1 if sigdelset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGDELSET /* Define to 1 if sigemptyset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGEMPTYSET /* Define to 1 if sigfillset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGFILLSET /* Define to 1 if sigismember is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGISMEMBER /* Define to 1 if sigpending is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGPENDING /* Define to 1 if sigprocmask is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGPROCMASK /* Define to 1 if sleep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SLEEP /* Define to 1 if snprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SNPRINTF /* Define to 1 if socket is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SOCKET /* Define to 1 if srandom is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SRANDOM /* Define to 1 if srandom_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SRANDOM_R /* Define to 1 if stat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STAT /* Define to 1 if stpcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STPCPY /* Define to 1 if stpncpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STPNCPY /* Define to 1 if strcasecmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRCASECMP /* Define to 1 if strcasestr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRCASESTR /* Define to 1 if strchrnul is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRCHRNUL /* Define to 1 if strdup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRDUP /* Define to 1 if strerror_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRERROR_R /* Define to 1 if strncasecmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNCASECMP /* Define to 1 if strncat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNCAT /* Define to 1 if strndup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNDUP /* Define to 1 if strnlen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNLEN /* Define to 1 if strpbrk is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRPBRK /* Define to 1 if strsep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRSEP /* Define to 1 if strsignal is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRSIGNAL /* Define to 1 if strtod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOD /* Define to 1 if strtok_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOK_R /* Define to 1 if strtoll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOLL /* Define to 1 if strtoull is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOULL /* Define to 1 if strverscmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRVERSCMP /* Define to 1 if symlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SYMLINK /* Define to 1 if symlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SYMLINKAT /* Define to 1 if tmpfile is declared even after undefining macros. */ #undef HAVE_RAW_DECL_TMPFILE /* Define to 1 if ttyname_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_TTYNAME_R /* Define to 1 if unlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLINK /* Define to 1 if unlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLINKAT /* Define to 1 if unlockpt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLOCKPT /* Define to 1 if unsetenv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNSETENV /* Define to 1 if usleep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_USLEEP /* Define to 1 if utimensat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UTIMENSAT /* Define to 1 if vdprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_VDPRINTF /* Define to 1 if vsnprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_VSNPRINTF /* Define to 1 if wcpcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCPCPY /* Define to 1 if wcpncpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCPNCPY /* Define to 1 if wcrtomb is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCRTOMB /* Define to 1 if wcscasecmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCASECMP /* Define to 1 if wcscat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCAT /* Define to 1 if wcschr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCHR /* Define to 1 if wcscmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCMP /* Define to 1 if wcscoll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCOLL /* Define to 1 if wcscpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCPY /* Define to 1 if wcscspn is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSCSPN /* Define to 1 if wcsdup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSDUP /* Define to 1 if wcslen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSLEN /* Define to 1 if wcsncasecmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNCASECMP /* Define to 1 if wcsncat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNCAT /* Define to 1 if wcsncmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNCMP /* Define to 1 if wcsncpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNCPY /* Define to 1 if wcsnlen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNLEN /* Define to 1 if wcsnrtombs is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSNRTOMBS /* Define to 1 if wcspbrk is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSPBRK /* Define to 1 if wcsrchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSRCHR /* Define to 1 if wcsrtombs is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSRTOMBS /* Define to 1 if wcsspn is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSSPN /* Define to 1 if wcsstr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSSTR /* Define to 1 if wcstok is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSTOK /* Define to 1 if wcswidth is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSWIDTH /* Define to 1 if wcsxfrm is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCSXFRM /* Define to 1 if wctob is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCTOB /* Define to 1 if wcwidth is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WCWIDTH /* Define to 1 if wmemchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WMEMCHR /* Define to 1 if wmemcmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WMEMCMP /* Define to 1 if wmemcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WMEMCPY /* Define to 1 if wmemmove is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WMEMMOVE /* Define to 1 if wmemset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_WMEMSET /* Define to 1 if _Exit is declared even after undefining macros. */ #undef HAVE_RAW_DECL__EXIT /* Define to 1 if you have the `readlink' function. */ #undef HAVE_READLINK /* Define to 1 if you have the `readlinkat' function. */ #undef HAVE_READLINKAT /* Define if the 'realloc' function is POSIX compliant. */ #undef HAVE_REALLOC_POSIX /* Define to 1 if you have the header file. */ #undef HAVE_RESOLV_H /* Define to 1 if you have the res_query function. */ #undef HAVE_RES_QUERY /* Define to 1 if the system has the type `sa_family_t'. */ #undef HAVE_SA_FAMILY_T /* Define to 1 if you have the header file. */ #undef HAVE_SEARCH_H /* Define to 1 if you have the header file. */ #undef HAVE_SECURITY_PAM_APPL_H /* Define to 1 if you have the header file. */ #undef HAVE_SECURITY_PAM_MODULES_H /* Define to 1 if you have the header file. */ #undef HAVE_SECURITY__PAM_MACROS_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `shutdown' function. */ #undef HAVE_SHUTDOWN /* Define to 1 if you have the `signal' function. */ #undef HAVE_SIGNAL /* Define to 1 if 'sig_atomic_t' is a signed integer type. */ #undef HAVE_SIGNED_SIG_ATOMIC_T /* Define to 1 if 'wchar_t' is a signed integer type. */ #undef HAVE_SIGNED_WCHAR_T /* Define to 1 if 'wint_t' is a signed integer type. */ #undef HAVE_SIGNED_WINT_T /* Define to 1 if the system has the type `sigset_t'. */ #undef HAVE_SIGSET_T /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define if the return value of the snprintf function is the number of of bytes (excluding the terminating NUL) that would have been produced if the buffer had been large enough. */ #undef HAVE_SNPRINTF_RETVAL_C99 /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_STDINT_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_EXT_H /* Define to 1 if you have the 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 `strchrnul' function. */ #undef HAVE_STRCHRNUL /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the 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 `strndup' function. */ #undef HAVE_STRNDUP /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the `strtok_r' function. */ #undef HAVE_STRTOK_R /* Define to 1 if the system has the type `struct addrinfo'. */ #undef HAVE_STRUCT_ADDRINFO /* Define to 1 if `sa_len' is a member of `struct sockaddr'. */ #undef HAVE_STRUCT_SOCKADDR_SA_LEN /* Define to 1 if the system has the type `struct sockaddr_storage'. */ #undef HAVE_STRUCT_SOCKADDR_STORAGE /* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ #undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY /* Define to 1 if `tm_zone' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_ZONE /* Define to 1 if you have the `strverscmp' function. */ #undef HAVE_STRVERSCMP /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BITYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define to 1 if you have the `tcgetattr' function. */ #undef HAVE_TCGETATTR /* Define to 1 if you have the `tcsetattr' function. */ #undef HAVE_TCSETATTR /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the `timegm' function. */ #undef HAVE_TIMEGM /* Define if struct tm has the tm_gmtoff member. */ #undef HAVE_TM_GMTOFF /* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use `HAVE_STRUCT_TM_TM_ZONE' instead. */ #undef HAVE_TM_ZONE /* Define to 1 if you have the `tsearch' function. */ #undef HAVE_TSEARCH /* Define to 1 if you don't have `tm_zone' but do have the external array `tzname'. */ #undef HAVE_TZNAME /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if the system has the type `unsigned long long int'. */ #undef HAVE_UNSIGNED_LONG_LONG_INT /* Define to 1 if you have the `vasnprintf' function. */ #undef HAVE_VASNPRINTF /* Define to 1 if you have the `vasprintf' function. */ #undef HAVE_VASPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcrtomb' function. */ #undef HAVE_WCRTOMB /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define to 1 if you have the `wcsnlen' function. */ #undef HAVE_WCSNLEN /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define if you have the 'wint_t' type. */ #undef HAVE_WINT_T /* Define to 1 if O_NOATIME works. */ #undef HAVE_WORKING_O_NOATIME /* Define to 1 if O_NOFOLLOW works. */ #undef HAVE_WORKING_O_NOFOLLOW /* Define to 1 if you have the header file. */ #undef HAVE_WS2TCPIP_H /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `_fseeki64' function. */ #undef HAVE__FSEEKI64 /* Define to 1 if you have the `_ftelli64' function. */ #undef HAVE__FTELLI64 /* Define to 1 if you have the `_ftime' function. */ #undef HAVE__FTIME /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */ #undef HAVE__SET_INVALID_PARAMETER_HANDLER /* Define to 1 if you have the `__fsetlocking' function. */ #undef HAVE___FSETLOCKING /* Define HOST_NAME_MAX when does not define it. */ #undef HOST_NAME_MAX /* Define to 1 if lseek does not detect pipes. */ #undef LSEEK_PIPE_BROKEN /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */ #undef MALLOC_0_IS_NONNULL /* Define to a substitute value for mmap()'s MAP_ANONYMOUS flag. */ #undef MAP_ANONYMOUS /* defined to the name of the unpredictable nonce device */ #undef NAME_OF_NONCE_DEVICE /* defined to the name of the pseudo random device */ #undef NAME_OF_PSEUDO_RANDOM_DEVICE /* defined to the name of the (strong) random device */ #undef NAME_OF_RANDOM_DEVICE /* Define to 1 to make gettime work. */ #undef OK_TO_USE_1S_CLOCK /* 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 /* String identifying the packager of this software */ #undef PACKAGE_PACKAGER /* Packager info for bug reports (URL/e-mail/...) */ #undef PACKAGE_PACKAGER_BUG_REPORTS /* Packager-specific version information */ #undef PACKAGE_PACKAGER_VERSION /* 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 to l, ll, u, ul, ull, etc., as suitable for constants of type 'ptrdiff_t'. */ #undef PTRDIFF_T_SUFFIX /* Define to 1 if readlink fails to recognize a trailing slash. */ #undef READLINK_TRAILING_SLASH_BUG /* Define to 1 if stat needs help when passed a directory name with a trailing slash */ #undef REPLACE_FUNC_STAT_DIR /* Define to 1 if stat needs help when passed a file name with a trailing slash */ #undef REPLACE_FUNC_STAT_FILE /* Define to 1 if strerror(0) does not return a message implying success. */ #undef REPLACE_STRERROR_0 /* Define if vasnprintf exists but is overridden by gnulib. */ #undef REPLACE_VASNPRINTF /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'sig_atomic_t'. */ #undef SIG_ATOMIC_T_SUFFIX /* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'size_t'. */ #undef SIZE_T_SUFFIX /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define to 1 if all 'time_t' values fit in a 'long int'. */ #undef TIME_T_FITS_IN_LONG_INT /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Define to 1 if you want STARTTLS. */ #undef USE_STARTTLS /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on OS X. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions if necessary. HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Define to 1 if unsetenv returns void instead of int. */ #undef VOID_UNSETENV /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wchar_t'. */ #undef WCHAR_T_SUFFIX /* Define if WSAStartup is needed. */ #undef WINDOWS_SOCKETS /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wint_t'. */ #undef WINT_T_SUFFIX /* Define to 1 if you want 3DES {e,cksum}type. */ #undef WITH_3DES /* Define to 1 if you want AES {e,cksum}types. */ #undef WITH_AES /* Define to 1 if you want ARCFOUR {e,cksum}type. */ #undef WITH_ARCFOUR /* Define to 1 if you want DES {e,cksum}types. */ #undef WITH_DES /* Define to 1 if you want IPv6. */ #undef WITH_IPV6 /* Define to 1 if you want MD cksumtypes. */ #undef WITH_MD /* Define to 1 if you want NULL {e,cksum}type. */ #undef WITH_NULL /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Enable large inode numbers on Mac OS X 10.5. */ #undef _DARWIN_USE_64_BIT_INODE /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 if Gnulib overrides 'struct stat' on Windows so that struct stat.st_size becomes 64-bit. */ #undef _GL_WINDOWS_64_BIT_ST_SIZE /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 on Solaris. */ #undef _LCONV_C99 /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 1 to make NetBSD features available. MINIX 3 needs this. */ #undef _NETBSD_SOURCE /* The _Noreturn keyword of C11. */ #if ! (defined _Noreturn \ || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) # if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ || 0x5110 <= __SUNPRO_C) # define _Noreturn __attribute__ ((__noreturn__)) # elif defined _MSC_VER && 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 in order to get the POSIX compatible declarations of socket functions. */ #undef _POSIX_PII_SOCKET /* Define to 1 if you need to in order for 'stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to rpl_ if the getopt replacement functions and variables should be used. */ #undef __GETOPT_PREFIX /* _GL_INLINE is a portable alternative to ISO C99 plain 'inline'. _GL_EXTERN_INLINE is a portable alternative to 'extern inline'. _GL_INLINE_HEADER_BEGIN contains useful stuff to put in an include file, before uses of _GL_INLINE. It suppresses GCC's bogus "no previous prototype for 'FOO'" diagnostic, when FOO is an inline function in the header; see . _GL_INLINE_HEADER_END contains useful stuff to put in the same include file, after uses of _GL_INLINE. Suppress extern inline with HP-UX cc, as it appears to be broken; see . Suppress the use of extern inline on Apple's platforms, as Libc-825.25 (2012-09-19) is incompatible with it; see . Perhaps Apple will fix this some day. */ #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : 199901L <= __STDC_VERSION__ && !defined __HP_cc) \ && !defined __APPLE__) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline #elif 2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __APPLE__ # if __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) # else # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern #else # define _GL_INLINE static _GL_UNUSED # define _GL_EXTERN_INLINE static _GL_UNUSED #endif #if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) # if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ # define _GL_INLINE_HEADER_CONST_PRAGMA # else # define _GL_INLINE_HEADER_CONST_PRAGMA \ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") # endif # define _GL_INLINE_HEADER_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ _GL_INLINE_HEADER_CONST_PRAGMA # define _GL_INLINE_HEADER_END \ _Pragma ("GCC diagnostic pop") #else # define _GL_INLINE_HEADER_BEGIN # define _GL_INLINE_HEADER_END #endif /* Define to `int' if doesn't define. */ #undef gid_t /* A replacement for va_copy, if needed. */ #define gl_va_copy(a,b) ((a) = (b)) /* Define to rpl_gmtime if the replacement function should be used. */ #undef gmtime /* 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 long or long long if and don't define. */ #undef intmax_t /* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for Mac OS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif /* Define to rpl_localtime if the replacement function should be used. */ #undef localtime /* Define to the real name of the mktime_internal function. */ #undef mktime_internal /* Define to `int' if does not define. */ #undef mode_t /* Define to the type of st_nlink in struct stat, or a supertype. */ #undef nlink_t /* Define to `int' if does not define. */ #undef pid_t /* Define as the type of the result of subtracting two pointers, if the system doesn't define it. */ #undef ptrdiff_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* type to use in place of socklen_t if not defined */ #undef socklen_t /* Define as a signed type of the same size as size_t. */ #undef ssize_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define as a marker that can be attached to declarations that might not be used. This helps to reduce warnings, such as from GCC -Wunused-parameter. */ #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_UNUSED __attribute__ ((__unused__)) #else # define _GL_UNUSED #endif /* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name is a misnomer outside of parameter lists. */ #define _UNUSED_PARAMETER_ _GL_UNUSED /* The __pure__ attribute was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* The __const__ attribute was added in gcc 2.95. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST /* empty */ #endif /* Define as a macro for copying va_list variables. */ #undef va_copy /* Fix namespace of xalloc_die. */ #undef xalloc_die shishi-1.0.2/COPYING0000664000000000000000000010451312015626624010735 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . shishi-1.0.2/Makefile.am0000664000000000000000000000400612126765546011744 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --without-libgcrypt EXTRA_DIST = cfg.mk maint.mk .clcopying SUBDIRS = po gl lib db src tests doc extra examples ACLOCAL_AMFLAGS = -I m4 -I gl/m4 -I src/gl/m4 -I db/gl/m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = shishi.pc confdir = $(CONFDIR) conf_DATA = shishi.conf shisa.conf skeldir = $(SKELDIR) skel_DATA = shishi.skel distuninstallcheck_listfiles = find . -type f -print | grep -v -e shishi.keys -e 0.key install-data-hook: @echo Initializing database and creating host key... if test ! -d $(DESTDIR)$(DBDIR); then \ if mkdir -m 0700 -p $(DESTDIR)$(DBDIR); then \ if test ! -f $(DESTDIR)$(KEYDIR)/shishi.keys; then \ if $(DESTDIR)$(bindir)/shisa$(EXEEXT) -a > \ $(DESTDIR)$(KEYDIR)/shishi.keys; then \ echo Successfully created database and host key.; \ else \ echo Unable to create database, see $(DESTDIR)$(KEYDIR)/shishi.keys.; \ fi; \ else \ echo Key file $(DESTDIR)$(KEYDIR)/shishi.keys already exist.; \ fi; \ else \ echo Could not create directory root$(DESTDIR)$(DBDIR).; \ fi; \ else \ echo Database root $(DESTDIR)$(DBDIR) already exist.; \ fi shishi-1.0.2/shishi.conf.in0000664000000000000000000001257412126660507012453 00000000000000# System configuration file for Shishi @VERSION@ # Copyright 2002-2013 Simon Josefsson # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This file is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Unless you you specify which system configuration file to use (with the # commandline option "--system-configuration-file filename"), Shishi uses the # file @sysconfdir@/shishi.conf by default. # # An option file can contain all long options which are # available in Shishi. If the first non white space character of # a line is a '#', this line is ignored. Empty lines are also # ignored. # # See the manual for a list of options. # Read MIT or Heimdal configuration file for the following parameters: # default-realm # realm-kdc # server-realm # kdc-timeout # kdc-retries # You can override these values by specifying alternate values below. # Not implemented yet. #read-krb5conf=/etc/krb5.conf # Specify the default realm, by default the hostname of the host is used. #default-realm JOSEFSSON.ORG # Specify the default principal, by default the login username is used. #default-principal jas # Specify which encryption types client asks server to respond in # during AS/TGS exchanges. List valid encryption types, in preference # order. Supported algorithms include aes256-cts-hmac-sha1-96, # aes128-cts-hmac-sha1-96, des3-cbc-sha1-kd, des-cbc-md5, des-cbc-md4, # des-cbc-crc and null. This option also indicates which encryption # types are accepted by the client when receiving the response. Note # that the preference order is not cryptographically protected, so a # man in the middle can modify the order without being detected. # Thus, only specify encryption types you trust completely here. The # default only includes aes256-cts-hmac-sha1-96, as suggested by # RFC1510bis. #client-kdc-etypes=aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5 # Enable verbose library messages. #verbose #verbose-asn1 #verbose-noise #verbose-crypto #verbose-crypto-noise # Specify KDC addresses for realms. # Value is REALM,KDCADDRESS[/TRANSPORT][,KDCADDRESS[/TRANSPORT]...] # KDCADDRESS is the hostname or IP address of KDC. # Optional TRANSPORT is "udp" for UDP, "tcp" for TCP, and "tls" for TLS # connections. By default UDP is tried first, and TCP used as a # fallback if the KRB_ERR_RESPONSE_TOO_BIG error is received. If not # specified, Shishi tries to locate the KDC using SRV RRs, which is # recommended. This option should normally only be used during # experiments, to access badly maintained realms, or to make sure # you are not vulnerable to DNS redirection attacks. #realm-kdc=JOSEFSSON.ORG,ristretto.josefsson.org # Specify realm for servers. # Value is REALM,SERVERREGEXP[,SERVERREGEXP...] # SERVERREGEXP is a pattern used to establish membership in the # given realm. The pattern is either the exact name of a server, # or a trailing domain part expected in a qualified server name, # whenever the pattern commences with a period. The first match # found will be used in library calls. #server-realm=JOSEFSSON.ORG,.josefsson.org # How long shishi waits for a response from a KDC before continuing # to next KDC for realm. The default is 5 seconds. #kdc-timeout=5 # How many times shishi sends a request to a KDC before giving up. # The default is 3 times. #kdc-retries=3 # How username and passwords entered from the terminal, or taken # from the command line, are processed. # "none": no processing is used. # "stringprep": convert from locale charset to UTF-8 and process using # experimental RFC 1510 stringprep profile. # It can also be a string indicating a character set supported by # iconv() via libstringprep, in which case data is converted from # locale charset into the indicated character set. E.g., UTF-8, # ISO-8859-1, KOI-8, EBCDIC-IS-FRISS are supported on GNU systems. # On some systems you can use "locale -m" to list available character # sets. By default, the "none" setting is used which is consistent # with RFC 1510 that is silent on the issue. In practice, however, # converting to UTF-8 improves interoperability. stringprocess=UTF-8 # Specify default ticket life time. # The string can be in almost any common format. It can contain month # names, time zones, `am' and `pm', `yesterday', `ago', `next', etc. # Refer to the "Date input formats" in the GNU CoreUtils package for # entire story. As an extra feature, if the resulting string you # specify has expired within the last 24 hours, an extra day is added # to it. This allows you to specify "17:00" to always mean the next # 17:00, even if your system clock happens to be 17:30. # The default is 8 hours. # Examples: #ticket-life=8 hours #ticket-life=1 day #ticket-life=17:00 # Specify how long a renewable ticket should remain renewable. # See ticket-life for the syntax. The extra feature that handles # negative values within the last 2 hours is not active here. # The default is 7 days. # Examples: #renew-life=1 week #renew-life=friday 17:00 #renew-life=sunday # Setup libgcrypt to use quicker entropy generation. If you want to # use /dev/random instead of /dev/urandom, uncomment this. quick-random # System configuration file ends here shishi-1.0.2/INSTALL0000644000000000000000000003660012126772725010741 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. shishi-1.0.2/m4/0000755000000000000000000000000012126773311010273 500000000000000shishi-1.0.2/m4/size_max.m40000644000000000000000000000563012126772677012316 00000000000000# size_max.m4 serial 9 dnl Copyright (C) 2003, 2005-2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS([stdint.h]) dnl First test whether the system already has SIZE_MAX. AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [ gl_cv_size_max= AC_EGREP_CPP([Found it], [ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif ], [gl_cv_size_max=yes]) if test -z "$gl_cv_size_max"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. Try hard to find a definition that can dnl be used in a preprocessor #if, i.e. doesn't contain a cast. AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1], [#include #include ], [size_t_bits_minus_1=]) AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)], [#include ], [fits_in_uint=]) if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_TRY_COMPILE([#include extern size_t foo; extern unsigned long foo; ], [], [fits_in_uint=0]) fi dnl We cannot use 'expr' to simplify this expression, because 'expr' dnl works only with 'long' integers in the host environment, while we dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows... gl_cv_size_max='((size_t)~(size_t)0)' fi fi ]) if test "$gl_cv_size_max" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after dnl . Remember that the #undef in AH_VERBATIM gets replaced with dnl #define by AC_DEFINE_UNQUOTED. AH_VERBATIM([SIZE_MAX], [/* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif]) ]) dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. dnl Remove this when we can assume autoconf >= 2.61. m4_ifdef([AC_COMPUTE_INT], [], [ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])]) ]) shishi-1.0.2/m4/xsize.m40000644000000000000000000000066212126772677011641 00000000000000# xsize.m4 serial 4 dnl Copyright (C) 2003-2004, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_REQUIRE([AC_C_INLINE]) AC_CHECK_HEADERS([stdint.h]) ]) shishi-1.0.2/m4/ltversion.m40000644000000000000000000000126212126772711012506 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) shishi-1.0.2/m4/update-header-version.m40000664000000000000000000000160212126660507014653 00000000000000# update-header-version.m4 serial 1 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # sj_UPDATE_HEADER_VERSION(HEADER-FILE) # ------------- # Update version number in HEADER-FILE. It searches for '_VERSION ".*"' # and replaces the .* part with the $PACKAGE_VERSION. AC_DEFUN([sj_UPDATE_HEADER_VERSION], [ # Update version number in lib/libtasn1.h. if ! sed 's/_VERSION ".*"/_VERSION "'$PACKAGE_VERSION'"/' $1 > fixhdr.tmp; then AC_MSG_ERROR([[*** Failed to update version number in $1...]]) fi if cmp -s $1 fixhdr.tmp 2>/dev/null; then rm -f fixhdr.tmp elif ! mv fixhdr.tmp $1; then AC_MSG_ERROR([[*** Failed to move fixhdr.tmp to $1...]]) fi ]) shishi-1.0.2/m4/lib-prefix.m40000644000000000000000000002042212126772676012533 00000000000000# lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) shishi-1.0.2/m4/lib-ld.m40000644000000000000000000000660312126772676011642 00000000000000# lib-ld.m4 serial 4 (gettext-0.18) dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT([$LD]) else AC_MSG_RESULT([no]) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) shishi-1.0.2/m4/nls.m40000644000000000000000000000231512126772676011267 00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) shishi-1.0.2/m4/fcntl-o.m40000644000000000000000000000563412126772676012044 00000000000000# fcntl-o.m4 serial 1 dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. # Test whether the flags O_NOATIME and O_NOFOLLOW actually work. # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. AC_DEFUN([gl_FCNTL_O_FLAGS], [ dnl Persuade glibc to define O_NOATIME and O_NOFOLLOW. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; ]], [[ int status = !constants; { static char const sym[] = "conftest.sym"; if (symlink (".", sym) != 0 || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0) status |= 32; unlink (sym); } { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); char c; struct stat st0, st1; if (fd < 0 || fstat (fd, &st0) != 0 || sleep (1) != 0 || read (fd, &c, 1) != 1 || close (fd) != 0 || stat (file, &st1) != 0 || st0.st_atime != st1.st_atime) status |= 64; } return status;]])], [gl_cv_header_working_fcntl_h=yes], [case $? in #( 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac], [gl_cv_header_working_fcntl_h=cross-compiling])]) case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], [Define to 1 if O_NOATIME works.]) case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], [Define to 1 if O_NOFOLLOW works.]) ]) shishi-1.0.2/m4/gtk-doc.m40000664000000000000000000000424112015626624012011 00000000000000dnl -*- mode: autoconf -*- # serial 1 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) AC_DEFUN([GTK_DOC_CHECK], [ AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first dnl check for tools we added during development AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) dnl for overriding the documentation installation directory AC_ARG_WITH([html-dir], AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, [with_html_dir='${datadir}/gtk-doc/html']) HTML_DIR="$with_html_dir" AC_SUBST([HTML_DIR]) dnl enable/disable documentation building AC_ARG_ENABLE([gtk-doc], AS_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [[default=no]]]),, [enable_gtk_doc=no]) if test x$enable_gtk_doc = xyes; then ifelse([$1],[], [PKG_CHECK_EXISTS([gtk-doc],, AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], [PKG_CHECK_EXISTS([gtk-doc >= $1],, AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) fi AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) dnl enable/disable output formats AC_ARG_ENABLE([gtk-doc-html], AS_HELP_STRING([--enable-gtk-doc-html], [build documentation in html format [[default=yes]]]),, [enable_gtk_doc_html=yes]) AC_ARG_ENABLE([gtk-doc-pdf], AS_HELP_STRING([--enable-gtk-doc-pdf], [build documentation in pdf format [[default=no]]]),, [enable_gtk_doc_pdf=no]) if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) ]) shishi-1.0.2/m4/pkg.m40000664000000000000000000001214512015626624011244 00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES shishi-1.0.2/m4/intlmacosx.m40000644000000000000000000000457512126772676012666 00000000000000# intlmacosx.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) shishi-1.0.2/m4/wint_t.m40000644000000000000000000000172612126772677012005 00000000000000# wint_t.m4 serial 4 (gettext-0.18) dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], [AC_TRY_COMPILE([ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include wint_t foo = (wchar_t)'\0';], , [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.]) fi ]) shishi-1.0.2/m4/inttypes_h.m40000644000000000000000000000167112126772676012665 00000000000000# inttypes_h.m4 serial 9 dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h], [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1; return !i;], [gl_cv_header_inttypes_h=yes], [gl_cv_header_inttypes_h=no])]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) shishi-1.0.2/m4/libtool.m40000644000000000000000000105754212126772707012147 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS shishi-1.0.2/m4/iconv.m40000644000000000000000000001653712126772676011624 00000000000000# iconv.m4 serial 11 (gettext-0.18.1) dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) fi ]) shishi-1.0.2/m4/lt~obsolete.m40000644000000000000000000001375612126772712013047 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) shishi-1.0.2/m4/wchar_t.m40000644000000000000000000000135312126772677012124 00000000000000# wchar_t.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], [AC_TRY_COMPILE([#include wchar_t foo = (wchar_t)'\0';], , [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) fi ]) shishi-1.0.2/m4/stdint_h.m40000644000000000000000000000164112126772677012311 00000000000000# stdint_h.m4 serial 8 dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h], [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1; return !i;], [gl_cv_header_stdint_h=yes], [gl_cv_header_stdint_h=no])]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) shishi-1.0.2/m4/lib-link.m40000644000000000000000000010020212126772676012166 00000000000000# lib-link.m4 serial 21 (gettext-0.18) dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) shishi-1.0.2/m4/po.m40000644000000000000000000004461612126772676011123 00000000000000# po.m4 serial 17 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) shishi-1.0.2/m4/ltoptions.m40000644000000000000000000003007312126772710012515 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) shishi-1.0.2/m4/ltsugar.m40000644000000000000000000001042412126772710012141 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) shishi-1.0.2/m4/gettext.m40000644000000000000000000003513212126772676012162 00000000000000# gettext.m4 serial 63 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) shishi-1.0.2/m4/longlong.m40000644000000000000000000001057512126772676012321 00000000000000# longlong.m4 serial 14 dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_LONG_LONG_INT if 'long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'long long int' exists but is only 32 bits large # (as on some very old compilers), HAVE_LONG_LONG_INT will not be # defined. In this case you can treat 'long long int' like 'long int'. AC_DEFUN([AC_TYPE_LONG_LONG_INT], [ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. dnl If cross compiling, assume the bug isn't important, since dnl nobody cross compiles for this platform as far as we know. AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[@%:@include @%:@ifndef LLONG_MAX @%:@ define HALF \ (1LL << (sizeof (long long int) * CHAR_BIT - 2)) @%:@ define LLONG_MAX (HALF - 1 + HALF) @%:@endif]], [[long long int n = 1; int i; for (i = 0; ; i++) { long long int m = n << i; if (m >> i != n) return 1; if (LLONG_MAX / 2 < m) break; } return 0;]])], [ac_cv_type_long_long_int=yes], [ac_cv_type_long_long_int=no], [ac_cv_type_long_long_int=yes])], [ac_cv_type_long_long_int=no])]) if test $ac_cv_type_long_long_int = yes; then AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type `long long int'.]) fi ]) # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'unsigned long long int' exists but is only 32 bits # large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT # will not be defined. In this case you can treat 'unsigned long long int' # like 'unsigned long int'. AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], [ AC_CACHE_CHECK([for unsigned long long int], [ac_cv_type_unsigned_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [ac_cv_type_unsigned_long_long_int=yes], [ac_cv_type_unsigned_long_long_int=no])]) if test $ac_cv_type_unsigned_long_long_int = yes; then AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type `unsigned long long int'.]) fi ]) # Expands to a C program that can be used to test for simultaneous support # of 'long long' and 'unsigned long long'. We don't want to say that # 'long long' is available if 'unsigned long long' is not, or vice versa, # because too many programs rely on the symmetry between signed and unsigned # integer types (excluding 'bool'). AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], [ AC_LANG_PROGRAM( [[/* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63;]], [[/* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull));]]) ]) shishi-1.0.2/AUTHORS0000664000000000000000000007435312126660507010763 00000000000000Shishi AUTHORS -- Information about the authors. Copyright (C) 2002-2013 Simon Josefsson See the end for copying conditions. Simon Josefsson Designed and implemented Shishi. Nicolas Pouvesle Authorization system, crypto bugfixes, error handling, and more. -----BEGIN PGP PUBLIC KEY BLOCK----- URL: http://josefsson.org/key.txt Comment: This 0xB565716F key is used to sign releases of Shishi. mKsEPNUHKwEFALqJSBHn6Qk5ex138kwymxA3idCFoTi5Q6mVooEVVaYVfeDG+5uV T5rhTFDfDcT9SO0eIlfKOraSRnVEHyDDH2PAgJFxyneFELcmLUQ66D+m8z+ziGro 6bcDSBBDMRkHIX6/kH/vnevjqivIld+j8WTcVX+SArcKyzgQ58uMTrfQdLqzh6D9 sE/838+ZPZkabmKKWMVWccoaUbWGYOcNwO0ABim0JVNpbW9uIEpvc2Vmc3NvbiA8 c2ltb25Aam9zZWZzc29uLm9yZz6I+wQTAQIARQIbAwQLBwMCAxUCAwMWAgECHgEC F4AiGGRuczpzaW1vbi5qb3NlZnNzb24ub3JnP3R5cGU9Q0VSVAUCSaEuAAUJDq1a TgAKCRDtoh6UtWVxb4pUBP9f7+9yeYZCJTvILOWlsYIvl7J2P0em2qYn3NbDUS1y q+BUO8udTYNWwyxX9zGT5obhX9bhcWgms/UbGMsvlZcOT+e438P0t1q5q8u+FOgZ tfkgZvyacCFvT4Fnd00B+RaaGZ2atnodvhN8qpzHIf8GVrhzULEtdA55BRw+x5f6 ORdSD14IFWirQ4WWKaXTURx5LIRxs6twYJawkumU6m4KiEYEExECAAYFAj1Y8sIA CgkQV5Mp08AbKiJmNwCgkgjjuS5TcZq4rVBWNYu1VwQlJWYAoJZf+pBNBvzT9xOg Hcs1cAMwT4FHiEwEExECAAwFAj1esHUFgwFXijYACgkQvLvElXGKklZXlwCfTWSl L2/3q5Od3zBVMKVHgpTo4asAnAtw7vVEIwp9pPuy1oKjTB/obqltiEYEExECAAYF AkEAyoIACgkQntdYP8FOsoK0XQCfRN1QBVk7/eu4YbFQBqH463dcHx4AoMp2QurM RXFDImswJ1Wi9K65dq66iEYEExECAAYFAkD/P4YACgkQlv+ZxCXA7Au9KACfYKMn MPmlbZDi5/Le4mcLCUlQ+SsAn2qOQ14l/ellraqWXbvacCJkOyNpiEwEEhECAAwF AkDgVz0FgwCTtOwACgkQyIHdR0rnq0csrwCgtL27/ndpjew28bGVYU9tBmIg2GUA oKFFKKHvJB2pVjRkRL4DjohSdIrkiEYEExECAAYFAkJJAYsACgkQj8NyXz1o1joW fwCgtb8mtlI8rg52vT5DRU+Ct3NuDfEAoL7IX823ezbe7HVegheirf3q7zmKiKIE EAECAAwFAkJG+cEFgwDmsQ4ACgkQv9buWFf3fwmuCwQAtAopBWKTnll1t4lFnR+C mvXdqui6g/MhMVjGlnGaxzKfdlXIDT3i6VEMQk639rCLUxNB5YiQZZm7aABg1dwt f10mFQUkm9dt4d852cu6ytmljXLJ4NIQFrhZQUrxvh8s8j41oN/hcwyLaX+FLI0G 6Jehz0m0nPlEQf0sJ/4oCuqITAQTEQIADAUCQklECgWDABPOSgAKCRBmvnH/Z0ho g9kYAJ0QKz8Gt/kc7Q9Y/Ahh/wZO6vaQ9QCggcgpRYoJ6g1QXYWdTO/Hxve4Lu+I TAQQEQIADAUCQk2CtQWDAOAoGgAKCRA7jqQfgvYSQDh8AJ43bDTlK1p/aLXxJ2/1 pFrHWFvncACgvVli4V9P6pVhP9p+H3APtQ+URVSJASIEEwECAAwFAkJhOZ0FgwDM cTIACgkQC3gy83PWLUFxowf/YLAopAmpU94kKSC4ECFsLXDivJ4LCOxgqZ0u7Fgi QgwWK1miJJnW9gME5vE/jMHlsjGwUKJDC3SfbgjOJj31ivrGIh4od8+zU0bwlwoJ ppDF/5cbzBheUiCsz+BVBZs8ii4OahnoELUzXbyVZITkMztmn/2+7DYXqqf1tCTy wIR/hQzFp6W7GNT/I73Ksz/cKop4jzxE5whkl+5NMBk9VYhfa2X49/S65nwXg4ii BPQN0UrhN0ZvrF+uKX6oVlOX+30CrPyT8FkcRk1AOhUpqblk2M2DblOebgxfF1ZV jXNNN/0fZhy4iTbYSggndO5PIybKMkMogVtO07F/8lvtC4hMBBMRAgAMBQJC2LCN BYMAVPpCAAoJEBhZ0B9ne6Hs7fEAn145gLDePrbxrfwN2dG5+IuvpvtYAJ4oRmRy hxwpwahGE+5281z2VTrQ9YhMBBMRAgAMBQJC2LCxBYMAVPoeAAoJEIHC9+viE7aS 7sAAnRYuXokAy66xi04YD1ODtssYFw7nAJ4lqshFVn7NR5yznu0tioYLFwyc54hM BBMRAgAMBQJC2LDRBYMAVPn+AAoJEGtw7Nldw/Rz2iEAoJFrzoYjkR5ANZYbeX/o zQecQCmAAJwNCoPySmaxrwO6BiUd11bO80bPxYkCIgQTAQIADAUCQtiw8QWDAFT5 3gAKCRCq4+bOZqFEaF90D/9xV8ua/ezhWOu5ADgHE1yeWMWQsecIx9TA5QVQg8pp jA3E2REe/lJbCweVhwfvSmuvuymRQw71cIdmqF1dz9R8mb62N1r07DcPxibhtHi4 poENxIHqvEbtOR17Y6Ql4DW4PjK1ut9y2y58HK6XTiqCtbg43jEcbXk1r9qLJl2L gopYJQ1KJCwfn+DCVadRA2FgVclMGUGIdiiTwp12+E/70oYoMzLwm+7MUgbJUpRL ytsc5frhT91iX2lPoeylAHAQ0681WiawvexlqtAPto9Gjbtnw32oSOqIJcbbMhN8 G87pkvBhk5wXfVM7kyutBFhIHcQFGeuGkZpgeXt40NcUJffn+KOfeXzgdQwmwNlo 9K0arxNpIukgugvVeNtsKj1gtW7IkYcLmvlDyShz/cytguNEU+1W0ZeG73Tjphs8 mCSlCKVcNWcy2l7z/DvB3VPibac525/Sw1ZIq7DShRHHv8x02/658LEW7gSvvZ4j 3yuZSNgL2lgPzaYoQo+8ysHK9dqViVBXAHIwVZTmXptb5zxQcHtFUnR51IDSAfBG d7gjU5NJNfKKngLjDJy56nmJGMw/+13F5XFcjGPC9t6ZKoQud712K8TRIczWgGMn gkahyTl4KIwPxVzWnUN0IkcsO/5yO3JudWzzYB6r1QomCSAAA+uirstJwVtBWsCA 54hGBBARAgAGBQJC8krrAAoJEG74r8KGV0rKoI4An0CQA/3wPCxskfqLhvN69ViN c9GhAJwMR5Nl4q7Y4c5j9BOG+9Yxaom2OYhMBBMRAgAMBQJC8cBwBYMAO+pfAAoJ ECmqKFIzPnwjCzsAmgIwd1uJC2Ka3bIgTCJukFjCcdWRAJ47P2tLKEcvatuPnnPT yWYuXGTBqIhGBBARAgAGBQJD+NOYAAoJEOFd2FexXDfRRVoAnj+kNh2yJiIAI9JE Vccgdv8cdElgAJ9jZHFa4KIdIsdGQZ5G4qS0YkHwKojYBBMBAgAiAhsDBAsHAwID FQIDAxYCAQIeAQIXgAUCPr1HRAUJAtWOGQAKCRDtoh6UtWVxb3F2BP9Whe+ArZn6 WlbpHF+37Rqr+KmXL2fLI0b+phneaieRvACsOmPD3jDpvxz/xVf8s49SJ2+a23Ia iCA8Boyws9sBxn5N+yWhdYYjfDbH3JUOQz7BKN/9o8EAYuU8pmQtEN0q4+QiNsU0 a8qLAV3qmEOwLfkB4z4H+aDZxe/p7vIYP4QmzTn3ZQ0mYR5mxpc52pF82KVyNWWJ vmcirPwKSckEiNgEEwECACICGwMECwcDAgMVAgMDFgIBAh4BAheABQI/pCtUBQkD vHImAAoJEO2iHpS1ZXFvPREE/j3fX+cLxCCZNTjMhThGFujiT7ty4x1jVc91J6QO A+Jp+78NIIeyg3JTeR3WIv7/WFNzLKJXJEEcga+0ViPjoLfvGsHMAnwXqPYAxu1c DY4jId0bCYgoVlnfF9gwOWxebtotLpCiuXGL/168zEAXWJpPg6r2MfPhAKUJ9G8q 52OOWJW3cObxoZ2gyXjuWOFtygZ1vUAqP/8UGeZNdajHD5uI2AQTAQIAIgIbAwQL BwMCAxUCAwMWAgECHgECF4AFAkCGvikFCQSfBP4ACgkQ7aIelLVlcW9oqwT/a2nW kFFy1q16WURE8vp+Tqu6i4r5mTdyHjbhQeZh5Pub5DEJiFuWXxE73JVrnNozacQb Vbsnn54B4Xv6tuEDMxaTXSjreDY6D08urM8A0gnUHCAOwxtmepm9wxk/l3WAXWwz QoQaqZ2PSPFGW4Epk8+JwWKoLv1O2i9NbycGEccF9rr6I12319Vzk+P4P3FOgCwa dAQHSGS3Y6hlLm/RGIjYBBMBAgAiAhsDBAsHAwIDFQIDAxYCAQIeAQIXgAUCQW/E VgUJBYgLKQAKCRDtoh6UtWVxb8gUBP9Oiapzi+7qCcpj8Yy55jQvgpXkhe9g5DuT lRiHYjP5vTvXJNF7pDOOPj1pSUxumC3viv/pxUaWKp3tSOjsT0ZVgy4ah6rUdjyy bLAOAiPmAP3ryStzURF5/RnQbbzrSGZJRfeQIxY2871hWg241/wslRtNpsxYSPCI PHMVB4SSFYzzbKRgUU7SXsVQYBAlRU644UE+dB+b17slv1xvagOUiNgEEwECACIF Aj0lzz0CGwMFCQHhM4AECwcDAgMVAgMDFgIBAh4BAheAAAoJEO2iHpS1ZXFvt3ME /ijwFJCSNoY1AfCEm3AX6vRKUbjiy0MdemsqajXF6awcbIaeCwk3wVr9JOs1usu2 /AQQDvz0sf/hEv6c3sMTYspD6+QzrRMUVbLm0fp+pRZKyaW1tO+/JIoOl8qsOwod kXPQ7CYFvSZhhkxdUwVOa6UtL6kOdCjQAy7DDQTzdcC/GxHQNVUNF5KcBWC7LMN6 iAt0dAFEMaQz4t37CHq+DCyI+wQTAQIARQIbAwQLBwMCAxUCAwMWAgECHgECF4Ai GGRuczpzaW1vbi5qb3NlZnNzb24ub3JnP3R5cGU9Q0VSVAUCQkBc0AUJBlijpAAK CRDtoh6UtWVxb9EIBP4pk/ztQF+XV5L4krXEmbjAsGb9C+I+4OoRUY/mWDvNAjGp pkhFD+8Q3oQvg+1dcPsJ5rQHSXgA2w1bOsTknK9DamyY35LHd9T0ZSllXOUX9q3Q eKiDBYc2KB35ZtxKNIA4Lt5qDgYbSgtlERxDY94BCSy4YApdwATei3O32t5IoR+B roeIr+w+zn9mVulkn3pRXByYDX/scxcTtWwRL+UNiPsEEwECAEUCGwMECwcDAgMV AgMDFgIBAh4BAheAIhhkbnM6c2ltb24uam9zZWZzc29uLm9yZz90eXBlPUNFUlQF AkMVrNEFCQcvRSYACgkQ7aIelLVlcW+ahgUAnWORH5p6Cdk/zhen4sUwwnzsFyAO Z7vaVPrQPq58Czl2FymLm5kJgsGXH8b6KLxVMo8hjTZnsm+zO6XTLXsnnK7nXk70 gBJ0AAM0XGlG53qDvvQmq3RkfFMHuSmxL+zL8pXTmnywIlEpgDHPVKbPKF3c508H FEPKFnDjuyRwPgq3q2mhC/qYYBRvw9hjjeRCqDTdC5wHuWLzs5MCLeG+3YhGBBAR AgAGBQJEc4b8AAoJEAixI47drUe278gAn15puEaeLjlpaTndlvxT+LAH/951AJ9b 0Hlo7Py6F9c1liLsMNWNDnyvZ4j7BBMBAgBFAhsDBAsHAwIDFQIDAxYCAQIeAQIX gCIYZG5zOnNpbW9uLmpvc2Vmc3Nvbi5vcmc/dHlwZT1DRVJUBQJD8ykBBQkIC2/U AAoJEO2iHpS1ZXFvrF0FAJLVqSWQ2fYNGCvBH4xRS4n2LruzdubmzNuCIZrc75M+ RfTvYeHwCNDY8H+PggYuXMT8armHvFvyL7jln864M9LTX4TwROrqKlkNgOkfxdSg Oz4QE9RHxxooF1GMl1yhxCoumixYE5w0z0LGYRKy/Xzd3+VMcUaFXvEqY6Q+cnQo qChCvKRmsIFhF4b4SAqzRePdx6U3PBpC4FbIlkQkpbaIRgQQEQIABgUCRYwLkgAK CRApqihSMz58I53iAJ47ZGEOrZrMqV6WKmfKa8+5907zeQCeI9LFETr1SK3IHx/7 S7RlQhoqAzeI+wQTAQIARQIbAwQLBwMCAxUCAwMWAgECHgECF4AiGGRuczpzaW1v bi5qb3NlZnNzb24ub3JnP3R5cGU9Q0VSVAUCRObocwUJCP8vSAAKCRDtoh6UtWVx b9fhBQCRE0dBfP855Vv2fPCzIxnu1I0GM9BjmAC4uMNdW6o7I4yQMXNYpP8RdxDz PTon1JYQZqQW77EdqtwjFeguScudF8+85I2FtKDmzl0NNubmX6ckxdCbuUmOk2Vu H0IQ8O0f1htk0h4dQB97YA8zu9AtqyASkdCDbRC7RgoaeUaV7N7v8RM3KpEJm6pc eQT1DLqOQIFAp/cDa76xXK2Xrd4IiGsEEBECACsFAkXhdvUFgwKHjGMeGmh0dHA6 Ly93d3cuY2FjZXJ0Lm9yZy9jcHMucGhwAAoJENK7DQFl0P1YbgMAnj34VvAwJhWn Z79fbgSY9O7CIBJFAKCJEs0DbASutepLJhiysH3J61b5D4hGBBARAgAGBQJF4sLA AAoJEKrPs4YhG27v90UAoKBHaY3RXOkwk5YL58jSYoOWltJ/AKDTwdKSURBZ3RTe GkriWGZRy2sfd4kCHAQQAQIABgUCReGU9AAKCRAmSeYoxdNNBWHAD/4+/J4V7cM1 dMrr6rpaggfgRa7d121f4n+KVn69fmxBr6vMkGP+8Aor4xMGvkL6HYJvOMRK752H wXij7TM0HdGqU0S6cisOXiS/LOPQOayz6HuvliIhJeyDF4wfI358ZH8gVTKTn+1l tqWmggd8KVbU2pEvNte+lD0VIxK0wrUT0nFEYoJsDlTUVpnmM4PxP8TwoIRwo/h9 NnL8zeh+5sj0D5tZW4DsTC1AVPH1WYUN4aY2lv49twDh63oXbzXZQ+xKWJeiByao DeEOFtouwTb7RbmDBB1i0aeb7gWCryUiHD4p2zf+R+4ikcwcG0LzR7DC3WFdlPnb NII/G31ZDacpPqkk5S3LL2jIXKhpD15ilbXGjkqsBAkOJpO7rehVbxEGUfGh+2TZ cCvLHeh9ckgjimFlZywk230H/tkQJpnHaTOmhNbBbowUkIdCjTBLkqyW99sM2heD kmkYh9jJTj2BLVED4HrgyMp+dXGeDM7nVGDCPfbaFTTz6It+ODndAC2Q0d0N59Sz x2Xb8LYfngezdhV0q0GgGXl+vh9zvZnpHV7Bef6ABTq0IOQri83IZv3HlyBeK6KP JTx+ll32ByQ8JcMuAAaVqWXI914J/fD9bvsTzJNQsPEa8yBta22Ww+jcnHBBhAbU Kfw5FKNDrqYr4VGY9+am80YmnIRQIt7Fu4hGBBARAgAGBQJF4fboAAoJEE1EwCDF wFuuzREAn11W3gtaynmEAcxw/WxLdndmL0mmAKCsf55yO8kTmKoohRXpfo+jn4HB XYhGBBARAgAGBQJF4gz4AAoJEFUVYHaRYekRxxwAmwVy1T7YQQtP7xXNdM+EVUxL nteTAJ9AzaxlVV4dO/OZTG9QDbqztagH54hGBBARAgAGBQJF4grQAAoJEMfZMCWd /6rUv38An3mkvCWcxGKhN6/PgQ2+W4zpFQPDAKCxweB0Xh/TQDjQ/dSaoj/BccNK LIhGBBARAgAGBQJF4hFCAAoJEOVE3gebfDKNJ4sAn3owtLwwEWtpw9VQxTc66cmd oFqPAJ4r2z3VgRa/Ns/uWMxV0Zlee/f2M4hGBBARAgAGBQJF4i3gAAoJEHZJQAVJ ruv2v54AoJCl4M0ClZrwxyTkOXJs7xeQjtDtAJ485636UH2u71nZdIyGTMqQkszm BohGBBARAgAGBQJF4sNEAAoJEH5OpU/Qq0B1NE8AoOJY9VXq8PPDDPjRPaJLahjO ykz+AKDN3jXgHvqD26euQ1ksEBc8Vn6zF4hMBBARAgAMBQJF4sR8BYMChj7cAAoJ EHMcr9NTwaMv9/EAn35hATWBiY7ra8Z2bjy+GZ4eSLQmAKDX1GfInkT57/rzmpkx n+IQlikCMIhGBBARAgAGBQJF4s6iAAoJENoZYjcCOz9PA5IAoIZucQg6PaqLETbG ch/y2UM6BhZ2AJ92fj8dOvoKNxn9Rh4UcTSSiPXNDohGBBARAgAGBQJF4eL3AAoJ EHhn1Tx0eTXduhcAn2LWbAgZcRRU7PJtIO3zqsIm6keDAKCeZgrQaUd1GSNW4AzZ LuT/XXiWW4kCHAQQAQIABgUCReLO2gAKCRBSIlPD1yc5gYUMD/0ah8KqI6rjyi7p WqPPcPKy9ZCnPJv2JJllu1wx4dqRZnUVA3rmHAUpzQp7HsfMXWLgjxOnUEvzjZkP PamYnczdE65l5M8zah1WNjfR8Vk4/XaeolVXe3a5R8Vxj27QRa+T5yEHprb5hPo4 uFWkPlJgJd+qcXCIc28135QngN5uRRQK4NnM/oTtv2nv15L4M4qiH6V+We5IW+Tj t74O0mSEekg1bB/XKlF/XcgyO8rEZgqwufZ4cHbzWYXw3C+CKkhDSDItGUw9HesO u1FS+Mf/Js4+/kFjW8ZJPFO+A2z3gYTDzaXGq2zlvbqw1gYId5pbukVM6PRqQrlq tI2Kza7/CY85b+DVU9Zwe/Hr+yYnEJdG+eWkshmB0mIXgQlSaf/sglsAncrmxA/g m5IxaE3TIRW/mtizuCUwq+gigIUEANAsNwR5a/RAekc8aNaO1cSj8izlGqrl6cuQ 5jyizUJB5AcOV4CUDiazITOasbt4+xx9MTsciqWIkMLYRloVuqXgsoKOTxTT6Zq+ lPEGRyYds7OEdaXHWPO0OJ2ZPCagb3OvqxJc123Xf7XXySGkGXzZgoA6D4BwIB0b 5WQFq8722b0tJPktH2a5clKJio3SMir1bpPT6b/CM/Mrk3kIFKJpmvEBYrKTCfhJ nDI2GJ4Z/f6rUDhiyQ5yj5Rop2zot4hGBBARAgAGBQJF4vk5AAoJEItKxIGsHnFe eYYAnRbZnnFoSrbo5E908zFdUPwfVfUoAJ9Dgo1WuGHPD+89PSqsyMshK1qavIhG BBARAgAGBQJF4y0kAAoJELOx+BoCeHiA9a0An0E0Zyjequ/iRSSB+YolhRqc87tp AJ9PeRbv8Ce1TY6qCoyIO76zYScX5YhGBBARAgAGBQJF40D2AAoJEDiaVjzCcqEm vrkAnimr8D1OTH8O8+E3A2VOoxLhG8PTAJ93AR9hPTBxVBY+TqzapQz12ROtjohG BBARAgAGBQJF40DdAAoJEB9/MmoS7vYqmnUAnjcrUSIjc8jjfdxLhJES9yDBTP/g AJ9ZSpKAG4kvVjZqcSBhudGIw2NkQokBHAQQAQIABgUCReM6egAKCRDo4GL2DcsE MZKUB/9bQd/kyhettf5FPhSPgtVgZanF2kI0WnDWUGXbbn8vLs7GNGsb6eyuUDEM kL/f6xtVHNPC44HarRbawhph/m0P25KQlaHX4120gdYzPR7mnUMk9g7P2ycNrcND 730oJMS3f8FBhe9fnt4adPU8mp5fgU2zTsdVHpa2zUVZHNh84iuEoxoZJEWEyHHJ ke/avbbc/G6JmMD+8vOV8nKHbuzNOAfA09kPJWAPcfR/grCpEMZ8SkB9F4FvPEjU 2HxeFKx1vWNTamkr6ygUVlX7bBwLCe9p+7ue1rMeKOMsJF7UnAkOthEC2IeyhPn1 gyErrjYzQOX+3+YPCSO73fBxSG6liEYEEBECAAYFAkXjS5cACgkQKJz/wOY81tb5 TwCeLd//hOBTT9hnSkZFuxLso9J3cToAoKnsSW/csdFyRJLh024CqSzu3/QXiEYE ExECAAYFAkXjRMAACgkQjCXuDw3At9aUHQCglgCi6nNiupwbEfwEsvd4MRYVzGsA niDj36LSv47TIbmUQJlR/qiNJ+phiEYEEBECAAYFAkXjVQEACgkQmEvTgKxfcAxE EACgmX4IGrSutcvAs9Pfr6JYEE3hdsYAn1yLt/tyLO9laWWhLKhNH7MPHc0xiEYE EBECAAYFAkXjT0YACgkQIae1O4AJae8N+ACfXCp09XmUQQ/xvA4LipoTAoyqX+oA n3aZHFSOKENXaHthrpt0FFaPVNEJiEYEEBECAAYFAkXjfaMACgkQzxI0fJaL1Yct 2gCdEw43ra6oy0cwLX+zwRzTXazKQn0An0FuDnGs6J5+x6hlK3MFjyfRYZc5iEYE EBECAAYFAkXkGvoACgkQZDZDYQnzQCR0eACfWdtadQLH9Bbi/YPOcheMmavmCrUA n1fBKs46WOq7jppufBXwcncegfxHiEYEEBECAAYFAkXlgbQACgkQeQ6MlGH/2qvD yQCffMAMRUHCPKIbbz59BVNmgpyvSmYAnRMspmLYF0gk0xfHoIFaS3nwt3DgiQIc BBABAgAGBQJF6Vo/AAoJEFeTDasLhrBnakQP/1Z460aR3KyxrCrEcDJ/Vzf7vsbq 1DQnmoRuIgpKmR87N3qRLb2p94ffRYYxlWcFj1jiYT3Wq2bxjHyCZPgcAM2bQuuJ MFxQo2xgwobyNqesIafgdbMjdUEAVy+NTyJfdmM3I57lkrleGz6lk9ojMLoIDa/t R1C+uoLuSWMj0Xk/nCT+WnN3/xqZyPIa+i6MN8fuI6Nsa/C1jiNw2FnZy721hl+P 1Bhx+i9aiXCR0qz/3AOAOz25F0OXNKKdzOgdo5mCkelbUaey4gPpvb2oZ30rh6VT elOOlGU6WbEO3DQBuOGAxJ1Ux801przITs1923bZU8EPyfDZyZWINkpl7M4En4bq GKQkjTIfE8GrSSCp9rsLg1siK38yMYodegSzSJ7ZWWGlyuKvrim1eQw8svSzRphs ujaDJG8Oy3Dlc3qBbA/CGx1OtyML5G/w5C5b2Wz/BkMgHnOfOJSVjGlJJrxGyydR qThibZ88yRcZ8130COubR4Rr2I+TD+FZLhGtzQGia4gDQ9QG5td6LS5yLPc3Y52N cwWsbMHWzLTQ2k3O7PcsetRPLpduiq1eZUZZveY0MSjH+uH3xzp6qfj9I4FDtK6e pHQ0F9Dw8kK9qBAhiqrKxsUUbalx5Pup0gIkzNe1vzjByS2P/j2VMhbinhG5FZl0 O2mPcIXHeHlAJdGCiEYEEBECAAYFAkXt5LkACgkQMGnpIbeahxy4RwCggxD0dEmG z7ipFrmwbIGTxuxIS+IAoKfxzxjiT2m3AEvfkL/xNuqgenPViEYEEBECAAYFAkXk wVwACgkQcLIDITr1nRa4rQCfZvrXaoYQ8TeX/lhuJfmsPb7kIRcAniKy+cTGNExR mZutFX/OcnatDZExiEYEEBECAAYFAkXqoaAACgkQL5UVCKrmAi7oEwCgu/2cheN4 mU+yFFIG6HmLrbeIc5IAoI2I4eLWJdmLpJleOYgF7CtTGIKxiEYEEBECAAYFAkX/ bGMACgkQOpD/wRQI1/HBUwCglcM0b6fl1oP8iofWeovuhSk4+5sAmQHrgf2pbqFW 1oTBNS60dNQjA7VdiEYEEBECAAYFAka12CoACgkQXeJJllsDWKIizACgqk7R3Bhn GgzraKbcP9qSMhbYBr8An2Xah3bURySnK2QBDx4GzNM/vCTqiEYEEBECAAYFAkdZ tOwACgkQcgQ2cL3l8e4/XACg2opaihfpMLeOKb2bNSD7cLpI3N0An2A2r+PcOgUD t3qIIZ8i24HAhBnSiEYEEBECAAYFAkdZt8kACgkQ4Q56CecvefrAfgCfU/NbkK4w CiFMyviXo/F8tOEGyqkAnAgNaSmDzLkYZxHlM0SXosfHfV9diEYEExECAAYFAkda cyUACgkQaGtW3WCKJJsOKwCeLKhorr01GCKnXR8QaGvImLVOm98AoJpyR9WMJ0cs X+CuEdzGJDTlD8pxiEYEEBECAAYFAkddIIAACgkQt5wosOl/hW0OtwCgposF7nuk dTQ1nsQd1AGHb0CkQzYAn06bBOKMXsPcN2VvMiO2hiv9FLhniHoEExECADoFAkdc k2IzGmh0dHA6Ly93d3cuaGVucmlrbm9yZHN0cm9tLm5ldC9zaWduLXBvbGljeS0y MDA2LTEwAAoJEOdekMA5zDPbZ9IAnRTxxJl2Rtv1ZbnGsOuPJ6musP+5AJ9b8b3Y 9BL7PRHzWgQjzALVVXRrdIhGBBARAgAGBQJHXR/KAAoJEPG6TB7RyLqP7nYAn048 cLE/iNKJFxl/RwkY9VcRedkrAJ9+Y6u67OnG6HneUhzqGvMDbaGmAohGBBARAgAG BQJHXYVBAAoJEIUGW1nVLdGnUJ0AnjF43FY5SwhcW2JmuPVu1YnWfrwwAJ990zkv mIQtRCrxMzMgThz4jVaoEIhGBBARAgAGBQJHXAvSAAoJEO2/HhEm8iS4g2YAoMWb nnF/sbeM8+WToKO0nnoJrXVAAJ9iX3wXtSwAqrK+3X5imRfXGTxh8ohGBBMRAgAG BQJHXuTeAAoJEIXCJ+WlVzjy4fQAoKz8piSTCDPkv0qeNq0bdoDs9mOxAJ4lO8Hp GDqjYheaAvKG7tFZ1fsZjIj7BBMBAgBFAhsDBAsHAwIDFQIDAxYCAQIeAQIXgCIY ZG5zOnNpbW9uLmpvc2Vmc3Nvbi5vcmc/dHlwZT1DRVJUBQJF1dVYBQkLk/wtAAoJ EO2iHpS1ZXFvjEQE/1HviHOOSHv0ZuOd+H6SVlkwnhmx4g6fpyeeOa49lywggMBL 8zddB/928PMYFQQ+pvYmECkOK+O6sVO2NkubopZwE/hUjt5sc0XTYQ9Lvxp40N/K UR8fSR5FvLQSWYGYRDXkK3t3Cta83ZeJk2IK43DpgVoFWMN6x69DlRGTyRWbB2Vd RvSZz3ZKp86p5cnwMT++K+pNxq+eY0UJorLRj+SIRgQQEQIABgUCSES5dgAKCRBQ LE8plp8qHbO7AKCPmi7Ri8FKIY/Wf9Ksa2NFDxUnRwCcCdAwwG67ZmplFNtZlVDW wFEcvT+IRgQSEQIABgUCSFlvKwAKCRAk0yv5qpXDSUwfAJ0TPD78S3J8UvoziG+b TCLTlPz1XwCgnWlV3PBKvOxuGSAdm/DOMlY1ogKJAaAEEAECAAYFAkkGvzkACgkQ Ke5YuZaGUXFYtgwgx9yOo8cCR2a0d/0J8Ux8wAnjLI8m68BCiKW6HmAzXx/mNX2e zicSEyqcvv4q5XdpvSrcA2kmlREBpu7mmnyerUuWWsTLMbi9clXaKRZ6yQJQBbrR YwrXtzdFziHqFjw+hC19uVXlPhXYa/8YL6aCO4JUlzWWgVF8xHupfRTIeXuGLkC+ sWww2VmSm8Fg0FBG9jpIt4wYxNMI77so4szE/hoFQSdRtY1lC18jjluNiygGNQQP n7r5OKwrK9hX1gGZA2tGYVX0ZoYASRPZcUUzaYPH5cZ86SAg15zzroVD4etmk/2i I4sdzR9PyKr0zUp5FNSAFRey6avPAhaTNsyVDRiKmK3PnZF9H9HaRLJJnQEcvevN 04Vg10VW/O3zCFMFi8zuxUP6ygoDdWZT9jR4wbzVEyFY7AUwXnStDd39p3oamTb9 XtlngTJjmVBZIOlap4vmKsm0t2xviaxto6uR+656Ya49+SoXp+u5+dGDT2o0kFlN aC5r9zovItqdDYUHtn7DsIhGBBARAgAGBQJJZyWPAAoJEEc46iFldJl61+EAn1jp iTpjqq/l1oKwJQYDB0WsqGd+AKDEiDHvrN46b58gzQKdVbs472bFS7QhU2ltb24g Sm9zZWZzc29uIDxqYXNAZXh0dW5kby5jb20+iPsEEwECAEUCGwMECwcDAgMVAgMD FgIBAh4BAheAIhhkbnM6c2ltb24uam9zZWZzc29uLm9yZz90eXBlPUNFUlQFAkmh LgAFCQ6tWk4ACgkQ7aIelLVlcW/pRAT/X8oFdC6KZMRTukipZfy2cp2zQWmYs93T 5Itr5VrqU4kGzIyeGpYlIS+7jD1/jILjK3DYQLXpwNOf3ABwulLYYTeX5SmHk5KJ hi/UW059X6tOZ6lppW24fRL93OzX6gVBHGpj4qfirLzM7eq+VyJf93he8znYOWJ/ vy3mXa/QdMLmIL1eC+Z2AysulpDAOeIDzQbQNqbPMoNrmcO6VnZyHYhGBBMRAgAG BQI9WPK/AAoJEFeTKdPAGyoiF/cAn0dqzIl3Ss2QfeWnAOWEkODC0MsoAJ9Tb+zN +kgKH0f+91o6pT6VQEPn0YhMBBMRAgAMBQI9XrB1BYMBV4o2AAoJELy7xJVxipJW GZ0AnjlyM5hKGecjlTcoKYWJlMDjf0vCAJ99oFg8mkzKasg3CREHi3Y3Fu26EohG BBMRAgAGBQJBAMp9AAoJEJ7XWD/BTrKC96AAn1wDNEETZX6vDoCYdUGpV8NUiyWV AKCgKBgAABm+xdRzvY2ytKMCCPLLHohGBBMRAgAGBQJA/z93AAoJEJb/mcQlwOwL W7EAoLqAEMsXFUj3ScAXDYcvQaR+5lN7AKDPPs/9tixtWkuHbW9SPuaUfDizQYhM BBIRAgAMBQJA4Fc9BYMAk7TsAAoJEMiB3UdK56tHYAgAoKntYOktDGj5H5u9hfIq E9YIayhHAJ9PdLPDyKM6C01fd002zQe/eapsj4hGBBMRAgAGBQJCSQGQAAoJEI/D cl89aNY667EAoKu5aEpTLn2dplFPPc7+ojRJc+vVAKDcmOrKUKjImZWIh+Y/vJLw OHYi84hMBBIRAgAMBQJCHfAjBYMAPyIxAAoJEBgoK2tFOUoBYsoAnjEtckRH/Rlp C18blWLwEYDTSgw7AKClQUzPgy9KNf3j7/MsP/Emrl4+SIiiBBABAgAMBQJCRvnB BYMA5rEOAAoJEL/W7lhX938JlPID/iBCDWspuyuxVL2VrgpHSXB7IQhlQZUzqiPW AdQk2PCzXUR6fI60VwWRWTgzwM4h/9WaIkkI7IE4PPAVKcSy0oCR2TqobjzFpS8G ulrMrShk5LhQp2fppJhynuy1Z40iq/Dqz+8uToRbXVam+XYIvUiHitmrLNV6PvRF mW3KPr/ziEwEExECAAwFAkJJRAoFgwATzkoACgkQZr5x/2dIaIODCwCfeOCIoJAc Eve7QmdisnrXOunbns8An1paC2kNbYfcWeO4XOnHeglPVw5HiEwEEBECAAwFAkJN grUFgwDgKBoACgkQO46kH4L2EkAE0gCgz5vROEPqn8VQJZ3D6dFhXQISjaoAoL5B pboL6ZlwUEUjHoB8bJGQTxIQiQEiBBMBAgAMBQJCYTmdBYMAzHEyAAoJEAt4MvNz 1i1B9gYH/RhzAgmG9+PZuuvOeRMj5CZpVURiOUIupt+640ZrwIy/mgUhWKAGMlCn n08r907CfJfmwELKGkVOsG5+7nPy8KCVEwclxY+6zzqCE8cekmt1T9Z2HV4wrWqy po80E2FNXFsHylGxAN30oLOIKXfNNZegttRfg20pj/AmzrRm+tjb9VMdQl4lp9q/ FVMuQFVmdFQ+Kr8cSBhp+fEdLy8SguYBhYnbPSXTISXdUh0NJhZGafzaTTp28NgN LX4WhbKXUAKAxIzh06/X7NDwFAa7eWHD9lvojWfSj3zdnO9O6f97xK0j8UGQqFwZ pzdiwOcHjSFVmZyriT1HskORcB/aKz6ITAQTEQIADAUCQtiwjQWDAFT6QgAKCRAY WdAfZ3uh7EFLAJ9i5//07JhKiC/23C7bfFc/NpaowgCfWuU2y7lDqePoeNxdgiY6 1AS+wiuITAQTEQIADAUCQtiwsQWDAFT6HgAKCRCBwvfr4hO2krnFAJ9HH3oo/o/H Y1Oowz5v7a0By+fyqACeMkgMrMlUPFN32fjmN132Clz31SiITAQTEQIADAUCQtiw 0QWDAFT5/gAKCRBrcOzZXcP0c2EfAJ9Yy1Y0/98TlNF3fU1dTjd/asSXrQCg+hqH o0R2g1ztigaEJ6xlYKfcFVCJAiIEEwECAAwFAkLYsPEFgwBU+d4ACgkQquPmzmah RGijYQ/5AQ2INhVisCJEjJc9CmVqABcKDvblFqq2xe8/IMGSpThlvYL3BdDj2KMr 8tPeF63anbRvCNiain2IKWj6+4xVN1YmmNTK/MED6sX3JripbAn2Yw8SmmB8eFSk 4guSFyeILjHk5as208d6502S5tEnsnoZkA3yD02nFXokgDNFixxM9HzyOcGCASu6 A2UMkiLZUUgjiZiKuUxBlRG/QeeyKXs1uDtFsEahOocPE05+6bjBx3U6yPD0snaD wMEkZlMVfKdhC+GWIE01K7c79Jk3huz3c1PWHNkxdzlycBE9aGpHtDzS4a4msg6n VZb7NYdhdShCAKLbjCl0XfAolESpZ2oY+3lrbdyFYq/D3aAc0QLU9/iZvBEt9sf0 3V0PCg7dcD7P9HpCzHCM8gCEluoFYvurrVKU71FzEP4P7EGV49mK0U0owTRT+lph OIT3NYdybiZtAW8FwdHPIxOtGBBndAB0iYDznb62vQHjbzFOnZ+nNE7NW6FdN+Q7 02YU7VAG/ZAHP0+aLjQ8JvILKKG+xNNlBUX4TCKNGao+QZ9pgtEAp0m/T/C9Qumw G2RBV3v1K5x/niga/mDGKYUyFlmfwkmYScAWlQxQi86q/WfzoqxC0hCSgnBtFcsa IoEHx5h+gkYzPSuCJidq+a6+BSk98PPBrrcbPcqWVulxIUPU49mIRgQQEQIABgUC QvJK7gAKCRBu+K/ChldKysP9AJ495oiNOr+Yzim0SbesMCyDQOzekQCfaXXwvuCW fkjKtMPXDtzShhLCddqITAQTEQIADAUCQvHAcAWDADvqXwAKCRApqihSMz58I3+f AKCKbs82jshhd4NisvXVfb6hAgTbNQCeI0VNu2cKL8v4c5yEfavqPnriI6CIRgQQ EQIABgUCQ/jTlgAKCRDhXdhXsVw30bs2AJ9o4wcGaqejXyEWTPnD0BVqLGpzCACf YGRrmV6jhnERw2KNVcFCuyoPGp2IRgQQEQIABgUCQ/jTmAAKCRDhXdhXsVw30UVa AJ4/pDYdsiYiACPSRFXHIHb/HHRJYACfY2RxWuCiHSLHRkGeRuKktGJB8CqI2AQT AQIAIgIbAwQLBwMCAxUCAwMWAgECHgECF4AFAj69R0YFCQLVjhkACgkQ7aIelLVl cW8Y2QT+PjSaIJj37ijex+wJ/HBLkyydqWYVZhuTPTVMLst6DQModRBj3Xi7UYlg g7lJ6tRxarVuF/eYW6Zv4jx5FePxKLBeAG+H4FRQH+ogIXeBlDx41X7L25wjSxxP hQ4CwBNMmSKckD84LdQiPrygbX8JQLsJ08XuTzDG7740d0RotqxizGhYP0QJTD67 VvffoQ0gLtB5chw7Pc9osT1+j4yizojYBBMBAgAiAhsDBAsHAwIDFQIDAxYCAQIe AQIXgAUCP6QrUQUJA7xyJgAKCRDtoh6UtWVxbwueBP4uh9ZEOuSjt2n5OpfuAabl srRzhlgPfluBMfjHNynEFsGjn81l81TCqStRln7wDUj95ZufSi3YvoYSFG1jffGM k/k2trgINtT3kxaGkfns6dykBuV7Ki2wWqdJkTe1ibyai+RCqt+J1ldSUuHdfQZ5 wALPJQRb4Hqi7M29azFHcfxbMLf3yGYyBuKC7eBVNVaR58UTFK6r0CX3T7eGuk8b iNgEEwECACICGwMECwcDAgMVAgMDFgIBAh4BAheABQJAhr4rBQkEnwT+AAoJEO2i HpS1ZXFvkxgE/2ZfCBqYKIe3SDM0tOVNrIeSZuVNUyn2xoqRKK4VomvTI1eMShfG a0twPVlBB5xXHt06yRbwjobJykmDc/Hmteel+FVWOcehnXq8T22gLENlEM0CUZel losNwFwdnWGOHGZs/B4BVCh2pzsCra6di7MKCznZDOHX3TBLoqVHjWzCldxtwc6Y 7fAsEtrLVos4+0JvjQoYYgHQyril5ywHYs+I2AQTAQIAIgIbAwQLBwMCAxUCAwMW AgECHgECF4AFAkFvxFQFCQWICykACgkQ7aIelLVlcW/xbgT8CO3clOxFv4L9gsJt xe6lRUISlvmjoiQigmw8PIQwGfTCRYA5oK4Mja47+1PzbqzY1AlEi3JyFpIQMDCp RhkhfHGjOVH2vap3aGXxSFr8JGM0SO1Z5+88uNo9N7RAi4koaykIy+GYKypoyF9U LGj5QL/bUYgzLLG8etNasmE/Dl88mEXhY3wuPwaeIEbcv/HDHBymbv7VplP/3Vht ANfOz4jYBBMBAgAiBQI81QcrAhsDBQkB4TOABAsHAwIDFQIDAxYCAQIeAQIXgAAK CRDtoh6UtWVxb4jyBP0arTNzMTakDhO8BCE03d0iru6sCFJ2qQeh4UAFXy8KZ5yb tWJxFT/Q7xn0uXKujJ99cXhuy7icDR13wWkRKG20IjKiNv9yzQaNR36+m58mjZu1 UDnGVm2PT9bELYmKTVoumi44QWgU5lgq5KZfWhsA5BQEqS5tp9k4CBBg36JCwjYx HfnWxymA1hSyMKPmgmPm6aFd+Lv9d3h5oTVs9TBOiPsEEwECAEUCGwMECwcDAgMV AgMDFgIBAh4BAheAIhhkbnM6c2ltb24uam9zZWZzc29uLm9yZz90eXBlPUNFUlQF AkJAXM8FCQZYo6QACgkQ7aIelLVlcW8t8wT5AdyhUlQzcWoLN/934mFm8zk7TC1n moHE7v3euwTumyABwdUh7l/ztBk20Ontmaue6DIGELrsfYWtAqvyWqwi8ptpLOOu jzJShC2zBVJ5/86uGpKASqzTwCJ9rrqyjBPVlY7XzWbgEILtqg1Gi/Hwe7LQ/5jV nZu08D667pS9kuHaIqow/73nOWg0c0dlaigblMcVCXRF0Im3JvIOYumf64j7BBMB AgBFAhsDBAsHAwIDFQIDAxYCAQIeAQIXgCIYZG5zOnNpbW9uLmpvc2Vmc3Nvbi5v cmc/dHlwZT1DRVJUBQJDFazSBQkHL0UmAAoJEO2iHpS1ZXFv+CkE/iKshcx+BSBC 2d5EK24Dww6sBDPNF4P5mqLCMfa2VbGeWZffVQlGgJeLfTt2mtIAGRoCyaUazWjj 206K41Of7G0ZVFeCyfPyjBtKFlwNLrjMWz7kAGtLtXF/bKns4Mr3lB8KXJKiOTj5 uFI9m+b5emAMDXJyQG3Dna/WRcegpI+urrnR0PdZhYBvYPPY6ggctLsXtfL3E/be s1XLsyLWzSOIRgQQEQIABgUCRHOG/AAKCRAIsSOO3a1Htu/IAJ9eabhGni45aWk5 3Zb8U/iwB//edQCfW9B5aOz8uhfXNZYi7DDVjQ58r2eIRgQQEQIABgUCRHOHAAAK CRAIsSOO3a1Htl+5AJ9kk3l8sdO9tAL/pGpaMuwwXG0PTwCgnh7vrRtASYmhSeT5 RS/c+2E3+iqI+wQTAQIARQIbAwQLBwMCAxUCAwMWAgECHgECF4AiGGRuczpzaW1v bi5qb3NlZnNzb24ub3JnP3R5cGU9Q0VSVAUCQ/Mo/wUJCAtv1AAKCRDtoh6UtWVx b5wvBP9pt+ced/OUwn6QQVC28XSEj+Q2XE5TPTt9C/l2Z59ZRVQBQ0HrO2bSyX0L RlGM0j6ANddBu3JKvGJizeOofvrVdXBHVDQv/qavmfoW/sBk3Vy/c9nBmFx+GMlE zxWIKgL3oBRKVEG9gKT/bTn5zZQLt4Lu+BlATeADNUlUjncggKSXXp3uYQghWqZQ HrEs3tk0NwzBxYPW97DmtYcjSNaQiEYEEBECAAYFAkWMC44ACgkQKaooUjM+fCOM QwCfU8bBrk75aSt+Pw/6RRus0NtDieMAnA0cD0TCoCFX+K6cYyR5erJhHgRKiPsE EwECAEUCGwMECwcDAgMVAgMDFgIBAh4BAheAIhhkbnM6c2ltb24uam9zZWZzc29u Lm9yZz90eXBlPUNFUlQFAkTm6HUFCQj/L0gACgkQ7aIelLVlcW+BZAT/bQQwknXn Ub9eaIXx+aSbAeoO5gcowyFzlgcinaUyHu6J/1ogOwilkoQPsxhgRE6A/unk3Zac kvBrzpN2mw9YnVGRC+Nc9queRWKFhBfKNUFwMCcpVIy1IjCR/fAz1xlV4kpJ5QQX 5bPe8TYUqfKRS6hfWRvBZd0SUuC1s15IyqgKq9RZEQnq7GOzyQvMbSBeRkrb4Guv ZIdwdbR+qD2PmYhrBBARAgArBQJF4Xb1BYMCh4xjHhpodHRwOi8vd3d3LmNhY2Vy dC5vcmcvY3BzLnBocAAKCRDSuw0BZdD9WCItAKCI+or/qR6qhFzWBjh7ONW2Fwt1 ugCeMPkV8gI+AYho8zb7scqP8WtxIkeIRgQQEQIABgUCReLCxgAKCRCqz7OGIRtu 72ivAKDtzjXOLx6LXja+Cdbjv7GiP77jAwCg+BUnbBlNA3DFM2cCMfh0++FHMUaJ AhwEEAECAAYFAkXhlPkACgkQJknmKMXTTQWJcA//VxD2KKHU+4JCnMHMAtLQx36/ MlBwqGGjVX4+ZAgj9zz3dtOP9oYeH+U5XQCW0byVbqnyYdDW0w5uUctpKtxOtRS3 jCRmzPD2avfpW2jneg7ylfjeIQnn3Elkt1sxu3QiSfvFxFgw4GfJGIs0/nfhO54q OGX5+oMitavJiNC60hGJ7g+ToEZOmNXkWS1s93Szf88Oby5u6xtRoqYOxLnj6kA5 iPYSl10yz+opirrlCmxh9swjv73F8uuiebCOiJMuMNnQNg/+gkBlP5TUDCq7HCin iNn10PCO1BTxqJg4rDtZca8+UEPs9Vcep3CObuYqzYxxRWD5bKu7ReCYMlV9ebE6 bABzAQCV4ZBPX/AtWMbLTSpz/RdCbXM6iuGxRdW1aGhOR9CKfDjS33aAXprPUJeg YLxskDPeJ+q02FZ5YcsfTzvSy4RfJFPwaZT3APPnDzZAddMbiuPMzPKr60qIQf0B 1KOOh99ydj3THRY2TOCqs7TiQtg7DzhPC+lmQTAnLzF3kzk3aCj5nEbXjwChfms1 B1jnnKQJF0iiux8ycGVsja0Fo1xIuaeVoxLlBhQYBZhpW84uwC2Cyo84xwxbwQ52 9nWVsy7bMD3Sv3RDHKFZb2VEI6WNAM4RLjujRUOsYnBzM/et5r2rNbhVYZpXXI09 tn9buCCkvvqcxDJSleqIRgQQEQIABgUCReH26AAKCRBNRMAgxcBbrpgLAKCrw3g0 BerwcZrA0A0QMml9oWc/NQCdHxDZHRXDlJKb3rWsk1rIj1KvZsSIRgQQEQIABgUC ReIM+gAKCRBVFWB2kWHpEaBgAKC5Hgg9nq2Mc2yUo4mtYn55TZ0mzwCfUuZjRjp5 i0wGMRjlSQIAFwLWbcSIRgQQEQIABgUCReIK1AAKCRDH2TAlnf+q1ICMAJwKvons J370KWFzEUD0BxUNUOKCFgCgm1I9hRBVJVOnBc5z6iDJ1M3NgM+IRgQQEQIABgUC ReIRQwAKCRDlRN4Hm3wyjd+9AJ9f4xN5fLgv1M67WOBPBcwdaWr48ACeLBOOMDGv AYncekiZ8tqSxWMYnGeIRgQQEQIABgUCReIt4gAKCRB2SUAFSa7r9u8/AKC9UtDG VMlgcW9Ki3UAbWg5zhA8AwCgxXoak8y2uBiNVwVpzO/ub63ist6IRgQQEQIABgUC ReJbVQAKCRBbk8AvnkqcneUJAJ9CJwzNxH++BgxHoBCYvQslevEaMwCeOwpQrG+K +1hgmCaKZbBR77xnVhqIRgQQEQIABgUCReLDRgAKCRB+TqVP0KtAdYQiAJ96HcY6 xRsnPcfCgmngWFz3DOJzeACg3O1etKwnXm24bRYRM3cPLsNkx9+ITAQQEQIADAUC ReLEfAWDAoY+3AAKCRBzHK/TU8GjLyPGAKDH0Z5QNF9UMFgUhXvGR18mV+IQMACg kM+uL0ZjSu/vXGwM6RQqLWsPoYuIRgQQEQIABgUCReHi+gAKCRB4Z9U8dHk13TUW AKDRPfQWIu8+rVajQ56tvufZsfMUqgCfd6bVey/0wlxFH3BuKaB4maUoMzuIRgQQ EQIABgUCReLOogAKCRDaGWI3Ajs/Ty+8AJ9hnkGZ3J5dGL1ITHm67C5zuphwmACe PnZ5O5xlhXIeI+D8+z1JGpEmr02JAhwEEAECAAYFAkXizuIACgkQUiJTw9cnOYFl Vw//aP6Sev9OcDLXyyja3Ml3q/EXe0deIgZxLunLJcv9irSnrbg/fh2yZxognbSL BMdBURA2QK123awXUej7Jughn1SnULvi2/OqI5+prBV4Qx0rU9BomwEQE+vWHS/0 qFmc0w+IzooBC0PXhVI9tTvPq/vKMrbSLiBlxqw6EkysfcRgHIIexpPNB9kMD4Yb oTvTHXOSxpthY3h0ehOhnReiw67CQG30CMQXdPp01uvH8656F3CA5LGhTv+T+rGA cJ8SFiShjF+cXWOlI7DtCFfjhL/D9S9Ug2SWMigoz4YE+at01SGzs0ahijF/cjfW 68TG/mBxBXF5uY3rRU07f929ks2oMy+l9npVPwcDvKsYHwNovtN4M5wS5UWpgX6k I4ZPPV+nnan2FUqNCcZI9+pUsyOvEIjsdZkGXLgyL5WaN31DhZNz9yMWGJOaNHlR pdDm8dPXpnPPoXFKm7O3hyamSW1mjKaMPG2PMigClH1KfnK5kY2D/G+z1fk5kM5E s+H+zPySxDMsp3IvwE+kdAIFlqla/Y+6IQ2mbAbaRzzzOrB12+YpNfkCbPmpQZMP 3cu1YIgdJ/Z+urdE0nSepHf+ygL7Wus6afUP5GWFFNe2BSJR/6Fcd2r+PV7DU/uh hbAu6yqEQJU3/X4GDwwzvxxQyR79C+JYpeog5/gAzdWa+2mIRgQQEQIABgUCReL5 OwAKCRCLSsSBrB5xXsftAJ4meBeaphMXBIfSN9x/4hrUOUChqQCePhSTUe3w9oQm xG/m81i3weQ1Pu+IRgQQEQIABgUCReMiqAAKCRDTo3AErk0c1Ck2AKCXjF9YJz1S n4yr3Ahdlzjha4ZWlACg32/5EOg2CP9Is9qqM7Nmp2OHABOIRgQQEQIABgUCReMt KgAKCRCzsfgaAnh4gFQBAJwIWxxZqJ0YaHcHuhUmpO0jw3hcSgCeMO97CZ/WW9+k to47ZzmIJq34CyiIRgQQEQIABgUCReNA9wAKCRA4mlY8wnKhJl9sAJ4vjcPCWTFt o3R8bmFfdhMjbzF2dACglEwOiSd/ZglLVxKUoActs5QKY8qIRgQQEQIABgUCReNA 3QAKCRAffzJqEu72KqXCAKCsQKKlQ/u95XZE5laDGvEhoEXM2QCeJMg7cxbPm7MV PO6q9UJwGyQuO72JARwEEAECAAYFAkXjOnoACgkQ6OBi9g3LBDHt7Qf+O59RTNft jDuxfaIVU3iwIgVs8nXeSb/vn5brc1EfpaEGdNrXPWHvDy/u6ARZ386G5F4dz3Eb 4kugaA+/P4p0pPImRmeiRRgcyvpATdEF+/Y787dhkl/fVs6/ojLx7Bq5LpOxHs9S ZIjhxXkdPzS06T0dpzV2iDVbGUz1mZL8uyQF0em1zldoiswzF08go4koWeErXtZA y0Khu5up8sDISaUWnm2VDHrFLdr8PFzpUv8Z34e+XNiiVoP989dE6Gx2qgBhmR/p rxY54JCxMh/esvTRLjf9cze3t1PI80mK/kmp2zsVIsd1SIdw+fjzYd4ZzDi4gA8n 64Tlv5gldGn5DIhGBBARAgAGBQJF40uXAAoJECic/8DmPNbWs4IAn0vpU3ALdg8y T0aq4qQJdX1oVi5bAJ9EVqkfOkE6WqPIaA5pnodCaTIddIhGBBMRAgAGBQJF40TI AAoJEIwl7g8NwLfW7wgAnjB0msHMLIjZvK8oSH0kWpPxmiCGAKDKaUqkSvY0y87I izLQYijodqQvDIhGBBARAgAGBQJF41UFAAoJEJhL04CsX3AMMy8AoNI1odP+fQA6 h4CLWjaEK1qndHhlAKDNY25jsLzqCcJn0JqQaNN3gkvNx4hGBBARAgAGBQJF409I AAoJECGntTuACWnvwD8An2FF/JEayVKOL++9YbNLXpBVeRxaAJ44hot3GOOSS2OI ZZ9L/nw4ZRiHWohGBBARAgAGBQJF432jAAoJEM8SNHyWi9WHevAAn2TcTFyH84jO pejOmDSTrK30xQx1AJ46kGnM5mgIVuqSDrl/1R4PmrYN44hGBBARAgAGBQJF5Br+ AAoJEGQ2Q2EJ80AkeQwAniuGytBx5JvGcFJV5NBliOGfxhs0AJ0be5jI/yWjK/bn 88x2wmNp3mcA44kCHAQQAQIABgUCRelaTgAKCRBXkw2rC4awZ/WXD/0dhSb4vKuX 0H6Z3EyvlehYrjZUKjv8tT+B0OWmvexuUEC6VtaPGdV0bHIWIi7AjijTgtwRDsT6 qLg+N8wfAzfGloCKz7BAiF2Ugap/X0JwbEXq0OgSzJ0LU5fsHBMj9Bb2pHVmZVqy lJppuhMSnQ4paEctfq3Ls0UJslNhGtflAE6iIassIpZqI8aZfBtC6AWHk7AsUl/M Q4GlxkmNmVNJoBQt8h7DEK02AOqwBLYrHNSyqBlmjz90Cd3q8Mnsh1d702+NJZF2 IuGjqSAv5E2aWNCZQ2zkoMhOGTlqPslEzIhb7G/a0I222px8DtAzYX8pKA0zLV+4 W06pLOrbqiPEOBCPE4wt8t/jNrt0bVg3hrL6Sf+3AYpgDG3LXErhGbEcPTsORUeQ MWcGtaLfKCs29Bln5WBVgeiJADv3t7w4EMFBj5gVlHauNbDzip4q9+i3B4Wjmbqk 7HOpfmxliOKEIX6aKE9SfecJXta7A1potO8pg0LlezufjN72y3PSUIa0VnqdMAVy YXMYUPuvATlFr0qWfzwql5d/J7zNigFzXCW0iBlv5gqTpoqJ+byZr2RUdtC/Q2ym WP4/cAcScFrR4anDnfiOqBeOGQBy7ceYd4DWd38PBU+fn4Z9rn8HfIRlJ3y2Ci7n Lswbbp38GLgYYwq2tjNoxuGr/4+vb8c3y4hGBBARAgAGBQJF5YG2AAoJEHkOjJRh /9qrW5QAniwa6vfWlEt1H8oeUOjJCyp7Ad4GAJ44QWVps5BWoeNpJWcS3m4cIFYE XYhGBBARAgAGBQJF7eS5AAoJEDBp6SG3moccZusAnRbuB1slbRLAebBjUhTlyvgS dsibAJ0V/NfekMsvwX6e6my5KBTFY4WyuohGBBARAgAGBQJF5MFdAAoJEHCyAyE6 9Z0W5t8AoLgQz3ZhGe/hzwQ2bBTMeV12AyzhAJ0QWg/BHvHseBde5/14a+V8pt0S XYhGBBARAgAGBQJF6qGjAAoJEC+VFQiq5gIukCUAn2UXazhZrEHLvZH0c56N2LdN HYI6AJ4zZnN8vY09pgpA6p7+YGQfnjuyBohGBBARAgAGBQJF/2xwAAoJEDqQ/8EU CNfxSUEAoIDQQMHKQdtsKlcQKL3du2kBeaj+AJ0WEKNgRh8NgrcnppW2TpOygvQq M4hGBBARAgAGBQJGtdgxAAoJEF3iSZZbA1iisQsAoJ4LWFLNtSwDA4bNi+qIAHIV kEsbAKCW86SWOi3QcT/cZ+edMZdqTTXeRohGBBARAgAGBQJHWbTuAAoJEHIENnC9 5fHuRb8An2E3kaGysE5hsrKBfkIBlco2Sb2IAJ91er1Yq2k8VOpUsBie/dysvgsY h4hGBBARAgAGBQJHWbfMAAoJEOEOegnnL3n6TYwAn2rA+SuEU9y0LUzxr55/wc6a yG+MAJ0TsyBrQBwA5tj9xg27dqvkZy+RYohGBBMRAgAGBQJHWnMlAAoJEGhrVt1g iiSbLcoAnRgf744XS2aZvXzXpdkvqJo8QDZ1AJ0aBMP918C88Tf5Nd1sEIg+t39h dohGBBARAgAGBQJHXSCAAAoJELecKLDpf4VtzC4AoNG5vj9Xz/ivXays7uOd6aqh apRBAKCMpQuXSYePOXDCEkiGG+YDtoe5mYh6BBMRAgA6BQJHXJNiMxpodHRwOi8v d3d3LmhlbnJpa25vcmRzdHJvbS5uZXQvc2lnbi1wb2xpY3ktMjAwNi0xMAAKCRDn XpDAOcwz24k0AJ9w0cJxnrwcMg54QvEMBVRyzo6F7QCdFuoMj3ByIWu9jc0GFN/l mtaunTmIRgQQEQIABgUCR10fzgAKCRDxukwe0ci6jyVQAJ9HJNsQX1RMDlyAL2H4 qLUwAMwLBQCgoJh3gK9IlKwumCAmrFEaHnFaCYGIRgQQEQIABgUCR12FRAAKCRCF BltZ1S3Rp+JpAKCVJ804T2GWfoudSI5lwDU6q+8rNQCfaQ5ZQTVuknSdPx/3yt6P THWvz6uIRgQQEQIABgUCR1wL0gAKCRDtvx4RJvIkuBPaAJoCJkH84G+jEOHa1esT tRaxpD9oOACgrPWwsOEz4bI7qFSy8JzoMxOvhD2IRgQTEQIABgUCR17k3gAKCRCF wiflpVc48tQkAJ9da/TKCdBij+Pm93rPUpp2Rslq9wCgpxkJ5YNrYCawocyfaQPe xsHZKLKI+wQTAQIARQIbAwQLBwMCAxUCAwMWAgECHgECF4AiGGRuczpzaW1vbi5q b3NlZnNzb24ub3JnP3R5cGU9Q0VSVAUCRdXVWAUJC5P8LQAKCRDtoh6UtWVxb+g0 BPsGdj6i1tbGnqe5fZopOeeZdWxVdLUNYVcs+mUbACnpvat2Wubyl2PUGxev0niY tME90aZwmrti3tKvD2j8tveP0upxlgEhA/XTyhQw5CgMCDGDGWf0RLQK5xEBsWuu N4gV5n1Yzdx6ijieZwNJfE4dOLOM4OCPkaaE29Ji0TVX/BnESBPWz3W/R00FjDdc /l14eBO5OlmyQV/zAKT+R0tBiEYEEBECAAYFAkhEuXgACgkQUCxPKZafKh3VQACf Z4TvFfZObRwlO4YzzrL8NOBgRY4AnAtBNv5Ga2Ou5KluhzgdD4cc/hP2iEYEEhEC AAYFAkhZbysACgkQJNMr+aqVw0kuhgCeNPeCzZhmsiNdL5etbxUZzVbTXe4AoKim F9wyQGMYF0eQNQ1a8Nx7q4YmiQGgBBABAgAGBQJJBr85AAoJECnuWLmWhlFxEi8M IKg/RbKdVmffG2ZlujO/WqRbQ7ZaMN1HkrGze2LfW8rkehV/5DKKLRT0BH84nbpF yOPVM4FHv3vm82fh0yDDnx6ewFlGgGc7ovmLjHDltI78OytEFmKt/O7SM3vjytz1 //Xt9rtlaWDrhA2tnMEQ39xA7ArxtypRywhc5103Fun+51ZUSgGGzJlkUKam8/kA 8b6D0U+x3ZwZcBzLfBW+P6gnec2vZEogPxxukYPrtLbRE2ZrUG0U1RubUXu76fn4 turIB3aZ4vFdCY3al/xBIkg6J5lW1dzRc+vY8Tf9pn3/gKxygE61Im07/b8pAKLJ BEcuomzIn+lWS4np3O4h6HrVOFSQW//4xK55iU7F9nVmpQAwmj291Sl7Kswp0sf4 NDJ5zuo4iDFoRUKjvtecG7s1dRBT10Damkqvq1PICsQN650oThQaDw+VDimL1hVR wOUdzUIz+AkK5SRzP6De3nhuYxMpSbxpxCOQuYGP5bUhB23RjgJwWeqr24RIZGqb END9otGIRQQQEQIABgUCSWcljwAKCRBHOOohZXSZeiUYAJdfCtm1Aij3dVLTBpyI S1lk5iYrAJ4qXN9eQAJwFC28VZguU+VVCPg2z7irBDzVB3sBBQDY9NqhPxE2QUOV ftQI4H29pEXGtf503uXpA747QyDt1V2Mi0SdppiQn6vgtd5wjjseiCxQYTFF0NgZ PQOrtpnwaQLhQo9dzerYpZDeJvfCPeqcIabchf8jbj3J1gsDNDJaoxbT3AsHm/GE +LjKN63gVMZaa1hSUbMNvv7pVmKVhFO3LS+EUXhxVeU7ZH6+A/EUy9RzujxYYOdD eLJYCLORAAYpiMUEGAECAA8CGwwFAkhh+S0FCQ0Yc7IACgkQ7aIelLVlcW9LSAUA nPC0ji8ajhdj4yW3ZRChT+H7hxPdp3id0Xzhuem/DiWT3a6eeQeSadpByGF1H0Ta mT7buYfQgLsa9YkxRIf95jNPWCJkrg8lOaKfAO0+piehqCFly1jvHJ4nZ2hcdhtQ q5C/JRPygfPJoUhcnbEfR09WekY/HXhC5XF5s2+PRK+RvFtqhpxCO+0hbCCTQZum 0QlrJUwh5bu/cJ003Dza17iOBEQcLesBBADmhtD1sFupeGfp1H+G37V8mngf47Bs BS93RI+3mZjNdq9Mx4+yYUCWvW12SLD2EbaBiKColY2e0K9qG8LS8kEZfyPSy+K/ vBUW28YbQhe4Dn3g7T/Q18JrNNyWPk9vVhOlnQQ9trXTW2xYCAHPXGVgHs4fDwz9 AaymqwCu36twBQAgzc7kYYjFBBgBAgAPAhsgBQJGin6LBQkDXUaFAAoJEO2iHpS1 ZXFvaq0FAKnvHI9bxEJtNFmWwq7gBDGXv9TrioNx3wCETQ6n6V8JIO4vV8XydmA1 ujPSHY/7Ptw99+SZ25NQqGBuE98STKODH6EVyXGAvha66dzJTYHQDCG0EO+esDzO fvrISFa37JfFl0Ju9SaHqnwTxrYxvo/Sd3alC8vJARd7IzuZoSZXZNBYz9RPbC8o bTsEEmR1IcrP2IPtOXX7sViW37sU/w64jgREHC7SAQQArB4IoJfse8rCqRNkVzYm btxvzzrtyl3LrluNgS7N4rTOLgCQeUJ8lgqEr2h3KEZ8PjGBWNYww3rj/MnX64jv /Ybq9XxJc/vkFBRYT1ISqGszeFc3P0KTXnVahF5xG4MaQ6mhy4PgMq3/NETdPH+T J+I3OL//KOa0MpGjwmtnGrsAILXz8IeJAZIEGAECAA8CGwIFAkaKfpsFCQNdRZ4A 18ALIAQZAQIANAUCRPM4Ey0UgAAAAAAVAA9wa2EtYWRkcmVzc0BnbnVwZy5vcmdq YXNAZXh0dW5kby5jb20ACgkQpycTyKq7H3t8KAP/YWnPIkW4kfAWU5E93P/0R9DH a1ly7zP3JWbpm7Lxe+2ESOJwPn3GWSn3h+Ty+3UhOIsqIEM0ISQ+SPAG/ltaghcT /XUWnUtolcb6YUVBcjQt58wpxRWZwEfwQR58aTfJHBDDHXWTq58N9YoalwTCFSvi F/UzyHAysp3dBje77/AJEO2iHpS1ZXFvxkgE/3SuuiloOcwou8I1zZ/5n4T7Bx0l BZ8Q42Ct1t99+U4zhC4WJ83ESQPdvAhk7Y2urmuINQYn+tFN+NzVfNPT2hiFNflq 1+AzkZwO3lqh3OakC+LVeFSEmPxrgyXBisELaB8W4Kk90tklUcmI6DS5NCVSHk/W 2l/cMJurV9JuZ/ILLZmjWS01ruDRD6gze8EnpFUZ7In5jgDM/YRLIphINq+4jgRE HC8JAQQAxCLemYxwWqGwXBUqMX74GTQULkvtSc82sXWixyrhPNyaxYKuAvlKO0nk XGEAwS/YMC4m+gJ7iTiskG9iWPfoXPK5S81AjRX7NA8B34BAb5rJbW2eHypOLQ99 MUUBYzuNLLqpwBZTeumoaz7DgoIHNpMpD4x/Irw1mX83xNhQ6F8AIKatOU2IxQQY AQIADwIbDAUCRop+pAUJA11FZwAKCRDtoh6UtWVxbzeQBP9/43ouNUZ9/pT8lKzv d15XHdZ2Kp9Brx2SmerUdDTZbETd3T/eSHAQxJcrwRXeCJg/O//8ZmTg2G/+hf9S jD/OfCkZKVVe1sm1T7nErj9jWlO8+OuWryWE5eCLJb5W3Yk7WDdoeUcj3pKtFyml DFlI0Sq4scHvyb6LPLxXzbb4ViyjXTH0eIh7rQ1SlWOF0fwQzb0Sk+LPRDJ8VX+Q YY0j =o98p -----END PGP PUBLIC KEY BLOCK----- ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/examples/0000755000000000000000000000000012126773324011575 500000000000000shishi-1.0.2/examples/client-cksum.c0000664000000000000000000001304512126660507014262 00000000000000/* client-cksum.c --- Sample Shishi authenticated client, with checksum data. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include #include #include #include #define SERVICE "sample" /* XXX remove this */ const char *program_name = "client"; static int doit (Shishi * handle, Shishi_ap * ap, int verbose) { char line[BUFSIZ]; #if 0 /* XXX Unfinished application-level security */ res = shishi_safe (handle, &safe); if (res != SHISHI_OK) { printf ("Could not build SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_set_user_data (handle, shishi_safe_safe (safe), "foo", 0); if (res != SHISHI_OK) { printf ("Could not set application data in SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_build (safe, key); if (res != SHISHI_OK) { printf ("Could not build SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_print (handle, stdout, shishi_safe_safe (safe)); if (res != SHISHI_OK) { printf ("Could not print SAFE: %s\n", shishi_strerror (res)); return res; } #endif printf ("Application exchange start. Press ^D to finish.\n"); while (fgets (line, sizeof (line), stdin)) { printf ("read: %s", line); } if (ferror (stdin)) { printf ("error reading stdin\n"); return 1; } return 0; } static Shishi_ap * auth (Shishi * h, int verbose, const char *cname, const char *sname) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return NULL; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return NULL; } /* Add checksum of some application data to the AP. * * Note that only a pointer to this memory area is stored in the AP, * so you MUST keep it allocated, at least until * shishi_ap_req_build(ap) is finished. This might be changed in * the future, probably by copying the data into the AP. */ shishi_ap_authenticator_cksumdata_set (ap, "attack at dawn", strlen ("attack at dawn")); /* Build Authentication request */ rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* Authentication ourself to server */ shishi_apreq_print (h, stdout, shishi_ap_req (ap)); /* Note: to get the binary blob to send, use: * * char *out; int outlen; * ... * rc = shishi_ap_req_der (ap, &out, &outlen); * ... * write(fd, out, outlen); */ /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { Shishi_asn1 aprep; printf ("Waiting for server to authenticate itself...\n"); rc = shishi_aprep_parse (h, stdin, &aprep); if (rc != SHISHI_OK) { printf ("Cannot parse AP-REP from server: %s\n", shishi_strerror (rc)); return NULL; } rc = shishi_ap_rep_verify_asn1 (ap, aprep); if (rc == SHISHI_OK) printf ("AP-REP verification OK...\n"); else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return NULL; } /* The server is authenticated. */ printf ("Server authenticated.\n"); } /* We are now authenticated. */ printf ("User authenticated.\n"); return ap; } int main (int argc, char *argv[]) { Shishi *h; Shishi_ap *ap; char *sname; int rc; printf ("sample-client (shishi " SHISHI_VERSION ")\n"); if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } if (argc > 1) sname = argv[1]; else sname = shishi_server_for_local_service (h, SERVICE); ap = auth (h, 1, shishi_principal_default (h), sname); if (ap) rc = doit (h, ap, 1); else rc = 1; shishi_done (h); return rc; } shishi-1.0.2/examples/server.c0000664000000000000000000001300112126660507013162 00000000000000/* server.c --- Sample server with authentication using Shishi. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include #include #include #define SERVICE "sample" /* XXX remove this */ const char *program_name = "client"; static int doit (Shishi * h, Shishi_ap * ap, int verbose) { Shishi_asn1 asn1safe; Shishi_safe *safe; char *userdata; size_t userdatalen; int res; printf ("Application exchange start. Press ^D to finish.\n"); while ((res = shishi_safe_parse (h, stdin, &asn1safe)) == SHISHI_OK) { if (res != SHISHI_OK) { fprintf (stderr, "Could not read SAFE:\n%s\n%s\n", shishi_strerror (res), shishi_error (h)); return 1; } res = shishi_safe (h, &safe); if (res != SHISHI_OK) { fprintf (stderr, "Could not create SAFE:\n%s\n%s\n", shishi_strerror (res), shishi_error (h)); return 1; } shishi_safe_safe_set (safe, asn1safe); res = shishi_safe_verify (safe, shishi_ap_key (ap)); if (res != SHISHI_OK) { fprintf (stderr, "Could not verify SAFE:\n%s\n%s\n", shishi_strerror (res), shishi_error (h)); return 1; } printf ("Verified SAFE successfully...\n"); res = shishi_safe_user_data (h, asn1safe, &userdata, &userdatalen); if (res != SHISHI_OK) { fprintf (stderr, "Could not extract user data:\n%s\n%s\n", shishi_strerror (res), shishi_error (h)); return 1; } userdata[userdatalen] = '\0'; printf ("user data: `%s'\n", userdata); } if (ferror (stdin)) { printf ("error reading stdin\n"); return 1; } return 0; } static Shishi_ap * auth (Shishi * h, int verbose, const char *cname, const char *sname) { Shishi_key *key; Shishi_ap *ap; Shishi_asn1 apreq; char *buf; size_t buflen; int rc; printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); /* Get key for the server. */ key = shishi_hostkeys_for_server (h, sname); if (!key) { printf ("could not find key: %s\n", shishi_error (h)); return NULL; } if (verbose) shishi_key_print (h, stderr, key); /* Read Authentication request from client */ printf ("Waiting for client to authenticate itself...\n"); rc = shishi_apreq_parse (h, stdin, &apreq); if (rc != SHISHI_OK) { printf ("could not read AP-REQ: %s\n", shishi_strerror (rc)); return NULL; } /* Create Authentication context */ rc = shishi_ap (h, &ap); if (rc != SHISHI_OK) { printf ("Could not create AP: %s\n", shishi_strerror (rc)); return NULL; } /* Store request in context */ shishi_ap_req_set (ap, apreq); /* Process authentication request */ rc = shishi_ap_req_process (ap, key); if (rc != SHISHI_OK) { printf ("Could not process AP-REQ: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); rc = shishi_authenticator_client (h, shishi_ap_authenticator (ap), &buf, &buflen); printf ("Client name (from authenticator): %.*s\n", buflen, buf); free (buf); rc = shishi_encticketpart_clientrealm (h, shishi_tkt_encticketpart (shishi_ap_tkt (ap)), &buf, &buflen); printf ("Client name (from encticketpart): %.*s\n", buflen, buf); free (buf); rc = shishi_ticket_server (h, shishi_tkt_ticket (shishi_ap_tkt (ap)), &buf, &buflen); printf ("Server name (from ticket): %.*s\n", buflen, buf); free (buf); /* User is authenticated. */ printf ("User authenticated.\n"); /* Authenticate ourself to client, if request */ if (shishi_apreq_mutual_required_p (h, apreq)) { Shishi_asn1 aprep; printf ("Mutual authentication required.\n"); rc = shishi_ap_rep_asn1 (ap, &aprep); if (rc != SHISHI_OK) { printf ("Error creating AP-REP: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_encapreppart_print (h, stderr, shishi_ap_encapreppart (ap)); shishi_aprep_print (h, stdout, aprep); /* We are authenticated to client */ } return ap; } int main (int argc, char *argv[]) { Shishi *h; Shishi_ap *ap; char *sname; int rc; printf ("sample-server (shishi " SHISHI_VERSION ")\n"); if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init_server (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } if (argc > 1) sname = argv[1]; else sname = shishi_server_for_local_service (h, SERVICE); ap = auth (h, 1, shishi_principal_default (h), sname); if (ap) rc = doit (h, ap, 1); else rc = 1; shishi_done (h); return rc; } shishi-1.0.2/examples/client-priv.c0000664000000000000000000001236312126660507014122 00000000000000/* client-priv.c --- Sample Shishi authenticated client, with privacy * protected application data exchange. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include #include #include #include #define SERVICE "sample" /* XXX remove this */ const char *program_name = "client"; static int doit (Shishi * handle, Shishi_ap * ap, int verbose) { char line[BUFSIZ]; int res; printf ("Application exchange start. Press ^D to finish.\n"); while (fgets (line, sizeof (line), stdin)) { Shishi_priv *priv; line[strlen (line) - 1] = '\0'; printf ("read: %s\n", line); res = shishi_priv (handle, &priv); if (res != SHISHI_OK) { printf ("Could not build PRIV: %s\n", shishi_strerror (res)); return res; } res = shishi_encprivpart_set_user_data (handle, shishi_priv_encprivpart (priv), line, strlen (line)); if (res != SHISHI_OK) { printf ("Could not set application data in PRIV: %s\n", shishi_strerror (res)); return res; } res = shishi_priv_build (priv, shishi_ap_key (ap)); if (res != SHISHI_OK) { printf ("Could not build PRIV: %s\n", shishi_strerror (res)); return res; } res = shishi_priv_print (handle, stdout, shishi_priv_priv (priv)); if (res != SHISHI_OK) { printf ("Could not print PRIV: %s\n", shishi_strerror (res)); return res; } } if (ferror (stdin)) { printf ("error reading stdin\n"); return 1; } return 0; } static Shishi_ap * auth (Shishi * h, int verbose, const char *cname, const char *sname) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return NULL; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return NULL; } /* Build Authentication request */ rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* Authentication ourself to server */ shishi_apreq_print (h, stdout, shishi_ap_req (ap)); /* Note: to get the binary blob to send, use: * * char *out; int outlen; * ... * rc = shishi_ap_req_der (ap, &out, &outlen); * ... * write(fd, out, outlen); */ /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { Shishi_asn1 aprep; printf ("Waiting for server to authenticate itself...\n"); rc = shishi_aprep_parse (h, stdin, &aprep); if (rc != SHISHI_OK) { printf ("Cannot parse AP-REP from server: %s\n", shishi_strerror (rc)); return NULL; } rc = shishi_ap_rep_verify_asn1 (ap, aprep); if (rc == SHISHI_OK) printf ("AP-REP verification OK...\n"); else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return NULL; } /* The server is authenticated. */ printf ("Server authenticated.\n"); } /* We are now authenticated. */ printf ("User authenticated.\n"); return ap; } int main (int argc, char *argv[]) { Shishi *h; Shishi_ap *ap; char *sname; int rc; printf ("sample-client (shishi " SHISHI_VERSION ")\n"); if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } if (argc > 1) sname = argv[1]; else sname = shishi_server_for_local_service (h, SERVICE); ap = auth (h, 1, shishi_principal_default (h), sname); if (ap) rc = doit (h, ap, 1); else rc = 1; shishi_done (h); return rc; } shishi-1.0.2/examples/client.c0000664000000000000000000001003012126660507013131 00000000000000/* client.c --- Sample client with authentication using Shishi. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include #include #include #include #define SERVICE "sample" /* XXX remove this */ const char *program_name = "client"; static Shishi_ap * auth (Shishi * h, int verbose, const char *cname, const char *sname) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return NULL; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return NULL; } /* Build Authentication request */ rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* Authentication ourself to server */ shishi_apreq_print (h, stdout, shishi_ap_req (ap)); /* Note: to get the binary blob to send, use: * * char *out; int outlen; * ... * rc = shishi_ap_req_der (ap, &out, &outlen); * ... * write(fd, out, outlen); */ /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { Shishi_asn1 aprep; printf ("Cut'n'paste AP-REP from server...\n"); rc = shishi_aprep_parse (h, stdin, &aprep); if (rc != SHISHI_OK) { printf ("Cannot parse AP-REP from server: %s\n", shishi_strerror (rc)); return NULL; } rc = shishi_ap_rep_verify_asn1 (ap, aprep); if (rc == SHISHI_OK) printf ("AP-REP verification OK...\n"); else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return NULL; } /* The server is authenticated. */ printf ("Server authenticated.\n"); } /* We are now authenticated. */ printf ("User authenticated.\n"); return ap; } int main (int argc, char *argv[]) { Shishi *h; Shishi_ap *ap; char *sname; int rc; printf ("sample-client (shishi " SHISHI_VERSION ")\n"); if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } if (argc > 1) sname = argv[1]; else sname = shishi_server_for_local_service (h, SERVICE); ap = auth (h, 1, shishi_principal_default (h), sname); if (ap) { printf ("Authentication done...\n"); rc = 0; } else rc = 1; shishi_done (h); return rc; } shishi-1.0.2/examples/Makefile.am0000644000000000000000000000220612126663322013545 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/lib -I$(top_builddir)/gl -I$(top_builddir)/lib LDADD = ../gl/libgnu.la ../lib/libshishi.la @LTLIBINTL@ noinst_PROGRAMS = client client-cksum client-safe client-priv \ server indent: indent $(SOURCES) shishi-1.0.2/examples/client-safe.c0000664000000000000000000001233312126660507014055 00000000000000/* client-safe.c --- Sample Shishi authenticated client with integrity * protected application data exchange. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include #include #include #include #define SERVICE "sample" /* XXX remove this */ const char *program_name = "client"; static int doit (Shishi * handle, Shishi_ap * ap, int verbose) { char line[BUFSIZ]; int res; printf ("Application exchange start. Press ^D to finish.\n"); while (fgets (line, sizeof (line), stdin)) { Shishi_safe *safe; line[strlen (line) - 1] = '\0'; printf ("read: %s\n", line); res = shishi_safe (handle, &safe); if (res != SHISHI_OK) { printf ("Could not build SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_set_user_data (handle, shishi_safe_safe (safe), line, strlen (line)); if (res != SHISHI_OK) { printf ("Could not set application data in SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_build (safe, shishi_ap_key (ap)); if (res != SHISHI_OK) { printf ("Could not build SAFE: %s\n", shishi_strerror (res)); return res; } res = shishi_safe_print (handle, stdout, shishi_safe_safe (safe)); if (res != SHISHI_OK) { printf ("Could not print SAFE: %s\n", shishi_strerror (res)); return res; } } if (ferror (stdin)) { printf ("error reading stdin\n"); return 1; } return 0; } static Shishi_ap * auth (Shishi * h, int verbose, const char *cname, const char *sname) { Shishi_ap *ap; Shishi_tkt *tkt; Shishi_tkts_hint hint; int rc; printf ("Client: %s\n", cname); printf ("Server: %s\n", sname); /* Get a ticket for the server. */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) cname; hint.server = (char *) sname; tkt = shishi_tkts_get (shishi_tkts_default (h), &hint); if (!tkt) { printf ("cannot find ticket for \"%s\"\n", sname); return NULL; } if (verbose) shishi_tkt_pretty_print (tkt, stderr); /* Create Authentication context */ rc = shishi_ap_tktoptions (h, &ap, tkt, SHISHI_APOPTIONS_MUTUAL_REQUIRED); if (rc != SHISHI_OK) { printf ("cannot create authentication context\n"); return NULL; } /* Build Authentication request */ rc = shishi_ap_req_build (ap); if (rc != SHISHI_OK) { printf ("cannot build authentication request: %s\n", shishi_strerror (rc)); return NULL; } if (verbose) shishi_authenticator_print (h, stderr, shishi_ap_authenticator (ap)); /* Authentication ourself to server */ shishi_apreq_print (h, stdout, shishi_ap_req (ap)); /* Note: to get the binary blob to send, use: * * char *out; int outlen; * ... * rc = shishi_ap_req_der (ap, &out, &outlen); * ... * write(fd, out, outlen); */ /* For mutual authentication, wait for server reply. */ if (shishi_apreq_mutual_required_p (h, shishi_ap_req (ap))) { Shishi_asn1 aprep; printf ("Waiting for server to authenticate itself...\n"); rc = shishi_aprep_parse (h, stdin, &aprep); if (rc != SHISHI_OK) { printf ("Cannot parse AP-REP from server: %s\n", shishi_strerror (rc)); return NULL; } rc = shishi_ap_rep_verify_asn1 (ap, aprep); if (rc == SHISHI_OK) printf ("AP-REP verification OK...\n"); else { if (rc == SHISHI_APREP_VERIFY_FAILED) printf ("AP-REP verification failed...\n"); else printf ("AP-REP verification error: %s\n", shishi_strerror (rc)); return NULL; } /* The server is authenticated. */ printf ("Server authenticated.\n"); } /* We are now authenticated. */ printf ("User authenticated.\n"); return ap; } int main (int argc, char *argv[]) { Shishi *h; Shishi_ap *ap; char *sname; int rc; printf ("sample-client (shishi " SHISHI_VERSION ")\n"); if (!shishi_check_version (SHISHI_VERSION)) { printf ("shishi_check_version() failed:\n" "Header file incompatible with shared library.\n"); return 1; } rc = shishi_init (&h); if (rc != SHISHI_OK) { printf ("error initializing shishi: %s\n", shishi_strerror (rc)); return 1; } if (argc > 1) sname = argv[1]; else sname = shishi_server_for_local_service (h, SERVICE); ap = auth (h, 1, shishi_principal_default (h), sname); if (ap) rc = doit (h, ap, 1); else rc = 1; shishi_done (h); return rc; } shishi-1.0.2/examples/Makefile.in0000644000000000000000000014607112126772724013576 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = client$(EXEEXT) client-cksum$(EXEEXT) \ client-safe$(EXEEXT) client-priv$(EXEEXT) server$(EXEEXT) subdir = examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) client_SOURCES = client.c client_OBJECTS = client.$(OBJEXT) client_LDADD = $(LDADD) client_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent client_cksum_SOURCES = client-cksum.c client_cksum_OBJECTS = client-cksum.$(OBJEXT) client_cksum_LDADD = $(LDADD) client_cksum_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la client_priv_SOURCES = client-priv.c client_priv_OBJECTS = client-priv.$(OBJEXT) client_priv_LDADD = $(LDADD) client_priv_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la client_safe_SOURCES = client-safe.c client_safe_OBJECTS = client-safe.$(OBJEXT) client_safe_LDADD = $(LDADD) client_safe_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la server_SOURCES = server.c server_OBJECTS = server.$(OBJEXT) server_LDADD = $(LDADD) server_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = client.c client-cksum.c client-priv.c client-safe.c server.c DIST_SOURCES = client.c client-cksum.c client-priv.c client-safe.c \ server.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/lib -I$(top_builddir)/gl -I$(top_builddir)/lib LDADD = ../gl/libgnu.la ../lib/libshishi.la @LTLIBINTL@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list client$(EXEEXT): $(client_OBJECTS) $(client_DEPENDENCIES) $(EXTRA_client_DEPENDENCIES) @rm -f client$(EXEEXT) $(AM_V_CCLD)$(LINK) $(client_OBJECTS) $(client_LDADD) $(LIBS) client-cksum$(EXEEXT): $(client_cksum_OBJECTS) $(client_cksum_DEPENDENCIES) $(EXTRA_client_cksum_DEPENDENCIES) @rm -f client-cksum$(EXEEXT) $(AM_V_CCLD)$(LINK) $(client_cksum_OBJECTS) $(client_cksum_LDADD) $(LIBS) client-priv$(EXEEXT): $(client_priv_OBJECTS) $(client_priv_DEPENDENCIES) $(EXTRA_client_priv_DEPENDENCIES) @rm -f client-priv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(client_priv_OBJECTS) $(client_priv_LDADD) $(LIBS) client-safe$(EXEEXT): $(client_safe_OBJECTS) $(client_safe_DEPENDENCIES) $(EXTRA_client_safe_DEPENDENCIES) @rm -f client-safe$(EXEEXT) $(AM_V_CCLD)$(LINK) $(client_safe_OBJECTS) $(client_safe_LDADD) $(LIBS) server$(EXEEXT): $(server_OBJECTS) $(server_DEPENDENCIES) $(EXTRA_server_DEPENDENCIES) @rm -f server$(EXEEXT) $(AM_V_CCLD)$(LINK) $(server_OBJECTS) $(server_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client-cksum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client-priv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client-safe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am indent: indent $(SOURCES) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/tests/0000755000000000000000000000000012126773313011117 500000000000000shishi-1.0.2/tests/shisa.sh0000775000000000000000000003311512126660507012512 00000000000000#!/bin/sh # Copyright (C) 2003-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SHISA=$PWD/../src/shisa DBDIR=shisa.db.tmp.$$ OUT=$DBDIR/out ERR=$DBDIR/err CONF=$DBDIR/conf if test -n "$VERBOSE"; then set -x fi mkdir $DBDIR if test ! -d $DBDIR; then echo Cannot create $DBDIR exit 1 fi trap "rm -rf $DBDIR" EXIT echo "db file $DBDIR" > $CONF if test ! -f $CONF; then echo Cannot create $CONF exit 1 fi if test ! -f $SHISA; then echo Cannot find $SHISA exit 1 fi echo Dump empty database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add realm. out=`$SHISA -c $CONF -a TESTREALM` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding realm \`TESTREALM'... Adding realm \`TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo List database. out=`$SHISA -c $CONF -l` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add realm. out=`$SHISA -c $CONF -a TESTREALM2` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding realm \`TESTREALM2'... Adding realm \`TESTREALM2'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM TESTREALM2" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove realm. out=`$SHISA -c $CONF -r TESTREALM2` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing realm \`TESTREALM2'... Removing realm \`TESTREALM2'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add principal. out=`$SHISA -c $CONF -a TESTREALM test/principal` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding principal \`test/principal@TESTREALM'... Adding principal \`test/principal@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add second principal. out=`$SHISA -c $CONF -a TESTREALM test/principal2` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding principal \`test/principal2@TESTREALM'... Adding principal \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add third principal. out=`$SHISA -c $CONF -a TESTREALM test/principal3` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding principal \`test/principal3@TESTREALM'... Adding principal \`test/principal3@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add third principal again. out=`$SHISA -c $CONF -a TESTREALM test/principal3 2>&1` if test $? != 1; then echo rc $? exit 1 fi echo Remove second principal. out=`$SHISA -c $CONF -r TESTREALM test/principal2` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing principal \`test/principal2@TESTREALM'... Removing principal \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal3 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Tring to remove entire realm. out=`$SHISA -c $CONF -r TESTREALM 2>&1` if test $? != 1; then echo rc $? exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal3 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add principal with des key and password. out=`$SHISA -c $CONF -a TESTREALM test/principal2 -E des --password=foo --keys` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding principal \`test/principal2@TESTREALM'... -----BEGIN SHISHI KEY----- Keytype: 3 (des-cbc-md5) Principal: test/principal2 Realm: TESTREALM s3WXrcITWPE= -----END SHISHI KEY----- Adding principal \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add aes key with password to principal. out=`$SHISA -c $CONF -n TESTREALM test/principal2 -E aes --password=foo --keys` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding key to \`test/principal2@TESTREALM'... -----BEGIN SHISHI KEY----- Keytype: 18 (aes256-cts-hmac-sha1-96) Principal: test/principal2 Realm: TESTREALM 3XpVlkzCS2gGYbaShDQktrmYVkcqvMIMuJKLxq9a6oU= -----END SHISHI KEY----- Adding key to \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des-cbc-md5 (0x3, 3). Key 1 (0x1). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal3 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add 3des key with password to principal. out=`$SHISA -c $CONF -n TESTREALM test/principal2 -E des3 --password=foo --keys` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding key to \`test/principal2@TESTREALM'... -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: test/principal2 Realm: TESTREALM nXV/NLyMwgSunRZATGitesFP466wyGfZ -----END SHISHI KEY----- Adding key to \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18). test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des-cbc-md5 (0x3, 3). Key 1 (0x1). Etype aes256-cts-hmac-sha1-96 (0x12, 18). Key 2 (0x2). Etype des3-cbc-sha1-kd (0x10, 16). test/principal3 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype aes256-cts-hmac-sha1-96 (0x12, 18)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove first principal. out=`$SHISA -c $CONF -r TESTREALM test/principal` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing principal \`test/principal@TESTREALM'... Removing principal \`test/principal@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove third principal. out=`$SHISA -c $CONF -r TESTREALM test/principal3` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing principal \`test/principal3@TESTREALM'... Removing principal \`test/principal3@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove aes key on second principal. out=`$SHISA -c $CONF --key-remove TESTREALM test/principal2 -E aes` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing key from \`test/principal2@TESTREALM'... Removing key from \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des-cbc-md5 (0x3, 3). Key 1 (0x1). Etype des3-cbc-sha1-kd (0x10, 16)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Add 3des key with password to principal. out=`$SHISA -c $CONF -n TESTREALM test/principal2 -E des3 --password=bar --keys` if test $? != 0; then echo rc $? exit 1 fi expectout="Adding key to \`test/principal2@TESTREALM'... -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: test/principal2 Realm: TESTREALM wb9SbVsgCEmttWiFikwvGQLj5YZ2NFja -----END SHISHI KEY----- Adding key to \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d --keys` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des-cbc-md5 (0x3, 3). -----BEGIN SHISHI KEY----- Keytype: 3 (des-cbc-md5) Principal: test/principal2 Realm: TESTREALM s3WXrcITWPE= -----END SHISHI KEY----- Password foo. Key 1 (0x1). Etype des3-cbc-sha1-kd (0x10, 16). -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: test/principal2 Realm: TESTREALM wb9SbVsgCEmttWiFikwvGQLj5YZ2NFja -----END SHISHI KEY----- Password bar. Key 2 (0x2). Etype des3-cbc-sha1-kd (0x10, 16). -----BEGIN SHISHI KEY----- Keytype: 16 (des3-cbc-sha1-kd) Principal: test/principal2 Realm: TESTREALM nXV/NLyMwgSunRZATGitesFP466wyGfZ -----END SHISHI KEY----- Password foo." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove 3des key with password 'bar' on second principal. out=`$SHISA -c $CONF --key-remove TESTREALM test/principal2 -E des3 --password=bar` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing key from \`test/principal2@TESTREALM'... Removing key from \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Remove 3des key with password 'foo' on second principal. out=`$SHISA -c $CONF --key-remove TESTREALM test/principal2 -E des3 --password=foo` if test $? != 0; then echo rc $? exit 1 fi expectout="Removing key from \`test/principal2@TESTREALM'... Removing key from \`test/principal2@TESTREALM'...done" if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Dump database. out=`$SHISA -c $CONF -d` if test $? != 0; then echo rc $? exit 1 fi expectout="TESTREALM test/principal2 Account is enabled. Current key version 0 (0x0). Key 0 (0x0). Etype des-cbc-md5 (0x3, 3)." if test "$out" != "$expectout"; then echo expected: $expectout >&2 echo -----got: $out >&2 exit 1 fi echo Tests finished exit 0 shishi-1.0.2/tests/priv.c0000664000000000000000000001147612126660507012176 00000000000000/* priv.c --- Shishi PRIV self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" void test (Shishi * handle) { Shishi_priv *priv; Shishi_key *key; Shishi_asn1 asn1priv; Shishi_asn1 asn1encprivpart; char *p, *q; size_t l, m; int32_t t; int res; if (debug) shishi_cfg (handle, strdup ("verbose-crypto")); /* shishi_priv() */ res = shishi_priv (handle, &priv); if (debug) printf ("shishi_priv () => `%p'.\n", priv); if (res == SHISHI_OK) success ("shishi_priv() OK\n"); else fail ("shishi_priv() failed\n"); /* shishi_priv_key */ key = shishi_priv_key (priv); if (key) success ("shishi_priv_key() OK\n"); else fail ("shishi_priv_key() failed\n"); /* shishi_priv_priv */ asn1priv = shishi_priv_priv (priv); if (asn1priv) success ("shishi_priv_priv() OK\n"); else fail ("shishi_priv_priv() failed\n"); /* shishi_priv_encprivpart */ asn1encprivpart = shishi_priv_encprivpart (priv); if (asn1encprivpart) success ("shishi_priv_encprivpart() OK\n"); else fail ("shishi_priv_encprivpart() failed\n"); /* shishi_encprivpart_set_user_data */ res = shishi_encprivpart_set_user_data (handle, asn1encprivpart, "foo", 3); if (res == SHISHI_OK) success ("shishi_encprivpart_set_user_data() OK\n"); else fail ("shishi_encprivpart_set_user_data() failed (%d)\n", res); /* shishi_encprivpart_user_data */ res = shishi_encprivpart_user_data (handle, asn1encprivpart, &p, &l); if (debug) escapeprint (p, l); if (res == SHISHI_OK && l == 3 && memcmp (p, "foo", 3) == 0) success ("shishi_encprivpart_user_data() OK\n"); else fail ("shishi_encprivpart_user_data() failed (%d)\n", res); free (p); /* shishi_priv_set_cksum */ res = shishi_priv_set_enc_part (handle, asn1priv, 42, "bar", 3); if (res == SHISHI_OK) success ("shishi_priv_set_enc_part() OK\n"); else fail ("shishi_priv_set_enc_part() failed (%d)\n", res); /* shishi_priv_enc_part_etype */ res = shishi_priv_enc_part_etype (handle, asn1priv, &t); if (debug) printf ("type=%d\n", t); if (res == SHISHI_OK && t == 42) success ("shishi_priv_enc_part_etype() OK\n"); else fail ("shishi_priv_enc_part_etype() failed (%d)\n", res); /* shishi_priv_process */ res = shishi_priv_process (priv, key); if (res == SHISHI_PRIV_BAD_KEYTYPE) /* t==42 unsupported etype */ success ("shishi_priv_proces() OK\n"); else fail ("shishi_priv_process() failed (%d)\n", res); /* shishi_priv_priv_der() */ res = shishi_priv_priv_der (priv, &p, &l); if (res == SHISHI_OK) success ("shishi_priv_priv_der() OK\n"); else fail ("shishi_priv_priv_der() failed\n"); /* shishi_priv_to_file() */ res = shishi_priv_to_file (handle, asn1priv, SHISHI_FILETYPE_TEXT, "priv.tmp"); if (res == SHISHI_OK) success ("shishi_priv_to_file() OK\n"); else fail ("shishi_priv_to_file() failed\n"); /* shishi_priv_done() */ shishi_priv_done (priv); success ("shishi_priv_done() OK\n"); /* shishi_authenticator_from_file() */ asn1priv = NULL; res = shishi_priv_from_file (handle, &asn1priv, SHISHI_FILETYPE_TEXT, "priv.tmp"); if (res == SHISHI_OK) success ("shishi_priv_from_file() OK\n"); else fail ("shishi_priv_from_file() failed\n"); if (debug) { /* shishi_priv_print() */ res = shishi_priv_print (handle, stdout, asn1priv); if (res == SHISHI_OK) success ("shishi_priv_print() OK\n"); else fail ("shishi_priv_print() failed\n"); } /* shishi_asn1_to_der() */ res = shishi_asn1_to_der (handle, asn1priv, &q, &m); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else fail ("shishi_asn1_to_der() failed\n"); shishi_asn1_done (handle, asn1priv); /* Compare DER encodings of authenticators */ if (l > 0 && m > 0 && l == m && memcmp (p, q, l) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (q); free (p); /* unlink() */ res = unlink ("priv.tmp"); if (res == 0) success ("unlink() OK\n"); else fail ("unlink() failed\n"); } shishi-1.0.2/tests/ccache1.bin0000664000000000000000000000157212015626624013026 00000000000000 ÿýûDOPIO.JOSEFSSON.ORGjasDOPIO.JOSEFSSON.ORGjasDOPIO.JOSEFSSON.ORGkrbtgtDOPIO.JOSEFSSON.ORG Ï{é·¤oËö£  »,ÎPÃí?°©e–"Œñ„:SaEYEYE_ØP`a‚0‚ ¡DOPIO.JOSEFSSON.ORG¢(0& ¡0krbtgtDOPIO.JOSEFSSON.ORG£Ç0Ä ¡¢·´#ɤ Lh“·3–,ø®mœ"„GÙ?;Ú>ùÑ—æ·g’ƒ½&Ëüðrªrø}?˜ÎÜ:8a€§¿NyOH8|^„m„xGÜo|§;¿Û¬ÑÐëÄ|zK–9†–¤‹Py ¡äÙtš©óÃíà£UÖˆê©5’Rÿ ÔLÞ“6‘fò‡†=`Ɖ¢?wÖ>^M·¼ÒJÈ6„+Ù6¿ÝT† ‘ Pö&ˆ¶ PDOPIO.JOSEFSSON.ORGjasDOPIO.JOSEFSSON.ORGhostdopioL’å÷¶Jh¹EYEiE_ØP(òaï0ì ¡DOPIO.JOSEFSSON.ORG¢0 ¡0 hostdopio£³0° ¡¢£ Á ÁÍ[}Q‰^…1/^ô­—bÀAðÁA‹Á`~"ÜyNZÖø[Zçr6p>LÈ-iúXWjÌê,ÁlÃÙ®(Y¸šÑ£æºk$~]¥Í™Û—¼ –?Êd×)1 ½ñR¡—÷X~¡cSnÈó€"r§<:†,9ª.Âìܨ±¹)º2GÃbÛØ%?F}™¦L]shishi-1.0.2/tests/passwdpromptcb.c0000664000000000000000000000464412126660507014265 00000000000000/* passwdpromptcb.c --- Self test the password prompt callback stuff. * Copyright (C) 2008-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" int cb_ret = 0; static int prompt_password (Shishi * handle, char **s, const char *format, va_list ap) { if (cb_ret == 0) *s = strdup ("pencil"); return cb_ret; } void test (Shishi * handle) { shishi_prompt_password_func cb; char *passwd, *save; int ret; cb = shishi_prompt_password_callback_get (handle); if (cb) fail ("callback not null: %p\n", cb); else success ("callback is null.\n"); shishi_prompt_password_callback_set (handle, prompt_password); cb = shishi_prompt_password_callback_get (handle); if (cb != prompt_password) fail ("callback not equal: %p != %p\n", cb, prompt_password); else success ("callback equal to our function.\n"); cb_ret = SHISHI_CRYPTO_ERROR; save = passwd = strdup ("foo"); ret = shishi_prompt_password (handle, &passwd, "Enter %s: ", "password"); if (ret != cb_ret) fail ("callback return mismatch: %d != %d\n", ret, cb_ret); else success ("invoke callback successfully with non-zero return\n"); if (passwd != save) fail ("callback messed with password: %s != %s\n", passwd, save); free (save); cb_ret = 0; ret = shishi_prompt_password (handle, &passwd, "Enter %s: ", "password"); if (ret != cb_ret) fail ("callback return mismatch: %d != %d\n", ret, cb_ret); else success ("invoke callback successfully with zero return code\n"); if (strcmp (passwd, "pencil") != 0) fail ("callback returned bad password: %s\n", passwd); else success ("callback returned correct password: %s\n", passwd); free (passwd); } shishi-1.0.2/tests/utils.h0000664000000000000000000000334112126660507012353 00000000000000/* utils.h --- Prototypes for self test utilities. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef UTILS_H # define UTILS_H # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include #include "base64.h" extern int debug; extern int error_count; extern int break_on_error; extern void fail (const char *format, ...) __attribute__ ((format (printf, 1, 2))); extern void success (const char *format, ...) __attribute__ ((format (printf, 1, 2))); extern void escapeprint (const char *str, size_t len); extern void hexprint (const char *str, size_t len); extern void binprint (const char *str, size_t len); /* This must be implemented elsewhere. */ extern void test (Shishi * handle); #endif /* UTILS_H */ shishi-1.0.2/tests/safe.c0000664000000000000000000001172712126660507012133 00000000000000/* safe.c --- Shishi SAFE self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" void test (Shishi * handle) { Shishi_safe *safe; Shishi_key *key; Shishi_asn1 asn1safe; char *p, *q; size_t l, m; int32_t t; int res; /* shishi_safe() */ res = shishi_safe (handle, &safe); if (debug) printf ("shishi_safe () => `%p'.\n", safe); if (res == SHISHI_OK) success ("shishi_safe() OK\n"); else fail ("shishi_safe() failed\n"); /* shishi_safe_key */ key = shishi_safe_key (safe); if (key) success ("shishi_safe_key() OK\n"); else fail ("shishi_safe_key() failed\n"); /* shishi_safe_safe */ asn1safe = shishi_safe_safe (safe); if (asn1safe) success ("shishi_safe_safe() OK\n"); else fail ("shishi_safe_safe() failed\n"); /* shishi_safe_set_user_data */ res = shishi_safe_set_user_data (handle, asn1safe, "foo", 3); if (res == SHISHI_OK) success ("shishi_safe_set_user_data() OK\n"); else fail ("shishi_safe_set_user_data() failed (%d)\n", res); /* shishi_safe_user_data */ res = shishi_safe_user_data (handle, asn1safe, &p, &l); if (debug) escapeprint (p, l); if (res == SHISHI_OK && l == 3 && memcmp (p, "foo", 3) == 0) success ("shishi_safe_user_data() OK\n"); else fail ("shishi_safe_user_data() failed (%d)\n", res); free (p); /* shishi_safe_set_cksum */ res = shishi_safe_set_cksum (handle, asn1safe, 42, "bar", 3); if (res == SHISHI_OK) success ("shishi_safe_set_cksum() OK\n"); else fail ("shishi_safe_set_cksum() failed (%d)\n", res); /* shishi_safe_cksum */ res = shishi_safe_cksum (handle, asn1safe, &t, &q, &m); if (debug) { printf ("type=%d\n", t); escapeprint (q, m); } if (res == SHISHI_OK && t == 42 && m == 3 && memcmp (q, "bar", 3) == 0) success ("shishi_safe_cksum() OK\n"); else fail ("shishi_safe_cksum() failed (%d)\n", res); free (q); /* shishi_safe_verify */ res = shishi_safe_verify (safe, key); if (res == SHISHI_CRYPTO_ERROR) /* t==42 unsupported cksumtype */ success ("shishi_safe_verify() OK\n"); else fail ("shishi_safe_verify() failed (%d)\n", res); #if WITH_DES /* shishi_safe_set_cksum */ res = shishi_safe_set_cksum (handle, asn1safe, SHISHI_RSA_MD5_DES, "bar", 3); if (res == SHISHI_OK) success ("shishi_safe_set_cksum() OK\n"); else fail ("shishi_safe_set_cksum() failed (%d)\n", res); /* shishi_safe_verify */ res = shishi_safe_verify (safe, key); if (res == SHISHI_VERIFY_FAILED) success ("shishi_safe_verify() OK\n"); else fail ("shishi_safe_verify() failed (%d)\n", res); #endif /* shishi_safe_safe_der() */ res = shishi_safe_safe_der (safe, &p, &l); if (res == SHISHI_OK) success ("shishi_safe_safe_der() OK\n"); else fail ("shishi_safe_safe_der() failed\n"); /* shishi_safe_to_file() */ res = shishi_safe_to_file (handle, asn1safe, SHISHI_FILETYPE_TEXT, "safe.tmp"); if (res == SHISHI_OK) success ("shishi_safe_to_file() OK\n"); else fail ("shishi_safe_to_file() failed\n"); /* shishi_safe_done() */ shishi_safe_done (safe); success ("shishi_safe_done() OK\n"); /* shishi_authenticator_from_file() */ asn1safe = NULL; res = shishi_safe_from_file (handle, &asn1safe, SHISHI_FILETYPE_TEXT, "safe.tmp"); if (res == SHISHI_OK) success ("shishi_safe_from_file() OK\n"); else fail ("shishi_safe_from_file() failed\n"); if (debug) { /* shishi_safe_print() */ res = shishi_safe_print (handle, stdout, asn1safe); if (res == SHISHI_OK) success ("shishi_safe_print() OK\n"); else fail ("shishi_safe_print() failed\n"); } /* shishi_asn1_to_der() */ res = shishi_asn1_to_der (handle, asn1safe, &q, &m); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else fail ("shishi_asn1_to_der() failed\n"); /* Compare DER encodings of authenticators */ if (l > 0 && m > 0 && l == m && memcmp (p, q, l) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); shishi_asn1_done (handle, asn1safe); free (q); free (p); /* unlink() */ res = unlink ("safe.tmp"); if (res == 0) success ("unlink() OK\n"); else fail ("unlink() failed\n"); } shishi-1.0.2/tests/multiname.c0000664000000000000000000000446412126660507013210 00000000000000/* encticketpart.c --- Shishi encticketpart self tests. * Copyright (C) 2012-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Check that principals are encoded properly in encticketpart. http://permalink.gmane.org/gmane.comp.gnu.shishi.general/711 */ #include "utils.c" void test (Shishi * handle) { Shishi_asn1 encticketpart; char *client; size_t clientlen; uint32_t i; int res; encticketpart = shishi_encticketpart (handle); if (encticketpart) success ("shishi_encticketpart() OK\n"); else fail ("shishi_encticketpart() failed\n"); res = shishi_encticketpart_cname_set (handle, encticketpart, 42, "foo/bar"); if (debug) { res = shishi_encticketpart_print (handle, stdout, encticketpart); if (res == SHISHI_OK) success ("shishi_encticketpart_print() OK\n"); else fail ("shishi_encticketpart_print() failed\n"); } res = shishi_encticketpart_client (handle, encticketpart, &client, &clientlen); if (res == SHISHI_OK) success ("shishi_encticketpart_client() OK\n"); else fail ("shishi_encticketpart_client() failed\n"); if (clientlen == strlen ("foo/bar") && memcmp ("foo/bar", client, clientlen) == 0) success ("encticketpart encoding OK\n"); else fail ("encticketpart encoding failed\n"); res = shishi_asn1_read_uint32 (handle, encticketpart, "cname.name-type", &i); if (res == SHISHI_OK) success ("shishi_asn1_read_uint32() OK\n"); else fail ("shishi_asn1_read_uint32() failed\n"); if (i != 42) fail ("encticketpart name-type failed (%d)\n", i); } shishi-1.0.2/tests/Makefile.am0000664000000000000000000000276512126660507013107 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. EXTRA_DIST = shisa.sh shishi.supp keytab1.bin ccache1.bin AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl \ -I$(top_srcdir)/lib -I../lib AM_LDFLAGS = -no-install LDADD = @LTLIBINTL@ ../gl/libgnu.la @LTLIBTASN1@ @LTLIBGNUTLS@ \ ../lib/libshishi.la libutils.la noinst_LTLIBRARIES = libutils.la libutils_la_SOURCES = utils.h utils.c check_PROGRAMS = authenticator crypto gztime priv safe ticketset \ crypto-ctx low-crypto rijndael key keytab ccache nonce \ passwdpromptcb multiname TESTS = $(check_PROGRAMS) TESTS_ENVIRONMENT = \ KEYTAB1=$(srcdir)/keytab1.bin \ CCACHE1=$(srcdir)/ccache1.bin \ $(VALGRIND) shishi-1.0.2/tests/low-crypto.c0000664000000000000000000002642012126660507013330 00000000000000/* low-crypto.c --- Shishi crypto primitives self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" void test (Shishi * handle) { char *out, *ivout; int err; if (debug) shishi_cfg (handle, strdup ("verbose-crypto")); err = shishi_crc (handle, "abcdefgh", 8, &out); if (err) fail ("shishi_crc() failed: %d\n", err); else { if (memcmp (out, "\x39\xf5\xcd\xcb", 4) == 0) success ("shishi_crc() OK\n"); else { hexprint (out, 4); fail ("shishi_crc() failure\n"); } free (out); } err = shishi_md4 (handle, "abcdefgh", 8, &out); if (err) fail ("shishi_md4() failed: %d\n", err); else { if (memcmp (out, "\xad\x9d\xaf\x8d\x49\xd8\x19\x88" "\x59\x0a\x6f\x0e\x74\x5d\x15\xdd", 16) == 0) success ("shishi_md4() OK\n"); else { hexprint (out, 16); fail ("shishi_md4() failure\n"); } free (out); } err = shishi_md5 (handle, "abcdefgh", 8, &out); if (err) fail ("shishi_md5() failed: %d\n", err); else { if (memcmp (out, "\xe8\xdc\x40\x81\xb1\x34\x34\xb4" "\x51\x89\xa7\x20\xb7\x7b\x68\x18", 16) == 0) success ("shishi_md5() OK\n"); else { hexprint (out, 16); fail ("shishi_md5() failure\n"); } free (out); } err = shishi_hmac_md5 (handle, "keykeykey", 9, "abcdefgh", 8, &out); if (err) fail ("shishi_hmac_md5() failed: %d\n", err); else { if (memcmp (out, "\x3c\xb0\x9d\x83\x28\x01\xef\xc0" "\x7b\xb3\xaf\x42\x69\xe5\x93\x9a", 16) == 0) success ("shishi_hmac_md5() OK\n"); else { hexprint (out, 16); fail ("shishi_hmac_md5() failure\n"); } free (out); } err = shishi_hmac_sha1 (handle, "keykeykey", 9, "abcdefgh", 8, &out); if (err) fail ("shishi_hmac_sha1() failed: %d\n", err); else { if (memcmp (out, "\x58\x93\x7a\x58\xfe\xea\x82\xf8" "\x0e\x64\x62\x01\x40\x2b\x2c\xed\x5d\x54\xc1\xfa", 20) == 0) success ("shishi_hmac_sha1() OK\n"); else { hexprint (out, 20); fail ("shishi_hmac_sha1() failure\n"); } free (out); } err = shishi_des_cbc_mac (handle, "kdykdykd", NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_des_cbc_mac() failed: %d\n", err); else { if (memcmp (out, "\xb9\xf1\x38\x36\x37\x7a\x6f\x4c", 8) == 0) success ("shishi_des_cbc_mac() OK\n"); else { hexprint (out, 8); fail ("shishi_des_cbc_mac() failure\n"); } free (out); } err = shishi_des_cbc_mac (handle, "kdykdykd", "iviviviv", "abcdefgh", 8, &out); if (err) fail ("shishi_des_cbc_mac() failed: %d\n", err); else { if (memcmp (out, "\x7b\x66\x2d\x4d\x54\xc9\xc1\x01", 8) == 0) success ("shishi_des_cbc_mac() OK\n"); else { hexprint (out, 8); fail ("shishi_des_cbc_mac() failure\n"); } free (out); } err = shishi_arcfour (handle, 0, "keykeykey", 9, NULL, NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_arcfour() failed: %d\n", err); else { if (memcmp (out, "\x6a\x0e\x57\x89\x41\xe9\x1c\x22", 8) == 0) success ("shishi_arcfour() OK\n"); else { hexprint (out, 8); fail ("shishi_arcfour() failure\n"); } free (out); } err = shishi_arcfour (handle, 0, "keykeyke", 8, NULL, &ivout, "abcdefghi", 9, &out); if (err) fail ("shishi_arcfour() failed: %d\n", err); else { if (memcmp (out, "\x17\x52\xf3\xd8\x61\x14\xe6\x76", 8) == 0) success ("shishi_arcfour() OK\n"); else { hexprint (out, 8); fail ("shishi_arcfour() failure\n"); } if (memcmp (ivout, "\x6b\xdf\xca\xe7\x4c\xe8\x79\x53" "\xd0\x4e\xe2\x37\xc9\x52\xc6\x3c" "\x24\xf2\x9e\x5b\x32\x50\x07\x2e" "\xee\x0f\xc2\x38\x86\x89\x4b\x21" "\xd2\xc0\xa2\x7a\xb7\xae\xf1\xcb" "\x03\x19\x78\x41\x9f\x74\xab\x35" "\x12\x30\xe9\x04\x1c\x05\x66\x58" "\x25\x62\x77\xa5\x42\x44\xd6\x6d" "\x85\xc8\x43\x94\xcf\xfb\x06\x0b" "\xde\x7f\x15\xa1\x8e\xaa\x70\x1b" "\x98\xb0\x13\x27\x73\x4f\x2a\x3d" "\x81\x29\x83\xd8\x99\x36\xd3\x54" "\x4a\x31\xf0\xbe\x18\xe1\x6f\x28" "\x3a\x64\x6a\x68\xef\x59\x22\xbc" "\xb5\x47\x76\x63\xec\x48\x3b\x71" "\x10\xc4\x87\x5f\xea\xc1\xf6\x5d" "\xc5\x8b\xda\xac\xe0\xa9\x8a\xa6" "\x11\x09\x0c\x72\xad\xb3\x46\xe5" "\x9b\x91\x16\x93\x51\x49\xe6\xbf" "\x95\xf5\xd1\x20\xe3\x90\x5a\x39" "\x7b\x7e\x7c\xb9\x40\xbd\x08\x9a" "\x45\xb4\xd7\x1f\x2c\x61\xb8\xcc" "\xb6\x33\x92\x0e\xf9\x0a\xba\x55" "\x75\x14\x5e\xb1\x26\xf8\x84\xed" "\xa4\x1e\x7d\x60\xe4\xdd\x2b\xff" "\xeb\xfe\xd4\x57\x8c\xa0\x88\x8d" "\xdc\x00\x34\x23\xc7\xfd\x0d\x97" "\x56\x96\xaf\xcd\x3f\xf7\xc3\xa7" "\x6c\x65\xbb\xf3\x3e\xdb\x4d\xd9" "\x1d\xa3\x9d\xf4\x17\x69\x6e\x82" "\x02\xa8\x2d\x9c\xce\x1a\xb2\xfc" "\xfa\x5c\x67\x2f\x8f\x01\x80\xd5" "\x09\xa2", 258) == 0) success ("shishi_arcfour() OK IV\n"); else { hexprint (ivout, 258); fail ("shishi_arcfour() failure IV\n"); } free (out); free (ivout); } err = shishi_des (handle, 0, "kdykdykd", NULL, NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_des() failed: %d\n", err); else { if (memcmp (out, "\xb9\xf1\x38\x36\x37\x7a\x6f\x4c", 8) == 0) success ("shishi_des() OK\n"); else { hexprint (out, 8); fail ("shishi_des() failure\n"); } free (out); } err = shishi_des (handle, 0, "kdykdykd", "iviviviv", NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_des() failed: %d\n", err); else { if (memcmp (out, "\x7b\x66\x2d\x4d\x54\xc9\xc1\x01", 8) == 0) success ("shishi_des() OK\n"); else { hexprint (out, 8); fail ("shishi_des() failure\n"); } free (out); } err = shishi_des (handle, 0, "kdykdykd", "iviviviv", &ivout, "abcdefgh", 8, &out); if (err) fail ("shishi_des() failed: %d\n", err); else { if (memcmp (out, "\x7b\x66\x2d\x4d\x54\xc9\xc1\x01", 8) == 0) success ("shishi_des() OK\n"); else { hexprint (out, 8); fail ("shishi_des() failure\n"); } if (memcmp (ivout, "\x7b\x66\x2d\x4d\x54\xc9\xc1\x01", 8) == 0) success ("shishi_des() OK IV\n"); else { hexprint (ivout, 8); fail ("shishi_des() failure IV\n"); } free (out); free (ivout); } err = shishi_3des (handle, 0, "kdykdykdykdykdykdykdykdy", NULL, NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_3des() failed: %d\n", err); else { if (memcmp (out, "\xd9\x4a\xd9\xa4\x92\xb1\x70\x60", 8) == 0) success ("shishi_3des() OK\n"); else { hexprint (out, 8); fail ("shishi_3des() failure\n"); } free (out); } err = shishi_3des (handle, 0, "kdykdykdykdykdykdykdykdy", "iviviviviviviviviviviviv", NULL, "abcdefgh", 8, &out); if (err) fail ("shishi_3des() failed: %d\n", err); else { if (memcmp (out, "\x45\xba\x34\xb4\xda\xd7\x53\x6f", 8) == 0) success ("shishi_3des() OK\n"); else { hexprint (out, 8); fail ("shishi_3des() failure\n"); } free (out); } err = shishi_3des (handle, 0, "kdykdykdykdykdykdykdykdy", "iviviviviviviviviviviviv", &ivout, "abcdefghijklmnopqrstuvxy", 24, &out); if (err) fail ("shishi_3des() failed: %d\n", err); else { if (memcmp (out, "\x45\xba\x34\xb4\xda\xd7\x53\x6f" "\x4e\x4b\xe8\x14\x44\x25\xf2\x19" "\x46\x57\x6b\x16\xd9\x5d\xf2\x38", 24) == 0) success ("shishi_3des() OK\n"); else { hexprint (out, 24); fail ("shishi_3des() failure\n"); } if (memcmp (ivout, "\x46\x57\x6b\x16\xd9\x5d\xf2\x38", 8) == 0) success ("shishi_3des() OK IV\n"); else { hexprint (ivout, 8); fail ("shishi_3des() failure IV\n"); } free (out); free (ivout); } err = shishi_aes_cts (handle, 0, "keykeykeykeykeyk", 16, "iviviviviviviviv", &ivout, "abcdefghijklmnop", 16, &out); if (err) fail ("shishi_aes_cts(16) failed: %d\n", err); else { if (memcmp (out, "\x89\xee\x53\x33\x54\xa8\xb0\xb7" "\xb6\x36\xbf\x80\xb0\xba\x6a\x4a", 16) == 0) success ("shishi_aes_cts(16) OK\n"); else { hexprint (out, 16); fail ("shishi_aes_cts(16) failure\n"); } if (memcmp (ivout, "\x89\xee\x53\x33\x54\xa8\xb0\xb7" "\xb6\x36\xbf\x80\xb0\xba\x6a\x4a", 16) == 0) success ("shishi_aes_cts(16) OK IV\n"); else { hexprint (ivout, 16); fail ("shishi_aes_cts(16) failure IV\n"); } free (out); free (ivout); } err = shishi_aes_cts (handle, 0, "keykeykeykeykeyk", 16, "iviviviviviviviv", &ivout, "abcdefghijklmnopqrstuvxy", 24, &out); if (err) fail ("shishi_aes_cts(24) failed: %d\n", err); else { if (memcmp (out, "\x22\x8f\x1a\xc5\xd4\x74\xd2\x74" "\x96\x4d\x2d\xcd\x0b\xa3\x0d\x8f" "\x89\xee\x53\x33\x54\xa8\xb0\xb7", 24) == 0) success ("shishi_aes_cts(24) OK\n"); else { hexprint (out, 24); fail ("shishi_aes_cts(24) failure\n"); } if (memcmp (ivout, "\x22\x8f\x1a\xc5\xd4\x74\xd2\x74" "\x96\x4d\x2d\xcd\x0b\xa3\x0d\x8f", 16) == 0) success ("shishi_aes_cts(24) OK IV\n"); else { hexprint (ivout, 16); fail ("shishi_aes_cts(24) failure IV\n"); } free (out); free (ivout); } err = shishi_aes_cts (handle, 0, "keykeykeykeykeyk", 16, "iviviviviviviviv", &ivout, "abcdefghijklmnopqrstuvx", 23, &out); if (err) fail ("shishi_aes_cts(23) failed: %d\n", err); else { if (memcmp (out, "\x45\x23\x5a\x0c\x6b\x8a\x0c\xad" "\xe6\x50\xff\xe1\x08\x17\x9a\x6d" "\x89\xee\x53\x33\x54\xa8\xb0", 23) == 0) success ("shishi_aes_cts(23) OK\n"); else { hexprint (out, 23); fail ("shishi_aes_cts(23) failure\n"); } if (memcmp (ivout, "\x45\x23\x5a\x0c\x6b\x8a\x0c\xad" "\xe6\x50\xff\xe1\x08\x17\x9a\x6d", 16) == 0) success ("shishi_aes_cts(23) OK IV\n"); else { hexprint (ivout, 16); fail ("shishi_aes_cts(23) failure IV\n"); } free (out); free (ivout); } err = shishi_aes_cts (handle, 0, "keykeykeykeykeyk", 16, "iviviviviviviviv", &ivout, "abcdefghijklmnopqrstuvxyz", 25, &out); if (err) fail ("shishi_aes_cts(25) failed: %d\n", err); else { if (memcmp (out, "\xa9\x50\xdd\xcb\xa8\x5b\x5c\xb6" "\x84\x7d\x38\x65\x4a\xc1\x63\xd7" "\x89\xee\x53\x33\x54\xa8\xb0\xb7\xb6", 25) == 0) success ("shishi_aes_cts(25) OK\n"); else { hexprint (out, 25); fail ("shishi_aes_cts(25) failure\n"); } if (memcmp (ivout, "\xa9\x50\xdd\xcb\xa8\x5b\x5c\xb6" "\x84\x7d\x38\x65\x4a\xc1\x63\xd7", 16) == 0) success ("shishi_aes_cts(25) OK IV\n"); else { hexprint (ivout, 16); fail ("shishi_aes_cts(25) failure IV\n"); } free (out); free (ivout); } } shishi-1.0.2/tests/crypto-ctx.c0000664000000000000000000001055112126660507013323 00000000000000/* crypto-ctx.c --- Shishi crypto context self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" static const char rnd[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789"; static const char iv[] = "0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char *in = "abcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; struct tv { int etype; size_t start; size_t step; size_t len; }; const struct tv tv[] = { {SHISHI_DES_CBC_CRC, 4, 8, 68}, {SHISHI_DES_CBC_MD4, 0, 8, 72}, {SHISHI_DES_CBC_MD5, 0, 8, 72}, {SHISHI_DES_CBC_NONE, 8, 8, 72}, {SHISHI_DES3_CBC_NONE, 8, 8, 72}, /* XXX following three doesn't use start=0 because of a weird realloc(0,0) problem */ {SHISHI_DES3_CBC_HMAC_SHA1_KD, 8, 8, 72}, {SHISHI_AES128_CTS_HMAC_SHA1_96, 1, 1, 72}, {SHISHI_AES256_CTS_HMAC_SHA1_96, 1, 1, 72}, {SHISHI_ARCFOUR_HMAC, 0, 1, 72}, {SHISHI_ARCFOUR_HMAC_EXP, 0, 1, 72}, {0, 0, 0, 0} }; void test (Shishi * handle) { Shishi_crypto *ctx, *ctx2; Shishi_key *key; char *out, *out2; size_t i, j; size_t len, len2; const struct tv *tvp; int err; if (debug) shishi_cfg (handle, strdup ("verbose-crypto")); for (i = 0; tvp = &tv[i], tvp->etype; i++) { len = shishi_cipher_randomlen (tvp->etype); if (len == (size_t) - 1) { fail ("shishi_cipher_randomlen(%d) failed: %d\n", tvp->etype, len); continue; } err = shishi_key_from_random (handle, tvp->etype, rnd, len, &key); if (err) { fail ("shishi_key_from_random(%d) failed (%d)\n", tvp->etype, err); continue; } len = shishi_cipher_blocksize (tvp->etype); if (len == (size_t) - 1) { fail ("shishi_cipher_blocksize (%d) failed: %d\n", tvp->etype, len); continue; } if (tvp->etype == SHISHI_ARCFOUR_HMAC || tvp->etype == SHISHI_ARCFOUR_HMAC_EXP) { /* For ARCFOUR, IV is internal S-BOX, not of blocksize length. We probably should clean this up somehow... */ ctx = shishi_crypto (handle, key, SHISHI_KEYUSAGE_ENCASREPPART, tvp->etype, NULL, 0); ctx2 = shishi_crypto (handle, key, SHISHI_KEYUSAGE_ENCASREPPART, tvp->etype, NULL, 0); } else { ctx = shishi_crypto (handle, key, SHISHI_KEYUSAGE_ENCASREPPART, tvp->etype, iv, len); ctx2 = shishi_crypto (handle, key, SHISHI_KEYUSAGE_ENCASREPPART, tvp->etype, iv, len); } if (!ctx) { fail ("shishi_crypto(%d) failed\n", tvp->etype); continue; } if (!ctx2) { fail ("shishi_crypto(%d) failed (2)\n", tvp->etype); continue; } for (j = tvp->start; j < tvp->len; j += tvp->step) { int ok; err = shishi_crypto_encrypt (ctx, in, j, &out, &len); if (err) { fail ("shishi_crypto_encrypt(etype=%d, len=%d) failed (%d)\n", tvp->etype, j, err); continue; } err = shishi_crypto_decrypt (ctx2, out, len, &out2, &len2); if (err) { fail ("shishi_crypto_decrypt(etype=%d, len=%d) failed (%d)\n", tvp->etype, j, err); continue; } free (out); ok = len2 != j || memcmp (out2, in, len2) != 0; free (out2); if (ok) { puts ("expected"); hexprint (in, j); puts ("computed"); hexprint (out2, len2); fail ("shishi_crypto_encrypt (in1, %d) failed\n", tvp->etype); continue; } success ("shishi_crypto_encrypt/decrypt(etype=%d, len=%d) OK\n", tvp->etype, j); } shishi_crypto_close (ctx); shishi_crypto_close (ctx2); shishi_key_done (key); success ("shishi_crypto_encrypt/decrypt(etype=%d) OK\n", tvp->etype); } } shishi-1.0.2/tests/ticketset.c0000664000000000000000000004617212126660507013216 00000000000000/* ticketset.c --- Shishi ticketset self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" static const char tkt1kdcrepb64[] = "a4ICITCCAh2gAwIBBaEDAgELow8bDUpPU0VGU1NPTi5PUkekEDAOoAMCAQGhBzAF" "GwNqYXOlggECYYH/MIH8oAMCAQWhDxsNSk9TRUZTU09OLk9SR6IiMCCgAwIBAaEZ" "MBcbBmtyYnRndBsNSk9TRUZTU09OLk9SR6OBvzCBvKADAgEQoQMCAQGiga8Egayq" "ttjMpRNM2iVVR5RjtMNH3i75hjnUiXQ7UeT7DMShJ5IxiBr09dggaZzTAHrBAvV8" "5xON3p39rMpmCg9utizrxzT1JXruoGF/+ofuT7lEDfRr437QJD5WuOtlfmkM2i5s" "2bGYZlHNdBonapJCcMeUSS45HEoM5iy0dK2JeaOliOVKTDpX9gOayKSIFYnuzIb+" "cg1ATHm29ahK5AY+LU9E4v8Yj1/02srRuERApoHnMIHkoAMCARChAwIBBaKB1wSB" "1AiMSoSQrE5FSE2CYpTOdLgVWRw/k1cqBtswVKRTdgj2As6WG6mhFczy7RF62GVM" "6gJGNQRx1mAg0d5C7pNKRCgAZ2oQdJIGW6CLTy2L0LxM104HA0XrZ+zfFLKlZTOV" "T85LIoSneI/yKNh3iYeVQwp6AdMRw6562fHMie22I4sy22wNVz1toTrKixILvoMy" "eoD7ET43Y1eo0SeXj8LPmZyqLARBknl2ZvNcDpjWpI57QycHV28BhcvVPu72kObJ" "/68tCNEJ8J+vHArpFA5V9BDsFcGs"; static const char tkt1enckdcreppartb64[] = "eYGyMIGvoCMwIaADAgEQoRoEGPF/LFgc3IYq3+AZofutur+wsK5i6vSbN6EcMBow" "GKADAgEAoREYDzE5NzAwMTAxMDAwMDAwWqIGAgTl7iQgpAcDBQAAQAAApREYDzIw" "MDIxMjExMTM0MDU0WqcRGA8yMDAyMTIxMTEzNTczNFqpDxsNSk9TRUZTU09OLk9S" "R6oiMCCgAwIBAaEZMBcbBmtyYnRndBsNSk9TRUZTU09OLk9SRw=="; static const char tkt1ticketb64[] = "YYH/MIH8oAMCAQWhDxsNSk9TRUZTU09OLk9SR6IiMCCgAwIBAaEZMBcbBmtyYnRn" "dBsNSk9TRUZTU09OLk9SR6OBvzCBvKADAgEQoQMCAQGiga8EgayqttjMpRNM2iVV" "R5RjtMNH3i75hjnUiXQ7UeT7DMShJ5IxiBr09dggaZzTAHrBAvV85xON3p39rMpm" "Cg9utizrxzT1JXruoGF/+ofuT7lEDfRr437QJD5WuOtlfmkM2i5s2bGYZlHNdBon" "apJCcMeUSS45HEoM5iy0dK2JeaOliOVKTDpX9gOayKSIFYnuzIb+cg1ATHm29ahK" "5AY+LU9E4v8Yj1/02srRuERA"; static const char tkt2kdcrepb64[] = "bYICSjCCAkagAwIBBaEDAgENow8bDUpPU0VGU1NPTi5PUkekEDAOoAMCAQGhBzAF" "GwNqYXOlggEYYYIBFDCCARCgAwIBBaEPGw1KT1NFRlNTT04uT1JHoiYwJKADAgEB" "oR0wGxsEaG9zdBsTbGF0dGUuam9zZWZzc29uLm9yZ6OBzzCBzKADAgEQoQMCAQKi" "gb8EgbzEU6KFfSSQg4xxSxJBp2QBtaNGyzawROAGFsztZcY+gl5K2ki6xDT10kCY" "yfORXXXraoYIcwJl6EW8RGl4KKsZlZmNWuw0/mO4Gglga6sM06vQDs2TcSc8hWDJ" "4I1vU6/WlKtwzNj0Cw+6fqyDJIt6PmRpUe/yGZe6hSQkrqgQuBhpAHZF4/aoWqOm" "NufTdGa+5gHzqcEmQerWD8YhImeD+Xe5citg92XTPx2nHiNMBMmwgWJHf1Tjddiw" "saaB+jCB96ADAgEQooHvBIHsmctkNNI2jJwUEdTe9o5WeHyTCWMSO9AA0luxjX2D" "CR5kNOZuPx5YfHWHwKlqrOtwo1E0Cb7bpKHPUOWhhIGUXcV0z1ETSEOX8Ho3iIOc" "8LSNVq8UqVf/wBnndLiljZveTbbu+YcFNbF7g+q2VDYffKgXsUi6HV2Ue7OGawvY" "DxU7KDVpPWgitPGrNItdaJ1QVfVH+cXLdiqEV7RR+JOsFc8jkBxNOq/rx60Ga73F" "urdXCqM1tz5T2QHgoI6y0HjGuEbjymFQfCt1hclIvu7EzWn29p2oZJUj1Vv7vpNz" "tDy+gjC3uMYj7JGdoTg="; static const char tkt2enckdcreppartb64[] = "eoHJMIHGoCMwIaADAgEQoRoEGFS29KeMuXZDeqcEud/gWHln/db7bje26aEcMBow" "GKADAgEAoREYDzE5NzAwMTAxMDAwMDAwWqIGAgScLHDdpAcDBQAAAAAApREYDzIw" "MDIxMjExMTM0MDU0WqYRGA8yMDAyMTIxMTEzNDEwNFqnERgPMjAwMjEyMTExMzU3" "MzRaqQ8bDUpPU0VGU1NPTi5PUkeqJjAkoAMCAQGhHTAbGwRob3N0GxNsYXR0ZS5q" "b3NlZnNzb24ub3Jn"; static const char tkt2ticketb64[] = "YYIBFDCCARCgAwIBBaEPGw1KT1NFRlNTT04uT1JHoiYwJKADAgEBoR0wGxsEaG9z" "dBsTbGF0dGUuam9zZWZzc29uLm9yZ6OBzzCBzKADAgEQoQMCAQKigb8EgbzEU6KF" "fSSQg4xxSxJBp2QBtaNGyzawROAGFsztZcY+gl5K2ki6xDT10kCYyfORXXXraoYI" "cwJl6EW8RGl4KKsZlZmNWuw0/mO4Gglga6sM06vQDs2TcSc8hWDJ4I1vU6/WlKtw" "zNj0Cw+6fqyDJIt6PmRpUe/yGZe6hSQkrqgQuBhpAHZF4/aoWqOmNufTdGa+5gHz" "qcEmQerWD8YhImeD+Xe5citg92XTPx2nHiNMBMmwgWJHf1TjddiwsQ=="; #define BUFSIZE 5000 void test (Shishi * handle) { Shishi_tkts *tktset; Shishi_tkts_hint hint; Shishi_tkt *t1, *t2, *t3; Shishi_asn1 tkt1asn1, tkt1asn2, tkt1asn3; Shishi_asn1 tkt2asn1, tkt2asn2, tkt2asn3; char buffer[BUFSIZE]; char buffer2[BUFSIZE]; char *buf; char *p, *q; size_t n; int res; /* shishi_tkts_default_file() */ p = strdup (shishi_tkts_default_file (handle)); if (debug) printf ("shishi_tkts_default_file () => `%s'.\n", p ? p : ""); if (p) success ("shishi_tkts_default_file() OK\n"); else fail ("shishi_tkts_default_file() failed\n"); /* shishi_tkts_default_file_set() */ shishi_tkts_default_file_set (handle, "foo"); q = strdup (shishi_tkts_default_file (handle)); if (debug) printf ("shishi_tkts_default_file () => `%s'.\n", q ? q : ""); if (q && strcmp (q, "foo") == 0) success ("shishi_tkts_default_file_set() OK\n"); else fail ("shishi_tkts_default_file_set() failed\n"); free (q); /* shishi_tkts_default_file_set() */ shishi_tkts_default_file_set (handle, NULL); q = strdup (shishi_tkts_default_file (handle)); if (debug) printf ("shishi_tkts_default_file () => `%s'.\n", q ? q : ""); if (p && q && strcmp (p, q) == 0) success ("shishi_tkts_default_file_set() OK\n"); else fail ("shishi_tkts_default_file_set() failed\n"); free (q); free (p); /* shishi_tkts () */ res = shishi_tkts (handle, &tktset); if (res == SHISHI_OK) success ("shishi_tkts() OK\n"); else fail ("shishi_tkts() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 0) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_nth () */ t1 = shishi_tkts_nth (tktset, 0); if (t1 == NULL) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_nth () */ t1 = shishi_tkts_nth (tktset, 42); if (t1 == NULL) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_add () */ res = shishi_tkts_add (tktset, NULL); if (res == SHISHI_INVALID_TICKET) success ("shishi_tkts_add() OK\n"); else fail ("shishi_tkts_add() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 0); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 42); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (NULL, 0); if (res == SHISHI_INVALID_TKTS) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* create ticket */ n = BUFSIZE; if (!base64_decode (tkt1ticketb64, strlen (tkt1ticketb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt1asn1 = shishi_der2asn1_ticket (handle, buffer, n); if (!tkt1asn1) fail ("shishi_der2asn1_ticket() failed\n"); n = BUFSIZE; if (!base64_decode (tkt1enckdcreppartb64, strlen (tkt1enckdcreppartb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt1asn2 = shishi_der2asn1_encasreppart (handle, buffer, n); if (!tkt1asn2) fail ("shishi_der2asn1_encasreppart() failed\n"); n = BUFSIZE; if (!base64_decode (tkt1kdcrepb64, strlen (tkt1kdcrepb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt1asn3 = shishi_der2asn1_asrep (handle, buffer, n); if (!tkt1asn3) fail ("shishi_der2asn1_asrep() failed\n"); /* shishi_tkts_new() */ res = shishi_tkts_new (tktset, tkt1asn1, tkt1asn2, tkt1asn3); if (res == SHISHI_OK) success ("shishi_tkts_new() OK\n"); else fail ("shishi_tkts_new() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 1) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_nth () */ t1 = shishi_tkts_nth (tktset, 0); if (debug) { shishi_tkt_pretty_print (t1, stdout); printf ("t1=%p\n", t1); } if (t1) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 0); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 0) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_nth () */ t2 = shishi_tkts_nth (tktset, 0); if (t2 == NULL) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_add () */ res = shishi_tkts_add (tktset, t1); if (res == SHISHI_OK) success ("shishi_tkts_add() OK\n"); else fail ("shishi_tkts_add() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 1) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* create ticket */ n = BUFSIZE; if (!base64_decode (tkt2ticketb64, strlen (tkt2ticketb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt2asn1 = shishi_der2asn1_ticket (handle, buffer, n); if (!tkt2asn1) fail ("shishi_der2asn1_ticket() failed\n"); n = BUFSIZE; if (!base64_decode (tkt2enckdcreppartb64, strlen (tkt2enckdcreppartb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt2asn2 = shishi_der2asn1_enctgsreppart (handle, buffer, n); if (!tkt2asn2) fail ("shishi_der2asn1_enctgsreppart() failed\n"); n = BUFSIZE; if (!base64_decode (tkt2kdcrepb64, strlen (tkt2kdcrepb64), buffer, &n)) fail ("base64_decode() failed\n"); tkt2asn3 = shishi_der2asn1_tgsrep (handle, buffer, n); if (!tkt2asn3) fail ("shishi_der2asn1_kdcrep() failed\n"); /* shishi_tkts_new() */ res = shishi_tkts_new (tktset, tkt2asn1, tkt2asn2, tkt2asn3); if (res == SHISHI_OK) success ("shishi_tkts_new() OK\n"); else fail ("shishi_tkts_new() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 2) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_nth () */ t2 = shishi_tkts_nth (tktset, 1); if (debug) { shishi_tkt_pretty_print (t2, stdout); printf ("t2=%p\n", t2); } if (t2) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_find () */ memset (&hint, 0, sizeof (hint)); hint.server = (char *) "host/latte.josefsson.org"; hint.flags = SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED; t3 = shishi_tkts_find (tktset, &hint); if (debug) printf ("t3=%p\n", t3); if (t3 == t2) success ("shishi_tkts_find() for server OK\n"); else fail ("shishi_tkts_find() for server failed\n"); /* shishi_tkts_find () */ memset (&hint, 0, sizeof (hint)); hint.server = (char *) "krbtgt/JOSEFSSON.ORG"; hint.flags = SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED; t3 = shishi_tkts_find (tktset, &hint); if (t3 == t1) success ("shishi_tkts_find() for server OK\n"); else fail ("shishi_tkts_find() for server failed\n"); /* shishi_tkts_find () */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) "jas"; hint.flags = SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED; t3 = shishi_tkts_find (tktset, &hint); if (debug) printf ("t3=%p\n", t3); if (t3 == t1) success ("shishi_tkts_find() for client OK\n"); else fail ("shishi_tkts_find() for client failed\n"); /* shishi_tkts_find () */ memset (&hint, 0, sizeof (hint)); hint.client = (char *) "jas"; t3 = shishi_tkts_find (tktset, &hint); if (debug) printf ("t3=%p\n", t3); if (t3 == NULL) success ("shishi_tkts_find() for client2 OK\n"); else fail ("shishi_tkts_find() for client2 failed\n"); res = shishi_tkts_to_file (tktset, "tktset.tmp"); if (res == SHISHI_OK) success ("shishi_tkts_to_file() OK\n"); else fail ("shishi_tkts_to_file() failed\n"); /* shishi_tkts_add () */ res = shishi_tkts_add (tktset, t2); if (res == SHISHI_OK) success ("shishi_tkts_add() OK\n"); else fail ("shishi_tkts_add() failed\n"); /* shishi_tkts_add () */ res = shishi_tkts_add (tktset, t1); if (res == SHISHI_OK) success ("shishi_tkts_add() OK\n"); else fail ("shishi_tkts_add() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 1); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 1); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); memset (&hint, 0, sizeof (hint)); hint.server = (char *) "host/latte.josefsson.org"; hint.flags = SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED; t3 = shishi_tkts_find (tktset, &hint); if (t3 == NULL) success ("shishi_tkts_find() for server OK\n"); else fail ("shishi_tkts_find() for server failed\n"); memset (&hint, 0, sizeof (hint)); hint.server = (char *) "krbtgt/JOSEFSSON.ORG"; hint.flags = SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED; t3 = shishi_tkts_find (tktset, &hint); if (t3 == t1) success ("shishi_tkts_find() for server OK\n"); else fail ("shishi_tkts_find() for server failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 0); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_remove () */ res = shishi_tkts_remove (tktset, 0); if (res == SHISHI_OK) success ("shishi_tkts_remove() OK\n"); else fail ("shishi_tkts_remove() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 0) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_done () */ shishi_tkts_done (&tktset); success ("shishi_tkts_done() OK\n"); shishi_tkt_done (t1); success ("shishi_tkt_done (t1) OK\n"); shishi_tkt_done (t2); success ("shishi_tkt_done (t2) OK\n"); /* shishi_tkts_done () */ shishi_tkts_done (NULL); success ("shishi_tkts_done() OK\n"); /* shishi_tkts () */ res = shishi_tkts (handle, &tktset); if (res == SHISHI_OK) success ("shishi_tkts() OK\n"); else fail ("shishi_tkts() failed\n"); /* shishi_tkts_from_file () */ res = shishi_tkts_from_file (tktset, "tktset.tmp"); if (res == SHISHI_OK) success ("shishi_tkts_from_file() OK\n"); else fail ("shishi_tkts_from_file() failed\n"); /* shishi_tkts_size () */ n = shishi_tkts_size (tktset); if (debug) printf ("shishi_tkts_size () => `%d'.\n", n); if (n == 2) success ("shishi_tkts_size() OK\n"); else fail ("shishi_tkts_size() failed\n"); /* shishi_tkts_nth () */ t1 = shishi_tkts_nth (tktset, 0); if (debug) shishi_tkt_pretty_print (t1, stdout); if (t1) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* shishi_tkts_nth () */ t2 = shishi_tkts_nth (tktset, 1); if (debug) shishi_tkt_pretty_print (t2, stdout); if (t2) success ("shishi_tkts_nth() OK\n"); else fail ("shishi_tkts_nth() failed\n"); /* DER encode and compare tkt1 ticket */ res = shishi_asn1_to_der (handle, shishi_tkt_ticket (t1), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt1ticketb64) && memcmp (buffer2, tkt1ticketb64, strlen (tkt1ticketb64)) == 0) success ("Ticket read OK\n"); else fail ("Ticket read failed\n"); /* DER encode and compare tkt1 enckdcreppart */ res = shishi_asn1_to_der (handle, shishi_tkt_enckdcreppart (t1), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt1enckdcreppartb64) && memcmp (buffer2, tkt1enckdcreppartb64, strlen (tkt1enckdcreppartb64)) == 0) success ("EncKDCRepPart read OK\n"); else fail ("EncKDCRepPart read failed\n"); /* DER encode and compare tkt1 kdcrep */ res = shishi_asn1_to_der (handle, shishi_tkt_kdcrep (t1), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt1kdcrepb64) && memcmp (buffer2, tkt1kdcrepb64, strlen (tkt1kdcrepb64)) == 0) success ("KDC-REP read OK\n"); else fail ("KDC-REP read failed\n"); /* DER encode and compare tkt2 ticket */ res = shishi_asn1_to_der (handle, shishi_tkt_ticket (t2), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt2ticketb64) && memcmp (buffer2, tkt2ticketb64, strlen (tkt2ticketb64)) == 0) success ("Ticket 2 read OK\n"); else fail ("Ticket 2 read failed\n"); /* DER encode and compare tkt2 enckdcreppart */ res = shishi_asn1_to_der (handle, shishi_tkt_enckdcreppart (t2), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt2enckdcreppartb64) && memcmp (buffer2, tkt2enckdcreppartb64, strlen (tkt2enckdcreppartb64)) == 0) success ("EncKDCRepPart 2 read OK\n"); else fail ("EncKDCRepPart 2 read failed\n"); /* DER encode and compare tkt2 kdcrep */ res = shishi_asn1_to_der (handle, shishi_tkt_kdcrep (t2), &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); base64_encode (buf, n, buffer2, BUFSIZE); free (buf); if (strlen (buffer2) == strlen (tkt2kdcrepb64) && memcmp (buffer2, tkt2kdcrepb64, strlen (tkt2kdcrepb64)) == 0) success ("KDC-REP 2 read OK\n"); else fail ("KDC-REP 2 read failed\n"); res = unlink ("tktset.tmp"); if (res == 0) success ("unlink() OK\n"); else fail ("unlink() failed\n"); shishi_tkt_done (t1); success ("shishi_tkt_done (t1) OK\n"); shishi_tkt_done (t2); success ("shishi_tkt_done (t2) OK\n"); /* shishi_tkts_done () */ shishi_tkts_done (&tktset); success ("shishi_tkts_done() OK\n"); shishi_asn1_done (handle, tkt1asn1); shishi_asn1_done (handle, tkt1asn2); shishi_asn1_done (handle, tkt1asn3); shishi_asn1_done (handle, tkt2asn1); shishi_asn1_done (handle, tkt2asn2); shishi_asn1_done (handle, tkt2asn3); } shishi-1.0.2/tests/key.c0000664000000000000000000000301712126660507011776 00000000000000/* key.c --- Shishi KEY self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" void test (Shishi * handle) { Shishi_key *key; const char *p; int res; res = shishi_key_from_base64 (handle, SHISHI_AES128_CTS_HMAC_SHA1_96, "Zm5vcmRmbm9yZGZub3JkZg==", &key); if (debug) printf ("shishi_key_from_base64 => `%p'.\n", key); if (res == SHISHI_OK) success ("shishi_key_from_base64 OK\n"); else fail ("shishi_key_from_base64 failed\n"); p = shishi_key_value (key); if (!p) fail ("shishi_key_value failed\n"); else { if (memcmp (p, "fnordfnordfnordf", shishi_key_length (key)) == 0) success ("shishi_key_value OK\n"); else fail ("shishi_key_value mismatch\n"); } shishi_key_done (key); } shishi-1.0.2/tests/nonce.c0000664000000000000000000000623412126660507012314 00000000000000/* nonce.c --- Shishi nonce handling regression self tests. * Copyright (C) 2006-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ const char *asreq = "aoGQMIGNoQMCAQWiAwIBCqSBgDB+oAcDBQAAAAAAoRAwDqADAgEAoQcwBRsDamFzog8bDUpPU0VGU1NPTi5PUkejIjAgoAMCAQGhGTAXGwZrcmJ0Z3QbDUpPU0VGU1NPTi5PUkelERgPMjAwNjExMDEyMDMwMDVapwYCBAlXUoOoETAPAgESAgEQAgEDAgECAgEB"; const char *asreppart = "eYGYMIGVoCMwIaADAgEQoRoEGPSJH0z06kWoouBUejc+L566tgEBAQEZDqECMACiBgIEf////6QHAwUAAEAAAKURGA8yMDA2MTEwMTEyMDkyNVqnERgPMjAwNjExMDEyMDA5MjVaqQ8bDUpPU0VGU1NPTi5PUkeqIjAgoAMCAQGhGTAXGwZrcmJ0Z3QbDUpPU0VGU1NPTi5PUkc="; #include "utils.c" #include void test (Shishi * handle) { Shishi_asn1 req, rep; char *reqder, *repder; size_t reqderlen, repderlen; int rc; uint32_t nonce; if (!base64_decode_alloc (asreq, strlen (asreq), &reqder, &reqderlen)) fail ("base64 req\n"); if (!base64_decode_alloc (asreppart, strlen (asreppart), &repder, &repderlen)) fail ("base64 rep\n"); req = shishi_der2asn1_asreq (handle, reqder, reqderlen); if (!req) fail ("der2asn1 req\n"); rep = shishi_der2asn1_encasreppart (handle, repder, repderlen); if (!rep) fail ("der2asn1 rep\n"); if (debug) { shishi_kdcreq_print (handle, stdout, req); shishi_enckdcreppart_print (handle, stdout, rep); } /* Read and check req */ rc = shishi_asn1_read_uint32 (handle, req, "req-body.nonce", &nonce); if (rc) fail ("shishi_asn1_read_uint32\n"); printf ("req nonce: %x\n", nonce); if (nonce != 0x09575283) fail ("nonce mismatch low\n"); rc = shishi_kdcreq_nonce (handle, req, &nonce); if (rc) fail ("shishi_kdcreq_nonce\n"); printf ("req nonce: %x\n", nonce); if (nonce != 0x09575283) fail ("nonce mismatch high"); /* Read and check rep */ rc = shishi_asn1_read_uint32 (handle, rep, "nonce", &nonce); if (rc) fail ("read rep uint32"); printf ("old rep nonce: %x\n", nonce); if (nonce != 0x7fffffff) fail ("nonce mismatch high"); /* Copy nonce. */ rc = shishi_kdc_copy_nonce (handle, req, rep); if (rc) fail ("shishi_kdc_copy_nonce\n"); /* Read and check rep */ rc = shishi_asn1_read_uint32 (handle, rep, "nonce", &nonce); if (rc) fail ("read rep uint32"); printf ("new rep nonce: %x\n", nonce); if (nonce != 0x09575283) fail ("nonce mismatch high"); free (reqder); free (repder); shishi_asn1_done (handle, req); shishi_asn1_done (handle, rep); } shishi-1.0.2/tests/shishi.supp0000664000000000000000000001251212126660507013242 00000000000000# shishi.supp -- Valgrind suppresion file for Shishi. # Copyright (C) 2006-2013 Simon Josefsson # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. { known libgcrypt mem leak Memcheck:Leak fun:malloc obj:/usr/lib/libgcrypt.so.11.2.1 obj:/usr/lib/libgcrypt.so.11.2.1 fun:gcry_malloc obj:/usr/lib/libgcrypt.so.11.2.1 obj:/usr/lib/libgcrypt.so.11.2.1 obj:/usr/lib/libgcrypt.so.11.2.1 obj:/usr/lib/libgcrypt.so.11.2.1 fun:gcry_check_version fun:gnutls_global_init fun:_shishi_tls_init } { known libgcrypt mem leak Memcheck:Leak fun:malloc obj:/usr/lib/libgcrypt.so.11.2.1 fun:gcry_malloc fun:gcry_xmalloc fun:gcry_xcalloc obj:/usr/lib/libgcrypt.so.11.2.1 fun:gcry_randomize fun:gc_pseudo_random fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:_asn1_set_value fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:_asn1_add_node_only fun:_asn1_expand_object_id fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:strdup fun:_asn1_set_name fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:_asn1_add_node fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:_asn1_set_value fun:_asn1_change_integer_value fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:_asn1_set_value fun:_asn1_expand_object_id fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:calloc fun:_asn1_add_node fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:malloc fun:strdup fun:_asn1_set_name fun:_asn1_expand_object_id fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:calloc fun:_asn1_add_node_only fun:_asn1_expand_object_id fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { known gnutls mem leak Memcheck:Leak fun:calloc fun:_asn1_add_node fun:asn1_array2tree fun:gnutls_global_init fun:_shishi_tls_init } { gnutls leak Memcheck:Leak fun:malloc fun:gnutls_system_mutex_init fun:wrap_nettle_rnd_init fun:_gnutls_rnd_init fun:gnutls_global_init fun:_shishi_tls_init } { p11 leak Memcheck:Leak fun:malloc fun:hash_create fun:init_globals_unlocked fun:_p11_kit_initialize_registered_unlocked_reentrant fun:p11_kit_initialize_registered fun:gnutls_pkcs11_init fun:gnutls_global_init fun:_shishi_tls_init } { p11 leak Memcheck:Leak fun:malloc fun:hash_create fun:_p11_conf_parse_file fun:_p11_conf_load_globals fun:_p11_kit_initialize_registered_unlocked_reentrant fun:p11_kit_initialize_registered fun:gnutls_pkcs11_init fun:gnutls_global_init fun:_shishi_tls_init } { p11 leak Memcheck:Leak fun:calloc fun:hash_create fun:init_globals_unlocked fun:_p11_kit_initialize_registered_unlocked_reentrant fun:p11_kit_initialize_registered fun:gnutls_pkcs11_init fun:gnutls_global_init fun:_shishi_tls_init } { p11 leak Memcheck:Leak fun:calloc fun:hash_create fun:_p11_conf_parse_file fun:_p11_conf_load_globals fun:_p11_kit_initialize_registered_unlocked_reentrant fun:p11_kit_initialize_registered fun:gnutls_pkcs11_init fun:gnutls_global_init fun:_shishi_tls_init } { gcrypt leak Memcheck:Leak fun:malloc fun:do_malloc fun:_gcry_malloc fun:_gcry_module_add fun:pk_register_default fun:_gcry_pk_init fun:global_init fun:_gcry_vcontrol fun:gcry_control fun:gc_init fun:_shishi_crypto_init } { gnutls leak? Memcheck:Leak fun:realloc fun:_gnutls_ext_register fun:gnutls_global_init fun:_shishi_tls_init } { gcrypt leak Memcheck:Leak fun:malloc fun:do_malloc fun:_gcry_malloc fun:_gcry_module_add fun:md_register_default fun:_gcry_md_init fun:global_init fun:_gcry_vcontrol fun:gcry_control fun:gc_init fun:_shishi_crypto_init } { gcrypt leak? Memcheck:Leak fun:malloc fun:do_malloc fun:_gcry_malloc fun:_gcry_xmalloc fun:_gcry_xcalloc fun:initialize fun:_gcry_rngcsprng_randomize fun:gc_pseudo_random fun:shishi_randomize fun:shishi_authenticator } { gcrypt leak? Memcheck:Leak fun:malloc fun:do_malloc fun:_gcry_malloc fun:_gcry_xmalloc fun:_gcry_xcalloc fun:initialize fun:_gcry_rngcsprng_randomize fun:gc_pseudo_random fun:shishi_randomize fun:shishi_authenticator } { gcrypt leak? Memcheck:Leak fun:malloc fun:do_malloc fun:_gcry_malloc fun:_gcry_module_add fun:cipher_register_default fun:_gcry_cipher_init fun:global_init fun:_gcry_vcontrol fun:gcry_control fun:gc_init fun:_shishi_crypto_init } shishi-1.0.2/tests/ccache.c0000664000000000000000000000331212126660507012412 00000000000000/* ccache.c --- Self test MIT ccache file readers. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" #define EXPECT 2 void test (Shishi * handle) { Shishi_tkts *tkts; const char *ccache = getenv ("CCACHE1"); int rc; if (!ccache) ccache = "ccache1.bin"; rc = shishi_tkts_from_ccache_file (handle, ccache, &tkts); if (rc != SHISHI_OK) fail ("shishi_tkts_from_ccache_file() failed (%d)\n", rc); if (shishi_tkts_size (tkts) != EXPECT) fail ("shishi_tkts_size() failed (%d!=%d)\n", shishi_tkts_size (tkts), EXPECT); rc = shishi_tkts_write (tkts, stdout); if (rc != SHISHI_OK) fail ("shishi_tkts_write() failed (%d)\n", rc); rc = shishi_tkts_print (tkts, stdout); if (rc != SHISHI_OK) fail ("shishi_tkts_print() failed (%d)\n", rc); { Shishi_tkt *tkt; size_t i = 0; while ((tkt = shishi_tkts_nth (tkts, i++)) != NULL) shishi_tkt_done (tkt); } shishi_tkts_done (&tkts); } shishi-1.0.2/tests/crypto.c0000664000000000000000000005337612126660507012543 00000000000000/* crypto.c --- Shishi crypto self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" struct drdk { int type; const char *key; int nusage; const char *usage; const char *dr; const char *dk; }; const struct drdk drdk[] = { #if WITH_3DES {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\xd3\xf8\x29\x8c\xcb\x16\x64\x38\xdc\xb9\xb9\x3e" "\xe5\xa7\x62\x92\x86\xa4\x91\xf8\x38\xf8\x02\xfb", 8, "kerberos", "\x22\x70\xdb\x56\x5d\x2a\x3d\x64\xcf\xbf" "\xdc\x53\x05\xd4\xf7\x78\xa6\xde\x42\xd9\xda", "\x23\x70\xda\x57\x5d\x2a\x3d\xa8\x64\xce\xbf\xdc" "\x52\x04\xd5\x6d\xf7\x79\xa7\xdf\x43\xd9\xda\x43"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\xdc\xe0\x6b\x1f\x64\xc8\x57\xa1\x1c\x3d\xb5\x7c" "\x51\x89\x9b\x2c\xc1\x79\x10\x08\xce\x97\x3b\x92", 5, "\x00\x00\x00\x01\x55", "\x93\x50\x79\xd1\x44\x90\xa7\x5c\x30\x93" "\xc4\xa6\xe8\xc3\xb0\x49\xc7\x1e\x6e\xe7\x05", "\x92\x51\x79\xd0\x45\x91\xa7\x9b\x5d\x31\x92\xc4" "\xa7\xe9\xc2\x89\xb0\x49\xc7\x1f\x6e\xe6\x04\xcd"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x5e\x13\xd3\x1c\x70\xef\x76\x57\x46\x57\x85\x31" "\xcb\x51\xc1\x5b\xf1\x1c\xa8\x2c\x97\xce\xe9\xf2", 5, "\x00\x00\x00\x01\xaa", "\x9f\x58\xe5\xa0\x47\xd8\x94\x10\x1c\x46" "\x98\x45\xd6\x7a\xe3\xc5\x24\x9e\xd8\x12\xf2", "\x9e\x58\xe5\xa1\x46\xd9\x94\x2a\x10\x1c\x46\x98" "\x45\xd6\x7a\x20\xe3\xc4\x25\x9e\xd9\x13\xf2\x07"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x98\xe6\xfd\x8a\x04\xa4\xb6\x85\x9b\x75\xa1\x76" "\x54\x0b\x97\x52\xba\xd3\xec\xd6\x10\xa2\x52\xbc", 5, "\x00\x00\x00\x01\x55", "\x12\xff\xf9\x0c\x77\x3f\x95\x6d\x13\xfc" "\x2c\xa0\xd0\x84\x03\x49\xdb\xd3\x99\x08\xeb", "\x13\xfe\xf8\x0d\x76\x3e\x94\xec\x6d\x13\xfd\x2c" "\xa1\xd0\x85\x07\x02\x49\xda\xd3\x98\x08\xea\xbf"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x62\x2a\xec\x25\xa2\xfe\x2c\xad\x70\x94\x68\x0b" "\x7c\x64\x94\x02\x80\x08\x4c\x1a\x7c\xec\x92\xb5", 5, "\x00\x00\x00\x01\xaa", "\xf8\xde\xbf\x05\xb0\x97\xe7\xdc\x06\x03" "\x68\x6a\xca\x35\xd9\x1f\xd9\xa5\x51\x6a\x70", "\xf8\xdf\xbf\x04\xb0\x97\xe6\xd9\xdc\x07\x02\x68" "\x6b\xcb\x34\x89\xd9\x1f\xd9\xa4\x51\x6b\x70\x3e"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\xc1\x08\x16\x49\xad\xa7\x43\x62\xe6\xa1\x45\x9d" "\x01\xdf\xd3\x0d\x67\xc2\x23\x4c\x94\x07\x04\xda", 5, "\x00\x00\x00\x01\x55", "\x34\x80\x56\xec\x98\xfc\xc5\x17\x17\x1d" "\x2b\x4d\x7a\x94\x93\xaf\x48\x2d\x99\x91\x75", "\x34\x80\x57\xec\x98\xfd\xc4\x80\x16\x16\x1c\x2a" "\x4c\x7a\x94\x3e\x92\xae\x49\x2c\x98\x91\x75\xf7"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x5d\x15\x4a\xf2\x38\xf4\x67\x13\x15\x57\x19\xd5" "\x5e\x2f\x1f\x79\x0d\xd6\x61\xf2\x79\xa7\x91\x7c", 5, "\x00\x00\x00\x01\xaa", "\xa8\x81\x8b\xc3\x67\xda\xda\xcb\xe9\xa6" "\xc8\x46\x27\xfb\x60\xc2\x94\xb0\x12\x15\xe5", "\xa8\x80\x8a\xc2\x67\xda\xda\x3d\xcb\xe9\xa7\xc8" "\x46\x26\xfb\xc7\x61\xc2\x94\xb0\x13\x15\xe5\xc1"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x79\x85\x62\xe0\x49\x85\x2f\x57\xdc\x8c\x34\x3b" "\xa1\x7f\x2c\xa1\xd9\x73\x94\xef\xc8\xad\xc4\x43", 5, "\x00\x00\x00\x01\x55", "\xc8\x13\xf8\x8b\x3b\xe2\xb2\xf7\x54\x24" "\xce\x91\x75\xfb\xc8\x48\x3b\x88\xc8\x71\x3a", "\xc8\x13\xf8\x8a\x3b\xe3\xb3\x34\xf7\x54\x25\xce" "\x91\x75\xfb\xe3\xc8\x49\x3b\x89\xc8\x70\x3b\x49"}, {SHISHI_DES3_CBC_HMAC_SHA1_KD, "\x26\xdc\xe3\x34\xb5\x45\x29\x2f\x2f\xea\xb9\xa8" "\x70\x1a\x89\xa4\xb9\x9e\xb9\x94\x2c\xec\xd0\x16", 5, "\x00\x00\x00\x01\xaa", "\xf5\x8e\xfc\x6f\x83\xf9\x3e\x55\xe6\x95" "\xfd\x25\x2c\xf8\xfe\x59\xf7\xd5\xba\x37\xec", "\xf4\x8f\xfd\x6e\x83\xf8\x3e\x73\x54\xe6\x94\xfd" "\x25\x2c\xf8\x3b\xfe\x58\xf7\xd5\xba\x37\xec\x5d"} #endif }; struct nfold { int n; const char *in; const char *out; }; const struct nfold nfold[] = { {64, "012345", "\xBE\x07\x26\x31\x27\x6B\x19\x55"}, {56, "password", "\x78\xA0\x7B\x6C\xAF\x85\xFA"}, {64, "Rough Consensus, and Running Code", "\xBB\x6E\xD3\x08\x70\xB7\xF0\xE0"}, {168, "password", "\x59\xE4\xA8\xCA\x7C\x03\x85\xC3\xC3\x7B" "\x3F\x6D\x20\x00\x24\x7C\xB6\xE6\xBD\x5B\x3E"}, {192, "MASSACHVSETTS INSTITVTE OF TECHNOLOGY", "\xDB\x3B\x0D\x8F\x0B\x06\x1E\x60\x32\x82\xB3\x08" "\xA5\x08\x41\x22\x9A\xD7\x98\xFA\xB9\x54\x0C\x1B"}, {64, "kerberos", "\x6b\x65\x72\x62\x65\x72\x6f\x73"}, {128, "kerberos", "\x6b\x65\x72\x62\x65\x72\x6f\x73\x7b\x9b\x5b\x2b\x93\x13\x2b\x93"}, {168, "kerberos", "\x83\x72\xc2\x36\x34\x4e\x5f\x15\x50\xcd" "\x07\x47\xe1\x5d\x62\xca\x7a\x5a\x3b\xce\xa4"}, {256, "kerberos", "\x6b\x65\x72\x62\x65\x72\x6f\x73\x7b\x9b\x5b\x2b\x93\x13\x2b\x93" "\x5c\x9b\xdc\xda\xd9\x5c\x98\x99\xc4\xca\xe4\xde\xe6\xd6\xca\xe4"}, {168, "Q", "\x51\x8a\x54\xa2\x15\xa8\x45\x2a\x51\x8a" "\x54\xa2\x15\xa8\x45\x2a\x51\x8a\x54\xa2\x15"}, {192, "Q", "\x51\x8a\x54\xa2\x15\xa8\x45\x2a\x51\x8a\x54\xa2" "\x15\xa8\x45\x2a\x51\x8a\x54\xa2\x15\xa8\x45\x2a"}, {168, "ab", "\xba\x24\xcf\x29\x7f\x49\xf5\x4b\xab\x62" "\x5d\x12\xe7\x94\x3f\xa4\xfb\x25\xd5\x31\xae"}, {192, "ab", "\x61\x62\x0b\x13\x58\x98\xc4\xc2\x26\x16\x30\xb1" "\x85\x89\x2c\x4c\x62\x61\x13\x0b\x98\x58\xc2\xc4"} }; struct str2key { const char *password; const char *salt; const char *key; int etype; const char *parameters; }; const struct str2key str2key[] = { #define ESZETT "\xC3\x9F" #define S_CARON "\xC5\xA1" #define C_ACUTE "\xC4\x87" #define G_CLEF "\xF0\x9D\x84\x9E" #if WITH_DES {"password", "ATHENA.MIT.EDUraeburn", "\xCB\xC2\x2F\xAE\x23\x52\x98\xE3", SHISHI_DES_CBC_MD5, NULL}, {"potatoe", "WHITEHOUSE.GOVdanny", "\xDF\x3D\x32\xA7\x4F\xD9\x2A\x01", SHISHI_DES_CBC_MD5, NULL}, {"\xF0\x9D\x84\x9E", "EXAMPLE.COMpianist", "\x4F\xFB\x26\xBA\xB0\xCD\x94\x13", SHISHI_DES_CBC_MD5, NULL}, {ESZETT, "ATHENA.MIT.EDUJuri" S_CARON "i" C_ACUTE, "\x62\xC8\x1A\x52\x32\xB5\xE6\x9D", SHISHI_DES_CBC_MD5, NULL}, {"11119999", "AAAAAAAA", "\x98\x40\x54\xD0\xF1\xA7\x3E\x31", SHISHI_DES_CBC_MD5, NULL}, {"NNNN6666", "FFFFAAAA", "\xC4\xBF\x6B\x25\xAD\xF7\xA4\xF8", SHISHI_DES_CBC_MD5, NULL}, #endif #if WITH_3DES {"password", "ATHENA.MIT.EDUraeburn", "\x85\x0b\xb5\x13\x58\x54\x8c\xd0\x5e\x86\x76\x8c" "\x31\x3e\x3b\xfe\xf7\x51\x19\x37\xdc\xf7\x2c\x3e", SHISHI_DES3_CBC_HMAC_SHA1_KD, NULL}, {"potatoe", "WHITEHOUSE.GOVdanny", "\xdf\xcd\x23\x3d\xd0\xa4\x32\x04\xea\x6d\xc4\x37" "\xfb\x15\xe0\x61\xb0\x29\x79\xc1\xf7\x4f\x37\x7a", SHISHI_DES3_CBC_HMAC_SHA1_KD, NULL}, {"penny", "EXAMPLE.COMbuckaroo", "\x6d\x2f\xcd\xf2\xd6\xfb\xbc\x3d\xdc\xad\xb5\xda" "\x57\x10\xa2\x34\x89\xb0\xd3\xb6\x9d\x5d\x9d\x4a", SHISHI_DES3_CBC_HMAC_SHA1_KD, NULL}, {ESZETT, "ATHENA.MIT.EDUJuri" S_CARON "i" C_ACUTE, "\x16\xd5\xa4\x0e\x1c\xe3\xba\xcb\x61\xb9\xdc\xe0" "\x04\x70\x32\x4c\x83\x19\x73\xa7\xb9\x52\xfe\xb0", SHISHI_DES3_CBC_HMAC_SHA1_KD, NULL}, {G_CLEF, "EXAMPLE.COMpianist", "\x85\x76\x37\x26\x58\x5d\xbc\x1c\xce\x6e\xc4\x3e" "\x1f\x75\x1f\x07\xf1\xc4\xcb\xb0\x98\xf4\x0b\x19", SHISHI_DES3_CBC_HMAC_SHA1_KD, NULL}, #endif #if WITH_AES {"password", "ATHENA.MIT.EDUraeburn", "\x42\x26\x3c\x6e\x89\xf4\xfc\x28\xb8\xdf\x68\xee\x09\x79\x9f\x15", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x00\x01"}, {"password", "ATHENA.MIT.EDUraeburn", "\xfe\x69\x7b\x52\xbc\x0d\x3c\xe1\x44\x32\xba\x03\x6a\x92\xe6\x5b" "\xbb\x52\x28\x09\x90\xa2\xfa\x27\x88\x39\x98\xd7\x2a\xf3\x01\x61", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x00\x01"}, {"password", "ATHENA.MIT.EDUraeburn", "\xc6\x51\xbf\x29\xe2\x30\x0a\xc2\x7f\xa4\x69\xd6\x93\xbd\xda\x13", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x00\x02"}, {"password", "ATHENA.MIT.EDUraeburn", "\xa2\xe1\x6d\x16\xb3\x60\x69\xc1\x35\xd5\xe9\xd2\xe2\x5f\x89\x61" "\x02\x68\x56\x18\xb9\x59\x14\xb4\x67\xc6\x76\x22\x22\x58\x24\xff", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x00\x02"}, {"password", "ATHENA.MIT.EDUraeburn", "\x4c\x01\xcd\x46\xd6\x32\xd0\x1e\x6d\xbe\x23\x0a\x01\xed\x64\x2a", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {"password", "ATHENA.MIT.EDUraeburn", "\x55\xa6\xac\x74\x0a\xd1\x7b\x48\x46\x94\x10\x51\xe1\xe8\xb0\xa7" "\x54\x8d\x93\xb0\xab\x30\xa8\xbc\x3f\xf1\x62\x80\x38\x2b\x8c\x2a", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {"password", "\x12\x34\x56\x78\x78\x56\x34\x12", "\xe9\xb2\x3d\x52\x27\x37\x47\xdd\x5c\x35\xcb\x55\xbe\x61\x9d\x8e", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x00\x05"}, {"password", "\x12\x34\x56\x78\x78\x56\x34\x12", "\x97\xa4\xe7\x86\xbe\x20\xd8\x1a\x38\x2d\x5e\xbc\x96\xd5\x90\x9c" "\xab\xcd\xad\xc8\x7c\xa4\x8f\x57\x45\x04\x15\x9f\x16\xc3\x6e\x31", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x00\x05"}, {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", "\x59\xd1\xbb\x78\x9a\x82\x8b\x1a\xa5\x4e\xf9\xc2\x88\x3f\x69\xed", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", "\x89\xad\xee\x36\x08\xdb\x8b\xc7\x1f\x1b\xfb\xfe\x45\x94\x86\xb0" "\x56\x18\xb7\x0c\xba\xe2\x20\x92\x53\x4e\x56\xc5\x53\xba\x4b\x34", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", "\xcb\x80\x05\xdc\x5f\x90\x17\x9a\x7f\x02\x10\x4c\x00\x18\x75\x1d", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", "\xd7\x8c\x5c\x9c\xb8\x72\xa8\xc9\xda\xd4\x69\x7f\x0b\xb5\xb2\xd2" "\x14\x96\xc8\x2b\xeb\x2c\xae\xda\x21\x12\xfc\xee\xa0\x57\x40\x1b", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x04\xB0"}, {G_CLEF, "EXAMPLE.COMpianist", "\xf1\x49\xc1\xf2\xe1\x54\xa7\x34\x52\xd4\x3e\x7f\xe6\x2a\x56\xe5", SHISHI_AES128_CTS_HMAC_SHA1_96, "\x00\x00\x00\x32"}, {G_CLEF, "EXAMPLE.COMpianist", "\x4b\x6d\x98\x39\xf8\x44\x06\xdf\x1f\x09\xcc\x16\x6d\xb4\xb8\x3c" "\x57\x18\x48\xb7\x84\xa3\xd6\xbd\xc3\x46\x58\x9a\x3e\x39\x3f\x9e", SHISHI_AES256_CTS_HMAC_SHA1_96, "\x00\x00\x00\x32"}, #endif #if WITH_ARCFOUR {"foo", "", "\xac\x8e\x65\x7f\x83\xdf\x82\xbe\xea\x5d\x43\xbd\xaf\x78\x00\xcc", SHISHI_ARCFOUR_HMAC, NULL} #endif }; struct pkcs5 { int iterations; const char *password; const char *salt; int dklen; const char *expected; }; const struct pkcs5 pkcs5[] = { {1, "password", "ATHENA.MIT.EDUraeburn", 16, "\xCD\xED\xB5\x28\x1B\xB2\xF8\x01\x56\x5A\x11\x22\xB2\x56\x35\x15"}, {2, "password", "ATHENA.MIT.EDUraeburn", 16, "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d"}, {2, "password", "ATHENA.MIT.EDUraeburn", 32, "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d" "\xa0\x53\x78\xb9\x32\x44\xec\x8f\x48\xa9\x9e\x61\xad\x79\x9d\x86"}, {1200, "password", "ATHENA.MIT.EDUraeburn", 16, "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b"}, {1200, "password", "ATHENA.MIT.EDUraeburn", 32, "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b" "\xa7\xe5\x2d\xdb\xc5\xe5\x14\x2f\x70\x8a\x31\xe2\xe6\x2b\x1e\x13"}, {5, "password", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 16, "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49"}, {5, "password", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 32, "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49" "\x3f\x98\xd2\x03\xe6\xbe\x49\xa6\xad\xf4\xfa\x57\x4b\x6e\x64\xee"}, {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 16, "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9"}, {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 32, "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9" "\xc5\xec\x59\xf1\xa4\x52\xf5\xcc\x9a\xd9\x40\xfe\xa0\x59\x8e\xd1"}, {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 16, "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61"}, {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 32, "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61" "\x1a\x8b\x4d\x28\x26\x01\xdb\x3b\x36\xbe\x92\x46\x91\x5e\xc8\x2a"}, {50, G_CLEF "\x00", "EXAMPLE.COMpianist", 16, "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39"}, {50, G_CLEF "\x00", "EXAMPLE.COMpianist", 32, "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39" "\xe7\xfe\x37\xa0\xc4\x1e\x02\xc2\x81\xff\x30\x69\xe1\xe9\x4f\x52"}, {500, "All n-entities must communicate with other n-entities via n-1 " "entiteeheehees", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 16, "\x6A\x89\x70\xBF\x68\xC9\x2C\xAE\xA8\x4A\x8D\xF2\x85\x10\x85\x86"} }; void test (Shishi * handle) { Shishi_key *key, *key2; char out[BUFSIZ]; size_t i; int res; char *salt; if (debug) shishi_cfg (handle, strdup ("verbose-crypto,verbose-crypto-noise")); res = shishi_cipher_parse ("3des"); if (res != SHISHI_DES3_CBC_HMAC_SHA1_KD) fail ("shishi_cipher_parse (\"3des\") == %d\n", res); res = shishi_derive_default_salt (handle, "foo@BAR", &salt); if (res != SHISHI_OK) fail ("shishi_derive_default_salt failed %d\n", res); if (strcmp (salt, "BARfoo") != 0) fail ("shishi_derive_default_salt comparison failed %s\n", salt); res = shishi_derive_default_salt (handle, "foo/bar@BAR", &salt); if (res != SHISHI_OK) fail ("shishi_derive_default_salt failed %d\n", res); if (strcmp (salt, "BARfoobar") != 0) fail ("shishi_derive_default_salt comparison failed %s\n", salt); for (i = 0; i < sizeof (drdk) / sizeof (drdk[0]); i++) { if (debug) printf ("DR entry %d\n", i); res = shishi_key_from_value (handle, drdk[i].type, drdk[i].key, &key); if (res == SHISHI_OK) res = shishi_dr (handle, key, drdk[i].usage, drdk[i].nusage, out, strlen (drdk[i].dr)); shishi_key_done (key); if (res != SHISHI_OK) { fail ("shishi_dr() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("DR(%s, key, usage)\n", shishi_cipher_name (drdk[i].type)); printf ("key:\n"); escapeprint (drdk[i].key, strlen (drdk[i].key)); hexprint (drdk[i].key, strlen (drdk[i].key)); puts (""); binprint (drdk[i].key, strlen (drdk[i].key)); puts (""); printf ("usage:\n"); escapeprint (drdk[i].usage, drdk[i].nusage); hexprint (drdk[i].usage, drdk[i].nusage); puts (""); binprint (drdk[i].usage, drdk[i].nusage); puts (""); printf ("computed DR:\n"); escapeprint (out, strlen (drdk[i].dr)); hexprint (out, strlen (drdk[i].dr)); puts (""); binprint (out, strlen (drdk[i].dr)); puts (""); printf ("expected DR:\n"); escapeprint (drdk[i].dr, strlen (drdk[i].dr)); hexprint (drdk[i].dr, strlen (drdk[i].dr)); puts (""); binprint (drdk[i].dr, strlen (drdk[i].dr)); puts (""); } if (memcmp (drdk[i].dr, out, strlen (drdk[i].dr)) != 0) { fail ("shishi_dr() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); res = shishi_key_from_value (handle, drdk[i].type, drdk[i].key, &key); if (res == SHISHI_OK) res = shishi_key_from_value (handle, drdk[i].type, NULL, &key2); if (res == SHISHI_OK) res = shishi_dk (handle, key, drdk[i].usage, drdk[i].nusage, key2); shishi_key_done (key); if (res != SHISHI_OK) { fail ("shishi_dk() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("DK(%s, key, usage)\n", shishi_cipher_name (drdk[i].type)); printf ("key:\n"); escapeprint (drdk[i].key, strlen (drdk[i].key)); hexprint (drdk[i].key, strlen (drdk[i].key)); puts (""); binprint (drdk[i].key, strlen (drdk[i].key)); puts (""); printf ("usage:\n"); escapeprint (drdk[i].usage, drdk[i].nusage); hexprint (drdk[i].usage, drdk[i].nusage); puts (""); binprint (drdk[i].usage, drdk[i].nusage); puts (""); printf ("computed DK:\n"); escapeprint (shishi_key_value (key2), shishi_key_length (key2)); hexprint (shishi_key_value (key2), shishi_key_length (key2)); puts (""); binprint (shishi_key_value (key2), shishi_key_length (key2)); puts (""); printf ("expected DK:\n"); escapeprint (drdk[i].dk, strlen (drdk[i].dk)); hexprint (drdk[i].dk, strlen (drdk[i].dk)); puts (""); binprint (drdk[i].dk, strlen (drdk[i].dk)); puts (""); } if (!(shishi_key_length (key2) == strlen (drdk[i].dk) && memcmp (drdk[i].dk, shishi_key_value (key2), strlen (drdk[i].dk)) == 0)) { fail ("shishi_dk() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); shishi_key_done (key2); } for (i = 0; i < sizeof (nfold) / sizeof (nfold[0]); i++) { if (debug) printf ("N-FOLD entry %d\n", i); res = shishi_n_fold (handle, nfold[i].in, strlen (nfold[i].in), out, nfold[i].n / 8); if (res != SHISHI_OK) { fail ("shishi_n_fold() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("in:\n"); escapeprint (nfold[i].in, strlen (nfold[i].in)); hexprint (nfold[i].in, strlen (nfold[i].in)); puts (""); binprint (nfold[i].in, strlen (nfold[i].in)); puts (""); printf ("out:\n"); escapeprint (out, nfold[i].n / 8); hexprint (out, nfold[i].n / 8); puts (""); binprint (out, nfold[i].n / 8); puts (""); printf ("expected out:\n"); escapeprint (nfold[i].out, nfold[i].n / 8); hexprint (nfold[i].out, nfold[i].n / 8); puts (""); binprint (nfold[i].out, nfold[i].n / 8); puts (""); } if (memcmp (nfold[i].out, out, nfold[i].n / 8) != 0) { fail ("shishi_n_fold() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); } for (i = 0; i < sizeof (str2key) / sizeof (str2key[0]); i++) { int n_password = strlen (str2key[i].password); int saltlen = strlen (str2key[i].salt); int keylen = sizeof (key); const char *name = shishi_cipher_name (str2key[i].etype); if (debug) printf ("STRING-TO-KEY entry %d (key type %s)\n", i, name ? name : "NO NAME"); res = shishi_key_from_string (handle, str2key[i].etype, str2key[i].password, n_password, str2key[i].salt, saltlen, str2key[i].parameters, &key); if (res != SHISHI_OK) { fail ("shishi_string_to_key() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("password:\n"); escapeprint (str2key[i].password, n_password); hexprint (str2key[i].password, n_password); puts (""); binprint (str2key[i].password, n_password); puts (""); printf ("salt:\n"); escapeprint (str2key[i].salt, saltlen); hexprint (str2key[i].salt, saltlen); puts (""); binprint (str2key[i].salt, saltlen); puts (""); printf ("computed key:\n"); escapeprint (shishi_key_value (key), shishi_key_length (key)); hexprint (shishi_key_value (key), shishi_key_length (key)); puts (""); binprint (shishi_key_value (key), shishi_key_length (key)); puts (""); printf ("expected key:\n"); escapeprint (str2key[i].key, strlen (str2key[i].key)); hexprint (str2key[i].key, strlen (str2key[i].key)); puts (""); binprint (str2key[i].key, strlen (str2key[i].key)); puts (""); } if (memcmp (str2key[i].key, shishi_key_value (key), keylen) != 0) { fail ("shishi_string_to_key() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); shishi_key_done (key); } for (i = 0; i < sizeof (pkcs5) / sizeof (pkcs5[0]); i++) { if (debug) printf ("PKCS5 entry %d\n", i); res = shishi_pbkdf2_sha1 (handle, pkcs5[i].password, strlen (pkcs5[i].password), pkcs5[i].salt, strlen (pkcs5[i].salt), pkcs5[i].iterations, pkcs5[i].dklen, out); if (res != SHISHI_OK) { fail ("PKCS5 entry %d failed fatally: %d\n", i, res); continue; } if (debug) { printf ("password:\n"); escapeprint (pkcs5[i].password, strlen (pkcs5[i].password)); hexprint (pkcs5[i].password, strlen (pkcs5[i].password)); puts (""); binprint (pkcs5[i].password, strlen (pkcs5[i].password)); puts (""); printf ("salt:\n"); escapeprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); hexprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); puts (""); binprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); puts (""); printf ("computed key:\n"); escapeprint (out, pkcs5[i].dklen); hexprint (out, pkcs5[i].dklen); puts (""); binprint (out, pkcs5[i].dklen); puts (""); printf ("expected key:\n"); escapeprint (pkcs5[i].expected, pkcs5[i].dklen); hexprint (pkcs5[i].expected, pkcs5[i].dklen); puts (""); binprint (pkcs5[i].expected, pkcs5[i].dklen); puts (""); } if (memcmp (pkcs5[i].expected, out, pkcs5[i].dklen) != 0) { fail ("PKCS5 entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); } } shishi-1.0.2/tests/gztime.c0000664000000000000000000000275612126660507012516 00000000000000/* gztime.c --- Shishi generalized time self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" void test (Shishi * handle) { const char *p; int n; /* shishi_authenticator_ctime_set() */ p = shishi_generalize_time (handle, (time_t) 4711); if (debug) escapeprint (p, 15); if (p && memcmp (p, "19700101011831Z", 15) == 0) success ("shishi_generalize_time() OK\n"); else fail ("shishi_generalize_time() failed\n"); /* shishi_generalize_ctime() */ n = (int) shishi_generalize_ctime (handle, p); if (debug) printf ("shishi_generalize_ctime () => `%d'.\n", n); if (n == 4711) success ("shishi_generalize_ctime() OK\n"); else fail ("shishi_generalize_ctime() failed\n"); } shishi-1.0.2/tests/Makefile.in0000644000000000000000000016663512126772725013133 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = authenticator$(EXEEXT) crypto$(EXEEXT) \ gztime$(EXEEXT) priv$(EXEEXT) safe$(EXEEXT) ticketset$(EXEEXT) \ crypto-ctx$(EXEEXT) low-crypto$(EXEEXT) rijndael$(EXEEXT) \ key$(EXEEXT) keytab$(EXEEXT) ccache$(EXEEXT) nonce$(EXEEXT) \ passwdpromptcb$(EXEEXT) multiname$(EXEEXT) subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libutils_la_LIBADD = am_libutils_la_OBJECTS = utils.lo libutils_la_OBJECTS = $(am_libutils_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent authenticator_SOURCES = authenticator.c authenticator_OBJECTS = authenticator.$(OBJEXT) authenticator_LDADD = $(LDADD) authenticator_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la ccache_SOURCES = ccache.c ccache_OBJECTS = ccache.$(OBJEXT) ccache_LDADD = $(LDADD) ccache_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la crypto_SOURCES = crypto.c crypto_OBJECTS = crypto.$(OBJEXT) crypto_LDADD = $(LDADD) crypto_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la crypto_ctx_SOURCES = crypto-ctx.c crypto_ctx_OBJECTS = crypto-ctx.$(OBJEXT) crypto_ctx_LDADD = $(LDADD) crypto_ctx_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la gztime_SOURCES = gztime.c gztime_OBJECTS = gztime.$(OBJEXT) gztime_LDADD = $(LDADD) gztime_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la key_SOURCES = key.c key_OBJECTS = key.$(OBJEXT) key_LDADD = $(LDADD) key_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la keytab_SOURCES = keytab.c keytab_OBJECTS = keytab.$(OBJEXT) keytab_LDADD = $(LDADD) keytab_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la low_crypto_SOURCES = low-crypto.c low_crypto_OBJECTS = low-crypto.$(OBJEXT) low_crypto_LDADD = $(LDADD) low_crypto_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la multiname_SOURCES = multiname.c multiname_OBJECTS = multiname.$(OBJEXT) multiname_LDADD = $(LDADD) multiname_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la nonce_SOURCES = nonce.c nonce_OBJECTS = nonce.$(OBJEXT) nonce_LDADD = $(LDADD) nonce_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la passwdpromptcb_SOURCES = passwdpromptcb.c passwdpromptcb_OBJECTS = passwdpromptcb.$(OBJEXT) passwdpromptcb_LDADD = $(LDADD) passwdpromptcb_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la priv_SOURCES = priv.c priv_OBJECTS = priv.$(OBJEXT) priv_LDADD = $(LDADD) priv_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la rijndael_SOURCES = rijndael.c rijndael_OBJECTS = rijndael.$(OBJEXT) rijndael_LDADD = $(LDADD) rijndael_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la safe_SOURCES = safe.c safe_OBJECTS = safe.$(OBJEXT) safe_LDADD = $(LDADD) safe_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la libutils.la ticketset_SOURCES = ticketset.c ticketset_OBJECTS = ticketset.$(OBJEXT) ticketset_LDADD = $(LDADD) ticketset_DEPENDENCIES = ../gl/libgnu.la ../lib/libshishi.la \ libutils.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libutils_la_SOURCES) authenticator.c ccache.c crypto.c \ crypto-ctx.c gztime.c key.c keytab.c low-crypto.c multiname.c \ nonce.c passwdpromptcb.c priv.c rijndael.c safe.c ticketset.c DIST_SOURCES = $(libutils_la_SOURCES) authenticator.c ccache.c \ crypto.c crypto-ctx.c gztime.c key.c keytab.c low-crypto.c \ multiname.c nonce.c passwdpromptcb.c priv.c rijndael.c safe.c \ ticketset.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = shisa.sh shishi.supp keytab1.bin ccache1.bin AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl \ -I$(top_srcdir)/lib -I../lib AM_LDFLAGS = -no-install LDADD = @LTLIBINTL@ ../gl/libgnu.la @LTLIBTASN1@ @LTLIBGNUTLS@ \ ../lib/libshishi.la libutils.la noinst_LTLIBRARIES = libutils.la libutils_la_SOURCES = utils.h utils.c TESTS = $(check_PROGRAMS) TESTS_ENVIRONMENT = \ KEYTAB1=$(srcdir)/keytab1.bin \ CCACHE1=$(srcdir)/ccache1.bin \ $(VALGRIND) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libutils.la: $(libutils_la_OBJECTS) $(libutils_la_DEPENDENCIES) $(EXTRA_libutils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libutils_la_OBJECTS) $(libutils_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list authenticator$(EXEEXT): $(authenticator_OBJECTS) $(authenticator_DEPENDENCIES) $(EXTRA_authenticator_DEPENDENCIES) @rm -f authenticator$(EXEEXT) $(AM_V_CCLD)$(LINK) $(authenticator_OBJECTS) $(authenticator_LDADD) $(LIBS) ccache$(EXEEXT): $(ccache_OBJECTS) $(ccache_DEPENDENCIES) $(EXTRA_ccache_DEPENDENCIES) @rm -f ccache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ccache_OBJECTS) $(ccache_LDADD) $(LIBS) crypto$(EXEEXT): $(crypto_OBJECTS) $(crypto_DEPENDENCIES) $(EXTRA_crypto_DEPENDENCIES) @rm -f crypto$(EXEEXT) $(AM_V_CCLD)$(LINK) $(crypto_OBJECTS) $(crypto_LDADD) $(LIBS) crypto-ctx$(EXEEXT): $(crypto_ctx_OBJECTS) $(crypto_ctx_DEPENDENCIES) $(EXTRA_crypto_ctx_DEPENDENCIES) @rm -f crypto-ctx$(EXEEXT) $(AM_V_CCLD)$(LINK) $(crypto_ctx_OBJECTS) $(crypto_ctx_LDADD) $(LIBS) gztime$(EXEEXT): $(gztime_OBJECTS) $(gztime_DEPENDENCIES) $(EXTRA_gztime_DEPENDENCIES) @rm -f gztime$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gztime_OBJECTS) $(gztime_LDADD) $(LIBS) key$(EXEEXT): $(key_OBJECTS) $(key_DEPENDENCIES) $(EXTRA_key_DEPENDENCIES) @rm -f key$(EXEEXT) $(AM_V_CCLD)$(LINK) $(key_OBJECTS) $(key_LDADD) $(LIBS) keytab$(EXEEXT): $(keytab_OBJECTS) $(keytab_DEPENDENCIES) $(EXTRA_keytab_DEPENDENCIES) @rm -f keytab$(EXEEXT) $(AM_V_CCLD)$(LINK) $(keytab_OBJECTS) $(keytab_LDADD) $(LIBS) low-crypto$(EXEEXT): $(low_crypto_OBJECTS) $(low_crypto_DEPENDENCIES) $(EXTRA_low_crypto_DEPENDENCIES) @rm -f low-crypto$(EXEEXT) $(AM_V_CCLD)$(LINK) $(low_crypto_OBJECTS) $(low_crypto_LDADD) $(LIBS) multiname$(EXEEXT): $(multiname_OBJECTS) $(multiname_DEPENDENCIES) $(EXTRA_multiname_DEPENDENCIES) @rm -f multiname$(EXEEXT) $(AM_V_CCLD)$(LINK) $(multiname_OBJECTS) $(multiname_LDADD) $(LIBS) nonce$(EXEEXT): $(nonce_OBJECTS) $(nonce_DEPENDENCIES) $(EXTRA_nonce_DEPENDENCIES) @rm -f nonce$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nonce_OBJECTS) $(nonce_LDADD) $(LIBS) passwdpromptcb$(EXEEXT): $(passwdpromptcb_OBJECTS) $(passwdpromptcb_DEPENDENCIES) $(EXTRA_passwdpromptcb_DEPENDENCIES) @rm -f passwdpromptcb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(passwdpromptcb_OBJECTS) $(passwdpromptcb_LDADD) $(LIBS) priv$(EXEEXT): $(priv_OBJECTS) $(priv_DEPENDENCIES) $(EXTRA_priv_DEPENDENCIES) @rm -f priv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(priv_OBJECTS) $(priv_LDADD) $(LIBS) rijndael$(EXEEXT): $(rijndael_OBJECTS) $(rijndael_DEPENDENCIES) $(EXTRA_rijndael_DEPENDENCIES) @rm -f rijndael$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rijndael_OBJECTS) $(rijndael_LDADD) $(LIBS) safe$(EXEEXT): $(safe_OBJECTS) $(safe_DEPENDENCIES) $(EXTRA_safe_DEPENDENCIES) @rm -f safe$(EXEEXT) $(AM_V_CCLD)$(LINK) $(safe_OBJECTS) $(safe_LDADD) $(LIBS) ticketset$(EXEEXT): $(ticketset_OBJECTS) $(ticketset_DEPENDENCIES) $(EXTRA_ticketset_DEPENDENCIES) @rm -f ticketset$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ticketset_OBJECTS) $(ticketset_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authenticator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-ctx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gztime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/low-crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiname.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonce.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passwdpromptcb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/priv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ticketset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/tests/utils.c0000664000000000000000000000767712126660507012366 00000000000000/* utils.c --- Shishi self tests utilities. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "utils.h" const char *program_name = PACKAGE; int debug = 0; int error_count = 0; int break_on_error = 0; void fail (const char *format, ...) { va_list arg_ptr; va_start (arg_ptr, format); vfprintf (stderr, format, arg_ptr); va_end (arg_ptr); error_count++; if (break_on_error) exit (EXIT_FAILURE); } void success (const char *format, ...) { va_list arg_ptr; va_start (arg_ptr, format); if (debug) vfprintf (stdout, format, arg_ptr); va_end (arg_ptr); } void escapeprint (const char *str, size_t len) { size_t i; printf (" (length %d bytes):\n\t", len); for (i = 0; i < len; i++) { if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') || ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') || ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9') || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.') printf ("%c", (str[i] & 0xFF)); else printf ("\\x%02X", (str[i] & 0xFF)); if ((i + 1) % 16 == 0 && (i + 1) < len) printf ("'\n\t'"); } printf ("\n"); } void hexprint (const char *str, size_t len) { size_t i; printf ("\t;; "); for (i = 0; i < len; i++) { printf ("%02x ", (str[i] & 0xFF)); if ((i + 1) % 8 == 0) printf (" "); if ((i + 1) % 16 == 0 && i + 1 < len) printf ("\n\t;; "); } printf ("\n"); } void binprint (const char *str, size_t len) { size_t i; printf ("\t;; "); for (i = 0; i < len; i++) { printf ("%d%d%d%d%d%d%d%d ", (str[i] & 0xFF) & 0x80 ? 1 : 0, (str[i] & 0xFF) & 0x40 ? 1 : 0, (str[i] & 0xFF) & 0x20 ? 1 : 0, (str[i] & 0xFF) & 0x10 ? 1 : 0, (str[i] & 0xFF) & 0x08 ? 1 : 0, (str[i] & 0xFF) & 0x04 ? 1 : 0, (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0); if ((i + 1) % 3 == 0) printf (" "); if ((i + 1) % 6 == 0 && i + 1 < len) printf ("\n\t;; "); } printf ("\n"); } int main (int argc, char *argv[]) { Shishi *handle; do if (strcmp (argv[argc - 1], "-v") == 0 || strcmp (argv[argc - 1], "--verbose") == 0) debug = 1; else if (strcmp (argv[argc - 1], "-b") == 0 || strcmp (argv[argc - 1], "--break-on-error") == 0) break_on_error = 1; else if (strcmp (argv[argc - 1], "-h") == 0 || strcmp (argv[argc - 1], "-?") == 0 || strcmp (argv[argc - 1], "--help") == 0) { printf ("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n", argv[0]); return 1; } while (argc-- > 1); handle = shishi (); if (handle == NULL) { fail ("Could not initialize shishi\n"); return 1; } if (debug) { shishi_cfg (handle, strdup ("verbose")); shishi_cfg (handle, strdup ("verbose-noise")); shishi_cfg (handle, strdup ("verbose-asn1")); shishi_cfg (handle, strdup ("verbose-crypto")); shishi_cfg (handle, strdup ("verbose-crypto-noise")); } test (handle); shishi_done (handle); if (debug) printf ("Self test `%s' finished with %d errors\n", argv[0], error_count); return error_count ? 1 : 0; } shishi-1.0.2/tests/keytab.c0000664000000000000000000000377512126660507012500 00000000000000/* keytab.c --- Self test MIT keytab file readers. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" #include "read-file.h" void test (Shishi * handle) { Shishi_keys *keys; const Shishi_key *key; const char *keytab = getenv ("KEYTAB1"); char *data, *data2; size_t len, len2; int rc; int keyno = 0; if (!keytab) keytab = "keytab1.bin"; data = read_binary_file (keytab, &len); if (data == NULL) fail ("cannot read keytab file %s", keytab); rc = shishi_keys_from_keytab_mem (handle, data, len, &keys); if (rc != SHISHI_OK) fail ("shishi_keys_from_keytab_mem() failed (%d)\n", rc); if (shishi_keys_size (keys) != 6) fail ("shishi_keys_size() failed (%d)\n", shishi_keys_size (keys)); if (debug) { while ((key = shishi_keys_nth (keys, keyno++)) != NULL) { rc = shishi_key_print (handle, stdout, key); if (rc != SHISHI_OK) fail ("shishi_key_print() failed (%d)\n", rc); } } rc = shishi_keys_to_keytab_mem (handle, keys, &data2, &len2); if (rc != SHISHI_OK) fail ("shishi_keys_to_keytab_mem() failed (%d)\n", rc); if (len != len2 || memcmp (data, data2, len) != 0) fail ("memory comparison failed\n"); shishi_keys_done (&keys); free (data); free (data2); } shishi-1.0.2/tests/authenticator.c0000664000000000000000000002673012126660507014067 00000000000000/* authenticator.c --- Shishi authenticator self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" static const char authenticator[] = { '\x62', '\x4b', '\x30', '\x49', '\xa0', '\x03', '\x02', '\x01', '\x05', '\xa1', '\x05', '\x1b', '\x03', '\x62', '\x61', '\x72', '\xa2', '\x10', '\x30', '\x0e', '\xa0', '\x03', '\x02', '\x01', '\x00', '\xa1', '\x07', '\x30', '\x05', '\x1b', '\x03', '\x66', '\x6f', '\x6f', '\xa4', '\x04', '\x02', '\x02', '\x12', '\x67', '\xa5', '\x11', '\x18', '\x0f', '\x31', '\x39', '\x37', '\x30', '\x30', '\x31', '\x30', '\x31', '\x30', '\x31', '\x31', '\x38', '\x33', '\x31', '\x5a', '\xa8', '\x10', '\x30', '\x0e', '\x30', '\x0c', '\xa0', '\x03', '\x02', '\x01', '\x2a', '\xa1', '\x05', '\x04', '\x03', '\x62', '\x61', '\x7a' }; static const char authenticator2[] = { '\x62', '\x39', '\x30', '\x37', '\xa0', '\x03', '\x02', '\x01', '\x05', '\xa1', '\x05', '\x1b', '\x03', '\x62', '\x61', '\x72', '\xa2', '\x10', '\x30', '\x0e', '\xa0', '\x03', '\x02', '\x01', '\x00', '\xa1', '\x07', '\x30', '\x05', '\x1b', '\x03', '\x66', '\x6f', '\x6f', '\xa4', '\x04', '\x02', '\x02', '\x12', '\x67', '\xa5', '\x11', '\x18', '\x0f', '\x31', '\x39', '\x37', '\x30', '\x30', '\x31', '\x30', '\x31', '\x30', '\x31', '\x31', '\x38', '\x33', '\x31', '\x5a' }; #define AUTHENTICATOR_LEN 77 #define AUTHENTICATOR2_LEN 59 void test (Shishi * handle) { Shishi_asn1 a; char *p, *buf, *buf2; int res; size_t n, m; int32_t t; uint32_t s; /* shishi_authenticator */ a = shishi_authenticator (handle); if (debug) printf ("shishi_authenticator () => `%p'.\n", a); if (a) success ("shishi_authenticator() OK\n"); else fail ("shishi_authenticator() failed\n"); if (debug) shishi_authenticator_print (handle, stdout, a); res = shishi_authenticator_remove_subkey (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_remove_subkey() OK\n"); else fail ("shishi_authenticator_remove_subkey() failed\n"); /* shishi_authenticator_seqnumber_get */ res = shishi_authenticator_seqnumber_get (handle, a, &s); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_get() OK\n"); else fail ("shishi_authenticator_seqnumber_get() failed\n"); /* shishi_authenticator_seqnumber_set */ res = shishi_authenticator_seqnumber_set (handle, a, 42); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_set() OK\n"); else fail ("shishi_authenticator_seqnumber_set() failed\n"); /* shishi_authenticator_seqnumber_get */ res = shishi_authenticator_seqnumber_get (handle, a, &s); if (res == SHISHI_OK && s == 42) success ("shishi_authenticator_seqnumber_get() OK\n"); else fail ("shishi_authenticator_seqnumber_get() failed\n"); /* shishi_authenticator_seqnumber_remove */ res = shishi_authenticator_seqnumber_remove (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_remove() OK\n"); else fail ("shishi_authenticator_seqnumber_remove() failed\n"); /* shishi_authenticator_set_crealm */ res = shishi_authenticator_set_crealm (handle, a, "foo"); if (res == SHISHI_OK) success ("shishi_authenticator_set_crealm() OK\n"); else fail ("shishi_authenticator_set_crealm() failed\n"); /* shishi_authenticator_client_set */ res = shishi_authenticator_client_set (handle, a, "foo/bar/baz"); if (res == SHISHI_OK) success ("shishi_authenticator_client_set() OK\n"); else fail ("shishi_authenticator_client_set() failed\n"); /* shishi_authenticator_client */ res = shishi_authenticator_client (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo/bar/baz") && memcmp (buf, "foo/bar/baz", n) == 0) success ("shishi_authenticator_client() OK\n"); else fail ("shishi_authenticator_client() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_client_set */ res = shishi_authenticator_client_set (handle, a, "foo"); if (res == SHISHI_OK) success ("shishi_authenticator_client_set() OK\n"); else fail ("shishi_authenticator_client_set() failed\n"); /* shishi_authenticator_client */ res = shishi_authenticator_client (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo") && memcmp (buf, "foo", n) == 0) success ("shishi_authenticator_client() OK\n"); else fail ("shishi_authenticator_client() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_set_crealm */ res = shishi_authenticator_set_crealm (handle, a, "bar"); if (res == SHISHI_OK) success ("shishi_authenticator_set_crealm() OK\n"); else fail ("shishi_authenticator_set_crealm() failed\n"); /* shishi_authenticator_clientrealm */ res = shishi_authenticator_clientrealm (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo@bar") && memcmp (buf, "foo@bar", n) == 0) success ("shishi_authenticator_clientrealm() OK\n"); else fail ("shishi_authenticator_clientrealm() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_add_authorizationdata */ res = shishi_authenticator_add_authorizationdata (handle, a, 42, "baz", 3); if (res == SHISHI_OK) success ("shishi_authenticator_add_authorizationdata() OK\n"); else fail ("shishi_authenticator_add_authorizationdata() failed\n"); /* shishi_authenticator_authorizationdata */ res = shishi_authenticator_authorizationdata (handle, a, &t, &buf, &m, 1); if (debug) escapeprint (buf, m); if (res == SHISHI_OK && t == 42 && m == 3 && memcmp (buf, "baz", 3) == 0) success ("shishi_authenticator_authorizationdata() OK\n"); else fail ("shishi_authenticator_authorizationdata() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_authorizationdata */ res = shishi_authenticator_authorizationdata (handle, a, &t, &buf, &m, 2); if (res == SHISHI_OK) free (buf); if (res == SHISHI_OUT_OF_RANGE) success ("shishi_authenticator_authorizationdata() OK\n"); else fail ("shishi_authenticator_authorizationdata() failed\n"); /* shishi_authenticator_remove_cksum */ res = shishi_authenticator_remove_cksum (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_remove_cksum() OK\n"); else fail ("shishi_authenticator_remove_cksum() failed\n"); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); /* shishi_authenticator_to_file */ res = shishi_authenticator_to_file (handle, a, SHISHI_FILETYPE_TEXT, "authenticator.tmp"); if (res == SHISHI_OK) success ("shishi_authenticator_to_file() OK\n"); else fail ("shishi_authenticator_to_file() failed\n"); /* shishi_asn1_done */ shishi_asn1_done (handle, a); success ("shishi_asn1_done() OK\n"); a = NULL; /* shishi_authenticator_from_file */ res = shishi_authenticator_from_file (handle, &a, SHISHI_FILETYPE_TEXT, "authenticator.tmp"); if (res == SHISHI_OK) success ("shishi_authenticator_from_file() OK\n"); else fail ("shishi_authenticator_from_file() failed\n"); if (debug) { /* shishi_authenticator_print */ res = shishi_authenticator_print (handle, stdout, a); if (res == SHISHI_OK) success ("shishi_authenticator_print() OK\n"); else fail ("shishi_authenticator_print() failed\n"); } /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf2, &m); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); /* Compare DER encodings of authenticators */ if (n > 0 && m > 0 && n == m && memcmp (buf, buf2, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); free (buf2); /* shishi_authenticator_cusec_set */ res = shishi_authenticator_cusec_set (handle, a, 4711); if (res == SHISHI_OK) success ("shishi_authenticator_cusec_set() OK\n"); else fail ("shishi_authenticator_cusec_set() failed\n"); /* shishi_authenticator_cusec_get */ res = shishi_authenticator_cusec_get (handle, a, &s); if (debug) printf ("shishi_authenticator_cusec_get () => `%d'.\n", t); if (res == SHISHI_OK && s == 4711) success ("shishi_authenticator_cusec_get() OK\n"); else fail ("shishi_authenticator_cusec_get() failed\n"); /* shishi_authenticator_ctime_set */ res = shishi_authenticator_ctime_set (handle, a, "19700101011831Z"); if (res == SHISHI_OK) success ("shishi_authenticator_ctime_set() OK\n"); else fail ("shishi_authenticator_ctime_set() failed\n"); /* shishi_authenticator_ctime */ res = shishi_authenticator_ctime (handle, a, &p); if (debug) escapeprint (p, strlen (p)); if (res == SHISHI_OK && memcmp (p, "19700101011831Z", 15) == 0) success ("shishi_authenticator_ctime() OK\n"); else fail ("shishi_authenticator_ctime() failed\n"); if (res == SHISHI_OK) free (p); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); if (debug) { shishi_authenticator_print (handle, stdout, a); hexprint (buf, n); puts (""); hexprint (authenticator, sizeof (authenticator)); puts (""); } if (n == sizeof (authenticator) && n == AUTHENTICATOR_LEN && memcmp (authenticator, buf, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); /* shishi_authenticator_clear_authorizationdata */ res = shishi_authenticator_clear_authorizationdata (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_clear_authorizationdata() OK\n"); else fail ("shishi_authenticator_clear_authorizationdata() failed\n"); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); if (debug) { shishi_authenticator_print (handle, stdout, a); hexprint (buf, n); puts (""); hexprint (authenticator2, sizeof (authenticator2)); puts (""); } if (n == sizeof (authenticator2) && n == AUTHENTICATOR2_LEN && memcmp (authenticator2, buf, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); /* unlink */ res = unlink ("authenticator.tmp"); if (res == 0) success ("unlink() OK\n"); else fail ("unlink() failed\n"); /* shishi_asn1_done */ shishi_asn1_done (handle, a); success ("shishi_asn1_done() OK\n"); } shishi-1.0.2/tests/keytab1.bin0000664000000000000000000000067012015626624013075 00000000000000=DOPIO.JOSEFSSON.ORGhostlatteDw¥h;h,Jb=DOPIO.JOSEFSSON.ORGhostlatteDw¥h;h,Jb=DOPIO.JOSEFSSON.ORGhostlatteDw¥h;h,JbUDOPIO.JOSEFSSON.ORGhostlatteDw¥ O3¡Òœü—«{fÜ&ƶ´ý˜ÿùOD±5hy÷È>½ñMDOPIO.JOSEFSSON.ORGhostlatteDw¥1^›¶Eì”ÎÍ«RæÂ|ž&RãaþÙÙEDOPIO.JOSEFSSON.ORGhostlatteDw¥J‰ŒkäÉea½œw…ÿ!shishi-1.0.2/tests/rijndael.c0000664000000000000000000001035612126660507013002 00000000000000/* rijndael.c --- Shishi AES crypto self tests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "utils.c" #define IVLEN 16 #define KEY "chicken teriyaki" #define IN "I would like the General Gau's Chicken, please, and wonton soup." #define ZERO "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" static struct { const char *key; size_t keylen; const char *iv; const char *in; size_t inlen; const char *out; size_t outlen; const char *nextiv; } tv[] = { { KEY, 16, ZERO, IN, 17, "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f\x97", 17, "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"}, { KEY, 16, ZERO, IN, 31, "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22" "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5", 31, "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22"}, { KEY, 16, ZERO, IN, 32, "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84", 32, "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"}, { KEY, 16, ZERO, IN, 47, "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e" "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5", 47, "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e"}, { KEY, 16, ZERO, IN, 48, "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8" "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8", 48, "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"}, { KEY, 16, ZERO, IN, 64, "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" "\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40" "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8", 64, "\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"} }; void test (Shishi * handle) { char *out, *ivout; size_t i; int err; if (debug) shishi_cfg (handle, strdup ("verbose-crypto")); for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++) { err = shishi_aes_cts (handle, 0, tv[i].key, tv[i].keylen, tv[i].iv, &ivout, tv[i].in, tv[i].inlen, &out); if (debug) { printf ("input:\n"); hexprint (tv[i].in, tv[i].inlen); printf ("output:\n"); hexprint (out, tv[i].inlen); if (memcmp (out, tv[i].out, tv[i].outlen) != 0) { printf ("expected output:\n"); hexprint (tv[i].out, tv[i].outlen); } printf ("iv out:\n"); hexprint (ivout, IVLEN); if (memcmp (ivout, tv[i].nextiv, IVLEN) != 0) { printf ("expected iv out:\n"); hexprint (tv[i].nextiv, IVLEN); } } if (err) fail ("shishi_aes_cts(%d) failed: %d\n", i, err); else { if (memcmp (out, tv[i].out, tv[i].outlen) == 0) success ("shishi_aes_cts(%d) OK\n", i); else fail ("shishi_aes_cts(%d) failure\n", i); if (memcmp (ivout, tv[i].nextiv, IVLEN) == 0) success ("shishi_aes_cts(%d) IV OK\n", i); else fail ("shishi_aes_cts(%d) failure IV\n", i); free (out); free (ivout); } } } shishi-1.0.2/ChangeLog0000644000000000000000000212561312126773311011457 000000000000002013-04-03 Simon Josefsson * NEWS: Version 1.0.2. 2013-04-03 Simon Josefsson * cfg.mk: Copy devhelp2 file. 2013-04-03 Simon Josefsson * configure.ac: Drop AC_COPYRIGHT, it is just one more place to keep updated. 2013-04-03 Simon Josefsson * Makefile.am, NEWS, README, README-alpha, asn1/Makefile.am, asn1/README, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/errors.h, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h, asn1/version.c, configure.ac: Drop internal minitasn1 copy. 2013-04-03 Simon Josefsson * extra/pam_shishi/Makefile.am: Add libtool -shared when building pam_shishi. Suggested by Russ Allbery . 2013-04-03 Simon Josefsson * doc/Makefile.am: Generated. 2012-08-22 Mats Erik Andersson * configure.ac, lib/resolv.c: Locate res_query and libresolv. For portability res_query must be searched in libc, and in libresolv. The latter need not even exist on systems such as BSD. Signed-off-by: Simon Josefsson 2013-04-03 Simon Josefsson * .gitignore: Ignore more. 2012-10-26 Mats Erik Andersson * lib/principal.c, lib/tkts.c: Documentation update. Signed-off-by: Simon Josefsson 2012-10-05 Mats Erik Andersson * examples/Makefile.am, extra/pam_shishi/Makefile.am, extra/rsh-redone/Makefile.am: Inclusion paths for out-of-tree. Signed-off-by: Simon Josefsson 2013-04-03 Simon Josefsson * lib/asn1.c: Don't use deprecated libtasn1 features. 2013-04-03 Simon Josefsson * configure.ac: Require automake 1.11 or later. Drop automake -Werror. 2013-03-23 Mats Erik Andersson * configure.ac, doc/Makefile.am: Port to recent automake. Signed-off-by: Simon Josefsson 2013-04-03 Simon Josefsson * po/LINGUAS, po/sr.po.in: Sync with TP. 2013-04-03 Simon Josefsson * cfg.mk, doc/shishi.texi, lib/internal.h, src/shishid.c: Fix syntax-check nits. 2013-04-03 Simon Josefsson * .clcopying, AUTHORS, ChangeLog, Makefile.am, NEWS, README, README-alpha, THANKS, asn1/Makefile.am, asn1/README, cfg.mk, configure.ac, db/Makefile.am, db/config.c, db/core.c, db/db.c, db/err.c, db/file.c, db/file.h, db/fileutil.c, db/fileutil.h, db/info.h, db/libshisa.map, db/setup.c, db/shisa.h, doc/Makefile.am, doc/ccache.txt, doc/cyclo/Makefile.am, doc/shishi.texi, examples/Makefile.am, examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, extra/Makefile.am, extra/README, extra/pam_shishi/Makefile.am, extra/rsh-redone/Makefile.am, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/ccache.c, lib/ccache.h, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/libshishi.map, lib/low-crypto.c, lib/low-crypto.h, lib/netio.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tktccache.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c, po/POTFILES.in, shisa.conf.in, shishi.conf.in, shishi.pc.in, shishi.skel.in, src/Makefile.am, src/ccache2shishi.c, src/ccache2shishi.ggo, src/kdc.c, src/kdc.h, src/keytab2shishi.c, src/keytab2shishi.ggo, src/resume.c, src/server.c, src/shisa.c, src/shisa.ggo, src/shishi.c, src/shishi.ggo, src/shishid.c, src/shishid.ggo, src/starttls.c, tests/Makefile.am, tests/authenticator.c, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/keytab.c, tests/low-crypto.c, tests/multiname.c, tests/nonce.c, tests/passwdpromptcb.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/shisa.sh, tests/shishi.supp, tests/ticketset.c, tests/utils.c, tests/utils.h: Bump copyright years. 2013-04-03 Simon Josefsson * GNUmakefile, build-aux/config.rpath, build-aux/gendocs.sh, build-aux/gnupload, build-aux/pmccabe2html, build-aux/snippet/arg-nonnull.h, build-aux/snippet/c++defs.h, build-aux/snippet/warn-on-use.h, build-aux/update-copyright, build-aux/useless-if-before-free, build-aux/vc-list-files, db/gl/allocator.h, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/careadlinkat.c, db/gl/careadlinkat.h, db/gl/gnulib.mk, db/gl/m4/00gnulib.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/gnulib-tool.m4, db/gl/m4/readlink.m4, db/gl/readlink.c, doc/fdl-1.3.texi, doc/gendocs_template, doc/parse-datetime.texi, gl/Makefile.am, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/bind.c, gl/c-ctype.c, gl/c-ctype.h, gl/close.c, gl/connect.c, gl/crc.c, gl/crc.h, gl/des.c, gl/des.h, gl/dosname.h, gl/dup2.c, gl/errno.in.h, gl/fcntl.c, gl/fcntl.in.h, gl/fd-hook.c, gl/fd-hook.h, gl/float+.h, gl/float.c, gl/float.in.h, gl/fseek.c, gl/fseeko.c, gl/fstat.c, gl/ftell.c, gl/ftello.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getdelim.c, gl/getdomainname.c, gl/getdtablesize.c, gl/gethostname.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/getpeername.c, gl/getsubopt.c, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/intprops.h, gl/itold.c, gl/lseek.c, gl/m4/00gnulib.m4, gl/m4/alloca.m4, gl/m4/arpa_inet_h.m4, gl/m4/autobuild.m4, gl/m4/base64.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/close.m4, gl/m4/dup2.m4, gl/m4/eealloc.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/exponentd.m4, gl/m4/extensions.m4, gl/m4/extern-inline.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl.m4, gl/m4/fcntl_h.m4, gl/m4/float_h.m4, gl/m4/fseek.m4, gl/m4/fseeko.m4, gl/m4/fstat.m4, gl/m4/ftell.m4, gl/m4/ftello.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc-md5.m4, gl/m4/gc-random.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdelim.m4, gl/m4/getdomainname.m4, gl/m4/getdtablesize.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/getsubopt.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/hostent.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/inline.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/largefile.m4, gl/m4/ld-output-def.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longlong.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/malloca.m4, gl/m4/manywarnings.m4, gl/m4/math_h.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/memchr.m4, gl/m4/memxor.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/mmap-anon.m4, gl/m4/msvc-inval.m4, gl/m4/msvc-nothrow.m4, gl/m4/multiarch.m4, gl/m4/netdb_h.m4, gl/m4/netinet_in_h.m4, gl/m4/off_t.m4, gl/m4/parse-datetime.m4, gl/m4/pathmax.m4, gl/m4/printf.m4, gl/m4/rawmemchr.m4, gl/m4/read-file.m4, gl/m4/realloc.m4, gl/m4/select.m4, gl/m4/servent.m4, gl/m4/setenv.m4, gl/m4/sha1.m4, gl/m4/signal_h.m4, gl/m4/size_max.m4, gl/m4/snprintf.m4, gl/m4/socketlib.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/ssize_t.m4, gl/m4/stat.m4, gl/m4/stdalign.m4, gl/m4/stdarg.m4, gl/m4/stdbool.m4, gl/m4/stddef_h.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/strverscmp.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/sys_types_h.m4, gl/m4/sys_uio_h.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/tm_gmtoff.m4, gl/m4/unistd_h.m4, gl/m4/valgrind-tests.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/warn-on-use.m4, gl/m4/warnings.m4, gl/m4/wchar_h.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/m4/xsize.m4, gl/m4/xstrndup.m4, gl/m4/xvasprintf.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memchr.c, gl/memxor.c, gl/memxor.h, gl/minmax.h, gl/mktime.c, gl/msvc-inval.c, gl/msvc-inval.h, gl/msvc-nothrow.c, gl/msvc-nothrow.h, gl/netdb.in.h, gl/netinet_in.in.h, gl/override/lib/gettext.h.diff, gl/parse-datetime.h, gl/parse-datetime.y, gl/pathmax.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/rawmemchr.c, gl/read-file.c, gl/read-file.h, gl/realloc.c, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/setenv.c, gl/sha1.c, gl/sha1.h, gl/shutdown.c, gl/signal.in.h, gl/size_max.h, gl/snprintf.c, gl/socket.c, gl/sockets.c, gl/sockets.h, gl/stat.c, gl/stdalign.in.h, gl/stdarg.in.h, gl/stdbool.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strdup.c, gl/strerror-override.c, gl/strerror-override.h, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strtok_r.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.c, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/sys_types.in.h, gl/sys_uio.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/timespec.c, gl/timespec.h, gl/unistd.c, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/verify.h, gl/w32sock.h, gl/wchar.in.h, gl/xalloc-oversized.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xsize.c, gl/xsize.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h, maint.mk, src/gl/errno.in.h, src/gl/error.c, src/gl/error.h, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/00gnulib.m4, src/gl/m4/errno_h.m4, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/gnulib-tool.m4, src/gl/m4/locale_h.m4, src/gl/m4/msvc-inval.m4, src/gl/m4/msvc-nothrow.m4, src/gl/m4/nocrash.m4, src/gl/m4/stddef_h.m4, src/gl/m4/strerror.m4, src/gl/m4/sys_socket_h.m4, src/gl/m4/version-etc.m4, src/gl/m4/warn-on-use.m4, src/gl/m4/wchar_t.m4, src/gl/msvc-inval.c, src/gl/msvc-inval.h, src/gl/msvc-nothrow.c, src/gl/msvc-nothrow.h, src/gl/progname.c, src/gl/progname.h, src/gl/stddef.in.h, src/gl/strerror-override.c, src/gl/strerror-override.h, src/gl/strerror.c, src/gl/verify.h, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2012-09-06 Simon Josefsson * NEWS: Add. 2012-09-06 Simon Josefsson * lib/realm.c: Fix warning. 2012-08-15 Mats Erik Andersson * src/shishid.c: shishid: Use single stacked AF_INET6 sockets. On dual stacked hosts, running an AF_INET6 wildcard socket blocks AF_INET wildcards. Make it single stacked using IPV6_V6ONLY instead. Signed-off-by: Simon Josefsson 2012-08-23 Mats Erik Andersson * lib/cfg.c, lib/init.c, lib/realm.c, shishi.conf.in: Configuration parsing of suboptions. The library call getsubopt() is not portable enough to rely on a catch all case `-1'. In particular, FreeBSD was not able to parse `kdc-realm=EX.ORG,localhost' at all. Signed-off-by: Simon Josefsson 2012-08-22 Mats Erik Andersson * doc/Makefile.am, lib/Makefile.am, src/Makefile.am: Portability issues for BSD make. Signed-off-by: Simon Josefsson 2012-08-18 Simon Josefsson * NEWS: Add. 2012-08-17 Simon Josefsson * NEWS, src/shishid.c: Use LOG_AUTH instead of LOG_AUTHPRIV. 2012-08-16 Simon Josefsson * NEWS, THANKS, src/shishid.c: Use LOG_AUTHPRIV for shishid. 2012-08-16 Simon Josefsson * NEWS: Doc fix. 2012-08-16 Simon Josefsson * lib/principal.c: Fix salt derivation, reported by Mats. 2012-08-16 Simon Josefsson * tests/crypto.c: Test shishi_derive_default_salt more, to catch regression. 2012-08-15 Simon Josefsson * lib/principal.c: Doc fix. 2012-08-15 Simon Josefsson * lib/encticketpart.c: Fix encticketpart cname encoding bug, reported by Mats. 2012-08-15 Simon Josefsson * tests/Makefile.am, tests/multiname.c: Check regression for encticketpart cname encoding bug. 2012-08-15 Simon Josefsson * lib/kdcrep.c: Doc fix. 2012-08-15 Simon Josefsson * src/shishid.c: Only use LOG_PERROR when verbose. 2012-08-15 Simon Josefsson * src/kdc.c: Drop useless syslog messages, based on report from Mats. 2012-08-15 Simon Josefsson * lib/error.c: Improve error messages. 2012-08-15 Simon Josefsson * lib/error.c: Improve error messages, from Mats. 2012-08-15 Simon Josefsson * lib/principal.c: Improve error messages, suggested by Mats. 2012-08-15 Simon Josefsson * lib/principal.c: Doc fix from Mats Erik Andersson . 2012-08-10 Simon Josefsson * configure.ac, doc/Makefile.am, lib/Makefile.am, lib/internal.h, lib/resolv.c: Improve res_query detection. Reported by Eray Aslan . 2012-07-02 Mats Erik Andersson * configure.ac, lib/resolv.c: Issues with libresolv. Some BSD variants must use before including . Additionally, res_query() is present in libc on most BSD systems. Signed-off-by: Simon Josefsson 2012-07-02 Mats Erik Andersson * doc/shishi.texi: shishi.texi: Grammar and spelling. Signed-off-by: Simon Josefsson 2012-08-07 Mats Erik Andersson * lib/principal.c: Support LOGNAME in guessing principals. Signed-off-by: Simon Josefsson 2012-08-07 Mats Erik Andersson * lib/cfg.c: Segfault in config list parsing. Signed-off-by: Simon Josefsson 2012-08-07 Mats Erik Andersson * lib/authorize.c: Authentication type k5login. Repair the completely broken k5login type for authentication of user access. Signed-off-by: Simon Josefsson 2012-06-11 Simon Josefsson * NEWS: Add. 2012-06-11 Simon Josefsson * configure.ac, lib/crypto-ctx.c, lib/diskio.c: Silence compiler warnings. 2012-06-11 Simon Josefsson * GNUmakefile, build-aux/gnupload, build-aux/snippet/_Noreturn.h, db/gl/m4/gnulib-common.m4, db/gl/m4/readlink.m4, gl/Makefile.am, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/c-ctype.c, gl/c-ctype.h, gl/des.c, gl/des.h, gl/errno.in.h, gl/fcntl.in.h, gl/float+.h, gl/fseeko.c, gl/fstat.c, gl/ftello.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getdelim.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/gettext.h, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/lseek.c, gl/m4/dup2.m4, gl/m4/errno_h.m4, gl/m4/fseeko.m4, gl/m4/fstat.m4, gl/m4/ftello.m4, gl/m4/gc.m4, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/largefile.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/manywarnings.m4, gl/m4/math_h.m4, gl/m4/mmap-anon.m4, gl/m4/off_t.m4, gl/m4/realloc.m4, gl/m4/setenv.m4, gl/m4/stat.m4, gl/m4/stdio_h.m4, gl/m4/strerror.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_types_h.m4, gl/m4/unistd_h.m4, gl/m4/warn-on-use.m4, gl/m4/warnings.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memxor.c, gl/memxor.h, gl/minmax.h, gl/mktime.c, gl/msvc-inval.c, gl/msvc-inval.h, gl/msvc-nothrow.c, gl/msvc-nothrow.h, gl/netdb.in.h, gl/netinet_in.in.h, gl/pathmax.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/read-file.c, gl/read-file.h, gl/select.c, gl/sha1.c, gl/sha1.h, gl/size_max.h, gl/snprintf.c, gl/stat.c, gl/stdalign.in.h, gl/stdarg.in.h, gl/stdbool.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strdup.c, gl/strerror-override.c, gl/strerror-override.h, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/sys_types.in.h, gl/sys_uio.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/unistd.in.h, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/wchar.in.h, gl/xsize.h, maint.mk, src/gl/errno.in.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/errno_h.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/locale_h.m4, src/gl/m4/strerror.m4, src/gl/m4/warn-on-use.m4, src/gl/msvc-inval.c, src/gl/msvc-inval.h, src/gl/msvc-nothrow.c, src/gl/msvc-nothrow.h, src/gl/stddef.in.h, src/gl/strerror-override.c, src/gl/strerror-override.h: Update gnulib files. 2012-06-11 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h, asn1/version.c, configure.ac, lib/shishi.h: Bump versions. Libtasn1 2.13. 2012-03-12 Simon Josefsson * ChangeLog: Generated. 2012-03-12 Simon Josefsson * NEWS: Version 1.0.1. 2012-03-12 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h, asn1/version.c: Use libtasn1 2.11. 2012-02-08 Simon Josefsson * NEWS: Mention fixes. 2012-02-08 Simon Josefsson * gl/m4/valgrind-tests.m4, gl/override/m4/valgrind-tests.m4.diff: Disable strict valgrind mem leak testing. 2012-02-08 Simon Josefsson * lib/diskio.c, lib/keytab.c, tests/authenticator.c, tests/ccache.c, tests/keytab.c, tests/shishi.supp: Fix memory leaks. 2012-02-08 Simon Josefsson * lib/starttls.c, src/starttls.c: Don't use obsolete GnuTLS interfaces. 2012-02-08 Simon Josefsson * COPYING: Sync file from gnulib. 2012-02-08 Simon Josefsson * .clcopying, AUTHORS, ChangeLog, Makefile.am, NEWS, README, README-alpha, THANKS, asn1/Makefile.am, asn1/README, build-aux/update-copyright, cfg.mk, configure.ac, db/Makefile.am, db/config.c, db/core.c, db/db.c, db/err.c, db/file.c, db/file.h, db/fileutil.c, db/fileutil.h, db/info.h, db/libshisa.map, db/setup.c, db/shisa.h, doc/Makefile.am, doc/ccache.txt, doc/cyclo/Makefile.am, doc/gpl-3.0.texi, doc/shishi.texi, examples/Makefile.am, examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, extra/Makefile.am, extra/README, extra/pam_shishi/Makefile.am, extra/pam_shishi/pam_shishi.c, extra/rsh-redone/Makefile.am, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/ccache.c, lib/ccache.h, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/libshishi.map, lib/low-crypto.c, lib/low-crypto.h, lib/netio.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tktccache.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c, po/POTFILES.in, shisa.conf.in, shishi.conf.in, shishi.pc.in, shishi.skel.in, src/Makefile.am, src/ccache2shishi.c, src/ccache2shishi.ggo, src/kdc.c, src/kdc.h, src/keytab2shishi.c, src/keytab2shishi.ggo, src/resume.c, src/server.c, src/shisa.c, src/shisa.ggo, src/shishi.c, src/shishi.ggo, src/shishid.c, src/shishid.ggo, src/starttls.c, tests/Makefile.am, tests/authenticator.c, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/keytab.c, tests/low-crypto.c, tests/nonce.c, tests/passwdpromptcb.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/shisa.sh, tests/shishi.supp, tests/ticketset.c, tests/utils.c, tests/utils.h: Update copyright headers. 2012-02-08 Simon Josefsson * GNUmakefile, build-aux/config.rpath, build-aux/gnupload, build-aux/pmccabe.css, build-aux/pmccabe2html, build-aux/snippet/arg-nonnull.h, build-aux/snippet/c++defs.h, build-aux/snippet/warn-on-use.h, build-aux/useless-if-before-free, build-aux/vc-list-files, db/gl/allocator.h, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/careadlinkat.c, db/gl/careadlinkat.h, db/gl/gnulib.mk, db/gl/m4/00gnulib.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/gnulib-tool.m4, db/gl/m4/readlink.m4, db/gl/readlink.c, doc/fdl-1.3.texi, doc/gendocs_template, doc/parse-datetime.texi, gl/Makefile.am, gl/alloca.c, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/bind.c, gl/c-ctype.c, gl/c-ctype.h, gl/close.c, gl/connect.c, gl/crc.c, gl/crc.h, gl/des.c, gl/des.h, gl/dosname.h, gl/dup2.c, gl/errno.in.h, gl/fcntl.c, gl/fcntl.in.h, gl/fd-hook.c, gl/fd-hook.h, gl/float+.h, gl/float.c, gl/float.in.h, gl/fseek.c, gl/fseeko.c, gl/fstat.c, gl/ftell.c, gl/ftello.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getdelim.c, gl/getdomainname.c, gl/getdtablesize.c, gl/gethostname.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/getpeername.c, gl/getsubopt.c, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/intprops.h, gl/itold.c, gl/lseek.c, gl/m4/00gnulib.m4, gl/m4/alloca.m4, gl/m4/arpa_inet_h.m4, gl/m4/autobuild.m4, gl/m4/base64.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/close.m4, gl/m4/dup2.m4, gl/m4/eealloc.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/exponentd.m4, gl/m4/extensions.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl.m4, gl/m4/fcntl_h.m4, gl/m4/float_h.m4, gl/m4/fseek.m4, gl/m4/fseeko.m4, gl/m4/fstat.m4, gl/m4/ftell.m4, gl/m4/ftello.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc-md5.m4, gl/m4/gc-random.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdelim.m4, gl/m4/getdomainname.m4, gl/m4/getdtablesize.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/getsubopt.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/hostent.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/inline.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/largefile.m4, gl/m4/ld-output-def.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longlong.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/malloca.m4, gl/m4/manywarnings.m4, gl/m4/math_h.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/memchr.m4, gl/m4/memxor.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/mmap-anon.m4, gl/m4/msvc-inval.m4, gl/m4/msvc-nothrow.m4, gl/m4/multiarch.m4, gl/m4/netdb_h.m4, gl/m4/netinet_in_h.m4, gl/m4/parse-datetime.m4, gl/m4/pathmax.m4, gl/m4/printf.m4, gl/m4/rawmemchr.m4, gl/m4/read-file.m4, gl/m4/realloc.m4, gl/m4/select.m4, gl/m4/servent.m4, gl/m4/setenv.m4, gl/m4/sha1.m4, gl/m4/signal_h.m4, gl/m4/size_max.m4, gl/m4/snprintf.m4, gl/m4/socketlib.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/ssize_t.m4, gl/m4/stat.m4, gl/m4/stdalign.m4, gl/m4/stdarg.m4, gl/m4/stdbool.m4, gl/m4/stddef_h.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/strverscmp.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/sys_types_h.m4, gl/m4/sys_uio_h.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/tm_gmtoff.m4, gl/m4/unistd_h.m4, gl/m4/valgrind-tests.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/warn-on-use.m4, gl/m4/warnings.m4, gl/m4/wchar_h.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/m4/xsize.m4, gl/m4/xstrndup.m4, gl/m4/xvasprintf.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memchr.c, gl/memxor.c, gl/memxor.h, gl/minmax.h, gl/mktime.c, gl/msvc-inval.c, gl/msvc-inval.h, gl/msvc-nothrow.c, gl/msvc-nothrow.h, gl/netdb.in.h, gl/netinet_in.in.h, gl/parse-datetime.h, gl/parse-datetime.y, gl/pathmax.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/rawmemchr.c, gl/read-file.c, gl/read-file.h, gl/realloc.c, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/setenv.c, gl/sha1.c, gl/sha1.h, gl/shutdown.c, gl/signal.in.h, gl/size_max.h, gl/snprintf.c, gl/socket.c, gl/sockets.c, gl/sockets.h, gl/stat.c, gl/stdalign.in.h, gl/stdarg.in.h, gl/stdbool.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strdup.c, gl/strerror-override.c, gl/strerror-override.h, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strtok_r.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/sys_types.in.h, gl/sys_uio.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/timespec.h, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/verify.h, gl/w32sock.h, gl/wchar.in.h, gl/xalloc-oversized.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xsize.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h, maint.mk, src/gl/errno.in.h, src/gl/error.c, src/gl/error.h, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/00gnulib.m4, src/gl/m4/errno_h.m4, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/gnulib-tool.m4, src/gl/m4/locale_h.m4, src/gl/m4/msvc-inval.m4, src/gl/m4/msvc-nothrow.m4, src/gl/m4/nocrash.m4, src/gl/m4/stddef_h.m4, src/gl/m4/strerror.m4, src/gl/m4/sys_socket_h.m4, src/gl/m4/version-etc.m4, src/gl/m4/warn-on-use.m4, src/gl/m4/wchar_t.m4, src/gl/msvc-inval.c, src/gl/msvc-inval.h, src/gl/msvc-nothrow.c, src/gl/msvc-nothrow.h, src/gl/progname.c, src/gl/progname.h, src/gl/stddef.in.h, src/gl/strerror-override.c, src/gl/strerror-override.h, src/gl/strerror.c, src/gl/verify.h, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2011-11-22 Simon Josefsson * cfg.mk, extra/pam_shishi/pam_shishi.c: Fix compiler warning. 2011-11-22 Simon Josefsson * doc/specifications/draft-altman-telnet-rfc2941bis-00.txt, doc/specifications/draft-altman-telnet-rfc2942bis-00.txt, doc/specifications/draft-brezak-win2k-krb-authz-01.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-00.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-01.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-02.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-03.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-04.txt, doc/specifications/draft-hornstein-dhc-kerbauth-02.txt, doc/specifications/draft-horowitz-key-derivation-01.txt, doc/specifications/draft-ietf-cat-iakerb-04.txt, doc/specifications/draft-ietf-cat-iakerb-08.txt, doc/specifications/draft-ietf-cat-kerb-chg-password-02.txt, doc/specifications/draft-ietf-cat-kerb-des3-hmac-sha1-00.txt, doc/specifications/draft-ietf-cat-kerb-key-derivation-00.txt, doc/specifications/draft-ietf-cat-kerberos-anoncred-00.txt, doc/specifications/draft-ietf-cat-kerberos-err-msg-00.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-00.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-01.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-02.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-03.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-00.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-02.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-03.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-00.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-05.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-06.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-07.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-08.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-05.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-06.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-07.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-08.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-09.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-10.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-11.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-12.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-13.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-14.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-15.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-16.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-17.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-18.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-19.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-20.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-21.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-22.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-23.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-24.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-25.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-26.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-27.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-28.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-29.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-30.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-31.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-32.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-33.txt, doc/specifications/draft-ietf-cat-kerberos-pk-recovery-00.txt, doc/specifications/draft-ietf-cat-kerberos-pk-recovery-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-04.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-00.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-01.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-03.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-04.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-05.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-06.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-07.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-08.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-09.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-10.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-11.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-00.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-01.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-02.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-03.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-04.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-05.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-06.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-00.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-01.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-02.txt, doc/specifications/draft-ietf-cat-krb5-firewalls-00.txt, doc/specifications/draft-ietf-cat-krb5-ipv6-00.txt, doc/specifications/draft-ietf-cat-krb5-tcp-00.txt, doc/specifications/draft-ietf-johansson-krb-model-00.txt, doc/specifications/draft-ietf-kink-kink-06.txt, doc/specifications/draft-ietf-kink-kink-07.txt, doc/specifications/draft-ietf-kink-kink-09.txt, doc/specifications/draft-ietf-kink-kink-10.txt, doc/specifications/draft-ietf-kitten-gssapi-domain-based-names-02.t xt, doc/specifications/draft-ietf-krb-wg-anon-01.txt, doc/specifications/draft-ietf-krb-wg-anon-02.txt, doc/specifications/draft-ietf-krb-wg-anon-03.txt, doc/specifications/draft-ietf-krb-wg-anon-04.txt, doc/specifications/draft-ietf-krb-wg-cross-problem-statement-00.txt , doc/specifications/draft-ietf-krb-wg-cross-problem-statement-01.txt , doc/specifications/draft-ietf-krb-wg-crypto-01.txt, doc/specifications/draft-ietf-krb-wg-crypto-02.txt, doc/specifications/draft-ietf-krb-wg-crypto-03.txt, doc/specifications/draft-ietf-krb-wg-crypto-04.txt, doc/specifications/draft-ietf-krb-wg-crypto-05.txt, doc/specifications/draft-ietf-krb-wg-crypto-06.txt, doc/specifications/draft-ietf-krb-wg-crypto-07.txt, doc/specifications/draft-ietf-krb-wg-gss-cb-hash-agility-01.txt, doc/specifications/draft-ietf-krb-wg-gss-cb-hash-agility-02.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-01.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-02.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-03.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-00.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-01.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-02.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-03.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-04.txt, doc/specifications/draft-ietf-krb-wg-info-ascii-gen-string-00.txt, doc/specifications/draft-ietf-krb-wg-kdc-model-00.txt, doc/specifications/draft-ietf-krb-wg-kdc-model-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-00.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-01.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-02.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-03.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-04.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-05.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-06.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-07.txt , doc/specifications/draft-ietf-krb-wg-kerberos-referrals-00.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-02.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-03.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-04.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-05.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-06.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-07.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-08.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-09.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-00.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-02.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-03.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-00.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-02.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-03.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-04.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-05.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-06.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-07.txt, doc/specifications/draft-ietf-krb-wg-krb-dns-locate-02.txt, doc/specifications/draft-ietf-krb-wg-krb-dns-locate-03.txt, doc/specifications/draft-ietf-krb-wg-naming-00.txt, doc/specifications/draft-ietf-krb-wg-naming-01.txt, doc/specifications/draft-ietf-krb-wg-naming-02.txt, doc/specifications/draft-ietf-krb-wg-naming-03.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-00.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-01.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-02.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-03.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-04.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-05.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-06.txt, doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-01.txt, doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-02.txt, doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-03.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-00.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-01.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-02.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-03.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-04.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-05.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-06.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-00.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-01.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-02.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-03.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-04.txt, doc/specifications/draft-ietf-krb-wg-sha1-00.txt, doc/specifications/draft-ietf-krb-wg-utf8-profile-00.txt, doc/specifications/draft-ietf-krb-wg-utf8-profile-01.txt, doc/specifications/draft-ietf-krbwg-ocsp-for-pkinit-00.txt, doc/specifications/draft-ietf-tls-psk-null-00.txt, doc/specifications/draft-jaganathan-kerberos-http-01.txt, doc/specifications/draft-jaganathan-rc4-hmac-00.txt, doc/specifications/draft-jaganathan-rc4-hmac-01.txt, doc/specifications/draft-jaganathan-rc4-hmac-02.txt, doc/specifications/draft-jaganathan-rc4-hmac-03.txt, doc/specifications/draft-jaganathan-win-krb-authz-00.txt, doc/specifications/draft-johansson-kerberos-model-00.txt, doc/specifications/draft-johansson-kerberos-model-01.txt, doc/specifications/draft-johansson-kerberos-model-02.txt, doc/specifications/draft-johansson-kerberos-model-03.txt, doc/specifications/draft-josefsson-kerberos5-starttls-00.txt, doc/specifications/draft-kamada-krb-client-friendly-cross-00.txt, doc/specifications/draft-kamada-krb-client-friendly-cross-01.txt, doc/specifications/draft-kamada-krb-client-friendly-cross-02.txt, doc/specifications/draft-rabinovich-krb-wg-x509-name-constraints-00 .txt, doc/specifications/draft-raeburn-krb-rijndael-krb-01.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-02.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-03.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-04.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-05.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-06.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-07.txt, doc/specifications/draft-richards-otp-kerberos-00.txt, doc/specifications/draft-richards-otp-kerberos-01.txt, doc/specifications/draft-sakane-krb-cross-problem-statement-00.txt, doc/specifications/draft-sakane-krb-cross-problem-statement-01.txt, doc/specifications/draft-sakane-krb-cross-problem-statement-02.txt, doc/specifications/draft-sakane-krb-cross-problem-statement-03.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-00.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-01.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-02.txt, doc/specifications/draft-skibbie-krb-kdckeys-ldap-schema-00.txt, doc/specifications/draft-smedvinsky-dhc-kerbauth-01.txt, doc/specifications/draft-swift-win2k-krb-referrals-00.txt, doc/specifications/draft-swift-win2k-krb-user2user-01.txt, doc/specifications/draft-swift-win2k-krb-user2user-02.txt, doc/specifications/draft-swift-win2k-krb-user2user-03.txt, doc/specifications/draft-thomas-snmpv3-kerbusm-00.txt, doc/specifications/draft-trostle-win2k-cat-kerberos-set-passwd-00.t xt, doc/specifications/draft-tschofenig-pana-bootstrap-kerberos-00.txt, doc/specifications/draft-tso-telnet-krb5-00.txt, doc/specifications/draft-tso-telnet-krb5-01.txt, doc/specifications/draft-tso-telnet-krb5-02.txt, doc/specifications/draft-tso-telnet-krb5-03.txt, doc/specifications/draft-tso-telnet-krb5-04.txt, doc/specifications/draft-weber-krb-wg-kerberos-clock-synchronizatio n-00.txt, doc/specifications/draft-weber-krb-wg-kerberos-clock-synchronizatio n-01.txt, doc/specifications/draft-weber-krb-wg-kerberos-initial-authenticati on-00.txt, doc/specifications/draft-weber-krb-wg-kerberos-pfs-00.txt, doc/specifications/draft-yu-krb-wg-kerberos-extensions-00.txt, doc/specifications/draft-yu-krb-wg-kerberos-extensions-01.txt, doc/specifications/draft-yu-krb-wg-kerberos-extensions-02.txt, doc/specifications/draft-zhu-kerb-anon-00.txt, doc/specifications/draft-zhu-kerb-enctype-nego-00.txt, doc/specifications/draft-zhu-kerb-enctype-nego-01.txt, doc/specifications/draft-zhu-kerb-enctype-nego-02.txt, doc/specifications/draft-zhu-kerb-enctype-nego-03.txt, doc/specifications/draft-zhu-kerb-enctype-nego-04.txt, doc/specifications/draft-zhu-pkinit-ecc-00.txt, doc/specifications/draft-zhu-pkinit-ecc-03.txt, doc/specifications/draft-zhu-pku2u-00.txt, doc/specifications/draft-zhu-pku2u-01.txt, doc/specifications/draft-zhu-pku2u-02.txt, doc/specifications/draft-zhu-ws-kerb-00.txt, doc/specifications/draft-zhu-ws-kerb-01.txt, doc/specifications/draft-zhu-ws-kerb-03.txt, doc/specifications/draft-zrelli-krb-xkdcp-00.txt, doc/specifications/rfc1508.txt, doc/specifications/rfc1509.txt, doc/specifications/rfc1510.txt, doc/specifications/rfc1750.txt, doc/specifications/rfc1831.txt, doc/specifications/rfc1961.txt, doc/specifications/rfc1964.txt, doc/specifications/rfc2025.txt, doc/specifications/rfc2078.txt, doc/specifications/rfc2203.txt, doc/specifications/rfc2228.txt, doc/specifications/rfc2478.txt, doc/specifications/rfc2479.txt, doc/specifications/rfc2743.txt, doc/specifications/rfc2744.txt, doc/specifications/rfc2853.txt, doc/specifications/rfc2898.txt, doc/specifications/rfc2941.txt, doc/specifications/rfc2942.txt, doc/specifications/rfc2946.txt, doc/specifications/rfc2947.txt, doc/specifications/rfc2948.txt, doc/specifications/rfc2952.txt, doc/specifications/rfc2953.txt, doc/specifications/rfc3244.txt, doc/specifications/rfc3961.txt, doc/specifications/rfc3962.txt, doc/specifications/rfc4120.txt, doc/specifications/rfc4537.txt, doc/specifications/rfc4556.txt, doc/specifications/rfc4557.txt, doc/specifications/rfc4757.txt: Remove specifications that are widely available. 2011-11-22 Simon Josefsson * README-alpha: Mention make. 2011-11-22 Simon Josefsson * doc/cyclo/Makefile.am: Fix links in cyclo output. 2011-11-22 Simon Josefsson * .gitignore, configure.ac, doc/reference/Makefile.am, doc/reference/shishi-docs.sgml, doc/reference/version.xml.in, gtk-doc.make, m4/gtk-doc.m4: Update GTK-DOC infrastructure. 2011-11-22 Simon Josefsson * .gitignore, .x-sc_GPL_version, .x-sc_bindtextdomain, .x-sc_cast_of_argument_to_free, .x-sc_file_system, .x-sc_program_name, .x-sc_prohibit_cvs_keyword, .x-sc_prohibit_empty_lines_at_EOF, .x-sc_prohibit_magic_number_exit, .x-sc_space_tab, .x-sc_texinfo_acronym, .x-sc_the_the, .x-sc_trailing_blank, .x-sc_two_space_separator_in_usage, .x-sc_unmarked_diagnostics, .x-sc_useless_cpp_parens, GNUmakefile, NEWS, README, build-aux/arg-nonnull.h, build-aux/c++defs.h, build-aux/config.rpath, build-aux/gendocs.sh, build-aux/pmccabe2html, build-aux/snippet/_Noreturn.h, build-aux/snippet/arg-nonnull.h, build-aux/snippet/c++defs.h, build-aux/snippet/warn-on-use.h, build-aux/useless-if-before-free, build-aux/vc-list-files, build-aux/warn-on-use.h, cfg.mk, configure.ac, db/gl/allocator.c, db/gl/allocator.h, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/careadlinkat.c, db/gl/careadlinkat.h, db/gl/gnulib.mk, db/gl/m4/00gnulib.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/gnulib-tool.m4, db/gl/m4/longlong.m4, db/gl/m4/multiarch.m4, db/gl/m4/readlink.m4, db/gl/m4/stddef_h.m4, db/gl/m4/stdint.m4, db/gl/m4/warn-on-use.m4, db/gl/m4/wchar_h.m4, db/gl/m4/wchar_t.m4, db/gl/m4/wint_t.m4, db/gl/readlink.c, db/gl/stddef.in.h, db/gl/stdint.in.h, db/gl/wchar.in.h, doc/fdl-1.3.texi, doc/gendocs_template, doc/getdate.texi, doc/parse-datetime.texi, doc/shishi.texi, extra/pam_shishi/pam_shishi.c, gl/Makefile.am, gl/alignof.h, gl/alloca.c, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/bind.c, gl/c-ctype.c, gl/c-ctype.h, gl/close-hook.c, gl/close-hook.h, gl/close.c, gl/connect.c, gl/crc.c, gl/crc.h, gl/des.c, gl/des.h, gl/dosname.h, gl/dup2.c, gl/errno.in.h, gl/fclose.c, gl/fcntl.c, gl/fcntl.in.h, gl/fd-hook.c, gl/fd-hook.h, gl/float+.h, gl/float.c, gl/float.in.h, gl/fseek.c, gl/fseeko.c, gl/fstat.c, gl/ftell.c, gl/ftello.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getdate.h, gl/getdelim.c, gl/getdomainname.c, gl/getdtablesize.c, gl/gethostname.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/getpeername.c, gl/getsubopt.c, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/intprops.h, gl/itold.c, gl/lseek.c, gl/m4/00gnulib.m4, gl/m4/alloca.m4, gl/m4/arcfour.m4, gl/m4/arpa_inet_h.m4, gl/m4/asm-underscore.m4, gl/m4/autobuild.m4, gl/m4/base64.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/close.m4, gl/m4/crc.m4, gl/m4/des.m4, gl/m4/dos.m4, gl/m4/dup2.m4, gl/m4/eealloc.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/exponentd.m4, gl/m4/extensions.m4, gl/m4/fclose.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl.m4, gl/m4/fcntl_h.m4, gl/m4/float_h.m4, gl/m4/fseek.m4, gl/m4/fseeko.m4, gl/m4/fstat.m4, gl/m4/ftell.m4, gl/m4/ftello.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc-md5.m4, gl/m4/gc-pbkdf2-sha1.m4, gl/m4/gc-random.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdelim.m4, gl/m4/getdomainname.m4, gl/m4/getdtablesize.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/getsubopt.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/hmac-md5.m4, gl/m4/hmac-sha1.m4, gl/m4/hostent.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/inline.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/largefile.m4, gl/m4/ld-output-def.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longlong.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/malloca.m4, gl/m4/manywarnings.m4, gl/m4/math_h.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/memchr.m4, gl/m4/memxor.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/mmap-anon.m4, gl/m4/msvc-inval.m4, gl/m4/msvc-nothrow.m4, gl/m4/multiarch.m4, gl/m4/netdb_h.m4, gl/m4/netinet_in_h.m4, gl/m4/parse-datetime.m4, gl/m4/pathmax.m4, gl/m4/printf.m4, gl/m4/rawmemchr.m4, gl/m4/read-file.m4, gl/m4/realloc.m4, gl/m4/select.m4, gl/m4/servent.m4, gl/m4/setenv.m4, gl/m4/sha1.m4, gl/m4/signal_h.m4, gl/m4/size_max.m4, gl/m4/snprintf.m4, gl/m4/socketlib.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/ssize_t.m4, gl/m4/stat.m4, gl/m4/stdalign.m4, gl/m4/stdarg.m4, gl/m4/stdbool.m4, gl/m4/stddef_h.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/strverscmp.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/sys_types_h.m4, gl/m4/sys_uio_h.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/tm_gmtoff.m4, gl/m4/unistd_h.m4, gl/m4/valgrind-tests.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/warn-on-use.m4, gl/m4/warnings.m4, gl/m4/wchar_h.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/m4/xsize.m4, gl/m4/xstrndup.m4, gl/m4/xvasprintf.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memchr.c, gl/memxor.c, gl/memxor.h, gl/minmax.h, gl/mktime.c, gl/msvc-inval.c, gl/msvc-inval.h, gl/msvc-nothrow.c, gl/msvc-nothrow.h, gl/netdb.in.h, gl/netinet_in.in.h, gl/override/lib/dup2.c.diff, gl/override/lib/gettext.h.diff, gl/override/m4/valgrind-tests.m4.diff, gl/parse-datetime.h, gl/parse-datetime.y, gl/pathmax.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/rawmemchr.c, gl/read-file.c, gl/read-file.h, gl/realloc.c, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/setenv.c, gl/sha1.c, gl/sha1.h, gl/shutdown.c, gl/signal.in.h, gl/size_max.h, gl/snprintf.c, gl/socket.c, gl/sockets.c, gl/sockets.h, gl/stat.c, gl/stdalign.in.h, gl/stdarg.in.h, gl/stdbool.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio-write.c, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strdup.c, gl/strerror-override.c, gl/strerror-override.h, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strtok_r.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/sys_types.in.h, gl/sys_uio.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/timespec.h, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/verify.h, gl/w32sock.h, gl/wchar.in.h, gl/xalloc-oversized.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xsize.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h, lib/authenticator.c, lib/diskio.c, lib/internal.h, lib/kdc.c, lib/krberror.c, lib/principal.c, lib/starttls.c, lib/utils.c, maint.mk, src/gl/errno.in.h, src/gl/error.c, src/gl/error.h, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/00gnulib.m4, src/gl/m4/errno_h.m4, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/gnulib-tool.m4, src/gl/m4/locale_h.m4, src/gl/m4/msvc-inval.m4, src/gl/m4/msvc-nothrow.m4, src/gl/m4/nocrash.m4, src/gl/m4/stddef_h.m4, src/gl/m4/strerror.m4, src/gl/m4/sys_socket_h.m4, src/gl/m4/version-etc.m4, src/gl/m4/warn-on-use.m4, src/gl/m4/wchar_t.m4, src/gl/msvc-inval.c, src/gl/msvc-inval.h, src/gl/msvc-nothrow.c, src/gl/msvc-nothrow.h, src/gl/progname.c, src/gl/progname.h, src/gl/stddef.in.h, src/gl/strerror-override.c, src/gl/strerror-override.h, src/gl/strerror.c, src/gl/verify.h, src/gl/version-etc.c, src/gl/version-etc.h, src/starttls.c: Update gnulib files and fix usage. 2010-11-16 Simon Josefsson * .x-sc_texinfo_acronym: Rename getdate.texi. 2010-11-16 Simon Josefsson * .x-sc_space_tab: Add gtk-doc.make. 2010-11-16 Simon Josefsson * .x-sc_bindtextdomain: Add, to avoid syntax-check warnings. 2010-11-16 Simon Josefsson * doc/Makefile.am: Fix getdate.texi filename. 2010-11-16 Simon Josefsson * NEWS: Add. 2010-11-16 Simon Josefsson * po/LINGUAS, po/fi.po.in, po/pl.po.in, po/vi.po.in: Sync with TP. 2010-11-16 Simon Josefsson * GNUmakefile, build-aux/gendocs.sh, build-aux/gnupload, build-aux/pmccabe.css, build-aux/pmccabe2html, db/gl/areadlink.c, db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/stdint.m4, db/gl/m4/wchar_t.m4, db/gl/m4/wint_t.m4, db/gl/stddef.in.h, db/gl/stdint.in.h, db/gl/wchar.in.h, doc/fdl-1.3.texi, doc/getdate.texi, doc/parse-datetime.texi, gl/Makefile.am, gl/arpa_inet.in.h, gl/errno.in.h, gl/fcntl.in.h, gl/float+.h, gl/float.in.h, gl/ftello.c, gl/getaddrinfo.c, gl/getdate.h, gl/getdate.y, gl/inet_ntop.c, gl/m4/alloca.m4, gl/m4/bison.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/fcntl-o.m4, gl/m4/float_h.m4, gl/m4/ftello.m4, gl/m4/gc-random.m4, gl/m4/getdate.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/hostent.m4, gl/m4/include_next.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/memchr.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/mmap-anon.m4, gl/m4/parse-datetime.m4, gl/m4/printf.m4, gl/m4/realloc.m4, gl/m4/servent.m4, gl/m4/setenv.m4, gl/m4/size_max.m4, gl/m4/socketlib.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/stat.m4, gl/m4/stdarg.m4, gl/m4/stdbool.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/strndup.m4, gl/m4/strtok_r.m4, gl/m4/time_h.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/malloc.c, gl/malloca.c, gl/netdb.in.h, gl/netinet_in.in.h, gl/parse-datetime.h, gl/parse-datetime.y, gl/printf-parse.c, gl/printf-parse.h, gl/read-file.c, gl/realloc.c, gl/select.c, gl/setenv.c, gl/signal.in.h, gl/stdarg.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/timespec.h, gl/unistd.in.h, gl/vasnprintf.c, gl/wchar.in.h, gl/xalloc.h, gl/xmalloc.c, maint.mk, src/gl/errno.in.h, src/gl/getopt.in.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/errno_h.m4, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4, src/gl/m4/wchar_t.m4, src/gl/stddef.in.h, src/gl/strerror.c: Update gnulib files. 2010-05-27 Simon Josefsson * doc/announce.txt: Doc fix. 2010-05-20 Simon Josefsson * doc/announce.txt: Update announce.txt for v1.0.0. 2010-05-20 Simon Josefsson * NEWS, configure.ac, lib/shishi.h: Bump version. 2010-05-20 Simon Josefsson * cfg.mk: Fix cyclo web rule. 2010-05-20 Simon Josefsson * ChangeLog: Generated. 2010-05-20 Simon Josefsson * ChangeLog, doc/Makefile.am: Make it build. 2010-05-20 Simon Josefsson * NEWS: Version 1.0.0. 2010-05-20 Simon Josefsson * NEWS: Fix. 2010-05-20 Simon Josefsson * .gitignore, build-aux/pmccabe.css, build-aux/pmccabe2html, cfg.mk, configure.ac, doc/cyclo/Makefile.am, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Add cyclomatic code complexity chart. 2010-05-20 Simon Josefsson * NEWS, cfg.mk, doc/gendocs_template, doc/reference/Makefile.am, gl/override/doc/gendocs_template.diff, gtk-doc.make, m4/gtk-doc.m4: Update GTK-DOC files to enable PDF manual. 2010-05-20 Simon Josefsson * build-aux/c++defs.h, build-aux/gendocs.sh, configure.ac, db/gl/wchar.in.h, doc/gendocs_template, gl/Makefile.am, gl/m4/asm-underscore.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/stdio_h.m4, gl/m4/unistd_h.m4, gl/m4/valgrind-tests.m4, gl/stdio-write.c, gl/stdio.in.h, gl/unistd.in.h, gl/vasnprintf.c, gl/verify.h, gl/wchar.in.h, m4/valgrind.m4, maint.mk, src/gl/error.c: Update gnulib files, use valgrind-tests module. 2010-04-29 Simon Josefsson * build-aux/gnupload, db/gl/m4/gnulib-common.m4, gl/Makefile.am, gl/m4/gnulib-common.m4, gl/m4/netdb_h.m4, gl/m4/unistd_h.m4, gl/netdb.in.h, gl/unistd.in.h, maint.mk, src/gl/m4/gnulib-common.m4: Update gnulib files. 2010-04-25 Simon Josefsson * build-aux/vc-list-files, gl/m4/strnlen.m4, gl/vasnprintf.c, maint.mk: Update gnulib files. 2010-04-22 Simon Josefsson * .gitignore: Ignore more. 2010-04-22 Simon Josefsson * m4/valgrind.m4: Use valgrind -q. 2010-04-22 Simon Josefsson * .x-sc_program_name: Fix syntax-check nit. 2010-04-22 Simon Josefsson * NEWS, asn1/Makefile.am, asn1/coding.c, asn1/decoding.c, asn1/element.h, asn1/gstr.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.h, asn1/version.c: minitasn1: Internal copy upgraded to GNU Libtasn1 v2.6. 2010-04-22 Simon Josefsson * cfg.mk, db/file.c, examples/client-priv.c, examples/client-safe.c, extra/pam_shishi/pam_shishi.c, extra/pam_shishi/test.c, lib/cfg.c, lib/tkts.c, tests/utils.h: Indent code. 2010-04-22 Simon Josefsson * gl/Makefile.am, gl/gc-libgcrypt.c, gl/m4/netdb_h.m4, gl/setenv.c, gl/stdbool.in.h, maint.mk, src/gl/getopt.c, src/gl/getopt_int.h: Update gnulib files. 2010-04-14 Simon Josefsson * lib/kdc.c: Doc typo fixes. 2010-04-14 Simon Josefsson * NEWS: Add. 2010-04-14 Simon Josefsson * lib/ap.c, lib/crypto-ctx.c, lib/kdc.c, lib/priv.c: Doc typo fixes. 2010-04-14 Simon Josefsson * lib/as.c, lib/asn1.c, lib/ccache.c, lib/ccache.h, lib/cfg.c, lib/crypto-des.c, lib/crypto.c, lib/diskio.c, lib/gztime.c, lib/init.c, lib/kdcreq.c, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/low-crypto.c, lib/netio.c, lib/principal.c, lib/shishi.h, lib/starttls.c, lib/starttls.h, lib/tktccache.c, lib/tkts.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/crypto-ctx.c, tests/nonce.c: Indent code. 2010-04-14 Simon Josefsson * src/gl/getopt.c, src/gl/m4/getopt.m4: Update gnulib files. 2010-04-13 Simon Josefsson * .x-sc_prohibit_empty_lines_at_EOF, .x-sc_texinfo_acronym, .x-sc_unmarked_diagnostics, GNUmakefile, build-aux/c++defs.h, build-aux/warn-on-use.h, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/stdint.in.h, db/gl/wchar.in.h, doc/reference/Makefile.am, doc/shishi.texi, extra/rsh-redone/rlogin.c, extra/rsh-redone/rsh.c, gl/Makefile.am, gl/arpa_inet.in.h, gl/errno.in.h, gl/float.in.h, gl/fseeko.c, gl/m4/fseeko.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/lib-link.m4, gl/m4/memchr.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strdup.m4, gl/m4/string_h.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/netdb.in.h, gl/netinet_in.in.h, gl/stdarg.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/strings.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/time.in.h, gl/time_r.c, gl/unistd.in.h, gl/vasnprintf.c, gl/wchar.in.h, maint.mk, src/gl/errno.in.h, src/gl/getopt.in.h, src/gl/locale.in.h, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4: Update gnulib files. Fix syntax-check warnings. 2010-04-13 Simon Josefsson * NEWS, THANKS, lib/netio.c: Fix building with --disable-starttls. Reported by Johan van Selst in . 2010-03-30 Simon Josefsson * cfg.mk: Prepare for non-alpha upload. 2010-03-30 Simon Josefsson * NEWS, configure.ac, lib/shishi.h: Bump versions. 2010-03-30 Simon Josefsson * doc/announce.txt: Update. 2010-03-30 Simon Josefsson * ChangeLog: Generated. 2010-03-30 Simon Josefsson * NEWS: Version 0.0.43. 2010-03-30 Simon Josefsson * db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/stddef_h.m4, db/gl/m4/wchar_h.m4, db/gl/stdint.in.h, gl/arpa_inet.in.h, gl/errno.in.h, gl/float.in.h, gl/getaddrinfo.c, gl/gettext.h, gl/m4/arpa_inet_h.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl_h.m4, gl/m4/getaddrinfo.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/inet_ntop.m4, gl/m4/netdb_h.m4, gl/m4/signal_h.m4, gl/m4/stddef_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_h.m4, gl/m4/unistd_h.m4, gl/m4/wchar_h.m4, gl/netdb.in.h, gl/netinet_in.in.h, gl/select.c, gl/stdarg.in.h, gl/stdint.in.h, gl/string.in.h, gl/strings.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/time.in.h, gl/unistd.in.h, maint.mk, src/gl/errno.in.h, src/gl/getopt.in.h, src/gl/locale.in.h, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4, src/gl/m4/stddef_h.m4: Update gnulib files. 2010-03-23 Simon Josefsson * NEWS: Fix. 2010-03-23 Simon Josefsson * src/shishid.c: Need to do SO_REUSEADDR before bind. 2010-03-23 Simon Josefsson * src/shishid.c: Improve debug output. 2010-03-23 Simon Josefsson * NEWS, src/kdc.h, src/server.c, src/starttls.c: Upgrade TCP extension logic. 2010-03-23 Simon Josefsson * lib/starttls.c: Use RFC 5021 starttls negotiation. Don't verify cert if we don't have a CA. 2010-03-23 Simon Josefsson * NEWS, doc/shishi.texi, src/shishid.c, src/shishid.ggo, src/starttls.c: shishid: Add --no-tls parameter to disable TLS support. 2010-03-23 Simon Josefsson * src/kdc.h, src/server.c, src/shishid.c, src/starttls.c: shishid: Improve server listening logic. 2010-03-23 Simon Josefsson * src/server.c: Print proper addresses. 2010-03-22 Simon Josefsson * src/shishid.c: Remove failed listeners from list properly. 2010-03-22 Simon Josefsson * lib/tkts.c: Fix lintian typo. 2010-03-22 Simon Josefsson * db/config.c: Fix lintian typo. 2010-03-22 Simon Josefsson * NEWS: Add. 2010-03-22 Simon Josefsson * doc/Makefile.am: Generated. 2010-03-22 Simon Josefsson * db/Makefile.am: Add $(LIBSOCKET), for MinGW. 2010-03-22 Simon Josefsson * db/gl/gnulib.mk, db/gl/m4/dos.m4, db/gl/m4/extensions.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/stat.m4, db/gl/m4/stdbool.m4, db/gl/m4/sys_stat_h.m4, db/gl/m4/time_h.m4, db/gl/m4/unistd_h.m4, db/gl/stat.c, db/gl/stdbool.in.h, db/gl/sys_stat.in.h, db/gl/time.in.h, gl/Makefile.am, gl/m4/dos.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/stat.m4, gl/stat.c: Update gnulib files. 2010-03-22 Simon Josefsson * NEWS: Add. 2010-03-22 Simon Josefsson * gl/unistd.in.h: Update gnulib files. 2010-03-22 Simon Josefsson * .gitignore: Ignore more. 2010-03-22 Simon Josefsson * NEWS, src/kdc.h, src/server.c, src/shishid.c: shishid: Support IPv6 by using getaddrinfo. 2010-03-22 Simon Josefsson * lib/error.c: Add error explanation. 2010-03-22 Simon Josefsson * lib/cfg.c: Build fixes. 2010-03-22 Simon Josefsson * lib/netio.c: Improve retry counter and error codes. 2010-03-22 Simon Josefsson * NEWS: Add. 2010-03-22 Simon Josefsson * doc/shishi.texi, lib/cfg.c, lib/cfg.h, lib/internal.h, lib/netio.c, lib/starttls.c, lib/starttls.h, shishi.conf.in, shishi.skel.in: Rewrite network handling to supprt IPv6 and delay name resolution. 2010-03-22 Simon Josefsson * lib/error.c: Reduce unnecessary noise. 2010-03-22 Simon Josefsson * lib/netio.c, lib/shishi.h: Const'ify shishi_kdc_sendrecv*. 2010-03-22 Simon Josefsson * lib/netio.c: Iterate through all KDC addresses for direct sends. 2010-03-22 Simon Josefsson * lib/netio.c: Only attempt to use IPv6 if local system has IPv6. 2010-03-22 Simon Josefsson * NEWS: Add. 2010-03-22 Simon Josefsson * build-aux/c++defs.h, build-aux/warn-on-use.h, db/gl/gnulib.mk, db/gl/m4/gnulib-comp.m4, db/gl/m4/sys_stat_h.m4, db/gl/m4/time_h.m4, db/gl/m4/unistd_h.m4, db/gl/m4/wchar.m4, db/gl/m4/wchar_h.m4, db/gl/sys_stat.in.h, db/gl/time.in.h, db/gl/wchar.in.h, gl/Makefile.am, gl/bind.c, gl/connect.c, gl/fcntl.in.h, gl/getpeername.c, gl/m4/fcntl_h.m4, gl/m4/gnulib-comp.m4, gl/m4/setenv.m4, gl/m4/signal_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_h.m4, gl/m4/unistd_h.m4, gl/m4/wchar.m4, gl/m4/wchar_h.m4, gl/recvfrom.c, gl/sendto.c, gl/signal.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/unistd.in.h, gl/wchar.in.h, maint.mk, src/gl/getopt.c, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4: Update gnulib files. 2010-03-18 Simon Josefsson * README-alpha: Mention gengetopt. 2010-03-17 Simon Josefsson * src/server.c: Avoid printing garbage message for UDP and reduce noice for TCP. 2010-03-15 Simon Josefsson * lib/as.c, lib/cfg.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/keys.c, lib/tgs.c, lib/tkt.c, lib/tkts.c: Fix lintian typos. 2010-03-15 Simon Josefsson * NEWS, configure.ac, lib/shishi.h: Bump versions. 2010-03-15 Simon Josefsson * doc/announce.txt: Add. 2010-03-15 Simon Josefsson * ChangeLog: Generated. 2010-03-15 Simon Josefsson * NEWS: Version 0.0.42. 2010-03-15 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Upgrade libtasn1 to v2.5. 2010-03-15 Simon Josefsson * NEWS: Fix last commit. 2010-03-15 Simon Josefsson * NEWS: Add. 2010-03-15 Simon Josefsson * cfg.mk: Add review-diff target. 2010-03-15 Simon Josefsson * doc/reference/shishi-docs.sgml: Add index to GTK-DOC manual. 2010-03-15 Simon Josefsson * doc/Makefile.am: Generated. 2010-03-10 Simon Josefsson * lib/ap.c: (shishi_ap_authenticator_cksumdata): Also check @out. 2010-03-10 Simon Josefsson * lib/ap.c: (shishi_ap_authenticator_cksumdata): Return requested size. 2010-03-10 Simon Josefsson * NEWS: Add. 2010-03-10 Simon Josefsson * lib/crypto.c, tests/crypto.c: libshishi: Fix bug where '3des' is parsed as 'des'. 2010-03-08 Simon Josefsson * NEWS, lib/keys.c, lib/libshishi.map, lib/shishi.h, src/keytab2shishi.c, src/keytab2shishi.ggo: Add shishi_keys_from_file and keytab2shishi -R parameter. 2010-03-08 Simon Josefsson * NEWS, lib/key.c, lib/keytab.c, lib/libshishi.map, lib/shishi.h, tests/keytab.c: libshishi: Add APIs to save keys on keytab format. 2010-03-03 Simon Josefsson * lib/netio.c: Work around strict aliasing warning. 2010-03-03 Simon Josefsson * build-aux/gendocs.sh, build-aux/gnupload, build-aux/vc-list-files, db/gl/m4/gnulib-common.m4, db/gl/m4/warn-on-use.m4, gl/Makefile.am, gl/getdtablesize.c, gl/gettimeofday.c, gl/m4/getdtablesize.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/lseek.m4, gl/m4/sys_time_h.m4, gl/m4/warn-on-use.m4, gl/netdb.in.h, gl/stdio.in.h, gl/sys_select.in.h, gl/sys_time.in.h, maint.mk, src/gl/m4/gnulib-common.m4, src/gl/m4/warn-on-use.m4: Update gnulib files. 2010-02-03 Simon Josefsson * db/Makefile.am: link libshisa with -lrt for clock_gettime in libshishi. 2010-02-03 Simon Josefsson * lib/kdcreq.c: Don't use gettime where gettimeofday will do. 2010-02-03 Simon Josefsson * build-aux/gnupload, gl/Makefile.am, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-comp.m4, gl/m4/stdio_h.m4, gl/m4/sys_time_h.m4, gl/stdio.in.h, gl/sys_time.in.h, maint.mk: Update gnulib files. 2010-01-26 Simon Josefsson * build-aux/link-warning.h, db/gl/gnulib.mk, db/gl/m4/gnulib-comp.m4, db/gl/m4/sys_stat_h.m4, db/gl/m4/unistd_h.m4, db/gl/m4/warn-on-use.m4, db/gl/m4/wchar.m4, db/gl/sys_stat.in.h, db/gl/wchar.in.h, gl/Makefile.am, gl/arpa_inet.in.h, gl/fcntl.in.h, gl/m4/arpa_inet_h.m4, gl/m4/fcntl_h.m4, gl/m4/gnulib-comp.m4, gl/m4/signal_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/unistd_h.m4, gl/m4/wchar.m4, gl/signal.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/strings.in.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/unistd.in.h, gl/vasnprintf.h, gl/wchar.in.h, gl/xvasprintf.h, maint.mk, src/gl/error.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4, src/gl/m4/warn-on-use.m4: Update gnulib files. 2010-01-19 Simon Josefsson * NEWS, configure.ac, lib/shishi.h: Bump versions. 2010-01-19 Simon Josefsson * ChangeLog: Generated. 2010-01-19 Simon Josefsson * NEWS: Version 0.0.41. 2010-01-18 Simon Josefsson * README, doc/Makefile.am, lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Fix copyright years. 2010-01-18 Simon Josefsson * doc/reference/shishi-docs.sgml: Fix license. 2010-01-18 Simon Josefsson * cfg.mk: Fix syntax-check rule. 2010-01-18 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/gstr.c, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Use libtasn1 2.4. 2010-01-18 Simon Josefsson * gl/Makefile.am, gl/getdate.y, maint.mk: Update gnulib files. 2010-01-12 Simon Josefsson * asn1/Makefile.am: Make it build. 2010-01-12 Simon Josefsson * db/gl/m4/gnulib-common.m4, gl/m4/gnulib-common.m4, gl/m4/warnings.m4, src/gl/m4/gnulib-common.m4: Update gnulib files. 2010-01-12 Simon Josefsson * gl/dup2.c, gl/stdio.in.h: Update gnulib files. 2010-01-12 Simon Josefsson * gl/override/lib/dup2.c.diff: Fix dup2. 2010-01-12 Simon Josefsson * NEWS: Add. 2010-01-12 Simon Josefsson * gl/m4/gc.m4: Update gnulib files. 2010-01-12 Simon Josefsson * NEWS, lib/cfg.c, lib/low-crypto.c, lib/low-crypto.h, shishi.conf.in: Add a quick-random configuration keyword. 2010-01-12 Simon Josefsson * .gitignore: Add. 2010-01-12 Simon Josefsson * .x-sc_GPL_version, .x-sc_cast_of_argument_to_free, .x-sc_file_system, .x-sc_program_name, .x-sc_prohibit_cvs_keyword, .x-sc_prohibit_magic_number_exit, .x-sc_space_tab, .x-sc_the_the, .x-sc_trailing_blank, .x-sc_two_space_separator_in_usage, .x-sc_useless_cpp_parens: Fix syntax-check stuff. 2010-01-12 Simon Josefsson * .clcopying, .x-sc_unmarked_diagnostics, Makefile.am, README-alpha, cfg.mk, configure.ac, db/config.c, db/core.c, db/file.c, db/setup.c, doc/reference/shishi-docs.sgml, doc/shishi.texi, doc/texinfo.css, extra/pam_shishi/pam_shishi.c, extra/rsh-redone/rcp.c, extra/rsh-redone/rlogind.c, gtk-doc.make, lib/ap.c, lib/cfg.c, lib/crypto-3des.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto.c, lib/diskio.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/key.c, lib/keys.c, lib/pki.c, lib/principal.c, lib/realm.c, lib/safe.c, lib/shishi.h, lib/tktccache.c, lib/tkts.c, lib/version.c, m4/valgrind.m4, maint.mk, shisa.conf.in, shishi.conf.in, shishi.pc.in, shishi.skel.in, src/ccache2shishi.c, src/foo.c, src/kdc.c, src/keytab2shishi.c, src/resume.c, src/server.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/utils.c: Fix syntax-check stuff. 2010-01-12 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h: Upgrade libtasn1 to version 2.3. 2010-01-12 Simon Josefsson * GNUmakefile, build-aux/arg-nonnull.h, build-aux/config.rpath, build-aux/gendocs.sh, build-aux/link-warning.h, build-aux/useless-if-before-free, build-aux/vc-list-files, build-aux/warn-on-use.h, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/gnulib.mk, db/gl/m4/00gnulib.m4, db/gl/m4/dos.m4, db/gl/m4/extensions.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/gnulib-tool.m4, db/gl/m4/longlong.m4, db/gl/m4/multiarch.m4, db/gl/m4/readlink.m4, db/gl/m4/stat.m4, db/gl/m4/stdbool.m4, db/gl/m4/stddef_h.m4, db/gl/m4/stdint.m4, db/gl/m4/sys_stat_h.m4, db/gl/m4/time_h.m4, db/gl/m4/unistd_h.m4, db/gl/m4/wchar.m4, db/gl/m4/wchar_t.m4, db/gl/m4/wint_t.m4, db/gl/readlink.c, db/gl/stat.c, db/gl/stdbool.in.h, db/gl/stddef.in.h, db/gl/stdint.in.h, db/gl/sys_stat.in.h, db/gl/time.in.h, db/gl/wchar.in.h, doc/getdate.texi, gl/Makefile.am, gl/alignof.h, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/bind.c, gl/c-ctype.c, gl/c-ctype.h, gl/close-hook.c, gl/close-hook.h, gl/close.c, gl/connect.c, gl/crc.c, gl/crc.h, gl/des.c, gl/des.h, gl/dup2.c, gl/errno.in.h, gl/fclose.c, gl/fcntl.c, gl/fcntl.in.h, gl/float+.h, gl/float.in.h, gl/fseeko.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/getaddrinfo.c, gl/getdate.h, gl/getdate.y, gl/getdelim.c, gl/getdomainname.c, gl/gethostname.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/getpeername.c, gl/getsubopt.c, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/intprops.h, gl/lseek.c, gl/m4/00gnulib.m4, gl/m4/alloca.m4, gl/m4/arcfour.m4, gl/m4/arpa_inet_h.m4, gl/m4/autobuild.m4, gl/m4/base64.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/close.m4, gl/m4/crc.m4, gl/m4/des.m4, gl/m4/dup2.m4, gl/m4/eealloc.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/extensions.m4, gl/m4/fclose.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl.m4, gl/m4/fcntl_h.m4, gl/m4/float_h.m4, gl/m4/fseeko.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc-md5.m4, gl/m4/gc-pbkdf2-sha1.m4, gl/m4/gc-random.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/getdelim.m4, gl/m4/getdomainname.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/getsubopt.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/hmac-md5.m4, gl/m4/hmac-sha1.m4, gl/m4/hostent.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/inline.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/ld-output-def.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longlong.m4, gl/m4/lseek.m4, gl/m4/malloc.m4, gl/m4/malloca.m4, gl/m4/manywarnings.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/memchr.m4, gl/m4/memxor.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/mmap-anon.m4, gl/m4/multiarch.m4, gl/m4/netdb_h.m4, gl/m4/netinet_in_h.m4, gl/m4/printf.m4, gl/m4/rawmemchr.m4, gl/m4/read-file.m4, gl/m4/realloc.m4, gl/m4/select.m4, gl/m4/servent.m4, gl/m4/setenv.m4, gl/m4/sha1.m4, gl/m4/signal_h.m4, gl/m4/size_max.m4, gl/m4/snprintf.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/stdarg.m4, gl/m4/stdbool.m4, gl/m4/stddef_h.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/strverscmp.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/tm_gmtoff.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/warn-on-use.m4, gl/m4/warnings.m4, gl/m4/wchar.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/m4/xsize.m4, gl/m4/xstrndup.m4, gl/m4/xvasprintf.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memchr.c, gl/memxor.c, gl/memxor.h, gl/minmax.h, gl/mktime.c, gl/netdb.in.h, gl/netinet_in.in.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/rawmemchr.c, gl/read-file.c, gl/read-file.h, gl/realloc.c, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/setenv.c, gl/sha1.c, gl/sha1.h, gl/shutdown.c, gl/signal.in.h, gl/size_max.h, gl/snprintf.c, gl/socket.c, gl/sockets.c, gl/sockets.h, gl/stdarg.in.h, gl/stdbool.in.h, gl/stddef.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio-write.c, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strdup.c, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strtok_r.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/timespec.h, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/verify.h, gl/w32sock.h, gl/wchar.in.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xsize.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h, maint.mk, src/gl/errno.in.h, src/gl/error.c, src/gl/error.h, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/00gnulib.m4, src/gl/m4/errno_h.m4, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/gnulib-tool.m4, src/gl/m4/locale_h.m4, src/gl/m4/stddef_h.m4, src/gl/m4/strerror.m4, src/gl/m4/version-etc.m4, src/gl/m4/wchar_t.m4, src/gl/progname.c, src/gl/progname.h, src/gl/stddef.in.h, src/gl/strerror.c, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2009-12-29 Simon Josefsson * gl/gettext.h, gl/override/lib/gettext.h.diff: Update gnulib files. 2009-12-29 Simon Josefsson * build-aux/arg-nonnull.h, build-aux/gendocs.sh, build-aux/gnupload, build-aux/link-warning.h, build-aux/useless-if-before-free, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/gnulib.mk, db/gl/m4/dos.m4, db/gl/m4/extensions.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/longlong.m4, db/gl/m4/multiarch.m4, db/gl/m4/readlink.m4, db/gl/m4/stat.m4, db/gl/m4/stdbool.m4, db/gl/m4/stddef_h.m4, db/gl/m4/stdint.m4, db/gl/m4/sys_stat_h.m4, db/gl/m4/time_h.m4, db/gl/m4/unistd_h.m4, db/gl/m4/wchar.m4, db/gl/m4/wchar_t.m4, db/gl/m4/wint_t.m4, db/gl/readlink.c, db/gl/stat.c, db/gl/stdbool.in.h, db/gl/stddef.in.h, db/gl/stdint.in.h, db/gl/sys_stat.in.h, db/gl/time.in.h, db/gl/wchar.in.h, gl/Makefile.am, gl/alloca.c, gl/arcfour.c, gl/arcfour.h, gl/arpa_inet.in.h, gl/base64.c, gl/base64.h, gl/close-hook.c, gl/close.c, gl/connect.c, gl/des.c, gl/des.h, gl/dup2.c, gl/fcntl.c, gl/fcntl.in.h, gl/fseeko.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getdate.y, gl/getdelim.c, gl/getdomainname.c, gl/gethostname.c, gl/getpagesize.c, gl/getpass.c, gl/getsubopt.c, gl/gettext.h, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/intprops.h, gl/m4/clock_time.m4, gl/m4/close.m4, gl/m4/dup2.m4, gl/m4/environ.m4, gl/m4/extensions.m4, gl/m4/fclose.m4, gl/m4/fcntl-o.m4, gl/m4/fcntl.m4, gl/m4/fcntl_h.m4, gl/m4/fseeko.m4, gl/m4/gc-random.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/getdelim.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpagesize.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/ld-version-script.m4, gl/m4/lib-ld.m4, gl/m4/longlong.m4, gl/m4/lseek.m4, gl/m4/memchr.m4, gl/m4/mktime.m4, gl/m4/select.m4, gl/m4/setenv.m4, gl/m4/sockets.m4, gl/m4/socklen.m4, gl/m4/sockpfaf.m4, gl/m4/stdbool.m4, gl/m4/stddef_h.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/strndup.m4, gl/m4/strtok_r.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/unistd_h.m4, gl/m4/warnings.m4, gl/m4/wchar.m4, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memchr.c, gl/mktime-internal.h, gl/mktime.c, gl/netdb.in.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/read-file.c, gl/realloc.c, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/setenv.c, gl/sha1.c, gl/sha1.h, gl/signal.in.h, gl/snprintf.c, gl/socket.c, gl/sockets.c, gl/stddef.in.h, gl/stdint.in.h, gl/stdio-impl.h, gl/stdio-write.c, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strtok_r.c, gl/strverscmp.c, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/timegm.c, gl/timespec.h, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.c, gl/verify.h, gl/w32sock.h, gl/wchar.in.h, gl/xalloc.h, gl/xgetdomainname.c, gl/xgethostname.c, gl/xvasprintf.c, maint.mk, src/gl/error.c, src/gl/error.h, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/error.m4, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4, src/gl/m4/stddef_h.m4, src/gl/m4/version-etc.m4, src/gl/m4/wchar_t.m4, src/gl/progname.c, src/gl/progname.h, src/gl/stddef.in.h, src/gl/strerror.c, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2009-12-29 Simon Josefsson * gl/gettext.h, gl/override/lib/gettext.h.diff: Update gnulib files. 2009-08-18 Simon Josefsson * lib/shishi.h: Bump version. 2009-07-29 Simon Josefsson * README-alpha: Typo. 2009-07-23 Simon Josefsson * build-aux/gnupload, build-aux/vc-list-files, gl/Makefile.am, gl/alignof.h, gl/errno.in.h, gl/getpagesize.c, gl/m4/errno_h.m4, gl/m4/getpagesize.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/lib-link.m4, gl/m4/manywarnings.m4, gl/m4/memchr.m4, gl/m4/mmap-anon.m4, gl/m4/size_max.m4, gl/m4/stdio_h.m4, gl/m4/string_h.m4, gl/m4/unistd_h.m4, gl/md4.h, gl/md5.h, gl/memchr.c, gl/memchr.valgrind, gl/sha1.h, gl/stdio.in.h, gl/strerror.c, gl/string.in.h, gl/unistd.in.h, maint.mk, src/gl/errno.in.h, src/gl/error.c, src/gl/m4/errno_h.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/version-etc.m4, src/gl/strerror.c, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2009-06-17 Simon Josefsson * doc/shishi.texi: Typo. 2009-05-20 Simon Josefsson * NEWS, configure.ac: Bump versions. 2009-05-20 Simon Josefsson * cfg.mk, configure.ac, db/Makefile.am, examples/Makefile.am, lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Fix -Werror. 2009-05-20 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/ld-output-def.m4, m4/output-def.m4: Use output-def from gnulib. 2009-05-20 Simon Josefsson * cfg.mk: Fix git usage. 2009-05-20 Simon Josefsson * build-aux/gendocs.sh, build-aux/gnupload, build-aux/useless-if-before-free, build-aux/vc-list-files, doc/gendocs_template, gl/Makefile.am, gl/alignof.h, gl/getdate.y, gl/getdelim.c, gl/gettext.h, gl/m4/errno_h.m4, gl/m4/fcntl_h.m4, gl/m4/gnulib-comp.m4, gl/m4/inet_ntop.m4, gl/m4/ld-version-script.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/multiarch.m4, gl/m4/sys_socket_h.m4, gl/m4/vasnprintf.m4, gl/m4/wchar.m4, gl/sys_socket.in.h, gl/vasnprintf.c, gl/wchar.in.h, maint.mk, src/gl/getopt1.c, src/gl/m4/errno_h.m4, src/gl/m4/gnulib-comp.m4: Update gnulib files. 2009-05-08 Simon Josefsson * cfg.mk: Fix -Werror handling. 2009-05-06 Simon Josefsson * configure.ac: Fix build failure on Ubuntu 8.04. 2009-05-06 Simon Josefsson * README-alpha: Add. 2009-04-03 Simon Josefsson * ChangeLog: Generated. 2009-04-03 Simon Josefsson * NEWS: Version 0.0.40. 2009-04-03 Simon Josefsson * lib/init.c: Need #include. 2009-04-03 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/sockets.m4, gl/sockets.c, gl/sockets.h, lib/init.c: Need WSAStartup. 2009-04-03 Simon Josefsson * src/Makefile.am: Fix -I's. 2009-04-03 Simon Josefsson * lib/Makefile.am: Need to link with -lws2_32. 2009-04-03 Simon Josefsson * configure.ac: Fix libgcrypt test. 2009-04-03 Simon Josefsson * gl/Makefile.am, gl/gethostname.c, gl/m4/gethostname.m4: Revert gethostname patch. 2009-04-03 Simon Josefsson * gl/m4/gnulib-cache.m4: Fix. 2009-03-31 Simon Josefsson * gl/Makefile.am, gl/gethostname.c, gl/m4/gethostname.m4: Update gnulib files. 2009-03-31 Simon Josefsson * NEWS: Add. 2009-03-31 Simon Josefsson * db/Makefile.am: libshisa needs to link to libshishi for xalloc_die etc (sigh!). 2009-03-31 Simon Josefsson * src/Makefile.am: The libcmd* libraries need gl/libgnu for getopt. 2009-03-31 Simon Josefsson * gl/Makefile.am, gl/alloca.c, gl/bind.c, gl/close-hook.c, gl/close-hook.h, gl/close.c, gl/connect.c, gl/fclose.c, gl/getpeername.c, gl/m4/close.m4, gl/m4/fclose.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/select.m4, gl/recvfrom.c, gl/select.c, gl/sendto.c, gl/shutdown.c, gl/socket.c, gl/w32sock.h: Add socket gnulib modules, for mingw. 2009-03-31 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/strerror.m4, gl/strerror.c: Need strerror in lib/. 2009-03-31 Simon Josefsson * NEWS: Fix. 2009-03-31 Simon Josefsson * lib/shishi.h: Bump version. 2009-03-30 Simon Josefsson * NEWS, configure.ac: Bump versions. 2009-03-30 Simon Josefsson * src/Makefile.am: Fix typo that prevented shisa from working. 2009-03-30 Simon Josefsson * src/shisa.c, src/shishi.c: Use gnulib for address report. 2009-03-30 Simon Josefsson * src/shisa.c, src/shishi.c: More version printing. 2009-03-30 Simon Josefsson * ChangeLog: Generated. 2009-03-30 Simon Josefsson * NEWS: Version 0.0.39. 2009-03-30 Simon Josefsson * cfg.mk: Add code coverage rules. 2009-03-30 Simon Josefsson * configure.ac: Fix bug address. 2009-03-30 Simon Josefsson * lib/Makefile.am: Need ltlibtasn1 before ltlibgnutls because the latter drags in old libtasn1. 2009-03-30 Simon Josefsson * configure.ac: Only warn when using gcc. 2009-03-30 Simon Josefsson * lib/libshishi.map: Don't use wildcards. 2009-03-30 Simon Josefsson * db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/visibility.m4, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/visibility.m4: Update gnulib files. 2009-03-30 Simon Josefsson * NEWS: Fix. 2009-03-30 Simon Josefsson * configure.ac: More debug output. 2009-03-30 Simon Josefsson * GNUmakefile, build-aux/gnupload, gl/Makefile.am, gl/m4/gnulib-comp.m4, gl/m4/signal_h.m4, gl/m4/sys_select_h.m4, gl/signal.in.h, gl/sys_select.in.h, gl/unistd.in.h, gl/vasnprintf.c, gl/xmalloc.c, maint.mk: Update gnulib files. 2009-03-04 Simon Josefsson * doc/shishi.texi: Fix. 2009-03-04 Simon Josefsson * db/gl/Makefile.am: Fix. 2009-03-04 Simon Josefsson * db/Makefile.am, db/libshisa.map: Use symbol map for libshisa. 2009-03-04 Simon Josefsson * lib/Makefile.am: Another typo. 2009-03-04 Simon Josefsson * lib/Makefile.am: Fix typo. 2009-03-04 Simon Josefsson * db/Makefile.am: Use CFLAG_VISIBILITY. 2009-03-04 Simon Josefsson * db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/visibility.m4: Update gnulib files. 2009-03-04 Simon Josefsson * lib/Makefile.am, lib/libshishi.map, lib/shishi.vers: Fix version script filename. Use libtool -export-symbols-regex as fallback. 2009-03-04 Simon Josefsson * configure.ac, db/gl/m4/gnulib-common.m4, gl/Makefile.am, gl/fseeko.c, gl/gai_strerror.c, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/ld-version-script.m4, gl/m4/printf.m4, gl/m4/stdarg.m4, gl/m4/stdint.m4, gl/m4/stdlib_h.m4, gl/m4/vasnprintf.m4, gl/m4/visibility.m4, gl/stdint.in.h, gl/sys_socket.in.h, gl/vasnprintf.c, lib/Makefile.am, m4/linker-script.m4, src/gl/m4/gnulib-common.m4: Update gnulib files. 2009-02-26 Simon Josefsson * lib/tktccache.c: Fix warning. 2009-02-26 Simon Josefsson * lib/shishi.h: Bump version. 2009-02-26 Simon Josefsson * NEWS: Fix. 2009-02-26 Simon Josefsson * NEWS: Add. 2009-02-26 Simon Josefsson * lib/tktccache.c: Maintain ABIs even though functions aren't implemented properly yet. 2009-02-26 Simon Josefsson * NEWS, configure.ac: Bump versions. 2009-02-26 Simon Josefsson * ChangeLog: Generated. 2009-02-26 Simon Josefsson * NEWS: Version 0.0.38. 2009-02-26 Simon Josefsson * lib/crypto.c, lib/shishi.h: Revert ABI change. 2009-02-26 Simon Josefsson * AUTHORS: Update PGP key. 2009-02-26 Simon Josefsson * cfg.mk: Modernize release targets. 2009-02-26 Simon Josefsson * .clcopying: Bump copyright years. 2009-02-26 Simon Josefsson * doc/shishi.texi: Clarify license version. 2009-02-26 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/errors.h, asn1/gstr.c, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Update to libtasn1 v1.8. 2009-02-25 Simon Josefsson * NEWS: Add. 2009-02-25 Simon Josefsson * build-aux/gendocs.sh, build-aux/gnupload, db/gl/gnulib.mk, db/gl/m4/00gnulib.m4, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/readlink.m4, doc/gendocs_template, gl/Makefile.am, gl/arpa_inet.in.h, gl/fseeko.c, gl/gettimeofday.c, gl/m4/00gnulib.m4, gl/m4/alloca.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/eealloc.m4, gl/m4/environ.m4, gl/m4/errno_h.m4, gl/m4/extensions.m4, gl/m4/fcntl_h.m4, gl/m4/gc-random.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/getdomainname.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/inline.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/longlong.m4, gl/m4/malloc.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/minmax.m4, gl/m4/mktime.m4, gl/m4/multiarch.m4, gl/m4/printf.m4, gl/m4/realloc.m4, gl/m4/setenv.m4, gl/m4/sha1.m4, gl/m4/size_max.m4, gl/m4/sockpfaf.m4, gl/m4/stdbool.m4, gl/m4/stdint.m4, gl/m4/stdint_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/strverscmp.m4, gl/m4/timegm.m4, gl/m4/tm_gmtoff.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/wchar.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xsize.m4, gl/stdint.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/sys_select.in.h, gl/sys_stat.in.h, gl/unistd.in.h, gl/vasnprintf.c, gl/wchar.in.h, src/gl/gnulib.mk, src/gl/m4/00gnulib.m4, src/gl/m4/errno_h.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/progname.c, src/gl/strerror.c, src/gl/version-etc.c, src/gl/version-etc.h: Update gnulib files. 2009-02-25 Simon Josefsson * db/Makefile.am: Limit amount of exported symbols. 2008-12-12 Simon Josefsson * doc/texinfo.css: Fix css. 2008-12-11 Simon Josefsson * lib/version.c: String.h is included via internal.h. 2008-12-11 Simon Josefsson * AUTHORS: Update PGP key. 2008-12-11 Simon Josefsson * NEWS: Add. 2008-12-11 Simon Josefsson * tests/utils.h: Need headers. 2008-12-11 Simon Josefsson * configure.ac, db/Makefile.am, db/config.c, db/file.c, db/shisa.h, lib/cfg.c: Enable warnings in db/. Fix warnings. 2008-12-11 Simon Josefsson * examples/Makefile.am, examples/server.c: Compile examples with warning flags. 2008-12-11 Simon Josefsson * tests/utils.h: Add file. 2008-12-11 Simon Josefsson * lib/cfg.c: Getsubopt is a cast mess. 2008-12-11 Simon Josefsson * lib/cfg.c, lib/crypto.c, lib/crypto.h, lib/shishi.h, src/Makefile.am, src/ccache2shishi.c, src/kdc.c, src/keytab2shishi.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/Makefile.am, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/key.c, tests/keytab.c, tests/passwdpromptcb.c, tests/ticketset.c, tests/utils.c: Fix more warnings. Slight ABI change on 64 platforms. 2008-12-11 Simon Josefsson * configure.ac: Disable warning. 2008-12-11 Simon Josefsson * lib/as.c: Fix warning. 2008-12-11 Simon Josefsson * configure.ac: Fix warnings. 2008-12-11 Simon Josefsson * lib/shishi.h: Add print attributes. 2008-12-11 Simon Josefsson * lib/Makefile.am, lib/low-crypto.h: Add low-crypto.h. 2008-12-11 Simon Josefsson * gl/gettext.h: Update gnulib files. 2008-12-11 Simon Josefsson * configure.ac, gl/gettext.h, gl/override/lib/gettext.h.diff, lib/asn1.c, lib/authorize.c, lib/cfg.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-rc4.c, lib/crypto.h, lib/error.c, lib/gztime.c, lib/init.c, lib/kdcreq.c, lib/keys.c, lib/keytab.c, lib/low-crypto.c, lib/netio.c, lib/principal.c, lib/shishi.h, lib/starttls.c, lib/tktccache.c: Update gnulib files. Use manywarning module. Fix warnings. 2008-12-11 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/hostent.m4, gl/m4/manywarnings.m4, gl/m4/servent.m4: Update gnulib files. 2008-12-11 Simon Josefsson * cfg.mk: Remove code coverage, now in maint.mk. 2008-12-11 Simon Josefsson * build-aux/gnupload, gl/m4/getaddrinfo.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/netdb_h.m4, gl/m4/warnings.m4, gl/netdb.in.h, gl/stdint.in.h, gl/sys_time.in.h, maint.mk: Update gnulib files. 2008-11-26 Simon Josefsson * lib/Makefile.am: Don't use @@ substitutions. 2008-11-18 Simon Josefsson * lib/crypto.c: Fix gtk-doc bug. 2008-11-18 Simon Josefsson * lib/tktccache.c: Fix gtk-doc bug. 2008-11-18 Simon Josefsson * NEWS, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/gstr.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h, configure.ac: Upgrade libtasn1 to v1.7. 2008-11-18 Simon Josefsson * configure.ac, lib/Makefile.am, lib/asn1.c, lib/authenticator.c, lib/ccache.c, lib/crypto-des.c, lib/key.c, lib/shishi.h, lib/ticket.c, lib/tktccache.c, src/shisa.c: Fix warnings. 2008-11-18 Simon Josefsson * lib/cfg.c, lib/enckdcreppart.c, lib/shishi.h: Fix warnings. 2008-11-12 Simon Josefsson * doc/reference/Makefile.am, examples/Makefile.am, extra/pam_shishi/Makefile.am, extra/rsh-redone/Makefile.am, lib/Makefile.am: Fix automake warnings. 2008-11-12 Simon Josefsson * configure.ac, m4/linker-script.m4, m4/output-def.m4, m4/update-header-version.m4, m4/valgrind.m4: Use shared checks. 2008-11-12 Simon Josefsson * configure.ac, lib/Makefile.am, lib/shishi.h, lib/shishi.h.in: Don't substitute in shishi.h. 2008-11-12 Simon Josefsson * configure.ac, src/ccache2shishi.c, src/shishid.c, src/starttls.c: Fix warnings. 2008-11-12 Simon Josefsson * configure.ac: Add -Wall. 2008-11-12 Simon Josefsson * cfg.mk, configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/warnings.m4: Use warnings module. 2008-11-12 Simon Josefsson * configure.ac: Neatify. 2008-11-11 Simon Josefsson * README: Update license. 2008-11-11 Simon Josefsson * NEWS, doc/Makefile.am, doc/fdl-1.3.texi, doc/fdl.texi, doc/shishi.texi, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Use GFDL 1.3. 2008-11-11 Simon Josefsson * doc/gdoc: Fix license and redoce code duplication. 2008-11-11 Simon Josefsson * configure.ac: Fix --output-def test. 2008-11-11 Simon Josefsson * Makefile.am, cfg.mk: Fix release targets. 2008-11-11 Simon Josefsson * cfg.mk, gtk-doc.make: Modernize gtk-doc usage. 2008-11-11 Simon Josefsson * configure.ac: Use modern check for --enable-ld-version-script. 2008-11-11 Simon Josefsson * m4/pkg.m4: Add. 2008-11-11 Simon Josefsson * m4/gtk-doc.m4: Update from upstream. 2008-11-11 Simon Josefsson * configure.ac, gl/Makefile.am, gl/fcntl.in.h, gl/m4/fcntl_h.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, src/kdc.h, tests/utils.c: Modernize gnulib usage. 2008-11-11 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update gnulib files. 2008-11-11 Simon Josefsson * GNUmakefile, configure.ac, db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, doc/fdl.texi, doc/getdate.texi, gl/Makefile.am, gl/arpa_inet.in.h, gl/c-ctype.h, gl/errno.in.h, gl/float.in.h, gl/fseeko.c, gl/gai_strerror.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdate.y, gl/getdomainname.c, gl/getdomainname.h, gl/gethostname.c, gl/m4/arpa_inet_h.m4, gl/m4/eoverflow.m4, gl/m4/errno_h.m4, gl/m4/getaddrinfo.m4, gl/m4/getdomainname.m4, gl/m4/gethostname.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/inet_ntop.m4, gl/m4/netdb_h.m4, gl/m4/printf.m4, gl/m4/signal_h.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strdup.m4, gl/m4/string_h.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/unistd_h.m4, gl/m4/wchar.m4, gl/netdb.in.h, gl/netinet_in.in.h, gl/signal.in.h, gl/stdarg.in.h, gl/stdint.in.h, gl/stdio-write.c, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/strings.in.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/unistd.in.h, gl/vasnprintf.c, gl/wchar.in.h, gl/xgetdomainname.c, lib/internal.h, lib/netio.c, maint.mk, src/gl/errno.in.h, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/errno_h.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/strerror.m4, src/gl/strerror.c: Update gnulib files. 2008-10-15 Simon Josefsson * configure.ac: Drop sys/poll.h, check not used. 2008-10-08 Simon Josefsson * m4/libgcrypt.m4: Remove. 2008-10-02 Simon Josefsson * AUTHORS: Fix Nicolas' description. 2008-09-10 Simon Josefsson * GNUmakefile, build-aux/config.rpath, doc/getdate.texi, gl/Makefile.am, gl/arpa_inet.in.h, gl/float.in.h, gl/getdate.y, gl/getdelim.c, gl/m4/getdelim.m4, gl/m4/include_next.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/netinet_in.in.h, gl/signal.in.h, gl/stdarg.in.h, gl/stdint.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/strings.in.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/unistd.in.h, gl/vasnprintf.c, gl/wchar.in.h, maint.mk, src/gl/gnulib.mk, src/gl/locale.in.h: Update gnulib files. 2008-08-21 Simon Josefsson * lib/version.c: Update gnulib usage. 2008-08-21 Simon Josefsson * gl/Makefile.am, gl/m4/autobuild.m4, gl/m4/gnulib-comp.m4, gl/m4/string_h.m4, gl/m4/strverscmp.m4, gl/string.in.h, gl/strverscmp.h: Update gnulib files. 2008-08-20 Simon Josefsson * Makefile.am: Don't copy archive to www dir. 2008-08-20 Simon Josefsson * configure.ac: Use autobuild from gnulib. 2008-08-20 Simon Josefsson * gl/Makefile.am, gl/gc-gnulib.c, gl/m4/autobuild.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/signal_h.m4, gl/signal.in.h, m4/autobuild.m4: Update gnulib files. 2008-08-20 Simon Josefsson * doc/shishi.texi: Fix URLs. 2008-08-06 Simon Josefsson * GNUmakefile, build-aux/gnupload, db/gl/m4/gnulib-comp.m4, gl/Makefile.am, gl/c-ctype.c, gl/c-ctype.h, gl/getdate.y, gl/m4/gnulib-comp.m4, gl/mktime.c, gl/vasnprintf.c, src/gl/m4/gnulib-comp.m4: Update gnulib files. 2008-06-30 Simon Josefsson * db/gl/m4/gnulib-tool.m4, gl/m4/getdate.m4, gl/m4/gnulib-tool.m4, src/gl/m4/gnulib-tool.m4: Update gnulib files. 2008-06-24 Simon Josefsson * THANKS: Fix. 2008-06-24 Simon Josefsson * NEWS: Fix ypo. 2008-06-24 Simon Josefsson * NEWS, configure.ac: Bump versions. 2008-06-24 Simon Josefsson * Makefile.am: Reorder uploads. 2008-06-24 Simon Josefsson * ChangeLog: Generated. 2008-06-24 Simon Josefsson * NEWS: Version 0.0.37. 2008-06-24 Simon Josefsson * lib/shishi.h.in: Fix typo. 2008-06-24 Simon Josefsson * doc/reference/shishi-docs.sgml: Fix. 2008-06-24 Simon Josefsson * doc/shishi.texi: Fix. 2008-06-24 Simon Josefsson * lib/shishi.h.in: Typos. 2008-06-24 Simon Josefsson * lib/shishi.h.in: Fix typos and remove obsolete stuff. 2008-06-24 Simon Josefsson * lib/password.c: Doc fix. 2008-06-24 Simon Josefsson * GNUmakefile, db/gl/m4/gnulib-cache.m4, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/signal_h.m4, gl/signal.in.h, src/gl/m4/gnulib-cache.m4: Update gnulib files. 2008-06-19 Simon Josefsson * Makefile.am, examples/Makefile.am: Fix building examples. 2008-06-19 Simon Josefsson * NEWS: Add. 2008-06-19 Simon Josefsson * examples/server.c: Use new API. 2008-06-19 Simon Josefsson * doc/Makefile.am: Generated. 2008-06-19 Simon Josefsson * lib/password.c: Doc fix. 2008-06-19 Simon Josefsson * NEWS, lib/internal.h, lib/password.c, lib/shishi.h.in, tests/Makefile.am, tests/passwdpromptcb.c: New functions to set a password prompt callback. You register the callback using shishi_prompt_password_callback_set and can retrieve the current callback using shishi_prompt_password_callback_get. The callback function should follow the shishi_prompt_password_func function prototype. The shishi_prompt_password function has been updated to call the callbacks, if registered. Inspired by discussion with Graham Shaw . 2008-06-19 Simon Josefsson * NEWS, THANKS, lib/shishi.h.in, lib/tkts.c: libshishi: New ticketset hint flag SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE. When this flag is passed to ticketset functions, it will never query the user for a password. Inspired by discussion with Graham Shaw . 2008-06-19 Simon Josefsson * GNUmakefile, doc/gendocs_template, gl/Makefile.am, gl/m4/stdio_h.m4, gl/override/doc/gendocs_template.diff, gl/stdio.in.h: Update gnulib files. 2008-06-02 Simon Josefsson * gl/stdbool.in.h, gl/stdio-impl.h, gl/vasnprintf.c, gl/xalloc.h, maint.mk: Update gnulib files. 2008-05-20 Simon Josefsson * db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, gl/base64.c, gl/base64.h, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/vasnprintf.c, gl/xalloc.h, gl/xmalloc.c, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4: Update gnulib files. 2008-05-11 Simon Josefsson * lib/init.c: Fix warnings. 2008-05-11 Simon Josefsson * lib/keytab.c: Fix warnings. 2008-05-11 Simon Josefsson * lib/crypto.c: Fix warnings. 2008-05-11 Simon Josefsson * lib/tktccache.c: Fix warnings. 2008-05-11 Simon Josefsson * lib/kerberos5.c: Regenerated. 2008-05-11 Simon Josefsson * lib/asn1.c: Pull in config.h. 2008-05-11 Simon Josefsson * doc/Makefile.am: Generated. 2008-05-11 Simon Josefsson * lib/asn1.c: Drop obsolete _SHISHI_HAS_LIBTASN1_H. 2008-05-11 Simon Josefsson * NEWS: Reorder. 2008-05-11 Simon Josefsson * NEWS, lib/asn1.c, lib/diskio.c, lib/shishi.h.in: Cleanup libtasn1.h dependency in diskio.c. 2008-05-05 Simon Josefsson * doc/Makefile.am: Regenerated. 2008-05-05 Simon Josefsson * doc/Makefile.am: Simplify man page creating to allow easier diff review. 2008-05-05 Simon Josefsson * .clcopying, .cvscopying, Makefile.am: Dist more files. Rename .cvscopying to .clcopying. 2008-05-05 Simon Josefsson * build-aux/gendocs.sh, gl/Makefile.am, gl/arpa_inet.in.h, gl/fseeko.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/inet_ntop.c, gl/inet_ntop.h, gl/m4/arpa_inet_h.m4, gl/m4/gnulib-comp.m4, gl/m4/inet_ntop.m4, gl/m4/rawmemchr.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/sys_socket_h.m4, gl/rawmemchr.c, gl/rawmemchr.valgrind, gl/stdio-impl.h, gl/stdlib.in.h, gl/strchrnul.c, gl/strchrnul.valgrind, gl/string.in.h, gl/sys_socket.in.h: Update gnulib files. 2008-04-24 Simon Josefsson * NEWS: Add. 2008-04-24 Simon Josefsson * NEWS: Add. 2008-04-24 Simon Josefsson * doc/Makefile.am: Dist gdoc-error. Reported by Graham Shaw . 2008-04-23 Simon Josefsson * NEWS: Add. 2008-04-23 Simon Josefsson * .gitignore: Add. 2008-04-23 Simon Josefsson * Makefile.am, NEWS, cfg.mk, po/Makevars, po/fr.po, po/fr.po.in, po/pl.po, po/pl.po.in, po/vi.po, po/vi.po.in: Avoid *.po merge conflicts and --no-location. 2008-04-23 Simon Josefsson * NEWS: Add. 2008-04-23 Simon Josefsson * NEWS, asn1/Makefile.am, asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/int.h, asn1/mem.h: Update to libtasn1 v1.4. 2008-04-23 Simon Josefsson * GNUmakefile, build-aux/gnupload, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, gl/Makefile.am, gl/arpa_inet.in.h, gl/fseeko.c, gl/gc-gnulib.c, gl/m4/arpa_inet_h.m4, gl/m4/extensions.m4, gl/m4/gc-random.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/netinet_in_h.m4, gl/m4/printf.m4, gl/m4/snprintf.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/strndup.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/vasnprintf.c, gl/wchar.in.h, src/gl/m4/getopt.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/strerror.m4: Update gnulib files. 2008-04-23 Simon Josefsson * lib/tkts.c: (do_preauth): Don't ask for password if we already have it. Reported by Graham Shaw in . 2008-04-02 Simon Josefsson * asn1/Makefile.am: Drop defines.h, not used any more. 2008-04-01 Simon Josefsson * gl/Makefile.am, gl/gc-libgcrypt.c, gl/gc.h, gl/getdelim.c, gl/m4/gnulib-comp.m4, gl/m4/stdlib_h.m4, gl/m4/vasnprintf.m4, gl/snprintf.c, gl/stdarg.in.h, gl/stdlib.in.h, gl/vasnprintf.c, gl/vasprintf.c, gl/wchar.in.h, gl/xvasprintf.c: Update gnulib files. 2008-03-25 Simon Josefsson * cfg.mk: Fix config.rpath hack. 2008-03-25 Simon Josefsson * GNUmakefile, build-aux/GNUmakefile, build-aux/maint.mk, cfg.mk, db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-comp.m4, gl/Makefile.am, gl/m4/absolute-header.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/lib-link.m4, gl/m4/stdarg.m4, maint-cfg.mk, maint.mk, src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4: Update gnulib files. 2008-03-10 Simon Josefsson * build-aux/gendocs.sh, gl/alloca.in.h, gl/gc-gnulib.c, gl/getaddrinfo.c, gl/getdelim.c, gl/m4/fseeko.m4, gl/xsize.h, src/gl/getopt.c: Update gnulib files. 2008-02-25 Simon Josefsson * NEWS, configure.ac: Bump versions. 2008-02-25 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/defines.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Update libtasn1 version. 2008-02-25 Simon Josefsson * gl/Makefile.am, gl/m4/environ.m4, gl/m4/gnulib-comp.m4, gl/m4/setenv.m4, gl/m4/time_r.m4, gl/m4/unistd_h.m4, gl/setenv.c, gl/unistd.in.h, gl/unsetenv.c: Update gnulib files. 2008-02-14 Simon Josefsson * ChangeLog: Generated. 2008-02-14 Simon Josefsson * NEWS: Version 0.0.36. 2008-02-14 Simon Josefsson * NEWS: Add. 2008-02-14 Simon Josefsson * NEWS, configure.ac: Bump versions. 2008-02-14 Simon Josefsson * gl/m4/vasnprintf.m4, gl/vasnprintf.c: Update gnulib files. 2008-02-14 Simon Josefsson * lib/tkts.c: Doc fix. 2008-02-14 Simon Josefsson * lib/password.c: Doc fix. 2008-02-07 Simon Josefsson * ChangeLog: Generated. 2008-02-07 Simon Josefsson * NEWS: Version 0.0.35. 2008-02-07 Simon Josefsson * NEWS: Add. 2008-02-07 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kdc-model-01.txt: Add. 2008-02-07 Simon Josefsson * po/pl.po, po/vi.po: Sync with TP. 2008-02-06 Simon Josefsson * NEWS: Add. 2008-02-06 Simon Josefsson * GNUmakefile, Makefile.am, maint-cfg.mk: Brace expansion is not POSIX portable. 2008-02-06 Simon Josefsson * build-aux/gnupload, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/sha1.m4, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/sha1.c, gl/sha1.h, gl/unistd.in.h, gl/vasnprintf.c: Update gnulib files. 2008-01-31 Simon Josefsson * lib/netio.c: Fix debug output for direct sends. 2008-01-17 Simon Josefsson * lib/init.c: Fix messages when creating ~/.shishi. 2008-01-17 Simon Josefsson * NEWS: Add. 2008-01-17 Simon Josefsson * lib/cfg.c: (shishi_cfg_from_file): Don't print warning (done by init.c). 2008-01-17 Simon Josefsson * gl/gethostname.c: Update gnulib files. 2008-01-16 Simon Josefsson * NEWS, configure.ac: Bump versions. 2008-01-16 Simon Josefsson * lib/tkts.c: Remove unused variables. 2008-01-16 Simon Josefsson * lib/principal.c: Silence warnings. 2008-01-16 Simon Josefsson * ChangeLog: Generated. 2008-01-16 Simon Josefsson * Makefile.am: Fix git-tag invocation. 2008-01-16 Simon Josefsson * po/sv.po: Remove. 2008-01-16 Simon Josefsson * NEWS: Version 0.0.34. 2008-01-16 Simon Josefsson * NEWS: Add. 2008-01-16 Simon Josefsson * lib/keytab.c: Use read_binary_file to read keytabs. 2008-01-16 Simon Josefsson * lib/tktccache.c: Need utils.h for hexprint. 2008-01-16 Simon Josefsson * lib/diskio.c: Need larger buffers, BUFSIZ is 512 on MinGW. 2008-01-16 Simon Josefsson * tests/ticketset.c: Fix debug message. 2008-01-16 Simon Josefsson * tests/ticketset.c: Specify our own buffer size, BUFSIZ is 512 bytes on MinGW and we need more. 2008-01-16 Simon Josefsson * tests/ticketset.c: Fix error messages. 2008-01-16 Simon Josefsson * lib/keytab.c: Need prototypes for hexprint. 2008-01-16 Simon Josefsson * lib/diskio.c: Need config.h for getline prototype. Check line length when removing CRLFetc. 2008-01-16 Simon Josefsson * tests/utils.c: Don't print d3 as ffffffd3. 2008-01-16 Simon Josefsson * gl/gc-libgcrypt.c: Update gnulib files. 2008-01-16 Simon Josefsson * lib/diskio.c: When reading data, ignore trailing CR, LF, TAB and SPC. This fixes a problem on MinGW because the CR and LF tests were reversed in the old code. 2008-01-16 Simon Josefsson * tests/safe.c: Fix crash. 2008-01-16 Simon Josefsson * lib/netio.c: Need gnulib's getaddrinfo.h for prototypes. 2008-01-16 Simon Josefsson * gl/gethostname.c, gl/unistd.in.h: Update gnulib files. 2008-01-16 Simon Josefsson * NEWS: Add. 2008-01-16 Simon Josefsson * src/Makefile.am: Only build shishid if we need to. 2008-01-16 Simon Josefsson * configure.ac: Add automake conditional for disabling shishid when there is no syslog. 2008-01-16 Simon Josefsson * gl/gc-libgcrypt.c, gl/getdate.y: Update gnulib files. 2008-01-16 Simon Josefsson * NEWS: Fix. 2008-01-16 Simon Josefsson * NEWS: Add. 2008-01-16 Simon Josefsson * tests/priv.c: Avoid crash. 2008-01-16 Simon Josefsson * tests/utils.c: Simplify #include's. 2008-01-16 Simon Josefsson * lib/tkts.c: Better input parameter validation. 2008-01-16 Simon Josefsson * lib/tkts.c: (shishi_tkts_size): Don't crash on NULL parameter. 2008-01-16 Simon Josefsson * gl/getdate.y: Test to remove broken tzname declaration. Fixes MinGW. 2008-01-15 Simon Josefsson * lib/tktccache.c: Don't use getuid unless we have it. 2008-01-15 Simon Josefsson * configure.ac: Check for getuid. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/minmax.m4, gl/minmax.h, lib/tkts.c: Nedd minmax.h. 2008-01-15 Simon Josefsson * lib/resolv.c: Avoid T_SRV and T_TXT defines, we have our own anyway. 2008-01-15 Simon Josefsson * lib/internal.h: Drop T_SRV, not used. 2008-01-15 Simon Josefsson * lib/internal.h: Drop pwd.h, only needed in authorize.c. 2008-01-15 Simon Josefsson * configure.ac: Check for getpwnam. 2008-01-15 Simon Josefsson * lib/authorize.c: Protect against missing getpwnam, for MinGW. 2008-01-15 Simon Josefsson * lib/netio.c: Don't use arpa/nameserv.h stuff, for MinGW. 2008-01-15 Simon Josefsson * lib/error.c: Don't use syslog if we don't have it. 2008-01-15 Simon Josefsson * NEWS: Add. 2008-01-15 Simon Josefsson * lib/realm.c: Don't use arpa/nameserv.h stuff, for MinGW. 2008-01-15 Simon Josefsson * lib/shishi.h.in: Add SHISHI_DNS_IN. 2008-01-15 Simon Josefsson * build-aux/config.rpath: Update gnulib files. 2008-01-15 Simon Josefsson * src/Makefile.am, src/shisa.c: More --version fixes. 2008-01-15 Simon Josefsson * src/Makefile.am, src/shishid.c: More --version fixes. 2008-01-15 Simon Josefsson * doc/reference/Makefile.am: Drop DISTCLEANFILES. 2008-01-15 Simon Josefsson * db/Makefile.am: Try without unnecessary libraries. 2008-01-15 Simon Josefsson * db/Makefile.am: Need gl/libgnu.la. 2008-01-15 Simon Josefsson * db/Makefile.am: Need -Igl/ too. 2008-01-15 Simon Josefsson * build-aux/config.rpath, db/gl/Makefile.am: Add db/gl/ to build infrastructure. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4: Cleanup. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Cleanup. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4: Cleanup. 2008-01-15 Simon Josefsson * db/gl/gnulib.mk, db/gl/m4/gnulib-cache.m4, db/gl/m4/gnulib-common.m4, db/gl/m4/gnulib-comp.m4, db/gl/m4/gnulib-tool.m4: Add db/gl/ to build infrastructure. 2008-01-15 Simon Josefsson * Makefile.am, db/Makefile.am: Add db/gl/ to build infrastructure. 2008-01-15 Simon Josefsson * db/fileutil.c: Use areadlink instead of xreadlink. 2008-01-15 Simon Josefsson * configure.ac, db/gl/areadlink.c, db/gl/areadlink.h, db/gl/m4/readlink.m4, db/gl/readlink.c, gl/Makefile.am, gl/areadlink.c, gl/areadlink.h, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/readlink.m4, gl/m4/ssize_t.m4, gl/readlink.c, gl/xreadlink.c, gl/xreadlink.h: Move gnulib stuff needed only by libshisa to db/gl/. 2008-01-15 Simon Josefsson * NEWS: Fix. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/getopt.c, gl/getopt.in.h, gl/getopt1.c, gl/getopt_int.h, gl/m4/getopt.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, src/gl/getopt.c, src/gl/getopt.in.h, src/gl/getopt1.c, src/gl/getopt_int.h, src/gl/gnulib.mk, src/gl/m4/getopt.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4: Move getopt module to src/gl. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Move progname module to src/gl. 2008-01-15 Simon Josefsson * gl/m4/gnulib-cache.m4, gl/progname.c, gl/progname.h, src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4, src/gl/progname.c, src/gl/progname.h: Move progname module to src/gl. 2008-01-15 Simon Josefsson * src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4: Don't duplicate stuff. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/locale.in.h, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/locale_h.m4, src/gl/gnulib.mk, src/gl/locale.in.h, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/locale_h.m4: Move locale module to src/gl. 2008-01-15 Simon Josefsson * src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4: Don't duplicate stuff. 2008-01-15 Simon Josefsson * gl/Makefile.am, gl/error.c, gl/error.h, gl/m4/error.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/strerror.m4, gl/strerror.c, src/gl/error.c, src/gl/error.h, src/gl/gnulib.mk, src/gl/m4/error.m4, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/strerror.m4, src/gl/strerror.c: Move error module to src/gl. 2008-01-15 Simon Josefsson * src/shishi.c: Simplify. 2008-01-15 Simon Josefsson * src/gl/Makefile.am: Fix typo. 2008-01-15 Simon Josefsson * src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/stdarg.m4: Don't duplicate stuff. 2008-01-15 Simon Josefsson * src/gl/Makefile.am, src/gl/gettext.h, src/gl/gnulib.mk, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-comp.m4: Don't duplicate stuff. 2008-01-15 Simon Josefsson * src/Makefile.am, src/gl/m4/gnulib-cache.m4, src/shishi.c: Use version-etc module. 2008-01-15 Simon Josefsson * Makefile.am, configure.ac, src/Makefile.am, src/gl/Makefile.am, src/gl/gettext.h, src/gl/m4/gnulib-cache.m4, src/gl/m4/gnulib-common.m4, src/gl/m4/gnulib-comp.m4, src/gl/m4/gnulib-tool.m4, src/gl/m4/stdarg.m4, src/gl/version-etc.c, src/gl/version-etc.h: Create new gnulib directory for non-library stuff. 2008-01-15 Simon Josefsson * configure.ac: Improve project name. 2008-01-15 Simon Josefsson * gl/gc-libgcrypt.c: Update gnulib files. 2008-01-15 Simon Josefsson * doc/shishi.texi: Clarify GPL version. 2008-01-15 Simon Josefsson * Makefile.am: Update update-po target. 2008-01-15 Simon Josefsson * doc/Makefile.am: Simplify copyright years in man pages. 2008-01-15 Simon Josefsson * configure.ac: Line wrap. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/locale.in.h, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/locale_h.m4: Simplify locale.h handling via gnulib. 2008-01-15 Simon Josefsson * src/ccache2shishi.c, src/kdc.h, src/keytab2shishi.c, src/shisa.c, src/shishi.c: Update #include's. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4: Simplify time.h handling via gnulib. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/signal_h.m4, gl/signal.in.h, lib/internal.h: Simplify signal.h handling via gnulib. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, lib/internal.h: Simplify arpa/inet.h handling via gnulib. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, lib/internal.h: Simplify netinet/in.h handling via gnulib. 2008-01-15 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, lib/internal.h: Simplify sys/time.h handling via gnulib. 2008-01-15 Simon Josefsson * NEWS, configure.ac, lib/Makefile.am: Create libshishi-XX.def for MinGW. 2008-01-15 Simon Josefsson * GNUmakefile, build-aux/config.rpath, build-aux/gendocs.sh, gl/Makefile.am, gl/error.h, gl/getdate.y, gl/m4/alloca.m4, gl/m4/gnulib-comp.m4, gl/m4/setenv.m4, gl/m4/stdlib_h.m4, gl/m4/strcase.m4, gl/m4/string_h.m4, gl/m4/unistd_h.m4, gl/malloca.h, gl/printf-parse.c, gl/progname.c, gl/setenv.c, gl/setenv.h, gl/stdio.in.h, gl/stdlib.in.h, gl/string.in.h, gl/unistd.in.h, gl/unsetenv.c, gl/vasnprintf.h, gl/xalloc.h, gl/xvasprintf.h, maint-cfg.mk: Update gnulib files. 2007-12-19 Simon Josefsson * build-aux/gnupload, doc/gendocs_template, gl/float.in.h, gl/fseeko.c, gl/m4/float_h.m4, gl/m4/gnulib-comp.m4, gl/override/doc/gendocs_template, gl/override/doc/gendocs_template.diff, gl/stdint.in.h: Update gnulib files. 2007-12-11 Simon Josefsson * lib/internal.h: Need timespec.h for gettime. 2007-12-11 Simon Josefsson * NEWS, build-aux/gendocs.sh, build-aux/maint.mk, doc/fdl.texi, doc/gpl-3.0.texi, gl/Makefile.am, gl/alloca.in.h, gl/arcfour.c, gl/arcfour.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/des.c, gl/des.h, gl/float+.h, gl/fseeko.c, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdate.y, gl/getdelim.c, gl/getline.c, gl/getpass.c, gl/getpass.h, gl/gettext.h, gl/gettimeofday.c, gl/hmac-md5.c, gl/hmac-sha1.c, gl/hmac.h, gl/inet_ntop.c, gl/inet_ntop.h, gl/lseek.c, gl/m4/getaddrinfo.m4, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/intmax_t.m4, gl/m4/lib-link.m4, gl/m4/longlong.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strings_h.m4, gl/m4/ulonglong.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/wint_t.m4, gl/malloc.c, gl/malloca.c, gl/malloca.h, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h, gl/memxor.c, gl/memxor.h, gl/mktime.c, gl/netinet_in.in.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/read-file.c, gl/read-file.h, gl/realloc.c, gl/sha1.c, gl/sha1.h, gl/size_max.h, gl/snprintf.c, gl/stdbool.in.h, gl/stdint.in.h, gl/stdio.in.h, gl/stdlib.in.h, gl/strcasecmp.c, gl/strdup.c, gl/strerror.c, gl/string.in.h, gl/strings.in.h, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strverscmp.c, gl/strverscmp.h, gl/sys_select.in.h, gl/sys_socket.in.h, gl/sys_stat.in.h, gl/sys_time.in.h, gl/time.in.h, gl/time_r.c, gl/timegm.c, gl/unistd.in.h, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/wchar.in.h, gl/xsize.h: Update gnulib files. 2007-12-11 Simon Josefsson * GNUmakefile, maint-cfg.mk: Remove config.rpath hack. 2007-12-11 Simon Josefsson * NEWS, configure.ac: Use gettext 0.17. 2007-12-11 Simon Josefsson * NEWS, configure.ac: Bump versions. 2007-12-11 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-cross-problem-statement-01.txt , doc/specifications/draft-ietf-krb-wg-kdc-model-00.txt: Add. 2007-10-15 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-cross-problem-statement-00.txt: Add. 2007-10-13 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-gss-cb-hash-agility-02.txt: Add. 2007-10-08 Simon Josefsson * gl/Makefile.am, gl/alloca.in.h, gl/alloca_.h, gl/areadlink.c, gl/areadlink.h, gl/crc.c, gl/crc.h, gl/error.c, gl/error.h, gl/float.in.h, gl/float_.h, gl/fseeko.c, gl/getdate.h, gl/getdate.y, gl/getdomainname.c, gl/getdomainname.h, gl/gethostname.c, gl/getopt.c, gl/getopt.in.h, gl/getopt1.c, gl/getopt_.h, gl/getopt_int.h, gl/getsubopt.c, gl/gettime.c, gl/intprops.h, gl/m4/gnulib-comp.m4, gl/m4/socklen.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/strerror.m4, gl/m4/string_h.m4, gl/m4/strtok_r.m4, gl/netinet_in.in.h, gl/netinet_in_.h, gl/progname.c, gl/progname.h, gl/readlink.c, gl/realloc.c, gl/setenv.c, gl/setenv.h, gl/stdbool.in.h, gl/stdbool_.h, gl/stdint.in.h, gl/stdint_.h, gl/stdio.in.h, gl/stdio_.h, gl/stdlib.in.h, gl/stdlib_.h, gl/strchrnul.c, gl/strerror.c, gl/string.in.h, gl/string_.h, gl/strtok_r.c, gl/sys_select.in.h, gl/sys_select_.h, gl/sys_socket.in.h, gl/sys_socket_.h, gl/sys_stat.in.h, gl/sys_stat_.h, gl/sys_time.in.h, gl/sys_time_.h, gl/time.in.h, gl/time_.h, gl/timespec.h, gl/unistd.in.h, gl/unistd_.h, gl/unsetenv.c, gl/verify.h, gl/wchar.in.h, gl/wchar_.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xreadlink.c, gl/xreadlink.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h: Update gnulib files. 2007-10-08 Simon Josefsson * .cvsignore, asn1/.cvsignore, build-aux/.cvsignore, db/.cvsignore, doc/.cvsignore, doc/man/.cvsignore, doc/reference/.cvsignore, doc/reference/tmpl/.cvsignore, examples/.cvsignore, extra/.cvsignore, extra/pam_shishi/.cvsignore, extra/rsh-redone/.cvsignore, lib/.cvsignore, m4/.cvsignore, po/.cvsignore, src/.cvsignore, tests/.cvsignore: Remove .cvsignore's. 2007-09-25 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-07.txt: Add. 2007-09-25 Simon Josefsson * doc/specifications/draft-rabinovich-krb-wg-x509-name-constraints-00 .txt: Add. 2007-09-14 Simon Josefsson * ChangeLog: Generated. 2007-09-14 Simon Josefsson * NEWS: Version 0.0.33. 2007-09-14 Simon Josefsson * gl/.cvsignore, gl/Makefile.am, gl/gc-gnulib.c, gl/m4/.cvsignore, gl/m4/extensions.m4, gl/m4/getaddrinfo.m4, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/getsubopt.m4, gl/m4/gnulib-comp.m4, gl/m4/malloc.m4, gl/m4/realloc.m4, gl/m4/stdlib_h.m4, gl/m4/strchrnul.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strverscmp.m4, gl/m4/time_h.m4, gl/m4/vasprintf.m4, gl/malloc.c, gl/realloc.c, gl/stdlib_.h: Update gnulib files. 2007-09-13 Simon Josefsson * THANKS: Add. 2007-09-13 Simon Josefsson * NEWS: Add. 2007-09-13 Simon Josefsson * extra/pam_shishi/pam_shishi.c: Store password for subsequent PAM modules that use try_first_pass. Reported by Jack Bates . 2007-09-13 Simon Josefsson * NEWS: Add. 2007-09-13 Simon Josefsson * extra/pam_shishi/pam_shishi.c: Don't echo password to console (untested patch). Reported by Jack Bates . 2007-09-03 Simon Josefsson * NEWS, doc/Makefile.am: Revert. 2007-09-03 Simon Josefsson * README-alpha: Remove. 2007-09-03 Simon Josefsson * README-alpha: Fix. 2007-09-03 Simon Josefsson * NEWS: Add. 2007-09-03 Simon Josefsson * po/LINGUAS, po/vi.po: Sync with TP. 2007-09-03 Simon Josefsson * NEWS: Add. 2007-09-03 Simon Josefsson * doc/Makefile.am: Don't include built manuals in source archive (they are available online). 2007-08-31 Simon Josefsson * configure.ac: Drop gnits mode. 2007-08-24 Simon Josefsson * db/info.h: No need for getline.h. 2007-08-24 Simon Josefsson * lib/internal.h: No need for getline.h. 2007-08-24 Simon Josefsson * gl/Makefile.am, gl/fseeko.c, gl/getdelim.c, gl/getdelim.h, gl/getline.c, gl/getline.h, gl/getpass.c, gl/lseek.c, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/gnulib-comp.m4, gl/m4/lseek.m4, gl/m4/stdio_h.m4, gl/stdio_.h: Update gnulib files. 2007-08-18 Simon Josefsson * NEWS, configure.ac: Bump versions. 2007-08-18 Simon Josefsson * doc/Makefile.am, doc/gpl-3.0.texi, doc/gpl.texi, doc/shishi.texi, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Use gpl-3.0 gnulib module. 2007-08-18 Simon Josefsson * build-aux/GNUmakefile, build-aux/gendocs.sh, build-aux/gnupload, build-aux/maint.mk, doc/fdl.texi, gl/Makefile.am, gl/error.c, gl/m4/gnulib-cache.m4, gl/m4/include_next.m4, gl/m4/stdint.m4, gl/m4/wchar.m4, gl/stdint_.h, gl/sys_time_.h, gl/vasnprintf.c, gl/wchar_.h: Update gnulib files. 2007-08-13 Simon Josefsson * doc/specifications/draft-johansson-kerberos-model-03.txt, doc/specifications/draft-sakane-krb-cross-problem-statement-03.txt: Add. 2007-07-20 Simon Josefsson * doc/specifications/draft-kamada-krb-client-friendly-cross-02.txt: Add. 2007-07-12 Simon Josefsson * doc/specifications/draft-zhu-pku2u-02.txt, doc/specifications/draft-zhu-ws-kerb-03.txt: Add. 2007-07-12 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-anon-04.txt, doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-03.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-06.txt: Add. 2007-06-29 Simon Josefsson * ChangeLog: Generated. 2007-06-29 Simon Josefsson * NEWS: Version 0.0.32. 2007-06-29 Simon Josefsson * NEWS: Add. 2007-06-29 Simon Josefsson * doc/gpl.texi: Add GPLv3. 2007-06-29 Simon Josefsson * doc/shishi.texi: Bump copyright year. 2007-06-29 Simon Josefsson * build-aux/maint.mk: Update gnulib files. 2007-06-29 Simon Josefsson * po/LINGUAS: Sync with TP. 2007-06-29 Simon Josefsson * po/LINGUAS: Sync with TP. 2007-06-29 Simon Josefsson * doc/Makefile.am: Add 2007 copyright year. 2007-06-29 Simon Josefsson * NEWS: Add. 2007-06-29 Simon Josefsson * build-aux/config.rpath, gl/.cvsignore, gl/Makefile.am, gl/float_.h, gl/getdate.y, gl/intprops.h, gl/m4/.cvsignore, gl/m4/absolute-header.m4, gl/m4/float_h.m4, gl/m4/getaddrinfo.m4, gl/m4/gnulib-comp.m4, gl/m4/include_next.m4, gl/m4/netinet_in_h.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_stat_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_h.m4, gl/m4/unistd_h.m4, gl/m4/wchar.m4, gl/netinet_in_.h, gl/printf-args.c, gl/printf-parse.h, gl/stdint_.h, gl/stdio_.h, gl/stdlib_.h, gl/string_.h, gl/sys_select_.h, gl/sys_socket_.h, gl/sys_stat_.h, gl/sys_time_.h, gl/time_.h, gl/unistd_.h, gl/verify.h, gl/wchar_.h, gl/xreadlink.h: Update gnulib files. 2007-06-29 Simon Josefsson * COPYING: Add GPLv3, since automake installs GPLv2. 2007-06-27 Simon Josefsson * .cvscopying: Typos. 2007-06-27 Simon Josefsson * extra/Makefile.am: No need for inetutils.diff. 2007-06-27 Simon Josefsson * lib/shishi.h.in: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * src/ccache2shishi.c, src/kdc.c, src/kdc.h, src/keytab2shishi.c, src/resume.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/authenticator.c, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/keytab.c, tests/low-crypto.c, tests/nonce.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/ccache.c, lib/ccache.h, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/low-crypto.c, lib/netio.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tktccache.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * asn1/Makefile.am: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * extra/inetutils.diff: Remove, not needed anymore. 2007-06-27 Simon Josefsson * extra/README: Fix. 2007-06-27 Simon Josefsson * doc/Makefile.am, lib/shishi.vers, src/ccache2shishi.ggo, src/keytab2shishi.ggo, src/shisa.ggo, src/shishi.ggo, src/shishid.ggo, tests/shisa.sh: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * Makefile.am, configure.ac, db/Makefile.am, db/config.c, db/core.c, db/db.c, db/err.c, db/file.c, db/file.h, db/fileutil.c, db/fileutil.h, db/info.h, db/setup.c, db/shisa.h, examples/Makefile.am, examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, extra/Makefile.am, extra/pam_shishi/Makefile.am, extra/pam_shishi/pam_shishi.c, extra/rsh-redone/Makefile.am, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/low-crypto.c, lib/netio.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h.in, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tktccache.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c, maint-cfg.mk, src/Makefile.am, src/ccache2shishi.c, src/kdc.c, src/kdc.h, src/keytab2shishi.c, src/resume.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/Makefile.am, tests/authenticator.c, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/keytab.c, tests/low-crypto.c, tests/nonce.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * NEWS: Add. 2007-06-27 Simon Josefsson * db/config.c, db/core.c, db/db.c, db/err.c, db/file.c, db/file.h, db/fileutil.c, db/fileutil.h, db/info.h, db/setup.c, db/shisa.h, doc/gdoc-error, examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, extra/pam_shishi/pam_shishi.c, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/ccache.c, lib/ccache.h, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/keytab.c, lib/krberror.c, lib/low-crypto.c, lib/netio.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h.in, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tktccache.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c, src/ccache2shishi.c, src/kdc.c, src/kdc.h, src/keytab2shishi.c, src/resume.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/authenticator.c, tests/ccache.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/keytab.c, tests/low-crypto.c, tests/nonce.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Change GPLv2+ to GPLv3+. 2007-06-27 Simon Josefsson * NEWS, configure.ac: Bump versions. 2007-06-27 Simon Josefsson * AUTHORS: Update PGP key. 2007-06-27 Simon Josefsson * .cvscopying: Use GPL license (as in emacs). 2007-06-12 Simon Josefsson * lib/init.c: Reorder configuration file reading. Now the system config file is read first, then user configuration, then ticket file. 2007-06-12 Simon Josefsson * lib/init.c: Print debug info, not warning if ticket file doesn't exist. Absent ticket isn't critical during initialization. Reported by Josh Triplett , Debian#423944. 2007-06-11 Simon Josefsson * ChangeLog: Generated. 2007-06-11 Simon Josefsson * NEWS: Version 0.0.31. 2007-06-11 Simon Josefsson * NEWS: Add. 2007-06-11 Simon Josefsson * Makefile.am: Add *.po files too. 2007-06-11 Simon Josefsson * po/fr.po: Sync with TP. 2007-06-11 Simon Josefsson * po/LINGUAS: Sync with TP. 2007-06-11 Simon Josefsson * NEWS: Add. 2007-06-11 Simon Josefsson * gl/Makefile.am, gl/allocsa.c, gl/allocsa.h, gl/allocsa.valgrind, gl/fseeko.c, gl/m4/.cvsignore, gl/m4/allocsa.m4, gl/m4/gnulib-comp.m4, gl/m4/malloca.m4, gl/m4/string_h.m4, gl/m4/vasnprintf.m4, gl/malloca.c, gl/malloca.h, gl/malloca.valgrind, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/setenv.c, gl/string_.h, gl/vasnprintf.c: Update. 2007-06-11 Simon Josefsson * po/Makevars: Try again to work around line numbers in *.po. 2007-06-08 Simon Josefsson * gl/Makefile.am, gl/allocsa.h, gl/float_.h, gl/fseeko.c, gl/lseek.c, gl/m4/fseeko.m4, gl/m4/gnulib-comp.m4, gl/m4/lseek.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/wchar.m4, gl/netinet_in_.h, gl/stdint_.h, gl/stdio_.h, gl/stdlib_.h, gl/string_.h, gl/sys_select_.h, gl/sys_socket_.h, gl/sys_stat_.h, gl/sys_time_.h, gl/time_.h, gl/unistd_.h, gl/vasnprintf.c, gl/wchar_.h: iUpdate. 2007-06-08 Simon Josefsson * po/Makevars: Revert --no-location change, it made distcheck fail. 2007-06-08 Simon Josefsson * Makefile.am: Change cvs commands to git commands. 2007-06-07 Simon Josefsson * po/pl.po: Sync with TP. 2007-06-07 Simon Josefsson * po/Makevars: Revert one --no-location. 2007-06-07 Simon Josefsson * po/Makevars: Try to fix *.po conflicts. 2007-05-23 Simon Josefsson * gl/.cvsignore, gl/Makefile.am, gl/float+.h, gl/float_.h, gl/getpass.c, gl/m4/.cvsignore, gl/m4/float_h.m4, gl/m4/fseeko.m4, gl/m4/gnulib-comp.m4, gl/m4/socklen.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/strtok_r.m4, gl/m4/sys_stat_h.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/wint_t.m4, gl/netinet_in_.h, gl/socket_.h, gl/stat_.h, gl/stdint_.h, gl/stdio_.h, gl/stdlib_.h, gl/string_.h, gl/sys_select_.h, gl/sys_socket_.h, gl/sys_stat_.h, gl/sys_time_.h, gl/time_.h, gl/unistd_.h, gl/vasnprintf.c, gl/wchar_.h: Update. 2007-05-02 Simon Josefsson * doc/specifications/draft-sakane-krb-cross-problem-statement-02.txt: Add. 2007-04-16 Simon Josefsson * build-aux/gendocs.sh, extra/pam_shishi/pam_shishi.c, gl/Makefile.am, gl/alloca_.h, gl/allocsa.h, gl/asprintf.c, gl/des.c, gl/gc-libgcrypt.c, gl/getaddrinfo.c, gl/m4/allocsa.m4, gl/m4/gnulib-cache.m4, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/stat_.h, gl/stdbool_.h, gl/stdio_.h, gl/stdlib_.h, gl/string_.h, gl/sys_time_.h, gl/time_.h, gl/vasnprintf.c, gl/vasprintf.c, gl/vasprintf.h, gl/wchar_.h, gl/xvasprintf.c: Update. 2007-04-16 Simon Josefsson * gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/longdouble.m4, gl/m4/stdint.m4, gl/m4/stdio_h.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, lib/internal.h, src/kdc.h, src/shishi.c: Update. 2007-04-16 Simon Josefsson * gl/m4/gnulib-cache.m4: Update. 2007-04-11 Simon Josefsson * lib/low-crypto.c: (_shishi_crypto_init): Call gc_init. 2007-04-11 Simon Josefsson * maint-cfg.mk: Need --with-libgcrypt. 2007-03-13 Simon Josefsson * m4/.cvsignore: [no log message] 2007-03-13 Simon Josefsson * configure.ac: Bump gettext version. 2007-03-13 Simon Josefsson * gl/des.c: Update. 2007-03-13 Simon Josefsson * db/fileutil.c: Use new xreadlink interface. 2007-03-13 Simon Josefsson * .cvsignore, build-aux/.cvsignore, doc/.cvsignore, gl/.cvsignore: [no log message] 2007-03-13 Simon Josefsson * db/info.h, lib/cfg.c, lib/gztime.c, lib/internal.h: Remove unneeded gnulib headers. 2007-03-13 Simon Josefsson * maint-cfg.mk: Reinstall config.rpath. 2007-03-13 Simon Josefsson * Makefile.am: Use build-aux/. 2007-03-13 Simon Josefsson * GNUmakefile, build-aux/GNUmakefile, build-aux/config.rpath, build-aux/gendocs.sh, build-aux/gnupload, build-aux/link-warning.h, build-aux/maint.mk, gendocs.sh, gl/m4/stdio_h.m4, gl/m4/stdlib_h.m4, gl/m4/string_h.m4, gl/m4/time_h.m4, gl/netinet_in_.h, gl/stdio_.h, gl/stdlib_.h, gl/string_.h, gl/sys_select_.h, gl/time_.h, gnupload, maint.mk: Update. 2007-03-13 Simon Josefsson * gl/Makefile.am, gl/allocsa.h, gl/des.c, gl/des.h, gl/gai_strerror.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc.h, gl/getaddrinfo.c, gl/getdate.h, gl/getdate.y, gl/getopt_.h, gl/getsubopt.c, gl/getsubopt.h, gl/gettimeofday.c, gl/m4/getsubopt.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-common.m4, gl/m4/gnulib-comp.m4, gl/m4/mbchar.m4, gl/m4/mbiter.m4, gl/m4/mbrtowc.m4, gl/m4/memchr.m4, gl/m4/mktime.m4, gl/m4/netinet_in_h.m4, gl/m4/readlink.m4, gl/m4/setenv.m4, gl/m4/snprintf.m4, gl/m4/socklen.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/sys_select_h.m4, gl/m4/sys_socket_h.m4, gl/m4/sys_time_h.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/unistd_h.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/wctype.m4, gl/m4/wcwidth.m4, gl/m4/xreadlink.m4, gl/mbchar.c, gl/mbchar.h, gl/mbuiter.h, gl/memchr.c, gl/mktime.c, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/readlink.c, gl/setenv.c, gl/setenv.h, gl/snprintf.c, gl/snprintf.h, gl/socket_.h, gl/stdbool_.h, gl/stdint_.h, gl/strcase.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strchrnul.h, gl/strdup.c, gl/strdup.h, gl/strncasecmp.c, gl/strndup.c, gl/strndup.h, gl/strnlen.c, gl/strnlen.h, gl/strnlen1.c, gl/strnlen1.h, gl/strtok_r.c, gl/strtok_r.h, gl/sys_time_.h, gl/time_r.c, gl/time_r.h, gl/timegm.c, gl/timegm.h, gl/timespec.h, gl/unistd_.h, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.h, gl/wctype_.h, gl/wcwidth.h, gl/xalloc.h, gl/xreadlink.c, gl/xreadlink.h, gl/xstrndup.c, gl/xvasprintf.h: Update 2007-03-13 Simon Josefsson * configure.ac: Bump versions. Use build-aux/. 2007-03-09 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-gss-cb-hash-agility-01.txt: Add. 2007-03-07 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-09.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-06.txt, doc/specifications/draft-ietf-krb-wg-naming-03.txt, doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-02.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-05.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-04.txt: Add. 2007-03-07 Simon Josefsson * doc/specifications/draft-kamada-krb-client-friendly-cross-01.txt: Add. 2007-03-06 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-anon-03.txt, doc/specifications/draft-ietf-krb-wg-naming-02.txt, doc/specifications/draft-zhu-pkinit-ecc-03.txt: Add. 2007-02-28 Simon Josefsson * doc/specifications/draft-zhu-pku2u-01.txt, doc/specifications/draft-zhu-ws-kerb-01.txt: Add. 2007-02-25 Simon Josefsson * doc/specifications/draft-kamada-krb-client-friendly-cross-00.txt: Add. 2007-02-21 Simon Josefsson * doc/specifications/draft-zhu-pku2u-00.txt: Add. 2007-01-19 Simon Josefsson * .cvsignore: [no log message] 2007-01-19 Simon Josefsson * doc/Makefile.am, gl/Makefile.am, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/m4/clock_time.m4, gl/m4/eoverflow.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc-md5.m4, gl/m4/gc-random.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/lib-link.m4, gl/m4/mbchar.m4, gl/m4/mktime.m4, gl/m4/size_max.m4, gl/m4/stdint.m4, gl/m4/sys_time_h.m4, gl/m4/timespec.m4, gl/m4/unistd_h.m4, gl/m4/wcwidth.m4, gl/m4/wint_t.m4, gl/mbchar.h, gl/socket_.h, gl/stdint_.h, gl/strdup.h, gl/sys_time_.h, gl/timespec.h, gl/wcwidth.h, gl/xreadlink.c: Update. 2007-01-19 Simon Josefsson * gl/Makefile.am, gl/m4/gettimeofday.m4, gl/m4/mktime.m4: Update. 2007-01-19 Simon Josefsson * gl/m4/gnulib-common.m4, gl/m4/sys_time_h.m4, gl/m4/wchar.m4, gl/m4/wctype.m4, gl/sys_time_.h, gl/unistd_.h, gl/wchar_.h, gl/wctype_.h: Add. 2007-01-19 Simon Josefsson * lib/tktccache.c: Add old stuff. 2007-01-12 Simon Josefsson * lib/pki.c: Make it compile. 2007-01-12 Simon Josefsson * lib/internal.h: Add x509cafile variable. 2007-01-12 Simon Josefsson * NEWS, lib/pki.c, lib/shishi.h.in, lib/starttls.c: Verify CA in client, suggested by Alberto Fondi . 2006-12-26 Simon Josefsson * doc/specifications/rfc4757.txt: Add. 2006-11-17 Simon Josefsson * gl/Makefile.am, gl/getaddrinfo.c, gl/getopt_.h, gl/gettext.h, gl/imaxtostr.c, gl/intprops.h, gl/inttostr.c, gl/inttostr.h, gl/m4/alloca.m4, gl/m4/allocsa.m4, gl/m4/gnulib-comp.m4, gl/m4/inline.m4, gl/m4/inttostr.m4, gl/m4/lib-link.m4, gl/m4/longlong.m4, gl/m4/snprintf.m4, gl/m4/strcase.m4, gl/m4/xalloc.m4, gl/mbchar.h, gl/offtostr.c, gl/printf-parse.c, gl/snprintf.c, gl/snprintf.h, gl/stdint_.h, gl/strcase.h, gl/strnlen1.c, gl/uinttostr.c, gl/umaxtostr.c, gl/xalloc.h, gl/xmalloc.c, gl/xvasprintf.c, gnupload: Update. 2006-11-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2006-11-11 Simon Josefsson * doc/specifications/draft-sakane-krb-cross-problem-statement-01.txt: Add. 2006-11-06 Simon Josefsson * shishi.conf.in, shishi.skel.in: Clarify protocol strings ("tcp", "udp", "tls"), reported by Alberto Fondi . 2006-11-06 Simon Josefsson * lib/cfg.c: (shishi_cfg): Use strcasecmp for protocol strings, reported by Alberto Fondi . 2006-11-01 Simon Josefsson * ChangeLog: [no log message] 2006-11-01 Simon Josefsson * configure.ac: Bump versions, for 0.0.30. 2006-11-01 Simon Josefsson * NEWS: Version 0.0.30. 2006-11-01 Simon Josefsson * NEWS: Add. 2006-11-01 Simon Josefsson * lib/starttls.c: Send TCP length octet for TLS packets too. 2006-11-01 Simon Josefsson * src/server.c: Fix length field. 2006-11-01 Simon Josefsson * src/server.c: Fix length field. 2006-11-01 Simon Josefsson * src/server.c: More krb5starttls -02 fixes. 2006-11-01 Simon Josefsson * src/starttls.c: Implement the -02 protocol. 2006-11-01 Simon Josefsson * src/server.c: Send 4-octet length field for TLS connections too. 2006-11-01 Simon Josefsson * lib/starttls.c: Upgrade to modern STARTTLS drafts. 2006-11-01 Simon Josefsson * lib/enckdcreppart.c: (shishi_enckdcreppart_nonce_set): Use shishi_asn1_write_uint32 to write the nonce. 2006-11-01 Simon Josefsson * tests/.cvsignore: [no log message] 2006-11-01 Simon Josefsson * NEWS: Fix. 2006-11-01 Simon Josefsson * NEWS: Add. 2006-11-01 Simon Josefsson * tests/Makefile.am: Add nonce. 2006-11-01 Simon Josefsson * tests/nonce.c: Add, to detect uint32 reading regression. 2006-11-01 Simon Josefsson * lib/asn1.c: Fix last commit. 2006-11-01 Simon Josefsson * THANKS: Add. 2006-11-01 Simon Josefsson * lib/asn1.c: (shishi_asn1_read_int32): Convert buffer to integer correctly, to fix reading nonces, reported by Alberto Fondi . 2006-11-01 Simon Josefsson * ChangeLog: [no log message] 2006-11-01 Simon Josefsson * lib/tktccache.c: (shishi_tkts_default_ccache_set): Doc fix. 2006-11-01 Simon Josefsson * po/pl.po: Generated. 2006-11-01 Simon Josefsson * NEWS: Version 0.0.29. 2006-11-01 Simon Josefsson * doc/.cvsignore: [no log message] 2006-11-01 Simon Josefsson * NEWS: Add. 2006-11-01 Simon Josefsson * configure.ac: Bump versions. 2006-11-01 Simon Josefsson * doc/Makefile.am: Build ccache2shishi.1. 2006-11-01 Simon Josefsson * ChangeLog: [no log message] 2006-11-01 Simon Josefsson * NEWS: Version 0.0.28. 2006-11-01 Simon Josefsson * po/pl.po: Sync with TP. 2006-10-31 Simon Josefsson * lib/version.c: Doc fix. 2006-10-31 Simon Josefsson * lib/crypto-md.c: Nicolas assigned his copyright to the FSF, see AUTHORS. 2006-10-31 Simon Josefsson * lib/Makefile.am: Dist ccache.h. 2006-10-31 Simon Josefsson * gl/arcfour.c, gl/base64.c, gl/crc.c, gl/des.c, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/getaddrinfo.c, gl/getdelim.c, gl/getline.c, gl/gettext.h, gl/hmac-md5.c, gl/hmac-sha1.c, gl/m4/gnulib-comp.m4, gl/m4/lib-link.m4, gl/m4/signed.m4, gl/m4/sys_stat_h.m4, gl/m4/vasnprintf.m4, gl/mbchar.c, gl/mbchar.h, gl/md4.c, gl/memxor.c, gl/progname.h, gl/read-file.c, gl/stat_.h, gl/xgetdomainname.c, gl/xstrndup.c: Update. 2006-10-31 Simon Josefsson * NEWS: Mention ccache2shishi. 2006-10-26 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-pkinit-alg-agility-01.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-04.txt: Add. 2006-10-25 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-preauth-framework-03.txt, doc/specifications/draft-ietf-krb-wg-rfc1510ter-03.txt: Add. 2006-10-25 Simon Josefsson * gl/Makefile.am, gl/getaddrinfo.c, gl/getdate.y, gl/imaxtostr.c, gl/intprops.h, gl/inttostr.c, gl/inttostr.h, gl/m4/gnulib-comp.m4, gl/m4/inttostr.m4, gl/m4/snprintf.m4, gl/m4/wcwidth.m4, gl/offtostr.c, gl/snprintf.c, gl/snprintf.h, gl/stdint_.h, gl/uinttostr.c, gl/umaxtostr.c, gl/wcwidth.h: Update. 2006-10-23 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-hw-auth-04.txt: Add. 2006-10-20 Simon Josefsson * gl/m4/alloca.m4, gl/m4/allocsa.m4, gl/m4/gnulib-comp.m4, gl/m4/size_max.m4: Update. 2006-10-20 Simon Josefsson * gl/Makefile.am, gl/allocsa.h, gl/getpass.c, gl/gettext.h, gl/m4/allocsa.m4, gl/m4/extensions.m4, gl/m4/getpass.m4, gl/m4/gnulib-comp.m4, gl/m4/longlong.m4, gl/m4/stdint.m4, gl/m4/strndup.m4, gl/m4/ulonglong.m4, gl/m4/vasnprintf.m4, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/progname.c, gl/stdint_.h, gl/strdup.c, gl/strndup.c, gl/strndup.h, gl/vasnprintf.c, gl/xasprintf.c, gl/xvasprintf.c, gnupload: Update. 2006-10-20 Simon Josefsson * doc/specifications/draft-zhu-ws-kerb-00.txt: Add. 2006-10-17 Simon Josefsson * doc/specifications/draft-sakane-krb-cross-problem-statement-00.txt: Add. 2006-10-14 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-anon-02.txt, doc/specifications/draft-ietf-krb-wg-naming-01.txt, doc/specifications/draft-richards-otp-kerberos-01.txt: Add. 2006-10-10 Simon Josefsson * lib/tktccache.c: Doc fix. 2006-10-10 Simon Josefsson * lib/crypto.c, lib/shishi.h.in: Don't use variable name "constant", since gtk-doc warns about it. 2006-10-10 Simon Josefsson * lib/kerberos5.c: Update. 2006-10-04 Simon Josefsson * lib/kerberos5.asn1: Add. 2006-10-03 Simon Josefsson * lib/kerberos5.asn1: Further copyright discussions. 2006-10-03 Simon Josefsson * lib/kerberos5.asn1: More license discussions. 2006-09-29 Simon Josefsson * doc/Makefile.am: Update. 2006-09-29 Simon Josefsson * lib/tktccache.c: Fix warnings. 2006-09-29 Simon Josefsson * lib/shishi.h.in: Add. 2006-09-29 Simon Josefsson * lib/internal.h: New field ccachedefault for default ccache filenames, used by tktccache.c. 2006-09-29 Simon Josefsson * lib/tktccache.c: Add shishi_tkts_default_ccache_guess, shishi_tkts_default_ccache, shishi_tkts_default_ccache_set. Add work in progress, shishi_tkts_to_ccache_mem and shishi_tkt_to_ccache_mem. (shishi_tkts_add_ccache_mem): Set more fields, to make converted tickets work. 2006-09-29 Simon Josefsson * NEWS: Fix. 2006-09-29 Simon Josefsson * NEWS, THANKS: Add. 2006-09-28 Simon Josefsson * NEWS: Add. 2006-09-28 Simon Josefsson * src/.cvsignore: [no log message] 2006-09-28 Simon Josefsson * src/Makefile.am, src/ccache2shishi.c, src/ccache2shishi.ggo: Add ccache2shishi. 2006-09-28 Simon Josefsson * NEWS: Add. 2006-09-28 Simon Josefsson * gl/Makefile.am, gl/m4/gc-arcfour.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2006-09-27 Simon Josefsson * src/keytab2shishi.ggo: Fix copyright years. 2006-09-26 Simon Josefsson * lib/ccache.c: Fix. 2006-09-26 Simon Josefsson * lib/ccache.c: Fix typos. 2006-09-26 Simon Josefsson * lib/gztime.c, lib/shishi.h.in: (shishi_ctime): Add. 2006-09-26 Simon Josefsson * lib/ccache.c, lib/ccache.h: Add ccache_pack. 2006-09-26 Simon Josefsson * lib/ccache.c, lib/ccache.h: Don't mention Shishi in license template. 2006-09-26 Simon Josefsson * lib/ccache.c: Doc fix. 2006-09-26 Simon Josefsson * lib/ccache.h: Add storage for key data (optional). Use 'char*' instead of 'void*' for data. 2006-09-25 Simon Josefsson * lib/ccache.h: Add ccache_pack_credential. Use char* instead of void* for data buffers. 2006-09-25 Simon Josefsson * lib/ccache.c: Add ccache_pack_credential, and related helper functions. Use char* instead of void* for data buffers. Fix NUL checks, and their comments. 2006-09-23 Simon Josefsson * lib/shishi.h.in: Add ccache APIs. 2006-09-23 Simon Josefsson * lib/tktccache.c: Doc fix. 2006-09-23 Simon Josefsson * doc/reference/Makefile.am: Ignore ccache.h. 2006-09-23 Simon Josefsson * doc/Makefile.am: Update. 2006-09-23 Simon Josefsson * m4/libgnutls.m4: Update from gnutls CVS. 2006-09-23 Simon Josefsson * m4/libgcrypt.m4: Update from libgcrypt. 2006-09-23 Simon Josefsson * gl/gc-gnulib.c, gl/getaddrinfo.c, gl/m4/getdate.m4, gl/m4/gnulib-comp.m4, gl/m4/signed.m4, gl/m4/sockpfaf.m4, gl/m4/strndup.m4, gl/m4/time_r.m4, gl/m4/vasprintf.m4, gl/md4.c, gl/strtok_r.c: Update. 2006-09-23 Simon Josefsson * configure.ac: Bump versions. 2006-09-23 Simon Josefsson * tests/.cvsignore: [no log message] 2006-09-23 Simon Josefsson * NEWS, lib/Makefile.am, lib/ccache.c, lib/error.c, lib/shishi.h.in, lib/tktccache.c, tests/Makefile.am, tests/ccache.c: Add ccache reader APIs. 2006-09-23 Simon Josefsson * NEWS: Add. 2006-09-23 Simon Josefsson * lib/enckdcreppart.c, lib/shishi.h.in: Add. 2006-09-23 Simon Josefsson * doc/ccache.txt: Update. 2006-09-23 Simon Josefsson * lib/ccache.c: Ticket flags are stored bit-swapped?! 2006-09-23 Simon Josefsson * lib/ccache.c: Fix typo. 2006-09-23 Simon Josefsson * lib/ccache.c: Save ticket pointers. 2006-09-21 Simon Josefsson * tests/Makefile.am: Simplify valgrind. 2006-09-21 Simon Josefsson * configure.ac: Test for valgrind. 2006-09-20 Simon Josefsson * doc/ccache.txt: Update. 2006-09-20 Simon Josefsson * lib/ccache.c, lib/ccache.h: Add. 2006-09-20 Simon Josefsson * doc/ccache.txt: Change field name. 2006-09-18 Simon Josefsson * tests/utils.c: Fix last commit. 2006-09-18 Simon Josefsson * tests/utils.c: More debugging output for --debug. 2006-09-18 Simon Josefsson * lib/keytab.c: Fix comment. 2006-09-18 Simon Josefsson * lib/Makefile.am, lib/keys.c, lib/keytab.c: Separate out keytab stuff from keys.c to keytab.c. 2006-09-15 Simon Josefsson * ChangeLog: [no log message] 2006-09-15 Simon Josefsson * po/pl.po: Generated. 2006-09-15 Simon Josefsson * NEWS: Version 0.0.27. 2006-09-15 Simon Josefsson * src/Makefile.am: Move keytab2shishi to sbin/. 2006-09-15 Simon Josefsson * gl/Makefile.am: Update. 2006-09-15 Simon Josefsson * gl/Makefile.am: Update. 2006-09-15 Simon Josefsson * gl/Makefile.am: Update. 2006-09-15 Simon Josefsson * doc/.cvsignore: [no log message] 2006-09-15 Simon Josefsson * doc/Makefile.am: Add keytab2shishi.1. 2006-09-15 Simon Josefsson * NEWS: Add. 2006-09-15 Simon Josefsson * AUTHORS: Update PGP key. 2006-09-15 Simon Josefsson * gl/allocsa.c, gl/asnprintf.c, gl/asprintf.c, gl/mbchar.c, gl/printf-args.c, gl/printf-parse.c, gl/progname.c, gl/readlink.c, gl/strcasecmp.c, gl/strncasecmp.c, gl/strnlen1.c, gl/strtok_r.c, gl/unsetenv.c, gl/vasnprintf.c, gl/vasprintf.c: Update. 2006-09-14 Simon Josefsson * Makefile.am: Use gnulib's gnupload. 2006-09-14 Simon Josefsson * NEWS, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gnupload: Add. 2006-09-14 Simon Josefsson * lib/Makefile.am: Fix shishi-int.h for C99 platforms. 2006-09-14 Simon Josefsson * NEWS: Add. 2006-09-14 Simon Josefsson * gl/error.c, gl/gai_strerror.c, gl/getdate.y, gl/getdomainname.c, gl/gethostname.c, gl/getopt.c, gl/getopt1.c, gl/getpass.c, gl/gettime.c, gl/gettimeofday.c, gl/inet_ntop.c, gl/m4/getdate.m4, gl/md5.c, gl/memchr.c, gl/realloc.c, gl/setenv.c, gl/sha1.c, gl/snprintf.c, gl/strdup.c, gl/strndup.c, gl/strnlen.c, gl/strverscmp.c, gl/time_r.c, gl/timegm.c, gl/xgethostname.c, gl/xmalloc.c, gl/xreadlink.c: Update. 2006-09-13 Simon Josefsson * doc/ccache.txt: Add. 2006-09-13 Simon Josefsson * doc/Makefile.am: Dist ccache.txt. 2006-09-13 Simon Josefsson * doc/ccache.txt, doc/shishi.texi: Add. 2006-09-13 Simon Josefsson * gl/Makefile.am, gl/m4/getdate.m4: Update. 2006-09-13 Simon Josefsson * doc/shishi.texi: Fix GPL cross reference. 2006-09-13 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/override/doc/gendocs_template: Add. 2006-09-13 Simon Josefsson * configure.ac: Bump required autoconf version to 2.60. 2006-09-13 Simon Josefsson * doc/fdl.texi, doc/gpl.texi, gl/Makefile.am, gl/error.c, gl/getaddrinfo.c, gl/m4/arcfour.m4, gl/m4/crc.m4, gl/m4/des.m4, gl/m4/gc-pbkdf2-sha1.m4, gl/m4/gc.m4, gl/m4/getdate.m4, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/gettime.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/hmac-md5.m4, gl/m4/hmac-sha1.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/lib-link.m4, gl/m4/longlong.m4, gl/m4/mbchar.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/memxor.m4, gl/m4/mktime.m4, gl/m4/onceonly_2_57.m4, gl/m4/read-file.m4, gl/m4/sha1.m4, gl/m4/stdint_h.m4, gl/m4/strdup.m4, gl/m4/strerror_r.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strverscmp.m4, gl/m4/time_r.m4, gl/m4/timespec.m4, gl/m4/xalloc.m4, gl/m4/xreadlink.m4, gl/mbchar.h, gl/mktime.c, gl/stat_.h, gl/stdint_.h, gl/vasnprintf.c, gl/vasprintf.c: Update. 2006-09-13 Simon Josefsson * doc/shishi.texi: Add GPL. Move concept index last. 2006-08-19 Simon Josefsson * NEWS: Add. 2006-08-19 Simon Josefsson * NEWS: Fix. 2006-08-19 Simon Josefsson * asn1/libtasn1.h, doc/getdate.texi, gendocs.sh, gl/Makefile.am, gl/allocsa.h, gl/error.c, gl/error.h, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/gettext.h, gl/inet_ntop.h, gl/m4/arpa_inet_h.m4, gl/m4/base64.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getline.m4, gl/m4/gnulib-comp.m4, gl/m4/inet_ntop.m4, gl/m4/lib-link.m4, gl/m4/mbchar.m4, gl/m4/memxor.m4, gl/m4/minmax.m4, gl/m4/netinet_in_h.m4, gl/m4/onceonly_2_57.m4, gl/m4/restrict.m4, gl/m4/stdint.m4, gl/m4/strtok_r.m4, gl/m4/time_r.m4, gl/m4/wcwidth.m4, gl/mbchar.h, gl/minmax.h, gl/printf-args.c, gl/readlink.c, gl/setenv.c, gl/snprintf.c, gl/stdint_.h, gl/strnlen1.c, gl/strnlen1.h, gl/vasprintf.h, gl/wcwidth.h: Update. 2006-08-11 Simon Josefsson * doc/specifications/draft-jaganathan-rc4-hmac-03.txt: Add. 2006-07-28 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-anon-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-05.txt, doc/specifications/draft-ietf-tls-psk-null-00.txt: Add. 2006-07-14 Simon Josefsson * NEWS: Add. 2006-07-14 Simon Josefsson * src/shishid.c: Use short program name in syslog. 2006-07-14 Simon Josefsson * configure.ac: Simplify header checks. 2006-07-14 Simon Josefsson * lib/internal.h, tests/utils.c: Simplify. 2006-07-14 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/sys_select_h.m4, gl/m4/sys_stat_h.m4, gl/stat_.h: Use gnulib unistd.h replacer. 2006-07-14 Simon Josefsson * doc/gendocs_template: Fix. 2006-07-14 Simon Josefsson * Makefile.am, configure.ac, doc/gendocs_template, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Use gnulib sys/* replacers. 2006-07-14 Simon Josefsson * configure.ac, lib/Makefile.am, m4/ax_create_stdint_h.m4: Use gnulib stdint. 2006-07-14 Simon Josefsson * doc/gendocs.sh, gendocs.sh, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2006-07-11 Simon Josefsson * gl/Makefile.am, gl/m4/absolute-header.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/stdint.m4: Update. 2006-07-10 Simon Josefsson * gl/.cvsignore: [no log message] 2006-07-10 Simon Josefsson * : Add. 2006-07-10 Simon Josefsson * configure.ac, doc/Makefile.am: Fix dia invocation. 2006-07-10 Simon Josefsson * gl/Makefile.am, gl/base64.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdate.y, gl/getopt.c, gl/inet_ntop.c, gl/inet_ntop.h, gl/m4/absolute-header.m4, gl/m4/full-header-path.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/getopt.m4, gl/m4/getpass.m4, gl/m4/gnulib-comp.m4, gl/m4/inet_ntop.m4, gl/m4/longlong.m4, gl/m4/minmax.m4, gl/m4/onceonly_2_57.m4, gl/m4/snprintf.m4, gl/m4/sockpfaf.m4, gl/m4/stdarg.m4, gl/m4/stdint.m4, gl/m4/strndup.m4, gl/m4/wcwidth.m4, gl/mbchar.h, gl/minmax.h, gl/snprintf.c, gl/snprintf.h, gl/stdint_.h, gl/strverscmp.c, gl/wcwidth.h, gl/xvasprintf.h: Update. 2006-07-10 Simon Josefsson * doc/specifications/draft-ietf-kitten-gssapi-domain-based-names-02.t xt: Add. 2006-07-01 Simon Josefsson * doc/specifications/rfc4556.txt, doc/specifications/rfc4557.txt: Add. 2006-06-29 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-08.txt: Add. 2006-06-27 Simon Josefsson * doc/gdoc: Use GNU-style warnings. 2006-06-27 Simon Josefsson * doc/gdoc: Sync with gnutls. 2006-06-27 Simon Josefsson * NEWS: Add. 2006-06-26 Simon Josefsson * asn1/coding.c, asn1/libtasn1.h: Update to 0.3.5. 2006-06-26 Simon Josefsson * gl/Makefile.am, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/m4/getaddrinfo.m4, gl/m4/sockpfaf.m4, gl/m4/stdint.m4, gl/socket_.h, gl/stdint_.h: Update. 2006-06-22 Simon Josefsson * configure.ac: Make portable to mingw. 2006-06-21 Simon Josefsson * doc/specifications/draft-zrelli-krb-xkdcp-00.txt: Add. 2006-06-21 Simon Josefsson * README: Fix. 2006-06-21 Simon Josefsson * gl/Makefile.am, gl/alloca_.h, gl/getdate.y, gl/m4/full-header-path.m4, gl/m4/gnulib-comp.m4, gl/m4/inttypes.m4, gl/m4/setenv.m4, gl/m4/size_max.m4, gl/m4/ssize_t.m4, gl/m4/stdint.m4, gl/read-file.c, gl/realloc.c, gl/size_max.h, gl/stdint_.h, gl/unsetenv.c: Update. 2006-06-20 Simon Josefsson * doc/Makefile.am: Update dia call. 2006-06-20 Simon Josefsson * lib/kdcreq.c: Fix. 2006-06-13 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-naming-00.txt: Add. 2006-06-08 Simon Josefsson * doc/specifications/rfc4537.txt: Add. 2006-06-06 Simon Josefsson * doc/specifications/draft-richards-otp-kerberos-00.txt: Add. 2006-06-01 Simon Josefsson * lib/tkts.c: Use shishi_verbose. 2006-06-01 Simon Josefsson * lib/enckdcreppart.c, lib/kdcrep.c, lib/netio.c, lib/priv.c, lib/tkts.c: Fix. 2006-06-01 Simon Josefsson * lib/error.c: Fix. 2006-06-01 Simon Josefsson * lib/error.c: Fix. 2006-06-01 Simon Josefsson * lib/error.c: Add shishi_verbose. 2006-06-01 Simon Josefsson * lib/shishi.h.in: Add. 2006-06-01 Simon Josefsson * lib/diskio.c: Rewrite slightly. 2006-06-01 Simon Josefsson * doc/Makefile.am, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/read-file.c, gl/realloc.c: Update. 2006-05-31 Simon Josefsson * lib/internal.h, lib/keys.c: Fix strfile->read-file. 2006-05-31 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/read-file.m4, gl/m4/strfile.m4, gl/m4/strndup.m4, gl/read-file.c, gl/read-file.h, gl/strfile.c, gl/strfile.h, gl/strndup.c: Update. 2006-05-30 Simon Josefsson * po/pl.po: Sync with TP. 2006-05-30 Simon Josefsson * tests/Makefile.am: Dist keytab1.bin too. 2006-05-30 Simon Josefsson * lib/keys.c, src/keytab2shishi.c: More debug. 2006-05-30 Simon Josefsson * tests/.cvsignore: [no log message] 2006-05-30 Simon Josefsson * tests/Makefile.am, tests/keytab.c: Add self test of keytab functions. 2006-05-30 Simon Josefsson * src/.cvsignore: [no log message] 2006-05-30 Simon Josefsson * src/Makefile.am, src/keytab2shishi.c, src/keytab2shishi.ggo: Add keytab2shishi tool. 2006-05-30 Simon Josefsson * lib/keys.c: Fix. 2006-05-30 Simon Josefsson * lib/error.c: Fix. 2006-05-30 Simon Josefsson * lib/diskio.c: Fix. 2006-05-30 Simon Josefsson * lib/keys.c, lib/shishi.h.in: Add. 2006-05-30 Simon Josefsson * lib/keys.c: Fix. 2006-05-30 Simon Josefsson * lib/keys.c: Fix principal name. 2006-05-30 Simon Josefsson * lib/keys.c: Add. 2006-05-30 Simon Josefsson * gl/strfile.c: Add. 2006-05-30 Simon Josefsson * NEWS: Add. 2006-05-30 Simon Josefsson * lib/keys.c: Fix. 2006-05-30 Simon Josefsson * lib/keys.c: Fix. 2006-05-30 Simon Josefsson * lib/keys.c: Read MIT keytab's. Fix mem leak. 2006-05-30 Simon Josefsson * lib/shishi.h.in: Add. 2006-05-28 Simon Josefsson * lib/error.c, lib/shishi.h.in: Add SHISHI_KEYTAB_ERROR. 2006-05-28 Simon Josefsson * gl/Makefile.am, gl/getpass.c, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/strfile.m4, gl/printf-args.c, gl/strfile.c, gl/strfile.h, lib/internal.h: Add. 2006-05-26 Simon Josefsson * lib/keys.c: Typo. 2006-05-26 Simon Josefsson * lib/shishi.h.in: Add Shishi_keys. 2006-05-26 Simon Josefsson * lib/shishi.h.in: Add. 2006-05-26 Simon Josefsson * lib/tkt.c: Typo. 2006-05-26 Simon Josefsson * lib/tkts.c: Reset old tkts in shishi_tkts_done(). 2006-05-26 Simon Josefsson * lib/tkt.c: Deep-copy the tkt->key, so we can safely deallocate it. 2006-05-26 Simon Josefsson * lib/key.c: Fix mem leaks. 2006-05-26 Simon Josefsson * lib/keys.c: Simplify. 2006-05-26 Simon Josefsson * lib/keys.c: Fix logic in matching hostkeys, reported by Elrond. 2006-05-23 Simon Josefsson * lib/init.c: Fix mem leak, reported by Elrond. 2006-05-18 Simon Josefsson * gl/m4/stdbool.m4, gl/sha1.c, gl/stdint_.h: Update. 2006-05-18 Simon Josefsson * lib/cfg.c: Fix mem leak, from Elrond. 2006-05-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2006-05-17 Simon Josefsson * lib/diskio.c: Simplify, from Elrond. 2006-05-15 Simon Josefsson * ChangeLog: [no log message] 2006-05-15 Simon Josefsson * po/pl.po: Generated. 2006-05-15 Simon Josefsson * NEWS: Version 0.0.26. 2006-05-12 Simon Josefsson * tests/Makefile.am: Fix valgrind call. 2006-05-11 Simon Josefsson * tests/shishi.supp: Add. 2006-05-11 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/gstr.c, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c: Update. 2006-05-11 Simon Josefsson * NEWS: Fix. 2006-05-11 Simon Josefsson * extra/pam_shishi/.cvsignore: [no log message] 2006-05-11 Simon Josefsson * extra/pam_shishi/test.c: Add (not finished). 2006-05-11 Simon Josefsson * NEWS: Add. 2006-05-11 Simon Josefsson * extra/pam_shishi/Makefile.am: Use PAMDIR. 2006-05-11 Simon Josefsson * configure.ac: Fix. 2006-05-11 Simon Josefsson * configure.ac: Don't infrecurse PAMDIR definition. 2006-05-11 Simon Josefsson * gl/m4/xvasprintf.m4: Update. 2006-05-11 Simon Josefsson * configure.ac: Add --with-pam-dir. 2006-05-11 Simon Josefsson * extra/pam_shishi/Makefile.am: Remove unused indent target. 2006-05-11 Simon Josefsson * extra/pam_shishi/Makefile.am: Put things in $prefix/lib/security. 2006-05-11 Simon Josefsson * extra/pam_shishi/Makefile.am: Add -avoid-version for libtool. 2006-05-11 Simon Josefsson * gl/crc.c, gl/des.c, gl/md4.c, gl/sha1.c: Update. 2006-05-10 Simon Josefsson * po/pl.po: Sync with TP. 2006-05-10 Simon Josefsson * NEWS: Add. 2006-05-10 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/stdarg.m4, gl/m4/xvasprintf.m4, gl/md4.c, gl/xvasprintf.c, po/pl.po: Update.gl 2006-05-10 Simon Josefsson * NEWS: Add. 2006-05-06 Simon Josefsson * doc/Makefile.am: Add. 2006-05-06 Simon Josefsson * doc/shishi.texi: Add keytab.txt. 2006-05-06 Simon Josefsson * doc/keytab.txt: Update. 2006-05-04 Simon Josefsson * doc/keytab.txt: Update. 2006-05-04 Simon Josefsson * doc/keytab.txt: Update. 2006-05-04 Simon Josefsson * tests/Makefile.am: Simplify valgrind invocation. 2006-05-04 Simon Josefsson * configure.ac: Getpwnam is POSIX, don't test for it. 2006-05-04 Simon Josefsson * configure.ac: Don't check for getpwuid. 2006-05-04 Simon Josefsson * lib/principal.c: Doc fix. 2006-05-04 Simon Josefsson * doc/shishi.texi: Fix. 2006-05-04 Simon Josefsson * lib/principal.c: shishi_principal_default_guess: Don't use getpwuid, use USER instead. 2006-05-04 Simon Josefsson * tests/authenticator.c: Fix mem leaks. 2006-05-04 Simon Josefsson * lib/principal.c: Fix mem leak. 2006-05-04 Simon Josefsson * lib/init.c: Fix mem leak. 2006-05-04 Simon Josefsson * lib/crypto-des.c: Fix mem leaks. 2006-05-04 Simon Josefsson * lib/crypto-rc4.c: Fix mem leak. 2006-05-04 Simon Josefsson * tests/shishi.supp: Fix names. 2006-05-04 Simon Josefsson * tests/crypto.c: Fix mem leaks. 2006-05-04 Simon Josefsson * tests/Makefile.am: Add shishi.supp, valgrind suppressions. 2006-05-04 Simon Josefsson * tests/shishi.supp: Add. 2006-05-04 Simon Josefsson * tests/priv.c, tests/ticketset.c: Fix mem leaks. 2006-05-04 Simon Josefsson * lib/crypto-des.c, tests/crypto-ctx.c: Fix mem leaks. 2006-05-04 Simon Josefsson * tests/low-crypto.c: Fix mem leaks. 2006-05-04 Simon Josefsson * lib/low-crypto.c: Fix mem leak. 2006-05-04 Simon Josefsson * NEWS: Add. 2006-05-04 Simon Josefsson * tests/safe.c: Fix mem leaks. 2006-05-04 Simon Josefsson * lib/tkts.c: Fix. 2006-05-04 Simon Josefsson * lib/tkts.c: Typo. 2006-05-04 Simon Josefsson * lib/diskio.c: Fix mem leak. 2006-05-04 Simon Josefsson * lib/tkts.c: Doc fix. 2006-05-04 Simon Josefsson * lib/init.c: Fix. 2006-05-04 Simon Josefsson * lib/init.c: Fix mem leak. 2006-05-04 Simon Josefsson * tests/Makefile.am: Typo. 2006-05-04 Simon Josefsson * tests/Makefile.am: Run tests under valgrind if present. 2006-05-04 Simon Josefsson * tests/key.c: Fix mem leak. 2006-05-04 Simon Josefsson * gl/stdint_.h: Update. 2006-05-04 Simon Josefsson * NEWS: Add. 2006-05-04 Simon Josefsson * lib/tgs.c: Don't use a sub-session key in TGS to fix problems with w2k3 and bugs in heimdal, debugged by Elrond. 2006-05-04 Simon Josefsson * lib/enckdcreppart.c: Typo. 2006-05-04 Simon Josefsson * NEWS: Add. 2006-05-04 Simon Josefsson * po/LINGUAS, po/pl.po: Sync with TP. 2006-05-03 Simon Josefsson * doc/keytab.txt: FIx. 2006-05-03 Simon Josefsson * extra/Makefile.am: Don't build rsh-redone, for now. (Fails gnits tests.) 2006-05-03 Simon Josefsson * Makefile.am: Dist extra/. 2006-05-03 Simon Josefsson * doc/keytab.txt: Add. 2006-05-02 Simon Josefsson * NEWS, configure.ac: Bump versions. 2006-05-02 Simon Josefsson * Makefile.am: Make in extra/ too. 2006-04-27 Simon Josefsson * ChangeLog: [no log message] 2006-04-27 Simon Josefsson * NEWS: Version 0.0.25. 2006-04-27 Simon Josefsson * doc/Makefile.am: Update. 2006-04-27 Simon Josefsson * doc/Makefile.am: Update. 2006-04-27 Simon Josefsson * doc/gdoc: Fix copyright. 2006-04-27 Simon Josefsson * doc/gdoc: Convert - to \- in man pages, from lintian. 2006-04-27 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4: Update. 2006-04-27 Simon Josefsson * lib/internal.h: Replace size_max with stdint.h. 2006-04-27 Simon Josefsson * lib/diskio.c: Fix. 2006-04-27 Simon Josefsson * lib/internal.h: Need size_max.h. 2006-04-27 Simon Josefsson * lib/internal.h, src/kdc.h, tests/utils.c: Always have unistd.h. 2006-04-27 Simon Josefsson * NEWS: Add. 2006-04-27 Simon Josefsson * NEWS: Add. 2006-04-27 Simon Josefsson * lib/ap.c: Remove XXX, thanks to Elrond for investigating. 2006-04-27 Simon Josefsson * lib/asn1.c: Work around bug in libtasn1: /* XXX when encoding a field inside a SEQUENCE, libtasn1 appear to include the tag from the SEQUENCE in the encoding of a particular field. This appear wrong, so we frob it here. This typically happens when encoding req-body in KDC-REQ for TGS checksums. */ 2006-04-26 Simon Josefsson * gl/Makefile.am, gl/getdate.y, gl/m4/strerror_r.m4: Update. 2006-04-25 Simon Josefsson * doc/shishi.texi: Fix. 2006-04-25 Simon Josefsson * doc/shishi.texi: Add. 2006-04-25 Simon Josefsson * doc/shishi.texi: Fix. 2006-04-25 Simon Josefsson * lib/ap.c: More debug. 2006-04-25 Simon Josefsson * lib/apreq.c, lib/kdcrep.c, lib/key.c, lib/shishi.h.in: Fix. 2006-04-25 Simon Josefsson * lib/shishi.h.in, lib/ticket.c: Fix. 2006-04-25 Simon Josefsson * lib/diskio.c, lib/key.c, lib/shishi.h.in: Fix. 2006-04-25 Simon Josefsson * lib/ap.c: More debug. 2006-04-25 Simon Josefsson * lib/apreq.c: Doc fox. 2006-04-25 Simon Josefsson * lib/apreq.c, lib/shishi.h.in: Fix. 2006-04-25 Simon Josefsson * lib/key.c: Rename version to kvno. 2006-04-25 Simon Josefsson * lib/shishi.h.in: Fix. 2006-04-23 Simon Josefsson * src/shishi.c: Translate. 2006-04-22 Simon Josefsson * NEWS: Fix. 2006-04-22 Simon Josefsson * tests/ticketset.c: Remove unused variable. 2006-04-22 Simon Josefsson * NEWS, configure.ac: Bump versions. 2006-04-22 Simon Josefsson * ChangeLog: [no log message] 2006-04-22 Simon Josefsson * NEWS: Version 0.0.24. 2006-04-22 Simon Josefsson * doc/Makefile.am: Update. 2006-04-22 Simon Josefsson * gl/m4/getpass.m4: Update. 2006-04-22 Simon Josefsson * NEWS: Fix. 2006-04-22 Simon Josefsson * src/server.c: Don't select failed sockets. 2006-04-22 Simon Josefsson * NEWS: Fix. 2006-04-22 Simon Josefsson * lib/tkts.c: Typo. 2006-04-22 Simon Josefsson * lib/tkts.c: More debug info. Fix mem leak. 2006-04-22 Simon Josefsson * lib/tkts.c: More debug. 2006-04-22 Simon Josefsson * lib/netio.c: Fix printf format. 2006-04-21 Simon Josefsson * NEWS: Fix. 2006-04-21 Simon Josefsson * NEWS: Fix. 2006-04-21 Simon Josefsson * NEWS: Add. 2006-04-21 Simon Josefsson * NEWS: Add. 2006-04-21 Simon Josefsson * lib/krberror.c: Fix mem leak, reported by Elrond. 2006-04-21 Simon Josefsson * lib/krberror.c: Fix crash, reported by Elrond. 2006-04-21 Simon Josefsson * lib/tkts.c: Fix. 2006-04-21 Simon Josefsson * NEWS: Fix. 2006-04-21 Simon Josefsson * lib/tkts.c: Support ETYPE-INFO too. 2006-04-21 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/shishi.h.in: Add. 2006-04-20 Simon Josefsson * tests/authenticator.c: Remove unused. 2006-04-20 Simon Josefsson * doc/Makefile.am: Update. 2006-04-20 Simon Josefsson * doc/shishi.texi: Fix. 2006-04-20 Simon Josefsson * gl/base64.c, gl/m4/extensions.m4, gl/m4/longdouble.m4: Update. 2006-04-20 Simon Josefsson * lib/tkts.c: Less debug. 2006-04-20 Simon Josefsson * NEWS: Fix. 2006-04-20 Simon Josefsson * NEWS: Add. 2006-04-20 Simon Josefsson * lib/tkts.c: Fix salt/s2kparams. 2006-04-20 Simon Josefsson * lib/kdcreq.c: Cleanup. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Fix. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Fix. 2006-04-20 Simon Josefsson * lib/shishi.h.in, lib/tkts.c: Fix. 2006-04-20 Simon Josefsson * lib/tkts.c: Pre-auth fixes. 2006-04-20 Simon Josefsson * lib/principal.c: Fix crash. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Add. 2006-04-20 Simon Josefsson * lib/krberror.c: Fix message. 2006-04-20 Simon Josefsson * lib/tkt.c: Check errors. 2006-04-20 Simon Josefsson * lib/tkts.c: Improve preauth. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Add more hints. 2006-04-20 Simon Josefsson * lib/diskio.c, lib/shishi.h.in: Add. 2006-04-20 Simon Josefsson * lib/asn1.c: Add. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Fix. 2006-04-20 Simon Josefsson * lib/asn1.c, lib/shishi.h.in: Add. 2006-04-20 Simon Josefsson * lib/as.c: Debug more. 2006-04-20 Simon Josefsson * lib/asn1.c: Fix. 2006-04-20 Simon Josefsson * lib/shishi.h.in: Add. 2006-04-20 Simon Josefsson * lib/internal.h: Remove preauth. 2006-04-20 Simon Josefsson * lib/cfg.c: Remove preauth option. 2006-04-20 Simon Josefsson * lib/krberror.c: Add shishi_krberror_methoddata. 2006-04-20 Simon Josefsson * lib/kerberos5.asn1: Fix. 2006-04-20 Simon Josefsson * lib/kerberos5.asn1: Fix. 2006-04-19 Simon Josefsson * lib/tkts.c: Fix. 2006-04-19 Simon Josefsson * po/LINGUAS: Sync with TP. 2006-04-19 Simon Josefsson * lib/tkts.c: Support preauth (XXX). 2006-04-19 Simon Josefsson * lib/asn1.c, lib/kdcreq.c, lib/shishi.h.in: Add. 2006-04-19 Simon Josefsson * lib/kerberos5.c: Generated. 2006-04-19 Simon Josefsson * lib/shishi.h.in: Add. 2006-04-19 Simon Josefsson * lib/asn1.c, lib/kerberos5.asn1: Fix. 2006-04-19 Simon Josefsson * po/Makevars: Fix. 2006-04-19 Simon Josefsson * Makefile.am: Add update-po. 2006-04-18 Simon Josefsson * lib/kdcreq.c: Only clear padata in AS-REQ. 2006-04-18 Simon Josefsson * lib/cfg.c: Add preauth config option. 2006-04-18 Simon Josefsson * lib/internal.h: Add. 2006-04-18 Simon Josefsson * NEWS: Add. 2006-04-18 Simon Josefsson * doc/specifications/draft-altman-telnet-rfc2941bis-00.txt, doc/specifications/draft-altman-telnet-rfc2942bis-00.txt: Add. 2006-04-18 Simon Josefsson * gl/Makefile.am, gl/m4/time_r.m4, gl/stdint_.h: Update. 2006-03-30 Simon Josefsson * lib/as.c: Don't always clear padata. 2006-03-30 Simon Josefsson * lib/kdcreq.c: Clear padata if not set. 2006-03-30 Simon Josefsson * lib/krberror.c: Print which pre-auth types were requested by server. 2006-03-30 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/shishi.h.in: Add PA/METHOD-DATA stuff. 2006-03-30 Simon Josefsson * lib/asn1.c, lib/shishi.h.in: Add shishi_asn1_padata. 2006-03-27 Simon Josefsson * lib/diskio.c: Remove unused variable. 2006-03-27 Simon Josefsson * lib/internal.h: Need getline.h. 2006-03-27 Simon Josefsson * doc/shishi.texi: Re-order direntry's, for broken install-info. 2006-03-25 Simon Josefsson * NEWS, configure.ac: Bump versions. 2006-03-25 Simon Josefsson * Makefile.am: Fix gnupload command. 2006-03-25 Simon Josefsson * NEWS: Version 0.0.23. 2006-03-25 Simon Josefsson * ChangeLog: [no log message] 2006-03-25 Simon Josefsson * doc/man/.cvsignore: Add. 2006-03-25 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2006-03-25 Simon Josefsson * Makefile.am: Use proper gpg key. 2006-03-25 Simon Josefsson * Makefile.am: Use gnupload. 2006-03-25 Simon Josefsson * gl/base64.c, gl/setenv.c, gl/time_r.c, gl/unsetenv.c: Update. 2006-03-24 Simon Josefsson * db/setup.c: Fix mem leak, reported by Elrond. 2006-03-23 Simon Josefsson * db/config.c, db/shisa.h: Fix mem leak, use const, from Elrond. 2006-03-23 Simon Josefsson * doc/Makefile.am: Update. 2006-03-23 Simon Josefsson * NEWS: Add. 2006-03-23 Simon Josefsson * NEWS: Fix. 2006-03-23 Simon Josefsson * lib/principal.c: Fix mem leak. 2006-03-23 Simon Josefsson * src/shisa.c: Use new salt API. 2006-03-23 Simon Josefsson * lib/key.c, lib/principal.c: Fix. 2006-03-23 Simon Josefsson * lib/principal.c: Fix. 2006-03-23 Simon Josefsson * lib/principal.c, lib/shishi.h.in: Add shishi_derive_default_salt. 2006-03-23 Simon Josefsson * db/err.c, lib/krberror.c, src/shisa.c: Typo. 2006-03-23 Simon Josefsson * po/POTFILES.in: Fix. 2006-03-23 Simon Josefsson * db/err.c, src/shisa.c: Translate. 2006-03-23 Simon Josefsson * po/POTFILES.in: Remove some, for now. 2006-03-23 Simon Josefsson * lib/error.c: Translate. 2006-03-23 Simon Josefsson * lib/krberror.c: Translate. 2006-03-23 Simon Josefsson * lib/krberror.c: Fix. 2006-03-23 Simon Josefsson * doc/shishi.texi: Add. 2006-03-23 Simon Josefsson * lib/krberror.c: Fix. 2006-03-23 Simon Josefsson * lib/krberror.c: Fix typo, from Russ. 2006-03-22 Simon Josefsson * lib/key.c: Further fixes, from Elrond. 2006-03-22 Simon Josefsson * lib/key.c: Fix mem leak, from Elrond. 2006-03-22 Simon Josefsson * lib/crypto-3des.c: Avoid unsigned char's. 2006-03-22 Simon Josefsson * src/shisa.c: Use shishi_key_from_name API. 2006-03-22 Simon Josefsson * lib/version.c: Fix check. 2006-03-22 Simon Josefsson * THANKS: Remove nettle, we don't use it now. 2006-03-22 Simon Josefsson * NEWS, THANKS: Add. 2006-03-22 Simon Josefsson * lib/key.c, lib/shishi.h.in: Add shishi_key_from_name(), suggested by Elrond. 2006-03-22 Simon Josefsson * lib/asn1.c: Avoid unsigned char's. 2006-03-22 Simon Josefsson * tests/crypto.c, tests/utils.c: Avoid unsigned char's. 2006-03-22 Simon Josefsson * src/shishid.ggo: Don't require -v. 2006-03-22 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/strverscmp.m4, gl/strverscmp.c, gl/strverscmp.h, lib/version.c: Rewrite shishi_check_version(). 2006-03-22 Simon Josefsson * src/shishi.ggo: Fix. 2006-03-22 Simon Josefsson * src/shishi.ggo: Don't require -v. 2006-03-16 Simon Josefsson * NEWS: Add. 2006-03-16 Simon Josefsson * doc/shishi.texi: No invariant sections. 2006-03-13 Simon Josefsson * README-alpha: Fix. 2006-03-13 Simon Josefsson * README-alpha: Fix. 2006-03-13 Simon Josefsson * lib/kerberos5.c: Add. 2006-03-13 Simon Josefsson * tests/Makefile.am: Fix -libtasn1. 2006-03-13 Simon Josefsson * lib/Makefile.am: Fix libtasn1 -l's. 2006-03-13 Simon Josefsson * configure.ac: Fix libtasn1 test. 2006-03-13 Simon Josefsson * gl/Makefile.am, gl/m4/gc-random.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2006-03-13 Simon Josefsson * gl/Makefile.am, gl/base64.h, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/m4/clock_time.m4, gl/m4/extensions.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/gnulib-comp.m4, gl/m4/timespec.m4, gl/m4/unistd_h.m4, gl/setenv.c, gl/time_r.c, gl/time_r.h, gl/unsetenv.c, maint.mk: Update. 2006-03-13 Simon Josefsson * doc/Makefile.am: Update. 2006-03-13 Simon Josefsson * lib/safe.c: Fix. 2006-03-12 Simon Josefsson * asn1/Makefile.am: Remove. 2006-03-11 Simon Josefsson * configure.ac: Libtasn1 update. 2006-03-11 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/defines.h, asn1/der.h, asn1/element.c, asn1/errors.h, asn1/errors_int.h, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h: Update. 2006-03-08 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-07.txt: Add. 2006-03-07 Simon Josefsson * lib/Makefile.am: Add -no-undefined, required to produce DLLs on mingw32. 2006-03-07 Simon Josefsson * doc/specifications/draft-johansson-kerberos-model-02.txt: Add. 2006-03-04 Simon Josefsson * doc/specifications/draft-jaganathan-rc4-hmac-02.txt: Add. 2006-02-16 Simon Josefsson * maint-cfg.mk: Fix. 2006-02-16 Simon Josefsson * gl/m4/getaddrinfo.m4, gl/m4/socklen.m4, gl/m4/sys_socket_h.m4, maint.mk: Update. 2006-02-15 Simon Josefsson * lib/krberror.c: Typo. 2006-02-14 Simon Josefsson * GNUmakefile, Makefile.cfg, Makefile.maint, gl/m4/gnulib-comp.m4, maint-cfg.mk, maint.mk: Rename. 2006-02-14 Simon Josefsson * autogen.sh: Remove. 2006-02-14 Simon Josefsson * GNUmakefile, Makefile.maint, gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Add maintainer-makefile module. 2006-02-14 Simon Josefsson * Makefile.cfg: Add. 2006-02-09 Simon Josefsson * NEWS: Add. 2006-02-09 Simon Josefsson * configure.ac: Bump libtasn1 version. 2006-02-09 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/defines.h, asn1/der.h, asn1/element.c, asn1/errors.c, asn1/errors.h, asn1/errors_int.h, asn1/gstr.c, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Update. 2006-02-07 Simon Josefsson * gl/.cvsignore: [no log message] 2006-02-07 Simon Josefsson * lib/encapreppart.c: Fix gettimeofday() usage. 2006-02-07 Simon Josefsson * lib/encapreppart.c, lib/krberror.c, lib/priv.c: Fix gettimeofday() usage. 2006-02-07 Simon Josefsson * lib/safe.c: Fix gettimeofday usage. 2006-02-07 Simon Josefsson * lib/shishi.h.in: Add SHISHI_GETTIMEOFDAY_ERROR. 2006-02-07 Simon Josefsson * lib/authorize.c: Don't free getpwnam return. 2006-02-07 Simon Josefsson * configure.ac: Test for getpwname, for mingw32. 2006-02-07 Simon Josefsson * lib/authenticator.c: Avoid use of timezone. Check return value. 2006-02-07 Simon Josefsson * lib/principal.c: Fix getpwuid call, for mingw32. 2006-02-07 Simon Josefsson * configure.ac: Check for getpwuid, for mingw32. 2006-02-07 Simon Josefsson * lib/krberror.c, lib/utils.c, lib/utils.h: Remove xgettimeofday. 2006-02-07 Simon Josefsson * src/kdc.h, tests/utils.c: Always has sys/socket.h now. 2006-02-07 Simon Josefsson * lib/internal.h: We always have sys/socket.h now. 2006-02-07 Simon Josefsson * configure.ac: gettime fix for mingw32. 2006-02-07 Simon Josefsson * doc/Makefile.am: Mingw32 fix. 2006-02-07 Simon Josefsson * README: Add. 2006-02-07 Simon Josefsson * configure.ac: Fix GnuTLS test. 2006-02-07 Simon Josefsson * gl/m4/extensions.m4: Update. 2006-01-30 Simon Josefsson * gl/gai_strerror.c, gl/getaddrinfo.h, gl/getopt.c, gl/m4/getaddrinfo.m4, gl/m4/getopt.m4, gl/m4/gnulib-tool.m4, gl/m4/socklen.m4, gl/m4/stdbool.m4, gl/socket_.h, gl/stdbool_.h, gl/strndup.c, gl/strnlen.c, gl/vasnprintf.c: Update. 2006-01-30 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-33.txt: Add. 2006-01-19 Simon Josefsson * gl/Makefile.am, gl/gai_strerror.c, gl/getaddrinfo.h, gl/m4/getaddrinfo.m4, gl/m4/gnulib-comp.m4, gl/m4/sys_socket_h.m4, gl/socket_.h: Update. 2006-01-13 Simon Josefsson * tests/Makefile.am: Fix gnutls check. 2006-01-13 Simon Josefsson * configure.ac, src/Makefile.am: Fix gnutls check. 2006-01-13 Simon Josefsson * configure.ac: Enable gcrypt if present, for now. 2006-01-13 Simon Josefsson * configure.ac, lib/Makefile.am, src/Makefile.am: Fix gnutls check. 2006-01-13 Simon Josefsson * lib/Makefile.am: Fix libs. 2006-01-12 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-32.txt: Add. 2006-01-12 Simon Josefsson * doc/getdate.texi, gl/Makefile.am, gl/base64.c, gl/gettime.c, gl/m4/getaddrinfo.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/socklen.m4, gl/m4/stdint.m4, gl/md5.c, gl/md5.h, gl/sha1.c, gl/sha1.h, gl/stdint_.h: Update. 2006-01-12 Simon Josefsson * doc/Makefile.am: Fix copyright years in man page. 2005-12-28 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-31.txt: Add. 2005-12-23 Simon Josefsson * gl/m4/getaddrinfo.m4, gl/m4/socklen.m4: Update. 2005-12-21 Simon Josefsson * .cvsignore: [no log message] 2005-12-20 Simon Josefsson * db/Makefile.am: Fix. 2005-12-20 Simon Josefsson * db/Makefile.am: Fix. 2005-12-20 Simon Josefsson * po/pl.po, po/sv.po: Initial attempt. 2005-12-15 Simon Josefsson * gl/m4/gnulib-comp.m4: Update. 2005-12-13 Simon Josefsson * gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc.h, gl/getaddrinfo.h, gl/m4/socklen.m4, gl/md5.c, gl/stdint_.h: Update. 2005-12-01 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-30.txt: Add. 2005-10-27 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-rfc1510ter-02.txt: Add. 2005-10-24 Simon Josefsson * doc/specifications/draft-zhu-kerb-enctype-nego-04.txt: Add. 2005-10-23 Simon Josefsson * AUTHORS: Update PGP key. 2005-10-23 Simon Josefsson * configure.ac: Bump versions. 2005-10-23 Simon Josefsson * NEWS: Add. 2005-10-23 Simon Josefsson * NEWS: Add. 2005-10-23 Simon Josefsson * doc/Makefile.am: Update. 2005-10-23 Simon Josefsson * lib/crypto-aes.c: Fix compiler warning. 2005-10-23 Simon Josefsson * configure.ac: Fix. 2005-10-23 Simon Josefsson * configure.ac: Simplify IPv6 test, using gnulib. 2005-10-23 Simon Josefsson * gl/gc-gnulib.c, gl/md4.h, gl/md5.c, gl/md5.h: Update. 2005-10-22 Simon Josefsson * lib/crypto.c, lib/low-crypto.c: Use pbkdf2-sha1 from gc. 2005-10-22 Simon Josefsson * lib/low-crypto.c: Replace internal ARCFOUR implementation with the one from gnulib. 2005-10-22 Simon Josefsson * gl/arcfour.c, gl/arcfour.h, gl/md4.c: Update. 2005-10-22 Simon Josefsson * doc/shishi.texi: Remove nettle stuff. 2005-10-22 Simon Josefsson * doc/Makefile.am: Generated. 2005-10-22 Simon Josefsson * lib/Makefile.am, lib/libgcrypt.c, lib/low-crypto.c, lib/nettle.c: Use low-crypto.c, to interface with gc. 2005-10-22 Simon Josefsson * configure.ac: Don't default to libgcrypt. 2005-10-22 Simon Josefsson * gl/Makefile.am, gl/crc.c, gl/crc.h, gl/m4/crc.m4, gl/m4/gc-md5.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2005-10-22 Simon Josefsson * gl/Makefile.am, gl/crc.h, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2005-10-22 Simon Josefsson * tests/Makefile.am: Remove crypto. 2005-10-22 Simon Josefsson * configure.ac: Enable libgcrypt by default. 2005-10-22 Simon Josefsson * lib/Makefile.am: Remove crypto. 2005-10-22 Simon Josefsson * configure.ac: Remove crypto/. 2005-10-22 Simon Josefsson * Makefile.am, lib/Makefile.am: Remove crypto. 2005-10-22 Simon Josefsson * crypto/.cvsignore, crypto/Makefile.am, crypto/README, crypto/README.shishi, crypto/aes-decrypt-table.c, crypto/aes-decrypt.c, crypto/aes-encrypt-table.c, crypto/aes-encrypt.c, crypto/aes-internal.h, crypto/aes-meta.c, crypto/aes-set-decrypt-key.c, crypto/aes-set-encrypt-key.c, crypto/aes.c, crypto/aes.h, crypto/arcfour-crypt.c, crypto/arcfour.c, crypto/arcfour.h, crypto/cbc-cts.c, crypto/cbc-cts.h, crypto/cbc-mac.c, crypto/cbc-mac.h, crypto/cbc.c, crypto/cbc.h, crypto/des.c, crypto/des.h, crypto/des3.c, crypto/desCode.h, crypto/hmac-md5.c, crypto/hmac-sha1.c, crypto/hmac.c, crypto/hmac.h, crypto/keymap.h, crypto/macros.h, crypto/md4-meta.c, crypto/md4.c, crypto/md4.h, crypto/md5-meta.c, crypto/md5.c, crypto/md5.h, crypto/memxor.c, crypto/memxor.h, crypto/nettle-internal.h, crypto/nettle-meta.h, crypto/parity.h, crypto/rotors.h, crypto/sha.h, crypto/sha1-compress.c, crypto/sha1-meta.c, crypto/sha1.c: Remove (uses gnulib now). 2005-10-22 Simon Josefsson * configure.ac: Remove nettle/libgcrypt code. 2005-10-22 Simon Josefsson * gl/Makefile.am, gl/arcfour.c, gl/arcfour.h, gl/des.c, gl/des.h, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/hmac-md5.c, gl/hmac-sha1.c, gl/m4/arcfour.m4, gl/m4/des.m4, gl/m4/gc-arcfour.m4, gl/m4/gc-des.m4, gl/m4/gc-hmac-md5.m4, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-md4.m4, gl/m4/gc.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/hmac-md5.m4, gl/m4/md4.m4, gl/m4/md5.m4, gl/m4/stdbool.m4, gl/md4.c, gl/md4.h, gl/md5.c, gl/md5.h: Update. 2005-10-21 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-29.txt: Add. 2005-10-19 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-04.txt: Add. 2005-10-18 Simon Josefsson * doc/specifications/draft-zhu-kerb-anon-00.txt: Add. 2005-10-12 Simon Josefsson * gl/Makefile.am, gl/gc-gnulib.c, gl/gc-libgcrypt.c, gl/gc-pbkdf2-sha1.c, gl/gc.h, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdate.y, gl/getdelim.c, gl/getopt_.h, gl/hmac-sha1.c, gl/hmac.h, gl/m4/gc-hmac-sha1.m4, gl/m4/gc-pbkdf2-sha1.m4, gl/m4/gc.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/hmac-sha1.m4, gl/m4/inttypes.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/mbchar.m4, gl/m4/mbiter.m4, gl/m4/memxor.m4, gl/m4/mktime.m4, gl/m4/sha1.m4, gl/m4/stdbool.m4, gl/m4/stdint.m4, gl/m4/strcase.m4, gl/m4/xreadlink.m4, gl/memxor.c, gl/memxor.h, gl/sha1.c, gl/sha1.h, gl/stdint_.h, gl/strcasecmp.c, gl/strncasecmp.c, gl/xgethostname.c, gl/xreadlink.c: Add. 2005-10-11 Simon Josefsson * doc/specifications/draft-ietf-kink-kink-10.txt: Add. 2005-09-20 Simon Josefsson * gl/Makefile.am: Revert local changes. 2005-09-20 Simon Josefsson * lib/Makefile.am: Link with realtime clock library, for gnulib. 2005-09-20 Simon Josefsson * gl/Makefile.am, gl/getaddrinfo.c, gl/getdate.h, gl/getdelim.c, gl/getline.c, gl/getopt1.c, gl/getpass.c, gl/gettimeofday.c, gl/progname.c, gl/readlink.c, gl/realloc.c, gl/strncasecmp.c, gl/strndup.c, gl/strnlen.c, gl/strnlen1.c, gl/time_r.c, gl/timespec.h, gl/xmalloc.c, gl/xreadlink.c, gl/xstrndup.c: Update. 2005-09-20 Simon Josefsson * gl/Makefile.am: Update. 2005-09-19 Simon Josefsson * NEWS: Add. 2005-09-19 Simon Josefsson * doc/reference/tmpl/.cvsignore: [no log message] 2005-09-19 Simon Josefsson * lib/shishi.vers: Fix. 2005-09-19 Simon Josefsson * gl/m4/socklen.m4: Update. 2005-09-19 Simon Josefsson * configure.ac: Socklen_t is handled by gnulib now. 2005-09-19 Simon Josefsson * NEWS: Add. 2005-09-19 Simon Josefsson * configure.ac, gl/Makefile.am, gl/base64.c, gl/gai_strerror.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdelim.c, gl/getpass.c, gl/m4/getaddrinfo.m4, gl/m4/getopt.m4, gl/m4/getpass.m4, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4, gl/m4/gnulib-tool.m4, gl/m4/gnulib.m4, gl/m4/mbchar.m4, gl/m4/mbiter.m4, gl/m4/mbrtowc.m4, gl/m4/memchr.m4, gl/m4/socklen.m4, gl/m4/st_mtim.m4, gl/m4/strcase.m4, gl/m4/timespec.m4, gl/mbchar.c, gl/mbchar.h, gl/mbuiter.h, gl/memchr.c, gl/mktime.c, gl/strcase.h, gl/strcasecmp.c, gl/strncasecmp.c, gl/strnlen1.c, gl/strnlen1.h, gl/timespec.h: Update. 2005-09-19 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib-cache.m4, gl/m4/gnulib-comp.m4: Update. 2005-09-19 Simon Josefsson * doc/reference/tmpl/shishi-unused.sgml: Add. 2005-09-19 Simon Josefsson * doc/specifications/draft-zhu-pkinit-ecc-00.txt: Add. 2005-09-19 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-rfc1510ter-01.txt: Add. 2005-09-14 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-28.txt: Add. 2005-08-31 Simon Josefsson * lib/Makefile.am: Avoid EXTRA_DIST. 2005-08-31 Simon Josefsson * lib/Makefile.am: Link with idn. 2005-08-31 Simon Josefsson * lib/Makefile.am: Remove -export-symbols-regex, handled by version script. 2005-08-31 Simon Josefsson * lib/password.c: Use new CPP symbol. 2005-08-31 Simon Josefsson * lib/Makefile.am: Use version script. 2005-08-31 Simon Josefsson * NEWS, lib/shishi.vers: Add. 2005-08-31 Simon Josefsson * configure.ac: Add --enable-ld-version-script. 2005-08-30 Simon Josefsson * asn1/defines.h, asn1/errors.c, asn1/errors.h, asn1/libtasn1.h: Update. 2005-08-30 Simon Josefsson * configure.ac: Fix libidn test. 2005-08-12 Simon Josefsson * gl/strnlen.h: Update. 2005-08-11 Simon Josefsson * configure.ac: Avoid gnulib module xalloc-die. 2005-08-11 Simon Josefsson * gl/m4/gnulib.m4, gl/m4/strdup.m4, gl/strnlen.h: Update. 2005-08-10 Simon Josefsson * ChangeLog: [no log message] 2005-08-10 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2005-08-10 Simon Josefsson * NEWS: Version 0.0.22. 2005-08-10 Simon Josefsson * src/Makefile.am: Add -I's for GnuTLS too. 2005-08-10 Simon Josefsson * gl/Makefile.am, gl/m4/strnlen.m4: Update. 2005-08-10 Simon Josefsson * src/shishid.c: Fix compile error. 2005-08-10 Simon Josefsson * NEWS, shishi.fms: Add. 2005-08-10 Simon Josefsson * asn1/Makefile.am, db/Makefile.am, doc/Makefile.am, doc/fdl.texi, doc/gendocs.sh, doc/gendocs_template, doc/gpl.texi, examples/Makefile.am, extra/Makefile.am, extra/pam_shishi/Makefile.am, extra/rsh-redone/Makefile.am, gl/strnlen.h, lib/Makefile.am, src/Makefile.am, src/shisa.ggo, src/shishi.ggo, src/shishid.ggo, tests/Makefile.am, tests/shisa.sh: Update license. 2005-08-10 Simon Josefsson * NEWS: Add. 2005-08-10 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/defines.h, asn1/element.c, asn1/errors.c, asn1/errors.h, asn1/gstr.c, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Update libtasn1 to 0.2.14. 2005-08-10 Simon Josefsson * COPYING.DOC: Remove (not used). 2005-08-10 Simon Josefsson * README: Mention help-shishi. Fix. 2005-08-10 Simon Josefsson * NEWS, doc/shishi.texi: Add. 2005-08-10 Simon Josefsson * gl/Makefile.am: Add. 2005-08-10 Simon Josefsson * gl/Makefile.am, gl/exit.h, gl/exitfail.c, gl/exitfail.h, gl/m4/exitfail.m4, gl/m4/gnulib.m4, gl/xalloc-die.c: Update. 2005-08-10 Simon Josefsson * gl/m4/onceonly_2_57.m4, gl/xalloc-die.c: Update. 2005-08-10 Simon Josefsson * gl/Makefile.am, gl/base64.c, gl/base64.h, gl/exit.h, gl/exitfail.c, gl/exitfail.h, gl/getaddrinfo.h, gl/getdelim.c, gl/getdelim.h, gl/getline.c, gl/getline.h, gl/getndelim2.c, gl/getndelim2.h, gl/getsubopt.h, gl/m4/bison.m4, gl/m4/codeset.m4, gl/m4/exitfail.m4, gl/m4/getdelim.m4, gl/m4/getline.m4, gl/m4/getndelim2.m4, gl/m4/getopt.m4, gl/m4/gettext.m4, gl/m4/glibc2.m4, gl/m4/glibc21.m4, gl/m4/gnulib.m4, gl/m4/iconv.m4, gl/m4/intdiv0.m4, gl/m4/intmax.m4, gl/m4/inttypes-pri.m4, gl/m4/inttypes.m4, gl/m4/isc-posix.m4, gl/m4/lcmessage.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/nls.m4, gl/m4/po.m4, gl/m4/printf-posix.m4, gl/m4/progtest.m4, gl/m4/size_max.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/uintmax_t.m4, gl/m4/ulonglong.m4, gl/mktime.c, gl/size_max.h, gl/strtok_r.h, gl/time_r.h, gl/xmalloc.c: Update. 2005-07-24 Simon Josefsson * doc/specifications/draft-ietf-kink-kink-09.txt, doc/specifications/draft-jaganathan-kerberos-http-01.txt, doc/specifications/draft-jaganathan-rc4-hmac-01.txt, doc/specifications/rfc4120.txt: Add. 2005-07-24 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-27.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-06.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-06.txt, doc/specifications/draft-zhu-kerb-enctype-nego-03.txt: Add. 2005-07-16 Simon Josefsson * configure.ac: Simplify. 2005-07-11 Simon Josefsson * doc/specifications/draft-jaganathan-rc4-hmac-00.txt: Add. 2005-07-11 Simon Josefsson * doc/specifications/draft-jaganathan-win-krb-authz-00.txt: Add. 2005-06-15 Simon Josefsson * gl/m4/extensions.m4, gl/xreadlink.c: Update gnulib files. 2005-05-27 Simon Josefsson * doc/specifications/draft-zhu-kerb-enctype-nego-02.txt: Add. 2005-05-27 Simon Josefsson * doc/specifications/draft-ietf-kink-kink-07.txt: Add. 2005-05-26 Simon Josefsson * Makefile.am, configure.ac, db/config.c, db/core.c, db/db.c, db/err.c, db/file.c, db/file.h, db/fileutil.c, db/fileutil.h, db/info.h, db/setup.c, db/shisa.h, doc/gdoc-error, examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, extra/pam_shishi/pam_shishi.c, extra/rsh-redone/rcp.c, extra/rsh-redone/rlogin.c, extra/rsh-redone/rlogind.c, extra/rsh-redone/rsh.c, extra/rsh-redone/rshd.c, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/authorize.c, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/key.c, lib/keys.c, lib/krberror.c, lib/libgcrypt.c, lib/netio.c, lib/nettle.c, lib/password.c, lib/pki.c, lib/principal.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h.in, lib/starttls.c, lib/starttls.h, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tkts.c, lib/utils.c, lib/utils.h, lib/version.c, src/kdc.c, src/kdc.h, src/resume.c, src/server.c, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/authenticator.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/key.c, tests/low-crypto.c, tests/priv.c, tests/rijndael.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Update license with new FSF address. 2005-05-26 Simon Josefsson * doc/getdate.texi, gl/Makefile.am, gl/alloca_.h, gl/allocsa.c, gl/allocsa.h, gl/asnprintf.c, gl/asprintf.c, gl/base64.c, gl/base64.h, gl/error.c, gl/error.h, gl/gai_strerror.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/getdate.h, gl/getdate.y, gl/getdomainname.c, gl/getdomainname.h, gl/gethostname.c, gl/getline.c, gl/getline.h, gl/getndelim2.c, gl/getndelim2.h, gl/getopt.c, gl/getopt1.c, gl/getopt_.h, gl/getopt_int.h, gl/getpass.c, gl/getpass.h, gl/getsubopt.c, gl/getsubopt.h, gl/gettext.h, gl/gettime.c, gl/gettimeofday.c, gl/m4/clock_time.m4, gl/m4/getaddrinfo.m4, gl/m4/getopt.m4, gl/m4/getpass.m4, gl/m4/gettext.m4, gl/m4/gettimeofday.m4, gl/m4/gnulib.m4, gl/mktime.c, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/progname.c, gl/progname.h, gl/readlink.c, gl/realloc.c, gl/setenv.c, gl/setenv.h, gl/stdbool_.h, gl/strcase.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strchrnul.h, gl/strdup.c, gl/strdup.h, gl/strndup.c, gl/strndup.h, gl/strnlen.c, gl/strtok_r.c, gl/strtok_r.h, gl/time_r.c, gl/time_r.h, gl/timegm.c, gl/timegm.h, gl/timespec.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/vasprintf.h, gl/xalloc.h, gl/xasprintf.c, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.c, gl/xmalloc.c, gl/xreadlink.c, gl/xreadlink.h, gl/xsize.h, gl/xstrndup.c, gl/xstrndup.h, gl/xvasprintf.c, gl/xvasprintf.h: Update. 2005-05-24 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-26.txt, doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-05.txt: Add. 2005-04-29 Simon Josefsson * THANKS: Add. 2005-04-01 Simon Josefsson * doc/specifications/draft-zhu-kerb-enctype-nego-01.txt: Add. 2005-03-21 Simon Josefsson * gl/Makefile.am: Gnulib sync. 2005-03-21 Simon Josefsson * gl/m4/getdate.m4, gl/m4/getline.m4, gl/m4/getpass.m4, gl/m4/gettext.m4, gl/m4/lib-link.m4, gl/m4/nls.m4, gl/m4/po.m4, gl/m4/strdup.m4, gl/m4/strndup.m4, gl/m4/timespec.m4, gl/m4/xalloc.m4, gl/mktime.c, gl/strndup.c: Fix. 2005-03-18 Simon Josefsson * asn1/defines.h: Fix. 2005-03-14 Simon Josefsson * NEWS: Add. 2005-03-14 Simon Josefsson * NEWS: Add. 2005-03-14 Simon Josefsson * gl/Makefile.am, gl/getdate.y, gl/gettext.h, gl/gettime.c, gl/m4/gettext.m4, gl/m4/gettime.m4, gl/m4/glibc2.m4, gl/m4/intdiv0.m4, gl/m4/intmax.m4, gl/m4/inttypes-pri.m4, gl/m4/inttypes.m4, gl/m4/isc-posix.m4, gl/m4/lcmessage.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/nls.m4, gl/m4/po.m4, gl/m4/printf-posix.m4, gl/m4/progtest.m4, gl/mktime.c, gl/progname.c, gl/setenv.c, gl/size_max.h, gl/strnlen.h, gl/timegm.h, gl/timespec.h, gl/vasnprintf.c, gl/vasprintf.c, gl/xgethostname.c: Sync gnulib. 2005-03-14 Simon Josefsson * configure.ac: Add strnlen. 2005-03-14 Simon Josefsson * src/kdc.c: Avoid strnlen (only used once). 2005-03-14 Simon Josefsson * lib/asn1.c, lib/kdcreq.c: Doc fix. 2005-03-13 Simon Josefsson * db/Makefile.am, examples/Makefile.am, extra/pam_shishi/Makefile.am, lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Gnulib need -I$(top_builddir)/gl as well, reported by Dave Love . 2005-03-13 Simon Josefsson * THANKS: Add. 2005-03-13 Simon Josefsson * README: Add, suggested by Dave Love . 2005-02-22 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-03.txt: Add. 2005-02-21 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-25.txt: Add. 2005-02-15 Simon Josefsson * doc/specifications/rfc3961.txt, doc/specifications/rfc3962.txt: Add. 2005-02-10 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-24.txt: Add. 2005-02-01 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-04.txt: Add. 2005-01-31 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-23.txt: Add. 2005-01-29 Simon Josefsson * po/.cvsignore: [no log message] 2005-01-29 Simon Josefsson * gl/gai_strerror.c, gl/m4/alloca.m4, gl/m4/allocsa.m4, gl/m4/base64.m4, gl/m4/bison.m4, gl/m4/clock_time.m4, gl/m4/codeset.m4, gl/m4/eealloc.m4, gl/m4/eoverflow.m4, gl/m4/error.m4, gl/m4/extensions.m4, gl/m4/getaddrinfo.m4, gl/m4/getdate.m4, gl/m4/getdomainname.m4, gl/m4/gethostname.m4, gl/m4/getline.m4, gl/m4/getndelim2.m4, gl/m4/getopt.m4, gl/m4/getpass.m4, gl/m4/getsubopt.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/glibc21.m4, gl/m4/iconv.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longdouble.m4, gl/m4/longlong.m4, gl/m4/mktime.m4, gl/m4/readlink.m4, gl/m4/restrict.m4, gl/m4/setenv.m4, gl/m4/signed.m4, gl/m4/size_max.m4, gl/m4/sockpfaf.m4, gl/m4/ssize_t.m4, gl/m4/st_mtim.m4, gl/m4/stdbool.m4, gl/m4/stdint_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror_r.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/strtok_r.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/m4/timespec.m4, gl/m4/tm_gmtoff.m4, gl/m4/uintmax_t.m4, gl/m4/ulonglong.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/m4/xreadlink.m4, gl/m4/xsize.m4, gl/m4/xstrndup.m4, gl/size_max.h: Update. 2005-01-25 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-rfc1510ter-00.txt: Add. 2005-01-17 Simon Josefsson * doc/specifications/draft-zhu-kerb-enctype-nego-00.txt: Add. 2005-01-02 Simon Josefsson * po/LINGUAS: Add. 2005-01-02 Simon Josefsson * gl/Makefile.am, gl/base64.c, gl/base64.h, gl/error.c, gl/m4/getline.m4, gl/m4/gnulib.m4, gl/m4/strdup.m4: Update. 2004-12-29 Simon Josefsson * doc/shishi.texi: Add. 2004-12-24 Simon Josefsson * gl/getdate.y, gl/m4/getdate.m4: Update. 2004-12-19 Simon Josefsson * gl/alloca_.h, gl/getdate.y: Update. 2004-12-18 Simon Josefsson * gl/alloca.c: Remove. 2004-12-18 Simon Josefsson * gl/Makefile.am, gl/getdate.y, gl/m4/getline.m4, gl/m4/gnulib.m4, gl/m4/strdup.m4, lib/internal.h: Update. 2004-12-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-12-17 Simon Josefsson * shishi.fms: Add. 2004-12-17 Simon Josefsson * ChangeLog: [no log message] 2004-12-17 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-12-17 Simon Josefsson * NEWS: Version 0.0.21. 2004-12-17 Simon Josefsson * NEWS: Fix. 2004-12-17 Simon Josefsson * NEWS: Add. 2004-12-17 Simon Josefsson * doc/getdate.texi, gl/getdate.y, gl/m4/strdup.m4, gl/mktime.c: Update. 2004-12-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-12-17 Simon Josefsson * THANKS: Add. Reorder. 2004-12-17 Simon Josefsson * crypto/Makefile.am: Fix srcdir != objdir, tiny patch from Mike Castle . 2004-12-16 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c: Update. 2004-12-15 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-03.txt: Add. 2004-12-07 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-22.txt: Add. 2004-12-03 Simon Josefsson * lib/cfg.c, lib/crypto-aes.c: Use constant. 2004-12-03 Simon Josefsson * lib/crypto-3des.c: Fix mem leak. Don't hard code constant. 2004-12-03 Simon Josefsson * lib/crypto.h: Add. 2004-12-02 Simon Josefsson * tests/ticketset.c: Use new b64 API. 2004-12-02 Simon Josefsson * tests/Makefile.am: Fix. 2004-12-02 Simon Josefsson * gl/Makefile.am, gl/b64.c, gl/b64.h, lib/internal.h: Remove. 2004-12-02 Simon Josefsson * lib/diskio.c: Cleanups. 2004-12-02 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib.m4, gl/xasprintf.c, gl/xvasprintf.c, gl/xvasprintf.h, lib/internal.h: Add. 2004-12-02 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/authenticator.c, lib/cfg.c, lib/diskio.c, lib/encapreppart.c, lib/error.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/priv.c, lib/safe.c, lib/shishi.h.in, lib/tkts.c: Rename SHISHI_FCLOSE_ERROR to SHISHI_IO_ERROR, and alter semantics slightly. 2004-12-02 Simon Josefsson * lib/diskio.c: Use new b64 API. 2004-12-02 Simon Josefsson * tests/.cvsignore: [no log message] 2004-12-02 Simon Josefsson * lib/internal.h: For old b64 API. 2004-12-02 Simon Josefsson * lib/key.c: Use new base64 API. 2004-12-02 Simon Josefsson * gl/Makefile.am, gl/b64.c, gl/b64.h, tests/Makefile.am, tests/key.c: Add. 2004-12-02 Simon Josefsson * configure.ac, gl/Makefile.am, gl/base64.c, gl/base64.h, gl/m4/base64.m4, gl/m4/gnulib.m4, gl/m4/restrict.m4: Add base64 gnulib module. 2004-11-29 Simon Josefsson * gl/getopt_.h, gl/m4/getopt.m4: Update. 2004-11-22 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-02.txt: Add. 2004-11-22 Simon Josefsson * po/pl.po: Fix, from Jakub Bogusz . 2004-11-21 Simon Josefsson * ChangeLog: [no log message] 2004-11-21 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-11-21 Simon Josefsson * NEWS: Version 0.0.20. 2004-11-21 Simon Josefsson * doc/gdoc: Make sure all man pages follow 'foo -- purpose of foo' format, even if there is no purpose description available. 2004-11-21 Simon Josefsson * NEWS, shishi.fms: Add. 2004-11-21 Simon Josefsson * doc/gdoc: Improve man pages, from libidn. 2004-11-21 Simon Josefsson * gl/getopt_.h: Update. 2004-11-19 Simon Josefsson * doc/getdate.texi, gl/getdate.y, gl/getopt.c, gl/getopt1.c, gl/getopt_.h, gl/getopt_int.h, gl/realloc.c, gl/strtok_r.c, gl/strtok_r.h: Update. 2004-11-19 Simon Josefsson * gl/strtok_r.c: Update. 2004-11-19 Simon Josefsson * doc/shishi.texi: Fix. 2004-11-15 Simon Josefsson * doc/specifications/draft-josefsson-kerberos5-starttls-00.txt: Add. 2004-11-12 Simon Josefsson * NEWS: Fix. 2004-11-12 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-11-12 Simon Josefsson * gl/progname.c, gl/progname.h, src/shishid.c: Fix progname usage. 2004-11-12 Simon Josefsson * shishi.fms: Update. 2004-11-12 Simon Josefsson * ChangeLog: [no log message] 2004-11-12 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-11-12 Simon Josefsson * Makefile.am: Fix make distcheck. 2004-11-12 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-11-12 Simon Josefsson * NEWS: Version 0.0.19. 2004-11-12 Simon Josefsson * lib/error.c: Fix mem leak. Fix warning. 2004-11-12 Simon Josefsson * gl/getopt.c, gl/getopt1.c, gl/getopt_.h, gl/getopt_int.h, gl/strtok_r.c: Update. 2004-11-11 Simon Josefsson * gl/getopt_.h, gl/m4/getopt.m4: Update. 2004-11-11 Simon Josefsson * gl/strtok_r.c: Update. 2004-11-11 Simon Josefsson * lib/internal.h: Include strtok_r.h. 2004-11-11 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib.m4, gl/m4/strtok_r.m4, gl/strtok_r.c, gl/strtok_r.h: Add strtok_r. 2004-11-11 Simon Josefsson * configure.ac: Need strtok_r, for Mac OS X. 2004-11-11 Simon Josefsson * gl/alloca_.h, gl/allocsa.h, gl/getdate.y, gl/mktime.c: Update. 2004-11-11 Simon Josefsson * gl/m4/getopt.m4: Update. 2004-11-11 Simon Josefsson * configure.ac: Don't use gettext if it doesn't have ngettext. 2004-11-11 Simon Josefsson * NEWS: Add. 2004-11-10 Simon Josefsson * : Add. 2004-11-10 Simon Josefsson * : Add. 2004-11-10 Simon Josefsson * : Add. 2004-11-10 Simon Josefsson * : Add. 2004-11-10 Simon Josefsson * gl/getaddrinfo.c, gl/m4/getaddrinfo.m4: Update. 2004-11-09 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-11-09 Simon Josefsson * lib/utils.c: Fix. 2004-11-09 Simon Josefsson * lib/shishi.h.in: Add. 2004-11-09 Simon Josefsson * configure.ac, lib/Makefile.am: Fix namespace of xalloc_die. 2004-11-09 Simon Josefsson * lib/Makefile.am: Use -export-symbols-regex, but export xalloc_die until I figure it out. 2004-11-09 Simon Josefsson * doc/Makefile.am: Build components.png earlier. 2004-11-09 Simon Josefsson * configure.ac: We won't be using gdbm, remove. 2004-11-09 Simon Josefsson * doc/.cvsignore: [no log message] 2004-11-09 Simon Josefsson * doc/.cvsignore: [no log message] 2004-11-09 Simon Josefsson * doc/reference/Makefile.am, doc/reference/shishi-docs.sgml: Add. 2004-11-09 Simon Josefsson * doc/Makefile.am: Build here before reference/. 2004-11-09 Simon Josefsson * doc/Makefile.am: Fix dia invocation, see . 2004-11-09 Simon Josefsson * NEWS: Add. 2004-11-09 Simon Josefsson * lib/ap.c, lib/as.c, lib/crypto.c, lib/keys.c: Doc fix. 2004-11-09 Simon Josefsson * lib/encticketpart.c, lib/shishi.h.in: Remove. 2004-11-09 Simon Josefsson * lib/apreq.c: Doc fix. 2004-11-09 Simon Josefsson * lib/ap.c, lib/apreq.c, lib/as.c, lib/authorize.c, lib/cfg.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/hostkeys.c, lib/kdc.c, lib/key.c, lib/keys.c, lib/krberror.c, lib/priv.c, lib/realm.c, lib/safe.c, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tkts.c: Doc fix. 2004-11-09 Simon Josefsson * lib/pki.c, lib/tkts.c: Doc fix. 2004-11-09 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/errors.c, asn1/errors.h, asn1/errors_int.h, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/parser_aux.c, asn1/structure.c, crypto/macros.h, crypto/nettle-meta.h: Sync upstream. 2004-11-09 Simon Josefsson * Makefile.am: Fix release target. 2004-11-09 Simon Josefsson * doc/reference/.cvsignore: [no log message] 2004-11-09 Simon Josefsson * doc/reference/Makefile.am, doc/reference/shishi-docs.sgml, doc/reference/shishi-docs.tmpl: Fix. 2004-11-09 Simon Josefsson * lib/krberror.c, lib/resolv.c, lib/shishi.h.in: Doc fix. 2004-11-09 Simon Josefsson * doc/reference/Makefile.am: Fixes. 2004-11-09 Simon Josefsson * doc/gendocs.sh, doc/gendocs_template: Update. 2004-11-09 Simon Josefsson * autogen.sh: Fix. 2004-11-09 Simon Josefsson * doc/reference/Makefile.am: Rewrite, to align with up-stream examples. 2004-11-09 Simon Josefsson * doc/Makefile.am, doc/getdate.texi, doc/shishi.texi: Add getdate.texi. 2004-11-09 Simon Josefsson * gl/Makefile.am, gl/gai_strerror.c, gl/getaddrinfo.c, gl/getaddrinfo.h, gl/m4/getaddrinfo.m4, gl/m4/gnulib.m4, gl/m4/sockpfaf.m4: Add getaddrinfo. 2004-11-09 Simon Josefsson * configure.ac: Need getaddrinfo too. 2004-11-08 Simon Josefsson * autogen.sh: Fix. 2004-11-08 Simon Josefsson * gl/Makefile.am, gl/allocsa.h, gl/allocsa.valgrind, gl/getdate.y, gl/getpass.c, gl/m4/getopt.m4, gl/m4/getpass.m4, gl/m4/gnulib.m4, gl/m4/setenv.m4, gl/mktime.c, gl/readlink.c, gl/setenv.h, gl/xreadlink.c: Update. 2004-11-07 Simon Josefsson * README-alpha: Fix. 2004-11-07 Simon Josefsson * AUTHORS: Fix PGP key. 2004-10-29 Simon Josefsson * lib/version.c: Doc fix. 2004-10-28 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-05.txt, doc/specifications/draft-yu-krb-wg-kerberos-extensions-02.txt: Add. 2004-10-28 Simon Josefsson * doc/gdoc: Sync with libidn. 2004-10-26 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-21.txt: Add. 2004-10-25 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-preauth-framework-02.txt: Add. 2004-10-24 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-sha1-00.txt: Add. 2004-10-15 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-10-15 Simon Josefsson * shishi.fms: Update. 2004-10-15 Simon Josefsson * ChangeLog: [no log message] 2004-10-15 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-10-15 Simon Josefsson * NEWS: Version 0.0.18. 2004-10-15 Simon Josefsson * lib/internal.h: Add. 2004-10-15 Simon Josefsson * NEWS: Fix. 2004-10-15 Simon Josefsson * NEWS: Add. 2004-10-15 Simon Josefsson * NEWS: Add. 2004-10-15 Simon Josefsson * lib/ap.c, lib/authenticator.c, lib/encticketpart.c, lib/krberror.c, lib/netio.c, lib/principal.c, lib/realm.c, lib/resolv.c, lib/tkt.c, src/kdc.c, src/shishid.c, tests/authenticator.c, tests/rijndael.c, tests/utils.c: Indent. 2004-10-14 Simon Josefsson * NEWS: Add. 2004-10-14 Simon Josefsson * lib/hostkeys.c: (shishi_hostkeys_default_file): Fix mem leak. Perhaps too slow now? Could be optimized. 2004-10-14 Simon Josefsson * lib/init.c: Fix mem leak. 2004-10-14 Simon Josefsson * NEWS: Add. 2004-10-14 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/shishi.h.in: (shishi_aprep_enc_part_make): Don't create new EncAPRepPart, use existing. 2004-10-14 Simon Josefsson * gl/getpass.c: Sync. 2004-10-14 Simon Josefsson * doc/Makefile.am: Update. 2004-10-05 Simon Josefsson * gl/Makefile.am: Fix. 2004-10-05 Simon Josefsson * gl/Makefile.am, gl/exit.h, gl/exitfail.c, gl/exitfail.h, gl/m4/exitfail.m4, gl/m4/unlocked-io.m4, gl/unlocked-io.h, gl/xalloc-die.c: Remove. 2004-10-05 Simon Josefsson * gl/Makefile.am, gl/error.c, gl/getdate.y, gl/getndelim2.c, gl/getpass.c, gl/getsubopt.c, gl/m4/gnulib.m4, gl/m4/xalloc.m4, gl/progname.h, gl/vasnprintf.h, gl/xalloc.h, gl/xmalloc.c, gl/xstrdup.c, lib/ap.c, lib/crypto-ctx.c, lib/crypto.c, lib/libgcrypt.c, lib/nettle.c: Gnulib update. Fix callers. 2004-09-17 Simon Josefsson * doc/shishi.texi: Move. 2004-09-17 Simon Josefsson * lib/asn1.c, lib/shishi.h.in, src/kdc.c: Sanitize. 2004-09-17 Simon Josefsson * lib/resolv.c: Fix. 2004-09-17 Simon Josefsson * lib/shishi.h.in, lib/tkt.c: Fix. 2004-09-17 Simon Josefsson * doc/Makefile.am: Update. 2004-09-17 Simon Josefsson * lib/tkt.c: Fix. 2004-09-17 Simon Josefsson * lib/shishi.h.in: Add. 2004-09-17 Simon Josefsson * lib/tkt.c: Doc fix. 2004-09-17 Simon Josefsson * doc/shishi.texi: Add. 2004-09-17 Simon Josefsson * lib/ticket.c: Fix. 2004-09-17 Simon Josefsson * lib/Makefile.am, lib/netio.c, lib/realm.c, lib/resolv.c, lib/resolver.h, lib/shishi.h.in: Make resolver API public. Cleanup resolver. 2004-09-17 Simon Josefsson * gl/Makefile.am, gl/inet_r.c, gl/inet_r.h, gl/m4/gnulib.m4, gl/xinet.c, gl/xinet.h: Remove. 2004-09-17 Simon Josefsson * configure.ac: Fix. 2004-09-17 Simon Josefsson * lib/resolv.c: Remove A record parsing, to avoid xinet/inet_r. 2004-09-17 Simon Josefsson * lib/principal.c: Remove comment. 2004-09-17 Simon Josefsson * lib/principal.c: Doc fix. 2004-09-17 Simon Josefsson * lib/principal.c: Doc fix. 2004-09-17 Simon Josefsson * lib/krberror.c: Fix. 2004-09-17 Simon Josefsson * lib/krberror.c, lib/shishi.h.in: (shishi_krberror_cname): Removed. (shishi_krberror_client): Add. (shishi_krberror_sname): Removed. (shishi_krberror_server): Add. 2004-09-17 Simon Josefsson * NEWS: Add. 2004-09-17 Simon Josefsson * lib/principal.c, lib/shishi.h.in: (shishi_principal_name_get): Remove. 2004-09-17 Simon Josefsson * lib/krberror.c, lib/principal.c, lib/shishi.h.in: (shishi_krberror_cname): (shishi_krberror_sname): Allocate output. (shishi_principal_name_realm_get): Remove. 2004-09-17 Simon Josefsson * lib/shishi.h.in: Fix. 2004-09-17 Simon Josefsson * lib/tkt.c: (shishi_tkt_client): Allocate output. (shishi_tkt_cnamerealm): Remove. (shishi_tkt_clientrealm): Add. 2004-09-17 Simon Josefsson * lib/kdcreq.c: Remove. 2004-09-17 Simon Josefsson * lib/authorize.c, lib/encticketpart.c, lib/shishi.h.in: (shishi_encticketpart_cnamerealm_get): (shishi_encticketpart_cname_get): Remove. (shishi_encticketpart_clientrealm): Add. 2004-09-17 Simon Josefsson * tests/authenticator.c: Use new API. 2004-09-17 Simon Josefsson * lib/principal.c, tests/authenticator.c: Fix. 2004-09-17 Simon Josefsson * lib/authenticator.c, lib/shishi.h.in: (shishi_authenticator_cname_get): (shishi_authenticator_cnamerealm_get): Remove. (shishi_authenticator_client): (shishi_authenticator_clientrealm): Add. 2004-09-17 Simon Josefsson * lib/as.c, lib/kdcreq.c, lib/shishi.h.in: (shishi_asreq_cnamerealm_get): Remove. (shishi_asreq_clientrealm): Add. 2004-09-17 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Remove. 2004-09-17 Simon Josefsson * lib/shishi.h.in, lib/ticket.c, lib/tkt.c: Remove. 2004-09-17 Simon Josefsson * lib/principal.c: Fix. 2004-09-17 Simon Josefsson * lib/principal.c, lib/shishi.h.in: (shishi_principal_name_realm): Add. 2004-09-17 Simon Josefsson * lib/shishi.h.in, lib/ticket.c: Remove. 2004-09-17 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/gnulib.m4, gl/progname.c, gl/progname.h, lib/shishi.h.in, lib/utils.c: Update. 2004-09-17 Simon Josefsson * lib/resolv.c: Use xinet. 2004-09-17 Simon Josefsson * configure.ac, gl/Makefile.am, gl/inet_r.c, gl/inet_r.h, gl/m4/gnulib.m4, gl/xinet.c, gl/xinet.h: Add. 2004-09-16 Simon Josefsson * gl/m4/eoverflow.m4, gl/m4/vasnprintf.m4, gl/vasnprintf.c, gl/vasprintf.c: Update. 2004-09-13 Simon Josefsson * doc/reference/Makefile.am: (clean-local): Add style.css. 2004-09-10 Simon Josefsson * ChangeLog: Update. 2004-09-10 Simon Josefsson * doc/shishi.texi: Fix. 2004-09-10 Simon Josefsson * doc/Makefile.am: Don't generate *.texi for each function. 2004-09-10 Simon Josefsson * doc/gdoc-error, doc/shishi.texi: Fix. 2004-09-10 Simon Josefsson * doc/shishi.texi: Add. 2004-09-10 Simon Josefsson * doc/shishi.texi: Typo. 2004-09-10 Simon Josefsson * doc/shishi.texi: Add. 2004-09-10 Simon Josefsson * doc/shishi.texi: Add. 2004-09-10 Simon Josefsson * doc/shishi.texi: Add. 2004-09-10 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto-aes.c, lib/diskio.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/gztime.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/krberror.c, lib/netio.c, lib/principal.c, lib/priv.c, lib/safe.c, lib/starttls.c, lib/ticket.c, lib/tkt.c, lib/utils.c: Indent. 2004-09-10 Simon Josefsson * NEWS, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/gztime.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/principal.c, lib/priv.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c: Cleanup ASN.1. 2004-09-10 Simon Josefsson * tests/authenticator.c: Fix crash. 2004-09-10 Simon Josefsson * lib/shishi.h.in: Fix. 2004-09-10 Simon Josefsson * lib/authenticator.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/gztime.c, lib/internal.h, lib/kdcreq.c, lib/krberror.c, lib/shishi.h.in, lib/tkt.c: SHISHI_GENERALIZEDTIME_LENGTH: New public definition. 2004-09-10 Simon Josefsson * tests/authenticator.c: Use new API. 2004-09-10 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_authorizationdata): Allocate output. 2004-09-10 Simon Josefsson * lib/encapreppart.c, lib/shishi.h.in: (shishi_encapreppart_get_key): Return Shishi_key instead of raw key data. 2004-09-10 Simon Josefsson * : Update. 2004-09-10 Simon Josefsson * NEWS, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/asn1.h, lib/diskio.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/priv.c, lib/safe.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, tests/authenticator.c, tests/priv.c, tests/safe.c, tests/ticketset.c: ASN.1 cleanup. 2004-09-10 Simon Josefsson * po/pl.po, po/sv.po: Generated 2004-09-09 Simon Josefsson * asn1/decoding.c, asn1/int.h, asn1/libtasn1.h: Sync. 2004-09-08 Simon Josefsson * Makefile.am, doc/shishi.texi: Consistency. 2004-09-08 Simon Josefsson * lib/init.c: Check version. Fix use after free on init errors. 2004-09-08 Simon Josefsson * : Fix. 2004-09-08 Simon Josefsson * doc/gendocs_template: Update. 2004-09-08 Simon Josefsson * doc/Makefile.am: Add. 2004-09-08 Simon Josefsson * doc/Makefile.am: Add. 2004-09-08 Simon Josefsson * doc/.cvsignore: [no log message] 2004-09-08 Simon Josefsson * NEWS: Add. 2004-09-08 Simon Josefsson * doc/shishi.texi: Fix. 2004-09-08 Simon Josefsson * doc/reference/.cvsignore, lib/kdcreq.c, lib/tkts.c: Doc fix. 2004-09-08 Simon Josefsson * doc/shishi.texi: Update examples. 2004-09-08 Simon Josefsson * gl/progname.c, gl/progname.h: Fix progname. 2004-09-08 Simon Josefsson * gl/progname.c, gl/progname.h, src/shishid.c: Use short progname in syslog. 2004-09-07 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-07.txt: Add. 2004-09-06 Simon Josefsson * lib/password.c: Bug fix, based on patch from Nicolas Pouvesle . 2004-09-02 Simon Josefsson * examples/client-cksum.c, examples/client-priv.c, examples/client-safe.c, examples/client.c, examples/server.c, lib/realm.c: Sanitize. 2004-09-02 Simon Josefsson * lib/password.c: Doc fix. 2004-09-02 Simon Josefsson * lib/password.c: Use getpass. 2004-09-02 Simon Josefsson * configure.ac, gl/Makefile.am, gl/getpass.c, gl/getpass.h, gl/m4/getpass.m4, gl/m4/gnulib.m4: Add getpass. 2004-08-31 Simon Josefsson * NEWS, autogen.sh, doc/Makefile.am, doc/Makefile.gdoci: Fix gdoc stuff. 2004-08-25 Simon Josefsson * gl/m4/gnulib.m4: Update. 2004-08-23 Simon Josefsson * m4/autobuild.m4: Update. 2004-08-18 Simon Josefsson * doc/shishi.texi: Fix. 2004-08-17 Simon Josefsson * lib/kerberos5.asn1: Update. 2004-08-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-08-17 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-01.txt: Add. 2004-08-16 Simon Josefsson * gl/Makefile.am, gl/exit.h, gl/exitfail.c, gl/exitfail.h, gl/m4/gnulib.m4: Update. 2004-08-11 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-ocsp-for-pkinit-00.txt: Add. 2004-08-10 Simon Josefsson * doc/specifications/draft-ietf-krbwg-ocsp-for-pkinit-00.txt: add. 2004-08-10 Simon Josefsson * gl/Makefile.am, gl/exit.h, gl/exitfail.c, gl/exitfail.h, gl/xalloc-die.c, gl/xalloc.h, gl/xgethostname.c, gl/xmalloc.c: Update. 2004-08-10 Simon Josefsson * configure.ac: Need xalloc-die too. 2004-08-08 Simon Josefsson * shishi.fms: Add. 2004-08-07 Simon Josefsson * ChangeLog: [no log message] 2004-08-07 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-08-07 Simon Josefsson * NEWS: Version 0.0.17. 2004-08-07 Simon Josefsson * gl/.cvsignore: [no log message] 2004-08-07 Simon Josefsson * NEWS: Add. 2004-08-07 Simon Josefsson * configure.ac: Use new gnulib stuff. 2004-08-07 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib.m4: Fix. 2004-08-07 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib.m4: Fix. 2004-08-07 Simon Josefsson * db/Makefile.am: Rename libfoo to libgnu. 2004-08-07 Simon Josefsson * gl/Makefile.am: Rename. 2004-08-07 Simon Josefsson * lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Rename libfoo to libgnu. 2004-08-07 Simon Josefsson * gl/m4/gnulib.m4: Fix. 2004-08-07 Simon Josefsson * gl/Makefile.am, gl/m4/gnulib.m4: Fix. 2004-08-07 Simon Josefsson * gl/getsubopt.c, gl/getsubopt.h, gl/m4/strdup.m4: Update. 2004-08-07 Simon Josefsson * gl/Makefile.am: Generated by gnulib-tool. 2004-08-07 Simon Josefsson * gl/m4/gnulib.m4: Add. 2004-08-07 Simon Josefsson * configure.ac: Use new gnulib stuff. 2004-08-07 Simon Josefsson * gl/error.c, gl/getdate.y, gl/progname.h, gl/setenv.c, gl/strdup.c, gl/strdup.h, gl/xgetdomainname.c, gl/xgethostname.c, gl/xreadlink.c: Update. 2004-08-06 Simon Josefsson * NEWS: Bump version. 2004-08-01 Simon Josefsson * db/info.h: Fix. 2004-08-01 Simon Josefsson * configure.ac: Fix last commit. 2004-08-01 Simon Josefsson * configure.ac, db/info.h, gl/Makefile.am, gl/getsubopt.c, gl/getsubopt.h, gl/m4/getsubopt.m4, lib/cfg.c: Add getsubopt. 2004-08-01 Simon Josefsson * lib/nettle.c: Fix warning. 2004-08-01 Simon Josefsson * lib/error.c, lib/krberror.c, lib/shishi.h.in: Fix warning. 2004-08-01 Simon Josefsson * gl/progname.h, gl/strcase.h, gl/xalloc.h, gl/xgetdomainname.c: Sync. 2004-08-01 Simon Josefsson * configure.ac: Bump version. 2004-08-01 Simon Josefsson * NEWS, README, db/db.c, db/file.c, db/file.h, db/shisa.h, doc/Makefile.am, lib/krberror.c, lib/starttls.c, lib/starttls.h, lib/tkt.c, shisa.conf.in, src/shisa.ggo, src/shishi.c, src/shishi.ggo, src/shishid.ggo: Doc fix. 2004-08-01 Simon Josefsson * lib/apreq.c, lib/authenticator.c, lib/authorize.c, lib/crypto-rc4.c, lib/crypto.c: Doc fix. 2004-08-01 Simon Josefsson * ChangeLog: [no log message] 2004-08-01 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-08-01 Simon Josefsson * NEWS: Version 0.0.16. 2004-08-01 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Fix. 2004-08-01 Simon Josefsson * m4/autobuild.m4, po/pl.po, po/sv.po: Add. 2004-08-01 Simon Josefsson * configure.ac: Use Autobuild. 2004-08-01 Simon Josefsson * NEWS: Fix. 2004-08-01 Simon Josefsson * NEWS, README: Fix. 2004-08-01 Simon Josefsson * NEWS: Add. 2004-08-01 Simon Josefsson * gl/getopt.c, gl/getopt1.c, gl/m4/getopt.m4: Sync. 2004-07-26 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-20.txt, doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-02.txt, doc/specifications/draft-ietf-krb-wg-preauth-framework-01.txt, doc/specifications/draft-johansson-kerberos-model-01.txt, doc/specifications/draft-yu-krb-wg-kerberos-extensions-01.txt: Add. 2004-07-26 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-04.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-07.txt: Add. 2004-07-15 Simon Josefsson * doc/specifications/draft-ietf-kink-kink-06.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-03.txt: Add. 2004-07-13 Simon Josefsson * doc/specifications/draft-tschofenig-pana-bootstrap-kerberos-00.txt: Add. 2004-07-11 Simon Josefsson * lib/key.c: (shishi_key_done): Free more. 2004-07-11 Simon Josefsson * lib/shishi.h.in: Add. 2004-07-11 Simon Josefsson * lib/hostkeys.c: Support SHISHI_KEYS. 2004-07-11 Simon Josefsson * NEWS: Add. 2004-07-11 Simon Josefsson * lib/aprep.c: Don't read out of bounds. 2004-07-11 Simon Josefsson * src/kdc.c: Set endtime for TGS-REQ. 2004-07-11 Simon Josefsson * lib/kdcreq.c: (shishi_kdcreq_tillc): Add. 2004-07-11 Simon Josefsson * lib/tkts.c: (set_tgtflags_based_on_hint): Propagate endtime. 2004-07-11 Simon Josefsson * src/kdc.c: Listen to endtime in AS-REQ (no policy checks). 2004-07-11 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Add. 2004-07-11 Simon Josefsson * lib/enckdcreppart.c: (shishi_enckdcreppart_endtime_set): Add. 2004-07-11 Simon Josefsson * lib/shishi.h.in: *kdcrep* fixes. 2004-07-11 Simon Josefsson * lib/init.c: (maybe_install_usercfg): Don't create anything if non-standard home is used. 2004-07-08 Simon Josefsson * tests/crypto.c: More debugging. 2004-07-02 Simon Josefsson * asn1/Makefile.am: Add -I../gl. 2004-07-02 Simon Josefsson * gl/getndelim2.c: Fix. 2004-07-02 Simon Josefsson * lib/error.c: Fix. 2004-07-02 Simon Josefsson * lib/error.c, lib/init.c, lib/shishi.h.in: Fix. 2004-07-02 Simon Josefsson * configure.ac: Default to Nettle. 2004-07-02 Simon Josefsson * gl/.cvsignore: [no log message] 2004-07-02 Simon Josefsson * NEWS: Add. 2004-07-02 Simon Josefsson * configure.ac: Improve IPv6 test (uClibc doesn't have in6addr_any). 2004-07-02 Simon Josefsson * doc/shishi.texi: Fix. 2004-07-02 Simon Josefsson * db/fileutil.c: Fix API. 2004-07-02 Simon Josefsson * configure.ac, gl/Makefile.am, gl/alloca.c, gl/alloca_.h, gl/getline.c, gl/getndelim2.c, gl/getndelim2.h, gl/getopt.c, gl/getopt.h, gl/getopt1.c, gl/getopt_.h, gl/gettime.c, gl/m4/alloca.m4, gl/m4/allocsa.m4, gl/m4/bison.m4, gl/m4/error.m4, gl/m4/getdate.m4, gl/m4/getopt.m4, gl/m4/gettext.m4, gl/m4/gettime.m4, gl/m4/glibc21.m4, gl/m4/intmax.m4, gl/m4/intmax_t.m4, gl/m4/inttypes_h.m4, gl/m4/longlong.m4, gl/m4/stdbool.m4, gl/m4/stdint_h.m4, gl/m4/timespec.m4, gl/m4/uintmax_t.m4, gl/m4/ulonglong.m4, gl/m4/unlocked-io.m4, gl/m4/vasnprintf.m4, gl/m4/xalloc.m4, gl/malloc.c, gl/vasnprintf.c, gl/xmalloc.c, gl/xreadlink.c, gl/xreadlink.h: Gnulib update. Mainly for getopt that work on uClibc. 2004-07-01 Simon Josefsson * doc/shishi.texi: Add. 2004-06-30 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-06.txt: Add. 2004-05-21 Simon Josefsson * asn1/decoding.c, asn1/int.h, asn1/libtasn1.h: Update to 0.2.10. 2004-04-22 Simon Josefsson * doc/specifications/draft-raeburn-krb-rijndael-krb-06.txt: Add. 2004-04-22 Simon Josefsson * doc/shishi.texi: Fix. 2004-04-22 Simon Josefsson * doc/shishi.texi: Fix. 2004-04-22 Simon Josefsson * doc/shishi.texi: Fix. 2004-04-22 Simon Josefsson * doc/shishi.texi: Fix. 2004-04-22 Simon Josefsson * doc/shishi.texi: Fix. 2004-04-21 Simon Josefsson * AUTHORS: Update PGP key. 2004-04-21 Simon Josefsson * lib/init.c: Write tickets before shutting down TLS library. 2004-04-21 Simon Josefsson * NEWS, lib/shishi.h.in: Fix. 2004-04-21 Simon Josefsson * lib/cfg.c, lib/pki.c, lib/tkts.c: Add. 2004-04-21 Simon Josefsson * lib/internal.h: Remove. 2004-04-21 Simon Josefsson * NEWS: Fix. 2004-04-21 Simon Josefsson * lib/tkts.c: (shishi_tkts_default_file_guess): Use SHISHI_TICKETS. Use shishi_cfg_userdirectory_file. 2004-04-21 Simon Josefsson * doc/shishi.texi: Add SHISHI_HOME and SHISHI_TICKETS. 2004-04-21 Simon Josefsson * lib/cfg.c: Typo. 2004-04-21 Simon Josefsson * lib/cfg.c: (shishi_cfg_default_userfile): Use shishi_cfg_userdirectory_file. 2004-04-21 Simon Josefsson * lib/cfg.c: (shishi_cfg_default_userdirectory): Use SHISHI_HOME. 2004-04-21 Simon Josefsson * doc/shishi.texi: Add SHISHI_USER. 2004-04-21 Simon Josefsson * lib/principal.c: Typo. 2004-04-21 Simon Josefsson * lib/principal.c: (shishi_principal_default): Add SHISHI_USER. 2004-04-21 Simon Josefsson * lib/cfg.c: Typo. 2004-04-21 Simon Josefsson * NEWS: Fix. 2004-04-21 Simon Josefsson * NEWS: Add. 2004-04-21 Simon Josefsson * doc/shishi.texi: Mention SHISHI_CONFIG. 2004-04-21 Simon Josefsson * lib/cfg.c: Doc fix. 2004-04-21 Simon Josefsson * lib/cfg.c: (shishi_cfg_default_systemfile): Look for SHISHI_CONFIG env.var. 2004-04-21 Simon Josefsson * lib/kdcreq.c: Bug workaround. 2004-04-21 Simon Josefsson * lib/asn1.c: Fix printf templates. 2004-04-21 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Add shishi_kdcreq_nonce_set. Use it. 2004-04-21 Simon Josefsson * asn1/int.h, asn1/libtasn1.h: Update. 2004-04-20 Simon Josefsson * crypto/Makefile.am, crypto/hmac-md4.c, crypto/hmac.h: Remove HMAC-MD4 (why was it added?). 2004-04-20 Simon Josefsson * lib/nettle.c: Include md4.h directly (not via hmac.h). 2004-04-19 Simon Josefsson * src/shishi.c: Fix error messages, suggested by Nicolas Pouvesle . 2004-04-18 Simon Josefsson * shishi.pc.in: Drop -R libs flag. 2004-04-18 Simon Josefsson * m4/.cvsignore: [no log message] 2004-04-18 Simon Josefsson * lib/cfg.c: (shishi_cfg): Clear newly allocated realminfos, reported by Nicolas Pouvesle . 2004-04-18 Simon Josefsson * configure.ac: Require modern autoconf/automake/gettext. 2004-04-18 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-04-18 Simon Josefsson * ChangeLog: [no log message] 2004-04-18 Simon Josefsson * po/pl.po, po/sv.po: Generated. 2004-04-18 Simon Josefsson * NEWS: Version 0.0.15. 2004-04-18 Simon Josefsson * crypto/nettle-internal.h: Sync. 2004-04-18 Simon Josefsson * crypto/hmac.h: Sync 2004-04-18 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/authenticator.c, lib/encapreppart.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/priv.c, lib/safe.c, lib/shishi.h.in: Use const. 2004-04-18 Simon Josefsson * tests/authenticator.c, tests/crypto.c, tests/rijndael.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/authenticator.c, lib/shishi.h.in: Use const. 2004-04-18 Simon Josefsson * doc/Makefile.am: Fix copyright years on man pages. 2004-04-18 Simon Josefsson * db/config.c, db/err.c, db/file.c, db/fileutil.c, db/info.h: Fix warnings. 2004-04-18 Simon Josefsson * lib/crypto.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/crypto.c: Indent. 2004-04-18 Simon Josefsson * lib/utils.c: Fix. 2004-04-18 Simon Josefsson * crypto/nettle-internal.h: Disable alloca use in nettle (we don't include alloca.h early enough, as the Nettle configure.ac hacks make sure). 2004-04-18 Simon Josefsson * crypto/nettle-internal.h: Try to get alloca.h included early. 2004-04-18 Simon Josefsson * configure.ac, gl/Makefile.am, gl/allocsa.c, gl/allocsa.h, gl/getdate.h, gl/getdate.y, gl/getopt.c, gl/getopt.h, gl/getopt1.c, gl/getopt_int.h, gl/gettime.c, gl/gettimeofday.c, gl/m4/allocsa.m4, gl/m4/clock_time.m4, gl/m4/eealloc.m4, gl/m4/getdate.m4, gl/m4/gettext.m4, gl/m4/gettime.m4, gl/m4/gettimeofday.m4, gl/m4/intmax.m4, gl/m4/lib-ld.m4, gl/m4/lib-prefix.m4, gl/m4/malloc.m4, gl/m4/po.m4, gl/m4/printf-posix.m4, gl/m4/realloc.m4, gl/m4/size_max.m4, gl/m4/ssize_t.m4, gl/m4/st_mtim.m4, gl/m4/strdup.m4, gl/m4/timespec.m4, gl/m4/xalloc.m4, gl/m4/xsize.m4, gl/mktime.c, gl/setenv.c, gl/strdup.c, gl/strdup.h, gl/timegm.c, gl/timespec.h, gl/unlocked-io.h, gl/unsetenv.c, gl/xreadlink.c: Gnulib sync. 2004-04-18 Simon Josefsson * src/shishi.c: Replace get_date with shishi_get_date. 2004-04-18 Simon Josefsson * lib/utils.c: Fix. 2004-04-18 Simon Josefsson * lib/cfg.c: Use shishi_get_date. 2004-04-18 Simon Josefsson * lib/utils.c: (shishi_get_date): Add. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Add utils.c and shishi_get_date. 2004-04-18 Simon Josefsson * gl/m4/.cvsignore: [no log message] 2004-04-18 Simon Josefsson * crypto/nettle-internal.h: Include alloca.h, if needed and present. 2004-04-18 Simon Josefsson * src/Makefile.am: Likewise. 2004-04-18 Simon Josefsson * lib/Makefile.am, src/Makefile.am: Don't allow the possibility of a trailing \ and an empty next line. 2004-04-18 Simon Josefsson * extra/Makefile.am, extra/README, extra/fetchmail.diff, extra/fetchmail.mail: Add fetchmail.*. 2004-04-18 Simon Josefsson * Makefile.am, db/Makefile.am, lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Remove 'indent' target. 2004-04-18 Simon Josefsson * NEWS, extra/README, extra/mailutils.diff: Fix. 2004-04-18 Simon Josefsson * Makefile.am: Fix ChangeLog target. 2004-04-18 Simon Josefsson * lib/netio.c: Use socklen_t. 2004-04-18 Simon Josefsson * src/kdc.c: Fix warning. 2004-04-18 Simon Josefsson * lib/kdcrep.c, src/shishid.c: Fix warnings. 2004-04-18 Simon Josefsson * src/shisa.c: Use 'static' keyword on functions. 2004-04-18 Simon Josefsson * lib/error.c, lib/shishi.h.in: Don't use variable name "error". 2004-04-18 Simon Josefsson * lib/crypto-des.c, lib/crypto-null.c, lib/tkt.c: Fix warning. 2004-04-18 Simon Josefsson * lib/asn1.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-rc4.c, lib/crypto.h, lib/libgcrypt.c, lib/nettle.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/crypto.c, lib/netio.c, lib/starttls.c, lib/starttls.h, lib/tkts.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/tkt.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/shishi.h.in, lib/tkt.c: Allocate output. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Use const. Fix int/int32_t. 2004-04-18 Simon Josefsson * lib/encticketpart.c: Fix warning. 2004-04-18 Simon Josefsson * lib/encticketpart.c: Fix warning. 2004-04-18 Simon Josefsson * lib/encapreppart.c: Read cusec as uint32. 2004-04-18 Simon Josefsson * lib/aprep.c, lib/shishi.h.in, lib/tgs.c, lib/tkt.c: Fix int/uint32_t. 2004-04-18 Simon Josefsson * lib/as.c: Don't shadow variable. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Fix int/uint32_t. 2004-04-18 Simon Josefsson * lib/apreq.c: Fix int/uint32_t. Fix warnings. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Use const. 2004-04-18 Simon Josefsson * lib/ap.c, lib/kdcreq.c, lib/safe.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/kdcreq.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/kdc.c: (shishi_as_derive_salt): Allocate output. 2004-04-18 Simon Josefsson * lib/asn1.c: (shishi_asn1_read2): Handle zero length asn.1 fields. 2004-04-18 Simon Josefsson * lib/shishi.h.in: (shishi_as_derive_salt): Allocate output. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Add. 2004-04-18 Simon Josefsson * lib/authorize.c, lib/diskio.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/diskio.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/authenticator.c, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/krberror.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Make usec's uint32_t. 2004-04-18 Simon Josefsson * lib/krberror.c: Fix warnings. 2004-04-18 Simon Josefsson * lib/cfg.c, lib/crypto.c, lib/crypto.h, lib/gztime.c, lib/key.c, lib/principal.c, lib/shishi.h.in: Fix warnings. 2004-04-18 Simon Josefsson * lib/shishi.h.in: Really apply last changes. 2004-04-18 Simon Josefsson * lib/krberror.c, lib/shishi.h.in: Don't use variable name "stime". 2004-04-18 Simon Josefsson * lib/authenticator.c, lib/encapreppart.c, lib/krberror.c: Don't use variable "time" either (sigh..). 2004-04-18 Simon Josefsson * lib/authenticator.c, lib/encapreppart.c, lib/krberror.c, lib/shishi.h.in: Don't use variable name "ctime". 2004-04-18 Simon Josefsson * lib/asn1.c: (shishi_asn1_number_of_elements): Don't use bogus cast. 2004-04-18 Simon Josefsson * tests/authenticator.c: More debugging. 2004-04-18 Simon Josefsson * lib/kdc.c: Fix int/size_t. 2004-04-18 Simon Josefsson * lib/authenticator.c, lib/shishi.h.in: (shishi_authenticator_authorizationdata): Fix int/int32_t/size_t types. (shishi_authenticator_add_authorizationdata): Likewise. 2004-04-18 Simon Josefsson * lib/authenticator.c: Add workaround for buggy _asn1_convert_integer. 2004-04-18 Simon Josefsson * NEWS: Fix. 2004-04-18 Simon Josefsson * crypto/cbc-cts.c, crypto/cbc-cts.h, crypto/cbc-mac.h: Style changes on my files, to align with CVS Nettle. 2004-04-18 Simon Josefsson * crypto/Makefile.am, crypto/aes-set-decrypt-key.c, crypto/aes-set-encrypt-key.c, crypto/aes.h, crypto/arcfour-crypt.c, crypto/arcfour.c, crypto/arcfour.h, crypto/cbc.c, crypto/cbc.h, crypto/des.c, crypto/des.h, crypto/des3.c, crypto/hmac.c, crypto/md4.c, crypto/md4.h, crypto/md5.h, crypto/memxor.h, crypto/nettle-internal.h, crypto/nettle-meta.h, crypto/sha.h, crypto/sha1-compress.c, crypto/sha1.c: Sync with Nettle CVS (after s/nettle-types.h/shishi-int.h/g). 2004-04-18 Simon Josefsson * tests/low-crypto.c: Add aes_cts(16) test. 2004-04-18 Simon Josefsson * tests/low-crypto.c: Fix aes_cts(25) test. 2004-04-17 Simon Josefsson * tests/utils.c: More debugging. 2004-04-17 Simon Josefsson * lib/asn1.c: Fix int/size_t. (shishi_asn1_write_uint32): Use %ul instead of broken %ud. 2004-04-17 Simon Josefsson * lib/authenticator.c: Fix int/size_t. 2004-04-17 Simon Josefsson * asn1/coding.c, asn1/decoding.c, asn1/element.c, asn1/int.h, asn1/libtasn1.h, asn1/structure.c: Sync with 0.2.8. 2004-04-17 Simon Josefsson * tests/authenticator.c: Fix size_t/int. 2004-04-17 Simon Josefsson * tests/authenticator.c: Fix int/size_t. 2004-04-17 Simon Josefsson * tests/low-crypto.c: Fix messages. 2004-04-17 Simon Josefsson * lib/encapreppart.c: (shishi_encapreppart_seqnumber_remove): Add. (shishi_encapreppart_seqnumber_set): Likewise. (shishi_encapreppart): Use it. Don't use 0 seqnr. 2004-04-17 Simon Josefsson * lib/shishi.h.in: (shishi_encapreppart_seqnumber_remove): (shishi_encapreppart_seqnumber_set): Add. 2004-04-17 Simon Josefsson * doc/shishi.texi: Fix noise typo. Add verbose-crypto-noise. 2004-04-17 Simon Josefsson * NEWS: Fix. 2004-04-17 Simon Josefsson * tests/authenticator.c: Test sequence numbers. Fix comments. 2004-04-17 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_seqnumber_remove): Add. (shishi_authenticator_seqnumber_set): Add. (shishi_authenticator): Use it. 2004-04-17 Simon Josefsson * lib/shishi.h.in: (shishi_authenticator_seqnumber_remove) (shishi_authenticator_seqnumber_set): Add. 2004-04-17 Simon Josefsson * NEWS: Add. 2004-04-17 Simon Josefsson * NEWS: Add. 2004-04-17 Simon Josefsson * NEWS: Fix. 2004-04-17 Simon Josefsson * shishi.skel.in: Typo fix of verbose-noise. Mention verbose-crypto-noise. 2004-04-17 Simon Josefsson * shishi.conf.in: Mention verbose-crypto-noise. 2004-04-17 Simon Josefsson * shishi.conf.in: Typo fix for verbose-noise. 2004-04-17 Simon Josefsson * NEWS: Add. 2004-04-17 Simon Josefsson * NEWS: Add. 2004-04-12 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-19.txt: Add. 2004-04-04 Simon Josefsson * crypto/cbc-cts.c: Change output-IV to be last output from encryption primitive F. 2004-04-04 Simon Josefsson * tests/low-crypto.c: Revert bad next-IV update. 2004-04-04 Simon Josefsson * lib/libgcrypt.c: (libgcrypt_dencrypt): Only apply special CBC-CTS handling for CBC-CTS. 2004-04-04 Simon Josefsson * lib/libgcrypt.c: (libgcrypt_dencrypt): Fix IV output to match updated document, instead of MIT's original implementation. 2004-04-04 Simon Josefsson * tests/low-crypto.c: Fix IVOUT test vectors. 2004-04-04 Simon Josefsson * tests/Makefile.am: Add rijndael. 2004-04-04 Simon Josefsson * tests/.cvsignore: [no log message] 2004-04-04 Simon Josefsson * tests/rijndael.c: Remove debugging code. 2004-04-04 Simon Josefsson * tests/rijndael.c: Add, test vectors from -06. 2004-04-04 Simon Josefsson * doc/specifications/draft-raeburn-krb-rijndael-krb-06rc.txt: Add. 2004-03-05 Simon Josefsson * po/.cvsignore: [no log message] 2004-02-29 Simon Josefsson * NEWS: Add. 2004-02-29 Simon Josefsson * THANKS, po/LINGUAS, po/pl.po: Add Polish translation, from Jakub Bogusz . 2004-02-17 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-18.txt, doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-05.txt: Add. 2004-02-16 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-referrals-03.txt: Add. 2004-02-11 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-crypto-07.txt: Add. 2004-02-11 Simon Josefsson * doc/specifications/draft-yu-krb-wg-kerberos-extensions-00.txt: Add. 2004-02-10 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-preauth-framework-00.txt: Add. 2004-02-03 Simon Josefsson * src/shishid.c: Fix multiple -v's. 2004-02-03 Simon Josefsson * src/kdc.c, src/shishi.ggo, src/shishid.ggo: Support multiple -v's. 2004-02-03 Simon Josefsson * src/shishi.c: Support mutliple -v's. 2004-02-03 Simon Josefsson * lib/cfg.c, lib/crypto-des.c, lib/crypto-rc4.c, lib/crypto.c, lib/diskio.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/keys.c, lib/password.c, lib/tkts.c: Typo. 2004-01-25 Simon Josefsson * NEWS: Add. 2004-01-25 Simon Josefsson * lib/encapreppart.c: (shishi_encapreppart): Use random seq-number. 2004-01-25 Simon Josefsson * lib/authenticator.c: Fix. 2004-01-25 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_seqnumber_get): Add. 2004-01-25 Simon Josefsson * lib/shishi.h.in: Add. 2004-01-25 Simon Josefsson * lib/authenticator.c: (shishi_authenticator): Use random seq-number, instead of removing the field. 2004-01-25 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: (shishi_randomize): Use void*. 2004-01-23 Simon Josefsson * doc/fdl.texi, doc/shishi.texi: Use FDL 1.2. 2004-01-22 Simon Josefsson * lib/ap.c, lib/shishi.h.in: Doc fix. 2004-01-22 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-01-22 Simon Josefsson * ChangeLog: [no log message] 2004-01-22 Simon Josefsson * NEWS: Version 0.0.14. 2004-01-22 Simon Josefsson * po/sv.po: Update. 2004-01-22 Simon Josefsson * NEWS: Add. 2004-01-22 Simon Josefsson * Makefile.am: Fix release target. 2004-01-22 Simon Josefsson * po/sv.po: Generated. 2004-01-22 Simon Josefsson * po/.cvsignore: [no log message] 2004-01-22 Simon Josefsson * po/shishi.pot: Remove. 2004-01-22 Simon Josefsson * : Sync. 2004-01-22 Simon Josefsson * lib/shishi.h.in: Fix API. 2004-01-22 Simon Josefsson * lib/ap.c: Fix API. Clone cksum buffers. 2004-01-22 Simon Josefsson * lib/shishi.h.in: Add. 2004-01-22 Simon Josefsson * lib/ap.c: Add raw checksum API. 2004-01-22 Simon Josefsson * lib/ap.c: Doc fix. 2004-01-21 Simon Josefsson * lib/ap.c: (shishi_ap_req_process_keyusage): Extract authenticator checksum data. 2004-01-21 Simon Josefsson * lib/authenticator.c, lib/shishi.h.in: (shishi_authenticator_cksum): Allocate result. 2004-01-15 Simon Josefsson * tests/low-crypto.c: Disable. Reported by Adrian Bunk . 2004-01-15 Simon Josefsson * lib/init.c, src/server.c: Fix warnings. 2004-01-15 Simon Josefsson * lib/internal.h: Don't use //. 2004-01-15 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-01-15 Simon Josefsson * ChangeLog: [no log message] 2004-01-15 Simon Josefsson * NEWS: Version 0.0.13. 2004-01-15 Simon Josefsson * Makefile.am: (release): Use CSS. 2004-01-15 Simon Josefsson * doc/gendocs.sh: Sync upstream. 2004-01-15 Simon Josefsson * Makefile.am: (release): Use binary PGP. Add ftp-upload.gnu.org stuff. Use gendocs.sh. 2004-01-15 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2004-01-15 Simon Josefsson * NEWS: Add. 2004-01-15 Simon Josefsson * db/file.c: (read_key): Handle leading whitespace in key material. (But not for old style keys.) 2004-01-15 Simon Josefsson * NEWS: Add. 2004-01-15 Simon Josefsson * src/shisa.c: Typo. 2004-01-15 Simon Josefsson * src/shisa.c: Fix salt computation for --password. 2004-01-15 Simon Josefsson * NEWS: Add. 2004-01-14 Simon Josefsson * src/shisa.c: (main): Make sure apply_options receive realm/principal. 2004-01-14 Simon Josefsson * src/shishid.c: (kdc_listen): Improve error logic to fix segfault. 2004-01-14 Simon Josefsson * lib/tkt.c: Revert (for now). 2004-01-14 Simon Josefsson * lib/tkt.c: (shishi_tkt_pretty_print): Use const. 2004-01-14 Simon Josefsson * configure.ac, m4/ac_compile_check_sizeof.m4, m4/ax_create_stdint_h.m4: Update AX_CREATE_STDINT_H. 2004-01-10 Simon Josefsson * doc/shishi.texi: Add key=ivec links. 2004-01-10 Simon Josefsson * doc/shishi.texi: Add rlogin security links. 2004-01-10 Simon Josefsson * doc/shishi.texi: Add Key=Ivec text. 2004-01-10 Simon Josefsson * doc/Makefile.am: Dist texinfo.css. 2004-01-10 Simon Josefsson * doc/gendocs.sh, doc/gendocs_template: Sync with Texinfo. 2004-01-10 Simon Josefsson * configure.ac: Remove unused DocBook stuff. 2004-01-10 Simon Josefsson * doc/shishi.texi: Fix title. 2004-01-10 Simon Josefsson * doc/shishi.texi: Change title to include GNU. Fix header. 2004-01-10 Simon Josefsson * doc/Makefile.am, doc/shishi.css, doc/texinfo.css: Rename shishi.css to texinfo.css. 2004-01-10 Simon Josefsson * doc/Makefile.am: Use CSS for HTML. 2004-01-10 Simon Josefsson * doc/shishi.css: Add. 2004-01-10 Simon Josefsson * doc/Makefile.am: Only remove man pages on maintainerclean. Make man pages depend on ../configure.ac, for version number. 2004-01-10 Simon Josefsson * doc/Makefile.am: Fix man page dependencies, reported by Adrian Bunk . 2004-01-03 Simon Josefsson * src/Makefile.am: Assume recent gengetopt. 2004-01-03 Simon Josefsson * doc/shishi.texi: Add. 2004-01-03 Simon Josefsson * doc/shishi.texi: Add. 2004-01-03 Simon Josefsson * doc/specifications/rfc3244.txt: Add. 2004-01-03 Simon Josefsson * src/shishid.c: Don't use closelog. Use syslog in kdc_unlisten. 2004-01-02 Simon Josefsson * NEWS, configure.ac: Bump versions. 2004-01-02 Simon Josefsson * ChangeLog: [no log message] 2004-01-02 Simon Josefsson * NEWS: Version 0.0.12. 2004-01-02 Simon Josefsson * src/kdc.h: Fix TLS. 2004-01-02 Simon Josefsson * tests/Makefile.am: Remove shisa.sh for now. 2004-01-02 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2004-01-02 Simon Josefsson * lib/shishi.h.in: (SHISHI_KRB5_GSSAPI_CKSUM): Add. 2003-12-31 Simon Josefsson * NEWS: Fix. 2003-12-31 Simon Josefsson * doc/shishi.texi: Add TLS resume. 2003-12-31 Simon Josefsson * src/starttls.c: Log fix. 2003-12-31 Simon Josefsson * NEWS, lib/starttls.c, src/Makefile.am, src/kdc.h, src/resume.c, src/shishid.c, src/shishid.ggo, src/starttls.c: Add TLS resume support. 2003-12-30 Simon Josefsson * NEWS: Add. 2003-12-28 Simon Josefsson * src/kdc.c: Fix. 2003-12-28 Simon Josefsson * src/kdc.c: Add. 2003-12-28 Simon Josefsson * lib/enckdcreppart.c, lib/shishi.h.in, lib/tkt.c: Add. 2003-12-28 Simon Josefsson * src/kdc.c: Set flags. 2003-12-28 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in, lib/tgs.c: Add. 2003-12-27 Simon Josefsson * lib/encticketpart.c: Fix flags. 2003-12-27 Simon Josefsson * lib/apreq.c, lib/asn1.c, lib/kdcrep.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c: (shishi_ticket): Add, update callers. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c, src/shishid.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Doc fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * doc/shishi.texi: Add. 2003-12-27 Simon Josefsson * src/kdc.c: Cleanup TGS. 2003-12-27 Simon Josefsson * src/kdc.c: Fix. 2003-12-27 Simon Josefsson * lib/shishi.h.in, lib/tkt.c, lib/tkts.c: (shishi_tkt_server): Fix, and update callers. 2003-12-27 Simon Josefsson * lib/tgs.c, lib/tkt.c, src/kdc.c: Fix. 2003-12-27 Simon Josefsson * lib/ap.c, lib/shishi.h.in, lib/tgs.c, lib/tkt.c: Add. Fix. 2003-12-27 Simon Josefsson * src/kdc.c: Cleanup. 2003-12-27 Simon Josefsson * src/kdc.c, src/kdc.h: Cleanup. 2003-12-27 Simon Josefsson * src/kdc.c: Improve logging for AS-REQ. 2003-12-27 Simon Josefsson * db/err.c, db/file.c, db/shisa.h: Add. 2003-12-27 Simon Josefsson * src/kdc.c: Improve logging and error handling. 2003-12-27 Simon Josefsson * lib/as.c: (shishi_as_krberror_der): Use shishi_krberror_der. 2003-12-27 Simon Josefsson * db/file.c, db/shisa.h, src/shisa.c, src/shisa.ggo: Add priority field to dbkey. 2003-12-26 Simon Josefsson * README-alpha: Fix. 2003-12-26 Simon Josefsson * README-alpha, autogen.sh, configure.ac: Fixes for building from CVS on Fedora. 2003-12-26 Simon Josefsson * NEWS: Fix. 2003-12-26 Simon Josefsson * NEWS: Add. 2003-12-26 Simon Josefsson * doc/shishi.texi: Fix. 2003-12-26 Simon Josefsson * doc/shishi.texi: Fix. 2003-12-26 Simon Josefsson * doc/shishi.texi: Add. 2003-12-26 Simon Josefsson * tests/shisa.sh: Add. 2003-12-26 Simon Josefsson * db/core.c: Doc fixes. 2003-12-26 Simon Josefsson * doc/Makefile.am: Make Shisa gdoc files. 2003-12-26 Simon Josefsson * db/setup.c: Typo. 2003-12-26 Simon Josefsson * db/Makefile.am, db/cfg.c, db/config.c, db/core.c, db/db.c, db/err.c, db/error.c, db/file.c, db/fileutil.c, db/info.h, db/init.c, db/internal.h, db/setup.c: Rename files to work around gdoc limitation. 2003-12-26 Simon Josefsson * db/db.c, db/internal.h: Sync. 2003-12-26 Simon Josefsson * tests/Makefile.am: Dist shisa.sh. 2003-12-26 Simon Josefsson * db/fileutil.h: Add. 2003-12-26 Simon Josefsson * db/core.c, db/db.c, db/file.c, db/internal.h: Indent. 2003-12-26 Simon Josefsson * db/core.c, db/error.c, db/file.h, db/internal.h, db/shisa.h: Fix keys_find and key_remove. 2003-12-26 Simon Josefsson * src/shisa.c: Fix. 2003-12-26 Simon Josefsson * db/file.c: Fix. 2003-12-26 Simon Josefsson * db/file.c: Fix keys_find. Add key_remove. 2003-12-26 Simon Josefsson * src/shisa.c: Use new API. Fixes. 2003-12-26 Simon Josefsson * src/shisa.ggo, tests/Makefile.am, tests/shisa.sh: Add. 2003-12-26 Simon Josefsson * src/kdc.c: Use new API. 2003-12-26 Simon Josefsson * db/Makefile.am, db/core.c, db/db.c, db/file.c, db/file.h, db/internal.h, db/shisa.h: Key API fixes. 2003-12-26 Simon Josefsson * db/cfg.c: Parse db statements. Fail on cfg errors. 2003-12-21 Simon Josefsson * doc/reference/Makefile.am: Add. 2003-12-21 Simon Josefsson * db/cfg.c, db/core.c, db/db.c, db/error.c, db/file.c, db/fileutil.c, db/fileutil.h, db/internal.h, db/shisa.h, lib/authenticator.c, lib/cfg.c, lib/diskio.h, lib/kdc.c, lib/kdcreq.c, lib/libgcrypt.c, lib/principal.c, lib/shishi.h.in, lib/starttls.c, src/kdc.c, src/kdc.h, src/shisa.c, src/shishi.c, src/shishid.c, src/starttls.c, tests/crypto-ctx.c, tests/low-crypto.c: Indent. 2003-12-21 Simon Josefsson * lib/Makefile.am, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/asn1.h, lib/authenticator.c, lib/cfg.c, lib/cfg.h, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/diskio.c, lib/diskio.h, lib/encapreppart.c, lib/gztime.c, lib/init.c, lib/internal.h, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/netio.c, lib/priv.c, lib/realm.c, lib/resolv.c, lib/resolver.h, lib/safe.c, lib/starttls.h, lib/utils.c, lib/utils.h: Separate internal.h somewhat. 2003-12-21 Simon Josefsson * doc/shishi.texi: Add. 2003-12-21 Simon Josefsson * doc/shishi.texi: Use ASCII. 2003-12-21 Simon Josefsson * doc/shishi.texi: Fix. 2003-12-21 Simon Josefsson * configure.ac: We need gnutls 1.0.0 or higher. 2003-12-21 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-12-21 Simon Josefsson * ChangeLog: [no log message] 2003-12-21 Simon Josefsson * NEWS: Version 0.0.11. 2003-12-21 Simon Josefsson * lib/pki.c: Doc fix. 2003-12-21 Simon Josefsson * NEWS: Fix. 2003-12-21 Simon Josefsson * doc/shishi.texi: Fix shishid --help. 2003-12-21 Simon Josefsson * doc/shishi.texi: Add X.509 guide. Fix. 2003-12-21 Simon Josefsson * src/starttls.c: Log client certificate verification status. 2003-12-21 Simon Josefsson * src/starttls.c: Log client certificate details to syslog. 2003-12-21 Simon Josefsson * NEWS: Add. 2003-12-21 Simon Josefsson * lib/Makefile.am, lib/internal.h, lib/pki.c, lib/shishi.h.in, lib/starttls.c, lib/tkts.c: Add pki.c, tracks client certificates in library. Send client certificates in TLS exchange. 2003-12-21 Simon Josefsson * lib/as.c, lib/cfg.c, lib/internal.h, lib/kdc.c, lib/netio.c, lib/shishi.h.in, lib/starttls.c, lib/tgs.c, lib/tkts.c: Add. 2003-12-21 Simon Josefsson * db/file.c, db/fileutil.h, db/internal.h: Fix warnings. 2003-12-21 Simon Josefsson * src/Makefile.am: Dist kdc.h. 2003-12-21 Simon Josefsson * db/cfg.c, db/internal.h, gl/Makefile.am, gl/linebuffer.c, gl/linebuffer.h, lib/cfg.c, lib/internal.h: Replace linebuffer with getline. 2003-12-21 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/memmove.m4, gl/m4/memset.m4, gl/m4/strerror.m4, gl/memmove.c, gl/memset.c, gl/strerror.c: Remove memset, memmove, strerror (we assume C89). 2003-12-21 Simon Josefsson * gl/Makefile.am, gl/m4/memdup.m4, gl/m4/xmemdup.m4, gl/memdup.c, gl/memdup.h, gl/xmemdup.c, gl/xmemdup.h, lib/crypto-ctx.c, lib/crypto.c, lib/internal.h, lib/libgcrypt.c, lib/nettle.c: Replace memdup with xclone. 2003-12-20 Simon Josefsson * src/kdc.h, src/shishid.c, src/shishid.ggo, src/starttls.c: Support X.509 authentication in shishid. 2003-12-20 Simon Josefsson * src/server.c: Add. 2003-12-20 Simon Josefsson * src/Makefile.am, src/kdc.h, src/server.c, src/starttls.c: Move TLS negotiation to starttls.c. 2003-12-20 Simon Josefsson * src/shishid.c: Use program_name for syslog. 2003-12-19 Simon Josefsson * lib/netio.c: Fix. 2003-12-19 Simon Josefsson * src/shisa.c: Fix. 2003-12-19 Simon Josefsson * db/core.c, db/error.c, db/file.c, db/fileutil.c, db/shisa.h, src/kdc.c, src/server.c, src/shisa.c, src/shishid.c, tests/Makefile.am, tests/crypto-ctx.c, tests/low-crypto.c, tests/utils.c: Fix warnings. 2003-12-19 Simon Josefsson * lib/crypto-rc4.c, lib/internal.h, lib/libgcrypt.c, lib/realm.c: Fix warnings. 2003-12-19 Simon Josefsson * NEWS: Add. 2003-12-19 Simon Josefsson * src/server.c, src/shishid.c: Fix. 2003-12-19 Simon Josefsson * lib/starttls.c: Fix return code. 2003-12-19 Simon Josefsson * lib/starttls.c: Cleanup, handle errors better. 2003-12-19 Simon Josefsson * lib/starttls.c: Fix warning. 2003-12-19 Simon Josefsson * lib/init.c, lib/internal.h, lib/starttls.c: Move TLS initialization to init.c. 2003-12-19 Simon Josefsson * lib/keys.c: Fix warnings. 2003-12-19 Simon Josefsson * lib/crypto.c, lib/kdcreq.c, lib/shishi.h.in: Fix prototype. 2003-12-19 Simon Josefsson * lib/shishi.h.in: Fix prototype. 2003-12-18 Simon Josefsson * doc/shishi.texi: STARTTLS fixes. 2003-12-18 Simon Josefsson * src/kdc.c, src/kdc.h, src/shishid.c: Cleanup. 2003-12-18 Simon Josefsson * src/server.c: Fixes. 2003-12-18 Simon Josefsson * src/shishid.c: Remove unused listenspecs. Cleanup. 2003-12-18 Simon Josefsson * src/kdc.c, src/kdc.h, src/server.c, src/shishid.c: Cleanup. 2003-12-18 Simon Josefsson * src/Makefile.am, src/server.c, src/shishid.c: Move session specific KDC functions to server.c. 2003-12-18 Simon Josefsson * src/shishid.c: Cleanups. 2003-12-18 Simon Josefsson * src/shishid.c: Fix. 2003-12-18 Simon Josefsson * src/shishid.c: Fix. 2003-12-18 Simon Josefsson * src/Makefile.am, src/kdc.c, src/shishid.c: Move AS/TGS functionality from shishid.c to kdc.c. 2003-12-18 Simon Josefsson * src/shishid.c: Cleanup. 2003-12-18 Simon Josefsson * src/shishid.c: More of the same. 2003-12-18 Simon Josefsson * doc/shishi.texi: TLS fixes. 2003-12-18 Simon Josefsson * src/shishid.c: Network I/O cleanup. 2003-12-18 Simon Josefsson * src/shishid.c: GNUTLS cleanups. 2003-12-16 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-12-16 Simon Josefsson * Makefile.am: Fix release target. 2003-12-16 Simon Josefsson * ChangeLog: [no log message] 2003-12-16 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-12-16 Simon Josefsson * NEWS: Version 0.0.10. 2003-12-16 Simon Josefsson * lib/ticket.c: Typo. 2003-12-16 Simon Josefsson * NEWS: Add. 2003-12-16 Simon Josefsson * src/shishi.c: Fix. 2003-12-16 Simon Josefsson * NEWS, src/shishi.ggo: Add. 2003-12-16 Simon Josefsson * doc/shishi.texi: Update --help's. 2003-12-16 Simon Josefsson * src/shishi.c: Fix. 2003-12-16 Simon Josefsson * src/shishi.c: Fix. 2003-12-16 Simon Josefsson * doc/.cvsignore: [no log message] 2003-12-16 Simon Josefsson * configure.ac, gl/Makefile.am, gl/argp-ba.c, gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-fmtstream.h, gl/argp-fs-xinl.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c, gl/argp.h, gl/m4/argp.m4, gl/m4/mempcpy.m4, gl/m4/sysexits.m4, gl/mempcpy.c, gl/mempcpy.h, gl/sysexit_.h: Remove argp. 2003-12-16 Simon Josefsson * doc/Makefile.am: Add shishid.1. Fix shishi.1. 2003-12-16 Simon Josefsson * src/shishi.c: Fix. 2003-12-16 Simon Josefsson * src/Makefile.am, src/shishi.c, src/shishi.ggo: Rewrite shishi.c to use gengetopt instead of argp. 2003-12-16 Simon Josefsson * src/.cvsignore: [no log message] 2003-12-16 Simon Josefsson * src/foo.c: Add. 2003-12-16 Simon Josefsson * src/foo.c, src/shishi.c: Move low-level crypto stuff from shishi to foo. 2003-12-16 Simon Josefsson * src/shishid.c: Deinitialize gnutls on quit. 2003-12-16 Simon Josefsson * doc/shishi.texi: Typo. 2003-12-16 Simon Josefsson * doc/shishi.texi: Add DNS SRV. Add TLS shishid. Add TLS for STARTTLS protocol. 2003-12-16 Simon Josefsson * src/shishid.c: Fix GNUTLS server. Use error before listening stage, syslog later. 2003-12-13 Simon Josefsson * lib/ap.c, lib/shishi.h.in: (shishi_ap_etype_tktoptionsdata): Add. 2003-12-13 Simon Josefsson * lib/tkts.c: (act_hint_on_kdcreq): Set hint->etype in KDC-REQ. 2003-12-12 Simon Josefsson * doc/shishi.texi: Fix. 2003-12-12 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-12-12 Simon Josefsson * ChangeLog: [no log message] 2003-12-12 Simon Josefsson * NEWS: Version 0.0.9. 2003-12-12 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-12-12 Simon Josefsson * NEWS: Add. Fix. 2003-12-12 Simon Josefsson * NEWS: Fix. 2003-12-12 Simon Josefsson * doc/shishi.texi: Write shishid manual. Add. Fix. 2003-12-12 Simon Josefsson * lib/cfg.c: Support port numbers in realm-kdc. 2003-12-11 Simon Josefsson * src/shisa.c: Fix etype. 2003-12-11 Simon Josefsson * src/shisa.c: Fix --dump. Fix --keys. 2003-12-11 Simon Josefsson * src/shisa.c, src/shisa.ggo: Change --keys. 2003-12-11 Simon Josefsson * doc/shishi.texi: Add des(3)-none. Fix. 2003-12-11 Simon Josefsson * doc/shishi.texi: Fix crypto discussion. 2003-12-11 Simon Josefsson * doc/shishi.texi: Reference additions. Admin fixes. Add todo items. Use @final to remove black hboxes. 2003-12-11 Simon Josefsson * doc/shishi.texi: Fix. 2003-12-11 Simon Josefsson * db/file.c: Fix. 2003-12-11 Simon Josefsson * Makefile.am: Fix. 2003-12-11 Simon Josefsson * doc/Makefile.am: Only use GTK-DOC when enabled. 2003-12-11 Simon Josefsson * src/shishid.c: Typo. 2003-12-11 Simon Josefsson * src/shisa.c, src/shishid.c: Fix exit codes. 2003-12-11 Simon Josefsson * tests/low-crypto.c: Workaround nettle AES problem. 2003-12-11 Simon Josefsson * NEWS: Add. Fix. 2003-12-11 Simon Josefsson * Makefile.am: Setup realm and host key during installation. 2003-12-11 Simon Josefsson * src/shisa.c: Have sole '-a' initialize a realm. 2003-12-11 Simon Josefsson * src/Makefile.am: Remove. 2003-12-11 Simon Josefsson * NEWS: Add. 2003-12-11 Simon Josefsson * src/shishid.c: Nits. 2003-12-11 Simon Josefsson * src/shishid.c: Fix. 2003-12-11 Simon Josefsson * src/shishid.c: Cleanup. 2003-12-11 Simon Josefsson * lib/encticketpart.c, lib/shishi.h.in, lib/ticket.c: (shishi_encticketpart_crealm, shishi_ticket_server): Add. 2003-12-11 Simon Josefsson * src/shishid.c: TGS-REQ works via Shisa (well). 2003-12-11 Simon Josefsson * lib/encticketpart.c, lib/shishi.h.in: (shishi_encticketpart_client): Add. 2003-12-11 Simon Josefsson * src/shishid.c: AS-REQ via Shisa works (well). 2003-12-11 Simon Josefsson * db/Makefile.am: Need -I for shishi-int.h. 2003-12-11 Simon Josefsson * src/shishid.c: Use asprintf. Send 4 length bytes for TCP. Fix. 2003-12-11 Simon Josefsson * src/shishid.c: Cleanup. 2003-12-11 Simon Josefsson * src/shisa.c: Need string.h. 2003-12-10 Simon Josefsson * db/Makefile.am: Dist internal.h. 2003-12-10 Simon Josefsson * Makefile.am: Dist db/. 2003-12-10 Simon Josefsson * gl/.cvsignore: [no log message] 2003-12-10 Simon Josefsson * src/Makefile.am: Cleanup. 2003-12-10 Simon Josefsson * src/Makefile.am: Gengetopt files are generated by maintainer. Fix. 2003-12-10 Simon Josefsson * configure.ac: Use missing for gengetopt. 2003-12-10 Simon Josefsson * src/.cvsignore, src/Makefile.am, src/gettext.h, src/shishid.c, src/shishid.ggo: Use gengetopt for shishid. Some cleanups. 2003-12-10 Simon Josefsson * src/shisa.c: Use progname. Don't generate key when adding realms. Set realm and principal in keys. 2003-12-10 Simon Josefsson * Makefile.am, configure.ac, gl/.cvsignore, gl/Makefile.am, gl/m4/Makefile.am, gl/progname.c, gl/progname.h, m4/.cvsignore, m4/Makefile.am: Use m4_include stuff in automake 1.8. Add progname gnulib module. Remove m4 Makefile's. 2003-12-10 Simon Josefsson * db/file.c: Fix reading keys. 2003-12-10 Simon Josefsson * db/file.c, db/fileutil.c, db/fileutil.h: Fix adding keys. 2003-12-10 Simon Josefsson * lib/principal.c: (shishi_principal_name): New. 2003-12-10 Simon Josefsson * lib/shishi.h.in: (shishi_asn1_read2_optional): New. (shishi_kdcreq_client, shishi_kdcreq_realm, shishi_kdcreq_server): New. (shishi_principal_name): New. 2003-12-10 Simon Josefsson * lib/kdcreq.c: (shishi_kdcreq_client, shishi_kdcreq_realm, shishi_kdcreq_server): New. 2003-12-10 Simon Josefsson * lib/asn1.c: (shishi_asn1_read2): Support NULL data/datalen. (shishi_asn1_read2): Zero terminate data (but do not include it in datalen). (shishi_asn1_read2_optional): New. 2003-12-10 Simon Josefsson * src/shishid.c: Fix. 2003-12-10 Simon Josefsson * src/shishid.c: Fix. 2003-12-10 Simon Josefsson * src/shishid.c: Fix. 2003-12-10 Simon Josefsson * src/Makefile.am, src/shishid.c: Prepare Shisa-fication of Shishid. 2003-12-10 Simon Josefsson * db/file.c, db/fileutil.c, db/fileutil.h: Escape '/' etc in filenames. 2003-12-10 Simon Josefsson * src/shisa.c: (apply_options): Pass on password. 2003-12-10 Simon Josefsson * doc/specifications/draft-ietf-ftpext-mlst-08.txt: Remove (nothing to do with Kerberos?). 2003-12-10 Simon Josefsson * NEWS: Add. 2003-12-10 Simon Josefsson * NEWS: Fix. 2003-12-10 Simon Josefsson * NEWS: Add. Fix. 2003-12-10 Simon Josefsson * NEWS: Fix. 2003-12-10 Simon Josefsson * NEWS: Add. 2003-12-09 Simon Josefsson * doc/shishi.texi: Add ack. Fix STARTTLS. 2003-12-09 Simon Josefsson * doc/shishi.texi: Fixes after reading it. 2003-12-09 Simon Josefsson * doc/shishi.texi: Rewrite Administration Manual for Shisa. Add Shisa to Reference Manual. 2003-12-09 Simon Josefsson * db/cfg.c: Fix error message. 2003-12-09 Simon Josefsson * src/shisa.c: Typo. 2003-12-09 Simon Josefsson * db/error.c: Typo. 2003-12-09 Simon Josefsson * src/shisa.c: Fix errors. 2003-12-09 Simon Josefsson * db/fileutil.c, db/fileutil.h: Add. 2003-12-09 Simon Josefsson * db/init.c: Fix. 2003-12-09 Simon Josefsson * db/file.c: Really remove files. 2003-12-09 Simon Josefsson * src/shisa.c: (delete_principal): Support --force. 2003-12-09 Simon Josefsson * src/shisa.c: (main): Improve errors. 2003-12-09 Simon Josefsson * db/cfg.c: (shisa_cfg): Make it work. 2003-12-09 Simon Josefsson * shisa.conf.in: Fix. 2003-12-09 Simon Josefsson * shisa.conf.in: Fix. 2003-12-09 Simon Josefsson * Makefile.am, configure.ac, db/Makefile.am, lib/Makefile.am, src/Makefile.am: Make cfg/skel/key/db directories configurable. 2003-12-07 Simon Josefsson * src/shisa.c, src/shisa.ggo: Support password read from stdin (requires gengetopt beta). 2003-12-04 Simon Josefsson * db/Makefile.am, db/core.c, db/db.c, db/file.c, db/fileutil.c, db/fileutil.h, db/internal.h, db/shisa.h, src/shisa.c, src/shisa.ggo: Add/remove principal, including key, now works. 2003-12-02 Simon Josefsson * db/error.c, db/file.c, db/shisa.h, src/shisa.c, src/shisa.ggo: Sync. 2003-12-02 Simon Josefsson * lib/cfg.c, lib/shishi.h.in: (shishi_cfg_clientkdcetype_fast): Add. 2003-12-02 Simon Josefsson * src/Makefile.am, src/shisa.c: Gengetopt fixes. 2003-12-02 Simon Josefsson * src/shisa.ggo: Add. 2003-12-02 Simon Josefsson * lib/version.c, tests/authenticator.c, tests/crypto-ctx.c, tests/crypto.c, tests/gztime.c, tests/low-crypto.c, tests/priv.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Fix license templates. 2003-12-02 Simon Josefsson * README, db/core.c, db/db.c, db/file.c, db/internal.h, db/shisa.h, src/Makefile.am, src/shisa.c: Fix. 2003-12-02 Simon Josefsson * doc/.cvsignore: [no log message] 2003-12-01 Simon Josefsson * doc/Makefile.am: Add shisa.1. 2003-12-01 Simon Josefsson * NEWS: Fix. 2003-12-01 Simon Josefsson * src/shisa.c, src/shisa.ggo: Fix. 2003-12-01 Simon Josefsson * db/core.c, db/db.c, db/file.c, db/fileutil.c, db/internal.h, db/shisa.h, src/Makefile.am, src/shisa.c, src/shisa.ggo: Sync. 2003-12-01 Simon Josefsson * NEWS, db/core.c, db/db.c, db/error.c, db/file.c, db/fileutil.c, db/internal.h, db/shisa.h, src/shisa.c: Fix. 2003-11-30 Simon Josefsson * db/file.c, db/fileutil.c, db/internal.h: Fix. 2003-11-30 Simon Josefsson * Makefile.am, db/Makefile.am: Fix indent target. 2003-11-30 Simon Josefsson * README: Fix. 2003-11-30 Simon Josefsson * README: FIx. 2003-11-30 Simon Josefsson * db/shisa.h: Fix. 2003-11-30 Simon Josefsson * db/Makefile.am, db/file.c, db/fileutil.c: Move file.c utilities into fileutil.c. 2003-11-30 Simon Josefsson * src/shisa.c: Fix. 2003-11-30 Simon Josefsson * configure.ac, gl/Makefile.am, gl/alloca.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp.h, gl/m4/Makefile.am, gl/m4/readlink.m4, gl/m4/size_max.m4, gl/m4/vasnprintf.m4, gl/m4/xreadlink.m4, gl/m4/xsize.m4, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/readlink.c, gl/vasnprintf.c, gl/xmalloc.c, gl/xreadlink.c, gl/xreadlink.h, gl/xsize.h: Gnulib sync. 2003-11-30 Simon Josefsson * db/core.c, db/file.c, db/shisa.h, src/shisa.c, src/shisa.ggo: Add. 2003-11-30 Simon Josefsson * db/Makefile.am, db/init.c: Fix default path, use $localstatedir/shishi (e.g., /usr/local/var/shishi). 2003-11-29 Simon Josefsson * doc/shishi.texi: Add. 2003-11-29 Simon Josefsson * db/core.c, db/error.c, db/file.c, db/shisa.h: Sync. 2003-11-29 Simon Josefsson * NEWS: Add. 2003-11-29 Simon Josefsson * db/file.c: Fix. 2003-11-29 Simon Josefsson * src/shisa.c: Fix error. 2003-11-29 Simon Josefsson * shisa.conf.in: Sync. 2003-11-29 Simon Josefsson * db/Makefile.am, db/core.c, db/db.c, db/error.c, db/file.c, db/internal.h, db/shisa.h, src/Makefile.am, src/shisa.c, src/shisa.ggo: Add. 2003-11-29 Simon Josefsson * db/Makefile.am, db/cfg.c, db/error.c, db/file.c, db/init.c, db/shisa.h, src/shisa.c: Fix. 2003-11-28 Simon Josefsson * db/shisa.h: Fix. 2003-11-28 Simon Josefsson * db/cfg.c, db/internal.h, db/shisa.h: Sync commit. 2003-11-28 Simon Josefsson * src/Makefile.am: Use gengetopt for shisa. 2003-11-28 Simon Josefsson * src/shisa.c: Use gengetopt. 2003-11-28 Simon Josefsson * src/shisa.ggo: Add. 2003-11-28 Simon Josefsson * src/.cvsignore: [no log message] 2003-11-28 Simon Josefsson * db/Makefile.am, db/cfg.c, db/db.c, db/file.c, db/init.c, db/internal.h, db/shisa.h, shisa.conf.in, src/shisa.c: Sync commit. 2003-11-28 Simon Josefsson * NEWS: Add. 2003-11-28 Simon Josefsson * db/Makefile.am, db/cfg.c, db/init.c, db/internal.h, db/shisa.h: Add. 2003-11-28 Simon Josefsson * src/Makefile.am, src/shisa.c: Add shisa database admin tool. 2003-11-28 Simon Josefsson * src/.cvsignore: [no log message] 2003-11-28 Simon Josefsson * shisa.conf.in: Add. 2003-11-28 Simon Josefsson * Makefile.am, configure.ac, db/Makefile.am, db/db.c, db/shisa.h, db/shishi-db.h: Set up database library, it will be called Shisa. 2003-11-28 Simon Josefsson * .cvsignore, db/.cvsignore: [no log message] 2003-11-27 Simon Josefsson * lib/shishi.h.in: Add. 2003-11-27 Simon Josefsson * lib/ap.c: (shishi_ap): Docfix. (shishi_ap_etype): New. (shishi_ap_tktoptions): Use shishi_ap_etype. (shishi_ap_tktoptionsdata): Likewise. (shishi_ap_tktoptionsasn1usage): Likewise. 2003-11-27 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_add_random_subkey_etype): New. (shishi_authenticator_add_random_subkey): Use it. Docfix. 2003-11-27 Simon Josefsson * lib/tkt.c: (shishi_tkt_keytype_fast): New. 2003-11-27 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_add_subkey): Remove unused code. Fix. 2003-11-26 Simon Josefsson * doc/shishi.texi: Add. 2003-11-26 Simon Josefsson * doc/shishi.texi: Mention commercial support. 2003-11-26 Simon Josefsson * NEWS: Add. 2003-11-26 Simon Josefsson * lib/tkts.c: (shishi_tkts_expire): Use shishi_tkt_expired_p. 2003-11-26 Simon Josefsson * lib/shishi.h.in: (shishi_tkt_expired_p): Add. 2003-11-26 Simon Josefsson * lib/tkt.c: (shishi_tkt_expired_p): Add. (shishi_tkt_pretty_print): Separate EXPIRED into NOT YET VALID and EXPIRED. 2003-11-26 Simon Josefsson * Makefile.am: Revert last commit. 2003-11-26 Simon Josefsson * Makefile.am: Add EXTRA_DIST. 2003-11-26 Simon Josefsson * doc/gendocs.sh: Sync with texinfo. 2003-11-26 Simon Josefsson * doc/gendocs_template: Remove DocBook template. 2003-11-26 Simon Josefsson * doc/Makefile.am: Remove DocBook stuff (too unstable). 2003-11-26 Simon Josefsson * doc/.cvsignore, doc/reference/.cvsignore: [no log message] 2003-11-26 Simon Josefsson * doc/reference/Makefile.am, doc/reference/shishi-docs.sgml, doc/reference/shishi-docs.tmpl, doc/reference/shishi.types, doc/reference/tmpl/.cvsignore, doc/reference/tmpl/dummy.sgml: Use my own GTK-DOC Makefile instead of buggy upstream version. 2003-11-26 Simon Josefsson * configure.ac: Disable fortran etc libtool tests. Remove dmalloc stuff. 2003-11-26 Simon Josefsson * ANNOUNCE, Makefile.am, doc/shishi.texi: Move ANNOUNCE text to manual. Don't EXTRA_DIST stuff. 2003-11-26 Simon Josefsson * crypto/README, crypto/README.shishi: Add upstream README as README. 2003-11-26 Simon Josefsson * asn1/defines.h, asn1/mem.h: Upstream sync. 2003-11-24 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-pk-init-17.txt: Add. 2003-11-24 Simon Josefsson * m4/Makefile.am, m4/pkg.m4: Remove pkg.m4 (not used). 2003-11-22 Simon Josefsson * configure.ac: Use AC_CONFIG_HEADERS. Remove pre-C89 junk. 2003-11-22 Simon Josefsson * gl/Makefile.am, gl/alloca.c, gl/getndelim2.c, gl/linebuffer.c, gl/m4/getline.m4, gl/m4/getndelim2.m4, gl/m4/xalloc.m4, gl/stdbool_.h, gl/vasnprintf.c, gl/vasprintf.c, gl/xalloc.h, gl/xmalloc.c: Update. 2003-11-21 Simon Josefsson * configure.ac: Autoupdate fixes. 2003-11-21 Simon Josefsson * db/db.c, db/shishi-db.h: Sync commit (half-finished old work). 2003-11-21 Simon Josefsson * m4/.cvsignore: [no log message] 2003-11-06 Simon Josefsson * doc/shishi.texi: Official telnet encryption type assigned. 2003-11-02 Simon Josefsson * doc/.cvsignore: [no log message] 2003-11-02 Simon Josefsson * doc/Makefile.am: Add DocBook targets. 2003-11-02 Simon Josefsson * Makefile.am, configure.ac, m4/Makefile.am, m4/gtk-doc.m4: Use gtk-doc.m4 for GTK-DOC stuff. Add DocBook checks. 2003-11-02 Simon Josefsson * doc/gendocs.sh, doc/gendocs_template: Sync with libidn. 2003-11-02 Simon Josefsson * doc/gendocs.sh, doc/gendocs_template: Add (from texinfo). 2003-11-01 Simon Josefsson * AUTHORS: Add, from fencepost. 2003-11-01 Simon Josefsson * AUTHORS: New expiry date on PGP key. 2003-11-01 Simon Josefsson * doc/Makefile.gdoci: Rebuild Makefile after modifying Makefile.gdoc. 2003-11-01 Simon Josefsson * doc/Makefile.am: Set GDOC_MAN_EXTRA_ARGS. 2003-11-01 Simon Josefsson * doc/Makefile.gdoci: Add GDOC_TEXI_EXTRA_ARGS, GDOC_MAN_EXTRA_ARGS. 2003-11-01 Simon Josefsson * autogen.sh: Add gdoc bug workaround. 2003-11-01 Simon Josefsson * doc/.cvsignore: [no log message] 2003-11-01 Simon Josefsson * doc/Makefile.am, doc/Makefile.gdoci, doc/shishi.texi: Add gdoc framework. Use it from Makefile.am Update @include paths in manual. 2003-11-01 Simon Josefsson * configure.ac: Don't build doc/man/Makefile (replace by gdoc framework). 2003-11-01 Simon Josefsson * doc/.cvsignore: [no log message] 2003-11-01 Simon Josefsson * doc/man/.cvsignore, doc/man/Makefile.am: Remove (replaced by gdoc framework). 2003-11-01 Simon Josefsson * doc/gdoc: Sync with libidn. 2003-10-28 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-crypto-06.txt: Add. 2003-10-27 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-gssapi-cfx-03.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-02.txt: Add. 2003-10-27 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-01.txt: Add. 2003-10-27 Simon Josefsson * doc/specifications/draft-hartmans-krb-wg-preauth-fw-xx.txt: Add. 2003-10-25 Simon Josefsson * Makefile.am, configure.ac, db/.cvsignore, db/Makefile.am, db/db.c, db/shishi-db.h: Add. 2003-10-25 Simon Josefsson * configure.ac: Fix for recent libtool breakage. 2003-10-25 Simon Josefsson * doc/man/Makefile.am: Generated. (This should be autogenerated instead of put in CVS...) 2003-10-20 Simon Josefsson * tests/.cvsignore: [no log message] 2003-10-20 Simon Josefsson * tests/Makefile.am, tests/low-crypto.c: Add. 2003-10-20 Simon Josefsson * tests/crypto-ctx.c: Fix. 2003-10-20 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c: Fix whitespace. 2003-10-20 Simon Josefsson * crypto/cbc-cts.c: (cbc_cts_decrypt): Fix real bug. 2003-10-20 Simon Josefsson * crypto/cbc-cts.c: (cbc_cts_decrypt): Use last blocksize bytes. (Incorrect?) 2003-10-20 Simon Josefsson * crypto/cbc-cts.c: Fix IV (now it uses last blocksize bytes, same as libgcrypt, but perhaps using the next-to-last block is the correct way?). 2003-10-20 Simon Josefsson * tests/.cvsignore, tests/Makefile.am, tests/crypto-ctx.c: Add. 2003-10-20 Simon Josefsson * lib/crypto.c: (_shishi_simplified_dencrypt): Fix (3)DES-CBC-NONE. 2003-10-20 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/shishi.h.in: Remove minpadsize (not used). Fix DES_CBC_NONE. 2003-10-20 Simon Josefsson * lib/gztime.c: (shishi_time): Better length check. Don't write out of bounds. 2003-10-20 Simon Josefsson * tests/utils.c: Fix. 2003-10-20 Simon Josefsson * lib/libgcrypt.c: (shishi_arcfour): Rewrite to use nettle arcfour, to make IVOUT work. 2003-10-20 Simon Josefsson * lib/crypto-ctx.c: Don't free(NULL). 2003-10-20 Simon Josefsson * lib/key.c, lib/shishi.h.in: (shishi_key_from_value, shishi_key_from_base64): Mark parameter as 'const'. (shishi_key_from_random): Likewise. 2003-10-20 Simon Josefsson * tests/authenticator.c, tests/crypto.c, tests/gztime.c, tests/priv.c, tests/safe.c, tests/ticketset.c, tests/utils.c: Simplify test harness. Indent. 2003-10-19 Simon Josefsson * crypto/cbc-cts.c: (cbc_cts_encrypt): Fix IV, from Nicolas Pouvesle . 2003-10-16 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-10-16 Simon Josefsson * ChangeLog: [no log message] 2003-10-16 Simon Josefsson * NEWS: Version 0.0.8. 2003-10-16 Simon Josefsson * Makefile.am: Fix DIST_SUBDIRS. 2003-10-16 Simon Josefsson * Makefile.am: Only dist examples and extra, don't build them. 2003-10-16 Simon Josefsson * doc/man/Makefile.am: Generated. 2003-10-16 Simon Josefsson * lib/internal.h: Include getline.h. 2003-10-16 Simon Josefsson * configure.ac: Gnulib update. 2003-10-16 Simon Josefsson * gl/Makefile.am, gl/argp-ba.c, gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-fmtstream.h, gl/argp-fs-xinl.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c, gl/argp.h, gl/error.c, gl/error.h, gl/getdate.y, gl/getdomainname.c, gl/getdomainname.h, gl/getline.c, gl/getline.h, gl/getndelim2.c, gl/getndelim2.h, gl/linebuffer.c, gl/m4/Makefile.am, gl/m4/argp.m4, gl/m4/getdomainname.m4, gl/m4/getline.m4, gl/m4/getndelim2.m4, gl/m4/ssize_t.m4, gl/m4/stdbool.m4, gl/m4/xalloc.m4, gl/stdbool_.h, gl/unlocked-io.h, gl/xalloc.h, gl/xgetdomainname.c, gl/xgetdomainname.h, gl/xgethostname.h, gl/xmalloc.c, gl/xstrdup.c: Update. 2003-10-16 Simon Josefsson * lib/authorize.c, lib/error.c: Doc fix. 2003-10-16 Simon Josefsson * NEWS: Add. 2003-10-14 Simon Josefsson * Makefile.am, configure.ac: Use CONDITIONALs instead of @...@ subsitution for SUBDIRS. 2003-10-14 Simon Josefsson * examples/Makefile.am: Remove LIBIDN_LIBS. Fix libtool -l usage. 2003-10-12 Simon Josefsson * : Add. 2003-10-11 Simon Josefsson * lib/shishi.h.in: Add. 2003-10-10 Simon Josefsson * configure.ac: Revert typo. 2003-10-10 Simon Josefsson * configure.ac: Fix so version comment (matches libtool manual). 2003-10-09 Simon Josefsson * lib/Makefile.am: Fix indent target. 2003-10-09 Simon Josefsson * NEWS: Add. 2003-10-09 Simon Josefsson * NEWS: Add. 2003-10-09 Simon Josefsson * lib/password.c: Change KRBprep to SASLprep (the former supposedly deprecated). 2003-10-09 Simon Josefsson * lib/authorize.c, lib/cfg.c, lib/init.c, lib/internal.h, lib/shishi.h.in: Enhance authorization system, from Nicolas Pouvesle . 2003-10-09 Simon Josefsson * .cvsusers: Add. 2003-10-09 Simon Josefsson * doc/specifications/draft-johansson-kerberos-model-00.txt: Official version. 2003-10-09 Simon Josefsson * doc/specifications/draft-johansson-kerberos-model-00.txt: Add. 2003-10-07 Simon Josefsson * configure.ac: Put AC_CHECK_SIZEOF test early; it doesn't use libtool so if any libtool library was added using AC_CHECK_LIB (e.g., libidn) configure aborts due to linker failure (need -L/foo/bar/lib etc). 2003-10-04 Simon Josefsson * m4/Makefile.am, m4/libgcrypt.m4: Add libgcrypt.m4, suggested by Nicolas Pouvesle . 2003-10-03 Simon Josefsson * gl/argp-ba.c, gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-fs-xinl.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c: Sync with my proposed glibc patches. 2003-10-03 Simon Josefsson * doc/shishi.texi: Fix info hierarchy. 2003-10-01 Simon Josefsson * doc/reference/Makefile.am: Generalize clean hook. 2003-09-30 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-gssapi-cfx-02.txt: Add. 2003-09-29 Simon Josefsson * gl/argp-fmtstream.c, gl/argp-help.c: Upstream sync. 2003-09-29 Simon Josefsson * doc/shishi.texi: Cosmetic fixes. 2003-09-29 npo * doc/shishi.texi: Fix. 2003-09-28 Simon Josefsson * lib/kerberos5.asn1: Revert. 2003-09-28 Simon Josefsson * lib/kerberos5.asn1: Revert. 2003-09-28 Simon Josefsson * lib/authorize.c, lib/crypto-ctx.c, lib/crypto-des.c, lib/crypto-rc4.c, lib/crypto.c, lib/error.c, lib/init.c, lib/kdcrep.c, lib/kdcreq.c, lib/kerberos5.asn1, lib/libgcrypt.c, lib/nettle.c, lib/password.c, lib/priv.c, lib/shishi.h.in, lib/tkt.c, lib/tkts.c, src/shishi.c, tests/crypto.c: Indent. 2003-09-28 Simon Josefsson * lib/Makefile.am: Fix indent target. 2003-09-28 Simon Josefsson * lib/shishi.h.in: Add keyusage, from Nicolas Pouvesle . 2003-09-28 npo * doc/shishi.texi: Add. 2003-09-28 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Add. 2003-09-28 Simon Josefsson * doc/man/Makefile.am: Generated. 2003-09-28 Simon Josefsson * lib/Makefile.am, lib/authorize.c, lib/shishi.h.in: (shishi_authorized_p): Add. 2003-09-27 Simon Josefsson * doc/shishi.texi: Add. 2003-09-27 Simon Josefsson * doc/shishi.texi: Add. 2003-09-24 Simon Josefsson * src/shishid.c: Fix. 2003-09-24 Simon Josefsson * src/shishid.c: Fix non-GNUTLS build, from Nicolas Pouvesle . 2003-09-24 Simon Josefsson * lib/crypto-ctx.c: (shishi_crypto): Handle NULL iv, from Nicolas Pouvesle . 2003-09-24 Simon Josefsson * lib/internal.h, lib/realm.c: Use xgetdomainname. 2003-09-24 Simon Josefsson * configure.ac, gl/Makefile.am, gl/getdomainname.c, gl/getdomainname.h, gl/m4/Makefile.am, gl/m4/getdomainname.m4, gl/xgetdomainname.c, gl/xgetdomainname.h: Add getdomainname and xgetdomainname. 2003-09-23 Simon Josefsson * lib/internal.h, lib/keys.c, lib/principal.c, lib/realm.c: Use xgethostname(). 2003-09-23 Simon Josefsson * gl/Makefile.am, gl/xgethostname.c, gl/xgethostname.h: Add xgethostname. 2003-09-23 Simon Josefsson * lib/internal.h: Simplify include mess. 2003-09-23 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Add crypto-ctx. 2003-09-23 Simon Josefsson * doc/man/Makefile.am: Generated. 2003-09-23 Simon Josefsson * lib/crypto-ctx.c: Fix API. Doc fix. 2003-09-23 Simon Josefsson * lib/shishi.h.in: Fix API. 2003-09-23 Simon Josefsson * lib/Makefile.am, lib/crypto-ctx.c, lib/shishi.h.in: Add context encryption API (for repeated encryptions with updated IV). 2003-09-23 Simon Josefsson * lib/internal.h: Fix. 2003-09-23 Simon Josefsson * gl/argp.h: Upstream sync. 2003-09-23 Simon Josefsson * lib/cfg.c: (shishi_cfg_from_file): Replace fgets with readlinebuffer, to support unrestricted line lengths. 2003-09-23 Simon Josefsson * gl/linebuffer.c: Fix bug. 2003-09-23 Simon Josefsson * gl/Makefile.am, gl/linebuffer.c, gl/linebuffer.h, gl/m4/Makefile.am, gl/m4/extensions.m4, gl/m4/memdup.m4, gl/m4/xmemdup.m4: Add. 2003-09-23 Simon Josefsson * src/shishid.c: Cleanup STARTTLS stuff. 2003-09-23 Simon Josefsson * configure.ac: Fix STARTTLS test. 2003-09-23 Simon Josefsson * NEWS, doc/shishi.texi: Add. 2003-09-23 Simon Josefsson * configure.ac, doc/shishi.texi, lib/Makefile.am, lib/internal.h, lib/netio.c, lib/starttls.c, src/shishid.c: Add experimental STARTTLS support. 2003-09-21 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-09-21 Simon Josefsson * ChangeLog: [no log message] 2003-09-21 Simon Josefsson * NEWS: Version 0.0.7. 2003-09-21 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-09-21 Simon Josefsson * NEWS, doc/shishi.texi, lib/crypto.c: Support encryption type name aliases. 2003-09-21 Simon Josefsson * lib/shishi.h.in: (shishi_arcfour): Add. 2003-09-21 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c: API fix. 2003-09-21 Simon Josefsson * lib/libgcrypt.c: API fix. 2003-09-21 Simon Josefsson * lib/crypto-rc4.c, lib/nettle.c: Doc fix. 2003-09-21 Simon Josefsson * lib/crypto-rc4.c, lib/nettle.c: Support ARCFOUR "iv", from Nicolas Pouvesle . 2003-09-20 Simon Josefsson * doc/man/Makefile.am: Generated. 2003-09-20 Simon Josefsson * lib/nettle.c: Doc fix. 2003-09-20 Simon Josefsson * lib/cfg.c, lib/crypto-des.c, lib/crypto-rc4.c, lib/crypto.c, lib/internal.h, src/shishi.c: Add "verbose-crypto-noice" cfg token, and use it where appropriate. 2003-09-20 Simon Josefsson * lib/crypto.c: (_shishi_simplified_dencrypt): Add zero pad for (3)DES ciphers, to make des_checksum work for CRC. 2003-09-20 Simon Josefsson * lib/crypto-des.c, lib/crypto.c, lib/crypto.h: Fix CRC32 checksum, from Nicolas Pouvesle . 2003-09-20 Simon Josefsson * lib/libgcrypt.c: Fix, from Nicolas Pouvesle . 2003-09-20 Simon Josefsson * NEWS: Add. 2003-09-20 Simon Josefsson * lib/crypto-rc4.c, lib/nettle.c: Fix ARCFOUR. 2003-09-19 Simon Josefsson * doc/shishi.texi, lib/crypto-des.c, lib/crypto.c, lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: Fix des-cbc-crc. 2003-09-19 Simon Josefsson * configure.ac: Only require libgcrypt 1.1.43 or later. 2003-09-19 Simon Josefsson * NEWS: Revert. 2003-09-19 Simon Josefsson * ANNOUNCE: Fix. 2003-09-19 Simon Josefsson * NEWS, doc/shishi.texi: ARCFOUR fixes. 2003-09-19 Simon Josefsson * NEWS, configure.ac, lib/crypto-rc4.c: Fix and enable ARCFOUR. 2003-09-19 Simon Josefsson * lib/libgcrypt.c: Fix ARCFOUR. 2003-09-19 Simon Josefsson * lib/crypto.c: Fix AES checksum length, from Nicolas Pouvesle . 2003-09-19 Simon Josefsson * lib/crypto-aes.c: (aes_string_to_key): Use 0x00001000 as default iteration count (sync with -05 draft). From Nicolas Pouvesle . 2003-09-19 Simon Josefsson * configure.ac: Fix. 2003-09-19 Simon Josefsson * lib/libgcrypt.c: (shishi_hmac_sha1): Fix prototype, from Nicolas Pouvesle . 2003-09-19 Simon Josefsson * asn1/int.h, asn1/libtasn1.h: Upstream sync (parses constraints). 2003-09-19 Simon Josefsson * lib/kerberos5.asn1: Sync with draft, now only 3 modifications are made. Requires latest libtasn1. 2003-09-18 Simon Josefsson * lib/crypto-des.c, lib/crypto-rc4.c, lib/crypto.c, lib/kdcreq.c, lib/key.c, lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in, src/shishi.c: (shishi_randomize): Add 'strong' parameter. Fix callers. 2003-09-18 Simon Josefsson * doc/specifications/krbkey00.txt: Add. 2003-09-14 Simon Josefsson * README: Typo. 2003-09-14 Simon Josefsson * doc/shishi.texi: Add. 2003-09-14 Simon Josefsson * configure.ac, gl/Makefile.am, gl/argp.h, gl/error.c, gl/exit.h, gl/exitfail.c, gl/getopt.c, gl/getopt.h, gl/getopt1.c, gl/m4/Makefile.am, gl/m4/error.m4, gl/m4/exitfail.m4, gl/m4/extensions.m4, gl/m4/getopt.m4, gl/m4/mktime.m4, gl/m4/setenv.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/m4/xalloc.m4, gl/malloc.c, gl/memmove.c, gl/memset.c, gl/mktime.c, gl/realloc.c, gl/setenv.c, gl/strchrnul.c, gl/strdup.c, gl/strndup.c, gl/strnlen.c, gl/unsetenv.c, gl/vasnprintf.c, gl/xmalloc.c: Upstream sync. 2003-09-14 Simon Josefsson * tests/crypto.c: Fix API. 2003-09-14 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-09-14 Simon Josefsson * ChangeLog: [no log message] 2003-09-14 Simon Josefsson * NEWS: Version 0.0.6. 2003-09-14 Simon Josefsson * Makefile.am: Don't rebuild doc/man/Makefile.am automatically. 2003-09-14 Simon Josefsson * doc/man/Makefile.am, po/shishi.pot, po/sv.po: Generated. 2003-09-14 Simon Josefsson * NEWS: Fix. 2003-09-14 Simon Josefsson * NEWS: Fix. 2003-09-14 Simon Josefsson * doc/shishi.texi: Fix @cartouche. 2003-09-14 Simon Josefsson * NEWS: Add. 2003-09-14 Simon Josefsson * NEWS: Add. 2003-09-14 Simon Josefsson * NEWS: Add. 2003-09-14 Simon Josefsson * doc/man/Makefile.am: Distclean man pages, for 'distcheck'. 2003-09-14 Simon Josefsson * Makefile.am: Use nettle and minitasn1 for 'distcheck'. 2003-09-14 Simon Josefsson * lib/nettle.c: (shishi_arcfour): Use proper Nettle API. 2003-09-14 Simon Josefsson * lib/nettle.c: (_shishi_crypto_init): Fix prototype, from Nicolas Pouvesle . 2003-09-14 Simon Josefsson * lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h: ARCFOUR additions (unfinished). 2003-09-14 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: Fix ARCFOUR. Doc fixes. 2003-09-13 Simon Josefsson * extra/pam_shishi/Makefile.am: Fix. 2003-09-13 Simon Josefsson * crypto/Makefile.am, crypto/arcfour.c, crypto/arcfour.h: Add. 2003-09-13 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: Add HMAC-MD5. 2003-09-13 Simon Josefsson * src/shishid.c: Cleanup. 2003-09-13 Simon Josefsson * src/shishid.c: Fix. 2003-09-13 Simon Josefsson * lib/asn1.c, lib/shishi.h.in: (shishi_der_msgtype, shishi_asn1_msgtype, shishi_der2asn1): New. 2003-09-13 Simon Josefsson * src/shishid.c: Fix packet parsing and error handling. 2003-09-13 Simon Josefsson * configure.ac: Fix standalone libtasn1. 2003-09-13 Simon Josefsson * configure.ac: Improve libtasn1 test. 2003-09-13 Simon Josefsson * lib/asn1.c: Warn for old libtasn1. 2003-09-13 Simon Josefsson * lib/Makefile.am: Don't always -I../asn1. 2003-09-13 Simon Josefsson * configure.ac: Add LIBTASN1_CFLAGS. 2003-09-13 Simon Josefsson * configure.ac: Fix. 2003-09-13 Simon Josefsson * lib/asn1.c, lib/init.c, lib/internal.h, lib/libgcrypt.c: Fix _shishi_*_init(). 2003-09-13 Simon Josefsson * configure.ac: Don't use pkg-config for libidn. Simplify LIBS. 2003-09-13 Simon Josefsson * lib/Makefile.am: Remove LIBIDN_*. 2003-09-13 Simon Josefsson * src/Makefile.am, tests/Makefile.am: Remove LIBIDN_LIBS. 2003-09-13 Simon Josefsson * configure.ac: Use system's libtasn1 and libgcrypt by default. 2003-09-13 Simon Josefsson * : Add. 2003-09-12 Simon Josefsson * doc/gdoc: Generalize a bit. 2003-09-11 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-hw-auth-03.txt: Add. 2003-09-11 Simon Josefsson * lib/shishi.h.in, lib/tgs.c: (shishi_tgs_rep_build): Add keyusage. 2003-09-11 Simon Josefsson * src/shishid.c: Use proper keyusage for building TGS-REP. 2003-09-11 Simon Josefsson * lib/crypto.c: Fix. 2003-09-11 Simon Josefsson * configure.ac, lib/Makefile.am, src/Makefile.am, tests/Makefile.am: Fix LDADD. 2003-09-11 Simon Josefsson * src/shishid.c: Clear listenspec. 2003-09-11 Simon Josefsson * lib/tkt.c: Fix. 2003-09-11 Simon Josefsson * doc/shishi.texi: Use ISO-8859-1, as UTF-8 is not supported by texinfo. 2003-09-11 Simon Josefsson * src/shishid.c: Support multiple -v's. 2003-09-10 Simon Josefsson * src/shishid.c: Optimize. 2003-09-10 Simon Josefsson * lib/keys.c: Fix crash, from Nicolas Pouvesle . 2003-09-10 Simon Josefsson * doc/shishi.texi: Add. 2003-09-10 Simon Josefsson * lib/kdc.c: Fix. 2003-09-10 Simon Josefsson * ANNOUNCE: Fix. 2003-09-09 Simon Josefsson * lib/init.c: Fix. 2003-09-09 Simon Josefsson * doc/man/Makefile.am: Add. 2003-09-09 Simon Josefsson * lib/init.c: Cleanup. Doc fix. 2003-09-09 Simon Josefsson * lib/shishi.h.in: (shishi_server): Add. 2003-09-09 Simon Josefsson * lib/error.c, lib/init.c, lib/internal.h, lib/shishi.h.in: Log to stderr/syslog/none in shishi_{warn,info}, from Nicolas Pouvesle . 2003-09-09 Simon Josefsson * examples/Makefile.am, src/Makefile.am, tests/Makefile.am: Fix LDADD. 2003-09-09 Simon Josefsson * NEWS: Mention man pages. 2003-09-09 Simon Josefsson * doc/man/.cvsignore: [no log message] 2003-09-09 Simon Josefsson * Makefile.am, doc/Makefile.am, doc/man/Makefile.am: Move shishi.1 to doc/man/. Generate API man pages. 2003-09-09 Simon Josefsson * doc/gdoc: Add -listfunc. 2003-09-09 Simon Josefsson * lib/libgcrypt.c: Doc fix. 2003-09-09 Simon Josefsson * configure.ac: Add doc/man/. 2003-09-09 Simon Josefsson * lib/version.c: Doc fix. 2003-09-09 Simon Josefsson * doc/gdoc: Improve man pages, unfortunately somewhat Shishi specific for the moment. Remove leading SPC in paragraphs. 2003-09-09 Simon Josefsson * lib/tkts.c: Doc fix. 2003-09-09 Simon Josefsson * lib/Makefile.am: Remove gettext.h 2003-09-09 Simon Josefsson * gl/alloca.c, gl/error.c, gl/error.h, gl/exitfail.c, gl/gethostname.c, gl/m4/alloca.m4, gl/m4/argp.m4, gl/m4/error.m4, gl/m4/exitfail.m4, gl/m4/getdate.m4: Upstream sync. 2003-09-08 Simon Josefsson * lib/crypto-rc4.c: Fix. 2003-09-08 Simon Josefsson * lib/crypto-aes.c: Fix. 2003-09-08 Simon Josefsson * lib/crypto-des.c: Doc fix. 2003-09-08 Simon Josefsson * doc/reference/Makefile.am: Fix ignored headers. 2003-09-08 Simon Josefsson * lib/gettext.h: Remove (already in ../gl/). 2003-09-08 Simon Josefsson * tests/crypto.c: Check if algorithm is used before testing it. 2003-09-08 Simon Josefsson * tests/safe.c: Don't assume DES. 2003-09-08 Simon Josefsson * configure.ac: Disable RC4. 2003-09-08 Simon Josefsson * lib/Makefile.am: Fix. 2003-09-08 Simon Josefsson * configure.ac: Add --enable-null, --enable-md, --enable-des, --enable-3des, --enable-aes, and --enable-arcfour. 2003-09-08 Simon Josefsson * lib/Makefile.am: Fix. 2003-09-08 Simon Josefsson * lib/Makefile.am, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-null.c, lib/crypto-rc4.c, lib/crypto.c, lib/crypto.h, lib/internal.h, lib/utils.c: Split up crypto.c somewhat. 2003-09-08 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c: Cleanup debug messages. 2003-09-08 Simon Josefsson * lib/crypto.c: Don't use alloca. 2003-09-08 Simon Josefsson * lib/tkts.c: Doc fix. 2003-09-08 Simon Josefsson * NEWS: Fix. 2003-09-08 Simon Josefsson * lib/tkts.c: Doc fix. 2003-09-08 Simon Josefsson * doc/shishi.texi: Document proxy/forwarded tickets. 2003-09-08 Simon Josefsson * doc/shishi.texi: Sync --help. 2003-09-08 Simon Josefsson * src/shishi.c: Doc fix. 2003-09-08 Simon Josefsson * lib/tkts.c: Fix. 2003-09-08 Simon Josefsson * lib/tkt.c: Fix messages. 2003-09-08 Simon Josefsson * lib/tkts.c: (shishi_tkt_match_p): Compare tktflags. (shishi_tkts_get_tgt, shishi_tkts_get_tgs): Add. (shishi_tkts_get): Use them. 2003-09-08 Simon Josefsson * src/shishi.c: Add --proxy, --forwardable, and --forwarded. 2003-09-08 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-08 Simon Josefsson * tests/Makefile.am: Disable building tests unconditionally. 2003-09-08 Simon Josefsson * lib/asn1.c: (shishi_asn1_write_bitstring): Fix. 2003-09-08 Simon Josefsson * lib/asn1.c, lib/kdcreq.c, lib/shishi.h.in: Fix. 2003-09-08 Simon Josefsson * lib/asn1.c: Fix bitstrings. 2003-09-08 Simon Josefsson * lib/kdc.c: Fix debug messages. 2003-09-08 Simon Josefsson * doc/shishi.texi, lib/tkts.c, src/shishi.c: Fix. 2003-09-08 Simon Josefsson * NEWS, doc/shishi.texi: Add. 2003-09-08 Simon Josefsson * src/shishi.c: Support getting proxiable tickets. Fix renewable API. 2003-09-08 Simon Josefsson * lib/shishi.h.in: Add proxiable hint flag. Replace renewable hint field with renewable hint flag. 2003-09-08 Simon Josefsson * lib/tkts.c: Support proxiable tickets. Use flags for renewable ticket instead of field in hints struct. 2003-09-08 Simon Josefsson * gl/time_r.c: Upstream sync. 2003-09-07 Simon Josefsson * lib/libgcrypt.c: Fix. (Tested with 1.1.44-cvs.) 2003-09-07 Simon Josefsson * lib/kdcreq.c: Fix API. 2003-09-07 Simon Josefsson * lib/password.c, lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * lib/as.c: Fix API. 2003-09-07 Simon Josefsson * lib/asn1.c: Doc fix. Cleanup. 2003-09-07 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * lib/init.c, lib/internal.h: Fix. 2003-09-07 Simon Josefsson * lib/kdcreq.c: Typo. 2003-09-07 Simon Josefsson * lib/kdcreq.c: Doc fix. 2003-09-07 Simon Josefsson * lib/tkt.c: Doc fix. Cleanup. 2003-09-07 Simon Josefsson * lib/shishi.h.in, lib/tkts.c, src/shishi.c: Fix API. 2003-09-07 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Add nettle. 2003-09-07 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c: Doc fix. 2003-09-07 Simon Josefsson * lib/libgcrypt.c, lib/nettle.c: Doc fix. 2003-09-07 Simon Josefsson * lib/crypto-des.c, lib/crypto-md.c, lib/crypto-rc4.c, lib/crypto.c, lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * lib/crypto.c, lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * lib/init.c, lib/internal.h, lib/libgcrypt.c, lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * lib/crypto-des.c, lib/crypto.c: Add md4 verify. Cleanup. 2003-09-07 Simon Josefsson * configure.ac, lib/Makefile.am, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-rc4.c, lib/crypto.c, lib/kdcrep.c, lib/libgcrypt.c, lib/nettle.c, lib/pkcs5.c, lib/shishi.h.in, tests/crypto.c: Move low-level crypto interface to nettle.c or libgcrypt.c. Fix APIs and update callers. 2003-09-07 Simon Josefsson * doc/shishi.texi, gl/memdup.c, gl/memdup.h, gl/xmemdup.c, gl/xmemdup.h, lib/crypto-md.c: Fix. 2003-09-07 Simon Josefsson * lib/Makefile.am, lib/crypto.c, lib/init.c, lib/libgcrypt.c, lib/nettle.c, lib/shishi.h.in: Isolate crypto library (unfinished). 2003-09-07 Simon Josefsson * doc/shishi.texi: Don't use () when talking about functions. 2003-09-07 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-07 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-09-06 Simon Josefsson * ChangeLog: [no log message] 2003-09-06 Simon Josefsson * doc/draft-ietf-krb-wg-gssapi-cfx-01.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-01.txt: Move. 2003-09-06 Simon Josefsson * NEWS: Version 0.0.5. 2003-09-06 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/Makefile.am, gl/m4/mktime.m4, gl/m4/restrict.m4, gl/m4/time_r.m4, gl/m4/timegm.m4, gl/mktime.c, gl/time_r.c, gl/time_r.h, gl/timegm.c, gl/timegm.h: Sync upstream. 2003-09-06 Simon Josefsson * lib/internal.h, src/shishid.c: Fix. 2003-09-06 Simon Josefsson * lib/internal.h: Include gnulib headers. 2003-09-06 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-09-06 Simon Josefsson * doc/shishi.texi: Include PRIV stuff. 2003-09-06 Simon Josefsson * doc/Makefile.am: Add PRIV. 2003-09-06 Simon Josefsson * NEWS: Mention PRIV. 2003-09-06 Simon Josefsson * examples/.cvsignore, tests/.cvsignore: [no log message] 2003-09-06 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-06 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/internal.h: Add PRIV stuff. 2003-09-06 Simon Josefsson * tests/Makefile.am, tests/priv.c: Add PRIV self test. 2003-09-06 Simon Josefsson * examples/Makefile.am, examples/client-priv.c: Add PRIV example. 2003-09-06 Simon Josefsson * lib/priv.c: Fix. 2003-09-06 Simon Josefsson * lib/Makefile.am, lib/priv.c, lib/shishi.h.in: Add PRIV stuff. 2003-09-06 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcreq.c, lib/key.c, lib/krberror.c, lib/netio.c, lib/realm.c, lib/resolv.c, lib/safe.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tkts.c, lib/utils.c, src/shishi.c, tests/crypto.c, tests/safe.c: Indent. 2003-09-06 Simon Josefsson * NEWS: Add. 2003-09-06 Simon Josefsson * lib/crypto-md.c, lib/kdc.c: Fix. 2003-09-06 Simon Josefsson * NEWS, examples/server.c, lib/crypto-des.c, lib/crypto-md.c: Fix. 2003-09-06 Simon Josefsson * src/shishid.c: Fix. 2003-09-06 Simon Josefsson * tests/ticketset.c: Fix. 2003-09-06 Simon Josefsson * gl/timegm.c: Don't crash. 2003-09-06 Simon Josefsson * lib/crypto.c: Fix. 2003-09-06 Simon Josefsson * NEWS: Add. 2003-09-06 Simon Josefsson * lib/encapreppart.c: Doc fix. 2003-09-06 Simon Josefsson * tests/safe.c: Fix. 2003-09-06 Simon Josefsson * lib/asn1.c, lib/kdc.c, lib/kdcreq.c, lib/principal.c, lib/tkt.c: Use size_t for length variables. 2003-09-06 Simon Josefsson * lib/shishi.h.in: Fix API. 2003-09-06 Simon Josefsson * lib/aprep.c, tests/authenticator.c: Use new API. 2003-09-06 Simon Josefsson * lib/authenticator.c, lib/encapreppart.c, lib/krberror.c: Use shishi_time. 2003-09-06 Simon Josefsson * lib/gztime.c: Add. 2003-09-06 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/encticketpart.c, lib/shishi.h.in: Use size_t for length variables. 2003-09-06 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-09-06 Simon Josefsson * lib/authenticator.c, lib/crypto.c, lib/kdcrep.c, lib/kdcreq.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c: Use size_t for length variables. 2003-09-06 Simon Josefsson * examples/server.c, lib/authenticator.c, lib/keys.c, lib/tkt.c: Fix API. 2003-09-06 Simon Josefsson * lib/Makefile.am: Dist crypto-{md,rc4}.c. 2003-09-06 Simon Josefsson * lib/safe.c, lib/shishi.h.in: Fix prototypes. 2003-09-06 Simon Josefsson * tests/.cvsignore: [no log message] 2003-09-06 Simon Josefsson * tests/Makefile.am: Add ticketset. 2003-09-06 Simon Josefsson * tests/ticketset.c: Replace die() with fail(). Init n to size of buffer, for shishi_a2d. 2003-09-06 Simon Josefsson * tests/Makefile.am, tests/safe.c: Test SAFE stuff. 2003-09-06 Simon Josefsson * asn1/Makefile.am: Fix copying conditions. 2003-09-06 Simon Josefsson * gl/Makefile.am: Dist README. 2003-09-06 Simon Josefsson * crypto/Makefile.am: Dist README. Fix copying conditions. 2003-09-06 Simon Josefsson * gl/getdate.y, gl/timegm.c, gl/timegm.h: Upstream sync. 2003-09-06 Simon Josefsson * gl/Makefile.am: Fix comments. 2003-09-06 Simon Josefsson * gl/README: Add. 2003-09-06 Simon Josefsson * crypto/aes-internal.h, crypto/aes.h, crypto/cbc.h, crypto/des.h, crypto/desCode.h, crypto/hmac.h, crypto/md4-meta.c, crypto/md4.c, crypto/md4.h, crypto/md5.c, crypto/md5.h, crypto/nettle-meta.h, crypto/sha.h: Upstream sync. 2003-09-06 Simon Josefsson * crypto/README: Add. 2003-09-06 Simon Josefsson * asn1/README: Rewrite. 2003-09-06 Simon Josefsson * asn1/ASN1.c: Unused. 2003-09-06 Simon Josefsson * extra/pam_shishi/pam_shishi.c, lib/ap.c, lib/aprep.c, lib/as.c, lib/diskio.c, lib/enckdcreppart.c, lib/error.c, lib/kdc.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/tkt.c, lib/tkts.c, src/shishi.c, tests/crypto.c: Fix error API. 2003-09-06 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-06 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-md.c, lib/crypto-rc4.c, lib/crypto.c: Fix prototypes. 2003-09-06 Simon Josefsson * lib/crypto-3des.c: Fix API. 2003-09-06 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-06 Simon Josefsson * lib/shishi.h.in: (Shishi_krberror): Renamed to Shishi_krb_error to avoid GTK-DOC mixup with shishi_krberror(). 2003-09-06 Simon Josefsson * doc/shishi.texi, lib/error.c: Fix. 2003-09-06 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-06 Simon Josefsson * lib/error.c, lib/init.c: (shishi_info, shishi_warn): Move to error.c, for better documentation. 2003-09-06 Simon Josefsson * doc/Makefile.am: Fix done.c. 2003-09-06 Simon Josefsson * lib/Makefile.am, lib/done.c, lib/init.c: (shishi_done): Move to init.c, remove done.c. (Improves generated documentation.) 2003-09-06 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto.c, src/shishid.c, tests/authenticator.c, tests/crypto.c: Fix API. 2003-09-06 Simon Josefsson * lib/ap.c, lib/as.c, lib/asn1.c, lib/key.c, lib/safe.c, lib/shishi.h.in, lib/tgs.c: Add or fix shishi_*_done. 2003-09-06 Simon Josefsson * examples/.cvsignore: [no log message] 2003-09-05 Simon Josefsson * lib/ap.c: Doc fix, from Nicolas Pouvesle . 2003-09-05 Simon Josefsson * ANNOUNCE: Fix. 2003-09-04 Simon Josefsson * examples/client.c: Remove safe stuff. 2003-09-04 Simon Josefsson * examples/Makefile.am, examples/client-safe.c: Add. 2003-09-04 Simon Josefsson * examples/client.c: Fix. 2003-09-03 Simon Josefsson * examples/client.c, examples/server.c: Fix SAFE. 2003-09-03 Simon Josefsson * lib/crypto-des.c, lib/crypto.c, lib/shishi.h.in: Add des_md5_verify (assumes nettle). 2003-09-03 Simon Josefsson * lib/safe.c: (shishi_safe_verify): Use shishi_verify. 2003-09-03 Simon Josefsson * lib/crypto.c, lib/shishi.h.in: Fix checksum. Add verify. 2003-09-03 Simon Josefsson * lib/ap.c: Add. 2003-09-03 Simon Josefsson * lib/kdc.c: Fix KDC bug workaround. 2003-09-03 Simon Josefsson * lib/shishi.h.in: Add. 2003-09-03 Simon Josefsson * lib/crypto-rc4.c: Unfinished. 2003-09-03 Simon Josefsson * lib/ap.c: Doc fix. 2003-09-03 Simon Josefsson * lib/crypto.c: Support draft-brezak-win2k-krb-rc4-hmac-04.txt. 2003-09-03 Simon Josefsson * tests/crypto.c: Add RC4 str2key test. 2003-09-03 Simon Josefsson * lib/crypto.c: Don't hardcode etypes. 2003-09-03 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-03 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-03 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-03 Simon Josefsson * doc/shishi.texi: Add etype/cksumtype discussion. 2003-09-03 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-03 Simon Josefsson * lib/ap.c: Doc fix. 2003-09-03 Simon Josefsson * lib/crypto-md.c: Fix header. 2003-09-03 Simon Josefsson * lib/ap.c, lib/shishi.h.in: (shishi_ap_authenticator_cksumtype): Fix prototype. Fix callers. 2003-09-03 Simon Josefsson * lib/authenticator.c: Fix. 2003-09-03 Simon Josefsson * lib/authenticator.c: (shishi_authenticator_add_cksum): Use shishi_authenticator_add_cksum_type. 2003-09-03 Simon Josefsson * extra/rsh-redone/rlogin.c, extra/rsh-redone/rsh.c: Fix, from Nicolas Pouvesle . 2003-09-03 Simon Josefsson * lib/ap.c, lib/authenticator.c, lib/crypto-md.c, lib/crypto.c, lib/shishi.h.in: Add md4/md5 cksum. Support non-default checksum type in authenticator/AP. From Nicolas Pouvesle . 2003-09-03 Simon Josefsson * lib/shishi.h.in: Comment fix. 2003-09-02 Simon Josefsson * lib/shishi.h.in: Doc fix. 2003-09-02 Simon Josefsson * doc/draft-ietf-krb-wg-gssapi-cfx-01.txt: Add. 2003-09-02 Simon Josefsson * lib/crypto.c: Debug output fix, from Nicolas Pouvesle . 2003-09-02 Simon Josefsson * lib/ap.c: Doc fix, from Nicolas Pouvesle . 2003-09-01 Simon Josefsson * gl/timegm.c: Fix gmtime_r. 2003-09-01 Simon Josefsson * gl/m4/timegm.m4: Fix. 2003-09-01 Simon Josefsson * gl/timegm.c: New. 2003-09-01 Simon Josefsson * gl/m4/timegm.m4: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-09-01 Simon Josefsson * doc/shishi.texi: Add download&install. Add autoconf tests. 2003-09-01 Simon Josefsson * doc/shishi.texi: Add hacking section. 2003-09-01 Simon Josefsson * gl/memdup.c, gl/xmemdup.c: Fix. 2003-09-01 Simon Josefsson * lib/hostkeys.c, lib/principal.c, lib/realm.c, lib/tkts.c: Use xstrdup. 2003-09-01 Simon Josefsson * lib/tgs.c: Typo. 2003-09-01 Simon Josefsson * lib/cfg.c: Use xrealloc, xstrdup. 2003-09-01 Simon Josefsson * lib/safe.c, lib/tgs.c: Use xcalloc. 2003-09-01 Simon Josefsson * lib/key.c: Doc fix. 2003-09-01 Simon Josefsson * lib/crypto-3des.c, lib/crypto-des.c, lib/ticket.c, lib/tkt.c, lib/tkts.c: Use xmalloc. 2003-09-01 Simon Josefsson * lib/key.c: Use xstrdup. 2003-09-01 Simon Josefsson * lib/as.c, lib/asn1.c, lib/crypto.c, lib/enckdcreppart.c, lib/init.c: Use xmalloc. 2003-09-01 Simon Josefsson * lib/ap.c, lib/key.c, lib/tkt.c: Use xcalloc. 2003-09-01 Simon Josefsson * lib/shishi.h.in: Revert. 2003-09-01 Simon Josefsson * lib/internal.h, lib/shishi.h.in: Add. 2003-09-01 Simon Josefsson * lib/cfg.c: Remove kdc. Add server-realm (unfinished). 2003-09-01 Simon Josefsson * lib/crypto.c, lib/internal.h: Use memdup. 2003-09-01 Simon Josefsson * gl/Makefile.am, gl/memdup.c, gl/memdup.h, gl/xmemdup.c, gl/xmemdup.h: Add. 2003-09-01 Simon Josefsson * lib/shishi.h.in: Fix. 2003-09-01 Simon Josefsson * lib/shishi.h.in: Fix AES cksumtype, from Nicolas Pouvesle . 2003-08-31 Simon Josefsson * extra/inetutils.diff: Update. 2003-08-31 Simon Josefsson * README-alpha: Fix. 2003-08-31 Simon Josefsson * lib/netio.c: Fix crash. 2003-08-31 Simon Josefsson * ANNOUNCE: Fix. 2003-08-31 Simon Josefsson * NEWS: Add. 2003-08-31 Simon Josefsson * lib/realm.c: Doc fix. 2003-08-31 Simon Josefsson * lib/realm.c, lib/shishi.h.in: Support host->realm mapping via DNS. 2003-08-31 Simon Josefsson * lib/resolv.c: Zero terminate TXT's. 2003-08-31 Simon Josefsson * lib/resolv.c: Support TXT. Fix memory allocation. 2003-08-31 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-08-31 Simon Josefsson * doc/shishi.texi: Fix markup. 2003-08-31 Simon Josefsson * doc/shishi.texi, shishi.conf.in, shishi.skel.in: Fix. 2003-08-31 Simon Josefsson * doc/shishi.texi: Add reference manual. 2003-08-31 Simon Josefsson * ChangeLog: [no log message] 2003-08-31 Simon Josefsson * NEWS: Version 0.0.4. 2003-08-31 Simon Josefsson * NEWS: Fix. 2003-08-31 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-08-31 Simon Josefsson * configure.ac, gl/Makefile.am, gl/m4/Makefile.am, gl/m4/timegm.m4, gl/timegm.c, gl/timegm.h, lib/gztime.c: Move timegm() to gnulib. 2003-08-30 Simon Josefsson * ANNOUNCE, README, lib/principal.c: Fix. 2003-08-30 Simon Josefsson * lib/principal.c: Fix. 2003-08-30 Simon Josefsson * lib/principal.c: Fix. 2003-08-30 Simon Josefsson * Makefile.am: Don't build examples by default. 2003-08-30 Simon Josefsson * configure.ac: Cleanup header checks. 2003-08-30 Simon Josefsson * lib/internal.h: Reorder #include's. 2003-08-30 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-08-30 Simon Josefsson * extra/rsh-redone/Makefile.am: Dist man pages. 2003-08-30 Simon Josefsson * Makefile.am: Has to 'make extra' to make in extra/. 2003-08-30 Simon Josefsson * m4/Makefile.am: Fix. 2003-08-30 Simon Josefsson * lib/cfg.c: Fix. 2003-08-30 Simon Josefsson * lib/netio.c: Fix. 2003-08-30 Simon Josefsson * lib/netio.c: Fix. 2003-08-30 Simon Josefsson * lib/netio.c: Add unfinished TLS support. 2003-08-30 Simon Josefsson * configure.ac: Don't include gnutls by default. 2003-08-30 Simon Josefsson * lib/Makefile.am: Add gnutls flags. 2003-08-30 Simon Josefsson * src/shishid.c: Fix TCP. 2003-08-30 Simon Josefsson * configure.ac: Check for gnutls. 2003-08-30 Simon Josefsson * lib/shishi.h.in, m4/libgnutls.m4: Add. 2003-08-30 Simon Josefsson * lib/netio.c: TCP support. 2003-08-30 Simon Josefsson * lib/internal.h: Fix. 2003-08-30 Simon Josefsson * lib/cfg.c: Support ADDRESS/PROTOCOL in realm-kdc. 2003-08-30 Simon Josefsson * lib/cfg.c, lib/internal.h: Add. 2003-08-30 Simon Josefsson * lib/ap.c: Doc fix. 2003-08-30 Simon Josefsson * lib/cfg.c, lib/internal.h: Fix. 2003-08-30 Simon Josefsson * extra/rsh-redone/rsh.c: Revert bogus patch. 2003-08-30 Simon Josefsson * extra/rsh-redone/Makefile: Remove, replaced by automake Makefile.am. 2003-08-30 Simon Josefsson * extra/rsh-redone/.cvsignore: [no log message] 2003-08-30 Simon Josefsson * extra/rsh-redone/Makefile.am: Add. 2003-08-30 Simon Josefsson * configure.ac, extra/Makefile.am: Add extra/rsh-redone. 2003-08-30 Simon Josefsson * NEWS: Mention rsh. 2003-08-30 Simon Josefsson * extra/rsh-redone/rlogin.c, extra/rsh-redone/rsh.c: Make '-xs' work. 2003-08-30 Simon Josefsson * extra/rsh-redone/rlogin.c, extra/rsh-redone/rsh.c: Shishi port. 2003-08-30 Simon Josefsson * extra/README, extra/rsh-redone/Makefile, extra/rsh-redone/pam/rexec, extra/rsh-redone/pam/rlogin, extra/rsh-redone/pam/rsh, extra/rsh-redone/rcp.1, extra/rsh-redone/rcp.c, extra/rsh-redone/rhosts.5, extra/rsh-redone/rlogin.1, extra/rsh-redone/rlogin.c, extra/rsh-redone/rlogind.8, extra/rsh-redone/rlogind.c, extra/rsh-redone/rsh.1, extra/rsh-redone/rsh.c, extra/rsh-redone/rshd.8, extra/rsh-redone/rshd.c: Add rsh-redone, upstream. 2003-08-30 Simon Josefsson * lib/crypto.c: Doc fix. 2003-08-30 Simon Josefsson * lib/crypto.c: Doc fix. From Nicolas Pouvesle . 2003-08-30 Simon Josefsson * doc/specifications/draft-ietf-cat-gssv2-08.txt, doc/specifications/draft-ietf-cat-gssv2-cbind-04.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-00.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-01.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-02.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-03.txt, doc/specifications/draft-ietf-krb-wg-gss-crypto-00.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-00.txt, doc/specifications/draft-raeburn-cat-gssapi-krb5-3des-00.txt, doc/specifications/draft-raeburn-krb-gssapi-krb5-3des-01.txt: Removed. (Moved to GSSLib.) 2003-08-29 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-gssapi-cfx-00.txt: Official version. 2003-08-29 Simon Josefsson * lib/ap.c, lib/shishi.h.in: Add. 2003-08-29 Simon Josefsson * NEWS: Fix. 2003-08-29 Simon Josefsson * NEWS: Add. 2003-08-29 Simon Josefsson * lib/crypto.c, lib/shishi.h.in: Fix shishi_decrypt_ivupdate, from Nicolas Pouvesle . 2003-08-28 Simon Josefsson * src/shishi.c: Fix. 2003-08-28 Simon Josefsson * src/shishi.c: Fix --help. 2003-08-28 Simon Josefsson * src/shishi.c: Remove things from --help. 2003-08-28 Simon Josefsson * gl/base64.c: Fix warnings. 2003-08-28 Simon Josefsson * lib/ap.c: Fix. 2003-08-28 Simon Josefsson * src/shishi.c, src/shishid.c: Fix warnings. Indent. 2003-08-28 Simon Josefsson * lib/kdcreq.c, lib/resolv.c: Fix warnings. 2003-08-28 Simon Josefsson * lib/cfg.c: Fix warnings. 2003-08-28 Simon Josefsson * lib/kdc.c: Fix. 2003-08-28 Simon Josefsson * lib/kdc.c: Fix last commit. 2003-08-28 Simon Josefsson * lib/kdc.c: Fall back to session key instead of sub-session key for decrypting KDC-REP in TGS, but warn about buggy KDC. 2003-08-28 Simon Josefsson * lib/ap.c: Fix. 2003-08-28 Simon Josefsson * lib/kdc.c: Use subkey in TGS. 2003-08-28 Simon Josefsson * lib/kdc.c: Temporary fix to make TGS work against MIT/Heimdal KDC. 2003-08-28 Simon Josefsson * lib/shishi.h.in: Add. Fix. 2003-08-28 Simon Josefsson * lib/kdc.c: Use authenticator from parameter, don't decrypt AP-REQ. 2003-08-28 Simon Josefsson * lib/ap.c: Remove session key junk, not relevant. 2003-08-28 Simon Josefsson * lib/tgs.c: Hand authenticator over to shishi_tgs_process. 2003-08-28 Simon Josefsson * lib/kdc.c: Disable subkey usage for now, doesn't seem to work with MIT/Heimdal KDC. 2003-08-28 Simon Josefsson * lib/ap.c: Set APOption for session key too. 2003-08-28 Simon Josefsson * lib/apreq.c: Add. Doc fix. 2003-08-28 Simon Josefsson * src/shishi.c: Fix error. 2003-08-28 Simon Josefsson * lib/krberror.c: Fix crash. 2003-08-28 Simon Josefsson * lib/krberror.c: Fix. 2003-08-28 Simon Josefsson * lib/authenticator.c: Fix shishi_authenticator_add_subkey. 2003-08-28 Simon Josefsson * lib/safe.c: Use allocating API. 2003-08-28 Simon Josefsson * lib/diskio.c, lib/tkt.c: Fix. 2003-08-28 Simon Josefsson * lib/shishi.h.in: Add. Fix. 2003-08-28 Simon Josefsson * lib/kdcreq.c, lib/krberror.c: Doc fix. 2003-08-28 Simon Josefsson * lib/principal.c: Add FIXMEs. 2003-08-28 Simon Josefsson * lib/kdc.c: Cleanup subkey. 2003-08-28 Simon Josefsson * lib/asn1.c, lib/krberror.c, lib/shishi.h.in: Add krberror_build. Add various krberror retrieval functions. Add new NO_VALUE asn.1 error. Improve krberror pretty print. 2003-08-28 Simon Josefsson * src/shishid.c: Simplify krberror. Cleanup subkey. 2003-08-28 Simon Josefsson * tests/authenticator.c: Typo. 2003-08-28 Simon Josefsson * tests/authenticator.c: Remove subkey (so memcmp() against static strings work). 2003-08-28 Simon Josefsson * NEWS: Mention subkeys. 2003-08-28 Simon Josefsson * doc/shishi.texi: We support subkeys now. 2003-08-28 Simon Josefsson * lib/ap.c, lib/authenticator.c: Cleanup. 2003-08-28 Simon Josefsson * lib/ap.c, lib/authenticator.c, lib/kdc.c, lib/shishi.h.in, src/shishid.c: Support for subkeys in Authenticators, from Nicolas Pouvesle . 2003-08-27 Simon Josefsson * lib/internal.h, lib/shishi.h.in: Fix utils.c stuff. 2003-08-27 Simon Josefsson * examples/client-cksum.c, examples/client.c: Fix. 2003-08-27 Simon Josefsson * NEWS, doc/shishi.texi: Fix. 2003-08-27 Simon Josefsson * lib/ap.c, lib/shishi.h.in, src/shishid.c: Support keyusage for AP-REQ decryption. 2003-08-27 Simon Josefsson * lib/kdcreq.c, lib/tgs.c, src/shishid.c: Remove debug code. 2003-08-27 Simon Josefsson * src/shishid.c: Cleanup. 2003-08-27 Simon Josefsson * src/shishid.c: TGS works. 2003-08-27 Simon Josefsson * src/shishid.c: TGS works (with some hard coded strings). 2003-08-27 Simon Josefsson * src/shishid.c: Use new API. 2003-08-27 Simon Josefsson * lib/shishi.h.in: Add. 2003-08-27 Simon Josefsson * src/shishi.c: New server parameter. 2003-08-27 Simon Josefsson * tests/ticketset.c: Use new base64 API. 2003-08-27 Simon Josefsson * examples/.cvsignore: [no log message] 2003-08-27 Simon Josefsson * gl/Makefile.am, gl/base64.c, gl/base64.h, lib/Makefile.am, lib/base64.c, lib/diskio.c, lib/internal.h, lib/key.c, lib/shishi.h.in: Move base64 from lib/ to gl/, and updated callers. 2003-08-27 Simon Josefsson * Makefile.am, configure.ac, examples/Makefile.am, examples/client-cksum.c, examples/client.c, examples/server.c, src/Makefile.am, src/client-cksum.c, src/client.c, src/server.c: Move examples from src/ into examples/ 2003-08-27 Simon Josefsson * lib/safe.c, lib/shishi.h.in, lib/ticket.c: Fix APIs to allocate output. 2003-08-27 Simon Josefsson * lib/error.c: Typo. 2003-08-27 Simon Josefsson * lib/error.c: Use table driven approach. 2003-08-27 Simon Josefsson * lib/ap.c, lib/as.c, lib/asn1.c, lib/diskio.c, lib/internal.h, lib/safe.c, lib/shishi.h.in, lib/tgs.c: Fix APIs to allocate output. 2003-08-27 Simon Josefsson * src/shishid.c: Fix AS key. Add non-working TGS stuff. 2003-08-27 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Add shishi_kdcreq_get_padata*. 2003-08-27 Simon Josefsson * lib/tgs.c: Add some KDC TGS related functions. Doc fix. 2003-08-27 Simon Josefsson * lib/as.c: Doc fix. 2003-08-27 Simon Josefsson * lib/ap.c: Verbose message fix. 2003-08-27 Simon Josefsson * src/shishid.c: Fix. 2003-08-27 Simon Josefsson * lib/shishi.h.in: Typo. 2003-08-27 Simon Josefsson * lib/shishi.h.in: Sync enums. 2003-08-27 Simon Josefsson * src/shishid.c: Better error handling. 2003-08-27 Simon Josefsson * lib/gztime.c, lib/internal.h, lib/krberror.c, lib/shishi.h.in, lib/utils.c, src/shishid.c: Improve KDC KRB-ERROR handling. 2003-08-27 Simon Josefsson * lib/Makefile.am: Build utils.c. 2003-08-27 Simon Josefsson * src/shishid.c: Fix msgtype detection. 2003-08-27 Simon Josefsson * lib/shishi.h.in: Fix Shishi_msgtype. 2003-08-27 Simon Josefsson * lib/kerberos5.asn1: Add copying conditions. 2003-08-26 Simon Josefsson * NEWS: Add. 2003-08-26 Simon Josefsson * doc/shishi.texi: Fix. 2003-08-26 Simon Josefsson * doc/shishi.texi: Add administration manual. 2003-08-26 Simon Josefsson * src/shishi.c: Make password argument to --string-to-key optional (for, e.g., --random). 2003-08-26 Simon Josefsson * src/shishi.c: Make --string-to-key work. 2003-08-26 Simon Josefsson * lib/diskio.c: Fixes. 2003-08-26 Simon Josefsson * src/Makefile.am: Define KDCKEYFILE. 2003-08-26 Simon Josefsson * src/shishi.c: Add --crypto. 2003-08-26 Simon Josefsson * src/shishid.c: Use keyfile for AS-REQ. 2003-08-26 Simon Josefsson * doc/shishi.texi: Fix. 2003-08-26 Simon Josefsson * doc/specifications/draft-brezak-win2k-krb-authz-01.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-00.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-03.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-04.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-01.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-00.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-02.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-03.txt, doc/specifications/draft-ietf-cat-kerberos-passwords-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-00.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-05.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-07.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-08.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-04.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-05.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-06.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-07.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-08.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-09.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-10.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-13.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-14.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-15.txt, doc/specifications/draft-ietf-cat-kerberos-pk-recovery-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-02.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-04.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-04.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-07.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-08.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-09.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-10.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-11.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-00.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-01.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-04.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-05.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-01.txt, doc/specifications/draft-ietf-cat-krb5-ipv6-00.txt, doc/specifications/draft-ietf-cat-krb5-tcp-00.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-00.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-01.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-02.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-00.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-01.txt, doc/specifications/draft-ietf-krb-wg-hw-auth-02.txt, doc/specifications/draft-ietf-krb-wg-info-ascii-gen-string-00.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-01.txt, doc/specifications/draft-ietf-krb-wg-kerberos-referrals-02.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-00.txt, doc/specifications/draft-ietf-krb-wg-kerberos-sam-01.txt, doc/specifications/draft-ietf-krb-wg-utf8-profile-01.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-00.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-01.txt, doc/specifications/draft-tso-telnet-krb5-00.txt, doc/specifications/draft-tso-telnet-krb5-01.txt, doc/specifications/draft-tso-telnet-krb5-02.txt, doc/specifications/draft-tso-telnet-krb5-03.txt: Add. 2003-08-26 Simon Josefsson * README: We are a GNU project. 2003-08-26 Simon Josefsson * doc/specifications/draft-swift-win2k-krb-referrals-00.txt, doc/specifications/draft-swift-win2k-krb-referrals-01.txt, doc/specifications/draft-swift-win2k-krb-user2user-02.txt, doc/specifications/draft-swift-win2k-krb-user2user-03.txt: Add. 2003-08-26 Simon Josefsson * lib/crypto.c: Doc fix, suggested by Nicolas Pouvesle. 2003-08-25 Simon Josefsson * acinclude.m4: Not used. 2003-08-25 Simon Josefsson * lib/crypto.c, lib/shishi.h.in: Fix cut'n'paste bug. 2003-08-25 Simon Josefsson * lib/as.c, lib/cfg.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/error.c, lib/hostkeys.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/keys.c, lib/netio.c, lib/password.c, lib/pkcs5.c, lib/principal.c, lib/shishi.h.in, lib/tkts.c, src/client-cksum.c, src/client.c, src/server.c, src/shishi.c, src/shishid.c: Indent. 2003-08-25 Simon Josefsson * lib/authenticator.c: Doc fix. 2003-08-25 Simon Josefsson * lib/crypto.c: Fix nettle IV handling. 2003-08-25 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/shishi.h.in: Improve encryption/decryption API: Support updated IVs. 2003-08-24 Simon Josefsson * doc/shishi.texi: Mention PA-TGS-REP. 2003-08-24 Simon Josefsson * lib/pkcs5.c: Fix. 2003-08-24 Simon Josefsson * NEWS: Add. 2003-08-24 Simon Josefsson * doc/specifications/iv.txt: [no log message] 2003-08-24 Simon Josefsson * lib/crypto.c: Set IV for libgcrypt too. 2003-08-24 Simon Josefsson * lib/crypto.c: Update IV in shishi_*crypt_iv*. Tiny patch from Nicolas Pouvesle . 2003-08-24 Simon Josefsson * lib/crypto.c: (shishi_encrypt_iv): Pass on iv parameter. 2003-08-23 Simon Josefsson * lib/resolv.c: Add comment. 2003-08-23 Simon Josefsson * Makefile.am: Add --fsf. 2003-08-22 Simon Josefsson * gl/m4/xalloc.m4, gl/setenv.h, gl/vasnprintf.c, gl/xstrdup.c: Gnulib sync. 2003-08-22 Simon Josefsson * configure.ac: Bump versions. 2003-08-22 Simon Josefsson * Makefile.am: Fix release target. 2003-08-22 Simon Josefsson * doc/draft-ietf-krb-wg-gssapi-cfx-00.txt, doc/specifications/draft-ietf-krb-wg-gssapi-cfx-00.txt: Move to proper place. 2003-08-22 Simon Josefsson * ChangeLog: [no log message] 2003-08-22 Simon Josefsson * NEWS: Version 0.0.3. 2003-08-22 Simon Josefsson * NEWS: Fix. 2003-08-22 Simon Josefsson * NEWS: Add. 2003-08-22 Simon Josefsson * gl/argp-help.c: libc sync 2003-08-22 Simon Josefsson * gl/m4/argp.m4: Remove unused things. 2003-08-22 Simon Josefsson * configure.ac: Look for libsocket, libnsl, libsyslog. 2003-08-22 Simon Josefsson * gl/argp-namefrob.h: libc sync 2003-08-22 Simon Josefsson * gl/argp-help.c: libc sync 2003-08-22 Simon Josefsson * gl/argp-help.c, gl/argp-parse.c: libc sync 2003-08-22 Simon Josefsson * src/shishid.c: fix 2003-08-22 Simon Josefsson * gl/argp-help.c, gl/argp-parse.c: libc sync 2003-08-22 Simon Josefsson * gl/argp-help.c, gl/argp-xinl.c: libc sync 2003-08-22 Simon Josefsson * gl/Makefile.am: add strndup.h 2003-08-22 Simon Josefsson * po/shishi.pot, po/sv.po: generated 2003-08-22 Simon Josefsson * gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-parse.c: libc sync 2003-08-22 Simon Josefsson * gl/argp-namefrob.h: libc sync 2003-08-22 Simon Josefsson * gl/argp-namefrob.h: libc sync 2003-08-22 Simon Josefsson * gl/argp-ba.c, gl/argp-fs-xinl.c, gl/argp-namefrob.h, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c: libc sync 2003-08-22 Simon Josefsson * gl/argp-fmtstream.h, gl/argp-help.c: libc sync 2003-08-22 Simon Josefsson * gl/argp-fmtstream.h: move lockfile stuff to argp-namefrob.h 2003-08-22 Simon Josefsson * gl/argp.h: libc sync. 2003-08-22 Simon Josefsson * gl/argp.h: Libc sync. 2003-08-22 Simon Josefsson * configure.ac, gl/Makefile.am, gl/alloca.c, gl/alloca_.h, gl/asnprintf.c, gl/asprintf.c, gl/error.c, gl/exitfail.c, gl/exitfail.h, gl/gettext.h, gl/m4/Makefile.am, gl/m4/exitfail.m4, gl/m4/extensions.m4, gl/m4/intmax_t.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/mempcpy.m4, gl/m4/unlocked-io.m4, gl/m4/vasnprintf.m4, gl/m4/xstrndup.m4, gl/mempcpy.c, gl/mempcpy.h, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/realloc.c, gl/setenv.c, gl/strerror.c, gl/strndup.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/vasprintf.h, gl/xalloc.h, gl/xmalloc.c, gl/xstrdup.c, gl/xstrndup.c, gl/xstrndup.h: Gnulib sync. 2003-08-22 Simon Josefsson * lib/tkt.c: Fix ticket messages. 2003-08-22 Simon Josefsson * src/shishi.c: Commit unfinished --renew code for later. 2003-08-20 Simon Josefsson * lib/crypto-des.c, lib/crypto.c, lib/kdc.c, lib/principal.c, lib/shishi.h.in, src/client-cksum.c, src/client.c, src/server.c, src/shishi.c: Fix warnings. 2003-08-20 Simon Josefsson * extra/pam_shishi/pam_shishi.c, lib/authenticator.c, lib/crypto-3des.c, lib/crypto-des.c, lib/crypto.c, lib/internal.h, lib/kdc.c, lib/pkcs5.c, lib/shishi.h.in, lib/ticket.c, src/client-cksum.c, src/client.c, src/shishi.c, tests/authenticator.c: Fix -Wall warnings. 2003-08-20 Simon Josefsson * src/.cvsignore: [no log message] 2003-08-20 Simon Josefsson * lib/crypto-des.c: Typo. 2003-08-20 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/crypto-des.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/safe.c, lib/tgs.c, lib/ticket.c: More ASN.1 API fixes (to get rid of BUFSIZ buffers on stack). 2003-08-20 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c, po/shishi.pot, po/sv.po: ASN.1 API fixes. 2003-08-20 Simon Josefsson * lib/kdc.c: Use new netio API. 2003-08-20 Simon Josefsson * lib/netio.c: Allocate buffer, no inline copy. 2003-08-20 Simon Josefsson * NEWS: Add. 2003-08-20 Simon Josefsson * src/Makefile.am: Build client-cksum. 2003-08-20 Simon Josefsson * src/client-cksum.c: Add. 2003-08-20 Simon Josefsson * lib/ap.c, lib/apreq.c, lib/as.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/principal.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, lib/tkts.c, lib/version.c: GTK-DOC fixes. 2003-08-17 Simon Josefsson * doc/shishi.texi: Fix. 2003-08-17 Simon Josefsson * doc/shishi.texi: Add. 2003-08-17 Simon Josefsson * doc/draft-ietf-krb-wg-gssapi-cfx-00.txt: Add. 2003-08-17 Simon Josefsson * doc/shishi.texi: Typo. 2003-08-17 Simon Josefsson * doc/shishi.texi: Update --help. 2003-08-17 Simon Josefsson * NEWS, configure.ac: Bump versions. 2003-08-17 Simon Josefsson * ChangeLog: [no log message] 2003-08-17 Simon Josefsson * NEWS: Version 0.0.2. 2003-08-17 Simon Josefsson * NEWS: Add. 2003-08-17 Simon Josefsson * Makefile.am: Fix release target. 2003-08-17 Simon Josefsson * src/client.c, src/server.c: Separate authentication from application data exchange. 2003-08-17 Simon Josefsson * crypto/des.c, crypto/desCode.h: Fix netbsd crash. 2003-08-17 Simon Josefsson * lib/authenticator.c: Fix. 2003-08-17 Simon Josefsson * lib/asn1.c: (shishi_asn1_read_uint32, shishi_asn1_read_integer): Propagate return code. 2003-08-17 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-08-17 Simon Josefsson * src/client.c, src/server.c: Set program_name for gl/error.c. 2003-08-16 Simon Josefsson * doc/shishi.texi: Add. 2003-08-16 Simon Josefsson * NEWS: Add. 2003-08-16 Simon Josefsson * shishi.skel.in: Sync with shishi.conf.in. 2003-08-16 Simon Josefsson * shishi.conf.in: Add ticket-life, renew-life. 2003-08-16 Simon Josefsson * lib/cfg.c: Add "ticket-life" and "renew-life" configuration terms. 2003-08-16 Simon Josefsson * lib/internal.h: Add ticketlife, renewlife. 2003-08-16 Simon Josefsson * lib/init.c: (shishi): Set ticketlife, renewlife. 2003-08-16 Simon Josefsson * src/shishi.c: Typo. 2003-08-16 Simon Josefsson * lib/tgs.c: (shishi_tgs_req_build): Use shishi_kdcreq_build. 2003-08-16 Simon Josefsson * lib/as.c: (shishi_as_req_build): Use shishi_kdcreq_build. 2003-08-16 Simon Josefsson * lib/shishi.h.in: (shishi_kdcreq_build): Add. 2003-08-16 Simon Josefsson * lib/kdcreq.c: (_shishi_kdcreq): Don't clear from. Use ticketlife. (shishi_kdcreq_build): New function. 2003-08-16 Simon Josefsson * lib/tkts.c: (shishi_tkts_get): Support starttime, endtime, renew_till. 2003-08-16 Simon Josefsson * src/shishi.c: Argp fixes. Support starttime, endtime, renew_till and renewable tickets. 2003-08-16 Simon Josefsson * lib/shishi.h.in: (Shishi_tkts_hint): Add. (shishi_as_req_build): Add. (shishi_kdcreq_options*, shishi_kdcreq_renewable_p): Add. (shishi_asn1_empty_field): Add. 2003-08-16 Simon Josefsson * lib/tkts.c: (shishi_tkts_get): Honor renewable. Call shishi_as_req_build. 2003-08-16 Simon Josefsson * lib/kdcreq.c: (_shishi_kdcreq): Don't clear rtime. (shishi_kdcreq_options*, shishi_kdcreq_renewable_p): Add. 2003-08-16 Simon Josefsson * lib/asn1.c: (shishi_asn1_empty_field): Add. 2003-08-16 Simon Josefsson * lib/as.c: (shishi_as_req_build): New function; clear rtime if necessary. 2003-08-16 Simon Josefsson * lib/tgs.c: (shishi_tgs_req_build): Clear rtime if necessary. 2003-08-16 Simon Josefsson * lib/asn1.c: (shishi_asn1_write_bitstring): Fix. 2003-08-16 Simon Josefsson * doc/specifications/draft-ietf-cat-kerberos-anoncred-00.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-00.txt, doc/specifications/draft-ietf-cat-kerberos-pk-recovery-00.txt, doc/specifications/draft-ietf-cat-krb5-firewalls-00.txt: Add. 2003-08-16 Simon Josefsson * shishi.skel.in: Fix doc. 2003-08-16 Simon Josefsson * doc/shishi.texi: Fix. 2003-08-15 Simon Josefsson * doc/shishi.texi: Add. 2003-08-15 Simon Josefsson * THANKS: Add. 2003-08-15 Simon Josefsson * lib/error.c: (shishi_error_printf): Handle when argument contains shishi_strerror_details(). Based on report and tiny patch from Nicolas Pouvesle . 2003-08-15 Simon Josefsson * crypto/cbc-cts.c: Typo. 2003-08-15 Simon Josefsson * crypto/aes-decrypt-table.c, crypto/aes-decrypt.c, crypto/aes-encrypt-table.c, crypto/aes-encrypt.c, crypto/aes-meta.c, crypto/aes-set-decrypt-key.c, crypto/aes-set-encrypt-key.c, crypto/aes.c, crypto/cbc-cts.c, crypto/cbc-mac.c, crypto/cbc.c, crypto/des.c, crypto/des3.c, crypto/hmac-md5.c, crypto/hmac-sha1.c, crypto/hmac.c, crypto/md5-meta.c, crypto/md5.c, crypto/memxor.c, crypto/sha1-meta.c, crypto/sha1.c: Upstream sync. Fix. 2003-08-15 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-08-15 Simon Josefsson * doc/shishi.texi: Sync user manual with reality. 2003-08-15 Simon Josefsson * lib/principal.c: Fix. 2003-08-15 Simon Josefsson * doc/shishi.texi, po/POTFILES.in: Fix. 2003-08-15 Simon Josefsson * src/shishid.c: Shishid is not i18n. 2003-08-15 Simon Josefsson * po/POTFILES.in: Add. 2003-08-15 Simon Josefsson * lib/tkts.c: (shishi_tkts_get_for_localservicepasswd): Use shishi_server_for_local_service. 2003-08-15 Simon Josefsson * lib/principal.c, lib/shishi.h.in: (shishi_server_for_local_service): Add. 2003-08-15 Simon Josefsson * src/authp.c, src/crypto.c, src/kdc.c: Remove. 2003-08-15 Simon Josefsson * src/shishi.c: Cleanup. Fix warnings. 2003-08-15 Simon Josefsson * src/shishi.c: Move data.h here. 2003-08-15 Simon Josefsson * src/Makefile.am, src/data.h: Remove data.h. 2003-08-15 Simon Josefsson * src/shishi.c: Simplify argv handling. Move crypto.c here. 2003-08-15 Simon Josefsson * src/Makefile.am: Remove authp.c, crypto.c Fix typo. 2003-08-15 Simon Josefsson * src/Makefile.am: Set up client and server for stand-alone compilation. 2003-08-15 Simon Josefsson * src/.cvsignore: [no log message] 2003-08-15 Simon Josefsson * src/data.h: Update. 2003-08-15 Simon Josefsson * src/shishi.c: Make AS/TGS/KDC into one GET command. Remove CLIENT/SERVER commands. 2003-08-15 Simon Josefsson * src/client.c, src/server.c: Now a separate program. 2003-08-14 Simon Josefsson * lib/shishi.h.in: Add error codes. Add shishi_parse_name(). 2003-08-14 Simon Josefsson * lib/principal.c: (shishi_parse_name): New function. 2003-08-14 Simon Josefsson * gl/xstrndup.c: Add. 2003-08-14 Simon Josefsson * doc/draft-ietf-krb-wg-gss-crypto-00.txt, doc/specifications/draft-ietf-krb-wg-gss-crypto-00.txt: Place it in the correct directory. 2003-08-14 Simon Josefsson * lib/netio.c: Abort if no DNS info. Based on report by Nicolas Pouvesle . 2003-08-14 Simon Josefsson * doc/draft-ietf-krb-wg-gss-crypto-00.txt: Add. 2003-08-12 Simon Josefsson * gl/xalloc.h: Add xstrndup. 2003-08-12 Simon Josefsson * gl/Makefile.am: Build xstrndup. 2003-08-12 Simon Josefsson * NEWS: Add. 2003-08-12 Simon Josefsson * configure.ac: Bump versions. 2003-08-12 Simon Josefsson * gl/.cvsignore: [no log message] 2003-08-12 Simon Josefsson * configure.ac, gl/Makefile.am, gl/getdate.h, gl/getdate.y, gl/m4/bison.m4, gl/m4/getdate.m4, gl/m4/mktime.m4, gl/m4/tm_gmtoff.m4, gl/mktime.c, gl/unlocked-io.h: Add getdate. 2003-08-12 Simon Josefsson * gl/m4/Makefile.am: Add getdate stuff. 2003-08-12 Simon Josefsson * configure.ac: Remove checks for unused programs. 2003-08-12 Simon Josefsson * doc/shishi.texi: Add. 2003-08-10 Simon Josefsson * crypto/Makefile.am: Fix. 2003-08-10 Simon Josefsson * crypto/cbc-cts.c: Fix. 2003-08-10 Simon Josefsson * crypto/cbc-cts.c: Fix. Indent. 2003-08-10 Simon Josefsson * doc/specifications/krb5-kdc.schema: Add. 2003-08-10 Simon Josefsson * doc/specifications/draft-ietf-johansson-krb-model-00.txt: Add. 2003-08-10 Simon Josefsson * src/shishid.c: Fix. 2003-08-10 Simon Josefsson * doc/Makefile.am: Built hostkeys. 2003-08-10 Simon Josefsson * lib/shishi.h.in: Some hostkeys functions renamed. 2003-08-10 Simon Josefsson * src/crypto.c: Use new key set API. 2003-08-10 Simon Josefsson * doc/Makefile.am: Fix gdoc-error invocation. 2003-08-10 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Add hostkeys again. 2003-08-10 Simon Josefsson * lib/Makefile.am: Add hostkeys.c. 2003-08-10 Simon Josefsson * lib/keys.c: Rename from *_hostkeys_* to *_keys_*. 2003-08-10 Simon Josefsson * lib/hostkeys.c: Re-added, as a wrapper around keys.c, with hard coded filename. 2003-08-10 Simon Josefsson * doc/Makefile.am, doc/shishi.texi, lib/Makefile.am, lib/hostkeys.c, lib/keys.c: Rename "hostkeys" to "keys" (for "key set", a'la "tkts"), since key sets can be used for more than just host keys. 2003-08-10 Simon Josefsson * lib/netio.c: Fix debug info. 2003-08-10 Simon Josefsson * crypto/cbc-cts.c: Work. 2003-08-10 Simon Josefsson * lib/shishi.h.in, lib/tkt.c: Fix typo. 2003-08-10 Simon Josefsson * lib/netio.c: Also try to send directly to realm. 2003-08-10 Simon Josefsson * lib/pkcs5.h: Removed. 2003-08-10 Simon Josefsson * README, THANKS, doc/shishi.texi: Fix. 2003-08-09 Simon Josefsson * ChangeLog: [no log message] 2003-08-09 Simon Josefsson * NEWS: Version 0.0.1. 2003-08-09 Simon Josefsson * lib/crypto-des.c: Fix. 2003-08-09 Simon Josefsson * lib/crypto-des.c: Fix typo. 2003-08-09 Simon Josefsson * NEWS: Fix. 2003-08-09 Simon Josefsson * extra/Makefile.am: Dist mailutils.diff. 2003-08-09 Simon Josefsson * extra/README: Mention mailutils.diff. 2003-08-09 Simon Josefsson * extra/mailutils.diff: Add. 2003-08-09 Simon Josefsson * extra/inetutils.diff: Update. 2003-08-09 Simon Josefsson * extra/README: Add inetutils instructions. 2003-08-09 Simon Josefsson * lib/crypto-des.c: Make md4/md5 checksum work. 2003-08-09 Simon Josefsson * lib/crypto.c: Typo. 2003-08-09 Simon Josefsson * lib/shishi.h.in: Add ad-hoc GSS type. 2003-08-09 Simon Josefsson * lib/crypto-des.c, lib/crypto.c: Clean up ad-hoc GSS checksum type. 2003-08-09 Simon Josefsson * crypto/md4.c, crypto/md4.h: Fix copyright. 2003-08-09 Simon Josefsson * crypto/Makefile.am, crypto/hmac-md4.c, crypto/hmac.h, crypto/nettle-meta.h: Add hmac-md4. 2003-08-09 Simon Josefsson * lib/crypto-des.c: Fix md4/md5. 2003-08-09 Simon Josefsson * crypto/md4.c: Fix. 2003-08-09 Simon Josefsson * crypto/Makefile.am, crypto/md4-meta.c, crypto/md4.c, crypto/md4.h: Add md4. 2003-08-09 Simon Josefsson * lib/crypto-des.c, lib/crypto.c: Add nettle fallback for DES ciphers. 2003-08-09 Simon Josefsson * crypto/gstr.c, crypto/gstr.h, crypto/mem.h: Remove asn1 junk. 2003-08-09 Simon Josefsson * crypto/Makefile.am, crypto/cbc-mac.c, crypto/cbc-mac.h: Add CBC-MAC. 2003-08-09 Simon Josefsson * THANKS: Fix. 2003-08-09 Simon Josefsson * configure.ac: Fix -Icrypto. 2003-08-09 Simon Josefsson * crypto/Makefile.am, crypto/desinfo.h: Fix. 2003-08-09 Simon Josefsson * lib/crypto.c: Fix USE_GCRYPT usage. 2003-08-09 Simon Josefsson * NEWS: Fix. 2003-08-09 Simon Josefsson * tests/crypto.c: Only test des for libgcrypt . 2003-08-09 Simon Josefsson * lib/Makefile.am, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c, lib/error.c, lib/internal.h, lib/pkcs5.c, lib/shishi.h.in: Support nettle as well as libgcrypt. Move pkcs5/PBKDF2 stuff into Shishi namespace. 2003-08-09 Simon Josefsson * tests/crypto.c: Use new pkcs5 API. 2003-08-09 Simon Josefsson * configure.ac: Replace libgcrypt/libgpg-error stuff with "mininettle" in crypto/. Check for fcntl.h. 2003-08-09 Simon Josefsson * Makefile.am: Remove errcrypto. Remove crypto/m4 from aclocal flags. 2003-08-09 Simon Josefsson * crypto/.cvsignore, crypto/Makefile.am, crypto/aes-decrypt-table.c, crypto/aes-decrypt.c, crypto/aes-encrypt-table.c, crypto/aes-encrypt.c, crypto/aes-internal.h, crypto/aes-meta.c, crypto/aes-set-decrypt-key.c, crypto/aes-set-encrypt-key.c, crypto/aes.c, crypto/aes.h, crypto/cbc-cts.c, crypto/cbc-cts.h, crypto/cbc.c, crypto/cbc.h, crypto/des.c, crypto/des.h, crypto/des3.c, crypto/desCode.h, crypto/desinfo.h, crypto/gstr.c, crypto/gstr.h, crypto/hmac-md5.c, crypto/hmac-sha1.c, crypto/hmac.c, crypto/hmac.h, crypto/keymap.h, crypto/macros.h, crypto/md5-meta.c, crypto/md5.c, crypto/md5.h, crypto/mem.h, crypto/memxor.c, crypto/memxor.h, crypto/nettle-meta.h, crypto/parity.h, crypto/rotors.h, crypto/sha.h, crypto/sha1-meta.c, crypto/sha1.c: Add (from nettle). 2003-08-09 Simon Josefsson * crypto/.cvsignore, crypto/AUTHORS, crypto/BUGS, crypto/COPYING, crypto/COPYING.DOC, crypto/COPYING.LIB, crypto/ChangeLog, crypto/Makefile.am, crypto/NEWS, crypto/Notes-wk, crypto/README, crypto/README-alpha, crypto/README.apichanges, crypto/THANKS, crypto/TODO, crypto/acinclude.m4, crypto/autogen.sh, crypto/cipher/.cvsignore, crypto/cipher/ChangeLog, crypto/cipher/Makefile.am, crypto/cipher/ac.c, crypto/cipher/arcfour.c, crypto/cipher/bithelp.h, crypto/cipher/blowfish.c, crypto/cipher/cast5.c, crypto/cipher/cipher.c, crypto/cipher/crc.c, crypto/cipher/des.c, crypto/cipher/dsa.c, crypto/cipher/elgamal.c, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/primegen.c, crypto/cipher/pubkey.c, crypto/cipher/rand-internal.h, crypto/cipher/random.c, crypto/cipher/random.h, crypto/cipher/rijndael.c, crypto/cipher/rmd.h, crypto/cipher/rmd160.c, crypto/cipher/rndegd.c, crypto/cipher/rndlinux.c, crypto/cipher/rndunix.c, crypto/cipher/rndw32.c, crypto/cipher/rsa.c, crypto/cipher/sha1.c, crypto/cipher/sha256.c, crypto/cipher/sha512.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/configure.ac, crypto/doc/.cvsignore, crypto/doc/ChangeLog, crypto/doc/Makefile.am, crypto/doc/fdl.texi, crypto/doc/gcrypt.texi, crypto/doc/gpl.texi, crypto/doc/lgpl.texi, crypto/libgcrypt.txt, crypto/mpi/.cvsignore, crypto/mpi/ChangeLog, crypto/mpi/Makefile.am, crypto/mpi/alpha/README, crypto/mpi/alpha/distfiles, crypto/mpi/alpha/mpih-add1.S, crypto/mpi/alpha/mpih-lshift.S, crypto/mpi/alpha/mpih-mul1.S, crypto/mpi/alpha/mpih-mul2.S, crypto/mpi/alpha/mpih-mul3.S, crypto/mpi/alpha/mpih-rshift.S, crypto/mpi/alpha/mpih-sub1.S, crypto/mpi/alpha/udiv-qrnnd.S, crypto/mpi/config.links, crypto/mpi/generic/distfiles, crypto/mpi/generic/mpi-asm-defs.h, crypto/mpi/generic/mpih-add1.c, crypto/mpi/generic/mpih-lshift.c, crypto/mpi/generic/mpih-mul1.c, crypto/mpi/generic/mpih-mul2.c, crypto/mpi/generic/mpih-mul3.c, crypto/mpi/generic/mpih-rshift.c, crypto/mpi/generic/mpih-sub1.c, crypto/mpi/generic/udiv-w-sdiv.c, crypto/mpi/hppa/README, crypto/mpi/hppa/distfiles, crypto/mpi/hppa/mpih-add1.S, crypto/mpi/hppa/mpih-lshift.S, crypto/mpi/hppa/mpih-rshift.S, crypto/mpi/hppa/mpih-sub1.S, crypto/mpi/hppa/udiv-qrnnd.S, crypto/mpi/hppa1.1/distfiles, crypto/mpi/hppa1.1/mpih-mul1.S, crypto/mpi/hppa1.1/mpih-mul2.S, crypto/mpi/hppa1.1/mpih-mul3.S, crypto/mpi/hppa1.1/udiv-qrnnd.S, crypto/mpi/i386/distfiles, crypto/mpi/i386/mpih-add1.S, crypto/mpi/i386/mpih-lshift.S, crypto/mpi/i386/mpih-mul1.S, crypto/mpi/i386/mpih-mul2.S, crypto/mpi/i386/mpih-mul3.S, crypto/mpi/i386/mpih-rshift.S, crypto/mpi/i386/mpih-sub1.S, crypto/mpi/i386/syntax.h, crypto/mpi/i586/README, crypto/mpi/i586/distfiles, crypto/mpi/i586/mpih-add1.S, crypto/mpi/i586/mpih-lshift.S, crypto/mpi/i586/mpih-mul1.S, crypto/mpi/i586/mpih-mul2.S, crypto/mpi/i586/mpih-mul3.S, crypto/mpi/i586/mpih-rshift.S, crypto/mpi/i586/mpih-sub1.S, crypto/mpi/longlong.h, crypto/mpi/m68k/distfiles, crypto/mpi/m68k/mc68020/distfiles, crypto/mpi/m68k/mc68020/mpih-mul1.S, crypto/mpi/m68k/mc68020/mpih-mul2.S, crypto/mpi/m68k/mc68020/mpih-mul3.S, crypto/mpi/m68k/mpih-add1.S, crypto/mpi/m68k/mpih-lshift.S, crypto/mpi/m68k/mpih-rshift.S, crypto/mpi/m68k/mpih-sub1.S, crypto/mpi/m68k/syntax.h, crypto/mpi/mips3/README, crypto/mpi/mips3/distfiles, crypto/mpi/mips3/mpi-asm-defs.h, crypto/mpi/mips3/mpih-add1.S, crypto/mpi/mips3/mpih-lshift.S, crypto/mpi/mips3/mpih-mul1.S, crypto/mpi/mips3/mpih-mul2.S, crypto/mpi/mips3/mpih-mul3.S, crypto/mpi/mips3/mpih-rshift.S, crypto/mpi/mips3/mpih-sub1.S, crypto/mpi/mpi-add.c, crypto/mpi/mpi-bit.c, crypto/mpi/mpi-cmp.c, crypto/mpi/mpi-div.c, crypto/mpi/mpi-gcd.c, crypto/mpi/mpi-inline.c, crypto/mpi/mpi-inline.h, crypto/mpi/mpi-internal.h, crypto/mpi/mpi-inv.c, crypto/mpi/mpi-mpow.c, crypto/mpi/mpi-mul.c, crypto/mpi/mpi-pow.c, crypto/mpi/mpi-scan.c, crypto/mpi/mpicoder.c, crypto/mpi/mpih-div.c, crypto/mpi/mpih-mul.c, crypto/mpi/mpiutil.c, crypto/mpi/pa7100/distfiles, crypto/mpi/pa7100/mpih-lshift.S, crypto/mpi/pa7100/mpih-rshift.S, crypto/mpi/power/distfiles, crypto/mpi/power/mpih-add1.S, crypto/mpi/power/mpih-lshift.S, crypto/mpi/power/mpih-mul1.S, crypto/mpi/power/mpih-mul2.S, crypto/mpi/power/mpih-mul3.S, crypto/mpi/power/mpih-rshift.S, crypto/mpi/power/mpih-sub1.S, crypto/mpi/powerpc32/distfiles, crypto/mpi/powerpc32/mpih-add1.S, crypto/mpi/powerpc32/mpih-lshift.S, crypto/mpi/powerpc32/mpih-mul1.S, crypto/mpi/powerpc32/mpih-mul2.S, crypto/mpi/powerpc32/mpih-mul3.S, crypto/mpi/powerpc32/mpih-rshift.S, crypto/mpi/powerpc32/mpih-sub1.S, crypto/mpi/powerpc32/syntax.h, crypto/mpi/powerpc64/distfiles, crypto/mpi/sparc32/distfiles, crypto/mpi/sparc32/mpih-add1.S, crypto/mpi/sparc32/mpih-lshift.S, crypto/mpi/sparc32/mpih-rshift.S, crypto/mpi/sparc32/udiv.S, crypto/mpi/sparc32v8/distfiles, crypto/mpi/sparc32v8/mpih-mul1.S, crypto/mpi/sparc32v8/mpih-mul2.S, crypto/mpi/sparc32v8/mpih-mul3.S, crypto/mpi/supersparc/distfiles, crypto/mpi/supersparc/udiv.S, crypto/scripts/.cvsignore, crypto/scripts/ChangeLog, crypto/scripts/autogen.sh, crypto/scripts/db2any, crypto/scripts/distfiles, crypto/src/.cvsignore, crypto/src/ChangeLog, crypto/src/Makefile.am, crypto/src/ath-pth.c, crypto/src/ath-pthread.c, crypto/src/ath.c, crypto/src/ath.h, crypto/src/cipher.h, crypto/src/g10lib.h, crypto/src/gcrypt-module.h, crypto/src/gcrypt.h, crypto/src/global.c, crypto/src/libgcrypt-config.in, crypto/src/libgcrypt.m4, crypto/src/libgcrypt.vers, crypto/src/misc.c, crypto/src/missing-string.c, crypto/src/module.c, crypto/src/mpi.h, crypto/src/secmem.c, crypto/src/secmem.h, crypto/src/sexp.c, crypto/src/stdmem.c, crypto/src/stdmem.h, crypto/src/types.h, crypto/stamp-h.in, crypto/tests/.cvsignore, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/ac.c, crypto/tests/basic.c, crypto/tests/benchmark.c, crypto/tests/keygen.c, crypto/tests/pubkey.c, crypto/tests/register.c, crypto/tests/testapi.c, crypto/tests/tsexp.c, crypto/w32-dll/.cvsignore, crypto/w32-dll/ChangeLog, crypto/w32-dll/Makefile.am, crypto/w32-dll/build-def, crypto/w32-dll/build-dll, crypto/w32-dll/libgcrypt.def, errcrypto/.cvsignore, errcrypto/AUTHORS, errcrypto/COPYING, errcrypto/COPYING.LIB, errcrypto/ChangeLog, errcrypto/INSTALL, errcrypto/Makefile.am, errcrypto/NEWS, errcrypto/README, errcrypto/README.CVS, errcrypto/configure.ac, errcrypto/m4/.cvsignore, errcrypto/m4/ChangeLog, errcrypto/m4/Makefile.am, errcrypto/po/.cvsignore, errcrypto/po/ChangeLog, errcrypto/po/LINGUAS, errcrypto/po/Makevars, errcrypto/po/POTFILES.in, errcrypto/src/.cvsignore, errcrypto/src/Makefile.am, errcrypto/src/code-from-errno.c, errcrypto/src/code-to-errno.c, errcrypto/src/err-codes.h.in, errcrypto/src/err-sources.h.in, errcrypto/src/errnos.in, errcrypto/src/gettext.h, errcrypto/src/gpg-error-config.in, errcrypto/src/gpg-error.h, errcrypto/src/gpg-error.m4, errcrypto/src/mkerrcodes1.awk, errcrypto/src/mkerrcodes2.awk, errcrypto/src/mkerrnos.awk, errcrypto/src/mkstrtable.awk, errcrypto/src/strerror.c, errcrypto/src/strsource.c, errcrypto/tests/.cvsignore, errcrypto/tests/Makefile.am, errcrypto/tests/t-strerror.c: Remove (libgcrypt is being replaced by a mini-nettle). 2003-08-08 Simon Josefsson * configure.ac: Prefer minitasn1 over libtasn1. 2003-08-08 Simon Josefsson * asn1/.cvsignore: [no log message] 2003-08-08 Simon Josefsson * crypto/src/benchmark.c, crypto/src/testapi.c, crypto/tests/benchmark.c, crypto/tests/testapi.c: Upstream sync. 2003-08-08 Simon Josefsson * crypto/AUTHORS, crypto/NEWS, crypto/README, crypto/THANKS, crypto/cipher/ac.c, crypto/cipher/arcfour.c, crypto/cipher/arcfour.h, crypto/cipher/blowfish.c, crypto/cipher/blowfish.h, crypto/cipher/cast5.c, crypto/cipher/cast5.h, crypto/cipher/cipher.c, crypto/cipher/crc.c, crypto/cipher/des.c, crypto/cipher/des.h, crypto/cipher/dsa.c, crypto/cipher/dsa.h, crypto/cipher/dynload.c, crypto/cipher/dynload.h, crypto/cipher/elgamal.c, crypto/cipher/elgamal.h, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/primegen.c, crypto/cipher/random.c, crypto/cipher/random.h, crypto/cipher/rijndael.c, crypto/cipher/rmd160.c, crypto/cipher/rmd160test.c, crypto/cipher/rsa.c, crypto/cipher/rsa.h, crypto/cipher/sha1.c, crypto/cipher/sha256.c, crypto/cipher/sha512.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/doc/ChangeLog, crypto/doc/cipher-ref.sgml, crypto/doc/digest-ref.sgml, crypto/doc/gcrypt.texi, crypto/doc/misc-ref.sgml, crypto/doc/pubkey-ref.sgml, crypto/doc/reference.sgml, crypto/doc/version.sgml.in, crypto/jnlib/ChangeLog, crypto/jnlib/Makefile.am, crypto/jnlib/README, crypto/jnlib/argparse.c, crypto/jnlib/argparse.h, crypto/jnlib/dotlock.c, crypto/jnlib/dotlock.h, crypto/jnlib/libjnlib-config.h, crypto/jnlib/logging.c, crypto/jnlib/logging.h, crypto/jnlib/mischelp.h, crypto/jnlib/stringhelp.c, crypto/jnlib/stringhelp.h, crypto/jnlib/xmalloc.c, crypto/jnlib/xmalloc.h, crypto/mpi/ChangeLog, crypto/mpi/config.links, crypto/mpi/longlong.h, crypto/mpi/mpi-bit.c, crypto/mpi/mpicoder.c, crypto/scripts/ChangeLog, crypto/src/Makefile.am, crypto/src/ath-pth.c, crypto/src/g10lib.h, crypto/src/gcrypt-module.h, crypto/src/mpi.h, crypto/src/secmem.c, crypto/src/sexp.c, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/ac.c, crypto/tests/basic.c, crypto/tests/keygen.c, crypto/tests/register.c, crypto/tests/tsexp.c, errcrypto/NEWS, errcrypto/README, errcrypto/configure.ac, errcrypto/src/gpg-error.m4, errcrypto/src/mkerrcodes1.awk, errcrypto/src/mkerrcodes2.awk, errcrypto/src/mkerrnos.awk, errcrypto/src/mkstrtable.awk: Upstream sync. 2003-08-08 Simon Josefsson * : Upstream sync. 2003-08-08 Simon Josefsson * doc/shishi.texi: Fix acks. 2003-08-08 Simon Josefsson * THANKS: Update. 2003-08-08 Simon Josefsson * doc/shishi.texi: Fix. 2003-08-08 Simon Josefsson * crypto/tests/Makefile.am: Disable tests. 2003-08-08 Simon Josefsson * crypto/src/ChangeLog, crypto/src/gcrypt.h, crypto/src/global.c: Upstream sync. 2003-08-08 Simon Josefsson * crypto/ChangeLog, crypto/README.apichanges, crypto/cipher/ChangeLog, crypto/cipher/pubkey.c, crypto/configure.ac, crypto/src/ChangeLog, crypto/src/module.c: Upstream sync. 2003-08-08 Simon Josefsson * lib/shishi.h.in: Include time.h for time_t. 2003-08-07 Simon Josefsson * crypto/Makefile.am: Revert to upstream. 2003-08-07 Simon Josefsson * configure.ac: Readd depends. 2003-08-07 Simon Josefsson * crypto/Makefile.am: Really fix check target. 2003-08-07 Simon Josefsson * tests/Makefile.am: Remove obsolete idn CFLAGS. 2003-08-07 Simon Josefsson * src/Makefile.am: Remove obsolete intl and idn CFLAGS. 2003-08-07 Simon Josefsson * src/Makefile.am: Link gnulib. 2003-08-07 Simon Josefsson * crypto/Makefile.am: Remove tests (random stuff hang on too many platforms). 2003-08-07 Simon Josefsson * doc/Makefile.am: Dist shishi.{ps,pdf,html}. 2003-08-07 Simon Josefsson * configure.ac: Disable dependencies (to speed things up). 2003-08-07 Simon Josefsson * configure.ac: Reorder resolv.h. 2003-08-07 Simon Josefsson * gl/Makefile.am: Revert. 2003-08-07 Simon Josefsson * gl/Makefile.am: Libtool fix. 2003-08-07 Simon Josefsson * gl/.cvsignore: [no log message] 2003-08-07 Simon Josefsson * lib/netio.c: Fix typo. 2003-08-07 Simon Josefsson * gl/Makefile.am: Use libtool. 2003-08-07 Simon Josefsson * src/Makefile.am: Fix includes. 2003-08-07 Simon Josefsson * lib/init.c, lib/internal.h: Fix gettext stuff. 2003-08-07 Simon Josefsson * Makefile.am: Distcheck fails on gtk-doc, disable it. 2003-08-07 Simon Josefsson * tests/Makefile.am: Add -I's. 2003-08-07 Simon Josefsson * m4/Makefile.am: Add. 2003-08-07 Simon Josefsson * doc/reference/Makefile.am: Ignore shishi-int.h. 2003-08-07 Simon Josefsson * Makefile.am: Remove distcheck flag hack. 2003-08-07 Simon Josefsson * lib/.cvsignore: [no log message] 2003-08-07 Simon Josefsson * configure.ac, lib/Makefile.am, lib/shishi.h.in, m4/ac_compile_check_sizeof.m4, m4/ax_create_stdint_h.m4: Create shishi-int.h and use it, for uint32_t etc. 2003-08-07 Simon Josefsson * errcrypto/ChangeLog, errcrypto/src/code-from-errno.c, errcrypto/src/code-to-errno.c, errcrypto/src/err-codes.h.in, errcrypto/src/err-sources.h.in, errcrypto/src/errnos.in, errcrypto/src/gpg-error.h, errcrypto/src/strerror.c, errcrypto/src/strsource.c: Upstream sync. 2003-08-07 Simon Josefsson * asn1/Makefile.am: Fix. 2003-08-07 Simon Josefsson * configure.ac: Bump gcrypt version. 2003-08-07 Simon Josefsson * asn1/Makefile.am: Sync upstream. 2003-08-07 Simon Josefsson * lib/Makefile.am: Fix. 2003-08-07 Simon Josefsson * NEWS: Add. 2003-08-07 Simon Josefsson * NEWS: Add. 2003-08-07 Simon Josefsson * asn1/.cvsignore: [no log message] 2003-08-07 Simon Josefsson * configure.ac, lib/Makefile.am: Libtasn1 fixes. 2003-08-07 Simon Josefsson * asn1/.cvsignore: [no log message] 2003-08-07 Simon Josefsson * asn1/ASN1.c, asn1/Makefile.am, asn1/README, asn1/coding.c, asn1/decoding.c, asn1/defines.h, asn1/der.h, asn1/element.c, asn1/element.h, asn1/errors.c, asn1/errors.h, asn1/errors_int.h, asn1/gstr.c, asn1/gstr.h, asn1/int.h, asn1/libtasn1.h, asn1/mem.h, asn1/parser_aux.c, asn1/parser_aux.h, asn1/structure.c, asn1/structure.h: Add (lib/minitasn1 from gnutls). 2003-08-07 Simon Josefsson * asn1/.cvsignore, asn1/.cvsusers, asn1/AUTHORS, asn1/COPYING, asn1/COPYING.LIB, asn1/ChangeLog, asn1/Makefile.am, asn1/NEWS, asn1/README, asn1/THANKS, asn1/acconfig.h, asn1/acinclude.m4, asn1/buildconf, asn1/configure.in, asn1/doc/.cvsignore, asn1/doc/Makefile.am, asn1/doc/TODO, asn1/doc/asn1.tex, asn1/doc/fdl.tex, asn1/doc/scripts/.cvsignore, asn1/doc/scripts/Makefile.am, asn1/doc/scripts/gdoc, asn1/lib/.cvsignore, asn1/lib/ASN1.c, asn1/lib/ASN1.y, asn1/lib/Makefile.am, asn1/lib/coding.c, asn1/lib/decoding.c, asn1/lib/defines.h, asn1/lib/der.h, asn1/lib/element.c, asn1/lib/element.h, asn1/lib/errors.c, asn1/lib/errors.h, asn1/lib/errors_int.h, asn1/lib/gstr.c, asn1/lib/gstr.h, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/lib/mem.h, asn1/lib/parser_aux.c, asn1/lib/parser_aux.h, asn1/lib/structure.c, asn1/lib/structure.h, asn1/src/.cvsignore, asn1/src/CertificateExample.c, asn1/src/CrlExample.c, asn1/src/Makefile.am, asn1/src/asn1Coding.c, asn1/src/asn1Coding_test.asg, asn1/src/asn1Coding_test.asn, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c, asn1/src/asn1c.c, asn1/src/pkix.asn, asn1/src/pkix_asn1_tab.c, asn1/tests/.cvsignore, asn1/tests/Makefile.am, asn1/tests/Test_parser.asn, asn1/tests/Test_parser.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c, asn1/tests/Test_tree_asn1_tab.c: Remove (to be replaced by minitasn1). 2003-08-07 Simon Josefsson * shishi.conf.in: Fix. 2003-08-07 Simon Josefsson * shishi.skel.in: Cleanup and fix. 2003-08-07 Simon Josefsson * shishi.conf.in: Fix. 2003-08-07 Simon Josefsson * doc/shishi.texi: Mention SRV. 2003-08-07 Simon Josefsson * lib/netio.c: Slight cleanup. 2003-08-07 Simon Josefsson * configure.ac, lib/Makefile.am, lib/internal.h, lib/netio.c, lib/resolv.c: Look for SRV RRs if KDC address not known. 2003-08-06 Simon Josefsson * lib/internal.h: Add. Change user cfg file to $HOME/.shishi/shishi.conf from $HOME/.shishi/config. 2003-08-06 Simon Josefsson * lib/init.c: Add _shishi_maybe_install_usercfg, shishi_info. Fix warnings. 2003-08-06 Simon Josefsson * lib/shishi.h.in: Add. 2003-08-06 Simon Josefsson * lib/cfg.c: Add shishi_cfg_default_userdirectory. Don't dump cfg every time a cfg file is read. Fix warnings. 2003-08-05 Simon Josefsson * configure.ac: Check for locale.h. 2003-08-05 Simon Josefsson * Makefile.am, NEWS, configure.ac: Use external gettext. 2003-08-05 Simon Josefsson * NEWS: Fix. 2003-08-05 Simon Josefsson * lib/.cvsignore, lib/Makefile.am, lib/kerberos5.asn1, lib/rfc1510.asn1, lib/rfc1510bis.asn1, lib/rfc1510bis.asn1.orig: Use new ASN.1 module, and remove the old ones. 2003-08-05 Simon Josefsson * lib/rfc1510.asn1: Copied from rfc1510bis.asn1, with modifications. 2003-08-05 Simon Josefsson * asn1/Makefile.am, asn1/lib/Makefile.am: Fix bad sync. 2003-08-05 Simon Josefsson * tests/gss.c: Remove. 2003-08-05 Simon Josefsson * asn1/Makefile.am, asn1/NEWS, asn1/configure.in, asn1/lib/coding.c, asn1/lib/decoding.c, asn1/lib/der.h, asn1/lib/element.c, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/src/CertificateExample.c, asn1/src/CrlExample.c, asn1/src/asn1Coding.c, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c, asn1/src/asn1c.c, asn1/tests/Test_parser.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c: Sync upstream. 2003-08-05 Simon Josefsson * doc/Makefile.am: Remove ps/pdf targets (modern automake include them). Fix help2man program name. 2003-08-05 Simon Josefsson * Makefile.am, configure.ac, lib/password.c: Make libidn optional. 2003-08-05 Simon Josefsson * doc/shishi.texi: Heimdal telnetd doesn't crash any more. 2003-08-05 Simon Josefsson * .cvscopying: Add. 2003-07-31 Simon Josefsson * doc/specifications/draft-weber-krb-wg-kerberos-pfs-00.txt: Add. 2003-07-10 Simon Josefsson * po/shishi.pot, po/sv.po: Generated. 2003-07-10 Simon Josefsson * extra/pam_shishi/Makefile.am: Add -I to libidn. 2003-07-10 Simon Josefsson * src/Makefile.am, tests/Makefile.am: Link with gettext, for gnulib. 2003-07-10 Simon Josefsson * src/shishid.c, tests/utils.c: Add program_name (for gnulib). 2003-07-10 Simon Josefsson * configure.ac: Really disable ld script in libgcrypt. 2003-07-10 Simon Josefsson * extra/Makefile.am: Dist inetutils.diff. 2003-07-10 Simon Josefsson * extra/pam_shishi/Makefile.am: Remove asn1 -I, add gnulib -I. 2003-07-10 Simon Josefsson * gdbm/.cvsignore: [no log message] 2003-07-10 Simon Josefsson * gdbm/COPYING, gdbm/ChangeLog, gdbm/INSTALL, gdbm/Makefile.in, gdbm/NEWS, gdbm/README, gdbm/aclocal.m4, gdbm/bucket.c, gdbm/close.c, gdbm/config.guess, gdbm/config.sub, gdbm/configure.in, gdbm/conv2gdbm.c, gdbm/dbm.h, gdbm/dbmclose.c, gdbm/dbmdelete.c, gdbm/dbmdirfno.c, gdbm/dbmfetch.c, gdbm/dbminit.c, gdbm/dbmopen.c, gdbm/dbmpagfno.c, gdbm/dbmrdonly.c, gdbm/dbmseq.c, gdbm/dbmstore.c, gdbm/delete.c, gdbm/extern.h, gdbm/falloc.c, gdbm/fetch.c, gdbm/findkey.c, gdbm/gdbm.3, gdbm/gdbm.info, gdbm/gdbm.proto, gdbm/gdbm.proto2, gdbm/gdbm.texinfo, gdbm/gdbmclose.c, gdbm/gdbmconst.h, gdbm/gdbmdefs.h, gdbm/gdbmdelete.c, gdbm/gdbmerrno.c, gdbm/gdbmerrno.h, gdbm/gdbmexists.c, gdbm/gdbmfdesc.c, gdbm/gdbmfetch.c, gdbm/gdbmopen.c, gdbm/gdbmreorg.c, gdbm/gdbmseq.c, gdbm/gdbmsetopt.c, gdbm/gdbmstore.c, gdbm/gdbmsync.c, gdbm/getopt.c, gdbm/getopt.h, gdbm/global.c, gdbm/hash.c, gdbm/install-sh, gdbm/mkinstalldirs, gdbm/ndbm.h, gdbm/proto.h, gdbm/seq.c, gdbm/store.c, gdbm/systems.h, gdbm/testdbm.c, gdbm/testgdbm.c, gdbm/testndbm.c, gdbm/update.c, gdbm/version.c: Remove (we will use text files for shishid). 2003-07-10 Simon Josefsson * extra/README: Add. 2003-07-10 Simon Josefsson * extra/pam_shishi/pam_shishi.c: Indent. 2003-07-10 Simon Josefsson * extra/pam_shishi/pam_shishi.c: Fix warnings. 2003-07-10 Simon Josefsson * src/Makefile.am: Cleanup. 2003-07-10 Simon Josefsson * src/Makefile.am: Remove unused stuff. 2003-07-10 Simon Josefsson * lib/Makefile.am: Fix libtool warning. 2003-07-10 Simon Josefsson * NEWS: Add. 2003-07-10 Simon Josefsson * extra/README: Remove inetutils. 2003-07-10 Simon Josefsson * extra/inetutils/.cvsignore, extra/inetutils/AUTHORS, extra/inetutils/COPYING, extra/inetutils/ChangeLog, extra/inetutils/ChangeLog.0, extra/inetutils/Makefile.am, extra/inetutils/NEWS, extra/inetutils/README, extra/inetutils/README-alpha, extra/inetutils/ROADMAP, extra/inetutils/THANKS, extra/inetutils/TODO, extra/inetutils/acinclude.m4, extra/inetutils/autogen.sh, extra/inetutils/configure.ac, extra/inetutils/doc/.cvsignore, extra/inetutils/doc/ChangeLog, extra/inetutils/doc/Makefile.am, extra/inetutils/doc/ftp.texi, extra/inetutils/doc/ftpd.texi, extra/inetutils/doc/inetd.texi, extra/inetutils/doc/inetutils.texi, extra/inetutils/doc/logger.texi, extra/inetutils/doc/ping.texi, extra/inetutils/doc/rcp.texi, extra/inetutils/doc/rexecd.texi, extra/inetutils/doc/rfc/.cvsignore, extra/inetutils/doc/rfc/Makefile.am, extra/inetutils/doc/rfc/rfc1282.txt, extra/inetutils/doc/rlogin.texi, extra/inetutils/doc/rlogind.texi, extra/inetutils/doc/rsh.texi, extra/inetutils/doc/rshd.texi, extra/inetutils/doc/syslogd.texi, extra/inetutils/doc/talk.texi, extra/inetutils/doc/talkd.texi, extra/inetutils/doc/tftp.texi, extra/inetutils/ftp/.cvsignore, extra/inetutils/ftp/ChangeLog, extra/inetutils/ftp/Makefile.am, extra/inetutils/ftp/cmds.c, extra/inetutils/ftp/cmdtab.c, extra/inetutils/ftp/domacro.c, extra/inetutils/ftp/extern.h, extra/inetutils/ftp/ftp.1, extra/inetutils/ftp/ftp.c, extra/inetutils/ftp/ftp_var.h, extra/inetutils/ftp/main.c, extra/inetutils/ftp/ruserpass.c, extra/inetutils/ftpd/.cvsignore, extra/inetutils/ftpd/ChangeLog, extra/inetutils/ftpd/Makefile.am, extra/inetutils/ftpd/README.sec, extra/inetutils/ftpd/auth.c, extra/inetutils/ftpd/conf.c, extra/inetutils/ftpd/extern.h, extra/inetutils/ftpd/ftpcmd.y, extra/inetutils/ftpd/ftpd.8, extra/inetutils/ftpd/ftpd.c, extra/inetutils/ftpd/logwtmp.c, extra/inetutils/ftpd/pam.c, extra/inetutils/ftpd/popen.c, extra/inetutils/ftpd/server_mode.c, extra/inetutils/glob/.cvsignore, extra/inetutils/glob/COPYING.LIB, extra/inetutils/glob/ChangeLog, extra/inetutils/glob/Makefile.am, extra/inetutils/glob/SMakefile, extra/inetutils/glob/configure.bat, extra/inetutils/glob/configure.in, extra/inetutils/glob/fnmatch.c, extra/inetutils/glob/fnmatch.h, extra/inetutils/glob/glob.c, extra/inetutils/glob/glob.h, extra/inetutils/gwhois/.cvsignore, extra/inetutils/gwhois/ChangeLog, extra/inetutils/gwhois/Makefile.am, extra/inetutils/gwhois/README, extra/inetutils/gwhois/TODO, extra/inetutils/gwhois/as_del_list, extra/inetutils/gwhois/data.h, extra/inetutils/gwhois/ip_del_list, extra/inetutils/gwhois/make_as_del.pl, extra/inetutils/gwhois/make_ip_del.pl, extra/inetutils/gwhois/make_tld_serv.pl, extra/inetutils/gwhois/tld_serv_list, extra/inetutils/gwhois/whois.1, extra/inetutils/gwhois/whois.c, extra/inetutils/gwhois/whois.h, extra/inetutils/headers/.cvsignore, extra/inetutils/headers/ChangeLog, extra/inetutils/headers/Makefile.am, extra/inetutils/headers/arpa/ftp.h, extra/inetutils/headers/arpa/telnet.h, extra/inetutils/headers/arpa/tftp.h, extra/inetutils/headers/confpaths.h.in, extra/inetutils/headers/crypt.h, extra/inetutils/headers/err.h, extra/inetutils/headers/getopt.h, extra/inetutils/headers/obstack.h, extra/inetutils/headers/osockaddr.h, extra/inetutils/headers/paths.h, extra/inetutils/headers/poll.h, extra/inetutils/headers/protocols/talkd.h, extra/inetutils/headers/stamp-h.in, extra/inetutils/headers/syslog-int.h, extra/inetutils/headers/tftpsubs.h, extra/inetutils/ifconfig/.cvsignore, extra/inetutils/ifconfig/COMPATIBILITY, extra/inetutils/ifconfig/ChangeLog, extra/inetutils/ifconfig/Makefile.am, extra/inetutils/ifconfig/TODO, extra/inetutils/ifconfig/changeif.c, extra/inetutils/ifconfig/flags.c, extra/inetutils/ifconfig/flags.h, extra/inetutils/ifconfig/if_index.c, extra/inetutils/ifconfig/if_index.h, extra/inetutils/ifconfig/ifconfig.c, extra/inetutils/ifconfig/ifconfig.h, extra/inetutils/ifconfig/options.c, extra/inetutils/ifconfig/options.h, extra/inetutils/ifconfig/printif.c, extra/inetutils/ifconfig/printif.h, extra/inetutils/ifconfig/system.c, extra/inetutils/ifconfig/system.h, extra/inetutils/ifconfig/system/.cvsignore, extra/inetutils/ifconfig/system/Makefile.am, extra/inetutils/ifconfig/system/generic.c, extra/inetutils/ifconfig/system/generic.h, extra/inetutils/ifconfig/system/hpux.c, extra/inetutils/ifconfig/system/hpux.h, extra/inetutils/ifconfig/system/linux.c, extra/inetutils/ifconfig/system/linux.h, extra/inetutils/ifconfig/system/osf.c, extra/inetutils/ifconfig/system/osf.h, extra/inetutils/ifconfig/system/qnx.c, extra/inetutils/ifconfig/system/qnx.h, extra/inetutils/ifconfig/system/solaris.c, extra/inetutils/ifconfig/system/solaris.h, extra/inetutils/inetd/.cvsignore, extra/inetutils/inetd/ChangeLog, extra/inetutils/inetd/Makefile.am, extra/inetutils/inetd/inetd.8, extra/inetutils/inetd/inetd.c, extra/inetutils/libicmp/.cvsignore, extra/inetutils/libicmp/ChangeLog, extra/inetutils/libicmp/Makefile.am, extra/inetutils/libicmp/TODO, extra/inetutils/libicmp/icmp.h, extra/inetutils/libicmp/icmp_address.c, extra/inetutils/libicmp/icmp_cksum.c, extra/inetutils/libicmp/icmp_echo.c, extra/inetutils/libicmp/icmp_timestamp.c, extra/inetutils/libicmp/libping.c, extra/inetutils/libicmp/ping.h, extra/inetutils/libinetutils/.cvsignore, extra/inetutils/libinetutils/ChangeLog, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libinetutils/__progname.c, extra/inetutils/libinetutils/argcv.c, extra/inetutils/libinetutils/argcv.h, extra/inetutils/libinetutils/cleansess.c, extra/inetutils/libinetutils/daemon.c, extra/inetutils/libinetutils/des_rw.c, extra/inetutils/libinetutils/err.c, extra/inetutils/libinetutils/forkpty.c, extra/inetutils/libinetutils/getopt.c, extra/inetutils/libinetutils/getopt.h, extra/inetutils/libinetutils/getopt1.c, extra/inetutils/libinetutils/getpass.c, extra/inetutils/libinetutils/gettext.h, extra/inetutils/libinetutils/getusershell.c, extra/inetutils/libinetutils/herror.c, extra/inetutils/libinetutils/hstrerror.c, extra/inetutils/libinetutils/iruserok.c, extra/inetutils/libinetutils/kcmd.c, extra/inetutils/libinetutils/krcmd.c, extra/inetutils/libinetutils/localhost.c, extra/inetutils/libinetutils/login.c, extra/inetutils/libinetutils/login_tty.c, extra/inetutils/libinetutils/logout.c, extra/inetutils/libinetutils/logwtmp.c, extra/inetutils/libinetutils/logwtmpko.c, extra/inetutils/libinetutils/malloc.c, extra/inetutils/libinetutils/memcmp.c, extra/inetutils/libinetutils/memcpy.c, extra/inetutils/libinetutils/memmove.c, extra/inetutils/libinetutils/memset.c, extra/inetutils/libinetutils/obstack.c, extra/inetutils/libinetutils/obstack.h, extra/inetutils/libinetutils/openpty.c, extra/inetutils/libinetutils/opieclient.c, extra/inetutils/libinetutils/pathmax.h, extra/inetutils/libinetutils/poll.c, extra/inetutils/libinetutils/readstream.c, extra/inetutils/libinetutils/realloc.c, extra/inetutils/libinetutils/regex.c, extra/inetutils/libinetutils/regex.h, extra/inetutils/libinetutils/revoke.c, extra/inetutils/libinetutils/ruserok.c, extra/inetutils/libinetutils/setenv.c, extra/inetutils/libinetutils/setenv.h, extra/inetutils/libinetutils/setsig.c, extra/inetutils/libinetutils/snprintf.c, extra/inetutils/libinetutils/snprintf.h, extra/inetutils/libinetutils/strcasecmp.c, extra/inetutils/libinetutils/strdup.c, extra/inetutils/libinetutils/strerror.c, extra/inetutils/libinetutils/strsignal.c, extra/inetutils/libinetutils/stub_tgetent.c, extra/inetutils/libinetutils/syslog.c, extra/inetutils/libinetutils/tftpsubs.c, extra/inetutils/libinetutils/ttymsg.c, extra/inetutils/libinetutils/utmp_init.c, extra/inetutils/libinetutils/utmp_logout.c, extra/inetutils/libinetutils/waitpid.c, extra/inetutils/libinetutils/xalloc.h, extra/inetutils/libinetutils/xgetcwd.c, extra/inetutils/libinetutils/xgetcwd.h, extra/inetutils/libinetutils/xmalloc.c, extra/inetutils/libinetutils/xstrdup.c, extra/inetutils/libls/.cvsignore, extra/inetutils/libls/ChangeLog, extra/inetutils/libls/Makefile.am, extra/inetutils/libls/bsdport.c, extra/inetutils/libls/bsdport.h, extra/inetutils/libls/cmp.c, extra/inetutils/libls/extern.h, extra/inetutils/libls/fts.c, extra/inetutils/libls/fts.h, extra/inetutils/libls/ls.1, extra/inetutils/libls/ls.c, extra/inetutils/libls/ls.h, extra/inetutils/libls/print.c, extra/inetutils/libls/stat_flags.c, extra/inetutils/libls/util.c, extra/inetutils/libtelnet/.cvsignore, extra/inetutils/libtelnet/ChangeLog, extra/inetutils/libtelnet/Makefile.am, extra/inetutils/libtelnet/auth-proto.h, extra/inetutils/libtelnet/auth.c, extra/inetutils/libtelnet/auth.h, extra/inetutils/libtelnet/enc-proto.h, extra/inetutils/libtelnet/enc_des.c, extra/inetutils/libtelnet/encrypt.c, extra/inetutils/libtelnet/encrypt.h, extra/inetutils/libtelnet/forward.c, extra/inetutils/libtelnet/genget.c, extra/inetutils/libtelnet/getent.c, extra/inetutils/libtelnet/kerberos.c, extra/inetutils/libtelnet/kerberos5.c, extra/inetutils/libtelnet/key-proto.h, extra/inetutils/libtelnet/misc-proto.h, extra/inetutils/libtelnet/misc.c, extra/inetutils/libtelnet/misc.h, extra/inetutils/libtelnet/read_passwd.c, extra/inetutils/libtelnet/shishi.c, extra/inetutils/logger/.cvsignore, extra/inetutils/logger/ChangeLog, extra/inetutils/logger/Makefile.am, extra/inetutils/logger/logger.1, extra/inetutils/logger/logger.c, extra/inetutils/paths, extra/inetutils/ping/.cvsignore, extra/inetutils/ping/ChangeLog, extra/inetutils/ping/Makefile.am, extra/inetutils/ping/README.sec, extra/inetutils/ping/TODO, extra/inetutils/ping/ping.8, extra/inetutils/ping/ping.c, extra/inetutils/ping/ping_address.c, extra/inetutils/ping/ping_echo.c, extra/inetutils/ping/ping_impl.h, extra/inetutils/ping/ping_router.c, extra/inetutils/ping/ping_timestamp.c, extra/inetutils/rcp/.cvsignore, extra/inetutils/rcp/ChangeLog, extra/inetutils/rcp/Makefile.am, extra/inetutils/rcp/extern.h, extra/inetutils/rcp/rcp.1, extra/inetutils/rcp/rcp.c, extra/inetutils/rcp/util.c, extra/inetutils/rexecd/.cvsignore, extra/inetutils/rexecd/ChangeLog, extra/inetutils/rexecd/Makefile.am, extra/inetutils/rexecd/rexecd.8, extra/inetutils/rexecd/rexecd.c, extra/inetutils/rlogin/.cvsignore, extra/inetutils/rlogin/ChangeLog, extra/inetutils/rlogin/Makefile.am, extra/inetutils/rlogin/rlogin.1, extra/inetutils/rlogin/rlogin.c, extra/inetutils/rlogind/.cvsignore, extra/inetutils/rlogind/ChangeLog, extra/inetutils/rlogind/Makefile.am, extra/inetutils/rlogind/rlogind.8, extra/inetutils/rlogind/rlogind.c, extra/inetutils/rsh/.cvsignore, extra/inetutils/rsh/ChangeLog, extra/inetutils/rsh/Makefile.am, extra/inetutils/rsh/rsh.1, extra/inetutils/rsh/rsh.c, extra/inetutils/rshd/.cvsignore, extra/inetutils/rshd/ChangeLog, extra/inetutils/rshd/Makefile.am, extra/inetutils/rshd/rshd.8, extra/inetutils/rshd/rshd.c, extra/inetutils/syslogd/.cvsignore, extra/inetutils/syslogd/ChangeLog, extra/inetutils/syslogd/Makefile.am, extra/inetutils/syslogd/README.sec, extra/inetutils/syslogd/syslog.conf.5, extra/inetutils/syslogd/syslogd.8, extra/inetutils/syslogd/syslogd.c, extra/inetutils/talk/.cvsignore, extra/inetutils/talk/ChangeLog, extra/inetutils/talk/Makefile.am, extra/inetutils/talk/ctl.c, extra/inetutils/talk/ctl_transact.c, extra/inetutils/talk/display.c, extra/inetutils/talk/get_addrs.c, extra/inetutils/talk/get_names.c, extra/inetutils/talk/init_disp.c, extra/inetutils/talk/invite.c, extra/inetutils/talk/io.c, extra/inetutils/talk/look_up.c, extra/inetutils/talk/msgs.c, extra/inetutils/talk/talk.1, extra/inetutils/talk/talk.c, extra/inetutils/talk/talk.h, extra/inetutils/talk/talk_ctl.h, extra/inetutils/talkd/.cvsignore, extra/inetutils/talkd/ChangeLog, extra/inetutils/talkd/Makefile.am, extra/inetutils/talkd/README.sec, extra/inetutils/talkd/acl.c, extra/inetutils/talkd/announce.c, extra/inetutils/talkd/intalkd.h, extra/inetutils/talkd/print.c, extra/inetutils/talkd/process.c, extra/inetutils/talkd/table.c, extra/inetutils/talkd/talkd.8, extra/inetutils/talkd/talkd.c, extra/inetutils/telnet/.cvsignore, extra/inetutils/telnet/ChangeLog, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnet/README.sec, extra/inetutils/telnet/authenc.c, extra/inetutils/telnet/commands.c, extra/inetutils/telnet/defines.h, extra/inetutils/telnet/externs.h, extra/inetutils/telnet/fdset.h, extra/inetutils/telnet/general.h, extra/inetutils/telnet/krb4-proto.h, extra/inetutils/telnet/main.c, extra/inetutils/telnet/network.c, extra/inetutils/telnet/ring.c, extra/inetutils/telnet/ring.h, extra/inetutils/telnet/shishi-telnet.1, extra/inetutils/telnet/sys_bsd.c, extra/inetutils/telnet/telnet.1, extra/inetutils/telnet/telnet.c, extra/inetutils/telnet/terminal.c, extra/inetutils/telnet/tn3270.c, extra/inetutils/telnet/types.h, extra/inetutils/telnet/utilities.c, extra/inetutils/telnetd/.cvsignore, extra/inetutils/telnetd/ChangeLog, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/README.sec, extra/inetutils/telnetd/pty.c, extra/inetutils/telnetd/shishi-telnetd.8, extra/inetutils/telnetd/slc.c, extra/inetutils/telnetd/state.c, extra/inetutils/telnetd/telnetd.8, extra/inetutils/telnetd/telnetd.c, extra/inetutils/telnetd/telnetd.h, extra/inetutils/telnetd/term.c, extra/inetutils/telnetd/termstat.c, extra/inetutils/telnetd/utility.c, extra/inetutils/tftp/.cvsignore, extra/inetutils/tftp/ChangeLog, extra/inetutils/tftp/Makefile.am, extra/inetutils/tftp/extern.h, extra/inetutils/tftp/main.c, extra/inetutils/tftp/tftp.1, extra/inetutils/tftp/tftp.c, extra/inetutils/tftpd/.cvsignore, extra/inetutils/tftpd/ChangeLog, extra/inetutils/tftpd/Makefile.am, extra/inetutils/tftpd/tftpd.8, extra/inetutils/tftpd/tftpd.c, extra/inetutils/uucpd/.cvsignore, extra/inetutils/uucpd/ChangeLog, extra/inetutils/uucpd/Makefile.am, extra/inetutils/uucpd/uucpd.c, extra/inetutils/whois/.cvsignore, extra/inetutils/whois/ChangeLog, extra/inetutils/whois/Makefile.am, extra/inetutils/whois/main.c, extra/inetutils/whois/net.c, extra/inetutils/whois/whois-servers: Remove (we support this by sending patches instead). 2003-07-10 Simon Josefsson * po/Makevars: Update. 2003-07-10 Simon Josefsson * configure.ac: Revert part of last patch. 2003-07-10 Simon Josefsson * extra/README: Add. 2003-07-10 Simon Josefsson * tests/Makefile.am: Add libidn -I's. 2003-07-10 Simon Josefsson * tests/utils.c: Remove unused die(). 2003-07-10 Simon Josefsson * src/shishi.c: Define program_name (for gnulib). 2003-07-10 Simon Josefsson * src/authp.c, src/client.c, src/data.h, src/server.c, src/shishi.c: Use gnulib's error() instead of ad-hoc die(). 2003-07-10 Simon Josefsson * src/shishid.c: Use LOG_DAEMON instead of LOG_AUTHPRIV (make this configurable?). 2003-07-10 Simon Josefsson * extra/inetutils/libinetutils/xmalloc.c, lib/shishi.h.in: Fix typo. 2003-07-10 Simon Josefsson * doc/reference/Makefile.am: Try to be more portable. 2003-07-10 Simon Josefsson * configure.ac, extra/Makefile.am: Don't ship with inetutils (too much portability problems). 2003-07-10 Simon Josefsson * gl/Makefile.am: Add strchrnul.h. 2003-07-10 Simon Josefsson * gl/Makefile.am: Add mempcpy.h. 2003-07-10 Simon Josefsson * gl/Makefile.am: Add -I../intl for libintl.h in gettext.h. 2003-07-10 Simon Josefsson * src/Makefile.am: Fix gnulib. 2003-07-10 Simon Josefsson * configure.ac: Disable libgcrypt ld script (requires too modern ld). 2003-07-10 Simon Josefsson * crypto/ChangeLog, crypto/NEWS, crypto/README, crypto/TODO, crypto/cipher/ChangeLog, crypto/cipher/Makefile.am, crypto/cipher/ac.c, crypto/cipher/arcfour.c, crypto/cipher/blowfish.c, crypto/cipher/cast5.c, crypto/cipher/cipher.c, crypto/cipher/crc.c, crypto/cipher/des.c, crypto/cipher/dsa.c, crypto/cipher/elgamal.c, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/pubkey.c, crypto/cipher/rijndael.c, crypto/cipher/rmd160.c, crypto/cipher/rsa.c, crypto/cipher/sha1.c, crypto/cipher/sha256.c, crypto/cipher/sha512.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/doc/ChangeLog, crypto/doc/gcrypt.texi, crypto/scripts/ChangeLog, crypto/src/ChangeLog, crypto/src/cipher.h, crypto/src/g10lib.h, crypto/src/gcrypt.h, crypto/src/module.c, crypto/src/sexp.c, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/ac.c, crypto/tests/register.c: Upstream update. 2003-07-10 Simon Josefsson * lib/Makefile.am: Remove GNU Make specific idiom. 2003-07-10 Simon Josefsson * gl/m4/Makefile.am: Add. 2003-07-10 Simon Josefsson * lib/rfc1510bis.asn1: Update from draft (plus syntax hacks for libtasn1's parser). 2003-07-10 Simon Josefsson * configure.ac: Check for sys/types.h earlier. Add Gnulib tests. 2003-07-10 Simon Josefsson * gl/alloca_.h, gl/argp-ba.c, gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-fmtstream.h, gl/argp-fs-xinl.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c, gl/argp.h, gl/m4/argp.m4, gl/m4/mempcpy.m4, gl/m4/strndup.m4, gl/m4/strnlen.m4, gl/mempcpy.c, gl/mempcpy.h, gl/strndup.c, gl/strnlen.c: Update. 2003-07-08 Simon Josefsson * NEWS: Add. 2003-07-08 Simon Josefsson * lib/crypto-des.c, lib/crypto.c, lib/encapreppart.c, lib/shishi.h.in: Fix. 2003-07-08 Simon Josefsson * lib/asn1.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c, lib/shishi.h.in, po/shishi.pot, po/sv.po: Cleanup DES crypto (at last!). 2003-07-08 Simon Josefsson * lib/kdc.c: Fix typo. 2003-07-08 Simon Josefsson * lib/crypto-des.c, lib/crypto.c: Better errors. 2003-07-08 Simon Josefsson * lib/crypto-3des.c: Fix mem leak. 2003-07-08 Simon Josefsson * lib/Makefile.am, lib/asn1.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/kdc.c: Fixes. 2003-07-08 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto-null.c, lib/crypto.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/krberror.c, lib/principal.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c, lib/tkts.c: Indent. 2003-07-08 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/krberror.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c, lib/tkts.c: Cleanup. 2003-07-08 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/enckdcreppart.c, lib/error.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/safe.c, lib/shishi.h.in, lib/ticket.c, src/crypto.c: Crypto functions now allocate output buffers. Fix callers. 2003-07-07 Simon Josefsson * lib/apreq.c: Waste less stack. 2003-07-07 Simon Josefsson * gl/argp.h: Sync. 2003-07-07 Simon Josefsson * crypto/cipher/Makefile.am, crypto/cipher/md.c, crypto/doc/gcrypt.texi, crypto/src/sexp.c, crypto/tests/Makefile.am, crypto/tests/basic.c: Fixes. 2003-07-06 Simon Josefsson * lib/Makefile.am: Fix includes. Make distcheck works under debian now. 2003-07-06 Simon Josefsson * configure.ac: Build gl/m4/Makefile. 2003-07-06 Simon Josefsson * gl/Makefile.am: Recurse into m4/. 2003-07-06 Simon Josefsson * crypto/cipher/Makefile.am: Dist fixes. 2003-07-06 Simon Josefsson * errcrypto/ChangeLog, errcrypto/src/gpg-error.h: Update upstream. 2003-07-06 Simon Josefsson * shishi.conf.in: Fix. 2003-07-06 Simon Josefsson * lib/shishi.h.in: Add. 2003-07-06 Simon Josefsson * lib/asn1.c: Add shishi_asn1_write_bitstring (broken). 2003-07-06 Simon Josefsson * lib/apreq.c: Fix ASN.1 writing. 2003-07-06 Simon Josefsson * lib/aprep.c: Fix crash. 2003-07-05 Simon Josefsson * m4/Makefile.am: More EXTRA_DIST's. 2003-07-05 Simon Josefsson * errcrypto/po/.cvsignore: [no log message] 2003-07-05 Simon Josefsson * Makefile.am: Update release target. 2003-07-05 Simon Josefsson * NEWS: Add. 2003-07-05 Simon Josefsson * configure.ac: Bump version. 2003-07-05 Simon Josefsson * crypto/cipher/Makefile.am: Fix EXTRA_DIST's. 2003-07-05 Simon Josefsson * crypto/cipher/md.c: Fix bug. 2003-07-05 Simon Josefsson * crypto/cipher/.cvsignore, crypto/src/.cvsignore, crypto/tests/.cvsignore, errcrypto/.cvsignore, errcrypto/m4/.cvsignore, errcrypto/po/.cvsignore, errcrypto/src/.cvsignore, errcrypto/tests/.cvsignore: [no log message] 2003-07-05 Simon Josefsson * configure.ac: Fix includes. 2003-07-05 Simon Josefsson * Makefile.am: Build errcrypto. 2003-07-05 Simon Josefsson * configure.ac: Configure errcrypto. 2003-07-05 Simon Josefsson * crypto/configure.ac: Quick hack to get paths to libgpg-error into Makefile's. 2003-07-05 Simon Josefsson * errcrypto/AUTHORS, errcrypto/COPYING, errcrypto/COPYING.LIB, errcrypto/ChangeLog, errcrypto/INSTALL, errcrypto/Makefile.am, errcrypto/NEWS, errcrypto/README, errcrypto/README.CVS, errcrypto/configure.ac, errcrypto/m4/ChangeLog, errcrypto/m4/Makefile.am, errcrypto/po/ChangeLog, errcrypto/po/LINGUAS, errcrypto/po/Makevars, errcrypto/po/POTFILES.in, errcrypto/src/Makefile.am, errcrypto/src/code-from-errno.c, errcrypto/src/code-to-errno.c, errcrypto/src/err-codes.h.in, errcrypto/src/err-sources.h.in, errcrypto/src/errnos.in, errcrypto/src/gettext.h, errcrypto/src/gpg-error-config.in, errcrypto/src/gpg-error.h, errcrypto/src/gpg-error.m4, errcrypto/src/mkerrcodes1.awk, errcrypto/src/mkerrcodes2.awk, errcrypto/src/mkerrnos.awk, errcrypto/src/mkstrtable.awk, errcrypto/src/strerror.c, errcrypto/src/strsource.c, errcrypto/tests/Makefile.am, errcrypto/tests/t-strerror.c: Add (libgcrypt requires this...). 2003-07-05 Simon Josefsson * crypto/AUTHORS, crypto/ChangeLog, crypto/NEWS, crypto/README, crypto/acinclude.m4, crypto/cipher/ChangeLog, crypto/cipher/Makefile.am, crypto/cipher/ac.c, crypto/cipher/arcfour.c, crypto/cipher/blowfish.c, crypto/cipher/cast5.c, crypto/cipher/cipher.c, crypto/cipher/crc.c, crypto/cipher/des.c, crypto/cipher/dsa.c, crypto/cipher/elgamal.c, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/primegen.c, crypto/cipher/pubkey.c, crypto/cipher/rand-internal.h, crypto/cipher/random.c, crypto/cipher/random.h, crypto/cipher/rijndael.c, crypto/cipher/rmd.h, crypto/cipher/rmd160.c, crypto/cipher/rmd160test.c, crypto/cipher/rndegd.c, crypto/cipher/rndlinux.c, crypto/cipher/rndunix.c, crypto/cipher/rndw32.c, crypto/cipher/rsa.c, crypto/cipher/sha1.c, crypto/cipher/sha256.c, crypto/cipher/sha512.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/configure.ac, crypto/doc/ChangeLog, crypto/doc/gcrypt.texi, crypto/mpi/ChangeLog, crypto/mpi/Makefile.am, crypto/mpi/longlong.h, crypto/mpi/mpi-add.c, crypto/mpi/mpi-bit.c, crypto/mpi/mpi-cmp.c, crypto/mpi/mpi-div.c, crypto/mpi/mpi-gcd.c, crypto/mpi/mpi-inline.h, crypto/mpi/mpi-internal.h, crypto/mpi/mpi-inv.c, crypto/mpi/mpi-mpow.c, crypto/mpi/mpi-mul.c, crypto/mpi/mpi-pow.c, crypto/mpi/mpi-scan.c, crypto/mpi/mpicoder.c, crypto/mpi/mpih-div.c, crypto/mpi/mpiutil.c, crypto/mpi/powerpc32/syntax.h, crypto/src/ChangeLog, crypto/src/Makefile.am, crypto/src/ath.c, crypto/src/ath.h, crypto/src/benchmark.c, crypto/src/cipher.h, crypto/src/g10lib.h, crypto/src/gcrypt.h, crypto/src/global.c, crypto/src/libgcrypt-config.in, crypto/src/misc.c, crypto/src/missing-string.c, crypto/src/module.c, crypto/src/mpi.h, crypto/src/secmem.c, crypto/src/secmem.h, crypto/src/sexp.c, crypto/src/stdmem.c, crypto/src/testapi.c, crypto/src/types.h, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/ac.c, crypto/tests/basic.c, crypto/tests/keygen.c, crypto/tests/pubkey.c, crypto/tests/register.c, crypto/tests/tsexp.c: Sync with upstream. 2003-07-05 Simon Josefsson * lib/apreq.c, lib/asn1.c, lib/shishi.h.in, lib/tkt.c: Add generic ASN.1 bitstring, and use it. 2003-07-05 Simon Josefsson * lib/apreq.c: Fix the AP-REQ ap-options. 2003-07-05 Simon Josefsson * lib/ap.c: (shishi_ap_req_process): Be verbose. 2003-07-04 Simon Josefsson * lib/aprep.c: Fix typo. 2003-07-04 Simon Josefsson * lib/enckdcreppart.c: Waste less stack. 2003-07-04 Simon Josefsson * lib/encapreppart.c: Waste less stack. 2003-07-04 Simon Josefsson * lib/crypto-3des.c: Memory leak fix. 2003-07-04 Simon Josefsson * lib/authenticator.c: Use proper API. 2003-07-04 Simon Josefsson * lib/aprep.c, lib/apreq.c: Use proper API. 2003-07-04 Simon Josefsson * lib/aprep.c: Revert last change (no new API for asn1_field(), sigh). 2003-07-04 Simon Josefsson * lib/internal.h: Include gnulib stuff. 2003-07-04 Simon Josefsson * lib/ap.c, lib/aprep.c: Use new API. 2003-07-04 Simon Josefsson * lib/Makefile.am, lib/setenv.c: Really remove old AC_LIBOBJ stuff. 2003-07-04 Simon Josefsson * lib/crypto-des.c: Remove debugging code. 2003-07-04 Simon Josefsson * gl/argp-help.c: Define strchrnul, f{,un}lockfile if not defined. (Perhaps not the right thing, check and forward patch to libc/gnulib later.) 2003-07-04 Simon Josefsson * lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/enckdcreppart.c, lib/error.c, lib/kdcrep.c, lib/krberror.c, lib/principal.c, lib/ticket.c, lib/tkt.c, lib/tkts.c, lib/vasprintf.c: Fixes for gnulib. 2003-07-04 Simon Josefsson * lib/crypto-des.c, lib/crypto.c, lib/pkcs5.c: Compile with libgcrypt 1.1.13. 2003-07-04 Simon Josefsson * src/authp.c, src/client.c, src/server.c, src/shishi.c: Gnulib fixes. 2003-07-04 Simon Josefsson * lib/Makefile.am: More gnulib fixes. 2003-07-04 Simon Josefsson * lib/Makefile.am, lib/gethostname.c, lib/memmove.c, lib/memset.c, lib/setenv.h, lib/strcasecmp.c, lib/strdup.c, lib/strerror.c, lib/unsetenv.c: Obsolete some AC_LIBOBJ with gnulib. 2003-07-04 Simon Josefsson * src/Makefile.am: Replace ARGP stuff with gnulib. 2003-07-04 Simon Josefsson * argp/.cvsignore, gl/.cvsignore, m4/.cvsignore, po/.cvsignore: [no log message] 2003-07-04 Simon Josefsson * configure.ac: Reorder to avoid warnings. 2003-07-04 Simon Josefsson * Makefile.am, argp/Makefile.am, argp/Versions, argp/acinclude.m4, argp/argp-ba.c, argp/argp-eexst.c, argp/argp-fmtstream.c, argp/argp-fmtstream.h, argp/argp-fs-xinl.c, argp/argp-help.c, argp/argp-namefrob.h, argp/argp-parse.c, argp/argp-pv.c, argp/argp-pvh.c, argp/argp-test.c, argp/argp-xinl.c, argp/argp.h, argp/config.h.in, argp/configure.ac, argp/libargp.m4, argp/mempcpy.c, argp/strchrnul.c, argp/strndup.c, configure.ac, gl/.cvsignore, gl/Makefile.am, gl/alloca.c, gl/alloca_.h, gl/argp-ba.c, gl/argp-eexst.c, gl/argp-fmtstream.c, gl/argp-fmtstream.h, gl/argp-fs-xinl.c, gl/argp-help.c, gl/argp-namefrob.h, gl/argp-parse.c, gl/argp-pv.c, gl/argp-pvh.c, gl/argp-xinl.c, gl/argp.h, gl/asnprintf.c, gl/asprintf.c, gl/error.c, gl/error.h, gl/gethostname.c, gl/getopt.c, gl/getopt.h, gl/getopt1.c, gl/gettext.h, gl/m4/.cvsignore, gl/m4/Makefile.am, gl/m4/alloca.m4, gl/m4/argp.m4, gl/m4/codeset.m4, gl/m4/error.m4, gl/m4/gethostname.m4, gl/m4/getopt.m4, gl/m4/gettext.m4, gl/m4/glibc21.m4, gl/m4/iconv.m4, gl/m4/intdiv0.m4, gl/m4/intmax_t.m4, gl/m4/inttypes-pri.m4, gl/m4/inttypes.m4, gl/m4/inttypes_h.m4, gl/m4/isc-posix.m4, gl/m4/lcmessage.m4, gl/m4/lib-ld.m4, gl/m4/lib-link.m4, gl/m4/lib-prefix.m4, gl/m4/longdouble.m4, gl/m4/longlong.m4, gl/m4/malloc.m4, gl/m4/memmove.m4, gl/m4/memset.m4, gl/m4/nls.m4, gl/m4/onceonly_2_57.m4, gl/m4/po.m4, gl/m4/progtest.m4, gl/m4/realloc.m4, gl/m4/setenv.m4, gl/m4/signed.m4, gl/m4/stdint_h.m4, gl/m4/strcase.m4, gl/m4/strchrnul.m4, gl/m4/strdup.m4, gl/m4/strerror.m4, gl/m4/strerror_r.m4, gl/m4/sysexits.m4, gl/m4/uintmax_t.m4, gl/m4/ulonglong.m4, gl/m4/unlocked-io.m4, gl/m4/vasnprintf.m4, gl/m4/vasprintf.m4, gl/m4/wchar_t.m4, gl/m4/wint_t.m4, gl/m4/xalloc.m4, gl/malloc.c, gl/memmove.c, gl/memset.c, gl/printf-args.c, gl/printf-args.h, gl/printf-parse.c, gl/printf-parse.h, gl/realloc.c, gl/setenv.c, gl/setenv.h, gl/strcase.h, gl/strcasecmp.c, gl/strchrnul.c, gl/strchrnul.h, gl/strdup.c, gl/strerror.c, gl/strncasecmp.c, gl/sysexit_.h, gl/unlocked-io.h, gl/unsetenv.c, gl/vasnprintf.c, gl/vasnprintf.h, gl/vasprintf.c, gl/vasprintf.h, gl/xalloc.h, gl/xmalloc.c, gl/xstrdup.c, lib/Makefile.am: Add gnulib compatibility functions. Remove argp (replaced by gnulib argp module). 2003-07-04 Simon Josefsson * lib/tkt.c: (shishi_tkt_key): Retrieve key from encticketpart too. 2003-06-27 Simon Josefsson * lib/ap.c: Check for asn1 error. 2003-06-25 Simon Josefsson * doc/specifications/draft-weber-krb-wg-kerberos-initial-authenticati on-00.txt: Add. 2003-06-24 Simon Josefsson * doc/specifications/draft-weber-krb-wg-kerberos-clock-synchronizatio n-00.txt, doc/specifications/draft-weber-krb-wg-kerberos-clock-synchronizatio n-01.txt: Add. 2003-06-21 Simon Josefsson * doc/specifications/draft-raeburn-krb-rijndael-krb-05.txt: Add. 2003-06-21 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-04.txt: Add. 2003-06-12 Simon Josefsson * doc/shishi.texi: Add. 2003-06-12 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-crypto-05.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-04.txt: Add. 2003-06-02 Simon Josefsson * ChangeLog: [no log message] 2003-06-02 Simon Josefsson * tests/Makefile.am: Remove ticketset for now. 2003-06-02 Simon Josefsson * NEWS: Version 0.0.0. 2003-06-02 Simon Josefsson * Makefile.am: Add release target. 2003-06-02 Simon Josefsson * lib/crypto.c: Add DES encrypt/decrypt without checksum. Add dummy checksum. 2003-06-02 Simon Josefsson * lib/crypto-des.c: Add DES encrypt/decrypt without checksum. 2003-06-02 Simon Josefsson * lib/shishi.h.in: Fix NONE ciphers. 2003-05-27 Simon Josefsson * doc/Makefile.am: Add encapreppart functions to AP section. 2003-05-26 Simon Josefsson * lib/aprep.c, lib/apreq.c: Fix a2d. 2003-05-26 Simon Josefsson * lib/encapreppart.c, lib/shishi.h.in: Add shishi_encapreppart_seqnumber_get. 2003-05-26 Simon Josefsson * lib/crypto-3des.c, lib/crypto.c, lib/shishi.h.in: Add 3des-none. Add encrypt/decrypt with specific etype. 2003-05-25 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/shishi.h.in: Add shishi_{en,de}crypt_iv(). 2003-05-24 Simon Josefsson * lib/shishi.h.in: Fix typo. 2003-05-24 Simon Josefsson * lib/shishi.h.in: Add GSS keyusage constants. 2003-05-18 Simon Josefsson * lib/authenticator.c: Fix. 2003-05-11 Simon Josefsson * lib/ap.c, lib/shishi.h.in: Add shishi_ap_req_der_new. 2003-05-08 Simon Josefsson * lib/Makefile.am: Fix asn1Parser. 2003-05-08 Simon Josefsson * doc/Makefile.am: Remove GSS stuff. 2003-05-08 Simon Josefsson * configure.ac: Check for asn1Parser. 2003-05-08 Simon Josefsson * lib/tkts.c: Add. 2003-05-08 Simon Josefsson * lib/init.c: Fix doc. 2003-05-07 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-set-passwd-00.txt: Add. 2003-05-01 Simon Josefsson * Makefile.am, README, configure.ac, gss/.cvsignore, gss/Makefile.am, gss/context.c, gss/cred.c, gss/gssapi.h, gss/internal.h, gss/misc.c, gss/msg.c, gss/name.c, gss/obsolete.c, gss/oid.c, shishi-gss.pc.in, tests/Makefile.am: Remove GSS stuff (moved to separate project). 2003-05-01 Simon Josefsson * doc/shishi.texi: Remove GSS stuff. 2003-05-01 Simon Josefsson * gss/context.c, gss/gssapi.h, gss/name.c: Add. 2003-05-01 Simon Josefsson * shishi-gss.pc.in: Add. 2003-05-01 Simon Josefsson * Makefile.am: Add shishi-gss.pc*. 2003-05-01 Simon Josefsson * configure.ac: Build shishi-gss.pc. 2003-05-01 Simon Josefsson * gss/context.c, gss/cred.c, gss/internal.h, gss/misc.c, gss/msg.c, gss/name.c: Add. 2003-05-01 Simon Josefsson * doc/gdoc: Escape { and }. 2003-05-01 Simon Josefsson * doc/shishi.texi: Fix. 2003-05-01 Simon Josefsson * gss/obsolete.c: Warn obsolete applications. 2003-05-01 Simon Josefsson * gss/internal.h: Fix. 2003-05-01 Simon Josefsson * gss/context.c, gss/cred.c, gss/gssapi.h, gss/internal.h, gss/misc.c, gss/msg.c, gss/name.c, gss/obsolete.c, gss/oid.c: Indent. 2003-05-01 Simon Josefsson * gss/.cvsignore: [no log message] 2003-05-01 Simon Josefsson * gss/Makefile.am, gss/obsolete.c: Add. 2003-05-01 Simon Josefsson * Makefile.am: Indent in gss/. 2003-05-01 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Add. 2003-05-01 Simon Josefsson * gss/gssapi.h: Fix. 2003-05-01 Simon Josefsson * gss/.cvsignore, gss/Makefile.am, gss/misc.c: Add. 2003-05-01 Simon Josefsson * gss/gssapi.h: Prototype fixes (RFC is buggy). 2003-05-01 Simon Josefsson * gss/Makefile.am, gss/context.c, gss/cred.c, gss/msg.c: Add. 2003-05-01 Simon Josefsson * gss/gssapi.h: Prototype fixes (RFC is buggy). 2003-05-01 Simon Josefsson * gss/.cvsignore: [no log message] 2003-04-30 Simon Josefsson * README: Add gss/. 2003-04-30 Simon Josefsson * AUTHORS, NEWS: Fix. 2003-04-30 Simon Josefsson * Makefile.am, configure.ac, doc/Makefile.am, doc/shishi.texi, gss/.cvsignore, gss/Makefile.am, gss/internal.h, gss/name.c, gss/oid.c, tests/.cvsignore, tests/Makefile.am, tests/gss.c: Add framework for GSS-API support. 2003-04-30 Simon Josefsson * tests/authenticator.c, tests/crypto.c, tests/gztime.c, tests/ticketset.c, tests/utils.c: Move include of shishi.h from utils.c to each file. 2003-04-30 Simon Josefsson * lib/internal.h: Typo. 2003-04-30 Simon Josefsson * gss/gssapi.h: Add copying conditions. Add * to minor_status in prototypes (RFC is buggy). 2003-04-30 Simon Josefsson * gss/gssapi.h: Last commit was corrupt. Never use xom.h. Define gss_ctx_id_t, gss_cred_id_t, gss_name_t, and gss_uint32. Fix routine errors. 2003-04-30 Simon Josefsson * gss/gssapi.h: Verbatim from RFC 2744. 2003-04-30 Simon Josefsson * doc/specifications/rfc1961.txt, doc/specifications/rfc2025.txt, doc/specifications/rfc2478.txt, doc/specifications/rfc2479.txt, doc/specifications/rfc2853.txt: Add. 2003-04-18 Simon Josefsson * doc/shishi.texi: Fix info dir entry. 2003-04-16 Simon Josefsson * ANNOUNCE: Mention devices it runs on. 2003-04-15 Simon Josefsson * Makefile.am: Use new cvs2cl. 2003-03-29 Simon Josefsson * lib/kdcreq.c: Use new allocating a2d. 2003-03-26 Simon Josefsson * src/shishid.c: Add comment. 2003-03-26 Simon Josefsson * lib/asn1.c, lib/kdc.c, lib/shishi.h.in: Add new allocating a2d functions and use them. 2003-03-26 Simon Josefsson * lib/crypto-des.c: Use new libgcrypt CBC-MAC interface. 2003-03-26 Simon Josefsson * asn1/ChangeLog, asn1/NEWS, asn1/configure.in, asn1/doc/asn1.tex, asn1/lib/ASN1.c, asn1/lib/coding.c, asn1/lib/decoding.c, asn1/lib/element.c, asn1/lib/errors.c, asn1/lib/errors_int.h, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/lib/parser_aux.c, asn1/lib/structure.c, asn1/src/CertificateExample.c, asn1/src/CrlExample.c, asn1/src/asn1Coding.c, asn1/tests/Test_parser.asn, asn1/tests/Test_parser.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c, asn1/tests/Test_tree_asn1_tab.c, crypto/AUTHORS, crypto/ChangeLog, crypto/NEWS, crypto/THANKS, crypto/TODO, crypto/cipher/ChangeLog, crypto/cipher/arcfour.c, crypto/cipher/blowfish.c, crypto/cipher/cast5.c, crypto/cipher/cipher.c, crypto/cipher/des.c, crypto/cipher/dynload.c, crypto/cipher/dynload.h, crypto/cipher/elgamal.c, crypto/cipher/elgamal.h, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/primegen.c, crypto/cipher/pubkey.c, crypto/cipher/random.c, crypto/cipher/rijndael.c, crypto/cipher/rmd160.c, crypto/cipher/rsa.c, crypto/cipher/rsa.h, crypto/cipher/sha1.c, crypto/cipher/sha256.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/doc/ChangeLog, crypto/doc/gcrypt.texi, crypto/scripts/ChangeLog, crypto/scripts/autogen.sh, crypto/src/ChangeLog, crypto/src/cipher.h, crypto/src/g10lib.h, crypto/src/gcrypt.h, crypto/src/global.c, crypto/src/misc.c, crypto/src/secmem.c, crypto/src/secmem.h, crypto/src/sexp.c, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/basic.c, crypto/tests/keygen.c, crypto/tests/pubkey.c: Upstream sync. 2003-03-20 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-crypto-04.txt: Add. 2003-03-14 Simon Josefsson * tests/crypto.c: Fix debug output, spotted by Marcus Watts . 2003-03-07 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-03.txt: Add. 2003-02-24 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-crypto-03.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-03.txt: New. 2003-02-19 Simon Josefsson * asn1/NEWS, asn1/configure.in, asn1/lib/ASN1.c, asn1/lib/decoding.c, asn1/lib/element.c, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/lib/structure.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c: Upstream update. 2003-02-12 Simon Josefsson * extra/inetutils/ChangeLog, extra/inetutils/Makefile.am, extra/inetutils/NEWS, extra/inetutils/autogen.sh, extra/inetutils/configure.ac, extra/inetutils/libinetutils/ChangeLog, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libinetutils/getopt.c, extra/inetutils/libinetutils/getopt.h, extra/inetutils/libinetutils/getopt1.c, extra/inetutils/libinetutils/getpass.c, extra/inetutils/libinetutils/gettext.h, extra/inetutils/libinetutils/getusershell.c, extra/inetutils/libinetutils/iruserok.c, extra/inetutils/libinetutils/malloc.c, extra/inetutils/libinetutils/memcmp.c, extra/inetutils/libinetutils/memcpy.c, extra/inetutils/libinetutils/memmove.c, extra/inetutils/libinetutils/memset.c, extra/inetutils/libinetutils/obstack.c, extra/inetutils/libinetutils/obstack.h, extra/inetutils/libinetutils/pathmax.h, extra/inetutils/libinetutils/realloc.c, extra/inetutils/libinetutils/setenv.c, extra/inetutils/libinetutils/setenv.h, extra/inetutils/libinetutils/strcasecmp.c, extra/inetutils/libinetutils/strdup.c, extra/inetutils/libinetutils/strerror.c, extra/inetutils/libinetutils/xalloc.h, extra/inetutils/libinetutils/xgetcwd.c, extra/inetutils/libinetutils/xgetcwd.h, extra/inetutils/libinetutils/xmalloc.c, extra/inetutils/libinetutils/xstrdup.c, extra/inetutils/libtelnet/ChangeLog, extra/inetutils/libtelnet/Makefile.am, extra/inetutils/libtelnet/auth-proto.h, extra/inetutils/libtelnet/auth.c, extra/inetutils/libtelnet/auth.h, extra/inetutils/libtelnet/kerberos.c, extra/inetutils/libtelnet/kerberos5.c, extra/inetutils/libtelnet/misc.c, extra/inetutils/libtelnet/shishi.c, extra/inetutils/ping/ChangeLog, extra/inetutils/ping/Makefile.am, extra/inetutils/ping/ping.c, extra/inetutils/ping/ping_echo.c, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnet/commands.c, extra/inetutils/telnetd/ChangeLog, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/state.c: Upstream update. 2003-02-12 Simon Josefsson * lib/safe.c: Make it work. 2003-02-11 Simon Josefsson * lib/tkt.c: Use new ASN.1 API. 2003-02-11 Simon Josefsson * lib/kdcreq.c: Use new ASN.1 and principal APIs. 2003-02-11 Simon Josefsson * lib/kdcrep.c: Use new principal API. 2003-02-11 Simon Josefsson * lib/principal.c: Add *_set(). 2003-02-11 Simon Josefsson * lib/encapreppart.c: Doc fixes. Use new ASN.1 APIs. 2003-02-11 Simon Josefsson * lib/asn1.c: Fix integer functions. 2003-02-11 Simon Josefsson * tests/authenticator.c, tests/gztime.c, tests/ticketset.c: Indent. 2003-02-11 Simon Josefsson * tests/Makefile.am: Add authenticator and gztime. Remove asn1 CFLAGS. 2003-02-11 Simon Josefsson * tests/.cvsignore: [no log message] 2003-02-11 Simon Josefsson * tests/utils.c: Fix prototypes. 2003-02-11 Simon Josefsson * tests/authenticator.c: Add. 2003-02-11 Simon Josefsson * lib/authenticator.c: Cleanups. 2003-02-11 Simon Josefsson * tests/gztime.c: Add. 2003-02-11 Simon Josefsson * lib/gztime.c: Make it work again. 2003-02-11 Simon Josefsson * lib/gztime.c: Fix prototypes. 2003-02-11 Simon Josefsson * lib/shishi.h.in: Add. Fix prototypes. 2003-02-11 Simon Josefsson * tests/ticketset.c: Fix title. 2003-02-11 Simon Josefsson * lib/tkts.c: Fix. 2003-02-11 Simon Josefsson * crypto/.cvsignore, crypto/scripts/.cvsignore, extra/inetutils/rsh/.cvsignore, extra/inetutils/telnetd/.cvsignore: Add. 2003-02-11 Simon Josefsson * crypto/.cvsignore, crypto/cipher/.cvsignore, crypto/doc/.cvsignore, crypto/mpi/.cvsignore, crypto/src/.cvsignore, crypto/tests/.cvsignore, crypto/w32-dll/.cvsignore, extra/inetutils/doc/.cvsignore: Add. 2003-02-11 Simon Josefsson * crypto/INSTALL, crypto/scripts/.cvsignore, crypto/scripts/config.guess, crypto/scripts/config.sub, crypto/scripts/install-sh, crypto/scripts/missing, crypto/scripts/mkinstalldirs: Fix. 2003-02-11 Simon Josefsson * Makefile.am: Allow use of external libtasn1. 2003-02-11 Simon Josefsson * configure.ac, lib/Makefile.am: Allow use of external libtasn1. Remove *_BUILD_* junk for pkg-config. 2003-02-11 Simon Josefsson * shishi.pc.in: CFLAGS for libgcrypt not needed to use shishi. Let libtool handle library dependencies. 2003-02-11 Simon Josefsson * configure.ac: We need libgcrypt >1.1.13. 2003-02-11 Simon Josefsson * asn1/doc/.cvsignore: [no log message] 2003-02-11 Simon Josefsson * crypto/AUTHORS, crypto/ChangeLog, crypto/INSTALL, crypto/NEWS, crypto/README, crypto/TODO, crypto/cipher/ChangeLog, crypto/cipher/Makefile.am, crypto/cipher/bithelp.h, crypto/cipher/cipher.c, crypto/cipher/crc.c, crypto/cipher/dsa.c, crypto/cipher/dsa.h, crypto/cipher/dynload.c, crypto/cipher/dynload.h, crypto/cipher/elgamal.c, crypto/cipher/elgamal.h, crypto/cipher/md.c, crypto/cipher/pubkey.c, crypto/cipher/rand-internal.h, crypto/cipher/random.c, crypto/cipher/random.h, crypto/cipher/rndlinux.c, crypto/cipher/rsa.c, crypto/cipher/rsa.h, crypto/cipher/sha256.c, crypto/configure.ac, crypto/doc/ChangeLog, crypto/doc/gcrypt.texi, crypto/libgcrypt.txt, crypto/mpi/ChangeLog, crypto/mpi/Makefile.am, crypto/mpi/longlong.h, crypto/scripts/config.guess, crypto/scripts/config.sub, crypto/scripts/install-sh, crypto/scripts/missing, crypto/scripts/mkinstalldirs, crypto/src/ChangeLog, crypto/src/Makefile.am, crypto/src/g10lib.h, crypto/src/gcrypt.h, crypto/src/global.c, crypto/src/libgcrypt.vers, crypto/src/secmem.h, crypto/src/sexp.c, crypto/src/stdmem.c, crypto/src/stdmem.h, crypto/src/testapi.c, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/basic.c, crypto/tests/keygen.c: Upstream update. 2003-02-11 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c: Use new libtasn1 API. 2003-02-11 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/safe.c, lib/tgs.c, lib/ticket.c, lib/tkt.c: Use new libtasn1 API. 2003-02-11 Simon Josefsson * asn1/.cvsignore, asn1/doc/.cvsignore, asn1/doc/scripts/.cvsignore, asn1/lib/.cvsignore, asn1/src/.cvsignore, asn1/tests/.cvsignore: [no log message] 2003-02-11 Simon Josefsson * asn1/configure.in, asn1/lib/decoding.c, asn1/lib/element.c: Upstream update. 2003-02-11 Simon Josefsson * asn1/NEWS, asn1/doc/asn1.tex, asn1/lib/ASN1.y, asn1/lib/coding.c, asn1/lib/defines.h, asn1/lib/errors.c, asn1/lib/gstr.c, asn1/lib/gstr.h, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/lib/parser_aux.c, asn1/lib/structure.c, asn1/src/CertificateExample.c, asn1/src/CrlExample.c, asn1/src/asn1Coding.c, asn1/src/asn1Coding_test.asg, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c, asn1/tests/Test_parser.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c: Upstream update. 2003-02-11 Simon Josefsson * ChangeLog, po/shishi.pot, po/sv.po: Generated. 2003-02-11 Simon Josefsson * doc/reference/shishi.types: Add. 2003-02-11 Simon Josefsson * ANNOUNCE: Update. 2003-02-11 Simon Josefsson * lib/safe.c, lib/shishi.h.in: Fix SAFE. 2003-02-10 Simon Josefsson * doc/shishi.texi: Add. 2003-02-10 Simon Josefsson * doc/Makefile.am: Add KRB-SAFE. 2003-02-10 Simon Josefsson * doc/shishi.texi: Add KRB-SAFE. Move utility functions. 2003-02-10 Simon Josefsson * doc/shishi.texi: [no log message] 2003-02-10 Simon Josefsson * doc/shishi.texi: (Cryptographic Overview): Improve wording. 2003-02-10 Simon Josefsson * README-alpha: Fix. 2003-02-10 Simon Josefsson * lib/as.c: Doc fix. 2003-02-10 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/internal.h, lib/safe.c, lib/shishi.h.in, src/client.c, src/server.c: Make KRB-SAFE work. 2003-02-10 Simon Josefsson * lib/as.c, lib/tgs.c: Doc fix. 2003-02-10 Simon Josefsson * Makefile.am: Ditto. 2003-02-10 Simon Josefsson * Makefile.am: Fix ChangeLog generation. 2003-02-10 Simon Josefsson * README: Fix. 2003-02-08 Simon Josefsson * lib/shishi.h.in, lib/tkts.c, src/client.c, src/data.h, src/server.c, src/shishi.c, src/shishid.c, tests/crypto.c, tests/ticketset.c, tests/utils.c: Fix. 2003-02-08 Simon Josefsson * lib/safe.c: Add. 2003-02-08 Simon Josefsson * lib/shishi.h.in, src/authp.c, src/client.c, src/shishid.c: Fix. 2003-02-08 Simon Josefsson * lib/asn1.c, lib/crypto-des.c, lib/init.c, lib/netio.c, lib/shishi.h.in: Fix. 2003-02-08 Simon Josefsson * lib/kdcreq.c, lib/vasprintf.c: Fix. 2003-02-08 Simon Josefsson * lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto-des.c, lib/crypto.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/init.c, lib/kdc.c, lib/kdcrep.c, lib/key.c, lib/netio.c, lib/pkcs5.c, lib/principal.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c, lib/tkts.c, lib/vasprintf.c: Fix. 2003-02-08 Simon Josefsson * lib/shishi.h.in: Fix. 2003-02-08 Simon Josefsson * lib/crypto.c, lib/internal.h: Fix. 2003-02-08 Simon Josefsson * lib/as.c, lib/asn1.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/init.c, lib/kdc.c, lib/key.c, lib/krberror.c, lib/netio.c, lib/pkcs5.c, lib/shishi.h.in, lib/tkts.c, lib/vasprintf.c: Fix. 2003-02-08 Simon Josefsson * lib/asn1.c: Add. 2003-02-08 Simon Josefsson * lib/enckdcreppart.c, lib/kdcrep.c, lib/shishi.h.in, lib/ticket.c, lib/tkt.c, lib/tkts.c: Fix. 2003-02-08 Simon Josefsson * lib/apreq.c, lib/authenticator.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/shishi.h.in: Fix. 2003-02-08 Simon Josefsson * lib/shishi.h.in: Fix. 2003-02-08 Simon Josefsson * lib/cfg.c: Fix warnings. 2003-02-08 Simon Josefsson * lib/cfg.c: Declare getsubopt(). 2003-02-08 Simon Josefsson * lib/shishi.h.in: Add. 2003-02-08 Simon Josefsson * lib/shishi.h.in: Add. Fix. 2003-02-08 Simon Josefsson * lib/internal.h, lib/shishi.h.in: Add. 2003-02-08 Simon Josefsson * lib/internal.h, lib/shishi.h.in: Add. 2003-02-08 Simon Josefsson * lib/shishi.h.in: Add. 2003-02-08 Simon Josefsson * lib/internal.h: Include arpa/inet.h. 2003-02-08 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Add XXX. 2003-02-08 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Fix init. 2003-02-08 Simon Josefsson * extra/inetutils/telnet/commands.c: Don't use DNS canonicalized hostname for display (security fix!). 2003-02-08 Simon Josefsson * doc/shishi.texi: Add. 2003-02-08 Simon Josefsson * lib/shishi.h.in: Fix. 2003-02-08 Simon Josefsson * extra/inetutils/libtelnet/shishi.c, lib/shishi.h.in, lib/tkts.c, src/shishi.c, tests/ticketset.c: New find/get API. 2003-02-08 Simon Josefsson * lib/tkt.c: Add. 2003-02-08 Simon Josefsson * lib/principal.c: Fix. 2003-02-05 Simon Josefsson * extra/inetutils/libtelnet/shishi.c, src/shishid.c, tests/ticketset.c: Fix API. 2003-02-05 Simon Josefsson * configure.ac: Check arpa/inet.h. 2003-02-05 Simon Josefsson * lib/enckdcreppart.c, lib/encticketpart.c: Fix. 2003-02-05 Simon Josefsson * lib/crypto.c: Add. 2003-02-05 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/diskio.c, lib/kdc.c, lib/shishi.h.in, lib/ticket.c, lib/tkts.c: Fix API. 2003-02-05 Simon Josefsson * lib/asn1.c, lib/kdcrep.c, lib/shishi.h.in: Fix. 2003-02-05 Simon Josefsson * lib/shishi.h.in: Fix. 2003-02-05 Simon Josefsson * lib/asn1.c, lib/principal.c: (shishi_principal_name_get, shishi_principal_name_realm_get): Move from asn1.c to principal.c 2003-02-05 Simon Josefsson * lib/safe.c: Fix. 2003-02-05 Simon Josefsson * lib/diskio.c: Fix header. 2003-02-05 Simon Josefsson * lib/init.c: Fix gcrypt init. 2003-02-05 Simon Josefsson * lib/internal.h: Use Shishi_asn1 instead of ASN1_TYPE. Fix. 2003-02-05 Simon Josefsson * lib/asn1.c: Add. 2003-02-05 Simon Josefsson * lib/enckdcreppart.c, lib/safe.c: Cleanup. 2003-02-05 Simon Josefsson * lib/authenticator.c, lib/init.c, lib/kdcreq.c, lib/shishi.h.in: Fix. 2003-02-05 Simon Josefsson * lib/encticketpart.c, lib/ticket.c: Cleanup. 2003-02-05 Simon Josefsson * lib/kdc.c: Cleanup. 2003-02-05 Simon Josefsson * lib/krberror.c: Cleanup. 2003-02-05 Simon Josefsson * lib/kdcrep.c: Cleanup. 2003-02-05 Simon Josefsson * lib/kdcreq.c: Cleanup. 2003-02-05 Simon Josefsson * lib/asn1.c: Add. 2003-02-05 Simon Josefsson * lib/encapreppart.c: Fix. 2003-02-05 Simon Josefsson * lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/safe.c, lib/tgs.c, lib/ticket.c, lib/tkt.c: Use Shishi_asn1 instead of ASN1_TYPE. 2003-02-05 Simon Josefsson * lib/asn1.c: Use Shishi_asn1 instead of ASN1_TYPE. Cleanup. Add. 2003-02-05 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/authenticator.c, lib/diskio.c, lib/done.c, lib/shishi.h.in: Use Shishi_asn1 instead of ASN1_TYPE. 2003-02-05 Simon Josefsson * configure.ac: Check syslog.h. 2003-02-05 Simon Josefsson * doc/gdoc: Fixes. 2003-02-05 Simon Josefsson * lib/version.c: Copyright fix. 2003-02-05 Simon Josefsson * lib/shishi.h.in: Fix krberror. 2003-02-05 Simon Josefsson * lib/apreq.c, lib/error.c, lib/hostkeys.c, lib/version.c: Doc fix. 2003-02-05 Simon Josefsson * src/shishid.c: Syslog. Setuid. 2003-02-05 Simon Josefsson * autogen.sh: Fix. 2003-02-03 Simon Josefsson * lib/krberror.c: Doc fix. 2003-02-03 Simon Josefsson * lib/init.c: Re-order to improve manual. 2003-02-03 Simon Josefsson * src/shishid.c: AS exchange works (with hardcoded credentials). 2003-02-03 Simon Josefsson * src/kdc.c: Fix. What to do about this file? Abandon? 2003-02-03 Simon Josefsson * lib/shishi.h.in: Fix. 2003-02-03 Simon Josefsson * lib/kdcreq.c: Fix. Add. 2003-02-03 Simon Josefsson * lib/kdc.c: Fix return codes. 2003-02-03 Simon Josefsson * lib/init.c: Add. 2003-02-03 Simon Josefsson * lib/asn1.c: Fix debug. 2003-02-03 Simon Josefsson * lib/as.c: Add. Clear pdata in AS-REQ. 2003-02-03 Simon Josefsson * lib/ticketset.c, lib/tkts.c: Rename ticketset.c to tkts.c. 2003-02-03 Simon Josefsson * lib/tkt.c: Add, code from ticket.c. 2003-02-03 Simon Josefsson * doc/reference/Makefile.am, doc/reference/tmpl/.cvsignore, doc/reference/tmpl/dummy.sgml, doc/reference/tmpl/shishi.sgml: Fix. 2003-02-03 Simon Josefsson * doc/reference/shishi.types, doc/reference/tmpl/shishi.sgml: Remove autogenerated stuff. 2003-02-03 Simon Josefsson * doc/reference/Makefile.am: Improve maintainer-clean (somewhat shishi specific). 2003-02-03 Simon Josefsson * doc/reference/tmpl/.cvsignore: [no log message] 2003-02-03 Simon Josefsson * doc/Makefile.am, doc/reference/tmpl/shishi.sgml, doc/shishi.texi, extra/inetutils/libtelnet/shishi.c, extra/pam_shishi/pam_shishi.c, lib/Makefile.am, lib/ap.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/diskio.c, lib/done.c, lib/enckdcreppart.c, lib/error.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/safe.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, src/authp.c, src/client.c, src/server.c, src/shishi.c, src/shishid.c, tests/ticketset.c: Rename shishi_ticketset_* to shishi_tkts_*. Separate ASN.1 ticket functions into shishi_ticket_* and high-level ticket functions into shishi_tkt_*. 2003-02-02 Simon Josefsson * lib/ticket.c: Add. Fix typo. (shishi_ticket_key_set): Set key in EncKDCRepPart too. (shishi_ticket2): Set transited, authtime, endtime. 2003-02-02 Simon Josefsson * lib/cfg.c, lib/crypto.c, lib/enckdcreppart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/shishi.h.in: Add. 2003-02-02 Simon Josefsson * lib/as.c: Add. Initialize ticket in AS. 2003-02-02 Simon Josefsson * lib/authenticator.c: Add. 2003-02-02 Simon Josefsson * lib/kdc.c, lib/shishi.h.in, lib/ticket.c: Add. 2003-02-02 Simon Josefsson * lib/authenticator.c: Add AuthorizationData. 2003-02-02 Simon Josefsson * lib/ap.c: Typo. 2003-02-02 Simon Josefsson * lib/kdcreq.c, lib/shishi.h.in: Add. 2003-02-02 Simon Josefsson * lib/kdc.c: (shishi_as_process): Print derived user key. 2003-02-02 Simon Josefsson * lib/diskio.c: Print hex key for noice verbose. 2003-02-02 Simon Josefsson * lib/ap.c, lib/as.c: Print debug info. 2003-02-02 Simon Josefsson * lib/ap.c: Print debug info. 2003-02-01 Simon Josefsson * lib/asn1.c: Add shishi_asn1_integer2_field. Indent. 2003-02-01 Simon Josefsson * lib/diskio.c: Indent. Add debug code. 2003-02-01 Simon Josefsson * lib/enckdcreppart.c: Add shishi_enckdcreppart_key_set, shishi_enckdcreppart_nonce_set, shishi_enckdcreppart_populate_encticketpart, shishi_enckdcreppart_srealm_set, shishi_enckdcreppart_sname_set, shishi_enckdcreppart_server_set, shishi_enckdcreppart_srealmserver_set, shishi_encasreppart. Indent. 2003-02-01 Simon Josefsson * lib/kdcrep.c: Add shishi_kdcrep_crealm_set, shishi_kdcrep_cname_set, shishi_kdcrep_client_set, shishi_kdcrep_crealmserver_set, shishi_kdcrep_set_enc_part, shishi_kdcrep_add_enc_part. (shishi_kdcrep_get_ticket): Don't lose on (some) optional fields. 2003-02-01 Simon Josefsson * lib/kdcreq.c: Add shishi_kdcreq_nonce, shishi_kdcreq_cname_get. 2003-02-01 Simon Josefsson * lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/encapreppart.c, lib/encticketpart.c, lib/error.c, lib/hostkeys.c, lib/init.c, lib/kdc.c, lib/key.c, lib/krberror.c, lib/netio.c, lib/password.c, lib/principal.c, lib/realm.c, src/authp.c, src/client.c, src/crypto.c, src/server.c, src/shishi.c, src/shishid.c, tests/crypto.c, tests/ticketset.c: Indent. 2003-02-01 Simon Josefsson * lib/as.c: Add shishi_as_rep_der_set. 2003-02-01 Simon Josefsson * lib/apreq.c: (shishi_apreq_get_ticket, shishi_apreq_set_ticket): Don't lose on optional fields (some still left though). 2003-02-01 Simon Josefsson * lib/aprep.c, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Indent. 2003-02-01 Simon Josefsson * lib/ap.c: Indent. (shishi_ap_rep_der_set): Don't lose previous AP-REP. (shishi_ap_rep_der): New. 2003-01-31 Simon Josefsson * lib/shishi.h.in: Add. Fix key usage enum member name. 2003-01-31 Simon Josefsson * lib/encticketpart.c, lib/kdcrep.c, lib/ticket.c: Add functions to set things. 2003-01-31 Simon Josefsson * lib/enckdcreppart.c: Fix. 2003-01-31 Simon Josefsson * lib/shishi.h.in: Add. 2003-01-31 Simon Josefsson * lib/encticketpart.c: Add shishi_encticketpart. 2003-01-31 Simon Josefsson * lib/init.c: Add shishi_init_server. 2003-01-31 Simon Josefsson * lib/key.c: Add shishi_key_random. 2003-01-31 Simon Josefsson * lib/crypto.c: Use strong random data. 2003-01-26 Simon Josefsson * doc/reference/tmpl/shishi.sgml: Generated. 2003-01-21 Simon Josefsson * doc/reference/tmpl/shishi.sgml: New. 2003-01-21 Simon Josefsson * configure.ac: Fix. 2003-01-21 Simon Josefsson * doc/reference/shishi-docs.sgml: Add some text. 2003-01-21 Simon Josefsson * doc/reference/Makefile.am: Add uninstall target. Fix distcheck. 2003-01-21 Simon Josefsson * lib/crypto-des.c: Use libgcrypt for CRC. 2003-01-21 Simon Josefsson * lib/Makefile.am: Fix libstringprep vs libidn. 2003-01-21 Simon Josefsson * configure.ac: Fix libstringprep vs libidn. 2003-01-21 Simon Josefsson * Makefile.am: Don't dist gdbm (for now). Fix libstringprep vs libidn. Fix cvs2cl and gtk-dock for distcheck. 2003-01-21 Simon Josefsson * tests/crypto.c: Don't check crc (gcrypt used now). 2002-12-15 Simon Josefsson * lib/Makefile.am, lib/diskio.c, lib/key.c, lib/safe.c, lib/shishi.h.in, src/client.c: Unfinished SAFE support. 2002-12-15 Simon Josefsson * ANNOUNCE: Fix. 2002-12-15 Simon Josefsson * ANNOUNCE: Fix. 2002-12-15 Simon Josefsson * ANNOUNCE: Fix. 2002-12-15 Simon Josefsson * README, shishi.conf.in, shishi.pc.in, src/shishi.c, src/shishid.c: Fix. 2002-12-15 Simon Josefsson * doc/reference/.cvsignore: [no log message] 2002-12-14 Simon Josefsson * configure.ac: Add GTK-DOC stuff. 2002-12-14 Simon Josefsson * lib/kdcreq.c, lib/tgs.c: Fix warnings from GTK-DOC. 2002-12-14 Simon Josefsson * doc/Makefile.am, doc/reference/Makefile.am, doc/reference/shishi-docs.sgml, doc/reference/shishi.types: Generate HTML/SGML API documentation using GTK-DOC. 2002-12-14 Simon Josefsson * lib/shishi.h.in, lib/ticket.c, lib/ticketset.c: Fix. 2002-12-14 Simon Josefsson * Makefile.am: EXTRA_DIST ANNOUNCE: 2002-12-14 Simon Josefsson * ANNOUNCE: Add. 2002-12-14 Simon Josefsson * extra/pam_shishi/pam_shishi.c: Define PAM_STATIC for static builds. 2002-12-14 Simon Josefsson * configure.ac, extra/pam_shishi/Makefile.am, extra/pam_shishi/pam_shishi.c: Solaris PAM fixes. 2002-12-14 Simon Josefsson * Makefile.am: Make sure ChangeLog is regenerated. 2002-12-13 Simon Josefsson * extra/README: Fix. 2002-12-13 Simon Josefsson * AUTHORS, NEWS, README, README-alpha, THANKS: Copying condition changes. 2002-12-13 Simon Josefsson * src/shishid.c: Fix warnings. 2002-12-13 Simon Josefsson * doc/shishi.texi: Fix ports. 2002-12-13 Simon Josefsson * configure.ac, extra/Makefile.am, extra/pam_shishi/Makefile.am, extra/pam_shishi/pam_shishi.c: Add --disable-pam configure option. 2002-12-13 Simon Josefsson * autogen.sh: [no log message] 2002-12-13 Simon Josefsson * src/server.c: Don't hardcode server name. 2002-12-13 Simon Josefsson * lib/apreq.c, lib/crypto.c, lib/kdcreq.c, lib/shishi.h.in, lib/ticketset.c: Revert earlier changes that broke simplified encryption profile. PAM fixes. 2002-12-13 Simon Josefsson * extra/README: Add PAM. 2002-12-13 Simon Josefsson * extra/Makefile.am, extra/pam_shishi/.cvsignore, extra/pam_shishi/Makefile.am, extra/pam_shishi/pam_shishi.c: Initial PAM module. 2002-12-12 Simon Josefsson * doc/shishi.texi: Fixes. 2002-12-12 Simon Josefsson * tests/ticketset.c: Add. 2002-12-12 Simon Josefsson * autogen.sh: [no log message] 2002-12-12 Simon Josefsson * lib/ap.c, lib/apreq.c, lib/authenticator.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c, lib/diskio.c, lib/encapreppart.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/netio.c, lib/password.c, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c, lib/vasprintf.c: Fix warnings. 2002-12-12 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Use new interfaces. 2002-12-12 Simon Josefsson * tests/ticketset.c: Use new ASN.1 interface. 2002-12-12 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/diskio.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/shishi.h.in, lib/ticket.c: Cleanup ASN.1 stuff. 2002-12-12 Simon Josefsson * src/shishi.c: Expire tickets. 2002-12-11 Simon Josefsson * tests/ticketset.c: Test file read/write. 2002-12-11 Simon Josefsson * lib/ticketset.c: Mem fixes. Separate ticket expiring on write. 2002-12-11 Simon Josefsson * tests/ticketset.c: Use new ticketset API. Fixes. 2002-12-11 Simon Josefsson * src/authp.c, src/client.c, src/shishi.c: Use new ticketset interface. 2002-12-11 Simon Josefsson * lib/init.c, lib/shishi.h.in, lib/ticketset.c: s/ticketset_init/ticketset/g 2002-12-11 Simon Josefsson * tests/.cvsignore, tests/Makefile.am, tests/crypto.c, tests/ticketset.c, tests/utils.c: Add ticketset self tests. 2002-12-11 Simon Josefsson * src/authp.c, src/client.c, src/kdc.c, src/shishi.c: Fix for new API. 2002-12-11 Simon Josefsson * lib/asn1.c, lib/diskio.c, lib/done.c, lib/internal.h, lib/kdc.c, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c: Fixes discovered while writing ticketset selftests. 2002-12-11 Simon Josefsson * src/authp.c, src/client.c, src/crypto.c, src/data.h, src/server.c, src/shishi.c: Fix. 2002-12-11 Simon Josefsson * tests/crypto.c: Use new key API. 2002-12-11 Simon Josefsson * lib/error.c: Add. 2002-12-11 Simon Josefsson * src/shishid.c: Don't define ngettext. 2002-12-11 Simon Josefsson * src/server.c: Fix. 2002-12-11 Simon Josefsson * lib/error.c: Add. 2002-12-11 Simon Josefsson * lib/ap.c: Fix keyusage. 2002-12-11 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Use new AP interface. 2002-12-11 Simon Josefsson * src/shishi.c: Add crypto key file. 2002-12-11 Simon Josefsson * src/server.c: Use AP interface. 2002-12-11 Simon Josefsson * src/crypto.c: Use new key API. 2002-12-11 Simon Josefsson * lib/ap.c, lib/apreq.c, lib/hostkeys.c, lib/internal.h, lib/key.c, lib/shishi.h.in, lib/ticket.c: Improve AP interface. 2002-12-11 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto.c, lib/diskio.c, lib/hostkeys.c, lib/key.c, lib/shishi.h.in: Key API fixes. 2002-12-11 Simon Josefsson * lib/ap.c: Fix (make TGS work again). 2002-12-11 Simon Josefsson * doc/.cvsignore, lib/.cvsignore: [no log message] 2002-12-11 Simon Josefsson * asn1/lib/coding.c, asn1/lib/parser_aux.c, asn1/src/asn1Coding.c, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c: Portability stuff. 2002-12-11 Simon Josefsson * doc/Makefile.am, doc/shishi.texi: Hostkeys. 2002-12-11 Simon Josefsson * autogen.sh, configure.ac: Dmalloc. 2002-12-11 Simon Josefsson * AUTHORS, NEWS, README: Fix copying conditions. 2002-12-11 Simon Josefsson * src/crypto.c, src/kdc.c, tests/crypto.c: Use new key API. 2002-12-11 Simon Josefsson * lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/base64.c, lib/cfg.c, lib/crypto-des.c, lib/encapreppart.c, lib/gztime.c, lib/init.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/netio.c, lib/password.c, lib/realm.c, lib/ticketset.c: -Wall fixes. 2002-12-11 Simon Josefsson * lib/.cvsignore, lib/Makefile.am, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto.c, lib/diskio.c, lib/done.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/hostkeys.c, lib/internal.h, lib/kdc.c, lib/key.c, lib/shishi.h.in: Cleanup key API. Add hostkey API starting point. Fixes. 2002-12-09 Simon Josefsson * README: Removed text now in README-alpha. 2002-12-09 Simon Josefsson * README-alpha: Add. 2002-12-09 Simon Josefsson * lib/ap.c, lib/as.c, lib/crypto-des.c, lib/tgs.c, lib/ticketset.c: Improve verbose messages. 2002-12-09 Simon Josefsson * src/shishi.c: Use TGS interface. 2002-12-09 Simon Josefsson * lib/ap.c, lib/as.c, lib/principal.c, lib/realm.c, lib/shishi.h.in, lib/tgs.c, lib/ticketset.c: Cleanup TGS interface. 2002-12-08 Simon Josefsson * extra/inetutils/telnetd/Makefile.am: Install as shishi-telnetd. 2002-12-08 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Telnetd works. 2002-12-08 Simon Josefsson * lib/ap.c, lib/diskio.c, lib/shishi.h.in, lib/ticket.c: Fix. 2002-12-08 Simon Josefsson * src/crypto.c: Use cipher_randomlen(). 2002-12-08 Simon Josefsson * lib/crypto.c: Add cipher_randomlen(). 2002-12-08 Simon Josefsson * lib/ticket.c: Fix. 2002-12-08 Simon Josefsson * lib/ticket.c: s/service/server/g. 2002-12-08 Simon Josefsson * src/shishi.c: Print EncKDCRepPart when printing ticket. 2002-12-08 Simon Josefsson * lib/as.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Store KDC-REP in ticket file too (for the cname, crealm, and keytype protection etype fields, and possibly other uses in the future). 2002-12-08 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/authenticator.c, lib/init.c, lib/internal.h: Remove most of shishi_last_*(). 2002-12-08 Simon Josefsson * lib/diskio.c: Remove debug output. 2002-12-08 Simon Josefsson * src/authp.c, src/client.c, src/shishi.c: Use new ticketset API. 2002-12-08 Simon Josefsson * lib/ticket.c: Print etype key is protected under. 2002-12-08 Simon Josefsson * lib/done.c, lib/init.c, lib/shishi.h.in, lib/ticketset.c: Cleanup ticketset API. 2002-12-08 Simon Josefsson * lib/ticketset.c: Don't hardcode all tickets belonging to jas@JOSEFSSON.ORG. 2002-12-08 Simon Josefsson * src/Makefile.am: kdc.c is broken for now. 2002-12-08 Simon Josefsson * src/shishi.c: Print last-req too. 2002-12-08 Simon Josefsson * src/authp.c: Fix. 2002-12-08 Simon Josefsson * lib/ticketset.c: Add find/get_ticket etype. 2002-12-08 Simon Josefsson * lib/shishi.h.in, lib/ticket.c: Fix ticket flags. Add last-req. 2002-12-08 Simon Josefsson * lib/apreq.c, lib/kdcreq.c: Remove old AP-REQ API. 2002-12-08 Simon Josefsson * lib/ap.c: Fix doc. 2002-12-08 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Fix. 2002-12-07 Simon Josefsson * configure.ac: Gnits. 2002-12-07 Simon Josefsson * COPYING.DOC, extra/inetutils/headers/stamp-h.in: Add. 2002-12-07 Simon Josefsson * Makefile.am, README, configure.ac, doc/Makefile.am: Use GPL instead of LGPL. 2002-12-07 Simon Josefsson * doc/Makefile.am, doc/gdoc-error, doc/lgpl.texi, doc/shishi.texi, extra/Makefile.am, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/base64.c, lib/cfg.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/diskio.c, lib/done.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gztime.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/krberror.c, lib/netio.c, lib/password.c, lib/principal.c, lib/realm.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c, src/Makefile.am, tests/Makefile.am: Use GPL instead of LGPL. 2002-12-07 Simon Josefsson * src/kdc.c, src/shishi.c: Use new AS interface. 2002-12-07 Simon Josefsson * lib/ap.c, lib/as.c, lib/authenticator.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Clean up AS interface. 2002-12-07 Simon Josefsson * src/client.c: Fix. 2002-12-07 Simon Josefsson * src/authp.c, src/shishi.c: Use new AP interface. 2002-12-07 Simon Josefsson * lib/ap.c, lib/asn1.c, lib/internal.h, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Use new AP interface for TGS. 2002-12-07 Simon Josefsson * extra/inetutils/libtelnet/shishi.c, src/authp.c, src/client.c, src/kdc.c, src/server.c, src/shishi.c: Use new AP interface. 2002-12-07 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/asn1.c, lib/internal.h, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c: Clean up AP interface. 2002-12-07 Simon Josefsson * lib/shishi.h.in: Update AP. 2002-12-07 Simon Josefsson * lib/ticketset.c: Fix crash in get_ticket. 2002-12-07 Simon Josefsson * lib/krberror.c: Zeroterminate server string. 2002-12-07 Simon Josefsson * lib/diskio.c: Fix AP-REP parsing. 2002-12-07 Simon Josefsson * src/shishi.c: Set servername. 2002-12-07 Simon Josefsson * src/client.c: Use new AP functions. 2002-12-07 Simon Josefsson * extra/inetutils/libtelnet/auth.c: Don't crash if ap==NULL. 2002-12-07 Simon Josefsson * doc/shishi.texi: Add SuSE. 2002-12-07 Simon Josefsson * extra/inetutils/configure.ac, extra/inetutils/telnet/Makefile.am: Add -I's. 2002-12-07 Simon Josefsson * extra/inetutils/libtelnet/auth-proto.h, extra/inetutils/libtelnet/auth.c, extra/inetutils/libtelnet/auth.h: Add cleanup. 2002-12-07 Simon Josefsson * extra/inetutils/libtelnet/shishi.c: Use new get_ticket API. 2002-12-07 Simon Josefsson * src/shishi.c: Fixes. 2002-12-07 Simon Josefsson * lib/ticketset.c: Add ticketset_get_ticket_*(). 2002-12-07 Simon Josefsson * lib/done.c: Save ticketset. 2002-12-07 Simon Josefsson * lib/cfg.c: Use shishi_warn(). 2002-12-06 Simon Josefsson * configure.ac: Try harder to find socklen_t before falling back to size_t. 2002-12-06 Simon Josefsson * lib/shishi.h.in, lib/ticketset.c, src/kdc.c, src/shishi.c: Fix warnings. 2002-12-06 Simon Josefsson * lib/cfg.c: Don't gethostbyname(NULL). 2002-12-06 Simon Josefsson * .cvsignore: [no log message] 2002-12-06 Simon Josefsson * configure.ac: Workaround gettext+libtool distcheck bug. Fixes. 2002-12-06 Simon Josefsson * Makefile.am: Workaround gettext+libtool distcheck bug. 2002-12-06 Simon Josefsson * lib/internal.h: Handle ngettext() from autoconf instead. 2002-12-06 Simon Josefsson * lib/aprep.c: Print cusec in hex. 2002-12-06 Simon Josefsson * lib/asn1.c: Don't corrupt data in _shishi_asn1_integer_field (this caused the spurious AP-REP verification failures). 2002-12-06 Simon Josefsson * lib/crypto.c, lib/encapreppart.c: Fix. 2002-12-06 Simon Josefsson * lib/crypto-des.c: Fix. 2002-12-06 Simon Josefsson * extra/README, extra/inetutils/.cvsignore, extra/inetutils/COPYING, extra/inetutils/ChangeLog.0, extra/inetutils/Makefile.am, extra/inetutils/README-alpha, extra/inetutils/ROADMAP, extra/inetutils/THANKS, extra/inetutils/TODO, extra/inetutils/autogen.sh, extra/inetutils/configure.ac, extra/inetutils/doc/.cvsignore, extra/inetutils/doc/ChangeLog, extra/inetutils/doc/Makefile.am, extra/inetutils/doc/ftp.texi, extra/inetutils/doc/ftpd.texi, extra/inetutils/doc/inetd.texi, extra/inetutils/doc/inetutils.texi, extra/inetutils/doc/logger.texi, extra/inetutils/doc/ping.texi, extra/inetutils/doc/rcp.texi, extra/inetutils/doc/rexecd.texi, extra/inetutils/doc/rfc/.cvsignore, extra/inetutils/doc/rfc/Makefile.am, extra/inetutils/doc/rfc/rfc1282.txt, extra/inetutils/doc/rlogin.texi, extra/inetutils/doc/rlogind.texi, extra/inetutils/doc/rsh.texi, extra/inetutils/doc/rshd.texi, extra/inetutils/doc/syslogd.texi, extra/inetutils/doc/talk.texi, extra/inetutils/doc/talkd.texi, extra/inetutils/doc/tftp.texi, extra/inetutils/ftp/.cvsignore, extra/inetutils/ftp/ChangeLog, extra/inetutils/ftp/Makefile.am, extra/inetutils/ftp/cmds.c, extra/inetutils/ftp/cmdtab.c, extra/inetutils/ftp/domacro.c, extra/inetutils/ftp/extern.h, extra/inetutils/ftp/ftp.1, extra/inetutils/ftp/ftp.c, extra/inetutils/ftp/ftp_var.h, extra/inetutils/ftp/main.c, extra/inetutils/ftp/ruserpass.c, extra/inetutils/ftpd/.cvsignore, extra/inetutils/ftpd/ChangeLog, extra/inetutils/ftpd/Makefile.am, extra/inetutils/ftpd/README.sec, extra/inetutils/ftpd/auth.c, extra/inetutils/ftpd/conf.c, extra/inetutils/ftpd/extern.h, extra/inetutils/ftpd/ftpcmd.y, extra/inetutils/ftpd/ftpd.8, extra/inetutils/ftpd/ftpd.c, extra/inetutils/ftpd/logwtmp.c, extra/inetutils/ftpd/pam.c, extra/inetutils/ftpd/popen.c, extra/inetutils/ftpd/server_mode.c, extra/inetutils/glob/.cvsignore, extra/inetutils/glob/COPYING.LIB, extra/inetutils/glob/ChangeLog, extra/inetutils/glob/Makefile.am, extra/inetutils/glob/SMakefile, extra/inetutils/glob/configure.bat, extra/inetutils/glob/configure.in, extra/inetutils/glob/fnmatch.c, extra/inetutils/glob/fnmatch.h, extra/inetutils/glob/glob.c, extra/inetutils/glob/glob.h, extra/inetutils/gwhois/.cvsignore, extra/inetutils/gwhois/ChangeLog, extra/inetutils/gwhois/Makefile.am, extra/inetutils/gwhois/README, extra/inetutils/gwhois/TODO, extra/inetutils/gwhois/as_del_list, extra/inetutils/gwhois/data.h, extra/inetutils/gwhois/ip_del_list, extra/inetutils/gwhois/make_as_del.pl, extra/inetutils/gwhois/make_ip_del.pl, extra/inetutils/gwhois/make_tld_serv.pl, extra/inetutils/gwhois/tld_serv_list, extra/inetutils/gwhois/whois.1, extra/inetutils/gwhois/whois.c, extra/inetutils/gwhois/whois.h, extra/inetutils/headers/Makefile.am, extra/inetutils/headers/arpa/ftp.h, extra/inetutils/headers/arpa/tftp.h, extra/inetutils/headers/crypt.h, extra/inetutils/headers/osockaddr.h, extra/inetutils/headers/protocols/talkd.h, extra/inetutils/headers/syslog-int.h, extra/inetutils/ifconfig/.cvsignore, extra/inetutils/ifconfig/COMPATIBILITY, extra/inetutils/ifconfig/ChangeLog, extra/inetutils/ifconfig/Makefile.am, extra/inetutils/ifconfig/TODO, extra/inetutils/ifconfig/changeif.c, extra/inetutils/ifconfig/flags.c, extra/inetutils/ifconfig/flags.h, extra/inetutils/ifconfig/if_index.c, extra/inetutils/ifconfig/if_index.h, extra/inetutils/ifconfig/ifconfig.c, extra/inetutils/ifconfig/ifconfig.h, extra/inetutils/ifconfig/options.c, extra/inetutils/ifconfig/options.h, extra/inetutils/ifconfig/printif.c, extra/inetutils/ifconfig/printif.h, extra/inetutils/ifconfig/system.c, extra/inetutils/ifconfig/system.h, extra/inetutils/ifconfig/system/.cvsignore, extra/inetutils/ifconfig/system/Makefile.am, extra/inetutils/ifconfig/system/generic.c, extra/inetutils/ifconfig/system/generic.h, extra/inetutils/ifconfig/system/hpux.c, extra/inetutils/ifconfig/system/hpux.h, extra/inetutils/ifconfig/system/linux.c, extra/inetutils/ifconfig/system/linux.h, extra/inetutils/ifconfig/system/osf.c, extra/inetutils/ifconfig/system/osf.h, extra/inetutils/ifconfig/system/qnx.c, extra/inetutils/ifconfig/system/qnx.h, extra/inetutils/ifconfig/system/solaris.c, extra/inetutils/ifconfig/system/solaris.h, extra/inetutils/inetd/.cvsignore, extra/inetutils/inetd/ChangeLog, extra/inetutils/inetd/Makefile.am, extra/inetutils/inetd/inetd.8, extra/inetutils/inetd/inetd.c, extra/inetutils/libicmp/.cvsignore, extra/inetutils/libicmp/ChangeLog, extra/inetutils/libicmp/Makefile.am, extra/inetutils/libicmp/TODO, extra/inetutils/libicmp/icmp.h, extra/inetutils/libicmp/icmp_address.c, extra/inetutils/libicmp/icmp_cksum.c, extra/inetutils/libicmp/icmp_echo.c, extra/inetutils/libicmp/icmp_timestamp.c, extra/inetutils/libicmp/libping.c, extra/inetutils/libicmp/ping.h, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libinetutils/daemon.c, extra/inetutils/libinetutils/logwtmp.c, extra/inetutils/libinetutils/ttymsg.c, extra/inetutils/libinetutils/utmp_init.c, extra/inetutils/libls/.cvsignore, extra/inetutils/libls/ChangeLog, extra/inetutils/libls/Makefile.am, extra/inetutils/libls/bsdport.c, extra/inetutils/libls/bsdport.h, extra/inetutils/libls/cmp.c, extra/inetutils/libls/extern.h, extra/inetutils/libls/fts.c, extra/inetutils/libls/fts.h, extra/inetutils/libls/ls.1, extra/inetutils/libls/ls.c, extra/inetutils/libls/ls.h, extra/inetutils/libls/print.c, extra/inetutils/libls/stat_flags.c, extra/inetutils/libls/util.c, extra/inetutils/libtelnet/Makefile.am, extra/inetutils/logger/.cvsignore, extra/inetutils/logger/ChangeLog, extra/inetutils/logger/Makefile.am, extra/inetutils/logger/logger.1, extra/inetutils/logger/logger.c, extra/inetutils/ping/.cvsignore, extra/inetutils/ping/ChangeLog, extra/inetutils/ping/Makefile.am, extra/inetutils/ping/README.sec, extra/inetutils/ping/TODO, extra/inetutils/ping/ping.8, extra/inetutils/ping/ping.c, extra/inetutils/ping/ping_address.c, extra/inetutils/ping/ping_echo.c, extra/inetutils/ping/ping_impl.h, extra/inetutils/ping/ping_router.c, extra/inetutils/ping/ping_timestamp.c, extra/inetutils/rcp/.cvsignore, extra/inetutils/rcp/ChangeLog, extra/inetutils/rcp/Makefile.am, extra/inetutils/rcp/extern.h, extra/inetutils/rcp/rcp.1, extra/inetutils/rcp/rcp.c, extra/inetutils/rcp/util.c, extra/inetutils/rexecd/.cvsignore, extra/inetutils/rexecd/ChangeLog, extra/inetutils/rexecd/Makefile.am, extra/inetutils/rexecd/rexecd.8, extra/inetutils/rexecd/rexecd.c, extra/inetutils/rlogin/.cvsignore, extra/inetutils/rlogin/ChangeLog, extra/inetutils/rlogin/Makefile.am, extra/inetutils/rlogin/rlogin.1, extra/inetutils/rlogin/rlogin.c, extra/inetutils/rlogind/.cvsignore, extra/inetutils/rlogind/ChangeLog, extra/inetutils/rlogind/Makefile.am, extra/inetutils/rlogind/rlogind.8, extra/inetutils/rlogind/rlogind.c, extra/inetutils/rsh/.cvsignore, extra/inetutils/rsh/ChangeLog, extra/inetutils/rsh/Makefile.am, extra/inetutils/rsh/rsh.1, extra/inetutils/rsh/rsh.c, extra/inetutils/rshd/.cvsignore, extra/inetutils/rshd/ChangeLog, extra/inetutils/rshd/Makefile.am, extra/inetutils/rshd/rshd.8, extra/inetutils/rshd/rshd.c, extra/inetutils/syslogd/.cvsignore, extra/inetutils/syslogd/ChangeLog, extra/inetutils/syslogd/Makefile.am, extra/inetutils/syslogd/README.sec, extra/inetutils/syslogd/syslog.conf.5, extra/inetutils/syslogd/syslogd.8, extra/inetutils/syslogd/syslogd.c, extra/inetutils/talk/.cvsignore, extra/inetutils/talk/ChangeLog, extra/inetutils/talk/Makefile.am, extra/inetutils/talk/ctl.c, extra/inetutils/talk/ctl_transact.c, extra/inetutils/talk/display.c, extra/inetutils/talk/get_addrs.c, extra/inetutils/talk/get_names.c, extra/inetutils/talk/init_disp.c, extra/inetutils/talk/invite.c, extra/inetutils/talk/io.c, extra/inetutils/talk/look_up.c, extra/inetutils/talk/msgs.c, extra/inetutils/talk/talk.1, extra/inetutils/talk/talk.c, extra/inetutils/talk/talk.h, extra/inetutils/talk/talk_ctl.h, extra/inetutils/talkd/.cvsignore, extra/inetutils/talkd/ChangeLog, extra/inetutils/talkd/Makefile.am, extra/inetutils/talkd/README.sec, extra/inetutils/talkd/acl.c, extra/inetutils/talkd/announce.c, extra/inetutils/talkd/intalkd.h, extra/inetutils/talkd/print.c, extra/inetutils/talkd/process.c, extra/inetutils/talkd/table.c, extra/inetutils/talkd/talkd.8, extra/inetutils/talkd/talkd.c, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnet/telnet.1, extra/inetutils/telnetd/.cvsignore, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/telnetd.8, extra/inetutils/tftp/.cvsignore, extra/inetutils/tftp/ChangeLog, extra/inetutils/tftp/Makefile.am, extra/inetutils/tftp/extern.h, extra/inetutils/tftp/main.c, extra/inetutils/tftp/tftp.1, extra/inetutils/tftp/tftp.c, extra/inetutils/tftpd/.cvsignore, extra/inetutils/tftpd/ChangeLog, extra/inetutils/tftpd/Makefile.am, extra/inetutils/tftpd/tftpd.8, extra/inetutils/tftpd/tftpd.c, extra/inetutils/uucpd/.cvsignore, extra/inetutils/uucpd/ChangeLog, extra/inetutils/uucpd/Makefile.am, extra/inetutils/uucpd/uucpd.c, extra/inetutils/whois/.cvsignore, extra/inetutils/whois/ChangeLog, extra/inetutils/whois/Makefile.am, extra/inetutils/whois/main.c, extra/inetutils/whois/net.c, extra/inetutils/whois/whois-servers: Add entire GNU Inetutils, although most of it is disabled by Shishi's configure.ac. 2002-12-06 Simon Josefsson * tests/Makefile.am: LTLIBINTL is included via libshishi. 2002-12-05 Simon Josefsson * argp/argp-fmtstream.c, argp/argp-help.c: s/putc_unlocked/putc/g for freebsd on alpha 2002-12-05 Simon Josefsson * doc/gdoc-error: Fix copying conditions. 2002-12-05 Simon Josefsson * doc/gdoc-error: Fix copying conditions. 2002-12-05 Simon Josefsson * doc/gdoc-error: Make it less shishi specific. 2002-12-04 Simon Josefsson * lib/cfg.c: Add XXX about not running gethostbyname() during startup. 2002-12-04 Simon Josefsson * doc/.cvsignore, doc/Makefile.am, doc/shishi.texi: Add realm/principal API doc. 2002-12-04 Simon Josefsson * lib/as.c, lib/authenticator.c, lib/done.c, lib/init.c, lib/internal.h, lib/kdcreq.c, lib/principal.c, lib/realm.c, lib/shishi.h.in, lib/tgs.c, lib/ticketset.c, src/authp.c, src/client.c, src/crypto.c, src/kdc.c, src/server.c, src/shishi.c: Harmonise realm, principal and ticketset filename API. 2002-12-04 Simon Josefsson * src/shishi.c: Fix --help. 2002-12-04 Simon Josefsson * src/shishi.c: Fix destroy --server-name. 2002-12-04 Simon Josefsson * lib/error.c, lib/shishi.h.in, lib/ticketset.c, src/authp.c, src/client.c, src/data.h, src/kdc.c, src/server.c, src/shishi.c: Add ticket destroy command. Use default ticketset in src/. 2002-12-03 Simon Josefsson * lib/shishi.h.in: Add as.c/tgs.c prototypes. 2002-12-03 Simon Josefsson * doc/Makefile.am: Fix dependencies. 2002-12-03 Simon Josefsson * doc/Makefile.am, lib/cfg.c, lib/init.c, lib/shishi.h.in: Doc fixes. 2002-12-03 Simon Josefsson * Makefile.am: Exclude libstringprep from ChangeLog. 2002-12-03 Simon Josefsson * configure.ac, doc/shishi.texi, lib/error.c, po/shishi.pot, po/sv.po, src/Makefile.am, src/client.c, src/server.c, tests/Makefile.am, tests/crypto.c: Portability fixes. 2002-12-03 Simon Josefsson * lib/error.c: Typographic fixes. 2002-12-03 Simon Josefsson * doc/.cvsignore: [no log message] 2002-12-03 Simon Josefsson * doc/Makefile.am, doc/gdoc-error, doc/shishi.texi: Generate error label documentation. 2002-12-03 Simon Josefsson * src/shishi.c: New API. 2002-12-03 Simon Josefsson * doc/.cvsignore, doc/Makefile.am, doc/shishi.texi, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/encticketpart.c, lib/init.c, lib/key.c, lib/shishi.h.in: Improve crypto documentation. 2002-12-02 Simon Josefsson * Makefile.am, lib/Makefile.am: Fix stringprep variables. 2002-12-02 Simon Josefsson * configure.ac: Define socklen_t to size_t if it doesn't exist (Tru64 without _XOPEN_SOURCE=500). Fix libstringprep variables. 2002-12-02 Simon Josefsson * doc/specifications/rfc26.0.txt: [no log message] 2002-12-02 Simon Josefsson * lib/ap.c, lib/as.c, lib/crypto-des.c, lib/crypto.c, lib/internal.h, lib/kdcrep.c, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Move some private structures to where they belong. Fixes. 2002-12-02 Simon Josefsson * lib/as.c, lib/kdc.c: Shishi_key fixes. 2002-12-02 Simon Josefsson * lib/.cvsignore, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/authenticator.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c, lib/diskio.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/key.c, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c, src/crypto.c, src/kdc.c, tests/crypto.c: Create new Shishi_key structure to hide key details. 2002-12-02 Simon Josefsson * lib/Makefile.am, lib/internal.h, lib/key.c, lib/shishi.h.in: Add new key data type. 2002-12-02 Simon Josefsson * src/kdc.c: Use new ticket API. 2002-12-02 Simon Josefsson * lib/ap.c, lib/kdcreq.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c: Don't take handle parameter in ticket accessor functions. 2002-12-02 Simon Josefsson * src/data.h, src/shishi.c: Add --verbose-library. Fix return code. 2002-12-02 Simon Josefsson * README: Fix. 2002-12-02 Simon Josefsson * src/data.h: Remove unused stuff. 2002-12-01 Simon Josefsson * src/shishi.c: Include argp. 2002-12-01 Simon Josefsson * src/data.h: Fix includes. 2002-12-01 Simon Josefsson * lib/base64.c: Fix prototype. 2002-12-01 Simon Josefsson * configure.ac: Add. 2002-12-01 Simon Josefsson * src/crypto.c, src/data.h, src/shishid.c: Fix includes. 2002-12-01 Simon Josefsson * lib/base64.c, lib/internal.h, lib/password.c, lib/principal.c, lib/shishi.h.in: Fix includes. Export key usage values. 2002-12-01 Simon Josefsson * po/shishi.pot, po/sv.po: regenerated 2002-12-01 Simon Josefsson * src/crypto.c, src/data.h, src/kdc.c, src/server.c, src/shishi.c: Enhance key handling in crypto. Fixes. 2002-12-01 Simon Josefsson * shishi.conf.in: Fix. 2002-12-01 Simon Josefsson * lib/shishi.h.in: Add. Fix. 2002-12-01 Simon Josefsson * lib/error.c: Add. 2002-12-01 Simon Josefsson * lib/diskio.c: Add key output functions. 2002-12-01 Simon Josefsson * lib/crypto.c: Always specify rand2key and str2key functions. Allow randomize to return 0 "random" bytes. 2002-12-01 Simon Josefsson * lib/crypto-null.c: Fixes. 2002-12-01 Simon Josefsson * lib/crypto-aes.c: More debugging output. 2002-12-01 Simon Josefsson * configure.ac, lib/Makefile.am: Fix. 2002-12-01 Simon Josefsson * shishi.conf.in: Fixes. Add stringprocess. 2002-12-01 Simon Josefsson * lib/init.c: Only support AES256 by default, as per RFC1510bis. 2002-12-01 Simon Josefsson * README: Fix. 2002-12-01 Simon Josefsson * doc/shishi.texi: Fixes. 2002-11-30 Simon Josefsson * configure.ac: Fix typo. 2002-11-30 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c: Cleanup. 2002-11-30 Simon Josefsson * src/shishi.c: Print KRB-ERROR in AS/TGS. 2002-11-30 Simon Josefsson * lib/init.c: Improve error handling. 2002-11-30 Simon Josefsson * lib/.cvsignore, lib/Makefile.am, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c, lib/diskio.c, lib/encapreppart.c, lib/error.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/krberror.c, lib/netio.c, lib/password.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c: Replaced DEBUG* and SILENT with VERBOSE. Added KRB-ERROR handling. 2002-11-30 Simon Josefsson * lib/error.c, lib/netio.c, lib/shishi.h.in: Improve errors. 2002-11-30 Simon Josefsson * src/kdc.c: Use new password API. 2002-11-30 Simon Josefsson * lib/as.c, lib/cfg.c, lib/internal.h, lib/password.c, lib/shishi.h.in: Character set handling for passwords, subject to new "stringprocess" configuration verb. 2002-11-30 Simon Josefsson * src/Makefile.am, tests/Makefile.am: Remove argp (now added to LIBS). 2002-11-30 Simon Josefsson * lib/Makefile.am: Add AC_LIBOBJ's to EXTRA_DIST. 2002-11-30 Simon Josefsson * lib/gethostname.c: From gnulib, a AC_LIBOBJ. 2002-11-30 Simon Josefsson * Makefile.am: Add libstringprep. 2002-11-30 Simon Josefsson * configure.ac: Clean up a little. 2002-11-30 Simon Josefsson * lib/memmove.c, lib/memset.c, lib/strcasecmp.c, lib/strdup.c, lib/strerror.c: From gnulib, a AC_LIBOBJ. 2002-11-29 Simon Josefsson * lib/init.c: use aes256, aes128, des3 by default 2002-11-29 Simon Josefsson * po/shishi.pot, po/sv.po: indent caused regeneration 2002-11-29 Simon Josefsson * Makefile.am, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/done.c, lib/encapreppart.c, lib/encticketpart.c, lib/error.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/netio.c, lib/password.c, lib/pkcs5.c, lib/pkcs5.h, lib/realm.c, lib/setenv.h, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c, lib/vasprintf.c, src/Makefile.am, src/authp.c, src/client.c, src/crypto.c, src/kdc.c, src/server.c, src/shishi.c, src/shishid.c, tests/Makefile.am, tests/crypto.c: indent 2002-11-29 Simon Josefsson * crypto/src/gcrypt.h: new version 2002-11-29 Simon Josefsson * tests/Makefile.am: add indent 2002-11-29 Simon Josefsson * asn1/INSTALL, crypto/INSTALL, crypto/scripts/config.guess, crypto/scripts/config.sub, crypto/scripts/install-sh, crypto/scripts/missing, crypto/scripts/mkinstalldirs: these are regenerated by autoreconf 2002-11-29 Simon Josefsson * lib/internal.h: always include stdarg, never varargs 2002-11-29 Simon Josefsson * lib/Makefile.am: add intl 2002-11-29 Simon Josefsson * .cvsignore: [no log message] 2002-11-29 Simon Josefsson * asn1/ChangeLog, asn1/configure.in, asn1/lib/Makefile.am, asn1/lib/decoding.c, asn1/lib/defines.h, asn1/lib/element.c, asn1/lib/int.h, asn1/lib/structure.c, asn1/src/CertificateExample.c, asn1/src/asn1Coding.c, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c, asn1/tests/Test_parser.c, asn1/tests/Test_tree.c: add my patches 2002-11-29 Simon Josefsson * asn1/.cvsusers, asn1/AUTHORS, asn1/COPYING, asn1/COPYING.LIB, asn1/ChangeLog, asn1/INSTALL, asn1/Makefile.am, asn1/NEWS, asn1/README, asn1/THANKS, asn1/acconfig.h, asn1/acinclude.m4, asn1/buildconf, asn1/configure.in, asn1/doc/Makefile.am, asn1/doc/TODO, asn1/doc/asn1.tex, asn1/doc/fdl.tex, asn1/doc/scripts/Makefile.am, asn1/doc/scripts/gdoc, asn1/lib/ASN1.c, asn1/lib/ASN1.y, asn1/lib/Makefile.am, asn1/lib/coding.c, asn1/lib/decoding.c, asn1/lib/defines.h, asn1/lib/der.h, asn1/lib/element.c, asn1/lib/element.h, asn1/lib/errors.c, asn1/lib/errors.h, asn1/lib/errors_int.h, asn1/lib/gstr.c, asn1/lib/gstr.h, asn1/lib/int.h, asn1/lib/libtasn1.h, asn1/lib/mem.h, asn1/lib/parser_aux.c, asn1/lib/parser_aux.h, asn1/lib/structure.c, asn1/lib/structure.h, asn1/src/CertificateExample.c, asn1/src/CrlExample.c, asn1/src/Makefile.am, asn1/src/asn1Coding.c, asn1/src/asn1Coding_test.asg, asn1/src/asn1Coding_test.asn, asn1/src/asn1Decoding.c, asn1/src/asn1Parser.c, asn1/src/asn1c.c, asn1/src/pkix.asn, asn1/src/pkix_asn1_tab.c, asn1/tests/Makefile.am, asn1/tests/Test_parser.asn, asn1/tests/Test_parser.c, asn1/tests/Test_tree.asn, asn1/tests/Test_tree.c, asn1/tests/Test_tree_asn1_tab.c: add libtasn1 from CVS as of 2002-11-29 2002-11-29 Simon Josefsson * crypto/AUTHORS, crypto/BUGS, crypto/COPYING, crypto/COPYING.DOC, crypto/COPYING.LIB, crypto/ChangeLog, crypto/INSTALL, crypto/Makefile.am, crypto/NEWS, crypto/Notes-wk, crypto/README, crypto/README-alpha, crypto/THANKS, crypto/TODO, crypto/acinclude.m4, crypto/autogen.sh, crypto/cipher/ChangeLog, crypto/cipher/Makefile.am, crypto/cipher/arcfour.c, crypto/cipher/arcfour.h, crypto/cipher/bithelp.h, crypto/cipher/blowfish.c, crypto/cipher/blowfish.h, crypto/cipher/cast5.c, crypto/cipher/cast5.h, crypto/cipher/cipher.c, crypto/cipher/des.c, crypto/cipher/des.h, crypto/cipher/dsa.c, crypto/cipher/dsa.h, crypto/cipher/dynload.c, crypto/cipher/dynload.h, crypto/cipher/elgamal.c, crypto/cipher/elgamal.h, crypto/cipher/md.c, crypto/cipher/md4.c, crypto/cipher/md5.c, crypto/cipher/primegen.c, crypto/cipher/pubkey.c, crypto/cipher/rand-internal.h, crypto/cipher/random.c, crypto/cipher/random.h, crypto/cipher/rijndael.c, crypto/cipher/rmd.h, crypto/cipher/rmd160.c, crypto/cipher/rmd160test.c, crypto/cipher/rndegd.c, crypto/cipher/rndlinux.c, crypto/cipher/rndunix.c, crypto/cipher/rndw32.c, crypto/cipher/rsa.c, crypto/cipher/rsa.h, crypto/cipher/sha1.c, crypto/cipher/tiger.c, crypto/cipher/twofish.c, crypto/configure.ac, crypto/doc/ChangeLog, crypto/doc/Makefile.am, crypto/doc/cipher-ref.sgml, crypto/doc/digest-ref.sgml, crypto/doc/fdl.texi, crypto/doc/gcrypt.texi, crypto/doc/gpl.texi, crypto/doc/lgpl.texi, crypto/doc/misc-ref.sgml, crypto/doc/pubkey-ref.sgml, crypto/doc/reference.sgml, crypto/doc/version.sgml.in, crypto/jnlib/ChangeLog, crypto/jnlib/Makefile.am, crypto/jnlib/README, crypto/jnlib/argparse.c, crypto/jnlib/argparse.h, crypto/jnlib/dotlock.c, crypto/jnlib/dotlock.h, crypto/jnlib/libjnlib-config.h, crypto/jnlib/logging.c, crypto/jnlib/logging.h, crypto/jnlib/mischelp.h, crypto/jnlib/stringhelp.c, crypto/jnlib/stringhelp.h, crypto/jnlib/xmalloc.c, crypto/jnlib/xmalloc.h, crypto/libgcrypt.txt, crypto/mpi/ChangeLog, crypto/mpi/Makefile.am, crypto/mpi/alpha/README, crypto/mpi/alpha/distfiles, crypto/mpi/alpha/mpih-add1.S, crypto/mpi/alpha/mpih-lshift.S, crypto/mpi/alpha/mpih-mul1.S, crypto/mpi/alpha/mpih-mul2.S, crypto/mpi/alpha/mpih-mul3.S, crypto/mpi/alpha/mpih-rshift.S, crypto/mpi/alpha/mpih-sub1.S, crypto/mpi/alpha/udiv-qrnnd.S, crypto/mpi/config.links, crypto/mpi/generic/distfiles, crypto/mpi/generic/mpi-asm-defs.h, crypto/mpi/generic/mpih-add1.c, crypto/mpi/generic/mpih-lshift.c, crypto/mpi/generic/mpih-mul1.c, crypto/mpi/generic/mpih-mul2.c, crypto/mpi/generic/mpih-mul3.c, crypto/mpi/generic/mpih-rshift.c, crypto/mpi/generic/mpih-sub1.c, crypto/mpi/generic/udiv-w-sdiv.c, crypto/mpi/hppa/README, crypto/mpi/hppa/distfiles, crypto/mpi/hppa/mpih-add1.S, crypto/mpi/hppa/mpih-lshift.S, crypto/mpi/hppa/mpih-rshift.S, crypto/mpi/hppa/mpih-sub1.S, crypto/mpi/hppa/udiv-qrnnd.S, crypto/mpi/hppa1.1/distfiles, crypto/mpi/hppa1.1/mpih-mul1.S, crypto/mpi/hppa1.1/mpih-mul2.S, crypto/mpi/hppa1.1/mpih-mul3.S, crypto/mpi/hppa1.1/udiv-qrnnd.S, crypto/mpi/i386/distfiles, crypto/mpi/i386/mpih-add1.S, crypto/mpi/i386/mpih-lshift.S, crypto/mpi/i386/mpih-mul1.S, crypto/mpi/i386/mpih-mul2.S, crypto/mpi/i386/mpih-mul3.S, crypto/mpi/i386/mpih-rshift.S, crypto/mpi/i386/mpih-sub1.S, crypto/mpi/i386/syntax.h, crypto/mpi/i586/README, crypto/mpi/i586/distfiles, crypto/mpi/i586/mpih-add1.S, crypto/mpi/i586/mpih-lshift.S, crypto/mpi/i586/mpih-mul1.S, crypto/mpi/i586/mpih-mul2.S, crypto/mpi/i586/mpih-mul3.S, crypto/mpi/i586/mpih-rshift.S, crypto/mpi/i586/mpih-sub1.S, crypto/mpi/longlong.h, crypto/mpi/m68k/distfiles, crypto/mpi/m68k/mc68020/distfiles, crypto/mpi/m68k/mc68020/mpih-mul1.S, crypto/mpi/m68k/mc68020/mpih-mul2.S, crypto/mpi/m68k/mc68020/mpih-mul3.S, crypto/mpi/m68k/mpih-add1.S, crypto/mpi/m68k/mpih-lshift.S, crypto/mpi/m68k/mpih-rshift.S, crypto/mpi/m68k/mpih-sub1.S, crypto/mpi/m68k/syntax.h, crypto/mpi/mips3/README, crypto/mpi/mips3/distfiles, crypto/mpi/mips3/mpi-asm-defs.h, crypto/mpi/mips3/mpih-add1.S, crypto/mpi/mips3/mpih-lshift.S, crypto/mpi/mips3/mpih-mul1.S, crypto/mpi/mips3/mpih-mul2.S, crypto/mpi/mips3/mpih-mul3.S, crypto/mpi/mips3/mpih-rshift.S, crypto/mpi/mips3/mpih-sub1.S, crypto/mpi/mpi-add.c, crypto/mpi/mpi-bit.c, crypto/mpi/mpi-cmp.c, crypto/mpi/mpi-div.c, crypto/mpi/mpi-gcd.c, crypto/mpi/mpi-inline.c, crypto/mpi/mpi-inline.h, crypto/mpi/mpi-internal.h, crypto/mpi/mpi-inv.c, crypto/mpi/mpi-mpow.c, crypto/mpi/mpi-mul.c, crypto/mpi/mpi-pow.c, crypto/mpi/mpi-scan.c, crypto/mpi/mpicoder.c, crypto/mpi/mpih-div.c, crypto/mpi/mpih-mul.c, crypto/mpi/mpiutil.c, crypto/mpi/pa7100/distfiles, crypto/mpi/pa7100/mpih-lshift.S, crypto/mpi/pa7100/mpih-rshift.S, crypto/mpi/power/distfiles, crypto/mpi/power/mpih-add1.S, crypto/mpi/power/mpih-lshift.S, crypto/mpi/power/mpih-mul1.S, crypto/mpi/power/mpih-mul2.S, crypto/mpi/power/mpih-mul3.S, crypto/mpi/power/mpih-rshift.S, crypto/mpi/power/mpih-sub1.S, crypto/mpi/powerpc32/distfiles, crypto/mpi/powerpc32/mpih-add1.S, crypto/mpi/powerpc32/mpih-lshift.S, crypto/mpi/powerpc32/mpih-mul1.S, crypto/mpi/powerpc32/mpih-mul2.S, crypto/mpi/powerpc32/mpih-mul3.S, crypto/mpi/powerpc32/mpih-rshift.S, crypto/mpi/powerpc32/mpih-sub1.S, crypto/mpi/powerpc32/syntax.h, crypto/mpi/powerpc64/distfiles, crypto/mpi/sparc32/distfiles, crypto/mpi/sparc32/mpih-add1.S, crypto/mpi/sparc32/mpih-lshift.S, crypto/mpi/sparc32/mpih-rshift.S, crypto/mpi/sparc32/udiv.S, crypto/mpi/sparc32v8/distfiles, crypto/mpi/sparc32v8/mpih-mul1.S, crypto/mpi/sparc32v8/mpih-mul2.S, crypto/mpi/sparc32v8/mpih-mul3.S, crypto/mpi/supersparc/distfiles, crypto/mpi/supersparc/udiv.S, crypto/scripts/ChangeLog, crypto/scripts/autogen.sh, crypto/scripts/config.guess, crypto/scripts/config.sub, crypto/scripts/db2any, crypto/scripts/distfiles, crypto/scripts/install-sh, crypto/scripts/missing, crypto/scripts/mkinstalldirs, crypto/src/ChangeLog, crypto/src/Makefile.am, crypto/src/ath-pth.c, crypto/src/ath-pthread.c, crypto/src/ath.c, crypto/src/ath.h, crypto/src/benchmark.c, crypto/src/cipher.h, crypto/src/g10lib.h, crypto/src/gcrypt.h, crypto/src/global.c, crypto/src/libgcrypt-config.in, crypto/src/libgcrypt.m4, crypto/src/misc.c, crypto/src/missing-string.c, crypto/src/mpi.h, crypto/src/secmem.c, crypto/src/secmem.h, crypto/src/sexp.c, crypto/src/stdmem.c, crypto/src/stdmem.h, crypto/src/testapi.c, crypto/src/types.h, crypto/stamp-h.in, crypto/tests/ChangeLog, crypto/tests/Makefile.am, crypto/tests/basic.c, crypto/tests/tsexp.c, crypto/w32-dll/ChangeLog, crypto/w32-dll/Makefile.am, crypto/w32-dll/build-def, crypto/w32-dll/build-dll, crypto/w32-dll/libgcrypt.def: add libgcrypt from CVS, version 1.1.0 plus md4 and cts 2002-11-29 Simon Josefsson * lib/crypto.c: fix cipher_name 2002-11-29 Simon Josefsson * po/shishi.pot, po/sv.po: generated updates 2002-11-29 Simon Josefsson * doc/shishi.texi: fixes 2002-11-29 Simon Josefsson * lib/aprep.c, lib/apreq.c, lib/enckdcreppart.c, lib/encticketpart.c: endian fixes for keytype as + kdc + telnet now works on solaris 2002-11-29 Simon Josefsson * lib/crypto.c: fix when cipher_name fails 2002-11-29 Simon Josefsson * lib/gztime.c: fix TZ variable for solaris 2002-11-29 Simon Josefsson * src/data.h, src/shishi.c: remove shortnonce stuff 2002-11-29 Simon Josefsson * Makefile.am: fix 2002-11-29 Simon Josefsson * configure.ac: add unsetenv LIBOBJ fix typo remove alloca and malloc LIBOBJs 2002-11-29 Simon Josefsson * extra/inetutils/configure.ac, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libtelnet/Makefile.am, extra/inetutils/telnet/Makefile.am: compile fixes 2002-11-29 Simon Josefsson * lib/netio.c: solaris has sockaddr_storage, but using it doesn't work?! 2002-11-29 Simon Josefsson * lib/Makefile.am, lib/internal.h, lib/setenv.c, lib/setenv.h, lib/unsetenv.c: improved setenv LIBOBJs from Bruno. 2002-11-29 Simon Josefsson * lib/asn1.c, lib/kdcrep.c, lib/ticket.c: endian fixes 2002-11-28 Simon Josefsson * lib/setenv.c: copy from glibc that actually works 2002-11-28 Simon Josefsson * configure.ac: libtool obsoletes ranlib 2002-11-28 Simon Josefsson * lib/error.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcreq.c, lib/shishi.h.in: nonces are 4 bytes, remove shortnonce stuff. 2002-11-27 Simon Josefsson * AUTHORS: fix 2002-11-27 Simon Josefsson * lib/error.c: fix msg 2002-11-27 Simon Josefsson * extra/inetutils/libtelnet/Makefile.am: need more includes 2002-11-27 Simon Josefsson * lib/cfg.c, lib/init.c: print warnings 2002-11-27 Simon Josefsson * Makefile.am: make dist work 2002-11-27 Simon Josefsson * lib/shishi.h.in: add prototype 2002-11-27 Simon Josefsson * tests/Makefile.am: fix asn1 dir 2002-11-27 Simon Josefsson * extra/inetutils/Makefile.am, extra/inetutils/configure.ac, extra/inetutils/libtelnet/shishi.c, extra/inetutils/telnet/Makefile.am: fixes 2002-11-26 Simon Josefsson * extra/inetutils/headers/Makefile.am: extradist arpa/telnet.h 2002-11-26 Simon Josefsson * gdbm/Makefile.in: don't hardcode SHELL 2002-11-26 Simon Josefsson * Makefile.am, configure.ac: remove gdbm temporarily add ngettext check add setenv replacement 2002-11-26 Simon Josefsson * lib/setenv.c: new file, for system's that lack setenv() 2002-11-26 Simon Josefsson * lib/Makefile.am: extradist setenv.c 2002-11-26 Simon Josefsson * lib/internal.h, lib/ticketset.c: fix ngettext 2002-11-26 Simon Josefsson * src/Makefile.am: needs asn1 includes 2002-11-26 Simon Josefsson * src/data.h: _N is defined on solaris 2002-11-26 Simon Josefsson * tests/Makefile.am: need asn1 includes 2002-11-26 Simon Josefsson * extra/inetutils/configure.ac: fix 2002-11-26 Simon Josefsson * autogen.sh: add CFLAGS to cmd line history 2002-11-26 Simon Josefsson * extra/inetutils/.cvsignore, extra/inetutils/configure.ac, extra/inetutils/headers/.cvsignore, extra/inetutils/headers/ChangeLog, extra/inetutils/headers/Makefile.am, extra/inetutils/headers/arpa/telnet.h, extra/inetutils/headers/confpaths.h.in, extra/inetutils/headers/err.h, extra/inetutils/headers/getopt.h, extra/inetutils/headers/obstack.h, extra/inetutils/headers/paths.h, extra/inetutils/headers/poll.h, extra/inetutils/headers/tftpsubs.h, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libinetutils/tftpsubs.h, extra/inetutils/paths, extra/inetutils/telnet/.cvsignore, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnetd/.cvsignore, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/pty.c: fixes. 2002-11-26 Simon Josefsson * doc/shishi.texi: small fixes 2002-11-25 Simon Josefsson * configure.ac, extra/inetutils/configure.ac, extra/inetutils/libtelnet/shishi.c: remove krb5 stuff from inetutils remove ugly stuff configure.ac 2002-11-25 Simon Josefsson * extra/inetutils/telnetd/.cvsignore, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/shishi-telnetd.8, extra/inetutils/telnetd/telnetd.8: Rename telnetd shishi-telnetd. 2002-11-25 Simon Josefsson * extra/inetutils/telnet/.cvsignore: [no log message] 2002-11-25 Simon Josefsson * extra/inetutils/telnet/Makefile.am, extra/inetutils/telnet/telnet.1: call it shishi-telnet instead of telnet. 2002-11-25 Simon Josefsson * extra/inetutils/telnet/shishi-telnet.1: update for shishi 2002-11-25 Simon Josefsson * extra/inetutils/AUTHORS, extra/inetutils/ChangeLog, extra/inetutils/NEWS, extra/inetutils/README: Upstream files. 2002-11-25 Simon Josefsson * Makefile.am, README, configure.ac: extra/ 2002-11-25 Simon Josefsson * extra/README: [no log message] 2002-11-25 Simon Josefsson * extra/.cvsignore, extra/README, m4/.cvsignore, po/.cvsignore: [no log message] 2002-11-25 Simon Josefsson * extra/inetutils/AUTHORS, extra/inetutils/ChangeLog, extra/inetutils/Makefile.am, extra/inetutils/NEWS, extra/inetutils/README, extra/inetutils/configure.ac, extra/inetutils/libinetutils/.cvsignore, extra/inetutils/libinetutils/ChangeLog, extra/inetutils/libinetutils/Makefile.am, extra/inetutils/libinetutils/__progname.c, extra/inetutils/libinetutils/argcv.c, extra/inetutils/libinetutils/argcv.h, extra/inetutils/libinetutils/cleansess.c, extra/inetutils/libinetutils/daemon.c, extra/inetutils/libinetutils/des_rw.c, extra/inetutils/libinetutils/err.c, extra/inetutils/libinetutils/forkpty.c, extra/inetutils/libinetutils/getopt.c, extra/inetutils/libinetutils/getopt1.c, extra/inetutils/libinetutils/getpass.c, extra/inetutils/libinetutils/getusershell.c, extra/inetutils/libinetutils/herror.c, extra/inetutils/libinetutils/hstrerror.c, extra/inetutils/libinetutils/iruserok.c, extra/inetutils/libinetutils/kcmd.c, extra/inetutils/libinetutils/krcmd.c, extra/inetutils/libinetutils/localhost.c, extra/inetutils/libinetutils/login.c, extra/inetutils/libinetutils/login_tty.c, extra/inetutils/libinetutils/logout.c, extra/inetutils/libinetutils/logwtmp.c, extra/inetutils/libinetutils/logwtmpko.c, extra/inetutils/libinetutils/memcmp.c, extra/inetutils/libinetutils/memcpy.c, extra/inetutils/libinetutils/memmove.c, extra/inetutils/libinetutils/memset.c, extra/inetutils/libinetutils/obstack.c, extra/inetutils/libinetutils/openpty.c, extra/inetutils/libinetutils/opieclient.c, extra/inetutils/libinetutils/pathmax.h, extra/inetutils/libinetutils/poll.c, extra/inetutils/libinetutils/readstream.c, extra/inetutils/libinetutils/regex.c, extra/inetutils/libinetutils/regex.h, extra/inetutils/libinetutils/revoke.c, extra/inetutils/libinetutils/ruserok.c, extra/inetutils/libinetutils/setenv.c, extra/inetutils/libinetutils/setsig.c, extra/inetutils/libinetutils/snprintf.c, extra/inetutils/libinetutils/snprintf.h, extra/inetutils/libinetutils/strcasecmp.c, extra/inetutils/libinetutils/strdup.c, extra/inetutils/libinetutils/strerror.c, extra/inetutils/libinetutils/strsignal.c, extra/inetutils/libinetutils/stub_tgetent.c, extra/inetutils/libinetutils/syslog.c, extra/inetutils/libinetutils/tftpsubs.c, extra/inetutils/libinetutils/tftpsubs.h, extra/inetutils/libinetutils/ttymsg.c, extra/inetutils/libinetutils/utmp_init.c, extra/inetutils/libinetutils/utmp_logout.c, extra/inetutils/libinetutils/waitpid.c, extra/inetutils/libinetutils/xgetcwd.c, extra/inetutils/libinetutils/xmalloc.c, extra/inetutils/libinetutils/xstrdup.c, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/pty.c: Now it works. 2002-11-25 Simon Josefsson * extra/Makefile.am, extra/README, extra/inetutils.diff: Add inetutils in extra/. 2002-11-25 Simon Josefsson * extra/inetutils/Makefile.am, extra/inetutils/acinclude.m4, extra/inetutils/configure.ac, extra/inetutils/libtelnet/.cvsignore, extra/inetutils/libtelnet/ChangeLog, extra/inetutils/libtelnet/Makefile.am, extra/inetutils/libtelnet/auth-proto.h, extra/inetutils/libtelnet/auth.c, extra/inetutils/libtelnet/auth.h, extra/inetutils/libtelnet/enc-proto.h, extra/inetutils/libtelnet/enc_des.c, extra/inetutils/libtelnet/encrypt.c, extra/inetutils/libtelnet/encrypt.h, extra/inetutils/libtelnet/forward.c, extra/inetutils/libtelnet/genget.c, extra/inetutils/libtelnet/getent.c, extra/inetutils/libtelnet/kerberos.c, extra/inetutils/libtelnet/kerberos5.c, extra/inetutils/libtelnet/key-proto.h, extra/inetutils/libtelnet/misc-proto.h, extra/inetutils/libtelnet/misc.c, extra/inetutils/libtelnet/misc.h, extra/inetutils/libtelnet/read_passwd.c, extra/inetutils/libtelnet/shishi.c, extra/inetutils/telnet/.cvsignore, extra/inetutils/telnet/ChangeLog, extra/inetutils/telnet/Makefile.am, extra/inetutils/telnet/README.sec, extra/inetutils/telnet/authenc.c, extra/inetutils/telnet/commands.c, extra/inetutils/telnet/defines.h, extra/inetutils/telnet/externs.h, extra/inetutils/telnet/fdset.h, extra/inetutils/telnet/general.h, extra/inetutils/telnet/krb4-proto.h, extra/inetutils/telnet/main.c, extra/inetutils/telnet/network.c, extra/inetutils/telnet/ring.c, extra/inetutils/telnet/ring.h, extra/inetutils/telnet/sys_bsd.c, extra/inetutils/telnet/telnet.1, extra/inetutils/telnet/telnet.c, extra/inetutils/telnet/terminal.c, extra/inetutils/telnet/tn3270.c, extra/inetutils/telnet/types.h, extra/inetutils/telnet/utilities.c, extra/inetutils/telnetd/.cvsignore, extra/inetutils/telnetd/ChangeLog, extra/inetutils/telnetd/Makefile.am, extra/inetutils/telnetd/README.sec, extra/inetutils/telnetd/pty.c, extra/inetutils/telnetd/slc.c, extra/inetutils/telnetd/state.c, extra/inetutils/telnetd/telnetd.8, extra/inetutils/telnetd/telnetd.c, extra/inetutils/telnetd/telnetd.h, extra/inetutils/telnetd/term.c, extra/inetutils/telnetd/termstat.c, extra/inetutils/telnetd/utility.c: Initial stripped down GNU Inetutils import. 2002-11-25 Simon Josefsson * extra/inetutils/.cvsignore: [no log message] 2002-11-25 Simon Josefsson * po/LINGUAS, po/Makevars, po/POTFILES.in, po/shishi.pot, po/sv.po: [no log message] 2002-11-25 Simon Josefsson * lib/kdcrep.c: remove debug code 2002-11-25 Simon Josefsson * lib/Makefile.am: EXTRA_DIST crypt-*.c 2002-11-25 Simon Josefsson * doc/shishi.texi: todo's 2002-11-25 Simon Josefsson * m4/.cvsignore: [no log message] 2002-11-25 Simon Josefsson * .cvsignore, m4/Makefile.am, m4/pkg.m4: [no log message] 2002-11-25 Simon Josefsson * config.rpath, mkinstalldirs: [no log message] 2002-11-25 Simon Josefsson * README, THANKS, configure.ac, shishi.pc.in: add copyright 2002-11-25 Simon Josefsson * AUTHORS, README: [no log message] 2002-11-25 Simon Josefsson * README: Move platforms to doc/shishi.texi 2002-11-25 Simon Josefsson * .cvsignore, doc/.cvsignore, gdbm/.cvsignore: [no log message] 2002-11-25 Simon Josefsson * doc/shishi.texi: Add user manual, reporting bugs, supported platforms. 2002-11-23 Simon Josefsson * gdbm/.cvsignore: [no log message] 2002-11-23 Simon Josefsson * lib/crypto-des.c, lib/ticketset.c: fixes. 2002-11-23 Simon Josefsson * src/shishi.c: fixes 2002-11-23 Simon Josefsson * gdbm/autoconf.h.in, gdbm/configure, gdbm/ltmain.sh: remove junk 2002-11-23 Simon Josefsson * lib/crypto-des.c: remove md4 junk 2002-11-23 Simon Josefsson * autogen.sh: use autoreconf 2002-11-23 Simon Josefsson * configure.ac: Gettext version for autoreconf. 2002-11-22 Simon Josefsson * doc/shishi.texi: User/Administration Manual sections. 2002-11-22 Simon Josefsson * lib/ap.c, lib/aprep.c, lib/diskio.c, lib/encapreppart.c, lib/internal.h, lib/shishi.h.in: Add high-level AP functions. 2002-11-22 Simon Josefsson * README: [no log message] 2002-11-22 Simon Josefsson * lib/apreq.c, lib/diskio.c, lib/kdcrep.c, lib/ticket.c: "kerberos" is a dirty word. 2002-11-22 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-null.c, lib/crypto.c: Remove keytype from some functions. 2002-11-22 Simon Josefsson * doc/shishi.texi: Add crypto overview. Fixes. 2002-11-22 Simon Josefsson * lib/crypto.c: Cleanup. 2002-11-22 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c: remove junk. 2002-11-22 Simon Josefsson * lib/apreq.c, lib/as.c, lib/crypto-3des.c, lib/crypto-des.c, lib/crypto-lowlevel.c, lib/crypto-simplified.c, lib/crypto-utils.c, lib/crypto.c, lib/error.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/shishi.h.in, src/kdc.c: 3DES TGS works. 2002-11-22 Simon Josefsson * tests/Makefile.am: Don't link with libtasn1. 2002-11-22 Simon Josefsson * configure.ac: Fixes. Add stringprep. 2002-11-22 Simon Josefsson * Makefile.am: test/ renamed to tests/ (repository mv). 2002-11-22 Simon Josefsson * NEWS: [no log message] 2002-11-22 Simon Josefsson * shishi.conf.in: Add server-realm. 2002-11-22 Simon Josefsson * shishi.pc.in: Move gcrypt after shishi. 2002-11-22 Simon Josefsson * src/shishid.c: Read CFG in library. 2002-11-22 Simon Josefsson * src/data.h: Add TGS client/server name. 2002-11-22 Simon Josefsson * src/Makefile.am: Don't link with libtasn. 2002-11-22 Simon Josefsson * src/crypto.c, src/server.c: Crypto updates. 2002-11-22 Simon Josefsson * src/shishi.c: Add --client-name and --server-name for TGS. Read cfg and create ticketset within library. 2002-11-22 Simon Josefsson * lib/tgs.c: Inline call. 2002-11-22 Simon Josefsson * lib/done.c: Free some more. 2002-11-22 Simon Josefsson * lib/asn1.c: remove errorDescription from shishi_d2a_apprep 2002-11-22 Simon Josefsson * lib/kdc.c: Str2key parameter. 2002-11-22 Simon Josefsson * lib/realm.c: Map server to realm. 2002-11-22 Simon Josefsson * lib/ticketset.c: Handle library default ticketset. 2002-11-22 Simon Josefsson * lib/kdcrep.c, lib/ticket.c: Crypto key usage fixes. 2002-11-22 Simon Josefsson * lib/internal.h: Fix keyusage enum. Add cfg and ticketset. 2002-11-22 Simon Josefsson * lib/init.c: Read config files and ticketset in shishi_init(). 2002-11-22 Simon Josefsson * lib/cfg.c: Add shishi_cfg_default_*. 2002-11-22 Simon Josefsson * lib/authenticator.c: Cleanup cksum type selection a little. 2002-11-22 Simon Josefsson * lib/apreq.c: Crypto keyusage. 2002-11-22 Simon Josefsson * lib/aprep.c: Encrypt with key usage. 2002-11-22 Simon Josefsson * lib/shishi.h.in: Cleanups 2002-11-22 Simon Josefsson * lib/vasprintf.c: shishi_asprintf(). 2002-11-22 Simon Josefsson * lib/Makefile.am: Add vasprintf, pkcs5. Link asn1 stuff directly. 2002-11-22 Simon Josefsson * lib/.cvsignore: [no log message] 2002-11-22 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto-lowlevel.c, lib/crypto-null.c, lib/crypto-simplified.c, lib/crypto-utils.c, lib/crypto.c: Split crypto files more. AES works. 2002-11-22 Simon Josefsson * tests/crypto.c: Add AES test vectors. 2002-11-20 Simon Josefsson * doc/.cvsignore, doc/specifications/rfc2898.txt, doc/specifications/rfc2941.txt, doc/specifications/rfc2942.txt, doc/specifications/rfc2946.txt, doc/specifications/rfc2947.txt, doc/specifications/rfc2948.txt, doc/specifications/rfc2952.txt, doc/specifications/rfc2953.txt: [no log message] 2002-11-20 Simon Josefsson * lib/pkcs5.c: Check libgcrypt return codes. 2002-11-20 Simon Josefsson * lib/crypto-3des.c, lib/crypto-aes.c, lib/crypto-des.c, lib/crypto.c: Split crypto file. Some initial AES stuff. Maybe other things. 2002-11-14 Simon Josefsson * argp/.cvsignore: [no log message] 2002-11-14 Simon Josefsson * argp/depcomp, argp/install-sh, argp/missing, argp/mkinstalldirs: Removed junk (automatically generated). 2002-11-08 Simon Josefsson * lib/pkcs5.c: Fix bug. 2002-11-08 Simon Josefsson * lib/pkcs5.c, lib/pkcs5.h, tests/crypto.c: Add PKCS5 PBKDF2 implementation. 2002-11-08 Simon Josefsson * doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-02.txt: [no log message] 2002-11-07 Simon Josefsson * shishi.pc.in: Add -R. 2002-11-05 Simon Josefsson * lib/rfc1510bis.asn1: Make it compile with buggy libtasn1. 2002-11-04 Simon Josefsson * Makefile.am, README, doc/.cvsignore, doc/Makefile.am, doc/shishi.texi, doc/specifications/draft-raeburn-krb-rijndael-krb-02.txt, gdbm/gdbm.info, lib/.cvsignore, lib/Makefile.am, lib/as.c, lib/asn1.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/init.c, lib/internal.h, lib/netio.c, lib/password.c, lib/shishi.h.in, lib/tgs.c, lib/ticket.c, lib/ticketset.c, shishi.conf.in, shishi.skel.in, src/Makefile.am, src/authp.c, src/client.c, src/data.h, src/kdc.c, src/list.c, src/shishi.c, src/shishid.c, tests/crypto.c: Add kdc-timeout and kdc-retries configuration file settings. Manual improvements. Added MOD-CRC32 and test vectors. Added MD4 (to be replaced by my patch to libgcrypt). Added Shishi_as and Shishi_tgs structures for high-level KDC exchanges. Separated KDC command into high-level AS, TGS and low-level KDC. 2002-11-01 Simon Josefsson * README, lib/aprep.c, lib/apreq.c, lib/authenticator.c, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/encapreppart.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/netio.c, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c, shishi.conf.in, src/kdc.c, src/shishi.c, src/shishid.c: Reworked silent/verbose/debug handling in library. Handles more than one KDC. 2002-10-30 Simon Josefsson * lib/asn1.c, lib/netio.c, src/Makefile.am, src/shishid.c: Improve daemon. 2002-10-30 Simon Josefsson * Makefile.am: EXTRA_DIST gdbm until it has automake. 2002-10-30 Simon Josefsson * Makefile.am, README, autogen.sh, configure.ac, gdbm/.cvsignore, lib/Makefile.am, lib/netio.c, src/.cvsignore, src/Makefile.am, src/shishid.c, tests/Makefile.am: Remove dependency on GNET Add GDBM 2002-10-30 Simon Josefsson * gdbm/Makefile.in: Add dummy distdir and distcheck targets. 2002-10-30 Simon Josefsson * gdbm/COPYING, gdbm/ChangeLog, gdbm/INSTALL, gdbm/Makefile.in, gdbm/NEWS, gdbm/README, gdbm/aclocal.m4, gdbm/autoconf.h.in, gdbm/bucket.c, gdbm/close.c, gdbm/config.guess, gdbm/config.sub, gdbm/configure, gdbm/configure.in, gdbm/conv2gdbm.c, gdbm/dbm.h, gdbm/dbmclose.c, gdbm/dbmdelete.c, gdbm/dbmdirfno.c, gdbm/dbmfetch.c, gdbm/dbminit.c, gdbm/dbmopen.c, gdbm/dbmpagfno.c, gdbm/dbmrdonly.c, gdbm/dbmseq.c, gdbm/dbmstore.c, gdbm/delete.c, gdbm/extern.h, gdbm/falloc.c, gdbm/fetch.c, gdbm/findkey.c, gdbm/gdbm.3, gdbm/gdbm.info, gdbm/gdbm.proto, gdbm/gdbm.proto2, gdbm/gdbm.texinfo, gdbm/gdbmclose.c, gdbm/gdbmconst.h, gdbm/gdbmdefs.h, gdbm/gdbmdelete.c, gdbm/gdbmerrno.c, gdbm/gdbmerrno.h, gdbm/gdbmexists.c, gdbm/gdbmfdesc.c, gdbm/gdbmfetch.c, gdbm/gdbmopen.c, gdbm/gdbmreorg.c, gdbm/gdbmseq.c, gdbm/gdbmsetopt.c, gdbm/gdbmstore.c, gdbm/gdbmsync.c, gdbm/getopt.c, gdbm/getopt.h, gdbm/global.c, gdbm/hash.c, gdbm/install-sh, gdbm/ltmain.sh, gdbm/mkinstalldirs, gdbm/ndbm.h, gdbm/proto.h, gdbm/seq.c, gdbm/store.c, gdbm/systems.h, gdbm/testdbm.c, gdbm/testgdbm.c, gdbm/testndbm.c, gdbm/update.c, gdbm/version.c: Add gdbm-1.8.3 2002-10-28 Simon Josefsson * lib/apreq.c, lib/authenticator.c, lib/crypto.c, lib/kdcrep.c, lib/kdcreq.c, lib/shishi.h.in, src/kdc.c: des3-cbc-hmac-sha1-kd AS works. 2002-10-26 Simon Josefsson * .cvsignore, lib/cfg.c, lib/init.c, lib/internal.h, lib/kdcreq.c, shishi.conf.in, shishi.skel.in: Add client-kdc-etypes configuration option. 2002-10-26 Simon Josefsson * .cvsignore, .cvsusers, Makefile.am, acinclude.m4, doc/.cvsignore, lib/.cvsignore, src/.cvsignore, tests/.cvsignore: [no log message] 2002-10-26 Simon Josefsson * config.rpath, mkinstalldirs: gettextize want these 2002-10-26 Simon Josefsson * AUTHORS, Makefile.am, NEWS, README, THANKS, autogen.sh, configure.ac, doc/Makefile.am, doc/fdl.texi, doc/gdoc, doc/gpl.texi, doc/lgpl.texi, doc/shishi.texi, doc/specifications/arith.int.html, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-01.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-02.txt, doc/specifications/draft-brezak-win2k-krb-rc4-hmac-03.txt, doc/specifications/draft-hornstein-dhc-kerbauth-02.txt, doc/specifications/draft-horowitz-key-derivation-01.txt, doc/specifications/draft-ietf-cat-gssv2-08.txt, doc/specifications/draft-ietf-cat-gssv2-cbind-04.txt, doc/specifications/draft-ietf-cat-iakerb-04.txt, doc/specifications/draft-ietf-cat-iakerb-08.txt, doc/specifications/draft-ietf-cat-kerb-chg-password-02.txt, doc/specifications/draft-ietf-cat-kerb-des3-hmac-sha1-00.txt, doc/specifications/draft-ietf-cat-kerb-key-derivation-00.txt, doc/specifications/draft-ietf-cat-kerberos-err-msg-00.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-02.txt, doc/specifications/draft-ietf-cat-kerberos-extra-tgt-03.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-01.txt, doc/specifications/draft-ietf-cat-kerberos-pk-cross-06.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-11.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-12.txt, doc/specifications/draft-ietf-cat-kerberos-pk-init-16.txt, doc/specifications/draft-ietf-cat-kerberos-pk-tapp-03.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-00.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-01.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-03.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-05.txt, doc/specifications/draft-ietf-cat-kerberos-revisions-06.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-02.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-03.txt, doc/specifications/draft-ietf-cat-kerberos-set-passwd-06.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-00.txt, doc/specifications/draft-ietf-cat-krb-dns-locate-02.txt, doc/specifications/draft-ietf-cat-krb5gss-mech2-03.txt, doc/specifications/draft-ietf-ftpext-mlst-08.txt, doc/specifications/draft-ietf-krb-wg-crypto-01.txt, doc/specifications/draft-ietf-krb-wg-crypto-02.txt, doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-00.txt , doc/specifications/draft-ietf-krb-wg-kerberos-clarifications-01.txt , doc/specifications/draft-ietf-krb-wg-kerberos-referrals-00.txt, doc/specifications/draft-ietf-krb-wg-krb-dns-locate-02.txt, doc/specifications/draft-ietf-krb-wg-krb-dns-locate-03.txt, doc/specifications/draft-ietf-krb-wg-utf8-profile-00.txt, doc/specifications/draft-raeburn-cat-gssapi-krb5-3des-00.txt, doc/specifications/draft-raeburn-krb-gssapi-krb5-3des-01.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-01.txt, doc/specifications/draft-raeburn-krb-rijndael-krb-02-D.txt, doc/specifications/draft-skibbie-krb-kdc-ldap-schema-02.txt, doc/specifications/draft-skibbie-krb-kdckeys-ldap-schema-00.txt, doc/specifications/draft-smedvinsky-dhc-kerbauth-01.txt, doc/specifications/draft-swift-win2k-krb-referrals-01.txt, doc/specifications/draft-swift-win2k-krb-user2user-01.txt, doc/specifications/draft-thomas-snmpv3-kerbusm-00.txt, doc/specifications/draft-trostle-win2k-cat-kerberos-set-passwd-00.t xt, doc/specifications/draft-tso-telnet-krb5-04.txt, doc/specifications/kcrypto.txt, doc/specifications/rc4-hmac.txt, doc/specifications/rfc1508.txt, doc/specifications/rfc1509.txt, doc/specifications/rfc1510.txt, doc/specifications/rfc1750.txt, doc/specifications/rfc1831.txt, doc/specifications/rfc1964.txt, doc/specifications/rfc2078.txt, doc/specifications/rfc2203.txt, doc/specifications/rfc2228.txt, doc/specifications/rfc2743.txt, doc/specifications/rfc2744.txt, doc/specifications/typos-rfc1510.txt, lib/Makefile.am, lib/ap.c, lib/aprep.c, lib/apreq.c, lib/asn1.c, lib/authenticator.c, lib/base64.c, lib/cfg.c, lib/crypto.c, lib/diskio.c, lib/done.c, lib/encapreppart.c, lib/enckdcreppart.c, lib/encticketpart.c, lib/error.c, lib/gettext.h, lib/gztime.c, lib/init.c, lib/internal.h, lib/kdc.c, lib/kdcrep.c, lib/kdcreq.c, lib/netio.c, lib/password.c, lib/principal.c, lib/realm.c, lib/rfc1510.asn1, lib/rfc1510bis.asn1, lib/rfc1510bis.asn1.orig, lib/shishi.h.in, lib/ticket.c, lib/ticketset.c, lib/version.c, shishi.conf.in, shishi.pc.in, shishi.skel.in, src/Makefile.am, src/authp.c, src/client.c, src/crypto.c, src/data.h, src/gettext.h, src/kdc.c, src/list.c, src/server.c, src/shishi.c, tests/Makefile.am, tests/crypto.c: Moved development into CVS. 2002-10-19 Simon Josefsson * argp/.cvsignore: [no log message] 2002-10-19 Simon Josefsson * argp/aclocal.m4, argp/configure: These should not be in CVS. 2002-10-07 Simon Josefsson * argp/.cvsignore: [no log message] 2002-10-07 Simon Josefsson * Initial release, version 0.0.0. Copyright (C) 2002-2013 Simon Josefsson This file is part of Shishi. Shishi 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. Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. shishi-1.0.2/src/0000755000000000000000000000000012126773313010544 500000000000000shishi-1.0.2/src/shishi_cmd.c0000644000000000000000000011677012126773076012764 00000000000000/* File autogenerated by gengetopt version 2.22.5 generated with the following command: gengetopt --unamed-opts=CLIENT [SERVER] --no-handle-help --no-handle-error --no-handle-version --input ./shishi.ggo --file-name shishi_cmd The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: we make no copyright claims on it. */ /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif #include #include "shishi_cmd.h" const char *gengetopt_args_info_purpose = "Shishi command line client. If no command is given, Shishi\nacquire or list a valid ticket for you, identified by CLIENT (if\nempty, default username in default realm), for the service SERVER (if\nempty, ticket granting ticket for client realm)."; const char *gengetopt_args_info_usage = "Usage: shishi [OPTIONS]... [CLIENT [SERVER]]..."; const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_help[] = { " -h, --help Print help and exit", " -V, --version Print version and exit", "\nCommands:", " -d, --destroy Destroy tickets in local cache, limited by any \n --client-name or --server-name. \n (default=off)", " -l, --list List tickets in local cache, limited by any \n --client-name and --server-name. \n (default=off)", " -r, --renew Renew ticket. Use --server-name to specify \n ticket, default is the most recent renewable \n ticket granting ticket for the default realm. \n (default=off)", "\nFlags:", " --forwardable Get a forwardable ticket, i.e., one that can be \n used to get forwarded tickets. (default=off)", " --forwarded Get a forwarded ticket. (default=off)", " --proxiable Get a proxiable ticket, i.e., one that can be \n used to get proxy tickets. (default=off)", " --proxy Get a proxy ticket. (default=off)", " --renewable Get a renewable ticket. (default=off)", "\nOptions:", " --client-name=NAME Client name. Default is login username.", " -E, --encryption-type=ETYPE,[ETYPE...]\n Encryption types to use. ETYPE is either \n registered name or integer. Valid values \n include 'aes128', 'aes256', 'aes' (same as \n 'aes256'), '3des', 'des-md5', 'des-md4', \n 'des-crc', 'des' (same as 'des-md5'), and \n 'arcfour'.", " -e, --endtime=STRING Specify when ticket validity should expire. \n The time syntax may be relative (to the start \n time), such as '20 hours', or absolute, such \n as '2001-02-03 04:05:06 CET'. The default is \n 8 hours after the start time.", " --realm=STRING Set default realm.", " --renew-till=STRING Specify renewable life of ticket. Implies \n --renewable. Accepts same time syntax as \n --endtime. If --renewable is specified, the \n default is 1 week after the start time.", " --server-name=NAME Server name. Default is 'krbtgt/REALM' where \n REALM is client realm.", " -s, --starttime=STRING Specify when ticket should start to be valid. \n Accepts same time syntax as --endtime. The \n default is to become valid immediately.", " --ticket-granter=NAME Service name in ticket to use for \n authenticating request. Only for TGS. \n Defaults to 'krbtgt/REALM@REALM' where REALM \n is client realm.", "\nOther options:", " --configuration-file=FILE Read user configuration from FILE.", " -c, --ticket-file=FILE Read tickets from FILE.", " -o, --library-options=STRING Parse STRING as a configuration file statement.", " -q, --quiet Don't produce any diagnostic output.\n (default=off)", " --system-configuration-file=FILE\n Read system configuration from FILE.", " --ticket-write-file=FILE Write tickets from FILE. Default is to write \n them back to where they were read from.", " -v, --verbose Produce verbose output.\n Use multiple times to increase amount of \n information.", 0 }; typedef enum {ARG_NO , ARG_FLAG , ARG_STRING } cmdline_parser_arg_type; static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error); static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); static char * gengetopt_strdup (const char *s); static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->destroy_given = 0 ; args_info->list_given = 0 ; args_info->renew_given = 0 ; args_info->forwardable_given = 0 ; args_info->forwarded_given = 0 ; args_info->proxiable_given = 0 ; args_info->proxy_given = 0 ; args_info->renewable_given = 0 ; args_info->client_name_given = 0 ; args_info->encryption_type_given = 0 ; args_info->endtime_given = 0 ; args_info->realm_given = 0 ; args_info->renew_till_given = 0 ; args_info->server_name_given = 0 ; args_info->starttime_given = 0 ; args_info->ticket_granter_given = 0 ; args_info->configuration_file_given = 0 ; args_info->ticket_file_given = 0 ; args_info->library_options_given = 0 ; args_info->quiet_given = 0 ; args_info->system_configuration_file_given = 0 ; args_info->ticket_write_file_given = 0 ; args_info->verbose_given = 0 ; } static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->destroy_flag = 0; args_info->list_flag = 0; args_info->renew_flag = 0; args_info->forwardable_flag = 0; args_info->forwarded_flag = 0; args_info->proxiable_flag = 0; args_info->proxy_flag = 0; args_info->renewable_flag = 0; args_info->client_name_arg = NULL; args_info->client_name_orig = NULL; args_info->encryption_type_arg = NULL; args_info->encryption_type_orig = NULL; args_info->endtime_arg = NULL; args_info->endtime_orig = NULL; args_info->realm_arg = NULL; args_info->realm_orig = NULL; args_info->renew_till_arg = NULL; args_info->renew_till_orig = NULL; args_info->server_name_arg = NULL; args_info->server_name_orig = NULL; args_info->starttime_arg = NULL; args_info->starttime_orig = NULL; args_info->ticket_granter_arg = NULL; args_info->ticket_granter_orig = NULL; args_info->configuration_file_arg = NULL; args_info->configuration_file_orig = NULL; args_info->ticket_file_arg = NULL; args_info->ticket_file_orig = NULL; args_info->library_options_arg = NULL; args_info->library_options_orig = NULL; args_info->quiet_flag = 0; args_info->system_configuration_file_arg = NULL; args_info->system_configuration_file_orig = NULL; args_info->ticket_write_file_arg = NULL; args_info->ticket_write_file_orig = NULL; } static void init_args_info(struct gengetopt_args_info *args_info) { args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->destroy_help = gengetopt_args_info_help[3] ; args_info->list_help = gengetopt_args_info_help[4] ; args_info->renew_help = gengetopt_args_info_help[5] ; args_info->forwardable_help = gengetopt_args_info_help[7] ; args_info->forwarded_help = gengetopt_args_info_help[8] ; args_info->proxiable_help = gengetopt_args_info_help[9] ; args_info->proxy_help = gengetopt_args_info_help[10] ; args_info->renewable_help = gengetopt_args_info_help[11] ; args_info->client_name_help = gengetopt_args_info_help[13] ; args_info->encryption_type_help = gengetopt_args_info_help[14] ; args_info->endtime_help = gengetopt_args_info_help[15] ; args_info->realm_help = gengetopt_args_info_help[16] ; args_info->renew_till_help = gengetopt_args_info_help[17] ; args_info->server_name_help = gengetopt_args_info_help[18] ; args_info->starttime_help = gengetopt_args_info_help[19] ; args_info->ticket_granter_help = gengetopt_args_info_help[20] ; args_info->configuration_file_help = gengetopt_args_info_help[22] ; args_info->ticket_file_help = gengetopt_args_info_help[23] ; args_info->library_options_help = gengetopt_args_info_help[24] ; args_info->quiet_help = gengetopt_args_info_help[25] ; args_info->system_configuration_file_help = gengetopt_args_info_help[26] ; args_info->ticket_write_file_help = gengetopt_args_info_help[27] ; args_info->verbose_help = gengetopt_args_info_help[28] ; args_info->verbose_min = 0; args_info->verbose_max = 0; } void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); } static void print_help_common(void) { cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); if (strlen(gengetopt_args_info_usage) > 0) printf("\n%s\n", gengetopt_args_info_usage); printf("\n"); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\n", gengetopt_args_info_description); } void cmdline_parser_print_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } void cmdline_parser_init (struct gengetopt_args_info *args_info) { clear_given (args_info); clear_args (args_info); init_args_info (args_info); args_info->inputs = 0; args_info->inputs_num = 0; } void cmdline_parser_params_init(struct cmdline_parser_params *params) { if (params) { params->override = 0; params->initialize = 1; params->check_required = 1; params->check_ambiguity = 0; params->print_errors = 1; } } struct cmdline_parser_params * cmdline_parser_params_create(void) { struct cmdline_parser_params *params = (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); cmdline_parser_params_init(params); return params; } static void free_string_field (char **s) { if (*s) { free (*s); *s = 0; } } static void cmdline_parser_release (struct gengetopt_args_info *args_info) { unsigned int i; free_string_field (&(args_info->client_name_arg)); free_string_field (&(args_info->client_name_orig)); free_string_field (&(args_info->encryption_type_arg)); free_string_field (&(args_info->encryption_type_orig)); free_string_field (&(args_info->endtime_arg)); free_string_field (&(args_info->endtime_orig)); free_string_field (&(args_info->realm_arg)); free_string_field (&(args_info->realm_orig)); free_string_field (&(args_info->renew_till_arg)); free_string_field (&(args_info->renew_till_orig)); free_string_field (&(args_info->server_name_arg)); free_string_field (&(args_info->server_name_orig)); free_string_field (&(args_info->starttime_arg)); free_string_field (&(args_info->starttime_orig)); free_string_field (&(args_info->ticket_granter_arg)); free_string_field (&(args_info->ticket_granter_orig)); free_string_field (&(args_info->configuration_file_arg)); free_string_field (&(args_info->configuration_file_orig)); free_string_field (&(args_info->ticket_file_arg)); free_string_field (&(args_info->ticket_file_orig)); free_string_field (&(args_info->library_options_arg)); free_string_field (&(args_info->library_options_orig)); free_string_field (&(args_info->system_configuration_file_arg)); free_string_field (&(args_info->system_configuration_file_orig)); free_string_field (&(args_info->ticket_write_file_arg)); free_string_field (&(args_info->ticket_write_file_orig)); for (i = 0; i < args_info->inputs_num; ++i) free (args_info->inputs [i]); if (args_info->inputs_num) free (args_info->inputs); clear_given (args_info); } static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { FIX_UNUSED (values); if (arg) { fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } } static void write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) { int i; for (i = 0; i < len; ++i) write_into_file(outfile, opt, (arg ? arg[i] : 0), values); } int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0; if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; } if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); if (args_info->destroy_given) write_into_file(outfile, "destroy", 0, 0 ); if (args_info->list_given) write_into_file(outfile, "list", 0, 0 ); if (args_info->renew_given) write_into_file(outfile, "renew", 0, 0 ); if (args_info->forwardable_given) write_into_file(outfile, "forwardable", 0, 0 ); if (args_info->forwarded_given) write_into_file(outfile, "forwarded", 0, 0 ); if (args_info->proxiable_given) write_into_file(outfile, "proxiable", 0, 0 ); if (args_info->proxy_given) write_into_file(outfile, "proxy", 0, 0 ); if (args_info->renewable_given) write_into_file(outfile, "renewable", 0, 0 ); if (args_info->client_name_given) write_into_file(outfile, "client-name", args_info->client_name_orig, 0); if (args_info->encryption_type_given) write_into_file(outfile, "encryption-type", args_info->encryption_type_orig, 0); if (args_info->endtime_given) write_into_file(outfile, "endtime", args_info->endtime_orig, 0); if (args_info->realm_given) write_into_file(outfile, "realm", args_info->realm_orig, 0); if (args_info->renew_till_given) write_into_file(outfile, "renew-till", args_info->renew_till_orig, 0); if (args_info->server_name_given) write_into_file(outfile, "server-name", args_info->server_name_orig, 0); if (args_info->starttime_given) write_into_file(outfile, "starttime", args_info->starttime_orig, 0); if (args_info->ticket_granter_given) write_into_file(outfile, "ticket-granter", args_info->ticket_granter_orig, 0); if (args_info->configuration_file_given) write_into_file(outfile, "configuration-file", args_info->configuration_file_orig, 0); if (args_info->ticket_file_given) write_into_file(outfile, "ticket-file", args_info->ticket_file_orig, 0); if (args_info->library_options_given) write_into_file(outfile, "library-options", args_info->library_options_orig, 0); if (args_info->quiet_given) write_into_file(outfile, "quiet", 0, 0 ); if (args_info->system_configuration_file_given) write_into_file(outfile, "system-configuration-file", args_info->system_configuration_file_orig, 0); if (args_info->ticket_write_file_given) write_into_file(outfile, "ticket-write-file", args_info->ticket_write_file_orig, 0); write_multiple_into_file(outfile, args_info->verbose_given, "verbose", 0, 0); i = EXIT_SUCCESS; return i; } int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) { FILE *outfile; int i = 0; outfile = fopen(filename, "w"); if (!outfile) { fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); return EXIT_FAILURE; } i = cmdline_parser_dump(outfile, args_info); fclose (outfile); return i; } void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); } /** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result; result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; } static int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc); int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) { int error = 0; if (option_given && (min > 0 || max > 0)) { if (min > 0 && max > 0) { if (min == max) { /* specific occurrences */ if (option_given != (unsigned int) min) { fprintf (stderr, "%s: %s option occurrences must be %d\n", prog_name, option_desc, min); error = 1; } } else if (option_given < (unsigned int) min || option_given > (unsigned int) max) { /* range occurrences */ fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", prog_name, option_desc, min, max); error = 1; } } else if (min > 0) { /* at least check */ if (option_given < min) { fprintf (stderr, "%s: %s option occurrences must be at least %d\n", prog_name, option_desc, min); error = 1; } } else if (max > 0) { /* at most check */ if (option_given > max) { fprintf (stderr, "%s: %s option occurrences must be at most %d\n", prog_name, option_desc, max); error = 1; } } } return error; } int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) { return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params) { int result; result = cmdline_parser_internal (argc, argv, args_info, params, 0); return result; } int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; struct cmdline_parser_params params; params.override = override; params.initialize = initialize; params.check_required = check_required; params.check_ambiguity = 0; params.print_errors = 1; result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); return result; } int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) { int result = EXIT_SUCCESS; if (cmdline_parser_required2(args_info, prog_name, 0) > 0) result = EXIT_FAILURE; return result; } int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) { int error = 0; FIX_UNUSED (additional_error); /* checks for required options */ if (check_multiple_option_occurrences(prog_name, args_info->verbose_given, args_info->verbose_min, args_info->verbose_max, "'--verbose' ('-v')")) error = 1; /* checks for dependences among options */ return error; } static char *package_name = 0; /** * @brief updates an option * @param field the generic pointer to the field to update * @param orig_field the pointer to the orig field * @param field_given the pointer to the number of occurrence of this option * @param prev_given the pointer to the number of occurrence already seen * @param value the argument for this option (if null no arg was specified) * @param possible_values the possible values for this option (if specified) * @param default_value the default value (in case the option only accepts fixed values) * @param arg_type the type of this option * @param check_ambiguity @see cmdline_parser_params.check_ambiguity * @param override @see cmdline_parser_params.override * @param no_free whether to free a possible previous value * @param multiple_option whether this is a multiple option * @param long_opt the corresponding long option * @param short_opt the corresponding short option (or '-' if none) * @param additional_error possible further error specification */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, int check_ambiguity, int override, int no_free, int multiple_option, const char *long_opt, char short_opt, const char *additional_error) { char *stop_char = 0; const char *val = value; int found; char **string_field; FIX_UNUSED (field); stop_char = 0; found = 0; if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) { if (short_opt != '-') fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", package_name, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: `--%s' option given more than once%s\n", package_name, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } FIX_UNUSED (default_value); if (field_given && *field_given && ! override) return 0; if (prev_given) (*prev_given)++; if (field_given) (*field_given)++; if (possible_values) val = possible_values[found]; switch(arg_type) { case ARG_FLAG: *((int *)field) = !*((int *)field); break; case ARG_STRING: if (val) { string_field = (char **)field; if (!no_free && *string_field) free (*string_field); /* free previous string */ *string_field = gengetopt_strdup (val); } break; default: break; }; /* store the original value */ switch(arg_type) { case ARG_NO: case ARG_FLAG: break; default: if (value && orig_field) { if (no_free) { *orig_field = value; } else { if (*orig_field) free (*orig_field); /* free previous string */ *orig_field = gengetopt_strdup (value); } } }; return 0; /* OK */ } int cmdline_parser_internal ( int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; int override; int initialize; int check_required; int check_ambiguity; package_name = argv[0]; override = params->override; initialize = params->initialize; check_required = params->check_required; check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); cmdline_parser_init (&local_args_info); optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?'; while (1) { int option_index = 0; static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, { "destroy", 0, NULL, 'd' }, { "list", 0, NULL, 'l' }, { "renew", 0, NULL, 'r' }, { "forwardable", 0, NULL, 0 }, { "forwarded", 0, NULL, 0 }, { "proxiable", 0, NULL, 0 }, { "proxy", 0, NULL, 0 }, { "renewable", 0, NULL, 0 }, { "client-name", 1, NULL, 0 }, { "encryption-type", 1, NULL, 'E' }, { "endtime", 1, NULL, 'e' }, { "realm", 1, NULL, 0 }, { "renew-till", 1, NULL, 0 }, { "server-name", 1, NULL, 0 }, { "starttime", 1, NULL, 's' }, { "ticket-granter", 1, NULL, 0 }, { "configuration-file", 1, NULL, 0 }, { "ticket-file", 1, NULL, 'c' }, { "library-options", 1, NULL, 'o' }, { "quiet", 0, NULL, 'q' }, { "system-configuration-file", 1, NULL, 0 }, { "ticket-write-file", 1, NULL, 0 }, { "verbose", 0, NULL, 'v' }, { 0, 0, 0, 0 } }; c = getopt_long (argc, argv, "hVdlrE:e:s:c:o:qv", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ switch (c) { case 'h': /* Print help and exit. */ if (update_arg( 0 , 0 , &(args_info->help_given), &(local_args_info.help_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "help", 'h', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'V': /* Print version and exit. */ if (update_arg( 0 , 0 , &(args_info->version_given), &(local_args_info.version_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "version", 'V', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'd': /* Destroy tickets in local cache, limited by any --client-name or --server-name.. */ if (update_arg((void *)&(args_info->destroy_flag), 0, &(args_info->destroy_given), &(local_args_info.destroy_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "destroy", 'd', additional_error)) goto failure; break; case 'l': /* List tickets in local cache, limited by any --client-name and --server-name.. */ if (update_arg((void *)&(args_info->list_flag), 0, &(args_info->list_given), &(local_args_info.list_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "list", 'l', additional_error)) goto failure; break; case 'r': /* Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm.. */ if (update_arg((void *)&(args_info->renew_flag), 0, &(args_info->renew_given), &(local_args_info.renew_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "renew", 'r', additional_error)) goto failure; break; case 'E': /* Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'.. */ if (update_arg( (void *)&(args_info->encryption_type_arg), &(args_info->encryption_type_orig), &(args_info->encryption_type_given), &(local_args_info.encryption_type_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "encryption-type", 'E', additional_error)) goto failure; break; case 'e': /* Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time.. */ if (update_arg( (void *)&(args_info->endtime_arg), &(args_info->endtime_orig), &(args_info->endtime_given), &(local_args_info.endtime_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "endtime", 'e', additional_error)) goto failure; break; case 's': /* Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately.. */ if (update_arg( (void *)&(args_info->starttime_arg), &(args_info->starttime_orig), &(args_info->starttime_given), &(local_args_info.starttime_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "starttime", 's', additional_error)) goto failure; break; case 'c': /* Read tickets from FILE.. */ if (update_arg( (void *)&(args_info->ticket_file_arg), &(args_info->ticket_file_orig), &(args_info->ticket_file_given), &(local_args_info.ticket_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "ticket-file", 'c', additional_error)) goto failure; break; case 'o': /* Parse STRING as a configuration file statement.. */ if (update_arg( (void *)&(args_info->library_options_arg), &(args_info->library_options_orig), &(args_info->library_options_given), &(local_args_info.library_options_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "library-options", 'o', additional_error)) goto failure; break; case 'q': /* Don't produce any diagnostic output. . */ if (update_arg((void *)&(args_info->quiet_flag), 0, &(args_info->quiet_given), &(local_args_info.quiet_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "quiet", 'q', additional_error)) goto failure; break; case 'v': /* Produce verbose output. Use multiple times to increase amount of information.. */ local_args_info.verbose_given++; break; case 0: /* Long option with no short option */ /* Get a forwardable ticket, i.e., one that can be used to get forwarded tickets.. */ if (strcmp (long_options[option_index].name, "forwardable") == 0) { if (update_arg((void *)&(args_info->forwardable_flag), 0, &(args_info->forwardable_given), &(local_args_info.forwardable_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "forwardable", '-', additional_error)) goto failure; } /* Get a forwarded ticket.. */ else if (strcmp (long_options[option_index].name, "forwarded") == 0) { if (update_arg((void *)&(args_info->forwarded_flag), 0, &(args_info->forwarded_given), &(local_args_info.forwarded_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "forwarded", '-', additional_error)) goto failure; } /* Get a proxiable ticket, i.e., one that can be used to get proxy tickets.. */ else if (strcmp (long_options[option_index].name, "proxiable") == 0) { if (update_arg((void *)&(args_info->proxiable_flag), 0, &(args_info->proxiable_given), &(local_args_info.proxiable_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "proxiable", '-', additional_error)) goto failure; } /* Get a proxy ticket.. */ else if (strcmp (long_options[option_index].name, "proxy") == 0) { if (update_arg((void *)&(args_info->proxy_flag), 0, &(args_info->proxy_given), &(local_args_info.proxy_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "proxy", '-', additional_error)) goto failure; } /* Get a renewable ticket.. */ else if (strcmp (long_options[option_index].name, "renewable") == 0) { if (update_arg((void *)&(args_info->renewable_flag), 0, &(args_info->renewable_given), &(local_args_info.renewable_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "renewable", '-', additional_error)) goto failure; } /* Client name. Default is login username.. */ else if (strcmp (long_options[option_index].name, "client-name") == 0) { if (update_arg( (void *)&(args_info->client_name_arg), &(args_info->client_name_orig), &(args_info->client_name_given), &(local_args_info.client_name_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "client-name", '-', additional_error)) goto failure; } /* Set default realm.. */ else if (strcmp (long_options[option_index].name, "realm") == 0) { if (update_arg( (void *)&(args_info->realm_arg), &(args_info->realm_orig), &(args_info->realm_given), &(local_args_info.realm_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "realm", '-', additional_error)) goto failure; } /* Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time.. */ else if (strcmp (long_options[option_index].name, "renew-till") == 0) { if (update_arg( (void *)&(args_info->renew_till_arg), &(args_info->renew_till_orig), &(args_info->renew_till_given), &(local_args_info.renew_till_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "renew-till", '-', additional_error)) goto failure; } /* Server name. Default is 'krbtgt/REALM' where REALM is client realm.. */ else if (strcmp (long_options[option_index].name, "server-name") == 0) { if (update_arg( (void *)&(args_info->server_name_arg), &(args_info->server_name_orig), &(args_info->server_name_given), &(local_args_info.server_name_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "server-name", '-', additional_error)) goto failure; } /* Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm.. */ else if (strcmp (long_options[option_index].name, "ticket-granter") == 0) { if (update_arg( (void *)&(args_info->ticket_granter_arg), &(args_info->ticket_granter_orig), &(args_info->ticket_granter_given), &(local_args_info.ticket_granter_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "ticket-granter", '-', additional_error)) goto failure; } /* Read user configuration from FILE.. */ else if (strcmp (long_options[option_index].name, "configuration-file") == 0) { if (update_arg( (void *)&(args_info->configuration_file_arg), &(args_info->configuration_file_orig), &(args_info->configuration_file_given), &(local_args_info.configuration_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "configuration-file", '-', additional_error)) goto failure; } /* Read system configuration from FILE.. */ else if (strcmp (long_options[option_index].name, "system-configuration-file") == 0) { if (update_arg( (void *)&(args_info->system_configuration_file_arg), &(args_info->system_configuration_file_orig), &(args_info->system_configuration_file_given), &(local_args_info.system_configuration_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "system-configuration-file", '-', additional_error)) goto failure; } /* Write tickets from FILE. Default is to write them back to where they were read from.. */ else if (strcmp (long_options[option_index].name, "ticket-write-file") == 0) { if (update_arg( (void *)&(args_info->ticket_write_file_arg), &(args_info->ticket_write_file_orig), &(args_info->ticket_write_file_given), &(local_args_info.ticket_write_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "ticket-write-file", '-', additional_error)) goto failure; } break; case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ goto failure; default: /* bug: option not considered. */ fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ args_info->verbose_given += local_args_info.verbose_given; local_args_info.verbose_given = 0; if (check_required) { error += cmdline_parser_required2 (args_info, argv[0], additional_error); } cmdline_parser_release (&local_args_info); if ( error ) return (EXIT_FAILURE); if (optind < argc) { int i = 0 ; int found_prog_name = 0; /* whether program name, i.e., argv[0], is in the remaining args (this may happen with some implementations of getopt, but surely not with the one included by gengetopt) */ i = optind; while (i < argc) if (argv[i++] == argv[0]) { found_prog_name = 1; break; } i = 0; args_info->inputs_num = argc - optind - found_prog_name; args_info->inputs = (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; while (optind < argc) if (argv[optind++] != argv[0]) args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ; } return 0; failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } shishi-1.0.2/src/shishid_cmd.h0000644000000000000000000002563212126773076013131 00000000000000/** @file shishid_cmd.h * @brief The header file for the command line option parser * generated by GNU Gengetopt version 2.22.5 * http://www.gnu.org/software/gengetopt. * DO NOT modify this file, since it can be overwritten * @author GNU Gengetopt by Lorenzo Bettini */ #ifndef SHISHID_CMD_H #define SHISHID_CMD_H /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* for FILE */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE /** @brief the program name (used for printing errors) */ #define CMDLINE_PARSER_PACKAGE "shishid" #endif #ifndef CMDLINE_PARSER_PACKAGE_NAME /** @brief the complete program name (used for help and version) */ #define CMDLINE_PARSER_PACKAGE_NAME "shishid" #endif #ifndef CMDLINE_PARSER_VERSION /** @brief the program version */ #define CMDLINE_PARSER_VERSION VERSION #endif /** @brief Where the command line options are stored */ struct gengetopt_args_info { const char *help_help; /**< @brief Print help and exit help description. */ const char *version_help; /**< @brief Print version and exit help description. */ char * listen_arg; /**< @brief Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'.. */ char * listen_orig; /**< @brief Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'. original value given at command line. */ const char *listen_help; /**< @brief Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'. help description. */ char * setuid_arg; /**< @brief After binding socket, set user identity.. */ char * setuid_orig; /**< @brief After binding socket, set user identity. original value given at command line. */ const char *setuid_help; /**< @brief After binding socket, set user identity. help description. */ int no_tls_flag; /**< @brief Disable TLS support (default=off). */ const char *no_tls_help; /**< @brief Disable TLS support help description. */ char * x509cafile_arg; /**< @brief X.509 certificate authorities used to verify client certificates, in PEM format.. */ char * x509cafile_orig; /**< @brief X.509 certificate authorities used to verify client certificates, in PEM format. original value given at command line. */ const char *x509cafile_help; /**< @brief X.509 certificate authorities used to verify client certificates, in PEM format. help description. */ char * x509certfile_arg; /**< @brief X.509 server certificate, in PEM format.. */ char * x509certfile_orig; /**< @brief X.509 server certificate, in PEM format. original value given at command line. */ const char *x509certfile_help; /**< @brief X.509 server certificate, in PEM format. help description. */ char * x509crlfile_arg; /**< @brief X.509 certificate revocation list to check for revoked client certificates, in PEM format.. */ char * x509crlfile_orig; /**< @brief X.509 certificate revocation list to check for revoked client certificates, in PEM format. original value given at command line. */ const char *x509crlfile_help; /**< @brief X.509 certificate revocation list to check for revoked client certificates, in PEM format. help description. */ char * x509keyfile_arg; /**< @brief X.509 server certificate key, in PEM format.. */ char * x509keyfile_orig; /**< @brief X.509 server certificate key, in PEM format. original value given at command line. */ const char *x509keyfile_help; /**< @brief X.509 server certificate key, in PEM format. help description. */ short resume_limit_arg; /**< @brief Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). (default='50'). */ char * resume_limit_orig; /**< @brief Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). original value given at command line. */ const char *resume_limit_help; /**< @brief Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume). help description. */ char * configuration_file_arg; /**< @brief Use specified configuration file.. */ char * configuration_file_orig; /**< @brief Use specified configuration file. original value given at command line. */ const char *configuration_file_help; /**< @brief Use specified configuration file. help description. */ unsigned int verbose_min; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s minimum occurreces */ unsigned int verbose_max; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s maximum occurreces */ const char *verbose_help; /**< @brief Produce verbose output. Use multiple times to increase amount of information. help description. */ int quiet_flag; /**< @brief Don't produce any diagnostic output. (default=off). */ const char *quiet_help; /**< @brief Don't produce any diagnostic output. help description. */ unsigned int help_given ; /**< @brief Whether help was given. */ unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int listen_given ; /**< @brief Whether listen was given. */ unsigned int setuid_given ; /**< @brief Whether setuid was given. */ unsigned int no_tls_given ; /**< @brief Whether no-tls was given. */ unsigned int x509cafile_given ; /**< @brief Whether x509cafile was given. */ unsigned int x509certfile_given ; /**< @brief Whether x509certfile was given. */ unsigned int x509crlfile_given ; /**< @brief Whether x509crlfile was given. */ unsigned int x509keyfile_given ; /**< @brief Whether x509keyfile was given. */ unsigned int resume_limit_given ; /**< @brief Whether resume-limit was given. */ unsigned int configuration_file_given ; /**< @brief Whether configuration-file was given. */ unsigned int verbose_given ; /**< @brief Whether verbose was given. */ unsigned int quiet_given ; /**< @brief Whether quiet was given. */ } ; /** @brief The additional parameters to pass to parser functions */ struct cmdline_parser_params { int override; /**< @brief whether to override possibly already present options (default 0) */ int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ int check_required; /**< @brief whether to check that all required options were provided (default 1) */ int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; /** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; /** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; /** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; /** * The command line parser * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info); /** * The command line parser (version with additional parameters - deprecated) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param override whether to override possibly already present options * @param initialize whether to initialize the option structure my_args_info * @param check_required whether to check that all required options were provided * @return 0 if everything went fine, NON 0 if an error took place * @deprecated use cmdline_parser_ext() instead */ int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); /** * The command line parser (version with additional parameters) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param params additional parameters for the parser * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params); /** * Save the contents of the option struct into an already open FILE stream. * @param outfile the stream where to dump options * @param args_info the option struct to dump * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info); /** * Save the contents of the option struct into a (text) file. * This file can be read by the config file parser (if generated by gengetopt) * @param filename the file where to save * @param args_info the option struct to save * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); /** * Print the help */ void cmdline_parser_print_help(void); /** * Print the version */ void cmdline_parser_print_version(void); /** * Initializes all the fields a cmdline_parser_params structure * to their default values * @param params the structure to initialize */ void cmdline_parser_params_init(struct cmdline_parser_params *params); /** * Allocates dynamically a cmdline_parser_params structure and initializes * all its fields to their default values * @return the created and initialized cmdline_parser_params structure */ struct cmdline_parser_params *cmdline_parser_params_create(void); /** * Initializes the passed gengetopt_args_info structure's fields * (also set default values for options that have a default) * @param args_info the structure to initialize */ void cmdline_parser_init (struct gengetopt_args_info *args_info); /** * Deallocates the string fields of the gengetopt_args_info structure * (but does not deallocate the structure itself) * @param args_info the structure to deallocate */ void cmdline_parser_free (struct gengetopt_args_info *args_info); /** * Checks that all the required options were specified * @param args_info the structure to check * @param prog_name the name of the program that will be used to print * possible errors * @return */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* SHISHID_CMD_H */ shishi-1.0.2/src/resume.c0000664000000000000000000000537412126660507012143 00000000000000/* resume.c --- Handle the details of TLS session resumption. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Note: only use syslog to report errors in this file. */ /* Get Shishid stuff. */ #include "kdc.h" typedef struct { char *id; size_t id_size; char *data; size_t data_size; } CACHE; static CACHE *cache_db; static size_t cache_db_ptr = 0; static size_t cache_db_size = 0; int resume_db_store (void *dbf, gnutls_datum key, gnutls_datum data) { if (cache_db_size == 0) return -1; cache_db[cache_db_ptr].id = xrealloc (cache_db[cache_db_ptr].id, key.size); memcpy (cache_db[cache_db_ptr].id, key.data, key.size); cache_db[cache_db_ptr].id_size = key.size; cache_db[cache_db_ptr].data = xrealloc (cache_db[cache_db_ptr].data, data.size); memcpy (cache_db[cache_db_ptr].data, data.data, data.size); cache_db[cache_db_ptr].data_size = data.size; cache_db_ptr++; cache_db_ptr %= cache_db_size; return 0; } gnutls_datum resume_db_fetch (void *dbf, gnutls_datum key) { gnutls_datum res = { NULL, 0 }; size_t i; for (i = 0; i < cache_db_size; i++) if (key.size == cache_db[i].id_size && memcmp (key.data, cache_db[i].id, key.size) == 0) { res.size = cache_db[i].data_size; res.data = gnutls_malloc (res.size); if (res.data == NULL) return res; memcpy (res.data, cache_db[i].data, res.size); return res; } return res; } int resume_db_delete (void *dbf, gnutls_datum key) { size_t i; for (i = 0; i < cache_db_size; i++) if (key.size == cache_db[i].id_size && memcmp (key.data, cache_db[i].id, key.size) == 0) { cache_db[i].id_size = 0; cache_db[i].data_size = 0; return 0; } return -1; } void resume_db_init (size_t nconnections) { resume_db_done (); cache_db = xcalloc (nconnections, sizeof (*cache_db)); cache_db_size = nconnections; } void resume_db_done (void) { size_t i; for (i = 0; i < cache_db_size; i++) { free (cache_db[i].id); free (cache_db[i].data); } free (cache_db); } shishi-1.0.2/src/ccache2shishi_cmd.h0000644000000000000000000001547412126773076014201 00000000000000/** @file ccache2shishi_cmd.h * @brief The header file for the command line option parser * generated by GNU Gengetopt version 2.22.5 * http://www.gnu.org/software/gengetopt. * DO NOT modify this file, since it can be overwritten * @author GNU Gengetopt by Lorenzo Bettini */ #ifndef CCACHE2SHISHI_CMD_H #define CCACHE2SHISHI_CMD_H /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* for FILE */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE /** @brief the program name (used for printing errors) */ #define CMDLINE_PARSER_PACKAGE "ccache2shishi" #endif #ifndef CMDLINE_PARSER_PACKAGE_NAME /** @brief the complete program name (used for help and version) */ #define CMDLINE_PARSER_PACKAGE_NAME "ccache2shishi" #endif #ifndef CMDLINE_PARSER_VERSION /** @brief the program version */ #define CMDLINE_PARSER_VERSION VERSION #endif /** @brief Where the command line options are stored */ struct gengetopt_args_info { const char *help_help; /**< @brief Print help and exit help description. */ const char *version_help; /**< @brief Print version and exit help description. */ unsigned int verbose_min; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s minimum occurreces */ unsigned int verbose_max; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s maximum occurreces */ const char *verbose_help; /**< @brief Produce verbose output. Use multiple times to increase amount of information. help description. */ int quiet_flag; /**< @brief Don't produce any diagnostic output. (default=off). */ const char *quiet_help; /**< @brief Don't produce any diagnostic output. help description. */ unsigned int help_given ; /**< @brief Whether help was given. */ unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int verbose_given ; /**< @brief Whether verbose was given. */ unsigned int quiet_given ; /**< @brief Whether quiet was given. */ char **inputs ; /**< @brief unamed options (options without names) */ unsigned inputs_num ; /**< @brief unamed options number */ } ; /** @brief The additional parameters to pass to parser functions */ struct cmdline_parser_params { int override; /**< @brief whether to override possibly already present options (default 0) */ int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ int check_required; /**< @brief whether to check that all required options were provided (default 1) */ int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; /** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; /** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; /** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; /** * The command line parser * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info); /** * The command line parser (version with additional parameters - deprecated) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param override whether to override possibly already present options * @param initialize whether to initialize the option structure my_args_info * @param check_required whether to check that all required options were provided * @return 0 if everything went fine, NON 0 if an error took place * @deprecated use cmdline_parser_ext() instead */ int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); /** * The command line parser (version with additional parameters) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param params additional parameters for the parser * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params); /** * Save the contents of the option struct into an already open FILE stream. * @param outfile the stream where to dump options * @param args_info the option struct to dump * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info); /** * Save the contents of the option struct into a (text) file. * This file can be read by the config file parser (if generated by gengetopt) * @param filename the file where to save * @param args_info the option struct to save * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); /** * Print the help */ void cmdline_parser_print_help(void); /** * Print the version */ void cmdline_parser_print_version(void); /** * Initializes all the fields a cmdline_parser_params structure * to their default values * @param params the structure to initialize */ void cmdline_parser_params_init(struct cmdline_parser_params *params); /** * Allocates dynamically a cmdline_parser_params structure and initializes * all its fields to their default values * @return the created and initialized cmdline_parser_params structure */ struct cmdline_parser_params *cmdline_parser_params_create(void); /** * Initializes the passed gengetopt_args_info structure's fields * (also set default values for options that have a default) * @param args_info the structure to initialize */ void cmdline_parser_init (struct gengetopt_args_info *args_info); /** * Deallocates the string fields of the gengetopt_args_info structure * (but does not deallocate the structure itself) * @param args_info the structure to deallocate */ void cmdline_parser_free (struct gengetopt_args_info *args_info); /** * Checks that all the required options were specified * @param args_info the structure to check * @param prog_name the name of the program that will be used to print * possible errors * @return */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* CCACHE2SHISHI_CMD_H */ shishi-1.0.2/src/shisa.c0000664000000000000000000003602512126660507011747 00000000000000/* shisa.c --- Command line interface to Shishi database. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include /* Setup i18n. */ #include #include #define _(String) gettext (String) /* Gnulib helpers. */ #include "xvasprintf.h" #include "xgethostname.h" #include "progname.h" #include "error.h" #include "version-etc.h" /* Shishi and Shisa library. */ #include #include /* Command line parameter parser via gengetopt. */ #include "shisa_cmd.h" /* Global variables. */ Shishi *sh; Shisa *dbh; struct gengetopt_args_info args; static void printfield (const char *fieldname, const char *value) { printf ("\t\t%s %s.\n", fieldname, value); } static void printtimefield (const char *fieldname, time_t t) { char *p = ctime (&t); p[strlen (p) - 1] = '\0'; printfield (fieldname, t == (time_t) - 1 ? "N/A" : p); } static void printintfield (const char *fieldname, int num) { char *p = xasprintf ("%d (0x%x)", num, num); printfield (fieldname, p); free (p); } static void printuint32field (const char *fieldname, uint32_t num) { char *p = xasprintf ("%d (0x%x)", num, num); printfield (fieldname, p); free (p); } static void print3field (const char *fieldname, const char *text, uint32_t num) { char *p = xasprintf ("%s (0x%x, %d)", text, num, num); printfield (fieldname, p); free (p); } static void printdbkey (const char *realm, const char *principal, Shisa_key * dbkey) { Shishi_key *key; int rc; rc = shishi_key_from_value (sh, dbkey->etype, dbkey->key, &key); if (rc == SHISHI_OK) { shishi_key_realm_set (key, realm); shishi_key_principal_set (key, principal); shishi_key_print (sh, stdout, key); } else error (0, 0, "shishi_key_from_value (%d):\n%s", rc, shishi_strerror (rc)); } static int dumplist_realm_principal (const char *realm, const char *principal) { Shisa_principal ph; int rc; if (args.dump_given || args.enabled_flag || args.disabled_flag) { rc = shisa_principal_find (dbh, realm, principal, &ph); if (rc != SHISA_OK) { error (0, 0, "shishi_principal_find (%d):\n%s", rc, shisa_strerror (rc)); return rc; } if (args.enabled_flag && ph.isdisabled) return SHISA_OK; if (args.disabled_flag && !ph.isdisabled) return SHISA_OK; } printf ("\t%s\n", principal); if (args.dump_given) { Shisa_key **keys; size_t nkeys; size_t i; printfield (_("Account is"), ph.isdisabled ? _("DISABLED") : _("enabled")); printuint32field (_("Current key version"), ph.kvno); if (ph.notusedbefore != (time_t) - 1) printtimefield (_("Account not valid before"), ph.notusedbefore); if (ph.lastinitialtgt != (time_t) - 1) printtimefield (_("Last initial TGT request at"), ph.lastinitialtgt); if (ph.lastinitialrequest != (time_t) - 1) printtimefield (_("Last initial request at"), ph.lastinitialrequest); if (ph.lasttgt != (time_t) - 1) printtimefield (_("Last TGT request at"), ph.lasttgt); if (ph.lastrenewal != (time_t) - 1) printtimefield (_("Last ticket renewal at"), ph.lastrenewal); if (ph.passwordexpire != (time_t) - 1) printtimefield (_("Password expire on"), ph.passwordexpire); if (ph.accountexpire != (time_t) - 1) printtimefield (_("Account expire on"), ph.accountexpire); rc = shisa_keys_find (dbh, realm, principal, NULL, &keys, &nkeys); if (rc != SHISA_OK) { error (0, 0, "shishi_keys_find(%s, %s) (%d):\n%s", realm, principal, rc, shisa_strerror (rc)); return rc; } for (i = 0; i < nkeys; i++) if (keys[i]) { printintfield (_("Key"), i); print3field (_("\tEtype"), shishi_cipher_name (keys[i]->etype), keys[i]->etype); if (keys[i]->priority > 0) printintfield (_("\tPriority"), keys[i]->priority); if (args.keys_given) printdbkey (realm, principal, keys[i]); if (keys[i]->saltlen > 0) printfield (_("\tSalt"), keys[i]->salt); if (keys[i]->str2keyparamlen > 0) printfield (_("\tS2K params"), keys[i]->str2keyparam); if (args.keys_given) if (keys[i]->password) printfield (_("\tPassword"), keys[i]->password); } else printfield (_("\tKey is"), _("MISSING")); shisa_keys_free (dbh, keys, nkeys); } return SHISA_OK; } static int dumplist_realm (const char *realm) { char **principals; size_t nprincipals; size_t i; int rc; printf ("%s\n", realm); rc = shisa_enumerate_principals (dbh, realm, &principals, &nprincipals); if (rc != SHISA_OK) return rc; for (i = 0; i < nprincipals; i++) { if (rc == SHISA_OK) rc = dumplist_realm_principal (realm, principals[i]); free (principals[i]); } if (nprincipals > 0) free (principals); return rc; } static int dumplist (void) { int rc; if (args.inputs_num == 1) rc = dumplist_realm (args.inputs[0]); else if (args.inputs_num == 2) { char *realm = args.inputs[0]; char *principal = args.inputs[1]; printf ("%s\n", realm); rc = dumplist_realm_principal (realm, principal); } else { char **realms; size_t nrealms; size_t i; rc = shisa_enumerate_realms (dbh, &realms, &nrealms); if (rc != SHISA_OK) return rc; for (i = 0; i < nrealms; i++) { if (rc == SHISA_OK) rc = dumplist_realm (realms[i]); free (realms[i]); } if (nrealms > 0) free (realms); } return rc; } static void add (const char *realm, const char *principal, Shisa_principal * ph, Shisa_key * key) { int rc; if (principal == NULL) printf (_("Adding realm `%s'...\n"), realm); else printf (_("Adding principal `%s@%s'...\n"), principal, realm); rc = shisa_principal_add (dbh, realm, principal, ph, key); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_principal_add (%d):\n%s", rc, shisa_strerror (rc)); if (args.keys_given) printdbkey (realm, principal, key); if (principal == NULL) printf (_("Adding realm `%s'...done\n"), realm); else printf (_("Adding principal `%s@%s'...done\n"), principal, realm); } static void delete (const char *realm, const char *principal) { int rc; if (principal == NULL && args.force_flag) { char **principals; size_t nprincipals; size_t i; rc = shisa_enumerate_principals (dbh, realm, &principals, &nprincipals); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_enumerate_principals (%d):\n%s", rc, shisa_strerror (rc)); for (i = 0; i < nprincipals; i++) if (principals[i]) { delete (realm, principals[i]); free (principals[i]); } if (nprincipals > 0) free (principals); } if (principal == NULL) printf (_("Removing realm `%s'...\n"), realm); else printf (_("Removing principal `%s@%s'...\n"), principal, realm); rc = shisa_principal_remove (dbh, realm, principal); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_principal_remove (%d):\n%s", rc, shisa_strerror (rc)); if (principal == NULL) printf (_("Removing realm `%s'...done\n"), realm); else printf (_("Removing principal `%s@%s'...done\n"), principal, realm); } static void apply_options (const char *realm, const char *principal, Shisa_principal * ph, Shisa_key * dbkey) { char *passwd = args.password_arg; char *salt = args.salt_arg; char *str2keyparam = NULL; size_t str2keyparamlen = 0; Shishi_key *key; int32_t etype; int rc; if (ph) { if (args.key_version_given) ph->kvno = args.key_version_arg; } if (dbkey) { etype = shishi_cfg_clientkdcetype_fast (sh); if (!salt && realm && principal) { char *name = xasprintf ("%s@%s", principal, realm); rc = shishi_derive_default_salt (sh, name, &salt); free (name); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, "shisa_derive_default_salt (%d):\n%s", rc, shisa_strerror (rc)); } if (args.string_to_key_parameter_given) { /* XXX */ } if (args.password_given) { if (!passwd) { if (realm && principal) rc = shishi_prompt_password (sh, &passwd, _("Password for `%s@%s': "), principal, realm); else rc = shishi_prompt_password (sh, &passwd, _("Password: ")); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not read password")); } rc = shishi_key_from_string (sh, etype, passwd, strlen (passwd), salt, salt ? strlen (salt) : 0, str2keyparam, &key); } else rc = shishi_key_random (sh, etype, &key); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not create key (%d):\n%s"), rc, shishi_strerror (rc)); if (realm && principal) { shishi_key_realm_set (key, realm); shishi_key_principal_set (key, principal); } dbkey->kvno = args.key_version_arg; dbkey->etype = etype; dbkey->priority = args.priority_arg; dbkey->key = (char *) shishi_key_value (key); dbkey->keylen = shishi_key_length (key); dbkey->salt = salt; dbkey->saltlen = salt ? strlen (salt) : 0; dbkey->str2keyparam = str2keyparam; dbkey->str2keyparamlen = str2keyparamlen; dbkey->password = passwd; } } const char version_etc_copyright[] = /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ "Copyright %s %d Simon Josefsson."; static void usage (int status) __attribute__ ((__noreturn__)); static void usage (int status) { if (status != EXIT_SUCCESS) fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); else { cmdline_parser_print_help (); printf (_("\nMandatory arguments to long options are " "mandatory for short options too.\n")); emit_bug_reporting_address (); } exit (status); } int main (int argc, char *argv[]) { const char *realm = NULL; const char *principal = NULL; Shisa_principal ph; Shisa_key key; int rc; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); set_program_name (argv[0]); if (cmdline_parser (argc, argv, &args) != 0) usage (EXIT_FAILURE); if (args.version_given) { const char *p = PACKAGE_NAME; if (strcmp (shishi_check_version (NULL), PACKAGE_VERSION) != 0) p = PACKAGE_STRING; version_etc (stdout, program_name, p, shishi_check_version (NULL), "Simon Josefsson", (char *) NULL); return EXIT_SUCCESS; } rc = args.add_given + args.dump_given + args.list_given + args.modify_given + args.remove_given + args.key_add_given + args.key_remove_given; if (rc > 1 || args.inputs_num > 2) { error (0, 0, _("too many arguments")); usage (EXIT_FAILURE); } if (rc == 0 || args.help_given) usage (EXIT_SUCCESS); rc = shisa_init_with_paths (&dbh, args.configuration_file_arg); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, _("Initialization failed:\n%s"), shisa_strerror (rc)); rc = shisa_cfg (dbh, args.library_options_arg); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, _("Could not read library options `%s':\n%s"), args.library_options_arg, shisa_strerror (rc)); rc = shishi_init (&sh); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Shishi initialization failed:\n%s"), shishi_strerror (rc)); rc = shishi_cfg_clientkdcetype_set (sh, args.encryption_type_arg); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not set encryption type `%s':\n%s"), args.encryption_type_arg, shishi_strerror (rc)); if ((args.inputs_num < 2 && (args.modify_given || args.key_add_given || args.key_remove_given)) || (args.inputs_num < 1 && (args.remove_given))) { error (0, 0, _("too few arguments")); usage (EXIT_FAILURE); } if (args.inputs_num > 0) realm = args.inputs[0]; if (args.inputs_num > 1) principal = args.inputs[1]; memset (&ph, 0, sizeof (ph)); memset (&key, 0, sizeof (key)); apply_options (realm, principal, &ph, &key); if (args.list_given || args.dump_given) rc = dumplist (); else if (args.remove_given) delete (realm, principal); else if (args.add_given && (args.inputs_num == 1 || args.inputs_num == 2)) add (realm, principal, &ph, &key); else if (args.add_given) { char *host; char *tmp; Shisa_key key2; /* This is mostly meant for 'make install', as it set up the default realm, and write a host key to stdout, which can be redirected into $prefix/etc/shishi/shishi.keys. */ realm = shishi_realm_default (sh); printf (_("Adding default realm `%s'...\n"), realm); add (realm, NULL, NULL, NULL); tmp = xasprintf ("krbtgt/%s", realm); add (realm, tmp, &ph, &key); free (tmp); host = xgethostname (); tmp = xasprintf ("host/%s", host); free (host); memset (&key2, 0, sizeof (key2)); apply_options (realm, tmp, NULL, &key2); args.keys_given = 1; add (realm, tmp, &ph, &key2); free (tmp); } else if (args.modify_given) { printf (_("Modifying principal `%s@%s'...\n"), principal, realm); rc = shisa_principal_update (dbh, realm, principal, &ph); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_principal_update (%d):\n%s", rc, shisa_strerror (rc)); printf (_("Modifying principal `%s@%s'...done\n"), principal, realm); } else if (args.key_add_given) { printf (_("Adding key to `%s@%s'...\n"), principal, realm); rc = shisa_key_add (dbh, realm, principal, &key); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_key_add (%d):\n%s", rc, shisa_strerror (rc)); if (args.keys_given) printdbkey (realm, principal, &key); printf (_("Adding key to `%s@%s'...done\n"), principal, realm); } else if (args.key_remove_given) { printf (_("Removing key from `%s@%s'...\n"), principal, realm); if (!args.password_given) { key.keylen = 0; key.password = NULL; } rc = shisa_key_remove (dbh, realm, principal, &key); if (rc != SHISA_OK) error (EXIT_FAILURE, 0, "shisa_key_remove (%d):\n%s", rc, shisa_strerror (rc)); printf (_("Removing key from `%s@%s'...done\n"), principal, realm); } shisa_done (dbh); shishi_done (sh); return EXIT_SUCCESS; } shishi-1.0.2/src/shishi.c0000664000000000000000000001761112126660507012127 00000000000000/* shishi.c --- Shishi command line interface. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include /* Get i18n. */ #include #include #define _(String) gettext (String) #include /* Gnulib files. */ #include "progname.h" #include "error.h" #include "version-etc.h" #include "shishi_cmd.h" const char version_etc_copyright[] = /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ "Copyright %s %d Simon Josefsson."; static void usage (int status) __attribute__ ((__noreturn__)); static void usage (int status) { if (status != EXIT_SUCCESS) fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); else { cmdline_parser_print_help (); printf (_("\nMandatory arguments to long options are " "mandatory for short options too.\n")); emit_bug_reporting_address (); } exit (status); } int main (int argc, char *argv[]) { struct gengetopt_args_info args; time_t starttime, endtime, renew_till; Shishi *sh; int rc; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); set_program_name (argv[0]); if (cmdline_parser (argc, argv, &args) != 0) usage (EXIT_FAILURE); if (args.version_given) { const char *p = PACKAGE_NAME; if (strcmp (shishi_check_version (NULL), PACKAGE_VERSION) != 0) p = PACKAGE_STRING; version_etc (stdout, program_name, p, shishi_check_version (NULL), "Simon Josefsson", (char *) NULL); return EXIT_SUCCESS; } if (args.inputs_num > 2 || args.destroy_given + args.list_given + args.renew_given > 1) { error (0, 0, _("too many arguments")); usage (EXIT_FAILURE); } if (args.help_given) usage (EXIT_SUCCESS); rc = shishi_init_with_paths (&sh, args.ticket_file_arg, args.system_configuration_file_arg, args.configuration_file_arg); if (rc == SHISHI_HANDLE_ERROR) error (EXIT_FAILURE, 0, _("cannot initialize libshishi")); rc = shishi_cfg_clientkdcetype_set (sh, args.encryption_type_arg); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not set encryption types: %s"), shishi_strerror (rc)); if (args.inputs_num > 0) { rc = shishi_parse_name (sh, args.inputs[0], (args.client_name_arg ? NULL : &args.client_name_arg), (args.realm_arg ? NULL : &args.realm_arg)); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not parse client principal \"%s\": %s"), args.inputs[0], shishi_strerror (rc)); } if (args.inputs_num > 1) { rc = shishi_parse_name (sh, args.inputs[1], (args.server_name_arg ? NULL : &args.server_name_arg), (args.realm_arg ? NULL : &args.realm_arg)); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not parse server principal \"%s\": %s"), args.inputs[1], shishi_strerror (rc)); } rc = shishi_cfg (sh, args.library_options_arg); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not read library options: %s"), shishi_strerror (rc)); if (args.verbose_given > 0) shishi_cfg (sh, "verbose"); if (args.verbose_given > 1) shishi_cfg (sh, "verbose-noise"); if (args.verbose_given > 2) shishi_cfg (sh, "verbose-asn1"); if (args.verbose_given > 3) shishi_cfg (sh, "verbose-crypto"); if (args.verbose_given > 4) shishi_cfg (sh, "verbose-crypto-noise"); if (args.starttime_arg) { starttime = shishi_get_date (args.starttime_arg, NULL); if (starttime == -1) error (EXIT_FAILURE, 0, _("Invalid --starttime date `%s'"), args.starttime_arg); } else starttime = time (NULL); if (args.endtime_arg) { endtime = shishi_get_date (args.endtime_arg, &starttime); if (endtime == -1) error (EXIT_FAILURE, 0, _("Invalid --endtime date `%s'"), args.starttime_arg); } else endtime = 0; if (args.renew_till_arg) { renew_till = shishi_get_date (args.renew_till_arg, &starttime); if (renew_till == -1) error (EXIT_FAILURE, 0, _("Invalid --renew-till date `%s'"), args.renew_till_arg); } else renew_till = 0; if (args.client_name_arg) shishi_principal_default_set (sh, args.client_name_arg); if (args.realm_arg) shishi_realm_default_set (sh, args.realm_arg); if (!args.ticket_granter_arg) asprintf (&args.ticket_granter_arg, "krbtgt/%s", shishi_realm_default (sh)); if (args.list_flag) { if (!args.quiet_flag) printf (_("Tickets in `%s':\n"), shishi_tkts_default_file (sh)); rc = shishi_tkts_print_for_service (shishi_tkts_default (sh), stdout, args.server_name_arg); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not list tickets: %s"), shishi_strerror (rc)); } else if (args.destroy_flag) { int i, removed = 0; for (i = 0; i < shishi_tkts_size (shishi_tkts_default (sh)); i++) { if (args.server_name_arg && !shishi_tkt_server_p (shishi_tkts_nth (shishi_tkts_default (sh), i), args.server_name_arg)) continue; if (args.verbose_given) { printf (_("Removing ticket:\n")); shishi_tkt_pretty_print (shishi_tkts_nth (shishi_tkts_default (sh), i), stdout); } rc = shishi_tkts_remove (shishi_tkts_default (sh), i); if (rc != SHISHI_OK) error (EXIT_FAILURE, 0, _("Could not destroy ticket %d:\n%s"), i, shishi_strerror (rc)); i--; removed++; } if (!args.quiet_flag) { if (removed == 0) printf (_("No tickets removed.\n")); else printf (ngettext ("%d ticket removed.\n", "%d tickets removed.\n", removed), removed); } } else if (args.renew_given) { error (EXIT_FAILURE, 0, "command --renew not implemented"); } else { Shishi_tkt *tkt; Shishi_tkts_hint hint; memset (&hint, 0, sizeof (hint)); hint.client = args.client_name_arg; hint.server = args.server_name_arg ? args.server_name_arg : args.ticket_granter_arg; hint.starttime = starttime; hint.endtime = endtime; hint.renew_till = renew_till; if (args.renewable_flag) hint.tktflags |= SHISHI_TICKETFLAGS_RENEWABLE; if (args.proxiable_flag) hint.tktflags |= SHISHI_TICKETFLAGS_PROXIABLE; if (args.proxy_flag) hint.tktflags |= SHISHI_TICKETFLAGS_PROXY; if (args.forwardable_flag) hint.tktflags |= SHISHI_TICKETFLAGS_FORWARDABLE; if (args.forwarded_flag) hint.tktflags |= SHISHI_TICKETFLAGS_FORWARDED; tkt = shishi_tkts_get (shishi_tkts_default (sh), &hint); if (!tkt) error (EXIT_FAILURE, 0, _("could not get ticket as `%s' for `%s'"), hint.client ? hint.client : shishi_principal_default (sh), hint.server); shishi_tkt_pretty_print (tkt, stdout); } shishi_tkts_expire (shishi_tkts_default (sh)); if (args.ticket_write_file_arg) shishi_tkts_default_file_set (sh, args.ticket_write_file_arg); shishi_done (sh); return EXIT_SUCCESS; } shishi-1.0.2/src/starttls.c0000664000000000000000000002424612126660507012522 00000000000000/* starttls.c --- Handle extended TCP connections (for TLS). * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Note: only use syslog to report errors in this file. */ /* Get Shishid stuff. */ #include "kdc.h" /* This function will print information about this session's peer * certificate. */ static void logcertinfo (gnutls_session session) { time_t now = time (NULL); const gnutls_datum *cert_list; unsigned cert_list_size = 0; gnutls_x509_crt cert; size_t i; int rc; cert_list = gnutls_certificate_get_peers (session, &cert_list_size); if (!cert_list) return; rc = gnutls_x509_crt_init (&cert); if (rc < 0) { syslog (LOG_ERR, "TLS xci failed (%d): %s", rc, gnutls_strerror (rc)); return; } if (gnutls_certificate_type_get (session) == GNUTLS_CRT_X509) for (i = 0; i < cert_list_size; i++) { time_t expiration_time, activation_time; char *expiration_time_str = NULL, *activation_time_str = NULL; unsigned char *serial = NULL, *serialhex = NULL; char *issuer = NULL, *subject = NULL; size_t seriallen, issuerlen, subjectlen; unsigned char md5fingerprint[16], md5fingerprinthex[3 * 16 + 1]; size_t md5fingerprintlen; int algo; unsigned bits; const char *keytype, *validity; rc = gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER); if (rc < 0) { syslog (LOG_ERR, "TLS xci[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } md5fingerprintlen = sizeof (md5fingerprint); rc = gnutls_fingerprint (GNUTLS_DIG_MD5, &cert_list[i], md5fingerprint, &md5fingerprintlen); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS f[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } for (i = 0; i < md5fingerprintlen; i++) sprintf ((char *) &md5fingerprinthex[3 * i], "%.2x:", md5fingerprint[i]); expiration_time = gnutls_x509_crt_get_expiration_time (cert); if (expiration_time == (time_t) - 1) { syslog (LOG_ERR, "TLS xcget[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } activation_time = gnutls_x509_crt_get_activation_time (cert); if (expiration_time == (time_t) - 1) { syslog (LOG_ERR, "TLS xcgat[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } expiration_time_str = xstrdup (ctime (&expiration_time)); if (expiration_time_str[strlen (expiration_time_str) - 1] == '\n') expiration_time_str[strlen (expiration_time_str) - 1] = '\0'; activation_time_str = xstrdup (ctime (&activation_time)); if (activation_time_str[strlen (activation_time_str) - 1] == '\n') activation_time_str[strlen (activation_time_str) - 1] = '\0'; rc = gnutls_x509_crt_get_dn (cert, NULL, &subjectlen); if (rc != GNUTLS_E_SUCCESS && rc != GNUTLS_E_SHORT_MEMORY_BUFFER) { syslog (LOG_ERR, "TLS xcgd[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } subject = xmalloc (++subjectlen); rc = gnutls_x509_crt_get_dn (cert, subject, &subjectlen); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS xcgd2[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } rc = gnutls_x509_crt_get_issuer_dn (cert, NULL, &issuerlen); if (rc != GNUTLS_E_SUCCESS && rc != GNUTLS_E_SHORT_MEMORY_BUFFER) { syslog (LOG_ERR, "TLS xcgid[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } issuer = xmalloc (++issuerlen); rc = gnutls_x509_crt_get_issuer_dn (cert, issuer, &issuerlen); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS xcgid2[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } seriallen = 0; rc = gnutls_x509_crt_get_serial (cert, NULL, &seriallen); if (rc != GNUTLS_E_SUCCESS && rc != GNUTLS_E_SHORT_MEMORY_BUFFER) { syslog (LOG_ERR, "TLS xcgs[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } serial = xmalloc (seriallen); rc = gnutls_x509_crt_get_serial (cert, serial, &seriallen); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS xcgs2[%d] failed (%d): %s", i, rc, gnutls_strerror (rc)); goto cleanup; } serialhex = xmalloc (2 * seriallen + 1); for (i = 0; i < seriallen; i++) sprintf ((char *) &serialhex[2 * i], "%.2x", serial[i]); algo = gnutls_x509_crt_get_pk_algorithm (cert, &bits); if (algo == GNUTLS_PK_RSA) keytype = "RSA modulus"; else if (algo == GNUTLS_PK_DSA) keytype = "DSA exponent"; else keytype = "UNKNOWN"; if (expiration_time < now) validity = "EXPIRED"; else if (activation_time > now) validity = "NOT YET ACTIVATED"; else validity = "valid"; syslog (LOG_INFO, "TLS client certificate `%s', issued by `%s', " "serial number `%s', MD5 fingerprint `%s', activated `%s', " "expires `%s', version #%d, key %s %d bits, currently %s", subject, issuer, serialhex, md5fingerprinthex, activation_time_str, expiration_time_str, gnutls_x509_crt_get_version (cert), keytype, bits, validity); cleanup: free (serialhex); free (serial); free (expiration_time_str); free (activation_time_str); free (issuer); free (subject); } gnutls_x509_crt_deinit (cert); { unsigned int status; rc = gnutls_certificate_verify_peers2 (session, &status); if (rc != GNUTLS_E_SUCCESS) syslog (LOG_ERR, "TLS client certificate failed (%d): %s", rc, gnutls_strerror (rc)); if (status != 0) syslog (LOG_ERR, "TLS client certificate verify failure (%d)", status); } } /* This function will log some details of the given session. */ static void logtlsinfo (gnutls_session session) { gnutls_credentials_type cred; const char *protocol = gnutls_protocol_get_name (gnutls_protocol_get_version (session)); gnutls_kx_algorithm kx = gnutls_kx_get (session); const char *keyexchange = gnutls_kx_get_name (kx); const char *certtype = gnutls_certificate_type_get_name (gnutls_certificate_type_get (session)); const char *cipher = gnutls_cipher_get_name (gnutls_cipher_get (session)); const char *mac = gnutls_mac_get_name (gnutls_mac_get (session)); const char *compression = gnutls_compression_get_name (gnutls_compression_get (session)); int resumedp = gnutls_session_is_resumed (session); syslog (LOG_INFO, "TLS handshake negotiated protocol `%s', " "key exchange `%s', certficate type `%s', cipher `%s', " "mac `%s', compression `%s', %s", protocol ? protocol : "N/A", keyexchange ? keyexchange : "N/A", certtype ? certtype : "N/A", cipher ? cipher : "N/A", mac ? mac : "N/A", compression ? compression : "N/A", resumedp ? "resumed session" : "session not resumed"); cred = gnutls_auth_get_type (session); switch (cred) { case GNUTLS_CRD_ANON: syslog (LOG_INFO, "TLS anonymous authentication with %d bit Diffie-Hellman", gnutls_dh_get_prime_bits (session)); break; case GNUTLS_CRD_CERTIFICATE: if (kx == GNUTLS_KX_DHE_RSA || kx == GNUTLS_KX_DHE_DSS) syslog (LOG_INFO, "TLS certificate authentication with %d bit " "ephemeral Diffie-Hellman", gnutls_dh_get_prime_bits (session)); logcertinfo (session); break; case GNUTLS_CRD_SRP: case GNUTLS_CRD_PSK: case GNUTLS_CRD_IA: default: syslog (LOG_ERR, "Unknown TLS authentication (%d)", cred); break; } } #define STARTTLS_CLIENT_REQUEST "\x80\x00\x00\x01" #define STARTTLS_SERVER_ACCEPT "\x00\x00\x00\x00" #define STARTTLS_LEN 4 /* Handle the high TCP length bit, currently only used for STARTTLS. */ int kdc_extension (struct listenspec *ls) { int rc; if (ls->usetls || ls->ai.ai_socktype != SOCK_STREAM || ls->bufpos < 4 || (ls->bufpos >= 4 && !(ls->buf[0] & 0x80))) return 0; if (x509cred == NULL || memcmp (ls->buf, STARTTLS_CLIENT_REQUEST, STARTTLS_LEN) != 0) return kdc_extension_reject (ls); syslog (LOG_INFO, "Trying STARTTLS"); memcpy (ls->buf, STARTTLS_SERVER_ACCEPT, STARTTLS_LEN); ls->bufpos = STARTTLS_LEN; kdc_send1 (ls); rc = gnutls_init (&ls->session, GNUTLS_SERVER); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS initialization failed (%d): %s", rc, gnutls_strerror (rc)); return -1; } rc = gnutls_priority_set_direct (ls->session, "NORMAL:+ANON-DH", NULL); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS failed, gnutls_psd %d: %s", rc, gnutls_strerror (rc)); return -1; } rc = gnutls_credentials_set (ls->session, GNUTLS_CRD_ANON, anoncred); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS failed, gnutls_cs %d: %s", rc, gnutls_strerror (rc)); return -1; } rc = gnutls_credentials_set (ls->session, GNUTLS_CRD_CERTIFICATE, x509cred); if (rc != GNUTLS_E_SUCCESS) { syslog (LOG_ERR, "TLS failed, gnutls_cs X.509 %d: %s", rc, gnutls_strerror (rc)); return -1; } gnutls_certificate_server_set_request (ls->session, GNUTLS_CERT_REQUEST); gnutls_dh_set_prime_bits (ls->session, DH_BITS); gnutls_transport_set_ptr (ls->session, (gnutls_transport_ptr) (unsigned long) ls->sockfd); gnutls_db_set_retrieve_function (ls->session, resume_db_fetch); gnutls_db_set_store_function (ls->session, resume_db_store); gnutls_db_set_remove_function (ls->session, resume_db_delete); rc = gnutls_handshake (ls->session); if (rc < 0) { syslog (LOG_ERR, "TLS handshake failed (%d): %s\n", rc, gnutls_strerror (rc)); return -1; } logtlsinfo (ls->session); ls->bufpos = 0; ls->usetls = 1; return 0; } shishi-1.0.2/src/shisa.ggo0000664000000000000000000000605012126660507012274 00000000000000## Process this file with gengetopt to produce shisa_cmd.* # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. package "shisa" purpose "Manipulate information stored in the Shisa user database." section "Operations" option "add" a "Add realm or principal to database." no option "dump" d "Dump entries in database." no option "key-add" n "Add new key to a principal in database." no option "key-remove" - "Remove a key from a principal in database." no option "list" l "List entries in database." no option "modify" m "Modify principal entry in database." no option "remove" r "Remove realm or principal from database." no section "Parameters" option "force" f "Allow removal of non-empty realms.\n" flag off option "enabled" - "Only dump or list enabled principals.\n" flag off option "disabled" - "Only dump or list disabled principals.\n" flag off option "keys" - "Print cryptographic key and password in hostkey format." flag off section "Values" option "encryption-type" E "Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'." string no option "key-version" - "Version of key." long typestr="NUMBER" no option "password" - "Derive key from this password." string no argoptional option "priority" - "Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. (default is 0, which mean a random key of the best etype is chosen)" long typestr="NUMBER" no option "random" - "Use a random key. (default)" no option "salt" - "Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name." string no option "string-to-key-parameter" - "Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver." string typestr="HEX" no section "Other options" option "configuration-file" c "Use specified configuration file." string typestr="FILE" no option "library-options" o "Parse string as configuration file statement." string typestr="STRING" no option "verbose" v "Produce verbose output.\n" flag off option "quiet" q "Don't produce any diagnostic output.\n" flag off shishi-1.0.2/src/server.c0000664000000000000000000002451012126660507012142 00000000000000/* server.c --- Handle KDC sessions. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Note: only use syslog to report errors in this file. */ /* Get Shishid stuff. */ #include "kdc.h" /* Accept new TCP connection in a new listenspec entry. */ static void kdc_accept (struct listenspec *ls) { struct listenspec *newls; struct sockaddr addr; socklen_t addrlen; int rc; newls = xzalloc (sizeof (*newls)); newls->next = ls->next; ls->next = newls; newls->bufpos = 0; newls->ai.ai_socktype = ls->ai.ai_socktype; addrlen = sizeof (addr); newls->sockfd = accept (ls->sockfd, &addr, &addrlen); rc = getnameinfo (&addr, addrlen, newls->addrname, sizeof (newls->addrname), NULL, 0, NI_NUMERICHOST); if (rc != 0) strcpy (newls->addrname, "unknown address"); asprintf (&newls->str, "%s (%s)", newls->addrname, ls->str); syslog (LOG_DEBUG, "Accepted socket %d from socket %d as %s", newls->sockfd, ls->sockfd, newls->str); } /* Destroy listenspec element and return pointer to element before the removed element, or NULL if the first element was removed (or the destroyed list element wasn't in the list). */ static struct listenspec * kdc_close (struct listenspec *ls) { struct listenspec *tmp; int rc; syslog (LOG_INFO, "Closing %s socket %d", ls->str, ls->sockfd); #ifdef USE_STARTTLS if (ls->usetls) { do rc = gnutls_bye (ls->session, GNUTLS_SHUT_RDWR); while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED); if (rc != GNUTLS_E_SUCCESS) syslog (LOG_ERR, "TLS terminate failed to %s on socket %d (%d): %s", ls->str, ls->sockfd, rc, gnutls_strerror (rc)); gnutls_deinit (ls->session); } #endif if (ls->sockfd) { rc = close (ls->sockfd); if (rc != 0) syslog (LOG_ERR, "Close failed to %s on socket %d (%d): %s", ls->str, ls->sockfd, rc, strerror (rc)); } free (ls->str); for (tmp = listenspec; tmp && tmp->next != ls; tmp = tmp->next) ; if (tmp) tmp->next = ls->next; free (ls); return tmp; } /* Send string to peer, via UDP/TCP/TLS, reporting any errors. */ void kdc_send1 (struct listenspec *ls) { ssize_t sent_bytes; do #ifdef USE_STARTTLS if (ls->usetls) sent_bytes = gnutls_record_send (ls->session, ls->buf, ls->bufpos); else #endif if (ls->ai.ai_socktype == SOCK_DGRAM) sent_bytes = sendto (ls->sockfd, ls->buf, ls->bufpos, 0, (struct sockaddr *) &ls->udpclientaddr, ls->udpclientaddrlen); else sent_bytes = send (ls->sockfd, ls->buf, ls->bufpos, 0); while (sent_bytes == -1 && errno == EAGAIN); if (sent_bytes < 0) syslog (LOG_ERR, "Error writing %d bytes to %s on socket %d: %s", ls->bufpos, ls->str, ls->sockfd, strerror (errno)); else if ((size_t) sent_bytes > ls->bufpos) syslog (LOG_ERR, "Overlong write (%d > %d) to %s on socket %d", sent_bytes, ls->bufpos, ls->str, ls->sockfd); else if ((size_t) sent_bytes < ls->bufpos) syslog (LOG_ERR, "Short write (%d < %d) to %s on socket %d", sent_bytes, ls->bufpos, ls->str, ls->sockfd); } /* Format response and send it to peer, via UDP/TCP/TLS, reporting any errors. */ static void kdc_send (struct listenspec *ls) { if (ls->ai.ai_socktype == SOCK_DGRAM) syslog (LOG_DEBUG, "Sending %d bytes to %s socket %d via UDP", ls->bufpos, ls->clientaddrname, ls->sockfd); else { syslog (LOG_DEBUG, "Sending %d bytes to %s socket %d via %s", ls->bufpos, ls->str, ls->sockfd, ls->usetls ? "TLS" : "TCP"); if (ls->bufpos + 4 >= sizeof (ls->buf)) ls->bufpos = sizeof (ls->buf) - 4; memmove (ls->buf + 4, ls->buf, ls->bufpos); ls->buf[0] = (ls->bufpos >> 24) & 0xFF; ls->buf[1] = (ls->bufpos >> 16) & 0xFF; ls->buf[2] = (ls->bufpos >> 8) & 0xFF; ls->buf[3] = ls->bufpos & 0xFF; ls->bufpos += 4; } kdc_send1 (ls); ls->bufpos = 0; } int kdc_extension_reject (struct listenspec *ls) { Shishi_asn1 krberr; char *der; size_t derlen; int rc; syslog (LOG_INFO, "Reject extension from %s on socket %d", ls->str, ls->sockfd); krberr = shishi_krberror (handle); if (!krberr) return SHISHI_MALLOC_ERROR; rc = shishi_krberror_errorcode_set (handle, krberr, SHISHI_KRB_ERR_FIELD_TOOLONG); if (rc != SHISHI_OK) return rc; rc = shishi_krberror_set_etext (handle, krberr, "Extension not support"); if (rc != SHISHI_OK) return rc; rc = shishi_krberror_der (handle, krberr, &der, &derlen); if (rc != SHISHI_OK) return rc; if (derlen >= BUFSIZ) return -1; memcpy (ls->buf, der, derlen); ls->bufpos = derlen; free (der); kdc_send1 (ls); return -1; } #ifndef USE_STARTTLS /* Dummy function to replace starttls.c functionality. */ int kdc_extension (struct listenspec *ls) { if (ls->ai.ai_socktype == SOCK_STREAM && ls->bufpos == 4 && ls->buf[0] & 0x80) return kdc_extension_reject (ls); return 0; } #endif /* Read data from peer, reporting any errors. */ static int kdc_read (struct listenspec *ls) { ssize_t read_bytes; #ifdef USE_STARTTLS if (ls->usetls) read_bytes = gnutls_record_recv (ls->session, ls->buf + ls->bufpos, sizeof (ls->buf) - ls->bufpos); else #endif if (ls->ai.ai_socktype == SOCK_DGRAM) { ls->udpclientaddrlen = sizeof (ls->udpclientaddr); read_bytes = recvfrom (ls->sockfd, ls->buf + ls->bufpos, sizeof (ls->buf) - ls->bufpos, 0, (struct sockaddr *) &ls->udpclientaddr, &ls->udpclientaddrlen); } else read_bytes = recv (ls->sockfd, ls->buf + ls->bufpos, sizeof (ls->buf) - ls->bufpos, 0); if (read_bytes < 0) { #ifdef USE_STARTTLS if (ls->usetls) syslog (LOG_ERR, "Corrupt TLS data from %s on socket %d (%d): %s", ls->str, ls->sockfd, read_bytes, gnutls_strerror (read_bytes)); else #endif syslog (LOG_ERR, "Error reading from %s on socket %d (%d): %s", ls->str, ls->sockfd, read_bytes, strerror (read_bytes)); return -1; } if (read_bytes == 0 && ls->ai.ai_socktype == SOCK_STREAM) { syslog (LOG_DEBUG, "Peer %s disconnected on socket %d\n", ls->str, ls->sockfd); return -1; } ls->bufpos += read_bytes; if (ls->ai.ai_socktype == SOCK_DGRAM) { int rc = getnameinfo ((struct sockaddr *) &ls->udpclientaddr, ls->udpclientaddrlen, ls->clientaddrname, sizeof (ls->clientaddrname), NULL, 0, NI_NUMERICHOST); if (rc != 0) strcpy (ls->clientaddrname, "unknown address"); syslog (LOG_DEBUG, "Read %d bytes from %s on socket %d\n", ls->bufpos, ls->clientaddrname, ls->sockfd); } else syslog (LOG_DEBUG, "Read %d bytes from %s on socket %d\n", ls->bufpos, ls->str, ls->sockfd); return 0; } #define C2I(buf) ((buf[3] & 0xFF) | \ ((buf[2] & 0xFF) << 8) | \ ((buf[1] & 0xFF) << 16) | \ ((buf[0] & 0xFF) << 24)) /* Have we read an entire request? */ static int kdc_ready (struct listenspec *ls) { size_t waitfor = ls->bufpos >= 4 ? C2I (ls->buf) : 4; if (ls->ai.ai_socktype == SOCK_DGRAM && ls->bufpos > 0) return 1; else if (ls->bufpos > 4 && waitfor + 4 == ls->bufpos) return 1; if (ls->ai.ai_socktype == SOCK_STREAM) syslog (LOG_DEBUG, "Got %d bytes of %d bytes from %s on socket %d\n", ls->bufpos, waitfor + 4, ls->str, ls->sockfd); return 0; } /* Process a request and store reply in same buffer. */ static void kdc_process (struct listenspec *ls) { char *p; ssize_t plen; syslog (LOG_DEBUG, "Processing %d bytes on socket %d", ls->bufpos, ls->sockfd); if (ls->ai.ai_socktype == SOCK_DGRAM) plen = process (ls->buf, ls->bufpos, &p); else plen = process (ls->buf + 4, ls->bufpos - 4, &p); if (plen <= 0) { syslog (LOG_ERR, "Processing request failed on socket %d", ls->sockfd); memcpy (ls->buf, fatal_krberror, fatal_krberror_len); ls->bufpos = fatal_krberror_len; } else { memcpy (ls->buf, p, plen); ls->bufpos = plen; free (p); } syslog (LOG_DEBUG, "Generated %d bytes response for socket %d", ls->bufpos, ls->sockfd); } int quit = 0; static void ctrlc (int signum) { quit = 1; } #define MAX(a,b) ((a) > (b) ? (a) : (b)) /* Main KDC logic, loop around select and call kdc_accept, kdc_read, kdc_extension, kdc_process and kdc_send. This return when the SIGINT or SIGTERM signals are received. */ void kdc_loop (void) { struct listenspec *ls; fd_set readfds; int maxfd = 0; int rc; signal (SIGINT, ctrlc); signal (SIGTERM, ctrlc); #ifdef USE_STARTTLS syslog (LOG_DEBUG, "Starting (GNUTLS `%s')", gnutls_check_version (NULL)); #else syslog (LOG_DEBUG, "Starting (no TLS)"); #endif while (!quit) { do { FD_ZERO (&readfds); maxfd = 0; for (ls = listenspec; ls; ls = ls->next) { if (ls->sockfd > 0) { maxfd = MAX (maxfd, ls->sockfd + 1); if (!arg.quiet_flag) syslog (LOG_DEBUG, "Listening on %s (%s) socket %d\n", ls->str, ls->addrname, ls->sockfd); FD_SET (ls->sockfd, &readfds); } } } while ((rc = select (maxfd, &readfds, NULL, NULL, NULL)) == 0); if (rc < 0) { if (errno != EINTR) syslog (LOG_ERR, "Error listening on sockets (%d): %s", rc, strerror (errno)); continue; } for (ls = listenspec; ls; ls = ls->next) if (ls->sockfd > 0 && FD_ISSET (ls->sockfd, &readfds)) { if (ls->ai.ai_socktype == SOCK_STREAM && ls->listening) kdc_accept (ls); else if (kdc_read (ls) < 0) ls = kdc_close (ls); else if (kdc_extension (ls) < 0) ls = kdc_close (ls); else if (kdc_ready (ls)) { kdc_process (ls); kdc_send (ls); } } } syslog (LOG_DEBUG, "Shutting down"); } shishi-1.0.2/src/kdc.c0000664000000000000000000011514212126660507011377 00000000000000/* kdc.c --- Process AS and TGS requests. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Note: only use syslog to report errors in this file. */ /* Get Shishid stuff. */ #include "kdc.h" static int asreq1 (Shishi_as * as) { Shishi_tkt *tkt; Shishi_key *serverkey = NULL, *sessionkey = NULL, *userkey = NULL; Shisa_key *userdbkey = NULL; Shisa_key **serverkeys = NULL, **userkeys = NULL; size_t nserverkeys, nuserkeys; int rc; char *username = NULL, *servername = NULL, *realm = NULL; Shisa_principal server, user; int32_t sessionkeytype = -1; int32_t etype; int i; /* * The authentication server looks up the client and server principals * named in the KRB_AS_REQ in its database, extracting their respective * keys. If the requested client principal named in the request is not * known because it doesn't exist in the KDC's principal database, then * an error message with a KDC_ERR_C_PRINCIPAL_UNKNOWN is returned. */ rc = shishi_kdcreq_realm (handle, shishi_as_req (as), &realm, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_realm failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_kdcreq_client (handle, shishi_as_req (as), &username, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_client failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_kdcreq_server (handle, shishi_as_req (as), &servername, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_server failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* Find the client, e.g., simon@JOSEFSSON.ORG. */ rc = shisa_principal_find (dbh, realm, username, &user); if (rc != SHISA_OK && rc != SHISA_NO_PRINCIPAL) { syslog (LOG_ERR, "shisa_principal_find failed (%d): %s", rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } if (rc == SHISA_NO_PRINCIPAL) { syslog (LOG_NOTICE, "AS-REQ from %s@%s for %s@%s failed: no such user", username, realm, servername, realm); rc = shishi_krberror_errorcode_set (handle, shishi_as_krberror (as), SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN); if (rc != SHISHI_OK) goto fatal; rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } rc = shisa_keys_find (dbh, realm, username, NULL, &userkeys, &nuserkeys); if (rc != SHISA_OK || nuserkeys == 0) { syslog (LOG_ERR, "shisa_keys_find(%s@%s) failed (%d): %s", username, realm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } /* Find the server, e.g., krbtgt/JOSEFSSON.ORG@JOSEFSSON.ORG. */ rc = shisa_principal_find (dbh, realm, servername, &server); if (rc != SHISA_OK && rc != SHISA_NO_PRINCIPAL) { syslog (LOG_ERR, "shisa_principal_find failed (%d): %s", rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } if (rc == SHISA_NO_PRINCIPAL) { syslog (LOG_NOTICE, "AS-REQ from %s@%s for %s@%s failed: no such server", username, realm, servername, realm); rc = shishi_krberror_errorcode_set (handle, shishi_as_krberror (as), SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN); if (rc != SHISHI_OK) goto fatal; rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } rc = shisa_keys_find (dbh, realm, servername, NULL, &serverkeys, &nserverkeys); if (rc != SHISA_OK || nserverkeys == 0) { syslog (LOG_ERR, "shisa_keys_find(%s@%s) failed (%d): %s", servername, realm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } syslog (LOG_INFO, "AS-REQ from %s@%s for %s@%s", username, realm, servername, realm); /* * If required, the server pre-authenticates the request, and if the * pre-authentication check fails, an error message with the code * KDC_ERR_PREAUTH_FAILED is returned. If pre-authentication is * required, but was not present in the request, an error message with * the code KDC_ERR_PREAUTH_REQUIRED is returned and a METHOD-DATA * object will be stored in the e-data field of the KRB-ERROR message to * specify which pre-authentication mechanisms are acceptable. Usually * this will include PA-ETYPE-INFO and/or PA-ETYPE-INFO2 elements as * described below. If the server cannot accommodate any encryption type * requested by the client, an error message with code * KDC_ERR_ETYPE_NOSUPP is returned. Otherwise the KDC generates a * 'random' session key[7]. */ /* XXX support pre-auth. */ /* * When responding to an AS request, if there are multiple encryption * keys registered for a client in the Kerberos database, then the etype * field from the AS request is used by the KDC to select the encryption * method to be used to protect the encrypted part of the KRB_AS_REP * message which is sent to the client. If there is more than one * supported strong encryption type in the etype list, the KDC SHOULD * use the first valid strong etype for which an encryption key is * available. */ for (i = 1; (rc = shishi_kdcreq_etype (handle, shishi_as_req (as), &etype, i)) == SHISHI_OK; i++) { size_t j; if (!shishi_cipher_supported_p (etype)) continue; if (sessionkeytype == -1) for (j = 0; j < nserverkeys; j++) if (serverkeys[j]->etype == etype) sessionkeytype = serverkeys[j]->etype; if (userdbkey == NULL) for (j = 0; j < nuserkeys; j++) { syslog (LOG_DEBUG, "Matching client etype %d against user key etype %d", etype, userkeys[j]->etype); if (userkeys[j]->etype == etype) userdbkey = userkeys[j]; } } if (userdbkey == NULL) { syslog (LOG_NOTICE, "No matching client keys for %s@%s", username, realm); rc = shishi_krberror_errorcode_set (handle, shishi_as_krberror (as), SHISHI_KDC_ERR_ETYPE_NOSUPP); if (rc != SHISHI_OK) goto fatal; rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } rc = shishi_key_from_value (handle, userdbkey->etype, userdbkey->key, &userkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_key_from_value (user) failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* XXX Select "best" available key (highest kvno, best algorithm?) here. The client etype should not influence this. */ rc = shishi_key_from_value (handle, serverkeys[0]->etype, serverkeys[0]->key, &serverkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_key_from_value (server) failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * When the user's key is generated from a password or pass phrase, the * string-to-key function for the particular encryption key type is * used, as specified in [@KCRYPTO]. The salt value and additional * parameters for the string-to-key function have default values * (specified by section 4 and by the encryption mechanism * specification, respectively) that may be overridden by pre- * authentication data (PA-PW-SALT, PA-AFS3-SALT, PA-ETYPE-INFO, PA- * ETYPE-INFO2, etc). Since the KDC is presumed to store a copy of the * resulting key only, these values should not be changed for password- * based keys except when changing the principal's key. * * When the AS server is to include pre-authentication data in a KRB- * ERROR or in an AS-REP, it MUST use PA-ETYPE-INFO2, not PA-ETYPE-INFO, * if the etype field of the client's AS-REQ lists at least one "newer" * encryption type. Otherwise (when the etype field of the client's AS- * REQ does not list any "newer" encryption types) it MUST send both, * PA-ETYPE-INFO2 and PA-ETYPE-INFO (both with an entry for each * enctype). A "newer" enctype is any enctype first officially * specified concurrently with or subsequent to the issue of this RFC. * The enctypes DES, 3DES or RC4 and any defined in [RFC1510] are not * newer enctypes. * * It is not possible to reliably generate a user's key given a pass * phrase without contacting the KDC, since it will not be known whether * alternate salt or parameter values are required. * */ /* XXX support pre-auth. */ /* * The KDC will attempt to assign the type of the random session key * from the list of methods in the etype field. The KDC will select the * appropriate type using the list of methods provided together with * information from the Kerberos database indicating acceptable * encryption methods for the application server. The KDC will not issue * tickets with a weak session key encryption type. */ if (sessionkeytype == -1) sessionkeytype = shishi_cfg_clientkdcetype_fast (handle); rc = shishi_key_random (handle, sessionkeytype, &sessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_key_random (session key) failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * If the requested start time is absent, indicates a time in the past, * or is within the window of acceptable clock skew for the KDC and the * POSTDATE option has not been specified, then the start time of the * ticket is set to the authentication server's current time. If it * indicates a time in the future beyond the acceptable clock skew, but * the POSTDATED option has not been specified then the error * KDC_ERR_CANNOT_POSTDATE is returned. Otherwise the requested start * time is checked against the policy of the local realm (the * administrator might decide to prohibit certain types or ranges of * postdated tickets), and if acceptable, the ticket's start time is set * as requested and the INVALID flag is set in the new ticket. The * postdated ticket MUST be validated before use by presenting it to the * KDC after the start time has been reached. * * The expiration time of the ticket will be set to the earlier of the * requested endtime and a time determined by local policy, possibly * determined using realm or principal specific factors. For example, * the expiration time MAY be set to the earliest of the following: * * * The expiration time (endtime) requested in the KRB_AS_REQ * message. * * * The ticket's start time plus the maximum allowable lifetime * associated with the client principal from the authentication * server's database. * * * The ticket's start time plus the maximum allowable lifetime * associated with the server principal. * * * The ticket's start time plus the maximum lifetime set by the * policy of the local realm. * * If the requested expiration time minus the start time (as determined * above) is less than a site-determined minimum lifetime, an error * message with code KDC_ERR_NEVER_VALID is returned. If the requested * expiration time for the ticket exceeds what was determined as above, * and if the 'RENEWABLE-OK' option was requested, then the 'RENEWABLE' * flag is set in the new ticket, and the renew-till value is set as if * the 'RENEWABLE' option were requested (the field and option names are * described fully in section 5.4.1). * * If the RENEWABLE option has been requested or if the RENEWABLE-OK * option has been set and a renewable ticket is to be issued, then the * renew-till field MAY be set to the earliest of: * * * Its requested value. * * * The start time of the ticket plus the minimum of the two * maximum renewable lifetimes associated with the principals' * database entries. * * * The start time of the ticket plus the maximum renewable * lifetime set by the policy of the local realm. * */ tkt = shishi_as_tkt (as); if (tkt == NULL) { syslog (LOG_ERR, "shishi_as_tkt failed"); goto fatal; } { char *till; size_t tilllen; rc = shishi_kdcreq_till (handle, shishi_as_req (as), &till, &tilllen); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_till failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } if (tilllen != 16 || strlen (till) != 15) { syslog (LOG_ERR, "Invalid 'till' field in request (%d): %s", tilllen, till); goto fatal; } rc = shishi_encticketpart_endtime_set (handle, shishi_tkt_encticketpart (tkt), till); free (till); } /* XXX Do the time stuff above. */ /* * The flags field of the new ticket will have the following options set * if they have been requested and if the policy of the local realm * allows: FORWARDABLE, MAY-POSTDATE, POSTDATED, PROXIABLE, RENEWABLE. * If the new ticket is postdated (the start time is in the future), its * INVALID flag will also be set. */ if (shishi_kdcreq_forwardable_p (handle, shishi_as_req (as))) shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_FORWARDABLE); if (shishi_kdcreq_allow_postdate_p (handle, shishi_as_req (as))) shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_MAY_POSTDATE); if (shishi_kdcreq_postdated_p (handle, shishi_as_req (as))) { /* XXX policy check from time. */ shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_POSTDATED); shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_INVALID); /* XXX set starttime to from */ } if (shishi_kdcreq_proxiable_p (handle, shishi_as_req (as))) shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_PROXIABLE); if (shishi_kdcreq_renewable_p (handle, shishi_as_req (as))) { shishi_tkt_flags_add (tkt, SHISHI_TICKETFLAGS_RENEWABLE); /* XXX set renew-till from rtime */ } /* * If all of the above succeed, the server will encrypt the ciphertext * part of the ticket using the encryption key extracted from the server * principal's record in the Kerberos database using the encryption type * associated with the server principal's key (this choice is NOT * affected by the etype field in the request). It then formats a * KRB_AS_REP message (see section 5.4.2), copying the addresses in the * request into the caddr of the response, placing any required pre- * authentication data into the padata of the response, and encrypts the * ciphertext part in the client's key using an acceptable encryption * method requested in the etype field of the request, or in some key * specified by pre-authentication mechanisms being used. */ rc = shishi_tkt_key_set (tkt, sessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_key_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_clientrealm_set (tkt, realm, username); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_clientrealm_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_serverrealm_set (tkt, realm, servername); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_serverrealm_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_build (tkt, serverkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_build failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_as_rep_build (as, userkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_as_rep_build failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } if (arg.verbose_given) { shishi_kdcreq_print (handle, stderr, shishi_as_req (as)); shishi_encticketpart_print (handle, stderr, shishi_tkt_encticketpart (tkt)); shishi_ticket_print (handle, stderr, shishi_tkt_ticket (tkt)); shishi_enckdcreppart_print (handle, stderr, shishi_tkt_enckdcreppart (tkt)); shishi_kdcrep_print (handle, stderr, shishi_as_rep (as)); } rc = SHISHI_OK; fatal: if (rc != SHISHI_OK) syslog (LOG_ERR, "AS-REQ failed (%d): %s", rc, shishi_strerror (rc)); free (realm); free (username); free (servername); if (userkeys) shisa_keys_free (dbh, userkeys, nuserkeys); if (serverkeys) shisa_keys_free (dbh, serverkeys, nserverkeys); if (userkey) shishi_key_done (userkey); if (serverkey) shishi_key_done (serverkey); if (sessionkey) shishi_key_done (sessionkey); return rc; } static int tgsreq1 (Shishi_tgs * tgs) { int rc; Shishi_tkt *tkt; Shishi_key *newsessionkey = NULL, *oldsessionkey = NULL; Shishi_key *serverkey = NULL, *subkey = NULL, *tgkey = NULL; char *servername = NULL, *serverrealm = NULL; char *tgname = NULL, *tgrealm = NULL; char *clientname = NULL, *clientrealm = NULL; Shisa_principal krbtgt, server; Shisa_key **tgkeys = NULL, **serverkeys = NULL; size_t ntgkeys, nserverkeys; rc = shishi_tgs_req_process (tgs); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tgs_req_process failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * The KRB_TGS_REQ message is processed in a manner similar to the * KRB_AS_REQ message, but there are many additional checks to be * performed. First, the Kerberos server MUST determine which server the * accompanying ticket is for and it MUST select the appropriate key to * decrypt it. For a normal KRB_TGS_REQ message, it will be for the * ticket granting service, and the TGS's key will be used. If the TGT * was issued by another realm, then the appropriate inter-realm key * MUST be used. If the accompanying ticket is not a ticket-granting * ticket for the current realm, but is for an application server in the * current realm, the RENEW, VALIDATE, or PROXY options are specified in * the request, and the server for which a ticket is requested is the * server named in the accompanying ticket, then the KDC will decrypt * the ticket in the authentication header using the key of the server * for which it was issued. If no ticket can be found in the padata * field, the KDC_ERR_PADATA_TYPE_NOSUPP error is returned. */ /* Find name of ticket granter, e.g., krbtgt/JOSEFSSON.ORG@JOSEFSSON.ORG. */ rc = shishi_tkt_realm (shishi_ap_tkt (shishi_tgs_ap (tgs)), &tgrealm, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_realm failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_server (shishi_ap_tkt (shishi_tgs_ap (tgs)), &tgname, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_server failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } syslog (LOG_DEBUG, "TGS-REQ uses ticket granter %s@%s", tgname, tgrealm); rc = shisa_principal_find (dbh, tgrealm, tgname, &krbtgt); if (rc != SHISA_OK && rc != SHISA_NO_PRINCIPAL) { syslog (LOG_ERR, "shisa_principal_find(%s@%s) failed (%d): %s", tgname, tgrealm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } if (rc == SHISA_NO_PRINCIPAL) { syslog (LOG_NOTICE, "TGS-REQ using %s@%s failed: no such tgt", tgname, tgrealm); rc = shishi_krberror_errorcode_set (handle, shishi_tgs_krberror (tgs), SHISHI_KRB_AP_ERR_NOT_US); if (rc != SHISHI_OK) goto fatal; rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } rc = shisa_keys_find (dbh, tgrealm, tgname, NULL, &tgkeys, &ntgkeys); if (rc != SHISA_OK || ntgkeys == 0) { syslog (LOG_ERR, "shisa_keys_find(%s@%s) failed (%d): %s", tgname, tgrealm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } /* XXX use etype/kvno to select key. */ rc = shishi_key_from_value (handle, tgkeys[0]->etype, tgkeys[0]->key, &tgkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_key_from_value (tgt) failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_ap_req_process_keyusage (shishi_tgs_ap (tgs), tgkey, SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_ap_req_process_keyusage failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * 3.3.3.1. Checking for revoked tickets * * Whenever a request is made to the ticket-granting server, the * presented ticket(s) is(are) checked against a hot-list of tickets * which have been canceled. This hot-list might be implemented by * storing a range of issue timestamps for 'suspect tickets'; if a * presented ticket had an authtime in that range, it would be rejected. * In this way, a stolen ticket-granting ticket or renewable ticket * cannot be used to gain additional tickets (renewals or otherwise) * once the theft has been reported to the KDC for the realm in which * the server resides. Any normal ticket obtained before it was reported * stolen will still be valid (because they require no interaction with * the KDC), but only until their normal expiration time. If TGT's have * been issued for cross-realm authentication, use of the cross-realm * TGT will not be affected unless the hot-list is propagated to the * KDCs for the realms for which such cross-realm tickets were issued. */ /* XXX Check if tgname@tgrealm is a valid TGT. */ /* * Once the accompanying ticket has been decrypted, the user-supplied * checksum in the Authenticator MUST be verified against the contents * of the request, and the message rejected if the checksums do not * match (with an error code of KRB_AP_ERR_MODIFIED) or if the checksum * is not collision-proof (with an error code of * KRB_AP_ERR_INAPP_CKSUM). If the checksum type is not supported, the * KDC_ERR_SUMTYPE_NOSUPP error is returned. If the authorization-data * are present, they are decrypted using the sub-session key from the * Authenticator. * * If any of the decryptions indicate failed integrity checks, the * KRB_AP_ERR_BAD_INTEGRITY error is returned. */ /* XXX check that checksum in authenticator match tgsreq.req-body */ syslog (LOG_DEBUG, "TGS-REQ authentication OK using %s@%s", tgname, tgrealm); /* * As discussed in section 3.1.2, the KDC MUST send a valid KRB_TGS_REP * message if it receives a KRB_TGS_REQ message identical to one it has * recently processed. However, if the authenticator is a replay, but * the rest of the request is not identical, then the KDC SHOULD return * KRB_AP_ERR_REPEAT. */ /* XXX Do replay stuff. */ /* * The response will include a ticket for the requested server or for a * ticket granting server of an intermediate KDC to be contacted to * obtain the requested ticket. The Kerberos database is queried to * retrieve the record for the appropriate server (including the key * with which the ticket will be encrypted). If the request is for a * ticket-granting ticket for a remote realm, and if no key is shared * with the requested realm, then the Kerberos server will select the * realm 'closest' to the requested realm with which it does share a * key, and use that realm instead. Thss is theonly cases where the * response for the KDC will be for a different server than that * requested by the client. */ rc = shishi_kdcreq_realm (handle, shishi_tgs_req (tgs), &serverrealm, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_realm failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* XXX Do cross-realm handling. */ rc = shishi_kdcreq_server (handle, shishi_tgs_req (tgs), &servername, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_kdcreq_server failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shisa_principal_find (dbh, serverrealm, servername, &server); if (rc != SHISA_OK && rc != SHISA_NO_PRINCIPAL) { syslog (LOG_ERR, "shisa_principal_find(%s@%s) failed (%d): %s", servername, serverrealm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } if (rc == SHISA_NO_PRINCIPAL) { syslog (LOG_NOTICE, "TGS-REQ for %s@%s failed: no such server", servername, serverrealm); rc = shishi_krberror_errorcode_set (handle, shishi_tgs_krberror (tgs), SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN); if (rc != SHISHI_OK) goto fatal; rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } rc = shisa_keys_find (dbh, serverrealm, servername, NULL, &serverkeys, &nserverkeys); if (rc != SHISA_OK || nserverkeys == 0) { syslog (LOG_ERR, "shisa_keys_find(%s@%s) failed (%d): %s", servername, serverrealm, rc, shisa_strerror (rc)); rc = SHISHI_INVALID_PRINCIPAL_NAME; goto fatal; } /* XXX Select "best" available key (highest kvno, best algorithm?) here. The client etype should not influence this. */ rc = shishi_key_from_value (handle, serverkeys[0]->etype, serverkeys[0]->key, &serverkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shisa_key_from_value (server) failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* Generate session key for the newly generated ticket, of same key type as the selected long-term server key. XXX let the client influence the etype? think of AES only server and RFC 1510 client. if client etype is not used here, the client cannot talk to the server. perhaps just as good though. */ rc = shishi_key_random (handle, shishi_key_type (serverkey), &newsessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_key_random failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * By default, the address field, the client's name and realm, the list * of transited realms, the time of initial authentication, the * expiration time, and the authorization data of the newly-issued * ticket will be copied from the ticket-granting ticket (TGT) or * renewable ticket. If the transited field needs to be updated, but the * transited type is not supported, the KDC_ERR_TRTYPE_NOSUPP error is * returned. */ tkt = shishi_tgs_tkt (tgs); if (tkt == NULL) { syslog (LOG_ERR, "shishi_tgs_tkt failed"); goto fatal; } rc = shishi_encticketpart_crealm (handle, shishi_tkt_encticketpart (shishi_ap_tkt (shishi_tgs_ap (tgs))), &clientrealm, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_encticketpart_crealm failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_encticketpart_client (handle, shishi_tkt_encticketpart (shishi_ap_tkt (shishi_tgs_ap (tgs))), &clientname, NULL); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_encticketpart_client failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_clientrealm_set (tkt, clientrealm, clientname); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_clientrealm_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* XXX Copy more fields. Move copying into lib/? */ rc = shishi_encticketpart_endtime_set (handle, shishi_tkt_encticketpart (tkt), shishi_generalize_time (handle, shishi_kdcreq_tillc (handle, shishi_tgs_req (tgs)))); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_encticketpart_endtime_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_key_set (tkt, newsessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_key_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_tkt_serverrealm_set (tkt, serverrealm, servername); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_serverrealm_set failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } syslog (LOG_DEBUG, "TGS-REQ from %s@%s for %s@%s", clientname, clientrealm, servername, serverrealm); /* * If the request specifies an endtime, then the endtime of the new * ticket is set to the minimum of (a) that request, (b) the endtime * from the TGT, and (c) the starttime of the TGT plus the minimum of * the maximum life for the application server and the maximum life for * the local realm (the maximum life for the requesting principal was * already applied when the TGT was issued). If the new ticket is to be * a renewal, then the endtime above is replaced by the minimum of (a) * the value of the renew_till field of the ticket and (b) the starttime * for the new ticket plus the life (endtime-starttime) of the old * ticket. * * If the FORWARDED option has been requested, then the resulting ticket * will contain the addresses specified by the client. This option will * only be honored if the FORWARDABLE flag is set in the TGT. The PROXY * option is similar; the resulting ticket will contain the addresses * specified by the client. It will be honored only if the PROXIABLE * flag in the TGT is set. The PROXY option will not be honored on * requests for additional ticket-granting tickets. * * If the requested start time is absent, indicates a time in the past, * or is within the window of acceptable clock skew for the KDC and the * POSTDATE option has not been specified, then the start time of the * ticket is set to the authentication server's current time. If it * indicates a time in the future beyond the acceptable clock skew, but * the POSTDATED option has not been specified or the MAY-POSTDATE flag * is not set in the TGT, then the error KDC_ERR_CANNOT_POSTDATE is * returned. Otherwise, if the ticket-granting ticket has the MAY- * POSTDATE flag set, then the resulting ticket will be postdated and * the requested starttime is checked against the policy of the local * realm. If acceptable, the ticket's start time is set as requested, * and the INVALID flag is set. The postdated ticket MUST be validated * before use by presenting it to the KDC after the starttime has been * reached. However, in no case may the starttime, endtime, or renew- * till time of a newly-issued postdated ticket extend beyond the renew- * till time of the ticket-granting ticket. * * If the ENC-TKT-IN-SKEY option has been specified and an additional * ticket has been included in the request, it indicates that the client * is using user- to-user authentication to prove its identity to a * server that does not have access to a persistent key. Section 3.7 * describes the affect of this option on the entire Kerberos protocol. * When generating the KRB_TGS_REP message, this option in the * KRB_TGS_REQ message tells the KDC to decrypt the additional ticket * using the key for the server to which the additional ticket was * issued and verify that it is a ticket-granting ticket. If the name of * the requested server is missing from the request, the name of the * client in the additional ticket will be used. Otherwise the name of * the requested server will be compared to the name of the client in * the additional ticket and if different, the request will be rejected. * If the request succeeds, the session key from the additional ticket * will be used to encrypt the new ticket that is issued instead of * using the key of the server for which the new ticket will be used. * * If the name of the server in the ticket that is presented to the KDC * as part of the authentication header is not that of the ticket- * granting server itself, the server is registered in the realm of the * KDC, and the RENEW option is requested, then the KDC will verify that * the RENEWABLE flag is set in the ticket, that the INVALID flag is not * set in the ticket, and that the renew_till time is still in the * future. If the VALIDATE option is requested, the KDC will check that * the starttime has passed and the INVALID flag is set. If the PROXY * option is requested, then the KDC will check that the PROXIABLE flag * is set in the ticket. If the tests succeed, and the ticket passes the * hotlist check described in the next section, the KDC will issue the * appropriate new ticket. */ /* XXX Set more things in ticket, as described above. */ rc = shishi_tkt_build (tkt, serverkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tkt_build failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } /* * The ciphertext part of the response in the KRB_TGS_REP message is * encrypted in the sub-session key from the Authenticator, if present, * or the session key from the ticket-granting ticket. It is not * encrypted using the client's secret key. Furthermore, the client's * key's expiration date and the key version number fields are left out * since these values are stored along with the client's database * record, and that record is not needed to satisfy a request based on a * ticket-granting ticket. */ rc = shishi_encticketpart_get_key (handle, shishi_tkt_encticketpart (shishi_ap_tkt (shishi_tgs_ap (tgs))), &oldsessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_encticketpart_get_key failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } rc = shishi_authenticator_get_subkey (handle, shishi_ap_authenticator (shishi_tgs_ap (tgs)), &subkey); if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT) { syslog (LOG_ERR, "shishi_authenticator_get_subkey failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } if (rc == SHISHI_OK) rc = shishi_tgs_rep_build (tgs, SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY, subkey); else rc = shishi_tgs_rep_build (tgs, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY, oldsessionkey); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tgs_rep_build failed (%d): %s", rc, shishi_strerror (rc)); goto fatal; } if (arg.verbose_given) { puts ("KDC-REQ in:"); shishi_kdcreq_print (handle, stderr, shishi_tgs_req (tgs)); puts ("AP-REQ in KDC-REQ:"); shishi_apreq_print (handle, stderr, shishi_ap_req (shishi_tgs_ap (tgs))); puts ("Authenticator in AP-REQ in KDC-REQ:"); shishi_authenticator_print (handle, stderr, shishi_ap_authenticator (shishi_tgs_ap (tgs))); puts ("Ticket in AP-REQ:"); shishi_ticket_print (handle, stdout, shishi_tkt_ticket (shishi_ap_tkt (shishi_tgs_ap (tgs)))); puts ("EncTicketPart in AP-REQ:"); shishi_encticketpart_print (handle, stdout, shishi_tkt_encticketpart (shishi_ap_tkt (shishi_tgs_ap (tgs)))); puts ("Ticket in TGS-REP:"); shishi_ticket_print (handle, stdout, shishi_tkt_ticket (tkt)); puts ("EncTicketPart in TGS-REP:"); shishi_encticketpart_print (handle, stderr, shishi_tkt_encticketpart (tkt)); puts ("EncKDCRepPart in TGS-REP:"); shishi_enckdcreppart_print (handle, stderr, shishi_tkt_enckdcreppart (tkt)); puts ("KDC-REP:"); shishi_kdcrep_print (handle, stderr, shishi_tgs_rep (tgs)); } rc = SHISHI_OK; fatal: free (tgrealm); free (tgname); free (servername); free (serverrealm); free (clientname); free (clientrealm); if (tgkeys) shisa_keys_free (dbh, tgkeys, ntgkeys); if (serverkeys) shisa_keys_free (dbh, serverkeys, nserverkeys); if (tgkey) shishi_key_done (tgkey); if (serverkey) shishi_key_done (serverkey); if (newsessionkey) shishi_key_done (newsessionkey); if (oldsessionkey) shishi_key_done (oldsessionkey); if (subkey) shishi_key_done (subkey); return rc; } static int asreq (Shishi_asn1 kdcreq, char **out, size_t * outlen) { Shishi_as *as; int rc; rc = shishi_as (handle, &as); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_as failed (%d): %s", rc, shishi_strerror (rc)); return rc; } shishi_as_req_set (as, kdcreq); rc = asreq1 (as); if (rc != SHISHI_OK) { syslog (LOG_NOTICE, "AS-REQ failing with KRB-ERROR: %s", shishi_krberror_message (handle, shishi_as_krberror (as))); rc = shishi_as_krberror_der (as, out, outlen); } else rc = shishi_as_rep_der (as, out, outlen); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_as_rep_der failed (%d): %s", rc, shishi_strerror (rc)); return rc; } return SHISHI_OK; } static int tgsreq (Shishi_asn1 kdcreq, char **out, size_t * outlen) { Shishi_tgs *tgs; int rc; rc = shishi_tgs (handle, &tgs); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tgs failed (%d): %s", rc, shishi_strerror (rc)); return rc; } shishi_tgs_req_set (tgs, kdcreq); rc = tgsreq1 (tgs); if (rc != SHISHI_OK) { syslog (LOG_NOTICE, "TGS-REQ failing with KRB-ERROR: %s", shishi_krberror_message (handle, shishi_tgs_krberror (tgs))); rc = shishi_tgs_krberror_der (tgs, out, outlen); } else rc = shishi_tgs_rep_der (tgs, out, outlen); if (rc != SHISHI_OK) { syslog (LOG_ERR, "shishi_tgs_rep_der failed (%d): %s", rc, shishi_strerror (rc)); return rc; } return SHISHI_OK; } ssize_t process (const char *in, size_t inlen, char **out) { Shishi_asn1 node; size_t outlen; int rc; node = shishi_der2asn1 (handle, in, inlen); if (node == NULL) { syslog (LOG_ERR, "Received %d bytes of unknown data", inlen); return -1; } switch (shishi_asn1_msgtype (handle, node)) { case SHISHI_MSGTYPE_AS_REQ: rc = asreq (node, out, &outlen); break; case SHISHI_MSGTYPE_TGS_REQ: rc = tgsreq (node, out, &outlen); break; case SHISHI_MSGTYPE_AS_REP: case SHISHI_MSGTYPE_TGS_REP: case SHISHI_MSGTYPE_AP_REQ: case SHISHI_MSGTYPE_AP_REP: case SHISHI_MSGTYPE_RESERVED16: case SHISHI_MSGTYPE_RESERVED17: case SHISHI_MSGTYPE_SAFE: case SHISHI_MSGTYPE_PRIV: case SHISHI_MSGTYPE_CRED: case SHISHI_MSGTYPE_ERROR: default: syslog (LOG_ERR, "Unsupported KDC message type %d (0x%x)", shishi_asn1_msgtype (handle, node), shishi_asn1_msgtype (handle, node)); rc = SHISHI_ASN1_ERROR; break; } if (rc != SHISHI_OK) { syslog (LOG_ERR, "Fatal error answering request (%d): %s", rc, shishi_strerror (rc)); return -1; } return outlen; } shishi-1.0.2/src/shishid.c0000644000000000000000000003266512126660540012274 00000000000000/* shishid.c --- Shishi Key Distribution Center daemon. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Get Shishid stuff. */ #include "kdc.h" /* Gnulib helpers. */ #include "progname.h" #include "version-etc.h" #include "error.h" /* Global variables. */ Shishi *handle; Shisa *dbh; struct gengetopt_args_info arg; struct listenspec *listenspec; char *fatal_krberror; size_t fatal_krberror_len; #ifdef USE_STARTTLS gnutls_dh_params dh_params; gnutls_anon_server_credentials anoncred; gnutls_certificate_credentials x509cred; #endif /* Listen to all listenspec's, removing entries that fail. */ static void kdc_listen (void) { struct listenspec *ls, *tmp, *last; int maxfd = 0; int yes; for (last = NULL, ls = listenspec; ls; last = ls, ls = ls->next) { restart: ls->sockfd = socket (ls->ai.ai_family, ls->ai.ai_socktype, ls->ai.ai_protocol); if (ls->sockfd == -1) { error (0, errno, "Cannot listen on %s because socket (%d,%d,%d) failed", ls->str, ls->ai.ai_family, ls->ai.ai_socktype, ls->ai.ai_protocol); goto error; } #ifdef IPV6_V6ONLY if (ls->ai.ai_family == AF_INET6) { yes = 1; if (setsockopt (ls->sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &yes, sizeof (yes)) < 0) error (0, errno, "Cannot restrict %s to AF_INET6 only", ls->addrname); } #endif yes = 1; if (setsockopt (ls->sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof (yes)) < 0) { error (0, errno, "Cannot listen on %s because setsockopt failed", ls->str); goto errorclose; } if (bind (ls->sockfd, ls->ai.ai_addr, ls->ai.ai_addrlen) != 0) { error (0, errno, "Cannot listen on %s because bind %s failed", ls->str, ls->addrname); goto errorclose; } if (ls->ai.ai_socktype == SOCK_STREAM && listen (ls->sockfd, SOMAXCONN) != 0) { error (0, errno, "Cannot listen on %s because listen failed", ls->str); goto errorclose; } if (!arg.quiet_flag) printf ("Listening on %s (%s)...\n", ls->str, ls->addrname); maxfd++; continue; errorclose: close (ls->sockfd); error: tmp = ls->next; if (last == NULL) listenspec = tmp; else last->next = tmp; free (ls->str); free (ls); ls = tmp; if (!ls) break; goto restart; } if (maxfd == 0) error (EXIT_FAILURE, 0, "cannot bind any ports"); if (!arg.quiet_flag) printf ("Listening on %d sockets...\n", maxfd); } /* Close open sockets, reporting any errors. */ static void kdc_unlisten (void) { struct listenspec *ls, *tmp; int rc; for (ls = listenspec; ls; ls = tmp) { tmp = ls->next; if (!ls->listening) syslog (LOG_NOTICE, "Closing outstanding connection to %s on socket %d", ls->str, ls->sockfd); if (ls->sockfd) { if (!arg.quiet_flag) printf ("Closing %s (%s)...\n", ls->str, ls->addrname); rc = close (ls->sockfd); if (rc != 0) syslog (LOG_ERR, "Could not close %s on socket %d: %s (%d)", ls->str, ls->sockfd, strerror (errno), errno); } free (ls->ai.ai_addr); free (ls->str); free (ls); } } /* If requested, abandon user privileges. */ static void kdc_setuid (void) { struct passwd *passwd; int rc; if (!arg.setuid_given) return; passwd = getpwnam (arg.setuid_arg); if (passwd == NULL) { if (errno) error (EXIT_FAILURE, errno, "Cannot setuid because getpwnam failed"); else error (EXIT_FAILURE, 0, "no such user `%s'", arg.setuid_arg); } rc = setuid (passwd->pw_uid); if (rc == -1) error (EXIT_FAILURE, errno, "Cannot setuid"); if (!arg.quiet_flag) printf ("User identity set to `%s' (%d)...\n", passwd->pw_name, passwd->pw_uid); } /* Create a hard coded error message that can be used in case kdc.c fail to produce */ static int setup_fatal_krberror (void) { Shishi_asn1 krberr; int rc; krberr = shishi_krberror (handle); if (!krberr) return SHISHI_MALLOC_ERROR; rc = shishi_krberror_set_etext (handle, krberr, "Internal KDC error, contact administrator"); if (rc != SHISHI_OK) return rc; rc = shishi_krberror_der (handle, krberr, &fatal_krberror, &fatal_krberror_len); if (rc != SHISHI_OK) return rc; return SHISHI_OK; } /* Core daemon part. Initialize and set up various things, and then hand over control to kdc.c via kdc_loop, and cleaning up afterwards. Note that kdc_loop only return when the process has received SIGINT or SIGTERM. */ static void doit (void) { int rc; rc = shishi_init_server_with_paths (&handle, arg.configuration_file_arg); if (rc) error (EXIT_FAILURE, 0, "Cannot initialize Shishi: %s (%d)", shishi_strerror (rc), rc); if (arg.verbose_given > 1) shishi_cfg (handle, "verbose"); if (arg.verbose_given > 2) shishi_cfg (handle, "verbose-noise"); if (arg.verbose_given > 3) shishi_cfg (handle, "verbose-asn1"); if (arg.verbose_given > 4) shishi_cfg (handle, "verbose-crypto"); if (arg.verbose_given > 5) shishi_cfg (handle, "verbose-crypto-noise"); rc = shisa_init (&dbh); if (rc) error (EXIT_FAILURE, 0, "Cannot initialize Shisa: %s (%d)", shisa_strerror (rc), rc); rc = setup_fatal_krberror (); if (rc) error (EXIT_FAILURE, 0, "Cannot allocate fatal error packet: %s (%d)", shisa_strerror (rc), rc); #ifdef USE_STARTTLS if (!arg.no_tls_flag) { if (!arg.quiet_flag) printf ("Initializing GNUTLS...\n"); rc = gnutls_global_init (); if (rc) error (EXIT_FAILURE, 0, "Cannot initialize GNUTLS: %s (%d)", gnutls_strerror (rc), rc); rc = gnutls_anon_allocate_server_credentials (&anoncred); if (rc) error (EXIT_FAILURE, 0, "Cannot allocate GNUTLS credential: %s (%d)", gnutls_strerror (rc), rc); rc = gnutls_certificate_allocate_credentials (&x509cred); if (rc) error (EXIT_FAILURE, 0, "Cannot allocate GNUTLS X.509 credential: %s (%d)", gnutls_strerror (rc), rc); if (arg.x509cafile_given) { int num; num = gnutls_certificate_set_x509_trust_file (x509cred, arg.x509cafile_arg, GNUTLS_X509_FMT_PEM); if (num <= 0) error (EXIT_FAILURE, 0, "No X.509 CAs found in `%s' (%d): %s", arg.x509cafile_arg, num, gnutls_strerror (num)); if (!arg.quiet_flag) printf ("Parsed %d CAs...\n", num); } if (arg.x509crlfile_given) { int num; num = gnutls_certificate_set_x509_crl_file (x509cred, arg.x509crlfile_arg, GNUTLS_X509_FMT_PEM); if (num <= 0) error (EXIT_FAILURE, 0, "No X.509 CRLs found in `%s' (%d): %s", arg.x509crlfile_arg, num, gnutls_strerror (num)); if (!arg.quiet_flag) printf ("Parsed %d CRLs...\n", num); } if (arg.x509certfile_given && arg.x509keyfile_given) { rc = gnutls_certificate_set_x509_key_file (x509cred, arg.x509certfile_arg, arg.x509keyfile_arg, GNUTLS_X509_FMT_PEM); if (rc != GNUTLS_E_SUCCESS) error (EXIT_FAILURE, 0, "No X.509 server certificate/key found in `%s'/`%s' (%d): %s", arg.x509certfile_arg, arg.x509keyfile_arg, rc, gnutls_strerror (rc)); if (!arg.quiet_flag) printf ("Loaded server certificate/key...\n"); } else if (arg.x509certfile_given || arg.x509keyfile_given) error (EXIT_FAILURE, 0, "Need both --x509certfile and --x509keyfile"); rc = gnutls_dh_params_init (&dh_params); if (rc) error (EXIT_FAILURE, 0, "Cannot initialize GNUTLS DH parameters: %s (%d)", gnutls_strerror (rc), rc); if (!arg.quiet_flag) printf ("Generating Diffie-Hellman parameters...\n"); rc = gnutls_dh_params_generate2 (dh_params, DH_BITS); if (rc) error (EXIT_FAILURE, 0, "Cannot generate GNUTLS DH parameters: %s (%d)", gnutls_strerror (rc), rc); gnutls_anon_set_server_dh_params (anoncred, dh_params); gnutls_certificate_set_dh_params (x509cred, dh_params); resume_db_init (arg.resume_limit_arg); if (!arg.quiet_flag) printf ("Initializing GNUTLS...done\n"); } #endif kdc_listen (); { const char *slash = strrchr (program_name, '/'); const char *shortname = (slash != NULL ? slash + 1 : program_name); #ifdef LOG_PERROR if (arg.verbose_given > 0) openlog (shortname, LOG_CONS | LOG_PERROR, LOG_AUTH); else #endif openlog (shortname, LOG_CONS, LOG_AUTH); } kdc_setuid (); kdc_loop (); kdc_unlisten (); #ifdef USE_STARTTLS if (!arg.no_tls_flag) { if (!arg.quiet_flag) printf ("Deinitializing GNUTLS...\n"); resume_db_done (); gnutls_global_deinit (); if (!arg.quiet_flag) printf ("Deinitializing GNUTLS...done\n"); } #endif shisa_done (dbh); shishi_done (handle); } #define FAMILY_IPV4 "IPv4:" #define FAMILY_IPV6 "IPv6:" #define LISTEN_DEFAULT "*:kerberos/udp, *:kerberos/tcp" /* Parse the --listen parameter, creating listenspec elements. */ static void parse_listen (char *listenstr) { char *ptrptr; char *val; int i; for (i = 0; (val = strtok_r (i == 0 ? listenstr : NULL, ", \t", &ptrptr)); i++) { char *name, *service, *proto; struct listenspec *ls; struct addrinfo hints, *res, *p; int rc; name = xstrdup (val); memset (&hints, 0, sizeof (hints)); if (strncmp (val, FAMILY_IPV4, strlen (FAMILY_IPV4)) == 0) { hints.ai_family = AF_INET; val += strlen (FAMILY_IPV4); } #ifdef WITH_IPV6 else if (strncmp (val, FAMILY_IPV6, strlen (FAMILY_IPV6)) == 0) { hints.ai_family = AF_INET6; val += strlen (FAMILY_IPV6); } #endif else hints.ai_family = AF_UNSPEC; proto = strrchr (val, '/'); if (proto == NULL) error (EXIT_FAILURE, 0, "Could not find protocol type in: `%s'", name); *proto = '\0'; proto++; if (strcmp (proto, "tcp") == 0) hints.ai_socktype = SOCK_STREAM; else if (strcmp (proto, "udp") == 0) hints.ai_socktype = SOCK_DGRAM; else error (EXIT_FAILURE, 0, "Unknown protocol type in `%s': %s", name, proto); service = strrchr (val, ':'); if (service == NULL) error (EXIT_FAILURE, 0, "Could not find service in listen spec: `%s'", name); *service = '\0'; service++; hints.ai_flags = AI_ADDRCONFIG; if (strcmp (val, "*") == 0) { hints.ai_flags |= AI_PASSIVE; rc = getaddrinfo (NULL, "kerberos", &hints, &res); } else rc = getaddrinfo (val, "kerberos", &hints, &res); if (rc != 0) error (EXIT_FAILURE, errno, "Cannot get listen socket for %s (host %s)", name, val); for (p = res; p; p = p->ai_next) { ls = xzalloc (sizeof (*ls)); ls->next = listenspec; listenspec = ls; ls->str = xstrdup (name); ls->bufpos = 0; ls->listening = 1; memcpy (&ls->ai, p, sizeof (*p)); ls->ai.ai_addr = xmemdup (p->ai_addr, p->ai_addrlen); ls->ai.ai_next = NULL; rc = getnameinfo (ls->ai.ai_addr, ls->ai.ai_addrlen, ls->addrname, sizeof (ls->addrname), NULL, 0, NI_NUMERICHOST); if (rc != 0) strncpy (ls->addrname, "unknown address", sizeof (ls->addrname)); } freeaddrinfo (res); free (name); } } const char version_etc_copyright[] = /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ "Copyright %s %d Simon Josefsson."; static void usage (int status) __attribute__ ((__noreturn__)); static void usage (int status) { if (status != EXIT_SUCCESS) fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); else { cmdline_parser_print_help (); /* TRANSLATORS: The placeholder indicates the bug-reporting address for this package. Please add _another line_ saying "Report translation bugs to <...>\n" with the address for translation bugs (typically your translation team's web or email address). */ printf (_("\nMandatory arguments to long options are " "mandatory for short options too.\n\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); } exit (status); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); set_program_name (argv[0]); if (cmdline_parser (argc, argv, &arg) != 0) usage (EXIT_FAILURE); if (arg.version_given) { version_etc (stdout, "shishid", PACKAGE_NAME, VERSION, "Simon Josefsson", (char *) NULL); return EXIT_SUCCESS; } if (arg.help_given) usage (EXIT_SUCCESS); if (!arg.configuration_file_arg) arg.configuration_file_arg = strdup (SYSTEMCFGFILE); if (!arg.listen_given) arg.listen_arg = strdup (LISTEN_DEFAULT); parse_listen (arg.listen_arg); doit (); free (arg.listen_arg); free (arg.configuration_file_arg); free (arg.setuid_arg); return EXIT_SUCCESS; } shishi-1.0.2/src/kdc.h0000664000000000000000000000726712126660507011414 00000000000000/* kdc.h --- Header file with common definitions for Shishid. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include /* Get ssize_t, setuid, read, etc. */ #include /* Get gethostbyname, getservbyname. */ #include /* Get getpwnam. */ #ifdef HAVE_PWD_H # include #endif /* For errno. */ #include /* For select, etc. */ #include /* For select, etc. */ #include #include /* Get select, etc. */ #include /* Get accept, sendto, etc. */ #include /* Used for the backlog argument to listen. */ #ifndef SOMAXCONN # define SOMAXCONN INT_MAX #endif #ifdef HAVE_SYS_IOCTL_H # include #endif /* Get signal, etc. */ #include #include #ifdef HAVE_NETINET_IN6_H # include #endif #include #ifdef HAVE_SYSLOG_H # include #endif #ifdef USE_STARTTLS # include # include #endif /* Setup i18n. */ #include #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) /* Get xmalloc. */ #include "xalloc.h" /* Shishi and Shisa library. */ #include #include /* Command line parameter parser via gengetopt. */ #include "shishid_cmd.h" struct listenspec { char *str; int listening; struct addrinfo ai; char addrname[NI_MAXHOST]; struct sockaddr_storage udpclientaddr; socklen_t udpclientaddrlen; char clientaddrname[NI_MAXHOST]; int sockfd; char buf[BUFSIZ]; /* XXX */ size_t bufpos; int usetls; #ifdef USE_STARTTLS gnutls_session session; #endif struct listenspec *next; }; extern Shishi *handle; extern Shisa *dbh; extern struct gengetopt_args_info arg; extern struct listenspec *listenspec; extern char *fatal_krberror; extern size_t fatal_krberror_len; #ifdef USE_STARTTLS #define DH_BITS 1024 extern gnutls_dh_params dh_params; extern gnutls_anon_server_credentials anoncred; extern gnutls_certificate_credentials x509cred; #endif /* Interface between shishid.c and server.c. */ extern void kdc_loop (void); /* Interface between server.c and kdc.c. */ extern ssize_t process (const char *in, size_t inlen, char **out); /* Interface between server.c and starttls.c. */ extern void kdc_send1 (struct listenspec *ls); extern int kdc_extension_reject (struct listenspec *ls); extern int kdc_extension (struct listenspec *ls); /* Interface between shishid.c, server.c and resume.c. */ #ifdef USE_STARTTLS extern void resume_db_init (size_t nconnections); extern void resume_db_done (void); extern int resume_db_store (void *dbf, gnutls_datum key, gnutls_datum data); extern gnutls_datum resume_db_fetch (void *dbf, gnutls_datum key); extern int resume_db_delete (void *dbf, gnutls_datum key); #endif shishi-1.0.2/src/Makefile.am0000664000000000000000000001057112126660507012526 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SUBDIRS = gl AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = \ -I$(builddir)/gl -I$(srcdir)/gl \ -I$(top_builddir)/gl -I$(top_srcdir)/gl \ -I$(top_builddir)/lib -I$(top_srcdir)/lib \ -I$(top_srcdir)/db localedir = $(datadir)/locale DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shishi.conf\" \ -DHOSTKEYSFILE=\"$(KEYDIR)/shishi.keys\" BUILT_SOURCES = shishi_cmd.c shishi_cmd.h shisa_cmd.c shisa_cmd.h \ shishid_cmd.c shishid_cmd.h keytab2shishi_cmd.c \ keytab2shishi_cmd.h ccache2shishi_cmd.c \ ccache2shishi_cmd.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) bin_PROGRAMS = shishi shisa ccache2shishi sbin_PROGRAMS = keytab2shishi if ENABLE_SHISHID sbin_PROGRAMS += shishid endif noinst_LTLIBRARIES = shishi_SOURCES = shishi.c shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-shishi.la \ ../lib/libshishi.la @LTLIBINTL@ noinst_LTLIBRARIES += libcmd-shishi.la libcmd_shishi_la_CFLAGS = libcmd_shishi_la_LIBADD = gl/libgnu.la libcmd_shishi_la_SOURCES = shishi.ggo shishi_cmd.h shishi_cmd.c shishi_cmd.c shishi_cmd.h: $(srcdir)/shishi.ggo Makefile.am gengetopt --unamed-opts="CLIENT [SERVER]" \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shishi.ggo --file-name shishi_cmd shisa_SOURCES = shisa.c shisa_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-shisa.la \ ../db/libshisa.la ../lib/libshishi.la @LTLIBINTL@ noinst_LTLIBRARIES += libcmd-shisa.la libcmd_shisa_la_CFLAGS = libcmd_shisa_la_LIBADD = gl/libgnu.la libcmd_shisa_la_SOURCES = shisa.ggo shisa_cmd.h shisa_cmd.c shisa_cmd.c shisa_cmd.h: $(srcdir)/shisa.ggo Makefile.am gengetopt --unamed-opts="REALM [PRINCIPAL]" \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shisa.ggo --file-name shisa_cmd shishid_SOURCES = shishid.c server.c kdc.h kdc.c if STARTTLS shishid_SOURCES += starttls.c resume.c endif shishid_LDADD = ../gl/libgnu.la gl/libgnu.la ../lib/libshishi.la \ ../db/libshisa.la @LTLIBGNUTLS@ @LTLIBINTL@ libcmd-shishid.la noinst_LTLIBRARIES += libcmd-shishid.la libcmd_shishid_la_CFLAGS = libcmd_shishid_la_LIBADD = gl/libgnu.la libcmd_shishid_la_SOURCES = shishid.ggo shishid_cmd.h shishid_cmd.c shishid_cmd.c shishid_cmd.h: $(srcdir)/shishid.ggo Makefile.am gengetopt \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shishid.ggo --file-name shishid_cmd keytab2shishi_SOURCES = keytab2shishi.c keytab2shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-keytab2shishi.la \ ../lib/libshishi.la @LTLIBINTL@ noinst_LTLIBRARIES += libcmd-keytab2shishi.la libcmd_keytab2shishi_la_CFLAGS = libcmd_keytab2shishi_la_LIBADD = gl/libgnu.la libcmd_keytab2shishi_la_SOURCES = keytab2shishi.ggo \ keytab2shishi_cmd.h keytab2shishi_cmd.c keytab2shishi_cmd.c keytab2shishi_cmd.h: $(srcdir)/keytab2shishi.ggo Makefile.am gengetopt --unamed-opts="INFILE [OUTFILE]" \ --no-handle-help --no-handle-error \ --input $(srcdir)/keytab2shishi.ggo --file-name keytab2shishi_cmd ccache2shishi_SOURCES = ccache2shishi.c ccache2shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-ccache2shishi.la \ ../lib/libshishi.la @LTLIBINTL@ noinst_LTLIBRARIES += libcmd-ccache2shishi.la libcmd_ccache2shishi_la_CFLAGS = libcmd_ccache2shishi_la_LIBADD = gl/libgnu.la libcmd_ccache2shishi_la_SOURCES = ccache2shishi.ggo \ ccache2shishi_cmd.h ccache2shishi_cmd.c ccache2shishi_cmd.c ccache2shishi_cmd.h: $(srcdir)/ccache2shishi.ggo Makefile.am gengetopt --unamed-opts="INFILE [OUTFILE]" \ --no-handle-help --no-handle-error \ --input $(srcdir)/ccache2shishi.ggo --file-name ccache2shishi_cmd shishi-1.0.2/src/keytab2shishi.c0000664000000000000000000001064512126660507013411 00000000000000/* keytab2shishi.c --- Convert MIT keytab files to Shishi hostkeys * Copyright (C) 2006-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include /* Get i18n. */ #include #include #define _(String) gettext (String) #include /* Get set_program_name and program_name. */ #include "progname.h" /* Get error. */ #include "error.h" #include "keytab2shishi_cmd.h" int main (int argc, char *argv[]) { struct gengetopt_args_info args; const char *infile = NULL; const char *outfile = NULL; Shishi *sh; int rc; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); set_program_name (argv[0]); if (cmdline_parser (argc, argv, &args) != 0) { fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); exit (EXIT_FAILURE); } if (args.inputs_num > 0) infile = args.inputs[0]; if (args.inputs_num > 1) outfile = args.inputs[1]; if (args.inputs_num > 2) { error (0, 0, _("too many arguments")); fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); exit (EXIT_FAILURE); } if (args.help_given) { cmdline_parser_print_help (); printf (_("\nMandatory arguments to long options are " "mandatory for short options too.\n\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); return EXIT_SUCCESS; } sh = shishi (); if (!sh) error (EXIT_FAILURE, 0, _("cannot initialize libshishi")); if (args.verbose_given > 0) shishi_cfg (sh, "verbose"); if (args.verbose_given > 1) shishi_cfg (sh, "verbose-noise"); if (args.verbose_given > 2) shishi_cfg (sh, "verbose-asn1"); if (args.verbose_given > 3) shishi_cfg (sh, "verbose-crypto"); if (args.verbose_given > 4) shishi_cfg (sh, "verbose-crypto-noise"); if (args.reverse_flag) { Shishi_keys *keys; if (!infile) infile = HOSTKEYSFILE; if (!outfile) outfile = "/etc/krb5.keytab"; rc = shishi_keys (sh, &keys); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s", shishi_strerror (rc)); rc = shishi_keys_from_file (keys, infile); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s: %s", infile, shishi_strerror (rc)); if (args.verbose_given) shishi_keys_print (keys, stdout); rc = shishi_keys_to_keytab_file (sh, keys, outfile); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s:%s", outfile, shishi_strerror (rc)); if (!args.quiet_flag) { size_t nkeys = shishi_keys_size (keys); if (nkeys == 0) printf (_("No keys written.\n")); else printf (ngettext ("%d key written.\n", "%d keys written.\n", nkeys), nkeys); } shishi_keys_done (&keys); } else { Shishi_keys *keys; if (!infile) infile = "/etc/krb5.keytab"; if (!outfile) outfile = HOSTKEYSFILE; rc = shishi_keys_from_keytab_file (sh, infile, &keys); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s: %s", infile, shishi_strerror (rc)); if (args.verbose_given) shishi_keys_print (keys, stdout); rc = shishi_keys_to_file (sh, outfile, keys); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s:%s", outfile, shishi_strerror (rc)); if (!args.quiet_flag) { size_t nkeys = shishi_keys_size (keys); if (nkeys == 0) printf (_("No keys written.\n")); else printf (ngettext ("%d key written.\n", "%d keys written.\n", nkeys), nkeys); } shishi_keys_done (&keys); } shishi_done (sh); return EXIT_SUCCESS; } shishi-1.0.2/src/shisa_cmd.h0000644000000000000000000003272112126773076012602 00000000000000/** @file shisa_cmd.h * @brief The header file for the command line option parser * generated by GNU Gengetopt version 2.22.5 * http://www.gnu.org/software/gengetopt. * DO NOT modify this file, since it can be overwritten * @author GNU Gengetopt by Lorenzo Bettini */ #ifndef SHISA_CMD_H #define SHISA_CMD_H /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* for FILE */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE /** @brief the program name (used for printing errors) */ #define CMDLINE_PARSER_PACKAGE "shisa" #endif #ifndef CMDLINE_PARSER_PACKAGE_NAME /** @brief the complete program name (used for help and version) */ #define CMDLINE_PARSER_PACKAGE_NAME "shisa" #endif #ifndef CMDLINE_PARSER_VERSION /** @brief the program version */ #define CMDLINE_PARSER_VERSION VERSION #endif /** @brief Where the command line options are stored */ struct gengetopt_args_info { const char *help_help; /**< @brief Print help and exit help description. */ const char *version_help; /**< @brief Print version and exit help description. */ const char *add_help; /**< @brief Add realm or principal to database. help description. */ const char *dump_help; /**< @brief Dump entries in database. help description. */ const char *key_add_help; /**< @brief Add new key to a principal in database. help description. */ const char *key_remove_help; /**< @brief Remove a key from a principal in database. help description. */ const char *list_help; /**< @brief List entries in database. help description. */ const char *modify_help; /**< @brief Modify principal entry in database. help description. */ const char *remove_help; /**< @brief Remove realm or principal from database. help description. */ int force_flag; /**< @brief Allow removal of non-empty realms. (default=off). */ const char *force_help; /**< @brief Allow removal of non-empty realms. help description. */ int enabled_flag; /**< @brief Only dump or list enabled principals. (default=off). */ const char *enabled_help; /**< @brief Only dump or list enabled principals. help description. */ int disabled_flag; /**< @brief Only dump or list disabled principals. (default=off). */ const char *disabled_help; /**< @brief Only dump or list disabled principals. help description. */ int keys_flag; /**< @brief Print cryptographic key and password in hostkey format. (default=off). */ const char *keys_help; /**< @brief Print cryptographic key and password in hostkey format. help description. */ char * encryption_type_arg; /**< @brief Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'.. */ char * encryption_type_orig; /**< @brief Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. original value given at command line. */ const char *encryption_type_help; /**< @brief Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. help description. */ long key_version_arg; /**< @brief Version of key.. */ char * key_version_orig; /**< @brief Version of key. original value given at command line. */ const char *key_version_help; /**< @brief Version of key. help description. */ char * password_arg; /**< @brief Derive key from this password.. */ char * password_orig; /**< @brief Derive key from this password. original value given at command line. */ const char *password_help; /**< @brief Derive key from this password. help description. */ long priority_arg; /**< @brief Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. (default is 0, which mean a random key of the best etype is chosen). */ char * priority_orig; /**< @brief Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. (default is 0, which mean a random key of the best etype is chosen) original value given at command line. */ const char *priority_help; /**< @brief Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. (default is 0, which mean a random key of the best etype is chosen) help description. */ const char *random_help; /**< @brief Use a random key. (default) help description. */ char * salt_arg; /**< @brief Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name.. */ char * salt_orig; /**< @brief Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name. original value given at command line. */ const char *salt_help; /**< @brief Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name. help description. */ char * string_to_key_parameter_arg; /**< @brief Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver.. */ char * string_to_key_parameter_orig; /**< @brief Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver. original value given at command line. */ const char *string_to_key_parameter_help; /**< @brief Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver. help description. */ char * configuration_file_arg; /**< @brief Use specified configuration file.. */ char * configuration_file_orig; /**< @brief Use specified configuration file. original value given at command line. */ const char *configuration_file_help; /**< @brief Use specified configuration file. help description. */ char * library_options_arg; /**< @brief Parse string as configuration file statement.. */ char * library_options_orig; /**< @brief Parse string as configuration file statement. original value given at command line. */ const char *library_options_help; /**< @brief Parse string as configuration file statement. help description. */ int verbose_flag; /**< @brief Produce verbose output. (default=off). */ const char *verbose_help; /**< @brief Produce verbose output. help description. */ int quiet_flag; /**< @brief Don't produce any diagnostic output. (default=off). */ const char *quiet_help; /**< @brief Don't produce any diagnostic output. help description. */ unsigned int help_given ; /**< @brief Whether help was given. */ unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int add_given ; /**< @brief Whether add was given. */ unsigned int dump_given ; /**< @brief Whether dump was given. */ unsigned int key_add_given ; /**< @brief Whether key-add was given. */ unsigned int key_remove_given ; /**< @brief Whether key-remove was given. */ unsigned int list_given ; /**< @brief Whether list was given. */ unsigned int modify_given ; /**< @brief Whether modify was given. */ unsigned int remove_given ; /**< @brief Whether remove was given. */ unsigned int force_given ; /**< @brief Whether force was given. */ unsigned int enabled_given ; /**< @brief Whether enabled was given. */ unsigned int disabled_given ; /**< @brief Whether disabled was given. */ unsigned int keys_given ; /**< @brief Whether keys was given. */ unsigned int encryption_type_given ; /**< @brief Whether encryption-type was given. */ unsigned int key_version_given ; /**< @brief Whether key-version was given. */ unsigned int password_given ; /**< @brief Whether password was given. */ unsigned int priority_given ; /**< @brief Whether priority was given. */ unsigned int random_given ; /**< @brief Whether random was given. */ unsigned int salt_given ; /**< @brief Whether salt was given. */ unsigned int string_to_key_parameter_given ; /**< @brief Whether string-to-key-parameter was given. */ unsigned int configuration_file_given ; /**< @brief Whether configuration-file was given. */ unsigned int library_options_given ; /**< @brief Whether library-options was given. */ unsigned int verbose_given ; /**< @brief Whether verbose was given. */ unsigned int quiet_given ; /**< @brief Whether quiet was given. */ char **inputs ; /**< @brief unamed options (options without names) */ unsigned inputs_num ; /**< @brief unamed options number */ } ; /** @brief The additional parameters to pass to parser functions */ struct cmdline_parser_params { int override; /**< @brief whether to override possibly already present options (default 0) */ int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ int check_required; /**< @brief whether to check that all required options were provided (default 1) */ int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; /** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; /** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; /** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; /** * The command line parser * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info); /** * The command line parser (version with additional parameters - deprecated) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param override whether to override possibly already present options * @param initialize whether to initialize the option structure my_args_info * @param check_required whether to check that all required options were provided * @return 0 if everything went fine, NON 0 if an error took place * @deprecated use cmdline_parser_ext() instead */ int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); /** * The command line parser (version with additional parameters) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param params additional parameters for the parser * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params); /** * Save the contents of the option struct into an already open FILE stream. * @param outfile the stream where to dump options * @param args_info the option struct to dump * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info); /** * Save the contents of the option struct into a (text) file. * This file can be read by the config file parser (if generated by gengetopt) * @param filename the file where to save * @param args_info the option struct to save * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); /** * Print the help */ void cmdline_parser_print_help(void); /** * Print the version */ void cmdline_parser_print_version(void); /** * Initializes all the fields a cmdline_parser_params structure * to their default values * @param params the structure to initialize */ void cmdline_parser_params_init(struct cmdline_parser_params *params); /** * Allocates dynamically a cmdline_parser_params structure and initializes * all its fields to their default values * @return the created and initialized cmdline_parser_params structure */ struct cmdline_parser_params *cmdline_parser_params_create(void); /** * Initializes the passed gengetopt_args_info structure's fields * (also set default values for options that have a default) * @param args_info the structure to initialize */ void cmdline_parser_init (struct gengetopt_args_info *args_info); /** * Deallocates the string fields of the gengetopt_args_info structure * (but does not deallocate the structure itself) * @param args_info the structure to deallocate */ void cmdline_parser_free (struct gengetopt_args_info *args_info); /** * Checks that all the required options were specified * @param args_info the structure to check * @param prog_name the name of the program that will be used to print * possible errors * @return */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* SHISA_CMD_H */ shishi-1.0.2/src/shishid.ggo0000664000000000000000000000437112126660507012624 00000000000000## Process this file with gengetopt to produce shishid_cmd.* # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. package "shishid" purpose "Shishi Key Distribution Center server." section "Commands" option "listen" l "Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'." string typestr="[FAMILY:]ADDR:PORT/TYPE" no option "setuid" u "After binding socket, set user identity." string typestr="NAME" no section "TLS settings" option "no-tls" - "Disable TLS support" flag off option "x509cafile" - "X.509 certificate authorities used to verify client certificates, in PEM format." string typestr="FILE" no option "x509certfile" - "X.509 server certificate, in PEM format." string typestr="FILE" no option "x509crlfile" - "X.509 certificate revocation list to check for revoked client certificates, in PEM format." string typestr="FILE" no option "x509keyfile" - "X.509 server certificate key, in PEM format." string typestr="FILE" no option "resume-limit" - "Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume)." short default="50" no section "Other options" option "configuration-file" c "Use specified configuration file." string typestr="FILE" no option "verbose" v "Produce verbose output.\nUse multiple times to increase amount of information." no multiple option "quiet" q "Don't produce any diagnostic output.\n" flag off shishi-1.0.2/src/keytab2shishi.ggo0000664000000000000000000000251112126660507013734 00000000000000## Process this file with gengetopt to produce keytab2shishi_cmd.* # Copyright (C) 2006-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. package "keytab2shishi" purpose "Read keytab data from INFILE (usually /etc/krb5.keytab) and write Shishi hostkeys to OUTFILE. If INFILE and OUTFILE are not specified, use the defaults." option "reverse" R "Reverse action, read Shishi hostkeys from INFILE and write keytab data to OUTFILE." flag off option "verbose" v "Produce verbose output.\nUse multiple times to increase amount of information." no multiple option "quiet" q "Don't produce any diagnostic output.\n" flag off shishi-1.0.2/src/ccache2shishi.ggo0000664000000000000000000000232512126660507013666 00000000000000## Process this file with gengetopt to produce ccache2shishi_cmd.* # Copyright (C) 2006-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. package "ccache2shishi" purpose "Read ccache data from INFILE (usually /tmp/krb5cc_UID) and write Shishi tickets to OUTFILE. If INFILE and OUTFILE are not specified, use the defaults." option "verbose" v "Produce verbose output.\nUse multiple times to increase amount of information." no multiple option "quiet" q "Don't produce any diagnostic output.\n" flag off shishi-1.0.2/src/ccache2shishi.c0000664000000000000000000000713012126660507013333 00000000000000/* ccache2shishi.c --- Print and convert MIT ccache files. * Copyright (C) 2006-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include /* For getuid. */ #include #include /* Get i18n. */ #include #include #define _(String) gettext (String) #include /* Get set_program_name and program_name. */ #include "progname.h" /* Get error. */ #include "error.h" #include "ccache2shishi_cmd.h" int main (int argc, char *argv[]) { struct gengetopt_args_info args; Shishi *sh; const char *infile = NULL; const char *outfile = NULL; int rc; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); set_program_name (argv[0]); if (cmdline_parser (argc, argv, &args) != 0) { fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); exit (EXIT_FAILURE); } if (args.inputs_num > 0) infile = args.inputs[0]; if (args.inputs_num > 1) outfile = args.inputs[1]; if (args.inputs_num > 2) { error (0, 0, _("too many arguments")); fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); exit (EXIT_FAILURE); } if (args.help_given) { cmdline_parser_print_help (); printf (_("\nMandatory arguments to long options are " "mandatory for short options too.\n\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); return EXIT_SUCCESS; } sh = shishi (); if (!sh) error (EXIT_FAILURE, 0, _("cannot initialize libshishi")); if (args.verbose_given > 0) shishi_cfg (sh, "verbose"); if (args.verbose_given > 1) shishi_cfg (sh, "verbose-noise"); if (args.verbose_given > 2) shishi_cfg (sh, "verbose-asn1"); if (args.verbose_given > 3) shishi_cfg (sh, "verbose-crypto"); if (args.verbose_given > 4) shishi_cfg (sh, "verbose-crypto-noise"); if (!infile) infile = shishi_tkts_default_ccache (sh); if (!outfile) outfile = shishi_tkts_default_file (sh); { Shishi_tkts *tkts; rc = shishi_tkts_from_ccache_file (sh, infile, &tkts); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s: %s", infile, shishi_strerror (rc)); if (args.verbose_given) shishi_tkts_print (tkts, stdout); rc = shishi_tkts_to_file (tkts, outfile); if (rc != SHISHI_OK) error (EXIT_FAILURE, errno, "%s:%s", outfile, shishi_strerror (rc)); if (!args.quiet_flag) { size_t ntkts = shishi_tkts_size (tkts); if (ntkts == 0) printf (_("No tickets written.\n")); else printf (ngettext ("%d ticket written.\n", "%d tickets written.\n", ntkts), ntkts); } shishi_tkts_done (&tkts); } shishi_done (sh); return EXIT_SUCCESS; } shishi-1.0.2/src/shishi_cmd.h0000644000000000000000000004062612126773076012765 00000000000000/** @file shishi_cmd.h * @brief The header file for the command line option parser * generated by GNU Gengetopt version 2.22.5 * http://www.gnu.org/software/gengetopt. * DO NOT modify this file, since it can be overwritten * @author GNU Gengetopt by Lorenzo Bettini */ #ifndef SHISHI_CMD_H #define SHISHI_CMD_H /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* for FILE */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE /** @brief the program name (used for printing errors) */ #define CMDLINE_PARSER_PACKAGE "shishi" #endif #ifndef CMDLINE_PARSER_PACKAGE_NAME /** @brief the complete program name (used for help and version) */ #define CMDLINE_PARSER_PACKAGE_NAME "shishi" #endif #ifndef CMDLINE_PARSER_VERSION /** @brief the program version */ #define CMDLINE_PARSER_VERSION VERSION #endif /** @brief Where the command line options are stored */ struct gengetopt_args_info { const char *help_help; /**< @brief Print help and exit help description. */ const char *version_help; /**< @brief Print version and exit help description. */ int destroy_flag; /**< @brief Destroy tickets in local cache, limited by any --client-name or --server-name. (default=off). */ const char *destroy_help; /**< @brief Destroy tickets in local cache, limited by any --client-name or --server-name. help description. */ int list_flag; /**< @brief List tickets in local cache, limited by any --client-name and --server-name. (default=off). */ const char *list_help; /**< @brief List tickets in local cache, limited by any --client-name and --server-name. help description. */ int renew_flag; /**< @brief Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm. (default=off). */ const char *renew_help; /**< @brief Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm. help description. */ int forwardable_flag; /**< @brief Get a forwardable ticket, i.e., one that can be used to get forwarded tickets. (default=off). */ const char *forwardable_help; /**< @brief Get a forwardable ticket, i.e., one that can be used to get forwarded tickets. help description. */ int forwarded_flag; /**< @brief Get a forwarded ticket. (default=off). */ const char *forwarded_help; /**< @brief Get a forwarded ticket. help description. */ int proxiable_flag; /**< @brief Get a proxiable ticket, i.e., one that can be used to get proxy tickets. (default=off). */ const char *proxiable_help; /**< @brief Get a proxiable ticket, i.e., one that can be used to get proxy tickets. help description. */ int proxy_flag; /**< @brief Get a proxy ticket. (default=off). */ const char *proxy_help; /**< @brief Get a proxy ticket. help description. */ int renewable_flag; /**< @brief Get a renewable ticket. (default=off). */ const char *renewable_help; /**< @brief Get a renewable ticket. help description. */ char * client_name_arg; /**< @brief Client name. Default is login username.. */ char * client_name_orig; /**< @brief Client name. Default is login username. original value given at command line. */ const char *client_name_help; /**< @brief Client name. Default is login username. help description. */ char * encryption_type_arg; /**< @brief Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'.. */ char * encryption_type_orig; /**< @brief Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. original value given at command line. */ const char *encryption_type_help; /**< @brief Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'. help description. */ char * endtime_arg; /**< @brief Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time.. */ char * endtime_orig; /**< @brief Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time. original value given at command line. */ const char *endtime_help; /**< @brief Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time. help description. */ char * realm_arg; /**< @brief Set default realm.. */ char * realm_orig; /**< @brief Set default realm. original value given at command line. */ const char *realm_help; /**< @brief Set default realm. help description. */ char * renew_till_arg; /**< @brief Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time.. */ char * renew_till_orig; /**< @brief Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time. original value given at command line. */ const char *renew_till_help; /**< @brief Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time. help description. */ char * server_name_arg; /**< @brief Server name. Default is 'krbtgt/REALM' where REALM is client realm.. */ char * server_name_orig; /**< @brief Server name. Default is 'krbtgt/REALM' where REALM is client realm. original value given at command line. */ const char *server_name_help; /**< @brief Server name. Default is 'krbtgt/REALM' where REALM is client realm. help description. */ char * starttime_arg; /**< @brief Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately.. */ char * starttime_orig; /**< @brief Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately. original value given at command line. */ const char *starttime_help; /**< @brief Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately. help description. */ char * ticket_granter_arg; /**< @brief Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm.. */ char * ticket_granter_orig; /**< @brief Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm. original value given at command line. */ const char *ticket_granter_help; /**< @brief Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm. help description. */ char * configuration_file_arg; /**< @brief Read user configuration from FILE.. */ char * configuration_file_orig; /**< @brief Read user configuration from FILE. original value given at command line. */ const char *configuration_file_help; /**< @brief Read user configuration from FILE. help description. */ char * ticket_file_arg; /**< @brief Read tickets from FILE.. */ char * ticket_file_orig; /**< @brief Read tickets from FILE. original value given at command line. */ const char *ticket_file_help; /**< @brief Read tickets from FILE. help description. */ char * library_options_arg; /**< @brief Parse STRING as a configuration file statement.. */ char * library_options_orig; /**< @brief Parse STRING as a configuration file statement. original value given at command line. */ const char *library_options_help; /**< @brief Parse STRING as a configuration file statement. help description. */ int quiet_flag; /**< @brief Don't produce any diagnostic output. (default=off). */ const char *quiet_help; /**< @brief Don't produce any diagnostic output. help description. */ char * system_configuration_file_arg; /**< @brief Read system configuration from FILE.. */ char * system_configuration_file_orig; /**< @brief Read system configuration from FILE. original value given at command line. */ const char *system_configuration_file_help; /**< @brief Read system configuration from FILE. help description. */ char * ticket_write_file_arg; /**< @brief Write tickets from FILE. Default is to write them back to where they were read from.. */ char * ticket_write_file_orig; /**< @brief Write tickets from FILE. Default is to write them back to where they were read from. original value given at command line. */ const char *ticket_write_file_help; /**< @brief Write tickets from FILE. Default is to write them back to where they were read from. help description. */ unsigned int verbose_min; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s minimum occurreces */ unsigned int verbose_max; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s maximum occurreces */ const char *verbose_help; /**< @brief Produce verbose output. Use multiple times to increase amount of information. help description. */ unsigned int help_given ; /**< @brief Whether help was given. */ unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int destroy_given ; /**< @brief Whether destroy was given. */ unsigned int list_given ; /**< @brief Whether list was given. */ unsigned int renew_given ; /**< @brief Whether renew was given. */ unsigned int forwardable_given ; /**< @brief Whether forwardable was given. */ unsigned int forwarded_given ; /**< @brief Whether forwarded was given. */ unsigned int proxiable_given ; /**< @brief Whether proxiable was given. */ unsigned int proxy_given ; /**< @brief Whether proxy was given. */ unsigned int renewable_given ; /**< @brief Whether renewable was given. */ unsigned int client_name_given ; /**< @brief Whether client-name was given. */ unsigned int encryption_type_given ; /**< @brief Whether encryption-type was given. */ unsigned int endtime_given ; /**< @brief Whether endtime was given. */ unsigned int realm_given ; /**< @brief Whether realm was given. */ unsigned int renew_till_given ; /**< @brief Whether renew-till was given. */ unsigned int server_name_given ; /**< @brief Whether server-name was given. */ unsigned int starttime_given ; /**< @brief Whether starttime was given. */ unsigned int ticket_granter_given ; /**< @brief Whether ticket-granter was given. */ unsigned int configuration_file_given ; /**< @brief Whether configuration-file was given. */ unsigned int ticket_file_given ; /**< @brief Whether ticket-file was given. */ unsigned int library_options_given ; /**< @brief Whether library-options was given. */ unsigned int quiet_given ; /**< @brief Whether quiet was given. */ unsigned int system_configuration_file_given ; /**< @brief Whether system-configuration-file was given. */ unsigned int ticket_write_file_given ; /**< @brief Whether ticket-write-file was given. */ unsigned int verbose_given ; /**< @brief Whether verbose was given. */ char **inputs ; /**< @brief unamed options (options without names) */ unsigned inputs_num ; /**< @brief unamed options number */ } ; /** @brief The additional parameters to pass to parser functions */ struct cmdline_parser_params { int override; /**< @brief whether to override possibly already present options (default 0) */ int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ int check_required; /**< @brief whether to check that all required options were provided (default 1) */ int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; /** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; /** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; /** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; /** * The command line parser * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info); /** * The command line parser (version with additional parameters - deprecated) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param override whether to override possibly already present options * @param initialize whether to initialize the option structure my_args_info * @param check_required whether to check that all required options were provided * @return 0 if everything went fine, NON 0 if an error took place * @deprecated use cmdline_parser_ext() instead */ int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); /** * The command line parser (version with additional parameters) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param params additional parameters for the parser * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params); /** * Save the contents of the option struct into an already open FILE stream. * @param outfile the stream where to dump options * @param args_info the option struct to dump * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info); /** * Save the contents of the option struct into a (text) file. * This file can be read by the config file parser (if generated by gengetopt) * @param filename the file where to save * @param args_info the option struct to save * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); /** * Print the help */ void cmdline_parser_print_help(void); /** * Print the version */ void cmdline_parser_print_version(void); /** * Initializes all the fields a cmdline_parser_params structure * to their default values * @param params the structure to initialize */ void cmdline_parser_params_init(struct cmdline_parser_params *params); /** * Allocates dynamically a cmdline_parser_params structure and initializes * all its fields to their default values * @return the created and initialized cmdline_parser_params structure */ struct cmdline_parser_params *cmdline_parser_params_create(void); /** * Initializes the passed gengetopt_args_info structure's fields * (also set default values for options that have a default) * @param args_info the structure to initialize */ void cmdline_parser_init (struct gengetopt_args_info *args_info); /** * Deallocates the string fields of the gengetopt_args_info structure * (but does not deallocate the structure itself) * @param args_info the structure to deallocate */ void cmdline_parser_free (struct gengetopt_args_info *args_info); /** * Checks that all the required options were specified * @param args_info the structure to check * @param prog_name the name of the program that will be used to print * possible errors * @return */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* SHISHI_CMD_H */ shishi-1.0.2/src/shisa_cmd.c0000644000000000000000000010130012126773076012563 00000000000000/* File autogenerated by gengetopt version 2.22.5 generated with the following command: gengetopt --unamed-opts=REALM [PRINCIPAL] --no-handle-help --no-handle-error --no-handle-version --input ./shisa.ggo --file-name shisa_cmd The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: we make no copyright claims on it. */ /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif #include #include "shisa_cmd.h" const char *gengetopt_args_info_purpose = "Manipulate information stored in the Shisa user database."; const char *gengetopt_args_info_usage = "Usage: shisa [OPTIONS]... [REALM [PRINCIPAL]]..."; const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_help[] = { " -h, --help Print help and exit", " -V, --version Print version and exit", "\nOperations:", " -a, --add Add realm or principal to database.", " -d, --dump Dump entries in database.", " -n, --key-add Add new key to a principal in database.", " --key-remove Remove a key from a principal in database.", " -l, --list List entries in database.", " -m, --modify Modify principal entry in database.", " -r, --remove Remove realm or principal from database.", "\nParameters:", " -f, --force Allow removal of non-empty realms.\n (default=off)", " --enabled Only dump or list enabled principals.\n (default=off)", " --disabled Only dump or list disabled principals.\n (default=off)", " --keys Print cryptographic key and password in hostkey \n format. (default=off)", "\nValues:", " -E, --encryption-type=STRING Override default key encryption type. Valid \n values include 'aes128', 'aes256', 'aes' \n (same as 'aes256'), '3des', 'des-md5', \n 'des-md4', 'des-crc', 'des' (same as \n 'des-md5'), and 'arcfour'.", " --key-version=NUMBER Version of key.", " --password[=STRING] Derive key from this password.", " --priority=NUMBER Specify key priority, used to differentiate \n between keys when multiple keys are eligible \n for use. Higher value means higher priority. \n (default is 0, which mean a random key of \n the best etype is chosen)", " --random Use a random key. (default)", " --salt=STRING Use specified salt for deriving key. Defaults \n to concatenation of realm and (unwrapped) \n principal name.", " --string-to-key-parameter=HEX\n Encryption algorithm specific parameter for \n password derivation. Currently only the AES \n algorithm can utilize this, where it is \n interpreted as the iteration count of the \n PKCS#5 PBKDF2 key deriver.", "\nOther options:", " -c, --configuration-file=FILE Use specified configuration file.", " -o, --library-options=STRING Parse string as configuration file statement.", " -v, --verbose Produce verbose output.\n (default=off)", " -q, --quiet Don't produce any diagnostic output.\n (default=off)", 0 }; typedef enum {ARG_NO , ARG_FLAG , ARG_STRING , ARG_LONG } cmdline_parser_arg_type; static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error); static char * gengetopt_strdup (const char *s); static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->add_given = 0 ; args_info->dump_given = 0 ; args_info->key_add_given = 0 ; args_info->key_remove_given = 0 ; args_info->list_given = 0 ; args_info->modify_given = 0 ; args_info->remove_given = 0 ; args_info->force_given = 0 ; args_info->enabled_given = 0 ; args_info->disabled_given = 0 ; args_info->keys_given = 0 ; args_info->encryption_type_given = 0 ; args_info->key_version_given = 0 ; args_info->password_given = 0 ; args_info->priority_given = 0 ; args_info->random_given = 0 ; args_info->salt_given = 0 ; args_info->string_to_key_parameter_given = 0 ; args_info->configuration_file_given = 0 ; args_info->library_options_given = 0 ; args_info->verbose_given = 0 ; args_info->quiet_given = 0 ; } static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->force_flag = 0; args_info->enabled_flag = 0; args_info->disabled_flag = 0; args_info->keys_flag = 0; args_info->encryption_type_arg = NULL; args_info->encryption_type_orig = NULL; args_info->key_version_orig = NULL; args_info->password_arg = NULL; args_info->password_orig = NULL; args_info->priority_orig = NULL; args_info->salt_arg = NULL; args_info->salt_orig = NULL; args_info->string_to_key_parameter_arg = NULL; args_info->string_to_key_parameter_orig = NULL; args_info->configuration_file_arg = NULL; args_info->configuration_file_orig = NULL; args_info->library_options_arg = NULL; args_info->library_options_orig = NULL; args_info->verbose_flag = 0; args_info->quiet_flag = 0; } static void init_args_info(struct gengetopt_args_info *args_info) { args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->add_help = gengetopt_args_info_help[3] ; args_info->dump_help = gengetopt_args_info_help[4] ; args_info->key_add_help = gengetopt_args_info_help[5] ; args_info->key_remove_help = gengetopt_args_info_help[6] ; args_info->list_help = gengetopt_args_info_help[7] ; args_info->modify_help = gengetopt_args_info_help[8] ; args_info->remove_help = gengetopt_args_info_help[9] ; args_info->force_help = gengetopt_args_info_help[11] ; args_info->enabled_help = gengetopt_args_info_help[12] ; args_info->disabled_help = gengetopt_args_info_help[13] ; args_info->keys_help = gengetopt_args_info_help[14] ; args_info->encryption_type_help = gengetopt_args_info_help[16] ; args_info->key_version_help = gengetopt_args_info_help[17] ; args_info->password_help = gengetopt_args_info_help[18] ; args_info->priority_help = gengetopt_args_info_help[19] ; args_info->random_help = gengetopt_args_info_help[20] ; args_info->salt_help = gengetopt_args_info_help[21] ; args_info->string_to_key_parameter_help = gengetopt_args_info_help[22] ; args_info->configuration_file_help = gengetopt_args_info_help[24] ; args_info->library_options_help = gengetopt_args_info_help[25] ; args_info->verbose_help = gengetopt_args_info_help[26] ; args_info->quiet_help = gengetopt_args_info_help[27] ; } void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); } static void print_help_common(void) { cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); if (strlen(gengetopt_args_info_usage) > 0) printf("\n%s\n", gengetopt_args_info_usage); printf("\n"); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\n", gengetopt_args_info_description); } void cmdline_parser_print_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } void cmdline_parser_init (struct gengetopt_args_info *args_info) { clear_given (args_info); clear_args (args_info); init_args_info (args_info); args_info->inputs = 0; args_info->inputs_num = 0; } void cmdline_parser_params_init(struct cmdline_parser_params *params) { if (params) { params->override = 0; params->initialize = 1; params->check_required = 1; params->check_ambiguity = 0; params->print_errors = 1; } } struct cmdline_parser_params * cmdline_parser_params_create(void) { struct cmdline_parser_params *params = (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); cmdline_parser_params_init(params); return params; } static void free_string_field (char **s) { if (*s) { free (*s); *s = 0; } } static void cmdline_parser_release (struct gengetopt_args_info *args_info) { unsigned int i; free_string_field (&(args_info->encryption_type_arg)); free_string_field (&(args_info->encryption_type_orig)); free_string_field (&(args_info->key_version_orig)); free_string_field (&(args_info->password_arg)); free_string_field (&(args_info->password_orig)); free_string_field (&(args_info->priority_orig)); free_string_field (&(args_info->salt_arg)); free_string_field (&(args_info->salt_orig)); free_string_field (&(args_info->string_to_key_parameter_arg)); free_string_field (&(args_info->string_to_key_parameter_orig)); free_string_field (&(args_info->configuration_file_arg)); free_string_field (&(args_info->configuration_file_orig)); free_string_field (&(args_info->library_options_arg)); free_string_field (&(args_info->library_options_orig)); for (i = 0; i < args_info->inputs_num; ++i) free (args_info->inputs [i]); if (args_info->inputs_num) free (args_info->inputs); clear_given (args_info); } static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { FIX_UNUSED (values); if (arg) { fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } } int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0; if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; } if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); if (args_info->add_given) write_into_file(outfile, "add", 0, 0 ); if (args_info->dump_given) write_into_file(outfile, "dump", 0, 0 ); if (args_info->key_add_given) write_into_file(outfile, "key-add", 0, 0 ); if (args_info->key_remove_given) write_into_file(outfile, "key-remove", 0, 0 ); if (args_info->list_given) write_into_file(outfile, "list", 0, 0 ); if (args_info->modify_given) write_into_file(outfile, "modify", 0, 0 ); if (args_info->remove_given) write_into_file(outfile, "remove", 0, 0 ); if (args_info->force_given) write_into_file(outfile, "force", 0, 0 ); if (args_info->enabled_given) write_into_file(outfile, "enabled", 0, 0 ); if (args_info->disabled_given) write_into_file(outfile, "disabled", 0, 0 ); if (args_info->keys_given) write_into_file(outfile, "keys", 0, 0 ); if (args_info->encryption_type_given) write_into_file(outfile, "encryption-type", args_info->encryption_type_orig, 0); if (args_info->key_version_given) write_into_file(outfile, "key-version", args_info->key_version_orig, 0); if (args_info->password_given) write_into_file(outfile, "password", args_info->password_orig, 0); if (args_info->priority_given) write_into_file(outfile, "priority", args_info->priority_orig, 0); if (args_info->random_given) write_into_file(outfile, "random", 0, 0 ); if (args_info->salt_given) write_into_file(outfile, "salt", args_info->salt_orig, 0); if (args_info->string_to_key_parameter_given) write_into_file(outfile, "string-to-key-parameter", args_info->string_to_key_parameter_orig, 0); if (args_info->configuration_file_given) write_into_file(outfile, "configuration-file", args_info->configuration_file_orig, 0); if (args_info->library_options_given) write_into_file(outfile, "library-options", args_info->library_options_orig, 0); if (args_info->verbose_given) write_into_file(outfile, "verbose", 0, 0 ); if (args_info->quiet_given) write_into_file(outfile, "quiet", 0, 0 ); i = EXIT_SUCCESS; return i; } int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) { FILE *outfile; int i = 0; outfile = fopen(filename, "w"); if (!outfile) { fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); return EXIT_FAILURE; } i = cmdline_parser_dump(outfile, args_info); fclose (outfile); return i; } void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); } /** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result; result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; } int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) { return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params) { int result; result = cmdline_parser_internal (argc, argv, args_info, params, 0); return result; } int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; struct cmdline_parser_params params; params.override = override; params.initialize = initialize; params.check_required = check_required; params.check_ambiguity = 0; params.print_errors = 1; result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); return result; } int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) { FIX_UNUSED (args_info); FIX_UNUSED (prog_name); return EXIT_SUCCESS; } static char *package_name = 0; /** * @brief updates an option * @param field the generic pointer to the field to update * @param orig_field the pointer to the orig field * @param field_given the pointer to the number of occurrence of this option * @param prev_given the pointer to the number of occurrence already seen * @param value the argument for this option (if null no arg was specified) * @param possible_values the possible values for this option (if specified) * @param default_value the default value (in case the option only accepts fixed values) * @param arg_type the type of this option * @param check_ambiguity @see cmdline_parser_params.check_ambiguity * @param override @see cmdline_parser_params.override * @param no_free whether to free a possible previous value * @param multiple_option whether this is a multiple option * @param long_opt the corresponding long option * @param short_opt the corresponding short option (or '-' if none) * @param additional_error possible further error specification */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, int check_ambiguity, int override, int no_free, int multiple_option, const char *long_opt, char short_opt, const char *additional_error) { char *stop_char = 0; const char *val = value; int found; char **string_field; FIX_UNUSED (field); stop_char = 0; found = 0; if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) { if (short_opt != '-') fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", package_name, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: `--%s' option given more than once%s\n", package_name, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } FIX_UNUSED (default_value); if (field_given && *field_given && ! override) return 0; if (prev_given) (*prev_given)++; if (field_given) (*field_given)++; if (possible_values) val = possible_values[found]; switch(arg_type) { case ARG_FLAG: *((int *)field) = !*((int *)field); break; case ARG_LONG: if (val) *((long *)field) = (long)strtol (val, &stop_char, 0); break; case ARG_STRING: if (val) { string_field = (char **)field; if (!no_free && *string_field) free (*string_field); /* free previous string */ *string_field = gengetopt_strdup (val); } break; default: break; }; /* check numeric conversion */ switch(arg_type) { case ARG_LONG: if (val && !(stop_char && *stop_char == '\0')) { fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val); return 1; /* failure */ } break; default: ; }; /* store the original value */ switch(arg_type) { case ARG_NO: case ARG_FLAG: break; default: if (value && orig_field) { if (no_free) { *orig_field = value; } else { if (*orig_field) free (*orig_field); /* free previous string */ *orig_field = gengetopt_strdup (value); } } }; return 0; /* OK */ } int cmdline_parser_internal ( int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; int override; int initialize; int check_required; int check_ambiguity; package_name = argv[0]; override = params->override; initialize = params->initialize; check_required = params->check_required; check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); cmdline_parser_init (&local_args_info); optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?'; while (1) { int option_index = 0; static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, { "add", 0, NULL, 'a' }, { "dump", 0, NULL, 'd' }, { "key-add", 0, NULL, 'n' }, { "key-remove", 0, NULL, 0 }, { "list", 0, NULL, 'l' }, { "modify", 0, NULL, 'm' }, { "remove", 0, NULL, 'r' }, { "force", 0, NULL, 'f' }, { "enabled", 0, NULL, 0 }, { "disabled", 0, NULL, 0 }, { "keys", 0, NULL, 0 }, { "encryption-type", 1, NULL, 'E' }, { "key-version", 1, NULL, 0 }, { "password", 2, NULL, 0 }, { "priority", 1, NULL, 0 }, { "random", 0, NULL, 0 }, { "salt", 1, NULL, 0 }, { "string-to-key-parameter", 1, NULL, 0 }, { "configuration-file", 1, NULL, 'c' }, { "library-options", 1, NULL, 'o' }, { "verbose", 0, NULL, 'v' }, { "quiet", 0, NULL, 'q' }, { 0, 0, 0, 0 } }; c = getopt_long (argc, argv, "hVadnlmrfE:c:o:vq", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ switch (c) { case 'h': /* Print help and exit. */ if (update_arg( 0 , 0 , &(args_info->help_given), &(local_args_info.help_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "help", 'h', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'V': /* Print version and exit. */ if (update_arg( 0 , 0 , &(args_info->version_given), &(local_args_info.version_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "version", 'V', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'a': /* Add realm or principal to database.. */ if (update_arg( 0 , 0 , &(args_info->add_given), &(local_args_info.add_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "add", 'a', additional_error)) goto failure; break; case 'd': /* Dump entries in database.. */ if (update_arg( 0 , 0 , &(args_info->dump_given), &(local_args_info.dump_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "dump", 'd', additional_error)) goto failure; break; case 'n': /* Add new key to a principal in database.. */ if (update_arg( 0 , 0 , &(args_info->key_add_given), &(local_args_info.key_add_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "key-add", 'n', additional_error)) goto failure; break; case 'l': /* List entries in database.. */ if (update_arg( 0 , 0 , &(args_info->list_given), &(local_args_info.list_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "list", 'l', additional_error)) goto failure; break; case 'm': /* Modify principal entry in database.. */ if (update_arg( 0 , 0 , &(args_info->modify_given), &(local_args_info.modify_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "modify", 'm', additional_error)) goto failure; break; case 'r': /* Remove realm or principal from database.. */ if (update_arg( 0 , 0 , &(args_info->remove_given), &(local_args_info.remove_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "remove", 'r', additional_error)) goto failure; break; case 'f': /* Allow removal of non-empty realms. . */ if (update_arg((void *)&(args_info->force_flag), 0, &(args_info->force_given), &(local_args_info.force_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "force", 'f', additional_error)) goto failure; break; case 'E': /* Override default key encryption type. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'.. */ if (update_arg( (void *)&(args_info->encryption_type_arg), &(args_info->encryption_type_orig), &(args_info->encryption_type_given), &(local_args_info.encryption_type_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "encryption-type", 'E', additional_error)) goto failure; break; case 'c': /* Use specified configuration file.. */ if (update_arg( (void *)&(args_info->configuration_file_arg), &(args_info->configuration_file_orig), &(args_info->configuration_file_given), &(local_args_info.configuration_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "configuration-file", 'c', additional_error)) goto failure; break; case 'o': /* Parse string as configuration file statement.. */ if (update_arg( (void *)&(args_info->library_options_arg), &(args_info->library_options_orig), &(args_info->library_options_given), &(local_args_info.library_options_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "library-options", 'o', additional_error)) goto failure; break; case 'v': /* Produce verbose output. . */ if (update_arg((void *)&(args_info->verbose_flag), 0, &(args_info->verbose_given), &(local_args_info.verbose_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "verbose", 'v', additional_error)) goto failure; break; case 'q': /* Don't produce any diagnostic output. . */ if (update_arg((void *)&(args_info->quiet_flag), 0, &(args_info->quiet_given), &(local_args_info.quiet_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "quiet", 'q', additional_error)) goto failure; break; case 0: /* Long option with no short option */ /* Remove a key from a principal in database.. */ if (strcmp (long_options[option_index].name, "key-remove") == 0) { if (update_arg( 0 , 0 , &(args_info->key_remove_given), &(local_args_info.key_remove_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "key-remove", '-', additional_error)) goto failure; } /* Only dump or list enabled principals. . */ else if (strcmp (long_options[option_index].name, "enabled") == 0) { if (update_arg((void *)&(args_info->enabled_flag), 0, &(args_info->enabled_given), &(local_args_info.enabled_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "enabled", '-', additional_error)) goto failure; } /* Only dump or list disabled principals. . */ else if (strcmp (long_options[option_index].name, "disabled") == 0) { if (update_arg((void *)&(args_info->disabled_flag), 0, &(args_info->disabled_given), &(local_args_info.disabled_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "disabled", '-', additional_error)) goto failure; } /* Print cryptographic key and password in hostkey format.. */ else if (strcmp (long_options[option_index].name, "keys") == 0) { if (update_arg((void *)&(args_info->keys_flag), 0, &(args_info->keys_given), &(local_args_info.keys_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "keys", '-', additional_error)) goto failure; } /* Version of key.. */ else if (strcmp (long_options[option_index].name, "key-version") == 0) { if (update_arg( (void *)&(args_info->key_version_arg), &(args_info->key_version_orig), &(args_info->key_version_given), &(local_args_info.key_version_given), optarg, 0, 0, ARG_LONG, check_ambiguity, override, 0, 0, "key-version", '-', additional_error)) goto failure; } /* Derive key from this password.. */ else if (strcmp (long_options[option_index].name, "password") == 0) { if (update_arg( (void *)&(args_info->password_arg), &(args_info->password_orig), &(args_info->password_given), &(local_args_info.password_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "password", '-', additional_error)) goto failure; } /* Specify key priority, used to differentiate between keys when multiple keys are eligible for use. Higher value means higher priority. (default is 0, which mean a random key of the best etype is chosen). */ else if (strcmp (long_options[option_index].name, "priority") == 0) { if (update_arg( (void *)&(args_info->priority_arg), &(args_info->priority_orig), &(args_info->priority_given), &(local_args_info.priority_given), optarg, 0, 0, ARG_LONG, check_ambiguity, override, 0, 0, "priority", '-', additional_error)) goto failure; } /* Use a random key. (default). */ else if (strcmp (long_options[option_index].name, "random") == 0) { if (update_arg( 0 , 0 , &(args_info->random_given), &(local_args_info.random_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "random", '-', additional_error)) goto failure; } /* Use specified salt for deriving key. Defaults to concatenation of realm and (unwrapped) principal name.. */ else if (strcmp (long_options[option_index].name, "salt") == 0) { if (update_arg( (void *)&(args_info->salt_arg), &(args_info->salt_orig), &(args_info->salt_given), &(local_args_info.salt_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "salt", '-', additional_error)) goto failure; } /* Encryption algorithm specific parameter for password derivation. Currently only the AES algorithm can utilize this, where it is interpreted as the iteration count of the PKCS#5 PBKDF2 key deriver.. */ else if (strcmp (long_options[option_index].name, "string-to-key-parameter") == 0) { if (update_arg( (void *)&(args_info->string_to_key_parameter_arg), &(args_info->string_to_key_parameter_orig), &(args_info->string_to_key_parameter_given), &(local_args_info.string_to_key_parameter_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "string-to-key-parameter", '-', additional_error)) goto failure; } break; case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ goto failure; default: /* bug: option not considered. */ fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ cmdline_parser_release (&local_args_info); if ( error ) return (EXIT_FAILURE); if (optind < argc) { int i = 0 ; int found_prog_name = 0; /* whether program name, i.e., argv[0], is in the remaining args (this may happen with some implementations of getopt, but surely not with the one included by gengetopt) */ i = optind; while (i < argc) if (argv[i++] == argv[0]) { found_prog_name = 1; break; } i = 0; args_info->inputs_num = argc - optind - found_prog_name; args_info->inputs = (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; while (optind < argc) if (argv[optind++] != argv[0]) args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ; } return 0; failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } shishi-1.0.2/src/Makefile.in0000644000000000000000000022464212126772725012551 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = shishi$(EXEEXT) shisa$(EXEEXT) ccache2shishi$(EXEEXT) sbin_PROGRAMS = keytab2shishi$(EXEEXT) $(am__EXEEXT_1) @ENABLE_SHISHID_TRUE@am__append_1 = shishid @STARTTLS_TRUE@am__append_2 = starttls.c resume.c subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcmd_ccache2shishi_la_DEPENDENCIES = gl/libgnu.la am_libcmd_ccache2shishi_la_OBJECTS = \ libcmd_ccache2shishi_la-ccache2shishi_cmd.lo libcmd_ccache2shishi_la_OBJECTS = \ $(am_libcmd_ccache2shishi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libcmd_ccache2shishi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libcmd_ccache2shishi_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libcmd_keytab2shishi_la_DEPENDENCIES = gl/libgnu.la am_libcmd_keytab2shishi_la_OBJECTS = \ libcmd_keytab2shishi_la-keytab2shishi_cmd.lo libcmd_keytab2shishi_la_OBJECTS = \ $(am_libcmd_keytab2shishi_la_OBJECTS) libcmd_keytab2shishi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libcmd_keytab2shishi_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libcmd_shisa_la_DEPENDENCIES = gl/libgnu.la am_libcmd_shisa_la_OBJECTS = libcmd_shisa_la-shisa_cmd.lo libcmd_shisa_la_OBJECTS = $(am_libcmd_shisa_la_OBJECTS) libcmd_shisa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libcmd_shisa_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ libcmd_shishi_la_DEPENDENCIES = gl/libgnu.la am_libcmd_shishi_la_OBJECTS = libcmd_shishi_la-shishi_cmd.lo libcmd_shishi_la_OBJECTS = $(am_libcmd_shishi_la_OBJECTS) libcmd_shishi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libcmd_shishi_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ libcmd_shishid_la_DEPENDENCIES = gl/libgnu.la am_libcmd_shishid_la_OBJECTS = libcmd_shishid_la-shishid_cmd.lo libcmd_shishid_la_OBJECTS = $(am_libcmd_shishid_la_OBJECTS) libcmd_shishid_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libcmd_shishid_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" @ENABLE_SHISHID_TRUE@am__EXEEXT_1 = shishid$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(sbin_PROGRAMS) am_ccache2shishi_OBJECTS = ccache2shishi.$(OBJEXT) ccache2shishi_OBJECTS = $(am_ccache2shishi_OBJECTS) ccache2shishi_DEPENDENCIES = ../gl/libgnu.la gl/libgnu.la \ libcmd-ccache2shishi.la ../lib/libshishi.la am_keytab2shishi_OBJECTS = keytab2shishi.$(OBJEXT) keytab2shishi_OBJECTS = $(am_keytab2shishi_OBJECTS) keytab2shishi_DEPENDENCIES = ../gl/libgnu.la gl/libgnu.la \ libcmd-keytab2shishi.la ../lib/libshishi.la am_shisa_OBJECTS = shisa.$(OBJEXT) shisa_OBJECTS = $(am_shisa_OBJECTS) shisa_DEPENDENCIES = ../gl/libgnu.la gl/libgnu.la libcmd-shisa.la \ ../db/libshisa.la ../lib/libshishi.la am_shishi_OBJECTS = shishi.$(OBJEXT) shishi_OBJECTS = $(am_shishi_OBJECTS) shishi_DEPENDENCIES = ../gl/libgnu.la gl/libgnu.la libcmd-shishi.la \ ../lib/libshishi.la am__shishid_SOURCES_DIST = shishid.c server.c kdc.h kdc.c starttls.c \ resume.c @STARTTLS_TRUE@am__objects_1 = starttls.$(OBJEXT) resume.$(OBJEXT) am_shishid_OBJECTS = shishid.$(OBJEXT) server.$(OBJEXT) kdc.$(OBJEXT) \ $(am__objects_1) shishid_OBJECTS = $(am_shishid_OBJECTS) shishid_DEPENDENCIES = ../gl/libgnu.la gl/libgnu.la \ ../lib/libshishi.la ../db/libshisa.la libcmd-shishid.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libcmd_ccache2shishi_la_SOURCES) \ $(libcmd_keytab2shishi_la_SOURCES) $(libcmd_shisa_la_SOURCES) \ $(libcmd_shishi_la_SOURCES) $(libcmd_shishid_la_SOURCES) \ $(ccache2shishi_SOURCES) $(keytab2shishi_SOURCES) \ $(shisa_SOURCES) $(shishi_SOURCES) $(shishid_SOURCES) DIST_SOURCES = $(libcmd_ccache2shishi_la_SOURCES) \ $(libcmd_keytab2shishi_la_SOURCES) $(libcmd_shisa_la_SOURCES) \ $(libcmd_shishi_la_SOURCES) $(libcmd_shishid_la_SOURCES) \ $(ccache2shishi_SOURCES) $(keytab2shishi_SOURCES) \ $(shisa_SOURCES) $(shishi_SOURCES) $(am__shishid_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shishi.conf\" \ -DHOSTKEYSFILE=\"$(KEYDIR)/shishi.keys\" DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gl AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) AM_CPPFLAGS = \ -I$(builddir)/gl -I$(srcdir)/gl \ -I$(top_builddir)/gl -I$(top_srcdir)/gl \ -I$(top_builddir)/lib -I$(top_srcdir)/lib \ -I$(top_srcdir)/db BUILT_SOURCES = shishi_cmd.c shishi_cmd.h shisa_cmd.c shisa_cmd.h \ shishid_cmd.c shishid_cmd.h keytab2shishi_cmd.c \ keytab2shishi_cmd.h ccache2shishi_cmd.c \ ccache2shishi_cmd.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) noinst_LTLIBRARIES = libcmd-shishi.la libcmd-shisa.la \ libcmd-shishid.la libcmd-keytab2shishi.la \ libcmd-ccache2shishi.la shishi_SOURCES = shishi.c shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-shishi.la \ ../lib/libshishi.la @LTLIBINTL@ libcmd_shishi_la_CFLAGS = libcmd_shishi_la_LIBADD = gl/libgnu.la libcmd_shishi_la_SOURCES = shishi.ggo shishi_cmd.h shishi_cmd.c shisa_SOURCES = shisa.c shisa_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-shisa.la \ ../db/libshisa.la ../lib/libshishi.la @LTLIBINTL@ libcmd_shisa_la_CFLAGS = libcmd_shisa_la_LIBADD = gl/libgnu.la libcmd_shisa_la_SOURCES = shisa.ggo shisa_cmd.h shisa_cmd.c shishid_SOURCES = shishid.c server.c kdc.h kdc.c $(am__append_2) shishid_LDADD = ../gl/libgnu.la gl/libgnu.la ../lib/libshishi.la \ ../db/libshisa.la @LTLIBGNUTLS@ @LTLIBINTL@ libcmd-shishid.la libcmd_shishid_la_CFLAGS = libcmd_shishid_la_LIBADD = gl/libgnu.la libcmd_shishid_la_SOURCES = shishid.ggo shishid_cmd.h shishid_cmd.c keytab2shishi_SOURCES = keytab2shishi.c keytab2shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-keytab2shishi.la \ ../lib/libshishi.la @LTLIBINTL@ libcmd_keytab2shishi_la_CFLAGS = libcmd_keytab2shishi_la_LIBADD = gl/libgnu.la libcmd_keytab2shishi_la_SOURCES = keytab2shishi.ggo \ keytab2shishi_cmd.h keytab2shishi_cmd.c ccache2shishi_SOURCES = ccache2shishi.c ccache2shishi_LDADD = ../gl/libgnu.la gl/libgnu.la libcmd-ccache2shishi.la \ ../lib/libshishi.la @LTLIBINTL@ libcmd_ccache2shishi_la_CFLAGS = libcmd_ccache2shishi_la_LIBADD = gl/libgnu.la libcmd_ccache2shishi_la_SOURCES = ccache2shishi.ggo \ ccache2shishi_cmd.h ccache2shishi_cmd.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcmd-ccache2shishi.la: $(libcmd_ccache2shishi_la_OBJECTS) $(libcmd_ccache2shishi_la_DEPENDENCIES) $(EXTRA_libcmd_ccache2shishi_la_DEPENDENCIES) $(AM_V_CCLD)$(libcmd_ccache2shishi_la_LINK) $(libcmd_ccache2shishi_la_OBJECTS) $(libcmd_ccache2shishi_la_LIBADD) $(LIBS) libcmd-keytab2shishi.la: $(libcmd_keytab2shishi_la_OBJECTS) $(libcmd_keytab2shishi_la_DEPENDENCIES) $(EXTRA_libcmd_keytab2shishi_la_DEPENDENCIES) $(AM_V_CCLD)$(libcmd_keytab2shishi_la_LINK) $(libcmd_keytab2shishi_la_OBJECTS) $(libcmd_keytab2shishi_la_LIBADD) $(LIBS) libcmd-shisa.la: $(libcmd_shisa_la_OBJECTS) $(libcmd_shisa_la_DEPENDENCIES) $(EXTRA_libcmd_shisa_la_DEPENDENCIES) $(AM_V_CCLD)$(libcmd_shisa_la_LINK) $(libcmd_shisa_la_OBJECTS) $(libcmd_shisa_la_LIBADD) $(LIBS) libcmd-shishi.la: $(libcmd_shishi_la_OBJECTS) $(libcmd_shishi_la_DEPENDENCIES) $(EXTRA_libcmd_shishi_la_DEPENDENCIES) $(AM_V_CCLD)$(libcmd_shishi_la_LINK) $(libcmd_shishi_la_OBJECTS) $(libcmd_shishi_la_LIBADD) $(LIBS) libcmd-shishid.la: $(libcmd_shishid_la_OBJECTS) $(libcmd_shishid_la_DEPENDENCIES) $(EXTRA_libcmd_shishid_la_DEPENDENCIES) $(AM_V_CCLD)$(libcmd_shishid_la_LINK) $(libcmd_shishid_la_OBJECTS) $(libcmd_shishid_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ccache2shishi$(EXEEXT): $(ccache2shishi_OBJECTS) $(ccache2shishi_DEPENDENCIES) $(EXTRA_ccache2shishi_DEPENDENCIES) @rm -f ccache2shishi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ccache2shishi_OBJECTS) $(ccache2shishi_LDADD) $(LIBS) keytab2shishi$(EXEEXT): $(keytab2shishi_OBJECTS) $(keytab2shishi_DEPENDENCIES) $(EXTRA_keytab2shishi_DEPENDENCIES) @rm -f keytab2shishi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(keytab2shishi_OBJECTS) $(keytab2shishi_LDADD) $(LIBS) shisa$(EXEEXT): $(shisa_OBJECTS) $(shisa_DEPENDENCIES) $(EXTRA_shisa_DEPENDENCIES) @rm -f shisa$(EXEEXT) $(AM_V_CCLD)$(LINK) $(shisa_OBJECTS) $(shisa_LDADD) $(LIBS) shishi$(EXEEXT): $(shishi_OBJECTS) $(shishi_DEPENDENCIES) $(EXTRA_shishi_DEPENDENCIES) @rm -f shishi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(shishi_OBJECTS) $(shishi_LDADD) $(LIBS) shishid$(EXEEXT): $(shishid_OBJECTS) $(shishid_DEPENDENCIES) $(EXTRA_shishid_DEPENDENCIES) @rm -f shishid$(EXEEXT) $(AM_V_CCLD)$(LINK) $(shishid_OBJECTS) $(shishid_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccache2shishi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytab2shishi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmd_ccache2shishi_la-ccache2shishi_cmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmd_keytab2shishi_la-keytab2shishi_cmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmd_shisa_la-shisa_cmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmd_shishi_la-shishi_cmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmd_shishid_la-shishid_cmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shisa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shishi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shishid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starttls.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libcmd_ccache2shishi_la-ccache2shishi_cmd.lo: ccache2shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_ccache2shishi_la_CFLAGS) $(CFLAGS) -MT libcmd_ccache2shishi_la-ccache2shishi_cmd.lo -MD -MP -MF $(DEPDIR)/libcmd_ccache2shishi_la-ccache2shishi_cmd.Tpo -c -o libcmd_ccache2shishi_la-ccache2shishi_cmd.lo `test -f 'ccache2shishi_cmd.c' || echo '$(srcdir)/'`ccache2shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcmd_ccache2shishi_la-ccache2shishi_cmd.Tpo $(DEPDIR)/libcmd_ccache2shishi_la-ccache2shishi_cmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccache2shishi_cmd.c' object='libcmd_ccache2shishi_la-ccache2shishi_cmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_ccache2shishi_la_CFLAGS) $(CFLAGS) -c -o libcmd_ccache2shishi_la-ccache2shishi_cmd.lo `test -f 'ccache2shishi_cmd.c' || echo '$(srcdir)/'`ccache2shishi_cmd.c libcmd_keytab2shishi_la-keytab2shishi_cmd.lo: keytab2shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_keytab2shishi_la_CFLAGS) $(CFLAGS) -MT libcmd_keytab2shishi_la-keytab2shishi_cmd.lo -MD -MP -MF $(DEPDIR)/libcmd_keytab2shishi_la-keytab2shishi_cmd.Tpo -c -o libcmd_keytab2shishi_la-keytab2shishi_cmd.lo `test -f 'keytab2shishi_cmd.c' || echo '$(srcdir)/'`keytab2shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcmd_keytab2shishi_la-keytab2shishi_cmd.Tpo $(DEPDIR)/libcmd_keytab2shishi_la-keytab2shishi_cmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab2shishi_cmd.c' object='libcmd_keytab2shishi_la-keytab2shishi_cmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_keytab2shishi_la_CFLAGS) $(CFLAGS) -c -o libcmd_keytab2shishi_la-keytab2shishi_cmd.lo `test -f 'keytab2shishi_cmd.c' || echo '$(srcdir)/'`keytab2shishi_cmd.c libcmd_shisa_la-shisa_cmd.lo: shisa_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shisa_la_CFLAGS) $(CFLAGS) -MT libcmd_shisa_la-shisa_cmd.lo -MD -MP -MF $(DEPDIR)/libcmd_shisa_la-shisa_cmd.Tpo -c -o libcmd_shisa_la-shisa_cmd.lo `test -f 'shisa_cmd.c' || echo '$(srcdir)/'`shisa_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcmd_shisa_la-shisa_cmd.Tpo $(DEPDIR)/libcmd_shisa_la-shisa_cmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shisa_cmd.c' object='libcmd_shisa_la-shisa_cmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shisa_la_CFLAGS) $(CFLAGS) -c -o libcmd_shisa_la-shisa_cmd.lo `test -f 'shisa_cmd.c' || echo '$(srcdir)/'`shisa_cmd.c libcmd_shishi_la-shishi_cmd.lo: shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shishi_la_CFLAGS) $(CFLAGS) -MT libcmd_shishi_la-shishi_cmd.lo -MD -MP -MF $(DEPDIR)/libcmd_shishi_la-shishi_cmd.Tpo -c -o libcmd_shishi_la-shishi_cmd.lo `test -f 'shishi_cmd.c' || echo '$(srcdir)/'`shishi_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcmd_shishi_la-shishi_cmd.Tpo $(DEPDIR)/libcmd_shishi_la-shishi_cmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shishi_cmd.c' object='libcmd_shishi_la-shishi_cmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shishi_la_CFLAGS) $(CFLAGS) -c -o libcmd_shishi_la-shishi_cmd.lo `test -f 'shishi_cmd.c' || echo '$(srcdir)/'`shishi_cmd.c libcmd_shishid_la-shishid_cmd.lo: shishid_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shishid_la_CFLAGS) $(CFLAGS) -MT libcmd_shishid_la-shishid_cmd.lo -MD -MP -MF $(DEPDIR)/libcmd_shishid_la-shishid_cmd.Tpo -c -o libcmd_shishid_la-shishid_cmd.lo `test -f 'shishid_cmd.c' || echo '$(srcdir)/'`shishid_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcmd_shishid_la-shishid_cmd.Tpo $(DEPDIR)/libcmd_shishid_la-shishid_cmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shishid_cmd.c' object='libcmd_shishid_la-shishid_cmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcmd_shishid_la_CFLAGS) $(CFLAGS) -c -o libcmd_shishid_la-shishid_cmd.lo `test -f 'shishid_cmd.c' || echo '$(srcdir)/'`shishid_cmd.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-sbinPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-sbinPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-sbinPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-sbinPROGRAMS ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-sbinPROGRAMS install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-sbinPROGRAMS shishi_cmd.c shishi_cmd.h: $(srcdir)/shishi.ggo Makefile.am gengetopt --unamed-opts="CLIENT [SERVER]" \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shishi.ggo --file-name shishi_cmd shisa_cmd.c shisa_cmd.h: $(srcdir)/shisa.ggo Makefile.am gengetopt --unamed-opts="REALM [PRINCIPAL]" \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shisa.ggo --file-name shisa_cmd shishid_cmd.c shishid_cmd.h: $(srcdir)/shishid.ggo Makefile.am gengetopt \ --no-handle-help --no-handle-error --no-handle-version \ --input $(srcdir)/shishid.ggo --file-name shishid_cmd keytab2shishi_cmd.c keytab2shishi_cmd.h: $(srcdir)/keytab2shishi.ggo Makefile.am gengetopt --unamed-opts="INFILE [OUTFILE]" \ --no-handle-help --no-handle-error \ --input $(srcdir)/keytab2shishi.ggo --file-name keytab2shishi_cmd ccache2shishi_cmd.c ccache2shishi_cmd.h: $(srcdir)/ccache2shishi.ggo Makefile.am gengetopt --unamed-opts="INFILE [OUTFILE]" \ --no-handle-help --no-handle-error \ --input $(srcdir)/ccache2shishi.ggo --file-name ccache2shishi_cmd # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/src/keytab2shishi_cmd.c0000644000000000000000000004132012126773076014232 00000000000000/* File autogenerated by gengetopt version 2.22.5 generated with the following command: gengetopt --unamed-opts=INFILE [OUTFILE] --no-handle-help --no-handle-error --input ./keytab2shishi.ggo --file-name keytab2shishi_cmd The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: we make no copyright claims on it. */ /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif #include #include "keytab2shishi_cmd.h" const char *gengetopt_args_info_purpose = "Read keytab data from INFILE (usually /etc/krb5.keytab) and\nwrite Shishi hostkeys to OUTFILE. If INFILE and OUTFILE are not\nspecified, use the defaults."; const char *gengetopt_args_info_usage = "Usage: keytab2shishi [OPTIONS]... [INFILE [OUTFILE]]..."; const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_help[] = { " -h, --help Print help and exit", " -V, --version Print version and exit", " -R, --reverse Reverse action, read Shishi hostkeys from INFILE and write \n keytab data to OUTFILE. (default=off)", " -v, --verbose Produce verbose output.\n Use multiple times to increase amount of information.", " -q, --quiet Don't produce any diagnostic output.\n (default=off)", 0 }; typedef enum {ARG_NO , ARG_FLAG } cmdline_parser_arg_type; static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error); static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); static char * gengetopt_strdup (const char *s); static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->reverse_given = 0 ; args_info->verbose_given = 0 ; args_info->quiet_given = 0 ; } static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->reverse_flag = 0; args_info->quiet_flag = 0; } static void init_args_info(struct gengetopt_args_info *args_info) { args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->reverse_help = gengetopt_args_info_help[2] ; args_info->verbose_help = gengetopt_args_info_help[3] ; args_info->verbose_min = 0; args_info->verbose_max = 0; args_info->quiet_help = gengetopt_args_info_help[4] ; } void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); } static void print_help_common(void) { cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); if (strlen(gengetopt_args_info_usage) > 0) printf("\n%s\n", gengetopt_args_info_usage); printf("\n"); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\n", gengetopt_args_info_description); } void cmdline_parser_print_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } void cmdline_parser_init (struct gengetopt_args_info *args_info) { clear_given (args_info); clear_args (args_info); init_args_info (args_info); args_info->inputs = 0; args_info->inputs_num = 0; } void cmdline_parser_params_init(struct cmdline_parser_params *params) { if (params) { params->override = 0; params->initialize = 1; params->check_required = 1; params->check_ambiguity = 0; params->print_errors = 1; } } struct cmdline_parser_params * cmdline_parser_params_create(void) { struct cmdline_parser_params *params = (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); cmdline_parser_params_init(params); return params; } static void cmdline_parser_release (struct gengetopt_args_info *args_info) { unsigned int i; for (i = 0; i < args_info->inputs_num; ++i) free (args_info->inputs [i]); if (args_info->inputs_num) free (args_info->inputs); clear_given (args_info); } static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { FIX_UNUSED (values); if (arg) { fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } } static void write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) { int i; for (i = 0; i < len; ++i) write_into_file(outfile, opt, (arg ? arg[i] : 0), values); } int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0; if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; } if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); if (args_info->reverse_given) write_into_file(outfile, "reverse", 0, 0 ); write_multiple_into_file(outfile, args_info->verbose_given, "verbose", 0, 0); if (args_info->quiet_given) write_into_file(outfile, "quiet", 0, 0 ); i = EXIT_SUCCESS; return i; } int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) { FILE *outfile; int i = 0; outfile = fopen(filename, "w"); if (!outfile) { fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); return EXIT_FAILURE; } i = cmdline_parser_dump(outfile, args_info); fclose (outfile); return i; } void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); } /** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result; result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; } static int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc); int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) { int error = 0; if (option_given && (min > 0 || max > 0)) { if (min > 0 && max > 0) { if (min == max) { /* specific occurrences */ if (option_given != (unsigned int) min) { fprintf (stderr, "%s: %s option occurrences must be %d\n", prog_name, option_desc, min); error = 1; } } else if (option_given < (unsigned int) min || option_given > (unsigned int) max) { /* range occurrences */ fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", prog_name, option_desc, min, max); error = 1; } } else if (min > 0) { /* at least check */ if (option_given < min) { fprintf (stderr, "%s: %s option occurrences must be at least %d\n", prog_name, option_desc, min); error = 1; } } else if (max > 0) { /* at most check */ if (option_given > max) { fprintf (stderr, "%s: %s option occurrences must be at most %d\n", prog_name, option_desc, max); error = 1; } } } return error; } int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) { return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params) { int result; result = cmdline_parser_internal (argc, argv, args_info, params, 0); return result; } int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; struct cmdline_parser_params params; params.override = override; params.initialize = initialize; params.check_required = check_required; params.check_ambiguity = 0; params.print_errors = 1; result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); return result; } int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) { int result = EXIT_SUCCESS; if (cmdline_parser_required2(args_info, prog_name, 0) > 0) result = EXIT_FAILURE; return result; } int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) { int error = 0; FIX_UNUSED (additional_error); /* checks for required options */ if (check_multiple_option_occurrences(prog_name, args_info->verbose_given, args_info->verbose_min, args_info->verbose_max, "'--verbose' ('-v')")) error = 1; /* checks for dependences among options */ return error; } static char *package_name = 0; /** * @brief updates an option * @param field the generic pointer to the field to update * @param orig_field the pointer to the orig field * @param field_given the pointer to the number of occurrence of this option * @param prev_given the pointer to the number of occurrence already seen * @param value the argument for this option (if null no arg was specified) * @param possible_values the possible values for this option (if specified) * @param default_value the default value (in case the option only accepts fixed values) * @param arg_type the type of this option * @param check_ambiguity @see cmdline_parser_params.check_ambiguity * @param override @see cmdline_parser_params.override * @param no_free whether to free a possible previous value * @param multiple_option whether this is a multiple option * @param long_opt the corresponding long option * @param short_opt the corresponding short option (or '-' if none) * @param additional_error possible further error specification */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, int check_ambiguity, int override, int no_free, int multiple_option, const char *long_opt, char short_opt, const char *additional_error) { char *stop_char = 0; const char *val = value; int found; FIX_UNUSED (field); stop_char = 0; found = 0; if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) { if (short_opt != '-') fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", package_name, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: `--%s' option given more than once%s\n", package_name, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } FIX_UNUSED (default_value); if (field_given && *field_given && ! override) return 0; if (prev_given) (*prev_given)++; if (field_given) (*field_given)++; if (possible_values) val = possible_values[found]; switch(arg_type) { case ARG_FLAG: *((int *)field) = !*((int *)field); break; default: break; }; /* store the original value */ switch(arg_type) { case ARG_NO: case ARG_FLAG: break; default: if (value && orig_field) { if (no_free) { *orig_field = value; } else { if (*orig_field) free (*orig_field); /* free previous string */ *orig_field = gengetopt_strdup (value); } } }; return 0; /* OK */ } int cmdline_parser_internal ( int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; int override; int initialize; int check_required; int check_ambiguity; package_name = argv[0]; override = params->override; initialize = params->initialize; check_required = params->check_required; check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); cmdline_parser_init (&local_args_info); optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?'; while (1) { int option_index = 0; static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, { "reverse", 0, NULL, 'R' }, { "verbose", 0, NULL, 'v' }, { "quiet", 0, NULL, 'q' }, { 0, 0, 0, 0 } }; c = getopt_long (argc, argv, "hVRvq", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ switch (c) { case 'h': /* Print help and exit. */ if (update_arg( 0 , 0 , &(args_info->help_given), &(local_args_info.help_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "help", 'h', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'V': /* Print version and exit. */ cmdline_parser_print_version (); cmdline_parser_free (&local_args_info); exit (EXIT_SUCCESS); case 'R': /* Reverse action, read Shishi hostkeys from INFILE and write keytab data to OUTFILE.. */ if (update_arg((void *)&(args_info->reverse_flag), 0, &(args_info->reverse_given), &(local_args_info.reverse_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "reverse", 'R', additional_error)) goto failure; break; case 'v': /* Produce verbose output. Use multiple times to increase amount of information.. */ local_args_info.verbose_given++; break; case 'q': /* Don't produce any diagnostic output. . */ if (update_arg((void *)&(args_info->quiet_flag), 0, &(args_info->quiet_given), &(local_args_info.quiet_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "quiet", 'q', additional_error)) goto failure; break; case 0: /* Long option with no short option */ case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ goto failure; default: /* bug: option not considered. */ fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ args_info->verbose_given += local_args_info.verbose_given; local_args_info.verbose_given = 0; if (check_required) { error += cmdline_parser_required2 (args_info, argv[0], additional_error); } cmdline_parser_release (&local_args_info); if ( error ) return (EXIT_FAILURE); if (optind < argc) { int i = 0 ; int found_prog_name = 0; /* whether program name, i.e., argv[0], is in the remaining args (this may happen with some implementations of getopt, but surely not with the one included by gengetopt) */ i = optind; while (i < argc) if (argv[i++] == argv[0]) { found_prog_name = 1; break; } i = 0; args_info->inputs_num = argc - optind - found_prog_name; args_info->inputs = (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; while (optind < argc) if (argv[optind++] != argv[0]) args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ; } return 0; failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } shishi-1.0.2/src/ccache2shishi_cmd.c0000644000000000000000000003763112126773076014173 00000000000000/* File autogenerated by gengetopt version 2.22.5 generated with the following command: gengetopt --unamed-opts=INFILE [OUTFILE] --no-handle-help --no-handle-error --input ./ccache2shishi.ggo --file-name ccache2shishi_cmd The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: we make no copyright claims on it. */ /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif #include #include "ccache2shishi_cmd.h" const char *gengetopt_args_info_purpose = "Read ccache data from INFILE (usually /tmp/krb5cc_UID) and\nwrite Shishi tickets to OUTFILE. If INFILE and OUTFILE are not\nspecified, use the defaults."; const char *gengetopt_args_info_usage = "Usage: ccache2shishi [OPTIONS]... [INFILE [OUTFILE]]..."; const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_help[] = { " -h, --help Print help and exit", " -V, --version Print version and exit", " -v, --verbose Produce verbose output.\n Use multiple times to increase amount of information.", " -q, --quiet Don't produce any diagnostic output.\n (default=off)", 0 }; typedef enum {ARG_NO , ARG_FLAG } cmdline_parser_arg_type; static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error); static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); static char * gengetopt_strdup (const char *s); static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->verbose_given = 0 ; args_info->quiet_given = 0 ; } static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->quiet_flag = 0; } static void init_args_info(struct gengetopt_args_info *args_info) { args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->verbose_help = gengetopt_args_info_help[2] ; args_info->verbose_min = 0; args_info->verbose_max = 0; args_info->quiet_help = gengetopt_args_info_help[3] ; } void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); } static void print_help_common(void) { cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); if (strlen(gengetopt_args_info_usage) > 0) printf("\n%s\n", gengetopt_args_info_usage); printf("\n"); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\n", gengetopt_args_info_description); } void cmdline_parser_print_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } void cmdline_parser_init (struct gengetopt_args_info *args_info) { clear_given (args_info); clear_args (args_info); init_args_info (args_info); args_info->inputs = 0; args_info->inputs_num = 0; } void cmdline_parser_params_init(struct cmdline_parser_params *params) { if (params) { params->override = 0; params->initialize = 1; params->check_required = 1; params->check_ambiguity = 0; params->print_errors = 1; } } struct cmdline_parser_params * cmdline_parser_params_create(void) { struct cmdline_parser_params *params = (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); cmdline_parser_params_init(params); return params; } static void cmdline_parser_release (struct gengetopt_args_info *args_info) { unsigned int i; for (i = 0; i < args_info->inputs_num; ++i) free (args_info->inputs [i]); if (args_info->inputs_num) free (args_info->inputs); clear_given (args_info); } static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { FIX_UNUSED (values); if (arg) { fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } } static void write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) { int i; for (i = 0; i < len; ++i) write_into_file(outfile, opt, (arg ? arg[i] : 0), values); } int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0; if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; } if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); write_multiple_into_file(outfile, args_info->verbose_given, "verbose", 0, 0); if (args_info->quiet_given) write_into_file(outfile, "quiet", 0, 0 ); i = EXIT_SUCCESS; return i; } int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) { FILE *outfile; int i = 0; outfile = fopen(filename, "w"); if (!outfile) { fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); return EXIT_FAILURE; } i = cmdline_parser_dump(outfile, args_info); fclose (outfile); return i; } void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); } /** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result; result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; } static int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc); int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) { int error = 0; if (option_given && (min > 0 || max > 0)) { if (min > 0 && max > 0) { if (min == max) { /* specific occurrences */ if (option_given != (unsigned int) min) { fprintf (stderr, "%s: %s option occurrences must be %d\n", prog_name, option_desc, min); error = 1; } } else if (option_given < (unsigned int) min || option_given > (unsigned int) max) { /* range occurrences */ fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", prog_name, option_desc, min, max); error = 1; } } else if (min > 0) { /* at least check */ if (option_given < min) { fprintf (stderr, "%s: %s option occurrences must be at least %d\n", prog_name, option_desc, min); error = 1; } } else if (max > 0) { /* at most check */ if (option_given > max) { fprintf (stderr, "%s: %s option occurrences must be at most %d\n", prog_name, option_desc, max); error = 1; } } } return error; } int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) { return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params) { int result; result = cmdline_parser_internal (argc, argv, args_info, params, 0); return result; } int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; struct cmdline_parser_params params; params.override = override; params.initialize = initialize; params.check_required = check_required; params.check_ambiguity = 0; params.print_errors = 1; result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); return result; } int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) { int result = EXIT_SUCCESS; if (cmdline_parser_required2(args_info, prog_name, 0) > 0) result = EXIT_FAILURE; return result; } int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) { int error = 0; FIX_UNUSED (additional_error); /* checks for required options */ if (check_multiple_option_occurrences(prog_name, args_info->verbose_given, args_info->verbose_min, args_info->verbose_max, "'--verbose' ('-v')")) error = 1; /* checks for dependences among options */ return error; } static char *package_name = 0; /** * @brief updates an option * @param field the generic pointer to the field to update * @param orig_field the pointer to the orig field * @param field_given the pointer to the number of occurrence of this option * @param prev_given the pointer to the number of occurrence already seen * @param value the argument for this option (if null no arg was specified) * @param possible_values the possible values for this option (if specified) * @param default_value the default value (in case the option only accepts fixed values) * @param arg_type the type of this option * @param check_ambiguity @see cmdline_parser_params.check_ambiguity * @param override @see cmdline_parser_params.override * @param no_free whether to free a possible previous value * @param multiple_option whether this is a multiple option * @param long_opt the corresponding long option * @param short_opt the corresponding short option (or '-' if none) * @param additional_error possible further error specification */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, int check_ambiguity, int override, int no_free, int multiple_option, const char *long_opt, char short_opt, const char *additional_error) { char *stop_char = 0; const char *val = value; int found; FIX_UNUSED (field); stop_char = 0; found = 0; if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) { if (short_opt != '-') fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", package_name, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: `--%s' option given more than once%s\n", package_name, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } FIX_UNUSED (default_value); if (field_given && *field_given && ! override) return 0; if (prev_given) (*prev_given)++; if (field_given) (*field_given)++; if (possible_values) val = possible_values[found]; switch(arg_type) { case ARG_FLAG: *((int *)field) = !*((int *)field); break; default: break; }; /* store the original value */ switch(arg_type) { case ARG_NO: case ARG_FLAG: break; default: if (value && orig_field) { if (no_free) { *orig_field = value; } else { if (*orig_field) free (*orig_field); /* free previous string */ *orig_field = gengetopt_strdup (value); } } }; return 0; /* OK */ } int cmdline_parser_internal ( int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; int override; int initialize; int check_required; int check_ambiguity; package_name = argv[0]; override = params->override; initialize = params->initialize; check_required = params->check_required; check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); cmdline_parser_init (&local_args_info); optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?'; while (1) { int option_index = 0; static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, { "verbose", 0, NULL, 'v' }, { "quiet", 0, NULL, 'q' }, { 0, 0, 0, 0 } }; c = getopt_long (argc, argv, "hVvq", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ switch (c) { case 'h': /* Print help and exit. */ if (update_arg( 0 , 0 , &(args_info->help_given), &(local_args_info.help_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "help", 'h', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'V': /* Print version and exit. */ cmdline_parser_print_version (); cmdline_parser_free (&local_args_info); exit (EXIT_SUCCESS); case 'v': /* Produce verbose output. Use multiple times to increase amount of information.. */ local_args_info.verbose_given++; break; case 'q': /* Don't produce any diagnostic output. . */ if (update_arg((void *)&(args_info->quiet_flag), 0, &(args_info->quiet_given), &(local_args_info.quiet_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "quiet", 'q', additional_error)) goto failure; break; case 0: /* Long option with no short option */ case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ goto failure; default: /* bug: option not considered. */ fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ args_info->verbose_given += local_args_info.verbose_given; local_args_info.verbose_given = 0; if (check_required) { error += cmdline_parser_required2 (args_info, argv[0], additional_error); } cmdline_parser_release (&local_args_info); if ( error ) return (EXIT_FAILURE); if (optind < argc) { int i = 0 ; int found_prog_name = 0; /* whether program name, i.e., argv[0], is in the remaining args (this may happen with some implementations of getopt, but surely not with the one included by gengetopt) */ i = optind; while (i < argc) if (argv[i++] == argv[0]) { found_prog_name = 1; break; } i = 0; args_info->inputs_num = argc - optind - found_prog_name; args_info->inputs = (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; while (optind < argc) if (argv[optind++] != argv[0]) args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ; } return 0; failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } shishi-1.0.2/src/keytab2shishi_cmd.h0000644000000000000000000001623512126773076014246 00000000000000/** @file keytab2shishi_cmd.h * @brief The header file for the command line option parser * generated by GNU Gengetopt version 2.22.5 * http://www.gnu.org/software/gengetopt. * DO NOT modify this file, since it can be overwritten * @author GNU Gengetopt by Lorenzo Bettini */ #ifndef KEYTAB2SHISHI_CMD_H #define KEYTAB2SHISHI_CMD_H /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* for FILE */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE /** @brief the program name (used for printing errors) */ #define CMDLINE_PARSER_PACKAGE "keytab2shishi" #endif #ifndef CMDLINE_PARSER_PACKAGE_NAME /** @brief the complete program name (used for help and version) */ #define CMDLINE_PARSER_PACKAGE_NAME "keytab2shishi" #endif #ifndef CMDLINE_PARSER_VERSION /** @brief the program version */ #define CMDLINE_PARSER_VERSION VERSION #endif /** @brief Where the command line options are stored */ struct gengetopt_args_info { const char *help_help; /**< @brief Print help and exit help description. */ const char *version_help; /**< @brief Print version and exit help description. */ int reverse_flag; /**< @brief Reverse action, read Shishi hostkeys from INFILE and write keytab data to OUTFILE. (default=off). */ const char *reverse_help; /**< @brief Reverse action, read Shishi hostkeys from INFILE and write keytab data to OUTFILE. help description. */ unsigned int verbose_min; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s minimum occurreces */ unsigned int verbose_max; /**< @brief Produce verbose output. Use multiple times to increase amount of information.'s maximum occurreces */ const char *verbose_help; /**< @brief Produce verbose output. Use multiple times to increase amount of information. help description. */ int quiet_flag; /**< @brief Don't produce any diagnostic output. (default=off). */ const char *quiet_help; /**< @brief Don't produce any diagnostic output. help description. */ unsigned int help_given ; /**< @brief Whether help was given. */ unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int reverse_given ; /**< @brief Whether reverse was given. */ unsigned int verbose_given ; /**< @brief Whether verbose was given. */ unsigned int quiet_given ; /**< @brief Whether quiet was given. */ char **inputs ; /**< @brief unamed options (options without names) */ unsigned inputs_num ; /**< @brief unamed options number */ } ; /** @brief The additional parameters to pass to parser functions */ struct cmdline_parser_params { int override; /**< @brief whether to override possibly already present options (default 0) */ int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ int check_required; /**< @brief whether to check that all required options were provided (default 1) */ int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; /** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; /** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; /** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; /** * The command line parser * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info); /** * The command line parser (version with additional parameters - deprecated) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param override whether to override possibly already present options * @param initialize whether to initialize the option structure my_args_info * @param check_required whether to check that all required options were provided * @return 0 if everything went fine, NON 0 if an error took place * @deprecated use cmdline_parser_ext() instead */ int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); /** * The command line parser (version with additional parameters) * @param argc the number of command line options * @param argv the command line options * @param args_info the structure where option information will be stored * @param params additional parameters for the parser * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params); /** * Save the contents of the option struct into an already open FILE stream. * @param outfile the stream where to dump options * @param args_info the option struct to dump * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info); /** * Save the contents of the option struct into a (text) file. * This file can be read by the config file parser (if generated by gengetopt) * @param filename the file where to save * @param args_info the option struct to save * @return 0 if everything went fine, NON 0 if an error took place */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); /** * Print the help */ void cmdline_parser_print_help(void); /** * Print the version */ void cmdline_parser_print_version(void); /** * Initializes all the fields a cmdline_parser_params structure * to their default values * @param params the structure to initialize */ void cmdline_parser_params_init(struct cmdline_parser_params *params); /** * Allocates dynamically a cmdline_parser_params structure and initializes * all its fields to their default values * @return the created and initialized cmdline_parser_params structure */ struct cmdline_parser_params *cmdline_parser_params_create(void); /** * Initializes the passed gengetopt_args_info structure's fields * (also set default values for options that have a default) * @param args_info the structure to initialize */ void cmdline_parser_init (struct gengetopt_args_info *args_info); /** * Deallocates the string fields of the gengetopt_args_info structure * (but does not deallocate the structure itself) * @param args_info the structure to deallocate */ void cmdline_parser_free (struct gengetopt_args_info *args_info); /** * Checks that all the required options were specified * @param args_info the structure to check * @param prog_name the name of the program that will be used to print * possible errors * @return */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* KEYTAB2SHISHI_CMD_H */ shishi-1.0.2/src/shishi.ggo0000664000000000000000000000774712126660507012472 00000000000000## Process this file with gengetopt to produce shishi_cmd.* # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. package "shishi" purpose "Shishi command line client. If no command is given, Shishi acquire or list a valid ticket for you, identified by CLIENT (if empty, default username in default realm), for the service SERVER (if empty, ticket granting ticket for client realm)." section "Commands" option "destroy" d "Destroy tickets in local cache, limited by any --client-name or --server-name." flag off option "list" l "List tickets in local cache, limited by any --client-name and --server-name." flag off option "renew" r "Renew ticket. Use --server-name to specify ticket, default is the most recent renewable ticket granting ticket for the default realm." flag off section "Flags" option "forwardable" - "Get a forwardable ticket, i.e., one that can be used to get forwarded tickets." flag off option "forwarded" - "Get a forwarded ticket." flag off option "proxiable" - "Get a proxiable ticket, i.e., one that can be used to get proxy tickets." flag off option "proxy" - "Get a proxy ticket." flag off option "renewable" - "Get a renewable ticket." flag off section "Options" option "client-name" - "Client name. Default is login username." string typestr="NAME" no option "encryption-type" E "Encryption types to use. ETYPE is either registered name or integer. Valid values include 'aes128', 'aes256', 'aes' (same as 'aes256'), '3des', 'des-md5', 'des-md4', 'des-crc', 'des' (same as 'des-md5'), and 'arcfour'." string typestr="ETYPE,[ETYPE...]" no option "endtime" e "Specify when ticket validity should expire. The time syntax may be relative (to the start time), such as '20 hours', or absolute, such as '2001-02-03 04:05:06 CET'. The default is 8 hours after the start time." string typestr="STRING" no option "realm" - "Set default realm." string typestr="STRING" no option "renew-till" - "Specify renewable life of ticket. Implies --renewable. Accepts same time syntax as --endtime. If --renewable is specified, the default is 1 week after the start time." string typestr="STRING" no option "server-name" - "Server name. Default is 'krbtgt/REALM' where REALM is client realm." string typestr="NAME" no option "starttime" s "Specify when ticket should start to be valid. Accepts same time syntax as --endtime. The default is to become valid immediately." string typestr="STRING" no option "ticket-granter" - "Service name in ticket to use for authenticating request. Only for TGS. Defaults to 'krbtgt/REALM@REALM' where REALM is client realm." string typestr="NAME" no section "Other options" option "configuration-file" - "Read user configuration from FILE." string typestr="FILE" no option "ticket-file" c "Read tickets from FILE." string typestr="FILE" no option "library-options" o "Parse STRING as a configuration file statement." string typestr="STRING" no option "quiet" q "Don't produce any diagnostic output.\n" flag off option "system-configuration-file" - "Read system configuration from FILE." string typestr="FILE" no option "ticket-write-file" - "Write tickets from FILE. Default is to write them back to where they were read from." string typestr="FILE" no option "verbose" v "Produce verbose output.\nUse multiple times to increase amount of information." no multiple shishi-1.0.2/src/shishid_cmd.c0000644000000000000000000006362312126773076013126 00000000000000/* File autogenerated by gengetopt version 2.22.5 generated with the following command: gengetopt --no-handle-help --no-handle-error --no-handle-version --input ./shishid.ggo --file-name shishid_cmd The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: we make no copyright claims on it. */ /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif #include #include "shishid_cmd.h" const char *gengetopt_args_info_purpose = "Shishi Key Distribution Center server."; const char *gengetopt_args_info_usage = "Usage: shishid [OPTIONS]..."; const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_help[] = { " -h, --help Print help and exit", " -V, --version Print version and exit", "\nCommands:", " -l, --listen=[FAMILY:]ADDR:PORT/TYPE\n Sockets to listen for queries on. Family is \n `IPv4' or `IPv6', if absent the family is \n decided by gethostbyname(ADDR). An address of \n `*' indicates all addresses on the local \n host. The default is `*:kerberos/udp, \n *:kerberos/tcp'.", " -u, --setuid=NAME After binding socket, set user identity.", "\nTLS settings:", " --no-tls Disable TLS support (default=off)", " --x509cafile=FILE X.509 certificate authorities used to verify \n client certificates, in PEM format.", " --x509certfile=FILE X.509 server certificate, in PEM format.", " --x509crlfile=FILE X.509 certificate revocation list to check for \n revoked client certificates, in PEM format.", " --x509keyfile=FILE X.509 server certificate key, in PEM format.", " --resume-limit=SHORT Keep track of up to this many TLS sessions for \n resume purposes (0 to disable TLS resume). \n (default=`50')", "\nOther options:", " -c, --configuration-file=FILE Use specified configuration file.", " -v, --verbose Produce verbose output.\n Use multiple times to increase amount of \n information.", " -q, --quiet Don't produce any diagnostic output.\n (default=off)", 0 }; typedef enum {ARG_NO , ARG_FLAG , ARG_STRING , ARG_SHORT } cmdline_parser_arg_type; static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error); static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); static char * gengetopt_strdup (const char *s); static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->listen_given = 0 ; args_info->setuid_given = 0 ; args_info->no_tls_given = 0 ; args_info->x509cafile_given = 0 ; args_info->x509certfile_given = 0 ; args_info->x509crlfile_given = 0 ; args_info->x509keyfile_given = 0 ; args_info->resume_limit_given = 0 ; args_info->configuration_file_given = 0 ; args_info->verbose_given = 0 ; args_info->quiet_given = 0 ; } static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->listen_arg = NULL; args_info->listen_orig = NULL; args_info->setuid_arg = NULL; args_info->setuid_orig = NULL; args_info->no_tls_flag = 0; args_info->x509cafile_arg = NULL; args_info->x509cafile_orig = NULL; args_info->x509certfile_arg = NULL; args_info->x509certfile_orig = NULL; args_info->x509crlfile_arg = NULL; args_info->x509crlfile_orig = NULL; args_info->x509keyfile_arg = NULL; args_info->x509keyfile_orig = NULL; args_info->resume_limit_arg = 50; args_info->resume_limit_orig = NULL; args_info->configuration_file_arg = NULL; args_info->configuration_file_orig = NULL; args_info->quiet_flag = 0; } static void init_args_info(struct gengetopt_args_info *args_info) { args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->listen_help = gengetopt_args_info_help[3] ; args_info->setuid_help = gengetopt_args_info_help[4] ; args_info->no_tls_help = gengetopt_args_info_help[6] ; args_info->x509cafile_help = gengetopt_args_info_help[7] ; args_info->x509certfile_help = gengetopt_args_info_help[8] ; args_info->x509crlfile_help = gengetopt_args_info_help[9] ; args_info->x509keyfile_help = gengetopt_args_info_help[10] ; args_info->resume_limit_help = gengetopt_args_info_help[11] ; args_info->configuration_file_help = gengetopt_args_info_help[13] ; args_info->verbose_help = gengetopt_args_info_help[14] ; args_info->verbose_min = 0; args_info->verbose_max = 0; args_info->quiet_help = gengetopt_args_info_help[15] ; } void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); } static void print_help_common(void) { cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); if (strlen(gengetopt_args_info_usage) > 0) printf("\n%s\n", gengetopt_args_info_usage); printf("\n"); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\n", gengetopt_args_info_description); } void cmdline_parser_print_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } void cmdline_parser_init (struct gengetopt_args_info *args_info) { clear_given (args_info); clear_args (args_info); init_args_info (args_info); } void cmdline_parser_params_init(struct cmdline_parser_params *params) { if (params) { params->override = 0; params->initialize = 1; params->check_required = 1; params->check_ambiguity = 0; params->print_errors = 1; } } struct cmdline_parser_params * cmdline_parser_params_create(void) { struct cmdline_parser_params *params = (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); cmdline_parser_params_init(params); return params; } static void free_string_field (char **s) { if (*s) { free (*s); *s = 0; } } static void cmdline_parser_release (struct gengetopt_args_info *args_info) { free_string_field (&(args_info->listen_arg)); free_string_field (&(args_info->listen_orig)); free_string_field (&(args_info->setuid_arg)); free_string_field (&(args_info->setuid_orig)); free_string_field (&(args_info->x509cafile_arg)); free_string_field (&(args_info->x509cafile_orig)); free_string_field (&(args_info->x509certfile_arg)); free_string_field (&(args_info->x509certfile_orig)); free_string_field (&(args_info->x509crlfile_arg)); free_string_field (&(args_info->x509crlfile_orig)); free_string_field (&(args_info->x509keyfile_arg)); free_string_field (&(args_info->x509keyfile_orig)); free_string_field (&(args_info->resume_limit_orig)); free_string_field (&(args_info->configuration_file_arg)); free_string_field (&(args_info->configuration_file_orig)); clear_given (args_info); } static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { FIX_UNUSED (values); if (arg) { fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } } static void write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) { int i; for (i = 0; i < len; ++i) write_into_file(outfile, opt, (arg ? arg[i] : 0), values); } int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0; if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; } if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); if (args_info->listen_given) write_into_file(outfile, "listen", args_info->listen_orig, 0); if (args_info->setuid_given) write_into_file(outfile, "setuid", args_info->setuid_orig, 0); if (args_info->no_tls_given) write_into_file(outfile, "no-tls", 0, 0 ); if (args_info->x509cafile_given) write_into_file(outfile, "x509cafile", args_info->x509cafile_orig, 0); if (args_info->x509certfile_given) write_into_file(outfile, "x509certfile", args_info->x509certfile_orig, 0); if (args_info->x509crlfile_given) write_into_file(outfile, "x509crlfile", args_info->x509crlfile_orig, 0); if (args_info->x509keyfile_given) write_into_file(outfile, "x509keyfile", args_info->x509keyfile_orig, 0); if (args_info->resume_limit_given) write_into_file(outfile, "resume-limit", args_info->resume_limit_orig, 0); if (args_info->configuration_file_given) write_into_file(outfile, "configuration-file", args_info->configuration_file_orig, 0); write_multiple_into_file(outfile, args_info->verbose_given, "verbose", 0, 0); if (args_info->quiet_given) write_into_file(outfile, "quiet", 0, 0 ); i = EXIT_SUCCESS; return i; } int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) { FILE *outfile; int i = 0; outfile = fopen(filename, "w"); if (!outfile) { fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); return EXIT_FAILURE; } i = cmdline_parser_dump(outfile, args_info); fclose (outfile); return i; } void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); } /** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result; result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; } static int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc); int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) { int error = 0; if (option_given && (min > 0 || max > 0)) { if (min > 0 && max > 0) { if (min == max) { /* specific occurrences */ if (option_given != (unsigned int) min) { fprintf (stderr, "%s: %s option occurrences must be %d\n", prog_name, option_desc, min); error = 1; } } else if (option_given < (unsigned int) min || option_given > (unsigned int) max) { /* range occurrences */ fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", prog_name, option_desc, min, max); error = 1; } } else if (min > 0) { /* at least check */ if (option_given < min) { fprintf (stderr, "%s: %s option occurrences must be at least %d\n", prog_name, option_desc, min); error = 1; } } else if (max > 0) { /* at most check */ if (option_given > max) { fprintf (stderr, "%s: %s option occurrences must be at most %d\n", prog_name, option_desc, max); error = 1; } } } return error; } int cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) { return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } int cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params) { int result; result = cmdline_parser_internal (argc, argv, args_info, params, 0); return result; } int cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; struct cmdline_parser_params params; params.override = override; params.initialize = initialize; params.check_required = check_required; params.check_ambiguity = 0; params.print_errors = 1; result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); return result; } int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) { int result = EXIT_SUCCESS; if (cmdline_parser_required2(args_info, prog_name, 0) > 0) result = EXIT_FAILURE; return result; } int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) { int error = 0; FIX_UNUSED (additional_error); /* checks for required options */ if (check_multiple_option_occurrences(prog_name, args_info->verbose_given, args_info->verbose_min, args_info->verbose_max, "'--verbose' ('-v')")) error = 1; /* checks for dependences among options */ return error; } static char *package_name = 0; /** * @brief updates an option * @param field the generic pointer to the field to update * @param orig_field the pointer to the orig field * @param field_given the pointer to the number of occurrence of this option * @param prev_given the pointer to the number of occurrence already seen * @param value the argument for this option (if null no arg was specified) * @param possible_values the possible values for this option (if specified) * @param default_value the default value (in case the option only accepts fixed values) * @param arg_type the type of this option * @param check_ambiguity @see cmdline_parser_params.check_ambiguity * @param override @see cmdline_parser_params.override * @param no_free whether to free a possible previous value * @param multiple_option whether this is a multiple option * @param long_opt the corresponding long option * @param short_opt the corresponding short option (or '-' if none) * @param additional_error possible further error specification */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, int check_ambiguity, int override, int no_free, int multiple_option, const char *long_opt, char short_opt, const char *additional_error) { char *stop_char = 0; const char *val = value; int found; char **string_field; FIX_UNUSED (field); stop_char = 0; found = 0; if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) { if (short_opt != '-') fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", package_name, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: `--%s' option given more than once%s\n", package_name, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } FIX_UNUSED (default_value); if (field_given && *field_given && ! override) return 0; if (prev_given) (*prev_given)++; if (field_given) (*field_given)++; if (possible_values) val = possible_values[found]; switch(arg_type) { case ARG_FLAG: *((int *)field) = !*((int *)field); break; case ARG_SHORT: if (val) *((short *)field) = (short)strtol (val, &stop_char, 0); break; case ARG_STRING: if (val) { string_field = (char **)field; if (!no_free && *string_field) free (*string_field); /* free previous string */ *string_field = gengetopt_strdup (val); } break; default: break; }; /* check numeric conversion */ switch(arg_type) { case ARG_SHORT: if (val && !(stop_char && *stop_char == '\0')) { fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val); return 1; /* failure */ } break; default: ; }; /* store the original value */ switch(arg_type) { case ARG_NO: case ARG_FLAG: break; default: if (value && orig_field) { if (no_free) { *orig_field = value; } else { if (*orig_field) free (*orig_field); /* free previous string */ *orig_field = gengetopt_strdup (value); } } }; return 0; /* OK */ } int cmdline_parser_internal ( int argc, char **argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; int override; int initialize; int check_required; int check_ambiguity; package_name = argv[0]; override = params->override; initialize = params->initialize; check_required = params->check_required; check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); cmdline_parser_init (&local_args_info); optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?'; while (1) { int option_index = 0; static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, { "listen", 1, NULL, 'l' }, { "setuid", 1, NULL, 'u' }, { "no-tls", 0, NULL, 0 }, { "x509cafile", 1, NULL, 0 }, { "x509certfile", 1, NULL, 0 }, { "x509crlfile", 1, NULL, 0 }, { "x509keyfile", 1, NULL, 0 }, { "resume-limit", 1, NULL, 0 }, { "configuration-file", 1, NULL, 'c' }, { "verbose", 0, NULL, 'v' }, { "quiet", 0, NULL, 'q' }, { 0, 0, 0, 0 } }; c = getopt_long (argc, argv, "hVl:u:c:vq", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ switch (c) { case 'h': /* Print help and exit. */ if (update_arg( 0 , 0 , &(args_info->help_given), &(local_args_info.help_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "help", 'h', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'V': /* Print version and exit. */ if (update_arg( 0 , 0 , &(args_info->version_given), &(local_args_info.version_given), optarg, 0, 0, ARG_NO, check_ambiguity, override, 0, 0, "version", 'V', additional_error)) goto failure; cmdline_parser_free (&local_args_info); return 0; break; case 'l': /* Sockets to listen for queries on. Family is `IPv4' or `IPv6', if absent the family is decided by gethostbyname(ADDR). An address of `*' indicates all addresses on the local host. The default is `*:kerberos/udp, *:kerberos/tcp'.. */ if (update_arg( (void *)&(args_info->listen_arg), &(args_info->listen_orig), &(args_info->listen_given), &(local_args_info.listen_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "listen", 'l', additional_error)) goto failure; break; case 'u': /* After binding socket, set user identity.. */ if (update_arg( (void *)&(args_info->setuid_arg), &(args_info->setuid_orig), &(args_info->setuid_given), &(local_args_info.setuid_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "setuid", 'u', additional_error)) goto failure; break; case 'c': /* Use specified configuration file.. */ if (update_arg( (void *)&(args_info->configuration_file_arg), &(args_info->configuration_file_orig), &(args_info->configuration_file_given), &(local_args_info.configuration_file_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "configuration-file", 'c', additional_error)) goto failure; break; case 'v': /* Produce verbose output. Use multiple times to increase amount of information.. */ local_args_info.verbose_given++; break; case 'q': /* Don't produce any diagnostic output. . */ if (update_arg((void *)&(args_info->quiet_flag), 0, &(args_info->quiet_given), &(local_args_info.quiet_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "quiet", 'q', additional_error)) goto failure; break; case 0: /* Long option with no short option */ /* Disable TLS support. */ if (strcmp (long_options[option_index].name, "no-tls") == 0) { if (update_arg((void *)&(args_info->no_tls_flag), 0, &(args_info->no_tls_given), &(local_args_info.no_tls_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-tls", '-', additional_error)) goto failure; } /* X.509 certificate authorities used to verify client certificates, in PEM format.. */ else if (strcmp (long_options[option_index].name, "x509cafile") == 0) { if (update_arg( (void *)&(args_info->x509cafile_arg), &(args_info->x509cafile_orig), &(args_info->x509cafile_given), &(local_args_info.x509cafile_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "x509cafile", '-', additional_error)) goto failure; } /* X.509 server certificate, in PEM format.. */ else if (strcmp (long_options[option_index].name, "x509certfile") == 0) { if (update_arg( (void *)&(args_info->x509certfile_arg), &(args_info->x509certfile_orig), &(args_info->x509certfile_given), &(local_args_info.x509certfile_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "x509certfile", '-', additional_error)) goto failure; } /* X.509 certificate revocation list to check for revoked client certificates, in PEM format.. */ else if (strcmp (long_options[option_index].name, "x509crlfile") == 0) { if (update_arg( (void *)&(args_info->x509crlfile_arg), &(args_info->x509crlfile_orig), &(args_info->x509crlfile_given), &(local_args_info.x509crlfile_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "x509crlfile", '-', additional_error)) goto failure; } /* X.509 server certificate key, in PEM format.. */ else if (strcmp (long_options[option_index].name, "x509keyfile") == 0) { if (update_arg( (void *)&(args_info->x509keyfile_arg), &(args_info->x509keyfile_orig), &(args_info->x509keyfile_given), &(local_args_info.x509keyfile_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "x509keyfile", '-', additional_error)) goto failure; } /* Keep track of up to this many TLS sessions for resume purposes (0 to disable TLS resume).. */ else if (strcmp (long_options[option_index].name, "resume-limit") == 0) { if (update_arg( (void *)&(args_info->resume_limit_arg), &(args_info->resume_limit_orig), &(args_info->resume_limit_given), &(local_args_info.resume_limit_given), optarg, 0, "50", ARG_SHORT, check_ambiguity, override, 0, 0, "resume-limit", '-', additional_error)) goto failure; } break; case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ goto failure; default: /* bug: option not considered. */ fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ args_info->verbose_given += local_args_info.verbose_given; local_args_info.verbose_given = 0; if (check_required) { error += cmdline_parser_required2 (args_info, argv[0], additional_error); } cmdline_parser_release (&local_args_info); if ( error ) return (EXIT_FAILURE); return 0; failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } shishi-1.0.2/src/gl/0000755000000000000000000000000012126773313011146 500000000000000shishi-1.0.2/src/gl/error.h0000644000000000000000000000474612126660073012401 00000000000000/* Declaration for error-reporting function Copyright (C) 1995-1997, 2003, 2006, 2008-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifndef _ERROR_H #define _ERROR_H 1 /* The __attribute__ feature is available in gcc versions 2.5 and later. The __-protected variants of the attributes 'format' and 'printf' are accepted by gcc versions 2.6.4 (effectively 2.7) and later. We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because gnulib and libintl do '#define printf __printf__' when they override the 'printf' function. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ #endif #ifdef __cplusplus extern "C" { #endif /* Print a message with 'fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). If STATUS is nonzero, terminate the program with 'exit (STATUS)'. */ extern void error (int __status, int __errnum, const char *__format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 5, 6)); /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ extern void (*error_print_progname) (void); /* This variable is incremented each time 'error' is called. */ extern unsigned int error_message_count; /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ extern int error_one_per_line; #ifdef __cplusplus } #endif #endif /* error.h */ shishi-1.0.2/src/gl/version-etc.c0000644000000000000000000002176512126660073013501 00000000000000/* Print --version and bug-reporting information in a consistent format. Copyright (C) 1999-2013 Free Software Foundation, Inc. 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 . */ /* Written by Jim Meyering. */ #include /* Specification. */ #include "version-etc.h" #include #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #include "gettext.h" #define _(msgid) gettext (msgid) /* If you use AM_INIT_AUTOMAKE's no-define option, PACKAGE is not defined. Use PACKAGE_TARNAME instead. */ #if ! defined PACKAGE && defined PACKAGE_TARNAME # define PACKAGE PACKAGE_TARNAME #endif enum { COPYRIGHT_YEAR = 2013 }; /* The three functions below display the --version information the standard way. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The functions differ in the way they are passed author names. */ /* Display the --version information the standard way. Author names are given in the array AUTHORS. N_AUTHORS is the number of elements in the array. */ void version_etc_arn (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors, size_t n_authors) { if (command_name) fprintf (stream, "%s (%s) %s\n", command_name, package, version); else fprintf (stream, "%s %s\n", package, version); #ifdef PACKAGE_PACKAGER # ifdef PACKAGE_PACKAGER_VERSION fprintf (stream, _("Packaged by %s (%s)\n"), PACKAGE_PACKAGER, PACKAGE_PACKAGER_VERSION); # else fprintf (stream, _("Packaged by %s\n"), PACKAGE_PACKAGER); # endif #endif /* TRANSLATORS: Translate "(C)" to the copyright symbol (C-in-a-circle), if this symbol is available in the user's locale. Otherwise, do not translate "(C)"; leave it as-is. */ fprintf (stream, version_etc_copyright, _("(C)"), COPYRIGHT_YEAR); fputs (_("\ \n\ License GPLv3+: GNU GPL version 3 or later .\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n\ \n\ "), stream); switch (n_authors) { case 0: /* The caller must provide at least one author name. */ abort (); case 1: /* TRANSLATORS: %s denotes an author name. */ fprintf (stream, _("Written by %s.\n"), authors[0]); break; case 2: /* TRANSLATORS: Each %s denotes an author name. */ fprintf (stream, _("Written by %s and %s.\n"), authors[0], authors[1]); break; case 3: /* TRANSLATORS: Each %s denotes an author name. */ fprintf (stream, _("Written by %s, %s, and %s.\n"), authors[0], authors[1], authors[2]); break; case 4: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors[0], authors[1], authors[2], authors[3]); break; case 5: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4]); break; case 6: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5]); break; case 7: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6]); break; case 8: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7]); break; case 9: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7], authors[8]); break; default: /* 10 or more authors. Use an abbreviation, since the human reader will probably not want to read the entire list anyway. */ /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"), authors[0], authors[1], authors[2], authors[3], authors[4], authors[5], authors[6], authors[7], authors[8]); break; } } /* Display the --version information the standard way. See the initial comment to this module, for more information. Author names are given in the NULL-terminated array AUTHORS. */ void version_etc_ar (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors) { size_t n_authors; for (n_authors = 0; authors[n_authors]; n_authors++) ; version_etc_arn (stream, command_name, package, version, authors, n_authors); } /* Display the --version information the standard way. See the initial comment to this module, for more information. Author names are given in the NULL-terminated va_list AUTHORS. */ void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors) { size_t n_authors; const char *authtab[10]; for (n_authors = 0; n_authors < 10 && (authtab[n_authors] = va_arg (authors, const char *)) != NULL; n_authors++) ; version_etc_arn (stream, command_name, package, version, authtab, n_authors); } /* Display the --version information the standard way. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The authors names are passed as separate arguments, with an additional NULL argument at the end. */ void version_etc (FILE *stream, const char *command_name, const char *package, const char *version, /* const char *author1, ...*/ ...) { va_list authors; va_start (authors, version); version_etc_va (stream, command_name, package, version, authors); va_end (authors); } void emit_bug_reporting_address (void) { /* TRANSLATORS: The placeholder indicates the bug-reporting address for this package. Please add _another line_ saying "Report translation bugs to <...>\n" with the address for translation bugs (typically your translation team's web or email address). */ printf (_("\nReport bugs to: %s\n"), PACKAGE_BUGREPORT); #ifdef PACKAGE_PACKAGER_BUG_REPORTS printf (_("Report %s bugs to: %s\n"), PACKAGE_PACKAGER, PACKAGE_PACKAGER_BUG_REPORTS); #endif #ifdef PACKAGE_URL printf (_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); #else printf (_("%s home page: \n"), PACKAGE_NAME, PACKAGE); #endif fputs (_("General help using GNU software: \n"), stdout); } shishi-1.0.2/src/gl/msvc-nothrow.h0000644000000000000000000000301012126660073013675 00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _MSVC_NOTHROW_H #define _MSVC_NOTHROW_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines wrappers that turn such an invalid parameter notification into an error code. */ #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get original declaration of _get_osfhandle. */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Override _get_osfhandle. */ extern intptr_t _gl_nothrow_get_osfhandle (int fd); # define _get_osfhandle _gl_nothrow_get_osfhandle # endif #endif #endif /* _MSVC_NOTHROW_H */ shishi-1.0.2/src/gl/error.c0000644000000000000000000002407012126660073012364 00000000000000/* Error handler for noninteractive utilities Copyright (C) 1990-1998, 2000-2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ /* Written by David MacKenzie . */ #if !_LIBC # include #endif #include "error.h" #include #include #include #include #if !_LIBC && ENABLE_NLS # include "gettext.h" # define _(msgid) gettext (msgid) #endif #ifdef _LIBC # include # include # include # include # define mbsrtowcs __mbsrtowcs #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifndef _ # define _(String) String #endif /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ void (*error_print_progname) (void); /* This variable is incremented each time 'error' is called. */ unsigned int error_message_count; #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ # define program_name program_invocation_name # include # include # include /* In GNU libc we want do not want to use the common name 'error' directly. Instead make it a weak alias. */ extern void __error (int status, int errnum, const char *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void __error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) __attribute__ ((__format__ (__printf__, 5, 6)));; # define error __error # define error_at_line __error_at_line # include # define fflush(s) INTUSE(_IO_fflush) (s) # undef putc # define putc(c, fp) INTUSE(_IO_putc) (c, fp) # include #else /* not _LIBC */ # include # include # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include /* Get _get_osfhandle. */ # include "msvc-nothrow.h" # endif /* The gnulib override of fcntl is not needed in this file. */ # undef fcntl # if !HAVE_DECL_STRERROR_R # ifndef HAVE_DECL_STRERROR_R "this configure-time declaration test was not run" # endif # if STRERROR_R_CHAR_P char *strerror_r (); # else int strerror_r (); # endif # endif /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; # if HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # endif /* HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ #if !_LIBC /* Return non-zero if FD is open. */ static int is_open (int fd) { # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* On native Windows: The initial state of unassigned standard file descriptors is that they are open but point to an INVALID_HANDLE_VALUE. There is no fcntl, and the gnulib replacement fcntl does not support F_GETFL. */ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE; # else # ifndef F_GETFL # error Please port fcntl to your platform # endif return 0 <= fcntl (fd, F_GETFL); # endif } #endif static void flush_stdout (void) { #if !_LIBC int stdout_fd; # if GNULIB_FREOPEN_SAFER /* Use of gnulib's freopen-safer module normally ensures that fileno (stdout) == 1 whenever stdout is open. */ stdout_fd = STDOUT_FILENO; # else /* POSIX states that fileno (stdout) after fclose is unspecified. But in practice it is not a problem, because stdout is statically allocated and the fd of a FILE stream is stored as a field in its allocated memory. */ stdout_fd = fileno (stdout); # endif /* POSIX states that fflush (stdout) after fclose is unspecified; it is safe in glibc, but not on all other platforms. fflush (NULL) is always defined, but too draconian. */ if (0 <= stdout_fd && is_open (stdout_fd)) #endif fflush (stdout); } static void print_errno_message (int errnum) { char const *s; #if defined HAVE_STRERROR_R || _LIBC char errbuf[1024]; # if STRERROR_R_CHAR_P || _LIBC s = __strerror_r (errnum, errbuf, sizeof errbuf); # else if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) s = errbuf; else s = 0; # endif #else s = strerror (errnum); #endif #if !_LIBC if (! s) s = _("Unknown system error"); #endif #if _LIBC __fxprintf (NULL, ": %s", s); #else fprintf (stderr, ": %s", s); #endif } static void error_tail (int status, int errnum, const char *message, va_list args) { #if _LIBC if (_IO_fwide (stderr, 0) > 0) { # define ALLOCA_LIMIT 2000 size_t len = strlen (message) + 1; wchar_t *wmessage = NULL; mbstate_t st; size_t res; const char *tmp; bool use_malloc = false; while (1) { if (__libc_use_alloca (len * sizeof (wchar_t))) wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); else { if (!use_malloc) wmessage = NULL; wchar_t *p = (wchar_t *) realloc (wmessage, len * sizeof (wchar_t)); if (p == NULL) { free (wmessage); fputws_unlocked (L"out of memory\n", stderr); return; } wmessage = p; use_malloc = true; } memset (&st, '\0', sizeof (st)); tmp = message; res = mbsrtowcs (wmessage, &tmp, len, &st); if (res != len) break; if (__builtin_expect (len >= SIZE_MAX / 2, 0)) { /* This really should not happen if everything is fine. */ res = (size_t) -1; break; } len *= 2; } if (res == (size_t) -1) { /* The string cannot be converted. */ if (use_malloc) { free (wmessage); use_malloc = false; } wmessage = (wchar_t *) L"???"; } __vfwprintf (stderr, wmessage, args); if (use_malloc) free (wmessage); } else #endif vfprintf (stderr, message, args); va_end (args); ++error_message_count; if (errnum) print_errno_message (errnum); #if _LIBC __fxprintf (NULL, "\n"); #else putc ('\n', stderr); #endif fflush (stderr); if (status) exit (status); } /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. If ERRNUM is nonzero, print its corresponding system error message. Exit with status STATUS if it is nonzero. */ void error (int status, int errnum, const char *message, ...) { va_list args; #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif flush_stdout (); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s: ", program_name); #else fprintf (stderr, "%s: ", program_name); #endif } va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ int error_one_per_line; void error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) { va_list args; if (error_one_per_line) { static const char *old_file_name; static unsigned int old_line_number; if (old_line_number == line_number && (file_name == old_file_name || strcmp (old_file_name, file_name) == 0)) /* Simply return and print nothing. */ return; old_file_name = file_name; old_line_number = line_number; } #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif flush_stdout (); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s:", program_name); #else fprintf (stderr, "%s:", program_name); #endif } #if _LIBC __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #else fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #endif va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } #ifdef _LIBC /* Make the weak alias. */ # undef error # undef error_at_line weak_alias (__error, error) weak_alias (__error_at_line, error_at_line) #endif shishi-1.0.2/src/gl/version-etc.h0000644000000000000000000000555512126660073013505 00000000000000/* Print --version and bug-reporting information in a consistent format. Copyright (C) 1999, 2003, 2005, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Jim Meyering. */ #ifndef VERSION_ETC_H # define VERSION_ETC_H 1 # include # include /* The 'sentinel' attribute was added in gcc 4.0. */ #ifndef _GL_ATTRIBUTE_SENTINEL # if 4 <= __GNUC__ # define _GL_ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) # else # define _GL_ATTRIBUTE_SENTINEL /* empty */ # endif #endif extern const char version_etc_copyright[]; /* The three functions below display the --version information in the standard way: command and package names, package version, followed by a short GPLv3+ notice and a list of up to 10 author names. If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of the program. The formats are therefore: PACKAGE VERSION or COMMAND_NAME (PACKAGE) VERSION. The functions differ in the way they are passed author names: */ /* N_AUTHORS names are supplied in array AUTHORS. */ extern void version_etc_arn (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors, size_t n_authors); /* Names are passed in the NULL-terminated array AUTHORS. */ extern void version_etc_ar (FILE *stream, const char *command_name, const char *package, const char *version, const char * const * authors); /* Names are passed in the NULL-terminated va_list. */ extern void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors); /* Names are passed as separate arguments, with an additional NULL argument at the end. */ extern void version_etc (FILE *stream, const char *command_name, const char *package, const char *version, /* const char *author1, ..., NULL */ ...) _GL_ATTRIBUTE_SENTINEL; /* Display the usual "Report bugs to" stanza. */ extern void emit_bug_reporting_address (void); #endif /* VERSION_ETC_H */ shishi-1.0.2/src/gl/strerror.c0000644000000000000000000000404312126660073013113 00000000000000/* strerror.c --- POSIX compatible system error routine Copyright (C) 2007-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include #include #include #include #include #include "intprops.h" #include "strerror-override.h" #include "verify.h" /* Use the system functions, not the gnulib overrides in this file. */ #undef sprintf char * strerror (int n) #undef strerror { static char buf[STACKBUF_LEN]; size_t len; /* Cast away const, due to the historical signature of strerror; callers should not be modifying the string. */ const char *msg = strerror_override (n); if (msg) return (char *) msg; msg = strerror (n); /* Our strerror_r implementation might use the system's strerror buffer, so all other clients of strerror have to see the error copied into a buffer that we manage. This is not thread-safe, even if the system strerror is, but portable programs shouldn't be using strerror if they care about thread-safety. */ if (!msg || !*msg) { static char const fmt[] = "Unknown error %d"; verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n)); sprintf (buf, fmt, n); errno = EINVAL; return buf; } /* Fix STACKBUF_LEN if this ever aborts. */ len = strlen (msg); if (sizeof buf <= len) abort (); return memcpy (buf, msg, len + 1); } shishi-1.0.2/src/gl/progname.c0000644000000000000000000000615012126660073013042 00000000000000/* Program name management. Copyright (C) 2001-2003, 2005-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 . */ #include /* Specification. */ #undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */ #include "progname.h" #include /* get program_invocation_name declaration */ #include #include #include /* String containing name the program is called with. To be initialized by main(). */ const char *program_name = NULL; /* Set program_name, based on argv[0]. argv0 must be a string allocated with indefinite extent, and must not be modified after this call. */ void set_program_name (const char *argv0) { /* libtool creates a temporary executable whose name is sometimes prefixed with "lt-" (depends on the platform). It also makes argv[0] absolute. But the name of the temporary executable is a detail that should not be visible to the end user and to the test suite. Remove this "/.libs/" or "/.libs/lt-" prefix here. */ const char *slash; const char *base; /* Sanity check. POSIX requires the invoking process to pass a non-NULL argv[0]. */ if (argv0 == NULL) { /* It's a bug in the invoking program. Help diagnosing it. */ fputs ("A NULL argv[0] was passed through an exec system call.\n", stderr); abort (); } slash = strrchr (argv0, '/'); base = (slash != NULL ? slash + 1 : argv0); if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0) { argv0 = base; if (strncmp (base, "lt-", 3) == 0) { argv0 = base + 3; /* On glibc systems, remove the "lt-" prefix from the variable program_invocation_short_name. */ #if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME program_invocation_short_name = (char *) argv0; #endif } } /* But don't strip off a leading / in general, because when the user runs /some/hidden/place/bin/cp foo foo he should get the error message /some/hidden/place/bin/cp: `foo' and `foo' are the same file not cp: `foo' and `foo' are the same file */ program_name = argv0; /* On glibc systems, the error() function comes from libc and uses the variable program_invocation_name, not program_name. So set this variable as well. */ #if HAVE_DECL_PROGRAM_INVOCATION_NAME program_invocation_name = (char *) argv0; #endif } shishi-1.0.2/src/gl/getopt.c0000644000000000000000000011750412126660073012542 00000000000000/* Getopt for GNU. NOTE: getopt is part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifndef _LIBC # include #endif #include "getopt.h" #include #include #include #include #ifdef _LIBC # include #else # include "gettext.h" # define _(msgid) gettext (msgid) #endif #if defined _LIBC && defined USE_IN_LIBIO # include #endif /* This version of 'getopt' appears to the caller like standard Unix 'getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As 'getopt_long' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Using 'getopt' or setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt_int.h" /* For communication from 'getopt' to the caller. When 'getopt' finds an option that takes an argument, the argument value is returned here. Also, when 'ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to 'getopt'. On entry to 'getopt', zero means this is the first call; initialize. When 'getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, 'optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Keep a global copy of all internal members of getopt_data. */ static struct _getopt_data getopt_data; #if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV extern char *getenv (); #endif #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (d->__nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. 'first_nonopt' and 'last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv, struct _getopt_data *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the '__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, d->__nonoption_flags_max_len), '\0', top + 1 - d->__nonoption_flags_max_len); d->__nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } /* Initialize the internal data when the first call is made. */ static const char * _getopt_initialize (int argc _GL_UNUSED, char **argv _GL_UNUSED, const char *optstring, struct _getopt_data *d, int posixly_correct) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (d->__posixly_correct) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv) { if (d->__nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') d->__nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = d->__nonoption_flags_max_len = strlen (orig_str); if (d->__nonoption_flags_max_len < argc) d->__nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (d->__nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) d->__nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', d->__nonoption_flags_max_len - len); } } d->__nonoption_flags_len = d->__nonoption_flags_max_len; } else d->__nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If 'getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If 'getopt' finds another option character, it returns that character, updating 'optind' and 'nextchar' so that the next call to 'getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, 'getopt' returns -1. Then 'optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set 'opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in 'optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in 'optarg', otherwise 'optarg' is set to zero. If OPTSTRING starts with '-' or '+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with '--' instead of '-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a '=', or else the in next ARGV-element. When 'getopt' finds a long-named option, it returns 0 if that option's 'flag' field is nonzero, the value of the option's 'val' field if the 'flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of 'struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal_r (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, struct _getopt_data *d, int posixly_correct) { int print_errors = d->opterr; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) { if (d->optind == 0) d->optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct); d->__initialized = 1; } else if (optstring[0] == '-' || optstring[0] == '+') optstring++; if (optstring[0] == ':') print_errors = 0; /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ || (d->optind < d->__nonoption_flags_len \ && __getopt_nonoption_flags[d->optind] == '1')) #else # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') #endif if (d->__nextchar == NULL || *d->__nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (d->optind < argc && NONOPTION_P) d->optind++; d->__last_nonopt = d->optind; } /* The special ARGV-element '--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (d->optind != argc && !strcmp (argv[d->optind], "--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (d->optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr (optstring, argv[d->optind][1]))))) { char *nameend; unsigned int namelen; const struct option *p; const struct option *pfound = NULL; struct option_list { const struct option *p; struct option_list *next; } *ambig_list = NULL; int exact = 0; int indfound = -1; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; namelen = nameend - d->__nextchar; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, namelen)) { if (namelen == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) { /* Second or later nonexact match found. */ struct option_list *newp = malloc (sizeof (*newp)); newp->p = p; newp->next = ambig_list; ambig_list = newp; } } if (ambig_list != NULL && !exact) { if (print_errors) { struct option_list first; first.p = pfound; first.next = ambig_list; ambig_list = &first; #if defined _LIBC && defined USE_IN_LIBIO char *buf = NULL; size_t buflen = 0; FILE *fp = open_memstream (&buf, &buflen); if (fp != NULL) { fprintf (fp, _("%s: option '%s' is ambiguous; possibilities:"), argv[0], argv[d->optind]); do { fprintf (fp, " '--%s'", ambig_list->p->name); ambig_list = ambig_list->next; } while (ambig_list != NULL); fputc_unlocked ('\n', fp); if (__builtin_expect (fclose (fp) != EOF, 1)) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } } #else fprintf (stderr, _("%s: option '%s' is ambiguous; possibilities:"), argv[0], argv[d->optind]); do { fprintf (stderr, " '--%s'", ambig_list->p->name); ambig_list = ambig_list->next; } while (ambig_list != NULL); fputc ('\n', stderr); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; d->optopt = 0; return '?'; } while (ambig_list != NULL) { struct option_list *pn = ambig_list->next; free (ambig_list); ambig_list = pn; } if (pfound != NULL) { option_index = indfound; d->optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option '--%s' doesn't allow an argument\n"), argv[0], pfound->name); #else fprintf (stderr, _("\ %s: option '--%s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option '%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option '%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option '--%s' requires an argument\n"), argv[0], pfound->name) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option '--%s' requires an argument\n"), argv[0], pfound->name); #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[d->optind][1] == '-' || strchr (optstring, *d->__nextchar) == NULL) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"), argv[0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option '--%s'\n"), argv[0], d->__nextchar); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option '%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar = (char *) ""; d->optind++; d->optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *d->__nextchar++; const char *temp = strchr (optstring, c); /* Increment 'optind' when we start to process its last character. */ if (*d->__nextchar == '\0') ++d->optind; if (temp == NULL || c == ':' || c == ';') { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"), argv[0], c); #else fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c); #endif #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; if (longopts == NULL) goto no_longs; /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option requires an argument -- '%c'\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- '%c'\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented 'd->optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"), argv[0], d->optarg) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"), argv[0], d->optarg); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option '-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("\ %s: option '-W %s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } d->__nextchar += strlen (d->__nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option '-W %s' requires an argument\n"), argv[0], pfound->name) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("\ %s: option '-W %s' requires an argument\n"), argv[0], pfound->name); #endif } d->__nextchar += strlen (d->__nextchar); return optstring[0] == ':' ? ':' : '?'; } } else d->optarg = NULL; d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } no_longs: d->__nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option requires an argument -- '%c'\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- '%c'\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented 'optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data.optind = optind; getopt_data.opterr = opterr; result = _getopt_internal_r (argc, argv, optstring, longopts, longind, long_only, &getopt_data, posixly_correct); optind = getopt_data.optind; optarg = getopt_data.optarg; optopt = getopt_data.optopt; return result; } /* glibc gets a LSB-compliant getopt. Standalone applications get a POSIX-compliant getopt. */ #if _LIBC enum { POSIXLY_CORRECT = 0 }; #else enum { POSIXLY_CORRECT = 1 }; #endif int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, (char **) argv, optstring, (const struct option *) 0, (int *) 0, 0, POSIXLY_CORRECT); } #ifdef _LIBC int __posix_getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0, 1); } #endif #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of 'getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value '%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ shishi-1.0.2/src/gl/Makefile.am0000664000000000000000000000052512015626624013125 00000000000000AUTOMAKE_OPTIONS = 1.5 gnits noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = EXTRA_DIST = BUILT_SOURCES = SUFFIXES = MOSTLYCLEANFILES = MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl include gnulib.mk libgnu_la_LIBADD += $(top_builddir)/gl/libgnu.la shishi-1.0.2/src/gl/m4/0000755000000000000000000000000012126773311011464 500000000000000shishi-1.0.2/src/gl/m4/nocrash.m40000644000000000000000000001055512126660073013311 00000000000000# nocrash.m4 serial 4 dnl Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini. AC_PREREQ([2.13]) dnl Expands to some code for use in .c programs that will cause the configure dnl test to exit instead of crashing. This is useful to avoid triggering dnl action from a background debugger and to avoid core dumps. dnl Usage: ... dnl ]GL_NOCRASH[ dnl ... dnl int main() { nocrash_init(); ... } AC_DEFUN([GL_NOCRASH],[[ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include /* A POSIX signal handler. */ static void exception_handler (int sig) { exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif ]]) shishi-1.0.2/src/gl/m4/gnulib-comp.m40000644000000000000000000002423012126660075014065 00000000000000# DO NOT EDIT! GENERATED AUTOMATICALLY! # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. # In projects that use version control, this file can be treated like # other built files. # This macro should be invoked from ./configure.ac, in the section # "Checks for programs", right after AC_PROG_CC, and certainly before # any checks for libraries, header files, types and library functions. AC_DEFUN([gl2_EARLY], [ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace m4_pattern_allow([^gl_ES$])dnl a valid locale name m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable AC_REQUIRE([gl_PROG_AR_RANLIB]) # Code from module errno: # Code from module error: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module locale: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module nocrash: # Code from module progname: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module stddef: # Code from module strerror: # Code from module strerror-override: # Code from module verify: # Code from module version-etc: ]) # This macro should be invoked from ./configure.ac, in the section # "Check for header files, types and library functions". AC_DEFUN([gl2_INIT], [ AM_CONDITIONAL([GL_COND_LIBTOOL], [true]) gl_cond_libtool=true gl_m4_base='src/gl/m4' m4_pushdef([AC_LIBOBJ], m4_defn([gl2_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl2_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl2_LIBSOURCES])) m4_pushdef([gl2_LIBSOURCES_LIST], []) m4_pushdef([gl2_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='src/gl' gl_HEADER_ERRNO_H gl_ERROR if test $ac_cv_lib_error_at_line = no; then AC_LIBOBJ([error]) gl_PREREQ_ERROR fi m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=error:3:c-format]) AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) gl_FUNC_GETOPT_GNU if test $REPLACE_GETOPT = 1; then AC_LIBOBJ([getopt]) AC_LIBOBJ([getopt1]) gl_PREREQ_GETOPT dnl Arrange for unistd.h to include getopt.h. GNULIB_GL_GL2_UNISTD_H_GETOPT=1 fi AC_SUBST([GNULIB_GL_GL2_UNISTD_H_GETOPT]) gl_MODULE_INDICATOR_FOR_TESTS([getopt-gnu]) gl_FUNC_GETOPT_POSIX if test $REPLACE_GETOPT = 1; then AC_LIBOBJ([getopt]) AC_LIBOBJ([getopt1]) gl_PREREQ_GETOPT dnl Arrange for unistd.h to include getopt.h. GNULIB_GL_GL2_UNISTD_H_GETOPT=1 fi AC_SUBST([GNULIB_GL_GL2_UNISTD_H_GETOPT]) gl_LOCALE_H gl_MSVC_INVAL if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-inval]) fi gl_MSVC_NOTHROW if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-nothrow]) fi AC_CHECK_DECLS([program_invocation_name], [], [], [#include ]) AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include ]) gl_STDDEF_H gl_FUNC_STRERROR if test $REPLACE_STRERROR = 1; then AC_LIBOBJ([strerror]) fi gl_MODULE_INDICATOR([strerror]) gl_STRING_MODULE_INDICATOR([strerror]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then AC_LIBOBJ([strerror-override]) gl_PREREQ_SYS_H_WINSOCK2 fi gl_VERSION_ETC # End of code from modules m4_ifval(gl2_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl2_LIBSOURCES_DIR])[ || for gl_file in ]gl2_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl2_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl2_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl2_LIBSOURCES_DIR]) m4_popdef([gl2_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl2_libobjs= gl2_ltlibobjs= if test -n "$gl2_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl2_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl2_libobjs="$gl2_libobjs $i.$ac_objext" gl2_ltlibobjs="$gl2_ltlibobjs $i.lo" done fi AC_SUBST([gl2_LIBOBJS], [$gl2_libobjs]) AC_SUBST([gl2_LTLIBOBJS], [$gl2_ltlibobjs]) ]) gltests_libdeps= gltests_ltlibdeps= m4_pushdef([AC_LIBOBJ], m4_defn([gl2tests_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl2tests_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl2tests_LIBSOURCES])) m4_pushdef([gl2tests_LIBSOURCES_LIST], []) m4_pushdef([gl2tests_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='tests' changequote(,)dnl gl2tests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS changequote([, ])dnl AC_SUBST([gl2tests_WITNESS]) gl_module_indicator_condition=$gl2tests_WITNESS m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) m4_popdef([gl_MODULE_INDICATOR_CONDITION]) m4_ifval(gl2tests_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl2tests_LIBSOURCES_DIR])[ || for gl_file in ]gl2tests_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl2tests_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl2tests_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl2tests_LIBSOURCES_DIR]) m4_popdef([gl2tests_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl2tests_libobjs= gl2tests_ltlibobjs= if test -n "$gl2tests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl2tests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl2tests_libobjs="$gl2tests_libobjs $i.$ac_objext" gl2tests_ltlibobjs="$gl2tests_ltlibobjs $i.lo" done fi AC_SUBST([gl2tests_LIBOBJS], [$gl2tests_libobjs]) AC_SUBST([gl2tests_LTLIBOBJS], [$gl2tests_ltlibobjs]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl2_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl2_LIBOBJ], [ AS_LITERAL_IF([$1], [gl2_LIBSOURCES([$1.c])])dnl gl2_LIBOBJS="$gl2_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl2_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl2_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl2_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl2_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl2_LIBSOURCES_DIR], [src/gl]) m4_append([gl2_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl2tests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl2tests_LIBOBJ], [ AS_LITERAL_IF([$1], [gl2tests_LIBSOURCES([$1.c])])dnl gl2tests_LIBOBJS="$gl2tests_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl2tests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl2tests_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl2tests_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl2tests_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl2tests_LIBSOURCES_DIR], [tests]) m4_append([gl2tests_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([gl2_FILE_LIST], [ build-aux/snippet/arg-nonnull.h build-aux/snippet/c++defs.h build-aux/snippet/warn-on-use.h lib/errno.in.h lib/error.c lib/error.h lib/getopt.c lib/getopt.in.h lib/getopt1.c lib/getopt_int.h lib/locale.in.h lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c lib/msvc-nothrow.h lib/progname.c lib/progname.h lib/stddef.in.h lib/strerror-override.c lib/strerror-override.h lib/strerror.c lib/verify.h lib/version-etc.c lib/version-etc.h m4/00gnulib.m4 m4/errno_h.m4 m4/error.m4 m4/getopt.m4 m4/gnulib-common.m4 m4/locale_h.m4 m4/msvc-inval.m4 m4/msvc-nothrow.m4 m4/nocrash.m4 m4/stddef_h.m4 m4/strerror.m4 m4/sys_socket_h.m4 m4/version-etc.m4 m4/warn-on-use.m4 m4/wchar_t.m4 ]) shishi-1.0.2/src/gl/m4/version-etc.m40000644000000000000000000000222612126660073014106 00000000000000# version-etc.m4 serial 1 # Copyright (C) 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl $1 - configure flag and define name dnl $2 - human readable description m4_define([gl_VERSION_ETC_FLAG], [dnl AC_ARG_WITH([$1], [AS_HELP_STRING([--with-$1], [$2])], [dnl case $withval in yes|no) ;; *) AC_DEFINE_UNQUOTED(AS_TR_CPP([PACKAGE_$1]), ["$withval"], [$2]) ;; esac ]) ]) AC_DEFUN([gl_VERSION_ETC], [dnl gl_VERSION_ETC_FLAG([packager], [String identifying the packager of this software]) gl_VERSION_ETC_FLAG([packager-version], [Packager-specific version information]) gl_VERSION_ETC_FLAG([packager-bug-reports], [Packager info for bug reports (URL/e-mail/...)]) if test "X$with_packager" = "X" && \ test "X$with_packager_version$with_packager_bug_reports" != "X" then AC_MSG_ERROR([The --with-packager-{bug-reports,version} options require --with-packager]) fi ]) shishi-1.0.2/src/gl/m4/getopt.m40000644000000000000000000003013412126660073013151 00000000000000# getopt.m4 serial 44 dnl Copyright (C) 2002-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Request a POSIX compliant getopt function. AC_DEFUN([gl_FUNC_GETOPT_POSIX], [ m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX]) AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_GETOPT_CHECK_HEADERS]) dnl Other modules can request the gnulib implementation of the getopt dnl functions unconditionally, by defining gl_REPLACE_GETOPT_ALWAYS. dnl argp.m4 does this. m4_ifdef([gl_REPLACE_GETOPT_ALWAYS], [ REPLACE_GETOPT=1 ], [ REPLACE_GETOPT=0 if test -n "$gl_replace_getopt"; then REPLACE_GETOPT=1 fi ]) if test $REPLACE_GETOPT = 1; then dnl Arrange for getopt.h to be created. gl_GETOPT_SUBSTITUTE_HEADER fi ]) # Request a POSIX compliant getopt function with GNU extensions (such as # options with optional arguments) and the functions getopt_long, # getopt_long_only. AC_DEFUN([gl_FUNC_GETOPT_GNU], [ m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU]) AC_REQUIRE([gl_FUNC_GETOPT_POSIX]) ]) # Determine whether to replace the entire getopt facility. AC_DEFUN([gl_GETOPT_CHECK_HEADERS], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([AC_PROG_AWK]) dnl for awk that supports ENVIRON dnl Persuade Solaris to declare optarg, optind, opterr, optopt. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) gl_CHECK_NEXT_HEADERS([getopt.h]) if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi AC_SUBST([HAVE_GETOPT_H]) gl_replace_getopt= dnl Test whether is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes]) fi dnl Test whether the function getopt_long is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes]) fi dnl POSIX 2008 does not specify leading '+' behavior, but see dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on dnl the next version of POSIX. For now, we only guarantee leading '+' dnl behavior with getopt-gnu. if test -z "$gl_replace_getopt"; then AC_CACHE_CHECK([whether getopt is POSIX compatible], [gl_cv_func_getopt_posix], [ dnl Merging these three different test programs into a single one dnl would require a reset mechanism. On BSD systems, it can be done dnl through 'optreset'; on some others (glibc), it can be done by dnl setting 'optind' to 0; on others again (HP-UX, IRIX, OSF/1, dnl Solaris 9, musl libc), there is no such mechanism. if test $cross_compiling = no; then dnl Sanity check. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) if test $gl_cv_func_getopt_posix = maybe; then dnl Sanity check with '+'. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) fi if test $gl_cv_func_getopt_posix = maybe; then dnl Detect Mac OS X 10.5, AIX 7.1, mingw bug. AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } ]])], [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no]) fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi ]) case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu], [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. dnl GNU Coding Standards currently allow awk but not env; besides, env dnl is ambiguous with environment values that contain newlines. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" #include #include ]GL_NOCRASH[ ]], [[ int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ]])], [gl_cv_func_getopt_gnu=yes], [gl_cv_func_getopt_gnu=no], [dnl Cross compiling. Assume the worst, even on glibc platforms. gl_cv_func_getopt_gnu="guessing no" ]) case $gl_had_POSIXLY_CORRECT in exported) ;; yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;; *) AS_UNSET([POSIXLY_CORRECT]) ;; esac ]) if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else AC_CACHE_CHECK([for working GNU getopt_long function], [gl_cv_func_getopt_long_gnu], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include ]], [[static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ]])], [gl_cv_func_getopt_long_gnu=yes], [gl_cv_func_getopt_long_gnu=no], [dnl Cross compiling. Guess no on OpenBSD, yes otherwise. case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac ]) ]) case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi ]) AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], [ GETOPT_H=getopt.h AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], [Define to rpl_ if the getopt replacement functions and variables should be used.]) AC_SUBST([GETOPT_H]) ]) # Prerequisites of lib/getopt*. AC_DEFUN([gl_PREREQ_GETOPT], [ AC_CHECK_DECLS_ONCE([getenv]) ]) shishi-1.0.2/src/gl/m4/error.m40000644000000000000000000000151012126660073012774 00000000000000#serial 14 # Copyright (C) 1996-1998, 2001-2004, 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ERROR], [ dnl We don't use AC_FUNC_ERROR_AT_LINE any more, because it is no longer dnl maintained in Autoconf and because it invokes AC_LIBOBJ. AC_CACHE_CHECK([for error_at_line], [ac_cv_lib_error_at_line], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[error_at_line (0, 0, "", 0, "an error occurred");]])], [ac_cv_lib_error_at_line=yes], [ac_cv_lib_error_at_line=no])]) ]) # Prerequisites of lib/error.c. AC_DEFUN([gl_PREREQ_ERROR], [ AC_REQUIRE([AC_FUNC_STRERROR_R]) : ]) shishi-1.0.2/src/gl/m4/locale_h.m40000644000000000000000000001040112126660073013410 00000000000000# locale_h.m4 serial 19 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LOCALE_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) dnl Persuade glibc to define locale_t and the int_p_*, int_n_* dnl members of 'struct lconv'. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl If is replaced, then must also be replaced. AC_REQUIRE([gl_STDDEF_H]) dnl Solaris 11 2011-11 defines the int_p_*, int_n_* members of 'struct lconv' dnl only if _LCONV_C99 is defined. AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in solaris*) AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.]) ;; esac AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001], [gl_cv_header_locale_h_posix2001], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point);]], [[]])], [gl_cv_header_locale_h_posix2001=yes], [gl_cv_header_locale_h_posix2001=no])]) dnl Check for . AC_CHECK_HEADERS_ONCE([xlocale.h]) if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 dnl Check whether use of locale_t requires inclusion of , dnl e.g. on Mac OS X 10.5. If does not define locale_t by dnl itself, we assume that will do so. AC_CACHE_CHECK([whether locale.h defines locale_t], [gl_cv_header_locale_has_locale_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include locale_t x;]], [[]])], [gl_cv_header_locale_has_locale_t=yes], [gl_cv_header_locale_has_locale_t=no]) ]) if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no fi AC_SUBST([HAVE_XLOCALE_H]) dnl Check whether 'struct lconv' is complete. dnl Bionic libc's 'struct lconv' is just a dummy. dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members. AC_CACHE_CHECK([whether struct lconv is properly defined], [gl_cv_sys_struct_lconv_ok], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes);]], [[]])], [gl_cv_sys_struct_lconv_ok=yes], [gl_cv_sys_struct_lconv_ok=no]) ]) if test $gl_cv_sys_struct_lconv_ok = no; then REPLACE_STRUCT_LCONV=1 fi dnl is always overridden, because of GNULIB_POSIXCHECK. gl_NEXT_HEADERS([locale.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include /* Some systems provide declarations in a non-standard header. */ #if HAVE_XLOCALE_H # include #endif ]], [setlocale duplocale]) ]) AC_DEFUN([gl_LOCALE_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_LOCALE_H_DEFAULTS], [ GNULIB_LOCALECONV=0; AC_SUBST([GNULIB_LOCALECONV]) GNULIB_SETLOCALE=0; AC_SUBST([GNULIB_SETLOCALE]) GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE]) REPLACE_LOCALECONV=0; AC_SUBST([REPLACE_LOCALECONV]) REPLACE_SETLOCALE=0; AC_SUBST([REPLACE_SETLOCALE]) REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE]) REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV]) ]) shishi-1.0.2/src/gl/getopt_int.h0000644000000000000000000001174212126660073013416 00000000000000/* Internal declarations for getopt. Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifndef _GETOPT_INT_H #define _GETOPT_INT_H 1 #include extern int _getopt_internal (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct); /* Reentrant versions which can handle parsing multiple argument vectors at the same time. */ /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using '+' as the first character of the list of option characters, or by calling getopt. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using '-' as the first character of the list of option characters selects this mode of operation. The special argument '--' forces an end of option-scanning regardless of the value of 'ordering'. In the case of RETURN_IN_ORDER, only '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */ enum __ord { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; /* Data type for reentrant functions. */ struct _getopt_data { /* These have exactly the same meaning as the corresponding global variables, except that they are used for the reentrant versions of getopt. */ int optind; int opterr; int optopt; char *optarg; /* Internal members. */ /* True if the internal members have been initialized. */ int __initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ char *__nextchar; /* See __ord above. */ enum __ord __ordering; /* If the POSIXLY_CORRECT environment variable is set or getopt was called. */ int __posixly_correct; /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. 'first_nonopt' is the index in ARGV of the first of them; 'last_nonopt' is the index after the last of them. */ int __first_nonopt; int __last_nonopt; #if defined _LIBC && defined USE_NONOPTION_FLAGS int __nonoption_flags_max_len; int __nonoption_flags_len; #endif }; /* The initializer is necessary to set OPTIND and OPTERR to their default values and to clear the initialization flag. */ #define _GETOPT_DATA_INITIALIZER { 1, 1 } extern int _getopt_internal_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, struct _getopt_data *__data, int __posixly_correct); extern int _getopt_long_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); extern int _getopt_long_only_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); #endif /* getopt_int.h */ shishi-1.0.2/src/gl/stddef.in.h0000644000000000000000000000523212126660073013115 00000000000000/* A substitute for POSIX 2008 , for platforms that have issues. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Eric Blake. */ /* * POSIX 2008 for platforms that have issues. * */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_wchar_t || defined __need_size_t \ || defined __need_ptrdiff_t || defined __need_NULL \ || defined __need_wint_t /* Special invocation convention inside gcc header files. In particular, gcc provides a version of that blindly redefines NULL even when __need_wint_t was defined, even though wint_t is not normally provided by . Hence, we must remember if special invocation has ever been used to obtain wint_t, in which case we need to clean up NULL yet again. */ # if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T) # ifdef __need_wint_t # undef _@GUARD_PREFIX@_STDDEF_H # define _GL_STDDEF_WINT_T # endif # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ # endif #else /* Normal invocation convention. */ # ifndef _@GUARD_PREFIX@_STDDEF_H /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ # ifndef _@GUARD_PREFIX@_STDDEF_H # define _@GUARD_PREFIX@_STDDEF_H /* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ #if @REPLACE_NULL@ # undef NULL # ifdef __cplusplus /* ISO C++ says that the macro NULL must expand to an integer constant expression, hence '((void *) 0)' is not allowed in C++. */ # if __GNUG__ >= 3 /* GNU C++ has a __null macro that behaves like an integer ('int' or 'long') but has the same size as a pointer. Use that, to avoid warnings. */ # define NULL __null # else # define NULL 0L # endif # else # define NULL ((void *) 0) # endif #endif /* Some platforms lack wchar_t. */ #if !@HAVE_WCHAR_T@ # define wchar_t int #endif # endif /* _@GUARD_PREFIX@_STDDEF_H */ # endif /* _@GUARD_PREFIX@_STDDEF_H */ #endif /* __need_XXX */ shishi-1.0.2/src/gl/msvc-inval.h0000644000000000000000000002113512126660073013316 00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _MSVC_INVAL_H #define _MSVC_INVAL_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines macros that turn such an invalid parameter notification into a non-local exit. An error code can then be produced at the target of this exit. You can thus write code like TRY_MSVC_INVAL { } CATCH_MSVC_INVAL { } DONE_MSVC_INVAL; This entire block expands to a single statement. The handling of invalid parameters can be done in three ways: * The default way, which is reasonable for programs (not libraries): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING]) * The way for libraries that make "hairy" calls (like close(-1), or fclose(fp) where fileno(fp) is closed, or simply getdtablesize()): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING]) * The way for libraries that make no "hairy" calls: AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING]) */ #define DEFAULT_HANDLING 0 #define HAIRY_LIBRARY_HANDLING 1 #define SANE_LIBRARY_HANDLING 2 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* A native Windows platform with the "invalid parameter handler" concept, and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */ # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING /* Default handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that just returns. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) # else /* Handling for hairy libraries. */ # include /* Gnulib can define its own status codes, as described in the page "Raising Software Exceptions" on microsoft.com . Our status codes are composed of - 0xE0000000, mandatory for all user-defined status codes, - 0x474E550, a API identifier ("GNU"), - 0, 1, 2, ..., used to distinguish different status codes from the same API. */ # define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0) # if defined _MSC_VER /* A compiler that supports __try/__except, as described in the page "try-except statement" on microsoft.com . With __try/__except, we can use the multithread-safe exception handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ __try # define CATCH_MSVC_INVAL \ __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \ ? EXCEPTION_EXECUTE_HANDLER \ : EXCEPTION_CONTINUE_SEARCH) # define DONE_MSVC_INVAL \ } \ while (0) # else /* Any compiler. We can only use setjmp/longjmp. */ # include # ifdef __cplusplus extern "C" { # endif struct gl_msvc_inval_per_thread { /* The restart that will resume execution at the code between CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */ jmp_buf restart; /* Tells whether the contents of restart is valid. */ int restart_valid; }; /* Ensure that the invalid parameter handler in installed that passes control to the gl_msvc_inval_restart if it is valid, or raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); /* Return a pointer to the per-thread data for the current thread. */ extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ struct gl_msvc_inval_per_thread *msvc_inval_current; \ gl_msvc_inval_ensure_handler (); \ msvc_inval_current = gl_msvc_inval_current (); \ /* First, initialize gl_msvc_inval_restart. */ \ if (setjmp (msvc_inval_current->restart) == 0) \ { \ /* Then, mark it as valid. */ \ msvc_inval_current->restart_valid = 1; # define CATCH_MSVC_INVAL \ /* Execution completed. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; \ } \ else \ { \ /* Execution triggered an invalid parameter notification. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; # define DONE_MSVC_INVAL \ } \ } \ while (0) # endif # endif #else /* A platform that does not need to the invalid parameter handler, or when SANE_LIBRARY_HANDLING is desired. */ /* The braces here avoid GCC warnings like "warning: suggest explicit braces to avoid ambiguous 'else'". */ # define TRY_MSVC_INVAL \ do \ { \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) #endif #endif /* _MSVC_INVAL_H */ shishi-1.0.2/src/gl/progname.h0000644000000000000000000000373712126660073013057 00000000000000/* Program name management. Copyright (C) 2001-2004, 2006, 2009-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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 . */ #ifndef _PROGNAME_H #define _PROGNAME_H /* Programs using this file should do the following in main(): set_program_name (argv[0]); */ #ifdef __cplusplus extern "C" { #endif /* String containing name the program is called with. */ extern const char *program_name; /* Set program_name, based on argv[0]. argv0 must be a string allocated with indefinite extent, and must not be modified after this call. */ extern void set_program_name (const char *argv0); #if ENABLE_RELOCATABLE /* Set program_name, based on argv[0], and original installation prefix and directory, for relocatability. */ extern void set_program_name_and_installdir (const char *argv0, const char *orig_installprefix, const char *orig_installdir); #undef set_program_name #define set_program_name(ARG0) \ set_program_name_and_installdir (ARG0, INSTALLPREFIX, INSTALLDIR) /* Return the full pathname of the current executable, based on the earlier call to set_program_name_and_installdir. Return NULL if unknown. */ extern char *get_full_program_name (void); #endif #ifdef __cplusplus } #endif #endif /* _PROGNAME_H */ shishi-1.0.2/src/gl/msvc-nothrow.c0000644000000000000000000000243412126660073013701 00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include "msvc-nothrow.h" /* Get declarations of the native Windows API functions. */ #define WIN32_LEAN_AND_MEAN #include #include "msvc-inval.h" #undef _get_osfhandle #if HAVE_MSVC_INVALID_PARAMETER_HANDLER intptr_t _gl_nothrow_get_osfhandle (int fd) { intptr_t result; TRY_MSVC_INVAL { result = _get_osfhandle (fd); } CATCH_MSVC_INVAL { result = (intptr_t) INVALID_HANDLE_VALUE; } DONE_MSVC_INVAL; return result; } #endif shishi-1.0.2/src/gl/gnulib.mk0000644000000000000000000002351312126660074012702 00000000000000## DO NOT EDIT! GENERATED AUTOMATICALLY! ## Process this file with automake to produce Makefile.in. # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=src/gl --m4-base=src/gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=extensions --avoid=gettext --avoid=gettext-h --avoid=include_next --avoid=intprops --avoid=stdarg --avoid=string --avoid=unistd --makefile-name=gnulib.mk --no-conditional-dependencies --libtool --macro-prefix=gl2 --no-vc-files error getopt-gnu locale progname version-etc MOSTLYCLEANFILES += core *.stackdump noinst_LTLIBRARIES += libgnu.la libgnu_la_SOURCES = libgnu_la_LIBADD = $(gl2_LTLIBOBJS) libgnu_la_DEPENDENCIES = $(gl2_LTLIBOBJS) EXTRA_libgnu_la_SOURCES = libgnu_la_LDFLAGS = $(AM_LDFLAGS) libgnu_la_LDFLAGS += -no-undefined ## begin gnulib module errno BUILT_SOURCES += $(ERRNO_H) # We need the following in order to create when the system # doesn't have one that is POSIX compliant. if GL_GENERATE_ERRNO_H errno.h: errno.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ < $(srcdir)/errno.in.h; \ } > $@-t && \ mv $@-t $@ else errno.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += errno.h errno.h-t EXTRA_DIST += errno.in.h ## end gnulib module errno ## begin gnulib module error EXTRA_DIST += error.c error.h EXTRA_libgnu_la_SOURCES += error.c ## end gnulib module error ## begin gnulib module getopt-posix BUILT_SOURCES += $(GETOPT_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += getopt.h getopt.h-t EXTRA_DIST += getopt.c getopt.in.h getopt1.c getopt_int.h EXTRA_libgnu_la_SOURCES += getopt.c getopt1.c ## end gnulib module getopt-posix ## begin gnulib module locale BUILT_SOURCES += locale.h # We need the following in order to create when the system # doesn't have one that provides all definitions. locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/locale.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += locale.h locale.h-t EXTRA_DIST += locale.in.h ## end gnulib module locale ## begin gnulib module msvc-inval EXTRA_DIST += msvc-inval.c msvc-inval.h EXTRA_libgnu_la_SOURCES += msvc-inval.c ## end gnulib module msvc-inval ## begin gnulib module msvc-nothrow EXTRA_DIST += msvc-nothrow.c msvc-nothrow.h EXTRA_libgnu_la_SOURCES += msvc-nothrow.c ## end gnulib module msvc-nothrow ## begin gnulib module progname libgnu_la_SOURCES += progname.h progname.c ## end gnulib module progname ## begin gnulib module snippet/arg-nonnull # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES += arg-nonnull.h # The arg-nonnull.h that gets inserted into generated .h files is the same as # build-aux/snippet/arg-nonnull.h, except that it has the copyright header cut # off. arg-nonnull.h: $(top_srcdir)/build-aux/snippet/arg-nonnull.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/GL_ARG_NONNULL/,$$p' \ < $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += arg-nonnull.h arg-nonnull.h-t ARG_NONNULL_H=arg-nonnull.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/arg-nonnull.h ## end gnulib module snippet/arg-nonnull ## begin gnulib module snippet/c++defs # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES += c++defs.h # The c++defs.h that gets inserted into generated .h files is the same as # build-aux/snippet/c++defs.h, except that it has the copyright header cut off. c++defs.h: $(top_srcdir)/build-aux/snippet/c++defs.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/_GL_CXXDEFS/,$$p' \ < $(top_srcdir)/build-aux/snippet/c++defs.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += c++defs.h c++defs.h-t CXXDEFS_H=c++defs.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/c++defs.h ## end gnulib module snippet/c++defs ## begin gnulib module snippet/warn-on-use BUILT_SOURCES += warn-on-use.h # The warn-on-use.h that gets inserted into generated .h files is the same as # build-aux/snippet/warn-on-use.h, except that it has the copyright header cut # off. warn-on-use.h: $(top_srcdir)/build-aux/snippet/warn-on-use.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/^.ifndef/,$$p' \ < $(top_srcdir)/build-aux/snippet/warn-on-use.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += warn-on-use.h warn-on-use.h-t WARN_ON_USE_H=warn-on-use.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/warn-on-use.h ## end gnulib module snippet/warn-on-use ## begin gnulib module stddef BUILT_SOURCES += $(STDDEF_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDDEF_H stddef.h: stddef.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ < $(srcdir)/stddef.in.h; \ } > $@-t && \ mv $@-t $@ else stddef.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stddef.h stddef.h-t EXTRA_DIST += stddef.in.h ## end gnulib module stddef ## begin gnulib module strerror EXTRA_DIST += strerror.c EXTRA_libgnu_la_SOURCES += strerror.c ## end gnulib module strerror ## begin gnulib module strerror-override EXTRA_DIST += strerror-override.c strerror-override.h EXTRA_libgnu_la_SOURCES += strerror-override.c ## end gnulib module strerror-override ## begin gnulib module verify EXTRA_DIST += verify.h ## end gnulib module verify ## begin gnulib module version-etc libgnu_la_SOURCES += version-etc.h version-etc.c ## end gnulib module version-etc mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : shishi-1.0.2/src/gl/Makefile.in0000644000000000000000000016546412126772725013161 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=src/gl --m4-base=src/gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=extensions --avoid=gettext --avoid=gettext-h --avoid=include_next --avoid=intprops --avoid=stdarg --avoid=string --avoid=unistd --makefile-name=gnulib.mk --no-conditional-dependencies --libtool --macro-prefix=gl2 --no-vc-files error getopt-gnu locale progname version-etc VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/gnulib.mk subdir = src/gl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libgnu_la_OBJECTS = progname.lo version-etc.lo libgnu_la_OBJECTS = $(am_libgnu_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgnu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgnu_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) DIST_SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.5 gnits noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = libgnu.la EXTRA_DIST = errno.in.h error.c error.h getopt.c getopt.in.h getopt1.c \ getopt_int.h locale.in.h msvc-inval.c msvc-inval.h \ msvc-nothrow.c msvc-nothrow.h \ $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ $(top_srcdir)/build-aux/snippet/c++defs.h \ $(top_srcdir)/build-aux/snippet/warn-on-use.h stddef.in.h \ strerror.c strerror-override.c strerror-override.h verify.h # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES = $(ERRNO_H) $(GETOPT_H) locale.h arg-nonnull.h \ c++defs.h warn-on-use.h $(STDDEF_H) SUFFIXES = MOSTLYCLEANFILES = core *.stackdump errno.h errno.h-t getopt.h \ getopt.h-t locale.h locale.h-t arg-nonnull.h arg-nonnull.h-t \ c++defs.h c++defs.h-t warn-on-use.h warn-on-use.h-t stddef.h \ stddef.h-t MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl libgnu_la_SOURCES = progname.h progname.c version-etc.h version-etc.c libgnu_la_LIBADD = $(gl2_LTLIBOBJS) $(top_builddir)/gl/libgnu.la libgnu_la_DEPENDENCIES = $(gl2_LTLIBOBJS) EXTRA_libgnu_la_SOURCES = error.c getopt.c getopt1.c msvc-inval.c \ msvc-nothrow.c strerror.c strerror-override.c libgnu_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined ARG_NONNULL_H = arg-nonnull.h CXXDEFS_H = c++defs.h WARN_ON_USE_H = warn-on-use.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/gl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits src/gl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/gnulib.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgnu.la: $(libgnu_la_OBJECTS) $(libgnu_la_DEPENDENCIES) $(EXTRA_libgnu_la_DEPENDENCIES) $(AM_V_CCLD)$(libgnu_la_LINK) $(libgnu_la_OBJECTS) $(libgnu_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror-override.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version-etc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool mostlyclean-local pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES clean-noinstLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ pdf-am ps ps-am tags uninstall uninstall-am # We need the following in order to create when the system # doesn't have one that is POSIX compliant. @GL_GENERATE_ERRNO_H_TRUE@errno.h: errno.in.h $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_ERRNO_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_ERRNO_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ < $(srcdir)/errno.in.h; \ @GL_GENERATE_ERRNO_H_TRUE@ } > $@-t && \ @GL_GENERATE_ERRNO_H_TRUE@ mv $@-t $@ @GL_GENERATE_ERRNO_H_FALSE@errno.h: $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # doesn't have one that provides all definitions. locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/locale.in.h; \ } > $@-t && \ mv $@-t $@ # The arg-nonnull.h that gets inserted into generated .h files is the same as # build-aux/snippet/arg-nonnull.h, except that it has the copyright header cut # off. arg-nonnull.h: $(top_srcdir)/build-aux/snippet/arg-nonnull.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/GL_ARG_NONNULL/,$$p' \ < $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ > $@-t && \ mv $@-t $@ # The c++defs.h that gets inserted into generated .h files is the same as # build-aux/snippet/c++defs.h, except that it has the copyright header cut off. c++defs.h: $(top_srcdir)/build-aux/snippet/c++defs.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/_GL_CXXDEFS/,$$p' \ < $(top_srcdir)/build-aux/snippet/c++defs.h \ > $@-t && \ mv $@-t $@ # The warn-on-use.h that gets inserted into generated .h files is the same as # build-aux/snippet/warn-on-use.h, except that it has the copyright header cut # off. warn-on-use.h: $(top_srcdir)/build-aux/snippet/warn-on-use.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/^.ifndef/,$$p' \ < $(top_srcdir)/build-aux/snippet/warn-on-use.h \ > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDDEF_H_TRUE@stddef.h: stddef.in.h $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDDEF_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_STDDEF_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL_GL2|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ < $(srcdir)/stddef.in.h; \ @GL_GENERATE_STDDEF_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDDEF_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDDEF_H_FALSE@stddef.h: $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_FALSE@ rm -f $@ mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/src/gl/msvc-inval.c0000644000000000000000000000750312126660073013314 00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include "msvc-inval.h" #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* Get _invalid_parameter_handler type and _set_invalid_parameter_handler declaration. */ # include # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { } # else /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include # if defined _MSC_VER static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # else /* An index to thread-local storage. */ static DWORD tls_index; static int tls_initialized /* = 0 */; /* Used as a fallback only. */ static struct gl_msvc_inval_per_thread not_per_thread; struct gl_msvc_inval_per_thread * gl_msvc_inval_current (void) { if (!tls_initialized) { tls_index = TlsAlloc (); tls_initialized = 1; } if (tls_index == TLS_OUT_OF_INDEXES) /* TlsAlloc had failed. */ return ¬_per_thread; else { struct gl_msvc_inval_per_thread *pointer = (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index); if (pointer == NULL) { /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */ pointer = (struct gl_msvc_inval_per_thread *) malloc (sizeof (struct gl_msvc_inval_per_thread)); if (pointer == NULL) /* Could not allocate memory. Use the global storage. */ pointer = ¬_per_thread; TlsSetValue (tls_index, pointer); } return pointer; } } static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current (); if (current->restart_valid) longjmp (current->restart, 1); else /* An invalid parameter notification from outside the gnulib code. Give the caller a chance to intervene. */ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # endif # endif static int gl_msvc_inval_initialized /* = 0 */; void gl_msvc_inval_ensure_handler (void) { if (gl_msvc_inval_initialized == 0) { _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler); gl_msvc_inval_initialized = 1; } } #endif shishi-1.0.2/src/gl/strerror-override.c0000644000000000000000000002146512126660073014737 00000000000000/* strerror-override.c --- POSIX compatible system error routine Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ /* Written by Bruno Haible , 2010. */ #include #include "strerror-override.h" #include #if GNULIB_defined_EWINSOCK /* native Windows platforms */ # if HAVE_WINSOCK2_H # include # endif #endif /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ const char * strerror_override (int errnum) { /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ switch (errnum) { #if REPLACE_STRERROR_0 case 0: return "Success"; #endif #if GNULIB_defined_ESOCK /* native Windows platforms with older */ case EINPROGRESS: return "Operation now in progress"; case EALREADY: return "Operation already in progress"; case ENOTSOCK: return "Socket operation on non-socket"; case EDESTADDRREQ: return "Destination address required"; case EMSGSIZE: return "Message too long"; case EPROTOTYPE: return "Protocol wrong type for socket"; case ENOPROTOOPT: return "Protocol not available"; case EPROTONOSUPPORT: return "Protocol not supported"; case EOPNOTSUPP: return "Operation not supported"; case EAFNOSUPPORT: return "Address family not supported by protocol"; case EADDRINUSE: return "Address already in use"; case EADDRNOTAVAIL: return "Cannot assign requested address"; case ENETDOWN: return "Network is down"; case ENETUNREACH: return "Network is unreachable"; case ECONNRESET: return "Connection reset by peer"; case ENOBUFS: return "No buffer space available"; case EISCONN: return "Transport endpoint is already connected"; case ENOTCONN: return "Transport endpoint is not connected"; case ETIMEDOUT: return "Connection timed out"; case ECONNREFUSED: return "Connection refused"; case ELOOP: return "Too many levels of symbolic links"; case EHOSTUNREACH: return "No route to host"; case EWOULDBLOCK: return "Operation would block"; #endif #if GNULIB_defined_ESTREAMS /* native Windows platforms with older */ case ETXTBSY: return "Text file busy"; case ENODATA: return "No data available"; case ENOSR: return "Out of streams resources"; case ENOSTR: return "Device not a stream"; case ETIME: return "Timer expired"; case EOTHER: return "Other error"; #endif #if GNULIB_defined_EWINSOCK /* native Windows platforms */ case ESOCKTNOSUPPORT: return "Socket type not supported"; case EPFNOSUPPORT: return "Protocol family not supported"; case ESHUTDOWN: return "Cannot send after transport endpoint shutdown"; case ETOOMANYREFS: return "Too many references: cannot splice"; case EHOSTDOWN: return "Host is down"; case EPROCLIM: return "Too many processes"; case EUSERS: return "Too many users"; case EDQUOT: return "Disk quota exceeded"; case ESTALE: return "Stale NFS file handle"; case EREMOTE: return "Object is remote"; # if HAVE_WINSOCK2_H /* WSA_INVALID_HANDLE maps to EBADF */ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */ /* WSA_INVALID_PARAMETER maps to EINVAL */ case WSA_OPERATION_ABORTED: return "Overlapped operation aborted"; case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state"; case WSA_IO_PENDING: return "Overlapped operations will complete later"; /* WSAEINTR maps to EINTR */ /* WSAEBADF maps to EBADF */ /* WSAEACCES maps to EACCES */ /* WSAEFAULT maps to EFAULT */ /* WSAEINVAL maps to EINVAL */ /* WSAEMFILE maps to EMFILE */ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */ /* WSAEINPROGRESS maps to EINPROGRESS */ /* WSAEALREADY maps to EALREADY */ /* WSAENOTSOCK maps to ENOTSOCK */ /* WSAEDESTADDRREQ maps to EDESTADDRREQ */ /* WSAEMSGSIZE maps to EMSGSIZE */ /* WSAEPROTOTYPE maps to EPROTOTYPE */ /* WSAENOPROTOOPT maps to ENOPROTOOPT */ /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ /* WSAEOPNOTSUPP maps to EOPNOTSUPP */ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */ /* WSAEADDRINUSE maps to EADDRINUSE */ /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */ /* WSAENETDOWN maps to ENETDOWN */ /* WSAENETUNREACH maps to ENETUNREACH */ /* WSAENETRESET maps to ENETRESET */ /* WSAECONNABORTED maps to ECONNABORTED */ /* WSAECONNRESET maps to ECONNRESET */ /* WSAENOBUFS maps to ENOBUFS */ /* WSAEISCONN maps to EISCONN */ /* WSAENOTCONN maps to ENOTCONN */ /* WSAESHUTDOWN is ESHUTDOWN */ /* WSAETOOMANYREFS is ETOOMANYREFS */ /* WSAETIMEDOUT maps to ETIMEDOUT */ /* WSAECONNREFUSED maps to ECONNREFUSED */ /* WSAELOOP maps to ELOOP */ /* WSAENAMETOOLONG maps to ENAMETOOLONG */ /* WSAEHOSTDOWN is EHOSTDOWN */ /* WSAEHOSTUNREACH maps to EHOSTUNREACH */ /* WSAENOTEMPTY maps to ENOTEMPTY */ /* WSAEPROCLIM is EPROCLIM */ /* WSAEUSERS is EUSERS */ /* WSAEDQUOT is EDQUOT */ /* WSAESTALE is ESTALE */ /* WSAEREMOTE is EREMOTE */ case WSASYSNOTREADY: return "Network subsystem is unavailable"; case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range"; case WSANOTINITIALISED: return "Successful WSAStartup not yet performed"; case WSAEDISCON: return "Graceful shutdown in progress"; case WSAENOMORE: case WSA_E_NO_MORE: return "No more results"; case WSAECANCELLED: case WSA_E_CANCELLED: return "Call was canceled"; case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid"; case WSAEINVALIDPROVIDER: return "Service provider is invalid"; case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize"; case WSASYSCALLFAILURE: return "System call failure"; case WSASERVICE_NOT_FOUND: return "Service not found"; case WSATYPE_NOT_FOUND: return "Class type not found"; case WSAEREFUSED: return "Database query was refused"; case WSAHOST_NOT_FOUND: return "Host not found"; case WSATRY_AGAIN: return "Nonauthoritative host not found"; case WSANO_RECOVERY: return "Nonrecoverable error"; case WSANO_DATA: return "Valid name, no data record of requested type"; /* WSA_QOS_* omitted */ # endif #endif #if GNULIB_defined_ENOMSG case ENOMSG: return "No message of desired type"; #endif #if GNULIB_defined_EIDRM case EIDRM: return "Identifier removed"; #endif #if GNULIB_defined_ENOLINK case ENOLINK: return "Link has been severed"; #endif #if GNULIB_defined_EPROTO case EPROTO: return "Protocol error"; #endif #if GNULIB_defined_EMULTIHOP case EMULTIHOP: return "Multihop attempted"; #endif #if GNULIB_defined_EBADMSG case EBADMSG: return "Bad message"; #endif #if GNULIB_defined_EOVERFLOW case EOVERFLOW: return "Value too large for defined data type"; #endif #if GNULIB_defined_ENOTSUP case ENOTSUP: return "Not supported"; #endif #if GNULIB_defined_ENETRESET case ENETRESET: return "Network dropped connection on reset"; #endif #if GNULIB_defined_ECONNABORTED case ECONNABORTED: return "Software caused connection abort"; #endif #if GNULIB_defined_ESTALE case ESTALE: return "Stale NFS file handle"; #endif #if GNULIB_defined_EDQUOT case EDQUOT: return "Disk quota exceeded"; #endif #if GNULIB_defined_ECANCELED case ECANCELED: return "Operation canceled"; #endif #if GNULIB_defined_EOWNERDEAD case EOWNERDEAD: return "Owner died"; #endif #if GNULIB_defined_ENOTRECOVERABLE case ENOTRECOVERABLE: return "State not recoverable"; #endif #if GNULIB_defined_EILSEQ case EILSEQ: return "Invalid or incomplete multibyte or wide character"; #endif default: return NULL; } } shishi-1.0.2/src/gl/strerror-override.h0000644000000000000000000000371712126660073014744 00000000000000/* strerror-override.h --- POSIX compatible system error routine Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ #ifndef _GL_STRERROR_OVERRIDE_H # define _GL_STRERROR_OVERRIDE_H # include # include /* Reasonable buffer size that should never trigger ERANGE; if this proves too small, we intentionally abort(), to remind us to fix this value. */ # define STACKBUF_LEN 256 /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ # if REPLACE_STRERROR_0 \ || GNULIB_defined_ESOCK \ || GNULIB_defined_ESTREAMS \ || GNULIB_defined_EWINSOCK \ || GNULIB_defined_ENOMSG \ || GNULIB_defined_EIDRM \ || GNULIB_defined_ENOLINK \ || GNULIB_defined_EPROTO \ || GNULIB_defined_EMULTIHOP \ || GNULIB_defined_EBADMSG \ || GNULIB_defined_EOVERFLOW \ || GNULIB_defined_ENOTSUP \ || GNULIB_defined_ENETRESET \ || GNULIB_defined_ECONNABORTED \ || GNULIB_defined_ESTALE \ || GNULIB_defined_EDQUOT \ || GNULIB_defined_ECANCELED \ || GNULIB_defined_EOWNERDEAD \ || GNULIB_defined_ENOTRECOVERABLE \ || GNULIB_defined_EILSEQ extern const char *strerror_override (int errnum); # else # define strerror_override(ignored) NULL # endif #endif /* _GL_STRERROR_OVERRIDE_H */ shishi-1.0.2/src/gl/errno.in.h0000644000000000000000000001646312126660073013001 00000000000000/* A POSIX-like . Copyright (C) 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_ERRNO_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_ERRNO_H@ #ifndef _@GUARD_PREFIX@_ERRNO_H #define _@GUARD_PREFIX@_ERRNO_H /* On native Windows platforms, many macros are not defined. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* These are the same values as defined by MSVC 10, for interoperability. */ # ifndef ENOMSG # define ENOMSG 122 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 111 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 121 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 134 # define GNULIB_defined_EPROTO 1 # endif # ifndef EBADMSG # define EBADMSG 104 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 132 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 129 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 117 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 106 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ECANCELED # define ECANCELED 105 # define GNULIB_defined_ECANCELED 1 # endif # ifndef EOWNERDEAD # define EOWNERDEAD 133 # define GNULIB_defined_EOWNERDEAD 1 # endif # ifndef ENOTRECOVERABLE # define ENOTRECOVERABLE 127 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EINPROGRESS # define EINPROGRESS 112 # define EALREADY 103 # define ENOTSOCK 128 # define EDESTADDRREQ 109 # define EMSGSIZE 115 # define EPROTOTYPE 136 # define ENOPROTOOPT 123 # define EPROTONOSUPPORT 135 # define EOPNOTSUPP 130 # define EAFNOSUPPORT 102 # define EADDRINUSE 100 # define EADDRNOTAVAIL 101 # define ENETDOWN 116 # define ENETUNREACH 118 # define ECONNRESET 108 # define ENOBUFS 119 # define EISCONN 113 # define ENOTCONN 126 # define ETIMEDOUT 138 # define ECONNREFUSED 107 # define ELOOP 114 # define EHOSTUNREACH 110 # define EWOULDBLOCK 140 # define GNULIB_defined_ESOCK 1 # endif # ifndef ETXTBSY # define ETXTBSY 139 # define ENODATA 120 /* not required by POSIX */ # define ENOSR 124 /* not required by POSIX */ # define ENOSTR 125 /* not required by POSIX */ # define ETIME 137 /* not required by POSIX */ # define EOTHER 131 /* not required by POSIX */ # define GNULIB_defined_ESTREAMS 1 # endif /* These are intentionally the same values as the WSA* error numbers, defined in . */ # define ESOCKTNOSUPPORT 10044 /* not required by POSIX */ # define EPFNOSUPPORT 10046 /* not required by POSIX */ # define ESHUTDOWN 10058 /* not required by POSIX */ # define ETOOMANYREFS 10059 /* not required by POSIX */ # define EHOSTDOWN 10064 /* not required by POSIX */ # define EPROCLIM 10067 /* not required by POSIX */ # define EUSERS 10068 /* not required by POSIX */ # define EDQUOT 10069 # define ESTALE 10070 # define EREMOTE 10071 /* not required by POSIX */ # define GNULIB_defined_EWINSOCK 1 # endif /* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */ # if @EMULTIHOP_HIDDEN@ # define EMULTIHOP @EMULTIHOP_VALUE@ # define GNULIB_defined_EMULTIHOP 1 # endif # if @ENOLINK_HIDDEN@ # define ENOLINK @ENOLINK_VALUE@ # define GNULIB_defined_ENOLINK 1 # endif # if @EOVERFLOW_HIDDEN@ # define EOVERFLOW @EOVERFLOW_VALUE@ # define GNULIB_defined_EOVERFLOW 1 # endif /* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK, EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined. Likewise, on NonStop Kernel, EDQUOT is not defined. Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151, HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133. Note: When one of these systems defines some of these macros some day, binaries will have to be recompiled so that they recognizes the new errno values from the system. */ # ifndef ENOMSG # define ENOMSG 2000 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 2001 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 2002 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 2003 # define GNULIB_defined_EPROTO 1 # endif # ifndef EMULTIHOP # define EMULTIHOP 2004 # define GNULIB_defined_EMULTIHOP 1 # endif # ifndef EBADMSG # define EBADMSG 2005 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 2006 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 2007 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 2011 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 2012 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ESTALE # define ESTALE 2009 # define GNULIB_defined_ESTALE 1 # endif # ifndef EDQUOT # define EDQUOT 2010 # define GNULIB_defined_EDQUOT 1 # endif # ifndef ECANCELED # define ECANCELED 2008 # define GNULIB_defined_ECANCELED 1 # endif /* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not defined. */ # ifndef EOWNERDEAD # if defined __sun /* Use the same values as defined for Solaris >= 8, for interoperability. */ # define EOWNERDEAD 58 # define ENOTRECOVERABLE 59 # elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* We have a conflict here: pthreads-win32 defines these values differently than MSVC 10. It's hairy to decide which one to use. */ # if defined __MINGW32__ && !defined USE_WINDOWS_THREADS /* Use the same values as defined by pthreads-win32, for interoperability. */ # define EOWNERDEAD 43 # define ENOTRECOVERABLE 44 # else /* Use the same values as defined by MSVC 10, for interoperability. */ # define EOWNERDEAD 133 # define ENOTRECOVERABLE 127 # endif # else # define EOWNERDEAD 2013 # define ENOTRECOVERABLE 2014 # endif # define GNULIB_defined_EOWNERDEAD 1 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EILSEQ # define EILSEQ 2015 # define GNULIB_defined_EILSEQ 1 # endif #endif /* _@GUARD_PREFIX@_ERRNO_H */ #endif /* _@GUARD_PREFIX@_ERRNO_H */ shishi-1.0.2/src/gl/locale.in.h0000644000000000000000000001600212126660073013100 00000000000000/* A POSIX . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #ifdef _GL_ALREADY_INCLUDING_LOCALE_H /* Special invocation conventions to handle Solaris header files (through Solaris 10) when combined with gettext's libintl.h. */ #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_LOCALE_H #define _GL_ALREADY_INCLUDING_LOCALE_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ #undef _GL_ALREADY_INCLUDING_LOCALE_H #ifndef _@GUARD_PREFIX@_LOCALE_H #define _@GUARD_PREFIX@_LOCALE_H /* NetBSD 5.0 mis-defines NULL. */ #include /* Mac OS X 10.5 defines the locale_t type in . */ #if @HAVE_XLOCALE_H@ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C. On systems that don't define it, use the same value as GNU libintl. */ #if !defined LC_MESSAGES # define LC_MESSAGES 1729 #endif /* Bionic libc's 'struct lconv' is just a dummy. */ #if @REPLACE_STRUCT_LCONV@ # define lconv rpl_lconv struct lconv { /* All 'char *' are actually 'const char *'. */ /* Members that depend on the LC_NUMERIC category of the locale. See */ /* Symbol used as decimal point. */ char *decimal_point; /* Symbol used to separate groups of digits to the left of the decimal point. */ char *thousands_sep; /* Definition of the size of groups of digits to the left of the decimal point. */ char *grouping; /* Members that depend on the LC_MONETARY category of the locale. See */ /* Symbol used as decimal point. */ char *mon_decimal_point; /* Symbol used to separate groups of digits to the left of the decimal point. */ char *mon_thousands_sep; /* Definition of the size of groups of digits to the left of the decimal point. */ char *mon_grouping; /* Sign used to indicate a value >= 0. */ char *positive_sign; /* Sign used to indicate a value < 0. */ char *negative_sign; /* For formatting local currency. */ /* Currency symbol (3 characters) followed by separator (1 character). */ char *currency_symbol; /* Number of digits after the decimal point. */ char frac_digits; /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char p_cs_precedes; /* For values >= 0: Position of the sign. */ char p_sign_posn; /* For values >= 0: Placement of spaces between currency symbol, sign, and number. */ char p_sep_by_space; /* For values < 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char n_cs_precedes; /* For values < 0: Position of the sign. */ char n_sign_posn; /* For values < 0: Placement of spaces between currency symbol, sign, and number. */ char n_sep_by_space; /* For formatting international currency. */ /* Currency symbol (3 characters) followed by separator (1 character). */ char *int_curr_symbol; /* Number of digits after the decimal point. */ char int_frac_digits; /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char int_p_cs_precedes; /* For values >= 0: Position of the sign. */ char int_p_sign_posn; /* For values >= 0: Placement of spaces between currency symbol, sign, and number. */ char int_p_sep_by_space; /* For values < 0: 1 if the currency symbol precedes the number, 0 if it comes after the number. */ char int_n_cs_precedes; /* For values < 0: Position of the sign. */ char int_n_sign_posn; /* For values < 0: Placement of spaces between currency symbol, sign, and number. */ char int_n_sep_by_space; }; #endif #if @GNULIB_LOCALECONV@ # if @REPLACE_LOCALECONV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef localeconv # define localeconv rpl_localeconv # endif _GL_FUNCDECL_RPL (localeconv, struct lconv *, (void)); _GL_CXXALIAS_RPL (localeconv, struct lconv *, (void)); # else _GL_CXXALIAS_SYS (localeconv, struct lconv *, (void)); # endif _GL_CXXALIASWARN (localeconv); #elif @REPLACE_STRUCT_LCONV@ # undef localeconv # define localeconv localeconv_used_without_requesting_gnulib_module_localeconv #elif defined GNULIB_POSIXCHECK # undef localeconv # if HAVE_RAW_DECL_LOCALECONV _GL_WARN_ON_USE (localeconv, "localeconv returns too few information on some platforms - " "use gnulib module localeconv for portability"); # endif #endif #if @GNULIB_SETLOCALE@ # if @REPLACE_SETLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setlocale # define setlocale rpl_setlocale # define GNULIB_defined_setlocale 1 # endif _GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale)); _GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale)); # else _GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale)); # endif _GL_CXXALIASWARN (setlocale); #elif defined GNULIB_POSIXCHECK # undef setlocale # if HAVE_RAW_DECL_SETLOCALE _GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - " "use gnulib module setlocale for portability"); # endif #endif #if @GNULIB_DUPLOCALE@ # if @REPLACE_DUPLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef duplocale # define duplocale rpl_duplocale # endif _GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale)); # else # if @HAVE_DUPLOCALE@ _GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); # endif # endif # if @HAVE_DUPLOCALE@ _GL_CXXALIASWARN (duplocale); # endif #elif defined GNULIB_POSIXCHECK # undef duplocale # if HAVE_RAW_DECL_DUPLOCALE _GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - " "use gnulib module duplocale for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_LOCALE_H */ #endif /* ! _GL_ALREADY_INCLUDING_LOCALE_H */ #endif /* _@GUARD_PREFIX@_LOCALE_H */ shishi-1.0.2/src/gl/getopt1.c0000644000000000000000000001055212126660073012616 00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifdef _LIBC # include #else # include # include "getopt.h" #endif #include "getopt_int.h" #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 0, 0); } int _getopt_long_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 0, d, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 1, 0); } int _getopt_long_only_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 1, d, 0); } #ifdef TEST #include int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static const struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value '%s'\n", optarg); break; case 'd': printf ("option d with value '%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ shishi-1.0.2/src/gl/verify.h0000644000000000000000000002313212126660073012542 00000000000000/* Compile-time assert-like macros. Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #ifndef _GL_VERIFY_H # define _GL_VERIFY_H /* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per C11. This is supported by GCC 4.6.0 and later, in C mode, and its use here generates easier-to-read diagnostics when verify (R) fails. Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per C++11. This will likely be supported by future GCC versions, in C++ mode. Use this only with GCC. If we were willing to slow 'configure' down we could also use it with other compilers, but since this affects only the quality of diagnostics, why bother? */ # if (4 < __GNUC__ || (__GNUC__ == 4 && 6 <= __GNUC_MINOR__)) && !defined __cplusplus # define _GL_HAVE__STATIC_ASSERT 1 # endif /* The condition (99 < __GNUC__) is temporary, until we know about the first G++ release that supports static_assert. */ # if (99 < __GNUC__) && defined __cplusplus # define _GL_HAVE_STATIC_ASSERT 1 # endif /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. If _Static_assert works, verify (R) uses it directly. Similarly, _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct that is an operand of sizeof. The code below uses several ideas for C++ compilers, and for C compilers that do not support _Static_assert: * The first step is ((R) ? 1 : -1). Given an expression R, of integral or boolean or floating-point type, this yields an expression of integral type, whose value is later verified to be constant and nonnegative. * Next this expression W is wrapped in a type struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: W; }. If W is negative, this yields a compile-time error. No compiler can deal with a bit-field of negative size. One might think that an array size check would have the same effect, that is, that the type struct { unsigned int dummy[W]; } would work as well. However, inside a function, some compilers (such as C++ compilers and GNU C) allow local parameters and variables inside array size expressions. With these compilers, an array size check would not properly diagnose this misuse of the verify macro: void function (int n) { verify (n < 0); } * For the verify macro, the struct _gl_verify_type will need to somehow be embedded into a declaration. To be portable, this declaration must declare an object, a constant, a function, or a typedef name. If the declared entity uses the type directly, such as in struct dummy {...}; typedef struct {...} dummy; extern struct {...} *dummy; extern void dummy (struct {...} *); extern struct {...} *dummy (void); two uses of the verify macro would yield colliding declarations if the entity names are not disambiguated. A workaround is to attach the current line number to the entity name: #define _GL_CONCAT0(x, y) x##y #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) extern struct {...} * _GL_CONCAT (dummy, __LINE__); But this has the problem that two invocations of verify from within the same macro would collide, since the __LINE__ value would be the same for both invocations. (The GCC __COUNTER__ macro solves this problem, but is not portable.) A solution is to use the sizeof operator. It yields a number, getting rid of the identity of the type. Declarations like extern int dummy [sizeof (struct {...})]; extern void dummy (int [sizeof (struct {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; can be repeated. * Should the implementation use a named struct or an unnamed struct? Which of the following alternatives can be used? extern int dummy [sizeof (struct {...})]; extern int dummy [sizeof (struct _gl_verify_type {...})]; extern void dummy (int [sizeof (struct {...})]); extern void dummy (int [sizeof (struct _gl_verify_type {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})]; In the second and sixth case, the struct type is exported to the outer scope; two such declarations therefore collide. GCC warns about the first, third, and fourth cases. So the only remaining possibility is the fifth case: extern int (*dummy (void)) [sizeof (struct {...})]; * GCC warns about duplicate declarations of the dummy function if -Wredundant-decls is used. GCC 4.3 and later have a builtin __COUNTER__ macro that can let us generate unique identifiers for each dummy function, to suppress this warning. * This implementation exploits the fact that older versions of GCC, which do not support _Static_assert, also do not warn about the last declaration mentioned above. * GCC warns if -Wnested-externs is enabled and verify() is used within a function body; but inside a function, you can always arrange to use verify_expr() instead. * In C++, any struct definition inside sizeof is invalid. Use a template type to work around the problem. */ /* Concatenate two preprocessor tokens. */ # define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) # define _GL_CONCAT0(x, y) x##y /* _GL_COUNTER is an integer, preferably one that changes each time we use it. Use __COUNTER__ if it works, falling back on __LINE__ otherwise. __LINE__ isn't perfect, but it's better than a constant. */ # if defined __COUNTER__ && __COUNTER__ != __COUNTER__ # define _GL_COUNTER __COUNTER__ # else # define _GL_COUNTER __LINE__ # endif /* Generate a symbol with the given prefix, making it unique if possible. */ # define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER) /* Verify requirement R at compile-time, as an integer constant expression that returns 1. If R is false, fail at compile-time, preferably with a diagnostic that includes the string-literal DIAGNOSTIC. */ # define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC))) # ifdef __cplusplus # if !GNULIB_defined_struct__gl_verify_type template struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: w; }; # define GNULIB_defined_struct__gl_verify_type 1 # endif # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ _gl_verify_type<(R) ? 1 : -1> # elif defined _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { \ _Static_assert (R, DIAGNOSTIC); \ int _gl_dummy; \ } # else # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; } # endif /* Verify requirement R at compile-time, as a declaration without a trailing ';'. If R is false, fail at compile-time, preferably with a diagnostic that includes the string-literal DIAGNOSTIC. Unfortunately, unlike C11, this implementation must appear as an ordinary declaration, and cannot appear inside struct { ... }. */ # ifdef _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY _Static_assert # else # define _GL_VERIFY(R, DIAGNOSTIC) \ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] # endif /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ # ifdef _GL_STATIC_ASSERT_H # if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert # define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC) # endif # if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert # define static_assert _Static_assert /* C11 requires this #define. */ # endif # endif /* @assert.h omit start@ */ /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. There are two macros, since no single macro can be used in all contexts in C. verify_true (R) is for scalar contexts, including integer constant expression contexts. verify (R) is for declaration contexts, e.g., the top level. */ /* Verify requirement R at compile-time, as an integer constant expression. Return 1. This is equivalent to verify_expr (R, 1). verify_true is obsolescent; please use verify_expr instead. */ # define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")") /* Verify requirement R at compile-time. Return the value of the expression E. */ # define verify_expr(R, E) \ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E)) /* Verify requirement R at compile-time, as a declaration without a trailing ';'. */ # define verify(R) _GL_VERIFY (R, "verify (" #R ")") /* @assert.h omit end@ */ #endif shishi-1.0.2/src/gl/getopt.in.h0000644000000000000000000002162112126660073013146 00000000000000/* Declarations for getopt. Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifndef _@GUARD_PREFIX@_GETOPT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. We must also inform the replacement unistd.h to not recursively use ; our definitions will be present soon enough. */ #if @HAVE_GETOPT_H@ # define _GL_SYSTEM_GETOPT # @INCLUDE_NEXT@ @NEXT_GETOPT_H@ # undef _GL_SYSTEM_GETOPT #endif #ifndef _@GUARD_PREFIX@_GETOPT_H #ifndef __need_getopt # define _@GUARD_PREFIX@_GETOPT_H 1 #endif /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in this header. When this happens, include the headers that might declare getopt so that they will not cause confusion if included after this file (if the system had , we have already included it). Then systematically rename identifiers so that they do not collide with the system functions and variables. Renaming avoids problems with some compilers and linkers. */ #if defined __GETOPT_PREFIX && !defined __need_getopt # if !@HAVE_GETOPT_H@ # define __need_system_stdlib_h # include # undef __need_system_stdlib_h # include # include # endif # undef __need_getopt # undef getopt # undef getopt_long # undef getopt_long_only # undef optarg # undef opterr # undef optind # undef optopt # undef option # define __GETOPT_CONCAT(x, y) x ## y # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) # define getopt __GETOPT_ID (getopt) # define getopt_long __GETOPT_ID (getopt_long) # define getopt_long_only __GETOPT_ID (getopt_long_only) # define optarg __GETOPT_ID (optarg) # define opterr __GETOPT_ID (opterr) # define optind __GETOPT_ID (optind) # define optopt __GETOPT_ID (optopt) # define option __GETOPT_ID (option) # define _getopt_internal __GETOPT_ID (getopt_internal) #endif /* Standalone applications get correct prototypes for getopt_long and getopt_long_only; they declare "char **argv". libc uses prototypes with "char *const *argv" that are incorrect because getopt_long and getopt_long_only can permute argv; this is required for backward compatibility (e.g., for LSB 2.0.1). This used to be '#if defined __GETOPT_PREFIX && !defined __need_getopt', but it caused redefinition warnings if both unistd.h and getopt.h were included, since unistd.h includes getopt.h having previously defined __need_getopt. The only place where __getopt_argv_const is used is in definitions of getopt_long and getopt_long_only below, but these are visible only if __need_getopt is not defined, so it is quite safe to rewrite the conditional as follows: */ #if !defined __need_getopt # if defined __GETOPT_PREFIX # define __getopt_argv_const /* empty */ # else # define __getopt_argv_const const # endif #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifndef __THROW # ifndef __GNUC_PREREQ # define __GNUC_PREREQ(maj, min) (0) # endif # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif /* The definition of _GL_ARG_NONNULL is copied here. */ #ifdef __cplusplus extern "C" { #endif /* For communication from 'getopt' to the caller. When 'getopt' finds an option that takes an argument, the argument value is returned here. Also, when 'ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to 'getopt'. On entry to 'getopt', zero means this is the first call; initialize. When 'getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, 'optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message 'getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of 'struct option' terminated by an element containing a name which is zero. The field 'has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field 'flag' is not NULL, it points to a variable that is set to the value given in the field 'val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an 'int' to a compiled-in constant, such as set a value from 'optarg', set the option's 'flag' field to zero and its 'val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero 'flag' field, 'getopt' returns the contents of the 'val' field. */ # if !GNULIB_defined_struct_option struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; # define GNULIB_defined_struct_option 1 # endif /* Names for the values of the 'has_arg' field of 'struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, 'optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in 'optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU 'getopt'. The argument '--' causes premature termination of argument scanning, explicitly telling 'getopt' that there are no more options. If OPTS begins with '-', then non-option arguments are treated as arguments to the option '\1'. This behavior is specific to the GNU 'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in the environment, then do not permute arguments. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW _GL_ARG_NONNULL ((2, 3)); #ifndef __need_getopt extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW _GL_ARG_NONNULL ((2, 3)); extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW _GL_ARG_NONNULL ((2, 3)); #endif #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* _@GUARD_PREFIX@_GETOPT_H */ #endif /* _@GUARD_PREFIX@_GETOPT_H */ shishi-1.0.2/shishi.skel.in0000664000000000000000000001225212126660507012455 00000000000000# User configuration file for Shishi @VERSION@ # Copyright 2002-2013 Simon Josefsson # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This file is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Unless you you specify which configuration file to use (with the # commandline option "--configuration-file filename"), Shishi uses the # file $HOME/.shishi/config by default. Note that the system # configuration file is read before this file. Settings specified # here overrides those specified in the system configuration file. # # An option file can contain all long options which are # available in Shishi. If the first non white space character of # a line is a '#', this line is ignored. Empty lines are also # ignored. # # See the manual for a list of options. # Read MIT or Heimdal configuration file for the following parameters: # default-realm # realm-kdc # server-realm # kdc-timeout # kdc-retries # You can override these values by specifying alternate values below. # Not implemented yet. #read-krb5conf=/etc/krb5.conf # Specify the default realm, by default the hostname of the host is used. #default-realm JOSEFSSON.ORG # Specify the default principal, by default the login username is used. #default-principal jas # Specify which encryption types client asks server to respond in # during AS/TGS exchanges. List valid encryption types, in preference # order. Supported algorithms include aes256-cts-hmac-sha1-96, # aes128-cts-hmac-sha1-96, des3-cbc-sha1-kd, des-cbc-md5, des-cbc-md4, # des-cbc-crc and null. This option also indicates which encryption # types are accepted by the client when receiving the response. Note # that the preference order is not cryptographically protected, so a # man in the middle can modify the order without being detected. # Thus, only specify encryption types you trust completely here. The # default only includes aes256-cts-hmac-sha1-96, as suggested by # RFC1510bis. #client-kdc-etypes=aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5 # Enable verbose library messages. #verbose #verbose-asn1 #verbose-noise #verbose-crypto #verbose-crypto-noise # Specify KDC addresses for realms. # Value is REALM,KDCADDRESS[/TRANSPORT][,KDCADDRESS[/TRANSPORT]...] # KDCADDRESS is the hostname or IP address of KDC. # Optional TRANSPORT is "udp" for UDP, "tcp" for TCP, and "tls" for TLS # connections. By default UDP is tried first, and TCP used as a # fallback if the KRB_ERR_RESPONSE_TOO_BIG error is received. If not # specified, Shishi tries to locate the KDC using SRV RRs, which is # recommended. This option should normally only be used during # experiments, to access badly maintained realms, or to make sure # you are not vulnerable to DNS redirection attacks. #realm-kdc=JOSEFSSON.ORG,ristretto.josefsson.org # Specify realm for servers. # Value is REALM,SERVERREGEXP[,SERVERREGEXP...] # SERVERREGEXP is a regular expression matching servers in the realm. # The first match is used. #server-realm=JOSEFSSON.ORG,.josefsson.org # How long shishi waits for a response from a KDC before continuing # to next KDC for realm. The default is 5 seconds. #kdc-timeout=5 # How many times shishi sends a request to a KDC before giving up. # The default is 3 times. #kdc-retries=3 # How username and passwords entered from the terminal, or taken # from the command line, are processed. # "none": no processing is used. # "stringprep": convert from locale charset to UTF-8 and process using # experimental RFC 1510 stringprep profile. # It can also be a string indicating a character set supported by # iconv() via libstringprep, in which case data is converted from # locale charset into the indicated character set. E.g., UTF-8, # ISO-8859-1, KOI-8, EBCDIC-IS-FRISS are supported on GNU systems. # On some systems you can use "locale -m" to list available character # sets. By default, the "none" setting is used which is consistent # with RFC 1510 that is silent on the issue. In practice, however, # converting to UTF-8 improves interoperability. stringprocess=UTF-8 # Specify default ticket life time. # The string can be in almost any common format. It can contain month # names, time zones, `am' and `pm', `yesterday', `ago', `next', etc. # Refer to the "Date input formats" in the GNU CoreUtils package for # entire story. As an extra feature, if the resulting string you # specify has expired within the last 24 hours, an extra day is added # to it. This allows you to specify "17:00" to always mean the next # 17:00, even if your system clock happens to be 17:30. # The default is 8 hours. # Examples: #ticket-life=8 hours #ticket-life=1 day #ticket-life=17:00 # Specify how long a renewable ticket should remain renewable. # See ticket-life for the syntax. The extra feature that handles # negative values within the last 2 hours is not active here. # The default is 7 days. # Examples: #renew-life=1 week #renew-life=friday 17:00 #renew-life=sunday # User configuration file ends here shishi-1.0.2/db/0000755000000000000000000000000012126773313010342 500000000000000shishi-1.0.2/db/core.c0000664000000000000000000003136712126660507011372 00000000000000/* core.c --- Core Shisa database API. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" /** * shisa_enumerate_realms: * @dbh: Shisa library handle created by shisa(). * @realms: Pointer to newly allocated array of newly allocated * zero-terminated UTF-8 strings indicating name of realm. * @nrealms: Pointer to number indicating number of allocated realm strings. * * Extract a list of all realm names in backend, as zero-terminated * UTF-8 strings. The caller must deallocate the strings. * * Return value: Returns SHISA_OK on success, or error code. **/ int shisa_enumerate_realms (Shisa * dbh, char ***realms, size_t * nrealms) { _Shisa_db *db; size_t i; int rc; *nrealms = 0; if (realms) *realms = NULL; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->enumerate_realms (dbh, db->state, realms, nrealms); if (rc != SHISA_OK) /* XXX mem leak. */ return rc; } return SHISA_OK; } /** * shisa_enumerate_principals: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm, as zero-terminated UTF-8 string. * @principal: Pointer to newly allocated array of newly allocated * zero-terminated UTF-8 strings indicating name of principal. * @nprincipals: Pointer to number indicating number of allocated * realm strings. * * Extract a list of all principal names in realm in backend, as * zero-terminated UTF-8 strings. The caller must deallocate the * strings. * * Return value: Returns SHISA_OK on success, SHISA_NO_REALM if the * specified realm does not exist, or error code. **/ int shisa_enumerate_principals (Shisa * dbh, const char *realm, char ***principals, size_t * nprincipals) { _Shisa_db *db; size_t i; int rc; *nprincipals = 0; if (principals) *principals = NULL; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->enumerate_principals (dbh, db->state, realm, principals, nprincipals); if (rc != SHISA_OK) /* XXX mem leak. */ return rc; } return SHISA_OK; } /** * shisa_principal_find: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to get information on. * @ph: Pointer to previously allocated principal structure to fill * out with information about principal. * * Extract information about given PRINCIPAL@REALM. * * Return value: Returns %SHISA_OK iff successful, %SHISA_NO_REALM if * the indicated realm does not exist, %SHISA_NO_PRINCIPAL if the * indicated principal does not exist, or an error code. **/ int shisa_principal_find (Shisa * dbh, const char *realm, const char *principal, Shisa_principal * ph) { _Shisa_db *db; size_t i; int rc; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->principal_find (dbh, db->state, realm, principal, ph); if (rc == SHISA_OK || (rc != SHISA_OK && rc != SHISA_NO_PRINCIPAL)) return rc; } return SHISA_NO_PRINCIPAL; } /** * shisa_principal_update: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to get information on. * @ph: Pointer to principal structure with information to store in database. * * Modify information stored for given PRINCIPAL@REALM. Note that it * is usually a good idea to only set the fields in @ph that you * actually want to update. Specifically, first calling * shisa_principal_find() to get the current information, then * modifying one field, and calling shisa_principal_update() is not * recommended in general, as this will 1) overwrite any modifications * made to other fields between the two calls (by other processes) and * 2) will cause all values to be written again, which may generate * more overhead. * * Return value: Returns SHISA_OK if successful, %SHISA_NO_REALM if * the indicated realm does not exist, %SHISA_NO_PRINCIPAL if the * indicated principal does not exist, or an error code. **/ int shisa_principal_update (Shisa * dbh, const char *realm, const char *principal, const Shisa_principal * ph) { _Shisa_db *db; size_t i; int rc; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { /* XXX ignore read-only backends. */ rc = db->backend->principal_update (dbh, db->state, realm, principal, ph); /* XXX ignore error and continue for ignore-error backends. */ return rc; } return SHISA_ADD_PRINCIPAL_ERROR; } /** * shisa_principal_add: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to add, may be %NULL to indicate that * the @realm should be created, in which case @ph and @key are not used. * @ph: Pointer to principal structure with information to store in database. * @key: Pointer to key structure with information to store in database. * * Add given information to database as PRINCIPAL@REALM. * * Return value: Returns SHISA_OK iff successfully added, or an error code. **/ int shisa_principal_add (Shisa * dbh, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key) { _Shisa_db *db; size_t i; int rc; if (realm == NULL) return SHISA_NO_REALM; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { /* XXX ignore read-only backends. */ rc = db->backend->principal_add (dbh, db->state, realm, principal, ph, key); /* XXX ignore error and continue for ignore-error backends. */ return rc; } return SHISA_ADD_PRINCIPAL_ERROR; } /** * shisa_principal_remove: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to remove, may be %NULL to indicate * that the @realm itself should be removed (requires that the realm * to be empty). * * Remove all information stored in the database for given PRINCIPAL@REALM. * * Return value: Returns %SHISA_OK if successful, or an error code. **/ int shisa_principal_remove (Shisa * dbh, const char *realm, const char *principal) { _Shisa_db *db; size_t i; int rc; if (realm == NULL) return SHISA_NO_REALM; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { /* XXX ignore read-only backends. */ rc = db->backend->principal_remove (dbh, db->state, realm, principal); /* XXX ignore error and continue for ignore-error backends. */ return rc; } return SHISA_REMOVE_PRINCIPAL_ERROR; } /** * shisa_keys_find: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to add key for. * @hint: Pointer to Shisa key structure with hints on matching the key * to modify, may be %NULL to match all keys. * @keys: pointer to newly allocated array with Shisa key structures. * @nkeys: pointer to number of newly allocated Shisa key structures in @keys. * * Iterate through keys for given PRINCIPAL@REALM and extract any keys * that match @hint. Not all elements of @hint need to be filled out, * only use the fields you are interested in. For example, if you * want to extract all keys with an etype of 3 (DES-CBC-MD5), set the * @key->etype field to 3, and set all other fields to 0. * * Return value: Returns %SHISA_OK iff successful, or an error code. **/ int shisa_keys_find (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys) { _Shisa_db *db; size_t i; int rc; *nkeys = 0; if (keys) *keys = NULL; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->keys_find (dbh, db->state, realm, principal, hint, keys, nkeys); if (rc != SHISA_OK) /* XXX mem leak. */ return rc; } return SHISA_OK; } /** * shisa_key_add: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to add key for. * @key: Pointer to Shisa key structure with key to add. * * Add key to database for given PRINCIPAL@REALM. * * Return value: Returns %SHISA_OK iff successful, or an error code. **/ int shisa_key_add (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * key) { _Shisa_db *db; size_t i; int rc; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->key_add (dbh, db->state, realm, principal, key); if (rc != SHISA_OK) return rc; } return SHISA_OK; } /** * shisa_key_update: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to remove key for. * @oldkey: Pointer to Shisa key structure with hints on matching the key * to modify. * @newkey: Pointer to Shisa key structure with new values for the * key, note that all fields are used (and not just the ones specified * by @oldkey). * * Modify data about a key in the database, for the given * PRINCIPAL@REALM. First the @oldkey is used to locate the key to * update (similar to shisa_keys_find()), then that key is modified to * contain whatever information is stored in @newkey. Not all * elements of @oldkey need to be filled out, only enough as to * identify the key uniquely. For example, if you want to modify the * information stored for the only key with an etype of 3 * (DES-CBC-MD5), set the @key->etype field to 3, and set all other * fields to 0. * * Return value: Returns %SHISA_OK on success, %SHISA_NO_KEY if no key * could be identified, and %SHISA_MULTIPLE_KEY_MATCH if more than one * key matched the given criteria, or an error code. **/ int shisa_key_update (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * oldkey, const Shisa_key * newkey) { _Shisa_db *db; size_t i; int rc; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->key_update (dbh, db->state, realm, principal, oldkey, newkey); if (rc != SHISA_OK) return rc; } return SHISA_OK; } /** * shisa_key_remove: * @dbh: Shisa library handle created by shisa(). * @realm: Name of realm the principal belongs in. * @principal: Name of principal to remove key for. * @key: Pointer to Shisa key structure with hints on matching the key * to remove. * * Remove a key, matching the hints in @key, from the Shisa database * for the user PRINCIPAL@REALM. Not all elements of @key need to be * filled out, only those you are interested in. For example, if you * want to remove the only key with an etype of 3 (DES-CBC-MD5), set * the @key->etype field to 3, and set all other fields to 0. * * Return value: Returns %SHISA_OK on success, %SHISA_NO_KEY if no key * could be identified, and %SHISA_MULTIPLE_KEY_MATCH if more than one * key matched the given criteria, or an error code. **/ int shisa_key_remove (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * key) { _Shisa_db *db; size_t i; int rc; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) { rc = db->backend->key_remove (dbh, db->state, realm, principal, key); if (rc != SHISA_OK) return rc; } return SHISA_OK; } /** * shisa_key_free: * @dbh: Shisa library handle created by shisa(). * @key: Pointer to Shisa key structure to deallocate. * * Deallocate the fields of a Shisa key structure, and the structure * itself. **/ void shisa_key_free (Shisa * dbh, Shisa_key * key) { free (key->key); free (key->salt); free (key->str2keyparam); free (key->password); free (key); } /** * shisa_keys_free: * @dbh: Shisa library handle created by shisa(). * @keys: Pointer to array with @nkeys elements of keys. * @nkeys: Number of key elements in @keys array. * * Deallocate each element of an array with Shisa database keys, using * shisa_key_free(). **/ void shisa_keys_free (Shisa * dbh, Shisa_key ** keys, size_t nkeys) { size_t i; for (i = 0; i < nkeys; i++) shisa_key_free (dbh, keys[i]); } shishi-1.0.2/db/err.c0000664000000000000000000000720312126660507011222 00000000000000/* error.c --- Error handling functions for the Shisa library. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" struct shisa_error_msgs { int errorcode; const char *message; }; static const struct shisa_error_msgs _shisa_error_messages[] = { {SHISA_OK, N_("Shisa success")}, {SHISA_INIT_ERROR, N_("Shisa could not be initialized.")}, {SHISA_CFG_NO_FILE, N_("The Shisa configuration file does not exist.")}, {SHISA_CFG_IO_ERROR, N_("File I/O error for Shisa configuration file.")}, {SHISA_CFG_SYNTAX_ERROR, N_("Syntax error in Shisa configuration token.")}, {SHISA_OPEN_ERROR, N_("Shisa database could not be opened.")}, {SHISA_ENUMERATE_REALM_ERROR, N_("Error enumerating realms in database.")}, {SHISA_ENUMERATE_PRINCIPAL_ERROR, N_("Error enumerating principals in database.")}, {SHISA_ENUMERATE_KEY_ERROR, N_("Error enumerating keys in database.")}, {SHISA_NO_REALM, N_("Supplied realm does not exist.")}, {SHISA_NO_PRINCIPAL, N_("Supplied principal does not exist.")}, {SHISA_NO_KEY, N_("Principal is not associated with any matching key.")}, {SHISA_FIND_ERROR, N_("Error finding principal.")}, {SHISA_ADD_REALM_EXISTS, N_("Tried to add a realm that already exist.")}, {SHISA_ADD_REALM_ERROR, N_("Error adding realm to database.")}, {SHISA_REMOVE_REALM_NONEMPTY, N_("Tried to remove a non-empty realm.")}, {SHISA_REMOVE_REALM_ERROR, N_("Error removing realm from database.")}, {SHISA_ADD_PRINCIPAL_EXISTS, N_("Tried to add a principal that already exist.")}, {SHISA_ADD_PRINCIPAL_ERROR, N_("Error adding principal to database.")}, {SHISA_REMOVE_PRINCIPAL_ERROR, N_("Error removing principal from database.")}, {SHISA_ADD_KEY_ERROR, N_("Error adding key to principal.")}, {SHISA_REMOVE_KEY_ERROR, N_("Error removing key from principal.")}, {SHISA_MULTIPLE_KEY_MATCH, N_("More than one key match given search criteria.")} }; /** * shisa_strerror: * @err: shisa error code * * Return value: Returns a pointer to a statically allocated string * containing a description of the error with the error value @err. * This string can be used to output a diagnostic message to the user. **/ const char * shisa_strerror (int err) { size_t i; for (i = 0; i < sizeof (_shisa_error_messages) / sizeof (_shisa_error_messages[0]); i++) if (_shisa_error_messages[i].errorcode == err) return _(_shisa_error_messages[i].message); return _("Unknown Shisa error"); } /** * shisa_info: * @dbh: Shisa library handle created by shisa(). * @format: printf style format string. * @...: print style arguments. * * Print informational message to standard error. **/ void shisa_info (Shisa * dbh, const char *format, ...) { va_list ap; char *out; va_start (ap, format); vasprintf (&out, format, ap); fprintf (stderr, _("shisa: %s\n"), out); free (out); va_end (ap); } shishi-1.0.2/db/fileutil.h0000664000000000000000000000624112126660507012255 00000000000000/* fileutil.h --- Utility prototypes used by file.c. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* Get FILE, fopen. */ #include extern int _shisa_isdir (const char *path); extern int _shisa_isdir2 (const char *path1, const char *realm); extern int _shisa_isdir3 (const char *path1, const char *realm, const char *principal); extern int _shisa_isdir4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_mkdir (const char *file); extern int _shisa_mkdir2 (const char *path1, const char *realm); extern int _shisa_mkdir3 (const char *path1, const char *realm, const char *principal); extern int _shisa_mkdir4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_rmdir (const char *file); extern int _shisa_rmdir2 (const char *path1, const char *realm); extern int _shisa_rmdir3 (const char *path1, const char *realm, const char *principal); extern int _shisa_rmdir4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_mtime4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_isfile4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_uint32link4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_ls (const char *path, char ***files, size_t * nfiles); extern int _shisa_ls2 (const char *path, const char *realm, char ***files, size_t * nfiles); extern int _shisa_ls3 (const char *path, const char *realm, const char *principal, char ***files, size_t * nfiles); extern int _shisa_ls4 (const char *path, const char *realm, const char *principal, const char *path4, char ***files, size_t * nfiles); extern int _shisa_lsdir (const char *path, char ***files, size_t * nfiles); extern int _shisa_lsdir2 (const char *path, const char *realm, char ***files, size_t * nfiels); extern int _shisa_rm4 (const char *path1, const char *realm, const char *principal, const char *path4); extern int _shisa_rm5 (const char *path1, const char *path2, const char *path3, const char *path4, const char *path5); extern FILE *_shisa_fopen4 (const char *path1, const char *realm, const char *principal, const char *path4, const char *mode); shishi-1.0.2/db/libshisa.map0000664000000000000000000000321512126660507012562 00000000000000# Copyright (C) 2009-2013 Simon Josefsson # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SHISA_0.0 { global: shisa; shisa_cfg; shisa_cfg_db; shisa_cfg_default_systemfile; shisa_cfg_from_file; shisa_done; shisa_enumerate_principals; shisa_enumerate_realms; shisa_file_done; shisa_file_enumerate_principals; shisa_file_enumerate_realms; shisa_file_init; shisa_file_key_add; shisa_file_key_remove; shisa_file_key_update; shisa_file_keys_find; shisa_file_principal_add; shisa_file_principal_find; shisa_file_principal_remove; shisa_file_principal_update; shisa_info; shisa_init; shisa_init_with_paths; shisa_key_add; shisa_key_free; shisa_key_remove; shisa_key_update; shisa_keys_find; shisa_keys_free; shisa_principal_add; shisa_principal_find; shisa_principal_remove; shisa_principal_update; shisa_strerror; local: *; }; shishi-1.0.2/db/fileutil.c0000664000000000000000000002762412126660507012260 00000000000000/* fileutil.c --- Utility functions used by file.c. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" /* For stat. */ #include #include #include /* For readdir. */ #include #include #ifndef errno extern int errno; #endif #include "areadlink.h" /* Get specification. */ #include "fileutil.h" #define ishex(c) ((c >= '0' || c <= '9') || (c >= 'a' || c <= 'f')) #define tohex(c1,c2) (((c1 - '0' > 9 ? c1 - 'a' + 10 : c1 - '0') << 4) | \ (c2 - '0' > 9 ? c2 - 'a' + 10 : c2 - '0')) static char * unescape_filename (const char *path) { char *out = strdup (path); char *p = out; while (*path) { if (path[0] == '%' && path[1] && ishex (path[1]) && path[2] && ishex (path[2])) { *p++ = tohex (path[1], path[2]); path += 3; } else *p++ = *path++; } *p = '\0'; return out; } static char * escape_filename (const char *path) { char *out = malloc (strlen (path) * 3 + 1); char *p = out; while (*path) { if ((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z') || (path[0] >= '0' && path[0] <= '9') || path[0] == '-' || path[0] == '.') *p++ = *path++; else { int i; *p++ = '%'; i = (*path & 0xF0) >> 4; *p++ = i > 10 ? 'a' + i - 10 : '0' + i; i = (*path & 0x0f); *p++ = i > 10 ? 'a' + i - 10 : '0' + i; path++; } } *p = '\0'; return out; } int _shisa_isdir (const char *path) { struct stat buf; int rc; rc = stat (path, &buf); if (rc != 0 || !S_ISDIR (buf.st_mode)) return 0; return 1; } static int isdir2 (const char *path1, const char *path2) { char *tmp; int rc; asprintf (&tmp, "%s/%s", path1, path2); rc = _shisa_isdir (tmp); free (tmp); return rc; } int _shisa_isdir2 (const char *path1, const char *realm) { char *saferealm = escape_filename (realm); char *tmp; int rc; asprintf (&tmp, "%s/%s", path1, saferealm); free (saferealm); rc = _shisa_isdir (tmp); free (tmp); return rc; } int _shisa_isdir3 (const char *path1, const char *realm, const char *principal) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s", path1, saferealm, safeprincipal); free (saferealm); free (safeprincipal); rc = _shisa_isdir (tmp); free (tmp); return rc; } int _shisa_isdir4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = _shisa_isdir (tmp); free (tmp); return rc; } int _shisa_mkdir (const char *file) { int rc; rc = mkdir (file, S_IRUSR | S_IWUSR | S_IXUSR); if (rc != 0) { perror (file); return -1; } return 0; } int _shisa_mkdir2 (const char *path1, const char *realm) { char *saferealm = escape_filename (realm); char *tmp; int rc; asprintf (&tmp, "%s/%s", path1, saferealm); free (saferealm); rc = _shisa_mkdir (tmp); free (tmp); return rc; } int _shisa_mkdir3 (const char *path1, const char *realm, const char *principal) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s", path1, saferealm, safeprincipal); free (saferealm); free (safeprincipal); rc = _shisa_mkdir (tmp); free (tmp); return rc; } int _shisa_mkdir4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = _shisa_mkdir (tmp); free (tmp); return rc; } int _shisa_rmdir (const char *file) { int rc; rc = rmdir (file); if (rc != 0) { perror (file); return -1; } return 0; } int _shisa_rmdir2 (const char *path1, const char *realm) { char *saferealm = escape_filename (realm); char *tmp; int rc; asprintf (&tmp, "%s/%s", path1, saferealm); free (saferealm); rc = _shisa_rmdir (tmp); free (tmp); return rc; } int _shisa_rmdir3 (const char *path1, const char *realm, const char *principal) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s", path1, saferealm, safeprincipal); free (saferealm); free (safeprincipal); rc = _shisa_rmdir (tmp); free (tmp); return rc; } int _shisa_rmdir4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = _shisa_rmdir (tmp); free (tmp); return rc; } static time_t mtime (const char *file) { struct stat buf; int rc; rc = stat (file, &buf); if (rc != 0 || !S_ISREG (buf.st_mode)) return (time_t) - 1; return buf.st_atime; } int _shisa_mtime4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = mtime (tmp); free (tmp); return rc; } static int isfile (const char *path) { struct stat buf; int rc; rc = stat (path, &buf); if (rc != 0 || !S_ISREG (buf.st_mode)) return 0; return 1; } int _shisa_isfile4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = isfile (tmp); free (tmp); return rc; } static uint32_t uint32link (const char *file) { char *linkname; long n; linkname = areadlink (file); if (linkname == NULL) return 0; n = atol (linkname); free (linkname); return n; } int _shisa_uint32link4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = uint32link (tmp); free (tmp); return rc; } static int ls_1 (const char *path, int onlydir, char ***files, size_t * nfiles, DIR * dir) { struct dirent *de; while (errno = 0, (de = readdir (dir)) != NULL) { if (strcmp (de->d_name, ".") == 0 || strcmp (de->d_name, "..") == 0) continue; if (!onlydir || isdir2 (path, de->d_name)) { if (files) { *files = xrealloc (*files, (*nfiles + 1) * sizeof (**files)); (*files)[(*nfiles)] = unescape_filename (de->d_name); } (*nfiles)++; } } if (errno != 0) { size_t i; perror (path); if (files) { for (i = 0; i < *nfiles; i++) free (**files); if (*nfiles > 0) free (*files); } return -1; } return 0; } static int ls (const char *path, int onlydir, char ***files, size_t * nfiles) { DIR *dir; int rc; dir = opendir (path); if (dir == NULL) { perror (path); return -1; } if (ls_1 (path, onlydir, files, nfiles, dir) != 0) { rc = closedir (dir); if (rc != 0) perror (path); return -1; } rc = closedir (dir); if (rc != 0) { size_t i; perror (path); if (files) { for (i = 0; i < *nfiles; i++) free (**files); if (*nfiles > 0) free (*files); } return -1; } return 0; } int _shisa_ls (const char *path, char ***files, size_t * nfiles) { return ls (path, 0, files, nfiles); } int _shisa_ls2 (const char *path, const char *realm, char ***files, size_t * nfiles) { char *saferealm = escape_filename (realm); char *tmp; int rc; asprintf (&tmp, "%s/%s", path, saferealm); free (saferealm); rc = _shisa_ls (tmp, files, nfiles); free (tmp); return rc; } int _shisa_ls3 (const char *path, const char *realm, const char *principal, char ***files, size_t * nfiles) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s", path, saferealm, safeprincipal); free (saferealm); free (safeprincipal); rc = _shisa_ls (tmp, files, nfiles); free (tmp); return rc; } int _shisa_ls4 (const char *path, const char *realm, const char *principal, const char *path4, char ***files, size_t * nfiles) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = _shisa_ls (tmp, files, nfiles); free (tmp); return rc; } int _shisa_lsdir (const char *path, char ***files, size_t * nfiles) { return ls (path, 1, files, nfiles); } int _shisa_lsdir2 (const char *path, const char *realm, char ***files, size_t * nfiles) { char *saferealm = escape_filename (realm); char *tmp; int rc; asprintf (&tmp, "%s/%s", path, saferealm); free (saferealm); rc = _shisa_lsdir (tmp, files, nfiles); free (tmp); return rc; } static int rm (const char *path) { int rc; rc = unlink (path); if (rc != 0) { perror (path); return -1; } return 0; } int _shisa_rm4 (const char *path1, const char *realm, const char *principal, const char *path4) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); rc = rm (tmp); free (tmp); return rc; } int _shisa_rm5 (const char *path1, const char *realm, const char *principal, const char *path4, const char *path5) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; int rc; asprintf (&tmp, "%s/%s/%s/%s/%s", path1, saferealm, safeprincipal, path4, path5); free (saferealm); free (safeprincipal); rc = rm (tmp); free (tmp); return rc; } FILE * _shisa_fopen4 (const char *path1, const char *realm, const char *principal, const char *path4, const char *mode) { char *saferealm = escape_filename (realm); char *safeprincipal = escape_filename (principal); char *tmp; FILE *fh; asprintf (&tmp, "%s/%s/%s/%s", path1, saferealm, safeprincipal, path4); free (saferealm); free (safeprincipal); fh = fopen (tmp, mode); free (tmp); return fh; } shishi-1.0.2/db/config.c0000664000000000000000000001071012126660507011674 00000000000000/* cfg.c --- Read Shisa Configuration file. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" /** * shisa_cfg_db: * @dbh: Shisa library handle created by shisa(). * @value: string with database definition. * * Setup and open a new database. The syntax of the @value parameter * is "TYPE[ LOCATION[ PARAMETER]]", where TYPE is one of the * supported database types (e.g., "file") and LOCATION and PARAMETER * are optional strings passed to the database during initialization. * Neither TYPE nor LOCATION can contain " " (SPC), but PARAMETER may. * * Return Value: Returns %SHISA_OK if database was parsed and open * successfully. **/ int shisa_cfg_db (Shisa * dbh, const char *value) { char *p; char *db; char *location = NULL; char *options = NULL; _Shisa_backend *backend; void *state; int rc; db = xstrdup (value); if ((p = strchr (db, ' '))) { *p++ = '\0'; location = p; if ((p = strchr (p, ' '))) { *p++ = '\0'; options = p; } } backend = _shisa_find_backend (db); if (backend == NULL) { shisa_info (dbh, "Unknown database type: `%s'.", db); free (db); return SHISA_CFG_SYNTAX_ERROR; } rc = backend->init (dbh, location, options, &state); if (rc != SHISA_OK) { shisa_info (dbh, "Cannot initialize `%s' database backend.\n" "Location `%s' and options `%s'.", db, location ? location : "N/A", options ? options : "N/A"); free (db); return rc; } free (db); dbh->dbs = xrealloc (dbh->dbs, ++dbh->ndbs * sizeof (*dbh->dbs)); dbh->dbs->backend = backend; dbh->dbs->state = state; return SHISA_OK; } /** * shisa_cfg: * @dbh: Shisa library handle created by shisa(). * @option: string with shisa library option. * * Configure shisa library with given option. * * Return Value: Returns SHISA_OK if option was valid. **/ int shisa_cfg (Shisa * dbh, const char *option) { int rc; if (!option) return SHISA_OK; if (strncmp (option, "db=", 3) != 0 && strncmp (option, "db ", 3) != 0) { shisa_info (dbh, "Unknown option: `%s'.", option); return SHISA_CFG_SYNTAX_ERROR; } rc = shisa_cfg_db (dbh, option + 3); if (rc != SHISA_OK) return rc; return SHISA_OK; } /** * shisa_cfg_from_file: * @dbh: Shisa library handle created by shisa(). * @cfg: filename to read configuration from. * * Configure shisa library using configuration file. * * Return Value: Returns %SHISA_OK iff successful. **/ int shisa_cfg_from_file (Shisa * dbh, const char *cfg) { char *line = NULL; size_t len = 0; FILE *fh; int rc = SHISA_OK; if (cfg == NULL) return SHISA_OK; fh = fopen (cfg, "r"); if (fh == NULL) { perror (cfg); return SHISA_CFG_NO_FILE; } while (!feof (fh)) { ssize_t n = getline (&line, &len, fh); char *p = line; char *q; if (n <= 0) /* End of file or error. */ break; while (strlen (p) > 0 && (p[strlen (p) - 1] == '\n' || p[strlen (p) - 1] == '\r')) p[strlen (p) - 1] = '\0'; while (*p && strchr (" \t\r\n", *p)) p++; if (*p == '\0' || *p == '#') continue; q = strchr (p, ' '); if (q && (strchr (p, '=') == NULL || q < strchr (p, '='))) *q = '='; rc = shisa_cfg (dbh, p); if (rc != SHISA_OK) break; } free (line); if (ferror (fh)) if (rc == SHISA_OK) return SHISA_CFG_IO_ERROR; if (fclose (fh) != 0) if (rc == SHISA_OK) return SHISA_CFG_IO_ERROR; return rc; } /** * shisa_cfg_default_systemfile: * @dbh: Shisa library handle created by shisa(). * * Return value: Return system configuration filename. **/ const char * shisa_cfg_default_systemfile (Shisa * dbh) { return SYSTEMCFGFILE; } shishi-1.0.2/db/file.h0000664000000000000000000001033112126660507011352 00000000000000/* file.h --- Prototypes for file based Shisa database. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /*************************************************** Initializor/destructor. */ /* Initialize file backend, i.e., parse options and check if file root exists and allocate backend handle. */ extern int shisa_file_init (Shisa * dbh, const char *location, const char *options, void **state); /* Destroy backend handle. */ extern void shisa_file_done (Shisa * dbh, void *state); /************************************************************** Enumerators. */ /* Return a list of all realm names in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ extern int shisa_file_enumerate_realms (Shisa * dbh, void *state, char ***realms, size_t * nrealms); /* Return a list of all principals in realm in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ extern int shisa_file_enumerate_principals (Shisa * dbh, void *state, const char *realm, char ***principals, size_t * nprincipals); /**************************************** Functions operating on principals. */ /* Return information about specified PRINCIPAL@REALM. Can also be used check existence of principal entry, with a NULL PH. */ extern int shisa_file_principal_find (Shisa * dbh, void *state, const char *realm, const char *principal, Shisa_principal * ph); /* Add new PRINCIPAL@REALM with specified information and key. If PRINCIPAL is NULL, then add realm REALM. */ extern int shisa_file_principal_add (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key); /* Modify information for specified PRINCIPAL@REALM. */ extern int shisa_file_principal_update (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph); /* Remove PRINCIPAL@REALM, or REALM if PRINCIPAL is NULL. Realms must be empty for them to be successfully removed. */ extern int shisa_file_principal_remove (Shisa * dbh, void *state, const char *realm, const char *principal); /********************************************** Functions operating on keys. */ /* Get all keys matching HINT for specified PRINCIPAL@REALM. The caller must deallocate the returned keys. If HINT is NULL, then all keys are returned. */ extern int shisa_file_keys_find (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys); /* Add key for PRINCIPAL@REALM. */ extern int shisa_file_key_add (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key); /* Update a key for PRINCIPAL@REALM. The OLDKEY must uniquely determine the key to update, i.e., shishi_keys_find using OLDKEY as HINT must return exactly 1 key. */ extern int shisa_file_key_update (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * oldkey, const Shisa_key * newkey); /* Remove a key for PRINCIPAL@REALM. The KEY must uniquely determine the key to remove, i.e., shishi_keys_find using KEY as HINT must return exactly 1 key. */ extern int shisa_file_key_remove (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key); shishi-1.0.2/db/Makefile.am0000664000000000000000000000340512126660507012322 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. SUBDIRS = gl AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) $(CFLAG_VISIBILITY) # -I../lib is to get shishi-int.h and uint32_t. AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl \ -I$(srcdir)/gl -I$(builddir)/gl \ -I../lib DEFS = -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shisa.conf\" \ -DDEFAULTDBPATH=\"$(DBDIR)\" \ @DEFS@ include_HEADERS = shisa.h lib_LTLIBRARIES = libshisa.la libshisa_la_SOURCES = libshisa.map \ shisa.h info.h \ setup.c config.c db.c err.c core.c \ file.c file.h fileutil.h fileutil.c libshisa_la_LIBADD = gl/libgnu.la ../lib/libshishi.la \ $(LIB_CLOCK_GETTIME) $(LIBSOCKET) # XXX use different libtool version for this library? libshisa_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -no-undefined if HAVE_LD_VERSION_SCRIPT libshisa_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libshisa.map else libshisa_la_LDFLAGS += -export-symbols-regex '^shisa.*' endif shishi-1.0.2/db/shisa.h0000664000000000000000000001411612126660507011547 00000000000000/* shisa.h --- Header file for concurrent write-safe user information database. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef SHISA_H #define SHISA_H #include /* size_t */ #include /* time_t */ #include /* int32_t, uint32_t */ /* Error codes */ enum Shisa_rc { SHISA_OK = 0, /* init.c */ SHISA_INIT_ERROR = 1, /* cfg.c */ SHISA_CFG_NO_FILE = 2, SHISA_CFG_IO_ERROR = 3, SHISA_CFG_SYNTAX_ERROR = 4, /* db.c: file.c */ SHISA_OPEN_ERROR = 5, SHISA_ENUMERATE_REALM_ERROR = 6, SHISA_ENUMERATE_PRINCIPAL_ERROR = 7, SHISA_ENUMERATE_KEY_ERROR = 23, SHISA_NO_REALM = 8, SHISA_NO_PRINCIPAL = 9, SHISA_NO_KEY = 10, SHISA_FIND_ERROR = 11, SHISA_ADD_REALM_EXISTS = 12, SHISA_ADD_REALM_ERROR = 13, SHISA_REMOVE_REALM_NONEMPTY = 14, SHISA_REMOVE_REALM_ERROR = 15, SHISA_ADD_PRINCIPAL_EXISTS = 16, SHISA_ADD_PRINCIPAL_ERROR = 17, SHISA_REMOVE_PRINCIPAL_NONEMPTY = 18, SHISA_REMOVE_PRINCIPAL_ERROR = 19, SHISA_ADD_KEY_ERROR = 20, SHISA_REMOVE_KEY_ERROR = 21, SHISA_MULTIPLE_KEY_MATCH = 22 }; typedef enum Shisa_rc Shisa_rc; typedef struct Shisa Shisa; struct Shisa_principal { int isdisabled; uint32_t kvno; time_t notusedbefore; time_t lastinitialtgt; /* time of last initial request for a TGT */ time_t lastinitialrequest; /* time of last initial request */ time_t lasttgt; /* time of issue for the newest TGT used */ time_t lastrenewal; /* time of the last renewal */ time_t passwordexpire; /* time when the password will expire */ time_t accountexpire; /* time when the account will expire. */ }; typedef struct Shisa_principal Shisa_principal; struct Shisa_key { uint32_t kvno; int32_t etype; int priority; char *key; size_t keylen; char *salt; size_t saltlen; char *str2keyparam; size_t str2keyparamlen; char *password; }; typedef struct Shisa_key Shisa_key; /* init.c */ extern Shisa *shisa (void); extern void shisa_done (Shisa * dbh); extern int shisa_init (Shisa ** dbh); extern int shisa_init_with_paths (Shisa ** dbh, const char *file); /* cfg.c */ extern int shisa_cfg (Shisa * dbh, const char *option); extern int shisa_cfg_db (Shisa * dbh, const char *value); extern int shisa_cfg_from_file (Shisa * dbh, const char *cfg); extern const char *shisa_cfg_default_systemfile (Shisa * dbh); /* error.c */ extern const char *shisa_strerror (int err); extern void shisa_info (Shisa * dbh, const char *format, ...); /* core.c */ extern void shisa_key_free (Shisa * dbh, Shisa_key * key); extern void shisa_keys_free (Shisa * dbh, Shisa_key ** keys, size_t nkeys); /************************************************************** Enumerators. */ /* Return a list of all realm names in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ extern int shisa_enumerate_realms (Shisa * dbh, char ***realms, size_t * nrealms); /* Return a list of all principals in realm in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ extern int shisa_enumerate_principals (Shisa * dbh, const char *realm, char ***principals, size_t * nprincipals); /**************************************** Functions operating on principals. */ /* Return information about specified PRINCIPAL@REALM. Can also be used check existence of principal entry, with a NULL PH. */ extern int shisa_principal_find (Shisa * dbh, const char *realm, const char *principal, Shisa_principal * ph); /* Add new PRINCIPAL@REALM with specified information and key. If PRINCIPAL is NULL, then add realm REALM. */ extern int shisa_principal_add (Shisa * dbh, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key); /* Modify information for specified PRINCIPAL@REALM. */ extern int shisa_principal_update (Shisa * dbh, const char *realm, const char *principal, const Shisa_principal * ph); /* Remove PRINCIPAL@REALM, or REALM if PRINCIPAL is NULL. Realms must be empty for them to be successfully removed. */ extern int shisa_principal_remove (Shisa * dbh, const char *realm, const char *principal); /********************************************** Functions operating on keys. */ /* Get all keys matching HINT for specified PRINCIPAL@REALM. The caller must deallocate the returned keys. If HINT is NULL, then all keys are returned. */ extern int shisa_keys_find (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys); /* Add key for PRINCIPAL@REALM. */ extern int shisa_key_add (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * key); /* Update a key for PRINCIPAL@REALM. The OLDKEY must uniquely determine the key to update, i.e., shishi_keys_find using OLDKEY as HINT must return exactly 1 key. */ extern int shisa_key_update (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * oldkey, const Shisa_key * newkey); /* Remove a key for PRINCIPAL@REALM. The KEY must uniquely determine the key to remove, i.e., shishi_keys_find using KEY as HINT must return exactly 1 key. */ extern int shisa_key_remove (Shisa * dbh, const char *realm, const char *principal, const Shisa_key * key); #endif /* SHISA_H */ shishi-1.0.2/db/db.c0000664000000000000000000000325612126660507011023 00000000000000/* db.c --- Definitions of all Shisa database backends. * Copyright (C) 2003-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" /* Get "file" database prototypes. */ #include "file.h" static _Shisa_backend _shisa_backends[] = { {"file", shisa_file_init, shisa_file_done, shisa_file_enumerate_realms, shisa_file_enumerate_principals, shisa_file_principal_find, shisa_file_principal_update, shisa_file_principal_add, shisa_file_principal_remove, shisa_file_keys_find, shisa_file_key_add, shisa_file_key_update, shisa_file_key_remove} }; /* Return structure with function pointers implementing a Shisa backend, given a name (e.g., "file"). */ _Shisa_backend * _shisa_find_backend (const char *name) { size_t i; for (i = 0; i < sizeof (_shisa_backends) / sizeof (_shisa_backends[0]); i++) if (strcmp (name, _shisa_backends[i].name) == 0) return &_shisa_backends[i]; return NULL; } shishi-1.0.2/db/Makefile.in0000644000000000000000000016633212126772724012347 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_LD_VERSION_SCRIPT_TRUE@am__append_1 = -Wl,--version-script=$(srcdir)/libshisa.map @HAVE_LD_VERSION_SCRIPT_FALSE@am__append_2 = -export-symbols-regex '^shisa.*' subdir = db DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libshisa_la_DEPENDENCIES = gl/libgnu.la ../lib/libshishi.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libshisa_la_OBJECTS = setup.lo config.lo db.lo err.lo core.lo \ file.lo fileutil.lo libshisa_la_OBJECTS = $(am_libshisa_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libshisa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libshisa_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libshisa_la_SOURCES) DIST_SOURCES = $(libshisa_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = -DLOCALEDIR=\"$(localedir)\" \ -DSYSTEMCFGFILE=\"$(CONFDIR)/shisa.conf\" \ -DDEFAULTDBPATH=\"$(DBDIR)\" \ @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gl AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) $(CFLAG_VISIBILITY) # -I../lib is to get shishi-int.h and uint32_t. AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl \ -I$(srcdir)/gl -I$(builddir)/gl \ -I../lib include_HEADERS = shisa.h lib_LTLIBRARIES = libshisa.la libshisa_la_SOURCES = libshisa.map \ shisa.h info.h \ setup.c config.c db.c err.c core.c \ file.c file.h fileutil.h fileutil.c libshisa_la_LIBADD = gl/libgnu.la ../lib/libshishi.la \ $(LIB_CLOCK_GETTIME) $(LIBSOCKET) # XXX use different libtool version for this library? libshisa_la_LDFLAGS = -version-info \ $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -no-undefined \ $(am__append_1) $(am__append_2) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu db/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu db/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libshisa.la: $(libshisa_la_OBJECTS) $(libshisa_la_DEPENDENCIES) $(EXTRA_libshisa_la_DEPENDENCIES) $(AM_V_CCLD)$(libshisa_la_LINK) -rpath $(libdir) $(libshisa_la_OBJECTS) $(libshisa_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setup.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-includeHEADERS uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/db/info.h0000664000000000000000000000771312126660507011400 00000000000000/* info.h --- Internal header file for shisa library. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #ifndef _INFO_H #define _INFO_H #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include "gettext.h" #define _(String) dgettext (PACKAGE, String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) /* Get xmalloc. */ #include "xalloc.h" /* Get prototypes. */ #include "shisa.h" typedef int (*_Shisa_db_init) (Shisa * dbh, const char *location, const char *options, void **state); typedef void (*_Shisa_db_done) (Shisa * dbh, void *state); typedef int (*_Shisa_db_enumerate_realms) (Shisa * dbh, void *state, char ***realms, size_t * nrealms); typedef int (*_Shisa_db_enumerate_principals) (Shisa * dbh, void *state, const char *realm, char ***principals, size_t * nprincipals); typedef int (*_Shisa_db_principal_find) (Shisa * dbh, void *state, const char *realm, const char *principal, Shisa_principal * ph); typedef int (*_Shisa_db_principal_update) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph); typedef int (*_Shisa_db_principal_add) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key); typedef int (*_Shisa_db_principal_remove) (Shisa * dbh, void *state, const char *realm, const char *principal); typedef int (*_Shisa_db_keys_find) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys); typedef int (*_Shisa_db_key_add) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key); typedef int (*_Shisa_db_key_update) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * oldkey, const Shisa_key * newkey); typedef int (*_Shisa_db_key_remove) (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key); struct _Shisa_backend { const char *name; _Shisa_db_init init; _Shisa_db_done done; _Shisa_db_enumerate_realms enumerate_realms; _Shisa_db_enumerate_principals enumerate_principals; _Shisa_db_principal_find principal_find; _Shisa_db_principal_update principal_update; _Shisa_db_principal_add principal_add; _Shisa_db_principal_remove principal_remove; _Shisa_db_keys_find keys_find; _Shisa_db_key_add key_add; _Shisa_db_key_update key_update; _Shisa_db_key_remove key_remove; }; typedef struct _Shisa_backend _Shisa_backend; struct _Shisa_db { _Shisa_backend *backend; void *state; }; typedef struct _Shisa_db _Shisa_db; struct Shisa { _Shisa_db *dbs; size_t ndbs; }; /* Return structure with function pointers implementing a Shisa backend, given a name (e.g., "file"). */ extern _Shisa_backend *_shisa_find_backend (const char *name); #endif /* _INFO_H */ shishi-1.0.2/db/file.c0000664000000000000000000004034412126660507011354 00000000000000/* file.c --- File based Shisa database. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ /* * Theory of operation: * * Data is stored in the standard file system, so it is subject to * normal access permission infrastructure, e.g. POSIX ACL or normal * Unix file permissions. A definition of the file database looks * like: * * file LOCATION OPTIONS * * Where LOCATION is a path name, e.g. /var/shisa. No OPTIONS are * currently implemented. * * Realms are directories in LOCATION. Principals are directories in * realm directories. Characters outside A-Za-z0-9_- are escaped * using the URL encoding, e.g. example/host%2fwww denote the * "host/www" principal in the "example" realm. * * Example file tree: * * LOCATION/EXAMPLE.ORG * LOCATION/EXAMPLE.ORG/krbtgt%2fEXAMPLE.ORG * LOCATION/EXAMPLE.ORG/host%2fwww.example.org * LOCATION/EXAMPLE.NET * LOCATION/EXAMPLE.NET/krbtgt%2fEXAMPLE.NET * */ /* XXX fix race conditions. */ #include "info.h" /* Get prototypes. */ #include "file.h" /* Get low-level file utilities. */ #include "fileutil.h" struct Shisa_file { char *path; int readonly; int allowcreate; }; typedef struct Shisa_file Shisa_file; enum { READ_ONLY_OPTION = 0, ALLOW_CREATE_OPTION = 1, THE_END }; static const char *const _shisa_file_opts[] = { /* [READ_ONLY_OPTION] = */ "read-only", /* [ALLOW_CREATE_OPTION] = */ "allow-create", /* [THE_END] = */ NULL }; static int shisa_file_cfg (Shisa * dbh, Shisa_file * info, const char *option) { char *opt = option ? xstrdup (option) : NULL; char *p = opt; char *value; int res; while (p != NULL && *p != '\0') { switch (getsubopt (&p, (char *const *) _shisa_file_opts, &value)) { case READ_ONLY_OPTION: info->readonly = 1; break; case ALLOW_CREATE_OPTION: info->allowcreate = 1; break; default: shisa_info (dbh, "Unknown file database option: `%s'.", value); res = SHISA_CFG_SYNTAX_ERROR; goto out; break; } } res = SHISA_OK; out: free (opt); return res; } /* Initialize file backend, i.e., parse options and check if file root exists and allocate backend handle. */ int shisa_file_init (Shisa * dbh, const char *location, const char *options, void **state) { Shisa_file *info; int rc; if (!_shisa_isdir (location)) return SHISA_OPEN_ERROR; *state = info = xcalloc (1, sizeof (*info)); rc = shisa_file_cfg (dbh, info, options); if (rc != SHISA_OK) return rc; info->path = xstrdup (location); return SHISA_OK; } /* Destroy backend handle. */ void shisa_file_done (Shisa * dbh, void *state) { Shisa_file *info = state; if (info) free (info->path); free (info); } /* Return a list of all realm names in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ int shisa_file_enumerate_realms (Shisa * dbh, void *state, char ***realms, size_t * nrealms) { Shisa_file *info = state; if (_shisa_lsdir (info->path, realms, nrealms) != 0) return SHISA_ENUMERATE_REALM_ERROR; return SHISA_OK; } /* Return a list of all principals in realm in backend, as zero-terminated UTF-8 strings. The caller must deallocate the strings. */ int shisa_file_enumerate_principals (Shisa * dbh, void *state, const char *realm, char ***principals, size_t * nprincipals) { Shisa_file *info = state; if (!_shisa_isdir2 (info->path, realm)) return SHISA_NO_REALM; if (_shisa_lsdir2 (info->path, realm, principals, nprincipals) != 0) return SHISA_ENUMERATE_PRINCIPAL_ERROR; return SHISA_OK; } /* Return information about specified PRINCIPAL@REALM. Can also be used check existence of principal entry, with a NULL PH. */ int shisa_file_principal_find (Shisa * dbh, void *state, const char *realm, const char *principal, Shisa_principal * ph) { Shisa_file *info = state; if (!_shisa_isdir3 (info->path, realm, principal)) return SHISA_NO_PRINCIPAL; if (!ph) return SHISA_OK; ph->notusedbefore = _shisa_mtime4 (info->path, realm, principal, "validfrom.stamp"); ph->isdisabled = _shisa_isfile4 (info->path, realm, principal, "disabled.flag"); ph->kvno = _shisa_uint32link4 (info->path, realm, principal, "latest.key"); ph->lastinitialtgt = _shisa_mtime4 (info->path, realm, principal, "lastinitaltgt.stamp"); ph->lastinitialrequest = _shisa_mtime4 (info->path, realm, principal, "lastinitial.stamp"); ph->lasttgt = _shisa_mtime4 (info->path, realm, principal, "lasttgt.stamp"); ph->lastrenewal = _shisa_mtime4 (info->path, realm, principal, "lastrenewal.stamp"); ph->passwordexpire = _shisa_mtime4 (info->path, realm, principal, "passwordexpire.stamp"); ph->accountexpire = _shisa_mtime4 (info->path, realm, principal, "accountexpire.stamp"); return SHISA_OK; } static int realm_add (Shisa * dbh, void *state, const char *realm) { Shisa_file *info = state; if (_shisa_isdir2 (info->path, realm)) return SHISA_ADD_REALM_EXISTS; if (_shisa_mkdir2 (info->path, realm) != 0) return SHISA_ADD_REALM_ERROR; return SHISA_OK; } static int principal_add (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key) { Shisa_file *info = state; if (!_shisa_isdir2 (info->path, realm)) return SHISA_NO_REALM; if (_shisa_isdir3 (info->path, realm, principal)) return SHISA_ADD_PRINCIPAL_EXISTS; if (_shisa_mkdir3 (info->path, realm, principal) != 0) return SHISA_ADD_PRINCIPAL_ERROR; if (ph) shisa_file_principal_update (dbh, state, realm, principal, ph); if (key) shisa_file_key_add (dbh, state, realm, principal, key); return SHISA_OK; } /* Add new PRINCIPAL@REALM with specified information and key. If PRINCIPAL is NULL, then add realm REALM. */ int shisa_file_principal_add (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph, const Shisa_key * key) { int rc; if (principal == NULL) rc = realm_add (dbh, state, realm); else rc = principal_add (dbh, state, realm, principal, ph, key); return rc; } /* Modify information for specified PRINCIPAL@REALM. */ int shisa_file_principal_update (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_principal * ph) { return SHISA_OK; } static int realm_remove (Shisa * dbh, void *state, const char *realm) { Shisa_file *info = state; size_t nprincipals = 0; int rc; if (!_shisa_isdir2 (info->path, realm)) return SHISA_NO_REALM; rc = shisa_file_enumerate_principals (dbh, state, realm, NULL, &nprincipals); if (rc != SHISA_OK) return rc; if (nprincipals > 0) return SHISA_REMOVE_REALM_NONEMPTY; if (_shisa_rmdir2 (info->path, realm) != 0) return SHISA_REMOVE_REALM_ERROR; return SHISA_OK; } static int remove_keys (Shisa * dbh, void *state, const char *realm, const char *principal) { Shisa_file *info = state; char **files; size_t nfiles; size_t i; int rc; files = NULL; nfiles = 0; rc = _shisa_ls4 (info->path, realm, principal, "keys", &files, &nfiles); if (rc != SHISA_OK) return rc; for (i = 0; i < nfiles; i++) { rc = _shisa_rm5 (info->path, realm, principal, "keys", files[i]); free (files[i]); } free (files); rc = _shisa_rmdir4 (info->path, realm, principal, "keys"); if (rc != SHISA_OK) return rc; return SHISA_OK; } #if 0 static int remove_info (Shisa * dbh, void *state, const char *realm, const char *principal) { Shisa_file *info = state; char **files; size_t nfiles; size_t i; int rc; files = NULL; nfiles = 0; rc = _shisa_ls3 (info->path, realm, principal, &files, &nfiles); if (rc != SHISA_OK) return rc; for (i = 0; i < nfiles; i++) { rc = _shisa_rm4 (info->path, realm, principal, files[i]); free (files[i]); } free (files); return SHISA_OK; } #endif static int principal_remove (Shisa * dbh, void *state, const char *realm, const char *principal) { Shisa_file *info = state; int rc; if (!_shisa_isdir2 (info->path, realm)) return SHISA_NO_REALM; if (!_shisa_isdir3 (info->path, realm, principal)) return SHISA_NO_PRINCIPAL; rc = remove_keys (dbh, state, realm, principal); if (rc != SHISA_OK) return rc; if (_shisa_rmdir3 (info->path, realm, principal) != 0) return SHISA_REMOVE_PRINCIPAL_ERROR; return SHISA_OK; } /* Remove PRINCIPAL@REALM, or REALM if PRINCIPAL is NULL. Realms must be empty for them to be successfully removed. */ int shisa_file_principal_remove (Shisa * dbh, void *state, const char *realm, const char *principal) { int rc; if (principal == NULL) rc = realm_remove (dbh, state, realm); else rc = principal_remove (dbh, state, realm, principal); return rc; } static int read_key (Shisa * dbh, Shisa_file * info, const char *realm, const char *principal, const char *keyfile, Shisa_key ** key) { Shisa_key tmpkey; FILE *fh; char *file; unsigned passwdlen; char junk; int rc; asprintf (&file, "keys/%s", keyfile); fh = _shisa_fopen4 (info->path, realm, principal, file, "r"); free (file); if (!fh) return SHISA_NO_KEY; memset (&tmpkey, 0, sizeof (tmpkey)); rc = fscanf (fh, "%u %u %u %u %u %u", &tmpkey.etype, &tmpkey.keylen, &tmpkey.saltlen, &tmpkey.str2keyparamlen, &passwdlen, &tmpkey.priority); if (rc != 5 && rc != 6) return SHISA_NO_KEY; if (rc == 5) tmpkey.priority = 0; if (rc == 6) /* We can't include '\n' in scanf format above, because any whitespace on the next line will be skipped. */ if (fread (&junk, 1, 1, fh) != 1 || junk != '\n') return SHISA_NO_KEY; if (tmpkey.keylen > 0) { tmpkey.key = xmalloc (tmpkey.keylen + 1); if (fread (tmpkey.key, 1, tmpkey.keylen, fh) != tmpkey.keylen) return SHISA_NO_KEY; tmpkey.key[tmpkey.keylen] = '\0'; } if (tmpkey.saltlen > 0) { tmpkey.salt = xmalloc (tmpkey.saltlen + 1); if (fread (tmpkey.salt, 1, tmpkey.saltlen, fh) != tmpkey.saltlen) return SHISA_NO_KEY; tmpkey.salt[tmpkey.saltlen] = '\0'; } if (tmpkey.str2keyparamlen > 0) { tmpkey.str2keyparam = xmalloc (tmpkey.str2keyparamlen + 1); if (fread (tmpkey.str2keyparam, 1, tmpkey.str2keyparamlen, fh) != tmpkey.str2keyparamlen) return SHISA_NO_KEY; tmpkey.str2keyparam[tmpkey.str2keyparamlen] = '\0'; } if (passwdlen > 0) { tmpkey.password = xmalloc (passwdlen + 1); if (fread (tmpkey.password, 1, passwdlen, fh) != passwdlen) return SHISA_NO_KEY; tmpkey.password[passwdlen] = '\0'; } rc = fclose (fh); if (rc != 0) { perror (keyfile); return SHISA_NO_KEY; } *key = xmalloc (sizeof (**key)); memcpy (*key, &tmpkey, sizeof (tmpkey)); return SHISA_OK; } static int key_match (const Shisa_key * hint, Shisa_key * key) { int ok = 1; if (hint->kvno) ok = ok && hint->kvno == key->kvno; if (hint->etype) ok = ok && hint->etype == key->etype; if (hint->keylen) ok = ok && hint->keylen == key->keylen && memcmp (hint->key, key->key, key->keylen) == 0; if (hint->saltlen) ok = ok && hint->saltlen == key->saltlen && memcmp (hint->salt, key->salt, key->saltlen) == 0; if (hint->str2keyparamlen) ok = ok && hint->str2keyparamlen == key->str2keyparamlen && memcmp (hint->str2keyparam, key->str2keyparam, key->str2keyparamlen) == 0; if (hint->password) ok = ok && strcmp (hint->password, key->password) == 0; return ok; } /* Get all keys matching HINT for specified PRINCIPAL@REALM. The caller must deallocate the returned keys. If HINT is NULL, then all keys are returned. */ int shisa_file_keys_find (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * hint, Shisa_key *** keys, size_t * nkeys) { Shisa_file *info = state; Shisa_key *tmpkey; char **files; size_t nfiles, matched = 0; size_t i; int rc; files = NULL; nfiles = 0; rc = _shisa_ls4 (info->path, realm, principal, "keys", &files, &nfiles); if (rc != SHISA_OK) return SHISA_ENUMERATE_KEY_ERROR; if (nkeys) *nkeys = nfiles; if (keys) *keys = xmalloc (nfiles * sizeof (**keys)); for (i = 0; i < nfiles; i++) { if (rc == SHISA_OK && (rc = read_key (dbh, info, realm, principal, files[i], &tmpkey)) == SHISA_OK) { if (hint == NULL || key_match (hint, tmpkey)) { if (keys) (*keys)[matched] = tmpkey; matched++; } else shisa_key_free (dbh, tmpkey); } free (files[i]); } if (nfiles > 0) free (files); if (nkeys) *nkeys = matched; return rc; } /* Add key for PRINCIPAL@REALM. */ int shisa_file_key_add (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key) { Shisa_file *info = state; size_t passwdlen = key && key->password ? strlen (key->password) : 0; char *file = NULL; size_t num = 0; FILE *fh; if (!key) return SHISA_NO_KEY; if (!_shisa_isdir4 (info->path, realm, principal, "keys") && _shisa_mkdir4 (info->path, realm, principal, "keys")) return SHISA_NO_KEY; do { free (file); asprintf (&file, "keys/%d-%d-%d.key", key->kvno, key->etype, num++); } while (_shisa_isfile4 (info->path, realm, principal, file)); fh = _shisa_fopen4 (info->path, realm, principal, file, "w"); free (file); if (!fh) { perror (file); return SHISA_ADD_KEY_ERROR; } fprintf (fh, "%u %u %u %u %u %u\n", key->etype, key->keylen, key->saltlen, key->str2keyparamlen, passwdlen, key->priority); if (key->keylen > 0) fwrite (key->key, 1, key->keylen, fh); if (key->saltlen > 0) fwrite (key->salt, 1, key->saltlen, fh); if (key->str2keyparamlen > 0) fwrite (key->str2keyparam, 1, key->str2keyparamlen, fh); if (passwdlen > 0) fwrite (key->password, 1, passwdlen, fh); fclose (fh); return SHISA_OK; } /* Update a key for PRINCIPAL@REALM. The OLDKEY must uniquely determine the key to update, i.e., shishi_keys_find using OLDKEY as HINT must return exactly 1 key. */ int shisa_file_key_update (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * oldkey, const Shisa_key * newkey) { return SHISA_NO_KEY; } /* Remove a key for PRINCIPAL@REALM. The KEY must uniquely determine the key to remove, i.e., shishi_keys_find using KEY as HINT must return exactly 1 key. */ int shisa_file_key_remove (Shisa * dbh, void *state, const char *realm, const char *principal, const Shisa_key * key) { Shisa_file *info = state; Shisa_key *tmpkey; char **files; size_t nfiles; size_t i; int rc; char *found = NULL; files = NULL; nfiles = 0; rc = _shisa_ls4 (info->path, realm, principal, "keys", &files, &nfiles); if (rc != SHISA_OK) return rc; for (i = 0; i < nfiles; i++) { if (rc == SHISA_OK && (rc = read_key (dbh, info, realm, principal, files[i], &tmpkey)) == SHISA_OK) { if (key == NULL || key_match (key, tmpkey)) { if (found) { free (found); rc = SHISA_MULTIPLE_KEY_MATCH; } else found = xstrdup (files[i]); } shisa_key_free (dbh, tmpkey); } free (files[i]); } if (nfiles > 0) free (files); if (rc != SHISA_OK) return rc; if (!found) return SHISA_NO_KEY; rc = _shisa_rm5 (info->path, realm, principal, "keys", found); free (found); return rc; } shishi-1.0.2/db/setup.c0000664000000000000000000000650712126660507011600 00000000000000/* init.c --- Initialization functions for the Shisa library. * Copyright (C) 2002-2013 Simon Josefsson * * This file is part of Shishi. * * Shishi 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. * * Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301, USA * */ #include "info.h" /** * shisa: * * Initializes the Shisa library. If this function fails, it may * print diagnostic errors to stderr. * * Return value: Returns Shisa library handle, or %NULL on error. **/ Shisa * shisa (void) { Shisa *dbh; dbh = xcalloc (1, sizeof (*dbh)); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); return dbh; } /** * shisa_done: * @handle: shisa handle as allocated by shisa(). * * Deallocates the shisa library handle. The handle must not be used * in any calls to shisa functions after this. **/ void shisa_done (Shisa * dbh) { _Shisa_db *db; size_t i; for (i = 0, db = dbh->dbs; i < dbh->ndbs; i++, db++) db->backend->done (dbh, db->state); free (dbh->dbs); free (dbh); } /** * shisa_init: * @dbh: pointer to library handle to be created. * * Create a Shisa library handle, using shisa(), and read the system * configuration file from their default locations. The paths to the * default system configuration file is decided at compile time * ($sysconfdir/shisa.conf). * * The handle is allocated regardless of return values, except for * SHISA_INIT_ERROR which indicates a problem allocating the handle. * (The other error conditions comes from reading the files.) * * Return value: Returns %SHISA_OK iff successful. **/ int shisa_init (Shisa ** dbh) { return shisa_init_with_paths (dbh, NULL); } /** * shisa_init_with_paths: * @dbh: pointer to library handle to be created. * @file: Filename of system configuration, or NULL. * * Create a Shisa library handle, using shisa(), and read the system * configuration file indicated location (or the default location, if * %NULL). The paths to the default system configuration file is * decided at compile time ($sysconfdir/shisa.conf). * * The handle is allocated regardless of return values, except for * SHISA_INIT_ERROR which indicates a problem allocating the handle. * (The other error conditions comes from reading the files.) * * Return value: Returns %SHISA_OK iff successful. **/ int shisa_init_with_paths (Shisa ** dbh, const char *file) { int rc; if (!dbh || !(*dbh = shisa ())) return SHISA_INIT_ERROR; if (!file) file = shisa_cfg_default_systemfile (*dbh); rc = shisa_cfg_from_file (*dbh, file); if (rc != SHISA_OK && rc != SHISA_CFG_NO_FILE) return rc; if ((*dbh)->ndbs == 0) { rc = shisa_cfg (*dbh, "db file " DEFAULTDBPATH); if (rc != SHISA_OK) return rc; } return SHISA_OK; } shishi-1.0.2/db/gl/0000755000000000000000000000000012126773313010744 500000000000000shishi-1.0.2/db/gl/allocator.c0000664000000000000000000000025112015626624013007 00000000000000#define _GL_USE_STDLIB_ALLOC 1 #include #include "allocator.h" #include struct allocator const stdlib_allocator = { malloc, realloc, free, NULL }; shishi-1.0.2/db/gl/allocator.h0000644000000000000000000000423412126660076013021 00000000000000/* Memory allocators such as malloc+free. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert. */ #ifndef _GL_ALLOCATOR_H #define _GL_ALLOCATOR_H #include /* An object describing a memory allocator family. */ struct allocator { /* Do not use GCC attributes such as __attribute__ ((malloc)) with the function types pointed at by these members, because these attributes do not work with pointers to functions. See . */ /* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE should return NULL, though not necessarily set errno. When given a zero size it may return NULL even if successful. */ void *(*allocate) (size_t); /* If nonnull, call REALLOCATE to reallocate memory, like 'realloc'. On failure REALLOCATE should return NULL, though not necessarily set errno. When given a zero size it may return NULL even if successful. */ void *(*reallocate) (void *, size_t); /* Call FREE to free memory, like 'free'. */ void (*free) (void *); /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (..., SIZE) fails. DIE should not return. SIZE should equal SIZE_MAX if size_t overflow was detected while calculating sizes to be passed to MALLOC or REALLOC. */ void (*die) (size_t); }; /* An allocator using the stdlib functions and a null DIE function. */ extern struct allocator const stdlib_allocator; #endif /* _GL_ALLOCATOR_H */ shishi-1.0.2/db/gl/areadlink.c0000644000000000000000000000372412126660076012771 00000000000000/* areadlink.c -- readlink wrapper to return the link name in malloc'd storage Unlike xreadlink and xreadlink_with_size, don't ever call exit. Copyright (C) 2001, 2003-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Jim Meyering and Bruno Haible . */ #include /* Specification. */ #include "areadlink.h" #include "careadlinkat.h" #include #include /* Get the symbolic link value of FILENAME and put it into BUFFER, with size BUFFER_SIZE. This function acts like readlink but has readlinkat's signature. */ static ssize_t careadlinkatcwd (int fd, char const *filename, char *buffer, size_t buffer_size) { /* FD must be AT_FDCWD here, otherwise the caller is using this function in contexts it was not meant for. */ if (fd != AT_FDCWD) abort (); return readlink (filename, buffer, buffer_size); } /* Call readlink to get the symbolic link value of FILENAME. Return a pointer to that NUL-terminated string in malloc'd storage. If readlink fails, return NULL and set errno. If allocation fails, or if the link value is longer than SIZE_MAX :-), return NULL and set errno to ENOMEM. */ char * areadlink (char const *filename) { return careadlinkat (AT_FDCWD, filename, NULL, 0, NULL, careadlinkatcwd); } shishi-1.0.2/db/gl/Makefile.am0000664000000000000000000000054112015626624012721 00000000000000AUTOMAKE_OPTIONS = 1.5 gnits noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = EXTRA_DIST = BUILT_SOURCES = SUFFIXES = MOSTLYCLEANFILES = MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl include gnulib.mk libgnu_la_LIBADD += $(top_builddir)/gl/libgnu.la shishi-1.0.2/db/gl/m4/0000755000000000000000000000000012126773311011262 500000000000000shishi-1.0.2/db/gl/m4/readlink.m40000644000000000000000000000467012126660076013247 00000000000000# readlink.m4 serial 12 dnl Copyright (C) 2003, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_READLINK], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_FUNCS_ONCE([readlink]) if test $ac_cv_func_readlink = no; then HAVE_READLINK=0 else AC_CACHE_CHECK([whether readlink signature is correct], [gl_cv_decl_readlink_works], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include /* Cause compilation failure if original declaration has wrong type. */ ssize_t readlink (const char *, char *, size_t);]])], [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])]) dnl Solaris 9 ignores trailing slash. dnl FreeBSD 7.2 dereferences only one level of links with trailing slash. AC_CACHE_CHECK([whether readlink handles trailing slash correctly], [gl_cv_func_readlink_works], [# We have readlink, so assume ln -s works. ln -s conftest.no-such conftest.link ln -s conftest.link conftest.lnk2 AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char buf[20]; return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])], [gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_readlink_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_readlink_works="guessing no" ;; esac ]) rm -f conftest.link conftest.lnk2]) case "$gl_cv_func_readlink_works" in *yes) if test "$gl_cv_decl_readlink_works" != yes; then REPLACE_READLINK=1 fi ;; *) AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink fails to recognize a trailing slash.]) REPLACE_READLINK=1 ;; esac fi ]) # Like gl_FUNC_READLINK, except prepare for separate compilation # (no REPLACE_READLINK, no AC_LIBOBJ). AC_DEFUN([gl_FUNC_READLINK_SEPARATE], [ AC_CHECK_FUNCS_ONCE([readlink]) gl_PREREQ_READLINK ]) # Prerequisites of lib/readlink.c. AC_DEFUN([gl_PREREQ_READLINK], [ : ]) shishi-1.0.2/db/gl/m4/gnulib-comp.m40000644000000000000000000001745112126660076013673 00000000000000# DO NOT EDIT! GENERATED AUTOMATICALLY! # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. # In projects that use version control, this file can be treated like # other built files. # This macro should be invoked from ./configure.ac, in the section # "Checks for programs", right after AC_PROG_CC, and certainly before # any checks for libraries, header files, types and library functions. AC_DEFUN([gl3_EARLY], [ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace m4_pattern_allow([^gl_ES$])dnl a valid locale name m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable AC_REQUIRE([gl_PROG_AR_RANLIB]) # Code from module allocator: # Code from module areadlink: # Code from module careadlinkat: # Code from module readlink: ]) # This macro should be invoked from ./configure.ac, in the section # "Check for header files, types and library functions". AC_DEFUN([gl3_INIT], [ AM_CONDITIONAL([GL_COND_LIBTOOL], [true]) gl_cond_libtool=true gl_m4_base='db/gl/m4' m4_pushdef([AC_LIBOBJ], m4_defn([gl3_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl3_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl3_LIBSOURCES])) m4_pushdef([gl3_LIBSOURCES_LIST], []) m4_pushdef([gl3_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='db/gl' AC_CHECK_FUNCS_ONCE([readlinkat]) gl_FUNC_READLINK if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then AC_LIBOBJ([readlink]) gl_PREREQ_READLINK fi gl_UNISTD_MODULE_INDICATOR([readlink]) # End of code from modules m4_ifval(gl3_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl3_LIBSOURCES_DIR])[ || for gl_file in ]gl3_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl3_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl3_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl3_LIBSOURCES_DIR]) m4_popdef([gl3_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl3_libobjs= gl3_ltlibobjs= if test -n "$gl3_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl3_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl3_libobjs="$gl3_libobjs $i.$ac_objext" gl3_ltlibobjs="$gl3_ltlibobjs $i.lo" done fi AC_SUBST([gl3_LIBOBJS], [$gl3_libobjs]) AC_SUBST([gl3_LTLIBOBJS], [$gl3_ltlibobjs]) ]) gltests_libdeps= gltests_ltlibdeps= m4_pushdef([AC_LIBOBJ], m4_defn([gl3tests_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl3tests_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl3tests_LIBSOURCES])) m4_pushdef([gl3tests_LIBSOURCES_LIST], []) m4_pushdef([gl3tests_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='tests' changequote(,)dnl gl3tests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS changequote([, ])dnl AC_SUBST([gl3tests_WITNESS]) gl_module_indicator_condition=$gl3tests_WITNESS m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) m4_popdef([gl_MODULE_INDICATOR_CONDITION]) m4_ifval(gl3tests_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl3tests_LIBSOURCES_DIR])[ || for gl_file in ]gl3tests_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl3tests_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl3tests_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl3tests_LIBSOURCES_DIR]) m4_popdef([gl3tests_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl3tests_libobjs= gl3tests_ltlibobjs= if test -n "$gl3tests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl3tests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl3tests_libobjs="$gl3tests_libobjs $i.$ac_objext" gl3tests_ltlibobjs="$gl3tests_ltlibobjs $i.lo" done fi AC_SUBST([gl3tests_LIBOBJS], [$gl3tests_libobjs]) AC_SUBST([gl3tests_LTLIBOBJS], [$gl3tests_ltlibobjs]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl3_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl3_LIBOBJ], [ AS_LITERAL_IF([$1], [gl3_LIBSOURCES([$1.c])])dnl gl3_LIBOBJS="$gl3_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl3_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl3_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl3_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl3_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl3_LIBSOURCES_DIR], [db/gl]) m4_append([gl3_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl3tests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl3tests_LIBOBJ], [ AS_LITERAL_IF([$1], [gl3tests_LIBSOURCES([$1.c])])dnl gl3tests_LIBOBJS="$gl3tests_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl3tests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl3tests_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl3tests_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl3tests_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl3tests_LIBSOURCES_DIR], [tests]) m4_append([gl3tests_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([gl3_FILE_LIST], [ lib/allocator.c lib/allocator.h lib/areadlink.c lib/areadlink.h lib/careadlinkat.c lib/careadlinkat.h lib/readlink.c m4/00gnulib.m4 m4/gnulib-common.m4 m4/readlink.m4 ]) shishi-1.0.2/db/gl/gnulib.mk0000644000000000000000000000462012126660076012500 00000000000000## DO NOT EDIT! GENERATED AUTOMATICALLY! ## Process this file with automake to produce Makefile.in. # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=db/gl --m4-base=db/gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=absolute-header --avoid=include_next --avoid=link-warning --avoid=malloc-posix --avoid=ssize_t --avoid=stat --avoid=stdlib --avoid=unistd --makefile-name=gnulib.mk --no-conditional-dependencies --libtool --macro-prefix=gl3 --no-vc-files areadlink MOSTLYCLEANFILES += core *.stackdump noinst_LTLIBRARIES += libgnu.la libgnu_la_SOURCES = libgnu_la_LIBADD = $(gl3_LTLIBOBJS) libgnu_la_DEPENDENCIES = $(gl3_LTLIBOBJS) EXTRA_libgnu_la_SOURCES = libgnu_la_LDFLAGS = $(AM_LDFLAGS) libgnu_la_LDFLAGS += -no-undefined ## begin gnulib module allocator libgnu_la_SOURCES += allocator.c EXTRA_DIST += allocator.h ## end gnulib module allocator ## begin gnulib module areadlink libgnu_la_SOURCES += areadlink.c EXTRA_DIST += areadlink.h ## end gnulib module areadlink ## begin gnulib module careadlinkat libgnu_la_SOURCES += careadlinkat.c EXTRA_DIST += careadlinkat.h ## end gnulib module careadlinkat ## begin gnulib module readlink EXTRA_DIST += readlink.c EXTRA_libgnu_la_SOURCES += readlink.c ## end gnulib module readlink mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : shishi-1.0.2/db/gl/Makefile.in0000644000000000000000000014673612126772724012757 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=db/gl --m4-base=db/gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=absolute-header --avoid=include_next --avoid=link-warning --avoid=malloc-posix --avoid=ssize_t --avoid=stat --avoid=stdlib --avoid=unistd --makefile-name=gnulib.mk --no-conditional-dependencies --libtool --macro-prefix=gl3 --no-vc-files areadlink VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/gnulib.mk subdir = db/gl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libgnu_la_OBJECTS = allocator.lo areadlink.lo careadlinkat.lo libgnu_la_OBJECTS = $(am_libgnu_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgnu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgnu_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) DIST_SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.5 gnits noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = libgnu.la EXTRA_DIST = allocator.h areadlink.h careadlinkat.h readlink.c BUILT_SOURCES = SUFFIXES = MOSTLYCLEANFILES = core *.stackdump MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_builddir)/gl libgnu_la_SOURCES = allocator.c areadlink.c careadlinkat.c libgnu_la_LIBADD = $(gl3_LTLIBOBJS) $(top_builddir)/gl/libgnu.la libgnu_la_DEPENDENCIES = $(gl3_LTLIBOBJS) EXTRA_libgnu_la_SOURCES = readlink.c libgnu_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits db/gl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits db/gl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/gnulib.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgnu.la: $(libgnu_la_OBJECTS) $(libgnu_la_DEPENDENCIES) $(EXTRA_libgnu_la_DEPENDENCIES) $(AM_V_CCLD)$(libgnu_la_LINK) $(libgnu_la_OBJECTS) $(libgnu_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/areadlink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/careadlinkat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool mostlyclean-local pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES clean-noinstLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ pdf-am ps ps-am tags uninstall uninstall-am mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/db/gl/careadlinkat.c0000644000000000000000000001127712126660076013463 00000000000000/* Read symbolic links into a buffer without size limitation, relative to fd. Copyright (C) 2001, 2003-2004, 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #include #include "careadlinkat.h" #include #include #include #include /* Define this independently so that stdint.h is not a prerequisite. */ #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #include "allocator.h" /* Assuming the current directory is FD, get the symbolic link value of FILENAME as a null-terminated string and put it into a buffer. If FD is AT_FDCWD, FILENAME is interpreted relative to the current working directory, as in openat. If the link is small enough to fit into BUFFER put it there. BUFFER's size is BUFFER_SIZE, and BUFFER can be null if BUFFER_SIZE is zero. If the link is not small, put it into a dynamically allocated buffer managed by ALLOC. It is the caller's responsibility to free the returned value if it is nonnull and is not BUFFER. A null ALLOC stands for the standard allocator. The PREADLINKAT function specifies how to read links. It operates like POSIX readlinkat() but can assume that its first argument is the same as FD. If successful, return the buffer address; otherwise return NULL and set errno. */ char * careadlinkat (int fd, char const *filename, char *buffer, size_t buffer_size, struct allocator const *alloc, ssize_t (*preadlinkat) (int, char const *, char *, size_t)) { char *buf; size_t buf_size; size_t buf_size_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; char stack_buf[1024]; if (! alloc) alloc = &stdlib_allocator; if (! buffer_size) { /* Allocate the initial buffer on the stack. This way, in the common case of a symlink of small size, we get away with a single small malloc() instead of a big malloc() followed by a shrinking realloc(). */ buffer = stack_buf; buffer_size = sizeof stack_buf; } buf = buffer; buf_size = buffer_size; do { /* Attempt to read the link into the current buffer. */ ssize_t link_length = preadlinkat (fd, filename, buf, buf_size); size_t link_size; if (link_length < 0) { /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1 with errno == ERANGE if the buffer is too small. */ int readlinkat_errno = errno; if (readlinkat_errno != ERANGE) { if (buf != buffer) { alloc->free (buf); errno = readlinkat_errno; } return NULL; } } link_size = link_length; if (link_size < buf_size) { buf[link_size++] = '\0'; if (buf == stack_buf) { char *b = (char *) alloc->allocate (link_size); buf_size = link_size; if (! b) break; memcpy (b, buf, link_size); buf = b; } else if (link_size < buf_size && buf != buffer && alloc->reallocate) { /* Shrink BUF before returning it. */ char *b = (char *) alloc->reallocate (buf, link_size); if (b) buf = b; } return buf; } if (buf != buffer) alloc->free (buf); if (buf_size <= buf_size_max / 2) buf_size *= 2; else if (buf_size < buf_size_max) buf_size = buf_size_max; else if (buf_size_max < SIZE_MAX) { errno = ENAMETOOLONG; return NULL; } else break; buf = (char *) alloc->allocate (buf_size); } while (buf); if (alloc->die) alloc->die (buf_size); errno = ENOMEM; return NULL; } shishi-1.0.2/db/gl/areadlink.h0000644000000000000000000000231112126660076012765 00000000000000/* Read symbolic links without size limitation. Copyright (C) 2001, 2003-2004, 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Jim Meyering */ #include extern char *areadlink (char const *filename); extern char *areadlink_with_size (char const *filename, size_t size_hint); #if GNULIB_AREADLINKAT extern char *areadlinkat (int fd, char const *filename); #endif #if GNULIB_AREADLINKAT_WITH_SIZE extern char *areadlinkat_with_size (int fd, char const *filename, size_t size_hint); #endif shishi-1.0.2/db/gl/readlink.c0000644000000000000000000000446312126660076012631 00000000000000/* Stub for readlink(). Copyright (C) 2003-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include #include #include #include #if !HAVE_READLINK /* readlink() substitute for systems that don't have a readlink() function, such as DJGPP 2.03 and mingw32. */ ssize_t readlink (const char *name, char *buf _GL_UNUSED, size_t bufsize _GL_UNUSED) { struct stat statbuf; /* In general we should use lstat() here, not stat(). But on platforms without symbolic links, lstat() - if it exists - would be equivalent to stat(), therefore we can use stat(). This saves us a configure check. */ if (stat (name, &statbuf) >= 0) errno = EINVAL; return -1; } #else /* HAVE_READLINK */ # undef readlink /* readlink() wrapper that uses correct types, for systems like cygwin 1.5.x where readlink returns int, and which rejects trailing slash, for Solaris 9. */ ssize_t rpl_readlink (const char *name, char *buf, size_t bufsize) { # if READLINK_TRAILING_SLASH_BUG size_t len = strlen (name); if (len && name[len - 1] == '/') { /* Even if name without the slash is a symlink to a directory, both lstat() and stat() must resolve the trailing slash to the directory rather than the symlink. We can therefore safely use stat() to distinguish between EINVAL and ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */ struct stat st; if (stat (name, &st) == 0) errno = EINVAL; return -1; } # endif /* READLINK_TRAILING_SLASH_BUG */ return readlink (name, buf, bufsize); } #endif /* HAVE_READLINK */ shishi-1.0.2/db/gl/careadlinkat.h0000644000000000000000000000475412126660076013472 00000000000000/* Read symbolic links into a buffer without size limitation, relative to fd. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #ifndef _GL_CAREADLINKAT_H #define _GL_CAREADLINKAT_H #include #include struct allocator; /* Assuming the current directory is FD, get the symbolic link value of FILENAME as a null-terminated string and put it into a buffer. If FD is AT_FDCWD, FILENAME is interpreted relative to the current working directory, as in openat. If the link is small enough to fit into BUFFER put it there. BUFFER's size is BUFFER_SIZE, and BUFFER can be null if BUFFER_SIZE is zero. If the link is not small, put it into a dynamically allocated buffer managed by ALLOC. It is the caller's responsibility to free the returned value if it is nonnull and is not BUFFER. The PREADLINKAT function specifies how to read links. It operates like POSIX readlinkat() but can assume that its first argument is the same as FD. If successful, return the buffer address; otherwise return NULL and set errno. */ char *careadlinkat (int fd, char const *filename, char *buffer, size_t buffer_size, struct allocator const *alloc, ssize_t (*preadlinkat) (int, char const *, char *, size_t)); /* Suitable value for careadlinkat's FD argument. */ #if HAVE_READLINKAT /* AT_FDCWD is declared in . */ #else /* Define AT_FDCWD independently, so that the careadlinkat module does not depend on the fcntl-h module. We might as well use the same value as fcntl-h. */ # ifndef AT_FDCWD # define AT_FDCWD (-3041965) # endif #endif #endif /* _GL_CAREADLINKAT_H */ shishi-1.0.2/po/0000755000000000000000000000000012126773312010372 500000000000000shishi-1.0.2/po/stamp-po0000644000000000000000000000001212126773035011770 00000000000000timestamp shishi-1.0.2/po/vi.gmo0000644000000000000000000004332612126773035011446 00000000000000Þ•¯”é °±¸ À Ê ÔàJæ`1(’»ÄÓî  $B\z —¸Î&è*1:3l &½4ä&(@%i¤bÂb%ˆ¨Ã)×)'+"Sv&Ž"µ(Ø#=a#)¥%Ïõ' 6"W'z#¢%Æì),2_%w)Çã$ù)8,b«Êè!ù'$C&h"%²Øó÷ '?bV¹*Áì#9.]&Œ³ÐÙî .9*W2‚µÏ!í"2!Pr"‘´ÌèAú</P'€+¨(Ôý&)A&k(’»Õ#õ  ' H )W " ¤ *à î ,!#0!PT!¥! Å!kæ!R"$j"""ž"Á"Ö",è"(#">#&a# ˆ#©# ½#"Ë#î# $*$%F$l$t$ˆ$$´$ Ì$×$é$µü$ ²&¼& Ã& Ñ&Ü&ë&wñ&ži'( (&)(P(o( ('š(3Â(&ö(2)(P)4y)%®)1Ô)%*1,*;^*Fš*;á*2+NP+EŸ+>å+?$,$d,!‰,n«,k-†-$¤-É-Få-K,.Bx.:». ö.1/-I/Dw/ ¼/ Ý/-è/=0=T0=’0DÐ0D1"Z18}18¶13ï1C#2Cg2>«2#ê2/34>3s3:‹3=Æ34 4-84f4?{48»4Kô4M@5NŽ5'Ý5965?6/u6+¥64Ñ6)7'07X7^7'y7#¡7Å7uß7 U86b8%™8(¿8/è8;9<T97‘9É9æ9÷9 :+:J:i:5y:.¯:3Þ:&;(9;3b;7–;,Î;8û;,4<8a<)š<5Ä<ú<Y=j=F‡=AÎ=>>:O>@Š>7Ë>Y?J]?C¨?$ì?@-1@_@r@@5¡@0×@0A:9AtA/A=½AnûA5jB9 B‚ÚB,]C&ŠC±C5ÁC÷C D-!D-OD6}DJ´DÿDE3E4DE%yE0ŸE!ÐE1òE $F/FIFdF€F F¨F½F— ‘‡x5&dc•!GzL=g}„‹œ*H¨;sCŒRDaQSy:wf21n?{NUŠe…Ÿ"hŽtI[®š]+ 0kˆ¦o| –“q-i£‰)'6ªVƒ4M’‚$E^¬”>¢( ž\™X ,Y«B€K†›7<9Jv­rAO/¥.@¤PTWp~©¯m §8¡Z_ jl#`Fub3˜% Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredBase64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatCould not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDError adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileField is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid msg typeKDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyLast TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Protocol version mismatchReading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe Shisa configuration file does not exist.The client or server has a null keyThe system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTickets in `%s': Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorWriting KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 1.0.0 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2010-10-02 19:40+0930 Last-Translator: Clytie Siddall Language-Team: Vietnamese Language: vi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: LocFactoryEditor 1.8 Kiểu E Khoá Mật khẩu Ưu tiên Tham số S2K Salt Má»i đối số bắt buá»™c phải sá»­ dụng vá»›i tùy chá»n dài cÅ©ng bắt buá»™c vá»›i tùy chá»n ngắn. Má»i đối số bắt buá»™c phải sá»­ dụng vá»›i tùy chá»n dài cÅ©ng bắt buá»™c vá»›i tùy chá»n ngắn. Hãy thông báo lá»—i nào cho <%s>. %d vé bị gỡ bá». (pkinit)(ngưá»i dùng-đến-ngưá»i dùng)Dịch vụ không sẵn sàngTài khoản hết hạn vàoTài khoảnTài khoản không hợp lệ trướcÄang thêm địa hạt mặc định « %s »... Äang thêm khoá vào « %s@%s »... Äang thêm khoá vào « %s@%s »... hoàn tất Äang thêm mục chính « %s@%s »... Äang thêm mục chính « %s@%s »... hoàn tất Äang thêm địa hạt « %s »... Äang thêm địa hạt « %s »... hoàn tất Cần thiết xác thá»±c sẵn thêmCần thiết phương pháp xác thá»±c xen kẽLá»—i mã hoá/giải mã base64. Dữ liệu bị há»ng ?Giá trị tên khách khác biệt giữa yêu cầu và đáp ứng.Không tìm thấy trình khách trong cÆ¡ sở dữ liệuTrình khách chưa hợp lệ — thá»­ lại sauGiá trị địa hạt khách khác biệt giữa yêu cầu và đáp ứng.Mục cá»§a trình khách trong cÆ¡ sở dữ liệu đã hết hạnKhoá cá»§a trình khách đã mật mã trong khoá chá»§ cÅ©Thông tin xác thá»±c cá»§a trình khách đã bị há»§y bá»Äá»™ lệch đồng hồ quá lá»›nKhông thể tạo khoá (%d): %sKhông thể giải mã AP-REQ bằng khoá đã cung cấp. Thưá»ng ngụ ý lá»—i ứng dụng ná»™i bá»™.Không thể giải mã Vé bằng khoá đã cung cấp. Thưá»ng ngụ ý lá»—i ứng dụng ná»™i bá»™.Không thể há»§y vé %d: %sKhông thể liệt kê các vé: %sKhông thể mở tập tinKhông thể phân tách mục chính cá»§a trình khách « %s »: %sKhông thể phân tách mục chính cá»§a trình phục vụ « %s »: %sKhông thể Ä‘á»c các tùy chá»n vá» thư viện « %s »: %sKhông thể Ä‘á»c các tùy chá»n cá»§a thư viện: %sKhông thể Ä‘á»c mật khẩuKhông thể đặt kiểu mật mã « %s »: %sKhông thể đặt các kiểu mật mã: %sThông tin xác thá»±c cá»§a trình phục vụ đã bị há»§y bá»Phiên bản khoá hiện thá»iBỊ TẮTGặp lá»—i khi thêm khoá vào mục chínhGặp lá»—i khi thêm mục chính vào cÆ¡ sở dữ liệu.Gặp lá»—i khi thêm địa hạt vào cÆ¡ sở dữ liệu.Gặp lá»—i khi đếm các khoá trong cÆ¡ sở dữ liệu.Gặp lá»—i khi đếm các mục chính trong cÆ¡ sở dữ liệu.Gặp lá»—i khi đếm các địa hạt trong cÆ¡ sở dữ liệu.Gặp lá»—i khi tìm mục chính.Gặp lá»—i trong hàm ASN.1 (dữ liệu bị há»ng ?)Gặp lá»—i khi nhận dữ liệu từ máy phục vụGặp lá»—i khi gỡ bá» khoá khá»i mục chínhGặp lá»—i khi gỡ bá» mục chính khá»i cÆ¡ sở dữ liệu.Gặp lá»—i khi gỡ bỠđịa hạt khá»i cÆ¡ sở dữ liệu.Lá»—i phân tách tập tin nhá»› tạm thông tin xác thá»±cLá»—i phân tách tập tin keytab.Trưá»ng quá dài cho sá»± thá»±c hiện nàyLá»—i V/R tập tin cho tập tin cấu hình Shisa.Lá»—i vào/ra tập tinLá»—i giống loài (mô ta trong văn bản Ä‘iện tá»­)Kiểu tổng kiểm không thích hợp trong thông Ä‘iệpSai hướng thông Ä‘iệpSai địa chỉ MạngSai số thứ tá»± dãy trong thông Ä‘iệpLá»—i sÆ¡ khởi: %sLá»—i thá»­ tính nguyên vẹn trên trưá»ng đã giải mãLá»—i ná»™i bá»™ trong các hàm mật mã cấp thấp.Ngày tháng « --endtime » (giá» kết thúc) không hợp lệ « %s »Ngày tháng « --renew-till » (gia hạn đến) không hợp lệ « %s »Ngày tháng « --starttime » (giá» bắt đầu) không hợp lệ « %s »Kiểu thông Ä‘iệp không hợp lệChính sách KDC từ chối đưá»ng dẫn đã Ä‘i quaKDC không thể xá»­ lý tùy chá»n đã yêu cầuKDC không há»— trợ kiểu tổng kiểm nàyKDC không há»— trợ kiểu mật mã nàyKDC không há»— trợ kiểu dữ liệu padata nàyKDC không há»— trợ kiểu đã Ä‘i quaChính sách KDC từ chối yêu cầuKhoáYêu cầu TGT cuối vàoYêu cầu TGT đầu tiên cuối vàoYêu cầu đầu tiên cuối vàoGia hạn vé cuối vàoÄiá»u có sẵn mật mã cấp thấp bị lá»—i. Thưá»ng ngụ ý mật khẩu sai hay dữ liệu bị há»ng.BỊ THIẾULá»—i phân cấp bá»™ nhá»› trong thư viện shishi.Thông Ä‘iệp không theo thứ tá»±Luồng thông Ä‘iệp bị sá»­a đổiÄang sá»­a đổi mục chính « %s@%s »... Äang sá»­a đổi mục chính « %s@%s »... hoàn tất Nhiá»u khoá tương ứng vá»›i tiêu chuẩn tìm kiếm.CÆ¡ sở dữ liệu chứa nhiá»u mục nhập chínhLá»—i xác thá»±c lẫn nhauKhông có lá»—iChưa gỡ bá» vé. Mật khẩu hết hạn vàoMật khẩu cho « %s@%s »: Mật khẩu đã hết hạn Mật khẩu : Chính sách từ chối đưá»ng dẫn đã Ä‘i quaThông tin xác thá»±c sẵn không hợp lệMục chính không liên quan đến khoá khá»›p.Phiên bản giao thức không khá»›pÄang Ä‘á»c lá»—i KRB-ERROR từ %s... Äang Ä‘á»c lá»—i KRB-ERROR từ %s...hoàn tất Äang Ä‘á»c lá»—i KRB-ERROR theo định dạng %s... Äang gỡ bá» khoá khá»i « %s@%s »... Äang gỡ bá» khoá khá»i « %s@%s »... hoàn tất Äang gỡ bá» mục chính « %s@%s »... Äang gỡ bá» mục chính « %s@%s »... hoàn tất Äang gỡ bỠđịa hạt « %s »... Äang gỡ bỠđịa hạt « %s »... hoàn tất Äang gỡ bá» vé: Giá trị bảo vệ phát lại (nonce) khác biệt giữa yêu cầu và đáp ứng.Yêu cầu cÅ©ng phát lạiKhông há»— trợ số hiệu phiên bản giao thức đã yêu cầuTrình phục vụ đã yêu cầu không tương ứng vá»›i véGiá» bắt đầu đã yêu cầu nằm sau giá» kết thúcÄáp ứng quá lá»›n cho UDP, hãy thá»­ lại vá»›i TCPKhông tìm thấy trình phục vụ trong cÆ¡ sở dữ liệuTrình phục vụ chưa hợp lệ — thá»­ lại sauMục chính trình phục vụ chỉ hợp lệ cho ngưá»i-dùng-đến-ngưá»i-dùngMục cá»§a trình phục vụ trong cÆ¡ sở dữ liệu đã hết hạnKhoá cá»§a trình phục vụ đã mật mã trong khoá chá»§ cÅ©Khoá dịch vụ không sẵn sàngKhông thể sở khởi Shisa.Không thể mở cÆ¡ sở dữ liệu Shisa.Shisa thành côngLá»—i sÆ¡ khởi Shisi: %sThành công ShishiKhông có sẵn phiên bản khoá đã xác địnhMục chính đã cung cấp không tồn tại.Äịa hạt đã cung cấp không tồn tại.Gặp lá»—i cú pháp trong hiệu bài cấu hình Shisa.TGT đã bị há»§y bá»Tập tin cấu hình Shisa không tồn tại.Trình khách hay trình phục vụ có khoá vô giá trịLá»i gá»i hệ thống bind() (đóng kết) bị lá»—i. Thưá»ng ngụ ý không đủ quyá»n truy cập.Lá»i gá»i hệ thống close() (đóng) bị lá»—i.Lá»i gá»i hệ thống sendto() (gá»­i cho) bị lá»—i.Lá»i gá»i hệ thống socket() (ổ cắm) bị lá»—i. Thưá»ng ngụ ý hệ thống không há»— trợ kiểu ổ cắm đó.Vé này không thích hợp vá»›i chúng taVé và bá»™ xác thá»±c không khá»›pVé quá thá»iVé không thích hợp để đặt ngày tháng sauVé chưa hợp lệVé trong « %s »: Äã thá»­ thêm má»™t mục chính đã có.Äã thá»­ thêm má»™t địa hạt đã có.Äã thá»­ gỡ bá» má»™t địa hạt không rá»—ng.Hãy thá»­ lệnh trợ giúp « %s --help » để xem thêm thông tin. Mã lá»—i KRB-ERROR lạ %d.Lá»—i Shisa không rõLá»—i không rõÄang ghi lá»—i KRB-ERROR theo định dạng %s... Äang ghi lá»—i KRB-ERROR vào %s... Äang ghi lá»—i KRB-ERROR vào %s...hoàn tất không thể sÆ¡ khởi libshishikhông thể lấy vé như « %s » cho « %s »đã bậtlibshishi: thông tin: %slibshishi: thông tin: %s libshishi: cảnh báo : %slibshishi: cảnh báo : %s shisa: %s quá ít đối sốquá nhiá»u đối sốshishi-1.0.2/po/Makefile.in.in0000644000000000000000000003744212126772677013013 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18 GETTEXT_MACRO_VERSION = 0.18 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/po/en@quot.gmo0000644000000000000000000004634712126773035012451 00000000000000ޕМ pqx € Š ” J¦`ñ(R{„n“ /:Sq‹© Æçý&*>%i*1º3ì &=4d&™(À%é=$bb€bãFf)•)¿'é"4&L"s(–¿Ó-Ü5 3@t#“·#×)û%%K'd Œ"­'Ð#ø%B ^9)¹,ã%()N$x&%Ä*ê1$Gl)†,°Ýù69P5ŠÀÑ!ð'$:&_"†%©Ïêqî` t  ¨ b¿ "!**!U!j!‚!#¢!.Æ!&õ!"9"W"s"|"‘"¤"»" Ñ"Ü"*ú"2%#X#u##®#!Ì#"î#$$6$!T$v$"•$¸$Ð$ì$Aþ$@%/T%'„%+¬%(Ø%&&&)E&4o&&¤&(Ë&ô&'#.' R' `'')'"º'Ý'*ü''(;<(,x(#¥(;É(3)"9)9\)5–)PÌ)* =*k^*Ê*$â*+"+9+RN+¡+R³+,,(3,"\,&, ¦,Ç, Û,#é," -0-L-l-%ˆ-®-¶-Ê-ß-ö- ..+.o>.®/µ/ ½/ Ç/ Ñ/Ý/Jã/`.0(0¸0Á0nÐ0?1Z1 l1w1!1²1!Ð1 ò1$282R2&p2*—2%Â2*è2133E3y3&–34½3&ò3(4%B4h4=}4»4bÙ4b<5Ÿ5¿5Ú5-î5-6+J6"v6™6*±6"Ü6(ÿ6(7<7-E75s73©7Ý7#ü7 8#@8)d8%Ž8´8'Í8 õ8"9'99#a9%…9«9 Ç99è9)":,L:y:%‘:)·:$á:&;%-;*S;~;š;$°;Õ;)ï;,<F<"f<!‰<«<9Å<5ÿ<5=F=!e='‡=$¯=&Ô="û=%>D>_>qc>Õ>é>??b4?—?*Ÿ?Ê?ß?#÷?'@.C@&r@™@¶@Ô@ð@ù@A!AG;bG3žG"ÒG9õG5/HPeH¶H ÖHk÷HcI${I I"¯IÒIRçI:JRPJ,£J(ÐJ"ùJ*K GKhK |K#ŠK"®KÑKíK L-)LWL_LsLˆLŸL ·LÂLÔLJÃ7X–v n¡fÇ :^Ÿ%Í|p“ÉTY/qa<ËS]­—¦ŽÌ#8lR{GE€!,* _ ‡À³¤®NQ>Ⱥ•i"+Â2'9Š0y°d¢ª´A˜I@К¹”6s}Äœ…ÆÊ›VBk«[¿)§£P„™Dg.² x’ˆW`µm5†-±~Ï‹¾zƒhKž‘¨·rtbHc1&Lo?Œ Mw\»e¥CF‰ÁÎ(O4¸¯ ¶=¬½ZuÅ$©;3¼jU‚ Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A request for present time of day has failed. This is usually internal, but a valid time is imperative for us.A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredArgument lies outside of valid range.Attempted access to non-existent key type.Base64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatConnection attempt failed. Try again, or check availability.Could not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDDerived key is too long for PKCS5 descriptor.Derived key length is incorrect for PKCS5 descriptor.Derived key material is too short to be applicable.Error adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileFailed verification of AP reply.Failure to use handle. Missing handle, or misconfigured.Field is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect key type used in AP reply.Incorrect key type used in AP request.Incorrect key type used in TGS reply.Incorrect key type used in reply from KDC.Incorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid PKCS5 descriptor.Invalid argument passed in call. Wrong or unknown value.Invalid claim of iteration count in PKCS5 descriptor.Invalid msg typeInvalid ticked passed in call.KDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyKey type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error.Last TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo KDC known for given realm.No TTY assigned to process.No errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Principal name syntax error.Protocol version mismatchProvided buffer was too small.Reading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Reference to invalid encryption key.Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer replied to the request with an error message.Server's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe ASN.1 structure does not contain the indicated element.The Shisa configuration file does not exist.The client or server has a null keyThe desired file could not be accessed. Check permissions.The indicated ASN.1 element does not carry a value.The key is too large to be usable.The present AP reply specifies an inpermissible key type.The private key uses an incompatible encryption type.The system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTicket set not initialized. This usually indicates an internal application error.Tickets in `%s': Timed out talking to KDC. This usually indicates a network or KDC address problem.Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorVerification failed on either side.Writing KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 1.0.2 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2013-04-03 11:27+0200 Last-Translator: Automatically generated Language-Team: none Language: en@quot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A request for present time of day has failed. This is usually internal, but a valid time is imperative for us.A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm ‘%s’... Adding key to ‘%s@%s’... Adding key to ‘%s@%s’...done Adding principal ‘%s@%s’... Adding principal ‘%s@%s’...done Adding realm ‘%s’... Adding realm ‘%s’...done Additional pre-authentication requiredAlternative authentication method requiredArgument lies outside of valid range.Attempted access to non-existent key type.Base64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatConnection attempt failed. Try again, or check availability.Could not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal “%sâ€: %sCould not parse server principal “%sâ€: %sCould not read library options ‘%s’: %sCould not read library options: %sCould not read passwordCould not set encryption type ‘%s’: %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDDerived key is too long for PKCS5 descriptor.Derived key length is incorrect for PKCS5 descriptor.Derived key material is too short to be applicable.Error adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileFailed verification of AP reply.Failure to use handle. Missing handle, or misconfigured.Field is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect key type used in AP reply.Incorrect key type used in AP request.Incorrect key type used in TGS reply.Incorrect key type used in reply from KDC.Incorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date ‘%s’Invalid --renew-till date ‘%s’Invalid --starttime date ‘%s’Invalid PKCS5 descriptor.Invalid argument passed in call. Wrong or unknown value.Invalid claim of iteration count in PKCS5 descriptor.Invalid msg typeInvalid ticked passed in call.KDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyKey type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error.Last TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal ‘%s@%s’... Modifying principal ‘%s@%s’...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo KDC known for given realm.No TTY assigned to process.No errorNo tickets removed. Password expire onPassword for ‘%s@%s’: Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Principal name syntax error.Protocol version mismatchProvided buffer was too small.Reading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Reference to invalid encryption key.Removing key from ‘%s@%s’... Removing key from ‘%s@%s’...done Removing principal ‘%s@%s’... Removing principal ‘%s@%s’...done Removing realm ‘%s’... Removing realm ‘%s’...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer replied to the request with an error message.Server's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe ASN.1 structure does not contain the indicated element.The Shisa configuration file does not exist.The client or server has a null keyThe desired file could not be accessed. Check permissions.The indicated ASN.1 element does not carry a value.The key is too large to be usable.The present AP reply specifies an inpermissible key type.The private key uses an incompatible encryption type.The system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTicket set not initialized. This usually indicates an internal application error.Tickets in ‘%s’: Timed out talking to KDC. This usually indicates a network or KDC address problem.Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try ‘%s --help’ for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorVerification failed on either side.Writing KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as ‘%s’ for ‘%s’enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsshishi-1.0.2/po/en@quot.po0000644000000000000000000006274712126773035012307 00000000000000# English translations for shishi package. # Copyright (C) 2013 Simon Josefsson # This file is distributed under the same license as the shishi package. # Automatically generated, 2013. # # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # msgid "" msgstr "" "Project-Id-Version: shishi 1.0.2\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2013-04-03 11:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en@quot\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Shishi success" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Error in ASN.1 function (corrupt data?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Could not open file" #: lib/error.c:39 msgid "File input/output error" msgstr "File input/output error" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Memory allocation error in shishi library." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Base64 encoding or decoding failed. Data corrupt?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Client realm value differ between request and reply." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "Client name value differ between request and reply." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "Replay protection value (nonce) differ between request and reply." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "Incorrect key type used in TGS reply." #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "Incorrect key type used in reply from KDC." #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "Incorrect key type used in AP reply." #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "Failed verification of AP reply." #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "Incorrect key type used in AP request." #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "Provided buffer was too small." #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "Derived key material is too short to be applicable." #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "The key is too large to be usable." #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Internal error in low-level crypto routines." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "The system call bind() failed. This usually indicates insufficient " "permissions." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "The system call sendto() failed." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "Error receiving data from server" #: lib/error.c:82 msgid "The system call close() failed." msgstr "The system call close() failed." #: lib/error.c:84 msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." #: lib/error.c:87 msgid "No KDC known for given realm." msgstr "No KDC known for given realm." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "No TTY assigned to process." #: lib/error.c:91 msgid "Server replied to the request with an error message." msgstr "Server replied to the request with an error message." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "Failure to use handle. Missing handle, or misconfigured." #: lib/error.c:95 msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Ticket set not initialized. This usually indicates an internal application " "error." #: lib/error.c:98 msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "Reference to invalid encryption key." #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "Invalid ticked passed in call." #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "Argument lies outside of valid range." #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "The ASN.1 structure does not contain the indicated element." #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "Attempted access to non-existent key type." #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "Verification failed on either side." #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "Invalid PKCS5 descriptor." #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "Invalid claim of iteration count in PKCS5 descriptor." #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "Derived key length is incorrect for PKCS5 descriptor." #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "Derived key is too long for PKCS5 descriptor." #: lib/error.c:127 msgid "Principal name syntax error." msgstr "Principal name syntax error." #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "Invalid argument passed in call. Wrong or unknown value." #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "The indicated ASN.1 element does not carry a value." #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "Connection attempt failed. Try again, or check availability." #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "The private key uses an incompatible encryption type." #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "The desired file could not be accessed. Check permissions." #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "The present AP reply specifies an inpermissible key type." #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Failed to parse keytab file" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Failed to parse credential cache file" #: lib/error.c:165 msgid "Unknown error" msgstr "Unknown error" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "No error" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: info: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: info: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: warning: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: warning: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Writing KRB-ERROR to %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Writing KRB-ERROR in %s format...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Writing KRB-ERROR to %s...done\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Reading KRB-ERROR from %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Reading KRB-ERROR in %s format...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Reading KRB-ERROR from %s...done\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Client's entry in database has expired" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Server's entry in database has expired" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "Requested protocol version number not supported" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Client's key encrypted in old master key" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Server's key encrypted in old master key" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Client not found in database" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Server not found in database" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Multiple principal entries in database" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "The client or server has a null key" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Ticket not eligible for postdating" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "Requested start time is later than end time" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "KDC policy rejects request" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "KDC cannot accommodate requested option" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "KDC has no support for encryption type" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "KDC has no support for checksum type" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "KDC has no support for padata type" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC has no support for transited type" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Clients credentials have been revoked" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Credentials for server have been revoked" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "TGT has been revoked" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Client not yet valid - try again later" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Server not yet valid - try again later" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Password has expired " #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Pre-authentication information was invalid" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Additional pre-authentication required" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Requested server and ticket don't match" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Server principal valid for user2user only" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "KDC Policy rejects transited path" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "A service is not available" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Integrity check on decrypted field failed" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Ticket expired" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Ticket not yet valid" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "Request is a replay" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "The ticket isn't for us" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Ticket and authenticator don't match" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Clock skew too great" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Incorrect net address" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Protocol version mismatch" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Invalid msg type" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Message stream modified" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Message out of order" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Specified version of key is not available" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Service key not available" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "Mutual authentication failed" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Incorrect message direction" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Alternative authentication method required" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Incorrect sequence number in message" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Inappropriate type of checksum in message" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Policy rejects transited path" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Response too big for UDP, retry with TCP" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Generic error (description in e-text)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Field is too long for this implementation" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(user-to-user)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Unknown KRB-ERROR error code %d." #: db/err.c:33 msgid "Shisa success" msgstr "Shisa success" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Shisa could not be initialized." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "The Shisa configuration file does not exist." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "File I/O error for Shisa configuration file." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Syntax error in Shisa configuration token." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "Shisa database could not be opened." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Error enumerating realms in database." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Error enumerating principals in database." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Error enumerating keys in database." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Supplied realm does not exist." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "Supplied principal does not exist." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Principal is not associated with any matching key." #: db/err.c:57 msgid "Error finding principal." msgstr "Error finding principal." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Tried to add a realm that already exist." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Error adding realm to database." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Tried to remove a non-empty realm." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Error removing realm from database." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Tried to add a principal that already exist." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Error adding principal to database." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Error removing principal from database." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Error adding key to principal." #: db/err.c:75 msgid "Error removing key from principal." msgstr "Error removing key from principal." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "More than one key match given search criteria." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Unknown Shisa error" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Account is" #: src/shisa.c:144 msgid "DISABLED" msgstr "DISABLED" #: src/shisa.c:144 msgid "enabled" msgstr "enabled" #: src/shisa.c:145 msgid "Current key version" msgstr "Current key version" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Account not valid before" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Last initial TGT request at" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Last initial request at" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Last TGT request at" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Last ticket renewal at" #: src/shisa.c:157 msgid "Password expire on" msgstr "Password expire on" #: src/shisa.c:159 msgid "Account expire on" msgstr "Account expire on" #: src/shisa.c:172 msgid "Key" msgstr "Key" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tEtype" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tPriority" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tSalt" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tS2K params" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tPassword" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tKey is" #: src/shisa.c:189 msgid "MISSING" msgstr "MISSING" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Adding realm ‘%s’...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Adding principal ‘%s@%s’...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Adding realm ‘%s’...done\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Adding principal ‘%s@%s’...done\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Removing realm ‘%s’...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Removing principal ‘%s@%s’...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Removing realm ‘%s’...done\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Removing principal ‘%s@%s’...done\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Password for ‘%s@%s’: " #: src/shisa.c:375 msgid "Password: " msgstr "Password: " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Could not read password" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Could not create key (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Try ‘%s --help’ for more information.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "too many arguments" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Initialization failed:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Could not read library options ‘%s’:\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Shishi initialization failed:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Could not set encryption type ‘%s’:\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "too few arguments" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Adding default realm ‘%s’...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Modifying principal ‘%s@%s’...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Modifying principal ‘%s@%s’...done\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Adding key to ‘%s@%s’...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Adding key to ‘%s@%s’...done\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Removing key from ‘%s@%s’...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Removing key from ‘%s@%s’...done\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "cannot initialize libshishi" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Could not set encryption types: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Could not parse client principal “%sâ€: %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Could not parse server principal “%sâ€: %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Could not read library options: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Invalid --starttime date ‘%s’" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Invalid --endtime date ‘%s’" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Invalid --renew-till date ‘%s’" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Tickets in ‘%s’:\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Could not list tickets: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Removing ticket:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Could not destroy ticket %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "No tickets removed.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "%d ticket removed.\n" msgstr[1] "%d tickets removed.\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "could not get ticket as ‘%s’ for ‘%s’" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" shishi-1.0.2/po/Rules-quot0000644000000000000000000000340012126772677012327 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header shishi-1.0.2/po/sr.gmo0000644000000000000000000005127712126773035011460 00000000000000Þ•¯”é °±¸ À Ê ÔàJæ`1(’»ÄÓî  $B\z —¸Î&è*1:3l &½4ä&(@%i¤bÂb%ˆ¨Ã)×)'+"Sv&Ž"µ(Ø#=a#)¥%Ïõ' 6"W'z#¢%Æì),2_%w)Çã$ù)8,b«Êè!ù'$C&h"%²Øó÷ '?bV¹*Áì#9.]&Œ³ÐÙî .9*W2‚µÏ!í"2!Pr"‘´ÌèAú</P'€+¨(Ôý&)A&k(’»Õ#õ  ' H )W " ¤ *à î ,!#0!PT!¥! Å!kæ!R"$j"""ž"Á"Ö",è"(#">#&a# ˆ#©# ½#"Ë#î# $*$%F$l$t$ˆ$$´$ Ì$×$é$ñü$î& ý&'''' A'†K'²Ò'w…(ý(%)&,)S)k)+{);§)*ã)6*/E*;u*,±*8Þ*U+]m+vË+wB,Eº,^-{_-JÛ-Y&.7€.(¸.5á.¿/¾×/3–04Ê02ÿ0N21L1ZÎ1Q)22{2L®2Cû26?3(v3Ÿ3:°3Lë3L84N…4PÔ4P%53v5Jª5Cõ5?96Ny6NÈ6V7Rn77Á7Xù79R85Œ8OÂ8$9&790^9,9b¼9[:V{:NÒ:Z!;,|;D©;Pî;S?<N“<aâ<PD=5•=Ë=$Ô=3ù=,->(Z>·ƒ>;?LN?'›?'Ã?+ë?7@dO@A´@Tö@KA9aA›A!·A#ÙAýA=BeLB^²B>C.PC@C=ÀC,þC8+D/dD;”D,ÐD8ýD6ERE ÔEUõEPKFgœFNGCSG\—GlôGHaHWªH/I12IKdI°I9ÄIþIBJ8YJ:’JPÍJKC9KC}KÁK@QLA’LÁÔL-–MXÄM"NK@N/ŒN¼NMÕNO#OFsOAºO<üO(9PbPC‚P6ÆPHýP2FQNyQÈQ ×Q!øQ&R'AR iR#wR#›R— ‘‡x5&dc•!GzL=g}„‹œ*H¨;sCŒRDaQSy:wf21n?{NUŠe…Ÿ"hŽtI[®š]+ 0kˆ¦o| –“q-i£‰)'6ªVƒ4M’‚$E^¬”>¢( ž\™X ,Y«B€K†›7<9Jv­rAO/¥.@¤PTWp~©¯m §8¡Z_ jl#`Fub3˜% Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredBase64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatCould not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDError adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileField is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid msg typeKDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyLast TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Protocol version mismatchReading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe Shisa configuration file does not exist.The client or server has a null keyThe system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTickets in `%s': Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorWriting KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 1.0.0 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2012-07-29 23:19+0200 Last-Translator: МироÑлав Ðиколић Language-Team: Serbian Language: sr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Е-врÑта Кључ Лозинка ВажноÑÑ‚ С2К параметри Салт Обавезни аргументи за дуге опције Ñу обавезни и за кратке опције такође. Обавезни аргументи за дуге опције Ñу обавезни и за кратке опције такође. Грешке пријавите на <%s>. Укоњена је %d картица. Укоњене Ñу %d картице. Укоњено је %d картица. (pkinit)(кориÑник-кориÑнику)УÑлуга није доÑтупнаÐалог иÑтичеÐалог јеÐалог није иÑправан преДодајем оÑновно подручје „%s“... Додајем кључ у „%s@%s“... Додајем кључ у „%s@%s“...готово Додајем почетног „%s@%s“... Додајем почетног „%s@%s“...готово Додајем подручје „%s“... Додајем подручје „%s“...готово Потребна је додатна ранија провера идентитетаПотребан је резервни начин потврђивања идентитетаШифровање или дешифровање оÑнове 64 није уÑпело. Оштећени подаци?ВредноÑÑ‚ назива клијента Ñе разликује између захтева и одговора.Клијент није пронађен у бази податакаКлијент није још увек иÑправан — покушајте каÑнијеВредноÑÑ‚ подручја клијента Ñе разликује између захтева и одговора.Ð£Ð½Ð¾Ñ ÐºÐ»Ð¸Ñ˜ÐµÐ½Ñ‚Ð° у бази података је иÑтекаоКључ клијента је шифрован у Ñтаром главном кључуУверења клијената Ñу опозванаСат Ñе нагнуо ка већемÐе могу да направим кључ (%d): %sÐе могу да дешифрујем ÐП-ЗÐÐ¥ кориÑтећи доÑтављени кључ. Ово обично указује на унутрашњу грешку програма.Ðе могу да дешифрујем Карту кориÑтећи доÑтављени кључ. Ово обично указује на унутрашњу грешку програма.Ðе могу да уништим карту %d: %sÐе могу да прегледам карте: %sÐе могу да отворим датотекуÐе могу да обрадим главног клијента „%s“: %sÐе могу да обрадим главног Ñервера „%s“: %sÐе могу да прочитам могућноÑти библиотеке „%s“: %sÐе могу да прочитам могућноÑти библиотеке: %sÐе могу да прочитам лозинкуÐе могу да подеÑим врÑту шифровања „%s“: %sÐе могу да подеÑим врÑте шифровања: %sУверење за Ñервер је опозваноТренутно издање кључаИСКЉУЧЕÐГрешка додавања кључа почетном.Грешка додавања почетног у базу података.Грешка додавања подручја у базу података.Грешка нумериÑања кључева у бази података.Грешка нумериÑања почетних у бази података.Грешка нумериÑања подручја у бази података.Грешка проналажења главног.Грешка у ÐСÐ.1 функцији (оштећени подаци?)Грешка у примању података Ñа ÑервераГрешка уклањања кључа из почетног.Грешка уклањања почетног из базе података.Грешка уклањања подручја из базе података.ÐиÑам уÑпео да обрадим датотеку оÑтаве уверењаÐиÑам уÑпео да обрадим датотеку табеле кључаПоље је предуго за ову применуУ/И грешка датотеке за датотеку подешавања Шизе.Улазно/излазна грешка датотекеОпшта грешка (Ð¾Ð¿Ð¸Ñ Ñƒ е-текÑту)Ðеодговарајућа врÑта провере Ñуме у поруциÐетачан Ñмер порукеÐетачна адреÑа мрежеÐетачан број низа у поруциÐије уÑпело покретање: %sПровера целовитоÑти на дешифрованом пољу није уÑпелаУнутрашња грешка у рутини шифровања ниÑког нивоа.ÐеиÑправан податак крајњег времена (--endtime) „%s“ÐеиÑправан податак обнављања (--renew-till) „%s“ÐеиÑправан податак почетног времена (--starttime) „%s“ÐеиÑправна врÑта порукеКДЦ политика одбија пренешену путањуКДЦ не може да обухвати захтевану могућноÑтКДЦ не поÑедује подршку за врÑту провера ÑумеКДЦ не поÑедује подршку за врÑту шифровањаКДЦ не поÑедује подршку за врÑту паралелних податакаКДЦ не поÑедује подршку за врÑту пренешенихКДЦ политика одбацује захтевКључПоÑледњи ТГТ захтевПоÑледњи почетни ТГТ захтевПоÑледњи почетни захтевПоÑледња обнова картеКриптографија ниÑког нивоа није уÑпела. Ово обично указује на лошу лозинку или на оштећене податке.ÐЕДОСТÐЈЕГрешка доделе меморије у шиши библиотеци.Порука је ван пореткаИзмењен је ток порукеМењам почетног „%s@%s“... Мењам почетног „%s@%s“...готово Више од једног кључа одговарају датом уÑлову претраге.Више почетних уноÑа у бази податакаМеђуÑобно потврђивање идентитета није уÑпелоÐема грешкеÐиједна картица није уклоњена. Лозинка иÑтичеЛозинка за „%s@%s“: Лозинка је иÑтекла Лозинка: Политика одбија пренешену путањуПодатак за ранију проверу идентитета је био неиÑправанПочетни није придружен ниједном поклопљеном кључу.Издања протокола Ñе не подударајуЧитам КРБ-ГРЕШКУ у „%s“... Читање КРБ-ГРЕШКЕ у „%s“...обављено Читам КРБ-ГРЕШКУ у формату „%s“... Уклањам кључ из „%s@%s“... Уклањам кључ из „%s@%s“...готово Уклањам почетног „%s@%s“... Уклањам почетног „%s@%s“...готово Уклањам подручје „%s“... Уклањам подручје „%s“...готово Уклањам карту: ВредноÑÑ‚ заштите одговора (nonce) Ñе разликује између захтева и одговора.Захтев је одговорБрој издања захтеваног протокола није подржанЗахтевани Ñервер и картица Ñе не подударајуЗахтевано почетно време је каÑније од времена завршеткаОдговор је превелик за УДП, пробајте Ñа ТЦПСервер није пронађен у бази податакаСервер није још увек иÑправан — покушајте каÑнијеПочетни Ñервера је иÑправан Ñамо од кориÑника-до-кориÑÐ½Ð¸ÐºÐ°Ð£Ð½Ð¾Ñ Ñервера у бази података је иÑтекаоКључ Ñервера је шифрован у Ñтаром главном кључуКључ уÑлуге није доÑтупанШиза не може бити покренут.База података Шизе не може бити отворена.УÑпех ШизеÐије уÑпело покретање Шишија: %sУÑпех ШишијаÐаведено издање кључа није доÑтупноДоÑтављени почетни не поÑтоји.ДоÑтављено подручје не поÑтоји.Грешка Ñадржаја у елементу подешавања Шизе.ТГТ је опозванДатотека подешавања Шизе не поÑтоји.Клијент или Ñервер има ништаван кључСиÑтемÑки позив „bind()“ није уÑпео. Ово обично указује на недовољна овлашћења.СиÑтемÑки позив „close()“ није уÑпео.СиÑтемÑки позив „sendto()“ није уÑпео.СиÑтемÑки позив „socket()“ није уÑпео. Ово обично указује на то да ваш ÑиÑтем не подржава врÑту прикључнице.Картица није за употребуКартица и потврђивач идентитета Ñе не поклапајуКартица је иÑтеклаКартица није подеÑна за каÑнију употребуКартица још није иÑправнаКарте у „%s“: Покушах да додам почетни које већ поÑтоји.Покушах да додам подручје које већ поÑтоји.Покушах да уклоним не-празно подручје.Пробајте „%s --help“ за више података. Ðепознат код гређке %d КРБ-ГРЕШКЕ.Ðепозната грешка ШизеÐепозната грешкаЗапиÑујем КРБ-ГРЕШКУ у формат „%s“... ЗапиÑујем КРБ-ГРЕШКУ у „%s“... ЗапиÑивање КРБ-ГРЕШКЕ у „%s“...обављено не могу да покренем либшишине могу да добавим картицу као „%s“ за „%s“укљученлибшиши: подаци: %sлибшиши: подаци: %s либшиши: упозорење: %sлибшиши: упозорење: %s шиза: %s премало аргуменатапревише аргуменатаshishi-1.0.2/po/en@boldquot.po0000644000000000000000000006351112126773034013135 00000000000000# English translations for shishi package. # Copyright (C) 2013 Simon Josefsson # This file is distributed under the same license as the shishi package. # Automatically generated, 2013. # # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # msgid "" msgstr "" "Project-Id-Version: shishi 1.0.2\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2013-04-03 11:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en@boldquot\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Shishi success" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Error in ASN.1 function (corrupt data?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Could not open file" #: lib/error.c:39 msgid "File input/output error" msgstr "File input/output error" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Memory allocation error in shishi library." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Base64 encoding or decoding failed. Data corrupt?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Client realm value differ between request and reply." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "Client name value differ between request and reply." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "Replay protection value (nonce) differ between request and reply." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "Incorrect key type used in TGS reply." #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "Incorrect key type used in reply from KDC." #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "Incorrect key type used in AP reply." #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "Failed verification of AP reply." #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "Incorrect key type used in AP request." #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "Provided buffer was too small." #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "Derived key material is too short to be applicable." #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "The key is too large to be usable." #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Internal error in low-level crypto routines." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "The system call bind() failed. This usually indicates insufficient " "permissions." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "The system call sendto() failed." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "Error receiving data from server" #: lib/error.c:82 msgid "The system call close() failed." msgstr "The system call close() failed." #: lib/error.c:84 msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." #: lib/error.c:87 msgid "No KDC known for given realm." msgstr "No KDC known for given realm." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "No TTY assigned to process." #: lib/error.c:91 msgid "Server replied to the request with an error message." msgstr "Server replied to the request with an error message." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "Failure to use handle. Missing handle, or misconfigured." #: lib/error.c:95 msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Ticket set not initialized. This usually indicates an internal application " "error." #: lib/error.c:98 msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "Reference to invalid encryption key." #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "Invalid ticked passed in call." #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "Argument lies outside of valid range." #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "The ASN.1 structure does not contain the indicated element." #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "Attempted access to non-existent key type." #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "Verification failed on either side." #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "Invalid PKCS5 descriptor." #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "Invalid claim of iteration count in PKCS5 descriptor." #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "Derived key length is incorrect for PKCS5 descriptor." #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "Derived key is too long for PKCS5 descriptor." #: lib/error.c:127 msgid "Principal name syntax error." msgstr "Principal name syntax error." #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "Invalid argument passed in call. Wrong or unknown value." #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "The indicated ASN.1 element does not carry a value." #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "Connection attempt failed. Try again, or check availability." #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "The private key uses an incompatible encryption type." #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "The desired file could not be accessed. Check permissions." #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "The present AP reply specifies an inpermissible key type." #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Failed to parse keytab file" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Failed to parse credential cache file" #: lib/error.c:165 msgid "Unknown error" msgstr "Unknown error" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "No error" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: info: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: info: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: warning: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: warning: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Writing KRB-ERROR to %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Writing KRB-ERROR in %s format...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Writing KRB-ERROR to %s...done\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Reading KRB-ERROR from %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Reading KRB-ERROR in %s format...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Reading KRB-ERROR from %s...done\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Client's entry in database has expired" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Server's entry in database has expired" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "Requested protocol version number not supported" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Client's key encrypted in old master key" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Server's key encrypted in old master key" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Client not found in database" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Server not found in database" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Multiple principal entries in database" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "The client or server has a null key" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Ticket not eligible for postdating" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "Requested start time is later than end time" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "KDC policy rejects request" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "KDC cannot accommodate requested option" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "KDC has no support for encryption type" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "KDC has no support for checksum type" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "KDC has no support for padata type" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC has no support for transited type" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Clients credentials have been revoked" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Credentials for server have been revoked" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "TGT has been revoked" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Client not yet valid - try again later" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Server not yet valid - try again later" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Password has expired " #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Pre-authentication information was invalid" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Additional pre-authentication required" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Requested server and ticket don't match" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Server principal valid for user2user only" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "KDC Policy rejects transited path" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "A service is not available" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Integrity check on decrypted field failed" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Ticket expired" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Ticket not yet valid" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "Request is a replay" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "The ticket isn't for us" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Ticket and authenticator don't match" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Clock skew too great" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Incorrect net address" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Protocol version mismatch" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Invalid msg type" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Message stream modified" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Message out of order" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Specified version of key is not available" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Service key not available" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "Mutual authentication failed" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Incorrect message direction" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Alternative authentication method required" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Incorrect sequence number in message" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Inappropriate type of checksum in message" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Policy rejects transited path" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Response too big for UDP, retry with TCP" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Generic error (description in e-text)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Field is too long for this implementation" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(user-to-user)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Unknown KRB-ERROR error code %d." #: db/err.c:33 msgid "Shisa success" msgstr "Shisa success" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Shisa could not be initialized." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "The Shisa configuration file does not exist." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "File I/O error for Shisa configuration file." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Syntax error in Shisa configuration token." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "Shisa database could not be opened." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Error enumerating realms in database." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Error enumerating principals in database." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Error enumerating keys in database." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Supplied realm does not exist." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "Supplied principal does not exist." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Principal is not associated with any matching key." #: db/err.c:57 msgid "Error finding principal." msgstr "Error finding principal." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Tried to add a realm that already exist." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Error adding realm to database." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Tried to remove a non-empty realm." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Error removing realm from database." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Tried to add a principal that already exist." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Error adding principal to database." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Error removing principal from database." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Error adding key to principal." #: db/err.c:75 msgid "Error removing key from principal." msgstr "Error removing key from principal." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "More than one key match given search criteria." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Unknown Shisa error" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Account is" #: src/shisa.c:144 msgid "DISABLED" msgstr "DISABLED" #: src/shisa.c:144 msgid "enabled" msgstr "enabled" #: src/shisa.c:145 msgid "Current key version" msgstr "Current key version" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Account not valid before" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Last initial TGT request at" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Last initial request at" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Last TGT request at" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Last ticket renewal at" #: src/shisa.c:157 msgid "Password expire on" msgstr "Password expire on" #: src/shisa.c:159 msgid "Account expire on" msgstr "Account expire on" #: src/shisa.c:172 msgid "Key" msgstr "Key" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tEtype" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tPriority" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tSalt" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tS2K params" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tPassword" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tKey is" #: src/shisa.c:189 msgid "MISSING" msgstr "MISSING" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Adding realm ‘%s’...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Adding principal ‘%s@%s’...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Adding realm ‘%s’...done\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Adding principal ‘%s@%s’...done\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Removing realm ‘%s’...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Removing principal ‘%s@%s’...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Removing realm ‘%s’...done\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Removing principal ‘%s@%s’...done\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Password for ‘%s@%s’: " #: src/shisa.c:375 msgid "Password: " msgstr "Password: " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Could not read password" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Could not create key (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Try ‘%s --help’ for more information.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "too many arguments" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Initialization failed:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Could not read library options ‘%s’:\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Shishi initialization failed:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Could not set encryption type ‘%s’:\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "too few arguments" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Adding default realm ‘%s’...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Modifying principal ‘%s@%s’...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Modifying principal ‘%s@%s’...done\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Adding key to ‘%s@%s’...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Adding key to ‘%s@%s’...done\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Removing key from ‘%s@%s’...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Removing key from ‘%s@%s’...done\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "cannot initialize libshishi" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Could not set encryption types: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Could not parse client principal “%sâ€: %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Could not parse server principal “%sâ€: %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Could not read library options: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Invalid --starttime date ‘%s’" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Invalid --endtime date ‘%s’" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Invalid --renew-till date ‘%s’" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Tickets in ‘%s’:\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Could not list tickets: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Removing ticket:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Could not destroy ticket %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "No tickets removed.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "%d ticket removed.\n" msgstr[1] "%d tickets removed.\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "could not get ticket as ‘%s’ for ‘%s’" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" shishi-1.0.2/po/remove-potcdate.sin0000644000000000000000000000066012126772677014142 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } shishi-1.0.2/po/en@boldquot.gmo0000644000000000000000000004670312126773034013305 00000000000000ޕМ pqx € Š ” J¦`ñ(R{„n“ /:Sq‹© Æçý&*>%i*1º3ì &=4d&™(À%é=$bb€bãFf)•)¿'é"4&L"s(–¿Ó-Ü5 3@t#“·#×)û%%K'd Œ"­'Ð#ø%B ^9)¹,ã%()N$x&%Ä*ê1$Gl)†,°Ýù69P5ŠÀÑ!ð'$:&_"†%©Ïêqî` t  ¨ b¿ "!**!U!j!‚!#¢!.Æ!&õ!"9"W"s"|"‘"¤"»" Ñ"Ü"*ú"2%#X#u##®#!Ì#"î#$$6$!T$v$"•$¸$Ð$ì$Aþ$@%/T%'„%+¬%(Ø%&&&)E&4o&&¤&(Ë&ô&'#.' R' `'')'"º'Ý'*ü''(;<(,x(#¥(;É(3)"9)9\)5–)PÌ)* =*k^*Ê*$â*+"+9+RN+¡+R³+,,(3,"\,&, ¦,Ç, Û,#é," -0-L-l-%ˆ-®-¶-Ê-ß-ö- ..+.s>.²/¹/ Á/ Ë/ Õ/á/Jç/`20(“0¼0Å0nÔ0C1^1 p1{1)”1%¾1)ä1(2,72!d2%†2&¬2*Ó2%þ2*$31O333µ3&Ò34ù3&.4(U4%~4¤4=¹4÷4b5bx5Û5û565*65`63–6"Ê6í627"87([7„7˜7-¡75Ï73898#X8|8#œ8)À8%ê89')9 Q9"r9'•9#½9%á9: #:9D:)~:,¨:Õ:%í:);$=;&b;%‰;*¯;Ú;ö;$ <1<)K<,u<'¢<*Ê<)õ<=99=5s=©=º=!Ù='û=$#>&H>"o>%’>¸>Ó>q×>I?]?y?‘?b¨? @*@>@S@+k@/—@.Ç@&ö@A:AXAtA}A’A"¥AÈA ÞAéA*B22BeB‚BœB»B!ÙB"ûB$C)CC-mC*›C.ÆC#õC'DADASD•D/©D'ÙD+E(-EVE&sE)šE4ÄE&ùE( FIFcF#ƒF §F µFÖF)åF"G2G*QG|G;‘G,ÍG#úG;H3ZH"ŽH9±H5ëHP!IrI ’Ik³IJ$7J\J"kJŽJR£JöJRK,gK(”K"½K2àK L4L HL#VL"zLL¹LÙL=õL3M;MOMdM{M “MžM°MJÃ7X–v n¡fÇ :^Ÿ%Í|p“ÉTY/qa<ËS]­—¦ŽÌ#8lR{GE€!,* _ ‡À³¤®NQ>Ⱥ•i"+Â2'9Š0y°d¢ª´A˜I@К¹”6s}Äœ…ÆÊ›VBk«[¿)§£P„™Dg.² x’ˆW`µm5†-±~Ï‹¾zƒhKž‘¨·rtbHc1&Lo?Œ Mw\»e¥CF‰ÁÎ(O4¸¯ ¶=¬½ZuÅ$©;3¼jU‚ Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A request for present time of day has failed. This is usually internal, but a valid time is imperative for us.A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredArgument lies outside of valid range.Attempted access to non-existent key type.Base64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatConnection attempt failed. Try again, or check availability.Could not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDDerived key is too long for PKCS5 descriptor.Derived key length is incorrect for PKCS5 descriptor.Derived key material is too short to be applicable.Error adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileFailed verification of AP reply.Failure to use handle. Missing handle, or misconfigured.Field is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect key type used in AP reply.Incorrect key type used in AP request.Incorrect key type used in TGS reply.Incorrect key type used in reply from KDC.Incorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid PKCS5 descriptor.Invalid argument passed in call. Wrong or unknown value.Invalid claim of iteration count in PKCS5 descriptor.Invalid msg typeInvalid ticked passed in call.KDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyKey type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error.Last TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo KDC known for given realm.No TTY assigned to process.No errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Principal name syntax error.Protocol version mismatchProvided buffer was too small.Reading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Reference to invalid encryption key.Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer replied to the request with an error message.Server's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe ASN.1 structure does not contain the indicated element.The Shisa configuration file does not exist.The client or server has a null keyThe desired file could not be accessed. Check permissions.The indicated ASN.1 element does not carry a value.The key is too large to be usable.The present AP reply specifies an inpermissible key type.The private key uses an incompatible encryption type.The system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTicket set not initialized. This usually indicates an internal application error.Tickets in `%s': Timed out talking to KDC. This usually indicates a network or KDC address problem.Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorVerification failed on either side.Writing KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 1.0.2 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2013-04-03 11:27+0200 Last-Translator: Automatically generated Language-Team: none Language: en@boldquot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A request for present time of day has failed. This is usually internal, but a valid time is imperative for us.A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm ‘%s’... Adding key to ‘%s@%s’... Adding key to ‘%s@%s’...done Adding principal ‘%s@%s’... Adding principal ‘%s@%s’...done Adding realm ‘%s’... Adding realm ‘%s’...done Additional pre-authentication requiredAlternative authentication method requiredArgument lies outside of valid range.Attempted access to non-existent key type.Base64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatConnection attempt failed. Try again, or check availability.Could not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal “%sâ€: %sCould not parse server principal “%sâ€: %sCould not read library options ‘%s’: %sCould not read library options: %sCould not read passwordCould not set encryption type ‘%s’: %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDDerived key is too long for PKCS5 descriptor.Derived key length is incorrect for PKCS5 descriptor.Derived key material is too short to be applicable.Error adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileFailed verification of AP reply.Failure to use handle. Missing handle, or misconfigured.Field is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect key type used in AP reply.Incorrect key type used in AP request.Incorrect key type used in TGS reply.Incorrect key type used in reply from KDC.Incorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date ‘%s’Invalid --renew-till date ‘%s’Invalid --starttime date ‘%s’Invalid PKCS5 descriptor.Invalid argument passed in call. Wrong or unknown value.Invalid claim of iteration count in PKCS5 descriptor.Invalid msg typeInvalid ticked passed in call.KDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyKey type used to encrypt ticket doesn't match provided key. This usually indicates an internal application error.Last TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal ‘%s@%s’... Modifying principal ‘%s@%s’...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo KDC known for given realm.No TTY assigned to process.No errorNo tickets removed. Password expire onPassword for ‘%s@%s’: Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Principal name syntax error.Protocol version mismatchProvided buffer was too small.Reading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Reference to invalid encryption key.Removing key from ‘%s@%s’... Removing key from ‘%s@%s’...done Removing principal ‘%s@%s’... Removing principal ‘%s@%s’...done Removing realm ‘%s’... Removing realm ‘%s’...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer replied to the request with an error message.Server's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe ASN.1 structure does not contain the indicated element.The Shisa configuration file does not exist.The client or server has a null keyThe desired file could not be accessed. Check permissions.The indicated ASN.1 element does not carry a value.The key is too large to be usable.The present AP reply specifies an inpermissible key type.The private key uses an incompatible encryption type.The system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTicket set not initialized. This usually indicates an internal application error.Tickets in ‘%s’: Timed out talking to KDC. This usually indicates a network or KDC address problem.Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try ‘%s --help’ for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorVerification failed on either side.Writing KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as ‘%s’ for ‘%s’enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsshishi-1.0.2/po/insert-header.sin0000644000000000000000000000124012126772677013571 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } shishi-1.0.2/po/pl.gmo0000644000000000000000000004036212126773035011440 00000000000000Þ•¯”é °±¸ À Ê ÔàJæ`1(’»ÄÓî  $B\z —¸Î&è*1:3l &½4ä&(@%i¤bÂb%ˆ¨Ã)×)'+"Sv&Ž"µ(Ø#=a#)¥%Ïõ' 6"W'z#¢%Æì),2_%w)Çã$ù)8,b«Êè!ù'$C&h"%²Øó÷ '?bV¹*Áì#9.]&Œ³ÐÙî .9*W2‚µÏ!í"2!Pr"‘´ÌèAú</P'€+¨(Ôý&)A&k(’»Õ#õ  ' H )W " ¤ *à î ,!#0!PT!¥! Å!kæ!R"$j"""ž"Á"Ö",è"(#">#&a# ˆ#©# ½#"Ë#î# $*$%F$l$t$ˆ$$´$ Ì$×$é$ãü$à& ç&ó& ú&''R'¿p'>0(o(x(‡( š( §(²(&Ç(î(*)9))X)‚)'Ÿ)+Ç)-ó)C!*>e*%¤*8Ê*B+"F+2i+1œ+Î+&ì+o,oƒ,%ó,$->-6[-6’-0É-+ú-&.2C..v.4¥.Ú. ð.'ú.,"/-O/'}/*¥/)Ð/ú/'0(?0%h0*Ž0+¹0Eå0)+1&U12|1¯1Ê10é12:2)R2"|29Ÿ2?Ù2!3$;3#`3„3'¤3"Ì3.ï3%4%D4)j4$”4¹4¿4Ô4ô45m+5 ™5/£5Ó5!î5"6-36Aa6$£6*È6 ó6þ6 7)7 =7K7#S78w76°7ç78*$8(O8x8(–8¿8(Ý89&"9I9S[9¯9,Å9&ò92:1L:%~:8¤:*Ý:";2+;^; w;%˜; ¾;)Ë; õ;&<*<H<-g<•<'«< Ó<\ô<-Q=.=q®= >)7> a>%n>”>«>*»>)æ>$?$5? Z?{? ?'?Å?*å?@.0@_@h@|@‘@¦@ ¼@Ç@Ü@— ‘‡x5&dc•!GzL=g}„‹œ*H¨;sCŒRDaQSy:wf21n?{NUŠe…Ÿ"hŽtI[®š]+ 0kˆ¦o| –“q-i£‰)'6ªVƒ4M’‚$E^¬”>¢( ž\™X ,Y«B€K†›7<9Jv­rAO/¥.@¤PTWp~©¯m §8¡Z_ jl#`Fub3˜% Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredBase64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatCould not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDError adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileField is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid msg typeKDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyLast TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Protocol version mismatchReading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe Shisa configuration file does not exist.The client or server has a null keyThe system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTickets in `%s': Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorWriting KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 1.0.0 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2010-09-01 07:12+0200 Last-Translator: Jakub Bogusz Language-Team: Polish Language: pl MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Etype Klucz jest Has³o Priorytet Parametry S2K Zarodek Argumenty obowi±zkowe dla opcji d³ugich s± obowi±zkowe tak¿e dla opcji krótkich. Argumenty obowi±zkowe dla opcji d³ugich s± obowi±zkowe tak¿e dla opcji krótkich. Prosimy zg³aszaæ b³êdy na adres <%s>. B³êdy w t³umaczeniu prosimy zg³aszaæ na adres . Usuniêto %d bilet. Usuniêto %d bilety. Usuniêto %d biletów. (pkinit)(user-to-user)Us³uga niedostêpnaKonto wygasaKonto jestKonto niewa¿ne przedDodawanie domy¶lnej dziedziny `%s'... Dodawanie klucza do `%s@%s'... Dodawanie klucza do `%s@%s'... zakoñczone Dodawanie zarz±dcy `%s@%s'... Dodawanie zarz±dcy `%s@%s'... zakoñczone Dodawanie dziedziny `%s'... Dodawanie dziedziny `%s'... zakoñczone Wymagane dodatkowe wczesne uwierzytelnienieWymagana alternatywna metoda uwierzytelnieniaKodowanie lub dekodowanie base64 nie powiod³o siê. Uszkodzone dane?Warto¶æ nazwy klienta ró¿ni siê miêdzy ¿±daniem a odpowiedzi±.Nie znaleziono klienta w bazie danychKlient jeszcze nie jest wa¿ny - proszê spróbowaæ pó¼niejWarto¶æ dziedziny klienta ró¿ni siê miêdzy ¿±daniem a odpowiedzi±.Wpis klienta w bazie danych wygas³Klucz klienta zaszyfrowany w starym kluczu g³ównymDane uwierzytelniej±ce klientów zosta³y anulowaneZbyt du¿e przesuniêcie zegaraNie uda³o siê utworzyæ klucza (%d): %sNie uda³o siê odszyfrowaæ AP-REQ przy u¿yciu dostarczonego klucza. Zwykle oznacza to b³±d wewnêtrzny aplikacji.Nie uda³o siê odszyfrowaæ biletu przy u¿yciu dostarczonego klucza. Zwykle oznacza to b³±d wewnêtrzny aplikacji.Nie uda³o siê zniszczyæ biletu %d: %sNie uda³o siê wylistowaæ biletów: %sNie uda³o siê otworzyæ plikuNie uda³o siê przeanalizowaæ zarz±dcy klienta "%s": %sNie uda³o siê przeanalizowaæ zarz±dcy serwera "%s": %sNie uda³o siê odczytaæ opcji biblioteki `%s': %sNie uda³o siê odczytaæ opcji biblioteki: %sNie uda³o siê odczytaæ has³aNie uda³o siê ustawiæ rodzaju szyfrowania `%s': %sNie uda³o siê ustawiæ rodzajów szyfrowania: %sDane uwierzytelniaj±ce dla serwera zosta³y anulowaneBie¿±ca wersja kluczaWY£¡CZONEB³±d przy dodawaniu klucza do zarz±dcy.B³±d przy dodawaniu zarz±dcy do bazy danych.B³±d przy dodawaniu dziedziny do bazy danych.B³±d w numeracji kluczy w bazie danych.B³±d w numeracji zarz±dców w bazie danych.B³±d w numeracji dziedzin w bazie danych.B³±d przy szukaniu zarz±dcy.B³±d w funkcji ASN.1 (uszkodzone dane?)B³±d podczas odbierania danych z serweraB³±d przy usuwaniu klucza z zarz±dcy.B³±d przy usuwaniu zarz±dcy z bazy danych.B³±d przy usuwaniu dziedziny z bazy danych.Nie uda³o siê przeanalizowaæ pliku cache'a danych uwierzytelniaj±cychNie uda³o siê przeanalizowaæ pliku keytabPole zbyt d³ugie dla tej implementacjiB³±d we/wy pliku dla pliku konfiguracyjnego Shisy.B³±d wej¶cia/wyj¶cia plikuB³±d ogólny (opis w e-tek¶cie)Niew³a¶ciwy rodzaj sumy kontrolnej w komunikacieNiepoprawny kierunek komunikatuNiepoprawny adres sieciNiepoprawny numer sekwencji w komunikacieInicjalizacja nie powiod³a siê: %sKontrola poprawno¶ci odszyfrowanego pola nie powiod³a siêB³±d wewnêtrzny w niskopoziomowych funkcjach kryptograficznych.Nieprawid³owa data --endtime `%s'Nieprawid³owa data --renew-till `%s'Nieprawid³owa data --starttime `%s'Nieprawid³owy rodzaj komunikatuPolityka KDC odrzuca ¶cie¿kê tranzytow±KDC nie zgadza siê na ¿±dan± opcjêKDC nie obs³uguje tego rodzaju sumy kontrolnejKDC nie obs³uguje tego rodzaju szyfruKDC nie obs³uguje tego rodzaju padataKDC nie obs³uguje tego rodzaju transmisji¯±danie odrzucone przez politykê KDCKluczOstatnie ¿±danie TGTOstatnie pocz±tkowe ¿±danie TGTOstatnie pocz±tkowe ¿±danieOstatnie odnowienie biletuNiskopoziomowa operacja kryptograficzna nie powiod³a siê. Zwykle oznacza to z³e has³o lub uszkodzenie danych.BRAKUJ¡CYB³±d przydzielania pamiêci w bibliotece shishi.Komunikat spoza kolejno¶ciZmodyfikowany strumieñ komunikatuModyfikowanie zarz±dcy `%s@%s'... Modyfikowanie zarz±dcy `%s@%s'... zakoñczone Wiêcej ni¿ jeden klucz pasuje do podanego kryterium wyszukiwania.Wiele wpisów zarz±dcy w bazie danychWzajemne uwierzytelnienie nie powiod³o siêBrak b³êduNie usuniêto ¿adnego biletu. Has³o wygasaHas³o dla `%s@%s': Has³o wygas³oHas³o: Polityka odrzuca ¶cie¿kê tranzytow±Informacje wczesnego uwierzytelnienia by³y nieprawid³oweZarz±dca nie jest zwi±zany z ¿adnym pasuj±cym kluczem.Niezgodno¶æ wersji protoko³uOdczytywanie KRB-ERROR z %s... Odczytywanie KRB-ERROR z %s... zakoñczone Odczytywanie KRB-ERROR w formacie %s... Usuwanie klucza z `%s@%s'... Usuwanie klucza z `%s@%s'... zakoñczone Usuwanie zarz±dcy `%s@%s'... Usuwanie zarz±dcy `%s@%s'... zakoñczone Usuwanie dziedziny `%s'... Usuwanie dziedziny `%s'... zakoñczone Usuwanie biletu: Warto¶æ zabezpieczenia odtworzenia (nonce) ró¿ni siê miêdzy ¿±daniem a odpowiedzi±.¯±danie jest powtórk±¯±dana wersja protoko³u nie jest obs³ugiwana¯±dany serwer i bilet nie zgadzaj± si꯱dany czas pocz±tkowy jest pó¼niejszy ni¿ koñcowyOdpowied¼ zbyt du¿a dla UDP, proszê spróbowaæ TCPNie znaleziono serwera w bazie danychSerwer jeszcze nie jest wa¿ny - proszê spróbowaæ pó¼niejZarz±dca serwera wa¿ny tylko dla user2userWpis serwera w bazie danych wygas³Klucz serwera zaszyfrowany w starym kluczu g³ównymKlucz us³ugi niedostêpnyNie uda³o siê zainicjowaæ Shisy.Nie mo¿na otworzyæ bazy danych Shisy.Sukces ShisyInicjalizacja Shishi nie powiod³a siê: %sSukces ShishiPodana wersja klucza nie jest dostêpnaPodany zarz±dca nie istnieje.Podana dziedzina nie istnieje.B³±d sk³adni w tokenie konfiguracyjnym Shisy.TGT zosta³o anulowanePlik konfiguracyjny Shisy nie istnieje.Klient lub serwer ma pusty kluczWywo³anie systemowe bind() nie powiod³o siê. Zwykle oznacza to niewystarczaj±ce uprawnienia.Wywo³anie systemowe close() nie powiod³o siê.Wywo³anie systemowe sendto() nie powiod³o siê.Wywo³anie systemowe socket() nie powiod³o siê. Zwykle oznacza to, ¿e system nie obs³uguje danego rodzaju gniazdo.Bilet nie jest dla nasBilet i uwierzytelnienie nie zgadzaj± siêBilet wygas³Bilet nie nadaje siê do postdatowaniaBilet jeszcze niewa¿nyBilety w `%s': Próbowano dodaæ ju¿ istniej±cego zarz±dcê.Próbowano dodaæ ju¿ istniej±c± dziedzinê.Próbowano usun±æ niepust± dziedzinê.`%s --help' poda wiêcej informacji. Nieznany kod b³êdu KRB-ERROR %d.Nieznany b³±d ShisyNieznany b³±dZapisywanie KRB-ERROR w formacie %s... Zapisywanie KRB-ERROR do %s... Zapisywanie KRB-ERROR do %s... zakoñczone nie mo¿na zainicjowaæ libshishinie uda³o siê pobraæ biletu jako `%s' dla `%s'w³±czonelibshishi: info: %slibshishi: info: %s libshishi: uwaga: %slibshishi: uwaga: %s shisa: %s zbyt ma³o argumentówzbyt wiele argumentówshishi-1.0.2/po/POTFILES.in0000664000000000000000000000027012126660507012071 00000000000000# List of source files containing translatable strings for shishi. # Copyright (c) 2002-2013 Simon Josefsson lib/error.c lib/krberror.c db/err.c src/shisa.c src/shishi.c src/shishid.c shishi-1.0.2/po/boldquot.sed0000644000000000000000000000033112126772677012652 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g shishi-1.0.2/po/vi.po0000644000000000000000000006320612126773035011301 00000000000000# Vietnamese translation for Shishi. # Copyright © 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the shishi package. # Clytie Siddall , 2007-2010. # msgid "" msgstr "" "Project-Id-Version: shishi 1.0.0\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2010-10-02 19:40+0930\n" "Last-Translator: Clytie Siddall \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: LocFactoryEditor 1.8\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Thành công Shishi" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Gặp lá»—i trong hàm ASN.1 (dữ liệu bị há»ng ?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Không thể mở tập tin" #: lib/error.c:39 msgid "File input/output error" msgstr "Lá»—i vào/ra tập tin" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Lá»—i phân cấp bá»™ nhá»› trong thư viện shishi." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Lá»—i mã hoá/giải mã base64. Dữ liệu bị há»ng ?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Giá trị địa hạt khách khác biệt giữa yêu cầu và đáp ứng." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "Giá trị tên khách khác biệt giữa yêu cầu và đáp ứng." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "Giá trị bảo vệ phát lại (nonce) khác biệt giữa yêu cầu và đáp ứng." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Äiá»u có sẵn mật mã cấp thấp bị lá»—i. Thưá»ng ngụ ý mật khẩu sai hay dữ liệu bị " "há»ng." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Lá»—i ná»™i bá»™ trong các hàm mật mã cấp thấp." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "Lá»i gá»i hệ thống socket() (ổ cắm) bị lá»—i. Thưá»ng ngụ ý hệ thống không há»— trợ " "kiểu ổ cắm đó." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "Lá»i gá»i hệ thống bind() (đóng kết) bị lá»—i. Thưá»ng ngụ ý không đủ quyá»n truy " "cập." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "Lá»i gá»i hệ thống sendto() (gá»­i cho) bị lá»—i." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "Gặp lá»—i khi nhận dữ liệu từ máy phục vụ" #: lib/error.c:82 msgid "The system call close() failed." msgstr "Lá»i gá»i hệ thống close() (đóng) bị lá»—i." #: lib/error.c:84 #, fuzzy msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "Quá hạn khi liên lạc vá»›i KDC. Thưá»ng ngụ ý má»™t vấn đỠvá» mạng hoặc địa chỉ " "KDC." #: lib/error.c:87 #, fuzzy msgid "No KDC known for given realm." msgstr "Không có KDC đã biết cho địa hạt này." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 #, fuzzy msgid "Server replied to the request with an error message." msgstr "Nhận được yêu cầu thì máy phục vụ đáp ứng vá»›i thông Ä‘iệp lá»—i." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 #, fuzzy msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "Chưa sở khởi bá»™ vé. Thưá»ng ngụ ý lá»—i ứng dụng ná»™i bá»™." #: lib/error.c:98 #, fuzzy msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Kiểu khoá dùng để mã hoá vé không khá»›p vá»›i khoá đã cung cấp. Thưá»ng ngụ ý " "lá»—i ứng dụng ná»™i bá»™." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Không thể giải mã AP-REQ bằng khoá đã cung cấp. Thưá»ng ngụ ý lá»—i ứng dụng " "ná»™i bá»™." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Không thể giải mã Vé bằng khoá đã cung cấp. Thưá»ng ngụ ý lá»—i ứng dụng ná»™i bá»™." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Lá»—i phân tách tập tin keytab." #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Lá»—i phân tách tập tin nhá»› tạm thông tin xác thá»±c" #: lib/error.c:165 msgid "Unknown error" msgstr "Lá»—i không rõ" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "Không có lá»—i" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: thông tin: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: thông tin: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: cảnh báo : %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: cảnh báo : %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Äang ghi lá»—i KRB-ERROR vào %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Äang ghi lá»—i KRB-ERROR theo định dạng %s...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Äang ghi lá»—i KRB-ERROR vào %s...hoàn tất\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Äang Ä‘á»c lá»—i KRB-ERROR từ %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Äang Ä‘á»c lá»—i KRB-ERROR theo định dạng %s...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Äang Ä‘á»c lá»—i KRB-ERROR từ %s...hoàn tất\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Mục cá»§a trình khách trong cÆ¡ sở dữ liệu đã hết hạn" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Mục cá»§a trình phục vụ trong cÆ¡ sở dữ liệu đã hết hạn" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "Không há»— trợ số hiệu phiên bản giao thức đã yêu cầu" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Khoá cá»§a trình khách đã mật mã trong khoá chá»§ cÅ©" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Khoá cá»§a trình phục vụ đã mật mã trong khoá chá»§ cÅ©" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Không tìm thấy trình khách trong cÆ¡ sở dữ liệu" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Không tìm thấy trình phục vụ trong cÆ¡ sở dữ liệu" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "CÆ¡ sở dữ liệu chứa nhiá»u mục nhập chính" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "Trình khách hay trình phục vụ có khoá vô giá trị" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Vé không thích hợp để đặt ngày tháng sau" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "Giá» bắt đầu đã yêu cầu nằm sau giá» kết thúc" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "Chính sách KDC từ chối yêu cầu" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "KDC không thể xá»­ lý tùy chá»n đã yêu cầu" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "KDC không há»— trợ kiểu mật mã này" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "KDC không há»— trợ kiểu tổng kiểm này" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "KDC không há»— trợ kiểu dữ liệu padata này" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC không há»— trợ kiểu đã Ä‘i qua" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Thông tin xác thá»±c cá»§a trình khách đã bị há»§y bá»" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Thông tin xác thá»±c cá»§a trình phục vụ đã bị há»§y bá»" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "TGT đã bị há»§y bá»" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Trình khách chưa hợp lệ — thá»­ lại sau" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Trình phục vụ chưa hợp lệ — thá»­ lại sau" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Mật khẩu đã hết hạn " #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Thông tin xác thá»±c sẵn không hợp lệ" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Cần thiết xác thá»±c sẵn thêm" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Trình phục vụ đã yêu cầu không tương ứng vá»›i vé" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Mục chính trình phục vụ chỉ hợp lệ cho ngưá»i-dùng-đến-ngưá»i-dùng" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "Chính sách KDC từ chối đưá»ng dẫn đã Ä‘i qua" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "Dịch vụ không sẵn sàng" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Lá»—i thá»­ tính nguyên vẹn trên trưá»ng đã giải mã" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Vé quá thá»i" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Vé chưa hợp lệ" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "Yêu cầu cÅ©ng phát lại" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "Vé này không thích hợp vá»›i chúng ta" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Vé và bá»™ xác thá»±c không khá»›p" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Äá»™ lệch đồng hồ quá lá»›n" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Sai địa chỉ Mạng" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Phiên bản giao thức không khá»›p" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Kiểu thông Ä‘iệp không hợp lệ" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Luồng thông Ä‘iệp bị sá»­a đổi" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Thông Ä‘iệp không theo thứ tá»±" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Không có sẵn phiên bản khoá đã xác định" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Khoá dịch vụ không sẵn sàng" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "Lá»—i xác thá»±c lẫn nhau" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Sai hướng thông Ä‘iệp" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Cần thiết phương pháp xác thá»±c xen kẽ" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Sai số thứ tá»± dãy trong thông Ä‘iệp" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Kiểu tổng kiểm không thích hợp trong thông Ä‘iệp" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Chính sách từ chối đưá»ng dẫn đã Ä‘i qua" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Äáp ứng quá lá»›n cho UDP, hãy thá»­ lại vá»›i TCP" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Lá»—i giống loài (mô ta trong văn bản Ä‘iện tá»­)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Trưá»ng quá dài cho sá»± thá»±c hiện này" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(ngưá»i dùng-đến-ngưá»i dùng)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Mã lá»—i KRB-ERROR lạ %d." #: db/err.c:33 msgid "Shisa success" msgstr "Shisa thành công" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Không thể sở khởi Shisa." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "Tập tin cấu hình Shisa không tồn tại." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "Lá»—i V/R tập tin cho tập tin cấu hình Shisa." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Gặp lá»—i cú pháp trong hiệu bài cấu hình Shisa." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "Không thể mở cÆ¡ sở dữ liệu Shisa." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Gặp lá»—i khi đếm các địa hạt trong cÆ¡ sở dữ liệu." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Gặp lá»—i khi đếm các mục chính trong cÆ¡ sở dữ liệu." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Gặp lá»—i khi đếm các khoá trong cÆ¡ sở dữ liệu." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Äịa hạt đã cung cấp không tồn tại." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "Mục chính đã cung cấp không tồn tại." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Mục chính không liên quan đến khoá khá»›p." #: db/err.c:57 msgid "Error finding principal." msgstr "Gặp lá»—i khi tìm mục chính." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Äã thá»­ thêm má»™t địa hạt đã có." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Gặp lá»—i khi thêm địa hạt vào cÆ¡ sở dữ liệu." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Äã thá»­ gỡ bá» má»™t địa hạt không rá»—ng." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Gặp lá»—i khi gỡ bỠđịa hạt khá»i cÆ¡ sở dữ liệu." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Äã thá»­ thêm má»™t mục chính đã có." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Gặp lá»—i khi thêm mục chính vào cÆ¡ sở dữ liệu." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Gặp lá»—i khi gỡ bá» mục chính khá»i cÆ¡ sở dữ liệu." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Gặp lá»—i khi thêm khoá vào mục chính" #: db/err.c:75 msgid "Error removing key from principal." msgstr "Gặp lá»—i khi gỡ bá» khoá khá»i mục chính" #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "Nhiá»u khoá tương ứng vá»›i tiêu chuẩn tìm kiếm." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Lá»—i Shisa không rõ" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Tài khoản" #: src/shisa.c:144 msgid "DISABLED" msgstr "BỊ TẮT" #: src/shisa.c:144 msgid "enabled" msgstr "đã bật" #: src/shisa.c:145 msgid "Current key version" msgstr "Phiên bản khoá hiện thá»i" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Tài khoản không hợp lệ trước" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Yêu cầu TGT đầu tiên cuối vào" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Yêu cầu đầu tiên cuối vào" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Yêu cầu TGT cuối vào" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Gia hạn vé cuối vào" #: src/shisa.c:157 msgid "Password expire on" msgstr "Mật khẩu hết hạn vào" #: src/shisa.c:159 msgid "Account expire on" msgstr "Tài khoản hết hạn vào" #: src/shisa.c:172 msgid "Key" msgstr "Khoá" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tKiểu E" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tƯu tiên" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tSalt" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tTham số S2K" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tMật khẩu" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tKhoá" #: src/shisa.c:189 msgid "MISSING" msgstr "BỊ THIẾU" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Äang thêm địa hạt « %s »...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Äang thêm mục chính « %s@%s »...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Äang thêm địa hạt « %s »... hoàn tất\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Äang thêm mục chính « %s@%s »... hoàn tất\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Äang gỡ bỠđịa hạt « %s »...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Äang gỡ bá» mục chính « %s@%s »...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Äang gỡ bỠđịa hạt « %s »... hoàn tất\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Äang gỡ bá» mục chính « %s@%s »... hoàn tất\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Mật khẩu cho « %s@%s »: " #: src/shisa.c:375 msgid "Password: " msgstr "Mật khẩu : " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Không thể Ä‘á»c mật khẩu" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Không thể tạo khoá (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Hãy thá»­ lệnh trợ giúp « %s --help » để xem thêm thông tin.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Má»i đối số bắt buá»™c phải sá»­ dụng vá»›i tùy chá»n dài cÅ©ng bắt buá»™c vá»›i tùy chá»n " "ngắn.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "quá nhiá»u đối số" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Lá»—i sÆ¡ khởi:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Không thể Ä‘á»c các tùy chá»n vá» thư viện « %s »:\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Lá»—i sÆ¡ khởi Shisi:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Không thể đặt kiểu mật mã « %s »:\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "quá ít đối số" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Äang thêm địa hạt mặc định « %s »...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Äang sá»­a đổi mục chính « %s@%s »...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Äang sá»­a đổi mục chính « %s@%s »... hoàn tất\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Äang thêm khoá vào « %s@%s »...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Äang thêm khoá vào « %s@%s »... hoàn tất\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Äang gỡ bá» khoá khá»i « %s@%s »...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Äang gỡ bá» khoá khá»i « %s@%s »... hoàn tất\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "không thể sÆ¡ khởi libshishi" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Không thể đặt các kiểu mật mã: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Không thể phân tách mục chính cá»§a trình khách « %s »: %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Không thể phân tách mục chính cá»§a trình phục vụ « %s »: %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Không thể Ä‘á»c các tùy chá»n cá»§a thư viện: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Ngày tháng « --starttime » (giá» bắt đầu) không hợp lệ « %s »" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Ngày tháng « --endtime » (giá» kết thúc) không hợp lệ « %s »" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Ngày tháng « --renew-till » (gia hạn đến) không hợp lệ « %s »" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Vé trong « %s »:\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Không thể liệt kê các vé: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Äang gỡ bá» vé:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Không thể há»§y vé %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "Chưa gỡ bá» vé.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "%d vé bị gỡ bá».\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "không thể lấy vé như « %s » cho « %s »" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Má»i đối số bắt buá»™c phải sá»­ dụng vá»›i tùy chá»n dài cÅ©ng bắt buá»™c vá»›i tùy chá»n " "ngắn.\n" "\n" "Hãy thông báo lá»—i nào cho <%s>.\n" shishi-1.0.2/po/sr.po0000644000000000000000000007162312126773035011311 00000000000000# Serbian translation for shishi. # Copyright (C) 2012 Free Software Foundation, Inc. # This file is distributed under the same license as the shishi package. # МироÑлав Ðиколић , 2012. msgid "" msgstr "" "Project-Id-Version: shishi 1.0.0\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2012-07-29 23:19+0200\n" "Last-Translator: МироÑлав Ðиколић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: lib/error.c:33 msgid "Shishi success" msgstr "УÑпех Шишија" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Грешка у ÐСÐ.1 функцији (оштећени подаци?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Ðе могу да отворим датотеку" #: lib/error.c:39 msgid "File input/output error" msgstr "Улазно/излазна грешка датотеке" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Грешка доделе меморије у шиши библиотеци." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Шифровање или дешифровање оÑнове 64 није уÑпело. Оштећени подаци?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "ВредноÑÑ‚ подручја клијента Ñе разликује између захтева и одговора." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "ВредноÑÑ‚ назива клијента Ñе разликује између захтева и одговора." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "" "ВредноÑÑ‚ заштите одговора (nonce) Ñе разликује између захтева и одговора." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Криптографија ниÑког нивоа није уÑпела. Ово обично указује на лошу лозинку " "или на оштећене податке." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Унутрашња грешка у рутини шифровања ниÑког нивоа." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "СиÑтемÑки позив „socket()“ није уÑпео. Ово обично указује на то да ваш " "ÑиÑтем не подржава врÑту прикључнице." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "СиÑтемÑки позив „bind()“ није уÑпео. Ово обично указује на недовољна " "овлашћења." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "СиÑтемÑки позив „sendto()“ није уÑпео." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "Грешка у примању података Ñа Ñервера" #: lib/error.c:82 msgid "The system call close() failed." msgstr "СиÑтемÑки позив „close()“ није уÑпео." #: lib/error.c:84 #, fuzzy msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "ИÑтекло је време за разговор Ñа КДЦ-ом. Ово обично указује на проблеме Ñа " "мрежом или КДЦ адреÑом." #: lib/error.c:87 #, fuzzy msgid "No KDC known for given realm." msgstr "Ðије познат КДЦ за подручје." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 #, fuzzy msgid "Server replied to the request with an error message." msgstr "Сервер је одговорио поруком грешке на захтев." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 #, fuzzy msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Ðије покренут Ñкуп картица. Ово обично указује на унутрашњу грешку програма." #: lib/error.c:98 #, fuzzy msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Ð’Ñ€Ñта кључа коришћеног за шифровање карте не одговара доÑтављеном кључу. Ово " "обично указује на унутрашњу грешку програма." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Ðе могу да дешифрујем ÐП-ЗÐÐ¥ кориÑтећи доÑтављени кључ. Ово обично указује " "на унутрашњу грешку програма." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Ðе могу да дешифрујем Карту кориÑтећи доÑтављени кључ. Ово обично указује на " "унутрашњу грешку програма." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "ÐиÑам уÑпео да обрадим датотеку табеле кључа" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "ÐиÑам уÑпео да обрадим датотеку оÑтаве уверења" #: lib/error.c:165 msgid "Unknown error" msgstr "Ðепозната грешка" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "Ðема грешке" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "либшиши: подаци: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "либшиши: подаци: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "либшиши: упозорење: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "либшиши: упозорење: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "ЗапиÑујем КРБ-ГРЕШКУ у „%s“...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "ЗапиÑујем КРБ-ГРЕШКУ у формат „%s“...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "ЗапиÑивање КРБ-ГРЕШКЕ у „%s“...обављено\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Читам КРБ-ГРЕШКУ у „%s“...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Читам КРБ-ГРЕШКУ у формату „%s“...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Читање КРБ-ГРЕШКЕ у „%s“...обављено\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Ð£Ð½Ð¾Ñ ÐºÐ»Ð¸Ñ˜ÐµÐ½Ñ‚Ð° у бази података је иÑтекао" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Ð£Ð½Ð¾Ñ Ñервера у бази података је иÑтекао" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "Број издања захтеваног протокола није подржан" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Кључ клијента је шифрован у Ñтаром главном кључу" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Кључ Ñервера је шифрован у Ñтаром главном кључу" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Клијент није пронађен у бази података" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Сервер није пронађен у бази података" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Више почетних уноÑа у бази података" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "Клијент или Ñервер има ништаван кључ" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Картица није подеÑна за каÑнију употребу" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "Захтевано почетно време је каÑније од времена завршетка" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "КДЦ политика одбацује захтев" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "КДЦ не може да обухвати захтевану могућноÑÑ‚" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "КДЦ не поÑедује подршку за врÑту шифровања" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "КДЦ не поÑедује подршку за врÑту провера Ñуме" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "КДЦ не поÑедује подршку за врÑту паралелних података" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "КДЦ не поÑедује подршку за врÑту пренешених" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Уверења клијената Ñу опозвана" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Уверење за Ñервер је опозвано" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "ТГТ је опозван" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Клијент није још увек иÑправан — покушајте каÑније" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Сервер није још увек иÑправан — покушајте каÑније" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Лозинка је иÑтекла " #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Податак за ранију проверу идентитета је био неиÑправан" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Потребна је додатна ранија провера идентитета" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Захтевани Ñервер и картица Ñе не подударају" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Почетни Ñервера је иÑправан Ñамо од кориÑника-до-кориÑника" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "КДЦ политика одбија пренешену путању" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "УÑлуга није доÑтупна" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Провера целовитоÑти на дешифрованом пољу није уÑпела" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Картица је иÑтекла" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Картица још није иÑправна" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "Захтев је одговор" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "Картица није за употребу" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Картица и потврђивач идентитета Ñе не поклапају" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Сат Ñе нагнуо ка већем" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Ðетачна адреÑа мреже" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Издања протокола Ñе не подударају" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "ÐеиÑправна врÑта поруке" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Измењен је ток поруке" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Порука је ван поретка" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Ðаведено издање кључа није доÑтупно" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Кључ уÑлуге није доÑтупан" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "МеђуÑобно потврђивање идентитета није уÑпело" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Ðетачан Ñмер поруке" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Потребан је резервни начин потврђивања идентитета" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Ðетачан број низа у поруци" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Ðеодговарајућа врÑта провере Ñуме у поруци" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Политика одбија пренешену путању" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Одговор је превелик за УДП, пробајте Ñа ТЦП" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Општа грешка (Ð¾Ð¿Ð¸Ñ Ñƒ е-текÑту)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Поље је предуго за ову примену" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(кориÑник-кориÑнику)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Ðепознат код гређке %d КРБ-ГРЕШКЕ." #: db/err.c:33 msgid "Shisa success" msgstr "УÑпех Шизе" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Шиза не може бити покренут." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "Датотека подешавања Шизе не поÑтоји." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "У/И грешка датотеке за датотеку подешавања Шизе." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Грешка Ñадржаја у елементу подешавања Шизе." # мало аориÑта ;-) #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "База података Шизе не може бити отворена." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Грешка нумериÑања подручја у бази података." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Грешка нумериÑања почетних у бази података." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Грешка нумериÑања кључева у бази података." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "ДоÑтављено подручје не поÑтоји." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "ДоÑтављени почетни не поÑтоји." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Почетни није придружен ниједном поклопљеном кључу." #: db/err.c:57 msgid "Error finding principal." msgstr "Грешка проналажења главног." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Покушах да додам подручје које већ поÑтоји." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Грешка додавања подручја у базу података." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Покушах да уклоним не-празно подручје." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Грешка уклањања подручја из базе података." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Покушах да додам почетни које већ поÑтоји." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Грешка додавања почетног у базу података." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Грешка уклањања почетног из базе података." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Грешка додавања кључа почетном." #: db/err.c:75 msgid "Error removing key from principal." msgstr "Грешка уклањања кључа из почетног." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "Више од једног кључа одговарају датом уÑлову претраге." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Ðепозната грешка Шизе" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "шиза: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Ðалог је" #: src/shisa.c:144 msgid "DISABLED" msgstr "ИСКЉУЧЕÐ" #: src/shisa.c:144 msgid "enabled" msgstr "укључен" #: src/shisa.c:145 msgid "Current key version" msgstr "Тренутно издање кључа" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Ðалог није иÑправан пре" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "ПоÑледњи почетни ТГТ захтев" #: src/shisa.c:151 msgid "Last initial request at" msgstr "ПоÑледњи почетни захтев" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "ПоÑледњи ТГТ захтев" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "ПоÑледња обнова карте" #: src/shisa.c:157 msgid "Password expire on" msgstr "Лозинка иÑтиче" #: src/shisa.c:159 msgid "Account expire on" msgstr "Ðалог иÑтиче" #: src/shisa.c:172 msgid "Key" msgstr "Кључ" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tЕ-врÑта" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tВажноÑÑ‚" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tСалт" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tС2К параметри" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tЛозинка" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tКључ" #: src/shisa.c:189 msgid "MISSING" msgstr "ÐЕДОСТÐЈЕ" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Додајем подручје „%s“...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Додајем почетног „%s@%s“...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Додајем подручје „%s“...готово\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Додајем почетног „%s@%s“...готово\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Уклањам подручје „%s“...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Уклањам почетног „%s@%s“...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Уклањам подручје „%s“...готово\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Уклањам почетног „%s@%s“...готово\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Лозинка за „%s@%s“: " #: src/shisa.c:375 msgid "Password: " msgstr "Лозинка: " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Ðе могу да прочитам лозинку" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Ðе могу да направим кључ (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Пробајте „%s --help“ за више података.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Обавезни аргументи за дуге опције Ñу обавезни и за кратке опције такође.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "превише аргумената" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Ðије уÑпело покретање:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Ðе могу да прочитам могућноÑти библиотеке „%s“:\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Ðије уÑпело покретање Шишија:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Ðе могу да подеÑим врÑту шифровања „%s“:\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "премало аргумената" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Додајем оÑновно подручје „%s“...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Мењам почетног „%s@%s“...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Мењам почетног „%s@%s“...готово\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Додајем кључ у „%s@%s“...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Додајем кључ у „%s@%s“...готово\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Уклањам кључ из „%s@%s“...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Уклањам кључ из „%s@%s“...готово\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "не могу да покренем либшиши" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Ðе могу да подеÑим врÑте шифровања: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Ðе могу да обрадим главног клијента „%s“: %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Ðе могу да обрадим главног Ñервера „%s“: %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Ðе могу да прочитам могућноÑти библиотеке: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "ÐеиÑправан податак почетног времена (--starttime) „%s“" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "ÐеиÑправан податак крајњег времена (--endtime) „%s“" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "ÐеиÑправан податак обнављања (--renew-till) „%s“" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Карте у „%s“:\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Ðе могу да прегледам карте: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Уклањам карту:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Ðе могу да уништим карту %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "Ðиједна картица није уклоњена.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "Укоњена је %d картица.\n" msgstr[1] "Укоњене Ñу %d картице.\n" msgstr[2] "Укоњено је %d картица.\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "не могу да добавим картицу као „%s“ за „%s“" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Обавезни аргументи за дуге опције Ñу обавезни и за кратке опције такође.\n" "\n" "Грешке пријавите на <%s>.\n" shishi-1.0.2/po/shishi.pot0000644000000000000000000004210212126773034012325 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Simon Josefsson # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: shishi 1.0.2\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: lib/error.c:33 msgid "Shishi success" msgstr "" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "" #: lib/error.c:37 msgid "Could not open file" msgstr "" #: lib/error.c:39 msgid "File input/output error" msgstr "" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "" #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "" #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "" #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "" #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "" #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "" #: lib/error.c:80 msgid "Error receiving data from server" msgstr "" #: lib/error.c:82 msgid "The system call close() failed." msgstr "" #: lib/error.c:84 msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" #: lib/error.c:87 msgid "No KDC known for given realm." msgstr "" #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 msgid "Server replied to the request with an error message." msgstr "" #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" #: lib/error.c:98 msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "" #: lib/error.c:165 msgid "Unknown error" msgstr "" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "" #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "" #: db/err.c:33 msgid "Shisa success" msgstr "" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "" #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "" #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "" #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "" #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "" #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "" #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "" #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "" #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "" #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "" #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "" #: db/err.c:57 msgid "Error finding principal." msgstr "" #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "" #: db/err.c:61 msgid "Error adding realm to database." msgstr "" #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "" #: db/err.c:65 msgid "Error removing realm from database." msgstr "" #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "" #: db/err.c:69 msgid "Error adding principal to database." msgstr "" #: db/err.c:71 msgid "Error removing principal from database." msgstr "" #: db/err.c:73 msgid "Error adding key to principal." msgstr "" #: db/err.c:75 msgid "Error removing key from principal." msgstr "" #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "" #: db/err.c:98 msgid "Unknown Shisa error" msgstr "" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "" #: src/shisa.c:143 msgid "Account is" msgstr "" #: src/shisa.c:144 msgid "DISABLED" msgstr "" #: src/shisa.c:144 msgid "enabled" msgstr "" #: src/shisa.c:145 msgid "Current key version" msgstr "" #: src/shisa.c:147 msgid "Account not valid before" msgstr "" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "" #: src/shisa.c:151 msgid "Last initial request at" msgstr "" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "" #: src/shisa.c:157 msgid "Password expire on" msgstr "" #: src/shisa.c:159 msgid "Account expire on" msgstr "" #: src/shisa.c:172 msgid "Key" msgstr "" #: src/shisa.c:174 msgid "\tEtype" msgstr "" #: src/shisa.c:177 msgid "\tPriority" msgstr "" #: src/shisa.c:181 msgid "\tSalt" msgstr "" #: src/shisa.c:183 msgid "\tS2K params" msgstr "" #: src/shisa.c:186 msgid "\tPassword" msgstr "" #: src/shisa.c:189 msgid "\tKey is" msgstr "" #: src/shisa.c:189 msgid "MISSING" msgstr "" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "" #: src/shisa.c:375 msgid "Password: " msgstr "" #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "" msgstr[1] "" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" shishi-1.0.2/po/fr.gmo0000644000000000000000000004016612126773035011436 00000000000000Þ•ªlã¼ HIP X b lx`~(ß ; MXq©Ç ä&5*\1‡3¹í& 41&f(%¶ÜñbbrÕõ)$)N'x" Ã&Û"(%Nbk#Š®#Î)ò%B'["ƒ'¦#Î%ò)4,^‹%£)Éó$%J)d,Ž»×ö!%'G$o&”"»%Þ#7Skb‚å*í-E#e.‰&¸ßü-D Ze*ƒ2®áû!";^!|ž"½àøA&h/|'¬+Ô()&F)m&—(¾ç#! E St)ƒ"­Ð*ï ,/ #\ P€ Ñ ñ k!~!$–!»!"Ê!í!","(A""j" "®" Â""Ð"ó"#/#7#K#`#w# #š#¬#œ¿#\% c% p% ~%ˆ%˜%‚%+ &L&U&q&‘& ¤&²&$È&!í&#'"3'$V'{'•'+±'.Ý'@ (BM()(*º(<å(3")3V)9Š)$Ä)é)q *p{*"ì*+/+.M+/|+2¬+.ß+,0+,+\,?ˆ,È, á,2ë,@-:_-?š-FÚ-B!."d.2‡.:º.Eõ.?;/5{/"±/0Ô/@0%F0*l05—0Í0í0,141=S1@‘1!Ò1$ô1#2=21V2,ˆ22µ2-è2%3$<3&a3ˆ33¤3Ä3"à3~4 ‚48Œ4Å4Ú4)ò4+58H555$·5 Ü5é56676P6*`64‹6;À6)ü6"&7%I7*o7'š7)Â7(ì7*8@8!`8‚8W›8ó84 95@9;v90²9*ã9+:E::4€:4µ:'ê:!;14;f;(u;ž;-®;"Ü;ÿ;><^<2s<(¦<RÏ<!"="D=og=×=1õ='>0:>!k>>-¢>)Ð>)ú>#$?H?a?+q? ?#¾?â?é?ý?@+@ E@P@e@¦-u‡5F¢/H<Y‰3€ˆŒpSV`X“oPŠ;£ƒqUl”†}ŸBQ!tb_ \–…yiWDš^§œ&g‘:¤Ja]vn¥•‹„6~Z 1@Gcr2˜O[x ?'¡m0I›eh‚w"Ž=f(™C©,| ž %TE.z*)84R {Msk9A—j#>Nª’¨L7d$+K Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredBase64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatCould not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDError adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileField is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid msg typeKDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyLast TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Protocol version mismatchReading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe Shisa configuration file does not exist.The client or server has a null keyThe system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTickets in `%s': Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorWriting KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi 0.0.30 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2007-06-08 16:27+0200 Last-Translator: Daniel Dehennin Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); Etype La clef est Mot de passe Priorité Paramètres S2K Sel Les arguments obligatoires au options longues sont aussi obligatoires pour les options courtes. Rapportez les anomalies à <%s>. %d ticket supprimé. %d tickets supprimés. (pkinit)(utilisateur-à-utilisateur)Un service n'est pas disponibleLe compte expire àLe compte estCompte invalide avantAjout du domaine par défaut '%s'... Ajout de la clef pour '%s@%s'... Ajout de la clef pour '%s@%s'...ok Ajout de l'identifiant '%s@%s'... Ajout de l'identifiant '%s@%s'...ok Ajout du domaine '%s'... Ajout du domaine '%s'...ok Pre-authentification supplémentaire requiseMéthode d'authentification alternative requiseL'encodage ou le décodage en base64 a échoué. Donnée corrompue ?La valeur du nom du client diffère entre la requète et la réponse.Client non trouvé dans la base de donnéesClient encore invalide - essayez plus tardLe domaine du client diffère entre la requète et la réponse.L'entrée du client dans la base de donnée a expiréeClef du client chiffrée avec l'ancienne clef maîtreL'information d'authentification du client a été révoquéeLe décalage d'horloge est trop grandNe peut créer la clef (%d) : %sNe peut pas déchiffrer AP-REQ avec la clef fournie. Cela révèle généralement une erreur interne de l'application.Ne peut déchiffrer le Ticket avec la clef fournie. Cela révèle généralement une erreur interne de l'application.Ne peut détruire le ticket %d : %sNe peut lister les tickets : %sNe peut pas ouvrir le fichierNe peut lire l'identifiant du client "%s" : %sNe peut lire l'identifiant du serveur "%s" : %sNe peut lire les options de bibliothèque '%s' : %sNe peut lire les options de bibliothèques : %sNe peut lire le mot de passeNe peut définir le type de chiffrement '%s' : %sNe peut définir le type de chiffrement : %sL'information d'authentification pour le serveur a été révoquéeVersion actuelle de clefDÉSACTIVÉErreur lors de l'ajout de la clef à l'identifiant.Erreur lors de l'ajout de l'identifiant dans la base de données.Erreur lors de l'ajout du domaine dans la base de données.Erreur lors de l'énumération des clefs dans la base de données.Erreur lors de l'énumération des identifiants dans la base de données.Erreur lors de l'énumération des domaines dans la base de données.Erreur pour trouver l'identifiant.Erreur dans la fonction ASN.1 (donnée corrompue ?)Erreur lors de la suppression de la clef de l'identifiant.Erreur lors de la suppression de l'identifiant de la base de données.Erreur lors de la suppression du domaine de la base de données.Échec de lecture du ficher de cache des mots de passeÉchec de lecture du fichier keytabLe champ est trop long pour cette implémentationErreur d'entrée/sortie sur le fichier de configuration de Shisa.Erreur d'entrée/sortie sur le fichierErreur générique (description dans e-text)Type de somme de contrôle inapproprié dans le messageDirection de message incorrecteAdresse réseau incorrecteNuméro de séquence incorrect dans le messageL'initialisation a échoué : %sLa vérification de l'intégrité d'un champ déchiffré a échouéeErreur interne dans les routines cryptographiques de bas-niveau.Date pour --endtime invalide '%s'Date pour --renew-till invalide '%s'Date pour --starttime invalide '%s'Type de message invalideLa politique du KDC rejette les chemins transitésLe KDC ne peut pas adapter l'option demandéeLe KDC ne supporte pas le type de somme de contôleLe KDC ne supporte pas le type de chiffrementLe KDC ne supporte pas le type padataKDC ne supporte pas le type transitéLa politique du KDC rejecte la requèteClefDernière requète TGT àDernière requète initiale TGT àDernière requète initiale àDernier renouvellement de ticket àÉchec de la primitive cryptographique de bas-niveau. Cela révèle généralement un mauvais mot de passe ou une donnée corrompue.MANQUANTEErreur d'allocation mémoire dans la bibliothèque shishi.Message hors serviceFlux du message modifiéModification de l'identifiant '%s@%s'... Modification de l'identifiant '%s@%s'...ok Plus d'une clef correspondent aux critères de recherche.Multiple entrées de principal dans la base de donnéesL'authentification mutuelle a échouéPas d'erreurAucun ticket supprimé. Le mot de passe expire àMot de passe pour '%s@%s' : Le mot de passe a expiréMot de passe : La politique rejette les chemins transitésL'information de pré-authentification était invalideLe principal n'est associé avec aucune clef correspondante.La version de protocole ne correspond pasLecture de KRB-ERROR depuis %s... Lecture de KRB-ERROR depuis %s... ok Lecture de KRB-ERROR dans le format %s... Suppression de la clef pour '%s@%s'... Suppression de la clef pour '%s@%s'...ok Suppression de l'identifiant '%s@%s'... Suppression de l'identifiant '%s@%s'...ok Suppression du domaine '%s'... Suppression du domaine '%s'...ok Suppression du ticket : La valeur de protection contre le rejeu (nonce) diffère entre la requète et la réponse.La requète est un rejeuLa version de protocole demandée n'est pas supportéeLe serveur et le ticket demandés ne correspondent pasLa date de départ demandée est postérieure à la date de finRéponse trop grande pour UDP, réessayez avec TCPServeur non trouvé dans la base de donnéesServeur encore invalide - essayez plus tardIdentificant du serveur valide uniquement d'utilisateur à utilisateurL'entrée du serveur dans la base de donnée a expiréeClef du serveur chiffrée avec l'ancienne clef maîtreLe service de clef n'est pas disponibleShisa n'a pas pu être initialisé.La base de données Shisa n'a pas pu être ouverte.Shisa a réussiL'initialisation de Shishi a échoué : %sShishi a réussiLa version de clef spécifiée est indisponibleL'identifiant fourni n'existe pas.Le domaine fourni n'existe pas.Erreur de syntaxe dans le paramètre de configuration de Shisa.Le TGT a été révoquéLe fichier de configuration de Shisa n'existe pas.Le client ou le serveur a une clef nulleL'appel système bind() a échoué. Cela révèle généralement des droits insuffisants.L'appel système close() a échoué.L'appel système sendto() a échoué.L'appel système socket() a échoué. Cela révèle généralement le non support du type de socket par votre système.Le ticket n'est pas pour nousLe ticket et l'authentifiant ne correspondent pasLe ticket a expiréLe ticket n'est pas éligible pour le post-datageLe ticket n'est pas encore valideTickets dans '%s' : Essai d'ajout d'un identifiant déjà existant.Essai d'ajout d'un domaine déjà existant.Essai de suppression de domaine non vide.Code d'erreur KRB-ERROR inconnu %d.Erreur de Shisa inconnueErreur inconnueÉcriture de KRB-ERROR dans le format %s... Écriture de KRB-ERROR sur %s... Écriture de KRB-ERROR sur %s... ok activélibshishi: info: %slibshishi: info: %s libshishi: attention: %slibshishi: attention: %s shisa: %s Trop peu d'argumentsTrop d'argumentsshishi-1.0.2/po/fi.po0000644000000000000000000011302012126773035011247 00000000000000# Finnish messages for shishi. # Copyright © 2010 Free Software Foundation, Inc. # Copyright © 2007, 2010 Simon Josefsson # This file is distributed under the same license as the shishi package. # Jorma Karvonen , 2010. # msgid "" msgstr "" "Project-Id-Version: shishi-1.0.0\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2010-08-31 12:00+0200\n" "Last-Translator: Jorma Karvonen \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.2\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Shishi onnistui" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Virhe ASN.1-funktiossa (tiedot vaurioituneet?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Ei voitu avata tiedostoa" #: lib/error.c:39 msgid "File input/output error" msgstr "Tiedoston siirräntävirhe" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Muistinvarausvirhe shishi-kirjastossa" #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Base64-koodaus tai -dekoodaus epäonnistui. Tiedot vaurioituneet?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Asiakasalue eroaa pyynnön ja vastauksen välillä." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "Asiakasnimi eroaa pyynnön ja vastauksen välillä." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "" "Toista suoja-arvon (vain kerran esiintyvä numero tai bittimerkkijono) ero " "pyynnön ja vastauksen välillä." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Alemman tason salausprimitiivi epäonnistui. Tämä tavallisesti viittaa " "väärään salasanaan tai tietojen vaurioitumiseen." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Sisäinen virhe alemman tason salausrutiineissa." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "Järjestelmäkutsu socket() epäonnistui. Tämä tavallisesti viittaa siihen, " "että järjestelmäsi ei tue pistoketyyppiä." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "Järjestelmäkutsu bind() epäonnistui. Tämä on tavallisesti merkkinä " "riittämättömistä käyttöoikeuksista." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "Järjestelmäkutsu sendto() epäonnistui." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "Virhe vastaanotettaessa tietoja palvelimelta" #: lib/error.c:82 msgid "The system call close() failed." msgstr "Järjestelmäkutsu close() epäonnistui." # KDC on Kerberoksen käyttämä "Key Distribution Center" #: lib/error.c:84 #, fuzzy msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "KDC-keskustelun aikavalvontakatkaisu. Tämä viittaa tavallisesti verkon tai " "KDC-osoitteen pulmiin." #: lib/error.c:87 #, fuzzy msgid "No KDC known for given realm." msgstr "Ei tunneta KDC:tä alueelle." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 #, fuzzy msgid "Server replied to the request with an error message." msgstr "Palvelin vastasi pyyntöön virheilmoituksella." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 #, fuzzy msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Pääsylippujoukkoa ei ole alustettu. Tämä viittaa tavallisesti sisäiseen " "sovellusvirheeseen." # Kerberos indentity or ticket #: lib/error.c:98 #, fuzzy msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Avaintyyppi, jota käytettiin pääsylipun salaukseen, ei täsmää tarjotun " "avaimen kanssa. Tämä viittaa tavallisesti sisäiseen sovellusvirheeseen." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Ei voitu purkaa AP-REQ-salausta käyttäen tarjottua avainta. Tämä viittaa " "tavallisesti sisäiseen sovellusvirheeseen." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Ei voitu purkaa pääsylipun salausta käyttäen tarjottua avainta. Tämä viittaa " "tavallisesti sisäiseen sovellusvirheeseen." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Keytab-tiedoston jäsentäminen epäonnistui" # Kerberos-palvelimen asiakkaalle lähettämän Credentials-valtakirjan sisällä on ticket ja session key. Se on salattu asiakkaan salaisella avaimella ja sisältää väliaikaisen salausavaimen. Valtakirja on mielestäni parempi suomennos kuin ATK-sanakirjan valtuustieto. #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Valtakirjavälimuistitiedoston jäsentäminen epäonnistui" #: lib/error.c:165 msgid "Unknown error" msgstr "Tuntematon virhe" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "Ei virhettä" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: tiedot: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: tiedot: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: varoitus: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: varoitus: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Kirjoitetaan KRB-ERROR tiedostoon n %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Kirjoitetaan KRB-ERROR %s-muodossa...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Kirjoitetaan KRB-ERROR tiedostoon %s...valmis\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Luetaan KRB-ERROR tiedostosta %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Luetaan KRB-ERROR %s-muodossa...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Luetaan KRB-ERROR tiedostosta %s...valmis\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Asiakkaan tiedot tietokannassa ovat vanhentuneet" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Palvelimen tiedot tietokannassa ovat vanhentuneet" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "Pyydettyä yhteyskäytäntöversionumeroa ei tueta" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Asiakkaan avain salattu vanhassa pääavaimessa" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Palvelimen avain salattu vanhassa pääavaimessa" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Asiakasta ei löytynyt tietokannasta" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Palvelinta ei löytynyt tietokannasta" # Principal on Kerberos-tietokannan tietue, joka sisältää tiedot joko työaseman käyttäjästä tai kerberos-verkoon sisältyvästä palvelimesta (ei siis kerberos-palvelimesta). Sanakirjan mukaan yksi principal-sanan määrittelyjä on "chief participant in a transaction". #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Useita pääosapuolitietueita tietokannassa" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "Asiakkaalla tai palvelimella on null-avain" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Pääsylippu ei ole sopiva jälkiajoitukselle" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "Pyydetty aloitusaika on myöhäisempi kuin lopettamisaika" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "KDC-toimintaperiaate kieltää pyynnön" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "KDC ei voi mukautua pyydettyyn valitsimeen" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "KDC ei tue salaustyyppiä" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "KDC ei tue tarkistussummatyyppiä" # Historiallisesti padata on tarkoittanut esitodennettua dataa, mutta nykyisin sen merkitys on laajempi. #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "KDC ei tue padata-tyyppiä" # Tämä viittaa ehkä "transited encoding types"-käsitteeseen. #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC ei tue transited-tyyppiä" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Asiakkaan valtakirja on peruutettu" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Valtakirjat palvelimelle on peruutettu" # TGT tarkoittaa Ticket-Granting-Ticket eli pääsylippua, joka myöntää pääsylipun. #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "TGT on peruutettu" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Asiakas ei ole vielä kelvollinen - yritä myöhemmin uudelleen" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Palvelin ei ole vielä kelvollinen - yritä myöhemmin uudelleen" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Salasana on vanhentunut" #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Esitodennustiedot olivat virheelliset" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Lisäesitodennusta tarvittu" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Pyydetty palvelin ja pääsylippu eivät täsmää" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Palvelinpääosapuoli on kelvollinen vain käyttäjä-käyttäjä -viestintään" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "KDC-toimintaperiaate kieltää siirretyn polun" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "Palvelu ei ole käytettävissä" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Salauspuretun tiedoston eheystarkistus epäonnistui" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Pääsylippu on vanhentunut" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Pääsylippu ei ole vielä kelvollinen" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "Pyyntö on toisto" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "Pääsylippu ei ole meille" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Pääsylippu ja todentaja eivät täsmää" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Aikavääristymä on liian suuri" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Väärä verkko-osoite" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Yhteyskäytäntöversion täsmäämättömyys" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Virheellinen viestityyppi" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Viestivirta muutettu" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Viesti on rikki" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Avaimen määritelty versio ei ole käytettävissä" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Palveluavain ei ollut käytettävissä" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "Molemminpuolinen todennus epäonnistui" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Virheellinen viestisuunta" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Vaihtoehtoinen todennusmenetelmä vaadittiin" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Virheellinen sekvenssinumero viestissä" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Sanomassa oli sopimaton tarkistussummatyyppi" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Toimintaperiaate kieltää siirretyn polun" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Vastaus on liian suuri UDP:lle, yritetään uudelleen TCP:nä" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Yleinen virhe (kuvaus e-text -tekstissä)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Kenttä on liian pitkä tälle toteutukselle" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(käyttäjältä-käyttäjälle)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Tuntematon KRB-ERROR-virhekoodi %d." #: db/err.c:33 msgid "Shisa success" msgstr "Shisa onnistui" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Shisaa ei voitu alustaa." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "Shisa-asetustiedostoa ei ole olemassa." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "Tiedostosiirräntävirhe Shisa-asetustiedostolle." # Token-sanan tässä merkkijono [jossa ei ole tyhjemerkkejä (välilyöntejä)] #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Syntaksivirhe Shisa-asetusmerkkijonossa." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "Shisa-tietokantaa ei voitu avata." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Virhe muunnettaessa alueita luetelluiksi tyypeiksi tietokannassa." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Virhe muunnettaessa pääosapuolia luetelluiksi tyypeiksi tietokannassa" #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Virhe muunnettaessa avaimia luetelluiksi tyypeiksi tietokannassa" #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Tarjottu alue ei ollut olemassa." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "Tarjottua pääosapuolta ei ole olemassa." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Pääosapuoli ei ole liitetty mihinkään täsmäävään avaimeen." #: db/err.c:57 msgid "Error finding principal." msgstr "Virhe etsittäessä pääosapuolta." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Yritettiin lisätä alue, joka on jo olemassa." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Virhe lisättäessä aluetta tietokantaan." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Yritettiin poistaa ei-tyhjä alue." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Virhe poistettaessa alue tietokannasta." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Yritettiin lisätä pääosapuoli, joka on jo olemassa." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Virhe lisättäessä pääosapuolta tietokantaan." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Virhe poistettaessa pääosapuolta tietokannasta." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Virhe lisättäessä avainta pääosapuoleen." #: db/err.c:75 msgid "Error removing key from principal." msgstr "Virhe poistettaessa avainta pääosapuolesta." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "Useampi kuin yksi avain täsmää annettuun hakukriteeriin." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Tuntematon Shisa-virhe" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Tili on" #: src/shisa.c:144 msgid "DISABLED" msgstr "POISTETTU KÄYTÖSTÄ" #: src/shisa.c:144 msgid "enabled" msgstr "otettu käyttöön" #: src/shisa.c:145 msgid "Current key version" msgstr "Nykyinen avainversio" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Tili ei ole kelvollinen ennen" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Viimeinen alustus-TGT -pyyntö pääosapuolessa" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Viimeinen alustuspyyntö pääosapuolessa" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Viimeinen TGT-pyyntö pääosapuolessa" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Viimeinen pääsylippu-uudistaminen pääosapuolessa" # Shisa_principal.passwordexpire #: src/shisa.c:157 msgid "Password expire on" msgstr "Salasana vanheni pääosapuolessa" # Shisa_principal.accountexpire #: src/shisa.c:159 msgid "Account expire on" msgstr "Tili vanheni pääosapuolessa" #: src/shisa.c:172 msgid "Key" msgstr "Avain" # Shishi_cipher_name (keys[i]->etype), etype on lyhennys termistä "Encryption Type" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tSalaustyyppi" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tPrioriteetti" # keys[i]->salt, string2key()-funktion valinnainen argumentti, yleensä "principal@realm" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tSalt-argumentti" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tS2K-parametrit" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tSalasana" # Muodostaa taulukoidun lauseen (ilman välilyöntiä) seuraavan MISSING-sanan kanssa #: src/shisa.c:189 msgid "\tKey is" msgstr "\tAvain" #: src/shisa.c:189 msgid "MISSING" msgstr "PUUTTUU" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Lisätään alue â€%sâ€...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Lisätään pääosapuoli â€%s@%sâ€...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Lisätään alue â€%sâ€...valmis\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Lisätään pääosapuoli â€%s@%sâ€...valmis\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Poistetaan alue â€%sâ€...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Poistetaan pääosapuoli â€%s@%sâ€...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Poistetaan alue â€%sâ€...valmis\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Poistetaan pääosapuoli â€%s@%sâ€...valmis\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Salasana käyttäjälle â€%s@%sâ€: " #: src/shisa.c:375 msgid "Password: " msgstr "Salasana: " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Ei voi lukea salasanaa" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Ei voitu luoda avainta (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Lisätietoja komennolla â€%s --helpâ€.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Pakolliset argumentit pitkille valitsimille ovat pakollisia myös lyhyille " "valitsimille.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "liian monia argumentteja" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Alustus epäonnistui:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Ei voitu lukea kirjastovalitsimia â€%sâ€:\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Shishi-alustus epäonnistui:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Ei voitu asettaa salaustyyppiä â€%sâ€:\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "liian vähän argumentteja" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Lisätään oletusalue â€%sâ€...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Muokataan pääosapuolta â€%s@%sâ€...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Muokataan pääosapuolta â€%s@%sâ€...valmis\n" # principal@realm #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Lisätään avain pääosapuoleen â€%s@%sâ€...\n" # principal@realm #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Lisätään avain pääosapuoleen â€%s@%sâ€...valmis\n" # principal@realm #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Poistetaan avain pääosapuolesta â€%s@%sâ€...\n" # principal@realm #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Poistetaan avain pääosapuolesta â€%s@%sâ€...valmis\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "ei voi alustaa kirjastoa libshishi" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Ei voitu asettaa salaustyyppejä: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Ei voitu jäsentää asiakaspääosapuolta â€%sâ€: %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Ei voitu jäsentää palvelinpääosapuolta â€%sâ€: %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Ei voitu lukea kirjastovalitsimia: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Virheellinen --starttime -päivämäärä â€%sâ€" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Virheellinen --endtime -päivämäärä â€%sâ€" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Virheellinen --renew-till -päivämäärä â€%sâ€" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Pääsyliput oletustiedostossa â€%sâ€:\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Ei voitu luetella pääsylippuja: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Poistetaan pääsylippu:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Ei voitu tuhota pääsylippua %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "Pääsylippuja ei ole poistettu.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "%d pääsylippu poistettu.\n" msgstr[1] "%d pääsylippua poistettu.\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "ei voitu saada pääsylippua pääosapuolena â€%s†palvelimelle â€%sâ€." #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Pakolliset argumentit pitkille valitsimille ovat pakollisia myös lyhyille " "valitsimille.\n" "\n" "Ilmoita virheistä (englanniksi) osoitteeseen <%s>.\n" "Ilmoita käännösvirheistä osoitteeseen .\n" #~ msgid "Report bugs to <%s>.\n" #~ msgstr "" #~ "Ilmoita virheistä (englanniksi) osoitteeseen <%s>.\n" #~ "Ilmoita käännösvirheistä osoitteeseen .\n" #~ msgid "" #~ "Shishi command line client. If no command is given, Shishi\n" #~ "acquire or list a valid ticket for you, identified by CLIENT (if\n" #~ "empty, default username in default realm), for the service SERVER (if\n" #~ "empty, ticket granting ticket for client realm)." #~ msgstr "" #~ "Shishi-komentoriviasiakas. Jos komento annetaan, Shishi\n" #~ "hankkii tai luettelee sinulle ASIAKKAAN tunnistaman kelvollisen " #~ "pääsylipun (jos\n" #~ "tyhjä, käytetään oletuskäyttäjänimeä oletusalueessa), SERVER-palvelulle " #~ "(jos\n" #~ "tyhjä, pääsylipun-myöntämis-pääsylippu asiakasalueelle)." #~ msgid "Usage: shishi [OPTIONS]... [CLIENT [SERVER]]..." #~ msgstr "Käyttö: shishi [VALITSIMET]... [ASIAKAS [PALVELIN]]..." #~ msgid " -h, --help Print help and exit" #~ msgstr " -h, --help Tulosta opaste ja poistu" #~ msgid " -V, --version Print version and exit" #~ msgstr " -V, --version Tulosta versio ja poistu" #~ msgid "" #~ "\n" #~ "Commands:" #~ msgstr "" #~ "\n" #~ "Komennot:" #~ msgid "" #~ " -d, --destroy Destroy tickets in local cache, limited " #~ "by any \n" #~ " --client-name or --server-name. \n" #~ " (default=off)" #~ msgstr "" #~ " -d, --destroy Tuhoa pääsyliput paikallisessa " #~ "välimuistissa, valitsimen \n" #~ " --client-name tai --server-name " #~ "rajoittamana. \n" #~ " (oletus=off)" #~ msgid "" #~ " -l, --list List tickets in local cache, limited by " #~ "any \n" #~ " --client-name and --server-name. \n" #~ " (default=off)" #~ msgstr "" #~ " -l, --list Luettele pääsyliput paikallisessa " #~ "välimuistissa, valitsimen \n" #~ " --client-name ja/tai --server-name " #~ "rajoittamana. \n" #~ " (oletus=off)" #~ msgid "" #~ " -r, --renew Renew ticket. Use --server-name to " #~ "specify \n" #~ " ticket, default is the most recent " #~ "renewable \n" #~ " ticket granting ticket for the default " #~ "realm. \n" #~ " (default=off)" #~ msgstr "" #~ " -r, --renew Uudista pääsylippu. Käytä valitsinta --" #~ "server-name \n" #~ " määrittämään pääsylippu, oletus on " #~ "viimeisin uudistettava \n" #~ " pääsylipun-myöntämis-pääsylippu (TGT) " #~ "oletusalueelle. \n" #~ " (oletus=off)" #~ msgid "" #~ "\n" #~ "Flags:" #~ msgstr "" #~ "\n" #~ "Liput:" #~ msgid "" #~ " --forwardable Get a forwardable ticket, i.e., one that " #~ "can be \n" #~ " used to get forwarded tickets. " #~ "(default=off)" #~ msgstr "" #~ " --forwardable Hae eteenpäinvälitettävä pääsylippu, ts., " #~ "sellainen, joka \n" #~ " voidaan käyttää eteenpäinvälitettävien " #~ "pääsylippujen \n" #~ " hakemiseen. (oletus=off)" #~ msgid "" #~ " --forwarded Get a forwarded ticket. (default=off)" #~ msgstr "" #~ " --forwarded Hae eteenpäinvälitetty pääsylippu. " #~ "(oletus=off)" #~ msgid "" #~ " --proxiable Get a proxiable ticket, i.e., one that " #~ "can be \n" #~ " used to get proxy tickets. " #~ "(default=off)" #~ msgstr "" #~ " --proxiable Hae välityspalvelinkelpoinen pääsylippu, " #~ "ts. sellainen, \n" #~ " jota voidaan käyttää hakemaan \n" #~ " välityspalvelinpääsylippuja. " #~ "(oletus=off)" #~ msgid " --proxy Get a proxy ticket. (default=off)" #~ msgstr "" #~ " --proxy Hae välityspalvelinpääsylippu. " #~ "(oletus=off)" #~ msgid "" #~ " --renewable Get a renewable ticket. (default=off)" #~ msgstr "" #~ " --renewable Hae uusintakelpoinen pääsylippu. " #~ "(oletus=off)" #~ msgid "" #~ "\n" #~ "Options:" #~ msgstr "" #~ "\n" #~ "Valitsimet:" #~ msgid "" #~ " --client-name=NAME Client name. Default is login username." #~ msgstr "" #~ " --client-name=NIMI Asiakkaan nimi. Oletus on " #~ "kirjautumiskäyttäjänimi." #~ msgid "" #~ " -E, --encryption-type=ETYPE,[ETYPE...]\n" #~ " Encryption types to use. ETYPE is " #~ "either \n" #~ " registered name or integer. Valid " #~ "values \n" #~ " include 'aes128', 'aes256', 'aes' (same " #~ "as \n" #~ " 'aes256'), '3des', 'des-md5', 'des-" #~ "md4', \n" #~ " 'des-crc', 'des' (same as 'des-md5'), " #~ "and \n" #~ " 'arcfour'." #~ msgstr "" #~ " -E, --encryption-type=ETYPE,[ETYPE...]\n" #~ " Käytettävät salaustyypit. ETYPE on " #~ "joko \n" #~ " rekisteröity nimi tai kokonaisluku. " #~ "Kelvollisiin \n" #~ " arvoihin sisältyvät ’aes128’, ’aes256’, " #~ "’aes’ \n" #~ " (sama kuin ’aes256’), ’3des’, ’des-" #~ "md5’, ’des-md4’, \n" #~ " ’des-crc’, ’des’ (sama kuin ’des-md5’), " #~ "ja \n" #~ " ’arcfour’." #~ msgid "" #~ " -e, --endtime=STRING Specify when ticket validity should " #~ "expire. \n" #~ " The time syntax may be relative (to the " #~ "start \n" #~ " time), such as '20 hours', or absolute, " #~ "such \n" #~ " as '2001-02-03 04:05:06 CET'. The " #~ "default is \n" #~ " 8 hours after the start time." #~ msgstr "" #~ " -e, --endtime=MERKKIJONO Määrittää, milloin pääsylippuen " #~ "kelpoisuusaika vanhenee. \n" #~ " Aikasyntaksi saattaa olla suhteellinen " #~ "(aloitusajasta), \n" #~ " sellaisia kuin ’20 hours’, tai " #~ "absoluuttinen, sellaisia \n" #~ " kuin ’2001-02-03 04:05:06 CET’. Oletus " #~ "on \n" #~ " 8 tuntia aloitusajan jälkeen." #~ msgid " --realm=STRING Set default realm." #~ msgstr " --realm=MERKKIJONO Aseta oletusalue." #~ msgid "" #~ " --renew-till=STRING Specify renewable life of ticket. " #~ "Implies \n" #~ " --renewable. Accepts same time syntax " #~ "as \n" #~ " --endtime. If --renewable is " #~ "specified, the \n" #~ " default is 1 week after the start time." #~ msgstr "" #~ " --renew-till=MERKKIJONO Määritä pääsylipun eliniän uusittavuus. " #~ "Käyttää \n" #~ " valitsinta --renewable. Hyväksyy saman " #~ "aikasyntaksin \n" #~ " kuin valitsin --endtime. Jos valitsin " #~ "--renewable on \n" #~ " määritelty, oletus on 1 viikko " #~ "aloitusajan jälkeen." #~ msgid "" #~ " --server-name=NAME Server name. Default is 'krbtgt/REALM' " #~ "where \n" #~ " REALM is client realm." #~ msgstr "" #~ " --server-name=NIMI Palvelinnimi. Oletus on ’krbtgt/REALM’ " #~ "missä \n" #~ " REALM on asiakkaan alue." #~ msgid "" #~ " -s, --starttime=STRING Specify when ticket should start to be " #~ "valid. \n" #~ " Accepts same time syntax as --endtime. " #~ "The \n" #~ " default is to become valid immediately." #~ msgstr "" #~ " -s, --starttime=MERKKIJONO Määrittää milloin pääsylipun kelpoisuus " #~ "alkaa. \n" #~ " Hyväksyy saman aikasyntaksin kuin " #~ "valitsin --endtime. \n" #~ " Oletus on, että tulee kelvolliseksi " #~ "välittömästi." #~ msgid "" #~ " --ticket-granter=NAME Service name in ticket to use for \n" #~ " authenticating request. Only for TGS. \n" #~ " Defaults to 'krbtgt/REALM@REALM' where " #~ "REALM \n" #~ " is client realm." #~ msgstr "" #~ " --ticket-granter=NIMI Palvelunimi pääsylipussa käytettäväksi \n" #~ " todennuspyynnölle. Ainoastaan TGS:" #~ "lle. \n" #~ " Oletus on ’krbtgt/REALM@REALM’ missä " #~ "REALM \n" #~ " on asiakkaan alue." #~ msgid "" #~ "\n" #~ "Other options:" #~ msgstr "" #~ "\n" #~ "Muut valitsimet:" #~ msgid " --configuration-file=FILE Read user configuration from FILE." #~ msgstr "" #~ " --configuration-file=FILE Lue käyttäjäasetukset tiedostosta FILE." #~ msgid " -c, --ticket-file=FILE Read tickets from FILE." #~ msgstr " -c, --ticket-file=TIEDOSTO Lue pääsyliput TIEDOSTOsta." #~ msgid "" #~ " -o, --library-options=STRING Parse STRING as a configuration file " #~ "statement." #~ msgstr "" #~ " -o, --library-options=STRING Jäsennä STRING-merkkijono " #~ "asetustiedostokäskynä." #~ msgid "" #~ " -q, --quiet Don't produce any diagnostic output.\n" #~ " (default=off)" #~ msgstr "" #~ " -q, --quiet Älä tuota mitään diagnostoivaa " #~ "tulostetta.\n" #~ " (oletus=off)" #~ msgid "" #~ " --system-configuration-file=FILE\n" #~ " Read system configuration from FILE." #~ msgstr "" #~ " --system-configuration-file=TIEDOSTO\n" #~ " Lue järjestelmäasetukset TIEDOSTOsta." #~ msgid "" #~ " --ticket-write-file=FILE Write tickets from FILE. Default is to " #~ "write \n" #~ " them back to where they were read from." #~ msgstr "" #~ " --ticket-write-file=FILE Kirjoita pääsyliput tiedostosta FILE. " #~ "Oletus \n" #~ " on kirjoittaa ne takaisin sinne mistä " #~ "ne luettiin." #~ msgid "" #~ " -v, --verbose Produce verbose output.\n" #~ " Use multiple times to increase amount " #~ "of \n" #~ " information." #~ msgstr "" #~ " -v, --verbose Tuota lavea tuloste.\n" #~ " Käytä useita kertoja tietojen määrän \n" #~ " kasvattamiseen." shishi-1.0.2/po/pl.po0000644000000000000000000006022512126773035011274 00000000000000# Polish translation for shishi. # Copyright (C) 2004, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the shishi package. # Jakub Bogusz , 2004-2010. # msgid "" msgstr "" "Project-Id-Version: shishi 1.0.0\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2010-09-01 07:12+0200\n" "Last-Translator: Jakub Bogusz \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Sukces Shishi" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "B³±d w funkcji ASN.1 (uszkodzone dane?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Nie uda³o siê otworzyæ pliku" #: lib/error.c:39 msgid "File input/output error" msgstr "B³±d wej¶cia/wyj¶cia pliku" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "B³±d przydzielania pamiêci w bibliotece shishi." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "Kodowanie lub dekodowanie base64 nie powiod³o siê. Uszkodzone dane?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Warto¶æ dziedziny klienta ró¿ni siê miêdzy ¿±daniem a odpowiedzi±." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "Warto¶æ nazwy klienta ró¿ni siê miêdzy ¿±daniem a odpowiedzi±." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "" "Warto¶æ zabezpieczenia odtworzenia (nonce) ró¿ni siê miêdzy ¿±daniem a " "odpowiedzi±." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Niskopoziomowa operacja kryptograficzna nie powiod³a siê. Zwykle oznacza to " "z³e has³o lub uszkodzenie danych." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "B³±d wewnêtrzny w niskopoziomowych funkcjach kryptograficznych." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "Wywo³anie systemowe socket() nie powiod³o siê. Zwykle oznacza to, ¿e system " "nie obs³uguje danego rodzaju gniazdo." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "Wywo³anie systemowe bind() nie powiod³o siê. Zwykle oznacza to " "niewystarczaj±ce uprawnienia." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "Wywo³anie systemowe sendto() nie powiod³o siê." #: lib/error.c:80 msgid "Error receiving data from server" msgstr "B³±d podczas odbierania danych z serwera" #: lib/error.c:82 msgid "The system call close() failed." msgstr "Wywo³anie systemowe close() nie powiod³o siê." #: lib/error.c:84 #, fuzzy msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "Up³yn±³ limit czasu przy komunikacji z KDC. Zwykle oznacza to problem z " "sieci± lub adresem KDC." #: lib/error.c:87 #, fuzzy msgid "No KDC known for given realm." msgstr "Nie ma znanego KDC dla tej dziedziny." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 #, fuzzy msgid "Server replied to the request with an error message." msgstr "Serwer odpowiedzia³ komunikatem b³êdu na ¿±danie." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 #, fuzzy msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Zbiór biletów nie zainicjowany. Zwykle oznacza to b³±d wewnêtrzny aplikacji." #: lib/error.c:98 #, fuzzy msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Rodzaj klucza u¿yty do zaszyfrowania biletu nie pasuje do dostarczonego " "klucza. Zwykle oznacza to b³±d wewnêtrzny aplikacji." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Nie uda³o siê odszyfrowaæ AP-REQ przy u¿yciu dostarczonego klucza. Zwykle " "oznacza to b³±d wewnêtrzny aplikacji." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Nie uda³o siê odszyfrowaæ biletu przy u¿yciu dostarczonego klucza. Zwykle " "oznacza to b³±d wewnêtrzny aplikacji." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Nie uda³o siê przeanalizowaæ pliku keytab" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Nie uda³o siê przeanalizowaæ pliku cache'a danych uwierzytelniaj±cych" #: lib/error.c:165 msgid "Unknown error" msgstr "Nieznany b³±d" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "Brak b³êdu" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: info: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: info: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: uwaga: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: uwaga: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Zapisywanie KRB-ERROR do %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Zapisywanie KRB-ERROR w formacie %s...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Zapisywanie KRB-ERROR do %s... zakoñczone\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Odczytywanie KRB-ERROR z %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Odczytywanie KRB-ERROR w formacie %s...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Odczytywanie KRB-ERROR z %s... zakoñczone\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "Wpis klienta w bazie danych wygas³" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "Wpis serwera w bazie danych wygas³" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "¯±dana wersja protoko³u nie jest obs³ugiwana" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Klucz klienta zaszyfrowany w starym kluczu g³ównym" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Klucz serwera zaszyfrowany w starym kluczu g³ównym" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Nie znaleziono klienta w bazie danych" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Nie znaleziono serwera w bazie danych" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Wiele wpisów zarz±dcy w bazie danych" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "Klient lub serwer ma pusty klucz" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Bilet nie nadaje siê do postdatowania" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "¯±dany czas pocz±tkowy jest pó¼niejszy ni¿ koñcowy" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "¯±danie odrzucone przez politykê KDC" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "KDC nie zgadza siê na ¿±dan± opcjê" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "KDC nie obs³uguje tego rodzaju szyfru" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "KDC nie obs³uguje tego rodzaju sumy kontrolnej" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "KDC nie obs³uguje tego rodzaju padata" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC nie obs³uguje tego rodzaju transmisji" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "Dane uwierzytelniej±ce klientów zosta³y anulowane" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "Dane uwierzytelniaj±ce dla serwera zosta³y anulowane" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "TGT zosta³o anulowane" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Klient jeszcze nie jest wa¿ny - proszê spróbowaæ pó¼niej" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Serwer jeszcze nie jest wa¿ny - proszê spróbowaæ pó¼niej" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Has³o wygas³o" #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "Informacje wczesnego uwierzytelnienia by³y nieprawid³owe" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Wymagane dodatkowe wczesne uwierzytelnienie" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "¯±dany serwer i bilet nie zgadzaj± siê" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Zarz±dca serwera wa¿ny tylko dla user2user" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "Polityka KDC odrzuca ¶cie¿kê tranzytow±" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "Us³uga niedostêpna" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "Kontrola poprawno¶ci odszyfrowanego pola nie powiod³a siê" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Bilet wygas³" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Bilet jeszcze niewa¿ny" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "¯±danie jest powtórk±" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "Bilet nie jest dla nas" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Bilet i uwierzytelnienie nie zgadzaj± siê" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Zbyt du¿e przesuniêcie zegara" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Niepoprawny adres sieci" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "Niezgodno¶æ wersji protoko³u" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Nieprawid³owy rodzaj komunikatu" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Zmodyfikowany strumieñ komunikatu" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Komunikat spoza kolejno¶ci" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "Podana wersja klucza nie jest dostêpna" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Klucz us³ugi niedostêpny" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "Wzajemne uwierzytelnienie nie powiod³o siê" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Niepoprawny kierunek komunikatu" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Wymagana alternatywna metoda uwierzytelnienia" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Niepoprawny numer sekwencji w komunikacie" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Niew³a¶ciwy rodzaj sumy kontrolnej w komunikacie" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "Polityka odrzuca ¶cie¿kê tranzytow±" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Odpowied¼ zbyt du¿a dla UDP, proszê spróbowaæ TCP" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "B³±d ogólny (opis w e-tek¶cie)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Pole zbyt d³ugie dla tej implementacji" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(user-to-user)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Nieznany kod b³êdu KRB-ERROR %d." #: db/err.c:33 msgid "Shisa success" msgstr "Sukces Shisy" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Nie uda³o siê zainicjowaæ Shisy." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "Plik konfiguracyjny Shisy nie istnieje." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "B³±d we/wy pliku dla pliku konfiguracyjnego Shisy." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "B³±d sk³adni w tokenie konfiguracyjnym Shisy." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "Nie mo¿na otworzyæ bazy danych Shisy." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "B³±d w numeracji dziedzin w bazie danych." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "B³±d w numeracji zarz±dców w bazie danych." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "B³±d w numeracji kluczy w bazie danych." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Podana dziedzina nie istnieje." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "Podany zarz±dca nie istnieje." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Zarz±dca nie jest zwi±zany z ¿adnym pasuj±cym kluczem." #: db/err.c:57 msgid "Error finding principal." msgstr "B³±d przy szukaniu zarz±dcy." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Próbowano dodaæ ju¿ istniej±c± dziedzinê." #: db/err.c:61 msgid "Error adding realm to database." msgstr "B³±d przy dodawaniu dziedziny do bazy danych." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Próbowano usun±æ niepust± dziedzinê." #: db/err.c:65 msgid "Error removing realm from database." msgstr "B³±d przy usuwaniu dziedziny z bazy danych." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Próbowano dodaæ ju¿ istniej±cego zarz±dcê." #: db/err.c:69 msgid "Error adding principal to database." msgstr "B³±d przy dodawaniu zarz±dcy do bazy danych." #: db/err.c:71 msgid "Error removing principal from database." msgstr "B³±d przy usuwaniu zarz±dcy z bazy danych." #: db/err.c:73 msgid "Error adding key to principal." msgstr "B³±d przy dodawaniu klucza do zarz±dcy." #: db/err.c:75 msgid "Error removing key from principal." msgstr "B³±d przy usuwaniu klucza z zarz±dcy." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "Wiêcej ni¿ jeden klucz pasuje do podanego kryterium wyszukiwania." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Nieznany b³±d Shisy" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Konto jest" #: src/shisa.c:144 msgid "DISABLED" msgstr "WY£¡CZONE" #: src/shisa.c:144 msgid "enabled" msgstr "w³±czone" #: src/shisa.c:145 msgid "Current key version" msgstr "Bie¿±ca wersja klucza" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Konto niewa¿ne przed" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Ostatnie pocz±tkowe ¿±danie TGT" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Ostatnie pocz±tkowe ¿±danie" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Ostatnie ¿±danie TGT" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Ostatnie odnowienie biletu" #: src/shisa.c:157 msgid "Password expire on" msgstr "Has³o wygasa" #: src/shisa.c:159 msgid "Account expire on" msgstr "Konto wygasa" #: src/shisa.c:172 msgid "Key" msgstr "Klucz" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tEtype" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tPriorytet" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tZarodek" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tParametry S2K" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tHas³o" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tKlucz jest" #: src/shisa.c:189 msgid "MISSING" msgstr "BRAKUJ¡CY" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Dodawanie dziedziny `%s'...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Dodawanie zarz±dcy `%s@%s'...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Dodawanie dziedziny `%s'... zakoñczone\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Dodawanie zarz±dcy `%s@%s'... zakoñczone\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Usuwanie dziedziny `%s'...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Usuwanie zarz±dcy `%s@%s'...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Usuwanie dziedziny `%s'... zakoñczone\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Usuwanie zarz±dcy `%s@%s'... zakoñczone\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Has³o dla `%s@%s': " #: src/shisa.c:375 msgid "Password: " msgstr "Has³o: " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Nie uda³o siê odczytaæ has³a" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Nie uda³o siê utworzyæ klucza (%d):\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "`%s --help' poda wiêcej informacji.\n" #: src/shisa.c:428 src/shishi.c:64 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Argumenty obowi±zkowe dla opcji d³ugich s± obowi±zkowe tak¿e dla opcji " "krótkich.\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "zbyt wiele argumentów" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "Inicjalizacja nie powiod³a siê:\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Nie uda³o siê odczytaæ opcji biblioteki `%s':\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "Inicjalizacja Shishi nie powiod³a siê:\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Nie uda³o siê ustawiæ rodzaju szyfrowania `%s':\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "zbyt ma³o argumentów" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Dodawanie domy¶lnej dziedziny `%s'...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Modyfikowanie zarz±dcy `%s@%s'...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Modyfikowanie zarz±dcy `%s@%s'... zakoñczone\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Dodawanie klucza do `%s@%s'...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Dodawanie klucza do `%s@%s'... zakoñczone\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Usuwanie klucza z `%s@%s'...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Usuwanie klucza z `%s@%s'... zakoñczone\n" #: src/shishi.c:111 #, c-format msgid "cannot initialize libshishi" msgstr "nie mo¿na zainicjowaæ libshishi" #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Nie uda³o siê ustawiæ rodzajów szyfrowania: %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Nie uda³o siê przeanalizowaæ zarz±dcy klienta \"%s\": %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Nie uda³o siê przeanalizowaæ zarz±dcy serwera \"%s\": %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Nie uda³o siê odczytaæ opcji biblioteki: %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Nieprawid³owa data --starttime `%s'" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Nieprawid³owa data --endtime `%s'" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Nieprawid³owa data --renew-till `%s'" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Bilety w `%s':\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Nie uda³o siê wylistowaæ biletów: %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Usuwanie biletu:\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Nie uda³o siê zniszczyæ biletu %d:\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "Nie usuniêto ¿adnego biletu.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "Usuniêto %d bilet.\n" msgstr[1] "Usuniêto %d bilety.\n" msgstr[2] "Usuniêto %d biletów.\n" #: src/shishi.c:277 #, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "nie uda³o siê pobraæ biletu jako `%s' dla `%s'" #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Argumenty obowi±zkowe dla opcji d³ugich s± obowi±zkowe tak¿e dla opcji " "krótkich.\n" "\n" "Prosimy zg³aszaæ b³êdy na adres <%s>.\n" "B³êdy w t³umaczeniu prosimy zg³aszaæ na adres .\n" shishi-1.0.2/po/Makevars0000664000000000000000000000342212015626624012011 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Simon Josefsson # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = bug-shishi@gnu.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = shishi-1.0.2/po/en@boldquot.header0000644000000000000000000000247112126772677013761 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # shishi-1.0.2/po/quot.sed0000644000000000000000000000023112126772677012010 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g shishi-1.0.2/po/fr.po0000644000000000000000000006150512126773035011272 00000000000000# French translations for shishi package. # Copyright (C) 2006 Free Software Foundation, Inc. # This file is distributed under the same license as the shishi package. # Daniel Dehennin , 2006. # msgid "" msgstr "" "Project-Id-Version: shishi 0.0.30\n" "Report-Msgid-Bugs-To: bug-shishi@gnu.org\n" "POT-Creation-Date: 2013-04-03 11:27+0200\n" "PO-Revision-Date: 2007-06-08 16:27+0200\n" "Last-Translator: Daniel Dehennin \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: lib/error.c:33 msgid "Shishi success" msgstr "Shishi a réussi" #: lib/error.c:35 msgid "Error in ASN.1 function (corrupt data?)" msgstr "Erreur dans la fonction ASN.1 (donnée corrompue ?)" #: lib/error.c:37 msgid "Could not open file" msgstr "Ne peut pas ouvrir le fichier" #: lib/error.c:39 msgid "File input/output error" msgstr "Erreur d'entrée/sortie sur le fichier" #: lib/error.c:41 msgid "Memory allocation error in shishi library." msgstr "Erreur d'allocation mémoire dans la bibliothèque shishi." #: lib/error.c:43 msgid "Base64 encoding or decoding failed. Data corrupt?" msgstr "L'encodage ou le décodage en base64 a échoué. Donnée corrompue ?" #: lib/error.c:45 msgid "Client realm value differ between request and reply." msgstr "Le domaine du client diffère entre la requète et la réponse." #: lib/error.c:47 msgid "Client name value differ between request and reply." msgstr "La valeur du nom du client diffère entre la requète et la réponse." #: lib/error.c:49 msgid "Replay protection value (nonce) differ between request and reply." msgstr "" "La valeur de protection contre le rejeu (nonce) diffère entre la requète et " "la réponse." #: lib/error.c:51 msgid "Incorrect key type used in TGS reply." msgstr "" #: lib/error.c:53 msgid "Incorrect key type used in reply from KDC." msgstr "" #: lib/error.c:55 msgid "Incorrect key type used in AP reply." msgstr "" #: lib/error.c:57 msgid "Failed verification of AP reply." msgstr "" #: lib/error.c:59 msgid "Incorrect key type used in AP request." msgstr "" #: lib/error.c:61 msgid "Provided buffer was too small." msgstr "" #: lib/error.c:63 msgid "Derived key material is too short to be applicable." msgstr "" #: lib/error.c:65 msgid "The key is too large to be usable." msgstr "" #: lib/error.c:67 msgid "" "Low-level cryptographic primitive failed. This usually indicates bad " "password or data corruption." msgstr "" "Échec de la primitive cryptographique de bas-niveau. Cela révèle " "généralement un mauvais mot de passe ou une donnée corrompue." #: lib/error.c:70 msgid "Internal error in low-level crypto routines." msgstr "Erreur interne dans les routines cryptographiques de bas-niveau." #: lib/error.c:72 msgid "" "The system call socket() failed. This usually indicates that your system " "does not support the socket type." msgstr "" "L'appel système socket() a échoué. Cela révèle généralement le non support " "du type de socket par votre système." #: lib/error.c:75 msgid "" "The system call bind() failed. This usually indicates insufficient " "permissions." msgstr "" "L'appel système bind() a échoué. Cela révèle généralement des droits " "insuffisants." #: lib/error.c:78 msgid "The system call sendto() failed." msgstr "L'appel système sendto() a échoué." #: lib/error.c:80 #, fuzzy msgid "Error receiving data from server" msgstr "Erreur lors de la suppression du domaine de la base de données." #: lib/error.c:82 msgid "The system call close() failed." msgstr "L'appel système close() a échoué." #: lib/error.c:84 #, fuzzy msgid "" "Timed out talking to KDC. This usually indicates a network or KDC address " "problem." msgstr "" "Délais d'attente de la demande dépassé lors de la communication avec le KDC. " "Cela révèle généralement un problème de réseau ou d'adresse de KDC." #: lib/error.c:87 #, fuzzy msgid "No KDC known for given realm." msgstr "Auncun KDC pour le domaine n'est connu." #: lib/error.c:89 msgid "No TTY assigned to process." msgstr "" #: lib/error.c:91 #, fuzzy msgid "Server replied to the request with an error message." msgstr "Le serveur a répondu avec un message d'erreur à la requète." #: lib/error.c:93 msgid "Failure to use handle. Missing handle, or misconfigured." msgstr "" #: lib/error.c:95 #, fuzzy msgid "" "Ticket set not initialized. This usually indicates an internal application " "error." msgstr "" "Le cache de ticket n'est pas initialisé. Cela révèle généralement une erreur " "interne de l'application." #: lib/error.c:98 #, fuzzy msgid "" "Key type used to encrypt ticket doesn't match provided key. This usually " "indicates an internal application error." msgstr "" "Le type de clef utilisée pour chiffrer le ticket ne correspond pas à la clef " "fournie. Cela révèle généralement une erreur interne de l'application." #: lib/error.c:101 msgid "Reference to invalid encryption key." msgstr "" #: lib/error.c:103 msgid "" "Could not decrypt AP-REQ using provided key. This usually indicates an " "internal application error." msgstr "" "Ne peut pas déchiffrer AP-REQ avec la clef fournie. Cela révèle généralement " "une erreur interne de l'application." #: lib/error.c:106 msgid "" "Could not decrypt Ticket using provided key. This usually indicates an " "internal application error." msgstr "" "Ne peut déchiffrer le Ticket avec la clef fournie. Cela révèle généralement " "une erreur interne de l'application." #: lib/error.c:109 msgid "Invalid ticked passed in call." msgstr "" #: lib/error.c:111 msgid "Argument lies outside of valid range." msgstr "" #: lib/error.c:113 msgid "The ASN.1 structure does not contain the indicated element." msgstr "" #: lib/error.c:115 msgid "Attempted access to non-existent key type." msgstr "" #: lib/error.c:117 lib/error.c:135 msgid "Verification failed on either side." msgstr "" #: lib/error.c:119 msgid "Invalid PKCS5 descriptor." msgstr "" #: lib/error.c:121 msgid "Invalid claim of iteration count in PKCS5 descriptor." msgstr "" #: lib/error.c:123 msgid "Derived key length is incorrect for PKCS5 descriptor." msgstr "" #: lib/error.c:125 msgid "Derived key is too long for PKCS5 descriptor." msgstr "" #: lib/error.c:127 msgid "Principal name syntax error." msgstr "" #: lib/error.c:129 msgid "Invalid argument passed in call. Wrong or unknown value." msgstr "" #: lib/error.c:131 msgid "The indicated ASN.1 element does not carry a value." msgstr "" #: lib/error.c:133 msgid "Connection attempt failed. Try again, or check availability." msgstr "" #: lib/error.c:137 msgid "The private key uses an incompatible encryption type." msgstr "" #: lib/error.c:139 msgid "The desired file could not be accessed. Check permissions." msgstr "" #: lib/error.c:141 msgid "The present AP reply specifies an inpermissible key type." msgstr "" #: lib/error.c:143 msgid "" "A request for present time of day has failed. This is usually internal, but " "a valid time is imperative for us." msgstr "" #: lib/error.c:146 msgid "Failed to parse keytab file" msgstr "Échec de lecture du fichier keytab" #: lib/error.c:148 msgid "Failed to parse credential cache file" msgstr "Échec de lecture du ficher de cache des mots de passe" #: lib/error.c:165 msgid "Unknown error" msgstr "Erreur inconnue" #: lib/error.c:196 lib/krberror.c:1259 msgid "No error" msgstr "Pas d'erreur" #: lib/error.c:326 #, c-format msgid "libshishi: info: %s" msgstr "libshishi: info: %s" #: lib/error.c:330 #, c-format msgid "libshishi: info: %s\n" msgstr "libshishi: info: %s\n" #: lib/error.c:364 #, c-format msgid "libshishi: warning: %s" msgstr "libshishi: attention: %s" #: lib/error.c:368 #, c-format msgid "libshishi: warning: %s\n" msgstr "libshishi: attention: %s\n" #: lib/krberror.c:137 #, c-format msgid "Writing KRB-ERROR to %s...\n" msgstr "Écriture de KRB-ERROR sur %s...\n" #: lib/krberror.c:144 #, c-format msgid "Writing KRB-ERROR in %s format...\n" msgstr "Écriture de KRB-ERROR dans le format %s...\n" #: lib/krberror.c:159 #, c-format msgid "Writing KRB-ERROR to %s...done\n" msgstr "Écriture de KRB-ERROR sur %s... ok\n" #: lib/krberror.c:217 #, c-format msgid "Reading KRB-ERROR from %s...\n" msgstr "Lecture de KRB-ERROR depuis %s...\n" #: lib/krberror.c:224 #, c-format msgid "Reading KRB-ERROR in %s format...\n" msgstr "Lecture de KRB-ERROR dans le format %s...\n" #: lib/krberror.c:239 #, c-format msgid "Reading KRB-ERROR from %s...done\n" msgstr "Lecture de KRB-ERROR depuis %s... ok\n" #: lib/krberror.c:1261 msgid "Client's entry in database has expired" msgstr "L'entrée du client dans la base de donnée a expirée" #: lib/krberror.c:1263 msgid "Server's entry in database has expired" msgstr "L'entrée du serveur dans la base de donnée a expirée" #: lib/krberror.c:1265 msgid "Requested protocol version number not supported" msgstr "La version de protocole demandée n'est pas supportée" #: lib/krberror.c:1267 msgid "Client's key encrypted in old master key" msgstr "Clef du client chiffrée avec l'ancienne clef maître" #: lib/krberror.c:1269 msgid "Server's key encrypted in old master key" msgstr "Clef du serveur chiffrée avec l'ancienne clef maître" #: lib/krberror.c:1271 msgid "Client not found in database" msgstr "Client non trouvé dans la base de données" #: lib/krberror.c:1273 msgid "Server not found in database" msgstr "Serveur non trouvé dans la base de données" #: lib/krberror.c:1275 msgid "Multiple principal entries in database" msgstr "Multiple entrées de principal dans la base de données" #: lib/krberror.c:1277 msgid "The client or server has a null key" msgstr "Le client ou le serveur a une clef nulle" #: lib/krberror.c:1279 msgid "Ticket not eligible for postdating" msgstr "Le ticket n'est pas éligible pour le post-datage" #: lib/krberror.c:1281 msgid "Requested start time is later than end time" msgstr "La date de départ demandée est postérieure à la date de fin" #: lib/krberror.c:1283 msgid "KDC policy rejects request" msgstr "La politique du KDC rejecte la requète" #: lib/krberror.c:1285 msgid "KDC cannot accommodate requested option" msgstr "Le KDC ne peut pas adapter l'option demandée" #: lib/krberror.c:1287 msgid "KDC has no support for encryption type" msgstr "Le KDC ne supporte pas le type de chiffrement" #: lib/krberror.c:1289 msgid "KDC has no support for checksum type" msgstr "Le KDC ne supporte pas le type de somme de contôle" #: lib/krberror.c:1291 msgid "KDC has no support for padata type" msgstr "Le KDC ne supporte pas le type padata" #: lib/krberror.c:1293 msgid "KDC has no support for transited type" msgstr "KDC ne supporte pas le type transité" #: lib/krberror.c:1295 msgid "Clients credentials have been revoked" msgstr "L'information d'authentification du client a été révoquée" #: lib/krberror.c:1297 msgid "Credentials for server have been revoked" msgstr "L'information d'authentification pour le serveur a été révoquée" #: lib/krberror.c:1299 msgid "TGT has been revoked" msgstr "Le TGT a été révoqué" #: lib/krberror.c:1301 msgid "Client not yet valid - try again later" msgstr "Client encore invalide - essayez plus tard" #: lib/krberror.c:1303 msgid "Server not yet valid - try again later" msgstr "Serveur encore invalide - essayez plus tard" #: lib/krberror.c:1305 msgid "Password has expired " msgstr "Le mot de passe a expiré" #: lib/krberror.c:1307 msgid "Pre-authentication information was invalid" msgstr "L'information de pré-authentification était invalide" #: lib/krberror.c:1309 msgid "Additional pre-authentication required" msgstr "Pre-authentification supplémentaire requise" #: lib/krberror.c:1311 msgid "Requested server and ticket don't match" msgstr "Le serveur et le ticket demandés ne correspondent pas" #: lib/krberror.c:1313 msgid "Server principal valid for user2user only" msgstr "Identificant du serveur valide uniquement d'utilisateur à utilisateur" #: lib/krberror.c:1315 msgid "KDC Policy rejects transited path" msgstr "La politique du KDC rejette les chemins transités" #: lib/krberror.c:1317 msgid "A service is not available" msgstr "Un service n'est pas disponible" #: lib/krberror.c:1319 msgid "Integrity check on decrypted field failed" msgstr "La vérification de l'intégrité d'un champ déchiffré a échouée" #: lib/krberror.c:1321 msgid "Ticket expired" msgstr "Le ticket a expiré" #: lib/krberror.c:1323 msgid "Ticket not yet valid" msgstr "Le ticket n'est pas encore valide" #: lib/krberror.c:1325 msgid "Request is a replay" msgstr "La requète est un rejeu" #: lib/krberror.c:1327 msgid "The ticket isn't for us" msgstr "Le ticket n'est pas pour nous" #: lib/krberror.c:1329 msgid "Ticket and authenticator don't match" msgstr "Le ticket et l'authentifiant ne correspondent pas" #: lib/krberror.c:1331 msgid "Clock skew too great" msgstr "Le décalage d'horloge est trop grand" #: lib/krberror.c:1333 msgid "Incorrect net address" msgstr "Adresse réseau incorrecte" #: lib/krberror.c:1335 msgid "Protocol version mismatch" msgstr "La version de protocole ne correspond pas" #: lib/krberror.c:1337 msgid "Invalid msg type" msgstr "Type de message invalide" #: lib/krberror.c:1339 msgid "Message stream modified" msgstr "Flux du message modifié" #: lib/krberror.c:1341 msgid "Message out of order" msgstr "Message hors service" #: lib/krberror.c:1343 msgid "Specified version of key is not available" msgstr "La version de clef spécifiée est indisponible" #: lib/krberror.c:1345 msgid "Service key not available" msgstr "Le service de clef n'est pas disponible" #: lib/krberror.c:1347 msgid "Mutual authentication failed" msgstr "L'authentification mutuelle a échoué" #: lib/krberror.c:1349 msgid "Incorrect message direction" msgstr "Direction de message incorrecte" #: lib/krberror.c:1351 msgid "Alternative authentication method required" msgstr "Méthode d'authentification alternative requise" #: lib/krberror.c:1353 msgid "Incorrect sequence number in message" msgstr "Numéro de séquence incorrect dans le message" #: lib/krberror.c:1355 msgid "Inappropriate type of checksum in message" msgstr "Type de somme de contrôle inapproprié dans le message" #: lib/krberror.c:1357 msgid "Policy rejects transited path" msgstr "La politique rejette les chemins transités" #: lib/krberror.c:1359 msgid "Response too big for UDP, retry with TCP" msgstr "Réponse trop grande pour UDP, réessayez avec TCP" #: lib/krberror.c:1361 msgid "Generic error (description in e-text)" msgstr "Erreur générique (description dans e-text)" #: lib/krberror.c:1363 msgid "Field is too long for this implementation" msgstr "Le champ est trop long pour cette implémentation" #: lib/krberror.c:1365 lib/krberror.c:1367 lib/krberror.c:1369 #: lib/krberror.c:1371 lib/krberror.c:1373 lib/krberror.c:1381 #: lib/krberror.c:1383 lib/krberror.c:1385 lib/krberror.c:1387 #: lib/krberror.c:1389 lib/krberror.c:1391 lib/krberror.c:1393 msgid "(pkinit)" msgstr "(pkinit)" #: lib/krberror.c:1375 lib/krberror.c:1377 lib/krberror.c:1379 msgid "(user-to-user)" msgstr "(utilisateur-à-utilisateur)" #: lib/krberror.c:1420 #, c-format msgid "Unknown KRB-ERROR error code %d." msgstr "Code d'erreur KRB-ERROR inconnu %d." #: db/err.c:33 msgid "Shisa success" msgstr "Shisa a réussi" #: db/err.c:35 msgid "Shisa could not be initialized." msgstr "Shisa n'a pas pu être initialisé." #: db/err.c:37 msgid "The Shisa configuration file does not exist." msgstr "Le fichier de configuration de Shisa n'existe pas." #: db/err.c:39 msgid "File I/O error for Shisa configuration file." msgstr "Erreur d'entrée/sortie sur le fichier de configuration de Shisa." #: db/err.c:41 msgid "Syntax error in Shisa configuration token." msgstr "Erreur de syntaxe dans le paramètre de configuration de Shisa." #: db/err.c:43 msgid "Shisa database could not be opened." msgstr "La base de données Shisa n'a pas pu être ouverte." #: db/err.c:45 msgid "Error enumerating realms in database." msgstr "Erreur lors de l'énumération des domaines dans la base de données." #: db/err.c:47 msgid "Error enumerating principals in database." msgstr "Erreur lors de l'énumération des identifiants dans la base de données." #: db/err.c:49 msgid "Error enumerating keys in database." msgstr "Erreur lors de l'énumération des clefs dans la base de données." #: db/err.c:51 msgid "Supplied realm does not exist." msgstr "Le domaine fourni n'existe pas." #: db/err.c:53 msgid "Supplied principal does not exist." msgstr "L'identifiant fourni n'existe pas." #: db/err.c:55 msgid "Principal is not associated with any matching key." msgstr "Le principal n'est associé avec aucune clef correspondante." #: db/err.c:57 msgid "Error finding principal." msgstr "Erreur pour trouver l'identifiant." #: db/err.c:59 msgid "Tried to add a realm that already exist." msgstr "Essai d'ajout d'un domaine déjà existant." #: db/err.c:61 msgid "Error adding realm to database." msgstr "Erreur lors de l'ajout du domaine dans la base de données." #: db/err.c:63 msgid "Tried to remove a non-empty realm." msgstr "Essai de suppression de domaine non vide." #: db/err.c:65 msgid "Error removing realm from database." msgstr "Erreur lors de la suppression du domaine de la base de données." #: db/err.c:67 msgid "Tried to add a principal that already exist." msgstr "Essai d'ajout d'un identifiant déjà existant." #: db/err.c:69 msgid "Error adding principal to database." msgstr "Erreur lors de l'ajout de l'identifiant dans la base de données." #: db/err.c:71 msgid "Error removing principal from database." msgstr "Erreur lors de la suppression de l'identifiant de la base de données." #: db/err.c:73 msgid "Error adding key to principal." msgstr "Erreur lors de l'ajout de la clef à l'identifiant." #: db/err.c:75 msgid "Error removing key from principal." msgstr "Erreur lors de la suppression de la clef de l'identifiant." #: db/err.c:77 msgid "More than one key match given search criteria." msgstr "Plus d'une clef correspondent aux critères de recherche." #: db/err.c:98 msgid "Unknown Shisa error" msgstr "Erreur de Shisa inconnue" #: db/err.c:118 #, c-format msgid "shisa: %s\n" msgstr "shisa: %s\n" #: src/shisa.c:143 msgid "Account is" msgstr "Le compte est" #: src/shisa.c:144 msgid "DISABLED" msgstr "DÉSACTIVÉ" #: src/shisa.c:144 msgid "enabled" msgstr "activé" #: src/shisa.c:145 msgid "Current key version" msgstr "Version actuelle de clef" #: src/shisa.c:147 msgid "Account not valid before" msgstr "Compte invalide avant" #: src/shisa.c:149 msgid "Last initial TGT request at" msgstr "Dernière requète initiale TGT à" #: src/shisa.c:151 msgid "Last initial request at" msgstr "Dernière requète initiale à" #: src/shisa.c:153 msgid "Last TGT request at" msgstr "Dernière requète TGT à" #: src/shisa.c:155 msgid "Last ticket renewal at" msgstr "Dernier renouvellement de ticket à" #: src/shisa.c:157 msgid "Password expire on" msgstr "Le mot de passe expire à" #: src/shisa.c:159 msgid "Account expire on" msgstr "Le compte expire à" #: src/shisa.c:172 msgid "Key" msgstr "Clef" #: src/shisa.c:174 msgid "\tEtype" msgstr "\tEtype" #: src/shisa.c:177 msgid "\tPriority" msgstr "\tPriorité" #: src/shisa.c:181 msgid "\tSalt" msgstr "\tSel" #: src/shisa.c:183 msgid "\tS2K params" msgstr "\tParamètres S2K" #: src/shisa.c:186 msgid "\tPassword" msgstr "\tMot de passe" #: src/shisa.c:189 msgid "\tKey is" msgstr "\tLa clef est" #: src/shisa.c:189 msgid "MISSING" msgstr "MANQUANTE" #: src/shisa.c:267 #, c-format msgid "Adding realm `%s'...\n" msgstr "Ajout du domaine '%s'...\n" #: src/shisa.c:269 #, c-format msgid "Adding principal `%s@%s'...\n" msgstr "Ajout de l'identifiant '%s@%s'...\n" #: src/shisa.c:280 #, c-format msgid "Adding realm `%s'...done\n" msgstr "Ajout du domaine '%s'...ok\n" #: src/shisa.c:282 #, c-format msgid "Adding principal `%s@%s'...done\n" msgstr "Ajout de l'identifiant '%s@%s'...ok\n" #: src/shisa.c:313 #, c-format msgid "Removing realm `%s'...\n" msgstr "Suppression du domaine '%s'...\n" #: src/shisa.c:315 #, c-format msgid "Removing principal `%s@%s'...\n" msgstr "Suppression de l'identifiant '%s@%s'...\n" #: src/shisa.c:323 #, c-format msgid "Removing realm `%s'...done\n" msgstr "Suppression du domaine '%s'...ok\n" #: src/shisa.c:325 #, c-format msgid "Removing principal `%s@%s'...done\n" msgstr "Suppression de l'identifiant '%s@%s'...ok\n" #: src/shisa.c:372 #, c-format msgid "Password for `%s@%s': " msgstr "Mot de passe pour '%s@%s' : " #: src/shisa.c:375 msgid "Password: " msgstr "Mot de passe : " #: src/shisa.c:377 #, c-format msgid "Could not read password" msgstr "Ne peut lire le mot de passe" #: src/shisa.c:389 #, c-format msgid "" "Could not create key (%d):\n" "%s" msgstr "" "Ne peut créer la clef (%d) :\n" "%s" #: src/shisa.c:423 src/shishi.c:59 src/shishid.c:494 #, fuzzy, c-format msgid "Try `%s --help' for more information.\n" msgstr "Essayez '%s --help' pour plus d'informations." #: src/shisa.c:428 src/shishi.c:64 #, fuzzy, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" msgstr "" "\n" "Les arguments obligatoires pour les options longues le sont aussi pour les\n" "options courtes.\n" "\n" #: src/shisa.c:468 src/shishi.c:100 #, c-format msgid "too many arguments" msgstr "Trop d'arguments" #: src/shisa.c:477 #, c-format msgid "" "Initialization failed:\n" "%s" msgstr "" "L'initialisation a échoué :\n" "%s" #: src/shisa.c:482 #, c-format msgid "" "Could not read library options `%s':\n" "%s" msgstr "" "Ne peut lire les options de bibliothèque '%s' :\n" "%s" #: src/shisa.c:487 #, c-format msgid "" "Shishi initialization failed:\n" "%s" msgstr "" "L'initialisation de Shishi a échoué :\n" "%s" #: src/shisa.c:492 #, c-format msgid "" "Could not set encryption type `%s':\n" "%s" msgstr "" "Ne peut définir le type de chiffrement '%s' :\n" "%s" #: src/shisa.c:500 #, c-format msgid "too few arguments" msgstr "Trop peu d'arguments" #: src/shisa.c:531 #, c-format msgid "Adding default realm `%s'...\n" msgstr "Ajout du domaine par défaut '%s'...\n" #: src/shisa.c:551 #, c-format msgid "Modifying principal `%s@%s'...\n" msgstr "Modification de l'identifiant '%s@%s'...\n" #: src/shisa.c:558 #, c-format msgid "Modifying principal `%s@%s'...done\n" msgstr "Modification de l'identifiant '%s@%s'...ok\n" #: src/shisa.c:562 #, c-format msgid "Adding key to `%s@%s'...\n" msgstr "Ajout de la clef pour '%s@%s'...\n" #: src/shisa.c:572 #, c-format msgid "Adding key to `%s@%s'...done\n" msgstr "Ajout de la clef pour '%s@%s'...ok\n" #: src/shisa.c:576 #, c-format msgid "Removing key from `%s@%s'...\n" msgstr "Suppression de la clef pour '%s@%s'...\n" #: src/shisa.c:589 #, c-format msgid "Removing key from `%s@%s'...done\n" msgstr "Suppression de la clef pour '%s@%s'...ok\n" #: src/shishi.c:111 #, fuzzy, c-format msgid "cannot initialize libshishi" msgstr "Ne peut initialiser la libshishi." #: src/shishi.c:115 #, c-format msgid "Could not set encryption types: %s" msgstr "Ne peut définir le type de chiffrement : %s" #: src/shishi.c:127 #, c-format msgid "Could not parse client principal \"%s\": %s" msgstr "Ne peut lire l'identifiant du client \"%s\" : %s" #: src/shishi.c:140 #, c-format msgid "Could not parse server principal \"%s\": %s" msgstr "Ne peut lire l'identifiant du serveur \"%s\" : %s" #: src/shishi.c:146 #, c-format msgid "Could not read library options: %s" msgstr "Ne peut lire les options de bibliothèques : %s" #: src/shishi.c:164 #, c-format msgid "Invalid --starttime date `%s'" msgstr "Date pour --starttime invalide '%s'" #: src/shishi.c:174 #, c-format msgid "Invalid --endtime date `%s'" msgstr "Date pour --endtime invalide '%s'" #: src/shishi.c:184 #, c-format msgid "Invalid --renew-till date `%s'" msgstr "Date pour --renew-till invalide '%s'" #: src/shishi.c:203 #, c-format msgid "Tickets in `%s':\n" msgstr "Tickets dans '%s' :\n" #: src/shishi.c:208 #, c-format msgid "Could not list tickets: %s" msgstr "Ne peut lister les tickets : %s" #: src/shishi.c:225 #, c-format msgid "Removing ticket:\n" msgstr "Suppression du ticket :\n" #: src/shishi.c:232 #, c-format msgid "" "Could not destroy ticket %d:\n" "%s" msgstr "" "Ne peut détruire le ticket %d :\n" "%s" #: src/shishi.c:242 #, c-format msgid "No tickets removed.\n" msgstr "Aucun ticket supprimé.\n" #: src/shishi.c:244 #, c-format msgid "%d ticket removed.\n" msgid_plural "%d tickets removed.\n" msgstr[0] "%d ticket supprimé.\n" msgstr[1] "%d tickets supprimés.\n" #: src/shishi.c:277 #, fuzzy, c-format msgid "could not get ticket as `%s' for `%s'" msgstr "Ne peut obtenir de ticket en tant que '%s' pour '%s'." #. TRANSLATORS: The placeholder indicates the bug-reporting address #. for this package. Please add _another line_ saying #. "Report translation bugs to <...>\n" with the address for translation #. bugs (typically your translation team's web or email address). #: src/shishid.c:503 #, c-format msgid "" "\n" "Mandatory arguments to long options are mandatory for short options too.\n" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" "Les arguments obligatoires au options longues sont aussi obligatoires pour\n" "les options courtes.\n" "\n" "Rapportez les anomalies à <%s>.\n" #~ msgid "Report bugs to <%s>.\n" #~ msgstr "Rapportez les bugs à <%s>.\n" shishi-1.0.2/po/LINGUAS0000664000000000000000000000004312126661306011335 00000000000000en@boldquot en@quot fi fr pl sr vi shishi-1.0.2/po/en@quot.header0000644000000000000000000000226312126772677013117 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # shishi-1.0.2/po/fi.gmo0000644000000000000000000004163412126773035011426 00000000000000Þ•¯”é °±¸ À Ê ÔàJæ`1(’»ÄÓî  $B\z —¸Î&è*1:3l &½4ä&(@%i¤bÂb%ˆ¨Ã)×)'+"Sv&Ž"µ(Ø#=a#)¥%Ïõ' 6"W'z#¢%Æì),2_%w)Çã$ù)8,b«Êè!ù'$C&h"%²Øó÷ '?bV¹*Áì#9.]&Œ³ÐÙî .9*W2‚µÏ!í"2!Pr"‘´ÌèAú</P'€+¨(Ôý&)A&k(’»Õ#õ  ' H )W " ¤ *à î ,!#0!PT!¥! Å!kæ!R"$j"""ž"Á"Ö",è"(#">#&a# ˆ#©# ½#"Ë#î# $*$%F$l$t$ˆ$$´$ Ì$×$é$Æü$ Ã&Ñ& Ø& â&ð&'Z'æl'8S(Œ( •(¶(Ö(ô(ü(#)1>)7p))¨)/Ò)*# *D*,`*A*3Ï*$+?(+3h+0œ+/Í+"ý+ ,A,xa,~Ú,$Y-$~-£-7¼-8ô-.-.%\.‚.,™.$Æ.&ë./'/-=/1k/*/@È/G 0AQ0#“0.·0,æ0-11A1's1:›1,Ö1,2102b2)}2,§2Ô2î2'3-33F30z30«33Ü324C4.]4*Œ4!·4Ù4ó45',5T5&Z5/5)±54Û5}6Ž6%–6¼6Ì6(á6. 7;97+u7&¡7 È7!Õ7!÷7%8?8 W8*b8%8C³8-÷8$%9*J9!u91—97É9(:.*:Y:"v:™:l³: ;22;2e;9˜;=Ò;%<@6<Pw<1È<0ú<&+=R=!k==œ=¼=3Ì=)> *>(K>t>&†>*­>rØ>(K?)t?{ž?@*5@`@-|@&ª@)Ñ@7û@.3A"bA)…A#¯AÓAêA&ûA*"B.MB"|BLŸBìBÿBC,CDC ]ChCƒC— ‘‡x5&dc•!GzL=g}„‹œ*H¨;sCŒRDaQSy:wf21n?{NUŠe…Ÿ"hŽtI[®š]+ 0kˆ¦o| –“q-i£‰)'6ªVƒ4M’‚$E^¬”>¢( ž\™X ,Y«B€K†›7<9Jv­rAO/¥.@¤PTWp~©¯m §8¡Z_ jl#`Fub3˜% Etype Key is Password Priority S2K params Salt Mandatory arguments to long options are mandatory for short options too. Mandatory arguments to long options are mandatory for short options too. Report bugs to <%s>. %d ticket removed. %d tickets removed. (pkinit)(user-to-user)A service is not availableAccount expire onAccount isAccount not valid beforeAdding default realm `%s'... Adding key to `%s@%s'... Adding key to `%s@%s'...done Adding principal `%s@%s'... Adding principal `%s@%s'...done Adding realm `%s'... Adding realm `%s'...done Additional pre-authentication requiredAlternative authentication method requiredBase64 encoding or decoding failed. Data corrupt?Client name value differ between request and reply.Client not found in databaseClient not yet valid - try again laterClient realm value differ between request and reply.Client's entry in database has expiredClient's key encrypted in old master keyClients credentials have been revokedClock skew too greatCould not create key (%d): %sCould not decrypt AP-REQ using provided key. This usually indicates an internal application error.Could not decrypt Ticket using provided key. This usually indicates an internal application error.Could not destroy ticket %d: %sCould not list tickets: %sCould not open fileCould not parse client principal "%s": %sCould not parse server principal "%s": %sCould not read library options `%s': %sCould not read library options: %sCould not read passwordCould not set encryption type `%s': %sCould not set encryption types: %sCredentials for server have been revokedCurrent key versionDISABLEDError adding key to principal.Error adding principal to database.Error adding realm to database.Error enumerating keys in database.Error enumerating principals in database.Error enumerating realms in database.Error finding principal.Error in ASN.1 function (corrupt data?)Error receiving data from serverError removing key from principal.Error removing principal from database.Error removing realm from database.Failed to parse credential cache fileFailed to parse keytab fileField is too long for this implementationFile I/O error for Shisa configuration file.File input/output errorGeneric error (description in e-text)Inappropriate type of checksum in messageIncorrect message directionIncorrect net addressIncorrect sequence number in messageInitialization failed: %sIntegrity check on decrypted field failedInternal error in low-level crypto routines.Invalid --endtime date `%s'Invalid --renew-till date `%s'Invalid --starttime date `%s'Invalid msg typeKDC Policy rejects transited pathKDC cannot accommodate requested optionKDC has no support for checksum typeKDC has no support for encryption typeKDC has no support for padata typeKDC has no support for transited typeKDC policy rejects requestKeyLast TGT request atLast initial TGT request atLast initial request atLast ticket renewal atLow-level cryptographic primitive failed. This usually indicates bad password or data corruption.MISSINGMemory allocation error in shishi library.Message out of orderMessage stream modifiedModifying principal `%s@%s'... Modifying principal `%s@%s'...done More than one key match given search criteria.Multiple principal entries in databaseMutual authentication failedNo errorNo tickets removed. Password expire onPassword for `%s@%s': Password has expired Password: Policy rejects transited pathPre-authentication information was invalidPrincipal is not associated with any matching key.Protocol version mismatchReading KRB-ERROR from %s... Reading KRB-ERROR from %s...done Reading KRB-ERROR in %s format... Removing key from `%s@%s'... Removing key from `%s@%s'...done Removing principal `%s@%s'... Removing principal `%s@%s'...done Removing realm `%s'... Removing realm `%s'...done Removing ticket: Replay protection value (nonce) differ between request and reply.Request is a replayRequested protocol version number not supportedRequested server and ticket don't matchRequested start time is later than end timeResponse too big for UDP, retry with TCPServer not found in databaseServer not yet valid - try again laterServer principal valid for user2user onlyServer's entry in database has expiredServer's key encrypted in old master keyService key not availableShisa could not be initialized.Shisa database could not be opened.Shisa successShishi initialization failed: %sShishi successSpecified version of key is not availableSupplied principal does not exist.Supplied realm does not exist.Syntax error in Shisa configuration token.TGT has been revokedThe Shisa configuration file does not exist.The client or server has a null keyThe system call bind() failed. This usually indicates insufficient permissions.The system call close() failed.The system call sendto() failed.The system call socket() failed. This usually indicates that your system does not support the socket type.The ticket isn't for usTicket and authenticator don't matchTicket expiredTicket not eligible for postdatingTicket not yet validTickets in `%s': Tried to add a principal that already exist.Tried to add a realm that already exist.Tried to remove a non-empty realm.Try `%s --help' for more information. Unknown KRB-ERROR error code %d.Unknown Shisa errorUnknown errorWriting KRB-ERROR in %s format... Writing KRB-ERROR to %s... Writing KRB-ERROR to %s...done cannot initialize libshishicould not get ticket as `%s' for `%s'enabledlibshishi: info: %slibshishi: info: %s libshishi: warning: %slibshishi: warning: %s shisa: %s too few argumentstoo many argumentsProject-Id-Version: shishi-1.0.0 Report-Msgid-Bugs-To: bug-shishi@gnu.org POT-Creation-Date: 2013-04-03 11:27+0200 PO-Revision-Date: 2010-08-31 12:00+0200 Last-Translator: Jorma Karvonen Language-Team: Finnish Language: fi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: KBabel 1.11.2 Salaustyyppi Avain Salasana Prioriteetti S2K-parametrit Salt-argumentti Pakolliset argumentit pitkille valitsimille ovat pakollisia myös lyhyille valitsimille. Pakolliset argumentit pitkille valitsimille ovat pakollisia myös lyhyille valitsimille. Ilmoita virheistä (englanniksi) osoitteeseen <%s>. Ilmoita käännösvirheistä osoitteeseen . %d pääsylippu poistettu. %d pääsylippua poistettu. (pkinit)(käyttäjältä-käyttäjälle)Palvelu ei ole käytettävissäTili vanheni pääosapuolessaTili onTili ei ole kelvollinen ennenLisätään oletusalue â€%sâ€... Lisätään avain pääosapuoleen â€%s@%sâ€... Lisätään avain pääosapuoleen â€%s@%sâ€...valmis Lisätään pääosapuoli â€%s@%sâ€... Lisätään pääosapuoli â€%s@%sâ€...valmis Lisätään alue â€%sâ€... Lisätään alue â€%sâ€...valmis Lisäesitodennusta tarvittuVaihtoehtoinen todennusmenetelmä vaadittiinBase64-koodaus tai -dekoodaus epäonnistui. Tiedot vaurioituneet?Asiakasnimi eroaa pyynnön ja vastauksen välillä.Asiakasta ei löytynyt tietokannastaAsiakas ei ole vielä kelvollinen - yritä myöhemmin uudelleenAsiakasalue eroaa pyynnön ja vastauksen välillä.Asiakkaan tiedot tietokannassa ovat vanhentuneetAsiakkaan avain salattu vanhassa pääavaimessaAsiakkaan valtakirja on peruutettuAikavääristymä on liian suuriEi voitu luoda avainta (%d): %sEi voitu purkaa AP-REQ-salausta käyttäen tarjottua avainta. Tämä viittaa tavallisesti sisäiseen sovellusvirheeseen.Ei voitu purkaa pääsylipun salausta käyttäen tarjottua avainta. Tämä viittaa tavallisesti sisäiseen sovellusvirheeseen.Ei voitu tuhota pääsylippua %d: %sEi voitu luetella pääsylippuja: %sEi voitu avata tiedostoaEi voitu jäsentää asiakaspääosapuolta â€%sâ€: %sEi voitu jäsentää palvelinpääosapuolta â€%sâ€: %sEi voitu lukea kirjastovalitsimia â€%sâ€: %sEi voitu lukea kirjastovalitsimia: %sEi voi lukea salasanaaEi voitu asettaa salaustyyppiä â€%sâ€: %sEi voitu asettaa salaustyyppejä: %sValtakirjat palvelimelle on peruutettuNykyinen avainversioPOISTETTU KÄYTÖSTÄVirhe lisättäessä avainta pääosapuoleen.Virhe lisättäessä pääosapuolta tietokantaan.Virhe lisättäessä aluetta tietokantaan.Virhe muunnettaessa avaimia luetelluiksi tyypeiksi tietokannassaVirhe muunnettaessa pääosapuolia luetelluiksi tyypeiksi tietokannassaVirhe muunnettaessa alueita luetelluiksi tyypeiksi tietokannassa.Virhe etsittäessä pääosapuolta.Virhe ASN.1-funktiossa (tiedot vaurioituneet?)Virhe vastaanotettaessa tietoja palvelimeltaVirhe poistettaessa avainta pääosapuolesta.Virhe poistettaessa pääosapuolta tietokannasta.Virhe poistettaessa alue tietokannasta.Valtakirjavälimuistitiedoston jäsentäminen epäonnistuiKeytab-tiedoston jäsentäminen epäonnistuiKenttä on liian pitkä tälle toteutukselleTiedostosiirräntävirhe Shisa-asetustiedostolle.Tiedoston siirräntävirheYleinen virhe (kuvaus e-text -tekstissä)Sanomassa oli sopimaton tarkistussummatyyppiVirheellinen viestisuuntaVäärä verkko-osoiteVirheellinen sekvenssinumero viestissäAlustus epäonnistui: %sSalauspuretun tiedoston eheystarkistus epäonnistuiSisäinen virhe alemman tason salausrutiineissa.Virheellinen --endtime -päivämäärä â€%sâ€Virheellinen --renew-till -päivämäärä â€%sâ€Virheellinen --starttime -päivämäärä â€%sâ€Virheellinen viestityyppiKDC-toimintaperiaate kieltää siirretyn polunKDC ei voi mukautua pyydettyyn valitsimeenKDC ei tue tarkistussummatyyppiäKDC ei tue salaustyyppiäKDC ei tue padata-tyyppiäKDC ei tue transited-tyyppiäKDC-toimintaperiaate kieltää pyynnönAvainViimeinen TGT-pyyntö pääosapuolessaViimeinen alustus-TGT -pyyntö pääosapuolessaViimeinen alustuspyyntö pääosapuolessaViimeinen pääsylippu-uudistaminen pääosapuolessaAlemman tason salausprimitiivi epäonnistui. Tämä tavallisesti viittaa väärään salasanaan tai tietojen vaurioitumiseen.PUUTTUUMuistinvarausvirhe shishi-kirjastossaViesti on rikkiViestivirta muutettuMuokataan pääosapuolta â€%s@%sâ€... Muokataan pääosapuolta â€%s@%sâ€...valmis Useampi kuin yksi avain täsmää annettuun hakukriteeriin.Useita pääosapuolitietueita tietokannassaMolemminpuolinen todennus epäonnistuiEi virhettäPääsylippuja ei ole poistettu. Salasana vanheni pääosapuolessaSalasana käyttäjälle â€%s@%sâ€: Salasana on vanhentunutSalasana: Toimintaperiaate kieltää siirretyn polunEsitodennustiedot olivat virheellisetPääosapuoli ei ole liitetty mihinkään täsmäävään avaimeen.Yhteyskäytäntöversion täsmäämättömyysLuetaan KRB-ERROR tiedostosta %s... Luetaan KRB-ERROR tiedostosta %s...valmis Luetaan KRB-ERROR %s-muodossa... Poistetaan avain pääosapuolesta â€%s@%sâ€... Poistetaan avain pääosapuolesta â€%s@%sâ€...valmis Poistetaan pääosapuoli â€%s@%sâ€... Poistetaan pääosapuoli â€%s@%sâ€...valmis Poistetaan alue â€%sâ€... Poistetaan alue â€%sâ€...valmis Poistetaan pääsylippu: Toista suoja-arvon (vain kerran esiintyvä numero tai bittimerkkijono) ero pyynnön ja vastauksen välillä.Pyyntö on toistoPyydettyä yhteyskäytäntöversionumeroa ei tuetaPyydetty palvelin ja pääsylippu eivät täsmääPyydetty aloitusaika on myöhäisempi kuin lopettamisaikaVastaus on liian suuri UDP:lle, yritetään uudelleen TCP:näPalvelinta ei löytynyt tietokannastaPalvelin ei ole vielä kelvollinen - yritä myöhemmin uudelleenPalvelinpääosapuoli on kelvollinen vain käyttäjä-käyttäjä -viestintäänPalvelimen tiedot tietokannassa ovat vanhentuneetPalvelimen avain salattu vanhassa pääavaimessaPalveluavain ei ollut käytettävissäShisaa ei voitu alustaa.Shisa-tietokantaa ei voitu avata.Shisa onnistuiShishi-alustus epäonnistui: %sShishi onnistuiAvaimen määritelty versio ei ole käytettävissäTarjottua pääosapuolta ei ole olemassa.Tarjottu alue ei ollut olemassa.Syntaksivirhe Shisa-asetusmerkkijonossa.TGT on peruutettuShisa-asetustiedostoa ei ole olemassa.Asiakkaalla tai palvelimella on null-avainJärjestelmäkutsu bind() epäonnistui. Tämä on tavallisesti merkkinä riittämättömistä käyttöoikeuksista.Järjestelmäkutsu close() epäonnistui.Järjestelmäkutsu sendto() epäonnistui.Järjestelmäkutsu socket() epäonnistui. Tämä tavallisesti viittaa siihen, että järjestelmäsi ei tue pistoketyyppiä.Pääsylippu ei ole meillePääsylippu ja todentaja eivät täsmääPääsylippu on vanhentunutPääsylippu ei ole sopiva jälkiajoituksellePääsylippu ei ole vielä kelvollinenPääsyliput oletustiedostossa â€%sâ€: Yritettiin lisätä pääosapuoli, joka on jo olemassa.Yritettiin lisätä alue, joka on jo olemassa.Yritettiin poistaa ei-tyhjä alue.Lisätietoja komennolla â€%s --helpâ€. Tuntematon KRB-ERROR-virhekoodi %d.Tuntematon Shisa-virheTuntematon virheKirjoitetaan KRB-ERROR %s-muodossa... Kirjoitetaan KRB-ERROR tiedostoon n %s... Kirjoitetaan KRB-ERROR tiedostoon %s...valmis ei voi alustaa kirjastoa libshishiei voitu saada pääsylippua pääosapuolena â€%s†palvelimelle â€%sâ€.otettu käyttöönlibshishi: tiedot: %slibshishi: tiedot: %s libshishi: varoitus: %slibshishi: varoitus: %s shisa: %s liian vähän argumenttejaliian monia argumenttejashishi-1.0.2/configure0000755000000000000000000422455312126772722011626 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for GNU Shishi 1.0.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-shishi@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Shishi' PACKAGE_TARNAME='shishi' PACKAGE_VERSION='1.0.2' PACKAGE_STRING='GNU Shishi 1.0.2' PACKAGE_BUGREPORT='bug-shishi@gnu.org' PACKAGE_URL='http://www.gnu.org/software/shishi/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_header_list= ac_func_list= gl_getopt_required=POSIX gl_getopt_required=POSIX ac_subst_vars='gl3tests_LTLIBOBJS gl3tests_LIBOBJS gl3_LTLIBOBJS gl3_LIBOBJS gl2tests_LTLIBOBJS gl2tests_LIBOBJS gl2_LTLIBOBJS gl2_LIBOBJS gltests_LTLIBOBJS gltests_LIBOBJS gl_LTLIBOBJS gl_LIBOBJS CONFIG_INCLUDE am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WARN_CFLAGS WERROR_CFLAGS DBDIR KEYDIR SKELDIR CONFDIR ARCFOUR_FALSE ARCFOUR_TRUE NULL_FALSE NULL_TRUE MD_FALSE MD_TRUE AES_FALSE AES_TRUE DES3_FALSE DES3_TRUE DES_FALSE DES_TRUE GTK_DOC_USE_REBASE_FALSE GTK_DOC_USE_REBASE_TRUE GTK_DOC_USE_LIBTOOL_FALSE GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_BUILD_PDF_FALSE GTK_DOC_BUILD_PDF_TRUE GTK_DOC_BUILD_HTML_FALSE GTK_DOC_BUILD_HTML_TRUE ENABLE_GTK_DOC_FALSE ENABLE_GTK_DOC_TRUE HTML_DIR GTKDOC_MKPDF GTKDOC_REBASE GTKDOC_CHECK PKG_CONFIG STARTTLS_FALSE STARTTLS_TRUE LIBGNUTLS_PREFIX LTLIBGNUTLS LIBGNUTLS HAVE_LIBGNUTLS LIBTASN1_PREFIX LTLIBTASN1 LIBTASN1 HAVE_LIBTASN1 LIBIDN_PREFIX LTLIBIDN LIBIDN HAVE_LIBIDN PAMDIR PAM_SHISHI ENABLE_SHISHID_FALSE ENABLE_SHISHID_TRUE LIBRESOLV_PREFIX LTLIBRESOLV LIBRESOLV HAVE_LIBRESOLV gl3tests_WITNESS gl2tests_WITNESS NEXT_AS_FIRST_DIRECTIVE_LOCALE_H NEXT_LOCALE_H HAVE_XLOCALE_H REPLACE_STRUCT_LCONV REPLACE_DUPLOCALE REPLACE_SETLOCALE REPLACE_LOCALECONV HAVE_DUPLOCALE GNULIB_DUPLOCALE GNULIB_SETLOCALE GNULIB_LOCALECONV GNULIB_GL_GL2_UNISTD_H_GETOPT GETOPT_H HAVE_GETOPT_H NEXT_AS_FIRST_DIRECTIVE_GETOPT_H NEXT_GETOPT_H gltests_WITNESS HAVE_WINT_T NEXT_AS_FIRST_DIRECTIVE_WCHAR_H NEXT_WCHAR_H REPLACE_WCSWIDTH REPLACE_WCWIDTH REPLACE_WCSNRTOMBS REPLACE_WCSRTOMBS REPLACE_WCRTOMB REPLACE_MBSNRTOWCS REPLACE_MBSRTOWCS REPLACE_MBRLEN REPLACE_MBRTOWC REPLACE_MBSINIT REPLACE_WCTOB REPLACE_BTOWC REPLACE_MBSTATE_T HAVE_DECL_WCWIDTH HAVE_DECL_WCTOB HAVE_WCSWIDTH HAVE_WCSTOK HAVE_WCSSTR HAVE_WCSPBRK HAVE_WCSSPN HAVE_WCSCSPN HAVE_WCSRCHR HAVE_WCSCHR HAVE_WCSDUP HAVE_WCSXFRM HAVE_WCSCOLL HAVE_WCSNCASECMP HAVE_WCSCASECMP HAVE_WCSNCMP HAVE_WCSCMP HAVE_WCSNCAT HAVE_WCSCAT HAVE_WCPNCPY HAVE_WCSNCPY HAVE_WCPCPY HAVE_WCSCPY HAVE_WCSNLEN HAVE_WCSLEN HAVE_WMEMSET HAVE_WMEMMOVE HAVE_WMEMCPY HAVE_WMEMCMP HAVE_WMEMCHR HAVE_WCSNRTOMBS HAVE_WCSRTOMBS HAVE_WCRTOMB HAVE_MBSNRTOWCS HAVE_MBSRTOWCS HAVE_MBRLEN HAVE_MBRTOWC HAVE_MBSINIT HAVE_BTOWC GNULIB_WCSWIDTH GNULIB_WCSTOK GNULIB_WCSSTR GNULIB_WCSPBRK GNULIB_WCSSPN GNULIB_WCSCSPN GNULIB_WCSRCHR GNULIB_WCSCHR GNULIB_WCSDUP GNULIB_WCSXFRM GNULIB_WCSCOLL GNULIB_WCSNCASECMP GNULIB_WCSCASECMP GNULIB_WCSNCMP GNULIB_WCSCMP GNULIB_WCSNCAT GNULIB_WCSCAT GNULIB_WCPNCPY GNULIB_WCSNCPY GNULIB_WCPCPY GNULIB_WCSCPY GNULIB_WCSNLEN GNULIB_WCSLEN GNULIB_WMEMSET GNULIB_WMEMMOVE GNULIB_WMEMCPY GNULIB_WMEMCMP GNULIB_WMEMCHR GNULIB_WCWIDTH GNULIB_WCSNRTOMBS GNULIB_WCSRTOMBS GNULIB_WCRTOMB GNULIB_MBSNRTOWCS GNULIB_MBSRTOWCS GNULIB_MBRLEN GNULIB_MBRTOWC GNULIB_MBSINIT GNULIB_WCTOB GNULIB_BTOWC VALGRIND HAVE_UNISTD_H NEXT_AS_FIRST_DIRECTIVE_UNISTD_H NEXT_UNISTD_H PTHREAD_H_DEFINES_STRUCT_TIMESPEC SYS_TIME_H_DEFINES_STRUCT_TIMESPEC TIME_H_DEFINES_STRUCT_TIMESPEC NEXT_AS_FIRST_DIRECTIVE_TIME_H NEXT_TIME_H HAVE_SYS_UIO_H NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H NEXT_SYS_UIO_H HAVE_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRINGS_H NEXT_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRING_H NEXT_STRING_H HAVE_DECL_STRNCASECMP HAVE_STRCASECMP HAVE_FFS GNULIB_FFS NEXT_AS_FIRST_DIRECTIVE_STDLIB_H NEXT_STDLIB_H NEXT_AS_FIRST_DIRECTIVE_STDIO_H NEXT_STDIO_H GL_GENERATE_STDINT_H_FALSE GL_GENERATE_STDINT_H_TRUE STDINT_H WINT_T_SUFFIX WCHAR_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX PTRDIFF_T_SUFFIX HAVE_SIGNED_WINT_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_SIG_ATOMIC_T BITSIZEOF_WINT_T BITSIZEOF_WCHAR_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_PTRDIFF_T HAVE_SYS_BITYPES_H HAVE_SYS_INTTYPES_H HAVE_STDINT_H NEXT_AS_FIRST_DIRECTIVE_STDINT_H NEXT_STDINT_H HAVE_SYS_TYPES_H HAVE_INTTYPES_H HAVE_WCHAR_H HAVE_UNSIGNED_LONG_LONG_INT HAVE_LONG_LONG_INT NEXT_AS_FIRST_DIRECTIVE_STDDEF_H NEXT_STDDEF_H GL_GENERATE_STDDEF_H_FALSE GL_GENERATE_STDDEF_H_TRUE STDDEF_H HAVE_WCHAR_T REPLACE_NULL GL_GENERATE_STDARG_H_FALSE GL_GENERATE_STDARG_H_TRUE STDARG_H NEXT_AS_FIRST_DIRECTIVE_STDARG_H NEXT_STDARG_H GL_GENERATE_STDALIGN_H_FALSE GL_GENERATE_STDALIGN_H_TRUE STDALIGN_H NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H NEXT_SIGNAL_H REPLACE_RAISE REPLACE_PTHREAD_SIGMASK HAVE_SIGHANDLER_T HAVE_TYPE_VOLATILE_SIG_ATOMIC_T HAVE_STRUCT_SIGACTION_SA_SIGACTION HAVE_SIGACTION HAVE_SIGINFO_T HAVE_SIGSET_T HAVE_RAISE HAVE_PTHREAD_SIGMASK HAVE_POSIX_SIGNALBLOCKING GNULIB_SIGACTION GNULIB_SIGPROCMASK GNULIB_SIGNAL_H_SIGPIPE GNULIB_RAISE GNULIB_PTHREAD_SIGMASK LIB_SELECT LIBSOCKET HAVE_SYS_SELECT_H NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H NEXT_SYS_SELECT_H REPLACE_SELECT REPLACE_PSELECT HAVE_PSELECT GNULIB_SELECT GNULIB_PSELECT PMCCABE YFLAGS YACC HAVE__BOOL GL_GENERATE_STDBOOL_H_FALSE GL_GENERATE_STDBOOL_H_TRUE STDBOOL_H GL_GENERATE_NETINET_IN_H_FALSE GL_GENERATE_NETINET_IN_H_TRUE NETINET_IN_H HAVE_NETINET_IN_H NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H NEXT_NETINET_IN_H APPLE_UNIVERSAL_BUILD REPLACE_TIMEGM REPLACE_NANOSLEEP REPLACE_MKTIME REPLACE_LOCALTIME_R HAVE_TIMEGM HAVE_STRPTIME HAVE_NANOSLEEP HAVE_DECL_LOCALTIME_R GNULIB_TIME_R GNULIB_TIMEGM GNULIB_STRPTIME GNULIB_NANOSLEEP GNULIB_MKTIME UNDEFINE_STRTOK_R REPLACE_STRTOK_R REPLACE_STRSIGNAL REPLACE_STRNLEN REPLACE_STRNDUP REPLACE_STRNCAT REPLACE_STRERROR_R REPLACE_STRERROR REPLACE_STRCHRNUL REPLACE_STRCASESTR REPLACE_STRSTR REPLACE_STRDUP REPLACE_STPNCPY REPLACE_MEMMEM REPLACE_MEMCHR HAVE_STRVERSCMP HAVE_DECL_STRSIGNAL HAVE_DECL_STRERROR_R HAVE_DECL_STRTOK_R HAVE_STRCASESTR HAVE_STRSEP HAVE_STRPBRK HAVE_DECL_STRNLEN HAVE_DECL_STRNDUP HAVE_DECL_STRDUP HAVE_STRCHRNUL HAVE_STPNCPY HAVE_STPCPY HAVE_RAWMEMCHR HAVE_DECL_MEMRCHR HAVE_MEMPCPY HAVE_DECL_MEMMEM HAVE_MEMCHR HAVE_FFSLL HAVE_FFSL HAVE_MBSLEN GNULIB_STRVERSCMP GNULIB_STRSIGNAL GNULIB_STRERROR_R GNULIB_STRERROR GNULIB_MBSTOK_R GNULIB_MBSSEP GNULIB_MBSSPN GNULIB_MBSPBRK GNULIB_MBSCSPN GNULIB_MBSCASESTR GNULIB_MBSPCASECMP GNULIB_MBSNCASECMP GNULIB_MBSCASECMP GNULIB_MBSSTR GNULIB_MBSRCHR GNULIB_MBSCHR GNULIB_MBSNLEN GNULIB_MBSLEN GNULIB_STRTOK_R GNULIB_STRCASESTR GNULIB_STRSTR GNULIB_STRSEP GNULIB_STRPBRK GNULIB_STRNLEN GNULIB_STRNDUP GNULIB_STRNCAT GNULIB_STRDUP GNULIB_STRCHRNUL GNULIB_STPNCPY GNULIB_STPCPY GNULIB_RAWMEMCHR GNULIB_MEMRCHR GNULIB_MEMPCPY GNULIB_MEMMEM GNULIB_MEMCHR GNULIB_FFSLL GNULIB_FFSL HAVE_LD_VERSION_SCRIPT_FALSE HAVE_LD_VERSION_SCRIPT_TRUE HAVE_LD_OUTPUT_DEF_FALSE HAVE_LD_OUTPUT_DEF_TRUE NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H NEXT_SYS_TIME_H REPLACE_STRUCT_TIMEVAL REPLACE_GETTIMEOFDAY HAVE_SYS_TIME_H HAVE_STRUCT_TIMEVAL HAVE_GETTIMEOFDAY GNULIB_GETTIMEOFDAY REPLACE_WCTOMB REPLACE_UNSETENV REPLACE_STRTOD REPLACE_SETENV REPLACE_REALPATH REPLACE_REALLOC REPLACE_RANDOM_R REPLACE_PUTENV REPLACE_PTSNAME_R REPLACE_PTSNAME REPLACE_MKSTEMP REPLACE_MBTOWC REPLACE_MALLOC REPLACE_CANONICALIZE_FILE_NAME REPLACE_CALLOC HAVE_DECL_UNSETENV HAVE_UNLOCKPT HAVE_SYS_LOADAVG_H HAVE_STRUCT_RANDOM_DATA HAVE_STRTOULL HAVE_STRTOLL HAVE_STRTOD HAVE_DECL_SETENV HAVE_SETENV HAVE_SECURE_GETENV HAVE_RPMATCH HAVE_REALPATH HAVE_RANDOM_R HAVE_RANDOM_H HAVE_RANDOM HAVE_PTSNAME_R HAVE_PTSNAME HAVE_POSIX_OPENPT HAVE_MKSTEMPS HAVE_MKSTEMP HAVE_MKOSTEMPS HAVE_MKOSTEMP HAVE_MKDTEMP HAVE_GRANTPT HAVE_GETSUBOPT HAVE_DECL_GETLOADAVG HAVE_CANONICALIZE_FILE_NAME HAVE_ATOLL HAVE__EXIT GNULIB_WCTOMB GNULIB_UNSETENV GNULIB_UNLOCKPT GNULIB_SYSTEM_POSIX GNULIB_STRTOULL GNULIB_STRTOLL GNULIB_STRTOD GNULIB_SETENV GNULIB_SECURE_GETENV GNULIB_RPMATCH GNULIB_REALPATH GNULIB_REALLOC_POSIX GNULIB_RANDOM_R GNULIB_RANDOM GNULIB_PUTENV GNULIB_PTSNAME_R GNULIB_PTSNAME GNULIB_POSIX_OPENPT GNULIB_MKSTEMPS GNULIB_MKSTEMP GNULIB_MKOSTEMPS GNULIB_MKOSTEMP GNULIB_MKDTEMP GNULIB_MBTOWC GNULIB_MALLOC_POSIX GNULIB_GRANTPT GNULIB_GETSUBOPT GNULIB_GETLOADAVG GNULIB_CANONICALIZE_FILE_NAME GNULIB_CALLOC_POSIX GNULIB_ATOLL GNULIB__EXIT GETHOSTNAME_LIB GETADDRINFO_LIB INET_NTOP_LIB SERVENT_LIB HOSTENT_LIB HAVE_NETDB_H NEXT_AS_FIRST_DIRECTIVE_NETDB_H NEXT_NETDB_H REPLACE_GAI_STRERROR HAVE_DECL_GETNAMEINFO HAVE_DECL_GETADDRINFO HAVE_DECL_GAI_STRERROR HAVE_DECL_FREEADDRINFO HAVE_STRUCT_ADDRINFO GNULIB_GETADDRINFO WINDOWS_64_BIT_ST_SIZE NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H NEXT_SYS_STAT_H REPLACE_UTIMENSAT REPLACE_STAT REPLACE_MKNOD REPLACE_MKFIFO REPLACE_MKDIR REPLACE_LSTAT REPLACE_FUTIMENS REPLACE_FSTATAT REPLACE_FSTAT HAVE_UTIMENSAT HAVE_MKNODAT HAVE_MKNOD HAVE_MKFIFOAT HAVE_MKFIFO HAVE_MKDIRAT HAVE_LSTAT HAVE_LCHMOD HAVE_FUTIMENS HAVE_FSTATAT HAVE_FCHMODAT GNULIB_UTIMENSAT GNULIB_STAT GNULIB_MKNODAT GNULIB_MKNOD GNULIB_MKFIFOAT GNULIB_MKFIFO GNULIB_MKDIRAT GNULIB_LSTAT GNULIB_LCHMOD GNULIB_FUTIMENS GNULIB_FSTATAT GNULIB_FSTAT GNULIB_FCHMODAT WINDOWS_64_BIT_OFF_T NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H NEXT_SYS_TYPES_H REPLACE_VSPRINTF REPLACE_VSNPRINTF REPLACE_VPRINTF REPLACE_VFPRINTF REPLACE_VDPRINTF REPLACE_VASPRINTF REPLACE_TMPFILE REPLACE_STDIO_WRITE_FUNCS REPLACE_STDIO_READ_FUNCS REPLACE_SPRINTF REPLACE_SNPRINTF REPLACE_RENAMEAT REPLACE_RENAME REPLACE_REMOVE REPLACE_PRINTF REPLACE_POPEN REPLACE_PERROR REPLACE_OBSTACK_PRINTF REPLACE_GETLINE REPLACE_GETDELIM REPLACE_FTELLO REPLACE_FTELL REPLACE_FSEEKO REPLACE_FSEEK REPLACE_FREOPEN REPLACE_FPURGE REPLACE_FPRINTF REPLACE_FOPEN REPLACE_FFLUSH REPLACE_FDOPEN REPLACE_FCLOSE REPLACE_DPRINTF HAVE_VDPRINTF HAVE_VASPRINTF HAVE_RENAMEAT HAVE_POPEN HAVE_PCLOSE HAVE_FTELLO HAVE_FSEEKO HAVE_DPRINTF HAVE_DECL_VSNPRINTF HAVE_DECL_SNPRINTF HAVE_DECL_OBSTACK_PRINTF HAVE_DECL_GETLINE HAVE_DECL_GETDELIM HAVE_DECL_FTELLO HAVE_DECL_FSEEKO HAVE_DECL_FPURGE GNULIB_VSPRINTF_POSIX GNULIB_VSNPRINTF GNULIB_VPRINTF_POSIX GNULIB_VPRINTF GNULIB_VFPRINTF_POSIX GNULIB_VFPRINTF GNULIB_VDPRINTF GNULIB_VSCANF GNULIB_VFSCANF GNULIB_VASPRINTF GNULIB_TMPFILE GNULIB_STDIO_H_SIGPIPE GNULIB_STDIO_H_NONBLOCKING GNULIB_SPRINTF_POSIX GNULIB_SNPRINTF GNULIB_SCANF GNULIB_RENAMEAT GNULIB_RENAME GNULIB_REMOVE GNULIB_PUTS GNULIB_PUTCHAR GNULIB_PUTC GNULIB_PRINTF_POSIX GNULIB_PRINTF GNULIB_POPEN GNULIB_PERROR GNULIB_PCLOSE GNULIB_OBSTACK_PRINTF_POSIX GNULIB_OBSTACK_PRINTF GNULIB_GETLINE GNULIB_GETDELIM GNULIB_GETCHAR GNULIB_GETC GNULIB_FWRITE GNULIB_FTELLO GNULIB_FTELL GNULIB_FSEEKO GNULIB_FSEEK GNULIB_FSCANF GNULIB_FREOPEN GNULIB_FREAD GNULIB_FPUTS GNULIB_FPUTC GNULIB_FPURGE GNULIB_FPRINTF_POSIX GNULIB_FPRINTF GNULIB_FOPEN GNULIB_FGETS GNULIB_FGETC GNULIB_FFLUSH GNULIB_FDOPEN GNULIB_FCLOSE GNULIB_DPRINTF REPLACE_ITOLD GL_GENERATE_FLOAT_H_FALSE GL_GENERATE_FLOAT_H_TRUE FLOAT_H NEXT_AS_FIRST_DIRECTIVE_FLOAT_H NEXT_FLOAT_H NEXT_AS_FIRST_DIRECTIVE_FCNTL_H NEXT_FCNTL_H REPLACE_OPENAT REPLACE_OPEN REPLACE_FCNTL HAVE_OPENAT HAVE_FCNTL GNULIB_OPENAT GNULIB_OPEN GNULIB_NONBLOCKING GNULIB_FCNTL EOVERFLOW_VALUE EOVERFLOW_HIDDEN ENOLINK_VALUE ENOLINK_HIDDEN EMULTIHOP_VALUE EMULTIHOP_HIDDEN GL_GENERATE_ERRNO_H_FALSE GL_GENERATE_ERRNO_H_TRUE ERRNO_H NEXT_AS_FIRST_DIRECTIVE_ERRNO_H NEXT_ERRNO_H LIBGCRYPT_PREFIX LTLIBGCRYPT LIBGCRYPT HAVE_LIBGCRYPT HAVE_MSVC_INVALID_PARAMETER_HANDLER LIB_CLOCK_GETTIME HAVE_WINSOCK2_H UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS UNISTD_H_HAVE_WINSOCK2_H REPLACE_WRITE REPLACE_USLEEP REPLACE_UNLINKAT REPLACE_UNLINK REPLACE_TTYNAME_R REPLACE_SYMLINK REPLACE_SLEEP REPLACE_RMDIR REPLACE_READLINK REPLACE_READ REPLACE_PWRITE REPLACE_PREAD REPLACE_LSEEK REPLACE_LINKAT REPLACE_LINK REPLACE_LCHOWN REPLACE_ISATTY REPLACE_GETPAGESIZE REPLACE_GETGROUPS REPLACE_GETLOGIN_R REPLACE_GETDOMAINNAME REPLACE_GETCWD REPLACE_FTRUNCATE REPLACE_FCHOWNAT REPLACE_DUP2 REPLACE_DUP REPLACE_CLOSE REPLACE_CHOWN HAVE_SYS_PARAM_H HAVE_OS_H HAVE_DECL_TTYNAME_R HAVE_DECL_SETHOSTNAME HAVE_DECL_GETUSERSHELL HAVE_DECL_GETPAGESIZE HAVE_DECL_GETLOGIN_R HAVE_DECL_GETDOMAINNAME HAVE_DECL_FDATASYNC HAVE_DECL_FCHDIR HAVE_DECL_ENVIRON HAVE_USLEEP HAVE_UNLINKAT HAVE_SYMLINKAT HAVE_SYMLINK HAVE_SLEEP HAVE_SETHOSTNAME HAVE_READLINKAT HAVE_READLINK HAVE_PWRITE HAVE_PREAD HAVE_PIPE2 HAVE_PIPE HAVE_LINKAT HAVE_LINK HAVE_LCHOWN HAVE_GROUP_MEMBER HAVE_GETPAGESIZE HAVE_GETLOGIN HAVE_GETHOSTNAME HAVE_GETGROUPS HAVE_GETDTABLESIZE HAVE_FTRUNCATE HAVE_FSYNC HAVE_FDATASYNC HAVE_FCHOWNAT HAVE_FCHDIR HAVE_FACCESSAT HAVE_EUIDACCESS HAVE_DUP3 HAVE_DUP2 HAVE_CHOWN GNULIB_WRITE GNULIB_USLEEP GNULIB_UNLINKAT GNULIB_UNLINK GNULIB_UNISTD_H_SIGPIPE GNULIB_UNISTD_H_NONBLOCKING GNULIB_TTYNAME_R GNULIB_SYMLINKAT GNULIB_SYMLINK GNULIB_SLEEP GNULIB_SETHOSTNAME GNULIB_RMDIR GNULIB_READLINKAT GNULIB_READLINK GNULIB_READ GNULIB_PWRITE GNULIB_PREAD GNULIB_PIPE2 GNULIB_PIPE GNULIB_LSEEK GNULIB_LINKAT GNULIB_LINK GNULIB_LCHOWN GNULIB_ISATTY GNULIB_GROUP_MEMBER GNULIB_GETUSERSHELL GNULIB_GETPAGESIZE GNULIB_GETLOGIN_R GNULIB_GETLOGIN GNULIB_GETHOSTNAME GNULIB_GETGROUPS GNULIB_GETDTABLESIZE GNULIB_GETDOMAINNAME GNULIB_GETCWD GNULIB_FTRUNCATE GNULIB_FSYNC GNULIB_FDATASYNC GNULIB_FCHOWNAT GNULIB_FCHDIR GNULIB_FACCESSAT GNULIB_EUIDACCESS GNULIB_ENVIRON GNULIB_DUP3 GNULIB_DUP2 GNULIB_DUP GNULIB_CLOSE GNULIB_CHOWN GNULIB_CHDIR HAVE_WS2TCPIP_H HAVE_SYS_SOCKET_H NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H NEXT_SYS_SOCKET_H HAVE_ACCEPT4 HAVE_SA_FAMILY_T HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY HAVE_STRUCT_SOCKADDR_STORAGE GNULIB_ACCEPT4 GNULIB_SHUTDOWN GNULIB_SETSOCKOPT GNULIB_SENDTO GNULIB_RECVFROM GNULIB_SEND GNULIB_RECV GNULIB_LISTEN GNULIB_GETSOCKOPT GNULIB_GETSOCKNAME GNULIB_GETPEERNAME GNULIB_BIND GNULIB_ACCEPT GNULIB_CONNECT GNULIB_SOCKET HAVE_FEATURES_H NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H NEXT_ARPA_INET_H PRAGMA_COLUMNS PRAGMA_SYSTEM_HEADER INCLUDE_NEXT_AS_FIRST_DIRECTIVE INCLUDE_NEXT HAVE_ARPA_INET_H REPLACE_INET_PTON REPLACE_INET_NTOP HAVE_DECL_INET_PTON HAVE_DECL_INET_NTOP GNULIB_INET_PTON GNULIB_INET_NTOP GL_GENERATE_ALLOCA_H_FALSE GL_GENERATE_ALLOCA_H_TRUE ALLOCA_H ALLOCA LTALLOCA GL_COND_LIBTOOL_FALSE GL_COND_LIBTOOL_TRUE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS DIA GENGETOPT ASN1PARSER HELP2MAN PERL OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL OBJDUMP DLLTOOL AS ac_ct_AR SOVERSION host_os host_vendor host_cpu host build_os build_vendor build_cpu build RANLIB ARFLAGS AR EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LT_AGE LT_REVISION LT_CURRENT AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_largefile enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_nls enable_rpath with_libiconv_prefix with_libintl_prefix with_libgcrypt with_libgcrypt_prefix enable_random_device enable_pseudo_random_device enable_nonce_device enable_ld_version_script enable_valgrind_tests with_packager with_packager_version with_packager_bug_reports with_libresolv_prefix enable_pam with_pam_dir enable_ipv6 with_stringprep with_libidn_prefix with_libtasn1_prefix enable_starttls with_libgnutls_prefix with_html_dir enable_gtk_doc enable_gtk_doc_html enable_gtk_doc_pdf enable_des enable_3des enable_aes enable_md enable_null enable_arcfour with_conf_dir with_skel_dir with_key_dir with_db_dir enable_gcc_warnings ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP YACC YFLAGS PKG_CONFIG' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GNU Shishi 1.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/shishi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU Shishi 1.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-largefile omit support for large files --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-random-device device with (strong) randomness (for Nettle) --enable-pseudo-random-device device with pseudo randomness (for Nettle) --enable-nonce-device device with unpredictable nonces (for Nettle) --enable-ld-version-script enable linker version script (default is enabled when possible) --enable-valgrind-tests run self tests under valgrind --disable-pam Don't use PAM even if available --disable-ipv6 Don't use IPv6 even if available --disable-starttls disable non-standard STARTTLS --enable-gtk-doc use gtk-doc to build documentation [[default=no]] --enable-gtk-doc-html build documentation in html format [[default=yes]] --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] --disable-des disable DES related encryption/checksum types --disable-3des disable 3DES encryption/checksum type --disable-aes disable AES encryption/checksum types --disable-md disable unkeyed MD4/MD5 checksum types --disable-null disable dummy NULL encryption/checksum type --disable-arcfour disable ARCFOUR encryption/checksum type --enable-gcc-warnings turn on lots of GCC warnings (for developers) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-libgcrypt use libgcrypt for low-level crypto --with-libgcrypt-prefix[=DIR] search for libgcrypt in DIR/include and DIR/lib --without-libgcrypt-prefix don't search for libgcrypt in includedir and libdir --with-packager String identifying the packager of this software --with-packager-version Packager-specific version information --with-packager-bug-reports Packager info for bug reports (URL/e-mail/...) --with-libresolv-prefix[=DIR] search for libresolv in DIR/include and DIR/lib --without-libresolv-prefix don't search for libresolv in includedir and libdir --with-pam-dir=DIR Where to install PAM module [[PREFIX/lib/security]] --without-stringprep don't use libidn for string processing even if available --with-libidn-prefix[=DIR] search for libidn in DIR/include and DIR/lib --without-libidn-prefix don't search for libidn in includedir and libdir --with-libtasn1-prefix[=DIR] search for libtasn1 in DIR/include and DIR/lib --without-libtasn1-prefix don't search for libtasn1 in includedir and libdir --with-libgnutls-prefix[=DIR] search for libgnutls in DIR/include and DIR/lib --without-libgnutls-prefix don't search for libgnutls in includedir and libdir --with-html-dir=PATH path to installed docs --with-conf-dir=DIR store configuration in DIR [[PREFIX/etc/shishi]] --with-skel-dir=DIR store template cfg in DIR [[PREFIX/etc/shishi]] --with-key-dir=DIR store host keys in DIR [[PREFIX/etc/shishi]] --with-db-dir=DIR Shisa database in DIR [[PREFIX/var/shishi]]) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor YACC The "Yet Another C Compiler" implementation to use. Defaults to 'bison -y'. Values other than 'bison -y' will most likely break on most systems. YFLAGS YFLAGS contains the list arguments that will be passed by default to Bison. This script will default YFLAGS to the empty string to avoid a default value of '-d' given by some make applications. PKG_CONFIG path to pkg-config utility Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU Shishi home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU Shishi configure 1.0.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------- ## ## Report this to bug-shishi@gnu.org ## ## --------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GNU Shishi $as_me 1.0.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs need-ngettext" as_fn_append ac_header_list " arpa/inet.h" as_fn_append ac_header_list " features.h" as_fn_append ac_header_list " sys/socket.h" as_fn_append ac_func_list " _set_invalid_parameter_handler" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " fcntl" as_fn_append ac_header_list " sys/stat.h" as_fn_append ac_header_list " netdb.h" as_fn_append ac_header_list " netinet/in.h" as_fn_append ac_func_list " getdelim" as_fn_append ac_func_list " getdtablesize" as_fn_append ac_header_list " sys/param.h" as_fn_append ac_header_list " stdio_ext.h" as_fn_append ac_header_list " termios.h" as_fn_append ac_func_list " __fsetlocking" as_fn_append ac_func_list " tcgetattr" as_fn_append ac_func_list " tcsetattr" as_fn_append ac_func_list " getsubopt" as_fn_append ac_func_list " gettimeofday" as_fn_append ac_func_list " nanotime" as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " sys/mman.h" as_fn_append ac_func_list " mprotect" as_fn_append ac_header_list " sys/select.h" as_fn_append ac_func_list " setenv" as_fn_append ac_func_list " snprintf" as_fn_append ac_func_list " lstat" as_fn_append ac_header_list " wchar.h" as_fn_append ac_header_list " stdint.h" as_fn_append ac_func_list " strdup" as_fn_append ac_header_list " strings.h" as_fn_append ac_func_list " strndup" as_fn_append ac_header_list " sys/uio.h" as_fn_append ac_func_list " localtime_r" as_fn_append ac_func_list " timegm" as_fn_append ac_func_list " vasnprintf" gl_getopt_required=GNU as_fn_append ac_header_list " getopt.h" as_fn_append ac_header_list " xlocale.h" as_fn_append ac_func_list " readlinkat" as_fn_append ac_func_list " readlink" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='shishi' VERSION='1.0.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Library code modified: REVISION++ # Interfaces changed/added/removed: CURRENT++ REVISION=0 # Interfaces added: AGE++ # Interfaces removed: AGE=0 LT_CURRENT=1 LT_REVISION=2 LT_AGE=1 # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 $as_echo_n "checking for Minix Amsterdam compiler... " >&6; } if ${gl_cv_c_amsterdam_compiler+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ACK__ Amsterdam #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Amsterdam" >/dev/null 2>&1; then : gl_cv_c_amsterdam_compiler=yes else gl_cv_c_amsterdam_compiler=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 $as_echo "$gl_cv_c_amsterdam_compiler" >&6; } if test -z "$AR"; then if test $gl_cv_c_amsterdam_compiler = yes; then AR='cc -c.a' if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="ar" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -z "$ARFLAGS"; then ARFLAGS='cru' fi fi else if test -z "$ARFLAGS"; then ARFLAGS='cru' fi fi if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 $as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; } if ${ac_cv_should_define__xopen_source+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_should_define__xopen_source=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 $as_echo "$ac_cv_should_define__xopen_source" >&6; } test $ac_cv_should_define__xopen_source = yes && $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi $as_echo "#define _DARWIN_USE_64_BIT_INODE 1" >>confdefs.h fi case $ac_cv_prog_cc_stdc in #( no) : ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 else ac_cv_prog_cc_stdc=no fi fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 $as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } if ${ac_cv_prog_cc_stdc+:} false; then : $as_echo_n "(cached) " >&6 fi case $ac_cv_prog_cc_stdc in #( no) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; #( '') : { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 $as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; esac # Code from module alloca: # Code from module alloca-opt: # Code from module arpa_inet: # Code from module autobuild: if test -z "$AB_PACKAGE"; then AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE} fi { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild project... $AB_PACKAGE" >&5 $as_echo "$as_me: autobuild project... $AB_PACKAGE" >&6;} if test -z "$AB_VERSION"; then AB_VERSION=${PACKAGE_VERSION:-$VERSION} fi { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild revision... $AB_VERSION" >&5 $as_echo "$as_me: autobuild revision... $AB_VERSION" >&6;} hostname=`hostname` if test "$hostname"; then { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild hostname... $hostname" >&5 $as_echo "$as_me: autobuild hostname... $hostname" >&6;} fi date=`TZ=UTC0 date +%Y%m%dT%H%M%SZ` if test "$?" != 0; then date=`date` fi if test "$date"; then { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild timestamp... $date" >&5 $as_echo "$as_me: autobuild timestamp... $date" >&6;} fi # Code from module base64: # Code from module bind: # Code from module c-ctype: # Code from module clock-time: # Code from module close: # Code from module connect: # Code from module crc: # Code from module crypto/arcfour: # Code from module crypto/des: # Code from module crypto/gc: # Code from module crypto/gc-des: # Code from module crypto/gc-hmac-md5: # Code from module crypto/gc-hmac-sha1: # Code from module crypto/gc-md4: # Code from module crypto/gc-md5: # Code from module crypto/gc-pbkdf2-sha1: # Code from module crypto/gc-random: # Code from module crypto/hmac-md5: # Code from module crypto/hmac-sha1: # Code from module crypto/md4: # Code from module crypto/md5: # Code from module crypto/sha1: # Code from module dosname: # Code from module dup2: # Code from module environ: # Code from module errno: # Code from module extensions: # Code from module extern-inline: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module fdl-1.3: # Code from module float: # Code from module fseek: # Code from module fseeko: # Code from module fstat: # Code from module ftell: # Code from module ftello: # Code from module gendocs: # Code from module getaddrinfo: # Code from module getdelim: # Code from module getdomainname: # Code from module getdtablesize: # Code from module gethostname: # Code from module getline: # Code from module getpass: # Code from module getpeername: # Code from module getsubopt: # Code from module gettext-h: # Code from module gettime: # Code from module gettimeofday: # Code from module gnumakefile: # Code from module gnupload: # Code from module havelib: # Code from module hostent: # Code from module include_next: # Code from module inet_ntop: # Code from module intprops: # Code from module largefile: # Code from module lib-msvc-compat: # Code from module lib-symbol-versions: # Code from module lseek: # Code from module maintainer-makefile: # Code from module malloc-posix: # Code from module malloca: # Code from module manywarnings: # Code from module memchr: # Code from module memxor: # Code from module minmax: # Code from module mktime: # Code from module mktime-internal: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module netdb: # Code from module netinet_in: # Code from module parse-datetime: # Code from module pathmax: # Code from module pmccabe2html: # Code from module rawmemchr: # Code from module read-file: # Code from module realloc-posix: # Code from module recvfrom: # Code from module select: # Code from module sendto: # Code from module servent: # Code from module setenv: # Code from module shutdown: # Code from module signal: # Code from module signal-h: # Code from module size_max: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module snprintf: # Code from module socket: # Code from module socketlib: # Code from module sockets: # Code from module socklen: # Code from module ssize_t: # Code from module stat: # Code from module stdalign: # Code from module stdarg: # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module strcase: # Code from module strchrnul: # Code from module strdup-posix: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strndup: # Code from module strnlen: # Code from module strtok_r: # Code from module strverscmp: # Code from module sys_select: # Code from module sys_socket: # Code from module sys_stat: # Code from module sys_time: # Code from module sys_types: # Code from module sys_uio: # Code from module time: # Code from module time_r: # Code from module timegm: # Code from module timespec: # Code from module unistd: # Code from module unsetenv: # Code from module update-copyright: # Code from module useless-if-before-free: # Code from module valgrind-tests: # Code from module vasnprintf: # Code from module vasprintf: # Code from module vc-list-files: # Code from module verify: # Code from module warnings: # Code from module wchar: # Code from module xalloc: # Code from module xalloc-oversized: # Code from module xgetdomainname: # Code from module xgethostname: # Code from module xsize: # Code from module xstrndup: # Code from module xvasprintf: # Code from module errno: # Code from module error: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module locale: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module nocrash: # Code from module progname: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module stddef: # Code from module strerror: # Code from module strerror-override: # Code from module verify: # Code from module version-etc: # Code from module allocator: # Code from module areadlink: # Code from module careadlinkat: # Code from module readlink: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in termios.h pwd.h syslog.h arpa/nameser.h netinet/in6.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in resolv.h do : ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "#include #include #ifdef HAVE_ARPA_NAMESER_H # include #endif " if test "x$ac_cv_header_resolv_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RESOLV_H 1 _ACEOF fi done # Used when creating libshishi-XX.def. SOVERSION=`expr ${LT_CURRENT} - ${LT_AGE}` # Checks for programs. if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: PERL=${PERL-"${am_missing_run}perl"} HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"} ASN1PARSER=${ASN1PARSER-"${am_missing_run}asn1Parser"} GENGETOPT=${GENGETOPT-"${am_missing_run}gengetopt"} DIA=${DIA-"${am_missing_run}dia"} # Internationalization. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.18 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF ac_fn_c_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" "$ac_includes_default" if test "x$ac_cv_have_decl_h_errno" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_H_ERRNO $ac_have_decl _ACEOF # For gnulib stuff in gl/. with_libgcrypt=yes $as_echo "#define OK_TO_USE_1S_CLOCK 1" >>confdefs.h LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi GNULIB_INET_NTOP=0; GNULIB_INET_PTON=0; HAVE_DECL_INET_NTOP=1; HAVE_DECL_INET_PTON=1; REPLACE_INET_NTOP=0; REPLACE_INET_PTON=0; for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5 $as_echo_n "checking whether the preprocessor supports include_next... " >&6; } if ${gl_cv_have_include_next+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_have_include_next=yes else CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_have_include_next=buggy else gl_cv_have_include_next=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5 $as_echo "$gl_cv_have_include_next" >&6; } PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5 $as_echo_n "checking whether system header files limit the line length... " >&6; } if ${gl_cv_pragma_columns+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __TANDEM choke me #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "choke me" >/dev/null 2>&1; then : gl_cv_pragma_columns=yes else gl_cv_pragma_columns=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5 $as_echo "$gl_cv_pragma_columns" >&6; } if test $gl_cv_pragma_columns = yes; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac GNULIB_SOCKET=0; GNULIB_CONNECT=0; GNULIB_ACCEPT=0; GNULIB_BIND=0; GNULIB_GETPEERNAME=0; GNULIB_GETSOCKNAME=0; GNULIB_GETSOCKOPT=0; GNULIB_LISTEN=0; GNULIB_RECV=0; GNULIB_SEND=0; GNULIB_RECVFROM=0; GNULIB_SENDTO=0; GNULIB_SETSOCKOPT=0; GNULIB_SHUTDOWN=0; GNULIB_ACCEPT4=0; HAVE_STRUCT_SOCKADDR_STORAGE=1; HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1; HAVE_SA_FAMILY_T=1; HAVE_ACCEPT4=1; if test $ac_cv_header_sys_socket_h = no; then for ac_header in ws2tcpip.h do : ac_fn_c_check_header_mongrel "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" if test "x$ac_cv_header_ws2tcpip_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WS2TCPIP_H 1 _ACEOF fi done fi GNULIB_CHDIR=0; GNULIB_CHOWN=0; GNULIB_CLOSE=0; GNULIB_DUP=0; GNULIB_DUP2=0; GNULIB_DUP3=0; GNULIB_ENVIRON=0; GNULIB_EUIDACCESS=0; GNULIB_FACCESSAT=0; GNULIB_FCHDIR=0; GNULIB_FCHOWNAT=0; GNULIB_FDATASYNC=0; GNULIB_FSYNC=0; GNULIB_FTRUNCATE=0; GNULIB_GETCWD=0; GNULIB_GETDOMAINNAME=0; GNULIB_GETDTABLESIZE=0; GNULIB_GETGROUPS=0; GNULIB_GETHOSTNAME=0; GNULIB_GETLOGIN=0; GNULIB_GETLOGIN_R=0; GNULIB_GETPAGESIZE=0; GNULIB_GETUSERSHELL=0; GNULIB_GROUP_MEMBER=0; GNULIB_ISATTY=0; GNULIB_LCHOWN=0; GNULIB_LINK=0; GNULIB_LINKAT=0; GNULIB_LSEEK=0; GNULIB_PIPE=0; GNULIB_PIPE2=0; GNULIB_PREAD=0; GNULIB_PWRITE=0; GNULIB_READ=0; GNULIB_READLINK=0; GNULIB_READLINKAT=0; GNULIB_RMDIR=0; GNULIB_SETHOSTNAME=0; GNULIB_SLEEP=0; GNULIB_SYMLINK=0; GNULIB_SYMLINKAT=0; GNULIB_TTYNAME_R=0; GNULIB_UNISTD_H_NONBLOCKING=0; GNULIB_UNISTD_H_SIGPIPE=0; GNULIB_UNLINK=0; GNULIB_UNLINKAT=0; GNULIB_USLEEP=0; GNULIB_WRITE=0; HAVE_CHOWN=1; HAVE_DUP2=1; HAVE_DUP3=1; HAVE_EUIDACCESS=1; HAVE_FACCESSAT=1; HAVE_FCHDIR=1; HAVE_FCHOWNAT=1; HAVE_FDATASYNC=1; HAVE_FSYNC=1; HAVE_FTRUNCATE=1; HAVE_GETDTABLESIZE=1; HAVE_GETGROUPS=1; HAVE_GETHOSTNAME=1; HAVE_GETLOGIN=1; HAVE_GETPAGESIZE=1; HAVE_GROUP_MEMBER=1; HAVE_LCHOWN=1; HAVE_LINK=1; HAVE_LINKAT=1; HAVE_PIPE=1; HAVE_PIPE2=1; HAVE_PREAD=1; HAVE_PWRITE=1; HAVE_READLINK=1; HAVE_READLINKAT=1; HAVE_SETHOSTNAME=1; HAVE_SLEEP=1; HAVE_SYMLINK=1; HAVE_SYMLINKAT=1; HAVE_UNLINKAT=1; HAVE_USLEEP=1; HAVE_DECL_ENVIRON=1; HAVE_DECL_FCHDIR=1; HAVE_DECL_FDATASYNC=1; HAVE_DECL_GETDOMAINNAME=1; HAVE_DECL_GETLOGIN_R=1; HAVE_DECL_GETPAGESIZE=1; HAVE_DECL_GETUSERSHELL=1; HAVE_DECL_SETHOSTNAME=1; HAVE_DECL_TTYNAME_R=1; HAVE_OS_H=0; HAVE_SYS_PARAM_H=0; REPLACE_CHOWN=0; REPLACE_CLOSE=0; REPLACE_DUP=0; REPLACE_DUP2=0; REPLACE_FCHOWNAT=0; REPLACE_FTRUNCATE=0; REPLACE_GETCWD=0; REPLACE_GETDOMAINNAME=0; REPLACE_GETLOGIN_R=0; REPLACE_GETGROUPS=0; REPLACE_GETPAGESIZE=0; REPLACE_ISATTY=0; REPLACE_LCHOWN=0; REPLACE_LINK=0; REPLACE_LINKAT=0; REPLACE_LSEEK=0; REPLACE_PREAD=0; REPLACE_PWRITE=0; REPLACE_READ=0; REPLACE_READLINK=0; REPLACE_RMDIR=0; REPLACE_SLEEP=0; REPLACE_SYMLINK=0; REPLACE_TTYNAME_R=0; REPLACE_UNLINK=0; REPLACE_UNLINKAT=0; REPLACE_USLEEP=0; REPLACE_WRITE=0; UNISTD_H_HAVE_WINSOCK2_H=0; UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; case "$host_os" in osf*) $as_echo "#define _POSIX_PII_SOCKET 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_socket_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_selfcontained=yes else gl_cv_header_sys_socket_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_socket_h_selfcontained" >&6; } if test $gl_cv_header_sys_socket_h_selfcontained = yes; then for ac_func in shutdown do : ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown" if test "x$ac_cv_func_shutdown" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SHUTDOWN 1 _ACEOF fi done if test $ac_cv_func_shutdown = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines the SHUT_* macros" >&5 $as_echo_n "checking whether defines the SHUT_* macros... " >&6; } if ${gl_cv_header_sys_socket_h_shut+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR }; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_shut=yes else gl_cv_header_sys_socket_h_shut=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_shut" >&5 $as_echo "$gl_cv_header_sys_socket_h_shut" >&6; } if test $gl_cv_header_sys_socket_h_shut = no; then SYS_SOCKET_H='sys/socket.h' fi fi fi # We need to check for ws2tcpip.h now. if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_socket_h='<'sys/socket.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_socket_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_socket_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/socket.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_socket_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_socket_h='<'sys/socket.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_socket_h" >&5 $as_echo "$gl_cv_next_sys_socket_h" >&6; } fi NEXT_SYS_SOCKET_H=$gl_cv_next_sys_socket_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/socket.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_socket_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H=$gl_next_as_first_directive if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 HAVE_WS2TCPIP_H=0 else HAVE_SYS_SOCKET_H=0 if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_struct_sockaddr_storage" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_sa_family_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SA_FAMILY_T 1 _ACEOF fi if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 _ACEOF else HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0 fi fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then SYS_SOCKET_H='sys/socket.h' fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi for gl_func in socket connect accept bind getpeername getsockname getsockopt listen recv send recvfrom sendto setsockopt shutdown accept4; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Some systems require prerequisite headers. */ #include #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 $as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5 $as_echo_n "checking if environ is properly declared... " >&6; } if ${gt_cv_var_environ_declaration+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_UNISTD_H #include #endif /* mingw, BeOS, Haiku declare environ in , not in . */ #include extern struct { int foo; } environ; int main () { environ.foo = 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_var_environ_declaration=no else gt_cv_var_environ_declaration=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5 $as_echo "$gt_cv_var_environ_declaration" >&6; } if test $gt_cv_var_environ_declaration = yes; then $as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h fi if test $gt_cv_var_environ_declaration != yes; then HAVE_DECL_ENVIRON=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5 $as_echo_n "checking for complete errno.h... " >&6; } if ${gl_cv_header_errno_h_complete+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "booboo" >/dev/null 2>&1; then : gl_cv_header_errno_h_complete=no else gl_cv_header_errno_h_complete=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5 $as_echo "$gl_cv_header_errno_h_complete" >&6; } if test $gl_cv_header_errno_h_complete = yes; then ERRNO_H='' else if test $gl_cv_have_include_next = yes; then gl_cv_next_errno_h='<'errno.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_errno_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'errno.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_errno_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5 $as_echo "$gl_cv_next_errno_h" >&6; } fi NEXT_ERRNO_H=$gl_cv_next_errno_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'errno.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_errno_h fi NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive ERRNO_H='errno.h' fi if test -n "$ERRNO_H"; then GL_GENERATE_ERRNO_H_TRUE= GL_GENERATE_ERRNO_H_FALSE='#' else GL_GENERATE_ERRNO_H_TRUE='#' GL_GENERATE_ERRNO_H_FALSE= fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5 $as_echo_n "checking for EMULTIHOP value... " >&6; } if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EMULTIHOP=yes else gl_cv_header_errno_h_EMULTIHOP=no fi rm -f conftest* if test $gl_cv_header_errno_h_EMULTIHOP = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EMULTIHOP=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5 $as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; } case $gl_cv_header_errno_h_EMULTIHOP in yes | no) EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE= ;; *) EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP" ;; esac fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5 $as_echo_n "checking for ENOLINK value... " >&6; } if ${gl_cv_header_errno_h_ENOLINK+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_ENOLINK=yes else gl_cv_header_errno_h_ENOLINK=no fi rm -f conftest* if test $gl_cv_header_errno_h_ENOLINK = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_ENOLINK=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_ENOLINK = hidden; then if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5 $as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; } case $gl_cv_header_errno_h_ENOLINK in yes | no) ENOLINK_HIDDEN=0; ENOLINK_VALUE= ;; *) ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK" ;; esac fi if test -n "$ERRNO_H"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5 $as_echo_n "checking for EOVERFLOW value... " >&6; } if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EOVERFLOW=yes else gl_cv_header_errno_h_EOVERFLOW=no fi rm -f conftest* if test $gl_cv_header_errno_h_EOVERFLOW = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_header_errno_h_EOVERFLOW=hidden fi rm -f conftest* if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include "; then : fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5 $as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; } case $gl_cv_header_errno_h_EOVERFLOW in yes | no) EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE= ;; *) EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW" ;; esac fi GNULIB_FCNTL=0; GNULIB_NONBLOCKING=0; GNULIB_OPEN=0; GNULIB_OPENAT=0; HAVE_FCNTL=1; HAVE_OPENAT=1; REPLACE_FCNTL=0; REPLACE_OPEN=0; REPLACE_OPENAT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5 $as_echo_n "checking for working fcntl.h... " >&6; } if ${gl_cv_header_working_fcntl_h+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_header_working_fcntl_h=cross-compiling else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; int main () { int status = !constants; { static char const sym[] = "conftest.sym"; if (symlink (".", sym) != 0 || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0) status |= 32; unlink (sym); } { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); char c; struct stat st0, st1; if (fd < 0 || fstat (fd, &st0) != 0 || sleep (1) != 0 || read (fd, &c, 1) != 1 || close (fd) != 0 || stat (file, &st1) != 0 || st0.st_atime != st1.st_atime) status |= 64; } return status; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_header_working_fcntl_h=yes else case $? in #( 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5 $as_echo "$gl_cv_header_working_fcntl_h" >&6; } case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac cat >>confdefs.h <<_ACEOF #define HAVE_WORKING_O_NOATIME $ac_val _ACEOF case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac cat >>confdefs.h <<_ACEOF #define HAVE_WORKING_O_NOFOLLOW $ac_val _ACEOF ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi GNULIB_DPRINTF=0; GNULIB_FCLOSE=0; GNULIB_FDOPEN=0; GNULIB_FFLUSH=0; GNULIB_FGETC=0; GNULIB_FGETS=0; GNULIB_FOPEN=0; GNULIB_FPRINTF=0; GNULIB_FPRINTF_POSIX=0; GNULIB_FPURGE=0; GNULIB_FPUTC=0; GNULIB_FPUTS=0; GNULIB_FREAD=0; GNULIB_FREOPEN=0; GNULIB_FSCANF=0; GNULIB_FSEEK=0; GNULIB_FSEEKO=0; GNULIB_FTELL=0; GNULIB_FTELLO=0; GNULIB_FWRITE=0; GNULIB_GETC=0; GNULIB_GETCHAR=0; GNULIB_GETDELIM=0; GNULIB_GETLINE=0; GNULIB_OBSTACK_PRINTF=0; GNULIB_OBSTACK_PRINTF_POSIX=0; GNULIB_PCLOSE=0; GNULIB_PERROR=0; GNULIB_POPEN=0; GNULIB_PRINTF=0; GNULIB_PRINTF_POSIX=0; GNULIB_PUTC=0; GNULIB_PUTCHAR=0; GNULIB_PUTS=0; GNULIB_REMOVE=0; GNULIB_RENAME=0; GNULIB_RENAMEAT=0; GNULIB_SCANF=0; GNULIB_SNPRINTF=0; GNULIB_SPRINTF_POSIX=0; GNULIB_STDIO_H_NONBLOCKING=0; GNULIB_STDIO_H_SIGPIPE=0; GNULIB_TMPFILE=0; GNULIB_VASPRINTF=0; GNULIB_VFSCANF=0; GNULIB_VSCANF=0; GNULIB_VDPRINTF=0; GNULIB_VFPRINTF=0; GNULIB_VFPRINTF_POSIX=0; GNULIB_VPRINTF=0; GNULIB_VPRINTF_POSIX=0; GNULIB_VSNPRINTF=0; GNULIB_VSPRINTF_POSIX=0; HAVE_DECL_FPURGE=1; HAVE_DECL_FSEEKO=1; HAVE_DECL_FTELLO=1; HAVE_DECL_GETDELIM=1; HAVE_DECL_GETLINE=1; HAVE_DECL_OBSTACK_PRINTF=1; HAVE_DECL_SNPRINTF=1; HAVE_DECL_VSNPRINTF=1; HAVE_DPRINTF=1; HAVE_FSEEKO=1; HAVE_FTELLO=1; HAVE_PCLOSE=1; HAVE_POPEN=1; HAVE_RENAMEAT=1; HAVE_VASPRINTF=1; HAVE_VDPRINTF=1; REPLACE_DPRINTF=0; REPLACE_FCLOSE=0; REPLACE_FDOPEN=0; REPLACE_FFLUSH=0; REPLACE_FOPEN=0; REPLACE_FPRINTF=0; REPLACE_FPURGE=0; REPLACE_FREOPEN=0; REPLACE_FSEEK=0; REPLACE_FSEEKO=0; REPLACE_FTELL=0; REPLACE_FTELLO=0; REPLACE_GETDELIM=0; REPLACE_GETLINE=0; REPLACE_OBSTACK_PRINTF=0; REPLACE_PERROR=0; REPLACE_POPEN=0; REPLACE_PRINTF=0; REPLACE_REMOVE=0; REPLACE_RENAME=0; REPLACE_RENAMEAT=0; REPLACE_SNPRINTF=0; REPLACE_SPRINTF=0; REPLACE_STDIO_READ_FUNCS=0; REPLACE_STDIO_WRITE_FUNCS=0; REPLACE_TMPFILE=0; REPLACE_VASPRINTF=0; REPLACE_VDPRINTF=0; REPLACE_VFPRINTF=0; REPLACE_VPRINTF=0; REPLACE_VSNPRINTF=0; REPLACE_VSPRINTF=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdin defaults to large file offsets" >&5 $as_echo_n "checking whether stdin defaults to large file offsets... " >&6; } if ${gl_cv_var_stdin_large_offset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if defined __SL64 && defined __SCLE /* cygwin */ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and it is easier to do a version check than building a runtime test. */ # include # if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) choke me # endif #endif ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_var_stdin_large_offset=yes else gl_cv_var_stdin_large_offset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var_stdin_large_offset" >&5 $as_echo "$gl_cv_var_stdin_large_offset" >&6; } case "$host_os" in mingw*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5 $as_echo_n "checking for 64-bit off_t... " >&6; } if ${gl_cv_type_off_t_64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_type_off_t_64=yes else gl_cv_type_off_t_64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5 $as_echo "$gl_cv_type_off_t_64" >&6; } if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi WINDOWS_64_BIT_ST_SIZE=1 ;; *) WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_types_h='<'sys/types.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_types_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/types.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_types_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5 $as_echo "$gl_cv_next_sys_types_h" >&6; } fi NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/types.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_types_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive ac_fn_c_check_decl "$LINENO" "fseeko" "ac_cv_have_decl_fseeko" "$ac_includes_default" if test "x$ac_cv_have_decl_fseeko" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FSEEKO $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5 $as_echo_n "checking for fseeko... " >&6; } if ${gl_cv_func_fseeko+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { fseeko (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_fseeko=yes else gl_cv_func_fseeko=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5 $as_echo "$gl_cv_func_fseeko" >&6; } if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi fi GNULIB_FCHMODAT=0; GNULIB_FSTAT=0; GNULIB_FSTATAT=0; GNULIB_FUTIMENS=0; GNULIB_LCHMOD=0; GNULIB_LSTAT=0; GNULIB_MKDIRAT=0; GNULIB_MKFIFO=0; GNULIB_MKFIFOAT=0; GNULIB_MKNOD=0; GNULIB_MKNODAT=0; GNULIB_STAT=0; GNULIB_UTIMENSAT=0; HAVE_FCHMODAT=1; HAVE_FSTATAT=1; HAVE_FUTIMENS=1; HAVE_LCHMOD=1; HAVE_LSTAT=1; HAVE_MKDIRAT=1; HAVE_MKFIFO=1; HAVE_MKFIFOAT=1; HAVE_MKNOD=1; HAVE_MKNODAT=1; HAVE_UTIMENSAT=1; REPLACE_FSTAT=0; REPLACE_FSTATAT=0; REPLACE_FUTIMENS=0; REPLACE_LSTAT=0; REPLACE_MKDIR=0; REPLACE_MKFIFO=0; REPLACE_MKNOD=0; REPLACE_STAT=0; REPLACE_UTIMENSAT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 $as_echo_n "checking whether stat file-mode macros are broken... " >&6; } if ${ac_cv_header_stat_broken+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stat_broken=no else ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then $as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h fi if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_stat_h='<'sys/stat.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_stat_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_stat_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/stat.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_stat_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_stat_h='<'sys/stat.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5 $as_echo "$gl_cv_next_sys_stat_h" >&6; } fi NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/stat.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_stat_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive if test $WINDOWS_64_BIT_ST_SIZE = 1; then $as_echo "#define _GL_WINDOWS_64_BIT_ST_SIZE 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include #include " if test "x$ac_cv_type_nlink_t" = xyes; then : else $as_echo "#define nlink_t int" >>confdefs.h fi for gl_func in fchmodat fstat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat mknod mknodat stat utimensat; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done ac_fn_c_check_decl "$LINENO" "ftello" "ac_cv_have_decl_ftello" "$ac_includes_default" if test "x$ac_cv_have_decl_ftello" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FTELLO $ac_have_decl _ACEOF if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5 $as_echo_n "checking for ftello... " >&6; } if ${gl_cv_func_ftello+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ftello (stdin); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ftello=yes else gl_cv_func_ftello=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5 $as_echo "$gl_cv_func_ftello" >&6; } if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5 $as_echo_n "checking whether ftello works... " >&6; } if ${gl_cv_func_ftello_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) return 71; if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) return 74; if (!(getc (fp) == 'h')) return 1; if (!(getc (fp) == EOF)) return 2; if (!(ftell (fp) == 8)) return 3; if (!(ftell (fp) == 8)) return 4; if (!(putc ('!', fp) == '!')) return 5; if (!(ftell (fp) == 9)) return 6; if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) return 10; if (!(memcmp (buf, "foogarsh!", 9) == 0)) return 11; } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_ftello_works=yes else gl_cv_func_ftello_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5 $as_echo "$gl_cv_func_ftello_works" >&6; } case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 $as_echo "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h ;; esac fi fi GNULIB_GETADDRINFO=0; HAVE_STRUCT_ADDRINFO=1; HAVE_DECL_FREEADDRINFO=1; HAVE_DECL_GAI_STRERROR=1; HAVE_DECL_GETADDRINFO=1; HAVE_DECL_GETNAMEINFO=1; REPLACE_GAI_STRERROR=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_netdb_h='<'netdb.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_netdb_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_netdb_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'netdb.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_netdb_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_netdb_h='<'netdb.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netdb_h" >&5 $as_echo "$gl_cv_next_netdb_h" >&6; } fi NEXT_NETDB_H=$gl_cv_next_netdb_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'netdb.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_netdb_h fi NEXT_AS_FIRST_DIRECTIVE_NETDB_H=$gl_next_as_first_directive if test $ac_cv_header_netdb_h = yes; then HAVE_NETDB_H=1 else HAVE_NETDB_H=0 fi for gl_func in getaddrinfo freeaddrinfo gai_strerror getnameinfo; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done HOSTENT_LIB= gl_saved_libs="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl network net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_gethostbyname" != "none required"; then HOSTENT_LIB="$ac_cv_search_gethostbyname" fi fi LIBS="$gl_saved_libs" if test -z "$HOSTENT_LIB"; then for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in winsock2.h and -lws2_32" >&5 $as_echo_n "checking for gethostbyname in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_w32_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_gethostbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #endif #include int main () { gethostbyname(NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_gethostbyname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_gethostbyname" >&5 $as_echo "$gl_cv_w32_gethostbyname" >&6; } if test "$gl_cv_w32_gethostbyname" = "yes"; then HOSTENT_LIB="-lws2_32" fi fi done fi SERVENT_LIB= gl_saved_libs="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyname" >&5 $as_echo_n "checking for library containing getservbyname... " >&6; } if ${ac_cv_search_getservbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getservbyname (); int main () { return getservbyname (); ; return 0; } _ACEOF for ac_lib in '' socket network net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getservbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getservbyname+:} false; then : break fi done if ${ac_cv_search_getservbyname+:} false; then : else ac_cv_search_getservbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyname" >&5 $as_echo "$ac_cv_search_getservbyname" >&6; } ac_res=$ac_cv_search_getservbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_getservbyname" != "none required"; then SERVENT_LIB="$ac_cv_search_getservbyname" fi fi LIBS="$gl_saved_libs" if test -z "$SERVENT_LIB"; then for ac_func in getservbyname do : ac_fn_c_check_func "$LINENO" "getservbyname" "ac_cv_func_getservbyname" if test "x$ac_cv_func_getservbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETSERVBYNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getservbyname in winsock2.h and -lws2_32" >&5 $as_echo_n "checking for getservbyname in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_w32_getservbyname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_getservbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #endif #include int main () { getservbyname(NULL,NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_getservbyname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getservbyname" >&5 $as_echo "$gl_cv_w32_getservbyname" >&6; } if test "$gl_cv_w32_getservbyname" = "yes"; then SERVENT_LIB="-lws2_32" fi fi done fi HAVE_INET_NTOP=1 INET_NTOP_LIB= if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $HAVE_WINSOCK2_H = 1; then ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include " if test "x$ac_cv_have_decl_inet_ntop" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_INET_NTOP $ac_have_decl _ACEOF if test $ac_cv_have_decl_inet_ntop = yes; then REPLACE_INET_NTOP=1 INET_NTOP_LIB="-lws2_32" else HAVE_DECL_INET_NTOP=0 HAVE_INET_NTOP=0 fi else gl_save_LIBS=$LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 $as_echo_n "checking for library containing inet_ntop... " >&6; } if ${ac_cv_search_inet_ntop+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntop (); int main () { return inet_ntop (); ; return 0; } _ACEOF for ac_lib in '' nsl resolv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_inet_ntop=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_inet_ntop+:} false; then : break fi done if ${ac_cv_search_inet_ntop+:} false; then : else ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 $as_echo "$ac_cv_search_inet_ntop" >&6; } ac_res=$ac_cv_search_inet_ntop if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else for ac_func in inet_ntop do : ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" if test "x$ac_cv_func_inet_ntop" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INET_NTOP 1 _ACEOF fi done if test $ac_cv_func_inet_ntop = no; then HAVE_INET_NTOP=0 fi fi LIBS=$gl_save_LIBS if test "$ac_cv_search_inet_ntop" != "no" \ && test "$ac_cv_search_inet_ntop" != "none required"; then INET_NTOP_LIB="$ac_cv_search_inet_ntop" fi ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include #if HAVE_NETDB_H # include #endif " if test "x$ac_cv_have_decl_inet_ntop" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_INET_NTOP $ac_have_decl _ACEOF if test $ac_cv_have_decl_inet_ntop = no; then HAVE_DECL_INET_NTOP=0 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv4 sockets" >&5 $as_echo_n "checking for IPv4 sockets... " >&6; } if ${gl_cv_socket_ipv4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif int main () { int x = AF_INET; struct in_addr y; struct sockaddr_in z; if (&x && &y && &z) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socket_ipv4=yes else gl_cv_socket_ipv4=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv4" >&5 $as_echo "$gl_cv_socket_ipv4" >&6; } if test $gl_cv_socket_ipv4 = yes; then $as_echo "#define HAVE_IPV4 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 sockets" >&5 $as_echo_n "checking for IPv6 sockets... " >&6; } if ${gl_cv_socket_ipv6+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif int main () { int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z; if (&x && &y && &z) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socket_ipv6=yes else gl_cv_socket_ipv6=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv6" >&5 $as_echo "$gl_cv_socket_ipv6" >&6; } if test $gl_cv_socket_ipv6 = yes; then $as_echo "#define HAVE_IPV6 1" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default" if test "x$ac_cv_have_decl_getdelim" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETDELIM $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default" if test "x$ac_cv_have_decl_getline" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETLINE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getpass" "ac_cv_have_decl_getpass" "$ac_includes_default" if test "x$ac_cv_have_decl_getpass" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETPASS $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fflush_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "flockfile" "ac_cv_have_decl_flockfile" "$ac_includes_default" if test "x$ac_cv_have_decl_flockfile" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FLOCKFILE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_fputs_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "funlockfile" "ac_cv_have_decl_funlockfile" "$ac_includes_default" if test "x$ac_cv_have_decl_funlockfile" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FUNLOCKFILE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_putc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl _ACEOF GNULIB__EXIT=0; GNULIB_ATOLL=0; GNULIB_CALLOC_POSIX=0; GNULIB_CANONICALIZE_FILE_NAME=0; GNULIB_GETLOADAVG=0; GNULIB_GETSUBOPT=0; GNULIB_GRANTPT=0; GNULIB_MALLOC_POSIX=0; GNULIB_MBTOWC=0; GNULIB_MKDTEMP=0; GNULIB_MKOSTEMP=0; GNULIB_MKOSTEMPS=0; GNULIB_MKSTEMP=0; GNULIB_MKSTEMPS=0; GNULIB_POSIX_OPENPT=0; GNULIB_PTSNAME=0; GNULIB_PTSNAME_R=0; GNULIB_PUTENV=0; GNULIB_RANDOM=0; GNULIB_RANDOM_R=0; GNULIB_REALLOC_POSIX=0; GNULIB_REALPATH=0; GNULIB_RPMATCH=0; GNULIB_SECURE_GETENV=0; GNULIB_SETENV=0; GNULIB_STRTOD=0; GNULIB_STRTOLL=0; GNULIB_STRTOULL=0; GNULIB_SYSTEM_POSIX=0; GNULIB_UNLOCKPT=0; GNULIB_UNSETENV=0; GNULIB_WCTOMB=0; HAVE__EXIT=1; HAVE_ATOLL=1; HAVE_CANONICALIZE_FILE_NAME=1; HAVE_DECL_GETLOADAVG=1; HAVE_GETSUBOPT=1; HAVE_GRANTPT=1; HAVE_MKDTEMP=1; HAVE_MKOSTEMP=1; HAVE_MKOSTEMPS=1; HAVE_MKSTEMP=1; HAVE_MKSTEMPS=1; HAVE_POSIX_OPENPT=1; HAVE_PTSNAME=1; HAVE_PTSNAME_R=1; HAVE_RANDOM=1; HAVE_RANDOM_H=1; HAVE_RANDOM_R=1; HAVE_REALPATH=1; HAVE_RPMATCH=1; HAVE_SECURE_GETENV=1; HAVE_SETENV=1; HAVE_DECL_SETENV=1; HAVE_STRTOD=1; HAVE_STRTOLL=1; HAVE_STRTOULL=1; HAVE_STRUCT_RANDOM_DATA=1; HAVE_SYS_LOADAVG_H=0; HAVE_UNLOCKPT=1; HAVE_DECL_UNSETENV=1; REPLACE_CALLOC=0; REPLACE_CANONICALIZE_FILE_NAME=0; REPLACE_MALLOC=0; REPLACE_MBTOWC=0; REPLACE_MKSTEMP=0; REPLACE_PTSNAME=0; REPLACE_PTSNAME_R=0; REPLACE_PUTENV=0; REPLACE_RANDOM_R=0; REPLACE_REALLOC=0; REPLACE_REALPATH=0; REPLACE_SETENV=0; REPLACE_STRTOD=0; REPLACE_UNSETENV=0; REPLACE_WCTOMB=0; : GNULIB_GETTIMEOFDAY=0; HAVE_GETTIMEOFDAY=1; HAVE_STRUCT_TIMEVAL=1; HAVE_SYS_TIME_H=1; REPLACE_GETTIMEOFDAY=0; REPLACE_STRUCT_TIMEVAL=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_time_h='<'sys/time.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_time_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_time_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/time.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_time_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_time_h='<'sys/time.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5 $as_echo "$gl_cv_next_sys_time_h" >&6; } fi NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/time.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_time_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive if test $ac_cv_header_sys_time_h != yes; then HAVE_SYS_TIME_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5 $as_echo_n "checking for struct timeval... " >&6; } if ${gl_cv_sys_struct_timeval+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif int main () { static struct timeval x; x.tv_sec = x.tv_usec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timeval=yes else gl_cv_sys_struct_timeval=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5 $as_echo "$gl_cv_sys_struct_timeval" >&6; } if test $gl_cv_sys_struct_timeval != yes; then HAVE_STRUCT_TIMEVAL=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5 $as_echo_n "checking for wide-enough struct timeval.tv_sec member... " >&6; } if ${gl_cv_sys_struct_timeval_tv_sec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif int main () { static struct timeval x; typedef int verify_tv_sec_type[ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1 ]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timeval_tv_sec=yes else gl_cv_sys_struct_timeval_tv_sec=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5 $as_echo "$gl_cv_sys_struct_timeval_tv_sec" >&6; } if test $gl_cv_sys_struct_timeval_tv_sec != yes; then REPLACE_STRUCT_TIMEVAL=1 fi fi for gl_func in gettimeofday; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H # include #endif #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5 $as_echo_n "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; } if ${gl_cv_func_malloc_posix+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_malloc_posix=yes else gl_cv_func_malloc_posix=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5 $as_echo "$gl_cv_func_malloc_posix" >&6; } for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_malloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_malloc_0_nonnull=no ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : gl_cv_func_malloc_0_nonnull=1 else gl_cv_func_malloc_0_nonnull=0 fi cat >>confdefs.h <<_ACEOF #define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 $as_echo_n "checking for long long int... " >&6; } if ${ac_cv_type_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63; int main () { /* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if test "$cross_compiling" = yes; then : ac_cv_type_long_long_int=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef LLONG_MAX # define HALF \ (1LL << (sizeof (long long int) * CHAR_BIT - 2)) # define LLONG_MAX (HALF - 1 + HALF) #endif int main () { long long int n = 1; int i; for (i = 0; ; i++) { long long int m = n << i; if (m >> i != n) return 1; if (LLONG_MAX / 2 < m) break; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_type_long_long_int=yes else ac_cv_type_long_long_int=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else ac_cv_type_long_long_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 $as_echo "$ac_cv_type_long_long_int" >&6; } if test $ac_cv_type_long_long_int = yes; then $as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h fi GNULIB_FFSL=0; GNULIB_FFSLL=0; GNULIB_MEMCHR=0; GNULIB_MEMMEM=0; GNULIB_MEMPCPY=0; GNULIB_MEMRCHR=0; GNULIB_RAWMEMCHR=0; GNULIB_STPCPY=0; GNULIB_STPNCPY=0; GNULIB_STRCHRNUL=0; GNULIB_STRDUP=0; GNULIB_STRNCAT=0; GNULIB_STRNDUP=0; GNULIB_STRNLEN=0; GNULIB_STRPBRK=0; GNULIB_STRSEP=0; GNULIB_STRSTR=0; GNULIB_STRCASESTR=0; GNULIB_STRTOK_R=0; GNULIB_MBSLEN=0; GNULIB_MBSNLEN=0; GNULIB_MBSCHR=0; GNULIB_MBSRCHR=0; GNULIB_MBSSTR=0; GNULIB_MBSCASECMP=0; GNULIB_MBSNCASECMP=0; GNULIB_MBSPCASECMP=0; GNULIB_MBSCASESTR=0; GNULIB_MBSCSPN=0; GNULIB_MBSPBRK=0; GNULIB_MBSSPN=0; GNULIB_MBSSEP=0; GNULIB_MBSTOK_R=0; GNULIB_STRERROR=0; GNULIB_STRERROR_R=0; GNULIB_STRSIGNAL=0; GNULIB_STRVERSCMP=0; HAVE_MBSLEN=0; HAVE_FFSL=1; HAVE_FFSLL=1; HAVE_MEMCHR=1; HAVE_DECL_MEMMEM=1; HAVE_MEMPCPY=1; HAVE_DECL_MEMRCHR=1; HAVE_RAWMEMCHR=1; HAVE_STPCPY=1; HAVE_STPNCPY=1; HAVE_STRCHRNUL=1; HAVE_DECL_STRDUP=1; HAVE_DECL_STRNDUP=1; HAVE_DECL_STRNLEN=1; HAVE_STRPBRK=1; HAVE_STRSEP=1; HAVE_STRCASESTR=1; HAVE_DECL_STRTOK_R=1; HAVE_DECL_STRERROR_R=1; HAVE_DECL_STRSIGNAL=1; HAVE_STRVERSCMP=1; REPLACE_MEMCHR=0; REPLACE_MEMMEM=0; REPLACE_STPNCPY=0; REPLACE_STRDUP=0; REPLACE_STRSTR=0; REPLACE_STRCASESTR=0; REPLACE_STRCHRNUL=0; REPLACE_STRERROR=0; REPLACE_STRERROR_R=0; REPLACE_STRNCAT=0; REPLACE_STRNDUP=0; REPLACE_STRNLEN=0; REPLACE_STRSIGNAL=0; REPLACE_STRTOK_R=0; UNDEFINE_STRTOK_R=0; # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : gl_have_mmap=yes else gl_have_mmap=no fi # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 $as_echo_n "checking for MAP_ANONYMOUS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : gl_have_mmap_anonymous=yes fi rm -f conftest* if test $gl_have_mmap_anonymous != yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANON I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1; then : $as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h gl_have_mmap_anonymous=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 $as_echo "$gl_have_mmap_anonymous" >&6; } if test $gl_have_mmap_anonymous = yes; then $as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h fi fi if test $HAVE_MEMCHR = 1; then # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # http://bugzilla.redhat.com/499689 # memchr should not dereference overestimated length after a match # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # http://sourceware.org/bugzilla/show_bug.cgi?id=10162 # Assume that memchr works on platforms that lack mprotect. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5 $as_echo_n "checking whether memchr works... " >&6; } if ${gl_cv_func_memchr_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_func_memchr_works="guessing no" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif int main () { int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_memchr_works=yes else gl_cv_func_memchr_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5 $as_echo "$gl_cv_func_memchr_works" >&6; } if test "$gl_cv_func_memchr_works" != yes; then REPLACE_MEMCHR=1 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines MIN and MAX" >&5 $as_echo_n "checking whether defines MIN and MAX... " >&6; } if ${gl_cv_minmax_in_limits_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = MIN (42, 17); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_minmax_in_limits_h=yes else gl_cv_minmax_in_limits_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5 $as_echo "$gl_cv_minmax_in_limits_h" >&6; } if test $gl_cv_minmax_in_limits_h = yes; then $as_echo "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines MIN and MAX" >&5 $as_echo_n "checking whether defines MIN and MAX... " >&6; } if ${gl_cv_minmax_in_sys_param_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = MIN (42, 17); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_minmax_in_sys_param_h=yes else gl_cv_minmax_in_sys_param_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5 $as_echo "$gl_cv_minmax_in_sys_param_h" >&6; } if test $gl_cv_minmax_in_sys_param_h = yes; then $as_echo "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h fi GNULIB_MKTIME=0; GNULIB_NANOSLEEP=0; GNULIB_STRPTIME=0; GNULIB_TIMEGM=0; GNULIB_TIME_R=0; HAVE_DECL_LOCALTIME_R=1; HAVE_NANOSLEEP=1; HAVE_STRPTIME=1; HAVE_TIMEGM=1; REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; REPLACE_MKTIME=GNULIB_PORTCHECK; REPLACE_NANOSLEEP=GNULIB_PORTCHECK; REPLACE_TIMEGM=GNULIB_PORTCHECK; ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" if test "x$ac_cv_have_decl_alarm" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ALARM $ac_have_decl _ACEOF gl_cv_c_multiarch=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : arch= prev= for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do if test -n "$prev"; then case $word in i?86 | x86_64 | ppc | ppc64) if test -z "$arch" || test "$arch" = "$word"; then arch="$word" else gl_cv_c_multiarch=yes fi ;; esac prev= else if test "x$word" = "x-arch"; then prev=arch fi fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 else APPLE_UNIVERSAL_BUILD=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi # Define two additional variables used in the Makefile substitution. if test "$ac_cv_header_stdbool_h" = yes; then STDBOOL_H='' else STDBOOL_H='stdbool.h' fi if test -n "$STDBOOL_H"; then GL_GENERATE_STDBOOL_H_TRUE= GL_GENERATE_STDBOOL_H_FALSE='#' else GL_GENERATE_STDBOOL_H_TRUE='#' GL_GENERATE_STDBOOL_H_FALSE= fi if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi # parse-datetime.y works with bison only. : ${YACC='bison -y'} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compound literals" >&5 $as_echo_n "checking for compound literals... " >&6; } if ${gl_cv_compound_literals+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ struct s { int i, j; }; int main () { struct s t = (struct s) { 3, 4 }; if (t.i != 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_compound_literals=yes else gl_cv_compound_literals=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compound_literals" >&5 $as_echo "$gl_cv_compound_literals" >&6; } if test $gl_cv_compound_literals = yes; then $as_echo "#define HAVE_COMPOUND_LITERALS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : $as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h fi GNULIB_PSELECT=0; GNULIB_SELECT=0; HAVE_PSELECT=1; REPLACE_PSELECT=0; REPLACE_SELECT=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_select_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct timeval b; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_select_h_selfcontained=yes else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $gl_cv_header_sys_select_h_selfcontained = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int memset; int bzero; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef memset #define memset nonexistent_memset extern #ifdef __cplusplus "C" #endif void *memset (void *, int, unsigned long); #undef bzero #define bzero nonexistent_bzero extern #ifdef __cplusplus "C" #endif void bzero (void *, unsigned long); fd_set fds; FD_ZERO (&fds); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_select_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_select_h_selfcontained" >&6; } if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_select_h='<'sys/select.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_select_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_select_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/select.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_select_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_select_h='<'sys/select.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_select_h" >&5 $as_echo "$gl_cv_next_sys_select_h" >&6; } fi NEXT_SYS_SELECT_H=$gl_cv_next_sys_select_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/select.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_select_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H=$gl_next_as_first_directive if test $ac_cv_header_sys_select_h = yes; then HAVE_SYS_SELECT_H=1 else HAVE_SYS_SELECT_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi for gl_func in pselect select; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Some systems require prerequisite headers. */ #include #if !(defined __GLIBC__ && !defined __UCLIBC__) && HAVE_SYS_TIME_H # include #endif #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi LIBSOCKET= if test $HAVE_WINSOCK2_H = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to call WSAStartup in winsock2.h and -lws2_32" >&5 $as_echo_n "checking if we need to call WSAStartup in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_func_wsastartup+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H # include #endif int main () { WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); WSACleanup (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_wsastartup=yes else gl_cv_func_wsastartup=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wsastartup" >&5 $as_echo "$gl_cv_func_wsastartup" >&6; } if test "$gl_cv_func_wsastartup" = "yes"; then $as_echo "#define WINDOWS_SOCKETS 1" >>confdefs.h LIBSOCKET='-lws2_32' fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${gl_cv_lib_socket+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_lib_socket= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_save_LIBS="$LIBS" LIBS="$gl_save_LIBS -lsocket" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lsocket" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnetwork" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnetwork" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnet" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnet" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi fi LIBS="$gl_save_LIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then gl_cv_lib_socket="none needed" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_socket" >&5 $as_echo "$gl_cv_lib_socket" >&6; } if test "$gl_cv_lib_socket" != "none needed"; then LIBSOCKET="$gl_cv_lib_socket" fi fi : ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default" if test "x$ac_cv_have_decl_setenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SETENV $ac_have_decl _ACEOF if test $ac_cv_have_decl_setenv = no; then HAVE_DECL_SETENV=0 fi for ac_header in search.h do : ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default" if test "x$ac_cv_header_search_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SEARCH_H 1 _ACEOF fi done for ac_func in tsearch do : ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch" if test "x$ac_cv_func_tsearch" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TSEARCH 1 _ACEOF fi done GNULIB_PTHREAD_SIGMASK=0; GNULIB_RAISE=0; GNULIB_SIGNAL_H_SIGPIPE=0; GNULIB_SIGPROCMASK=0; GNULIB_SIGACTION=0; HAVE_POSIX_SIGNALBLOCKING=1; HAVE_PTHREAD_SIGMASK=1; HAVE_RAISE=1; HAVE_SIGSET_T=1; HAVE_SIGINFO_T=1; HAVE_SIGACTION=1; HAVE_STRUCT_SIGACTION_SA_SIGACTION=1; HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1; HAVE_SIGHANDLER_T=1; REPLACE_PTHREAD_SIGMASK=0; REPLACE_RAISE=0; ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" " #include /* Mingw defines sigset_t not in , but in . */ #include " if test "x$ac_cv_type_sigset_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGSET_T 1 _ACEOF gl_cv_type_sigset_t=yes else gl_cv_type_sigset_t=no fi if test $gl_cv_type_sigset_t != yes; then HAVE_SIGSET_T=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5 $as_echo_n "checking whether snprintf returns a byte count as in C99... " >&6; } if ${gl_cv_func_snprintf_retval_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_snprintf_retval_c99="guessing no";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_retval_c99=yes else gl_cv_func_snprintf_retval_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5 $as_echo "$gl_cv_func_snprintf_retval_c99" >&6; } ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" if test "x$ac_cv_have_decl_snprintf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SNPRINTF $ac_have_decl _ACEOF REPLACE_NULL=0; HAVE_WCHAR_T=1; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 $as_echo_n "checking for wchar_t... " >&6; } if ${gt_cv_c_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wchar_t=yes else gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 $as_echo "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then $as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 $as_echo_n "checking for unsigned long long int... " >&6; } if ${ac_cv_type_unsigned_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63; int main () { /* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_unsigned_long_long_int=yes else ac_cv_type_unsigned_long_long_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 $as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } if test $ac_cv_type_unsigned_long_long_int = yes; then $as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h fi if test $ac_cv_type_long_long_int = yes; then HAVE_LONG_LONG_INT=1 else HAVE_LONG_LONG_INT=0 fi if test $ac_cv_type_unsigned_long_long_int = yes; then HAVE_UNSIGNED_LONG_LONG_INT=1 else HAVE_UNSIGNED_LONG_LONG_INT=0 fi if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_stdint_h='<'stdint.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_stdint_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdint.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stdint_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_stdint_h='<'stdint.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5 $as_echo "$gl_cv_next_stdint_h" >&6; } fi NEXT_STDINT_H=$gl_cv_next_stdint_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdint.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdint_h fi NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi if test $ac_cv_header_stdint_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5 $as_echo_n "checking whether stdint.h conforms to C99... " >&6; } if ${gl_cv_header_working_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_working_stdint_h=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0 / ia64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "$cross_compiling" = yes; then : gl_cv_header_working_stdint_h=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; int main () { const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_header_working_stdint_h=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5 $as_echo "$gl_cv_header_working_stdint_h" >&6; } fi if test "$gl_cv_header_working_stdint_h" = yes; then STDINT_H= else for ac_header in sys/inttypes.h sys/bitypes.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 else HAVE_SYS_INTTYPES_H=0 fi if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 else HAVE_SYS_BITYPES_H=0 fi if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 $as_echo_n "checking for bit size of $gltype... " >&6; } if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include "; then : else result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` cat >>confdefs.h <<_ACEOF #define BITSIZEOF_${GLTYPE} $result _ACEOF eval BITSIZEOF_${GLTYPE}=\$result done fi for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 $as_echo_n "checking for bit size of $gltype... " >&6; } if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif #include "; then : else result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` cat >>confdefs.h <<_ACEOF #define BITSIZEOF_${GLTYPE} $result _ACEOF eval BITSIZEOF_${GLTYPE}=\$result done for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5 $as_echo_n "checking whether $gltype is signed... " >&6; } if eval \${gl_cv_type_${gltype}_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : result=yes else result=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval gl_cv_type_${gltype}_signed=\$result fi eval ac_res=\$gl_cv_type_${gltype}_signed { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_SIGNED_${GLTYPE} 1 _ACEOF eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 $as_echo_n "checking for $gltype integer literal suffix... " >&6; } if eval \${gl_cv_type_${gltype}_suffix+:} false; then : $as_echo_n "(cached) " >&6 else eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif extern $gltype foo; extern $gltype1 foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result cat >>confdefs.h <<_ACEOF #define ${GLTYPE}_SUFFIX $result _ACEOF done fi for gltype in sig_atomic_t wchar_t wint_t ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 $as_echo_n "checking for $gltype integer literal suffix... " >&6; } if eval \${gl_cv_type_${gltype}_suffix+:} false; then : $as_echo_n "(cached) " >&6 else eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif extern $gltype foo; extern $gltype1 foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result cat >>confdefs.h <<_ACEOF #define ${GLTYPE}_SUFFIX $result _ACEOF done if test $BITSIZEOF_WINT_T -lt 32; then BITSIZEOF_WINT_T=32 fi STDINT_H=stdint.h fi if test -n "$STDINT_H"; then GL_GENERATE_STDINT_H_TRUE= GL_GENERATE_STDINT_H_FALSE='#' else GL_GENERATE_STDINT_H_TRUE='#' GL_GENERATE_STDINT_H_FALSE= fi GNULIB_FFS=0; HAVE_FFS=1; HAVE_STRCASECMP=1; HAVE_DECL_STRNCASECMP=1; ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default" if test "x$ac_cv_have_decl_strdup" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRDUP $ac_have_decl _ACEOF REPLACE_STRERROR_0=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5 $as_echo_n "checking whether strerror(0) succeeds... " >&6; } if ${gl_cv_func_strerror_0_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_strerror_0_works="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strerror_0_works=yes else gl_cv_func_strerror_0_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5 $as_echo "$gl_cv_func_strerror_0_works" >&6; } case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 $as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h ;; esac if test $gl_cv_have_include_next = yes; then gl_cv_next_string_h='<'string.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_string_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'string.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_string_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5 $as_echo "$gl_cv_next_string_h" >&6; } fi NEXT_STRING_H=$gl_cv_next_string_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'string.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_string_h fi NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive for gl_func in ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r strerror_r strsignal strverscmp; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $gl_cv_have_include_next = yes; then gl_cv_next_strings_h='<'strings.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_strings_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_strings_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'strings.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_strings_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_strings_h='<'strings.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5 $as_echo "$gl_cv_next_strings_h" >&6; } fi NEXT_STRINGS_H=$gl_cv_next_strings_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'strings.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_strings_h fi NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi for gl_func in ffs strcasecmp strncasecmp; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Minix 3.1.8 has a bug: must be included before . */ #include #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done ac_fn_c_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default" if test "x$ac_cv_have_decl_strndup" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNDUP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default" if test "x$ac_cv_have_decl_strnlen" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNLEN $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strtok_r" "ac_cv_have_decl_strtok_r" "$ac_includes_default" if test "x$ac_cv_have_decl_strtok_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRTOK_R $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_time_h=yes else gl_cv_sys_struct_timespec_in_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_time_h" >&6; } TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_sys_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_sys_time_h=yes else gl_cv_sys_struct_timespec_in_sys_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; } if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 $as_echo_n "checking for struct timespec in ... " >&6; } if ${gl_cv_sys_struct_timespec_in_pthread_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_timespec_in_pthread_h=yes else gl_cv_sys_struct_timespec_in_pthread_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5 $as_echo "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; } if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi if test $gl_cv_have_include_next = yes; then gl_cv_next_time_h='<'time.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_time_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'time.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_time_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5 $as_echo "$gl_cv_next_time_h" >&6; } fi NEXT_TIME_H=$gl_cv_next_time_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'time.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_time_h fi NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default" if test "x$ac_cv_have_decl_unsetenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_UNSETENV $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } if ${gt_cv_c_wint_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include wint_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wint_t=yes else gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 $as_echo "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then $as_echo "#define HAVE_WINT_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${gl_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_inttypes_h=yes else gl_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 $as_echo "$gl_cv_header_inttypes_h" >&6; } if test $gl_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 $as_echo_n "checking for stdint.h... " >&6; } if ${gl_cv_header_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_stdint_h=yes else gl_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 $as_echo "$gl_cv_header_stdint_h" >&6; } if test $gl_cv_header_stdint_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 $as_echo_n "checking for intmax_t... " >&6; } if ${gt_cv_c_intmax_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif int main () { intmax_t x = -1; return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_intmax_t=yes else gt_cv_c_intmax_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 $as_echo "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then $as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h else test $ac_cv_type_long_long_int = yes \ && ac_type='long long' \ || ac_type='long' cat >>confdefs.h <<_ACEOF #define intmax_t $ac_type _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5 $as_echo_n "checking where to find the exponent in a 'double'... " >&6; } if ${gl_cv_cc_double_expbit0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "mixed_endianness" >/dev/null 2>&1; then : gl_cv_cc_double_expbit0="unknown" else : if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi : case $ac_cv_c_bigendian in #( yes) gl_cv_cc_double_expbit0="word 0 bit 20";; #( no) gl_cv_cc_double_expbit0="word 1 bit 20" ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) gl_cv_cc_double_expbit0="unknown" ;; esac fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_cc_double_expbit0=`cat conftest.out` else gl_cv_cc_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5 $as_echo "$gl_cv_cc_double_expbit0" >&6; } case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` cat >>confdefs.h <<_ACEOF #define DBL_EXPBIT0_WORD $word _ACEOF cat >>confdefs.h <<_ACEOF #define DBL_EXPBIT0_BIT $bit _ACEOF ;; esac for ac_func in snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include " if test "x$ac_cv_have_decl__snprintf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNPRINTF $ac_have_decl _ACEOF case "$gl_cv_func_snprintf_retval_c99" in *yes) $as_echo "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h ;; esac XGETTEXT_EXTRA_OPTIONS= GNULIB_BTOWC=0; GNULIB_WCTOB=0; GNULIB_MBSINIT=0; GNULIB_MBRTOWC=0; GNULIB_MBRLEN=0; GNULIB_MBSRTOWCS=0; GNULIB_MBSNRTOWCS=0; GNULIB_WCRTOMB=0; GNULIB_WCSRTOMBS=0; GNULIB_WCSNRTOMBS=0; GNULIB_WCWIDTH=0; GNULIB_WMEMCHR=0; GNULIB_WMEMCMP=0; GNULIB_WMEMCPY=0; GNULIB_WMEMMOVE=0; GNULIB_WMEMSET=0; GNULIB_WCSLEN=0; GNULIB_WCSNLEN=0; GNULIB_WCSCPY=0; GNULIB_WCPCPY=0; GNULIB_WCSNCPY=0; GNULIB_WCPNCPY=0; GNULIB_WCSCAT=0; GNULIB_WCSNCAT=0; GNULIB_WCSCMP=0; GNULIB_WCSNCMP=0; GNULIB_WCSCASECMP=0; GNULIB_WCSNCASECMP=0; GNULIB_WCSCOLL=0; GNULIB_WCSXFRM=0; GNULIB_WCSDUP=0; GNULIB_WCSCHR=0; GNULIB_WCSRCHR=0; GNULIB_WCSCSPN=0; GNULIB_WCSSPN=0; GNULIB_WCSPBRK=0; GNULIB_WCSSTR=0; GNULIB_WCSTOK=0; GNULIB_WCSWIDTH=0; HAVE_BTOWC=1; HAVE_MBSINIT=1; HAVE_MBRTOWC=1; HAVE_MBRLEN=1; HAVE_MBSRTOWCS=1; HAVE_MBSNRTOWCS=1; HAVE_WCRTOMB=1; HAVE_WCSRTOMBS=1; HAVE_WCSNRTOMBS=1; HAVE_WMEMCHR=1; HAVE_WMEMCMP=1; HAVE_WMEMCPY=1; HAVE_WMEMMOVE=1; HAVE_WMEMSET=1; HAVE_WCSLEN=1; HAVE_WCSNLEN=1; HAVE_WCSCPY=1; HAVE_WCPCPY=1; HAVE_WCSNCPY=1; HAVE_WCPNCPY=1; HAVE_WCSCAT=1; HAVE_WCSNCAT=1; HAVE_WCSCMP=1; HAVE_WCSNCMP=1; HAVE_WCSCASECMP=1; HAVE_WCSNCASECMP=1; HAVE_WCSCOLL=1; HAVE_WCSXFRM=1; HAVE_WCSDUP=1; HAVE_WCSCHR=1; HAVE_WCSRCHR=1; HAVE_WCSCSPN=1; HAVE_WCSSPN=1; HAVE_WCSPBRK=1; HAVE_WCSSTR=1; HAVE_WCSTOK=1; HAVE_WCSWIDTH=1; HAVE_DECL_WCTOB=1; HAVE_DECL_WCWIDTH=1; REPLACE_MBSTATE_T=0; REPLACE_BTOWC=0; REPLACE_WCTOB=0; REPLACE_MBSINIT=0; REPLACE_MBRTOWC=0; REPLACE_MBRLEN=0; REPLACE_MBSRTOWCS=0; REPLACE_MBSNRTOWCS=0; REPLACE_WCRTOMB=0; REPLACE_WCSRTOMBS=0; REPLACE_WCSNRTOMBS=0; REPLACE_WCWIDTH=0; REPLACE_WCSWIDTH=0; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uses 'inline' correctly" >&5 $as_echo_n "checking whether uses 'inline' correctly... " >&6; } if ${gl_cv_header_wchar_h_correct_inline+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_header_wchar_h_correct_inline=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include extern int zero (void); int main () { return zero(); } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then mv conftest.$ac_objext conftest1.$ac_objext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int zero (void) { return 0; } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then mv conftest.$ac_objext conftest2.$ac_objext if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5 $as_echo "$gl_cv_header_wchar_h_correct_inline" >&6; } if test $gl_cv_header_wchar_h_correct_inline = no; then as_fn_error $? " cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted." "$LINENO" 5 fi if true; then GL_COND_LIBTOOL_TRUE= GL_COND_LIBTOOL_FALSE='#' else GL_COND_LIBTOOL_TRUE='#' GL_COND_LIBTOOL_FALSE= fi gl_cond_libtool=true gl_m4_base='gl/m4' gl_source_base='gl' LTALLOCA=`echo "$ALLOCA" | sed -e 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` if test $ac_cv_func_alloca_works = no; then : fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5 $as_echo_n "checking for alloca as a compiler built-in... " >&6; } if ${gl_cv_rpl_alloca+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Need own alloca" >/dev/null 2>&1; then : gl_cv_rpl_alloca=yes else gl_cv_rpl_alloca=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5 $as_echo "$gl_cv_rpl_alloca" >&6; } if test $gl_cv_rpl_alloca = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h ALLOCA_H=alloca.h else ALLOCA_H= fi else ALLOCA_H=alloca.h fi if test -n "$ALLOCA_H"; then GL_GENERATE_ALLOCA_H_TRUE= GL_GENERATE_ALLOCA_H_FALSE='#' else GL_GENERATE_ALLOCA_H_TRUE='#' GL_GENERATE_ALLOCA_H_FALSE= fi if test $ac_cv_header_arpa_inet_h = yes; then HAVE_ARPA_INET_H=1 else HAVE_ARPA_INET_H=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_arpa_inet_h='<'arpa/inet.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_arpa_inet_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_arpa_inet_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'arpa/inet.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_arpa_inet_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_arpa_inet_h='<'arpa/inet.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_arpa_inet_h" >&5 $as_echo "$gl_cv_next_arpa_inet_h" >&6; } fi NEXT_ARPA_INET_H=$gl_cv_next_arpa_inet_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'arpa/inet.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_arpa_inet_h fi NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H=$gl_next_as_first_directive for gl_func in inet_ntop inet_pton; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* On some systems, this header is not self-consistent. */ #if !(defined __GLIBC__ || defined __UCLIBC__) # include #endif #ifdef __TANDEM # include #endif #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS bind.$ac_objext" fi GNULIB_BIND=1 $as_echo "#define GNULIB_TEST_BIND 1" >>confdefs.h # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all* # programs in the package would end up linked with that potentially-shared # library, inducing unnecessary run-time overhead. LIB_CLOCK_GETTIME= gl_saved_libs=$LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if ${ac_cv_search_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_clock_gettime+:} false; then : break fi done if ${ac_cv_search_clock_gettime+:} false; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" test "$ac_cv_search_clock_gettime" = "none required" || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime fi for ac_func in clock_gettime clock_settime do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS=$gl_saved_libs if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then REPLACE_CLOSE=1 fi if test $REPLACE_CLOSE = 1; then gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext" fi GNULIB_CLOSE=1 $as_echo "#define GNULIB_TEST_CLOSE 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS connect.$ac_objext" fi GNULIB_CONNECT=1 $as_echo "#define GNULIB_TEST_CONNECT 1" >>confdefs.h # Check whether --with-libgcrypt was given. if test "${with_libgcrypt+set}" = set; then : withval=$with_libgcrypt; libgcrypt=$withval else libgcrypt=no fi if test "$libgcrypt" != no; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libgcrypt-prefix was given. if test "${with_libgcrypt_prefix+set}" = set; then : withval=$with_libgcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBGCRYPT= LTLIBGCRYPT= INCGCRYPT= LIBGCRYPT_PREFIX= HAVE_LIBGCRYPT= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='gcrypt gpg-error' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_a" else LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'gcrypt'; then LIBGCRYPT_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'gcrypt'; then LIBGCRYPT_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCGCRYPT="${INCGCRYPT}${INCGCRYPT:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$dep" LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$dep" ;; esac done fi else LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" for element in $INCGCRYPT; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 $as_echo_n "checking for libgcrypt... " >&6; } if ${ac_cv_libgcrypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" case " $LIBGCRYPT" in *" -l"*) LIBS="$LIBS $LIBGCRYPT" ;; *) LIBS="$LIBGCRYPT $LIBS" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* GCRY_MODULE_ID_USER was added in 1.4.4 and gc-libgcrypt.c will fail on startup if we don't have 1.4.4 or later, so test for it early. */ #if !defined GCRY_MODULE_ID_USER error too old libgcrypt #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_libgcrypt=yes else ac_cv_libgcrypt='no' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 $as_echo "$ac_cv_libgcrypt" >&6; } if test "$ac_cv_libgcrypt" = yes; then HAVE_LIBGCRYPT=yes $as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 $as_echo_n "checking how to link with libgcrypt... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 $as_echo "$LIBGCRYPT" >&6; } else HAVE_LIBGCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" LIBGCRYPT= LTLIBGCRYPT= LIBGCRYPT_PREFIX= fi fi if test "$ac_cv_libgcrypt" = yes; then gl_LIBOBJS="$gl_LIBOBJS gc-libgcrypt.$ac_objext" else gl_LIBOBJS="$gl_LIBOBJS gc-gnulib.$ac_objext" fi if test $gl_cond_libtool = false; then gl_ltlibdeps="$gl_ltlibdeps $LTLIBGCRYPT" gl_libdeps="$gl_libdeps $LIBGCRYPT" fi cat >>confdefs.h <<_ACEOF #define GNULIB_GC_DES 1 _ACEOF if test "$ac_cv_libgcrypt" != yes; then : fi cat >>confdefs.h <<_ACEOF #define GNULIB_GC_HMAC_MD5 1 _ACEOF if test "$ac_cv_libgcrypt" != yes; then : fi cat >>confdefs.h <<_ACEOF #define GNULIB_GC_HMAC_SHA1 1 _ACEOF if test "$ac_cv_libgcrypt" != yes; then : fi cat >>confdefs.h <<_ACEOF #define GNULIB_GC_MD4 1 _ACEOF if test "$ac_cv_libgcrypt" != yes; then : fi cat >>confdefs.h <<_ACEOF #define GNULIB_GC_MD5 1 _ACEOF # Devices with randomness. # FIXME: Are these the best defaults? case "$host_os" in *openbsd* | *mirbsd*) NAME_OF_RANDOM_DEVICE="/dev/srandom" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/prandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; *netbsd*) NAME_OF_RANDOM_DEVICE="/dev/srandom" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; *solaris* | *irix* | *dec-osf* ) NAME_OF_RANDOM_DEVICE="/dev/random" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/random" NAME_OF_NONCE_DEVICE="/dev/random" ;; *) NAME_OF_RANDOM_DEVICE="/dev/random" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking device with (strong) random data..." >&5 $as_echo_n "checking device with (strong) random data...... " >&6; } # Check whether --enable-random-device was given. if test "${enable_random_device+set}" = set; then : enableval=$enable_random_device; NAME_OF_RANDOM_DEVICE=$enableval fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NAME_OF_RANDOM_DEVICE" >&5 $as_echo "$NAME_OF_RANDOM_DEVICE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking device with pseudo random data..." >&5 $as_echo_n "checking device with pseudo random data...... " >&6; } # Check whether --enable-pseudo-random-device was given. if test "${enable_pseudo_random_device+set}" = set; then : enableval=$enable_pseudo_random_device; NAME_OF_PSEUDO_RANDOM_DEVICE=$enableval fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NAME_OF_PSEUDO_RANDOM_DEVICE" >&5 $as_echo "$NAME_OF_PSEUDO_RANDOM_DEVICE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking device with unpredictable data for nonces..." >&5 $as_echo_n "checking device with unpredictable data for nonces...... " >&6; } # Check whether --enable-nonce-device was given. if test "${enable_nonce_device+set}" = set; then : enableval=$enable_nonce_device; NAME_OF_NONCE_DEVICE=$enableval fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NAME_OF_NONCE_DEVICE" >&5 $as_echo "$NAME_OF_NONCE_DEVICE" >&6; } if test "$cross_compiling" != yes; then if test "$NAME_OF_RANDOM_DEVICE" != "no"; then as_ac_File=`$as_echo "ac_cv_file_$NAME_OF_RANDOM_DEVICE" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $NAME_OF_RANDOM_DEVICE" >&5 $as_echo_n "checking for $NAME_OF_RANDOM_DEVICE... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$NAME_OF_RANDOM_DEVICE"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Device '$NAME_OF_RANDOM_DEVICE' does not exist, consider to use --enable-random-device" >&5 $as_echo "$as_me: WARNING: Device '$NAME_OF_RANDOM_DEVICE' does not exist, consider to use --enable-random-device" >&2;} fi fi if test "$NAME_OF_PSEUDO_RANDOM_DEVICE" != "no"; then as_ac_File=`$as_echo "ac_cv_file_$NAME_OF_PSEUDO_RANDOM_DEVICE" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $NAME_OF_PSEUDO_RANDOM_DEVICE" >&5 $as_echo_n "checking for $NAME_OF_PSEUDO_RANDOM_DEVICE... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$NAME_OF_PSEUDO_RANDOM_DEVICE"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Device '$NAME_OF_PSEUDO_RANDOM_DEVICE' does not exist, consider to use --enable-pseudo-random-device" >&5 $as_echo "$as_me: WARNING: Device '$NAME_OF_PSEUDO_RANDOM_DEVICE' does not exist, consider to use --enable-pseudo-random-device" >&2;} fi fi if test "$NAME_OF_NONCE_DEVICE" != "no"; then as_ac_File=`$as_echo "ac_cv_file_$NAME_OF_NONCE_DEVICE" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $NAME_OF_NONCE_DEVICE" >&5 $as_echo_n "checking for $NAME_OF_NONCE_DEVICE... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$NAME_OF_NONCE_DEVICE"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Device '$NAME_OF_NONCE_DEVICE' does not exist, consider to use --enable-nonce-device" >&5 $as_echo "$as_me: WARNING: Device '$NAME_OF_NONCE_DEVICE' does not exist, consider to use --enable-nonce-device" >&2;} fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: Cross compiling, assuming random devices exists on the target host..." >&5 $as_echo "$as_me: Cross compiling, assuming random devices exists on the target host..." >&6;} fi # FIXME?: Open+read 42 bytes+close twice and compare data. Should differ. cat >>confdefs.h <<_ACEOF #define NAME_OF_RANDOM_DEVICE "$NAME_OF_RANDOM_DEVICE" _ACEOF cat >>confdefs.h <<_ACEOF #define NAME_OF_PSEUDO_RANDOM_DEVICE "$NAME_OF_PSEUDO_RANDOM_DEVICE" _ACEOF cat >>confdefs.h <<_ACEOF #define NAME_OF_NONCE_DEVICE "$NAME_OF_NONCE_DEVICE" _ACEOF cat >>confdefs.h <<_ACEOF #define GNULIB_GC_RANDOM 1 _ACEOF : : : $as_echo "#define HAVE_DUP2 1" >>confdefs.h if test $HAVE_DUP2 = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5 $as_echo_n "checking whether dup2 works... " >&6; } if ${gl_cv_func_dup2_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; linux*) # On linux between 2008-07-27 and 2009-05-11, dup2 of a # closed fd may yield -EBADF instead of -1 / errno=EBADF. gl_cv_func_dup2_works="guessing no" ;; freebsd*) # on FreeBSD 6.1, dup2(1,1000000) gives EMFILE, not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) == 0) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, 1000000) == -1 && errno != EBADF) result |= 16; /* Flush out a cygwin core dump. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_dup2_works=yes else gl_cv_func_dup2_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5 $as_echo "$gl_cv_func_dup2_works" >&6; } case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 ;; esac fi if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext" fi GNULIB_DUP2=1 $as_echo "#define GNULIB_TEST_DUP2 1" >>confdefs.h GNULIB_ENVIRON=1 $as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h if test $ac_cv_func_fcntl = no; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5 $as_echo_n "checking whether fcntl handles F_DUPFD correctly... " >&6; } if ${gl_cv_func_fcntl_f_dupfd_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess that it works on glibc systems case $host_os in #(( *-gnu*) gl_cv_func_fcntl_f_dupfd_works="guessing yes";; *) gl_cv_func_fcntl_f_dupfd_works="guessing no";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_fcntl_f_dupfd_works=yes else gl_cv_func_fcntl_f_dupfd_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5 $as_echo "$gl_cv_func_fcntl_f_dupfd_works" >&6; } case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi $as_echo "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5 $as_echo_n "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; } if ${gl_cv_func_fcntl_f_dupfd_cloexec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef F_DUPFD_CLOEXEC choke me #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_fcntl_f_dupfd_cloexec=yes else gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else gl_cv_func_fcntl_f_dupfd_cloexec=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5 $as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; } if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi fi fi if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext" fi GNULIB_FCNTL=1 $as_echo "#define GNULIB_TEST_FCNTL 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_fcntl_h='<'fcntl.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_fcntl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'fcntl.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_fcntl_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5 $as_echo "$gl_cv_next_fcntl_h" >&6; } fi NEXT_FCNTL_H=$gl_cv_next_fcntl_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'fcntl.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_fcntl_h fi NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive for gl_func in fcntl openat; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done FLOAT_H= REPLACE_FLOAT_LDBL=0 case "$host_os" in aix* | beos* | openbsd* | mirbsd* | irix*) FLOAT_H=float.h ;; freebsd*) case "$host_cpu" in i[34567]86 ) FLOAT_H=float.h ;; x86_64 ) # On x86_64 systems, the C compiler may still be generating # 32-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __x86_64__ || defined __amd64__ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : else FLOAT_H=float.h fi rm -f conftest* ;; esac ;; linux*) case "$host_cpu" in powerpc*) FLOAT_H=float.h ;; esac ;; esac case "$host_os" in aix* | freebsd* | linux*) if test -n "$FLOAT_H"; then REPLACE_FLOAT_LDBL=1 fi ;; esac REPLACE_ITOLD=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5 $as_echo_n "checking whether conversion from 'int' to 'long double' works... " >&6; } if ${gl_cv_func_itold_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host" in sparc*-*-linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __arch64__ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : gl_cv_func_itold_works="guessing no" else gl_cv_func_itold_works="guessing yes" fi rm -f conftest* ;; *) gl_cv_func_itold_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int i = -1; volatile long double ld; int main () { ld += i * 1.0L; if (ld > 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_itold_works=yes else gl_cv_func_itold_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5 $as_echo "$gl_cv_func_itold_works" >&6; } case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 FLOAT_H=float.h ;; esac if test -n "$FLOAT_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_float_h='<'float.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_float_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'float.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_float_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5 $as_echo "$gl_cv_next_float_h" >&6; } fi NEXT_FLOAT_H=$gl_cv_next_float_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'float.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_float_h fi NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive fi if test -n "$FLOAT_H"; then GL_GENERATE_FLOAT_H_TRUE= GL_GENERATE_FLOAT_H_FALSE='#' else GL_GENERATE_FLOAT_H_TRUE='#' GL_GENERATE_FLOAT_H_FALSE= fi if test $REPLACE_FLOAT_LDBL = 1; then gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext" fi if test $REPLACE_ITOLD = 1; then gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext" fi if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then REPLACE_FSEEK=1 fi if test $REPLACE_FSEEK = 1; then gl_LIBOBJS="$gl_LIBOBJS fseek.$ac_objext" fi GNULIB_FSEEK=1 $as_echo "#define GNULIB_TEST_FSEEK 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5 $as_echo_n "checking for fseeko... " >&6; } if ${gl_cv_func_fseeko+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { fseeko (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_fseeko=yes else gl_cv_func_fseeko=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5 $as_echo "$gl_cv_func_fseeko" >&6; } if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi fi if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then gl_LIBOBJS="$gl_LIBOBJS fseeko.$ac_objext" for ac_func in _fseeki64 do : ac_fn_c_check_func "$LINENO" "_fseeki64" "ac_cv_func__fseeki64" if test "x$ac_cv_func__fseeki64" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__FSEEKI64 1 _ACEOF fi done fi GNULIB_FSEEKO=1 $as_echo "#define GNULIB_TEST_FSEEKO 1" >>confdefs.h if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_FSTAT=1 fi if test $WINDOWS_64_BIT_ST_SIZE = 1; then REPLACE_FSTAT=1 fi if test $REPLACE_FSTAT = 1; then gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext" : fi GNULIB_FSTAT=1 $as_echo "#define GNULIB_TEST_FSTAT 1" >>confdefs.h if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then REPLACE_FTELL=1 fi if test $REPLACE_FTELL = 1; then gl_LIBOBJS="$gl_LIBOBJS ftell.$ac_objext" fi GNULIB_FTELL=1 $as_echo "#define GNULIB_TEST_FTELL 1" >>confdefs.h if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5 $as_echo_n "checking for ftello... " >&6; } if ${gl_cv_func_ftello+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ftello (stdin); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_ftello=yes else gl_cv_func_ftello=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5 $as_echo "$gl_cv_func_ftello" >&6; } if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5 $as_echo_n "checking whether ftello works... " >&6; } if ${gl_cv_func_ftello_works+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) return 71; if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) return 74; if (!(getc (fp) == 'h')) return 1; if (!(getc (fp) == EOF)) return 2; if (!(ftell (fp) == 8)) return 3; if (!(ftell (fp) == 8)) return 4; if (!(putc ('!', fp) == '!')) return 5; if (!(ftell (fp) == 9)) return 6; if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) return 10; if (!(memcmp (buf, "foogarsh!", 9) == 0)) return 11; } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_ftello_works=yes else gl_cv_func_ftello_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5 $as_echo "$gl_cv_func_ftello_works" >&6; } case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 $as_echo "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h ;; esac fi fi if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then gl_LIBOBJS="$gl_LIBOBJS ftello.$ac_objext" for ac_func in _ftelli64 do : ac_fn_c_check_func "$LINENO" "_ftelli64" "ac_cv_func__ftelli64" if test "x$ac_cv_func__ftelli64" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__FTELLI64 1 _ACEOF fi done fi GNULIB_FTELLO=1 $as_echo "#define GNULIB_TEST_FTELLO 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to do getaddrinfo, freeaddrinfo and getnameinfo" >&5 $as_echo "$as_me: checking how to do getaddrinfo, freeaddrinfo and getnameinfo" >&6;} GETADDRINFO_LIB= gai_saved_LIBS="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5 $as_echo_n "checking for library containing getaddrinfo... " >&6; } if ${ac_cv_search_getaddrinfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getaddrinfo (); int main () { return getaddrinfo (); ; return 0; } _ACEOF for ac_lib in '' socket network net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getaddrinfo=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getaddrinfo+:} false; then : break fi done if ${ac_cv_search_getaddrinfo+:} false; then : else ac_cv_search_getaddrinfo=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getaddrinfo" >&5 $as_echo "$ac_cv_search_getaddrinfo" >&6; } ac_res=$ac_cv_search_getaddrinfo if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_getaddrinfo" != "none required"; then GETADDRINFO_LIB="$ac_cv_search_getaddrinfo" fi fi LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" HAVE_GETADDRINFO=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 $as_echo_n "checking for getaddrinfo... " >&6; } if ${gl_cv_func_getaddrinfo+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include int main () { getaddrinfo("", "", NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_getaddrinfo=yes else gl_cv_func_getaddrinfo=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getaddrinfo" >&5 $as_echo "$gl_cv_func_getaddrinfo" >&6; } if test $gl_cv_func_getaddrinfo = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in ws2tcpip.h and -lws2_32" >&5 $as_echo_n "checking for getaddrinfo in ws2tcpip.h and -lws2_32... " >&6; } if ${gl_cv_w32_getaddrinfo+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_getaddrinfo=no am_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WS2TCPIP_H #include #endif #include int main () { getaddrinfo(NULL, NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_getaddrinfo=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getaddrinfo" >&5 $as_echo "$gl_cv_w32_getaddrinfo" >&6; } if test "$gl_cv_w32_getaddrinfo" = "yes"; then GETADDRINFO_LIB="-lws2_32" LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" else HAVE_GETADDRINFO=0 fi fi # We can't use AC_REPLACE_FUNCS here because gai_strerror may be an # inline function declared in ws2tcpip.h, so we need to get that # header included somehow. ac_fn_c_check_decl "$LINENO" "gai_strerror" "ac_cv_have_decl_gai_strerror" " #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include " if test "x$ac_cv_have_decl_gai_strerror" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GAI_STRERROR $ac_have_decl _ACEOF if test $ac_cv_have_decl_gai_strerror = yes; then ac_fn_c_check_decl "$LINENO" "gai_strerrorA" "ac_cv_have_decl_gai_strerrorA" " #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include " if test "x$ac_cv_have_decl_gai_strerrorA" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GAI_STRERRORA $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gai_strerror with POSIX signature" >&5 $as_echo_n "checking for gai_strerror with POSIX signature... " >&6; } if ${gl_cv_func_gai_strerror_posix_signature+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include extern #ifdef __cplusplus "C" #endif const char *gai_strerror(int); _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_gai_strerror_posix_signature=yes else gl_cv_func_gai_strerror_posix_signature=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gai_strerror_posix_signature" >&5 $as_echo "$gl_cv_func_gai_strerror_posix_signature" >&6; } if test $gl_cv_func_gai_strerror_posix_signature = no; then REPLACE_GAI_STRERROR=1 fi fi LIBS="$gai_saved_LIBS" ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" " #include #include " if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_SA_LEN 1 _ACEOF fi ac_fn_c_check_decl "$LINENO" "getaddrinfo" "ac_cv_have_decl_getaddrinfo" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_have_decl_getaddrinfo" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETADDRINFO $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "freeaddrinfo" "ac_cv_have_decl_freeaddrinfo" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_have_decl_freeaddrinfo" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREEADDRINFO $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "getnameinfo" "ac_cv_have_decl_getnameinfo" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_have_decl_getnameinfo" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETNAMEINFO $ac_have_decl _ACEOF if test $ac_cv_have_decl_getaddrinfo = no; then HAVE_DECL_GETADDRINFO=0 fi if test $ac_cv_have_decl_freeaddrinfo = no; then HAVE_DECL_FREEADDRINFO=0 fi if test $ac_cv_have_decl_gai_strerror = no; then HAVE_DECL_GAI_STRERROR=0 fi if test $ac_cv_have_decl_getnameinfo = no; then HAVE_DECL_GETNAMEINFO=0 fi ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" " #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_struct_addrinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_ADDRINFO 1 _ACEOF fi if test $ac_cv_type_struct_addrinfo = no; then HAVE_STRUCT_ADDRINFO=0 fi case " $GETADDRINFO_LIB " in *" $HOSTENT_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $HOSTENT_LIB" ;; esac case " $GETADDRINFO_LIB " in *" $SERVENT_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;; esac case " $GETADDRINFO_LIB " in *" $INET_NTOP_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;; esac if test $HAVE_GETADDRINFO = 0; then gl_LIBOBJS="$gl_LIBOBJS getaddrinfo.$ac_objext" fi if test $HAVE_DECL_GAI_STRERROR = 0 || test $REPLACE_GAI_STRERROR = 1; then gl_LIBOBJS="$gl_LIBOBJS gai_strerror.$ac_objext" fi GNULIB_GETADDRINFO=1 $as_echo "#define GNULIB_TEST_GETADDRINFO 1" >>confdefs.h if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5 $as_echo_n "checking for working getdelim function... " >&6; } if ${gl_cv_func_working_getdelim+:} false; then : $as_echo_n "(cached) " >&6 else echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : gl_cv_func_working_getdelim="guessing yes" else gl_cv_func_working_getdelim="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) return 2; } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) return 3; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_getdelim=yes else gl_cv_func_working_getdelim=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_getdelim" >&5 $as_echo "$gl_cv_func_working_getdelim" >&6; } case "$gl_cv_func_working_getdelim" in *no) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then gl_LIBOBJS="$gl_LIBOBJS getdelim.$ac_objext" for ac_func in flockfile funlockfile do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED $ac_have_decl _ACEOF fi GNULIB_GETDELIM=1 $as_echo "#define GNULIB_TEST_GETDELIM 1" >>confdefs.h for ac_func in getdomainname do : ac_fn_c_check_func "$LINENO" "getdomainname" "ac_cv_func_getdomainname" if test "x$ac_cv_func_getdomainname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETDOMAINNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getdomainname in -lnsl" >&5 $as_echo_n "checking for getdomainname in -lnsl... " >&6; } if ${gl_cv_func_getdomainname_in_libnsl+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_func_getdomainname_in_libnsl=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lnsl" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern #ifdef __cplusplus "C" #endif int getdomainname (char *, size_t); int main () { getdomainname(NULL, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_getdomainname_in_libnsl=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdomainname_in_libnsl" >&5 $as_echo "$gl_cv_func_getdomainname_in_libnsl" >&6; } fi done ac_fn_c_check_decl "$LINENO" "getdomainname" "ac_cv_have_decl_getdomainname" "#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include " if test "x$ac_cv_have_decl_getdomainname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETDOMAINNAME $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getdomainname's second argument type" >&5 $as_echo_n "checking for getdomainname's second argument type... " >&6; } if ${gl_cv_decl_getdomainname_argtype2+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_have_decl_getdomainname; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include extern #ifdef __cplusplus "C" #endif int getdomainname (char *, int); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_getdomainname_argtype2='int' else gl_cv_decl_getdomainname_argtype2='size_t' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else gl_cv_decl_getdomainname_argtype2='int' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_getdomainname_argtype2" >&5 $as_echo "$gl_cv_decl_getdomainname_argtype2" >&6; } if test $ac_cv_have_decl_getdomainname = no; then HAVE_DECL_GETDOMAINNAME=0 fi if { test $ac_cv_func_getdomainname = yes \ && test $gl_cv_decl_getdomainname_argtype2 != size_t; \ } \ || test "$gl_cv_func_getdomainname_in_libnsl" = yes; then REPLACE_GETDOMAINNAME=1 fi if test $HAVE_DECL_GETDOMAINNAME = 0 || test $REPLACE_GETDOMAINNAME = 1; then gl_LIBOBJS="$gl_LIBOBJS getdomainname.$ac_objext" if test $ac_cv_func_getdomainname = yes; then $as_echo "#define HAVE_GETDOMAINNAME 1" >>confdefs.h fi for ac_header in sys/systeminfo.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/systeminfo.h" "ac_cv_header_sys_systeminfo_h" "$ac_includes_default" if test "x$ac_cv_header_sys_systeminfo_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SYSTEMINFO_H 1 _ACEOF fi done for ac_func in sysinfo do : ac_fn_c_check_func "$LINENO" "sysinfo" "ac_cv_func_sysinfo" if test "x$ac_cv_func_sysinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSINFO 1 _ACEOF fi done fi GNULIB_GETDOMAINNAME=1 $as_echo "#define GNULIB_TEST_GETDOMAINNAME 1" >>confdefs.h if test $ac_cv_func_getdtablesize != yes; then HAVE_GETDTABLESIZE=0 fi if test $HAVE_GETDTABLESIZE = 0; then gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext" : fi GNULIB_GETDTABLESIZE=1 $as_echo "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi GETHOSTNAME_LIB= for ac_func in gethostname do : ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" if test "x$ac_cv_func_gethostname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in winsock2.h and -lws2_32" >&5 $as_echo_n "checking for gethostname in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_w32_gethostname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_gethostname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #endif #include int main () { gethostname(NULL, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_gethostname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_gethostname" >&5 $as_echo "$gl_cv_w32_gethostname" >&6; } if test "$gl_cv_w32_gethostname" = "yes"; then GETHOSTNAME_LIB="-lws2_32" fi fi done if test "$ac_cv_func_gethostname" = no; then HAVE_GETHOSTNAME=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HOST_NAME_MAX" >&5 $as_echo_n "checking for HOST_NAME_MAX... " >&6; } if ${gl_cv_decl_HOST_NAME_MAX+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_decl_HOST_NAME_MAX= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HOST_NAME_MAX lucky #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "lucky" >/dev/null 2>&1; then : gl_cv_decl_HOST_NAME_MAX=yes fi rm -f conftest* if test -z "$gl_cv_decl_HOST_NAME_MAX"; then if test "$gl_cv_w32_gethostname" = yes; then gl_cv_decl_HOST_NAME_MAX=256 else if ac_fn_c_compute_int "$LINENO" "MAXHOSTNAMELEN" "gl_cv_decl_HOST_NAME_MAX" " #include #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETDB_H # include #endif "; then : else gl_cv_decl_HOST_NAME_MAX=256 fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_HOST_NAME_MAX" >&5 $as_echo "$gl_cv_decl_HOST_NAME_MAX" >&6; } if test "$gl_cv_decl_HOST_NAME_MAX" != yes; then cat >>confdefs.h <<_ACEOF #define HOST_NAME_MAX $gl_cv_decl_HOST_NAME_MAX _ACEOF fi if test $HAVE_GETHOSTNAME = 0; then gl_LIBOBJS="$gl_LIBOBJS gethostname.$ac_objext" if test "$gl_cv_w32_gethostname" != "yes"; then for ac_func in uname do : ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" if test "x$ac_cv_func_uname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNAME 1 _ACEOF fi done fi fi GNULIB_GETHOSTNAME=1 $as_echo "#define GNULIB_TEST_GETHOSTNAME 1" >>confdefs.h gl_getline_needs_run_time_check=no ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" if test "x$ac_cv_func_getline" = xyes; then : gl_getline_needs_run_time_check=yes else am_cv_func_working_getline=no fi if test $gl_getline_needs_run_time_check = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5 $as_echo_n "checking for working getline function... " >&6; } if ${am_cv_func_working_getline+:} false; then : $as_echo_n "(cached) " >&6 else echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : am_cv_func_working_getline="guessing yes" else am_cv_func_working_getline="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) return 2; } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) return 3; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_working_getline=yes else am_cv_func_working_getline=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_working_getline" >&5 $as_echo "$am_cv_func_working_getline" >&6; } fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *no) REPLACE_GETLINE=1 ;; esac if test $REPLACE_GETLINE = 1; then gl_LIBOBJS="$gl_LIBOBJS getline.$ac_objext" : fi GNULIB_GETLINE=1 $as_echo "#define GNULIB_TEST_GETLINE 1" >>confdefs.h for ac_func in getpass do : ac_fn_c_check_func "$LINENO" "getpass" "ac_cv_func_getpass" if test "x$ac_cv_func_getpass" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPASS 1 _ACEOF fi done if test $ac_cv_func_getpass = yes; then HAVE_GETPASS=1 else HAVE_GETPASS=0 fi if test $HAVE_GETPASS = 0; then gl_LIBOBJS="$gl_LIBOBJS getpass.$ac_objext" ac_fn_c_check_decl "$LINENO" "__fsetlocking" "ac_cv_have_decl___fsetlocking" "#include #if HAVE_STDIO_EXT_H #include #endif " if test "x$ac_cv_have_decl___fsetlocking" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL___FSETLOCKING $ac_have_decl _ACEOF : fi if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS getpeername.$ac_objext" fi GNULIB_GETPEERNAME=1 $as_echo "#define GNULIB_TEST_GETPEERNAME 1" >>confdefs.h if test $ac_cv_func_getsubopt = no; then HAVE_GETSUBOPT=0 fi if test $HAVE_GETSUBOPT = 0; then gl_LIBOBJS="$gl_LIBOBJS getsubopt.$ac_objext" : fi GNULIB_GETSUBOPT=1 $as_echo "#define GNULIB_TEST_GETSUBOPT 1" >>confdefs.h gl_gettimeofday_timezone=void if test $ac_cv_func_gettimeofday != yes; then HAVE_GETTIMEOFDAY=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday clobbers localtime buffer" >&5 $as_echo_n "checking whether gettimeofday clobbers localtime buffer... " >&6; } if ${gl_cv_func_gettimeofday_clobber+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # When cross-compiling: case "$host_os" in # Guess all is fine on glibc systems. *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; # If we don't know, assume the worst. *) gl_cv_func_gettimeofday_clobber="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { time_t t = 0; struct tm *lt; struct tm saved_lt; struct timeval tv; lt = localtime (&t); saved_lt = *lt; gettimeofday (&tv, NULL); return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_gettimeofday_clobber=no else gl_cv_func_gettimeofday_clobber=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_clobber" >&5 $as_echo "$gl_cv_func_gettimeofday_clobber" >&6; } case "$gl_cv_func_gettimeofday_clobber" in *yes) REPLACE_GETTIMEOFDAY=1 $as_echo "#define gmtime rpl_gmtime" >>confdefs.h $as_echo "#define localtime rpl_localtime" >>confdefs.h $as_echo "#define GETTIMEOFDAY_CLOBBERS_LOCALTIME 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5 $as_echo_n "checking for gettimeofday with POSIX signature... " >&6; } if ${gl_cv_func_gettimeofday_posix_signature+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct timeval c; int gettimeofday (struct timeval *restrict, void *restrict); int main () { /* glibc uses struct timezone * rather than the POSIX void * if _GNU_SOURCE is defined. However, since the only portable use of gettimeofday uses NULL as the second parameter, and since the glibc definition is actually more typesafe, it is not worth wrapping this to get a compliant signature. */ int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; int x = f (&c, 0); return !(x | c.tv_sec | c.tv_usec); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_gettimeofday_posix_signature=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int gettimeofday (struct timeval *restrict, struct timezone *restrict); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_gettimeofday_posix_signature=almost else gl_cv_func_gettimeofday_posix_signature=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5 $as_echo "$gl_cv_func_gettimeofday_posix_signature" >&6; } if test $gl_cv_func_gettimeofday_posix_signature = almost; then gl_gettimeofday_timezone='struct timezone' elif test $gl_cv_func_gettimeofday_posix_signature != yes; then REPLACE_GETTIMEOFDAY=1 fi if test $REPLACE_STRUCT_TIMEVAL = 1; then REPLACE_GETTIMEOFDAY=1 fi fi cat >>confdefs.h <<_ACEOF #define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone _ACEOF if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext" for ac_header in sys/timeb.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/timeb.h" "ac_cv_header_sys_timeb_h" "$ac_includes_default" if test "x$ac_cv_header_sys_timeb_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIMEB_H 1 _ACEOF fi done for ac_func in _ftime do : ac_fn_c_check_func "$LINENO" "_ftime" "ac_cv_func__ftime" if test "x$ac_cv_func__ftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__FTIME 1 _ACEOF fi done fi GNULIB_GETTIMEOFDAY=1 $as_echo "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h # Autoconf 2.61a.99 and earlier don't support linking a file only # in VPATH builds. But since GNUmakefile is for maintainer use # only, it does not matter if we skip the link with older autoconf. # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH # builds, so use a shell variable to bypass this. GNUmakefile=GNUmakefile ac_config_links="$ac_config_links $GNUmakefile:$GNUmakefile" HOSTENT_LIB= gl_saved_libs="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl network net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_gethostbyname" != "none required"; then HOSTENT_LIB="$ac_cv_search_gethostbyname" fi fi LIBS="$gl_saved_libs" if test -z "$HOSTENT_LIB"; then for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in winsock2.h and -lws2_32" >&5 $as_echo_n "checking for gethostbyname in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_w32_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_gethostbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #endif #include int main () { gethostbyname(NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_gethostbyname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_gethostbyname" >&5 $as_echo "$gl_cv_w32_gethostbyname" >&6; } if test "$gl_cv_w32_gethostbyname" = "yes"; then HOSTENT_LIB="-lws2_32" fi fi done fi HAVE_INET_NTOP=1 INET_NTOP_LIB= if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $HAVE_WINSOCK2_H = 1; then ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include " if test "x$ac_cv_have_decl_inet_ntop" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_INET_NTOP $ac_have_decl _ACEOF if test $ac_cv_have_decl_inet_ntop = yes; then REPLACE_INET_NTOP=1 INET_NTOP_LIB="-lws2_32" else HAVE_DECL_INET_NTOP=0 HAVE_INET_NTOP=0 fi else gl_save_LIBS=$LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 $as_echo_n "checking for library containing inet_ntop... " >&6; } if ${ac_cv_search_inet_ntop+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntop (); int main () { return inet_ntop (); ; return 0; } _ACEOF for ac_lib in '' nsl resolv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_inet_ntop=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_inet_ntop+:} false; then : break fi done if ${ac_cv_search_inet_ntop+:} false; then : else ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 $as_echo "$ac_cv_search_inet_ntop" >&6; } ac_res=$ac_cv_search_inet_ntop if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else for ac_func in inet_ntop do : ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" if test "x$ac_cv_func_inet_ntop" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INET_NTOP 1 _ACEOF fi done if test $ac_cv_func_inet_ntop = no; then HAVE_INET_NTOP=0 fi fi LIBS=$gl_save_LIBS if test "$ac_cv_search_inet_ntop" != "no" \ && test "$ac_cv_search_inet_ntop" != "none required"; then INET_NTOP_LIB="$ac_cv_search_inet_ntop" fi ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include #if HAVE_NETDB_H # include #endif " if test "x$ac_cv_have_decl_inet_ntop" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_INET_NTOP $ac_have_decl _ACEOF if test $ac_cv_have_decl_inet_ntop = no; then HAVE_DECL_INET_NTOP=0 fi fi if test $HAVE_INET_NTOP = 0 || test $REPLACE_INET_NTOP = 1; then gl_LIBOBJS="$gl_LIBOBJS inet_ntop.$ac_objext" fi GNULIB_INET_NTOP=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc/ld supports -Wl,--output-def" >&5 $as_echo_n "checking if gcc/ld supports -Wl,--output-def... " >&6; } if ${gl_cv_ld_output_def+:} false; then : $as_echo_n "(cached) " >&6 else if test "$enable_shared" = no; then gl_cv_ld_output_def="not needed, shared libraries are disabled" else gl_ldflags_save=$LDFLAGS LDFLAGS="-Wl,--output-def,conftest.def" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_ld_output_def=yes else gl_cv_ld_output_def=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext rm -f conftest.def LDFLAGS="$gl_ldflags_save" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_ld_output_def" >&5 $as_echo "$gl_cv_ld_output_def" >&6; } if test "x$gl_cv_ld_output_def" = "xyes"; then HAVE_LD_OUTPUT_DEF_TRUE= HAVE_LD_OUTPUT_DEF_FALSE='#' else HAVE_LD_OUTPUT_DEF_TRUE='#' HAVE_LD_OUTPUT_DEF_FALSE= fi # Check whether --enable-ld-version-script was given. if test "${enable_ld_version_script+set}" = set; then : enableval=$enable_ld_version_script; have_ld_version_script=$enableval fi if test -z "$have_ld_version_script"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if LD -Wl,--version-script works" >&5 $as_echo_n "checking if LD -Wl,--version-script works... " >&6; } save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" cat > conftest.map <conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : accepts_syntax_errors=yes else accepts_syntax_errors=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$accepts_syntax_errors" = no; then cat > conftest.map <conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_ld_version_script=yes else have_ld_version_script=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else have_ld_version_script=no fi rm -f conftest.map LDFLAGS="$save_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ld_version_script" >&5 $as_echo "$have_ld_version_script" >&6; } fi if test "$have_ld_version_script" = "yes"; then HAVE_LD_VERSION_SCRIPT_TRUE= HAVE_LD_VERSION_SCRIPT_FALSE='#' else HAVE_LD_VERSION_SCRIPT_TRUE='#' HAVE_LD_VERSION_SCRIPT_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lseek detects pipes" >&5 $as_echo_n "checking whether lseek detects pipes... " >&6; } if ${gl_cv_func_lseek_pipe+:} false; then : $as_echo_n "(cached) " >&6 else case "$host_os" in mingw*) gl_cv_func_lseek_pipe=no ;; *) if test $cross_compiling = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include /* for SEEK_CUR */ #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif int main () { /* Exit with success only if stdin is seekable. */ return lseek (0, (off_t)0, SEEK_CUR) < 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if test -s conftest$ac_exeext \ && ./conftest$ac_exeext < conftest.$ac_ext \ && test 1 = "`echo hi \ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi else gl_cv_func_lseek_pipe=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __BEOS__ /* BeOS mistakenly return 0 when trying to seek on pipes. */ Choke me. #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lseek_pipe" >&5 $as_echo "$gl_cv_func_lseek_pipe" >&6; } if test $gl_cv_func_lseek_pipe = no; then REPLACE_LSEEK=1 $as_echo "#define LSEEK_PIPE_BROKEN 1" >>confdefs.h fi if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_LSEEK=1 fi if test $REPLACE_LSEEK = 1; then gl_LIBOBJS="$gl_LIBOBJS lseek.$ac_objext" fi GNULIB_LSEEK=1 $as_echo "#define GNULIB_TEST_LSEEK 1" >>confdefs.h if test $gl_cv_func_malloc_posix = yes; then $as_echo "#define HAVE_MALLOC_POSIX 1" >>confdefs.h else REPLACE_MALLOC=1 fi if test $REPLACE_MALLOC = 1; then gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext" fi GNULIB_MALLOC_POSIX=1 $as_echo "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext" for ac_header in bp-sym.h do : ac_fn_c_check_header_mongrel "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default" if test "x$ac_cv_header_bp_sym_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BP_SYM_H 1 _ACEOF fi done fi GNULIB_MEMCHR=1 $as_echo "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h if test $APPLE_UNIVERSAL_BUILD = 1; then # A universal build on Apple Mac OS X platforms. # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. # But we need a configuration result that is valid in both modes. gl_cv_func_working_mktime=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${gl_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_DECL_ALARM # include #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static char *tz_strings[] = { (char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { int result = 0; time_t t, delta; int i, j; int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1; int time_t_signed = ! ((time_t) 0 < (time_t) -1); #if HAVE_DECL_ALARM /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ signal (SIGALRM, SIG_DFL); alarm (60); #endif time_t_max = (! time_t_signed ? (time_t) -1 : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1) * 2 + 1)); time_t_min = (! time_t_signed ? (time_t) 0 : time_t_signed_magnitude ? ~ (time_t) 0 : ~ time_t_max); delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv (tz_strings[i]); for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta) if (! mktime_test (t)) result |= 1; if ((result & 2) == 0 && ! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) result |= 2; for (j = 1; (result & 4) == 0; j <<= 1) { if (! bigtime_test (j)) result |= 4; if (INT_MAX / 2 < j) break; } if ((result & 8) == 0 && ! bigtime_test (INT_MAX)) result |= 8; } if (! irix_6_4_bug ()) result |= 16; if (! spring_forward_gap ()) result |= 32; if (! year_2050_test ()) result |= 64; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_mktime=yes else gl_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mktime" >&5 $as_echo "$gl_cv_func_working_mktime" >&6; } if test $gl_cv_func_working_mktime = no; then REPLACE_MKTIME=1 else REPLACE_MKTIME=0 fi if test $REPLACE_MKTIME = 1; then gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext" : fi GNULIB_MKTIME=1 $as_echo "#define GNULIB_TEST_MKTIME 1" >>confdefs.h if test $REPLACE_MKTIME = 0; then ac_fn_c_check_func "$LINENO" "__mktime_internal" "ac_cv_func___mktime_internal" if test "x$ac_cv_func___mktime_internal" = xyes; then : $as_echo "#define mktime_internal __mktime_internal" >>confdefs.h else REPLACE_MKTIME=1 fi fi if test $REPLACE_MKTIME = 1; then gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext" : fi if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 $as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext" fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext" fi if test $gl_cv_have_include_next = yes; then gl_cv_next_netdb_h='<'netdb.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_netdb_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_netdb_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'netdb.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_netdb_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_netdb_h='<'netdb.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netdb_h" >&5 $as_echo "$gl_cv_next_netdb_h" >&6; } fi NEXT_NETDB_H=$gl_cv_next_netdb_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'netdb.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_netdb_h fi NEXT_AS_FIRST_DIRECTIVE_NETDB_H=$gl_next_as_first_directive if test $ac_cv_header_netdb_h = yes; then HAVE_NETDB_H=1 else HAVE_NETDB_H=0 fi for gl_func in getaddrinfo freeaddrinfo gai_strerror getnameinfo; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_netinet_in_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_netinet_in_h_selfcontained=yes else gl_cv_header_netinet_in_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_netinet_in_h_selfcontained" >&5 $as_echo "$gl_cv_header_netinet_in_h_selfcontained" >&6; } if test $gl_cv_header_netinet_in_h_selfcontained = yes; then NETINET_IN_H='' else NETINET_IN_H='netinet/in.h' for ac_header in netinet/in.h do : ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" if test "x$ac_cv_header_netinet_in_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETINET_IN_H 1 _ACEOF fi done if test $gl_cv_have_include_next = yes; then gl_cv_next_netinet_in_h='<'netinet/in.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_netinet_in_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_netinet_in_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'netinet/in.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_netinet_in_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_netinet_in_h='<'netinet/in.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netinet_in_h" >&5 $as_echo "$gl_cv_next_netinet_in_h" >&6; } fi NEXT_NETINET_IN_H=$gl_cv_next_netinet_in_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'netinet/in.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_netinet_in_h fi NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H=$gl_next_as_first_directive if test $ac_cv_header_netinet_in_h = yes; then HAVE_NETINET_IN_H=1 else HAVE_NETINET_IN_H=0 fi fi if test -n "$NETINET_IN_H"; then GL_GENERATE_NETINET_IN_H_TRUE= GL_GENERATE_NETINET_IN_H_FALSE='#' else GL_GENERATE_NETINET_IN_H_TRUE='#' GL_GENERATE_NETINET_IN_H_FALSE= fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include #include <$ac_cv_struct_tm> " if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 _ACEOF fi if test "$ac_cv_member_struct_tm_tm_zone" = yes; then $as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TZNAME $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !HAVE_DECL_TZNAME extern char *tzname[]; #endif int main () { return tzname[0][0]; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_var_tzname=yes else ac_cv_var_tzname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5 $as_echo "$ac_cv_var_tzname" >&6; } if test $ac_cv_var_tzname = yes; then $as_echo "#define HAVE_TZNAME 1" >>confdefs.h fi fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for time_t */ #include /* for CHAR_BIT, LONG_MIN, LONG_MAX */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) typedef int verify_min[2 * (LONG_MIN <= TYPE_MINIMUM (time_t)) - 1]; typedef int verify_max[2 * (TYPE_MAXIMUM (time_t) <= LONG_MAX) - 1]; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define TIME_T_FITS_IN_LONG_INT 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Extract the first word of "pmccabe", so it can be a program name with args. set dummy pmccabe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PMCCABE+:} false; then : $as_echo_n "(cached) " >&6 else case $PMCCABE in [\\/]* | ?:[\\/]*) ac_cv_path_PMCCABE="$PMCCABE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PMCCABE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PMCCABE" && ac_cv_path_PMCCABE="false" ;; esac fi PMCCABE=$ac_cv_path_PMCCABE if test -n "$PMCCABE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PMCCABE" >&5 $as_echo "$PMCCABE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_func in rawmemchr do : ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr" if test "x$ac_cv_func_rawmemchr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RAWMEMCHR 1 _ACEOF fi done if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi if test $HAVE_RAWMEMCHR = 0; then gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext" : fi GNULIB_RAWMEMCHR=1 $as_echo "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h : if test $gl_cv_func_malloc_posix = yes; then $as_echo "#define HAVE_REALLOC_POSIX 1" >>confdefs.h else REPLACE_REALLOC=1 fi if test $REPLACE_REALLOC = 1; then gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext" fi GNULIB_REALLOC_POSIX=1 $as_echo "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS recvfrom.$ac_objext" fi GNULIB_RECVFROM=1 $as_echo "#define GNULIB_TEST_RECVFROM 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then REPLACE_SELECT=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select supports a 0 argument" >&5 $as_echo_n "checking whether select supports a 0 argument... " >&6; } if ${gl_cv_func_select_supports0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on Interix. interix*) gl_cv_func_select_supports0="guessing no";; # Guess yes otherwise. *) gl_cv_func_select_supports0="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_SELECT_H #include #endif int main () { struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_select_supports0=yes else gl_cv_func_select_supports0=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_supports0" >&5 $as_echo "$gl_cv_func_select_supports0" >&6; } case "$gl_cv_func_select_supports0" in *yes) ;; *) REPLACE_SELECT=1 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select detects invalid fds" >&5 $as_echo_n "checking whether select detects invalid fds... " >&6; } if ${gl_cv_func_select_detects_ebadf+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_select_detects_ebadf="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include int main () { fd_set set; dup2(0, 16); FD_ZERO(&set); FD_SET(16, &set); close(16); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_select_detects_ebadf=yes else gl_cv_func_select_detects_ebadf=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_detects_ebadf" >&5 $as_echo "$gl_cv_func_select_detects_ebadf" >&6; } case $gl_cv_func_select_detects_ebadf in *yes) ;; *) REPLACE_SELECT=1 ;; esac fi LIB_SELECT="$LIBSOCKET" if test $REPLACE_SELECT = 1; then case "$host_os" in mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include int main () { MsgWaitForMultipleObjects (0, NULL, 0, 0, 0); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else LIB_SELECT="$LIB_SELECT -luser32" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; esac fi if test $REPLACE_SELECT = 1; then gl_LIBOBJS="$gl_LIBOBJS select.$ac_objext" fi GNULIB_SELECT=1 $as_echo "#define GNULIB_TEST_SELECT 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS sendto.$ac_objext" fi GNULIB_SENDTO=1 $as_echo "#define GNULIB_TEST_SENDTO 1" >>confdefs.h SERVENT_LIB= gl_saved_libs="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyname" >&5 $as_echo_n "checking for library containing getservbyname... " >&6; } if ${ac_cv_search_getservbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getservbyname (); int main () { return getservbyname (); ; return 0; } _ACEOF for ac_lib in '' socket network net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getservbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getservbyname+:} false; then : break fi done if ${ac_cv_search_getservbyname+:} false; then : else ac_cv_search_getservbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyname" >&5 $as_echo "$ac_cv_search_getservbyname" >&6; } ac_res=$ac_cv_search_getservbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_getservbyname" != "none required"; then SERVENT_LIB="$ac_cv_search_getservbyname" fi fi LIBS="$gl_saved_libs" if test -z "$SERVENT_LIB"; then for ac_func in getservbyname do : ac_fn_c_check_func "$LINENO" "getservbyname" "ac_cv_func_getservbyname" if test "x$ac_cv_func_getservbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETSERVBYNAME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getservbyname in winsock2.h and -lws2_32" >&5 $as_echo_n "checking for getservbyname in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_w32_getservbyname+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_w32_getservbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #endif #include int main () { getservbyname(NULL,NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_w32_getservbyname=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getservbyname" >&5 $as_echo "$gl_cv_w32_getservbyname" >&6; } if test "$gl_cv_w32_getservbyname" = "yes"; then SERVENT_LIB="-lws2_32" fi fi done fi if test $ac_cv_func_setenv = no; then HAVE_SETENV=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5 $as_echo_n "checking whether setenv validates arguments... " >&6; } if ${gl_cv_func_setenv_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_setenv_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_setenv_works="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; { if (setenv ("", "", 0) != -1) result |= 1; else if (errno != EINVAL) result |= 2; } { if (setenv ("a", "=", 1) != 0) result |= 4; else if (strcmp (getenv ("a"), "=") != 0) result |= 8; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_setenv_works=yes else gl_cv_func_setenv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setenv_works" >&5 $as_echo "$gl_cv_func_setenv_works" >&6; } case "$gl_cv_func_setenv_works" in *yes) ;; *) REPLACE_SETENV=1 ;; esac fi if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext" fi GNULIB_SETENV=1 $as_echo "#define GNULIB_TEST_SETENV 1" >>confdefs.h if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS shutdown.$ac_objext" fi GNULIB_SHUTDOWN=1 $as_echo "#define GNULIB_TEST_SHUTDOWN 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_signal_h='<'signal.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_signal_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'signal.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_signal_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5 $as_echo "$gl_cv_next_signal_h" >&6; } fi NEXT_SIGNAL_H=$gl_cv_next_signal_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'signal.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_signal_h fi NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive # AIX declares sig_atomic_t to already include volatile, and C89 compilers # then choke on 'volatile sig_atomic_t'. C99 requires that it compile. ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" " #include " if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes; then : else HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0 fi ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" " #include " if test "x$ac_cv_type_sighandler_t" = xyes; then : else HAVE_SIGHANDLER_T=0 fi for gl_func in pthread_sigmask sigaction sigaddset sigdelset sigemptyset sigfillset sigismember sigpending sigprocmask; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 $as_echo_n "checking for SIZE_MAX... " >&6; } if ${gl_cv_size_max+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_size_max= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Found it" >/dev/null 2>&1; then : gl_cv_size_max=yes fi rm -f conftest* if test -z "$gl_cv_size_max"; then if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include #include "; then : else size_t_bits_minus_1= fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : else fits_in_uint= fi if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern size_t foo; extern unsigned long foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : fits_in_uint=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else gl_cv_size_max='((size_t)~(size_t)0)' fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5 $as_echo "$gl_cv_size_max" >&6; } if test "$gl_cv_size_max" != yes; then cat >>confdefs.h <<_ACEOF #define SIZE_MAX $gl_cv_size_max _ACEOF fi gl_cv_func_snprintf_usable=no for ac_func in snprintf do : ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SNPRINTF 1 _ACEOF fi done if test $ac_cv_func_snprintf = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 $as_echo_n "checking whether snprintf respects a size of 1... " >&6; } if ${gl_cv_func_snprintf_size1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gl_cv_func_snprintf_size1="guessing yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_snprintf_size1=yes else gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 $as_echo "$gl_cv_func_snprintf_size1" >&6; } case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 $as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } if ${gl_cv_func_printf_positions+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_printf_positions=yes else gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 $as_echo "$gl_cv_func_printf_positions" >&6; } case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_snprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_usable = no; then gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" if test $ac_cv_func_snprintf = yes; then REPLACE_SNPRINTF=1 fi : fi if test $ac_cv_have_decl_snprintf = no; then HAVE_DECL_SNPRINTF=0 fi GNULIB_SNPRINTF=1 $as_echo "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define GNULIB_SNPRINTF 1 _ACEOF if test "$ac_cv_header_winsock2_h" = yes; then gl_LIBOBJS="$gl_LIBOBJS socket.$ac_objext" fi # When this module is used, sockets may actually occur as file descriptors, # hence it is worth warning if the modules 'close' and 'ioctl' are not used. if test "$ac_cv_header_winsock2_h" = yes; then UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1 SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1 fi GNULIB_SOCKET=1 $as_echo "#define GNULIB_TEST_SOCKET 1" >>confdefs.h if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi LIBSOCKET= if test $HAVE_WINSOCK2_H = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to call WSAStartup in winsock2.h and -lws2_32" >&5 $as_echo_n "checking if we need to call WSAStartup in winsock2.h and -lws2_32... " >&6; } if ${gl_cv_func_wsastartup+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H # include #endif int main () { WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); WSACleanup (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_func_wsastartup=yes else gl_cv_func_wsastartup=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gl_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wsastartup" >&5 $as_echo "$gl_cv_func_wsastartup" >&6; } if test "$gl_cv_func_wsastartup" = "yes"; then $as_echo "#define WINDOWS_SOCKETS 1" >>confdefs.h LIBSOCKET='-lws2_32' fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${gl_cv_lib_socket+:} false; then : $as_echo_n "(cached) " >&6 else gl_cv_lib_socket= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_save_LIBS="$LIBS" LIBS="$gl_save_LIBS -lsocket" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lsocket" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnetwork" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnetwork" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnet" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern #ifdef __cplusplus "C" #endif char setsockopt(); int main () { setsockopt(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gl_cv_lib_socket="-lnet" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi fi LIBS="$gl_save_LIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$gl_cv_lib_socket"; then gl_cv_lib_socket="none needed" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_socket" >&5 $as_echo "$gl_cv_lib_socket" >&6; } if test "$gl_cv_lib_socket" != "none needed"; then LIBSOCKET="$gl_cv_lib_socket" fi fi : ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " /* is not needed according to POSIX, but the in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #if HAVE_SYS_SOCKET_H # include #elif HAVE_WS2TCPIP_H # include #endif " if test "x$ac_cv_type_socklen_t" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5 $as_echo_n "checking for socklen_t equivalent... " >&6; } if ${gl_cv_socklen_t_equiv+:} false; then : $as_echo_n "(cached) " >&6 else # Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername gl_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t "unsigned int" "long int" "unsigned long int"; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int getpeername (int, $arg2 *, $t *); int main () { $t len; getpeername (0, 0, &len); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socklen_t_equiv="$t" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$gl_cv_socklen_t_equiv" != "" && break done test "$gl_cv_socklen_t_equiv" != "" && break done fi if test "$gl_cv_socklen_t_equiv" = ""; then as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socklen_t_equiv" >&5 $as_echo "$gl_cv_socklen_t_equiv" >&6; } cat >>confdefs.h <<_ACEOF #define socklen_t $gl_cv_socklen_t_equiv _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 $as_echo_n "checking for ssize_t... " >&6; } if ${gt_cv_ssize_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_ssize_t=yes else gt_cv_ssize_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 $as_echo "$gt_cv_ssize_t" >&6; } if test $gt_cv_ssize_t = no; then $as_echo "#define ssize_t int" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on directories" >&5 $as_echo_n "checking whether stat handles trailing slashes on directories... " >&6; } if ${gl_cv_func_stat_dir_slash+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case $host_os in mingw*) gl_cv_func_stat_dir_slash="guessing no";; *) gl_cv_func_stat_dir_slash="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat st; return stat (".", &st) != stat ("./", &st); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_stat_dir_slash=yes else gl_cv_func_stat_dir_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_dir_slash" >&5 $as_echo "$gl_cv_func_stat_dir_slash" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5 $as_echo_n "checking whether stat handles trailing slashes on files... " >&6; } if ${gl_cv_func_stat_file_slash+:} false; then : $as_echo_n "(cached) " >&6 else touch conftest.tmp # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.tmp conftest.lnk fi if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_stat_file_slash="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_stat_file_slash=yes else gl_cv_func_stat_file_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.tmp conftest.lnk fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5 $as_echo "$gl_cv_func_stat_file_slash" >&6; } case $gl_cv_func_stat_dir_slash in *no) REPLACE_STAT=1 $as_echo "#define REPLACE_FUNC_STAT_DIR 1" >>confdefs.h ;; esac case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 $as_echo "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h ;; esac if test $REPLACE_STAT = 1; then gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext" : fi GNULIB_STAT=1 $as_echo "#define GNULIB_TEST_STAT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5 $as_echo_n "checking for working stdalign.h... " >&6; } if ${gl_cv_header_working_stdalign_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ (__GNUC__ || __IBMC__ || __IBMCPP__ \ || 0x5110 <= __SUNPRO_C || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_working_stdalign_h=yes else gl_cv_header_working_stdalign_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdalign_h" >&5 $as_echo "$gl_cv_header_working_stdalign_h" >&6; } if test $gl_cv_header_working_stdalign_h = yes; then STDALIGN_H='' else STDALIGN_H='stdalign.h' fi if test -n "$STDALIGN_H"; then GL_GENERATE_STDALIGN_H_TRUE= GL_GENERATE_STDALIGN_H_FALSE='#' else GL_GENERATE_STDALIGN_H_TRUE='#' GL_GENERATE_STDALIGN_H_FALSE= fi STDARG_H='' NEXT_STDARG_H='' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5 $as_echo_n "checking for va_copy... " >&6; } if ${gl_cv_func_va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef va_copy void (*func) (va_list, va_list) = va_copy; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func_va_copy=yes else gl_cv_func_va_copy=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_va_copy" >&5 $as_echo "$gl_cv_func_va_copy" >&6; } if test $gl_cv_func_va_copy = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _AIX && !defined __GNUC__ AIX vaccine #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "vaccine" >/dev/null 2>&1; then : gl_aixcc=yes else gl_aixcc=no fi rm -f conftest* if test $gl_aixcc = yes; then STDARG_H=stdarg.h if test $gl_cv_have_include_next = yes; then gl_cv_next_stdarg_h='<'stdarg.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdarg_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdarg.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stdarg_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdarg_h" >&5 $as_echo "$gl_cv_next_stdarg_h" >&6; } fi NEXT_STDARG_H=$gl_cv_next_stdarg_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdarg.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdarg_h fi NEXT_AS_FIRST_DIRECTIVE_STDARG_H=$gl_next_as_first_directive if test "$gl_cv_next_stdarg_h" = '""'; then gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' NEXT_STDARG_H="$gl_cv_next_stdarg_h" fi else saved_as_echo_n="$as_echo_n" as_echo_n=':' if ${gl_cv_func___va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef __va_copy error, bail out #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_func___va_copy=yes else gl_cv_func___va_copy=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi as_echo_n="$saved_as_echo_n" if test $gl_cv_func___va_copy = yes; then $as_echo "#define va_copy __va_copy" >>confdefs.h else $as_echo "#define va_copy gl_va_copy" >>confdefs.h fi fi fi if test -n "$STDARG_H"; then GL_GENERATE_STDARG_H_TRUE= GL_GENERATE_STDARG_H_FALSE='#' else GL_GENERATE_STDARG_H_TRUE='#' GL_GENERATE_STDARG_H_FALSE= fi # Define two additional variables used in the Makefile substitution. if test "$ac_cv_header_stdbool_h" = yes; then STDBOOL_H='' else STDBOOL_H='stdbool.h' fi if test -n "$STDBOOL_H"; then GL_GENERATE_STDBOOL_H_TRUE= GL_GENERATE_STDBOOL_H_FALSE='#' else GL_GENERATE_STDBOOL_H_TRUE='#' GL_GENERATE_STDBOOL_H_FALSE= fi if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi STDDEF_H= if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 $as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; } if ${gl_cv_decl_null_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int test[2 * (sizeof NULL == sizeof (void *)) -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_null_works=yes else gl_cv_decl_null_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 $as_echo "$gl_cv_decl_null_works" >&6; } if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi if test -n "$STDDEF_H"; then GL_GENERATE_STDDEF_H_TRUE= GL_GENERATE_STDDEF_H_FALSE='#' else GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE= fi if test -n "$STDDEF_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_stddef_h='<'stddef.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stddef_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stddef.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stddef_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 $as_echo "$gl_cv_next_stddef_h" >&6; } fi NEXT_STDDEF_H=$gl_cv_next_stddef_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stddef.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stddef_h fi NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive fi if test $gl_cv_have_include_next = yes; then gl_cv_next_stdio_h='<'stdio.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdio_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdio.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stdio_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5 $as_echo "$gl_cv_next_stdio_h" >&6; } fi NEXT_STDIO_H=$gl_cv_next_stdio_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdio.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdio_h fi NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive GNULIB_FSCANF=1 cat >>confdefs.h <<_ACEOF #define GNULIB_FSCANF 1 _ACEOF GNULIB_SCANF=1 cat >>confdefs.h <<_ACEOF #define GNULIB_SCANF 1 _ACEOF GNULIB_FGETC=1 GNULIB_GETC=1 GNULIB_GETCHAR=1 GNULIB_FGETS=1 GNULIB_FREAD=1 GNULIB_FPRINTF=1 GNULIB_PRINTF=1 GNULIB_VFPRINTF=1 GNULIB_VPRINTF=1 GNULIB_FPUTC=1 GNULIB_PUTC=1 GNULIB_PUTCHAR=1 GNULIB_FPUTS=1 GNULIB_PUTS=1 GNULIB_FWRITE=1 for gl_func in dprintf fpurge fseeko ftello getdelim getline gets pclose popen renameat snprintf tmpfile vdprintf vsnprintf; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $gl_cv_have_include_next = yes; then gl_cv_next_stdlib_h='<'stdlib.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stdlib_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdlib.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stdlib_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5 $as_echo "$gl_cv_next_stdlib_h" >&6; } fi NEXT_STDLIB_H=$gl_cv_next_stdlib_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdlib.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdlib_h fi NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive for gl_func in _Exit atoll canonicalize_file_name getloadavg getsubopt grantpt initstate initstate_r mkdtemp mkostemp mkostemps mkstemp mkstemps posix_openpt ptsname ptsname_r random random_r realpath rpmatch secure_getenv setenv setstate setstate_r srandom srandom_r strtod strtoll strtoull unlockpt unsetenv; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SYS_LOADAVG_H # include #endif #if HAVE_RANDOM_H # include #endif int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done for ac_func in strcasecmp do : ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCASECMP 1 _ACEOF fi done if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi for ac_func in strncasecmp do : ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" if test "x$ac_cv_func_strncasecmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRNCASECMP 1 _ACEOF fi done if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi ac_fn_c_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default" if test "x$ac_cv_have_decl_strncasecmp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNCASECMP $ac_have_decl _ACEOF if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi if test $HAVE_STRCASECMP = 0; then gl_LIBOBJS="$gl_LIBOBJS strcasecmp.$ac_objext" : fi if test $HAVE_STRNCASECMP = 0; then gl_LIBOBJS="$gl_LIBOBJS strncasecmp.$ac_objext" : fi for ac_func in strchrnul do : ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul" if test "x$ac_cv_func_strchrnul" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCHRNUL 1 _ACEOF fi done if test $ac_cv_func_strchrnul = no; then HAVE_STRCHRNUL=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5 $as_echo_n "checking whether strchrnul works... " >&6; } if ${gl_cv_func_strchrnul_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1; then : gl_cv_func_strchrnul_works="guessing yes" else gl_cv_func_strchrnul_works="guessing no" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for strchrnul */ int main () { const char *buf = "a"; return strchrnul (buf, 'b') != buf + 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strchrnul_works=yes else gl_cv_func_strchrnul_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5 $as_echo "$gl_cv_func_strchrnul_works" >&6; } case "$gl_cv_func_strchrnul_works" in *yes) ;; *) REPLACE_STRCHRNUL=1 ;; esac fi if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then gl_LIBOBJS="$gl_LIBOBJS strchrnul.$ac_objext" : fi GNULIB_STRCHRNUL=1 $as_echo "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h if test $ac_cv_func_strdup = yes; then if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi fi if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext" : fi GNULIB_STRDUP=1 $as_echo "#define GNULIB_TEST_STRDUP 1" >>confdefs.h if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5 $as_echo_n "checking for working strerror function... " >&6; } if ${gl_cv_func_working_strerror+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_working_strerror="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (!*strerror (-2)) return 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_strerror=yes else gl_cv_func_working_strerror=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5 $as_echo "$gl_cv_func_working_strerror" >&6; } case "$gl_cv_func_working_strerror" in *yes) ;; *) REPLACE_STRERROR=1 ;; esac else REPLACE_STRERROR=1 fi if test $REPLACE_STRERROR = 1; then gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext" fi cat >>confdefs.h <<_ACEOF #define GNULIB_STRERROR 1 _ACEOF GNULIB_STRERROR=1 $as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext" if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi fi if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5 $as_echo_n "checking for working strndup... " >&6; } if ${gl_cv_func_strndup_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); return s[13] != '\0'; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strndup_works=yes else gl_cv_func_strndup_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5 $as_echo "$gl_cv_func_strndup_works" >&6; } case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext" fi GNULIB_STRNDUP=1 $as_echo "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5 $as_echo_n "checking for working strnlen... " >&6; } if ${ac_cv_func_strnlen_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess no on AIX systems, yes otherwise. case "$host_os" in aix*) ac_cv_func_strnlen_working=no;; *) ac_cv_func_strnlen_working=yes;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { #define S "foobar" #define S_LEN (sizeof S - 1) /* At least one implementation is buggy: that of AIX 4.3 would give strnlen (S, 1) == 3. */ int i; for (i = 0; i < S_LEN + 1; ++i) { int expected = i <= S_LEN ? i : S_LEN; if (strnlen (S, i) != expected) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strnlen_working=yes else ac_cv_func_strnlen_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5 $as_echo "$ac_cv_func_strnlen_working" >&6; } test $ac_cv_func_strnlen_working = no && : if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext" : fi GNULIB_STRNLEN=1 $as_echo "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h for ac_func in strtok_r do : ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r" if test "x$ac_cv_func_strtok_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRTOK_R 1 _ACEOF fi done if test $ac_cv_func_strtok_r = yes; then HAVE_STRTOK_R=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtok_r works" >&5 $as_echo_n "checking whether strtok_r works... " >&6; } if ${gl_cv_func_strtok_r_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess no on glibc systems. *-gnu*) gl_cv_func_strtok_r_works="guessing no";; *) gl_cv_func_strtok_r_works="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __OPTIMIZE__ # define __OPTIMIZE__ 1 #endif #undef __OPTIMIZE_SIZE__ #undef __NO_INLINE__ #include #include int main () { static const char dummy[] = "\177\01a"; char delimiters[] = "xxxxxxxx"; char *save_ptr = (char *) dummy; strtok_r (delimiters, "x", &save_ptr); strtok_r (NULL, "x", &save_ptr); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_strtok_r_works=yes else gl_cv_func_strtok_r_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtok_r_works" >&5 $as_echo "$gl_cv_func_strtok_r_works" >&6; } case "$gl_cv_func_strtok_r_works" in *no) UNDEFINE_STRTOK_R=1 ;; esac else HAVE_STRTOK_R=0 fi if test $ac_cv_have_decl_strtok_r = no; then HAVE_DECL_STRTOK_R=0 fi if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then gl_LIBOBJS="$gl_LIBOBJS strtok_r.$ac_objext" : fi GNULIB_STRTOK_R=1 $as_echo "#define GNULIB_TEST_STRTOK_R 1" >>confdefs.h for ac_func in strverscmp do : ac_fn_c_check_func "$LINENO" "strverscmp" "ac_cv_func_strverscmp" if test "x$ac_cv_func_strverscmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRVERSCMP 1 _ACEOF fi done if test $ac_cv_func_strverscmp = no; then HAVE_STRVERSCMP=0 fi if test $HAVE_STRVERSCMP = 0; then gl_LIBOBJS="$gl_LIBOBJS strverscmp.$ac_objext" : fi GNULIB_STRVERSCMP=1 $as_echo "#define GNULIB_TEST_STRVERSCMP 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_select_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct timeval b; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_select_h_selfcontained=yes else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $gl_cv_header_sys_select_h_selfcontained = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int memset; int bzero; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef memset #define memset nonexistent_memset extern #ifdef __cplusplus "C" #endif void *memset (void *, int, unsigned long); #undef bzero #define bzero nonexistent_bzero extern #ifdef __cplusplus "C" #endif void bzero (void *, unsigned long); fd_set fds; FD_ZERO (&fds); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else gl_cv_header_sys_select_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_select_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_select_h_selfcontained" >&6; } if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_select_h='<'sys/select.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_select_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_select_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/select.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_select_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_select_h='<'sys/select.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_select_h" >&5 $as_echo "$gl_cv_next_sys_select_h" >&6; } fi NEXT_SYS_SELECT_H=$gl_cv_next_sys_select_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/select.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_select_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H=$gl_next_as_first_directive if test $ac_cv_header_sys_select_h = yes; then HAVE_SYS_SELECT_H=1 else HAVE_SYS_SELECT_H=0 fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi for gl_func in pselect select; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Some systems require prerequisite headers. */ #include #if !(defined __GLIBC__ && !defined __UCLIBC__) && HAVE_SYS_TIME_H # include #endif #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done case "$host_os" in osf*) $as_echo "#define _POSIX_PII_SOCKET 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether is self-contained" >&5 $as_echo_n "checking whether is self-contained... " >&6; } if ${gl_cv_header_sys_socket_h_selfcontained+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_selfcontained=yes else gl_cv_header_sys_socket_h_selfcontained=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_selfcontained" >&5 $as_echo "$gl_cv_header_sys_socket_h_selfcontained" >&6; } if test $gl_cv_header_sys_socket_h_selfcontained = yes; then for ac_func in shutdown do : ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown" if test "x$ac_cv_func_shutdown" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SHUTDOWN 1 _ACEOF fi done if test $ac_cv_func_shutdown = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether defines the SHUT_* macros" >&5 $as_echo_n "checking whether defines the SHUT_* macros... " >&6; } if ${gl_cv_header_sys_socket_h_shut+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR }; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_sys_socket_h_shut=yes else gl_cv_header_sys_socket_h_shut=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_shut" >&5 $as_echo "$gl_cv_header_sys_socket_h_shut" >&6; } if test $gl_cv_header_sys_socket_h_shut = no; then SYS_SOCKET_H='sys/socket.h' fi fi fi # We need to check for ws2tcpip.h now. if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_socket_h='<'sys/socket.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_socket_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_socket_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/socket.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_socket_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_socket_h='<'sys/socket.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_socket_h" >&5 $as_echo "$gl_cv_next_sys_socket_h" >&6; } fi NEXT_SYS_SOCKET_H=$gl_cv_next_sys_socket_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/socket.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_socket_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H=$gl_next_as_first_directive if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 HAVE_WS2TCPIP_H=0 else HAVE_SYS_SOCKET_H=0 if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_struct_sockaddr_storage" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" " /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_type_sa_family_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SA_FAMILY_T 1 _ACEOF fi if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif " if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 _ACEOF else HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0 fi fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then SYS_SOCKET_H='sys/socket.h' fi if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi for gl_func in socket connect accept bind getpeername getsockname getsockopt listen recv send recvfrom sendto setsockopt shutdown accept4; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Some systems require prerequisite headers. */ #include #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_stat_h='<'sys/stat.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_stat_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_stat_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/stat.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_stat_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_stat_h='<'sys/stat.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5 $as_echo "$gl_cv_next_sys_stat_h" >&6; } fi NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/stat.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_stat_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive if test $WINDOWS_64_BIT_ST_SIZE = 1; then $as_echo "#define _GL_WINDOWS_64_BIT_ST_SIZE 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include #include " if test "x$ac_cv_type_nlink_t" = xyes; then : else $as_echo "#define nlink_t int" >>confdefs.h fi for gl_func in fchmodat fstat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat mknod mknodat stat utimensat; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_uio_h='<'sys/uio.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_sys_uio_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_sys_uio_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/uio.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_sys_uio_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_sys_uio_h='<'sys/uio.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_uio_h" >&5 $as_echo "$gl_cv_next_sys_uio_h" >&6; } fi NEXT_SYS_UIO_H=$gl_cv_next_sys_uio_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/uio.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_uio_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H=$gl_next_as_first_directive if test $ac_cv_header_sys_uio_h = yes; then HAVE_SYS_UIO_H=1 else HAVE_SYS_UIO_H=0 fi ac_fn_c_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" "#include " if test "x$ac_cv_have_decl_localtime_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LOCALTIME_R $ac_have_decl _ACEOF if test $ac_cv_have_decl_localtime_r = no; then HAVE_DECL_LOCALTIME_R=0 fi if test $ac_cv_func_localtime_r = yes; then HAVE_LOCALTIME_R=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime_r is compatible with its POSIX signature" >&5 $as_echo_n "checking whether localtime_r is compatible with its POSIX signature... " >&6; } if ${gl_cv_time_r_posix+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* We don't need to append 'restrict's to the argument types, even though the POSIX signature has the 'restrict's, since C99 says they can't affect type compatibility. */ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; if (ptr) return 0; /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ *localtime_r (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_time_r_posix=yes else gl_cv_time_r_posix=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_r_posix" >&5 $as_echo "$gl_cv_time_r_posix" >&6; } if test $gl_cv_time_r_posix = yes; then REPLACE_LOCALTIME_R=0 else REPLACE_LOCALTIME_R=1 fi else HAVE_LOCALTIME_R=0 fi if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then gl_LIBOBJS="$gl_LIBOBJS time_r.$ac_objext" : fi GNULIB_TIME_R=1 $as_echo "#define GNULIB_TEST_TIME_R 1" >>confdefs.h REPLACE_TIMEGM=0 if test $ac_cv_func_timegm = yes; then if test $gl_cv_func_working_mktime = no; then # Assume that timegm is buggy if mktime is. REPLACE_TIMEGM=1 fi else HAVE_TIMEGM=0 fi if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then gl_LIBOBJS="$gl_LIBOBJS timegm.$ac_objext" : fi GNULIB_TIMEGM=1 $as_echo "#define GNULIB_TEST_TIMEGM 1" >>confdefs.h : if test $gl_cv_have_include_next = yes; then gl_cv_next_unistd_h='<'unistd.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_unistd_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_unistd_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'unistd.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_unistd_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_unistd_h='<'unistd.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5 $as_echo "$gl_cv_next_unistd_h" >&6; } fi NEXT_UNISTD_H=$gl_cv_next_unistd_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'unistd.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_unistd_h fi NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi for gl_func in chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize getgroups gethostname getlogin getlogin_r getpagesize getusershell setusershell endusershell group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite readlink readlinkat rmdir sethostname sleep symlink symlinkat ttyname_r unlink unlinkat usleep; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_UNISTD_H # include #endif /* Some systems declare various items in the wrong headers. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # include # endif #endif int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $ac_cv_have_decl_unsetenv = no; then HAVE_DECL_UNSETENV=0 fi for ac_func in unsetenv do : ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" if test "x$ac_cv_func_unsetenv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNSETENV 1 _ACEOF fi done if test $ac_cv_func_unsetenv = no; then HAVE_UNSETENV=0 else HAVE_UNSETENV=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5 $as_echo_n "checking for unsetenv() return type... " >&6; } if ${gt_cv_func_unsetenv_ret+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _BSD #define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 */ #include extern #ifdef __cplusplus "C" #endif int unsetenv (const char *name); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_func_unsetenv_ret='int' else gt_cv_func_unsetenv_ret='void' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5 $as_echo "$gt_cv_func_unsetenv_ret" >&6; } if test $gt_cv_func_unsetenv_ret = 'void'; then $as_echo "#define VOID_UNSETENV 1" >>confdefs.h REPLACE_UNSETENV=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5 $as_echo_n "checking whether unsetenv obeys POSIX... " >&6; } if ${gl_cv_func_unsetenv_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_unsetenv_works="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern char **environ; int main () { char entry1[] = "a=1"; char entry2[] = "b=2"; char *env[] = { entry1, entry2, NULL }; if (putenv ((char *) "a=1")) return 1; if (putenv (entry2)) return 2; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 3; if (!unsetenv ("") || errno != EINVAL) return 4; entry2[0] = 'b'; environ = env; if (!getenv ("a")) return 5; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 6; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_unsetenv_works=yes else gl_cv_func_unsetenv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5 $as_echo "$gl_cv_func_unsetenv_works" >&6; } case "$gl_cv_func_unsetenv_works" in *yes) ;; *) REPLACE_UNSETENV=1 ;; esac fi if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext" fi GNULIB_UNSETENV=1 $as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h # Check whether --enable-valgrind-tests was given. if test "${enable_valgrind_tests+set}" = set; then : enableval=$enable_valgrind_tests; opt_valgrind_tests=$enableval else opt_valgrind_tests=yes fi # Run self-tests under valgrind? if test "$opt_valgrind_tests" = "yes" && test "$cross_compiling" = no; then for ac_prog in valgrind do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_VALGRIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$VALGRIND"; then ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_VALGRIND="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi VALGRIND=$ac_cv_prog_VALGRIND if test -n "$VALGRIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5 $as_echo "$VALGRIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$VALGRIND" && break done fi OPTS="-q --error-exitcode=1 --leak-check=no" if test -n "$VALGRIND" \ && $VALGRIND $OPTS $SHELL -c 'exit 0' > /dev/null 2>&1; then opt_valgrind_tests=yes VALGRIND="$VALGRIND $OPTS" else opt_valgrind_tests=no VALGRIND= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether self tests are run under valgrind" >&5 $as_echo_n "checking whether self tests are run under valgrind... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $opt_valgrind_tests" >&5 $as_echo "$opt_valgrind_tests" >&6; } if test $ac_cv_func_vasnprintf = no; then gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done if test $ac_cv_func_vasprintf = no; then gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext" if test $ac_cv_func_vasprintf = yes; then REPLACE_VASPRINTF=1 else HAVE_VASPRINTF=0 fi fi GNULIB_VASPRINTF=1 $as_echo "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format" if test $gl_cv_have_include_next = yes; then gl_cv_next_wchar_h='<'wchar.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_wchar_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_wchar_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wchar.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_wchar_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_wchar_h='<'wchar.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5 $as_echo "$gl_cv_next_wchar_h" >&6; } fi NEXT_WCHAR_H=$gl_cv_next_wchar_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wchar.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wchar_h fi NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi for gl_func in btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth ; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include #endif #include int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done : for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done : : XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=xasprintf:1:c-format" # End of code from modules gltests_libdeps= gltests_ltlibdeps= gl_source_base='gl/tests' gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gltests_WITNESS # Check whether --enable-valgrind-tests was given. if test "${enable_valgrind_tests+set}" = set; then : enableval=$enable_valgrind_tests; opt_valgrind_tests=$enableval else opt_valgrind_tests=yes fi # Run self-tests under valgrind? if test "$opt_valgrind_tests" = "yes" && test "$cross_compiling" = no; then for ac_prog in valgrind do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_VALGRIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$VALGRIND"; then ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_VALGRIND="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi VALGRIND=$ac_cv_prog_VALGRIND if test -n "$VALGRIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5 $as_echo "$VALGRIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$VALGRIND" && break done fi OPTS="-q --error-exitcode=1 --leak-check=no" if test -n "$VALGRIND" \ && $VALGRIND $OPTS $SHELL -c 'exit 0' > /dev/null 2>&1; then opt_valgrind_tests=yes VALGRIND="$VALGRIND $OPTS" else opt_valgrind_tests=no VALGRIND= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether self tests are run under valgrind" >&5 $as_echo_n "checking whether self tests are run under valgrind... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $opt_valgrind_tests" >&5 $as_echo "$opt_valgrind_tests" >&6; } ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" if test "x$ac_cv_have_decl_strerror_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R $ac_have_decl _ACEOF for ac_func in strerror_r do : ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" if test "x$ac_cv_func_strerror_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR_R 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 $as_echo_n "checking whether strerror_r returns char *... " >&6; } if ${ac_cv_func_strerror_r_char_p+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default extern char *strerror_r (); int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); return ! isalpha (x); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 $as_echo "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then $as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h fi if test $gl_cv_have_include_next = yes; then gl_cv_next_getopt_h='<'getopt.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_getopt_h+:} false; then : $as_echo_n "(cached) " >&6 else if test $ac_cv_header_getopt_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'getopt.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_getopt_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' else gl_cv_next_getopt_h='<'getopt.h'>' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5 $as_echo "$gl_cv_next_getopt_h" >&6; } fi NEXT_GETOPT_H=$gl_cv_next_getopt_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'getopt.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_getopt_h fi NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi gl_replace_getopt= if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF else gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_func in getopt_long_only do : ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only" if test "x$ac_cv_func_getopt_long_only" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_LONG_ONLY 1 _ACEOF else gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5 $as_echo_n "checking whether getopt is POSIX compatible... " >&6; } if ${gl_cv_func_getopt_posix+:} false; then : $as_echo_n "(cached) " >&6 else if test $cross_compiling = no; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=maybe else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=maybe else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_posix=yes else gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5 $as_echo "$gl_cv_func_getopt_posix" >&6; } case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5 $as_echo_n "checking for working GNU getopt function... " >&6; } if ${gl_cv_func_getopt_gnu+:} false; then : $as_echo_n "(cached) " >&6 else # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include /* A POSIX signal handler. */ static void exception_handler (int sig) { exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif int main () { int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_gnu=yes else gl_cv_func_getopt_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi case $gl_had_POSIXLY_CORRECT in exported) ;; yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;; *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5 $as_echo "$gl_cv_func_getopt_gnu" >&6; } if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5 $as_echo_n "checking for working GNU getopt_long function... " >&6; } if ${gl_cv_func_getopt_long_gnu+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_getopt_long_gnu=yes else gl_cv_func_getopt_long_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5 $as_echo "$gl_cv_func_getopt_long_gnu" >&6; } case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi REPLACE_GETOPT=0 if test -n "$gl_replace_getopt"; then REPLACE_GETOPT=1 fi if test $REPLACE_GETOPT = 1; then GETOPT_H=getopt.h $as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "getenv" "ac_cv_have_decl_getenv" "$ac_includes_default" if test "x$ac_cv_have_decl_getenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETENV $ac_have_decl _ACEOF GNULIB_LOCALECONV=0; GNULIB_SETLOCALE=0; GNULIB_DUPLOCALE=0; HAVE_DUPLOCALE=1; REPLACE_LOCALECONV=0; REPLACE_SETLOCALE=0; REPLACE_DUPLOCALE=0; REPLACE_STRUCT_LCONV=0; if true; then GL_COND_LIBTOOL_TRUE= GL_COND_LIBTOOL_FALSE='#' else GL_COND_LIBTOOL_TRUE='#' GL_COND_LIBTOOL_FALSE= fi gl_cond_libtool=true gl_m4_base='src/gl/m4' gl_source_base='src/gl' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then gl2_LIBOBJS="$gl2_LIBOBJS error.$ac_objext" : fi XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format" if test $REPLACE_GETOPT = 1; then gl2_LIBOBJS="$gl2_LIBOBJS getopt.$ac_objext" gl2_LIBOBJS="$gl2_LIBOBJS getopt1.$ac_objext" GNULIB_GL_GL2_UNISTD_H_GETOPT=1 fi $as_echo "#define GNULIB_TEST_GETOPT_GNU 1" >>confdefs.h REPLACE_GETOPT=0 if test -n "$gl_replace_getopt"; then REPLACE_GETOPT=1 fi if test $REPLACE_GETOPT = 1; then GETOPT_H=getopt.h $as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h fi if test $REPLACE_GETOPT = 1; then gl2_LIBOBJS="$gl2_LIBOBJS getopt.$ac_objext" gl2_LIBOBJS="$gl2_LIBOBJS getopt1.$ac_objext" GNULIB_GL_GL2_UNISTD_H_GETOPT=1 fi case "$host_os" in solaris*) $as_echo "#define _LCONV_C99 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5 $as_echo_n "checking whether locale.h conforms to POSIX:2001... " >&6; } if ${gl_cv_header_locale_h_posix2001+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_locale_h_posix2001=yes else gl_cv_header_locale_h_posix2001=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_h_posix2001" >&5 $as_echo "$gl_cv_header_locale_h_posix2001" >&6; } if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5 $as_echo_n "checking whether locale.h defines locale_t... " >&6; } if ${gl_cv_header_locale_has_locale_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include locale_t x; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_locale_has_locale_t=yes else gl_cv_header_locale_has_locale_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_has_locale_t" >&5 $as_echo "$gl_cv_header_locale_has_locale_t" >&6; } if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5 $as_echo_n "checking whether struct lconv is properly defined... " >&6; } if ${gl_cv_sys_struct_lconv_ok+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_sys_struct_lconv_ok=yes else gl_cv_sys_struct_lconv_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_lconv_ok" >&5 $as_echo "$gl_cv_sys_struct_lconv_ok" >&6; } if test $gl_cv_sys_struct_lconv_ok = no; then REPLACE_STRUCT_LCONV=1 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_locale_h='<'locale.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_locale_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'locale.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_locale_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5 $as_echo "$gl_cv_next_locale_h" >&6; } fi NEXT_LOCALE_H=$gl_cv_next_locale_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'locale.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_locale_h fi NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive for gl_func in setlocale duplocale; do as_gl_Symbol=`$as_echo "gl_cv_have_raw_decl_$gl_func" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gl_func is declared without a macro" >&5 $as_echo_n "checking whether $gl_func is declared without a macro... " >&6; } if eval \${$as_gl_Symbol+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Some systems provide declarations in a non-standard header. */ #if HAVE_XLOCALE_H # include #endif int main () { #undef $gl_func (void) $gl_func; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Symbol=yes" else eval "$as_gl_Symbol=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_gl_Symbol { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Symbol"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_RAW_DECL_$gl_func" | $as_tr_cpp` 1 _ACEOF eval ac_cv_have_decl_$gl_func=yes fi done if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 $as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl2_LIBOBJS="$gl2_LIBOBJS msvc-inval.$ac_objext" fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then gl2_LIBOBJS="$gl2_LIBOBJS msvc-nothrow.$ac_objext" fi ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl _ACEOF STDDEF_H= if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 $as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; } if ${gl_cv_decl_null_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int test[2 * (sizeof NULL == sizeof (void *)) -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_null_works=yes else gl_cv_decl_null_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 $as_echo "$gl_cv_decl_null_works" >&6; } if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi if test -n "$STDDEF_H"; then GL_GENERATE_STDDEF_H_TRUE= GL_GENERATE_STDDEF_H_FALSE='#' else GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE= fi if test -n "$STDDEF_H"; then if test $gl_cv_have_include_next = yes; then gl_cv_next_stddef_h='<'stddef.h'>' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 $as_echo_n "checking absolute name of ... " >&6; } if ${gl_cv_next_stddef_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stddef.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_next_stddef_h='"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"`'"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 $as_echo "$gl_cv_next_stddef_h" >&6; } fi NEXT_STDDEF_H=$gl_cv_next_stddef_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stddef.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stddef_h fi NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive fi if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5 $as_echo_n "checking for working strerror function... " >&6; } if ${gl_cv_func_working_strerror+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_working_strerror="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (!*strerror (-2)) return 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_working_strerror=yes else gl_cv_func_working_strerror=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5 $as_echo "$gl_cv_func_working_strerror" >&6; } case "$gl_cv_func_working_strerror" in *yes) ;; *) REPLACE_STRERROR=1 ;; esac else REPLACE_STRERROR=1 fi if test $REPLACE_STRERROR = 1; then gl2_LIBOBJS="$gl2_LIBOBJS strerror.$ac_objext" fi cat >>confdefs.h <<_ACEOF #define GNULIB_STRERROR 1 _ACEOF GNULIB_STRERROR=1 $as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then gl2_LIBOBJS="$gl2_LIBOBJS strerror-override.$ac_objext" if test $ac_cv_header_sys_socket_h != yes; then for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF fi done fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi fi # Check whether --with-packager was given. if test "${with_packager+set}" = set; then : withval=$with_packager; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER "$withval" _ACEOF ;; esac fi # Check whether --with-packager-version was given. if test "${with_packager_version+set}" = set; then : withval=$with_packager_version; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER_VERSION "$withval" _ACEOF ;; esac fi # Check whether --with-packager-bug-reports was given. if test "${with_packager_bug_reports+set}" = set; then : withval=$with_packager_bug_reports; case $withval in yes|no) ;; *) cat >>confdefs.h <<_ACEOF #define PACKAGE_PACKAGER_BUG_REPORTS "$withval" _ACEOF ;; esac fi if test "X$with_packager" = "X" && \ test "X$with_packager_version$with_packager_bug_reports" != "X" then as_fn_error $? "The --with-packager-{bug-reports,version} options require --with-packager" "$LINENO" 5 fi # End of code from modules gltests_libdeps= gltests_ltlibdeps= gl_source_base='tests' gl2tests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gl2tests_WITNESS if true; then GL_COND_LIBTOOL_TRUE= GL_COND_LIBTOOL_FALSE='#' else GL_COND_LIBTOOL_TRUE='#' GL_COND_LIBTOOL_FALSE= fi gl_cond_libtool=true gl_m4_base='db/gl/m4' gl_source_base='db/gl' if test $ac_cv_func_readlink = no; then HAVE_READLINK=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5 $as_echo_n "checking whether readlink signature is correct... " >&6; } if ${gl_cv_decl_readlink_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Cause compilation failure if original declaration has wrong type. */ ssize_t readlink (const char *, char *, size_t); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_decl_readlink_works=yes else gl_cv_decl_readlink_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5 $as_echo "$gl_cv_decl_readlink_works" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5 $as_echo_n "checking whether readlink handles trailing slash correctly... " >&6; } if ${gl_cv_func_readlink_works+:} false; then : $as_echo_n "(cached) " >&6 else # We have readlink, so assume ln -s works. ln -s conftest.no-such conftest.link ln -s conftest.link conftest.lnk2 if test "$cross_compiling" = yes; then : case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_readlink_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_readlink_works="guessing no" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char buf[20]; return readlink ("conftest.lnk2/", buf, sizeof buf) != -1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gl_cv_func_readlink_works=yes else gl_cv_func_readlink_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.link conftest.lnk2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_works" >&5 $as_echo "$gl_cv_func_readlink_works" >&6; } case "$gl_cv_func_readlink_works" in *yes) if test "$gl_cv_decl_readlink_works" != yes; then REPLACE_READLINK=1 fi ;; *) $as_echo "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h REPLACE_READLINK=1 ;; esac fi if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then gl3_LIBOBJS="$gl3_LIBOBJS readlink.$ac_objext" : fi GNULIB_READLINK=1 $as_echo "#define GNULIB_TEST_READLINK 1" >>confdefs.h # End of code from modules gltests_libdeps= gltests_ltlibdeps= gl_source_base='tests' gl3tests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gl3tests_WITNESS if test "$ac_cv_libgcrypt" != yes; then as_fn_error $? "Cannot find libgcrypt" "$LINENO" 5 fi # Checks for library functions. for ac_func in signal select ngettext gethostbyname getpwnam getuid res_query do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # BSD systems deliver res_query in libc. # Most of them do not even offer libresolv. if test "$ac_cv_func_res_query" != yes; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libresolv-prefix was given. if test "${with_libresolv_prefix+set}" = set; then : withval=$with_libresolv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBRESOLV= LTLIBRESOLV= INCRESOLV= LIBRESOLV_PREFIX= HAVE_LIBRESOLV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='resolv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBRESOLV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBRESOLV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$found_so" else LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$found_a" else LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'resolv'; then LIBRESOLV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'resolv'; then LIBRESOLV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCRESOLV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCRESOLV="${INCRESOLV}${INCRESOLV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBRESOLV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBRESOLV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$dep" LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }$dep" ;; esac done fi else LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }-l$name" LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBRESOLV="${LIBRESOLV}${LIBRESOLV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBRESOLV="${LTLIBRESOLV}${LTLIBRESOLV:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" for element in $INCRESOLV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libresolv" >&5 $as_echo_n "checking for libresolv... " >&6; } if ${ac_cv_libresolv+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" case " $LIBRESOLV" in *" -l"*) LIBS="$LIBS $LIBRESOLV" ;; *) LIBS="$LIBRESOLV $LIBS" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { res_query (0, 0, 0, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_libresolv=yes else ac_cv_libresolv='no' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libresolv" >&5 $as_echo "$ac_cv_libresolv" >&6; } if test "$ac_cv_libresolv" = yes; then HAVE_LIBRESOLV=yes $as_echo "#define HAVE_LIBRESOLV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libresolv" >&5 $as_echo_n "checking how to link with libresolv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBRESOLV" >&5 $as_echo "$LIBRESOLV" >&6; } else HAVE_LIBRESOLV=no CPPFLAGS="$ac_save_CPPFLAGS" LIBRESOLV= LTLIBRESOLV= LIBRESOLV_PREFIX= fi # Check again, with newly acquired knowledge. if test "$ac_cv_libresolv" = yes; then $as_echo "#define HAVE_RES_QUERY 1" >>confdefs.h fi fi # Shishid needs a logging mechanism, and right now there is no # alternative to syslog. A 'fprintf(stderr,...)' mechanism may be # useful. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing syslog" >&5 $as_echo_n "checking for library containing syslog... " >&6; } if ${ac_cv_search_syslog+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char syslog (); int main () { return syslog (); ; return 0; } _ACEOF for ac_lib in '' syslog; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_syslog=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_syslog+:} false; then : break fi done if ${ac_cv_search_syslog+:} false; then : else ac_cv_search_syslog=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_syslog" >&5 $as_echo "$ac_cv_search_syslog" >&6; } ac_res=$ac_cv_search_syslog if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "$ac_cv_search_syslog" != "no"; then ENABLE_SHISHID_TRUE= ENABLE_SHISHID_FALSE='#' else ENABLE_SHISHID_TRUE='#' ENABLE_SHISHID_FALSE= fi # Check for PAM # Check whether --enable-pam was given. if test "${enable_pam+set}" = set; then : enableval=$enable_pam; fi if test "$enable_pam" != "no"; then for ac_header in security/pam_appl.h do : ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" if test "x$ac_cv_header_security_pam_appl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SECURITY_PAM_APPL_H 1 _ACEOF fi done for ac_header in security/pam_modules.h do : ac_fn_c_check_header_compile "$LINENO" "security/pam_modules.h" "ac_cv_header_security_pam_modules_h" " #if HAVE_SECURITY_PAM_APPL_H #include #endif " if test "x$ac_cv_header_security_pam_modules_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SECURITY_PAM_MODULES_H 1 _ACEOF fi done for ac_header in security/_pam_macros.h do : ac_fn_c_check_header_mongrel "$LINENO" "security/_pam_macros.h" "ac_cv_header_security__pam_macros_h" "$ac_includes_default" if test "x$ac_cv_header_security__pam_macros_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SECURITY__PAM_MACROS_H 1 _ACEOF fi done enable_pam=$ac_cv_header_security_pam_modules_h fi if test "$enable_pam" != "no"; then PAM_SHISHI=pam_shishi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The Shishi PAM module will not be built." >&5 $as_echo "$as_me: WARNING: The Shishi PAM module will not be built." >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PAM should be used" >&5 $as_echo_n "checking if PAM should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_pam" >&5 $as_echo "$enable_pam" >&6; } PAMDIR="\$(exec_prefix)/lib/security" # Check whether --with-pam-dir was given. if test "${with_pam_dir+set}" = set; then : withval=$with_pam_dir; case "${withval}" in /*) PAMDIR="${withval}";; ./*|../*) as_fn_error $? "Bad value for --with-pam-dir" "$LINENO" 5;; *) PAMDIR="\$(exec_prefix)/lib/${withval}";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: PAM installation path $PAMDIR" >&5 $as_echo "$as_me: PAM installation path $PAMDIR" >&6;} # Check for IPv6 # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi if test "$enable_ipv6" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv4 sockets" >&5 $as_echo_n "checking for IPv4 sockets... " >&6; } if ${gl_cv_socket_ipv4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif int main () { int x = AF_INET; struct in_addr y; struct sockaddr_in z; if (&x && &y && &z) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socket_ipv4=yes else gl_cv_socket_ipv4=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv4" >&5 $as_echo "$gl_cv_socket_ipv4" >&6; } if test $gl_cv_socket_ipv4 = yes; then $as_echo "#define HAVE_IPV4 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 sockets" >&5 $as_echo_n "checking for IPv6 sockets... " >&6; } if ${gl_cv_socket_ipv6+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif int main () { int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z; if (&x && &y && &z) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_socket_ipv6=yes else gl_cv_socket_ipv6=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv6" >&5 $as_echo "$gl_cv_socket_ipv6" >&6; } if test $gl_cv_socket_ipv6 = yes; then $as_echo "#define HAVE_IPV6 1" >>confdefs.h fi enable_ipv6=$gl_cv_socket_ipv6 fi if test "$enable_ipv6" != "no"; then $as_echo "#define WITH_IPV6 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IPv6 support is disabled." >&5 $as_echo "$as_me: WARNING: IPv6 support is disabled." >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if IPv6 should be used" >&5 $as_echo_n "checking if IPv6 should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ipv6" >&5 $as_echo "$enable_ipv6" >&6; } # Check for idn # Check whether --with-stringprep was given. if test "${with_stringprep+set}" = set; then : withval=$with_stringprep; stringprep=$withval else stringprep=yes fi if test "$stringprep" != "no"; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libidn-prefix was given. if test "${with_libidn_prefix+set}" = set; then : withval=$with_libidn_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBIDN= LTLIBIDN= INCIDN= LIBIDN_PREFIX= HAVE_LIBIDN= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='idn ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBIDN="${LIBIDN}${LIBIDN:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBIDN; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBIDN="${LIBIDN}${LIBIDN:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBIDN="${LIBIDN}${LIBIDN:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBIDN="${LIBIDN}${LIBIDN:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBIDN; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBIDN="${LIBIDN}${LIBIDN:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBIDN="${LIBIDN}${LIBIDN:+ }$found_so" else LIBIDN="${LIBIDN}${LIBIDN:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBIDN="${LIBIDN}${LIBIDN:+ }$found_a" else LIBIDN="${LIBIDN}${LIBIDN:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'idn'; then LIBIDN_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'idn'; then LIBIDN_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCIDN; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCIDN="${INCIDN}${INCIDN:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBIDN; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBIDN="${LIBIDN}${LIBIDN:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBIDN; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBIDN="${LIBIDN}${LIBIDN:+ }$dep" LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }$dep" ;; esac done fi else LIBIDN="${LIBIDN}${LIBIDN:+ }-l$name" LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBIDN="${LIBIDN}${LIBIDN:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBIDN="${LIBIDN}${LIBIDN:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBIDN="${LTLIBIDN}${LTLIBIDN:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" for element in $INCIDN; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libidn" >&5 $as_echo_n "checking for libidn... " >&6; } if ${ac_cv_libidn+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" case " $LIBIDN" in *" -l"*) LIBS="$LIBS $LIBIDN" ;; *) LIBS="$LIBIDN $LIBS" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { stringprep_check_version (0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_libidn=yes else ac_cv_libidn='no' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libidn" >&5 $as_echo "$ac_cv_libidn" >&6; } if test "$ac_cv_libidn" = yes; then HAVE_LIBIDN=yes $as_echo "#define HAVE_LIBIDN 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libidn" >&5 $as_echo_n "checking how to link with libidn... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBIDN" >&5 $as_echo "$LIBIDN" >&6; } else HAVE_LIBIDN=no CPPFLAGS="$ac_save_CPPFLAGS" LIBIDN= LTLIBIDN= LIBIDN_PREFIX= fi fi if test "$ac_cv_libidn" != yes; then stringprep=no { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libidn not found. String process disabled." >&5 $as_echo "$as_me: WARNING: Libidn not found. String process disabled." >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if String processing support via Libidn should be built" >&5 $as_echo_n "checking if String processing support via Libidn should be built... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $stringprep" >&5 $as_echo "$stringprep" >&6; } # Check for libtasn1 use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libtasn1-prefix was given. if test "${with_libtasn1_prefix+set}" = set; then : withval=$with_libtasn1_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBTASN1= LTLIBTASN1= INCTASN1= LIBTASN1_PREFIX= HAVE_LIBTASN1= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='tasn1 ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBTASN1; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBTASN1; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$found_so" else LIBTASN1="${LIBTASN1}${LIBTASN1:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$found_a" else LIBTASN1="${LIBTASN1}${LIBTASN1:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'tasn1'; then LIBTASN1_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'tasn1'; then LIBTASN1_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCTASN1; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCTASN1="${INCTASN1}${INCTASN1:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBTASN1; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBTASN1="${LIBTASN1}${LIBTASN1:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBTASN1; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$dep" LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }$dep" ;; esac done fi else LIBTASN1="${LIBTASN1}${LIBTASN1:+ }-l$name" LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBTASN1="${LIBTASN1}${LIBTASN1:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBTASN1="${LTLIBTASN1}${LTLIBTASN1:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" for element in $INCTASN1; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtasn1" >&5 $as_echo_n "checking for libtasn1... " >&6; } if ${ac_cv_libtasn1+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" case " $LIBTASN1" in *" -l"*) LIBS="$LIBS $LIBTASN1" ;; *) LIBS="$LIBTASN1 $LIBS" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { asn1_strerror (0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_libtasn1=yes else ac_cv_libtasn1='no' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libtasn1" >&5 $as_echo "$ac_cv_libtasn1" >&6; } if test "$ac_cv_libtasn1" = yes; then HAVE_LIBTASN1=yes $as_echo "#define HAVE_LIBTASN1 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libtasn1" >&5 $as_echo_n "checking how to link with libtasn1... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBTASN1" >&5 $as_echo "$LIBTASN1" >&6; } else HAVE_LIBTASN1=no CPPFLAGS="$ac_save_CPPFLAGS" LIBTASN1= LTLIBTASN1= LIBTASN1_PREFIX= fi if test "$ac_cv_libtasn1" != "yes"; then as_fn_error $? "Libtasn1 not found." "$LINENO" 5 fi # Check for gnutls. # Check whether --enable-starttls was given. if test "${enable_starttls+set}" = set; then : enableval=$enable_starttls; starttls=$enableval else starttls=yes fi if test "$starttls" != "no"; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libgnutls-prefix was given. if test "${with_libgnutls_prefix+set}" = set; then : withval=$with_libgnutls_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBGNUTLS= LTLIBGNUTLS= INCGNUTLS= LIBGNUTLS_PREFIX= HAVE_LIBGNUTLS= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='gnutls ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBGNUTLS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBGNUTLS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so" else LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_a" else LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'gnutls'; then LIBGNUTLS_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'gnutls'; then LIBGNUTLS_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCGNUTLS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCGNUTLS="${INCGNUTLS}${INCGNUTLS:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBGNUTLS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBGNUTLS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$dep" LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }$dep" ;; esac done fi else LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-l$name" LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" for element in $INCGNUTLS; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgnutls" >&5 $as_echo_n "checking for libgnutls... " >&6; } if ${ac_cv_libgnutls+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" case " $LIBGNUTLS" in *" -l"*) LIBS="$LIBS $LIBGNUTLS" ;; *) LIBS="$LIBGNUTLS $LIBS" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gnutls_check_version (0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_libgnutls=yes else ac_cv_libgnutls='no' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgnutls" >&5 $as_echo "$ac_cv_libgnutls" >&6; } if test "$ac_cv_libgnutls" = yes; then HAVE_LIBGNUTLS=yes $as_echo "#define HAVE_LIBGNUTLS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgnutls" >&5 $as_echo_n "checking how to link with libgnutls... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGNUTLS" >&5 $as_echo "$LIBGNUTLS" >&6; } else HAVE_LIBGNUTLS=no CPPFLAGS="$ac_save_CPPFLAGS" LIBGNUTLS= LTLIBGNUTLS= LIBGNUTLS_PREFIX= fi if test "$ac_cv_libgnutls" != yes; then starttls=no { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GnuTLS not found. STARTTLS disabled." >&5 $as_echo "$as_me: WARNING: GnuTLS not found. STARTTLS disabled." >&2;} else starttls=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if non-standard STARTTLS support should be enabled" >&5 $as_echo_n "checking if non-standard STARTTLS support should be enabled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $starttls" >&5 $as_echo "$starttls" >&6; } if test "$starttls" != "no"; then $as_echo "#define USE_STARTTLS 1" >>confdefs.h fi if test "$starttls" != "no"; then STARTTLS_TRUE= STARTTLS_FALSE='#' else STARTTLS_TRUE='#' STARTTLS_FALSE= fi # Check for gtk-doc. if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Extract the first word of "gtkdoc-check", so it can be a program name with args. set dummy gtkdoc-check; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_CHECK+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_CHECK in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK if test -n "$GTKDOC_CHECK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 $as_echo "$GTKDOC_CHECK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in gtkdoc-rebase do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_REBASE+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_REBASE in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE if test -n "$GTKDOC_REBASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 $as_echo "$GTKDOC_REBASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GTKDOC_REBASE" && break done test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. set dummy gtkdoc-mkpdf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_MKPDF in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF if test -n "$GTKDOC_MKPDF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 $as_echo "$GTKDOC_MKPDF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; else with_html_dir='${datadir}/gtk-doc/html' fi HTML_DIR="$with_html_dir" # Check whether --enable-gtk-doc was given. if test "${enable_gtk_doc+set}" = set; then : enableval=$enable_gtk_doc; else enable_gtk_doc=no fi if test x$enable_gtk_doc = xyes; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else as_fn_error $? "You need to have gtk-doc >= 1.1 installed to build $PACKAGE_NAME" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 $as_echo_n "checking whether to build gtk-doc documentation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 $as_echo "$enable_gtk_doc" >&6; } # Check whether --enable-gtk-doc-html was given. if test "${enable_gtk_doc_html+set}" = set; then : enableval=$enable_gtk_doc_html; else enable_gtk_doc_html=yes fi # Check whether --enable-gtk-doc-pdf was given. if test "${enable_gtk_doc_pdf+set}" = set; then : enableval=$enable_gtk_doc_pdf; else enable_gtk_doc_pdf=no fi if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= ENABLE_GTK_DOC_FALSE='#' else ENABLE_GTK_DOC_TRUE='#' ENABLE_GTK_DOC_FALSE= fi if test x$enable_gtk_doc_html = xyes; then GTK_DOC_BUILD_HTML_TRUE= GTK_DOC_BUILD_HTML_FALSE='#' else GTK_DOC_BUILD_HTML_TRUE='#' GTK_DOC_BUILD_HTML_FALSE= fi if test x$enable_gtk_doc_pdf = xyes; then GTK_DOC_BUILD_PDF_TRUE= GTK_DOC_BUILD_PDF_FALSE='#' else GTK_DOC_BUILD_PDF_TRUE='#' GTK_DOC_BUILD_PDF_FALSE= fi if test -n "$LIBTOOL"; then GTK_DOC_USE_LIBTOOL_TRUE= GTK_DOC_USE_LIBTOOL_FALSE='#' else GTK_DOC_USE_LIBTOOL_TRUE='#' GTK_DOC_USE_LIBTOOL_FALSE= fi if test -n "$GTKDOC_REBASE"; then GTK_DOC_USE_REBASE_TRUE= GTK_DOC_USE_REBASE_FALSE='#' else GTK_DOC_USE_REBASE_TRUE='#' GTK_DOC_USE_REBASE_FALSE= fi # Let people enable/disable various encryption/checksum types. # Check whether --enable-des was given. if test "${enable_des+set}" = set; then : enableval=$enable_des; enable_des=$enableval else enable_des=yes fi if test "$enable_des" != "no"; then DES_TRUE= DES_FALSE='#' else DES_TRUE='#' DES_FALSE= fi if test "$enable_des" != "no"; then $as_echo "#define WITH_DES 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if DES related encryption/checksum types should be used" >&5 $as_echo_n "checking if DES related encryption/checksum types should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_des" >&5 $as_echo "$enable_des" >&6; } # Check whether --enable-3des was given. if test "${enable_3des+set}" = set; then : enableval=$enable_3des; enable_3des=$enableval else enable_3des=yes fi if test "$enable_3des" != "no"; then DES3_TRUE= DES3_FALSE='#' else DES3_TRUE='#' DES3_FALSE= fi if test "$enable_3des" != "no"; then $as_echo "#define WITH_3DES 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 3DES encryption/checksum type should be used" >&5 $as_echo_n "checking if 3DES encryption/checksum type should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_3des" >&5 $as_echo "$enable_3des" >&6; } # Check whether --enable-aes was given. if test "${enable_aes+set}" = set; then : enableval=$enable_aes; enable_aes=$enableval else enable_aes=yes fi if test "$enable_aes" != "no"; then AES_TRUE= AES_FALSE='#' else AES_TRUE='#' AES_FALSE= fi if test "$enable_aes" != "no"; then $as_echo "#define WITH_AES 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if AES encryption/checksum types should be used" >&5 $as_echo_n "checking if AES encryption/checksum types should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_aes" >&5 $as_echo "$enable_aes" >&6; } # Check whether --enable-md was given. if test "${enable_md+set}" = set; then : enableval=$enable_md; enable_md=$enableval else enable_md=yes fi if test "$enable_md" != "no"; then MD_TRUE= MD_FALSE='#' else MD_TRUE='#' MD_FALSE= fi if test "$enable_md" != "no"; then $as_echo "#define WITH_MD 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if unkeyed MD checksum types should be used" >&5 $as_echo_n "checking if unkeyed MD checksum types should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_md" >&5 $as_echo "$enable_md" >&6; } # Check whether --enable-null was given. if test "${enable_null+set}" = set; then : enableval=$enable_null; enable_null=$enableval else enable_null=yes fi if test "$enable_null" != "no"; then NULL_TRUE= NULL_FALSE='#' else NULL_TRUE='#' NULL_FALSE= fi if test "$enable_null" != "no"; then $as_echo "#define WITH_NULL 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if dummy NULL encryption/checksum type should be used" >&5 $as_echo_n "checking if dummy NULL encryption/checksum type should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_null" >&5 $as_echo "$enable_null" >&6; } # Check whether --enable-arcfour was given. if test "${enable_arcfour+set}" = set; then : enableval=$enable_arcfour; enable_arcfour=$enableval else enable_arcfour=yes fi if test "$enable_arcfour" != "no"; then ARCFOUR_TRUE= ARCFOUR_FALSE='#' else ARCFOUR_TRUE='#' ARCFOUR_FALSE= fi if test "$enable_arcfour" != "no"; then $as_echo "#define WITH_ARCFOUR 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ARCFOUR encryption/checksum type should be used" >&5 $as_echo_n "checking if ARCFOUR encryption/checksum type should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_arcfour" >&5 $as_echo "$enable_arcfour" >&6; } CONFDIR="\$(sysconfdir)/\$(PACKAGE)" # Check whether --with-conf-dir was given. if test "${with_conf_dir+set}" = set; then : withval=$with_conf_dir; case "${withval}" in /*) CONFDIR="${withval}";; ./*|../*) as_fn_error $? "Bad value for --with-conf-dir" "$LINENO" 5;; *) CONFDIR="\$(sysconfdir)/${withval}";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuration files will be stored in $CONFDIR" >&5 $as_echo "$as_me: configuration files will be stored in $CONFDIR" >&6;} SKELDIR="\$(sysconfdir)/\$(PACKAGE)" # Check whether --with-skel-dir was given. if test "${with_skel_dir+set}" = set; then : withval=$with_skel_dir; case "${withval}" in /*) SKELDIR="${withval}";; ./*|../*) as_fn_error $? "Bad value for --with-skel-dir" "$LINENO" 5;; *) SKELDIR="\$(sysconfdir)/${withval}";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: user template configuration file in $SKELDIR" >&5 $as_echo "$as_me: user template configuration file in $SKELDIR" >&6;} KEYDIR="\$(sysconfdir)/\$(PACKAGE)" # Check whether --with-key-dir was given. if test "${with_key_dir+set}" = set; then : withval=$with_key_dir; case "${withval}" in /*) KEYDIR="${withval}";; ./*|../*) as_fn_error $? "Bad value for --with-key-dir" "$LINENO" 5;; *) KEYDIR="\$(sysconfdir)/${withval}";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: host keys will be stored in $KEYDIR" >&5 $as_echo "$as_me: host keys will be stored in $KEYDIR" >&6;} DBDIR="\$(localstatedir)/\$(PACKAGE)" # Check whether --with-db-dir was given. if test "${with_db_dir+set}" = set; then : withval=$with_db_dir; case "${withval}" in /*) DBDIR="${withval}";; ./*|../*) as_fn_error $? "Bad value for --with-db-dir" "$LINENO" 5;; *) DBDIR="\$(localstatedir)/${withval}";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: user database root path $DBDIR" >&5 $as_echo "$as_me: user database root path $DBDIR" >&6;} $as_echo "#define xalloc_die shishi_xalloc_die" >>confdefs.h # Update version number in lib/libtasn1.h. if ! sed 's/_VERSION ".*"/_VERSION "'$PACKAGE_VERSION'"/' $srcdir/lib/shishi.h > fixhdr.tmp; then as_fn_error $? "*** Failed to update version number in $srcdir/lib/shishi.h..." "$LINENO" 5 fi if cmp -s $srcdir/lib/shishi.h fixhdr.tmp 2>/dev/null; then rm -f fixhdr.tmp elif ! mv fixhdr.tmp $srcdir/lib/shishi.h; then as_fn_error $? "*** Failed to move fixhdr.tmp to $srcdir/lib/shishi.h..." "$LINENO" 5 fi # Check whether --enable-gcc-warnings was given. if test "${enable_gcc_warnings+set}" = set; then : enableval=$enable_gcc_warnings; case $enableval in yes|no) ;; *) as_fn_error $? "bad value $enableval for gcc-warnings option" "$LINENO" 5 ;; esac gl_gcc_warnings=$enableval else gl_gcc_warnings=no fi if test "$gl_gcc_warnings" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5 $as_echo_n "checking whether C compiler handles -Werror... " >&6; } if ${gl_cv_warn_c__Werror+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__Werror=yes else gl_cv_warn_c__Werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror" >&5 $as_echo "$gl_cv_warn_c__Werror" >&6; } if test "x$gl_cv_warn_c__Werror" = xyes; then : as_fn_append WERROR_CFLAGS " -Werror" fi nw="$nw -Wsystem-headers" # Ignore errors in system headers nw="$nw -Wc++-compat" # We don't care much about C++ compilers nw="$nw -Wsign-conversion" # Too many warnings for now nw="$nw -Wconversion" # Too many warnings for now nw="$nw -Wpadded" # Our structs are not padded nw="$nw -Wunreachable-code" # Too many false positives nw="$nw -Wlogical-op" # Too many false positives nw="$nw -Wtraditional" # Warns on #elif which we use often nw="$nw -Wtraditional-conversion" # Too many warnings for now nw="$nw -Wcast-qual" # Too many warnings for now nw="$nw -Wmissing-format-attribute" # Too many warnings for now nw="$nw -Wunsafe-loop-optimizations" # Too many warnings for now nw="$nw -Wundef" # Problems in gnulib files nw="$nw -Wstrict-overflow" # Don't know how to avoid nw="$nw -Waggregate-return" # For src/resume.c:resume_db_fetch... nw="$nw -Wsuggest-attribute=pure" # Is it worth using attributes? nw="$nw -Wsuggest-attribute=const" # Is it worth using attributes? if test -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wno-missing-field-initializers is supported" >&5 $as_echo_n "checking whether -Wno-missing-field-initializers is supported... " >&6; } if ${gl_cv_cc_nomfi_supported+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_nomfi_supported=yes else gl_cv_cc_nomfi_supported=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_nomfi_supported" >&5 $as_echo "$gl_cv_cc_nomfi_supported" >&6; } if test "$gl_cv_cc_nomfi_supported" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wno-missing-field-initializers is needed" >&5 $as_echo_n "checking whether -Wno-missing-field-initializers is needed... " >&6; } if ${gl_cv_cc_nomfi_needed+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -W -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void f (void) { typedef struct { int a; int b; } s_t; s_t s1 = { 0, }; } int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_nomfi_needed=no else gl_cv_cc_nomfi_needed=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_nomfi_needed" >&5 $as_echo "$gl_cv_cc_nomfi_needed" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wuninitialized is supported" >&5 $as_echo_n "checking whether -Wuninitialized is supported... " >&6; } if ${gl_cv_cc_uninitialized_supported+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror -Wuninitialized" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_cc_uninitialized_supported=yes else gl_cv_cc_uninitialized_supported=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_uninitialized_supported" >&5 $as_echo "$gl_cv_cc_uninitialized_supported" >&6; } fi # List all gcc warning categories. gl_manywarn_set= for gl_manywarn_item in \ -W \ -Wabi \ -Waddress \ -Wall \ -Warray-bounds \ -Wattributes \ -Wbad-function-cast \ -Wbuiltin-macro-redefined \ -Wcast-align \ -Wchar-subscripts \ -Wclobbered \ -Wcomment \ -Wcomments \ -Wcoverage-mismatch \ -Wcpp \ -Wdeprecated \ -Wdeprecated-declarations \ -Wdisabled-optimization \ -Wdiv-by-zero \ -Wdouble-promotion \ -Wempty-body \ -Wendif-labels \ -Wenum-compare \ -Wextra \ -Wformat-contains-nul \ -Wformat-extra-args \ -Wformat-nonliteral \ -Wformat-security \ -Wformat-y2k \ -Wformat-zero-length \ -Wformat=2 \ -Wfree-nonheap-object \ -Wignored-qualifiers \ -Wimplicit \ -Wimplicit-function-declaration \ -Wimplicit-int \ -Winit-self \ -Winline \ -Wint-to-pointer-cast \ -Winvalid-memory-model \ -Winvalid-pch \ -Wjump-misses-init \ -Wlogical-op \ -Wmain \ -Wmaybe-uninitialized \ -Wmissing-braces \ -Wmissing-declarations \ -Wmissing-field-initializers \ -Wmissing-format-attribute \ -Wmissing-include-dirs \ -Wmissing-noreturn \ -Wmissing-parameter-type \ -Wmissing-prototypes \ -Wmudflap \ -Wmultichar \ -Wnarrowing \ -Wnested-externs \ -Wnonnull \ -Wnormalized=nfc \ -Wold-style-declaration \ -Wold-style-definition \ -Woverflow \ -Woverlength-strings \ -Woverride-init \ -Wpacked \ -Wpacked-bitfield-compat \ -Wparentheses \ -Wpointer-arith \ -Wpointer-sign \ -Wpointer-to-int-cast \ -Wpragmas \ -Wreturn-type \ -Wsequence-point \ -Wshadow \ -Wsizeof-pointer-memaccess \ -Wstack-protector \ -Wstrict-aliasing \ -Wstrict-overflow \ -Wstrict-prototypes \ -Wsuggest-attribute=const \ -Wsuggest-attribute=format \ -Wsuggest-attribute=noreturn \ -Wsuggest-attribute=pure \ -Wswitch \ -Wswitch-default \ -Wsync-nand \ -Wsystem-headers \ -Wtrampolines \ -Wtrigraphs \ -Wtype-limits \ -Wuninitialized \ -Wunknown-pragmas \ -Wunreachable-code \ -Wunsafe-loop-optimizations \ -Wunused \ -Wunused-but-set-parameter \ -Wunused-but-set-variable \ -Wunused-function \ -Wunused-label \ -Wunused-local-typedefs \ -Wunused-macros \ -Wunused-parameter \ -Wunused-result \ -Wunused-value \ -Wunused-variable \ -Wvarargs \ -Wvariadic-macros \ -Wvector-operation-performance \ -Wvla \ -Wvolatile-register-var \ -Wwrite-strings \ \ ; do gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" done # Disable specific options as needed. if test "$gl_cv_cc_nomfi_needed" = yes; then gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" fi if test "$gl_cv_cc_uninitialized_supported" = no; then gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" fi ws=$gl_manywarn_set gl_warn_set= set x $ws; shift for gl_warn_item do case " $nw " in *" $gl_warn_item "*) ;; *) gl_warn_set="$gl_warn_set $gl_warn_item" ;; esac done ws=$gl_warn_set for w in $ws; do as_gl_Warn=`$as_echo "gl_cv_warn_c_$w" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $w" >&5 $as_echo_n "checking whether C compiler handles $w... " >&6; } if eval \${$as_gl_Warn+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " $w" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_gl_Warn=yes" else eval "$as_gl_Warn=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi eval ac_res=\$$as_gl_Warn { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then : as_fn_append WARN_CFLAGS " $w" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-format" >&5 $as_echo_n "checking whether C compiler handles -Wno-format... " >&6; } if ${gl_cv_warn_c__Wno_format+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -Wno-format" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__Wno_format=yes else gl_cv_warn_c__Wno_format=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_format" >&5 $as_echo "$gl_cv_warn_c__Wno_format" >&6; } if test "x$gl_cv_warn_c__Wno_format" = xyes; then : as_fn_append WARN_CFLAGS " -Wno-format" fi # Too many warnings for now { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-unused-parameter" >&5 $as_echo_n "checking whether C compiler handles -Wno-unused-parameter... " >&6; } if ${gl_cv_warn_c__Wno_unused_parameter+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -Wno-unused-parameter" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__Wno_unused_parameter=yes else gl_cv_warn_c__Wno_unused_parameter=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_unused_parameter" >&5 $as_echo "$gl_cv_warn_c__Wno_unused_parameter" >&6; } if test "x$gl_cv_warn_c__Wno_unused_parameter" = xyes; then : as_fn_append WARN_CFLAGS " -Wno-unused-parameter" fi # Too many warnings for now { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-stack-protector" >&5 $as_echo_n "checking whether C compiler handles -Wno-stack-protector... " >&6; } if ${gl_cv_warn_c__Wno_stack_protector+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -Wno-stack-protector" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__Wno_stack_protector=yes else gl_cv_warn_c__Wno_stack_protector=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_stack_protector" >&5 $as_echo "$gl_cv_warn_c__Wno_stack_protector" >&6; } if test "x$gl_cv_warn_c__Wno_stack_protector" = xyes; then : as_fn_append WARN_CFLAGS " -Wno-stack-protector" fi # Some functions cannot be protected { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-unused-result" >&5 $as_echo_n "checking whether C compiler handles -Wno-unused-result... " >&6; } if ${gl_cv_warn_c__Wno_unused_result+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -Wno-unused-result" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__Wno_unused_result=yes else gl_cv_warn_c__Wno_unused_result=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_unused_result" >&5 $as_echo "$gl_cv_warn_c__Wno_unused_result" >&6; } if test "x$gl_cv_warn_c__Wno_unused_result" = xyes; then : as_fn_append WARN_CFLAGS " -Wno-unused-result" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fdiagnostics-show-option" >&5 $as_echo_n "checking whether C compiler handles -fdiagnostics-show-option... " >&6; } if ${gl_cv_warn_c__fdiagnostics_show_option+:} false; then : $as_echo_n "(cached) " >&6 else gl_save_compiler_FLAGS="$CFLAGS" as_fn_append CFLAGS " -fdiagnostics-show-option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_warn_c__fdiagnostics_show_option=yes else gl_cv_warn_c__fdiagnostics_show_option=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fdiagnostics_show_option" >&5 $as_echo "$gl_cv_warn_c__fdiagnostics_show_option" >&6; } if test "x$gl_cv_warn_c__fdiagnostics_show_option" = xyes; then : as_fn_append WARN_CFLAGS " -fdiagnostics-show-option" fi fi ac_config_files="$ac_config_files Makefile db/Makefile db/gl/Makefile doc/Makefile doc/cyclo/Makefile doc/reference/Makefile doc/reference/version.xml examples/Makefile extra/Makefile extra/pam_shishi/Makefile extra/rsh-redone/Makefile gl/Makefile lib/Makefile po/Makefile.in shisa.conf shishi.conf shishi.pc shishi.skel src/Makefile src/gl/Makefile tests/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_FLOAT_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LD_OUTPUT_DEF_TRUE}" && test -z "${HAVE_LD_OUTPUT_DEF_FALSE}"; then as_fn_error $? "conditional \"HAVE_LD_OUTPUT_DEF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi CONFIG_INCLUDE=config.h if test -z "${GL_GENERATE_NETINET_IN_H_TRUE}" && test -z "${GL_GENERATE_NETINET_IN_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_NETINET_IN_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDALIGN_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDARG_H_TRUE}" && test -z "${GL_GENERATE_STDARG_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDARG_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi gl_libobjs= gl_ltlibobjs= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" done fi gl_LIBOBJS=$gl_libobjs gl_LTLIBOBJS=$gl_ltlibobjs gltests_libobjs= gltests_ltlibobjs= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" done fi gltests_LIBOBJS=$gltests_libobjs gltests_LTLIBOBJS=$gltests_ltlibobjs if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi gl2_libobjs= gl2_ltlibobjs= if test -n "$gl2_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl2_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl2_libobjs="$gl2_libobjs $i.$ac_objext" gl2_ltlibobjs="$gl2_ltlibobjs $i.lo" done fi gl2_LIBOBJS=$gl2_libobjs gl2_LTLIBOBJS=$gl2_ltlibobjs gl2tests_libobjs= gl2tests_ltlibobjs= if test -n "$gl2tests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl2tests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl2tests_libobjs="$gl2tests_libobjs $i.$ac_objext" gl2tests_ltlibobjs="$gl2tests_ltlibobjs $i.lo" done fi gl2tests_LIBOBJS=$gl2tests_libobjs gl2tests_LTLIBOBJS=$gl2tests_ltlibobjs if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi gl3_libobjs= gl3_ltlibobjs= if test -n "$gl3_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl3_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl3_libobjs="$gl3_libobjs $i.$ac_objext" gl3_ltlibobjs="$gl3_ltlibobjs $i.lo" done fi gl3_LIBOBJS=$gl3_libobjs gl3_LTLIBOBJS=$gl3_ltlibobjs gl3tests_libobjs= gl3tests_ltlibobjs= if test -n "$gl3tests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl3tests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl3tests_libobjs="$gl3tests_libobjs $i.$ac_objext" gl3tests_ltlibobjs="$gl3tests_ltlibobjs $i.lo" done fi gl3tests_LIBOBJS=$gl3tests_libobjs gl3tests_LTLIBOBJS=$gl3tests_ltlibobjs if test -z "${ENABLE_SHISHID_TRUE}" && test -z "${ENABLE_SHISHID_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SHISHID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARTTLS_TRUE}" && test -z "${STARTTLS_FALSE}"; then as_fn_error $? "conditional \"STARTTLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DES_TRUE}" && test -z "${DES_FALSE}"; then as_fn_error $? "conditional \"DES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DES3_TRUE}" && test -z "${DES3_FALSE}"; then as_fn_error $? "conditional \"DES3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AES_TRUE}" && test -z "${AES_FALSE}"; then as_fn_error $? "conditional \"AES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MD_TRUE}" && test -z "${MD_FALSE}"; then as_fn_error $? "conditional \"MD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NULL_TRUE}" && test -z "${NULL_FALSE}"; then as_fn_error $? "conditional \"NULL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARCFOUR_TRUE}" && test -z "${ARCFOUR_FALSE}"; then as_fn_error $? "conditional \"ARCFOUR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU Shishi $as_me 1.0.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Configuration commands: $config_commands Report bugs to . GNU Shishi home page: . General help using GNU software: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GNU Shishi config.status 1.0.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" GNUmakefile=$GNUmakefile _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "$GNUmakefile") CONFIG_LINKS="$CONFIG_LINKS $GNUmakefile:$GNUmakefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "db/Makefile") CONFIG_FILES="$CONFIG_FILES db/Makefile" ;; "db/gl/Makefile") CONFIG_FILES="$CONFIG_FILES db/gl/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/cyclo/Makefile") CONFIG_FILES="$CONFIG_FILES doc/cyclo/Makefile" ;; "doc/reference/Makefile") CONFIG_FILES="$CONFIG_FILES doc/reference/Makefile" ;; "doc/reference/version.xml") CONFIG_FILES="$CONFIG_FILES doc/reference/version.xml" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "extra/Makefile") CONFIG_FILES="$CONFIG_FILES extra/Makefile" ;; "extra/pam_shishi/Makefile") CONFIG_FILES="$CONFIG_FILES extra/pam_shishi/Makefile" ;; "extra/rsh-redone/Makefile") CONFIG_FILES="$CONFIG_FILES extra/rsh-redone/Makefile" ;; "gl/Makefile") CONFIG_FILES="$CONFIG_FILES gl/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "shisa.conf") CONFIG_FILES="$CONFIG_FILES shisa.conf" ;; "shishi.conf") CONFIG_FILES="$CONFIG_FILES shishi.conf" ;; "shishi.pc") CONFIG_FILES="$CONFIG_FILES shishi.pc" ;; "shishi.skel") CONFIG_FILES="$CONFIG_FILES shishi.skel" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/gl/Makefile") CONFIG_FILES="$CONFIG_FILES src/gl/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: summary of build options: version: ${VERSION} shared $LT_CURRENT:$LT_REVISION:$LT_AGE Host type: ${host} Install prefix: ${prefix} Compiler: ${CC} Warning flags: errors: ${WERROR_CFLAGS} warnings: ${WARN_CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} Valgrind: ${VALGRIND} Version script: $have_ld_version_script " >&5 $as_echo "$as_me: summary of build options: version: ${VERSION} shared $LT_CURRENT:$LT_REVISION:$LT_AGE Host type: ${host} Install prefix: ${prefix} Compiler: ${CC} Warning flags: errors: ${WERROR_CFLAGS} warnings: ${WARN_CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} Valgrind: ${VALGRIND} Version script: $have_ld_version_script " >&6;} shishi-1.0.2/NEWS0000644000000000000000000006576212126771351010414 00000000000000Shishi NEWS -- History of user-visible changes. -*- outline -*- Copyright (C) 2002-2013 Simon Josefsson See the end for copying conditions. * Version 1.0.2 (released 2013-04-03) ** libshishi: Fix server-realm handling. Reported by Mats Erik Andersson . ** libshishi: Fix salt derivation for principals with multiple components. Before, when adding a principal such as "user/admin" using shisa it would use the wrong salt. Reported by Mats Erik Andersson . ** libshishi: Fix setting principals with multiple components in encticketpart. Before, the shishid KDC would return the wrong client principal name in a KDC-REP when principals such as "user/admin" were used. That would lead to errors when getting a ticket for such principals. Reported by Mats Erik Andersson . ** libshishi: Fixes to .k5login authorization. Patch by Mats Erik Andersson . ** shishid: The syslog facility is now LOG_AUTH instead of LOG_DAEMON. Suggested by Mats Erik Andersson . ** minitasn1: Removed. You must use an external installed libtasn1. With recent libtasn1 it is no longer trivial to build libtasn1 as copied source code files. ** Update gnulib files and various other fixes. * Version 1.0.1 (released 2012-03-12) ** Builds with GnuTLS 3.x. ** minitasn1: Internal copy upgraded to GNU Libtasn1 v2.11. ** Translation updates. Added Finnish translation, thanks to Jorma Karvonen. ** Update gnulib files. Many internal cleanups and improvements. ** API and ABI modifications: No changes since last version. * Version 1.0.0 (released 2010-05-20) ** doc: Added PDF version of API reference manual. See doc/reference/shishi.pdf. ** doc: Added Cyclomatic Code Complexity charts. See doc/cyclo/. ** build: Fix building with --disable-starttls. Reported by Johan van Selst in . ** minitasn1: Internal copy upgraded to GNU Libtasn1 v2.6. ** Doc fixes. ** API and ABI modifications: No changes since last version. * Version 0.0.43 (released 2010-03-30) ** libshishi, shishid: Make IPv6 support work. ** shishid: Add --no-tls parameter to disable TLS support. ** libshishi, shishid: STARTTLS extension negotiation now follows RFC 5021. ** doc: Fix spelling typos noticed by lintian. ** Update gnulib files. Including moving the 'stat' module from db/ to gl/ so that libshishi builds properly. ** API and ABI modifications: No changes since last version. * Version 0.0.42 (released 2010-03-15) ** libshishi: Add APIs to save keys on keytab format. The functions are shishi_keys_to_keytab_file and shishi_keys_to_keytab_mem. ** libshishi: Add APIs to retrieve/set the timestamp for a key. Typically only used by keytab format. The functions are shishi_key_timestamp and shishi_key_timestamp_set. ** libshishi: Add API to read several keys from a file. The function is shishi_keys_from_file. ** keytab2shishi: Add --reverse (-R) parameter to write Keytab files. This allows you to use create Keytab files from your Shishi hostkeys. ** libshishi: Fix bug where '3des' is parsed as 'des'. ** minitasn1: Internal copy upgraded to GNU Libtasn1 v2.5. ** API and ABI modifications: shishi_key_timestamp: ADD. shishi_key_timestamp_set: ADD. shishi_keys_from_file: ADD. shishi_keys_to_keytab_file: ADD. shishi_keys_to_keytab_mem: ADD. * Version 0.0.41 (released 2010-01-19) ** Add configuration keyword 'quick-random' to speed up libgcrypt. ** Fix libgcrypt detection (problem with libgpg-error dependency). ** Update many gnulib files. ** minitasn1: Internal copy upgraded to GNU Libtasn1 v2.4. ** API and ABI modifications: No changes since last version. * Version 0.0.40 (released 2009-04-03) ** shisa: Fix bug that made command line parameter parsing unreliable. ** Shishi can now be cross-compiled to Windows using MinGW. See for build scripts and pre-built binary packages. ** API and ABI modifications: No changes since last version. * Version 0.0.39 (released 2009-03-30) ** libshishi: The linker version script lists APIs explicitly. This will reduce the chance that a symbol is exported accidentally. ** libshisa: Use a LD version script on platforms where it is supported. Currently only GNU LD and the Solaris linker supports it. This helps Debian package tools to produce better dependencies. Before we used Libtool -export-symbols-regex that created an anonymous version tag. We still fall back on -export-symbols-regex if the system does not support LD version scripts, although on most platforms this will just affect symbol visibility. ** API and ABI modifications: No changes since last version. * Version 0.0.38 (released 2009-02-26) ** libshisa: Use libtool -export-symbols-regex to fix exported namespace. ** doc: Change license on the manual to GFDLv1.3+. ** minitasn1: Internal copy updated to libtasn1 v1.8. ** More compiler warnings enabled, and many warnings fixed. ** API and ABI modifications: No changes since last version. * Version 0.0.37 (released 2008-06-24) ** libshishi: New functions to set a password prompt callback. You register the callback using shishi_prompt_password_callback_set and can retrieve the current callback using shishi_prompt_password_callback_get. The callback function should follow the shishi_prompt_password_func function prototype. The shishi_prompt_password function has been updated to call the callbacks, if registered. Inspired by discussion with Graham Shaw . ** libshishi: New ticketset hint flag SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE. When this flag is passed to ticketset functions, it will never query the user for a password. Inspired by discussion with Graham Shaw . ** libshishi: When doing pre-authentication with a pre-seeded password, ** don't ask for a new password. Reported by Graham Shaw in . ** libshishi: add new function to debug print ASN.1 structures. shishi_asn1_print: ADD. ** libshishi: Cleanup type declaration of Shishi_asn1. Now it is mapped to ASN1_TYPE if you included libtasn1.h, otherwise to 'void*'. ** Update examples for new API. Now the examples are also built by default, so we notice any build failures for them. ** Translations files not stored directly in git to avoid merge conflicts. This allows us to avoid use of --no-location which makes the translation teams happier. ** Dist gdoc-error to avoid build failures when building modified sources. Reported by Graham Shaw in . ** Internal copy of libtasn1 updated to version 1.4. ** Update gnulib files. ** New APIs to deal with password queries. SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE shishi_prompt_password_callback_set shishi_prompt_password_callback_get shishi_prompt_password_func * Version 0.0.36 (released 2008-02-14) ** Fix warnings in generated man pages (silence lintian). ** Update gnulib files. * Version 0.0.35 (released 2008-02-07) ** Warnings about missing configuration files are only printed once. ** Fix debug message printing. ** Fix non-portable use of brace expansion in makefiles. * Version 0.0.34 (released 2008-01-16) ** Several code fixes for MinGW. A mingw build now compiles and passes the self-tests under Wine. ** When built under MinGW, generate a libshishi-XX.def using -Wl,--output-def. Useful when developing applications with Visual Studio. ** Use gettext 0.17. ** Update and re-factor gnulib files. There is now a new gnulib directory src/gl/ and db/gl/ for those modules that aren't needed by libshishi, but used by the command-line tools and libshisa, respectively. ** If syslog is not available, shishid is not built. Implementing an alternative logging mechanism is needed in order to re-enable building shishid on platforms that lack syslog. ** New types for DNS classes: SHISHI_DNS_IN: New #define. * Version 0.0.33 (released 2007-09-14) ** libpam_shishi: Don't echo password when reading it from console. Reported by Jack Bates . ** libpam_shishi: Save read password in PAM library for other modules. Reported by Jack Bates . ** Update translations. * Version 0.0.32 (released 2007-06-29) ** Shishi is now licensed under the GPL version 3 or later. ** Remove extra/inetutils.diff since the patch has been merged into InetUtils. ** Update gnulib files. * Version 0.0.31 (released 2007-06-11) ** Shishi is now developed using Git instead of CVS. A public git mirror is available from . ** Verify the KDC's certificate against a CA certificate in the client. The CA is by default stored in ~/.shishi/client.ca in PEM format. Suggested by Alberto Fondi . ** Update gnulib files. * Version 0.0.30 (released 2006-11-01) ** Update STARTTLS extension to match latest drafts. Shishi now implements draft-josefsson-krb-tcp-expansion-02.txt and draft-josefsson-kerberos5-starttls-02.txt. ** Fix failure when reading large integers from ASN.1 structure. This can manifest itself by giving error messages such as 'Replay protection value (nonce) differ between request and reply.'. Added a new self test "nonce" to detect errors in these routines. Reported by Alberto Fondi. * Version 0.0.29 (released 2006-11-01) ** Add man page for ccache2shishi. * Version 0.0.28 (released 2006-11-01) ** New command line tool "ccache2shishi". The tool will read tickets from /tmp/krb5cc_UID (by default) and will write them to ~/.shishi/tickets. ** A description of the ccache file format were added in doc/ccache.txt. ** A self-contained standalone parser of the ccache format added. See lib/ccache.h and lib/ccache.c. The intention is that they should be usable outside of Shishi, and it doesn't use any Shishi specific header files or functions. It also avoids heap memory handling. ** New APIs to read MIT ccache files. shishi_tkts_add_ccache_mem shishi_tkts_add_ccache_file shishi_tkts_from_ccache_mem shishi_tkts_from_ccache_file ** New APIs to support ccache reading. shishi_enckdcreppart_authtime_set shishi_enckdcreppart_starttime_set shishi_enckdcreppart_renew_till_set shishi_tkts_default_ccache_guess shishi_tkts_default_ccache shishi_tkts_default_ccache_set ** Fix build errors for missing arcfour_stream when using --with-libgcrypt. Reported by abhijit mitra . * Version 0.0.27 (released 2006-09-15) ** New command line tool "keytab2shishi". The tool will read host keys from /etc/krb5.keytab (by default) and will write them to $(prefix)/etc/shishi.keys. ** New APIs to read MIT keytab files. Thanks to Michael B Allen who reverse-engineered the format and published a freely licensed description, available from . The APIs are shishi_keys_add_keytab_mem, shishi_keys_add_keytab_file, shishi_keys_from_keytab_mem, and shishi_keys_from_keytab_file. ** New APIs to manage set of keys. shishi_keys shishi_keys_done shishi_keys_size shishi_keys_nth shishi_keys_remove shishi_keys_add shishi_keys_print shishi_keys_to_file ** Libtasn1 updated to 0.3.6. This fixes a bug that caused self-test failures in Shishi on 64-bit platforms. ** Remove path from syslog messages for shishid. ** Update of gnulib files. ** Some minor code cleanups. * Version 0.0.26 (released 2006-05-15) ** Requests for service tickets (TGS) are now sent without a sub-session key. This solves interop problems with Windows 2003 and Heimdal, thanks to Elrond for debugging. ** Fix buggy MD4 implementation on 64-bit platforms. ** The Shishi PAM module in extra/pam-shishi/ is now built by default. The installation path has also been changed to $prefix/lib/security, but you can change it with `configure --with-pam-dir=/somewhere/else' or `make install PAMDIR=/somewhere/else'. ** Fix mem leaks. ** Self-tests are now run under valgrind, if it is installed. ** Updated Polish translation, thanks to Jakub Bogusz. * Version 0.0.25 (released 2006-04-27) ** Fix bug in code to get service tickets. The problem was in the libtasn1 DER encoder which include ASN.1 tags for SEQUENCE members when calling asn1_der_coding() on a SEQUENCE element, thanks to Elrond for debugging. ** Improved handling of key versions. Shishi should not send kvno for a session keys in TGS requests any more. Internally, the UINT32_MAX kvno is now used to denote a "kvno"-less (i.e., non-permenant) key, earlier 0 was used which collided with the perfectly valid real kvno of 0. ** Improved translation of messages in shishi. ** Doc fixes. * Version 0.0.24 (released 2006-04-22) ** Fix bug in shishid which caused it to listen on standard input and crash. ** Pre-authentication support. Only the PA-ENC-TIMESTAMP, ETYPE-INFO and ETYPE-INFO2 mechanisms are supported. Tested againt MIT, Heimdal, and Windows 2003 KDCs. ** Clarified the copyright on lib/kerberos5.asn1. ** Updated gnulib compatibility files. ** Fix some memory leaks and crashes. * Version 0.0.23 (released 2006-03-25) ** Debian packages are available from http://josefsson.org/shishi/debian/ Thanks to Russ Allbery, Yvan Bassuel and Elrond for help on the Debian packaging. ** Added shishi_derive_default_salt and shishi_key_from_name APIs. Used to create a key from principal and password. Suggested by Elrond . ** Replace internal crypto code with modules from gnulib. ** Added shared library versioning script, suggested by Steve Langasek. ** Improved libidn detection code. ** The manual doesn't have any invariant sections. ** Updated gnulib compatibility files. ** Updated libtasn1. ** Minor bugfixes and improvements. * Version 0.0.22 (released 2005-08-10) ** Fix build error when STARTTLS support is enabled. ** The help-shishi@gnu.org mailing list is now mentioned in documentation. ** Should now build with objdir != srcdir on systems that lack stdbool.h. ** The license template in files were updated with the new FSF address. ** The internal libtasn1 copy was updated to version 0.2.14. ** Gnulib files updated, and uses within the library updated. * Version 0.0.21 (released 2004-12-17) ** Libtasn1 updated to 0.2.13. ** Gnulib files updated, and uses within the library updated. ** Fix srcdir != objdir building, reported by Mike Castle. * Version 0.0.20 (released 2004-11-21) ** Fix formatting of man pages, based on warnings from Doclifter. ** Updated gnulib compatibility files. * Version 0.0.19 (released 2004-11-12) ** Documentation improvements. For example, you can now browse the Shishi API manual using DevHelp. ** Updated gnulib compatibility files. * Version 0.0.18 (released 2004-10-15) ** When generating an AP-REP, the generated EncAPRepPart is now remembered. ** Fix some memory leaks. ** Revamp of autogenerated documentation. ** Documentation improvements. ** Included libtasn1 updated to 0.2.11. ** ASN.1 API cleanup: shishi_new_a2d: RENAMED to shishi_asn1_to_der. shishi_a2d_new_field: RENAMED to shishi_asn1_to_der_field. shishi_a2d, shishi_a2d_field: REMOVED. shishi_asn1_read: RENAMED to shishi_asn1_read_inline. shishi_asn1_read2: RENAMED to shishi_asn1_read. shishi_asn1_read2_optional: RENAMED to shishi_asn1_read_optional. shishi_asn1_read_optional: MODIFIED, now allocate output. ** Various other API fixes. Functions that take fixed size buffers have been replaced by functions that allocate dynamically sized buffer of the correct length. * Version 0.0.17 (released 2004-08-08) ** Revamp of gnulib compatibility files. ** Fix warnings. * Version 0.0.16 (released 2004-08-01) ** New environment variables to override defaults in Shishi library. SHISHI_USER specifies default client username, SHISHI_HOME specifies user Shishi home directory (for configuration file, ticket cache, etc), SHISHI_TICKETS the ticket cache file, SHISHI_CONFIG for the system configuration file, SHISHI_KEYS for system wide host keys. ** Experimental KDC now handle non-default ticket life time. ** Nettle is now preferred over Libgcrypt, even if Libgcrypt is available. Use configure parameter --with-libgcrypt to override. Nettle is the minimalistic crypto library included with Shishi. ** The pkg-config script no longer use the linker parameter -R. ** Libtasn1 updated to 0.2.10. ** Many gnulib compatibility files were updated. ** Cross compile builds should work. It should work for any sane cross compile target, but the only tested platform is uClibc/uClinux on Motorola Coldfire. * Version 0.0.15 (released 2004-04-18) ** Sequence numbers in Authenticator and EncAPRepPart are now randomized. ** Low-level fixes of AES Cipher Text Stealing mode. Also added more AES/CTS self tests. ** Configuration tokens spelled correctly ("verbose-noice" -> "verbose-noise"). ** Polish translation added, by Jakub Bogusz. ** Various bugfixes and cleanups. * Version 0.0.14 (released 2004-01-22) ** High-level AP interface now support setting raw checksum field values. This is needed for certain applications that, like GSS-API, put non-standard data in the checksum field of the Authenticator in a AP-REQ. ** Various minor bugfixes. * Version 0.0.13 (released 2004-01-15) ** Fixed salt calculation in shisa. The earlier salt computed was incorrect, so existing keys in your Shisa database, that were derived from passwords, are incorrect, and should be changed. ** Fixed shisa key file parser to handle keys with leading whitespace. The parser used fscanf, which skip whitespace. If your cryptographic key (not passwords), in binary format, had leading whitespace, it would fail to read the correct key. ** Fix shishid crash on startup when sockets can't be opened. ** Various minor bugfixes. * Version 0.0.12 (released 2004-01-02) ** The user database library Shisa has been improved. Shisa now support multiple keys for users, and you can now selectively add and remove keys via the command line interface. ** The Shishi client and Shishid KDC now support TLS resumption. This improve TLS handshake speed, in particular for the normal AS plus TGS combination. Currently the TLS resume database is only stored in memory, so if either the client or server process is restarted, the TLS resume information is lost. This add --resume-limit to Shishid, which can be used to specify the size of the TLS resume database (or to disable it). ** The KDC has been cleaned up and the error handling is more robust. ** The Shisa programming API is documented in the manual. * Version 0.0.11 (released 2003-12-21) ** The Shishi library now support X.509 authenticated KDC connections via TLS. The client currently do not check server authentication, however this is no worse than existing UDP/TCP connections. If client certificates are available, the X.509 client certificate is simply sent (via TLS handshake) to the KDC for possible pre-authentication purposes. ** The KDC now support X.509 authentication. If server certificates are available, X.509 authenticated TLS may be negotiated. The KDC currently only use the client certificate details for logging purposes. However, it do verify client certificate against CA certificates, if those are available. ** The KDC has been cleaned up and the error handling is more robust. * Version 0.0.10 (released 2003-12-16) ** The TLS support in Shishid now works. ** All command line interfaces now uses getopt instead of argp. * Version 0.0.9 (released 2003-12-12) ** An information storage system added, called Shisa. Shisa is used by KDCs (e.g., Shishid) to find information about principals. Shisa can be extended to support various backends, such as LDAP and SQL databases, but currently only a file system based database is supported. Shisa consists of two parts, a library (libshisa, see db/) and a command line tool (shisa, see src/). Shisa is designed to be concurrent write safe, i.e., multiple writers to the same database is permitted. This is very much work in progress. ** A new tool 'shisa' added to add/remove/list/modify the Shisa database. ** The Administration and Reference Manual has been (re)written. There is now a step-by-step walk-through on creating the database for a new realm, adding a few principals, starting the server and testing it by getting tickets. ** Shishid (the KDC server) now read keys via the Shisa database. The old hostkeys-alike file based "database" is no longer supported. ** A sample Shisa database and host keys are created during installation. The default realm name (typically your hostname) is used, which might not be what you prefer, but should get you started. ** Improve behaviour with poorly synchronized clocks. Earlier newly acquired tickets were discarded if they were not yet valid when you acquire them. Now tickets are only discarded when their end time is in the past. ** Support for DES and 3DES without integrity checking re-added. Those encryption algorithms are needed by GSS Wrap/Unwrap, but was accidently removed from Shishi during an earlier cleanup. ** When Libgcrypt is used, ARCFOUR now handle streamed operations. This is needed for, e.g., rsh in the Shishi patched version of GNU InetUtils. ** Paths to configurations files and host keys changed. The configuration files and host keys are now stored (by default, but see next entry) in $prefix/etc/shishi/, instead of, as it was before, in $prefix/etc (for configuration and host keys) and $prefix/share/shishi (for user configuration file template). ** Paths to configurations, host keys and the database root now configurable. The configure parameters --with-conf-dir, --with-skel-dir, --with-key-dir, and --with-db-dir can be used to specify the location of shishi.conf and shisa.conf (system configuration files), shishi.skel (user configuration file template), shishi.keys (host specific keys) and the Shisa database root, respectively. ** IANA allocated Telnet Encrypt command 12 for the AES-CCM mode. ** Autoconf 2.59, Automake 1.8, and Libtool from CVS is used. ** Some more self tests were added. * Version 0.0.8 (released 2003-10-16) ** Passwords are processed with SASLprep instead of KRBprep. ** Authorization improvements. ** Documentation additions. Protocol descriptions for STARTTLS, AES-CCM encrypted telnet, and Shishi rsh/rlogin. ** Support for upgrading TCP connections to KDC to TLS supported (STARTTLS). STARTTLS support will be compiled in automatically, if you have GNUTLS installed, but can be disabled unconditionally by configuring with --disable-tls. Use the 'realm-kdc' configuration token to specify which KDCs the client should use it against, e.g., 'realm-kdc=MYREALM.ORG,kdc.myrealm.org/tls'. * Version 0.0.7 (released 2003-09-21) ** Encryption types can now be referred to using shorter aliases. E.g., you can write "aes" instead of "aes256-cts-hmac-sha1-96". ** ARCFOUR encryption support according to draft-brezak-win2k-krb-rc4-hmac-04. ** DES-CBC-CRC now works. * Version 0.0.6 (released 2003-09-14) ** Proxiable, proxy, forwardable and forwarded tickets supported. See the User Manual for discussion and examples. ** Man pages for all public functions are included. ** Installed versions of Libgcrypt and libtasn1 used where possible. Shishi need Libgcrypt 1.1.44 or later, and libtasn1 0.2.5 or later. If a usable version is not found, the internal Nettle (crypto/) and/or libminitasn1 (asn1/) libraries are used instead. ** It is possible to enable and disable part of the system at compile time. See --disable-des, --disable-3des, --disable-aes, --disable-md, --disable-null, and --enable-arcfour. ** The internal crypto interface now fully modularized. If you wish to add support for a new low-level cryptographic library, to, e.g., utilize specialized hardware, it is now easy to do so. Two wrappers for Nettle (lib/nettle.c) and Libgcrypt (lib/libgcrypt.c) are included. ** Logging destination for warnings and informational messages can be changed. By default, message are sent to stderr for clients, and syslog for servers. See the new API functions shishi_outputtype and shishi_set_outputtype for more information. * Version 0.0.5 (released 2003-09-07) ** Server host name to realm mapping via DNS supported. ** SAFE functions improved. Example code of a client using integrity protected application data exchanges is in examples/client-safe.c and examples/server.c. ** PRIV functions added. Example code of a client using privacy protected application data exchanges is in examples/client-priv.c. ** Documentation improvements. E.g., a reference manual was added, that document the configuration file, and the shishi and shishid parameters. ** Various API changes. * Version 0.0.4 (released 2003-08-31) ** The rsh/rlogin client 'rsh-redone' ported to Shishi, by Nicolas Pouvesle. The client is located in extra/rsh-redone/. It supports authentication and encryption. It interoperate with other implementations. ** Authenticator subkeys are supported, and is used by default in AP/TGS. Some KDCs does not understand subkeys in TGS requests, and use the session key instead. Shishi detect and work around this problem but prints a warning. ** Simplistic key distribution center (KDC) is working. See the Administration Manual for a walk through on how to get it up and running. ** Various API changes. * Version 0.0.3 (released 2003-08-22) ** Documentation fixes. ** Cleanups. * Version 0.0.2 (released 2003-08-17) ** Command line handling of the 'shishi' application rewritten. See the (updated) user manual and --help output for the new story. ** It is possible to acquire renewable tickets. ** Example client and server included. Application data protection is not supported, but authentication is demonstrated. The files are in src/client.c and src/server.c. ** New configuration verbs: 'ticket-life' and 'renew-life'. ** AES ciphers didn't work when nettle was used. ** Cleanups, bug fixes and improved portability. * Version 0.0.1 (released 2003-08-10) ** InetUtils copy removed. The patches (also found in extra/inetutils.diff) are forwarded upstream. ** Libidn copy removed. Libidn is optional, but recommended. It is used automatically if present on your system. ** Gettext not included. Due to some conflicts between libtool and gettext, if you want i18n on platforms that does not already have a useful gettext implementation, you can install GNU gettext before building this package. If you don't care about i18n, this package should work fine (except for i18n, of course). ** Low-level crypto uses nettle if libgcrypt is not installed. Libgcrypt is not shipped with Shishi any more, instead a more streamlined crypto implementation based on nettle is included. Specify --with-libgcrypt to use libgcrypt. ** Libtasn1 updated and replaced by "minitasn1" from gnutls. Specify --with-system-libtasn1 to link with the installed libtasn1, if you have it. ** KDC addresses are now found via DNS SRV RRs as a last resort. This is only enabled if libresolv and resolv.h is found on your system. ** Argp and other compatibility files replaced by gl/ directory. ** Cleanups, bug fixes and various improvements. * Version 0.0.0 (released 2003-06-02) ** Initial release ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/gtk-doc.make0000664000000000000000000002061312015626624012067 00000000000000# -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ tmpl.stamp sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) if ENABLE_GTK_DOC if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) else all-local: endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ test -d $(abs_srcdir)/tmpl && \ { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ chmod -R u+w $(abs_builddir)/tmpl; } \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### templates #### tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt @echo ' DOC Rebuilding template files' @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ if test -w $(abs_srcdir) ; then \ cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ fi \ fi @touch tmpl-build.stamp tmpl.stamp: tmpl-build.stamp @true $(srcdir)/tmpl/*.sgml: @true #### xml #### sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) @echo ' DOC Building XML' @-chmod -R u+w $(srcdir) @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$(?)" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building PDF' @rm -f $(DOC_MODULE).pdf @mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ rm -rf tmpl; \ fi maintainer-clean-local: clean @rm -rf xml html install-data-local: @installfiles=`echo $(builddir)/html/*`; \ if test "$$installfiles" = '$(builddir)/html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if ENABLE_GTK_DOC dist-check-gtkdoc: else dist-check-gtkdoc: @echo "*** gtk-doc must be installed and enabled in order to make dist" @false endif dist-hook: dist-check-gtkdoc dist-hook-local @mkdir $(distdir)/tmpl @mkdir $(distdir)/html @-cp ./tmpl/*.sgml $(distdir)/tmpl @cp ./html/* $(distdir)/html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs shishi-1.0.2/Makefile.in0000644000000000000000000017631712126772725011767 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/shisa.conf.in $(srcdir)/shishi.conf.in \ $(srcdir)/shishi.pc.in $(srcdir)/shishi.skel.in \ $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \ INSTALL NEWS THANKS build-aux/ar-lib build-aux/config.guess \ build-aux/config.rpath build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/ltmain.sh build-aux/mdate-sh \ build-aux/missing build-aux/texinfo.tex build-aux/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = shisa.conf shishi.conf shishi.pc shishi.skel CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(confdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(skeldir)" DATA = $(conf_DATA) $(pkgconfig_DATA) $(skel_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --without-libgcrypt EXTRA_DIST = cfg.mk maint.mk .clcopying SUBDIRS = po gl lib db src tests doc extra examples ACLOCAL_AMFLAGS = -I m4 -I gl/m4 -I src/gl/m4 -I db/gl/m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = shishi.pc confdir = $(CONFDIR) conf_DATA = shishi.conf shisa.conf skeldir = $(SKELDIR) skel_DATA = shishi.skel distuninstallcheck_listfiles = find . -type f -print | grep -v -e shishi.keys -e 0.key all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 shisa.conf: $(top_builddir)/config.status $(srcdir)/shisa.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ shishi.conf: $(top_builddir)/config.status $(srcdir)/shishi.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ shishi.pc: $(top_builddir)/config.status $(srcdir)/shishi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ shishi.skel: $(top_builddir)/config.status $(srcdir)/shishi.skel.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-confDATA: $(conf_DATA) @$(NORMAL_INSTALL) @list='$(conf_DATA)'; test -n "$(confdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(confdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(confdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(confdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(confdir)" || exit $$?; \ done uninstall-confDATA: @$(NORMAL_UNINSTALL) @list='$(conf_DATA)'; test -n "$(confdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(confdir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-skelDATA: $(skel_DATA) @$(NORMAL_INSTALL) @list='$(skel_DATA)'; test -n "$(skeldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(skeldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(skeldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(skeldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(skeldir)" || exit $$?; \ done uninstall-skelDATA: @$(NORMAL_UNINSTALL) @list='$(skel_DATA)'; test -n "$(skeldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(skeldir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(confdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(skeldir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-confDATA install-pkgconfigDATA \ install-skelDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-confDATA uninstall-pkgconfigDATA \ uninstall-skelDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-data-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-confDATA install-data \ install-data-am install-data-hook install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-skelDATA install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-confDATA \ uninstall-pkgconfigDATA uninstall-skelDATA install-data-hook: @echo Initializing database and creating host key... if test ! -d $(DESTDIR)$(DBDIR); then \ if mkdir -m 0700 -p $(DESTDIR)$(DBDIR); then \ if test ! -f $(DESTDIR)$(KEYDIR)/shishi.keys; then \ if $(DESTDIR)$(bindir)/shisa$(EXEEXT) -a > \ $(DESTDIR)$(KEYDIR)/shishi.keys; then \ echo Successfully created database and host key.; \ else \ echo Unable to create database, see $(DESTDIR)$(KEYDIR)/shishi.keys.; \ fi; \ else \ echo Key file $(DESTDIR)$(KEYDIR)/shishi.keys already exist.; \ fi; \ else \ echo Could not create directory root$(DESTDIR)$(DBDIR).; \ fi; \ else \ echo Database root $(DESTDIR)$(DBDIR) already exist.; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/maint.mk0000644000000000000000000017265412126660054011352 00000000000000# -*-Makefile-*- # This Makefile fragment tries to be general-purpose enough to be # used by many projects via the gnulib maintainer-makefile module. ## Copyright (C) 2001-2013 Free Software Foundation, Inc. ## ## 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 . # This is reported not to work with make-3.79.1 # ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) ME := maint.mk # Diagnostic for continued use of deprecated variable. # Remove in 2013 ifneq ($(build_aux),) $(error "$(ME): \ set $$(_build-aux) relative to $$(srcdir) instead of $$(build_aux)") endif # Helper variables. _empty = _sp = $(_empty) $(_empty) # _equal,S1,S2 # ------------ # If S1 == S2, return S1, otherwise the empty string. _equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) # member-check,VARIABLE,VALID-VALUES # ---------------------------------- # Check that $(VARIABLE) is in the space-separated list of VALID-VALUES, and # return it. Die otherwise. member-check = \ $(strip \ $(if $($(1)), \ $(if $(findstring $(_sp),$($(1))), \ $(error invalid $(1): '$($(1))', expected $(2)), \ $(or $(findstring $(_sp)$($(1))$(_sp),$(_sp)$(2)$(_sp)), \ $(error invalid $(1): '$($(1))', expected $(2)))), \ $(error $(1) undefined))) # Do not save the original name or timestamp in the .tar.gz file. # Use --rsyncable if available. gzip_rsyncable := \ $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null \ && printf %s --rsyncable) GZIP_ENV = '--no-name --best $(gzip_rsyncable)' GIT = git VC = $(GIT) VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir) # You can override this variable in cfg.mk to set your own regexp # matching files to ignore. VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$ # This is to preprocess robustly the output of $(VC_LIST), so that even # when $(srcdir) is a pathological name like "....", the leading sed command # removes only the intended prefix. _dot_escaped_srcdir = $(subst .,\.,$(srcdir)) # Post-process $(VC_LIST) output, prepending $(srcdir)/, but only # when $(srcdir) is not ".". ifeq ($(srcdir),.) _prepend_srcdir_prefix = else _prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|' endif # In order to be able to consistently filter "."-relative names, # (i.e., with no $(srcdir) prefix), this definition is careful to # remove any $(srcdir) prefix, and to restore what it removes. _sc_excl = \ $(or $(exclude_file_name_regexp--$@),^$$) VC_LIST_EXCEPT = \ $(VC_LIST) | sed 's|^$(_dot_escaped_srcdir)/||' \ | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \ else grep -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \ | grep -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \ $(_prepend_srcdir_prefix) ifeq ($(origin prev_version_file), undefined) prev_version_file = $(srcdir)/.prev-version endif PREV_VERSION := $(shell cat $(prev_version_file) 2>/dev/null) VERSION_REGEXP = $(subst .,\.,$(VERSION)) PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION)) ifeq ($(VC),$(GIT)) this-vc-tag = v$(VERSION) this-vc-tag-regexp = v$(VERSION_REGEXP) else tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]') tag-this-version = $(subst .,_,$(VERSION)) this-vc-tag = $(tag-package)-$(tag-this-version) this-vc-tag-regexp = $(this-vc-tag) endif my_distdir = $(PACKAGE)-$(VERSION) # Old releases are stored here. release_archive_dir ?= ../release # If RELEASE_TYPE is undefined, but RELEASE is, use its second word. # But overwrite VERSION. ifdef RELEASE VERSION := $(word 1, $(RELEASE)) RELEASE_TYPE ?= $(word 2, $(RELEASE)) endif # Validate and return $(RELEASE_TYPE), or die. RELEASE_TYPES = alpha beta stable release-type = $(call member-check,RELEASE_TYPE,$(RELEASE_TYPES)) # Override gnu_rel_host and url_dir_list in cfg.mk if these are not right. # Use alpha.gnu.org for alpha and beta releases. # Use ftp.gnu.org for stable releases. gnu_ftp_host-alpha = alpha.gnu.org gnu_ftp_host-beta = alpha.gnu.org gnu_ftp_host-stable = ftp.gnu.org gnu_rel_host ?= $(gnu_ftp_host-$(release-type)) url_dir_list ?= $(if $(call _equal,$(gnu_rel_host),ftp.gnu.org), \ http://ftpmirror.gnu.org/$(PACKAGE), \ ftp://$(gnu_rel_host)/gnu/$(PACKAGE)) # Override this in cfg.mk if you are using a different format in your # NEWS file. today = $(shell date +%Y-%m-%d) # Select which lines of NEWS are searched for $(news-check-regexp). # This is a sed line number spec. The default says that we search # lines 1..10 of NEWS for $(news-check-regexp). # If you want to search only line 3 or only lines 20-22, use "3" or "20,22". news-check-lines-spec ?= 1,10 news-check-regexp ?= '^\*.* $(VERSION_REGEXP) \($(today)\)' # Prevent programs like 'sort' from considering distinct strings to be equal. # Doing it here saves us from having to set LC_ALL elsewhere in this file. export LC_ALL = C ## --------------- ## ## Sanity checks. ## ## --------------- ## _cfg_mk := $(wildcard $(srcdir)/cfg.mk) # Collect the names of rules starting with 'sc_'. syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \ $(srcdir)/$(ME) $(_cfg_mk))) .PHONY: $(syntax-check-rules) ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0) local-checks-available += $(syntax-check-rules) else local-checks-available += no-vc-detected no-vc-detected: @echo "No version control files detected; skipping syntax check" endif .PHONY: $(local-checks-available) # Arrange to print the name of each syntax-checking rule just before running it. $(syntax-check-rules): %: %.m sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules)) .PHONY: $(sc_m_rules_) $(sc_m_rules_): @echo $(patsubst sc_%.m, %, $@) @date +%s.%N > .sc-start-$(basename $@) # Compute and print the elapsed time for each syntax-check rule. sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules)) .PHONY: $(sc_z_rules_) $(sc_z_rules_): %.z: % @end=$$(date +%s.%N); \ start=$$(cat .sc-start-$*); \ rm -f .sc-start-$*; \ awk -v s=$$start -v e=$$end \ 'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null # The patsubst here is to replace each sc_% rule with its sc_%.z wrapper # that computes and prints elapsed time. local-check := \ $(patsubst sc_%, sc_%.z, \ $(filter-out $(local-checks-to-skip), $(local-checks-available))) syntax-check: $(local-check) # _sc_search_regexp # # This macro searches for a given construct in the selected files and # then takes some action. # # Parameters (shell variables): # # prohibit | require # # Regular expression (ERE) denoting either a forbidden construct # or a required construct. Those arguments are exclusive. # # exclude # # Regular expression (ERE) denoting lines to ignore that matched # a prohibit construct. For example, this can be used to exclude # comments that mention why the nearby code uses an alternative # construct instead of the simpler prohibited construct. # # in_vc_files | in_files # # grep-E-style regexp selecting the files to check. For in_vc_files, # the regexp is used to select matching files from the list of all # version-controlled files; for in_files, it's from the names printed # by "find $(srcdir)". When neither is specified, use all files that # are under version control. # # containing | non_containing # # Select the files (non) containing strings matching this regexp. # If both arguments are specified then CONTAINING takes # precedence. # # with_grep_options # # Extra options for grep. # # ignore_case # # Ignore case. # # halt # # Message to display before to halting execution. # # Finally, you may exempt files based on an ERE matching file names. # For example, to exempt from the sc_space_tab check all files with the # .diff suffix, set this Make variable: # # exclude_file_name_regexp--sc_space_tab = \.diff$ # # Note that while this functionality is mostly inherited via VC_LIST_EXCEPT, # when filtering by name via in_files, we explicitly filter out matching # names here as well. # Initialize each, so that envvar settings cannot interfere. export require = export prohibit = export exclude = export in_vc_files = export in_files = export containing = export non_containing = export halt = export with_grep_options = # By default, _sc_search_regexp does not ignore case. export ignore_case = _ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :) define _sc_say_and_exit dummy=; : so we do not need a semicolon before each use; \ { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; }; endef define _sc_search_regexp dummy=; : so we do not need a semicolon before each use; \ \ : Check arguments; \ test -n "$$prohibit" && test -n "$$require" \ && { msg='Cannot specify both prohibit and require' \ $(_sc_say_and_exit) } || :; \ test -z "$$prohibit" && test -z "$$require" \ && { msg='Should specify either prohibit or require' \ $(_sc_say_and_exit) } || :; \ test -z "$$prohibit" && test -n "$$exclude" \ && { msg='Use of exclude requires a prohibit pattern' \ $(_sc_say_and_exit) } || :; \ test -n "$$in_vc_files" && test -n "$$in_files" \ && { msg='Cannot specify both in_vc_files and in_files' \ $(_sc_say_and_exit) } || :; \ test "x$$halt" != x \ || { msg='halt not defined' $(_sc_say_and_exit) }; \ \ : Filter by file name; \ if test -n "$$in_files"; then \ files=$$(find $(srcdir) | grep -E "$$in_files" \ | grep -Ev '$(_sc_excl)'); \ else \ files=$$($(VC_LIST_EXCEPT)); \ if test -n "$$in_vc_files"; then \ files=$$(echo "$$files" | grep -E "$$in_vc_files"); \ fi; \ fi; \ \ : Filter by content; \ test -n "$$files" && test -n "$$containing" \ && { files=$$(grep -l "$$containing" $$files); } || :; \ test -n "$$files" && test -n "$$non_containing" \ && { files=$$(grep -vl "$$non_containing" $$files); } || :; \ \ : Check for the construct; \ if test -n "$$files"; then \ if test -n "$$prohibit"; then \ grep $$with_grep_options $(_ignore_case) -nE "$$prohibit" $$files \ | grep -vE "$${exclude:-^$$}" \ && { msg="$$halt" $(_sc_say_and_exit) } || :; \ else \ grep $$with_grep_options $(_ignore_case) -LE "$$require" $$files \ | grep . \ && { msg="$$halt" $(_sc_say_and_exit) } || :; \ fi \ else :; \ fi || :; endef sc_avoid_if_before_free: @$(srcdir)/$(_build-aux)/useless-if-before-free \ $(useless_free_options) \ $$($(VC_LIST_EXCEPT) | grep -v useless-if-before-free) && \ { echo '$(ME): found useless "if" before "free" above' 1>&2; \ exit 1; } || : sc_cast_of_argument_to_free: @prohibit='\&2; \ exit 1; } || : # Error messages should not start with a capital letter sc_error_message_uppercase: @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ | grep -E '"[A-Z]' \ | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' && \ { echo '$(ME): found capitalized error message' 1>&2; \ exit 1; } || : # Error messages should not end with a period sc_error_message_period: @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ | grep -E '[^."]\."' && \ { echo '$(ME): found error message ending in period' 1>&2; \ exit 1; } || : sc_file_system: @prohibit=file''system \ ignore_case=1 \ halt='found use of "file''system"; spell it "file system"' \ $(_sc_search_regexp) # Don't use cpp tests of this symbol. All code assumes config.h is included. sc_prohibit_have_config_h: @prohibit='^# *if.*HAVE''_CONFIG_H' \ halt='found use of HAVE''_CONFIG_H; remove' \ $(_sc_search_regexp) # Nearly all .c files must include . However, we also permit this # via inclusion of a package-specific header, if cfg.mk specified one. # config_h_header must be suitable for grep -E. config_h_header ?= sc_require_config_h: @require='^# *include $(config_h_header)' \ in_vc_files='\.c$$' \ halt='the above files do not include ' \ $(_sc_search_regexp) # You must include before including any other header file. # This can possibly be via a package-specific header, if given by cfg.mk. sc_require_config_h_first: @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ fail=0; \ for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \ grep '^# *include\>' $$i | sed 1q \ | grep -E '^# *include $(config_h_header)' > /dev/null \ || { echo $$i; fail=1; }; \ done; \ test $$fail = 1 && \ { echo '$(ME): the above files include some other header' \ 'before ' 1>&2; exit 1; } || :; \ else :; \ fi sc_prohibit_HAVE_MBRTOWC: @prohibit='\bHAVE_MBRTOWC\b' \ halt="do not use $$prohibit; it is always defined" \ $(_sc_search_regexp) # To use this "command" macro, you must first define two shell variables: # h: the header name, with no enclosing <> or "" # re: a regular expression that matches IFF something provided by $h is used. define _sc_header_without_use dummy=; : so we do not need a semicolon before each use; \ h_esc=`echo '[<"]'"$$h"'[">]'|sed 's/\./\\\\./g'`; \ if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ files=$$(grep -l '^# *include '"$$h_esc" \ $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \ grep -LE "$$re" $$files | grep . && \ { echo "$(ME): the above files include $$h but don't use it" \ 1>&2; exit 1; } || :; \ else :; \ fi endef # Prohibit the inclusion of assert.h without an actual use of assert. sc_prohibit_assert_without_use: @h='assert.h' re='\new(file => "/dev/stdin")->as_string'|sed 's/\?://g' # Note this was produced by the above: # _xa1 = \ #x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup) # But we can do better, in at least two ways: # 1) take advantage of two "dup"-suffixed strings: # x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup) # 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable # "char|[cmz]" # x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) _xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) _xa2 = X([CZ]|N?M)ALLOC sc_prohibit_xalloc_without_use: @h='xalloc.h' \ re='\<($(_xa1)|$(_xa2)) *\('\ $(_sc_header_without_use) # Extract function names: # perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/hash.h _hash_re = \ clear|delete|free|get_(first|next)|insert|lookup|print_statistics|reset_tuning _hash_fn = \<($(_hash_re)) *\( _hash_struct = (struct )?\<[Hh]ash_(table|tuning)\> sc_prohibit_hash_without_use: @h='hash.h' \ re='$(_hash_fn)|$(_hash_struct)'\ $(_sc_header_without_use) sc_prohibit_cloexec_without_use: @h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \ $(_sc_header_without_use) sc_prohibit_posixver_without_use: @h='posixver.h' re='\' \ halt='do not use HAVE''_FCNTL_H or O'_NDELAY \ $(_sc_search_regexp) # FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ # Each nonempty ChangeLog line must start with a year number, or a TAB. sc_changelog: @prohibit='^[^12 ]' \ in_vc_files='^ChangeLog$$' \ halt='found unexpected prefix in a ChangeLog' \ $(_sc_search_regexp) # Ensure that each .c file containing a "main" function also # calls set_program_name. sc_program_name: @require='set_program_name *\(m?argv\[0\]\);' \ in_vc_files='\.c$$' \ containing='\
      /dev/null \ && : || { die=1; echo $$i; } \ done; \ test $$die = 1 && \ { echo 1>&2 '$(ME): the final line in each of the above is not:'; \ echo 1>&2 'Exit something'; \ exit 1; } || :; \ fi sc_trailing_blank: @prohibit='[ ]$$' \ halt='found trailing blank(s)' \ exclude='^Binary file .* matches$$' \ $(_sc_search_regexp) # Match lines like the following, but where there is only one space # between the options and the description: # -D, --all-repeated[=delimit-method] print all duplicate lines\n longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)? sc_two_space_separator_in_usage: @prohibit='^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \ halt='help2man requires at least two spaces between an option and its description'\ $(_sc_search_regexp) # A regexp matching function names like "error" that may be used # to emit translatable messages. _gl_translatable_diag_func_re ?= error # Look for diagnostics that aren't marked for translation. # This won't find any for which error's format string is on a separate line. sc_unmarked_diagnostics: @prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \ exclude='(_|ngettext ?)\(' \ halt='found unmarked diagnostic(s)' \ $(_sc_search_regexp) # Avoid useless parentheses like those in this example: # #if defined (SYMBOL) || defined (SYM2) sc_useless_cpp_parens: @prohibit='^# *if .*defined *\(' \ halt='found useless parentheses in cpp directive' \ $(_sc_search_regexp) # List headers for which HAVE_HEADER_H is always true, assuming you are # using the appropriate gnulib module. CAUTION: for each "unnecessary" # #if HAVE_HEADER_H that you remove, be sure that your project explicitly # requires the gnulib module that guarantees the usability of that header. gl_assured_headers_ = \ cd $(gnulib_dir)/lib && echo *.in.h|sed 's/\.in\.h//g' # Convert the list of names to upper case, and replace each space with "|". az_ = abcdefghijklmnopqrstuvwxyz AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ gl_header_upper_case_or_ = \ $$($(gl_assured_headers_) \ | tr $(az_)/.- $(AZ_)___ \ | tr -s ' ' '|' \ ) sc_prohibit_always_true_header_tests: @or=$(gl_header_upper_case_or_); \ re="HAVE_($$or)_H"; \ prohibit='\<'"$$re"'\>' \ halt=$$(printf '%s\n' \ 'do not test the above HAVE_
      _H symbol(s);' \ ' with the corresponding gnulib module, they are always true') \ $(_sc_search_regexp) sc_prohibit_defined_have_decl_tests: @prohibit='#[ ]*if(n?def|.*\[ (]+HAVE_DECL_' \ halt='HAVE_DECL macros are always defined' \ $(_sc_search_regexp) # ================================================================== gl_other_headers_ ?= \ intprops.h \ openat.h \ stat-macros.h # Perl -lne code to extract "significant" cpp-defined symbols from a # gnulib header file, eliminating a few common false-positives. # The exempted names below are defined only conditionally in gnulib, # and hence sometimes must/may be defined in application code. gl_extract_significant_defines_ = \ /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\ && $$2 !~ /(?:rpl_|_used_without_)/\ && $$1 !~ /^(?:NSIG|ENODATA)$$/\ && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\ and print $$1 # Create a list of regular expressions matching the names # of macros that are guaranteed to be defined by parts of gnulib. define def_sym_regex gen_h=$(gl_generated_headers_); \ (cd $(gnulib_dir)/lib; \ for f in *.in.h $(gl_other_headers_); do \ test -f $$f \ && perl -lne '$(gl_extract_significant_defines_)' $$f; \ done; \ ) | sort -u \ | sed 's/^/^ *# *(define|undef) */;s/$$/\\>/' endef # Don't define macros that we already get from gnulib header files. sc_prohibit_always-defined_macros: @if test -d $(gnulib_dir); then \ case $$(echo all: | grep -l -f - Makefile) in Makefile);; *) \ echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \ esac; \ $(def_sym_regex) | grep -E -f - $$($(VC_LIST_EXCEPT)) \ && { echo '$(ME): define the above via some gnulib .h file' \ 1>&2; exit 1; } || :; \ fi # ================================================================== # Prohibit checked in backup files. sc_prohibit_backup_files: @$(VC_LIST) | grep '~$$' && \ { echo '$(ME): found version controlled backup file' 1>&2; \ exit 1; } || : # Require the latest GPL. sc_GPL_version: @prohibit='either ''version [^3]' \ halt='GPL vN, N!=3' \ $(_sc_search_regexp) # Require the latest GFDL. Two regexp, since some .texi files end up # line wrapping between 'Free Documentation License,' and 'Version'. _GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any) sc_GFDL_version: @prohibit='$(_GFDL_regexp)' \ halt='GFDL vN, N!=3' \ $(_sc_search_regexp) # Don't use Texinfo's @acronym{}. # http://lists.gnu.org/archive/html/bug-gnulib/2010-03/msg00321.html texinfo_suffix_re_ ?= \.(txi|texi(nfo)?)$$ sc_texinfo_acronym: @prohibit='@acronym\{' \ in_vc_files='$(texinfo_suffix_re_)' \ halt='found use of Texinfo @acronym{}' \ $(_sc_search_regexp) cvs_keywords = \ Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State sc_prohibit_cvs_keyword: @prohibit='\$$($(cvs_keywords))\$$' \ halt='do not use CVS keyword expansion' \ $(_sc_search_regexp) # This Perl code is slightly obfuscated. Not only is each "$" doubled # because it's in a Makefile, but the $$c's are comments; we cannot # use "#" due to the way the script ends up concatenated onto one line. # It would be much more concise, and would produce better output (including # counts) if written as: # perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ... # but that would be far less efficient, reading the entire contents # of each file, rather than just the last two bytes of each. # In addition, while the code below detects both blank lines and a missing # newline at EOF, the above detects only the former. # # This is a perl script that is expected to be the single-quoted argument # to a command-line "-le". The remaining arguments are file names. # Print the name of each file that does not end in exactly one newline byte. # I.e., warn if there are blank lines (2 or more newlines), or if the # last byte is not a newline. However, currently we don't complain # about any file that contains exactly one byte. # Exit nonzero if at least one such file is found, otherwise, exit 0. # Warn about, but otherwise ignore open failure. Ignore seek/read failure. # # Use this if you want to remove trailing empty lines from selected files: # perl -pi -0777 -e 's/\n\n+$/\n/' files... # require_exactly_one_NL_at_EOF_ = \ foreach my $$f (@ARGV) \ { \ open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \ my $$p = sysseek (F, -2, 2); \ my $$c = "seek failure probably means file has < 2 bytes; ignore"; \ my $$last_two_bytes; \ defined $$p and $$p = sysread F, $$last_two_bytes, 2; \ close F; \ $$c = "ignore read failure"; \ $$p && ($$last_two_bytes eq "\n\n" \ || substr ($$last_two_bytes,1) ne "\n") \ and (print $$f), $$fail=1; \ } \ END { exit defined $$fail } sc_prohibit_empty_lines_at_EOF: @perl -le '$(require_exactly_one_NL_at_EOF_)' $$($(VC_LIST_EXCEPT)) \ || { echo '$(ME): empty line(s) or no newline at EOF' \ 1>&2; exit 1; } || : # Make sure we don't use st_blocks. Use ST_NBLOCKS instead. # This is a bit of a kludge, since it prevents use of the string # even in comments, but for now it does the job with no false positives. sc_prohibit_stat_st_blocks: @prohibit='[.>]st_blocks' \ halt='do not use st_blocks; use ST_NBLOCKS' \ $(_sc_search_regexp) # Make sure we don't define any S_IS* macros in src/*.c files. # They're already defined via gnulib's sys/stat.h replacement. sc_prohibit_S_IS_definition: @prohibit='^ *# *define *S_IS' \ halt='do not define S_IS* macros; include ' \ $(_sc_search_regexp) # Perl block to convert a match to FILE_NAME:LINENO:TEST, # that is shared by two definitions below. perl_filename_lineno_text_ = \ -e ' {' \ -e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \ -e ' ($$v = $$&) =~ s/\n/\\n/g;' \ -e ' print "$$ARGV:$$n:$$v\n";' \ -e ' }' prohibit_doubled_word_RE_ ?= \ /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims prohibit_doubled_word_ = \ -e 'while ($(prohibit_doubled_word_RE_))' \ $(perl_filename_lineno_text_) # Define this to a regular expression that matches # any filename:dd:match lines you want to ignore. # The default is to ignore no matches. ignore_doubled_word_match_RE_ ?= ^$$ sc_prohibit_doubled_word: @perl -n -0777 $(prohibit_doubled_word_) $$($(VC_LIST_EXCEPT)) \ | grep -vE '$(ignore_doubled_word_match_RE_)' \ | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || : # A regular expression matching undesirable combinations of words like # "can not"; this matches them even when the two words appear on different # lines, but not when there is an intervening delimiter like "#" or "*". # Similarly undesirable, "See @xref{...}", since an @xref should start # a sentence. Explicitly prohibit any prefix of "see" or "also". # Also prohibit a prefix matching "\w+ +". # @pxref gets the same see/also treatment and should be parenthesized; # presume it must *not* start a sentence. bad_xref_re_ ?= (?:[\w,:;] +|(?:see|also)\s+)\@xref\{ bad_pxref_re_ ?= (?:[.!?]|(?:see|also))\s+\@pxref\{ prohibit_undesirable_word_seq_RE_ ?= \ /(?:\bcan\s+not\b|$(bad_xref_re_)|$(bad_pxref_re_))/gims prohibit_undesirable_word_seq_ = \ -e 'while ($(prohibit_undesirable_word_seq_RE_))' \ $(perl_filename_lineno_text_) # Define this to a regular expression that matches # any filename:dd:match lines you want to ignore. # The default is to ignore no matches. ignore_undesirable_word_sequence_RE_ ?= ^$$ sc_prohibit_undesirable_word_seq: @perl -n -0777 $(prohibit_undesirable_word_seq_) \ $$($(VC_LIST_EXCEPT)) \ | grep -vE '$(ignore_undesirable_word_sequence_RE_)' | grep . \ && { echo '$(ME): undesirable word sequence' >&2; exit 1; } || : _ptm1 = use "test C1 && test C2", not "test C1 -''a C2" _ptm2 = use "test C1 || test C2", not "test C1 -''o C2" # Using test's -a and -o operators is not portable. # We prefer test over [, since the latter is spelled [[ in configure.ac. sc_prohibit_test_minus_ao: @prohibit='(\ /dev/null \ || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \ done; \ test $$fail = 1 && \ { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \ exit 1; } || :; \ fi # Warn about "c0nst struct Foo const foo[]", # but not about "char const *const foo" or "#define const const". sc_redundant_const: @prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \ halt='redundant "const" in declarations' \ $(_sc_search_regexp) sc_const_long_option: @prohibit='^ *static.*struct option ' \ exclude='const struct option|struct option const' \ halt='add "const" to the above declarations' \ $(_sc_search_regexp) NEWS_hash = \ $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \ $(srcdir)/NEWS \ | perl -0777 -pe \ 's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \ | md5sum - \ | sed 's/ .*//') # Ensure that we don't accidentally insert an entry into an old NEWS block. sc_immutable_NEWS: @if test -f $(srcdir)/NEWS; then \ test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \ { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \ fi # Update the hash stored above. Do this after each release and # for any corrections to old entries. update-NEWS-hash: NEWS perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \ $(srcdir)/cfg.mk # Ensure that we use only the standard $(VAR) notation, # not @...@ in Makefile.am, now that we can rely on automake # to emit a definition for each substituted variable. # However, there is still one case in which @VAR@ use is not just # legitimate, but actually required: when augmenting an automake-defined # variable with a prefix. For example, gettext uses this: # MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@ # otherwise, makeinfo would put German or French (current locale) # navigation hints in the otherwise-English documentation. # # Allow the package to add exceptions via a hook in cfg.mk; # for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by # setting this to ' && !/PRAGMA_SYSTEM_HEADER/'. _makefile_at_at_check_exceptions ?= sc_makefile_at_at_check: @perl -ne '/\@\w+\@/' \ -e ' && !/(\w+)\s+=.*\@\1\@$$/' \ -e ''$(_makefile_at_at_check_exceptions) \ -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \ $$($(VC_LIST_EXCEPT) | grep -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \ && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || : news-check: NEWS $(AM_V_GEN)if sed -n $(news-check-lines-spec)p $< \ | grep -E $(news-check-regexp) >/dev/null; then \ :; \ else \ echo 'NEWS: $$(news-check-regexp) failed to match' 1>&2; \ exit 1; \ fi sc_makefile_TAB_only_indentation: @prohibit='^ [ ]{8}' \ in_vc_files='akefile|\.mk$$' \ halt='found TAB-8-space indentation' \ $(_sc_search_regexp) sc_m4_quote_check: @prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \ in_vc_files='(^configure\.ac|\.m4)$$' \ halt='quote the first arg to AC_DEF*' \ $(_sc_search_regexp) fix_po_file_diag = \ 'you have changed the set of files with translatable diagnostics;\n\ apply the above patch\n' # Verify that all source files using _() (more specifically, files that # match $(_gl_translatable_string_re)) are listed in po/POTFILES.in. po_file ?= $(srcdir)/po/POTFILES.in generated_files ?= $(srcdir)/lib/*.[ch] _gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$) sc_po_check: @if test -f $(po_file); then \ grep -E -v '^(#|$$)' $(po_file) \ | grep -v '^src/false\.c$$' | sort > $@-1; \ files=; \ for file in $$($(VC_LIST_EXCEPT)) $(generated_files); do \ test -r $$file || continue; \ case $$file in \ *.m4|*.mk) continue ;; \ *.?|*.??) ;; \ *) continue;; \ esac; \ case $$file in \ *.[ch]) \ base=`expr " $$file" : ' \(.*\)\..'`; \ { test -f $$base.l || test -f $$base.y; } && continue;; \ esac; \ files="$$files $$file"; \ done; \ grep -E -l '$(_gl_translatable_string_re)' $$files \ | sed 's|^$(_dot_escaped_srcdir)/||' | sort -u > $@-2; \ diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \ || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \ rm -f $@-1 $@-2; \ fi # Sometimes it is useful to change the PATH environment variable # in Makefiles. When doing so, it's better not to use the Unix-centric # path separator of ':', but rather the automake-provided '$(PATH_SEPARATOR)'. msg = 'Do not use ":" above; use $$(PATH_SEPARATOR) instead' sc_makefile_path_separator_check: @prohibit='PATH[=].*:' \ in_vc_files='akefile|\.mk$$' \ halt=$(msg) \ $(_sc_search_regexp) # Check that 'make alpha' will not fail at the end of the process, # i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release) # and is read-only. writable-files: $(AM_V_GEN)if test -d $(release_archive_dir); then \ for file in $(DIST_ARCHIVES); do \ for p in ./ $(release_archive_dir)/; do \ test -e $$p$$file || continue; \ test -w $$p$$file \ || { echo ERROR: $$p$$file is not writable; fail=1; }; \ done; \ done; \ test "$$fail" && exit 1 || : ; \ else :; \ fi v_etc_file = $(gnulib_dir)/lib/version-etc.c sample-test = tests/sample-test texi = doc/$(PACKAGE).texi # Make sure that the copyright date in $(v_etc_file) is up to date. # Do the same for the $(sample-test) and the main doc/.texi file. sc_copyright_check: @require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' \ in_files=$(v_etc_file) \ halt='out of date copyright in $(v_etc_file); update it' \ $(_sc_search_regexp) @require='# Copyright \(C\) '$$(date +%Y)' Free' \ in_vc_files=$(sample-test) \ halt='out of date copyright in $(sample-test); update it' \ $(_sc_search_regexp) @require='Copyright @copyright\{\} .*'$$(date +%Y)' Free' \ in_vc_files=$(texi) \ halt='out of date copyright in $(texi); update it' \ $(_sc_search_regexp) # If tests/help-version exists and seems to be new enough, assume that its # use of init.sh and path_prepend_ is correct, and ensure that every other # use of init.sh is identical. # This is useful because help-version cross-checks prog --version # with $(VERSION), which verifies that its path_prepend_ invocation # sets PATH correctly. This is an inexpensive way to ensure that # the other init.sh-using tests also get it right. _hv_file ?= $(srcdir)/tests/help-version _hv_regex_weak ?= ^ *\. .*/init\.sh" # Fix syntax-highlighters " _hv_regex_strong ?= ^ *\. "\$${srcdir=\.}/init\.sh" sc_cross_check_PATH_usage_in_tests: @if test -f $(_hv_file); then \ grep -l 'VERSION mismatch' $(_hv_file) >/dev/null \ || { echo "$@: skipped: no such file: $(_hv_file)" 1>&2; \ exit 0; }; \ grep -lE '$(_hv_regex_strong)' $(_hv_file) >/dev/null \ || { echo "$@: $(_hv_file) lacks conforming use of init.sh" 1>&2; \ exit 1; }; \ good=$$(grep -E '$(_hv_regex_strong)' $(_hv_file)); \ grep -LFx "$$good" \ $$(grep -lE '$(_hv_regex_weak)' $$($(VC_LIST_EXCEPT))) \ | grep . && \ { echo "$(ME): the above files use path_prepend_ inconsistently" \ 1>&2; exit 1; } || :; \ fi # BRE regex of file contents to identify a test script. _test_script_regex ?= \ # In tests, use "compare expected actual", not the reverse. sc_prohibit_reversed_compare_failure: @prohibit='\ vc-diffs || : $(AM_V_at)if test -s vc-diffs; then \ cat vc-diffs; \ echo "Some files are locally modified:" 1>&2; \ exit 1; \ else \ rm vc-diffs; \ fi rel-files = $(DIST_ARCHIVES) gnulib_dir ?= $(srcdir)/gnulib gnulib-version = $$(cd $(gnulib_dir) && git describe) bootstrap-tools ?= autoconf,automake,gnulib # If it's not already specified, derive the GPG key ID from # the signed tag we've just applied to mark this release. gpg_key_ID ?= \ $$(cd $(srcdir) \ && git cat-file tag v$(VERSION) \ | gpgv --status-fd 1 --keyring /dev/null - - 2>/dev/null \ | awk '/^\[GNUPG:\] ERRSIG / {print $$3; exit}') translation_project_ ?= coordinator@translationproject.org # Make info-gnu the default only for a stable release. announcement_Cc_stable = $(translation_project_), $(PACKAGE_BUGREPORT) announcement_mail_headers_stable = \ To: info-gnu@gnu.org \ Cc: $(announcement_Cc_) \ Mail-Followup-To: $(PACKAGE_BUGREPORT) announcement_Cc_alpha = $(translation_project_) announcement_mail_headers_alpha = \ To: $(PACKAGE_BUGREPORT) \ Cc: $(announcement_Cc_) announcement_mail_Cc_beta = $(announcement_mail_Cc_alpha) announcement_mail_headers_beta = $(announcement_mail_headers_alpha) announcement_mail_Cc_ ?= $(announcement_mail_Cc_$(release-type)) announcement_mail_headers_ ?= $(announcement_mail_headers_$(release-type)) announcement: NEWS ChangeLog $(rel-files) # Not $(AM_V_GEN) since the output of this command serves as # announcement message: it would start with " GEN announcement". $(AM_V_at)$(srcdir)/$(_build-aux)/announce-gen \ --mail-headers='$(announcement_mail_headers_)' \ --release-type=$(release-type) \ --package=$(PACKAGE) \ --prev=$(PREV_VERSION) \ --curr=$(VERSION) \ --gpg-key-id=$(gpg_key_ID) \ --srcdir=$(srcdir) \ --news=$(srcdir)/NEWS \ --bootstrap-tools=$(bootstrap-tools) \ $$(case ,$(bootstrap-tools), in (*,gnulib,*) \ echo --gnulib-version=$(gnulib-version);; esac) \ --no-print-checksums \ $(addprefix --url-dir=, $(url_dir_list)) .PHONY: release-commit release-commit: $(AM_V_GEN)cd $(srcdir) \ && $(_build-aux)/do-release-commit-and-tag \ -C $(abs_builddir) $(RELEASE) ## ---------------- ## ## Updating files. ## ## ---------------- ## ftp-gnu = ftp://ftp.gnu.org/gnu www-gnu = http://www.gnu.org upload_dest_dir_ ?= $(PACKAGE) upload_command = \ $(srcdir)/$(_build-aux)/gnupload $(GNUPLOADFLAGS) \ --to $(gnu_rel_host):$(upload_dest_dir_) \ $(rel-files) emit_upload_commands: @echo ===================================== @echo ===================================== @echo '$(upload_command)' @echo '# send the ~/announce-$(my_distdir) e-mail' @echo ===================================== @echo ===================================== .PHONY: upload upload: $(AM_V_GEN)$(upload_command) define emit-commit-log printf '%s\n' 'maint: post-release administrivia' '' \ '* NEWS: Add header line for next release.' \ '* .prev-version: Record previous version.' \ '* cfg.mk (old_NEWS_hash): Auto-update.' endef .PHONY: no-submodule-changes no-submodule-changes: $(AM_V_GEN)if test -d $(srcdir)/.git \ && git --version >/dev/null 2>&1; then \ diff=$$(cd $(srcdir) && git submodule -q foreach \ git diff-index --name-only HEAD) \ || exit 1; \ case $$diff in '') ;; \ *) echo '$(ME): submodule files are locally modified:'; \ echo "$$diff"; exit 1;; esac; \ else \ : ; \ fi submodule-checks ?= no-submodule-changes public-submodule-commit # Ensure that each sub-module commit we're using is public. # Without this, it is too easy to tag and release code that # cannot be built from a fresh clone. .PHONY: public-submodule-commit public-submodule-commit: $(AM_V_GEN)if test -d $(srcdir)/.git \ && git --version >/dev/null 2>&1; then \ cd $(srcdir) && \ git submodule --quiet foreach \ test '"$$(git rev-parse "$$sha1")"' \ = '"$$(git merge-base origin "$$sha1")"' \ || { echo '$(ME): found non-public submodule commit' >&2; \ exit 1; }; \ else \ : ; \ fi # This rule has a high enough utility/cost ratio that it should be a # dependent of "check" by default. However, some of us do occasionally # commit a temporary change that deliberately points to a non-public # submodule commit, and want to be able to use rules like "make check". # In that case, run e.g., "make check gl_public_submodule_commit=" # to disable this test. gl_public_submodule_commit ?= public-submodule-commit check: $(gl_public_submodule_commit) .PHONY: alpha beta stable release ALL_RECURSIVE_TARGETS += alpha beta stable alpha beta stable: $(local-check) writable-files $(submodule-checks) $(AM_V_GEN)test $@ = stable \ && { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \ || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\ || : $(AM_V_at)$(MAKE) vc-diff-check $(AM_V_at)$(MAKE) news-check $(AM_V_at)$(MAKE) distcheck $(AM_V_at)$(MAKE) dist $(AM_V_at)$(MAKE) $(release-prep-hook) RELEASE_TYPE=$@ $(AM_V_at)$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@ release: $(AM_V_GEN)$(MAKE) $(release-type) # Override this in cfg.mk if you follow different procedures. release-prep-hook ?= release-prep gl_noteworthy_news_ = * Noteworthy changes in release ?.? (????-??-??) [?] .PHONY: release-prep release-prep: $(AM_V_GEN)$(MAKE) --no-print-directory -s announcement \ > ~/announce-$(my_distdir) $(AM_V_at)if test -d $(release_archive_dir); then \ ln $(rel-files) $(release_archive_dir); \ chmod a-w $(rel-files); \ fi $(AM_V_at)echo $(VERSION) > $(prev_version_file) $(AM_V_at)$(MAKE) update-NEWS-hash $(AM_V_at)perl -pi \ -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' \ $(srcdir)/NEWS $(AM_V_at)msg=$$($(emit-commit-log)) || exit 1; \ cd $(srcdir) && $(VC) commit -m "$$msg" -a # Override this with e.g., -s $(srcdir)/some_other_name.texi # if the default $(PACKAGE)-derived name doesn't apply. gendocs_options_ ?= .PHONY: web-manual web-manual: $(AM_V_GEN)test -z "$(manual_title)" \ && { echo define manual_title in cfg.mk 1>&2; exit 1; } || : $(AM_V_at)cd '$(srcdir)/doc'; \ $(SHELL) ../$(_build-aux)/gendocs.sh $(gendocs_options_) \ -o '$(abs_builddir)/doc/manual' \ --email $(PACKAGE_BUGREPORT) $(PACKAGE) \ "$(PACKAGE_NAME) - $(manual_title)" $(AM_V_at)echo " *** Upload the doc/manual directory to web-cvs." .PHONY: web-manual-update web-manual-update: $(AM_V_GEN)cd $(srcdir) \ && $(_build-aux)/gnu-web-doc-update -C $(abs_builddir) # Code Coverage init-coverage: $(MAKE) $(AM_MAKEFLAGS) clean lcov --directory . --zerocounters COVERAGE_CCOPTS ?= "-g --coverage" COVERAGE_OUT ?= doc/coverage build-coverage: $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) check mkdir -p $(COVERAGE_OUT) lcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \ --capture gen-coverage: genhtml --output-directory $(COVERAGE_OUT) \ $(COVERAGE_OUT)/$(PACKAGE).info \ --highlight --frames --legend \ --title "$(PACKAGE_NAME)" coverage: init-coverage build-coverage gen-coverage # Some projects carry local adjustments for gnulib modules via patches in # a gnulib patch directory whose default name is gl/ (defined in bootstrap # via local_gl_dir=gl). Those patches become stale as the originals evolve # in gnulib. Use this rule to refresh any stale patches. It applies each # patch to the original in $(gnulib_dir) and uses the temporary result to # generate a fuzz-free .diff file. If you customize the name of your local # gnulib patch directory via bootstrap.conf, this rule detects that name. # Run this from a non-VPATH (i.e., srcdir) build directory. .PHONY: refresh-gnulib-patches refresh-gnulib-patches: gl=gl; \ if test -f bootstrap.conf; then \ t=$$(perl -lne '/^\s*local_gl_dir=(\S+)/ and $$d=$$1;' \ -e 'END{defined $$d and print $$d}' bootstrap.conf); \ test -n "$$t" && gl=$$t; \ fi; \ for diff in $$(cd $$gl; git ls-files | grep '\.diff$$'); do \ b=$$(printf %s "$$diff"|sed 's/\.diff$$//'); \ VERSION_CONTROL=none \ patch "$(gnulib_dir)/$$b" "$$gl/$$diff" || exit 1; \ ( cd $(gnulib_dir) || exit 1; \ git diff "$$b" > "../$$gl/$$diff"; \ git checkout $$b ) || exit 1; \ done # Update gettext files. PACKAGE ?= $(shell basename $(PWD)) PO_DOMAIN ?= $(PACKAGE) POURL = http://translationproject.org/latest/$(PO_DOMAIN)/ PODIR ?= po refresh-po: rm -f $(PODIR)/*.po && \ echo "$(ME): getting translations into po (please ignore the robots.txt ERROR 404)..." && \ wget --no-verbose --directory-prefix $(PODIR) --no-directories --recursive --level 1 --accept .po --accept .po.1 $(POURL) && \ echo 'en@boldquot' > $(PODIR)/LINGUAS && \ echo 'en@quot' >> $(PODIR)/LINGUAS && \ ls $(PODIR)/*.po | sed 's/\.po//;s,$(PODIR)/,,' | sort >> $(PODIR)/LINGUAS # Running indent once is not idempotent, but running it twice is. INDENT_SOURCES ?= $(C_SOURCES) .PHONY: indent indent: indent $(INDENT_SOURCES) indent $(INDENT_SOURCES) # If you want to set UPDATE_COPYRIGHT_* environment variables, # put the assignments in this variable. update-copyright-env ?= # Run this rule once per year (usually early in January) # to update all FSF copyright year lists in your project. # If you have an additional project-specific rule, # add it in cfg.mk along with a line 'update-copyright: prereq'. # By default, exclude all variants of COPYING; you can also # add exemptions (such as ChangeLog..* for rotated change logs) # in the file .x-update-copyright. .PHONY: update-copyright update-copyright: $(AM_V_GEN)grep -l -w Copyright \ $$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \ | $(update-copyright-env) xargs $(srcdir)/$(_build-aux)/$@ # This tight_scope test is skipped with a warning if $(_gl_TS_headers) is not # overridden and $(_gl_TS_dir)/Makefile.am does not mention noinst_HEADERS. # NOTE: to override any _gl_TS_* default value, you must # define the variable(s) using "export" in cfg.mk. _gl_TS_dir ?= src ALL_RECURSIVE_TARGETS += sc_tight_scope sc_tight_scope: tight-scope.mk @fail=0; \ if ! grep '^ *export _gl_TS_headers *=' $(srcdir)/cfg.mk \ > /dev/null \ && ! grep -w noinst_HEADERS $(srcdir)/$(_gl_TS_dir)/Makefile.am \ > /dev/null 2>&1; then \ echo '$(ME): skipping $@'; \ else \ $(MAKE) -s -C $(_gl_TS_dir) \ -f Makefile \ -f $(abs_top_srcdir)/cfg.mk \ -f $(abs_top_builddir)/$< \ _gl_tight_scope \ || fail=1; \ fi; \ rm -f $<; \ exit $$fail tight-scope.mk: $(ME) @rm -f $@ $@-t @perl -ne '/^# TS-start/.../^# TS-end/ and print' $(srcdir)/$(ME) > $@-t @chmod a=r $@-t && mv $@-t $@ ifeq (a,b) # TS-start # Most functions should have static scope. # Any that don't must be marked with 'extern', but 'main' # and 'usage' are exceptions: they're always extern, but # do not need to be marked. Symbols matching '__.*' are # reserved by the compiler, so are automatically excluded below. _gl_TS_unmarked_extern_functions ?= main usage _gl_TS_function_match ?= /^(?:$(_gl_TS_extern)) +.*?(\S+) *\(/ # If your project uses a macro like "XTERN", then put # the following in cfg.mk to override this default: # export _gl_TS_extern = extern|XTERN _gl_TS_extern ?= extern # The second nm|grep checks for file-scope variables with 'extern' scope. # Without gnulib's progname module, you might put program_name here. # Symbols matching '__.*' are reserved by the compiler, # so are automatically excluded below. _gl_TS_unmarked_extern_vars ?= # NOTE: the _match variables are perl expressions -- not mere regular # expressions -- so that you can extend them to match other patterns # and easily extract matched variable names. # For example, if your project declares some global variables via # a macro like this: GLOBAL(type, var_name, initializer), then you # can override this definition to automatically extract those names: # export _gl_TS_var_match = \ # /^(?:$(_gl_TS_extern)) .*?\**(\w+)(\[.*?\])?;/ || /\bGLOBAL\(.*?,\s*(.*?),/ _gl_TS_var_match ?= /^(?:$(_gl_TS_extern)) .*?(\w+)(\[.*?\])?;/ # The names of object files in (or relative to) $(_gl_TS_dir). _gl_TS_obj_files ?= *.$(OBJEXT) # Files in which to search for the one-line style extern declarations. # $(_gl_TS_dir)-relative. _gl_TS_headers ?= $(noinst_HEADERS) _gl_TS_other_headers ?= *.h .PHONY: _gl_tight_scope _gl_tight_scope: $(bin_PROGRAMS) t=exceptions-$$$$; \ trap 's=$$?; rm -f $$t; exit $$s' 0; \ for sig in 1 2 3 13 15; do \ eval "trap 'v=`expr $$sig + 128`; (exit $$v); exit $$v' $$sig"; \ done; \ src=`for f in $(SOURCES); do \ test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ hdr=`for f in $(_gl_TS_headers); do \ test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_functions); \ grep -h -A1 '^extern .*[^;]$$' $$src \ | grep -vE '^(extern |--)' | sed 's/ .*//'; \ perl -lne \ '$(_gl_TS_function_match) and print "^$$1\$$"' $$hdr; \ ) | sort -u > $$t; \ nm -e $(_gl_TS_obj_files) | sed -n 's/.* T //p'|grep -Ev -f $$t \ && { echo the above functions should have static scope >&2; \ exit 1; } || : ; \ ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_vars); \ perl -lne '$(_gl_TS_var_match) and print "^$$1\$$"' \ $$hdr $(_gl_TS_other_headers) \ ) | sort -u > $$t; \ nm -e $(_gl_TS_obj_files) | sed -n 's/.* [BCDGRS] //p' \ | sort -u | grep -Ev -f $$t \ && { echo the above variables should have static scope >&2; \ exit 1; } || : # TS-end endif shishi-1.0.2/configure.ac0000644000000000000000000003275312126767235012203 00000000000000# Process this file with autoconf to produce a configure script. # Copyright (C) 2002-2013 Simon Josefsson. # # This file is part of Shishi. # # Shishi 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. # # Shishi 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 Shishi; if not, see http://www.gnu.org/licenses or write # to the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. AC_PREREQ(2.61) AC_INIT([GNU Shishi], [1.0.2], [bug-shishi@gnu.org]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS(config.h) AM_INIT_AUTOMAKE([1.11 -Wall -Wno-override]) AM_SILENT_RULES([yes]) # Library code modified: REVISION++ # Interfaces changed/added/removed: CURRENT++ REVISION=0 # Interfaces added: AGE++ # Interfaces removed: AGE=0 AC_SUBST(LT_CURRENT, 1) AC_SUBST(LT_REVISION, 2) AC_SUBST(LT_AGE, 1) # Checks for header files. AC_PROG_CC gl_EARLY gl2_EARLY gl3_EARLY AC_HEADER_STDC AC_CHECK_HEADERS(termios.h pwd.h syslog.h arpa/nameser.h netinet/in6.h) AC_CHECK_HEADERS(resolv.h, , , [#include #include #ifdef HAVE_ARPA_NAMESER_H # include #endif ]) # Used when creating libshishi-XX.def. SOVERSION=`expr ${LT_CURRENT} - ${LT_AGE}` AC_SUBST(SOVERSION) # Checks for programs. m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL AM_MISSING_PROG(PERL, perl, $missing_dir) AM_MISSING_PROG(HELP2MAN, help2man, $missing_dir) AM_MISSING_PROG(ASN1PARSER, asn1Parser, $missing_dir) AM_MISSING_PROG(GENGETOPT, gengetopt, $missing_dir) AM_MISSING_PROG(DIA, dia, $missing_dir) # Internationalization. AM_GNU_GETTEXT([external], [need-ngettext]) AM_GNU_GETTEXT_VERSION([0.18.1]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_UID_T AC_TYPE_SIGNAL AC_CHECK_DECLS(h_errno) # For gnulib stuff in gl/. with_libgcrypt=yes AC_DEFINE([OK_TO_USE_1S_CLOCK], 1, [Define to 1 to make gettime work.]) gl_INIT gl2_INIT gl3_INIT if test "$ac_cv_libgcrypt" != yes; then AC_MSG_ERROR([Cannot find libgcrypt]) fi # Checks for library functions. AC_CHECK_FUNCS(signal select ngettext gethostbyname getpwnam getuid res_query) AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(gethostbyname, nsl) # BSD systems deliver res_query in libc. # Most of them do not even offer libresolv. if test "$ac_cv_func_res_query" != yes; then AC_LIB_HAVE_LINKFLAGS(resolv,, [ #include #include #include ], [res_query (0, 0, 0, 0, 0);]) # Check again, with newly acquired knowledge. if test "$ac_cv_libresolv" = yes; then AC_DEFINE([HAVE_RES_QUERY], 1, [Define to 1 if you have the res_query function.]) fi fi dnl Declare LIBRESOLV and LTLIBRESOLV in all cases. AC_SUBST(LIBRESOLV) AC_SUBST(LTLIBRESOLV) # Shishid needs a logging mechanism, and right now there is no # alternative to syslog. A 'fprintf(stderr,...)' mechanism may be # useful. AC_SEARCH_LIBS(syslog, syslog) AM_CONDITIONAL(ENABLE_SHISHID, test "$ac_cv_search_syslog" != "no") # Check for PAM AC_ARG_ENABLE(pam, AC_HELP_STRING([--disable-pam], [Don't use PAM even if available])) if test "$enable_pam" != "no"; then AC_CHECK_HEADERS(security/pam_appl.h) AC_CHECK_HEADERS(security/pam_modules.h, [], [], [ #if HAVE_SECURITY_PAM_APPL_H #include #endif ]) AC_CHECK_HEADERS(security/_pam_macros.h) enable_pam=$ac_cv_header_security_pam_modules_h fi if test "$enable_pam" != "no"; then PAM_SHISHI=pam_shishi else AC_MSG_WARN([[The Shishi PAM module will not be built.]]) fi AC_SUBST(PAM_SHISHI) AC_MSG_CHECKING([if PAM should be used]) AC_MSG_RESULT($enable_pam) AC_SUBST(PAMDIR, "\$(exec_prefix)/lib/security") AC_ARG_WITH(pam-dir, AC_HELP_STRING([--with-pam-dir=DIR], [Where to install PAM module [[PREFIX/lib/security]]]), [case "${withval}" in /*) PAMDIR="${withval}";; ./*|../*) AC_MSG_ERROR(Bad value for --with-pam-dir);; *) PAMDIR="\$(exec_prefix)/lib/${withval}";; esac]) AC_MSG_NOTICE([PAM installation path $PAMDIR]) # Check for IPv6 AC_ARG_ENABLE(ipv6, AC_HELP_STRING([--disable-ipv6], [Don't use IPv6 even if available])) if test "$enable_ipv6" != "no"; then gl_SOCKET_FAMILIES enable_ipv6=$gl_cv_socket_ipv6 fi if test "$enable_ipv6" != "no"; then AC_DEFINE([WITH_IPV6], 1, [Define to 1 if you want IPv6.]) else AC_MSG_WARN([[IPv6 support is disabled.]]) fi AC_MSG_CHECKING([if IPv6 should be used]) AC_MSG_RESULT($enable_ipv6) # Check for idn AC_ARG_WITH(stringprep, AC_HELP_STRING([--without-stringprep], [don't use libidn for string processing even if available]), stringprep=$withval, stringprep=yes) if test "$stringprep" != "no"; then AC_LIB_HAVE_LINKFLAGS(idn,, [#include ], [stringprep_check_version (0);]) fi if test "$ac_cv_libidn" != yes; then stringprep=no AC_MSG_WARN([Libidn not found. String process disabled.]) fi AC_MSG_CHECKING([if String processing support via Libidn should be built]) AC_MSG_RESULT($stringprep) # Check for libtasn1 AC_LIB_HAVE_LINKFLAGS(tasn1,, [#include ], [asn1_strerror (0);]) if test "$ac_cv_libtasn1" != "yes"; then AC_MSG_ERROR([Libtasn1 not found.]) fi # Check for gnutls. AC_ARG_ENABLE(starttls, AC_HELP_STRING([--disable-starttls], [disable non-standard STARTTLS]), starttls=$enableval, starttls=yes) if test "$starttls" != "no"; then AC_LIB_HAVE_LINKFLAGS(gnutls,, [#include ], [gnutls_check_version (0);]) if test "$ac_cv_libgnutls" != yes; then starttls=no AC_MSG_WARN([GnuTLS not found. STARTTLS disabled.]) else starttls=yes fi fi AC_MSG_CHECKING([if non-standard STARTTLS support should be enabled]) AC_MSG_RESULT($starttls) if test "$starttls" != "no"; then AC_DEFINE([USE_STARTTLS], 1, [Define to 1 if you want STARTTLS.]) fi AM_CONDITIONAL(STARTTLS, test "$starttls" != "no") # Check for gtk-doc. GTK_DOC_CHECK(1.1) # Let people enable/disable various encryption/checksum types. AC_ARG_ENABLE(des, AC_HELP_STRING([--disable-des], [disable DES related encryption/checksum types]), enable_des=$enableval, enable_des=yes) AM_CONDITIONAL(DES, test "$enable_des" != "no") if test "$enable_des" != "no"; then AC_DEFINE([WITH_DES], 1, [Define to 1 if you want DES {e,cksum}types.]) fi AC_MSG_CHECKING([if DES related encryption/checksum types should be used]) AC_MSG_RESULT($enable_des) AC_ARG_ENABLE(3des, AC_HELP_STRING([--disable-3des], [disable 3DES encryption/checksum type]), enable_3des=$enableval, enable_3des=yes) AM_CONDITIONAL(DES3, test "$enable_3des" != "no") if test "$enable_3des" != "no"; then AC_DEFINE([WITH_3DES], 1, [Define to 1 if you want 3DES {e,cksum}type.]) fi AC_MSG_CHECKING([if 3DES encryption/checksum type should be used]) AC_MSG_RESULT($enable_3des) AC_ARG_ENABLE(aes, AC_HELP_STRING([--disable-aes], [disable AES encryption/checksum types]), enable_aes=$enableval, enable_aes=yes) AM_CONDITIONAL(AES, test "$enable_aes" != "no") if test "$enable_aes" != "no"; then AC_DEFINE([WITH_AES], 1, [Define to 1 if you want AES {e,cksum}types.]) fi AC_MSG_CHECKING([if AES encryption/checksum types should be used]) AC_MSG_RESULT($enable_aes) AC_ARG_ENABLE(md, AC_HELP_STRING([--disable-md], [disable unkeyed MD4/MD5 checksum types]), enable_md=$enableval, enable_md=yes) AM_CONDITIONAL(MD, test "$enable_md" != "no") if test "$enable_md" != "no"; then AC_DEFINE([WITH_MD], 1, [Define to 1 if you want MD cksumtypes.]) fi AC_MSG_CHECKING([if unkeyed MD checksum types should be used]) AC_MSG_RESULT($enable_md) AC_ARG_ENABLE(null, AC_HELP_STRING([--disable-null], [disable dummy NULL encryption/checksum type]), enable_null=$enableval, enable_null=yes) AM_CONDITIONAL(NULL, test "$enable_null" != "no") if test "$enable_null" != "no"; then AC_DEFINE([WITH_NULL], 1, [Define to 1 if you want NULL {e,cksum}type.]) fi AC_MSG_CHECKING([if dummy NULL encryption/checksum type should be used]) AC_MSG_RESULT($enable_null) AC_ARG_ENABLE(arcfour, AC_HELP_STRING([--disable-arcfour], [disable ARCFOUR encryption/checksum type]), enable_arcfour=$enableval, enable_arcfour=yes) AM_CONDITIONAL(ARCFOUR, test "$enable_arcfour" != "no") if test "$enable_arcfour" != "no"; then AC_DEFINE([WITH_ARCFOUR], 1, [Define to 1 if you want ARCFOUR {e,cksum}type.]) fi AC_MSG_CHECKING([if ARCFOUR encryption/checksum type should be used]) AC_MSG_RESULT($enable_arcfour) AC_SUBST(CONFDIR, "\$(sysconfdir)/\$(PACKAGE)") AC_ARG_WITH(conf-dir, AC_HELP_STRING([--with-conf-dir=DIR], [store configuration in DIR [[PREFIX/etc/shishi]]]), [case "${withval}" in /*) CONFDIR="${withval}";; ./*|../*) AC_MSG_ERROR(Bad value for --with-conf-dir);; *) CONFDIR="\$(sysconfdir)/${withval}";; esac]) AC_MSG_NOTICE([configuration files will be stored in $CONFDIR]) AC_SUBST(SKELDIR, "\$(sysconfdir)/\$(PACKAGE)") AC_ARG_WITH(skel-dir, AC_HELP_STRING([--with-skel-dir=DIR], [store template cfg in DIR [[PREFIX/etc/shishi]]]), [case "${withval}" in /*) SKELDIR="${withval}";; ./*|../*) AC_MSG_ERROR(Bad value for --with-skel-dir);; *) SKELDIR="\$(sysconfdir)/${withval}";; esac]) AC_MSG_NOTICE([user template configuration file in $SKELDIR]) AC_SUBST(KEYDIR, "\$(sysconfdir)/\$(PACKAGE)") AC_ARG_WITH(key-dir, AC_HELP_STRING([--with-key-dir=DIR], [store host keys in DIR [[PREFIX/etc/shishi]]]), [case "${withval}" in /*) KEYDIR="${withval}";; ./*|../*) AC_MSG_ERROR(Bad value for --with-key-dir);; *) KEYDIR="\$(sysconfdir)/${withval}";; esac]) AC_MSG_NOTICE([host keys will be stored in $KEYDIR]) AC_SUBST(DBDIR, "\$(localstatedir)/\$(PACKAGE)") AC_ARG_WITH(db-dir, AC_HELP_STRING([--with-db-dir=DIR], [Shisa database in DIR [[PREFIX/var/shishi]])]), [case "${withval}" in /*) DBDIR="${withval}";; ./*|../*) AC_MSG_ERROR(Bad value for --with-db-dir);; *) DBDIR="\$(localstatedir)/${withval}";; esac]) AC_MSG_NOTICE([user database root path $DBDIR]) AC_DEFINE([xalloc_die], [shishi_xalloc_die], [Fix namespace of xalloc_die.]) sj_UPDATE_HEADER_VERSION([$srcdir/lib/shishi.h]) AC_ARG_ENABLE([gcc-warnings], [AS_HELP_STRING([--enable-gcc-warnings], [turn on lots of GCC warnings (for developers)])], [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;; esac gl_gcc_warnings=$enableval], [gl_gcc_warnings=no] ) if test "$gl_gcc_warnings" = yes; then gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) nw="$nw -Wsystem-headers" # Ignore errors in system headers nw="$nw -Wc++-compat" # We don't care much about C++ compilers nw="$nw -Wsign-conversion" # Too many warnings for now nw="$nw -Wconversion" # Too many warnings for now nw="$nw -Wpadded" # Our structs are not padded nw="$nw -Wunreachable-code" # Too many false positives nw="$nw -Wlogical-op" # Too many false positives nw="$nw -Wtraditional" # Warns on #elif which we use often nw="$nw -Wtraditional-conversion" # Too many warnings for now nw="$nw -Wcast-qual" # Too many warnings for now nw="$nw -Wmissing-format-attribute" # Too many warnings for now nw="$nw -Wunsafe-loop-optimizations" # Too many warnings for now nw="$nw -Wundef" # Problems in gnulib files nw="$nw -Wstrict-overflow" # Don't know how to avoid nw="$nw -Waggregate-return" # For src/resume.c:resume_db_fetch... nw="$nw -Wsuggest-attribute=pure" # Is it worth using attributes? nw="$nw -Wsuggest-attribute=const" # Is it worth using attributes? gl_MANYWARN_ALL_GCC([ws]) gl_MANYWARN_COMPLEMENT(ws, [$ws], [$nw]) for w in $ws; do gl_WARN_ADD([$w]) done gl_WARN_ADD([-Wno-format]) # Too many warnings for now gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now gl_WARN_ADD([-Wno-stack-protector]) # Some functions cannot be protected gl_WARN_ADD([-Wno-unused-result]) gl_WARN_ADD([-fdiagnostics-show-option]) fi AC_CONFIG_FILES([ Makefile db/Makefile db/gl/Makefile doc/Makefile doc/cyclo/Makefile doc/reference/Makefile doc/reference/version.xml examples/Makefile extra/Makefile extra/pam_shishi/Makefile extra/rsh-redone/Makefile gl/Makefile lib/Makefile po/Makefile.in shisa.conf shishi.conf shishi.pc shishi.skel src/Makefile src/gl/Makefile tests/Makefile ]) AC_OUTPUT AC_MSG_NOTICE([summary of build options: version: ${VERSION} shared $LT_CURRENT:$LT_REVISION:$LT_AGE Host type: ${host} Install prefix: ${prefix} Compiler: ${CC} Warning flags: errors: ${WERROR_CFLAGS} warnings: ${WARN_CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} Valgrind: ${VALGRIND} Version script: $have_ld_version_script ]) shishi-1.0.2/gl/0000755000000000000000000000000012126773313010357 500000000000000shishi-1.0.2/gl/stdarg.in.h0000644000000000000000000000216212126660053012336 00000000000000/* Substitute for and wrapper around . Copyright (C) 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_STDARG_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDARG_H@ #ifndef _@GUARD_PREFIX@_STDARG_H #define _@GUARD_PREFIX@_STDARG_H #ifndef va_copy # define va_copy(a,b) ((a) = (b)) #endif #endif /* _@GUARD_PREFIX@_STDARG_H */ #endif /* _@GUARD_PREFIX@_STDARG_H */ shishi-1.0.2/gl/vasprintf.c0000644000000000000000000000247212126660054012461 00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #ifdef IN_LIBASPRINTF # include "vasprintf.h" #else # include #endif #include #include #include #include "vasnprintf.h" int vasprintf (char **resultp, const char *format, va_list args) { size_t length; char *result = vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; if (length > INT_MAX) { free (result); errno = EOVERFLOW; return -1; } *resultp = result; /* Return the number of resulting bytes, excluding the trailing NUL. */ return length; } shishi-1.0.2/gl/getpass.h0000644000000000000000000000211112126660051012103 00000000000000/* getpass.h -- Read a password of arbitrary length from /dev/tty or stdin. Copyright (C) 2004, 2009-2013 Free Software Foundation, Inc. Contributed by Simon Josefsson , 2004. 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, 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 . */ #ifndef GETPASS_H # define GETPASS_H /* Get getpass declaration, if available. */ # include # if !HAVE_DECL_GETPASS /* Read a password of arbitrary length from /dev/tty or stdin. */ char *getpass (const char *prompt); # endif #endif /* GETPASS_H */ shishi-1.0.2/gl/memchr.valgrind0000664000000000000000000000065212015626624013306 00000000000000# Suppress a valgrind message about use of uninitialized memory in memchr(). # POSIX states that when the character is found, memchr must not read extra # bytes in an overestimated length (for example, where memchr is used to # implement strnlen). However, we use a safe word read to provide a speedup. { memchr-value4 Memcheck:Value4 fun:rpl_memchr } { memchr-value8 Memcheck:Value8 fun:rpl_memchr } shishi-1.0.2/gl/setenv.c0000644000000000000000000002502612126660053011750 00000000000000/* Copyright (C) 1992, 1995-2003, 2005-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #if !_LIBC /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the name == NULL test below. */ # define _GL_ARG_NONNULL(params) # define _GL_USE_STDLIB_ALLOC 1 # include #endif #include /* Specification. */ #include #include #ifndef __set_errno # define __set_errno(ev) ((errno) = (ev)) #endif #include #if _LIBC || HAVE_UNISTD_H # include #endif #if !_LIBC # include "malloca.h" #endif #if _LIBC || !HAVE_SETENV #if !_LIBC # define __environ environ #endif #if _LIBC /* This lock protects against simultaneous modifications of 'environ'. */ # include __libc_lock_define_initialized (static, envlock) # define LOCK __libc_lock_lock (envlock) # define UNLOCK __libc_lock_unlock (envlock) #else # define LOCK # define UNLOCK #endif /* In the GNU C library we must keep the namespace clean. */ #ifdef _LIBC # define setenv __setenv # define clearenv __clearenv # define tfind __tfind # define tsearch __tsearch #endif /* In the GNU C library implementation we try to be more clever and allow arbitrarily many changes of the environment given that the used values are from a small set. Outside glibc this will eat up all memory after a while. */ #if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \ && defined __GNUC__) # define USE_TSEARCH 1 # include typedef int (*compar_fn_t) (const void *, const void *); /* This is a pointer to the root of the search tree with the known values. */ static void *known_values; # define KNOWN_VALUE(Str) \ ({ \ void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \ value != NULL ? *(char **) value : NULL; \ }) # define STORE_VALUE(Str) \ tsearch (Str, &known_values, (compar_fn_t) strcmp) #else # undef USE_TSEARCH # define KNOWN_VALUE(Str) NULL # define STORE_VALUE(Str) do { } while (0) #endif /* If this variable is not a null pointer we allocated the current environment. */ static char **last_environ; /* This function is used by 'setenv' and 'putenv'. The difference between the two functions is that for the former must create a new string which is then placed in the environment, while the argument of 'putenv' must be used directly. This is all complicated by the fact that we try to reuse values once generated for a 'setenv' call since we can never free the strings. */ int __add_to_environ (const char *name, const char *value, const char *combined, int replace) { char **ep; size_t size; const size_t namelen = strlen (name); const size_t vallen = value != NULL ? strlen (value) + 1 : 0; LOCK; /* We have to get the pointer now that we have the lock and not earlier since another thread might have created a new environment. */ ep = __environ; size = 0; if (ep != NULL) { for (; *ep != NULL; ++ep) if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') break; else ++size; } if (ep == NULL || *ep == NULL) { char **new_environ; #ifdef USE_TSEARCH char *new_value; #endif /* We allocated this space; we can extend it. */ new_environ = (char **) (last_environ == NULL ? malloc ((size + 2) * sizeof (char *)) : realloc (last_environ, (size + 2) * sizeof (char *))); if (new_environ == NULL) { /* It's easier to set errno to ENOMEM than to rely on the 'malloc-posix' and 'realloc-posix' gnulib modules. */ __set_errno (ENOMEM); UNLOCK; return -1; } /* If the whole entry is given add it. */ if (combined != NULL) /* We must not add the string to the search tree since it belongs to the user. */ new_environ[size] = (char *) combined; else { /* See whether the value is already known. */ #ifdef USE_TSEARCH # ifdef _LIBC new_value = (char *) alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else new_value = (char *) malloca (namelen + 1 + vallen); if (new_value == NULL) { __set_errno (ENOMEM); UNLOCK; return -1; } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); # endif new_environ[size] = KNOWN_VALUE (new_value); if (new_environ[size] == NULL) #endif { new_environ[size] = (char *) malloc (namelen + 1 + vallen); if (new_environ[size] == NULL) { #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif __set_errno (ENOMEM); UNLOCK; return -1; } #ifdef USE_TSEARCH memcpy (new_environ[size], new_value, namelen + 1 + vallen); #else memcpy (new_environ[size], name, namelen); new_environ[size][namelen] = '='; memcpy (&new_environ[size][namelen + 1], value, vallen); #endif /* And save the value now. We cannot do this when we remove the string since then we cannot decide whether it is a user string or not. */ STORE_VALUE (new_environ[size]); } #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } if (__environ != last_environ) memcpy ((char *) new_environ, (char *) __environ, size * sizeof (char *)); new_environ[size + 1] = NULL; last_environ = __environ = new_environ; } else if (replace) { char *np; /* Use the user string if given. */ if (combined != NULL) np = (char *) combined; else { #ifdef USE_TSEARCH char *new_value; # ifdef _LIBC new_value = alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else new_value = malloca (namelen + 1 + vallen); if (new_value == NULL) { __set_errno (ENOMEM); UNLOCK; return -1; } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); # endif np = KNOWN_VALUE (new_value); if (np == NULL) #endif { np = (char *) malloc (namelen + 1 + vallen); if (np == NULL) { #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif __set_errno (ENOMEM); UNLOCK; return -1; } #ifdef USE_TSEARCH memcpy (np, new_value, namelen + 1 + vallen); #else memcpy (np, name, namelen); np[namelen] = '='; memcpy (&np[namelen + 1], value, vallen); #endif /* And remember the value. */ STORE_VALUE (np); } #if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } *ep = np; } UNLOCK; return 0; } int setenv (const char *name, const char *value, int replace) { if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) { __set_errno (EINVAL); return -1; } return __add_to_environ (name, value, NULL, replace); } /* The 'clearenv' was planned to be added to POSIX.1 but probably never made it. Nevertheless the POSIX.9 standard (POSIX bindings for Fortran 77) requires this function. */ int clearenv (void) { LOCK; if (__environ == last_environ && __environ != NULL) { /* We allocated this environment so we can free it. */ free (__environ); last_environ = NULL; } /* Clear the environment pointer removes the whole environment. */ __environ = NULL; UNLOCK; return 0; } #ifdef _LIBC static void free_mem (void) { /* Remove all traces. */ clearenv (); /* Now remove the search tree. */ __tdestroy (known_values, free); known_values = NULL; } text_set_element (__libc_subfreeres, free_mem); # undef setenv # undef clearenv weak_alias (__setenv, setenv) weak_alias (__clearenv, clearenv) #endif #endif /* _LIBC || !HAVE_SETENV */ /* The rest of this file is called into use when replacing an existing but buggy setenv. Known bugs include failure to diagnose invalid name, and consuming a leading '=' from value. */ #if HAVE_SETENV # undef setenv # if !HAVE_DECL_SETENV extern int setenv (const char *, const char *, int); # endif # define STREQ(a, b) (strcmp (a, b) == 0) int rpl_setenv (const char *name, const char *value, int replace) { int result; if (!name || !*name || strchr (name, '=')) { errno = EINVAL; return -1; } /* Call the real setenv even if replace is 0, in case implementation has underlying data to update, such as when environ changes. */ result = setenv (name, value, replace); if (result == 0 && replace && *value == '=') { char *tmp = getenv (name); if (!STREQ (tmp, value)) { int saved_errno; size_t len = strlen (value); tmp = malloca (len + 2); /* Since leading '=' is eaten, double it up. */ *tmp = '='; memcpy (tmp + 1, value, len + 1); result = setenv (name, tmp, replace); saved_errno = errno; freea (tmp); errno = saved_errno; } } return result; } #endif /* HAVE_SETENV */ shishi-1.0.2/gl/des.c0000644000000000000000000006716612126660051011230 00000000000000/* des.c --- DES and Triple-DES encryption/decryption Algorithm * Copyright (C) 1998-1999, 2001-2007, 2009-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */ /* * For a description of triple encryption, see: * Bruce Schneier: Applied Cryptography. Second Edition. * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff. * This implementation is according to the definition of DES in FIPS * PUB 46-2 from December 1993. * * Written by Michael Roth , September 1998 */ /* * U S A G E * =========== * * For DES or Triple-DES encryption/decryption you must initialize a proper * encryption context with a key. * * A DES key is 64bit wide but only 56bits of the key are used. The remaining * bits are parity bits and they will _not_ checked in this implementation, but * simply ignored. * * For Triple-DES you could use either two 64bit keys or three 64bit keys. * The parity bits will _not_ checked, too. * * After initializing a context with a key you could use this context to * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode. * * DES Example * ----------- * unsigned char key[8]; * unsigned char plaintext[8]; * unsigned char ciphertext[8]; * unsigned char recoverd[8]; * gl_des_ctx context; * * // Fill 'key' and 'plaintext' with some data * .... * * // Set up the DES encryption context * gl_des_setkey(&context, key); * * // Encrypt the plaintext * des_ecb_encrypt(&context, plaintext, ciphertext); * * // To recover the original plaintext from ciphertext use: * des_ecb_decrypt(&context, ciphertext, recoverd); * * * Triple-DES Example * ------------------ * unsigned char key1[8]; * unsigned char key2[8]; * unsigned char key3[8]; * unsigned char plaintext[8]; * unsigned char ciphertext[8]; * unsigned char recoverd[8]; * gl_3des_ctx context; * * // If you would like to use two 64bit keys, fill 'key1' and'key2' * // then setup the encryption context: * gl_3des_set2keys(&context, key1, key2); * * // To use three 64bit keys with Triple-DES use: * gl_3des_set3keys(&context, key1, key2, key3); * * // Encrypting plaintext with Triple-DES * gl_3des_ecb_encrypt(&context, plaintext, ciphertext); * * // Decrypting ciphertext to recover the plaintext with Triple-DES * gl_3des_ecb_decrypt(&context, ciphertext, recoverd); */ #include #include "des.h" #include #include /* memcpy, memcmp */ /* * The s-box values are permuted according to the 'primitive function P' * and are rotated one bit to the left. */ static const uint32_t sbox1[64] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; static const uint32_t sbox2[64] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; static const uint32_t sbox3[64] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; static const uint32_t sbox4[64] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; static const uint32_t sbox5[64] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; static const uint32_t sbox6[64] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; static const uint32_t sbox7[64] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; static const uint32_t sbox8[64] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; /* * These two tables are part of the 'permuted choice 1' function. * In this implementation several speed improvements are done. */ static const uint32_t leftkey_swap[16] = { 0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010100, 0x01010101 }; static const uint32_t rightkey_swap[16] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; /* * Numbers of left shifts per round for encryption subkeys. To * calculate the decryption subkeys we just reverse the ordering of * the calculated encryption subkeys, so there is no need for a * decryption rotate tab. */ static const unsigned char encrypt_rotate_tab[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; /* * Table with weak DES keys sorted in ascending order. In DES there * are 64 known keys which are weak. They are weak because they * produce only one, two or four different subkeys in the subkey * scheduling process. The keys in this table have all their parity * bits cleared. */ static const unsigned char weak_keys[64][8] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*w */ {0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e}, {0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0}, {0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe}, {0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e}, /*sw */ {0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00}, {0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe}, {0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0}, {0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0}, /*sw */ {0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe}, {0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00}, {0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e}, {0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe}, /*sw */ {0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0}, {0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e}, {0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00}, {0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e}, {0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00}, /*sw */ {0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe}, {0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0}, {0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00}, {0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e}, /*w */ {0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0}, {0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe}, {0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe}, {0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0}, /*sw */ {0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e}, {0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00}, {0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0}, {0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe}, /*sw */ {0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00}, {0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e}, {0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0}, {0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe}, {0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00}, /*sw */ {0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e}, {0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe}, {0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0}, {0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e}, /*sw */ {0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00}, {0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00}, {0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e}, {0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0}, /*w */ {0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe}, {0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e}, {0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00}, {0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe}, /*sw */ {0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0}, {0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe}, {0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0}, {0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e}, {0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00}, /*sw */ {0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0}, {0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe}, {0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00}, {0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e}, /*sw */ {0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e}, {0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00}, {0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe}, {0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0}, /*sw */ {0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00}, {0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e}, {0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0}, {0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe} /*w */ }; bool gl_des_is_weak_key (const char * key) { char work[8]; int i, left, right, middle, cmp_result; /* clear parity bits */ for (i = 0; i < 8; ++i) work[i] = ((unsigned char)key[i]) & 0xfe; /* binary search in the weak key table */ left = 0; right = 63; while (left <= right) { middle = (left + right) / 2; if (!(cmp_result = memcmp (work, weak_keys[middle], 8))) return -1; if (cmp_result > 0) left = middle + 1; else right = middle - 1; } return 0; } /* * Macro to swap bits across two words. */ #define DO_PERMUTATION(a, temp, b, offset, mask) \ temp = ((a>>offset) ^ b) & mask; \ b ^= temp; \ a ^= temp<> 31); \ temp = (left ^ right) & 0xaaaaaaaa; \ right ^= temp; \ left ^= temp; \ left = (left << 1) | (left >> 31); /* * The 'inverse initial permutation'. */ #define FINAL_PERMUTATION(left, temp, right) \ left = (left << 31) | (left >> 1); \ temp = (left ^ right) & 0xaaaaaaaa; \ left ^= temp; \ right ^= temp; \ right = (right << 31) | (right >> 1); \ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) /* * A full DES round including 'expansion function', 'sbox substitution' * and 'primitive function P' but without swapping the left and right word. * Please note: The data in 'from' and 'to' is already rotated one bit to * the left, done in the initial permutation. */ #define DES_ROUND(from, to, work, subkey) \ work = from ^ *subkey++; \ to ^= sbox8[ work & 0x3f ]; \ to ^= sbox6[ (work>>8) & 0x3f ]; \ to ^= sbox4[ (work>>16) & 0x3f ]; \ to ^= sbox2[ (work>>24) & 0x3f ]; \ work = ((from << 28) | (from >> 4)) ^ *subkey++; \ to ^= sbox7[ work & 0x3f ]; \ to ^= sbox5[ (work>>8) & 0x3f ]; \ to ^= sbox3[ (work>>16) & 0x3f ]; \ to ^= sbox1[ (work>>24) & 0x3f ]; /* * Macros to convert 8 bytes from/to 32bit words. */ #define READ_64BIT_DATA(data, left, right) \ left = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; \ right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7]; #define WRITE_64BIT_DATA(data, left, right) \ data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \ data[2] = (left >> 8) &0xff; data[3] = left &0xff; \ data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \ data[6] = (right >> 8) &0xff; data[7] = right &0xff; /* * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for * 16 encryption rounds. * To calculate subkeys for decryption the caller * have to reorder the generated subkeys. * * rawkey: 8 Bytes of key data * subkey: Array of at least 32 uint32_ts. Will be filled * with calculated subkeys. * */ static void des_key_schedule (const char * _rawkey, uint32_t * subkey) { const unsigned char *rawkey = (const unsigned char *) _rawkey; uint32_t left, right, work; int round; READ_64BIT_DATA (rawkey, left, right) DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f) DO_PERMUTATION (right, work, left, 0, 0x10101010) left = ((leftkey_swap[(left >> 0) & 0xf] << 3) | (leftkey_swap[(left >> 8) & 0xf] << 2) | (leftkey_swap[(left >> 16) & 0xf] << 1) | (leftkey_swap[(left >> 24) & 0xf]) | (leftkey_swap[(left >> 5) & 0xf] << 7) | (leftkey_swap[(left >> 13) & 0xf] << 6) | (leftkey_swap[(left >> 21) & 0xf] << 5) | (leftkey_swap[(left >> 29) & 0xf] << 4)); left &= 0x0fffffff; right = ((rightkey_swap[(right >> 1) & 0xf] << 3) | (rightkey_swap[(right >> 9) & 0xf] << 2) | (rightkey_swap[(right >> 17) & 0xf] << 1) | (rightkey_swap[(right >> 25) & 0xf]) | (rightkey_swap[(right >> 4) & 0xf] << 7) | (rightkey_swap[(right >> 12) & 0xf] << 6) | (rightkey_swap[(right >> 20) & 0xf] << 5) | (rightkey_swap[(right >> 28) & 0xf] << 4)); right &= 0x0fffffff; for (round = 0; round < 16; ++round) { left = ((left << encrypt_rotate_tab[round]) | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; right = ((right << encrypt_rotate_tab[round]) | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; *subkey++ = (((left << 4) & 0x24000000) | ((left << 28) & 0x10000000) | ((left << 14) & 0x08000000) | ((left << 18) & 0x02080000) | ((left << 6) & 0x01000000) | ((left << 9) & 0x00200000) | ((left >> 1) & 0x00100000) | ((left << 10) & 0x00040000) | ((left << 2) & 0x00020000) | ((left >> 10) & 0x00010000) | ((right >> 13) & 0x00002000) | ((right >> 4) & 0x00001000) | ((right << 6) & 0x00000800) | ((right >> 1) & 0x00000400) | ((right >> 14) & 0x00000200) | (right & 0x00000100) | ((right >> 5) & 0x00000020) | ((right >> 10) & 0x00000010) | ((right >> 3) & 0x00000008) | ((right >> 18) & 0x00000004) | ((right >> 26) & 0x00000002) | ((right >> 24) & 0x00000001)); *subkey++ = (((left << 15) & 0x20000000) | ((left << 17) & 0x10000000) | ((left << 10) & 0x08000000) | ((left << 22) & 0x04000000) | ((left >> 2) & 0x02000000) | ((left << 1) & 0x01000000) | ((left << 16) & 0x00200000) | ((left << 11) & 0x00100000) | ((left << 3) & 0x00080000) | ((left >> 6) & 0x00040000) | ((left << 15) & 0x00020000) | ((left >> 4) & 0x00010000) | ((right >> 2) & 0x00002000) | ((right << 8) & 0x00001000) | ((right >> 14) & 0x00000808) | ((right >> 9) & 0x00000400) | ((right) & 0x00000200) | ((right << 7) & 0x00000100) | ((right >> 7) & 0x00000020) | ((right >> 3) & 0x00000011) | ((right << 2) & 0x00000004) | ((right >> 21) & 0x00000002)); } } void gl_des_setkey (gl_des_ctx *ctx, const char * key) { int i; des_key_schedule (key, ctx->encrypt_subkeys); for (i = 0; i < 32; i += 2) { ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i]; ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i]; } } bool gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen) { if (keylen != 8) return false; gl_des_setkey (ctx, key); return !gl_des_is_weak_key (key); } void gl_des_ecb_crypt (gl_des_ctx *ctx, const char * _from, char * _to, int mode) { const unsigned char *from = (const unsigned char *) _from; unsigned char *to = (unsigned char *) _to; uint32_t left, right, work; uint32_t *keys; keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; READ_64BIT_DATA (from, left, right) INITIAL_PERMUTATION (left, work, right) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) FINAL_PERMUTATION (right, work, left) WRITE_64BIT_DATA (to, right, left) } void gl_3des_set2keys (gl_3des_ctx *ctx, const char * key1, const char * key2) { int i; des_key_schedule (key1, ctx->encrypt_subkeys); des_key_schedule (key2, &(ctx->decrypt_subkeys[32])); for (i = 0; i < 32; i += 2) { ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i]; ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i]; ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i]; ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i]; ctx->encrypt_subkeys[i + 64] = ctx->encrypt_subkeys[i]; ctx->encrypt_subkeys[i + 65] = ctx->encrypt_subkeys[i + 1]; ctx->decrypt_subkeys[i + 64] = ctx->decrypt_subkeys[i]; ctx->decrypt_subkeys[i + 65] = ctx->decrypt_subkeys[i + 1]; } } void gl_3des_set3keys (gl_3des_ctx *ctx, const char * key1, const char * key2, const char * key3) { int i; des_key_schedule (key1, ctx->encrypt_subkeys); des_key_schedule (key2, &(ctx->decrypt_subkeys[32])); des_key_schedule (key3, &(ctx->encrypt_subkeys[64])); for (i = 0; i < 32; i += 2) { ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[94 - i]; ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[95 - i]; ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i]; ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i]; ctx->decrypt_subkeys[i + 64] = ctx->encrypt_subkeys[30 - i]; ctx->decrypt_subkeys[i + 65] = ctx->encrypt_subkeys[31 - i]; } } void gl_3des_ecb_crypt (gl_3des_ctx *ctx, const char * _from, char * _to, int mode) { const unsigned char *from = (const unsigned char *) _from; unsigned char *to = (unsigned char *) _to; uint32_t left, right, work; uint32_t *keys; keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; READ_64BIT_DATA (from, left, right) INITIAL_PERMUTATION (left, work, right) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) FINAL_PERMUTATION (right, work, left) WRITE_64BIT_DATA (to, right, left) } bool gl_3des_makekey (gl_3des_ctx *ctx, const char * key, size_t keylen) { if (keylen != 24) return false; gl_3des_set3keys (ctx, key, key + 8, key + 16); return !(gl_des_is_weak_key (key) || gl_des_is_weak_key (key + 8) || gl_des_is_weak_key (key + 16)); } shishi-1.0.2/gl/README0000664000000000000000000000113512015626624011160 00000000000000Shishi gl/README -- Information about the gnulib library. Copyright (C) 2003 Simon Josefsson See the end for copying conditions. This directory, and the sub-directory m4/, contains a copy of some of the files in GNULib. If you notice any discrepencies between the copy in Shishi and the upstream version, please let me know, it is most likely an oversight. ---------------------------------------------------------------------- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. shishi-1.0.2/gl/alloca.in.h0000644000000000000000000000372412126660051012310 00000000000000/* Memory allocation on the stack. Copyright (C) 1995, 1999, 2001-2004, 2006-2013 Free Software Foundation, Inc. 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, 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 . */ /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H means there is a real alloca function. */ #ifndef _GL_ALLOCA_H #define _GL_ALLOCA_H /* alloca (N) returns a pointer to N bytes of memory allocated on the stack, which will last until the function returns. Use of alloca should be avoided: - inside arguments of function calls - undefined behaviour, - in inline functions - the allocation may actually last until the calling function returns, - for huge N (say, N >= 65536) - you never know how large (or small) the stack is, and when the stack cannot fulfill the memory allocation request, the program just crashes. */ #ifndef alloca # ifdef __GNUC__ # define alloca __builtin_alloca # elif defined _AIX # define alloca __alloca # elif defined _MSC_VER # include # define alloca _alloca # elif defined __DECC && defined __VMS # define alloca __ALLOCA # elif defined __TANDEM && defined _TNS_E_TARGET # ifdef __cplusplus extern "C" # endif void *_alloca (unsigned short); # pragma intrinsic (_alloca) # define alloca _alloca # else # include # ifdef __cplusplus extern "C" # endif void *alloca (size_t); # endif #endif #endif /* _GL_ALLOCA_H */ shishi-1.0.2/gl/c-ctype.c0000644000000000000000000002534112126660051012006 00000000000000/* Character handling in C locale. Copyright 2000-2003, 2006, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #define NO_C_CTYPE_MACROS #include "c-ctype.h" /* The function isascii is not locale dependent. Its use in EBCDIC is questionable. */ bool c_isascii (int c) { return (c >= 0x00 && c <= 0x7f); } bool c_isalnum (int c) { #if C_CTYPE_CONSECUTIVE_DIGITS \ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII return ((c >= '0' && c <= '9') || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')); #else return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); #endif #else switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': return 1; default: return 0; } #endif } bool c_isalpha (int c) { #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'); #else return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); #endif #else switch (c) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': return 1; default: return 0; } #endif } bool c_isblank (int c) { return (c == ' ' || c == '\t'); } bool c_iscntrl (int c) { #if C_CTYPE_ASCII return ((c & ~0x1f) == 0 || c == 0x7f); #else switch (c) { case ' ': case '!': case '"': case '#': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case '`': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': return 0; default: return 1; } #endif } bool c_isdigit (int c) { #if C_CTYPE_CONSECUTIVE_DIGITS return (c >= '0' && c <= '9'); #else switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return 1; default: return 0; } #endif } bool c_islower (int c) { #if C_CTYPE_CONSECUTIVE_LOWERCASE return (c >= 'a' && c <= 'z'); #else switch (c) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': return 1; default: return 0; } #endif } bool c_isgraph (int c) { #if C_CTYPE_ASCII return (c >= '!' && c <= '~'); #else switch (c) { case '!': case '"': case '#': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case '`': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': return 1; default: return 0; } #endif } bool c_isprint (int c) { #if C_CTYPE_ASCII return (c >= ' ' && c <= '~'); #else switch (c) { case ' ': case '!': case '"': case '#': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case '`': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': return 1; default: return 0; } #endif } bool c_ispunct (int c) { #if C_CTYPE_ASCII return ((c >= '!' && c <= '~') && !((c >= '0' && c <= '9') || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'))); #else switch (c) { case '!': case '"': case '#': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case '[': case '\\': case ']': case '^': case '_': case '`': case '{': case '|': case '}': case '~': return 1; default: return 0; } #endif } bool c_isspace (int c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'); } bool c_isupper (int c) { #if C_CTYPE_CONSECUTIVE_UPPERCASE return (c >= 'A' && c <= 'Z'); #else switch (c) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': return 1; default: return 0; } #endif } bool c_isxdigit (int c) { #if C_CTYPE_CONSECUTIVE_DIGITS \ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII return ((c >= '0' && c <= '9') || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F')); #else return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); #endif #else switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': return 1; default: return 0; } #endif } int c_tolower (int c) { #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c); #else switch (c) { case 'A': return 'a'; case 'B': return 'b'; case 'C': return 'c'; case 'D': return 'd'; case 'E': return 'e'; case 'F': return 'f'; case 'G': return 'g'; case 'H': return 'h'; case 'I': return 'i'; case 'J': return 'j'; case 'K': return 'k'; case 'L': return 'l'; case 'M': return 'm'; case 'N': return 'n'; case 'O': return 'o'; case 'P': return 'p'; case 'Q': return 'q'; case 'R': return 'r'; case 'S': return 's'; case 'T': return 't'; case 'U': return 'u'; case 'V': return 'v'; case 'W': return 'w'; case 'X': return 'x'; case 'Y': return 'y'; case 'Z': return 'z'; default: return c; } #endif } int c_toupper (int c) { #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c); #else switch (c) { case 'a': return 'A'; case 'b': return 'B'; case 'c': return 'C'; case 'd': return 'D'; case 'e': return 'E'; case 'f': return 'F'; case 'g': return 'G'; case 'h': return 'H'; case 'i': return 'I'; case 'j': return 'J'; case 'k': return 'K'; case 'l': return 'L'; case 'm': return 'M'; case 'n': return 'N'; case 'o': return 'O'; case 'p': return 'P'; case 'q': return 'Q'; case 'r': return 'R'; case 's': return 'S'; case 't': return 'T'; case 'u': return 'U'; case 'v': return 'V'; case 'w': return 'W'; case 'x': return 'X'; case 'y': return 'Y'; case 'z': return 'Z'; default: return c; } #endif } shishi-1.0.2/gl/sockets.c0000644000000000000000000001001512126660053012107 00000000000000/* sockets.c --- wrappers for Windows socket functions Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Simon Josefsson */ #include /* Specification. */ #include "sockets.h" #if WINDOWS_SOCKETS /* This includes winsock2.h on MinGW. */ # include # include "fd-hook.h" # include "msvc-nothrow.h" /* Get set_winsock_errno, FD_TO_SOCKET etc. */ # include "w32sock.h" static int close_fd_maybe_socket (const struct fd_hook *remaining_list, gl_close_fn primary, int fd) { /* Note about multithread-safety: There is a race condition where, between our calls to closesocket() and the primary close(), some other thread could make system calls that allocate precisely the same HANDLE value as sock; then the primary close() would call CloseHandle() on it. */ SOCKET sock; WSANETWORKEVENTS ev; /* Test whether fd refers to a socket. */ sock = FD_TO_SOCKET (fd); ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents (sock, NULL, &ev); if (ev.lNetworkEvents != 0xDEADBEEF) { /* fd refers to a socket. */ /* FIXME: other applications, like squid, use an undocumented _free_osfhnd free function. But this is not enough: The 'osfile' flags for fd also needs to be cleared, but it is hard to access it. Instead, here we just close twice the file descriptor. */ if (closesocket (sock)) { set_winsock_errno (); return -1; } else { /* This call frees the file descriptor and does a CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */ _close (fd); return 0; } } else /* Some other type of file descriptor. */ return execute_close_hooks (remaining_list, primary, fd); } static int ioctl_fd_maybe_socket (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg) { SOCKET sock; WSANETWORKEVENTS ev; /* Test whether fd refers to a socket. */ sock = FD_TO_SOCKET (fd); ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents (sock, NULL, &ev); if (ev.lNetworkEvents != 0xDEADBEEF) { /* fd refers to a socket. */ if (ioctlsocket (sock, request, arg) < 0) { set_winsock_errno (); return -1; } else return 0; } else /* Some other type of file descriptor. */ return execute_ioctl_hooks (remaining_list, primary, fd, request, arg); } static struct fd_hook fd_sockets_hook; static int initialized_sockets_version /* = 0 */; #endif /* WINDOWS_SOCKETS */ int gl_sockets_startup (int version _GL_UNUSED) { #if WINDOWS_SOCKETS if (version > initialized_sockets_version) { WSADATA data; int err; err = WSAStartup (version, &data); if (err != 0) return 1; if (data.wVersion < version) return 2; if (initialized_sockets_version == 0) register_fd_hook (close_fd_maybe_socket, ioctl_fd_maybe_socket, &fd_sockets_hook); initialized_sockets_version = version; } #endif return 0; } int gl_sockets_cleanup (void) { #if WINDOWS_SOCKETS int err; initialized_sockets_version = 0; unregister_fd_hook (&fd_sockets_hook); err = WSACleanup (); if (err != 0) return 1; #endif return 0; } shishi-1.0.2/gl/hmac-sha1.c0000644000000000000000000000372712126660051012210 00000000000000/* hmac-sha1.c -- hashed message authentication codes Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #include #include "hmac.h" #include "memxor.h" #include "sha1.h" #include #define IPAD 0x36 #define OPAD 0x5c int hmac_sha1 (const void *key, size_t keylen, const void *in, size_t inlen, void *resbuf) { struct sha1_ctx inner; struct sha1_ctx outer; char optkeybuf[20]; char block[64]; char innerhash[20]; /* Reduce the key's size, so that it becomes <= 64 bytes large. */ if (keylen > 64) { struct sha1_ctx keyhash; sha1_init_ctx (&keyhash); sha1_process_bytes (key, keylen, &keyhash); sha1_finish_ctx (&keyhash, optkeybuf); key = optkeybuf; keylen = 20; } /* Compute INNERHASH from KEY and IN. */ sha1_init_ctx (&inner); memset (block, IPAD, sizeof (block)); memxor (block, key, keylen); sha1_process_block (block, 64, &inner); sha1_process_bytes (in, inlen, &inner); sha1_finish_ctx (&inner, innerhash); /* Compute result from KEY and INNERHASH. */ sha1_init_ctx (&outer); memset (block, OPAD, sizeof (block)); memxor (block, key, keylen); sha1_process_block (block, 64, &outer); sha1_process_bytes (innerhash, 20, &outer); sha1_finish_ctx (&outer, resbuf); return 0; } shishi-1.0.2/gl/printf-parse.c0000644000000000000000000005317112126660053013060 00000000000000/* Formatted output to strings. Copyright (C) 1999-2000, 2002-2003, 2006-2013 Free Software Foundation, Inc. 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, 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 . */ /* This file can be parametrized with the following macros: CHAR_T The element type of the format string. CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters in the format string are ASCII. DIRECTIVE Structure denoting a format directive. Depends on CHAR_T. DIRECTIVES Structure denoting the set of format directives of a format string. Depends on CHAR_T. PRINTF_PARSE Function that parses a format string. Depends on CHAR_T. STATIC Set to 'static' to declare the function static. ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */ #ifndef PRINTF_PARSE # include #endif /* Specification. */ #ifndef PRINTF_PARSE # include "printf-parse.h" #endif /* Default parameters. */ #ifndef PRINTF_PARSE # define PRINTF_PARSE printf_parse # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives #endif /* Get size_t, NULL. */ #include /* Get intmax_t. */ #if defined IN_LIBINTL || defined IN_LIBASPRINTF # if HAVE_STDINT_H_WITH_UINTMAX # include # endif # if HAVE_INTTYPES_H_WITH_UINTMAX # include # endif #else # include #endif /* malloc(), realloc(), free(). */ #include /* memcpy(). */ #include /* errno. */ #include /* Checked size_t computations. */ #include "xsize.h" #if CHAR_T_ONLY_ASCII /* c_isascii(). */ # include "c-ctype.h" #endif #ifdef STATIC STATIC #endif int PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) { const CHAR_T *cp = format; /* pointer into format */ size_t arg_posn = 0; /* number of regular arguments consumed */ size_t d_allocated; /* allocated elements of d->dir */ size_t a_allocated; /* allocated elements of a->arg */ size_t max_width_length = 0; size_t max_precision_length = 0; d->count = 0; d_allocated = N_DIRECT_ALLOC_DIRECTIVES; d->dir = d->direct_alloc_dir; a->count = 0; a_allocated = N_DIRECT_ALLOC_ARGUMENTS; a->arg = a->direct_alloc_arg; #define REGISTER_ARG(_index_,_type_) \ { \ size_t n = (_index_); \ if (n >= a_allocated) \ { \ size_t memory_size; \ argument *memory; \ \ a_allocated = xtimes (a_allocated, 2); \ if (a_allocated <= n) \ a_allocated = xsum (n, 1); \ memory_size = xtimes (a_allocated, sizeof (argument)); \ if (size_overflow_p (memory_size)) \ /* Overflow, would lead to out of memory. */ \ goto out_of_memory; \ memory = (argument *) (a->arg != a->direct_alloc_arg \ ? realloc (a->arg, memory_size) \ : malloc (memory_size)); \ if (memory == NULL) \ /* Out of memory. */ \ goto out_of_memory; \ if (a->arg == a->direct_alloc_arg) \ memcpy (memory, a->arg, a->count * sizeof (argument)); \ a->arg = memory; \ } \ while (a->count <= n) \ a->arg[a->count++].type = TYPE_NONE; \ if (a->arg[n].type == TYPE_NONE) \ a->arg[n].type = (_type_); \ else if (a->arg[n].type != (_type_)) \ /* Ambiguous type for positional argument. */ \ goto error; \ } while (*cp != '\0') { CHAR_T c = *cp++; if (c == '%') { size_t arg_index = ARG_NONE; DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */ /* Initialize the next directive. */ dp->dir_start = cp - 1; dp->flags = 0; dp->width_start = NULL; dp->width_end = NULL; dp->width_arg_index = ARG_NONE; dp->precision_start = NULL; dp->precision_end = NULL; dp->precision_arg_index = ARG_NONE; dp->arg_index = ARG_NONE; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; arg_index = n - 1; cp = np + 1; } } /* Read the flags. */ for (;;) { if (*cp == '\'') { dp->flags |= FLAG_GROUP; cp++; } else if (*cp == '-') { dp->flags |= FLAG_LEFT; cp++; } else if (*cp == '+') { dp->flags |= FLAG_SHOWSIGN; cp++; } else if (*cp == ' ') { dp->flags |= FLAG_SPACE; cp++; } else if (*cp == '#') { dp->flags |= FLAG_ALT; cp++; } else if (*cp == '0') { dp->flags |= FLAG_ZERO; cp++; } #if __GLIBC__ >= 2 && !defined __UCLIBC__ else if (*cp == 'I') { dp->flags |= FLAG_LOCALIZED; cp++; } #endif else break; } /* Parse the field width. */ if (*cp == '*') { dp->width_start = cp; cp++; dp->width_end = cp; if (max_width_length < 1) max_width_length = 1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->width_arg_index = n - 1; cp = np + 1; } } if (dp->width_arg_index == ARG_NONE) { dp->width_arg_index = arg_posn++; if (dp->width_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->width_arg_index, TYPE_INT); } else if (*cp >= '0' && *cp <= '9') { size_t width_length; dp->width_start = cp; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->width_end = cp; width_length = dp->width_end - dp->width_start; if (max_width_length < width_length) max_width_length = width_length; } /* Parse the precision. */ if (*cp == '.') { cp++; if (*cp == '*') { dp->precision_start = cp - 1; cp++; dp->precision_end = cp; if (max_precision_length < 2) max_precision_length = 2; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->precision_arg_index = n - 1; cp = np + 1; } } if (dp->precision_arg_index == ARG_NONE) { dp->precision_arg_index = arg_posn++; if (dp->precision_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->precision_arg_index, TYPE_INT); } else { size_t precision_length; dp->precision_start = cp - 1; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->precision_end = cp; precision_length = dp->precision_end - dp->precision_start; if (max_precision_length < precision_length) max_precision_length = precision_length; } } { arg_type type; /* Parse argument type/size specifiers. */ { int flags = 0; for (;;) { if (*cp == 'h') { flags |= (1 << (flags & 1)); cp++; } else if (*cp == 'L') { flags |= 4; cp++; } else if (*cp == 'l') { flags += 8; cp++; } else if (*cp == 'j') { if (sizeof (intmax_t) > sizeof (long)) { /* intmax_t = long long */ flags += 16; } else if (sizeof (intmax_t) > sizeof (int)) { /* intmax_t = long */ flags += 8; } cp++; } else if (*cp == 'z' || *cp == 'Z') { /* 'z' is standardized in ISO C 99, but glibc uses 'Z' because the warning facility in gcc-2.95.2 understands only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ if (sizeof (size_t) > sizeof (long)) { /* size_t = long long */ flags += 16; } else if (sizeof (size_t) > sizeof (int)) { /* size_t = long */ flags += 8; } cp++; } else if (*cp == 't') { if (sizeof (ptrdiff_t) > sizeof (long)) { /* ptrdiff_t = long long */ flags += 16; } else if (sizeof (ptrdiff_t) > sizeof (int)) { /* ptrdiff_t = long */ flags += 8; } cp++; } #if defined __APPLE__ && defined __MACH__ /* On Mac OS X 10.3, PRIdMAX is defined as "qd". We cannot change it to "lld" because PRIdMAX must also be understood by the system's printf routines. */ else if (*cp == 'q') { if (64 / 8 > sizeof (long)) { /* int64_t = long long */ flags += 16; } else { /* int64_t = long */ flags += 8; } cp++; } #endif #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* On native Windows, PRIdMAX is defined as "I64d". We cannot change it to "lld" because PRIdMAX must also be understood by the system's printf routines. */ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4') { if (64 / 8 > sizeof (long)) { /* __int64 = long long */ flags += 16; } else { /* __int64 = long */ flags += 8; } cp += 3; } #endif else break; } /* Read the conversion character. */ c = *cp++; switch (c) { case 'd': case 'i': #if HAVE_LONG_LONG_INT /* If 'long long' exists and is larger than 'long': */ if (flags >= 16 || (flags & 4)) type = TYPE_LONGLONGINT; else #endif /* If 'long long' exists and is the same as 'long', we parse "lld" into TYPE_LONGINT. */ if (flags >= 8) type = TYPE_LONGINT; else if (flags & 2) type = TYPE_SCHAR; else if (flags & 1) type = TYPE_SHORT; else type = TYPE_INT; break; case 'o': case 'u': case 'x': case 'X': #if HAVE_LONG_LONG_INT /* If 'long long' exists and is larger than 'long': */ if (flags >= 16 || (flags & 4)) type = TYPE_ULONGLONGINT; else #endif /* If 'unsigned long long' exists and is the same as 'unsigned long', we parse "llu" into TYPE_ULONGINT. */ if (flags >= 8) type = TYPE_ULONGINT; else if (flags & 2) type = TYPE_UCHAR; else if (flags & 1) type = TYPE_USHORT; else type = TYPE_UINT; break; case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': if (flags >= 16 || (flags & 4)) type = TYPE_LONGDOUBLE; else type = TYPE_DOUBLE; break; case 'c': if (flags >= 8) #if HAVE_WINT_T type = TYPE_WIDE_CHAR; #else goto error; #endif else type = TYPE_CHAR; break; #if HAVE_WINT_T case 'C': type = TYPE_WIDE_CHAR; c = 'c'; break; #endif case 's': if (flags >= 8) #if HAVE_WCHAR_T type = TYPE_WIDE_STRING; #else goto error; #endif else type = TYPE_STRING; break; #if HAVE_WCHAR_T case 'S': type = TYPE_WIDE_STRING; c = 's'; break; #endif case 'p': type = TYPE_POINTER; break; case 'n': #if HAVE_LONG_LONG_INT /* If 'long long' exists and is larger than 'long': */ if (flags >= 16 || (flags & 4)) type = TYPE_COUNT_LONGLONGINT_POINTER; else #endif /* If 'long long' exists and is the same as 'long', we parse "lln" into TYPE_COUNT_LONGINT_POINTER. */ if (flags >= 8) type = TYPE_COUNT_LONGINT_POINTER; else if (flags & 2) type = TYPE_COUNT_SCHAR_POINTER; else if (flags & 1) type = TYPE_COUNT_SHORT_POINTER; else type = TYPE_COUNT_INT_POINTER; break; #if ENABLE_UNISTDIO /* The unistdio extensions. */ case 'U': if (flags >= 16) type = TYPE_U32_STRING; else if (flags >= 8) type = TYPE_U16_STRING; else type = TYPE_U8_STRING; break; #endif case '%': type = TYPE_NONE; break; default: /* Unknown conversion character. */ goto error; } } if (type != TYPE_NONE) { dp->arg_index = arg_index; if (dp->arg_index == ARG_NONE) { dp->arg_index = arg_posn++; if (dp->arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->arg_index, type); } dp->conversion = c; dp->dir_end = cp; } d->count++; if (d->count >= d_allocated) { size_t memory_size; DIRECTIVE *memory; d_allocated = xtimes (d_allocated, 2); memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); if (size_overflow_p (memory_size)) /* Overflow, would lead to out of memory. */ goto out_of_memory; memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir ? realloc (d->dir, memory_size) : malloc (memory_size)); if (memory == NULL) /* Out of memory. */ goto out_of_memory; if (d->dir == d->direct_alloc_dir) memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE)); d->dir = memory; } } #if CHAR_T_ONLY_ASCII else if (!c_isascii (c)) { /* Non-ASCII character. Not supported. */ goto error; } #endif } d->dir[d->count].dir_start = cp; d->max_width_length = max_width_length; d->max_precision_length = max_precision_length; return 0; error: if (a->arg != a->direct_alloc_arg) free (a->arg); if (d->dir != d->direct_alloc_dir) free (d->dir); errno = EINVAL; return -1; out_of_memory: if (a->arg != a->direct_alloc_arg) free (a->arg); if (d->dir != d->direct_alloc_dir) free (d->dir); errno = ENOMEM; return -1; } #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T_ONLY_ASCII #undef CHAR_T shishi-1.0.2/gl/gai_strerror.c0000644000000000000000000000524312126660051013143 00000000000000/* Copyright (C) 1997, 2001-2002, 2004-2006, 2008-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Philip Blundell , 1997. 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, 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 . */ #ifndef _LIBC # include #endif #include #include #ifdef _LIBC # include #else # include "gettext.h" # define _(String) gettext (String) # define N_(String) String #endif #if HAVE_DECL_GAI_STRERROR # include # undef gai_strerror # if HAVE_DECL_GAI_STRERRORA # define gai_strerror gai_strerrorA # endif const char * rpl_gai_strerror (int code) { return gai_strerror (code); } #else /* !HAVE_DECL_GAI_STRERROR */ static struct { int code; const char *msg; } values[] = { { EAI_ADDRFAMILY, N_("Address family for hostname not supported") }, { EAI_AGAIN, N_("Temporary failure in name resolution") }, { EAI_BADFLAGS, N_("Bad value for ai_flags") }, { EAI_FAIL, N_("Non-recoverable failure in name resolution") }, { EAI_FAMILY, N_("ai_family not supported") }, { EAI_MEMORY, N_("Memory allocation failure") }, { EAI_NODATA, N_("No address associated with hostname") }, { EAI_NONAME, N_("Name or service not known") }, { EAI_SERVICE, N_("Servname not supported for ai_socktype") }, { EAI_SOCKTYPE, N_("ai_socktype not supported") }, { EAI_SYSTEM, N_("System error") }, { EAI_OVERFLOW, N_("Argument buffer too small") }, #ifdef EAI_INPROGRESS { EAI_INPROGRESS, N_("Processing request in progress") }, { EAI_CANCELED, N_("Request canceled") }, { EAI_NOTCANCELED, N_("Request not canceled") }, { EAI_ALLDONE, N_("All requests done") }, { EAI_INTR, N_("Interrupted by a signal") }, { EAI_IDN_ENCODE, N_("Parameter string not correctly encoded") } #endif }; const char * gai_strerror (int code) { size_t i; for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i) if (values[i].code == code) return _(values[i].msg); return _("Unknown error"); } # ifdef _LIBC libc_hidden_def (gai_strerror) # endif #endif /* !HAVE_DECL_GAI_STRERROR */ shishi-1.0.2/gl/hmac-md5.c0000644000000000000000000000370512126660051012035 00000000000000/* hmac-md5.c -- hashed message authentication codes Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #include #include "hmac.h" #include "memxor.h" #include "md5.h" #include #define IPAD 0x36 #define OPAD 0x5c int hmac_md5 (const void *key, size_t keylen, const void *in, size_t inlen, void *resbuf) { struct md5_ctx inner; struct md5_ctx outer; char optkeybuf[16]; char block[64]; char innerhash[16]; /* Reduce the key's size, so that it becomes <= 64 bytes large. */ if (keylen > 64) { struct md5_ctx keyhash; md5_init_ctx (&keyhash); md5_process_bytes (key, keylen, &keyhash); md5_finish_ctx (&keyhash, optkeybuf); key = optkeybuf; keylen = 16; } /* Compute INNERHASH from KEY and IN. */ md5_init_ctx (&inner); memset (block, IPAD, sizeof (block)); memxor (block, key, keylen); md5_process_block (block, 64, &inner); md5_process_bytes (in, inlen, &inner); md5_finish_ctx (&inner, innerhash); /* Compute result from KEY and INNERHASH. */ md5_init_ctx (&outer); memset (block, OPAD, sizeof (block)); memxor (block, key, keylen); md5_process_block (block, 64, &outer); md5_process_bytes (innerhash, 16, &outer); md5_finish_ctx (&outer, resbuf); return 0; } shishi-1.0.2/gl/strchrnul.valgrind0000664000000000000000000000040312015626624014051 00000000000000# Suppress a valgrind message about use of uninitialized memory in strchrnul(). # This use is OK because it provides only a speedup. { strchrnul-value4 Memcheck:Value4 fun:strchrnul } { strchrnul-value8 Memcheck:Value8 fun:strchrnul } shishi-1.0.2/gl/fstat.c0000644000000000000000000000460512126660051011563 00000000000000/* fstat() replacement. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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 . */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_fstat doesn't recurse to rpl_fstat. */ #define __need_system_sys_stat_h #include /* Get the original definition of fstat. It might be defined as a macro. */ #include #include #if _GL_WINDOWS_64_BIT_ST_SIZE # undef stat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */ # define stat _stati64 # undef fstat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */ # define fstat _fstati64 #endif #undef __need_system_sys_stat_h static int orig_fstat (int fd, struct stat *buf) { return fstat (fd, buf); } /* Specification. */ /* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ #include "sys/stat.h" #include #include #if HAVE_MSVC_INVALID_PARAMETER_HANDLER # include "msvc-inval.h" #endif #if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int fstat_nothrow (int fd, struct stat *buf) { int result; TRY_MSVC_INVAL { result = orig_fstat (fd, buf); } CATCH_MSVC_INVAL { result = -1; errno = EBADF; } DONE_MSVC_INVAL; return result; } #else # define fstat_nothrow orig_fstat #endif int rpl_fstat (int fd, struct stat *buf) { #if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY /* Handle the case when rpl_open() used a dummy file descriptor to work around an open() that can't normally visit directories. */ const char *name = _gl_directory_name (fd); if (name != NULL) return stat (name, buf); #endif return fstat_nothrow (fd, buf); } shishi-1.0.2/gl/wchar.in.h0000644000000000000000000010167512126660054012170 00000000000000/* A substitute for ISO C99 , for platforms that have issues. Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Eric Blake. */ /* * ISO C 99 for platforms that have issues. * * * For now, this just ensures proper prerequisite inclusion order and * the declaration of wcwidth(). */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_mbstate_t || defined __need_wint_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H /* Special invocation convention: - Inside glibc and uClibc header files. - On HP-UX 11.00 we have a sequence of nested includes -> -> , and the latter includes , once indirectly -> -> -> and once directly. In both situations 'wint_t' is not yet defined, therefore we cannot provide the function overrides; instead include only the system's . - On IRIX 6.5, similarly, we have an include -> , and the latter includes . But here, we have no way to detect whether is completely included or is still being included. */ #@INCLUDE_NEXT@ @NEXT_WCHAR_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_WCHAR_H #define _GL_ALREADY_INCLUDING_WCHAR_H #if @HAVE_FEATURES_H@ # include /* for __GLIBC__ */ #endif /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . In some builds of uClibc, is nonexistent and wchar_t is defined by . But avoid namespace pollution on glibc systems. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include #endif #ifndef __GLIBC__ # include # include #endif /* Include the original if it exists. Some builds of uClibc lack it. */ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_WCHAR_H@ # @INCLUDE_NEXT@ @NEXT_WCHAR_H@ #endif #undef _GL_ALREADY_INCLUDING_WCHAR_H #ifndef _@GUARD_PREFIX@_WCHAR_H #define _@GUARD_PREFIX@_WCHAR_H /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Define wint_t and WEOF. (Also done in wctype.in.h.) */ #if !@HAVE_WINT_T@ && !defined wint_t # define wint_t int # ifndef WEOF # define WEOF -1 # endif #else /* MSVC defines wint_t as 'unsigned short' in . This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be "unchanged by default argument promotions". Override it. */ # if defined _MSC_VER # if !GNULIB_defined_wint_t # include typedef unsigned int rpl_wint_t; # undef wint_t # define wint_t rpl_wint_t # define GNULIB_defined_wint_t 1 # endif # endif # ifndef WEOF # define WEOF ((wint_t) -1) # endif #endif /* Override mbstate_t if it is too small. On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for implementing mbrtowc for encodings like UTF-8. */ #if !(@HAVE_MBSINIT@ && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@ # if !GNULIB_defined_mbstate_t typedef int rpl_mbstate_t; # undef mbstate_t # define mbstate_t rpl_mbstate_t # define GNULIB_defined_mbstate_t 1 # endif #endif /* Convert a single-byte character to a wide character. */ #if @GNULIB_BTOWC@ # if @REPLACE_BTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef btowc # define btowc rpl_btowc # endif _GL_FUNCDECL_RPL (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (btowc, wint_t, (int c)); # else # if !@HAVE_BTOWC@ _GL_FUNCDECL_SYS (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (btowc, wint_t, (int c)); # endif _GL_CXXALIASWARN (btowc); #elif defined GNULIB_POSIXCHECK # undef btowc # if HAVE_RAW_DECL_BTOWC _GL_WARN_ON_USE (btowc, "btowc is unportable - " "use gnulib module btowc for portability"); # endif #endif /* Convert a wide character to a single-byte character. */ #if @GNULIB_WCTOB@ # if @REPLACE_WCTOB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wctob # define wctob rpl_wctob # endif _GL_FUNCDECL_RPL (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wctob, int, (wint_t wc)); # else # if !defined wctob && !@HAVE_DECL_WCTOB@ /* wctob is provided by gnulib, or wctob exists but is not declared. */ _GL_FUNCDECL_SYS (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wctob, int, (wint_t wc)); # endif _GL_CXXALIASWARN (wctob); #elif defined GNULIB_POSIXCHECK # undef wctob # if HAVE_RAW_DECL_WCTOB _GL_WARN_ON_USE (wctob, "wctob is unportable - " "use gnulib module wctob for portability"); # endif #endif /* Test whether *PS is in the initial state. */ #if @GNULIB_MBSINIT@ # if @REPLACE_MBSINIT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsinit # define mbsinit rpl_mbsinit # endif _GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps)); _GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps)); # else # if !@HAVE_MBSINIT@ _GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps)); # endif _GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps)); # endif _GL_CXXALIASWARN (mbsinit); #elif defined GNULIB_POSIXCHECK # undef mbsinit # if HAVE_RAW_DECL_MBSINIT _GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - " "use gnulib module mbsinit for portability"); # endif #endif /* Convert a multibyte character to a wide character. */ #if @GNULIB_MBRTOWC@ # if @REPLACE_MBRTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbrtowc # define mbrtowc rpl_mbrtowc # endif _GL_FUNCDECL_RPL (mbrtowc, size_t, (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); _GL_CXXALIAS_RPL (mbrtowc, size_t, (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); # else # if !@HAVE_MBRTOWC@ _GL_FUNCDECL_SYS (mbrtowc, size_t, (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); # endif _GL_CXXALIAS_SYS (mbrtowc, size_t, (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); # endif _GL_CXXALIASWARN (mbrtowc); #elif defined GNULIB_POSIXCHECK # undef mbrtowc # if HAVE_RAW_DECL_MBRTOWC _GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - " "use gnulib module mbrtowc for portability"); # endif #endif /* Recognize a multibyte character. */ #if @GNULIB_MBRLEN@ # if @REPLACE_MBRLEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbrlen # define mbrlen rpl_mbrlen # endif _GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); _GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); # else # if !@HAVE_MBRLEN@ _GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); # endif _GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); # endif _GL_CXXALIASWARN (mbrlen); #elif defined GNULIB_POSIXCHECK # undef mbrlen # if HAVE_RAW_DECL_MBRLEN _GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - " "use gnulib module mbrlen for portability"); # endif #endif /* Convert a string to a wide string. */ #if @GNULIB_MBSRTOWCS@ # if @REPLACE_MBSRTOWCS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsrtowcs # define mbsrtowcs rpl_mbsrtowcs # endif _GL_FUNCDECL_RPL (mbsrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (mbsrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)); # else # if !@HAVE_MBSRTOWCS@ _GL_FUNCDECL_SYS (mbsrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mbsrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)); # endif _GL_CXXALIASWARN (mbsrtowcs); #elif defined GNULIB_POSIXCHECK # undef mbsrtowcs # if HAVE_RAW_DECL_MBSRTOWCS _GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - " "use gnulib module mbsrtowcs for portability"); # endif #endif /* Convert a string to a wide string. */ #if @GNULIB_MBSNRTOWCS@ # if @REPLACE_MBSNRTOWCS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbsnrtowcs # define mbsnrtowcs rpl_mbsnrtowcs # endif _GL_FUNCDECL_RPL (mbsnrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (mbsnrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps)); # else # if !@HAVE_MBSNRTOWCS@ _GL_FUNCDECL_SYS (mbsnrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mbsnrtowcs, size_t, (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps)); # endif _GL_CXXALIASWARN (mbsnrtowcs); #elif defined GNULIB_POSIXCHECK # undef mbsnrtowcs # if HAVE_RAW_DECL_MBSNRTOWCS _GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - " "use gnulib module mbsnrtowcs for portability"); # endif #endif /* Convert a wide character to a multibyte character. */ #if @GNULIB_WCRTOMB@ # if @REPLACE_WCRTOMB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcrtomb # define wcrtomb rpl_wcrtomb # endif _GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); _GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); # else # if !@HAVE_WCRTOMB@ _GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); # endif _GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); # endif _GL_CXXALIASWARN (wcrtomb); #elif defined GNULIB_POSIXCHECK # undef wcrtomb # if HAVE_RAW_DECL_WCRTOMB _GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - " "use gnulib module wcrtomb for portability"); # endif #endif /* Convert a wide string to a string. */ #if @GNULIB_WCSRTOMBS@ # if @REPLACE_WCSRTOMBS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcsrtombs # define wcsrtombs rpl_wcsrtombs # endif _GL_FUNCDECL_RPL (wcsrtombs, size_t, (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (wcsrtombs, size_t, (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)); # else # if !@HAVE_WCSRTOMBS@ _GL_FUNCDECL_SYS (wcsrtombs, size_t, (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (wcsrtombs, size_t, (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)); # endif _GL_CXXALIASWARN (wcsrtombs); #elif defined GNULIB_POSIXCHECK # undef wcsrtombs # if HAVE_RAW_DECL_WCSRTOMBS _GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - " "use gnulib module wcsrtombs for portability"); # endif #endif /* Convert a wide string to a string. */ #if @GNULIB_WCSNRTOMBS@ # if @REPLACE_WCSNRTOMBS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcsnrtombs # define wcsnrtombs rpl_wcsnrtombs # endif _GL_FUNCDECL_RPL (wcsnrtombs, size_t, (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (wcsnrtombs, size_t, (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps)); # else # if !@HAVE_WCSNRTOMBS@ _GL_FUNCDECL_SYS (wcsnrtombs, size_t, (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (wcsnrtombs, size_t, (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps)); # endif _GL_CXXALIASWARN (wcsnrtombs); #elif defined GNULIB_POSIXCHECK # undef wcsnrtombs # if HAVE_RAW_DECL_WCSNRTOMBS _GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - " "use gnulib module wcsnrtombs for portability"); # endif #endif /* Return the number of screen columns needed for WC. */ #if @GNULIB_WCWIDTH@ # if @REPLACE_WCWIDTH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcwidth # define wcwidth rpl_wcwidth # endif _GL_FUNCDECL_RPL (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wcwidth, int, (wchar_t)); # else # if !@HAVE_DECL_WCWIDTH@ /* wcwidth exists but is not declared. */ _GL_FUNCDECL_SYS (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcwidth, int, (wchar_t)); # endif _GL_CXXALIASWARN (wcwidth); #elif defined GNULIB_POSIXCHECK # undef wcwidth # if HAVE_RAW_DECL_WCWIDTH _GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - " "use gnulib module wcwidth for portability"); # endif #endif /* Search N wide characters of S for C. */ #if @GNULIB_WMEMCHR@ # if !@HAVE_WMEMCHR@ _GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t); wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (wmemchr, wchar_t *, (const wchar_t *, wchar_t, size_t), const wchar_t *, (const wchar_t *, wchar_t, size_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); _GL_CXXALIASWARN1 (wmemchr, const wchar_t *, (const wchar_t *s, wchar_t c, size_t n)); # else _GL_CXXALIASWARN (wmemchr); # endif #elif defined GNULIB_POSIXCHECK # undef wmemchr # if HAVE_RAW_DECL_WMEMCHR _GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - " "use gnulib module wmemchr for portability"); # endif #endif /* Compare N wide characters of S1 and S2. */ #if @GNULIB_WMEMCMP@ # if !@HAVE_WMEMCMP@ _GL_FUNCDECL_SYS (wmemcmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wmemcmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); _GL_CXXALIASWARN (wmemcmp); #elif defined GNULIB_POSIXCHECK # undef wmemcmp # if HAVE_RAW_DECL_WMEMCMP _GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - " "use gnulib module wmemcmp for portability"); # endif #endif /* Copy N wide characters of SRC to DEST. */ #if @GNULIB_WMEMCPY@ # if !@HAVE_WMEMCPY@ _GL_FUNCDECL_SYS (wmemcpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wmemcpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); _GL_CXXALIASWARN (wmemcpy); #elif defined GNULIB_POSIXCHECK # undef wmemcpy # if HAVE_RAW_DECL_WMEMCPY _GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - " "use gnulib module wmemcpy for portability"); # endif #endif /* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for overlapping memory areas. */ #if @GNULIB_WMEMMOVE@ # if !@HAVE_WMEMMOVE@ _GL_FUNCDECL_SYS (wmemmove, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wmemmove, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); _GL_CXXALIASWARN (wmemmove); #elif defined GNULIB_POSIXCHECK # undef wmemmove # if HAVE_RAW_DECL_WMEMMOVE _GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - " "use gnulib module wmemmove for portability"); # endif #endif /* Set N wide characters of S to C. */ #if @GNULIB_WMEMSET@ # if !@HAVE_WMEMSET@ _GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); # endif _GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); _GL_CXXALIASWARN (wmemset); #elif defined GNULIB_POSIXCHECK # undef wmemset # if HAVE_RAW_DECL_WMEMSET _GL_WARN_ON_USE (wmemset, "wmemset is unportable - " "use gnulib module wmemset for portability"); # endif #endif /* Return the number of wide characters in S. */ #if @GNULIB_WCSLEN@ # if !@HAVE_WCSLEN@ _GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s)); _GL_CXXALIASWARN (wcslen); #elif defined GNULIB_POSIXCHECK # undef wcslen # if HAVE_RAW_DECL_WCSLEN _GL_WARN_ON_USE (wcslen, "wcslen is unportable - " "use gnulib module wcslen for portability"); # endif #endif /* Return the number of wide characters in S, but at most MAXLEN. */ #if @GNULIB_WCSNLEN@ # if !@HAVE_WCSNLEN@ _GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)); _GL_CXXALIASWARN (wcsnlen); #elif defined GNULIB_POSIXCHECK # undef wcsnlen # if HAVE_RAW_DECL_WCSNLEN _GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - " "use gnulib module wcsnlen for portability"); # endif #endif /* Copy SRC to DEST. */ #if @GNULIB_WCSCPY@ # if !@HAVE_WCSCPY@ _GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); # endif _GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); _GL_CXXALIASWARN (wcscpy); #elif defined GNULIB_POSIXCHECK # undef wcscpy # if HAVE_RAW_DECL_WCSCPY _GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - " "use gnulib module wcscpy for portability"); # endif #endif /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */ #if @GNULIB_WCPCPY@ # if !@HAVE_WCPCPY@ _GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); # endif _GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); _GL_CXXALIASWARN (wcpcpy); #elif defined GNULIB_POSIXCHECK # undef wcpcpy # if HAVE_RAW_DECL_WCPCPY _GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - " "use gnulib module wcpcpy for portability"); # endif #endif /* Copy no more than N wide characters of SRC to DEST. */ #if @GNULIB_WCSNCPY@ # if !@HAVE_WCSNCPY@ _GL_FUNCDECL_SYS (wcsncpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wcsncpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); _GL_CXXALIASWARN (wcsncpy); #elif defined GNULIB_POSIXCHECK # undef wcsncpy # if HAVE_RAW_DECL_WCSNCPY _GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - " "use gnulib module wcsncpy for portability"); # endif #endif /* Copy no more than N characters of SRC to DEST, returning the address of the last character written into DEST. */ #if @GNULIB_WCPNCPY@ # if !@HAVE_WCPNCPY@ _GL_FUNCDECL_SYS (wcpncpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wcpncpy, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); _GL_CXXALIASWARN (wcpncpy); #elif defined GNULIB_POSIXCHECK # undef wcpncpy # if HAVE_RAW_DECL_WCPNCPY _GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - " "use gnulib module wcpncpy for portability"); # endif #endif /* Append SRC onto DEST. */ #if @GNULIB_WCSCAT@ # if !@HAVE_WCSCAT@ _GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src)); # endif _GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src)); _GL_CXXALIASWARN (wcscat); #elif defined GNULIB_POSIXCHECK # undef wcscat # if HAVE_RAW_DECL_WCSCAT _GL_WARN_ON_USE (wcscat, "wcscat is unportable - " "use gnulib module wcscat for portability"); # endif #endif /* Append no more than N wide characters of SRC onto DEST. */ #if @GNULIB_WCSNCAT@ # if !@HAVE_WCSNCAT@ _GL_FUNCDECL_SYS (wcsncat, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); # endif _GL_CXXALIAS_SYS (wcsncat, wchar_t *, (wchar_t *dest, const wchar_t *src, size_t n)); _GL_CXXALIASWARN (wcsncat); #elif defined GNULIB_POSIXCHECK # undef wcsncat # if HAVE_RAW_DECL_WCSNCAT _GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - " "use gnulib module wcsncat for portability"); # endif #endif /* Compare S1 and S2. */ #if @GNULIB_WCSCMP@ # if !@HAVE_WCSCMP@ _GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)); _GL_CXXALIASWARN (wcscmp); #elif defined GNULIB_POSIXCHECK # undef wcscmp # if HAVE_RAW_DECL_WCSCMP _GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - " "use gnulib module wcscmp for portability"); # endif #endif /* Compare no more than N wide characters of S1 and S2. */ #if @GNULIB_WCSNCMP@ # if !@HAVE_WCSNCMP@ _GL_FUNCDECL_SYS (wcsncmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsncmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); _GL_CXXALIASWARN (wcsncmp); #elif defined GNULIB_POSIXCHECK # undef wcsncmp # if HAVE_RAW_DECL_WCSNCMP _GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - " "use gnulib module wcsncmp for portability"); # endif #endif /* Compare S1 and S2, ignoring case. */ #if @GNULIB_WCSCASECMP@ # if !@HAVE_WCSCASECMP@ _GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)); _GL_CXXALIASWARN (wcscasecmp); #elif defined GNULIB_POSIXCHECK # undef wcscasecmp # if HAVE_RAW_DECL_WCSCASECMP _GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - " "use gnulib module wcscasecmp for portability"); # endif #endif /* Compare no more than N chars of S1 and S2, ignoring case. */ #if @GNULIB_WCSNCASECMP@ # if !@HAVE_WCSNCASECMP@ _GL_FUNCDECL_SYS (wcsncasecmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsncasecmp, int, (const wchar_t *s1, const wchar_t *s2, size_t n)); _GL_CXXALIASWARN (wcsncasecmp); #elif defined GNULIB_POSIXCHECK # undef wcsncasecmp # if HAVE_RAW_DECL_WCSNCASECMP _GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - " "use gnulib module wcsncasecmp for portability"); # endif #endif /* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE category of the current locale. */ #if @GNULIB_WCSCOLL@ # if !@HAVE_WCSCOLL@ _GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); # endif _GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); _GL_CXXALIASWARN (wcscoll); #elif defined GNULIB_POSIXCHECK # undef wcscoll # if HAVE_RAW_DECL_WCSCOLL _GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - " "use gnulib module wcscoll for portability"); # endif #endif /* Transform S2 into array pointed to by S1 such that if wcscmp is applied to two transformed strings the result is the as applying 'wcscoll' to the original strings. */ #if @GNULIB_WCSXFRM@ # if !@HAVE_WCSXFRM@ _GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n)); # endif _GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n)); _GL_CXXALIASWARN (wcsxfrm); #elif defined GNULIB_POSIXCHECK # undef wcsxfrm # if HAVE_RAW_DECL_WCSXFRM _GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - " "use gnulib module wcsxfrm for portability"); # endif #endif /* Duplicate S, returning an identical malloc'd string. */ #if @GNULIB_WCSDUP@ # if !@HAVE_WCSDUP@ _GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s)); # endif _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s)); _GL_CXXALIASWARN (wcsdup); #elif defined GNULIB_POSIXCHECK # undef wcsdup # if HAVE_RAW_DECL_WCSDUP _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - " "use gnulib module wcsdup for portability"); # endif #endif /* Find the first occurrence of WC in WCS. */ #if @GNULIB_WCSCHR@ # if !@HAVE_WCSCHR@ _GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcschr (const wchar_t *, wchar_t); wchar_t * std::wcschr (wchar_t *, wchar_t); } */ _GL_CXXALIAS_SYS_CAST2 (wcschr, wchar_t *, (const wchar_t *, wchar_t), const wchar_t *, (const wchar_t *, wchar_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc)); _GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); # else _GL_CXXALIASWARN (wcschr); # endif #elif defined GNULIB_POSIXCHECK # undef wcschr # if HAVE_RAW_DECL_WCSCHR _GL_WARN_ON_USE (wcschr, "wcschr is unportable - " "use gnulib module wcschr for portability"); # endif #endif /* Find the last occurrence of WC in WCS. */ #if @GNULIB_WCSRCHR@ # if !@HAVE_WCSRCHR@ _GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcsrchr (const wchar_t *, wchar_t); wchar_t * std::wcsrchr (wchar_t *, wchar_t); } */ _GL_CXXALIAS_SYS_CAST2 (wcsrchr, wchar_t *, (const wchar_t *, wchar_t), const wchar_t *, (const wchar_t *, wchar_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc)); _GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); # else _GL_CXXALIASWARN (wcsrchr); # endif #elif defined GNULIB_POSIXCHECK # undef wcsrchr # if HAVE_RAW_DECL_WCSRCHR _GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - " "use gnulib module wcsrchr for portability"); # endif #endif /* Return the length of the initial segmet of WCS which consists entirely of wide characters not in REJECT. */ #if @GNULIB_WCSCSPN@ # if !@HAVE_WCSCSPN@ _GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)); _GL_CXXALIASWARN (wcscspn); #elif defined GNULIB_POSIXCHECK # undef wcscspn # if HAVE_RAW_DECL_WCSCSPN _GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - " "use gnulib module wcscspn for portability"); # endif #endif /* Return the length of the initial segmet of WCS which consists entirely of wide characters in ACCEPT. */ #if @GNULIB_WCSSPN@ # if !@HAVE_WCSSPN@ _GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)); _GL_CXXALIASWARN (wcsspn); #elif defined GNULIB_POSIXCHECK # undef wcsspn # if HAVE_RAW_DECL_WCSSPN _GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - " "use gnulib module wcsspn for portability"); # endif #endif /* Find the first occurrence in WCS of any character in ACCEPT. */ #if @GNULIB_WCSPBRK@ # if !@HAVE_WCSPBRK@ _GL_FUNCDECL_SYS (wcspbrk, wchar_t *, (const wchar_t *wcs, const wchar_t *accept) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *); wchar_t * std::wcspbrk (wchar_t *, const wchar_t *); } */ _GL_CXXALIAS_SYS_CAST2 (wcspbrk, wchar_t *, (const wchar_t *, const wchar_t *), const wchar_t *, (const wchar_t *, const wchar_t *)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcspbrk, wchar_t *, (wchar_t *wcs, const wchar_t *accept)); _GL_CXXALIASWARN1 (wcspbrk, const wchar_t *, (const wchar_t *wcs, const wchar_t *accept)); # else _GL_CXXALIASWARN (wcspbrk); # endif #elif defined GNULIB_POSIXCHECK # undef wcspbrk # if HAVE_RAW_DECL_WCSPBRK _GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - " "use gnulib module wcspbrk for portability"); # endif #endif /* Find the first occurrence of NEEDLE in HAYSTACK. */ #if @GNULIB_WCSSTR@ # if !@HAVE_WCSSTR@ _GL_FUNCDECL_SYS (wcsstr, wchar_t *, (const wchar_t *haystack, const wchar_t *needle) _GL_ATTRIBUTE_PURE); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *); wchar_t * std::wcsstr (wchar_t *, const wchar_t *); } */ _GL_CXXALIAS_SYS_CAST2 (wcsstr, wchar_t *, (const wchar_t *, const wchar_t *), const wchar_t *, (const wchar_t *, const wchar_t *)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (wcsstr, wchar_t *, (wchar_t *haystack, const wchar_t *needle)); _GL_CXXALIASWARN1 (wcsstr, const wchar_t *, (const wchar_t *haystack, const wchar_t *needle)); # else _GL_CXXALIASWARN (wcsstr); # endif #elif defined GNULIB_POSIXCHECK # undef wcsstr # if HAVE_RAW_DECL_WCSSTR _GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - " "use gnulib module wcsstr for portability"); # endif #endif /* Divide WCS into tokens separated by characters in DELIM. */ #if @GNULIB_WCSTOK@ # if !@HAVE_WCSTOK@ _GL_FUNCDECL_SYS (wcstok, wchar_t *, (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)); # endif _GL_CXXALIAS_SYS (wcstok, wchar_t *, (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)); _GL_CXXALIASWARN (wcstok); #elif defined GNULIB_POSIXCHECK # undef wcstok # if HAVE_RAW_DECL_WCSTOK _GL_WARN_ON_USE (wcstok, "wcstok is unportable - " "use gnulib module wcstok for portability"); # endif #endif /* Determine number of column positions required for first N wide characters (or fewer if S ends before this) in S. */ #if @GNULIB_WCSWIDTH@ # if @REPLACE_WCSWIDTH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wcswidth # define wcswidth rpl_wcswidth # endif _GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n) _GL_ATTRIBUTE_PURE); _GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n)); # else # if !@HAVE_WCSWIDTH@ _GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n) _GL_ATTRIBUTE_PURE); # endif _GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n)); # endif _GL_CXXALIASWARN (wcswidth); #elif defined GNULIB_POSIXCHECK # undef wcswidth # if HAVE_RAW_DECL_WCSWIDTH _GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - " "use gnulib module wcswidth for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_WCHAR_H */ #endif /* _@GUARD_PREFIX@_WCHAR_H */ #endif shishi-1.0.2/gl/md5.c0000644000000000000000000003556512126660053011142 00000000000000/* Functions to compute MD5 message digest of files or memory blocks. according to the definition of MD5 in RFC 1321 from April 1992. Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, 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 . */ /* Written by Ulrich Drepper , 1995. */ #include #include "md5.h" #include #include #include #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifdef _LIBC # include # if __BYTE_ORDER == __BIG_ENDIAN # define WORDS_BIGENDIAN 1 # endif /* We need to keep the namespace clean so define the MD5 function protected using leading __ . */ # define md5_init_ctx __md5_init_ctx # define md5_process_block __md5_process_block # define md5_process_bytes __md5_process_bytes # define md5_finish_ctx __md5_finish_ctx # define md5_read_ctx __md5_read_ctx # define md5_stream __md5_stream # define md5_buffer __md5_buffer #endif #ifdef WORDS_BIGENDIAN # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else # define SWAP(n) (n) #endif #define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1321, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Initialize structure containing state of computation. (RFC 1321, 3.3: Step 3) */ void md5_init_ctx (struct md5_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Copy the 4 byte value from v into the memory location pointed to by *cp, If your architecture allows unaligned access this is equivalent to * (uint32_t *) cp = v */ static void set_uint32 (char *cp, uint32_t v) { memcpy (cp, &v, sizeof v); } /* Put result from CTX in first 16 bytes following RESBUF. The result must be in little endian byte order. */ void * md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) { char *r = resbuf; set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A)); set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B)); set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C)); set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D)); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. */ void * md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3); ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); /* Process last bytes. */ md5_process_block (ctx->buffer, size * 4, ctx); return md5_read_ctx (ctx, resbuf); } /* Compute MD5 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ int md5_stream (FILE *stream, void *resblock) { struct md5_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ md5_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ md5_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block: /* Process any remaining bytes. */ if (sum > 0) md5_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ md5_finish_ctx (&ctx, resblock); free (buffer); return 0; } /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ void * md5_buffer (const char *buffer, size_t len, void *resblock) { struct md5_ctx ctx; /* Initialize the computation context. */ md5_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ md5_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return md5_finish_ctx (&ctx, resblock); } void md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { md5_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { md5_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* These are the four functions used in the four steps of the MD5 algorithm and defined in the RFC 1321. The first function is a little bit optimized (as found in Colin Plumbs public domain implementation). */ /* #define FF(b, c, d) ((b & c) | (~b & d)) */ #define FF(b, c, d) (d ^ (b & (c ^ d))) #define FG(b, c, d) FF (d, b, c) #define FH(b, c, d) (b ^ c ^ d) #define FI(b, c, d) (c ^ (b | ~d)) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. */ void md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) { uint32_t correct_words[16]; const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t A = ctx->A; uint32_t B = ctx->B; uint32_t C = ctx->C; uint32_t D = ctx->D; uint32_t lolen = len; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += lolen; ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen); /* Process all bytes in the buffer with 64 bytes in each round of the loop. */ while (words < endp) { uint32_t *cwp = correct_words; uint32_t A_save = A; uint32_t B_save = B; uint32_t C_save = C; uint32_t D_save = D; /* First round: using the given function, the context and a constant the next context is computed. Because the algorithms processing unit is a 32-bit word and it is determined to work on words in little endian byte order we perhaps have to change the byte order before the computation. To reduce the work for the next steps we store the swapped words in the array CORRECT_WORDS. */ #define OP(a, b, c, d, s, T) \ do \ { \ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ ++words; \ CYCLIC (a, s); \ a += b; \ } \ while (0) /* It is unfortunate that C does not provide an operator for cyclic rotation. Hope the C compiler is smart enough. */ #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) /* Before we start, one word to the strange constants. They are defined in RFC 1321 as T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 Here is an equivalent invocation using Perl: perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}' */ /* Round 1. */ OP (A, B, C, D, 7, 0xd76aa478); OP (D, A, B, C, 12, 0xe8c7b756); OP (C, D, A, B, 17, 0x242070db); OP (B, C, D, A, 22, 0xc1bdceee); OP (A, B, C, D, 7, 0xf57c0faf); OP (D, A, B, C, 12, 0x4787c62a); OP (C, D, A, B, 17, 0xa8304613); OP (B, C, D, A, 22, 0xfd469501); OP (A, B, C, D, 7, 0x698098d8); OP (D, A, B, C, 12, 0x8b44f7af); OP (C, D, A, B, 17, 0xffff5bb1); OP (B, C, D, A, 22, 0x895cd7be); OP (A, B, C, D, 7, 0x6b901122); OP (D, A, B, C, 12, 0xfd987193); OP (C, D, A, B, 17, 0xa679438e); OP (B, C, D, A, 22, 0x49b40821); /* For the second to fourth round we have the possibly swapped words in CORRECT_WORDS. Redefine the macro to take an additional first argument specifying the function to use. */ #undef OP #define OP(f, a, b, c, d, k, s, T) \ do \ { \ a += f (b, c, d) + correct_words[k] + T; \ CYCLIC (a, s); \ a += b; \ } \ while (0) /* Round 2. */ OP (FG, A, B, C, D, 1, 5, 0xf61e2562); OP (FG, D, A, B, C, 6, 9, 0xc040b340); OP (FG, C, D, A, B, 11, 14, 0x265e5a51); OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); OP (FG, A, B, C, D, 5, 5, 0xd62f105d); OP (FG, D, A, B, C, 10, 9, 0x02441453); OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); OP (FG, D, A, B, C, 14, 9, 0xc33707d6); OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); OP (FG, B, C, D, A, 8, 20, 0x455a14ed); OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); OP (FG, C, D, A, B, 7, 14, 0x676f02d9); OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); /* Round 3. */ OP (FH, A, B, C, D, 5, 4, 0xfffa3942); OP (FH, D, A, B, C, 8, 11, 0x8771f681); OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); OP (FH, B, C, D, A, 14, 23, 0xfde5380c); OP (FH, A, B, C, D, 1, 4, 0xa4beea44); OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); OP (FH, B, C, D, A, 6, 23, 0x04881d05); OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); /* Round 4. */ OP (FI, A, B, C, D, 0, 6, 0xf4292244); OP (FI, D, A, B, C, 7, 10, 0x432aff97); OP (FI, C, D, A, B, 14, 15, 0xab9423a7); OP (FI, B, C, D, A, 5, 21, 0xfc93a039); OP (FI, A, B, C, D, 12, 6, 0x655b59c3); OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); OP (FI, C, D, A, B, 10, 15, 0xffeff47d); OP (FI, B, C, D, A, 1, 21, 0x85845dd1); OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); OP (FI, C, D, A, B, 6, 15, 0xa3014314); OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); OP (FI, A, B, C, D, 4, 6, 0xf7537e82); OP (FI, D, A, B, C, 11, 10, 0xbd3af235); OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); OP (FI, B, C, D, A, 9, 21, 0xeb86d391); /* Add the starting values of the context. */ A += A_save; B += B_save; C += C_save; D += D_save; } /* Put checksum in context given as argument. */ ctx->A = A; ctx->B = B; ctx->C = C; ctx->D = D; } shishi-1.0.2/gl/fd-hook.h0000644000000000000000000001135112126660051011772 00000000000000/* Hook for making making file descriptor functions close(), ioctl() extensible. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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 . */ #ifndef FD_HOOK_H #define FD_HOOK_H #ifdef __cplusplus extern "C" { #endif /* Currently, this entire code is only needed for the handling of sockets on native Windows platforms. */ #if WINDOWS_SOCKETS /* Type of function that closes FD. */ typedef int (*gl_close_fn) (int fd); /* Type of function that applies a control request to FD. */ typedef int (*gl_ioctl_fn) (int fd, int request, void *arg); /* An element of the list of file descriptor hooks. In CLOS (Common Lisp Object System) speak, it consists of an "around" method for the close() function and an "around" method for the ioctl() function. The fields of this structure are considered private. */ struct fd_hook { /* Doubly linked list. */ struct fd_hook *private_next; struct fd_hook *private_prev; /* Function that treats the types of FD that it knows about and calls execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback. */ int (*private_close_fn) (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Function that treats the types of FD that it knows about and calls execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a fallback. */ int (*private_ioctl_fn) (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); }; /* This type of function closes FD, applying special knowledge for the FD types it knows about, and calls execute_close_hooks (REMAINING_LIST, PRIMARY, FD) for the other FD types. In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, and PRIMARY is the "primary" method for close(). */ typedef int (*close_hook_fn) (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method. Return 0 or -1, like close() would do. */ extern int execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary, int fd); /* Execute all close hooks, with PRIMARY as "primary" method. Return 0 or -1, like close() would do. */ extern int execute_all_close_hooks (gl_close_fn primary, int fd); /* This type of function applies a control request to FD, applying special knowledge for the FD types it knows about, and calls execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) for the other FD types. In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, and PRIMARY is the "primary" method for ioctl(). */ typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); /* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method. Return 0 or -1, like ioctl() would do. */ extern int execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg); /* Execute all ioctl hooks, with PRIMARY as "primary" method. Return 0 or -1, like ioctl() would do. */ extern int execute_all_ioctl_hooks (gl_ioctl_fn primary, int fd, int request, void *arg); /* Add a function pair to the list of file descriptor hooks. CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change. The LINK variable points to a piece of memory which is guaranteed to be accessible until the corresponding call to unregister_fd_hook. */ extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link); /* Removes a hook from the list of file descriptor hooks. */ extern void unregister_fd_hook (struct fd_hook *link); #endif #ifdef __cplusplus } #endif #endif /* FD_HOOK_H */ shishi-1.0.2/gl/shutdown.c0000644000000000000000000000234412126660053012315 00000000000000/* shutdown.c --- wrappers for Windows shutdown function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef shutdown int rpl_shutdown (int fd, int how) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int r = shutdown (sock, how); if (r < 0) set_winsock_errno (); return r; } } shishi-1.0.2/gl/ftell.c0000644000000000000000000000215512126660051011546 00000000000000/* An ftell() function that works around platform bugs. Copyright (C) 2007-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include #include #include long ftell (FILE *fp) { /* Use the replacement ftello function with all its workarounds. */ off_t offset = ftello (fp); if (LONG_MIN <= offset && offset <= LONG_MAX) return /* (long) */ offset; else { errno = EOVERFLOW; return -1; } } shishi-1.0.2/gl/time_r.c0000644000000000000000000000227312126660054011723 00000000000000/* Reentrant time functions like localtime_r. Copyright (C) 2003, 2006-2007, 2010-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Paul Eggert. */ #include #include static struct tm * copy_tm_result (struct tm *dest, struct tm const *src) { if (! src) return 0; *dest = *src; return dest; } struct tm * gmtime_r (time_t const * restrict t, struct tm * restrict tp) { return copy_tm_result (tp, gmtime (t)); } struct tm * localtime_r (time_t const * restrict t, struct tm * restrict tp) { return copy_tm_result (tp, localtime (t)); } shishi-1.0.2/gl/stat.c0000644000000000000000000001066612126660053011423 00000000000000/* Work around platform bugs in stat. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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 . */ /* written by Eric Blake */ /* If the user's config.h happens to include , let it include only the system's here, so that orig_stat doesn't recurse to rpl_stat. */ #define __need_system_sys_stat_h #include /* Get the original definition of stat. It might be defined as a macro. */ #include #include #undef __need_system_sys_stat_h #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # if _GL_WINDOWS_64_BIT_ST_SIZE # undef stat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */ # define stat _stati64 # define REPLACE_FUNC_STAT_DIR 1 # undef REPLACE_FUNC_STAT_FILE # elif REPLACE_FUNC_STAT_FILE /* mingw64 has a broken stat() function, based on _stat(), in libmingwex.a. Bypass it. */ # define stat _stat # define REPLACE_FUNC_STAT_DIR 1 # undef REPLACE_FUNC_STAT_FILE # endif #endif static int orig_stat (const char *filename, struct stat *buf) { return stat (filename, buf); } /* Specification. */ /* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates this include because of the preliminary #include above. */ #include "sys/stat.h" #include #include #include #include #include "dosname.h" #include "verify.h" #if REPLACE_FUNC_STAT_DIR # include "pathmax.h" /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also have a constant PATH_MAX. */ # ifndef PATH_MAX # error "Please port this replacement to your platform" # endif #endif /* Store information about NAME into ST. Work around bugs with trailing slashes. Mingw has other bugs (such as st_ino always being 0 on success) which this wrapper does not work around. But at least this implementation provides the ability to emulate fchdir correctly. */ int rpl_stat (char const *name, struct stat *st) { int result = orig_stat (name, st); #if REPLACE_FUNC_STAT_FILE /* Solaris 9 mistakenly succeeds when given a non-directory with a trailing slash. */ if (result == 0 && !S_ISDIR (st->st_mode)) { size_t len = strlen (name); if (ISSLASH (name[len - 1])) { errno = ENOTDIR; return -1; } } #endif /* REPLACE_FUNC_STAT_FILE */ #if REPLACE_FUNC_STAT_DIR if (result == -1 && errno == ENOENT) { /* Due to mingw's oddities, there are some directories (like c:\) where stat() only succeeds with a trailing slash, and other directories (like c:\windows) where stat() only succeeds without a trailing slash. But we want the two to be synonymous, since chdir() manages either style. Likewise, Mingw also reports ENOENT for names longer than PATH_MAX, when we want ENAMETOOLONG, and for stat("file/"), when we want ENOTDIR. Fortunately, mingw PATH_MAX is small enough for stack allocation. */ char fixed_name[PATH_MAX + 1] = {0}; size_t len = strlen (name); bool check_dir = false; verify (PATH_MAX <= 4096); if (PATH_MAX <= len) errno = ENAMETOOLONG; else if (len) { strcpy (fixed_name, name); if (ISSLASH (fixed_name[len - 1])) { check_dir = true; while (len && ISSLASH (fixed_name[len - 1])) fixed_name[--len] = '\0'; if (!len) fixed_name[0] = '/'; } else fixed_name[len++] = '/'; result = orig_stat (fixed_name, st); if (result == 0 && check_dir && !S_ISDIR (st->st_mode)) { result = -1; errno = ENOTDIR; } } } #endif /* REPLACE_FUNC_STAT_DIR */ return result; } shishi-1.0.2/gl/xmalloc.c0000644000000000000000000000646712126660054012114 00000000000000/* xmalloc.c -- malloc with out of memory checking Copyright (C) 1990-2000, 2002-2006, 2008-2013 Free Software Foundation, Inc. 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 . */ #include #define XALLOC_INLINE _GL_EXTERN_INLINE #include "xalloc.h" #include #include /* 1 if calloc is known to be compatible with GNU calloc. This matters if we are not also using the calloc module, which defines HAVE_CALLOC_GNU and supports the GNU API even on non-GNU platforms. */ #if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__) enum { HAVE_GNU_CALLOC = 1 }; #else enum { HAVE_GNU_CALLOC = 0 }; #endif /* Allocate N bytes of memory dynamically, with error checking. */ void * xmalloc (size_t n) { void *p = malloc (n); if (!p && n != 0) xalloc_die (); return p; } /* Change the size of an allocated block of memory P to N bytes, with error checking. */ void * xrealloc (void *p, size_t n) { if (!n && p) { /* The GNU and C99 realloc behaviors disagree here. Act like GNU, even if the underlying realloc is C99. */ free (p); return NULL; } p = realloc (p, n); if (!p && n) xalloc_die (); return p; } /* If P is null, allocate a block of at least *PN bytes; otherwise, reallocate P so that it contains more than *PN bytes. *PN must be nonzero unless P is null. Set *PN to the new block's size, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. */ void * x2realloc (void *p, size_t *pn) { return x2nrealloc (p, pn, 1); } /* Allocate S bytes of zeroed memory dynamically, with error checking. There's no need for xnzalloc (N, S), since it would be equivalent to xcalloc (N, S). */ void * xzalloc (size_t s) { return memset (xmalloc (s), 0, s); } /* Allocate zeroed memory for N elements of S bytes, with error checking. S must be nonzero. */ void * xcalloc (size_t n, size_t s) { void *p; /* Test for overflow, since some calloc implementations don't have proper overflow checks. But omit overflow and size-zero tests if HAVE_GNU_CALLOC, since GNU calloc catches overflow and never returns NULL if successful. */ if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s)) || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) xalloc_die (); return p; } /* Clone an object P of size S, with error checking. There's no need for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any need for an arithmetic overflow check. */ void * xmemdup (void const *p, size_t s) { return memcpy (xmalloc (s), p, s); } /* Clone STRING. */ char * xstrdup (char const *string) { return xmemdup (string, strlen (string) + 1); } shishi-1.0.2/gl/hmac.h0000644000000000000000000000300312126660051011346 00000000000000/* hmac.h -- hashed message authentication codes Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #ifndef HMAC_H # define HMAC_H 1 #include /* Compute Hashed Message Authentication Code with MD5, as described in RFC 2104, over BUFFER data of BUFLEN bytes using the KEY of KEYLEN bytes, writing the output to pre-allocated 16 byte minimum RESBUF buffer. Return 0 on success. */ int hmac_md5 (const void *key, size_t keylen, const void *buffer, size_t buflen, void *resbuf); /* Compute Hashed Message Authentication Code with SHA-1, over BUFFER data of BUFLEN bytes using the KEY of KEYLEN bytes, writing the output to pre-allocated 20 byte minimum RESBUF buffer. Return 0 on success. */ int hmac_sha1 (const void *key, size_t keylen, const void *in, size_t inlen, void *resbuf); #endif /* HMAC_H */ shishi-1.0.2/gl/realloc.c0000644000000000000000000000407012126660053012061 00000000000000/* realloc() function that is glibc compatible. Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* written by Jim Meyering and Bruno Haible */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */ #ifdef realloc # define NEED_REALLOC_GNU 1 /* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU. */ #elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU # define NEED_REALLOC_GNU 1 #endif /* Infer the properties of the system's malloc function. The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ #if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU # define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1 #endif #include #include /* Change the size of an allocated block of memory P to N bytes, with error checking. If N is zero, change it to 1. If P is NULL, use malloc. */ void * rpl_realloc (void *p, size_t n) { void *result; #if NEED_REALLOC_GNU if (n == 0) { n = 1; /* In theory realloc might fail, so don't rely on it to free. */ free (p); p = NULL; } #endif if (p == NULL) { #if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE if (n == 0) n = 1; #endif result = malloc (n); } else result = realloc (p, n); #if !HAVE_REALLOC_POSIX if (result == NULL) errno = ENOMEM; #endif return result; } shishi-1.0.2/gl/float.in.h0000644000000000000000000001673412126660051012167 00000000000000/* A correct . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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 . */ #ifndef _@GUARD_PREFIX@_FLOAT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_FLOAT_H@ #ifndef _@GUARD_PREFIX@_FLOAT_H #define _@GUARD_PREFIX@_FLOAT_H /* 'long double' properties. */ #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) /* Number of mantissa units, in base FLT_RADIX. */ # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 64 /* Number of decimal digits that is sufficient for representing a number. */ # undef LDBL_DIG # define LDBL_DIG 18 /* x-1 where x is the smallest representable number > 1. */ # undef LDBL_EPSILON # define LDBL_EPSILON 1.0842021724855044340E-19L /* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) /* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */ # undef LDBL_MAX_EXP # define LDBL_MAX_EXP 16384 /* Minimum positive normalized number. */ # undef LDBL_MIN # define LDBL_MIN 3.3621031431120935063E-4932L /* Maximum representable finite number. */ # undef LDBL_MAX # define LDBL_MAX 1.1897314953572317650E+4932L /* Minimum e such that 10^e is in the range of normalized numbers. */ # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP (-4931) /* Maximum e such that 10^e is in the range of representable finite numbers. */ # undef LDBL_MAX_10_EXP # define LDBL_MAX_10_EXP 4932 #endif /* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of precision in the compiler but 64 bits of precision at runtime. See . */ #if defined __i386__ && defined __FreeBSD__ /* Number of mantissa units, in base FLT_RADIX. */ # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 64 /* Number of decimal digits that is sufficient for representing a number. */ # undef LDBL_DIG # define LDBL_DIG 18 /* x-1 where x is the smallest representable number > 1. */ # undef LDBL_EPSILON # define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */ /* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP (-16381) /* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */ # undef LDBL_MAX_EXP # define LDBL_MAX_EXP 16384 /* Minimum positive normalized number. */ # undef LDBL_MIN # define LDBL_MIN 3.3621031431120935E-4932L /* = 0x1p-16382L */ /* Maximum representable finite number. */ # undef LDBL_MAX /* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }. But the largest literal that GCC allows us to write is 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }. So, define it like this through a reference to an external variable const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }; extern const long double LDBL_MAX; Unfortunately, this is not a constant expression. */ union gl_long_double_union { struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd; long double ld; }; extern const union gl_long_double_union gl_LDBL_MAX; # define LDBL_MAX (gl_LDBL_MAX.ld) /* Minimum e such that 10^e is in the range of normalized numbers. */ # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP (-4931) /* Maximum e such that 10^e is in the range of representable finite numbers. */ # undef LDBL_MAX_10_EXP # define LDBL_MAX_10_EXP 4932 #endif /* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are wrong. On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */ #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP DBL_MIN_10_EXP # undef LDBL_MIN # define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ #endif #if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ # undef LDBL_MAX /* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }. It is not easy to define: #define LDBL_MAX 1.79769313486231580793728971405302307166e308L is too small, whereas #define LDBL_MAX 1.79769313486231580793728971405302307167e308L is too large. Apparently a bug in GCC decimal-to-binary conversion. Also, I can't get values larger than #define LDBL63 ((long double) (1ULL << 63)) #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL) which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }. So, define it like this through a reference to an external variable const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }; extern const long double LDBL_MAX; or through a pointer cast #define LDBL_MAX \ (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }) Unfortunately, this is not a constant expression, and the latter expression does not work well when GCC is optimizing.. */ union gl_long_double_union { struct { double hi; double lo; } dd; long double ld; }; extern const union gl_long_double_union gl_LDBL_MAX; # define LDBL_MAX (gl_LDBL_MAX.ld) #endif /* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong. On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON are wrong. */ #if defined __sgi && (LDBL_MANT_DIG >= 106) # undef LDBL_MANT_DIG # define LDBL_MANT_DIG 106 # if defined __GNUC__ # undef LDBL_MIN_EXP # define LDBL_MIN_EXP DBL_MIN_EXP # undef LDBL_MIN_10_EXP # define LDBL_MIN_10_EXP DBL_MIN_10_EXP # undef LDBL_MIN # define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ # undef LDBL_EPSILON # define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */ # endif #endif #if @REPLACE_ITOLD@ /* Pull in a function that fixes the 'int' to 'long double' conversion of glibc 2.7. */ extern # ifdef __cplusplus "C" # endif void _Qp_itoq (long double *, int); static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq; #endif #endif /* _@GUARD_PREFIX@_FLOAT_H */ #endif /* _@GUARD_PREFIX@_FLOAT_H */ shishi-1.0.2/gl/recvfrom.c0000644000000000000000000000323212126660053012262 00000000000000/* recvfrom.c --- wrappers for Windows recvfrom function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef recvfrom ssize_t rpl_recvfrom (int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int frombufsize = (from != NULL ? *fromlen : 0); int r = recvfrom (sock, buf, len, flags, from, fromlen); if (r < 0) set_winsock_errno (); /* Winsock recvfrom() only returns a valid 'from' when the socket is connectionless. POSIX gives a valid 'from' for all types of sockets. */ else if (from != NULL && *fromlen == frombufsize) rpl_getpeername (fd, from, fromlen); return r; } } shishi-1.0.2/gl/parse-datetime.h0000644000000000000000000000161712126660053013355 00000000000000/* Parse a string into an internal time stamp. Copyright (C) 1995, 1997-1998, 2003-2004, 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #include #include bool parse_datetime (struct timespec *, char const *, struct timespec const *); shishi-1.0.2/gl/gettext.h0000644000000000000000000001033312126660225012131 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # undef gettext # define gettext(Msgid) ((const char *) (Msgid)) # undef dgettext # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # undef dcgettext # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # undef dngettext # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # undef dcngettext # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) # undef textdomain # define textdomain(Domainname) ((const char *) (Domainname)) # undef bindtextdomain # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # undef bind_textdomain_codeset # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* Prefer gnulib's setlocale override over libintl's setlocale override. */ #ifdef GNULIB_defined_setlocale # undef setlocale # define setlocale rpl_setlocale #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ shishi-1.0.2/gl/strings.in.h0000644000000000000000000000765612126660054012561 00000000000000/* A substitute . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_STRINGS_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* Minix 3.1.8 has a bug: must be included before . But avoid namespace pollution on glibc systems. */ #if defined __minix && !defined __GLIBC__ # include #endif /* The include_next requires a split double-inclusion guard. */ #if @HAVE_STRINGS_H@ # @INCLUDE_NEXT@ @NEXT_STRINGS_H@ #endif #ifndef _@GUARD_PREFIX@_STRINGS_H #define _@GUARD_PREFIX@_STRINGS_H #if ! @HAVE_DECL_STRNCASECMP@ /* Get size_t. */ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #ifdef __cplusplus extern "C" { #endif /* Find the index of the least-significant set bit. */ #if @GNULIB_FFS@ # if !@HAVE_FFS@ _GL_FUNCDECL_SYS (ffs, int, (int i)); # endif _GL_CXXALIAS_SYS (ffs, int, (int i)); _GL_CXXALIASWARN (ffs); #elif defined GNULIB_POSIXCHECK # undef ffs # if HAVE_RAW_DECL_FFS _GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module"); # endif #endif /* Compare strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function does not work in multibyte locales. */ #if ! @HAVE_STRCASECMP@ extern int strcasecmp (char const *s1, char const *s2) _GL_ARG_NONNULL ((1, 2)); #endif #if defined GNULIB_POSIXCHECK /* strcasecmp() does not work with multibyte strings: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strcasecmp # if HAVE_RAW_DECL_STRCASECMP _GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character " "strings in multibyte locales - " "use mbscasecmp if you care about " "internationalization, or use c_strcasecmp , " "gnulib module c-strcase) if you want a locale " "independent function"); # endif #endif /* Compare no more than N bytes of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function cannot work correctly in multibyte locales. */ #if ! @HAVE_DECL_STRNCASECMP@ extern int strncasecmp (char const *s1, char const *s2, size_t n) _GL_ARG_NONNULL ((1, 2)); #endif #if defined GNULIB_POSIXCHECK /* strncasecmp() does not work with multibyte strings: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strncasecmp # if HAVE_RAW_DECL_STRNCASECMP _GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character " "strings in multibyte locales - " "use mbsncasecmp or mbspcasecmp if you care about " "internationalization, or use c_strncasecmp , " "gnulib module c-strcase) if you want a locale " "independent function"); # endif #endif #ifdef __cplusplus } #endif #endif /* _@GUARD_PREFIX@_STRING_H */ #endif /* _@GUARD_PREFIX@_STRING_H */ shishi-1.0.2/gl/sha1.c0000644000000000000000000003177612126660053011311 00000000000000/* sha1.c - Functions to compute SHA1 message digest of files or memory blocks according to the NIST specification FIPS-180-1. Copyright (C) 2000-2001, 2003-2006, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Scott G. Miller Credits: Robert Klep -- Expansion function fix */ #include #include "sha1.h" #include #include #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifdef WORDS_BIGENDIAN # define SWAP(n) (n) #else # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #endif #define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1321, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Take a pointer to a 160 bit block of data (five 32 bit ints) and initialize it to the start constants of the SHA1 algorithm. This must be called before using hash in the call to sha1_hash. */ void sha1_init_ctx (struct sha1_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->E = 0xc3d2e1f0; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Copy the 4 byte value from v into the memory location pointed to by *cp, If your architecture allows unaligned access this is equivalent to * (uint32_t *) cp = v */ static void set_uint32 (char *cp, uint32_t v) { memcpy (cp, &v, sizeof v); } /* Put result from CTX in first 20 bytes following RESBUF. The result must be in little endian byte order. */ void * sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) { char *r = resbuf; set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A)); set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B)); set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C)); set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D)); set_uint32 (r + 4 * sizeof ctx->E, SWAP (ctx->E)); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. */ void * sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); /* Process last bytes. */ sha1_process_block (ctx->buffer, size * 4, ctx); return sha1_read_ctx (ctx, resbuf); } /* Compute SHA1 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ int sha1_stream (FILE *stream, void *resblock) { struct sha1_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ sha1_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ sha1_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block:; /* Process any remaining bytes. */ if (sum > 0) sha1_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ sha1_finish_ctx (&ctx, resblock); free (buffer); return 0; } /* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ void * sha1_buffer (const char *buffer, size_t len, void *resblock) { struct sha1_ctx ctx; /* Initialize the computation context. */ sha1_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ sha1_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return sha1_finish_ctx (&ctx, resblock); } void sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { sha1_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { sha1_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between md5.c and sha1.c --- */ /* SHA1 round constants */ #define K1 0x5a827999 #define K2 0x6ed9eba1 #define K3 0x8f1bbcdc #define K4 0xca62c1d6 /* Round functions. Note that F2 is the same as F4. */ #define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) ) #define F2(B,C,D) (B ^ C ^ D) #define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) ) #define F4(B,C,D) (B ^ C ^ D) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. Most of this code comes from GnuPG's cipher/sha1.c. */ void sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) { const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t x[16]; uint32_t a = ctx->A; uint32_t b = ctx->B; uint32_t c = ctx->C; uint32_t d = ctx->D; uint32_t e = ctx->E; uint32_t lolen = len; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += lolen; ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen); #define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n)))) #define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \ ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \ , (x[I&0x0f] = rol(tm, 1)) ) #define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \ + F( B, C, D ) \ + K \ + M; \ B = rol( B, 30 ); \ } while(0) while (words < endp) { uint32_t tm; int t; for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } R( a, b, c, d, e, F1, K1, x[ 0] ); R( e, a, b, c, d, F1, K1, x[ 1] ); R( d, e, a, b, c, F1, K1, x[ 2] ); R( c, d, e, a, b, F1, K1, x[ 3] ); R( b, c, d, e, a, F1, K1, x[ 4] ); R( a, b, c, d, e, F1, K1, x[ 5] ); R( e, a, b, c, d, F1, K1, x[ 6] ); R( d, e, a, b, c, F1, K1, x[ 7] ); R( c, d, e, a, b, F1, K1, x[ 8] ); R( b, c, d, e, a, F1, K1, x[ 9] ); R( a, b, c, d, e, F1, K1, x[10] ); R( e, a, b, c, d, F1, K1, x[11] ); R( d, e, a, b, c, F1, K1, x[12] ); R( c, d, e, a, b, F1, K1, x[13] ); R( b, c, d, e, a, F1, K1, x[14] ); R( a, b, c, d, e, F1, K1, x[15] ); R( e, a, b, c, d, F1, K1, M(16) ); R( d, e, a, b, c, F1, K1, M(17) ); R( c, d, e, a, b, F1, K1, M(18) ); R( b, c, d, e, a, F1, K1, M(19) ); R( a, b, c, d, e, F2, K2, M(20) ); R( e, a, b, c, d, F2, K2, M(21) ); R( d, e, a, b, c, F2, K2, M(22) ); R( c, d, e, a, b, F2, K2, M(23) ); R( b, c, d, e, a, F2, K2, M(24) ); R( a, b, c, d, e, F2, K2, M(25) ); R( e, a, b, c, d, F2, K2, M(26) ); R( d, e, a, b, c, F2, K2, M(27) ); R( c, d, e, a, b, F2, K2, M(28) ); R( b, c, d, e, a, F2, K2, M(29) ); R( a, b, c, d, e, F2, K2, M(30) ); R( e, a, b, c, d, F2, K2, M(31) ); R( d, e, a, b, c, F2, K2, M(32) ); R( c, d, e, a, b, F2, K2, M(33) ); R( b, c, d, e, a, F2, K2, M(34) ); R( a, b, c, d, e, F2, K2, M(35) ); R( e, a, b, c, d, F2, K2, M(36) ); R( d, e, a, b, c, F2, K2, M(37) ); R( c, d, e, a, b, F2, K2, M(38) ); R( b, c, d, e, a, F2, K2, M(39) ); R( a, b, c, d, e, F3, K3, M(40) ); R( e, a, b, c, d, F3, K3, M(41) ); R( d, e, a, b, c, F3, K3, M(42) ); R( c, d, e, a, b, F3, K3, M(43) ); R( b, c, d, e, a, F3, K3, M(44) ); R( a, b, c, d, e, F3, K3, M(45) ); R( e, a, b, c, d, F3, K3, M(46) ); R( d, e, a, b, c, F3, K3, M(47) ); R( c, d, e, a, b, F3, K3, M(48) ); R( b, c, d, e, a, F3, K3, M(49) ); R( a, b, c, d, e, F3, K3, M(50) ); R( e, a, b, c, d, F3, K3, M(51) ); R( d, e, a, b, c, F3, K3, M(52) ); R( c, d, e, a, b, F3, K3, M(53) ); R( b, c, d, e, a, F3, K3, M(54) ); R( a, b, c, d, e, F3, K3, M(55) ); R( e, a, b, c, d, F3, K3, M(56) ); R( d, e, a, b, c, F3, K3, M(57) ); R( c, d, e, a, b, F3, K3, M(58) ); R( b, c, d, e, a, F3, K3, M(59) ); R( a, b, c, d, e, F4, K4, M(60) ); R( e, a, b, c, d, F4, K4, M(61) ); R( d, e, a, b, c, F4, K4, M(62) ); R( c, d, e, a, b, F4, K4, M(63) ); R( b, c, d, e, a, F4, K4, M(64) ); R( a, b, c, d, e, F4, K4, M(65) ); R( e, a, b, c, d, F4, K4, M(66) ); R( d, e, a, b, c, F4, K4, M(67) ); R( c, d, e, a, b, F4, K4, M(68) ); R( b, c, d, e, a, F4, K4, M(69) ); R( a, b, c, d, e, F4, K4, M(70) ); R( e, a, b, c, d, F4, K4, M(71) ); R( d, e, a, b, c, F4, K4, M(72) ); R( c, d, e, a, b, F4, K4, M(73) ); R( b, c, d, e, a, F4, K4, M(74) ); R( a, b, c, d, e, F4, K4, M(75) ); R( e, a, b, c, d, F4, K4, M(76) ); R( d, e, a, b, c, F4, K4, M(77) ); R( c, d, e, a, b, F4, K4, M(78) ); R( b, c, d, e, a, F4, K4, M(79) ); a = ctx->A += a; b = ctx->B += b; c = ctx->C += c; d = ctx->D += d; e = ctx->E += e; } } shishi-1.0.2/gl/asprintf.c0000644000000000000000000000210112126660051012255 00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #ifdef IN_LIBASPRINTF # include "vasprintf.h" #else # include #endif #include int asprintf (char **resultp, const char *format, ...) { va_list args; int result; va_start (args, format); result = vasprintf (resultp, format, args); va_end (args); return result; } shishi-1.0.2/gl/crc.c0000644000000000000000000001140212126660051011202 00000000000000/* crc.c -- cyclic redundancy checks Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #include #include "crc.h" /* Table of CRCs of all 8-bit messages. Generated by running code from RFC 1952 modified to print out the table. */ static const uint32_t crc32_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; /* * The following function was extracted from RFC 1952 by Simon * Josefsson. It was modified to avoid initial and final XOR, to use * size_t for the buffer length, and to use the const keyword. */ uint32_t crc32_update_no_xor (uint32_t crc, const char *buf, size_t len) { size_t n; for (n = 0; n < len; n++) crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8); return crc; } uint32_t crc32_no_xor (const char *buf, size_t len) { return crc32_update_no_xor (0L, buf, len); } uint32_t crc32_update (uint32_t crc, const char *buf, size_t len) { return crc32_update_no_xor (crc ^ 0xffffffff, buf, len) ^ 0xffffffff; } uint32_t crc32 (const char *buf, size_t len) { return crc32_update (0L, buf, len); } shishi-1.0.2/gl/xstrndup.c0000644000000000000000000000224512126660054012332 00000000000000/* Duplicate a bounded initial segment of a string, with out-of-memory checking. Copyright (C) 2003, 2006-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include "xstrndup.h" #include #include "xalloc.h" /* Return a newly allocated copy of at most N bytes of STRING. In other words, return a copy of the initial segment of length N of STRING. */ char * xstrndup (const char *string, size_t n) { char *s = strndup (string, n); if (! s) xalloc_die (); return s; } shishi-1.0.2/gl/socket.c0000644000000000000000000000256412126660053011736 00000000000000/* socket.c --- wrappers for Windows socket function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #include "sockets.h" int rpl_socket (int domain, int type, int protocol) { SOCKET fh; gl_sockets_startup (SOCKETS_1_1); /* We have to use WSASocket() to create non-overlapped IO sockets. Overlapped IO sockets cannot be used with read/write. */ fh = WSASocket (domain, type, protocol, NULL, 0, 0); if (fh == INVALID_SOCKET) { set_winsock_errno (); return -1; } else return SOCKET_TO_FD (fh); } shishi-1.0.2/gl/msvc-nothrow.h0000644000000000000000000000301012126660053013104 00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _MSVC_NOTHROW_H #define _MSVC_NOTHROW_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines wrappers that turn such an invalid parameter notification into an error code. */ #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get original declaration of _get_osfhandle. */ # include # if HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Override _get_osfhandle. */ extern intptr_t _gl_nothrow_get_osfhandle (int fd); # define _get_osfhandle _gl_nothrow_get_osfhandle # endif #endif #endif /* _MSVC_NOTHROW_H */ shishi-1.0.2/gl/close.c0000644000000000000000000000270712126660051011550 00000000000000/* close replacement. Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include #include #include "fd-hook.h" #include "msvc-inval.h" #undef close #if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int close_nothrow (int fd) { int result; TRY_MSVC_INVAL { result = close (fd); } CATCH_MSVC_INVAL { result = -1; errno = EBADF; } DONE_MSVC_INVAL; return result; } #else # define close_nothrow close #endif /* Override close() to call into other gnulib modules. */ int rpl_close (int fd) { #if WINDOWS_SOCKETS int retval = execute_all_close_hooks (close_nothrow, fd); #else int retval = close_nothrow (fd); #endif #if REPLACE_FCHDIR if (retval >= 0) _gl_unregister_fd (fd); #endif return retval; } shishi-1.0.2/gl/malloca.h0000644000000000000000000001103712126660053012056 00000000000000/* Safe automatic memory allocation. Copyright (C) 2003-2007, 2009-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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, 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 . */ #ifndef _MALLOCA_H #define _MALLOCA_H #include #include #include #ifdef __cplusplus extern "C" { #endif /* safe_alloca(N) is equivalent to alloca(N) when it is safe to call alloca(N); otherwise it returns NULL. It either returns N bytes of memory allocated on the stack, that lasts until the function returns, or NULL. Use of safe_alloca should be avoided: - inside arguments of function calls - undefined behaviour, - in inline functions - the allocation may actually last until the calling function returns. */ #if HAVE_ALLOCA /* The OS usually guarantees only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely allocate anything larger than 4096 bytes. Also care for the possibility of a few compiler-allocated temporary stack slots. This must be a macro, not a function. */ # define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL) #else # define safe_alloca(N) ((void) (N), NULL) #endif /* malloca(N) is a safe variant of alloca(N). It allocates N bytes of memory allocated on the stack, that must be freed using freea() before the function returns. Upon failure, it returns NULL. */ #if HAVE_ALLOCA # define malloca(N) \ ((N) < 4032 - sa_increment \ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \ : mmalloca (N)) #else # define malloca(N) \ mmalloca (N) #endif extern void * mmalloca (size_t n); /* Free a block of memory allocated through malloca(). */ #if HAVE_ALLOCA extern void freea (void *p); #else # define freea free #endif /* nmalloca(N,S) is an overflow-safe variant of malloca (N * S). It allocates an array of N objects, each with S bytes of memory, on the stack. S must be positive and N must be nonnegative. The array must be freed using freea() before the function returns. */ #if 1 /* Cf. the definition of xalloc_oversized. */ # define nmalloca(n, s) \ ((n) > (size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) \ ? NULL \ : malloca ((n) * (s))) #else extern void * nmalloca (size_t n, size_t s); #endif #ifdef __cplusplus } #endif /* ------------------- Auxiliary, non-public definitions ------------------- */ /* Determine the alignment of a type at compile time. */ #if defined __GNUC__ # define sa_alignof __alignof__ #elif defined __cplusplus template struct sa_alignof_helper { char __slot1; type __slot2; }; # define sa_alignof(type) offsetof (sa_alignof_helper, __slot2) #elif defined __hpux /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof values. */ # define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8) #elif defined _AIX /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof values. */ # define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8) #else # define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) #endif enum { /* The desired alignment of memory allocations is the maximum alignment among all elementary types. */ sa_alignment_long = sa_alignof (long), sa_alignment_double = sa_alignof (double), #if HAVE_LONG_LONG_INT sa_alignment_longlong = sa_alignof (long long), #endif sa_alignment_longdouble = sa_alignof (long double), sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1) #if HAVE_LONG_LONG_INT | (sa_alignment_longlong - 1) #endif | (sa_alignment_longdouble - 1) ) + 1, /* The increment that guarantees room for a magic word must be >= sizeof (int) and a multiple of sa_alignment_max. */ sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max }; #endif /* _MALLOCA_H */ shishi-1.0.2/gl/gettimeofday.c0000644000000000000000000000775112126660051013130 00000000000000/* Provide gettimeofday for systems that don't have it or for which it's broken. Copyright (C) 2001-2003, 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* written by Jim Meyering */ #include /* Specification. */ #include #include #if HAVE_SYS_TIMEB_H # include #endif #if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME /* Work around the bug in some systems whereby gettimeofday clobbers the static buffer that localtime uses for its return value. The gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has this problem. The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and 2.6. */ static struct tm tm_zero_buffer; static struct tm *localtime_buffer_addr = &tm_zero_buffer; # undef localtime extern struct tm *localtime (time_t const *); # undef gmtime extern struct tm *gmtime (time_t const *); /* This is a wrapper for localtime. It is used only on systems for which gettimeofday clobbers the static buffer used for localtime's result. On the first call, record the address of the static buffer that localtime uses for its result. */ struct tm * rpl_localtime (time_t const *timep) { struct tm *tm = localtime (timep); if (localtime_buffer_addr == &tm_zero_buffer) localtime_buffer_addr = tm; return tm; } /* Same as above, since gmtime and localtime use the same buffer. */ struct tm * rpl_gmtime (time_t const *timep) { struct tm *tm = gmtime (timep); if (localtime_buffer_addr == &tm_zero_buffer) localtime_buffer_addr = tm; return tm; } #endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */ #if TZSET_CLOBBERS_LOCALTIME # undef tzset extern void tzset (void); /* This is a wrapper for tzset, for systems on which tzset may clobber the static buffer used for localtime's result. */ void rpl_tzset (void) { /* Save and restore the contents of the buffer used for localtime's result around the call to tzset. */ struct tm save = *localtime_buffer_addr; tzset (); *localtime_buffer_addr = save; } #endif /* This is a wrapper for gettimeofday. It is used only on systems that lack this function, or whose implementation of this function causes problems. */ int gettimeofday (struct timeval *restrict tv, void *restrict tz) { #undef gettimeofday #if HAVE_GETTIMEOFDAY # if GETTIMEOFDAY_CLOBBERS_LOCALTIME /* Save and restore the contents of the buffer used for localtime's result around the call to gettimeofday. */ struct tm save = *localtime_buffer_addr; # endif # if defined timeval /* 'struct timeval' overridden by gnulib? */ # undef timeval struct timeval otv; int result = gettimeofday (&otv, (struct timezone *) tz); if (result == 0) { tv->tv_sec = otv.tv_sec; tv->tv_usec = otv.tv_usec; } # else int result = gettimeofday (tv, (struct timezone *) tz); # endif # if GETTIMEOFDAY_CLOBBERS_LOCALTIME *localtime_buffer_addr = save; # endif return result; #else # if HAVE__FTIME struct _timeb timebuf; _ftime (&timebuf); tv->tv_sec = timebuf.time; tv->tv_usec = timebuf.millitm * 1000; # else # if !defined OK_TO_USE_1S_CLOCK # error "Only 1-second nominal clock resolution found. Is that intended?" \ "If so, compile with the -DOK_TO_USE_1S_CLOCK option." # endif tv->tv_sec = time (NULL); tv->tv_usec = 0; # endif return 0; #endif } shishi-1.0.2/gl/getpeername.c0000644000000000000000000000243712126660051012737 00000000000000/* getpeername.c --- wrappers for Windows getpeername function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef getpeername int rpl_getpeername (int fd, struct sockaddr *addr, socklen_t *addrlen) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int r = getpeername (sock, addr, addrlen); if (r < 0) set_winsock_errno (); return r; } } shishi-1.0.2/gl/arcfour.h0000644000000000000000000000304012126660051012100 00000000000000/* arcfour.h --- The arcfour stream cipher * Copyright (C) 2000-2005, 2009-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */ #ifndef ARCFOUR_H # define ARCFOUR_H # include # include #define ARCFOUR_SBOX_SIZE 256 typedef struct { char sbox[ARCFOUR_SBOX_SIZE]; uint8_t idx_i, idx_j; } arcfour_context; /* Apply ARCFOUR stream to INBUF placing the result in OUTBUF, both of LENGTH size. CONTEXT must be initialized with arcfour_setkey before this function is called. */ extern void arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf, size_t length); /* Initialize CONTEXT using encryption KEY of KEYLEN bytes. KEY should be 40 bits (5 bytes) or longer. The KEY cannot be zero length. */ extern void arcfour_setkey (arcfour_context * context, const char *key, size_t keylen); #endif /* ARCFOUR_H */ shishi-1.0.2/gl/getdtablesize.c0000644000000000000000000000476312126660051013275 00000000000000/* getdtablesize() function for platforms that don't have it. Copyright (C) 2008-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2008. 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 . */ #include /* Specification. */ #include #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ #include #include "msvc-inval.h" #if HAVE_MSVC_INVALID_PARAMETER_HANDLER static int _setmaxstdio_nothrow (int newmax) { int result; TRY_MSVC_INVAL { result = _setmaxstdio (newmax); } CATCH_MSVC_INVAL { result = -1; } DONE_MSVC_INVAL; return result; } # define _setmaxstdio _setmaxstdio_nothrow #endif /* Cache for the previous getdtablesize () result. */ static int dtablesize; int getdtablesize (void) { if (dtablesize == 0) { /* We are looking for the number N such that the valid file descriptors are 0..N-1. It can be obtained through a loop as follows: { int fd; for (fd = 3; fd < 65536; fd++) if (dup2 (0, fd) == -1) break; return fd; } On Windows XP, the result is 2048. The drawback of this loop is that it allocates memory for a libc internal array that is never freed. The number N can also be obtained as the upper bound for _getmaxstdio (). _getmaxstdio () returns the maximum number of open FILE objects. The sanity check in _setmaxstdio reveals the maximum number of file descriptors. This too allocates memory, but it is freed when we call _setmaxstdio with the original value. */ int orig_max_stdio = _getmaxstdio (); unsigned int bound; for (bound = 0x10000; _setmaxstdio (bound) < 0; bound = bound / 2) ; _setmaxstdio (orig_max_stdio); dtablesize = bound; } return dtablesize; } #endif shishi-1.0.2/gl/strndup.c0000644000000000000000000000202412126660054012135 00000000000000/* A replacement function, for systems that lack strndup. Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include #include #include char * strndup (char const *s, size_t n) { size_t len = strnlen (s, n); char *new = malloc (len + 1); if (new == NULL) return NULL; new[len] = '\0'; return memcpy (new, s, len); } shishi-1.0.2/gl/netinet_in.in.h0000644000000000000000000000247412126660053013214 00000000000000/* Substitute for . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_NETINET_IN_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if @HAVE_NETINET_IN_H@ /* On many platforms, assumes prior inclusion of . */ # include /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_NETINET_IN_H@ #endif #ifndef _@GUARD_PREFIX@_NETINET_IN_H #define _@GUARD_PREFIX@_NETINET_IN_H #if !@HAVE_NETINET_IN_H@ /* A platform that lacks . */ # include #endif #endif /* _@GUARD_PREFIX@_NETINET_IN_H */ #endif /* _@GUARD_PREFIX@_NETINET_IN_H */ shishi-1.0.2/gl/stdlib.in.h0000644000000000000000000010045612126660053012340 00000000000000/* A GNU-like . Copyright (C) 1995, 2001-2004, 2006-2013 Free Software Foundation, Inc. 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_stdlib_h || defined __need_malloc_and_calloc /* Special invocation conventions inside some gnulib header files, and inside some glibc header files, respectively. */ #@INCLUDE_NEXT@ @NEXT_STDLIB_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_STDLIB_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDLIB_H@ #ifndef _@GUARD_PREFIX@_STDLIB_H #define _@GUARD_PREFIX@_STDLIB_H /* NetBSD 5.0 mis-defines NULL. */ #include /* MirBSD 10 defines WEXITSTATUS in , not in . */ #if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS # include #endif /* Solaris declares getloadavg() in . */ #if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@ # include #endif /* Native Windows platforms declare mktemp() in . */ #if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) # include #endif #if @GNULIB_RANDOM_R@ /* OSF/1 5.1 declares 'struct random_data' in , which is included from if _REENTRANT is defined. Include it whenever we need 'struct random_data'. */ # if @HAVE_RANDOM_H@ # include # endif # if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@ # include # endif # if !@HAVE_STRUCT_RANDOM_DATA@ /* Define 'struct random_data'. But allow multiple gnulib generated replacements to coexist. */ # if !GNULIB_defined_struct_random_data struct random_data { int32_t *fptr; /* Front pointer. */ int32_t *rptr; /* Rear pointer. */ int32_t *state; /* Array of state values. */ int rand_type; /* Type of random number generator. */ int rand_deg; /* Degree of random number generator. */ int rand_sep; /* Distance between front and rear. */ int32_t *end_ptr; /* Pointer behind state table. */ }; # define GNULIB_defined_struct_random_data 1 # endif # endif #endif #if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) /* On Mac OS X 10.3, only declares mkstemp. */ /* On Mac OS X 10.5, only declares mkstemps. */ /* On Cygwin 1.7.1, only declares getsubopt. */ /* But avoid namespace pollution on glibc systems and native Windows. */ # include #endif /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* The definition of _Noreturn is copied here. */ /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Some systems do not define EXIT_*, despite otherwise supporting C89. */ #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif /* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere with proper operation of xargs. */ #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #elif EXIT_FAILURE != 1 # undef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #if @GNULIB__EXIT@ /* Terminate the current process with the given return code, without running the 'atexit' handlers. */ # if !@HAVE__EXIT@ _GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status)); # endif _GL_CXXALIAS_SYS (_Exit, void, (int status)); _GL_CXXALIASWARN (_Exit); #elif defined GNULIB_POSIXCHECK # undef _Exit # if HAVE_RAW_DECL__EXIT _GL_WARN_ON_USE (_Exit, "_Exit is unportable - " "use gnulib module _Exit for portability"); # endif #endif #if @GNULIB_ATOLL@ /* Parse a signed decimal integer. Returns the value of the integer. Errors are not detected. */ # if !@HAVE_ATOLL@ _GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (atoll, long long, (const char *string)); _GL_CXXALIASWARN (atoll); #elif defined GNULIB_POSIXCHECK # undef atoll # if HAVE_RAW_DECL_ATOLL _GL_WARN_ON_USE (atoll, "atoll is unportable - " "use gnulib module atoll for portability"); # endif #endif #if @GNULIB_CALLOC_POSIX@ # if @REPLACE_CALLOC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef calloc # define calloc rpl_calloc # endif _GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size)); _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size)); # else _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size)); # endif _GL_CXXALIASWARN (calloc); #elif defined GNULIB_POSIXCHECK # undef calloc /* Assume calloc is always declared. */ _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - " "use gnulib module calloc-posix for portability"); #endif #if @GNULIB_CANONICALIZE_FILE_NAME@ # if @REPLACE_CANONICALIZE_FILE_NAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define canonicalize_file_name rpl_canonicalize_file_name # endif _GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name)); # else # if !@HAVE_CANONICALIZE_FILE_NAME@ _GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name)); # endif _GL_CXXALIASWARN (canonicalize_file_name); #elif defined GNULIB_POSIXCHECK # undef canonicalize_file_name # if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME _GL_WARN_ON_USE (canonicalize_file_name, "canonicalize_file_name is unportable - " "use gnulib module canonicalize-lgpl for portability"); # endif #endif #if @GNULIB_GETLOADAVG@ /* Store max(NELEM,3) load average numbers in LOADAVG[]. The three numbers are the load average of the last 1 minute, the last 5 minutes, and the last 15 minutes, respectively. LOADAVG is an array of NELEM numbers. */ # if !@HAVE_DECL_GETLOADAVG@ _GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem)); _GL_CXXALIASWARN (getloadavg); #elif defined GNULIB_POSIXCHECK # undef getloadavg # if HAVE_RAW_DECL_GETLOADAVG _GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - " "use gnulib module getloadavg for portability"); # endif #endif #if @GNULIB_GETSUBOPT@ /* Assuming *OPTIONP is a comma separated list of elements of the form "token" or "token=value", getsubopt parses the first of these elements. If the first element refers to a "token" that is member of the given NULL-terminated array of tokens: - It replaces the comma with a NUL byte, updates *OPTIONP to point past the first option and the comma, sets *VALUEP to the value of the element (or NULL if it doesn't contain an "=" sign), - It returns the index of the "token" in the given array of tokens. Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined. For more details see the POSIX:2001 specification. http://www.opengroup.org/susv3xsh/getsubopt.html */ # if !@HAVE_GETSUBOPT@ _GL_FUNCDECL_SYS (getsubopt, int, (char **optionp, char *const *tokens, char **valuep) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (getsubopt, int, (char **optionp, char *const *tokens, char **valuep)); _GL_CXXALIASWARN (getsubopt); #elif defined GNULIB_POSIXCHECK # undef getsubopt # if HAVE_RAW_DECL_GETSUBOPT _GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - " "use gnulib module getsubopt for portability"); # endif #endif #if @GNULIB_GRANTPT@ /* Change the ownership and access permission of the slave side of the pseudo-terminal whose master side is specified by FD. */ # if !@HAVE_GRANTPT@ _GL_FUNCDECL_SYS (grantpt, int, (int fd)); # endif _GL_CXXALIAS_SYS (grantpt, int, (int fd)); _GL_CXXALIASWARN (grantpt); #elif defined GNULIB_POSIXCHECK # undef grantpt # if HAVE_RAW_DECL_GRANTPT _GL_WARN_ON_USE (grantpt, "grantpt is not portable - " "use gnulib module grantpt for portability"); # endif #endif /* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not rely on GNU or POSIX semantics for malloc and realloc (for example, by never specifying a zero size), so it does not need malloc or realloc to be redefined. */ #if @GNULIB_MALLOC_POSIX@ # if @REPLACE_MALLOC@ # if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ || _GL_USE_STDLIB_ALLOC) # undef malloc # define malloc rpl_malloc # endif _GL_FUNCDECL_RPL (malloc, void *, (size_t size)); _GL_CXXALIAS_RPL (malloc, void *, (size_t size)); # else _GL_CXXALIAS_SYS (malloc, void *, (size_t size)); # endif _GL_CXXALIASWARN (malloc); #elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC # undef malloc /* Assume malloc is always declared. */ _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - " "use gnulib module malloc-posix for portability"); #endif /* Convert a multibyte character to a wide character. */ #if @GNULIB_MBTOWC@ # if @REPLACE_MBTOWC@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mbtowc # define mbtowc rpl_mbtowc # endif _GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); _GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); # else _GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); # endif _GL_CXXALIASWARN (mbtowc); #endif #if @GNULIB_MKDTEMP@ /* Create a unique temporary directory from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the directory name unique. Returns TEMPLATE, or a null pointer if it cannot get a unique name. The directory is created mode 700. */ # if !@HAVE_MKDTEMP@ _GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/)); _GL_CXXALIASWARN (mkdtemp); #elif defined GNULIB_POSIXCHECK # undef mkdtemp # if HAVE_RAW_DECL_MKDTEMP _GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - " "use gnulib module mkdtemp for portability"); # endif #endif #if @GNULIB_MKOSTEMP@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). The file is then created, with the specified flags, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKOSTEMP@ _GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)); _GL_CXXALIASWARN (mkostemp); #elif defined GNULIB_POSIXCHECK # undef mkostemp # if HAVE_RAW_DECL_MKOSTEMP _GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - " "use gnulib module mkostemp for portability"); # endif #endif #if @GNULIB_MKOSTEMPS@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE before a suffix of length SUFFIXLEN must be "XXXXXX"; they are replaced with a string that makes the file name unique. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). The file is then created, with the specified flags, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKOSTEMPS@ _GL_FUNCDECL_SYS (mkostemps, int, (char * /*template*/, int /*suffixlen*/, int /*flags*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkostemps, int, (char * /*template*/, int /*suffixlen*/, int /*flags*/)); _GL_CXXALIASWARN (mkostemps); #elif defined GNULIB_POSIXCHECK # undef mkostemps # if HAVE_RAW_DECL_MKOSTEMPS _GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - " "use gnulib module mkostemps for portability"); # endif #endif #if @GNULIB_MKSTEMP@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. The file is then created, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if @REPLACE_MKSTEMP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mkstemp rpl_mkstemp # endif _GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/)); # else # if ! @HAVE_MKSTEMP@ _GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/)); # endif _GL_CXXALIASWARN (mkstemp); #elif defined GNULIB_POSIXCHECK # undef mkstemp # if HAVE_RAW_DECL_MKSTEMP _GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - " "use gnulib module mkstemp for portability"); # endif #endif #if @GNULIB_MKSTEMPS@ /* Create a unique temporary file from TEMPLATE. The last six characters of TEMPLATE prior to a suffix of length SUFFIXLEN must be "XXXXXX"; they are replaced with a string that makes the file name unique. The file is then created, ensuring it didn't exist before. The file is created read-write (mask at least 0600 & ~umask), but it may be world-readable and world-writable (mask 0666 & ~umask), depending on the implementation. Returns the open file descriptor if successful, otherwise -1 and errno set. */ # if !@HAVE_MKSTEMPS@ _GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)); _GL_CXXALIASWARN (mkstemps); #elif defined GNULIB_POSIXCHECK # undef mkstemps # if HAVE_RAW_DECL_MKSTEMPS _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - " "use gnulib module mkstemps for portability"); # endif #endif #if @GNULIB_POSIX_OPENPT@ /* Return an FD open to the master side of a pseudo-terminal. Flags should include O_RDWR, and may also include O_NOCTTY. */ # if !@HAVE_POSIX_OPENPT@ _GL_FUNCDECL_SYS (posix_openpt, int, (int flags)); # endif _GL_CXXALIAS_SYS (posix_openpt, int, (int flags)); _GL_CXXALIASWARN (posix_openpt); #elif defined GNULIB_POSIXCHECK # undef posix_openpt # if HAVE_RAW_DECL_POSIX_OPENPT _GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - " "use gnulib module posix_openpt for portability"); # endif #endif #if @GNULIB_PTSNAME@ /* Return the pathname of the pseudo-terminal slave associated with the master FD is open on, or NULL on errors. */ # if @REPLACE_PTSNAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ptsname # define ptsname rpl_ptsname # endif _GL_FUNCDECL_RPL (ptsname, char *, (int fd)); _GL_CXXALIAS_RPL (ptsname, char *, (int fd)); # else # if !@HAVE_PTSNAME@ _GL_FUNCDECL_SYS (ptsname, char *, (int fd)); # endif _GL_CXXALIAS_SYS (ptsname, char *, (int fd)); # endif _GL_CXXALIASWARN (ptsname); #elif defined GNULIB_POSIXCHECK # undef ptsname # if HAVE_RAW_DECL_PTSNAME _GL_WARN_ON_USE (ptsname, "ptsname is not portable - " "use gnulib module ptsname for portability"); # endif #endif #if @GNULIB_PTSNAME_R@ /* Set the pathname of the pseudo-terminal slave associated with the master FD is open on and return 0, or set errno and return non-zero on errors. */ # if @REPLACE_PTSNAME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ptsname_r # define ptsname_r rpl_ptsname_r # endif _GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); _GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); # else # if !@HAVE_PTSNAME_R@ _GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); # endif _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); # endif _GL_CXXALIASWARN (ptsname_r); #elif defined GNULIB_POSIXCHECK # undef ptsname_r # if HAVE_RAW_DECL_PTSNAME_R _GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - " "use gnulib module ptsname_r for portability"); # endif #endif #if @GNULIB_PUTENV@ # if @REPLACE_PUTENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putenv # define putenv rpl_putenv # endif _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (putenv, int, (char *string)); # else _GL_CXXALIAS_SYS (putenv, int, (char *string)); # endif _GL_CXXALIASWARN (putenv); #endif #if @GNULIB_RANDOM_R@ # if !@HAVE_RANDOM_R@ # ifndef RAND_MAX # define RAND_MAX 2147483647 # endif # endif #endif #if @GNULIB_RANDOM@ # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (random, long, (void)); # endif _GL_CXXALIAS_SYS (random, long, (void)); _GL_CXXALIASWARN (random); #elif defined GNULIB_POSIXCHECK # undef random # if HAVE_RAW_DECL_RANDOM _GL_WARN_ON_USE (random, "random is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (srandom, void, (unsigned int seed)); # endif _GL_CXXALIAS_SYS (srandom, void, (unsigned int seed)); _GL_CXXALIASWARN (srandom); #elif defined GNULIB_POSIXCHECK # undef srandom # if HAVE_RAW_DECL_SRANDOM _GL_WARN_ON_USE (srandom, "srandom is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (initstate, char *, (unsigned int seed, char *buf, size_t buf_size) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (initstate, char *, (unsigned int seed, char *buf, size_t buf_size)); _GL_CXXALIASWARN (initstate); #elif defined GNULIB_POSIXCHECK # undef initstate # if HAVE_RAW_DECL_INITSTATE_R _GL_WARN_ON_USE (initstate, "initstate is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM@ # if !@HAVE_RANDOM@ _GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (setstate, char *, (char *arg_state)); _GL_CXXALIASWARN (setstate); #elif defined GNULIB_POSIXCHECK # undef setstate # if HAVE_RAW_DECL_SETSTATE_R _GL_WARN_ON_USE (setstate, "setstate is unportable - " "use gnulib module random for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef random_r # define random_r rpl_random_r # endif _GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result)); # endif _GL_CXXALIASWARN (random_r); #elif defined GNULIB_POSIXCHECK # undef random_r # if HAVE_RAW_DECL_RANDOM_R _GL_WARN_ON_USE (random_r, "random_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef srandom_r # define srandom_r rpl_srandom_r # endif _GL_FUNCDECL_RPL (srandom_r, int, (unsigned int seed, struct random_data *rand_state) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (srandom_r, int, (unsigned int seed, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (srandom_r, int, (unsigned int seed, struct random_data *rand_state) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (srandom_r, int, (unsigned int seed, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (srandom_r); #elif defined GNULIB_POSIXCHECK # undef srandom_r # if HAVE_RAW_DECL_SRANDOM_R _GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef initstate_r # define initstate_r rpl_initstate_r # endif _GL_FUNCDECL_RPL (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state) _GL_ARG_NONNULL ((2, 4))); # endif _GL_CXXALIAS_SYS (initstate_r, int, (unsigned int seed, char *buf, size_t buf_size, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (initstate_r); #elif defined GNULIB_POSIXCHECK # undef initstate_r # if HAVE_RAW_DECL_INITSTATE_R _GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_RANDOM_R@ # if @REPLACE_RANDOM_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setstate_r # define setstate_r rpl_setstate_r # endif _GL_FUNCDECL_RPL (setstate_r, int, (char *arg_state, struct random_data *rand_state) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (setstate_r, int, (char *arg_state, struct random_data *rand_state)); # else # if !@HAVE_RANDOM_R@ _GL_FUNCDECL_SYS (setstate_r, int, (char *arg_state, struct random_data *rand_state) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (setstate_r, int, (char *arg_state, struct random_data *rand_state)); # endif _GL_CXXALIASWARN (setstate_r); #elif defined GNULIB_POSIXCHECK # undef setstate_r # if HAVE_RAW_DECL_SETSTATE_R _GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - " "use gnulib module random_r for portability"); # endif #endif #if @GNULIB_REALLOC_POSIX@ # if @REPLACE_REALLOC@ # if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ || _GL_USE_STDLIB_ALLOC) # undef realloc # define realloc rpl_realloc # endif _GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)); _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size)); # else _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size)); # endif _GL_CXXALIASWARN (realloc); #elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC # undef realloc /* Assume realloc is always declared. */ _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - " "use gnulib module realloc-posix for portability"); #endif #if @GNULIB_REALPATH@ # if @REPLACE_REALPATH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define realpath rpl_realpath # endif _GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved)); # else # if !@HAVE_REALPATH@ _GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved)); # endif _GL_CXXALIASWARN (realpath); #elif defined GNULIB_POSIXCHECK # undef realpath # if HAVE_RAW_DECL_REALPATH _GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module " "canonicalize or canonicalize-lgpl for portability"); # endif #endif #if @GNULIB_RPMATCH@ /* Test a user response to a question. Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ # if !@HAVE_RPMATCH@ _GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (rpmatch, int, (const char *response)); _GL_CXXALIASWARN (rpmatch); #elif defined GNULIB_POSIXCHECK # undef rpmatch # if HAVE_RAW_DECL_RPMATCH _GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - " "use gnulib module rpmatch for portability"); # endif #endif #if @GNULIB_SECURE_GETENV@ /* Look up NAME in the environment, returning 0 in insecure situations. */ # if !@HAVE_SECURE_GETENV@ _GL_FUNCDECL_SYS (secure_getenv, char *, (char const *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name)); _GL_CXXALIASWARN (secure_getenv); #elif defined GNULIB_POSIXCHECK # undef secure_getenv # if HAVE_RAW_DECL_SECURE_GETENV _GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - " "use gnulib module secure_getenv for portability"); # endif #endif #if @GNULIB_SETENV@ /* Set NAME to VALUE in the environment. If REPLACE is nonzero, overwrite an existing value. */ # if @REPLACE_SETENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setenv # define setenv rpl_setenv # endif _GL_FUNCDECL_RPL (setenv, int, (const char *name, const char *value, int replace) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (setenv, int, (const char *name, const char *value, int replace)); # else # if !@HAVE_DECL_SETENV@ _GL_FUNCDECL_SYS (setenv, int, (const char *name, const char *value, int replace) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (setenv, int, (const char *name, const char *value, int replace)); # endif # if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@) _GL_CXXALIASWARN (setenv); # endif #elif defined GNULIB_POSIXCHECK # undef setenv # if HAVE_RAW_DECL_SETENV _GL_WARN_ON_USE (setenv, "setenv is unportable - " "use gnulib module setenv for portability"); # endif #endif #if @GNULIB_STRTOD@ /* Parse a double from STRING, updating ENDP if appropriate. */ # if @REPLACE_STRTOD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strtod rpl_strtod # endif _GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp)); # else # if !@HAVE_STRTOD@ _GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp)); # endif _GL_CXXALIASWARN (strtod); #elif defined GNULIB_POSIXCHECK # undef strtod # if HAVE_RAW_DECL_STRTOD _GL_WARN_ON_USE (strtod, "strtod is unportable - " "use gnulib module strtod for portability"); # endif #endif #if @GNULIB_STRTOLL@ /* Parse a signed integer whose textual representation starts at STRING. The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, it may be decimal or octal (with prefix "0") or hexadecimal (with prefix "0x"). If ENDPTR is not NULL, the address of the first byte after the integer is stored in *ENDPTR. Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set to ERANGE. */ # if !@HAVE_STRTOLL@ _GL_FUNCDECL_SYS (strtoll, long long, (const char *string, char **endptr, int base) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoll, long long, (const char *string, char **endptr, int base)); _GL_CXXALIASWARN (strtoll); #elif defined GNULIB_POSIXCHECK # undef strtoll # if HAVE_RAW_DECL_STRTOLL _GL_WARN_ON_USE (strtoll, "strtoll is unportable - " "use gnulib module strtoll for portability"); # endif #endif #if @GNULIB_STRTOULL@ /* Parse an unsigned integer whose textual representation starts at STRING. The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, it may be decimal or octal (with prefix "0") or hexadecimal (with prefix "0x"). If ENDPTR is not NULL, the address of the first byte after the integer is stored in *ENDPTR. Upon overflow, the return value is ULLONG_MAX, and errno is set to ERANGE. */ # if !@HAVE_STRTOULL@ _GL_FUNCDECL_SYS (strtoull, unsigned long long, (const char *string, char **endptr, int base) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strtoull, unsigned long long, (const char *string, char **endptr, int base)); _GL_CXXALIASWARN (strtoull); #elif defined GNULIB_POSIXCHECK # undef strtoull # if HAVE_RAW_DECL_STRTOULL _GL_WARN_ON_USE (strtoull, "strtoull is unportable - " "use gnulib module strtoull for portability"); # endif #endif #if @GNULIB_UNLOCKPT@ /* Unlock the slave side of the pseudo-terminal whose master side is specified by FD, so that it can be opened. */ # if !@HAVE_UNLOCKPT@ _GL_FUNCDECL_SYS (unlockpt, int, (int fd)); # endif _GL_CXXALIAS_SYS (unlockpt, int, (int fd)); _GL_CXXALIASWARN (unlockpt); #elif defined GNULIB_POSIXCHECK # undef unlockpt # if HAVE_RAW_DECL_UNLOCKPT _GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - " "use gnulib module unlockpt for portability"); # endif #endif #if @GNULIB_UNSETENV@ /* Remove the variable NAME from the environment. */ # if @REPLACE_UNSETENV@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unsetenv # define unsetenv rpl_unsetenv # endif _GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (unsetenv, int, (const char *name)); # else # if !@HAVE_DECL_UNSETENV@ _GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (unsetenv, int, (const char *name)); # endif # if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@) _GL_CXXALIASWARN (unsetenv); # endif #elif defined GNULIB_POSIXCHECK # undef unsetenv # if HAVE_RAW_DECL_UNSETENV _GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - " "use gnulib module unsetenv for portability"); # endif #endif /* Convert a wide character to a multibyte character. */ #if @GNULIB_WCTOMB@ # if @REPLACE_WCTOMB@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef wctomb # define wctomb rpl_wctomb # endif _GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc)); _GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc)); # else _GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc)); # endif _GL_CXXALIASWARN (wctomb); #endif #endif /* _@GUARD_PREFIX@_STDLIB_H */ #endif /* _@GUARD_PREFIX@_STDLIB_H */ #endif shishi-1.0.2/gl/md4.h0000644000000000000000000000603012126660053011127 00000000000000/* Declarations of functions and data types used for MD4 sum library functions. Copyright (C) 2000-2001, 2003, 2005, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef MD4_H # define MD4_H 1 # include # include # ifdef __cplusplus extern "C" { # endif # define MD4_DIGEST_SIZE 16 /* Structure to save state of computation between the single steps. */ struct md4_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void md4_init_ctx (struct md4_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf); /* Put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_read_ctx (const struct md4_ctx *ctx, void *resbuf); /* Compute MD4 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ extern int md4_stream (FILE * stream, void *resblock); /* Compute MD4 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *md4_buffer (const char *buffer, size_t len, void *resblock); # ifdef __cplusplus } # endif #endif shishi-1.0.2/gl/read-file.c0000644000000000000000000001164312126660053012274 00000000000000/* read-file.c -- read file contents into a string Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc. Written by Simon Josefsson and Bruno Haible. 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, 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 . */ #include #include "read-file.h" /* Get fstat. */ #include /* Get ftello. */ #include /* Get SIZE_MAX. */ #include /* Get malloc, realloc, free. */ #include /* Get errno. */ #include /* Read a STREAM and return a newly allocated string with the content, and set *LENGTH to the length of the string. The string is zero-terminated, but the terminating zero byte is not counted in *LENGTH. On errors, *LENGTH is undefined, errno preserves the values set by system functions (if any), and NULL is returned. */ char * fread_file (FILE *stream, size_t *length) { char *buf = NULL; size_t alloc = BUFSIZ; /* For a regular file, allocate a buffer that has exactly the right size. This avoids the need to do dynamic reallocations later. */ { struct stat st; if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode)) { off_t pos = ftello (stream); if (pos >= 0 && pos < st.st_size) { off_t alloc_off = st.st_size - pos; /* '1' below, accounts for the trailing NUL. */ if (SIZE_MAX - 1 < alloc_off) { errno = ENOMEM; return NULL; } alloc = alloc_off + 1; } } } if (!(buf = malloc (alloc))) return NULL; /* errno is ENOMEM. */ { size_t size = 0; /* number of bytes read so far */ int save_errno; for (;;) { /* This reads 1 more than the size of a regular file so that we get eof immediately. */ size_t requested = alloc - size; size_t count = fread (buf + size, 1, requested, stream); size += count; if (count != requested) { save_errno = errno; if (ferror (stream)) break; /* Shrink the allocated memory if possible. */ if (size < alloc - 1) { char *smaller_buf = realloc (buf, size + 1); if (smaller_buf != NULL) buf = smaller_buf; } buf[size] = '\0'; *length = size; return buf; } { char *new_buf; if (alloc == SIZE_MAX) { save_errno = ENOMEM; break; } if (alloc < SIZE_MAX - alloc / 2) alloc = alloc + alloc / 2; else alloc = SIZE_MAX; if (!(new_buf = realloc (buf, alloc))) { save_errno = errno; break; } buf = new_buf; } } free (buf); errno = save_errno; return NULL; } } static char * internal_read_file (const char *filename, size_t *length, const char *mode) { FILE *stream = fopen (filename, mode); char *out; int save_errno; if (!stream) return NULL; out = fread_file (stream, length); save_errno = errno; if (fclose (stream) != 0) { if (out) { save_errno = errno; free (out); } errno = save_errno; return NULL; } return out; } /* Open and read the contents of FILENAME, and return a newly allocated string with the content, and set *LENGTH to the length of the string. The string is zero-terminated, but the terminating zero byte is not counted in *LENGTH. On errors, *LENGTH is undefined, errno preserves the values set by system functions (if any), and NULL is returned. */ char * read_file (const char *filename, size_t *length) { return internal_read_file (filename, length, "r"); } /* Open (on non-POSIX systems, in binary mode) and read the contents of FILENAME, and return a newly allocated string with the content, and set LENGTH to the length of the string. The string is zero-terminated, but the terminating zero byte is not counted in the LENGTH variable. On errors, *LENGTH is undefined, errno preserves the values set by system functions (if any), and NULL is returned. */ char * read_binary_file (const char *filename, size_t *length) { return internal_read_file (filename, length, "rb"); } shishi-1.0.2/gl/strnlen.c0000644000000000000000000000216412126660054012130 00000000000000/* Find the length of STRING, but scan at most MAXLEN characters. Copyright (C) 2005-2007, 2009-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ #include #include /* Find the length of STRING, but scan at most MAXLEN characters. If no '\0' terminator is found in that many characters, return MAXLEN. */ size_t strnlen (const char *string, size_t maxlen) { const char *end = memchr (string, '\0', maxlen); return end ? (size_t) (end - string) : maxlen; } shishi-1.0.2/gl/fcntl.in.h0000644000000000000000000002244312126660051012162 00000000000000/* Like , but with non-working flags defined to 0. Copyright (C) 2006-2013 Free Software Foundation, Inc. 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 . */ /* written by Paul Eggert */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_fcntl_h /* Special invocation convention. */ /* Needed before . May also define off_t to a 64-bit type on native Windows. */ #include /* On some systems other than glibc, is a prerequisite of . On glibc systems, we would like to avoid namespace pollution. But on glibc systems, includes inside an extern "C" { ... } block, which leads to errors in C++ mode with the overridden from gnulib. These errors are known to be gone with g++ version >= 4.3. */ #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) # include #endif #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_FCNTL_H /* Needed before . May also define off_t to a 64-bit type on native Windows. */ #include /* On some systems other than glibc, is a prerequisite of . On glibc systems, we would like to avoid namespace pollution. But on glibc systems, includes inside an extern "C" { ... } block, which leads to errors in C++ mode with the overridden from gnulib. These errors are known to be gone with g++ version >= 4.3. */ #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) # include #endif /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ #ifndef _@GUARD_PREFIX@_FCNTL_H #define _@GUARD_PREFIX@_FCNTL_H #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ # include #endif /* Native Windows platforms declare open(), creat() in . */ #if (@GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declare overridden functions. */ #if @GNULIB_FCNTL@ # if @REPLACE_FCNTL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fcntl # define fcntl rpl_fcntl # endif _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); # else # if !@HAVE_FCNTL@ _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); # endif _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); # endif _GL_CXXALIASWARN (fcntl); #elif defined GNULIB_POSIXCHECK # undef fcntl # if HAVE_RAW_DECL_FCNTL _GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - " "use gnulib module fcntl for portability"); # endif #endif #if @GNULIB_OPEN@ # if @REPLACE_OPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef open # define open rpl_open # endif _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); # else _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); # endif /* On HP-UX 11, in C++ mode, open() is defined as an inline function with a default argument. _GL_CXXALIASWARN does not work in this case. */ # if !defined __hpux _GL_CXXALIASWARN (open); # endif #elif defined GNULIB_POSIXCHECK # undef open /* Assume open is always declared. */ _GL_WARN_ON_USE (open, "open is not always POSIX compliant - " "use gnulib module open for portability"); #endif #if @GNULIB_OPENAT@ # if @REPLACE_OPENAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef openat # define openat rpl_openat # endif _GL_FUNCDECL_RPL (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...)); # else # if !@HAVE_OPENAT@ _GL_FUNCDECL_SYS (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (openat, int, (int fd, char const *file, int flags, /* mode_t mode */ ...)); # endif _GL_CXXALIASWARN (openat); #elif defined GNULIB_POSIXCHECK # undef openat # if HAVE_RAW_DECL_OPENAT _GL_WARN_ON_USE (openat, "openat is not portable - " "use gnulib module openat for portability"); # endif #endif /* Fix up the FD_* macros, only known to be missing on mingw. */ #ifndef FD_CLOEXEC # define FD_CLOEXEC 1 #endif /* Fix up the supported F_* macros. Intentionally leave other F_* macros undefined. Only known to be missing on mingw. */ #ifndef F_DUPFD_CLOEXEC # define F_DUPFD_CLOEXEC 0x40000000 /* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ # define GNULIB_defined_F_DUPFD_CLOEXEC 1 #else # define GNULIB_defined_F_DUPFD_CLOEXEC 0 #endif #ifndef F_DUPFD # define F_DUPFD 1 #endif #ifndef F_GETFD # define F_GETFD 2 #endif /* Fix up the O_* macros. */ #if !defined O_DIRECT && defined O_DIRECTIO /* Tru64 spells it 'O_DIRECTIO'. */ # define O_DIRECT O_DIRECTIO #endif #if !defined O_CLOEXEC && defined O_NOINHERIT /* Mingw spells it 'O_NOINHERIT'. */ # define O_CLOEXEC O_NOINHERIT #endif #ifndef O_CLOEXEC # define O_CLOEXEC 0 #endif #ifndef O_DIRECT # define O_DIRECT 0 #endif #ifndef O_DIRECTORY # define O_DIRECTORY 0 #endif #ifndef O_DSYNC # define O_DSYNC 0 #endif #ifndef O_EXEC # define O_EXEC O_RDONLY /* This is often close enough in older systems. */ #endif #ifndef O_IGNORE_CTTY # define O_IGNORE_CTTY 0 #endif #ifndef O_NDELAY # define O_NDELAY 0 #endif #ifndef O_NOATIME # define O_NOATIME 0 #endif #ifndef O_NONBLOCK # define O_NONBLOCK O_NDELAY #endif /* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY or to 0 as fallback. */ #if @GNULIB_NONBLOCKING@ # if O_NONBLOCK # define GNULIB_defined_O_NONBLOCK 0 # else # define GNULIB_defined_O_NONBLOCK 1 # undef O_NONBLOCK # define O_NONBLOCK 0x40000000 # endif #endif #ifndef O_NOCTTY # define O_NOCTTY 0 #endif #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif #ifndef O_NOLINK # define O_NOLINK 0 #endif #ifndef O_NOLINKS # define O_NOLINKS 0 #endif #ifndef O_NOTRANS # define O_NOTRANS 0 #endif #ifndef O_RSYNC # define O_RSYNC 0 #endif #ifndef O_SEARCH # define O_SEARCH O_RDONLY /* This is often close enough in older systems. */ #endif #ifndef O_SYNC # define O_SYNC 0 #endif #ifndef O_TTY_INIT # define O_TTY_INIT 0 #endif #if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) # undef O_ACCMODE # define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) #endif /* For systems that distinguish between text and binary I/O. O_BINARY is usually declared in fcntl.h */ #if !defined O_BINARY && defined _O_BINARY /* For MSC-compatible compilers. */ # define O_BINARY _O_BINARY # define O_TEXT _O_TEXT #endif #if defined __BEOS__ || defined __HAIKU__ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */ # undef O_BINARY # undef O_TEXT #endif #ifndef O_BINARY # define O_BINARY 0 # define O_TEXT 0 #endif /* Fix up the AT_* macros. */ /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its value exceeds INT_MAX, so its use as an int doesn't conform to the C standard, and GCC and Sun C complain in some cases. If the bug is present, undef AT_FDCWD here, so it can be redefined below. */ #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 # undef AT_FDCWD #endif /* Use the same bit pattern as Solaris 9, but with the proper signedness. The bit pattern is important, in case this actually is Solaris with the above workaround. */ #ifndef AT_FDCWD # define AT_FDCWD (-3041965) #endif /* Use the same values as Solaris 9. This shouldn't matter, but there's no real reason to differ. */ #ifndef AT_SYMLINK_NOFOLLOW # define AT_SYMLINK_NOFOLLOW 4096 #endif #ifndef AT_REMOVEDIR # define AT_REMOVEDIR 1 #endif /* Solaris 9 lacks these two, so just pick unique values. */ #ifndef AT_SYMLINK_FOLLOW # define AT_SYMLINK_FOLLOW 2 #endif #ifndef AT_EACCESS # define AT_EACCESS 4 #endif #endif /* _@GUARD_PREFIX@_FCNTL_H */ #endif /* _@GUARD_PREFIX@_FCNTL_H */ #endif shishi-1.0.2/gl/stdbool.in.h0000644000000000000000000001177212126660053012527 00000000000000/* Copyright (C) 2001-2003, 2006-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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, 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 . */ #ifndef _GL_STDBOOL_H #define _GL_STDBOOL_H /* ISO C 99 for platforms that lack it. */ /* Usage suggestions: Programs that use should be aware of some limitations and standards compliance issues. Standards compliance: - must be #included before 'bool', 'false', 'true' can be used. - You cannot assume that sizeof (bool) == 1. - Programs should not undefine the macros bool, true, and false, as C99 lists that as an "obsolescent feature". Limitations of this substitute, when used in a C89 environment: - must be #included before the '_Bool' type can be used. - You cannot assume that _Bool is a typedef; it might be a macro. - Bit-fields of type 'bool' are not supported. Portable code should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'. - In C99, casts and automatic conversions to '_Bool' or 'bool' are performed in such a way that every nonzero value gets converted to 'true', and zero gets converted to 'false'. This doesn't work with this substitute. With this substitute, only the values 0 and 1 give the expected result when converted to _Bool' or 'bool'. - C99 allows the use of (_Bool)0.0 in constant expressions, but this substitute cannot always provide this property. Also, it is suggested that programs use 'bool' rather than '_Bool'; this isn't required, but 'bool' is more common. */ /* 7.16. Boolean type and values */ /* BeOS already #defines false 0, true 1. We use the same definitions below, but temporarily we have to #undef them. */ #if defined __BEOS__ && !defined __HAIKU__ # include /* defines bool but not _Bool */ # undef false # undef true #endif #ifdef __cplusplus # define _Bool bool # define bool bool #else # if defined __BEOS__ && !defined __HAIKU__ /* A compiler known to have 'bool'. */ /* If the compiler already has both 'bool' and '_Bool', we can assume they are the same types. */ # if !@HAVE__BOOL@ typedef bool _Bool; # endif # else # if !defined __GNUC__ /* If @HAVE__BOOL@: Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when the built-in _Bool type is used. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html Similar bugs are likely with other compilers as well; this file wouldn't be used if was working. So we override the _Bool type. If !@HAVE__BOOL@: Need to define _Bool ourselves. As 'signed char' or as an enum type? Use of a typedef, with SunPRO C, leads to a stupid "warning: _Bool is a keyword in ISO C99". Use of an enum type, with IRIX cc, leads to a stupid "warning(1185): enumerated type mixed with another type". Even the existence of an enum type, without a typedef, "Invalid enumerator. (badenum)" with HP-UX cc on Tru64. The only benefit of the enum, debuggability, is not important with these compilers. So use 'signed char' and no enum. */ # define _Bool signed char # else /* With this compiler, trust the _Bool type if the compiler has it. */ # if !@HAVE__BOOL@ /* For the sake of symbolic names in gdb, define true and false as enum constants, not only as macros. It is tempting to write typedef enum { false = 0, true = 1 } _Bool; so that gdb prints values of type 'bool' symbolically. But then values of type '_Bool' might promote to 'int' or 'unsigned int' (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int' (see ISO C 99 6.3.1.1.(2)). So add a negative value to the enum; this ensures that '_Bool' promotes to 'int'. */ typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; # endif # endif # endif # define bool _Bool #endif /* The other macros must be usable in preprocessor directives. */ #ifdef __cplusplus # define false false # define true true #else # define false 0 # define true 1 #endif #define __bool_true_false_are_defined 1 #endif /* _GL_STDBOOL_H */ shishi-1.0.2/gl/xgetdomainname.h0000644000000000000000000000247312126660054013453 00000000000000/* xgetdomainname.h -- Return the NIS domain name, without size limitations. Copyright (C) 1992, 1996, 2000-2001, 2003, 2009-2013 Free Software Foundation, Inc. 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 . */ #ifndef _XGETDOMAINNAME_H #define _XGETDOMAINNAME_H /* Return the NIS domain name of the machine, in malloc'd storage. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. WARNING! The NIS domain name is usually the empty string or "(none)" when not using NIS. If malloc fails, exit. Upon any other failure, set errno and return NULL. */ extern char *xgetdomainname (void); #endif /* _XGETDOMAINNAME_H */ shishi-1.0.2/gl/dup2.c0000644000000000000000000000716512126660051011320 00000000000000/* Duplicate an open file descriptor to a specified file descriptor. Copyright (C) 1999, 2004-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* written by Paul Eggert */ #include /* Specification. */ #include #include #include #if HAVE_DUP2 # undef dup2 # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include # include "msvc-inval.h" /* Get _get_osfhandle. */ # include "msvc-nothrow.h" static int ms_windows_dup2 (int fd, int desired_fd) { int result; /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open, dup2 (fd, fd) returns 0, but all further attempts to use fd in future dup2 calls will hang. */ if (fd == desired_fd) { if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } return fd; } /* Wine 1.0.1 return 0 when desired_fd is negative but not -1: http://bugs.winehq.org/show_bug.cgi?id=21289 */ if (desired_fd < 0) { errno = EBADF; return -1; } TRY_MSVC_INVAL { result = dup2 (fd, desired_fd); } CATCH_MSVC_INVAL { errno = EBADF; result = -1; } DONE_MSVC_INVAL; if (result == 0) result = desired_fd; return result; } # define dup2 ms_windows_dup2 # endif int rpl_dup2 (int fd, int desired_fd) { int result; # ifdef F_GETFL /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF. On Cygwin 1.5.x, dup2 (1, 1) returns 0. On Cygwin 1.7.17, dup2 (1, -1) dumps core. On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */ if (desired_fd < 0) fd = desired_fd; if (fd == desired_fd) return fcntl (fd, F_GETFL) == -1 ? -1 : fd; # endif result = dup2 (fd, desired_fd); /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */ if (result == -1 && errno == EMFILE) errno = EBADF; # if REPLACE_FCHDIR if (fd != desired_fd && result != -1) result = _gl_register_dup (fd, result); # endif return result; } #else /* !HAVE_DUP2 */ /* On older platforms, dup2 did not exist. */ # ifndef F_DUPFD static int dupfd (int fd, int desired_fd) { int duplicated_fd = dup (fd); if (duplicated_fd < 0 || duplicated_fd == desired_fd) return duplicated_fd; else { int r = dupfd (fd, desired_fd); int e = errno; close (duplicated_fd); errno = e; return r; } } # endif int dup2 (int fd, int desired_fd) { int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd; if (result == -1 || fd == desired_fd) return result; close (desired_fd); # ifdef F_DUPFD result = fcntl (fd, F_DUPFD, desired_fd); # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); # endif # else result = dupfd (fd, desired_fd); # endif if (result == -1 && (errno == EMFILE || errno == EINVAL)) errno = EBADF; return result; } #endif /* !HAVE_DUP2 */ shishi-1.0.2/gl/parse-datetime.c0000644000000000000000000032107512126773035013360 00000000000000/* A Bison parser, made by GNU Bison 2.5. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. 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 . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Copy the first part of user declarations. */ /* Line 268 of yacc.c */ #line 1 "parse-datetime.y" /* Parse a string into an internal time stamp. Copyright (C) 1999-2000, 2002-2013 Free Software Foundation, Inc. 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 . */ /* Originally written by Steven M. Bellovin while at the University of North Carolina at Chapel Hill. Later tweaked by a couple of people on Usenet. Completely overhauled by Rich $alz and Jim Berets in August, 1990. Modified by Paul Eggert in August 1999 to do the right thing about local DST. Also modified by Paul Eggert in February 2004 to support nanosecond-resolution time stamps, and in October 2004 to support TZ strings in dates. */ /* FIXME: Check for arithmetic overflow in all cases, not just some of them. */ #include #include "parse-datetime.h" #include "intprops.h" #include "timespec.h" #include "verify.h" /* There's no need to extend the stack, so there's no need to involve alloca. */ #define YYSTACK_USE_ALLOCA 0 /* Tell Bison how much stack space is needed. 20 should be plenty for this grammar, which is not right recursive. Beware setting it too high, since that might cause problems on machines whose implementations have lame stack-overflow checking. */ #define YYMAXDEPTH 20 #define YYINITDEPTH YYMAXDEPTH /* Since the code of parse-datetime.y is not included in the Emacs executable itself, there is no need to #define static in this file. Even if the code were included in the Emacs executable, it probably wouldn't do any harm to #undef it here; this will only cause problems if we try to write to a static variable, which I don't think this code needs to do. */ #ifdef emacs # undef static #endif #include #include #include #include #include #include "xalloc.h" /* Bison's skeleton tests _STDLIB_H, while some stdlib.h headers use _STDLIB_H_ as witness. Map the latter to the one bison uses. */ /* FIXME: this is temporary. Remove when we have a mechanism to ensure that the version we're using is fixed, too. */ #ifdef _STDLIB_H_ # undef _STDLIB_H # define _STDLIB_H 1 #endif /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char or EOF. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition of "digit" even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) /* Shift A right by B bits portably, by dividing A by 2**B and truncating towards minus infinity. A and B should be free of side effects, and B should be in the range 0 <= B <= INT_BITS - 2, where INT_BITS is the number of useful bits in an int. GNU code can assume that INT_BITS is at least 32. ISO C99 says that A >> B is implementation-defined if A < 0. Some implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift right in the usual way when A < 0, so SHR falls back on division if ordinary A >> B doesn't seem to be the usual signed shift. */ #define SHR(a, b) \ (-1 >> 1 == -1 \ ? (a) >> (b) \ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 #define HOUR(x) ((x) * 60) /* long_time_t is a signed integer type that contains all time_t values. */ verify (TYPE_IS_INTEGER (time_t)); #if TIME_T_FITS_IN_LONG_INT typedef long int long_time_t; #else typedef time_t long_time_t; #endif /* Convert a possibly-signed character to an unsigned character. This is a bit safer than casting to unsigned char, since it catches some type errors that the cast doesn't. */ static unsigned char to_uchar (char ch) { return ch; } /* Lots of this code assumes time_t and time_t-like values fit into long_time_t. */ verify (TYPE_MINIMUM (long_time_t) <= TYPE_MINIMUM (time_t) && TYPE_MAXIMUM (time_t) <= TYPE_MAXIMUM (long_time_t)); /* FIXME: It also assumes that signed integer overflow silently wraps around, but this is not true any more with recent versions of GCC 4. */ /* An integer value, and the number of digits in its textual representation. */ typedef struct { bool negative; long int value; size_t digits; } textint; /* An entry in the lexical lookup table. */ typedef struct { char const *name; int type; int value; } table; /* Meridian: am, pm, or 24-hour style. */ enum { MERam, MERpm, MER24 }; enum { BILLION = 1000000000, LOG10_BILLION = 9 }; /* Relative times. */ typedef struct { /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */ long int year; long int month; long int day; long int hour; long int minutes; long_time_t seconds; long int ns; } relative_time; #if HAVE_COMPOUND_LITERALS # define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 }) #else static relative_time const RELATIVE_TIME_0; #endif /* Information passed to and from the parser. */ typedef struct { /* The input string remaining to be parsed. */ const char *input; /* N, if this is the Nth Tuesday. */ long int day_ordinal; /* Day of week; Sunday is 0. */ int day_number; /* tm_isdst flag for the local zone. */ int local_isdst; /* Time zone, in minutes east of UTC. */ long int time_zone; /* Style used for time. */ int meridian; /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */ textint year; long int month; long int day; long int hour; long int minutes; struct timespec seconds; /* includes nanoseconds */ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */ relative_time rel; /* Presence or counts of nonterminals of various flavors parsed so far. */ bool timespec_seen; bool rels_seen; size_t dates_seen; size_t days_seen; size_t local_zones_seen; size_t dsts_seen; size_t times_seen; size_t zones_seen; /* Table of local time zone abbreviations, terminated by a null entry. */ table local_time_zone_table[3]; } parser_control; union YYSTYPE; static int yylex (union YYSTYPE *, parser_control *); static int yyerror (parser_control const *, char const *); static long int time_zone_hhmm (parser_control *, textint, long int); /* Extract into *PC any date and time info from a string of digits of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY, YYYY, ...). */ static void digits_to_date_time (parser_control *pc, textint text_int) { if (pc->dates_seen && ! pc->year.digits && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits)) pc->year = text_int; else { if (4 < text_int.digits) { pc->dates_seen++; pc->day = text_int.value % 100; pc->month = (text_int.value / 100) % 100; pc->year.value = text_int.value / 10000; pc->year.digits = text_int.digits - 4; } else { pc->times_seen++; if (text_int.digits <= 2) { pc->hour = text_int.value; pc->minutes = 0; } else { pc->hour = text_int.value / 100; pc->minutes = text_int.value % 100; } pc->seconds.tv_sec = 0; pc->seconds.tv_nsec = 0; pc->meridian = MER24; } } } /* Increment PC->rel by FACTOR * REL (FACTOR is 1 or -1). */ static void apply_relative_time (parser_control *pc, relative_time rel, int factor) { pc->rel.ns += factor * rel.ns; pc->rel.seconds += factor * rel.seconds; pc->rel.minutes += factor * rel.minutes; pc->rel.hour += factor * rel.hour; pc->rel.day += factor * rel.day; pc->rel.month += factor * rel.month; pc->rel.year += factor * rel.year; pc->rels_seen = true; } /* Set PC-> hour, minutes, seconds and nanoseconds members from arguments. */ static void set_hhmmss (parser_control *pc, long int hour, long int minutes, time_t sec, long int nsec) { pc->hour = hour; pc->minutes = minutes; pc->seconds.tv_sec = sec; pc->seconds.tv_nsec = nsec; } /* Line 268 of yacc.c */ #line 358 "parse-datetime.c" /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { tAGO = 258, tDST = 259, tYEAR_UNIT = 260, tMONTH_UNIT = 261, tHOUR_UNIT = 262, tMINUTE_UNIT = 263, tSEC_UNIT = 264, tDAY_UNIT = 265, tDAY_SHIFT = 266, tDAY = 267, tDAYZONE = 268, tLOCAL_ZONE = 269, tMERIDIAN = 270, tMONTH = 271, tORDINAL = 272, tZONE = 273, tSNUMBER = 274, tUNUMBER = 275, tSDECIMAL_NUMBER = 276, tUDECIMAL_NUMBER = 277 }; #endif /* Tokens. */ #define tAGO 258 #define tDST 259 #define tYEAR_UNIT 260 #define tMONTH_UNIT 261 #define tHOUR_UNIT 262 #define tMINUTE_UNIT 263 #define tSEC_UNIT 264 #define tDAY_UNIT 265 #define tDAY_SHIFT 266 #define tDAY 267 #define tDAYZONE 268 #define tLOCAL_ZONE 269 #define tMERIDIAN 270 #define tMONTH 271 #define tORDINAL 272 #define tZONE 273 #define tSNUMBER 274 #define tUNUMBER 275 #define tSDECIMAL_NUMBER 276 #define tUDECIMAL_NUMBER 277 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { /* Line 293 of yacc.c */ #line 297 "parse-datetime.y" long int intval; textint textintval; struct timespec timespec; relative_time rel; /* Line 293 of yacc.c */ #line 447 "parse-datetime.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif /* Copy the second part of user declarations. */ /* Line 343 of yacc.c */ #line 459 "parse-datetime.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int yyi) #else static int YYID (yyi) int yyi; #endif { return yyi; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 12 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 112 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 28 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 26 /* YYNRULES -- Number of rules. */ #define YYNRULES 91 /* YYNRULES -- Number of states. */ #define YYNSTATES 114 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 277 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 2, 2, 27, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 2, 2, 2, 2, 23, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 5, 7, 10, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 38, 41, 46, 53, 55, 58, 63, 70, 71, 73, 76, 78, 81, 83, 85, 88, 91, 95, 97, 100, 102, 105, 108, 111, 115, 121, 125, 129, 132, 137, 140, 144, 146, 150, 153, 155, 157, 160, 163, 165, 168, 171, 173, 176, 179, 181, 184, 187, 189, 192, 195, 197, 200, 203, 206, 209, 211, 213, 216, 219, 222, 225, 228, 231, 233, 235, 237, 239, 241, 243, 245, 247, 250, 251 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 29, 0, -1, 30, -1, 31, -1, 23, 48, -1, -1, 31, 32, -1, 33, -1, 35, -1, 39, -1, 40, -1, 42, -1, 41, -1, 44, -1, 51, -1, 52, -1, 34, -1, 43, 24, 36, -1, 20, 15, -1, 20, 25, 20, 15, -1, 20, 25, 20, 25, 50, 15, -1, 36, -1, 20, 38, -1, 20, 25, 20, 37, -1, 20, 25, 20, 25, 50, 37, -1, -1, 38, -1, 19, 53, -1, 14, -1, 14, 4, -1, 18, -1, 24, -1, 18, 46, -1, 24, 46, -1, 18, 19, 53, -1, 13, -1, 18, 4, -1, 12, -1, 12, 26, -1, 17, 12, -1, 20, 12, -1, 20, 27, 20, -1, 20, 27, 20, 27, 20, -1, 20, 16, 19, -1, 16, 19, 19, -1, 16, 20, -1, 16, 20, 26, 20, -1, 20, 16, -1, 20, 16, 20, -1, 43, -1, 20, 19, 19, -1, 45, 3, -1, 45, -1, 47, -1, 17, 5, -1, 20, 5, -1, 5, -1, 17, 6, -1, 20, 6, -1, 6, -1, 17, 10, -1, 20, 10, -1, 10, -1, 17, 7, -1, 20, 7, -1, 7, -1, 17, 8, -1, 20, 8, -1, 8, -1, 17, 9, -1, 20, 9, -1, 21, 9, -1, 22, 9, -1, 9, -1, 46, -1, 19, 5, -1, 19, 6, -1, 19, 10, -1, 19, 7, -1, 19, 8, -1, 19, 9, -1, 11, -1, 49, -1, 50, -1, 21, -1, 19, -1, 22, -1, 20, -1, 20, -1, 20, 46, -1, -1, 25, 20, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 324, 324, 325, 329, 336, 338, 342, 344, 346, 348, 350, 352, 354, 355, 356, 360, 364, 368, 373, 378, 383, 387, 392, 397, 404, 406, 410, 418, 423, 433, 435, 437, 440, 443, 445, 447, 452, 457, 462, 467, 475, 480, 500, 508, 516, 521, 527, 532, 538, 542, 552, 554, 556, 561, 563, 565, 567, 569, 571, 573, 575, 577, 579, 581, 583, 585, 587, 589, 591, 593, 595, 597, 599, 601, 605, 607, 609, 611, 613, 615, 620, 624, 624, 627, 628, 633, 634, 639, 644, 655, 656 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "tAGO", "tDST", "tYEAR_UNIT", "tMONTH_UNIT", "tHOUR_UNIT", "tMINUTE_UNIT", "tSEC_UNIT", "tDAY_UNIT", "tDAY_SHIFT", "tDAY", "tDAYZONE", "tLOCAL_ZONE", "tMERIDIAN", "tMONTH", "tORDINAL", "tZONE", "tSNUMBER", "tUNUMBER", "tSDECIMAL_NUMBER", "tUDECIMAL_NUMBER", "'@'", "'T'", "':'", "','", "'/'", "$accept", "spec", "timespec", "items", "item", "datetime", "iso_8601_datetime", "time", "iso_8601_time", "o_zone_offset", "zone_offset", "local_zone", "zone", "day", "date", "iso_8601_date", "rel", "relunit", "relunit_snumber", "dayshift", "seconds", "signed_seconds", "unsigned_seconds", "number", "hybrid", "o_colon_minutes", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 64, 84, 58, 44, 47 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 28, 29, 29, 30, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 38, 39, 39, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 48, 48, 49, 49, 50, 50, 51, 52, 53, 53 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 4, 6, 1, 2, 4, 6, 0, 1, 2, 1, 2, 1, 1, 2, 2, 3, 1, 2, 1, 2, 2, 2, 3, 5, 3, 3, 2, 4, 2, 3, 1, 3, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 5, 0, 0, 2, 3, 85, 87, 84, 86, 4, 82, 83, 1, 56, 59, 65, 68, 73, 62, 81, 37, 35, 28, 0, 0, 30, 0, 88, 0, 0, 31, 6, 7, 16, 8, 21, 9, 10, 12, 11, 49, 13, 52, 74, 53, 14, 15, 38, 29, 0, 45, 54, 57, 63, 66, 69, 60, 39, 36, 90, 32, 75, 76, 78, 79, 80, 77, 55, 58, 64, 67, 70, 61, 40, 18, 47, 90, 0, 0, 22, 89, 71, 72, 33, 0, 51, 44, 0, 0, 34, 43, 48, 50, 27, 25, 41, 0, 17, 46, 91, 19, 90, 0, 23, 26, 0, 0, 25, 42, 25, 20, 24, 0, 25 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 2, 3, 4, 31, 32, 33, 34, 35, 103, 104, 36, 37, 38, 39, 40, 41, 42, 43, 44, 9, 10, 11, 45, 46, 93 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -93 static const yytype_int8 yypact[] = { 38, 27, 77, -93, 46, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, 62, -93, 82, -3, 66, 3, 74, -4, 83, 84, 75, -93, -93, -93, -93, -93, -93, -93, -93, -93, 71, -93, 93, -93, -93, -93, -93, -93, -93, 78, 72, -93, -93, -93, -93, -93, -93, -93, -93, 25, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, 21, 19, 79, 80, -93, -93, -93, -93, -93, 81, -93, -93, 85, 86, -93, -93, -93, -93, -93, -6, 76, 17, -93, -93, -93, -93, 87, 69, -93, -93, 88, 89, -1, -93, 18, -93, -93, 69, 91 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -93, -93, -93, -93, -93, -93, -93, -93, 20, -68, -27, -93, -93, -93, -93, -93, -93, -93, 60, -93, -93, -93, -92, -93, -93, 43 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 79, 67, 68, 69, 70, 71, 72, 58, 73, 100, 107, 74, 75, 101, 110, 76, 49, 50, 101, 102, 113, 77, 59, 78, 61, 62, 63, 64, 65, 66, 61, 62, 63, 64, 65, 66, 101, 101, 92, 111, 90, 91, 106, 112, 88, 111, 5, 6, 7, 8, 88, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 23, 24, 25, 26, 27, 28, 29, 79, 30, 51, 52, 53, 54, 55, 56, 12, 57, 61, 62, 63, 64, 65, 66, 60, 48, 80, 47, 6, 83, 8, 81, 82, 26, 84, 85, 86, 87, 94, 95, 96, 89, 105, 97, 98, 99, 0, 108, 109, 101, 0, 88 }; #define yypact_value_is_default(yystate) \ ((yystate) == (-93)) #define yytable_value_is_error(yytable_value) \ YYID (0) static const yytype_int8 yycheck[] = { 27, 5, 6, 7, 8, 9, 10, 4, 12, 15, 102, 15, 16, 19, 15, 19, 19, 20, 19, 25, 112, 25, 19, 27, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 19, 19, 19, 107, 19, 20, 25, 25, 25, 113, 19, 20, 21, 22, 25, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 23, 16, 17, 18, 19, 20, 21, 22, 96, 24, 5, 6, 7, 8, 9, 10, 0, 12, 5, 6, 7, 8, 9, 10, 25, 4, 27, 26, 20, 30, 22, 9, 9, 19, 24, 3, 19, 26, 20, 20, 20, 59, 27, 84, 20, 20, -1, 20, 20, 19, -1, 25 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 23, 29, 30, 31, 19, 20, 21, 22, 48, 49, 50, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 32, 33, 34, 35, 36, 39, 40, 41, 42, 43, 44, 45, 46, 47, 51, 52, 26, 4, 19, 20, 5, 6, 7, 8, 9, 10, 12, 4, 19, 46, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 12, 15, 16, 19, 25, 27, 38, 46, 9, 9, 46, 24, 3, 19, 26, 25, 53, 19, 20, 19, 53, 20, 20, 20, 36, 20, 20, 15, 19, 25, 37, 38, 27, 25, 50, 20, 20, 15, 37, 25, 50 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto yyerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (pc, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, pc) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, pc); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_control *pc) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, pc) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; parser_control *pc; #endif { if (!yyvaluep) return; YYUSE (pc); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_control *pc) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, pc) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; parser_control *pc; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, pc); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) #else static void yy_stack_print (yybottom, yytop) yytype_int16 *yybottom; yytype_int16 *yytop; #endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, parser_control *pc) #else static void yy_reduce_print (yyvsp, yyrule, pc) YYSTYPE *yyvsp; int yyrule; parser_control *pc; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , pc); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, pc); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = 0; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_control *pc) #else static void yydestruct (yymsg, yytype, yyvaluep, pc) const char *yymsg; int yytype; YYSTYPE *yyvaluep; parser_control *pc; #endif { YYUSE (yyvaluep); YYUSE (pc); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (parser_control *pc); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (parser_control *pc) #else int yyparse (pc) parser_control *pc; #endif #endif { /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: `yyss': related to states. `yyvs': related to semantic values. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yytoken = 0; yyss = yyssa; yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 4: /* Line 1806 of yacc.c */ #line 330 "parse-datetime.y" { pc->seconds = (yyvsp[(2) - (2)].timespec); pc->timespec_seen = true; } break; case 7: /* Line 1806 of yacc.c */ #line 343 "parse-datetime.y" { pc->times_seen++; pc->dates_seen++; } break; case 8: /* Line 1806 of yacc.c */ #line 345 "parse-datetime.y" { pc->times_seen++; } break; case 9: /* Line 1806 of yacc.c */ #line 347 "parse-datetime.y" { pc->local_zones_seen++; } break; case 10: /* Line 1806 of yacc.c */ #line 349 "parse-datetime.y" { pc->zones_seen++; } break; case 11: /* Line 1806 of yacc.c */ #line 351 "parse-datetime.y" { pc->dates_seen++; } break; case 12: /* Line 1806 of yacc.c */ #line 353 "parse-datetime.y" { pc->days_seen++; } break; case 18: /* Line 1806 of yacc.c */ #line 369 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (2)].textintval).value, 0, 0, 0); pc->meridian = (yyvsp[(2) - (2)].intval); } break; case 19: /* Line 1806 of yacc.c */ #line 374 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (4)].textintval).value, (yyvsp[(3) - (4)].textintval).value, 0, 0); pc->meridian = (yyvsp[(4) - (4)].intval); } break; case 20: /* Line 1806 of yacc.c */ #line 379 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (6)].textintval).value, (yyvsp[(3) - (6)].textintval).value, (yyvsp[(5) - (6)].timespec).tv_sec, (yyvsp[(5) - (6)].timespec).tv_nsec); pc->meridian = (yyvsp[(6) - (6)].intval); } break; case 22: /* Line 1806 of yacc.c */ #line 388 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (2)].textintval).value, 0, 0, 0); pc->meridian = MER24; } break; case 23: /* Line 1806 of yacc.c */ #line 393 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (4)].textintval).value, (yyvsp[(3) - (4)].textintval).value, 0, 0); pc->meridian = MER24; } break; case 24: /* Line 1806 of yacc.c */ #line 398 "parse-datetime.y" { set_hhmmss (pc, (yyvsp[(1) - (6)].textintval).value, (yyvsp[(3) - (6)].textintval).value, (yyvsp[(5) - (6)].timespec).tv_sec, (yyvsp[(5) - (6)].timespec).tv_nsec); pc->meridian = MER24; } break; case 27: /* Line 1806 of yacc.c */ #line 411 "parse-datetime.y" { pc->zones_seen++; pc->time_zone = time_zone_hhmm (pc, (yyvsp[(1) - (2)].textintval), (yyvsp[(2) - (2)].intval)); } break; case 28: /* Line 1806 of yacc.c */ #line 419 "parse-datetime.y" { pc->local_isdst = (yyvsp[(1) - (1)].intval); pc->dsts_seen += (0 < (yyvsp[(1) - (1)].intval)); } break; case 29: /* Line 1806 of yacc.c */ #line 424 "parse-datetime.y" { pc->local_isdst = 1; pc->dsts_seen += (0 < (yyvsp[(1) - (2)].intval)) + 1; } break; case 30: /* Line 1806 of yacc.c */ #line 434 "parse-datetime.y" { pc->time_zone = (yyvsp[(1) - (1)].intval); } break; case 31: /* Line 1806 of yacc.c */ #line 436 "parse-datetime.y" { pc->time_zone = HOUR(7); } break; case 32: /* Line 1806 of yacc.c */ #line 438 "parse-datetime.y" { pc->time_zone = (yyvsp[(1) - (2)].intval); apply_relative_time (pc, (yyvsp[(2) - (2)].rel), 1); } break; case 33: /* Line 1806 of yacc.c */ #line 441 "parse-datetime.y" { pc->time_zone = HOUR(7); apply_relative_time (pc, (yyvsp[(2) - (2)].rel), 1); } break; case 34: /* Line 1806 of yacc.c */ #line 444 "parse-datetime.y" { pc->time_zone = (yyvsp[(1) - (3)].intval) + time_zone_hhmm (pc, (yyvsp[(2) - (3)].textintval), (yyvsp[(3) - (3)].intval)); } break; case 35: /* Line 1806 of yacc.c */ #line 446 "parse-datetime.y" { pc->time_zone = (yyvsp[(1) - (1)].intval) + 60; } break; case 36: /* Line 1806 of yacc.c */ #line 448 "parse-datetime.y" { pc->time_zone = (yyvsp[(1) - (2)].intval) + 60; } break; case 37: /* Line 1806 of yacc.c */ #line 453 "parse-datetime.y" { pc->day_ordinal = 0; pc->day_number = (yyvsp[(1) - (1)].intval); } break; case 38: /* Line 1806 of yacc.c */ #line 458 "parse-datetime.y" { pc->day_ordinal = 0; pc->day_number = (yyvsp[(1) - (2)].intval); } break; case 39: /* Line 1806 of yacc.c */ #line 463 "parse-datetime.y" { pc->day_ordinal = (yyvsp[(1) - (2)].intval); pc->day_number = (yyvsp[(2) - (2)].intval); } break; case 40: /* Line 1806 of yacc.c */ #line 468 "parse-datetime.y" { pc->day_ordinal = (yyvsp[(1) - (2)].textintval).value; pc->day_number = (yyvsp[(2) - (2)].intval); } break; case 41: /* Line 1806 of yacc.c */ #line 476 "parse-datetime.y" { pc->month = (yyvsp[(1) - (3)].textintval).value; pc->day = (yyvsp[(3) - (3)].textintval).value; } break; case 42: /* Line 1806 of yacc.c */ #line 481 "parse-datetime.y" { /* Interpret as YYYY/MM/DD if the first value has 4 or more digits, otherwise as MM/DD/YY. The goal in recognizing YYYY/MM/DD is solely to support legacy machine-generated dates like those in an RCS log listing. If you want portability, use the ISO 8601 format. */ if (4 <= (yyvsp[(1) - (5)].textintval).digits) { pc->year = (yyvsp[(1) - (5)].textintval); pc->month = (yyvsp[(3) - (5)].textintval).value; pc->day = (yyvsp[(5) - (5)].textintval).value; } else { pc->month = (yyvsp[(1) - (5)].textintval).value; pc->day = (yyvsp[(3) - (5)].textintval).value; pc->year = (yyvsp[(5) - (5)].textintval); } } break; case 43: /* Line 1806 of yacc.c */ #line 501 "parse-datetime.y" { /* e.g. 17-JUN-1992. */ pc->day = (yyvsp[(1) - (3)].textintval).value; pc->month = (yyvsp[(2) - (3)].intval); pc->year.value = -(yyvsp[(3) - (3)].textintval).value; pc->year.digits = (yyvsp[(3) - (3)].textintval).digits; } break; case 44: /* Line 1806 of yacc.c */ #line 509 "parse-datetime.y" { /* e.g. JUN-17-1992. */ pc->month = (yyvsp[(1) - (3)].intval); pc->day = -(yyvsp[(2) - (3)].textintval).value; pc->year.value = -(yyvsp[(3) - (3)].textintval).value; pc->year.digits = (yyvsp[(3) - (3)].textintval).digits; } break; case 45: /* Line 1806 of yacc.c */ #line 517 "parse-datetime.y" { pc->month = (yyvsp[(1) - (2)].intval); pc->day = (yyvsp[(2) - (2)].textintval).value; } break; case 46: /* Line 1806 of yacc.c */ #line 522 "parse-datetime.y" { pc->month = (yyvsp[(1) - (4)].intval); pc->day = (yyvsp[(2) - (4)].textintval).value; pc->year = (yyvsp[(4) - (4)].textintval); } break; case 47: /* Line 1806 of yacc.c */ #line 528 "parse-datetime.y" { pc->day = (yyvsp[(1) - (2)].textintval).value; pc->month = (yyvsp[(2) - (2)].intval); } break; case 48: /* Line 1806 of yacc.c */ #line 533 "parse-datetime.y" { pc->day = (yyvsp[(1) - (3)].textintval).value; pc->month = (yyvsp[(2) - (3)].intval); pc->year = (yyvsp[(3) - (3)].textintval); } break; case 50: /* Line 1806 of yacc.c */ #line 543 "parse-datetime.y" { /* ISO 8601 format. YYYY-MM-DD. */ pc->year = (yyvsp[(1) - (3)].textintval); pc->month = -(yyvsp[(2) - (3)].textintval).value; pc->day = -(yyvsp[(3) - (3)].textintval).value; } break; case 51: /* Line 1806 of yacc.c */ #line 553 "parse-datetime.y" { apply_relative_time (pc, (yyvsp[(1) - (2)].rel), (yyvsp[(2) - (2)].intval)); } break; case 52: /* Line 1806 of yacc.c */ #line 555 "parse-datetime.y" { apply_relative_time (pc, (yyvsp[(1) - (1)].rel), 1); } break; case 53: /* Line 1806 of yacc.c */ #line 557 "parse-datetime.y" { apply_relative_time (pc, (yyvsp[(1) - (1)].rel), 1); } break; case 54: /* Line 1806 of yacc.c */ #line 562 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].intval); } break; case 55: /* Line 1806 of yacc.c */ #line 564 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; } break; case 56: /* Line 1806 of yacc.c */ #line 566 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = 1; } break; case 57: /* Line 1806 of yacc.c */ #line 568 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].intval); } break; case 58: /* Line 1806 of yacc.c */ #line 570 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; } break; case 59: /* Line 1806 of yacc.c */ #line 572 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = 1; } break; case 60: /* Line 1806 of yacc.c */ #line 574 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].intval) * (yyvsp[(2) - (2)].intval); } break; case 61: /* Line 1806 of yacc.c */ #line 576 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); } break; case 62: /* Line 1806 of yacc.c */ #line 578 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (1)].intval); } break; case 63: /* Line 1806 of yacc.c */ #line 580 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].intval); } break; case 64: /* Line 1806 of yacc.c */ #line 582 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; } break; case 65: /* Line 1806 of yacc.c */ #line 584 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = 1; } break; case 66: /* Line 1806 of yacc.c */ #line 586 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].intval); } break; case 67: /* Line 1806 of yacc.c */ #line 588 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; } break; case 68: /* Line 1806 of yacc.c */ #line 590 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = 1; } break; case 69: /* Line 1806 of yacc.c */ #line 592 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].intval); } break; case 70: /* Line 1806 of yacc.c */ #line 594 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; } break; case 71: /* Line 1806 of yacc.c */ #line 596 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].timespec).tv_sec; (yyval.rel).ns = (yyvsp[(1) - (2)].timespec).tv_nsec; } break; case 72: /* Line 1806 of yacc.c */ #line 598 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].timespec).tv_sec; (yyval.rel).ns = (yyvsp[(1) - (2)].timespec).tv_nsec; } break; case 73: /* Line 1806 of yacc.c */ #line 600 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = 1; } break; case 75: /* Line 1806 of yacc.c */ #line 606 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; } break; case 76: /* Line 1806 of yacc.c */ #line 608 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; } break; case 77: /* Line 1806 of yacc.c */ #line 610 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); } break; case 78: /* Line 1806 of yacc.c */ #line 612 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; } break; case 79: /* Line 1806 of yacc.c */ #line 614 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; } break; case 80: /* Line 1806 of yacc.c */ #line 616 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; } break; case 81: /* Line 1806 of yacc.c */ #line 621 "parse-datetime.y" { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (1)].intval); } break; case 85: /* Line 1806 of yacc.c */ #line 629 "parse-datetime.y" { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; } break; case 87: /* Line 1806 of yacc.c */ #line 635 "parse-datetime.y" { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; } break; case 88: /* Line 1806 of yacc.c */ #line 640 "parse-datetime.y" { digits_to_date_time (pc, (yyvsp[(1) - (1)].textintval)); } break; case 89: /* Line 1806 of yacc.c */ #line 645 "parse-datetime.y" { /* Hybrid all-digit and relative offset, so that we accept e.g., "YYYYMMDD +N days" as well as "YYYYMMDD N days". */ digits_to_date_time (pc, (yyvsp[(1) - (2)].textintval)); apply_relative_time (pc, (yyvsp[(2) - (2)].rel), 1); } break; case 90: /* Line 1806 of yacc.c */ #line 655 "parse-datetime.y" { (yyval.intval) = -1; } break; case 91: /* Line 1806 of yacc.c */ #line 657 "parse-datetime.y" { (yyval.intval) = (yyvsp[(2) - (2)].textintval).value; } break; /* Line 1806 of yacc.c */ #line 2410 "parse-datetime.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (pc, YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (pc, yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, pc); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, pc); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined(yyoverflow) || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (pc, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, pc); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, pc); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } /* Line 2067 of yacc.c */ #line 660 "parse-datetime.y" static table const meridian_table[] = { { "AM", tMERIDIAN, MERam }, { "A.M.", tMERIDIAN, MERam }, { "PM", tMERIDIAN, MERpm }, { "P.M.", tMERIDIAN, MERpm }, { NULL, 0, 0 } }; static table const dst_table[] = { { "DST", tDST, 0 } }; static table const month_and_day_table[] = { { "JANUARY", tMONTH, 1 }, { "FEBRUARY", tMONTH, 2 }, { "MARCH", tMONTH, 3 }, { "APRIL", tMONTH, 4 }, { "MAY", tMONTH, 5 }, { "JUNE", tMONTH, 6 }, { "JULY", tMONTH, 7 }, { "AUGUST", tMONTH, 8 }, { "SEPTEMBER",tMONTH, 9 }, { "SEPT", tMONTH, 9 }, { "OCTOBER", tMONTH, 10 }, { "NOVEMBER", tMONTH, 11 }, { "DECEMBER", tMONTH, 12 }, { "SUNDAY", tDAY, 0 }, { "MONDAY", tDAY, 1 }, { "TUESDAY", tDAY, 2 }, { "TUES", tDAY, 2 }, { "WEDNESDAY",tDAY, 3 }, { "WEDNES", tDAY, 3 }, { "THURSDAY", tDAY, 4 }, { "THUR", tDAY, 4 }, { "THURS", tDAY, 4 }, { "FRIDAY", tDAY, 5 }, { "SATURDAY", tDAY, 6 }, { NULL, 0, 0 } }; static table const time_units_table[] = { { "YEAR", tYEAR_UNIT, 1 }, { "MONTH", tMONTH_UNIT, 1 }, { "FORTNIGHT",tDAY_UNIT, 14 }, { "WEEK", tDAY_UNIT, 7 }, { "DAY", tDAY_UNIT, 1 }, { "HOUR", tHOUR_UNIT, 1 }, { "MINUTE", tMINUTE_UNIT, 1 }, { "MIN", tMINUTE_UNIT, 1 }, { "SECOND", tSEC_UNIT, 1 }, { "SEC", tSEC_UNIT, 1 }, { NULL, 0, 0 } }; /* Assorted relative-time words. */ static table const relative_time_table[] = { { "TOMORROW", tDAY_SHIFT, 1 }, { "YESTERDAY",tDAY_SHIFT, -1 }, { "TODAY", tDAY_SHIFT, 0 }, { "NOW", tDAY_SHIFT, 0 }, { "LAST", tORDINAL, -1 }, { "THIS", tORDINAL, 0 }, { "NEXT", tORDINAL, 1 }, { "FIRST", tORDINAL, 1 }, /*{ "SECOND", tORDINAL, 2 }, */ { "THIRD", tORDINAL, 3 }, { "FOURTH", tORDINAL, 4 }, { "FIFTH", tORDINAL, 5 }, { "SIXTH", tORDINAL, 6 }, { "SEVENTH", tORDINAL, 7 }, { "EIGHTH", tORDINAL, 8 }, { "NINTH", tORDINAL, 9 }, { "TENTH", tORDINAL, 10 }, { "ELEVENTH", tORDINAL, 11 }, { "TWELFTH", tORDINAL, 12 }, { "AGO", tAGO, -1 }, { "HENCE", tAGO, 1 }, { NULL, 0, 0 } }; /* The universal time zone table. These labels can be used even for time stamps that would not otherwise be valid, e.g., GMT time stamps in London during summer. */ static table const universal_time_zone_table[] = { { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */ { "UTC", tZONE, HOUR ( 0) }, { NULL, 0, 0 } }; /* The time zone table. This table is necessarily incomplete, as time zone abbreviations are ambiguous; e.g. Australians interpret "EST" as Eastern time in Australia, not as US Eastern Standard Time. You cannot rely on parse_datetime to handle arbitrary time zone abbreviations; use numeric abbreviations like "-0500" instead. */ static table const time_zone_table[] = { { "WET", tZONE, HOUR ( 0) }, /* Western European */ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */ { "CET", tZONE, HOUR ( 1) }, /* Central European */ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */ { "MET", tZONE, HOUR ( 1) }, /* Middle European */ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */ { "GST", tZONE, HOUR (10) }, /* Guam Standard */ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */ { NULL, 0, 0 } }; /* Military time zone table. Note 'T' is a special case, as it is used as the separator in ISO 8601 date and time of day representation. */ static table const military_table[] = { { "A", tZONE, -HOUR ( 1) }, { "B", tZONE, -HOUR ( 2) }, { "C", tZONE, -HOUR ( 3) }, { "D", tZONE, -HOUR ( 4) }, { "E", tZONE, -HOUR ( 5) }, { "F", tZONE, -HOUR ( 6) }, { "G", tZONE, -HOUR ( 7) }, { "H", tZONE, -HOUR ( 8) }, { "I", tZONE, -HOUR ( 9) }, { "K", tZONE, -HOUR (10) }, { "L", tZONE, -HOUR (11) }, { "M", tZONE, -HOUR (12) }, { "N", tZONE, HOUR ( 1) }, { "O", tZONE, HOUR ( 2) }, { "P", tZONE, HOUR ( 3) }, { "Q", tZONE, HOUR ( 4) }, { "R", tZONE, HOUR ( 5) }, { "S", tZONE, HOUR ( 6) }, { "T", 'T', 0 }, { "U", tZONE, HOUR ( 8) }, { "V", tZONE, HOUR ( 9) }, { "W", tZONE, HOUR (10) }, { "X", tZONE, HOUR (11) }, { "Y", tZONE, HOUR (12) }, { "Z", tZONE, HOUR ( 0) }, { NULL, 0, 0 } }; /* Convert a time zone expressed as HH:MM into an integer count of minutes. If MM is negative, then S is of the form HHMM and needs to be picked apart; otherwise, S is of the form HH. As specified in http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow only valid TZ range, and consider first two digits as hours, if no minutes specified. */ static long int time_zone_hhmm (parser_control *pc, textint s, long int mm) { long int n_minutes; /* If the length of S is 1 or 2 and no minutes are specified, interpret it as a number of hours. */ if (s.digits <= 2 && mm < 0) s.value *= 100; if (mm < 0) n_minutes = (s.value / 100) * 60 + s.value % 100; else n_minutes = s.value * 60 + (s.negative ? -mm : mm); /* If the absolute number of minutes is larger than 24 hours, arrange to reject it by incrementing pc->zones_seen. Thus, we allow only values in the range UTC-24:00 to UTC+24:00. */ if (24 * 60 < abs (n_minutes)) pc->zones_seen++; return n_minutes; } static int to_hour (long int hours, int meridian) { switch (meridian) { default: /* Pacify GCC. */ case MER24: return 0 <= hours && hours < 24 ? hours : -1; case MERam: return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1; case MERpm: return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1; } } static long int to_year (textint textyear) { long int year = textyear.value; if (year < 0) year = -year; /* XPG4 suggests that years 00-68 map to 2000-2068, and years 69-99 map to 1969-1999. */ else if (textyear.digits == 2) year += year < 69 ? 2000 : 1900; return year; } static table const * _GL_ATTRIBUTE_PURE lookup_zone (parser_control const *pc, char const *name) { table const *tp; for (tp = universal_time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; /* Try local zone abbreviations before those in time_zone_table, as the local ones are more likely to be right. */ for (tp = pc->local_time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; for (tp = time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; return NULL; } #if ! HAVE_TM_GMTOFF /* Yield the difference between *A and *B, measured in seconds, ignoring leap seconds. The body of this function is taken directly from the GNU C Library; see src/strftime.c. */ static long int tm_diff (struct tm const *a, struct tm const *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations. */ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); int a100 = a4 / 25 - (a4 % 25 < 0); int b100 = b4 / 25 - (b4 % 25 < 0); int a400 = SHR (a100, 2); int b400 = SHR (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); long int ayear = a->tm_year; long int years = ayear - b->tm_year; long int days = (365 * years + intervening_leap_days + (a->tm_yday - b->tm_yday)); return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) + (a->tm_min - b->tm_min)) + (a->tm_sec - b->tm_sec)); } #endif /* ! HAVE_TM_GMTOFF */ static table const * lookup_word (parser_control const *pc, char *word) { char *p; char *q; size_t wordlen; table const *tp; bool period_found; bool abbrev; /* Make it uppercase. */ for (p = word; *p; p++) { unsigned char ch = *p; *p = c_toupper (ch); } for (tp = meridian_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* See if we have an abbreviation for a month. */ wordlen = strlen (word); abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.'); for (tp = month_and_day_table; tp->name; tp++) if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0) return tp; if ((tp = lookup_zone (pc, word))) return tp; if (strcmp (word, dst_table[0].name) == 0) return dst_table; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Strip off any plural and try the units table again. */ if (word[wordlen - 1] == 'S') { word[wordlen - 1] = '\0'; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */ } for (tp = relative_time_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Military time zones. */ if (wordlen == 1) for (tp = military_table; tp->name; tp++) if (word[0] == tp->name[0]) return tp; /* Drop out any periods and try the time zone table again. */ for (period_found = false, p = q = word; (*p = *q); q++) if (*q == '.') period_found = true; else p++; if (period_found && (tp = lookup_zone (pc, word))) return tp; return NULL; } static int yylex (YYSTYPE *lvalp, parser_control *pc) { unsigned char c; size_t count; for (;;) { while (c = *pc->input, c_isspace (c)) pc->input++; if (ISDIGIT (c) || c == '-' || c == '+') { char const *p; int sign; unsigned long int value; if (c == '-' || c == '+') { sign = c == '-' ? -1 : 1; while (c = *++pc->input, c_isspace (c)) continue; if (! ISDIGIT (c)) /* skip the '-' sign */ continue; } else sign = 0; p = pc->input; for (value = 0; ; value *= 10) { unsigned long int value1 = value + (c - '0'); if (value1 < value) return '?'; value = value1; c = *++p; if (! ISDIGIT (c)) break; if (ULONG_MAX / 10 < value) return '?'; } if ((c == '.' || c == ',') && ISDIGIT (p[1])) { time_t s; int ns; int digits; unsigned long int value1; /* Check for overflow when converting value to time_t. */ if (sign < 0) { s = - value; if (0 < s) return '?'; value1 = -s; } else { s = value; if (s < 0) return '?'; value1 = s; } if (value != value1) return '?'; /* Accumulate fraction, to ns precision. */ p++; ns = *p++ - '0'; for (digits = 2; digits <= LOG10_BILLION; digits++) { ns *= 10; if (ISDIGIT (*p)) ns += *p++ - '0'; } /* Skip excess digits, truncating toward -Infinity. */ if (sign < 0) for (; ISDIGIT (*p); p++) if (*p != '0') { ns++; break; } while (ISDIGIT (*p)) p++; /* Adjust to the timespec convention, which is that tv_nsec is always a positive offset even if tv_sec is negative. */ if (sign < 0 && ns) { s--; if (! (s < 0)) return '?'; ns = BILLION - ns; } lvalp->timespec.tv_sec = s; lvalp->timespec.tv_nsec = ns; pc->input = p; return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER; } else { lvalp->textintval.negative = sign < 0; if (sign < 0) { lvalp->textintval.value = - value; if (0 < lvalp->textintval.value) return '?'; } else { lvalp->textintval.value = value; if (lvalp->textintval.value < 0) return '?'; } lvalp->textintval.digits = p - pc->input; pc->input = p; return sign ? tSNUMBER : tUNUMBER; } } if (c_isalpha (c)) { char buff[20]; char *p = buff; table const *tp; do { if (p - buff < sizeof buff - 1) *p++ = c; c = *++pc->input; } while (c_isalpha (c) || c == '.'); *p = '\0'; tp = lookup_word (pc, buff); if (! tp) return '?'; lvalp->intval = tp->value; return tp->type; } if (c != '(') return to_uchar (*pc->input++); count = 0; do { c = *pc->input++; if (c == '\0') return c; if (c == '(') count++; else if (c == ')') count--; } while (count != 0); } } /* Do nothing if the parser reports an error. */ static int yyerror (parser_control const *pc _GL_UNUSED, char const *s _GL_UNUSED) { return 0; } /* If *TM0 is the old and *TM1 is the new value of a struct tm after passing it to mktime, return true if it's OK that mktime returned T. It's not OK if *TM0 has out-of-range members. */ static bool mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t) { if (t == (time_t) -1) { /* Guard against falsely reporting an error when parsing a time stamp that happens to equal (time_t) -1, on a host that supports such a time stamp. */ tm1 = localtime (&t); if (!tm1) return false; } return ! ((tm0->tm_sec ^ tm1->tm_sec) | (tm0->tm_min ^ tm1->tm_min) | (tm0->tm_hour ^ tm1->tm_hour) | (tm0->tm_mday ^ tm1->tm_mday) | (tm0->tm_mon ^ tm1->tm_mon) | (tm0->tm_year ^ tm1->tm_year)); } /* A reasonable upper bound for the size of ordinary TZ strings. Use heap allocation if TZ's length exceeds this. */ enum { TZBUFSIZE = 100 }; /* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated otherwise. */ static char * get_tz (char tzbuf[TZBUFSIZE]) { char *tz = getenv ("TZ"); if (tz) { size_t tzsize = strlen (tz) + 1; tz = (tzsize <= TZBUFSIZE ? memcpy (tzbuf, tz, tzsize) : xmemdup (tz, tzsize)); } return tz; } /* Parse a date/time string, storing the resulting time value into *RESULT. The string itself is pointed to by P. Return true if successful. P can be an incomplete or relative time specification; if so, use *NOW as the basis for the returned time. */ bool parse_datetime (struct timespec *result, char const *p, struct timespec const *now) { time_t Start; long int Start_ns; struct tm const *tmp; struct tm tm; struct tm tm0; parser_control pc; struct timespec gettime_buffer; unsigned char c; bool tz_was_altered = false; char *tz0 = NULL; char tz0buf[TZBUFSIZE]; bool ok = true; if (! now) { gettime (&gettime_buffer); now = &gettime_buffer; } Start = now->tv_sec; Start_ns = now->tv_nsec; tmp = localtime (&now->tv_sec); if (! tmp) return false; while (c = *p, c_isspace (c)) p++; if (strncmp (p, "TZ=\"", 4) == 0) { char const *tzbase = p + 4; size_t tzsize = 1; char const *s; for (s = tzbase; *s; s++, tzsize++) if (*s == '\\') { s++; if (! (*s == '\\' || *s == '"')) break; } else if (*s == '"') { char *z; char *tz1; char tz1buf[TZBUFSIZE]; bool large_tz = TZBUFSIZE < tzsize; bool setenv_ok; /* Free tz0, in case this is the 2nd or subsequent time through. */ free (tz0); tz0 = get_tz (tz0buf); z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf; for (s = tzbase; *s != '"'; s++) *z++ = *(s += *s == '\\'); *z = '\0'; setenv_ok = setenv ("TZ", tz1, 1) == 0; if (large_tz) free (tz1); if (!setenv_ok) goto fail; tz_was_altered = true; p = s + 1; } } /* As documented, be careful to treat the empty string just like a date string of "0". Without this, an empty string would be declared invalid when parsed during a DST transition. */ if (*p == '\0') p = "0"; pc.input = p; pc.year.value = tmp->tm_year; pc.year.value += TM_YEAR_BASE; pc.year.digits = 0; pc.month = tmp->tm_mon + 1; pc.day = tmp->tm_mday; pc.hour = tmp->tm_hour; pc.minutes = tmp->tm_min; pc.seconds.tv_sec = tmp->tm_sec; pc.seconds.tv_nsec = Start_ns; tm.tm_isdst = tmp->tm_isdst; pc.meridian = MER24; pc.rel = RELATIVE_TIME_0; pc.timespec_seen = false; pc.rels_seen = false; pc.dates_seen = 0; pc.days_seen = 0; pc.times_seen = 0; pc.local_zones_seen = 0; pc.dsts_seen = 0; pc.zones_seen = 0; #if HAVE_STRUCT_TM_TM_ZONE pc.local_time_zone_table[0].name = tmp->tm_zone; pc.local_time_zone_table[0].type = tLOCAL_ZONE; pc.local_time_zone_table[0].value = tmp->tm_isdst; pc.local_time_zone_table[1].name = NULL; /* Probe the names used in the next three calendar quarters, looking for a tm_isdst different from the one we already have. */ { int quarter; for (quarter = 1; quarter <= 3; quarter++) { time_t probe = Start + quarter * (90 * 24 * 60 * 60); struct tm const *probe_tm = localtime (&probe); if (probe_tm && probe_tm->tm_zone && probe_tm->tm_isdst != pc.local_time_zone_table[0].value) { { pc.local_time_zone_table[1].name = probe_tm->tm_zone; pc.local_time_zone_table[1].type = tLOCAL_ZONE; pc.local_time_zone_table[1].value = probe_tm->tm_isdst; pc.local_time_zone_table[2].name = NULL; } break; } } } #else #if HAVE_TZNAME { # if !HAVE_DECL_TZNAME extern char *tzname[]; # endif int i; for (i = 0; i < 2; i++) { pc.local_time_zone_table[i].name = tzname[i]; pc.local_time_zone_table[i].type = tLOCAL_ZONE; pc.local_time_zone_table[i].value = i; } pc.local_time_zone_table[i].name = NULL; } #else pc.local_time_zone_table[0].name = NULL; #endif #endif if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name && ! strcmp (pc.local_time_zone_table[0].name, pc.local_time_zone_table[1].name)) { /* This locale uses the same abbreviation for standard and daylight times. So if we see that abbreviation, we don't know whether it's daylight time. */ pc.local_time_zone_table[0].value = -1; pc.local_time_zone_table[1].name = NULL; } if (yyparse (&pc) != 0) goto fail; if (pc.timespec_seen) *result = pc.seconds; else { if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen | (pc.local_zones_seen + pc.zones_seen))) goto fail; tm.tm_year = to_year (pc.year) - TM_YEAR_BASE; tm.tm_mon = pc.month - 1; tm.tm_mday = pc.day; if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen)) { tm.tm_hour = to_hour (pc.hour, pc.meridian); if (tm.tm_hour < 0) goto fail; tm.tm_min = pc.minutes; tm.tm_sec = pc.seconds.tv_sec; } else { tm.tm_hour = tm.tm_min = tm.tm_sec = 0; pc.seconds.tv_nsec = 0; } /* Let mktime deduce tm_isdst if we have an absolute time stamp. */ if (pc.dates_seen | pc.days_seen | pc.times_seen) tm.tm_isdst = -1; /* But if the input explicitly specifies local time with or without DST, give mktime that information. */ if (pc.local_zones_seen) tm.tm_isdst = pc.local_isdst; tm0 = tm; Start = mktime (&tm); if (! mktime_ok (&tm0, &tm, Start)) { if (! pc.zones_seen) goto fail; else { /* Guard against falsely reporting errors near the time_t boundaries when parsing times in other time zones. For example, suppose the input string "1969-12-31 23:00:00 -0100", the current time zone is 8 hours ahead of UTC, and the min time_t value is 1970-01-01 00:00:00 UTC. Then the min localtime value is 1970-01-01 08:00:00, and mktime will therefore fail on 1969-12-31 23:00:00. To work around the problem, set the time zone to 1 hour behind UTC temporarily by setting TZ="XXX1:00" and try mktime again. */ long int time_zone = pc.time_zone; long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone; long int abs_time_zone_hour = abs_time_zone / 60; int abs_time_zone_min = abs_time_zone % 60; char tz1buf[sizeof "XXX+0:00" + sizeof pc.time_zone * CHAR_BIT / 3]; if (!tz_was_altered) tz0 = get_tz (tz0buf); sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0), abs_time_zone_hour, abs_time_zone_min); if (setenv ("TZ", tz1buf, 1) != 0) goto fail; tz_was_altered = true; tm = tm0; Start = mktime (&tm); if (! mktime_ok (&tm0, &tm, Start)) goto fail; } } if (pc.days_seen && ! pc.dates_seen) { tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7 + 7 * (pc.day_ordinal - (0 < pc.day_ordinal && tm.tm_wday != pc.day_number))); tm.tm_isdst = -1; Start = mktime (&tm); if (Start == (time_t) -1) goto fail; } /* Add relative date. */ if (pc.rel.year | pc.rel.month | pc.rel.day) { int year = tm.tm_year + pc.rel.year; int month = tm.tm_mon + pc.rel.month; int day = tm.tm_mday + pc.rel.day; if (((year < tm.tm_year) ^ (pc.rel.year < 0)) | ((month < tm.tm_mon) ^ (pc.rel.month < 0)) | ((day < tm.tm_mday) ^ (pc.rel.day < 0))) goto fail; tm.tm_year = year; tm.tm_mon = month; tm.tm_mday = day; tm.tm_hour = tm0.tm_hour; tm.tm_min = tm0.tm_min; tm.tm_sec = tm0.tm_sec; tm.tm_isdst = tm0.tm_isdst; Start = mktime (&tm); if (Start == (time_t) -1) goto fail; } /* The only "output" of this if-block is an updated Start value, so this block must follow others that clobber Start. */ if (pc.zones_seen) { long int delta = pc.time_zone * 60; time_t t1; #ifdef HAVE_TM_GMTOFF delta -= tm.tm_gmtoff; #else time_t t = Start; struct tm const *gmt = gmtime (&t); if (! gmt) goto fail; delta -= tm_diff (&tm, gmt); #endif t1 = Start - delta; if ((Start < t1) != (delta < 0)) goto fail; /* time_t overflow */ Start = t1; } /* Add relative hours, minutes, and seconds. On hosts that support leap seconds, ignore the possibility of leap seconds; e.g., "+ 10 minutes" adds 600 seconds, even if one of them is a leap second. Typically this is not what the user wants, but it's too hard to do it the other way, because the time zone indicator must be applied before relative times, and if mktime is applied again the time zone will be lost. */ { long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns; long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION; time_t t0 = Start; long int d1 = 60 * 60 * pc.rel.hour; time_t t1 = t0 + d1; long int d2 = 60 * pc.rel.minutes; time_t t2 = t1 + d2; long_time_t d3 = pc.rel.seconds; long_time_t t3 = t2 + d3; long int d4 = (sum_ns - normalized_ns) / BILLION; long_time_t t4 = t3 + d4; time_t t5 = t4; if ((d1 / (60 * 60) ^ pc.rel.hour) | (d2 / 60 ^ pc.rel.minutes) | ((t1 < t0) ^ (d1 < 0)) | ((t2 < t1) ^ (d2 < 0)) | ((t3 < t2) ^ (d3 < 0)) | ((t4 < t3) ^ (d4 < 0)) | (t5 != t4)) goto fail; result->tv_sec = t5; result->tv_nsec = normalized_ns; } } goto done; fail: ok = false; done: if (tz_was_altered) ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0; if (tz0 != tz0buf) free (tz0); return ok; } #if TEST int main (int ac, char **av) { char buff[BUFSIZ]; printf ("Enter date, or blank line to exit.\n\t> "); fflush (stdout); buff[BUFSIZ - 1] = '\0'; while (fgets (buff, BUFSIZ - 1, stdin) && buff[0]) { struct timespec d; struct tm const *tm; if (! parse_datetime (&d, buff, NULL)) printf ("Bad format - couldn't convert.\n"); else if (! (tm = localtime (&d.tv_sec))) { long int sec = d.tv_sec; printf ("localtime (%ld) failed\n", sec); } else { int ns = d.tv_nsec; printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n", tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, ns); } printf ("\t> "); fflush (stdout); } return 0; } #endif /* TEST */ shishi-1.0.2/gl/getaddrinfo.c0000644000000000000000000002422112126660051012724 00000000000000/* Get address information (partial implementation). Copyright (C) 1997, 2001-2002, 2004-2013 Free Software Foundation, Inc. Contributed by Simon Josefsson . 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, 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 . */ /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the sa == NULL test below. */ #define _GL_ARG_NONNULL(params) #include #include #if HAVE_NETINET_IN_H # include #endif /* Get inet_ntop. */ #include /* Get calloc. */ #include /* Get memcpy, strdup. */ #include /* Get snprintf. */ #include #include #include "gettext.h" #define _(String) gettext (String) #define N_(String) String /* BeOS has AF_INET, but not PF_INET. */ #ifndef PF_INET # define PF_INET AF_INET #endif /* BeOS also lacks PF_UNSPEC. */ #ifndef PF_UNSPEC # define PF_UNSPEC 0 #endif #if defined _WIN32 || defined __WIN32__ # define WINDOWS_NATIVE #endif /* gl_sockets_startup */ #include "sockets.h" #ifdef WINDOWS_NATIVE typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, const struct addrinfo*, struct addrinfo**); typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*, socklen_t, char*, DWORD, char*, DWORD, int); static getaddrinfo_func getaddrinfo_ptr = NULL; static freeaddrinfo_func freeaddrinfo_ptr = NULL; static getnameinfo_func getnameinfo_ptr = NULL; static int use_win32_p (void) { static int done = 0; HMODULE h; if (done) return getaddrinfo_ptr ? 1 : 0; done = 1; h = GetModuleHandle ("ws2_32.dll"); if (h) { getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo"); freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo"); getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo"); } /* If either is missing, something is odd. */ if (!getaddrinfo_ptr || !freeaddrinfo_ptr || !getnameinfo_ptr) { getaddrinfo_ptr = NULL; freeaddrinfo_ptr = NULL; getnameinfo_ptr = NULL; return 0; } gl_sockets_startup (SOCKETS_1_1); return 1; } #endif static bool validate_family (int family) { /* FIXME: Support more families. */ #if HAVE_IPV4 if (family == PF_INET) return true; #endif #if HAVE_IPV6 if (family == PF_INET6) return true; #endif if (family == PF_UNSPEC) return true; return false; } /* Translate name of a service location and/or a service name to set of socket addresses. */ int getaddrinfo (const char *restrict nodename, const char *restrict servname, const struct addrinfo *restrict hints, struct addrinfo **restrict res) { struct addrinfo *tmp; int port = 0; struct hostent *he; void *storage; size_t size; #if HAVE_IPV6 struct v6_pair { struct addrinfo addrinfo; struct sockaddr_in6 sockaddr_in6; }; #endif #if HAVE_IPV4 struct v4_pair { struct addrinfo addrinfo; struct sockaddr_in sockaddr_in; }; #endif #ifdef WINDOWS_NATIVE if (use_win32_p ()) return getaddrinfo_ptr (nodename, servname, hints, res); #endif if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE))) /* FIXME: Support more flags. */ return EAI_BADFLAGS; if (hints && !validate_family (hints->ai_family)) return EAI_FAMILY; if (hints && hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM) /* FIXME: Support other socktype. */ return EAI_SOCKTYPE; /* FIXME: Better return code? */ if (!nodename) { if (!(hints->ai_flags & AI_PASSIVE)) return EAI_NONAME; #ifdef HAVE_IPV6 nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0"; #else nodename = "0.0.0.0"; #endif } if (servname) { struct servent *se = NULL; const char *proto = (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp"; if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV)) /* FIXME: Use getservbyname_r if available. */ se = getservbyname (servname, proto); if (!se) { char *c; if (!(*servname >= '0' && *servname <= '9')) return EAI_NONAME; port = strtoul (servname, &c, 10); if (*c || port > 0xffff) return EAI_NONAME; port = htons (port); } else port = se->s_port; } /* FIXME: Use gethostbyname_r if available. */ he = gethostbyname (nodename); if (!he || he->h_addr_list[0] == NULL) return EAI_NONAME; switch (he->h_addrtype) { #if HAVE_IPV6 case PF_INET6: size = sizeof (struct v6_pair); break; #endif #if HAVE_IPV4 case PF_INET: size = sizeof (struct v4_pair); break; #endif default: return EAI_NODATA; } storage = calloc (1, size); if (!storage) return EAI_MEMORY; switch (he->h_addrtype) { #if HAVE_IPV6 case PF_INET6: { struct v6_pair *p = storage; struct sockaddr_in6 *sinp = &p->sockaddr_in6; tmp = &p->addrinfo; if (port) sinp->sin6_port = port; if (he->h_length != sizeof (sinp->sin6_addr)) { free (storage); return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ } memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr); tmp->ai_addr = (struct sockaddr *) sinp; tmp->ai_addrlen = sizeof *sinp; } break; #endif #if HAVE_IPV4 case PF_INET: { struct v4_pair *p = storage; struct sockaddr_in *sinp = &p->sockaddr_in; tmp = &p->addrinfo; if (port) sinp->sin_port = port; if (he->h_length != sizeof (sinp->sin_addr)) { free (storage); return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ } memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr); tmp->ai_addr = (struct sockaddr *) sinp; tmp->ai_addrlen = sizeof *sinp; } break; #endif default: free (storage); return EAI_NODATA; } if (hints && hints->ai_flags & AI_CANONNAME) { const char *cn; if (he->h_name) cn = he->h_name; else cn = nodename; tmp->ai_canonname = strdup (cn); if (!tmp->ai_canonname) { free (storage); return EAI_MEMORY; } } tmp->ai_protocol = (hints) ? hints->ai_protocol : 0; tmp->ai_socktype = (hints) ? hints->ai_socktype : 0; tmp->ai_addr->sa_family = he->h_addrtype; tmp->ai_family = he->h_addrtype; #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN switch (he->h_addrtype) { #if HAVE_IPV4 case AF_INET: tmp->ai_addr->sa_len = sizeof (struct sockaddr_in); break; #endif #if HAVE_IPV6 case AF_INET6: tmp->ai_addr->sa_len = sizeof (struct sockaddr_in6); break; #endif } #endif /* FIXME: If more than one address, create linked list of addrinfo's. */ *res = tmp; return 0; } /* Free 'addrinfo' structure AI including associated storage. */ void freeaddrinfo (struct addrinfo *ai) { #ifdef WINDOWS_NATIVE if (use_win32_p ()) { freeaddrinfo_ptr (ai); return; } #endif while (ai) { struct addrinfo *cur; cur = ai; ai = ai->ai_next; free (cur->ai_canonname); free (cur); } } int getnameinfo (const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags) { #ifdef WINDOWS_NATIVE if (use_win32_p ()) return getnameinfo_ptr (sa, salen, node, nodelen, service, servicelen, flags); #endif /* FIXME: Support other flags. */ if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) || (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) || (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV))) return EAI_BADFLAGS; if (sa == NULL || salen < sizeof (sa->sa_family)) return EAI_FAMILY; switch (sa->sa_family) { #if HAVE_IPV4 case AF_INET: if (salen < sizeof (struct sockaddr_in)) return EAI_FAMILY; break; #endif #if HAVE_IPV6 case AF_INET6: if (salen < sizeof (struct sockaddr_in6)) return EAI_FAMILY; break; #endif default: return EAI_FAMILY; } if (node && nodelen > 0 && flags & NI_NUMERICHOST) { switch (sa->sa_family) { #if HAVE_IPV4 case AF_INET: if (!inet_ntop (AF_INET, &(((const struct sockaddr_in *) sa)->sin_addr), node, nodelen)) return EAI_SYSTEM; break; #endif #if HAVE_IPV6 case AF_INET6: if (!inet_ntop (AF_INET6, &(((const struct sockaddr_in6 *) sa)->sin6_addr), node, nodelen)) return EAI_SYSTEM; break; #endif default: return EAI_FAMILY; } } if (service && servicelen > 0 && flags & NI_NUMERICSERV) switch (sa->sa_family) { #if HAVE_IPV4 case AF_INET: #endif #if HAVE_IPV6 case AF_INET6: #endif { unsigned short int port = ntohs (((const struct sockaddr_in *) sa)->sin_port); if (servicelen <= snprintf (service, servicelen, "%u", port)) return EAI_OVERFLOW; } break; } return 0; } shishi-1.0.2/gl/vasnprintf.c0000644000000000000000000066464212126660054012654 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 1999, 2002-2013 Free Software Foundation, Inc. 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, 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 . */ /* This file can be parametrized with the following macros: VASNPRINTF The name of the function being defined. FCHAR_T The element type of the format string. DCHAR_T The element type of the destination (result) string. FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters in the format string are ASCII. MUST be set if FCHAR_T and DCHAR_T are not the same type. DIRECTIVE Structure denoting a format directive. Depends on FCHAR_T. DIRECTIVES Structure denoting the set of format directives of a format string. Depends on FCHAR_T. PRINTF_PARSE Function that parses a format string. Depends on FCHAR_T. DCHAR_CPY memcpy like function for DCHAR_T[] arrays. DCHAR_SET memset like function for DCHAR_T[] arrays. DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays. SNPRINTF The system's snprintf (or similar) function. This may be either snprintf or swprintf. TCHAR_T The element type of the argument and result string of the said SNPRINTF function. This may be either char or wchar_t. The code exploits that sizeof (TCHAR_T) | sizeof (DCHAR_T) and alignof (TCHAR_T) <= alignof (DCHAR_T). DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type. DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[]. DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t. DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t. DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */ /* Tell glibc's to provide a prototype for snprintf(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifndef VASNPRINTF # include #endif #ifndef IN_LIBINTL # include #endif /* Specification. */ #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # include "vasnwprintf.h" # else # include "vasnprintf.h" # endif #endif #include /* localeconv() */ #include /* snprintf(), sprintf() */ #include /* abort(), malloc(), realloc(), free() */ #include /* memcpy(), strlen() */ #include /* errno */ #include /* CHAR_BIT */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ #if HAVE_NL_LANGINFO # include #endif #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # include "wprintf-parse.h" # else # include "printf-parse.h" # endif #endif /* Checked size_t computations. */ #include "xsize.h" #include "verify.h" #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "float+.h" #endif #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL # include # include "isnand-nolibm.h" #endif #if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "isnanl-nolibm.h" # include "fpucw.h" #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL # include # include "isnand-nolibm.h" # include "printf-frexp.h" #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL # include # include "isnanl-nolibm.h" # include "printf-frexpl.h" # include "fpucw.h" #endif /* Default parameters. */ #ifndef VASNPRINTF # if WIDE_CHAR_VERSION # define VASNPRINTF vasnwprintf # define FCHAR_T wchar_t # define DCHAR_T wchar_t # define TCHAR_T wchar_t # define DCHAR_IS_TCHAR 1 # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives # define PRINTF_PARSE wprintf_parse # define DCHAR_CPY wmemcpy # define DCHAR_SET wmemset # else # define VASNPRINTF vasnprintf # define FCHAR_T char # define DCHAR_T char # define TCHAR_T char # define DCHAR_IS_TCHAR 1 # define DIRECTIVE char_directive # define DIRECTIVES char_directives # define PRINTF_PARSE printf_parse # define DCHAR_CPY memcpy # define DCHAR_SET memset # endif #endif #if WIDE_CHAR_VERSION /* TCHAR_T is wchar_t. */ # define USE_SNPRINTF 1 # if HAVE_DECL__SNWPRINTF /* On Windows, the function swprintf() has a different signature than on Unix; we use the function _snwprintf() or - on mingw - snwprintf() instead. The mingw function snwprintf() has fewer bugs than the MSVCRT function _snwprintf(), so prefer that. */ # if defined __MINGW32__ # define SNPRINTF snwprintf # else # define SNPRINTF _snwprintf # endif # else /* Unix. */ # define SNPRINTF swprintf # endif #else /* TCHAR_T is char. */ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'. But don't use it on BeOS, since BeOS snprintf produces no output if the size argument is >= 0x3000000. Also don't use it on Linux libc5, since there snprintf with size = 1 writes any output without bounds, like sprintf. */ # if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1) # define USE_SNPRINTF 1 # else # define USE_SNPRINTF 0 # endif # if HAVE_DECL__SNPRINTF /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT function _snprintf(), so prefer that. */ # if defined __MINGW32__ # define SNPRINTF snprintf /* Here we need to call the native snprintf, not rpl_snprintf. */ # undef snprintf # else # define SNPRINTF _snprintf # endif # else /* Unix. */ # define SNPRINTF snprintf /* Here we need to call the native snprintf, not rpl_snprintf. */ # undef snprintf # endif #endif /* Here we need to call the native sprintf, not rpl_sprintf. */ #undef sprintf /* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized" warnings in this file. Use -Dlint to suppress them. */ #ifdef lint # define IF_LINT(Code) Code #else # define IF_LINT(Code) /* empty */ #endif /* Avoid some warnings from "gcc -Wshadow". This file doesn't use the exp() and remainder() functions. */ #undef exp #define exp expo #undef remainder #define remainder rem #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && !WIDE_CHAR_VERSION # if (HAVE_STRNLEN && !defined _AIX) # define local_strnlen strnlen # else # ifndef local_strnlen_defined # define local_strnlen_defined 1 static size_t local_strnlen (const char *string, size_t maxlen) { const char *end = memchr (string, '\0', maxlen); return end ? (size_t) (end - string) : maxlen; } # endif # endif #endif #if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T # if HAVE_WCSLEN # define local_wcslen wcslen # else /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid a dependency towards this library, here is a local substitute. Define this substitute only once, even if this file is included twice in the same compilation unit. */ # ifndef local_wcslen_defined # define local_wcslen_defined 1 static size_t local_wcslen (const wchar_t *s) { const wchar_t *ptr; for (ptr = s; *ptr != (wchar_t) 0; ptr++) ; return ptr - s; } # endif # endif #endif #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && HAVE_WCHAR_T && WIDE_CHAR_VERSION # if HAVE_WCSNLEN # define local_wcsnlen wcsnlen # else # ifndef local_wcsnlen_defined # define local_wcsnlen_defined 1 static size_t local_wcsnlen (const wchar_t *s, size_t maxlen) { const wchar_t *ptr; for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--) ; return ptr - s; } # endif # endif #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL /* Determine the decimal-point character according to the current locale. */ # ifndef decimal_point_char_defined # define decimal_point_char_defined 1 static char decimal_point_char (void) { const char *point; /* Determine it in a multithread-safe way. We know nl_langinfo is multithread-safe on glibc systems and Mac OS X systems, but is not required to be multithread-safe by POSIX. sprintf(), however, is multithread-safe. localeconv() is rarely multithread-safe. */ # if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__)) point = nl_langinfo (RADIXCHAR); # elif 1 char pointbuf[5]; sprintf (pointbuf, "%#.0f", 1.0); point = &pointbuf[1]; # else point = localeconv () -> decimal_point; # endif /* The decimal point is always a single byte: either '.' or ','. */ return (point[0] != '\0' ? point[0] : '.'); } # endif #endif #if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL /* Equivalent to !isfinite(x) || x == 0, but does not require libm. */ static int is_infinite_or_zero (double x) { return isnand (x) || x + x == x; } #endif #if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL /* Equivalent to !isfinite(x) || x == 0, but does not require libm. */ static int is_infinite_or_zerol (long double x) { return isnanl (x) || x + x == x; } #endif #if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL /* Converting 'long double' to decimal without rare rounding bugs requires real bignums. We use the naming conventions of GNU gmp, but vastly simpler (and slower) algorithms. */ typedef unsigned int mp_limb_t; # define GMP_LIMB_BITS 32 verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS); typedef unsigned long long mp_twolimb_t; # define GMP_TWOLIMB_BITS 64 verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS); /* Representation of a bignum >= 0. */ typedef struct { size_t nlimbs; mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */ } mpn_t; /* Compute the product of two bignums >= 0. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * multiply (mpn_t src1, mpn_t src2, mpn_t *dest) { const mp_limb_t *p1; const mp_limb_t *p2; size_t len1; size_t len2; if (src1.nlimbs <= src2.nlimbs) { len1 = src1.nlimbs; p1 = src1.limbs; len2 = src2.nlimbs; p2 = src2.limbs; } else { len1 = src2.nlimbs; p1 = src2.limbs; len2 = src1.nlimbs; p2 = src1.limbs; } /* Now 0 <= len1 <= len2. */ if (len1 == 0) { /* src1 or src2 is zero. */ dest->nlimbs = 0; dest->limbs = (mp_limb_t *) malloc (1); } else { /* Here 1 <= len1 <= len2. */ size_t dlen; mp_limb_t *dp; size_t k, i, j; dlen = len1 + len2; dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t)); if (dp == NULL) return NULL; for (k = len2; k > 0; ) dp[--k] = 0; for (i = 0; i < len1; i++) { mp_limb_t digit1 = p1[i]; mp_twolimb_t carry = 0; for (j = 0; j < len2; j++) { mp_limb_t digit2 = p2[j]; carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; carry += dp[i + j]; dp[i + j] = (mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; } dp[i + len2] = (mp_limb_t) carry; } /* Normalise. */ while (dlen > 0 && dp[dlen - 1] == 0) dlen--; dest->nlimbs = dlen; dest->limbs = dp; } return dest->limbs; } /* Compute the quotient of a bignum a >= 0 and a bignum b > 0. a is written as a = q * b + r with 0 <= r < b. q is the quotient, r the remainder. Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd, q is incremented. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * divide (mpn_t a, mpn_t b, mpn_t *q) { /* Algorithm: First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]] with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS). If m=n=1, perform a single-precision division: r:=0, j:=m, while j>0 do {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j = = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r=n>1, perform a multiple-precision division: We have a/b < beta^(m-n+1). s:=intDsize-1-(highest bit in b[n-1]), 0<=s=beta/2. For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).} Compute q* : q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]). In case of overflow (q* >= beta) set q* := beta-1. Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2] and c3 := b[n-2] * q*. {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow occurred. Furthermore 0 <= c3 < beta^2. If there was overflow and r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2, the next test can be skipped.} While c3 > c2, {Here 0 <= c2 < c3 < beta^2} Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2]. If q* > 0: Put r := r - b * q* * beta^j. In detail: [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]]. hence: u:=0, for i:=0 to n-1 do u := u + q* * b[i], r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry), u:=u div beta (+ 1, if carry in subtraction) r[n+j]:=r[n+j]-u. {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1 < q* + 1 <= beta, the carry u does not overflow.} If a negative carry occurs, put q* := q* - 1 and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]]. Set q[j] := q*. Normalise [q[m-n],..,q[0]]; this yields the quotient q. Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the rest r. The room for q[j] can be allocated at the memory location of r[n+j]. Finally, round-to-even: Shift r left by 1 bit. If r > b or if r = b and q[0] is odd, q := q+1. */ const mp_limb_t *a_ptr = a.limbs; size_t a_len = a.nlimbs; const mp_limb_t *b_ptr = b.limbs; size_t b_len = b.nlimbs; mp_limb_t *roomptr; mp_limb_t *tmp_roomptr = NULL; mp_limb_t *q_ptr; size_t q_len; mp_limb_t *r_ptr; size_t r_len; /* Allocate room for a_len+2 digits. (Need a_len+1 digits for the real division and 1 more digit for the final rounding of q.) */ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t)); if (roomptr == NULL) return NULL; /* Normalise a. */ while (a_len > 0 && a_ptr[a_len - 1] == 0) a_len--; /* Normalise b. */ for (;;) { if (b_len == 0) /* Division by zero. */ abort (); if (b_ptr[b_len - 1] == 0) b_len--; else break; } /* Here m = a_len >= 0 and n = b_len > 0. */ if (a_len < b_len) { /* m beta^(m-2) <= a/b < beta^m */ r_ptr = roomptr; q_ptr = roomptr + 1; { mp_limb_t den = b_ptr[0]; mp_limb_t remainder = 0; const mp_limb_t *sourceptr = a_ptr + a_len; mp_limb_t *destptr = q_ptr + a_len; size_t count; for (count = a_len; count > 0; count--) { mp_twolimb_t num = ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr; *--destptr = num / den; remainder = num % den; } /* Normalise and store r. */ if (remainder > 0) { r_ptr[0] = remainder; r_len = 1; } else r_len = 0; /* Normalise q. */ q_len = a_len; if (q_ptr[q_len - 1] == 0) q_len--; } } else { /* n>1: multiple precision division. beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==> beta^(m-n-1) <= a/b < beta^(m-n+1). */ /* Determine s. */ size_t s; { mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */ /* Determine s = GMP_LIMB_BITS - integer_length (msd). Code copied from gnulib's integer_length.c. */ # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) s = __builtin_clz (msd); # else # if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT if (GMP_LIMB_BITS <= DBL_MANT_BIT) { /* Use 'double' operations. Assumes an IEEE 754 'double' implementation. */ # define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) # define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1) # define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) union { double value; unsigned int word[NWORDS]; } m; /* Use a single integer to floating-point conversion. */ m.value = msd; s = GMP_LIMB_BITS - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK) - DBL_EXP_BIAS); } else # undef NWORDS # endif { s = 31; if (msd >= 0x10000) { msd = msd >> 16; s -= 16; } if (msd >= 0x100) { msd = msd >> 8; s -= 8; } if (msd >= 0x10) { msd = msd >> 4; s -= 4; } if (msd >= 0x4) { msd = msd >> 2; s -= 2; } if (msd >= 0x2) { msd = msd >> 1; s -= 1; } } # endif } /* 0 <= s < GMP_LIMB_BITS. Copy b, shifting it left by s bits. */ if (s > 0) { tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t)); if (tmp_roomptr == NULL) { free (roomptr); return NULL; } { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = tmp_roomptr; mp_twolimb_t accu = 0; size_t count; for (count = b_len; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } /* accu must be zero, since that was how s was determined. */ if (accu != 0) abort (); } b_ptr = tmp_roomptr; } /* Copy a, shifting it left by s bits, yields r. Memory layout: At the beginning: r = roomptr[0..a_len], at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */ r_ptr = roomptr; if (s == 0) { memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t)); r_ptr[a_len] = 0; } else { const mp_limb_t *sourceptr = a_ptr; mp_limb_t *destptr = r_ptr; mp_twolimb_t accu = 0; size_t count; for (count = a_len; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } *destptr++ = (mp_limb_t) accu; } q_ptr = roomptr + b_len; q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */ { size_t j = a_len - b_len; /* m-n */ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd; /* Division loop, traversed m-n+1 times. j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */ for (;;) { mp_limb_t q_star; mp_limb_t c1; if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */ { /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */ mp_twolimb_t num = ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS) | r_ptr[j + b_len - 1]; q_star = num / b_msd; c1 = num % b_msd; } else { /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) {<= beta !}. If yes, jump directly to the subtraction loop. (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */ if (r_ptr[j + b_len] > b_msd || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd) /* r[j+n] >= b[n-1]+1 or r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a carry. */ goto subtract; } /* q_star = q*, c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, 0, decrease it by b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2 this can happen only twice. */ if (c3 > c2) { q_star = q_star - 1; /* q* := q* - 1 */ if (c3 - c2 > b_msdd) q_star = q_star - 1; /* q* := q* - 1 */ } } if (q_star > 0) subtract: { /* Subtract r := r - b * q* * beta^j. */ mp_limb_t cr; { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = r_ptr + j; mp_twolimb_t carry = 0; size_t count; for (count = b_len; count > 0; count--) { /* Here 0 <= carry <= q*. */ carry = carry + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++ + (mp_limb_t) ~(*destptr); /* Here 0 <= carry <= beta*q* + beta-1. */ *destptr++ = ~(mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; /* <= q* */ } cr = (mp_limb_t) carry; } /* Subtract cr from r_ptr[j + b_len], then forget about r_ptr[j + b_len]. */ if (cr > r_ptr[j + b_len]) { /* Subtraction gave a carry. */ q_star = q_star - 1; /* q* := q* - 1 */ /* Add b back. */ { const mp_limb_t *sourceptr = b_ptr; mp_limb_t *destptr = r_ptr + j; mp_limb_t carry = 0; size_t count; for (count = b_len; count > 0; count--) { mp_limb_t source1 = *sourceptr++; mp_limb_t source2 = *destptr; *destptr++ = source1 + source2 + carry; carry = (carry ? source1 >= (mp_limb_t) ~source2 : source1 > (mp_limb_t) ~source2); } } /* Forget about the carry and about r[j+n]. */ } } /* q* is determined. Store it as q[j]. */ q_ptr[j] = q_star; if (j == 0) break; j--; } } r_len = b_len; /* Normalise q. */ if (q_ptr[q_len - 1] == 0) q_len--; # if 0 /* Not needed here, since we need r only to compare it with b/2, and b is shifted left by s bits. */ /* Shift r right by s bits. */ if (s > 0) { mp_limb_t ptr = r_ptr + r_len; mp_twolimb_t accu = 0; size_t count; for (count = r_len; count > 0; count--) { accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS; accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s); *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS); } } # endif /* Normalise r. */ while (r_len > 0 && r_ptr[r_len - 1] == 0) r_len--; } /* Compare r << 1 with b. */ if (r_len > b_len) goto increment_q; { size_t i; for (i = b_len;;) { mp_limb_t r_i = (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0) | (i < r_len ? r_ptr[i] << 1 : 0); mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0); if (r_i > b_i) goto increment_q; if (r_i < b_i) goto keep_q; if (i == 0) break; i--; } } if (q_len > 0 && ((q_ptr[0] & 1) != 0)) /* q is odd. */ increment_q: { size_t i; for (i = 0; i < q_len; i++) if (++(q_ptr[i]) != 0) goto keep_q; q_ptr[q_len++] = 1; } keep_q: if (tmp_roomptr != NULL) free (tmp_roomptr); q->limbs = q_ptr; q->nlimbs = q_len; return roomptr; } /* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal representation. Destroys the contents of a. Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * convert_to_decimal (mpn_t a, size_t extra_zeroes) { mp_limb_t *a_ptr = a.limbs; size_t a_len = a.nlimbs; /* 0.03345 is slightly larger than log(2)/(9*log(10)). */ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1); char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes)); if (c_ptr != NULL) { char *d_ptr = c_ptr; for (; extra_zeroes > 0; extra_zeroes--) *d_ptr++ = '0'; while (a_len > 0) { /* Divide a by 10^9, in-place. */ mp_limb_t remainder = 0; mp_limb_t *ptr = a_ptr + a_len; size_t count; for (count = a_len; count > 0; count--) { mp_twolimb_t num = ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr; *ptr = num / 1000000000; remainder = num % 1000000000; } /* Store the remainder as 9 decimal digits. */ for (count = 9; count > 0; count--) { *d_ptr++ = '0' + (remainder % 10); remainder = remainder / 10; } /* Normalize a. */ if (a_ptr[a_len - 1] == 0) a_len--; } /* Remove leading zeroes. */ while (d_ptr > c_ptr && d_ptr[-1] == '0') d_ptr--; /* But keep at least one zero. */ if (d_ptr == c_ptr) *d_ptr++ = '0'; /* Terminate the string. */ *d_ptr = '\0'; } return c_ptr; } # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and >= 0: write x as x = 2^e * m, where m is a bignum. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * decode_long_double (long double x, int *ep, mpn_t *mp) { mpn_t m; int exp; long double y; size_t i; /* Allocate memory for result. */ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); if (m.limbs == NULL) return NULL; /* Split into exponential part and mantissa. */ y = frexpl (x, &exp); if (!(y >= 0.0L && y < 1.0L)) abort (); /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the latter is an integer. */ /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs. I'm not sure whether it's safe to cast a 'long double' value between 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int', doesn't matter). */ # if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0 # if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2)); hi = (int) y; y -= hi; if (!(y >= 0.0L && y < 1.0L)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # else { mp_limb_t d; y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS); d = (int) y; y -= d; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d; } # endif # endif for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); hi = (int) y; y -= hi; if (!(y >= 0.0L && y < 1.0L)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0L && y < 1.0L)) abort (); m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess precision. */ if (!(y == 0.0L)) abort (); # endif /* Normalise. */ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) m.nlimbs--; *mp = m; *ep = exp - LDBL_MANT_BIT; return m.limbs; } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and >= 0: write x as x = 2^e * m, where m is a bignum. Return the allocated memory in case of success, NULL in case of memory allocation failure. */ static void * decode_double (double x, int *ep, mpn_t *mp) { mpn_t m; int exp; double y; size_t i; /* Allocate memory for result. */ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); if (m.limbs == NULL) return NULL; /* Split into exponential part and mantissa. */ y = frexp (x, &exp); if (!(y >= 0.0 && y < 1.0)) abort (); /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the latter is an integer. */ /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs. I'm not sure whether it's safe to cast a 'double' value between 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only 'double' values between 0 and 2^16 (to 'unsigned int' or 'int', doesn't matter). */ # if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0 # if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2)); hi = (int) y; y -= hi; if (!(y >= 0.0 && y < 1.0)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; } # else { mp_limb_t d; y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS); d = (int) y; y -= d; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d; } # endif # endif for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) { mp_limb_t hi, lo; y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); hi = (int) y; y -= hi; if (!(y >= 0.0 && y < 1.0)) abort (); y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); lo = (int) y; y -= lo; if (!(y >= 0.0 && y < 1.0)) abort (); m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; } if (!(y == 0.0)) abort (); /* Normalise. */ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) m.nlimbs--; *mp = m; *ep = exp - DBL_MANT_BIT; return m.limbs; } # endif /* Assuming x = 2^e * m is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) { int s; size_t extra_zeroes; unsigned int abs_n; unsigned int abs_s; mp_limb_t *pow5_ptr; size_t pow5_len; unsigned int s_limbs; unsigned int s_bits; mpn_t pow5; mpn_t z; void *z_memory; char *digits; if (memory == NULL) return NULL; /* x = 2^e * m, hence y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m) = round (2^s * 5^n * m). */ s = e + n; extra_zeroes = 0; /* Factor out a common power of 10 if possible. */ if (s > 0 && n > 0) { extra_zeroes = (s < n ? s : n); s -= extra_zeroes; n -= extra_zeroes; } /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes. Before converting to decimal, we need to compute z = round (2^s * 5^n * m). */ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same sign. 2.322 is slightly larger than log(5)/log(2). */ abs_n = (n >= 0 ? n : -n); abs_s = (s >= 0 ? s : -s); pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1 + abs_s / GMP_LIMB_BITS + 1) * sizeof (mp_limb_t)); if (pow5_ptr == NULL) { free (memory); return NULL; } /* Initialize with 1. */ pow5_ptr[0] = 1; pow5_len = 1; /* Multiply with 5^|n|. */ if (abs_n > 0) { static mp_limb_t const small_pow5[13 + 1] = { 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125 }; unsigned int n13; for (n13 = 0; n13 <= abs_n; n13 += 13) { mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13]; size_t j; mp_twolimb_t carry = 0; for (j = 0; j < pow5_len; j++) { mp_limb_t digit2 = pow5_ptr[j]; carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; pow5_ptr[j] = (mp_limb_t) carry; carry = carry >> GMP_LIMB_BITS; } if (carry > 0) pow5_ptr[pow5_len++] = (mp_limb_t) carry; } } s_limbs = abs_s / GMP_LIMB_BITS; s_bits = abs_s % GMP_LIMB_BITS; if (n >= 0 ? s >= 0 : s <= 0) { /* Multiply with 2^|s|. */ if (s_bits > 0) { mp_limb_t *ptr = pow5_ptr; mp_twolimb_t accu = 0; size_t count; for (count = pow5_len; count > 0; count--) { accu += (mp_twolimb_t) *ptr << s_bits; *ptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } if (accu > 0) { *ptr = (mp_limb_t) accu; pow5_len++; } } if (s_limbs > 0) { size_t count; for (count = pow5_len; count > 0;) { count--; pow5_ptr[s_limbs + count] = pow5_ptr[count]; } for (count = s_limbs; count > 0;) { count--; pow5_ptr[count] = 0; } pow5_len += s_limbs; } pow5.limbs = pow5_ptr; pow5.nlimbs = pow5_len; if (n >= 0) { /* Multiply m with pow5. No division needed. */ z_memory = multiply (m, pow5, &z); } else { /* Divide m by pow5 and round. */ z_memory = divide (m, pow5, &z); } } else { pow5.limbs = pow5_ptr; pow5.nlimbs = pow5_len; if (n >= 0) { /* n >= 0, s < 0. Multiply m with pow5, then divide by 2^|s|. */ mpn_t numerator; mpn_t denominator; void *tmp_memory; tmp_memory = multiply (m, pow5, &numerator); if (tmp_memory == NULL) { free (pow5_ptr); free (memory); return NULL; } /* Construct 2^|s|. */ { mp_limb_t *ptr = pow5_ptr + pow5_len; size_t i; for (i = 0; i < s_limbs; i++) ptr[i] = 0; ptr[s_limbs] = (mp_limb_t) 1 << s_bits; denominator.limbs = ptr; denominator.nlimbs = s_limbs + 1; } z_memory = divide (numerator, denominator, &z); free (tmp_memory); } else { /* n < 0, s > 0. Multiply m with 2^s, then divide by pow5. */ mpn_t numerator; mp_limb_t *num_ptr; num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1) * sizeof (mp_limb_t)); if (num_ptr == NULL) { free (pow5_ptr); free (memory); return NULL; } { mp_limb_t *destptr = num_ptr; { size_t i; for (i = 0; i < s_limbs; i++) *destptr++ = 0; } if (s_bits > 0) { const mp_limb_t *sourceptr = m.limbs; mp_twolimb_t accu = 0; size_t count; for (count = m.nlimbs; count > 0; count--) { accu += (mp_twolimb_t) *sourceptr++ << s_bits; *destptr++ = (mp_limb_t) accu; accu = accu >> GMP_LIMB_BITS; } if (accu > 0) *destptr++ = (mp_limb_t) accu; } else { const mp_limb_t *sourceptr = m.limbs; size_t count; for (count = m.nlimbs; count > 0; count--) *destptr++ = *sourceptr++; } numerator.limbs = num_ptr; numerator.nlimbs = destptr - num_ptr; } z_memory = divide (numerator, pow5, &z); free (num_ptr); } } free (pow5_ptr); free (memory); /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */ if (z_memory == NULL) return NULL; digits = convert_to_decimal (z, extra_zeroes); free (z_memory); return digits; } # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_long_double (long double x, int n) { int e IF_LINT(= 0); mpn_t m; void *memory = decode_long_double (x, &e, &m); return scale10_round_decimal_decoded (e, m, memory, n); } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and >= 0, and n is an integer: Returns the decimal representation of round (x * 10^n). Return the allocated memory - containing the decimal digits in low-to-high order, terminated with a NUL character - in case of success, NULL in case of memory allocation failure. */ static char * scale10_round_decimal_double (double x, int n) { int e IF_LINT(= 0); mpn_t m; void *memory = decode_double (x, &e, &m); return scale10_round_decimal_decoded (e, m, memory, n); } # endif # if NEED_PRINTF_LONG_DOUBLE /* Assuming x is finite and > 0: Return an approximation for n with 10^n <= x < 10^(n+1). The approximation is usually the right n, but may be off by 1 sometimes. */ static int floorlog10l (long double x) { int exp; long double y; double z; double l; /* Split into exponential part and mantissa. */ y = frexpl (x, &exp); if (!(y >= 0.0L && y < 1.0L)) abort (); if (y == 0.0L) return INT_MIN; if (y < 0.5L) { while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) { y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); exp -= GMP_LIMB_BITS; } if (y < (1.0L / (1 << 16))) { y *= 1.0L * (1 << 16); exp -= 16; } if (y < (1.0L / (1 << 8))) { y *= 1.0L * (1 << 8); exp -= 8; } if (y < (1.0L / (1 << 4))) { y *= 1.0L * (1 << 4); exp -= 4; } if (y < (1.0L / (1 << 2))) { y *= 1.0L * (1 << 2); exp -= 2; } if (y < (1.0L / (1 << 1))) { y *= 1.0L * (1 << 1); exp -= 1; } } if (!(y >= 0.5L && y < 1.0L)) abort (); /* Compute an approximation for l = log2(x) = exp + log2(y). */ l = exp; z = y; if (z < 0.70710678118654752444) { z *= 1.4142135623730950488; l -= 0.5; } if (z < 0.8408964152537145431) { z *= 1.1892071150027210667; l -= 0.25; } if (z < 0.91700404320467123175) { z *= 1.0905077326652576592; l -= 0.125; } if (z < 0.9576032806985736469) { z *= 1.0442737824274138403; l -= 0.0625; } /* Now 0.95 <= z <= 1.01. */ z = 1 - z; /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...) Four terms are enough to get an approximation with error < 10^-7. */ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); /* Finally multiply with log(2)/log(10), yields an approximation for log10(x). */ l *= 0.30102999566398119523; /* Round down to the next integer. */ return (int) l + (l < 0 ? -1 : 0); } # endif # if NEED_PRINTF_DOUBLE /* Assuming x is finite and > 0: Return an approximation for n with 10^n <= x < 10^(n+1). The approximation is usually the right n, but may be off by 1 sometimes. */ static int floorlog10 (double x) { int exp; double y; double z; double l; /* Split into exponential part and mantissa. */ y = frexp (x, &exp); if (!(y >= 0.0 && y < 1.0)) abort (); if (y == 0.0) return INT_MIN; if (y < 0.5) { while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) { y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); exp -= GMP_LIMB_BITS; } if (y < (1.0 / (1 << 16))) { y *= 1.0 * (1 << 16); exp -= 16; } if (y < (1.0 / (1 << 8))) { y *= 1.0 * (1 << 8); exp -= 8; } if (y < (1.0 / (1 << 4))) { y *= 1.0 * (1 << 4); exp -= 4; } if (y < (1.0 / (1 << 2))) { y *= 1.0 * (1 << 2); exp -= 2; } if (y < (1.0 / (1 << 1))) { y *= 1.0 * (1 << 1); exp -= 1; } } if (!(y >= 0.5 && y < 1.0)) abort (); /* Compute an approximation for l = log2(x) = exp + log2(y). */ l = exp; z = y; if (z < 0.70710678118654752444) { z *= 1.4142135623730950488; l -= 0.5; } if (z < 0.8408964152537145431) { z *= 1.1892071150027210667; l -= 0.25; } if (z < 0.91700404320467123175) { z *= 1.0905077326652576592; l -= 0.125; } if (z < 0.9576032806985736469) { z *= 1.0442737824274138403; l -= 0.0625; } /* Now 0.95 <= z <= 1.01. */ z = 1 - z; /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...) Four terms are enough to get an approximation with error < 10^-7. */ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); /* Finally multiply with log(2)/log(10), yields an approximation for log10(x). */ l *= 0.30102999566398119523; /* Round down to the next integer. */ return (int) l + (l < 0 ? -1 : 0); } # endif /* Tests whether a string of digits consists of exactly PRECISION zeroes and a single '1' digit. */ static int is_borderline (const char *digits, size_t precision) { for (; precision > 0; precision--, digits++) if (*digits != '0') return 0; if (*digits != '1') return 0; digits++; return *digits == '\0'; } #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 /* Use a different function name, to make it possible that the 'wchar_t' parametrization and the 'char' parametrization get compiled in the same translation unit. */ # if WIDE_CHAR_VERSION # define MAX_ROOM_NEEDED wmax_room_needed # else # define MAX_ROOM_NEEDED max_room_needed # endif /* Returns the number of TCHAR_T units needed as temporary space for the result of sprintf or SNPRINTF of a single conversion directive. */ static size_t MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion, arg_type type, int flags, size_t width, int has_precision, size_t precision, int pad_ourselves) { size_t tmp_length; switch (conversion) { case 'd': case 'i': case 'u': # if HAVE_LONG_LONG_INT if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.30103 /* binary -> decimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Multiply by 2, as an estimate for FLAG_GROUP. */ tmp_length = xsum (tmp_length, tmp_length); /* Add 1, to account for a leading sign. */ tmp_length = xsum (tmp_length, 1); break; case 'o': # if HAVE_LONG_LONG_INT if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Add 1, to account for a leading sign. */ tmp_length = xsum (tmp_length, 1); break; case 'x': case 'X': # if HAVE_LONG_LONG_INT if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Add 2, to account for a leading sign or alternate form. */ tmp_length = xsum (tmp_length, 2); break; case 'f': case 'F': if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ else tmp_length = (unsigned int) (DBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ tmp_length = xsum (tmp_length, precision); break; case 'e': case 'E': case 'g': case 'G': tmp_length = 12; /* sign, decimal point, exponent etc. */ tmp_length = xsum (tmp_length, precision); break; case 'a': case 'A': if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_DIG * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) (DBL_DIG * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); break; case 'c': # if HAVE_WINT_T && !WIDE_CHAR_VERSION if (type == TYPE_WIDE_CHAR) tmp_length = MB_CUR_MAX; else # endif tmp_length = 1; break; case 's': # if HAVE_WCHAR_T if (type == TYPE_WIDE_STRING) { # if WIDE_CHAR_VERSION /* ISO C says about %ls in fwprintf: "If the precision is not specified or is greater than the size of the array, the array shall contain a null wide character." So if there is a precision, we must not use wcslen. */ const wchar_t *arg = ap->arg[arg_index].a.a_wide_string; if (has_precision) tmp_length = local_wcsnlen (arg, precision); else tmp_length = local_wcslen (arg); # else /* ISO C says about %ls in fprintf: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." So if there is a precision, we must not use wcslen. */ /* This case has already been handled separately in VASNPRINTF. */ abort (); # endif } else # endif { # if WIDE_CHAR_VERSION /* ISO C says about %s in fwprintf: "If the precision is not specified or is greater than the size of the converted array, the converted array shall contain a null wide character." So if there is a precision, we must not use strlen. */ /* This case has already been handled separately in VASNPRINTF. */ abort (); # else /* ISO C says about %s in fprintf: "If the precision is not specified or greater than the size of the array, the array shall contain a null character." So if there is a precision, we must not use strlen. */ const char *arg = ap->arg[arg_index].a.a_string; if (has_precision) tmp_length = local_strnlen (arg, precision); else tmp_length = strlen (arg); # endif } break; case 'p': tmp_length = (unsigned int) (sizeof (void *) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading 0x */ break; default: abort (); } if (!pad_ourselves) { # if ENABLE_UNISTDIO /* Padding considers the number of characters, therefore the number of elements after padding may be > max (tmp_length, width) but is certainly <= tmp_length + width. */ tmp_length = xsum (tmp_length, width); # else /* Padding considers the number of elements, says POSIX. */ if (tmp_length < width) tmp_length = width; # endif } tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ return tmp_length; } #endif DCHAR_T * VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, const FCHAR_T *format, va_list args) { DIRECTIVES d; arguments a; if (PRINTF_PARSE (format, &d, &a) < 0) /* errno is already set. */ return NULL; #define CLEANUP() \ if (d.dir != d.direct_alloc_dir) \ free (d.dir); \ if (a.arg != a.direct_alloc_arg) \ free (a.arg); if (PRINTF_FETCHARGS (args, &a) < 0) { CLEANUP (); errno = EINVAL; return NULL; } { size_t buf_neededlength; TCHAR_T *buf; TCHAR_T *buf_malloced; const FCHAR_T *cp; size_t i; DIRECTIVE *dp; /* Output string accumulator. */ DCHAR_T *result; size_t allocated; size_t length; /* Allocate a small buffer that will hold a directive passed to sprintf or snprintf. */ buf_neededlength = xsum4 (7, d.max_width_length, d.max_precision_length, 6); #if HAVE_ALLOCA if (buf_neededlength < 4000 / sizeof (TCHAR_T)) { buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T)); buf_malloced = NULL; } else #endif { size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T)); if (size_overflow_p (buf_memsize)) goto out_of_memory_1; buf = (TCHAR_T *) malloc (buf_memsize); if (buf == NULL) goto out_of_memory_1; buf_malloced = buf; } if (resultbuf != NULL) { result = resultbuf; allocated = *lengthp; } else { result = NULL; allocated = 0; } length = 0; /* Invariants: result is either == resultbuf or == NULL or malloc-allocated. If length > 0, then result != NULL. */ /* Ensures that allocated >= needed. Aborts through a jump to out_of_memory if needed is SIZE_MAX or otherwise too big. */ #define ENSURE_ALLOCATION(needed) \ if ((needed) > allocated) \ { \ size_t memory_size; \ DCHAR_T *memory; \ \ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ if ((needed) > allocated) \ allocated = (needed); \ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \ if (size_overflow_p (memory_size)) \ goto out_of_memory; \ if (result == resultbuf || result == NULL) \ memory = (DCHAR_T *) malloc (memory_size); \ else \ memory = (DCHAR_T *) realloc (result, memory_size); \ if (memory == NULL) \ goto out_of_memory; \ if (result == resultbuf && length > 0) \ DCHAR_CPY (memory, result, length); \ result = memory; \ } for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) { if (cp != dp->dir_start) { size_t n = dp->dir_start - cp; size_t augmented_length = xsum (length, n); ENSURE_ALLOCATION (augmented_length); /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we need that the format string contains only ASCII characters if FCHAR_T and DCHAR_T are not the same type. */ if (sizeof (FCHAR_T) == sizeof (DCHAR_T)) { DCHAR_CPY (result + length, (const DCHAR_T *) cp, n); length = augmented_length; } else { do result[length++] = (unsigned char) *cp++; while (--n > 0); } } if (i == d.count) break; /* Execute a single directive. */ if (dp->conversion == '%') { size_t augmented_length; if (!(dp->arg_index == ARG_NONE)) abort (); augmented_length = xsum (length, 1); ENSURE_ALLOCATION (augmented_length); result[length] = '%'; length = augmented_length; } else { if (!(dp->arg_index != ARG_NONE)) abort (); if (dp->conversion == 'n') { switch (a.arg[dp->arg_index].type) { case TYPE_COUNT_SCHAR_POINTER: *a.arg[dp->arg_index].a.a_count_schar_pointer = length; break; case TYPE_COUNT_SHORT_POINTER: *a.arg[dp->arg_index].a.a_count_short_pointer = length; break; case TYPE_COUNT_INT_POINTER: *a.arg[dp->arg_index].a.a_count_int_pointer = length; break; case TYPE_COUNT_LONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longint_pointer = length; break; #if HAVE_LONG_LONG_INT case TYPE_COUNT_LONGLONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; break; #endif default: abort (); } } #if ENABLE_UNISTDIO /* The unistdio extensions. */ else if (dp->conversion == 'U') { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = (unsigned int) (-arg); } else width = arg; } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } switch (type) { case TYPE_U8_STRING: { const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string; const uint8_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u8_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u8_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u8_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (has_width && width > characters && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT8_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-8 to locale encoding. */ converted = u8_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-8 to UTF-16/UTF-32. */ converted = U8_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (has_width && width > characters && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; case TYPE_U16_STRING: { const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string; const uint16_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u16_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u16_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u16_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (has_width && width > characters && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT16_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-16 to locale encoding. */ converted = u16_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-16 to UTF-8/UTF-32. */ converted = U16_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (has_width && width > characters && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; case TYPE_U32_STRING: { const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string; const uint32_t *arg_end; size_t characters; if (has_precision) { /* Use only PRECISION characters, from the left. */ arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count = u32_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of characters. */ arg_end = arg; characters = 0; for (;;) { int count = u32_strmblen (arg_end); if (count == 0) break; if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + u32_strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (has_width && width > characters && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_UINT32_T { size_t n = arg_end - arg; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_CPY (result + length, arg, n); length += n; } # else { /* Convert. */ DCHAR_T *converted = result + length; size_t converted_len = allocated - length; # if DCHAR_IS_TCHAR /* Convert from UTF-32 to locale encoding. */ converted = u32_conv_to_encoding (locale_charset (), iconveh_question_mark, arg, arg_end - arg, NULL, converted, &converted_len); # else /* Convert from UTF-32 to UTF-8/UTF-16. */ converted = U32_TO_DCHAR (arg, arg_end - arg, converted, &converted_len); # endif if (converted == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } if (converted != result + length) { ENSURE_ALLOCATION (xsum (length, converted_len)); DCHAR_CPY (result + length, converted, converted_len); free (converted); } length += converted_len; } # endif if (has_width && width > characters && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } break; default: abort (); } } #endif #if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T else if (dp->conversion == 's' # if WIDE_CHAR_VERSION && a.arg[dp->arg_index].type != TYPE_WIDE_STRING # else && a.arg[dp->arg_index].type == TYPE_WIDE_STRING # endif ) { /* The normal handling of the 's' directive below requires allocating a temporary buffer. The determination of its length (tmp_length), in the case when a precision is specified, below requires a conversion between a char[] string and a wchar_t[] wide string. It could be done, but we have no guarantee that the implementation of sprintf will use the exactly same algorithm. Without this guarantee, it is possible to have buffer overrun bugs. In order to avoid such bugs, we implement the entire processing of the 's' directive ourselves. */ int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = (unsigned int) (-arg); } else width = arg; } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } # if WIDE_CHAR_VERSION /* %s in vasnwprintf. See the specification of fwprintf. */ { const char *arg = a.arg[dp->arg_index].a.a_string; const char *arg_end; size_t characters; if (has_precision) { /* Use only as many bytes as needed to produce PRECISION wide characters, from the left. */ # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (; precision > 0; precision--) { int count; # if HAVE_MBRTOWC count = mbrlen (arg_end, MB_CUR_MAX, &state); # else count = mblen (arg_end, MB_CUR_MAX); # endif if (count == 0) /* Found the terminating NUL. */ break; if (count < 0) { /* Invalid or incomplete multibyte character. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else if (has_width) { /* Use the entire string, and count the number of wide characters. */ # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (;;) { int count; # if HAVE_MBRTOWC count = mbrlen (arg_end, MB_CUR_MAX, &state); # else count = mblen (arg_end, MB_CUR_MAX); # endif if (count == 0) /* Found the terminating NUL. */ break; if (count < 0) { /* Invalid or incomplete multibyte character. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end += count; characters++; } } else { /* Use the entire string. */ arg_end = arg + strlen (arg); /* The number of characters doesn't matter. */ characters = 0; } if (has_width && width > characters && !(dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } if (has_precision || has_width) { /* We know the number of wide characters in advance. */ size_t remaining; # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif ENSURE_ALLOCATION (xsum (length, characters)); for (remaining = characters; remaining > 0; remaining--) { wchar_t wc; int count; # if HAVE_MBRTOWC count = mbrtowc (&wc, arg, arg_end - arg, &state); # else count = mbtowc (&wc, arg, arg_end - arg); # endif if (count <= 0) /* mbrtowc not consistent with mbrlen, or mbtowc not consistent with mblen. */ abort (); result[length++] = wc; arg += count; } if (!(arg == arg_end)) abort (); } else { # if HAVE_MBRTOWC mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif while (arg < arg_end) { wchar_t wc; int count; # if HAVE_MBRTOWC count = mbrtowc (&wc, arg, arg_end - arg, &state); # else count = mbtowc (&wc, arg, arg_end - arg); # endif if (count <= 0) /* mbrtowc not consistent with mbrlen, or mbtowc not consistent with mblen. */ abort (); ENSURE_ALLOCATION (xsum (length, 1)); result[length++] = wc; arg += count; } } if (has_width && width > characters && (dp->flags & FLAG_LEFT)) { size_t n = width - characters; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } # else /* %ls in vasnprintf. See the specification of fprintf. */ { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; const wchar_t *arg_end; size_t characters; # if !DCHAR_IS_TCHAR /* This code assumes that TCHAR_T is 'char'. */ verify (sizeof (TCHAR_T) == 1); TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t tmpdst_len; # endif size_t w; if (has_precision) { /* Use only as many wide characters as needed to produce at most PRECISION bytes, from the left. */ # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; while (precision > 0) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg_end == 0) /* Found the terminating null wide character. */ break; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t count = wcrtomb (cbuf, *arg_end, &state); # else count = wctomb (cbuf, *arg_end); # endif if (count < 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } if (precision < count) break; arg_end++; characters += count; precision -= count; } } # if DCHAR_IS_TCHAR else if (has_width) # else else # endif { /* Use the entire string, and count the number of bytes. */ # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif arg_end = arg; characters = 0; for (;;) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg_end == 0) /* Found the terminating null wide character. */ break; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t count = wcrtomb (cbuf, *arg_end, &state); # else count = wctomb (cbuf, *arg_end); # endif if (count < 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } arg_end++; characters += count; } } # if DCHAR_IS_TCHAR else { /* Use the entire string. */ arg_end = arg + local_wcslen (arg); /* The number of bytes doesn't matter. */ characters = 0; } # endif # if !DCHAR_IS_TCHAR /* Convert the string into a piece of temporary memory. */ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T)); if (tmpsrc == NULL) goto out_of_memory; { TCHAR_T *tmpptr = tmpsrc; size_t remaining; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif for (remaining = characters; remaining > 0; ) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t count = wcrtomb (cbuf, *arg, &state); # else count = wctomb (cbuf, *arg); # endif if (count <= 0) /* Inconsistency. */ abort (); memcpy (tmpptr, cbuf, count); tmpptr += count; arg++; remaining -= count; } if (!(arg == arg_end)) abort (); } /* Convert from TCHAR_T[] to DCHAR_T[]. */ tmpdst = DCHAR_CONV_FROM_ENCODING (locale_charset (), iconveh_question_mark, tmpsrc, characters, NULL, NULL, &tmpdst_len); if (tmpdst == NULL) { int saved_errno = errno; free (tmpsrc); if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } free (tmpsrc); # endif if (has_width) { # if ENABLE_UNISTDIO /* Outside POSIX, it's preferable to compare the width against the number of _characters_ of the converted value. */ w = DCHAR_MBSNLEN (result + length, characters); # else /* The width is compared against the number of _bytes_ of the converted value, says POSIX. */ w = characters; # endif } else /* w doesn't matter. */ w = 0; if (has_width && width > w && !(dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } # if DCHAR_IS_TCHAR if (has_precision || has_width) { /* We know the number of bytes in advance. */ size_t remaining; # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif ENSURE_ALLOCATION (xsum (length, characters)); for (remaining = characters; remaining > 0; ) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t count = wcrtomb (cbuf, *arg, &state); # else count = wctomb (cbuf, *arg); # endif if (count <= 0) /* Inconsistency. */ abort (); memcpy (result + length, cbuf, count); length += count; arg++; remaining -= count; } if (!(arg == arg_end)) abort (); } else { # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); # endif while (arg < arg_end) { char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ int count; if (*arg == 0) abort (); # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t count = wcrtomb (cbuf, *arg, &state); # else count = wctomb (cbuf, *arg); # endif if (count <= 0) { /* Cannot convert. */ if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EILSEQ; return NULL; } ENSURE_ALLOCATION (xsum (length, count)); memcpy (result + length, cbuf, count); length += count; arg++; } } # else ENSURE_ALLOCATION (xsum (length, tmpdst_len)); DCHAR_CPY (result + length, tmpdst, tmpdst_len); free (tmpdst); length += tmpdst_len; # endif if (has_width && width > w && (dp->flags & FLAG_LEFT)) { size_t n = width - w; ENSURE_ALLOCATION (xsum (length, n)); DCHAR_SET (result + length, ' ', n); length += n; } } # endif } #endif #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL else if ((dp->conversion == 'a' || dp->conversion == 'A') # if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE)) && (0 # if NEED_PRINTF_DOUBLE || a.arg[dp->arg_index].type == TYPE_DOUBLE # endif # if NEED_PRINTF_LONG_DOUBLE || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE # endif ) # endif ) { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; size_t tmp_length; DCHAR_T tmpbuf[700]; DCHAR_T *tmp; DCHAR_T *pad_ptr; DCHAR_T *p; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = (unsigned int) (-arg); } else width = arg; } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } /* Allocate a temporary buffer of sufficient size. */ if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) ((LDBL_DIG + 1) * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ else tmp_length = (unsigned int) ((DBL_DIG + 1) * 0.831 /* decimal -> hexadecimal */ ) + 1; /* turn floor into ceil */ if (tmp_length < precision) tmp_length = precision; /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (DCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } pad_ptr = NULL; p = tmp; if (type == TYPE_LONGDOUBLE) { # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE long double arg = a.arg[dp->arg_index].a.a_longdouble; if (isnanl (arg)) { if (dp->conversion == 'A') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; DECL_LONG_DOUBLE_ROUNDING BEGIN_LONG_DOUBLE_ROUNDING (); if (signbit (arg)) /* arg < 0.0L or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0L && arg + arg == arg) { if (dp->conversion == 'A') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { int exponent; long double mantissa; if (arg > 0.0L) mantissa = printf_frexpl (arg, &exponent); else { exponent = 0; mantissa = 0.0L; } if (has_precision && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) { /* Round the mantissa. */ long double tail = mantissa; size_t q; for (q = precision; ; q--) { int digit = (int) tail; tail -= digit; if (q == 0) { if (digit & 1 ? tail >= 0.5L : tail > 0.5L) tail = 1 - tail; else tail = - tail; break; } tail *= 16.0L; } if (tail != 0.0L) for (q = precision; q > 0; q--) tail *= 0.0625L; mantissa += tail; } *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; { int digit; digit = (int) mantissa; mantissa -= digit; *p++ = '0' + digit; if ((flags & FLAG_ALT) || mantissa > 0.0L || precision > 0) { *p++ = decimal_point_char (); /* This loop terminates because we assume that FLT_RADIX is a power of 2. */ while (mantissa > 0.0L) { mantissa *= 16.0L; digit = (int) mantissa; mantissa -= digit; *p++ = digit + (digit < 10 ? '0' : dp->conversion - 10); if (precision > 0) precision--; } while (precision > 0) { *p++ = '0'; precision--; } } } *p++ = dp->conversion - 'A' + 'P'; # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } END_LONG_DOUBLE_ROUNDING (); } # else abort (); # endif } else { # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE double arg = a.arg[dp->arg_index].a.a_double; if (isnand (arg)) { if (dp->conversion == 'A') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; if (signbit (arg)) /* arg < 0.0 or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0 && arg + arg == arg) { if (dp->conversion == 'A') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { int exponent; double mantissa; if (arg > 0.0) mantissa = printf_frexp (arg, &exponent); else { exponent = 0; mantissa = 0.0; } if (has_precision && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) { /* Round the mantissa. */ double tail = mantissa; size_t q; for (q = precision; ; q--) { int digit = (int) tail; tail -= digit; if (q == 0) { if (digit & 1 ? tail >= 0.5 : tail > 0.5) tail = 1 - tail; else tail = - tail; break; } tail *= 16.0; } if (tail != 0.0) for (q = precision; q > 0; q--) tail *= 0.0625; mantissa += tail; } *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; { int digit; digit = (int) mantissa; mantissa -= digit; *p++ = '0' + digit; if ((flags & FLAG_ALT) || mantissa > 0.0 || precision > 0) { *p++ = decimal_point_char (); /* This loop terminates because we assume that FLT_RADIX is a power of 2. */ while (mantissa > 0.0) { mantissa *= 16.0; digit = (int) mantissa; mantissa -= digit; *p++ = digit + (digit < 10 ? '0' : dp->conversion - 10); if (precision > 0) precision--; } while (precision > 0) { *p++ = '0'; precision--; } } } *p++ = dp->conversion - 'A' + 'P'; # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } } # else abort (); # endif } /* The generated string now extends from tmp to p, with the zero padding insertion point being at pad_ptr. */ if (has_width && p - tmp < width) { size_t pad = width - (p - tmp); DCHAR_T *end = p + pad; if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > tmp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } p = end; } { size_t count = p - tmp; if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); /* Make room for the result. */ if (count >= allocated - length) { size_t n = xsum (length, count); ENSURE_ALLOCATION (n); } /* Append the result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); if (tmp != tmpbuf) free (tmp); length += count; } } #endif #if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL else if ((dp->conversion == 'f' || dp->conversion == 'F' || dp->conversion == 'e' || dp->conversion == 'E' || dp->conversion == 'g' || dp->conversion == 'G' || dp->conversion == 'a' || dp->conversion == 'A') && (0 # if NEED_PRINTF_DOUBLE || a.arg[dp->arg_index].type == TYPE_DOUBLE # elif NEED_PRINTF_INFINITE_DOUBLE || (a.arg[dp->arg_index].type == TYPE_DOUBLE /* The systems (mingw) which produce wrong output for Inf, -Inf, and NaN also do so for -0.0. Therefore we treat this case here as well. */ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double)) # endif # if NEED_PRINTF_LONG_DOUBLE || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE # elif NEED_PRINTF_INFINITE_LONG_DOUBLE || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE /* Some systems produce wrong output for Inf, -Inf, and NaN. Some systems in this category (IRIX 5.3) also do so for -0.0. Therefore we treat this case here as well. */ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble)) # endif )) { # if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) arg_type type = a.arg[dp->arg_index].type; # endif int flags = dp->flags; int has_width; size_t width; int has_precision; size_t precision; size_t tmp_length; DCHAR_T tmpbuf[700]; DCHAR_T *tmp; DCHAR_T *pad_ptr; DCHAR_T *p; has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = (unsigned int) (-arg); } else width = arg; } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } has_precision = 0; precision = 0; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } /* POSIX specifies the default precision to be 6 for %f, %F, %e, %E, but not for %g, %G. Implementations appear to use the same default precision also for %g, %G. But for %a, %A, the default precision is 0. */ if (!has_precision) if (!(dp->conversion == 'a' || dp->conversion == 'A')) precision = 6; /* Allocate a temporary buffer of sufficient size. */ # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1); # elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0); # elif NEED_PRINTF_LONG_DOUBLE tmp_length = LDBL_DIG + 1; # elif NEED_PRINTF_DOUBLE tmp_length = DBL_DIG + 1; # else tmp_length = 0; # endif if (tmp_length < precision) tmp_length = precision; # if NEED_PRINTF_LONG_DOUBLE # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE if (type == TYPE_LONGDOUBLE) # endif if (dp->conversion == 'f' || dp->conversion == 'F') { long double arg = a.arg[dp->arg_index].a.a_longdouble; if (!(isnanl (arg) || arg + arg == arg)) { /* arg is finite and nonzero. */ int exponent = floorlog10l (arg < 0 ? -arg : arg); if (exponent >= 0 && tmp_length < exponent + precision) tmp_length = exponent + precision; } } # endif # if NEED_PRINTF_DOUBLE # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE if (type == TYPE_DOUBLE) # endif if (dp->conversion == 'f' || dp->conversion == 'F') { double arg = a.arg[dp->arg_index].a.a_double; if (!(isnand (arg) || arg + arg == arg)) { /* arg is finite and nonzero. */ int exponent = floorlog10 (arg < 0 ? -arg : arg); if (exponent >= 0 && tmp_length < exponent + precision) tmp_length = exponent + precision; } } # endif /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12); if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (DCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } pad_ptr = NULL; p = tmp; # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE if (type == TYPE_LONGDOUBLE) # endif { long double arg = a.arg[dp->arg_index].a.a_longdouble; if (isnanl (arg)) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; DECL_LONG_DOUBLE_ROUNDING BEGIN_LONG_DOUBLE_ROUNDING (); if (signbit (arg)) /* arg < 0.0L or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0L && arg + arg == arg) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { # if NEED_PRINTF_LONG_DOUBLE pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { char *digits; size_t ndigits; digits = scale10_round_decimal_long_double (arg, precision); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits > precision) do { --ndigits; *p++ = digits[ndigits]; } while (ndigits > precision); else *p++ = '0'; /* Here ndigits <= precision. */ if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > ndigits; precision--) *p++ = '0'; while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } else if (dp->conversion == 'e' || dp->conversion == 'E') { int exponent; if (arg == 0.0L) { exponent = 0; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else { /* arg > 0.0L. */ int adjusted; char *digits; size_t ndigits; exponent = floorlog10l (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_long_double (arg, (int)precision - exponent); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits == precision + 1) break; if (ndigits < precision || ndigits > precision + 2) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits == precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision+1. */ if (is_borderline (digits, precision)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_long_double (arg, (int)precision - exponent + 1); if (digits2 == NULL) { free (digits); END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } if (strlen (digits2) == precision + 1) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision+1. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } *p++ = dp->conversion; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', '.', '2', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+.2d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+.2d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } else if (dp->conversion == 'g' || dp->conversion == 'G') { if (precision == 0) precision = 1; /* precision >= 1. */ if (arg == 0.0L) /* The exponent is 0, >= -4, < precision. Use fixed-point notation. */ { size_t ndigits = precision; /* Number of trailing zeroes that have to be dropped. */ size_t nzeroes = (flags & FLAG_ALT ? 0 : precision - 1); --ndigits; *p++ = '0'; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = '0'; } } } else { /* arg > 0.0L. */ int exponent; int adjusted; char *digits; size_t ndigits; size_t nzeroes; exponent = floorlog10l (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_long_double (arg, (int)(precision - 1) - exponent); if (digits == NULL) { END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } ndigits = strlen (digits); if (ndigits == precision) break; if (ndigits < precision - 1 || ndigits > precision + 1) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits < precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision. */ if (is_borderline (digits, precision - 1)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_long_double (arg, (int)(precision - 1) - exponent + 1); if (digits2 == NULL) { free (digits); END_LONG_DOUBLE_ROUNDING (); goto out_of_memory; } if (strlen (digits2) == precision) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision. */ /* Determine the number of trailing zeroes that have to be dropped. */ nzeroes = 0; if ((flags & FLAG_ALT) == 0) while (nzeroes < ndigits && digits[nzeroes] == '0') nzeroes++; /* The exponent is now determined. */ if (exponent >= -4 && exponent < (long)precision) { /* Fixed-point notation: max(exponent,0)+1 digits, then the decimal point, then the remaining digits without trailing zeroes. */ if (exponent >= 0) { size_t count = exponent + 1; /* Note: count <= precision = ndigits. */ for (; count > 0; count--) *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { size_t count = -exponent - 1; *p++ = '0'; *p++ = decimal_point_char (); for (; count > 0; count--) *p++ = '0'; while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { /* Exponential notation. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = { '%', '+', '.', '2', 'd', '\0' }; SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, "%+.2d", exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, "%+.2d", exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } # endif } free (digits); } } else abort (); # else /* arg is finite. */ if (!(arg == 0.0L)) abort (); pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else if (dp->conversion == 'e' || dp->conversion == 'E') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion; /* 'e' or 'E' */ *p++ = '+'; *p++ = '0'; *p++ = '0'; } else if (dp->conversion == 'g' || dp->conversion == 'G') { *p++ = '0'; if (flags & FLAG_ALT) { size_t ndigits = (precision > 0 ? precision - 1 : 0); *p++ = decimal_point_char (); for (; ndigits > 0; --ndigits) *p++ = '0'; } } else if (dp->conversion == 'a' || dp->conversion == 'A') { *p++ = '0'; *p++ = dp->conversion - 'A' + 'X'; pad_ptr = p; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion - 'A' + 'P'; *p++ = '+'; *p++ = '0'; } else abort (); # endif } END_LONG_DOUBLE_ROUNDING (); } } # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE else # endif # endif # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE { double arg = a.arg[dp->arg_index].a.a_double; if (isnand (arg)) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; } else { *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; } } else { int sign = 0; if (signbit (arg)) /* arg < 0.0 or negative zero */ { sign = -1; arg = -arg; } if (sign < 0) *p++ = '-'; else if (flags & FLAG_SHOWSIGN) *p++ = '+'; else if (flags & FLAG_SPACE) *p++ = ' '; if (arg > 0.0 && arg + arg == arg) { if (dp->conversion >= 'A' && dp->conversion <= 'Z') { *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; } else { *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; } } else { # if NEED_PRINTF_DOUBLE pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { char *digits; size_t ndigits; digits = scale10_round_decimal_double (arg, precision); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits > precision) do { --ndigits; *p++ = digits[ndigits]; } while (ndigits > precision); else *p++ = '0'; /* Here ndigits <= precision. */ if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > ndigits; precision--) *p++ = '0'; while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } else if (dp->conversion == 'e' || dp->conversion == 'E') { int exponent; if (arg == 0.0) { exponent = 0; *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else { /* arg > 0.0. */ int adjusted; char *digits; size_t ndigits; exponent = floorlog10 (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_double (arg, (int)precision - exponent); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits == precision + 1) break; if (ndigits < precision || ndigits > precision + 2) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits == precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision+1. */ if (is_borderline (digits, precision)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_double (arg, (int)precision - exponent + 1); if (digits2 == NULL) { free (digits); goto out_of_memory; } if (strlen (digits2) == precision + 1) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision+1. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); while (ndigits > 0) { --ndigits; *p++ = digits[ndigits]; } } free (digits); } *p++ = dp->conversion; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ { '%', '+', '.', '3', 'd', '\0' }; # else { '%', '+', '.', '2', 'd', '\0' }; # endif SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else { static const char decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ "%+.3d"; # else "%+.2d"; # endif if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, decimal_format, exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, decimal_format, exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } } # endif } else if (dp->conversion == 'g' || dp->conversion == 'G') { if (precision == 0) precision = 1; /* precision >= 1. */ if (arg == 0.0) /* The exponent is 0, >= -4, < precision. Use fixed-point notation. */ { size_t ndigits = precision; /* Number of trailing zeroes that have to be dropped. */ size_t nzeroes = (flags & FLAG_ALT ? 0 : precision - 1); --ndigits; *p++ = '0'; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = '0'; } } } else { /* arg > 0.0. */ int exponent; int adjusted; char *digits; size_t ndigits; size_t nzeroes; exponent = floorlog10 (arg); adjusted = 0; for (;;) { digits = scale10_round_decimal_double (arg, (int)(precision - 1) - exponent); if (digits == NULL) goto out_of_memory; ndigits = strlen (digits); if (ndigits == precision) break; if (ndigits < precision - 1 || ndigits > precision + 1) /* The exponent was not guessed precisely enough. */ abort (); if (adjusted) /* None of two values of exponent is the right one. Prevent an endless loop. */ abort (); free (digits); if (ndigits < precision) exponent -= 1; else exponent += 1; adjusted = 1; } /* Here ndigits = precision. */ if (is_borderline (digits, precision - 1)) { /* Maybe the exponent guess was too high and a smaller exponent can be reached by turning a 10...0 into 9...9x. */ char *digits2 = scale10_round_decimal_double (arg, (int)(precision - 1) - exponent + 1); if (digits2 == NULL) { free (digits); goto out_of_memory; } if (strlen (digits2) == precision) { free (digits); digits = digits2; exponent -= 1; } else free (digits2); } /* Here ndigits = precision. */ /* Determine the number of trailing zeroes that have to be dropped. */ nzeroes = 0; if ((flags & FLAG_ALT) == 0) while (nzeroes < ndigits && digits[nzeroes] == '0') nzeroes++; /* The exponent is now determined. */ if (exponent >= -4 && exponent < (long)precision) { /* Fixed-point notation: max(exponent,0)+1 digits, then the decimal point, then the remaining digits without trailing zeroes. */ if (exponent >= 0) { size_t count = exponent + 1; /* Note: count <= precision = ndigits. */ for (; count > 0; count--) *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { size_t count = -exponent - 1; *p++ = '0'; *p++ = decimal_point_char (); for (; count > 0; count--) *p++ = '0'; while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } } else { /* Exponential notation. */ *p++ = digits[--ndigits]; if ((flags & FLAG_ALT) || ndigits > nzeroes) { *p++ = decimal_point_char (); while (ndigits > nzeroes) { --ndigits; *p++ = digits[ndigits]; } } *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ # if WIDE_CHAR_VERSION { static const wchar_t decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ { '%', '+', '.', '3', 'd', '\0' }; # else { '%', '+', '.', '2', 'd', '\0' }; # endif SNPRINTF (p, 6 + 1, decimal_format, exponent); } while (*p != '\0') p++; # else { static const char decimal_format[] = /* Produce the same number of exponent digits as the native printf implementation. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ "%+.3d"; # else "%+.2d"; # endif if (sizeof (DCHAR_T) == 1) { sprintf ((char *) p, decimal_format, exponent); while (*p != '\0') p++; } else { char expbuf[6 + 1]; const char *ep; sprintf (expbuf, decimal_format, exponent); for (ep = expbuf; (*p = *ep) != '\0'; ep++) p++; } } # endif } free (digits); } } else abort (); # else /* arg is finite. */ if (!(arg == 0.0)) abort (); pad_ptr = p; if (dp->conversion == 'f' || dp->conversion == 'F') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } } else if (dp->conversion == 'e' || dp->conversion == 'E') { *p++ = '0'; if ((flags & FLAG_ALT) || precision > 0) { *p++ = decimal_point_char (); for (; precision > 0; precision--) *p++ = '0'; } *p++ = dp->conversion; /* 'e' or 'E' */ *p++ = '+'; /* Produce the same number of exponent digits as the native printf implementation. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ *p++ = '0'; # endif *p++ = '0'; *p++ = '0'; } else if (dp->conversion == 'g' || dp->conversion == 'G') { *p++ = '0'; if (flags & FLAG_ALT) { size_t ndigits = (precision > 0 ? precision - 1 : 0); *p++ = decimal_point_char (); for (; ndigits > 0; --ndigits) *p++ = '0'; } } else abort (); # endif } } } # endif /* The generated string now extends from tmp to p, with the zero padding insertion point being at pad_ptr. */ if (has_width && p - tmp < width) { size_t pad = width - (p - tmp); DCHAR_T *end = p + pad; if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > tmp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } p = end; } { size_t count = p - tmp; if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); /* Make room for the result. */ if (count >= allocated - length) { size_t n = xsum (length, count); ENSURE_ALLOCATION (n); } /* Append the result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); if (tmp != tmpbuf) free (tmp); length += count; } } #endif else { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int has_width; size_t width; #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || NEED_PRINTF_UNBOUNDED_PRECISION int has_precision; size_t precision; #endif #if NEED_PRINTF_UNBOUNDED_PRECISION int prec_ourselves; #else # define prec_ourselves 0 #endif #if NEED_PRINTF_FLAG_LEFTADJUST # define pad_ourselves 1 #elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int pad_ourselves; #else # define pad_ourselves 0 #endif TCHAR_T *fbp; unsigned int prefix_count; int prefixes[2] IF_LINT (= { 0 }); int orig_errno; #if !USE_SNPRINTF size_t tmp_length; TCHAR_T tmpbuf[700]; TCHAR_T *tmp; #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION has_width = 0; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; if (arg < 0) { /* "A negative field width is taken as a '-' flag followed by a positive field width." */ flags |= FLAG_LEFT; width = (unsigned int) (-arg); } else width = arg; } else { const FCHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } has_width = 1; } #endif #if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || NEED_PRINTF_UNBOUNDED_PRECISION has_precision = 0; precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; /* "A negative precision is taken as if the precision were omitted." */ if (arg >= 0) { precision = arg; has_precision = 1; } } else { const FCHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); has_precision = 1; } } #endif /* Decide whether to handle the precision ourselves. */ #if NEED_PRINTF_UNBOUNDED_PRECISION switch (dp->conversion) { case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': prec_ourselves = has_precision && (precision > 0); break; default: prec_ourselves = 0; break; } #endif /* Decide whether to perform the padding ourselves. */ #if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) switch (dp->conversion) { # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need to perform the padding after this conversion. Functions with unistdio extensions perform the padding based on character count rather than element count. */ case 'c': case 's': # endif # if NEED_PRINTF_FLAG_ZERO case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': # endif pad_ourselves = 1; break; default: pad_ourselves = prec_ourselves; break; } #endif #if !USE_SNPRINTF /* Allocate a temporary buffer of sufficient size for calling sprintf. */ tmp_length = MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type, flags, width, has_precision, precision, pad_ourselves); if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (TCHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } #endif /* Construct the format string for calling snprintf or sprintf. */ fbp = buf; *fbp++ = '%'; #if NEED_PRINTF_FLAG_GROUPING /* The underlying implementation doesn't support the ' flag. Produce no grouping characters in this case; this is acceptable because the grouping is locale dependent. */ #else if (flags & FLAG_GROUP) *fbp++ = '\''; #endif if (flags & FLAG_LEFT) *fbp++ = '-'; if (flags & FLAG_SHOWSIGN) *fbp++ = '+'; if (flags & FLAG_SPACE) *fbp++ = ' '; if (flags & FLAG_ALT) *fbp++ = '#'; #if __GLIBC__ >= 2 && !defined __UCLIBC__ if (flags & FLAG_LOCALIZED) *fbp++ = 'I'; #endif if (!pad_ourselves) { if (flags & FLAG_ZERO) *fbp++ = '0'; if (dp->width_start != dp->width_end) { size_t n = dp->width_end - dp->width_start; /* The width specification is known to consist only of standard ASCII characters. */ if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) { memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T)); fbp += n; } else { const FCHAR_T *mp = dp->width_start; do *fbp++ = (unsigned char) *mp++; while (--n > 0); } } } if (!prec_ourselves) { if (dp->precision_start != dp->precision_end) { size_t n = dp->precision_end - dp->precision_start; /* The precision specification is known to consist only of standard ASCII characters. */ if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) { memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T)); fbp += n; } else { const FCHAR_T *mp = dp->precision_start; do *fbp++ = (unsigned char) *mp++; while (--n > 0); } } } switch (type) { #if HAVE_LONG_LONG_INT case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ *fbp++ = 'I'; *fbp++ = '6'; *fbp++ = '4'; break; # else *fbp++ = 'l'; /*FALLTHROUGH*/ # endif #endif case TYPE_LONGINT: case TYPE_ULONGINT: #if HAVE_WINT_T case TYPE_WIDE_CHAR: #endif #if HAVE_WCHAR_T case TYPE_WIDE_STRING: #endif *fbp++ = 'l'; break; case TYPE_LONGDOUBLE: *fbp++ = 'L'; break; default: break; } #if NEED_PRINTF_DIRECTIVE_F if (dp->conversion == 'F') *fbp = 'f'; else #endif *fbp = dp->conversion; #if USE_SNPRINTF # if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) fbp[1] = '%'; fbp[2] = 'n'; fbp[3] = '\0'; # else /* On glibc2 systems from glibc >= 2.3 - probably also older ones - we know that snprintf's return value conforms to ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and gl_SNPRINTF_TRUNCATION_C99 pass. Therefore we can avoid using %n in this situation. On glibc2 systems from 2004-10-18 or newer, the use of %n in format strings in writable memory may crash the program (if compiled with _FORTIFY_SOURCE=2), so we should avoid it in this situation. */ /* On native Windows systems (such as mingw), we can avoid using %n because: - Although the gl_SNPRINTF_TRUNCATION_C99 test fails, snprintf does not write more than the specified number of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes '4', '5', '6' into buf, not '4', '5', '\0'.) - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf allows us to recognize the case of an insufficient buffer size: it returns -1 in this case. On native Windows systems (such as mingw) where the OS is Windows Vista, the use of %n in format strings by default crashes the program. See and So we should avoid %n in this situation. */ fbp[1] = '\0'; # endif #else fbp[1] = '\0'; #endif /* Construct the arguments for calling snprintf or sprintf. */ prefix_count = 0; if (!pad_ourselves && dp->width_arg_index != ARG_NONE) { if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; } if (!prec_ourselves && dp->precision_arg_index != ARG_NONE) { if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; } #if USE_SNPRINTF /* The SNPRINTF result is appended after result[0..length]. The latter is an array of DCHAR_T; SNPRINTF appends an array of TCHAR_T to it. This is possible because sizeof (TCHAR_T) divides sizeof (DCHAR_T) and alignof (TCHAR_T) <= alignof (DCHAR_T). */ # define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T)) /* Ensure that maxlen below will be >= 2. Needed on BeOS, where an snprintf() with maxlen==1 acts like sprintf(). */ ENSURE_ALLOCATION (xsum (length, (2 + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR)); /* Prepare checking whether snprintf returns the count via %n. */ *(TCHAR_T *) (result + length) = '\0'; #endif orig_errno = errno; for (;;) { int count = -1; #if USE_SNPRINTF int retcount = 0; size_t maxlen = allocated - length; /* SNPRINTF can fail if its second argument is > INT_MAX. */ if (maxlen > INT_MAX / TCHARS_PER_DCHAR) maxlen = INT_MAX / TCHARS_PER_DCHAR; maxlen = maxlen * TCHARS_PER_DCHAR; # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ arg, &count); \ break; \ case 1: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ prefixes[0], arg, &count); \ break; \ case 2: \ retcount = SNPRINTF ((TCHAR_T *) (result + length), \ maxlen, buf, \ prefixes[0], prefixes[1], arg, \ &count); \ break; \ default: \ abort (); \ } #else # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ count = sprintf (tmp, buf, arg); \ break; \ case 1: \ count = sprintf (tmp, buf, prefixes[0], arg); \ break; \ case 2: \ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ arg); \ break; \ default: \ abort (); \ } #endif errno = 0; switch (type) { case TYPE_SCHAR: { int arg = a.arg[dp->arg_index].a.a_schar; SNPRINTF_BUF (arg); } break; case TYPE_UCHAR: { unsigned int arg = a.arg[dp->arg_index].a.a_uchar; SNPRINTF_BUF (arg); } break; case TYPE_SHORT: { int arg = a.arg[dp->arg_index].a.a_short; SNPRINTF_BUF (arg); } break; case TYPE_USHORT: { unsigned int arg = a.arg[dp->arg_index].a.a_ushort; SNPRINTF_BUF (arg); } break; case TYPE_INT: { int arg = a.arg[dp->arg_index].a.a_int; SNPRINTF_BUF (arg); } break; case TYPE_UINT: { unsigned int arg = a.arg[dp->arg_index].a.a_uint; SNPRINTF_BUF (arg); } break; case TYPE_LONGINT: { long int arg = a.arg[dp->arg_index].a.a_longint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGINT: { unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; SNPRINTF_BUF (arg); } break; #if HAVE_LONG_LONG_INT case TYPE_LONGLONGINT: { long long int arg = a.arg[dp->arg_index].a.a_longlongint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; SNPRINTF_BUF (arg); } break; #endif case TYPE_DOUBLE: { double arg = a.arg[dp->arg_index].a.a_double; SNPRINTF_BUF (arg); } break; case TYPE_LONGDOUBLE: { long double arg = a.arg[dp->arg_index].a.a_longdouble; SNPRINTF_BUF (arg); } break; case TYPE_CHAR: { int arg = a.arg[dp->arg_index].a.a_char; SNPRINTF_BUF (arg); } break; #if HAVE_WINT_T case TYPE_WIDE_CHAR: { wint_t arg = a.arg[dp->arg_index].a.a_wide_char; SNPRINTF_BUF (arg); } break; #endif case TYPE_STRING: { const char *arg = a.arg[dp->arg_index].a.a_string; SNPRINTF_BUF (arg); } break; #if HAVE_WCHAR_T case TYPE_WIDE_STRING: { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; SNPRINTF_BUF (arg); } break; #endif case TYPE_POINTER: { void *arg = a.arg[dp->arg_index].a.a_pointer; SNPRINTF_BUF (arg); } break; default: abort (); } #if USE_SNPRINTF /* Portability: Not all implementations of snprintf() are ISO C 99 compliant. Determine the number of bytes that snprintf() has produced or would have produced. */ if (count >= 0) { /* Verify that snprintf() has NUL-terminated its result. */ if (count < maxlen && ((TCHAR_T *) (result + length)) [count] != '\0') abort (); /* Portability hack. */ if (retcount > count) count = retcount; } else { /* snprintf() doesn't understand the '%n' directive. */ if (fbp[1] != '\0') { /* Don't use the '%n' directive; instead, look at the snprintf() return value. */ fbp[1] = '\0'; continue; } else { /* Look at the snprintf() return value. */ if (retcount < 0) { # if !HAVE_SNPRINTF_RETVAL_C99 /* HP-UX 10.20 snprintf() is doubly deficient: It doesn't understand the '%n' directive, *and* it returns -1 (rather than the length that would have been required) when the buffer is too small. But a failure at this point can also come from other reasons than a too small buffer, such as an invalid wide string argument to the %ls directive, or possibly an invalid floating-point argument. */ size_t tmp_length = MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type, flags, width, has_precision, precision, pad_ourselves); if (maxlen < tmp_length) { /* Make more room. But try to do through this reallocation only once. */ size_t bigger_need = xsum (length, xsum (tmp_length, TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR); /* And always grow proportionally. (There may be several arguments, each needing a little more room than the previous one.) */ size_t bigger_need2 = xsum (xtimes (allocated, 2), 12); if (bigger_need < bigger_need2) bigger_need = bigger_need2; ENSURE_ALLOCATION (bigger_need); continue; } # endif } else count = retcount; } } #endif /* Attempt to handle failure. */ if (count < 0) { /* SNPRINTF or sprintf failed. Save and use the errno that it has set, if any. */ int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = (saved_errno != 0 ? saved_errno : (dp->conversion == 'c' || dp->conversion == 's' ? EILSEQ : EINVAL)); return NULL; } #if USE_SNPRINTF /* Handle overflow of the allocated buffer. If such an overflow occurs, a C99 compliant snprintf() returns a count >= maxlen. However, a non-compliant snprintf() function returns only count = maxlen - 1. To cover both cases, test whether count >= maxlen - 1. */ if ((unsigned int) count + 1 >= maxlen) { /* If maxlen already has attained its allowed maximum, allocating more memory will not increase maxlen. Instead of looping, bail out. */ if (maxlen == INT_MAX / TCHARS_PER_DCHAR) goto overflow; else { /* Need at least (count + 1) * sizeof (TCHAR_T) bytes. (The +1 is for the trailing NUL.) But ask for (count + 2) * sizeof (TCHAR_T) bytes, so that in the next round, we likely get maxlen > (unsigned int) count + 1 and so we don't get here again. And allocate proportionally, to avoid looping eternally if snprintf() reports a too small count. */ size_t n = xmax (xsum (length, ((unsigned int) count + 2 + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); continue; } } #endif #if NEED_PRINTF_UNBOUNDED_PRECISION if (prec_ourselves) { /* Handle the precision. */ TCHAR_T *prec_ptr = # if USE_SNPRINTF (TCHAR_T *) (result + length); # else tmp; # endif size_t prefix_count; size_t move; prefix_count = 0; /* Put the additional zeroes after the sign. */ if (count >= 1 && (*prec_ptr == '-' || *prec_ptr == '+' || *prec_ptr == ' ')) prefix_count = 1; /* Put the additional zeroes after the 0x prefix if (flags & FLAG_ALT) || (dp->conversion == 'p'). */ else if (count >= 2 && prec_ptr[0] == '0' && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X')) prefix_count = 2; move = count - prefix_count; if (precision > move) { /* Insert zeroes. */ size_t insert = precision - move; TCHAR_T *prec_end; # if USE_SNPRINTF size_t n = xsum (length, (count + insert + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR); length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; ENSURE_ALLOCATION (n); length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; prec_ptr = (TCHAR_T *) (result + length); # endif prec_end = prec_ptr + count; prec_ptr += prefix_count; while (prec_end > prec_ptr) { prec_end--; prec_end[insert] = prec_end[0]; } prec_end += insert; do *--prec_end = '0'; while (prec_end > prec_ptr); count += insert; } } #endif #if !USE_SNPRINTF if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); #endif #if !DCHAR_IS_TCHAR /* Convert from TCHAR_T[] to DCHAR_T[]. */ if (dp->conversion == 'c' || dp->conversion == 's') { /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING TYPE_WIDE_STRING. The result string is not certainly ASCII. */ const TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t tmpdst_len; /* This code assumes that TCHAR_T is 'char'. */ verify (sizeof (TCHAR_T) == 1); # if USE_SNPRINTF tmpsrc = (TCHAR_T *) (result + length); # else tmpsrc = tmp; # endif tmpdst = DCHAR_CONV_FROM_ENCODING (locale_charset (), iconveh_question_mark, tmpsrc, count, NULL, NULL, &tmpdst_len); if (tmpdst == NULL) { int saved_errno = errno; if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = saved_errno; return NULL; } ENSURE_ALLOCATION (xsum (length, tmpdst_len)); DCHAR_CPY (result + length, tmpdst, tmpdst_len); free (tmpdst); count = tmpdst_len; } else { /* The result string is ASCII. Simple 1:1 conversion. */ # if USE_SNPRINTF /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a no-op conversion, in-place on the array starting at (result + length). */ if (sizeof (DCHAR_T) != sizeof (TCHAR_T)) # endif { const TCHAR_T *tmpsrc; DCHAR_T *tmpdst; size_t n; # if USE_SNPRINTF if (result == resultbuf) { tmpsrc = (TCHAR_T *) (result + length); /* ENSURE_ALLOCATION will not move tmpsrc (because it's part of resultbuf). */ ENSURE_ALLOCATION (xsum (length, count)); } else { /* ENSURE_ALLOCATION will move the array (because it uses realloc(). */ ENSURE_ALLOCATION (xsum (length, count)); tmpsrc = (TCHAR_T *) (result + length); } # else tmpsrc = tmp; ENSURE_ALLOCATION (xsum (length, count)); # endif tmpdst = result + length; /* Copy backwards, because of overlapping. */ tmpsrc += count; tmpdst += count; for (n = count; n > 0; n--) *--tmpdst = (unsigned char) *--tmpsrc; } } #endif #if DCHAR_IS_TCHAR && !USE_SNPRINTF /* Make room for the result. */ if (count > allocated - length) { /* Need at least count elements. But allocate proportionally. */ size_t n = xmax (xsum (length, count), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); } #endif /* Here count <= allocated - length. */ /* Perform padding. */ #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION if (pad_ourselves && has_width) { size_t w; # if ENABLE_UNISTDIO /* Outside POSIX, it's preferable to compare the width against the number of _characters_ of the converted value. */ w = DCHAR_MBSNLEN (result + length, count); # else /* The width is compared against the number of _bytes_ of the converted value, says POSIX. */ w = count; # endif if (w < width) { size_t pad = width - w; /* Make room for the result. */ if (xsum (count, pad) > allocated - length) { /* Need at least count + pad elements. But allocate proportionally. */ size_t n = xmax (xsum3 (length, count, pad), xtimes (allocated, 2)); # if USE_SNPRINTF length += count; ENSURE_ALLOCATION (n); length -= count; # else ENSURE_ALLOCATION (n); # endif } /* Here count + pad <= allocated - length. */ { # if !DCHAR_IS_TCHAR || USE_SNPRINTF DCHAR_T * const rp = result + length; # else DCHAR_T * const rp = tmp; # endif DCHAR_T *p = rp + count; DCHAR_T *end = p + pad; DCHAR_T *pad_ptr; # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO if (dp->conversion == 'c' || dp->conversion == 's') /* No zero-padding for string directives. */ pad_ptr = NULL; else # endif { pad_ptr = (*rp == '-' ? rp + 1 : rp); /* No zero-padding of "inf" and "nan". */ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) pad_ptr = NULL; } /* The generated string now extends from rp to p, with the zero padding insertion point being at pad_ptr. */ count = count + pad; /* = end - rp */ if (flags & FLAG_LEFT) { /* Pad with spaces on the right. */ for (; pad > 0; pad--) *p++ = ' '; } else if ((flags & FLAG_ZERO) && pad_ptr != NULL) { /* Pad with zeroes. */ DCHAR_T *q = end; while (p > pad_ptr) *--q = *--p; for (; pad > 0; pad--) *p++ = '0'; } else { /* Pad with spaces on the left. */ DCHAR_T *q = end; while (p > rp) *--q = *--p; for (; pad > 0; pad--) *p++ = ' '; } } } } #endif /* Here still count <= allocated - length. */ #if !DCHAR_IS_TCHAR || USE_SNPRINTF /* The snprintf() result did fit. */ #else /* Append the sprintf() result. */ memcpy (result + length, tmp, count * sizeof (DCHAR_T)); #endif #if !USE_SNPRINTF if (tmp != tmpbuf) free (tmp); #endif #if NEED_PRINTF_DIRECTIVE_F if (dp->conversion == 'F') { /* Convert the %f result to upper case for %F. */ DCHAR_T *rp = result + length; size_t rc; for (rc = count; rc > 0; rc--, rp++) if (*rp >= 'a' && *rp <= 'z') *rp = *rp - 'a' + 'A'; } #endif length += count; break; } errno = orig_errno; #undef pad_ourselves #undef prec_ourselves } } } /* Add the final NUL. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; if (result != resultbuf && length + 1 < allocated) { /* Shrink the allocated memory if possible. */ DCHAR_T *memory; memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T)); if (memory != NULL) result = memory; } if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); *lengthp = length; /* Note that we can produce a big string of a length > INT_MAX. POSIX says that snprintf() fails with errno = EOVERFLOW in this case, but that's only because snprintf() returns an 'int'. This function does not have this limitation. */ return result; #if USE_SNPRINTF overflow: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EOVERFLOW; return NULL; #endif out_of_memory: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); out_of_memory_1: CLEANUP (); errno = ENOMEM; return NULL; } } #undef MAX_ROOM_NEEDED #undef TCHARS_PER_DCHAR #undef SNPRINTF #undef USE_SNPRINTF #undef DCHAR_SET #undef DCHAR_CPY #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef DCHAR_IS_TCHAR #undef TCHAR_T #undef DCHAR_T #undef FCHAR_T #undef VASNPRINTF shishi-1.0.2/gl/asnprintf.c0000644000000000000000000000204612126660051012443 00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002, 2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include "vasnprintf.h" #include char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) { va_list args; char *result; va_start (args, format); result = vasnprintf (resultbuf, lengthp, format, args); va_end (args); return result; } shishi-1.0.2/gl/sys_socket.c0000644000000000000000000000013412126660051012621 00000000000000#include #define _GL_SYS_SOCKET_INLINE _GL_EXTERN_INLINE #include "sys/socket.h" shishi-1.0.2/gl/gc.h0000644000000000000000000002742412126660051011044 00000000000000/* gc.h --- Header file for implementation agnostic crypto wrapper API. * Copyright (C) 2002-2005, 2007-2008, 2011-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ #ifndef GC_H # define GC_H /* Get size_t. */ # include enum Gc_rc { GC_OK = 0, GC_MALLOC_ERROR, GC_INIT_ERROR, GC_RANDOM_ERROR, GC_INVALID_CIPHER, GC_INVALID_HASH, GC_PKCS5_INVALID_ITERATION_COUNT, GC_PKCS5_INVALID_DERIVED_KEY_LENGTH, GC_PKCS5_DERIVED_KEY_TOO_LONG }; typedef enum Gc_rc Gc_rc; /* Hash types. */ enum Gc_hash { GC_MD4, GC_MD5, GC_SHA1, GC_MD2, GC_RMD160, GC_SHA256, GC_SHA384, GC_SHA512, GC_SHA224 }; typedef enum Gc_hash Gc_hash; enum Gc_hash_mode { GC_HMAC = 1 }; typedef enum Gc_hash_mode Gc_hash_mode; typedef void *gc_hash_handle; #define GC_MD2_DIGEST_SIZE 16 #define GC_MD4_DIGEST_SIZE 16 #define GC_MD5_DIGEST_SIZE 16 #define GC_RMD160_DIGEST_SIZE 20 #define GC_SHA1_DIGEST_SIZE 20 #define GC_SHA256_DIGEST_SIZE 32 #define GC_SHA384_DIGEST_SIZE 48 #define GC_SHA512_DIGEST_SIZE 64 #define GC_SHA224_DIGEST_SIZE 24 /* Cipher types. */ enum Gc_cipher { GC_AES128, GC_AES192, GC_AES256, GC_3DES, GC_DES, GC_ARCFOUR128, GC_ARCFOUR40, GC_ARCTWO40, GC_CAMELLIA128, GC_CAMELLIA256 }; typedef enum Gc_cipher Gc_cipher; enum Gc_cipher_mode { GC_ECB, GC_CBC, GC_STREAM }; typedef enum Gc_cipher_mode Gc_cipher_mode; typedef void *gc_cipher_handle; /* Call before respectively after any other functions. */ extern Gc_rc gc_init (void); extern void gc_done (void); /* Memory allocation (avoid). */ typedef void *(*gc_malloc_t) (size_t n); typedef int (*gc_secure_check_t) (const void *); typedef void *(*gc_realloc_t) (void *p, size_t n); typedef void (*gc_free_t) (void *); extern void gc_set_allocators (gc_malloc_t func_malloc, gc_malloc_t secure_malloc, gc_secure_check_t secure_check, gc_realloc_t func_realloc, gc_free_t func_free); /* Randomness. */ extern Gc_rc gc_nonce (char *data, size_t datalen); extern Gc_rc gc_pseudo_random (char *data, size_t datalen); extern Gc_rc gc_random (char *data, size_t datalen); /* Ciphers. */ extern Gc_rc gc_cipher_open (Gc_cipher cipher, Gc_cipher_mode mode, gc_cipher_handle *outhandle); extern Gc_rc gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key); extern Gc_rc gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv); extern Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data); extern Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data); extern Gc_rc gc_cipher_close (gc_cipher_handle handle); /* Hashes. */ extern Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle *outhandle); extern Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle *outhandle); extern size_t gc_hash_digest_length (Gc_hash hash); extern void gc_hash_hmac_setkey (gc_hash_handle handle, size_t len, const char *key); extern void gc_hash_write (gc_hash_handle handle, size_t len, const char *data); extern const char *gc_hash_read (gc_hash_handle handle); extern void gc_hash_close (gc_hash_handle handle); /* Compute a hash value over buffer IN of INLEN bytes size using the algorithm HASH, placing the result in the pre-allocated buffer OUT. The required size of OUT depends on HASH, and is generally GC__DIGEST_SIZE. For example, for GC_MD5 the output buffer must be 16 bytes. The return value is 0 (GC_OK) on success, or another Gc_rc error code. */ extern Gc_rc gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *out); /* One-call interface. */ extern Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf); extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf); extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf); extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf); extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf); extern Gc_rc gc_hmac_sha1 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf); /* Derive cryptographic keys from a password P of length PLEN, with salt S of length SLEN, placing the result in pre-allocated buffer DK of length DKLEN. An iteration count is specified in C, where a larger value means this function take more time (typical iteration counts are 1000-20000). This function "stretches" the key to be exactly dkLen bytes long. GC_OK is returned on success, otherwise a Gc_rc error code is returned. */ extern Gc_rc gc_pbkdf2_sha1 (const char *P, size_t Plen, const char *S, size_t Slen, unsigned int c, char *DK, size_t dkLen); /* TODO: From: Simon Josefsson Subject: Re: generic crypto Newsgroups: gmane.comp.lib.gnulib.bugs Cc: bug-gnulib@gnu.org Date: Fri, 07 Oct 2005 12:50:57 +0200 Mail-Copies-To: nobody Paul Eggert writes: > Simon Josefsson writes: > >> * Perhaps the /dev/?random reading should be separated into a separate >> module? It might be useful outside of the gc layer too. > > Absolutely. I've been meaning to do that for months (for a "shuffle" > program I want to add to coreutils), but hadn't gotten around to it. > It would have to be generalized a bit. I'd like to have the file > descriptor cached, for example. I'll write a separate module for that part. I think we should even add a good PRNG that is re-seeded from /dev/?random frequently. GnuTLS can need a lot of random data on a big server, more than /dev/random can supply. And /dev/urandom might not be strong enough. Further, the security of /dev/?random can also be questionable. >> I'm also not sure about the names of those functions, they suggest >> a more higher-level API than what is really offered (i.e., the >> names "nonce" and "pseudo_random" and "random" imply certain >> cryptographic properties). > > Could you expand a bit more on that? What is the relationship between > nonce/pseudorandom/random and the /dev/ values you are using? There is none, that is the problem. Applications generally need different kind of "random" numbers. Sometimes they just need some random data and doesn't care whether it is possible for an attacker to compute the string (aka a "nonce"). Sometimes they need data that is very difficult to compute (i.e., computing it require inverting SHA1 or similar). Sometimes they need data that is not possible to compute, i.e., it wants real entropy collected over time on the system. Collecting the last kind of random data is very expensive, so it must not be used too often. The second kind of random data ("pseudo random") is typically generated by seeding a good PRNG with a couple of hundred bytes of real entropy from the "real random" data pool. The "nonce" is usually computed using the PRNG as well, because PRNGs are usually fast. Pseudo-random data is typically used for session keys. Strong random data is often used to generate long-term keys (e.g., private RSA keys). Of course, there are many subtleties. There are several different kind of nonce:s. Sometimes a nonce is just an ever-increasing integer, starting from 0. Sometimes it is assumed to be unlikely to be the same as previous nonces, but without a requirement that the nonce is possible to guess. MD5(system clock) would thus suffice, if it isn't called too often. You can guess what the next value will be, but it will always be different. The problem is that /dev/?random doesn't offer any kind of semantic guarantees. But applications need an API that make that promise. I think we should do this in several steps: 1) Write a module that can read from /dev/?random. 2) Add a module for a known-good PRNG suitable for random number generation, that can be continuously re-seeded. 3) Add a high-level module that provide various different randomness functions. One for nonces, perhaps even different kind of nonces, one for pseudo random data, and one for strong random data. It is not clear whether we can hope to achieve the last one in a portable way. Further, it would be useful to allow users to provide their own entropy source as a file, used to seed the PRNG or initialize the strong randomness pool. This is used on embedded platforms that doesn't have enough interrupts to hope to generate good random data. > For example, why not use OpenBSD's /dev/arandom? I don't trust ARC4. For example, recent cryptographic efforts indicate that you must throw away the first 512 bytes generated from the PRNG for it to be secure. I don't know whether OpenBSD do this. Further, I recall some eprint paper on RC4 security that didn't inspire confidence. While I trust the random devices in OpenBSD more than Solaris/AIX/HPUX/etc, I think that since we need something better on Solaris/AIX/HPUX we'd might as well use it on OpenBSD or even Linux too. > Here is one thought. The user could specify a desired quality level > range, and the implementation then would supply random data that is at > least as good as the lower bound of the range. I.e., ihe > implementation refuses to produce any random data if it can't generate > data that is at least as good as the lower end of the range. The > upper bound of the range is advice from the user not to be any more > expensive than that, but the implementation can ignore the advice if > it doesn't have anything cheaper. I'm not sure this is a good idea. Users can't really be expected to understand this. Further, applications need many different kind of random data. Selecting the randomness level for each by the user will be too complicated. I think it is better if the application decide, from its cryptographic requirement, what entropy quality it require, and call the proper API. Meeting the implied semantic properties should be the job for gnulib. >> Perhaps gc_dev_random and gc_dev_urandom? > > To some extent. I'd rather insulate the user from the details of > where the random numbers come from. On the other hand we need to > provide a way for applications to specify a file that contains > random bits, so that people can override the defaults. Agreed. This may require some thinking before it is finalized. Is it ok to install the GC module as-is meanwhile? Then I can continue to add the stuff that GnuTLS need, and then come back to re-working the randomness module. That way, we have two different projects that use the code. GnuTLS includes the same randomness code that was in GNU SASL and that is in the current gc module. I feel much more comfortable working in small steps at a time, rather then working on this for a long time in gnulib and only later integrate the stuff in GnuTLS. Thanks, Simon */ #endif /* GC_H */ shishi-1.0.2/gl/xstrndup.h0000644000000000000000000000177412126660054012345 00000000000000/* Duplicate a bounded initial segment of a string, with out-of-memory checking. Copyright (C) 2003, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Return a newly allocated copy of at most N bytes of STRING. In other words, return a copy of the initial segment of length N of STRING. */ extern char *xstrndup (const char *string, size_t n); shishi-1.0.2/gl/stdalign.in.h0000644000000000000000000000652412126660053012665 00000000000000/* A substitute for ISO C11 . Copyright 2011-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Paul Eggert and Bruno Haible. */ #ifndef _GL_STDALIGN_H #define _GL_STDALIGN_H /* ISO C11 for platforms that lack it. References: ISO C11 (latest free draft ) sections 6.5.3.4, 6.7.5, 7.15. C++11 (latest free draft ) section 18.10. */ /* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment requirement of a structure member (i.e., slot or field) that is of type TYPE, as an integer constant expression. This differs from GCC's __alignof__ operator, which can yield a better-performing alignment for an object of that type. For example, on x86 with GCC, __alignof__ (double) and __alignof__ (long long) are 8, whereas alignof (double) and alignof (long long) are 4 unless the option '-malign-double' is used. The result cannot be used as a value for an 'enum' constant, if you want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */ #include #if defined __cplusplus template struct __alignof_helper { char __a; __t __b; }; # define _Alignof(type) offsetof (__alignof_helper, __b) #else # define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) #endif #define alignof _Alignof #define __alignof_is_defined 1 /* alignas (A), also known as _Alignas (A), aligns a variable or type to the alignment A, where A is an integer constant expression. For example: int alignas (8) foo; struct s { int a; int alignas (8) bar; }; aligns the address of FOO and the offset of BAR to be multiples of 8. A should be a power of two that is at least the type's alignment and at most the implementation's alignment limit. This limit is 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable to MSVC through at least version 10.0, A should be an integer constant, as MSVC does not support expressions such as 1 << 3. To be portable to Sun C 5.11, do not align auto variables to anything stricter than their default alignment. The following C11 requirements are not supported here: - If A is zero, alignas has no effect. - alignas can be used multiple times; the strictest one wins. - alignas (TYPE) is equivalent to alignas (alignof (TYPE)). */ #if __GNUC__ || __IBMC__ || __IBMCPP__ || 0x5110 <= __SUNPRO_C # define _Alignas(a) __attribute__ ((__aligned__ (a))) #elif 1300 <= _MSC_VER # define _Alignas(a) __declspec (align (a)) #endif #ifdef _Alignas # define alignas _Alignas # define __alignas_is_defined 1 #endif #endif /* _GL_STDALIGN_H */ shishi-1.0.2/gl/des.h0000644000000000000000000000721612126660051011223 00000000000000/* des.h --- DES cipher implementation. * Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */ #ifndef DES_H # define DES_H #include #include #include /* * Encryption/Decryption context of DES */ typedef struct { uint32_t encrypt_subkeys[32]; uint32_t decrypt_subkeys[32]; } gl_des_ctx; /* * Encryption/Decryption context of Triple-DES */ typedef struct { uint32_t encrypt_subkeys[96]; uint32_t decrypt_subkeys[96]; } gl_3des_ctx; /* Check whether the 8 byte key is weak. Does not check the parity * bits of the key but simple ignore them. */ extern bool gl_des_is_weak_key (const char * key); /* * DES * --- */ /* Fill a DES context CTX with subkeys calculated from 64bit KEY. * Does not check parity bits, but simply ignore them. Does not check * for weak keys. */ extern void gl_des_setkey (gl_des_ctx *ctx, const char * key); /* Fill a DES context CTX with subkeys calculated from 64bit KEY, with * weak key checking. Does not check parity bits, but simply ignore * them. */ extern bool gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen); /* Electronic Codebook Mode DES encryption/decryption of data * according to 'mode'. */ extern void gl_des_ecb_crypt (gl_des_ctx *ctx, const char * from, char * to, int mode); #define gl_des_ecb_encrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 0) #define gl_des_ecb_decrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 1) /* Triple-DES * ---------- */ /* Fill a Triple-DES context CTX with subkeys calculated from two * 64bit keys in KEY1 and KEY2. Does not check the parity bits of the * keys, but simply ignore them. Does not check for weak keys. */ extern void gl_3des_set2keys (gl_3des_ctx *ctx, const char * key1, const char * key2); /* * Fill a Triple-DES context CTX with subkeys calculated from three * 64bit keys in KEY1, KEY2 and KEY3. Does not check the parity bits * of the keys, but simply ignore them. Does not check for weak * keys. */ extern void gl_3des_set3keys (gl_3des_ctx *ctx, const char * key1, const char * key2, const char * key3); /* Fill a Triple-DES context CTX with subkeys calculated from three * concatenated 64bit keys in KEY, with weak key checking. Does not * check the parity bits of the keys, but simply ignore them. */ extern bool gl_3des_makekey (gl_3des_ctx *ctx, const char * key, size_t keylen); /* Electronic Codebook Mode Triple-DES encryption/decryption of data * according to 'mode'. Sometimes this mode is named 'EDE' mode * (Encryption-Decryption-Encryption). */ extern void gl_3des_ecb_crypt (gl_3des_ctx *ctx, const char * from, char * to, int mode); #define gl_3des_ecb_encrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,0) #define gl_3des_ecb_decrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,1) #endif /* DES_H */ shishi-1.0.2/gl/printf-args.c0000644000000000000000000001463212126660053012701 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. PRINTF_FETCHARGS Name of the function to be defined. STATIC Set to 'static' to declare the function static. */ #ifndef PRINTF_FETCHARGS # include #endif /* Specification. */ #ifndef PRINTF_FETCHARGS # include "printf-args.h" #endif #ifdef STATIC STATIC #endif int PRINTF_FETCHARGS (va_list args, arguments *a) { size_t i; argument *ap; for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) switch (ap->type) { case TYPE_SCHAR: ap->a.a_schar = va_arg (args, /*signed char*/ int); break; case TYPE_UCHAR: ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); break; case TYPE_SHORT: ap->a.a_short = va_arg (args, /*short*/ int); break; case TYPE_USHORT: ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); break; case TYPE_INT: ap->a.a_int = va_arg (args, int); break; case TYPE_UINT: ap->a.a_uint = va_arg (args, unsigned int); break; case TYPE_LONGINT: ap->a.a_longint = va_arg (args, long int); break; case TYPE_ULONGINT: ap->a.a_ulongint = va_arg (args, unsigned long int); break; #if HAVE_LONG_LONG_INT case TYPE_LONGLONGINT: ap->a.a_longlongint = va_arg (args, long long int); break; case TYPE_ULONGLONGINT: ap->a.a_ulonglongint = va_arg (args, unsigned long long int); break; #endif case TYPE_DOUBLE: ap->a.a_double = va_arg (args, double); break; case TYPE_LONGDOUBLE: ap->a.a_longdouble = va_arg (args, long double); break; case TYPE_CHAR: ap->a.a_char = va_arg (args, int); break; #if HAVE_WINT_T case TYPE_WIDE_CHAR: /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by default argument promotions", this is not the case in mingw32, where wint_t is 'unsigned short'. */ ap->a.a_wide_char = (sizeof (wint_t) < sizeof (int) ? (wint_t) va_arg (args, int) : va_arg (args, wint_t)); break; #endif case TYPE_STRING: ap->a.a_string = va_arg (args, const char *); /* A null pointer is an invalid argument for "%s", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_string == NULL) ap->a.a_string = "(NULL)"; break; #if HAVE_WCHAR_T case TYPE_WIDE_STRING: ap->a.a_wide_string = va_arg (args, const wchar_t *); /* A null pointer is an invalid argument for "%ls", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_wide_string == NULL) { static const wchar_t wide_null_string[] = { (wchar_t)'(', (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', (wchar_t)')', (wchar_t)0 }; ap->a.a_wide_string = wide_null_string; } break; #endif case TYPE_POINTER: ap->a.a_pointer = va_arg (args, void *); break; case TYPE_COUNT_SCHAR_POINTER: ap->a.a_count_schar_pointer = va_arg (args, signed char *); break; case TYPE_COUNT_SHORT_POINTER: ap->a.a_count_short_pointer = va_arg (args, short *); break; case TYPE_COUNT_INT_POINTER: ap->a.a_count_int_pointer = va_arg (args, int *); break; case TYPE_COUNT_LONGINT_POINTER: ap->a.a_count_longint_pointer = va_arg (args, long int *); break; #if HAVE_LONG_LONG_INT case TYPE_COUNT_LONGLONGINT_POINTER: ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); break; #endif #if ENABLE_UNISTDIO /* The unistdio extensions. */ case TYPE_U8_STRING: ap->a.a_u8_string = va_arg (args, const uint8_t *); /* A null pointer is an invalid argument for "%U", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u8_string == NULL) { static const uint8_t u8_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u8_string = u8_null_string; } break; case TYPE_U16_STRING: ap->a.a_u16_string = va_arg (args, const uint16_t *); /* A null pointer is an invalid argument for "%lU", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u16_string == NULL) { static const uint16_t u16_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u16_string = u16_null_string; } break; case TYPE_U32_STRING: ap->a.a_u32_string = va_arg (args, const uint32_t *); /* A null pointer is an invalid argument for "%llU", but in practice it occurs quite frequently in printf statements that produce debug output. Use a fallback in this case. */ if (ap->a.a_u32_string == NULL) { static const uint32_t u32_null_string[] = { '(', 'N', 'U', 'L', 'L', ')', 0 }; ap->a.a_u32_string = u32_null_string; } break; #endif default: /* Unknown type. */ return -1; } return 0; } shishi-1.0.2/gl/stdint.in.h0000644000000000000000000004461012126660053012363 00000000000000/* Copyright (C) 2001-2002, 2004-2013 Free Software Foundation, Inc. Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood. This file is part of gnulib. 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, 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 . */ /* * ISO C 99 for platforms that lack it. * */ #ifndef _@GUARD_PREFIX@_STDINT_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* When including a system file that in turn includes , use the system , not our substitute. This avoids problems with (for example) VMS, whose includes . */ #define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* On Android (Bionic libc), includes this file before having defined 'time_t'. Therefore in this case avoid including other system header files; just include the system's . Ideally we should test __BIONIC__ here, but it is only defined after has been included; hence test __ANDROID__ instead. */ #if defined __ANDROID__ \ && defined _SYS_TYPES_H_ && !defined __need_size_t # @INCLUDE_NEXT@ @NEXT_STDINT_H@ #else /* Get those types that are already defined in other system include files, so that we can "#define int8_t signed char" below without worrying about a later system include file containing a "typedef signed char int8_t;" that will get messed up by our macro. Our macros should all be consistent with the system versions, except for the "fast" types and macros, which we recommend against using in public interfaces due to compiler differences. */ #if @HAVE_STDINT_H@ # if defined __sgi && ! defined __c99 /* Bypass IRIX's if in C89 mode, since it merely annoys users with "This header file is to be used only for c99 mode compilations" diagnostics. */ # define __STDINT_H__ # endif /* Some pre-C++11 implementations need this. */ # ifdef __cplusplus # ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS 1 # endif # ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 # endif # endif /* Other systems may have an incomplete or buggy . Include it before , since any "#include " in would reinclude us, skipping our contents because _@GUARD_PREFIX@_STDINT_H is defined. The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_STDINT_H@ #endif #if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H #define _@GUARD_PREFIX@_STDINT_H /* defines some of the stdint.h types as well, on glibc, IRIX 6.5, and OpenBSD 3.8 (via ). AIX 5.2 isn't needed and causes troubles. Mac OS X 10.4.6 includes (which is us), but relies on the system definitions, so include after @NEXT_STDINT_H@. */ #if @HAVE_SYS_TYPES_H@ && ! defined _AIX # include #endif /* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, ULONG_MAX. */ #include #if @HAVE_INTTYPES_H@ /* In OpenBSD 3.8, includes , which defines int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. also defines intptr_t and uintptr_t. */ # include #elif @HAVE_SYS_INTTYPES_H@ /* Solaris 7 has the types except the *_fast*_t types, and the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ # include #endif #if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__ /* Linux libc4 >= 4.6.7 and libc5 have a that defines int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is included by . */ # include #endif #undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* Minimum and maximum values for an integer type under the usual assumption. Return an unspecified value if BITS == 0, adding a check to pacify picky compilers. */ #define _STDINT_MIN(signed, bits, zero) \ ((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero)) #define _STDINT_MAX(signed, bits, zero) \ ((signed) \ ? ~ _STDINT_MIN (signed, bits, zero) \ : /* The expression for the unsigned case. The subtraction of (signed) \ is a nop in the unsigned case and avoids "signed integer overflow" \ warnings in the signed case. */ \ ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1) #if !GNULIB_defined_stdint_types /* 7.18.1.1. Exact-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. */ #undef int8_t #undef uint8_t typedef signed char gl_int8_t; typedef unsigned char gl_uint8_t; #define int8_t gl_int8_t #define uint8_t gl_uint8_t #undef int16_t #undef uint16_t typedef short int gl_int16_t; typedef unsigned short int gl_uint16_t; #define int16_t gl_int16_t #define uint16_t gl_uint16_t #undef int32_t #undef uint32_t typedef int gl_int32_t; typedef unsigned int gl_uint32_t; #define int32_t gl_int32_t #define uint32_t gl_uint32_t /* If the system defines INT64_MAX, assume int64_t works. That way, if the underlying platform defines int64_t to be a 64-bit long long int, the code below won't mistakenly define it to be a 64-bit long int, which would mess up C++ name mangling. We must use #ifdef rather than #if, to avoid an error with HP-UX 10.20 cc. */ #ifdef INT64_MAX # define GL_INT64_T #else /* Do not undefine int64_t if gnulib is not being used with 64-bit types, since otherwise it breaks platforms like Tandem/NSK. */ # if LONG_MAX >> 31 >> 31 == 1 # undef int64_t typedef long int gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # elif defined _MSC_VER # undef int64_t typedef __int64 gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # elif @HAVE_LONG_LONG_INT@ # undef int64_t typedef long long int gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # endif #endif #ifdef UINT64_MAX # define GL_UINT64_T #else # if ULONG_MAX >> 31 >> 31 >> 1 == 1 # undef uint64_t typedef unsigned long int gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # elif defined _MSC_VER # undef uint64_t typedef unsigned __int64 gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # elif @HAVE_UNSIGNED_LONG_LONG_INT@ # undef uint64_t typedef unsigned long long int gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # endif #endif /* Avoid collision with Solaris 2.5.1 etc. */ #define _UINT8_T #define _UINT32_T #define _UINT64_T /* 7.18.1.2. Minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types are the same as the corresponding N_t types. */ #undef int_least8_t #undef uint_least8_t #undef int_least16_t #undef uint_least16_t #undef int_least32_t #undef uint_least32_t #undef int_least64_t #undef uint_least64_t #define int_least8_t int8_t #define uint_least8_t uint8_t #define int_least16_t int16_t #define uint_least16_t uint16_t #define int_least32_t int32_t #define uint_least32_t uint32_t #ifdef GL_INT64_T # define int_least64_t int64_t #endif #ifdef GL_UINT64_T # define uint_least64_t uint64_t #endif /* 7.18.1.3. Fastest minimum-width integer types */ /* Note: Other substitutes may define these types differently. It is not recommended to use these types in public header files. */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types are taken from the same list of types. The following code normally uses types consistent with glibc, as that lessens the chance of incompatibility with older GNU hosts. */ #undef int_fast8_t #undef uint_fast8_t #undef int_fast16_t #undef uint_fast16_t #undef int_fast32_t #undef uint_fast32_t #undef int_fast64_t #undef uint_fast64_t typedef signed char gl_int_fast8_t; typedef unsigned char gl_uint_fast8_t; #ifdef __sun /* Define types compatible with SunOS 5.10, so that code compiled under earlier SunOS versions works with code compiled under SunOS 5.10. */ typedef int gl_int_fast32_t; typedef unsigned int gl_uint_fast32_t; #else typedef long int gl_int_fast32_t; typedef unsigned long int gl_uint_fast32_t; #endif typedef gl_int_fast32_t gl_int_fast16_t; typedef gl_uint_fast32_t gl_uint_fast16_t; #define int_fast8_t gl_int_fast8_t #define uint_fast8_t gl_uint_fast8_t #define int_fast16_t gl_int_fast16_t #define uint_fast16_t gl_uint_fast16_t #define int_fast32_t gl_int_fast32_t #define uint_fast32_t gl_uint_fast32_t #ifdef GL_INT64_T # define int_fast64_t int64_t #endif #ifdef GL_UINT64_T # define uint_fast64_t uint64_t #endif /* 7.18.1.4. Integer types capable of holding object pointers */ #undef intptr_t #undef uintptr_t typedef long int gl_intptr_t; typedef unsigned long int gl_uintptr_t; #define intptr_t gl_intptr_t #define uintptr_t gl_uintptr_t /* 7.18.1.5. Greatest-width integer types */ /* Note: These types are compiler dependent. It may be unwise to use them in public header files. */ /* If the system defines INTMAX_MAX, assume that intmax_t works, and similarly for UINTMAX_MAX and uintmax_t. This avoids problems with assuming one type where another is used by the system. */ #ifndef INTMAX_MAX # undef INTMAX_C # undef intmax_t # if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1 typedef long long int gl_intmax_t; # define intmax_t gl_intmax_t # elif defined GL_INT64_T # define intmax_t int64_t # else typedef long int gl_intmax_t; # define intmax_t gl_intmax_t # endif #endif #ifndef UINTMAX_MAX # undef UINTMAX_C # undef uintmax_t # if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1 typedef unsigned long long int gl_uintmax_t; # define uintmax_t gl_uintmax_t # elif defined GL_UINT64_T # define uintmax_t uint64_t # else typedef unsigned long int gl_uintmax_t; # define uintmax_t gl_uintmax_t # endif #endif /* Verify that intmax_t and uintmax_t have the same size. Too much code breaks if this is not the case. If this check fails, the reason is likely to be found in the autoconf macros. */ typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t) ? 1 : -1]; #define GNULIB_defined_stdint_types 1 #endif /* !GNULIB_defined_stdint_types */ /* 7.18.2. Limits of specified-width integer types */ /* 7.18.2.1. Limits of exact-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. */ #undef INT8_MIN #undef INT8_MAX #undef UINT8_MAX #define INT8_MIN (~ INT8_MAX) #define INT8_MAX 127 #define UINT8_MAX 255 #undef INT16_MIN #undef INT16_MAX #undef UINT16_MAX #define INT16_MIN (~ INT16_MAX) #define INT16_MAX 32767 #define UINT16_MAX 65535 #undef INT32_MIN #undef INT32_MAX #undef UINT32_MAX #define INT32_MIN (~ INT32_MAX) #define INT32_MAX 2147483647 #define UINT32_MAX 4294967295U #if defined GL_INT64_T && ! defined INT64_MAX /* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0 evaluates the latter incorrectly in preprocessor expressions. */ # define INT64_MIN (- INTMAX_C (1) << 63) # define INT64_MAX INTMAX_C (9223372036854775807) #endif #if defined GL_UINT64_T && ! defined UINT64_MAX # define UINT64_MAX UINTMAX_C (18446744073709551615) #endif /* 7.18.2.2. Limits of minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types are the same as the corresponding N_t types. */ #undef INT_LEAST8_MIN #undef INT_LEAST8_MAX #undef UINT_LEAST8_MAX #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define UINT_LEAST8_MAX UINT8_MAX #undef INT_LEAST16_MIN #undef INT_LEAST16_MAX #undef UINT_LEAST16_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define UINT_LEAST16_MAX UINT16_MAX #undef INT_LEAST32_MIN #undef INT_LEAST32_MAX #undef UINT_LEAST32_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define UINT_LEAST32_MAX UINT32_MAX #undef INT_LEAST64_MIN #undef INT_LEAST64_MAX #ifdef GL_INT64_T # define INT_LEAST64_MIN INT64_MIN # define INT_LEAST64_MAX INT64_MAX #endif #undef UINT_LEAST64_MAX #ifdef GL_UINT64_T # define UINT_LEAST64_MAX UINT64_MAX #endif /* 7.18.2.3. Limits of fastest minimum-width integer types */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types are taken from the same list of types. */ #undef INT_FAST8_MIN #undef INT_FAST8_MAX #undef UINT_FAST8_MAX #define INT_FAST8_MIN SCHAR_MIN #define INT_FAST8_MAX SCHAR_MAX #define UINT_FAST8_MAX UCHAR_MAX #undef INT_FAST16_MIN #undef INT_FAST16_MAX #undef UINT_FAST16_MAX #define INT_FAST16_MIN INT_FAST32_MIN #define INT_FAST16_MAX INT_FAST32_MAX #define UINT_FAST16_MAX UINT_FAST32_MAX #undef INT_FAST32_MIN #undef INT_FAST32_MAX #undef UINT_FAST32_MAX #ifdef __sun # define INT_FAST32_MIN INT_MIN # define INT_FAST32_MAX INT_MAX # define UINT_FAST32_MAX UINT_MAX #else # define INT_FAST32_MIN LONG_MIN # define INT_FAST32_MAX LONG_MAX # define UINT_FAST32_MAX ULONG_MAX #endif #undef INT_FAST64_MIN #undef INT_FAST64_MAX #ifdef GL_INT64_T # define INT_FAST64_MIN INT64_MIN # define INT_FAST64_MAX INT64_MAX #endif #undef UINT_FAST64_MAX #ifdef GL_UINT64_T # define UINT_FAST64_MAX UINT64_MAX #endif /* 7.18.2.4. Limits of integer types capable of holding object pointers */ #undef INTPTR_MIN #undef INTPTR_MAX #undef UINTPTR_MAX #define INTPTR_MIN LONG_MIN #define INTPTR_MAX LONG_MAX #define UINTPTR_MAX ULONG_MAX /* 7.18.2.5. Limits of greatest-width integer types */ #ifndef INTMAX_MAX # undef INTMAX_MIN # ifdef INT64_MAX # define INTMAX_MIN INT64_MIN # define INTMAX_MAX INT64_MAX # else # define INTMAX_MIN INT32_MIN # define INTMAX_MAX INT32_MAX # endif #endif #ifndef UINTMAX_MAX # ifdef UINT64_MAX # define UINTMAX_MAX UINT64_MAX # else # define UINTMAX_MAX UINT32_MAX # endif #endif /* 7.18.3. Limits of other integer types */ /* ptrdiff_t limits */ #undef PTRDIFF_MIN #undef PTRDIFF_MAX #if @APPLE_UNIVERSAL_BUILD@ # ifdef _LP64 # define PTRDIFF_MIN _STDINT_MIN (1, 64, 0l) # define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l) # else # define PTRDIFF_MIN _STDINT_MIN (1, 32, 0) # define PTRDIFF_MAX _STDINT_MAX (1, 32, 0) # endif #else # define PTRDIFF_MIN \ _STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@) # define PTRDIFF_MAX \ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@) #endif /* sig_atomic_t limits */ #undef SIG_ATOMIC_MIN #undef SIG_ATOMIC_MAX #define SIG_ATOMIC_MIN \ _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ 0@SIG_ATOMIC_T_SUFFIX@) #define SIG_ATOMIC_MAX \ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ 0@SIG_ATOMIC_T_SUFFIX@) /* size_t limit */ #undef SIZE_MAX #if @APPLE_UNIVERSAL_BUILD@ # ifdef _LP64 # define SIZE_MAX _STDINT_MAX (0, 64, 0ul) # else # define SIZE_MAX _STDINT_MAX (0, 32, 0ul) # endif #else # define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@) #endif /* wchar_t limits */ /* Get WCHAR_MIN, WCHAR_MAX. This include is not on the top, above, because on OSF/1 4.0 we have a sequence of nested includes -> -> -> , and the latter includes and assumes its types are already defined. */ #if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX) /* BSD/OS 4.0.1 has a bug: , and must be included before . */ # include # include # include # define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H # include # undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H #endif #undef WCHAR_MIN #undef WCHAR_MAX #define WCHAR_MIN \ _STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@) #define WCHAR_MAX \ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@) /* wint_t limits */ #undef WINT_MIN #undef WINT_MAX #define WINT_MIN \ _STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@) #define WINT_MAX \ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@) /* 7.18.4. Macros for integer constants */ /* 7.18.4.1. Macros for minimum-width integer constants */ /* According to ISO C 99 Technical Corrigendum 1 */ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */ #undef INT8_C #undef UINT8_C #define INT8_C(x) x #define UINT8_C(x) x #undef INT16_C #undef UINT16_C #define INT16_C(x) x #define UINT16_C(x) x #undef INT32_C #undef UINT32_C #define INT32_C(x) x #define UINT32_C(x) x ## U #undef INT64_C #undef UINT64_C #if LONG_MAX >> 31 >> 31 == 1 # define INT64_C(x) x##L #elif defined _MSC_VER # define INT64_C(x) x##i64 #elif @HAVE_LONG_LONG_INT@ # define INT64_C(x) x##LL #endif #if ULONG_MAX >> 31 >> 31 >> 1 == 1 # define UINT64_C(x) x##UL #elif defined _MSC_VER # define UINT64_C(x) x##ui64 #elif @HAVE_UNSIGNED_LONG_LONG_INT@ # define UINT64_C(x) x##ULL #endif /* 7.18.4.2. Macros for greatest-width integer constants */ #ifndef INTMAX_C # if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1 # define INTMAX_C(x) x##LL # elif defined GL_INT64_T # define INTMAX_C(x) INT64_C(x) # else # define INTMAX_C(x) x##L # endif #endif #ifndef UINTMAX_C # if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1 # define UINTMAX_C(x) x##ULL # elif defined GL_UINT64_T # define UINTMAX_C(x) UINT64_C(x) # else # define UINTMAX_C(x) x##UL # endif #endif #endif /* _@GUARD_PREFIX@_STDINT_H */ #endif /* !(defined __ANDROID__ && ...) */ #endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */ shishi-1.0.2/gl/strerror.c0000644000000000000000000000404312126660054012323 00000000000000/* strerror.c --- POSIX compatible system error routine Copyright (C) 2007-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include #include #include #include #include #include "intprops.h" #include "strerror-override.h" #include "verify.h" /* Use the system functions, not the gnulib overrides in this file. */ #undef sprintf char * strerror (int n) #undef strerror { static char buf[STACKBUF_LEN]; size_t len; /* Cast away const, due to the historical signature of strerror; callers should not be modifying the string. */ const char *msg = strerror_override (n); if (msg) return (char *) msg; msg = strerror (n); /* Our strerror_r implementation might use the system's strerror buffer, so all other clients of strerror have to see the error copied into a buffer that we manage. This is not thread-safe, even if the system strerror is, but portable programs shouldn't be using strerror if they care about thread-safety. */ if (!msg || !*msg) { static char const fmt[] = "Unknown error %d"; verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n)); sprintf (buf, fmt, n); errno = EINVAL; return buf; } /* Fix STACKBUF_LEN if this ever aborts. */ len = strlen (msg); if (sizeof buf <= len) abort (); return memcpy (buf, msg, len + 1); } shishi-1.0.2/gl/rawmemchr.c0000644000000000000000000001220112126660053012420 00000000000000/* Searching in a string. Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include /* Find the first occurrence of C in S. */ void * rawmemchr (const void *s, int c_in) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned char c; c = (unsigned char) c_in; /* Handle the first few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; (size_t) char_ptr % sizeof (longword) != 0; ++char_ptr) if (*char_ptr == c) return (void *) char_ptr; longword_ptr = (const longword *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to NUL or c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 is zero. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. The test whether any byte in longword1 is zero is equivalent to testing whether tmp is nonzero. This test can read beyond the end of a string, depending on where C_IN is encountered. However, this is considered safe since the initialization phase ensured that the read will be aligned, therefore, the read will not cross page boundaries and will not cause a fault. */ while (1) { longword longword1 = *longword_ptr ^ repeated_c; if ((((longword1 - repeated_one) & ~longword1) & (repeated_one << 7)) != 0) break; longword_ptr++; } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that one of the sizeof (longword) bytes starting at char_ptr is == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ char_ptr = (unsigned char *) longword_ptr; while (*char_ptr != c) char_ptr++; return (void *) char_ptr; } shishi-1.0.2/gl/gc-libgcrypt.c0000644000000000000000000003201012126660051013017 00000000000000/* gc-libgcrypt.c --- Crypto wrappers around Libgcrypt for GC. * Copyright (C) 2002-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Note: This file is only built if GC uses Libgcrypt. */ #include /* Get prototype. */ #include "gc.h" #include #include /* Get libgcrypt API. */ #include #ifdef GNULIB_GC_MD2 # include "md2.h" #endif #include #ifndef MIN_GCRYPT_VERSION # define MIN_GCRYPT_VERSION "1.4.4" #endif /* Initialization. */ Gc_rc gc_init (void) { gcry_error_t err; err = gcry_control (GCRYCTL_ANY_INITIALIZATION_P); if (err == GPG_ERR_NO_ERROR) { if (gcry_control (GCRYCTL_DISABLE_SECMEM, NULL, 0)) return GC_INIT_ERROR; if (gcry_check_version (MIN_GCRYPT_VERSION) == NULL) return GC_INIT_ERROR; err = gcry_control (GCRYCTL_INITIALIZATION_FINISHED, NULL, 0); if (err != GPG_ERR_NO_ERROR) return GC_INIT_ERROR; } return GC_OK; } void gc_done (void) { return; } #ifdef GNULIB_GC_RANDOM /* Randomness. */ Gc_rc gc_nonce (char *data, size_t datalen) { gcry_create_nonce ((unsigned char *) data, datalen); return GC_OK; } Gc_rc gc_pseudo_random (char *data, size_t datalen) { gcry_randomize ((unsigned char *) data, datalen, GCRY_STRONG_RANDOM); return GC_OK; } Gc_rc gc_random (char *data, size_t datalen) { gcry_randomize ((unsigned char *) data, datalen, GCRY_VERY_STRONG_RANDOM); return GC_OK; } #endif /* Memory allocation. */ void gc_set_allocators (gc_malloc_t func_malloc, gc_malloc_t secure_malloc, gc_secure_check_t secure_check, gc_realloc_t func_realloc, gc_free_t func_free) { gcry_set_allocation_handler (func_malloc, secure_malloc, secure_check, func_realloc, func_free); } /* Ciphers. */ Gc_rc gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode, gc_cipher_handle * outhandle) { int gcryalg, gcrymode; gcry_error_t err; switch (alg) { case GC_AES128: gcryalg = GCRY_CIPHER_RIJNDAEL; break; case GC_AES192: gcryalg = GCRY_CIPHER_RIJNDAEL; break; case GC_AES256: gcryalg = GCRY_CIPHER_RIJNDAEL256; break; case GC_3DES: gcryalg = GCRY_CIPHER_3DES; break; case GC_DES: gcryalg = GCRY_CIPHER_DES; break; case GC_ARCFOUR128: case GC_ARCFOUR40: gcryalg = GCRY_CIPHER_ARCFOUR; break; case GC_ARCTWO40: gcryalg = GCRY_CIPHER_RFC2268_40; break; #ifdef HAVE_CAMELLIA case GC_CAMELLIA128: gcryalg = GCRY_CIPHER_CAMELLIA128; break; case GC_CAMELLIA256: gcryalg = GCRY_CIPHER_CAMELLIA256; break; #endif default: return GC_INVALID_CIPHER; } switch (mode) { case GC_ECB: gcrymode = GCRY_CIPHER_MODE_ECB; break; case GC_CBC: gcrymode = GCRY_CIPHER_MODE_CBC; break; case GC_STREAM: gcrymode = GCRY_CIPHER_MODE_STREAM; break; default: return GC_INVALID_CIPHER; } err = gcry_cipher_open ((gcry_cipher_hd_t *) outhandle, gcryalg, gcrymode, 0); if (gcry_err_code (err)) return GC_INVALID_CIPHER; return GC_OK; } Gc_rc gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key) { gcry_error_t err; err = gcry_cipher_setkey ((gcry_cipher_hd_t) handle, key, keylen); if (gcry_err_code (err)) return GC_INVALID_CIPHER; return GC_OK; } Gc_rc gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv) { gcry_error_t err; err = gcry_cipher_setiv ((gcry_cipher_hd_t) handle, iv, ivlen); if (gcry_err_code (err)) return GC_INVALID_CIPHER; return GC_OK; } Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data) { if (gcry_cipher_encrypt ((gcry_cipher_hd_t) handle, data, len, NULL, len) != 0) return GC_INVALID_CIPHER; return GC_OK; } Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data) { if (gcry_cipher_decrypt ((gcry_cipher_hd_t) handle, data, len, NULL, len) != 0) return GC_INVALID_CIPHER; return GC_OK; } Gc_rc gc_cipher_close (gc_cipher_handle handle) { gcry_cipher_close (handle); return GC_OK; } /* Hashes. */ typedef struct _gc_hash_ctx { Gc_hash alg; Gc_hash_mode mode; gcry_md_hd_t gch; #ifdef GNULIB_GC_MD2 char hash[GC_MD2_DIGEST_SIZE]; struct md2_ctx md2Context; #endif } _gc_hash_ctx; Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle) { _gc_hash_ctx *ctx; int gcryalg = 0, gcrymode = 0; gcry_error_t err; Gc_rc rc = GC_OK; ctx = calloc (sizeof (*ctx), 1); if (!ctx) return GC_MALLOC_ERROR; ctx->alg = hash; ctx->mode = mode; switch (hash) { case GC_MD2: gcryalg = GCRY_MD_NONE; break; case GC_MD4: gcryalg = GCRY_MD_MD4; break; case GC_MD5: gcryalg = GCRY_MD_MD5; break; case GC_SHA1: gcryalg = GCRY_MD_SHA1; break; case GC_SHA256: gcryalg = GCRY_MD_SHA256; break; case GC_SHA384: gcryalg = GCRY_MD_SHA384; break; case GC_SHA512: gcryalg = GCRY_MD_SHA512; break; case GC_SHA224: gcryalg = GCRY_MD_SHA224; break; case GC_RMD160: gcryalg = GCRY_MD_RMD160; break; default: rc = GC_INVALID_HASH; } switch (mode) { case 0: gcrymode = 0; break; case GC_HMAC: gcrymode = GCRY_MD_FLAG_HMAC; break; default: rc = GC_INVALID_HASH; } if (rc == GC_OK && gcryalg != GCRY_MD_NONE) { err = gcry_md_open (&ctx->gch, gcryalg, gcrymode); if (gcry_err_code (err)) rc = GC_INVALID_HASH; } if (rc == GC_OK) *outhandle = ctx; else free (ctx); return rc; } Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle) { _gc_hash_ctx *in = handle; _gc_hash_ctx *out; int err; *outhandle = out = calloc (sizeof (*out), 1); if (!out) return GC_MALLOC_ERROR; memcpy (out, in, sizeof (*out)); err = gcry_md_copy (&out->gch, in->gch); if (err) { free (out); return GC_INVALID_HASH; } return GC_OK; } size_t gc_hash_digest_length (Gc_hash hash) { size_t len; switch (hash) { case GC_MD2: len = GC_MD2_DIGEST_SIZE; break; case GC_MD4: len = GC_MD4_DIGEST_SIZE; break; case GC_MD5: len = GC_MD5_DIGEST_SIZE; break; case GC_RMD160: len = GC_RMD160_DIGEST_SIZE; break; case GC_SHA1: len = GC_SHA1_DIGEST_SIZE; break; case GC_SHA256: len = GC_SHA256_DIGEST_SIZE; break; case GC_SHA384: len = GC_SHA384_DIGEST_SIZE; break; case GC_SHA512: len = GC_SHA512_DIGEST_SIZE; break; case GC_SHA224: len = GC_SHA224_DIGEST_SIZE; break; default: return 0; } return len; } void gc_hash_hmac_setkey (gc_hash_handle handle, size_t len, const char *key) { _gc_hash_ctx *ctx = handle; #ifdef GNULIB_GC_MD2 if (ctx->alg != GC_MD2) #endif gcry_md_setkey (ctx->gch, key, len); } void gc_hash_write (gc_hash_handle handle, size_t len, const char *data) { _gc_hash_ctx *ctx = handle; #ifdef GNULIB_GC_MD2 if (ctx->alg == GC_MD2) md2_process_bytes (data, len, &ctx->md2Context); else #endif gcry_md_write (ctx->gch, data, len); } const char * gc_hash_read (gc_hash_handle handle) { _gc_hash_ctx *ctx = handle; const char *digest; #ifdef GNULIB_GC_MD2 if (ctx->alg == GC_MD2) { md2_finish_ctx (&ctx->md2Context, ctx->hash); digest = ctx->hash; } else #endif { gcry_md_final (ctx->gch); digest = gcry_md_read (ctx->gch, 0); } return digest; } void gc_hash_close (gc_hash_handle handle) { _gc_hash_ctx *ctx = handle; #ifdef GNULIB_GC_MD2 if (ctx->alg != GC_MD2) #endif gcry_md_close (ctx->gch); free (ctx); } Gc_rc gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf) { int gcryalg; switch (hash) { #ifdef GNULIB_GC_MD2 case GC_MD2: md2_buffer (in, inlen, resbuf); return GC_OK; break; #endif #ifdef GNULIB_GC_MD4 case GC_MD4: gcryalg = GCRY_MD_MD4; break; #endif #ifdef GNULIB_GC_MD5 case GC_MD5: gcryalg = GCRY_MD_MD5; break; #endif #ifdef GNULIB_GC_SHA1 case GC_SHA1: gcryalg = GCRY_MD_SHA1; break; #endif #ifdef GNULIB_GC_SHA256 case GC_SHA256: gcryalg = GCRY_MD_SHA256; break; #endif #ifdef GNULIB_GC_SHA384 case GC_SHA384: gcryalg = GCRY_MD_SHA384; break; #endif #ifdef GNULIB_GC_SHA512 case GC_SHA512: gcryalg = GCRY_MD_SHA512; break; #endif #ifdef GNULIB_GC_SHA224 case GC_SHA224: gcryalg = GCRY_MD_SHA224; break; #endif #ifdef GNULIB_GC_RMD160 case GC_RMD160: gcryalg = GCRY_MD_RMD160; break; #endif default: return GC_INVALID_HASH; } gcry_md_hash_buffer (gcryalg, resbuf, in, inlen); return GC_OK; } /* One-call interface. */ #ifdef GNULIB_GC_MD2 Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf) { md2_buffer (in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_MD4 Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf) { size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD4); gcry_md_hd_t hd; gpg_error_t err; unsigned char *p; assert (outlen == GC_MD4_DIGEST_SIZE); err = gcry_md_open (&hd, GCRY_MD_MD4, 0); if (err != GPG_ERR_NO_ERROR) return GC_INVALID_HASH; gcry_md_write (hd, in, inlen); p = gcry_md_read (hd, GCRY_MD_MD4); if (p == NULL) { gcry_md_close (hd); return GC_INVALID_HASH; } memcpy (resbuf, p, outlen); gcry_md_close (hd); return GC_OK; } #endif #ifdef GNULIB_GC_MD5 Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf) { size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD5); gcry_md_hd_t hd; gpg_error_t err; unsigned char *p; assert (outlen == GC_MD5_DIGEST_SIZE); err = gcry_md_open (&hd, GCRY_MD_MD5, 0); if (err != GPG_ERR_NO_ERROR) return GC_INVALID_HASH; gcry_md_write (hd, in, inlen); p = gcry_md_read (hd, GCRY_MD_MD5); if (p == NULL) { gcry_md_close (hd); return GC_INVALID_HASH; } memcpy (resbuf, p, outlen); gcry_md_close (hd); return GC_OK; } #endif #ifdef GNULIB_GC_SHA1 Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf) { size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1); gcry_md_hd_t hd; gpg_error_t err; unsigned char *p; assert (outlen == GC_SHA1_DIGEST_SIZE); err = gcry_md_open (&hd, GCRY_MD_SHA1, 0); if (err != GPG_ERR_NO_ERROR) return GC_INVALID_HASH; gcry_md_write (hd, in, inlen); p = gcry_md_read (hd, GCRY_MD_SHA1); if (p == NULL) { gcry_md_close (hd); return GC_INVALID_HASH; } memcpy (resbuf, p, outlen); gcry_md_close (hd); return GC_OK; } #endif #ifdef GNULIB_GC_HMAC_MD5 Gc_rc gc_hmac_md5 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf) { size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_MD5); gcry_md_hd_t mdh; unsigned char *hash; gpg_error_t err; assert (hlen == 16); err = gcry_md_open (&mdh, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC); if (err != GPG_ERR_NO_ERROR) return GC_INVALID_HASH; err = gcry_md_setkey (mdh, key, keylen); if (err != GPG_ERR_NO_ERROR) { gcry_md_close (mdh); return GC_INVALID_HASH; } gcry_md_write (mdh, in, inlen); hash = gcry_md_read (mdh, GCRY_MD_MD5); if (hash == NULL) { gcry_md_close (mdh); return GC_INVALID_HASH; } memcpy (resbuf, hash, hlen); gcry_md_close (mdh); return GC_OK; } #endif #ifdef GNULIB_GC_HMAC_SHA1 Gc_rc gc_hmac_sha1 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf) { size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1); gcry_md_hd_t mdh; unsigned char *hash; gpg_error_t err; assert (hlen == GC_SHA1_DIGEST_SIZE); err = gcry_md_open (&mdh, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC); if (err != GPG_ERR_NO_ERROR) return GC_INVALID_HASH; err = gcry_md_setkey (mdh, key, keylen); if (err != GPG_ERR_NO_ERROR) { gcry_md_close (mdh); return GC_INVALID_HASH; } gcry_md_write (mdh, in, inlen); hash = gcry_md_read (mdh, GCRY_MD_SHA1); if (hash == NULL) { gcry_md_close (mdh); return GC_INVALID_HASH; } memcpy (resbuf, hash, hlen); gcry_md_close (mdh); return GC_OK; } #endif shishi-1.0.2/gl/md5.h0000644000000000000000000001006212126660053011130 00000000000000/* Declaration of functions and data types used for MD5 sum computing library functions. Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, 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 . */ #ifndef _MD5_H #define _MD5_H 1 #include #include #define MD5_DIGEST_SIZE 16 #define MD5_BLOCK_SIZE 64 #ifndef __GNUC_PREREQ # if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) # else # define __GNUC_PREREQ(maj, min) 0 # endif #endif #ifndef __THROW # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif #ifndef _LIBC # define __md5_buffer md5_buffer # define __md5_finish_ctx md5_finish_ctx # define __md5_init_ctx md5_init_ctx # define __md5_process_block md5_process_block # define __md5_process_bytes md5_process_bytes # define __md5_read_ctx md5_read_ctx # define __md5_stream md5_stream #endif # ifdef __cplusplus extern "C" { # endif /* Structure to save state of computation between the single steps. */ struct md5_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* * The following three functions are build up the low level used in * the functions 'md5_stream' and 'md5_buffer'. */ /* Initialize structure containing state of computation. (RFC 1321, 3.3: Step 3) */ extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW; /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void __md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) __THROW; /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void __md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) __THROW; /* Process the remaining bytes in the buffer and put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW; /* Put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW; /* Compute MD5 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ extern int __md5_stream (FILE *stream, void *resblock) __THROW; /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *__md5_buffer (const char *buffer, size_t len, void *resblock) __THROW; # ifdef __cplusplus } # endif #endif /* md5.h */ shishi-1.0.2/gl/timespec.h0000644000000000000000000000622112126660054012257 00000000000000/* timespec -- System time interface Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #if ! defined TIMESPEC_H # define TIMESPEC_H # include _GL_INLINE_HEADER_BEGIN #ifndef _GL_TIMESPEC_INLINE # define _GL_TIMESPEC_INLINE _GL_INLINE #endif /* Return negative, zero, positive if A < B, A == B, A > B, respectively. For each time stamp T, this code assumes that either: * T.tv_nsec is in the range 0..999999999; or * T.tv_sec corresponds to a valid leap second on a host that supports leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000. This allows for special struct timespec values that are less or greater than all possible valid time stamps. In all these cases, it is safe to subtract two tv_nsec values and convert the result to integer without worrying about overflow on any platform of interest to the GNU project, since all such platforms have 32-bit int or wider. Replacing "(int) (a.tv_nsec - b.tv_nsec)" with something like "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause this function to work in some cases where the above assumption is violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2, b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the extra instructions. Using a subtraction has the advantage of detecting some invalid cases on platforms that detect integer overflow. The (int) cast avoids a gcc -Wconversion warning. */ _GL_TIMESPEC_INLINE int timespec_cmp (struct timespec a, struct timespec b) { return (a.tv_sec < b.tv_sec ? -1 : a.tv_sec > b.tv_sec ? 1 : (int) (a.tv_nsec - b.tv_nsec)); } /* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be nonnegative. */ _GL_TIMESPEC_INLINE int timespec_sign (struct timespec a) { return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec; } struct timespec timespec_add (struct timespec, struct timespec) _GL_ATTRIBUTE_CONST; struct timespec timespec_sub (struct timespec, struct timespec) _GL_ATTRIBUTE_CONST; struct timespec dtotimespec (double) _GL_ATTRIBUTE_CONST; /* Return an approximation to A, of type 'double'. */ _GL_TIMESPEC_INLINE double timespectod (struct timespec a) { return a.tv_sec + a.tv_nsec / 1e9; } void gettime (struct timespec *); int settime (struct timespec const *); _GL_INLINE_HEADER_END #endif shishi-1.0.2/gl/strdup.c0000644000000000000000000000247012126660053011763 00000000000000/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, 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 . */ #ifndef _LIBC # include #endif /* Get specification. */ #include #include #undef __strdup #ifdef _LIBC # undef strdup #endif #ifndef weak_alias # define __strdup strdup #endif /* Duplicate S, returning an identical malloc'd string. */ char * __strdup (const char *s) { size_t len = strlen (s) + 1; void *new = malloc (len); if (new == NULL) return NULL; return (char *) memcpy (new, s, len); } #ifdef libc_hidden_def libc_hidden_def (__strdup) #endif #ifdef weak_alias weak_alias (__strdup, strdup) #endif shishi-1.0.2/gl/malloca.valgrind0000664000000000000000000000025712015626624013444 00000000000000# Suppress a valgrind message about use of uninitialized memory in freea(). # This use is OK because it provides only a speedup. { freea Memcheck:Cond fun:freea } shishi-1.0.2/gl/string.in.h0000644000000000000000000011646112126660054012371 00000000000000/* A GNU-like . Copyright (C) 1995-1996, 2001-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_STRING_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STRING_H@ #ifndef _@GUARD_PREFIX@_STRING_H #define _@GUARD_PREFIX@_STRING_H /* NetBSD 5.0 mis-defines NULL. */ #include /* MirBSD defines mbslen as a macro. */ #if @GNULIB_MBSLEN@ && defined __MirBSD__ # include #endif /* The __attribute__ feature is available in gcc versions 2.5 and later. The attribute __pure__ was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* NetBSD 5.0 declares strsignal in , not in . */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Find the index of the least-significant set bit. */ #if @GNULIB_FFSL@ # if !@HAVE_FFSL@ _GL_FUNCDECL_SYS (ffsl, int, (long int i)); # endif _GL_CXXALIAS_SYS (ffsl, int, (long int i)); _GL_CXXALIASWARN (ffsl); #elif defined GNULIB_POSIXCHECK # undef ffsl # if HAVE_RAW_DECL_FFSL _GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module"); # endif #endif /* Find the index of the least-significant set bit. */ #if @GNULIB_FFSLL@ # if !@HAVE_FFSLL@ _GL_FUNCDECL_SYS (ffsll, int, (long long int i)); # endif _GL_CXXALIAS_SYS (ffsll, int, (long long int i)); _GL_CXXALIASWARN (ffsll); #elif defined GNULIB_POSIXCHECK # undef ffsll # if HAVE_RAW_DECL_FFSLL _GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module"); # endif #endif /* Return the first instance of C within N bytes of S, or NULL. */ #if @GNULIB_MEMCHR@ # if @REPLACE_MEMCHR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define memchr rpl_memchr # endif _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); # else # if ! @HAVE_MEMCHR@ _GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C" { const void * std::memchr (const void *, int, size_t); } extern "C++" { void * std::memchr (void *, int, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (memchr, void *, (void const *__s, int __c, size_t __n), void const *, (void const *__s, int __c, size_t __n)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n)); _GL_CXXALIASWARN1 (memchr, void const *, (void const *__s, int __c, size_t __n)); # else _GL_CXXALIASWARN (memchr); # endif #elif defined GNULIB_POSIXCHECK # undef memchr /* Assume memchr is always declared. */ _GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - " "use gnulib module memchr for portability" ); #endif /* Return the first occurrence of NEEDLE in HAYSTACK. */ #if @GNULIB_MEMMEM@ # if @REPLACE_MEMMEM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define memmem rpl_memmem # endif _GL_FUNCDECL_RPL (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 3))); _GL_CXXALIAS_RPL (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len)); # else # if ! @HAVE_DECL_MEMMEM@ _GL_FUNCDECL_SYS (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 3))); # endif _GL_CXXALIAS_SYS (memmem, void *, (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len)); # endif _GL_CXXALIASWARN (memmem); #elif defined GNULIB_POSIXCHECK # undef memmem # if HAVE_RAW_DECL_MEMMEM _GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - " "use gnulib module memmem-simple for portability, " "and module memmem for speed" ); # endif #endif /* Copy N bytes of SRC to DEST, return pointer to bytes after the last written byte. */ #if @GNULIB_MEMPCPY@ # if ! @HAVE_MEMPCPY@ _GL_FUNCDECL_SYS (mempcpy, void *, (void *restrict __dest, void const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (mempcpy, void *, (void *restrict __dest, void const *restrict __src, size_t __n)); _GL_CXXALIASWARN (mempcpy); #elif defined GNULIB_POSIXCHECK # undef mempcpy # if HAVE_RAW_DECL_MEMPCPY _GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - " "use gnulib module mempcpy for portability"); # endif #endif /* Search backwards through a block for a byte (specified as an int). */ #if @GNULIB_MEMRCHR@ # if ! @HAVE_DECL_MEMRCHR@ _GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const void * std::memrchr (const void *, int, size_t); } extern "C++" { void * std::memrchr (void *, int, size_t); } */ _GL_CXXALIAS_SYS_CAST2 (memrchr, void *, (void const *, int, size_t), void const *, (void const *, int, size_t)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t)); _GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t)); # else _GL_CXXALIASWARN (memrchr); # endif #elif defined GNULIB_POSIXCHECK # undef memrchr # if HAVE_RAW_DECL_MEMRCHR _GL_WARN_ON_USE (memrchr, "memrchr is unportable - " "use gnulib module memrchr for portability"); # endif #endif /* Find the first occurrence of C in S. More efficient than memchr(S,C,N), at the expense of undefined behavior if C does not occur within N bytes. */ #if @GNULIB_RAWMEMCHR@ # if ! @HAVE_RAWMEMCHR@ _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const void * std::rawmemchr (const void *, int); } extern "C++" { void * std::rawmemchr (void *, int); } */ _GL_CXXALIAS_SYS_CAST2 (rawmemchr, void *, (void const *__s, int __c_in), void const *, (void const *__s, int __c_in)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in)); _GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in)); # else _GL_CXXALIASWARN (rawmemchr); # endif #elif defined GNULIB_POSIXCHECK # undef rawmemchr # if HAVE_RAW_DECL_RAWMEMCHR _GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - " "use gnulib module rawmemchr for portability"); # endif #endif /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ #if @GNULIB_STPCPY@ # if ! @HAVE_STPCPY@ _GL_FUNCDECL_SYS (stpcpy, char *, (char *restrict __dst, char const *restrict __src) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (stpcpy, char *, (char *restrict __dst, char const *restrict __src)); _GL_CXXALIASWARN (stpcpy); #elif defined GNULIB_POSIXCHECK # undef stpcpy # if HAVE_RAW_DECL_STPCPY _GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - " "use gnulib module stpcpy for portability"); # endif #endif /* Copy no more than N bytes of SRC to DST, returning a pointer past the last non-NUL byte written into DST. */ #if @GNULIB_STPNCPY@ # if @REPLACE_STPNCPY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef stpncpy # define stpncpy rpl_stpncpy # endif _GL_FUNCDECL_RPL (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n)); # else # if ! @HAVE_STPNCPY@ _GL_FUNCDECL_SYS (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (stpncpy, char *, (char *restrict __dst, char const *restrict __src, size_t __n)); # endif _GL_CXXALIASWARN (stpncpy); #elif defined GNULIB_POSIXCHECK # undef stpncpy # if HAVE_RAW_DECL_STPNCPY _GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - " "use gnulib module stpncpy for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strchr() does not work with multibyte strings if the locale encoding is GB18030 and the character to be searched is a digit. */ # undef strchr /* Assume strchr is always declared. */ _GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings " "in some multibyte locales - " "use mbschr if you care about internationalization"); #endif /* Find the first occurrence of C in S or the final NUL byte. */ #if @GNULIB_STRCHRNUL@ # if @REPLACE_STRCHRNUL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strchrnul rpl_strchrnul # endif _GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strchrnul, char *, (const char *str, int ch)); # else # if ! @HAVE_STRCHRNUL@ _GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * std::strchrnul (const char *, int); } extern "C++" { char * std::strchrnul (char *, int); } */ _GL_CXXALIAS_SYS_CAST2 (strchrnul, char *, (char const *__s, int __c_in), char const *, (char const *__s, int __c_in)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in)); _GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in)); # else _GL_CXXALIASWARN (strchrnul); # endif #elif defined GNULIB_POSIXCHECK # undef strchrnul # if HAVE_RAW_DECL_STRCHRNUL _GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - " "use gnulib module strchrnul for portability"); # endif #endif /* Duplicate S, returning an identical malloc'd string. */ #if @GNULIB_STRDUP@ # if @REPLACE_STRDUP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strdup # define strdup rpl_strdup # endif _GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strdup, char *, (char const *__s)); # else # if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup /* strdup exists as a function and as a macro. Get rid of the macro. */ # undef strdup # endif # if !(@HAVE_DECL_STRDUP@ || defined strdup) _GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strdup, char *, (char const *__s)); # endif _GL_CXXALIASWARN (strdup); #elif defined GNULIB_POSIXCHECK # undef strdup # if HAVE_RAW_DECL_STRDUP _GL_WARN_ON_USE (strdup, "strdup is unportable - " "use gnulib module strdup for portability"); # endif #endif /* Append no more than N characters from SRC onto DEST. */ #if @GNULIB_STRNCAT@ # if @REPLACE_STRNCAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strncat # define strncat rpl_strncat # endif _GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n)); # else _GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n)); # endif _GL_CXXALIASWARN (strncat); #elif defined GNULIB_POSIXCHECK # undef strncat # if HAVE_RAW_DECL_STRNCAT _GL_WARN_ON_USE (strncat, "strncat is unportable - " "use gnulib module strncat for portability"); # endif #endif /* Return a newly allocated copy of at most N bytes of STRING. */ #if @GNULIB_STRNDUP@ # if @REPLACE_STRNDUP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strndup # define strndup rpl_strndup # endif _GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n)); # else # if ! @HAVE_DECL_STRNDUP@ _GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n)); # endif _GL_CXXALIASWARN (strndup); #elif defined GNULIB_POSIXCHECK # undef strndup # if HAVE_RAW_DECL_STRNDUP _GL_WARN_ON_USE (strndup, "strndup is unportable - " "use gnulib module strndup for portability"); # endif #endif /* Find the length (number of bytes) of STRING, but scan at most MAXLEN bytes. If no '\0' terminator is found in that many bytes, return MAXLEN. */ #if @GNULIB_STRNLEN@ # if @REPLACE_STRNLEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strnlen # define strnlen rpl_strnlen # endif _GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)); # else # if ! @HAVE_DECL_STRNLEN@ _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)); # endif _GL_CXXALIASWARN (strnlen); #elif defined GNULIB_POSIXCHECK # undef strnlen # if HAVE_RAW_DECL_STRNLEN _GL_WARN_ON_USE (strnlen, "strnlen is unportable - " "use gnulib module strnlen for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strcspn() assumes the second argument is a list of single-byte characters. Even in this simple case, it does not work with multibyte strings if the locale encoding is GB18030 and one of the characters to be searched is a digit. */ # undef strcspn /* Assume strcspn is always declared. */ _GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings " "in multibyte locales - " "use mbscspn if you care about internationalization"); #endif /* Find the first occurrence in S of any character in ACCEPT. */ #if @GNULIB_STRPBRK@ # if ! @HAVE_STRPBRK@ _GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif /* On some systems, this function is defined as an overloaded function: extern "C" { const char * strpbrk (const char *, const char *); } extern "C++" { char * strpbrk (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strpbrk, char *, (char const *__s, char const *__accept), const char *, (char const *__s, char const *__accept)); # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept)); _GL_CXXALIASWARN1 (strpbrk, char const *, (char const *__s, char const *__accept)); # else _GL_CXXALIASWARN (strpbrk); # endif # if defined GNULIB_POSIXCHECK /* strpbrk() assumes the second argument is a list of single-byte characters. Even in this simple case, it does not work with multibyte strings if the locale encoding is GB18030 and one of the characters to be searched is a digit. */ # undef strpbrk _GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings " "in multibyte locales - " "use mbspbrk if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strpbrk # if HAVE_RAW_DECL_STRPBRK _GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - " "use gnulib module strpbrk for portability"); # endif #endif #if defined GNULIB_POSIXCHECK /* strspn() assumes the second argument is a list of single-byte characters. Even in this simple case, it cannot work with multibyte strings. */ # undef strspn /* Assume strspn is always declared. */ _GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings " "in multibyte locales - " "use mbsspn if you care about internationalization"); #endif #if defined GNULIB_POSIXCHECK /* strrchr() does not work with multibyte strings if the locale encoding is GB18030 and the character to be searched is a digit. */ # undef strrchr /* Assume strrchr is always declared. */ _GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings " "in some multibyte locales - " "use mbsrchr if you care about internationalization"); #endif /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. If one is found, overwrite it with a NUL, and advance *STRINGP to point to the next char after it. Otherwise, set *STRINGP to NULL. If *STRINGP was already NULL, nothing happens. Return the old value of *STRINGP. This is a variant of strtok() that is multithread-safe and supports empty fields. Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. Caveat: It doesn't work with multibyte strings unless all of the delimiter characters are ASCII characters < 0x30. See also strtok_r(). */ #if @GNULIB_STRSEP@ # if ! @HAVE_STRSEP@ _GL_FUNCDECL_SYS (strsep, char *, (char **restrict __stringp, char const *restrict __delim) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (strsep, char *, (char **restrict __stringp, char const *restrict __delim)); _GL_CXXALIASWARN (strsep); # if defined GNULIB_POSIXCHECK # undef strsep _GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings " "in multibyte locales - " "use mbssep if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strsep # if HAVE_RAW_DECL_STRSEP _GL_WARN_ON_USE (strsep, "strsep is unportable - " "use gnulib module strsep for portability"); # endif #endif #if @GNULIB_STRSTR@ # if @REPLACE_STRSTR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strstr rpl_strstr # endif _GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); # else /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * strstr (const char *, const char *); } extern "C++" { char * strstr (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strstr, char *, (const char *haystack, const char *needle), const char *, (const char *haystack, const char *needle)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle)); _GL_CXXALIASWARN1 (strstr, const char *, (const char *haystack, const char *needle)); # else _GL_CXXALIASWARN (strstr); # endif #elif defined GNULIB_POSIXCHECK /* strstr() does not work with multibyte strings if the locale encoding is different from UTF-8: POSIX says that it operates on "strings", and "string" in POSIX is defined as a sequence of bytes, not of characters. */ # undef strstr /* Assume strstr is always declared. */ _GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot " "work correctly on character strings in most " "multibyte locales - " "use mbsstr if you care about internationalization, " "or use strstr if you care about speed"); #endif /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison. */ #if @GNULIB_STRCASESTR@ # if @REPLACE_STRCASESTR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strcasestr rpl_strcasestr # endif _GL_FUNCDECL_RPL (strcasestr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (strcasestr, char *, (const char *haystack, const char *needle)); # else # if ! @HAVE_STRCASESTR@ _GL_FUNCDECL_SYS (strcasestr, char *, (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif /* On some systems, this function is defined as an overloaded function: extern "C++" { const char * strcasestr (const char *, const char *); } extern "C++" { char * strcasestr (char *, const char *); } */ _GL_CXXALIAS_SYS_CAST2 (strcasestr, char *, (const char *haystack, const char *needle), const char *, (const char *haystack, const char *needle)); # endif # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) _GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle)); _GL_CXXALIASWARN1 (strcasestr, const char *, (const char *haystack, const char *needle)); # else _GL_CXXALIASWARN (strcasestr); # endif #elif defined GNULIB_POSIXCHECK /* strcasestr() does not work with multibyte strings: It is a glibc extension, and glibc implements it only for unibyte locales. */ # undef strcasestr # if HAVE_RAW_DECL_STRCASESTR _GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character " "strings in multibyte locales - " "use mbscasestr if you care about " "internationalization, or use c-strcasestr if you want " "a locale independent function"); # endif #endif /* Parse S into tokens separated by characters in DELIM. If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = strtok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" This is a variant of strtok() that is multithread-safe. For the POSIX documentation for this function, see: http://www.opengroup.org/susv3xsh/strtok.html Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. Caveat: It doesn't work with multibyte strings unless all of the delimiter characters are ASCII characters < 0x30. See also strsep(). */ #if @GNULIB_STRTOK_R@ # if @REPLACE_STRTOK_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strtok_r # define strtok_r rpl_strtok_r # endif _GL_FUNCDECL_RPL (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr)); # else # if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK # undef strtok_r # endif # if ! @HAVE_DECL_STRTOK_R@ _GL_FUNCDECL_SYS (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (strtok_r, char *, (char *restrict s, char const *restrict delim, char **restrict save_ptr)); # endif _GL_CXXALIASWARN (strtok_r); # if defined GNULIB_POSIXCHECK _GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character " "strings in multibyte locales - " "use mbstok_r if you care about internationalization"); # endif #elif defined GNULIB_POSIXCHECK # undef strtok_r # if HAVE_RAW_DECL_STRTOK_R _GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - " "use gnulib module strtok_r for portability"); # endif #endif /* The following functions are not specified by POSIX. They are gnulib extensions. */ #if @GNULIB_MBSLEN@ /* Return the number of multibyte characters in the character string STRING. This considers multibyte characters, unlike strlen, which counts bytes. */ # ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */ # undef mbslen # endif # if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbslen rpl_mbslen # endif _GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbslen, size_t, (const char *string)); # else _GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbslen, size_t, (const char *string)); # endif _GL_CXXALIASWARN (mbslen); #endif #if @GNULIB_MBSNLEN@ /* Return the number of multibyte characters in the character string starting at STRING and ending at STRING + LEN. */ _GL_EXTERN_C size_t mbsnlen (const char *string, size_t len) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1)); #endif #if @GNULIB_MBSCHR@ /* Locate the first single-byte character C in the character string STRING, and return a pointer to it. Return NULL if C is not found in STRING. Unlike strchr(), this function works correctly in multibyte locales with encodings such as GB18030. */ # if defined __hpux # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbschr rpl_mbschr /* avoid collision with HP-UX function */ # endif _GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c)); # else _GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c)); # endif _GL_CXXALIASWARN (mbschr); #endif #if @GNULIB_MBSRCHR@ /* Locate the last single-byte character C in the character string STRING, and return a pointer to it. Return NULL if C is not found in STRING. Unlike strrchr(), this function works correctly in multibyte locales with encodings such as GB18030. */ # if defined __hpux || defined __INTERIX # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbsrchr rpl_mbsrchr /* avoid collision with system function */ # endif _GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c)); # else _GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c)); # endif _GL_CXXALIASWARN (mbsrchr); #endif #if @GNULIB_MBSSTR@ /* Find the first occurrence of the character string NEEDLE in the character string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. Unlike strstr(), this function works correctly in multibyte locales with encodings different from UTF-8. */ _GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCASECMP@ /* Compare the character strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function may, in multibyte locales, return 0 for strings of different lengths! Unlike strcasecmp(), this function works correctly in multibyte locales. */ _GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSNCASECMP@ /* Compare the initial segment of the character string S1 consisting of at most N characters with the initial segment of the character string S2 consisting of at most N characters, ignoring case, returning less than, equal to or greater than zero if the initial segment of S1 is lexicographically less than, equal to or greater than the initial segment of S2. Note: This function may, in multibyte locales, return 0 for initial segments of different lengths! Unlike strncasecmp(), this function works correctly in multibyte locales. But beware that N is not a byte count but a character count! */ _GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSPCASECMP@ /* Compare the initial segment of the character string STRING consisting of at most mbslen (PREFIX) characters with the character string PREFIX, ignoring case. If the two match, return a pointer to the first byte after this prefix in STRING. Otherwise, return NULL. Note: This function may, in multibyte locales, return non-NULL if STRING is of smaller length than PREFIX! Unlike strncasecmp(), this function works correctly in multibyte locales. */ _GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCASESTR@ /* Find the first occurrence of the character string NEEDLE in the character string HAYSTACK, using case-insensitive comparison. Note: This function may, in multibyte locales, return success even if strlen (haystack) < strlen (needle) ! Unlike strcasestr(), this function works correctly in multibyte locales. */ _GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSCSPN@ /* Find the first occurrence in the character string STRING of any character in the character string ACCEPT. Return the number of bytes from the beginning of the string to this occurrence, or to the end of the string if none exists. Unlike strcspn(), this function works correctly in multibyte locales. */ _GL_EXTERN_C size_t mbscspn (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSPBRK@ /* Find the first occurrence in the character string STRING of any character in the character string ACCEPT. Return the pointer to it, or NULL if none exists. Unlike strpbrk(), this function works correctly in multibyte locales. */ # if defined __hpux # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ # endif _GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept)); # else _GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept)); # endif _GL_CXXALIASWARN (mbspbrk); #endif #if @GNULIB_MBSSPN@ /* Find the first occurrence in the character string STRING of any character not in the character string REJECT. Return the number of bytes from the beginning of the string to this occurrence, or to the end of the string if none exists. Unlike strspn(), this function works correctly in multibyte locales. */ _GL_EXTERN_C size_t mbsspn (const char *string, const char *reject) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSSEP@ /* Search the next delimiter (multibyte character listed in the character string DELIM) starting at the character string *STRINGP. If one is found, overwrite it with a NUL, and advance *STRINGP to point to the next multibyte character after it. Otherwise, set *STRINGP to NULL. If *STRINGP was already NULL, nothing happens. Return the old value of *STRINGP. This is a variant of mbstok_r() that supports empty fields. Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. See also mbstok_r(). */ _GL_EXTERN_C char * mbssep (char **stringp, const char *delim) _GL_ARG_NONNULL ((1, 2)); #endif #if @GNULIB_MBSTOK_R@ /* Parse the character string STRING into tokens separated by characters in the character string DELIM. If STRING is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = mbstok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" Caveat: It modifies the original string. Caveat: These functions cannot be used on constant strings. Caveat: The identity of the delimiting character is lost. See also mbssep(). */ _GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr) _GL_ARG_NONNULL ((2, 3)); #endif /* Map any int, typically from errno, into an error message. */ #if @GNULIB_STRERROR@ # if @REPLACE_STRERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strerror # define strerror rpl_strerror # endif _GL_FUNCDECL_RPL (strerror, char *, (int)); _GL_CXXALIAS_RPL (strerror, char *, (int)); # else _GL_CXXALIAS_SYS (strerror, char *, (int)); # endif _GL_CXXALIASWARN (strerror); #elif defined GNULIB_POSIXCHECK # undef strerror /* Assume strerror is always declared. */ _GL_WARN_ON_USE (strerror, "strerror is unportable - " "use gnulib module strerror to guarantee non-NULL result"); #endif /* Map any int, typically from errno, into an error message. Multithread-safe. Uses the POSIX declaration, not the glibc declaration. */ #if @GNULIB_STRERROR_R@ # if @REPLACE_STRERROR_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef strerror_r # define strerror_r rpl_strerror_r # endif _GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)); # else # if !@HAVE_DECL_STRERROR_R@ _GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)); # endif # if @HAVE_DECL_STRERROR_R@ _GL_CXXALIASWARN (strerror_r); # endif #elif defined GNULIB_POSIXCHECK # undef strerror_r # if HAVE_RAW_DECL_STRERROR_R _GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - " "use gnulib module strerror_r-posix for portability"); # endif #endif #if @GNULIB_STRSIGNAL@ # if @REPLACE_STRSIGNAL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define strsignal rpl_strsignal # endif _GL_FUNCDECL_RPL (strsignal, char *, (int __sig)); _GL_CXXALIAS_RPL (strsignal, char *, (int __sig)); # else # if ! @HAVE_DECL_STRSIGNAL@ _GL_FUNCDECL_SYS (strsignal, char *, (int __sig)); # endif /* Need to cast, because on Cygwin 1.5.x systems, the return type is 'const char *'. */ _GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig)); # endif _GL_CXXALIASWARN (strsignal); #elif defined GNULIB_POSIXCHECK # undef strsignal # if HAVE_RAW_DECL_STRSIGNAL _GL_WARN_ON_USE (strsignal, "strsignal is unportable - " "use gnulib module strsignal for portability"); # endif #endif #if @GNULIB_STRVERSCMP@ # if !@HAVE_STRVERSCMP@ _GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *) _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *)); _GL_CXXALIASWARN (strverscmp); #elif defined GNULIB_POSIXCHECK # undef strverscmp # if HAVE_RAW_DECL_STRVERSCMP _GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - " "use gnulib module strverscmp for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_STRING_H */ #endif /* _@GUARD_PREFIX@_STRING_H */ shishi-1.0.2/gl/md4.c0000644000000000000000000002532712126660053011134 00000000000000/* Functions to compute MD4 message digest of files or memory blocks. according to the definition of MD4 in RFC 1320 from April 1992. Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ /* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt cipher/md4.c . */ #include #include "md4.h" #include #include #include #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifdef WORDS_BIGENDIAN # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else # define SWAP(n) (n) #endif #define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1320, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Initialize structure containing state of computation. (RFC 1320, 3.3: Step 3) */ void md4_init_ctx (struct md4_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Copy the 4 byte value from v into the memory location pointed to by *cp, If your architecture allows unaligned access this is equivalent to * (uint32_t *) cp = v */ static void set_uint32 (char *cp, uint32_t v) { memcpy (cp, &v, sizeof v); } /* Put result from CTX in first 16 bytes following RESBUF. The result must be in little endian byte order. */ void * md4_read_ctx (const struct md4_ctx *ctx, void *resbuf) { char *r = resbuf; set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A)); set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B)); set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C)); set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D)); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. */ void * md4_finish_ctx (struct md4_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t pad; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad); /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3); ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); /* Process last bytes. */ md4_process_block (ctx->buffer, bytes + pad + 8, ctx); return md4_read_ctx (ctx, resbuf); } /* Compute MD4 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ int md4_stream (FILE * stream, void *resblock) { struct md4_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ md4_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ md4_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block:; /* Process any remaining bytes. */ if (sum > 0) md4_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ md4_finish_ctx (&ctx, resblock); free (buffer); return 0; } /* Compute MD4 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ void * md4_buffer (const char *buffer, size_t len, void *resblock) { struct md4_ctx ctx; /* Initialize the computation context. */ md4_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ md4_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return md4_finish_ctx (&ctx, resblock); } void md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char*)ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { md4_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char*)ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { md4_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between md5.c and md4.c --- */ /* MD4 round constants */ #define K1 0x5a827999 #define K2 0x6ed9eba1 /* Round functions. */ #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n)))) #define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s); #define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s); #define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s); /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. */ void md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx) { const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t x[16]; uint32_t A = ctx->A; uint32_t B = ctx->B; uint32_t C = ctx->C; uint32_t D = ctx->D; uint32_t lolen = len; /* First increment the byte count. RFC 1320 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += lolen; ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen); /* Process all bytes in the buffer with 64 bytes in each round of the loop. */ while (words < endp) { int t; for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } /* Round 1. */ R1 (A, B, C, D, 0, 3); R1 (D, A, B, C, 1, 7); R1 (C, D, A, B, 2, 11); R1 (B, C, D, A, 3, 19); R1 (A, B, C, D, 4, 3); R1 (D, A, B, C, 5, 7); R1 (C, D, A, B, 6, 11); R1 (B, C, D, A, 7, 19); R1 (A, B, C, D, 8, 3); R1 (D, A, B, C, 9, 7); R1 (C, D, A, B, 10, 11); R1 (B, C, D, A, 11, 19); R1 (A, B, C, D, 12, 3); R1 (D, A, B, C, 13, 7); R1 (C, D, A, B, 14, 11); R1 (B, C, D, A, 15, 19); /* Round 2. */ R2 (A, B, C, D, 0, 3); R2 (D, A, B, C, 4, 5); R2 (C, D, A, B, 8, 9); R2 (B, C, D, A, 12, 13); R2 (A, B, C, D, 1, 3); R2 (D, A, B, C, 5, 5); R2 (C, D, A, B, 9, 9); R2 (B, C, D, A, 13, 13); R2 (A, B, C, D, 2, 3); R2 (D, A, B, C, 6, 5); R2 (C, D, A, B, 10, 9); R2 (B, C, D, A, 14, 13); R2 (A, B, C, D, 3, 3); R2 (D, A, B, C, 7, 5); R2 (C, D, A, B, 11, 9); R2 (B, C, D, A, 15, 13); /* Round 3. */ R3 (A, B, C, D, 0, 3); R3 (D, A, B, C, 8, 9); R3 (C, D, A, B, 4, 11); R3 (B, C, D, A, 12, 15); R3 (A, B, C, D, 2, 3); R3 (D, A, B, C, 10, 9); R3 (C, D, A, B, 6, 11); R3 (B, C, D, A, 14, 15); R3 (A, B, C, D, 1, 3); R3 (D, A, B, C, 9, 9); R3 (C, D, A, B, 5, 11); R3 (B, C, D, A, 13, 15); R3 (A, B, C, D, 3, 3); R3 (D, A, B, C, 11, 9); R3 (C, D, A, B, 7, 11); R3 (B, C, D, A, 15, 15); A = ctx->A += A; B = ctx->B += B; C = ctx->C += C; D = ctx->D += D; } } shishi-1.0.2/gl/sendto.c0000644000000000000000000000251412126660053011735 00000000000000/* sendto.c --- wrappers for Windows sendto function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef sendto ssize_t rpl_sendto (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int r = sendto (sock, buf, len, flags, to, tolen); if (r < 0) set_winsock_errno (); return r; } } shishi-1.0.2/gl/fseeko.c0000644000000000000000000001253012126660051011712 00000000000000/* An fseeko() function that, together with fflush(), is POSIX compliant. Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include /* Get off_t and lseek. */ #include #include "stdio-impl.h" int fseeko (FILE *fp, off_t offset, int whence) #undef fseeko #if !HAVE_FSEEKO # undef fseek # define fseeko fseek #endif #if _GL_WINDOWS_64_BIT_OFF_T # undef fseeko # if HAVE__FSEEKI64 /* msvc, mingw64 */ # define fseeko _fseeki64 # else /* mingw */ # define fseeko fseeko64 # endif #endif { #if LSEEK_PIPE_BROKEN /* mingw gives bogus answers rather than failure on non-seekable files. */ if (lseek (fileno (fp), 0, SEEK_CUR) == -1) return EOF; #endif /* These tests are based on fpurge.c. */ #if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ if (fp->_IO_read_end == fp->_IO_read_ptr && fp->_IO_write_ptr == fp->_IO_write_base && fp->_IO_save_base == NULL) #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */ # if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) { /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit mode; but has an fseeko that requires 64-bit mode. */ FILE *tmp = fopen ("/dev/null", "r"); if (!tmp) return -1; fp->_flags |= __SL64; fp->_seek64 = tmp->_seek64; fclose (tmp); } # endif if (fp_->_p == fp_->_bf._base && fp_->_r == 0 && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */ ? fp_->_bf._size : 0) && fp_ub._base == NULL) #elif defined __EMX__ /* emx+gcc */ if (fp->_ptr == fp->_buffer && fp->_rcount == 0 && fp->_wcount == 0 && fp->_ungetc_count == 0) #elif defined __minix /* Minix */ if (fp_->_ptr == fp_->_buf && (fp_->_ptr == NULL || fp_->_count == 0)) #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ if (fp_->_ptr == fp_->_base && (fp_->_ptr == NULL || fp_->_cnt == 0)) #elif defined __UCLIBC__ /* uClibc */ if (((fp->__modeflags & __FLAG_WRITING) == 0 || fp->__bufpos == fp->__bufstart) && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0 || fp->__bufpos == fp->__bufread)) #elif defined __QNX__ /* QNX */ if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend) && fp->_Rback == fp->_Back + sizeof (fp->_Back) && fp->_Rsave == NULL) #elif defined __MINT__ /* Atari FreeMiNT */ if (fp->__bufp == fp->__buffer && fp->__get_limit == fp->__bufp && fp->__put_limit == fp->__bufp && !fp->__pushed_back) #elif defined EPLAN9 /* Plan9 */ if (fp->rp == fp->buf && fp->wp == fp->buf) #else #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib." #endif { /* We get here when an fflush() call immediately preceded this one (or if ftell() has created buffers but no I/O has occurred on a newly-opened stream). We know there are no buffers. */ off_t pos = lseek (fileno (fp), offset, whence); if (pos == -1) { #if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */ fp_->_flags &= ~__SOFF; #endif return -1; } #if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ fp->_flags &= ~_IO_EOF_SEEN; fp->_offset = pos; #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */ # if defined __CYGWIN__ /* fp_->_offset is typed as an integer. */ fp_->_offset = pos; # else /* fp_->_offset is an fpos_t. */ { /* Use a union, since on NetBSD, the compilation flags determine whether fpos_t is typedef'd to off_t or a struct containing a single off_t member. */ union { fpos_t f; off_t o; } u; u.o = pos; fp_->_offset = u.f; } # endif fp_->_flags |= __SOFF; fp_->_flags &= ~__SEOF; #elif defined __EMX__ /* emx+gcc */ fp->_flags &= ~_IOEOF; #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ fp->_flag &= ~_IOEOF; #elif defined __MINT__ /* Atari FreeMiNT */ fp->__offset = pos; fp->__eof = 0; #endif return 0; } return fseeko (fp, offset, whence); } shishi-1.0.2/gl/minmax.h0000644000000000000000000000447012126660053011742 00000000000000/* MIN, MAX macros. Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _MINMAX_H #define _MINMAX_H /* Note: MIN, MAX are also defined in on some systems (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about MIN, MAX macro redefinitions on some systems; the workaround is to #include this file as the last one among the #include list. */ /* Before we define the following symbols we get the file since otherwise we get redefinitions on some systems if is included after this file. Likewise for . If more than one of these system headers define MIN and MAX, pick just one of the headers (because the definitions most likely are the same). */ #if HAVE_MINMAX_IN_LIMITS_H # include #elif HAVE_MINMAX_IN_SYS_PARAM_H # include #endif /* Note: MIN and MAX should be used with two arguments of the same type. They might not return the minimum and maximum of their two arguments, if the arguments have different types or have unusual floating-point values. For example, on a typical host with 32-bit 'int', 64-bit 'long long', and 64-bit IEEE 754 'double' types: MAX (-1, 2147483648) returns 4294967295. MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0. MAX (NaN, 0.0) returns 0.0. MAX (+0.0, -0.0) returns -0.0. and in each case the answer is in some sense bogus. */ /* MAX(a,b) returns the maximum of A and B. */ #ifndef MAX # define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif /* MIN(a,b) returns the minimum of A and B. */ #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #endif /* _MINMAX_H */ shishi-1.0.2/gl/memxor.h0000644000000000000000000000221712126660053011755 00000000000000/* memxor.h -- perform binary exclusive OR operation on memory blocks. Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. The interface was inspired by memxor in Niels Möller's Nettle. */ #ifndef MEMXOR_H # define MEMXOR_H #include /* Compute binary exclusive OR of memory areas DEST and SRC, putting the result in DEST, of length N bytes. Returns a pointer to DEST. */ void *memxor (void *restrict dest, const void *restrict src, size_t n); #endif /* MEMXOR_H */ shishi-1.0.2/gl/alloca.c0000664000000000000000000003445412015626624011711 00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ #include #include #include #include #ifdef emacs # include "lisp.h" # include "blockinput.h" # ifdef EMACS_FREE # undef free # define free EMACS_FREE # endif #else # define memory_full() abort () #endif /* If compiling with GCC 2, this file's not needed. */ #if !defined (__GNUC__) || __GNUC__ < 2 /* If someone has defined alloca as a macro, there must be some other way alloca is supposed to work. */ # ifndef alloca # ifdef emacs # ifdef static /* actually, only want this if static is defined as "" -- this is for usg, in which emacs must undefine static in order to make unexec workable */ # ifndef STACK_DIRECTION you lose -- must know STACK_DIRECTION at compile-time /* Using #error here is not wise since this file should work for old and obscure compilers. */ # endif /* STACK_DIRECTION undefined */ # endif /* static */ # endif /* emacs */ /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ # if defined (CRAY) && defined (CRAY_STACKSEG_END) long i00afunc (); # define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) # else # define ADDRESS_FUNCTION(arg) &(arg) # endif /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ # ifndef STACK_DIRECTION # define STACK_DIRECTION 0 /* Direction unknown. */ # endif # if STACK_DIRECTION != 0 # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ # else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ # define STACK_DIR stack_dir static int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } # endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ # ifndef ALIGN_SIZE # define ALIGN_SIZE sizeof(double) # endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ void * alloca (size_t size) { auto char probe; /* Probes stack depth: */ register char *depth = ADDRESS_FUNCTION (probe); # if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ STACK_DIR = find_stack_direction (NULL, (size & 1) + 20); # endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { register header *hp; /* Traverses linked list. */ # ifdef emacs BLOCK_INPUT; # endif for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { register header *np = hp->h.next; free (hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ # ifdef emacs UNBLOCK_INPUT; # endif } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { /* Address of header. */ register header *new; size_t combined_size = sizeof (header) + size; if (combined_size < sizeof (header)) memory_full (); new = malloc (combined_size); if (! new) memory_full (); new->h.next = last_alloca_header; new->h.deep = depth; last_alloca_header = new; /* User storage begins just after header. */ return (void *) (new + 1); } } # if defined (CRAY) && defined (CRAY_STACKSEG_END) # ifdef DEBUG_I00AFUNC # include # endif # ifndef CRAY_STACK # define CRAY_STACK # ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for register storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; # else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; # endif /* CRAY2 */ # endif /* not CRAY_STACK */ # ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } # else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { # ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); # endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { # ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); # endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } # endif /* not CRAY2 */ # endif /* CRAY */ # endif /* no alloca */ #endif /* not GCC 2 */ shishi-1.0.2/gl/xasprintf.c0000644000000000000000000000201312126660054012452 00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 1999, 2002-2004, 2006, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include "xvasprintf.h" char * xasprintf (const char *format, ...) { va_list args; char *result; va_start (args, format); result = xvasprintf (format, args); va_end (args); return result; } shishi-1.0.2/gl/Makefile.am0000644000000000000000000023565012126660065012345 00000000000000## DO NOT EDIT! GENERATED AUTOMATICALLY! ## Process this file with automake to produce Makefile.in. # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --avoid=xalloc-die --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files arpa_inet autobuild base64 bind close connect crc crypto/arcfour crypto/gc-des crypto/gc-hmac-md5 crypto/gc-hmac-sha1 crypto/gc-md4 crypto/gc-md5 crypto/gc-pbkdf2-sha1 crypto/gc-random fcntl fdl-1.3 gendocs getaddrinfo getline getpass getsubopt gnupload lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings minmax netinet_in parse-datetime pmccabe2html read-file recvfrom select sendto shutdown signal socket sockets socklen stat stdint strcase strerror strndup strtok_r strverscmp sys_select sys_socket sys_stat sys_time time timegm unistd update-copyright valgrind-tests vasnprintf vasprintf warnings xalloc xgetdomainname xgethostname xstrndup xvasprintf AUTOMAKE_OPTIONS = 1.5 gnits SUBDIRS = noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = EXTRA_DIST = BUILT_SOURCES = SUFFIXES = MOSTLYCLEANFILES = core *.stackdump MOSTLYCLEANDIRS = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = EXTRA_DIST += m4/gnulib-cache.m4 AM_CPPFLAGS = AM_CFLAGS = noinst_LTLIBRARIES += libgnu.la libgnu_la_SOURCES = libgnu_la_LIBADD = $(gl_LTLIBOBJS) libgnu_la_DEPENDENCIES = $(gl_LTLIBOBJS) EXTRA_libgnu_la_SOURCES = libgnu_la_LDFLAGS = $(AM_LDFLAGS) libgnu_la_LDFLAGS += -no-undefined libgnu_la_LDFLAGS += $(GETADDRINFO_LIB) libgnu_la_LDFLAGS += $(GETHOSTNAME_LIB) libgnu_la_LDFLAGS += $(HOSTENT_LIB) libgnu_la_LDFLAGS += $(INET_NTOP_LIB) libgnu_la_LDFLAGS += $(LIBSOCKET) libgnu_la_LDFLAGS += $(LIB_CLOCK_GETTIME) libgnu_la_LDFLAGS += $(LIB_SELECT) libgnu_la_LDFLAGS += $(LTLIBINTL) libgnu_la_LDFLAGS += $(SERVENT_LIB) ## begin gnulib module alloca libgnu_la_LIBADD += @LTALLOCA@ libgnu_la_DEPENDENCIES += @LTALLOCA@ EXTRA_DIST += alloca.c EXTRA_libgnu_la_SOURCES += alloca.c ## end gnulib module alloca ## begin gnulib module alloca-opt BUILT_SOURCES += $(ALLOCA_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_ALLOCA_H alloca.h: alloca.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/alloca.in.h; \ } > $@-t && \ mv -f $@-t $@ else alloca.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += alloca.h alloca.h-t EXTRA_DIST += alloca.in.h ## end gnulib module alloca-opt ## begin gnulib module arpa_inet BUILT_SOURCES += arpa/inet.h # We need the following in order to create when the system # doesn't have one. arpa/inet.h: arpa_inet.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) arpa $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_ARPA_INET_H''@|$(NEXT_ARPA_INET_H)|g' \ -e 's|@''HAVE_ARPA_INET_H''@|$(HAVE_ARPA_INET_H)|g' \ -e 's/@''GNULIB_INET_NTOP''@/$(GNULIB_INET_NTOP)/g' \ -e 's/@''GNULIB_INET_PTON''@/$(GNULIB_INET_PTON)/g' \ -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \ -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \ -e 's|@''REPLACE_INET_NTOP''@|$(REPLACE_INET_NTOP)|g' \ -e 's|@''REPLACE_INET_PTON''@|$(REPLACE_INET_PTON)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/arpa_inet.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += arpa/inet.h arpa/inet.h-t MOSTLYCLEANDIRS += arpa EXTRA_DIST += arpa_inet.in.h ## end gnulib module arpa_inet ## begin gnulib module base64 libgnu_la_SOURCES += base64.h base64.c ## end gnulib module base64 ## begin gnulib module bind EXTRA_DIST += bind.c w32sock.h EXTRA_libgnu_la_SOURCES += bind.c ## end gnulib module bind ## begin gnulib module c-ctype libgnu_la_SOURCES += c-ctype.h c-ctype.c ## end gnulib module c-ctype ## begin gnulib module close EXTRA_DIST += close.c EXTRA_libgnu_la_SOURCES += close.c ## end gnulib module close ## begin gnulib module connect EXTRA_DIST += connect.c w32sock.h EXTRA_libgnu_la_SOURCES += connect.c ## end gnulib module connect ## begin gnulib module crc libgnu_la_SOURCES += crc.c EXTRA_DIST += crc.h ## end gnulib module crc ## begin gnulib module crypto/arcfour libgnu_la_SOURCES += arcfour.c EXTRA_DIST += arcfour.h ## end gnulib module crypto/arcfour ## begin gnulib module crypto/des libgnu_la_SOURCES += des.c EXTRA_DIST += des.h ## end gnulib module crypto/des ## begin gnulib module crypto/gc if GL_COND_LIBTOOL libgnu_la_LDFLAGS += $(LTLIBGCRYPT) endif EXTRA_DIST += gc-gnulib.c gc-libgcrypt.c gc.h EXTRA_libgnu_la_SOURCES += gc-gnulib.c gc-libgcrypt.c ## end gnulib module crypto/gc ## begin gnulib module crypto/gc-md5 libgnu_la_SOURCES += md5.h ## end gnulib module crypto/gc-md5 ## begin gnulib module crypto/gc-pbkdf2-sha1 libgnu_la_SOURCES += gc-pbkdf2-sha1.c ## end gnulib module crypto/gc-pbkdf2-sha1 ## begin gnulib module crypto/hmac-md5 libgnu_la_SOURCES += hmac-md5.c EXTRA_DIST += hmac.h ## end gnulib module crypto/hmac-md5 ## begin gnulib module crypto/hmac-sha1 libgnu_la_SOURCES += hmac-sha1.c EXTRA_DIST += hmac.h ## end gnulib module crypto/hmac-sha1 ## begin gnulib module crypto/md4 libgnu_la_SOURCES += md4.c EXTRA_DIST += md4.h ## end gnulib module crypto/md4 ## begin gnulib module crypto/md5 libgnu_la_SOURCES += md5.c EXTRA_DIST += md5.h ## end gnulib module crypto/md5 ## begin gnulib module crypto/sha1 libgnu_la_SOURCES += sha1.c EXTRA_DIST += sha1.h ## end gnulib module crypto/sha1 ## begin gnulib module dosname EXTRA_DIST += dosname.h ## end gnulib module dosname ## begin gnulib module dup2 EXTRA_DIST += dup2.c EXTRA_libgnu_la_SOURCES += dup2.c ## end gnulib module dup2 ## begin gnulib module errno BUILT_SOURCES += $(ERRNO_H) # We need the following in order to create when the system # doesn't have one that is POSIX compliant. if GL_GENERATE_ERRNO_H errno.h: errno.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ < $(srcdir)/errno.in.h; \ } > $@-t && \ mv $@-t $@ else errno.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += errno.h errno.h-t EXTRA_DIST += errno.in.h ## end gnulib module errno ## begin gnulib module fcntl EXTRA_DIST += fcntl.c EXTRA_libgnu_la_SOURCES += fcntl.c ## end gnulib module fcntl ## begin gnulib module fcntl-h BUILT_SOURCES += fcntl.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/fcntl.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += fcntl.h fcntl.h-t EXTRA_DIST += fcntl.in.h ## end gnulib module fcntl-h ## begin gnulib module fd-hook libgnu_la_SOURCES += fd-hook.c EXTRA_DIST += fd-hook.h ## end gnulib module fd-hook ## begin gnulib module float BUILT_SOURCES += $(FLOAT_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_FLOAT_H float.h: float.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ < $(srcdir)/float.in.h; \ } > $@-t && \ mv $@-t $@ else float.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += float.h float.h-t EXTRA_DIST += float.c float.in.h itold.c EXTRA_libgnu_la_SOURCES += float.c itold.c ## end gnulib module float ## begin gnulib module fseek EXTRA_DIST += fseek.c EXTRA_libgnu_la_SOURCES += fseek.c ## end gnulib module fseek ## begin gnulib module fseeko EXTRA_DIST += fseeko.c stdio-impl.h EXTRA_libgnu_la_SOURCES += fseeko.c ## end gnulib module fseeko ## begin gnulib module fstat EXTRA_DIST += fstat.c EXTRA_libgnu_la_SOURCES += fstat.c ## end gnulib module fstat ## begin gnulib module ftell EXTRA_DIST += ftell.c EXTRA_libgnu_la_SOURCES += ftell.c ## end gnulib module ftell ## begin gnulib module ftello EXTRA_DIST += ftello.c stdio-impl.h EXTRA_libgnu_la_SOURCES += ftello.c ## end gnulib module ftello ## begin gnulib module gendocs EXTRA_DIST += $(top_srcdir)/build-aux/gendocs.sh ## end gnulib module gendocs ## begin gnulib module getaddrinfo EXTRA_DIST += gai_strerror.c getaddrinfo.c EXTRA_libgnu_la_SOURCES += gai_strerror.c getaddrinfo.c ## end gnulib module getaddrinfo ## begin gnulib module getdelim EXTRA_DIST += getdelim.c EXTRA_libgnu_la_SOURCES += getdelim.c ## end gnulib module getdelim ## begin gnulib module getdomainname EXTRA_DIST += getdomainname.c EXTRA_libgnu_la_SOURCES += getdomainname.c ## end gnulib module getdomainname ## begin gnulib module getdtablesize EXTRA_DIST += getdtablesize.c EXTRA_libgnu_la_SOURCES += getdtablesize.c ## end gnulib module getdtablesize ## begin gnulib module gethostname EXTRA_DIST += gethostname.c w32sock.h EXTRA_libgnu_la_SOURCES += gethostname.c ## end gnulib module gethostname ## begin gnulib module getline EXTRA_DIST += getline.c EXTRA_libgnu_la_SOURCES += getline.c ## end gnulib module getline ## begin gnulib module getpass EXTRA_DIST += getpass.c getpass.h EXTRA_libgnu_la_SOURCES += getpass.c ## end gnulib module getpass ## begin gnulib module getpeername EXTRA_DIST += getpeername.c w32sock.h EXTRA_libgnu_la_SOURCES += getpeername.c ## end gnulib module getpeername ## begin gnulib module getsubopt EXTRA_DIST += getsubopt.c EXTRA_libgnu_la_SOURCES += getsubopt.c ## end gnulib module getsubopt ## begin gnulib module gettext-h libgnu_la_SOURCES += gettext.h ## end gnulib module gettext-h ## begin gnulib module gettime libgnu_la_SOURCES += gettime.c ## end gnulib module gettime ## begin gnulib module gettimeofday EXTRA_DIST += gettimeofday.c EXTRA_libgnu_la_SOURCES += gettimeofday.c ## end gnulib module gettimeofday ## begin gnulib module gnumakefile distclean-local: clean-GNUmakefile clean-GNUmakefile: test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile EXTRA_DIST += $(top_srcdir)/GNUmakefile ## end gnulib module gnumakefile ## begin gnulib module gnupload EXTRA_DIST += $(top_srcdir)/build-aux/gnupload ## end gnulib module gnupload ## begin gnulib module havelib EXTRA_DIST += $(top_srcdir)/build-aux/config.rpath ## end gnulib module havelib ## begin gnulib module inet_ntop EXTRA_DIST += inet_ntop.c EXTRA_libgnu_la_SOURCES += inet_ntop.c ## end gnulib module inet_ntop ## begin gnulib module intprops EXTRA_DIST += intprops.h ## end gnulib module intprops ## begin gnulib module lseek EXTRA_DIST += lseek.c EXTRA_libgnu_la_SOURCES += lseek.c ## end gnulib module lseek ## begin gnulib module maintainer-makefile EXTRA_DIST += $(top_srcdir)/maint.mk ## end gnulib module maintainer-makefile ## begin gnulib module malloc-posix EXTRA_DIST += malloc.c EXTRA_libgnu_la_SOURCES += malloc.c ## end gnulib module malloc-posix ## begin gnulib module malloca libgnu_la_SOURCES += malloca.c EXTRA_DIST += malloca.h malloca.valgrind ## end gnulib module malloca ## begin gnulib module memchr EXTRA_DIST += memchr.c memchr.valgrind EXTRA_libgnu_la_SOURCES += memchr.c ## end gnulib module memchr ## begin gnulib module memxor libgnu_la_SOURCES += memxor.c EXTRA_DIST += memxor.h ## end gnulib module memxor ## begin gnulib module minmax libgnu_la_SOURCES += minmax.h ## end gnulib module minmax ## begin gnulib module mktime EXTRA_DIST += mktime-internal.h mktime.c EXTRA_libgnu_la_SOURCES += mktime.c ## end gnulib module mktime ## begin gnulib module mktime-internal EXTRA_DIST += mktime-internal.h mktime.c EXTRA_libgnu_la_SOURCES += mktime.c ## end gnulib module mktime-internal ## begin gnulib module msvc-inval EXTRA_DIST += msvc-inval.c msvc-inval.h EXTRA_libgnu_la_SOURCES += msvc-inval.c ## end gnulib module msvc-inval ## begin gnulib module msvc-nothrow EXTRA_DIST += msvc-nothrow.c msvc-nothrow.h EXTRA_libgnu_la_SOURCES += msvc-nothrow.c ## end gnulib module msvc-nothrow ## begin gnulib module netdb BUILT_SOURCES += netdb.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. netdb.h: netdb.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \ -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \ -e 's/@''GNULIB_GETADDRINFO''@/$(GNULIB_GETADDRINFO)/g' \ -e 's|@''HAVE_STRUCT_ADDRINFO''@|$(HAVE_STRUCT_ADDRINFO)|g' \ -e 's|@''HAVE_DECL_FREEADDRINFO''@|$(HAVE_DECL_FREEADDRINFO)|g' \ -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \ -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \ -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \ -e 's|@''REPLACE_GAI_STRERROR''@|$(REPLACE_GAI_STRERROR)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/netdb.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += netdb.h netdb.h-t EXTRA_DIST += netdb.in.h ## end gnulib module netdb ## begin gnulib module netinet_in BUILT_SOURCES += $(NETINET_IN_H) # We need the following in order to create when the system # doesn't have one. if GL_GENERATE_NETINET_IN_H netinet/in.h: netinet_in.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) netinet $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \ -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \ < $(srcdir)/netinet_in.in.h; \ } > $@-t && \ mv $@-t $@ else netinet/in.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += netinet/in.h netinet/in.h-t MOSTLYCLEANDIRS += netinet EXTRA_DIST += netinet_in.in.h ## end gnulib module netinet_in ## begin gnulib module parse-datetime # This rule overrides the Automake generated .y.c rule, to ensure that the # parse-datetime.c file gets generated in the source directory, not in the # build directory. parse-datetime.c: parse-datetime.y $(AM_V_GEN)$(SHELL) $(YLWRAP) $(srcdir)/parse-datetime.y \ y.tab.c parse-datetime.c \ y.tab.h parse-datetime.h \ y.output parse-datetime.output \ -- $(YACC) $(YFLAGS) $(AM_YFLAGS) && \ mv parse-datetime.c parse-datetime.c-t && \ mv parse-datetime.c-t $(srcdir)/parse-datetime.c libgnu_la_SOURCES += parse-datetime.y BUILT_SOURCES += parse-datetime.c MOSTLYCLEANFILES += parse-datetime.c-t MAINTAINERCLEANFILES += parse-datetime.c EXTRA_DIST += parse-datetime.c EXTRA_DIST += parse-datetime.h ## end gnulib module parse-datetime ## begin gnulib module pathmax EXTRA_DIST += pathmax.h ## end gnulib module pathmax ## begin gnulib module pmccabe2html EXTRA_DIST += $(top_srcdir)/build-aux/pmccabe2html $(top_srcdir)/build-aux/pmccabe.css ## end gnulib module pmccabe2html ## begin gnulib module rawmemchr EXTRA_DIST += rawmemchr.c rawmemchr.valgrind EXTRA_libgnu_la_SOURCES += rawmemchr.c ## end gnulib module rawmemchr ## begin gnulib module read-file libgnu_la_SOURCES += read-file.c EXTRA_DIST += read-file.h ## end gnulib module read-file ## begin gnulib module realloc-posix EXTRA_DIST += realloc.c EXTRA_libgnu_la_SOURCES += realloc.c ## end gnulib module realloc-posix ## begin gnulib module recvfrom EXTRA_DIST += recvfrom.c w32sock.h EXTRA_libgnu_la_SOURCES += recvfrom.c ## end gnulib module recvfrom ## begin gnulib module select EXTRA_DIST += select.c EXTRA_libgnu_la_SOURCES += select.c ## end gnulib module select ## begin gnulib module sendto EXTRA_DIST += sendto.c w32sock.h EXTRA_libgnu_la_SOURCES += sendto.c ## end gnulib module sendto ## begin gnulib module setenv EXTRA_DIST += setenv.c EXTRA_libgnu_la_SOURCES += setenv.c ## end gnulib module setenv ## begin gnulib module shutdown EXTRA_DIST += shutdown.c w32sock.h EXTRA_libgnu_la_SOURCES += shutdown.c ## end gnulib module shutdown ## begin gnulib module signal-h BUILT_SOURCES += signal.h # We need the following in order to create when the system # doesn't have a complete one. signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \ -e 's|@''GNULIB_PTHREAD_SIGMASK''@|$(GNULIB_PTHREAD_SIGMASK)|g' \ -e 's|@''GNULIB_RAISE''@|$(GNULIB_RAISE)|g' \ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/signal.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += signal.h signal.h-t EXTRA_DIST += signal.in.h ## end gnulib module signal-h ## begin gnulib module size_max libgnu_la_SOURCES += size_max.h ## end gnulib module size_max ## begin gnulib module snippet/_Noreturn # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all Makefile.am that # need it. This is ensured by the applicability 'all' defined above. _NORETURN_H=$(top_srcdir)/build-aux/snippet/_Noreturn.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/_Noreturn.h ## end gnulib module snippet/_Noreturn ## begin gnulib module snippet/arg-nonnull # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES += arg-nonnull.h # The arg-nonnull.h that gets inserted into generated .h files is the same as # build-aux/snippet/arg-nonnull.h, except that it has the copyright header cut # off. arg-nonnull.h: $(top_srcdir)/build-aux/snippet/arg-nonnull.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/GL_ARG_NONNULL/,$$p' \ < $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += arg-nonnull.h arg-nonnull.h-t ARG_NONNULL_H=arg-nonnull.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/arg-nonnull.h ## end gnulib module snippet/arg-nonnull ## begin gnulib module snippet/c++defs # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES += c++defs.h # The c++defs.h that gets inserted into generated .h files is the same as # build-aux/snippet/c++defs.h, except that it has the copyright header cut off. c++defs.h: $(top_srcdir)/build-aux/snippet/c++defs.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/_GL_CXXDEFS/,$$p' \ < $(top_srcdir)/build-aux/snippet/c++defs.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += c++defs.h c++defs.h-t CXXDEFS_H=c++defs.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/c++defs.h ## end gnulib module snippet/c++defs ## begin gnulib module snippet/warn-on-use BUILT_SOURCES += warn-on-use.h # The warn-on-use.h that gets inserted into generated .h files is the same as # build-aux/snippet/warn-on-use.h, except that it has the copyright header cut # off. warn-on-use.h: $(top_srcdir)/build-aux/snippet/warn-on-use.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/^.ifndef/,$$p' \ < $(top_srcdir)/build-aux/snippet/warn-on-use.h \ > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += warn-on-use.h warn-on-use.h-t WARN_ON_USE_H=warn-on-use.h EXTRA_DIST += $(top_srcdir)/build-aux/snippet/warn-on-use.h ## end gnulib module snippet/warn-on-use ## begin gnulib module snprintf EXTRA_DIST += snprintf.c EXTRA_libgnu_la_SOURCES += snprintf.c ## end gnulib module snprintf ## begin gnulib module socket EXTRA_DIST += socket.c w32sock.h EXTRA_libgnu_la_SOURCES += socket.c ## end gnulib module socket ## begin gnulib module sockets libgnu_la_SOURCES += sockets.h sockets.c EXTRA_DIST += w32sock.h ## end gnulib module sockets ## begin gnulib module stat EXTRA_DIST += stat.c EXTRA_libgnu_la_SOURCES += stat.c ## end gnulib module stat ## begin gnulib module stdalign BUILT_SOURCES += $(STDALIGN_H) # We need the following in order to create when the system # doesn't have one that works. if GL_GENERATE_STDALIGN_H stdalign.h: stdalign.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ cat $(srcdir)/stdalign.in.h; \ } > $@-t && \ mv $@-t $@ else stdalign.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdalign.h stdalign.h-t EXTRA_DIST += stdalign.in.h ## end gnulib module stdalign ## begin gnulib module stdarg BUILT_SOURCES += $(STDARG_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDARG_H stdarg.h: stdarg.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ < $(srcdir)/stdarg.in.h; \ } > $@-t && \ mv $@-t $@ else stdarg.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdarg.h stdarg.h-t EXTRA_DIST += stdarg.in.h ## end gnulib module stdarg ## begin gnulib module stdbool BUILT_SOURCES += $(STDBOOL_H) # We need the following in order to create when the system # doesn't have one that works. if GL_GENERATE_STDBOOL_H stdbool.h: stdbool.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ } > $@-t && \ mv $@-t $@ else stdbool.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdbool.h stdbool.h-t EXTRA_DIST += stdbool.in.h ## end gnulib module stdbool ## begin gnulib module stddef BUILT_SOURCES += $(STDDEF_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDDEF_H stddef.h: stddef.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ < $(srcdir)/stddef.in.h; \ } > $@-t && \ mv $@-t $@ else stddef.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stddef.h stddef.h-t EXTRA_DIST += stddef.in.h ## end gnulib module stddef ## begin gnulib module stdint BUILT_SOURCES += $(STDINT_H) # We need the following in order to create when the system # doesn't have one that works with the given compiler. if GL_GENERATE_STDINT_H stdint.h: stdint.in.h $(top_builddir)/config.status $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ < $(srcdir)/stdint.in.h; \ } > $@-t && \ mv $@-t $@ else stdint.h: $(top_builddir)/config.status rm -f $@ endif MOSTLYCLEANFILES += stdint.h stdint.h-t EXTRA_DIST += stdint.in.h ## end gnulib module stdint ## begin gnulib module stdio BUILT_SOURCES += stdio.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \ < $(srcdir)/stdio.in.h | \ sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += stdio.h stdio.h-t EXTRA_DIST += stdio.in.h ## end gnulib module stdio ## begin gnulib module stdlib BUILT_SOURCES += stdlib.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \ < $(srcdir)/stdlib.in.h | \ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _Noreturn/r $(_NORETURN_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += stdlib.h stdlib.h-t EXTRA_DIST += stdlib.in.h ## end gnulib module stdlib ## begin gnulib module strcase EXTRA_DIST += strcasecmp.c strncasecmp.c EXTRA_libgnu_la_SOURCES += strcasecmp.c strncasecmp.c ## end gnulib module strcase ## begin gnulib module strchrnul EXTRA_DIST += strchrnul.c strchrnul.valgrind EXTRA_libgnu_la_SOURCES += strchrnul.c ## end gnulib module strchrnul ## begin gnulib module strdup-posix EXTRA_DIST += strdup.c EXTRA_libgnu_la_SOURCES += strdup.c ## end gnulib module strdup-posix ## begin gnulib module strerror EXTRA_DIST += strerror.c EXTRA_libgnu_la_SOURCES += strerror.c ## end gnulib module strerror ## begin gnulib module strerror-override EXTRA_DIST += strerror-override.c strerror-override.h EXTRA_libgnu_la_SOURCES += strerror-override.c ## end gnulib module strerror-override ## begin gnulib module string BUILT_SOURCES += string.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \ < $(srcdir)/string.in.h | \ sed -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ < $(srcdir)/string.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += string.h string.h-t EXTRA_DIST += string.in.h ## end gnulib module string ## begin gnulib module strings BUILT_SOURCES += strings.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ -e 's|@''GNULIB_FFS''@|$(GNULIB_FFS)|g' \ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/strings.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += strings.h strings.h-t EXTRA_DIST += strings.in.h ## end gnulib module strings ## begin gnulib module strndup EXTRA_DIST += strndup.c EXTRA_libgnu_la_SOURCES += strndup.c ## end gnulib module strndup ## begin gnulib module strnlen EXTRA_DIST += strnlen.c EXTRA_libgnu_la_SOURCES += strnlen.c ## end gnulib module strnlen ## begin gnulib module strtok_r EXTRA_DIST += strtok_r.c EXTRA_libgnu_la_SOURCES += strtok_r.c ## end gnulib module strtok_r ## begin gnulib module strverscmp EXTRA_DIST += strverscmp.c EXTRA_libgnu_la_SOURCES += strverscmp.c ## end gnulib module strverscmp ## begin gnulib module sys_select BUILT_SOURCES += sys/select.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_select.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/select.h sys/select.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_select.in.h ## end gnulib module sys_select ## begin gnulib module sys_socket BUILT_SOURCES += sys/socket.h libgnu_la_SOURCES += sys_socket.c # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_socket.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_socket.in.h ## end gnulib module sys_socket ## begin gnulib module sys_stat BUILT_SOURCES += sys/stat.h # We need the following in order to create when the system # has one that is incomplete. sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_stat.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_stat.in.h ## end gnulib module sys_stat ## begin gnulib module sys_time BUILT_SOURCES += sys/time.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_time.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/time.h sys/time.h-t EXTRA_DIST += sys_time.in.h ## end gnulib module sys_time ## begin gnulib module sys_types BUILT_SOURCES += sys/types.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/types.h: sys_types.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ < $(srcdir)/sys_types.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += sys/types.h sys/types.h-t EXTRA_DIST += sys_types.in.h ## end gnulib module sys_types ## begin gnulib module sys_uio BUILT_SOURCES += sys/uio.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/uio.h: sys_uio.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \ < $(srcdir)/sys_uio.in.h; \ } > $@-t && \ mv -f $@-t $@ MOSTLYCLEANFILES += sys/uio.h sys/uio.h-t MOSTLYCLEANDIRS += sys EXTRA_DIST += sys_uio.in.h ## end gnulib module sys_uio ## begin gnulib module time BUILT_SOURCES += time.h # We need the following in order to create when the system # doesn't have one that works with the given compiler. time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/time.in.h; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += time.h time.h-t EXTRA_DIST += time.in.h ## end gnulib module time ## begin gnulib module time_r EXTRA_DIST += time_r.c EXTRA_libgnu_la_SOURCES += time_r.c ## end gnulib module time_r ## begin gnulib module timegm EXTRA_DIST += mktime-internal.h timegm.c EXTRA_libgnu_la_SOURCES += timegm.c ## end gnulib module timegm ## begin gnulib module timespec libgnu_la_SOURCES += timespec.c EXTRA_DIST += timespec.h ## end gnulib module timespec ## begin gnulib module unistd BUILT_SOURCES += unistd.h libgnu_la_SOURCES += unistd.c # We need the following in order to create an empty placeholder for # when the system doesn't have one. unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \ < $(srcdir)/unistd.in.h | \ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ -e 's|@''HAVE_GETLOGIN''@|$(HAVE_GETLOGIN)|g' \ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ | \ sed -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += unistd.h unistd.h-t EXTRA_DIST += unistd.in.h ## end gnulib module unistd ## begin gnulib module unsetenv EXTRA_DIST += unsetenv.c EXTRA_libgnu_la_SOURCES += unsetenv.c ## end gnulib module unsetenv ## begin gnulib module update-copyright EXTRA_DIST += $(top_srcdir)/build-aux/update-copyright ## end gnulib module update-copyright ## begin gnulib module useless-if-before-free EXTRA_DIST += $(top_srcdir)/build-aux/useless-if-before-free ## end gnulib module useless-if-before-free ## begin gnulib module vasnprintf EXTRA_DIST += asnprintf.c float+.h printf-args.c printf-args.h printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h EXTRA_libgnu_la_SOURCES += asnprintf.c printf-args.c printf-parse.c vasnprintf.c ## end gnulib module vasnprintf ## begin gnulib module vasprintf EXTRA_DIST += asprintf.c vasprintf.c EXTRA_libgnu_la_SOURCES += asprintf.c vasprintf.c ## end gnulib module vasprintf ## begin gnulib module vc-list-files EXTRA_DIST += $(top_srcdir)/build-aux/vc-list-files ## end gnulib module vc-list-files ## begin gnulib module verify EXTRA_DIST += verify.h ## end gnulib module verify ## begin gnulib module wchar BUILT_SOURCES += wchar.h # We need the following in order to create when the system # version does not work standalone. wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \ < $(srcdir)/wchar.in.h | \ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ | \ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ MOSTLYCLEANFILES += wchar.h wchar.h-t EXTRA_DIST += wchar.in.h ## end gnulib module wchar ## begin gnulib module xalloc libgnu_la_SOURCES += xmalloc.c EXTRA_DIST += xalloc.h ## end gnulib module xalloc ## begin gnulib module xalloc-oversized EXTRA_DIST += xalloc-oversized.h ## end gnulib module xalloc-oversized ## begin gnulib module xgetdomainname libgnu_la_SOURCES += xgetdomainname.h xgetdomainname.c ## end gnulib module xgetdomainname ## begin gnulib module xgethostname libgnu_la_SOURCES += xgethostname.h xgethostname.c ## end gnulib module xgethostname ## begin gnulib module xsize libgnu_la_SOURCES += xsize.h xsize.c ## end gnulib module xsize ## begin gnulib module xstrndup libgnu_la_SOURCES += xstrndup.h xstrndup.c ## end gnulib module xstrndup ## begin gnulib module xvasprintf libgnu_la_SOURCES += xvasprintf.h xvasprintf.c xasprintf.c EXTRA_DIST += xalloc.h ## end gnulib module xvasprintf mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : shishi-1.0.2/gl/base64.h0000644000000000000000000000424412126660051011532 00000000000000/* base64.h -- Encode binary data using printable characters. Copyright (C) 2004-2006, 2009-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ #ifndef BASE64_H # define BASE64_H /* Get size_t. */ # include /* Get bool. */ # include # ifdef __cplusplus extern "C" { # endif /* This uses that the expression (n+(k-1))/k means the smallest integer >= n/k, i.e., the ceiling of n/k. */ # define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) struct base64_decode_context { unsigned int i; char buf[4]; }; extern bool isbase64 (char ch) _GL_ATTRIBUTE_CONST; extern void base64_encode (const char *restrict in, size_t inlen, char *restrict out, size_t outlen); extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); extern void base64_decode_ctx_init (struct base64_decode_context *ctx); extern bool base64_decode_ctx (struct base64_decode_context *ctx, const char *restrict in, size_t inlen, char *restrict out, size_t *outlen); extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, const char *in, size_t inlen, char **out, size_t *outlen); #define base64_decode(in, inlen, out, outlen) \ base64_decode_ctx (NULL, in, inlen, out, outlen) #define base64_decode_alloc(in, inlen, out, outlen) \ base64_decode_alloc_ctx (NULL, in, inlen, out, outlen) # ifdef __cplusplus } # endif #endif /* BASE64_H */ shishi-1.0.2/gl/sys_time.in.h0000644000000000000000000001665712126660054012725 00000000000000/* Provide a more complete sys/time.h. Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Paul Eggert. */ #ifndef _@GUARD_PREFIX@_SYS_TIME_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* On Cygwin, includes itself recursively via . Simply delegate to the system's header in this case; it is a no-op. Without this extra ifdef, the C++ gettimeofday declaration below would be a forward declaration in gnulib's nested . */ #ifdef _CYGWIN_SYS_TIME_H # @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ #else /* The include_next requires a split double-inclusion guard. */ #if @HAVE_SYS_TIME_H@ # @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ #endif #ifndef _@GUARD_PREFIX@_SYS_TIME_H #define _@GUARD_PREFIX@_SYS_TIME_H #if ! @HAVE_SYS_TIME_H@ # include #endif /* On native Windows with MSVC, get the 'struct timeval' type. Also, on native Windows with a 64-bit time_t, where we are overriding the 'struct timeval' type, get all declarations of system functions whose signature contains 'struct timeval'. */ #if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #ifdef __cplusplus extern "C" { #endif #if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@ # if @REPLACE_STRUCT_TIMEVAL@ # define timeval rpl_timeval # endif # if !GNULIB_defined_struct_timeval struct timeval { time_t tv_sec; long int tv_usec; }; # define GNULIB_defined_struct_timeval 1 # endif #endif #ifdef __cplusplus } #endif #if @GNULIB_GETTIMEOFDAY@ # if @REPLACE_GETTIMEOFDAY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gettimeofday # define gettimeofday rpl_gettimeofday # endif _GL_FUNCDECL_RPL (gettimeofday, int, (struct timeval *restrict, void *restrict) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (gettimeofday, int, (struct timeval *restrict, void *restrict)); # else # if !@HAVE_GETTIMEOFDAY@ _GL_FUNCDECL_SYS (gettimeofday, int, (struct timeval *restrict, void *restrict) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on glibc systems, by default, the second argument is struct timezone *. */ _GL_CXXALIAS_SYS_CAST (gettimeofday, int, (struct timeval *restrict, void *restrict)); # endif _GL_CXXALIASWARN (gettimeofday); #elif defined GNULIB_POSIXCHECK # undef gettimeofday # if HAVE_RAW_DECL_GETTIMEOFDAY _GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - " "use gnulib module gettimeofday for portability"); # endif #endif /* Hide some function declarations from . */ #if defined _MSC_VER && @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif #endif /* _@GUARD_PREFIX@_SYS_TIME_H */ #endif /* _CYGWIN_SYS_TIME_H */ #endif /* _@GUARD_PREFIX@_SYS_TIME_H */ shishi-1.0.2/gl/m4/0000755000000000000000000000000012126773313010677 500000000000000shishi-1.0.2/gl/m4/timegm.m40000644000000000000000000000131512126660053012337 00000000000000# timegm.m4 serial 11 dnl Copyright (C) 2003, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_TIMEGM], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MKTIME]) REPLACE_TIMEGM=0 AC_CHECK_FUNCS_ONCE([timegm]) if test $ac_cv_func_timegm = yes; then if test $gl_cv_func_working_mktime = no; then # Assume that timegm is buggy if mktime is. REPLACE_TIMEGM=1 fi else HAVE_TIMEGM=0 fi ]) # Prerequisites of lib/timegm.c. AC_DEFUN([gl_PREREQ_TIMEGM], [ : ]) shishi-1.0.2/gl/m4/largefile.m40000644000000000000000000001233212126660052013007 00000000000000# Enable large files on systems where this is not the default. # Copyright 1992-1996, 1998-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # The following implementation works around a problem in autoconf <= 2.69; # AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5, # or configures them incorrectly in some cases. m4_version_prereq([2.70], [] ,[ # _AC_SYS_LARGEFILE_TEST_INCLUDES # ------------------------------- m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES], [@%:@include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ @%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]];[]dnl ]) # _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, # CACHE-VAR, # DESCRIPTION, # PROLOGUE, [FUNCTION-BODY]) # -------------------------------------------------------- m4_define([_AC_SYS_LARGEFILE_MACRO_VALUE], [AC_CACHE_CHECK([for $1 value needed for large files], [$3], [while :; do m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([$5], [$6])], [$3=no; break]) m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([@%:@define $1 $2 $5], [$6])], [$3=$2; break]) $3=unknown break done]) case $$3 in #( no | unknown) ;; *) AC_DEFINE_UNQUOTED([$1], [$$3], [$4]);; esac rm -rf conftest*[]dnl ])# _AC_SYS_LARGEFILE_MACRO_VALUE # AC_SYS_LARGEFILE # ---------------- # By default, many hosts won't let programs access large files; # one must use special compiler options to get large-file access to work. # For more details about this brain damage please see: # http://www.unix-systems.org/version2/whatsnew/lfs20mar.html AC_DEFUN([AC_SYS_LARGEFILE], [AC_ARG_ENABLE(largefile, [ --disable-largefile omit support for large files]) if test "$enable_largefile" != no; then AC_CACHE_CHECK([for special C compiler options needed for large files], ac_cv_sys_largefile_CC, [ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. AC_LANG_CONFTEST([AC_LANG_PROGRAM([_AC_SYS_LARGEFILE_TEST_INCLUDES])]) AC_COMPILE_IFELSE([], [break]) CC="$CC -n32" AC_COMPILE_IFELSE([], [ac_cv_sys_largefile_CC=' -n32'; break]) break done CC=$ac_save_CC rm -f conftest.$ac_ext fi]) if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi _AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, ac_cv_sys_file_offset_bits, [Number of bits in a file offset, on hosts where this is settable.], [_AC_SYS_LARGEFILE_TEST_INCLUDES]) if test $ac_cv_sys_file_offset_bits = unknown; then _AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1, ac_cv_sys_large_files, [Define for large files, on AIX-style hosts.], [_AC_SYS_LARGEFILE_TEST_INCLUDES]) fi AC_DEFINE([_DARWIN_USE_64_BIT_INODE], [1], [Enable large inode numbers on Mac OS X 10.5.]) fi ])# AC_SYS_LARGEFILE ])# m4_version_prereq 2.70 # Enable large files on systems where this is implemented by Gnulib, not by the # system headers. # Set the variables WINDOWS_64_BIT_OFF_T, WINDOWS_64_BIT_ST_SIZE if Gnulib # overrides ensure that off_t or 'struct size.st_size' are 64-bit, respectively. AC_DEFUN([gl_LARGEFILE], [ AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) dnl Native Windows. dnl mingw64 defines off_t to a 64-bit type already, if dnl _FILE_OFFSET_BITS=64, which is ensured by AC_SYS_LARGEFILE. AC_CACHE_CHECK([for 64-bit off_t], [gl_cv_type_off_t_64], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; ]], [[]])], [gl_cv_type_off_t_64=yes], [gl_cv_type_off_t_64=no]) ]) if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi dnl But all native Windows platforms (including mingw64) have a 32-bit dnl st_size member in 'struct stat'. WINDOWS_64_BIT_ST_SIZE=1 ;; *) dnl Nothing to do on gnulib's side. dnl A 64-bit off_t is dnl - already the default on Mac OS X, FreeBSD, NetBSD, OpenBSD, IRIX, dnl OSF/1, Cygwin, dnl - enabled by _FILE_OFFSET_BITS=64 (ensured by AC_SYS_LARGEFILE) on dnl glibc, HP-UX, Solaris, dnl - enabled by _LARGE_FILES=1 (ensured by AC_SYS_LARGEFILE) on AIX, dnl - impossible to achieve on Minix 3.1.8. WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac ]) shishi-1.0.2/gl/m4/sys_socket_h.m40000644000000000000000000001416312126660053013557 00000000000000# sys_socket_h.m4 serial 23 dnl Copyright (C) 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson. AC_DEFUN([gl_HEADER_SYS_SOCKET], [ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl On OSF/1, the functions recv(), send(), recvfrom(), sendto() have dnl old-style declarations (with return type 'int' instead of 'ssize_t') dnl unless _POSIX_PII_SOCKET is defined. case "$host_os" in osf*) AC_DEFINE([_POSIX_PII_SOCKET], [1], [Define to 1 in order to get the POSIX compatible declarations of socket functions.]) ;; esac AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_sys_socket_h_selfcontained], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [gl_cv_header_sys_socket_h_selfcontained=yes], [gl_cv_header_sys_socket_h_selfcontained=no]) ]) if test $gl_cv_header_sys_socket_h_selfcontained = yes; then dnl If the shutdown function exists, should define dnl SHUT_RD, SHUT_WR, SHUT_RDWR. AC_CHECK_FUNCS([shutdown]) if test $ac_cv_func_shutdown = yes; then AC_CACHE_CHECK([whether defines the SHUT_* macros], [gl_cv_header_sys_socket_h_shut], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])], [gl_cv_header_sys_socket_h_shut=yes], [gl_cv_header_sys_socket_h_shut=no]) ]) if test $gl_cv_header_sys_socket_h_shut = no; then SYS_SOCKET_H='sys/socket.h' fi fi fi # We need to check for ws2tcpip.h now. gl_PREREQ_SYS_H_SOCKET AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[ /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family], [], [HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0], [#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then SYS_SOCKET_H='sys/socket.h' fi gl_PREREQ_SYS_H_WINSOCK2 dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Some systems require prerequisite headers. */ #include #include ]], [socket connect accept bind getpeername getsockname getsockopt listen recv send recvfrom sendto setsockopt shutdown accept4]) ]) AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], [ dnl Check prerequisites of the replacement. AC_REQUIRE([gl_CHECK_SOCKET_HEADERS]) gl_CHECK_NEXT_HEADERS([sys/socket.h]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 HAVE_WS2TCPIP_H=0 else HAVE_SYS_SOCKET_H=0 if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi AC_SUBST([HAVE_SYS_SOCKET_H]) AC_SUBST([HAVE_WS2TCPIP_H]) ]) # Common prerequisites of the replacement and of the # replacement. # Sets and substitutes HAVE_WINSOCK2_H. AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2], [ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])]) m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])]) AC_CHECK_HEADERS_ONCE([sys/socket.h]) if test $ac_cv_header_sys_socket_h != yes; then dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make dnl the check for those headers unconditional; yet cygwin reports dnl that the headers are present but cannot be compiled (since on dnl cygwin, all socket information should come from sys/socket.h). AC_CHECK_HEADERS([winsock2.h]) fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi AC_SUBST([HAVE_WINSOCK2_H]) ]) AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], [ GNULIB_SOCKET=0; AC_SUBST([GNULIB_SOCKET]) GNULIB_CONNECT=0; AC_SUBST([GNULIB_CONNECT]) GNULIB_ACCEPT=0; AC_SUBST([GNULIB_ACCEPT]) GNULIB_BIND=0; AC_SUBST([GNULIB_BIND]) GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME]) GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME]) GNULIB_GETSOCKOPT=0; AC_SUBST([GNULIB_GETSOCKOPT]) GNULIB_LISTEN=0; AC_SUBST([GNULIB_LISTEN]) GNULIB_RECV=0; AC_SUBST([GNULIB_RECV]) GNULIB_SEND=0; AC_SUBST([GNULIB_SEND]) GNULIB_RECVFROM=0; AC_SUBST([GNULIB_RECVFROM]) GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO]) GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT]) GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN]) GNULIB_ACCEPT4=0; AC_SUBST([GNULIB_ACCEPT4]) HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE]) HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY]) HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T]) HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4]) ]) shishi-1.0.2/gl/m4/gc.m40000644000000000000000000000137112126660052011447 00000000000000# gc.m4 serial 9 dnl Copyright (C) 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC], [ AC_ARG_WITH([libgcrypt], AS_HELP_STRING([--with-libgcrypt], [use libgcrypt for low-level crypto]), libgcrypt=$withval, libgcrypt=no) if test "$libgcrypt" != no; then AC_LIB_HAVE_LINKFLAGS([gcrypt], [gpg-error], [ #include /* GCRY_MODULE_ID_USER was added in 1.4.4 and gc-libgcrypt.c will fail on startup if we don't have 1.4.4 or later, so test for it early. */ #if !defined GCRY_MODULE_ID_USER error too old libgcrypt #endif ]) fi ]) shishi-1.0.2/gl/m4/mmap-anon.m40000644000000000000000000000373312126660052012745 00000000000000# mmap-anon.m4 serial 10 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Detect how mmap can be used to create anonymous (not file-backed) memory # mappings. # - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS # and MAP_ANON exist and have the same value. # - On HP-UX, only MAP_ANONYMOUS exists. # - On Mac OS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists. # - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be # used. AC_DEFUN([gl_FUNC_MMAP_ANON], [ dnl Persuade glibc to define MAP_ANONYMOUS. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no]) # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then AC_MSG_CHECKING([for MAP_ANONYMOUS]) AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif ], [gl_have_mmap_anonymous=yes]) if test $gl_have_mmap_anonymous != yes; then AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANON I cannot identify this map #endif ], [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON], [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.]) gl_have_mmap_anonymous=yes]) fi AC_MSG_RESULT([$gl_have_mmap_anonymous]) if test $gl_have_mmap_anonymous = yes; then AC_DEFINE([HAVE_MAP_ANONYMOUS], [1], [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including config.h and .]) fi fi ]) shishi-1.0.2/gl/m4/memchr.m40000644000000000000000000000534012126660052012331 00000000000000# memchr.m4 serial 12 dnl Copyright (C) 2002-2004, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_FUNC_MEMCHR], [ dnl Check for prerequisites for memory fence checks. gl_FUNC_MMAP_ANON AC_CHECK_HEADERS_ONCE([sys/mman.h]) AC_CHECK_FUNCS_ONCE([mprotect]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) m4_ifdef([gl_FUNC_MEMCHR_OBSOLETE], [ dnl These days, we assume memchr is present. But if support for old dnl platforms is desired: AC_CHECK_FUNCS_ONCE([memchr]) if test $ac_cv_func_memchr = no; then HAVE_MEMCHR=0 fi ]) if test $HAVE_MEMCHR = 1; then # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # http://bugzilla.redhat.com/499689 # memchr should not dereference overestimated length after a match # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # http://sourceware.org/bugzilla/show_bug.cgi?id=10162 # Assume that memchr works on platforms that lack mprotect. AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif ]], [[ int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; } return result; ]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no], [dnl Be pessimistic for now. gl_cv_func_memchr_works="guessing no"])]) if test "$gl_cv_func_memchr_works" != yes; then REPLACE_MEMCHR=1 fi fi ]) # Prerequisites of lib/memchr.c. AC_DEFUN([gl_PREREQ_MEMCHR], [ AC_CHECK_HEADERS([bp-sym.h]) ]) shishi-1.0.2/gl/m4/getdelim.m40000644000000000000000000000471412126660052012654 00000000000000# getdelim.m4 serial 10 dnl Copyright (C) 2005-2007, 2009-2013 Free Software Foundation, Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) AC_DEFUN([gl_FUNC_GETDELIM], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) dnl Persuade glibc to declare getdelim(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getdelim]) AC_CHECK_FUNCS_ONCE([getdelim]) if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 dnl Found it in some library. Verify that it works. AC_CACHE_CHECK([for working getdelim function], [gl_cv_func_working_getdelim], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) return 2; } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) return 3; } return 0; } ]])], [gl_cv_func_working_getdelim=yes] dnl The library version works. , [gl_cv_func_working_getdelim=no] dnl The library version does NOT work. , dnl We're cross compiling. Assume it works on glibc2 systems. [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [gl_cv_func_working_getdelim="guessing yes"], [gl_cv_func_working_getdelim="guessing no"])] )]) case "$gl_cv_func_working_getdelim" in *no) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi ]) # Prerequisites of lib/getdelim.c. AC_DEFUN([gl_PREREQ_GETDELIM], [ AC_CHECK_FUNCS([flockfile funlockfile]) AC_CHECK_DECLS([getc_unlocked]) ]) shishi-1.0.2/gl/m4/md4.m40000644000000000000000000000056412126660052011545 00000000000000# md4.m4 serial 7 dnl Copyright (C) 2002-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites of lib/md4.c. AC_DEFUN([gl_MD4], [ AC_REQUIRE([gl_BIGENDIAN]) : ]) shishi-1.0.2/gl/m4/gc-hmac-sha1.m40000644000000000000000000000064512126660052013212 00000000000000# gc-hmac-sha1.m4 serial 3 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_HMAC_SHA1], [ AC_REQUIRE([gl_GC]) if test "$ac_cv_libgcrypt" != yes; then gl_SHA1 gl_MEMXOR fi ]) shishi-1.0.2/gl/m4/strverscmp.m40000644000000000000000000000120612126660053013264 00000000000000# strverscmp.m4 serial 8 dnl Copyright (C) 2002, 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRVERSCMP], [ dnl Persuade glibc to declare strverscmp(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([strverscmp]) if test $ac_cv_func_strverscmp = no; then HAVE_STRVERSCMP=0 fi ]) # Prerequisites of lib/strverscmp.c. AC_DEFUN([gl_PREREQ_STRVERSCMP], [ : ]) shishi-1.0.2/gl/m4/strtok_r.m40000644000000000000000000000475712126660052012740 00000000000000# strtok_r.m4 serial 13 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRTOK_R], [ dnl The strtok_r() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_FUNCS([strtok_r]) if test $ac_cv_func_strtok_r = yes; then HAVE_STRTOK_R=1 dnl glibc 2.7 has a bug in strtok_r that causes a segmentation fault dnl when the second argument to strtok_r is a constant string that has dnl exactly one byte and compiling with optimization. This bug is, for dnl example, present in the glibc 2.7-18 package in Debian "lenny". dnl See . AC_CACHE_CHECK([whether strtok_r works], [gl_cv_func_strtok_r_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #ifndef __OPTIMIZE__ # define __OPTIMIZE__ 1 #endif #undef __OPTIMIZE_SIZE__ #undef __NO_INLINE__ #include #include ]], [[static const char dummy[] = "\177\01a"; char delimiters[] = "xxxxxxxx"; char *save_ptr = (char *) dummy; strtok_r (delimiters, "x", &save_ptr); strtok_r (NULL, "x", &save_ptr); return 0; ]]) ], [gl_cv_func_strtok_r_works=yes], [gl_cv_func_strtok_r_works=no], [ changequote(,)dnl case "$host_os" in # Guess no on glibc systems. *-gnu*) gl_cv_func_strtok_r_works="guessing no";; *) gl_cv_func_strtok_r_works="guessing yes";; esac changequote([,])dnl ]) ]) case "$gl_cv_func_strtok_r_works" in *no) dnl We could set REPLACE_STRTOK_R=1 here, but it's only the macro dnl version in which is wrong. The code compiled dnl into libc is fine. UNDEFINE_STRTOK_R=1 ;; esac else HAVE_STRTOK_R=0 fi AC_CHECK_DECLS_ONCE([strtok_r]) if test $ac_cv_have_decl_strtok_r = no; then HAVE_DECL_STRTOK_R=0 fi ]) # Prerequisites of lib/strtok_r.c. AC_DEFUN([gl_PREREQ_STRTOK_R], [ : ]) shishi-1.0.2/gl/m4/parse-datetime.m40000644000000000000000000000406712126660052013767 00000000000000# parse-datetime.m4 serial 21 dnl Copyright (C) 2002-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Define HAVE_COMPOUND_LITERALS if the C compiler supports compound literals dnl as in ISO C99. dnl Note that compound literals such as (struct s) { 3, 4 } can be used for dnl initialization of stack-allocated variables, but are not constant dnl expressions and therefore cannot be used as initializer for global or dnl static variables (even though gcc supports this in pre-C99 mode). AC_DEFUN([gl_C_COMPOUND_LITERALS], [ AC_CACHE_CHECK([for compound literals], [gl_cv_compound_literals], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[struct s { int i, j; };]], [[struct s t = (struct s) { 3, 4 }; if (t.i != 0) return 0;]])], gl_cv_compound_literals=yes, gl_cv_compound_literals=no)]) if test $gl_cv_compound_literals = yes; then AC_DEFINE([HAVE_COMPOUND_LITERALS], [1], [Define if you have compound literals.]) fi ]) AC_DEFUN([gl_PARSE_DATETIME], [ dnl Prerequisites of lib/parse-datetime.h. AC_REQUIRE([AM_STDBOOL_H]) AC_REQUIRE([gl_TIMESPEC]) dnl Prerequisites of lib/parse-datetime.y. AC_REQUIRE([gl_BISON]) AC_REQUIRE([gl_C_COMPOUND_LITERALS]) AC_STRUCT_TIMEZONE AC_REQUIRE([gl_CLOCK_TIME]) AC_REQUIRE([gl_TM_GMTOFF]) AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[ #include /* for time_t */ #include /* for CHAR_BIT, LONG_MIN, LONG_MAX */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) typedef int verify_min[2 * (LONG_MIN <= TYPE_MINIMUM (time_t)) - 1]; typedef int verify_max[2 * (TYPE_MAXIMUM (time_t) <= LONG_MAX) - 1]; ]])], [AC_DEFINE([TIME_T_FITS_IN_LONG_INT], [1], [Define to 1 if all 'time_t' values fit in a 'long int'.]) ]) ]) shishi-1.0.2/gl/m4/strings_h.m40000644000000000000000000000316312126660052013057 00000000000000# Configure a replacement for . # serial 6 # Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_STRINGS_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_STRINGS_H_BODY]) ]) AC_DEFUN([gl_HEADER_STRINGS_H_BODY], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([strings.h]) if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi AC_SUBST([HAVE_STRINGS_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Minix 3.1.8 has a bug: must be included before . */ #include #include ]], [ffs strcasecmp strncasecmp]) ]) AC_DEFUN([gl_STRINGS_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS], [ GNULIB_FFS=0; AC_SUBST([GNULIB_FFS]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FFS=1; AC_SUBST([HAVE_FFS]) HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP]) HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP]) ]) shishi-1.0.2/gl/m4/strerror.m40000644000000000000000000000623612126660052012745 00000000000000# strerror.m4 serial 17 dnl Copyright (C) 2002, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRERROR], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS]) ]) if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then AC_CACHE_CHECK([for working strerror function], [gl_cv_func_working_strerror], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[if (!*strerror (-2)) return 1;]])], [gl_cv_func_working_strerror=yes], [gl_cv_func_working_strerror=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_working_strerror="guessing no" ;; esac ]) ]) case "$gl_cv_func_working_strerror" in *yes) ;; *) dnl The system's strerror() fails to return a string for out-of-range dnl integers. Replace it. REPLACE_STRERROR=1 ;; esac m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's dnl buffer, we must replace strerror. case "$gl_cv_func_strerror_r_works" in *no) REPLACE_STRERROR=1 ;; esac ]) else dnl The system's strerror() cannot know about the new errno values we add dnl to , or any fix for strerror(0). Replace it. REPLACE_STRERROR=1 fi ]) dnl Detect if strerror(0) passes (that is, does not set errno, and does not dnl return a string that matches strerror(-1)). AC_DEFUN([gl_FUNC_STRERROR_0], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles REPLACE_STRERROR_0=0 AC_CACHE_CHECK([whether strerror(0) succeeds], [gl_cv_func_strerror_0_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result;]])], [gl_cv_func_strerror_0_works=yes], [gl_cv_func_strerror_0_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_strerror_0_works="guessing no" ;; esac ]) ]) case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0) does not return a message implying success.]) ;; esac ]) shishi-1.0.2/gl/m4/getline.m40000644000000000000000000000563712126660052012516 00000000000000# getline.m4 serial 26 dnl Copyright (C) 1998-2003, 2005-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) dnl See if there's a working, system-supplied version of the getline function. dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems dnl have a function by that name in -linet that doesn't have anything dnl to do with the function we need. AC_DEFUN([gl_FUNC_GETLINE], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) dnl Persuade glibc to declare getline(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getline]) gl_getline_needs_run_time_check=no AC_CHECK_FUNC([getline], [dnl Found it in some library. Verify that it works. gl_getline_needs_run_time_check=yes], [am_cv_func_working_getline=no]) if test $gl_getline_needs_run_time_check = yes; then AC_CACHE_CHECK([for working getline function], [am_cv_func_working_getline], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) return 2; } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) return 3; } return 0; } ]])], [am_cv_func_working_getline=yes] dnl The library version works. , [am_cv_func_working_getline=no] dnl The library version does NOT work. , dnl We're cross compiling. Assume it works on glibc2 systems. [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [am_cv_func_working_getline="guessing yes"], [am_cv_func_working_getline="guessing no"])] )]) fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *no) dnl Set REPLACE_GETLINE always: Even if we have not found the broken dnl getline function among $LIBS, it may exist in libinet and the dnl executable may be linked with -linet. REPLACE_GETLINE=1 ;; esac ]) # Prerequisites of lib/getline.c. AC_DEFUN([gl_PREREQ_GETLINE], [ : ]) shishi-1.0.2/gl/m4/pathmax.m40000644000000000000000000000220412126660052012514 00000000000000# pathmax.m4 serial 10 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_PATHMAX], [ dnl Prerequisites of lib/pathmax.h. AC_CHECK_HEADERS_ONCE([sys/param.h]) ]) # Expands to a piece of C program that defines PATH_MAX in the same way as # "pathmax.h" will do. AC_DEFUN([gl_PATHMAX_SNIPPET], [[ /* Arrange to define PATH_MAX, like "pathmax.h" does. */ #if HAVE_UNISTD_H # include #endif #include #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifdef __hpux # undef PATH_MAX # define PATH_MAX 1024 #endif #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # undef PATH_MAX # define PATH_MAX 260 #endif ]]) # Prerequisites of gl_PATHMAX_SNIPPET. AC_DEFUN([gl_PATHMAX_SNIPPET_PREREQ], [ AC_CHECK_HEADERS_ONCE([unistd.h sys/param.h]) ]) shishi-1.0.2/gl/m4/stddef_h.m40000644000000000000000000000275512126660052012645 00000000000000dnl A placeholder for POSIX 2008 , for platforms that have issues. # stddef_h.m4 serial 4 dnl Copyright (C) 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDDEF_H], [ AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) AC_REQUIRE([gt_TYPE_WCHAR_T]) STDDEF_H= if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 STDDEF_H=stddef.h fi AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions], [gl_cv_decl_null_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include int test[2 * (sizeof NULL == sizeof (void *)) -1]; ]])], [gl_cv_decl_null_works=yes], [gl_cv_decl_null_works=no])]) if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 STDDEF_H=stddef.h fi AC_SUBST([STDDEF_H]) AM_CONDITIONAL([GL_GENERATE_STDDEF_H], [test -n "$STDDEF_H"]) if test -n "$STDDEF_H"; then gl_NEXT_HEADERS([stddef.h]) fi ]) AC_DEFUN([gl_STDDEF_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_STDDEF_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. REPLACE_NULL=0; AC_SUBST([REPLACE_NULL]) HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T]) ]) shishi-1.0.2/gl/m4/gc-random.m40000644000000000000000000000646412126660052012735 00000000000000# gc-random.m4 serial 6 dnl Copyright (C) 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_RANDOM], [ # Devices with randomness. # FIXME: Are these the best defaults? AC_REQUIRE([AC_CANONICAL_HOST])dnl case "$host_os" in *openbsd* | *mirbsd*) NAME_OF_RANDOM_DEVICE="/dev/srandom" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/prandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; *netbsd*) NAME_OF_RANDOM_DEVICE="/dev/srandom" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; *solaris* | *irix* | *dec-osf* ) NAME_OF_RANDOM_DEVICE="/dev/random" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/random" NAME_OF_NONCE_DEVICE="/dev/random" ;; *) NAME_OF_RANDOM_DEVICE="/dev/random" NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom" NAME_OF_NONCE_DEVICE="/dev/urandom" ;; esac AC_MSG_CHECKING([device with (strong) random data...]) AC_ARG_ENABLE([random-device], AS_HELP_STRING([--enable-random-device], [device with (strong) randomness (for Nettle)]), NAME_OF_RANDOM_DEVICE=$enableval) AC_MSG_RESULT([$NAME_OF_RANDOM_DEVICE]) AC_MSG_CHECKING([device with pseudo random data...]) AC_ARG_ENABLE([pseudo-random-device], AS_HELP_STRING([--enable-pseudo-random-device], [device with pseudo randomness (for Nettle)]), NAME_OF_PSEUDO_RANDOM_DEVICE=$enableval) AC_MSG_RESULT([$NAME_OF_PSEUDO_RANDOM_DEVICE]) AC_MSG_CHECKING([device with unpredictable data for nonces...]) AC_ARG_ENABLE([nonce-device], AS_HELP_STRING([--enable-nonce-device], [device with unpredictable nonces (for Nettle)]), NAME_OF_NONCE_DEVICE=$enableval) AC_MSG_RESULT([$NAME_OF_NONCE_DEVICE]) if test "$cross_compiling" != yes; then if test "$NAME_OF_RANDOM_DEVICE" != "no"; then AC_CHECK_FILE([$NAME_OF_RANDOM_DEVICE],, AC_MSG_WARN([[Device '$NAME_OF_RANDOM_DEVICE' does not exist, consider to use --enable-random-device]])) fi if test "$NAME_OF_PSEUDO_RANDOM_DEVICE" != "no"; then AC_CHECK_FILE([$NAME_OF_PSEUDO_RANDOM_DEVICE],, AC_MSG_WARN([[Device '$NAME_OF_PSEUDO_RANDOM_DEVICE' does not exist, consider to use --enable-pseudo-random-device]])) fi if test "$NAME_OF_NONCE_DEVICE" != "no"; then AC_CHECK_FILE([$NAME_OF_NONCE_DEVICE],, AC_MSG_WARN([[Device '$NAME_OF_NONCE_DEVICE' does not exist, consider to use --enable-nonce-device]])) fi else AC_MSG_NOTICE([[Cross compiling, assuming random devices exists on the target host...]]) fi # FIXME?: Open+read 42 bytes+close twice and compare data. Should differ. AC_DEFINE_UNQUOTED([NAME_OF_RANDOM_DEVICE], ["$NAME_OF_RANDOM_DEVICE"], [defined to the name of the (strong) random device]) AC_DEFINE_UNQUOTED([NAME_OF_PSEUDO_RANDOM_DEVICE], "$NAME_OF_PSEUDO_RANDOM_DEVICE", [defined to the name of the pseudo random device]) AC_DEFINE_UNQUOTED([NAME_OF_NONCE_DEVICE], ["$NAME_OF_NONCE_DEVICE"], [defined to the name of the unpredictable nonce device]) ]) shishi-1.0.2/gl/m4/strndup.m40000644000000000000000000000321712126660052012556 00000000000000# strndup.m4 serial 21 dnl Copyright (C) 2002-2003, 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNDUP], [ dnl Persuade glibc to declare strndup(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([strndup]) AC_CHECK_FUNCS_ONCE([strndup]) if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM([[#include #include ]], [[ #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); return s[13] != '\0';]])], [gl_cv_func_strndup_works=yes], [gl_cv_func_strndup_works=no], [ changequote(,)dnl case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac changequote([,])dnl ])]) case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi ]) shishi-1.0.2/gl/m4/close.m40000644000000000000000000000214612126660052012164 00000000000000# close.m4 serial 8 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_CLOSE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [ gl_PREREQ_SYS_H_WINSOCK2 if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then dnl Even if the 'socket' module is not used here, another part of the dnl application may use it and pass file descriptors that refer to dnl sockets to the close() function. So enable the support for sockets. REPLACE_CLOSE=1 fi ]) dnl Replace close() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ if test $REPLACE_CLOSE = 0; then gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_CLOSE=1 fi fi ]) ]) shishi-1.0.2/gl/m4/vasprintf.m40000644000000000000000000000210012126660053013062 00000000000000# vasprintf.m4 serial 6 dnl Copyright (C) 2002-2003, 2006-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASPRINTF], [ AC_CHECK_FUNCS([vasprintf]) if test $ac_cv_func_vasprintf = no; then gl_REPLACE_VASPRINTF fi ]) AC_DEFUN([gl_REPLACE_VASPRINTF], [ AC_LIBOBJ([vasprintf]) AC_LIBOBJ([asprintf]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) if test $ac_cv_func_vasprintf = yes; then REPLACE_VASPRINTF=1 else HAVE_VASPRINTF=0 fi gl_PREREQ_VASPRINTF_H gl_PREREQ_VASPRINTF gl_PREREQ_ASPRINTF ]) # Prerequisites of the vasprintf portion of lib/stdio.h. AC_DEFUN([gl_PREREQ_VASPRINTF_H], [ dnl Persuade glibc to declare asprintf() and vasprintf(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) ]) # Prerequisites of lib/vasprintf.c. AC_DEFUN([gl_PREREQ_VASPRINTF], [ ]) # Prerequisites of lib/asprintf.c. AC_DEFUN([gl_PREREQ_ASPRINTF], [ ]) shishi-1.0.2/gl/m4/strchrnul.m40000644000000000000000000000276612126660052013113 00000000000000# strchrnul.m4 serial 9 dnl Copyright (C) 2003, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRCHRNUL], [ dnl Persuade glibc to declare strchrnul(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([strchrnul]) if test $ac_cv_func_strchrnul = no; then HAVE_STRCHRNUL=0 else AC_CACHE_CHECK([whether strchrnul works], [gl_cv_func_strchrnul_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include /* for strchrnul */ ]], [[const char *buf = "a"; return strchrnul (buf, 'b') != buf + 1; ]])], [gl_cv_func_strchrnul_works=yes], [gl_cv_func_strchrnul_works=no], [dnl Cygwin 1.7.9 introduced strchrnul, but it was broken until 1.7.10 AC_EGREP_CPP([Lucky user], [ #if defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9) Lucky user #endif #else Lucky user #endif ], [gl_cv_func_strchrnul_works="guessing yes"], [gl_cv_func_strchrnul_works="guessing no"]) ]) ]) case "$gl_cv_func_strchrnul_works" in *yes) ;; *) REPLACE_STRCHRNUL=1 ;; esac fi ]) # Prerequisites of lib/strchrnul.c. AC_DEFUN([gl_PREREQ_STRCHRNUL], [:]) shishi-1.0.2/gl/m4/time_h.m40000644000000000000000000001020612126660053012321 00000000000000# Configure a more-standard replacement for . # Copyright (C) 2000-2001, 2003-2007, 2009-2013 Free Software Foundation, Inc. # serial 7 # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Jim Meyering. AC_DEFUN([gl_HEADER_TIME_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_TIME_H_BODY]) ]) AC_DEFUN([gl_HEADER_TIME_H_BODY], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) gl_NEXT_HEADERS([time.h]) AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) ]) dnl Check whether 'struct timespec' is declared dnl in time.h, sys/time.h, or pthread.h. AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], [ AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_time_h=yes], [gl_cv_sys_struct_timespec_in_time_h=no])]) TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_sys_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_sys_time_h=yes], [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_pthread_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_pthread_h=yes], [gl_cv_sys_struct_timespec_in_pthread_h=no])]) if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC]) ]) AC_DEFUN([gl_TIME_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS], [ GNULIB_MKTIME=0; AC_SUBST([GNULIB_MKTIME]) GNULIB_NANOSLEEP=0; AC_SUBST([GNULIB_NANOSLEEP]) GNULIB_STRPTIME=0; AC_SUBST([GNULIB_STRPTIME]) GNULIB_TIMEGM=0; AC_SUBST([GNULIB_TIMEGM]) GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R]) HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) dnl If another module says to replace or to not replace, do that. dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; dnl this lets maintainers check for portability. REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) ]) shishi-1.0.2/gl/m4/gc-hmac-md5.m40000644000000000000000000000064212126660052013040 00000000000000# gc-hmac-md5.m4 serial 3 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_HMAC_MD5], [ AC_REQUIRE([gl_GC]) if test "$ac_cv_libgcrypt" != yes; then gl_MD5 gl_MEMXOR fi ]) shishi-1.0.2/gl/m4/getdtablesize.m40000644000000000000000000000105612126660052013704 00000000000000# getdtablesize.m4 serial 4 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_GETDTABLESIZE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([getdtablesize]) if test $ac_cv_func_getdtablesize != yes; then HAVE_GETDTABLESIZE=0 fi ]) # Prerequisites of lib/getdtablesize.c. AC_DEFUN([gl_PREREQ_GETDTABLESIZE], [:]) shishi-1.0.2/gl/m4/clock_time.m40000644000000000000000000000252012126660052013164 00000000000000# clock_time.m4 serial 10 dnl Copyright (C) 2002-2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Check for clock_gettime and clock_settime, and set LIB_CLOCK_GETTIME. # For a program named, say foo, you should add a line like the following # in the corresponding Makefile.am file: # foo_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) AC_DEFUN([gl_CLOCK_TIME], [ dnl Persuade glibc and Solaris to declare these functions. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all* # programs in the package would end up linked with that potentially-shared # library, inducing unnecessary run-time overhead. LIB_CLOCK_GETTIME= AC_SUBST([LIB_CLOCK_GETTIME]) gl_saved_libs=$LIBS AC_SEARCH_LIBS([clock_gettime], [rt posix4], [test "$ac_cv_search_clock_gettime" = "none required" || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime]) AC_CHECK_FUNCS([clock_gettime clock_settime]) LIBS=$gl_saved_libs ]) shishi-1.0.2/gl/m4/environ.m40000644000000000000000000000261612126660052012541 00000000000000# environ.m4 serial 6 dnl Copyright (C) 2001-2004, 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_ENVIRON], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl Persuade glibc to declare environ. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([unistd.h]) gt_CHECK_VAR_DECL( [#if HAVE_UNISTD_H #include #endif /* mingw, BeOS, Haiku declare environ in , not in . */ #include ], [environ]) if test $gt_cv_var_environ_declaration != yes; then HAVE_DECL_ENVIRON=0 fi ]) # Check if a variable is properly declared. # gt_CHECK_VAR_DECL(includes,variable) AC_DEFUN([gt_CHECK_VAR_DECL], [ define([gt_cv_var], [gt_cv_var_]$2[_declaration]) AC_MSG_CHECKING([if $2 is properly declared]) AC_CACHE_VAL([gt_cv_var], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[$1 extern struct { int foo; } $2;]], [[$2.foo = 1;]])], [gt_cv_var=no], [gt_cv_var=yes])]) AC_MSG_RESULT([$gt_cv_var]) if test $gt_cv_var = yes; then AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1, [Define if you have the declaration of $2.]) fi undefine([gt_cv_var]) ]) shishi-1.0.2/gl/m4/gnulib-cache.m40000644000000000000000000000650112126660065013403 00000000000000# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the specification of how gnulib-tool is used. # It acts as a cache: It is written and read by gnulib-tool. # In projects that use version control, this file is meant to be put under # version control, like the configure.ac and various Makefile.am files. # Specification in the form of a command-line invocation: # gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --avoid=xalloc-die --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files arpa_inet autobuild base64 bind close connect crc crypto/arcfour crypto/gc-des crypto/gc-hmac-md5 crypto/gc-hmac-sha1 crypto/gc-md4 crypto/gc-md5 crypto/gc-pbkdf2-sha1 crypto/gc-random fcntl fdl-1.3 gendocs getaddrinfo getline getpass getsubopt gnupload lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings minmax netinet_in parse-datetime pmccabe2html read-file recvfrom select sendto shutdown signal socket sockets socklen stat stdint strcase strerror strndup strtok_r strverscmp sys_select sys_socket sys_stat sys_time time timegm unistd update-copyright valgrind-tests vasnprintf vasprintf warnings xalloc xgetdomainname xgethostname xstrndup xvasprintf # Specification in the form of a few gnulib-tool.m4 macro invocations: gl_LOCAL_DIR([gl/override]) gl_MODULES([ arpa_inet autobuild base64 bind close connect crc crypto/arcfour crypto/gc-des crypto/gc-hmac-md5 crypto/gc-hmac-sha1 crypto/gc-md4 crypto/gc-md5 crypto/gc-pbkdf2-sha1 crypto/gc-random fcntl fdl-1.3 gendocs getaddrinfo getline getpass getsubopt gnupload lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings minmax netinet_in parse-datetime pmccabe2html read-file recvfrom select sendto shutdown signal socket sockets socklen stat stdint strcase strerror strndup strtok_r strverscmp sys_select sys_socket sys_stat sys_time time timegm unistd update-copyright valgrind-tests vasnprintf vasprintf warnings xalloc xgetdomainname xgethostname xstrndup xvasprintf ]) gl_AVOID([xalloc-die]) gl_SOURCE_BASE([gl]) gl_M4_BASE([gl/m4]) gl_PO_BASE([]) gl_DOC_BASE([doc]) gl_TESTS_BASE([gl/tests]) gl_LIB([libgnu]) gl_MAKEFILE_NAME([]) gl_LIBTOOL gl_MACRO_PREFIX([gl]) gl_PO_DOMAIN([]) gl_WITNESS_C_MACRO([]) gl_VC_FILES([false]) shishi-1.0.2/gl/m4/stdlib_h.m40000644000000000000000000001310112126660052012640 00000000000000# stdlib_h.m4 serial 42 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDLIB_H], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_NEXT_HEADERS([stdlib.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include #if HAVE_SYS_LOADAVG_H # include #endif #if HAVE_RANDOM_H # include #endif ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt initstate initstate_r mkdtemp mkostemp mkostemps mkstemp mkstemps posix_openpt ptsname ptsname_r random random_r realpath rpmatch secure_getenv setenv setstate setstate_r srandom srandom_r strtod strtoll strtoull unlockpt unsetenv]) ]) AC_DEFUN([gl_STDLIB_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_STDLIB_H_DEFAULTS], [ GNULIB__EXIT=0; AC_SUBST([GNULIB__EXIT]) GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL]) GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME]) GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG]) GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) GNULIB_GRANTPT=0; AC_SUBST([GNULIB_GRANTPT]) GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX]) GNULIB_MBTOWC=0; AC_SUBST([GNULIB_MBTOWC]) GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP]) GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS]) GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS]) GNULIB_POSIX_OPENPT=0; AC_SUBST([GNULIB_POSIX_OPENPT]) GNULIB_PTSNAME=0; AC_SUBST([GNULIB_PTSNAME]) GNULIB_PTSNAME_R=0; AC_SUBST([GNULIB_PTSNAME_R]) GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV]) GNULIB_RANDOM=0; AC_SUBST([GNULIB_RANDOM]) GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R]) GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) GNULIB_REALPATH=0; AC_SUBST([GNULIB_REALPATH]) GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH]) GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV]) GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV]) GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD]) GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL]) GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL]) GNULIB_SYSTEM_POSIX=0; AC_SUBST([GNULIB_SYSTEM_POSIX]) GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT]) GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) GNULIB_WCTOMB=0; AC_SUBST([GNULIB_WCTOMB]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE__EXIT=1; AC_SUBST([HAVE__EXIT]) HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME]) HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT]) HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP]) HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS]) HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP]) HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS]) HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT]) HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME]) HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R]) HAVE_RANDOM=1; AC_SUBST([HAVE_RANDOM]) HAVE_RANDOM_H=1; AC_SUBST([HAVE_RANDOM_H]) HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH]) HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) HAVE_SECURE_GETENV=1; AC_SUBST([HAVE_SECURE_GETENV]) HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) HAVE_DECL_SETENV=1; AC_SUBST([HAVE_DECL_SETENV]) HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL]) HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL]) HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA]) HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT]) HAVE_DECL_UNSETENV=1; AC_SUBST([HAVE_DECL_UNSETENV]) REPLACE_CALLOC=0; AC_SUBST([REPLACE_CALLOC]) REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME]) REPLACE_MALLOC=0; AC_SUBST([REPLACE_MALLOC]) REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC]) REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME]) REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R]) REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) REPLACE_RANDOM_R=0; AC_SUBST([REPLACE_RANDOM_R]) REPLACE_REALLOC=0; AC_SUBST([REPLACE_REALLOC]) REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH]) REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV]) REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV]) REPLACE_WCTOMB=0; AC_SUBST([REPLACE_WCTOMB]) ]) shishi-1.0.2/gl/m4/autobuild.m40000644000000000000000000000201012126660051013034 00000000000000# autobuild.m4 serial 7 dnl Copyright (C) 2004, 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # Usage: AB_INIT([MODE]). AC_DEFUN([AB_INIT], [ AC_REQUIRE([AC_CANONICAL_BUILD]) AC_REQUIRE([AC_CANONICAL_HOST]) if test -z "$AB_PACKAGE"; then AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE} fi AC_MSG_NOTICE([autobuild project... $AB_PACKAGE]) if test -z "$AB_VERSION"; then AB_VERSION=${PACKAGE_VERSION:-$VERSION} fi AC_MSG_NOTICE([autobuild revision... $AB_VERSION]) hostname=`hostname` if test "$hostname"; then AC_MSG_NOTICE([autobuild hostname... $hostname]) fi ifelse([$1],[],,[AC_MSG_NOTICE([autobuild mode... $1])]) date=`TZ=UTC0 date +%Y%m%dT%H%M%SZ` if test "$?" != 0; then date=`date` fi if test "$date"; then AC_MSG_NOTICE([autobuild timestamp... $date]) fi ]) shishi-1.0.2/gl/m4/fseeko.m40000644000000000000000000000435512126660052012337 00000000000000# fseeko.m4 serial 16 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSEEKO], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_STDIN_LARGE_OFFSET]) AC_REQUIRE([gl_SYS_TYPES_H]) AC_REQUIRE([AC_PROG_CC]) dnl Persuade glibc to declare fseeko(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [fseeko (stdin, 0, 0);])], [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no]) ]) AC_CHECK_DECLS_ONCE([fseeko]) if test $ac_cv_have_decl_fseeko = no; then HAVE_DECL_FSEEKO=0 fi if test $gl_cv_func_fseeko = no; then HAVE_FSEEKO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FSEEKO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FSEEKO=1 fi m4_ifdef([gl_FUNC_FFLUSH_STDIN], [ gl_FUNC_FFLUSH_STDIN if test $gl_cv_func_fflush_stdin = no; then REPLACE_FSEEKO=1 fi ]) fi ]) dnl Code shared by fseeko and ftello. Determine if large files are supported, dnl but stdin does not start as a large file by default. AC_DEFUN([gl_STDIN_LARGE_OFFSET], [ AC_CACHE_CHECK([whether stdin defaults to large file offsets], [gl_cv_var_stdin_large_offset], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[#if defined __SL64 && defined __SCLE /* cygwin */ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and it is easier to do a version check than building a runtime test. */ # include # if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) choke me # endif #endif]])], [gl_cv_var_stdin_large_offset=yes], [gl_cv_var_stdin_large_offset=no])]) ]) # Prerequisites of lib/fseeko.c. AC_DEFUN([gl_PREREQ_FSEEKO], [ dnl Native Windows has the function _fseeki64. mingw hides it, but mingw64 dnl makes it usable again. AC_CHECK_FUNCS([_fseeki64]) ]) shishi-1.0.2/gl/m4/stdio_h.m40000644000000000000000000002243312126660052012511 00000000000000# stdio_h.m4 serial 43 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDIO_H], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_NEXT_HEADERS([stdio.h]) dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. GNULIB_FSCANF=1 gl_MODULE_INDICATOR([fscanf]) GNULIB_SCANF=1 gl_MODULE_INDICATOR([scanf]) GNULIB_FGETC=1 GNULIB_GETC=1 GNULIB_GETCHAR=1 GNULIB_FGETS=1 GNULIB_FREAD=1 dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING dnl or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_READ_FUNCS=1 AC_LIBOBJ([stdio-read]) fi ]) dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. GNULIB_FPRINTF=1 GNULIB_PRINTF=1 GNULIB_VFPRINTF=1 GNULIB_VPRINTF=1 GNULIB_FPUTC=1 GNULIB_PUTC=1 GNULIB_PUTCHAR=1 GNULIB_FPUTS=1 GNULIB_PUTS=1 GNULIB_FWRITE=1 dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or dnl GNULIB_SIGPIPE redundant. m4_ifdef([gl_SIGNAL_SIGPIPE], [ gl_SIGNAL_SIGPIPE if test $gl_cv_header_signal_h_SIGPIPE != yes; then REPLACE_STDIO_WRITE_FUNCS=1 AC_LIBOBJ([stdio-write]) fi ]) dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c" dnl "expected source file, required through AC_LIBSOURCES, not found". It is dnl also an optimization, to avoid performing a configure check whose result dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING dnl or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_WRITE_FUNCS=1 AC_LIBOBJ([stdio-write]) fi ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by both C89 and C11. gl_WARN_ON_USE_PREPARE([[#include ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen renameat snprintf tmpfile vdprintf vsnprintf]) ]) AC_DEFUN([gl_STDIO_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_STDIO_H_DEFAULTS], [ GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF]) GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE]) GNULIB_FDOPEN=0; AC_SUBST([GNULIB_FDOPEN]) GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH]) GNULIB_FGETC=0; AC_SUBST([GNULIB_FGETC]) GNULIB_FGETS=0; AC_SUBST([GNULIB_FGETS]) GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN]) GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF]) GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX]) GNULIB_FPURGE=0; AC_SUBST([GNULIB_FPURGE]) GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC]) GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS]) GNULIB_FREAD=0; AC_SUBST([GNULIB_FREAD]) GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN]) GNULIB_FSCANF=0; AC_SUBST([GNULIB_FSCANF]) GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK]) GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO]) GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL]) GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO]) GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE]) GNULIB_GETC=0; AC_SUBST([GNULIB_GETC]) GNULIB_GETCHAR=0; AC_SUBST([GNULIB_GETCHAR]) GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM]) GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE]) GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF]) GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX]) GNULIB_PCLOSE=0; AC_SUBST([GNULIB_PCLOSE]) GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR]) GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN]) GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF]) GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX]) GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC]) GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR]) GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS]) GNULIB_REMOVE=0; AC_SUBST([GNULIB_REMOVE]) GNULIB_RENAME=0; AC_SUBST([GNULIB_RENAME]) GNULIB_RENAMEAT=0; AC_SUBST([GNULIB_RENAMEAT]) GNULIB_SCANF=0; AC_SUBST([GNULIB_SCANF]) GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF]) GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX]) GNULIB_STDIO_H_NONBLOCKING=0; AC_SUBST([GNULIB_STDIO_H_NONBLOCKING]) GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE]) GNULIB_TMPFILE=0; AC_SUBST([GNULIB_TMPFILE]) GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF]) GNULIB_VFSCANF=0; AC_SUBST([GNULIB_VFSCANF]) GNULIB_VSCANF=0; AC_SUBST([GNULIB_VSCANF]) GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF]) GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF]) GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX]) GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF]) GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX]) GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF]) GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE]) HAVE_DECL_FSEEKO=1; AC_SUBST([HAVE_DECL_FSEEKO]) HAVE_DECL_FTELLO=1; AC_SUBST([HAVE_DECL_FTELLO]) HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF]) HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF]) HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF]) HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO]) HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO]) HAVE_PCLOSE=1; AC_SUBST([HAVE_PCLOSE]) HAVE_POPEN=1; AC_SUBST([HAVE_POPEN]) HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT]) HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF]) HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF]) REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF]) REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE]) REPLACE_FDOPEN=0; AC_SUBST([REPLACE_FDOPEN]) REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH]) REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF]) REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE]) REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK]) REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO]) REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL]) REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO]) REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM]) REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR]) REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN]) REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF]) REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE]) REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME]) REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT]) REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF]) REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF]) REPLACE_STDIO_READ_FUNCS=0; AC_SUBST([REPLACE_STDIO_READ_FUNCS]) REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS]) REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE]) REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF]) REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF]) REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF]) REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF]) REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF]) REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF]) ]) shishi-1.0.2/gl/m4/gettime.m40000644000000000000000000000072012126660052012511 00000000000000# gettime.m4 serial 8 dnl Copyright (C) 2002, 2004-2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GETTIME], [ dnl Prerequisites of lib/gettime.c. AC_REQUIRE([gl_CLOCK_TIME]) AC_REQUIRE([gl_TIMESPEC]) AC_CHECK_FUNCS_ONCE([gettimeofday nanotime]) ]) shishi-1.0.2/gl/m4/netdb_h.m40000644000000000000000000000304112126660052012455 00000000000000# netdb_h.m4 serial 11 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_NETDB], [ AC_REQUIRE([gl_NETDB_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([netdb.h]) if test $ac_cv_header_netdb_h = yes; then HAVE_NETDB_H=1 else HAVE_NETDB_H=0 fi AC_SUBST([HAVE_NETDB_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [getaddrinfo freeaddrinfo gai_strerror getnameinfo]) ]) AC_DEFUN([gl_NETDB_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_NETDB_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_NETDB_H_DEFAULTS], [ GNULIB_GETADDRINFO=0; AC_SUBST([GNULIB_GETADDRINFO]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_STRUCT_ADDRINFO=1; AC_SUBST([HAVE_STRUCT_ADDRINFO]) HAVE_DECL_FREEADDRINFO=1; AC_SUBST([HAVE_DECL_FREEADDRINFO]) HAVE_DECL_GAI_STRERROR=1; AC_SUBST([HAVE_DECL_GAI_STRERROR]) HAVE_DECL_GETADDRINFO=1; AC_SUBST([HAVE_DECL_GETADDRINFO]) HAVE_DECL_GETNAMEINFO=1; AC_SUBST([HAVE_DECL_GETNAMEINFO]) REPLACE_GAI_STRERROR=0; AC_SUBST([REPLACE_GAI_STRERROR]) ]) shishi-1.0.2/gl/m4/sha1.m40000644000000000000000000000057212126660052011714 00000000000000# sha1.m4 serial 11 dnl Copyright (C) 2002-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SHA1], [ dnl Prerequisites of lib/sha1.c. AC_REQUIRE([gl_BIGENDIAN]) : ]) shishi-1.0.2/gl/m4/gnulib-comp.m40000644000000000000000000007156112126660070013302 00000000000000# DO NOT EDIT! GENERATED AUTOMATICALLY! # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. # In projects that use version control, this file can be treated like # other built files. # This macro should be invoked from ./configure.ac, in the section # "Checks for programs", right after AC_PROG_CC, and certainly before # any checks for libraries, header files, types and library functions. AC_DEFUN([gl_EARLY], [ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace m4_pattern_allow([^gl_ES$])dnl a valid locale name m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable AC_REQUIRE([gl_PROG_AR_RANLIB]) # Code from module alloca: # Code from module alloca-opt: # Code from module arpa_inet: # Code from module autobuild: AB_INIT # Code from module base64: # Code from module bind: # Code from module c-ctype: # Code from module clock-time: # Code from module close: # Code from module connect: # Code from module crc: # Code from module crypto/arcfour: # Code from module crypto/des: # Code from module crypto/gc: # Code from module crypto/gc-des: # Code from module crypto/gc-hmac-md5: # Code from module crypto/gc-hmac-sha1: # Code from module crypto/gc-md4: # Code from module crypto/gc-md5: # Code from module crypto/gc-pbkdf2-sha1: # Code from module crypto/gc-random: # Code from module crypto/hmac-md5: # Code from module crypto/hmac-sha1: # Code from module crypto/md4: # Code from module crypto/md5: # Code from module crypto/sha1: # Code from module dosname: # Code from module dup2: # Code from module environ: # Code from module errno: # Code from module extensions: AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Code from module extern-inline: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module fdl-1.3: # Code from module float: # Code from module fseek: # Code from module fseeko: AC_REQUIRE([AC_FUNC_FSEEKO]) # Code from module fstat: # Code from module ftell: # Code from module ftello: AC_REQUIRE([AC_FUNC_FSEEKO]) # Code from module gendocs: # Code from module getaddrinfo: # Code from module getdelim: # Code from module getdomainname: # Code from module getdtablesize: # Code from module gethostname: # Code from module getline: # Code from module getpass: # Code from module getpeername: # Code from module getsubopt: # Code from module gettext-h: # Code from module gettime: # Code from module gettimeofday: # Code from module gnumakefile: # Code from module gnupload: # Code from module havelib: # Code from module hostent: # Code from module include_next: # Code from module inet_ntop: # Code from module intprops: # Code from module largefile: AC_REQUIRE([AC_SYS_LARGEFILE]) # Code from module lib-msvc-compat: # Code from module lib-symbol-versions: # Code from module lseek: # Code from module maintainer-makefile: # Code from module malloc-posix: # Code from module malloca: # Code from module manywarnings: # Code from module memchr: # Code from module memxor: # Code from module minmax: # Code from module mktime: # Code from module mktime-internal: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module netdb: # Code from module netinet_in: # Code from module parse-datetime: # Code from module pathmax: # Code from module pmccabe2html: # Code from module rawmemchr: # Code from module read-file: # Code from module realloc-posix: # Code from module recvfrom: # Code from module select: # Code from module sendto: # Code from module servent: # Code from module setenv: # Code from module shutdown: # Code from module signal: # Code from module signal-h: # Code from module size_max: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module snprintf: # Code from module socket: # Code from module socketlib: # Code from module sockets: # Code from module socklen: # Code from module ssize_t: # Code from module stat: # Code from module stdalign: # Code from module stdarg: dnl Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode dnl for the builtin va_copy to work. With Autoconf 2.60 or later, dnl gl_PROG_CC_C99 arranges for this. With older Autoconf gl_PROG_CC_C99 dnl shouldn't hurt, though installers are on their own to set c99 mode. gl_PROG_CC_C99 # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module strcase: # Code from module strchrnul: # Code from module strdup-posix: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strndup: # Code from module strnlen: # Code from module strtok_r: # Code from module strverscmp: # Code from module sys_select: # Code from module sys_socket: # Code from module sys_stat: # Code from module sys_time: # Code from module sys_types: # Code from module sys_uio: # Code from module time: # Code from module time_r: # Code from module timegm: # Code from module timespec: # Code from module unistd: # Code from module unsetenv: # Code from module update-copyright: # Code from module useless-if-before-free: # Code from module valgrind-tests: # Code from module vasnprintf: # Code from module vasprintf: # Code from module vc-list-files: # Code from module verify: # Code from module warnings: # Code from module wchar: # Code from module xalloc: # Code from module xalloc-oversized: # Code from module xgetdomainname: # Code from module xgethostname: # Code from module xsize: # Code from module xstrndup: # Code from module xvasprintf: ]) # This macro should be invoked from ./configure.ac, in the section # "Check for header files, types and library functions". AC_DEFUN([gl_INIT], [ AM_CONDITIONAL([GL_COND_LIBTOOL], [true]) gl_cond_libtool=true gl_m4_base='gl/m4' m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) m4_pushdef([gl_LIBSOURCES_LIST], []) m4_pushdef([gl_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='gl' changequote(,)dnl LTALLOCA=`echo "$ALLOCA" | sed -e 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` changequote([, ])dnl AC_SUBST([LTALLOCA]) gl_FUNC_ALLOCA gl_HEADER_ARPA_INET AC_PROG_MKDIR_P gl_FUNC_BASE64 AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([bind]) fi gl_SYS_SOCKET_MODULE_INDICATOR([bind]) gl_CLOCK_TIME gl_FUNC_CLOSE if test $REPLACE_CLOSE = 1; then AC_LIBOBJ([close]) fi gl_UNISTD_MODULE_INDICATOR([close]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([connect]) fi gl_SYS_SOCKET_MODULE_INDICATOR([connect]) gl_GC if test "$ac_cv_libgcrypt" = yes; then AC_LIBOBJ([gc-libgcrypt]) else AC_LIBOBJ([gc-gnulib]) fi if test $gl_cond_libtool = false; then gl_ltlibdeps="$gl_ltlibdeps $LTLIBGCRYPT" gl_libdeps="$gl_libdeps $LIBGCRYPT" fi gl_GC_DES gl_MODULE_INDICATOR([gc-des]) gl_GC_HMAC_MD5 gl_MODULE_INDICATOR([gc-hmac-md5]) gl_GC_HMAC_SHA1 gl_MODULE_INDICATOR([gc-hmac-sha1]) gl_GC_MD4 gl_MODULE_INDICATOR([gc-md4]) gl_GC_MD5 gl_MODULE_INDICATOR([gc-md5]) gl_GC_RANDOM gl_MODULE_INDICATOR([gc-random]) gl_MD4 gl_MD5 gl_SHA1 gl_FUNC_DUP2 if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then AC_LIBOBJ([dup2]) gl_PREREQ_DUP2 fi gl_UNISTD_MODULE_INDICATOR([dup2]) gl_ENVIRON gl_UNISTD_MODULE_INDICATOR([environ]) gl_HEADER_ERRNO_H AC_REQUIRE([gl_EXTERN_INLINE]) gl_FUNC_FCNTL if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then AC_LIBOBJ([fcntl]) fi gl_FCNTL_MODULE_INDICATOR([fcntl]) gl_FCNTL_H gl_FLOAT_H if test $REPLACE_FLOAT_LDBL = 1; then AC_LIBOBJ([float]) fi if test $REPLACE_ITOLD = 1; then AC_LIBOBJ([itold]) fi gl_FUNC_FSEEK if test $REPLACE_FSEEK = 1; then AC_LIBOBJ([fseek]) fi gl_STDIO_MODULE_INDICATOR([fseek]) gl_FUNC_FSEEKO if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then AC_LIBOBJ([fseeko]) gl_PREREQ_FSEEKO fi gl_STDIO_MODULE_INDICATOR([fseeko]) gl_FUNC_FSTAT if test $REPLACE_FSTAT = 1; then AC_LIBOBJ([fstat]) gl_PREREQ_FSTAT fi gl_SYS_STAT_MODULE_INDICATOR([fstat]) gl_FUNC_FTELL if test $REPLACE_FTELL = 1; then AC_LIBOBJ([ftell]) fi gl_STDIO_MODULE_INDICATOR([ftell]) gl_FUNC_FTELLO if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then AC_LIBOBJ([ftello]) gl_PREREQ_FTELLO fi gl_STDIO_MODULE_INDICATOR([ftello]) gl_GETADDRINFO if test $HAVE_GETADDRINFO = 0; then AC_LIBOBJ([getaddrinfo]) fi if test $HAVE_DECL_GAI_STRERROR = 0 || test $REPLACE_GAI_STRERROR = 1; then AC_LIBOBJ([gai_strerror]) fi gl_NETDB_MODULE_INDICATOR([getaddrinfo]) gl_FUNC_GETDELIM if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then AC_LIBOBJ([getdelim]) gl_PREREQ_GETDELIM fi gl_STDIO_MODULE_INDICATOR([getdelim]) gl_FUNC_GETDOMAINNAME if test $HAVE_DECL_GETDOMAINNAME = 0 || test $REPLACE_GETDOMAINNAME = 1; then AC_LIBOBJ([getdomainname]) gl_PREREQ_GETDOMAINNAME fi gl_UNISTD_MODULE_INDICATOR([getdomainname]) gl_FUNC_GETDTABLESIZE if test $HAVE_GETDTABLESIZE = 0; then AC_LIBOBJ([getdtablesize]) gl_PREREQ_GETDTABLESIZE fi gl_UNISTD_MODULE_INDICATOR([getdtablesize]) gl_FUNC_GETHOSTNAME if test $HAVE_GETHOSTNAME = 0; then AC_LIBOBJ([gethostname]) gl_PREREQ_GETHOSTNAME fi gl_UNISTD_MODULE_INDICATOR([gethostname]) gl_FUNC_GETLINE if test $REPLACE_GETLINE = 1; then AC_LIBOBJ([getline]) gl_PREREQ_GETLINE fi gl_STDIO_MODULE_INDICATOR([getline]) gl_FUNC_GETPASS if test $HAVE_GETPASS = 0; then AC_LIBOBJ([getpass]) gl_PREREQ_GETPASS fi AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([getpeername]) fi gl_SYS_SOCKET_MODULE_INDICATOR([getpeername]) gl_FUNC_GETSUBOPT if test $HAVE_GETSUBOPT = 0; then AC_LIBOBJ([getsubopt]) gl_PREREQ_GETSUBOPT fi gl_STDLIB_MODULE_INDICATOR([getsubopt]) AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) gl_GETTIME gl_FUNC_GETTIMEOFDAY if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then AC_LIBOBJ([gettimeofday]) gl_PREREQ_GETTIMEOFDAY fi gl_SYS_TIME_MODULE_INDICATOR([gettimeofday]) # Autoconf 2.61a.99 and earlier don't support linking a file only # in VPATH builds. But since GNUmakefile is for maintainer use # only, it does not matter if we skip the link with older autoconf. # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH # builds, so use a shell variable to bypass this. GNUmakefile=GNUmakefile m4_if(m4_version_compare([2.61a.100], m4_defn([m4_PACKAGE_VERSION])), [1], [], [AC_CONFIG_LINKS([$GNUmakefile:$GNUmakefile], [], [GNUmakefile=$GNUmakefile])]) gl_HOSTENT gl_FUNC_INET_NTOP if test $HAVE_INET_NTOP = 0 || test $REPLACE_INET_NTOP = 1; then AC_LIBOBJ([inet_ntop]) gl_PREREQ_INET_NTOP fi gl_ARPA_INET_MODULE_INDICATOR([inet_ntop]) AC_REQUIRE([gl_LARGEFILE]) gl_LD_OUTPUT_DEF gl_LD_VERSION_SCRIPT gl_FUNC_LSEEK if test $REPLACE_LSEEK = 1; then AC_LIBOBJ([lseek]) fi gl_UNISTD_MODULE_INDICATOR([lseek]) AC_CONFIG_COMMANDS_PRE([m4_ifdef([AH_HEADER], [AC_SUBST([CONFIG_INCLUDE], m4_defn([AH_HEADER]))])]) gl_FUNC_MALLOC_POSIX if test $REPLACE_MALLOC = 1; then AC_LIBOBJ([malloc]) fi gl_STDLIB_MODULE_INDICATOR([malloc-posix]) gl_MALLOCA gl_FUNC_MEMCHR if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then AC_LIBOBJ([memchr]) gl_PREREQ_MEMCHR fi gl_STRING_MODULE_INDICATOR([memchr]) gl_MEMXOR gl_MINMAX gl_FUNC_MKTIME if test $REPLACE_MKTIME = 1; then AC_LIBOBJ([mktime]) gl_PREREQ_MKTIME fi gl_TIME_MODULE_INDICATOR([mktime]) gl_FUNC_MKTIME_INTERNAL if test $REPLACE_MKTIME = 1; then AC_LIBOBJ([mktime]) gl_PREREQ_MKTIME fi gl_MSVC_INVAL if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-inval]) fi gl_MSVC_NOTHROW if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-nothrow]) fi gl_MULTIARCH gl_HEADER_NETDB gl_HEADER_NETINET_IN AC_PROG_MKDIR_P gl_PARSE_DATETIME gl_PATHMAX AC_PATH_PROG([PMCCABE], [pmccabe], [false]) gl_FUNC_RAWMEMCHR if test $HAVE_RAWMEMCHR = 0; then AC_LIBOBJ([rawmemchr]) gl_PREREQ_RAWMEMCHR fi gl_STRING_MODULE_INDICATOR([rawmemchr]) gl_PREREQ_READ_FILE gl_FUNC_REALLOC_POSIX if test $REPLACE_REALLOC = 1; then AC_LIBOBJ([realloc]) fi gl_STDLIB_MODULE_INDICATOR([realloc-posix]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([recvfrom]) fi gl_SYS_SOCKET_MODULE_INDICATOR([recvfrom]) gl_FUNC_SELECT if test $REPLACE_SELECT = 1; then AC_LIBOBJ([select]) fi gl_SYS_SELECT_MODULE_INDICATOR([select]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([sendto]) fi gl_SYS_SOCKET_MODULE_INDICATOR([sendto]) gl_SERVENT gl_FUNC_SETENV if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then AC_LIBOBJ([setenv]) fi gl_STDLIB_MODULE_INDICATOR([setenv]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([shutdown]) fi gl_SYS_SOCKET_MODULE_INDICATOR([shutdown]) gl_SIGNAL_H gl_SIZE_MAX gl_FUNC_SNPRINTF gl_STDIO_MODULE_INDICATOR([snprintf]) gl_MODULE_INDICATOR([snprintf]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then AC_LIBOBJ([socket]) fi # When this module is used, sockets may actually occur as file descriptors, # hence it is worth warning if the modules 'close' and 'ioctl' are not used. m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])]) m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])]) AC_REQUIRE([gl_PREREQ_SYS_H_WINSOCK2]) if test "$ac_cv_header_winsock2_h" = yes; then UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1 SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1 fi gl_SYS_SOCKET_MODULE_INDICATOR([socket]) gl_SOCKETLIB gl_SOCKETS gl_TYPE_SOCKLEN_T gt_TYPE_SSIZE_T gl_FUNC_STAT if test $REPLACE_STAT = 1; then AC_LIBOBJ([stat]) gl_PREREQ_STAT fi gl_SYS_STAT_MODULE_INDICATOR([stat]) gl_STDALIGN_H gl_STDARG_H AM_STDBOOL_H gl_STDDEF_H gl_STDINT_H gl_STDIO_H gl_STDLIB_H gl_STRCASE if test $HAVE_STRCASECMP = 0; then AC_LIBOBJ([strcasecmp]) gl_PREREQ_STRCASECMP fi if test $HAVE_STRNCASECMP = 0; then AC_LIBOBJ([strncasecmp]) gl_PREREQ_STRNCASECMP fi gl_FUNC_STRCHRNUL if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then AC_LIBOBJ([strchrnul]) gl_PREREQ_STRCHRNUL fi gl_STRING_MODULE_INDICATOR([strchrnul]) gl_FUNC_STRDUP_POSIX if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then AC_LIBOBJ([strdup]) gl_PREREQ_STRDUP fi gl_STRING_MODULE_INDICATOR([strdup]) gl_FUNC_STRERROR if test $REPLACE_STRERROR = 1; then AC_LIBOBJ([strerror]) fi gl_MODULE_INDICATOR([strerror]) gl_STRING_MODULE_INDICATOR([strerror]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then AC_LIBOBJ([strerror-override]) gl_PREREQ_SYS_H_WINSOCK2 fi gl_HEADER_STRING_H gl_HEADER_STRINGS_H gl_FUNC_STRNDUP if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then AC_LIBOBJ([strndup]) fi gl_STRING_MODULE_INDICATOR([strndup]) gl_FUNC_STRNLEN if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then AC_LIBOBJ([strnlen]) gl_PREREQ_STRNLEN fi gl_STRING_MODULE_INDICATOR([strnlen]) gl_FUNC_STRTOK_R if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then AC_LIBOBJ([strtok_r]) gl_PREREQ_STRTOK_R fi gl_STRING_MODULE_INDICATOR([strtok_r]) gl_FUNC_STRVERSCMP if test $HAVE_STRVERSCMP = 0; then AC_LIBOBJ([strverscmp]) gl_PREREQ_STRVERSCMP fi gl_STRING_MODULE_INDICATOR([strverscmp]) gl_HEADER_SYS_SELECT AC_PROG_MKDIR_P gl_HEADER_SYS_SOCKET AC_PROG_MKDIR_P gl_HEADER_SYS_STAT_H AC_PROG_MKDIR_P gl_HEADER_SYS_TIME_H AC_PROG_MKDIR_P gl_SYS_TYPES_H AC_PROG_MKDIR_P gl_HEADER_SYS_UIO AC_PROG_MKDIR_P gl_HEADER_TIME_H gl_TIME_R if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then AC_LIBOBJ([time_r]) gl_PREREQ_TIME_R fi gl_TIME_MODULE_INDICATOR([time_r]) gl_FUNC_TIMEGM if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then AC_LIBOBJ([timegm]) gl_PREREQ_TIMEGM fi gl_TIME_MODULE_INDICATOR([timegm]) gl_TIMESPEC gl_UNISTD_H gl_FUNC_UNSETENV if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then AC_LIBOBJ([unsetenv]) gl_PREREQ_UNSETENV fi gl_STDLIB_MODULE_INDICATOR([unsetenv]) gl_VALGRIND_TESTS gl_FUNC_VASNPRINTF gl_FUNC_VASPRINTF gl_STDIO_MODULE_INDICATOR([vasprintf]) m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=asprintf:2:c-format]) AM_][XGETTEXT_OPTION([--flag=vasprintf:2:c-format])]) gl_WCHAR_H gl_XALLOC gl_XSIZE gl_XSTRNDUP gl_XVASPRINTF m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=xasprintf:1:c-format])]) # End of code from modules m4_ifval(gl_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || for gl_file in ]gl_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gl_LIBSOURCES_DIR]) m4_popdef([gl_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl_libobjs= gl_ltlibobjs= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" done fi AC_SUBST([gl_LIBOBJS], [$gl_libobjs]) AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs]) ]) gltests_libdeps= gltests_ltlibdeps= m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES])) m4_pushdef([gltests_LIBSOURCES_LIST], []) m4_pushdef([gltests_LIBSOURCES_DIR], []) gl_COMMON gl_source_base='gl/tests' changequote(,)dnl gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS changequote([, ])dnl AC_SUBST([gltests_WITNESS]) gl_module_indicator_condition=$gltests_WITNESS m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) gl_VALGRIND_TESTS m4_popdef([gl_MODULE_INDICATOR_CONDITION]) m4_ifval(gltests_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || for gl_file in ]gltests_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([gltests_LIBSOURCES_DIR]) m4_popdef([gltests_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gltests_libobjs= gltests_ltlibobjs= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" done fi AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs]) AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_LIBOBJ], [ AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl_LIBSOURCES_DIR], [gl]) m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_LIBOBJ], [ AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gltests_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gltests_LIBSOURCES_DIR], [gl/tests]) m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([gl_FILE_LIST], [ build-aux/config.rpath build-aux/gendocs.sh build-aux/gnupload build-aux/pmccabe.css build-aux/pmccabe2html build-aux/snippet/_Noreturn.h build-aux/snippet/arg-nonnull.h build-aux/snippet/c++defs.h build-aux/snippet/warn-on-use.h build-aux/update-copyright build-aux/useless-if-before-free build-aux/vc-list-files doc/fdl-1.3.texi doc/gendocs_template doc/parse-datetime.texi lib/alloca.c lib/alloca.in.h lib/arcfour.c lib/arcfour.h lib/arpa_inet.in.h lib/asnprintf.c lib/asprintf.c lib/base64.c lib/base64.h lib/bind.c lib/c-ctype.c lib/c-ctype.h lib/close.c lib/connect.c lib/crc.c lib/crc.h lib/des.c lib/des.h lib/dosname.h lib/dup2.c lib/errno.in.h lib/fcntl.c lib/fcntl.in.h lib/fd-hook.c lib/fd-hook.h lib/float+.h lib/float.c lib/float.in.h lib/fseek.c lib/fseeko.c lib/fstat.c lib/ftell.c lib/ftello.c lib/gai_strerror.c lib/gc-gnulib.c lib/gc-libgcrypt.c lib/gc-pbkdf2-sha1.c lib/gc.h lib/getaddrinfo.c lib/getdelim.c lib/getdomainname.c lib/getdtablesize.c lib/gethostname.c lib/getline.c lib/getpass.c lib/getpass.h lib/getpeername.c lib/getsubopt.c lib/gettext.h lib/gettime.c lib/gettimeofday.c lib/hmac-md5.c lib/hmac-sha1.c lib/hmac.h lib/inet_ntop.c lib/intprops.h lib/itold.c lib/lseek.c lib/malloc.c lib/malloca.c lib/malloca.h lib/malloca.valgrind lib/md4.c lib/md4.h lib/md5.c lib/md5.h lib/memchr.c lib/memchr.valgrind lib/memxor.c lib/memxor.h lib/minmax.h lib/mktime-internal.h lib/mktime.c lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c lib/msvc-nothrow.h lib/netdb.in.h lib/netinet_in.in.h lib/parse-datetime.h lib/parse-datetime.y lib/pathmax.h lib/printf-args.c lib/printf-args.h lib/printf-parse.c lib/printf-parse.h lib/rawmemchr.c lib/rawmemchr.valgrind lib/read-file.c lib/read-file.h lib/realloc.c lib/recvfrom.c lib/select.c lib/sendto.c lib/setenv.c lib/sha1.c lib/sha1.h lib/shutdown.c lib/signal.in.h lib/size_max.h lib/snprintf.c lib/socket.c lib/sockets.c lib/sockets.h lib/stat.c lib/stdalign.in.h lib/stdarg.in.h lib/stdbool.in.h lib/stddef.in.h lib/stdint.in.h lib/stdio-impl.h lib/stdio.in.h lib/stdlib.in.h lib/strcasecmp.c lib/strchrnul.c lib/strchrnul.valgrind lib/strdup.c lib/strerror-override.c lib/strerror-override.h lib/strerror.c lib/string.in.h lib/strings.in.h lib/strncasecmp.c lib/strndup.c lib/strnlen.c lib/strtok_r.c lib/strverscmp.c lib/sys_select.in.h lib/sys_socket.c lib/sys_socket.in.h lib/sys_stat.in.h lib/sys_time.in.h lib/sys_types.in.h lib/sys_uio.in.h lib/time.in.h lib/time_r.c lib/timegm.c lib/timespec.c lib/timespec.h lib/unistd.c lib/unistd.in.h lib/unsetenv.c lib/vasnprintf.c lib/vasnprintf.h lib/vasprintf.c lib/verify.h lib/w32sock.h lib/wchar.in.h lib/xalloc-oversized.h lib/xalloc.h lib/xasprintf.c lib/xgetdomainname.c lib/xgetdomainname.h lib/xgethostname.c lib/xgethostname.h lib/xmalloc.c lib/xsize.c lib/xsize.h lib/xstrndup.c lib/xstrndup.h lib/xvasprintf.c lib/xvasprintf.h m4/00gnulib.m4 m4/alloca.m4 m4/arpa_inet_h.m4 m4/autobuild.m4 m4/base64.m4 m4/bison.m4 m4/clock_time.m4 m4/close.m4 m4/dup2.m4 m4/eealloc.m4 m4/environ.m4 m4/errno_h.m4 m4/exponentd.m4 m4/extensions.m4 m4/extern-inline.m4 m4/fcntl-o.m4 m4/fcntl.m4 m4/fcntl_h.m4 m4/float_h.m4 m4/fseek.m4 m4/fseeko.m4 m4/fstat.m4 m4/ftell.m4 m4/ftello.m4 m4/gc-des.m4 m4/gc-hmac-md5.m4 m4/gc-hmac-sha1.m4 m4/gc-md4.m4 m4/gc-md5.m4 m4/gc-random.m4 m4/gc.m4 m4/getaddrinfo.m4 m4/getdelim.m4 m4/getdomainname.m4 m4/getdtablesize.m4 m4/gethostname.m4 m4/getline.m4 m4/getpass.m4 m4/getsubopt.m4 m4/gettime.m4 m4/gettimeofday.m4 m4/gnulib-common.m4 m4/hostent.m4 m4/include_next.m4 m4/inet_ntop.m4 m4/intmax_t.m4 m4/inttypes_h.m4 m4/largefile.m4 m4/ld-output-def.m4 m4/ld-version-script.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/longlong.m4 m4/lseek.m4 m4/malloc.m4 m4/malloca.m4 m4/manywarnings.m4 m4/math_h.m4 m4/md4.m4 m4/md5.m4 m4/memchr.m4 m4/memxor.m4 m4/minmax.m4 m4/mktime.m4 m4/mmap-anon.m4 m4/msvc-inval.m4 m4/msvc-nothrow.m4 m4/multiarch.m4 m4/netdb_h.m4 m4/netinet_in_h.m4 m4/off_t.m4 m4/parse-datetime.m4 m4/pathmax.m4 m4/printf.m4 m4/rawmemchr.m4 m4/read-file.m4 m4/realloc.m4 m4/select.m4 m4/servent.m4 m4/setenv.m4 m4/sha1.m4 m4/signal_h.m4 m4/size_max.m4 m4/snprintf.m4 m4/socketlib.m4 m4/sockets.m4 m4/socklen.m4 m4/sockpfaf.m4 m4/ssize_t.m4 m4/stat.m4 m4/stdalign.m4 m4/stdarg.m4 m4/stdbool.m4 m4/stddef_h.m4 m4/stdint.m4 m4/stdint_h.m4 m4/stdio_h.m4 m4/stdlib_h.m4 m4/strcase.m4 m4/strchrnul.m4 m4/strdup.m4 m4/strerror.m4 m4/string_h.m4 m4/strings_h.m4 m4/strndup.m4 m4/strnlen.m4 m4/strtok_r.m4 m4/strverscmp.m4 m4/sys_select_h.m4 m4/sys_socket_h.m4 m4/sys_stat_h.m4 m4/sys_time_h.m4 m4/sys_types_h.m4 m4/sys_uio_h.m4 m4/time_h.m4 m4/time_r.m4 m4/timegm.m4 m4/timespec.m4 m4/tm_gmtoff.m4 m4/unistd_h.m4 m4/valgrind-tests.m4 m4/vasnprintf.m4 m4/vasprintf.m4 m4/warn-on-use.m4 m4/warnings.m4 m4/wchar_h.m4 m4/wchar_t.m4 m4/wint_t.m4 m4/xalloc.m4 m4/xsize.m4 m4/xstrndup.m4 m4/xvasprintf.m4 top/GNUmakefile top/maint.mk ]) shishi-1.0.2/gl/m4/msvc-nothrow.m40000644000000000000000000000053012126660052013520 00000000000000# msvc-nothrow.m4 serial 1 dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_NOTHROW], [ AC_REQUIRE([gl_MSVC_INVAL]) ]) shishi-1.0.2/gl/m4/unistd_h.m40000644000000000000000000002143412126660053012676 00000000000000# unistd_h.m4 serial 66 dnl Copyright (C) 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Simon Josefsson, Bruno Haible. AC_DEFUN([gl_UNISTD_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([unistd.h]) if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi AC_SUBST([HAVE_UNISTD_H]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Determine WINDOWS_64_BIT_OFF_T. AC_REQUIRE([gl_TYPE_OFF_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_UNISTD_H # include #endif /* Some systems declare various items in the wrong headers. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # include # endif #endif ]], [chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize getgroups gethostname getlogin getlogin_r getpagesize getusershell setusershell endusershell group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite readlink readlinkat rmdir sethostname sleep symlink symlinkat ttyname_r unlink unlinkat usleep]) ]) AC_DEFUN([gl_UNISTD_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_UNISTD_H_DEFAULTS], [ GNULIB_CHDIR=0; AC_SUBST([GNULIB_CHDIR]) GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE]) GNULIB_DUP=0; AC_SUBST([GNULIB_DUP]) GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3]) GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS]) GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT]) GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT]) GNULIB_FDATASYNC=0; AC_SUBST([GNULIB_FDATASYNC]) GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC]) GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME]) GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE]) GNULIB_GETGROUPS=0; AC_SUBST([GNULIB_GETGROUPS]) GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME]) GNULIB_GETLOGIN=0; AC_SUBST([GNULIB_GETLOGIN]) GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL]) GNULIB_GROUP_MEMBER=0; AC_SUBST([GNULIB_GROUP_MEMBER]) GNULIB_ISATTY=0; AC_SUBST([GNULIB_ISATTY]) GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) GNULIB_LINK=0; AC_SUBST([GNULIB_LINK]) GNULIB_LINKAT=0; AC_SUBST([GNULIB_LINKAT]) GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) GNULIB_PIPE=0; AC_SUBST([GNULIB_PIPE]) GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2]) GNULIB_PREAD=0; AC_SUBST([GNULIB_PREAD]) GNULIB_PWRITE=0; AC_SUBST([GNULIB_PWRITE]) GNULIB_READ=0; AC_SUBST([GNULIB_READ]) GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) GNULIB_READLINKAT=0; AC_SUBST([GNULIB_READLINKAT]) GNULIB_RMDIR=0; AC_SUBST([GNULIB_RMDIR]) GNULIB_SETHOSTNAME=0; AC_SUBST([GNULIB_SETHOSTNAME]) GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) GNULIB_SYMLINK=0; AC_SUBST([GNULIB_SYMLINK]) GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT]) GNULIB_TTYNAME_R=0; AC_SUBST([GNULIB_TTYNAME_R]) GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING]) GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE]) GNULIB_UNLINK=0; AC_SUBST([GNULIB_UNLINK]) GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT]) GNULIB_USLEEP=0; AC_SUBST([GNULIB_USLEEP]) GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN]) HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) HAVE_DUP3=1; AC_SUBST([HAVE_DUP3]) HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT]) HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR]) HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) HAVE_FDATASYNC=1; AC_SUBST([HAVE_FDATASYNC]) HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE]) HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS]) HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME]) HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN]) HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) HAVE_GROUP_MEMBER=1; AC_SUBST([HAVE_GROUP_MEMBER]) HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN]) HAVE_LINK=1; AC_SUBST([HAVE_LINK]) HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT]) HAVE_PIPE=1; AC_SUBST([HAVE_PIPE]) HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2]) HAVE_PREAD=1; AC_SUBST([HAVE_PREAD]) HAVE_PWRITE=1; AC_SUBST([HAVE_PWRITE]) HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT]) HAVE_SETHOSTNAME=1; AC_SUBST([HAVE_SETHOSTNAME]) HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK]) HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT]) HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP]) HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) HAVE_DECL_FCHDIR=1; AC_SUBST([HAVE_DECL_FCHDIR]) HAVE_DECL_FDATASYNC=1; AC_SUBST([HAVE_DECL_FDATASYNC]) HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME]) HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE]) HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL]) HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME]) HAVE_DECL_TTYNAME_R=1; AC_SUBST([HAVE_DECL_TTYNAME_R]) HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) REPLACE_DUP=0; AC_SUBST([REPLACE_DUP]) REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2]) REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) REPLACE_FTRUNCATE=0; AC_SUBST([REPLACE_FTRUNCATE]) REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME]) REPLACE_GETLOGIN_R=0; AC_SUBST([REPLACE_GETLOGIN_R]) REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS]) REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY]) REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) REPLACE_LINK=0; AC_SUBST([REPLACE_LINK]) REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT]) REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD]) REPLACE_PWRITE=0; AC_SUBST([REPLACE_PWRITE]) REPLACE_READ=0; AC_SUBST([REPLACE_READ]) REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK]) REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR]) REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP]) REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK]) REPLACE_TTYNAME_R=0; AC_SUBST([REPLACE_TTYNAME_R]) REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK]) REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT]) REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP]) REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE]) UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H]) UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS]) ]) shishi-1.0.2/gl/m4/getaddrinfo.m40000644000000000000000000001345312126660052013350 00000000000000# getaddrinfo.m4 serial 30 dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GETADDRINFO], [ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H AC_REQUIRE([gl_HEADER_NETDB])dnl for HAVE_NETDB_H AC_MSG_NOTICE([checking how to do getaddrinfo, freeaddrinfo and getnameinfo]) GETADDRINFO_LIB= gai_saved_LIBS="$LIBS" dnl Where is getaddrinfo()? dnl - On Solaris, it is in libsocket. dnl - On Haiku, it is in libnetwork. dnl - On BeOS, it is in libnet. dnl - On native Windows, it is in ws2_32.dll. dnl - Otherwise it is in libc. AC_SEARCH_LIBS([getaddrinfo], [socket network net], [if test "$ac_cv_search_getaddrinfo" != "none required"; then GETADDRINFO_LIB="$ac_cv_search_getaddrinfo" fi]) LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" HAVE_GETADDRINFO=1 AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include ]], [[getaddrinfo("", "", NULL, NULL);]])], [gl_cv_func_getaddrinfo=yes], [gl_cv_func_getaddrinfo=no])]) if test $gl_cv_func_getaddrinfo = no; then AC_CACHE_CHECK([for getaddrinfo in ws2tcpip.h and -lws2_32], gl_cv_w32_getaddrinfo, [ gl_cv_w32_getaddrinfo=no am_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_WS2TCPIP_H #include #endif #include ]], [[getaddrinfo(NULL, NULL, NULL, NULL);]])], [gl_cv_w32_getaddrinfo=yes]) LIBS="$am_save_LIBS" ]) if test "$gl_cv_w32_getaddrinfo" = "yes"; then GETADDRINFO_LIB="-lws2_32" LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" else HAVE_GETADDRINFO=0 fi fi # We can't use AC_REPLACE_FUNCS here because gai_strerror may be an # inline function declared in ws2tcpip.h, so we need to get that # header included somehow. AC_CHECK_DECLS([gai_strerror], [], [], [[ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include ]]) if test $ac_cv_have_decl_gai_strerror = yes; then AC_CHECK_DECLS([gai_strerrorA], [], [], [[ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include ]]) dnl check for correct signature AC_CACHE_CHECK([for gai_strerror with POSIX signature], [gl_cv_func_gai_strerror_posix_signature], [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif #include extern #ifdef __cplusplus "C" #endif const char *gai_strerror(int);]])], [gl_cv_func_gai_strerror_posix_signature=yes], [gl_cv_func_gai_strerror_posix_signature=no])]) if test $gl_cv_func_gai_strerror_posix_signature = no; then REPLACE_GAI_STRERROR=1 fi fi LIBS="$gai_saved_LIBS" gl_PREREQ_GETADDRINFO AC_SUBST([GETADDRINFO_LIB]) ]) # Prerequisites of lib/netdb.in.h and lib/getaddrinfo.c. AC_DEFUN([gl_PREREQ_GETADDRINFO], [ AC_REQUIRE([gl_NETDB_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H AC_REQUIRE([gl_HOSTENT]) dnl for HOSTENT_LIB AC_REQUIRE([gl_SERVENT]) dnl for SERVENT_LIB AC_REQUIRE([gl_FUNC_INET_NTOP]) dnl for INET_NTOP_LIB AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_SOCKET_FAMILIES]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl Including sys/socket.h is wrong for Windows, but Windows does not dnl have sa_len so the result is correct anyway. AC_CHECK_MEMBERS([struct sockaddr.sa_len], , , [ #include #include ]) AC_CHECK_HEADERS_ONCE([netinet/in.h]) AC_CHECK_DECLS([getaddrinfo, freeaddrinfo, getnameinfo],,,[[ /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]]) if test $ac_cv_have_decl_getaddrinfo = no; then HAVE_DECL_GETADDRINFO=0 fi if test $ac_cv_have_decl_freeaddrinfo = no; then HAVE_DECL_FREEADDRINFO=0 fi if test $ac_cv_have_decl_gai_strerror = no; then HAVE_DECL_GAI_STRERROR=0 fi if test $ac_cv_have_decl_getnameinfo = no; then HAVE_DECL_GETNAMEINFO=0 fi AC_CHECK_TYPES([struct addrinfo],,,[ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) if test $ac_cv_type_struct_addrinfo = no; then HAVE_STRUCT_ADDRINFO=0 fi dnl Append $HOSTENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates. case " $GETADDRINFO_LIB " in *" $HOSTENT_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $HOSTENT_LIB" ;; esac dnl Append $SERVENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates. case " $GETADDRINFO_LIB " in *" $SERVENT_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;; esac dnl Append $INET_NTOP_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates. case " $GETADDRINFO_LIB " in *" $INET_NTOP_LIB "*) ;; *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;; esac ]) shishi-1.0.2/gl/m4/manywarnings.m40000644000000000000000000001417312126660052013577 00000000000000# manywarnings.m4 serial 5 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # gl_MANYWARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR) # -------------------------------------------------- # Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR. # Elements separated by whitespace. In set logic terms, the function # does OUTVAR = LISTVAR \ REMOVEVAR. AC_DEFUN([gl_MANYWARN_COMPLEMENT], [ gl_warn_set= set x $2; shift for gl_warn_item do case " $3 " in *" $gl_warn_item "*) ;; *) gl_warn_set="$gl_warn_set $gl_warn_item" ;; esac done $1=$gl_warn_set ]) # gl_MANYWARN_ALL_GCC(VARIABLE) # ----------------------------- # Add all documented GCC warning parameters to variable VARIABLE. # Note that you need to test them using gl_WARN_ADD if you want to # make sure your gcc understands it. AC_DEFUN([gl_MANYWARN_ALL_GCC], [ dnl First, check for some issues that only occur when combining multiple dnl gcc warning categories. AC_REQUIRE([AC_PROG_CC]) if test -n "$GCC"; then dnl Check if -W -Werror -Wno-missing-field-initializers is supported dnl with the current $CC $CFLAGS $CPPFLAGS. AC_MSG_CHECKING([whether -Wno-missing-field-initializers is supported]) AC_CACHE_VAL([gl_cv_cc_nomfi_supported], [ gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[]])], [gl_cv_cc_nomfi_supported=yes], [gl_cv_cc_nomfi_supported=no]) CFLAGS="$gl_save_CFLAGS"]) AC_MSG_RESULT([$gl_cv_cc_nomfi_supported]) if test "$gl_cv_cc_nomfi_supported" = yes; then dnl Now check whether -Wno-missing-field-initializers is needed dnl for the { 0, } construct. AC_MSG_CHECKING([whether -Wno-missing-field-initializers is needed]) AC_CACHE_VAL([gl_cv_cc_nomfi_needed], [ gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -W -Werror" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[void f (void) { typedef struct { int a; int b; } s_t; s_t s1 = { 0, }; } ]], [[]])], [gl_cv_cc_nomfi_needed=no], [gl_cv_cc_nomfi_needed=yes]) CFLAGS="$gl_save_CFLAGS" ]) AC_MSG_RESULT([$gl_cv_cc_nomfi_needed]) fi dnl Next, check if -Werror -Wuninitialized is useful with the dnl user's choice of $CFLAGS; some versions of gcc warn that it dnl has no effect if -O is not also used AC_MSG_CHECKING([whether -Wuninitialized is supported]) AC_CACHE_VAL([gl_cv_cc_uninitialized_supported], [ gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror -Wuninitialized" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[]])], [gl_cv_cc_uninitialized_supported=yes], [gl_cv_cc_uninitialized_supported=no]) CFLAGS="$gl_save_CFLAGS"]) AC_MSG_RESULT([$gl_cv_cc_uninitialized_supported]) fi # List all gcc warning categories. gl_manywarn_set= for gl_manywarn_item in \ -W \ -Wabi \ -Waddress \ -Wall \ -Warray-bounds \ -Wattributes \ -Wbad-function-cast \ -Wbuiltin-macro-redefined \ -Wcast-align \ -Wchar-subscripts \ -Wclobbered \ -Wcomment \ -Wcomments \ -Wcoverage-mismatch \ -Wcpp \ -Wdeprecated \ -Wdeprecated-declarations \ -Wdisabled-optimization \ -Wdiv-by-zero \ -Wdouble-promotion \ -Wempty-body \ -Wendif-labels \ -Wenum-compare \ -Wextra \ -Wformat-contains-nul \ -Wformat-extra-args \ -Wformat-nonliteral \ -Wformat-security \ -Wformat-y2k \ -Wformat-zero-length \ -Wformat=2 \ -Wfree-nonheap-object \ -Wignored-qualifiers \ -Wimplicit \ -Wimplicit-function-declaration \ -Wimplicit-int \ -Winit-self \ -Winline \ -Wint-to-pointer-cast \ -Winvalid-memory-model \ -Winvalid-pch \ -Wjump-misses-init \ -Wlogical-op \ -Wmain \ -Wmaybe-uninitialized \ -Wmissing-braces \ -Wmissing-declarations \ -Wmissing-field-initializers \ -Wmissing-format-attribute \ -Wmissing-include-dirs \ -Wmissing-noreturn \ -Wmissing-parameter-type \ -Wmissing-prototypes \ -Wmudflap \ -Wmultichar \ -Wnarrowing \ -Wnested-externs \ -Wnonnull \ -Wnormalized=nfc \ -Wold-style-declaration \ -Wold-style-definition \ -Woverflow \ -Woverlength-strings \ -Woverride-init \ -Wpacked \ -Wpacked-bitfield-compat \ -Wparentheses \ -Wpointer-arith \ -Wpointer-sign \ -Wpointer-to-int-cast \ -Wpragmas \ -Wreturn-type \ -Wsequence-point \ -Wshadow \ -Wsizeof-pointer-memaccess \ -Wstack-protector \ -Wstrict-aliasing \ -Wstrict-overflow \ -Wstrict-prototypes \ -Wsuggest-attribute=const \ -Wsuggest-attribute=format \ -Wsuggest-attribute=noreturn \ -Wsuggest-attribute=pure \ -Wswitch \ -Wswitch-default \ -Wsync-nand \ -Wsystem-headers \ -Wtrampolines \ -Wtrigraphs \ -Wtype-limits \ -Wuninitialized \ -Wunknown-pragmas \ -Wunreachable-code \ -Wunsafe-loop-optimizations \ -Wunused \ -Wunused-but-set-parameter \ -Wunused-but-set-variable \ -Wunused-function \ -Wunused-label \ -Wunused-local-typedefs \ -Wunused-macros \ -Wunused-parameter \ -Wunused-result \ -Wunused-value \ -Wunused-variable \ -Wvarargs \ -Wvariadic-macros \ -Wvector-operation-performance \ -Wvla \ -Wvolatile-register-var \ -Wwrite-strings \ \ ; do gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" done # Disable specific options as needed. if test "$gl_cv_cc_nomfi_needed" = yes; then gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" fi if test "$gl_cv_cc_uninitialized_supported" = no; then gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" fi $1=$gl_manywarn_set ]) shishi-1.0.2/gl/m4/socketlib.m40000644000000000000000000000524412126660052013040 00000000000000# socketlib.m4 serial 1 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl gl_SOCKETLIB dnl Determines the library to use for socket functions. dnl Sets and AC_SUBSTs LIBSOCKET. AC_DEFUN([gl_SOCKETLIB], [ gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H LIBSOCKET= if test $HAVE_WINSOCK2_H = 1; then dnl Native Windows API (not Cygwin). AC_CACHE_CHECK([if we need to call WSAStartup in winsock2.h and -lws2_32], [gl_cv_func_wsastartup], [ gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_WINSOCK2_H # include #endif]], [[ WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); WSACleanup ();]])], gl_cv_func_wsastartup=yes, gl_cv_func_wsastartup=no) LIBS="$gl_save_LIBS" ]) if test "$gl_cv_func_wsastartup" = "yes"; then AC_DEFINE([WINDOWS_SOCKETS], [1], [Define if WSAStartup is needed.]) LIBSOCKET='-lws2_32' fi else dnl Unix API. dnl Solaris has most socket functions in libsocket. dnl Haiku has most socket functions in libnetwork. dnl BeOS has most socket functions in libnet. AC_CACHE_CHECK([for library containing setsockopt], [gl_cv_lib_socket], [ gl_cv_lib_socket= AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [], [gl_save_LIBS="$LIBS" LIBS="$gl_save_LIBS -lsocket" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lsocket"]) if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnetwork" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lnetwork"]) if test -z "$gl_cv_lib_socket"; then LIBS="$gl_save_LIBS -lnet" AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern #ifdef __cplusplus "C" #endif char setsockopt();]], [[setsockopt();]])], [gl_cv_lib_socket="-lnet"]) fi fi LIBS="$gl_save_LIBS" ]) if test -z "$gl_cv_lib_socket"; then gl_cv_lib_socket="none needed" fi ]) if test "$gl_cv_lib_socket" != "none needed"; then LIBSOCKET="$gl_cv_lib_socket" fi fi AC_SUBST([LIBSOCKET]) ]) shishi-1.0.2/gl/m4/strcase.m40000644000000000000000000000201212126660052012513 00000000000000# strcase.m4 serial 11 dnl Copyright (C) 2002, 2005-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STRCASE], [ gl_FUNC_STRCASECMP gl_FUNC_STRNCASECMP ]) AC_DEFUN([gl_FUNC_STRCASECMP], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strcasecmp]) if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi ]) AC_DEFUN([gl_FUNC_STRNCASECMP], [ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strncasecmp]) if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi AC_CHECK_DECLS([strncasecmp]) if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi ]) # Prerequisites of lib/strcasecmp.c. AC_DEFUN([gl_PREREQ_STRCASECMP], [ : ]) # Prerequisites of lib/strncasecmp.c. AC_DEFUN([gl_PREREQ_STRNCASECMP], [ : ]) shishi-1.0.2/gl/m4/include_next.m40000644000000000000000000002542412126660052013544 00000000000000# include_next.m4 serial 23 dnl Copyright (C) 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Derek Price. dnl Sets INCLUDE_NEXT and PRAGMA_SYSTEM_HEADER. dnl dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to dnl 'include' otherwise. dnl dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler dnl supports it in the special case that it is the first include directive in dnl the given file, or to 'include' otherwise. dnl dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next, dnl so as to avoid GCC warnings when the gcc option -pedantic is used. dnl '#pragma GCC system_header' has the same effect as if the file was found dnl through the include search path specified with '-isystem' options (as dnl opposed to the search path specified with '-I' options). Namely, gcc dnl does not warn about some things, and on some systems (Solaris and Interix) dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead dnl of plain '__STDC__'. dnl dnl PRAGMA_COLUMNS can be used in files that override system header files, so dnl as to avoid compilation errors on HP NonStop systems when the gnulib file dnl is included by a system header file that does a "#pragma COLUMNS 80" (which dnl has the effect of truncating the lines of that file and all files that it dnl includes to 80 columns) and the gnulib file has lines longer than 80 dnl columns. AC_DEFUN([gl_INCLUDE_NEXT], [ AC_LANG_PREPROC_REQUIRE() AC_CACHE_CHECK([whether the preprocessor supports include_next], [gl_cv_have_include_next], [rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on dnl AIX 6.1 support include_next when used as first preprocessor directive dnl in a file, but not when preceded by another include directive. Check dnl for this bug by including . dnl Additionally, with this same compiler, include_next is a no-op when dnl used in a header file that was included by specifying its absolute dnl file name. Despite these two bugs, include_next is used in the dnl compiler's . By virtue of the second bug, we need to use dnl include_next as well in this case. cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" dnl We intentionally avoid using AC_LANG_SOURCE here. AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=yes], [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=buggy], [gl_cv_have_include_next=no]) ]) CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 ]) PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi AC_SUBST([INCLUDE_NEXT]) AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE]) AC_SUBST([PRAGMA_SYSTEM_HEADER]) AC_CACHE_CHECK([whether system header files limit the line length], [gl_cv_pragma_columns], [dnl HP NonStop systems, which define __TANDEM, have this misfeature. AC_EGREP_CPP([choke me], [ #ifdef __TANDEM choke me #endif ], [gl_cv_pragma_columns=yes], [gl_cv_pragma_columns=no]) ]) if test $gl_cv_pragma_columns = yes; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi AC_SUBST([PRAGMA_COLUMNS]) ]) # gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------------ # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be # ''; otherwise define it to be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # Also, if #include_next works as first preprocessing directive in a file, # define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be ''; otherwise define it to # be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # That way, a header file with the following line: # #@INCLUDE_NEXT@ @NEXT_FOO_H@ # or # #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@ # behaves (after sed substitution) as if it contained # #include_next # even if the compiler does not support include_next. # The three "///" are to pacify Sun C 5.8, which otherwise would say # "warning: #include of /usr/include/... may be non-portable". # Use '""', not '<>', so that the /// cannot be confused with a C99 comment. # Note: This macro assumes that the header file is not empty after # preprocessing, i.e. it does not only define preprocessor macros but also # provides some type/enum definitions or function/variable declarations. # # This macro also checks whether each header exists, by invoking # AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument. AC_DEFUN([gl_CHECK_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [check]) ]) # gl_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------ # Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist. # This is suitable for headers like that are standardized by C89 # and therefore can be assumed to exist. AC_DEFUN([gl_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [assume]) ]) # The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS. AC_DEFUN([gl_NEXT_HEADERS_INTERNAL], [ AC_REQUIRE([gl_INCLUDE_NEXT]) AC_REQUIRE([AC_CANONICAL_HOST]) m4_if([$2], [check], [AC_CHECK_HEADERS_ONCE([$1]) ]) dnl FIXME: gl_next_header and gl_header_exists must be used unquoted dnl until we can assume autoconf 2.64 or newer. m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_next_header], [gl_cv_next_]m4_defn([gl_HEADER_NAME])) if test $gl_cv_have_include_next = yes; then AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>']) else AC_CACHE_CHECK( [absolute name of <]m4_defn([gl_HEADER_NAME])[>], m4_defn([gl_next_header]), [m4_if([$2], [check], [AS_VAR_PUSHDEF([gl_header_exists], [ac_cv_header_]m4_defn([gl_HEADER_NAME])) if test AS_VAR_GET(gl_header_exists) = yes; then AS_VAR_POPDEF([gl_header_exists]) ]) AC_LANG_CONFTEST( [AC_LANG_SOURCE( [[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]] )]) dnl AIX "xlc -E" and "cc -E" omit #line directives for header dnl files that contain only a #include of other header files and dnl no non-comment tokens of their own. This leads to a failure dnl to detect the absolute name of , , dnl and others. The workaround is to force preservation dnl of comments through option -C. This ensures all necessary dnl #line directives are present. GCC supports option -C as well. case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac changequote(,) case "$host_os" in mingw*) dnl For the sake of native Windows compilers (excluding gcc), dnl treat backslash as a directory separator, like /. dnl Actually, these compilers use a double-backslash as dnl directory separator, inside the dnl # line "filename" dnl directives. gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac dnl A sed expression that turns a string into a basic regular dnl expression, for use within "/.../". gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' changequote([,]) gl_header_literal_regex=`echo ']m4_defn([gl_HEADER_NAME])[' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ changequote(,)dnl s|^/[^/]|//&| changequote([,])dnl p q }' dnl eval is necessary to expand gl_absname_cpp. dnl Ultrix and Pyramid sh refuse to redirect output of eval, dnl so use subshell. AS_VAR_SET(gl_next_header, ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | sed -n "$gl_absolute_header_sed"`'"']) m4_if([$2], [check], [else AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>']) fi ]) ]) fi AC_SUBST( AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])), [AS_VAR_GET(gl_next_header)]) if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'gl_HEADER_NAME'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=AS_VAR_GET(gl_next_header) fi AC_SUBST( AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])), [$gl_next_as_first_directive]) AS_VAR_POPDEF([gl_next_header])]) ]) # Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE; # this fallback is safe for all earlier autoconf versions. m4_define_default([AC_LANG_DEFINES_PROVIDED]) shishi-1.0.2/gl/m4/valgrind-tests.m40000644000000000000000000000221412126660053014022 00000000000000# valgrind-tests.m4 serial 3 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # gl_VALGRIND_TESTS() # ------------------- # Check if valgrind is available, and set VALGRIND to it if available. AC_DEFUN([gl_VALGRIND_TESTS], [ AC_ARG_ENABLE(valgrind-tests, AS_HELP_STRING([--enable-valgrind-tests], [run self tests under valgrind]), [opt_valgrind_tests=$enableval], [opt_valgrind_tests=yes]) # Run self-tests under valgrind? if test "$opt_valgrind_tests" = "yes" && test "$cross_compiling" = no; then AC_CHECK_PROGS(VALGRIND, valgrind) fi OPTS="-q --error-exitcode=1 --leak-check=no" if test -n "$VALGRIND" \ && $VALGRIND $OPTS $SHELL -c 'exit 0' > /dev/null 2>&1; then opt_valgrind_tests=yes VALGRIND="$VALGRIND $OPTS" else opt_valgrind_tests=no VALGRIND= fi AC_MSG_CHECKING([whether self tests are run under valgrind]) AC_MSG_RESULT($opt_valgrind_tests) ]) shishi-1.0.2/gl/m4/exponentd.m40000644000000000000000000000755212126660052013071 00000000000000# exponentd.m4 serial 3 dnl Copyright (C) 2007-2008, 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION], [ AC_CACHE_CHECK([where to find the exponent in a 'double'], [gl_cv_cc_double_expbit0], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } ]])], [gl_cv_cc_double_expbit0=`cat conftest.out`], [gl_cv_cc_double_expbit0="unknown"], [ dnl On ARM, there are two 'double' floating-point formats, used by dnl different sets of instructions: The older FPA instructions assume dnl that they are stored in big-endian word order, while the words dnl (like integer types) are stored in little-endian byte order. dnl The newer VFP instructions assume little-endian order dnl consistently. AC_EGREP_CPP([mixed_endianness], [ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif ], [gl_cv_cc_double_expbit0="unknown"], [ pushdef([AC_MSG_CHECKING],[:])dnl pushdef([AC_MSG_RESULT],[:])dnl pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl AC_C_BIGENDIAN( [gl_cv_cc_double_expbit0="word 0 bit 20"], [gl_cv_cc_double_expbit0="word 1 bit 20"], [gl_cv_cc_double_expbit0="unknown"]) popdef([AC_MSG_RESULT_UNQUOTED])dnl popdef([AC_MSG_RESULT])dnl popdef([AC_MSG_CHECKING])dnl ]) ]) rm -f conftest.out ]) case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word], [Define as the word index where to find the exponent of 'double'.]) AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit], [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.]) ;; esac ]) shishi-1.0.2/gl/m4/inet_ntop.m40000644000000000000000000000415212126660052013055 00000000000000# inet_ntop.m4 serial 19 dnl Copyright (C) 2005-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_INET_NTOP], [ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) dnl Persuade Solaris to declare inet_ntop. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_C_RESTRICT]) dnl Most platforms that provide inet_ntop define it in libc. dnl Solaris 8..10 provide inet_ntop in libnsl instead. dnl Solaris 2.6..7 provide inet_ntop in libresolv instead. dnl Native Windows provides it in -lws2_32 instead, with a declaration in dnl , and it uses stdcall calling convention, not cdecl dnl (hence we cannot use AC_CHECK_FUNCS, AC_SEARCH_LIBS to find it). HAVE_INET_NTOP=1 INET_NTOP_LIB= gl_PREREQ_SYS_H_WINSOCK2 if test $HAVE_WINSOCK2_H = 1; then AC_CHECK_DECLS([inet_ntop],,, [[#include ]]) if test $ac_cv_have_decl_inet_ntop = yes; then dnl It needs to be overridden, because the stdcall calling convention dnl is not compliant with POSIX. REPLACE_INET_NTOP=1 INET_NTOP_LIB="-lws2_32" else HAVE_DECL_INET_NTOP=0 HAVE_INET_NTOP=0 fi else gl_save_LIBS=$LIBS AC_SEARCH_LIBS([inet_ntop], [nsl resolv], [], [AC_CHECK_FUNCS([inet_ntop]) if test $ac_cv_func_inet_ntop = no; then HAVE_INET_NTOP=0 fi ]) LIBS=$gl_save_LIBS if test "$ac_cv_search_inet_ntop" != "no" \ && test "$ac_cv_search_inet_ntop" != "none required"; then INET_NTOP_LIB="$ac_cv_search_inet_ntop" fi AC_CHECK_HEADERS_ONCE([netdb.h]) AC_CHECK_DECLS([inet_ntop],,, [[#include #if HAVE_NETDB_H # include #endif ]]) if test $ac_cv_have_decl_inet_ntop = no; then HAVE_DECL_INET_NTOP=0 fi fi AC_SUBST([INET_NTOP_LIB]) ]) # Prerequisites of lib/inet_ntop.c. AC_DEFUN([gl_PREREQ_INET_NTOP], [ AC_REQUIRE([gl_SOCKET_FAMILIES]) ]) shishi-1.0.2/gl/m4/getsubopt.m40000644000000000000000000000117612126660052013075 00000000000000# getsubopt.m4 serial 5 dnl Copyright (C) 2004, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_GETSUBOPT], [ dnl Persuade glibc to declare getsubopt(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([getsubopt]) if test $ac_cv_func_getsubopt = no; then HAVE_GETSUBOPT=0 fi ]) # Prerequisites of lib/getsubopt.c. AC_DEFUN([gl_PREREQ_GETSUBOPT], [:]) shishi-1.0.2/gl/m4/float_h.m40000644000000000000000000000466312126660052012501 00000000000000# float_h.m4 serial 9 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FLOAT_H], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) FLOAT_H= REPLACE_FLOAT_LDBL=0 case "$host_os" in aix* | beos* | openbsd* | mirbsd* | irix*) FLOAT_H=float.h ;; freebsd*) case "$host_cpu" in changequote(,)dnl i[34567]86 ) changequote([,])dnl FLOAT_H=float.h ;; x86_64 ) # On x86_64 systems, the C compiler may still be generating # 32-bit code. AC_EGREP_CPP([yes], [#if defined __LP64__ || defined __x86_64__ || defined __amd64__ yes #endif], [], [FLOAT_H=float.h]) ;; esac ;; linux*) case "$host_cpu" in powerpc*) FLOAT_H=float.h ;; esac ;; esac case "$host_os" in aix* | freebsd* | linux*) if test -n "$FLOAT_H"; then REPLACE_FLOAT_LDBL=1 fi ;; esac dnl Test against glibc-2.7 Linux/SPARC64 bug. REPLACE_ITOLD=0 AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works], [gl_cv_func_itold_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ int i = -1; volatile long double ld; int main () { ld += i * 1.0L; if (ld > 0) return 1; return 0; }]])], [gl_cv_func_itold_works=yes], [gl_cv_func_itold_works=no], [case "$host" in sparc*-*-linux*) AC_EGREP_CPP([yes], [#if defined __LP64__ || defined __arch64__ yes #endif], [gl_cv_func_itold_works="guessing no"], [gl_cv_func_itold_works="guessing yes"]) ;; *) gl_cv_func_itold_works="guessing yes" ;; esac ]) ]) case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 dnl We add the workaround to but also to , dnl to increase the chances that the fix function gets pulled in. FLOAT_H=float.h ;; esac if test -n "$FLOAT_H"; then gl_NEXT_HEADERS([float.h]) fi AC_SUBST([FLOAT_H]) AM_CONDITIONAL([GL_GENERATE_FLOAT_H], [test -n "$FLOAT_H"]) AC_SUBST([REPLACE_ITOLD]) ]) shishi-1.0.2/gl/m4/memxor.m40000644000000000000000000000052212126660052012362 00000000000000# memxor.m4 serial 4 dnl Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MEMXOR], [ AC_REQUIRE([AC_C_RESTRICT]) ]) shishi-1.0.2/gl/m4/tm_gmtoff.m40000644000000000000000000000103512126660053013036 00000000000000# tm_gmtoff.m4 serial 3 dnl Copyright (C) 2002, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_TM_GMTOFF], [ AC_CHECK_MEMBER([struct tm.tm_gmtoff], [AC_DEFINE([HAVE_TM_GMTOFF], [1], [Define if struct tm has the tm_gmtoff member.])], , [#include ]) ]) shishi-1.0.2/gl/m4/sockets.m40000644000000000000000000000070712126660052012533 00000000000000# sockets.m4 serial 7 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SOCKETS], [ AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([gl_SOCKETLIB]) gl_PREREQ_SOCKETS ]) # Prerequisites of lib/sockets.c. AC_DEFUN([gl_PREREQ_SOCKETS], [ : ]) shishi-1.0.2/gl/m4/gethostname.m40000644000000000000000000000660612126660052013402 00000000000000# gethostname.m4 serial 13 dnl Copyright (C) 2002, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Ensure # - the gethostname() function, # - the HOST_NAME_MAX macro in . AC_DEFUN([gl_FUNC_GETHOSTNAME], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_PREREQ_SYS_H_WINSOCK2 dnl Where is gethostname() defined? dnl - On native Windows, it is in ws2_32.dll. dnl - Otherwise it is in libc. GETHOSTNAME_LIB= AC_CHECK_FUNCS([gethostname], , [ AC_CACHE_CHECK([for gethostname in winsock2.h and -lws2_32], [gl_cv_w32_gethostname], [gl_cv_w32_gethostname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_WINSOCK2_H #include #endif #include ]], [[gethostname(NULL, 0);]])], [gl_cv_w32_gethostname=yes]) LIBS="$gl_save_LIBS" ]) if test "$gl_cv_w32_gethostname" = "yes"; then GETHOSTNAME_LIB="-lws2_32" fi ]) AC_SUBST([GETHOSTNAME_LIB]) if test "$ac_cv_func_gethostname" = no; then HAVE_GETHOSTNAME=0 fi gl_PREREQ_HOST_NAME_MAX ]) # Provide HOST_NAME_MAX when lacks it. AC_DEFUN([gl_PREREQ_HOST_NAME_MAX], [ dnl - On most Unix systems, use MAXHOSTNAMELEN from instead. dnl - On Solaris, Cygwin, BeOS, use MAXHOSTNAMELEN from instead. dnl - On mingw, use 256, because dnl says: dnl "if a buffer of 256 bytes is passed in the name parameter and dnl the namelen parameter is set to 256, the buffer size will always dnl be adequate." dnl With this, there is no need to use sysconf (_SC_HOST_NAME_MAX), which dnl is not a compile-time constant. dnl We cannot override using the usual technique, because dnl gl_CHECK_NEXT_HEADERS does not work for . Therefore retrieve dnl the value of HOST_NAME_MAX at configure time. AC_CHECK_HEADERS_ONCE([sys/param.h]) AC_CHECK_HEADERS_ONCE([sys/socket.h]) AC_CHECK_HEADERS_ONCE([netdb.h]) AC_CACHE_CHECK([for HOST_NAME_MAX], [gl_cv_decl_HOST_NAME_MAX], [ gl_cv_decl_HOST_NAME_MAX= AC_EGREP_CPP([lucky], [ #include #ifdef HOST_NAME_MAX lucky #endif ], [gl_cv_decl_HOST_NAME_MAX=yes]) if test -z "$gl_cv_decl_HOST_NAME_MAX"; then dnl It's not defined in . Substitute it. if test "$gl_cv_w32_gethostname" = yes; then dnl mingw. gl_cv_decl_HOST_NAME_MAX=256 else _AC_COMPUTE_INT([MAXHOSTNAMELEN], [gl_cv_decl_HOST_NAME_MAX], [ #include #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETDB_H # include #endif ], [dnl The system does not define MAXHOSTNAMELEN in any of the common dnl headers. Use a safe fallback. gl_cv_decl_HOST_NAME_MAX=256 ]) fi fi ]) if test "$gl_cv_decl_HOST_NAME_MAX" != yes; then AC_DEFINE_UNQUOTED([HOST_NAME_MAX], [$gl_cv_decl_HOST_NAME_MAX], [Define HOST_NAME_MAX when does not define it.]) fi ]) # Prerequisites of lib/gethostname.c. AC_DEFUN([gl_PREREQ_GETHOSTNAME], [ if test "$gl_cv_w32_gethostname" != "yes"; then AC_CHECK_FUNCS([uname]) fi ]) shishi-1.0.2/gl/m4/ld-version-script.m40000644000000000000000000000336412126660052014446 00000000000000# ld-version-script.m4 serial 3 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # FIXME: The test below returns a false positive for mingw # cross-compiles, 'local:' statements does not reduce number of # exported symbols in a DLL. Use --disable-ld-version-script to work # around the problem. # gl_LD_VERSION_SCRIPT # -------------------- # Check if LD supports linker scripts, and define automake conditional # HAVE_LD_VERSION_SCRIPT if so. AC_DEFUN([gl_LD_VERSION_SCRIPT], [ AC_ARG_ENABLE([ld-version-script], AS_HELP_STRING([--enable-ld-version-script], [enable linker version script (default is enabled when possible)]), [have_ld_version_script=$enableval], []) if test -z "$have_ld_version_script"; then AC_MSG_CHECKING([if LD -Wl,--version-script works]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" cat > conftest.map < conftest.map < ]], [fcntl openat]) ]) AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_FCNTL_H_DEFAULTS], [ GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL]) GNULIB_NONBLOCKING=0; AC_SUBST([GNULIB_NONBLOCKING]) GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL]) HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL]) REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT]) ]) shishi-1.0.2/gl/m4/printf.m40000644000000000000000000016635012126660052012371 00000000000000# printf.m4 serial 50 dnl Copyright (C) 2003, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test whether the *printf family of functions supports the 'j', 'z', 't', dnl 'L' size specifiers. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_sizes_c99. AC_DEFUN([gl_PRINTF_SIZES_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports size specifiers as in C99], [gl_cv_func_printf_sizes_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif static char buf[100]; int main () { int result = 0; #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX buf[0] = '\0'; if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 || strcmp (buf, "12345671 33") != 0) result |= 1; #endif buf[0] = '\0'; if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 || strcmp (buf, "12345672 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 || strcmp (buf, "12345673 33") != 0) result |= 4; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 || strcmp (buf, "1.5 33") != 0) result |= 8; return result; }]])], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_printf_sizes_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_printf_sizes_c99="guessing no";; openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_sizes_c99="guessing no";; netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_printf_sizes_c99="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports 'long double' dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_long_double. AC_DEFUN([gl_PRINTF_LONG_DOUBLE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports 'long double' arguments], [gl_cv_func_printf_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[10000]; int main () { int result = 0; buf[0] = '\0'; if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000 33") != 0) result |= 1; buf[0] = '\0'; if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000e+00 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.75 33") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no], [ changequote(,)dnl case "$host_os" in beos*) gl_cv_func_printf_long_double="guessing no";; mingw* | pw*) gl_cv_func_printf_long_double="guessing no";; *) gl_cv_func_printf_long_double="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'double' arguments and negative zero arguments in the %f, %e, %g dnl directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite. AC_DEFUN([gl_PRINTF_INFINITE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports infinite 'double' arguments], [gl_cv_func_printf_infinite], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static int have_minus_zero () { static double plus_zero = 0.0; double minus_zero = - plus_zero; return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; } static char buf[10000]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%f", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%f", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%f", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%e", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 4; if (sprintf (buf, "%e", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 4; if (sprintf (buf, "%e", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%g", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 16; if (sprintf (buf, "%g", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 16; if (sprintf (buf, "%g", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; /* This test fails on HP-UX 10.20. */ if (have_minus_zero ()) if (sprintf (buf, "%g", - zero) < 0 || strcmp (buf, "-0") != 0) result |= 64; return result; }]])], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; darwin*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; hpux*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_infinite="guessing no";; netbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_infinite="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_printf_infinite="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite_long_double. AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl The user can set or unset the variable gl_printf_safe to indicate dnl that he wishes a safe handling of non-IEEE-754 'long double' values. if test -n "$gl_printf_safe"; then AC_DEFINE([CHECK_PRINTF_SAFE], [1], [Define if you wish *printf() functions that have a safe handling of non-IEEE-754 'long double' values.]) fi case "$gl_cv_func_printf_long_double" in *yes) AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments], [gl_cv_func_printf_infinite_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ ]GL_NOCRASH[ #include #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static char buf[10000]; static long double zeroL = 0.0L; int main () { int result = 0; nocrash_init(); if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Signalling NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Pseudo-NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 4; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 4; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 4; } { /* Pseudo-Infinity. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; } { /* Pseudo-Zero. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 16; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 16; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 16; } { /* Unnormalized number. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; } { /* Pseudo-Denormal. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 64; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 64; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 64; } #endif return result; }]])], [gl_cv_func_printf_infinite_long_double=yes], [gl_cv_func_printf_infinite_long_double=no], [ changequote(,)dnl case "$host_cpu" in # Guess no on ia64, x86_64, i386. ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; *) case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_printf_infinite_long_double="guessing no";; esac ;; esac changequote([,])dnl ]) ]) ;; *) gl_cv_func_printf_infinite_long_double="irrelevant" ;; esac ]) dnl Test whether the *printf family of functions supports the 'a' and 'A' dnl conversion specifier for hexadecimal output of floating-point numbers. dnl (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_a. AC_DEFUN([gl_PRINTF_DIRECTIVE_A], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives], [gl_cv_func_printf_directive_a], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "0x1.922p+1 33") != 0 && strcmp (buf, "0x3.244p+0 33") != 0 && strcmp (buf, "0x6.488p-1 33") != 0 && strcmp (buf, "0xc.91p-2 33") != 0)) result |= 1; if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "-0X1.922P+1 33") != 0 && strcmp (buf, "-0X3.244P+0 33") != 0 && strcmp (buf, "-0X6.488P-1 33") != 0 && strcmp (buf, "-0XC.91P-2 33") != 0)) result |= 2; /* This catches a FreeBSD 6.1 bug: it doesn't round. */ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x1.83p+0 33") != 0 && strcmp (buf, "0x3.05p-1 33") != 0 && strcmp (buf, "0x6.0ap-2 33") != 0 && strcmp (buf, "0xc.14p-3 33") != 0)) result |= 4; /* This catches a FreeBSD 6.1 bug. See */ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 || buf[0] == '0') result |= 8; /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ if (sprintf (buf, "%.1a", 1.999) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 16; /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a glibc 2.4 bug . */ if (sprintf (buf, "%.1La", 1.999L) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 32; return result; }]])], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no], [ case "$host_os" in # Guess yes on glibc >= 2.5 systems. *-gnu*) AC_EGREP_CPP([BZ2908], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ BZ2908 #endif #endif ], [gl_cv_func_printf_directive_a="guessing yes"], [gl_cv_func_printf_directive_a="guessing no"]) ;; # If we don't know, assume the worst. *) gl_cv_func_printf_directive_a="guessing no";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %F format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_f. AC_DEFUN([gl_PRINTF_DIRECTIVE_F], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'F' directive], [gl_cv_func_printf_directive_f], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 || strcmp (buf, "1234567.000000 33") != 0) result |= 1; if (sprintf (buf, "%F", 1.0 / zero) < 0 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) result |= 2; /* This catches a Cygwin 1.5.x bug. */ if (sprintf (buf, "%.F", 1234.0) < 0 || strcmp (buf, "1234") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; darwin*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # If we don't know, assume the worst. *) gl_cv_func_printf_directive_f="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports the %n format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_n. AC_DEFUN([gl_PRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'n' directive], [gl_cv_func_printf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #ifdef _MSC_VER /* See page about "Parameter Validation" on msdn.microsoft.com. */ static void cdecl invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { exit (1); } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; #ifdef _MSC_VER _set_invalid_parameter_handler (invalid_parameter_handler); #endif /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 || strcmp (buf, "123 ") != 0 || count != 4) return 1; return 0; }]])], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no], [ changequote(,)dnl case "$host_os" in mingw*) gl_cv_func_printf_directive_n="guessing no";; *) gl_cv_func_printf_directive_n="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports the %ls format dnl directive and in particular, when a precision is specified, whether dnl the functions stop converting the wide string argument when the number dnl of bytes that have been produced by this conversion equals or exceeds dnl the precision. dnl Result is gl_cv_func_printf_directive_ls. AC_DEFUN([gl_PRINTF_DIRECTIVE_LS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'ls' directive], [gl_cv_func_printf_directive_ls], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include #include int main () { int result = 0; char buf[100]; /* Test whether %ls works at all. This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on Cygwin 1.5. */ { static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "abc") != 0) result |= 1; } /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an assertion failure inside libc), but not on OpenBSD 4.0. */ { static const wchar_t wstring[] = { 'a', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "a") != 0) result |= 2; } /* Test whether precisions in %ls are supported as specified in ISO C 99 section 7.19.6.1: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." This test fails on Solaris 10. */ { static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; buf[0] = '\0'; if (sprintf (buf, "%.2ls", wstring) < 0 || strcmp (buf, "ab") != 0) result |= 8; } return result; }]])], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no], [ changequote(,)dnl case "$host_os" in openbsd*) gl_cv_func_printf_directive_ls="guessing no";; irix*) gl_cv_func_printf_directive_ls="guessing no";; solaris*) gl_cv_func_printf_directive_ls="guessing no";; cygwin*) gl_cv_func_printf_directive_ls="guessing no";; beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; *) gl_cv_func_printf_directive_ls="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with positions. (POSIX:2001) dnl Result is gl_cv_func_printf_positions. AC_DEFUN([gl_PRINTF_POSITIONS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions], [gl_cv_func_printf_positions], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }]])], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no], [ changequote(,)dnl case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001) dnl Result is gl_cv_func_printf_flag_grouping. AC_DEFUN([gl_PRINTF_FLAG_GROUPING], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the grouping flag], [gl_cv_func_printf_flag_grouping], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { if (sprintf (buf, "%'d %d", 1234567, 99) < 0 || buf[strlen (buf) - 1] != '9') return 1; return 0; }]])], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no], [ changequote(,)dnl case "$host_os" in cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; *) gl_cv_func_printf_flag_grouping="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports the - flag correctly. dnl (ISO C99.) See dnl dnl Result is gl_cv_func_printf_flag_leftadjust. AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly], [gl_cv_func_printf_flag_leftadjust], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { /* Check that a '-' flag is not annihilated by a negative width. */ if (sprintf (buf, "a%-*sc", -3, "b") < 0 || strcmp (buf, "ab c") != 0) return 1; return 0; }]])], [gl_cv_func_printf_flag_leftadjust=yes], [gl_cv_func_printf_flag_leftadjust=no], [ changequote(,)dnl case "$host_os" in # Guess yes on HP-UX 11. hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess no on HP-UX 10 and older. hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; # Guess yes otherwise. *) gl_cv_func_printf_flag_leftadjust="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports padding of non-finite dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See dnl dnl Result is gl_cv_func_printf_flag_zero. AC_DEFUN([gl_PRINTF_FLAG_ZERO], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the zero flag correctly], [gl_cv_func_printf_flag_zero], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 || (strcmp (buf, " inf") != 0 && strcmp (buf, " infinity") != 0)) return 1; return 0; }]])], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_flag_zero="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_printf_flag_zero="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports large precisions. dnl On mingw, precisions larger than 512 are treated like 512, in integer, dnl floating-point or pointer output. On Solaris 10/x86, precisions larger dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC, dnl precisions larger than 510 in floating-point output yield wrong results. dnl On AIX 7.1, precisions larger than 998 in floating-point output yield dnl wrong results. On BeOS, precisions larger than 1044 crash the program. dnl Result is gl_cv_func_printf_precision. AC_DEFUN([gl_PRINTF_PRECISION], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports large precisions], [gl_cv_func_printf_precision], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[5000]; int main () { int result = 0; #ifdef __BEOS__ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ return 1; #endif if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) result |= 1; if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) result |= 2; if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 || buf[0] != '1') result |= 4; if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 || buf[0] != '1') result |= 4; return result; }]])], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no], [ changequote(,)dnl case "$host_os" in # Guess no only on Solaris, native Windows, and BeOS systems. solaris*) gl_cv_func_printf_precision="guessing no" ;; mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; beos*) gl_cv_func_printf_precision="guessing no" ;; *) gl_cv_func_printf_precision="guessing yes" ;; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions recovers gracefully in case dnl of an out-of-memory condition, or whether it crashes the entire program. dnl Result is gl_cv_func_printf_enomem. AC_DEFUN([gl_PRINTF_ENOMEM], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_MULTIARCH]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf survives out-of-memory conditions], [gl_cv_func_printf_enomem], [ gl_cv_func_printf_enomem="guessing no" if test "$cross_compiling" = no; then if test $APPLE_UNIVERSAL_BUILD = 0; then AC_LANG_CONFTEST([AC_LANG_SOURCE([ ]GL_NOCRASH[ changequote(,)dnl #include #include #include #include #include int main() { struct rlimit limit; int ret; nocrash_init (); /* Some printf implementations allocate temporary space with malloc. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ #ifdef RLIMIT_DATA if (getrlimit (RLIMIT_DATA, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_DATA, &limit) < 0) return 77; #endif /* On Linux systems, malloc() is limited by RLIMIT_AS. */ #ifdef RLIMIT_AS if (getrlimit (RLIMIT_AS, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_AS, &limit) < 0) return 77; #endif /* Some printf implementations allocate temporary space on the stack. */ #ifdef RLIMIT_STACK if (getrlimit (RLIMIT_STACK, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_STACK, &limit) < 0) return 77; #endif ret = printf ("%.5000000f", 1.0); return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); } changequote([,])dnl ])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then (./conftest 2>&AS_MESSAGE_LOG_FD result=$? _AS_ECHO_LOG([\$? = $result]) if test $result != 0 && test $result != 77; then result=1; fi exit $result ) >/dev/null 2>/dev/null case $? in 0) gl_cv_func_printf_enomem="yes" ;; 77) gl_cv_func_printf_enomem="guessing no" ;; *) gl_cv_func_printf_enomem="no" ;; esac else gl_cv_func_printf_enomem="guessing no" fi rm -fr conftest* else dnl A universal build on Apple Mac OS X platforms. dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode. dnl But we need a configuration result that is valid in both modes. gl_cv_func_printf_enomem="guessing no" fi fi if test "$gl_cv_func_printf_enomem" = "guessing no"; then changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Solaris. solaris*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on AIX. aix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on HP-UX/hppa. hpux*) case "$host_cpu" in hppa*) gl_cv_func_printf_enomem="guessing yes";; *) gl_cv_func_printf_enomem="guessing no";; esac ;; # Guess yes on IRIX. irix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on OSF/1. osf*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Haiku. haiku*) gl_cv_func_printf_enomem="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_printf_enomem="guessing no";; esac changequote([,])dnl fi ]) ]) dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001) dnl Result is ac_cv_func_snprintf. AC_DEFUN([gl_SNPRINTF_PRESENCE], [ AC_CHECK_FUNCS_ONCE([snprintf]) ]) dnl Test whether the string produced by the snprintf function is always NUL dnl terminated. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_truncation_c99. AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf truncates the result as in C99], [gl_cv_func_snprintf_truncation_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; }]])], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_snprintf_truncation_c99="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the return value of the snprintf function is the number dnl of bytes (excluding the terminating NUL) that would have been produced dnl if the buffer had been large enough. (ISO C99, POSIX:2001) dnl For example, this test program fails on IRIX 6.5: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8]; dnl int retval = snprintf (buf, 3, "%d", 12345); dnl return retval >= 0 && retval < 3; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_snprintf_retval_c99. AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf returns a byte count as in C99], [gl_cv_func_snprintf_retval_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; }]])], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_snprintf_retval_c99="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the snprintf function supports the %n format directive dnl also in truncated portions of the format string. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_directive_n. AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive], [gl_cv_func_snprintf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); if (count != 6) return 1; return 0; }]])], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_directive_n="guessing no";; solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; aix*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; osf*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_directive_n="guessing no";; netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_directive_n="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_snprintf_directive_n="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the snprintf function, when passed a size = 1, writes any dnl output without bounds in this case, behaving like sprintf. This is the dnl case on Linux libc5. dnl Result is gl_cv_func_snprintf_size1. AC_DEFUN([gl_SNPRINTF_SIZE1], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf respects a size of 1], [gl_cv_func_snprintf_size1], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; }]])], [gl_cv_func_snprintf_size1=yes], [gl_cv_func_snprintf_size1=no], [gl_cv_func_snprintf_size1="guessing yes"]) ]) ]) dnl Test whether the vsnprintf function, when passed a zero size, produces no dnl output. (ISO C99, POSIX:2001) dnl For example, snprintf nevertheless writes a NUL byte in this case dnl on OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl And vsnprintf writes any output without bounds in this case, behaving like dnl vsprintf, on HP-UX 11 and OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl #include dnl static int my_snprintf (char *buf, int size, const char *format, ...) dnl { dnl va_list args; dnl int ret; dnl va_start (args, format); dnl ret = vsnprintf (buf, size, format, args); dnl va_end (args); dnl return ret; dnl } dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl my_snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_vsnprintf_zerosize_c99. AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99], [gl_cv_func_vsnprintf_zerosize_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 0, "%d", 12345); return buf[0] != 'D'; }]])], [gl_cv_func_vsnprintf_zerosize_c99=yes], [gl_cv_func_vsnprintf_zerosize_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on mingw. mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # If we don't know, assume the worst. *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; esac changequote([,])dnl ]) ]) ]) dnl The results of these tests on various platforms are: dnl dnl 1 = gl_PRINTF_SIZES_C99 dnl 2 = gl_PRINTF_LONG_DOUBLE dnl 3 = gl_PRINTF_INFINITE dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE dnl 5 = gl_PRINTF_DIRECTIVE_A dnl 6 = gl_PRINTF_DIRECTIVE_F dnl 7 = gl_PRINTF_DIRECTIVE_N dnl 8 = gl_PRINTF_DIRECTIVE_LS dnl 9 = gl_PRINTF_POSITIONS dnl 10 = gl_PRINTF_FLAG_GROUPING dnl 11 = gl_PRINTF_FLAG_LEFTADJUST dnl 12 = gl_PRINTF_FLAG_ZERO dnl 13 = gl_PRINTF_PRECISION dnl 14 = gl_PRINTF_ENOMEM dnl 15 = gl_SNPRINTF_PRESENCE dnl 16 = gl_SNPRINTF_TRUNCATION_C99 dnl 17 = gl_SNPRINTF_RETVAL_C99 dnl 18 = gl_SNPRINTF_DIRECTIVE_N dnl 19 = gl_SNPRINTF_SIZE1 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99 dnl dnl 1 = checking whether printf supports size specifiers as in C99... dnl 2 = checking whether printf supports 'long double' arguments... dnl 3 = checking whether printf supports infinite 'double' arguments... dnl 4 = checking whether printf supports infinite 'long double' arguments... dnl 5 = checking whether printf supports the 'a' and 'A' directives... dnl 6 = checking whether printf supports the 'F' directive... dnl 7 = checking whether printf supports the 'n' directive... dnl 8 = checking whether printf supports the 'ls' directive... dnl 9 = checking whether printf supports POSIX/XSI format strings with positions... dnl 10 = checking whether printf supports the grouping flag... dnl 11 = checking whether printf supports the left-adjust flag correctly... dnl 12 = checking whether printf supports the zero flag correctly... dnl 13 = checking whether printf supports large precisions... dnl 14 = checking whether printf survives out-of-memory conditions... dnl 15 = checking for snprintf... dnl 16 = checking whether snprintf truncates the result as in C99... dnl 17 = checking whether snprintf returns a byte count as in C99... dnl 18 = checking whether snprintf fully supports the 'n' directive... dnl 19 = checking whether snprintf respects a size of 1... dnl 20 = checking whether vsnprintf respects a zero size as in C99... dnl dnl . = yes, # = no. dnl dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . . dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . . dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . . dnl Mac OS X 10.5.8 . . . # # . . . . . . # . . . . . . . . dnl Mac OS X 10.3.9 . . . . # . . . . . . # . # . . . . . . dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . . dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . . dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . . dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . . dnl Solaris 11 2011-11 . . # # # . . # . . . # . . . . . . . . dnl Solaris 10 . . # # # . . # . . . # # . . . . . . . dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . . dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # # dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . . dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . . dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . . dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . . dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . # dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? # dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . . dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . # dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # # dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . . dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ? dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . . dnl Haiku . . . # # # . # . . . . . ? . . ? . . . dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . . dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . . dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . . dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . . dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . . shishi-1.0.2/gl/m4/servent.m40000644000000000000000000000336212126660052012546 00000000000000# servent.m4 serial 2 dnl Copyright (C) 2008, 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SERVENT], [ dnl Where are getservent(), setservent(), endservent(), getservbyname(), dnl getservbyport() defined? dnl Where are getprotoent(), setprotoent(), endprotoent(), getprotobyname(), dnl getprotobynumber() defined? dnl - On Solaris, they are in libsocket. Ignore libxnet. dnl - On Haiku, they are in libnetwork. dnl - On BeOS, they are in libnet. dnl - On native Windows, they are in ws2_32.dll. dnl - Otherwise they are in libc. AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H SERVENT_LIB= gl_saved_libs="$LIBS" AC_SEARCH_LIBS([getservbyname], [socket network net], [if test "$ac_cv_search_getservbyname" != "none required"; then SERVENT_LIB="$ac_cv_search_getservbyname" fi]) LIBS="$gl_saved_libs" if test -z "$SERVENT_LIB"; then AC_CHECK_FUNCS([getservbyname], , [ AC_CACHE_CHECK([for getservbyname in winsock2.h and -lws2_32], [gl_cv_w32_getservbyname], [gl_cv_w32_getservbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #ifdef HAVE_WINSOCK2_H #include #endif #include ]], [[getservbyname(NULL,NULL);]])], [gl_cv_w32_getservbyname=yes]) LIBS="$gl_save_LIBS" ]) if test "$gl_cv_w32_getservbyname" = "yes"; then SERVENT_LIB="-lws2_32" fi ]) fi AC_SUBST([SERVENT_LIB]) ]) shishi-1.0.2/gl/m4/stat.m40000644000000000000000000000521412126660052012031 00000000000000# serial 11 # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([lstat]) dnl mingw is the only known platform where stat(".") and stat("./") differ AC_CACHE_CHECK([whether stat handles trailing slashes on directories], [gl_cv_func_stat_dir_slash], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[struct stat st; return stat (".", &st) != stat ("./", &st);]])], [gl_cv_func_stat_dir_slash=yes], [gl_cv_func_stat_dir_slash=no], [case $host_os in mingw*) gl_cv_func_stat_dir_slash="guessing no";; *) gl_cv_func_stat_dir_slash="guessing yes";; esac])]) dnl AIX 7.1, Solaris 9, mingw64 mistakenly succeed on stat("file/"). dnl (For mingw, this is due to a broken stat() override in libmingwex.a.) dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/"). AC_CACHE_CHECK([whether stat handles trailing slashes on files], [gl_cv_func_stat_file_slash], [touch conftest.tmp # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.tmp conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ]])], [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_stat_file_slash="guessing no" ;; esac ]) rm -f conftest.tmp conftest.lnk]) case $gl_cv_func_stat_dir_slash in *no) REPLACE_STAT=1 AC_DEFINE([REPLACE_FUNC_STAT_DIR], [1], [Define to 1 if stat needs help when passed a directory name with a trailing slash]);; esac case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs help when passed a file name with a trailing slash]);; esac ]) # Prerequisites of lib/stat.c. AC_DEFUN([gl_PREREQ_STAT], [:]) shishi-1.0.2/gl/m4/fstat.m40000644000000000000000000000164612126660052012204 00000000000000# fstat.m4 serial 4 dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSTAT], [ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_FSTAT=1 fi AC_REQUIRE([gl_HEADER_SYS_STAT_H]) if test $WINDOWS_64_BIT_ST_SIZE = 1; then REPLACE_FSTAT=1 fi dnl Replace fstat() for supporting the gnulib-defined open() on directories. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then case "$gl_cv_func_open_directory_works" in *yes) ;; *) REPLACE_FSTAT=1 ;; esac fi ]) ]) # Prerequisites of lib/fstat.c. AC_DEFUN([gl_PREREQ_FSTAT], [:]) shishi-1.0.2/gl/m4/getdomainname.m40000644000000000000000000000650012126660052013665 00000000000000# getdomainname.m4 serial 10 dnl Copyright (C) 2002-2003, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_GETDOMAINNAME], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H AC_REQUIRE([gl_HEADER_NETDB])dnl for HAVE_NETDB_H dnl Persuade glibc to declare getdomainname(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl Where is getdomainname() defined? dnl - On Solaris, it is in libnsl. But this function is not declared and dnl is discouraged, see dnl . dnl We need to avoid a collision with this function. dnl - Otherwise it is in libc. AC_CHECK_FUNCS([getdomainname], , [ AC_CACHE_CHECK([for getdomainname in -lnsl], [gl_cv_func_getdomainname_in_libnsl], [gl_cv_func_getdomainname_in_libnsl=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lnsl" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include extern #ifdef __cplusplus "C" #endif int getdomainname (char *, size_t); ]], [[getdomainname(NULL, 0);]])], [gl_cv_func_getdomainname_in_libnsl=yes]) LIBS="$gl_save_LIBS" ]) ]) dnl What about the declaration? dnl - It's int getdomainname(char *, size_t) on glibc, NetBSD, OpenBSD. dnl - It's int getdomainname(char *, int) on Mac OS X, FreeBSD, AIX, IRIX, dnl OSF/1. AC_CHECK_DECLS([getdomainname], , , [[#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include ]]) AC_CACHE_CHECK([for getdomainname's second argument type], [gl_cv_decl_getdomainname_argtype2], [if test $ac_cv_have_decl_getdomainname; then AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #include extern #ifdef __cplusplus "C" #endif int getdomainname (char *, int); ]], [[]])], [gl_cv_decl_getdomainname_argtype2='int'], [gl_cv_decl_getdomainname_argtype2='size_t']) else gl_cv_decl_getdomainname_argtype2='int' fi ]) if test $ac_cv_have_decl_getdomainname = no; then HAVE_DECL_GETDOMAINNAME=0 fi if { test $ac_cv_func_getdomainname = yes \ && test $gl_cv_decl_getdomainname_argtype2 != size_t; \ } \ || test "$gl_cv_func_getdomainname_in_libnsl" = yes; then REPLACE_GETDOMAINNAME=1 fi ]) # Prerequisites of lib/getdomainname.c. AC_DEFUN([gl_PREREQ_GETDOMAINNAME], [ if test $ac_cv_func_getdomainname = yes; then AC_DEFINE([HAVE_GETDOMAINNAME], [1], [Define if the getdomainname() function is present and can be used.]) fi AC_CHECK_HEADERS([sys/systeminfo.h]) AC_CHECK_FUNCS([sysinfo]) ]) shishi-1.0.2/gl/m4/setenv.m40000644000000000000000000001101212126660052012353 00000000000000# setenv.m4 serial 26 dnl Copyright (C) 2001-2004, 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SETENV], [ AC_REQUIRE([gl_FUNC_SETENV_SEPARATE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles if test $ac_cv_func_setenv = no; then HAVE_SETENV=0 else AC_CACHE_CHECK([whether setenv validates arguments], [gl_cv_func_setenv_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #include ]], [[ int result = 0; { if (setenv ("", "", 0) != -1) result |= 1; else if (errno != EINVAL) result |= 2; } { if (setenv ("a", "=", 1) != 0) result |= 4; else if (strcmp (getenv ("a"), "=") != 0) result |= 8; } return result; ]])], [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_setenv_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_setenv_works="guessing no" ;; esac ])]) case "$gl_cv_func_setenv_works" in *yes) ;; *) REPLACE_SETENV=1 ;; esac fi ]) # Like gl_FUNC_SETENV, except prepare for separate compilation # (no REPLACE_SETENV, no AC_LIBOBJ). AC_DEFUN([gl_FUNC_SETENV_SEPARATE], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([setenv]) if test $ac_cv_have_decl_setenv = no; then HAVE_DECL_SETENV=0 fi AC_CHECK_FUNCS_ONCE([setenv]) gl_PREREQ_SETENV ]) AC_DEFUN([gl_FUNC_UNSETENV], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_DECLS_ONCE([unsetenv]) if test $ac_cv_have_decl_unsetenv = no; then HAVE_DECL_UNSETENV=0 fi AC_CHECK_FUNCS([unsetenv]) if test $ac_cv_func_unsetenv = no; then HAVE_UNSETENV=0 else HAVE_UNSETENV=1 dnl Some BSDs return void, failing to do error checking. AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #undef _BSD #define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 */ #include extern #ifdef __cplusplus "C" #endif int unsetenv (const char *name); ]], [[]])], [gt_cv_func_unsetenv_ret='int'], [gt_cv_func_unsetenv_ret='void'])]) if test $gt_cv_func_unsetenv_ret = 'void'; then AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void instead of int.]) REPLACE_UNSETENV=1 fi dnl Solaris 10 unsetenv does not remove all copies of a name. dnl Haiku alpha 2 unsetenv gets confused by assignment to environ. dnl OpenBSD 4.7 unsetenv("") does not fail. AC_CACHE_CHECK([whether unsetenv obeys POSIX], [gl_cv_func_unsetenv_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include extern char **environ; ]], [[ char entry1[] = "a=1"; char entry2[] = "b=2"; char *env[] = { entry1, entry2, NULL }; if (putenv ((char *) "a=1")) return 1; if (putenv (entry2)) return 2; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 3; if (!unsetenv ("") || errno != EINVAL) return 4; entry2[0] = 'b'; environ = env; if (!getenv ("a")) return 5; entry2[0] = 'a'; unsetenv ("a"); if (getenv ("a")) return 6; ]])], [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_unsetenv_works="guessing no" ;; esac ])]) case "$gl_cv_func_unsetenv_works" in *yes) ;; *) REPLACE_UNSETENV=1 ;; esac fi ]) # Prerequisites of lib/setenv.c. AC_DEFUN([gl_PREREQ_SETENV], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_HEADERS([search.h]) AC_CHECK_FUNCS([tsearch]) ]) # Prerequisites of lib/unsetenv.c. AC_DEFUN([gl_PREREQ_UNSETENV], [ AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE([unistd.h]) ]) shishi-1.0.2/gl/m4/signal_h.m40000644000000000000000000000604212126660052012642 00000000000000# signal_h.m4 serial 18 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SIGNAL_H], [ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T]) gl_NEXT_HEADERS([signal.h]) # AIX declares sig_atomic_t to already include volatile, and C89 compilers # then choke on 'volatile sig_atomic_t'. C99 requires that it compile. AC_CHECK_TYPE([volatile sig_atomic_t], [], [HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0], [[ #include ]]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) AC_REQUIRE([AC_TYPE_UID_T]) dnl Persuade glibc to define sighandler_t. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_TYPE([sighandler_t], [], [HAVE_SIGHANDLER_T=0], [[ #include ]]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [pthread_sigmask sigaction sigaddset sigdelset sigemptyset sigfillset sigismember sigpending sigprocmask]) ]) AC_DEFUN([gl_CHECK_TYPE_SIGSET_T], [ AC_CHECK_TYPES([sigset_t], [gl_cv_type_sigset_t=yes], [gl_cv_type_sigset_t=no], [[ #include /* Mingw defines sigset_t not in , but in . */ #include ]]) if test $gl_cv_type_sigset_t != yes; then HAVE_SIGSET_T=0 fi ]) AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SIGNAL_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SIGNAL_H_DEFAULTS], [ GNULIB_PTHREAD_SIGMASK=0; AC_SUBST([GNULIB_PTHREAD_SIGMASK]) GNULIB_RAISE=0; AC_SUBST([GNULIB_RAISE]) GNULIB_SIGNAL_H_SIGPIPE=0; AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE]) GNULIB_SIGPROCMASK=0; AC_SUBST([GNULIB_SIGPROCMASK]) GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING]) HAVE_PTHREAD_SIGMASK=1; AC_SUBST([HAVE_PTHREAD_SIGMASK]) HAVE_RAISE=1; AC_SUBST([HAVE_RAISE]) HAVE_SIGSET_T=1; AC_SUBST([HAVE_SIGSET_T]) HAVE_SIGINFO_T=1; AC_SUBST([HAVE_SIGINFO_T]) HAVE_SIGACTION=1; AC_SUBST([HAVE_SIGACTION]) HAVE_STRUCT_SIGACTION_SA_SIGACTION=1; AC_SUBST([HAVE_STRUCT_SIGACTION_SA_SIGACTION]) HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1; AC_SUBST([HAVE_TYPE_VOLATILE_SIG_ATOMIC_T]) HAVE_SIGHANDLER_T=1; AC_SUBST([HAVE_SIGHANDLER_T]) REPLACE_PTHREAD_SIGMASK=0; AC_SUBST([REPLACE_PTHREAD_SIGMASK]) REPLACE_RAISE=0; AC_SUBST([REPLACE_RAISE]) ]) shishi-1.0.2/gl/m4/socklen.m40000644000000000000000000000623612126660052012521 00000000000000# socklen.m4 serial 10 dnl Copyright (C) 2005-2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Albert Chin, Windows fixes from Simon Josefsson. dnl Check for socklen_t: historically on BSD it is an int, and in dnl POSIX 1g it is a type of its own, but some platforms use different dnl types for the argument to getsockopt, getpeername, etc.: dnl HP-UX 10.20, IRIX 6.5, OSF/1 4.0, Interix 3.5, BeOS. dnl So we have to test to find something that will work. AC_DEFUN([gl_TYPE_SOCKLEN_T], [AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])dnl AC_CHECK_TYPE([socklen_t], , [AC_MSG_CHECKING([for socklen_t equivalent]) AC_CACHE_VAL([gl_cv_socklen_t_equiv], [# Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername gl_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t "unsigned int" "long int" "unsigned long int"; do AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include #include int getpeername (int, $arg2 *, $t *);]], [[$t len; getpeername (0, 0, &len);]])], [gl_cv_socklen_t_equiv="$t"]) test "$gl_cv_socklen_t_equiv" != "" && break done test "$gl_cv_socklen_t_equiv" != "" && break done ]) if test "$gl_cv_socklen_t_equiv" = ""; then AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) fi AC_MSG_RESULT([$gl_cv_socklen_t_equiv]) AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv], [type to use in place of socklen_t if not defined])], [gl_SOCKET_HEADERS])]) dnl On mingw32, socklen_t is in ws2tcpip.h ('int'), so we try to find dnl it there too. But on Cygwin, wc2tcpip.h must not be included. Users dnl of this module should use the same include pattern as gl_SOCKET_HEADERS. dnl When you change this macro, keep also in sync: dnl - gl_CHECK_SOCKET_HEADERS, dnl - the Include section of modules/socklen. AC_DEFUN([gl_SOCKET_HEADERS], [ /* is not needed according to POSIX, but the in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #if HAVE_SYS_SOCKET_H # include #elif HAVE_WS2TCPIP_H # include #endif ]) dnl Tests for the existence of the header for socket facilities. dnl Defines the C macros HAVE_SYS_SOCKET_H, HAVE_WS2TCPIP_H. dnl This macro must match gl_SOCKET_HEADERS. AC_DEFUN([gl_CHECK_SOCKET_HEADERS], [AC_CHECK_HEADERS_ONCE([sys/socket.h]) if test $ac_cv_header_sys_socket_h = no; then dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make dnl the check for those headers unconditional; yet cygwin reports dnl that the headers are present but cannot be compiled (since on dnl cygwin, all socket information should come from sys/socket.h). AC_CHECK_HEADERS([ws2tcpip.h]) fi ]) shishi-1.0.2/gl/m4/arpa_inet_h.m40000644000000000000000000000357112126660051013332 00000000000000# arpa_inet_h.m4 serial 13 dnl Copyright (C) 2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Simon Josefsson and Bruno Haible AC_DEFUN([gl_HEADER_ARPA_INET], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) AC_CHECK_HEADERS_ONCE([arpa/inet.h]) if test $ac_cv_header_arpa_inet_h = yes; then HAVE_ARPA_INET_H=1 else HAVE_ARPA_INET_H=0 fi AC_SUBST([HAVE_ARPA_INET_H]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([arpa/inet.h]) AC_REQUIRE([gl_FEATURES_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* On some systems, this header is not self-consistent. */ #if !(defined __GLIBC__ || defined __UCLIBC__) # include #endif #ifdef __TANDEM # include #endif #include ]], [inet_ntop inet_pton]) ]) AC_DEFUN([gl_ARPA_INET_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) AC_DEFUN([gl_ARPA_INET_H_DEFAULTS], [ GNULIB_INET_NTOP=0; AC_SUBST([GNULIB_INET_NTOP]) GNULIB_INET_PTON=0; AC_SUBST([GNULIB_INET_PTON]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_INET_NTOP=1; AC_SUBST([HAVE_DECL_INET_NTOP]) HAVE_DECL_INET_PTON=1; AC_SUBST([HAVE_DECL_INET_PTON]) REPLACE_INET_NTOP=0; AC_SUBST([REPLACE_INET_NTOP]) REPLACE_INET_PTON=0; AC_SUBST([REPLACE_INET_PTON]) ]) shishi-1.0.2/gl/m4/xstrndup.m40000644000000000000000000000063112126660053012744 00000000000000# xstrndup.m4 serial 2 dnl Copyright (C) 2003, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSTRNDUP], [ gl_PREREQ_XSTRNDUP ]) # Prerequisites of lib/xstrndup.c. AC_DEFUN([gl_PREREQ_XSTRNDUP], [ : ]) shishi-1.0.2/gl/m4/md5.m40000644000000000000000000000056712126660052011551 00000000000000# md5.m4 serial 13 dnl Copyright (C) 2002-2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MD5], [ dnl Prerequisites of lib/md5.c. AC_REQUIRE([gl_BIGENDIAN]) : ]) shishi-1.0.2/gl/m4/xvasprintf.m40000644000000000000000000000054312126660053013263 00000000000000# xvasprintf.m4 serial 2 dnl Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites of lib/xvasprintf.c. AC_DEFUN([gl_XVASPRINTF], [:]) shishi-1.0.2/gl/m4/intmax_t.m40000644000000000000000000000416612126660052012706 00000000000000# intmax_t.m4 serial 8 dnl Copyright (C) 1997-2004, 2006-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ([2.53]) # Define intmax_t to 'long' or 'long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_INTMAX_T], [ dnl For simplicity, we assume that a header file defines 'intmax_t' if and dnl only if it defines 'uintmax_t'. AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) test $ac_cv_type_long_long_int = yes \ && ac_type='long long' \ || ac_type='long' AC_DEFINE_UNQUOTED([intmax_t], [$ac_type], [Define to long or long long if and don't define.]) else AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) fi ]) dnl An alternative would be to explicitly test for 'intmax_t'. AC_DEFUN([gt_AC_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ]], [[intmax_t x = -1; return !x;]])], [gt_cv_c_intmax_t=yes], [gt_cv_c_intmax_t=no])]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) else AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) test $ac_cv_type_long_long_int = yes \ && ac_type='long long' \ || ac_type='long' AC_DEFINE_UNQUOTED([intmax_t], [$ac_type], [Define to long or long long if and don't define.]) fi ]) shishi-1.0.2/gl/m4/ftell.m40000644000000000000000000000100512126660052012156 00000000000000# ftell.m4 serial 3 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FTELL], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_FTELLO]) dnl When ftello needs fixes, ftell needs them too. if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then REPLACE_FTELL=1 fi ]) shishi-1.0.2/gl/m4/xalloc.m40000644000000000000000000000047212126660053012342 00000000000000# xalloc.m4 serial 18 dnl Copyright (C) 2002-2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XALLOC], [:]) shishi-1.0.2/gl/m4/sys_stat_h.m40000644000000000000000000000723612126660053013245 00000000000000# sys_stat_h.m4 serial 28 -*- Autoconf -*- dnl Copyright (C) 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Eric Blake. dnl Provide a GNU-like . AC_DEFUN([gl_HEADER_SYS_STAT_H], [ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) dnl Check for broken stat macros. AC_REQUIRE([AC_HEADER_STAT]) gl_CHECK_NEXT_HEADERS([sys/stat.h]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to override 'struct stat'. m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_ST_SIZE=0 ]) AC_SUBST([WINDOWS_64_BIT_ST_SIZE]) if test $WINDOWS_64_BIT_ST_SIZE = 1; then AC_DEFINE([_GL_WINDOWS_64_BIT_ST_SIZE], [1], [Define to 1 if Gnulib overrides 'struct stat' on Windows so that struct stat.st_size becomes 64-bit.]) fi dnl Define types that are supposed to be defined in or dnl . AC_CHECK_TYPE([nlink_t], [], [AC_DEFINE([nlink_t], [int], [Define to the type of st_nlink in struct stat, or a supertype.])], [#include #include ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [fchmodat fstat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat mknod mknodat stat utimensat]) ]) # gl_HEADER_SYS_STAT_H AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT]) GNULIB_FSTAT=0; AC_SUBST([GNULIB_FSTAT]) GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT]) GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS]) GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO]) GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT]) GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD]) GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT]) GNULIB_STAT=0; AC_SUBST([GNULIB_STAT]) GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS]) HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD]) HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT]) REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD]) REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) ]) shishi-1.0.2/gl/m4/realloc.m40000644000000000000000000000475312126660052012506 00000000000000# realloc.m4 serial 13 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. m4_version_prereq([2.70], [] ,[ # This is taken from the following Autoconf patch: # http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9 AC_DEFUN([_AC_FUNC_REALLOC_IF], [ AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CHECK_HEADERS([stdlib.h]) AC_CACHE_CHECK([for GNU libc compatible realloc], [ac_cv_func_realloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif ]], [[return ! realloc (0, 0);]]) ], [ac_cv_func_realloc_0_nonnull=yes], [ac_cv_func_realloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_realloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_realloc_0_nonnull=no ;; esac ]) ]) AS_IF([test $ac_cv_func_realloc_0_nonnull = yes], [$1], [$2]) ])# AC_FUNC_REALLOC ]) # gl_FUNC_REALLOC_GNU # ------------------- # Test whether 'realloc (0, 0)' is handled like in GNU libc, and replace # realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) dnl _AC_FUNC_REALLOC_IF is defined in Autoconf. _AC_FUNC_REALLOC_IF( [AC_DEFINE([HAVE_REALLOC_GNU], [1], [Define to 1 if your system has a GNU libc compatible 'realloc' function, and to 0 otherwise.])], [AC_DEFINE([HAVE_REALLOC_GNU], [0]) REPLACE_REALLOC=1 ]) ])# gl_FUNC_REALLOC_GNU # gl_FUNC_REALLOC_POSIX # --------------------- # Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it # fails), and replace realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test $gl_cv_func_malloc_posix = yes; then AC_DEFINE([HAVE_REALLOC_POSIX], [1], [Define if the 'realloc' function is POSIX compliant.]) else REPLACE_REALLOC=1 fi ]) shishi-1.0.2/gl/m4/read-file.m40000644000000000000000000000055212126660052012706 00000000000000# read-file.m4 serial 3 dnl Copyright (C) 2002-2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites of lib/read-file.c. AC_DEFUN([gl_PREREQ_READ_FILE], [:]) shishi-1.0.2/gl/m4/sys_types_h.m40000644000000000000000000000121712126660053013427 00000000000000# sys_types_h.m4 serial 5 dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_SYS_TYPES_H], [ AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS]) gl_NEXT_HEADERS([sys/types.h]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to override the 'off_t' type. AC_REQUIRE([gl_TYPE_OFF_T]) ]) AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS], [ ]) shishi-1.0.2/gl/m4/stdint.m40000644000000000000000000003701412126660052012366 00000000000000# stdint.m4 serial 43 dnl Copyright (C) 2001-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Bruno Haible. dnl Test whether is supported or must be substituted. AC_DEFUN_ONCE([gl_STDINT_H], [ AC_PREREQ([2.59])dnl dnl Check for long long int and unsigned long long int. AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) if test $ac_cv_type_long_long_int = yes; then HAVE_LONG_LONG_INT=1 else HAVE_LONG_LONG_INT=0 fi AC_SUBST([HAVE_LONG_LONG_INT]) AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) if test $ac_cv_type_unsigned_long_long_int = yes; then HAVE_UNSIGNED_LONG_LONG_INT=1 else HAVE_UNSIGNED_LONG_LONG_INT=0 fi AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT]) dnl Check for , in the same way as gl_WCHAR_H does. AC_CHECK_HEADERS_ONCE([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) dnl Check for . dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h. if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi AC_SUBST([HAVE_INTTYPES_H]) dnl Check for . dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h. if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi AC_SUBST([HAVE_SYS_TYPES_H]) gl_CHECK_NEXT_HEADERS([stdint.h]) if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi AC_SUBST([HAVE_STDINT_H]) dnl Now see whether we need a substitute . if test $ac_cv_header_stdint_h = yes; then AC_CACHE_CHECK([whether stdint.h conforms to C99], [gl_cv_header_working_stdint_h], [gl_cv_header_working_stdint_h=no AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif ] gl_STDINT_INCLUDES [ #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0 / ia64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; ]])], [dnl Determine whether the various *_MIN, *_MAX macros are usable dnl in preprocessor expression. We could do it by compiling a test dnl program for each of these macros. It is faster to run a program dnl that inspects the macro expansion. dnl This detects a bug on HP-UX 11.23/ia64. AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include ] gl_STDINT_INCLUDES [ #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; ]], [[ const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ]])], [gl_cv_header_working_stdint_h=yes], [], [dnl When cross-compiling, assume it works. gl_cv_header_working_stdint_h=yes ]) ]) ]) fi if test "$gl_cv_header_working_stdint_h" = yes; then STDINT_H= else dnl Check for , and for dnl (used in Linux libc4 >= 4.6.7 and libc5). AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h]) if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 else HAVE_SYS_INTTYPES_H=0 fi AC_SUBST([HAVE_SYS_INTTYPES_H]) if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 else HAVE_SYS_BITYPES_H=0 fi AC_SUBST([HAVE_SYS_BITYPES_H]) gl_STDINT_TYPE_PROPERTIES STDINT_H=stdint.h fi AC_SUBST([STDINT_H]) AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"]) ]) dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES) dnl Determine the size of each of the given types in bits. AC_DEFUN([gl_STDINT_BITSIZEOF], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to the number of bits in type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}], [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT], [$2 #include ], [result=unknown]) eval gl_cv_bitsizeof_${gltype}=\$result ]) eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then dnl Use a nonempty default, because some compilers, such as IRIX 5 cc, dnl do a syntax check even on unused #if conditions and give an error dnl on valid C code like this: dnl #if 0 dnl # if > 32 dnl # endif dnl #endif result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result]) eval BITSIZEOF_${GLTYPE}=\$result done m4_foreach_w([gltype], [$1], [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES) dnl Determine the signedness of each of the given types. dnl Define HAVE_SIGNED_TYPE if type is signed. AC_DEFUN([gl_CHECK_TYPES_SIGNED], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to 1 if ']gltype[' is a signed integer type.])]) for gltype in $1 ; do AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])], result=yes, result=no) eval gl_cv_type_${gltype}_signed=\$result ]) eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1]) eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done m4_foreach_w([gltype], [$1], [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES) dnl Determine the suffix to use for integer constants of the given types. dnl Define t_SUFFIX for each such type. AC_DEFUN([gl_INTEGER_TYPE_SUFFIX], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX], [Define to l, ll, u, ul, ull, etc., as suitable for constants of type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for $gltype integer literal suffix], [gl_cv_type_${gltype}_suffix], [eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ extern $gltype foo; extern $gltype1 foo;]])], [eval gl_cv_type_${gltype}_suffix=\$glsuf]) eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done]) GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result]) done m4_foreach_w([gltype], [$1], [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])]) ]) dnl gl_STDINT_INCLUDES AC_DEFUN([gl_STDINT_INCLUDES], [[ /* BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #if HAVE_WCHAR_H # include # include # include #endif ]]) dnl gl_STDINT_TYPE_PROPERTIES dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t dnl of interest to stdint.in.h. AC_DEFUN([gl_STDINT_TYPE_PROPERTIES], [ AC_REQUIRE([gl_MULTIARCH]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_STDINT_BITSIZEOF([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99 dnl requirement that wint_t is "unchanged by default argument promotions". dnl In this case gnulib's and override wint_t. dnl Set the variable BITSIZEOF_WINT_T accordingly. if test $BITSIZEOF_WINT_T -lt 32; then BITSIZEOF_WINT_T=32 fi ]) dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. dnl Remove this when we can assume autoconf >= 2.61. m4_ifdef([AC_COMPUTE_INT], [], [ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])]) ]) # Hey Emacs! # Local Variables: # indent-tabs-mode: nil # End: shishi-1.0.2/gl/m4/sockpfaf.m40000644000000000000000000000522612126660052012655 00000000000000# sockpfaf.m4 serial 8 dnl Copyright (C) 2004, 2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test for some common socket protocol families (PF_INET, PF_INET6, ...) dnl and some common address families (AF_INET, AF_INET6, ...). dnl This test assumes that a system supports an address family if and only if dnl it supports the corresponding protocol family. dnl From Bruno Haible. AC_DEFUN([gl_SOCKET_FAMILIES], [ AC_REQUIRE([gl_HEADER_SYS_SOCKET]) AC_CHECK_HEADERS_ONCE([netinet/in.h]) AC_MSG_CHECKING([for IPv4 sockets]) AC_CACHE_VAL([gl_cv_socket_ipv4], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif]], [[int x = AF_INET; struct in_addr y; struct sockaddr_in z; if (&x && &y && &z) return 0;]])], gl_cv_socket_ipv4=yes, gl_cv_socket_ipv4=no)]) AC_MSG_RESULT([$gl_cv_socket_ipv4]) if test $gl_cv_socket_ipv4 = yes; then AC_DEFINE([HAVE_IPV4], [1], [Define to 1 if defines AF_INET.]) fi AC_MSG_CHECKING([for IPv6 sockets]) AC_CACHE_VAL([gl_cv_socket_ipv6], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif]], [[int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z; if (&x && &y && &z) return 0;]])], gl_cv_socket_ipv6=yes, gl_cv_socket_ipv6=no)]) AC_MSG_RESULT([$gl_cv_socket_ipv6]) if test $gl_cv_socket_ipv6 = yes; then AC_DEFINE([HAVE_IPV6], [1], [Define to 1 if defines AF_INET6.]) fi ]) AC_DEFUN([gl_SOCKET_FAMILY_UNIX], [ AC_REQUIRE([gl_HEADER_SYS_SOCKET]) AC_CHECK_HEADERS_ONCE([sys/un.h]) AC_MSG_CHECKING([for UNIX domain sockets]) AC_CACHE_VAL([gl_cv_socket_unix], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_SYS_UN_H #include #endif #ifdef HAVE_WINSOCK2_H #include #endif]], [[int x = AF_UNIX; struct sockaddr_un y; if (&x && &y) return 0;]])], gl_cv_socket_unix=yes, gl_cv_socket_unix=no)]) AC_MSG_RESULT([$gl_cv_socket_unix]) if test $gl_cv_socket_unix = yes; then AC_DEFINE([HAVE_UNIXSOCKET], [1], [Define to 1 if defines AF_UNIX.]) fi ]) shishi-1.0.2/gl/m4/extern-inline.m40000644000000000000000000000501112126660051013631 00000000000000dnl 'extern inline' a la ISO C99. dnl Copyright 2012-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EXTERN_INLINE], [ AH_VERBATIM([extern_inline], [/* _GL_INLINE is a portable alternative to ISO C99 plain 'inline'. _GL_EXTERN_INLINE is a portable alternative to 'extern inline'. _GL_INLINE_HEADER_BEGIN contains useful stuff to put in an include file, before uses of _GL_INLINE. It suppresses GCC's bogus "no previous prototype for 'FOO'" diagnostic, when FOO is an inline function in the header; see . _GL_INLINE_HEADER_END contains useful stuff to put in the same include file, after uses of _GL_INLINE. Suppress extern inline with HP-UX cc, as it appears to be broken; see . Suppress the use of extern inline on Apple's platforms, as Libc-825.25 (2012-09-19) is incompatible with it; see . Perhaps Apple will fix this some day. */ #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : 199901L <= __STDC_VERSION__ && !defined __HP_cc) \ && !defined __APPLE__) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline #elif 2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __APPLE__ # if __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) # else # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern #else # define _GL_INLINE static _GL_UNUSED # define _GL_EXTERN_INLINE static _GL_UNUSED #endif #if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) # if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ # define _GL_INLINE_HEADER_CONST_PRAGMA # else # define _GL_INLINE_HEADER_CONST_PRAGMA \ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") # endif # define _GL_INLINE_HEADER_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ _GL_INLINE_HEADER_CONST_PRAGMA # define _GL_INLINE_HEADER_END \ _Pragma ("GCC diagnostic pop") #else # define _GL_INLINE_HEADER_BEGIN # define _GL_INLINE_HEADER_END #endif]) ]) shishi-1.0.2/gl/m4/mktime.m40000644000000000000000000001554412126660052012353 00000000000000# serial 25 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_FUNC_MKTIME], [ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) dnl We don't use AC_FUNC_MKTIME any more, because it is no longer maintained dnl in Autoconf and because it invokes AC_LIBOBJ. AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_DECLS_ONCE([alarm]) AC_REQUIRE([gl_MULTIARCH]) if test $APPLE_UNIVERSAL_BUILD = 1; then # A universal build on Apple Mac OS X platforms. # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. # But we need a configuration result that is valid in both modes. gl_cv_func_working_mktime=no fi AC_CACHE_CHECK([for working mktime], [gl_cv_func_working_mktime], [AC_RUN_IFELSE( [AC_LANG_SOURCE( [[/* Test program from Paul Eggert and Tony Leneis. */ #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_DECL_ALARM # include #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static char *tz_strings[] = { (char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { int result = 0; time_t t, delta; int i, j; int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1; int time_t_signed = ! ((time_t) 0 < (time_t) -1); #if HAVE_DECL_ALARM /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ signal (SIGALRM, SIG_DFL); alarm (60); #endif time_t_max = (! time_t_signed ? (time_t) -1 : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1) * 2 + 1)); time_t_min = (! time_t_signed ? (time_t) 0 : time_t_signed_magnitude ? ~ (time_t) 0 : ~ time_t_max); delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv (tz_strings[i]); for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta) if (! mktime_test (t)) result |= 1; if ((result & 2) == 0 && ! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) result |= 2; for (j = 1; (result & 4) == 0; j <<= 1) { if (! bigtime_test (j)) result |= 4; if (INT_MAX / 2 < j) break; } if ((result & 8) == 0 && ! bigtime_test (INT_MAX)) result |= 8; } if (! irix_6_4_bug ()) result |= 16; if (! spring_forward_gap ()) result |= 32; if (! year_2050_test ()) result |= 64; return result; }]])], [gl_cv_func_working_mktime=yes], [gl_cv_func_working_mktime=no], [gl_cv_func_working_mktime=no]) ]) if test $gl_cv_func_working_mktime = no; then REPLACE_MKTIME=1 else REPLACE_MKTIME=0 fi ]) AC_DEFUN([gl_FUNC_MKTIME_INTERNAL], [ AC_REQUIRE([gl_FUNC_MKTIME]) if test $REPLACE_MKTIME = 0; then dnl BeOS has __mktime_internal in libc, but other platforms don't. AC_CHECK_FUNC([__mktime_internal], [AC_DEFINE([mktime_internal], [__mktime_internal], [Define to the real name of the mktime_internal function.]) ], [dnl mktime works but it doesn't export __mktime_internal, dnl so we need to substitute our own mktime implementation. REPLACE_MKTIME=1 ]) fi ]) # Prerequisites of lib/mktime.c. AC_DEFUN([gl_PREREQ_MKTIME], [:]) shishi-1.0.2/gl/m4/hostent.m40000644000000000000000000000316612126660052012546 00000000000000# hostent.m4 serial 2 dnl Copyright (C) 2008, 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HOSTENT], [ dnl Where are gethostent(), sethostent(), endhostent(), gethostbyname(), dnl gethostbyaddr() defined? dnl - On Solaris, they are in libnsl. Ignore libxnet. dnl - On Haiku, they are in libnetwork. dnl - On BeOS, they are in libnet. dnl - On native Windows, they are in ws2_32.dll. dnl - Otherwise they are in libc. AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H HOSTENT_LIB= gl_saved_libs="$LIBS" AC_SEARCH_LIBS([gethostbyname], [nsl network net], [if test "$ac_cv_search_gethostbyname" != "none required"; then HOSTENT_LIB="$ac_cv_search_gethostbyname" fi]) LIBS="$gl_saved_libs" if test -z "$HOSTENT_LIB"; then AC_CHECK_FUNCS([gethostbyname], , [ AC_CACHE_CHECK([for gethostbyname in winsock2.h and -lws2_32], [gl_cv_w32_gethostbyname], [gl_cv_w32_gethostbyname=no gl_save_LIBS="$LIBS" LIBS="$LIBS -lws2_32" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #ifdef HAVE_WINSOCK2_H #include #endif #include ]], [[gethostbyname(NULL);]])], [gl_cv_w32_gethostbyname=yes]) LIBS="$gl_save_LIBS" ]) if test "$gl_cv_w32_gethostbyname" = "yes"; then HOSTENT_LIB="-lws2_32" fi ]) fi AC_SUBST([HOSTENT_LIB]) ]) shishi-1.0.2/gl/m4/lseek.m40000644000000000000000000000436112126660052012163 00000000000000# lseek.m4 serial 10 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LSEEK], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe], [case "$host_os" in mingw*) dnl Native Windows. dnl The result of lseek (fd, (off_t)0, SEEK_CUR) or dnl SetFilePointer(handle, 0, NULL, FILE_CURRENT) dnl for a pipe depends on the environment: In a Cygwin 1.5 dnl environment it succeeds (wrong); in a Cygwin 1.7 environment dnl it fails with a wrong errno value. gl_cv_func_lseek_pipe=no ;; *) if test $cross_compiling = no; then AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include /* for off_t */ #include /* for SEEK_CUR */ #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include #endif ]], [[ /* Exit with success only if stdin is seekable. */ return lseek (0, (off_t)0, SEEK_CUR) < 0; ]])], [if test -s conftest$ac_exeext \ && ./conftest$ac_exeext < conftest.$ac_ext \ && test 1 = "`echo hi \ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then gl_cv_func_lseek_pipe=yes else gl_cv_func_lseek_pipe=no fi ], [gl_cv_func_lseek_pipe=no]) else AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[ #if defined __BEOS__ /* BeOS mistakenly return 0 when trying to seek on pipes. */ Choke me. #endif]])], [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no]) fi ;; esac ]) if test $gl_cv_func_lseek_pipe = no; then REPLACE_LSEEK=1 AC_DEFINE([LSEEK_PIPE_BROKEN], [1], [Define to 1 if lseek does not detect pipes.]) fi AC_REQUIRE([gl_SYS_TYPES_H]) if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_LSEEK=1 fi ]) shishi-1.0.2/gl/m4/gc-md5.m40000644000000000000000000000061212126660052012127 00000000000000# gc-md5.m4 serial 2 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_MD5], [ AC_REQUIRE([gl_GC]) if test "$ac_cv_libgcrypt" != yes; then gl_MD5 fi ]) shishi-1.0.2/gl/m4/00gnulib.m40000644000000000000000000000252212126660051012474 00000000000000# 00gnulib.m4 serial 2 dnl Copyright (C) 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file must be named something that sorts before all other dnl gnulib-provided .m4 files. It is needed until such time as we can dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE semantics. # AC_DEFUN_ONCE([NAME], VALUE) # ---------------------------- # Define NAME to expand to VALUE on the first use (whether by direct # expansion, or by AC_REQUIRE), and to nothing on all subsequent uses. # Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier. This # definition is slower than the version in Autoconf 2.64, because it # can only use interfaces that existed since 2.59; but it achieves the # same effect. Quoting is necessary to avoid confusing Automake. m4_version_prereq([2.63.263], [], [m4_define([AC][_DEFUN_ONCE], [AC][_DEFUN([$1], [AC_REQUIRE([_gl_DEFUN_ONCE([$1])], [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl [AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])]) # gl_00GNULIB # ----------- # Witness macro that this file has been included. Needed to force # Automake to include this file prior to all other gnulib .m4 files. AC_DEFUN([gl_00GNULIB]) shishi-1.0.2/gl/m4/bison.m40000644000000000000000000000200012126660052012156 00000000000000# serial 7 # Copyright (C) 2002, 2005, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_BISON], [ # parse-datetime.y works with bison only. : ${YACC='bison -y'} dnl dnl Declaring YACC & YFLAGS precious will not be necessary after GNULIB dnl requires an Autoconf greater than 2.59c, but it will probably still be dnl useful to override the description of YACC in the --help output, re dnl parse-datetime.y assuming 'bison -y'. AC_ARG_VAR([YACC], [The "Yet Another C Compiler" implementation to use. Defaults to 'bison -y'. Values other than 'bison -y' will most likely break on most systems.])dnl AC_ARG_VAR([YFLAGS], [YFLAGS contains the list arguments that will be passed by default to Bison. This script will default YFLAGS to the empty string to avoid a default value of '-d' given by some make applications.])dnl ]) shishi-1.0.2/gl/m4/netinet_in_h.m40000644000000000000000000000207512126660052013523 00000000000000# netinet_in_h.m4 serial 5 dnl Copyright (C) 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_NETINET_IN], [ AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_netinet_in_h_selfcontained], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [gl_cv_header_netinet_in_h_selfcontained=yes], [gl_cv_header_netinet_in_h_selfcontained=no]) ]) if test $gl_cv_header_netinet_in_h_selfcontained = yes; then NETINET_IN_H='' else NETINET_IN_H='netinet/in.h' AC_CHECK_HEADERS([netinet/in.h]) gl_CHECK_NEXT_HEADERS([netinet/in.h]) if test $ac_cv_header_netinet_in_h = yes; then HAVE_NETINET_IN_H=1 else HAVE_NETINET_IN_H=0 fi AC_SUBST([HAVE_NETINET_IN_H]) fi AC_SUBST([NETINET_IN_H]) AM_CONDITIONAL([GL_GENERATE_NETINET_IN_H], [test -n "$NETINET_IN_H"]) ]) shishi-1.0.2/gl/m4/rawmemchr.m40000644000000000000000000000117212126660052013042 00000000000000# rawmemchr.m4 serial 2 dnl Copyright (C) 2003, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_RAWMEMCHR], [ dnl Persuade glibc to declare rawmemchr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([rawmemchr]) if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi ]) # Prerequisites of lib/strchrnul.c. AC_DEFUN([gl_PREREQ_RAWMEMCHR], [:]) shishi-1.0.2/gl/m4/eealloc.m40000644000000000000000000000166712126660052012472 00000000000000# eealloc.m4 serial 3 dnl Copyright (C) 2003, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EEALLOC], [ AC_REQUIRE([gl_EEMALLOC]) AC_REQUIRE([gl_EEREALLOC]) ]) AC_DEFUN([gl_EEMALLOC], [ _AC_FUNC_MALLOC_IF( [gl_cv_func_malloc_0_nonnull=1], [gl_cv_func_malloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull], [If malloc(0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) AC_DEFUN([gl_EEREALLOC], [ _AC_FUNC_REALLOC_IF( [gl_cv_func_realloc_0_nonnull=1], [gl_cv_func_realloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull], [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) shishi-1.0.2/gl/m4/ssize_t.m40000644000000000000000000000146312126660052012540 00000000000000# ssize_t.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2001-2003, 2006, 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether ssize_t is defined. AC_DEFUN([gt_TYPE_SSIZE_T], [ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x;]])], [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])]) if test $gt_cv_ssize_t = no; then AC_DEFINE([ssize_t], [int], [Define as a signed type of the same size as size_t.]) fi ]) shishi-1.0.2/gl/m4/gc-des.m40000644000000000000000000000052012126660052012213 00000000000000# gc-des.m4 serial 3 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_DES], [ AC_REQUIRE([gl_GC]) ]) shishi-1.0.2/gl/m4/string_h.m40000644000000000000000000001271412126660052012676 00000000000000# Configure a GNU-like replacement for . # Copyright (C) 2007-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 21 # Written by Paul Eggert. AC_DEFUN([gl_HEADER_STRING_H], [ dnl Use AC_REQUIRE here, so that the default behavior below is expanded dnl once only, before all statements that occur in other macros. AC_REQUIRE([gl_HEADER_STRING_H_BODY]) ]) AC_DEFUN([gl_HEADER_STRING_H_BODY], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) gl_NEXT_HEADERS([string.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include ]], [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r strerror_r strsignal strverscmp]) ]) AC_DEFUN([gl_STRING_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], [ GNULIB_FFSL=0; AC_SUBST([GNULIB_FFSL]) GNULIB_FFSLL=0; AC_SUBST([GNULIB_FFSLL]) GNULIB_MEMCHR=0; AC_SUBST([GNULIB_MEMCHR]) GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM]) GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY]) GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR]) GNULIB_RAWMEMCHR=0; AC_SUBST([GNULIB_RAWMEMCHR]) GNULIB_STPCPY=0; AC_SUBST([GNULIB_STPCPY]) GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY]) GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL]) GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP]) GNULIB_STRNCAT=0; AC_SUBST([GNULIB_STRNCAT]) GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP]) GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN]) GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK]) GNULIB_STRSEP=0; AC_SUBST([GNULIB_STRSEP]) GNULIB_STRSTR=0; AC_SUBST([GNULIB_STRSTR]) GNULIB_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR]) GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R]) GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN]) GNULIB_MBSNLEN=0; AC_SUBST([GNULIB_MBSNLEN]) GNULIB_MBSCHR=0; AC_SUBST([GNULIB_MBSCHR]) GNULIB_MBSRCHR=0; AC_SUBST([GNULIB_MBSRCHR]) GNULIB_MBSSTR=0; AC_SUBST([GNULIB_MBSSTR]) GNULIB_MBSCASECMP=0; AC_SUBST([GNULIB_MBSCASECMP]) GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP]) GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP]) GNULIB_MBSCASESTR=0; AC_SUBST([GNULIB_MBSCASESTR]) GNULIB_MBSCSPN=0; AC_SUBST([GNULIB_MBSCSPN]) GNULIB_MBSPBRK=0; AC_SUBST([GNULIB_MBSPBRK]) GNULIB_MBSSPN=0; AC_SUBST([GNULIB_MBSSPN]) GNULIB_MBSSEP=0; AC_SUBST([GNULIB_MBSSEP]) GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) GNULIB_STRERROR_R=0; AC_SUBST([GNULIB_STRERROR_R]) GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP]) HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FFSL=1; AC_SUBST([HAVE_FFSL]) HAVE_FFSLL=1; AC_SUBST([HAVE_FFSLL]) HAVE_MEMCHR=1; AC_SUBST([HAVE_MEMCHR]) HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR]) HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR]) HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY]) HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY]) HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL]) HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP]) HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP]) HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN]) HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK]) HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP]) HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR]) HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R]) HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR]) REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY]) REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP]) REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) REPLACE_STRCHRNUL=0; AC_SUBST([REPLACE_STRCHRNUL]) REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) REPLACE_STRERROR_R=0; AC_SUBST([REPLACE_STRERROR_R]) REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT]) REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP]) REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN]) REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R]) UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R]) ]) shishi-1.0.2/gl/m4/multiarch.m40000644000000000000000000000367412126660052013056 00000000000000# multiarch.m4 serial 7 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Determine whether the compiler is or may be producing universal binaries. # # On Mac OS X 10.5 and later systems, the user can create libraries and # executables that work on multiple system types--known as "fat" or # "universal" binaries--by specifying multiple '-arch' options to the # compiler but only a single '-arch' option to the preprocessor. Like # this: # # ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ # CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ # CPP="gcc -E" CXXCPP="g++ -E" # # Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly. AC_DEFUN_ONCE([gl_MULTIARCH], [ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN. gl_cv_c_multiarch=no AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; ]])], [ dnl Check for potential -arch flags. It is not universal unless dnl there are at least two -arch flags with different values. arch= prev= for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do if test -n "$prev"; then case $word in i?86 | x86_64 | ppc | ppc64) if test -z "$arch" || test "$arch" = "$word"; then arch="$word" else gl_cv_c_multiarch=yes fi ;; esac prev= else if test "x$word" = "x-arch"; then prev=arch fi fi done ]) if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 else APPLE_UNIVERSAL_BUILD=0 fi AC_SUBST([APPLE_UNIVERSAL_BUILD]) ]) shishi-1.0.2/gl/m4/stdbool.m40000644000000000000000000000637112126660052012531 00000000000000# Check for stdbool.h that conforms to C99. dnl Copyright (C) 2002-2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. #serial 5 # Prepare for substituting if it is not supported. AC_DEFUN([AM_STDBOOL_H], [ AC_REQUIRE([AC_CHECK_HEADER_STDBOOL]) # Define two additional variables used in the Makefile substitution. if test "$ac_cv_header_stdbool_h" = yes; then STDBOOL_H='' else STDBOOL_H='stdbool.h' fi AC_SUBST([STDBOOL_H]) AM_CONDITIONAL([GL_GENERATE_STDBOOL_H], [test -n "$STDBOOL_H"]) if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi AC_SUBST([HAVE__BOOL]) ]) # AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future. AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H]) # This version of the macro is needed in autoconf <= 2.68. AC_DEFUN([AC_CHECK_HEADER_STDBOOL], [AC_CACHE_CHECK([for stdbool.h that conforms to C99], [ac_cv_header_stdbool_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; ]], [[ bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ]])], [ac_cv_header_stdbool_h=yes], [ac_cv_header_stdbool_h=no])]) AC_CHECK_TYPES([_Bool]) ]) shishi-1.0.2/gl/m4/getpass.m40000644000000000000000000000356012126660052012526 00000000000000# getpass.m4 serial 14 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Provide a getpass() function if the system doesn't have it. AC_DEFUN([gl_FUNC_GETPASS], [ dnl Persuade Solaris and to declare getpass(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS([getpass]) AC_CHECK_DECLS_ONCE([getpass]) if test $ac_cv_func_getpass = yes; then HAVE_GETPASS=1 else HAVE_GETPASS=0 fi ]) # Provide the GNU getpass() implementation. It supports passwords of # arbitrary length (not just 8 bytes as on HP-UX). AC_DEFUN([gl_FUNC_GETPASS_GNU], [ dnl Persuade Solaris and to declare getpass(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getpass]) dnl TODO: Detect when GNU getpass() is already found in glibc. REPLACE_GETPASS=1 if test $REPLACE_GETPASS = 1; then dnl We must choose a different name for our function, since on ELF systems dnl an unusable getpass() in libc.so would override our getpass() if it is dnl compiled into a shared library. AC_DEFINE([getpass], [gnu_getpass], [Define to a replacement function name for getpass().]) fi ]) # Prerequisites of lib/getpass.c. AC_DEFUN([gl_PREREQ_GETPASS], [ AC_CHECK_HEADERS_ONCE([stdio_ext.h termios.h]) AC_CHECK_FUNCS_ONCE([__fsetlocking tcgetattr tcsetattr]) AC_CHECK_DECLS([__fsetlocking],,, [[#include #if HAVE_STDIO_EXT_H #include #endif]]) AC_CHECK_DECLS_ONCE([fflush_unlocked]) AC_CHECK_DECLS_ONCE([flockfile]) AC_CHECK_DECLS_ONCE([fputs_unlocked]) AC_CHECK_DECLS_ONCE([funlockfile]) AC_CHECK_DECLS_ONCE([putc_unlocked]) : ]) shishi-1.0.2/gl/m4/time_r.m40000644000000000000000000000353012126660053012335 00000000000000dnl Reentrant time functions: localtime_r, gmtime_r. dnl Copyright (C) 2003, 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl_TIME_R], [ dnl Persuade glibc and Solaris to declare localtime_r. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) AC_REQUIRE([AC_C_RESTRICT]) dnl Some systems don't declare localtime_r() and gmtime_r() if _REENTRANT is dnl not defined. AC_CHECK_DECLS([localtime_r], [], [], [[#include ]]) if test $ac_cv_have_decl_localtime_r = no; then HAVE_DECL_LOCALTIME_R=0 fi AC_CHECK_FUNCS_ONCE([localtime_r]) if test $ac_cv_func_localtime_r = yes; then HAVE_LOCALTIME_R=1 AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], [gl_cv_time_r_posix], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[/* We don't need to append 'restrict's to the argument types, even though the POSIX signature has the 'restrict's, since C99 says they can't affect type compatibility. */ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; if (ptr) return 0; /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ *localtime_r (0, 0);]]) ], [gl_cv_time_r_posix=yes], [gl_cv_time_r_posix=no]) ]) if test $gl_cv_time_r_posix = yes; then REPLACE_LOCALTIME_R=0 else REPLACE_LOCALTIME_R=1 fi else HAVE_LOCALTIME_R=0 fi ]) # Prerequisites of lib/time_r.c. AC_DEFUN([gl_PREREQ_TIME_R], [ : ]) shishi-1.0.2/gl/m4/sys_uio_h.m40000644000000000000000000000165412126660053013064 00000000000000# sys_uio_h.m4 serial 1 dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_SYS_UIO], [ AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([sys/uio.h]) if test $ac_cv_header_sys_uio_h = yes; then HAVE_SYS_UIO_H=1 else HAVE_SYS_UIO_H=0 fi AC_SUBST([HAVE_SYS_UIO_H]) ]) AC_DEFUN([gl_SYS_UIO_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_UIO_H_DEFAULTS], [ ]) shishi-1.0.2/gl/m4/warnings.m40000644000000000000000000000416612126660053012714 00000000000000# warnings.m4 serial 7 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # gl_AS_VAR_APPEND(VAR, VALUE) # ---------------------------- # Provide the functionality of AS_VAR_APPEND if Autoconf does not have it. m4_ifdef([AS_VAR_APPEND], [m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])], [m4_define([gl_AS_VAR_APPEND], [AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])]) # gl_COMPILER_OPTION_IF(OPTION, [IF-SUPPORTED], [IF-NOT-SUPPORTED], # [PROGRAM = AC_LANG_PROGRAM()]) # ----------------------------------------------------------------- # Check if the compiler supports OPTION when compiling PROGRAM. # # FIXME: gl_Warn must be used unquoted until we can assume Autoconf # 2.64 or newer. AC_DEFUN([gl_COMPILER_OPTION_IF], [AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_[]_AC_LANG_ABBREV[]_$1])dnl AS_VAR_PUSHDEF([gl_Flags], [_AC_LANG_PREFIX[]FLAGS])dnl AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], m4_defn([gl_Warn]), [ gl_save_compiler_FLAGS="$gl_Flags" gl_AS_VAR_APPEND(m4_defn([gl_Flags]), [" $1"]) AC_COMPILE_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])], [AS_VAR_SET(gl_Warn, [yes])], [AS_VAR_SET(gl_Warn, [no])]) gl_Flags="$gl_save_compiler_FLAGS" ]) AS_VAR_IF(gl_Warn, [yes], [$2], [$3]) AS_VAR_POPDEF([gl_Flags])dnl AS_VAR_POPDEF([gl_Warn])dnl ]) # gl_WARN_ADD(OPTION, [VARIABLE = WARN_CFLAGS], # [PROGRAM = AC_LANG_PROGRAM()]) # --------------------------------------------- # Adds parameter to WARN_CFLAGS if the compiler supports it when # compiling PROGRAM. For example, gl_WARN_ADD([-Wparentheses]). # # If VARIABLE is a variable name, AC_SUBST it. AC_DEFUN([gl_WARN_ADD], [gl_COMPILER_OPTION_IF([$1], [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]), [" $1"])], [], [$3]) m4_ifval([$2], [AS_LITERAL_IF([$2], [AC_SUBST([$2])])], [AC_SUBST([WARN_CFLAGS])])dnl ]) # Local Variables: # mode: autoconf # End: shishi-1.0.2/gl/m4/msvc-inval.m40000644000000000000000000000133412126660052013134 00000000000000# msvc-inval.m4 serial 1 dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_INVAL], [ AC_CHECK_FUNCS_ONCE([_set_invalid_parameter_handler]) if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 AC_DEFINE([HAVE_MSVC_INVALID_PARAMETER_HANDLER], [1], [Define to 1 on MSVC platforms that have the "invalid parameter handler" concept.]) else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi AC_SUBST([HAVE_MSVC_INVALID_PARAMETER_HANDLER]) ]) shishi-1.0.2/gl/m4/minmax.m40000644000000000000000000000245512126660052012353 00000000000000# minmax.m4 serial 4 dnl Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.53]) AC_DEFUN([gl_MINMAX], [ AC_REQUIRE([gl_PREREQ_MINMAX]) ]) # Prerequisites of lib/minmax.h. AC_DEFUN([gl_PREREQ_MINMAX], [ gl_MINMAX_IN_HEADER([limits.h]) gl_MINMAX_IN_HEADER([sys/param.h]) ]) dnl gl_MINMAX_IN_HEADER(HEADER) dnl The parameter has to be a literal header name; it cannot be macro, dnl nor a shell variable. (Because autoheader collects only AC_DEFINE dnl invocations with a literal macro name.) AC_DEFUN([gl_MINMAX_IN_HEADER], [ m4_pushdef([header], AS_TR_SH([$1])) m4_pushdef([HEADER], AS_TR_CPP([$1])) AC_CACHE_CHECK([whether <$1> defines MIN and MAX], [gl_cv_minmax_in_]header, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include <$1> int x = MIN (42, 17);]], [[]])], [gl_cv_minmax_in_]header[=yes], [gl_cv_minmax_in_]header[=no])]) if test $gl_cv_minmax_in_[]header = yes; then AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1, [Define to 1 if <$1> defines the MIN and MAX macros.]) fi m4_popdef([HEADER]) m4_popdef([header]) ]) shishi-1.0.2/gl/m4/dup2.m40000644000000000000000000000546412126660052011737 00000000000000#serial 19 dnl Copyright (C) 2002, 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_DUP2], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) m4_ifdef([gl_FUNC_DUP2_OBSOLETE], [ AC_CHECK_FUNCS_ONCE([dup2]) if test $ac_cv_func_dup2 = no; then HAVE_DUP2=0 fi ], [ AC_DEFINE([HAVE_DUP2], [1], [Define to 1 if you have the 'dup2' function.]) ]) if test $HAVE_DUP2 = 1; then AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM([[#include #include #include ]], [int result = 0; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) == 0) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, 1000000) == -1 && errno != EBADF) result |= 16; /* Flush out a cygwin core dump. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; return result; ]) ], [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no], [case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; linux*) # On linux between 2008-07-27 and 2009-05-11, dup2 of a # closed fd may yield -EBADF instead of -1 / errno=EBADF. gl_cv_func_dup2_works="guessing no" ;; freebsd*) # on FreeBSD 6.1, dup2(1,1000000) gives EMFILE, not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac]) ]) case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 ;; esac fi dnl Replace dup2() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then if test $HAVE_DUP2 = 1; then REPLACE_DUP2=1 fi fi ]) ]) # Prerequisites of lib/dup2.c. AC_DEFUN([gl_PREREQ_DUP2], []) shishi-1.0.2/gl/m4/fseek.m40000644000000000000000000000100512126660052012145 00000000000000# fseek.m4 serial 4 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSEEK], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_FSEEKO]) dnl When fseeko needs fixes, fseek needs them too. if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then REPLACE_FSEEK=1 fi ]) shishi-1.0.2/gl/m4/stdarg.m40000644000000000000000000000540412126660052012343 00000000000000# stdarg.m4 serial 6 dnl Copyright (C) 2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Provide a working va_copy in combination with . AC_DEFUN([gl_STDARG_H], [ STDARG_H='' NEXT_STDARG_H='' AC_MSG_CHECKING([for va_copy]) AC_CACHE_VAL([gl_cv_func_va_copy], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ #ifndef va_copy void (*func) (va_list, va_list) = va_copy; #endif ]])], [gl_cv_func_va_copy=yes], [gl_cv_func_va_copy=no])]) AC_MSG_RESULT([$gl_cv_func_va_copy]) if test $gl_cv_func_va_copy = no; then dnl Provide a substitute. dnl Usually a simple definition in is enough. Not so on AIX 5 dnl with some versions of the /usr/vac/bin/cc compiler. It has an dnl which does '#undef va_copy', leading to a missing va_copy symbol. For dnl this platform, we use an substitute. But we cannot use this dnl approach on other platforms, because often defines only dnl preprocessor macros and gl_ABSOLUTE_HEADER, gl_CHECK_NEXT_HEADERS do dnl not work in this situation. AC_EGREP_CPP([vaccine], [#if defined _AIX && !defined __GNUC__ AIX vaccine #endif ], [gl_aixcc=yes], [gl_aixcc=no]) if test $gl_aixcc = yes; then dnl Provide a substitute file. STDARG_H=stdarg.h gl_NEXT_HEADERS([stdarg.h]) dnl Fallback for the case when contains only macro definitions. if test "$gl_cv_next_stdarg_h" = '""'; then gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' NEXT_STDARG_H="$gl_cv_next_stdarg_h" fi else dnl Provide a substitute in , either __va_copy or as a simple dnl assignment. gl_CACHE_VAL_SILENT([gl_cv_func___va_copy], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ #ifndef __va_copy error, bail out #endif ]])], [gl_cv_func___va_copy=yes], [gl_cv_func___va_copy=no])]) if test $gl_cv_func___va_copy = yes; then AC_DEFINE([va_copy], [__va_copy], [Define as a macro for copying va_list variables.]) else AH_VERBATIM([gl_VA_COPY], [/* A replacement for va_copy, if needed. */ #define gl_va_copy(a,b) ((a) = (b))]) AC_DEFINE([va_copy], [gl_va_copy], [Define as a macro for copying va_list variables.]) fi fi fi AC_SUBST([STDARG_H]) AM_CONDITIONAL([GL_GENERATE_STDARG_H], [test -n "$STDARG_H"]) AC_SUBST([NEXT_STDARG_H]) ]) shishi-1.0.2/gl/m4/warn-on-use.m40000644000000000000000000000415412126660053013234 00000000000000# warn-on-use.m4 serial 5 dnl Copyright (C) 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES) # --------------------------------------- # For each whitespace-separated element in the list of NAMES, define # HAVE_RAW_DECL_name if the function has a declaration among INCLUDES # even after being undefined as a macro. # # See warn-on-use.h for some hints on how to poison function names, as # well as ideas on poisoning global variables and macros. NAMES may # include global variables, but remember that only functions work with # _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single # header, but if the replacement header pulls in other headers because # some systems declare functions in the wrong header, then INCLUDES # should do likewise. # # It is generally safe to assume declarations for functions declared # in the intersection of C89 and C11 (such as printf) without # needing gl_WARN_ON_USE_PREPARE. AC_DEFUN([gl_WARN_ON_USE_PREPARE], [ m4_foreach_w([gl_decl], [$2], [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])), [Define to 1 if ]m4_defn([gl_decl])[ is declared even after undefining macros.])])dnl dnl FIXME: gl_Symbol must be used unquoted until we can assume dnl autoconf 2.64 or newer. for gl_func in m4_flatten([$2]); do AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl AC_CACHE_CHECK([whether $gl_func is declared without a macro], gl_Symbol, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], [@%:@undef $gl_func (void) $gl_func;])], [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])]) AS_VAR_IF(gl_Symbol, [yes], [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1]) dnl shortcut - if the raw declaration exists, then set a cache dnl variable to allow skipping any later AC_CHECK_DECL efforts eval ac_cv_have_decl_$gl_func=yes]) AS_VAR_POPDEF([gl_Symbol])dnl done ]) shishi-1.0.2/gl/m4/extensions.m40000644000000000000000000001223712126660052013260 00000000000000# serial 13 -*- Autoconf -*- # Enable extensions on systems that normally disable them. # Copyright (C) 2003, 2006-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from CVS # Autoconf. Perhaps we can remove this once we can assume Autoconf # 2.70 or later everywhere, but since Autoconf mutates rapidly # enough in this area it's likely we'll need to redefine # AC_USE_SYSTEM_EXTENSIONS for quite some time. # If autoconf reports a warning # warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # the fix is # 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked # but always AC_REQUIREd, # 2) to ensure that for each occurrence of # AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) # or # AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # the corresponding gnulib module description has 'extensions' among # its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS # invocation occurs in gl_EARLY, not in gl_INIT. # AC_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. # # Remember that #undef in AH_VERBATIM gets replaced with #define by # AC_DEFINE. The goal here is to define all known feature-enabling # macros, then, if reports of conflicts are made, disable macros that # cause problems on some platforms (such as __EXTENSIONS__). AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS], [AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl AC_BEFORE([$0], [AC_RUN_IFELSE])dnl AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=]) if test "$MINIX" = yes; then AC_DEFINE([_POSIX_SOURCE], [1], [Define to 1 if you need to in order for 'stat' and other things to work.]) AC_DEFINE([_POSIX_1_SOURCE], [2], [Define to 2 if the system does not provide POSIX.1 features except with this defined.]) AC_DEFINE([_MINIX], [1], [Define to 1 if on MINIX.]) AC_DEFINE([_NETBSD_SOURCE], [1], [Define to 1 to make NetBSD features available. MINIX 3 needs this.]) fi dnl Use a different key than __EXTENSIONS__, as that name broke existing dnl configure.ac when using autoheader 2.62. AH_VERBATIM([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on OS X. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions if necessary. HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif ]) AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__], [ac_cv_safe_to_define___extensions__], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ # define __EXTENSIONS__ 1 ]AC_INCLUDES_DEFAULT])], [ac_cv_safe_to_define___extensions__=yes], [ac_cv_safe_to_define___extensions__=no])]) test $ac_cv_safe_to_define___extensions__ = yes && AC_DEFINE([__EXTENSIONS__]) AC_DEFINE([_ALL_SOURCE]) AC_DEFINE([_DARWIN_C_SOURCE]) AC_DEFINE([_GNU_SOURCE]) AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) AC_DEFINE([_TANDEM_SOURCE]) AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined], [ac_cv_should_define__xopen_source], [ac_cv_should_define__xopen_source=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #include mbstate_t x;]])], [], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #define _XOPEN_SOURCE 500 #include mbstate_t x;]])], [ac_cv_should_define__xopen_source=yes])])]) test $ac_cv_should_define__xopen_source = yes && AC_DEFINE([_XOPEN_SOURCE], [500]) ])# AC_USE_SYSTEM_EXTENSIONS # gl_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS], [ dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS. dnl gnulib does not need it. But if it gets required by third-party macros dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS". dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE, dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck. AC_REQUIRE([AC_GNU_SOURCE]) AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) ]) shishi-1.0.2/gl/m4/wchar_h.m40000644000000000000000000002224012126660053012470 00000000000000dnl A placeholder for ISO C99 , for platforms that have issues. dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Eric Blake. # wchar_h.m4 serial 39 AC_DEFUN([gl_WCHAR_H], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) dnl Prepare for creating substitute . dnl Check for (missing in Linux uClibc when built without wide dnl character support). dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([gt_TYPE_WINT_T]) if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi AC_SUBST([HAVE_WINT_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include #endif #include ]], [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth ]) ]) dnl Check whether is usable at all. AC_DEFUN([gl_WCHAR_H_INLINE_OK], [ dnl Test whether suffers due to the transition from '__inline' to dnl 'gnu_inline'. See dnl and . In summary, dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and dnl the option -std=c99 or -std=gnu99, leads to a broken . AC_CACHE_CHECK([whether uses 'inline' correctly], [gl_cv_header_wchar_h_correct_inline], [gl_cv_header_wchar_h_correct_inline=yes AC_LANG_CONFTEST([ AC_LANG_SOURCE([[#define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include extern int zero (void); int main () { return zero(); } ]])]) if AC_TRY_EVAL([ac_compile]); then mv conftest.$ac_objext conftest1.$ac_objext AC_LANG_CONFTEST([ AC_LANG_SOURCE([[#define wcstod renamed_wcstod /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #include int zero (void) { return 0; } ]])]) if AC_TRY_EVAL([ac_compile]); then mv conftest.$ac_objext conftest2.$ac_objext if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext ]) if test $gl_cv_header_wchar_h_correct_inline = no; then AC_MSG_ERROR([ cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted.]) fi ]) AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_WCHAR_H_DEFAULTS], [ GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC]) GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB]) GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT]) GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC]) GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN]) GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS]) GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS]) GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB]) GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS]) GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS]) GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH]) GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR]) GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP]) GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY]) GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE]) GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET]) GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN]) GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN]) GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY]) GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY]) GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY]) GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY]) GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT]) GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT]) GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP]) GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP]) GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP]) GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP]) GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL]) GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM]) GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP]) GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR]) GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR]) GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN]) GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN]) GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK]) GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR]) GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK]) GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC]) HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT]) HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC]) HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN]) HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS]) HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS]) HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB]) HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS]) HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS]) HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR]) HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP]) HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY]) HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE]) HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET]) HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN]) HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN]) HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY]) HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY]) HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY]) HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY]) HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT]) HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT]) HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP]) HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP]) HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP]) HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP]) HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL]) HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM]) HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP]) HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR]) HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR]) HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN]) HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN]) HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK]) HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR]) HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK]) HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH]) HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB]) HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T]) REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC]) REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB]) REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT]) REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC]) REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN]) REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS]) REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS]) REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB]) REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH]) ]) shishi-1.0.2/gl/m4/vasnprintf.m40000644000000000000000000002113312126660053013247 00000000000000# vasnprintf.m4 serial 36 dnl Copyright (C) 2002-2004, 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) if test $ac_cv_func_vasnprintf = no; then gl_REPLACE_VASNPRINTF fi ]) AC_DEFUN([gl_REPLACE_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) AC_LIBOBJ([vasnprintf]) AC_LIBOBJ([printf-args]) AC_LIBOBJ([printf-parse]) AC_LIBOBJ([asnprintf]) if test $ac_cv_func_vasnprintf = yes; then AC_DEFINE([REPLACE_VASNPRINTF], [1], [Define if vasnprintf exists but is overridden by gnulib.]) fi gl_PREREQ_PRINTF_ARGS gl_PREREQ_PRINTF_PARSE gl_PREREQ_VASNPRINTF gl_PREREQ_ASNPRINTF ]) # Prerequisites of lib/printf-args.h, lib/printf-args.c. AC_DEFUN([gl_PREREQ_PRINTF_ARGS], [ AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) ]) # Prerequisites of lib/printf-parse.h, lib/printf-parse.c. AC_DEFUN([gl_PREREQ_PRINTF_PARSE], [ AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_REQUIRE([AC_TYPE_SIZE_T]) AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) ]) # Prerequisites of lib/vasnprintf.c. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). AC_CHECK_DECLS([_snprintf], , , [[#include ]]) dnl Knowing DBL_EXPBIT0_WORD and DBL_EXPBIT0_BIT enables an optimization dnl in the code for NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE. AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION]) dnl We can avoid a lot of code by assuming that snprintf's return value dnl conforms to ISO C99. So check that. AC_REQUIRE([gl_SNPRINTF_RETVAL_C99]) case "$gl_cv_func_snprintf_retval_c99" in *yes) AC_DEFINE([HAVE_SNPRINTF_RETVAL_C99], [1], [Define if the return value of the snprintf function is the number of of bytes (excluding the terminating NUL) that would have been produced if the buffer had been large enough.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting 'long double' # arguments. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE]) case "$gl_cv_func_printf_infinite" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if dnl NEED_PRINTF_LONG_DOUBLE is already set. AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'long double' arguments.]) ;; esac ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) case "$gl_cv_func_printf_directive_a" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1], [Define if the vasnprintf implementation needs special code for the 'a' and 'A' directives.]) AC_CHECK_FUNCS([nl_langinfo]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) case "$gl_cv_func_printf_directive_f" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1], [Define if the vasnprintf implementation needs special code for the 'F' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1], [Define if the vasnprintf implementation needs special code for the 'ls' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the ' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING], [ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1], [Define if the vasnprintf implementation needs special code for the ' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1], [Define if the vasnprintf implementation needs special code for the '-' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO], [ AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1], [Define if the vasnprintf implementation needs special code for the 0 flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting large precisions. AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION], [ AC_REQUIRE([gl_PRINTF_PRECISION]) case "$gl_cv_func_printf_precision" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1], [Define if the vasnprintf implementation needs special code for supporting large precisions without arbitrary bounds.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory # conditions. AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM], [ AC_REQUIRE([gl_PRINTF_ENOMEM]) case "$gl_cv_func_printf_enomem" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_ENOMEM], [1], [Define if the vasnprintf implementation needs special code for surviving out-of-memory conditions.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance. AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS], [ AC_REQUIRE([gl_PREREQ_VASNPRINTF]) gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM ]) # Prerequisites of lib/asnprintf.c. AC_DEFUN([gl_PREREQ_ASNPRINTF], [ ]) shishi-1.0.2/gl/m4/fcntl.m40000644000000000000000000000600512126660052012163 00000000000000# fcntl.m4 serial 5 dnl Copyright (C) 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # For now, this module ensures that fcntl() # - supports F_DUPFD correctly # - supports or emulates F_DUPFD_CLOEXEC # - supports F_GETFD # Still to be ported to mingw: # - F_SETFD # - F_GETFL, F_SETFL # - F_GETOWN, F_SETOWN # - F_GETLK, F_SETLK, F_SETLKW AC_DEFUN([gl_FUNC_FCNTL], [ dnl Persuade glibc to expose F_DUPFD_CLOEXEC. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then gl_REPLACE_FCNTL else dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target dnl haiku alpha 2 F_DUPFD has wrong errno AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], [gl_cv_func_fcntl_f_dupfd_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[int result = 0; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; return result; ]])], [gl_cv_func_fcntl_f_dupfd_works=yes], [gl_cv_func_fcntl_f_dupfd_works=no], [# Guess that it works on glibc systems case $host_os in #(( *-gnu*) gl_cv_func_fcntl_f_dupfd_works="guessing yes";; *) gl_cv_func_fcntl_f_dupfd_works="guessing no";; esac])]) case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) gl_REPLACE_FCNTL AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD behavior does not match POSIX]) ;; esac dnl Many systems lack F_DUPFD_CLOEXEC AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC], [gl_cv_func_fcntl_f_dupfd_cloexec], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #ifndef F_DUPFD_CLOEXEC choke me #endif ]])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif ]])], [gl_cv_func_fcntl_f_dupfd_cloexec=yes], [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])], [gl_cv_func_fcntl_f_dupfd_cloexec=no])]) if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then gl_REPLACE_FCNTL dnl No witness macro needed for this bug. fi fi dnl Replace fcntl() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then gl_REPLACE_FCNTL fi ]) ]) AC_DEFUN([gl_REPLACE_FCNTL], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi ]) shishi-1.0.2/gl/m4/select.m40000644000000000000000000000630612126660052012340 00000000000000# select.m4 serial 7 dnl Copyright (C) 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SELECT], [ AC_REQUIRE([gl_HEADER_SYS_SELECT]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SOCKETS]) if test "$ac_cv_header_winsock2_h" = yes; then REPLACE_SELECT=1 else dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error dnl EFAULT. AC_CHECK_HEADERS_ONCE([sys/select.h]) AC_CACHE_CHECK([whether select supports a 0 argument], [gl_cv_func_select_supports0], [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #if HAVE_SYS_SELECT_H #include #endif int main () { struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0; }]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no], [ changequote(,)dnl case "$host_os" in # Guess no on Interix. interix*) gl_cv_func_select_supports0="guessing no";; # Guess yes otherwise. *) gl_cv_func_select_supports0="guessing yes";; esac changequote([,])dnl ]) ]) case "$gl_cv_func_select_supports0" in *yes) ;; *) REPLACE_SELECT=1 ;; esac dnl On FreeBSD 8.2, select() doesn't always reject bad fds. AC_CACHE_CHECK([whether select detects invalid fds], [gl_cv_func_select_detects_ebadf], [ AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include ]],[[ fd_set set; dup2(0, 16); FD_ZERO(&set); FD_SET(16, &set); close(16); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 5; return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF; ]])], [gl_cv_func_select_detects_ebadf=yes], [gl_cv_func_select_detects_ebadf=no], [ case "$host_os" in # Guess yes on glibc systems. *-gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;; # If we don't know, assume the worst. *) gl_cv_func_select_detects_ebadf="guessing no" ;; esac ]) ]) case $gl_cv_func_select_detects_ebadf in *yes) ;; *) REPLACE_SELECT=1 ;; esac fi dnl Determine the needed libraries. LIB_SELECT="$LIBSOCKET" if test $REPLACE_SELECT = 1; then case "$host_os" in mingw*) dnl On the MSVC platform, the function MsgWaitForMultipleObjects dnl (used in lib/select.c) requires linking with -luser32. On mingw, dnl it is implicit. AC_LINK_IFELSE( [AC_LANG_SOURCE([[ #define WIN32_LEAN_AND_MEAN #include int main () { MsgWaitForMultipleObjects (0, NULL, 0, 0, 0); return 0; }]])], [], [LIB_SELECT="$LIB_SELECT -luser32"]) ;; esac fi AC_SUBST([LIB_SELECT]) ]) shishi-1.0.2/gl/m4/off_t.m40000644000000000000000000000100612126660052012146 00000000000000# off_t.m4 serial 1 dnl Copyright (C) 2012-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check whether to override the 'off_t' type. dnl Set WINDOWS_64_BIT_OFF_T. AC_DEFUN([gl_TYPE_OFF_T], [ m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_OFF_T=0 ]) AC_SUBST([WINDOWS_64_BIT_OFF_T]) ]) shishi-1.0.2/gl/m4/gettimeofday.m40000644000000000000000000001172512126660052013543 00000000000000# serial 20 # Copyright (C) 2001-2003, 2005, 2007, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_FUNC_GETTIMEOFDAY], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_SYS_TIME_H]) AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([gettimeofday]) gl_gettimeofday_timezone=void if test $ac_cv_func_gettimeofday != yes; then HAVE_GETTIMEOFDAY=0 else gl_FUNC_GETTIMEOFDAY_CLOBBER AC_CACHE_CHECK([for gettimeofday with POSIX signature], [gl_cv_func_gettimeofday_posix_signature], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct timeval c; int gettimeofday (struct timeval *restrict, void *restrict); ]], [[/* glibc uses struct timezone * rather than the POSIX void * if _GNU_SOURCE is defined. However, since the only portable use of gettimeofday uses NULL as the second parameter, and since the glibc definition is actually more typesafe, it is not worth wrapping this to get a compliant signature. */ int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; int x = f (&c, 0); return !(x | c.tv_sec | c.tv_usec); ]])], [gl_cv_func_gettimeofday_posix_signature=yes], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int gettimeofday (struct timeval *restrict, struct timezone *restrict); ]])], [gl_cv_func_gettimeofday_posix_signature=almost], [gl_cv_func_gettimeofday_posix_signature=no])])]) if test $gl_cv_func_gettimeofday_posix_signature = almost; then gl_gettimeofday_timezone='struct timezone' elif test $gl_cv_func_gettimeofday_posix_signature != yes; then REPLACE_GETTIMEOFDAY=1 fi dnl If we override 'struct timeval', we also have to override gettimeofday. if test $REPLACE_STRUCT_TIMEVAL = 1; then REPLACE_GETTIMEOFDAY=1 fi m4_ifdef([gl_FUNC_TZSET_CLOBBER], [ gl_FUNC_TZSET_CLOBBER case "$gl_cv_func_tzset_clobber" in *yes) REPLACE_GETTIMEOFDAY=1 gl_GETTIMEOFDAY_REPLACE_LOCALTIME AC_DEFINE([tzset], [rpl_tzset], [Define to rpl_tzset if the wrapper function should be used.]) AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], [1], [Define if tzset clobbers localtime's static buffer.]) ;; esac ]) fi AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone], [Define this to 'void' or 'struct timezone' to match the system's declaration of the second argument to gettimeofday.]) ]) dnl See if gettimeofday clobbers the static buffer that localtime uses dnl for its return value. The gettimeofday function from Mac OS X 10.0.4 dnl (i.e., Darwin 1.3.7) has this problem. dnl dnl If it does, then arrange to use gettimeofday and localtime only via dnl the wrapper functions that work around the problem. AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER], [ AC_REQUIRE([gl_HEADER_SYS_TIME_H]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], [gl_cv_func_gettimeofday_clobber], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include ]], [[ time_t t = 0; struct tm *lt; struct tm saved_lt; struct timeval tv; lt = localtime (&t); saved_lt = *lt; gettimeofday (&tv, NULL); return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0; ]])], [gl_cv_func_gettimeofday_clobber=no], [gl_cv_func_gettimeofday_clobber=yes], [# When cross-compiling: case "$host_os" in # Guess all is fine on glibc systems. *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; # If we don't know, assume the worst. *) gl_cv_func_gettimeofday_clobber="guessing yes" ;; esac ])]) case "$gl_cv_func_gettimeofday_clobber" in *yes) REPLACE_GETTIMEOFDAY=1 gl_GETTIMEOFDAY_REPLACE_LOCALTIME AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1], [Define if gettimeofday clobbers the localtime buffer.]) ;; esac ]) AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [ AC_DEFINE([gmtime], [rpl_gmtime], [Define to rpl_gmtime if the replacement function should be used.]) AC_DEFINE([localtime], [rpl_localtime], [Define to rpl_localtime if the replacement function should be used.]) ]) # Prerequisites of lib/gettimeofday.c. AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [ AC_CHECK_HEADERS([sys/timeb.h]) AC_CHECK_FUNCS([_ftime]) ]) shishi-1.0.2/gl/m4/sys_time_h.m40000644000000000000000000000734112126660053013225 00000000000000# Configure a replacement for . # serial 8 # Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Martin Lambers. AC_DEFUN([gl_HEADER_SYS_TIME_H], [ dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1 dnl statements that occur in other macros. AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY]) ]) AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) gl_CHECK_NEXT_HEADERS([sys/time.h]) if test $ac_cv_header_sys_time_h != yes; then HAVE_SYS_TIME_H=0 fi dnl On native Windows with MSVC, 'struct timeval' is defined in dnl only. So include that header in the list. gl_PREREQ_SYS_H_WINSOCK2 AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif ]], [[static struct timeval x; x.tv_sec = x.tv_usec;]])], [gl_cv_sys_struct_timeval=yes], [gl_cv_sys_struct_timeval=no]) ]) if test $gl_cv_sys_struct_timeval != yes; then HAVE_STRUCT_TIMEVAL=0 else dnl On native Windows with a 64-bit 'time_t', 'struct timeval' is defined dnl (in and for mingw64, in only dnl for MSVC) with a tv_sec field of type 'long' (32-bit!), which is dnl smaller than the 'time_t' type mandated by POSIX. dnl On OpenBSD 5.1 amd64, tv_sec is 64 bits and time_t 32 bits, but dnl that is good enough. AC_CACHE_CHECK([for wide-enough struct timeval.tv_sec member], [gl_cv_sys_struct_timeval_tv_sec], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if HAVE_SYS_TIME_H #include #endif #include #if HAVE_WINSOCK2_H # include #endif ]], [[static struct timeval x; typedef int verify_tv_sec_type[ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1 ]; ]])], [gl_cv_sys_struct_timeval_tv_sec=yes], [gl_cv_sys_struct_timeval_tv_sec=no]) ]) if test $gl_cv_sys_struct_timeval_tv_sec != yes; then REPLACE_STRUCT_TIMEVAL=1 fi fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_SYS_TIME_H # include #endif #include ]], [gettimeofday]) ]) AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS], [ GNULIB_GETTIMEOFDAY=0; AC_SUBST([GNULIB_GETTIMEOFDAY]) dnl Assume POSIX behavior unless another module says otherwise. HAVE_GETTIMEOFDAY=1; AC_SUBST([HAVE_GETTIMEOFDAY]) HAVE_STRUCT_TIMEVAL=1; AC_SUBST([HAVE_STRUCT_TIMEVAL]) HAVE_SYS_TIME_H=1; AC_SUBST([HAVE_SYS_TIME_H]) REPLACE_GETTIMEOFDAY=0; AC_SUBST([REPLACE_GETTIMEOFDAY]) REPLACE_STRUCT_TIMEVAL=0; AC_SUBST([REPLACE_STRUCT_TIMEVAL]) ]) shishi-1.0.2/gl/m4/malloca.m40000644000000000000000000000110112126660052012455 00000000000000# malloca.m4 serial 1 dnl Copyright (C) 2003-2004, 2006-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MALLOCA], [ dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables dnl @ALLOCA@ and @LTALLOCA@. dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies. AC_REQUIRE([gl_EEMALLOC]) AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) ]) shishi-1.0.2/gl/m4/strnlen.m40000644000000000000000000000156112126660052012544 00000000000000# strnlen.m4 serial 13 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNLEN], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) dnl Persuade glibc to declare strnlen(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([strnlen]) if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else m4_pushdef([AC_LIBOBJ], [:]) dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]). AC_FUNC_STRNLEN m4_popdef([AC_LIBOBJ]) if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi ]) # Prerequisites of lib/strnlen.c. AC_DEFUN([gl_PREREQ_STRNLEN], [:]) shishi-1.0.2/gl/m4/ftello.m40000644000000000000000000000732712126660052012352 00000000000000# ftello.m4 serial 11 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FTELLO], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_STDIN_LARGE_OFFSET]) AC_REQUIRE([gl_SYS_TYPES_H]) dnl Persuade glibc to declare ftello(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([ftello]) if test $ac_cv_have_decl_ftello = no; then HAVE_DECL_FTELLO=0 fi AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ftello (stdin);]])], [gl_cv_func_ftello=yes], [gl_cv_func_ftello=no]) ]) if test $gl_cv_func_ftello = no; then HAVE_FTELLO=0 else if test $WINDOWS_64_BIT_OFF_T = 1; then REPLACE_FTELLO=1 fi if test $gl_cv_var_stdin_large_offset = no; then REPLACE_FTELLO=1 fi if test $REPLACE_FTELLO = 0; then dnl Detect bug on Solaris. dnl ftell and ftello produce incorrect results after putc that followed a dnl getc call that reached EOF on Solaris. This is because the _IOREAD dnl flag does not get cleared in this case, even though _IOWRT gets set, dnl and ftell and ftello look whether the _IOREAD flag is set. AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether ftello works], [gl_cv_func_ftello_works], [ dnl Initial guess, used when cross-compiling or when /dev/tty cannot dnl be opened. changequote(,)dnl case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_ftello_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_ftello_works="guessing yes" ;; esac changequote([,])dnl AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #define TESTFILE "conftest.tmp" int main (void) { FILE *fp; /* Create a file with some contents. */ fp = fopen (TESTFILE, "w"); if (fp == NULL) return 70; if (fwrite ("foogarsh", 1, 8, fp) < 8) return 71; if (fclose (fp)) return 72; /* The file's contents is now "foogarsh". */ /* Try writing after reading to EOF. */ fp = fopen (TESTFILE, "r+"); if (fp == NULL) return 73; if (fseek (fp, -1, SEEK_END)) return 74; if (!(getc (fp) == 'h')) return 1; if (!(getc (fp) == EOF)) return 2; if (!(ftell (fp) == 8)) return 3; if (!(ftell (fp) == 8)) return 4; if (!(putc ('!', fp) == '!')) return 5; if (!(ftell (fp) == 9)) return 6; if (!(fclose (fp) == 0)) return 7; fp = fopen (TESTFILE, "r"); if (fp == NULL) return 75; { char buf[10]; if (!(fread (buf, 1, 10, fp) == 9)) return 10; if (!(memcmp (buf, "foogarsh!", 9) == 0)) return 11; } if (!(fclose (fp) == 0)) return 12; /* The file's contents is now "foogarsh!". */ return 0; }]])], [gl_cv_func_ftello_works=yes], [gl_cv_func_ftello_works=no], [:]) ]) case "$gl_cv_func_ftello_works" in *yes) ;; *) REPLACE_FTELLO=1 AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1], [Define to 1 if the system's ftello function has the Solaris bug.]) ;; esac fi fi ]) # Prerequisites of lib/ftello.c. AC_DEFUN([gl_PREREQ_FTELLO], [ dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64 dnl makes it usable again. AC_CHECK_FUNCS([_ftelli64]) ]) shishi-1.0.2/gl/m4/snprintf.m40000644000000000000000000000305512126660052012722 00000000000000# snprintf.m4 serial 6 dnl Copyright (C) 2002-2004, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Libintl 0.17 will replace snprintf only if it does not support %1$s, dnl but defers to any gnulib snprintf replacements. Therefore, gnulib dnl must guarantee that the decision for replacing snprintf is a superset dnl of the reasons checked by libintl. AC_DEFUN([gl_FUNC_SNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_cv_func_snprintf_usable=no AC_CHECK_FUNCS([snprintf]) if test $ac_cv_func_snprintf = yes; then gl_SNPRINTF_SIZE1 case "$gl_cv_func_snprintf_size1" in *yes) gl_SNPRINTF_RETVAL_C99 case "$gl_cv_func_snprintf_retval_c99" in *yes) gl_PRINTF_POSITIONS case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_snprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_snprintf_usable = no; then gl_REPLACE_SNPRINTF fi AC_CHECK_DECLS_ONCE([snprintf]) if test $ac_cv_have_decl_snprintf = no; then HAVE_DECL_SNPRINTF=0 fi ]) AC_DEFUN([gl_REPLACE_SNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([snprintf]) if test $ac_cv_func_snprintf = yes; then REPLACE_SNPRINTF=1 fi gl_PREREQ_SNPRINTF ]) # Prerequisites of lib/snprintf.c. AC_DEFUN([gl_PREREQ_SNPRINTF], [:]) shishi-1.0.2/gl/m4/sys_select_h.m40000644000000000000000000000671612126660053013553 00000000000000# sys_select_h.m4 serial 20 dnl Copyright (C) 2006-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_HEADER_SYS_SELECT], [ AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS]) AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_sys_select_h_selfcontained], [ dnl Test against two bugs: dnl 1. On many platforms, assumes prior inclusion of dnl . dnl 2. On OSF/1 4.0, provides only a forward declaration dnl of 'struct timeval', and no definition of this type. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct timeval b;]])], [gl_cv_header_sys_select_h_selfcontained=yes], [gl_cv_header_sys_select_h_selfcontained=no]) dnl Test against another bug: dnl 3. On Solaris 10, provides an FD_ZERO implementation dnl that relies on memset(), but without including . if test $gl_cv_header_sys_select_h_selfcontained = yes; then AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int memset; int bzero;]]) ], [AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[ #undef memset #define memset nonexistent_memset extern #ifdef __cplusplus "C" #endif void *memset (void *, int, unsigned long); #undef bzero #define bzero nonexistent_bzero extern #ifdef __cplusplus "C" #endif void bzero (void *, unsigned long); fd_set fds; FD_ZERO (&fds); ]]) ], [], [gl_cv_header_sys_select_h_selfcontained=no]) ]) fi ]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([sys/select.h]) if test $ac_cv_header_sys_select_h = yes; then HAVE_SYS_SELECT_H=1 else HAVE_SYS_SELECT_H=0 fi AC_SUBST([HAVE_SYS_SELECT_H]) gl_PREREQ_SYS_H_WINSOCK2 dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Some systems require prerequisite headers. */ #include #if !(defined __GLIBC__ && !defined __UCLIBC__) && HAVE_SYS_TIME_H # include #endif #include ]], [pselect select]) ]) AC_DEFUN([gl_SYS_SELECT_MODULE_INDICATOR], [ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_SYS_SELECT_H_DEFAULTS], [ GNULIB_PSELECT=0; AC_SUBST([GNULIB_PSELECT]) GNULIB_SELECT=0; AC_SUBST([GNULIB_SELECT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_PSELECT=1; AC_SUBST([HAVE_PSELECT]) REPLACE_PSELECT=0; AC_SUBST([REPLACE_PSELECT]) REPLACE_SELECT=0; AC_SUBST([REPLACE_SELECT]) ]) shishi-1.0.2/gl/m4/base64.m40000644000000000000000000000066412126660051012145 00000000000000# base64.m4 serial 4 dnl Copyright (C) 2004, 2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_BASE64], [ gl_PREREQ_BASE64 ]) # Prerequisites of lib/base64.c. AC_DEFUN([gl_PREREQ_BASE64], [ AC_REQUIRE([AC_C_RESTRICT]) ]) shishi-1.0.2/gl/m4/errno_h.m40000644000000000000000000000623412126660052012515 00000000000000# errno_h.m4 serial 12 dnl Copyright (C) 2004, 2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_HEADER_ERRNO_H], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [ AC_EGREP_CPP([booboo],[ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif ], [gl_cv_header_errno_h_complete=no], [gl_cv_header_errno_h_complete=yes]) ]) if test $gl_cv_header_errno_h_complete = yes; then ERRNO_H='' else gl_NEXT_HEADERS([errno.h]) ERRNO_H='errno.h' fi AC_SUBST([ERRNO_H]) AM_CONDITIONAL([GL_GENERATE_ERRNO_H], [test -n "$ERRNO_H"]) gl_REPLACE_ERRNO_VALUE([EMULTIHOP]) gl_REPLACE_ERRNO_VALUE([ENOLINK]) gl_REPLACE_ERRNO_VALUE([EOVERFLOW]) ]) # Assuming $1 = EOVERFLOW. # The EOVERFLOW errno value ought to be defined in , according to # POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and # some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined. # Check for the value of EOVERFLOW. # Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE. AC_DEFUN([gl_REPLACE_ERRNO_VALUE], [ if test -n "$ERRNO_H"; then AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [ AC_EGREP_CPP([yes],[ #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=yes], [gl_cv_header_errno_h_]$1[=no]) if test $gl_cv_header_errno_h_]$1[ = no; then AC_EGREP_CPP([yes],[ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=hidden]) if test $gl_cv_header_errno_h_]$1[ = hidden; then dnl The macro exists but is hidden. dnl Define it to the same value. AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [ #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include ]) fi fi ]) case $gl_cv_header_errno_h_]$1[ in yes | no) ]$1[_HIDDEN=0; ]$1[_VALUE= ;; *) ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1[" ;; esac AC_SUBST($1[_HIDDEN]) AC_SUBST($1[_VALUE]) fi ]) dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. dnl Remove this when we can assume autoconf >= 2.61. m4_ifdef([AC_COMPUTE_INT], [], [ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])]) ]) shishi-1.0.2/gl/m4/stdalign.m40000644000000000000000000000376212126660052012671 00000000000000# Check for stdalign.h that conforms to C11. dnl Copyright 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prepare for substituting if it is not supported. AC_DEFUN([gl_STDALIGN_H], [ AC_CACHE_CHECK([for working stdalign.h], [gl_cv_header_working_stdalign_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ (__GNUC__ || __IBMC__ || __IBMCPP__ \ || 0x5110 <= __SUNPRO_C || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif ]])], [gl_cv_header_working_stdalign_h=yes], [gl_cv_header_working_stdalign_h=no])]) if test $gl_cv_header_working_stdalign_h = yes; then STDALIGN_H='' else STDALIGN_H='stdalign.h' fi AC_SUBST([STDALIGN_H]) AM_CONDITIONAL([GL_GENERATE_STDALIGN_H], [test -n "$STDALIGN_H"]) ]) shishi-1.0.2/gl/m4/gc-md4.m40000644000000000000000000000061212126660052012126 00000000000000# gc-md4.m4 serial 2 dnl Copyright (C) 2005, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_GC_MD4], [ AC_REQUIRE([gl_GC]) if test "$ac_cv_libgcrypt" != yes; then gl_MD4 fi ]) shishi-1.0.2/gl/m4/timespec.m40000644000000000000000000000051512126660053012667 00000000000000#serial 15 # Copyright (C) 2000-2001, 2003-2007, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering AC_DEFUN([gl_TIMESPEC], [:]) shishi-1.0.2/gl/m4/ld-output-def.m40000644000000000000000000000203612126660052013546 00000000000000# ld-output-def.m4 serial 2 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson # gl_LD_OUTPUT_DEF() # ------------- # Check if linker supports -Wl,--output-def and define automake # conditional HAVE_LD_OUTPUT_DEF if it is. AC_DEFUN([gl_LD_OUTPUT_DEF], [ AC_CACHE_CHECK([if gcc/ld supports -Wl,--output-def], [gl_cv_ld_output_def], [if test "$enable_shared" = no; then gl_cv_ld_output_def="not needed, shared libraries are disabled" else gl_ldflags_save=$LDFLAGS LDFLAGS="-Wl,--output-def,conftest.def" AC_LINK_IFELSE([AC_LANG_PROGRAM([])], [gl_cv_ld_output_def=yes], [gl_cv_ld_output_def=no]) rm -f conftest.def LDFLAGS="$gl_ldflags_save" fi]) AM_CONDITIONAL([HAVE_LD_OUTPUT_DEF], test "x$gl_cv_ld_output_def" = "xyes") ]) shishi-1.0.2/gl/m4/gnulib-common.m40000644000000000000000000003332112126660052013624 00000000000000# gnulib-common.m4 serial 33 dnl Copyright (C) 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # gl_COMMON # is expanded unconditionally through gnulib-tool magic. AC_DEFUN([gl_COMMON], [ dnl Use AC_REQUIRE here, so that the code is expanded once only. AC_REQUIRE([gl_00GNULIB]) AC_REQUIRE([gl_COMMON_BODY]) ]) AC_DEFUN([gl_COMMON_BODY], [ AH_VERBATIM([_Noreturn], [/* The _Noreturn keyword of C11. */ #if ! (defined _Noreturn \ || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) # if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ || 0x5110 <= __SUNPRO_C) # define _Noreturn __attribute__ ((__noreturn__)) # elif defined _MSC_VER && 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif ]) AH_VERBATIM([isoc99_inline], [/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for Mac OS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif]) AH_VERBATIM([unused_parameter], [/* Define as a marker that can be attached to declarations that might not be used. This helps to reduce warnings, such as from GCC -Wunused-parameter. */ #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_UNUSED __attribute__ ((__unused__)) #else # define _GL_UNUSED #endif /* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name is a misnomer outside of parameter lists. */ #define _UNUSED_PARAMETER_ _GL_UNUSED /* The __pure__ attribute was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* The __const__ attribute was added in gcc 2.95. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST /* empty */ #endif ]) dnl Preparation for running test programs: dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not dnl to /dev/tty, so they can be redirected to log files. Such diagnostics dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N. LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ]) # gl_MODULE_INDICATOR_CONDITION # expands to a C preprocessor expression that evaluates to 1 or 0, depending # whether a gnulib module that has been requested shall be considered present # or not. m4_define([gl_MODULE_INDICATOR_CONDITION], [1]) # gl_MODULE_INDICATOR_SET_VARIABLE([modulename]) # sets the shell variable that indicates the presence of the given module to # a C preprocessor expression that will evaluate to 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE], [ gl_MODULE_INDICATOR_SET_VARIABLE_AUX( [GNULIB_[]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])], [gl_MODULE_INDICATOR_CONDITION]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable]) # modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION. # The shell variable's value is a C preprocessor expression that evaluates # to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX], [ m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1], [ dnl Simplify the expression VALUE || 1 to 1. $1=1 ], [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1], [gl_MODULE_INDICATOR_CONDITION])]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition]) # modifies the shell variable to include the given condition. The shell # variable's value is a C preprocessor expression that evaluates to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR], [ dnl Simplify the expression 1 || CONDITION to 1. if test "$[]$1" != 1; then dnl Simplify the expression 0 || CONDITION to CONDITION. if test "$[]$1" = 0; then $1=$2 else $1="($[]$1 || $2)" fi fi ]) # gl_MODULE_INDICATOR([modulename]) # defines a C macro indicating the presence of the given module # in a location where it can be used. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 0 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR], [ AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [gl_MODULE_INDICATOR_CONDITION], [Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module $1 shall be considered present.]) ]) # gl_MODULE_INDICATOR_FOR_TESTS([modulename]) # defines a C macro indicating the presence of the given module # in lib or tests. This is useful to determine whether the module # should be tested. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [ AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], [Define to 1 when the gnulib module $1 should be tested.]) ]) # gl_ASSERT_NO_GNULIB_POSIXCHECK # asserts that there will never be a need to #define GNULIB_POSIXCHECK. # and thereby enables an optimization of configure and config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK], [ dnl Override gl_WARN_ON_USE_PREPARE. dnl But hide this definition from 'aclocal'. AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], []) ]) # gl_ASSERT_NO_GNULIB_TESTS # asserts that there will be no gnulib tests in the scope of the configure.ac # and thereby enables an optimization of config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS], [ dnl Override gl_MODULE_INDICATOR_FOR_TESTS. AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], []) ]) # Test whether exists. # Set HAVE_FEATURES_H. AC_DEFUN([gl_FEATURES_H], [ AC_CHECK_HEADERS_ONCE([features.h]) if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi AC_SUBST([HAVE_FEATURES_H]) ]) # m4_foreach_w # is a backport of autoconf-2.59c's m4_foreach_w. # Remove this macro when we can assume autoconf >= 2.60. m4_ifndef([m4_foreach_w], [m4_define([m4_foreach_w], [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) # AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH]) # ---------------------------------------------------- # Backport of autoconf-2.63b's macro. # Remove this macro when we can assume autoconf >= 2.64. m4_ifndef([AS_VAR_IF], [m4_define([AS_VAR_IF], [AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])]) # gl_PROG_CC_C99 # Modifies the value of the shell variable CC in an attempt to make $CC # understand ISO C99 source code. # This is like AC_PROG_CC_C99, except that # - AC_PROG_CC_C99 did not exist in Autoconf versions < 2.60, # - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC # , # but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99 # . # Remaining problems: # - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options # to CC twice # . # - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard. AC_DEFUN([gl_PROG_CC_C99], [ dnl Change that version number to the minimum Autoconf version that supports dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls. m4_version_prereq([9.0], [AC_REQUIRE([AC_PROG_CC_C99])], [AC_REQUIRE([AC_PROG_CC_STDC])]) ]) # gl_PROG_AR_RANLIB # Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler. # The user can set the variables AR, ARFLAGS, RANLIB if he wants to override # the values. AC_DEFUN([gl_PROG_AR_RANLIB], [ dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler dnl as "cc", and GCC as "gcc". They have different object file formats and dnl library formats. In particular, the GNU binutils programs ar, ranlib dnl produce libraries that work only with gcc, not with cc. AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler], [ AC_EGREP_CPP([Amsterdam], [ #ifdef __ACK__ Amsterdam #endif ], [gl_cv_c_amsterdam_compiler=yes], [gl_cv_c_amsterdam_compiler=no]) ]) if test -z "$AR"; then if test $gl_cv_c_amsterdam_compiler = yes; then AR='cc -c.a' if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else dnl Use the Automake-documented default values for AR and ARFLAGS, dnl but prefer ${host}-ar over ar (useful for cross-compiling). AC_CHECK_TOOL([AR], [ar], [ar]) if test -z "$ARFLAGS"; then ARFLAGS='cru' fi fi else if test -z "$ARFLAGS"; then ARFLAGS='cru' fi fi AC_SUBST([AR]) AC_SUBST([ARFLAGS]) if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else dnl Use the ranlib program if it is available. AC_PROG_RANLIB fi fi AC_SUBST([RANLIB]) ]) # AC_PROG_MKDIR_P # is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix # for interoperability with automake-1.9.6 from autoconf-2.62. # Remove this macro when we can assume autoconf >= 2.62 or # autoconf >= 2.60 && automake >= 1.10. # AC_AUTOCONF_VERSION was introduced in 2.62, so use that as the witness. m4_ifndef([AC_AUTOCONF_VERSION],[ m4_ifdef([AC_PROG_MKDIR_P], [ dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed. m4_define([AC_PROG_MKDIR_P], m4_defn([AC_PROG_MKDIR_P])[ AC_SUBST([MKDIR_P])])], [ dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P. AC_DEFUN_ONCE([AC_PROG_MKDIR_P], [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake MKDIR_P='$(mkdir_p)' AC_SUBST([MKDIR_P])])]) ]) # AC_C_RESTRICT # This definition overrides the AC_C_RESTRICT macro from autoconf 2.60..2.61, # so that mixed use of GNU C and GNU C++ and mixed use of Sun C and Sun C++ # works. # This definition can be removed once autoconf >= 2.62 can be assumed. # AC_AUTOCONF_VERSION was introduced in 2.62, so use that as the witness. m4_ifndef([AC_AUTOCONF_VERSION],[ AC_DEFUN([AC_C_RESTRICT], [AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict], [ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; }]], [[int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t)]])], [ac_cv_c_restrict=$ac_kw]) test "$ac_cv_c_restrict" != no && break done ]) AH_VERBATIM([restrict], [/* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict, even though the corresponding Sun C compiler does, which causes "#define restrict _Restrict" in the previous line. Perhaps some future version of Sun C++ will work with _Restrict; if so, it'll probably define __RESTRICT, just as Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict #endif]) case $ac_cv_c_restrict in restrict) ;; no) AC_DEFINE([restrict], []) ;; *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; esac ]) ]) # gl_BIGENDIAN # is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd. # Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some # macros invoke AC_C_BIGENDIAN with arguments. AC_DEFUN([gl_BIGENDIAN], [ AC_C_BIGENDIAN ]) # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it) # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not # output a spurious "(cached)" mark in the midst of other configure output. # This macro should be used instead of AC_CACHE_VAL when it is not surrounded # by an AC_MSG_CHECKING/AC_MSG_RESULT pair. AC_DEFUN([gl_CACHE_VAL_SILENT], [ saved_as_echo_n="$as_echo_n" as_echo_n=':' AC_CACHE_VAL([$1], [$2]) as_echo_n="$saved_as_echo_n" ]) shishi-1.0.2/gl/m4/malloc.m40000644000000000000000000000627612126660052012336 00000000000000# malloc.m4 serial 14 dnl Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. m4_version_prereq([2.70], [] ,[ # This is taken from the following Autoconf patch: # http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9 AC_DEFUN([_AC_FUNC_MALLOC_IF], [ AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CHECK_HEADERS([stdlib.h]) AC_CACHE_CHECK([for GNU libc compatible malloc], [ac_cv_func_malloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif ]], [[return ! malloc (0);]]) ], [ac_cv_func_malloc_0_nonnull=yes], [ac_cv_func_malloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* \ | hpux* | solaris* | cygwin* | mingw*) ac_cv_func_malloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_malloc_0_nonnull=no ;; esac ]) ]) AS_IF([test $ac_cv_func_malloc_0_nonnull = yes], [$1], [$2]) ])# _AC_FUNC_MALLOC_IF ]) # gl_FUNC_MALLOC_GNU # ------------------ # Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if # it is not. AC_DEFUN([gl_FUNC_MALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) dnl _AC_FUNC_MALLOC_IF is defined in Autoconf. _AC_FUNC_MALLOC_IF( [AC_DEFINE([HAVE_MALLOC_GNU], [1], [Define to 1 if your system has a GNU libc compatible 'malloc' function, and to 0 otherwise.])], [AC_DEFINE([HAVE_MALLOC_GNU], [0]) REPLACE_MALLOC=1 ]) ]) # gl_FUNC_MALLOC_POSIX # -------------------- # Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it # fails), and replace malloc if it is not. AC_DEFUN([gl_FUNC_MALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test $gl_cv_func_malloc_posix = yes; then AC_DEFINE([HAVE_MALLOC_POSIX], [1], [Define if the 'malloc' function is POSIX compliant.]) else REPLACE_MALLOC=1 fi ]) # Test whether malloc, realloc, calloc are POSIX compliant, # Set gl_cv_func_malloc_posix to yes or no accordingly. AC_DEFUN([gl_CHECK_MALLOC_POSIX], [ AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant], [gl_cv_func_malloc_posix], [ dnl It is too dangerous to try to allocate a large amount of memory: dnl some systems go to their knees when you do that. So assume that dnl all Unix implementations of the function are POSIX compliant. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[]], [[#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ choke me #endif ]])], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no]) ]) ]) shishi-1.0.2/gl/m4/alloca.m40000644000000000000000000001037212126660051012311 00000000000000# alloca.m4 serial 14 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ALLOCA], [ AC_REQUIRE([AC_FUNC_ALLOCA]) if test $ac_cv_func_alloca_works = no; then gl_PREREQ_ALLOCA fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [ AC_EGREP_CPP([Need own alloca], [ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no]) ]) if test $gl_cv_rpl_alloca = yes; then dnl OK, alloca can be implemented through a compiler built-in. AC_DEFINE([HAVE_ALLOCA], [1], [Define to 1 if you have 'alloca' after including , a header that may be supplied by this distribution.]) ALLOCA_H=alloca.h else dnl alloca exists as a library function, i.e. it is slow and probably dnl a memory leak. Don't define HAVE_ALLOCA in this case. ALLOCA_H= fi else ALLOCA_H=alloca.h fi AC_SUBST([ALLOCA_H]) AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"]) ]) # Prerequisites of lib/alloca.c. # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. AC_DEFUN([gl_PREREQ_ALLOCA], [:]) # This works around a bug in autoconf <= 2.68. # See . m4_version_prereq([2.69], [] ,[ # This is taken from the following Autoconf patch: # http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497 # _AC_LIBOBJ_ALLOCA # ----------------- # Set up the LIBOBJ replacement of 'alloca'. Well, not exactly # AC_LIBOBJ since we actually set the output variable 'ALLOCA'. # Nevertheless, for Automake, AC_LIBSOURCES it. m4_define([_AC_LIBOBJ_ALLOCA], [# The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray, [AC_EGREP_CPP(webecray, [#if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif ], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do AC_CHECK_FUNC($ac_func, [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, [Define to one of '_getb67', 'GETB67', 'getb67' for Cray-2 and Cray-YMP systems. This function is required for 'alloca.c' support on those systems.]) break]) done fi AC_CACHE_CHECK([stack direction for C alloca], [ac_cv_c_stack_direction], [AC_RUN_IFELSE([AC_LANG_SOURCE( [AC_INCLUDES_DEFAULT int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; }])], [ac_cv_c_stack_direction=1], [ac_cv_c_stack_direction=-1], [ac_cv_c_stack_direction=0])]) AH_VERBATIM([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ @%:@undef STACK_DIRECTION])dnl AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) ])# _AC_LIBOBJ_ALLOCA ]) shishi-1.0.2/gl/m4/strdup.m40000644000000000000000000000165712126660052012406 00000000000000# strdup.m4 serial 13 dnl Copyright (C) 2002-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRDUP], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([strdup]) AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) AC_DEFUN([gl_FUNC_STRDUP_POSIX], [ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) AC_CHECK_FUNCS_ONCE([strdup]) if test $ac_cv_func_strdup = yes; then if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi fi AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) # Prerequisites of lib/strdup.c. AC_DEFUN([gl_PREREQ_STRDUP], [:]) shishi-1.0.2/gl/strcasecmp.c0000644000000000000000000000342712126660053012611 00000000000000/* Case-insensitive string comparison function. Copyright (C) 1998-1999, 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include #include #include #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) /* Compare strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function does not work with multibyte strings! */ int strcasecmp (const char *s1, const char *s2) { const unsigned char *p1 = (const unsigned char *) s1; const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2) return 0; do { c1 = TOLOWER (*p1); c2 = TOLOWER (*p2); if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); } shishi-1.0.2/gl/gethostname.c0000644000000000000000000000537112126660051012761 00000000000000/* gethostname emulation for SysV and POSIX.1. Copyright (C) 1992, 2003, 2006, 2008-2013 Free Software Foundation, Inc. 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 . */ /* David MacKenzie Windows port by Simon Josefsson */ #include #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) /* Unix API. */ /* Specification. */ #include #ifdef HAVE_UNAME # include #endif #include /* Put up to LEN chars of the host name into NAME. Null terminate it if the name is shorter than LEN. Return 0 if ok, -1 if error. */ #include int gethostname (char *name, size_t len) { #ifdef HAVE_UNAME struct utsname uts; if (uname (&uts) == -1) return -1; if (len > sizeof (uts.nodename)) { /* More space than we need is available. */ name[sizeof (uts.nodename)] = '\0'; len = sizeof (uts.nodename); } strncpy (name, uts.nodename, len); #else strcpy (name, ""); /* Hardcode your system name if you want. */ #endif return 0; } #else /* Native Windows API. Which primitive to choose? - gethostname() requires linking with -lws2_32. - GetComputerName() does not return the right kind of hostname. - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname, but it is hard to use portably: - It requires defining _WIN32_WINNT to at least 0x0500. - With mingw, it also requires "#define GetComputerNameEx GetComputerNameExA". - With older versions of mingw, none of the declarations are present at all, not even of the enum value ComputerNameDnsHostname. So we use gethostname(). Linking with -lws2_32 is the least evil. */ #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get INT_MAX. */ #include /* Get set_winsock_errno. */ #include "w32sock.h" #include "sockets.h" #undef gethostname int rpl_gethostname (char *name, size_t len) { int r; if (len > INT_MAX) len = INT_MAX; gl_sockets_startup (SOCKETS_1_1); r = gethostname (name, (int) len); if (r < 0) set_winsock_errno (); return r; } #endif shishi-1.0.2/gl/stddef.in.h0000644000000000000000000000523212126660053012324 00000000000000/* A substitute for POSIX 2008 , for platforms that have issues. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Eric Blake. */ /* * POSIX 2008 for platforms that have issues. * */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_wchar_t || defined __need_size_t \ || defined __need_ptrdiff_t || defined __need_NULL \ || defined __need_wint_t /* Special invocation convention inside gcc header files. In particular, gcc provides a version of that blindly redefines NULL even when __need_wint_t was defined, even though wint_t is not normally provided by . Hence, we must remember if special invocation has ever been used to obtain wint_t, in which case we need to clean up NULL yet again. */ # if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T) # ifdef __need_wint_t # undef _@GUARD_PREFIX@_STDDEF_H # define _GL_STDDEF_WINT_T # endif # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ # endif #else /* Normal invocation convention. */ # ifndef _@GUARD_PREFIX@_STDDEF_H /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ # ifndef _@GUARD_PREFIX@_STDDEF_H # define _@GUARD_PREFIX@_STDDEF_H /* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ #if @REPLACE_NULL@ # undef NULL # ifdef __cplusplus /* ISO C++ says that the macro NULL must expand to an integer constant expression, hence '((void *) 0)' is not allowed in C++. */ # if __GNUG__ >= 3 /* GNU C++ has a __null macro that behaves like an integer ('int' or 'long') but has the same size as a pointer. Use that, to avoid warnings. */ # define NULL __null # else # define NULL 0L # endif # else # define NULL ((void *) 0) # endif #endif /* Some platforms lack wchar_t. */ #if !@HAVE_WCHAR_T@ # define wchar_t int #endif # endif /* _@GUARD_PREFIX@_STDDEF_H */ # endif /* _@GUARD_PREFIX@_STDDEF_H */ #endif /* __need_XXX */ shishi-1.0.2/gl/sha1.h0000644000000000000000000000607612126660053011311 00000000000000/* Declarations of functions and data types used for SHA1 sum library functions. Copyright (C) 2000-2001, 2003, 2005-2006, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef SHA1_H # define SHA1_H 1 # include # include # ifdef __cplusplus extern "C" { # endif #define SHA1_DIGEST_SIZE 20 /* Structure to save state of computation between the single steps. */ struct sha1_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t E; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void sha1_init_ctx (struct sha1_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 20 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf); /* Put result from CTX in first 20 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf); /* Compute SHA1 message digest for bytes read from STREAM. The resulting message digest number will be written into the 20 bytes beginning at RESBLOCK. */ extern int sha1_stream (FILE *stream, void *resblock); /* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *sha1_buffer (const char *buffer, size_t len, void *resblock); # ifdef __cplusplus } # endif #endif shishi-1.0.2/gl/xgethostname.c0000644000000000000000000000413312126660054013147 00000000000000/* xgethostname.c -- return current hostname with unlimited length Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2013 Free Software Foundation, Inc. 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 . */ /* written by Jim Meyering */ #include /* Specification. */ #include "xgethostname.h" #include #include #include #include "xalloc.h" #ifndef INITIAL_HOSTNAME_LENGTH # define INITIAL_HOSTNAME_LENGTH 34 #endif /* Return the current hostname in malloc'd storage. If malloc fails, exit. Upon any other failure, return NULL and set errno. */ char * xgethostname (void) { char *hostname = NULL; size_t size = INITIAL_HOSTNAME_LENGTH; while (1) { /* Use SIZE_1 here rather than SIZE to work around the bug in SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME even when the name is as long as the supplied buffer. */ size_t size_1; hostname = x2realloc (hostname, &size); size_1 = size - 1; hostname[size_1 - 1] = '\0'; errno = 0; if (gethostname (hostname, size_1) == 0) { if (! hostname[size_1 - 1]) break; } else if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL /* OSX/Darwin does this when the buffer is not large enough */ && errno != ENOMEM) { int saved_errno = errno; free (hostname); errno = saved_errno; return NULL; } } return hostname; } shishi-1.0.2/gl/getpass.c0000644000000000000000000001214012126660051012101 00000000000000/* Copyright (C) 1992-2001, 2003-2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, 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 . */ #ifndef _LIBC # include #endif #include "getpass.h" #include #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) # include # if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING # if HAVE_STDIO_EXT_H # include # endif # else # define __fsetlocking(stream, type) /* empty */ # endif # if HAVE_TERMIOS_H # include # endif # if USE_UNLOCKED_IO # include "unlocked-io.h" # else # if !HAVE_DECL_FFLUSH_UNLOCKED # undef fflush_unlocked # define fflush_unlocked(x) fflush (x) # endif # if !HAVE_DECL_FLOCKFILE # undef flockfile # define flockfile(x) ((void) 0) # endif # if !HAVE_DECL_FUNLOCKFILE # undef funlockfile # define funlockfile(x) ((void) 0) # endif # if !HAVE_DECL_FPUTS_UNLOCKED # undef fputs_unlocked # define fputs_unlocked(str,stream) fputs (str, stream) # endif # if !HAVE_DECL_PUTC_UNLOCKED # undef putc_unlocked # define putc_unlocked(c,stream) putc (c, stream) # endif # endif /* It is desirable to use this bit on systems that have it. The only bit of terminal state we want to twiddle is echoing, which is done in software; there is no need to change the state of the terminal hardware. */ # ifndef TCSASOFT # define TCSASOFT 0 # endif static void call_fclose (void *arg) { if (arg != NULL) fclose (arg); } char * getpass (const char *prompt) { FILE *tty; FILE *in, *out; struct termios s, t; bool tty_changed = false; static char *buf; static size_t bufsize; ssize_t nread; /* Try to write to and read from the terminal if we can. If we can't open the terminal, use stderr and stdin. */ tty = fopen ("/dev/tty", "w+"); if (tty == NULL) { in = stdin; out = stderr; } else { /* We do the locking ourselves. */ __fsetlocking (tty, FSETLOCKING_BYCALLER); out = in = tty; } flockfile (out); /* Turn echoing off if it is on now. */ # if HAVE_TCGETATTR if (tcgetattr (fileno (in), &t) == 0) { /* Save the old one. */ s = t; /* Tricky, tricky. */ t.c_lflag &= ~(ECHO | ISIG); tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0); } # endif /* Write the prompt. */ fputs_unlocked (prompt, out); fflush_unlocked (out); /* Read the password. */ nread = getline (&buf, &bufsize, in); /* According to the C standard, input may not be followed by output on the same stream without an intervening call to a file positioning function. Suppose in == out; then without this fseek call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets echoed, whereas on IRIX, the following newline is not output as it should be. POSIX imposes similar restrictions if fileno (in) == fileno (out). The POSIX restrictions are tricky and change from POSIX version to POSIX version, so play it safe and invoke fseek even if in != out. */ fseeko (out, 0, SEEK_CUR); if (buf != NULL) { if (nread < 0) buf[0] = '\0'; else if (buf[nread - 1] == '\n') { /* Remove the newline. */ buf[nread - 1] = '\0'; if (tty_changed) { /* Write the newline that was not echoed. */ putc_unlocked ('\n', out); } } } /* Restore the original setting. */ # if HAVE_TCSETATTR if (tty_changed) tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s); # endif funlockfile (out); call_fclose (tty); return buf; } #else /* W32 native */ /* Windows implementation by Martin Lambers , improved by Simon Josefsson. */ /* For PASS_MAX. */ # include /* For _getch(). */ # include /* For strdup(). */ # include # ifndef PASS_MAX # define PASS_MAX 512 # endif char * getpass (const char *prompt) { char getpassbuf[PASS_MAX + 1]; size_t i = 0; int c; if (prompt) { fputs (prompt, stderr); fflush (stderr); } for (;;) { c = _getch (); if (c == '\r') { getpassbuf[i] = '\0'; break; } else if (i < PASS_MAX) { getpassbuf[i++] = c; } if (i >= PASS_MAX) { getpassbuf[i] = '\0'; break; } } if (prompt) { fputs ("\r\n", stderr); fflush (stderr); } return strdup (getpassbuf); } #endif shishi-1.0.2/gl/memchr.c0000644000000000000000000001334612126660053011721 00000000000000/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2013 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), with help from Dan Sahlin (dan@sics.se) and commentary by Jim Blandy (jimb@ai.mit.edu); adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), and implemented by Roland McGrath (roland@ai.mit.edu). NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. 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 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 . */ #ifndef _LIBC # include #endif #include #include #if defined _LIBC # include #else # define reg_char char #endif #include #if HAVE_BP_SYM_H || defined _LIBC # include #else # define BP_SYM(sym) sym #endif #undef __memchr #ifdef _LIBC # undef memchr #endif #ifndef weak_alias # define __memchr memchr #endif /* Search no more than N bytes of S for C. */ void * __memchr (void const *s, int c_in, size_t n) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned reg_char c; c = (unsigned char) c_in; /* Handle the first few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; n > 0 && (size_t) char_ptr % sizeof (longword) != 0; --n, ++char_ptr) if (*char_ptr == c) return (void *) char_ptr; longword_ptr = (const longword *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 is zero. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. So, the test whether any byte in longword1 is zero is equivalent to testing whether tmp is nonzero. */ while (n >= sizeof (longword)) { longword longword1 = *longword_ptr ^ repeated_c; if ((((longword1 - repeated_one) & ~longword1) & (repeated_one << 7)) != 0) break; longword_ptr++; n -= sizeof (longword); } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that either n < sizeof (longword), or one of the sizeof (longword) bytes starting at char_ptr is == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ for (; n > 0; --n, ++char_ptr) { if (*char_ptr == c) return (void *) char_ptr; } return NULL; } #ifdef weak_alias weak_alias (__memchr, BP_SYM (memchr)) #endif shishi-1.0.2/gl/msvc-inval.h0000644000000000000000000002113512126660053012525 00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _MSVC_INVAL_H #define _MSVC_INVAL_H /* With MSVC runtime libraries with the "invalid parameter handler" concept, functions like fprintf(), dup2(), or close() crash when the caller passes an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) instead. This file defines macros that turn such an invalid parameter notification into a non-local exit. An error code can then be produced at the target of this exit. You can thus write code like TRY_MSVC_INVAL { } CATCH_MSVC_INVAL { } DONE_MSVC_INVAL; This entire block expands to a single statement. The handling of invalid parameters can be done in three ways: * The default way, which is reasonable for programs (not libraries): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING]) * The way for libraries that make "hairy" calls (like close(-1), or fclose(fp) where fileno(fp) is closed, or simply getdtablesize()): AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING]) * The way for libraries that make no "hairy" calls: AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING]) */ #define DEFAULT_HANDLING 0 #define HAIRY_LIBRARY_HANDLING 1 #define SANE_LIBRARY_HANDLING 2 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* A native Windows platform with the "invalid parameter handler" concept, and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */ # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING /* Default handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that just returns. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) # else /* Handling for hairy libraries. */ # include /* Gnulib can define its own status codes, as described in the page "Raising Software Exceptions" on microsoft.com . Our status codes are composed of - 0xE0000000, mandatory for all user-defined status codes, - 0x474E550, a API identifier ("GNU"), - 0, 1, 2, ..., used to distinguish different status codes from the same API. */ # define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0) # if defined _MSC_VER /* A compiler that supports __try/__except, as described in the page "try-except statement" on microsoft.com . With __try/__except, we can use the multithread-safe exception handling. */ # ifdef __cplusplus extern "C" { # endif /* Ensure that the invalid parameter handler in installed that raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ gl_msvc_inval_ensure_handler (); \ __try # define CATCH_MSVC_INVAL \ __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \ ? EXCEPTION_EXECUTE_HANDLER \ : EXCEPTION_CONTINUE_SEARCH) # define DONE_MSVC_INVAL \ } \ while (0) # else /* Any compiler. We can only use setjmp/longjmp. */ # include # ifdef __cplusplus extern "C" { # endif struct gl_msvc_inval_per_thread { /* The restart that will resume execution at the code between CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */ jmp_buf restart; /* Tells whether the contents of restart is valid. */ int restart_valid; }; /* Ensure that the invalid parameter handler in installed that passes control to the gl_msvc_inval_restart if it is valid, or raises a software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise. Because we assume no other part of the program installs a different invalid parameter handler, this solution is multithread-safe. */ extern void gl_msvc_inval_ensure_handler (void); /* Return a pointer to the per-thread data for the current thread. */ extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void); # ifdef __cplusplus } # endif # define TRY_MSVC_INVAL \ do \ { \ struct gl_msvc_inval_per_thread *msvc_inval_current; \ gl_msvc_inval_ensure_handler (); \ msvc_inval_current = gl_msvc_inval_current (); \ /* First, initialize gl_msvc_inval_restart. */ \ if (setjmp (msvc_inval_current->restart) == 0) \ { \ /* Then, mark it as valid. */ \ msvc_inval_current->restart_valid = 1; # define CATCH_MSVC_INVAL \ /* Execution completed. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; \ } \ else \ { \ /* Execution triggered an invalid parameter notification. \ Mark gl_msvc_inval_restart as invalid. */ \ msvc_inval_current->restart_valid = 0; # define DONE_MSVC_INVAL \ } \ } \ while (0) # endif # endif #else /* A platform that does not need to the invalid parameter handler, or when SANE_LIBRARY_HANDLING is desired. */ /* The braces here avoid GCC warnings like "warning: suggest explicit braces to avoid ambiguous 'else'". */ # define TRY_MSVC_INVAL \ do \ { \ if (1) # define CATCH_MSVC_INVAL \ else # define DONE_MSVC_INVAL \ } \ while (0) #endif #endif /* _MSVC_INVAL_H */ shishi-1.0.2/gl/dosname.h0000644000000000000000000000373312126660051012076 00000000000000/* File names on MS-DOS/Windows systems. Copyright (C) 2000-2001, 2004-2006, 2009-2013 Free Software Foundation, Inc. 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 . From Paul Eggert and Jim Meyering. */ #ifndef _DOSNAME_H #define _DOSNAME_H #if (defined _WIN32 || defined __WIN32__ || \ defined __MSDOS__ || defined __CYGWIN__ || \ defined __EMX__ || defined __DJGPP__) /* This internal macro assumes ASCII, but all hosts that support drive letters use ASCII. */ # define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a' \ <= 'z' - 'a') # define FILE_SYSTEM_PREFIX_LEN(Filename) \ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0) # ifndef __CYGWIN__ # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 # endif # define ISSLASH(C) ((C) == '/' || (C) == '\\') #else # define FILE_SYSTEM_PREFIX_LEN(Filename) 0 # define ISSLASH(C) ((C) == '/') #endif #ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 #endif #if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE # define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)]) # else # define IS_ABSOLUTE_FILE_NAME(F) \ (ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0) #endif #define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) #endif /* DOSNAME_H_ */ shishi-1.0.2/gl/malloc.c0000644000000000000000000000273212126660053011712 00000000000000/* malloc() function that is glibc compatible. Copyright (C) 1997-1998, 2006-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* written by Jim Meyering and Bruno Haible */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */ #ifdef malloc # define NEED_MALLOC_GNU 1 # undef malloc /* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ #elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU # define NEED_MALLOC_GNU 1 #endif #include #include /* Allocate an N-byte block of memory from the heap. If N is zero, allocate a 1-byte block. */ void * rpl_malloc (size_t n) { void *result; #if NEED_MALLOC_GNU if (n == 0) n = 1; #endif result = malloc (n); #if !HAVE_MALLOC_POSIX if (result == NULL) errno = ENOMEM; #endif return result; } shishi-1.0.2/gl/gc-pbkdf2-sha1.c0000644000000000000000000000532112126660051013027 00000000000000/* gc-pbkdf2-sha1.c --- Password-Based Key Derivation Function a'la PKCS#5 Copyright (C) 2002-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #include #include "gc.h" #include #include /* Implement PKCS#5 PBKDF2 as per RFC 2898. The PRF to use is hard coded to be HMAC-SHA1. Inputs are the password P of length PLEN, the salt S of length SLEN, the iteration counter C (> 0), and the desired derived output length DKLEN. Output buffer is DK which must have room for at least DKLEN octets. The output buffer will be filled with the derived data. */ Gc_rc gc_pbkdf2_sha1 (const char *P, size_t Plen, const char *S, size_t Slen, unsigned int c, char *DK, size_t dkLen) { unsigned int hLen = 20; char U[20]; char T[20]; unsigned int u; unsigned int l; unsigned int r; unsigned int i; unsigned int k; int rc; char *tmp; size_t tmplen = Slen + 4; if (c == 0) return GC_PKCS5_INVALID_ITERATION_COUNT; if (dkLen == 0) return GC_PKCS5_INVALID_DERIVED_KEY_LENGTH; if (dkLen > 4294967295U) return GC_PKCS5_DERIVED_KEY_TOO_LONG; l = ((dkLen - 1) / hLen) + 1; r = dkLen - (l - 1) * hLen; tmp = malloc (tmplen); if (tmp == NULL) return GC_MALLOC_ERROR; memcpy (tmp, S, Slen); for (i = 1; i <= l; i++) { memset (T, 0, hLen); for (u = 1; u <= c; u++) { if (u == 1) { tmp[Slen + 0] = (i & 0xff000000) >> 24; tmp[Slen + 1] = (i & 0x00ff0000) >> 16; tmp[Slen + 2] = (i & 0x0000ff00) >> 8; tmp[Slen + 3] = (i & 0x000000ff) >> 0; rc = gc_hmac_sha1 (P, Plen, tmp, tmplen, U); } else rc = gc_hmac_sha1 (P, Plen, U, hLen, U); if (rc != GC_OK) { free (tmp); return rc; } for (k = 0; k < hLen; k++) T[k] ^= U[k]; } memcpy (DK + (i - 1) * hLen, T, i == l ? r : hLen); } free (tmp); return GC_OK; } shishi-1.0.2/gl/memxor.c0000644000000000000000000000210612126660053011745 00000000000000/* memxor.c -- perform binary exclusive OR operation of two memory blocks. Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. The interface was inspired by memxor in Niels Möller's Nettle. */ #include #include "memxor.h" void * memxor (void *restrict dest, const void *restrict src, size_t n) { char const *s = src; char *d = dest; for (; n > 0; n--) *d++ ^= *s++; return dest; } shishi-1.0.2/gl/xvasprintf.h0000644000000000000000000000407412126660054012656 00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 2002-2004, 2006-2013 Free Software Foundation, Inc. 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 . */ #ifndef _XVASPRINTF_H #define _XVASPRINTF_H /* Get va_list. */ #include /* The __attribute__ feature is available in gcc versions 2.5 and later. The __-protected variants of the attributes 'format' and 'printf' are accepted by gcc versions 2.6.4 (effectively 2.7) and later. We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because gnulib and libintl do '#define printf __printf__' when they override the 'printf' function. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ #endif #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(), and return it. Upon [ENOMEM] memory allocation error, call xalloc_die. On some other error - [EOVERFLOW] resulting string length is > INT_MAX, - [EINVAL] invalid format string, - [EILSEQ] error during conversion between wide and multibyte characters, return NULL. */ extern char *xasprintf (const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2)); extern char *xvasprintf (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0)); #ifdef __cplusplus } #endif #endif /* _XVASPRINTF_H */ shishi-1.0.2/gl/unsetenv.c0000644000000000000000000000547212126660054012317 00000000000000/* Copyright (C) 1992, 1995-2002, 2005-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the name == NULL test below. */ #define _GL_ARG_NONNULL(params) #include /* Specification. */ #include #include #if !_LIBC # define __set_errno(ev) ((errno) = (ev)) #endif #include #include #if !_LIBC # define __environ environ #endif #if _LIBC /* This lock protects against simultaneous modifications of 'environ'. */ # include __libc_lock_define_initialized (static, envlock) # define LOCK __libc_lock_lock (envlock) # define UNLOCK __libc_lock_unlock (envlock) #else # define LOCK # define UNLOCK #endif /* In the GNU C library we must keep the namespace clean. */ #ifdef _LIBC # define unsetenv __unsetenv #endif #if _LIBC || !HAVE_UNSETENV int unsetenv (const char *name) { size_t len; char **ep; if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) { __set_errno (EINVAL); return -1; } len = strlen (name); LOCK; ep = __environ; while (*ep != NULL) if (!strncmp (*ep, name, len) && (*ep)[len] == '=') { /* Found it. Remove this pointer by moving later ones back. */ char **dp = ep; do dp[0] = dp[1]; while (*dp++); /* Continue the loop in case NAME appears again. */ } else ++ep; UNLOCK; return 0; } #ifdef _LIBC # undef unsetenv weak_alias (__unsetenv, unsetenv) #endif #else /* HAVE_UNSETENV */ # undef unsetenv # if !HAVE_DECL_UNSETENV # if VOID_UNSETENV extern void unsetenv (const char *); # else extern int unsetenv (const char *); # endif # endif /* Call the underlying unsetenv, in case there is hidden bookkeeping that needs updating beyond just modifying environ. */ int rpl_unsetenv (const char *name) { int result = 0; if (!name || !*name || strchr (name, '=')) { errno = EINVAL; return -1; } while (getenv (name)) # if !VOID_UNSETENV result = # endif unsetenv (name); return result; } #endif /* HAVE_UNSETENV */ shishi-1.0.2/gl/c-ctype.h0000644000000000000000000002202612126660051012010 00000000000000/* Character handling in C locale. These functions work like the corresponding functions in , except that they have the C (POSIX) locale hardwired, whereas the functions' behaviour depends on the current locale set via setlocale. Copyright (C) 2000-2003, 2006, 2008-2013 Free Software Foundation, Inc. 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 . */ #ifndef C_CTYPE_H #define C_CTYPE_H #include #ifdef __cplusplus extern "C" { #endif /* The functions defined in this file assume the "C" locale and a character set without diacritics (ASCII-US or EBCDIC-US or something like that). Even if the "C" locale on a particular system is an extension of the ASCII character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it is ISO-8859-1), the functions in this file recognize only the ASCII characters. */ /* Check whether the ASCII optimizations apply. */ /* ANSI C89 (and ISO C99 5.2.1.3 too) already guarantees that '0', '1', ..., '9' have consecutive integer values. */ #define C_CTYPE_CONSECUTIVE_DIGITS 1 #if ('A' <= 'Z') \ && ('A' + 1 == 'B') && ('B' + 1 == 'C') && ('C' + 1 == 'D') \ && ('D' + 1 == 'E') && ('E' + 1 == 'F') && ('F' + 1 == 'G') \ && ('G' + 1 == 'H') && ('H' + 1 == 'I') && ('I' + 1 == 'J') \ && ('J' + 1 == 'K') && ('K' + 1 == 'L') && ('L' + 1 == 'M') \ && ('M' + 1 == 'N') && ('N' + 1 == 'O') && ('O' + 1 == 'P') \ && ('P' + 1 == 'Q') && ('Q' + 1 == 'R') && ('R' + 1 == 'S') \ && ('S' + 1 == 'T') && ('T' + 1 == 'U') && ('U' + 1 == 'V') \ && ('V' + 1 == 'W') && ('W' + 1 == 'X') && ('X' + 1 == 'Y') \ && ('Y' + 1 == 'Z') #define C_CTYPE_CONSECUTIVE_UPPERCASE 1 #endif #if ('a' <= 'z') \ && ('a' + 1 == 'b') && ('b' + 1 == 'c') && ('c' + 1 == 'd') \ && ('d' + 1 == 'e') && ('e' + 1 == 'f') && ('f' + 1 == 'g') \ && ('g' + 1 == 'h') && ('h' + 1 == 'i') && ('i' + 1 == 'j') \ && ('j' + 1 == 'k') && ('k' + 1 == 'l') && ('l' + 1 == 'm') \ && ('m' + 1 == 'n') && ('n' + 1 == 'o') && ('o' + 1 == 'p') \ && ('p' + 1 == 'q') && ('q' + 1 == 'r') && ('r' + 1 == 's') \ && ('s' + 1 == 't') && ('t' + 1 == 'u') && ('u' + 1 == 'v') \ && ('v' + 1 == 'w') && ('w' + 1 == 'x') && ('x' + 1 == 'y') \ && ('y' + 1 == 'z') #define C_CTYPE_CONSECUTIVE_LOWERCASE 1 #endif #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) /* The character set is ASCII or one of its variants or extensions, not EBCDIC. Testing the value of '\n' and '\r' is not relevant. */ #define C_CTYPE_ASCII 1 #endif /* Function declarations. */ /* Unlike the functions in , which require an argument in the range of the 'unsigned char' type, the functions here operate on values that are in the 'unsigned char' range or in the 'char' range. In other words, when you have a 'char' value, you need to cast it before using it as argument to a function: const char *s = ...; if (isalpha ((unsigned char) *s)) ... but you don't need to cast it for the functions defined in this file: const char *s = ...; if (c_isalpha (*s)) ... */ extern bool c_isascii (int c) _GL_ATTRIBUTE_CONST; /* not locale dependent */ extern bool c_isalnum (int c) _GL_ATTRIBUTE_CONST; extern bool c_isalpha (int c) _GL_ATTRIBUTE_CONST; extern bool c_isblank (int c) _GL_ATTRIBUTE_CONST; extern bool c_iscntrl (int c) _GL_ATTRIBUTE_CONST; extern bool c_isdigit (int c) _GL_ATTRIBUTE_CONST; extern bool c_islower (int c) _GL_ATTRIBUTE_CONST; extern bool c_isgraph (int c) _GL_ATTRIBUTE_CONST; extern bool c_isprint (int c) _GL_ATTRIBUTE_CONST; extern bool c_ispunct (int c) _GL_ATTRIBUTE_CONST; extern bool c_isspace (int c) _GL_ATTRIBUTE_CONST; extern bool c_isupper (int c) _GL_ATTRIBUTE_CONST; extern bool c_isxdigit (int c) _GL_ATTRIBUTE_CONST; extern int c_tolower (int c) _GL_ATTRIBUTE_CONST; extern int c_toupper (int c) _GL_ATTRIBUTE_CONST; #if defined __GNUC__ && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined NO_C_CTYPE_MACROS /* ASCII optimizations. */ #undef c_isascii #define c_isascii(c) \ ({ int __c = (c); \ (__c >= 0x00 && __c <= 0x7f); \ }) #if C_CTYPE_CONSECUTIVE_DIGITS \ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII #undef c_isalnum #define c_isalnum(c) \ ({ int __c = (c); \ ((__c >= '0' && __c <= '9') \ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z')); \ }) #else #undef c_isalnum #define c_isalnum(c) \ ({ int __c = (c); \ ((__c >= '0' && __c <= '9') \ || (__c >= 'A' && __c <= 'Z') \ || (__c >= 'a' && __c <= 'z')); \ }) #endif #endif #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII #undef c_isalpha #define c_isalpha(c) \ ({ int __c = (c); \ ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z'); \ }) #else #undef c_isalpha #define c_isalpha(c) \ ({ int __c = (c); \ ((__c >= 'A' && __c <= 'Z') || (__c >= 'a' && __c <= 'z')); \ }) #endif #endif #undef c_isblank #define c_isblank(c) \ ({ int __c = (c); \ (__c == ' ' || __c == '\t'); \ }) #if C_CTYPE_ASCII #undef c_iscntrl #define c_iscntrl(c) \ ({ int __c = (c); \ ((__c & ~0x1f) == 0 || __c == 0x7f); \ }) #endif #if C_CTYPE_CONSECUTIVE_DIGITS #undef c_isdigit #define c_isdigit(c) \ ({ int __c = (c); \ (__c >= '0' && __c <= '9'); \ }) #endif #if C_CTYPE_CONSECUTIVE_LOWERCASE #undef c_islower #define c_islower(c) \ ({ int __c = (c); \ (__c >= 'a' && __c <= 'z'); \ }) #endif #if C_CTYPE_ASCII #undef c_isgraph #define c_isgraph(c) \ ({ int __c = (c); \ (__c >= '!' && __c <= '~'); \ }) #endif #if C_CTYPE_ASCII #undef c_isprint #define c_isprint(c) \ ({ int __c = (c); \ (__c >= ' ' && __c <= '~'); \ }) #endif #if C_CTYPE_ASCII #undef c_ispunct #define c_ispunct(c) \ ({ int _c = (c); \ (c_isgraph (_c) && ! c_isalnum (_c)); \ }) #endif #undef c_isspace #define c_isspace(c) \ ({ int __c = (c); \ (__c == ' ' || __c == '\t' \ || __c == '\n' || __c == '\v' || __c == '\f' || __c == '\r'); \ }) #if C_CTYPE_CONSECUTIVE_UPPERCASE #undef c_isupper #define c_isupper(c) \ ({ int __c = (c); \ (__c >= 'A' && __c <= 'Z'); \ }) #endif #if C_CTYPE_CONSECUTIVE_DIGITS \ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #if C_CTYPE_ASCII #undef c_isxdigit #define c_isxdigit(c) \ ({ int __c = (c); \ ((__c >= '0' && __c <= '9') \ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'F')); \ }) #else #undef c_isxdigit #define c_isxdigit(c) \ ({ int __c = (c); \ ((__c >= '0' && __c <= '9') \ || (__c >= 'A' && __c <= 'F') \ || (__c >= 'a' && __c <= 'f')); \ }) #endif #endif #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE #undef c_tolower #define c_tolower(c) \ ({ int __c = (c); \ (__c >= 'A' && __c <= 'Z' ? __c - 'A' + 'a' : __c); \ }) #undef c_toupper #define c_toupper(c) \ ({ int __c = (c); \ (__c >= 'a' && __c <= 'z' ? __c - 'a' + 'A' : __c); \ }) #endif #endif /* optimizing for speed */ #ifdef __cplusplus } #endif #endif /* C_CTYPE_H */ shishi-1.0.2/gl/sys_socket.in.h0000644000000000000000000005437212126660054013253 00000000000000/* Provide a sys/socket header file for systems lacking it (read: MinGW) and for systems where it is incomplete. Copyright (C) 2005-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ /* This file is supposed to be used on platforms that lack , on platforms where cannot be included standalone, and on platforms where does not provide all necessary definitions. It is intended to provide definitions and prototypes needed by an application. */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H /* Special invocation convention: - On Cygwin 1.5.x we have a sequence of nested includes -> -> -> , and the latter includes . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. */ #@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H #if @HAVE_SYS_SOCKET_H@ # define _GL_ALREADY_INCLUDING_SYS_SOCKET_H /* On many platforms, assumes prior inclusion of . */ # include /* On FreeBSD 6.4, defines some macros that assume that NULL is defined. */ # include /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ # undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H #endif #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H #define _@GUARD_PREFIX@_SYS_SOCKET_H _GL_INLINE_HEADER_BEGIN #ifndef _GL_SYS_SOCKET_INLINE # define _GL_SYS_SOCKET_INLINE _GL_INLINE #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #if !@HAVE_SA_FAMILY_T@ # if !GNULIB_defined_sa_family_t typedef unsigned short sa_family_t; # define GNULIB_defined_sa_family_t 1 # endif #endif #if @HAVE_STRUCT_SOCKADDR_STORAGE@ /* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1. */ # if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ # ifndef ss_family # define ss_family __ss_family # endif # endif #else # include /* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on 2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */ # define __ss_aligntype unsigned long int # define _SS_SIZE 256 # define _SS_PADSIZE \ (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \ ? sizeof (sa_family_t) \ : alignof (__ss_aligntype)) \ + sizeof (__ss_aligntype))) # if !GNULIB_defined_struct_sockaddr_storage struct sockaddr_storage { sa_family_t ss_family; /* Address family, etc. */ __ss_aligntype __ss_align; /* Force desired alignment. */ char __ss_padding[_SS_PADSIZE]; }; # define GNULIB_defined_struct_sockaddr_storage 1 # endif #endif /* Get struct iovec. */ /* But avoid namespace pollution on glibc systems. */ #if ! defined __GLIBC__ # include #endif #if @HAVE_SYS_SOCKET_H@ /* A platform that has . */ /* For shutdown(). */ # if !defined SHUT_RD # define SHUT_RD 0 # endif # if !defined SHUT_WR # define SHUT_WR 1 # endif # if !defined SHUT_RDWR # define SHUT_RDWR 2 # endif #else # ifdef __CYGWIN__ # error "Cygwin does have a sys/socket.h, doesn't it?!?" # endif /* A platform that lacks . Currently only MinGW is supported. See the gnulib manual regarding Windows sockets. MinGW has the header files winsock2.h and ws2tcpip.h that declare the sys/socket.h definitions we need. Note that you can influence which definitions you get by setting the WINVER symbol before including these two files. For example, getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that symbol is set indirectly through WINVER). You can set this by adding AC_DEFINE(WINVER, 0x0501) to configure.ac. Note that your code may not run on older Windows releases then. My Windows 2000 box was not able to run the code, for example. The situation is slightly confusing because suggests that getaddrinfo should be available on all Windows releases. */ # if @HAVE_WINSOCK2_H@ # include # endif # if @HAVE_WS2TCPIP_H@ # include # endif /* For shutdown(). */ # if !defined SHUT_RD && defined SD_RECEIVE # define SHUT_RD SD_RECEIVE # endif # if !defined SHUT_WR && defined SD_SEND # define SHUT_WR SD_SEND # endif # if !defined SHUT_RDWR && defined SD_BOTH # define SHUT_RDWR SD_BOTH # endif # if @HAVE_WINSOCK2_H@ /* Include headers needed by the emulation code. */ # include # include # if !GNULIB_defined_socklen_t typedef int socklen_t; # define GNULIB_defined_socklen_t 1 # endif # endif /* Rudimentary 'struct msghdr'; this works as long as you don't try to access msg_control or msg_controllen. */ struct msghdr { void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iovlen; int msg_flags; }; #endif /* Fix some definitions from . */ #if @HAVE_WINSOCK2_H@ # if !GNULIB_defined_rpl_fd_isset /* Re-define FD_ISSET to avoid a WSA call while we are not using network sockets. */ _GL_SYS_SOCKET_INLINE int rpl_fd_isset (SOCKET fd, fd_set * set) { u_int i; if (set == NULL) return 0; for (i = 0; i < set->fd_count; i++) if (set->fd_array[i] == fd) return 1; return 0; } # define GNULIB_defined_rpl_fd_isset 1 # endif # undef FD_ISSET # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) #endif /* Hide some function declarations from . */ #if @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif /* Wrap everything else to use libc file descriptors for sockets. */ #if @GNULIB_SOCKET@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket rpl_socket # endif _GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol)); _GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol)); # else _GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol)); # endif _GL_CXXALIASWARN (socket); #elif @HAVE_WINSOCK2_H@ # undef socket # define socket socket_used_without_requesting_gnulib_module_socket #elif defined GNULIB_POSIXCHECK # undef socket # if HAVE_RAW_DECL_SOCKET _GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - " "use gnulib module socket for portability"); # endif #endif #if @GNULIB_CONNECT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef connect # define connect rpl_connect # endif _GL_FUNCDECL_RPL (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # else /* Need to cast, because on NonStop Kernel, the third parameter is size_t addrlen. */ _GL_CXXALIAS_SYS_CAST (connect, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # endif _GL_CXXALIASWARN (connect); #elif @HAVE_WINSOCK2_H@ # undef connect # define connect socket_used_without_requesting_gnulib_module_connect #elif defined GNULIB_POSIXCHECK # undef connect # if HAVE_RAW_DECL_CONNECT _GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - " "use gnulib module connect for portability"); # endif #endif #if @GNULIB_ACCEPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef accept # define accept rpl_accept # endif _GL_FUNCDECL_RPL (accept, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); _GL_CXXALIAS_RPL (accept, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (accept, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # endif _GL_CXXALIASWARN (accept); #elif @HAVE_WINSOCK2_H@ # undef accept # define accept accept_used_without_requesting_gnulib_module_accept #elif defined GNULIB_POSIXCHECK # undef accept # if HAVE_RAW_DECL_ACCEPT _GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - " "use gnulib module accept for portability"); # endif #endif #if @GNULIB_BIND@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef bind # define bind rpl_bind # endif _GL_FUNCDECL_RPL (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # else /* Need to cast, because on NonStop Kernel, the third parameter is size_t addrlen. */ _GL_CXXALIAS_SYS_CAST (bind, int, (int fd, const struct sockaddr *addr, socklen_t addrlen)); # endif _GL_CXXALIASWARN (bind); #elif @HAVE_WINSOCK2_H@ # undef bind # define bind bind_used_without_requesting_gnulib_module_bind #elif defined GNULIB_POSIXCHECK # undef bind # if HAVE_RAW_DECL_BIND _GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - " "use gnulib module bind for portability"); # endif #endif #if @GNULIB_GETPEERNAME@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getpeername # define getpeername rpl_getpeername # endif _GL_FUNCDECL_RPL (getpeername, int, (int fd, struct sockaddr *addr, socklen_t *addrlen) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (getpeername, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (getpeername, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # endif _GL_CXXALIASWARN (getpeername); #elif @HAVE_WINSOCK2_H@ # undef getpeername # define getpeername getpeername_used_without_requesting_gnulib_module_getpeername #elif defined GNULIB_POSIXCHECK # undef getpeername # if HAVE_RAW_DECL_GETPEERNAME _GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - " "use gnulib module getpeername for portability"); # endif #endif #if @GNULIB_GETSOCKNAME@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getsockname # define getsockname rpl_getsockname # endif _GL_FUNCDECL_RPL (getsockname, int, (int fd, struct sockaddr *addr, socklen_t *addrlen) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (getsockname, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # else /* Need to cast, because on Solaris 10 systems, the third parameter is void *addrlen. */ _GL_CXXALIAS_SYS_CAST (getsockname, int, (int fd, struct sockaddr *addr, socklen_t *addrlen)); # endif _GL_CXXALIASWARN (getsockname); #elif @HAVE_WINSOCK2_H@ # undef getsockname # define getsockname getsockname_used_without_requesting_gnulib_module_getsockname #elif defined GNULIB_POSIXCHECK # undef getsockname # if HAVE_RAW_DECL_GETSOCKNAME _GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - " "use gnulib module getsockname for portability"); # endif #endif #if @GNULIB_GETSOCKOPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getsockopt # define getsockopt rpl_getsockopt # endif _GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname, void *optval, socklen_t *optlen) _GL_ARG_NONNULL ((4, 5))); _GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname, void *optval, socklen_t *optlen)); # else /* Need to cast, because on Solaris 10 systems, the fifth parameter is void *optlen. */ _GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname, void *optval, socklen_t *optlen)); # endif _GL_CXXALIASWARN (getsockopt); #elif @HAVE_WINSOCK2_H@ # undef getsockopt # define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt #elif defined GNULIB_POSIXCHECK # undef getsockopt # if HAVE_RAW_DECL_GETSOCKOPT _GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - " "use gnulib module getsockopt for portability"); # endif #endif #if @GNULIB_LISTEN@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef listen # define listen rpl_listen # endif _GL_FUNCDECL_RPL (listen, int, (int fd, int backlog)); _GL_CXXALIAS_RPL (listen, int, (int fd, int backlog)); # else _GL_CXXALIAS_SYS (listen, int, (int fd, int backlog)); # endif _GL_CXXALIASWARN (listen); #elif @HAVE_WINSOCK2_H@ # undef listen # define listen listen_used_without_requesting_gnulib_module_listen #elif defined GNULIB_POSIXCHECK # undef listen # if HAVE_RAW_DECL_LISTEN _GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - " "use gnulib module listen for portability"); # endif #endif #if @GNULIB_RECV@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef recv # define recv rpl_recv # endif _GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); # else _GL_CXXALIAS_SYS (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); # endif _GL_CXXALIASWARN (recv); #elif @HAVE_WINSOCK2_H@ # undef recv # define recv recv_used_without_requesting_gnulib_module_recv #elif defined GNULIB_POSIXCHECK # undef recv # if HAVE_RAW_DECL_RECV _GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - " "use gnulib module recv for portability"); # endif #endif #if @GNULIB_SEND@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef send # define send rpl_send # endif _GL_FUNCDECL_RPL (send, ssize_t, (int fd, const void *buf, size_t len, int flags) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (send, ssize_t, (int fd, const void *buf, size_t len, int flags)); # else _GL_CXXALIAS_SYS (send, ssize_t, (int fd, const void *buf, size_t len, int flags)); # endif _GL_CXXALIASWARN (send); #elif @HAVE_WINSOCK2_H@ # undef send # define send send_used_without_requesting_gnulib_module_send #elif defined GNULIB_POSIXCHECK # undef send # if HAVE_RAW_DECL_SEND _GL_WARN_ON_USE (send, "send is not always POSIX compliant - " "use gnulib module send for portability"); # endif #endif #if @GNULIB_RECVFROM@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef recvfrom # define recvfrom rpl_recvfrom # endif _GL_FUNCDECL_RPL (recvfrom, ssize_t, (int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (recvfrom, ssize_t, (int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)); # else /* Need to cast, because on Solaris 10 systems, the sixth parameter is void *fromlen. */ _GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t, (int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)); # endif _GL_CXXALIASWARN (recvfrom); #elif @HAVE_WINSOCK2_H@ # undef recvfrom # define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom #elif defined GNULIB_POSIXCHECK # undef recvfrom # if HAVE_RAW_DECL_RECVFROM _GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - " "use gnulib module recvfrom for portability"); # endif #endif #if @GNULIB_SENDTO@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sendto # define sendto rpl_sendto # endif _GL_FUNCDECL_RPL (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)); # else /* Need to cast, because on NonStop Kernel, the sixth parameter is size_t tolen. */ _GL_CXXALIAS_SYS_CAST (sendto, ssize_t, (int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)); # endif _GL_CXXALIASWARN (sendto); #elif @HAVE_WINSOCK2_H@ # undef sendto # define sendto sendto_used_without_requesting_gnulib_module_sendto #elif defined GNULIB_POSIXCHECK # undef sendto # if HAVE_RAW_DECL_SENDTO _GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - " "use gnulib module sendto for portability"); # endif #endif #if @GNULIB_SETSOCKOPT@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef setsockopt # define setsockopt rpl_setsockopt # endif _GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen) _GL_ARG_NONNULL ((4))); _GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen)); # else /* Need to cast, because on NonStop Kernel, the fifth parameter is size_t optlen. */ _GL_CXXALIAS_SYS_CAST (setsockopt, int, (int fd, int level, int optname, const void * optval, socklen_t optlen)); # endif _GL_CXXALIASWARN (setsockopt); #elif @HAVE_WINSOCK2_H@ # undef setsockopt # define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt #elif defined GNULIB_POSIXCHECK # undef setsockopt # if HAVE_RAW_DECL_SETSOCKOPT _GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - " "use gnulib module setsockopt for portability"); # endif #endif #if @GNULIB_SHUTDOWN@ # if @HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef shutdown # define shutdown rpl_shutdown # endif _GL_FUNCDECL_RPL (shutdown, int, (int fd, int how)); _GL_CXXALIAS_RPL (shutdown, int, (int fd, int how)); # else _GL_CXXALIAS_SYS (shutdown, int, (int fd, int how)); # endif _GL_CXXALIASWARN (shutdown); #elif @HAVE_WINSOCK2_H@ # undef shutdown # define shutdown shutdown_used_without_requesting_gnulib_module_shutdown #elif defined GNULIB_POSIXCHECK # undef shutdown # if HAVE_RAW_DECL_SHUTDOWN _GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - " "use gnulib module shutdown for portability"); # endif #endif #if @GNULIB_ACCEPT4@ /* Accept a connection on a socket, with specific opening flags. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). See also the Linux man page at . */ # if @HAVE_ACCEPT4@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define accept4 rpl_accept4 # endif _GL_FUNCDECL_RPL (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); _GL_CXXALIAS_RPL (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); # else _GL_FUNCDECL_SYS (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); _GL_CXXALIAS_SYS (accept4, int, (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)); # endif _GL_CXXALIASWARN (accept4); #elif defined GNULIB_POSIXCHECK # undef accept4 # if HAVE_RAW_DECL_ACCEPT4 _GL_WARN_ON_USE (accept4, "accept4 is unportable - " "use gnulib module accept4 for portability"); # endif #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ #endif shishi-1.0.2/gl/unistd.in.h0000644000000000000000000014535012126660054012370 00000000000000/* Substitute for and wrapper around . Copyright (C) 2003-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_UNISTD_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #if @HAVE_UNISTD_H@ # @INCLUDE_NEXT@ @NEXT_UNISTD_H@ #endif /* Get all possible declarations of gethostname(). */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ && !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H #endif #if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H #define _@GUARD_PREFIX@_UNISTD_H /* NetBSD 5.0 mis-defines NULL. Also get size_t. */ #include /* mingw doesn't define the SEEK_* or *_FILENO macros in . */ /* Cygwin 1.7.1 declares symlinkat in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \ || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \ && defined __CYGWIN__)) \ && ! defined __GLIBC__ # include #endif /* Cygwin 1.7.1 declares unlinkat in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && defined __CYGWIN__ \ && ! defined __GLIBC__ # include #endif /* mingw fails to declare _exit in . */ /* mingw, MSVC, BeOS, Haiku declare environ in , not in . */ /* Solaris declares getcwd not only in but also in . */ /* OSF Tru64 Unix cannot see gnulib rpl_strtod when system is included here. */ /* But avoid namespace pollution on glibc systems. */ #if !defined __GLIBC__ && !defined __osf__ # define __need_system_stdlib_h # include # undef __need_system_stdlib_h #endif /* Native Windows platforms declare chdir, getcwd, rmdir in and/or , not in . They also declare access(), chmod(), close(), dup(), dup2(), isatty(), lseek(), read(), unlink(), write() in . */ #if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \ || defined GNULIB_POSIXCHECK) \ && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) # include /* mingw32, mingw64 */ # include /* mingw64, MSVC 9 */ #elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \ || @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \ || defined GNULIB_POSIXCHECK) \ && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) # include #endif /* AIX and OSF/1 5.1 declare getdomainname in , not in . NonStop Kernel declares gethostname in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \ || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \ && !defined __GLIBC__ # include #endif /* MSVC defines off_t in . May also define off_t to a 64-bit type on native Windows. */ #if !@HAVE_UNISTD_H@ || @WINDOWS_64_BIT_OFF_T@ /* Get off_t. */ # include #endif #if (@GNULIB_READ@ || @GNULIB_WRITE@ \ || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \ || @GNULIB_PREAD@ || @GNULIB_PWRITE@ || defined GNULIB_POSIXCHECK) /* Get ssize_t. */ # include #endif /* Get getopt(), optarg, optind, opterr, optopt. But avoid namespace pollution on glibc systems. */ #if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT # define __need_getopt # include #endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_UNISTD_INLINE # define _GL_UNISTD_INLINE _GL_INLINE #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Hide some function declarations from . */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SELECT_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select select_used_without_including_sys_select_h # else _GL_WARN_ON_USE (select, "select() used without including "); # endif # endif #endif /* OS/2 EMX lacks these macros. */ #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO # define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO # define STDERR_FILENO 2 #endif /* Ensure *_OK macros exist. */ #ifndef F_OK # define F_OK 0 # define X_OK 1 # define W_OK 2 # define R_OK 4 #endif /* Declare overridden functions. */ #if defined GNULIB_POSIXCHECK /* The access() function is a security risk. */ _GL_WARN_ON_USE (access, "the access function is a security risk - " "use the gnulib module faccessat instead"); #endif #if @GNULIB_CHDIR@ _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1))); _GL_CXXALIASWARN (chdir); #elif defined GNULIB_POSIXCHECK # undef chdir # if HAVE_RAW_DECL_CHDIR _GL_WARN_ON_USE (chown, "chdir is not always in - " "use gnulib module chdir for portability"); # endif #endif #if @GNULIB_CHOWN@ /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE to GID (if GID is not -1). Follow symbolic links. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_DUP2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dup2 rpl_dup2 # endif _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd)); _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd)); # else # if !@HAVE_DUP2@ _GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd)); # endif _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd)); # endif _GL_CXXALIASWARN (dup2); #elif defined GNULIB_POSIXCHECK # undef dup2 # if HAVE_RAW_DECL_DUP2 _GL_WARN_ON_USE (dup2, "dup2 is unportable - " "use gnulib module dup2 for portability"); # endif #endif #if @GNULIB_DUP3@ /* Copy the file descriptor OLDFD into file descriptor NEWFD, with the specified flags. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). Close NEWFD first if it is open. Return newfd if successful, otherwise -1 and errno set. See the Linux man page at . */ # if @HAVE_DUP3@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dup3 rpl_dup3 # endif _GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags)); _GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags)); # else _GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags)); _GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags)); # endif _GL_CXXALIASWARN (dup3); #elif defined GNULIB_POSIXCHECK # undef dup3 # if HAVE_RAW_DECL_DUP3 _GL_WARN_ON_USE (dup3, "dup3 is unportable - " "use gnulib module dup3 for portability"); # endif #endif #if @GNULIB_ENVIRON@ # if !@HAVE_DECL_ENVIRON@ /* Set of environment variables and values. An array of strings of the form "VARIABLE=VALUE", terminated with a NULL. */ # if defined __APPLE__ && defined __MACH__ # include # define environ (*_NSGetEnviron ()) # else # ifdef __cplusplus extern "C" { # endif extern char **environ; # ifdef __cplusplus } # endif # endif # endif #elif defined GNULIB_POSIXCHECK # if HAVE_RAW_DECL_ENVIRON _GL_UNISTD_INLINE char *** rpl_environ (void) { return &environ; } _GL_WARN_ON_USE (rpl_environ, "environ is unportable - " "use gnulib module environ for portability"); # undef environ # define environ (*rpl_environ ()) # endif #endif #if @GNULIB_EUIDACCESS@ /* Like access(), except that it uses the effective user id and group id of the current process. */ # if !@HAVE_EUIDACCESS@ _GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode)); _GL_CXXALIASWARN (euidaccess); # if defined GNULIB_POSIXCHECK /* Like access(), this function is a security risk. */ _GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - " "use the gnulib module faccessat instead"); # endif #elif defined GNULIB_POSIXCHECK # undef euidaccess # if HAVE_RAW_DECL_EUIDACCESS _GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - " "use gnulib module euidaccess for portability"); # endif #endif #if @GNULIB_FACCESSAT@ # if !@HAVE_FACCESSAT@ _GL_FUNCDECL_SYS (faccessat, int, (int fd, char const *file, int mode, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (faccessat, int, (int fd, char const *file, int mode, int flag)); _GL_CXXALIASWARN (faccessat); #elif defined GNULIB_POSIXCHECK # undef faccessat # if HAVE_RAW_DECL_FACCESSAT _GL_WARN_ON_USE (faccessat, "faccessat is not portable - " "use gnulib module faccessat for portability"); # endif #endif #if @GNULIB_FCHDIR@ /* Change the process' current working directory to the directory on which the given file descriptor is open. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if ! @HAVE_FCHDIR@ _GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); /* Gnulib internal hooks needed to maintain the fchdir metadata. */ _GL_EXTERN_C int _gl_register_fd (int fd, const char *filename) _GL_ARG_NONNULL ((2)); _GL_EXTERN_C void _gl_unregister_fd (int fd); _GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd); _GL_EXTERN_C const char *_gl_directory_name (int fd); # else # if !@HAVE_DECL_FCHDIR@ _GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); # endif # endif _GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/)); _GL_CXXALIASWARN (fchdir); #elif defined GNULIB_POSIXCHECK # undef fchdir # if HAVE_RAW_DECL_FCHDIR _GL_WARN_ON_USE (fchdir, "fchdir is unportable - " "use gnulib module fchdir for portability"); # endif #endif #if @GNULIB_FCHOWNAT@ # if @REPLACE_FCHOWNAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fchownat # define fchownat rpl_fchownat # endif _GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag)); # else # if !@HAVE_FCHOWNAT@ _GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file, uid_t owner, gid_t group, int flag)); # endif _GL_CXXALIASWARN (fchownat); #elif defined GNULIB_POSIXCHECK # undef fchownat # if HAVE_RAW_DECL_FCHOWNAT _GL_WARN_ON_USE (fchownat, "fchownat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FDATASYNC@ /* Synchronize changes to a file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@ _GL_FUNCDECL_SYS (fdatasync, int, (int fd)); # endif _GL_CXXALIAS_SYS (fdatasync, int, (int fd)); _GL_CXXALIASWARN (fdatasync); #elif defined GNULIB_POSIXCHECK # undef fdatasync # if HAVE_RAW_DECL_FDATASYNC _GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - " "use gnulib module fdatasync for portability"); # endif #endif #if @GNULIB_FSYNC@ /* Synchronize changes, including metadata, to a file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if !@HAVE_FSYNC@ _GL_FUNCDECL_SYS (fsync, int, (int fd)); # endif _GL_CXXALIAS_SYS (fsync, int, (int fd)); _GL_CXXALIASWARN (fsync); #elif defined GNULIB_POSIXCHECK # undef fsync # if HAVE_RAW_DECL_FSYNC _GL_WARN_ON_USE (fsync, "fsync is unportable - " "use gnulib module fsync for portability"); # endif #endif #if @GNULIB_FTRUNCATE@ /* Change the size of the file to which FD is opened to become equal to LENGTH. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_FTRUNCATE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftruncate # define ftruncate rpl_ftruncate # endif _GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length)); _GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length)); # else # if !@HAVE_FTRUNCATE@ _GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length)); # endif _GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length)); # endif _GL_CXXALIASWARN (ftruncate); #elif defined GNULIB_POSIXCHECK # undef ftruncate # if HAVE_RAW_DECL_FTRUNCATE _GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - " "use gnulib module ftruncate for portability"); # endif #endif #if @GNULIB_GETCWD@ /* Get the name of the current working directory, and put it in SIZE bytes of BUF. Return BUF if successful, or NULL if the directory couldn't be determined or SIZE was too small. See the POSIX:2008 specification . Additionally, the gnulib module 'getcwd' guarantees the following GNU extension: If BUF is NULL, an array is allocated with 'malloc'; the array is SIZE bytes long, unless SIZE == 0, in which case it is as big as necessary. */ # if @REPLACE_GETCWD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getcwd rpl_getcwd # endif _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size)); _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size)); # else /* Need to cast, because on mingw, the second parameter is int size. */ _GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size)); # endif _GL_CXXALIASWARN (getcwd); #elif defined GNULIB_POSIXCHECK # undef getcwd # if HAVE_RAW_DECL_GETCWD _GL_WARN_ON_USE (getcwd, "getcwd is unportable - " "use gnulib module getcwd for portability"); # endif #endif #if @GNULIB_GETDOMAINNAME@ /* Return the NIS domain name of the machine. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. WARNING! The NIS domain name is usually the empty string or "(none)" when not using NIS. Put up to LEN bytes of the NIS domain name into NAME. Null terminate it if the name is shorter than LEN. If the NIS domain name is longer than LEN, set errno = EINVAL and return -1. Return 0 if successful, otherwise set errno and return -1. */ # if @REPLACE_GETDOMAINNAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getdomainname # define getdomainname rpl_getdomainname # endif _GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len)); # else # if !@HAVE_DECL_GETDOMAINNAME@ _GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len)); # endif _GL_CXXALIASWARN (getdomainname); #elif defined GNULIB_POSIXCHECK # undef getdomainname # if HAVE_RAW_DECL_GETDOMAINNAME _GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - " "use gnulib module getdomainname for portability"); # endif #endif #if @GNULIB_GETDTABLESIZE@ /* Return the maximum number of file descriptors in the current process. In POSIX, this is same as sysconf (_SC_OPEN_MAX). */ # if !@HAVE_GETDTABLESIZE@ _GL_FUNCDECL_SYS (getdtablesize, int, (void)); # endif _GL_CXXALIAS_SYS (getdtablesize, int, (void)); _GL_CXXALIASWARN (getdtablesize); #elif defined GNULIB_POSIXCHECK # undef getdtablesize # if HAVE_RAW_DECL_GETDTABLESIZE _GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - " "use gnulib module getdtablesize for portability"); # endif #endif #if @GNULIB_GETGROUPS@ /* Return the supplemental groups that the current process belongs to. It is unspecified whether the effective group id is in the list. If N is 0, return the group count; otherwise, N describes how many entries are available in GROUPS. Return -1 and set errno if N is not 0 and not large enough. Fails with ENOSYS on some systems. */ # if @REPLACE_GETGROUPS@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getgroups # define getgroups rpl_getgroups # endif _GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups)); _GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups)); # else # if !@HAVE_GETGROUPS@ _GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups)); # endif _GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups)); # endif _GL_CXXALIASWARN (getgroups); #elif defined GNULIB_POSIXCHECK # undef getgroups # if HAVE_RAW_DECL_GETGROUPS _GL_WARN_ON_USE (getgroups, "getgroups is unportable - " "use gnulib module getgroups for portability"); # endif #endif #if @GNULIB_GETHOSTNAME@ /* Return the standard host name of the machine. WARNING! The host name may or may not be fully qualified. Put up to LEN bytes of the host name into NAME. Null terminate it if the name is shorter than LEN. If the host name is longer than LEN, set errno = EINVAL and return -1. Return 0 if successful, otherwise set errno and return -1. */ # if @UNISTD_H_HAVE_WINSOCK2_H@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname rpl_gethostname # endif _GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len)); # else # if !@HAVE_GETHOSTNAME@ _GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second parameter is int len. */ _GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len)); # endif _GL_CXXALIASWARN (gethostname); #elif @UNISTD_H_HAVE_WINSOCK2_H@ # undef gethostname # define gethostname gethostname_used_without_requesting_gnulib_module_gethostname #elif defined GNULIB_POSIXCHECK # undef gethostname # if HAVE_RAW_DECL_GETHOSTNAME _GL_WARN_ON_USE (gethostname, "gethostname is unportable - " "use gnulib module gethostname for portability"); # endif #endif #if @GNULIB_GETLOGIN@ /* Returns the user's login name, or NULL if it cannot be found. Upon error, returns NULL with errno set. See . Most programs don't need to use this function, because the information is available through environment variables: ${LOGNAME-$USER} on Unix platforms, $USERNAME on native Windows platforms. */ # if !@HAVE_GETLOGIN@ _GL_FUNCDECL_SYS (getlogin, char *, (void)); # endif _GL_CXXALIAS_SYS (getlogin, char *, (void)); _GL_CXXALIASWARN (getlogin); #elif defined GNULIB_POSIXCHECK # undef getlogin # if HAVE_RAW_DECL_GETLOGIN _GL_WARN_ON_USE (getlogin, "getlogin is unportable - " "use gnulib module getlogin for portability"); # endif #endif #if @GNULIB_GETLOGIN_R@ /* Copies the user's login name to NAME. The array pointed to by NAME has room for SIZE bytes. Returns 0 if successful. Upon error, an error number is returned, or -1 in the case that the login name cannot be found but no specific error is provided (this case is hopefully rare but is left open by the POSIX spec). See . Most programs don't need to use this function, because the information is available through environment variables: ${LOGNAME-$USER} on Unix platforms, $USERNAME on native Windows platforms. */ # if @REPLACE_GETLOGIN_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getlogin_r rpl_getlogin_r # endif _GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size)); # else # if !@HAVE_DECL_GETLOGIN_R@ _GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 10 systems, the second argument is int size. */ _GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size)); # endif _GL_CXXALIASWARN (getlogin_r); #elif defined GNULIB_POSIXCHECK # undef getlogin_r # if HAVE_RAW_DECL_GETLOGIN_R _GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - " "use gnulib module getlogin_r for portability"); # endif #endif #if @GNULIB_GETPAGESIZE@ # if @REPLACE_GETPAGESIZE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getpagesize rpl_getpagesize # endif _GL_FUNCDECL_RPL (getpagesize, int, (void)); _GL_CXXALIAS_RPL (getpagesize, int, (void)); # else # if !@HAVE_GETPAGESIZE@ # if !defined getpagesize /* This is for POSIX systems. */ # if !defined _gl_getpagesize && defined _SC_PAGESIZE # if ! (defined __VMS && __VMS_VER < 70000000) # define _gl_getpagesize() sysconf (_SC_PAGESIZE) # endif # endif /* This is for older VMS. */ # if !defined _gl_getpagesize && defined __VMS # ifdef __ALPHA # define _gl_getpagesize() 8192 # else # define _gl_getpagesize() 512 # endif # endif /* This is for BeOS. */ # if !defined _gl_getpagesize && @HAVE_OS_H@ # include # if defined B_PAGE_SIZE # define _gl_getpagesize() B_PAGE_SIZE # endif # endif /* This is for AmigaOS4.0. */ # if !defined _gl_getpagesize && defined __amigaos4__ # define _gl_getpagesize() 2048 # endif /* This is for older Unix systems. */ # if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@ # include # ifdef EXEC_PAGESIZE # define _gl_getpagesize() EXEC_PAGESIZE # else # ifdef NBPG # ifndef CLSIZE # define CLSIZE 1 # endif # define _gl_getpagesize() (NBPG * CLSIZE) # else # ifdef NBPC # define _gl_getpagesize() NBPC # endif # endif # endif # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define getpagesize() _gl_getpagesize () # else # if !GNULIB_defined_getpagesize_function _GL_UNISTD_INLINE int getpagesize () { return _gl_getpagesize (); } # define GNULIB_defined_getpagesize_function 1 # endif # endif # endif # endif /* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */ _GL_CXXALIAS_SYS_CAST (getpagesize, int, (void)); # endif # if @HAVE_DECL_GETPAGESIZE@ _GL_CXXALIASWARN (getpagesize); # endif #elif defined GNULIB_POSIXCHECK # undef getpagesize # if HAVE_RAW_DECL_GETPAGESIZE _GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - " "use gnulib module getpagesize for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Return the next valid login shell on the system, or NULL when the end of the list has been reached. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (getusershell, char *, (void)); # endif _GL_CXXALIAS_SYS (getusershell, char *, (void)); _GL_CXXALIASWARN (getusershell); #elif defined GNULIB_POSIXCHECK # undef getusershell # if HAVE_RAW_DECL_GETUSERSHELL _GL_WARN_ON_USE (getusershell, "getusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Rewind to pointer that is advanced at each getusershell() call. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (setusershell, void, (void)); # endif _GL_CXXALIAS_SYS (setusershell, void, (void)); _GL_CXXALIASWARN (setusershell); #elif defined GNULIB_POSIXCHECK # undef setusershell # if HAVE_RAW_DECL_SETUSERSHELL _GL_WARN_ON_USE (setusershell, "setusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GETUSERSHELL@ /* Free the pointer that is advanced at each getusershell() call and associated resources. */ # if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (endusershell, void, (void)); # endif _GL_CXXALIAS_SYS (endusershell, void, (void)); _GL_CXXALIASWARN (endusershell); #elif defined GNULIB_POSIXCHECK # undef endusershell # if HAVE_RAW_DECL_ENDUSERSHELL _GL_WARN_ON_USE (endusershell, "endusershell is unportable - " "use gnulib module getusershell for portability"); # endif #endif #if @GNULIB_GROUP_MEMBER@ /* Determine whether group id is in calling user's group list. */ # if !@HAVE_GROUP_MEMBER@ _GL_FUNCDECL_SYS (group_member, int, (gid_t gid)); # endif _GL_CXXALIAS_SYS (group_member, int, (gid_t gid)); _GL_CXXALIASWARN (group_member); #elif defined GNULIB_POSIXCHECK # undef group_member # if HAVE_RAW_DECL_GROUP_MEMBER _GL_WARN_ON_USE (group_member, "group_member is unportable - " "use gnulib module group-member for portability"); # endif #endif #if @GNULIB_ISATTY@ # if @REPLACE_ISATTY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef isatty # define isatty rpl_isatty # endif _GL_FUNCDECL_RPL (isatty, int, (int fd)); _GL_CXXALIAS_RPL (isatty, int, (int fd)); # else _GL_CXXALIAS_SYS (isatty, int, (int fd)); # endif _GL_CXXALIASWARN (isatty); #elif defined GNULIB_POSIXCHECK # undef isatty # if HAVE_RAW_DECL_ISATTY _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - " "use gnulib module isatty for portability"); # endif #endif #if @GNULIB_LCHOWN@ /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE to GID (if GID is not -1). Do not follow symbolic links. Return 0 if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_LCHOWN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef lchown # define lchown rpl_lchown # endif _GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)); # else # if !@HAVE_LCHOWN@ _GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)); # endif _GL_CXXALIASWARN (lchown); #elif defined GNULIB_POSIXCHECK # undef lchown # if HAVE_RAW_DECL_LCHOWN _GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - " "use gnulib module lchown for portability"); # endif #endif #if @GNULIB_LINK@ /* Create a new hard link for an existing file. Return 0 if successful, otherwise -1 and errno set. See POSIX:2008 specification . */ # if @REPLACE_LINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define link rpl_link # endif _GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2)); # else # if !@HAVE_LINK@ _GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2)); # endif _GL_CXXALIASWARN (link); #elif defined GNULIB_POSIXCHECK # undef link # if HAVE_RAW_DECL_LINK _GL_WARN_ON_USE (link, "link is unportable - " "use gnulib module link for portability"); # endif #endif #if @GNULIB_LINKAT@ /* Create a new hard link for an existing file, relative to two directories. FLAG controls whether symlinks are followed. Return 0 if successful, otherwise -1 and errno set. */ # if @REPLACE_LINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef linkat # define linkat rpl_linkat # endif _GL_FUNCDECL_RPL (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag)); # else # if !@HAVE_LINKAT@ _GL_FUNCDECL_SYS (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag) _GL_ARG_NONNULL ((2, 4))); # endif _GL_CXXALIAS_SYS (linkat, int, (int fd1, const char *path1, int fd2, const char *path2, int flag)); # endif _GL_CXXALIASWARN (linkat); #elif defined GNULIB_POSIXCHECK # undef linkat # if HAVE_RAW_DECL_LINKAT _GL_WARN_ON_USE (linkat, "linkat is unportable - " "use gnulib module linkat for portability"); # endif #endif #if @GNULIB_LSEEK@ /* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END. Return the new offset if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_LSEEK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define lseek rpl_lseek # endif _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence)); _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence)); # else _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence)); # endif _GL_CXXALIASWARN (lseek); #elif defined GNULIB_POSIXCHECK # undef lseek # if HAVE_RAW_DECL_LSEEK _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some " "systems - use gnulib module lseek for portability"); # endif #endif #if @GNULIB_PIPE@ /* Create a pipe, defaulting to O_BINARY mode. Store the read-end as fd[0] and the write-end as fd[1]. Return 0 upon success, or -1 with errno set upon failure. */ # if !@HAVE_PIPE@ _GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (pipe, int, (int fd[2])); _GL_CXXALIASWARN (pipe); #elif defined GNULIB_POSIXCHECK # undef pipe # if HAVE_RAW_DECL_PIPE _GL_WARN_ON_USE (pipe, "pipe is unportable - " "use gnulib module pipe-posix for portability"); # endif #endif #if @GNULIB_PIPE2@ /* Create a pipe, applying the given flags when opening the read-end of the pipe and the write-end of the pipe. The flags are a bitmask, possibly including O_CLOEXEC (defined in ) and O_TEXT, O_BINARY (defined in "binary-io.h"). Store the read-end as fd[0] and the write-end as fd[1]. Return 0 upon success, or -1 with errno set upon failure. See also the Linux man page at . */ # if @HAVE_PIPE2@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define pipe2 rpl_pipe2 # endif _GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags)); # else _GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags)); # endif _GL_CXXALIASWARN (pipe2); #elif defined GNULIB_POSIXCHECK # undef pipe2 # if HAVE_RAW_DECL_PIPE2 _GL_WARN_ON_USE (pipe2, "pipe2 is unportable - " "use gnulib module pipe2 for portability"); # endif #endif #if @GNULIB_PREAD@ /* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET. Return the number of bytes placed into BUF if successful, otherwise set errno and return -1. 0 indicates EOF. See the POSIX:2008 specification . */ # if @REPLACE_PREAD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pread # define pread rpl_pread # endif _GL_FUNCDECL_RPL (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset)); # else # if !@HAVE_PREAD@ _GL_FUNCDECL_SYS (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (pread, ssize_t, (int fd, void *buf, size_t bufsize, off_t offset)); # endif _GL_CXXALIASWARN (pread); #elif defined GNULIB_POSIXCHECK # undef pread # if HAVE_RAW_DECL_PREAD _GL_WARN_ON_USE (pread, "pread is unportable - " "use gnulib module pread for portability"); # endif #endif #if @GNULIB_PWRITE@ /* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET. Return the number of bytes written if successful, otherwise set errno and return -1. 0 indicates nothing written. See the POSIX:2008 specification . */ # if @REPLACE_PWRITE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pwrite # define pwrite rpl_pwrite # endif _GL_FUNCDECL_RPL (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset)); # else # if !@HAVE_PWRITE@ _GL_FUNCDECL_SYS (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (pwrite, ssize_t, (int fd, const void *buf, size_t bufsize, off_t offset)); # endif _GL_CXXALIASWARN (pwrite); #elif defined GNULIB_POSIXCHECK # undef pwrite # if HAVE_RAW_DECL_PWRITE _GL_WARN_ON_USE (pwrite, "pwrite is unportable - " "use gnulib module pwrite for portability"); # endif #endif #if @GNULIB_READ@ /* Read up to COUNT bytes from file descriptor FD into the buffer starting at BUF. See the POSIX:2008 specification . */ # if @REPLACE_READ@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef read # define read rpl_read # endif _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count)); # else /* Need to cast, because on mingw, the third parameter is unsigned int count and the return type is 'int'. */ _GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count)); # endif _GL_CXXALIASWARN (read); #endif #if @GNULIB_READLINK@ /* Read the contents of the symbolic link FILE and place the first BUFSIZE bytes of it into BUF. Return the number of bytes placed into BUF if successful, otherwise -1 and errno set. See the POSIX:2008 specification . */ # if @REPLACE_READLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define readlink rpl_readlink # endif _GL_FUNCDECL_RPL (readlink, ssize_t, (const char *file, char *buf, size_t bufsize) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (readlink, ssize_t, (const char *file, char *buf, size_t bufsize)); # else # if !@HAVE_READLINK@ _GL_FUNCDECL_SYS (readlink, ssize_t, (const char *file, char *buf, size_t bufsize) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (readlink, ssize_t, (const char *file, char *buf, size_t bufsize)); # endif _GL_CXXALIASWARN (readlink); #elif defined GNULIB_POSIXCHECK # undef readlink # if HAVE_RAW_DECL_READLINK _GL_WARN_ON_USE (readlink, "readlink is unportable - " "use gnulib module readlink for portability"); # endif #endif #if @GNULIB_READLINKAT@ # if !@HAVE_READLINKAT@ _GL_FUNCDECL_SYS (readlinkat, ssize_t, (int fd, char const *file, char *buf, size_t len) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (readlinkat, ssize_t, (int fd, char const *file, char *buf, size_t len)); _GL_CXXALIASWARN (readlinkat); #elif defined GNULIB_POSIXCHECK # undef readlinkat # if HAVE_RAW_DECL_READLINKAT _GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - " "use gnulib module readlinkat for portability"); # endif #endif #if @GNULIB_RMDIR@ /* Remove the directory DIR. */ # if @REPLACE_RMDIR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define rmdir rpl_rmdir # endif _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (rmdir, int, (char const *name)); # else _GL_CXXALIAS_SYS (rmdir, int, (char const *name)); # endif _GL_CXXALIASWARN (rmdir); #elif defined GNULIB_POSIXCHECK # undef rmdir # if HAVE_RAW_DECL_RMDIR _GL_WARN_ON_USE (rmdir, "rmdir is unportable - " "use gnulib module rmdir for portability"); # endif #endif #if @GNULIB_SETHOSTNAME@ /* Set the host name of the machine. The host name may or may not be fully qualified. Put LEN bytes of NAME into the host name. Return 0 if successful, otherwise, set errno and return -1. Platforms with no ability to set the hostname return -1 and set errno = ENOSYS. */ # if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@ _GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5 and FreeBSD 6.4 the second parameter is int. On Solaris 11 2011-10, the first parameter is not const. */ _GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len)); _GL_CXXALIASWARN (sethostname); #elif defined GNULIB_POSIXCHECK # undef sethostname # if HAVE_RAW_DECL_SETHOSTNAME _GL_WARN_ON_USE (sethostname, "sethostname is unportable - " "use gnulib module sethostname for portability"); # endif #endif #if @GNULIB_SLEEP@ /* Pause the execution of the current thread for N seconds. Returns the number of seconds left to sleep. See the POSIX:2008 specification . */ # if @REPLACE_SLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef sleep # define sleep rpl_sleep # endif _GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n)); _GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n)); # else # if !@HAVE_SLEEP@ _GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n)); # endif _GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n)); # endif _GL_CXXALIASWARN (sleep); #elif defined GNULIB_POSIXCHECK # undef sleep # if HAVE_RAW_DECL_SLEEP _GL_WARN_ON_USE (sleep, "sleep is unportable - " "use gnulib module sleep for portability"); # endif #endif #if @GNULIB_SYMLINK@ # if @REPLACE_SYMLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef symlink # define symlink rpl_symlink # endif _GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file)); # else # if !@HAVE_SYMLINK@ _GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file)); # endif _GL_CXXALIASWARN (symlink); #elif defined GNULIB_POSIXCHECK # undef symlink # if HAVE_RAW_DECL_SYMLINK _GL_WARN_ON_USE (symlink, "symlink is not portable - " "use gnulib module symlink for portability"); # endif #endif #if @GNULIB_SYMLINKAT@ # if !@HAVE_SYMLINKAT@ _GL_FUNCDECL_SYS (symlinkat, int, (char const *contents, int fd, char const *file) _GL_ARG_NONNULL ((1, 3))); # endif _GL_CXXALIAS_SYS (symlinkat, int, (char const *contents, int fd, char const *file)); _GL_CXXALIASWARN (symlinkat); #elif defined GNULIB_POSIXCHECK # undef symlinkat # if HAVE_RAW_DECL_SYMLINKAT _GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - " "use gnulib module symlinkat for portability"); # endif #endif #if @GNULIB_TTYNAME_R@ /* Store at most BUFLEN characters of the pathname of the terminal FD is open on in BUF. Return 0 on success, otherwise an error number. */ # if @REPLACE_TTYNAME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ttyname_r # define ttyname_r rpl_ttyname_r # endif _GL_FUNCDECL_RPL (ttyname_r, int, (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (ttyname_r, int, (int fd, char *buf, size_t buflen)); # else # if !@HAVE_DECL_TTYNAME_R@ _GL_FUNCDECL_SYS (ttyname_r, int, (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (ttyname_r, int, (int fd, char *buf, size_t buflen)); # endif _GL_CXXALIASWARN (ttyname_r); #elif defined GNULIB_POSIXCHECK # undef ttyname_r # if HAVE_RAW_DECL_TTYNAME_R _GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - " "use gnulib module ttyname_r for portability"); # endif #endif #if @GNULIB_UNLINK@ # if @REPLACE_UNLINK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unlink # define unlink rpl_unlink # endif _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (unlink, int, (char const *file)); # else _GL_CXXALIAS_SYS (unlink, int, (char const *file)); # endif _GL_CXXALIASWARN (unlink); #elif defined GNULIB_POSIXCHECK # undef unlink # if HAVE_RAW_DECL_UNLINK _GL_WARN_ON_USE (unlink, "unlink is not portable - " "use gnulib module unlink for portability"); # endif #endif #if @GNULIB_UNLINKAT@ # if @REPLACE_UNLINKAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef unlinkat # define unlinkat rpl_unlinkat # endif _GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag)); # else # if !@HAVE_UNLINKAT@ _GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag)); # endif _GL_CXXALIASWARN (unlinkat); #elif defined GNULIB_POSIXCHECK # undef unlinkat # if HAVE_RAW_DECL_UNLINKAT _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_USLEEP@ /* Pause the execution of the current thread for N microseconds. Returns 0 on completion, or -1 on range error. See the POSIX:2001 specification . */ # if @REPLACE_USLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef usleep # define usleep rpl_usleep # endif _GL_FUNCDECL_RPL (usleep, int, (useconds_t n)); _GL_CXXALIAS_RPL (usleep, int, (useconds_t n)); # else # if !@HAVE_USLEEP@ _GL_FUNCDECL_SYS (usleep, int, (useconds_t n)); # endif _GL_CXXALIAS_SYS (usleep, int, (useconds_t n)); # endif _GL_CXXALIASWARN (usleep); #elif defined GNULIB_POSIXCHECK # undef usleep # if HAVE_RAW_DECL_USLEEP _GL_WARN_ON_USE (usleep, "usleep is unportable - " "use gnulib module usleep for portability"); # endif #endif #if @GNULIB_WRITE@ /* Write up to COUNT bytes starting at BUF to file descriptor FD. See the POSIX:2008 specification . */ # if @REPLACE_WRITE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef write # define write rpl_write # endif _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count)); # else /* Need to cast, because on mingw, the third parameter is unsigned int count and the return type is 'int'. */ _GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count)); # endif _GL_CXXALIASWARN (write); #endif _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_UNISTD_H */ #endif /* _@GUARD_PREFIX@_UNISTD_H */ shishi-1.0.2/gl/parse-datetime.y0000644000000000000000000013355112126660053013401 00000000000000%{ /* Parse a string into an internal time stamp. Copyright (C) 1999-2000, 2002-2013 Free Software Foundation, Inc. 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 . */ /* Originally written by Steven M. Bellovin while at the University of North Carolina at Chapel Hill. Later tweaked by a couple of people on Usenet. Completely overhauled by Rich $alz and Jim Berets in August, 1990. Modified by Paul Eggert in August 1999 to do the right thing about local DST. Also modified by Paul Eggert in February 2004 to support nanosecond-resolution time stamps, and in October 2004 to support TZ strings in dates. */ /* FIXME: Check for arithmetic overflow in all cases, not just some of them. */ #include #include "parse-datetime.h" #include "intprops.h" #include "timespec.h" #include "verify.h" /* There's no need to extend the stack, so there's no need to involve alloca. */ #define YYSTACK_USE_ALLOCA 0 /* Tell Bison how much stack space is needed. 20 should be plenty for this grammar, which is not right recursive. Beware setting it too high, since that might cause problems on machines whose implementations have lame stack-overflow checking. */ #define YYMAXDEPTH 20 #define YYINITDEPTH YYMAXDEPTH /* Since the code of parse-datetime.y is not included in the Emacs executable itself, there is no need to #define static in this file. Even if the code were included in the Emacs executable, it probably wouldn't do any harm to #undef it here; this will only cause problems if we try to write to a static variable, which I don't think this code needs to do. */ #ifdef emacs # undef static #endif #include #include #include #include #include #include "xalloc.h" /* Bison's skeleton tests _STDLIB_H, while some stdlib.h headers use _STDLIB_H_ as witness. Map the latter to the one bison uses. */ /* FIXME: this is temporary. Remove when we have a mechanism to ensure that the version we're using is fixed, too. */ #ifdef _STDLIB_H_ # undef _STDLIB_H # define _STDLIB_H 1 #endif /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char or EOF. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition of "digit" even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) /* Shift A right by B bits portably, by dividing A by 2**B and truncating towards minus infinity. A and B should be free of side effects, and B should be in the range 0 <= B <= INT_BITS - 2, where INT_BITS is the number of useful bits in an int. GNU code can assume that INT_BITS is at least 32. ISO C99 says that A >> B is implementation-defined if A < 0. Some implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift right in the usual way when A < 0, so SHR falls back on division if ordinary A >> B doesn't seem to be the usual signed shift. */ #define SHR(a, b) \ (-1 >> 1 == -1 \ ? (a) >> (b) \ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 #define HOUR(x) ((x) * 60) /* long_time_t is a signed integer type that contains all time_t values. */ verify (TYPE_IS_INTEGER (time_t)); #if TIME_T_FITS_IN_LONG_INT typedef long int long_time_t; #else typedef time_t long_time_t; #endif /* Convert a possibly-signed character to an unsigned character. This is a bit safer than casting to unsigned char, since it catches some type errors that the cast doesn't. */ static unsigned char to_uchar (char ch) { return ch; } /* Lots of this code assumes time_t and time_t-like values fit into long_time_t. */ verify (TYPE_MINIMUM (long_time_t) <= TYPE_MINIMUM (time_t) && TYPE_MAXIMUM (time_t) <= TYPE_MAXIMUM (long_time_t)); /* FIXME: It also assumes that signed integer overflow silently wraps around, but this is not true any more with recent versions of GCC 4. */ /* An integer value, and the number of digits in its textual representation. */ typedef struct { bool negative; long int value; size_t digits; } textint; /* An entry in the lexical lookup table. */ typedef struct { char const *name; int type; int value; } table; /* Meridian: am, pm, or 24-hour style. */ enum { MERam, MERpm, MER24 }; enum { BILLION = 1000000000, LOG10_BILLION = 9 }; /* Relative times. */ typedef struct { /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */ long int year; long int month; long int day; long int hour; long int minutes; long_time_t seconds; long int ns; } relative_time; #if HAVE_COMPOUND_LITERALS # define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 }) #else static relative_time const RELATIVE_TIME_0; #endif /* Information passed to and from the parser. */ typedef struct { /* The input string remaining to be parsed. */ const char *input; /* N, if this is the Nth Tuesday. */ long int day_ordinal; /* Day of week; Sunday is 0. */ int day_number; /* tm_isdst flag for the local zone. */ int local_isdst; /* Time zone, in minutes east of UTC. */ long int time_zone; /* Style used for time. */ int meridian; /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */ textint year; long int month; long int day; long int hour; long int minutes; struct timespec seconds; /* includes nanoseconds */ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */ relative_time rel; /* Presence or counts of nonterminals of various flavors parsed so far. */ bool timespec_seen; bool rels_seen; size_t dates_seen; size_t days_seen; size_t local_zones_seen; size_t dsts_seen; size_t times_seen; size_t zones_seen; /* Table of local time zone abbreviations, terminated by a null entry. */ table local_time_zone_table[3]; } parser_control; union YYSTYPE; static int yylex (union YYSTYPE *, parser_control *); static int yyerror (parser_control const *, char const *); static long int time_zone_hhmm (parser_control *, textint, long int); /* Extract into *PC any date and time info from a string of digits of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY, YYYY, ...). */ static void digits_to_date_time (parser_control *pc, textint text_int) { if (pc->dates_seen && ! pc->year.digits && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits)) pc->year = text_int; else { if (4 < text_int.digits) { pc->dates_seen++; pc->day = text_int.value % 100; pc->month = (text_int.value / 100) % 100; pc->year.value = text_int.value / 10000; pc->year.digits = text_int.digits - 4; } else { pc->times_seen++; if (text_int.digits <= 2) { pc->hour = text_int.value; pc->minutes = 0; } else { pc->hour = text_int.value / 100; pc->minutes = text_int.value % 100; } pc->seconds.tv_sec = 0; pc->seconds.tv_nsec = 0; pc->meridian = MER24; } } } /* Increment PC->rel by FACTOR * REL (FACTOR is 1 or -1). */ static void apply_relative_time (parser_control *pc, relative_time rel, int factor) { pc->rel.ns += factor * rel.ns; pc->rel.seconds += factor * rel.seconds; pc->rel.minutes += factor * rel.minutes; pc->rel.hour += factor * rel.hour; pc->rel.day += factor * rel.day; pc->rel.month += factor * rel.month; pc->rel.year += factor * rel.year; pc->rels_seen = true; } /* Set PC-> hour, minutes, seconds and nanoseconds members from arguments. */ static void set_hhmmss (parser_control *pc, long int hour, long int minutes, time_t sec, long int nsec) { pc->hour = hour; pc->minutes = minutes; pc->seconds.tv_sec = sec; pc->seconds.tv_nsec = nsec; } %} /* We want a reentrant parser, even if the TZ manipulation and the calls to localtime and gmtime are not reentrant. */ %pure-parser %parse-param { parser_control *pc } %lex-param { parser_control *pc } /* This grammar has 31 shift/reduce conflicts. */ %expect 31 %union { long int intval; textint textintval; struct timespec timespec; relative_time rel; } %token tAGO %token tDST %token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT %token tDAY_UNIT tDAY_SHIFT %token tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN %token tMONTH tORDINAL tZONE %token tSNUMBER tUNUMBER %token tSDECIMAL_NUMBER tUDECIMAL_NUMBER %type o_colon_minutes %type seconds signed_seconds unsigned_seconds %type relunit relunit_snumber dayshift %% spec: timespec | items ; timespec: '@' seconds { pc->seconds = $2; pc->timespec_seen = true; } ; items: /* empty */ | items item ; item: datetime { pc->times_seen++; pc->dates_seen++; } | time { pc->times_seen++; } | local_zone { pc->local_zones_seen++; } | zone { pc->zones_seen++; } | date { pc->dates_seen++; } | day { pc->days_seen++; } | rel | number | hybrid ; datetime: iso_8601_datetime ; iso_8601_datetime: iso_8601_date 'T' iso_8601_time ; time: tUNUMBER tMERIDIAN { set_hhmmss (pc, $1.value, 0, 0, 0); pc->meridian = $2; } | tUNUMBER ':' tUNUMBER tMERIDIAN { set_hhmmss (pc, $1.value, $3.value, 0, 0); pc->meridian = $4; } | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tMERIDIAN { set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec); pc->meridian = $6; } | iso_8601_time ; iso_8601_time: tUNUMBER zone_offset { set_hhmmss (pc, $1.value, 0, 0, 0); pc->meridian = MER24; } | tUNUMBER ':' tUNUMBER o_zone_offset { set_hhmmss (pc, $1.value, $3.value, 0, 0); pc->meridian = MER24; } | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_zone_offset { set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec); pc->meridian = MER24; } ; o_zone_offset: /* empty */ | zone_offset ; zone_offset: tSNUMBER o_colon_minutes { pc->zones_seen++; pc->time_zone = time_zone_hhmm (pc, $1, $2); } ; local_zone: tLOCAL_ZONE { pc->local_isdst = $1; pc->dsts_seen += (0 < $1); } | tLOCAL_ZONE tDST { pc->local_isdst = 1; pc->dsts_seen += (0 < $1) + 1; } ; /* Note 'T' is a special case, as it is used as the separator in ISO 8601 date and time of day representation. */ zone: tZONE { pc->time_zone = $1; } | 'T' { pc->time_zone = HOUR(7); } | tZONE relunit_snumber { pc->time_zone = $1; apply_relative_time (pc, $2, 1); } | 'T' relunit_snumber { pc->time_zone = HOUR(7); apply_relative_time (pc, $2, 1); } | tZONE tSNUMBER o_colon_minutes { pc->time_zone = $1 + time_zone_hhmm (pc, $2, $3); } | tDAYZONE { pc->time_zone = $1 + 60; } | tZONE tDST { pc->time_zone = $1 + 60; } ; day: tDAY { pc->day_ordinal = 0; pc->day_number = $1; } | tDAY ',' { pc->day_ordinal = 0; pc->day_number = $1; } | tORDINAL tDAY { pc->day_ordinal = $1; pc->day_number = $2; } | tUNUMBER tDAY { pc->day_ordinal = $1.value; pc->day_number = $2; } ; date: tUNUMBER '/' tUNUMBER { pc->month = $1.value; pc->day = $3.value; } | tUNUMBER '/' tUNUMBER '/' tUNUMBER { /* Interpret as YYYY/MM/DD if the first value has 4 or more digits, otherwise as MM/DD/YY. The goal in recognizing YYYY/MM/DD is solely to support legacy machine-generated dates like those in an RCS log listing. If you want portability, use the ISO 8601 format. */ if (4 <= $1.digits) { pc->year = $1; pc->month = $3.value; pc->day = $5.value; } else { pc->month = $1.value; pc->day = $3.value; pc->year = $5; } } | tUNUMBER tMONTH tSNUMBER { /* e.g. 17-JUN-1992. */ pc->day = $1.value; pc->month = $2; pc->year.value = -$3.value; pc->year.digits = $3.digits; } | tMONTH tSNUMBER tSNUMBER { /* e.g. JUN-17-1992. */ pc->month = $1; pc->day = -$2.value; pc->year.value = -$3.value; pc->year.digits = $3.digits; } | tMONTH tUNUMBER { pc->month = $1; pc->day = $2.value; } | tMONTH tUNUMBER ',' tUNUMBER { pc->month = $1; pc->day = $2.value; pc->year = $4; } | tUNUMBER tMONTH { pc->day = $1.value; pc->month = $2; } | tUNUMBER tMONTH tUNUMBER { pc->day = $1.value; pc->month = $2; pc->year = $3; } | iso_8601_date ; iso_8601_date: tUNUMBER tSNUMBER tSNUMBER { /* ISO 8601 format. YYYY-MM-DD. */ pc->year = $1; pc->month = -$2.value; pc->day = -$3.value; } ; rel: relunit tAGO { apply_relative_time (pc, $1, $2); } | relunit { apply_relative_time (pc, $1, 1); } | dayshift { apply_relative_time (pc, $1, 1); } ; relunit: tORDINAL tYEAR_UNIT { $$ = RELATIVE_TIME_0; $$.year = $1; } | tUNUMBER tYEAR_UNIT { $$ = RELATIVE_TIME_0; $$.year = $1.value; } | tYEAR_UNIT { $$ = RELATIVE_TIME_0; $$.year = 1; } | tORDINAL tMONTH_UNIT { $$ = RELATIVE_TIME_0; $$.month = $1; } | tUNUMBER tMONTH_UNIT { $$ = RELATIVE_TIME_0; $$.month = $1.value; } | tMONTH_UNIT { $$ = RELATIVE_TIME_0; $$.month = 1; } | tORDINAL tDAY_UNIT { $$ = RELATIVE_TIME_0; $$.day = $1 * $2; } | tUNUMBER tDAY_UNIT { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; } | tDAY_UNIT { $$ = RELATIVE_TIME_0; $$.day = $1; } | tORDINAL tHOUR_UNIT { $$ = RELATIVE_TIME_0; $$.hour = $1; } | tUNUMBER tHOUR_UNIT { $$ = RELATIVE_TIME_0; $$.hour = $1.value; } | tHOUR_UNIT { $$ = RELATIVE_TIME_0; $$.hour = 1; } | tORDINAL tMINUTE_UNIT { $$ = RELATIVE_TIME_0; $$.minutes = $1; } | tUNUMBER tMINUTE_UNIT { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; } | tMINUTE_UNIT { $$ = RELATIVE_TIME_0; $$.minutes = 1; } | tORDINAL tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = $1; } | tUNUMBER tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; } | tSDECIMAL_NUMBER tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; } | tUDECIMAL_NUMBER tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; } | tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = 1; } | relunit_snumber ; relunit_snumber: tSNUMBER tYEAR_UNIT { $$ = RELATIVE_TIME_0; $$.year = $1.value; } | tSNUMBER tMONTH_UNIT { $$ = RELATIVE_TIME_0; $$.month = $1.value; } | tSNUMBER tDAY_UNIT { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; } | tSNUMBER tHOUR_UNIT { $$ = RELATIVE_TIME_0; $$.hour = $1.value; } | tSNUMBER tMINUTE_UNIT { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; } | tSNUMBER tSEC_UNIT { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; } ; dayshift: tDAY_SHIFT { $$ = RELATIVE_TIME_0; $$.day = $1; } ; seconds: signed_seconds | unsigned_seconds; signed_seconds: tSDECIMAL_NUMBER | tSNUMBER { $$.tv_sec = $1.value; $$.tv_nsec = 0; } ; unsigned_seconds: tUDECIMAL_NUMBER | tUNUMBER { $$.tv_sec = $1.value; $$.tv_nsec = 0; } ; number: tUNUMBER { digits_to_date_time (pc, $1); } ; hybrid: tUNUMBER relunit_snumber { /* Hybrid all-digit and relative offset, so that we accept e.g., "YYYYMMDD +N days" as well as "YYYYMMDD N days". */ digits_to_date_time (pc, $1); apply_relative_time (pc, $2, 1); } ; o_colon_minutes: /* empty */ { $$ = -1; } | ':' tUNUMBER { $$ = $2.value; } ; %% static table const meridian_table[] = { { "AM", tMERIDIAN, MERam }, { "A.M.", tMERIDIAN, MERam }, { "PM", tMERIDIAN, MERpm }, { "P.M.", tMERIDIAN, MERpm }, { NULL, 0, 0 } }; static table const dst_table[] = { { "DST", tDST, 0 } }; static table const month_and_day_table[] = { { "JANUARY", tMONTH, 1 }, { "FEBRUARY", tMONTH, 2 }, { "MARCH", tMONTH, 3 }, { "APRIL", tMONTH, 4 }, { "MAY", tMONTH, 5 }, { "JUNE", tMONTH, 6 }, { "JULY", tMONTH, 7 }, { "AUGUST", tMONTH, 8 }, { "SEPTEMBER",tMONTH, 9 }, { "SEPT", tMONTH, 9 }, { "OCTOBER", tMONTH, 10 }, { "NOVEMBER", tMONTH, 11 }, { "DECEMBER", tMONTH, 12 }, { "SUNDAY", tDAY, 0 }, { "MONDAY", tDAY, 1 }, { "TUESDAY", tDAY, 2 }, { "TUES", tDAY, 2 }, { "WEDNESDAY",tDAY, 3 }, { "WEDNES", tDAY, 3 }, { "THURSDAY", tDAY, 4 }, { "THUR", tDAY, 4 }, { "THURS", tDAY, 4 }, { "FRIDAY", tDAY, 5 }, { "SATURDAY", tDAY, 6 }, { NULL, 0, 0 } }; static table const time_units_table[] = { { "YEAR", tYEAR_UNIT, 1 }, { "MONTH", tMONTH_UNIT, 1 }, { "FORTNIGHT",tDAY_UNIT, 14 }, { "WEEK", tDAY_UNIT, 7 }, { "DAY", tDAY_UNIT, 1 }, { "HOUR", tHOUR_UNIT, 1 }, { "MINUTE", tMINUTE_UNIT, 1 }, { "MIN", tMINUTE_UNIT, 1 }, { "SECOND", tSEC_UNIT, 1 }, { "SEC", tSEC_UNIT, 1 }, { NULL, 0, 0 } }; /* Assorted relative-time words. */ static table const relative_time_table[] = { { "TOMORROW", tDAY_SHIFT, 1 }, { "YESTERDAY",tDAY_SHIFT, -1 }, { "TODAY", tDAY_SHIFT, 0 }, { "NOW", tDAY_SHIFT, 0 }, { "LAST", tORDINAL, -1 }, { "THIS", tORDINAL, 0 }, { "NEXT", tORDINAL, 1 }, { "FIRST", tORDINAL, 1 }, /*{ "SECOND", tORDINAL, 2 }, */ { "THIRD", tORDINAL, 3 }, { "FOURTH", tORDINAL, 4 }, { "FIFTH", tORDINAL, 5 }, { "SIXTH", tORDINAL, 6 }, { "SEVENTH", tORDINAL, 7 }, { "EIGHTH", tORDINAL, 8 }, { "NINTH", tORDINAL, 9 }, { "TENTH", tORDINAL, 10 }, { "ELEVENTH", tORDINAL, 11 }, { "TWELFTH", tORDINAL, 12 }, { "AGO", tAGO, -1 }, { "HENCE", tAGO, 1 }, { NULL, 0, 0 } }; /* The universal time zone table. These labels can be used even for time stamps that would not otherwise be valid, e.g., GMT time stamps in London during summer. */ static table const universal_time_zone_table[] = { { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */ { "UTC", tZONE, HOUR ( 0) }, { NULL, 0, 0 } }; /* The time zone table. This table is necessarily incomplete, as time zone abbreviations are ambiguous; e.g. Australians interpret "EST" as Eastern time in Australia, not as US Eastern Standard Time. You cannot rely on parse_datetime to handle arbitrary time zone abbreviations; use numeric abbreviations like "-0500" instead. */ static table const time_zone_table[] = { { "WET", tZONE, HOUR ( 0) }, /* Western European */ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */ { "CET", tZONE, HOUR ( 1) }, /* Central European */ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */ { "MET", tZONE, HOUR ( 1) }, /* Middle European */ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */ { "GST", tZONE, HOUR (10) }, /* Guam Standard */ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */ { NULL, 0, 0 } }; /* Military time zone table. Note 'T' is a special case, as it is used as the separator in ISO 8601 date and time of day representation. */ static table const military_table[] = { { "A", tZONE, -HOUR ( 1) }, { "B", tZONE, -HOUR ( 2) }, { "C", tZONE, -HOUR ( 3) }, { "D", tZONE, -HOUR ( 4) }, { "E", tZONE, -HOUR ( 5) }, { "F", tZONE, -HOUR ( 6) }, { "G", tZONE, -HOUR ( 7) }, { "H", tZONE, -HOUR ( 8) }, { "I", tZONE, -HOUR ( 9) }, { "K", tZONE, -HOUR (10) }, { "L", tZONE, -HOUR (11) }, { "M", tZONE, -HOUR (12) }, { "N", tZONE, HOUR ( 1) }, { "O", tZONE, HOUR ( 2) }, { "P", tZONE, HOUR ( 3) }, { "Q", tZONE, HOUR ( 4) }, { "R", tZONE, HOUR ( 5) }, { "S", tZONE, HOUR ( 6) }, { "T", 'T', 0 }, { "U", tZONE, HOUR ( 8) }, { "V", tZONE, HOUR ( 9) }, { "W", tZONE, HOUR (10) }, { "X", tZONE, HOUR (11) }, { "Y", tZONE, HOUR (12) }, { "Z", tZONE, HOUR ( 0) }, { NULL, 0, 0 } }; /* Convert a time zone expressed as HH:MM into an integer count of minutes. If MM is negative, then S is of the form HHMM and needs to be picked apart; otherwise, S is of the form HH. As specified in http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow only valid TZ range, and consider first two digits as hours, if no minutes specified. */ static long int time_zone_hhmm (parser_control *pc, textint s, long int mm) { long int n_minutes; /* If the length of S is 1 or 2 and no minutes are specified, interpret it as a number of hours. */ if (s.digits <= 2 && mm < 0) s.value *= 100; if (mm < 0) n_minutes = (s.value / 100) * 60 + s.value % 100; else n_minutes = s.value * 60 + (s.negative ? -mm : mm); /* If the absolute number of minutes is larger than 24 hours, arrange to reject it by incrementing pc->zones_seen. Thus, we allow only values in the range UTC-24:00 to UTC+24:00. */ if (24 * 60 < abs (n_minutes)) pc->zones_seen++; return n_minutes; } static int to_hour (long int hours, int meridian) { switch (meridian) { default: /* Pacify GCC. */ case MER24: return 0 <= hours && hours < 24 ? hours : -1; case MERam: return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1; case MERpm: return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1; } } static long int to_year (textint textyear) { long int year = textyear.value; if (year < 0) year = -year; /* XPG4 suggests that years 00-68 map to 2000-2068, and years 69-99 map to 1969-1999. */ else if (textyear.digits == 2) year += year < 69 ? 2000 : 1900; return year; } static table const * _GL_ATTRIBUTE_PURE lookup_zone (parser_control const *pc, char const *name) { table const *tp; for (tp = universal_time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; /* Try local zone abbreviations before those in time_zone_table, as the local ones are more likely to be right. */ for (tp = pc->local_time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; for (tp = time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; return NULL; } #if ! HAVE_TM_GMTOFF /* Yield the difference between *A and *B, measured in seconds, ignoring leap seconds. The body of this function is taken directly from the GNU C Library; see src/strftime.c. */ static long int tm_diff (struct tm const *a, struct tm const *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations. */ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); int a100 = a4 / 25 - (a4 % 25 < 0); int b100 = b4 / 25 - (b4 % 25 < 0); int a400 = SHR (a100, 2); int b400 = SHR (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); long int ayear = a->tm_year; long int years = ayear - b->tm_year; long int days = (365 * years + intervening_leap_days + (a->tm_yday - b->tm_yday)); return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) + (a->tm_min - b->tm_min)) + (a->tm_sec - b->tm_sec)); } #endif /* ! HAVE_TM_GMTOFF */ static table const * lookup_word (parser_control const *pc, char *word) { char *p; char *q; size_t wordlen; table const *tp; bool period_found; bool abbrev; /* Make it uppercase. */ for (p = word; *p; p++) { unsigned char ch = *p; *p = c_toupper (ch); } for (tp = meridian_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* See if we have an abbreviation for a month. */ wordlen = strlen (word); abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.'); for (tp = month_and_day_table; tp->name; tp++) if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0) return tp; if ((tp = lookup_zone (pc, word))) return tp; if (strcmp (word, dst_table[0].name) == 0) return dst_table; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Strip off any plural and try the units table again. */ if (word[wordlen - 1] == 'S') { word[wordlen - 1] = '\0'; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */ } for (tp = relative_time_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Military time zones. */ if (wordlen == 1) for (tp = military_table; tp->name; tp++) if (word[0] == tp->name[0]) return tp; /* Drop out any periods and try the time zone table again. */ for (period_found = false, p = q = word; (*p = *q); q++) if (*q == '.') period_found = true; else p++; if (period_found && (tp = lookup_zone (pc, word))) return tp; return NULL; } static int yylex (YYSTYPE *lvalp, parser_control *pc) { unsigned char c; size_t count; for (;;) { while (c = *pc->input, c_isspace (c)) pc->input++; if (ISDIGIT (c) || c == '-' || c == '+') { char const *p; int sign; unsigned long int value; if (c == '-' || c == '+') { sign = c == '-' ? -1 : 1; while (c = *++pc->input, c_isspace (c)) continue; if (! ISDIGIT (c)) /* skip the '-' sign */ continue; } else sign = 0; p = pc->input; for (value = 0; ; value *= 10) { unsigned long int value1 = value + (c - '0'); if (value1 < value) return '?'; value = value1; c = *++p; if (! ISDIGIT (c)) break; if (ULONG_MAX / 10 < value) return '?'; } if ((c == '.' || c == ',') && ISDIGIT (p[1])) { time_t s; int ns; int digits; unsigned long int value1; /* Check for overflow when converting value to time_t. */ if (sign < 0) { s = - value; if (0 < s) return '?'; value1 = -s; } else { s = value; if (s < 0) return '?'; value1 = s; } if (value != value1) return '?'; /* Accumulate fraction, to ns precision. */ p++; ns = *p++ - '0'; for (digits = 2; digits <= LOG10_BILLION; digits++) { ns *= 10; if (ISDIGIT (*p)) ns += *p++ - '0'; } /* Skip excess digits, truncating toward -Infinity. */ if (sign < 0) for (; ISDIGIT (*p); p++) if (*p != '0') { ns++; break; } while (ISDIGIT (*p)) p++; /* Adjust to the timespec convention, which is that tv_nsec is always a positive offset even if tv_sec is negative. */ if (sign < 0 && ns) { s--; if (! (s < 0)) return '?'; ns = BILLION - ns; } lvalp->timespec.tv_sec = s; lvalp->timespec.tv_nsec = ns; pc->input = p; return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER; } else { lvalp->textintval.negative = sign < 0; if (sign < 0) { lvalp->textintval.value = - value; if (0 < lvalp->textintval.value) return '?'; } else { lvalp->textintval.value = value; if (lvalp->textintval.value < 0) return '?'; } lvalp->textintval.digits = p - pc->input; pc->input = p; return sign ? tSNUMBER : tUNUMBER; } } if (c_isalpha (c)) { char buff[20]; char *p = buff; table const *tp; do { if (p - buff < sizeof buff - 1) *p++ = c; c = *++pc->input; } while (c_isalpha (c) || c == '.'); *p = '\0'; tp = lookup_word (pc, buff); if (! tp) return '?'; lvalp->intval = tp->value; return tp->type; } if (c != '(') return to_uchar (*pc->input++); count = 0; do { c = *pc->input++; if (c == '\0') return c; if (c == '(') count++; else if (c == ')') count--; } while (count != 0); } } /* Do nothing if the parser reports an error. */ static int yyerror (parser_control const *pc _GL_UNUSED, char const *s _GL_UNUSED) { return 0; } /* If *TM0 is the old and *TM1 is the new value of a struct tm after passing it to mktime, return true if it's OK that mktime returned T. It's not OK if *TM0 has out-of-range members. */ static bool mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t) { if (t == (time_t) -1) { /* Guard against falsely reporting an error when parsing a time stamp that happens to equal (time_t) -1, on a host that supports such a time stamp. */ tm1 = localtime (&t); if (!tm1) return false; } return ! ((tm0->tm_sec ^ tm1->tm_sec) | (tm0->tm_min ^ tm1->tm_min) | (tm0->tm_hour ^ tm1->tm_hour) | (tm0->tm_mday ^ tm1->tm_mday) | (tm0->tm_mon ^ tm1->tm_mon) | (tm0->tm_year ^ tm1->tm_year)); } /* A reasonable upper bound for the size of ordinary TZ strings. Use heap allocation if TZ's length exceeds this. */ enum { TZBUFSIZE = 100 }; /* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated otherwise. */ static char * get_tz (char tzbuf[TZBUFSIZE]) { char *tz = getenv ("TZ"); if (tz) { size_t tzsize = strlen (tz) + 1; tz = (tzsize <= TZBUFSIZE ? memcpy (tzbuf, tz, tzsize) : xmemdup (tz, tzsize)); } return tz; } /* Parse a date/time string, storing the resulting time value into *RESULT. The string itself is pointed to by P. Return true if successful. P can be an incomplete or relative time specification; if so, use *NOW as the basis for the returned time. */ bool parse_datetime (struct timespec *result, char const *p, struct timespec const *now) { time_t Start; long int Start_ns; struct tm const *tmp; struct tm tm; struct tm tm0; parser_control pc; struct timespec gettime_buffer; unsigned char c; bool tz_was_altered = false; char *tz0 = NULL; char tz0buf[TZBUFSIZE]; bool ok = true; if (! now) { gettime (&gettime_buffer); now = &gettime_buffer; } Start = now->tv_sec; Start_ns = now->tv_nsec; tmp = localtime (&now->tv_sec); if (! tmp) return false; while (c = *p, c_isspace (c)) p++; if (strncmp (p, "TZ=\"", 4) == 0) { char const *tzbase = p + 4; size_t tzsize = 1; char const *s; for (s = tzbase; *s; s++, tzsize++) if (*s == '\\') { s++; if (! (*s == '\\' || *s == '"')) break; } else if (*s == '"') { char *z; char *tz1; char tz1buf[TZBUFSIZE]; bool large_tz = TZBUFSIZE < tzsize; bool setenv_ok; /* Free tz0, in case this is the 2nd or subsequent time through. */ free (tz0); tz0 = get_tz (tz0buf); z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf; for (s = tzbase; *s != '"'; s++) *z++ = *(s += *s == '\\'); *z = '\0'; setenv_ok = setenv ("TZ", tz1, 1) == 0; if (large_tz) free (tz1); if (!setenv_ok) goto fail; tz_was_altered = true; p = s + 1; } } /* As documented, be careful to treat the empty string just like a date string of "0". Without this, an empty string would be declared invalid when parsed during a DST transition. */ if (*p == '\0') p = "0"; pc.input = p; pc.year.value = tmp->tm_year; pc.year.value += TM_YEAR_BASE; pc.year.digits = 0; pc.month = tmp->tm_mon + 1; pc.day = tmp->tm_mday; pc.hour = tmp->tm_hour; pc.minutes = tmp->tm_min; pc.seconds.tv_sec = tmp->tm_sec; pc.seconds.tv_nsec = Start_ns; tm.tm_isdst = tmp->tm_isdst; pc.meridian = MER24; pc.rel = RELATIVE_TIME_0; pc.timespec_seen = false; pc.rels_seen = false; pc.dates_seen = 0; pc.days_seen = 0; pc.times_seen = 0; pc.local_zones_seen = 0; pc.dsts_seen = 0; pc.zones_seen = 0; #if HAVE_STRUCT_TM_TM_ZONE pc.local_time_zone_table[0].name = tmp->tm_zone; pc.local_time_zone_table[0].type = tLOCAL_ZONE; pc.local_time_zone_table[0].value = tmp->tm_isdst; pc.local_time_zone_table[1].name = NULL; /* Probe the names used in the next three calendar quarters, looking for a tm_isdst different from the one we already have. */ { int quarter; for (quarter = 1; quarter <= 3; quarter++) { time_t probe = Start + quarter * (90 * 24 * 60 * 60); struct tm const *probe_tm = localtime (&probe); if (probe_tm && probe_tm->tm_zone && probe_tm->tm_isdst != pc.local_time_zone_table[0].value) { { pc.local_time_zone_table[1].name = probe_tm->tm_zone; pc.local_time_zone_table[1].type = tLOCAL_ZONE; pc.local_time_zone_table[1].value = probe_tm->tm_isdst; pc.local_time_zone_table[2].name = NULL; } break; } } } #else #if HAVE_TZNAME { # if !HAVE_DECL_TZNAME extern char *tzname[]; # endif int i; for (i = 0; i < 2; i++) { pc.local_time_zone_table[i].name = tzname[i]; pc.local_time_zone_table[i].type = tLOCAL_ZONE; pc.local_time_zone_table[i].value = i; } pc.local_time_zone_table[i].name = NULL; } #else pc.local_time_zone_table[0].name = NULL; #endif #endif if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name && ! strcmp (pc.local_time_zone_table[0].name, pc.local_time_zone_table[1].name)) { /* This locale uses the same abbreviation for standard and daylight times. So if we see that abbreviation, we don't know whether it's daylight time. */ pc.local_time_zone_table[0].value = -1; pc.local_time_zone_table[1].name = NULL; } if (yyparse (&pc) != 0) goto fail; if (pc.timespec_seen) *result = pc.seconds; else { if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen | (pc.local_zones_seen + pc.zones_seen))) goto fail; tm.tm_year = to_year (pc.year) - TM_YEAR_BASE; tm.tm_mon = pc.month - 1; tm.tm_mday = pc.day; if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen)) { tm.tm_hour = to_hour (pc.hour, pc.meridian); if (tm.tm_hour < 0) goto fail; tm.tm_min = pc.minutes; tm.tm_sec = pc.seconds.tv_sec; } else { tm.tm_hour = tm.tm_min = tm.tm_sec = 0; pc.seconds.tv_nsec = 0; } /* Let mktime deduce tm_isdst if we have an absolute time stamp. */ if (pc.dates_seen | pc.days_seen | pc.times_seen) tm.tm_isdst = -1; /* But if the input explicitly specifies local time with or without DST, give mktime that information. */ if (pc.local_zones_seen) tm.tm_isdst = pc.local_isdst; tm0 = tm; Start = mktime (&tm); if (! mktime_ok (&tm0, &tm, Start)) { if (! pc.zones_seen) goto fail; else { /* Guard against falsely reporting errors near the time_t boundaries when parsing times in other time zones. For example, suppose the input string "1969-12-31 23:00:00 -0100", the current time zone is 8 hours ahead of UTC, and the min time_t value is 1970-01-01 00:00:00 UTC. Then the min localtime value is 1970-01-01 08:00:00, and mktime will therefore fail on 1969-12-31 23:00:00. To work around the problem, set the time zone to 1 hour behind UTC temporarily by setting TZ="XXX1:00" and try mktime again. */ long int time_zone = pc.time_zone; long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone; long int abs_time_zone_hour = abs_time_zone / 60; int abs_time_zone_min = abs_time_zone % 60; char tz1buf[sizeof "XXX+0:00" + sizeof pc.time_zone * CHAR_BIT / 3]; if (!tz_was_altered) tz0 = get_tz (tz0buf); sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0), abs_time_zone_hour, abs_time_zone_min); if (setenv ("TZ", tz1buf, 1) != 0) goto fail; tz_was_altered = true; tm = tm0; Start = mktime (&tm); if (! mktime_ok (&tm0, &tm, Start)) goto fail; } } if (pc.days_seen && ! pc.dates_seen) { tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7 + 7 * (pc.day_ordinal - (0 < pc.day_ordinal && tm.tm_wday != pc.day_number))); tm.tm_isdst = -1; Start = mktime (&tm); if (Start == (time_t) -1) goto fail; } /* Add relative date. */ if (pc.rel.year | pc.rel.month | pc.rel.day) { int year = tm.tm_year + pc.rel.year; int month = tm.tm_mon + pc.rel.month; int day = tm.tm_mday + pc.rel.day; if (((year < tm.tm_year) ^ (pc.rel.year < 0)) | ((month < tm.tm_mon) ^ (pc.rel.month < 0)) | ((day < tm.tm_mday) ^ (pc.rel.day < 0))) goto fail; tm.tm_year = year; tm.tm_mon = month; tm.tm_mday = day; tm.tm_hour = tm0.tm_hour; tm.tm_min = tm0.tm_min; tm.tm_sec = tm0.tm_sec; tm.tm_isdst = tm0.tm_isdst; Start = mktime (&tm); if (Start == (time_t) -1) goto fail; } /* The only "output" of this if-block is an updated Start value, so this block must follow others that clobber Start. */ if (pc.zones_seen) { long int delta = pc.time_zone * 60; time_t t1; #ifdef HAVE_TM_GMTOFF delta -= tm.tm_gmtoff; #else time_t t = Start; struct tm const *gmt = gmtime (&t); if (! gmt) goto fail; delta -= tm_diff (&tm, gmt); #endif t1 = Start - delta; if ((Start < t1) != (delta < 0)) goto fail; /* time_t overflow */ Start = t1; } /* Add relative hours, minutes, and seconds. On hosts that support leap seconds, ignore the possibility of leap seconds; e.g., "+ 10 minutes" adds 600 seconds, even if one of them is a leap second. Typically this is not what the user wants, but it's too hard to do it the other way, because the time zone indicator must be applied before relative times, and if mktime is applied again the time zone will be lost. */ { long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns; long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION; time_t t0 = Start; long int d1 = 60 * 60 * pc.rel.hour; time_t t1 = t0 + d1; long int d2 = 60 * pc.rel.minutes; time_t t2 = t1 + d2; long_time_t d3 = pc.rel.seconds; long_time_t t3 = t2 + d3; long int d4 = (sum_ns - normalized_ns) / BILLION; long_time_t t4 = t3 + d4; time_t t5 = t4; if ((d1 / (60 * 60) ^ pc.rel.hour) | (d2 / 60 ^ pc.rel.minutes) | ((t1 < t0) ^ (d1 < 0)) | ((t2 < t1) ^ (d2 < 0)) | ((t3 < t2) ^ (d3 < 0)) | ((t4 < t3) ^ (d4 < 0)) | (t5 != t4)) goto fail; result->tv_sec = t5; result->tv_nsec = normalized_ns; } } goto done; fail: ok = false; done: if (tz_was_altered) ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0; if (tz0 != tz0buf) free (tz0); return ok; } #if TEST int main (int ac, char **av) { char buff[BUFSIZ]; printf ("Enter date, or blank line to exit.\n\t> "); fflush (stdout); buff[BUFSIZ - 1] = '\0'; while (fgets (buff, BUFSIZ - 1, stdin) && buff[0]) { struct timespec d; struct tm const *tm; if (! parse_datetime (&d, buff, NULL)) printf ("Bad format - couldn't convert.\n"); else if (! (tm = localtime (&d.tv_sec))) { long int sec = d.tv_sec; printf ("localtime (%ld) failed\n", sec); } else { int ns = d.tv_nsec; printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n", tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, ns); } printf ("\t> "); fflush (stdout); } return 0; } #endif /* TEST */ shishi-1.0.2/gl/crc.h0000644000000000000000000000364712126660051011223 00000000000000/* crc.h -- cyclic redundancy checks Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Simon Josefsson. */ #ifndef CRC_H # define CRC_H 1 #include #include /* Compute CRC-32 value of LEN bytes long BUF, and return it. */ extern uint32_t crc32 (const char *buf, size_t len); /* Incrementally update CRC-32 value CRC using LEN bytes long BUF. In the first call, use 0 as the value for CRC. Return the updated CRC-32 value. */ extern uint32_t crc32_update (uint32_t crc, const char *buf, size_t len); /* Compute modified-CRC-32 value of LEN bytes long BUF, and return it. The "modification" is to avoid the initial and final XOR operation. Due to historic implementation errors, this variant is sometimes used (i.e., in RFC 3961). */ extern uint32_t crc32_no_xor (const char *buf, size_t len); /* Incrementally update modified-CRC-32 value CRC using LEN bytes long BUF. In the first call, use 0 as the value for CRC. Return the updated modified-CRC-32 value. The "modification" is to avoid the initial and final XOR operation. Due to historic implementation errors, this variant is sometimes used (i.e., in RFC 3961). */ extern uint32_t crc32_update_no_xor (uint32_t crc, const char *buf, size_t len); #endif /* CRC_H */ shishi-1.0.2/gl/unistd.c0000644000000000000000000000012412126660051011740 00000000000000#include #define _GL_UNISTD_INLINE _GL_EXTERN_INLINE #include "unistd.h" shishi-1.0.2/gl/select.c0000644000000000000000000003600712126660053011724 00000000000000/* Emulation for select(2) Contributed by Paolo Bonzini. Copyright 2008-2013 Free Software Foundation, Inc. This file is part of gnulib. 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, 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 . */ #include #include #include #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Native Windows. */ #include #include #include #include #include #include #include #include #include /* Get the overridden 'struct timeval'. */ #include #include "msvc-nothrow.h" #undef select struct bitset { unsigned char in[FD_SETSIZE / CHAR_BIT]; unsigned char out[FD_SETSIZE / CHAR_BIT]; }; /* Declare data structures for ntdll functions. */ typedef struct _FILE_PIPE_LOCAL_INFORMATION { ULONG NamedPipeType; ULONG NamedPipeConfiguration; ULONG MaximumInstances; ULONG CurrentInstances; ULONG InboundQuota; ULONG ReadDataAvailable; ULONG OutboundQuota; ULONG WriteQuotaAvailable; ULONG NamedPipeState; ULONG NamedPipeEnd; } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; typedef struct _IO_STATUS_BLOCK { union { DWORD Status; PVOID Pointer; } u; ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; typedef enum _FILE_INFORMATION_CLASS { FilePipeLocalInformation = 24 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef DWORD (WINAPI *PNtQueryInformationFile) (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS); #ifndef PIPE_BUF #define PIPE_BUF 512 #endif /* Optimized test whether a HANDLE refers to a console. See . */ #define IsConsoleHandle(h) (((intptr_t) (h) & 3) == 3) static BOOL IsSocketHandle (HANDLE h) { WSANETWORKEVENTS ev; if (IsConsoleHandle (h)) return FALSE; /* Under Wine, it seems that getsockopt returns 0 for pipes too. WSAEnumNetworkEvents instead distinguishes the two correctly. */ ev.lNetworkEvents = 0xDEADBEEF; WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev); return ev.lNetworkEvents != 0xDEADBEEF; } /* Compute output fd_sets for libc descriptor FD (whose Windows handle is H). */ static int windows_poll_handle (HANDLE h, int fd, struct bitset *rbits, struct bitset *wbits, struct bitset *xbits) { BOOL read, write, except; int i, ret; INPUT_RECORD *irbuffer; DWORD avail, nbuffer; BOOL bRet; IO_STATUS_BLOCK iosb; FILE_PIPE_LOCAL_INFORMATION fpli; static PNtQueryInformationFile NtQueryInformationFile; static BOOL once_only; read = write = except = FALSE; switch (GetFileType (h)) { case FILE_TYPE_DISK: read = TRUE; write = TRUE; break; case FILE_TYPE_PIPE: if (!once_only) { NtQueryInformationFile = (PNtQueryInformationFile) GetProcAddress (GetModuleHandle ("ntdll.dll"), "NtQueryInformationFile"); once_only = TRUE; } if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0) { if (avail) read = TRUE; } else if (GetLastError () == ERROR_BROKEN_PIPE) ; else { /* It was the write-end of the pipe. Check if it is writable. If NtQueryInformationFile fails, optimistically assume the pipe is writable. This could happen on Windows 9x, where NtQueryInformationFile is not available, or if we inherit a pipe that doesn't permit FILE_READ_ATTRIBUTES access on the write end (I think this should not happen since Windows XP SP2; WINE seems fine too). Otherwise, ensure that enough space is available for atomic writes. */ memset (&iosb, 0, sizeof (iosb)); memset (&fpli, 0, sizeof (fpli)); if (!NtQueryInformationFile || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli), FilePipeLocalInformation) || fpli.WriteQuotaAvailable >= PIPE_BUF || (fpli.OutboundQuota < PIPE_BUF && fpli.WriteQuotaAvailable == fpli.OutboundQuota)) write = TRUE; } break; case FILE_TYPE_CHAR: write = TRUE; if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) break; ret = WaitForSingleObject (h, 0); if (ret == WAIT_OBJECT_0) { if (!IsConsoleHandle (h)) { read = TRUE; break; } nbuffer = avail = 0; bRet = GetNumberOfConsoleInputEvents (h, &nbuffer); /* Screen buffers handles are filtered earlier. */ assert (bRet); if (nbuffer == 0) { except = TRUE; break; } irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD)); bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail); if (!bRet || avail == 0) { except = TRUE; break; } for (i = 0; i < avail; i++) if (irbuffer[i].EventType == KEY_EVENT) read = TRUE; } break; default: ret = WaitForSingleObject (h, 0); write = TRUE; if (ret == WAIT_OBJECT_0) read = TRUE; break; } ret = 0; if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1))))) { xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1))); ret++; } return ret; } int rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, struct timeval *timeout) #undef timeval { static struct timeval tv0; static HANDLE hEvent; HANDLE h, handle_array[FD_SETSIZE + 2]; fd_set handle_rfds, handle_wfds, handle_xfds; struct bitset rbits, wbits, xbits; unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT]; DWORD ret, wait_timeout, nhandles, nsock, nbuffer; MSG msg; int i, fd, rc; if (nfds > FD_SETSIZE) nfds = FD_SETSIZE; if (!timeout) wait_timeout = INFINITE; else { wait_timeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; /* select is also used as a portable usleep. */ if (!rfds && !wfds && !xfds) { Sleep (wait_timeout); return 0; } } if (!hEvent) hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); handle_array[0] = hEvent; nhandles = 1; nsock = 0; /* Copy descriptors to bitsets. At the same time, eliminate bits in the "wrong" direction for console input buffers and screen buffers, because screen buffers are waitable and they will block until a character is available. */ memset (&rbits, 0, sizeof (rbits)); memset (&wbits, 0, sizeof (wbits)); memset (&xbits, 0, sizeof (xbits)); memset (anyfds_in, 0, sizeof (anyfds_in)); if (rfds) for (i = 0; i < rfds->fd_count; i++) { fd = rfds->fd_array[i]; h = (HANDLE) _get_osfhandle (fd); if (IsConsoleHandle (h) && !GetNumberOfConsoleInputEvents (h, &nbuffer)) continue; rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else rfds = (fd_set *) alloca (sizeof (fd_set)); if (wfds) for (i = 0; i < wfds->fd_count; i++) { fd = wfds->fd_array[i]; h = (HANDLE) _get_osfhandle (fd); if (IsConsoleHandle (h) && GetNumberOfConsoleInputEvents (h, &nbuffer)) continue; wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else wfds = (fd_set *) alloca (sizeof (fd_set)); if (xfds) for (i = 0; i < xfds->fd_count; i++) { fd = xfds->fd_array[i]; xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1)); } else xfds = (fd_set *) alloca (sizeof (fd_set)); /* Zero all the fd_sets, including the application's. */ FD_ZERO (rfds); FD_ZERO (wfds); FD_ZERO (xfds); FD_ZERO (&handle_rfds); FD_ZERO (&handle_wfds); FD_ZERO (&handle_xfds); /* Classify handles. Create fd sets for sockets, poll the others. */ for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (!h) { errno = EBADF; return -1; } if (IsSocketHandle (h)) { int requested = FD_CLOSE; /* See above; socket handles are mapped onto select, but we need to map descriptors to handles. */ if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_READ | FD_ACCEPT; FD_SET ((SOCKET) h, rfds); FD_SET ((SOCKET) h, &handle_rfds); } if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_WRITE | FD_CONNECT; FD_SET ((SOCKET) h, wfds); FD_SET ((SOCKET) h, &handle_wfds); } if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) { requested |= FD_OOB; FD_SET ((SOCKET) h, xfds); FD_SET ((SOCKET) h, &handle_xfds); } WSAEventSelect ((SOCKET) h, hEvent, requested); nsock++; } else { handle_array[nhandles++] = h; /* Poll now. If we get an event, do not wait below. */ if (wait_timeout != 0 && windows_poll_handle (h, i, &rbits, &wbits, &xbits)) wait_timeout = 0; } } /* Place a sentinel at the end of the array. */ handle_array[nhandles] = NULL; restart: if (wait_timeout == 0 || nsock == 0) rc = 0; else { /* See if we need to wait in the loop below. If any select is ready, do MsgWaitForMultipleObjects anyway to dispatch messages, but no need to call select again. */ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0); if (rc == 0) { /* Restore the fd_sets for the other select we do below. */ memcpy (&handle_rfds, rfds, sizeof (fd_set)); memcpy (&handle_wfds, wfds, sizeof (fd_set)); memcpy (&handle_xfds, xfds, sizeof (fd_set)); } else wait_timeout = 0; } for (;;) { ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE, wait_timeout, QS_ALLINPUT); if (ret == WAIT_OBJECT_0 + nhandles) { /* new input of some other kind */ BOOL bRet; while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0) { TranslateMessage (&msg); DispatchMessage (&msg); } } else break; } /* If we haven't done it yet, check the status of the sockets. */ if (rc == 0 && nsock > 0) rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0); if (nhandles > 1) { /* Count results that are not counted in the return value of select. */ nhandles = 1; for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (h == handle_array[nhandles]) { /* Not a socket. */ nhandles++; windows_poll_handle (h, i, &rbits, &wbits, &xbits); if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))) || wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))) || xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) rc++; } } if (rc == 0 && wait_timeout == INFINITE) { /* Sleep 1 millisecond to avoid busy wait and retry with the original fd_sets. */ memcpy (&handle_rfds, rfds, sizeof (fd_set)); memcpy (&handle_wfds, wfds, sizeof (fd_set)); memcpy (&handle_xfds, xfds, sizeof (fd_set)); SleepEx (1, TRUE); goto restart; } } /* Now fill in the results. */ FD_ZERO (rfds); FD_ZERO (wfds); FD_ZERO (xfds); nhandles = 1; for (i = 0; i < nfds; i++) { if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0) continue; h = (HANDLE) _get_osfhandle (i); if (h != handle_array[nhandles]) { /* Perform handle->descriptor mapping. */ WSAEventSelect ((SOCKET) h, NULL, 0); if (FD_ISSET (h, &handle_rfds)) FD_SET (i, rfds); if (FD_ISSET (h, &handle_wfds)) FD_SET (i, wfds); if (FD_ISSET (h, &handle_xfds)) FD_SET (i, xfds); } else { /* Not a socket. */ nhandles++; if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, rfds); if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, wfds); if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) FD_SET (i, xfds); } } return rc; } #else /* ! Native Windows. */ #include #include /* NULL */ #include #include #undef select int rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, struct timeval *timeout) { int i; /* FreeBSD 8.2 has a bug: it does not always detect invalid fds. */ if (nfds < 0 || nfds > FD_SETSIZE) { errno = EINVAL; return -1; } for (i = 0; i < nfds; i++) { if (((rfds && FD_ISSET (i, rfds)) || (wfds && FD_ISSET (i, wfds)) || (xfds && FD_ISSET (i, xfds))) && dup2 (i, i) != i) return -1; } /* Interix 3.5 has a bug: it does not support nfds == 0. */ if (nfds == 0) { nfds = 1; rfds = NULL; wfds = NULL; xfds = NULL; } return select (nfds, rfds, wfds, xfds, timeout); } #endif shishi-1.0.2/gl/base64.c0000644000000000000000000004550012126660051011525 00000000000000/* base64.c -- Encode binary data using printable characters. Copyright (C) 1999-2001, 2004-2006, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. Partially adapted from GNU MailUtils * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review * from Paul Eggert, Bruno Haible, and Stepan Kasal. * * See also RFC 4648 . * * Be careful with error checking. Here is how you would typically * use these functions: * * bool ok = base64_decode_alloc (in, inlen, &out, &outlen); * if (!ok) * FAIL: input was not valid base64 * if (out == NULL) * FAIL: memory allocation error * OK: data in OUT/OUTLEN * * size_t outlen = base64_encode_alloc (in, inlen, &out); * if (out == NULL && outlen == 0 && inlen != 0) * FAIL: input too long * if (out == NULL) * FAIL: memory allocation error * OK: data in OUT/OUTLEN. * */ #include /* Get prototype. */ #include "base64.h" /* Get malloc. */ #include /* Get UCHAR_MAX. */ #include #include /* C89 compliant way to cast 'char' to 'unsigned char'. */ static unsigned char to_uchar (char ch) { return ch; } /* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero terminate the output buffer. */ void base64_encode (const char *restrict in, size_t inlen, char *restrict out, size_t outlen) { static const char b64str[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while (inlen && outlen) { *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; if (!--outlen) break; *out++ = b64str[((to_uchar (in[0]) << 4) + (--inlen ? to_uchar (in[1]) >> 4 : 0)) & 0x3f]; if (!--outlen) break; *out++ = (inlen ? b64str[((to_uchar (in[1]) << 2) + (--inlen ? to_uchar (in[2]) >> 6 : 0)) & 0x3f] : '='); if (!--outlen) break; *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; if (!--outlen) break; if (inlen) inlen--; if (inlen) in += 3; } if (outlen) *out = '\0'; } /* Allocate a buffer and store zero terminated base64 encoded data from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e., the length of the encoded data, excluding the terminating zero. On return, the OUT variable will hold a pointer to newly allocated memory that must be deallocated by the caller. If output string length would overflow, 0 is returned and OUT is set to NULL. If memory allocation failed, OUT is set to NULL, and the return value indicates length of the requested memory block, i.e., BASE64_LENGTH(inlen) + 1. */ size_t base64_encode_alloc (const char *in, size_t inlen, char **out) { size_t outlen = 1 + BASE64_LENGTH (inlen); /* Check for overflow in outlen computation. * * If there is no overflow, outlen >= inlen. * * If the operation (inlen + 2) overflows then it yields at most +1, so * outlen is 0. * * If the multiplication overflows, we lose at least half of the * correct value, so the result is < ((inlen + 2) / 3) * 2, which is * less than (inlen + 2) * 0.66667, which is less than inlen as soon as * (inlen > 4). */ if (inlen > outlen) { *out = NULL; return 0; } *out = malloc (outlen); if (!*out) return outlen; base64_encode (in, inlen, *out, outlen); return outlen - 1; } /* With this approach this file works independent of the charset used (think EBCDIC). However, it does assume that the characters in the Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX 1003.1-2001 require that char and unsigned char are 8-bit quantities, though, taking care of that problem. But this may be a potential problem on non-POSIX C99 platforms. IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" as the formal parameter rather than "x". */ #define B64(_) \ ((_) == 'A' ? 0 \ : (_) == 'B' ? 1 \ : (_) == 'C' ? 2 \ : (_) == 'D' ? 3 \ : (_) == 'E' ? 4 \ : (_) == 'F' ? 5 \ : (_) == 'G' ? 6 \ : (_) == 'H' ? 7 \ : (_) == 'I' ? 8 \ : (_) == 'J' ? 9 \ : (_) == 'K' ? 10 \ : (_) == 'L' ? 11 \ : (_) == 'M' ? 12 \ : (_) == 'N' ? 13 \ : (_) == 'O' ? 14 \ : (_) == 'P' ? 15 \ : (_) == 'Q' ? 16 \ : (_) == 'R' ? 17 \ : (_) == 'S' ? 18 \ : (_) == 'T' ? 19 \ : (_) == 'U' ? 20 \ : (_) == 'V' ? 21 \ : (_) == 'W' ? 22 \ : (_) == 'X' ? 23 \ : (_) == 'Y' ? 24 \ : (_) == 'Z' ? 25 \ : (_) == 'a' ? 26 \ : (_) == 'b' ? 27 \ : (_) == 'c' ? 28 \ : (_) == 'd' ? 29 \ : (_) == 'e' ? 30 \ : (_) == 'f' ? 31 \ : (_) == 'g' ? 32 \ : (_) == 'h' ? 33 \ : (_) == 'i' ? 34 \ : (_) == 'j' ? 35 \ : (_) == 'k' ? 36 \ : (_) == 'l' ? 37 \ : (_) == 'm' ? 38 \ : (_) == 'n' ? 39 \ : (_) == 'o' ? 40 \ : (_) == 'p' ? 41 \ : (_) == 'q' ? 42 \ : (_) == 'r' ? 43 \ : (_) == 's' ? 44 \ : (_) == 't' ? 45 \ : (_) == 'u' ? 46 \ : (_) == 'v' ? 47 \ : (_) == 'w' ? 48 \ : (_) == 'x' ? 49 \ : (_) == 'y' ? 50 \ : (_) == 'z' ? 51 \ : (_) == '0' ? 52 \ : (_) == '1' ? 53 \ : (_) == '2' ? 54 \ : (_) == '3' ? 55 \ : (_) == '4' ? 56 \ : (_) == '5' ? 57 \ : (_) == '6' ? 58 \ : (_) == '7' ? 59 \ : (_) == '8' ? 60 \ : (_) == '9' ? 61 \ : (_) == '+' ? 62 \ : (_) == '/' ? 63 \ : -1) static const signed char b64[0x100] = { B64 (0), B64 (1), B64 (2), B64 (3), B64 (4), B64 (5), B64 (6), B64 (7), B64 (8), B64 (9), B64 (10), B64 (11), B64 (12), B64 (13), B64 (14), B64 (15), B64 (16), B64 (17), B64 (18), B64 (19), B64 (20), B64 (21), B64 (22), B64 (23), B64 (24), B64 (25), B64 (26), B64 (27), B64 (28), B64 (29), B64 (30), B64 (31), B64 (32), B64 (33), B64 (34), B64 (35), B64 (36), B64 (37), B64 (38), B64 (39), B64 (40), B64 (41), B64 (42), B64 (43), B64 (44), B64 (45), B64 (46), B64 (47), B64 (48), B64 (49), B64 (50), B64 (51), B64 (52), B64 (53), B64 (54), B64 (55), B64 (56), B64 (57), B64 (58), B64 (59), B64 (60), B64 (61), B64 (62), B64 (63), B64 (64), B64 (65), B64 (66), B64 (67), B64 (68), B64 (69), B64 (70), B64 (71), B64 (72), B64 (73), B64 (74), B64 (75), B64 (76), B64 (77), B64 (78), B64 (79), B64 (80), B64 (81), B64 (82), B64 (83), B64 (84), B64 (85), B64 (86), B64 (87), B64 (88), B64 (89), B64 (90), B64 (91), B64 (92), B64 (93), B64 (94), B64 (95), B64 (96), B64 (97), B64 (98), B64 (99), B64 (100), B64 (101), B64 (102), B64 (103), B64 (104), B64 (105), B64 (106), B64 (107), B64 (108), B64 (109), B64 (110), B64 (111), B64 (112), B64 (113), B64 (114), B64 (115), B64 (116), B64 (117), B64 (118), B64 (119), B64 (120), B64 (121), B64 (122), B64 (123), B64 (124), B64 (125), B64 (126), B64 (127), B64 (128), B64 (129), B64 (130), B64 (131), B64 (132), B64 (133), B64 (134), B64 (135), B64 (136), B64 (137), B64 (138), B64 (139), B64 (140), B64 (141), B64 (142), B64 (143), B64 (144), B64 (145), B64 (146), B64 (147), B64 (148), B64 (149), B64 (150), B64 (151), B64 (152), B64 (153), B64 (154), B64 (155), B64 (156), B64 (157), B64 (158), B64 (159), B64 (160), B64 (161), B64 (162), B64 (163), B64 (164), B64 (165), B64 (166), B64 (167), B64 (168), B64 (169), B64 (170), B64 (171), B64 (172), B64 (173), B64 (174), B64 (175), B64 (176), B64 (177), B64 (178), B64 (179), B64 (180), B64 (181), B64 (182), B64 (183), B64 (184), B64 (185), B64 (186), B64 (187), B64 (188), B64 (189), B64 (190), B64 (191), B64 (192), B64 (193), B64 (194), B64 (195), B64 (196), B64 (197), B64 (198), B64 (199), B64 (200), B64 (201), B64 (202), B64 (203), B64 (204), B64 (205), B64 (206), B64 (207), B64 (208), B64 (209), B64 (210), B64 (211), B64 (212), B64 (213), B64 (214), B64 (215), B64 (216), B64 (217), B64 (218), B64 (219), B64 (220), B64 (221), B64 (222), B64 (223), B64 (224), B64 (225), B64 (226), B64 (227), B64 (228), B64 (229), B64 (230), B64 (231), B64 (232), B64 (233), B64 (234), B64 (235), B64 (236), B64 (237), B64 (238), B64 (239), B64 (240), B64 (241), B64 (242), B64 (243), B64 (244), B64 (245), B64 (246), B64 (247), B64 (248), B64 (249), B64 (250), B64 (251), B64 (252), B64 (253), B64 (254), B64 (255) }; #if UCHAR_MAX == 255 # define uchar_in_range(c) true #else # define uchar_in_range(c) ((c) <= 255) #endif /* Return true if CH is a character from the Base64 alphabet, and false otherwise. Note that '=' is padding and not considered to be part of the alphabet. */ bool isbase64 (char ch) { return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; } /* Initialize decode-context buffer, CTX. */ void base64_decode_ctx_init (struct base64_decode_context *ctx) { ctx->i = 0; } /* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and none of those four is a newline, then return *IN. Otherwise, copy up to 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at index CTX->i and setting CTX->i to reflect the number of bytes copied, and return CTX->buf. In either case, advance *IN to point to the byte after the last one processed, and set *N_NON_NEWLINE to the number of verified non-newline bytes accessible through the returned pointer. */ static char * get_4 (struct base64_decode_context *ctx, char const *restrict *in, char const *restrict in_end, size_t *n_non_newline) { if (ctx->i == 4) ctx->i = 0; if (ctx->i == 0) { char const *t = *in; if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) { /* This is the common case: no newline. */ *in += 4; *n_non_newline = 4; return (char *) t; } } { /* Copy non-newline bytes into BUF. */ char const *p = *in; while (p < in_end) { char c = *p++; if (c != '\n') { ctx->buf[ctx->i++] = c; if (ctx->i == 4) break; } } *in = p; *n_non_newline = ctx->i; return ctx->buf; } } #define return_false \ do \ { \ *outp = out; \ return false; \ } \ while (false) /* Decode up to four bytes of base64-encoded data, IN, of length INLEN into the output buffer, *OUT, of size *OUTLEN bytes. Return true if decoding is successful, false otherwise. If *OUTLEN is too small, as many bytes as possible are written to *OUT. On return, advance *OUT to point to the byte after the last one written, and decrement *OUTLEN to reflect the number of bytes remaining in *OUT. */ static bool decode_4 (char const *restrict in, size_t inlen, char *restrict *outp, size_t *outleft) { char *out = *outp; if (inlen < 2) return false; if (!isbase64 (in[0]) || !isbase64 (in[1])) return false; if (*outleft) { *out++ = ((b64[to_uchar (in[0])] << 2) | (b64[to_uchar (in[1])] >> 4)); --*outleft; } if (inlen == 2) return_false; if (in[2] == '=') { if (inlen != 4) return_false; if (in[3] != '=') return_false; } else { if (!isbase64 (in[2])) return_false; if (*outleft) { *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) | (b64[to_uchar (in[2])] >> 2)); --*outleft; } if (inlen == 3) return_false; if (in[3] == '=') { if (inlen != 4) return_false; } else { if (!isbase64 (in[3])) return_false; if (*outleft) { *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) | b64[to_uchar (in[3])]); --*outleft; } } } *outp = out; return true; } /* Decode base64-encoded input array IN of length INLEN to output array OUT that can hold *OUTLEN bytes. The input data may be interspersed with newlines. Return true if decoding was successful, i.e. if the input was valid base64 data, false otherwise. If *OUTLEN is too small, as many bytes as possible will be written to OUT. On return, *OUTLEN holds the length of decoded bytes in OUT. Note that as soon as any non-alphabet, non-newline character is encountered, decoding is stopped and false is returned. If INLEN is zero, then process only whatever data is stored in CTX. Initially, CTX must have been initialized via base64_decode_ctx_init. Subsequent calls to this function must reuse whatever state is recorded in that buffer. It is necessary for when a quadruple of base64 input bytes spans two input buffers. If CTX is NULL then newlines are treated as garbage and the input buffer is processed as a unit. */ bool base64_decode_ctx (struct base64_decode_context *ctx, const char *restrict in, size_t inlen, char *restrict out, size_t *outlen) { size_t outleft = *outlen; bool ignore_newlines = ctx != NULL; bool flush_ctx = false; unsigned int ctx_i = 0; if (ignore_newlines) { ctx_i = ctx->i; flush_ctx = inlen == 0; } while (true) { size_t outleft_save = outleft; if (ctx_i == 0 && !flush_ctx) { while (true) { /* Save a copy of outleft, in case we need to re-parse this block of four bytes. */ outleft_save = outleft; if (!decode_4 (in, inlen, &out, &outleft)) break; in += 4; inlen -= 4; } } if (inlen == 0 && !flush_ctx) break; /* Handle the common case of 72-byte wrapped lines. This also handles any other multiple-of-4-byte wrapping. */ if (inlen && *in == '\n' && ignore_newlines) { ++in; --inlen; continue; } /* Restore OUT and OUTLEFT. */ out -= outleft_save - outleft; outleft = outleft_save; { char const *in_end = in + inlen; char const *non_nl; if (ignore_newlines) non_nl = get_4 (ctx, &in, in_end, &inlen); else non_nl = in; /* Might have nl in this case. */ /* If the input is empty or consists solely of newlines (0 non-newlines), then we're done. Likewise if there are fewer than 4 bytes when not flushing context and not treating newlines as garbage. */ if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) { inlen = 0; break; } if (!decode_4 (non_nl, inlen, &out, &outleft)) break; inlen = in_end - in; } } *outlen -= outleft; return inlen == 0; } /* Allocate an output buffer in *OUT, and decode the base64 encoded data stored in IN of size INLEN to the *OUT buffer. On return, the size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL, if the caller is not interested in the decoded length. *OUT may be NULL to indicate an out of memory error, in which case *OUTLEN contains the size of the memory block needed. The function returns true on successful decoding and memory allocation errors. (Use the *OUT and *OUTLEN parameters to differentiate between successful decoding and memory error.) The function returns false if the input was invalid, in which case *OUT is NULL and *OUTLEN is undefined. */ bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, const char *in, size_t inlen, char **out, size_t *outlen) { /* This may allocate a few bytes too many, depending on input, but it's not worth the extra CPU time to compute the exact size. The exact size is 3 * (inlen + (ctx ? ctx->i : 0)) / 4, minus 1 if the input ends with "=" and minus another 1 if the input ends with "==". Dividing before multiplying avoids the possibility of overflow. */ size_t needlen = 3 * (inlen / 4) + 3; *out = malloc (needlen); if (!*out) return true; if (!base64_decode_ctx (ctx, in, inlen, *out, &needlen)) { free (*out); *out = NULL; return false; } if (outlen) *outlen = needlen; return true; } shishi-1.0.2/gl/arpa_inet.in.h0000644000000000000000000001143312126660051013013 00000000000000/* A GNU-like . Copyright (C) 2005-2006, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_ARPA_INET_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if @HAVE_FEATURES_H@ # include /* for __GLIBC__ */ #endif /* Gnulib's sys/socket.h is responsible for defining socklen_t (used below) and for pulling in winsock2.h etc. under MinGW. But avoid namespace pollution on glibc systems. */ #ifndef __GLIBC__ # include #endif /* On NonStop Kernel, inet_ntop and inet_pton are declared in . But avoid namespace pollution on glibc systems. */ #if defined __TANDEM && !defined __GLIBC__ # include #endif #if @HAVE_ARPA_INET_H@ /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@ #endif #ifndef _@GUARD_PREFIX@_ARPA_INET_H #define _@GUARD_PREFIX@_ARPA_INET_H /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ #if @GNULIB_INET_NTOP@ /* Converts an internet address from internal format to a printable, presentable format. AF is an internet address family, such as AF_INET or AF_INET6. SRC points to a 'struct in_addr' (for AF_INET) or 'struct in6_addr' (for AF_INET6). DST points to a buffer having room for CNT bytes. The printable representation of the address (in numeric form, not surrounded by [...], no reverse DNS is done) is placed in DST, and DST is returned. If an error occurs, the return value is NULL and errno is set. If CNT bytes are not sufficient to hold the result, the return value is NULL and errno is set to ENOSPC. A good value for CNT is 46. For more details, see the POSIX:2001 specification . */ # if @REPLACE_INET_NTOP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef inet_ntop # define inet_ntop rpl_inet_ntop # endif _GL_FUNCDECL_RPL (inet_ntop, const char *, (int af, const void *restrict src, char *restrict dst, socklen_t cnt) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (inet_ntop, const char *, (int af, const void *restrict src, char *restrict dst, socklen_t cnt)); # else # if !@HAVE_DECL_INET_NTOP@ _GL_FUNCDECL_SYS (inet_ntop, const char *, (int af, const void *restrict src, char *restrict dst, socklen_t cnt) _GL_ARG_NONNULL ((2, 3))); # endif /* Need to cast, because on NonStop Kernel, the fourth parameter is size_t cnt. */ _GL_CXXALIAS_SYS_CAST (inet_ntop, const char *, (int af, const void *restrict src, char *restrict dst, socklen_t cnt)); # endif _GL_CXXALIASWARN (inet_ntop); #elif defined GNULIB_POSIXCHECK # undef inet_ntop # if HAVE_RAW_DECL_INET_NTOP _GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - " "use gnulib module inet_ntop for portability"); # endif #endif #if @GNULIB_INET_PTON@ # if @REPLACE_INET_PTON@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef inet_pton # define inet_pton rpl_inet_pton # endif _GL_FUNCDECL_RPL (inet_pton, int, (int af, const char *restrict src, void *restrict dst) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (inet_pton, int, (int af, const char *restrict src, void *restrict dst)); # else # if !@HAVE_DECL_INET_PTON@ _GL_FUNCDECL_SYS (inet_pton, int, (int af, const char *restrict src, void *restrict dst) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (inet_pton, int, (int af, const char *restrict src, void *restrict dst)); # endif _GL_CXXALIASWARN (inet_pton); #elif defined GNULIB_POSIXCHECK # undef inet_pton # if HAVE_RAW_DECL_INET_PTON _GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - " "use gnulib module inet_pton for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_ARPA_INET_H */ #endif /* _@GUARD_PREFIX@_ARPA_INET_H */ shishi-1.0.2/gl/fseek.c0000644000000000000000000000203512126660051011532 00000000000000/* An fseek() function that, together with fflush(), is POSIX compliant. Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include /* Get off_t. */ #include int fseek (FILE *fp, long offset, int whence) { /* Use the replacement fseeko function with all its workarounds. */ return fseeko (fp, (off_t)offset, whence); } shishi-1.0.2/gl/msvc-nothrow.c0000644000000000000000000000243412126660053013110 00000000000000/* Wrappers that don't throw invalid parameter notifications with MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include "msvc-nothrow.h" /* Get declarations of the native Windows API functions. */ #define WIN32_LEAN_AND_MEAN #include #include "msvc-inval.h" #undef _get_osfhandle #if HAVE_MSVC_INVALID_PARAMETER_HANDLER intptr_t _gl_nothrow_get_osfhandle (int fd) { intptr_t result; TRY_MSVC_INVAL { result = _get_osfhandle (fd); } CATCH_MSVC_INVAL { result = (intptr_t) INVALID_HANDLE_VALUE; } DONE_MSVC_INVAL; return result; } #endif shishi-1.0.2/gl/gc-gnulib.c0000644000000000000000000004225712126660051012316 00000000000000/* gc-gnulib.c --- Common gnulib internal crypto interface functions * Copyright (C) 2002-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Note: This file is only built if GC uses internal functions. */ #include /* Get prototype. */ #include "gc.h" #include #include /* For randomize. */ #ifdef GNULIB_GC_RANDOM # include # include # include # include # include #endif /* Hashes. */ #ifdef GNULIB_GC_MD2 # include "md2.h" #endif #ifdef GNULIB_GC_MD4 # include "md4.h" #endif #ifdef GNULIB_GC_MD5 # include "md5.h" #endif #ifdef GNULIB_GC_SHA1 # include "sha1.h" #endif #if defined(GNULIB_GC_HMAC_MD5) || defined(GNULIB_GC_HMAC_SHA1) # include "hmac.h" #endif /* Ciphers. */ #ifdef GNULIB_GC_ARCFOUR # include "arcfour.h" #endif #ifdef GNULIB_GC_ARCTWO # include "arctwo.h" #endif #ifdef GNULIB_GC_DES # include "des.h" #endif #ifdef GNULIB_GC_RIJNDAEL # include "rijndael-api-fst.h" #endif /* The results of open() in this file are not used with fchdir, therefore save some unnecessary work in fchdir.c. */ #undef open #undef close #ifdef GNULIB_GC_RANDOM # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # include # include HCRYPTPROV g_hProv = 0; # ifndef PROV_INTEL_SEC # define PROV_INTEL_SEC 22 # endif # ifndef CRYPT_VERIFY_CONTEXT # define CRYPT_VERIFY_CONTEXT 0xF0000000 # endif # endif #endif Gc_rc gc_init (void) { #ifdef GNULIB_GC_RANDOM # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (g_hProv) CryptReleaseContext (g_hProv, 0); /* There is no need to create a container for just random data, so we can use CRYPT_VERIFY_CONTEXT (one call) see: http://blogs.msdn.com/dangriff/archive/2003/11/19/51709.aspx */ /* We first try to use the Intel PIII RNG if drivers are present */ if (!CryptAcquireContext (&g_hProv, NULL, NULL, PROV_INTEL_SEC, CRYPT_VERIFY_CONTEXT)) { /* not a PIII or no drivers available, use default RSA CSP */ if (!CryptAcquireContext (&g_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT)) return GC_RANDOM_ERROR; } # endif #endif return GC_OK; } void gc_done (void) { #ifdef GNULIB_GC_RANDOM # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (g_hProv) { CryptReleaseContext (g_hProv, 0); g_hProv = 0; } # endif #endif return; } #ifdef GNULIB_GC_RANDOM /* Randomness. */ static Gc_rc randomize (int level, char *data, size_t datalen) { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (!g_hProv) return GC_RANDOM_ERROR; CryptGenRandom (g_hProv, (DWORD) datalen, data); #else int fd; const char *device; size_t len = 0; int rc; switch (level) { case 0: device = NAME_OF_NONCE_DEVICE; break; case 1: device = NAME_OF_PSEUDO_RANDOM_DEVICE; break; default: device = NAME_OF_RANDOM_DEVICE; break; } if (strcmp (device, "no") == 0) return GC_RANDOM_ERROR; fd = open (device, O_RDONLY); if (fd < 0) return GC_RANDOM_ERROR; do { ssize_t tmp; tmp = read (fd, data, datalen); if (tmp < 0) { int save_errno = errno; close (fd); errno = save_errno; return GC_RANDOM_ERROR; } len += tmp; } while (len < datalen); rc = close (fd); if (rc < 0) return GC_RANDOM_ERROR; #endif return GC_OK; } Gc_rc gc_nonce (char *data, size_t datalen) { return randomize (0, data, datalen); } Gc_rc gc_pseudo_random (char *data, size_t datalen) { return randomize (1, data, datalen); } Gc_rc gc_random (char *data, size_t datalen) { return randomize (2, data, datalen); } #endif /* Memory allocation. */ void gc_set_allocators (gc_malloc_t func_malloc, gc_malloc_t secure_malloc, gc_secure_check_t secure_check, gc_realloc_t func_realloc, gc_free_t func_free) { return; } /* Ciphers. */ typedef struct _gc_cipher_ctx { Gc_cipher alg; Gc_cipher_mode mode; #ifdef GNULIB_GC_ARCTWO arctwo_context arctwoContext; char arctwoIV[ARCTWO_BLOCK_SIZE]; #endif #ifdef GNULIB_GC_ARCFOUR arcfour_context arcfourContext; #endif #ifdef GNULIB_GC_DES gl_des_ctx desContext; #endif #ifdef GNULIB_GC_RIJNDAEL rijndaelKeyInstance aesEncKey; rijndaelKeyInstance aesDecKey; rijndaelCipherInstance aesContext; #endif } _gc_cipher_ctx; Gc_rc gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode, gc_cipher_handle * outhandle) { _gc_cipher_ctx *ctx; Gc_rc rc = GC_OK; ctx = calloc (sizeof (*ctx), 1); if (!ctx) return GC_MALLOC_ERROR; ctx->alg = alg; ctx->mode = mode; switch (alg) { #ifdef GNULIB_GC_ARCTWO case GC_ARCTWO40: switch (mode) { case GC_ECB: case GC_CBC: break; default: rc = GC_INVALID_CIPHER; } break; #endif #ifdef GNULIB_GC_ARCFOUR case GC_ARCFOUR128: case GC_ARCFOUR40: switch (mode) { case GC_STREAM: break; default: rc = GC_INVALID_CIPHER; } break; #endif #ifdef GNULIB_GC_DES case GC_DES: switch (mode) { case GC_ECB: break; default: rc = GC_INVALID_CIPHER; } break; #endif #ifdef GNULIB_GC_RIJNDAEL case GC_AES128: case GC_AES192: case GC_AES256: switch (mode) { case GC_ECB: case GC_CBC: break; default: rc = GC_INVALID_CIPHER; } break; #endif default: rc = GC_INVALID_CIPHER; } if (rc == GC_OK) *outhandle = ctx; else free (ctx); return rc; } Gc_rc gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key) { _gc_cipher_ctx *ctx = handle; switch (ctx->alg) { #ifdef GNULIB_GC_ARCTWO case GC_ARCTWO40: arctwo_setkey (&ctx->arctwoContext, keylen, key); break; #endif #ifdef GNULIB_GC_ARCFOUR case GC_ARCFOUR128: case GC_ARCFOUR40: arcfour_setkey (&ctx->arcfourContext, key, keylen); break; #endif #ifdef GNULIB_GC_DES case GC_DES: if (keylen != 8) return GC_INVALID_CIPHER; gl_des_setkey (&ctx->desContext, key); break; #endif #ifdef GNULIB_GC_RIJNDAEL case GC_AES128: case GC_AES192: case GC_AES256: { rijndael_rc rc; size_t i; char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1]; for (i = 0; i < keylen; i++) sprintf (&keyMaterial[2 * i], "%02x", key[i] & 0xFF); rc = rijndaelMakeKey (&ctx->aesEncKey, RIJNDAEL_DIR_ENCRYPT, keylen * 8, keyMaterial); if (rc < 0) return GC_INVALID_CIPHER; rc = rijndaelMakeKey (&ctx->aesDecKey, RIJNDAEL_DIR_DECRYPT, keylen * 8, keyMaterial); if (rc < 0) return GC_INVALID_CIPHER; rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_ECB, NULL); if (rc < 0) return GC_INVALID_CIPHER; } break; #endif default: return GC_INVALID_CIPHER; } return GC_OK; } Gc_rc gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv) { _gc_cipher_ctx *ctx = handle; switch (ctx->alg) { #ifdef GNULIB_GC_ARCTWO case GC_ARCTWO40: if (ivlen != ARCTWO_BLOCK_SIZE) return GC_INVALID_CIPHER; memcpy (ctx->arctwoIV, iv, ivlen); break; #endif #ifdef GNULIB_GC_RIJNDAEL case GC_AES128: case GC_AES192: case GC_AES256: switch (ctx->mode) { case GC_ECB: /* Doesn't use IV. */ break; case GC_CBC: { rijndael_rc rc; size_t i; char ivMaterial[2 * RIJNDAEL_MAX_IV_SIZE + 1]; for (i = 0; i < ivlen; i++) sprintf (&ivMaterial[2 * i], "%02x", iv[i] & 0xFF); rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_CBC, ivMaterial); if (rc < 0) return GC_INVALID_CIPHER; } break; default: return GC_INVALID_CIPHER; } break; #endif default: return GC_INVALID_CIPHER; } return GC_OK; } Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data) { _gc_cipher_ctx *ctx = handle; switch (ctx->alg) { #ifdef GNULIB_GC_ARCTWO case GC_ARCTWO40: switch (ctx->mode) { case GC_ECB: arctwo_encrypt (&ctx->arctwoContext, data, data, len); break; case GC_CBC: for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE, data += ARCTWO_BLOCK_SIZE) { size_t i; for (i = 0; i < ARCTWO_BLOCK_SIZE; i++) data[i] ^= ctx->arctwoIV[i]; arctwo_encrypt (&ctx->arctwoContext, data, data, ARCTWO_BLOCK_SIZE); memcpy (ctx->arctwoIV, data, ARCTWO_BLOCK_SIZE); } break; default: return GC_INVALID_CIPHER; } break; #endif #ifdef GNULIB_GC_ARCFOUR case GC_ARCFOUR128: case GC_ARCFOUR40: arcfour_stream (&ctx->arcfourContext, data, data, len); break; #endif #ifdef GNULIB_GC_DES case GC_DES: for (; len >= 8; len -= 8, data += 8) gl_des_ecb_encrypt (&ctx->desContext, data, data); break; #endif #ifdef GNULIB_GC_RIJNDAEL case GC_AES128: case GC_AES192: case GC_AES256: { int nblocks; nblocks = rijndaelBlockEncrypt (&ctx->aesContext, &ctx->aesEncKey, data, 8 * len, data); if (nblocks < 0) return GC_INVALID_CIPHER; } break; #endif default: return GC_INVALID_CIPHER; } return GC_OK; } Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data) { _gc_cipher_ctx *ctx = handle; switch (ctx->alg) { #ifdef GNULIB_GC_ARCTWO case GC_ARCTWO40: switch (ctx->mode) { case GC_ECB: arctwo_decrypt (&ctx->arctwoContext, data, data, len); break; case GC_CBC: for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE, data += ARCTWO_BLOCK_SIZE) { char tmpIV[ARCTWO_BLOCK_SIZE]; size_t i; memcpy (tmpIV, data, ARCTWO_BLOCK_SIZE); arctwo_decrypt (&ctx->arctwoContext, data, data, ARCTWO_BLOCK_SIZE); for (i = 0; i < ARCTWO_BLOCK_SIZE; i++) data[i] ^= ctx->arctwoIV[i]; memcpy (ctx->arctwoIV, tmpIV, ARCTWO_BLOCK_SIZE); } break; default: return GC_INVALID_CIPHER; } break; #endif #ifdef GNULIB_GC_ARCFOUR case GC_ARCFOUR128: case GC_ARCFOUR40: arcfour_stream (&ctx->arcfourContext, data, data, len); break; #endif #ifdef GNULIB_GC_DES case GC_DES: for (; len >= 8; len -= 8, data += 8) gl_des_ecb_decrypt (&ctx->desContext, data, data); break; #endif #ifdef GNULIB_GC_RIJNDAEL case GC_AES128: case GC_AES192: case GC_AES256: { int nblocks; nblocks = rijndaelBlockDecrypt (&ctx->aesContext, &ctx->aesDecKey, data, 8 * len, data); if (nblocks < 0) return GC_INVALID_CIPHER; } break; #endif default: return GC_INVALID_CIPHER; } return GC_OK; } Gc_rc gc_cipher_close (gc_cipher_handle handle) { _gc_cipher_ctx *ctx = handle; free (ctx); return GC_OK; } /* Hashes. */ #define MAX_DIGEST_SIZE 20 typedef struct _gc_hash_ctx { Gc_hash alg; Gc_hash_mode mode; char hash[MAX_DIGEST_SIZE]; #ifdef GNULIB_GC_MD2 struct md2_ctx md2Context; #endif #ifdef GNULIB_GC_MD4 struct md4_ctx md4Context; #endif #ifdef GNULIB_GC_MD5 struct md5_ctx md5Context; #endif #ifdef GNULIB_GC_SHA1 struct sha1_ctx sha1Context; #endif } _gc_hash_ctx; Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle) { _gc_hash_ctx *ctx; Gc_rc rc = GC_OK; ctx = calloc (sizeof (*ctx), 1); if (!ctx) return GC_MALLOC_ERROR; ctx->alg = hash; ctx->mode = mode; switch (hash) { #ifdef GNULIB_GC_MD2 case GC_MD2: md2_init_ctx (&ctx->md2Context); break; #endif #ifdef GNULIB_GC_MD4 case GC_MD4: md4_init_ctx (&ctx->md4Context); break; #endif #ifdef GNULIB_GC_MD5 case GC_MD5: md5_init_ctx (&ctx->md5Context); break; #endif #ifdef GNULIB_GC_SHA1 case GC_SHA1: sha1_init_ctx (&ctx->sha1Context); break; #endif default: rc = GC_INVALID_HASH; break; } switch (mode) { case 0: break; default: rc = GC_INVALID_HASH; break; } if (rc == GC_OK) *outhandle = ctx; else free (ctx); return rc; } Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle) { _gc_hash_ctx *in = handle; _gc_hash_ctx *out; *outhandle = out = calloc (sizeof (*out), 1); if (!out) return GC_MALLOC_ERROR; memcpy (out, in, sizeof (*out)); return GC_OK; } size_t gc_hash_digest_length (Gc_hash hash) { size_t len; switch (hash) { case GC_MD2: len = GC_MD2_DIGEST_SIZE; break; case GC_MD4: len = GC_MD4_DIGEST_SIZE; break; case GC_MD5: len = GC_MD5_DIGEST_SIZE; break; case GC_RMD160: len = GC_RMD160_DIGEST_SIZE; break; case GC_SHA1: len = GC_SHA1_DIGEST_SIZE; break; default: return 0; } return len; } void gc_hash_write (gc_hash_handle handle, size_t len, const char *data) { _gc_hash_ctx *ctx = handle; switch (ctx->alg) { #ifdef GNULIB_GC_MD2 case GC_MD2: md2_process_bytes (data, len, &ctx->md2Context); break; #endif #ifdef GNULIB_GC_MD4 case GC_MD4: md4_process_bytes (data, len, &ctx->md4Context); break; #endif #ifdef GNULIB_GC_MD5 case GC_MD5: md5_process_bytes (data, len, &ctx->md5Context); break; #endif #ifdef GNULIB_GC_SHA1 case GC_SHA1: sha1_process_bytes (data, len, &ctx->sha1Context); break; #endif default: break; } } const char * gc_hash_read (gc_hash_handle handle) { _gc_hash_ctx *ctx = handle; const char *ret = NULL; switch (ctx->alg) { #ifdef GNULIB_GC_MD2 case GC_MD2: md2_finish_ctx (&ctx->md2Context, ctx->hash); ret = ctx->hash; break; #endif #ifdef GNULIB_GC_MD4 case GC_MD4: md4_finish_ctx (&ctx->md4Context, ctx->hash); ret = ctx->hash; break; #endif #ifdef GNULIB_GC_MD5 case GC_MD5: md5_finish_ctx (&ctx->md5Context, ctx->hash); ret = ctx->hash; break; #endif #ifdef GNULIB_GC_SHA1 case GC_SHA1: sha1_finish_ctx (&ctx->sha1Context, ctx->hash); ret = ctx->hash; break; #endif default: return NULL; } return ret; } void gc_hash_close (gc_hash_handle handle) { _gc_hash_ctx *ctx = handle; free (ctx); } Gc_rc gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf) { switch (hash) { #ifdef GNULIB_GC_MD2 case GC_MD2: md2_buffer (in, inlen, resbuf); break; #endif #ifdef GNULIB_GC_MD4 case GC_MD4: md4_buffer (in, inlen, resbuf); break; #endif #ifdef GNULIB_GC_MD5 case GC_MD5: md5_buffer (in, inlen, resbuf); break; #endif #ifdef GNULIB_GC_SHA1 case GC_SHA1: sha1_buffer (in, inlen, resbuf); break; #endif default: return GC_INVALID_HASH; } return GC_OK; } #ifdef GNULIB_GC_MD2 Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf) { md2_buffer (in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_MD4 Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf) { md4_buffer (in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_MD5 Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf) { md5_buffer (in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_SHA1 Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf) { sha1_buffer (in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_HMAC_MD5 Gc_rc gc_hmac_md5 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf) { hmac_md5 (key, keylen, in, inlen, resbuf); return GC_OK; } #endif #ifdef GNULIB_GC_HMAC_SHA1 Gc_rc gc_hmac_sha1 (const void *key, size_t keylen, const void *in, size_t inlen, char *resbuf) { hmac_sha1 (key, keylen, in, inlen, resbuf); return GC_OK; } #endif shishi-1.0.2/gl/sockets.h0000644000000000000000000000317512126660053012125 00000000000000/* sockets.h - wrappers for Windows socket functions Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Simon Josefsson */ #ifndef SOCKETS_H # define SOCKETS_H 1 #define SOCKETS_1_0 0x100 /* don't use - does not work on Windows XP */ #define SOCKETS_1_1 0x101 #define SOCKETS_2_0 0x200 /* don't use - does not work on Windows XP */ #define SOCKETS_2_1 0x201 #define SOCKETS_2_2 0x202 int gl_sockets_startup (int version) #if !WINDOWS_SOCKETS _GL_ATTRIBUTE_CONST #endif ; int gl_sockets_cleanup (void) #if !WINDOWS_SOCKETS _GL_ATTRIBUTE_CONST #endif ; /* This function is useful it you create a socket using gnulib's Winsock wrappers but needs to pass on the socket handle to some other library that only accepts sockets. */ #if WINDOWS_SOCKETS #include #include "msvc-nothrow.h" static inline SOCKET gl_fd_to_handle (int fd) { return _get_osfhandle (fd); } #else #define gl_fd_to_handle(x) (x) #endif /* WINDOWS_SOCKETS */ #endif /* SOCKETS_H */ shishi-1.0.2/gl/sys_uio.in.h0000644000000000000000000000317412126660054012551 00000000000000/* Substitute for . Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ # if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ # endif @PRAGMA_COLUMNS@ #ifndef _@GUARD_PREFIX@_SYS_UIO_H #if @HAVE_SYS_UIO_H@ /* On OpenBSD 4.4, assumes prior inclusion of . */ # include /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_UIO_H@ #endif #ifndef _@GUARD_PREFIX@_SYS_UIO_H #define _@GUARD_PREFIX@_SYS_UIO_H #if !@HAVE_SYS_UIO_H@ /* A platform that lacks . */ /* Get 'size_t' and 'ssize_t'. */ # include # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_struct_iovec /* All known platforms that lack also lack any declaration of struct iovec in any other header. */ struct iovec { void *iov_base; size_t iov_len; }; # define GNULIB_defined_struct_iovec 1 # endif # ifdef __cplusplus } # endif #endif #endif /* _@GUARD_PREFIX@_SYS_UIO_H */ #endif /* _@GUARD_PREFIX@_SYS_UIO_H */ shishi-1.0.2/gl/gettime.c0000644000000000000000000000231512126660051012074 00000000000000/* gettime -- get the system clock Copyright (C) 2002, 2004-2007, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert. */ #include #include "timespec.h" #include /* Get the system time into *TS. */ void gettime (struct timespec *ts) { #if HAVE_NANOTIME nanotime (ts); #else # if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME if (clock_gettime (CLOCK_REALTIME, ts) == 0) return; # endif { struct timeval tv; gettimeofday (&tv, NULL); ts->tv_sec = tv.tv_sec; ts->tv_nsec = tv.tv_usec * 1000; } #endif } shishi-1.0.2/gl/time.in.h0000644000000000000000000002151412126660054012013 00000000000000/* A more-standard . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* Don't get in the way of glibc when it includes time.h merely to declare a few standard symbols, rather than to declare all the symbols. Also, Solaris 8 eventually includes itself recursively; if that is happening, just include the system without adding our own declarations. */ #if (defined __need_time_t || defined __need_clock_t \ || defined __need_timespec \ || defined _@GUARD_PREFIX@_TIME_H) # @INCLUDE_NEXT@ @NEXT_TIME_H@ #else # define _@GUARD_PREFIX@_TIME_H # @INCLUDE_NEXT@ @NEXT_TIME_H@ /* NetBSD 5.0 mis-defines NULL. */ # include /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). Or they define it with the wrong member names or define it in (e.g., FreeBSD circa 1997). Stock Mingw does not define it, but the pthreads-win32 library defines it in . */ # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ # include # elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ # include /* The pthreads-win32 also defines a couple of broken macros. */ # undef asctime_r # undef ctime_r # undef gmtime_r # undef localtime_r # undef rand_r # undef strtok_r # else # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_struct_timespec # undef timespec # define timespec rpl_timespec struct timespec { time_t tv_sec; long int tv_nsec; }; # define GNULIB_defined_struct_timespec 1 # endif # ifdef __cplusplus } # endif # endif # endif # if !GNULIB_defined_struct_time_t_must_be_integral /* Per http://austingroupbugs.net/view.php?id=327, POSIX requires time_t to be an integer type, even though C99 permits floating point. We don't know of any implementation that uses floating point, and it is much easier to write code that doesn't have to worry about that corner case, so we force the issue. */ struct __time_t_must_be_integral { unsigned int __floating_time_t_unsupported : (time_t) 1; }; # define GNULIB_defined_struct_time_t_must_be_integral 1 # endif /* Sleep for at least RQTP seconds unless interrupted, If interrupted, return -1 and store the remaining time into RMTP. See . */ # if @GNULIB_NANOSLEEP@ # if @REPLACE_NANOSLEEP@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define nanosleep rpl_nanosleep # endif _GL_FUNCDECL_RPL (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp)); # else # if ! @HAVE_NANOSLEEP@ _GL_FUNCDECL_SYS (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (nanosleep, int, (struct timespec const *__rqtp, struct timespec *__rmtp)); # endif _GL_CXXALIASWARN (nanosleep); # endif /* Return the 'time_t' representation of TP and normalize TP. */ # if @GNULIB_MKTIME@ # if @REPLACE_MKTIME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mktime rpl_mktime # endif _GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); # else _GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); # endif _GL_CXXALIASWARN (mktime); # endif /* Convert TIMER to RESULT, assuming local time and UTC respectively. See and . */ # if @GNULIB_TIME_R@ # if @REPLACE_LOCALTIME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef localtime_r # define localtime_r rpl_localtime_r # endif _GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # else # if ! @HAVE_DECL_LOCALTIME_R@ _GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # endif # if @HAVE_DECL_LOCALTIME_R@ _GL_CXXALIASWARN (localtime_r); # endif # if @REPLACE_LOCALTIME_R@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gmtime_r # define gmtime_r rpl_gmtime_r # endif _GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # else # if ! @HAVE_DECL_LOCALTIME_R@ _GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, struct tm *restrict __result)); # endif # if @HAVE_DECL_LOCALTIME_R@ _GL_CXXALIASWARN (gmtime_r); # endif # endif /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store the resulting broken-down time into TM. See . */ # if @GNULIB_STRPTIME@ # if ! @HAVE_STRPTIME@ _GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm)); _GL_CXXALIASWARN (strptime); # endif /* Convert TM to a time_t value, assuming UTC. */ # if @GNULIB_TIMEGM@ # if @REPLACE_TIMEGM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef timegm # define timegm rpl_timegm # endif _GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); # else # if ! @HAVE_TIMEGM@ _GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); # endif _GL_CXXALIASWARN (timegm); # endif /* Encourage applications to avoid unsafe functions that can overrun buffers when given outlandish struct tm values. Portable applications should use strftime (or even sprintf) instead. */ # if defined GNULIB_POSIXCHECK # undef asctime _GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef asctime_r _GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef ctime _GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif # if defined GNULIB_POSIXCHECK # undef ctime_r _GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " "better use strftime (or even sprintf) instead"); # endif #endif shishi-1.0.2/gl/timegm.c0000644000000000000000000000225612126660054011727 00000000000000/* Convert UTC calendar time to simple time. Like mktime but assumes UTC. Copyright (C) 1994, 1997, 2003-2004, 2006-2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, 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 . */ #ifndef _LIBC # include #endif #include #ifndef _LIBC # undef __gmtime_r # define __gmtime_r gmtime_r # define __mktime_internal mktime_internal # include "mktime-internal.h" #endif time_t timegm (struct tm *tmp) { static time_t gmtime_offset; tmp->tm_isdst = 0; return __mktime_internal (tmp, __gmtime_r, &gmtime_offset); } shishi-1.0.2/gl/fcntl.c0000644000000000000000000002300112126660051011537 00000000000000/* Provide file descriptor control. Copyright (C) 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Eric Blake . */ #include /* Specification. */ #include #include #include #include #include #if !HAVE_FCNTL # define rpl_fcntl fcntl #endif #undef fcntl #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include /* Get _get_osfhandle. */ # include "msvc-nothrow.h" /* Upper bound on getdtablesize(). See lib/getdtablesize.c. */ # define OPEN_MAX_MAX 0x10000 /* Duplicate OLDFD into the first available slot of at least NEWFD, which must be positive, with FLAGS determining whether the duplicate will be inheritable. */ static int dupfd (int oldfd, int newfd, int flags) { /* Mingw has no way to create an arbitrary fd. Iterate until all file descriptors less than newfd are filled up. */ HANDLE curr_process = GetCurrentProcess (); HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd); unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT]; unsigned int fds_to_close_bound = 0; int result; BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE; int mode; if (newfd < 0 || getdtablesize () <= newfd) { errno = EINVAL; return -1; } if (old_handle == INVALID_HANDLE_VALUE || (mode = setmode (oldfd, O_BINARY)) == -1) { /* oldfd is not open, or is an unassigned standard file descriptor. */ errno = EBADF; return -1; } setmode (oldfd, mode); flags |= mode; for (;;) { HANDLE new_handle; int duplicated_fd; unsigned int index; if (!DuplicateHandle (curr_process, /* SourceProcessHandle */ old_handle, /* SourceHandle */ curr_process, /* TargetProcessHandle */ (PHANDLE) &new_handle, /* TargetHandle */ (DWORD) 0, /* DesiredAccess */ inherit, /* InheritHandle */ DUPLICATE_SAME_ACCESS)) /* Options */ { /* TODO: Translate GetLastError () into errno. */ errno = EMFILE; result = -1; break; } duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags); if (duplicated_fd < 0) { CloseHandle (new_handle); errno = EMFILE; result = -1; break; } if (newfd <= duplicated_fd) { result = duplicated_fd; break; } /* Set the bit duplicated_fd in fds_to_close[]. */ index = (unsigned int) duplicated_fd / CHAR_BIT; if (fds_to_close_bound <= index) { if (sizeof fds_to_close <= index) /* Need to increase OPEN_MAX_MAX. */ abort (); memset (fds_to_close + fds_to_close_bound, '\0', index + 1 - fds_to_close_bound); fds_to_close_bound = index + 1; } fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT); } /* Close the previous fds that turned out to be too small. */ { int saved_errno = errno; unsigned int duplicated_fd; for (duplicated_fd = 0; duplicated_fd < fds_to_close_bound * CHAR_BIT; duplicated_fd++) if ((fds_to_close[duplicated_fd / CHAR_BIT] >> (duplicated_fd % CHAR_BIT)) & 1) close (duplicated_fd); errno = saved_errno; } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (oldfd, result); # endif return result; } #endif /* W32 */ /* Perform the specified ACTION on the file descriptor FD, possibly using the argument ARG further described below. This replacement handles the following actions, and forwards all others on to the native fcntl. An unrecognized ACTION returns -1 with errno set to EINVAL. F_DUPFD - duplicate FD, with int ARG being the minimum target fd. If successful, return the duplicate, which will be inheritable; otherwise return -1 and set errno. F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum target fd. If successful, return the duplicate, which will not be inheritable; otherwise return -1 and set errno. F_GETFD - ARG need not be present. If successful, return a non-negative value containing the descriptor flags of FD (only FD_CLOEXEC is portable, but other flags may be present); otherwise return -1 and set errno. */ int rpl_fcntl (int fd, int action, /* arg */...) { va_list arg; int result = -1; va_start (arg, action); switch (action) { #if !HAVE_FCNTL case F_DUPFD: { int target = va_arg (arg, int); result = dupfd (fd, target, 0); break; } #elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR case F_DUPFD: { int target = va_arg (arg, int); /* Detect invalid target; needed for cygwin 1.5.x. */ if (target < 0 || getdtablesize () <= target) errno = EINVAL; else { /* Haiku alpha 2 loses fd flags on original. */ int flags = fcntl (fd, F_GETFD); if (flags < 0) { result = -1; break; } result = fcntl (fd, action, target); if (0 <= result && fcntl (fd, F_SETFD, flags) == -1) { int saved_errno = errno; close (result); result = -1; errno = saved_errno; } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); # endif } break; } /* F_DUPFD */ #endif /* FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR */ case F_DUPFD_CLOEXEC: { int target = va_arg (arg, int); #if !HAVE_FCNTL result = dupfd (fd, target, O_CLOEXEC); break; #else /* HAVE_FCNTL */ /* Try the system call first, if the headers claim it exists (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we may be running with a glibc that has the macro but with an older kernel that does not support it. Cache the information on whether the system call really works, but avoid caching failure if the corresponding F_DUPFD fails for any reason. 0 = unknown, 1 = yes, -1 = no. */ static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0; if (0 <= have_dupfd_cloexec) { result = fcntl (fd, action, target); if (0 <= result || errno != EINVAL) { have_dupfd_cloexec = 1; # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); # endif } else { result = rpl_fcntl (fd, F_DUPFD, target); if (result < 0) break; have_dupfd_cloexec = -1; } } else result = rpl_fcntl (fd, F_DUPFD, target); if (0 <= result && have_dupfd_cloexec == -1) { int flags = fcntl (result, F_GETFD); if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1) { int saved_errno = errno; close (result); errno = saved_errno; result = -1; } } break; #endif /* HAVE_FCNTL */ } /* F_DUPFD_CLOEXEC */ #if !HAVE_FCNTL case F_GETFD: { # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ HANDLE handle = (HANDLE) _get_osfhandle (fd); DWORD flags; if (handle == INVALID_HANDLE_VALUE || GetHandleInformation (handle, &flags) == 0) errno = EBADF; else result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC; # else /* !W32 */ /* Use dup2 to reject invalid file descriptors. No way to access this information, so punt. */ if (0 <= dup2 (fd, fd)) result = 0; # endif /* !W32 */ break; } /* F_GETFD */ #endif /* !HAVE_FCNTL */ /* Implementing F_SETFD on mingw is not trivial - there is no API for changing the O_NOINHERIT bit on an fd, and merely changing the HANDLE_FLAG_INHERIT bit on the underlying handle can lead to odd state. It may be possible by duplicating the handle, using _open_osfhandle with the right flags, then using dup2 to move the duplicate onto the original, but that is not supported for now. */ default: { #if HAVE_FCNTL void *p = va_arg (arg, void *); result = fcntl (fd, action, p); #else errno = EINVAL; #endif break; } } va_end (arg); return result; } shishi-1.0.2/gl/float.c0000644000000000000000000000250412126660051011543 00000000000000/* Auxiliary definitions for . Copyright (C) 2011-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 . */ #include /* Specification. */ #include #if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ const union gl_long_double_union gl_LDBL_MAX = { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } }; #elif defined __i386__ const union gl_long_double_union gl_LDBL_MAX = { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } }; #else /* This declaration is solely to ensure that after preprocessing this file is never empty. */ typedef int dummy; #endif shishi-1.0.2/gl/connect.c0000644000000000000000000000301512126660051012065 00000000000000/* connect.c --- wrappers for Windows connect function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef connect int rpl_connect (int fd, const struct sockaddr *sockaddr, socklen_t len) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int r = connect (sock, sockaddr, len); if (r < 0) { /* EINPROGRESS is not returned by WinSock 2.0; for backwards compatibility, connect(2) uses EWOULDBLOCK. */ if (WSAGetLastError () == WSAEWOULDBLOCK) WSASetLastError (WSAEINPROGRESS); set_winsock_errno (); } return r; } } shishi-1.0.2/gl/bind.c0000644000000000000000000000240112126660051011346 00000000000000/* bind.c --- wrappers for Windows bind function Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include #define WIN32_LEAN_AND_MEAN /* Get winsock2.h. */ #include /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef bind int rpl_bind (int fd, const struct sockaddr *sockaddr, socklen_t len) { SOCKET sock = FD_TO_SOCKET (fd); if (sock == INVALID_SOCKET) { errno = EBADF; return -1; } else { int r = bind (sock, sockaddr, len); if (r < 0) set_winsock_errno (); return r; } } shishi-1.0.2/gl/lseek.c0000644000000000000000000000343312126660051011543 00000000000000/* An lseek() function that detects pipes. Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Windows platforms. */ /* Get GetFileType. */ # include /* Get _get_osfhandle. */ # include "msvc-nothrow.h" #else # include #endif #include #undef lseek off_t rpl_lseek (int fd, off_t offset, int whence) { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */ HANDLE h = (HANDLE) _get_osfhandle (fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (GetFileType (h) != FILE_TYPE_DISK) { errno = ESPIPE; return -1; } #else /* BeOS lseek mistakenly succeeds on pipes... */ struct stat statbuf; if (fstat (fd, &statbuf) < 0) return -1; if (!S_ISREG (statbuf.st_mode)) { errno = ESPIPE; return -1; } #endif #if _GL_WINDOWS_64_BIT_OFF_T return _lseeki64 (fd, offset, whence); #else return lseek (fd, offset, whence); #endif } shishi-1.0.2/gl/arcfour.c0000644000000000000000000000371212126660051012101 00000000000000/* arcfour.c --- The arcfour stream cipher * Copyright (C) 2000-2003, 2005-2006, 2009-2013 Free Software Foundation, Inc. * * This file 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, or (at your * option) any later version. * * This file 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 file; if not, see . * */ /* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */ /* * For a description of the algorithm, see: * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996. * ISBN 0-471-11709-9. Pages 397 ff. */ #include #include "arcfour.h" void arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf, size_t length) { uint8_t i = context->idx_i; uint8_t j = context->idx_j; char *sbox = context->sbox; for (; length > 0; length--) { char t; i++; j += sbox[i]; t = sbox[i]; sbox[i] = sbox[j]; sbox[j] = t; *outbuf++ = (*inbuf++ ^ sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]); } context->idx_i = i; context->idx_j = j; } void arcfour_setkey (arcfour_context * context, const char *key, size_t keylen) { size_t i, j, k; char *sbox = context->sbox; context->idx_i = context->idx_j = 0; for (i = 0; i < ARCFOUR_SBOX_SIZE; i++) sbox[i] = i; for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++) { char t; j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE; t = sbox[i]; sbox[i] = sbox[j]; sbox[j] = t; if (++k == keylen) k = 0; } } shishi-1.0.2/gl/stdio.in.h0000644000000000000000000014042012126660053012174 00000000000000/* A GNU-like . Copyright (C) 2004, 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H /* Special invocation convention: - Inside glibc header files. - On OSF/1 5.1 we have a sequence of nested includes -> -> -> -> -> -> -> . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. */ #@INCLUDE_NEXT@ @NEXT_STDIO_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_STDIO_H #define _GL_ALREADY_INCLUDING_STDIO_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_STDIO_H@ #undef _GL_ALREADY_INCLUDING_STDIO_H #ifndef _@GUARD_PREFIX@_STDIO_H #define _@GUARD_PREFIX@_STDIO_H /* Get va_list. Needed on many systems, including glibc 2.8. */ #include #include /* Get off_t and ssize_t. Needed on many systems, including glibc 2.8 and eglibc 2.11.2. May also define off_t to a 64-bit type on native Windows. */ #include /* The __attribute__ feature is available in gcc versions 2.5 and later. The __-protected variants of the attributes 'format' and 'printf' are accepted by gcc versions 2.6.4 (effectively 2.7) and later. We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because gnulib and libintl do '#define printf __printf__' when they override the 'printf' function. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ #endif /* _GL_ATTRIBUTE_FORMAT_PRINTF indicates to GCC that the function takes a format string and arguments, where the format string directives are the ones standardized by ISO C99 and POSIX. */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument)) #else # define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) #endif /* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF, except that it indicates to GCC that the supported format string directives are the ones of the system printf(), rather than the ones standardized by ISO C99 and POSIX. */ #define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) /* _GL_ATTRIBUTE_FORMAT_SCANF indicates to GCC that the function takes a format string and arguments, where the format string directives are the ones standardized by ISO C99 and POSIX. */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument)) #else # define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) #endif /* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF, except that it indicates to GCC that the supported format string directives are the ones of the system scanf(), rather than the ones standardized by ISO C99 and POSIX. */ #define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) /* Solaris 10 declares renameat in , not in . */ /* But in any case avoid namespace pollution on glibc systems. */ #if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __sun \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Macros for stringification. */ #define _GL_STDIO_STRINGIZE(token) #token #define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) #if @GNULIB_DPRINTF@ # if @REPLACE_DPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define dprintf rpl_dprintf # endif _GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...)); # else # if !@HAVE_DPRINTF@ _GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...)); # endif _GL_CXXALIASWARN (dprintf); #elif defined GNULIB_POSIXCHECK # undef dprintf # if HAVE_RAW_DECL_DPRINTF _GL_WARN_ON_USE (dprintf, "dprintf is unportable - " "use gnulib module dprintf for portability"); # endif #endif #if @GNULIB_FCLOSE@ /* Close STREAM and its underlying file descriptor. */ # if @REPLACE_FCLOSE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fclose rpl_fclose # endif _GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fclose, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (fclose, int, (FILE *stream)); # endif _GL_CXXALIASWARN (fclose); #elif defined GNULIB_POSIXCHECK # undef fclose /* Assume fclose is always declared. */ _GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - " "use gnulib module fclose for portable POSIX compliance"); #endif #if @GNULIB_FDOPEN@ # if @REPLACE_FDOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fdopen # define fdopen rpl_fdopen # endif _GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode)); # else _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode)); # endif _GL_CXXALIASWARN (fdopen); #elif defined GNULIB_POSIXCHECK # undef fdopen /* Assume fdopen is always declared. */ _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - " "use gnulib module fdopen for portability"); #endif #if @GNULIB_FFLUSH@ /* Flush all pending data on STREAM according to POSIX rules. Both output and seekable input streams are supported. Note! LOSS OF DATA can occur if fflush is applied on an input stream that is _not_seekable_ or on an update stream that is _not_seekable_ and in which the most recent operation was input. Seekability can be tested with lseek(fileno(fp),0,SEEK_CUR). */ # if @REPLACE_FFLUSH@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fflush rpl_fflush # endif _GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream)); _GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream)); # else _GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream)); # endif _GL_CXXALIASWARN (fflush); #elif defined GNULIB_POSIXCHECK # undef fflush /* Assume fflush is always declared. */ _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - " "use gnulib module fflush for portable POSIX compliance"); #endif #if @GNULIB_FGETC@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fgetc # define fgetc rpl_fgetc # endif _GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fgetc, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (fgetc, int, (FILE *stream)); # endif _GL_CXXALIASWARN (fgetc); #endif #if @GNULIB_FGETS@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fgets # define fgets rpl_fgets # endif _GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream) _GL_ARG_NONNULL ((1, 3))); _GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream)); # else _GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream)); # endif _GL_CXXALIASWARN (fgets); #endif #if @GNULIB_FOPEN@ # if @REPLACE_FOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fopen # define fopen rpl_fopen # endif _GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode)); # else _GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode)); # endif _GL_CXXALIASWARN (fopen); #elif defined GNULIB_POSIXCHECK # undef fopen /* Assume fopen is always declared. */ _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - " "use gnulib module fopen for portability"); #endif #if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@ # if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fprintf rpl_fprintf # endif # define GNULIB_overrides_fprintf 1 # if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # else _GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...)); # else _GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...)); # endif _GL_CXXALIASWARN (fprintf); #endif #if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_fprintf # undef fprintf # endif /* Assume fprintf is always declared. */ _GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - " "use gnulib module fprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_FPURGE@ /* Discard all pending buffered I/O data on STREAM. STREAM must not be wide-character oriented. When discarding pending output, the file position is set back to where it was before the write calls. When discarding pending input, the file position is advanced to match the end of the previously read input. Return 0 if successful. Upon error, return -1 and set errno. */ # if @REPLACE_FPURGE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define fpurge rpl_fpurge # endif _GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream)); # else # if !@HAVE_DECL_FPURGE@ _GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream)); # endif _GL_CXXALIASWARN (fpurge); #elif defined GNULIB_POSIXCHECK # undef fpurge # if HAVE_RAW_DECL_FPURGE _GL_WARN_ON_USE (fpurge, "fpurge is not always present - " "use gnulib module fpurge for portability"); # endif #endif #if @GNULIB_FPUTC@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fputc # define fputc rpl_fputc # endif _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream)); # else _GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream)); # endif _GL_CXXALIASWARN (fputc); #endif #if @GNULIB_FPUTS@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fputs # define fputs rpl_fputs # endif _GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream)); # else _GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream)); # endif _GL_CXXALIASWARN (fputs); #endif #if @GNULIB_FREAD@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fread # define fread rpl_fread # endif _GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream) _GL_ARG_NONNULL ((4))); _GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)); # else _GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)); # endif _GL_CXXALIASWARN (fread); #endif #if @GNULIB_FREOPEN@ # if @REPLACE_FREOPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef freopen # define freopen rpl_freopen # endif _GL_FUNCDECL_RPL (freopen, FILE *, (const char *filename, const char *mode, FILE *stream) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (freopen, FILE *, (const char *filename, const char *mode, FILE *stream)); # else _GL_CXXALIAS_SYS (freopen, FILE *, (const char *filename, const char *mode, FILE *stream)); # endif _GL_CXXALIASWARN (freopen); #elif defined GNULIB_POSIXCHECK # undef freopen /* Assume freopen is always declared. */ _GL_WARN_ON_USE (freopen, "freopen on native Windows platforms is not POSIX compliant - " "use gnulib module freopen for portability"); #endif #if @GNULIB_FSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fscanf # define fscanf rpl_fscanf # endif _GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...)); # else _GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...)); # endif _GL_CXXALIASWARN (fscanf); #endif /* Set up the following warnings, based on which modules are in use. GNU Coding Standards discourage the use of fseek, since it imposes an arbitrary limitation on some 32-bit hosts. Remember that the fseek module depends on the fseeko module, so we only have three cases to consider: 1. The developer is not using either module. Issue a warning under GNULIB_POSIXCHECK for both functions, to remind them that both functions have bugs on some systems. _GL_NO_LARGE_FILES has no impact on this warning. 2. The developer is using both modules. They may be unaware of the arbitrary limitations of fseek, so issue a warning under GNULIB_POSIXCHECK. On the other hand, they may be using both modules intentionally, so the developer can define _GL_NO_LARGE_FILES in the compilation units where the use of fseek is safe, to silence the warning. 3. The developer is using the fseeko module, but not fseek. Gnulib guarantees that fseek will still work around platform bugs in that case, but we presume that the developer is aware of the pitfalls of fseek and was trying to avoid it, so issue a warning even when GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be defined to silence the warning in particular compilation units. In C++ compilations with GNULIB_NAMESPACE, in order to avoid that fseek gets defined as a macro, it is recommended that the developer uses the fseek module, even if he is not calling the fseek function. Most gnulib clients that perform stream operations should fall into category 3. */ #if @GNULIB_FSEEK@ # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES # define _GL_FSEEK_WARN /* Category 2, above. */ # undef fseek # endif # if @REPLACE_FSEEK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fseek # define fseek rpl_fseek # endif _GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence)); # else _GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence)); # endif _GL_CXXALIASWARN (fseek); #endif #if @GNULIB_FSEEKO@ # if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES # define _GL_FSEEK_WARN /* Category 3, above. */ # undef fseek # endif # if @REPLACE_FSEEKO@ /* Provide an fseeko function that is aware of a preceding fflush(), and which detects pipes. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fseeko # define fseeko rpl_fseeko # endif _GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)); # else # if ! @HAVE_DECL_FSEEKO@ _GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)); # endif _GL_CXXALIASWARN (fseeko); #elif defined GNULIB_POSIXCHECK # define _GL_FSEEK_WARN /* Category 1, above. */ # undef fseek # undef fseeko # if HAVE_RAW_DECL_FSEEKO _GL_WARN_ON_USE (fseeko, "fseeko is unportable - " "use gnulib module fseeko for portability"); # endif #endif #ifdef _GL_FSEEK_WARN # undef _GL_FSEEK_WARN /* Here, either fseek is undefined (but C89 guarantees that it is declared), or it is defined as rpl_fseek (declared above). */ _GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB " "on 32-bit platforms - " "use fseeko function for handling of large files"); #endif /* ftell, ftello. See the comments on fseek/fseeko. */ #if @GNULIB_FTELL@ # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES # define _GL_FTELL_WARN /* Category 2, above. */ # undef ftell # endif # if @REPLACE_FTELL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftell # define ftell rpl_ftell # endif _GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (ftell, long, (FILE *fp)); # else _GL_CXXALIAS_SYS (ftell, long, (FILE *fp)); # endif _GL_CXXALIASWARN (ftell); #endif #if @GNULIB_FTELLO@ # if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES # define _GL_FTELL_WARN /* Category 3, above. */ # undef ftell # endif # if @REPLACE_FTELLO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef ftello # define ftello rpl_ftello # endif _GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp)); # else # if ! @HAVE_DECL_FTELLO@ _GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp)); # endif _GL_CXXALIASWARN (ftello); #elif defined GNULIB_POSIXCHECK # define _GL_FTELL_WARN /* Category 1, above. */ # undef ftell # undef ftello # if HAVE_RAW_DECL_FTELLO _GL_WARN_ON_USE (ftello, "ftello is unportable - " "use gnulib module ftello for portability"); # endif #endif #ifdef _GL_FTELL_WARN # undef _GL_FTELL_WARN /* Here, either ftell is undefined (but C89 guarantees that it is declared), or it is defined as rpl_ftell (declared above). */ _GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB " "on 32-bit platforms - " "use ftello function for handling of large files"); #endif #if @GNULIB_FWRITE@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fwrite # define fwrite rpl_fwrite # endif _GL_FUNCDECL_RPL (fwrite, size_t, (const void *ptr, size_t s, size_t n, FILE *stream) _GL_ARG_NONNULL ((1, 4))); _GL_CXXALIAS_RPL (fwrite, size_t, (const void *ptr, size_t s, size_t n, FILE *stream)); # else _GL_CXXALIAS_SYS (fwrite, size_t, (const void *ptr, size_t s, size_t n, FILE *stream)); /* Work around bug 11959 when fortifying glibc 2.4 through 2.15 , which sometimes causes an unwanted diagnostic for fwrite calls. This affects only function declaration attributes under certain versions of gcc, and is not needed for C++. */ # if (0 < __USE_FORTIFY_LEVEL \ && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \ && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \ && !defined __cplusplus) # undef fwrite # define fwrite(a, b, c, d) ({size_t __r = fwrite (a, b, c, d); __r; }) # endif # endif _GL_CXXALIASWARN (fwrite); #endif #if @GNULIB_GETC@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getc # define getc rpl_fgetc # endif _GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream)); # else _GL_CXXALIAS_SYS (getc, int, (FILE *stream)); # endif _GL_CXXALIASWARN (getc); #endif #if @GNULIB_GETCHAR@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getchar # define getchar rpl_getchar # endif _GL_FUNCDECL_RPL (getchar, int, (void)); _GL_CXXALIAS_RPL (getchar, int, (void)); # else _GL_CXXALIAS_SYS (getchar, int, (void)); # endif _GL_CXXALIASWARN (getchar); #endif #if @GNULIB_GETDELIM@ /* Read input, up to (and including) the next occurrence of DELIMITER, from STREAM, store it in *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE bytes of space. It is realloc'd as necessary. Return the number of bytes read and stored at *LINEPTR (not including the NUL terminator), or -1 on error or EOF. */ # if @REPLACE_GETDELIM@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getdelim # define getdelim rpl_getdelim # endif _GL_FUNCDECL_RPL (getdelim, ssize_t, (char **lineptr, size_t *linesize, int delimiter, FILE *stream) _GL_ARG_NONNULL ((1, 2, 4))); _GL_CXXALIAS_RPL (getdelim, ssize_t, (char **lineptr, size_t *linesize, int delimiter, FILE *stream)); # else # if !@HAVE_DECL_GETDELIM@ _GL_FUNCDECL_SYS (getdelim, ssize_t, (char **lineptr, size_t *linesize, int delimiter, FILE *stream) _GL_ARG_NONNULL ((1, 2, 4))); # endif _GL_CXXALIAS_SYS (getdelim, ssize_t, (char **lineptr, size_t *linesize, int delimiter, FILE *stream)); # endif _GL_CXXALIASWARN (getdelim); #elif defined GNULIB_POSIXCHECK # undef getdelim # if HAVE_RAW_DECL_GETDELIM _GL_WARN_ON_USE (getdelim, "getdelim is unportable - " "use gnulib module getdelim for portability"); # endif #endif #if @GNULIB_GETLINE@ /* Read a line, up to (and including) the next newline, from STREAM, store it in *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE bytes of space. It is realloc'd as necessary. Return the number of bytes read and stored at *LINEPTR (not including the NUL terminator), or -1 on error or EOF. */ # if @REPLACE_GETLINE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef getline # define getline rpl_getline # endif _GL_FUNCDECL_RPL (getline, ssize_t, (char **lineptr, size_t *linesize, FILE *stream) _GL_ARG_NONNULL ((1, 2, 3))); _GL_CXXALIAS_RPL (getline, ssize_t, (char **lineptr, size_t *linesize, FILE *stream)); # else # if !@HAVE_DECL_GETLINE@ _GL_FUNCDECL_SYS (getline, ssize_t, (char **lineptr, size_t *linesize, FILE *stream) _GL_ARG_NONNULL ((1, 2, 3))); # endif _GL_CXXALIAS_SYS (getline, ssize_t, (char **lineptr, size_t *linesize, FILE *stream)); # endif # if @HAVE_DECL_GETLINE@ _GL_CXXALIASWARN (getline); # endif #elif defined GNULIB_POSIXCHECK # undef getline # if HAVE_RAW_DECL_GETLINE _GL_WARN_ON_USE (getline, "getline is unportable - " "use gnulib module getline for portability"); # endif #endif /* It is very rare that the developer ever has full control of stdin, so any use of gets warrants an unconditional warning; besides, C11 removed it. */ #undef gets #if HAVE_RAW_DECL_GETS _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); #endif #if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ struct obstack; /* Grow an obstack with formatted output. Return the number of bytes added to OBS. No trailing nul byte is added, and the object should be closed with obstack_finish before use. Upon memory allocation error, call obstack_alloc_failed_handler. Upon other error, return -1. */ # if @REPLACE_OBSTACK_PRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define obstack_printf rpl_obstack_printf # endif _GL_FUNCDECL_RPL (obstack_printf, int, (struct obstack *obs, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (obstack_printf, int, (struct obstack *obs, const char *format, ...)); # else # if !@HAVE_DECL_OBSTACK_PRINTF@ _GL_FUNCDECL_SYS (obstack_printf, int, (struct obstack *obs, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (obstack_printf, int, (struct obstack *obs, const char *format, ...)); # endif _GL_CXXALIASWARN (obstack_printf); # if @REPLACE_OBSTACK_PRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define obstack_vprintf rpl_obstack_vprintf # endif _GL_FUNCDECL_RPL (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args)); # else # if !@HAVE_DECL_OBSTACK_PRINTF@ _GL_FUNCDECL_SYS (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (obstack_vprintf, int, (struct obstack *obs, const char *format, va_list args)); # endif _GL_CXXALIASWARN (obstack_vprintf); #endif #if @GNULIB_PCLOSE@ # if !@HAVE_PCLOSE@ _GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (pclose, int, (FILE *stream)); _GL_CXXALIASWARN (pclose); #elif defined GNULIB_POSIXCHECK # undef pclose # if HAVE_RAW_DECL_PCLOSE _GL_WARN_ON_USE (pclose, "pclose is unportable - " "use gnulib module pclose for more portability"); # endif #endif #if @GNULIB_PERROR@ /* Print a message to standard error, describing the value of ERRNO, (if STRING is not NULL and not empty) prefixed with STRING and ": ", and terminated with a newline. */ # if @REPLACE_PERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define perror rpl_perror # endif _GL_FUNCDECL_RPL (perror, void, (const char *string)); _GL_CXXALIAS_RPL (perror, void, (const char *string)); # else _GL_CXXALIAS_SYS (perror, void, (const char *string)); # endif _GL_CXXALIASWARN (perror); #elif defined GNULIB_POSIXCHECK # undef perror /* Assume perror is always declared. */ _GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - " "use gnulib module perror for portability"); #endif #if @GNULIB_POPEN@ # if @REPLACE_POPEN@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef popen # define popen rpl_popen # endif _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); # else # if !@HAVE_POPEN@ _GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); # endif _GL_CXXALIASWARN (popen); #elif defined GNULIB_POSIXCHECK # undef popen # if HAVE_RAW_DECL_POPEN _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - " "use gnulib module popen or pipe for more portability"); # endif #endif #if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@ # if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if defined __GNUC__ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) /* Don't break __attribute__((format(printf,M,N))). */ # define printf __printf__ # endif # if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL_1 (__printf__, int, (const char *format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) _GL_ARG_NONNULL ((1))); # else _GL_FUNCDECL_RPL_1 (__printf__, int, (const char *format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...)); # else # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define printf rpl_printf # endif _GL_FUNCDECL_RPL (printf, int, (const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (printf, int, (const char *format, ...)); # endif # define GNULIB_overrides_printf 1 # else _GL_CXXALIAS_SYS (printf, int, (const char *format, ...)); # endif _GL_CXXALIASWARN (printf); #endif #if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_printf # undef printf # endif /* Assume printf is always declared. */ _GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - " "use gnulib module printf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_PUTC@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putc # define putc rpl_fputc # endif _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream)); # else _GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream)); # endif _GL_CXXALIASWARN (putc); #endif #if @GNULIB_PUTCHAR@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef putchar # define putchar rpl_putchar # endif _GL_FUNCDECL_RPL (putchar, int, (int c)); _GL_CXXALIAS_RPL (putchar, int, (int c)); # else _GL_CXXALIAS_SYS (putchar, int, (int c)); # endif _GL_CXXALIASWARN (putchar); #endif #if @GNULIB_PUTS@ # if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef puts # define puts rpl_puts # endif _GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (puts, int, (const char *string)); # else _GL_CXXALIAS_SYS (puts, int, (const char *string)); # endif _GL_CXXALIASWARN (puts); #endif #if @GNULIB_REMOVE@ # if @REPLACE_REMOVE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef remove # define remove rpl_remove # endif _GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (remove, int, (const char *name)); # else _GL_CXXALIAS_SYS (remove, int, (const char *name)); # endif _GL_CXXALIASWARN (remove); #elif defined GNULIB_POSIXCHECK # undef remove /* Assume remove is always declared. */ _GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - " "use gnulib module remove for more portability"); #endif #if @GNULIB_RENAME@ # if @REPLACE_RENAME@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef rename # define rename rpl_rename # endif _GL_FUNCDECL_RPL (rename, int, (const char *old_filename, const char *new_filename) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (rename, int, (const char *old_filename, const char *new_filename)); # else _GL_CXXALIAS_SYS (rename, int, (const char *old_filename, const char *new_filename)); # endif _GL_CXXALIASWARN (rename); #elif defined GNULIB_POSIXCHECK # undef rename /* Assume rename is always declared. */ _GL_WARN_ON_USE (rename, "rename is buggy on some platforms - " "use gnulib module rename for more portability"); #endif #if @GNULIB_RENAMEAT@ # if @REPLACE_RENAMEAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef renameat # define renameat rpl_renameat # endif _GL_FUNCDECL_RPL (renameat, int, (int fd1, char const *file1, int fd2, char const *file2) _GL_ARG_NONNULL ((2, 4))); _GL_CXXALIAS_RPL (renameat, int, (int fd1, char const *file1, int fd2, char const *file2)); # else # if !@HAVE_RENAMEAT@ _GL_FUNCDECL_SYS (renameat, int, (int fd1, char const *file1, int fd2, char const *file2) _GL_ARG_NONNULL ((2, 4))); # endif _GL_CXXALIAS_SYS (renameat, int, (int fd1, char const *file1, int fd2, char const *file2)); # endif _GL_CXXALIASWARN (renameat); #elif defined GNULIB_POSIXCHECK # undef renameat # if HAVE_RAW_DECL_RENAMEAT _GL_WARN_ON_USE (renameat, "renameat is not portable - " "use gnulib module renameat for portability"); # endif #endif #if @GNULIB_SCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if defined __GNUC__ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef scanf /* Don't break __attribute__((format(scanf,M,N))). */ # define scanf __scanf__ # endif _GL_FUNCDECL_RPL_1 (__scanf__, int, (const char *format, ...) __asm__ (@ASM_SYMBOL_PREFIX@ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf)) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...)); # else # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef scanf # define scanf rpl_scanf # endif _GL_FUNCDECL_RPL (scanf, int, (const char *format, ...) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (scanf, int, (const char *format, ...)); # endif # else _GL_CXXALIAS_SYS (scanf, int, (const char *format, ...)); # endif _GL_CXXALIASWARN (scanf); #endif #if @GNULIB_SNPRINTF@ # if @REPLACE_SNPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define snprintf rpl_snprintf # endif _GL_FUNCDECL_RPL (snprintf, int, (char *str, size_t size, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) _GL_ARG_NONNULL ((3))); _GL_CXXALIAS_RPL (snprintf, int, (char *str, size_t size, const char *format, ...)); # else # if !@HAVE_DECL_SNPRINTF@ _GL_FUNCDECL_SYS (snprintf, int, (char *str, size_t size, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) _GL_ARG_NONNULL ((3))); # endif _GL_CXXALIAS_SYS (snprintf, int, (char *str, size_t size, const char *format, ...)); # endif _GL_CXXALIASWARN (snprintf); #elif defined GNULIB_POSIXCHECK # undef snprintf # if HAVE_RAW_DECL_SNPRINTF _GL_WARN_ON_USE (snprintf, "snprintf is unportable - " "use gnulib module snprintf for portability"); # endif #endif /* Some people would argue that all sprintf uses should be warned about (for example, OpenBSD issues a link warning for it), since it can cause security holes due to buffer overruns. However, we believe that sprintf can be used safely, and is more efficient than snprintf in those safe cases; and as proof of our belief, we use sprintf in several gnulib modules. So this header intentionally avoids adding a warning to sprintf except when GNULIB_POSIXCHECK is defined. */ #if @GNULIB_SPRINTF_POSIX@ # if @REPLACE_SPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define sprintf rpl_sprintf # endif _GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...)); # else _GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...)); # endif _GL_CXXALIASWARN (sprintf); #elif defined GNULIB_POSIXCHECK # undef sprintf /* Assume sprintf is always declared. */ _GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - " "use gnulib module sprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_TMPFILE@ # if @REPLACE_TMPFILE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define tmpfile rpl_tmpfile # endif _GL_FUNCDECL_RPL (tmpfile, FILE *, (void)); _GL_CXXALIAS_RPL (tmpfile, FILE *, (void)); # else _GL_CXXALIAS_SYS (tmpfile, FILE *, (void)); # endif _GL_CXXALIASWARN (tmpfile); #elif defined GNULIB_POSIXCHECK # undef tmpfile # if HAVE_RAW_DECL_TMPFILE _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - " "use gnulib module tmpfile for portability"); # endif #endif #if @GNULIB_VASPRINTF@ /* Write formatted output to a string dynamically allocated with malloc(). If the memory allocation succeeds, store the address of the string in *RESULT and return the number of resulting bytes, excluding the trailing NUL. Upon memory allocation error, or some other error, return -1. */ # if @REPLACE_VASPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define asprintf rpl_asprintf # endif _GL_FUNCDECL_RPL (asprintf, int, (char **result, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (asprintf, int, (char **result, const char *format, ...)); # else # if !@HAVE_VASPRINTF@ _GL_FUNCDECL_SYS (asprintf, int, (char **result, const char *format, ...) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (asprintf, int, (char **result, const char *format, ...)); # endif _GL_CXXALIASWARN (asprintf); # if @REPLACE_VASPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vasprintf rpl_vasprintf # endif _GL_FUNCDECL_RPL (vasprintf, int, (char **result, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vasprintf, int, (char **result, const char *format, va_list args)); # else # if !@HAVE_VASPRINTF@ _GL_FUNCDECL_SYS (vasprintf, int, (char **result, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_SYS (vasprintf, int, (char **result, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vasprintf); #endif #if @GNULIB_VDPRINTF@ # if @REPLACE_VDPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vdprintf rpl_vdprintf # endif _GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args)); # else # if !@HAVE_VDPRINTF@ _GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((2))); # endif /* Need to cast, because on Solaris, the third parameter will likely be __va_list args. */ _GL_CXXALIAS_SYS_CAST (vdprintf, int, (int fd, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vdprintf); #elif defined GNULIB_POSIXCHECK # undef vdprintf # if HAVE_RAW_DECL_VDPRINTF _GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - " "use gnulib module vdprintf for portability"); # endif #endif #if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@ # if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vfprintf rpl_vfprintf # endif # define GNULIB_overrides_vfprintf 1 # if @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); # else _GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0) _GL_ARG_NONNULL ((1, 2))); # endif _GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)); # else /* Need to cast, because on Solaris, the third parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vfprintf, int, (FILE *fp, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vfprintf); #endif #if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_vfprintf # undef vfprintf # endif /* Assume vfprintf is always declared. */ _GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - " "use gnulib module vfprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_VFSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef vfscanf # define vfscanf rpl_vfscanf # endif _GL_FUNCDECL_RPL (vfscanf, int, (FILE *stream, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vfscanf, int, (FILE *stream, const char *format, va_list args)); # else _GL_CXXALIAS_SYS (vfscanf, int, (FILE *stream, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vfscanf); #endif #if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@ # if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vprintf rpl_vprintf # endif # define GNULIB_overrides_vprintf 1 # if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ _GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0) _GL_ARG_NONNULL ((1))); # else _GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args)); # else /* Need to cast, because on Solaris, the second parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args)); # endif _GL_CXXALIASWARN (vprintf); #endif #if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK # if !GNULIB_overrides_vprintf # undef vprintf # endif /* Assume vprintf is always declared. */ _GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - " "use gnulib module vprintf-posix for portable " "POSIX compliance"); #endif #if @GNULIB_VSCANF@ # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef vscanf # define vscanf rpl_vscanf # endif _GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args)); # else _GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args)); # endif _GL_CXXALIASWARN (vscanf); #endif #if @GNULIB_VSNPRINTF@ # if @REPLACE_VSNPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vsnprintf rpl_vsnprintf # endif _GL_FUNCDECL_RPL (vsnprintf, int, (char *str, size_t size, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))); _GL_CXXALIAS_RPL (vsnprintf, int, (char *str, size_t size, const char *format, va_list args)); # else # if !@HAVE_DECL_VSNPRINTF@ _GL_FUNCDECL_SYS (vsnprintf, int, (char *str, size_t size, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))); # endif _GL_CXXALIAS_SYS (vsnprintf, int, (char *str, size_t size, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vsnprintf); #elif defined GNULIB_POSIXCHECK # undef vsnprintf # if HAVE_RAW_DECL_VSNPRINTF _GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - " "use gnulib module vsnprintf for portability"); # endif #endif #if @GNULIB_VSPRINTF_POSIX@ # if @REPLACE_VSPRINTF@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define vsprintf rpl_vsprintf # endif _GL_FUNCDECL_RPL (vsprintf, int, (char *str, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (vsprintf, int, (char *str, const char *format, va_list args)); # else /* Need to cast, because on Solaris, the third parameter is __va_list args and GCC's fixincludes did not change this to __gnuc_va_list. */ _GL_CXXALIAS_SYS_CAST (vsprintf, int, (char *str, const char *format, va_list args)); # endif _GL_CXXALIASWARN (vsprintf); #elif defined GNULIB_POSIXCHECK # undef vsprintf /* Assume vsprintf is always declared. */ _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - " "use gnulib module vsprintf-posix for portable " "POSIX compliance"); #endif #endif /* _@GUARD_PREFIX@_STDIO_H */ #endif /* _@GUARD_PREFIX@_STDIO_H */ #endif shishi-1.0.2/gl/getdelim.c0000644000000000000000000000704412126660051012234 00000000000000/* getdelim.c --- Implementation of replacement getdelim function. Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2013 Free Software Foundation, Inc. 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, 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 . */ /* Ported from glibc by Simon Josefsson. */ /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */ #define _GL_ARG_NONNULL(params) #include #include #include #include #include #include #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" # define getc_maybe_unlocked(fp) getc(fp) #elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED # undef flockfile # undef funlockfile # define flockfile(x) ((void) 0) # define funlockfile(x) ((void) 0) # define getc_maybe_unlocked(fp) getc(fp) #else # define getc_maybe_unlocked(fp) getc_unlocked(fp) #endif /* Read up to (and including) a DELIMITER from FP into *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'ed as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or EOF. */ ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { ssize_t result; size_t cur_len = 0; if (lineptr == NULL || n == NULL || fp == NULL) { errno = EINVAL; return -1; } flockfile (fp); if (*lineptr == NULL || *n == 0) { char *new_lineptr; *n = 120; new_lineptr = (char *) realloc (*lineptr, *n); if (new_lineptr == NULL) { result = -1; goto unlock_return; } *lineptr = new_lineptr; } for (;;) { int i; i = getc_maybe_unlocked (fp); if (i == EOF) { result = -1; break; } /* Make enough space for len+1 (for final NUL) bytes. */ if (cur_len + 1 >= *n) { size_t needed_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; size_t needed = 2 * *n + 1; /* Be generous. */ char *new_lineptr; if (needed_max < needed) needed = needed_max; if (cur_len + 1 >= needed) { result = -1; errno = EOVERFLOW; goto unlock_return; } new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { result = -1; goto unlock_return; } *lineptr = new_lineptr; *n = needed; } (*lineptr)[cur_len] = i; cur_len++; if (i == delimiter) break; } (*lineptr)[cur_len] = '\0'; result = cur_len ? cur_len : result; unlock_return: funlockfile (fp); /* doesn't set errno */ return result; } shishi-1.0.2/gl/netdb.in.h0000644000000000000000000002260612126660053012153 00000000000000/* Provide a netdb.h header file for systems lacking it (read: MinGW). Copyright (C) 2008-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ /* This file is supposed to be used on platforms that lack . It is intended to provide definitions and prototypes needed by an application. */ #ifndef _@GUARD_PREFIX@_NETDB_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if @HAVE_NETDB_H@ /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_NETDB_H@ #endif #ifndef _@GUARD_PREFIX@_NETDB_H #define _@GUARD_PREFIX@_NETDB_H /* Get definitions such as 'socklen_t' on IRIX 6.5 and OSF/1 4.0 and 'struct hostent' on MinGW. */ #include /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Declarations for a platform that lacks , or where it is incomplete. */ #if @GNULIB_GETADDRINFO@ # if !@HAVE_STRUCT_ADDRINFO@ # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_struct_addrinfo /* Structure to contain information about address of a service provider. */ struct addrinfo { int ai_flags; /* Input flags. */ int ai_family; /* Protocol family for socket. */ int ai_socktype; /* Socket type. */ int ai_protocol; /* Protocol for socket. */ socklen_t ai_addrlen; /* Length of socket address. */ struct sockaddr *ai_addr; /* Socket address for socket. */ char *ai_canonname; /* Canonical name for service location. */ struct addrinfo *ai_next; /* Pointer to next in list. */ }; # define GNULIB_defined_struct_addrinfo 1 # endif # ifdef __cplusplus } # endif # endif /* Possible values for 'ai_flags' field in 'addrinfo' structure. */ # ifndef AI_PASSIVE # define AI_PASSIVE 0x0001 /* Socket address is intended for 'bind'. */ # endif # ifndef AI_CANONNAME # define AI_CANONNAME 0x0002 /* Request for canonical name. */ # endif # ifndef AI_NUMERICSERV # define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */ # endif # if 0 # define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */ # endif /* These symbolic constants are required to be present by POSIX, but our getaddrinfo replacement doesn't use them (yet). Setting them to 0 on systems that doesn't have them avoids causing problems for system getaddrinfo implementations that would be confused by unknown values. */ # ifndef AI_V4MAPPED # define AI_V4MAPPED 0 /* 0x0008: IPv4 mapped addresses are acceptable. */ # endif # ifndef AI_ALL # define AI_ALL 0 /* 0x0010: Return IPv4 mapped and IPv6 addresses. */ # endif # ifndef AI_ADDRCONFIG # define AI_ADDRCONFIG 0 /* 0x0020: Use configuration of this host to choose returned address type. */ # endif /* Error values for 'getaddrinfo' function. */ # ifndef EAI_BADFLAGS # define EAI_BADFLAGS -1 /* Invalid value for 'ai_flags' field. */ # define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ # define EAI_AGAIN -3 /* Temporary failure in name resolution. */ # define EAI_FAIL -4 /* Non-recoverable failure in name res. */ # define EAI_NODATA -5 /* No address associated with NAME. */ # define EAI_FAMILY -6 /* 'ai_family' not supported. */ # define EAI_SOCKTYPE -7 /* 'ai_socktype' not supported. */ # define EAI_SERVICE -8 /* SERVICE not supported for 'ai_socktype'. */ # define EAI_MEMORY -10 /* Memory allocation failure. */ # endif /* Since EAI_NODATA is deprecated by RFC3493, some systems (at least FreeBSD, which does define EAI_BADFLAGS) have removed the definition in favor of EAI_NONAME. */ # if !defined EAI_NODATA && defined EAI_NONAME # define EAI_NODATA EAI_NONAME # endif # ifndef EAI_OVERFLOW /* Not defined on mingw32 and Haiku. */ # define EAI_OVERFLOW -12 /* Argument buffer overflow. */ # endif # ifndef EAI_ADDRFAMILY /* Not defined on mingw32. */ # define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */ # endif # ifndef EAI_SYSTEM /* Not defined on mingw32. */ # define EAI_SYSTEM -11 /* System error returned in 'errno'. */ # endif # if 0 /* The commented out definitions below are not yet implemented in the GNULIB getaddrinfo() replacement, so are not yet needed. If they are restored, be sure to protect the definitions with #ifndef. */ # ifndef EAI_INPROGRESS # define EAI_INPROGRESS -100 /* Processing request in progress. */ # define EAI_CANCELED -101 /* Request canceled. */ # define EAI_NOTCANCELED -102 /* Request not canceled. */ # define EAI_ALLDONE -103 /* All requests done. */ # define EAI_INTR -104 /* Interrupted by a signal. */ # define EAI_IDN_ENCODE -105 /* IDN encoding failed. */ # endif # endif # if !@HAVE_DECL_GETADDRINFO@ /* Translate name of a service location and/or a service name to set of socket addresses. For more details, see the POSIX:2001 specification . */ _GL_FUNCDECL_SYS (getaddrinfo, int, (const char *restrict nodename, const char *restrict servname, const struct addrinfo *restrict hints, struct addrinfo **restrict res) _GL_ARG_NONNULL ((4))); # endif _GL_CXXALIAS_SYS (getaddrinfo, int, (const char *restrict nodename, const char *restrict servname, const struct addrinfo *restrict hints, struct addrinfo **restrict res)); _GL_CXXALIASWARN (getaddrinfo); # if !@HAVE_DECL_FREEADDRINFO@ /* Free 'addrinfo' structure AI including associated storage. For more details, see the POSIX:2001 specification . */ _GL_FUNCDECL_SYS (freeaddrinfo, void, (struct addrinfo *ai) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (freeaddrinfo, void, (struct addrinfo *ai)); _GL_CXXALIASWARN (freeaddrinfo); # if @REPLACE_GAI_STRERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gai_strerror # define gai_strerror rpl_gai_strerror # endif _GL_FUNCDECL_RPL (gai_strerror, const char *, (int ecode)); _GL_CXXALIAS_RPL (gai_strerror, const char *, (int ecode)); # else # if !@HAVE_DECL_GAI_STRERROR@ /* Convert error return from getaddrinfo() to a string. For more details, see the POSIX:2001 specification . */ _GL_FUNCDECL_SYS (gai_strerror, const char *, (int ecode)); # endif _GL_CXXALIAS_SYS (gai_strerror, const char *, (int ecode)); # endif _GL_CXXALIASWARN (gai_strerror); # if !@HAVE_DECL_GETNAMEINFO@ /* Convert socket address to printable node and service names. For more details, see the POSIX:2001 specification . */ _GL_FUNCDECL_SYS (getnameinfo, int, (const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on glibc systems, the seventh parameter is unsigned int flags. */ _GL_CXXALIAS_SYS_CAST (getnameinfo, int, (const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags)); _GL_CXXALIASWARN (getnameinfo); /* Possible flags for getnameinfo. */ # ifndef NI_NUMERICHOST # define NI_NUMERICHOST 1 # endif # ifndef NI_NUMERICSERV # define NI_NUMERICSERV 2 # endif #elif defined GNULIB_POSIXCHECK # undef getaddrinfo # if HAVE_RAW_DECL_GETADDRINFO _GL_WARN_ON_USE (getaddrinfo, "getaddrinfo is unportable - " "use gnulib module getaddrinfo for portability"); # endif # undef freeaddrinfo # if HAVE_RAW_DECL_FREEADDRINFO _GL_WARN_ON_USE (freeaddrinfo, "freeaddrinfo is unportable - " "use gnulib module getaddrinfo for portability"); # endif # undef gai_strerror # if HAVE_RAW_DECL_GAI_STRERROR _GL_WARN_ON_USE (gai_strerror, "gai_strerror is unportable - " "use gnulib module getaddrinfo for portability"); # endif # undef getnameinfo # if HAVE_RAW_DECL_GETNAMEINFO _GL_WARN_ON_USE (getnameinfo, "getnameinfo is unportable - " "use gnulib module getaddrinfo for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_NETDB_H */ #endif /* _@GUARD_PREFIX@_NETDB_H */ shishi-1.0.2/gl/strchrnul.c0000644000000000000000000001301512126660053012463 00000000000000/* Searching in a string. Copyright (C) 2003, 2007-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include /* Find the first occurrence of C in S or the final NUL byte. */ char * strchrnul (const char *s, int c_in) { /* On 32-bit hardware, choosing longword to be a 32-bit unsigned long instead of a 64-bit uintmax_t tends to give better performance. On 64-bit hardware, unsigned long is generally 64 bits already. Change this typedef to experiment with performance. */ typedef unsigned long int longword; const unsigned char *char_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c; unsigned char c; c = (unsigned char) c_in; if (!c) return rawmemchr (s, 0); /* Handle the first few bytes by reading one byte at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; (size_t) char_ptr % sizeof (longword) != 0; ++char_ptr) if (!*char_ptr || *char_ptr == c) return (char *) char_ptr; longword_ptr = (const longword *) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ /* Compute auxiliary longword values: repeated_one is a value which has a 1 in every byte. repeated_c has c in every byte. */ repeated_one = 0x01010101; repeated_c = c | (c << 8); repeated_c |= repeated_c << 16; if (0xffffffffU < (longword) -1) { repeated_one |= repeated_one << 31 << 1; repeated_c |= repeated_c << 31 << 1; if (8 < sizeof (longword)) { size_t i; for (i = 64; i < sizeof (longword) * 8; i *= 2) { repeated_one |= repeated_one << i; repeated_c |= repeated_c << i; } } } /* Instead of the traditional loop which tests each byte, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are equal to NUL or c. We first use an xor with repeated_c. This reduces the task to testing whether *any of the four* bytes in longword1 or longword2 is zero. Let's consider longword1. We compute tmp = ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). That is, we perform the following operations: 1. Subtract repeated_one. 2. & ~longword1. 3. & a mask consisting of 0x80 in every byte. Consider what happens in each byte: - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, and step 3 transforms it into 0x80. A carry can also be propagated to more significant bytes. - If a byte of longword1 is nonzero, let its lowest 1 bit be at position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, the byte ends in a single bit of value 0 and k bits of value 1. After step 2, the result is just k bits of value 1: 2^k - 1. After step 3, the result is 0. And no carry is produced. So, if longword1 has only non-zero bytes, tmp is zero. Whereas if longword1 has a zero byte, call j the position of the least significant zero byte. Then the result has a zero at positions 0, ..., j-1 and a 0x80 at position j. We cannot predict the result at the more significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. The test whether any byte in longword1 or longword2 is zero is equivalent to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine this into a single test, whether (tmp1 | tmp2) is nonzero. This test can read more than one byte beyond the end of a string, depending on where the terminating NUL is encountered. However, this is considered safe since the initialization phase ensured that the read will be aligned, therefore, the read will not cross page boundaries and will not cause a fault. */ while (1) { longword longword1 = *longword_ptr ^ repeated_c; longword longword2 = *longword_ptr; if (((((longword1 - repeated_one) & ~longword1) | ((longword2 - repeated_one) & ~longword2)) & (repeated_one << 7)) != 0) break; longword_ptr++; } char_ptr = (const unsigned char *) longword_ptr; /* At this point, we know that one of the sizeof (longword) bytes starting at char_ptr is == 0 or == c. On little-endian machines, we could determine the first such byte without any further memory accesses, just by looking at the tmp result from the last loop iteration. But this does not work on big-endian machines. Choose code that works in both cases. */ char_ptr = (unsigned char *) longword_ptr; while (*char_ptr && (*char_ptr != c)) char_ptr++; return (char *) char_ptr; } shishi-1.0.2/gl/getline.c0000644000000000000000000000166612126660051012075 00000000000000/* getline.c --- Implementation of replacement getline function. Copyright (C) 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Simon Josefsson. */ #include #include ssize_t getline (char **lineptr, size_t *n, FILE *stream) { return getdelim (lineptr, n, '\n', stream); } shishi-1.0.2/gl/sys_stat.in.h0000644000000000000000000004767112126660054012742 00000000000000/* Provide a more complete sys/stat header file. Copyright (C) 2005-2013 Free Software Foundation, Inc. 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, 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 . */ /* Written by Eric Blake, Paul Eggert, and Jim Meyering. */ /* This file is supposed to be used on platforms where is incomplete. It is intended to provide definitions and prototypes needed by an application. Start with what the system provides. */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_system_sys_stat_h /* Special invocation convention. */ #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SYS_STAT_H /* Get nlink_t. May also define off_t to a 64-bit type on native Windows. */ #include /* Get struct timespec. */ #include /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ #ifndef _@GUARD_PREFIX@_SYS_STAT_H #define _@GUARD_PREFIX@_SYS_STAT_H /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Before doing "#define mkdir rpl_mkdir" below, we need to include all headers that may declare mkdir(). Native Windows platforms declare mkdir in and/or , not in . */ #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # include /* mingw32, mingw64 */ # include /* mingw64, MSVC 9 */ #endif /* Native Windows platforms declare umask() in . */ #if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) # include #endif /* Large File Support on native Windows. */ #if @WINDOWS_64_BIT_ST_SIZE@ # define stat _stati64 #endif #ifndef S_IFIFO # ifdef _S_IFIFO # define S_IFIFO _S_IFIFO # endif #endif #ifndef S_IFMT # define S_IFMT 0170000 #endif #if STAT_MACROS_BROKEN # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISLNK # undef S_ISNAM # undef S_ISMPB # undef S_ISMPC # undef S_ISNWK # undef S_ISREG # undef S_ISSOCK #endif #ifndef S_ISBLK # ifdef S_IFBLK # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) # else # define S_ISBLK(m) 0 # endif #endif #ifndef S_ISCHR # ifdef S_IFCHR # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) # else # define S_ISCHR(m) 0 # endif #endif #ifndef S_ISDIR # ifdef S_IFDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # else # define S_ISDIR(m) 0 # endif #endif #ifndef S_ISDOOR /* Solaris 2.5 and up */ # define S_ISDOOR(m) 0 #endif #ifndef S_ISFIFO # ifdef S_IFIFO # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) # else # define S_ISFIFO(m) 0 # endif #endif #ifndef S_ISLNK # ifdef S_IFLNK # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) # else # define S_ISLNK(m) 0 # endif #endif #ifndef S_ISMPB /* V7 */ # ifdef S_IFMPB # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) # else # define S_ISMPB(m) 0 # define S_ISMPC(m) 0 # endif #endif #ifndef S_ISMPX /* AIX */ # define S_ISMPX(m) 0 #endif #ifndef S_ISNAM /* Xenix */ # ifdef S_IFNAM # define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM) # else # define S_ISNAM(m) 0 # endif #endif #ifndef S_ISNWK /* HP/UX */ # ifdef S_IFNWK # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) # else # define S_ISNWK(m) 0 # endif #endif #ifndef S_ISPORT /* Solaris 10 and up */ # define S_ISPORT(m) 0 #endif #ifndef S_ISREG # ifdef S_IFREG # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) # else # define S_ISREG(m) 0 # endif #endif #ifndef S_ISSOCK # ifdef S_IFSOCK # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) # else # define S_ISSOCK(m) 0 # endif #endif #ifndef S_TYPEISMQ # define S_TYPEISMQ(p) 0 #endif #ifndef S_TYPEISTMO # define S_TYPEISTMO(p) 0 #endif #ifndef S_TYPEISSEM # ifdef S_INSEM # define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM) # else # define S_TYPEISSEM(p) 0 # endif #endif #ifndef S_TYPEISSHM # ifdef S_INSHD # define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD) # else # define S_TYPEISSHM(p) 0 # endif #endif /* high performance ("contiguous data") */ #ifndef S_ISCTG # define S_ISCTG(p) 0 #endif /* Cray DMF (data migration facility): off line, with data */ #ifndef S_ISOFD # define S_ISOFD(p) 0 #endif /* Cray DMF (data migration facility): off line, with no data */ #ifndef S_ISOFL # define S_ISOFL(p) 0 #endif /* 4.4BSD whiteout */ #ifndef S_ISWHT # define S_ISWHT(m) 0 #endif /* If any of the following are undefined, define them to their de facto standard values. */ #if !S_ISUID # define S_ISUID 04000 #endif #if !S_ISGID # define S_ISGID 02000 #endif /* S_ISVTX is a common extension to POSIX. */ #ifndef S_ISVTX # define S_ISVTX 01000 #endif #if !S_IRUSR && S_IREAD # define S_IRUSR S_IREAD #endif #if !S_IRUSR # define S_IRUSR 00400 #endif #if !S_IRGRP # define S_IRGRP (S_IRUSR >> 3) #endif #if !S_IROTH # define S_IROTH (S_IRUSR >> 6) #endif #if !S_IWUSR && S_IWRITE # define S_IWUSR S_IWRITE #endif #if !S_IWUSR # define S_IWUSR 00200 #endif #if !S_IWGRP # define S_IWGRP (S_IWUSR >> 3) #endif #if !S_IWOTH # define S_IWOTH (S_IWUSR >> 6) #endif #if !S_IXUSR && S_IEXEC # define S_IXUSR S_IEXEC #endif #if !S_IXUSR # define S_IXUSR 00100 #endif #if !S_IXGRP # define S_IXGRP (S_IXUSR >> 3) #endif #if !S_IXOTH # define S_IXOTH (S_IXUSR >> 6) #endif #if !S_IRWXU # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) #endif #if !S_IRWXG # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) #endif #if !S_IRWXO # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) #endif /* S_IXUGO is a common extension to POSIX. */ #if !S_IXUGO # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif #ifndef S_IRWXUGO # define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) #endif /* Macros for futimens and utimensat. */ #ifndef UTIME_NOW # define UTIME_NOW (-1) # define UTIME_OMIT (-2) #endif #if @GNULIB_FCHMODAT@ # if !@HAVE_FCHMODAT@ _GL_FUNCDECL_SYS (fchmodat, int, (int fd, char const *file, mode_t mode, int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (fchmodat, int, (int fd, char const *file, mode_t mode, int flag)); _GL_CXXALIASWARN (fchmodat); #elif defined GNULIB_POSIXCHECK # undef fchmodat # if HAVE_RAW_DECL_FCHMODAT _GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FSTAT@ # if @REPLACE_FSTAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fstat # define fstat rpl_fstat # endif _GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf)); # else _GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf)); # endif _GL_CXXALIASWARN (fstat); #elif @WINDOWS_64_BIT_ST_SIZE@ /* Above, we define stat to _stati64. */ # define fstat _fstati64 #elif defined GNULIB_POSIXCHECK # undef fstat # if HAVE_RAW_DECL_FSTAT _GL_WARN_ON_USE (fstat, "fstat has portability problems - " "use gnulib module fstat for portability"); # endif #endif #if @GNULIB_FSTATAT@ # if @REPLACE_FSTATAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef fstatat # define fstatat rpl_fstatat # endif _GL_FUNCDECL_RPL (fstatat, int, (int fd, char const *name, struct stat *st, int flags) _GL_ARG_NONNULL ((2, 3))); _GL_CXXALIAS_RPL (fstatat, int, (int fd, char const *name, struct stat *st, int flags)); # else # if !@HAVE_FSTATAT@ _GL_FUNCDECL_SYS (fstatat, int, (int fd, char const *name, struct stat *st, int flags) _GL_ARG_NONNULL ((2, 3))); # endif _GL_CXXALIAS_SYS (fstatat, int, (int fd, char const *name, struct stat *st, int flags)); # endif _GL_CXXALIASWARN (fstatat); #elif defined GNULIB_POSIXCHECK # undef fstatat # if HAVE_RAW_DECL_FSTATAT _GL_WARN_ON_USE (fstatat, "fstatat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_FUTIMENS@ /* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens implementation relies on futimesat, which on Solaris 10 makes an invocation to futimens that is meant to invoke the libc's futimens(), not gnulib's futimens(). */ # if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef futimens # define futimens rpl_futimens # endif _GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2])); _GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2])); # else # if !@HAVE_FUTIMENS@ _GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2])); # endif _GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2])); # endif # if @HAVE_FUTIMENS@ _GL_CXXALIASWARN (futimens); # endif #elif defined GNULIB_POSIXCHECK # undef futimens # if HAVE_RAW_DECL_FUTIMENS _GL_WARN_ON_USE (futimens, "futimens is not portable - " "use gnulib module futimens for portability"); # endif #endif #if @GNULIB_LCHMOD@ /* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME denotes a symbolic link. */ # if !@HAVE_LCHMOD@ /* The lchmod replacement follows symbolic links. Callers should take this into account; lchmod should be applied only to arguments that are known to not be symbolic links. On hosts that lack lchmod, this can lead to race conditions between the check and the invocation of lchmod, but we know of no workarounds that are reliable in general. You might try requesting support for lchmod from your operating system supplier. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define lchmod chmod # endif /* Need to cast, because on mingw, the second parameter of chmod is int mode. */ _GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int, (const char *filename, mode_t mode)); # else # if 0 /* assume already declared */ _GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode)); # endif # if @HAVE_LCHMOD@ _GL_CXXALIASWARN (lchmod); # endif #elif defined GNULIB_POSIXCHECK # undef lchmod # if HAVE_RAW_DECL_LCHMOD _GL_WARN_ON_USE (lchmod, "lchmod is unportable - " "use gnulib module lchmod for portability"); # endif #endif #if @GNULIB_LSTAT@ # if ! @HAVE_LSTAT@ /* mingw does not support symlinks, therefore it does not have lstat. But without links, stat does just fine. */ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define lstat stat # endif _GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf)); # elif @REPLACE_LSTAT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef lstat # define lstat rpl_lstat # endif _GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf) _GL_ARG_NONNULL ((1, 2))); _GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf)); # else _GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf)); # endif # if @HAVE_LSTAT@ _GL_CXXALIASWARN (lstat); # endif #elif defined GNULIB_POSIXCHECK # undef lstat # if HAVE_RAW_DECL_LSTAT _GL_WARN_ON_USE (lstat, "lstat is unportable - " "use gnulib module lstat for portability"); # endif #endif #if @REPLACE_MKDIR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mkdir # define mkdir rpl_mkdir # endif _GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); #else /* mingw's _mkdir() function has 1 argument, but we pass 2 arguments. Additionally, it declares _mkdir (and depending on compile flags, an alias mkdir), only in the nonstandard includes and , which are included above. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # if !GNULIB_defined_rpl_mkdir static int rpl_mkdir (char const *name, mode_t mode) { return _mkdir (name); } # define GNULIB_defined_rpl_mkdir 1 # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define mkdir rpl_mkdir # endif _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); # else _GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode)); # endif #endif _GL_CXXALIASWARN (mkdir); #if @GNULIB_MKDIRAT@ # if !@HAVE_MKDIRAT@ _GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)); _GL_CXXALIASWARN (mkdirat); #elif defined GNULIB_POSIXCHECK # undef mkdirat # if HAVE_RAW_DECL_MKDIRAT _GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - " "use gnulib module openat for portability"); # endif #endif #if @GNULIB_MKFIFO@ # if @REPLACE_MKFIFO@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mkfifo # define mkfifo rpl_mkfifo # endif _GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode)); # else # if !@HAVE_MKFIFO@ _GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode)); # endif _GL_CXXALIASWARN (mkfifo); #elif defined GNULIB_POSIXCHECK # undef mkfifo # if HAVE_RAW_DECL_MKFIFO _GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - " "use gnulib module mkfifo for portability"); # endif #endif #if @GNULIB_MKFIFOAT@ # if !@HAVE_MKFIFOAT@ _GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)); _GL_CXXALIASWARN (mkfifoat); #elif defined GNULIB_POSIXCHECK # undef mkfifoat # if HAVE_RAW_DECL_MKFIFOAT _GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - " "use gnulib module mkfifoat for portability"); # endif #endif #if @GNULIB_MKNOD@ # if @REPLACE_MKNOD@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef mknod # define mknod rpl_mknod # endif _GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)); # else # if !@HAVE_MKNOD@ _GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((1))); # endif /* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */ _GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev)); # endif _GL_CXXALIASWARN (mknod); #elif defined GNULIB_POSIXCHECK # undef mknod # if HAVE_RAW_DECL_MKNOD _GL_WARN_ON_USE (mknod, "mknod is not portable - " "use gnulib module mknod for portability"); # endif #endif #if @GNULIB_MKNODAT@ # if !@HAVE_MKNODAT@ _GL_FUNCDECL_SYS (mknodat, int, (int fd, char const *file, mode_t mode, dev_t dev) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (mknodat, int, (int fd, char const *file, mode_t mode, dev_t dev)); _GL_CXXALIASWARN (mknodat); #elif defined GNULIB_POSIXCHECK # undef mknodat # if HAVE_RAW_DECL_MKNODAT _GL_WARN_ON_USE (mknodat, "mknodat is not portable - " "use gnulib module mkfifoat for portability"); # endif #endif #if @GNULIB_STAT@ # if @REPLACE_STAT@ /* We can't use the object-like #define stat rpl_stat, because of struct stat. This means that rpl_stat will not be used if the user does (stat)(a,b). Oh well. */ # if defined _AIX && defined stat && defined _LARGE_FILES /* With _LARGE_FILES defined, AIX (only) defines stat to stat64, so we have to replace stat64() instead of stat(). */ # undef stat64 # define stat64(name, st) rpl_stat (name, st) # elif @WINDOWS_64_BIT_ST_SIZE@ /* Above, we define stat to _stati64. */ # if defined __MINGW32__ && defined _stati64 # ifndef _USE_32BIT_TIME_T /* The system headers define _stati64 to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # elif defined _MSC_VER && defined _stati64 # ifdef _USE_32BIT_TIME_T /* The system headers define _stati64 to _stat32i64. */ # undef _stat32i64 # define _stat32i64(name, st) rpl_stat (name, st) # else /* The system headers define _stati64 to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # else # undef _stati64 # define _stati64(name, st) rpl_stat (name, st) # endif # elif defined __MINGW32__ && defined stat # ifdef _USE_32BIT_TIME_T /* The system headers define stat to _stat32i64. */ # undef _stat32i64 # define _stat32i64(name, st) rpl_stat (name, st) # else /* The system headers define stat to _stat64. */ # undef _stat64 # define _stat64(name, st) rpl_stat (name, st) # endif # elif defined _MSC_VER && defined stat # ifdef _USE_32BIT_TIME_T /* The system headers define stat to _stat32. */ # undef _stat32 # define _stat32(name, st) rpl_stat (name, st) # else /* The system headers define stat to _stat64i32. */ # undef _stat64i32 # define _stat64i32(name, st) rpl_stat (name, st) # endif # else /* !(_AIX ||__MINGW32__ || _MSC_VER) */ # undef stat # define stat(name, st) rpl_stat (name, st) # endif /* !_LARGE_FILES */ _GL_EXTERN_C int stat (const char *name, struct stat *buf) _GL_ARG_NONNULL ((1, 2)); # endif #elif defined GNULIB_POSIXCHECK # undef stat # if HAVE_RAW_DECL_STAT _GL_WARN_ON_USE (stat, "stat is unportable - " "use gnulib module stat for portability"); # endif #endif #if @GNULIB_UTIMENSAT@ /* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat implementation relies on futimesat, which on Solaris 10 makes an invocation to utimensat that is meant to invoke the libc's utimensat(), not gnulib's utimensat(). */ # if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun) # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef utimensat # define utimensat rpl_utimensat # endif _GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag) _GL_ARG_NONNULL ((2))); _GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag)); # else # if !@HAVE_UTIMENSAT@ _GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag) _GL_ARG_NONNULL ((2))); # endif _GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name, struct timespec const times[2], int flag)); # endif # if @HAVE_UTIMENSAT@ _GL_CXXALIASWARN (utimensat); # endif #elif defined GNULIB_POSIXCHECK # undef utimensat # if HAVE_RAW_DECL_UTIMENSAT _GL_WARN_ON_USE (utimensat, "utimensat is not portable - " "use gnulib module utimensat for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_SYS_STAT_H */ #endif /* _@GUARD_PREFIX@_SYS_STAT_H */ #endif shishi-1.0.2/gl/w32sock.h0000644000000000000000000000634112126660054011744 00000000000000/* w32sock.h --- internal auxiliary functions for Windows socket functions Copyright (C) 2008-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paolo Bonzini */ #include /* Get O_RDWR and O_BINARY. */ #include /* Get _open_osfhandle(). */ #include /* Get _get_osfhandle(). */ #include "msvc-nothrow.h" #define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd))) #define SOCKET_TO_FD(fh) (_open_osfhandle ((intptr_t) (fh), O_RDWR | O_BINARY)) static inline void set_winsock_errno (void) { int err = WSAGetLastError (); /* Map some WSAE* errors to the runtime library's error codes. */ switch (err) { case WSA_INVALID_HANDLE: errno = EBADF; break; case WSA_NOT_ENOUGH_MEMORY: errno = ENOMEM; break; case WSA_INVALID_PARAMETER: errno = EINVAL; break; case WSAENAMETOOLONG: errno = ENAMETOOLONG; break; case WSAENOTEMPTY: errno = ENOTEMPTY; break; case WSAEWOULDBLOCK: errno = EWOULDBLOCK; break; case WSAEINPROGRESS: errno = EINPROGRESS; break; case WSAEALREADY: errno = EALREADY; break; case WSAENOTSOCK: errno = ENOTSOCK; break; case WSAEDESTADDRREQ: errno = EDESTADDRREQ; break; case WSAEMSGSIZE: errno = EMSGSIZE; break; case WSAEPROTOTYPE: errno = EPROTOTYPE; break; case WSAENOPROTOOPT: errno = ENOPROTOOPT; break; case WSAEPROTONOSUPPORT: errno = EPROTONOSUPPORT; break; case WSAEOPNOTSUPP: errno = EOPNOTSUPP; break; case WSAEAFNOSUPPORT: errno = EAFNOSUPPORT; break; case WSAEADDRINUSE: errno = EADDRINUSE; break; case WSAEADDRNOTAVAIL: errno = EADDRNOTAVAIL; break; case WSAENETDOWN: errno = ENETDOWN; break; case WSAENETUNREACH: errno = ENETUNREACH; break; case WSAENETRESET: errno = ENETRESET; break; case WSAECONNABORTED: errno = ECONNABORTED; break; case WSAECONNRESET: errno = ECONNRESET; break; case WSAENOBUFS: errno = ENOBUFS; break; case WSAEISCONN: errno = EISCONN; break; case WSAENOTCONN: errno = ENOTCONN; break; case WSAETIMEDOUT: errno = ETIMEDOUT; break; case WSAECONNREFUSED: errno = ECONNREFUSED; break; case WSAELOOP: errno = ELOOP; break; case WSAEHOSTUNREACH: errno = EHOSTUNREACH; break; default: errno = (err > 10000 && err < 10025) ? err - 10000 : err; break; } } shishi-1.0.2/gl/intprops.h0000644000000000000000000003500612126660051012324 00000000000000/* intprops.h -- properties of integer types Copyright (C) 2001-2005, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert. */ #ifndef _GL_INTPROPS_H #define _GL_INTPROPS_H #include /* Return an integer value, converted to the same type as the integer expression E after integer type promotion. V is the unconverted value. */ #define _GL_INT_CONVERT(e, v) (0 * (e) + (v)) /* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see . */ #define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v)) /* The extra casts in the following macros work around compiler bugs, e.g., in Cray C 5.0.3.0. */ /* True if the arithmetic type T is an integer type. bool counts as an integer. */ #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) /* True if negative values of the signed integer type T use two's complement, ones' complement, or signed magnitude representation, respectively. Much GNU code assumes two's complement, but some people like to be portable to all possible C hosts. */ #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) #define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) #define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) /* True if the signed integer expression E uses two's complement. */ #define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1) /* True if the arithmetic type T is signed. */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) /* Return 1 if the integer expression E, after integer promotion, has a signed type. */ #define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0) /* Minimum and maximum values for integer types and expressions. These macros have undefined behavior if T is signed and has padding bits. If this is a problem for you, please let us know how to fix it for your host. */ /* The maximum and minimum values for the integer type T. */ #define TYPE_MINIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) 0 \ : TYPE_SIGNED_MAGNITUDE (t) \ ? ~ (t) 0 \ : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) /* The maximum and minimum values for the type of the expression E, after integer promotion. E should not have side effects. */ #define _GL_INT_MINIMUM(e) \ (_GL_INT_SIGNED (e) \ ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \ : _GL_INT_CONVERT (e, 0)) #define _GL_INT_MAXIMUM(e) \ (_GL_INT_SIGNED (e) \ ? _GL_SIGNED_INT_MAXIMUM (e) \ : _GL_INT_NEGATE_CONVERT (e, 1)) #define _GL_SIGNED_INT_MAXIMUM(e) \ (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1) /* Return 1 if the __typeof__ keyword works. This could be done by 'configure', but for now it's easier to do it by hand. */ #if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C # define _GL_HAVE___TYPEOF__ 1 #else # define _GL_HAVE___TYPEOF__ 0 #endif /* Return 1 if the integer type or expression T might be signed. Return 0 if it is definitely unsigned. This macro does not evaluate its argument, and expands to an integer constant expression. */ #if _GL_HAVE___TYPEOF__ # define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t)) #else # define _GL_SIGNED_TYPE_OR_EXPR(t) 1 #endif /* Bound on length of the string representing an unsigned integer value representable in B bits. log10 (2.0) < 146/485. The smallest value of B where this bound is not tight is 2621. */ #define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485) /* Bound on length of the string representing an integer type or expression T. Subtract 1 for the sign bit if T is signed, and then add 1 more for a minus sign if needed. Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is signed, this macro may overestimate the true bound by one byte when applied to unsigned types of size 2, 4, 16, ... bytes. */ #define INT_STRLEN_BOUND(t) \ (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \ - _GL_SIGNED_TYPE_OR_EXPR (t)) \ + _GL_SIGNED_TYPE_OR_EXPR (t)) /* Bound on buffer size needed to represent an integer type or expression T, including the terminating null. */ #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) /* Range overflow checks. The INT__RANGE_OVERFLOW macros return 1 if the corresponding C operators might not yield numerically correct answers due to arithmetic overflow. They do not rely on undefined or implementation-defined behavior. Their implementations are simple and straightforward, but they are a bit harder to use than the INT__OVERFLOW macros described below. Example usage: long int i = ...; long int j = ...; if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX)) printf ("multiply would overflow"); else printf ("product is %ld", i * j); Restrictions on *_RANGE_OVERFLOW macros: These macros do not check for all possible numerical problems or undefined or unspecified behavior: they do not check for division by zero, for bad shift counts, or for shifting negative numbers. These macros may evaluate their arguments zero or multiple times, so the arguments should not have side effects. The arithmetic arguments (including the MIN and MAX arguments) must be of the same integer type after the usual arithmetic conversions, and the type must have minimum value MIN and maximum MAX. Unsigned types should use a zero MIN of the proper type. These macros are tuned for constant MIN and MAX. For commutative operations such as A + B, they are also tuned for constant B. */ /* Return 1 if A + B would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? (a) < (min) - (b) \ : (max) - (b) < (a)) /* Return 1 if A - B would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? (max) + (b) < (a) \ : (a) < (min) + (b)) /* Return 1 if - A would overflow in [MIN,MAX] arithmetic. See above for restrictions. */ #define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \ ((min) < 0 \ ? (a) < - (max) \ : 0 < (a)) /* Return 1 if A * B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Avoid && and || as they tickle bugs in Sun C 5.11 2010/08/13 and other compilers; see . */ #define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \ ((b) < 0 \ ? ((a) < 0 \ ? (a) < (max) / (b) \ : (b) == -1 \ ? 0 \ : (min) / (b) < (a)) \ : (b) == 0 \ ? 0 \ : ((a) < 0 \ ? (a) < (min) / (b) \ : (max) / (b) < (a))) /* Return 1 if A / B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Do not check for division by zero. */ #define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \ ((min) < 0 && (b) == -1 && (a) < - (max)) /* Return 1 if A % B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Do not check for division by zero. Mathematically, % should never overflow, but on x86-like hosts INT_MIN % -1 traps, and the C standard permits this, so treat this as an overflow too. */ #define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \ INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max) /* Return 1 if A << B would overflow in [MIN,MAX] arithmetic. See above for restrictions. Here, MIN and MAX are for A only, and B need not be of the same type as the other arguments. The C standard says that behavior is undefined for shifts unless 0 <= B < wordwidth, and that when A is negative then A << B has undefined behavior and A >> B has implementation-defined behavior, but do not check these other restrictions. */ #define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \ ((a) < 0 \ ? (a) < (min) >> (b) \ : (max) >> (b) < (a)) /* The _GL*_OVERFLOW macros have the same restrictions as the *_RANGE_OVERFLOW macros, except that they do not assume that operands (e.g., A and B) have the same type as MIN and MAX. Instead, they assume that the result (e.g., A + B) has that type. */ #define _GL_ADD_OVERFLOW(a, b, min, max) \ ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \ : (a) < 0 ? (b) <= (a) + (b) \ : (b) < 0 ? (a) <= (a) + (b) \ : (a) + (b) < (b)) #define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \ ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \ : (a) < 0 ? 1 \ : (b) < 0 ? (a) - (b) <= (a) \ : (a) < (b)) #define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \ (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \ || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max)) #define _GL_DIVIDE_OVERFLOW(a, b, min, max) \ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ : (a) < 0 ? (b) <= (a) + (b) - 1 \ : (b) < 0 && (a) + (b) <= (a)) #define _GL_REMAINDER_OVERFLOW(a, b, min, max) \ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \ : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max)) /* Return a nonzero value if A is a mathematical multiple of B, where A is unsigned, B is negative, and MAX is the maximum value of A's type. A's type must be the same as (A % B)'s type. Normally (A % -B == 0) suffices, but things get tricky if -B would overflow. */ #define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \ (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \ ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \ ? (a) \ : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \ : (a) % - (b)) \ == 0) /* Integer overflow checks. The INT__OVERFLOW macros return 1 if the corresponding C operators might not yield numerically correct answers due to arithmetic overflow. They work correctly on all known practical hosts, and do not rely on undefined behavior due to signed arithmetic overflow. Example usage: long int i = ...; long int j = ...; if (INT_MULTIPLY_OVERFLOW (i, j)) printf ("multiply would overflow"); else printf ("product is %ld", i * j); These macros do not check for all possible numerical problems or undefined or unspecified behavior: they do not check for division by zero, for bad shift counts, or for shifting negative numbers. These macros may evaluate their arguments zero or multiple times, so the arguments should not have side effects. These macros are tuned for their last argument being a constant. Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B, A % B, and A << B would overflow, respectively. */ #define INT_ADD_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW) #define INT_SUBTRACT_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW) #define INT_NEGATE_OVERFLOW(a) \ INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) #define INT_MULTIPLY_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW) #define INT_DIVIDE_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW) #define INT_REMAINDER_OVERFLOW(a, b) \ _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW) #define INT_LEFT_SHIFT_OVERFLOW(a, b) \ INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \ _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) /* Return 1 if the expression A B would overflow, where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test, assuming MIN and MAX are the minimum and maximum for the result type. Arguments should be free of side effects. */ #define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \ op_result_overflow (a, b, \ _GL_INT_MINIMUM (0 * (b) + (a)), \ _GL_INT_MAXIMUM (0 * (b) + (a))) #endif /* _GL_INTPROPS_H */ shishi-1.0.2/gl/vasnprintf.h0000644000000000000000000000560012126660054012640 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 2002-2004, 2007-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _VASNPRINTF_H #define _VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include /* The __attribute__ feature is available in gcc versions 2.5 and later. The __-protected variants of the attributes 'format' and 'printf' are accepted by gcc versions 2.6.4 (effectively 2.7) and later. We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because gnulib and libintl do '#define printf __printf__' when they override the 'printf' function. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ #endif #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. When dynamic memory allocation occurs, the preallocated buffer is left alone (with possibly modified contents). This makes it possible to use a statically allocated or stack-allocated buffer, like this: char buf[100]; size_t len = sizeof (buf); char *output = vasnprintf (buf, &len, format, args); if (output == NULL) ... error handling ...; else { ... use the output string ...; if (output != buf) free (output); } */ #if REPLACE_VASNPRINTF # define asnprintf rpl_asnprintf # define vasnprintf rpl_vasnprintf #endif extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0)); #ifdef __cplusplus } #endif #endif /* _VASNPRINTF_H */ shishi-1.0.2/gl/Makefile.in0000644000000000000000000040406612126772725012364 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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 file 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 file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # Reproduce by: gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --avoid=xalloc-die --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files arpa_inet autobuild base64 bind close connect crc crypto/arcfour crypto/gc-des crypto/gc-hmac-md5 crypto/gc-hmac-sha1 crypto/gc-md4 crypto/gc-md5 crypto/gc-pbkdf2-sha1 crypto/gc-random fcntl fdl-1.3 gendocs getaddrinfo getline getpass getsubopt gnupload lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings minmax netinet_in parse-datetime pmccabe2html read-file recvfrom select sendto shutdown signal socket sockets socklen stat stdint strcase strerror strndup strtok_r strverscmp sys_select sys_socket sys_stat sys_time time timegm unistd update-copyright valgrind-tests vasnprintf vasprintf warnings xalloc xgetdomainname xgethostname xstrndup xvasprintf VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @GL_COND_LIBTOOL_TRUE@am__append_1 = $(LTLIBGCRYPT) subdir = gl DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in alloca.c parse-datetime.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/db/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/db/gl/m4/readlink.m4 \ $(top_srcdir)/src/gl/m4/error.m4 \ $(top_srcdir)/src/gl/m4/getopt.m4 \ $(top_srcdir)/src/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/src/gl/m4/locale_h.m4 \ $(top_srcdir)/src/gl/m4/nocrash.m4 \ $(top_srcdir)/src/gl/m4/version-etc.m4 \ $(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/arpa_inet_h.m4 \ $(top_srcdir)/gl/m4/autobuild.m4 $(top_srcdir)/gl/m4/base64.m4 \ $(top_srcdir)/gl/m4/bison.m4 $(top_srcdir)/gl/m4/clock_time.m4 \ $(top_srcdir)/gl/m4/close.m4 $(top_srcdir)/gl/m4/dup2.m4 \ $(top_srcdir)/gl/m4/eealloc.m4 $(top_srcdir)/gl/m4/environ.m4 \ $(top_srcdir)/gl/m4/errno_h.m4 \ $(top_srcdir)/gl/m4/exponentd.m4 \ $(top_srcdir)/gl/m4/extensions.m4 \ $(top_srcdir)/gl/m4/extern-inline.m4 \ $(top_srcdir)/gl/m4/fcntl.m4 $(top_srcdir)/gl/m4/fcntl_h.m4 \ $(top_srcdir)/gl/m4/float_h.m4 $(top_srcdir)/gl/m4/fseek.m4 \ $(top_srcdir)/gl/m4/fseeko.m4 $(top_srcdir)/gl/m4/fstat.m4 \ $(top_srcdir)/gl/m4/ftell.m4 $(top_srcdir)/gl/m4/ftello.m4 \ $(top_srcdir)/gl/m4/gc-des.m4 \ $(top_srcdir)/gl/m4/gc-hmac-md5.m4 \ $(top_srcdir)/gl/m4/gc-hmac-sha1.m4 \ $(top_srcdir)/gl/m4/gc-md4.m4 $(top_srcdir)/gl/m4/gc-md5.m4 \ $(top_srcdir)/gl/m4/gc-random.m4 $(top_srcdir)/gl/m4/gc.m4 \ $(top_srcdir)/gl/m4/getaddrinfo.m4 \ $(top_srcdir)/gl/m4/getdelim.m4 \ $(top_srcdir)/gl/m4/getdomainname.m4 \ $(top_srcdir)/gl/m4/getdtablesize.m4 \ $(top_srcdir)/gl/m4/gethostname.m4 \ $(top_srcdir)/gl/m4/getline.m4 $(top_srcdir)/gl/m4/getpass.m4 \ $(top_srcdir)/gl/m4/getsubopt.m4 \ $(top_srcdir)/gl/m4/gettime.m4 \ $(top_srcdir)/gl/m4/gettimeofday.m4 \ $(top_srcdir)/gl/m4/gnulib-common.m4 \ $(top_srcdir)/gl/m4/gnulib-comp.m4 \ $(top_srcdir)/gl/m4/hostent.m4 \ $(top_srcdir)/gl/m4/include_next.m4 \ $(top_srcdir)/gl/m4/inet_ntop.m4 \ $(top_srcdir)/gl/m4/intmax_t.m4 \ $(top_srcdir)/gl/m4/largefile.m4 \ $(top_srcdir)/gl/m4/ld-output-def.m4 \ $(top_srcdir)/gl/m4/ld-version-script.m4 \ $(top_srcdir)/gl/m4/lseek.m4 $(top_srcdir)/gl/m4/malloc.m4 \ $(top_srcdir)/gl/m4/malloca.m4 \ $(top_srcdir)/gl/m4/manywarnings.m4 $(top_srcdir)/gl/m4/md4.m4 \ $(top_srcdir)/gl/m4/md5.m4 $(top_srcdir)/gl/m4/memchr.m4 \ $(top_srcdir)/gl/m4/memxor.m4 $(top_srcdir)/gl/m4/minmax.m4 \ $(top_srcdir)/gl/m4/mktime.m4 $(top_srcdir)/gl/m4/mmap-anon.m4 \ $(top_srcdir)/gl/m4/msvc-inval.m4 \ $(top_srcdir)/gl/m4/msvc-nothrow.m4 \ $(top_srcdir)/gl/m4/multiarch.m4 \ $(top_srcdir)/gl/m4/netdb_h.m4 \ $(top_srcdir)/gl/m4/netinet_in_h.m4 \ $(top_srcdir)/gl/m4/off_t.m4 \ $(top_srcdir)/gl/m4/parse-datetime.m4 \ $(top_srcdir)/gl/m4/pathmax.m4 $(top_srcdir)/gl/m4/printf.m4 \ $(top_srcdir)/gl/m4/rawmemchr.m4 \ $(top_srcdir)/gl/m4/read-file.m4 \ $(top_srcdir)/gl/m4/realloc.m4 $(top_srcdir)/gl/m4/select.m4 \ $(top_srcdir)/gl/m4/servent.m4 $(top_srcdir)/gl/m4/setenv.m4 \ $(top_srcdir)/gl/m4/sha1.m4 $(top_srcdir)/gl/m4/signal_h.m4 \ $(top_srcdir)/gl/m4/snprintf.m4 \ $(top_srcdir)/gl/m4/socketlib.m4 \ $(top_srcdir)/gl/m4/sockets.m4 $(top_srcdir)/gl/m4/socklen.m4 \ $(top_srcdir)/gl/m4/sockpfaf.m4 $(top_srcdir)/gl/m4/ssize_t.m4 \ $(top_srcdir)/gl/m4/stat.m4 $(top_srcdir)/gl/m4/stdalign.m4 \ $(top_srcdir)/gl/m4/stdarg.m4 $(top_srcdir)/gl/m4/stdbool.m4 \ $(top_srcdir)/gl/m4/stddef_h.m4 $(top_srcdir)/gl/m4/stdint.m4 \ $(top_srcdir)/gl/m4/stdio_h.m4 $(top_srcdir)/gl/m4/stdlib_h.m4 \ $(top_srcdir)/gl/m4/strcase.m4 \ $(top_srcdir)/gl/m4/strchrnul.m4 $(top_srcdir)/gl/m4/strdup.m4 \ $(top_srcdir)/gl/m4/strerror.m4 \ $(top_srcdir)/gl/m4/string_h.m4 \ $(top_srcdir)/gl/m4/strings_h.m4 \ $(top_srcdir)/gl/m4/strndup.m4 $(top_srcdir)/gl/m4/strnlen.m4 \ $(top_srcdir)/gl/m4/strtok_r.m4 \ $(top_srcdir)/gl/m4/strverscmp.m4 \ $(top_srcdir)/gl/m4/sys_select_h.m4 \ $(top_srcdir)/gl/m4/sys_socket_h.m4 \ $(top_srcdir)/gl/m4/sys_stat_h.m4 \ $(top_srcdir)/gl/m4/sys_time_h.m4 \ $(top_srcdir)/gl/m4/sys_types_h.m4 \ $(top_srcdir)/gl/m4/sys_uio_h.m4 $(top_srcdir)/gl/m4/time_h.m4 \ $(top_srcdir)/gl/m4/time_r.m4 $(top_srcdir)/gl/m4/timegm.m4 \ $(top_srcdir)/gl/m4/timespec.m4 \ $(top_srcdir)/gl/m4/tm_gmtoff.m4 \ $(top_srcdir)/gl/m4/unistd_h.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/gl/m4/vasnprintf.m4 \ $(top_srcdir)/gl/m4/vasprintf.m4 \ $(top_srcdir)/gl/m4/warn-on-use.m4 \ $(top_srcdir)/gl/m4/warnings.m4 $(top_srcdir)/gl/m4/wchar_h.m4 \ $(top_srcdir)/gl/m4/xalloc.m4 $(top_srcdir)/gl/m4/xstrndup.m4 \ $(top_srcdir)/gl/m4/xvasprintf.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/update-header-version.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libgnu_la_OBJECTS = base64.lo c-ctype.lo crc.lo arcfour.lo des.lo \ gc-pbkdf2-sha1.lo hmac-md5.lo hmac-sha1.lo md4.lo md5.lo \ sha1.lo fd-hook.lo gettime.lo malloca.lo memxor.lo \ parse-datetime.lo read-file.lo sockets.lo sys_socket.lo \ timespec.lo unistd.lo xmalloc.lo xgetdomainname.lo \ xgethostname.lo xsize.lo xstrndup.lo xvasprintf.lo \ xasprintf.lo libgnu_la_OBJECTS = $(am_libgnu_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgnu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgnu_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; YLWRAP = $(top_srcdir)/build-aux/ylwrap AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) DIST_SOURCES = $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AS = @AS@ ASN1PARSER = @ASN1PARSER@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CONFIG_INCLUDE = @CONFIG_INCLUDE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DBDIR = @DBDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLOAT_H = @FLOAT_H@ GENGETOPT = @GENGETOPT@ GETADDRINFO_LIB = @GETADDRINFO_LIB@ GETHOSTNAME_LIB = @GETHOSTNAME_LIB@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ACCEPT = @GNULIB_ACCEPT@ GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BIND = @GNULIB_BIND@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_CONNECT = @GNULIB_CONNECT@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FCNTL = @GNULIB_FCNTL@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFS = @GNULIB_FFS@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSTAT = @GNULIB_FSTAT@ GNULIB_FSTATAT = @GNULIB_FSTATAT@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@ GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@ GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_GL2_UNISTD_H_GETOPT = @GNULIB_GL_GL2_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_INET_NTOP = @GNULIB_INET_NTOP@ GNULIB_INET_PTON = @GNULIB_INET_PTON@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_LCHMOD = @GNULIB_LCHMOD@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LISTEN = @GNULIB_LISTEN@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_LSTAT = @GNULIB_LSTAT@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKFIFO = @GNULIB_MKFIFO@ GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ GNULIB_MKNOD = @GNULIB_MKNOD@ GNULIB_MKNODAT = @GNULIB_MKNODAT@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_OPEN = @GNULIB_OPEN@ GNULIB_OPENAT = @GNULIB_OPENAT@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PSELECT = @GNULIB_PSELECT@ GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_RAISE = @GNULIB_RAISE@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_RECV = @GNULIB_RECV@ GNULIB_RECVFROM = @GNULIB_RECVFROM@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SELECT = @GNULIB_SELECT@ GNULIB_SEND = @GNULIB_SEND@ GNULIB_SENDTO = @GNULIB_SENDTO@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@ GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@ GNULIB_SIGACTION = @GNULIB_SIGACTION@ GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SOCKET = @GNULIB_SOCKET@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STAT = @GNULIB_STAT@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ HAVE_ACCEPT4 = @HAVE_ACCEPT4@ HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@ HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@ HAVE_LIBIDN = @HAVE_LIBIDN@ HAVE_LIBRESOLV = @HAVE_LIBRESOLV@ HAVE_LIBTASN1 = @HAVE_LIBTASN1@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NETDB_H = @HAVE_NETDB_H@ HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PSELECT = @HAVE_PSELECT@ HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RAISE = @HAVE_RAISE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGACTION = @HAVE_SIGACTION@ HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SIGSET_T = @HAVE_SIGSET_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOSTENT_LIB = @HOSTENT_LIB@ HTML_DIR = @HTML_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INET_NTOP_LIB = @INET_NTOP_LIB@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ KEYDIR = @KEYDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ LIBGNUTLS = @LIBGNUTLS@ LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@ LIBICONV = @LIBICONV@ LIBIDN = @LIBIDN@ LIBIDN_PREFIX = @LIBIDN_PREFIX@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBRESOLV = @LIBRESOLV@ LIBRESOLV_PREFIX = @LIBRESOLV_PREFIX@ LIBS = @LIBS@ LIBSOCKET = @LIBSOCKET@ LIBTASN1 = @LIBTASN1@ LIBTASN1_PREFIX = @LIBTASN1_PREFIX@ LIBTOOL = @LIBTOOL@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_SELECT = @LIB_SELECT@ LIPO = @LIPO@ LN_S = @LN_S@ LTALLOCA = @LTALLOCA@ LTLIBGCRYPT = @LTLIBGCRYPT@ LTLIBGNUTLS = @LTLIBGNUTLS@ LTLIBICONV = @LTLIBICONV@ LTLIBIDN = @LTLIBIDN@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LTLIBRESOLV = @LTLIBRESOLV@ LTLIBTASN1 = @LTLIBTASN1@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NETINET_IN_H = @NETINET_IN_H@ NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_NETDB_H = @NEXT_NETDB_H@ NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ NEXT_STDARG_H = @NEXT_STDARG_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMDIR = @PAMDIR@ PAM_SHISHI = @PAM_SHISHI@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PMCCABE = @PMCCABE@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ REPLACE_INET_PTON = @REPLACE_INET_PTON@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PSELECT = @REPLACE_PSELECT@ REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_RAISE = @REPLACE_RAISE@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SELECT = @REPLACE_SELECT@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SED = @SED@ SERVENT_LIB = @SERVENT_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ SKELDIR = @SKELDIR@ SOVERSION = @SOVERSION@ STDALIGN_H = @STDALIGN_H@ STDARG_H = @STDARG_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WERROR_CFLAGS = @WERROR_CFLAGS@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl2_LIBOBJS = @gl2_LIBOBJS@ gl2_LTLIBOBJS = @gl2_LTLIBOBJS@ gl2tests_LIBOBJS = @gl2tests_LIBOBJS@ gl2tests_LTLIBOBJS = @gl2tests_LTLIBOBJS@ gl2tests_WITNESS = @gl2tests_WITNESS@ gl3_LIBOBJS = @gl3_LIBOBJS@ gl3_LTLIBOBJS = @gl3_LTLIBOBJS@ gl3tests_LIBOBJS = @gl3tests_LIBOBJS@ gl3tests_LTLIBOBJS = @gl3tests_LTLIBOBJS@ gl3tests_WITNESS = @gl3tests_WITNESS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.5 gnits SUBDIRS = noinst_HEADERS = noinst_LIBRARIES = noinst_LTLIBRARIES = libgnu.la EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h arpa_inet.in.h \ bind.c w32sock.h close.c connect.c w32sock.h crc.h arcfour.h \ des.h gc-gnulib.c gc-libgcrypt.c gc.h hmac.h hmac.h md4.h \ md5.h sha1.h dosname.h dup2.c errno.in.h fcntl.c fcntl.in.h \ fd-hook.h float.c float.in.h itold.c fseek.c fseeko.c \ stdio-impl.h fstat.c ftell.c ftello.c stdio-impl.h \ $(top_srcdir)/build-aux/gendocs.sh gai_strerror.c \ getaddrinfo.c getdelim.c getdomainname.c getdtablesize.c \ gethostname.c w32sock.h getline.c getpass.c getpass.h \ getpeername.c w32sock.h getsubopt.c gettimeofday.c \ $(top_srcdir)/GNUmakefile $(top_srcdir)/build-aux/gnupload \ $(top_srcdir)/build-aux/config.rpath inet_ntop.c intprops.h \ lseek.c $(top_srcdir)/maint.mk malloc.c malloca.h \ malloca.valgrind memchr.c memchr.valgrind memxor.h \ mktime-internal.h mktime.c mktime-internal.h mktime.c \ msvc-inval.c msvc-inval.h msvc-nothrow.c msvc-nothrow.h \ netdb.in.h netinet_in.in.h parse-datetime.c parse-datetime.h \ pathmax.h $(top_srcdir)/build-aux/pmccabe2html \ $(top_srcdir)/build-aux/pmccabe.css rawmemchr.c \ rawmemchr.valgrind read-file.h realloc.c recvfrom.c w32sock.h \ select.c sendto.c w32sock.h setenv.c shutdown.c w32sock.h \ signal.in.h $(top_srcdir)/build-aux/snippet/_Noreturn.h \ $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ $(top_srcdir)/build-aux/snippet/c++defs.h \ $(top_srcdir)/build-aux/snippet/warn-on-use.h snprintf.c \ socket.c w32sock.h w32sock.h stat.c stdalign.in.h stdarg.in.h \ stdbool.in.h stddef.in.h stdint.in.h stdio.in.h stdlib.in.h \ strcasecmp.c strncasecmp.c strchrnul.c strchrnul.valgrind \ strdup.c strerror.c strerror-override.c strerror-override.h \ string.in.h strings.in.h strndup.c strnlen.c strtok_r.c \ strverscmp.c sys_select.in.h sys_socket.in.h sys_stat.in.h \ sys_time.in.h sys_types.in.h sys_uio.in.h time.in.h time_r.c \ mktime-internal.h timegm.c timespec.h unistd.in.h unsetenv.c \ $(top_srcdir)/build-aux/update-copyright \ $(top_srcdir)/build-aux/useless-if-before-free asnprintf.c \ float+.h printf-args.c printf-args.h printf-parse.c \ printf-parse.h vasnprintf.c vasnprintf.h asprintf.c \ vasprintf.c $(top_srcdir)/build-aux/vc-list-files verify.h \ wchar.in.h xalloc.h xalloc-oversized.h xalloc.h # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. # The BUILT_SOURCES created by this Makefile snippet are not used via #include # statements but through direct file reference. Therefore this snippet must be # present in all Makefile.am that need it. This is ensured by the applicability # 'all' defined above. BUILT_SOURCES = $(ALLOCA_H) arpa/inet.h $(ERRNO_H) fcntl.h $(FLOAT_H) \ netdb.h $(NETINET_IN_H) parse-datetime.c signal.h \ arg-nonnull.h c++defs.h warn-on-use.h $(STDALIGN_H) \ $(STDARG_H) $(STDBOOL_H) $(STDDEF_H) $(STDINT_H) stdio.h \ stdlib.h string.h strings.h sys/select.h sys/socket.h \ sys/stat.h sys/time.h sys/types.h sys/uio.h time.h unistd.h \ wchar.h SUFFIXES = MOSTLYCLEANFILES = core *.stackdump alloca.h alloca.h-t arpa/inet.h \ arpa/inet.h-t errno.h errno.h-t fcntl.h fcntl.h-t float.h \ float.h-t netdb.h netdb.h-t netinet/in.h netinet/in.h-t \ parse-datetime.c-t signal.h signal.h-t arg-nonnull.h \ arg-nonnull.h-t c++defs.h c++defs.h-t warn-on-use.h \ warn-on-use.h-t stdalign.h stdalign.h-t stdarg.h stdarg.h-t \ stdbool.h stdbool.h-t stddef.h stddef.h-t stdint.h stdint.h-t \ stdio.h stdio.h-t stdlib.h stdlib.h-t string.h string.h-t \ strings.h strings.h-t sys/select.h sys/select.h-t sys/socket.h \ sys/socket.h-t sys/stat.h sys/stat.h-t sys/time.h sys/time.h-t \ sys/types.h sys/types.h-t sys/uio.h sys/uio.h-t time.h \ time.h-t unistd.h unistd.h-t wchar.h wchar.h-t MOSTLYCLEANDIRS = arpa netinet sys sys sys sys CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = parse-datetime.c AM_CPPFLAGS = AM_CFLAGS = libgnu_la_SOURCES = base64.h base64.c c-ctype.h c-ctype.c crc.c \ arcfour.c des.c md5.h gc-pbkdf2-sha1.c hmac-md5.c hmac-sha1.c \ md4.c md5.c sha1.c fd-hook.c gettext.h gettime.c malloca.c \ memxor.c minmax.h parse-datetime.y read-file.c size_max.h \ sockets.h sockets.c sys_socket.c timespec.c unistd.c xmalloc.c \ xgetdomainname.h xgetdomainname.c xgethostname.h \ xgethostname.c xsize.h xsize.c xstrndup.h xstrndup.c \ xvasprintf.h xvasprintf.c xasprintf.c libgnu_la_LIBADD = $(gl_LTLIBOBJS) @LTALLOCA@ libgnu_la_DEPENDENCIES = $(gl_LTLIBOBJS) @LTALLOCA@ EXTRA_libgnu_la_SOURCES = alloca.c bind.c close.c connect.c \ gc-gnulib.c gc-libgcrypt.c dup2.c fcntl.c float.c itold.c \ fseek.c fseeko.c fstat.c ftell.c ftello.c gai_strerror.c \ getaddrinfo.c getdelim.c getdomainname.c getdtablesize.c \ gethostname.c getline.c getpass.c getpeername.c getsubopt.c \ gettimeofday.c inet_ntop.c lseek.c malloc.c memchr.c mktime.c \ mktime.c msvc-inval.c msvc-nothrow.c rawmemchr.c realloc.c \ recvfrom.c select.c sendto.c setenv.c shutdown.c snprintf.c \ socket.c stat.c strcasecmp.c strncasecmp.c strchrnul.c \ strdup.c strerror.c strerror-override.c strndup.c strnlen.c \ strtok_r.c strverscmp.c time_r.c timegm.c unsetenv.c \ asnprintf.c printf-args.c printf-parse.c vasnprintf.c \ asprintf.c vasprintf.c libgnu_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(GETADDRINFO_LIB) \ $(GETHOSTNAME_LIB) $(HOSTENT_LIB) $(INET_NTOP_LIB) \ $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_SELECT) $(LTLIBINTL) \ $(SERVENT_LIB) $(am__append_1) # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all Makefile.am that # need it. This is ensured by the applicability 'all' defined above. _NORETURN_H = $(top_srcdir)/build-aux/snippet/_Noreturn.h ARG_NONNULL_H = arg-nonnull.h CXXDEFS_H = c++defs.h WARN_ON_USE_H = warn-on-use.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits gl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits gl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgnu.la: $(libgnu_la_OBJECTS) $(libgnu_la_DEPENDENCIES) $(EXTRA_libgnu_la_DEPENDENCIES) $(AM_V_CCLD)$(libgnu_la_LINK) $(libgnu_la_OBJECTS) $(libgnu_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arcfour.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asnprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-ctype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/des.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcntl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-hook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseek.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseeko.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftello.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gai_strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc-gnulib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc-libgcrypt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc-pbkdf2-sha1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaddrinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdelim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdomainname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdtablesize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gethostname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpeername.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getsubopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettimeofday.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmac-md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmac-sha1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet_ntop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itold.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloca.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memxor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-datetime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-args.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-parse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rawmemchr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read-file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recvfrom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/select.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shutdown.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockets.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror-override.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strverscmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys_socket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timegm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timespec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasnprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xasprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetdomainname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgethostname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xvasprintf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f parse-datetime.c -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool mostlyclean-local pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES clean-noinstLTLIBRARIES ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-libtool distclean-local distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ mostlyclean-local pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_ALLOCA_H_TRUE@alloca.h: alloca.in.h $(top_builddir)/config.status @GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_ALLOCA_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_ALLOCA_H_TRUE@ cat $(srcdir)/alloca.in.h; \ @GL_GENERATE_ALLOCA_H_TRUE@ } > $@-t && \ @GL_GENERATE_ALLOCA_H_TRUE@ mv -f $@-t $@ @GL_GENERATE_ALLOCA_H_FALSE@alloca.h: $(top_builddir)/config.status @GL_GENERATE_ALLOCA_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one. arpa/inet.h: arpa_inet.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) arpa $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_ARPA_INET_H''@|$(NEXT_ARPA_INET_H)|g' \ -e 's|@''HAVE_ARPA_INET_H''@|$(HAVE_ARPA_INET_H)|g' \ -e 's/@''GNULIB_INET_NTOP''@/$(GNULIB_INET_NTOP)/g' \ -e 's/@''GNULIB_INET_PTON''@/$(GNULIB_INET_PTON)/g' \ -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \ -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \ -e 's|@''REPLACE_INET_NTOP''@|$(REPLACE_INET_NTOP)|g' \ -e 's|@''REPLACE_INET_PTON''@|$(REPLACE_INET_PTON)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/arpa_inet.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that is POSIX compliant. @GL_GENERATE_ERRNO_H_TRUE@errno.h: errno.in.h $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_ERRNO_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_ERRNO_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ < $(srcdir)/errno.in.h; \ @GL_GENERATE_ERRNO_H_TRUE@ } > $@-t && \ @GL_GENERATE_ERRNO_H_TRUE@ mv $@-t $@ @GL_GENERATE_ERRNO_H_FALSE@errno.h: $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/fcntl.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_FLOAT_H_TRUE@float.h: float.in.h $(top_builddir)/config.status @GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_FLOAT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_FLOAT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ < $(srcdir)/float.in.h; \ @GL_GENERATE_FLOAT_H_TRUE@ } > $@-t && \ @GL_GENERATE_FLOAT_H_TRUE@ mv $@-t $@ @GL_GENERATE_FLOAT_H_FALSE@float.h: $(top_builddir)/config.status @GL_GENERATE_FLOAT_H_FALSE@ rm -f $@ distclean-local: clean-GNUmakefile clean-GNUmakefile: test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile # We need the following in order to create when the system # doesn't have one that works with the given compiler. netdb.h: netdb.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \ -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \ -e 's/@''GNULIB_GETADDRINFO''@/$(GNULIB_GETADDRINFO)/g' \ -e 's|@''HAVE_STRUCT_ADDRINFO''@|$(HAVE_STRUCT_ADDRINFO)|g' \ -e 's|@''HAVE_DECL_FREEADDRINFO''@|$(HAVE_DECL_FREEADDRINFO)|g' \ -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \ -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \ -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \ -e 's|@''REPLACE_GAI_STRERROR''@|$(REPLACE_GAI_STRERROR)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/netdb.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one. @GL_GENERATE_NETINET_IN_H_TRUE@netinet/in.h: netinet_in.in.h $(top_builddir)/config.status @GL_GENERATE_NETINET_IN_H_TRUE@ $(AM_V_at)$(MKDIR_P) netinet @GL_GENERATE_NETINET_IN_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_NETINET_IN_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_NETINET_IN_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \ @GL_GENERATE_NETINET_IN_H_TRUE@ < $(srcdir)/netinet_in.in.h; \ @GL_GENERATE_NETINET_IN_H_TRUE@ } > $@-t && \ @GL_GENERATE_NETINET_IN_H_TRUE@ mv $@-t $@ @GL_GENERATE_NETINET_IN_H_FALSE@netinet/in.h: $(top_builddir)/config.status @GL_GENERATE_NETINET_IN_H_FALSE@ rm -f $@ # This rule overrides the Automake generated .y.c rule, to ensure that the # parse-datetime.c file gets generated in the source directory, not in the # build directory. parse-datetime.c: parse-datetime.y $(AM_V_GEN)$(SHELL) $(YLWRAP) $(srcdir)/parse-datetime.y \ y.tab.c parse-datetime.c \ y.tab.h parse-datetime.h \ y.output parse-datetime.output \ -- $(YACC) $(YFLAGS) $(AM_YFLAGS) && \ mv parse-datetime.c parse-datetime.c-t && \ mv parse-datetime.c-t $(srcdir)/parse-datetime.c # We need the following in order to create when the system # doesn't have a complete one. signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \ -e 's|@''GNULIB_PTHREAD_SIGMASK''@|$(GNULIB_PTHREAD_SIGMASK)|g' \ -e 's|@''GNULIB_RAISE''@|$(GNULIB_RAISE)|g' \ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/signal.in.h; \ } > $@-t && \ mv $@-t $@ # The arg-nonnull.h that gets inserted into generated .h files is the same as # build-aux/snippet/arg-nonnull.h, except that it has the copyright header cut # off. arg-nonnull.h: $(top_srcdir)/build-aux/snippet/arg-nonnull.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/GL_ARG_NONNULL/,$$p' \ < $(top_srcdir)/build-aux/snippet/arg-nonnull.h \ > $@-t && \ mv $@-t $@ # The c++defs.h that gets inserted into generated .h files is the same as # build-aux/snippet/c++defs.h, except that it has the copyright header cut off. c++defs.h: $(top_srcdir)/build-aux/snippet/c++defs.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/_GL_CXXDEFS/,$$p' \ < $(top_srcdir)/build-aux/snippet/c++defs.h \ > $@-t && \ mv $@-t $@ # The warn-on-use.h that gets inserted into generated .h files is the same as # build-aux/snippet/warn-on-use.h, except that it has the copyright header cut # off. warn-on-use.h: $(top_srcdir)/build-aux/snippet/warn-on-use.h $(AM_V_GEN)rm -f $@-t $@ && \ sed -n -e '/^.ifndef/,$$p' \ < $(top_srcdir)/build-aux/snippet/warn-on-use.h \ > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works. @GL_GENERATE_STDALIGN_H_TRUE@stdalign.h: stdalign.in.h $(top_builddir)/config.status @GL_GENERATE_STDALIGN_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDALIGN_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDALIGN_H_TRUE@ cat $(srcdir)/stdalign.in.h; \ @GL_GENERATE_STDALIGN_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDALIGN_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDALIGN_H_FALSE@stdalign.h: $(top_builddir)/config.status @GL_GENERATE_STDALIGN_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDARG_H_TRUE@stdarg.h: stdarg.in.h $(top_builddir)/config.status @GL_GENERATE_STDARG_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDARG_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_STDARG_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDARG_H_TRUE@ -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ @GL_GENERATE_STDARG_H_TRUE@ < $(srcdir)/stdarg.in.h; \ @GL_GENERATE_STDARG_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDARG_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDARG_H_FALSE@stdarg.h: $(top_builddir)/config.status @GL_GENERATE_STDARG_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works. @GL_GENERATE_STDBOOL_H_TRUE@stdbool.h: stdbool.in.h $(top_builddir)/config.status @GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDBOOL_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDBOOL_H_TRUE@ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ @GL_GENERATE_STDBOOL_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDBOOL_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDBOOL_H_FALSE@stdbool.h: $(top_builddir)/config.status @GL_GENERATE_STDBOOL_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDDEF_H_TRUE@stddef.h: stddef.in.h $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDDEF_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ @GL_GENERATE_STDDEF_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ < $(srcdir)/stddef.in.h; \ @GL_GENERATE_STDDEF_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDDEF_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDDEF_H_FALSE@stddef.h: $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDINT_H_TRUE@stdint.h: stdint.in.h $(top_builddir)/config.status @GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ @GL_GENERATE_STDINT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ @GL_GENERATE_STDINT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ @GL_GENERATE_STDINT_H_TRUE@ < $(srcdir)/stdint.in.h; \ @GL_GENERATE_STDINT_H_TRUE@ } > $@-t && \ @GL_GENERATE_STDINT_H_TRUE@ mv $@-t $@ @GL_GENERATE_STDINT_H_FALSE@stdint.h: $(top_builddir)/config.status @GL_GENERATE_STDINT_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \ < $(srcdir)/stdio.in.h | \ sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \ < $(srcdir)/stdlib.in.h | \ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _Noreturn/r $(_NORETURN_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \ < $(srcdir)/string.in.h | \ sed -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ < $(srcdir)/string.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ -e 's|@''GNULIB_FFS''@|$(GNULIB_FFS)|g' \ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/strings.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_select.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_socket.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # has one that is incomplete. sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_stat.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/sys_time.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/types.h: sys_types.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ < $(srcdir)/sys_types.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. sys/uio.h: sys_uio.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) sys $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \ < $(srcdir)/sys_uio.in.h; \ } > $@-t && \ mv -f $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ < $(srcdir)/time.in.h; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create an empty placeholder for # when the system doesn't have one. unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \ < $(srcdir)/unistd.in.h | \ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ -e 's|@''HAVE_GETLOGIN''@|$(HAVE_GETLOGIN)|g' \ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ | \ sed -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ # We need the following in order to create when the system # version does not work standalone. wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) $(AM_V_GEN)rm -f $@-t $@ && \ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \ < $(srcdir)/wchar.in.h | \ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ | \ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ } > $@-t && \ mv $@-t $@ mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ if test -n "$$dir" && test -d $$dir; then \ echo "rmdir $$dir"; rmdir $$dir; \ fi; \ done; \ : # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: shishi-1.0.2/gl/printf-parse.h0000644000000000000000000001216312126660053013061 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _PRINTF_PARSE_H #define _PRINTF_PARSE_H /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. STATIC Set to 'static' to declare the function static. */ #if HAVE_FEATURES_H # include /* for __GLIBC__, __UCLIBC__ */ #endif #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 #if __GLIBC__ >= 2 && !defined __UCLIBC__ # define FLAG_LOCALIZED 64 /* I flag, uses localized digits */ #endif /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* xxx_directive: A parsed directive. xxx_directives: A parsed format string. */ /* Number of directly allocated directives (no malloc() needed). */ #define N_DIRECT_ALLOC_DIRECTIVES 7 /* A parsed directive. */ typedef struct { const char* dir_start; const char* dir_end; int flags; const char* width_start; const char* width_end; size_t width_arg_index; const char* precision_start; const char* precision_end; size_t precision_arg_index; char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } char_directive; /* A parsed format string. */ typedef struct { size_t count; char_directive *dir; size_t max_width_length; size_t max_precision_length; char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } char_directives; #if ENABLE_UNISTDIO /* A parsed directive. */ typedef struct { const uint8_t* dir_start; const uint8_t* dir_end; int flags; const uint8_t* width_start; const uint8_t* width_end; size_t width_arg_index; const uint8_t* precision_start; const uint8_t* precision_end; size_t precision_arg_index; uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u8_directive; /* A parsed format string. */ typedef struct { size_t count; u8_directive *dir; size_t max_width_length; size_t max_precision_length; u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u8_directives; /* A parsed directive. */ typedef struct { const uint16_t* dir_start; const uint16_t* dir_end; int flags; const uint16_t* width_start; const uint16_t* width_end; size_t width_arg_index; const uint16_t* precision_start; const uint16_t* precision_end; size_t precision_arg_index; uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u16_directive; /* A parsed format string. */ typedef struct { size_t count; u16_directive *dir; size_t max_width_length; size_t max_precision_length; u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u16_directives; /* A parsed directive. */ typedef struct { const uint32_t* dir_start; const uint32_t* dir_end; int flags; const uint32_t* width_start; const uint32_t* width_end; size_t width_arg_index; const uint32_t* precision_start; const uint32_t* precision_end; size_t precision_arg_index; uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ size_t arg_index; } u32_directive; /* A parsed format string. */ typedef struct { size_t count; u32_directive *dir; size_t max_width_length; size_t max_precision_length; u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; } u32_directives; #endif /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #if ENABLE_UNISTDIO extern int ulc_printf_parse (const char *format, char_directives *d, arguments *a); extern int u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); extern int u16_printf_parse (const uint16_t *format, u16_directives *d, arguments *a); extern int u32_printf_parse (const uint32_t *format, u32_directives *d, arguments *a); #else # ifdef STATIC STATIC # else extern # endif int printf_parse (const char *format, char_directives *d, arguments *a); #endif #endif /* _PRINTF_PARSE_H */ shishi-1.0.2/gl/inet_ntop.c0000644000000000000000000001531512126660051012441 00000000000000/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form Copyright (C) 2005-2006, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ /* * Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include /* Specification. */ #include /* Use this to suppress gcc's "...may be used before initialized" warnings. Beware: The Code argument must not contain commas. */ #ifndef IF_LINT # ifdef lint # define IF_LINT(Code) Code # else # define IF_LINT(Code) /* empty */ # endif #endif #if HAVE_DECL_INET_NTOP # undef inet_ntop const char * rpl_inet_ntop (int af, const void *restrict src, char *restrict dst, socklen_t cnt) { return inet_ntop (af, src, dst, cnt); } #else # include # include # include # define NS_IN6ADDRSZ 16 # define NS_INT16SZ 2 /* * WARNING: Don't even consider trying to compile this on a system where * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. */ typedef int verify_int_size[4 <= sizeof (int) ? 1 : -1]; static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size); # if HAVE_IPV6 static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t size); # endif /* char * * inet_ntop(af, src, dst, size) * convert a network format address to presentation format. * return: * pointer to presentation format address ('dst'), or NULL (see errno). * author: * Paul Vixie, 1996. */ const char * inet_ntop (int af, const void *restrict src, char *restrict dst, socklen_t cnt) { switch (af) { # if HAVE_IPV4 case AF_INET: return (inet_ntop4 (src, dst, cnt)); # endif # if HAVE_IPV6 case AF_INET6: return (inet_ntop6 (src, dst, cnt)); # endif default: errno = EAFNOSUPPORT; return (NULL); } /* NOTREACHED */ } /* const char * * inet_ntop4(src, dst, size) * format an IPv4 address * return: * 'dst' (as a const) * notes: * (1) uses no statics * (2) takes a u_char* not an in_addr as input * author: * Paul Vixie, 1996. */ static const char * inet_ntop4 (const unsigned char *src, char *dst, socklen_t size) { char tmp[sizeof "255.255.255.255"]; int len; len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]); if (len < 0) return NULL; if (len > size) { errno = ENOSPC; return NULL; } return strcpy (dst, tmp); } # if HAVE_IPV6 /* const char * * inet_ntop6(src, dst, size) * convert IPv6 binary address into presentation (printable) format * author: * Paul Vixie, 1996. */ static const char * inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough * to contain a value of the specified size. On some systems, like * Crays, there is no such thing as an integer variable with 16 bits. * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; struct { int base, len; } best, cur; unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; int i; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset (words, '\0', sizeof words); for (i = 0; i < NS_IN6ADDRSZ; i += 2) words[i / 2] = (src[i] << 8) | src[i + 1]; best.base = -1; cur.base = -1; IF_LINT(best.len = 0); IF_LINT(cur.len = 0); for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp))) return (NULL); tp += strlen (tp); break; } { int len = sprintf (tp, "%x", words[i]); if (len < 0) return NULL; tp += len; } } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) *tp++ = ':'; *tp++ = '\0'; /* * Check for overflow, copy, and we're done. */ if ((socklen_t) (tp - tmp) > size) { errno = ENOSPC; return NULL; } return strcpy (dst, tmp); } # endif #endif shishi-1.0.2/gl/msvc-inval.c0000644000000000000000000000750312126660053012523 00000000000000/* Invalid parameter handler for MSVC runtime libraries. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include "msvc-inval.h" #if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) /* Get _invalid_parameter_handler type and _set_invalid_parameter_handler declaration. */ # include # if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { } # else /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include # if defined _MSC_VER static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # else /* An index to thread-local storage. */ static DWORD tls_index; static int tls_initialized /* = 0 */; /* Used as a fallback only. */ static struct gl_msvc_inval_per_thread not_per_thread; struct gl_msvc_inval_per_thread * gl_msvc_inval_current (void) { if (!tls_initialized) { tls_index = TlsAlloc (); tls_initialized = 1; } if (tls_index == TLS_OUT_OF_INDEXES) /* TlsAlloc had failed. */ return ¬_per_thread; else { struct gl_msvc_inval_per_thread *pointer = (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index); if (pointer == NULL) { /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */ pointer = (struct gl_msvc_inval_per_thread *) malloc (sizeof (struct gl_msvc_inval_per_thread)); if (pointer == NULL) /* Could not allocate memory. Use the global storage. */ pointer = ¬_per_thread; TlsSetValue (tls_index, pointer); } return pointer; } } static void cdecl gl_msvc_invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current (); if (current->restart_valid) longjmp (current->restart, 1); else /* An invalid parameter notification from outside the gnulib code. Give the caller a chance to intervene. */ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); } # endif # endif static int gl_msvc_inval_initialized /* = 0 */; void gl_msvc_inval_ensure_handler (void) { if (gl_msvc_inval_initialized == 0) { _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler); gl_msvc_inval_initialized = 1; } } #endif shishi-1.0.2/gl/read-file.h0000644000000000000000000000213512126660053012275 00000000000000/* read-file.h -- read file contents into a string Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ #ifndef READ_FILE_H #define READ_FILE_H /* Get size_t. */ #include /* Get FILE. */ #include extern char *fread_file (FILE * stream, size_t * length); extern char *read_file (const char *filename, size_t * length); extern char *read_binary_file (const char *filename, size_t * length); #endif /* READ_FILE_H */ shishi-1.0.2/gl/getsubopt.c0000644000000000000000000000503112126660051012450 00000000000000/* Parse comma separated list into words. Copyright (C) 1996-1997, 1999, 2004, 2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. 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 . */ #if !_LIBC # include #endif #include #include #if !_LIBC /* This code is written for inclusion in gnu-libc, and uses names in the namespace reserved for libc. If we're compiling in gnulib, define those names to be the normal ones instead. */ # undef __strchrnul # define __strchrnul strchrnul #endif /* Parse comma separated suboption from *OPTIONP and match against strings in TOKENS. If found return index and set *VALUEP to optional value introduced by an equal sign. If the suboption is not part of TOKENS return in *VALUEP beginning of unknown suboption. On exit *OPTIONP is set to the beginning of the next token or at the terminating NUL character. */ int getsubopt (char **optionp, char *const *tokens, char **valuep) { char *endp, *vstart; int cnt; if (**optionp == '\0') return -1; /* Find end of next token. */ endp = __strchrnul (*optionp, ','); /* Find start of value. */ vstart = memchr (*optionp, '=', endp - *optionp); if (vstart == NULL) vstart = endp; /* Try to match the characters between *OPTIONP and VSTART against one of the TOKENS. */ for (cnt = 0; tokens[cnt] != NULL; ++cnt) if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0 && tokens[cnt][vstart - *optionp] == '\0') { /* We found the current option in TOKENS. */ *valuep = vstart != endp ? vstart + 1 : NULL; if (*endp != '\0') *endp++ = '\0'; *optionp = endp; return cnt; } /* The current suboption does not match any option. */ *valuep = *optionp; if (*endp != '\0') *endp++ = '\0'; *optionp = endp; return -1; } shishi-1.0.2/gl/strtok_r.c0000644000000000000000000000411412126660054012307 00000000000000/* Reentrant string tokenizer. Generic version. Copyright (C) 1991, 1996-1999, 2001, 2004, 2007, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. 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 . */ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef _LIBC # undef strtok_r # undef __strtok_r #else # define __strtok_r strtok_r # define __rawmemchr strchr #endif /* Parse S into tokens separated by characters in DELIM. If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = "-abc-=-def"; char *sp; x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL x = strtok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" */ char * __strtok_r (char *s, const char *delim, char **save_ptr) { char *token; if (s == NULL) s = *save_ptr; /* Scan leading delimiters. */ s += strspn (s, delim); if (*s == '\0') { *save_ptr = s; return NULL; } /* Find the end of the token. */ token = s; s = strpbrk (token, delim); if (s == NULL) /* This token finishes the string. */ *save_ptr = __rawmemchr (token, '\0'); else { /* Terminate the token and make *SAVE_PTR point past it. */ *s = '\0'; *save_ptr = s + 1; } return token; } #ifdef weak_alias libc_hidden_def (__strtok_r) weak_alias (__strtok_r, strtok_r) #endif shishi-1.0.2/gl/getdomainname.c0000644000000000000000000000526012126660051013250 00000000000000/* getdomainname emulation for systems that doesn't have it. Copyright (C) 2003, 2006, 2008, 2010-2013 Free Software Foundation, Inc. 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 . */ /* Written by Simon Josefsson. */ #include /* Specification. */ #include #include #include #include #if HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H /* IRIX, OSF/1, Solaris */ # include #endif /* Return the NIS domain name of the machine. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. WARNING! The NIS domain name is usually the empty string or "(none)" when not using NIS. Put up to LEN bytes of the NIS domain name into NAME. Null terminate it if the name is shorter than LEN. If the NIS domain name is longer than LEN, set errno = EINVAL and return -1. Return 0 if successful, otherwise set errno and return -1. */ int getdomainname (char *name, size_t len) #undef getdomainname { #if HAVE_GETDOMAINNAME /* Mac OS X, FreeBSD, AIX, IRIX, OSF/1 */ extern int getdomainname (char *, int); if (len > INT_MAX) len = INT_MAX; return getdomainname (name, (int) len); #elif HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H && defined SI_SRPC_DOMAIN /* Solaris */ int ret; /* The third argument is a 'long', but the return value must fit in an 'int', therefore it's better to avoid arguments > INT_MAX. */ ret = sysinfo (SI_SRPC_DOMAIN, name, len > INT_MAX ? INT_MAX : len); if (ret < 0) /* errno is set here. */ return -1; if (ret > len) { errno = EINVAL; return -1; } return 0; #else /* HP-UX, Cygwin, mingw */ const char *result = ""; /* Hardcode your domain name if you want. */ size_t result_len = strlen (result); if (result_len > len) { errno = EINVAL; return -1; } memcpy (name, result, result_len); if (result_len < len) name[result_len] = '\0'; return 0; #endif } shishi-1.0.2/gl/strerror-override.c0000644000000000000000000002146512126660053014146 00000000000000/* strerror-override.c --- POSIX compatible system error routine Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ /* Written by Bruno Haible , 2010. */ #include #include "strerror-override.h" #include #if GNULIB_defined_EWINSOCK /* native Windows platforms */ # if HAVE_WINSOCK2_H # include # endif #endif /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ const char * strerror_override (int errnum) { /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ switch (errnum) { #if REPLACE_STRERROR_0 case 0: return "Success"; #endif #if GNULIB_defined_ESOCK /* native Windows platforms with older */ case EINPROGRESS: return "Operation now in progress"; case EALREADY: return "Operation already in progress"; case ENOTSOCK: return "Socket operation on non-socket"; case EDESTADDRREQ: return "Destination address required"; case EMSGSIZE: return "Message too long"; case EPROTOTYPE: return "Protocol wrong type for socket"; case ENOPROTOOPT: return "Protocol not available"; case EPROTONOSUPPORT: return "Protocol not supported"; case EOPNOTSUPP: return "Operation not supported"; case EAFNOSUPPORT: return "Address family not supported by protocol"; case EADDRINUSE: return "Address already in use"; case EADDRNOTAVAIL: return "Cannot assign requested address"; case ENETDOWN: return "Network is down"; case ENETUNREACH: return "Network is unreachable"; case ECONNRESET: return "Connection reset by peer"; case ENOBUFS: return "No buffer space available"; case EISCONN: return "Transport endpoint is already connected"; case ENOTCONN: return "Transport endpoint is not connected"; case ETIMEDOUT: return "Connection timed out"; case ECONNREFUSED: return "Connection refused"; case ELOOP: return "Too many levels of symbolic links"; case EHOSTUNREACH: return "No route to host"; case EWOULDBLOCK: return "Operation would block"; #endif #if GNULIB_defined_ESTREAMS /* native Windows platforms with older */ case ETXTBSY: return "Text file busy"; case ENODATA: return "No data available"; case ENOSR: return "Out of streams resources"; case ENOSTR: return "Device not a stream"; case ETIME: return "Timer expired"; case EOTHER: return "Other error"; #endif #if GNULIB_defined_EWINSOCK /* native Windows platforms */ case ESOCKTNOSUPPORT: return "Socket type not supported"; case EPFNOSUPPORT: return "Protocol family not supported"; case ESHUTDOWN: return "Cannot send after transport endpoint shutdown"; case ETOOMANYREFS: return "Too many references: cannot splice"; case EHOSTDOWN: return "Host is down"; case EPROCLIM: return "Too many processes"; case EUSERS: return "Too many users"; case EDQUOT: return "Disk quota exceeded"; case ESTALE: return "Stale NFS file handle"; case EREMOTE: return "Object is remote"; # if HAVE_WINSOCK2_H /* WSA_INVALID_HANDLE maps to EBADF */ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */ /* WSA_INVALID_PARAMETER maps to EINVAL */ case WSA_OPERATION_ABORTED: return "Overlapped operation aborted"; case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state"; case WSA_IO_PENDING: return "Overlapped operations will complete later"; /* WSAEINTR maps to EINTR */ /* WSAEBADF maps to EBADF */ /* WSAEACCES maps to EACCES */ /* WSAEFAULT maps to EFAULT */ /* WSAEINVAL maps to EINVAL */ /* WSAEMFILE maps to EMFILE */ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */ /* WSAEINPROGRESS maps to EINPROGRESS */ /* WSAEALREADY maps to EALREADY */ /* WSAENOTSOCK maps to ENOTSOCK */ /* WSAEDESTADDRREQ maps to EDESTADDRREQ */ /* WSAEMSGSIZE maps to EMSGSIZE */ /* WSAEPROTOTYPE maps to EPROTOTYPE */ /* WSAENOPROTOOPT maps to ENOPROTOOPT */ /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ /* WSAEOPNOTSUPP maps to EOPNOTSUPP */ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */ /* WSAEADDRINUSE maps to EADDRINUSE */ /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */ /* WSAENETDOWN maps to ENETDOWN */ /* WSAENETUNREACH maps to ENETUNREACH */ /* WSAENETRESET maps to ENETRESET */ /* WSAECONNABORTED maps to ECONNABORTED */ /* WSAECONNRESET maps to ECONNRESET */ /* WSAENOBUFS maps to ENOBUFS */ /* WSAEISCONN maps to EISCONN */ /* WSAENOTCONN maps to ENOTCONN */ /* WSAESHUTDOWN is ESHUTDOWN */ /* WSAETOOMANYREFS is ETOOMANYREFS */ /* WSAETIMEDOUT maps to ETIMEDOUT */ /* WSAECONNREFUSED maps to ECONNREFUSED */ /* WSAELOOP maps to ELOOP */ /* WSAENAMETOOLONG maps to ENAMETOOLONG */ /* WSAEHOSTDOWN is EHOSTDOWN */ /* WSAEHOSTUNREACH maps to EHOSTUNREACH */ /* WSAENOTEMPTY maps to ENOTEMPTY */ /* WSAEPROCLIM is EPROCLIM */ /* WSAEUSERS is EUSERS */ /* WSAEDQUOT is EDQUOT */ /* WSAESTALE is ESTALE */ /* WSAEREMOTE is EREMOTE */ case WSASYSNOTREADY: return "Network subsystem is unavailable"; case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range"; case WSANOTINITIALISED: return "Successful WSAStartup not yet performed"; case WSAEDISCON: return "Graceful shutdown in progress"; case WSAENOMORE: case WSA_E_NO_MORE: return "No more results"; case WSAECANCELLED: case WSA_E_CANCELLED: return "Call was canceled"; case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid"; case WSAEINVALIDPROVIDER: return "Service provider is invalid"; case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize"; case WSASYSCALLFAILURE: return "System call failure"; case WSASERVICE_NOT_FOUND: return "Service not found"; case WSATYPE_NOT_FOUND: return "Class type not found"; case WSAEREFUSED: return "Database query was refused"; case WSAHOST_NOT_FOUND: return "Host not found"; case WSATRY_AGAIN: return "Nonauthoritative host not found"; case WSANO_RECOVERY: return "Nonrecoverable error"; case WSANO_DATA: return "Valid name, no data record of requested type"; /* WSA_QOS_* omitted */ # endif #endif #if GNULIB_defined_ENOMSG case ENOMSG: return "No message of desired type"; #endif #if GNULIB_defined_EIDRM case EIDRM: return "Identifier removed"; #endif #if GNULIB_defined_ENOLINK case ENOLINK: return "Link has been severed"; #endif #if GNULIB_defined_EPROTO case EPROTO: return "Protocol error"; #endif #if GNULIB_defined_EMULTIHOP case EMULTIHOP: return "Multihop attempted"; #endif #if GNULIB_defined_EBADMSG case EBADMSG: return "Bad message"; #endif #if GNULIB_defined_EOVERFLOW case EOVERFLOW: return "Value too large for defined data type"; #endif #if GNULIB_defined_ENOTSUP case ENOTSUP: return "Not supported"; #endif #if GNULIB_defined_ENETRESET case ENETRESET: return "Network dropped connection on reset"; #endif #if GNULIB_defined_ECONNABORTED case ECONNABORTED: return "Software caused connection abort"; #endif #if GNULIB_defined_ESTALE case ESTALE: return "Stale NFS file handle"; #endif #if GNULIB_defined_EDQUOT case EDQUOT: return "Disk quota exceeded"; #endif #if GNULIB_defined_ECANCELED case ECANCELED: return "Operation canceled"; #endif #if GNULIB_defined_EOWNERDEAD case EOWNERDEAD: return "Owner died"; #endif #if GNULIB_defined_ENOTRECOVERABLE case ENOTRECOVERABLE: return "State not recoverable"; #endif #if GNULIB_defined_EILSEQ case EILSEQ: return "Invalid or incomplete multibyte or wide character"; #endif default: return NULL; } } shishi-1.0.2/gl/xsize.c0000644000000000000000000000011612126660051011575 00000000000000#include #define XSIZE_INLINE _GL_EXTERN_INLINE #include "xsize.h" shishi-1.0.2/gl/xgethostname.h0000664000000000000000000000003312015626624013153 00000000000000char *xgethostname (void); shishi-1.0.2/gl/strerror-override.h0000644000000000000000000000371712126660053014153 00000000000000/* strerror-override.h --- POSIX compatible system error routine Copyright (C) 2010-2013 Free Software Foundation, Inc. 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 . */ #ifndef _GL_STRERROR_OVERRIDE_H # define _GL_STRERROR_OVERRIDE_H # include # include /* Reasonable buffer size that should never trigger ERANGE; if this proves too small, we intentionally abort(), to remind us to fix this value. */ # define STACKBUF_LEN 256 /* If ERRNUM maps to an errno value defined by gnulib, return a string describing the error. Otherwise return NULL. */ # if REPLACE_STRERROR_0 \ || GNULIB_defined_ESOCK \ || GNULIB_defined_ESTREAMS \ || GNULIB_defined_EWINSOCK \ || GNULIB_defined_ENOMSG \ || GNULIB_defined_EIDRM \ || GNULIB_defined_ENOLINK \ || GNULIB_defined_EPROTO \ || GNULIB_defined_EMULTIHOP \ || GNULIB_defined_EBADMSG \ || GNULIB_defined_EOVERFLOW \ || GNULIB_defined_ENOTSUP \ || GNULIB_defined_ENETRESET \ || GNULIB_defined_ECONNABORTED \ || GNULIB_defined_ESTALE \ || GNULIB_defined_EDQUOT \ || GNULIB_defined_ECANCELED \ || GNULIB_defined_EOWNERDEAD \ || GNULIB_defined_ENOTRECOVERABLE \ || GNULIB_defined_EILSEQ extern const char *strerror_override (int errnum); # else # define strerror_override(ignored) NULL # endif #endif /* _GL_STRERROR_OVERRIDE_H */ shishi-1.0.2/gl/float+.h0000644000000000000000000001274512126660051011633 00000000000000/* Supplemental information about the floating-point formats. Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2007. 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, 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 . */ #ifndef _FLOATPLUS_H #define _FLOATPLUS_H #include #include /* Number of bits in the mantissa of a floating-point number, including the "hidden bit". */ #if FLT_RADIX == 2 # define FLT_MANT_BIT FLT_MANT_DIG # define DBL_MANT_BIT DBL_MANT_DIG # define LDBL_MANT_BIT LDBL_MANT_DIG #elif FLT_RADIX == 4 # define FLT_MANT_BIT (FLT_MANT_DIG * 2) # define DBL_MANT_BIT (DBL_MANT_DIG * 2) # define LDBL_MANT_BIT (LDBL_MANT_DIG * 2) #elif FLT_RADIX == 16 # define FLT_MANT_BIT (FLT_MANT_DIG * 4) # define DBL_MANT_BIT (DBL_MANT_DIG * 4) # define LDBL_MANT_BIT (LDBL_MANT_DIG * 4) #endif /* Bit mask that can be used to mask the exponent, as an unsigned number. */ #define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7) #define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) #define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7) /* Number of bits used for the exponent of a floating-point number, including the exponent's sign. */ #define FLT_EXP_BIT \ (FLT_EXP_MASK < 0x100 ? 8 : \ FLT_EXP_MASK < 0x200 ? 9 : \ FLT_EXP_MASK < 0x400 ? 10 : \ FLT_EXP_MASK < 0x800 ? 11 : \ FLT_EXP_MASK < 0x1000 ? 12 : \ FLT_EXP_MASK < 0x2000 ? 13 : \ FLT_EXP_MASK < 0x4000 ? 14 : \ FLT_EXP_MASK < 0x8000 ? 15 : \ FLT_EXP_MASK < 0x10000 ? 16 : \ FLT_EXP_MASK < 0x20000 ? 17 : \ FLT_EXP_MASK < 0x40000 ? 18 : \ FLT_EXP_MASK < 0x80000 ? 19 : \ FLT_EXP_MASK < 0x100000 ? 20 : \ FLT_EXP_MASK < 0x200000 ? 21 : \ FLT_EXP_MASK < 0x400000 ? 22 : \ FLT_EXP_MASK < 0x800000 ? 23 : \ FLT_EXP_MASK < 0x1000000 ? 24 : \ FLT_EXP_MASK < 0x2000000 ? 25 : \ FLT_EXP_MASK < 0x4000000 ? 26 : \ FLT_EXP_MASK < 0x8000000 ? 27 : \ FLT_EXP_MASK < 0x10000000 ? 28 : \ FLT_EXP_MASK < 0x20000000 ? 29 : \ FLT_EXP_MASK < 0x40000000 ? 30 : \ FLT_EXP_MASK <= 0x7fffffff ? 31 : \ 32) #define DBL_EXP_BIT \ (DBL_EXP_MASK < 0x100 ? 8 : \ DBL_EXP_MASK < 0x200 ? 9 : \ DBL_EXP_MASK < 0x400 ? 10 : \ DBL_EXP_MASK < 0x800 ? 11 : \ DBL_EXP_MASK < 0x1000 ? 12 : \ DBL_EXP_MASK < 0x2000 ? 13 : \ DBL_EXP_MASK < 0x4000 ? 14 : \ DBL_EXP_MASK < 0x8000 ? 15 : \ DBL_EXP_MASK < 0x10000 ? 16 : \ DBL_EXP_MASK < 0x20000 ? 17 : \ DBL_EXP_MASK < 0x40000 ? 18 : \ DBL_EXP_MASK < 0x80000 ? 19 : \ DBL_EXP_MASK < 0x100000 ? 20 : \ DBL_EXP_MASK < 0x200000 ? 21 : \ DBL_EXP_MASK < 0x400000 ? 22 : \ DBL_EXP_MASK < 0x800000 ? 23 : \ DBL_EXP_MASK < 0x1000000 ? 24 : \ DBL_EXP_MASK < 0x2000000 ? 25 : \ DBL_EXP_MASK < 0x4000000 ? 26 : \ DBL_EXP_MASK < 0x8000000 ? 27 : \ DBL_EXP_MASK < 0x10000000 ? 28 : \ DBL_EXP_MASK < 0x20000000 ? 29 : \ DBL_EXP_MASK < 0x40000000 ? 30 : \ DBL_EXP_MASK <= 0x7fffffff ? 31 : \ 32) #define LDBL_EXP_BIT \ (LDBL_EXP_MASK < 0x100 ? 8 : \ LDBL_EXP_MASK < 0x200 ? 9 : \ LDBL_EXP_MASK < 0x400 ? 10 : \ LDBL_EXP_MASK < 0x800 ? 11 : \ LDBL_EXP_MASK < 0x1000 ? 12 : \ LDBL_EXP_MASK < 0x2000 ? 13 : \ LDBL_EXP_MASK < 0x4000 ? 14 : \ LDBL_EXP_MASK < 0x8000 ? 15 : \ LDBL_EXP_MASK < 0x10000 ? 16 : \ LDBL_EXP_MASK < 0x20000 ? 17 : \ LDBL_EXP_MASK < 0x40000 ? 18 : \ LDBL_EXP_MASK < 0x80000 ? 19 : \ LDBL_EXP_MASK < 0x100000 ? 20 : \ LDBL_EXP_MASK < 0x200000 ? 21 : \ LDBL_EXP_MASK < 0x400000 ? 22 : \ LDBL_EXP_MASK < 0x800000 ? 23 : \ LDBL_EXP_MASK < 0x1000000 ? 24 : \ LDBL_EXP_MASK < 0x2000000 ? 25 : \ LDBL_EXP_MASK < 0x4000000 ? 26 : \ LDBL_EXP_MASK < 0x8000000 ? 27 : \ LDBL_EXP_MASK < 0x10000000 ? 28 : \ LDBL_EXP_MASK < 0x20000000 ? 29 : \ LDBL_EXP_MASK < 0x40000000 ? 30 : \ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \ 32) /* Number of bits used for a floating-point number: the mantissa (not counting the "hidden bit", since it may or may not be explicit), the exponent, and the sign. */ #define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1) #define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1) #define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1) /* Number of bytes used for a floating-point number. This can be smaller than the 'sizeof'. For example, on i386 systems, 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but sizeof (long double) = 12 or = 16. */ #define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) #define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) #define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT) /* Verify that SIZEOF_FLT <= sizeof (float) etc. */ typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1]; typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1]; typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1]; #endif /* _FLOATPLUS_H */ shishi-1.0.2/gl/strverscmp.c0000644000000000000000000000745712126660054012665 00000000000000/* Compare strings while treating digits characters numerically. Copyright (C) 1997, 2000, 2002, 2004, 2006, 2009-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jean-François Bignolles , 1997. 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, 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 . */ #if !_LIBC # include #endif #include #include /* states: S_N: normal, S_I: comparing integral part, S_F: comparing fractional parts, S_Z: idem but with leading Zeroes only */ #define S_N 0x0 #define S_I 0x4 #define S_F 0x8 #define S_Z 0xC /* result_type: CMP: return diff; LEN: compare using len_diff/diff */ #define CMP 2 #define LEN 3 /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char or EOF. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition of "digit" even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) #undef __strverscmp #undef strverscmp #ifndef weak_alias # define __strverscmp strverscmp #endif /* Compare S1 and S2 as strings holding indices/version numbers, returning less than, equal to or greater than zero if S1 is less than, equal to or greater than S2 (for more info, see the texinfo doc). */ int __strverscmp (const char *s1, const char *s2) { const unsigned char *p1 = (const unsigned char *) s1; const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; int state; int diff; /* Symbol(s) 0 [1-9] others (padding) Transition (10) 0 (01) d (00) x (11) - */ static const unsigned int next_state[] = { /* state x d 0 - */ /* S_N */ S_N, S_I, S_Z, S_N, /* S_I */ S_N, S_I, S_I, S_I, /* S_F */ S_N, S_F, S_F, S_F, /* S_Z */ S_N, S_F, S_Z, S_Z }; static const int result_type[] = { /* state x/x x/d x/0 x/- d/x d/d d/0 d/- 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP, 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP, /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP, -1, CMP, CMP, CMP }; if (p1 == p2) return 0; c1 = *p1++; c2 = *p2++; /* Hint: '0' is a digit too. */ state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0)); while ((diff = c1 - c2) == 0 && c1 != '\0') { state = next_state[state]; c1 = *p1++; c2 = *p2++; state |= (c1 == '0') + (ISDIGIT (c1) != 0); } state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))]; switch (state) { case CMP: return diff; case LEN: while (ISDIGIT (*p1++)) if (!ISDIGIT (*p2++)) return 1; return ISDIGIT (*p2) ? -1 : diff; default: return state; } } #ifdef weak_alias weak_alias (__strverscmp, strverscmp) #endif shishi-1.0.2/gl/mktime.c0000644000000000000000000005562212126660053011737 00000000000000/* Convert a 'struct tm' to a time_t value. Copyright (C) 1993-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Paul Eggert . The GNU C Library 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. The GNU C Library 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 the GNU C Library; if not, see . */ /* Define this to have a standalone program to test this implementation of mktime. */ /* #define DEBUG 1 */ #ifndef _LIBC # include #endif /* Assume that leap seconds are possible, unless told otherwise. If the host has a 'zic' command with a '-L leapsecondfilename' option, then it supports leap seconds; otherwise it probably doesn't. */ #ifndef LEAP_SECONDS_POSSIBLE # define LEAP_SECONDS_POSSIBLE 1 #endif #include #include #include /* For the real memcpy prototype. */ #if DEBUG # include # include /* Make it work even if the system's libc has its own mktime routine. */ # undef mktime # define mktime my_mktime #endif /* DEBUG */ /* Some of the code in this file assumes that signed integer overflow silently wraps around. This assumption can't easily be programmed around, nor can it be checked for portably at compile-time or easily eliminated at run-time. Define WRAPV to 1 if the assumption is valid and if #pragma GCC optimize ("wrapv") does not trigger GCC bug 51793 . Otherwise, define it to 0; this forces the use of slower code that, while not guaranteed by the C Standard, works on all production platforms that we know about. */ #ifndef WRAPV # if (((__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__) \ && defined __GLIBC__) # pragma GCC optimize ("wrapv") # define WRAPV 1 # else # define WRAPV 0 # endif #endif /* Verify a requirement at compile-time (unlike assert, which is runtime). */ #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } /* A signed type that is at least one bit wider than int. */ #if INT_MAX <= LONG_MAX / 2 typedef long int long_int; #else typedef long long int long_int; #endif verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); /* Shift A right by B bits portably, by dividing A by 2**B and truncating towards minus infinity. A and B should be free of side effects, and B should be in the range 0 <= B <= INT_BITS - 2, where INT_BITS is the number of useful bits in an int. GNU code can assume that INT_BITS is at least 32. ISO C99 says that A >> B is implementation-defined if A < 0. Some implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift right in the usual way when A < 0, so SHR falls back on division if ordinary A >> B doesn't seem to be the usual signed shift. */ #define SHR(a, b) \ ((-1 >> 1 == -1 \ && (long_int) -1 >> 1 == -1 \ && ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t))) \ ? (a) >> (b) \ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) /* The extra casts in the following macros work around compiler bugs, e.g., in Cray C 5.0.3.0. */ /* True if the arithmetic type T is an integer type. bool counts as an integer. */ #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) /* True if negative values of the signed integer type T use two's complement, or if T is an unsigned integer type. */ #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) /* True if the arithmetic type T is signed. */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) /* The maximum and minimum values for the integer type T. These macros have undefined behavior if T is signed and has padding bits. If this is a problem for you, please let us know how to fix it for your host. */ #define TYPE_MINIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) 0 \ : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) #ifndef TIME_T_MIN # define TIME_T_MIN TYPE_MINIMUM (time_t) #endif #ifndef TIME_T_MAX # define TIME_T_MAX TYPE_MAXIMUM (time_t) #endif #define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1) verify (time_t_is_integer, TYPE_IS_INTEGER (time_t)); verify (twos_complement_arithmetic, (TYPE_TWOS_COMPLEMENT (int) && TYPE_TWOS_COMPLEMENT (long_int) && TYPE_TWOS_COMPLEMENT (time_t))); #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0); /* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */ static int leapyear (long_int year) { /* Don't add YEAR to TM_YEAR_BASE, as that might overflow. Also, work even if YEAR is negative. */ return ((year & 3) == 0 && (year % 100 != 0 || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3))); } /* How many days come before each month (0-12). */ #ifndef _LIBC static #endif const unsigned short int __mon_yday[2][13] = { /* Normal years. */ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, /* Leap years. */ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; #ifndef _LIBC /* Portable standalone applications should supply a that declares a POSIX-compliant localtime_r, for the benefit of older implementations that lack localtime_r or have a nonstandard one. See the gnulib time_r module for one way to implement this. */ # undef __localtime_r # define __localtime_r localtime_r # define __mktime_internal mktime_internal # include "mktime-internal.h" #endif /* Return 1 if the values A and B differ according to the rules for tm_isdst: A and B differ if one is zero and the other positive. */ static int isdst_differ (int a, int b) { return (!a != !b) && (0 <= a) && (0 <= b); } /* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) - (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks were not adjusted between the time stamps. The YEAR values uses the same numbering as TP->tm_year. Values need not be in the usual range. However, YEAR1 must not be less than 2 * INT_MIN or greater than 2 * INT_MAX. The result may overflow. It is the caller's responsibility to detect overflow. */ static time_t ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1, int year0, int yday0, int hour0, int min0, int sec0) { verify (C99_integer_division, -1 / 2 == 0); /* Compute intervening leap days correctly even if year is negative. Take care to avoid integer overflow here. */ int a4 = SHR (year1, 2) + SHR (TM_YEAR_BASE, 2) - ! (year1 & 3); int b4 = SHR (year0, 2) + SHR (TM_YEAR_BASE, 2) - ! (year0 & 3); int a100 = a4 / 25 - (a4 % 25 < 0); int b100 = b4 / 25 - (b4 % 25 < 0); int a400 = SHR (a100, 2); int b400 = SHR (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); /* Compute the desired time in time_t precision. Overflow might occur here. */ time_t tyear1 = year1; time_t years = tyear1 - year0; time_t days = 365 * years + yday1 - yday0 + intervening_leap_days; time_t hours = 24 * days + hour1 - hour0; time_t minutes = 60 * hours + min1 - min0; time_t seconds = 60 * minutes + sec1 - sec0; return seconds; } /* Return the average of A and B, even if A + B would overflow. */ static time_t time_t_avg (time_t a, time_t b) { return SHR (a, 1) + SHR (b, 1) + (a & b & 1); } /* Return 1 if A + B does not overflow. If time_t is unsigned and if B's top bit is set, assume that the sum represents A - -B, and return 1 if the subtraction does not wrap around. */ static int time_t_add_ok (time_t a, time_t b) { if (! TYPE_SIGNED (time_t)) { time_t sum = a + b; return (sum < a) == (TIME_T_MIDPOINT <= b); } else if (WRAPV) { time_t sum = a + b; return (sum < a) == (b < 0); } else { time_t avg = time_t_avg (a, b); return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; } } /* Return 1 if A + B does not overflow. */ static int time_t_int_add_ok (time_t a, int b) { verify (int_no_wider_than_time_t, INT_MAX <= TIME_T_MAX); if (WRAPV) { time_t sum = a + b; return (sum < a) == (b < 0); } else { int a_odd = a & 1; time_t avg = SHR (a, 1) + (SHR (b, 1) + (a_odd & b)); return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; } } /* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC), assuming that *T corresponds to *TP and that no clock adjustments occurred between *TP and the desired time. If TP is null, return a value not equal to *T; this avoids false matches. If overflow occurs, yield the minimal or maximal value, except do not yield a value equal to *T. */ static time_t guess_time_tm (long_int year, long_int yday, int hour, int min, int sec, const time_t *t, const struct tm *tp) { if (tp) { time_t d = ydhms_diff (year, yday, hour, min, sec, tp->tm_year, tp->tm_yday, tp->tm_hour, tp->tm_min, tp->tm_sec); if (time_t_add_ok (*t, d)) return *t + d; } /* Overflow occurred one way or another. Return the nearest result that is actually in range, except don't report a zero difference if the actual difference is nonzero, as that would cause a false match; and don't oscillate between two values, as that would confuse the spring-forward gap detector. */ return (*t < TIME_T_MIDPOINT ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN) : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX)); } /* Use CONVERT to convert *T to a broken down time in *TP. If *T is out of range for conversion, adjust it so that it is the nearest in-range value and then convert that. */ static struct tm * ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), time_t *t, struct tm *tp) { struct tm *r = convert (t, tp); if (!r && *t) { time_t bad = *t; time_t ok = 0; /* BAD is a known unconvertible time_t, and OK is a known good one. Use binary search to narrow the range between BAD and OK until they differ by 1. */ while (bad != ok + (bad < 0 ? -1 : 1)) { time_t mid = *t = time_t_avg (ok, bad); r = convert (t, tp); if (r) ok = mid; else bad = mid; } if (!r && ok) { /* The last conversion attempt failed; revert to the most recent successful attempt. */ *t = ok; r = convert (t, tp); } } return r; } /* Convert *TP to a time_t value, inverting the monotonic and mostly-unit-linear conversion function CONVERT. Use *OFFSET to keep track of a guess at the offset of the result, compared to what the result would be for UTC without leap seconds. If *OFFSET's guess is correct, only one CONVERT call is needed. This function is external because it is used also by timegm.c. */ time_t __mktime_internal (struct tm *tp, struct tm *(*convert) (const time_t *, struct tm *), time_t *offset) { time_t t, gt, t0, t1, t2; struct tm tm; /* The maximum number of probes (calls to CONVERT) should be enough to handle any combinations of time zone rule changes, solar time, leap seconds, and oscillations around a spring-forward gap. POSIX.1 prohibits leap seconds, but some hosts have them anyway. */ int remaining_probes = 6; /* Time requested. Copy it in case CONVERT modifies *TP; this can occur if TP is localtime's returned value and CONVERT is localtime. */ int sec = tp->tm_sec; int min = tp->tm_min; int hour = tp->tm_hour; int mday = tp->tm_mday; int mon = tp->tm_mon; int year_requested = tp->tm_year; int isdst = tp->tm_isdst; /* 1 if the previous probe was DST. */ int dst2; /* Ensure that mon is in range, and set year accordingly. */ int mon_remainder = mon % 12; int negative_mon_remainder = mon_remainder < 0; int mon_years = mon / 12 - negative_mon_remainder; long_int lyear_requested = year_requested; long_int year = lyear_requested + mon_years; /* The other values need not be in range: the remaining code handles minor overflows correctly, assuming int and time_t arithmetic wraps around. Major overflows are caught at the end. */ /* Calculate day of year from year, month, and day of month. The result need not be in range. */ int mon_yday = ((__mon_yday[leapyear (year)] [mon_remainder + 12 * negative_mon_remainder]) - 1); long_int lmday = mday; long_int yday = mon_yday + lmday; time_t guessed_offset = *offset; int sec_requested = sec; if (LEAP_SECONDS_POSSIBLE) { /* Handle out-of-range seconds specially, since ydhms_tm_diff assumes every minute has 60 seconds. */ if (sec < 0) sec = 0; if (59 < sec) sec = 59; } /* Invert CONVERT by probing. First assume the same offset as last time. */ t0 = ydhms_diff (year, yday, hour, min, sec, EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset); if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3) { /* time_t isn't large enough to rule out overflows, so check for major overflows. A gross check suffices, since if t0 has overflowed, it is off by a multiple of TIME_T_MAX - TIME_T_MIN + 1. So ignore any component of the difference that is bounded by a small value. */ /* Approximate log base 2 of the number of time units per biennium. A biennium is 2 years; use this unit instead of years to avoid integer overflow. For example, 2 average Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds, which is 63113904 seconds, and rint (log2 (63113904)) is 26. */ int ALOG2_SECONDS_PER_BIENNIUM = 26; int ALOG2_MINUTES_PER_BIENNIUM = 20; int ALOG2_HOURS_PER_BIENNIUM = 14; int ALOG2_DAYS_PER_BIENNIUM = 10; int LOG2_YEARS_PER_BIENNIUM = 1; int approx_requested_biennia = (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM) - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM) + SHR (mday, ALOG2_DAYS_PER_BIENNIUM) + SHR (hour, ALOG2_HOURS_PER_BIENNIUM) + SHR (min, ALOG2_MINUTES_PER_BIENNIUM) + (LEAP_SECONDS_POSSIBLE ? 0 : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM))); int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM); int diff = approx_biennia - approx_requested_biennia; int approx_abs_diff = diff < 0 ? -1 - diff : diff; /* IRIX 4.0.5 cc miscalculates TIME_T_MIN / 3: it erroneously gives a positive value of 715827882. Setting a variable first then doing math on it seems to work. (ghazi@caip.rutgers.edu) */ time_t time_t_max = TIME_T_MAX; time_t time_t_min = TIME_T_MIN; time_t overflow_threshold = (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM; if (overflow_threshold < approx_abs_diff) { /* Overflow occurred. Try repairing it; this might work if the time zone offset is enough to undo the overflow. */ time_t repaired_t0 = -1 - t0; approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM); diff = approx_biennia - approx_requested_biennia; approx_abs_diff = diff < 0 ? -1 - diff : diff; if (overflow_threshold < approx_abs_diff) return -1; guessed_offset += repaired_t0 - t0; t0 = repaired_t0; } } /* Repeatedly use the error to improve the guess. */ for (t = t1 = t2 = t0, dst2 = 0; (gt = guess_time_tm (year, yday, hour, min, sec, &t, ranged_convert (convert, &t, &tm)), t != gt); t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0) if (t == t1 && t != t2 && (tm.tm_isdst < 0 || (isdst < 0 ? dst2 <= (tm.tm_isdst != 0) : (isdst != 0) != (tm.tm_isdst != 0)))) /* We can't possibly find a match, as we are oscillating between two values. The requested time probably falls within a spring-forward gap of size GT - T. Follow the common practice in this case, which is to return a time that is GT - T away from the requested time, preferring a time whose tm_isdst differs from the requested value. (If no tm_isdst was requested and only one of the two values has a nonzero tm_isdst, prefer that value.) In practice, this is more useful than returning -1. */ goto offset_found; else if (--remaining_probes == 0) return -1; /* We have a match. Check whether tm.tm_isdst has the requested value, if any. */ if (isdst_differ (isdst, tm.tm_isdst)) { /* tm.tm_isdst has the wrong value. Look for a neighboring time with the right value, and use its UTC offset. Heuristic: probe the adjacent timestamps in both directions, looking for the desired isdst. This should work for all real time zone histories in the tz database. */ /* Distance between probes when looking for a DST boundary. In tzdata2003a, the shortest period of DST is 601200 seconds (e.g., America/Recife starting 2000-10-08 01:00), and the shortest period of non-DST surrounded by DST is 694800 seconds (Africa/Tunis starting 1943-04-17 01:00). Use the minimum of these two values, so we don't miss these short periods when probing. */ int stride = 601200; /* The longest period of DST in tzdata2003a is 536454000 seconds (e.g., America/Jujuy starting 1946-10-01 01:00). The longest period of non-DST is much longer, but it makes no real sense to search for more than a year of non-DST, so use the DST max. */ int duration_max = 536454000; /* Search in both directions, so the maximum distance is half the duration; add the stride to avoid off-by-1 problems. */ int delta_bound = duration_max / 2 + stride; int delta, direction; for (delta = stride; delta < delta_bound; delta += stride) for (direction = -1; direction <= 1; direction += 2) if (time_t_int_add_ok (t, delta * direction)) { time_t ot = t + delta * direction; struct tm otm; ranged_convert (convert, &ot, &otm); if (! isdst_differ (isdst, otm.tm_isdst)) { /* We found the desired tm_isdst. Extrapolate back to the desired time. */ t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm); ranged_convert (convert, &t, &tm); goto offset_found; } } } offset_found: *offset = guessed_offset + t - t0; if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec) { /* Adjust time to reflect the tm_sec requested, not the normalized value. Also, repair any damage from a false match due to a leap second. */ int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec; if (! time_t_int_add_ok (t, sec_requested)) return -1; t1 = t + sec_requested; if (! time_t_int_add_ok (t1, sec_adjustment)) return -1; t2 = t1 + sec_adjustment; if (! convert (&t2, &tm)) return -1; t = t2; } *tp = tm; return t; } /* FIXME: This should use a signed type wide enough to hold any UTC offset in seconds. 'int' should be good enough for GNU code. We can't fix this unilaterally though, as other modules invoke __mktime_internal. */ static time_t localtime_offset; /* Convert *TP to a time_t value. */ time_t mktime (struct tm *tp) { #ifdef _LIBC /* POSIX.1 8.1.1 requires that whenever mktime() is called, the time zone names contained in the external variable 'tzname' shall be set as if the tzset() function had been called. */ __tzset (); #endif return __mktime_internal (tp, __localtime_r, &localtime_offset); } #ifdef weak_alias weak_alias (mktime, timelocal) #endif #ifdef _LIBC libc_hidden_def (mktime) libc_hidden_weak (timelocal) #endif #if DEBUG static int not_equal_tm (const struct tm *a, const struct tm *b) { return ((a->tm_sec ^ b->tm_sec) | (a->tm_min ^ b->tm_min) | (a->tm_hour ^ b->tm_hour) | (a->tm_mday ^ b->tm_mday) | (a->tm_mon ^ b->tm_mon) | (a->tm_year ^ b->tm_year) | (a->tm_yday ^ b->tm_yday) | isdst_differ (a->tm_isdst, b->tm_isdst)); } static void print_tm (const struct tm *tp) { if (tp) printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d", tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, tp->tm_yday, tp->tm_wday, tp->tm_isdst); else printf ("0"); } static int check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt) { if (tk != tl || !lt || not_equal_tm (&tmk, lt)) { printf ("mktime ("); print_tm (lt); printf (")\nyields ("); print_tm (&tmk); printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl); return 1; } return 0; } int main (int argc, char **argv) { int status = 0; struct tm tm, tmk, tml; struct tm *lt; time_t tk, tl, tl1; char trailer; if ((argc == 3 || argc == 4) && (sscanf (argv[1], "%d-%d-%d%c", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer) == 3) && (sscanf (argv[2], "%d:%d:%d%c", &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer) == 3)) { tm.tm_year -= TM_YEAR_BASE; tm.tm_mon--; tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]); tmk = tm; tl = mktime (&tmk); lt = localtime (&tl); if (lt) { tml = *lt; lt = &tml; } printf ("mktime returns %ld == ", (long int) tl); print_tm (&tmk); printf ("\n"); status = check_result (tl, tmk, tl, lt); } else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0)) { time_t from = atol (argv[1]); time_t by = atol (argv[2]); time_t to = atol (argv[3]); if (argc == 4) for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) { lt = localtime (&tl); if (lt) { tmk = tml = *lt; tk = mktime (&tmk); status |= check_result (tk, tmk, tl, &tml); } else { printf ("localtime (%ld) yields 0\n", (long int) tl); status = 1; } tl1 = tl + by; if ((tl1 < tl) != (by < 0)) break; } else for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) { /* Null benchmark. */ lt = localtime (&tl); if (lt) { tmk = tml = *lt; tk = tl; status |= check_result (tk, tmk, tl, &tml); } else { printf ("localtime (%ld) yields 0\n", (long int) tl); status = 1; } tl1 = tl + by; if ((tl1 < tl) != (by < 0)) break; } } else printf ("Usage:\ \t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\ \t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\ \t%s FROM BY TO - # Do not test those values (for benchmark).\n", argv[0], argv[0], argv[0]); return status; } #endif /* DEBUG */ /* Local Variables: compile-command: "gcc -DDEBUG -I. -Wall -W -O2 -g mktime.c -o mktime" End: */ shishi-1.0.2/gl/errno.in.h0000644000000000000000000001646312126660051012206 00000000000000/* A POSIX-like . Copyright (C) 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _@GUARD_PREFIX@_ERRNO_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_ERRNO_H@ #ifndef _@GUARD_PREFIX@_ERRNO_H #define _@GUARD_PREFIX@_ERRNO_H /* On native Windows platforms, many macros are not defined. */ # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* These are the same values as defined by MSVC 10, for interoperability. */ # ifndef ENOMSG # define ENOMSG 122 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 111 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 121 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 134 # define GNULIB_defined_EPROTO 1 # endif # ifndef EBADMSG # define EBADMSG 104 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 132 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 129 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 117 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 106 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ECANCELED # define ECANCELED 105 # define GNULIB_defined_ECANCELED 1 # endif # ifndef EOWNERDEAD # define EOWNERDEAD 133 # define GNULIB_defined_EOWNERDEAD 1 # endif # ifndef ENOTRECOVERABLE # define ENOTRECOVERABLE 127 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EINPROGRESS # define EINPROGRESS 112 # define EALREADY 103 # define ENOTSOCK 128 # define EDESTADDRREQ 109 # define EMSGSIZE 115 # define EPROTOTYPE 136 # define ENOPROTOOPT 123 # define EPROTONOSUPPORT 135 # define EOPNOTSUPP 130 # define EAFNOSUPPORT 102 # define EADDRINUSE 100 # define EADDRNOTAVAIL 101 # define ENETDOWN 116 # define ENETUNREACH 118 # define ECONNRESET 108 # define ENOBUFS 119 # define EISCONN 113 # define ENOTCONN 126 # define ETIMEDOUT 138 # define ECONNREFUSED 107 # define ELOOP 114 # define EHOSTUNREACH 110 # define EWOULDBLOCK 140 # define GNULIB_defined_ESOCK 1 # endif # ifndef ETXTBSY # define ETXTBSY 139 # define ENODATA 120 /* not required by POSIX */ # define ENOSR 124 /* not required by POSIX */ # define ENOSTR 125 /* not required by POSIX */ # define ETIME 137 /* not required by POSIX */ # define EOTHER 131 /* not required by POSIX */ # define GNULIB_defined_ESTREAMS 1 # endif /* These are intentionally the same values as the WSA* error numbers, defined in . */ # define ESOCKTNOSUPPORT 10044 /* not required by POSIX */ # define EPFNOSUPPORT 10046 /* not required by POSIX */ # define ESHUTDOWN 10058 /* not required by POSIX */ # define ETOOMANYREFS 10059 /* not required by POSIX */ # define EHOSTDOWN 10064 /* not required by POSIX */ # define EPROCLIM 10067 /* not required by POSIX */ # define EUSERS 10068 /* not required by POSIX */ # define EDQUOT 10069 # define ESTALE 10070 # define EREMOTE 10071 /* not required by POSIX */ # define GNULIB_defined_EWINSOCK 1 # endif /* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */ # if @EMULTIHOP_HIDDEN@ # define EMULTIHOP @EMULTIHOP_VALUE@ # define GNULIB_defined_EMULTIHOP 1 # endif # if @ENOLINK_HIDDEN@ # define ENOLINK @ENOLINK_VALUE@ # define GNULIB_defined_ENOLINK 1 # endif # if @EOVERFLOW_HIDDEN@ # define EOVERFLOW @EOVERFLOW_VALUE@ # define GNULIB_defined_EOVERFLOW 1 # endif /* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK, EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined. Likewise, on NonStop Kernel, EDQUOT is not defined. Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151, HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133. Note: When one of these systems defines some of these macros some day, binaries will have to be recompiled so that they recognizes the new errno values from the system. */ # ifndef ENOMSG # define ENOMSG 2000 # define GNULIB_defined_ENOMSG 1 # endif # ifndef EIDRM # define EIDRM 2001 # define GNULIB_defined_EIDRM 1 # endif # ifndef ENOLINK # define ENOLINK 2002 # define GNULIB_defined_ENOLINK 1 # endif # ifndef EPROTO # define EPROTO 2003 # define GNULIB_defined_EPROTO 1 # endif # ifndef EMULTIHOP # define EMULTIHOP 2004 # define GNULIB_defined_EMULTIHOP 1 # endif # ifndef EBADMSG # define EBADMSG 2005 # define GNULIB_defined_EBADMSG 1 # endif # ifndef EOVERFLOW # define EOVERFLOW 2006 # define GNULIB_defined_EOVERFLOW 1 # endif # ifndef ENOTSUP # define ENOTSUP 2007 # define GNULIB_defined_ENOTSUP 1 # endif # ifndef ENETRESET # define ENETRESET 2011 # define GNULIB_defined_ENETRESET 1 # endif # ifndef ECONNABORTED # define ECONNABORTED 2012 # define GNULIB_defined_ECONNABORTED 1 # endif # ifndef ESTALE # define ESTALE 2009 # define GNULIB_defined_ESTALE 1 # endif # ifndef EDQUOT # define EDQUOT 2010 # define GNULIB_defined_EDQUOT 1 # endif # ifndef ECANCELED # define ECANCELED 2008 # define GNULIB_defined_ECANCELED 1 # endif /* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not defined. */ # ifndef EOWNERDEAD # if defined __sun /* Use the same values as defined for Solaris >= 8, for interoperability. */ # define EOWNERDEAD 58 # define ENOTRECOVERABLE 59 # elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* We have a conflict here: pthreads-win32 defines these values differently than MSVC 10. It's hairy to decide which one to use. */ # if defined __MINGW32__ && !defined USE_WINDOWS_THREADS /* Use the same values as defined by pthreads-win32, for interoperability. */ # define EOWNERDEAD 43 # define ENOTRECOVERABLE 44 # else /* Use the same values as defined by MSVC 10, for interoperability. */ # define EOWNERDEAD 133 # define ENOTRECOVERABLE 127 # endif # else # define EOWNERDEAD 2013 # define ENOTRECOVERABLE 2014 # endif # define GNULIB_defined_EOWNERDEAD 1 # define GNULIB_defined_ENOTRECOVERABLE 1 # endif # ifndef EILSEQ # define EILSEQ 2015 # define GNULIB_defined_EILSEQ 1 # endif #endif /* _@GUARD_PREFIX@_ERRNO_H */ #endif /* _@GUARD_PREFIX@_ERRNO_H */ shishi-1.0.2/gl/itold.c0000644000000000000000000000201012126660051011541 00000000000000/* Replacement for 'int' to 'long double' conversion routine. Copyright (C) 2011-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2011. 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 . */ #include /* Specification. */ #include void _Qp_itoq (long double *result, int a) { /* Convert from 'int' to 'double', then from 'double' to 'long double'. */ *result = (double) a; } shishi-1.0.2/gl/xalloc.h0000644000000000000000000001670212126660054011735 00000000000000/* xalloc.h -- malloc with out-of-memory checking Copyright (C) 1990-2000, 2003-2004, 2006-2013 Free Software Foundation, Inc. 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 . */ #ifndef XALLOC_H_ #define XALLOC_H_ #include #include "xalloc-oversized.h" _GL_INLINE_HEADER_BEGIN #ifndef XALLOC_INLINE # define XALLOC_INLINE _GL_INLINE #endif #ifdef __cplusplus extern "C" { #endif #if __GNUC__ >= 3 # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) #else # define _GL_ATTRIBUTE_MALLOC #endif #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) #else # define _GL_ATTRIBUTE_ALLOC_SIZE(args) #endif /* This function is always triggered when memory is exhausted. It must be defined by the application, either explicitly or by using gnulib's xalloc-die module. This is the function to call when one wants the program to die because of a memory allocation failure. */ extern _Noreturn void xalloc_die (void); void *xmalloc (size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); void *xzalloc (size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); void *xcalloc (size_t n, size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); void *xrealloc (void *p, size_t s) _GL_ATTRIBUTE_ALLOC_SIZE ((2)); void *x2realloc (void *p, size_t *pn); void *xmemdup (void const *p, size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2)); char *xstrdup (char const *str) _GL_ATTRIBUTE_MALLOC; /* In the following macros, T must be an elementary or structure/union or typedef'ed type, or a pointer to such a type. To apply one of the following macros to a function pointer or array type, you need to typedef it first and use the typedef name. */ /* Allocate an object of type T dynamically, with error checking. */ /* extern t *XMALLOC (typename t); */ #define XMALLOC(t) ((t *) xmalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking. */ /* extern t *XNMALLOC (size_t n, typename t); */ #define XNMALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t)))) /* Allocate an object of type T dynamically, with error checking, and zero it. */ /* extern t *XZALLOC (typename t); */ #define XZALLOC(t) ((t *) xzalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking, and zero it. */ /* extern t *XCALLOC (size_t n, typename t); */ #define XCALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t)))) /* Allocate an array of N objects, each with S bytes of memory, dynamically, with error checking. S must be nonzero. */ XALLOC_INLINE void *xnmalloc (size_t n, size_t s) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); XALLOC_INLINE void * xnmalloc (size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xmalloc (n * s); } /* Change the size of an allocated block of memory P to an array of N objects each of S bytes, with error checking. S must be nonzero. */ XALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s) _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)); XALLOC_INLINE void * xnrealloc (void *p, size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xrealloc (p, n * s); } /* If P is null, allocate a block of at least *PN such objects; otherwise, reallocate P so that it contains more than *PN objects each of S bytes. *PN must be nonzero unless P is null, and S must be nonzero. Set *PN to the new number of objects, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. Repeated reallocations are guaranteed to make progress, either by allocating an initial block with a nonzero size, or by allocating a larger block. In the following implementation, nonzero sizes are increased by a factor of approximately 1.5 so that repeated reallocations have O(N) overall cost rather than O(N**2) cost, but the specification for this function does not guarantee that rate. Here is an example of use: int *p = NULL; size_t used = 0; size_t allocated = 0; void append_int (int value) { if (used == allocated) p = x2nrealloc (p, &allocated, sizeof *p); p[used++] = value; } This causes x2nrealloc to allocate a block of some nonzero size the first time it is called. To have finer-grained control over the initial size, set *PN to a nonzero value before calling this function with P == NULL. For example: int *p = NULL; size_t used = 0; size_t allocated = 0; size_t allocated1 = 1000; void append_int (int value) { if (used == allocated) { p = x2nrealloc (p, &allocated1, sizeof *p); allocated = allocated1; } p[used++] = value; } */ XALLOC_INLINE void * x2nrealloc (void *p, size_t *pn, size_t s) { size_t n = *pn; if (! p) { if (! n) { /* The approximate size to use for initial small allocation requests, when the invoking code specifies an old size of zero. This is the largest "small" request for the GNU C library malloc. */ enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 }; n = DEFAULT_MXFAST / s; n += !n; } } else { /* Set N = ceil (1.5 * N) so that progress is made if N == 1. Check for overflow, so that N * S stays in size_t range. The check is slightly conservative, but an exact check isn't worth the trouble. */ if ((size_t) -1 / 3 * 2 / s <= n) xalloc_die (); n += (n + 1) / 2; } *pn = n; return xrealloc (p, n * s); } /* Return a pointer to a new buffer of N bytes. This is like xmalloc, except it returns char *. */ XALLOC_INLINE char *xcharalloc (size_t n) _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); XALLOC_INLINE char * xcharalloc (size_t n) { return XNMALLOC (n, char); } #ifdef __cplusplus } /* C++ does not allow conversions from void * to other pointer types without a cast. Use templates to work around the problem when possible. */ template inline T * xrealloc (T *p, size_t s) { return (T *) xrealloc ((void *) p, s); } template inline T * xnrealloc (T *p, size_t n, size_t s) { return (T *) xnrealloc ((void *) p, n, s); } template inline T * x2realloc (T *p, size_t *pn) { return (T *) x2realloc ((void *) p, pn); } template inline T * x2nrealloc (T *p, size_t *pn, size_t s) { return (T *) x2nrealloc ((void *) p, pn, s); } template inline T * xmemdup (T const *p, size_t s) { return (T *) xmemdup ((void const *) p, s); } #endif #endif /* !XALLOC_H_ */ shishi-1.0.2/gl/strncasecmp.c0000644000000000000000000000355712126660054012774 00000000000000/* strncasecmp.c -- case insensitive string comparator Copyright (C) 1998-1999, 2005-2007, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #include /* Specification. */ #include #include #include #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) /* Compare no more than N bytes of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function cannot work correctly in multibyte locales. */ int strncasecmp (const char *s1, const char *s2, size_t n) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2 || n == 0) return 0; do { c1 = TOLOWER (*p1); c2 = TOLOWER (*p2); if (--n == 0 || c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); if (UCHAR_MAX <= INT_MAX) return c1 - c2; else /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); } shishi-1.0.2/gl/fd-hook.c0000644000000000000000000000701212126660051011764 00000000000000/* Hook for making making file descriptor functions close(), ioctl() extensible. Copyright (C) 2009-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2009. 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 . */ #include /* Specification. */ #include "fd-hook.h" #include /* Currently, this entire code is only needed for the handling of sockets on native Windows platforms. */ #if WINDOWS_SOCKETS /* The first and last link in the doubly linked list. Initially the list is empty. */ static struct fd_hook anchor = { &anchor, &anchor, NULL, NULL }; int execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary, int fd) { if (remaining_list == &anchor) /* End of list reached. */ return primary (fd); else return remaining_list->private_close_fn (remaining_list->private_next, primary, fd); } int execute_all_close_hooks (gl_close_fn primary, int fd) { return execute_close_hooks (anchor.private_next, primary, fd); } int execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary, int fd, int request, void *arg) { if (remaining_list == &anchor) /* End of list reached. */ return primary (fd, request, arg); else return remaining_list->private_ioctl_fn (remaining_list->private_next, primary, fd, request, arg); } int execute_all_ioctl_hooks (gl_ioctl_fn primary, int fd, int request, void *arg) { return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg); } void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link) { if (close_hook == NULL) close_hook = execute_close_hooks; if (ioctl_hook == NULL) ioctl_hook = execute_ioctl_hooks; if (link->private_next == NULL && link->private_prev == NULL) { /* Add the link to the doubly linked list. */ link->private_next = anchor.private_next; link->private_prev = &anchor; link->private_close_fn = close_hook; link->private_ioctl_fn = ioctl_hook; anchor.private_next->private_prev = link; anchor.private_next = link; } else { /* The link is already in use. */ if (link->private_close_fn != close_hook || link->private_ioctl_fn != ioctl_hook) abort (); } } void unregister_fd_hook (struct fd_hook *link) { struct fd_hook *next = link->private_next; struct fd_hook *prev = link->private_prev; if (next != NULL && prev != NULL) { /* The link is in use. Remove it from the doubly linked list. */ prev->private_next = next; next->private_prev = prev; /* Clear the link, to mark it unused. */ link->private_next = NULL; link->private_prev = NULL; link->private_close_fn = NULL; link->private_ioctl_fn = NULL; } } #endif shishi-1.0.2/gl/xvasprintf.c0000644000000000000000000000530612126660054012650 00000000000000/* vasprintf and asprintf with out-of-memory checking. Copyright (C) 1999, 2002-2004, 2006-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include "xvasprintf.h" #include #include #include #include #include "xalloc.h" /* Checked size_t computations. */ #include "xsize.h" static char * xstrcat (size_t argcount, va_list args) { char *result; va_list ap; size_t totalsize; size_t i; char *p; /* Determine the total size. */ totalsize = 0; va_copy (ap, args); for (i = argcount; i > 0; i--) { const char *next = va_arg (ap, const char *); totalsize = xsum (totalsize, strlen (next)); } va_end (ap); /* Test for overflow in the summing pass above or in (totalsize + 1) below. Also, don't return a string longer than INT_MAX, for consistency with vasprintf(). */ if (totalsize == SIZE_MAX || totalsize > INT_MAX) { errno = EOVERFLOW; return NULL; } /* Allocate and fill the result string. */ result = XNMALLOC (totalsize + 1, char); p = result; for (i = argcount; i > 0; i--) { const char *next = va_arg (args, const char *); size_t len = strlen (next); memcpy (p, next, len); p += len; } *p = '\0'; return result; } char * xvasprintf (const char *format, va_list args) { char *result; /* Recognize the special case format = "%s...%s". It is a frequently used idiom for string concatenation and needs to be fast. We don't want to have a separate function xstrcat() for this purpose. */ { size_t argcount = 0; const char *f; for (f = format;;) { if (*f == '\0') /* Recognized the special case of string concatenation. */ return xstrcat (argcount, args); if (*f != '%') break; f++; if (*f != 's') break; f++; argcount++; } } if (vasprintf (&result, format, args) < 0) { if (errno == ENOMEM) xalloc_die (); return NULL; } return result; } shishi-1.0.2/gl/xgetdomainname.c0000644000000000000000000000423212126660054013441 00000000000000/* xgetdomainname.c -- Return the NIS domain name, without size limitations. Copyright (C) 1992, 1996, 2000-2001, 2003-2004, 2006, 2008-2013 Free Software Foundation, Inc. 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 . */ /* Based on xgethostname.c, written by Jim Meyering. */ #include /* Specification. */ #include "xgetdomainname.h" /* Get getdomainname. */ #include /* Get errno. */ #include /* Get free. */ #include #include "xalloc.h" #ifndef INITIAL_DOMAINNAME_LENGTH # define INITIAL_DOMAINNAME_LENGTH 34 #endif /* Return the NIS domain name of the machine, in malloc'd storage. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. WARNING! The NIS domain name is usually the empty string or "(none)" when not using NIS. If malloc fails, exit. Upon any other failure, set errno and return NULL. */ char * xgetdomainname (void) { char *domainname; size_t size; size = INITIAL_DOMAINNAME_LENGTH; domainname = xmalloc (size); while (1) { int k = size - 1; int err; errno = 0; domainname[k] = '\0'; err = getdomainname (domainname, size); if (err >= 0 && domainname[k] == '\0') break; else if (err < 0 && errno != EINVAL) { int saved_errno = errno; free (domainname); errno = saved_errno; return NULL; } size *= 2; domainname = xrealloc (domainname, size); } return domainname; } shishi-1.0.2/gl/size_max.h0000644000000000000000000000221112126660053012257 00000000000000/* size_max.h -- declare SIZE_MAX through system headers Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. Written by Simon Josefsson. 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, 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 . */ #ifndef GNULIB_SIZE_MAX_H #define GNULIB_SIZE_MAX_H /* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */ # include /* Get SIZE_MAX declaration on systems like glibc 2. */ # if HAVE_STDINT_H # include # endif /* On systems where these include files don't define it, SIZE_MAX is defined in config.h. */ #endif /* GNULIB_SIZE_MAX_H */ shishi-1.0.2/gl/xalloc-oversized.h0000644000000000000000000000322712126660054013743 00000000000000/* xalloc-oversized.h -- memory allocation size checking Copyright (C) 1990-2000, 2003-2004, 2006-2013 Free Software Foundation, Inc. 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 . */ #ifndef XALLOC_OVERSIZED_H_ # define XALLOC_OVERSIZED_H_ # include /* Return 1 if an array of N objects, each of size S, cannot exist due to size arithmetic overflow. S must be positive and N must be nonnegative. This is a macro, not a function, so that it works correctly even when SIZE_MAX < N. By gnulib convention, SIZE_MAX represents overflow in size calculations, so the conservative dividend to use here is SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. However, malloc (SIZE_MAX) fails on all known hosts where sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for exactly-SIZE_MAX allocations on such hosts; this avoids a test and branch when S is known to be 1. */ # define xalloc_oversized(n, s) \ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) #endif /* !XALLOC_OVERSIZED_H_ */ shishi-1.0.2/gl/pathmax.h0000644000000000000000000000555612126660053012121 00000000000000/* Define PATH_MAX somehow. Requires sys/types.h. Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _PATHMAX_H # define _PATHMAX_H /* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename, including the terminating NUL byte. PATH_MAX is not defined on systems which have no limit on filename length, such as GNU/Hurd. This file does *not* define PATH_MAX always. Programs that use this file can handle the GNU/Hurd case in several ways: - Either with a package-wide handling, or with a per-file handling, - Either through a #ifdef PATH_MAX or through a fallback like #ifndef PATH_MAX # define PATH_MAX 8192 #endif or through a fallback like #ifndef PATH_MAX # define PATH_MAX pathconf ("/", _PC_PATH_MAX) #endif */ # include # include # ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 256 # endif /* Don't include sys/param.h if it already has been. */ # if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include # endif # if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN # endif # ifdef __hpux /* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename, *not* including the terminating NUL byte, and is set to 1023. Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is not defined at all any more. */ # undef PATH_MAX # define PATH_MAX 1024 # endif # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com, section "Maximum Path Length Limitation", explains that the maximum size of a filename, including the terminating NUL byte, is 260 = 3 + 256 + 1. This is the same value as - FILENAME_MAX in , - _MAX_PATH in , - MAX_PATH in . Undefine the original value, because mingw's gets it wrong. */ # undef PATH_MAX # define PATH_MAX 260 # endif #endif /* _PATHMAX_H */ shishi-1.0.2/gl/ftello.c0000644000000000000000000000461012126660051011723 00000000000000/* An ftello() function that works around platform bugs. Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. 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 . */ #include /* Specification. */ #include /* Get lseek. */ #include #include "stdio-impl.h" off_t ftello (FILE *fp) #undef ftello #if !HAVE_FTELLO # undef ftell # define ftello ftell #endif #if _GL_WINDOWS_64_BIT_OFF_T # undef ftello # if HAVE__FTELLI64 /* msvc, mingw64 */ # define ftello _ftelli64 # else /* mingw */ # define ftello ftello64 # endif #endif { #if LSEEK_PIPE_BROKEN /* mingw gives bogus answers rather than failure on non-seekable files. */ if (lseek (fileno (fp), 0, SEEK_CUR) == -1) return -1; #endif #if FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */ /* The Solaris stdio leaves the _IOREAD flag set after reading from a file reaches EOF and the program then starts writing to the file. ftello gets confused by this. */ if (fp_->_flag & _IOWRT) { off_t pos; /* Call ftello nevertheless, for the side effects that it does on fp. */ ftello (fp); /* Compute the file position ourselves. */ pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR); if (pos >= 0) { if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL) pos += fp_->_ptr - fp_->_base; } return pos; } #endif #if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) { /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit mode; but has an ftello that requires 64-bit mode. */ FILE *tmp = fopen ("/dev/null", "r"); if (!tmp) return -1; fp->_flags |= __SL64; fp->_seek64 = tmp->_seek64; fclose (tmp); } #endif return ftello (fp); } shishi-1.0.2/gl/stdio-impl.h0000644000000000000000000001022112126660053012521 00000000000000/* Implementation details of FILE streams. Copyright (C) 2007-2008, 2010-2013 Free Software Foundation, Inc. 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 . */ /* Many stdio implementations have the same logic and therefore can share the same implementation of stdio extension API, except that some fields have different naming conventions, or their access requires some casts. */ /* BSD stdio derived implementations. */ #if defined __NetBSD__ /* NetBSD */ /* Get __NetBSD_Version__. */ # include #endif #include /* For detecting Plan9. */ #if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */ # if defined __DragonFly__ /* DragonFly */ /* See . */ # define fp_ ((struct { struct __FILE_public pub; \ struct { unsigned char *_base; int _size; } _bf; \ void *cookie; \ void *_close; \ void *_read; \ void *_seek; \ void *_write; \ struct { unsigned char *_base; int _size; } _ub; \ int _ur; \ unsigned char _ubuf[3]; \ unsigned char _nbuf[1]; \ struct { unsigned char *_base; int _size; } _lb; \ int _blksize; \ fpos_t _offset; \ /* More fields, not relevant here. */ \ } *) fp) /* See . */ # define _p pub._p # define _flags pub._flags # define _r pub._r # define _w pub._w # else # define fp_ fp # endif # if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ /* NetBSD >= 1.5ZA, OpenBSD */ /* See and */ struct __sfileext { struct __sbuf _ub; /* ungetc buffer */ /* More fields, not relevant here. */ }; # define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub # else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */ # define fp_ub fp_->_ub # endif # define HASUB(fp) (fp_ub._base != NULL) #endif /* SystemV derived implementations. */ #ifdef __TANDEM /* NonStop Kernel */ # ifndef _IOERR /* These values were determined by the program 'stdioext-flags' at . */ # define _IOERR 0x40 # define _IOREAD 0x80 # define _IOWRT 0x4 # define _IORW 0x100 # endif #endif #if defined _IOERR # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */ # define fp_ ((struct { unsigned char *_ptr; \ unsigned char *_base; \ unsigned char *_end; \ long _cnt; \ int _file; \ unsigned int _flag; \ } *) fp) # else # define fp_ fp # endif # if defined _SCO_DS /* OpenServer */ # define _cnt __cnt # define _ptr __ptr # define _base __base # define _flag __flag # endif #endif shishi-1.0.2/gl/verify.h0000644000000000000000000002313212126660054011752 00000000000000/* Compile-time assert-like macros. Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc. 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 . */ /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ #ifndef _GL_VERIFY_H # define _GL_VERIFY_H /* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per C11. This is supported by GCC 4.6.0 and later, in C mode, and its use here generates easier-to-read diagnostics when verify (R) fails. Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per C++11. This will likely be supported by future GCC versions, in C++ mode. Use this only with GCC. If we were willing to slow 'configure' down we could also use it with other compilers, but since this affects only the quality of diagnostics, why bother? */ # if (4 < __GNUC__ || (__GNUC__ == 4 && 6 <= __GNUC_MINOR__)) && !defined __cplusplus # define _GL_HAVE__STATIC_ASSERT 1 # endif /* The condition (99 < __GNUC__) is temporary, until we know about the first G++ release that supports static_assert. */ # if (99 < __GNUC__) && defined __cplusplus # define _GL_HAVE_STATIC_ASSERT 1 # endif /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. If _Static_assert works, verify (R) uses it directly. Similarly, _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct that is an operand of sizeof. The code below uses several ideas for C++ compilers, and for C compilers that do not support _Static_assert: * The first step is ((R) ? 1 : -1). Given an expression R, of integral or boolean or floating-point type, this yields an expression of integral type, whose value is later verified to be constant and nonnegative. * Next this expression W is wrapped in a type struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: W; }. If W is negative, this yields a compile-time error. No compiler can deal with a bit-field of negative size. One might think that an array size check would have the same effect, that is, that the type struct { unsigned int dummy[W]; } would work as well. However, inside a function, some compilers (such as C++ compilers and GNU C) allow local parameters and variables inside array size expressions. With these compilers, an array size check would not properly diagnose this misuse of the verify macro: void function (int n) { verify (n < 0); } * For the verify macro, the struct _gl_verify_type will need to somehow be embedded into a declaration. To be portable, this declaration must declare an object, a constant, a function, or a typedef name. If the declared entity uses the type directly, such as in struct dummy {...}; typedef struct {...} dummy; extern struct {...} *dummy; extern void dummy (struct {...} *); extern struct {...} *dummy (void); two uses of the verify macro would yield colliding declarations if the entity names are not disambiguated. A workaround is to attach the current line number to the entity name: #define _GL_CONCAT0(x, y) x##y #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) extern struct {...} * _GL_CONCAT (dummy, __LINE__); But this has the problem that two invocations of verify from within the same macro would collide, since the __LINE__ value would be the same for both invocations. (The GCC __COUNTER__ macro solves this problem, but is not portable.) A solution is to use the sizeof operator. It yields a number, getting rid of the identity of the type. Declarations like extern int dummy [sizeof (struct {...})]; extern void dummy (int [sizeof (struct {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; can be repeated. * Should the implementation use a named struct or an unnamed struct? Which of the following alternatives can be used? extern int dummy [sizeof (struct {...})]; extern int dummy [sizeof (struct _gl_verify_type {...})]; extern void dummy (int [sizeof (struct {...})]); extern void dummy (int [sizeof (struct _gl_verify_type {...})]); extern int (*dummy (void)) [sizeof (struct {...})]; extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})]; In the second and sixth case, the struct type is exported to the outer scope; two such declarations therefore collide. GCC warns about the first, third, and fourth cases. So the only remaining possibility is the fifth case: extern int (*dummy (void)) [sizeof (struct {...})]; * GCC warns about duplicate declarations of the dummy function if -Wredundant-decls is used. GCC 4.3 and later have a builtin __COUNTER__ macro that can let us generate unique identifiers for each dummy function, to suppress this warning. * This implementation exploits the fact that older versions of GCC, which do not support _Static_assert, also do not warn about the last declaration mentioned above. * GCC warns if -Wnested-externs is enabled and verify() is used within a function body; but inside a function, you can always arrange to use verify_expr() instead. * In C++, any struct definition inside sizeof is invalid. Use a template type to work around the problem. */ /* Concatenate two preprocessor tokens. */ # define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) # define _GL_CONCAT0(x, y) x##y /* _GL_COUNTER is an integer, preferably one that changes each time we use it. Use __COUNTER__ if it works, falling back on __LINE__ otherwise. __LINE__ isn't perfect, but it's better than a constant. */ # if defined __COUNTER__ && __COUNTER__ != __COUNTER__ # define _GL_COUNTER __COUNTER__ # else # define _GL_COUNTER __LINE__ # endif /* Generate a symbol with the given prefix, making it unique if possible. */ # define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER) /* Verify requirement R at compile-time, as an integer constant expression that returns 1. If R is false, fail at compile-time, preferably with a diagnostic that includes the string-literal DIAGNOSTIC. */ # define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC))) # ifdef __cplusplus # if !GNULIB_defined_struct__gl_verify_type template struct _gl_verify_type { unsigned int _gl_verify_error_if_negative: w; }; # define GNULIB_defined_struct__gl_verify_type 1 # endif # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ _gl_verify_type<(R) ? 1 : -1> # elif defined _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { \ _Static_assert (R, DIAGNOSTIC); \ int _gl_dummy; \ } # else # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; } # endif /* Verify requirement R at compile-time, as a declaration without a trailing ';'. If R is false, fail at compile-time, preferably with a diagnostic that includes the string-literal DIAGNOSTIC. Unfortunately, unlike C11, this implementation must appear as an ordinary declaration, and cannot appear inside struct { ... }. */ # ifdef _GL_HAVE__STATIC_ASSERT # define _GL_VERIFY _Static_assert # else # define _GL_VERIFY(R, DIAGNOSTIC) \ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] # endif /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ # ifdef _GL_STATIC_ASSERT_H # if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert # define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC) # endif # if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert # define static_assert _Static_assert /* C11 requires this #define. */ # endif # endif /* @assert.h omit start@ */ /* Each of these macros verifies that its argument R is nonzero. To be portable, R should be an integer constant expression. Unlike assert (R), there is no run-time overhead. There are two macros, since no single macro can be used in all contexts in C. verify_true (R) is for scalar contexts, including integer constant expression contexts. verify (R) is for declaration contexts, e.g., the top level. */ /* Verify requirement R at compile-time, as an integer constant expression. Return 1. This is equivalent to verify_expr (R, 1). verify_true is obsolescent; please use verify_expr instead. */ # define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")") /* Verify requirement R at compile-time. Return the value of the expression E. */ # define verify_expr(R, E) \ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E)) /* Verify requirement R at compile-time, as a declaration without a trailing ';'. */ # define verify(R) _GL_VERIFY (R, "verify (" #R ")") /* @assert.h omit end@ */ #endif shishi-1.0.2/gl/sys_types.in.h0000644000000000000000000000317512126660054013122 00000000000000/* Provide a more complete sys/types.h. Copyright (C) 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #ifndef _@GUARD_PREFIX@_SYS_TYPES_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@ #ifndef _@GUARD_PREFIX@_SYS_TYPES_H #define _@GUARD_PREFIX@_SYS_TYPES_H /* Override off_t if Large File Support is requested on native Windows. */ #if @WINDOWS_64_BIT_OFF_T@ /* Same as int64_t in . */ # if defined _MSC_VER # define off_t __int64 # else # define off_t long long int # endif /* Indicator, for gnulib internal purposes. */ # define _GL_WINDOWS_64_BIT_OFF_T 1 #endif /* MSVC 9 defines size_t in , not in . */ /* But avoid namespace pollution on glibc systems. */ #if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) \ && ! defined __GLIBC__ # include #endif #endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ #endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ shishi-1.0.2/gl/snprintf.c0000644000000000000000000000352312126660053012305 00000000000000/* Formatted output to strings. Copyright (C) 2004, 2006-2013 Free Software Foundation, Inc. Written by Simon Josefsson and Paul Eggert. 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, 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 . */ #include /* Specification. */ #include #include #include #include #include #include #include "vasnprintf.h" /* Print formatted output to string STR. Similar to sprintf, but additional length SIZE limit how much is written into STR. Returns string length of formatted string (which may be larger than SIZE). STR may be NULL, in which case nothing will be written. On error, return a negative value. */ int snprintf (char *str, size_t size, const char *format, ...) { char *output; size_t len; size_t lenbuf = size; va_list args; va_start (args, format); output = vasnprintf (str, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) return -1; if (output != str) { if (size) { size_t pruned_len = (len < size ? len : size - 1); memcpy (str, output, pruned_len); str[pruned_len] = '\0'; } free (output); } if (INT_MAX < len) { errno = EOVERFLOW; return -1; } return len; } shishi-1.0.2/gl/signal.in.h0000644000000000000000000003350412126660053012333 00000000000000/* A GNU-like . Copyright (C) 2006-2013 Free Software Foundation, Inc. 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 . */ #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif @PRAGMA_COLUMNS@ #if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T) /* Special invocation convention: - Inside glibc header files. - On glibc systems we have a sequence of nested includes -> -> . In this situation, the functions are not yet declared, therefore we cannot provide the C++ aliases. - On glibc systems with GCC 4.3 we have a sequence of nested includes -> -> -> . In this situation, some of the functions are not yet declared, therefore we cannot provide the C++ aliases. */ # @INCLUDE_NEXT@ @NEXT_SIGNAL_H@ #else /* Normal invocation convention. */ #ifndef _@GUARD_PREFIX@_SIGNAL_H #define _GL_ALREADY_INCLUDING_SIGNAL_H /* Define pid_t, uid_t. Also, mingw defines sigset_t not in , but in . On Solaris 10, includes , which eventually includes us; so include now, before the second inclusion guard. */ #include /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_SIGNAL_H@ #undef _GL_ALREADY_INCLUDING_SIGNAL_H #ifndef _@GUARD_PREFIX@_SIGNAL_H #define _@GUARD_PREFIX@_SIGNAL_H /* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6 declare pthread_sigmask in , not in . But avoid namespace pollution on glibc systems.*/ #if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \ && ((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ || defined __sun) \ && ! defined __GLIBC__ # include #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_ARG_NONNULL is copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* On AIX, sig_atomic_t already includes volatile. C99 requires that 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not. Hence, redefine this to a non-volatile type as needed. */ #if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ # if !GNULIB_defined_sig_atomic_t typedef int rpl_sig_atomic_t; # undef sig_atomic_t # define sig_atomic_t rpl_sig_atomic_t # define GNULIB_defined_sig_atomic_t 1 # endif #endif /* A set or mask of signals. */ #if !@HAVE_SIGSET_T@ # if !GNULIB_defined_sigset_t typedef unsigned int sigset_t; # define GNULIB_defined_sigset_t 1 # endif #endif /* Define sighandler_t, the type of signal handlers. A GNU extension. */ #if !@HAVE_SIGHANDLER_T@ # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_sighandler_t typedef void (*sighandler_t) (int); # define GNULIB_defined_sighandler_t 1 # endif # ifdef __cplusplus } # endif #endif #if @GNULIB_SIGNAL_H_SIGPIPE@ # ifndef SIGPIPE /* Define SIGPIPE to a value that does not overlap with other signals. */ # define SIGPIPE 13 # define GNULIB_defined_SIGPIPE 1 /* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask', 'write', 'stdio'. */ # endif #endif /* Maximum signal number + 1. */ #ifndef NSIG # if defined __TANDEM # define NSIG 32 # endif #endif #if @GNULIB_PTHREAD_SIGMASK@ # if @REPLACE_PTHREAD_SIGMASK@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pthread_sigmask # define pthread_sigmask rpl_pthread_sigmask # endif _GL_FUNCDECL_RPL (pthread_sigmask, int, (int how, const sigset_t *new_mask, sigset_t *old_mask)); _GL_CXXALIAS_RPL (pthread_sigmask, int, (int how, const sigset_t *new_mask, sigset_t *old_mask)); # else # if !@HAVE_PTHREAD_SIGMASK@ _GL_FUNCDECL_SYS (pthread_sigmask, int, (int how, const sigset_t *new_mask, sigset_t *old_mask)); # endif _GL_CXXALIAS_SYS (pthread_sigmask, int, (int how, const sigset_t *new_mask, sigset_t *old_mask)); # endif _GL_CXXALIASWARN (pthread_sigmask); #elif defined GNULIB_POSIXCHECK # undef pthread_sigmask # if HAVE_RAW_DECL_PTHREAD_SIGMASK _GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - " "use gnulib module pthread_sigmask for portability"); # endif #endif #if @GNULIB_RAISE@ # if @REPLACE_RAISE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef raise # define raise rpl_raise # endif _GL_FUNCDECL_RPL (raise, int, (int sig)); _GL_CXXALIAS_RPL (raise, int, (int sig)); # else # if !@HAVE_RAISE@ _GL_FUNCDECL_SYS (raise, int, (int sig)); # endif _GL_CXXALIAS_SYS (raise, int, (int sig)); # endif _GL_CXXALIASWARN (raise); #elif defined GNULIB_POSIXCHECK # undef raise /* Assume raise is always declared. */ _GL_WARN_ON_USE (raise, "raise can crash on native Windows - " "use gnulib module raise for portability"); #endif #if @GNULIB_SIGPROCMASK@ # if !@HAVE_POSIX_SIGNALBLOCKING@ # ifndef GNULIB_defined_signal_blocking # define GNULIB_defined_signal_blocking 1 # endif /* Maximum signal number + 1. */ # ifndef NSIG # define NSIG 32 # endif /* This code supports only 32 signals. */ # if !GNULIB_defined_verify_NSIG_constraint typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1]; # define GNULIB_defined_verify_NSIG_constraint 1 # endif # endif /* Test whether a given signal is contained in a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigismember # endif # else _GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig)); _GL_CXXALIASWARN (sigismember); /* Initialize a signal set to the empty set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigemptyset # endif # else _GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set)); _GL_CXXALIASWARN (sigemptyset); /* Add a signal to a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigaddset # endif # else _GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig)); _GL_CXXALIASWARN (sigaddset); /* Remove a signal from a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigdelset # endif # else _GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig)); _GL_CXXALIASWARN (sigdelset); /* Fill a signal set with all possible signals. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ # if defined __cplusplus && defined GNULIB_NAMESPACE # undef sigfillset # endif # else _GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set)); _GL_CXXALIASWARN (sigfillset); /* Return the set of those blocked signals that are pending. */ # if !@HAVE_POSIX_SIGNALBLOCKING@ _GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); # endif _GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set)); _GL_CXXALIASWARN (sigpending); /* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET. Then, if SET is not NULL, affect the current set of blocked signals by combining it with *SET as indicated in OPERATION. In this implementation, you are not allowed to change a signal handler while the signal is blocked. */ # if !@HAVE_POSIX_SIGNALBLOCKING@ # define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */ # define SIG_SETMASK 1 /* blocked_set = *set; */ # define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */ _GL_FUNCDECL_SYS (sigprocmask, int, (int operation, const sigset_t *set, sigset_t *old_set)); # endif _GL_CXXALIAS_SYS (sigprocmask, int, (int operation, const sigset_t *set, sigset_t *old_set)); _GL_CXXALIASWARN (sigprocmask); /* Install the handler FUNC for signal SIG, and return the previous handler. */ # ifdef __cplusplus extern "C" { # endif # if !GNULIB_defined_function_taking_int_returning_void_t typedef void (*_gl_function_taking_int_returning_void_t) (int); # define GNULIB_defined_function_taking_int_returning_void_t 1 # endif # ifdef __cplusplus } # endif # if !@HAVE_POSIX_SIGNALBLOCKING@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # define signal rpl_signal # endif _GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); # else _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t, (int sig, _gl_function_taking_int_returning_void_t func)); # endif _GL_CXXALIASWARN (signal); # if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE /* Raise signal SIGPIPE. */ _GL_EXTERN_C int _gl_raise_SIGPIPE (void); # endif #elif defined GNULIB_POSIXCHECK # undef sigaddset # if HAVE_RAW_DECL_SIGADDSET _GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigdelset # if HAVE_RAW_DECL_SIGDELSET _GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigemptyset # if HAVE_RAW_DECL_SIGEMPTYSET _GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigfillset # if HAVE_RAW_DECL_SIGFILLSET _GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigismember # if HAVE_RAW_DECL_SIGISMEMBER _GL_WARN_ON_USE (sigismember, "sigismember is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigpending # if HAVE_RAW_DECL_SIGPENDING _GL_WARN_ON_USE (sigpending, "sigpending is unportable - " "use the gnulib module sigprocmask for portability"); # endif # undef sigprocmask # if HAVE_RAW_DECL_SIGPROCMASK _GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - " "use the gnulib module sigprocmask for portability"); # endif #endif /* @GNULIB_SIGPROCMASK@ */ #if @GNULIB_SIGACTION@ # if !@HAVE_SIGACTION@ # if !@HAVE_SIGINFO_T@ # if !GNULIB_defined_siginfo_types /* Present to allow compilation, but unsupported by gnulib. */ union sigval { int sival_int; void *sival_ptr; }; /* Present to allow compilation, but unsupported by gnulib. */ struct siginfo_t { int si_signo; int si_code; int si_errno; pid_t si_pid; uid_t si_uid; void *si_addr; int si_status; long si_band; union sigval si_value; }; typedef struct siginfo_t siginfo_t; # define GNULIB_defined_siginfo_types 1 # endif # endif /* !@HAVE_SIGINFO_T@ */ /* We assume that platforms which lack the sigaction() function also lack the 'struct sigaction' type, and vice versa. */ # if !GNULIB_defined_struct_sigaction struct sigaction { union { void (*_sa_handler) (int); /* Present to allow compilation, but unsupported by gnulib. POSIX says that implementations may, but not must, make sa_sigaction overlap with sa_handler, but we know of no implementation where they do not overlap. */ void (*_sa_sigaction) (int, siginfo_t *, void *); } _sa_func; sigset_t sa_mask; /* Not all POSIX flags are supported. */ int sa_flags; }; # define sa_handler _sa_func._sa_handler # define sa_sigaction _sa_func._sa_sigaction /* Unsupported flags are not present. */ # define SA_RESETHAND 1 # define SA_NODEFER 2 # define SA_RESTART 4 # define GNULIB_defined_struct_sigaction 1 # endif _GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict, struct sigaction *restrict)); # elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ # define sa_sigaction sa_handler # endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */ _GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict, struct sigaction *restrict)); _GL_CXXALIASWARN (sigaction); #elif defined GNULIB_POSIXCHECK # undef sigaction # if HAVE_RAW_DECL_SIGACTION _GL_WARN_ON_USE (sigaction, "sigaction is unportable - " "use the gnulib module sigaction for portability"); # endif #endif /* Some systems don't have SA_NODEFER. */ #ifndef SA_NODEFER # define SA_NODEFER 0 #endif #endif /* _@GUARD_PREFIX@_SIGNAL_H */ #endif /* _@GUARD_PREFIX@_SIGNAL_H */ #endif shishi-1.0.2/gl/timespec.c0000644000000000000000000000013012126660051012240 00000000000000#include #define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE #include "timespec.h" shishi-1.0.2/gl/rawmemchr.valgrind0000664000000000000000000000040312015626624014012 00000000000000# Suppress a valgrind message about use of uninitialized memory in rawmemchr(). # This use is OK because it provides only a speedup. { rawmemchr-value4 Memcheck:Value4 fun:rawmemchr } { rawmemchr-value8 Memcheck:Value8 fun:rawmemchr } shishi-1.0.2/gl/mktime-internal.h0000664000000000000000000000024112015626624013546 00000000000000#include time_t mktime_internal (struct tm *, struct tm * (*) (time_t const *, struct tm *), time_t *); shishi-1.0.2/gl/sys_select.in.h0000644000000000000000000002677012126660054013243 00000000000000/* Substitute for . Copyright (C) 2007-2013 Free Software Foundation, Inc. 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, 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 . */ # if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ # endif @PRAGMA_COLUMNS@ /* On OSF/1 and Solaris 2.6, and both include . On Cygwin, includes . Simply delegate to the system's header in this case. */ #if (@HAVE_SYS_SELECT_H@ \ && ((defined __osf__ && defined _SYS_TYPES_H_ \ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \ && defined _OSF_SOURCE) \ || (defined __sun && defined _SYS_TYPES_H \ && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \ || defined __EXTENSIONS__)))) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #elif (@HAVE_SYS_SELECT_H@ \ && (defined _CYGWIN_SYS_TIME_H \ || (defined __osf__ && defined _SYS_TIME_H_ \ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \ && defined _OSF_SOURCE) \ || (defined __sun && defined _SYS_TIME_H \ && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \ || defined __EXTENSIONS__)))) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ /* On IRIX 6.5, includes , which includes , which includes . At this point we cannot include , because that includes , which gives a syntax error because has not been completely processed. Simply delegate to the system's header in this case. */ #elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H) # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ /* On OpenBSD 5.0, includes , which includes . At this point we cannot include , because that includes gnulib's pthread.h override, which gives a syntax error because /usr/include/pthread.h has not been completely processed. Simply delegate to the system's header in this case. */ #elif @HAVE_SYS_SELECT_H@ && defined __OpenBSD__ && (defined _PTHREAD_H_ && !defined PTHREAD_MUTEX_INITIALIZER) # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #else #ifndef _@GUARD_PREFIX@_SYS_SELECT_H /* On many platforms, assumes prior inclusion of . Also, mingw defines sigset_t there, instead of in where it belongs. */ #include #if @HAVE_SYS_SELECT_H@ /* On OSF/1 4.0, provides only a forward declaration of 'struct timeval', and no definition of this type. Also, Mac OS X, AIX, HP-UX, IRIX, Solaris, Interix declare select() in . But avoid namespace pollution on glibc systems. */ # ifndef __GLIBC__ # include # endif /* On AIX 7 and Solaris 10, provides an FD_ZERO implementation that relies on memset(), but without including . But in any case avoid namespace pollution on glibc systems. */ # if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \ && ! defined __GLIBC__ # include # endif /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ #endif /* Get definition of 'sigset_t'. But avoid namespace pollution on glibc systems. Do this after the include_next (for the sake of OpenBSD 5.0) but before the split double-inclusion guard (for the sake of Solaris). */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include #endif #ifndef _@GUARD_PREFIX@_SYS_SELECT_H #define _@GUARD_PREFIX@_SYS_SELECT_H #if !@HAVE_SYS_SELECT_H@ /* A platform that lacks . */ /* Get the 'struct timeval' and 'fd_set' types and the FD_* macros on most platforms. */ # include /* On HP-UX 11, provides an FD_ZERO implementation that relies on memset(), but without including . */ # if defined __hpux # include # endif /* On native Windows platforms: Get the 'fd_set' type. Get the close() declaration before we override it. */ # if @HAVE_WINSOCK2_H@ # if !defined _GL_INCLUDING_WINSOCK2_H # define _GL_INCLUDING_WINSOCK2_H # include # undef _GL_INCLUDING_WINSOCK2_H # endif # include # endif #endif /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ /* The definition of _GL_WARN_ON_USE is copied here. */ /* Fix some definitions from . */ #if @HAVE_WINSOCK2_H@ # if !GNULIB_defined_rpl_fd_isset /* Re-define FD_ISSET to avoid a WSA call while we are not using network sockets. */ static int rpl_fd_isset (SOCKET fd, fd_set * set) { u_int i; if (set == NULL) return 0; for (i = 0; i < set->fd_count; i++) if (set->fd_array[i] == fd) return 1; return 0; } # define GNULIB_defined_rpl_fd_isset 1 # endif # undef FD_ISSET # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) #endif /* Hide some function declarations from . */ #if @HAVE_WINSOCK2_H@ # if !defined _@GUARD_PREFIX@_UNISTD_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef close # define close close_used_without_including_unistd_h # else _GL_WARN_ON_USE (close, "close() used without including "); # endif # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef gethostname # define gethostname gethostname_used_without_including_unistd_h # else _GL_WARN_ON_USE (gethostname, "gethostname() used without including "); # endif # endif # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef socket # define socket socket_used_without_including_sys_socket_h # undef connect # define connect connect_used_without_including_sys_socket_h # undef accept # define accept accept_used_without_including_sys_socket_h # undef bind # define bind bind_used_without_including_sys_socket_h # undef getpeername # define getpeername getpeername_used_without_including_sys_socket_h # undef getsockname # define getsockname getsockname_used_without_including_sys_socket_h # undef getsockopt # define getsockopt getsockopt_used_without_including_sys_socket_h # undef listen # define listen listen_used_without_including_sys_socket_h # undef recv # define recv recv_used_without_including_sys_socket_h # undef send # define send send_used_without_including_sys_socket_h # undef recvfrom # define recvfrom recvfrom_used_without_including_sys_socket_h # undef sendto # define sendto sendto_used_without_including_sys_socket_h # undef setsockopt # define setsockopt setsockopt_used_without_including_sys_socket_h # undef shutdown # define shutdown shutdown_used_without_including_sys_socket_h # else _GL_WARN_ON_USE (socket, "socket() used without including "); _GL_WARN_ON_USE (connect, "connect() used without including "); _GL_WARN_ON_USE (accept, "accept() used without including "); _GL_WARN_ON_USE (bind, "bind() used without including "); _GL_WARN_ON_USE (getpeername, "getpeername() used without including "); _GL_WARN_ON_USE (getsockname, "getsockname() used without including "); _GL_WARN_ON_USE (getsockopt, "getsockopt() used without including "); _GL_WARN_ON_USE (listen, "listen() used without including "); _GL_WARN_ON_USE (recv, "recv() used without including "); _GL_WARN_ON_USE (send, "send() used without including "); _GL_WARN_ON_USE (recvfrom, "recvfrom() used without including "); _GL_WARN_ON_USE (sendto, "sendto() used without including "); _GL_WARN_ON_USE (setsockopt, "setsockopt() used without including "); _GL_WARN_ON_USE (shutdown, "shutdown() used without including "); # endif # endif #endif #if @GNULIB_PSELECT@ # if @REPLACE_PSELECT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef pselect # define pselect rpl_pselect # endif _GL_FUNCDECL_RPL (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); _GL_CXXALIAS_RPL (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # else # if !@HAVE_PSELECT@ _GL_FUNCDECL_SYS (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # endif _GL_CXXALIAS_SYS (pselect, int, (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, struct timespec const *restrict, const sigset_t *restrict)); # endif _GL_CXXALIASWARN (pselect); #elif defined GNULIB_POSIXCHECK # undef pselect # if HAVE_RAW_DECL_PSELECT _GL_WARN_ON_USE (pselect, "pselect is not portable - " "use gnulib module pselect for portability"); # endif #endif #if @GNULIB_SELECT@ # if @REPLACE_SELECT@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef select # define select rpl_select # endif _GL_FUNCDECL_RPL (select, int, (int, fd_set *, fd_set *, fd_set *, struct timeval *)); _GL_CXXALIAS_RPL (select, int, (int, fd_set *, fd_set *, fd_set *, struct timeval *)); # else _GL_CXXALIAS_SYS (select, int, (int, fd_set *, fd_set *, fd_set *, struct timeval *)); # endif _GL_CXXALIASWARN (select); #elif @HAVE_WINSOCK2_H@ # undef select # define select select_used_without_requesting_gnulib_module_select #elif defined GNULIB_POSIXCHECK # undef select # if HAVE_RAW_DECL_SELECT _GL_WARN_ON_USE (select, "select is not always POSIX compliant - " "use gnulib module select for portability"); # endif #endif #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */ #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */ #endif /* OSF/1 */ shishi-1.0.2/gl/malloca.c0000644000000000000000000001165712126660053012061 00000000000000/* Safe automatic memory allocation. Copyright (C) 2003, 2006-2007, 2009-2013 Free Software Foundation, Inc. Written by Bruno Haible , 2003. 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, 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 . */ #define _GL_USE_STDLIB_ALLOC 1 #include /* Specification. */ #include "malloca.h" #include #include "verify.h" /* The speed critical point in this file is freea() applied to an alloca() result: it must be fast, to match the speed of alloca(). The speed of mmalloca() and freea() in the other case are not critical, because they are only invoked for big memory sizes. */ #if HAVE_ALLOCA /* Store the mmalloca() results in a hash table. This is needed to reliably distinguish a mmalloca() result and an alloca() result. Although it is possible that the same pointer is returned by alloca() and by mmalloca() at different times in the same application, it does not lead to a bug in freea(), because: - Before a pointer returned by alloca() can point into malloc()ed memory, the function must return, and once this has happened the programmer must not call freea() on it anyway. - Before a pointer returned by mmalloca() can point into the stack, it must be freed. The only function that can free it is freea(), and when freea() frees it, it also removes it from the hash table. */ #define MAGIC_NUMBER 0x1415fb4a #define MAGIC_SIZE sizeof (int) /* This is how the header info would look like without any alignment considerations. */ struct preliminary_header { void *next; char room[MAGIC_SIZE]; }; /* But the header's size must be a multiple of sa_alignment_max. */ #define HEADER_SIZE \ (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max) struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; }; verify (HEADER_SIZE == sizeof (struct header)); /* We make the hash table quite big, so that during lookups the probability of empty hash buckets is quite high. There is no need to make the hash table resizable, because when the hash table gets filled so much that the lookup becomes slow, it means that the application has memory leaks. */ #define HASH_TABLE_SIZE 257 static void * mmalloca_results[HASH_TABLE_SIZE]; #endif void * mmalloca (size_t n) { #if HAVE_ALLOCA /* Allocate one more word, that serves as an indicator for malloc()ed memory, so that freea() of an alloca() result is fast. */ size_t nplus = n + HEADER_SIZE; if (nplus >= n) { char *p = (char *) malloc (nplus); if (p != NULL) { size_t slot; p += HEADER_SIZE; /* Put a magic number into the indicator word. */ ((int *) p)[-1] = MAGIC_NUMBER; /* Enter p into the hash table. */ slot = (uintptr_t) p % HASH_TABLE_SIZE; ((struct header *) (p - HEADER_SIZE))->next = mmalloca_results[slot]; mmalloca_results[slot] = p; return p; } } /* Out of memory. */ return NULL; #else # if !MALLOC_0_IS_NONNULL if (n == 0) n = 1; # endif return malloc (n); #endif } #if HAVE_ALLOCA void freea (void *p) { /* mmalloca() may have returned NULL. */ if (p != NULL) { /* Attempt to quickly distinguish the mmalloca() result - which has a magic indicator word - and the alloca() result - which has an uninitialized indicator word. It is for this test that sa_increment additional bytes are allocated in the alloca() case. */ if (((int *) p)[-1] == MAGIC_NUMBER) { /* Looks like a mmalloca() result. To see whether it really is one, perform a lookup in the hash table. */ size_t slot = (uintptr_t) p % HASH_TABLE_SIZE; void **chain = &mmalloca_results[slot]; for (; *chain != NULL;) { if (*chain == p) { /* Found it. Remove it from the hash table and free it. */ char *p_begin = (char *) p - HEADER_SIZE; *chain = ((struct header *) p_begin)->next; free (p_begin); return; } chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next; } } /* At this point, we know it was not a mmalloca() result. */ } } #endif shishi-1.0.2/gl/printf-args.h0000644000000000000000000000753312126660053012710 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _PRINTF_ARGS_H #define _PRINTF_ARGS_H /* This file can be parametrized with the following macros: ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. PRINTF_FETCHARGS Name of the function to be declared. STATIC Set to 'static' to declare the function static. */ /* Default parameters. */ #ifndef PRINTF_FETCHARGS # define PRINTF_FETCHARGS printf_fetchargs #endif /* Get size_t. */ #include /* Get wchar_t. */ #if HAVE_WCHAR_T # include #endif /* Get wint_t. */ #if HAVE_WINT_T # include #endif /* Get va_list. */ #include /* Argument types */ typedef enum { TYPE_NONE, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONGINT, TYPE_ULONGINT, #if HAVE_LONG_LONG_INT TYPE_LONGLONGINT, TYPE_ULONGLONGINT, #endif TYPE_DOUBLE, TYPE_LONGDOUBLE, TYPE_CHAR, #if HAVE_WINT_T TYPE_WIDE_CHAR, #endif TYPE_STRING, #if HAVE_WCHAR_T TYPE_WIDE_STRING, #endif TYPE_POINTER, TYPE_COUNT_SCHAR_POINTER, TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_INT_POINTER, TYPE_COUNT_LONGINT_POINTER #if HAVE_LONG_LONG_INT , TYPE_COUNT_LONGLONGINT_POINTER #endif #if ENABLE_UNISTDIO /* The unistdio extensions. */ , TYPE_U8_STRING , TYPE_U16_STRING , TYPE_U32_STRING #endif } arg_type; /* Polymorphic argument */ typedef struct { arg_type type; union { signed char a_schar; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long int a_longint; unsigned long int a_ulongint; #if HAVE_LONG_LONG_INT long long int a_longlongint; unsigned long long int a_ulonglongint; #endif float a_float; double a_double; long double a_longdouble; int a_char; #if HAVE_WINT_T wint_t a_wide_char; #endif const char* a_string; #if HAVE_WCHAR_T const wchar_t* a_wide_string; #endif void* a_pointer; signed char * a_count_schar_pointer; short * a_count_short_pointer; int * a_count_int_pointer; long int * a_count_longint_pointer; #if HAVE_LONG_LONG_INT long long int * a_count_longlongint_pointer; #endif #if ENABLE_UNISTDIO /* The unistdio extensions. */ const uint8_t * a_u8_string; const uint16_t * a_u16_string; const uint32_t * a_u32_string; #endif } a; } argument; /* Number of directly allocated arguments (no malloc() needed). */ #define N_DIRECT_ALLOC_ARGUMENTS 7 typedef struct { size_t count; argument *arg; argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS]; } arguments; /* Fetch the arguments, putting them into a. */ #ifdef STATIC STATIC #else extern #endif int PRINTF_FETCHARGS (va_list args, arguments *a); #endif /* _PRINTF_ARGS_H */ shishi-1.0.2/gl/xsize.h0000644000000000000000000000673612126660054011623 00000000000000/* xsize.h -- Checked size_t computations. Copyright (C) 2003, 2008-2013 Free Software Foundation, Inc. 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, 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 . */ #ifndef _XSIZE_H #define _XSIZE_H /* Get size_t. */ #include /* Get SIZE_MAX. */ #include #if HAVE_STDINT_H # include #endif _GL_INLINE_HEADER_BEGIN #ifndef XSIZE_INLINE # define XSIZE_INLINE _GL_INLINE #endif /* The size of memory objects is often computed through expressions of type size_t. Example: void* p = malloc (header_size + n * element_size). These computations can lead to overflow. When this happens, malloc() returns a piece of memory that is way too small, and the program then crashes while attempting to fill the memory. To avoid this, the functions and macros in this file check for overflow. The convention is that SIZE_MAX represents overflow. malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc implementation that uses mmap --, it's recommended to use size_overflow_p() or size_in_bounds_p() before invoking malloc(). The example thus becomes: size_t size = xsum (header_size, xtimes (n, element_size)); void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); */ /* Convert an arbitrary value >= 0 to type size_t. */ #define xcast_size_t(N) \ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) /* Sum of two sizes, with overflow check. */ XSIZE_INLINE size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum (size_t size1, size_t size2) { size_t sum = size1 + size2; return (sum >= size1 ? sum : SIZE_MAX); } /* Sum of three sizes, with overflow check. */ XSIZE_INLINE size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum3 (size_t size1, size_t size2, size_t size3) { return xsum (xsum (size1, size2), size3); } /* Sum of four sizes, with overflow check. */ XSIZE_INLINE size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) { return xsum (xsum (xsum (size1, size2), size3), size4); } /* Maximum of two sizes, with overflow check. */ XSIZE_INLINE size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xmax (size_t size1, size_t size2) { /* No explicit check is needed here, because for any n: max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ return (size1 >= size2 ? size1 : size2); } /* Multiplication of a count with an element size, with overflow check. The count must be >= 0 and the element size must be > 0. This is a macro, not a function, so that it works correctly even when N is of a wider type and N > SIZE_MAX. */ #define xtimes(N, ELSIZE) \ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) /* Check for overflow. */ #define size_overflow_p(SIZE) \ ((SIZE) == SIZE_MAX) /* Check against overflow. */ #define size_in_bounds_p(SIZE) \ ((SIZE) != SIZE_MAX) _GL_INLINE_HEADER_END #endif /* _XSIZE_H */ shishi-1.0.2/shisa.conf.in0000664000000000000000000000515712126660507012272 00000000000000# shisa.conf --- Database configuration file for Shishi. -*- sh -*- # Copyright 2002-2013 Simon Josefsson # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # If the first non white space character of a line is a '#', the line # is ignored. Empty lines are also ignored. # # See the manual for a complete list of options. # db [OPTIONS] [LOCATION] [PARAMETERS ...] # Specify the data sources for Shisa data. Multiple entries, even of # the same data source type, are allowed. The data sources are # accessed in the same sequence as they are defined here. If an entry # is found in one data source, it will be used for the operations, # without searching the remaining data sources. Valid OPTIONS # include: # --read-only No data is written to this data source. # --ignore-errors Ignore failures in this backend. # The default (when the configuration file is empty) uses one "file" # data source (see below), but for a larger installation you may want # to combine several data sources. Here is an example. # db --read-only file /var/local/master # db --ignore-errors ldap kdc.example.org ca=/etc/shisa/kdc-ca.pem # db --read-only file /var/cache/ldap-copy # This demonstrate how you can store critical principals on local disk # (the first entry, /var/local/master) that will always be found # without looking in the LDAP directory. The critical principals # could be, e.g., krbtgt/EXAMPLE.ORG. The second entry denote a LDAP # server that could hold user principals. As you can see, Shisa will # not let the caller know about errors with the LDAP source (they will # be logged, however). Instead, if for instance the LDAP server has # crashed, Shisa would continue and read from the /var/cache/ldap-copy # file source. That file source may have been set up to contain a # copy of the data in the LDAP server, perhaps made on an hourly # basis, so that your server will be able to serve recent data even in # case of a crash. Any updates or passwords change requests will # however not be possible while the LDAP server is inaccessible, to # reduce the problem of synchronizing data back into the LDAP server # once it is online again. # Currently only the "file" data source is supported, and denote a # data source that use the standard file system for storage. # # Valid syntaxes for the "file" database: # db file FILENAME # # Examples: # db file /var/shishi # db file /usr/share/shishi read-only # # If nothing is specified, the default will be: # db file /usr/local/var/shishi/shisa.db

      "; %highlights_texinfo = ( $type_constant, "\\\@code{\$1}", $type_func, "\\\@code{\$1}", $type_struct, "\\\@code{\$1}", $type_param, "\\\@code{\$1}" ); $blankline_texinfo = ""; %highlights_tex = ( $type_constant, "{\\\\it \$1}", $type_func, "{\\\\bf \$1}", $type_struct, "{\\\\it \$1}", $type_param, "{\\\\bf \$1}" ); $blankline_tex = "\\\\"; # sgml, docbook format %highlights_sgml = ( $type_constant, "\$1", $type_func, "\$1", $type_struct, "\$1", $type_env, "\$1", $type_param, "\$1" ); $blankline_sgml = "\n"; # these are pretty rough %highlights_man = ( $type_constant, "\\\\fB\$1\\\\fP", $type_func, "\\\\fB\$1\\\\fP", $type_struct, "\\\\fB\$1\\\\fP", $type_param, "\\\\fI\$1\\\\fP" ); $blankline_man = ""; # text-mode %highlights_text = ( $type_constant, "\$1", $type_func, "\$1", $type_struct, "\$1", $type_param, "\$1" ); $blankline_text = ""; sub usage { print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -tex | -texinfo -listfunc ]\n"; print " [ -sourceversion verno ] [ -include file | -includefuncprefix ]\n"; print " [ -bugsto address ] [ -seeinfo infonode ] [ -copyright notice]\n"; print " [ -verbatimcopying ]\n"; print " [ -function funcname [ -function funcname ...] ]\n"; print " c source file(s) > outputfile\n"; exit 1; } # read arguments if ($#ARGV==-1) { usage(); } $verbose = 0; $output_mode = "man"; %highlights = %highlights_man; $blankline = $blankline_man; $modulename = "API Documentation"; $sourceversion = strftime "%Y-%m-%d", localtime; $function_only = 0; while ($ARGV[0] =~ m/^-(.*)/) { $cmd = shift @ARGV; if ($cmd eq "-html") { $output_mode = "html"; %highlights = %highlights_html; $blankline = $blankline_html; } elsif ($cmd eq "-man") { $output_mode = "man"; %highlights = %highlights_man; $blankline = $blankline_man; } elsif ($cmd eq "-tex") { $output_mode = "tex"; %highlights = %highlights_tex; $blankline = $blankline_tex; } elsif ($cmd eq "-texinfo") { $output_mode = "texinfo"; %highlights = %highlights_texinfo; $blankline = $blankline_texinfo; } elsif ($cmd eq "-text") { $output_mode = "text"; %highlights = %highlights_text; $blankline = $blankline_text; } elsif ($cmd eq "-docbook") { $output_mode = "sgml"; %highlights = %highlights_sgml; $blankline = $blankline_sgml; } elsif ($cmd eq "-listfunc") { $output_mode = "listfunc"; } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document $modulename = shift @ARGV; } elsif ($cmd eq "-sourceversion") { $sourceversion = shift @ARGV; } elsif ($cmd eq "-include") { $include = shift @ARGV; } elsif ($cmd eq "-includefuncprefix") { $includefuncprefix = 1; } elsif ($cmd eq "-bugsto") { $bugsto = shift @ARGV; } elsif ($cmd eq "-copyright") { $copyright = shift @ARGV; } elsif ($cmd eq "-verbatimcopying") { $verbatimcopying = 1; } elsif ($cmd eq "-seeinfo") { $seeinfo = shift @ARGV; } elsif ($cmd eq "-function") { # to only output specific functions $function_only = 1; $function = shift @ARGV; $function_table{$function} = 1; } elsif ($cmd eq "-v") { $verbose = 1; } elsif (($cmd eq "-h") || ($cmd eq "--help")) { usage(); } } ## # dumps section contents to arrays/hashes intended for that purpose. # sub dump_section { my $name = shift @_; my $contents = join "\n", @_; if ($name =~ m/$type_constant/) { $name = $1; # print STDERR "constant section '$1' = '$contents'\n"; $constants{$name} = $contents; } elsif ($name =~ m/$type_param/) { # print STDERR "parameter def '$1' = '$contents'\n"; $name = $1; $parameters{$name} = $contents; } else { # print STDERR "other section '$name' = '$contents'\n"; $sections{$name} = $contents; push @sectionlist, $name; } } ## # output function # # parameters, a hash. # function => "function name" # parameterlist => @list of parameters # parameters => %parameter descriptions # sectionlist => @list of sections # sections => %descriont descriptions # sub repstr { $pattern = shift; $repl = shift; $match1 = shift; $match2 = shift; $match3 = shift; $match4 = shift; $output = $repl; $output =~ s,\$1,$match1,g; $output =~ s,\$2,$match2,g; $output =~ s,\$3,$match3,g; $output =~ s,\$4,$match4,g; eval "\$return = qq/$output/"; # print "pattern $pattern matched 1=$match1 2=$match2 3=$match3 4=$match4 replace $repl yielded $output interpolated $return\n"; $return; } sub just_highlight { my $contents = join "\n", @_; my $line; my $ret = ""; foreach $pattern (keys %highlights) { # print "scanning pattern $pattern ($highlights{$pattern})\n"; $contents =~ s:$pattern:repstr($pattern, $highlights{$pattern}, $1, $2, $3, $4):gse; } foreach $line (split "\n", $contents) { if ($line eq ""){ $ret = $ret . $lineprefix . $blankline; } else { $ret = $ret . $lineprefix . $line; } $ret = $ret . "\n"; } return $ret; } sub output_highlight { print (just_highlight (@_)); } # output in texinfo sub output_texinfo { my %args = %{$_[0]}; my ($parameter, $section); my $count; print "\@subheading ".$args{'function'}."\n"; print "\@anchor{".$args{'function'}."}\n"; print "\@deftypefun {" . $args{'functiontype'} . "} "; print "{".$args{'function'}."} "; print "("; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { print $args{'parametertypes'}{$parameter}." \@var{".$parameter."}"; if ($count != $#{$args{'parameterlist'}}) { $count++; print ", "; } } print ")\n"; foreach $parameter (@{$args{'parameterlist'}}) { if ($args{'parameters'}{$parameter}) { print "\@var{".$parameter."}: "; output_highlight($args{'parameters'}{$parameter}); print "\n"; } } foreach $section (@{$args{'sectionlist'}}) { print "\n\@strong{$section:} " if $section ne $section_default; $args{'sections'}{$section} =~ s:([{}]):\@\1:gs; output_highlight($args{'sections'}{$section}); } print "\@end deftypefun\n\n"; } # output in html sub output_html { my %args = %{$_[0]}; my ($parameter, $section); my $count; print "\n\n